@labelbee/lb-components 1.24.0-alpha.30 → 1.24.0-alpha.32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- import{createBase64WorkerFactory as d}from"./_rollup-plugin-web-worker-loader__helper__browser__createBase64WorkerFactory.js";var l=d("Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwp2YXIgUGY9TWF0aC5wb3c7IWZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHQoZSl7cmV0dXJuKHQ9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIHR9KShlKX1mdW5jdGlvbiBlKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gbihlKXt2YXIgbj1mdW5jdGlvbihlLG4pe2lmKCJvYmplY3QiIT10KGUpfHwhZSlyZXR1cm4gZTt2YXIgcj1lW1N5bWJvbC50b1ByaW1pdGl2ZV07aWYodm9pZCAwIT09cil7dmFyIGk9ci5jYWxsKGUsbnx8ImRlZmF1bHQiKTtpZigib2JqZWN0IiE9dChpKSlyZXR1cm4gaTt0aHJvdyBuZXcgVHlwZUVycm9yKCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLiIpfXJldHVybigic3RyaW5nIj09PW4/U3RyaW5nOk51bWJlcikoZSl9KGUsInN0cmluZyIpO3JldHVybiJzeW1ib2wiPT10KG4pP246bisiIn1mdW5jdGlvbiByKHQsZSl7Zm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKyspe3ZhciBpPWVbcl07aS5lbnVtZXJhYmxlPWkuZW51bWVyYWJsZXx8ITEsaS5jb25maWd1cmFibGU9ITAsInZhbHVlImluIGkmJihpLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxuKGkua2V5KSxpKX19ZnVuY3Rpb24gaSh0LGUsbil7cmV0dXJuIGUmJnIodC5wcm90b3R5cGUsZSksbiYmcih0LG4pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJwcm90b3R5cGUiLHt3cml0YWJsZTohMX0pLHR9ZnVuY3Rpb24gbyh0KXtpZih2b2lkIDA9PT10KXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIHR9ZnVuY3Rpb24gcyh0LGUpe3JldHVybihzPU9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YuYmluZCgpOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuX19wcm90b19fPWUsdH0pKHQsZSl9ZnVuY3Rpb24gYSh0LGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlJiZudWxsIT09ZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiIpO3QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZSYmZS5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTp0LHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCwicHJvdG90eXBlIix7d3JpdGFibGU6ITF9KSxlJiZzKHQsZSl9ZnVuY3Rpb24gdShlLG4pe2lmKG4mJigib2JqZWN0Ij09dChuKXx8ImZ1bmN0aW9uIj09dHlwZW9mIG4pKXJldHVybiBuO2lmKHZvaWQgMCE9PW4pdGhyb3cgbmV3IFR5cGVFcnJvcigiRGVyaXZlZCBjb25zdHJ1Y3RvcnMgbWF5IG9ubHkgcmV0dXJuIG9iamVjdCBvciB1bmRlZmluZWQiKTtyZXR1cm4gbyhlKX1mdW5jdGlvbiBjKHQpe3JldHVybihjPU9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3QuZ2V0UHJvdG90eXBlT2YuYmluZCgpOmZ1bmN0aW9uKHQpe3JldHVybiB0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpfSkodCl9ZnVuY3Rpb24gbCh0LGUscil7cmV0dXJuKGU9bihlKSlpbiB0P09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUse3ZhbHVlOnIsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTp0W2VdPXIsdH1mdW5jdGlvbiBoKHQsZSl7KG51bGw9PWV8fGU+dC5sZW5ndGgpJiYoZT10Lmxlbmd0aCk7Zm9yKHZhciBuPTAscj1BcnJheShlKTtuPGU7bisrKXJbbl09dFtuXTtyZXR1cm4gcn1mdW5jdGlvbiBmKHQpe3JldHVybiBmdW5jdGlvbih0KXtpZihBcnJheS5pc0FycmF5KHQpKXJldHVybiB0fSh0KXx8ZnVuY3Rpb24odCl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJm51bGwhPXRbU3ltYm9sLml0ZXJhdG9yXXx8bnVsbCE9dFsiQEBpdGVyYXRvciJdKXJldHVybiBBcnJheS5mcm9tKHQpfSh0KXx8ZnVuY3Rpb24odCxlKXtpZih0KXtpZigic3RyaW5nIj09dHlwZW9mIHQpcmV0dXJuIGgodCxlKTt2YXIgbj17fS50b1N0cmluZy5jYWxsKHQpLnNsaWNlKDgsLTEpO3JldHVybiJPYmplY3QiPT09biYmdC5jb25zdHJ1Y3RvciYmKG49dC5jb25zdHJ1Y3Rvci5uYW1lKSwiTWFwIj09PW58fCJTZXQiPT09bj9BcnJheS5mcm9tKHQpOiJBcmd1bWVudHMiPT09bnx8L14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3Qobik/aCh0LGUpOnZvaWQgMH19KHQpfHxmdW5jdGlvbigpe3Rocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIil9KCl9ZnVuY3Rpb24gcCh0LGUpe3ZhciBuPU9iamVjdC5rZXlzKHQpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModCk7ZSYmKHI9ci5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsZSkuZW51bWVyYWJsZX0pKSksbi5wdXNoLmFwcGx5KG4scil9cmV0dXJuIG59ZnVuY3Rpb24gZCh0KXtmb3IodmFyIGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXt2YXIgbj1udWxsIT1hcmd1bWVudHNbZV0/YXJndW1lbnRzW2VdOnt9O2UlMj9wKE9iamVjdChuKSwhMCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7bCh0LGUsbltlXSl9KSk6T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM/T2JqZWN0LmRlZmluZVByb3BlcnRpZXModCxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhuKSk6cChPYmplY3QobikpLmZvckVhY2goKGZ1bmN0aW9uKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihuLGUpKX0pKX1yZXR1cm4gdH12YXIgZz17dHlwZToibG9nZ2VyIixsb2c6ZnVuY3Rpb24odCl7dGhpcy5vdXRwdXQoImxvZyIsdCl9LHdhcm46ZnVuY3Rpb24odCl7dGhpcy5vdXRwdXQoIndhcm4iLHQpfSxlcnJvcjpmdW5jdGlvbih0KXt0aGlzLm91dHB1dCgiZXJyb3IiLHQpfSxvdXRwdXQ6ZnVuY3Rpb24odCxlKXtjb25zb2xlJiZjb25zb2xlW3RdfX0seT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQobil7dmFyIHI9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9O2UodGhpcyx0KSx0aGlzLmluaXQobixyKX1yZXR1cm4gaSh0LFt7a2V5OiJpbml0Iix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e307dGhpcy5wcmVmaXg9ZS5wcmVmaXh8fCJpMThuZXh0OiIsdGhpcy5sb2dnZXI9dHx8Zyx0aGlzLm9wdGlvbnM9ZSx0aGlzLmRlYnVnPWUuZGVidWd9fSx7a2V5OiJzZXREZWJ1ZyIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5kZWJ1Zz10fX0se2tleToibG9nIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLGU9bmV3IEFycmF5KHQpLG49MDtuPHQ7bisrKWVbbl09YXJndW1lbnRzW25dO3JldHVybiB0aGlzLmZvcndhcmQoZSwibG9nIiwiIiwhMCl9fSx7a2V5OiJ3YXJuIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLGU9bmV3IEFycmF5KHQpLG49MDtuPHQ7bisrKWVbbl09YXJndW1lbnRzW25dO3JldHVybiB0aGlzLmZvcndhcmQoZSwid2FybiIsIiIsITApfX0se2tleToiZXJyb3IiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PWFyZ3VtZW50cy5sZW5ndGgsZT1uZXcgQXJyYXkodCksbj0wO248dDtuKyspZVtuXT1hcmd1bWVudHNbbl07cmV0dXJuIHRoaXMuZm9yd2FyZChlLCJlcnJvciIsIiIpfX0se2tleToiZGVwcmVjYXRlIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLGU9bmV3IEFycmF5KHQpLG49MDtuPHQ7bisrKWVbbl09YXJndW1lbnRzW25dO3JldHVybiB0aGlzLmZvcndhcmQoZSwid2FybiIsIldBUk5JTkcgREVQUkVDQVRFRDogIiwhMCl9fSx7a2V5OiJmb3J3YXJkIix2YWx1ZTpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gciYmIXRoaXMuZGVidWc/bnVsbDooInN0cmluZyI9PXR5cGVvZiB0WzBdJiYodFswXT0iIi5jb25jYXQobikuY29uY2F0KHRoaXMucHJlZml4LCIgIikuY29uY2F0KHRbMF0pKSx0aGlzLmxvZ2dlcltlXSh0KSl9fSx7a2V5OiJjcmVhdGUiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBuZXcgdCh0aGlzLmxvZ2dlcixkKGQoe30se3ByZWZpeDoiIi5jb25jYXQodGhpcy5wcmVmaXgsIjoiKS5jb25jYXQoZSwiOiIpfSksdGhpcy5vcHRpb25zKSl9fSx7a2V5OiJjbG9uZSIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuKGU9ZXx8dGhpcy5vcHRpb25zKS5wcmVmaXg9ZS5wcmVmaXh8fHRoaXMucHJlZml4LG5ldyB0KHRoaXMubG9nZ2VyLGUpfX1dKSx0fSgpLG09bmV3IHksdj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXtlKHRoaXMsdCksdGhpcy5vYnNlcnZlcnM9e319cmV0dXJuIGkodCxbe2tleToib24iLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcztyZXR1cm4gdC5zcGxpdCgiICIpLmZvckVhY2goKGZ1bmN0aW9uKHQpe24ub2JzZXJ2ZXJzW3RdPW4ub2JzZXJ2ZXJzW3RdfHxbXSxuLm9ic2VydmVyc1t0XS5wdXNoKGUpfSkpLHRoaXN9fSx7a2V5OiJvZmYiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7aWYodGhpcy5vYnNlcnZlcnNbdF0pe2lmKCFlKXJldHVybiB2b2lkIGRlbGV0ZSB0aGlzLm9ic2VydmVyc1t0XTt0aGlzLm9ic2VydmVyc1t0XT10aGlzLm9ic2VydmVyc1t0XS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiB0IT09ZX0pKX19fSx7a2V5OiJlbWl0Iix2YWx1ZTpmdW5jdGlvbih0KXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCxuPW5ldyBBcnJheShlPjE/ZS0xOjApLHI9MTtyPGU7cisrKW5bci0xXT1hcmd1bWVudHNbcl07dGhpcy5vYnNlcnZlcnNbdF0mJltdLmNvbmNhdCh0aGlzLm9ic2VydmVyc1t0XSkuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5hcHBseSh2b2lkIDAsbil9KSk7dGhpcy5vYnNlcnZlcnNbIioiXSYmW10uY29uY2F0KHRoaXMub2JzZXJ2ZXJzWyIqIl0pLmZvckVhY2goKGZ1bmN0aW9uKGUpe2UuYXBwbHkoZSxbdF0uY29uY2F0KG4pKX0pKX19XSksdH0oKTtmdW5jdGlvbiBfKCl7dmFyIHQsZSxuPW5ldyBQcm9taXNlKChmdW5jdGlvbihuLHIpe3Q9bixlPXJ9KSk7cmV0dXJuIG4ucmVzb2x2ZT10LG4ucmVqZWN0PWUsbn1mdW5jdGlvbiB4KHQpe3JldHVybiBudWxsPT10PyIiOiIiK3R9ZnVuY3Rpb24gdyh0LGUsbil7ZnVuY3Rpb24gcih0KXtyZXR1cm4gdCYmdC5pbmRleE9mKCIjIyMiKT4tMT90LnJlcGxhY2UoLyMjIy9nLCIuIik6dH1mdW5jdGlvbiBpKCl7cmV0dXJuIXR8fCJzdHJpbmciPT10eXBlb2YgdH1mb3IodmFyIG89InN0cmluZyIhPXR5cGVvZiBlP1tdLmNvbmNhdChlKTplLnNwbGl0KCIuIik7by5sZW5ndGg+MTspe2lmKGkoKSlyZXR1cm57fTt2YXIgcz1yKG8uc2hpZnQoKSk7IXRbc10mJm4mJih0W3NdPW5ldyBuKSx0PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LHMpP3Rbc106e319cmV0dXJuIGkoKT97fTp7b2JqOnQsazpyKG8uc2hpZnQoKSl9fWZ1bmN0aW9uIGIodCxlLG4pe3ZhciByPXcodCxlLE9iamVjdCk7ci5vYmpbci5rXT1ufWZ1bmN0aW9uIEQodCxlKXt2YXIgbj13KHQsZSkscj1uLm9iaixpPW4uaztpZihyKXJldHVybiByW2ldfWZ1bmN0aW9uIEUodCxlLG4pe3ZhciByPUQodCxuKTtyZXR1cm4gdm9pZCAwIT09cj9yOkQoZSxuKX1mdW5jdGlvbiBDKHQsZSxuKXtmb3IodmFyIHIgaW4gZSkiX19wcm90b19fIiE9PXImJiJjb25zdHJ1Y3RvciIhPT1yJiYociBpbiB0PyJzdHJpbmciPT10eXBlb2YgdFtyXXx8dFtyXWluc3RhbmNlb2YgU3RyaW5nfHwic3RyaW5nIj09dHlwZW9mIGVbcl18fGVbcl1pbnN0YW5jZW9mIFN0cmluZz9uJiYodFtyXT1lW3JdKTpDKHRbcl0sZVtyXSxuKTp0W3JdPWVbcl0pO3JldHVybiB0fWZ1bmN0aW9uIFModCl7cmV0dXJuIHQucmVwbGFjZSgvW1wtXFtcXVwvXHtcfVwoXClcKlwrXD9cLlxcXF5cJFx8XS9nLCJcXCQmIil9dmFyIEE9eyImIjoiJmFtcDsiLCI8IjoiJmx0OyIsIj4iOiImZ3Q7IiwnIic6IiZxdW90OyIsIiciOiImIzM5OyIsIi8iOiImI3gyRjsifTtmdW5jdGlvbiBOKHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdD90LnJlcGxhY2UoL1smPD4iJ1wvXS9nLChmdW5jdGlvbih0KXtyZXR1cm4gQVt0XX0pKTp0fXZhciBJPSJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiZ3aW5kb3cubmF2aWdhdG9yJiZ2b2lkIDA9PT13aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudERhdGEmJndpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50JiZ3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIik+LTEsTT1bIiAiLCIsIiwiPyIsIiEiLCI7Il07ZnVuY3Rpb24gRih0LGUpe3ZhciBuPU9iamVjdC5rZXlzKHQpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModCk7ZSYmKHI9ci5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsZSkuZW51bWVyYWJsZX0pKSksbi5wdXNoLmFwcGx5KG4scil9cmV0dXJuIG59ZnVuY3Rpb24gVCh0KXtmb3IodmFyIGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXt2YXIgbj1udWxsIT1hcmd1bWVudHNbZV0/YXJndW1lbnRzW2VdOnt9O2UlMj9GKE9iamVjdChuKSwhMCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7bCh0LGUsbltlXSl9KSk6T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM/T2JqZWN0LmRlZmluZVByb3BlcnRpZXModCxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhuKSk6RihPYmplY3QobikpLmZvckVhY2goKGZ1bmN0aW9uKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihuLGUpKX0pKX1yZXR1cm4gdH1mdW5jdGlvbiBPKHQpe3ZhciBlPWZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBSZWZsZWN0fHwhUmVmbGVjdC5jb25zdHJ1Y3R8fFJlZmxlY3QuY29uc3RydWN0LnNoYW0pcmV0dXJuITE7aWYoImZ1bmN0aW9uIj09dHlwZW9mIFByb3h5KXJldHVybiEwO3RyeXtyZXR1cm4gQm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZi5jYWxsKFJlZmxlY3QuY29uc3RydWN0KEJvb2xlYW4sW10sKGZ1bmN0aW9uKCl7fSkpKSwhMH1jYXRjaCh0KXtyZXR1cm4hMX19KCk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG4scj1jKHQpO2lmKGUpe3ZhciBpPWModGhpcykuY29uc3RydWN0b3I7bj1SZWZsZWN0LmNvbnN0cnVjdChyLGFyZ3VtZW50cyxpKX1lbHNlIG49ci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIHUodGhpcyxuKX19ZnVuY3Rpb24gTCh0LGUpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXToiLiI7aWYodCl7aWYodFtlXSlyZXR1cm4gdFtlXTtmb3IodmFyIHI9ZS5zcGxpdChuKSxpPXQsbz0wO288ci5sZW5ndGg7KytvKXtpZighaXx8InN0cmluZyI9PXR5cGVvZiBpW3Jbb11dJiZvKzE8ci5sZW5ndGgpcmV0dXJuO2lmKHZvaWQgMD09PWlbcltvXV0pe2Zvcih2YXIgcz0yLGE9ci5zbGljZShvLG8rcykuam9pbihuKSx1PWlbYV07dm9pZCAwPT09dSYmci5sZW5ndGg+bytzOylzKyssdT1pW2E9ci5zbGljZShvLG8rcykuam9pbihuKV07aWYodm9pZCAwPT09dSlyZXR1cm47aWYobnVsbD09PXUpcmV0dXJuIG51bGw7aWYoZS5lbmRzV2l0aChhKSl7aWYoInN0cmluZyI9PXR5cGVvZiB1KXJldHVybiB1O2lmKGEmJiJzdHJpbmciPT10eXBlb2YgdVthXSlyZXR1cm4gdVthXX12YXIgYz1yLnNsaWNlKG8rcykuam9pbihuKTtyZXR1cm4gYz9MKHUsYyxuKTp2b2lkIDB9aT1pW3Jbb11dfXJldHVybiBpfX12YXIgUD1mdW5jdGlvbih0KXthKHIsdCk7dmFyIG49TyhyKTtmdW5jdGlvbiByKHQpe3ZhciBpLHM9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOntuczpbInRyYW5zbGF0aW9uIl0sZGVmYXVsdE5TOiJ0cmFuc2xhdGlvbiJ9O3JldHVybiBlKHRoaXMsciksaT1uLmNhbGwodGhpcyksSSYmdi5jYWxsKG8oaSkpLGkuZGF0YT10fHx7fSxpLm9wdGlvbnM9cyx2b2lkIDA9PT1pLm9wdGlvbnMua2V5U2VwYXJhdG9yJiYoaS5vcHRpb25zLmtleVNlcGFyYXRvcj0iLiIpLHZvaWQgMD09PWkub3B0aW9ucy5pZ25vcmVKU09OU3RydWN0dXJlJiYoaS5vcHRpb25zLmlnbm9yZUpTT05TdHJ1Y3R1cmU9ITApLGl9cmV0dXJuIGkocixbe2tleToiYWRkTmFtZXNwYWNlcyIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5vcHRpb25zLm5zLmluZGV4T2YodCk8MCYmdGhpcy5vcHRpb25zLm5zLnB1c2godCl9fSx7a2V5OiJyZW1vdmVOYW1lc3BhY2VzIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLm9wdGlvbnMubnMuaW5kZXhPZih0KTtlPi0xJiZ0aGlzLm9wdGlvbnMubnMuc3BsaWNlKGUsMSl9fSx7a2V5OiJnZXRSZXNvdXJjZSIsdmFsdWU6ZnVuY3Rpb24odCxlLG4pe3ZhciByPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTp7fSxpPXZvaWQgMCE9PXIua2V5U2VwYXJhdG9yP3Iua2V5U2VwYXJhdG9yOnRoaXMub3B0aW9ucy5rZXlTZXBhcmF0b3Isbz12b2lkIDAhPT1yLmlnbm9yZUpTT05TdHJ1Y3R1cmU/ci5pZ25vcmVKU09OU3RydWN0dXJlOnRoaXMub3B0aW9ucy5pZ25vcmVKU09OU3RydWN0dXJlLHM9W3QsZV07biYmInN0cmluZyIhPXR5cGVvZiBuJiYocz1zLmNvbmNhdChuKSksbiYmInN0cmluZyI9PXR5cGVvZiBuJiYocz1zLmNvbmNhdChpP24uc3BsaXQoaSk6bikpLHQuaW5kZXhPZigiLiIpPi0xJiYocz10LnNwbGl0KCIuIikpO3ZhciBhPUQodGhpcy5kYXRhLHMpO3JldHVybiBhfHwhb3x8InN0cmluZyIhPXR5cGVvZiBuP2E6TCh0aGlzLmRhdGEmJnRoaXMuZGF0YVt0XSYmdGhpcy5kYXRhW3RdW2VdLG4saSl9fSx7a2V5OiJhZGRSZXNvdXJjZSIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9YXJndW1lbnRzLmxlbmd0aD40JiZ2b2lkIDAhPT1hcmd1bWVudHNbNF0/YXJndW1lbnRzWzRdOntzaWxlbnQ6ITF9LG89dGhpcy5vcHRpb25zLmtleVNlcGFyYXRvcjt2b2lkIDA9PT1vJiYobz0iLiIpO3ZhciBzPVt0LGVdO24mJihzPXMuY29uY2F0KG8/bi5zcGxpdChvKTpuKSksdC5pbmRleE9mKCIuIik+LTEmJihyPWUsZT0ocz10LnNwbGl0KCIuIikpWzFdKSx0aGlzLmFkZE5hbWVzcGFjZXMoZSksYih0aGlzLmRhdGEscyxyKSxpLnNpbGVudHx8dGhpcy5lbWl0KCJhZGRlZCIsdCxlLG4scil9fSx7a2V5OiJhZGRSZXNvdXJjZXMiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106e3NpbGVudDohMX07Zm9yKHZhciBpIGluIG4pKCJzdHJpbmciPT10eXBlb2YgbltpXXx8IltvYmplY3QgQXJyYXldIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuYXBwbHkobltpXSkpJiZ0aGlzLmFkZFJlc291cmNlKHQsZSxpLG5baV0se3NpbGVudDohMH0pO3Iuc2lsZW50fHx0aGlzLmVtaXQoImFkZGVkIix0LGUsbil9fSx7a2V5OiJhZGRSZXNvdXJjZUJ1bmRsZSIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scixpKXt2YXIgbz1hcmd1bWVudHMubGVuZ3RoPjUmJnZvaWQgMCE9PWFyZ3VtZW50c1s1XT9hcmd1bWVudHNbNV06e3NpbGVudDohMX0scz1bdCxlXTt0LmluZGV4T2YoIi4iKT4tMSYmKHI9bixuPWUsZT0ocz10LnNwbGl0KCIuIikpWzFdKSx0aGlzLmFkZE5hbWVzcGFjZXMoZSk7dmFyIGE9RCh0aGlzLmRhdGEscyl8fHt9O3I/QyhhLG4saSk6YT1UKFQoe30sYSksbiksYih0aGlzLmRhdGEscyxhKSxvLnNpbGVudHx8dGhpcy5lbWl0KCJhZGRlZCIsdCxlLG4pfX0se2tleToicmVtb3ZlUmVzb3VyY2VCdW5kbGUiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dGhpcy5oYXNSZXNvdXJjZUJ1bmRsZSh0LGUpJiZkZWxldGUgdGhpcy5kYXRhW3RdW2VdLHRoaXMucmVtb3ZlTmFtZXNwYWNlcyhlKSx0aGlzLmVtaXQoInJlbW92ZWQiLHQsZSl9fSx7a2V5OiJoYXNSZXNvdXJjZUJ1bmRsZSIsdmFsdWU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdm9pZCAwIT09dGhpcy5nZXRSZXNvdXJjZSh0LGUpfX0se2tleToiZ2V0UmVzb3VyY2VCdW5kbGUiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fChlPXRoaXMub3B0aW9ucy5kZWZhdWx0TlMpLCJ2MSI9PT10aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUFQST9UKFQoe30se30pLHRoaXMuZ2V0UmVzb3VyY2UodCxlKSk6dGhpcy5nZXRSZXNvdXJjZSh0LGUpfX0se2tleToiZ2V0RGF0YUJ5TGFuZ3VhZ2UiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmRhdGFbdF19fSx7a2V5OiJoYXNMYW5ndWFnZVNvbWVUcmFuc2xhdGlvbnMiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0RGF0YUJ5TGFuZ3VhZ2UodCk7cmV0dXJuISEoZSYmT2JqZWN0LmtleXMoZSl8fFtdKS5maW5kKChmdW5jdGlvbih0KXtyZXR1cm4gZVt0XSYmT2JqZWN0LmtleXMoZVt0XSkubGVuZ3RoPjB9KSl9fSx7a2V5OiJ0b0pTT04iLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF0YX19XSkscn0odiksUj17cHJvY2Vzc29yczp7fSxhZGRQb3N0UHJvY2Vzc29yOmZ1bmN0aW9uKHQpe3RoaXMucHJvY2Vzc29yc1t0Lm5hbWVdPXR9LGhhbmRsZTpmdW5jdGlvbih0LGUsbixyLGkpe3ZhciBvPXRoaXM7cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCl7by5wcm9jZXNzb3JzW3RdJiYoZT1vLnByb2Nlc3NvcnNbdF0ucHJvY2VzcyhlLG4scixpKSl9KSksZX19O2Z1bmN0aW9uIEIodCxlKXt2YXIgbj1PYmplY3Qua2V5cyh0KTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgcj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHQpO2UmJihyPXIuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LGUpLmVudW1lcmFibGV9KSkpLG4ucHVzaC5hcHBseShuLHIpfXJldHVybiBufWZ1bmN0aW9uIGsodCl7Zm9yKHZhciBlPTE7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl7dmFyIG49bnVsbCE9YXJndW1lbnRzW2VdP2FyZ3VtZW50c1tlXTp7fTtlJTI/QihPYmplY3QobiksITApLmZvckVhY2goKGZ1bmN0aW9uKGUpe2wodCxlLG5bZV0pfSkpOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHQsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobikpOkIoT2JqZWN0KG4pKS5mb3JFYWNoKChmdW5jdGlvbihlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobixlKSl9KSl9cmV0dXJuIHR9ZnVuY3Rpb24geih0KXt2YXIgZT1mdW5jdGlvbigpe2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgUmVmbGVjdHx8IVJlZmxlY3QuY29uc3RydWN0fHxSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKXJldHVybiExO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBQcm94eSlyZXR1cm4hMDt0cnl7cmV0dXJuIEJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLFtdLChmdW5jdGlvbigpe30pKSksITB9Y2F0Y2godCl7cmV0dXJuITF9fSgpO3JldHVybiBmdW5jdGlvbigpe3ZhciBuLHI9Yyh0KTtpZihlKXt2YXIgaT1jKHRoaXMpLmNvbnN0cnVjdG9yO249UmVmbGVjdC5jb25zdHJ1Y3Qocixhcmd1bWVudHMsaSl9ZWxzZSBuPXIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiB1KHRoaXMsbil9fXZhciBqPXt9LFU9ZnVuY3Rpb24obil7YShzLG4pO3ZhciByPXoocyk7ZnVuY3Rpb24gcyh0KXt2YXIgbixpPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fTtyZXR1cm4gZSh0aGlzLHMpLG49ci5jYWxsKHRoaXMpLEkmJnYuY2FsbChvKG4pKSxmdW5jdGlvbih0LGUsbil7dC5mb3JFYWNoKChmdW5jdGlvbih0KXtlW3RdJiYoblt0XT1lW3RdKX0pKX0oWyJyZXNvdXJjZVN0b3JlIiwibGFuZ3VhZ2VVdGlscyIsInBsdXJhbFJlc29sdmVyIiwiaW50ZXJwb2xhdG9yIiwiYmFja2VuZENvbm5lY3RvciIsImkxOG5Gb3JtYXQiLCJ1dGlscyJdLHQsbyhuKSksbi5vcHRpb25zPWksdm9pZCAwPT09bi5vcHRpb25zLmtleVNlcGFyYXRvciYmKG4ub3B0aW9ucy5rZXlTZXBhcmF0b3I9Ii4iKSxuLmxvZ2dlcj1tLmNyZWF0ZSgidHJhbnNsYXRvciIpLG59cmV0dXJuIGkocyxbe2tleToiY2hhbmdlTGFuZ3VhZ2UiLHZhbHVlOmZ1bmN0aW9uKHQpe3QmJih0aGlzLmxhbmd1YWdlPXQpfX0se2tleToiZXhpc3RzIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e2ludGVycG9sYXRpb246e319O2lmKG51bGw9PXQpcmV0dXJuITE7dmFyIG49dGhpcy5yZXNvbHZlKHQsZSk7cmV0dXJuIG4mJnZvaWQgMCE9PW4ucmVzfX0se2tleToiZXh0cmFjdEZyb21LZXkiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49dm9pZCAwIT09ZS5uc1NlcGFyYXRvcj9lLm5zU2VwYXJhdG9yOnRoaXMub3B0aW9ucy5uc1NlcGFyYXRvcjt2b2lkIDA9PT1uJiYobj0iOiIpO3ZhciByPXZvaWQgMCE9PWUua2V5U2VwYXJhdG9yP2Uua2V5U2VwYXJhdG9yOnRoaXMub3B0aW9ucy5rZXlTZXBhcmF0b3IsaT1lLm5zfHx0aGlzLm9wdGlvbnMuZGVmYXVsdE5TfHxbXSxvPW4mJnQuaW5kZXhPZihuKT4tMSxzPSEodGhpcy5vcHRpb25zLnVzZXJEZWZpbmVkS2V5U2VwYXJhdG9yfHxlLmtleVNlcGFyYXRvcnx8dGhpcy5vcHRpb25zLnVzZXJEZWZpbmVkTnNTZXBhcmF0b3J8fGUubnNTZXBhcmF0b3J8fGZ1bmN0aW9uKHQsZSxuKXtlPWV8fCIiLG49bnx8IiI7dmFyIHI9TS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiBlLmluZGV4T2YodCk8MCYmbi5pbmRleE9mKHQpPDB9KSk7aWYoMD09PXIubGVuZ3RoKXJldHVybiEwO3ZhciBpPW5ldyBSZWdFeHAoIigiLmNvbmNhdChyLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIj8iPT09dD8iXFw/Ijp0fSkpLmpvaW4oInwiKSwiKSIpKSxvPSFpLnRlc3QodCk7aWYoIW8pe3ZhciBzPXQuaW5kZXhPZihuKTtzPjAmJiFpLnRlc3QodC5zdWJzdHJpbmcoMCxzKSkmJihvPSEwKX1yZXR1cm4gb30odCxuLHIpKTtpZihvJiYhcyl7dmFyIGE9dC5tYXRjaCh0aGlzLmludGVycG9sYXRvci5uZXN0aW5nUmVnZXhwKTtpZihhJiZhLmxlbmd0aD4wKXJldHVybntrZXk6dCxuYW1lc3BhY2VzOml9O3ZhciB1PXQuc3BsaXQobik7KG4hPT1yfHxuPT09ciYmdGhpcy5vcHRpb25zLm5zLmluZGV4T2YodVswXSk+LTEpJiYoaT11LnNoaWZ0KCkpLHQ9dS5qb2luKHIpfXJldHVybiJzdHJpbmciPT10eXBlb2YgaSYmKGk9W2ldKSx7a2V5OnQsbmFtZXNwYWNlczppfX19LHtrZXk6InRyYW5zbGF0ZSIsdmFsdWU6ZnVuY3Rpb24oZSxuLHIpe3ZhciBpPXRoaXM7aWYoIm9iamVjdCIhPT10KG4pJiZ0aGlzLm9wdGlvbnMub3ZlcmxvYWRUcmFuc2xhdGlvbk9wdGlvbkhhbmRsZXImJihuPXRoaXMub3B0aW9ucy5vdmVybG9hZFRyYW5zbGF0aW9uT3B0aW9uSGFuZGxlcihhcmd1bWVudHMpKSxufHwobj17fSksbnVsbD09ZSlyZXR1cm4iIjtBcnJheS5pc0FycmF5KGUpfHwoZT1bU3RyaW5nKGUpXSk7dmFyIG89dm9pZCAwIT09bi5yZXR1cm5EZXRhaWxzP24ucmV0dXJuRGV0YWlsczp0aGlzLm9wdGlvbnMucmV0dXJuRGV0YWlscyxhPXZvaWQgMCE9PW4ua2V5U2VwYXJhdG9yP24ua2V5U2VwYXJhdG9yOnRoaXMub3B0aW9ucy5rZXlTZXBhcmF0b3IsdT10aGlzLmV4dHJhY3RGcm9tS2V5KGVbZS5sZW5ndGgtMV0sbiksYz11LmtleSxsPXUubmFtZXNwYWNlcyxoPWxbbC5sZW5ndGgtMV0sZj1uLmxuZ3x8dGhpcy5sYW5ndWFnZSxwPW4uYXBwZW5kTmFtZXNwYWNlVG9DSU1vZGV8fHRoaXMub3B0aW9ucy5hcHBlbmROYW1lc3BhY2VUb0NJTW9kZTtpZihmJiYiY2ltb2RlIj09PWYudG9Mb3dlckNhc2UoKSl7aWYocCl7dmFyIGQ9bi5uc1NlcGFyYXRvcnx8dGhpcy5vcHRpb25zLm5zU2VwYXJhdG9yO3JldHVybiBvPyhnLnJlcz0iIi5jb25jYXQoaCkuY29uY2F0KGQpLmNvbmNhdChjKSxnKToiIi5jb25jYXQoaCkuY29uY2F0KGQpLmNvbmNhdChjKX1yZXR1cm4gbz8oZy5yZXM9YyxnKTpjfXZhciBnPXRoaXMucmVzb2x2ZShlLG4pLHk9ZyYmZy5yZXMsbT1nJiZnLnVzZWRLZXl8fGMsdj1nJiZnLmV4YWN0VXNlZEtleXx8YyxfPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuYXBwbHkoeSkseD12b2lkIDAhPT1uLmpvaW5BcnJheXM/bi5qb2luQXJyYXlzOnRoaXMub3B0aW9ucy5qb2luQXJyYXlzLHc9IXRoaXMuaTE4bkZvcm1hdHx8dGhpcy5pMThuRm9ybWF0LmhhbmRsZUFzT2JqZWN0O2lmKHcmJnkmJigic3RyaW5nIiE9dHlwZW9mIHkmJiJib29sZWFuIiE9dHlwZW9mIHkmJiJudW1iZXIiIT10eXBlb2YgeSkmJlsiW29iamVjdCBOdW1iZXJdIiwiW29iamVjdCBGdW5jdGlvbl0iLCJbb2JqZWN0IFJlZ0V4cF0iXS5pbmRleE9mKF8pPDAmJigic3RyaW5nIiE9dHlwZW9mIHh8fCJbb2JqZWN0IEFycmF5XSIhPT1fKSl7aWYoIW4ucmV0dXJuT2JqZWN0cyYmIXRoaXMub3B0aW9ucy5yZXR1cm5PYmplY3RzKXt0aGlzLm9wdGlvbnMucmV0dXJuZWRPYmplY3RIYW5kbGVyfHx0aGlzLmxvZ2dlci53YXJuKCJhY2Nlc3NpbmcgYW4gb2JqZWN0IC0gYnV0IHJldHVybk9iamVjdHMgb3B0aW9ucyBpcyBub3QgZW5hYmxlZCEiKTt2YXIgYj10aGlzLm9wdGlvbnMucmV0dXJuZWRPYmplY3RIYW5kbGVyP3RoaXMub3B0aW9ucy5yZXR1cm5lZE9iamVjdEhhbmRsZXIobSx5LGsoayh7fSxuKSx7fSx7bnM6bH0pKToia2V5ICciLmNvbmNhdChjLCIgKCIpLmNvbmNhdCh0aGlzLmxhbmd1YWdlLCIpJyByZXR1cm5lZCBhbiBvYmplY3QgaW5zdGVhZCBvZiBzdHJpbmcuIik7cmV0dXJuIG8/KGcucmVzPWIsZyk6Yn1pZihhKXt2YXIgRD0iW29iamVjdCBBcnJheV0iPT09XyxFPUQ/W106e30sQz1EP3Y6bTtmb3IodmFyIFMgaW4geSlpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoeSxTKSl7dmFyIEE9IiIuY29uY2F0KEMpLmNvbmNhdChhKS5jb25jYXQoUyk7RVtTXT10aGlzLnRyYW5zbGF0ZShBLGsoayh7fSxuKSx7am9pbkFycmF5czohMSxuczpsfSkpLEVbU109PT1BJiYoRVtTXT15W1NdKX15PUV9fWVsc2UgaWYodyYmInN0cmluZyI9PXR5cGVvZiB4JiYiW29iamVjdCBBcnJheV0iPT09XykoeT15LmpvaW4oeCkpJiYoeT10aGlzLmV4dGVuZFRyYW5zbGF0aW9uKHksZSxuLHIpKTtlbHNle3ZhciBOPSExLEk9ITEsTT12b2lkIDAhPT1uLmNvdW50JiYic3RyaW5nIiE9dHlwZW9mIG4uY291bnQsRj1zLmhhc0RlZmF1bHRWYWx1ZShuKSxUPU0/dGhpcy5wbHVyYWxSZXNvbHZlci5nZXRTdWZmaXgoZixuLmNvdW50LG4pOiIiLE89blsiZGVmYXVsdFZhbHVlIi5jb25jYXQoVCldfHxuLmRlZmF1bHRWYWx1ZTshdGhpcy5pc1ZhbGlkTG9va3VwKHkpJiZGJiYoTj0hMCx5PU8pLHRoaXMuaXNWYWxpZExvb2t1cCh5KXx8KEk9ITAseT1jKTt2YXIgTD0obi5taXNzaW5nS2V5Tm9WYWx1ZUZhbGxiYWNrVG9LZXl8fHRoaXMub3B0aW9ucy5taXNzaW5nS2V5Tm9WYWx1ZUZhbGxiYWNrVG9LZXkpJiZJP3ZvaWQgMDp5LFA9RiYmTyE9PXkmJnRoaXMub3B0aW9ucy51cGRhdGVNaXNzaW5nO2lmKEl8fE58fFApe2lmKHRoaXMubG9nZ2VyLmxvZyhQPyJ1cGRhdGVLZXkiOiJtaXNzaW5nS2V5IixmLGgsYyxQP086eSksYSl7dmFyIFI9dGhpcy5yZXNvbHZlKGMsayhrKHt9LG4pLHt9LHtrZXlTZXBhcmF0b3I6ITF9KSk7UiYmUi5yZXMmJnRoaXMubG9nZ2VyLndhcm4oIlNlZW1zIHRoZSBsb2FkZWQgdHJhbnNsYXRpb25zIHdlcmUgaW4gZmxhdCBKU09OIGZvcm1hdCBpbnN0ZWFkIG9mIG5lc3RlZC4gRWl0aGVyIHNldCBrZXlTZXBhcmF0b3I6IGZhbHNlIG9uIGluaXQgb3IgbWFrZSBzdXJlIHlvdXIgdHJhbnNsYXRpb25zIGFyZSBwdWJsaXNoZWQgaW4gbmVzdGVkIGZvcm1hdC4iKX12YXIgQj1bXSx6PXRoaXMubGFuZ3VhZ2VVdGlscy5nZXRGYWxsYmFja0NvZGVzKHRoaXMub3B0aW9ucy5mYWxsYmFja0xuZyxuLmxuZ3x8dGhpcy5sYW5ndWFnZSk7aWYoImZhbGxiYWNrIj09PXRoaXMub3B0aW9ucy5zYXZlTWlzc2luZ1RvJiZ6JiZ6WzBdKWZvcih2YXIgaj0wO2o8ei5sZW5ndGg7aisrKUIucHVzaCh6W2pdKTtlbHNlImFsbCI9PT10aGlzLm9wdGlvbnMuc2F2ZU1pc3NpbmdUbz9CPXRoaXMubGFuZ3VhZ2VVdGlscy50b1Jlc29sdmVIaWVyYXJjaHkobi5sbmd8fHRoaXMubGFuZ3VhZ2UpOkIucHVzaChuLmxuZ3x8dGhpcy5sYW5ndWFnZSk7dmFyIFU9ZnVuY3Rpb24odCxlLHIpe3ZhciBvPUYmJnIhPT15P3I6TDtpLm9wdGlvbnMubWlzc2luZ0tleUhhbmRsZXI/aS5vcHRpb25zLm1pc3NpbmdLZXlIYW5kbGVyKHQsaCxlLG8sUCxuKTppLmJhY2tlbmRDb25uZWN0b3ImJmkuYmFja2VuZENvbm5lY3Rvci5zYXZlTWlzc2luZyYmaS5iYWNrZW5kQ29ubmVjdG9yLnNhdmVNaXNzaW5nKHQsaCxlLG8sUCxuKSxpLmVtaXQoIm1pc3NpbmdLZXkiLHQsaCxlLHkpfTt0aGlzLm9wdGlvbnMuc2F2ZU1pc3NpbmcmJih0aGlzLm9wdGlvbnMuc2F2ZU1pc3NpbmdQbHVyYWxzJiZNP0IuZm9yRWFjaCgoZnVuY3Rpb24odCl7aS5wbHVyYWxSZXNvbHZlci5nZXRTdWZmaXhlcyh0LG4pLmZvckVhY2goKGZ1bmN0aW9uKGUpe1UoW3RdLGMrZSxuWyJkZWZhdWx0VmFsdWUiLmNvbmNhdChlKV18fE8pfSkpfSkpOlUoQixjLE8pKX15PXRoaXMuZXh0ZW5kVHJhbnNsYXRpb24oeSxlLG4sZyxyKSxJJiZ5PT09YyYmdGhpcy5vcHRpb25zLmFwcGVuZE5hbWVzcGFjZVRvTWlzc2luZ0tleSYmKHk9IiIuY29uY2F0KGgsIjoiKS5jb25jYXQoYykpLChJfHxOKSYmdGhpcy5vcHRpb25zLnBhcnNlTWlzc2luZ0tleUhhbmRsZXImJih5PSJ2MSIhPT10aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUFQST90aGlzLm9wdGlvbnMucGFyc2VNaXNzaW5nS2V5SGFuZGxlcih0aGlzLm9wdGlvbnMuYXBwZW5kTmFtZXNwYWNlVG9NaXNzaW5nS2V5PyIiLmNvbmNhdChoLCI6IikuY29uY2F0KGMpOmMsTj95OnZvaWQgMCk6dGhpcy5vcHRpb25zLnBhcnNlTWlzc2luZ0tleUhhbmRsZXIoeSkpfXJldHVybiBvPyhnLnJlcz15LGcpOnl9fSx7a2V5OiJleHRlbmRUcmFuc2xhdGlvbiIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scixpKXt2YXIgbz10aGlzO2lmKHRoaXMuaTE4bkZvcm1hdCYmdGhpcy5pMThuRm9ybWF0LnBhcnNlKXQ9dGhpcy5pMThuRm9ybWF0LnBhcnNlKHQsayhrKHt9LHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmRlZmF1bHRWYXJpYWJsZXMpLG4pLHIudXNlZExuZyxyLnVzZWROUyxyLnVzZWRLZXkse3Jlc29sdmVkOnJ9KTtlbHNlIGlmKCFuLnNraXBJbnRlcnBvbGF0aW9uKXtuLmludGVycG9sYXRpb24mJnRoaXMuaW50ZXJwb2xhdG9yLmluaXQoayhrKHt9LG4pLHtpbnRlcnBvbGF0aW9uOmsoayh7fSx0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbiksbi5pbnRlcnBvbGF0aW9uKX0pKTt2YXIgcyxhPSJzdHJpbmciPT10eXBlb2YgdCYmKG4mJm4uaW50ZXJwb2xhdGlvbiYmdm9pZCAwIT09bi5pbnRlcnBvbGF0aW9uLnNraXBPblZhcmlhYmxlcz9uLmludGVycG9sYXRpb24uc2tpcE9uVmFyaWFibGVzOnRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLnNraXBPblZhcmlhYmxlcyk7aWYoYSl7dmFyIHU9dC5tYXRjaCh0aGlzLmludGVycG9sYXRvci5uZXN0aW5nUmVnZXhwKTtzPXUmJnUubGVuZ3RofXZhciBjPW4ucmVwbGFjZSYmInN0cmluZyIhPXR5cGVvZiBuLnJlcGxhY2U/bi5yZXBsYWNlOm47aWYodGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uZGVmYXVsdFZhcmlhYmxlcyYmKGM9ayhrKHt9LHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmRlZmF1bHRWYXJpYWJsZXMpLGMpKSx0PXRoaXMuaW50ZXJwb2xhdG9yLmludGVycG9sYXRlKHQsYyxuLmxuZ3x8dGhpcy5sYW5ndWFnZSxuKSxhKXt2YXIgbD10Lm1hdGNoKHRoaXMuaW50ZXJwb2xhdG9yLm5lc3RpbmdSZWdleHApO3M8KGwmJmwubGVuZ3RoKSYmKG4ubmVzdD0hMSl9ITEhPT1uLm5lc3QmJih0PXRoaXMuaW50ZXJwb2xhdG9yLm5lc3QodCwoZnVuY3Rpb24oKXtmb3IodmFyIHQ9YXJndW1lbnRzLmxlbmd0aCxyPW5ldyBBcnJheSh0KSxzPTA7czx0O3MrKylyW3NdPWFyZ3VtZW50c1tzXTtyZXR1cm4gaSYmaVswXT09PXJbMF0mJiFuLmNvbnRleHQ/KG8ubG9nZ2VyLndhcm4oIkl0IHNlZW1zIHlvdSBhcmUgbmVzdGluZyByZWN1cnNpdmVseSBrZXk6ICIuY29uY2F0KHJbMF0sIiBpbiBrZXk6ICIpLmNvbmNhdChlWzBdKSksbnVsbCk6by50cmFuc2xhdGUuYXBwbHkobyxyLmNvbmNhdChbZV0pKX0pLG4pKSxuLmludGVycG9sYXRpb24mJnRoaXMuaW50ZXJwb2xhdG9yLnJlc2V0KCl9dmFyIGg9bi5wb3N0UHJvY2Vzc3x8dGhpcy5vcHRpb25zLnBvc3RQcm9jZXNzLGY9InN0cmluZyI9PXR5cGVvZiBoP1toXTpoO3JldHVybiBudWxsIT10JiZmJiZmLmxlbmd0aCYmITEhPT1uLmFwcGx5UG9zdFByb2Nlc3NvciYmKHQ9Ui5oYW5kbGUoZix0LGUsdGhpcy5vcHRpb25zJiZ0aGlzLm9wdGlvbnMucG9zdFByb2Nlc3NQYXNzUmVzb2x2ZWQ/ayh7aTE4blJlc29sdmVkOnJ9LG4pOm4sdGhpcykpLHR9fSx7a2V5OiJyZXNvbHZlIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZSxuLHIsaSxvLHM9dGhpcyxhPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fTtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQmJih0PVt0XSksdC5mb3JFYWNoKChmdW5jdGlvbih0KXtpZighcy5pc1ZhbGlkTG9va3VwKGUpKXt2YXIgdT1zLmV4dHJhY3RGcm9tS2V5KHQsYSksYz11LmtleTtuPWM7dmFyIGw9dS5uYW1lc3BhY2VzO3Mub3B0aW9ucy5mYWxsYmFja05TJiYobD1sLmNvbmNhdChzLm9wdGlvbnMuZmFsbGJhY2tOUykpO3ZhciBoPXZvaWQgMCE9PWEuY291bnQmJiJzdHJpbmciIT10eXBlb2YgYS5jb3VudCxmPWgmJiFhLm9yZGluYWwmJjA9PT1hLmNvdW50JiZzLnBsdXJhbFJlc29sdmVyLnNob3VsZFVzZUludGxBcGkoKSxwPXZvaWQgMCE9PWEuY29udGV4dCYmKCJzdHJpbmciPT10eXBlb2YgYS5jb250ZXh0fHwibnVtYmVyIj09dHlwZW9mIGEuY29udGV4dCkmJiIiIT09YS5jb250ZXh0LGQ9YS5sbmdzP2EubG5nczpzLmxhbmd1YWdlVXRpbHMudG9SZXNvbHZlSGllcmFyY2h5KGEubG5nfHxzLmxhbmd1YWdlLGEuZmFsbGJhY2tMbmcpO2wuZm9yRWFjaCgoZnVuY3Rpb24odCl7cy5pc1ZhbGlkTG9va3VwKGUpfHwobz10LCFqWyIiLmNvbmNhdChkWzBdLCItIikuY29uY2F0KHQpXSYmcy51dGlscyYmcy51dGlscy5oYXNMb2FkZWROYW1lc3BhY2UmJiFzLnV0aWxzLmhhc0xvYWRlZE5hbWVzcGFjZShvKSYmKGpbIiIuY29uY2F0KGRbMF0sIi0iKS5jb25jYXQodCldPSEwLHMubG9nZ2VyLndhcm4oJ2tleSAiJy5jb25jYXQobiwnIiBmb3IgbGFuZ3VhZ2VzICInKS5jb25jYXQoZC5qb2luKCIsICIpLCciIHdvblwndCBnZXQgcmVzb2x2ZWQgYXMgbmFtZXNwYWNlICInKS5jb25jYXQobywnIiB3YXMgbm90IHlldCBsb2FkZWQnKSwiVGhpcyBtZWFucyBzb21ldGhpbmcgSVMgV1JPTkcgaW4geW91ciBzZXR1cC4gWW91IGFjY2VzcyB0aGUgdCBmdW5jdGlvbiBiZWZvcmUgaTE4bmV4dC5pbml0IC8gaTE4bmV4dC5sb2FkTmFtZXNwYWNlIC8gaTE4bmV4dC5jaGFuZ2VMYW5ndWFnZSB3YXMgZG9uZS4gV2FpdCBmb3IgdGhlIGNhbGxiYWNrIG9yIFByb21pc2UgdG8gcmVzb2x2ZSBiZWZvcmUgYWNjZXNzaW5nIGl0ISEhIikpLGQuZm9yRWFjaCgoZnVuY3Rpb24obil7aWYoIXMuaXNWYWxpZExvb2t1cChlKSl7aT1uO3ZhciBvLHU9W2NdO2lmKHMuaTE4bkZvcm1hdCYmcy5pMThuRm9ybWF0LmFkZExvb2t1cEtleXMpcy5pMThuRm9ybWF0LmFkZExvb2t1cEtleXModSxjLG4sdCxhKTtlbHNle3ZhciBsO2gmJihsPXMucGx1cmFsUmVzb2x2ZXIuZ2V0U3VmZml4KG4sYS5jb3VudCxhKSk7dmFyIGQ9IiIuY29uY2F0KHMub3B0aW9ucy5wbHVyYWxTZXBhcmF0b3IsInplcm8iKTtpZihoJiYodS5wdXNoKGMrbCksZiYmdS5wdXNoKGMrZCkpLHApe3ZhciBnPSIiLmNvbmNhdChjKS5jb25jYXQocy5vcHRpb25zLmNvbnRleHRTZXBhcmF0b3IpLmNvbmNhdChhLmNvbnRleHQpO3UucHVzaChnKSxoJiYodS5wdXNoKGcrbCksZiYmdS5wdXNoKGcrZCkpfX1mb3IoO289dS5wb3AoKTspcy5pc1ZhbGlkTG9va3VwKGUpfHwocj1vLGU9cy5nZXRSZXNvdXJjZShuLHQsbyxhKSl9fSkpKX0pKX19KSkse3JlczplLHVzZWRLZXk6bixleGFjdFVzZWRLZXk6cix1c2VkTG5nOmksdXNlZE5TOm99fX0se2tleToiaXNWYWxpZExvb2t1cCIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuISh2b2lkIDA9PT10fHwhdGhpcy5vcHRpb25zLnJldHVybk51bGwmJm51bGw9PT10fHwhdGhpcy5vcHRpb25zLnJldHVybkVtcHR5U3RyaW5nJiYiIj09PXQpfX0se2tleToiZ2V0UmVzb3VyY2UiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106e307cmV0dXJuIHRoaXMuaTE4bkZvcm1hdCYmdGhpcy5pMThuRm9ybWF0LmdldFJlc291cmNlP3RoaXMuaTE4bkZvcm1hdC5nZXRSZXNvdXJjZSh0LGUsbixyKTp0aGlzLnJlc291cmNlU3RvcmUuZ2V0UmVzb3VyY2UodCxlLG4scil9fV0sW3trZXk6Imhhc0RlZmF1bHRWYWx1ZSIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9ImRlZmF1bHRWYWx1ZSI7Zm9yKHZhciBuIGluIHQpaWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsbikmJmU9PT1uLnN1YnN0cmluZygwLDEyKSYmdm9pZCAwIT09dFtuXSlyZXR1cm4hMDtyZXR1cm4hMX19XSksc30odik7ZnVuY3Rpb24gcSh0KXtyZXR1cm4gdC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSt0LnNsaWNlKDEpfXZhciBWPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChuKXtlKHRoaXMsdCksdGhpcy5vcHRpb25zPW4sdGhpcy5zdXBwb3J0ZWRMbmdzPXRoaXMub3B0aW9ucy5zdXBwb3J0ZWRMbmdzfHwhMSx0aGlzLmxvZ2dlcj1tLmNyZWF0ZSgibGFuZ3VhZ2VVdGlscyIpfXJldHVybiBpKHQsW3trZXk6ImdldFNjcmlwdFBhcnRGcm9tQ29kZSIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoIXR8fHQuaW5kZXhPZigiLSIpPDApcmV0dXJuIG51bGw7dmFyIGU9dC5zcGxpdCgiLSIpO3JldHVybiAyPT09ZS5sZW5ndGh8fChlLnBvcCgpLCJ4Ij09PWVbZS5sZW5ndGgtMV0udG9Mb3dlckNhc2UoKSk/bnVsbDp0aGlzLmZvcm1hdExhbmd1YWdlQ29kZShlLmpvaW4oIi0iKSl9fSx7a2V5OiJnZXRMYW5ndWFnZVBhcnRGcm9tQ29kZSIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoIXR8fHQuaW5kZXhPZigiLSIpPDApcmV0dXJuIHQ7dmFyIGU9dC5zcGxpdCgiLSIpO3JldHVybiB0aGlzLmZvcm1hdExhbmd1YWdlQ29kZShlWzBdKX19LHtrZXk6ImZvcm1hdExhbmd1YWdlQ29kZSIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoInN0cmluZyI9PXR5cGVvZiB0JiZ0LmluZGV4T2YoIi0iKT4tMSl7dmFyIGU9WyJoYW5zIiwiaGFudCIsImxhdG4iLCJjeXJsIiwiY2FucyIsIm1vbmciLCJhcmFiIl0sbj10LnNwbGl0KCItIik7cmV0dXJuIHRoaXMub3B0aW9ucy5sb3dlckNhc2VMbmc/bj1uLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQudG9Mb3dlckNhc2UoKX0pKToyPT09bi5sZW5ndGg/KG5bMF09blswXS50b0xvd2VyQ2FzZSgpLG5bMV09blsxXS50b1VwcGVyQ2FzZSgpLGUuaW5kZXhPZihuWzFdLnRvTG93ZXJDYXNlKCkpPi0xJiYoblsxXT1xKG5bMV0udG9Mb3dlckNhc2UoKSkpKTozPT09bi5sZW5ndGgmJihuWzBdPW5bMF0udG9Mb3dlckNhc2UoKSwyPT09blsxXS5sZW5ndGgmJihuWzFdPW5bMV0udG9VcHBlckNhc2UoKSksInNnbiIhPT1uWzBdJiYyPT09blsyXS5sZW5ndGgmJihuWzJdPW5bMl0udG9VcHBlckNhc2UoKSksZS5pbmRleE9mKG5bMV0udG9Mb3dlckNhc2UoKSk+LTEmJihuWzFdPXEoblsxXS50b0xvd2VyQ2FzZSgpKSksZS5pbmRleE9mKG5bMl0udG9Mb3dlckNhc2UoKSk+LTEmJihuWzJdPXEoblsyXS50b0xvd2VyQ2FzZSgpKSkpLG4uam9pbigiLSIpfXJldHVybiB0aGlzLm9wdGlvbnMuY2xlYW5Db2RlfHx0aGlzLm9wdGlvbnMubG93ZXJDYXNlTG5nP3QudG9Mb3dlckNhc2UoKTp0fX0se2tleToiaXNTdXBwb3J0ZWRDb2RlIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4oImxhbmd1YWdlT25seSI9PT10aGlzLm9wdGlvbnMubG9hZHx8dGhpcy5vcHRpb25zLm5vbkV4cGxpY2l0U3VwcG9ydGVkTG5ncykmJih0PXRoaXMuZ2V0TGFuZ3VhZ2VQYXJ0RnJvbUNvZGUodCkpLCF0aGlzLnN1cHBvcnRlZExuZ3N8fCF0aGlzLnN1cHBvcnRlZExuZ3MubGVuZ3RofHx0aGlzLnN1cHBvcnRlZExuZ3MuaW5kZXhPZih0KT4tMX19LHtrZXk6ImdldEJlc3RNYXRjaEZyb21Db2RlcyIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGUsbj10aGlzO3JldHVybiB0Pyh0LmZvckVhY2goKGZ1bmN0aW9uKHQpe2lmKCFlKXt2YXIgcj1uLmZvcm1hdExhbmd1YWdlQ29kZSh0KTsoIW4ub3B0aW9ucy5zdXBwb3J0ZWRMbmdzfHxuLmlzU3VwcG9ydGVkQ29kZShyKSkmJihlPXIpfX0pKSwhZSYmdGhpcy5vcHRpb25zLnN1cHBvcnRlZExuZ3MmJnQuZm9yRWFjaCgoZnVuY3Rpb24odCl7aWYoIWUpe3ZhciByPW4uZ2V0TGFuZ3VhZ2VQYXJ0RnJvbUNvZGUodCk7aWYobi5pc1N1cHBvcnRlZENvZGUocikpcmV0dXJuIGU9cjtlPW4ub3B0aW9ucy5zdXBwb3J0ZWRMbmdzLmZpbmQoKGZ1bmN0aW9uKHQpe2lmKDA9PT10LmluZGV4T2YocikpcmV0dXJuIHR9KSl9fSkpLGV8fChlPXRoaXMuZ2V0RmFsbGJhY2tDb2Rlcyh0aGlzLm9wdGlvbnMuZmFsbGJhY2tMbmcpWzBdKSxlKTpudWxsfX0se2tleToiZ2V0RmFsbGJhY2tDb2RlcyIsdmFsdWU6ZnVuY3Rpb24odCxlKXtpZighdClyZXR1cm5bXTtpZigiZnVuY3Rpb24iPT10eXBlb2YgdCYmKHQ9dChlKSksInN0cmluZyI9PXR5cGVvZiB0JiYodD1bdF0pLCJbb2JqZWN0IEFycmF5XSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmFwcGx5KHQpKXJldHVybiB0O2lmKCFlKXJldHVybiB0LmRlZmF1bHR8fFtdO3ZhciBuPXRbZV07cmV0dXJuIG58fChuPXRbdGhpcy5nZXRTY3JpcHRQYXJ0RnJvbUNvZGUoZSldKSxufHwobj10W3RoaXMuZm9ybWF0TGFuZ3VhZ2VDb2RlKGUpXSksbnx8KG49dFt0aGlzLmdldExhbmd1YWdlUGFydEZyb21Db2RlKGUpXSksbnx8KG49dC5kZWZhdWx0KSxufHxbXX19LHtrZXk6InRvUmVzb2x2ZUhpZXJhcmNoeSIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLHI9dGhpcy5nZXRGYWxsYmFja0NvZGVzKGV8fHRoaXMub3B0aW9ucy5mYWxsYmFja0xuZ3x8W10sdCksaT1bXSxvPWZ1bmN0aW9uKHQpeyF0fHwobi5pc1N1cHBvcnRlZENvZGUodCk/aS5wdXNoKHQpOm4ubG9nZ2VyLndhcm4oInJlamVjdGluZyBsYW5ndWFnZSBjb2RlIG5vdCBmb3VuZCBpbiBzdXBwb3J0ZWRMbmdzOiAiLmNvbmNhdCh0KSkpfTtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQmJnQuaW5kZXhPZigiLSIpPi0xPygibGFuZ3VhZ2VPbmx5IiE9PXRoaXMub3B0aW9ucy5sb2FkJiZvKHRoaXMuZm9ybWF0TGFuZ3VhZ2VDb2RlKHQpKSwibGFuZ3VhZ2VPbmx5IiE9PXRoaXMub3B0aW9ucy5sb2FkJiYiY3VycmVudE9ubHkiIT09dGhpcy5vcHRpb25zLmxvYWQmJm8odGhpcy5nZXRTY3JpcHRQYXJ0RnJvbUNvZGUodCkpLCJjdXJyZW50T25seSIhPT10aGlzLm9wdGlvbnMubG9hZCYmbyh0aGlzLmdldExhbmd1YWdlUGFydEZyb21Db2RlKHQpKSk6InN0cmluZyI9PXR5cGVvZiB0JiZvKHRoaXMuZm9ybWF0TGFuZ3VhZ2VDb2RlKHQpKSxyLmZvckVhY2goKGZ1bmN0aW9uKHQpe2kuaW5kZXhPZih0KTwwJiZvKG4uZm9ybWF0TGFuZ3VhZ2VDb2RlKHQpKX0pKSxpfX1dKSx0fSgpLEc9W3tsbmdzOlsiYWNoIiwiYWsiLCJhbSIsImFybiIsImJyIiwiZmlsIiwiZ3VuIiwibG4iLCJtZmUiLCJtZyIsIm1pIiwib2MiLCJwdCIsInB0LUJSIiwidGciLCJ0bCIsInRpIiwidHIiLCJ1eiIsIndhIl0sbnI6WzEsMl0sZmM6MX0se2xuZ3M6WyJhZiIsImFuIiwiYXN0IiwiYXoiLCJiZyIsImJuIiwiY2EiLCJkYSIsImRlIiwiZGV2IiwiZWwiLCJlbiIsImVvIiwiZXMiLCJldCIsImV1IiwiZmkiLCJmbyIsImZ1ciIsImZ5IiwiZ2wiLCJndSIsImhhIiwiaGkiLCJodSIsImh5IiwiaWEiLCJpdCIsImtrIiwia24iLCJrdSIsImxiIiwibWFpIiwibWwiLCJtbiIsIm1yIiwibmFoIiwibmFwIiwibmIiLCJuZSIsIm5sIiwibm4iLCJubyIsIm5zbyIsInBhIiwicGFwIiwicG1zIiwicHMiLCJwdC1QVCIsInJtIiwic2NvIiwic2UiLCJzaSIsInNvIiwic29uIiwic3EiLCJzdiIsInN3IiwidGEiLCJ0ZSIsInRrIiwidXIiLCJ5byJdLG5yOlsxLDJdLGZjOjJ9LHtsbmdzOlsiYXkiLCJibyIsImNnZyIsImZhIiwiaHQiLCJpZCIsImphIiwiamJvIiwia2EiLCJrbSIsImtvIiwia3kiLCJsbyIsIm1zIiwic2FoIiwic3UiLCJ0aCIsInR0IiwidWciLCJ2aSIsIndvIiwiemgiXSxucjpbMV0sZmM6M30se2xuZ3M6WyJiZSIsImJzIiwiY25yIiwiZHoiLCJociIsInJ1Iiwic3IiLCJ1ayJdLG5yOlsxLDIsNV0sZmM6NH0se2xuZ3M6WyJhciJdLG5yOlswLDEsMiwzLDExLDEwMF0sZmM6NX0se2xuZ3M6WyJjcyIsInNrIl0sbnI6WzEsMiw1XSxmYzo2fSx7bG5nczpbImNzYiIsInBsIl0sbnI6WzEsMiw1XSxmYzo3fSx7bG5nczpbImN5Il0sbnI6WzEsMiwzLDhdLGZjOjh9LHtsbmdzOlsiZnIiXSxucjpbMSwyXSxmYzo5fSx7bG5nczpbImdhIl0sbnI6WzEsMiwzLDcsMTFdLGZjOjEwfSx7bG5nczpbImdkIl0sbnI6WzEsMiwzLDIwXSxmYzoxMX0se2xuZ3M6WyJpcyJdLG5yOlsxLDJdLGZjOjEyfSx7bG5nczpbImp2Il0sbnI6WzAsMV0sZmM6MTN9LHtsbmdzOlsia3ciXSxucjpbMSwyLDMsNF0sZmM6MTR9LHtsbmdzOlsibHQiXSxucjpbMSwyLDEwXSxmYzoxNX0se2xuZ3M6WyJsdiJdLG5yOlsxLDIsMF0sZmM6MTZ9LHtsbmdzOlsibWsiXSxucjpbMSwyXSxmYzoxN30se2xuZ3M6WyJtbmsiXSxucjpbMCwxLDJdLGZjOjE4fSx7bG5nczpbIm10Il0sbnI6WzEsMiwxMSwyMF0sZmM6MTl9LHtsbmdzOlsib3IiXSxucjpbMiwxXSxmYzoyfSx7bG5nczpbInJvIl0sbnI6WzEsMiwyMF0sZmM6MjB9LHtsbmdzOlsic2wiXSxucjpbNSwxLDIsM10sZmM6MjF9LHtsbmdzOlsiaGUiLCJpdyJdLG5yOlsxLDIsMjAsMjFdLGZjOjIyfV0sWT17MTpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKHQ+MSl9LDI6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigxIT10KX0sMzpmdW5jdGlvbih0KXtyZXR1cm4gMH0sNDpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKHQlMTA9PTEmJnQlMTAwIT0xMT8wOnQlMTA+PTImJnQlMTA8PTQmJih0JTEwMDwxMHx8dCUxMDA+PTIwKT8xOjIpfSw1OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIoMD09dD8wOjE9PXQ/MToyPT10PzI6dCUxMDA+PTMmJnQlMTAwPD0xMD8zOnQlMTAwPj0xMT80OjUpfSw2OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIoMT09dD8wOnQ+PTImJnQ8PTQ/MToyKX0sNzpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDE9PXQ/MDp0JTEwPj0yJiZ0JTEwPD00JiYodCUxMDA8MTB8fHQlMTAwPj0yMCk/MToyKX0sODpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDE9PXQ/MDoyPT10PzE6OCE9dCYmMTEhPXQ/MjozKX0sOTpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKHQ+PTIpfSwxMDpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDE9PXQ/MDoyPT10PzE6dDw3PzI6dDwxMT8zOjQpfSwxMTpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDE9PXR8fDExPT10PzA6Mj09dHx8MTI9PXQ/MTp0PjImJnQ8MjA/MjozKX0sMTI6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcih0JTEwIT0xfHx0JTEwMD09MTEpfSwxMzpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDAhPT10KX0sMTQ6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigxPT10PzA6Mj09dD8xOjM9PXQ/MjozKX0sMTU6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcih0JTEwPT0xJiZ0JTEwMCE9MTE/MDp0JTEwPj0yJiYodCUxMDA8MTB8fHQlMTAwPj0yMCk/MToyKX0sMTY6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcih0JTEwPT0xJiZ0JTEwMCE9MTE/MDowIT09dD8xOjIpfSwxNzpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDE9PXR8fHQlMTA9PTEmJnQlMTAwIT0xMT8wOjEpfSwxODpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDA9PXQ/MDoxPT10PzE6Mil9LDE5OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIoMT09dD8wOjA9PXR8fHQlMTAwPjEmJnQlMTAwPDExPzE6dCUxMDA+MTAmJnQlMTAwPDIwPzI6Myl9LDIwOmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIoMT09dD8wOjA9PXR8fHQlMTAwPjAmJnQlMTAwPDIwPzE6Mil9LDIxOmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodCUxMDA9PTE/MTp0JTEwMD09Mj8yOnQlMTAwPT0zfHx0JTEwMD09ND8zOjApfSwyMjpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDE9PXQ/MDoyPT10PzE6KHQ8MHx8dD4xMCkmJnQlMTA9PTA/MjozKX19LFg9WyJ2MSIsInYyIiwidjMiXSxXPXt6ZXJvOjAsb25lOjEsdHdvOjIsZmV3OjMsbWFueTo0LG90aGVyOjV9O3ZhciBIPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChuKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e307ZSh0aGlzLHQpLHRoaXMubGFuZ3VhZ2VVdGlscz1uLHRoaXMub3B0aW9ucz1yLHRoaXMubG9nZ2VyPW0uY3JlYXRlKCJwbHVyYWxSZXNvbHZlciIpLCghdGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlKU09OfHwidjQiPT09dGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlKU09OKSYmKCJ1bmRlZmluZWQiPT10eXBlb2YgSW50bHx8IUludGwuUGx1cmFsUnVsZXMpJiYodGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlKU09OPSJ2MyIsdGhpcy5sb2dnZXIuZXJyb3IoIllvdXIgZW52aXJvbm1lbnQgc2VlbXMgbm90IHRvIGJlIEludGwgQVBJIGNvbXBhdGlibGUsIHVzZSBhbiBJbnRsLlBsdXJhbFJ1bGVzIHBvbHlmaWxsLiBXaWxsIGZhbGxiYWNrIHRvIHRoZSBjb21wYXRpYmlsaXR5SlNPTiB2MyBmb3JtYXQgaGFuZGxpbmcuIikpLHRoaXMucnVsZXM9ZnVuY3Rpb24oKXt2YXIgdD17fTtyZXR1cm4gRy5mb3JFYWNoKChmdW5jdGlvbihlKXtlLmxuZ3MuZm9yRWFjaCgoZnVuY3Rpb24obil7dFtuXT17bnVtYmVyczplLm5yLHBsdXJhbHM6WVtlLmZjXX19KSl9KSksdH0oKX1yZXR1cm4gaSh0LFt7a2V5OiJhZGRSdWxlIix2YWx1ZTpmdW5jdGlvbih0LGUpe3RoaXMucnVsZXNbdF09ZX19LHtrZXk6ImdldFJ1bGUiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fTtpZih0aGlzLnNob3VsZFVzZUludGxBcGkoKSl0cnl7cmV0dXJuIG5ldyBJbnRsLlBsdXJhbFJ1bGVzKHQse3R5cGU6ZS5vcmRpbmFsPyJvcmRpbmFsIjoiY2FyZGluYWwifSl9Y2F0Y2godCl7cmV0dXJufXJldHVybiB0aGlzLnJ1bGVzW3RdfHx0aGlzLnJ1bGVzW3RoaXMubGFuZ3VhZ2VVdGlscy5nZXRMYW5ndWFnZVBhcnRGcm9tQ29kZSh0KV19fSx7a2V5OiJuZWVkc1BsdXJhbCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9LG49dGhpcy5nZXRSdWxlKHQsZSk7cmV0dXJuIHRoaXMuc2hvdWxkVXNlSW50bEFwaSgpP24mJm4ucmVzb2x2ZWRPcHRpb25zKCkucGx1cmFsQ2F0ZWdvcmllcy5sZW5ndGg+MTpuJiZuLm51bWJlcnMubGVuZ3RoPjF9fSx7a2V5OiJnZXRQbHVyYWxGb3Jtc09mS2V5Iix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTp7fTtyZXR1cm4gdGhpcy5nZXRTdWZmaXhlcyh0LG4pLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIiIuY29uY2F0KGUpLmNvbmNhdCh0KX0pKX19LHtrZXk6ImdldFN1ZmZpeGVzIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLG49YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9LHI9dGhpcy5nZXRSdWxlKHQsbik7cmV0dXJuIHI/dGhpcy5zaG91bGRVc2VJbnRsQXBpKCk/ci5yZXNvbHZlZE9wdGlvbnMoKS5wbHVyYWxDYXRlZ29yaWVzLnNvcnQoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIFdbdF0tV1tlXX0pKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiIiLmNvbmNhdChlLm9wdGlvbnMucHJlcGVuZCkuY29uY2F0KHQpfSkpOnIubnVtYmVycy5tYXAoKGZ1bmN0aW9uKHIpe3JldHVybiBlLmdldFN1ZmZpeCh0LHIsbil9KSk6W119fSx7a2V5OiJnZXRTdWZmaXgiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOnt9LHI9dGhpcy5nZXRSdWxlKHQsbik7cmV0dXJuIHI/dGhpcy5zaG91bGRVc2VJbnRsQXBpKCk/IiIuY29uY2F0KHRoaXMub3B0aW9ucy5wcmVwZW5kKS5jb25jYXQoci5zZWxlY3QoZSkpOnRoaXMuZ2V0U3VmZml4UmV0cm9Db21wYXRpYmxlKHIsZSk6KHRoaXMubG9nZ2VyLndhcm4oIm5vIHBsdXJhbCBydWxlIGZvdW5kIGZvcjogIi5jb25jYXQodCkpLCIiKX19LHtrZXk6ImdldFN1ZmZpeFJldHJvQ29tcGF0aWJsZSIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLHI9dC5ub0Ficz90LnBsdXJhbHMoZSk6dC5wbHVyYWxzKE1hdGguYWJzKGUpKSxpPXQubnVtYmVyc1tyXTt0aGlzLm9wdGlvbnMuc2ltcGxpZnlQbHVyYWxTdWZmaXgmJjI9PT10Lm51bWJlcnMubGVuZ3RoJiYxPT09dC5udW1iZXJzWzBdJiYoMj09PWk/aT0icGx1cmFsIjoxPT09aSYmKGk9IiIpKTt2YXIgbz1mdW5jdGlvbigpe3JldHVybiBuLm9wdGlvbnMucHJlcGVuZCYmaS50b1N0cmluZygpP24ub3B0aW9ucy5wcmVwZW5kK2kudG9TdHJpbmcoKTppLnRvU3RyaW5nKCl9O3JldHVybiJ2MSI9PT10aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUpTT04/MT09PWk/IiI6Im51bWJlciI9PXR5cGVvZiBpPyJfcGx1cmFsXyIuY29uY2F0KGkudG9TdHJpbmcoKSk6bygpOiJ2MiI9PT10aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUpTT058fHRoaXMub3B0aW9ucy5zaW1wbGlmeVBsdXJhbFN1ZmZpeCYmMj09PXQubnVtYmVycy5sZW5ndGgmJjE9PT10Lm51bWJlcnNbMF0/bygpOnRoaXMub3B0aW9ucy5wcmVwZW5kJiZyLnRvU3RyaW5nKCk/dGhpcy5vcHRpb25zLnByZXBlbmQrci50b1N0cmluZygpOnIudG9TdHJpbmcoKX19LHtrZXk6InNob3VsZFVzZUludGxBcGkiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIVguaW5jbHVkZXModGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlKU09OKX19XSksdH0oKTtmdW5jdGlvbiBaKHQsZSl7dmFyIG49T2JqZWN0LmtleXModCk7aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIHI9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0KTtlJiYocj1yLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxlKS5lbnVtZXJhYmxlfSkpKSxuLnB1c2guYXBwbHkobixyKX1yZXR1cm4gbn1mdW5jdGlvbiBLKHQpe2Zvcih2YXIgZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe3ZhciBuPW51bGwhPWFyZ3VtZW50c1tlXT9hcmd1bWVudHNbZV06e307ZSUyP1ooT2JqZWN0KG4pLCEwKS5mb3JFYWNoKChmdW5jdGlvbihlKXtsKHQsZSxuW2VdKX0pKTpPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycz9PYmplY3QuZGVmaW5lUHJvcGVydGllcyh0LE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG4pKTpaKE9iamVjdChuKSkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG4sZSkpfSkpfXJldHVybiB0fXZhciBKPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp7fTtlKHRoaXMsdCksdGhpcy5sb2dnZXI9bS5jcmVhdGUoImludGVycG9sYXRvciIpLHRoaXMub3B0aW9ucz1uLHRoaXMuZm9ybWF0PW4uaW50ZXJwb2xhdGlvbiYmbi5pbnRlcnBvbGF0aW9uLmZvcm1hdHx8ZnVuY3Rpb24odCl7cmV0dXJuIHR9LHRoaXMuaW5pdChuKX1yZXR1cm4gaSh0LFt7a2V5OiJpbml0Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp7fTt0LmludGVycG9sYXRpb258fCh0LmludGVycG9sYXRpb249e2VzY2FwZVZhbHVlOiEwfSk7dmFyIGU9dC5pbnRlcnBvbGF0aW9uO3RoaXMuZXNjYXBlPXZvaWQgMCE9PWUuZXNjYXBlP2UuZXNjYXBlOk4sdGhpcy5lc2NhcGVWYWx1ZT12b2lkIDA9PT1lLmVzY2FwZVZhbHVlfHxlLmVzY2FwZVZhbHVlLHRoaXMudXNlUmF3VmFsdWVUb0VzY2FwZT12b2lkIDAhPT1lLnVzZVJhd1ZhbHVlVG9Fc2NhcGUmJmUudXNlUmF3VmFsdWVUb0VzY2FwZSx0aGlzLnByZWZpeD1lLnByZWZpeD9TKGUucHJlZml4KTplLnByZWZpeEVzY2FwZWR8fCJ7eyIsdGhpcy5zdWZmaXg9ZS5zdWZmaXg/UyhlLnN1ZmZpeCk6ZS5zdWZmaXhFc2NhcGVkfHwifX0iLHRoaXMuZm9ybWF0U2VwYXJhdG9yPWUuZm9ybWF0U2VwYXJhdG9yP2UuZm9ybWF0U2VwYXJhdG9yOmUuZm9ybWF0U2VwYXJhdG9yfHwiLCIsdGhpcy51bmVzY2FwZVByZWZpeD1lLnVuZXNjYXBlU3VmZml4PyIiOmUudW5lc2NhcGVQcmVmaXh8fCItIix0aGlzLnVuZXNjYXBlU3VmZml4PXRoaXMudW5lc2NhcGVQcmVmaXg/IiI6ZS51bmVzY2FwZVN1ZmZpeHx8IiIsdGhpcy5uZXN0aW5nUHJlZml4PWUubmVzdGluZ1ByZWZpeD9TKGUubmVzdGluZ1ByZWZpeCk6ZS5uZXN0aW5nUHJlZml4RXNjYXBlZHx8UygiJHQoIiksdGhpcy5uZXN0aW5nU3VmZml4PWUubmVzdGluZ1N1ZmZpeD9TKGUubmVzdGluZ1N1ZmZpeCk6ZS5uZXN0aW5nU3VmZml4RXNjYXBlZHx8UygiKSIpLHRoaXMubmVzdGluZ09wdGlvbnNTZXBhcmF0b3I9ZS5uZXN0aW5nT3B0aW9uc1NlcGFyYXRvcj9lLm5lc3RpbmdPcHRpb25zU2VwYXJhdG9yOmUubmVzdGluZ09wdGlvbnNTZXBhcmF0b3J8fCIsIix0aGlzLm1heFJlcGxhY2VzPWUubWF4UmVwbGFjZXM/ZS5tYXhSZXBsYWNlczoxZTMsdGhpcy5hbHdheXNGb3JtYXQ9dm9pZCAwIT09ZS5hbHdheXNGb3JtYXQmJmUuYWx3YXlzRm9ybWF0LHRoaXMucmVzZXRSZWdFeHAoKX19LHtrZXk6InJlc2V0Iix2YWx1ZTpmdW5jdGlvbigpe3RoaXMub3B0aW9ucyYmdGhpcy5pbml0KHRoaXMub3B0aW9ucyl9fSx7a2V5OiJyZXNldFJlZ0V4cCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD0iIi5jb25jYXQodGhpcy5wcmVmaXgsIiguKz8pIikuY29uY2F0KHRoaXMuc3VmZml4KTt0aGlzLnJlZ2V4cD1uZXcgUmVnRXhwKHQsImciKTt2YXIgZT0iIi5jb25jYXQodGhpcy5wcmVmaXgpLmNvbmNhdCh0aGlzLnVuZXNjYXBlUHJlZml4LCIoLis/KSIpLmNvbmNhdCh0aGlzLnVuZXNjYXBlU3VmZml4KS5jb25jYXQodGhpcy5zdWZmaXgpO3RoaXMucmVnZXhwVW5lc2NhcGU9bmV3IFJlZ0V4cChlLCJnIik7dmFyIG49IiIuY29uY2F0KHRoaXMubmVzdGluZ1ByZWZpeCwiKC4rPykiKS5jb25jYXQodGhpcy5uZXN0aW5nU3VmZml4KTt0aGlzLm5lc3RpbmdSZWdleHA9bmV3IFJlZ0V4cChuLCJnIil9fSx7a2V5OiJpbnRlcnBvbGF0ZSIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scil7dmFyIGksbyxzLGE9dGhpcyx1PXRoaXMub3B0aW9ucyYmdGhpcy5vcHRpb25zLmludGVycG9sYXRpb24mJnRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmRlZmF1bHRWYXJpYWJsZXN8fHt9O2Z1bmN0aW9uIGModCl7cmV0dXJuIHQucmVwbGFjZSgvXCQvZywiJCQkJCIpfXZhciBsPWZ1bmN0aW9uKHQpe2lmKHQuaW5kZXhPZihhLmZvcm1hdFNlcGFyYXRvcik8MCl7dmFyIGk9RShlLHUsdCk7cmV0dXJuIGEuYWx3YXlzRm9ybWF0P2EuZm9ybWF0KGksdm9pZCAwLG4sSyhLKEsoe30sciksZSkse30se2ludGVycG9sYXRpb25rZXk6dH0pKTppfXZhciBvPXQuc3BsaXQoYS5mb3JtYXRTZXBhcmF0b3IpLHM9by5zaGlmdCgpLnRyaW0oKSxjPW8uam9pbihhLmZvcm1hdFNlcGFyYXRvcikudHJpbSgpO3JldHVybiBhLmZvcm1hdChFKGUsdSxzKSxjLG4sSyhLKEsoe30sciksZSkse30se2ludGVycG9sYXRpb25rZXk6c30pKX07dGhpcy5yZXNldFJlZ0V4cCgpO3ZhciBoPXImJnIubWlzc2luZ0ludGVycG9sYXRpb25IYW5kbGVyfHx0aGlzLm9wdGlvbnMubWlzc2luZ0ludGVycG9sYXRpb25IYW5kbGVyLGY9ciYmci5pbnRlcnBvbGF0aW9uJiZ2b2lkIDAhPT1yLmludGVycG9sYXRpb24uc2tpcE9uVmFyaWFibGVzP3IuaW50ZXJwb2xhdGlvbi5za2lwT25WYXJpYWJsZXM6dGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uc2tpcE9uVmFyaWFibGVzO3JldHVyblt7cmVnZXg6dGhpcy5yZWdleHBVbmVzY2FwZSxzYWZlVmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIGModCl9fSx7cmVnZXg6dGhpcy5yZWdleHAsc2FmZVZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiBhLmVzY2FwZVZhbHVlP2MoYS5lc2NhcGUodCkpOmModCl9fV0uZm9yRWFjaCgoZnVuY3Rpb24oZSl7Zm9yKHM9MDtpPWUucmVnZXguZXhlYyh0KTspe3ZhciBuPWlbMV0udHJpbSgpO2lmKHZvaWQgMD09PShvPWwobikpKWlmKCJmdW5jdGlvbiI9PXR5cGVvZiBoKXt2YXIgdT1oKHQsaSxyKTtvPSJzdHJpbmciPT10eXBlb2YgdT91OiIifWVsc2UgaWYociYmci5oYXNPd25Qcm9wZXJ0eShuKSlvPSIiO2Vsc2V7aWYoZil7bz1pWzBdO2NvbnRpbnVlfWEubG9nZ2VyLndhcm4oIm1pc3NlZCB0byBwYXNzIGluIHZhcmlhYmxlICIuY29uY2F0KG4sIiBmb3IgaW50ZXJwb2xhdGluZyAiKS5jb25jYXQodCkpLG89IiJ9ZWxzZSJzdHJpbmciIT10eXBlb2YgbyYmIWEudXNlUmF3VmFsdWVUb0VzY2FwZSYmKG89eChvKSk7dmFyIGM9ZS5zYWZlVmFsdWUobyk7aWYodD10LnJlcGxhY2UoaVswXSxjKSxmPyhlLnJlZ2V4Lmxhc3RJbmRleCs9by5sZW5ndGgsZS5yZWdleC5sYXN0SW5kZXgtPWlbMF0ubGVuZ3RoKTplLnJlZ2V4Lmxhc3RJbmRleD0wLCsrcz49YS5tYXhSZXBsYWNlcylicmVha319KSksdH19LHtrZXk6Im5lc3QiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG4scixpPXRoaXMsbz1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06e30scz1LKHt9LG8pO2Z1bmN0aW9uIGEodCxlKXt2YXIgbj10aGlzLm5lc3RpbmdPcHRpb25zU2VwYXJhdG9yO2lmKHQuaW5kZXhPZihuKTwwKXJldHVybiB0O3ZhciByPXQuc3BsaXQobmV3IFJlZ0V4cCgiIi5jb25jYXQobiwiWyBdKnsiKSkpLGk9InsiLmNvbmNhdChyWzFdKTt0PXJbMF07dmFyIG89KGk9dGhpcy5pbnRlcnBvbGF0ZShpLHMpKS5tYXRjaCgvJy9nKSxhPWkubWF0Y2goLyIvZyk7KG8mJm8ubGVuZ3RoJTI9PTAmJiFhfHxhLmxlbmd0aCUyIT0wKSYmKGk9aS5yZXBsYWNlKC8nL2csJyInKSk7dHJ5e3M9SlNPTi5wYXJzZShpKSxlJiYocz1LKEsoe30sZSkscykpfWNhdGNoKGUpe3JldHVybiB0aGlzLmxvZ2dlci53YXJuKCJmYWlsZWQgcGFyc2luZyBvcHRpb25zIHN0cmluZyBpbiBuZXN0aW5nIGZvciBrZXkgIi5jb25jYXQodCksZSksIiIuY29uY2F0KHQpLmNvbmNhdChuKS5jb25jYXQoaSl9cmV0dXJuIGRlbGV0ZSBzLmRlZmF1bHRWYWx1ZSx0fWZvcihzLmFwcGx5UG9zdFByb2Nlc3Nvcj0hMSxkZWxldGUgcy5kZWZhdWx0VmFsdWU7bj10aGlzLm5lc3RpbmdSZWdleHAuZXhlYyh0KTspe3ZhciB1PVtdLGM9ITE7aWYoLTEhPT1uWzBdLmluZGV4T2YodGhpcy5mb3JtYXRTZXBhcmF0b3IpJiYhL3suKn0vLnRlc3QoblsxXSkpe3ZhciBsPW5bMV0uc3BsaXQodGhpcy5mb3JtYXRTZXBhcmF0b3IpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQudHJpbSgpfSkpO25bMV09bC5zaGlmdCgpLHU9bCxjPSEwfWlmKChyPWUoYS5jYWxsKHRoaXMsblsxXS50cmltKCkscykscykpJiZuWzBdPT09dCYmInN0cmluZyIhPXR5cGVvZiByKXJldHVybiByOyJzdHJpbmciIT10eXBlb2YgciYmKHI9eChyKSkscnx8KHRoaXMubG9nZ2VyLndhcm4oIm1pc3NlZCB0byByZXNvbHZlICIuY29uY2F0KG5bMV0sIiBmb3IgbmVzdGluZyAiKS5jb25jYXQodCkpLHI9IiIpLGMmJihyPXUucmVkdWNlKChmdW5jdGlvbih0LGUpe3JldHVybiBpLmZvcm1hdCh0LGUsby5sbmcsSyhLKHt9LG8pLHt9LHtpbnRlcnBvbGF0aW9ua2V5Om5bMV0udHJpbSgpfSkpfSksci50cmltKCkpKSx0PXQucmVwbGFjZShuWzBdLHIpLHRoaXMucmVnZXhwLmxhc3RJbmRleD0wfXJldHVybiB0fX1dKSx0fSgpO2Z1bmN0aW9uIFEodCxlKXt2YXIgbj1PYmplY3Qua2V5cyh0KTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgcj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHQpO2UmJihyPXIuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LGUpLmVudW1lcmFibGV9KSkpLG4ucHVzaC5hcHBseShuLHIpfXJldHVybiBufWZ1bmN0aW9uICQodCl7Zm9yKHZhciBlPTE7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl7dmFyIG49bnVsbCE9YXJndW1lbnRzW2VdP2FyZ3VtZW50c1tlXTp7fTtlJTI/UShPYmplY3QobiksITApLmZvckVhY2goKGZ1bmN0aW9uKGUpe2wodCxlLG5bZV0pfSkpOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHQsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobikpOlEoT2JqZWN0KG4pKS5mb3JFYWNoKChmdW5jdGlvbihlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobixlKSl9KSl9cmV0dXJuIHR9ZnVuY3Rpb24gdHQodCl7dmFyIGU9e307cmV0dXJuIGZ1bmN0aW9uKG4scixpKXt2YXIgbz1yK0pTT04uc3RyaW5naWZ5KGkpLHM9ZVtvXTtyZXR1cm4gc3x8KHM9dChyLGkpLGVbb109cykscyhuKX19dmFyIGV0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp7fTtlKHRoaXMsdCksdGhpcy5sb2dnZXI9bS5jcmVhdGUoImZvcm1hdHRlciIpLHRoaXMub3B0aW9ucz1uLHRoaXMuZm9ybWF0cz17bnVtYmVyOnR0KChmdW5jdGlvbih0LGUpe3ZhciBuPW5ldyBJbnRsLk51bWJlckZvcm1hdCh0LGUpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gbi5mb3JtYXQodCl9fSkpLGN1cnJlbmN5OnR0KChmdW5jdGlvbih0LGUpe3ZhciBuPW5ldyBJbnRsLk51bWJlckZvcm1hdCh0LCQoJCh7fSxlKSx7fSx7c3R5bGU6ImN1cnJlbmN5In0pKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIG4uZm9ybWF0KHQpfX0pKSxkYXRldGltZTp0dCgoZnVuY3Rpb24odCxlKXt2YXIgbj1uZXcgSW50bC5EYXRlVGltZUZvcm1hdCh0LCQoe30sZSkpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gbi5mb3JtYXQodCl9fSkpLHJlbGF0aXZldGltZTp0dCgoZnVuY3Rpb24odCxlKXt2YXIgbj1uZXcgSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXQodCwkKHt9LGUpKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIG4uZm9ybWF0KHQsZS5yYW5nZXx8ImRheSIpfX0pKSxsaXN0OnR0KChmdW5jdGlvbih0LGUpe3ZhciBuPW5ldyBJbnRsLkxpc3RGb3JtYXQodCwkKHt9LGUpKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIG4uZm9ybWF0KHQpfX0pKX0sdGhpcy5pbml0KG4pfXJldHVybiBpKHQsW3trZXk6ImluaXQiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPShhcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e2ludGVycG9sYXRpb246e319KS5pbnRlcnBvbGF0aW9uO3RoaXMuZm9ybWF0U2VwYXJhdG9yPWUuZm9ybWF0U2VwYXJhdG9yP2UuZm9ybWF0U2VwYXJhdG9yOmUuZm9ybWF0U2VwYXJhdG9yfHwiLCJ9fSx7a2V5OiJhZGQiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dGhpcy5mb3JtYXRzW3QudG9Mb3dlckNhc2UoKS50cmltKCldPWV9fSx7a2V5OiJhZGRDYWNoZWQiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dGhpcy5mb3JtYXRzW3QudG9Mb3dlckNhc2UoKS50cmltKCldPXR0KGUpfX0se2tleToiZm9ybWF0Iix2YWx1ZTpmdW5jdGlvbih0LGUsbixyKXt2YXIgaT10aGlzLG89ZS5zcGxpdCh0aGlzLmZvcm1hdFNlcGFyYXRvcikucmVkdWNlKChmdW5jdGlvbih0LGUpe3ZhciBvPWZ1bmN0aW9uKHQpe3ZhciBlPXQudG9Mb3dlckNhc2UoKS50cmltKCksbj17fTtpZih0LmluZGV4T2YoIigiKT4tMSl7dmFyIHI9dC5zcGxpdCgiKCIpO2U9clswXS50b0xvd2VyQ2FzZSgpLnRyaW0oKTt2YXIgaT1yWzFdLnN1YnN0cmluZygwLHJbMV0ubGVuZ3RoLTEpOyJjdXJyZW5jeSI9PT1lJiZpLmluZGV4T2YoIjoiKTwwP24uY3VycmVuY3l8fChuLmN1cnJlbmN5PWkudHJpbSgpKToicmVsYXRpdmV0aW1lIj09PWUmJmkuaW5kZXhPZigiOiIpPDA/bi5yYW5nZXx8KG4ucmFuZ2U9aS50cmltKCkpOmkuc3BsaXQoIjsiKS5mb3JFYWNoKChmdW5jdGlvbih0KXtpZih0KXt2YXIgZT1mKHQuc3BsaXQoIjoiKSkscj1lWzBdLGk9ZS5zbGljZSgxKS5qb2luKCI6IikudHJpbSgpLnJlcGxhY2UoL14nK3wnKyQvZywiIik7bltyLnRyaW0oKV18fChuW3IudHJpbSgpXT1pKSwiZmFsc2UiPT09aSYmKG5bci50cmltKCldPSExKSwidHJ1ZSI9PT1pJiYobltyLnRyaW0oKV09ITApLGlzTmFOKGkpfHwobltyLnRyaW0oKV09cGFyc2VJbnQoaSwxMCkpfX0pKX1yZXR1cm57Zm9ybWF0TmFtZTplLGZvcm1hdE9wdGlvbnM6bn19KGUpLHM9by5mb3JtYXROYW1lLGE9by5mb3JtYXRPcHRpb25zO2lmKGkuZm9ybWF0c1tzXSl7dmFyIHU9dDt0cnl7dmFyIGM9ciYmci5mb3JtYXRQYXJhbXMmJnIuZm9ybWF0UGFyYW1zW3IuaW50ZXJwb2xhdGlvbmtleV18fHt9LGw9Yy5sb2NhbGV8fGMubG5nfHxyLmxvY2FsZXx8ci5sbmd8fG47dT1pLmZvcm1hdHNbc10odCxsLCQoJCgkKHt9LGEpLHIpLGMpKX1jYXRjaCh0KXtpLmxvZ2dlci53YXJuKHQpfXJldHVybiB1fXJldHVybiBpLmxvZ2dlci53YXJuKCJ0aGVyZSB3YXMgbm8gZm9ybWF0IGZ1bmN0aW9uIGZvciAiLmNvbmNhdChzKSksdH0pLHQpO3JldHVybiBvfX1dKSx0fSgpO2Z1bmN0aW9uIG50KHQsZSl7dmFyIG49T2JqZWN0LmtleXModCk7aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIHI9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0KTtlJiYocj1yLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxlKS5lbnVtZXJhYmxlfSkpKSxuLnB1c2guYXBwbHkobixyKX1yZXR1cm4gbn1mdW5jdGlvbiBydCh0KXtmb3IodmFyIGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXt2YXIgbj1udWxsIT1hcmd1bWVudHNbZV0/YXJndW1lbnRzW2VdOnt9O2UlMj9udChPYmplY3QobiksITApLmZvckVhY2goKGZ1bmN0aW9uKGUpe2wodCxlLG5bZV0pfSkpOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHQsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobikpOm50KE9iamVjdChuKSkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG4sZSkpfSkpfXJldHVybiB0fWZ1bmN0aW9uIGl0KHQpe3ZhciBlPWZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBSZWZsZWN0fHwhUmVmbGVjdC5jb25zdHJ1Y3R8fFJlZmxlY3QuY29uc3RydWN0LnNoYW0pcmV0dXJuITE7aWYoImZ1bmN0aW9uIj09dHlwZW9mIFByb3h5KXJldHVybiEwO3RyeXtyZXR1cm4gQm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZi5jYWxsKFJlZmxlY3QuY29uc3RydWN0KEJvb2xlYW4sW10sKGZ1bmN0aW9uKCl7fSkpKSwhMH1jYXRjaCh0KXtyZXR1cm4hMX19KCk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG4scj1jKHQpO2lmKGUpe3ZhciBpPWModGhpcykuY29uc3RydWN0b3I7bj1SZWZsZWN0LmNvbnN0cnVjdChyLGFyZ3VtZW50cyxpKX1lbHNlIG49ci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIHUodGhpcyxuKX19dmFyIG90PWZ1bmN0aW9uKHQpe2Eocix0KTt2YXIgbj1pdChyKTtmdW5jdGlvbiByKHQsaSxzKXt2YXIgYSx1PWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTp7fTtyZXR1cm4gZSh0aGlzLHIpLGE9bi5jYWxsKHRoaXMpLEkmJnYuY2FsbChvKGEpKSxhLmJhY2tlbmQ9dCxhLnN0b3JlPWksYS5zZXJ2aWNlcz1zLGEubGFuZ3VhZ2VVdGlscz1zLmxhbmd1YWdlVXRpbHMsYS5vcHRpb25zPXUsYS5sb2dnZXI9bS5jcmVhdGUoImJhY2tlbmRDb25uZWN0b3IiKSxhLndhaXRpbmdSZWFkcz1bXSxhLm1heFBhcmFsbGVsUmVhZHM9dS5tYXhQYXJhbGxlbFJlYWRzfHwxMCxhLnJlYWRpbmdDYWxscz0wLGEubWF4UmV0cmllcz11Lm1heFJldHJpZXM+PTA/dS5tYXhSZXRyaWVzOjUsYS5yZXRyeVRpbWVvdXQ9dS5yZXRyeVRpbWVvdXQ+PTE/dS5yZXRyeVRpbWVvdXQ6MzUwLGEuc3RhdGU9e30sYS5xdWV1ZT1bXSxhLmJhY2tlbmQmJmEuYmFja2VuZC5pbml0JiZhLmJhY2tlbmQuaW5pdChzLHUuYmFja2VuZCx1KSxhfXJldHVybiBpKHIsW3trZXk6InF1ZXVlTG9hZCIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9dGhpcyxvPXt9LHM9e30sYT17fSx1PXt9O3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciByPSEwO2UuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIGE9IiIuY29uY2F0KHQsInwiKS5jb25jYXQoZSk7IW4ucmVsb2FkJiZpLnN0b3JlLmhhc1Jlc291cmNlQnVuZGxlKHQsZSk/aS5zdGF0ZVthXT0yOmkuc3RhdGVbYV08MHx8KDE9PT1pLnN0YXRlW2FdP3ZvaWQgMD09PXNbYV0mJihzW2FdPSEwKTooaS5zdGF0ZVthXT0xLHI9ITEsdm9pZCAwPT09c1thXSYmKHNbYV09ITApLHZvaWQgMD09PW9bYV0mJihvW2FdPSEwKSx2b2lkIDA9PT11W2VdJiYodVtlXT0hMCkpKX0pKSxyfHwoYVt0XT0hMCl9KSksKE9iamVjdC5rZXlzKG8pLmxlbmd0aHx8T2JqZWN0LmtleXMocykubGVuZ3RoKSYmdGhpcy5xdWV1ZS5wdXNoKHtwZW5kaW5nOnMscGVuZGluZ0NvdW50Ok9iamVjdC5rZXlzKHMpLmxlbmd0aCxsb2FkZWQ6e30sZXJyb3JzOltdLGNhbGxiYWNrOnJ9KSx7dG9Mb2FkOk9iamVjdC5rZXlzKG8pLHBlbmRpbmc6T2JqZWN0LmtleXMocyksdG9Mb2FkTGFuZ3VhZ2VzOk9iamVjdC5rZXlzKGEpLHRvTG9hZE5hbWVzcGFjZXM6T2JqZWN0LmtleXModSl9fX0se2tleToibG9hZGVkIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7dmFyIHI9dC5zcGxpdCgifCIpLGk9clswXSxvPXJbMV07ZSYmdGhpcy5lbWl0KCJmYWlsZWRMb2FkaW5nIixpLG8sZSksbiYmdGhpcy5zdG9yZS5hZGRSZXNvdXJjZUJ1bmRsZShpLG8sbiksdGhpcy5zdGF0ZVt0XT1lPy0xOjI7dmFyIHM9e307dGhpcy5xdWV1ZS5mb3JFYWNoKChmdW5jdGlvbihuKXsoZnVuY3Rpb24odCxlLG4scil7dmFyIGk9dyh0LGUsT2JqZWN0KSxvPWkub2JqLHM9aS5rO29bc109b1tzXXx8W10sciYmKG9bc109b1tzXS5jb25jYXQobikpLHJ8fG9bc10ucHVzaChuKX0pKG4ubG9hZGVkLFtpXSxvKSxmdW5jdGlvbih0LGUpe3ZvaWQgMCE9PXQucGVuZGluZ1tlXSYmKGRlbGV0ZSB0LnBlbmRpbmdbZV0sdC5wZW5kaW5nQ291bnQtLSl9KG4sdCksZSYmbi5lcnJvcnMucHVzaChlKSwwPT09bi5wZW5kaW5nQ291bnQmJiFuLmRvbmUmJihPYmplY3Qua2V5cyhuLmxvYWRlZCkuZm9yRWFjaCgoZnVuY3Rpb24odCl7c1t0XXx8KHNbdF09e30pO3ZhciBlPW4ubG9hZGVkW3RdO2UubGVuZ3RoJiZlLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZvaWQgMD09PXNbdF1bZV0mJihzW3RdW2VdPSEwKX0pKX0pKSxuLmRvbmU9ITAsbi5lcnJvcnMubGVuZ3RoP24uY2FsbGJhY2sobi5lcnJvcnMpOm4uY2FsbGJhY2soKSl9KSksdGhpcy5lbWl0KCJsb2FkZWQiLHMpLHRoaXMucXVldWU9dGhpcy5xdWV1ZS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiF0LmRvbmV9KSl9fSx7a2V5OiJyZWFkIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7dmFyIHI9dGhpcyxpPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTowLG89YXJndW1lbnRzLmxlbmd0aD40JiZ2b2lkIDAhPT1hcmd1bWVudHNbNF0/YXJndW1lbnRzWzRdOnRoaXMucmV0cnlUaW1lb3V0LHM9YXJndW1lbnRzLmxlbmd0aD41P2FyZ3VtZW50c1s1XTp2b2lkIDA7cmV0dXJuIHQubGVuZ3RoP3RoaXMucmVhZGluZ0NhbGxzPj10aGlzLm1heFBhcmFsbGVsUmVhZHM/dm9pZCB0aGlzLndhaXRpbmdSZWFkcy5wdXNoKHtsbmc6dCxuczplLGZjTmFtZTpuLHRyaWVkOmksd2FpdDpvLGNhbGxiYWNrOnN9KToodGhpcy5yZWFkaW5nQ2FsbHMrKyx0aGlzLmJhY2tlbmRbbl0odCxlLChmdW5jdGlvbihhLHUpe2lmKHIucmVhZGluZ0NhbGxzLS0sci53YWl0aW5nUmVhZHMubGVuZ3RoPjApe3ZhciBjPXIud2FpdGluZ1JlYWRzLnNoaWZ0KCk7ci5yZWFkKGMubG5nLGMubnMsYy5mY05hbWUsYy50cmllZCxjLndhaXQsYy5jYWxsYmFjayl9YSYmdSYmaTxyLm1heFJldHJpZXM/c2V0VGltZW91dCgoZnVuY3Rpb24oKXtyLnJlYWQuY2FsbChyLHQsZSxuLGkrMSwyKm8scyl9KSxvKTpzKGEsdSl9KSkpOnMobnVsbCx7fSl9fSx7a2V5OiJwcmVwYXJlTG9hZGluZyIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLHI9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOnt9LGk9YXJndW1lbnRzLmxlbmd0aD4zP2FyZ3VtZW50c1szXTp2b2lkIDA7aWYoIXRoaXMuYmFja2VuZClyZXR1cm4gdGhpcy5sb2dnZXIud2FybigiTm8gYmFja2VuZCB3YXMgYWRkZWQgdmlhIGkxOG5leHQudXNlLiBXaWxsIG5vdCBsb2FkIHJlc291cmNlcy4iKSxpJiZpKCk7InN0cmluZyI9PXR5cGVvZiB0JiYodD10aGlzLmxhbmd1YWdlVXRpbHMudG9SZXNvbHZlSGllcmFyY2h5KHQpKSwic3RyaW5nIj09dHlwZW9mIGUmJihlPVtlXSk7dmFyIG89dGhpcy5xdWV1ZUxvYWQodCxlLHIsaSk7aWYoIW8udG9Mb2FkLmxlbmd0aClyZXR1cm4gby5wZW5kaW5nLmxlbmd0aHx8aSgpLG51bGw7by50b0xvYWQuZm9yRWFjaCgoZnVuY3Rpb24odCl7bi5sb2FkT25lKHQpfSkpfX0se2tleToibG9hZCIsdmFsdWU6ZnVuY3Rpb24odCxlLG4pe3RoaXMucHJlcGFyZUxvYWRpbmcodCxlLHt9LG4pfX0se2tleToicmVsb2FkIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7dGhpcy5wcmVwYXJlTG9hZGluZyh0LGUse3JlbG9hZDohMH0sbil9fSx7a2V5OiJsb2FkT25lIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLG49YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOiIiLHI9dC5zcGxpdCgifCIpLGk9clswXSxvPXJbMV07dGhpcy5yZWFkKGksbywicmVhZCIsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24ocixzKXtyJiZlLmxvZ2dlci53YXJuKCIiLmNvbmNhdChuLCJsb2FkaW5nIG5hbWVzcGFjZSAiKS5jb25jYXQobywiIGZvciBsYW5ndWFnZSAiKS5jb25jYXQoaSwiIGZhaWxlZCIpLHIpLCFyJiZzJiZlLmxvZ2dlci5sb2coIiIuY29uY2F0KG4sImxvYWRlZCBuYW1lc3BhY2UgIikuY29uY2F0KG8sIiBmb3IgbGFuZ3VhZ2UgIikuY29uY2F0KGkpLHMpLGUubG9hZGVkKHQscixzKX0pKX19LHtrZXk6InNhdmVNaXNzaW5nIix2YWx1ZTpmdW5jdGlvbih0LGUsbixyLGkpe3ZhciBvPWFyZ3VtZW50cy5sZW5ndGg+NSYmdm9pZCAwIT09YXJndW1lbnRzWzVdP2FyZ3VtZW50c1s1XTp7fTt0aGlzLnNlcnZpY2VzLnV0aWxzJiZ0aGlzLnNlcnZpY2VzLnV0aWxzLmhhc0xvYWRlZE5hbWVzcGFjZSYmIXRoaXMuc2VydmljZXMudXRpbHMuaGFzTG9hZGVkTmFtZXNwYWNlKGUpP3RoaXMubG9nZ2VyLndhcm4oJ2RpZCBub3Qgc2F2ZSBrZXkgIicuY29uY2F0KG4sJyIgYXMgdGhlIG5hbWVzcGFjZSAiJykuY29uY2F0KGUsJyIgd2FzIG5vdCB5ZXQgbG9hZGVkJyksIlRoaXMgbWVhbnMgc29tZXRoaW5nIElTIFdST05HIGluIHlvdXIgc2V0dXAuIFlvdSBhY2Nlc3MgdGhlIHQgZnVuY3Rpb24gYmVmb3JlIGkxOG5leHQuaW5pdCAvIGkxOG5leHQubG9hZE5hbWVzcGFjZSAvIGkxOG5leHQuY2hhbmdlTGFuZ3VhZ2Ugd2FzIGRvbmUuIFdhaXQgZm9yIHRoZSBjYWxsYmFjayBvciBQcm9taXNlIHRvIHJlc29sdmUgYmVmb3JlIGFjY2Vzc2luZyBpdCEhISIpOm51bGw9PW58fCIiPT09bnx8KHRoaXMuYmFja2VuZCYmdGhpcy5iYWNrZW5kLmNyZWF0ZSYmdGhpcy5iYWNrZW5kLmNyZWF0ZSh0LGUsbixyLG51bGwscnQocnQoe30sbykse30se2lzVXBkYXRlOml9KSksdCYmdFswXSYmdGhpcy5zdG9yZS5hZGRSZXNvdXJjZSh0WzBdLGUsbixyKSl9fV0pLHJ9KHYpO2Z1bmN0aW9uIHN0KHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdC5ucyYmKHQubnM9W3QubnNdKSwic3RyaW5nIj09dHlwZW9mIHQuZmFsbGJhY2tMbmcmJih0LmZhbGxiYWNrTG5nPVt0LmZhbGxiYWNrTG5nXSksInN0cmluZyI9PXR5cGVvZiB0LmZhbGxiYWNrTlMmJih0LmZhbGxiYWNrTlM9W3QuZmFsbGJhY2tOU10pLHQuc3VwcG9ydGVkTG5ncyYmdC5zdXBwb3J0ZWRMbmdzLmluZGV4T2YoImNpbW9kZSIpPDAmJih0LnN1cHBvcnRlZExuZ3M9dC5zdXBwb3J0ZWRMbmdzLmNvbmNhdChbImNpbW9kZSJdKSksdH1mdW5jdGlvbiBhdCh0LGUpe3ZhciBuPU9iamVjdC5rZXlzKHQpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModCk7ZSYmKHI9ci5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsZSkuZW51bWVyYWJsZX0pKSksbi5wdXNoLmFwcGx5KG4scil9cmV0dXJuIG59ZnVuY3Rpb24gdXQodCl7Zm9yKHZhciBlPTE7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl7dmFyIG49bnVsbCE9YXJndW1lbnRzW2VdP2FyZ3VtZW50c1tlXTp7fTtlJTI/YXQoT2JqZWN0KG4pLCEwKS5mb3JFYWNoKChmdW5jdGlvbihlKXtsKHQsZSxuW2VdKX0pKTpPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycz9PYmplY3QuZGVmaW5lUHJvcGVydGllcyh0LE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG4pKTphdChPYmplY3QobikpLmZvckVhY2goKGZ1bmN0aW9uKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihuLGUpKX0pKX1yZXR1cm4gdH1mdW5jdGlvbiBjdCh0KXt2YXIgZT1mdW5jdGlvbigpe2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgUmVmbGVjdHx8IVJlZmxlY3QuY29uc3RydWN0fHxSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKXJldHVybiExO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBQcm94eSlyZXR1cm4hMDt0cnl7cmV0dXJuIEJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLFtdLChmdW5jdGlvbigpe30pKSksITB9Y2F0Y2godCl7cmV0dXJuITF9fSgpO3JldHVybiBmdW5jdGlvbigpe3ZhciBuLHI9Yyh0KTtpZihlKXt2YXIgaT1jKHRoaXMpLmNvbnN0cnVjdG9yO249UmVmbGVjdC5jb25zdHJ1Y3Qocixhcmd1bWVudHMsaSl9ZWxzZSBuPXIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiB1KHRoaXMsbil9fWZ1bmN0aW9uIGx0KCl7fXZhciBodD1mdW5jdGlvbihuKXthKHMsbik7dmFyIHI9Y3Qocyk7ZnVuY3Rpb24gcygpe3ZhciB0LG49YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOnt9LGk9YXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDA7aWYoZSh0aGlzLHMpLHQ9ci5jYWxsKHRoaXMpLEkmJnYuY2FsbChvKHQpKSx0Lm9wdGlvbnM9c3QobiksdC5zZXJ2aWNlcz17fSx0LmxvZ2dlcj1tLHQubW9kdWxlcz17ZXh0ZXJuYWw6W119LGZ1bmN0aW9uKHQpe09iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKE9iamVjdC5nZXRQcm90b3R5cGVPZih0KSkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ImZ1bmN0aW9uIj09dHlwZW9mIHRbZV0mJih0W2VdPXRbZV0uYmluZCh0KSl9KSl9KG8odCkpLGkmJiF0LmlzSW5pdGlhbGl6ZWQmJiFuLmlzQ2xvbmUpe2lmKCF0Lm9wdGlvbnMuaW5pdEltbWVkaWF0ZSlyZXR1cm4gdC5pbml0KG4saSksdSh0LG8odCkpO3NldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dC5pbml0KG4saSl9KSwwKX1yZXR1cm4gdH1yZXR1cm4gaShzLFt7a2V5OiJpbml0Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMsbj1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06e30scj1hcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMDsiZnVuY3Rpb24iPT10eXBlb2YgbiYmKHI9bixuPXt9KSwhbi5kZWZhdWx0TlMmJiExIT09bi5kZWZhdWx0TlMmJm4ubnMmJigic3RyaW5nIj09dHlwZW9mIG4ubnM/bi5kZWZhdWx0TlM9bi5uczpuLm5zLmluZGV4T2YoInRyYW5zbGF0aW9uIik8MCYmKG4uZGVmYXVsdE5TPW4ubnNbMF0pKTt2YXIgaT17ZGVidWc6ITEsaW5pdEltbWVkaWF0ZTohMCxuczpbInRyYW5zbGF0aW9uIl0sZGVmYXVsdE5TOlsidHJhbnNsYXRpb24iXSxmYWxsYmFja0xuZzpbImRldiJdLGZhbGxiYWNrTlM6ITEsc3VwcG9ydGVkTG5nczohMSxub25FeHBsaWNpdFN1cHBvcnRlZExuZ3M6ITEsbG9hZDoiYWxsIixwcmVsb2FkOiExLHNpbXBsaWZ5UGx1cmFsU3VmZml4OiEwLGtleVNlcGFyYXRvcjoiLiIsbnNTZXBhcmF0b3I6IjoiLHBsdXJhbFNlcGFyYXRvcjoiXyIsY29udGV4dFNlcGFyYXRvcjoiXyIscGFydGlhbEJ1bmRsZWRMYW5ndWFnZXM6ITEsc2F2ZU1pc3Npbmc6ITEsdXBkYXRlTWlzc2luZzohMSxzYXZlTWlzc2luZ1RvOiJmYWxsYmFjayIsc2F2ZU1pc3NpbmdQbHVyYWxzOiEwLG1pc3NpbmdLZXlIYW5kbGVyOiExLG1pc3NpbmdJbnRlcnBvbGF0aW9uSGFuZGxlcjohMSxwb3N0UHJvY2VzczohMSxwb3N0UHJvY2Vzc1Bhc3NSZXNvbHZlZDohMSxyZXR1cm5OdWxsOiEwLHJldHVybkVtcHR5U3RyaW5nOiEwLHJldHVybk9iamVjdHM6ITEsam9pbkFycmF5czohMSxyZXR1cm5lZE9iamVjdEhhbmRsZXI6ITEscGFyc2VNaXNzaW5nS2V5SGFuZGxlcjohMSxhcHBlbmROYW1lc3BhY2VUb01pc3NpbmdLZXk6ITEsYXBwZW5kTmFtZXNwYWNlVG9DSU1vZGU6ITEsb3ZlcmxvYWRUcmFuc2xhdGlvbk9wdGlvbkhhbmRsZXI6ZnVuY3Rpb24oZSl7dmFyIG49e307aWYoIm9iamVjdCI9PT10KGVbMV0pJiYobj1lWzFdKSwic3RyaW5nIj09dHlwZW9mIGVbMV0mJihuLmRlZmF1bHRWYWx1ZT1lWzFdKSwic3RyaW5nIj09dHlwZW9mIGVbMl0mJihuLnREZXNjcmlwdGlvbj1lWzJdKSwib2JqZWN0Ij09PXQoZVsyXSl8fCJvYmplY3QiPT09dChlWzNdKSl7dmFyIHI9ZVszXXx8ZVsyXTtPYmplY3Qua2V5cyhyKS5mb3JFYWNoKChmdW5jdGlvbih0KXtuW3RdPXJbdF19KSl9cmV0dXJuIG59LGludGVycG9sYXRpb246e2VzY2FwZVZhbHVlOiEwLGZvcm1hdDpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gdH0scHJlZml4OiJ7eyIsc3VmZml4OiJ9fSIsZm9ybWF0U2VwYXJhdG9yOiIsIix1bmVzY2FwZVByZWZpeDoiLSIsbmVzdGluZ1ByZWZpeDoiJHQoIixuZXN0aW5nU3VmZml4OiIpIixuZXN0aW5nT3B0aW9uc1NlcGFyYXRvcjoiLCIsbWF4UmVwbGFjZXM6MWUzLHNraXBPblZhcmlhYmxlczohMH19O2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQ/ImZ1bmN0aW9uIj09dHlwZW9mIHQ/bmV3IHQ6dDpudWxsfWlmKHRoaXMub3B0aW9ucz11dCh1dCh1dCh7fSxpKSx0aGlzLm9wdGlvbnMpLHN0KG4pKSwidjEiIT09dGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlBUEkmJih0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbj11dCh1dCh7fSxpLmludGVycG9sYXRpb24pLHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uKSksdm9pZCAwIT09bi5rZXlTZXBhcmF0b3ImJih0aGlzLm9wdGlvbnMudXNlckRlZmluZWRLZXlTZXBhcmF0b3I9bi5rZXlTZXBhcmF0b3IpLHZvaWQgMCE9PW4ubnNTZXBhcmF0b3ImJih0aGlzLm9wdGlvbnMudXNlckRlZmluZWROc1NlcGFyYXRvcj1uLm5zU2VwYXJhdG9yKSwhdGhpcy5vcHRpb25zLmlzQ2xvbmUpe3ZhciBzO3RoaXMubW9kdWxlcy5sb2dnZXI/bS5pbml0KG8odGhpcy5tb2R1bGVzLmxvZ2dlciksdGhpcy5vcHRpb25zKTptLmluaXQobnVsbCx0aGlzLm9wdGlvbnMpLHRoaXMubW9kdWxlcy5mb3JtYXR0ZXI/cz10aGlzLm1vZHVsZXMuZm9ybWF0dGVyOiJ1bmRlZmluZWQiIT10eXBlb2YgSW50bCYmKHM9ZXQpO3ZhciBhPW5ldyBWKHRoaXMub3B0aW9ucyk7dGhpcy5zdG9yZT1uZXcgUCh0aGlzLm9wdGlvbnMucmVzb3VyY2VzLHRoaXMub3B0aW9ucyk7dmFyIHU9dGhpcy5zZXJ2aWNlczt1LmxvZ2dlcj1tLHUucmVzb3VyY2VTdG9yZT10aGlzLnN0b3JlLHUubGFuZ3VhZ2VVdGlscz1hLHUucGx1cmFsUmVzb2x2ZXI9bmV3IEgoYSx7cHJlcGVuZDp0aGlzLm9wdGlvbnMucGx1cmFsU2VwYXJhdG9yLGNvbXBhdGliaWxpdHlKU09OOnRoaXMub3B0aW9ucy5jb21wYXRpYmlsaXR5SlNPTixzaW1wbGlmeVBsdXJhbFN1ZmZpeDp0aGlzLm9wdGlvbnMuc2ltcGxpZnlQbHVyYWxTdWZmaXh9KSxzJiYoIXRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmZvcm1hdHx8dGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uZm9ybWF0PT09aS5pbnRlcnBvbGF0aW9uLmZvcm1hdCkmJih1LmZvcm1hdHRlcj1vKHMpLHUuZm9ybWF0dGVyLmluaXQodSx0aGlzLm9wdGlvbnMpLHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmZvcm1hdD11LmZvcm1hdHRlci5mb3JtYXQuYmluZCh1LmZvcm1hdHRlcikpLHUuaW50ZXJwb2xhdG9yPW5ldyBKKHRoaXMub3B0aW9ucyksdS51dGlscz17aGFzTG9hZGVkTmFtZXNwYWNlOnRoaXMuaGFzTG9hZGVkTmFtZXNwYWNlLmJpbmQodGhpcyl9LHUuYmFja2VuZENvbm5lY3Rvcj1uZXcgb3Qobyh0aGlzLm1vZHVsZXMuYmFja2VuZCksdS5yZXNvdXJjZVN0b3JlLHUsdGhpcy5vcHRpb25zKSx1LmJhY2tlbmRDb25uZWN0b3Iub24oIioiLChmdW5jdGlvbih0KXtmb3IodmFyIG49YXJndW1lbnRzLmxlbmd0aCxyPW5ldyBBcnJheShuPjE/bi0xOjApLGk9MTtpPG47aSsrKXJbaS0xXT1hcmd1bWVudHNbaV07ZS5lbWl0LmFwcGx5KGUsW3RdLmNvbmNhdChyKSl9KSksdGhpcy5tb2R1bGVzLmxhbmd1YWdlRGV0ZWN0b3ImJih1Lmxhbmd1YWdlRGV0ZWN0b3I9byh0aGlzLm1vZHVsZXMubGFuZ3VhZ2VEZXRlY3RvciksdS5sYW5ndWFnZURldGVjdG9yLmluaXQodSx0aGlzLm9wdGlvbnMuZGV0ZWN0aW9uLHRoaXMub3B0aW9ucykpLHRoaXMubW9kdWxlcy5pMThuRm9ybWF0JiYodS5pMThuRm9ybWF0PW8odGhpcy5tb2R1bGVzLmkxOG5Gb3JtYXQpLHUuaTE4bkZvcm1hdC5pbml0JiZ1LmkxOG5Gb3JtYXQuaW5pdCh0aGlzKSksdGhpcy50cmFuc2xhdG9yPW5ldyBVKHRoaXMuc2VydmljZXMsdGhpcy5vcHRpb25zKSx0aGlzLnRyYW5zbGF0b3Iub24oIioiLChmdW5jdGlvbih0KXtmb3IodmFyIG49YXJndW1lbnRzLmxlbmd0aCxyPW5ldyBBcnJheShuPjE/bi0xOjApLGk9MTtpPG47aSsrKXJbaS0xXT1hcmd1bWVudHNbaV07ZS5lbWl0LmFwcGx5KGUsW3RdLmNvbmNhdChyKSl9KSksdGhpcy5tb2R1bGVzLmV4dGVybmFsLmZvckVhY2goKGZ1bmN0aW9uKHQpe3QuaW5pdCYmdC5pbml0KGUpfSkpfWlmKHRoaXMuZm9ybWF0PXRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmZvcm1hdCxyfHwocj1sdCksdGhpcy5vcHRpb25zLmZhbGxiYWNrTG5nJiYhdGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yJiYhdGhpcy5vcHRpb25zLmxuZyl7dmFyIGM9dGhpcy5zZXJ2aWNlcy5sYW5ndWFnZVV0aWxzLmdldEZhbGxiYWNrQ29kZXModGhpcy5vcHRpb25zLmZhbGxiYWNrTG5nKTtjLmxlbmd0aD4wJiYiZGV2IiE9PWNbMF0mJih0aGlzLm9wdGlvbnMubG5nPWNbMF0pfSF0aGlzLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3ImJiF0aGlzLm9wdGlvbnMubG5nJiZ0aGlzLmxvZ2dlci53YXJuKCJpbml0OiBubyBsYW5ndWFnZURldGVjdG9yIGlzIHVzZWQgYW5kIG5vIGxuZyBpcyBkZWZpbmVkIik7WyJnZXRSZXNvdXJjZSIsImhhc1Jlc291cmNlQnVuZGxlIiwiZ2V0UmVzb3VyY2VCdW5kbGUiLCJnZXREYXRhQnlMYW5ndWFnZSJdLmZvckVhY2goKGZ1bmN0aW9uKHQpe2VbdF09ZnVuY3Rpb24oKXt2YXIgbjtyZXR1cm4obj1lLnN0b3JlKVt0XS5hcHBseShuLGFyZ3VtZW50cyl9fSkpO1siYWRkUmVzb3VyY2UiLCJhZGRSZXNvdXJjZXMiLCJhZGRSZXNvdXJjZUJ1bmRsZSIsInJlbW92ZVJlc291cmNlQnVuZGxlIl0uZm9yRWFjaCgoZnVuY3Rpb24odCl7ZVt0XT1mdW5jdGlvbigpe3ZhciBuO3JldHVybihuPWUuc3RvcmUpW3RdLmFwcGx5KG4sYXJndW1lbnRzKSxlfX0pKTt2YXIgbD1fKCksaD1mdW5jdGlvbigpe3ZhciB0PWZ1bmN0aW9uKHQsbil7ZS5pc0luaXRpYWxpemVkJiYhZS5pbml0aWFsaXplZFN0b3JlT25jZSYmZS5sb2dnZXIud2FybigiaW5pdDogaTE4bmV4dCBpcyBhbHJlYWR5IGluaXRpYWxpemVkLiBZb3Ugc2hvdWxkIGNhbGwgaW5pdCBqdXN0IG9uY2UhIiksZS5pc0luaXRpYWxpemVkPSEwLGUub3B0aW9ucy5pc0Nsb25lfHxlLmxvZ2dlci5sb2coImluaXRpYWxpemVkIixlLm9wdGlvbnMpLGUuZW1pdCgiaW5pdGlhbGl6ZWQiLGUub3B0aW9ucyksbC5yZXNvbHZlKG4pLHIodCxuKX07aWYoZS5sYW5ndWFnZXMmJiJ2MSIhPT1lLm9wdGlvbnMuY29tcGF0aWJpbGl0eUFQSSYmIWUuaXNJbml0aWFsaXplZClyZXR1cm4gdChudWxsLGUudC5iaW5kKGUpKTtlLmNoYW5nZUxhbmd1YWdlKGUub3B0aW9ucy5sbmcsdCl9O3JldHVybiB0aGlzLm9wdGlvbnMucmVzb3VyY2VzfHwhdGhpcy5vcHRpb25zLmluaXRJbW1lZGlhdGU/aCgpOnNldFRpbWVvdXQoaCwwKSxsfX0se2tleToibG9hZFJlc291cmNlcyIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTpsdCxyPSJzdHJpbmciPT10eXBlb2YgdD90OnRoaXMubGFuZ3VhZ2U7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHQmJihuPXQpLCF0aGlzLm9wdGlvbnMucmVzb3VyY2VzfHx0aGlzLm9wdGlvbnMucGFydGlhbEJ1bmRsZWRMYW5ndWFnZXMpe2lmKHImJiJjaW1vZGUiPT09ci50b0xvd2VyQ2FzZSgpKXJldHVybiBuKCk7dmFyIGk9W10sbz1mdW5jdGlvbih0KXt0JiZlLnNlcnZpY2VzLmxhbmd1YWdlVXRpbHMudG9SZXNvbHZlSGllcmFyY2h5KHQpLmZvckVhY2goKGZ1bmN0aW9uKHQpe2kuaW5kZXhPZih0KTwwJiZpLnB1c2godCl9KSl9O2lmKHIpbyhyKTtlbHNlIHRoaXMuc2VydmljZXMubGFuZ3VhZ2VVdGlscy5nZXRGYWxsYmFja0NvZGVzKHRoaXMub3B0aW9ucy5mYWxsYmFja0xuZykuZm9yRWFjaCgoZnVuY3Rpb24odCl7cmV0dXJuIG8odCl9KSk7dGhpcy5vcHRpb25zLnByZWxvYWQmJnRoaXMub3B0aW9ucy5wcmVsb2FkLmZvckVhY2goKGZ1bmN0aW9uKHQpe3JldHVybiBvKHQpfSkpLHRoaXMuc2VydmljZXMuYmFja2VuZENvbm5lY3Rvci5sb2FkKGksdGhpcy5vcHRpb25zLm5zLChmdW5jdGlvbih0KXshdCYmIWUucmVzb2x2ZWRMYW5ndWFnZSYmZS5sYW5ndWFnZSYmZS5zZXRSZXNvbHZlZExhbmd1YWdlKGUubGFuZ3VhZ2UpLG4odCl9KSl9ZWxzZSBuKG51bGwpfX0se2tleToicmVsb2FkUmVzb3VyY2VzIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7dmFyIHI9XygpO3JldHVybiB0fHwodD10aGlzLmxhbmd1YWdlcyksZXx8KGU9dGhpcy5vcHRpb25zLm5zKSxufHwobj1sdCksdGhpcy5zZXJ2aWNlcy5iYWNrZW5kQ29ubmVjdG9yLnJlbG9hZCh0LGUsKGZ1bmN0aW9uKHQpe3IucmVzb2x2ZSgpLG4odCl9KSkscn19LHtrZXk6InVzZSIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJZb3UgYXJlIHBhc3NpbmcgYW4gdW5kZWZpbmVkIG1vZHVsZSEgUGxlYXNlIGNoZWNrIHRoZSBvYmplY3QgeW91IGFyZSBwYXNzaW5nIHRvIGkxOG5leHQudXNlKCkiKTtpZighdC50eXBlKXRocm93IG5ldyBFcnJvcigiWW91IGFyZSBwYXNzaW5nIGEgd3JvbmcgbW9kdWxlISBQbGVhc2UgY2hlY2sgdGhlIG9iamVjdCB5b3UgYXJlIHBhc3NpbmcgdG8gaTE4bmV4dC51c2UoKSIpO3JldHVybiJiYWNrZW5kIj09PXQudHlwZSYmKHRoaXMubW9kdWxlcy5iYWNrZW5kPXQpLCgibG9nZ2VyIj09PXQudHlwZXx8dC5sb2cmJnQud2FybiYmdC5lcnJvcikmJih0aGlzLm1vZHVsZXMubG9nZ2VyPXQpLCJsYW5ndWFnZURldGVjdG9yIj09PXQudHlwZSYmKHRoaXMubW9kdWxlcy5sYW5ndWFnZURldGVjdG9yPXQpLCJpMThuRm9ybWF0Ij09PXQudHlwZSYmKHRoaXMubW9kdWxlcy5pMThuRm9ybWF0PXQpLCJwb3N0UHJvY2Vzc29yIj09PXQudHlwZSYmUi5hZGRQb3N0UHJvY2Vzc29yKHQpLCJmb3JtYXR0ZXIiPT09dC50eXBlJiYodGhpcy5tb2R1bGVzLmZvcm1hdHRlcj10KSwiM3JkUGFydHkiPT09dC50eXBlJiZ0aGlzLm1vZHVsZXMuZXh0ZXJuYWwucHVzaCh0KSx0aGlzfX0se2tleToic2V0UmVzb2x2ZWRMYW5ndWFnZSIsdmFsdWU6ZnVuY3Rpb24odCl7aWYodCYmdGhpcy5sYW5ndWFnZXMmJiEoWyJjaW1vZGUiLCJkZXYiXS5pbmRleE9mKHQpPi0xKSlmb3IodmFyIGU9MDtlPHRoaXMubGFuZ3VhZ2VzLmxlbmd0aDtlKyspe3ZhciBuPXRoaXMubGFuZ3VhZ2VzW2VdO2lmKCEoWyJjaW1vZGUiLCJkZXYiXS5pbmRleE9mKG4pPi0xKSYmdGhpcy5zdG9yZS5oYXNMYW5ndWFnZVNvbWVUcmFuc2xhdGlvbnMobikpe3RoaXMucmVzb2x2ZWRMYW5ndWFnZT1uO2JyZWFrfX19fSx7a2V5OiJjaGFuZ2VMYW5ndWFnZSIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO3RoaXMuaXNMYW5ndWFnZUNoYW5naW5nVG89dDt2YXIgcj1fKCk7dGhpcy5lbWl0KCJsYW5ndWFnZUNoYW5naW5nIix0KTt2YXIgaT1mdW5jdGlvbih0KXtuLmxhbmd1YWdlPXQsbi5sYW5ndWFnZXM9bi5zZXJ2aWNlcy5sYW5ndWFnZVV0aWxzLnRvUmVzb2x2ZUhpZXJhcmNoeSh0KSxuLnJlc29sdmVkTGFuZ3VhZ2U9dm9pZCAwLG4uc2V0UmVzb2x2ZWRMYW5ndWFnZSh0KX0sbz1mdW5jdGlvbihvKXshdCYmIW8mJm4uc2VydmljZXMubGFuZ3VhZ2VEZXRlY3RvciYmKG89W10pO3ZhciBzPSJzdHJpbmciPT10eXBlb2Ygbz9vOm4uc2VydmljZXMubGFuZ3VhZ2VVdGlscy5nZXRCZXN0TWF0Y2hGcm9tQ29kZXMobyk7cyYmKG4ubGFuZ3VhZ2V8fGkocyksbi50cmFuc2xhdG9yLmxhbmd1YWdlfHxuLnRyYW5zbGF0b3IuY2hhbmdlTGFuZ3VhZ2Uocyksbi5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yJiZuLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3IuY2FjaGVVc2VyTGFuZ3VhZ2UocykpLG4ubG9hZFJlc291cmNlcyhzLChmdW5jdGlvbih0KXshZnVuY3Rpb24odCxvKXtvPyhpKG8pLG4udHJhbnNsYXRvci5jaGFuZ2VMYW5ndWFnZShvKSxuLmlzTGFuZ3VhZ2VDaGFuZ2luZ1RvPXZvaWQgMCxuLmVtaXQoImxhbmd1YWdlQ2hhbmdlZCIsbyksbi5sb2dnZXIubG9nKCJsYW5ndWFnZUNoYW5nZWQiLG8pKTpuLmlzTGFuZ3VhZ2VDaGFuZ2luZ1RvPXZvaWQgMCxyLnJlc29sdmUoKGZ1bmN0aW9uKCl7cmV0dXJuIG4udC5hcHBseShuLGFyZ3VtZW50cyl9KSksZSYmZSh0LChmdW5jdGlvbigpe3JldHVybiBuLnQuYXBwbHkobixhcmd1bWVudHMpfSkpfSh0LHMpfSkpfTtyZXR1cm4gdHx8IXRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3Rvcnx8dGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yLmFzeW5jPyF0JiZ0aGlzLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3ImJnRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3Rvci5hc3luYz90aGlzLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3IuZGV0ZWN0KG8pOm8odCk6byh0aGlzLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3IuZGV0ZWN0KCkpLHJ9fSx7a2V5OiJnZXRGaXhlZFQiLHZhbHVlOmZ1bmN0aW9uKGUsbixyKXt2YXIgaT10aGlzLG89ZnVuY3Rpb24gZShuLG8pe3ZhciBzO2lmKCJvYmplY3QiIT09dChvKSl7Zm9yKHZhciBhPWFyZ3VtZW50cy5sZW5ndGgsdT1uZXcgQXJyYXkoYT4yP2EtMjowKSxjPTI7YzxhO2MrKyl1W2MtMl09YXJndW1lbnRzW2NdO3M9aS5vcHRpb25zLm92ZXJsb2FkVHJhbnNsYXRpb25PcHRpb25IYW5kbGVyKFtuLG9dLmNvbmNhdCh1KSl9ZWxzZSBzPXV0KHt9LG8pO3MubG5nPXMubG5nfHxlLmxuZyxzLmxuZ3M9cy5sbmdzfHxlLmxuZ3Mscy5ucz1zLm5zfHxlLm5zLHMua2V5UHJlZml4PXMua2V5UHJlZml4fHxyfHxlLmtleVByZWZpeDt2YXIgbD1pLm9wdGlvbnMua2V5U2VwYXJhdG9yfHwiLiIsaD1zLmtleVByZWZpeD8iIi5jb25jYXQocy5rZXlQcmVmaXgpLmNvbmNhdChsKS5jb25jYXQobik6bjtyZXR1cm4gaS50KGgscyl9O3JldHVybiJzdHJpbmciPT10eXBlb2YgZT9vLmxuZz1lOm8ubG5ncz1lLG8ubnM9bixvLmtleVByZWZpeD1yLG99fSx7a2V5OiJ0Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0O3JldHVybiB0aGlzLnRyYW5zbGF0b3ImJih0PXRoaXMudHJhbnNsYXRvcikudHJhbnNsYXRlLmFwcGx5KHQsYXJndW1lbnRzKX19LHtrZXk6ImV4aXN0cyIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdDtyZXR1cm4gdGhpcy50cmFuc2xhdG9yJiYodD10aGlzLnRyYW5zbGF0b3IpLmV4aXN0cy5hcHBseSh0LGFyZ3VtZW50cyl9fSx7a2V5OiJzZXREZWZhdWx0TmFtZXNwYWNlIix2YWx1ZTpmdW5jdGlvbih0KXt0aGlzLm9wdGlvbnMuZGVmYXVsdE5TPXR9fSx7a2V5OiJoYXNMb2FkZWROYW1lc3BhY2UiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e307aWYoIXRoaXMuaXNJbml0aWFsaXplZClyZXR1cm4gdGhpcy5sb2dnZXIud2FybigiaGFzTG9hZGVkTmFtZXNwYWNlOiBpMThuZXh0IHdhcyBub3QgaW5pdGlhbGl6ZWQiLHRoaXMubGFuZ3VhZ2VzKSwhMTtpZighdGhpcy5sYW5ndWFnZXN8fCF0aGlzLmxhbmd1YWdlcy5sZW5ndGgpcmV0dXJuIHRoaXMubG9nZ2VyLndhcm4oImhhc0xvYWRlZE5hbWVzcGFjZTogaTE4bi5sYW5ndWFnZXMgd2VyZSB1bmRlZmluZWQgb3IgZW1wdHkiLHRoaXMubGFuZ3VhZ2VzKSwhMTt2YXIgcj10aGlzLnJlc29sdmVkTGFuZ3VhZ2V8fHRoaXMubGFuZ3VhZ2VzWzBdLGk9ISF0aGlzLm9wdGlvbnMmJnRoaXMub3B0aW9ucy5mYWxsYmFja0xuZyxvPXRoaXMubGFuZ3VhZ2VzW3RoaXMubGFuZ3VhZ2VzLmxlbmd0aC0xXTtpZigiY2ltb2RlIj09PXIudG9Mb3dlckNhc2UoKSlyZXR1cm4hMDt2YXIgcz1mdW5jdGlvbih0LG4pe3ZhciByPWUuc2VydmljZXMuYmFja2VuZENvbm5lY3Rvci5zdGF0ZVsiIi5jb25jYXQodCwifCIpLmNvbmNhdChuKV07cmV0dXJuLTE9PT1yfHwyPT09cn07aWYobi5wcmVjaGVjayl7dmFyIGE9bi5wcmVjaGVjayh0aGlzLHMpO2lmKHZvaWQgMCE9PWEpcmV0dXJuIGF9cmV0dXJuISEodGhpcy5oYXNSZXNvdXJjZUJ1bmRsZShyLHQpfHwhdGhpcy5zZXJ2aWNlcy5iYWNrZW5kQ29ubmVjdG9yLmJhY2tlbmR8fHRoaXMub3B0aW9ucy5yZXNvdXJjZXMmJiF0aGlzLm9wdGlvbnMucGFydGlhbEJ1bmRsZWRMYW5ndWFnZXN8fHMocix0KSYmKCFpfHxzKG8sdCkpKX19LHtrZXk6ImxvYWROYW1lc3BhY2VzIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMscj1fKCk7cmV0dXJuIHRoaXMub3B0aW9ucy5ucz8oInN0cmluZyI9PXR5cGVvZiB0JiYodD1bdF0pLHQuZm9yRWFjaCgoZnVuY3Rpb24odCl7bi5vcHRpb25zLm5zLmluZGV4T2YodCk8MCYmbi5vcHRpb25zLm5zLnB1c2godCl9KSksdGhpcy5sb2FkUmVzb3VyY2VzKChmdW5jdGlvbih0KXtyLnJlc29sdmUoKSxlJiZlKHQpfSkpLHIpOihlJiZlKCksUHJvbWlzZS5yZXNvbHZlKCkpfX0se2tleToibG9hZExhbmd1YWdlcyIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj1fKCk7InN0cmluZyI9PXR5cGVvZiB0JiYodD1bdF0pO3ZhciByPXRoaXMub3B0aW9ucy5wcmVsb2FkfHxbXSxpPXQuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gci5pbmRleE9mKHQpPDB9KSk7cmV0dXJuIGkubGVuZ3RoPyh0aGlzLm9wdGlvbnMucHJlbG9hZD1yLmNvbmNhdChpKSx0aGlzLmxvYWRSZXNvdXJjZXMoKGZ1bmN0aW9uKHQpe24ucmVzb2x2ZSgpLGUmJmUodCl9KSksbik6KGUmJmUoKSxQcm9taXNlLnJlc29sdmUoKSl9fSx7a2V5OiJkaXIiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKHR8fCh0PXRoaXMucmVzb2x2ZWRMYW5ndWFnZXx8KHRoaXMubGFuZ3VhZ2VzJiZ0aGlzLmxhbmd1YWdlcy5sZW5ndGg+MD90aGlzLmxhbmd1YWdlc1swXTp0aGlzLmxhbmd1YWdlKSksIXQpcmV0dXJuInJ0bCI7cmV0dXJuWyJhciIsInNodSIsInNxciIsInNzaCIsInhhYSIsInloZCIsInl1ZCIsImFhbyIsImFiaCIsImFidiIsImFjbSIsImFjcSIsImFjdyIsImFjeCIsImFjeSIsImFkZiIsImFkcyIsImFlYiIsImFlYyIsImFmYiIsImFqcCIsImFwYyIsImFwZCIsImFyYiIsImFycSIsImFycyIsImFyeSIsImFyeiIsImF1eiIsImF2bCIsImF5aCIsImF5bCIsImF5biIsImF5cCIsImJieiIsInBnYSIsImhlIiwiaXciLCJwcyIsInBidCIsInBidSIsInBzdCIsInBycCIsInByZCIsInVnIiwidXIiLCJ5ZGQiLCJ5ZHMiLCJ5aWgiLCJqaSIsInlpIiwiaGJvIiwibWVuIiwieG1uIiwiZmEiLCJqcHIiLCJwZW8iLCJwZXMiLCJwcnMiLCJkdiIsInNhbSIsImNrYiJdLmluZGV4T2YodGhpcy5zZXJ2aWNlcy5sYW5ndWFnZVV0aWxzLmdldExhbmd1YWdlUGFydEZyb21Db2RlKHQpKT4tMXx8dC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIi1hcmFiIik+MT8icnRsIjoibHRyIn19LHtrZXk6ImNsb25lSW5zdGFuY2UiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp7fSxuPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTpsdCxyPXV0KHV0KHV0KHt9LHRoaXMub3B0aW9ucyksZSkse2lzQ2xvbmU6ITB9KSxpPW5ldyBzKHIpOyh2b2lkIDAhPT1lLmRlYnVnfHx2b2lkIDAhPT1lLnByZWZpeCkmJihpLmxvZ2dlcj1pLmxvZ2dlci5jbG9uZShlKSk7cmV0dXJuWyJzdG9yZSIsInNlcnZpY2VzIiwibGFuZ3VhZ2UiXS5mb3JFYWNoKChmdW5jdGlvbihlKXtpW2VdPXRbZV19KSksaS5zZXJ2aWNlcz11dCh7fSx0aGlzLnNlcnZpY2VzKSxpLnNlcnZpY2VzLnV0aWxzPXtoYXNMb2FkZWROYW1lc3BhY2U6aS5oYXNMb2FkZWROYW1lc3BhY2UuYmluZChpKX0saS50cmFuc2xhdG9yPW5ldyBVKGkuc2VydmljZXMsaS5vcHRpb25zKSxpLnRyYW5zbGF0b3Iub24oIioiLChmdW5jdGlvbih0KXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCxuPW5ldyBBcnJheShlPjE/ZS0xOjApLHI9MTtyPGU7cisrKW5bci0xXT1hcmd1bWVudHNbcl07aS5lbWl0LmFwcGx5KGksW3RdLmNvbmNhdChuKSl9KSksaS5pbml0KHIsbiksaS50cmFuc2xhdG9yLm9wdGlvbnM9aS5vcHRpb25zLGkudHJhbnNsYXRvci5iYWNrZW5kQ29ubmVjdG9yLnNlcnZpY2VzLnV0aWxzPXtoYXNMb2FkZWROYW1lc3BhY2U6aS5oYXNMb2FkZWROYW1lc3BhY2UuYmluZChpKX0saX19LHtrZXk6InRvSlNPTiIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57b3B0aW9uczp0aGlzLm9wdGlvbnMsc3RvcmU6dGhpcy5zdG9yZSxsYW5ndWFnZTp0aGlzLmxhbmd1YWdlLGxhbmd1YWdlczp0aGlzLmxhbmd1YWdlcyxyZXNvbHZlZExhbmd1YWdlOnRoaXMucmVzb2x2ZWRMYW5ndWFnZX19fV0pLHN9KHYpO2woaHQsImNyZWF0ZUluc3RhbmNlIiwoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGh0KGFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp7fSxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCl9KSk7dmFyIGZ0PWh0LmNyZWF0ZUluc3RhbmNlKCk7ZnQuY3JlYXRlSW5zdGFuY2U9aHQuY3JlYXRlSW5zdGFuY2UsZnQuY3JlYXRlSW5zdGFuY2UsZnQuaW5pdCxmdC5sb2FkUmVzb3VyY2VzLGZ0LnJlbG9hZFJlc291cmNlcyxmdC51c2UsZnQuY2hhbmdlTGFuZ3VhZ2UsZnQuZ2V0Rml4ZWRULGZ0LnQsZnQuZXhpc3RzLGZ0LnNldERlZmF1bHROYW1lc3BhY2UsZnQuaGFzTG9hZGVkTmFtZXNwYWNlLGZ0LmxvYWROYW1lc3BhY2VzLGZ0LmxvYWRMYW5ndWFnZXM7dmFyIHB0PXtDb25maXJtVG86IkNvbmZpcm0gVG8gIixUZXh0SW5wdXQ6IlRleHQgSW5wdXQiLEF0dHJpYnV0ZToiQXR0cmlidXRlIixOb0F0dHJpYnV0ZToiTm8gQXR0cmlidXRlIixTYXZlOiJTYXZlIixVbmRvOiJVbmRvIixSZWRvOiJSZWRvIixSb3RhdGU6IlJvdGF0ZSIsU3R5bGU6IlN0eWxlIixBZGp1c3Q6IkFkanVzdCIsQm9yZGVyVGhpY2tuZXNzOiJCb3JkZXIgVGhpY2tuZXNzIixDb2xvcjoiQ29sb3IiLEJvcmRlck9wYWNpdHk6IkJvcmRlciBPcGFjaXR5IixGaWxsT3BhY2l0eToiRmlsbCBPcGFjaXR5IixTYXR1cmF0aW9uOiJTYXR1cmF0aW9uIixDb250cmFzdDoiQ29udHJhc3QiLEV4cG9zdXJlOiJFeHBvc3VyZSIsU2NyZWVuUmF0aW86IlNjcmVlbiBSYXRpbyIsT3JpZ2luYWxTY2FsZToiT3JpZ2luYWwgU2NhbGUiLENvcHlUaGVQcmV2aW91czoiQ29weSBQcmV2IixDbGVhckxhYmVsOiJDbGVhciIsU2V0QXNJbnZhbGlkOiJTZXQgQXMgSW52YWxpZCIsU2V0QXNWYWxpZDoiU2V0IEFzIFZhbGlkIixDb25maXJtOiJDb25maXJtIixGaW5pc2g6IkZpbmlzaCIsQ2FuY2VsOiJDYW5jZWwiLEl0ZW1zT2ZUaGlzUGFnZToiSXRlbXMgT2YgVGhpcyBQYWdlIixIb3RrZXlzOiJIb3RrZXlzIixBbm5vdGF0ZVJlY3Q6IkFubm90YXRlIFJlY3QiLEFubm90YXRlSW52YWxpZFJlY3Q6IkFubm90YXRlIEludmFsaWQgUmVjdCIsU2VsZWN0UmVjdDoiU2VsZWN0IFJlY3QiLFJpZ2h0Q2xpY2s6IlJpZ2h0LWNsaWNrIixUb2dnbGVSZWN0RWZmZWN0aXZlbmVzczoiVG9nZ2xlIFJlY3QgVmFsaWRpdHkiLFRvZ2dsZUVmZmVjdGl2ZW5lc3M6IlRvZ2dsZSBWYWxpZGl0eSIsRGVsZXRlUmVjdDoiRGVsZXRlIFJlY3QiLFNlbGVjdEFuZERvdWJsZUNsaWNrOiJTZWxlY3QgQW5kIERvdWJsZSBDbGljayIsU2NhbGU6IlNjYWxlIixGdWxsc2NyZWVuOiJGdWxsc2NyZWVuIixQcmV2aW91c0ltYWdlOiJQcmV2aW91cyIsUHJldmlvdXNGaWxlOiJQcmV2aW91cyIsTmV4dEltYWdlOiJOZXh0IixOZXh0RmlsZToiTmV4dCIsUHJldmlvdXNGb2xkZXI6IlByZXZpb3VzIEZvbGRlciIsTmV4dEZvbGRlcjoiTmV4dCBGb2xkZXIiLERyYWc6IkRyYWciLFRvZ2dsZVNlbGVjdGVkOiJUb2dnbGUgU2VsZWN0ZWQiLFRvZ2dsZVNlbGVjdGVkUmV2ZXJzZToiVG9nZ2xlIFNlbGVjdGVkIFJldmVyc2UiLEhpZGVHcmFwaGljczoiSGlkZSBHcmFwaGljcyIsVG9nZ2xlTGluZVBhcnRpY3VsYXJpdHk6IlRvZ2dsZSBMaW5lIFBhcnRpY3VsYXJpdHkiLFRvU2lkZToiVG8gTGluZSIsU3BlY2lmaWVkQXR0cmlidXRlc09ubHk6IlNwZWNpZmllZCBBdHRyaWJ1dGVzIE9ubHkiLE51bWJlcjoiTnVtYmVyIixQcmVzczoiUHJlc3MiLFRvT3JpZ2luYWxTdGVwOiJUbyBPcmlnaW5hbCIsSG9yaXpvbnRhbE9yVmVydGljYWw6Ikhvcml6b250YWwvVmVydGljYWwiLEFubm90YXRlSW52YWxpZExpbmU6IkFubm90YXRlIEludmFsaWQgTGluZSIsQW5ub3RhdGVMaW5lOiJBbm5vdGF0ZSBMaW5lIixTZWxlY3RMaW5lOiJTZWxlY3QgTGluZSIsVG9nZ2xlTGluZUVmZmVjdGl2ZW5lc3M6IlRvZ2dsZSBMaW5lIFZhbGlkaXR5IixEZWxldGVMaW5lOiJEZWxldGUgTGluZSIsQ29udGludWVUb0xhYmVsOiJDb250aW51ZSBUbyBMYWJlbCIsU2VsZWN0OiJTZWxlY3QiLEluc2VydFBvaW50OiJJbnNlcnQgUG9pbnQiLENsaWNrT25MaW5lOiJDbGljayBPbiBMaW5lIixEZWxldGVQb2ludDoiRGVsZXRlIFBvaW50IixEYmxDbGlja09uUG9pbnQ6IkRvdWJsZSBDbGljayBPbiBQb2ludCIsU3RvcEFkc29ycHRpb246IlN0b3AgQWRzb3JwdGlvbiIsUHJldmlvdXNMaW5lOiJQcmV2aW91cyBMaW5lIixOZXh0TGluZToiTmV4dCBMaW5lIixTZWxlY3RQb2ludDoiU2VsZWN0IFBvaW50IixBbm5vdGF0ZUludmFsaWRQb2ludDoiQW5ub3RhdGUgSW52YWxpZCBQb2ludCIsQW5ub3RhdGVQb2ludDoiQW5ub3RhdGUgUG9pbnQiLEFubm90YXRlUG9seWdvbjoiQW5ub3RhdGUgUG9seWdvbiIsU2VsZWN0UG9seWdvbjoiU2VsZWN0IFBvbHlnb24iLEFubm90YXRlSW52YWxpZFBvbHlnb246IkFubm90YXRlIEludmFsaWQgUG9seWdvbiIsVG9nZ2xlUG9seWdvbkVmZmVjdGl2ZW5lc3M6IlRvZ2dsZSBQb2x5Z29uIFZhbGlkaXR5IixEZWxldGVQb2x5Z29uOiJEZWxldGUgUG9seWdvbiIsRGVsZXRlOiJEZWxldGUiLFRvZ2dsZVBvaW50UGFydGljdWxhcml0eToiVG9nZ2xlIFBvaW50IFBhcnRpY3VsYXJpdHkiLENyb3BPdmVybGFwQXJlYToiQ3JvcCBPdmVybGFwIEFyZWEiLFNlZ21lbnRhdGlvblJlY29nbml0aW9uOiJTZWdtZW50YXRpb24gUmVjb2duaXRpb24iLFN3aXRjaFBhdHRlcm46IlN3aXRjaCBQYXR0ZXJuIixUYWdnaW5nOiJUYWdnaW5nIixIaWRlOiJIaWRlICIsVGFnZ2luZ09yQXR0cjoiVGFnL2F0dHJpYnV0ZSIsSGlkZURyYXduQW5ub3RhdGlvbjoiSGlkZGVuIERyYXduIEFubm90YXRpb24iLEJsdWU6IkJsdWUiLEN5YW46IkN5YW4iLEdyZWVuOiJHcmVlbiIsWWVsbG93OiJZZWxsb3ciLFBpbms6IlBpbmsiLFN0ZXBzOiJTdGVwcyIsRXhwb3J0OiJFeHBvcnQiLE5leHRTdGVwOiJOZXh0IFN0ZXAiLFN0ZXBOb3RGaW5pc2hlZE5vdGlmeToiVGhlcmUgYXJlIHVuYW5ub3RhdGVkIGZpbGVzIGluIHRoZSBjdXJyZW50IHN0ZXAgLCBwbGVhc2UgZmluaXNoIGJlZm9yZSB0aGUgbmV4dCBzdGVwIixjdXJJdGVtczoie3tjdXJyZW50fX0ve3t0b3RhbH19IEl0ZW1zIixUdXJuUGFnZToiVHVybiBQYWdlIixTd2l0Y2g6IlN3aXRjaCIsRW1wdHlUZXh0SW5wdXQ6IkVtcHR5IFRleHQgSW5wdXQiLFJlZ3VsYXJFeHBJbmNvcnJlY3RseToiUmVndWxhciBleHByZXNzaW9uIGlzIGluY29ycmVjdGx5IixOb0NvbmZpZ3VyYXRpb246Ik1pc3NpbmcgQ29uZmlndXJhdGlvbiIsQ2xlYXJUaGlzT3B0aW9uOiJDbGVhciBUaGlzIE9wdGlvbiIsUmVzdG9yZUltYWdlQXR0cmlidXRlczoiUmVzdG9yZSBJbWFnZSBBdHRyaWJ1dGVzIixyZWN0VG9vbDoiUmVjdFRvb2wiLHRhZ1Rvb2w6IlRhZ1Rvb2wiLHBvbHlnb25Ub29sOiJQb2x5Z29uVG9vbCIsbGluZVRvb2w6IkxpbmVUb29sIixwb2ludFRvb2w6IlBvaW50VG9vbCIsdGV4dFRvb2w6IlRleHRUb29sIixTcGVlZDoiU3BlZWQiLFBsYXlQYXVzZToiUGxheSAvIFBhdXNlIixGYXN0Rm9yd2FyZDoiRmFzdCBGb3J3YXJkIixSZXdpbmQ6IlJld2luZCIsdmlkZW9JbnZhbGlkQW5kU2tpcDoiVmlkZW8gaW52YWxpZCwgcGxlYXNlIHNraXAiLGltYWdlSW52YWxpZEFuZFNraXA6IkltYWdlIGludmFsaWQsIHBsZWFzZSBza2lwIix2aWRlb0Vycm9yQW5kUmVsb2FkOiJGYWlsZWQgdG8gbG9hZCB2aWRlbywgcGxlYXNlIHJlbG9hZCIsaW1hZ2VFcnJvckFuZFJlbG9hZDoiRmFpbGVkIHRvIGxvYWQgaW1hZ2UsIHBsZWFzZSByZWxvYWQiLG9yTWFza0FzSW52YWxpZDoiIG9yIG1hc2sgaXQgYXMgaW52YWxpZCIsQ2xpY2tBbm90aGVyUG9seWdvbjoiQ2xpY2sgYW5vdGhlciBwb2x5Z29uIixQb2x5Z29uc1RvQmVDb21iaW5lZE5lZWRUb0JlU2VsZWN0ZWQ6IlBvbHlnb25zIHRvIGJlIGNvbWJpbmVkIG5lZWQgdG8gYmUgc2VsZWN0ZWQiLEN1cnZlTW9kZURvZXNOb3RTdXBwb3J0Q3V0dGluZzoiQ3VydmUgbW9kZSBkb2VzIG5vdCBzdXBwb3J0IGN1dHRpbmciLENvbWJpbmVTdWNjZXNzOiJDb21iaW5lIHN1Y2Nlc3MiLENvbWJpbmluZ0ZhaWxlZE5vdGlmeToiQ29tYmluaW5nIGZhaWxlZC4gUGxlYXNlIGNoZWNrIHdoZXRoZXIgdHdvIHBvbHlnb25zIGludGVyc2VjdCBvciB3aGV0aGVyIHBvbHlnb24gY29tYmluaW5nIGZvcm1zIGEgbGVhayIsQ29tYmluZU92ZXJsYXBBcmVhOiJDb21iaW5lIE92ZXJsYXAgQXJlYSIsTm9EZXBlbmRlbmN5OiJUaGlzIGltYWdlIGRvZXMgbm90IG5lZWQgdG8gYmUgbGFiZWxlZCIsVGV4dENoZWNrTnVtYmVyT25seToiUGxlYXNlIGVudGVyIHRoZSBudW1iZXIiLFRleHRDaGVja0VuZ2xpc2hPbmx5OiJQbGVhc2UgZW50ZXIgRW5nbGlzaCIsVGV4dENoZWNrQ3VzdG9tRm9ybWF0OiJQbGVhc2UgZW50ZXIgZGF0YSBpbiBjdXN0b20gZm9ybWF0IixGcmFtaW5nT2ZPYmplY3RUb0JlRGl2aWRlZDoiUGxlYXNlIGZyYW1lIHRoZSBvYmplY3QgdG8gYmUgZGl2aWRlZCBmaXJzdCIsQ2xpY2tPblRhcmdldDoiUGxlYXNlIGNsaWNrIG9uIHRhcmdldCBvYmplY3QiLFNwbGl0dGluZ0FsZ29yaXRobVByZWRpY3Rpb246IlNwbGl0dGluZyBhbGdvcml0aG0gcHJlZGljdGlvbiBpbiBwcm9ncmVzcy4uLiIsIjJEVmlldyI6IjJEVmlldyIsIjNEVmlldyI6IjNEVmlldyIsVG9wVmlldzoiVG9wVmlldyIsU2lkZVZpZXc6IlNpZGVWaWV3IixCYWNrVmlldzoiQmFja1ZpZXciLFNob3dBcnJvd3M6IlNob3cgQXJyb3dzIixMZW5ndGg6Ikxlbmd0aCIsV2lkdGg6IldpZHRoIixIZWlnaHQ6IkhlaWdodCIsUm90YXRpb25feToiUm90YXRpb25feSIsUG9pbnRDb3VudDoiUG9pbnQgQ291bnQiLEludmFsaWQ6IkludmFsaWQiLFRhZzoiVGFnIixTZWFyY2hUYWc6IlNlYXJjaCB0YWdzIixTdWJBdHRyaWJ1dGU6IlN1YkF0dHJpYnV0ZSIsUGxlYXNlU2VsZWN0OiJQbGVhc2UgU2VsZWN0IixDb3B5RW1wdHlJblBvaW50Q2xvdWQ6IlRoZSBjb3B5IGNvbnRlbnQgaXMgZW1wdHksIHBsZWFzZSBzZWxlY3QgdGhlIGNvcnJlc3BvbmRpbmcgcG9pbnQgY2xvdWQgZGF0YSIsUGFzdGVFbXB0eUluUG9pbnRDbG91ZDoiUGxlYXNlIGNvcHkgdGhlIHBvaW50Q2xvdWQgZGF0YSBiZWZvcmUgcGFzdGluZyIsSGFzRHVwbGljYXRlSUQ6IkR1cGxpY2F0ZSBJRCBleGlzdHMsIGNvcHkgZmFpbGVkIixIYXNEdXBsaWNhdGVJREhlYWRlcjoiVHJhY2tJRCBkdXBsaWNhdGlvbiBleGlzdHMiLEhhc0R1cGxpY2F0ZUlETXNnOiJUaGVyZSBpcyBhbiBpc3N1ZSB3aXRoIGR1cGxpY2F0ZSB0cmFja0lEcywgb3ZlcnJpZGUgaXQ/IixDb3B5U3VjY2VzczoiQ29weSBTdWNjZXNzISIsTG93ZXJMaW1pdFBvaW50c051bUluQm94OiJUaGUgbnVtYmVyIG9mIHBvaW50cyBpbiB0aGUgYm94IG11c3Qgbm90IGJlIGxlc3MgdGhhbiB7e251bX19IixQb2ludFRoaWNrbmVzczoiUG9pbnQgVGhpY2tuZXNzIixSb3RhdGVBcm91bmRDZW50ZXJQb2ludDoiUm90YXRlIEFyb3VuZCBDZW50ZXIgUG9pbnQiLFBvaW50Q2xvdWRWaWV3VHJhbnNsYXRlOiJQb2ludENsb3VkVmlldyBUcmFuc2xhdGlvbiIsVG9wVmlld1RyYW5zbGF0ZToiVG9wVmlldyBUcmFuc2xhdGlvbiIsQ2hhbmdlUG9pbnRDbG91ZFZhbGlkOiJDaGFuZ2UgUG9pbnRDbG91ZCBWYWxpZCIsTGFzc29TZWxlY3RvcjoiTGFzc28iLFJlY3RTZWxlY3RvcjoiUmVjdCIsU2VsZWN0b3JNc2c6IlJpZ2h0LWNsaWNrIGRyYWcgdG8gc2VsZWN0IixBZGRQb2ludDoiQWRkIFBvaW50IixDaXJjbGVTZWxlY3RvcjoiUG9pbnQiLERldGVjdGlvbk1vZGU6IkRldGVjdGlvbk1vZGUiLFNlZ21lbnRhdGlvbk1vZGU6IlNlZ21lbnRhdGlvbk1vZGUiLEVudGVyRWRpdE1vZGU6IkVudGVyIGVkaXQgbW9kZSIsU2VsZWN0ZWRQb2ludHM6IlNlbGVjdGVkIFBvaW50cyIsQ29weUJveDoiQ29weSBCb3giLFBhc3RlQm94OiJQYXN0ZSBCb3giLFJvdGF0ZUxlZnQ6IlJvdGF0ZSBMZWZ0IixSb3RhdGVSaWdodDoiUm90YXRlIFJpZ2h0IixOZXh0Qm94OiJOZXh0IEJveCIsUHJldmlvdXNCb3g6IlByZXZpb3VzIEJveCIsUm90YXRlOTA6IlJvdGF0ZSA5MMKwIixDb3B5UHJldlBhZ2U6IkNvcHkgUHJldmlvdXMgUGFnZSIsQ2hhbmdlQm94VmFsaWQ6IkNoYW5nZSBCb3gncyBWYWxpZCIsTXVsdGlTZWxlY3Q6Ik11bHRpIFNlbGVjdCIsU2VsZWN0QWxsQm94OiJTZWxlY3QgQWxsIEJveGVzIixHZW5lcmFsT3BlcmF0aW9uOiJHZW5lcmFsIE9wZXJhdGlvbiIsUmVjdFBhdHRlcm46IlJlY3QgUGF0dGVybiIsUG9seWdvblBhdHRlcm46IlBvbHlnb24gUGF0dGVybiIsQ2hhbmdlUGF0dGVybk1zZzoiQ2hhbmdlIFBhdHRlcm4gdG8ge3twYXR0ZXJufX0gc3VjY2Vzc2Z1bGx5IixEcmFnT3BlcmF0aW9uOiJEcmFnIixTZWxlY3RlZFN0YXR1czoiU2VsZWN0ZWQiLHVwZGF0ZVZhbGlkRnJvbVZhbGlkVG9JblZhbGlkOiJDb25maXJtIHVwZGF0ZSBhcyBpbnZhbGlkIHBhZ2XvvJ8iLHVwZGF0ZVZhbGlkRnJvbUluVmFsaWRUb1ZhbGlkOiJDb25maXJtIHVwZGF0ZSBhcyB2YWxpZCBwYWdl77yfIixBbGxUcmFja0lEczoiQWxsIFRyYWNrSURzIixDdXJyZW50Qm94VHJhY2tJRHM6IkN1cnJlbnQgVHJhY2tJRCIsUG9zaXRpdmVJbnRlZ2VyQ2hlY2s6IlBsZWFzZSBlbnRlciBhIHBvc2l0aXZlIGludGVnZXIiLE5vdEFsbG93RGVjaW1hbFBvaW50c0luVHJhY2tJRDoiVHJhY2tJRCBpcyBub3QgYWxsb3dlZCB0byBiZSBkZWNpbWFsIixEdXBsaWNhdGVUcmFja0lEc0V4aXN0OiJEdXBsaWNhdGUgdHJhY2tJRHMgZXhpdHMiLEJhdGNoVXBkYXRlVGV4dDoiQmF0Y2ggVXBkYXRlIixCYXRjaFVwZGF0ZVRyYWNrSUQ6IkJhdGNoIHVwZGF0ZSB0cmFja0lEcyIsVHJhY2tJRFVuaWZ5QXM6IlRyYWNrSUQgaXMgVW5pZnkgYXMiLFVuaWZ5VHJhY2tJRFJhbmdlOiJVbmlmeSBUcmFja0lEIFJhbmdlIixQYWdlOiJQYWdlIixPa1RleHQ6Ik9LIixDYW5jZWxUZXh0OiJDYW5jZWwiLFVuaWZ5UGFyYW1zOiJVbmlmeSBQYXJhbXMiLFVuaWZ5QXR0cmlidXRlUmFuZ2U6IlVuaWZ5IFJhbmdlIixVbmlmeVBhcmFtc1RpcHM6IlRoZSBzaXplIG9mIDJEIGZyYW1lcyBpbiBub24gY3VycmVudCBwYWdlIGltYWdlcyB3aWxsIG5vdCBiZSBzdGFuZGFyZGl6ZWQgdGVtcG9yYXJpbHkiLFVuaWZ5VHJhY2tJRDoiVW5pZnkgVHJhY2tJRCIsVW5pZnlTaXplOiJVbmlmeSBTaXplIixVbmlmeVRhZzoiVW5pZnkgVGFnIixOb0RhdGE6Ik5vIERhdGEiLEFubm90YXRlZExpc3Q6IkFubm90YXRlZCBMaXN0IixvbkRlbGV0ZUdyYXBoQnlBdHRyOiJBcmUgeW91IHN1cmUgdG8gZGVsZXRlIHRoZSBkYXRhIHdpdGggYXR0cmlidXRlIHt7YXR0cmlidXRlfX0/IixDYW5jZWxGaXhlZDoiQ2FuY2VsIEZpeGVkIixGaXhlZE9uTGVmdDoiRml4ZWQgT24gTGVmdCIsRml4ZWRPblJpZ2h0OiJGaXhlZCBPbiBSaWdodCIsQW5ub3RhdGVkUmVzdWx0OiJBbm5vdGF0ZWQgUmVzdWx0IixDb21wbGVtZW50YXJ5VHJhY2tpbmc6IkNvbXBsZW1lbnRhcnkgdHJhY2tpbmciLENvbXBsZW1lbnRhcnlUcmFja2luZ1ByZWRpY3Rpb246IkNvbXBsZW1lbnRhcnkgdHJhY2tpbmcgcHJlZGljdGlvbiIsQXBwbHk6IkFwcGx5IixCZWZvcmVQcmVkaWN0U3RhcnRpbmc6IkJlZm9yZSBzdGFydGluZywgcGxlYXNlIG1hcmsgdGhlIGZpcnN0IGFuZCBsYXN0IGJveCwgbmVlZCB0aGUgc2FtZSB0cmFja0lEIixUaGVQcmVkaWN0ZWRQb2ludENsb3VkOiJUaGUgcHJlZGljdGVkIHBvaW50IGNsb3VkIG5vdyBuZWVkcyB0byBiZSBsZXNzIHRoYW4gMTAgZnJhbWVzIixDYW1lcmFGb2xsb3dUb3BWaWV3OiJQb3NpdGlvbmVkIGJ5IHRvcCB2aWV3IixNYXJrT25seU9uZToiTWFyayBvbmx5IG9uZSBmcmFtZSBvZiBkYXRhLCBuZWVkIHRvIG1hcmsgdGhlIGZpcnN0IGFuZCBsYXN0IGZyYW1lIG9mIGRhdGEiLEhhdmVOb05lZWQ6IkhhdmUgbm8gbmVlZCB0byBwcmVkaWN0IHRoZSBkYXRhIGJldHdlZW4gdHdvIGZyYW1lcywgcGxlYXNlIG1hcmsgdGhlIGZpcnN0IGFuZCBsYXN0IGZyYW1lIGZpcnN0LCBhbmQgbmVlZCB0aGUgc2FtZSBzZXJpYWwgbnVtYmVyIixQcmVkaWN0aW5nRGF0YUZyb206IlByZWRpY3RpbmcgZGF0YSBmcm9tIHBhZ2Uge3tzdGFydFBhZ2V9fSB0byBwYWdlIHt7ZW5kUGFnZX19IHdpdGggYm94IElEIHt7c2VsZWN0ZWRCb3hUcmFja0lEfX0iLFBvaW50Q2xvdWRDb3Zlck1vZGU6IldoZW4gdGhlIHNhbWUgcG9pbnQgY2xvdWQgaXMgc2VsZWN0ZWQsIHRoZSBsYXRlciBtYXJrZXIgb3ZlcndyaXRlcyB0aGUgcHJldmlvdXMgb25lIixQb2ludENsb3VkVW5jb3Zlck1vZGU6IldoZW4gdGhlIHNhbWUgcG9pbnQgY2xvdWQgaXMgc2VsZWN0ZWQsIHRoZSBsYXR0ZXIgbWFya2VyIGNhbm5vdCBvdmVyd3JpdGUgdGhlIGZvcm1lciBtYXJrZXIiLFBvaW50Q2xvdWRGb2N1c01vZGU6IkZvY3VzIG1vZGUgaGFzIGJlZW4gdHVybmVkIG9uIixQb2ludENsb3VkVW5mb2N1c01vZGU6IkZvY3VzIG1vZGUgaXMgdHVybmVkIG9mZiIsUG9pbnRDbG91ZEhpZGVTZWdtZW50OiJNYXJrZWQgcG9pbnQgY2xvdWQgaXMgaGlkZGVuIixQb2ludENsb3VkU2hvd1NlZ21lbnQ6IkFsbCBwb2ludCBjbG91ZHMgaGF2ZSBiZWVuIGRpc3BsYXllZCIsUG9pbnRDbG91ZEhpZGVTZWdtZW50SW52YWxpZDoiVW5hdmFpbGFibGUgaW4gZm9jdXMgbW9kZSIsUG9pbnRDbG91ZEhpZGVGb2N1c0ludmFsaWRfaGlkZToiRm9jdXMgbW9kZSBpcyBub3QgYXZhaWxhYmxlLCBwbGVhc2Ugc2hvdyB0aGUgbWFya2VkIHBvaW50IGZpcnN0IixQb2ludENsb3VkSGlkZUZvY3VzSW52YWxpZF9ub25lOiJGb2N1cyBtb2RlIGlzIG5vdCBhdmFpbGFibGUsIHBsZWFzZSBzZWxlY3QgdGhlIG1hcmtlciB0byBiZSBmb2N1c2VkIGZpcnN0IixQYWxldHRlOiJQYWxldHRlIixFZmZpY2llbnRMaXN0ZW5pbmc6IlRoZSB0YXNrIGlzIG1hcmtlZCBpbiB0aGUgZWZmaWNpZW5jeSBtb25pdG9yaW5nLi4uIixUaXRsZToiVGl0bGUiLEFuc3dlcjoiQW5zd2VyIixGaW5pc2hlZDoiRmluaXNoZWQiLFVuZmluaXNoZWQ6IlVuZmluaXNoZWQiLE92ZXJhbGxTY29yZToiT3ZlcmFsbFNjb3JlIixOb1Njb3JpbmdTY2FsZToiQ29uZmlndXJhYmxlIHN0ZXAgZGV0YWlscyBvbiB0aGUgbGVmdCIsQmVzdDoiQmVzdCIsV29yc3Q6IldvcnN0IixSYW5raW5nUXVhbGl0eU9mQW5zd2VyczoiUmFua2luZ1F1YWxpdHlPZkFuc3dlcnMiLFRvQmVTb3J0ZWQ6IlRvQmVTb3J0ZWQiLFllczoiWWVzIixObzoiTm8iLEFkZGl0aW9uYWxDb250ZW50OiJBZGRpdGlvbmFsQ29udGVudCIsU3VibWl0OiJTdWJtaXQiLERyYWdBbmREcm9wOiJEcmFnIGFuZCBkcmFwIixEZWZhdWx0U2l6ZToiQ2xpY2sgdG8gdXNlIHRoZSBkZWZhdWx0IHNpemUuIixOb3JtYWxTaXplUmFuZ2U6Ik5vcm1hbCBzaXplIHJhbmdlIixOb3JtYWxDZW50ZXJQb2ludFJhbmdlOiJOb3JtYWwgY2VudGVyIHBvaW50IHJhbmdlIixMb2FkaW5nVGlwczoiV2FpdCBhIG1pbnV0ZSwgRGF0YSBMb2FkaW5nIH4iLFVubG9ja2VkOiJVbmxvY2tlZCIsTG9ja2VkOiJMb2NrZWQiLExlYXN0Q2hhcmFjdGVyRXJyb3I6IlBsZWFzZSBlbnRlciBhdCBsZWFzdCB7e251bX19IGNoYXJhY3RlcnMiLEFuZDoiQW5kIixPcjoiT3IiLEltYWdlTGFiZWxzOiJJbWFnZSBsYWJlbHMiLCIzRFJlY3QiOiIzRCBSZWN0IiwiMkRSZWN0IjoiMkQgUmVjdCIsQWRkUG9pbnRzOiJBREQiLFJlbW92ZVBvaW50czoiUkVNT1ZFIixSZXNldDoiUmVzZXQiLFBsZWFzZUZyYW1lVGhlT2JqZWN0VG9CZURpdmlkZWRGaXJzdDoiUGxlYXNlIGZyYW1lIHRoZSBvYmplY3QgdG8gYmUgZGl2aWRlZCBmaXJzdCIsQ2xpY2tPblRoZVRhcmdldE9iamVjdFRvU3BsaXRJdDoiQ2xpY2sgb24gdGhlIHRhcmdldCBvYmplY3QgdG8gc3BsaXQgaXQiLENsaWNrVGhlVGFyZ2V0T2JqZWN0QWdhaW5Ub0luY3JlYXNlVGhlU2VnbWVudGF0aW9uOiJDbGljayB0aGUgdGFyZ2V0IG9iamVjdCBhZ2FpbiB0byBpbmNyZWFzZSB0aGUgc2VnbWVudGF0aW9uIixDbGlja09uVGhlVGFyZ2V0T2JqZWN0VG9EZWxldGVUaGVTZWdtZW50YXRpb246IkNsaWNrIG9uIHRoZSB0YXJnZXQgb2JqZWN0IHRvIGRlbGV0ZSB0aGUgc2VnbWVudGF0aW9uIixDbGlja0FnYWluT25UaGVUYXJnZXRPYmplY3RUb0RlbGV0ZVRoZVNlZ21lbnRhdGlvbjoiQ2xpY2sgYWdhaW4gb24gdGhlIHRhcmdldCBvYmplY3QgdG8gZGVsZXRlIHRoZSBzZWdtZW50YXRpb24iLEFuc3dlcnNBcmVCZWluZ0dlbmVyYXRlZDoiQW5zd2VycyBhcmUgYmVpbmcgZ2VuZXJhdGVkIixBbnN3ZXJHZW5lcmF0aW9uRmFpbGVkUGxlYXNlVHJ5QWdhaW5MYXRlcjoiQW5zd2VyIGdlbmVyYXRpb24gZmFpbGVkLCBwbGVhc2UgdHJ5IGFnYWluIGxhdGVyIixSZUdlbmVyYXRlOiJSZS1nZW5lcmF0ZSIsQW5zd2VyVGV4dEVkaXQ6IkFuc3dlciB0ZXh0IGVkaXQiLFNob3dFZGl0aW5nUmVzdWx0RGlmZmVyZW5jZXNJblRleHRNb2RlT25seToiU2hvdyBlZGl0aW5nIHJlc3VsdCBkaWZmZXJlbmNlcyBpbiB0ZXh0IG1vZGUgb25seSIsQXR0cmlidXRlTG9ja05vdGlmeToiVmlldyBQcm9wZXJ0aWVz77yae3tsYWJlbH1977yMb25seSBkaXNwbGF5IHRoZSBhbm5vdGF0aW9uIGNvbnRlbnQgb2YgdGhlIHNlbGVjdGVkIHByb3BlcnRpZXMiLEF1ZGlvU2VnbWVudFRpcDoiUGxlYXNlIHNlbGVjdCB0aGUgZGVzaXJlZCB0aW1lIHBvaW50IGZvciBjYXB0dXJl77yIe3t0aW1lfX3vvIkiLEF1ZGlvQ29tYmluZVRpcDoiUGxlYXNlIGNsaWNrIG9uIHRoZSBpbnRlcnZhbHMgeW91IHdpc2ggdG8gbWVyZ2UiLENsaXBwZWRBdWRpbzoiQ2FwdHVyZWQgY29udGVudCIsTm9DbGlwcGVkRGF0YToiTm8gY2FwdHVyZWQgY29udGVudCIsQ29tcGFyZVRhZ3M6IlRhZyBjb21wYXJpc29uIGRpc3BsYXkiLENvbWJpbmVBdWRpbzoiTWVyZ2UgaW50ZXJ2YWxzIixDbGlwQXVkaW86IlNwbGl0IGludGVydmFscyIsU3dpdGNoQ2xpcE1vZGU6IlN3aXRjaCB0byBjYXB0dXJlIG1vZGUiLFN3aXRjaFRhZ01vZGU6IlN3aXRjaCB0byB0YWcgbW9kZSIsQ2xpcDoiQ2FwdHVyZSIsUHJldmlvdXNJbnRlcnZhbDoiUHJldmlvdXMgaW50ZXJ2YWwiLE5leHRJbnRlcnZhbDoiTmV4dCBpbnRlcnZhbCIsRGVsZXRlQ29tbWVudDoiRGVsZXRlIENvbW1lbnRzIixEZWxldGVDb21tZW50Q29uZmlybToiQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIGFubm90YXRpb24/IixQcmV2aW91c0NvbW1lbnQ6IlByZXZpb3VzIGNvbW1lbnQiLE5leHRDb21tZW50OiJOZXh0IGNvbW1lbnQiLENsaXBTZWxlY3Q6IlNlbGVjdCIsIkZvcndhcmQwLjEiOiJBZHZhbmNlIGJ5IDAuMSBzZWNvbmRzIiwiQmFjazAuMSI6IlJld2luZCBieSAwLjEgc2Vjb25kcyIsTGVmdENsaWNrOiJMZWZ0LWNsaWNrIixTY3JpYmJsZToiU2NyaWJibGUiLEVyYXNlOiJFcmFzZSIsU2NyaWJibGVMaW5lOiJTY3JpYmJsZSAoQ29ubmVjdCkiLFN0cm9rZUVubGFyZ2U6IlN0cm9rZSB0byBlbmxhcmdlIixTdHJva2VSZWR1Y3Rpb246IlN0cm9rZSByZWR1Y3Rpb24iLHRvZ2dsZVNob3dUZXh0OiJUZXh0IENvbXBhcmlzb24gRGlzcGxheSIsQ2xpcFNsaWNlOiJUcmltIFNlZ21lbnQiLFRpbWVTdGFtcDoiQWRkIFRpbWVzdGFtcCIsQ2xpcFRpbWU6IlRyaW0gVGltZSIsU3RhbXBUaW1lOiJUaW1lc3RhbXAgVGltZSIsR2V0U3RhcnRUaW1lOiJSZXRyaWV2ZSBTdGFydCBUaW1lIixHZXRFbmRUaW1lOiJSZXRyaWV2ZSBFbmQgVGltZSIsT3V0cHV0RGlzcGxheToiT3V0cHV0IGRpc3BsYXkiLE1heGltdW1DaGFyYWN0ZXJFcnJvcjoiVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGNhbm5vdCBleGNlZWQge3tudW19fSIsQ29tbW9uU3ltYm9sczoiQ29tbW9uIHN5bWJvbHMiLEJpbmFyeU9wZXJhdGlvbnM6IkJpbmFyeSBvcGVyYXRpb25zIixCaW5hcnlSZWxhdGlvbnM6IkJpbmFyeSByZWxhdGlvbnMiLEFycm93czoiQXJyb3dzIixPdGhlcnM6Ik90aGVycyIsR3JlZWs6IkdyZWVrIGFscGhhYmV0IixMb3dlcmNhc2U6Ikxvd2VyY2FzZSIsVXBwZXJjYXNlOiJVcHBlcmNhc2UiLEFkdmFuY2VkTWF0aGVtYXRpY3M6IkFkdmFuY2VkIG1hdGhlbWF0aWNzIixGcmFjdGlvbmFsRGlmZmVyZW50aWF0aW9uOiJGcmFjdGlvbmFsIGRpZmZlcmVudGlhdGlvbiIsRnJhY3Rpb246IkZyYWN0aW9uIixEZXJpdmF0aXZlOiJEZXJpdmF0aXZlIixNb2R1bGFyQXJpdGhtZXRpYzoiTW9kdWxhciBhcml0aG1ldGljIixSYWRpY2FsOiJSYWRpY2FsIixTdXBBbmRTdWI6IlN1cGVyc2NyaXB0IGFuZCBzdWJzY3JpcHQiLExpbWl0TG9nYXJpdGhtOiJMaW1pdCBsb2dhcml0aG0iLExpbWl0czoiTGltaXRzIixMb2dhcml0aG1zQW5kRXhwb25lbnRzOiJMb2dhcml0aG1zIGFuZCBleHBvbmVudHMiLEJvdW5kczoiQm91bmRzIixJbnRlZ3JhbE9wZXJhdGlvbjoiSW50ZWdyYWwgb3BlcmF0aW9uIixJbnRlZ3JhbDoiSW50ZWdyYWwiLERvdWJsZUludGVncmFsOiJEb3VibGUgaW50ZWdyYWwiLFRyaXBsZUludGVncmFsOiJUcmlwbGUgaW50ZWdyYWwiLExhcmdlT3BlcmF0aW9uczoiTGFyZ2Ugb3BlcmF0aW9ucyIsUHJvZHVjdHNBbmRDb3Byb2R1Y3RzOiJQcm9kdWN0cyBhbmQgY29wcm9kdWN0cyIsSW50ZXJzZWN0aW9uQW5kVW5pb246IkludGVyc2VjdGlvbiBhbmQgdW5pb24iLExpbmVhckFsZ2VicmE6IkxpbmVhciBhbGdlYnJhIixCcmFja2V0Rm9yZW5zaWNzOiJCcmFja2V0IGZvcmVuc2ljcyIsQnJhY2tldDoiQnJhY2tldCIsQ29tbW9uOiJDb21tb24iLEFycmF5TWF0cml4OiJBcnJheSBtYXRyaXgiLFRyaWdvbm9tZXRyaWNGdW5jdGlvbnM6IlRyaWdvbm9tZXRyaWMgZnVuY3Rpb25zIixJbnZlcnNlVHJpZ29ub21ldHJpY0Z1bmN0aW9uczoiSW52ZXJzZSB0cmlnb25vbWV0cmljIGZ1bmN0aW9ucyIsSHlwZXJibGljRnVuY3Rpb25zOiJIeXBlcmJsaWMgZnVuY3Rpb25zIixJbnZlcnNlSHlwZXJibGljRnVuY3Rpb25zOiJJbnZlcnNlIGh5cGVyYmxpYyBmdW5jdGlvbnMiLEZvcm11bGFUZW1wbGF0ZToiRm9ybXVsYSB0ZW1wbGF0ZSIsQWxnZWJyYToiQWxnZWJyYSIsR2VvbWV0cnk6Ikdlb21ldHJ5IixJbmVxdWFsaXR5OiJJbmVxdWFsaXR5IixNYXRyaXg6Ik1hdHJpeCIsVHJpYW5nbGU6IlRyaWFuZ2xlIixTdGF0aXN0aWNzOiJTdGF0aXN0aWNzIixTZXF1ZW5jZToiU2VxdWVuY2UiLFBoeXNpY3M6IlBoeXNpY3MiLEluZGljYXRvckp1ZGdtZW50OiJJbmRpY2F0b3IganVkZ21lbnQiLE9ubHlDdXJyZW50RnJhbWU6Ik9ubHkgY3VycmVudCBmcmFtZSIsQ2xpY2tPblRoZUlkVG9IaWdobGlnaHRUaGVNYXJrdXBCb3g6IkNsaWNrIG9uIHRoZSBJRCB0byBoaWdobGlnaHQgdGhlIG1hcmt1cCBib3giLERvdWJsZUNsaWNrT25UaGVJZFRvQ29udGludW91c2x5SGlnaGxpZ2h0Qm94ZXNBY3Jvc3NGcmFtZXM6IkRvdWJsZS1jbGljayBvbiB0aGUgSUQgdG8gY29udGludW91c2x5IGhpZ2hsaWdodCBib3hlcyBhY3Jvc3MgZnJhbWVzIixGaW5kVGhlRnJhbWVDb3JyZXNwb25kaW5nVG9UaGVMYWJlbGVkRnJhbWVJZDoiRmluZCB0aGUgZnJhbWUgY29ycmVzcG9uZGluZyB0byB0aGUgbGFiZWxlZCBmcmFtZSBJRCIsR2xvYmFsQW5ub3RhdGlvbjoiR2xvYmFsIGFubm90YXRpb24iLFF1YWxpZmllZEFubm90YXRpb246IlF1YWxpZmllZCBhbm5vdGF0aW9uIixJbnZhbGlkUXVlc3Rpb25BbmRTa2lwOiJJbnZhbGlkIHF1ZXN0aW9uLCBwbGVhc2Ugc2tpcCB0aGlzIHF1ZXN0aW9uIixQcm9qZWN0aW9uRnJhbWVDYW5ub3RCZURlbGV0ZWQ6IlByb2plY3Rpb24gZnJhbWUgY2Fubm90IGJlIGRlbGV0ZWQiLEZhaWxlZFRvQ29weVJlc3VsdHM6IkZhaWxlZCB0byBjb3B5IHJlc3VsdHMiLFBhcnRpYWxSZXN1bHRzUmVwbGljYXRpb25GYWlsdXJlOiJQYXJ0aWFsIHJlc3VsdHMgcmVwbGljYXRpb24gZmFpbHVyZSIsUm90YXRpb25BbmdsZVNlbnNpdGl2aXR5OiJSb3RhdGlvbiBhbmdsZSBzZW5zaXRpdml0eSIsIjJESW1hZ2VCYXRjaCI6IjJEIEltYWdlIEJhdGNoIiwiMkRJbWFnZUJhdGNoQ29ubmVjdGlvbiI6IjJEIEltYWdlIEJhdGNoIENvbm5lY3Rpb24iLCIyREltYWdlQmF0Y2hEaXNjb25uZWN0aW9uIjoiMkQgSW1hZ2UgQmF0Y2ggRGlzY29ubmVjdGlvbiIsQ29uZmlybVRvQmF0Y2hDb25uZWN0OiJDb25maXJtIGJhdGNoIGNvbm5lY3Rpb24/IixDb25maXJtVG9CYXRjaERpc2Nvbm5lY3Q6IkNvbmZpcm0gYmF0Y2ggZGlzY29ubmVjdGlvbj8iLENvbm5lY3Q6IkNvbm5lY3QiLERpc2Nvbm5lY3Q6ImRpc2Nvbm5lY3QiLEltYWdlMkRCb3hTY2FsZToiSW1hZ2UgMkQgQm94IFNjYWxlIixTZWxlY3RlZFJlY3Q6IlNlbGVjdGVkIFJlY3QiLE9ubHlMb2FkVGhlRmlyc3RGcmFtZVByZUFubm90YXRpb246Ik9ubHkgbG9hZCB0aGUgZmlyc3QgZnJhbWUgcHJlIGFubm90YXRpb24iLFNlbGVjdEJveFRvRGlzcGxheUluZGVwZW5kZW50bHk6IlNlbGVjdCBib3ggdG8gZGlzcGxheSBpbmRlcGVuZGVudGx5IixTZWxlY3RCb3hTd2l0Y2hUaXBzOiJBZnRlciB0dXJuaW5nIG9uIHRoZSBzd2l0Y2gsIHNlbGVjdCB0aGUgYm94IGluIHRoZSB0b3AgdmlldywgYW5kIHRoZSBpbWFnZSB2aWV3IHdpbGwgb25seSBkaXNwbGF5IHRoZSBjb3JyZXNwb25kaW5nIDJELzNEIGJveCwgbWFraW5nIGl0IGVhc2llciB0byB2aWV3IHRoZSBjb3JyZXNwb25kaW5nIHJlbGF0aW9uc2hpcCBpbiB0aGUgdG9wIHZpZXciLFNvcnRDb252ZXJzYXRpb25RdWFsaXR5OiJQbGVhc2UgcmFuayB0aGUgcXVhbGl0eSBvZiBlYWNoIGNvbnZlcnNhdGlvbiIsRGlhbG9nOiJEaWFsb2ciLFNlbGVjdGlvbk9mQW5ub3RhdGlvbjoiU2VsZWN0aW9uIG9mIGFubm90YXRpb24iLEFubm90YXRpbmc6IkFubm90YXRpbmciLEdyb3VwOiJHcm91cCIsVGhlRHJhd0ZyYW1lU2l6ZUlzU21hbGxlclRoYW5UaGVNaW5pbXVtRHJhd1NpemVJblRoZVN0ZXBDb25maWd1cmF0aW9uOiJUaGUgZHJhdyBmcmFtZSBzaXplIGlzIHNtYWxsZXIgdGhhbiB0aGUgbWluaW11bSBkcmF3IHNpemUgaW4gdGhlIHN0ZXAgY29uZmlndXJhdGlvbiIsVGhlU2l6ZU9mVGhlRHJhd2luZ0JveElzU21hbGxlclRoYW5UaGVNaW5pbXVtRHJhd2luZ1NpemVJblRoZU1haW5Qcm9wZXJ0eUNvbmZpZ3VyYXRpb246IlRoZSBzaXplIG9mIHRoZSBkcmF3aW5nIGJveCBpcyBzbWFsbGVyIHRoYW4gdGhlIG1pbmltdW0gZHJhd2luZyBzaXplIGluIHRoZSBtYWluIHByb3BlcnR5IGNvbmZpZ3VyYXRpb24ifSxkdD17VGV4dElucHV0OiLmlofmnKzovpPlhaUiLEF0dHJpYnV0ZToi5Li75bGe5oCnIixOb0F0dHJpYnV0ZToi5peg5bGe5oCnIixTYXZlOiLkv53lrZgiLFVuZG86IuaSpOmUgCIsUmVkbzoi6YeN5YGaIixSb3RhdGU6IuaXi+i9rCIsU3R5bGU6Iuagt+W8jyIsQWRqdXN0OiLlm77niYfosIPmlbQiLEJvcmRlclRoaWNrbmVzczoi6L655qGG57KX57uGIixDb2xvcjoi6aKc6ImyIixCb3JkZXJPcGFjaXR5OiLovrnmoYbpgI/mmI7luqYiLEZpbGxPcGFjaXR5OiLloavlhYXpgI/mmI7luqYiLFNhdHVyYXRpb246IumlseWSjOW6piIsQ29udHJhc3Q6IuWvueavlOW6piIsRXhwb3N1cmU6IuabneWFieW6piIsU2NyZWVuUmF0aW86IueUu+mdouWNoOavlCIsT3JpZ2luYWxTY2FsZToi5oyJ5Y6f5Zu+5q+U5L6L5pi+56S6IixDb3B5VGhlUHJldmlvdXM6IuWkjeWItuS4iuW8oCIsQ2xlYXJMYWJlbDoi5riF56m65qCH5rOoIixTZXRBc0ludmFsaWQ6Iuagh+S4uuaXoOaViCIsU2V0QXNWYWxpZDoi5Y+W5raI5peg5pWIIixDb25maXJtOiLnoa7orqQiLEZpbmlzaDoi5a6M5oiQIixDYW5jZWw6IuWPlua2iCIsSXRlbXNPZlRoaXNQYWdlOiLmnKzpobXku7bmlbAiLEhvdGtleXM6IuW/q+aNt+mUriIsQW5ub3RhdGVSZWN0OiLmi4nmoYYiLEFubm90YXRlSW52YWxpZFJlY3Q6IuaLieaXoOaViOahhiIsU2VsZWN0UmVjdDoi6YCJ5Lit5qGGIixSaWdodENsaWNrOiLlj7Plh7siLFRvZ2dsZVJlY3RFZmZlY3RpdmVuZXNzOiLliIfmjaLmoYbmmK/lkKbmnInmlYgiLFRvZ2dsZUVmZmVjdGl2ZW5lc3M6IuaYr+WQpuagh+S4uuaXoOaViCIsRGVsZXRlUmVjdDoi5Yig6Zmk5qGGIixTZWxlY3RBbmREb3VibGVDbGljazoi6YCJ5Lit5Y+M5Ye7IixTY2FsZToi57yp5pS+IixGdWxsc2NyZWVuOiLlhajlsY8iLFByZXZpb3VzSW1hZ2U6IuS4iuS4gOW8oCIsUHJldmlvdXNGaWxlOiLkuIrkuIDkuKoiLE5leHRJbWFnZToi5LiL5LiA5bygIixOZXh0RmlsZToi5LiL5LiA5LiqIixQcmV2aW91c0ZvbGRlcjoi5LiK5LiA5paH5Lu25aS5IixOZXh0Rm9sZGVyOiLkuIvkuIDmlofku7blpLkiLERyYWc6IuaLluWKqOWbvueJhyIsVG9nZ2xlU2VsZWN0ZWQ6IuWIh+aNoumAieS4rSIsVG9nZ2xlU2VsZWN0ZWRSZXZlcnNlOiLpgIbluo/liIfmjaLpgInkuK0iLEhpZGVHcmFwaGljczoi6ZqQ6JeP5Zu+5b2iIixUb2dnbGVMaW5lUGFydGljdWxhcml0eToi5o2i54m55q6K6L65IixUb1NpZGU6IuWvuei+uSIsU3BlY2lmaWVkQXR0cmlidXRlc09ubHk6IuS7heeci+aMh+WumuWxnuaApyIsTnVtYmVyOiLmlbDlrZciLFByZXNzOiLplb/mjIkiLFRvT3JpZ2luYWxTdGVwOiLku4Xljp/lm74iLEhvcml6b250YWxPclZlcnRpY2FsOiLmoIfmsLTlubMv5Z6C55u057q/IixBbm5vdGF0ZUludmFsaWRMaW5lOiLmoIfml6DmlYjnur8iLEFubm90YXRlTGluZToi5qCH57q/IixTZWxlY3RMaW5lOiLpgInkuK3nur8iLFRvZ2dsZUxpbmVFZmZlY3RpdmVuZXNzOiLliIfmjaLnur/mmK/lkKbmnInmlYgiLERlbGV0ZUxpbmU6IuWIoOmZpOe6vyIsQ29udGludWVUb0xhYmVsOiLnu63moIciLFNlbGVjdDoi6YCJ5LitIixJbnNlcnRQb2ludDoi5o+S5YWl54K5IixDbGlja09uTGluZToi5a+557q/5Y2V5Ye7IixEZWxldGVQb2ludDoi5Yig6Zmk54K5IixEYmxDbGlja09uUG9pbnQ6IuWvueeCueWPjOWHuyIsU3RvcEFkc29ycHRpb246IuaaguWBnOWQuOmZhCIsUHJldmlvdXNMaW5lOiLkuIrmnaHnur8iLE5leHRMaW5lOiLkuIvmnaHnur8iLFNlbGVjdFBvaW50OiLpgInkuK3ngrkiLEFubm90YXRlSW52YWxpZFBvaW50OiLmoIfml6DmlYjngrkiLEFubm90YXRlUG9pbnQ6Iuagh+eCuSIsQW5ub3RhdGVQb2x5Z29uOiLmoIflpJrovrnlvaIiLFNlbGVjdFBvbHlnb246IumAieS4reWkmui+ueW9oiIsQW5ub3RhdGVJbnZhbGlkUG9seWdvbjoi5qCH5peg5pWI5aSa6L655b2iIixUb2dnbGVQb2x5Z29uRWZmZWN0aXZlbmVzczoi5YiH5o2i5aSa6L655b2i5piv5ZCm5pyJ5pWIIixEZWxldGVQb2x5Z29uOiLliKDpmaTlpJrovrnlvaIiLERlbGV0ZToi5Yig6ZmkIixUb2dnbGVQb2ludFBhcnRpY3VsYXJpdHk6IuaNoueJueauiueCuSIsQ3JvcE92ZXJsYXBBcmVhOiLoo4Hliarph43lj6DljLrln58iLFNlZ21lbnRhdGlvblJlY29nbml0aW9uOiLliIblibLovoXliqkiLFN3aXRjaFBhdHRlcm46IuWIh+aNoue7mOWItuW9ouW8jyIsVGFnZ2luZzoi5omT5qCH562+IixIaWRlOiLmiZPmoIfnrb4iLFRhZ2dpbmdPckF0dHI6IuaJk+agh+etvi/lsZ7mgKciLEhpZGVEcmF3bkFubm90YXRpb246Iuagh+azqOmakOiXj+S4rSIsQmx1ZToi6JOdIixDeWFuOiLpnZIiLEdyZWVuOiLnu78iLFllbGxvdzoi6buEIixQaW5rOiLnsokiLFN0ZXBzOiLmoIfms6jmraXpqqQiLEV4cG9ydDoi5a+85Ye6IixOZXh0U3RlcDoi5LiL5LiA5q2lIixTdGVwTm90RmluaXNoZWROb3RpZnk6IuW9k+WJjeatpemqpOWtmOWcqOS4uuacquagh+azqOi/h+eahOWbvueJh++8jOivt+agh+azqOWujOaIkOWGjeeCueWHu+S4i+S4gOatpSIsY3VySXRlbXM6IuesrHt7Y3VycmVudH19L3t7dG90YWx9feWIhumhtSIsVHVyblBhZ2U6Iue/u+mhtSIsU3dpdGNoOiLliIfmjaIiLEVtcHR5VGV4dElucHV0OiLmuIXnqbrmlofmnKzovpPlhaUiLFJlZ3VsYXJFeHBJbmNvcnJlY3RseToi5q2j5YiZ6KGo6L6+5byP5aGr5YaZ6ZSZ6K+vIixOb0NvbmZpZ3VyYXRpb246IuaaguaXoOS/oeaBr+mFjee9riIsQ2xlYXJUaGlzT3B0aW9uOiLmuIXnqbrmraTpgInpobkiLFJlc3RvcmVJbWFnZUF0dHJpYnV0ZXM6Iui/mOWOn+WbvueJh+WxnuaApyIsQ29uZmlybVRvOiLnoa7orqQiLHJlY3RUb29sOiLmoIfnrb4iLHRhZ1Rvb2w6Iuagh+eCuSIscG9seWdvblRvb2w6IuWkmui+ueW9oiIsbGluZVRvb2w6Iue6v+adoSIscG9pbnRUb29sOiLmoIfngrkiLHRleHRUb29sOiLmlofmnKwiLFNwZWVkOiLlgI3pgJ8iLFBsYXlQYXVzZToi5pKt5pS+L+aaguWBnCIsRmFzdEZvcndhcmQ6IuW/q+i/myIsUmV3aW5kOiLlv6vpgIAiLHZpZGVvSW52YWxpZEFuZFNraXA6IuaXoOaViOinhumike+8jOivt+i3s+i/hyIsaW1hZ2VJbnZhbGlkQW5kU2tpcDoi5peg5pWI5Zu+54mH77yM6K+36Lez6L+HIix2aWRlb0Vycm9yQW5kUmVsb2FkOiLop4bpopHliqDovb3lpLHotKUsIOivt+mHjeaWsOWKoOi9vSIsaW1hZ2VFcnJvckFuZFJlbG9hZDoi5Zu+54mH5Yqg6L295aSx6LSlLCDor7fph43mlrDliqDovb0iLG9yTWFza0FzSW52YWxpZDoiIOaIliDlsIblhbbmoIfkuLrml6DmlYgiLENsaWNrQW5vdGhlclBvbHlnb246Iuivt+eCueWHu+W4jOacm+WQiOW5tueahOWkmui+ueW9oiIsUG9seWdvbnNUb0JlQ29tYmluZWROZWVkVG9CZVNlbGVjdGVkOiLpnIDopoHpgInkuK3pnIDopoHlkIjlubbnmoTlpJrovrnlvaIiLEN1cnZlTW9kZURvZXNOb3RTdXBwb3J0Q3V0dGluZzoi5puy57q/5qih5byP5pqC5LiN5pSv5oyB6KOB5YmqIixDb21iaW5lU3VjY2Vzczoi5ZCI5bm25oiQ5YqfIixDb21iaW5pbmdGYWlsZWROb3RpZnk6IuWQiOW5tuWksei0pe+8jOivt+ajgOafpeaYr+WQpuS4pOS4quWkmui+ueW9ouaYr+WQpuacieebuOS6pO+8jOaIluWkmui+ueW9ouWQiOW5tuaYr+WQpuW9ouaIkOa8j+epuiIsQ29tYmluZU92ZXJsYXBBcmVhOiLlkIjlubbph43lj6DljLrln58iLE5vRGVwZW5kZW5jeToi6K+l5Zu+54mH5peg6ZyA5qCH5rOoIixUZXh0Q2hlY2tOdW1iZXJPbmx5OiLor7fmjInku4XmlbDlrZfnmoTmoLzlvI/ovpPlhaUiLFRleHRDaGVja0VuZ2xpc2hPbmx5OiLor7fmjInku4Xoi7HmlofnmoTmoLzlvI/ovpPlhaUiLFRleHRDaGVja0N1c3RvbUZvcm1hdDoi6K+35oyJ6KaB5rGC55qE5qC85byP6L6T5YWlIixGcmFtaW5nT2ZPYmplY3RUb0JlRGl2aWRlZDoi6K+35YWI5qGG5Ye66ZyA5YiG5Ymy55qE54mp5L2TIixDbGlja09uVGFyZ2V0OiLor7fljZXlh7vnm67moIfniankvZMiLFNwbGl0dGluZ0FsZ29yaXRobVByZWRpY3Rpb246IuWIhuWJsueul+azlemihOa1i+S4rS4uLiIsIjJEVmlldyI6IjJE6KeG5Zu+IiwiM0RWaWV3IjoiM0Top4blm74iLFRvcFZpZXc6IuS/r+inhuWbviIsU2lkZVZpZXc6IuS+p+inhuWbviIsQmFja1ZpZXc6IuiDjOinhuWbviIsU2hvd0Fycm93czoi5pi+56S6566t5aS0IixMZW5ndGg6IumVvyIsV2lkdGg6IuWuvSIsSGVpZ2h0OiLpq5giLFJvdGF0aW9uX3k6IuacneWQkeinkiIsUG9pbnRDb3VudDoi54K55pWwIixJbnZhbGlkOiLml6DmlYgiLFRhZzoi5qCH562+IixTZWFyY2hUYWc6IuaQnOe0ouagh+etviIsU3ViQXR0cmlidXRlOiLlia/lsZ7mgKciLFBsZWFzZVNlbGVjdDoi6K+36YCJ5oupIixDb3B5RW1wdHlJblBvaW50Q2xvdWQ6IuWkjeWItuWGheWuueS4uuepuu+8jOivt+mAieaLqeWvueW6lOeahOeCueS6keaVsOaNriIsUGFzdGVFbXB0eUluUG9pbnRDbG91ZDoi6K+35YWI5aSN5Yi26ZyA6KaB55qE54K55LqR5pWw5o2u5YaN6L+b6KGM57KY6LS0IixIYXNEdXBsaWNhdGVJRDoi5a2Y5Zyo6YeN5aSNSUQs5aSN5Yi25aSx6LSlIixIYXNEdXBsaWNhdGVJREhlYWRlcjoi5a2Y5Zyo5qCH5rOo5qGGIElEIOmHjeWkjSIsSGFzRHVwbGljYXRlSURNc2c6IuWtmOWcqOagh+azqOahhiBJRCDph43lpI3nmoTpl67popjvvIzmmK/lkKbopoHopobnm5Y/IixDb3B5U3VjY2Vzczoi5aSN5Yi25oiQ5Yqf77yBIixMb3dlckxpbWl0UG9pbnRzTnVtSW5Cb3g6IuahhuS9k+WGheeCueaVsOS4jeWFgeiuuOS9juS6jiB7e251bX19IOS4qiIsUG9pbnRUaGlja25lc3M6IueCueeahOaYvuekuueyl+e7hiIsUm90YXRlQXJvdW5kQ2VudGVyUG9pbnQ6Iue7leS4reW/g+eCueaXi+i9rOeUu+mdoiIsUG9pbnRDbG91ZFZpZXdUcmFuc2xhdGU6IueCueS6keW5s+enuyIsVG9wVmlld1RyYW5zbGF0ZToi5L+v6KeG5Zu+5bmz56e7IixDaGFuZ2VQb2ludENsb3VkVmFsaWQ6IuWIh+aNoueCueS6keacieaViOaApyIsTGFzc29TZWxlY3Rvcjoi5aWX57SiIixSZWN0U2VsZWN0b3I6IuaLieahhiIsU2VsZWN0b3JNc2c6IuWPs+mUruaLluWKqOi/m+ihjOiMg+WbtOiOt+WPliIsQWRkUG9pbnQ6Iua3u+WKoOeCuSIsQ2lyY2xlU2VsZWN0b3I6IumAieeCuSIsRGV0ZWN0aW9uTW9kZToi5qOA5rWL5qih5byPIixTZWdtZW50YXRpb25Nb2RlOiLliIblibLmqKHlvI8iLEVudGVyRWRpdE1vZGU6Iui/m+WFpee8lui+kSIsU2VsZWN0ZWRQb2ludHM6IumAieS4reeCueaVsCIsQ29weUJveDoi5aSN5Yi25qGGIixQYXN0ZUJveDoi57KY6LS05qGGIixSb3RhdGVMZWZ0OiLlkJHlt6bml4vovazlvq7osIMiLFJvdGF0ZVJpZ2h0OiLlkJHlj7Pml4vovazlvq7osIMiLFByZXZpb3VzQm94OiLkuIrkuIDmoYYiLE5leHRCb3g6IuS4i+S4gOahhiIsUm90YXRlOTA6IuaXi+i9rDkwwrAiLENvcHlQcmV2UGFnZToi5aSN5Yi25LiK5LiA6aG1IixDaGFuZ2VCb3hWYWxpZDoi5YiH5o2i5qCH5rOo5qGG5pyJ5pWI5oCnIixNdWx0aVNlbGVjdDoi5aSa6YCJIixTZWxlY3RBbGxCb3g6IuWFqOmAiSIsR2VuZXJhbE9wZXJhdGlvbjoi6YCa55SoIixSZWN0UGF0dGVybjoi5ouJ5qGG5qih5byPIixQb2x5Z29uUGF0dGVybjoi5aSa6L655b2i5qih5byPIixDaGFuZ2VQYXR0ZXJuTXNnOiLmiJDlip/mm7TmlLnkuLp7e3BhdHRlcm59feaooeW8jyIsRHJhZ09wZXJhdGlvbjoi5ouW5YqoIixTZWxlY3RlZFN0YXR1czoi6YCJ5Lit5pe2Iix1cGRhdGVWYWxpZEZyb21WYWxpZFRvSW5WYWxpZDoi5piv5ZCm56Gu6K6k5qCH5Li65peg5pWI5paH5Lu277yfIix1cGRhdGVWYWxpZEZyb21JblZhbGlkVG9WYWxpZDoi5piv5ZCm56Gu6K6k5Y+W5raI5peg5pWI5paH5Lu277yfIixBbGxUcmFja0lEczoi5omA5pyJ5bey5qCH5rOo55qE5qGGSUQiLEN1cnJlbnRCb3hUcmFja0lEczoi5b2T5YmN5qCH5rOo5qGGSUQiLFBvc2l0aXZlSW50ZWdlckNoZWNrOiLor7fovpPlhaXmraPmlbTmlbAiLE5vdEFsbG93RGVjaW1hbFBvaW50c0luVHJhY2tJRDoi6L6T5YWldHJhY2tJROS4jeWFgeiuuOWMheWQq+Wwj+aVsOeCuSIsRHVwbGljYXRlVHJhY2tJRHNFeGlzdDoi5a2Y5Zyo6YeN5aSN55qEdHJhY2tJRCIsQmF0Y2hVcGRhdGVUZXh0OiLmibnph4/kv67mlLkiLEJhdGNoVXBkYXRlVHJhY2tJRDoi5om56YeP5L+u5pS5SUQiLFRyYWNrSURVbmlmeUFzOiLnu5/kuIDmoIfms6jmoYZJROS4uiIsVW5pZnlUcmFja0lEUmFuZ2U6Iue7n+S4gElE6IyD5Zu0IixQYWdlOiLpobUiLE9rVGV4dDoi56Gu6K6kIixDYW5jZWxUZXh0OiLlj5bmtogiLFVuaWZ5UGFyYW1zOiLnu5/kuIDlj4LmlbAiLFVuaWZ5QXR0cmlidXRlUmFuZ2U6Iue7n+S4gOWxnuaAp+iMg+WbtCIsVW5pZnlQYXJhbXNUaXBzOiLpnZ7lvZPliY3pobXlm77niYfph4znmoQyROahhuWwuuWvuOaaguaXtuS4jeWBmue7n+S4gCIsVW5pZnlUcmFja0lEOiLnu5/kuIDmoIfms6jmoYZJRCIsVW5pZnlTaXplOiLnu5/kuIDlsLrlr7giLFVuaWZ5VGFnOiLnu5/kuIDmoIfnrb4iLE5vRGF0YToi5pqC5peg5pWw5o2uIixBbm5vdGF0ZWRMaXN0OiLmoIfms6jliJfooagiLG9uRGVsZXRlR3JhcGhCeUF0dHI6IuehruWumuimgeWIoOmZpOWxnuaAp+S4uiB7e2F0dHJpYnV0ZX19IOeahOagh+azqOaVsOaNruWQlz8iLENhbmNlbEZpeGVkOiLlj5bmtojlm7rlrpoiLEZpeGVkT25MZWZ0OiLlm7rlrprlnKjlt6bkvqciLEZpeGVkT25SaWdodDoi5Zu65a6a5Zyo5Y+z5L6nIixBbm5vdGF0ZWRSZXN1bHQ6Iuagh+azqOe7k+aenCIsQ29tcGxlbWVudGFyeVRyYWNraW5nOiLooaXlhajot5/ouKoiLENvbXBsZW1lbnRhcnlUcmFja2luZ1ByZWRpY3Rpb246IuihpeWFqOi3n+i4qumihOa1iyIsQXBwbHk6IuW6lOeUqCIsQmVmb3JlUHJlZGljdFN0YXJ0aW5nOiLlkK/liqjliY3vvIzor7flhYjmoIflh7rpppblsL7nmoTmoYbvvIzpnIDlkIzluo/lj7ciLFRoZVByZWRpY3RlZFBvaW50Q2xvdWQ6IueOsOmihOa1i+eCueS6kemcgOimgeWwj+S6jiAxMCDluKciLENhbWVyYUZvbGxvd1RvcFZpZXc6IuaMieS/r+inhuWbvuWumuS9jSIsTWFya09ubHlPbmU6IuS7heagh+azqOS4gOW4p+aVsOaNru+8jOmcgOagh+WHuummluWwvueahOW4p+aVsOaNriIsSGF2ZU5vTmVlZDoi5Lik5bin5LmL6Ze05pqC5peg6ZyA6aKE5rWL55qE5pWw5o2u77yM6K+35YWI5qCH5Ye66aaW5bC+55qE5qGG77yM6ZyA5ZCM5bqP5Y+3IixQcmVkaWN0aW5nRGF0YUZyb206Iuato+WcqOmihOa1i+esrCB7e3N0YXJ0UGFnZX19IOmhteWIsOesrCB7e2VuZFBhZ2V9fSDpobXkuYvpl7TmoYZJROS4uiB7e3NlbGVjdGVkQm94VHJhY2tJRH19IOeahOaVsOaNriIsUG9pbnRDbG91ZENvdmVyTW9kZToi6YCJ5Lit55u45ZCM54K55LqR5pe277yM5ZCO5LiA5qCH6K6w6KaG55uW5YmN5LiA5qCH6K6wIixQb2ludENsb3VkVW5jb3Zlck1vZGU6IumAieS4reebuOWQjOeCueS6keaXtu+8jOWQjuS4gOagh+iusOS4jeWPr+imhuebluWJjeS4gOagh+iusCIsUG9pbnRDbG91ZEZvY3VzTW9kZToi5bey5byA5ZCv6IGa54Sm5qih5byPIixQb2ludENsb3VkVW5mb2N1c01vZGU6IuW3suWFs+mXreiBmueEpuaooeW8jyIsUG9pbnRDbG91ZEhpZGVTZWdtZW50OiLlt7LpmpDol4/moIfms6jngrnkupEiLFBvaW50Q2xvdWRTaG93U2VnbWVudDoi5bey5pi+56S65YWo6YOo54K55LqRIixQb2ludENsb3VkSGlkZVNlZ21lbnRJbnZhbGlkOiLpmpDol4/lt7LmoIfms6jkuI3lj6/nlKjvvIzor7flhYjlhbPpl63ogZrnhKYiLFBvaW50Q2xvdWRIaWRlRm9jdXNJbnZhbGlkX2hpZGU6IuiBmueEpuS4jeWPr+eUqO+8jOivt+WFiOWFs+mXreKAnOmakOiXj+W3suagh+azqOKAnSIsUG9pbnRDbG91ZEhpZGVGb2N1c0ludmFsaWRfbm9uZToi6IGa54Sm5LiN5Y+v55So77yM6K+35YWI6YCJ5oup6ZyA6KaB6IGa54Sm55qE5qCH6K6wIixQYWxldHRlOiLosIPoibLnm5giLEVmZmljaWVudExpc3RlbmluZzoi6K+l5Lu75Yqh5qCH5rOo5pWI546H55uR5o6n5LitLi4uIixUaXRsZToi6aKY55uuIixBbnN3ZXI6IuWbnuetlCIsRmluaXNoZWQ6IuW3suWujOaIkCIsVW5maW5pc2hlZDoi5pyq5a6M5oiQIixPdmVyYWxsU2NvcmU6IuaVtOS9k+ivhOWIhiIsTm9TY29yaW5nU2NhbGU6IuWPr+WcqOW3puS+p+mFjee9ruatpemqpOivpuaDhSIsQmVzdDoi5pyA5aW9IixXb3JzdDoi5pyA5beuIixSYW5raW5nUXVhbGl0eU9mQW5zd2Vyczoi6K+35a+55q+P5Liq5Zue562U55qE6LSo6YeP6L+b6KGM5o6S5bqPIixUb0JlU29ydGVkOiLlvoXmjpLluo8iLFllczoi5pivIixObzoi5ZCmIixBZGRpdGlvbmFsQ29udGVudDoi77yI6YCJ5aGr77yJ6K+35aGr5YaZ5Lu75L2V5L2g5a+5562U5qGI55qE6K+E5Lu35oiW5YW25LuW6KGl5YWF5YaF5a65IixTdWJtaXQ6IuaPkOS6pCIsRHJhZ0FuZERyb3A6IuaMieS9j+aLluWKqCIsRGVmYXVsdFNpemU6IueCueWHu+Wbvuagh+S7peS9v+eUqOm7mOiupOWwuuWvuCIsTm9ybWFsU2l6ZVJhbmdlOiLmraPluLjlsLrlr7jojIPlm7QiLE5vcm1hbENlbnRlclBvaW50UmFuZ2U6Iuato+W4uOS4reW/g+eCueiMg+WbtCIsTG9hZGluZ1RpcHM6IuaVsOaNruWKoOi9veS4rX7or7fnqI3lkI4iLFVubG9ja2VkOiLmnKrlvIDlkK8iLExvY2tlZDoi5bey5byA5ZCvIixMZWFzdENoYXJhY3RlckVycm9yOiLor7foh7PlsJHovpPlhaV7e251bX195Liq5a2X56ymIixBbmQ6IuS4lCIsT3I6IuaIliIsSW1hZ2VMYWJlbHM6IuWbvueJh+agh+azqOeJqSIsIjNEUmVjdCI6IjNEIOahhiIsIjJEUmVjdCI6IjJEIOahhiIsQWRkUG9pbnRzOiLlop7liqAiLFJlbW92ZVBvaW50czoi5Yig5YePIixSZXNldDoi6YeN572uIixQbGVhc2VGcmFtZVRoZU9iamVjdFRvQmVEaXZpZGVkRmlyc3Q6Iuivt+WFiOahhuWHuumcgOWIhuWJsueahOeJqeS9kyIsQ2xpY2tPblRoZVRhcmdldE9iamVjdFRvU3BsaXRJdDoi5Y2V5Ye755uu5qCH54mp5L2T6L+b6KGM5YiG5YmyIixDbGlja1RoZVRhcmdldE9iamVjdEFnYWluVG9JbmNyZWFzZVRoZVNlZ21lbnRhdGlvbjoi5YaN5qyh5Y2V5Ye755uu5qCH54mp5L2T5aKe5Yqg5YiG5YmyIixDbGlja09uVGhlVGFyZ2V0T2JqZWN0VG9EZWxldGVUaGVTZWdtZW50YXRpb246IuWNleWHu+ebruagh+eJqeS9k+WIoOWHj+WIhuWJsiIsQ2xpY2tBZ2Fpbk9uVGhlVGFyZ2V0T2JqZWN0VG9EZWxldGVUaGVTZWdtZW50YXRpb246IuWGjeasoeWNleWHu+ebruagh+eJqeS9k+WIoOWHj+WIhuWJsiIsQW5zd2Vyc0FyZUJlaW5nR2VuZXJhdGVkOiLlm57nrZTnlJ/miJDkuK0iLEFuc3dlckdlbmVyYXRpb25GYWlsZWRQbGVhc2VUcnlBZ2FpbkxhdGVyOiLlm57nrZTnlJ/miJDlpLHotKXvvIzor7fnqI3lkI7ph43or5UiLFJlR2VuZXJhdGU6IumHjeaWsOeUn+aIkCIsQW5zd2VyVGV4dEVkaXQ6IuWbnuetlOaWh+acrOe8lui+kSIsU2hvd0VkaXRpbmdSZXN1bHREaWZmZXJlbmNlc0luVGV4dE1vZGVPbmx5OiLku4XmlofmnKzmqKHlvI/kuIvmmL7npLrnvJbovpHnu5Pmnpzlt67lvIIiLEF0dHJpYnV0ZUxvY2tOb3RpZnk6Iuafpeeci+WxnuaAp++8mnt7bGFiZWx9fe+8jOWPquaYvuekuuaJgOmAieWxnuaAp+eahOagh+azqOWGheWuuSIsQXVkaW9TZWdtZW50VGlwOiLor7fpgInmi6nluIzmnJvmiKrlj5bnmoTml7bpl7TngrnvvIh7e3RpbWV9fe+8iSIsQXVkaW9Db21iaW5lVGlwOiLor7fngrnlh7vluIzmnJvlkIjlubbnmoTljLrpl7QiLENsaXBwZWRBdWRpbzoi5bey5oiq5Y+W6Z+z6aKRIixOb0NsaXBwZWREYXRhOiLmmoLml6DmiKrlj5blhoXlrrkiLENvbXBhcmVUYWdzOiLmoIfnrb7lr7nnhafmmL7npLoiLENvbWJpbmVBdWRpbzoi5ZCI5bm25Yy66Ze0IixDbGlwQXVkaW86IuWIhuWJsuWMuumXtCIsU3dpdGNoQ2xpcE1vZGU6IuWIh+aNouaIquWPluaooeW8jyIsU3dpdGNoVGFnTW9kZToi5YiH5o2i5qCH562+5qih5byPIixDbGlwOiLmiKrlj5YiLFByZXZpb3VzSW50ZXJ2YWw6IuS4iuS4gOWMuumXtCIsTmV4dEludGVydmFsOiLkuIvkuIDljLrpl7QiLERlbGV0ZUNvbW1lbnQ6IuWIoOmZpOaJueazqCIsRGVsZXRlQ29tbWVudENvbmZpcm06IuehruWumuWIoOmZpOivpeadoeagh+azqOWQlyIsUHJldmlvdXNDb21tZW50OiLkuIrkuIDmnaHmibnms6giLE5leHRDb21tZW50OiLkuIvkuIDmnaHmibnms6giLENsaXBTZWxlY3Q6IuaIquWPlumAieS4rSIsIkZvcndhcmQwLjEiOiLliY3ov5swLjFzIiwiQmFjazAuMSI6IuWQjumAgDAuMXMiLExlZnRDbGljazoi5bem5Ye7IixTY3JpYmJsZToi5raC5oq5IixFcmFzZToi5pOm6ZmkIixTY3JpYmJsZUxpbmU6Iua2guaKue+8iOi/nue6v++8iSIsU3Ryb2tlRW5sYXJnZToi56yU6Kem5pS+5aSnIixTdHJva2VSZWR1Y3Rpb246IueslOinpue8qeWwjyIsdG9nZ2xlU2hvd1RleHQ6IuaWh+acrOWvueeFp+aYvuekuiIsQ2xpcFNsaWNlOiLmiKrlj5bniYfmrrUiLFRpbWVTdGFtcDoi5qCH5pe26Ze054K5IixDbGlwVGltZToi5oiq5Y+W5pe26Ze0IixTdGFtcFRpbWU6IuaXtumXtOeCueaXtumXtCIsR2V0U3RhcnRUaW1lOiLojrflj5blvIDlp4vml7bpl7QiLEdldEVuZFRpbWU6IuiOt+WPlue7k+adn+aXtumXtCIsT3V0cHV0RGlzcGxheToi6L6T5Ye65bGV56S6IixNYXhpbXVtQ2hhcmFjdGVyRXJyb3I6IuWtl+espuaVsOS4jeiDvei2hei/h3t7bnVtfX0iLENvbW1vblN5bWJvbHM6IuW4uOeUqOespuWPtyIsQmluYXJ5T3BlcmF0aW9uczoi5LqM5YWD6L+Q566X56ymIixCaW5hcnlSZWxhdGlvbnM6IuS6jOWFg+WFs+ezu+espiIsQXJyb3dzOiLnrq3lpLTnrKblj7ciLE90aGVyczoi5YW25LuW56ym5Y+3IixHcmVlazoi5biM6IWK5a2X5q+NIixMb3dlcmNhc2U6IuWwj+WGmSIsVXBwZXJjYXNlOiLlpKflhpkiLEFkdmFuY2VkTWF0aGVtYXRpY3M6IumrmOetieaVsOWtpiIsRnJhY3Rpb25hbERpZmZlcmVudGlhdGlvbjoi5YiG5pWw5b6u5YiGIixGcmFjdGlvbjoi5YiG5pWwIixEZXJpdmF0aXZlOiLlr7zmlbAiLE1vZHVsYXJBcml0aG1ldGljOiLmqKHnrpfmnK8iLFJhZGljYWw6IuagueW8jyIsU3VwQW5kU3ViOiLkuIrkuIvmoIciLExpbWl0TG9nYXJpdGhtOiLmnoHpmZDlr7nmlbAiLExpbWl0czoi5p6B6ZmQIixMb2dhcml0aG1zQW5kRXhwb25lbnRzOiLlr7nmlbDmjIfmlbAiLEJvdW5kczoi55WM6ZmQIixJbnRlZ3JhbE9wZXJhdGlvbjoi56ev5YiG6L+Q566XIixJbnRlZ3JhbDoi56ev5YiGIixEb3VibGVJbnRlZ3JhbDoi5Y+M6YeN56ev5YiGIixUcmlwbGVJbnRlZ3JhbDoi5LiJ6YeN56ev5YiGIixMYXJnZU9wZXJhdGlvbnM6IuWkp+Wei+i/kOeulyIsUHJvZHVjdHNBbmRDb3Byb2R1Y3RzOiLkuZjnp6/kvZnnp68iLEludGVyc2VjdGlvbkFuZFVuaW9uOiLkuqTpm4blubbpm4YiLExpbmVhckFsZ2VicmE6Iue6v+aAp+S7o+aVsCIsQnJhY2tldEZvcmVuc2ljczoi5ous5Y+35Y+W6K+BIixCcmFja2V0OiLmi6zlj7ciLENvbW1vbjoi5bi455SoIixBcnJheU1hdHJpeDoi5pWw57uE55+p6Zi1IixUcmlnb25vbWV0cmljRnVuY3Rpb25zOiLkuInop5Llh73mlbAiLEludmVyc2VUcmlnb25vbWV0cmljRnVuY3Rpb25zOiLlj43kuInop5Llh73mlbAiLEh5cGVyYmxpY0Z1bmN0aW9uczoi5Y+M5puy5Ye95pWwIixJbnZlcnNlSHlwZXJibGljRnVuY3Rpb25zOiLlj43lj4zmm7Llh73mlbAiLEZvcm11bGFUZW1wbGF0ZToi5YWs5byP5qih5p2/IixBbGdlYnJhOiLku6PmlbAiLEdlb21ldHJ5OiLlh6DkvZUiLEluZXF1YWxpdHk6IuS4jeetieW8jyIsTWF0cml4OiLnn6npmLUiLFRyaWFuZ2xlOiLkuInop5IiLFN0YXRpc3RpY3M6Iue7n+iuoSIsU2VxdWVuY2U6IuaVsOWIlyIsUGh5c2ljczoi54mp55CGIixJbmRpY2F0b3JKdWRnbWVudDoi5oyH5qCH5Yik5patIixPbmx5Q3VycmVudEZyYW1lOiLlj6rnnIvlvZPliY3luKciLENsaWNrT25UaGVJZFRvSGlnaGxpZ2h0VGhlTWFya3VwQm94OiLngrnlh7tJROWPr+S7pemrmOS6ruagh+azqOahhiIsRG91YmxlQ2xpY2tPblRoZUlkVG9Db250aW51b3VzbHlIaWdobGlnaHRCb3hlc0Fjcm9zc0ZyYW1lczoi5Y+M5Ye7SUTlj6/ku6Xot6jluKfov57nu63pq5jkuq7moIfms6jmoYYiLEZpbmRUaGVGcmFtZUNvcnJlc3BvbmRpbmdUb1RoZUxhYmVsZWRGcmFtZUlkOiLmn6Xmib7moIfms6jmoYZJROWvueW6lOW4pyIsR2xvYmFsQW5ub3RhdGlvbjoi5YWo5bGA5qCH5rOoIixRdWFsaWZpZWRBbm5vdGF0aW9uOiLpmZDlrprmoIfms6giLEludmFsaWRRdWVzdGlvbkFuZFNraXA6IuaXoOaViOmimOebru+8jOivt+i3s+i/h+atpOmimCIsUHJvamVjdGlvbkZyYW1lQ2Fubm90QmVEZWxldGVkOiLmipXlsITmoYbml6Dms5XliKDpmaQiLEZhaWxlZFRvQ29weVJlc3VsdHM6IuWkjeWItue7k+aenOWksei0pSIsUGFydGlhbFJlc3VsdHNSZXBsaWNhdGlvbkZhaWx1cmU6IumDqOWIhue7k+aenOWkjeWItuWksei0pSIsUm90YXRpb25BbmdsZVNlbnNpdGl2aXR5OiLml4vovazlvq7osIPop5LluqYiLCIyREltYWdlQmF0Y2giOiIyROWbvueJh+aJuemHjyIsIjJESW1hZ2VCYXRjaENvbm5lY3Rpb24iOiIyROWbvueJh+aJuemHj+i/nuaOpSIsIjJESW1hZ2VCYXRjaERpc2Nvbm5lY3Rpb24iOiIyROWbvueJh+aJuemHj+aWreW8gCIsQ29uZmlybVRvQmF0Y2hDb25uZWN0OiLnoa7orqTmibnph4/ov57mjqXvvJ8iLENvbmZpcm1Ub0JhdGNoRGlzY29ubmVjdDoi56Gu6K6k5om56YeP5pat5byA77yfIixDb25uZWN0OiLov57mjqUiLERpc2Nvbm5lY3Q6IuaWreW8gCIsSW1hZ2UyREJveFNjYWxlOiLlm77niYcyROahhuS9k+e8qeWwj+WkhOeQhiIsU2VsZWN0ZWRSZWN0OiLpgInkuK3moYbkvZMiLE9ubHlMb2FkVGhlRmlyc3RGcmFtZVByZUFubm90YXRpb246IuS7hei9veWFpeesrOS4gOW4p+mihOagh+azqCIsU2VsZWN0Qm94VG9EaXNwbGF5SW5kZXBlbmRlbnRseToi6YCJ5Lit5qGG54us56uL5pi+56S6IixTZWxlY3RCb3hTd2l0Y2hUaXBzOiLlvIDlkK/lvIDlhbPlkI7vvIzpgInkuK3kv6/op4blm77nmoTmoYbkvZPvvIzlm77niYfop4blm77ku4XmmL7npLrlr7nlupTnmoQyRC8zROahhuS9k++8jOS+v+S6juafpeeci+S/r+inhuWbvueahOWvueW6lOWFs+ezuyIsU29ydENvbnZlcnNhdGlvblF1YWxpdHk6Iuivt+Wvueavj+e7hOWvueivneeahOi0qOmHj+i/m+ihjOaOkuW6jyIsRGlhbG9nOiLlr7nor50iLFNlbGVjdGlvbk9mQW5ub3RhdGlvbjoi6YCJ5Lit5qCH5rOoIixBbm5vdGF0aW5nOiLmraPlnKjmoIfms6giLEdyb3VwOiLnu4QiLFRoZURyYXdGcmFtZVNpemVJc1NtYWxsZXJUaGFuVGhlTWluaW11bURyYXdTaXplSW5UaGVTdGVwQ29uZmlndXJhdGlvbjoi57uY5Yi25qGG5bC65a+45bCP5LqO5q2l6aqk6YWN572u6YeM55qE5pyA5bCP57uY5Yi25bC65a+4IixUaGVTaXplT2ZUaGVEcmF3aW5nQm94SXNTbWFsbGVyVGhhblRoZU1pbmltdW1EcmF3aW5nU2l6ZUluVGhlTWFpblByb3BlcnR5Q29uZmlndXJhdGlvbjoi57uY5Yi25qGG5bC65a+45bCP5LqO5Li75bGe5oCn6YWN572u6YeM55qE5pyA5bCP57uY5Yi25bC65a+4In07ZnQubGFuZ3VhZ2V8fGZ0LmluaXQoe2xuZzoiZW4iLGludGVycG9sYXRpb246e2VzY2FwZVZhbHVlOiExfX0pLGZ0LmFkZFJlc291cmNlQnVuZGxlKCJlbiIsInRyYW5zbGF0aW9uIixwdCwhMCksZnQuYWRkUmVzb3VyY2VCdW5kbGUoImNuIiwidHJhbnNsYXRpb24iLGR0LCEwKTtjb25zdCBndD17MDowLDE6LjIsMzouNCw1Oi42LDc6LjgsOToxLDEwOjF9LHl0PXswOjAsMTowLDM6LjIsNTouNCw3Oi42LDk6LjgsMTA6MX0sbXQ9Y2xhc3N7c3RhdGljIHJnYmFTdHJpbmdUb0hleCh0KXtjb25zdCBlPXQuc3Vic3RyaW5nKDUsdC5sZW5ndGgtMSkucmVwbGFjZSgvIC9nLCIiKS5zcGxpdCgiLCIpLG49cGFyc2VJbnQoZVswXSkscj1wYXJzZUludChlWzFdKSxpPXBhcnNlSW50KGVbMl0pLG89cGFyc2VGbG9hdChlWzNdKTtyZXR1cm4iIyIrbi50b1N0cmluZygxNikucGFkU3RhcnQoMiwiMCIpK3IudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIjAiKStpLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCIwIikrTWF0aC5yb3VuZCgyNTUqbykudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIjAiKX19O2xldCB2dD1tdDt2dC5yZXBsYWNlQUZyb21SR0JBPSh0LGUpPT50LnNwbGl0KCIgIikuam9pbigiIikucmVwbGFjZSgvLFswLTldKyhbLl17MX1bMC05XSspezAsMX1cKS8sYCwke2UudG9GaXhlZCgyKX0pYCksdnQudG9SR0JBQXJyPXQ9Pntjb25zdCBlPXQubWF0Y2goL1xkKy9nKTtpZihlKXtjb25zdFt0LG4scixpXT1lO3JldHVyblt0LG4scixpXX19LHZ0LmdldFRvb2xTdHJva2VBbmRGaWxsPSh0LGUpPT57Y29uc3R7aG92ZXI6bj0hMSxzZWxlY3RlZDpyPSExLGJvcmRlck9wYWNpdHk6aT0xLGZpbGxPcGFjaXR5Om89MSxjb21tb25PcGFjaXR5OnM9Ljh9PWU7cmV0dXJuIHJ8fG4/e3N0cm9rZTptdC5yZXBsYWNlQUZyb21SR0JBKHQsaSksZmlsbDptdC5yZXBsYWNlQUZyb21SR0JBKHQsbykscmdiYTptdC50b1JHQkFBcnIodCl9OntzdHJva2U6bXQucmVwbGFjZUFGcm9tUkdCQSh0LGkqcyksZmlsbDptdC5yZXBsYWNlQUZyb21SR0JBKHQsbypzKSxyZ2JhOm10LnRvUkdCQUFycih0KX19LHZ0LmdldFN0cm9rZUFuZEZpbGw9KHQsZT0xLG49MSk9Pih7c3Ryb2tlOm10LnJlcGxhY2VBRnJvbVJHQkEodCxlKSxmaWxsOm10LnJlcGxhY2VBRnJvbVJHQkEodCxuKX0pLHZ0LmdldFRvb2xDb2xvckxpc3Q9KHQsZT05LG49OSk9Pntjb25zdCByPWd0W2VdLGk9eXRbbl07cmV0dXJue3ZhbGlkOm10LmdldFN0cm9rZUFuZEZpbGwodCwxKnIsLjQqaSksaW52YWxpZDptdC5nZXRTdHJva2VBbmRGaWxsKEl0LDEqciwuOCppKSx2YWxpZFNlbGVjdGVkOm10LmdldFN0cm9rZUFuZEZpbGwodCwxKnIsLjgqaSksaW52YWxpZFNlbGVjdGVkOm10LmdldFN0cm9rZUFuZEZpbGwoSXQsMSpyLC4yNCppKSx2YWxpZEhvdmVyOm10LmdldFN0cm9rZUFuZEZpbGwodCwxKnIsLjY0KmkpLGludmFsaWRIb3ZlcjptdC5nZXRTdHJva2VBbmRGaWxsKEl0LDEqciwuNCppKX19LHZ0LmdldEF0dHJpYnV0ZUluZGV4PSh0LGUpPT57dHJ5e3JldHVybiBlLmZpbmRJbmRleCgoZT0+ZS52YWx1ZT09PXQpKX1jYXRjaCh0KXtyZXR1cm4tMX19O3ZhciBfdD1PYmplY3QuZGVmaW5lUHJvcGVydHkseHQ9T2JqZWN0LmRlZmluZVByb3BlcnRpZXMsd3Q9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMsYnQ9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyxEdD1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LEV0PU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUsQ3Q9KHQsZSxuKT0+ZSBpbiB0P190KHQsZSx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6bn0pOnRbZV09bjtjb25zdCBTdD1bInJnYmEoMTAyLCAxMTEsIDI1NSwgMSkiLCJyZ2JhKDEwMiwgMjMwLCAyNTUsIDEpIiwicmdiYSgxOTEsIDI1NSwgMTAyLCAxKSIsInJnYmEoMjU1LCAyMzAsIDEwMiwgMSkiLCJyZ2JhKDIzMCwgMTAyLCAyNTUsIDEpIl0sQXQ9WyJyZ2JhKDEyOCwgMTIsIDI0OSwgMSkiLCJyZ2JhKDAsIDI1NSwgNDgsIDEpIiwicmdiYSgyNTUsIDEzNiwgMjQ3LCAxKSIsInJnYmEoMjU1LCAyMjYsIDUwLCAxKSIsInJnYmEoMTUzLCA2NiwgMjMsIDEpIiwicmdiYSgyLCAxMzAsIDI1MCwgMSkiLCJyZ2JhKDI1NSwgMzUsIDM1LCAxKSIsInJnYmEoMCwgMjU1LCAyMzQsIDEpIl0sTnQ9W3tyZ2JhOiJyZ2JhKDEyOCwgMTIsIDI0OSwgMSkiLGhleDo4MzkxOTI5fSx7cmdiYToicmdiYSgwLCAyNTUsIDQ4LCAxKSIsaGV4OjY1MzI4fSx7cmdiYToicmdiYSgyNTUsIDEzNiwgMjQ3LCAxKSIsaGV4OjE2NzQ2NzQzfSx7cmdiYToicmdiYSgyNTUsIDIyNiwgNTAsIDEpIixoZXg6MTY3Njk1ODZ9LHtyZ2JhOiJyZ2JhKDE1MywgNjYsIDIzLCAxKSIsaGV4OjEwMDQzOTI3fSx7cmdiYToicmdiYSgyLCAxMzAsIDI1MCwgMSkiLGhleDoxNjQ2MDJ9LHtyZ2JhOiJyZ2JhKDI1NSwgMzUsIDM1LCAxKSIsaGV4OjE2NzIwNjc1fSx7cmdiYToicmdiYSgwLCAyNTUsIDIzNCwgMSkiLGhleDo2NTUxNH1dLEl0PSJyZ2JhKDI1NSwgMTUzLCAxMDIsIDEpIixNdD0icmdiYSgyMDQsIDIwNCwgMjA0LCAxKSI7IWZ1bmN0aW9uKCl7bGV0IHQ7Y29uc3QgZT1uZXcgQXJyYXkoMjU2KS5maWxsKCIiKS5tYXAoKHQ9Pm5ldyBBcnJheSgzKS5maWxsKCIiKSkpO2ZvcihsZXQgbj0wO248MjA7bisrKXtmb3IodD0wO3Q8MzI7dCsrKWVbdF1bMF09MTI4KzQqdCxlW3RdWzFdPTAsZVt0XVsyXT0wO2ZvcihlWzMyXVswXT0yNTUsZVszMl1bMV09MCxlWzMyXVsyXT0wLHQ9MDt0PDYzO3QrKyllWzMzK3RdWzBdPTI1NSxlWzMzK3RdWzFdPTQrNCp0LGVbMzMrdF1bMl09MDtmb3IoZVs5Nl1bMF09MjU0LGVbOTZdWzFdPTI1NSxlWzk2XVsyXT0yLHQ9MDt0PDYyO3QrKyllWzk3K3RdWzBdPTI1MC00KnQsZVs5Nyt0XVsxXT0yNTUsZVs5Nyt0XVsyXT02KzQqdDtmb3IoZVsxNTldWzBdPTEsZVsxNTldWzFdPTI1NSxlWzE1OV1bMl09MjU0LHQ9MDt0PDY0O3QrKyllWzE2MCt0XVswXT0wLGVbMTYwK3RdWzFdPTI1Mi00KnQsZVsxNjArdF1bMl09MjU1O2Zvcih0PTA7dDwzMjt0KyspZVsyMjQrdF1bMF09MCxlWzIyNCt0XVsxXT0wLGVbMjI0K3RdWzJdPTI1Mi00KnR9fSgpO3ZhciBGdD1uZXcgY2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLl9kZWZhdWx0Q29sb3JzPVN0LHRoaXMuX2F0dHJpYnV0ZUNvbG9ycz1BdH1nZXQgZGVmYXVsdENvbG9ycygpe3JldHVybiB0aGlzLl9kZWZhdWx0Q29sb3JzfWdldCBhdHRyaWJ1dGVDb2xvcnMoKXtyZXR1cm4gdGhpcy5fYXR0cmlidXRlQ29sb3JzfWdldENvbG9yRnJvbUNvbmZpZyh0LGUsbixyKXt2YXIgaSxvLHMsYSx1O2lmKCJbb2JqZWN0IE9iamVjdF0iIT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpKXRocm93IkNvbmZpZyBtdXN0IGJlIE9iamVjdCI7aWYoIltvYmplY3QgT2JqZWN0XSIhPT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCkpdGhyb3ciUmVzdWx0IG11c3QgYmUgT2JqZWN0Ijtjb25zdHtib3JkZXJPcGFjaXR5OmM9MSxmaWxsT3BhY2l0eTpsPS42LGNvbG9ySW5kZXg6aD0wfT1uO3J8fChyPXt9KTtjb25zdCBmPW51bGw9PShpPW51bGw9PXQ/dm9pZCAwOnQudmFsaWQpfHxpLHttdWx0aUNvbG9ySW5kZXg6cD0tMSxzZWxlY3RlZDpkLGhvdmVyOmd9PXIseT17c2VsZWN0ZWQ6ZCxob3ZlcjpnLGJvcmRlck9wYWNpdHk6YyxmaWxsT3BhY2l0eTpsfTtsZXQgbT10aGlzLmRlZmF1bHRDb2xvcnM7aWYoKCEwPT09KG51bGw9PWU/dm9pZCAwOmUuYXR0cmlidXRlQ29uZmlndXJhYmxlKXx8cD4tMSkmJihtPXRoaXMuYXR0cmlidXRlQ29sb3JzKSwhMT09PWYpcmV0dXJuIHZ0LmdldFRvb2xTdHJva2VBbmRGaWxsKEl0LHkpO2lmKCEwPT09KG51bGw9PWU/dm9pZCAwOmUuYXR0cmlidXRlQ29uZmlndXJhYmxlKSl7Y29uc3Qgbj12dC5nZXRBdHRyaWJ1dGVJbmRleChudWxsPT10P3ZvaWQgMDp0LmF0dHJpYnV0ZSxudWxsPT1lP3ZvaWQgMDplLmF0dHJpYnV0ZUxpc3QpO2xldCByPW51bGw9PShzPW51bGw9PShvPW51bGw9PWU/dm9pZCAwOmUuYXR0cmlidXRlTGlzdCk/dm9pZCAwOm8uZmluZCgoZT0+ZS52YWx1ZT09PShudWxsPT10P3ZvaWQgMDp0LmF0dHJpYnV0ZSkpKSk/dm9pZCAwOnMuY29sb3IsaT0iIjshciYmLTEhPT1uJiYocj1tW24lbS5sZW5ndGhdKSwtMT09PW4mJihyPU10KSxpPXZ0LnJnYmFTdHJpbmdUb0hleChyKS50b1N0cmluZygpLnN1YnN0cmluZygxKTtjb25zdCBjPXBhcnNlSW50KGksMTYpLGw9bnVsbCE9KHU9bnVsbD09KGE9TnRbbiVtLmxlbmd0aF0pP3ZvaWQgMDphLmhleCk/dToiIjtyZXR1cm4oKHQsZSk9Pnh0KHQsd3QoZSkpKSgoKHQsZSk9Pntmb3IodmFyIG4gaW4gZXx8KGU9e30pKUR0LmNhbGwoZSxuKSYmQ3QodCxuLGVbbl0pO2lmKGJ0KWZvcih2YXIgbiBvZiBidChlKSlFdC5jYWxsKGUsbikmJkN0KHQsbixlW25dKTtyZXR1cm4gdH0pKHt9LHZ0LmdldFRvb2xTdHJva2VBbmRGaWxsKHIseSkpLHtoZXg6Y3x8bH0pfXJldHVybiBwPi0xP3Z0LmdldFRvb2xTdHJva2VBbmRGaWxsKG1bcCVtLmxlbmd0aF0seSk6dnQuZ2V0VG9vbFN0cm9rZUFuZEZpbGwobVtoJW0ubGVuZ3RoXSx5KX1nZXRDb2xvckJ5Q29uZmlnKHthdHRyaWJ1dGU6dCxjb25maWc6ZSxzdHlsZTpufSl7dmFyIHIsaSxvO2lmKCEwPT09KG51bGw9PWU/dm9pZCAwOmUuYXR0cmlidXRlQ29uZmlndXJhYmxlKSl7Y29uc3Qgcz1udWxsPT0oaT1udWxsPT0ocj1udWxsPT1lP3ZvaWQgMDplLmF0dHJpYnV0ZUxpc3QpP3ZvaWQgMDpyLmZpbmQoKGU9PmUudmFsdWU9PT10KSkpP3ZvaWQgMDppLmNvbG9yO2lmKHMpcmV0dXJuIHZ0LmdldFRvb2xDb2xvckxpc3QocyxudWxsPT1uP3ZvaWQgMDpuLmJvcmRlck9wYWNpdHksbnVsbD09bj92b2lkIDA6bi5maWxsT3BhY2l0eSk7aWYobnVsbD09bj92b2lkIDA6bi5hdHRyaWJ1dGVDb2xvcil7Y29uc3Qgcj12dC5nZXRBdHRyaWJ1dGVJbmRleCh0LG51bGwhPShvPW51bGw9PWU/dm9pZCAwOmUuYXR0cmlidXRlTGlzdCk/bzpbXSklOCsxO3JldHVybiBuLmF0dHJpYnV0ZUNvbG9yW3JdfX1pZihuKXtjb25zdHtjb2xvcjp0LHRvb2xDb2xvcjplfT1uO2lmKGUpcmV0dXJuIGVbdF19cmV0dXJuIHZ0LmdldFRvb2xDb2xvckxpc3QoTXQpfX0sVHQ9T2JqZWN0LmRlZmluZVByb3BlcnR5LE90PU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsTHQ9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxQdD1PYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLFJ0PSh0LGUsbik9PmUgaW4gdD9UdCh0LGUse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOm59KTp0W2VdPW4sQnQ9KHQsZSk9Pntmb3IodmFyIG4gaW4gZXx8KGU9e30pKUx0LmNhbGwoZSxuKSYmUnQodCxuLGVbbl0pO2lmKE90KWZvcih2YXIgbiBvZiBPdChlKSlQdC5jYWxsKGUsbikmJlJ0KHQsbixlW25dKTtyZXR1cm4gdH0sa3Q9KHQsZSk9Pnt2YXIgbj17fTtmb3IodmFyIHIgaW4gdClMdC5jYWxsKHQscikmJmUuaW5kZXhPZihyKTwwJiYobltyXT10W3JdKTtpZihudWxsIT10JiZPdClmb3IodmFyIHIgb2YgT3QodCkpZS5pbmRleE9mKHIpPDAmJlB0LmNhbGwodCxyKSYmKG5bcl09dFtyXSk7cmV0dXJuIG59O2NvbnN0IHp0PSJzdGVwXzEiLGp0PWNsYXNze3N0YXRpYyBnZW5Db2xvckJ5Q29vcmQodCxlLG4pe3JldHVybiBuPD0wP1sxMjgsMTI4LDEyOF06bjw1P1syNTUsMCwwXTpuPDEwP1swLDI1NSwwXTpbMCwwLDI1NV19c3RhdGljIGdldFN0YW5kYXJkQ29sb3JCeUNvb3JkKHQsZSxuKXtyZXR1cm4gdGhpcy5nZW5Db2xvckJ5Q29vcmQodCxlLG4pLm1hcCgodD0+dC8yNTUpKX1zdGF0aWMgcGFyc2VQb2ludENsb3VkQ3VycmVudFJlc3VsdCh0KXt2YXIgZSxuLHIsaSxvLHMsYSx1O2NvbnN0IGM9dGhpcy5qc29uUGFyc2VyKHQpLGw9bnVsbCE9KGU9bnVsbD09Yz92b2lkIDA6Y1t6dF0pP2U6e30saD1udWxsIT0obj1udWxsPT1sP3ZvaWQgMDpsLnJlc3VsdCk/bjpbXSxmPW51bGwhPShpPW51bGwhPShyPW51bGw9PWw/dm9pZCAwOmwucmVzdWx0UG9seWdvbik/cjpudWxsPT1sP3ZvaWQgMDpsLnJlbmRlclBvbHlnb24pP2k6W10scD1udWxsIT0obz1udWxsPT1sP3ZvaWQgMDpsLnJlc3VsdExpbmUpP286W10sZD1udWxsIT0ocz1udWxsPT1sP3ZvaWQgMDpsLnJlc3VsdFBvaW50KT9zOltdLGc9bnVsbCE9KGE9bnVsbD09bD92b2lkIDA6bC5zZWdtZW50YXRpb24pP2E6W10seT1udWxsIT0odT1udWxsPT1sP3ZvaWQgMDpsLnJlc3VsdFJlY3QpP3U6W107cmV0dXJue2JveFBhcmFtc0xpc3Q6aC5maWx0ZXIoKHQ9PiF0aGlzLmhhc0Vycm9yVmFsdWVPYmoodCkpKSxwb2x5Z29uTGlzdDpmLGxpbmVMaXN0OnAsc3BoZXJlUGFyYW1zTGlzdDpkLHNlZ21lbnRhdGlvbjpnLHJlY3RMaXN0Onl9fXN0YXRpYyBoYXNFcnJvclZhbHVlT2JqKHQpe2Z1bmN0aW9uIGUodCl7cmV0dXJuIG51bGw9PXR8fE51bWJlci5pc05hTih0KX1yZXR1cm4gZnVuY3Rpb24gdChuKXtpZigib2JqZWN0IiE9dHlwZW9mIG58fG51bGw9PT1uKXJldHVybiBlKG4pO2Zvcihjb25zdCByIGluIG4pe2NvbnN0IGk9bltyXTtpZihlKGkpfHwib2JqZWN0Ij09dHlwZW9mIGkmJnQoaSkpcmV0dXJuITB9cmV0dXJuITF9KHQpfXN0YXRpYyBnZXRCb3hQYXJhbXNGcm9tUmVzdWx0TGlzdCh0KXtjb25zdHtib3hQYXJhbXNMaXN0OmV9PXRoaXMucGFyc2VQb2ludENsb3VkQ3VycmVudFJlc3VsdCh0KTtyZXR1cm4gZX1zdGF0aWMgZ2V0UmVjdFBhcmFtc0Zyb21SZXN1bHRMaXN0KHQpe3ZhciBlLG47Y29uc3Qgcj10aGlzLmpzb25QYXJzZXIodCk7cmV0dXJuIG51bGwhPShuPW51bGw9PShlPW51bGw9PXI/dm9pZCAwOnJbenRdKT92b2lkIDA6ZS5yZXN1bHRSZWN0KT9uOltdfXN0YXRpYyBnZXRTcGhlcmVQYXJhbXNGcm9tUmVzdWx0TGlzdCh0KXt2YXIgZSxuO2NvbnN0IHI9dGhpcy5qc29uUGFyc2VyKHQpO3JldHVybiBudWxsIT0obj1udWxsPT0oZT1udWxsPT1yP3ZvaWQgMDpyW3p0XSk/dm9pZCAwOmUucmVzdWx0UG9pbnQpP246W119c3RhdGljIGdldFNlZ21lbnRGcm9tUmVzdWx0TGlzdCh0KXt2YXIgZSxuO2NvbnN0IHI9dGhpcy5qc29uUGFyc2VyKHQpO3JldHVybiBudWxsIT0obj1udWxsPT0oZT1udWxsPT1yP3ZvaWQgMDpyW3p0XSk/dm9pZCAwOmUuc2VnbWVudGF0aW9uKT9uOltdfXN0YXRpYyBnZXRMaW5lTGlzdEZyb21SZXN1bHRMaXN0KHQpe3ZhciBlLG47Y29uc3Qgcj10aGlzLmpzb25QYXJzZXIodCk7cmV0dXJuIG51bGwhPShuPW51bGw9PShlPW51bGw9PXI/dm9pZCAwOnJbenRdKT92b2lkIDA6ZS5yZXN1bHRMaW5lKT9uOltdfXN0YXRpYyBnZXRQb2x5Z29uTGlzdEZyb21SZXN1bHRMaXN0KHQpe3ZhciBlLG4scixpO2NvbnN0IG89dGhpcy5qc29uUGFyc2VyKHQpO3JldHVybiBudWxsIT0oaT1udWxsIT0ocj1udWxsPT0oZT1udWxsPT1vP3ZvaWQgMDpvW3p0XSk/dm9pZCAwOmUucmVzdWx0UG9seWdvbik/cjpudWxsPT0obj1udWxsPT1vP3ZvaWQgMDpvW3p0XSk/dm9pZCAwOm4ucmVuZGVyUG9seWdvbik/aTpbXX1zdGF0aWMgZ2V0RnJvbnRWaWV3UG9seWdvbih0KXtjb25zdHtjZW50ZXI6e3g6ZSx5Om4sejpyfSx3aWR0aDppLGhlaWdodDpvLGRlcHRoOnN9PXQ7cmV0dXJuW3t4OmUraS8yLHk6bitvLzIsejpyLXMvMn0se3g6ZStpLzIseTpuK28vMix6OnIrcy8yfSx7eDplK2kvMix5Om4tby8yLHo6citzLzJ9LHt4OmUraS8yLHk6bi1vLzIsejpyLXMvMn0se3g6ZStpLzIseTpuK28vMix6OnItcy8yfV19c3RhdGljIGdldEJhY2tWaWV3UG9seWdvbih0KXtjb25zdHtjZW50ZXI6e3g6ZSx5Om4sejpyfSx3aWR0aDppLGhlaWdodDpvLGRlcHRoOnN9PXQ7cmV0dXJuW3t4OmUtaS8yLHk6bi1vLzIsejpyLXMvMn0se3g6ZS1pLzIseTpuK28vMix6OnItcy8yfSx7eDplLWkvMix5Om4rby8yLHo6citzLzJ9LHt4OmUtaS8yLHk6bi1vLzIsejpyK3MvMn0se3g6ZS1pLzIseTpuLW8vMix6OnItcy8yfV19c3RhdGljIGdldEFsbERpcmVjdGlvbkxpbmUodCl7Y29uc3R7Y2VudGVyOnt4OmUseTpuLHo6cn0sd2lkdGg6aSxoZWlnaHQ6byxkZXB0aDpzfT10O3JldHVybltbe3g6ZStpLzIseTpuLW8vMix6OnItcy8yfSx7eDplLWkvMix5Om4tby8yLHo6ci1zLzJ9XSxbe3g6ZStpLzIseTpuK28vMix6OnItcy8yfSx7eDplLWkvMix5Om4rby8yLHo6ci1zLzJ9XSxbe3g6ZStpLzIseTpuLW8vMix6OnIrcy8yfSx7eDplLWkvMix5Om4tby8yLHo6citzLzJ9XSxbe3g6ZStpLzIseTpuK28vMix6OnIrcy8yfSx7eDplLWkvMix5Om4rby8yLHo6citzLzJ9XV19c3RhdGljIGdldEFsbFZpZXdEYXRhKHQpe3JldHVyblt7dHlwZToicG9seWdvbiIscG9pbnRMaXN0OnRoaXMuZ2V0RnJvbnRWaWV3UG9seWdvbih0KX0se3R5cGU6InBvbHlnb24iLHBvaW50TGlzdDp0aGlzLmdldEJhY2tWaWV3UG9seWdvbih0KX0sLi4udGhpcy5nZXRBbGxEaXJlY3Rpb25MaW5lKHQpLm1hcCgodD0+KHt0eXBlOiJsaW5lIixwb2ludExpc3Q6dH0pKSldfXN0YXRpYyB0cmFuc2ZlckJveDJLaXR0aSh0KXt2YXIgZSxuLHI7cmV0dXJue2hlaWdodDpudWxsIT0oZT10LmRlcHRoKT9lOjAsbGVuZ3RoOm51bGwhPShuPXQud2lkdGgpP246MCx3aWR0aDpudWxsIT0ocj10LmhlaWdodCk/cjowLHJvdGF0aW9uX3k6dC5yb3RhdGlvbj90aGlzLnRyYW5zZmVyUm90YXRpb24yS2l0dGlSb3RhdGlvbl95KHQucm90YXRpb24pOjB9fXN0YXRpYyByZXN0cmljdEFuZ2xlUmFuZ2UodCl7Y29uc3QgZT0yKk1hdGguUEk7bGV0IG49dCVlO3JldHVybiBuPDA/ZStuOm59c3RhdGljIHRyYW5zZmVyUm90YXRpb24yS2l0dGlSb3RhdGlvbl95KHQpe2lmKHQ8MClyZXR1cm4tdDtjb25zdCBlPTIqTWF0aC5QSS10O3JldHVybiBlPk1hdGguUEkmJmU8MipNYXRoLlBJPy0xKnQ6MipNYXRoLlBJLXR9c3RhdGljIGdldEFsbFBvaW50Q2xvdWRSZXN1bHQoe2ltZ0xpc3Q6dCxzdGVwOmU9MSxleHRyYUJveExpc3Q6bixleHRyYVNwaGVyZUxpc3Q6cj1bXSxpZ25vcmVJbmRleExpc3Q6aT1bXSxpc1ByZVJlc3VsdDpvPSExfSl7Y29uc3Qgcz10LmZpbHRlcigoKHQsZSk9PiEobnVsbD09aT92b2lkIDA6aS5pbmNsdWRlcyhlKSkpKS5tYXAoKHQ9Pnt2YXIgZTtyZXR1cm4gdGhpcy5qc29uUGFyc2VyKG51bGwhPShlPW51bGw9PXQ/dm9pZCAwOnRbbz8icHJlUmVzdWx0IjoicmVzdWx0Il0pP2U6IiIpfSkpLGE9YHN0ZXBfJHtlfWA7bGV0IHU9W107cmV0dXJuIHMuZm9yRWFjaCgodD0+e3ZhciBlLG47KG51bGw9PShuPW51bGw9PShlPW51bGw9PXQ/dm9pZCAwOnRbYV0pP3ZvaWQgMDplLnJlc3VsdCk/dm9pZCAwOm4ubGVuZ3RoKT4wJiYodT11LmNvbmNhdCh0W2FdLnJlc3VsdCkpfSkpLG4mJih1PXUuY29uY2F0KG4pKSxyJiYodT11LmNvbmNhdChyKSksdX1zdGF0aWMgZ2V0SW5kZXhCeVRyYWNrSUQodCxlLG4pe2NvbnN0IHI9W10saT1lLm1hcCgodD0+e3ZhciBlO3JldHVybiB0aGlzLmpzb25QYXJzZXIobnVsbCE9KGU9bnVsbD09dD92b2lkIDA6dFtuPyJwcmVSZXN1bHQiOiJyZXN1bHQiXSk/ZToiIil9KSk7cmV0dXJuIGkuZm9yRWFjaCgoKGUsbik9Pnt2YXIgaTtjb25zdCBvPW51bGw9PShpPW51bGw9PWU/dm9pZCAwOmUuc3RlcF8xKT92b2lkIDA6aS5yZXN1bHQ7KG51bGw9PW8/dm9pZCAwOm8ubGVuZ3RoKT4wJiYobnVsbD09bz92b2lkIDA6by5maW5kKChlPT4obnVsbD09ZT92b2lkIDA6ZS50cmFja0lEKT09PXQpKSkmJnIucHVzaChuKX0pKSxyfXN0YXRpYyBnZXROZXh0VHJhY2tJRCh7aW1nTGlzdDp0LHN0ZXA6ZT0xLGV4dHJhQm94TGlzdDpuLGV4dHJhU3BoZXJlTGlzdDpyfSl7bGV0IGk9MTtyZXR1cm4gdGhpcy5nZXRBbGxQb2ludENsb3VkUmVzdWx0KHtpbWdMaXN0OnQsc3RlcDplLGV4dHJhQm94TGlzdDpuLGV4dHJhU3BoZXJlTGlzdDpyfSkuZm9yRWFjaCgodD0+eyJudW1iZXIiPT10eXBlb2YobnVsbD09dD92b2lkIDA6dC50cmFja0lEKSYmdC50cmFja0lEPj1pJiYoaT10LnRyYWNrSUQrMSl9KSksaX1zdGF0aWMgYmF0Y2hVcGRhdGVUcmFja0lEKHtpZDp0LG5ld0lEOmUscmVzdWx0Om4sc3RlcDpyPTF9KXt2YXIgaTtjb25zdCBvPWBzdGVwXyR7cn1gLHM9dGhpcy5qc29uUGFyc2VyKG4pLGE9bnVsbD09KGk9bnVsbD09cz92b2lkIDA6c1tvXSk/dm9pZCAwOmkucmVzdWx0O3JldHVybiBhPyhhLmZvckVhY2goKG49PigobnVsbD09bj92b2lkIDA6bi50cmFja0lEKT09PXQmJihuLnRyYWNrSUQ9ZSksbikpKSxKU09OLnN0cmluZ2lmeShzKSk6bn1zdGF0aWMgYmF0Y2hVcGRhdGVUcmFja0lEQ2hlY2soe25ld0lEOnQscmVzdWx0OmUsc3RlcDpuPTF9KXt2YXIgcjtjb25zdCBpPWBzdGVwXyR7bn1gLG89dGhpcy5qc29uUGFyc2VyKGUpLHM9bnVsbD09KHI9bnVsbD09bz92b2lkIDA6b1tpXSk/dm9pZCAwOnIucmVzdWx0O3JldHVybiEhcyYmcy5zb21lKChlPT5lLnRyYWNrSUQ9PT10KSl9c3RhdGljIGJhdGNoVXBkYXRlUmVzdWx0QnlUcmFja0lEKHtpZDp0LG5ld0RhdGE6ZSxyZXN1bHQ6bixzdGVwOnI9MX0pe3ZhciBpO2NvbnN0IG89YHN0ZXBfJHtyfWAscz10aGlzLmpzb25QYXJzZXIobiksYT1udWxsPT0oaT1udWxsPT1zP3ZvaWQgMDpzW29dKT92b2lkIDA6aS5yZXN1bHQ7cmV0dXJuIGE/KHNbb10ucmVzdWx0PWEubWFwKChuPT57aWYoKG51bGw9PW4/dm9pZCAwOm4udHJhY2tJRCk9PT10KXtjb25zdCB0PUJ0KHt9LGUpLHI9dC5zdWJBdHRyaWJ1dGU7cmV0dXJuIHImJm4uc3ViQXR0cmlidXRlJiZPYmplY3QuYXNzaWduKHQse3N1YkF0dHJpYnV0ZTpCdChCdCh7fSxuLnN1YkF0dHJpYnV0ZSkscil9KSxCdChCdCh7fSxuKSx0KX1yZXR1cm4gbn0pKSxKU09OLnN0cmluZ2lmeShzKSk6bn1zdGF0aWMgZ2V0TWF4U2l6ZUZyb21Cb3goe3RyYWNrSUQ6dCxpbWdMaXN0OmV9KXtsZXQgbjtyZXR1cm4gZS5mb3JFYWNoKChlPT57dmFyIHI7Y29uc3QgaT10aGlzLmpzb25QYXJzZXIoZS5yZXN1bHQpLG89bnVsbD09KHI9bnVsbD09aT92b2lkIDA6aVt6dF0pP3ZvaWQgMDpyLnJlc3VsdDshb3x8by5mb3JFYWNoKChlPT57aWYoKG51bGw9PWU/dm9pZCAwOmUudHJhY2tJRCk9PT10KXtpZighbilyZXR1cm4gdm9pZChuPXt3aWR0aDplLndpZHRoLGhlaWdodDplLmhlaWdodCxkZXB0aDplLmRlcHRofSk7ZS53aWR0aD5uLndpZHRoJiYobi53aWR0aD1lLndpZHRoKSxlLmhlaWdodD5uLmhlaWdodCYmKG4uaGVpZ2h0PWUuaGVpZ2h0KSxlLmRlcHRoPm4uZGVwdGgmJihuLmRlcHRoPWUuZGVwdGgpfX0pKX0pKSxufXN0YXRpYyBnZXRTdWJBdHRyaWJ1dGVOYW1lKHQsZSl7Y29uc3Qgbj1lLmlucHV0TGlzdDtyZXR1cm4gT2JqZWN0LmVudHJpZXModCkubWFwKCgoW3QsZV0pPT57dmFyIHI7Y29uc3QgaT1uLmZpbmQoKGU9PmUudmFsdWU9PT10KSk7aWYoaSl7Y29uc3QgdD1udWxsPT0ocj1udWxsPT1pP3ZvaWQgMDppLnN1YlNlbGVjdGVkKT92b2lkIDA6ci5maW5kKCh0PT50LnZhbHVlPT09ZSkpO2lmKHQpcmV0dXJue2xhYmVsOmkua2V5LHZhbHVlOnQua2V5fX1yZXR1cm57bGFiZWw6dCx2YWx1ZTplfX0pKX1zdGF0aWMgZ2V0SW50ZXJzZWN0aW9uQnlTbG9wZSh0KXtjb25zdHtwMTplLGxpbmUxOm4scDI6cixsaW5lMjppfT10O2lmKGUueD09PXIueCYmZS55PT09ci55KXJldHVybiBlO2xldCBvLHM7blswXS54PT09blsxXS54JiYobz1lLngpLG5bMF0ueT09PW5bMV0ueSYmKHM9ZS55KSxpWzBdLng9PT1pWzFdLngmJihvPXIueCksaVswXS55PT09aVsxXS55JiYocz1yLnkpO2NvbnN0IGE9KG5bMF0ueS1uWzFdLnkpLyhuWzBdLngtblsxXS54KSx1PShpWzBdLnktaVsxXS55KS8oaVswXS54LWlbMV0ueCk7cmV0dXJuIG89bnVsbCE9bz9vOihlLnktci55LWEqZS54K3Uqci54KS8odS1hKSxzPW51bGwhPXM/czplLnktYSooZS54LW8pLHt4Om8seTpzfX1zdGF0aWMgZ2V0Q2xvdWRLZXlzKHQsZSxuKXtyZXR1cm5bdCxlLG5dLmpvaW4oIkAiKX1zdGF0aWMgc3BsaXRQb2ludHNGcm9tSW5kZXhlcyh0LGUpe2NvbnN0IG49bmV3IFNldDtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrPTEpbi5hZGQoZVt0XSk7Y29uc3Qgcj1bXTtmb3IobGV0IGU9MDtlPHQubGVuZ3RoO2UrPTEpbi5oYXModFtlXSl8fHIucHVzaCh0W2VdKTtyZXR1cm4gcn1zdGF0aWMgc3BsaXRQb2ludHNGcm9tUG9pbnRzKHQsZSl7Y29uc3Qgbj1uZXcgTWFwO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCs9MyluLnNldChqdC5nZXRDbG91ZEtleXMoZVt0XSxlW3QrMV0sZVt0KzJdKSwxKTtjb25zdCByPVtdO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSs9Myl7Y29uc3QgaT1qdC5nZXRDbG91ZEtleXModFtlXSx0W2UrMV0sdFtlKzJdKTtuLmhhcyhpKXx8ci5wdXNoKHRbZV0sdFtlKzFdLHRbZSsyXSl9cmV0dXJuIG5ldyBGbG9hdDMyQXJyYXkocil9c3RhdGljIGdldERlZmF1bHRPcnRob2dyYXBoaWNQYXJhbXModCl7cmV0dXJue2xlZnQ6LXQud2lkdGgvMixyaWdodDp0LndpZHRoLzIsdG9wOnQuaGVpZ2h0LzIsYm90dG9tOi10LmhlaWdodC8yLG5lYXI6LjEsZmFyOjFlNH19fTtsZXQgVXQ9anQ7VXQuanNvblBhcnNlcj10PT57dHJ5e3JldHVybiBKU09OLnBhcnNlKHQpfWNhdGNoKHQpe3JldHVybnt9fX0sVXQudHJhbnNmZXJDYW52YXMyV29ybGQ9KHQsZSk9Pntjb25zdHt3aWR0aDpuLGhlaWdodDpyfT1lLGk9dCx7eDpvLHk6c309aSxhPWt0KGksWyJ4IiwieSJdKTtyZXR1cm4gQnQoe3g6ci8yLXMseTotKG8tbi8yKX0sYSl9LFV0LnBvaW50TGlzdFRyYW5zZmVyQ2FudmFzMldvcmxkPSh0LGUpPT5udWxsPT10P3ZvaWQgMDp0Lm1hcCgodD0+QnQoQnQoe30sdCksanQudHJhbnNmZXJDYW52YXMyV29ybGQodCxlKSkpKSxVdC50cmFuc2ZlcldvcmxkMkNhbnZhcz0odCxlKT0+e2NvbnN0e3dpZHRoOm4saGVpZ2h0OnJ9PWUsaT10LHt4Om8seTpzfT1pLGE9a3QoaSxbIngiLCJ5Il0pO3JldHVybiBCdCh7eDpuLzItcyx5OnIvMi1vfSxhKX07Y29uc3QgcXQ9KHQsZSk9PlsuLi50LC4uLmVdO2NsYXNzIFZ0e3N0YXRpYyB0cmFuc2Zlck1hdHJpeDM0RnJvbUtpdHRpMlRocmVlKHQpe3JldHVyblsuLi50LnJlZHVjZShxdCxbXSksMCwwLDAsMV19c3RhdGljIHRyYW5zZmVyTWF0cml4MzNGcm9tS2l0dGkyVGhyZWUodCl7cmV0dXJuWy4uLnQucmVkdWNlKCgodCxlKT0+Wy4uLnQsLi4uZV0uY29uY2F0KFswXSkpLFtdKSwwLDAsMCwxXX19dmFyIEd0LFl0LFh0LFd0LEh0LFp0LEt0LEp0LFF0LCR0OyhZdD1HdHx8KEd0PXt9KSkuRnJvbnQ9IkZST05UIixZdC5CYWNrPSJCQUNLIixZdC5MZWZ0PSJMRUZUIixZdC5SaWdodD0iUklHSFQiLFl0LlRvcD0iVE9QIixZdC5MRlQ9IkxFRlRfRlJPTlRfVE9QIixZdC5SQlQ9IlJJR0hUX0JBQ0tfVE9QIixmdW5jdGlvbih0KXt0LkRldGVjdGlvbj0iRGV0ZWN0aW9uIix0LlNlZ21lbnRhdGlvbj0iU2VnbWVudGF0aW9uIn0oWHR8fChYdD17fSkpLGZ1bmN0aW9uKHQpe3QuQWRkPSJBREQiLHQuUmVtb3ZlPSJSRU1PVkUifShXdHx8KFd0PXt9KSksZnVuY3Rpb24odCl7dC5Db3Zlcj0iQ292ZXIiLHQuVW5jb3Zlcj0iVW5jb3ZlciJ9KEh0fHwoSHQ9e30pKSxmdW5jdGlvbih0KXt0LkZvY3VzPSJGb2N1cyIsdC5VbmZvY3VzPSJVbmZvY3VzIn0oWnR8fChadD17fSkpLGZ1bmN0aW9uKHQpe3QuUmVhZHk9IlJFQURZIix0LkNoZWNrPSJDSEVDSyIsdC5FZGl0PSJFRElUIix0LkhvdmVyPSJIT1ZFUiJ9KEt0fHwoS3Q9e30pKSxmdW5jdGlvbih0KXt0W3QuTm9ybWFsPTBdPSJOb3JtYWwiLHRbdC5PbW5pQ2FtZXJhPTFdPSJPbW5pQ2FtZXJhIix0W3QuS2FubmFsYUJyYW5kdD0yXT0iS2FubmFsYUJyYW5kdCIsdFt0Lk9tbmlDYW1lcmExMVY9M109Ik9tbmlDYW1lcmExMVYifShKdHx8KEp0PXt9KSksZnVuY3Rpb24odCl7dFt0LkxpbmU9MF09IkxpbmUiLHRbdC5DdXJ2ZT0xXT0iQ3VydmUifShRdHx8KFF0PXt9KSksZnVuY3Rpb24odCl7dFt0LlBlcmlvZD0wXT0iUGVyaW9kIix0W3QuVGltZT0xXT0iVGltZSJ9KCR0fHwoJHQ9e30pKTt2YXIgdGU9InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWxUaGlzP2dsb2JhbFRoaXM6InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OiJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsP2dsb2JhbDoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjp7fTtmdW5jdGlvbiBlZSh0KXt2YXIgZT17ZXhwb3J0czp7fX07cmV0dXJuIHQoZSxlLmV4cG9ydHMpLGUuZXhwb3J0c31lZSgoZnVuY3Rpb24odCxlKXsoZnVuY3Rpb24oKXt2YXIgbixyPSJFeHBlY3RlZCBhIGZ1bmN0aW9uIixpPSJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIixvPSJfX2xvZGFzaF9wbGFjZWhvbGRlcl9fIixzPTE2LGE9MzIsdT02NCxjPTEyOCxsPTI1NixoPTEvMCxmPTkwMDcxOTkyNTQ3NDA5OTEscD1OYU4sZD00Mjk0OTY3Mjk1LGc9ZC0xLHk9ZD4+PjEsbT1bWyJhcnkiLGNdLFsiYmluZCIsMV0sWyJiaW5kS2V5IiwyXSxbImN1cnJ5Iiw4XSxbImN1cnJ5UmlnaHQiLHNdLFsiZmxpcCIsNTEyXSxbInBhcnRpYWwiLGFdLFsicGFydGlhbFJpZ2h0Iix1XSxbInJlYXJnIixsXV0sdj0iW29iamVjdCBBcmd1bWVudHNdIixfPSJbb2JqZWN0IEFycmF5XSIseD0iW29iamVjdCBCb29sZWFuXSIsdz0iW29iamVjdCBEYXRlXSIsYj0iW29iamVjdCBFcnJvcl0iLEQ9IltvYmplY3QgRnVuY3Rpb25dIixFPSJbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXSIsQz0iW29iamVjdCBNYXBdIixTPSJbb2JqZWN0IE51bWJlcl0iLEE9IltvYmplY3QgT2JqZWN0XSIsTj0iW29iamVjdCBQcm9taXNlXSIsST0iW29iamVjdCBSZWdFeHBdIixNPSJbb2JqZWN0IFNldF0iLEY9IltvYmplY3QgU3RyaW5nXSIsVD0iW29iamVjdCBTeW1ib2xdIixPPSJbb2JqZWN0IFdlYWtNYXBdIixMPSJbb2JqZWN0IEFycmF5QnVmZmVyXSIsUD0iW29iamVjdCBEYXRhVmlld10iLFI9IltvYmplY3QgRmxvYXQzMkFycmF5XSIsQj0iW29iamVjdCBGbG9hdDY0QXJyYXldIixrPSJbb2JqZWN0IEludDhBcnJheV0iLHo9IltvYmplY3QgSW50MTZBcnJheV0iLGo9IltvYmplY3QgSW50MzJBcnJheV0iLFU9IltvYmplY3QgVWludDhBcnJheV0iLHE9IltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIixWPSJbb2JqZWN0IFVpbnQxNkFycmF5XSIsRz0iW29iamVjdCBVaW50MzJBcnJheV0iLFk9L1xiX19wIFwrPSAnJzsvZyxYPS9cYihfX3AgXCs9KSAnJyBcKy9nLFc9LyhfX2VcKC4qP1wpfFxiX190XCkpIFwrXG4nJzsvZyxIPS8mKD86YW1wfGx0fGd0fHF1b3R8IzM5KTsvZyxaPS9bJjw+IiddL2csSz1SZWdFeHAoSC5zb3VyY2UpLEo9UmVnRXhwKFouc291cmNlKSxRPS88JS0oW1xzXFNdKz8pJT4vZywkPS88JShbXHNcU10rPyklPi9nLHR0PS88JT0oW1xzXFNdKz8pJT4vZyxldD0vXC58XFsoPzpbXltcXV0qfChbIiddKSg/Oig/IVwxKVteXFxdfFxcLikqP1wxKVxdLyxudD0vXlx3KiQvLHJ0PS9bXi5bXF1dK3xcWyg/OigtP1xkKyg/OlwuXGQrKT8pfChbIiddKSgoPzooPyFcMilbXlxcXXxcXC4pKj8pXDIpXF18KD89KD86XC58XFtcXSkoPzpcLnxcW1xdfCQpKS9nLGl0PS9bXFxeJC4qKz8oKVtcXXt9fF0vZyxvdD1SZWdFeHAoaXQuc291cmNlKSxzdD0vXlxzKy8sYXQ9L1xzLyx1dD0vXHsoPzpcblwvXCogXFt3cmFwcGVkIHdpdGggLitcXSBcKlwvKT9cbj8vLGN0PS9ce1xuXC9cKiBcW3dyYXBwZWQgd2l0aCAoLispXF0gXCovLGx0PS8sPyAmIC8saHQ9L1teXHgwMC1ceDJmXHgzYS1ceDQwXHg1Yi1ceDYwXHg3Yi1ceDdmXSsvZyxmdD0vWygpPSx7fVxbXF1cL1xzXS8scHQ9L1xcKFxcKT8vZyxkdD0vXCRceyhbXlxcfV0qKD86XFwuW15cXH1dKikqKVx9L2csZ3Q9L1x3KiQvLHl0PS9eWy0rXTB4WzAtOWEtZl0rJC9pLG10PS9eMGJbMDFdKyQvaSx2dD0vXlxbb2JqZWN0IC4rP0NvbnN0cnVjdG9yXF0kLyxfdD0vXjBvWzAtN10rJC9pLHh0PS9eKD86MHxbMS05XVxkKikkLyx3dD0vW1x4YzAtXHhkNlx4ZDgtXHhmNlx4ZjgtXHhmZlx1MDEwMC1cdTAxN2ZdL2csYnQ9LygkXikvLER0PS9bJ1xuXHJcdTIwMjhcdTIwMjlcXF0vZyxFdD0iXFx1ZDgwMC1cXHVkZmZmIixDdD0iXFx1MDMwMC1cXHUwMzZmXFx1ZmUyMC1cXHVmZTJmXFx1MjBkMC1cXHUyMGZmIixTdD0iXFx1MjcwMC1cXHUyN2JmIixBdD0iYS16XFx4ZGYtXFx4ZjZcXHhmOC1cXHhmZiIsTnQ9IkEtWlxceGMwLVxceGQ2XFx4ZDgtXFx4ZGUiLEl0PSJcXHVmZTBlXFx1ZmUwZiIsTXQ9IlxceGFjXFx4YjFcXHhkN1xceGY3XFx4MDAtXFx4MmZcXHgzYS1cXHg0MFxceDViLVxceDYwXFx4N2ItXFx4YmZcXHUyMDAwLVxcdTIwNmYgXFx0XFx4MGJcXGZcXHhhMFxcdWZlZmZcXG5cXHJcXHUyMDI4XFx1MjAyOVxcdTE2ODBcXHUxODBlXFx1MjAwMFxcdTIwMDFcXHUyMDAyXFx1MjAwM1xcdTIwMDRcXHUyMDA1XFx1MjAwNlxcdTIwMDdcXHUyMDA4XFx1MjAwOVxcdTIwMGFcXHUyMDJmXFx1MjA1ZlxcdTMwMDAiLEZ0PSJbJ+KAmV0iLFR0PSJbIitFdCsiXSIsT3Q9IlsiK010KyJdIixMdD0iWyIrQ3QrIl0iLFB0PSJcXGQrIixSdD0iWyIrU3QrIl0iLEJ0PSJbIitBdCsiXSIsa3Q9IlteIitFdCtNdCtQdCtTdCtBdCtOdCsiXSIsenQ9IlxcdWQ4M2NbXFx1ZGZmYi1cXHVkZmZmXSIsanQ9IlteIitFdCsiXSIsVXQ9Iig/OlxcdWQ4M2NbXFx1ZGRlNi1cXHVkZGZmXSl7Mn0iLHF0PSJbXFx1ZDgwMC1cXHVkYmZmXVtcXHVkYzAwLVxcdWRmZmZdIixWdD0iWyIrTnQrIl0iLEd0PSJcXHUyMDBkIixZdD0iKD86IitCdCsifCIra3QrIikiLFh0PSIoPzoiK1Z0KyJ8IitrdCsiKSIsV3Q9Iig/Olsn4oCZXSg/OmR8bGx8bXxyZXxzfHR8dmUpKT8iLEh0PSIoPzpbJ+KAmV0oPzpEfExMfE18UkV8U3xUfFZFKSk/IixadD0iKD86IitMdCsifCIrenQrIikiKyI/IixLdD0iWyIrSXQrIl0/IixKdD1LdCtadCsoIig/OiIrR3QrIig/OiIrW2p0LFV0LHF0XS5qb2luKCJ8IikrIikiK0t0K1p0KyIpKiIpLFF0PSIoPzoiK1tSdCxVdCxxdF0uam9pbigifCIpKyIpIitKdCwkdD0iKD86IitbanQrTHQrIj8iLEx0LFV0LHF0LFR0XS5qb2luKCJ8IikrIikiLGVlPVJlZ0V4cChGdCwiZyIpLG5lPVJlZ0V4cChMdCwiZyIpLHJlPVJlZ0V4cCh6dCsiKD89Iit6dCsiKXwiKyR0K0p0LCJnIiksaWU9UmVnRXhwKFtWdCsiPyIrQnQrIisiK1d0KyIoPz0iK1tPdCxWdCwiJCJdLmpvaW4oInwiKSsiKSIsWHQrIisiK0h0KyIoPz0iK1tPdCxWdCtZdCwiJCJdLmpvaW4oInwiKSsiKSIsVnQrIj8iK1l0KyIrIitXdCxWdCsiKyIrSHQsIlxcZCooPzoxU1R8Mk5EfDNSRHwoPyFbMTIzXSlcXGRUSCkoPz1cXGJ8W2Etel9dKSIsIlxcZCooPzoxc3R8Mm5kfDNyZHwoPyFbMTIzXSlcXGR0aCkoPz1cXGJ8W0EtWl9dKSIsUHQsUXRdLmpvaW4oInwiKSwiZyIpLG9lPVJlZ0V4cCgiWyIrR3QrRXQrQ3QrSXQrIl0iKSxzZT0vW2Etel1bQS1aXXxbQS1aXXsyfVthLXpdfFswLTldW2EtekEtWl18W2EtekEtWl1bMC05XXxbXmEtekEtWjAtOSBdLyxhZT1bIkFycmF5IiwiQnVmZmVyIiwiRGF0YVZpZXciLCJEYXRlIiwiRXJyb3IiLCJGbG9hdDMyQXJyYXkiLCJGbG9hdDY0QXJyYXkiLCJGdW5jdGlvbiIsIkludDhBcnJheSIsIkludDE2QXJyYXkiLCJJbnQzMkFycmF5IiwiTWFwIiwiTWF0aCIsIk9iamVjdCIsIlByb21pc2UiLCJSZWdFeHAiLCJTZXQiLCJTdHJpbmciLCJTeW1ib2wiLCJUeXBlRXJyb3IiLCJVaW50OEFycmF5IiwiVWludDhDbGFtcGVkQXJyYXkiLCJVaW50MTZBcnJheSIsIlVpbnQzMkFycmF5IiwiV2Vha01hcCIsIl8iLCJjbGVhclRpbWVvdXQiLCJpc0Zpbml0ZSIsInBhcnNlSW50Iiwic2V0VGltZW91dCJdLHVlPS0xLGNlPXt9O2NlW1JdPWNlW0JdPWNlW2tdPWNlW3pdPWNlW2pdPWNlW1VdPWNlW3FdPWNlW1ZdPWNlW0ddPSEwLGNlW3ZdPWNlW19dPWNlW0xdPWNlW3hdPWNlW1BdPWNlW3ddPWNlW2JdPWNlW0RdPWNlW0NdPWNlW1NdPWNlW0FdPWNlW0ldPWNlW01dPWNlW0ZdPWNlW09dPSExO3ZhciBsZT17fTtsZVt2XT1sZVtfXT1sZVtMXT1sZVtQXT1sZVt4XT1sZVt3XT1sZVtSXT1sZVtCXT1sZVtrXT1sZVt6XT1sZVtqXT1sZVtDXT1sZVtTXT1sZVtBXT1sZVtJXT1sZVtNXT1sZVtGXT1sZVtUXT1sZVtVXT1sZVtxXT1sZVtWXT1sZVtHXT0hMCxsZVtiXT1sZVtEXT1sZVtPXT0hMTt2YXIgaGU9eyJcXCI6IlxcIiwiJyI6IiciLCJcbiI6Im4iLCJcciI6InIiLCJcdTIwMjgiOiJ1MjAyOCIsIlx1MjAyOSI6InUyMDI5In0sZmU9cGFyc2VGbG9hdCxwZT1wYXJzZUludCxkZT0ib2JqZWN0Ij09dHlwZW9mIHRlJiZ0ZSYmdGUuT2JqZWN0PT09T2JqZWN0JiZ0ZSxnZT0ib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGYmJnNlbGYuT2JqZWN0PT09T2JqZWN0JiZzZWxmLHllPWRlfHxnZXx8RnVuY3Rpb24oInJldHVybiB0aGlzIikoKSxtZT1lJiYhZS5ub2RlVHlwZSYmZSx2ZT1tZSYmdCYmIXQubm9kZVR5cGUmJnQsX2U9dmUmJnZlLmV4cG9ydHM9PT1tZSx4ZT1fZSYmZGUucHJvY2Vzcyx3ZT1mdW5jdGlvbigpe3RyeXtyZXR1cm4gdmUmJnZlLnJlcXVpcmUmJnZlLnJlcXVpcmUoInV0aWwiKS50eXBlc3x8eGUmJnhlLmJpbmRpbmcmJnhlLmJpbmRpbmcoInV0aWwiKX1jYXRjaCh0KXt9fSgpLGJlPXdlJiZ3ZS5pc0FycmF5QnVmZmVyLERlPXdlJiZ3ZS5pc0RhdGUsRWU9d2UmJndlLmlzTWFwLENlPXdlJiZ3ZS5pc1JlZ0V4cCxTZT13ZSYmd2UuaXNTZXQsQWU9d2UmJndlLmlzVHlwZWRBcnJheTtmdW5jdGlvbiBOZSh0LGUsbil7c3dpdGNoKG4ubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIHQuY2FsbChlKTtjYXNlIDE6cmV0dXJuIHQuY2FsbChlLG5bMF0pO2Nhc2UgMjpyZXR1cm4gdC5jYWxsKGUsblswXSxuWzFdKTtjYXNlIDM6cmV0dXJuIHQuY2FsbChlLG5bMF0sblsxXSxuWzJdKX1yZXR1cm4gdC5hcHBseShlLG4pfWZ1bmN0aW9uIEllKHQsZSxuLHIpe2Zvcih2YXIgaT0tMSxvPW51bGw9PXQ/MDp0Lmxlbmd0aDsrK2k8bzspe3ZhciBzPXRbaV07ZShyLHMsbihzKSx0KX1yZXR1cm4gcn1mdW5jdGlvbiBNZSh0LGUpe2Zvcih2YXIgbj0tMSxyPW51bGw9PXQ/MDp0Lmxlbmd0aDsrK248ciYmITEhPT1lKHRbbl0sbix0KTspO3JldHVybiB0fWZ1bmN0aW9uIEZlKHQsZSl7Zm9yKHZhciBuPW51bGw9PXQ/MDp0Lmxlbmd0aDtuLS0mJiExIT09ZSh0W25dLG4sdCk7KTtyZXR1cm4gdH1mdW5jdGlvbiBUZSh0LGUpe2Zvcih2YXIgbj0tMSxyPW51bGw9PXQ/MDp0Lmxlbmd0aDsrK248cjspaWYoIWUodFtuXSxuLHQpKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIE9lKHQsZSl7Zm9yKHZhciBuPS0xLHI9bnVsbD09dD8wOnQubGVuZ3RoLGk9MCxvPVtdOysrbjxyOyl7dmFyIHM9dFtuXTtlKHMsbix0KSYmKG9baSsrXT1zKX1yZXR1cm4gb31mdW5jdGlvbiBMZSh0LGUpe3JldHVybiEhKG51bGw9PXQ/MDp0Lmxlbmd0aCkmJkdlKHQsZSwwKT4tMX1mdW5jdGlvbiBQZSh0LGUsbil7Zm9yKHZhciByPS0xLGk9bnVsbD09dD8wOnQubGVuZ3RoOysrcjxpOylpZihuKGUsdFtyXSkpcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gUmUodCxlKXtmb3IodmFyIG49LTEscj1udWxsPT10PzA6dC5sZW5ndGgsaT1BcnJheShyKTsrK248cjspaVtuXT1lKHRbbl0sbix0KTtyZXR1cm4gaX1mdW5jdGlvbiBCZSh0LGUpe2Zvcih2YXIgbj0tMSxyPWUubGVuZ3RoLGk9dC5sZW5ndGg7KytuPHI7KXRbaStuXT1lW25dO3JldHVybiB0fWZ1bmN0aW9uIGtlKHQsZSxuLHIpe3ZhciBpPS0xLG89bnVsbD09dD8wOnQubGVuZ3RoO2ZvcihyJiZvJiYobj10WysraV0pOysraTxvOyluPWUobix0W2ldLGksdCk7cmV0dXJuIG59ZnVuY3Rpb24gemUodCxlLG4scil7dmFyIGk9bnVsbD09dD8wOnQubGVuZ3RoO2ZvcihyJiZpJiYobj10Wy0taV0pO2ktLTspbj1lKG4sdFtpXSxpLHQpO3JldHVybiBufWZ1bmN0aW9uIGplKHQsZSl7Zm9yKHZhciBuPS0xLHI9bnVsbD09dD8wOnQubGVuZ3RoOysrbjxyOylpZihlKHRbbl0sbix0KSlyZXR1cm4hMDtyZXR1cm4hMX12YXIgVWU9SGUoImxlbmd0aCIpO2Z1bmN0aW9uIHFlKHQsZSxuKXt2YXIgcjtyZXR1cm4gbih0LChmdW5jdGlvbih0LG4saSl7aWYoZSh0LG4saSkpcmV0dXJuIHI9biwhMX0pKSxyfWZ1bmN0aW9uIFZlKHQsZSxuLHIpe2Zvcih2YXIgaT10Lmxlbmd0aCxvPW4rKHI/MTotMSk7cj9vLS06KytvPGk7KWlmKGUodFtvXSxvLHQpKXJldHVybiBvO3JldHVybi0xfWZ1bmN0aW9uIEdlKHQsZSxuKXtyZXR1cm4gZT09ZT9mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPW4tMSxpPXQubGVuZ3RoOysrcjxpOylpZih0W3JdPT09ZSlyZXR1cm4gcjtyZXR1cm4tMX0odCxlLG4pOlZlKHQsWGUsbil9ZnVuY3Rpb24gWWUodCxlLG4scil7Zm9yKHZhciBpPW4tMSxvPXQubGVuZ3RoOysraTxvOylpZihyKHRbaV0sZSkpcmV0dXJuIGk7cmV0dXJuLTF9ZnVuY3Rpb24gWGUodCl7cmV0dXJuIHQhPXR9ZnVuY3Rpb24gV2UodCxlKXt2YXIgbj1udWxsPT10PzA6dC5sZW5ndGg7cmV0dXJuIG4/SmUodCxlKS9uOnB9ZnVuY3Rpb24gSGUodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lP246ZVt0XX19ZnVuY3Rpb24gWmUodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT10P246dFtlXX19ZnVuY3Rpb24gS2UodCxlLG4scixpKXtyZXR1cm4gaSh0LChmdW5jdGlvbih0LGksbyl7bj1yPyhyPSExLHQpOmUobix0LGksbyl9KSksbn1mdW5jdGlvbiBKZSh0LGUpe2Zvcih2YXIgcixpPS0xLG89dC5sZW5ndGg7KytpPG87KXt2YXIgcz1lKHRbaV0pO3MhPT1uJiYocj1yPT09bj9zOnIrcyl9cmV0dXJuIHJ9ZnVuY3Rpb24gUWUodCxlKXtmb3IodmFyIG49LTEscj1BcnJheSh0KTsrK248dDspcltuXT1lKG4pO3JldHVybiByfWZ1bmN0aW9uICRlKHQpe3JldHVybiB0JiZ0LnNsaWNlKDAseW4odCkrMSkucmVwbGFjZShzdCwiIil9ZnVuY3Rpb24gdG4odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0KGUpfX1mdW5jdGlvbiBlbih0LGUpe3JldHVybiBSZShlLChmdW5jdGlvbihlKXtyZXR1cm4gdFtlXX0pKX1mdW5jdGlvbiBubih0LGUpe3JldHVybiB0LmhhcyhlKX1mdW5jdGlvbiBybih0LGUpe2Zvcih2YXIgbj0tMSxyPXQubGVuZ3RoOysrbjxyJiZHZShlLHRbbl0sMCk+LTE7KTtyZXR1cm4gbn1mdW5jdGlvbiBvbih0LGUpe2Zvcih2YXIgbj10Lmxlbmd0aDtuLS0mJkdlKGUsdFtuXSwwKT4tMTspO3JldHVybiBufXZhciBzbj1aZSh7IsOAIjoiQSIsIsOBIjoiQSIsIsOCIjoiQSIsIsODIjoiQSIsIsOEIjoiQSIsIsOFIjoiQSIsIsOgIjoiYSIsIsOhIjoiYSIsIsOiIjoiYSIsIsOjIjoiYSIsIsOkIjoiYSIsIsOlIjoiYSIsIsOHIjoiQyIsIsOnIjoiYyIsIsOQIjoiRCIsIsOwIjoiZCIsIsOIIjoiRSIsIsOJIjoiRSIsIsOKIjoiRSIsIsOLIjoiRSIsIsOoIjoiZSIsIsOpIjoiZSIsIsOqIjoiZSIsIsOrIjoiZSIsIsOMIjoiSSIsIsONIjoiSSIsIsOOIjoiSSIsIsOPIjoiSSIsIsOsIjoiaSIsIsOtIjoiaSIsIsOuIjoiaSIsIsOvIjoiaSIsIsORIjoiTiIsIsOxIjoibiIsIsOSIjoiTyIsIsOTIjoiTyIsIsOUIjoiTyIsIsOVIjoiTyIsIsOWIjoiTyIsIsOYIjoiTyIsIsOyIjoibyIsIsOzIjoibyIsIsO0IjoibyIsIsO1IjoibyIsIsO2IjoibyIsIsO4IjoibyIsIsOZIjoiVSIsIsOaIjoiVSIsIsObIjoiVSIsIsOcIjoiVSIsIsO5IjoidSIsIsO6IjoidSIsIsO7IjoidSIsIsO8IjoidSIsIsOdIjoiWSIsIsO9IjoieSIsIsO/IjoieSIsIsOGIjoiQWUiLCLDpiI6ImFlIiwiw54iOiJUaCIsIsO+IjoidGgiLCLDnyI6InNzIiwixIAiOiJBIiwixIIiOiJBIiwixIQiOiJBIiwixIEiOiJhIiwixIMiOiJhIiwixIUiOiJhIiwixIYiOiJDIiwixIgiOiJDIiwixIoiOiJDIiwixIwiOiJDIiwixIciOiJjIiwixIkiOiJjIiwixIsiOiJjIiwixI0iOiJjIiwixI4iOiJEIiwixJAiOiJEIiwixI8iOiJkIiwixJEiOiJkIiwixJIiOiJFIiwixJQiOiJFIiwixJYiOiJFIiwixJgiOiJFIiwixJoiOiJFIiwixJMiOiJlIiwixJUiOiJlIiwixJciOiJlIiwixJkiOiJlIiwixJsiOiJlIiwixJwiOiJHIiwixJ4iOiJHIiwixKAiOiJHIiwixKIiOiJHIiwixJ0iOiJnIiwixJ8iOiJnIiwixKEiOiJnIiwixKMiOiJnIiwixKQiOiJIIiwixKYiOiJIIiwixKUiOiJoIiwixKciOiJoIiwixKgiOiJJIiwixKoiOiJJIiwixKwiOiJJIiwixK4iOiJJIiwixLAiOiJJIiwixKkiOiJpIiwixKsiOiJpIiwixK0iOiJpIiwixK8iOiJpIiwixLEiOiJpIiwixLQiOiJKIiwixLUiOiJqIiwixLYiOiJLIiwixLciOiJrIiwixLgiOiJrIiwixLkiOiJMIiwixLsiOiJMIiwixL0iOiJMIiwixL8iOiJMIiwixYEiOiJMIiwixLoiOiJsIiwixLwiOiJsIiwixL4iOiJsIiwixYAiOiJsIiwixYIiOiJsIiwixYMiOiJOIiwixYUiOiJOIiwixYciOiJOIiwixYoiOiJOIiwixYQiOiJuIiwixYYiOiJuIiwixYgiOiJuIiwixYsiOiJuIiwixYwiOiJPIiwixY4iOiJPIiwixZAiOiJPIiwixY0iOiJvIiwixY8iOiJvIiwixZEiOiJvIiwixZQiOiJSIiwixZYiOiJSIiwixZgiOiJSIiwixZUiOiJyIiwixZciOiJyIiwixZkiOiJyIiwixZoiOiJTIiwixZwiOiJTIiwixZ4iOiJTIiwixaAiOiJTIiwixZsiOiJzIiwixZ0iOiJzIiwixZ8iOiJzIiwixaEiOiJzIiwixaIiOiJUIiwixaQiOiJUIiwixaYiOiJUIiwixaMiOiJ0IiwixaUiOiJ0IiwixaciOiJ0IiwixagiOiJVIiwixaoiOiJVIiwixawiOiJVIiwixa4iOiJVIiwixbAiOiJVIiwixbIiOiJVIiwixakiOiJ1IiwixasiOiJ1Iiwixa0iOiJ1Iiwixa8iOiJ1IiwixbEiOiJ1IiwixbMiOiJ1IiwixbQiOiJXIiwixbUiOiJ3IiwixbYiOiJZIiwixbciOiJ5IiwixbgiOiJZIiwixbkiOiJaIiwixbsiOiJaIiwixb0iOiJaIiwixboiOiJ6IiwixbwiOiJ6Iiwixb4iOiJ6IiwixLIiOiJJSiIsIsSzIjoiaWoiLCLFkiI6Ik9lIiwixZMiOiJvZSIsIsWJIjoiJ24iLCLFvyI6InMifSksYW49WmUoeyImIjoiJmFtcDsiLCI8IjoiJmx0OyIsIj4iOiImZ3Q7IiwnIic6IiZxdW90OyIsIiciOiImIzM5OyJ9KTtmdW5jdGlvbiB1bih0KXtyZXR1cm4iXFwiK2hlW3RdfWZ1bmN0aW9uIGNuKHQpe3JldHVybiBvZS50ZXN0KHQpfWZ1bmN0aW9uIGxuKHQpe3ZhciBlPS0xLG49QXJyYXkodC5zaXplKTtyZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbih0LHIpe25bKytlXT1bcix0XX0pKSxufWZ1bmN0aW9uIGhuKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiB0KGUobikpfX1mdW5jdGlvbiBmbih0LGUpe2Zvcih2YXIgbj0tMSxyPXQubGVuZ3RoLGk9MCxzPVtdOysrbjxyOyl7dmFyIGE9dFtuXTsoYT09PWV8fGE9PT1vKSYmKHRbbl09byxzW2krK109bil9cmV0dXJuIHN9ZnVuY3Rpb24gcG4odCl7dmFyIGU9LTEsbj1BcnJheSh0LnNpemUpO3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQpe25bKytlXT10fSkpLG59ZnVuY3Rpb24gZG4odCl7cmV0dXJuIGNuKHQpP2Z1bmN0aW9uKHQpe2Zvcih2YXIgZT1yZS5sYXN0SW5kZXg9MDtyZS50ZXN0KHQpOykrK2U7cmV0dXJuIGV9KHQpOlVlKHQpfWZ1bmN0aW9uIGduKHQpe3JldHVybiBjbih0KT9mdW5jdGlvbih0KXtyZXR1cm4gdC5tYXRjaChyZSl8fFtdfSh0KTpmdW5jdGlvbih0KXtyZXR1cm4gdC5zcGxpdCgiIil9KHQpfWZ1bmN0aW9uIHluKHQpe2Zvcih2YXIgZT10Lmxlbmd0aDtlLS0mJmF0LnRlc3QodC5jaGFyQXQoZSkpOyk7cmV0dXJuIGV9dmFyIG1uPVplKHsiJmFtcDsiOiImIiwiJmx0OyI6IjwiLCImZ3Q7IjoiPiIsIiZxdW90OyI6JyInLCImIzM5OyI6IicifSk7dmFyIHZuPWZ1bmN0aW9uIHQoZSl7dmFyIGF0LEV0PShlPW51bGw9PWU/eWU6dm4uZGVmYXVsdHMoeWUuT2JqZWN0KCksZSx2bi5waWNrKHllLGFlKSkpLkFycmF5LEN0PWUuRGF0ZSxTdD1lLkVycm9yLEF0PWUuRnVuY3Rpb24sTnQ9ZS5NYXRoLEl0PWUuT2JqZWN0LE10PWUuUmVnRXhwLEZ0PWUuU3RyaW5nLFR0PWUuVHlwZUVycm9yLE90PUV0LnByb3RvdHlwZSxMdD1BdC5wcm90b3R5cGUsUHQ9SXQucHJvdG90eXBlLFJ0PWVbIl9fY29yZS1qc19zaGFyZWRfXyJdLEJ0PUx0LnRvU3RyaW5nLGt0PVB0Lmhhc093blByb3BlcnR5LHp0PTAsanQ9KGF0PS9bXi5dKyQvLmV4ZWMoUnQmJlJ0LmtleXMmJlJ0LmtleXMuSUVfUFJPVE98fCIiKSk/IlN5bWJvbChzcmMpXzEuIithdDoiIixVdD1QdC50b1N0cmluZyxxdD1CdC5jYWxsKEl0KSxWdD15ZS5fLEd0PU10KCJeIitCdC5jYWxsKGt0KS5yZXBsYWNlKGl0LCJcXCQmIikucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXCgpfCBmb3IgLis/KD89XFxcXSkvZywiJDEuKj8iKSsiJCIpLFl0PV9lP2UuQnVmZmVyOm4sWHQ9ZS5TeW1ib2wsV3Q9ZS5VaW50OEFycmF5LEh0PVl0P1l0LmFsbG9jVW5zYWZlOm4sWnQ9aG4oSXQuZ2V0UHJvdG90eXBlT2YsSXQpLEt0PUl0LmNyZWF0ZSxKdD1QdC5wcm9wZXJ0eUlzRW51bWVyYWJsZSxRdD1PdC5zcGxpY2UsJHQ9WHQ/WHQuaXNDb25jYXRTcHJlYWRhYmxlOm4sdGU9WHQ/WHQuaXRlcmF0b3I6bixyZT1YdD9YdC50b1N0cmluZ1RhZzpuLG9lPWZ1bmN0aW9uKCl7dHJ5e3ZhciB0PXBvKEl0LCJkZWZpbmVQcm9wZXJ0eSIpO3JldHVybiB0KHt9LCIiLHt9KSx0fWNhdGNoKHQpe319KCksaGU9ZS5jbGVhclRpbWVvdXQhPT15ZS5jbGVhclRpbWVvdXQmJmUuY2xlYXJUaW1lb3V0LGRlPUN0JiZDdC5ub3chPT15ZS5EYXRlLm5vdyYmQ3Qubm93LGdlPWUuc2V0VGltZW91dCE9PXllLnNldFRpbWVvdXQmJmUuc2V0VGltZW91dCxtZT1OdC5jZWlsLHZlPU50LmZsb29yLHhlPUl0LmdldE93blByb3BlcnR5U3ltYm9scyx3ZT1ZdD9ZdC5pc0J1ZmZlcjpuLFVlPWUuaXNGaW5pdGUsWmU9T3Quam9pbixfbj1obihJdC5rZXlzLEl0KSx4bj1OdC5tYXgsd249TnQubWluLGJuPUN0Lm5vdyxEbj1lLnBhcnNlSW50LEVuPU50LnJhbmRvbSxDbj1PdC5yZXZlcnNlLFNuPXBvKGUsIkRhdGFWaWV3IiksQW49cG8oZSwiTWFwIiksTm49cG8oZSwiUHJvbWlzZSIpLEluPXBvKGUsIlNldCIpLE1uPXBvKGUsIldlYWtNYXAiKSxGbj1wbyhJdCwiY3JlYXRlIiksVG49TW4mJm5ldyBNbixPbj17fSxMbj1qbyhTbiksUG49am8oQW4pLFJuPWpvKE5uKSxCbj1qbyhJbiksa249am8oTW4pLHpuPVh0P1h0LnByb3RvdHlwZTpuLGpuPXpuP3puLnZhbHVlT2Y6bixVbj16bj96bi50b1N0cmluZzpuO2Z1bmN0aW9uIHFuKHQpe2lmKHJhKHQpJiYhWHModCkmJiEodCBpbnN0YW5jZW9mIFhuKSl7aWYodCBpbnN0YW5jZW9mIFluKXJldHVybiB0O2lmKGt0LmNhbGwodCwiX193cmFwcGVkX18iKSlyZXR1cm4gVW8odCl9cmV0dXJuIG5ldyBZbih0KX12YXIgVm49ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXJldHVybiBmdW5jdGlvbihlKXtpZighbmEoZSkpcmV0dXJue307aWYoS3QpcmV0dXJuIEt0KGUpO3QucHJvdG90eXBlPWU7dmFyIHI9bmV3IHQ7cmV0dXJuIHQucHJvdG90eXBlPW4scn19KCk7ZnVuY3Rpb24gR24oKXt9ZnVuY3Rpb24gWW4odCxlKXt0aGlzLl9fd3JhcHBlZF9fPXQsdGhpcy5fX2FjdGlvbnNfXz1bXSx0aGlzLl9fY2hhaW5fXz0hIWUsdGhpcy5fX2luZGV4X189MCx0aGlzLl9fdmFsdWVzX189bn1mdW5jdGlvbiBYbih0KXt0aGlzLl9fd3JhcHBlZF9fPXQsdGhpcy5fX2FjdGlvbnNfXz1bXSx0aGlzLl9fZGlyX189MSx0aGlzLl9fZmlsdGVyZWRfXz0hMSx0aGlzLl9faXRlcmF0ZWVzX189W10sdGhpcy5fX3Rha2VDb3VudF9fPWQsdGhpcy5fX3ZpZXdzX189W119ZnVuY3Rpb24gV24odCl7dmFyIGU9LTEsbj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8bjspe3ZhciByPXRbZV07dGhpcy5zZXQoclswXSxyWzFdKX19ZnVuY3Rpb24gSG4odCl7dmFyIGU9LTEsbj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8bjspe3ZhciByPXRbZV07dGhpcy5zZXQoclswXSxyWzFdKX19ZnVuY3Rpb24gWm4odCl7dmFyIGU9LTEsbj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8bjspe3ZhciByPXRbZV07dGhpcy5zZXQoclswXSxyWzFdKX19ZnVuY3Rpb24gS24odCl7dmFyIGU9LTEsbj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuX19kYXRhX189bmV3IFpuOysrZTxuOyl0aGlzLmFkZCh0W2VdKX1mdW5jdGlvbiBKbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fPW5ldyBIbih0KTt0aGlzLnNpemU9ZS5zaXplfWZ1bmN0aW9uIFFuKHQsZSl7dmFyIG49WHModCkscj0hbiYmWXModCksaT0hbiYmIXImJktzKHQpLG89IW4mJiFyJiYhaSYmaGEodCkscz1ufHxyfHxpfHxvLGE9cz9RZSh0Lmxlbmd0aCxGdCk6W10sdT1hLmxlbmd0aDtmb3IodmFyIGMgaW4gdCkoZXx8a3QuY2FsbCh0LGMpKSYmKCFzfHwhKCJsZW5ndGgiPT1jfHxpJiYoIm9mZnNldCI9PWN8fCJwYXJlbnQiPT1jKXx8byYmKCJidWZmZXIiPT1jfHwiYnl0ZUxlbmd0aCI9PWN8fCJieXRlT2Zmc2V0Ij09Yyl8fHdvKGMsdSkpKSYmYS5wdXNoKGMpO3JldHVybiBhfWZ1bmN0aW9uICRuKHQpe3ZhciBlPXQubGVuZ3RoO3JldHVybiBlP3RbS3IoMCxlLTEpXTpufWZ1bmN0aW9uIHRyKHQsZSl7cmV0dXJuIEJvKEZpKHQpLGNyKGUsMCx0Lmxlbmd0aCkpfWZ1bmN0aW9uIGVyKHQpe3JldHVybiBCbyhGaSh0KSl9ZnVuY3Rpb24gbnIodCxlLHIpeyhyIT09biYmIXFzKHRbZV0scil8fHI9PT1uJiYhKGUgaW4gdCkpJiZhcih0LGUscil9ZnVuY3Rpb24gcnIodCxlLHIpe3ZhciBpPXRbZV07KCFrdC5jYWxsKHQsZSl8fCFxcyhpLHIpfHxyPT09biYmIShlIGluIHQpKSYmYXIodCxlLHIpfWZ1bmN0aW9uIGlyKHQsZSl7Zm9yKHZhciBuPXQubGVuZ3RoO24tLTspaWYocXModFtuXVswXSxlKSlyZXR1cm4gbjtyZXR1cm4tMX1mdW5jdGlvbiBvcih0LGUsbixyKXtyZXR1cm4gZHIodCwoZnVuY3Rpb24odCxpLG8pe2Uocix0LG4odCksbyl9KSkscn1mdW5jdGlvbiBzcih0LGUpe3JldHVybiB0JiZUaShlLE9hKGUpLHQpfWZ1bmN0aW9uIGFyKHQsZSxuKXsiX19wcm90b19fIj09ZSYmb2U/b2UodCxlLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTpuLHdyaXRhYmxlOiEwfSk6dFtlXT1ufWZ1bmN0aW9uIHVyKHQsZSl7Zm9yKHZhciByPS0xLGk9ZS5sZW5ndGgsbz1FdChpKSxzPW51bGw9PXQ7KytyPGk7KW9bcl09cz9uOk5hKHQsZVtyXSk7cmV0dXJuIG99ZnVuY3Rpb24gY3IodCxlLHIpe3JldHVybiB0PT10JiYociE9PW4mJih0PXQ8PXI/dDpyKSxlIT09biYmKHQ9dD49ZT90OmUpKSx0fWZ1bmN0aW9uIGxyKHQsZSxyLGksbyxzKXt2YXIgYSx1PTEmZSxjPTImZSxsPTQmZTtpZihyJiYoYT1vP3IodCxpLG8scyk6cih0KSksYSE9PW4pcmV0dXJuIGE7aWYoIW5hKHQpKXJldHVybiB0O3ZhciBoPVhzKHQpO2lmKGgpe2lmKGE9ZnVuY3Rpb24odCl7dmFyIGU9dC5sZW5ndGgsbj1uZXcgdC5jb25zdHJ1Y3RvcihlKTtyZXR1cm4gZSYmInN0cmluZyI9PXR5cGVvZiB0WzBdJiZrdC5jYWxsKHQsImluZGV4IikmJihuLmluZGV4PXQuaW5kZXgsbi5pbnB1dD10LmlucHV0KSxufSh0KSwhdSlyZXR1cm4gRmkodCxhKX1lbHNle3ZhciBmPW1vKHQpLHA9Zj09RHx8Zj09RTtpZihLcyh0KSlyZXR1cm4gQ2kodCx1KTtpZihmPT1BfHxmPT12fHxwJiYhbyl7aWYoYT1jfHxwP3t9Ol9vKHQpLCF1KXJldHVybiBjP2Z1bmN0aW9uKHQsZSl7cmV0dXJuIFRpKHQseW8odCksZSl9KHQsZnVuY3Rpb24odCxlKXtyZXR1cm4gdCYmVGkoZSxMYShlKSx0KX0oYSx0KSk6ZnVuY3Rpb24odCxlKXtyZXR1cm4gVGkodCxnbyh0KSxlKX0odCxzcihhLHQpKX1lbHNle2lmKCFsZVtmXSlyZXR1cm4gbz90Ont9O2E9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXQuY29uc3RydWN0b3I7c3dpdGNoKGUpe2Nhc2UgTDpyZXR1cm4gU2kodCk7Y2FzZSB4OmNhc2UgdzpyZXR1cm4gbmV3IHIoK3QpO2Nhc2UgUDpyZXR1cm4gZnVuY3Rpb24odCxlKXt2YXIgbj1lP1NpKHQuYnVmZmVyKTp0LmJ1ZmZlcjtyZXR1cm4gbmV3IHQuY29uc3RydWN0b3Iobix0LmJ5dGVPZmZzZXQsdC5ieXRlTGVuZ3RoKX0odCxuKTtjYXNlIFI6Y2FzZSBCOmNhc2UgazpjYXNlIHo6Y2FzZSBqOmNhc2UgVTpjYXNlIHE6Y2FzZSBWOmNhc2UgRzpyZXR1cm4gQWkodCxuKTtjYXNlIEM6cmV0dXJuIG5ldyByO2Nhc2UgUzpjYXNlIEY6cmV0dXJuIG5ldyByKHQpO2Nhc2UgSTpyZXR1cm4gZnVuY3Rpb24odCl7dmFyIGU9bmV3IHQuY29uc3RydWN0b3IodC5zb3VyY2UsZ3QuZXhlYyh0KSk7cmV0dXJuIGUubGFzdEluZGV4PXQubGFzdEluZGV4LGV9KHQpO2Nhc2UgTTpyZXR1cm4gbmV3IHI7Y2FzZSBUOnJldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gam4/SXQoam4uY2FsbCh0KSk6e319KHQpfX0odCxmLHUpfX1zfHwocz1uZXcgSm4pO3ZhciBkPXMuZ2V0KHQpO2lmKGQpcmV0dXJuIGQ7cy5zZXQodCxhKSx1YSh0KT90LmZvckVhY2goKGZ1bmN0aW9uKG4pe2EuYWRkKGxyKG4sZSxyLG4sdCxzKSl9KSk6aWEodCkmJnQuZm9yRWFjaCgoZnVuY3Rpb24obixpKXthLnNldChpLGxyKG4sZSxyLGksdCxzKSl9KSk7dmFyIGc9aD9uOihsP2M/c286b286Yz9MYTpPYSkodCk7cmV0dXJuIE1lKGd8fHQsKGZ1bmN0aW9uKG4saSl7ZyYmKG49dFtpPW5dKSxycihhLGksbHIobixlLHIsaSx0LHMpKX0pKSxhfWZ1bmN0aW9uIGhyKHQsZSxyKXt2YXIgaT1yLmxlbmd0aDtpZihudWxsPT10KXJldHVybiFpO2Zvcih0PUl0KHQpO2ktLTspe3ZhciBvPXJbaV0scz1lW29dLGE9dFtvXTtpZihhPT09biYmIShvIGluIHQpfHwhcyhhKSlyZXR1cm4hMX1yZXR1cm4hMH1mdW5jdGlvbiBmcih0LGUsaSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR0KHIpO3JldHVybiBPbygoZnVuY3Rpb24oKXt0LmFwcGx5KG4saSl9KSxlKX1mdW5jdGlvbiBwcih0LGUsbixyKXt2YXIgaT0tMSxvPUxlLHM9ITAsYT10Lmxlbmd0aCx1PVtdLGM9ZS5sZW5ndGg7aWYoIWEpcmV0dXJuIHU7biYmKGU9UmUoZSx0bihuKSkpLHI/KG89UGUscz0hMSk6ZS5sZW5ndGg+PTIwMCYmKG89bm4scz0hMSxlPW5ldyBLbihlKSk7dDpmb3IoOysraTxhOyl7dmFyIGw9dFtpXSxoPW51bGw9PW4/bDpuKGwpO2lmKGw9cnx8MCE9PWw/bDowLHMmJmg9PWgpe2Zvcih2YXIgZj1jO2YtLTspaWYoZVtmXT09PWgpY29udGludWUgdDt1LnB1c2gobCl9ZWxzZSBvKGUsaCxyKXx8dS5wdXNoKGwpfXJldHVybiB1fXFuLnRlbXBsYXRlU2V0dGluZ3M9e2VzY2FwZTpRLGV2YWx1YXRlOiQsaW50ZXJwb2xhdGU6dHQsdmFyaWFibGU6IiIsaW1wb3J0czp7Xzpxbn19LHFuLnByb3RvdHlwZT1Hbi5wcm90b3R5cGUscW4ucHJvdG90eXBlLmNvbnN0cnVjdG9yPXFuLFluLnByb3RvdHlwZT1WbihHbi5wcm90b3R5cGUpLFluLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1ZbixYbi5wcm90b3R5cGU9Vm4oR24ucHJvdG90eXBlKSxYbi5wcm90b3R5cGUuY29uc3RydWN0b3I9WG4sV24ucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5fX2RhdGFfXz1Gbj9GbihudWxsKTp7fSx0aGlzLnNpemU9MH0sV24ucHJvdG90eXBlLmRlbGV0ZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmhhcyh0KSYmZGVsZXRlIHRoaXMuX19kYXRhX19bdF07cmV0dXJuIHRoaXMuc2l6ZS09ZT8xOjAsZX0sV24ucHJvdG90eXBlLmdldD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fO2lmKEZuKXt2YXIgcj1lW3RdO3JldHVybiByPT09aT9uOnJ9cmV0dXJuIGt0LmNhbGwoZSx0KT9lW3RdOm59LFduLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXztyZXR1cm4gRm4/ZVt0XSE9PW46a3QuY2FsbChlLHQpfSxXbi5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5fX2RhdGFfXztyZXR1cm4gdGhpcy5zaXplKz10aGlzLmhhcyh0KT8wOjEsclt0XT1GbiYmZT09PW4/aTplLHRoaXN9LEhuLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuX19kYXRhX189W10sdGhpcy5zaXplPTB9LEhuLnByb3RvdHlwZS5kZWxldGU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxuPWlyKGUsdCk7cmV0dXJuIShuPDApJiYobj09ZS5sZW5ndGgtMT9lLnBvcCgpOlF0LmNhbGwoZSxuLDEpLC0tdGhpcy5zaXplLCEwKX0sSG4ucHJvdG90eXBlLmdldD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fLHI9aXIoZSx0KTtyZXR1cm4gcjwwP246ZVtyXVsxXX0sSG4ucHJvdG90eXBlLmhhcz1mdW5jdGlvbih0KXtyZXR1cm4gaXIodGhpcy5fX2RhdGFfXyx0KT4tMX0sSG4ucHJvdG90eXBlLnNldD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX19kYXRhX18scj1pcihuLHQpO3JldHVybiByPDA/KCsrdGhpcy5zaXplLG4ucHVzaChbdCxlXSkpOm5bcl1bMV09ZSx0aGlzfSxabi5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLnNpemU9MCx0aGlzLl9fZGF0YV9fPXtoYXNoOm5ldyBXbixtYXA6bmV3KEFufHxIbiksc3RyaW5nOm5ldyBXbn19LFpuLnByb3RvdHlwZS5kZWxldGU9ZnVuY3Rpb24odCl7dmFyIGU9aG8odGhpcyx0KS5kZWxldGUodCk7cmV0dXJuIHRoaXMuc2l6ZS09ZT8xOjAsZX0sWm4ucHJvdG90eXBlLmdldD1mdW5jdGlvbih0KXtyZXR1cm4gaG8odGhpcyx0KS5nZXQodCl9LFpuLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24odCl7cmV0dXJuIGhvKHRoaXMsdCkuaGFzKHQpfSxabi5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQsZSl7dmFyIG49aG8odGhpcyx0KSxyPW4uc2l6ZTtyZXR1cm4gbi5zZXQodCxlKSx0aGlzLnNpemUrPW4uc2l6ZT09cj8wOjEsdGhpc30sS24ucHJvdG90eXBlLmFkZD1Lbi5wcm90b3R5cGUucHVzaD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5zZXQodCxpKSx0aGlzfSxLbi5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLmhhcyh0KX0sSm4ucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5fX2RhdGFfXz1uZXcgSG4sdGhpcy5zaXplPTB9LEpuLnByb3RvdHlwZS5kZWxldGU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxuPWUuZGVsZXRlKHQpO3JldHVybiB0aGlzLnNpemU9ZS5zaXplLG59LEpuLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX19kYXRhX18uZ2V0KHQpfSxKbi5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLmhhcyh0KX0sSm4ucHJvdG90eXBlLnNldD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX19kYXRhX187aWYobiBpbnN0YW5jZW9mIEhuKXt2YXIgcj1uLl9fZGF0YV9fO2lmKCFBbnx8ci5sZW5ndGg8MTk5KXJldHVybiByLnB1c2goW3QsZV0pLHRoaXMuc2l6ZT0rK24uc2l6ZSx0aGlzO249dGhpcy5fX2RhdGFfXz1uZXcgWm4ocil9cmV0dXJuIG4uc2V0KHQsZSksdGhpcy5zaXplPW4uc2l6ZSx0aGlzfTt2YXIgZHI9UGkoYnIpLGdyPVBpKERyLCEwKTtmdW5jdGlvbiB5cih0LGUpe3ZhciBuPSEwO3JldHVybiBkcih0LChmdW5jdGlvbih0LHIsaSl7cmV0dXJuIG49ISFlKHQscixpKX0pKSxufWZ1bmN0aW9uIG1yKHQsZSxyKXtmb3IodmFyIGk9LTEsbz10Lmxlbmd0aDsrK2k8bzspe3ZhciBzPXRbaV0sYT1lKHMpO2lmKG51bGwhPWEmJih1PT09bj9hPT1hJiYhbGEoYSk6cihhLHUpKSl2YXIgdT1hLGM9c31yZXR1cm4gY31mdW5jdGlvbiB2cih0LGUpe3ZhciBuPVtdO3JldHVybiBkcih0LChmdW5jdGlvbih0LHIsaSl7ZSh0LHIsaSkmJm4ucHVzaCh0KX0pKSxufWZ1bmN0aW9uIF9yKHQsZSxuLHIsaSl7dmFyIG89LTEscz10Lmxlbmd0aDtmb3Iobnx8KG49eG8pLGl8fChpPVtdKTsrK288czspe3ZhciBhPXRbb107ZT4wJiZuKGEpP2U+MT9fcihhLGUtMSxuLHIsaSk6QmUoaSxhKTpyfHwoaVtpLmxlbmd0aF09YSl9cmV0dXJuIGl9dmFyIHhyPVJpKCksd3I9UmkoITApO2Z1bmN0aW9uIGJyKHQsZSl7cmV0dXJuIHQmJnhyKHQsZSxPYSl9ZnVuY3Rpb24gRHIodCxlKXtyZXR1cm4gdCYmd3IodCxlLE9hKX1mdW5jdGlvbiBFcih0LGUpe3JldHVybiBPZShlLChmdW5jdGlvbihlKXtyZXR1cm4gJHModFtlXSl9KSl9ZnVuY3Rpb24gQ3IodCxlKXtmb3IodmFyIHI9MCxpPShlPXdpKGUsdCkpLmxlbmd0aDtudWxsIT10JiZyPGk7KXQ9dFt6byhlW3IrK10pXTtyZXR1cm4gciYmcj09aT90Om59ZnVuY3Rpb24gU3IodCxlLG4pe3ZhciByPWUodCk7cmV0dXJuIFhzKHQpP3I6QmUocixuKHQpKX1mdW5jdGlvbiBBcih0KXtyZXR1cm4gbnVsbD09dD90PT09bj8iW29iamVjdCBVbmRlZmluZWRdIjoiW29iamVjdCBOdWxsXSI6cmUmJnJlIGluIEl0KHQpP2Z1bmN0aW9uKHQpe3ZhciBlPWt0LmNhbGwodCxyZSkscj10W3JlXTt0cnl7dFtyZV09bjt2YXIgaT0hMH1jYXRjaCh0KXt9dmFyIG89VXQuY2FsbCh0KTtyZXR1cm4gaSYmKGU/dFtyZV09cjpkZWxldGUgdFtyZV0pLG99KHQpOmZ1bmN0aW9uKHQpe3JldHVybiBVdC5jYWxsKHQpfSh0KX1mdW5jdGlvbiBOcih0LGUpe3JldHVybiB0PmV9ZnVuY3Rpb24gSXIodCxlKXtyZXR1cm4gbnVsbCE9dCYma3QuY2FsbCh0LGUpfWZ1bmN0aW9uIE1yKHQsZSl7cmV0dXJuIG51bGwhPXQmJmUgaW4gSXQodCl9ZnVuY3Rpb24gRnIodCxlLHIpe2Zvcih2YXIgaT1yP1BlOkxlLG89dFswXS5sZW5ndGgscz10Lmxlbmd0aCxhPXMsdT1FdChzKSxjPTEvMCxsPVtdO2EtLTspe3ZhciBoPXRbYV07YSYmZSYmKGg9UmUoaCx0bihlKSkpLGM9d24oaC5sZW5ndGgsYyksdVthXT0hciYmKGV8fG8+PTEyMCYmaC5sZW5ndGg+PTEyMCk/bmV3IEtuKGEmJmgpOm59aD10WzBdO3ZhciBmPS0xLHA9dVswXTt0OmZvcig7KytmPG8mJmwubGVuZ3RoPGM7KXt2YXIgZD1oW2ZdLGc9ZT9lKGQpOmQ7aWYoZD1yfHwwIT09ZD9kOjAsIShwP25uKHAsZyk6aShsLGcscikpKXtmb3IoYT1zOy0tYTspe3ZhciB5PXVbYV07aWYoISh5P25uKHksZyk6aSh0W2FdLGcscikpKWNvbnRpbnVlIHR9cCYmcC5wdXNoKGcpLGwucHVzaChkKX19cmV0dXJuIGx9ZnVuY3Rpb24gVHIodCxlLHIpe3ZhciBpPW51bGw9PSh0PU1vKHQsZT13aShlLHQpKSk/dDp0W3pvKFFvKGUpKV07cmV0dXJuIG51bGw9PWk/bjpOZShpLHQscil9ZnVuY3Rpb24gT3IodCl7cmV0dXJuIHJhKHQpJiZBcih0KT09dn1mdW5jdGlvbiBMcih0LGUscixpLG8pe3JldHVybiB0PT09ZXx8KG51bGw9PXR8fG51bGw9PWV8fCFyYSh0KSYmIXJhKGUpP3QhPXQmJmUhPWU6ZnVuY3Rpb24odCxlLHIsaSxvLHMpe3ZhciBhPVhzKHQpLHU9WHMoZSksYz1hP186bW8odCksbD11P186bW8oZSksaD0oYz1jPT12P0E6Yyk9PUEsZj0obD1sPT12P0E6bCk9PUEscD1jPT1sO2lmKHAmJktzKHQpKXtpZighS3MoZSkpcmV0dXJuITE7YT0hMCxoPSExfWlmKHAmJiFoKXJldHVybiBzfHwocz1uZXcgSm4pLGF8fGhhKHQpP3JvKHQsZSxyLGksbyxzKTpmdW5jdGlvbih0LGUsbixyLGksbyxzKXtzd2l0Y2gobil7Y2FzZSBQOmlmKHQuYnl0ZUxlbmd0aCE9ZS5ieXRlTGVuZ3RofHx0LmJ5dGVPZmZzZXQhPWUuYnl0ZU9mZnNldClyZXR1cm4hMTt0PXQuYnVmZmVyLGU9ZS5idWZmZXI7Y2FzZSBMOnJldHVybiEodC5ieXRlTGVuZ3RoIT1lLmJ5dGVMZW5ndGh8fCFvKG5ldyBXdCh0KSxuZXcgV3QoZSkpKTtjYXNlIHg6Y2FzZSB3OmNhc2UgUzpyZXR1cm4gcXMoK3QsK2UpO2Nhc2UgYjpyZXR1cm4gdC5uYW1lPT1lLm5hbWUmJnQubWVzc2FnZT09ZS5tZXNzYWdlO2Nhc2UgSTpjYXNlIEY6cmV0dXJuIHQ9PWUrIiI7Y2FzZSBDOnZhciBhPWxuO2Nhc2UgTTp2YXIgdT0xJnI7aWYoYXx8KGE9cG4pLHQuc2l6ZSE9ZS5zaXplJiYhdSlyZXR1cm4hMTt2YXIgYz1zLmdldCh0KTtpZihjKXJldHVybiBjPT1lO3J8PTIscy5zZXQodCxlKTt2YXIgbD1ybyhhKHQpLGEoZSkscixpLG8scyk7cmV0dXJuIHMuZGVsZXRlKHQpLGw7Y2FzZSBUOmlmKGpuKXJldHVybiBqbi5jYWxsKHQpPT1qbi5jYWxsKGUpfXJldHVybiExfSh0LGUsYyxyLGksbyxzKTtpZighKDEmcikpe3ZhciBkPWgmJmt0LmNhbGwodCwiX193cmFwcGVkX18iKSxnPWYmJmt0LmNhbGwoZSwiX193cmFwcGVkX18iKTtpZihkfHxnKXt2YXIgeT1kP3QudmFsdWUoKTp0LG09Zz9lLnZhbHVlKCk6ZTtyZXR1cm4gc3x8KHM9bmV3IEpuKSxvKHksbSxyLGkscyl9fXJldHVybiEhcCYmKHN8fChzPW5ldyBKbiksZnVuY3Rpb24odCxlLHIsaSxvLHMpe3ZhciBhPTEmcix1PW9vKHQpLGM9dS5sZW5ndGgsbD1vbyhlKSxoPWwubGVuZ3RoO2lmKGMhPWgmJiFhKXJldHVybiExO2Zvcih2YXIgZj1jO2YtLTspe3ZhciBwPXVbZl07aWYoIShhP3AgaW4gZTprdC5jYWxsKGUscCkpKXJldHVybiExfXZhciBkPXMuZ2V0KHQpLGc9cy5nZXQoZSk7aWYoZCYmZylyZXR1cm4gZD09ZSYmZz09dDt2YXIgeT0hMDtzLnNldCh0LGUpLHMuc2V0KGUsdCk7Zm9yKHZhciBtPWE7KytmPGM7KXt2YXIgdj10W3A9dVtmXV0sXz1lW3BdO2lmKGkpdmFyIHg9YT9pKF8sdixwLGUsdCxzKTppKHYsXyxwLHQsZSxzKTtpZighKHg9PT1uP3Y9PT1ffHxvKHYsXyxyLGkscyk6eCkpe3k9ITE7YnJlYWt9bXx8KG09ImNvbnN0cnVjdG9yIj09cCl9aWYoeSYmIW0pe3ZhciB3PXQuY29uc3RydWN0b3IsYj1lLmNvbnN0cnVjdG9yO3chPWImJiJjb25zdHJ1Y3RvciJpbiB0JiYiY29uc3RydWN0b3IiaW4gZSYmISgiZnVuY3Rpb24iPT10eXBlb2YgdyYmdyBpbnN0YW5jZW9mIHcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiJiZiIGluc3RhbmNlb2YgYikmJih5PSExKX1yZXR1cm4gcy5kZWxldGUodCkscy5kZWxldGUoZSkseX0odCxlLHIsaSxvLHMpKX0odCxlLHIsaSxMcixvKSl9ZnVuY3Rpb24gUHIodCxlLHIsaSl7dmFyIG89ci5sZW5ndGgscz1vLGE9IWk7aWYobnVsbD09dClyZXR1cm4hcztmb3IodD1JdCh0KTtvLS07KXt2YXIgdT1yW29dO2lmKGEmJnVbMl0/dVsxXSE9PXRbdVswXV06ISh1WzBdaW4gdCkpcmV0dXJuITF9Zm9yKDsrK288czspe3ZhciBjPSh1PXJbb10pWzBdLGw9dFtjXSxoPXVbMV07aWYoYSYmdVsyXSl7aWYobD09PW4mJiEoYyBpbiB0KSlyZXR1cm4hMX1lbHNle3ZhciBmPW5ldyBKbjtpZihpKXZhciBwPWkobCxoLGMsdCxlLGYpO2lmKCEocD09PW4/THIoaCxsLDMsaSxmKTpwKSlyZXR1cm4hMX19cmV0dXJuITB9ZnVuY3Rpb24gUnIodCl7cmV0dXJuISghbmEodCl8fGZ1bmN0aW9uKHQpe3JldHVybiEhanQmJmp0IGluIHR9KHQpKSYmKCRzKHQpP0d0OnZ0KS50ZXN0KGpvKHQpKX1mdW5jdGlvbiBCcih0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD90Om51bGw9PXQ/b3U6Im9iamVjdCI9PXR5cGVvZiB0P1hzKHQpP1ZyKHRbMF0sdFsxXSk6cXIodCk6ZHUodCl9ZnVuY3Rpb24ga3IodCl7aWYoIVNvKHQpKXJldHVybiBfbih0KTt2YXIgZT1bXTtmb3IodmFyIG4gaW4gSXQodCkpa3QuY2FsbCh0LG4pJiYiY29uc3RydWN0b3IiIT1uJiZlLnB1c2gobik7cmV0dXJuIGV9ZnVuY3Rpb24genIodCl7aWYoIW5hKHQpKXJldHVybiBmdW5jdGlvbih0KXt2YXIgZT1bXTtpZihudWxsIT10KWZvcih2YXIgbiBpbiBJdCh0KSllLnB1c2gobik7cmV0dXJuIGV9KHQpO3ZhciBlPVNvKHQpLG49W107Zm9yKHZhciByIGluIHQpImNvbnN0cnVjdG9yIj09ciYmKGV8fCFrdC5jYWxsKHQscikpfHxuLnB1c2gocik7cmV0dXJuIG59ZnVuY3Rpb24ganIodCxlKXtyZXR1cm4gdDxlfWZ1bmN0aW9uIFVyKHQsZSl7dmFyIG49LTEscj1Icyh0KT9FdCh0Lmxlbmd0aCk6W107cmV0dXJuIGRyKHQsKGZ1bmN0aW9uKHQsaSxvKXtyWysrbl09ZSh0LGksbyl9KSkscn1mdW5jdGlvbiBxcih0KXt2YXIgZT1mbyh0KTtyZXR1cm4gMT09ZS5sZW5ndGgmJmVbMF1bMl0/Tm8oZVswXVswXSxlWzBdWzFdKTpmdW5jdGlvbihuKXtyZXR1cm4gbj09PXR8fFByKG4sdCxlKX19ZnVuY3Rpb24gVnIodCxlKXtyZXR1cm4gRG8odCkmJkFvKGUpP05vKHpvKHQpLGUpOmZ1bmN0aW9uKHIpe3ZhciBpPU5hKHIsdCk7cmV0dXJuIGk9PT1uJiZpPT09ZT9JYShyLHQpOkxyKGUsaSwzKX19ZnVuY3Rpb24gR3IodCxlLHIsaSxvKXt0IT09ZSYmeHIoZSwoZnVuY3Rpb24ocyxhKXtpZihvfHwobz1uZXcgSm4pLG5hKHMpKSFmdW5jdGlvbih0LGUscixpLG8scyxhKXt2YXIgdT1Gbyh0LHIpLGM9Rm8oZSxyKSxsPWEuZ2V0KGMpO2lmKGwpcmV0dXJuIHZvaWQgbnIodCxyLGwpO3ZhciBoPXM/cyh1LGMscisiIix0LGUsYSk6bixmPWg9PT1uO2lmKGYpe3ZhciBwPVhzKGMpLGQ9IXAmJktzKGMpLGc9IXAmJiFkJiZoYShjKTtoPWMscHx8ZHx8Zz9Ycyh1KT9oPXU6WnModSk/aD1GaSh1KTpkPyhmPSExLGg9Q2koYywhMCkpOmc/KGY9ITEsaD1BaShjLCEwKSk6aD1bXTpzYShjKXx8WXMoYyk/KGg9dSxZcyh1KT9oPV9hKHUpOighbmEodSl8fCRzKHUpKSYmKGg9X28oYykpKTpmPSExfWYmJihhLnNldChjLGgpLG8oaCxjLGkscyxhKSxhLmRlbGV0ZShjKSksbnIodCxyLGgpfSh0LGUsYSxyLEdyLGksbyk7ZWxzZXt2YXIgdT1pP2koRm8odCxhKSxzLGErIiIsdCxlLG8pOm47dT09PW4mJih1PXMpLG5yKHQsYSx1KX19KSxMYSl9ZnVuY3Rpb24gWXIodCxlKXt2YXIgcj10Lmxlbmd0aDtpZihyKXJldHVybiB3byhlKz1lPDA/cjowLHIpP3RbZV06bn1mdW5jdGlvbiBYcih0LGUsbil7ZT1lLmxlbmd0aD9SZShlLChmdW5jdGlvbih0KXtyZXR1cm4gWHModCk/ZnVuY3Rpb24oZSl7cmV0dXJuIENyKGUsMT09PXQubGVuZ3RoP3RbMF06dCl9OnR9KSk6W291XTt2YXIgcj0tMTtyZXR1cm4gZT1SZShlLHRuKGxvKCkpKSxmdW5jdGlvbih0LGUpe3ZhciBuPXQubGVuZ3RoO2Zvcih0LnNvcnQoZSk7bi0tOyl0W25dPXRbbl0udmFsdWU7cmV0dXJuIHR9KFVyKHQsKGZ1bmN0aW9uKHQsbixpKXtyZXR1cm57Y3JpdGVyaWE6UmUoZSwoZnVuY3Rpb24oZSl7cmV0dXJuIGUodCl9KSksaW5kZXg6KytyLHZhbHVlOnR9fSkpLChmdW5jdGlvbih0LGUpe3JldHVybiBmdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPS0xLGk9dC5jcml0ZXJpYSxvPWUuY3JpdGVyaWEscz1pLmxlbmd0aCxhPW4ubGVuZ3RoOysrcjxzOyl7dmFyIHU9TmkoaVtyXSxvW3JdKTtpZih1KXJldHVybiByPj1hP3U6dSooImRlc2MiPT1uW3JdPy0xOjEpfXJldHVybiB0LmluZGV4LWUuaW5kZXh9KHQsZSxuKX0pKX1mdW5jdGlvbiBXcih0LGUsbil7Zm9yKHZhciByPS0xLGk9ZS5sZW5ndGgsbz17fTsrK3I8aTspe3ZhciBzPWVbcl0sYT1Dcih0LHMpO24oYSxzKSYmZWkobyx3aShzLHQpLGEpfXJldHVybiBvfWZ1bmN0aW9uIEhyKHQsZSxuLHIpe3ZhciBpPXI/WWU6R2Usbz0tMSxzPWUubGVuZ3RoLGE9dDtmb3IodD09PWUmJihlPUZpKGUpKSxuJiYoYT1SZSh0LHRuKG4pKSk7KytvPHM7KWZvcih2YXIgdT0wLGM9ZVtvXSxsPW4/bihjKTpjOyh1PWkoYSxsLHUscikpPi0xOylhIT09dCYmUXQuY2FsbChhLHUsMSksUXQuY2FsbCh0LHUsMSk7cmV0dXJuIHR9ZnVuY3Rpb24gWnIodCxlKXtmb3IodmFyIG49dD9lLmxlbmd0aDowLHI9bi0xO24tLTspe3ZhciBpPWVbbl07aWYobj09cnx8aSE9PW8pe3ZhciBvPWk7d28oaSk/UXQuY2FsbCh0LGksMSk6cGkodCxpKX19cmV0dXJuIHR9ZnVuY3Rpb24gS3IodCxlKXtyZXR1cm4gdCt2ZShFbigpKihlLXQrMSkpfWZ1bmN0aW9uIEpyKHQsZSl7dmFyIG49IiI7aWYoIXR8fGU8MXx8ZT5mKXJldHVybiBuO2Rve2UlMiYmKG4rPXQpLChlPXZlKGUvMikpJiYodCs9dCl9d2hpbGUoZSk7cmV0dXJuIG59ZnVuY3Rpb24gUXIodCxlKXtyZXR1cm4gTG8oSW8odCxlLG91KSx0KyIiKX1mdW5jdGlvbiAkcih0KXtyZXR1cm4gJG4ocWEodCkpfWZ1bmN0aW9uIHRpKHQsZSl7dmFyIG49cWEodCk7cmV0dXJuIEJvKG4sY3IoZSwwLG4ubGVuZ3RoKSl9ZnVuY3Rpb24gZWkodCxlLHIsaSl7aWYoIW5hKHQpKXJldHVybiB0O2Zvcih2YXIgbz0tMSxzPShlPXdpKGUsdCkpLmxlbmd0aCxhPXMtMSx1PXQ7bnVsbCE9dSYmKytvPHM7KXt2YXIgYz16byhlW29dKSxsPXI7aWYoIl9fcHJvdG9fXyI9PT1jfHwiY29uc3RydWN0b3IiPT09Y3x8InByb3RvdHlwZSI9PT1jKXJldHVybiB0O2lmKG8hPWEpe3ZhciBoPXVbY107KGw9aT9pKGgsYyx1KTpuKT09PW4mJihsPW5hKGgpP2g6d28oZVtvKzFdKT9bXTp7fSl9cnIodSxjLGwpLHU9dVtjXX1yZXR1cm4gdH12YXIgbmk9VG4/ZnVuY3Rpb24odCxlKXtyZXR1cm4gVG4uc2V0KHQsZSksdH06b3Uscmk9b2U/ZnVuY3Rpb24odCxlKXtyZXR1cm4gb2UodCwidG9TdHJpbmciLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMSx2YWx1ZTpudShlKSx3cml0YWJsZTohMH0pfTpvdTtmdW5jdGlvbiBpaSh0KXtyZXR1cm4gQm8ocWEodCkpfWZ1bmN0aW9uIG9pKHQsZSxuKXt2YXIgcj0tMSxpPXQubGVuZ3RoO2U8MCYmKGU9LWU+aT8wOmkrZSksKG49bj5pP2k6bik8MCYmKG4rPWkpLGk9ZT5uPzA6bi1lPj4+MCxlPj4+PTA7Zm9yKHZhciBvPUV0KGkpOysrcjxpOylvW3JdPXRbcitlXTtyZXR1cm4gb31mdW5jdGlvbiBzaSh0LGUpe3ZhciBuO3JldHVybiBkcih0LChmdW5jdGlvbih0LHIsaSl7cmV0dXJuIShuPWUodCxyLGkpKX0pKSwhIW59ZnVuY3Rpb24gYWkodCxlLG4pe3ZhciByPTAsaT1udWxsPT10P3I6dC5sZW5ndGg7aWYoIm51bWJlciI9PXR5cGVvZiBlJiZlPT1lJiZpPD15KXtmb3IoO3I8aTspe3ZhciBvPXIraT4+PjEscz10W29dO251bGwhPT1zJiYhbGEocykmJihuP3M8PWU6czxlKT9yPW8rMTppPW99cmV0dXJuIGl9cmV0dXJuIHVpKHQsZSxvdSxuKX1mdW5jdGlvbiB1aSh0LGUscixpKXt2YXIgbz0wLHM9bnVsbD09dD8wOnQubGVuZ3RoO2lmKDA9PT1zKXJldHVybiAwO2Zvcih2YXIgYT0oZT1yKGUpKSE9ZSx1PW51bGw9PT1lLGM9bGEoZSksbD1lPT09bjtvPHM7KXt2YXIgaD12ZSgobytzKS8yKSxmPXIodFtoXSkscD1mIT09bixkPW51bGw9PT1mLHk9Zj09ZixtPWxhKGYpO2lmKGEpdmFyIHY9aXx8eTtlbHNlIHY9bD95JiYoaXx8cCk6dT95JiZwJiYoaXx8IWQpOmM/eSYmcCYmIWQmJihpfHwhbSk6IWQmJiFtJiYoaT9mPD1lOmY8ZSk7dj9vPWgrMTpzPWh9cmV0dXJuIHduKHMsZyl9ZnVuY3Rpb24gY2kodCxlKXtmb3IodmFyIG49LTEscj10Lmxlbmd0aCxpPTAsbz1bXTsrK248cjspe3ZhciBzPXRbbl0sYT1lP2Uocyk6cztpZighbnx8IXFzKGEsdSkpe3ZhciB1PWE7b1tpKytdPTA9PT1zPzA6c319cmV0dXJuIG99ZnVuY3Rpb24gbGkodCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3Q6bGEodCk/cDordH1mdW5jdGlvbiBoaSh0KXtpZigic3RyaW5nIj09dHlwZW9mIHQpcmV0dXJuIHQ7aWYoWHModCkpcmV0dXJuIFJlKHQsaGkpKyIiO2lmKGxhKHQpKXJldHVybiBVbj9Vbi5jYWxsKHQpOiIiO3ZhciBlPXQrIiI7cmV0dXJuIjAiPT1lJiYxL3Q9PS1oPyItMCI6ZX1mdW5jdGlvbiBmaSh0LGUsbil7dmFyIHI9LTEsaT1MZSxvPXQubGVuZ3RoLHM9ITAsYT1bXSx1PWE7aWYobilzPSExLGk9UGU7ZWxzZSBpZihvPj0yMDApe3ZhciBjPWU/bnVsbDpKaSh0KTtpZihjKXJldHVybiBwbihjKTtzPSExLGk9bm4sdT1uZXcgS259ZWxzZSB1PWU/W106YTt0OmZvcig7KytyPG87KXt2YXIgbD10W3JdLGg9ZT9lKGwpOmw7aWYobD1ufHwwIT09bD9sOjAscyYmaD09aCl7Zm9yKHZhciBmPXUubGVuZ3RoO2YtLTspaWYodVtmXT09PWgpY29udGludWUgdDtlJiZ1LnB1c2goaCksYS5wdXNoKGwpfWVsc2UgaSh1LGgsbil8fCh1IT09YSYmdS5wdXNoKGgpLGEucHVzaChsKSl9cmV0dXJuIGF9ZnVuY3Rpb24gcGkodCxlKXtyZXR1cm4gbnVsbD09KHQ9TW8odCxlPXdpKGUsdCkpKXx8ZGVsZXRlIHRbem8oUW8oZSkpXX1mdW5jdGlvbiBkaSh0LGUsbixyKXtyZXR1cm4gZWkodCxlLG4oQ3IodCxlKSkscil9ZnVuY3Rpb24gZ2kodCxlLG4scil7Zm9yKHZhciBpPXQubGVuZ3RoLG89cj9pOi0xOyhyP28tLTorK288aSkmJmUodFtvXSxvLHQpOyk7cmV0dXJuIG4/b2kodCxyPzA6byxyP28rMTppKTpvaSh0LHI/bysxOjAscj9pOm8pfWZ1bmN0aW9uIHlpKHQsZSl7dmFyIG49dDtyZXR1cm4gbiBpbnN0YW5jZW9mIFhuJiYobj1uLnZhbHVlKCkpLGtlKGUsKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUuZnVuYy5hcHBseShlLnRoaXNBcmcsQmUoW3RdLGUuYXJncykpfSksbil9ZnVuY3Rpb24gbWkodCxlLG4pe3ZhciByPXQubGVuZ3RoO2lmKHI8MilyZXR1cm4gcj9maSh0WzBdKTpbXTtmb3IodmFyIGk9LTEsbz1FdChyKTsrK2k8cjspZm9yKHZhciBzPXRbaV0sYT0tMTsrK2E8cjspYSE9aSYmKG9baV09cHIob1tpXXx8cyx0W2FdLGUsbikpO3JldHVybiBmaShfcihvLDEpLGUsbil9ZnVuY3Rpb24gdmkodCxlLHIpe2Zvcih2YXIgaT0tMSxvPXQubGVuZ3RoLHM9ZS5sZW5ndGgsYT17fTsrK2k8bzspe3ZhciB1PWk8cz9lW2ldOm47cihhLHRbaV0sdSl9cmV0dXJuIGF9ZnVuY3Rpb24gX2kodCl7cmV0dXJuIFpzKHQpP3Q6W119ZnVuY3Rpb24geGkodCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpvdX1mdW5jdGlvbiB3aSh0LGUpe3JldHVybiBYcyh0KT90OkRvKHQsZSk/W3RdOmtvKHhhKHQpKX12YXIgYmk9UXI7ZnVuY3Rpb24gRGkodCxlLHIpe3ZhciBpPXQubGVuZ3RoO3JldHVybiByPXI9PT1uP2k6ciwhZSYmcj49aT90Om9pKHQsZSxyKX12YXIgRWk9aGV8fGZ1bmN0aW9uKHQpe3JldHVybiB5ZS5jbGVhclRpbWVvdXQodCl9O2Z1bmN0aW9uIENpKHQsZSl7aWYoZSlyZXR1cm4gdC5zbGljZSgpO3ZhciBuPXQubGVuZ3RoLHI9SHQ/SHQobik6bmV3IHQuY29uc3RydWN0b3Iobik7cmV0dXJuIHQuY29weShyKSxyfWZ1bmN0aW9uIFNpKHQpe3ZhciBlPW5ldyB0LmNvbnN0cnVjdG9yKHQuYnl0ZUxlbmd0aCk7cmV0dXJuIG5ldyBXdChlKS5zZXQobmV3IFd0KHQpKSxlfWZ1bmN0aW9uIEFpKHQsZSl7dmFyIG49ZT9TaSh0LmJ1ZmZlcik6dC5idWZmZXI7cmV0dXJuIG5ldyB0LmNvbnN0cnVjdG9yKG4sdC5ieXRlT2Zmc2V0LHQubGVuZ3RoKX1mdW5jdGlvbiBOaSh0LGUpe2lmKHQhPT1lKXt2YXIgcj10IT09bixpPW51bGw9PT10LG89dD09dCxzPWxhKHQpLGE9ZSE9PW4sdT1udWxsPT09ZSxjPWU9PWUsbD1sYShlKTtpZighdSYmIWwmJiFzJiZ0PmV8fHMmJmEmJmMmJiF1JiYhbHx8aSYmYSYmY3x8IXImJmN8fCFvKXJldHVybiAxO2lmKCFpJiYhcyYmIWwmJnQ8ZXx8bCYmciYmbyYmIWkmJiFzfHx1JiZyJiZvfHwhYSYmb3x8IWMpcmV0dXJuLTF9cmV0dXJuIDB9ZnVuY3Rpb24gSWkodCxlLG4scil7Zm9yKHZhciBpPS0xLG89dC5sZW5ndGgscz1uLmxlbmd0aCxhPS0xLHU9ZS5sZW5ndGgsYz14bihvLXMsMCksbD1FdCh1K2MpLGg9IXI7KythPHU7KWxbYV09ZVthXTtmb3IoOysraTxzOykoaHx8aTxvKSYmKGxbbltpXV09dFtpXSk7Zm9yKDtjLS07KWxbYSsrXT10W2krK107cmV0dXJuIGx9ZnVuY3Rpb24gTWkodCxlLG4scil7Zm9yKHZhciBpPS0xLG89dC5sZW5ndGgscz0tMSxhPW4ubGVuZ3RoLHU9LTEsYz1lLmxlbmd0aCxsPXhuKG8tYSwwKSxoPUV0KGwrYyksZj0hcjsrK2k8bDspaFtpXT10W2ldO2Zvcih2YXIgcD1pOysrdTxjOyloW3ArdV09ZVt1XTtmb3IoOysrczxhOykoZnx8aTxvKSYmKGhbcCtuW3NdXT10W2krK10pO3JldHVybiBofWZ1bmN0aW9uIEZpKHQsZSl7dmFyIG49LTEscj10Lmxlbmd0aDtmb3IoZXx8KGU9RXQocikpOysrbjxyOyllW25dPXRbbl07cmV0dXJuIGV9ZnVuY3Rpb24gVGkodCxlLHIsaSl7dmFyIG89IXI7cnx8KHI9e30pO2Zvcih2YXIgcz0tMSxhPWUubGVuZ3RoOysrczxhOyl7dmFyIHU9ZVtzXSxjPWk/aShyW3VdLHRbdV0sdSxyLHQpOm47Yz09PW4mJihjPXRbdV0pLG8/YXIocix1LGMpOnJyKHIsdSxjKX1yZXR1cm4gcn1mdW5jdGlvbiBPaSh0LGUpe3JldHVybiBmdW5jdGlvbihuLHIpe3ZhciBpPVhzKG4pP0llOm9yLG89ZT9lKCk6e307cmV0dXJuIGkobix0LGxvKHIsMiksbyl9fWZ1bmN0aW9uIExpKHQpe3JldHVybiBRcigoZnVuY3Rpb24oZSxyKXt2YXIgaT0tMSxvPXIubGVuZ3RoLHM9bz4xP3Jbby0xXTpuLGE9bz4yP3JbMl06bjtmb3Iocz10Lmxlbmd0aD4zJiYiZnVuY3Rpb24iPT10eXBlb2Ygcz8oby0tLHMpOm4sYSYmYm8oclswXSxyWzFdLGEpJiYocz1vPDM/bjpzLG89MSksZT1JdChlKTsrK2k8bzspe3ZhciB1PXJbaV07dSYmdChlLHUsaSxzKX1yZXR1cm4gZX0pKX1mdW5jdGlvbiBQaSh0LGUpe3JldHVybiBmdW5jdGlvbihuLHIpe2lmKG51bGw9PW4pcmV0dXJuIG47aWYoIUhzKG4pKXJldHVybiB0KG4scik7Zm9yKHZhciBpPW4ubGVuZ3RoLG89ZT9pOi0xLHM9SXQobik7KGU/by0tOisrbzxpKSYmITEhPT1yKHNbb10sbyxzKTspO3JldHVybiBufX1mdW5jdGlvbiBSaSh0KXtyZXR1cm4gZnVuY3Rpb24oZSxuLHIpe2Zvcih2YXIgaT0tMSxvPUl0KGUpLHM9cihlKSxhPXMubGVuZ3RoO2EtLTspe3ZhciB1PXNbdD9hOisraV07aWYoITE9PT1uKG9bdV0sdSxvKSlicmVha31yZXR1cm4gZX19ZnVuY3Rpb24gQmkodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciByPWNuKGU9eGEoZSkpP2duKGUpOm4saT1yP3JbMF06ZS5jaGFyQXQoMCksbz1yP0RpKHIsMSkuam9pbigiIik6ZS5zbGljZSgxKTtyZXR1cm4gaVt0XSgpK299fWZ1bmN0aW9uIGtpKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4ga2UoJGEoWWEoZSkucmVwbGFjZShlZSwiIikpLHQsIiIpfX1mdW5jdGlvbiB6aSh0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT1hcmd1bWVudHM7c3dpdGNoKGUubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIG5ldyB0O2Nhc2UgMTpyZXR1cm4gbmV3IHQoZVswXSk7Y2FzZSAyOnJldHVybiBuZXcgdChlWzBdLGVbMV0pO2Nhc2UgMzpyZXR1cm4gbmV3IHQoZVswXSxlWzFdLGVbMl0pO2Nhc2UgNDpyZXR1cm4gbmV3IHQoZVswXSxlWzFdLGVbMl0sZVszXSk7Y2FzZSA1OnJldHVybiBuZXcgdChlWzBdLGVbMV0sZVsyXSxlWzNdLGVbNF0pO2Nhc2UgNjpyZXR1cm4gbmV3IHQoZVswXSxlWzFdLGVbMl0sZVszXSxlWzRdLGVbNV0pO2Nhc2UgNzpyZXR1cm4gbmV3IHQoZVswXSxlWzFdLGVbMl0sZVszXSxlWzRdLGVbNV0sZVs2XSl9dmFyIG49Vm4odC5wcm90b3R5cGUpLHI9dC5hcHBseShuLGUpO3JldHVybiBuYShyKT9yOm59fWZ1bmN0aW9uIGppKHQpe3JldHVybiBmdW5jdGlvbihlLHIsaSl7dmFyIG89SXQoZSk7aWYoIUhzKGUpKXt2YXIgcz1sbyhyLDMpO2U9T2EoZSkscj1mdW5jdGlvbih0KXtyZXR1cm4gcyhvW3RdLHQsbyl9fXZhciBhPXQoZSxyLGkpO3JldHVybiBhPi0xP29bcz9lW2FdOmFdOm59fWZ1bmN0aW9uIFVpKHQpe3JldHVybiBpbygoZnVuY3Rpb24oZSl7dmFyIGk9ZS5sZW5ndGgsbz1pLHM9WW4ucHJvdG90eXBlLnRocnU7Zm9yKHQmJmUucmV2ZXJzZSgpO28tLTspe3ZhciBhPWVbb107aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGEpdGhyb3cgbmV3IFR0KHIpO2lmKHMmJiF1JiYid3JhcHBlciI9PXVvKGEpKXZhciB1PW5ldyBZbihbXSwhMCl9Zm9yKG89dT9vOmk7KytvPGk7KXt2YXIgYz11byhhPWVbb10pLGw9IndyYXBwZXIiPT1jP2FvKGEpOm47dT1sJiZFbyhsWzBdKSYmNDI0PT1sWzFdJiYhbFs0XS5sZW5ndGgmJjE9PWxbOV0/dVt1byhsWzBdKV0uYXBwbHkodSxsWzNdKToxPT1hLmxlbmd0aCYmRW8oYSk/dVtjXSgpOnUudGhydShhKX1yZXR1cm4gZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHMsbj10WzBdO2lmKHUmJjE9PXQubGVuZ3RoJiZYcyhuKSlyZXR1cm4gdS5wbGFudChuKS52YWx1ZSgpO2Zvcih2YXIgcj0wLG89aT9lW3JdLmFwcGx5KHRoaXMsdCk6bjsrK3I8aTspbz1lW3JdLmNhbGwodGhpcyxvKTtyZXR1cm4gb319KSl9ZnVuY3Rpb24gcWkodCxlLHIsaSxvLHMsYSx1LGwsaCl7dmFyIGY9ZSZjLHA9MSZlLGQ9MiZlLGc9MjQmZSx5PTUxMiZlLG09ZD9uOnppKHQpO3JldHVybiBmdW5jdGlvbiBjKCl7Zm9yKHZhciB2PWFyZ3VtZW50cy5sZW5ndGgsXz1FdCh2KSx4PXY7eC0tOylfW3hdPWFyZ3VtZW50c1t4XTtpZihnKXZhciB3PWNvKGMpLGI9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dC5sZW5ndGgscj0wO24tLTspdFtuXT09PWUmJisrcjtyZXR1cm4gcn0oXyx3KTtpZihpJiYoXz1JaShfLGksbyxnKSkscyYmKF89TWkoXyxzLGEsZykpLHYtPWIsZyYmdjxoKXt2YXIgRD1mbihfLHcpO3JldHVybiBaaSh0LGUscWksYy5wbGFjZWhvbGRlcixyLF8sRCx1LGwsaC12KX12YXIgRT1wP3I6dGhpcyxDPWQ/RVt0XTp0O3JldHVybiB2PV8ubGVuZ3RoLHU/Xz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj10Lmxlbmd0aCxpPXduKGUubGVuZ3RoLHIpLG89RmkodCk7aS0tOyl7dmFyIHM9ZVtpXTt0W2ldPXdvKHMscik/b1tzXTpufXJldHVybiB0fShfLHUpOnkmJnY+MSYmXy5yZXZlcnNlKCksZiYmbDx2JiYoXy5sZW5ndGg9bCksdGhpcyYmdGhpcyE9PXllJiZ0aGlzIGluc3RhbmNlb2YgYyYmKEM9bXx8emkoQykpLEMuYXBwbHkoRSxfKX19ZnVuY3Rpb24gVmkodCxlKXtyZXR1cm4gZnVuY3Rpb24obixyKXtyZXR1cm4gZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIGJyKHQsKGZ1bmN0aW9uKHQsaSxvKXtlKHIsbih0KSxpLG8pfSkpLHJ9KG4sdCxlKHIpLHt9KX19ZnVuY3Rpb24gR2kodCxlKXtyZXR1cm4gZnVuY3Rpb24ocixpKXt2YXIgbztpZihyPT09biYmaT09PW4pcmV0dXJuIGU7aWYociE9PW4mJihvPXIpLGkhPT1uKXtpZihvPT09bilyZXR1cm4gaTsic3RyaW5nIj09dHlwZW9mIHJ8fCJzdHJpbmciPT10eXBlb2YgaT8ocj1oaShyKSxpPWhpKGkpKToocj1saShyKSxpPWxpKGkpKSxvPXQocixpKX1yZXR1cm4gb319ZnVuY3Rpb24gWWkodCl7cmV0dXJuIGlvKChmdW5jdGlvbihlKXtyZXR1cm4gZT1SZShlLHRuKGxvKCkpKSxRcigoZnVuY3Rpb24obil7dmFyIHI9dGhpcztyZXR1cm4gdChlLChmdW5jdGlvbih0KXtyZXR1cm4gTmUodCxyLG4pfSkpfSkpfSkpfWZ1bmN0aW9uIFhpKHQsZSl7dmFyIHI9KGU9ZT09PW4/IiAiOmhpKGUpKS5sZW5ndGg7aWYocjwyKXJldHVybiByP0pyKGUsdCk6ZTt2YXIgaT1KcihlLG1lKHQvZG4oZSkpKTtyZXR1cm4gY24oZSk/RGkoZ24oaSksMCx0KS5qb2luKCIiKTppLnNsaWNlKDAsdCl9ZnVuY3Rpb24gV2kodCl7cmV0dXJuIGZ1bmN0aW9uKGUscixpKXtyZXR1cm4gaSYmIm51bWJlciIhPXR5cGVvZiBpJiZibyhlLHIsaSkmJihyPWk9biksZT1nYShlKSxyPT09bj8ocj1lLGU9MCk6cj1nYShyKSxmdW5jdGlvbih0LGUsbixyKXtmb3IodmFyIGk9LTEsbz14bihtZSgoZS10KS8obnx8MSkpLDApLHM9RXQobyk7by0tOylzW3I/bzorK2ldPXQsdCs9bjtyZXR1cm4gc30oZSxyLGk9aT09PW4/ZTxyPzE6LTE6Z2EoaSksdCl9fWZ1bmN0aW9uIEhpKHQpe3JldHVybiBmdW5jdGlvbihlLG4pe3JldHVybiJzdHJpbmciPT10eXBlb2YgZSYmInN0cmluZyI9PXR5cGVvZiBufHwoZT12YShlKSxuPXZhKG4pKSx0KGUsbil9fWZ1bmN0aW9uIFppKHQsZSxyLGksbyxzLGMsbCxoLGYpe3ZhciBwPTgmZTtlfD1wP2E6dSw0JihlJj1+KHA/dTphKSl8fChlJj0tNCk7dmFyIGQ9W3QsZSxvLHA/czpuLHA/YzpuLHA/bjpzLHA/bjpjLGwsaCxmXSxnPXIuYXBwbHkobixkKTtyZXR1cm4gRW8odCkmJlRvKGcsZCksZy5wbGFjZWhvbGRlcj1pLFBvKGcsdCxlKX1mdW5jdGlvbiBLaSh0KXt2YXIgZT1OdFt0XTtyZXR1cm4gZnVuY3Rpb24odCxuKXtpZih0PXZhKHQpLChuPW51bGw9PW4/MDp3bih5YShuKSwyOTIpKSYmVWUodCkpe3ZhciByPSh4YSh0KSsiZSIpLnNwbGl0KCJlIik7cmV0dXJuKygocj0oeGEoZShyWzBdKyJlIisoK3JbMV0rbikpKSsiZSIpLnNwbGl0KCJlIikpWzBdKyJlIisoK3JbMV0tbikpfXJldHVybiBlKHQpfX12YXIgSmk9SW4mJjEvcG4obmV3IEluKFssLTBdKSlbMV09PWg/ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBJbih0KX06bHU7ZnVuY3Rpb24gUWkodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciBuPW1vKGUpO3JldHVybiBuPT1DP2xuKGUpOm49PU0/ZnVuY3Rpb24odCl7dmFyIGU9LTEsbj1BcnJheSh0LnNpemUpO3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQpe25bKytlXT1bdCx0XX0pKSxufShlKTpmdW5jdGlvbih0LGUpe3JldHVybiBSZShlLChmdW5jdGlvbihlKXtyZXR1cm5bZSx0W2VdXX0pKX0oZSx0KGUpKX19ZnVuY3Rpb24gJGkodCxlLGksaCxmLHAsZCxnKXt2YXIgeT0yJmU7aWYoIXkmJiJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBUdChyKTt2YXIgbT1oP2gubGVuZ3RoOjA7aWYobXx8KGUmPS05NyxoPWY9biksZD1kPT09bj9kOnhuKHlhKGQpLDApLGc9Zz09PW4/Zzp5YShnKSxtLT1mP2YubGVuZ3RoOjAsZSZ1KXt2YXIgdj1oLF89ZjtoPWY9bn12YXIgeD15P246YW8odCksdz1bdCxlLGksaCxmLHYsXyxwLGQsZ107aWYoeCYmZnVuY3Rpb24odCxlKXt2YXIgbj10WzFdLHI9ZVsxXSxpPW58cixzPWk8MTMxLGE9cj09YyYmOD09bnx8cj09YyYmbj09bCYmdFs3XS5sZW5ndGg8PWVbOF18fDM4ND09ciYmZVs3XS5sZW5ndGg8PWVbOF0mJjg9PW47aWYoIXMmJiFhKXJldHVybiB0OzEmciYmKHRbMl09ZVsyXSxpfD0xJm4/MDo0KTt2YXIgdT1lWzNdO2lmKHUpe3ZhciBoPXRbM107dFszXT1oP0lpKGgsdSxlWzRdKTp1LHRbNF09aD9mbih0WzNdLG8pOmVbNF19dT1lWzVdLHUmJihoPXRbNV0sdFs1XT1oP01pKGgsdSxlWzZdKTp1LHRbNl09aD9mbih0WzVdLG8pOmVbNl0pLHU9ZVs3XSx1JiYodFs3XT11KSxyJmMmJih0WzhdPW51bGw9PXRbOF0/ZVs4XTp3bih0WzhdLGVbOF0pKSxudWxsPT10WzldJiYodFs5XT1lWzldKSx0WzBdPWVbMF0sdFsxXT1pfSh3LHgpLHQ9d1swXSxlPXdbMV0saT13WzJdLGg9d1szXSxmPXdbNF0sIShnPXdbOV09d1s5XT09PW4/eT8wOnQubGVuZ3RoOnhuKHdbOV0tbSwwKSkmJjI0JmUmJihlJj0tMjUpLGUmJjEhPWUpYj04PT1lfHxlPT1zP2Z1bmN0aW9uKHQsZSxyKXt2YXIgaT16aSh0KTtyZXR1cm4gZnVuY3Rpb24gbygpe2Zvcih2YXIgcz1hcmd1bWVudHMubGVuZ3RoLGE9RXQocyksdT1zLGM9Y28obyk7dS0tOylhW3VdPWFyZ3VtZW50c1t1XTt2YXIgbD1zPDMmJmFbMF0hPT1jJiZhW3MtMV0hPT1jP1tdOmZuKGEsYyk7cmV0dXJuKHMtPWwubGVuZ3RoKTxyP1ppKHQsZSxxaSxvLnBsYWNlaG9sZGVyLG4sYSxsLG4sbixyLXMpOk5lKHRoaXMmJnRoaXMhPT15ZSYmdGhpcyBpbnN0YW5jZW9mIG8/aTp0LHRoaXMsYSl9fSh0LGUsZyk6ZSE9YSYmMzMhPWV8fGYubGVuZ3RoP3FpLmFwcGx5KG4sdyk6ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9MSZlLG89emkodCk7cmV0dXJuIGZ1bmN0aW9uIGUoKXtmb3IodmFyIHM9LTEsYT1hcmd1bWVudHMubGVuZ3RoLHU9LTEsYz1yLmxlbmd0aCxsPUV0KGMrYSksaD10aGlzJiZ0aGlzIT09eWUmJnRoaXMgaW5zdGFuY2VvZiBlP286dDsrK3U8YzspbFt1XT1yW3VdO2Zvcig7YS0tOylsW3UrK109YXJndW1lbnRzWysrc107cmV0dXJuIE5lKGgsaT9uOnRoaXMsbCl9fSh0LGUsaSxoKTtlbHNlIHZhciBiPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj0xJmUsaT16aSh0KTtyZXR1cm4gZnVuY3Rpb24gZSgpe3JldHVybih0aGlzJiZ0aGlzIT09eWUmJnRoaXMgaW5zdGFuY2VvZiBlP2k6dCkuYXBwbHkocj9uOnRoaXMsYXJndW1lbnRzKX19KHQsZSxpKTtyZXR1cm4gUG8oKHg/bmk6VG8pKGIsdyksdCxlKX1mdW5jdGlvbiB0byh0LGUscixpKXtyZXR1cm4gdD09PW58fHFzKHQsUHRbcl0pJiYha3QuY2FsbChpLHIpP2U6dH1mdW5jdGlvbiBlbyh0LGUscixpLG8scyl7cmV0dXJuIG5hKHQpJiZuYShlKSYmKHMuc2V0KGUsdCksR3IodCxlLG4sZW8scykscy5kZWxldGUoZSkpLHR9ZnVuY3Rpb24gbm8odCl7cmV0dXJuIHNhKHQpP246dH1mdW5jdGlvbiBybyh0LGUscixpLG8scyl7dmFyIGE9MSZyLHU9dC5sZW5ndGgsYz1lLmxlbmd0aDtpZih1IT1jJiYhKGEmJmM+dSkpcmV0dXJuITE7dmFyIGw9cy5nZXQodCksaD1zLmdldChlKTtpZihsJiZoKXJldHVybiBsPT1lJiZoPT10O3ZhciBmPS0xLHA9ITAsZD0yJnI/bmV3IEtuOm47Zm9yKHMuc2V0KHQsZSkscy5zZXQoZSx0KTsrK2Y8dTspe3ZhciBnPXRbZl0seT1lW2ZdO2lmKGkpdmFyIG09YT9pKHksZyxmLGUsdCxzKTppKGcseSxmLHQsZSxzKTtpZihtIT09bil7aWYobSljb250aW51ZTtwPSExO2JyZWFrfWlmKGQpe2lmKCFqZShlLChmdW5jdGlvbih0LGUpe2lmKCFubihkLGUpJiYoZz09PXR8fG8oZyx0LHIsaSxzKSkpcmV0dXJuIGQucHVzaChlKX0pKSl7cD0hMTticmVha319ZWxzZSBpZihnIT09eSYmIW8oZyx5LHIsaSxzKSl7cD0hMTticmVha319cmV0dXJuIHMuZGVsZXRlKHQpLHMuZGVsZXRlKGUpLHB9ZnVuY3Rpb24gaW8odCl7cmV0dXJuIExvKElvKHQsbixXbyksdCsiIil9ZnVuY3Rpb24gb28odCl7cmV0dXJuIFNyKHQsT2EsZ28pfWZ1bmN0aW9uIHNvKHQpe3JldHVybiBTcih0LExhLHlvKX12YXIgYW89VG4/ZnVuY3Rpb24odCl7cmV0dXJuIFRuLmdldCh0KX06bHU7ZnVuY3Rpb24gdW8odCl7Zm9yKHZhciBlPXQubmFtZSsiIixuPU9uW2VdLHI9a3QuY2FsbChPbixlKT9uLmxlbmd0aDowO3ItLTspe3ZhciBpPW5bcl0sbz1pLmZ1bmM7aWYobnVsbD09b3x8bz09dClyZXR1cm4gaS5uYW1lfXJldHVybiBlfWZ1bmN0aW9uIGNvKHQpe3JldHVybihrdC5jYWxsKHFuLCJwbGFjZWhvbGRlciIpP3FuOnQpLnBsYWNlaG9sZGVyfWZ1bmN0aW9uIGxvKCl7dmFyIHQ9cW4uaXRlcmF0ZWV8fHN1O3JldHVybiB0PXQ9PT1zdT9Ccjp0LGFyZ3VtZW50cy5sZW5ndGg/dChhcmd1bWVudHNbMF0sYXJndW1lbnRzWzFdKTp0fWZ1bmN0aW9uIGhvKHQsZSl7dmFyIG49dC5fX2RhdGFfXztyZXR1cm4gZnVuY3Rpb24odCl7dmFyIGU9dHlwZW9mIHQ7cmV0dXJuInN0cmluZyI9PWV8fCJudW1iZXIiPT1lfHwic3ltYm9sIj09ZXx8ImJvb2xlYW4iPT1lPyJfX3Byb3RvX18iIT09dDpudWxsPT09dH0oZSk/blsic3RyaW5nIj09dHlwZW9mIGU/InN0cmluZyI6Imhhc2giXTpuLm1hcH1mdW5jdGlvbiBmbyh0KXtmb3IodmFyIGU9T2EodCksbj1lLmxlbmd0aDtuLS07KXt2YXIgcj1lW25dLGk9dFtyXTtlW25dPVtyLGksQW8oaSldfXJldHVybiBlfWZ1bmN0aW9uIHBvKHQsZSl7dmFyIHI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09dD9uOnRbZV19KHQsZSk7cmV0dXJuIFJyKHIpP3I6bn12YXIgZ289eGU/ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/W106KHQ9SXQodCksT2UoeGUodCksKGZ1bmN0aW9uKGUpe3JldHVybiBKdC5jYWxsKHQsZSl9KSkpfTptdSx5bz14ZT9mdW5jdGlvbih0KXtmb3IodmFyIGU9W107dDspQmUoZSxnbyh0KSksdD1adCh0KTtyZXR1cm4gZX06bXUsbW89QXI7ZnVuY3Rpb24gdm8odCxlLG4pe2Zvcih2YXIgcj0tMSxpPShlPXdpKGUsdCkpLmxlbmd0aCxvPSExOysrcjxpOyl7dmFyIHM9em8oZVtyXSk7aWYoIShvPW51bGwhPXQmJm4odCxzKSkpYnJlYWs7dD10W3NdfXJldHVybiBvfHwrK3IhPWk/bzohIShpPW51bGw9PXQ/MDp0Lmxlbmd0aCkmJmVhKGkpJiZ3byhzLGkpJiYoWHModCl8fFlzKHQpKX1mdW5jdGlvbiBfbyh0KXtyZXR1cm4iZnVuY3Rpb24iIT10eXBlb2YgdC5jb25zdHJ1Y3Rvcnx8U28odCk/e306Vm4oWnQodCkpfWZ1bmN0aW9uIHhvKHQpe3JldHVybiBYcyh0KXx8WXModCl8fCEhKCR0JiZ0JiZ0WyR0XSl9ZnVuY3Rpb24gd28odCxlKXt2YXIgbj10eXBlb2YgdDtyZXR1cm4hIShlPW51bGw9PWU/ZjplKSYmKCJudW1iZXIiPT1ufHwic3ltYm9sIiE9biYmeHQudGVzdCh0KSkmJnQ+LTEmJnQlMT09MCYmdDxlfWZ1bmN0aW9uIGJvKHQsZSxuKXtpZighbmEobikpcmV0dXJuITE7dmFyIHI9dHlwZW9mIGU7cmV0dXJuISEoIm51bWJlciI9PXI/SHMobikmJndvKGUsbi5sZW5ndGgpOiJzdHJpbmciPT1yJiZlIGluIG4pJiZxcyhuW2VdLHQpfWZ1bmN0aW9uIERvKHQsZSl7aWYoWHModCkpcmV0dXJuITE7dmFyIG49dHlwZW9mIHQ7cmV0dXJuISgibnVtYmVyIiE9biYmInN5bWJvbCIhPW4mJiJib29sZWFuIiE9biYmbnVsbCE9dCYmIWxhKHQpKXx8KG50LnRlc3QodCl8fCFldC50ZXN0KHQpfHxudWxsIT1lJiZ0IGluIEl0KGUpKX1mdW5jdGlvbiBFbyh0KXt2YXIgZT11byh0KSxuPXFuW2VdO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBufHwhKGUgaW4gWG4ucHJvdG90eXBlKSlyZXR1cm4hMTtpZih0PT09bilyZXR1cm4hMDt2YXIgcj1hbyhuKTtyZXR1cm4hIXImJnQ9PT1yWzBdfShTbiYmbW8obmV3IFNuKG5ldyBBcnJheUJ1ZmZlcigxKSkpIT1QfHxBbiYmbW8obmV3IEFuKSE9Q3x8Tm4mJm1vKE5uLnJlc29sdmUoKSkhPU58fEluJiZtbyhuZXcgSW4pIT1NfHxNbiYmbW8obmV3IE1uKSE9TykmJihtbz1mdW5jdGlvbih0KXt2YXIgZT1Bcih0KSxyPWU9PUE/dC5jb25zdHJ1Y3RvcjpuLGk9cj9qbyhyKToiIjtpZihpKXN3aXRjaChpKXtjYXNlIExuOnJldHVybiBQO2Nhc2UgUG46cmV0dXJuIEM7Y2FzZSBSbjpyZXR1cm4gTjtjYXNlIEJuOnJldHVybiBNO2Nhc2Uga246cmV0dXJuIE99cmV0dXJuIGV9KTt2YXIgQ289UnQ/JHM6dnU7ZnVuY3Rpb24gU28odCl7dmFyIGU9dCYmdC5jb25zdHJ1Y3RvcjtyZXR1cm4gdD09PSgiZnVuY3Rpb24iPT10eXBlb2YgZSYmZS5wcm90b3R5cGV8fFB0KX1mdW5jdGlvbiBBbyh0KXtyZXR1cm4gdD09dCYmIW5hKHQpfWZ1bmN0aW9uIE5vKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKHIpe3JldHVybiBudWxsIT1yJiYoclt0XT09PWUmJihlIT09bnx8dCBpbiBJdChyKSkpfX1mdW5jdGlvbiBJbyh0LGUscil7cmV0dXJuIGU9eG4oZT09PW4/dC5sZW5ndGgtMTplLDApLGZ1bmN0aW9uKCl7Zm9yKHZhciBuPWFyZ3VtZW50cyxpPS0xLG89eG4obi5sZW5ndGgtZSwwKSxzPUV0KG8pOysraTxvOylzW2ldPW5bZStpXTtpPS0xO2Zvcih2YXIgYT1FdChlKzEpOysraTxlOylhW2ldPW5baV07cmV0dXJuIGFbZV09cihzKSxOZSh0LHRoaXMsYSl9fWZ1bmN0aW9uIE1vKHQsZSl7cmV0dXJuIGUubGVuZ3RoPDI/dDpDcih0LG9pKGUsMCwtMSkpfWZ1bmN0aW9uIEZvKHQsZSl7aWYoKCJjb25zdHJ1Y3RvciIhPT1lfHwiZnVuY3Rpb24iIT10eXBlb2YgdFtlXSkmJiJfX3Byb3RvX18iIT1lKXJldHVybiB0W2VdfXZhciBUbz1SbyhuaSksT289Z2V8fGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHllLnNldFRpbWVvdXQodCxlKX0sTG89Um8ocmkpO2Z1bmN0aW9uIFBvKHQsZSxuKXt2YXIgcj1lKyIiO3JldHVybiBMbyh0LGZ1bmN0aW9uKHQsZSl7dmFyIG49ZS5sZW5ndGg7aWYoIW4pcmV0dXJuIHQ7dmFyIHI9bi0xO3JldHVybiBlW3JdPShuPjE/IiYgIjoiIikrZVtyXSxlPWUuam9pbihuPjI/IiwgIjoiICIpLHQucmVwbGFjZSh1dCwie1xuLyogW3dyYXBwZWQgd2l0aCAiK2UrIl0gKi9cbiIpfShyLGZ1bmN0aW9uKHQsZSl7cmV0dXJuIE1lKG0sKGZ1bmN0aW9uKG4pe3ZhciByPSJfLiIrblswXTtlJm5bMV0mJiFMZSh0LHIpJiZ0LnB1c2gocil9KSksdC5zb3J0KCl9KGZ1bmN0aW9uKHQpe3ZhciBlPXQubWF0Y2goY3QpO3JldHVybiBlP2VbMV0uc3BsaXQobHQpOltdfShyKSxuKSkpfWZ1bmN0aW9uIFJvKHQpe3ZhciBlPTAscj0wO3JldHVybiBmdW5jdGlvbigpe3ZhciBpPWJuKCksbz0xNi0oaS1yKTtpZihyPWksbz4wKXtpZigrK2U+PTgwMClyZXR1cm4gYXJndW1lbnRzWzBdfWVsc2UgZT0wO3JldHVybiB0LmFwcGx5KG4sYXJndW1lbnRzKX19ZnVuY3Rpb24gQm8odCxlKXt2YXIgcj0tMSxpPXQubGVuZ3RoLG89aS0xO2ZvcihlPWU9PT1uP2k6ZTsrK3I8ZTspe3ZhciBzPUtyKHIsbyksYT10W3NdO3Rbc109dFtyXSx0W3JdPWF9cmV0dXJuIHQubGVuZ3RoPWUsdH12YXIga289ZnVuY3Rpb24odCl7dmFyIGU9UnModCwoZnVuY3Rpb24odCl7cmV0dXJuIDUwMD09PW4uc2l6ZSYmbi5jbGVhcigpLHR9KSksbj1lLmNhY2hlO3JldHVybiBlfSgoZnVuY3Rpb24odCl7dmFyIGU9W107cmV0dXJuIDQ2PT09dC5jaGFyQ29kZUF0KDApJiZlLnB1c2goIiIpLHQucmVwbGFjZShydCwoZnVuY3Rpb24odCxuLHIsaSl7ZS5wdXNoKHI/aS5yZXBsYWNlKHB0LCIkMSIpOm58fHQpfSkpLGV9KSk7ZnVuY3Rpb24gem8odCl7aWYoInN0cmluZyI9PXR5cGVvZiB0fHxsYSh0KSlyZXR1cm4gdDt2YXIgZT10KyIiO3JldHVybiIwIj09ZSYmMS90PT0taD8iLTAiOmV9ZnVuY3Rpb24gam8odCl7aWYobnVsbCE9dCl7dHJ5e3JldHVybiBCdC5jYWxsKHQpfWNhdGNoKHQpe310cnl7cmV0dXJuIHQrIiJ9Y2F0Y2godCl7fX1yZXR1cm4iIn1mdW5jdGlvbiBVbyh0KXtpZih0IGluc3RhbmNlb2YgWG4pcmV0dXJuIHQuY2xvbmUoKTt2YXIgZT1uZXcgWW4odC5fX3dyYXBwZWRfXyx0Ll9fY2hhaW5fXyk7cmV0dXJuIGUuX19hY3Rpb25zX189RmkodC5fX2FjdGlvbnNfXyksZS5fX2luZGV4X189dC5fX2luZGV4X18sZS5fX3ZhbHVlc19fPXQuX192YWx1ZXNfXyxlfXZhciBxbz1RcigoZnVuY3Rpb24odCxlKXtyZXR1cm4gWnModCk/cHIodCxfcihlLDEsWnMsITApKTpbXX0pKSxWbz1RcigoZnVuY3Rpb24odCxlKXt2YXIgcj1RbyhlKTtyZXR1cm4gWnMocikmJihyPW4pLFpzKHQpP3ByKHQsX3IoZSwxLFpzLCEwKSxsbyhyLDIpKTpbXX0pKSxHbz1RcigoZnVuY3Rpb24odCxlKXt2YXIgcj1RbyhlKTtyZXR1cm4gWnMocikmJihyPW4pLFpzKHQpP3ByKHQsX3IoZSwxLFpzLCEwKSxuLHIpOltdfSkpO2Z1bmN0aW9uIFlvKHQsZSxuKXt2YXIgcj1udWxsPT10PzA6dC5sZW5ndGg7aWYoIXIpcmV0dXJuLTE7dmFyIGk9bnVsbD09bj8wOnlhKG4pO3JldHVybiBpPDAmJihpPXhuKHIraSwwKSksVmUodCxsbyhlLDMpLGkpfWZ1bmN0aW9uIFhvKHQsZSxyKXt2YXIgaT1udWxsPT10PzA6dC5sZW5ndGg7aWYoIWkpcmV0dXJuLTE7dmFyIG89aS0xO3JldHVybiByIT09biYmKG89eWEociksbz1yPDA/eG4oaStvLDApOnduKG8saS0xKSksVmUodCxsbyhlLDMpLG8sITApfWZ1bmN0aW9uIFdvKHQpe3JldHVybihudWxsPT10PzA6dC5sZW5ndGgpP19yKHQsMSk6W119ZnVuY3Rpb24gSG8odCl7cmV0dXJuIHQmJnQubGVuZ3RoP3RbMF06bn12YXIgWm89UXIoKGZ1bmN0aW9uKHQpe3ZhciBlPVJlKHQsX2kpO3JldHVybiBlLmxlbmd0aCYmZVswXT09PXRbMF0/RnIoZSk6W119KSksS289UXIoKGZ1bmN0aW9uKHQpe3ZhciBlPVFvKHQpLHI9UmUodCxfaSk7cmV0dXJuIGU9PT1RbyhyKT9lPW46ci5wb3AoKSxyLmxlbmd0aCYmclswXT09PXRbMF0/RnIocixsbyhlLDIpKTpbXX0pKSxKbz1RcigoZnVuY3Rpb24odCl7dmFyIGU9UW8odCkscj1SZSh0LF9pKTtyZXR1cm4oZT0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOm4pJiZyLnBvcCgpLHIubGVuZ3RoJiZyWzBdPT09dFswXT9GcihyLG4sZSk6W119KSk7ZnVuY3Rpb24gUW8odCl7dmFyIGU9bnVsbD09dD8wOnQubGVuZ3RoO3JldHVybiBlP3RbZS0xXTpufXZhciAkbz1Rcih0cyk7ZnVuY3Rpb24gdHModCxlKXtyZXR1cm4gdCYmdC5sZW5ndGgmJmUmJmUubGVuZ3RoP0hyKHQsZSk6dH12YXIgZXM9aW8oKGZ1bmN0aW9uKHQsZSl7dmFyIG49bnVsbD09dD8wOnQubGVuZ3RoLHI9dXIodCxlKTtyZXR1cm4gWnIodCxSZShlLChmdW5jdGlvbih0KXtyZXR1cm4gd28odCxuKT8rdDp0fSkpLnNvcnQoTmkpKSxyfSkpO2Z1bmN0aW9uIG5zKHQpe3JldHVybiBudWxsPT10P3Q6Q24uY2FsbCh0KX12YXIgcnM9UXIoKGZ1bmN0aW9uKHQpe3JldHVybiBmaShfcih0LDEsWnMsITApKX0pKSxpcz1RcigoZnVuY3Rpb24odCl7dmFyIGU9UW8odCk7cmV0dXJuIFpzKGUpJiYoZT1uKSxmaShfcih0LDEsWnMsITApLGxvKGUsMikpfSkpLG9zPVFyKChmdW5jdGlvbih0KXt2YXIgZT1Rbyh0KTtyZXR1cm4gZT0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOm4sZmkoX3IodCwxLFpzLCEwKSxuLGUpfSkpO2Z1bmN0aW9uIHNzKHQpe2lmKCF0fHwhdC5sZW5ndGgpcmV0dXJuW107dmFyIGU9MDtyZXR1cm4gdD1PZSh0LChmdW5jdGlvbih0KXtpZihacyh0KSlyZXR1cm4gZT14bih0Lmxlbmd0aCxlKSwhMH0pKSxRZShlLChmdW5jdGlvbihlKXtyZXR1cm4gUmUodCxIZShlKSl9KSl9ZnVuY3Rpb24gYXModCxlKXtpZighdHx8IXQubGVuZ3RoKXJldHVybltdO3ZhciByPXNzKHQpO3JldHVybiBudWxsPT1lP3I6UmUociwoZnVuY3Rpb24odCl7cmV0dXJuIE5lKGUsbix0KX0pKX12YXIgdXM9UXIoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIFpzKHQpP3ByKHQsZSk6W119KSksY3M9UXIoKGZ1bmN0aW9uKHQpe3JldHVybiBtaShPZSh0LFpzKSl9KSksbHM9UXIoKGZ1bmN0aW9uKHQpe3ZhciBlPVFvKHQpO3JldHVybiBacyhlKSYmKGU9biksbWkoT2UodCxacyksbG8oZSwyKSl9KSksaHM9UXIoKGZ1bmN0aW9uKHQpe3ZhciBlPVFvKHQpO3JldHVybiBlPSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6bixtaShPZSh0LFpzKSxuLGUpfSkpLGZzPVFyKHNzKTt2YXIgcHM9UXIoKGZ1bmN0aW9uKHQpe3ZhciBlPXQubGVuZ3RoLHI9ZT4xP3RbZS0xXTpuO3JldHVybiByPSJmdW5jdGlvbiI9PXR5cGVvZiByPyh0LnBvcCgpLHIpOm4sYXModCxyKX0pKTtmdW5jdGlvbiBkcyh0KXt2YXIgZT1xbih0KTtyZXR1cm4gZS5fX2NoYWluX189ITAsZX1mdW5jdGlvbiBncyh0LGUpe3JldHVybiBlKHQpfXZhciB5cz1pbygoZnVuY3Rpb24odCl7dmFyIGU9dC5sZW5ndGgscj1lP3RbMF06MCxpPXRoaXMuX193cmFwcGVkX18sbz1mdW5jdGlvbihlKXtyZXR1cm4gdXIoZSx0KX07cmV0dXJuIShlPjF8fHRoaXMuX19hY3Rpb25zX18ubGVuZ3RoKSYmaSBpbnN0YW5jZW9mIFhuJiZ3byhyKT8oKGk9aS5zbGljZShyLCtyKyhlPzE6MCkpKS5fX2FjdGlvbnNfXy5wdXNoKHtmdW5jOmdzLGFyZ3M6W29dLHRoaXNBcmc6bn0pLG5ldyBZbihpLHRoaXMuX19jaGFpbl9fKS50aHJ1KChmdW5jdGlvbih0KXtyZXR1cm4gZSYmIXQubGVuZ3RoJiZ0LnB1c2gobiksdH0pKSk6dGhpcy50aHJ1KG8pfSkpO3ZhciBtcz1PaSgoZnVuY3Rpb24odCxlLG4pe2t0LmNhbGwodCxuKT8rK3Rbbl06YXIodCxuLDEpfSkpO3ZhciB2cz1qaShZbyksX3M9amkoWG8pO2Z1bmN0aW9uIHhzKHQsZSl7cmV0dXJuKFhzKHQpP01lOmRyKSh0LGxvKGUsMykpfWZ1bmN0aW9uIHdzKHQsZSl7cmV0dXJuKFhzKHQpP0ZlOmdyKSh0LGxvKGUsMykpfXZhciBicz1PaSgoZnVuY3Rpb24odCxlLG4pe2t0LmNhbGwodCxuKT90W25dLnB1c2goZSk6YXIodCxuLFtlXSl9KSk7dmFyIERzPVFyKChmdW5jdGlvbih0LGUsbil7dmFyIHI9LTEsaT0iZnVuY3Rpb24iPT10eXBlb2YgZSxvPUhzKHQpP0V0KHQubGVuZ3RoKTpbXTtyZXR1cm4gZHIodCwoZnVuY3Rpb24odCl7b1srK3JdPWk/TmUoZSx0LG4pOlRyKHQsZSxuKX0pKSxvfSkpLEVzPU9pKChmdW5jdGlvbih0LGUsbil7YXIodCxuLGUpfSkpO2Z1bmN0aW9uIENzKHQsZSl7cmV0dXJuKFhzKHQpP1JlOlVyKSh0LGxvKGUsMykpfXZhciBTcz1PaSgoZnVuY3Rpb24odCxlLG4pe3Rbbj8wOjFdLnB1c2goZSl9KSwoZnVuY3Rpb24oKXtyZXR1cm5bW10sW11dfSkpO3ZhciBBcz1RcigoZnVuY3Rpb24odCxlKXtpZihudWxsPT10KXJldHVybltdO3ZhciBuPWUubGVuZ3RoO3JldHVybiBuPjEmJmJvKHQsZVswXSxlWzFdKT9lPVtdOm4+MiYmYm8oZVswXSxlWzFdLGVbMl0pJiYoZT1bZVswXV0pLFhyKHQsX3IoZSwxKSxbXSl9KSksTnM9ZGV8fGZ1bmN0aW9uKCl7cmV0dXJuIHllLkRhdGUubm93KCl9O2Z1bmN0aW9uIElzKHQsZSxyKXtyZXR1cm4gZT1yP246ZSxlPXQmJm51bGw9PWU/dC5sZW5ndGg6ZSwkaSh0LGMsbixuLG4sbixlKX1mdW5jdGlvbiBNcyh0LGUpe3ZhciBpO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBUdChyKTtyZXR1cm4gdD15YSh0KSxmdW5jdGlvbigpe3JldHVybi0tdD4wJiYoaT1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKSksdDw9MSYmKGU9biksaX19dmFyIEZzPVFyKChmdW5jdGlvbih0LGUsbil7dmFyIHI9MTtpZihuLmxlbmd0aCl7dmFyIGk9Zm4obixjbyhGcykpO3J8PWF9cmV0dXJuICRpKHQscixlLG4saSl9KSksVHM9UXIoKGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj0zO2lmKG4ubGVuZ3RoKXt2YXIgaT1mbihuLGNvKFRzKSk7cnw9YX1yZXR1cm4gJGkoZSxyLHQsbixpKX0pKTtmdW5jdGlvbiBPcyh0LGUsaSl7dmFyIG8scyxhLHUsYyxsLGg9MCxmPSExLHA9ITEsZD0hMDtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgVHQocik7ZnVuY3Rpb24gZyhlKXt2YXIgcj1vLGk9cztyZXR1cm4gbz1zPW4saD1lLHU9dC5hcHBseShpLHIpfWZ1bmN0aW9uIHkodCl7dmFyIHI9dC1sO3JldHVybiBsPT09bnx8cj49ZXx8cjwwfHxwJiZ0LWg+PWF9ZnVuY3Rpb24gbSgpe3ZhciB0PU5zKCk7aWYoeSh0KSlyZXR1cm4gdih0KTtjPU9vKG0sZnVuY3Rpb24odCl7dmFyIG49ZS0odC1sKTtyZXR1cm4gcD93bihuLGEtKHQtaCkpOm59KHQpKX1mdW5jdGlvbiB2KHQpe3JldHVybiBjPW4sZCYmbz9nKHQpOihvPXM9bix1KX1mdW5jdGlvbiBfKCl7dmFyIHQ9TnMoKSxyPXkodCk7aWYobz1hcmd1bWVudHMscz10aGlzLGw9dCxyKXtpZihjPT09bilyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGg9dCxjPU9vKG0sZSksZj9nKHQpOnV9KGwpO2lmKHApcmV0dXJuIEVpKGMpLGM9T28obSxlKSxnKGwpfXJldHVybiBjPT09biYmKGM9T28obSxlKSksdX1yZXR1cm4gZT12YShlKXx8MCxuYShpKSYmKGY9ISFpLmxlYWRpbmcsYT0ocD0ibWF4V2FpdCJpbiBpKT94bih2YShpLm1heFdhaXQpfHwwLGUpOmEsZD0idHJhaWxpbmciaW4gaT8hIWkudHJhaWxpbmc6ZCksXy5jYW5jZWw9ZnVuY3Rpb24oKXtjIT09biYmRWkoYyksaD0wLG89bD1zPWM9bn0sXy5mbHVzaD1mdW5jdGlvbigpe3JldHVybiBjPT09bj91OnYoTnMoKSl9LF99dmFyIExzPVFyKChmdW5jdGlvbih0LGUpe3JldHVybiBmcih0LDEsZSl9KSksUHM9UXIoKGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gZnIodCx2YShlKXx8MCxuKX0pKTtmdW5jdGlvbiBScyh0LGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0fHxudWxsIT1lJiYiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgVHQocik7dmFyIG49ZnVuY3Rpb24oKXt2YXIgcj1hcmd1bWVudHMsaT1lP2UuYXBwbHkodGhpcyxyKTpyWzBdLG89bi5jYWNoZTtpZihvLmhhcyhpKSlyZXR1cm4gby5nZXQoaSk7dmFyIHM9dC5hcHBseSh0aGlzLHIpO3JldHVybiBuLmNhY2hlPW8uc2V0KGkscyl8fG8sc307cmV0dXJuIG4uY2FjaGU9bmV3KFJzLkNhY2hlfHxabiksbn1mdW5jdGlvbiBCcyh0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgVHQocik7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9YXJndW1lbnRzO3N3aXRjaChlLmxlbmd0aCl7Y2FzZSAwOnJldHVybiF0LmNhbGwodGhpcyk7Y2FzZSAxOnJldHVybiF0LmNhbGwodGhpcyxlWzBdKTtjYXNlIDI6cmV0dXJuIXQuY2FsbCh0aGlzLGVbMF0sZVsxXSk7Y2FzZSAzOnJldHVybiF0LmNhbGwodGhpcyxlWzBdLGVbMV0sZVsyXSl9cmV0dXJuIXQuYXBwbHkodGhpcyxlKX19UnMuQ2FjaGU9Wm47dmFyIGtzPWJpKChmdW5jdGlvbih0LGUpe3ZhciBuPShlPTE9PWUubGVuZ3RoJiZYcyhlWzBdKT9SZShlWzBdLHRuKGxvKCkpKTpSZShfcihlLDEpLHRuKGxvKCkpKSkubGVuZ3RoO3JldHVybiBRcigoZnVuY3Rpb24ocil7Zm9yKHZhciBpPS0xLG89d24oci5sZW5ndGgsbik7KytpPG87KXJbaV09ZVtpXS5jYWxsKHRoaXMscltpXSk7cmV0dXJuIE5lKHQsdGhpcyxyKX0pKX0pKSx6cz1RcigoZnVuY3Rpb24odCxlKXt2YXIgcj1mbihlLGNvKHpzKSk7cmV0dXJuICRpKHQsYSxuLGUscil9KSksanM9UXIoKGZ1bmN0aW9uKHQsZSl7dmFyIHI9Zm4oZSxjbyhqcykpO3JldHVybiAkaSh0LHUsbixlLHIpfSkpLFVzPWlvKChmdW5jdGlvbih0LGUpe3JldHVybiAkaSh0LGwsbixuLG4sZSl9KSk7ZnVuY3Rpb24gcXModCxlKXtyZXR1cm4gdD09PWV8fHQhPXQmJmUhPWV9dmFyIFZzPUhpKE5yKSxHcz1IaSgoZnVuY3Rpb24odCxlKXtyZXR1cm4gdD49ZX0pKSxZcz1PcihmdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHN9KCkpP09yOmZ1bmN0aW9uKHQpe3JldHVybiByYSh0KSYma3QuY2FsbCh0LCJjYWxsZWUiKSYmIUp0LmNhbGwodCwiY2FsbGVlIil9LFhzPUV0LmlzQXJyYXksV3M9YmU/dG4oYmUpOmZ1bmN0aW9uKHQpe3JldHVybiByYSh0KSYmQXIodCk9PUx9O2Z1bmN0aW9uIEhzKHQpe3JldHVybiBudWxsIT10JiZlYSh0Lmxlbmd0aCkmJiEkcyh0KX1mdW5jdGlvbiBacyh0KXtyZXR1cm4gcmEodCkmJkhzKHQpfXZhciBLcz13ZXx8dnUsSnM9RGU/dG4oRGUpOmZ1bmN0aW9uKHQpe3JldHVybiByYSh0KSYmQXIodCk9PXd9O2Z1bmN0aW9uIFFzKHQpe2lmKCFyYSh0KSlyZXR1cm4hMTt2YXIgZT1Bcih0KTtyZXR1cm4gZT09Ynx8IltvYmplY3QgRE9NRXhjZXB0aW9uXSI9PWV8fCJzdHJpbmciPT10eXBlb2YgdC5tZXNzYWdlJiYic3RyaW5nIj09dHlwZW9mIHQubmFtZSYmIXNhKHQpfWZ1bmN0aW9uICRzKHQpe2lmKCFuYSh0KSlyZXR1cm4hMTt2YXIgZT1Bcih0KTtyZXR1cm4gZT09RHx8ZT09RXx8IltvYmplY3QgQXN5bmNGdW5jdGlvbl0iPT1lfHwiW29iamVjdCBQcm94eV0iPT1lfWZ1bmN0aW9uIHRhKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdCYmdD09eWEodCl9ZnVuY3Rpb24gZWEodCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0JiZ0Pi0xJiZ0JTE9PTAmJnQ8PWZ9ZnVuY3Rpb24gbmEodCl7dmFyIGU9dHlwZW9mIHQ7cmV0dXJuIG51bGwhPXQmJigib2JqZWN0Ij09ZXx8ImZ1bmN0aW9uIj09ZSl9ZnVuY3Rpb24gcmEodCl7cmV0dXJuIG51bGwhPXQmJiJvYmplY3QiPT10eXBlb2YgdH12YXIgaWE9RWU/dG4oRWUpOmZ1bmN0aW9uKHQpe3JldHVybiByYSh0KSYmbW8odCk9PUN9O2Z1bmN0aW9uIG9hKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdHx8cmEodCkmJkFyKHQpPT1TfWZ1bmN0aW9uIHNhKHQpe2lmKCFyYSh0KXx8QXIodCkhPUEpcmV0dXJuITE7dmFyIGU9WnQodCk7aWYobnVsbD09PWUpcmV0dXJuITA7dmFyIG49a3QuY2FsbChlLCJjb25zdHJ1Y3RvciIpJiZlLmNvbnN0cnVjdG9yO3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBuJiZuIGluc3RhbmNlb2YgbiYmQnQuY2FsbChuKT09cXR9dmFyIGFhPUNlP3RuKENlKTpmdW5jdGlvbih0KXtyZXR1cm4gcmEodCkmJkFyKHQpPT1JfTt2YXIgdWE9U2U/dG4oU2UpOmZ1bmN0aW9uKHQpe3JldHVybiByYSh0KSYmbW8odCk9PU19O2Z1bmN0aW9uIGNhKHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdHx8IVhzKHQpJiZyYSh0KSYmQXIodCk9PUZ9ZnVuY3Rpb24gbGEodCl7cmV0dXJuInN5bWJvbCI9PXR5cGVvZiB0fHxyYSh0KSYmQXIodCk9PVR9dmFyIGhhPUFlP3RuKEFlKTpmdW5jdGlvbih0KXtyZXR1cm4gcmEodCkmJmVhKHQubGVuZ3RoKSYmISFjZVtBcih0KV19O3ZhciBmYT1IaShqcikscGE9SGkoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ8PWV9KSk7ZnVuY3Rpb24gZGEodCl7aWYoIXQpcmV0dXJuW107aWYoSHModCkpcmV0dXJuIGNhKHQpP2duKHQpOkZpKHQpO2lmKHRlJiZ0W3RlXSlyZXR1cm4gZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49W107IShlPXQubmV4dCgpKS5kb25lOyluLnB1c2goZS52YWx1ZSk7cmV0dXJuIG59KHRbdGVdKCkpO3ZhciBlPW1vKHQpO3JldHVybihlPT1DP2xuOmU9PU0/cG46cWEpKHQpfWZ1bmN0aW9uIGdhKHQpe3JldHVybiB0Pyh0PXZhKHQpKT09PWh8fHQ9PT0taD8xNzk3NjkzMTM0ODYyMzE1N2UyOTIqKHQ8MD8tMToxKTp0PT10P3Q6MDowPT09dD90OjB9ZnVuY3Rpb24geWEodCl7dmFyIGU9Z2EodCksbj1lJTE7cmV0dXJuIGU9PWU/bj9lLW46ZTowfWZ1bmN0aW9uIG1hKHQpe3JldHVybiB0P2NyKHlhKHQpLDAsZCk6MH1mdW5jdGlvbiB2YSh0KXtpZigibnVtYmVyIj09dHlwZW9mIHQpcmV0dXJuIHQ7aWYobGEodCkpcmV0dXJuIHA7aWYobmEodCkpe3ZhciBlPSJmdW5jdGlvbiI9PXR5cGVvZiB0LnZhbHVlT2Y/dC52YWx1ZU9mKCk6dDt0PW5hKGUpP2UrIiI6ZX1pZigic3RyaW5nIiE9dHlwZW9mIHQpcmV0dXJuIDA9PT10P3Q6K3Q7dD0kZSh0KTt2YXIgbj1tdC50ZXN0KHQpO3JldHVybiBufHxfdC50ZXN0KHQpP3BlKHQuc2xpY2UoMiksbj8yOjgpOnl0LnRlc3QodCk/cDordH1mdW5jdGlvbiBfYSh0KXtyZXR1cm4gVGkodCxMYSh0KSl9ZnVuY3Rpb24geGEodCl7cmV0dXJuIG51bGw9PXQ/IiI6aGkodCl9dmFyIHdhPUxpKChmdW5jdGlvbih0LGUpe2lmKFNvKGUpfHxIcyhlKSlUaShlLE9hKGUpLHQpO2Vsc2UgZm9yKHZhciBuIGluIGUpa3QuY2FsbChlLG4pJiZycih0LG4sZVtuXSl9KSksYmE9TGkoKGZ1bmN0aW9uKHQsZSl7VGkoZSxMYShlKSx0KX0pKSxEYT1MaSgoZnVuY3Rpb24odCxlLG4scil7VGkoZSxMYShlKSx0LHIpfSkpLEVhPUxpKChmdW5jdGlvbih0LGUsbixyKXtUaShlLE9hKGUpLHQscil9KSksQ2E9aW8odXIpO3ZhciBTYT1RcigoZnVuY3Rpb24odCxlKXt0PUl0KHQpO3ZhciByPS0xLGk9ZS5sZW5ndGgsbz1pPjI/ZVsyXTpuO2ZvcihvJiZibyhlWzBdLGVbMV0sbykmJihpPTEpOysrcjxpOylmb3IodmFyIHM9ZVtyXSxhPUxhKHMpLHU9LTEsYz1hLmxlbmd0aDsrK3U8Yzspe3ZhciBsPWFbdV0saD10W2xdOyhoPT09bnx8cXMoaCxQdFtsXSkmJiFrdC5jYWxsKHQsbCkpJiYodFtsXT1zW2xdKX1yZXR1cm4gdH0pKSxBYT1RcigoZnVuY3Rpb24odCl7cmV0dXJuIHQucHVzaChuLGVvKSxOZShSYSxuLHQpfSkpO2Z1bmN0aW9uIE5hKHQsZSxyKXt2YXIgaT1udWxsPT10P246Q3IodCxlKTtyZXR1cm4gaT09PW4/cjppfWZ1bmN0aW9uIElhKHQsZSl7cmV0dXJuIG51bGwhPXQmJnZvKHQsZSxNcil9dmFyIE1hPVZpKChmdW5jdGlvbih0LGUsbil7bnVsbCE9ZSYmImZ1bmN0aW9uIiE9dHlwZW9mIGUudG9TdHJpbmcmJihlPVV0LmNhbGwoZSkpLHRbZV09bn0pLG51KG91KSksRmE9VmkoKGZ1bmN0aW9uKHQsZSxuKXtudWxsIT1lJiYiZnVuY3Rpb24iIT10eXBlb2YgZS50b1N0cmluZyYmKGU9VXQuY2FsbChlKSksa3QuY2FsbCh0LGUpP3RbZV0ucHVzaChuKTp0W2VdPVtuXX0pLGxvKSxUYT1RcihUcik7ZnVuY3Rpb24gT2EodCl7cmV0dXJuIEhzKHQpP1FuKHQpOmtyKHQpfWZ1bmN0aW9uIExhKHQpe3JldHVybiBIcyh0KT9Rbih0LCEwKTp6cih0KX12YXIgUGE9TGkoKGZ1bmN0aW9uKHQsZSxuKXtHcih0LGUsbil9KSksUmE9TGkoKGZ1bmN0aW9uKHQsZSxuLHIpe0dyKHQsZSxuLHIpfSkpLEJhPWlvKChmdW5jdGlvbih0LGUpe3ZhciBuPXt9O2lmKG51bGw9PXQpcmV0dXJuIG47dmFyIHI9ITE7ZT1SZShlLChmdW5jdGlvbihlKXtyZXR1cm4gZT13aShlLHQpLHJ8fChyPWUubGVuZ3RoPjEpLGV9KSksVGkodCxzbyh0KSxuKSxyJiYobj1scihuLDcsbm8pKTtmb3IodmFyIGk9ZS5sZW5ndGg7aS0tOylwaShuLGVbaV0pO3JldHVybiBufSkpO3ZhciBrYT1pbygoZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09dD97fTpmdW5jdGlvbih0LGUpe3JldHVybiBXcih0LGUsKGZ1bmN0aW9uKGUsbil7cmV0dXJuIElhKHQsbil9KSl9KHQsZSl9KSk7ZnVuY3Rpb24gemEodCxlKXtpZihudWxsPT10KXJldHVybnt9O3ZhciBuPVJlKHNvKHQpLChmdW5jdGlvbih0KXtyZXR1cm5bdF19KSk7cmV0dXJuIGU9bG8oZSksV3IodCxuLChmdW5jdGlvbih0LG4pe3JldHVybiBlKHQsblswXSl9KSl9dmFyIGphPVFpKE9hKSxVYT1RaShMYSk7ZnVuY3Rpb24gcWEodCl7cmV0dXJuIG51bGw9PXQ/W106ZW4odCxPYSh0KSl9dmFyIFZhPWtpKChmdW5jdGlvbih0LGUsbil7cmV0dXJuIGU9ZS50b0xvd2VyQ2FzZSgpLHQrKG4/R2EoZSk6ZSl9KSk7ZnVuY3Rpb24gR2EodCl7cmV0dXJuIFFhKHhhKHQpLnRvTG93ZXJDYXNlKCkpfWZ1bmN0aW9uIFlhKHQpe3JldHVybih0PXhhKHQpKSYmdC5yZXBsYWNlKHd0LHNuKS5yZXBsYWNlKG5lLCIiKX12YXIgWGE9a2koKGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdCsobj8iLSI6IiIpK2UudG9Mb3dlckNhc2UoKX0pKSxXYT1raSgoZnVuY3Rpb24odCxlLG4pe3JldHVybiB0KyhuPyIgIjoiIikrZS50b0xvd2VyQ2FzZSgpfSkpLEhhPUJpKCJ0b0xvd2VyQ2FzZSIpO3ZhciBaYT1raSgoZnVuY3Rpb24odCxlLG4pe3JldHVybiB0KyhuPyJfIjoiIikrZS50b0xvd2VyQ2FzZSgpfSkpO3ZhciBLYT1raSgoZnVuY3Rpb24odCxlLG4pe3JldHVybiB0KyhuPyIgIjoiIikrUWEoZSl9KSk7dmFyIEphPWtpKChmdW5jdGlvbih0LGUsbil7cmV0dXJuIHQrKG4/IiAiOiIiKStlLnRvVXBwZXJDYXNlKCl9KSksUWE9QmkoInRvVXBwZXJDYXNlIik7ZnVuY3Rpb24gJGEodCxlLHIpe3JldHVybiB0PXhhKHQpLChlPXI/bjplKT09PW4/ZnVuY3Rpb24odCl7cmV0dXJuIHNlLnRlc3QodCl9KHQpP2Z1bmN0aW9uKHQpe3JldHVybiB0Lm1hdGNoKGllKXx8W119KHQpOmZ1bmN0aW9uKHQpe3JldHVybiB0Lm1hdGNoKGh0KXx8W119KHQpOnQubWF0Y2goZSl8fFtdfXZhciB0dT1RcigoZnVuY3Rpb24odCxlKXt0cnl7cmV0dXJuIE5lKHQsbixlKX1jYXRjaCh0KXtyZXR1cm4gUXModCk/dDpuZXcgU3QodCl9fSkpLGV1PWlvKChmdW5jdGlvbih0LGUpe3JldHVybiBNZShlLChmdW5jdGlvbihlKXtlPXpvKGUpLGFyKHQsZSxGcyh0W2VdLHQpKX0pKSx0fSkpO2Z1bmN0aW9uIG51KHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX12YXIgcnU9VWkoKSxpdT1VaSghMCk7ZnVuY3Rpb24gb3UodCl7cmV0dXJuIHR9ZnVuY3Rpb24gc3UodCl7cmV0dXJuIEJyKCJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6bHIodCwxKSl9dmFyIGF1PVFyKChmdW5jdGlvbih0LGUpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gVHIobix0LGUpfX0pKSx1dT1RcigoZnVuY3Rpb24odCxlKXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIFRyKHQsbixlKX19KSk7ZnVuY3Rpb24gY3UodCxlLG4pe3ZhciByPU9hKGUpLGk9RXIoZSxyKTtudWxsPT1uJiYoIW5hKGUpfHwhaS5sZW5ndGgmJnIubGVuZ3RoKSYmKG49ZSxlPXQsdD10aGlzLGk9RXIoZSxPYShlKSkpO3ZhciBvPSEobmEobikmJiJjaGFpbiJpbiBuJiYhbi5jaGFpbikscz0kcyh0KTtyZXR1cm4gTWUoaSwoZnVuY3Rpb24obil7dmFyIHI9ZVtuXTt0W25dPXIscyYmKHQucHJvdG90eXBlW25dPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5fX2NoYWluX187aWYob3x8ZSl7dmFyIG49dCh0aGlzLl9fd3JhcHBlZF9fKTtyZXR1cm4obi5fX2FjdGlvbnNfXz1GaSh0aGlzLl9fYWN0aW9uc19fKSkucHVzaCh7ZnVuYzpyLGFyZ3M6YXJndW1lbnRzLHRoaXNBcmc6dH0pLG4uX19jaGFpbl9fPWUsbn1yZXR1cm4gci5hcHBseSh0LEJlKFt0aGlzLnZhbHVlKCldLGFyZ3VtZW50cykpfSl9KSksdH1mdW5jdGlvbiBsdSgpe312YXIgaHU9WWkoUmUpLGZ1PVlpKFRlKSxwdT1ZaShqZSk7ZnVuY3Rpb24gZHUodCl7cmV0dXJuIERvKHQpP0hlKHpvKHQpKTpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIENyKGUsdCl9fSh0KX12YXIgZ3U9V2koKSx5dT1XaSghMCk7ZnVuY3Rpb24gbXUoKXtyZXR1cm5bXX1mdW5jdGlvbiB2dSgpe3JldHVybiExfXZhciBfdT1HaSgoZnVuY3Rpb24odCxlKXtyZXR1cm4gdCtlfSksMCkseHU9S2koImNlaWwiKSx3dT1HaSgoZnVuY3Rpb24odCxlKXtyZXR1cm4gdC9lfSksMSksYnU9S2koImZsb29yIik7dmFyIER1PUdpKChmdW5jdGlvbih0LGUpe3JldHVybiB0KmV9KSwxKSxFdT1LaSgicm91bmQiKSxDdT1HaSgoZnVuY3Rpb24odCxlKXtyZXR1cm4gdC1lfSksMCk7cmV0dXJuIHFuLmFmdGVyPWZ1bmN0aW9uKHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR0KHIpO3JldHVybiB0PXlhKHQpLGZ1bmN0aW9uKCl7aWYoLS10PDEpcmV0dXJuIGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfX0scW4uYXJ5PUlzLHFuLmFzc2lnbj13YSxxbi5hc3NpZ25Jbj1iYSxxbi5hc3NpZ25JbldpdGg9RGEscW4uYXNzaWduV2l0aD1FYSxxbi5hdD1DYSxxbi5iZWZvcmU9TXMscW4uYmluZD1Gcyxxbi5iaW5kQWxsPWV1LHFuLmJpbmRLZXk9VHMscW4uY2FzdEFycmF5PWZ1bmN0aW9uKCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuW107dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiBYcyh0KT90Olt0XX0scW4uY2hhaW49ZHMscW4uY2h1bms9ZnVuY3Rpb24odCxlLHIpe2U9KHI/Ym8odCxlLHIpOmU9PT1uKT8xOnhuKHlhKGUpLDApO3ZhciBpPW51bGw9PXQ/MDp0Lmxlbmd0aDtpZighaXx8ZTwxKXJldHVybltdO2Zvcih2YXIgbz0wLHM9MCxhPUV0KG1lKGkvZSkpO288aTspYVtzKytdPW9pKHQsbyxvKz1lKTtyZXR1cm4gYX0scW4uY29tcGFjdD1mdW5jdGlvbih0KXtmb3IodmFyIGU9LTEsbj1udWxsPT10PzA6dC5sZW5ndGgscj0wLGk9W107KytlPG47KXt2YXIgbz10W2VdO28mJihpW3IrK109byl9cmV0dXJuIGl9LHFuLmNvbmNhdD1mdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg7aWYoIXQpcmV0dXJuW107Zm9yKHZhciBlPUV0KHQtMSksbj1hcmd1bWVudHNbMF0scj10O3ItLTspZVtyLTFdPWFyZ3VtZW50c1tyXTtyZXR1cm4gQmUoWHMobik/Rmkobik6W25dLF9yKGUsMSkpfSxxbi5jb25kPWZ1bmN0aW9uKHQpe3ZhciBlPW51bGw9PXQ/MDp0Lmxlbmd0aCxuPWxvKCk7cmV0dXJuIHQ9ZT9SZSh0LChmdW5jdGlvbih0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdFsxXSl0aHJvdyBuZXcgVHQocik7cmV0dXJuW24odFswXSksdFsxXV19KSk6W10sUXIoKGZ1bmN0aW9uKG4pe2Zvcih2YXIgcj0tMTsrK3I8ZTspe3ZhciBpPXRbcl07aWYoTmUoaVswXSx0aGlzLG4pKXJldHVybiBOZShpWzFdLHRoaXMsbil9fSkpfSxxbi5jb25mb3Jtcz1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIGU9T2EodCk7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBocihuLHQsZSl9fShscih0LDEpKX0scW4uY29uc3RhbnQ9bnUscW4uY291bnRCeT1tcyxxbi5jcmVhdGU9ZnVuY3Rpb24odCxlKXt2YXIgbj1Wbih0KTtyZXR1cm4gbnVsbD09ZT9uOnNyKG4sZSl9LHFuLmN1cnJ5PWZ1bmN0aW9uIHQoZSxyLGkpe3ZhciBvPSRpKGUsOCxuLG4sbixuLG4scj1pP246cik7cmV0dXJuIG8ucGxhY2Vob2xkZXI9dC5wbGFjZWhvbGRlcixvfSxxbi5jdXJyeVJpZ2h0PWZ1bmN0aW9uIHQoZSxyLGkpe3ZhciBvPSRpKGUscyxuLG4sbixuLG4scj1pP246cik7cmV0dXJuIG8ucGxhY2Vob2xkZXI9dC5wbGFjZWhvbGRlcixvfSxxbi5kZWJvdW5jZT1Pcyxxbi5kZWZhdWx0cz1TYSxxbi5kZWZhdWx0c0RlZXA9QWEscW4uZGVmZXI9THMscW4uZGVsYXk9UHMscW4uZGlmZmVyZW5jZT1xbyxxbi5kaWZmZXJlbmNlQnk9Vm8scW4uZGlmZmVyZW5jZVdpdGg9R28scW4uZHJvcD1mdW5jdGlvbih0LGUscil7dmFyIGk9bnVsbD09dD8wOnQubGVuZ3RoO3JldHVybiBpP29pKHQsKGU9cnx8ZT09PW4/MTp5YShlKSk8MD8wOmUsaSk6W119LHFuLmRyb3BSaWdodD1mdW5jdGlvbih0LGUscil7dmFyIGk9bnVsbD09dD8wOnQubGVuZ3RoO3JldHVybiBpP29pKHQsMCwoZT1pLShlPXJ8fGU9PT1uPzE6eWEoZSkpKTwwPzA6ZSk6W119LHFuLmRyb3BSaWdodFdoaWxlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQmJnQubGVuZ3RoP2dpKHQsbG8oZSwzKSwhMCwhMCk6W119LHFuLmRyb3BXaGlsZT1mdW5jdGlvbih0LGUpe3JldHVybiB0JiZ0Lmxlbmd0aD9naSh0LGxvKGUsMyksITApOltdfSxxbi5maWxsPWZ1bmN0aW9uKHQsZSxyLGkpe3ZhciBvPW51bGw9PXQ/MDp0Lmxlbmd0aDtyZXR1cm4gbz8ociYmIm51bWJlciIhPXR5cGVvZiByJiZibyh0LGUscikmJihyPTAsaT1vKSxmdW5jdGlvbih0LGUscixpKXt2YXIgbz10Lmxlbmd0aDtmb3IoKHI9eWEocikpPDAmJihyPS1yPm8/MDpvK3IpLChpPWk9PT1ufHxpPm8/bzp5YShpKSk8MCYmKGkrPW8pLGk9cj5pPzA6bWEoaSk7cjxpOyl0W3IrK109ZTtyZXR1cm4gdH0odCxlLHIsaSkpOltdfSxxbi5maWx0ZXI9ZnVuY3Rpb24odCxlKXtyZXR1cm4oWHModCk/T2U6dnIpKHQsbG8oZSwzKSl9LHFuLmZsYXRNYXA9ZnVuY3Rpb24odCxlKXtyZXR1cm4gX3IoQ3ModCxlKSwxKX0scW4uZmxhdE1hcERlZXA9ZnVuY3Rpb24odCxlKXtyZXR1cm4gX3IoQ3ModCxlKSxoKX0scW4uZmxhdE1hcERlcHRoPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gcj1yPT09bj8xOnlhKHIpLF9yKENzKHQsZSkscil9LHFuLmZsYXR0ZW49V28scW4uZmxhdHRlbkRlZXA9ZnVuY3Rpb24odCl7cmV0dXJuKG51bGw9PXQ/MDp0Lmxlbmd0aCk/X3IodCxoKTpbXX0scW4uZmxhdHRlbkRlcHRoPWZ1bmN0aW9uKHQsZSl7cmV0dXJuKG51bGw9PXQ/MDp0Lmxlbmd0aCk/X3IodCxlPWU9PT1uPzE6eWEoZSkpOltdfSxxbi5mbGlwPWZ1bmN0aW9uKHQpe3JldHVybiAkaSh0LDUxMil9LHFuLmZsb3c9cnUscW4uZmxvd1JpZ2h0PWl1LHFuLmZyb21QYWlycz1mdW5jdGlvbih0KXtmb3IodmFyIGU9LTEsbj1udWxsPT10PzA6dC5sZW5ndGgscj17fTsrK2U8bjspe3ZhciBpPXRbZV07cltpWzBdXT1pWzFdfXJldHVybiByfSxxbi5mdW5jdGlvbnM9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/W106RXIodCxPYSh0KSl9LHFuLmZ1bmN0aW9uc0luPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P1tdOkVyKHQsTGEodCkpfSxxbi5ncm91cEJ5PWJzLHFuLmluaXRpYWw9ZnVuY3Rpb24odCl7cmV0dXJuKG51bGw9PXQ/MDp0Lmxlbmd0aCk/b2kodCwwLC0xKTpbXX0scW4uaW50ZXJzZWN0aW9uPVpvLHFuLmludGVyc2VjdGlvbkJ5PUtvLHFuLmludGVyc2VjdGlvbldpdGg9Sm8scW4uaW52ZXJ0PU1hLHFuLmludmVydEJ5PUZhLHFuLmludm9rZU1hcD1Ecyxxbi5pdGVyYXRlZT1zdSxxbi5rZXlCeT1Fcyxxbi5rZXlzPU9hLHFuLmtleXNJbj1MYSxxbi5tYXA9Q3MscW4ubWFwS2V5cz1mdW5jdGlvbih0LGUpe3ZhciBuPXt9O3JldHVybiBlPWxvKGUsMyksYnIodCwoZnVuY3Rpb24odCxyLGkpe2FyKG4sZSh0LHIsaSksdCl9KSksbn0scW4ubWFwVmFsdWVzPWZ1bmN0aW9uKHQsZSl7dmFyIG49e307cmV0dXJuIGU9bG8oZSwzKSxicih0LChmdW5jdGlvbih0LHIsaSl7YXIobixyLGUodCxyLGkpKX0pKSxufSxxbi5tYXRjaGVzPWZ1bmN0aW9uKHQpe3JldHVybiBxcihscih0LDEpKX0scW4ubWF0Y2hlc1Byb3BlcnR5PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIFZyKHQsbHIoZSwxKSl9LHFuLm1lbW9pemU9UnMscW4ubWVyZ2U9UGEscW4ubWVyZ2VXaXRoPVJhLHFuLm1ldGhvZD1hdSxxbi5tZXRob2RPZj11dSxxbi5taXhpbj1jdSxxbi5uZWdhdGU9QnMscW4ubnRoQXJnPWZ1bmN0aW9uKHQpe3JldHVybiB0PXlhKHQpLFFyKChmdW5jdGlvbihlKXtyZXR1cm4gWXIoZSx0KX0pKX0scW4ub21pdD1CYSxxbi5vbWl0Qnk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gemEodCxCcyhsbyhlKSkpfSxxbi5vbmNlPWZ1bmN0aW9uKHQpe3JldHVybiBNcygyLHQpfSxxbi5vcmRlckJ5PWZ1bmN0aW9uKHQsZSxyLGkpe3JldHVybiBudWxsPT10P1tdOihYcyhlKXx8KGU9bnVsbD09ZT9bXTpbZV0pLFhzKHI9aT9uOnIpfHwocj1udWxsPT1yP1tdOltyXSksWHIodCxlLHIpKX0scW4ub3Zlcj1odSxxbi5vdmVyQXJncz1rcyxxbi5vdmVyRXZlcnk9ZnUscW4ub3ZlclNvbWU9cHUscW4ucGFydGlhbD16cyxxbi5wYXJ0aWFsUmlnaHQ9anMscW4ucGFydGl0aW9uPVNzLHFuLnBpY2s9a2EscW4ucGlja0J5PXphLHFuLnByb3BlcnR5PWR1LHFuLnByb3BlcnR5T2Y9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT10P246Q3IodCxlKX19LHFuLnB1bGw9JG8scW4ucHVsbEFsbD10cyxxbi5wdWxsQWxsQnk9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0JiZ0Lmxlbmd0aCYmZSYmZS5sZW5ndGg/SHIodCxlLGxvKG4sMikpOnR9LHFuLnB1bGxBbGxXaXRoPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdCYmdC5sZW5ndGgmJmUmJmUubGVuZ3RoP0hyKHQsZSxuLHIpOnR9LHFuLnB1bGxBdD1lcyxxbi5yYW5nZT1ndSxxbi5yYW5nZVJpZ2h0PXl1LHFuLnJlYXJnPVVzLHFuLnJlamVjdD1mdW5jdGlvbih0LGUpe3JldHVybihYcyh0KT9PZTp2cikodCxCcyhsbyhlLDMpKSl9LHFuLnJlbW92ZT1mdW5jdGlvbih0LGUpe3ZhciBuPVtdO2lmKCF0fHwhdC5sZW5ndGgpcmV0dXJuIG47dmFyIHI9LTEsaT1bXSxvPXQubGVuZ3RoO2ZvcihlPWxvKGUsMyk7KytyPG87KXt2YXIgcz10W3JdO2UocyxyLHQpJiYobi5wdXNoKHMpLGkucHVzaChyKSl9cmV0dXJuIFpyKHQsaSksbn0scW4ucmVzdD1mdW5jdGlvbih0LGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBUdChyKTtyZXR1cm4gUXIodCxlPWU9PT1uP2U6eWEoZSkpfSxxbi5yZXZlcnNlPW5zLHFuLnNhbXBsZVNpemU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiBlPShyP2JvKHQsZSxyKTplPT09bik/MTp5YShlKSwoWHModCk/dHI6dGkpKHQsZSl9LHFuLnNldD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIG51bGw9PXQ/dDplaSh0LGUsbil9LHFuLnNldFdpdGg9ZnVuY3Rpb24odCxlLHIsaSl7cmV0dXJuIGk9ImZ1bmN0aW9uIj09dHlwZW9mIGk/aTpuLG51bGw9PXQ/dDplaSh0LGUscixpKX0scW4uc2h1ZmZsZT1mdW5jdGlvbih0KXtyZXR1cm4oWHModCk/ZXI6aWkpKHQpfSxxbi5zbGljZT1mdW5jdGlvbih0LGUscil7dmFyIGk9bnVsbD09dD8wOnQubGVuZ3RoO3JldHVybiBpPyhyJiYibnVtYmVyIiE9dHlwZW9mIHImJmJvKHQsZSxyKT8oZT0wLHI9aSk6KGU9bnVsbD09ZT8wOnlhKGUpLHI9cj09PW4/aTp5YShyKSksb2kodCxlLHIpKTpbXX0scW4uc29ydEJ5PUFzLHFuLnNvcnRlZFVuaXE9ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQubGVuZ3RoP2NpKHQpOltdfSxxbi5zb3J0ZWRVbmlxQnk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdCYmdC5sZW5ndGg/Y2kodCxsbyhlLDIpKTpbXX0scW4uc3BsaXQ9ZnVuY3Rpb24odCxlLHIpe3JldHVybiByJiYibnVtYmVyIiE9dHlwZW9mIHImJmJvKHQsZSxyKSYmKGU9cj1uKSwocj1yPT09bj9kOnI+Pj4wKT8odD14YSh0KSkmJigic3RyaW5nIj09dHlwZW9mIGV8fG51bGwhPWUmJiFhYShlKSkmJighKGU9aGkoZSkpJiZjbih0KSk/RGkoZ24odCksMCxyKTp0LnNwbGl0KGUscik6W119LHFuLnNwcmVhZD1mdW5jdGlvbih0LGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBUdChyKTtyZXR1cm4gZT1udWxsPT1lPzA6eG4oeWEoZSksMCksUXIoKGZ1bmN0aW9uKG4pe3ZhciByPW5bZV0saT1EaShuLDAsZSk7cmV0dXJuIHImJkJlKGksciksTmUodCx0aGlzLGkpfSkpfSxxbi50YWlsPWZ1bmN0aW9uKHQpe3ZhciBlPW51bGw9PXQ/MDp0Lmxlbmd0aDtyZXR1cm4gZT9vaSh0LDEsZSk6W119LHFuLnRha2U9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0JiZ0Lmxlbmd0aD9vaSh0LDAsKGU9cnx8ZT09PW4/MTp5YShlKSk8MD8wOmUpOltdfSxxbi50YWtlUmlnaHQ9ZnVuY3Rpb24odCxlLHIpe3ZhciBpPW51bGw9PXQ/MDp0Lmxlbmd0aDtyZXR1cm4gaT9vaSh0LChlPWktKGU9cnx8ZT09PW4/MTp5YShlKSkpPDA/MDplLGkpOltdfSxxbi50YWtlUmlnaHRXaGlsZT1mdW5jdGlvbih0LGUpe3JldHVybiB0JiZ0Lmxlbmd0aD9naSh0LGxvKGUsMyksITEsITApOltdfSxxbi50YWtlV2hpbGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdCYmdC5sZW5ndGg/Z2kodCxsbyhlLDMpKTpbXX0scW4udGFwPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUodCksdH0scW4udGhyb3R0bGU9ZnVuY3Rpb24odCxlLG4pe3ZhciBpPSEwLG89ITA7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR0KHIpO3JldHVybiBuYShuKSYmKGk9ImxlYWRpbmciaW4gbj8hIW4ubGVhZGluZzppLG89InRyYWlsaW5nImluIG4/ISFuLnRyYWlsaW5nOm8pLE9zKHQsZSx7bGVhZGluZzppLG1heFdhaXQ6ZSx0cmFpbGluZzpvfSl9LHFuLnRocnU9Z3MscW4udG9BcnJheT1kYSxxbi50b1BhaXJzPWphLHFuLnRvUGFpcnNJbj1VYSxxbi50b1BhdGg9ZnVuY3Rpb24odCl7cmV0dXJuIFhzKHQpP1JlKHQsem8pOmxhKHQpP1t0XTpGaShrbyh4YSh0KSkpfSxxbi50b1BsYWluT2JqZWN0PV9hLHFuLnRyYW5zZm9ybT1mdW5jdGlvbih0LGUsbil7dmFyIHI9WHModCksaT1yfHxLcyh0KXx8aGEodCk7aWYoZT1sbyhlLDQpLG51bGw9PW4pe3ZhciBvPXQmJnQuY29uc3RydWN0b3I7bj1pP3I/bmV3IG86W106bmEodCkmJiRzKG8pP1ZuKFp0KHQpKTp7fX1yZXR1cm4oaT9NZTpicikodCwoZnVuY3Rpb24odCxyLGkpe3JldHVybiBlKG4sdCxyLGkpfSkpLG59LHFuLnVuYXJ5PWZ1bmN0aW9uKHQpe3JldHVybiBJcyh0LDEpfSxxbi51bmlvbj1ycyxxbi51bmlvbkJ5PWlzLHFuLnVuaW9uV2l0aD1vcyxxbi51bmlxPWZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0Lmxlbmd0aD9maSh0KTpbXX0scW4udW5pcUJ5PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQmJnQubGVuZ3RoP2ZpKHQsbG8oZSwyKSk6W119LHFuLnVuaXFXaXRoPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGU9ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpuLHQmJnQubGVuZ3RoP2ZpKHQsbixlKTpbXX0scW4udW5zZXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09dHx8cGkodCxlKX0scW4udW56aXA9c3MscW4udW56aXBXaXRoPWFzLHFuLnVwZGF0ZT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIG51bGw9PXQ/dDpkaSh0LGUseGkobikpfSxxbi51cGRhdGVXaXRoPWZ1bmN0aW9uKHQsZSxyLGkpe3JldHVybiBpPSJmdW5jdGlvbiI9PXR5cGVvZiBpP2k6bixudWxsPT10P3Q6ZGkodCxlLHhpKHIpLGkpfSxxbi52YWx1ZXM9cWEscW4udmFsdWVzSW49ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/W106ZW4odCxMYSh0KSl9LHFuLndpdGhvdXQ9dXMscW4ud29yZHM9JGEscW4ud3JhcD1mdW5jdGlvbih0LGUpe3JldHVybiB6cyh4aShlKSx0KX0scW4ueG9yPWNzLHFuLnhvckJ5PWxzLHFuLnhvcldpdGg9aHMscW4uemlwPWZzLHFuLnppcE9iamVjdD1mdW5jdGlvbih0LGUpe3JldHVybiB2aSh0fHxbXSxlfHxbXSxycil9LHFuLnppcE9iamVjdERlZXA9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdmkodHx8W10sZXx8W10sZWkpfSxxbi56aXBXaXRoPXBzLHFuLmVudHJpZXM9amEscW4uZW50cmllc0luPVVhLHFuLmV4dGVuZD1iYSxxbi5leHRlbmRXaXRoPURhLGN1KHFuLHFuKSxxbi5hZGQ9X3UscW4uYXR0ZW1wdD10dSxxbi5jYW1lbENhc2U9VmEscW4uY2FwaXRhbGl6ZT1HYSxxbi5jZWlsPXh1LHFuLmNsYW1wPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gcj09PW4mJihyPWUsZT1uKSxyIT09biYmKHI9KHI9dmEocikpPT1yP3I6MCksZSE9PW4mJihlPShlPXZhKGUpKT09ZT9lOjApLGNyKHZhKHQpLGUscil9LHFuLmNsb25lPWZ1bmN0aW9uKHQpe3JldHVybiBscih0LDQpfSxxbi5jbG9uZURlZXA9ZnVuY3Rpb24odCl7cmV0dXJuIGxyKHQsNSl9LHFuLmNsb25lRGVlcFdpdGg9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbHIodCw1LGU9ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpuKX0scW4uY2xvbmVXaXRoPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGxyKHQsNCxlPSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6bil9LHFuLmNvbmZvcm1zVG89ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09ZXx8aHIodCxlLE9hKGUpKX0scW4uZGVidXJyPVlhLHFuLmRlZmF1bHRUbz1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT10fHx0IT10P2U6dH0scW4uZGl2aWRlPXd1LHFuLmVuZHNXaXRoPWZ1bmN0aW9uKHQsZSxyKXt0PXhhKHQpLGU9aGkoZSk7dmFyIGk9dC5sZW5ndGgsbz1yPXI9PT1uP2k6Y3IoeWEociksMCxpKTtyZXR1cm4oci09ZS5sZW5ndGgpPj0wJiZ0LnNsaWNlKHIsbyk9PWV9LHFuLmVxPXFzLHFuLmVzY2FwZT1mdW5jdGlvbih0KXtyZXR1cm4odD14YSh0KSkmJkoudGVzdCh0KT90LnJlcGxhY2UoWixhbik6dH0scW4uZXNjYXBlUmVnRXhwPWZ1bmN0aW9uKHQpe3JldHVybih0PXhhKHQpKSYmb3QudGVzdCh0KT90LnJlcGxhY2UoaXQsIlxcJCYiKTp0fSxxbi5ldmVyeT1mdW5jdGlvbih0LGUscil7dmFyIGk9WHModCk/VGU6eXI7cmV0dXJuIHImJmJvKHQsZSxyKSYmKGU9biksaSh0LGxvKGUsMykpfSxxbi5maW5kPXZzLHFuLmZpbmRJbmRleD1Zbyxxbi5maW5kS2V5PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHFlKHQsbG8oZSwzKSxicil9LHFuLmZpbmRMYXN0PV9zLHFuLmZpbmRMYXN0SW5kZXg9WG8scW4uZmluZExhc3RLZXk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gcWUodCxsbyhlLDMpLERyKX0scW4uZmxvb3I9YnUscW4uZm9yRWFjaD14cyxxbi5mb3JFYWNoUmlnaHQ9d3MscW4uZm9ySW49ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09dD90OnhyKHQsbG8oZSwzKSxMYSl9LHFuLmZvckluUmlnaHQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09dD90OndyKHQsbG8oZSwzKSxMYSl9LHFuLmZvck93bj1mdW5jdGlvbih0LGUpe3JldHVybiB0JiZicih0LGxvKGUsMykpfSxxbi5mb3JPd25SaWdodD1mdW5jdGlvbih0LGUpe3JldHVybiB0JiZEcih0LGxvKGUsMykpfSxxbi5nZXQ9TmEscW4uZ3Q9VnMscW4uZ3RlPUdzLHFuLmhhcz1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsIT10JiZ2byh0LGUsSXIpfSxxbi5oYXNJbj1JYSxxbi5oZWFkPUhvLHFuLmlkZW50aXR5PW91LHFuLmluY2x1ZGVzPWZ1bmN0aW9uKHQsZSxuLHIpe3Q9SHModCk/dDpxYSh0KSxuPW4mJiFyP3lhKG4pOjA7dmFyIGk9dC5sZW5ndGg7cmV0dXJuIG48MCYmKG49eG4oaStuLDApKSxjYSh0KT9uPD1pJiZ0LmluZGV4T2YoZSxuKT4tMTohIWkmJkdlKHQsZSxuKT4tMX0scW4uaW5kZXhPZj1mdW5jdGlvbih0LGUsbil7dmFyIHI9bnVsbD09dD8wOnQubGVuZ3RoO2lmKCFyKXJldHVybi0xO3ZhciBpPW51bGw9PW4/MDp5YShuKTtyZXR1cm4gaTwwJiYoaT14bihyK2ksMCkpLEdlKHQsZSxpKX0scW4uaW5SYW5nZT1mdW5jdGlvbih0LGUscil7cmV0dXJuIGU9Z2EoZSkscj09PW4/KHI9ZSxlPTApOnI9Z2EociksZnVuY3Rpb24odCxlLG4pe3JldHVybiB0Pj13bihlLG4pJiZ0PHhuKGUsbil9KHQ9dmEodCksZSxyKX0scW4uaW52b2tlPVRhLHFuLmlzQXJndW1lbnRzPVlzLHFuLmlzQXJyYXk9WHMscW4uaXNBcnJheUJ1ZmZlcj1Xcyxxbi5pc0FycmF5TGlrZT1Icyxxbi5pc0FycmF5TGlrZU9iamVjdD1acyxxbi5pc0Jvb2xlYW49ZnVuY3Rpb24odCl7cmV0dXJuITA9PT10fHwhMT09PXR8fHJhKHQpJiZBcih0KT09eH0scW4uaXNCdWZmZXI9S3MscW4uaXNEYXRlPUpzLHFuLmlzRWxlbWVudD1mdW5jdGlvbih0KXtyZXR1cm4gcmEodCkmJjE9PT10Lm5vZGVUeXBlJiYhc2EodCl9LHFuLmlzRW1wdHk9ZnVuY3Rpb24odCl7aWYobnVsbD09dClyZXR1cm4hMDtpZihIcyh0KSYmKFhzKHQpfHwic3RyaW5nIj09dHlwZW9mIHR8fCJmdW5jdGlvbiI9PXR5cGVvZiB0LnNwbGljZXx8S3ModCl8fGhhKHQpfHxZcyh0KSkpcmV0dXJuIXQubGVuZ3RoO3ZhciBlPW1vKHQpO2lmKGU9PUN8fGU9PU0pcmV0dXJuIXQuc2l6ZTtpZihTbyh0KSlyZXR1cm4ha3IodCkubGVuZ3RoO2Zvcih2YXIgbiBpbiB0KWlmKGt0LmNhbGwodCxuKSlyZXR1cm4hMTtyZXR1cm4hMH0scW4uaXNFcXVhbD1mdW5jdGlvbih0LGUpe3JldHVybiBMcih0LGUpfSxxbi5pc0VxdWFsV2l0aD1mdW5jdGlvbih0LGUscil7dmFyIGk9KHI9ImZ1bmN0aW9uIj09dHlwZW9mIHI/cjpuKT9yKHQsZSk6bjtyZXR1cm4gaT09PW4/THIodCxlLG4scik6ISFpfSxxbi5pc0Vycm9yPVFzLHFuLmlzRmluaXRlPWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdCYmVWUodCl9LHFuLmlzRnVuY3Rpb249JHMscW4uaXNJbnRlZ2VyPXRhLHFuLmlzTGVuZ3RoPWVhLHFuLmlzTWFwPWlhLHFuLmlzTWF0Y2g9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD09PWV8fFByKHQsZSxmbyhlKSl9LHFuLmlzTWF0Y2hXaXRoPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gcj0iZnVuY3Rpb24iPT10eXBlb2Ygcj9yOm4sUHIodCxlLGZvKGUpLHIpfSxxbi5pc05hTj1mdW5jdGlvbih0KXtyZXR1cm4gb2EodCkmJnQhPSt0fSxxbi5pc05hdGl2ZT1mdW5jdGlvbih0KXtpZihDbyh0KSl0aHJvdyBuZXcgU3QoIlVuc3VwcG9ydGVkIGNvcmUtanMgdXNlLiBUcnkgaHR0cHM6Ly9ucG1zLmlvL3NlYXJjaD9xPXBvbnlmaWxsLiIpO3JldHVybiBScih0KX0scW4uaXNOaWw9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXR9LHFuLmlzTnVsbD1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09PXR9LHFuLmlzTnVtYmVyPW9hLHFuLmlzT2JqZWN0PW5hLHFuLmlzT2JqZWN0TGlrZT1yYSxxbi5pc1BsYWluT2JqZWN0PXNhLHFuLmlzUmVnRXhwPWFhLHFuLmlzU2FmZUludGVnZXI9ZnVuY3Rpb24odCl7cmV0dXJuIHRhKHQpJiZ0Pj0tZiYmdDw9Zn0scW4uaXNTZXQ9dWEscW4uaXNTdHJpbmc9Y2EscW4uaXNTeW1ib2w9bGEscW4uaXNUeXBlZEFycmF5PWhhLHFuLmlzVW5kZWZpbmVkPWZ1bmN0aW9uKHQpe3JldHVybiB0PT09bn0scW4uaXNXZWFrTWFwPWZ1bmN0aW9uKHQpe3JldHVybiByYSh0KSYmbW8odCk9PU99LHFuLmlzV2Vha1NldD1mdW5jdGlvbih0KXtyZXR1cm4gcmEodCkmJiJbb2JqZWN0IFdlYWtTZXRdIj09QXIodCl9LHFuLmpvaW49ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09dD8iIjpaZS5jYWxsKHQsZSl9LHFuLmtlYmFiQ2FzZT1YYSxxbi5sYXN0PVFvLHFuLmxhc3RJbmRleE9mPWZ1bmN0aW9uKHQsZSxyKXt2YXIgaT1udWxsPT10PzA6dC5sZW5ndGg7aWYoIWkpcmV0dXJuLTE7dmFyIG89aTtyZXR1cm4gciE9PW4mJihvPShvPXlhKHIpKTwwP3huKGkrbywwKTp3bihvLGktMSkpLGU9PWU/ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj1uKzE7ci0tOylpZih0W3JdPT09ZSlyZXR1cm4gcjtyZXR1cm4gcn0odCxlLG8pOlZlKHQsWGUsbywhMCl9LHFuLmxvd2VyQ2FzZT1XYSxxbi5sb3dlckZpcnN0PUhhLHFuLmx0PWZhLHFuLmx0ZT1wYSxxbi5tYXg9ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQubGVuZ3RoP21yKHQsb3UsTnIpOm59LHFuLm1heEJ5PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQmJnQubGVuZ3RoP21yKHQsbG8oZSwyKSxOcik6bn0scW4ubWVhbj1mdW5jdGlvbih0KXtyZXR1cm4gV2UodCxvdSl9LHFuLm1lYW5CeT1mdW5jdGlvbih0LGUpe3JldHVybiBXZSh0LGxvKGUsMikpfSxxbi5taW49ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQubGVuZ3RoP21yKHQsb3UsanIpOm59LHFuLm1pbkJ5PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQmJnQubGVuZ3RoP21yKHQsbG8oZSwyKSxqcik6bn0scW4uc3R1YkFycmF5PW11LHFuLnN0dWJGYWxzZT12dSxxbi5zdHViT2JqZWN0PWZ1bmN0aW9uKCl7cmV0dXJue319LHFuLnN0dWJTdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iIn0scW4uc3R1YlRydWU9ZnVuY3Rpb24oKXtyZXR1cm4hMH0scW4ubXVsdGlwbHk9RHUscW4ubnRoPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQmJnQubGVuZ3RoP1lyKHQseWEoZSkpOm59LHFuLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oKXtyZXR1cm4geWUuXz09PXRoaXMmJih5ZS5fPVZ0KSx0aGlzfSxxbi5ub29wPWx1LHFuLm5vdz1Ocyxxbi5wYWQ9ZnVuY3Rpb24odCxlLG4pe3Q9eGEodCk7dmFyIHI9KGU9eWEoZSkpP2RuKHQpOjA7aWYoIWV8fHI+PWUpcmV0dXJuIHQ7dmFyIGk9KGUtcikvMjtyZXR1cm4gWGkodmUoaSksbikrdCtYaShtZShpKSxuKX0scW4ucGFkRW5kPWZ1bmN0aW9uKHQsZSxuKXt0PXhhKHQpO3ZhciByPShlPXlhKGUpKT9kbih0KTowO3JldHVybiBlJiZyPGU/dCtYaShlLXIsbik6dH0scW4ucGFkU3RhcnQ9ZnVuY3Rpb24odCxlLG4pe3Q9eGEodCk7dmFyIHI9KGU9eWEoZSkpP2RuKHQpOjA7cmV0dXJuIGUmJnI8ZT9YaShlLXIsbikrdDp0fSxxbi5wYXJzZUludD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIG58fG51bGw9PWU/ZT0wOmUmJihlPStlKSxEbih4YSh0KS5yZXBsYWNlKHN0LCIiKSxlfHwwKX0scW4ucmFuZG9tPWZ1bmN0aW9uKHQsZSxyKXtpZihyJiYiYm9vbGVhbiIhPXR5cGVvZiByJiZibyh0LGUscikmJihlPXI9bikscj09PW4mJigiYm9vbGVhbiI9PXR5cGVvZiBlPyhyPWUsZT1uKToiYm9vbGVhbiI9PXR5cGVvZiB0JiYocj10LHQ9bikpLHQ9PT1uJiZlPT09bj8odD0wLGU9MSk6KHQ9Z2EodCksZT09PW4/KGU9dCx0PTApOmU9Z2EoZSkpLHQ+ZSl7dmFyIGk9dDt0PWUsZT1pfWlmKHJ8fHQlMXx8ZSUxKXt2YXIgbz1FbigpO3JldHVybiB3bih0K28qKGUtdCtmZSgiMWUtIisoKG8rIiIpLmxlbmd0aC0xKSkpLGUpfXJldHVybiBLcih0LGUpfSxxbi5yZWR1Y2U9ZnVuY3Rpb24odCxlLG4pe3ZhciByPVhzKHQpP2tlOktlLGk9YXJndW1lbnRzLmxlbmd0aDwzO3JldHVybiByKHQsbG8oZSw0KSxuLGksZHIpfSxxbi5yZWR1Y2VSaWdodD1mdW5jdGlvbih0LGUsbil7dmFyIHI9WHModCk/emU6S2UsaT1hcmd1bWVudHMubGVuZ3RoPDM7cmV0dXJuIHIodCxsbyhlLDQpLG4saSxncil9LHFuLnJlcGVhdD1mdW5jdGlvbih0LGUscil7cmV0dXJuIGU9KHI/Ym8odCxlLHIpOmU9PT1uKT8xOnlhKGUpLEpyKHhhKHQpLGUpfSxxbi5yZXBsYWNlPWZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLGU9eGEodFswXSk7cmV0dXJuIHQubGVuZ3RoPDM/ZTplLnJlcGxhY2UodFsxXSx0WzJdKX0scW4ucmVzdWx0PWZ1bmN0aW9uKHQsZSxyKXt2YXIgaT0tMSxvPShlPXdpKGUsdCkpLmxlbmd0aDtmb3Iob3x8KG89MSx0PW4pOysraTxvOyl7dmFyIHM9bnVsbD09dD9uOnRbem8oZVtpXSldO3M9PT1uJiYoaT1vLHM9ciksdD0kcyhzKT9zLmNhbGwodCk6c31yZXR1cm4gdH0scW4ucm91bmQ9RXUscW4ucnVuSW5Db250ZXh0PXQscW4uc2FtcGxlPWZ1bmN0aW9uKHQpe3JldHVybihYcyh0KT8kbjokcikodCl9LHFuLnNpemU9ZnVuY3Rpb24odCl7aWYobnVsbD09dClyZXR1cm4gMDtpZihIcyh0KSlyZXR1cm4gY2EodCk/ZG4odCk6dC5sZW5ndGg7dmFyIGU9bW8odCk7cmV0dXJuIGU9PUN8fGU9PU0/dC5zaXplOmtyKHQpLmxlbmd0aH0scW4uc25ha2VDYXNlPVphLHFuLnNvbWU9ZnVuY3Rpb24odCxlLHIpe3ZhciBpPVhzKHQpP2plOnNpO3JldHVybiByJiZibyh0LGUscikmJihlPW4pLGkodCxsbyhlLDMpKX0scW4uc29ydGVkSW5kZXg9ZnVuY3Rpb24odCxlKXtyZXR1cm4gYWkodCxlKX0scW4uc29ydGVkSW5kZXhCeT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHVpKHQsZSxsbyhuLDIpKX0scW4uc29ydGVkSW5kZXhPZj1mdW5jdGlvbih0LGUpe3ZhciBuPW51bGw9PXQ/MDp0Lmxlbmd0aDtpZihuKXt2YXIgcj1haSh0LGUpO2lmKHI8biYmcXModFtyXSxlKSlyZXR1cm4gcn1yZXR1cm4tMX0scW4uc29ydGVkTGFzdEluZGV4PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGFpKHQsZSwhMCl9LHFuLnNvcnRlZExhc3RJbmRleEJ5PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdWkodCxlLGxvKG4sMiksITApfSxxbi5zb3J0ZWRMYXN0SW5kZXhPZj1mdW5jdGlvbih0LGUpe2lmKG51bGw9PXQ/MDp0Lmxlbmd0aCl7dmFyIG49YWkodCxlLCEwKS0xO2lmKHFzKHRbbl0sZSkpcmV0dXJuIG59cmV0dXJuLTF9LHFuLnN0YXJ0Q2FzZT1LYSxxbi5zdGFydHNXaXRoPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdD14YSh0KSxuPW51bGw9PW4/MDpjcih5YShuKSwwLHQubGVuZ3RoKSxlPWhpKGUpLHQuc2xpY2UobixuK2UubGVuZ3RoKT09ZX0scW4uc3VidHJhY3Q9Q3UscW4uc3VtPWZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0Lmxlbmd0aD9KZSh0LG91KTowfSxxbi5zdW1CeT1mdW5jdGlvbih0LGUpe3JldHVybiB0JiZ0Lmxlbmd0aD9KZSh0LGxvKGUsMikpOjB9LHFuLnRlbXBsYXRlPWZ1bmN0aW9uKHQsZSxyKXt2YXIgaT1xbi50ZW1wbGF0ZVNldHRpbmdzO3ImJmJvKHQsZSxyKSYmKGU9biksdD14YSh0KSxlPURhKHt9LGUsaSx0byk7dmFyIG8scyxhPURhKHt9LGUuaW1wb3J0cyxpLmltcG9ydHMsdG8pLHU9T2EoYSksYz1lbihhLHUpLGw9MCxoPWUuaW50ZXJwb2xhdGV8fGJ0LGY9Il9fcCArPSAnIixwPU10KChlLmVzY2FwZXx8YnQpLnNvdXJjZSsifCIraC5zb3VyY2UrInwiKyhoPT09dHQ/ZHQ6YnQpLnNvdXJjZSsifCIrKGUuZXZhbHVhdGV8fGJ0KS5zb3VyY2UrInwkIiwiZyIpLGQ9Ii8vIyBzb3VyY2VVUkw9Iisoa3QuY2FsbChlLCJzb3VyY2VVUkwiKT8oZS5zb3VyY2VVUkwrIiIpLnJlcGxhY2UoL1xzL2csIiAiKToibG9kYXNoLnRlbXBsYXRlU291cmNlc1siKyArK3VlKyJdIikrIlxuIjt0LnJlcGxhY2UocCwoZnVuY3Rpb24oZSxuLHIsaSxhLHUpe3JldHVybiByfHwocj1pKSxmKz10LnNsaWNlKGwsdSkucmVwbGFjZShEdCx1biksbiYmKG89ITAsZis9IicgK1xuX19lKCIrbisiKSArXG4nIiksYSYmKHM9ITAsZis9Iic7XG4iK2ErIjtcbl9fcCArPSAnIiksciYmKGYrPSInICtcbigoX190ID0gKCIrcisiKSkgPT0gbnVsbCA/ICcnIDogX190KSArXG4nIiksbD11K2UubGVuZ3RoLGV9KSksZis9Iic7XG4iO3ZhciBnPWt0LmNhbGwoZSwidmFyaWFibGUiKSYmZS52YXJpYWJsZTtpZihnKXtpZihmdC50ZXN0KGcpKXRocm93IG5ldyBTdCgiSW52YWxpZCBgdmFyaWFibGVgIG9wdGlvbiBwYXNzZWQgaW50byBgXy50ZW1wbGF0ZWAiKX1lbHNlIGY9IndpdGggKG9iaikge1xuIitmKyJcbn1cbiI7Zj0ocz9mLnJlcGxhY2UoWSwiIik6ZikucmVwbGFjZShYLCIkMSIpLnJlcGxhY2UoVywiJDE7IiksZj0iZnVuY3Rpb24oIisoZ3x8Im9iaiIpKyIpIHtcbiIrKGc/IiI6Im9iaiB8fCAob2JqID0ge30pO1xuIikrInZhciBfX3QsIF9fcCA9ICcnIisobz8iLCBfX2UgPSBfLmVzY2FwZSI6IiIpKyhzPyIsIF9faiA9IEFycmF5LnByb3RvdHlwZS5qb2luO1xuZnVuY3Rpb24gcHJpbnQoKSB7IF9fcCArPSBfX2ouY2FsbChhcmd1bWVudHMsICcnKSB9XG4iOiI7XG4iKStmKyJyZXR1cm4gX19wXG59Ijt2YXIgeT10dSgoZnVuY3Rpb24oKXtyZXR1cm4gQXQodSxkKyJyZXR1cm4gIitmKS5hcHBseShuLGMpfSkpO2lmKHkuc291cmNlPWYsUXMoeSkpdGhyb3cgeTtyZXR1cm4geX0scW4udGltZXM9ZnVuY3Rpb24odCxlKXtpZigodD15YSh0KSk8MXx8dD5mKXJldHVybltdO3ZhciBuPWQscj13bih0LGQpO2U9bG8oZSksdC09ZDtmb3IodmFyIGk9UWUocixlKTsrK248dDspZShuKTtyZXR1cm4gaX0scW4udG9GaW5pdGU9Z2EscW4udG9JbnRlZ2VyPXlhLHFuLnRvTGVuZ3RoPW1hLHFuLnRvTG93ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIHhhKHQpLnRvTG93ZXJDYXNlKCl9LHFuLnRvTnVtYmVyPXZhLHFuLnRvU2FmZUludGVnZXI9ZnVuY3Rpb24odCl7cmV0dXJuIHQ/Y3IoeWEodCksLWYsZik6MD09PXQ/dDowfSxxbi50b1N0cmluZz14YSxxbi50b1VwcGVyPWZ1bmN0aW9uKHQpe3JldHVybiB4YSh0KS50b1VwcGVyQ2FzZSgpfSxxbi50cmltPWZ1bmN0aW9uKHQsZSxyKXtpZigodD14YSh0KSkmJihyfHxlPT09bikpcmV0dXJuICRlKHQpO2lmKCF0fHwhKGU9aGkoZSkpKXJldHVybiB0O3ZhciBpPWduKHQpLG89Z24oZSk7cmV0dXJuIERpKGkscm4oaSxvKSxvbihpLG8pKzEpLmpvaW4oIiIpfSxxbi50cmltRW5kPWZ1bmN0aW9uKHQsZSxyKXtpZigodD14YSh0KSkmJihyfHxlPT09bikpcmV0dXJuIHQuc2xpY2UoMCx5bih0KSsxKTtpZighdHx8IShlPWhpKGUpKSlyZXR1cm4gdDt2YXIgaT1nbih0KTtyZXR1cm4gRGkoaSwwLG9uKGksZ24oZSkpKzEpLmpvaW4oIiIpfSxxbi50cmltU3RhcnQ9ZnVuY3Rpb24odCxlLHIpe2lmKCh0PXhhKHQpKSYmKHJ8fGU9PT1uKSlyZXR1cm4gdC5yZXBsYWNlKHN0LCIiKTtpZighdHx8IShlPWhpKGUpKSlyZXR1cm4gdDt2YXIgaT1nbih0KTtyZXR1cm4gRGkoaSxybihpLGduKGUpKSkuam9pbigiIil9LHFuLnRydW5jYXRlPWZ1bmN0aW9uKHQsZSl7dmFyIHI9MzAsaT0iLi4uIjtpZihuYShlKSl7dmFyIG89InNlcGFyYXRvciJpbiBlP2Uuc2VwYXJhdG9yOm87cj0ibGVuZ3RoImluIGU/eWEoZS5sZW5ndGgpOnIsaT0ib21pc3Npb24iaW4gZT9oaShlLm9taXNzaW9uKTppfXZhciBzPSh0PXhhKHQpKS5sZW5ndGg7aWYoY24odCkpe3ZhciBhPWduKHQpO3M9YS5sZW5ndGh9aWYocj49cylyZXR1cm4gdDt2YXIgdT1yLWRuKGkpO2lmKHU8MSlyZXR1cm4gaTt2YXIgYz1hP0RpKGEsMCx1KS5qb2luKCIiKTp0LnNsaWNlKDAsdSk7aWYobz09PW4pcmV0dXJuIGMraTtpZihhJiYodSs9Yy5sZW5ndGgtdSksYWEobykpe2lmKHQuc2xpY2UodSkuc2VhcmNoKG8pKXt2YXIgbCxoPWM7Zm9yKG8uZ2xvYmFsfHwobz1NdChvLnNvdXJjZSx4YShndC5leGVjKG8pKSsiZyIpKSxvLmxhc3RJbmRleD0wO2w9by5leGVjKGgpOyl2YXIgZj1sLmluZGV4O2M9Yy5zbGljZSgwLGY9PT1uP3U6Zil9fWVsc2UgaWYodC5pbmRleE9mKGhpKG8pLHUpIT11KXt2YXIgcD1jLmxhc3RJbmRleE9mKG8pO3A+LTEmJihjPWMuc2xpY2UoMCxwKSl9cmV0dXJuIGMraX0scW4udW5lc2NhcGU9ZnVuY3Rpb24odCl7cmV0dXJuKHQ9eGEodCkpJiZLLnRlc3QodCk/dC5yZXBsYWNlKEgsbW4pOnR9LHFuLnVuaXF1ZUlkPWZ1bmN0aW9uKHQpe3ZhciBlPSsrenQ7cmV0dXJuIHhhKHQpK2V9LHFuLnVwcGVyQ2FzZT1KYSxxbi51cHBlckZpcnN0PVFhLHFuLmVhY2g9eHMscW4uZWFjaFJpZ2h0PXdzLHFuLmZpcnN0PUhvLGN1KHFuLGZ1bmN0aW9uKCl7dmFyIHQ9e307cmV0dXJuIGJyKHFuLChmdW5jdGlvbihlLG4pe2t0LmNhbGwocW4ucHJvdG90eXBlLG4pfHwodFtuXT1lKX0pKSx0fSgpLHtjaGFpbjohMX0pLHFuLlZFUlNJT049IjQuMTcuMjEiLE1lKFsiYmluZCIsImJpbmRLZXkiLCJjdXJyeSIsImN1cnJ5UmlnaHQiLCJwYXJ0aWFsIiwicGFydGlhbFJpZ2h0Il0sKGZ1bmN0aW9uKHQpe3FuW3RdLnBsYWNlaG9sZGVyPXFufSkpLE1lKFsiZHJvcCIsInRha2UiXSwoZnVuY3Rpb24odCxlKXtYbi5wcm90b3R5cGVbdF09ZnVuY3Rpb24ocil7cj1yPT09bj8xOnhuKHlhKHIpLDApO3ZhciBpPXRoaXMuX19maWx0ZXJlZF9fJiYhZT9uZXcgWG4odGhpcyk6dGhpcy5jbG9uZSgpO3JldHVybiBpLl9fZmlsdGVyZWRfXz9pLl9fdGFrZUNvdW50X189d24ocixpLl9fdGFrZUNvdW50X18pOmkuX192aWV3c19fLnB1c2goe3NpemU6d24ocixkKSx0eXBlOnQrKGkuX19kaXJfXzwwPyJSaWdodCI6IiIpfSksaX0sWG4ucHJvdG90eXBlW3QrIlJpZ2h0Il09ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucmV2ZXJzZSgpW3RdKGUpLnJldmVyc2UoKX19KSksTWUoWyJmaWx0ZXIiLCJtYXAiLCJ0YWtlV2hpbGUiXSwoZnVuY3Rpb24odCxlKXt2YXIgbj1lKzEscj0xPT1ufHwzPT1uO1huLnByb3RvdHlwZVt0XT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmNsb25lKCk7cmV0dXJuIGUuX19pdGVyYXRlZXNfXy5wdXNoKHtpdGVyYXRlZTpsbyh0LDMpLHR5cGU6bn0pLGUuX19maWx0ZXJlZF9fPWUuX19maWx0ZXJlZF9ffHxyLGV9fSkpLE1lKFsiaGVhZCIsImxhc3QiXSwoZnVuY3Rpb24odCxlKXt2YXIgbj0idGFrZSIrKGU/IlJpZ2h0IjoiIik7WG4ucHJvdG90eXBlW3RdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbbl0oMSkudmFsdWUoKVswXX19KSksTWUoWyJpbml0aWFsIiwidGFpbCJdLChmdW5jdGlvbih0LGUpe3ZhciBuPSJkcm9wIisoZT8iIjoiUmlnaHQiKTtYbi5wcm90b3R5cGVbdF09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fX2ZpbHRlcmVkX18/bmV3IFhuKHRoaXMpOnRoaXNbbl0oMSl9fSkpLFhuLnByb3RvdHlwZS5jb21wYWN0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmlsdGVyKG91KX0sWG4ucHJvdG90eXBlLmZpbmQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZmlsdGVyKHQpLmhlYWQoKX0sWG4ucHJvdG90eXBlLmZpbmRMYXN0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnJldmVyc2UoKS5maW5kKHQpfSxYbi5wcm90b3R5cGUuaW52b2tlTWFwPVFyKChmdW5jdGlvbih0LGUpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0P25ldyBYbih0aGlzKTp0aGlzLm1hcCgoZnVuY3Rpb24obil7cmV0dXJuIFRyKG4sdCxlKX0pKX0pKSxYbi5wcm90b3R5cGUucmVqZWN0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmZpbHRlcihCcyhsbyh0KSkpfSxYbi5wcm90b3R5cGUuc2xpY2U9ZnVuY3Rpb24odCxlKXt0PXlhKHQpO3ZhciByPXRoaXM7cmV0dXJuIHIuX19maWx0ZXJlZF9fJiYodD4wfHxlPDApP25ldyBYbihyKToodDwwP3I9ci50YWtlUmlnaHQoLXQpOnQmJihyPXIuZHJvcCh0KSksZSE9PW4mJihyPShlPXlhKGUpKTwwP3IuZHJvcFJpZ2h0KC1lKTpyLnRha2UoZS10KSkscil9LFhuLnByb3RvdHlwZS50YWtlUmlnaHRXaGlsZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5yZXZlcnNlKCkudGFrZVdoaWxlKHQpLnJldmVyc2UoKX0sWG4ucHJvdG90eXBlLnRvQXJyYXk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50YWtlKGQpfSxicihYbi5wcm90b3R5cGUsKGZ1bmN0aW9uKHQsZSl7dmFyIHI9L14oPzpmaWx0ZXJ8ZmluZHxtYXB8cmVqZWN0KXxXaGlsZSQvLnRlc3QoZSksaT0vXig/OmhlYWR8bGFzdCkkLy50ZXN0KGUpLG89cW5baT8idGFrZSIrKCJsYXN0Ij09ZT8iUmlnaHQiOiIiKTplXSxzPWl8fC9eZmluZC8udGVzdChlKTshb3x8KHFuLnByb3RvdHlwZVtlXT1mdW5jdGlvbigpe3ZhciBlPXRoaXMuX193cmFwcGVkX18sYT1pP1sxXTphcmd1bWVudHMsdT1lIGluc3RhbmNlb2YgWG4sYz1hWzBdLGw9dXx8WHMoZSksaD1mdW5jdGlvbih0KXt2YXIgZT1vLmFwcGx5KHFuLEJlKFt0XSxhKSk7cmV0dXJuIGkmJmY/ZVswXTplfTtsJiZyJiYiZnVuY3Rpb24iPT10eXBlb2YgYyYmMSE9Yy5sZW5ndGgmJih1PWw9ITEpO3ZhciBmPXRoaXMuX19jaGFpbl9fLHA9ISF0aGlzLl9fYWN0aW9uc19fLmxlbmd0aCxkPXMmJiFmLGc9dSYmIXA7aWYoIXMmJmwpe2U9Zz9lOm5ldyBYbih0aGlzKTt2YXIgeT10LmFwcGx5KGUsYSk7cmV0dXJuIHkuX19hY3Rpb25zX18ucHVzaCh7ZnVuYzpncyxhcmdzOltoXSx0aGlzQXJnOm59KSxuZXcgWW4oeSxmKX1yZXR1cm4gZCYmZz90LmFwcGx5KHRoaXMsYSk6KHk9dGhpcy50aHJ1KGgpLGQ/aT95LnZhbHVlKClbMF06eS52YWx1ZSgpOnkpfSl9KSksTWUoWyJwb3AiLCJwdXNoIiwic2hpZnQiLCJzb3J0Iiwic3BsaWNlIiwidW5zaGlmdCJdLChmdW5jdGlvbih0KXt2YXIgZT1PdFt0XSxuPS9eKD86cHVzaHxzb3J0fHVuc2hpZnQpJC8udGVzdCh0KT8idGFwIjoidGhydSIscj0vXig/OnBvcHxzaGlmdCkkLy50ZXN0KHQpO3FuLnByb3RvdHlwZVt0XT1mdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cztpZihyJiYhdGhpcy5fX2NoYWluX18pe3ZhciBpPXRoaXMudmFsdWUoKTtyZXR1cm4gZS5hcHBseShYcyhpKT9pOltdLHQpfXJldHVybiB0aGlzW25dKChmdW5jdGlvbihuKXtyZXR1cm4gZS5hcHBseShYcyhuKT9uOltdLHQpfSkpfX0pKSxicihYbi5wcm90b3R5cGUsKGZ1bmN0aW9uKHQsZSl7dmFyIG49cW5bZV07aWYobil7dmFyIHI9bi5uYW1lKyIiO2t0LmNhbGwoT24scil8fChPbltyXT1bXSksT25bcl0ucHVzaCh7bmFtZTplLGZ1bmM6bn0pfX0pKSxPbltxaShuLDIpLm5hbWVdPVt7bmFtZToid3JhcHBlciIsZnVuYzpufV0sWG4ucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IFhuKHRoaXMuX193cmFwcGVkX18pO3JldHVybiB0Ll9fYWN0aW9uc19fPUZpKHRoaXMuX19hY3Rpb25zX18pLHQuX19kaXJfXz10aGlzLl9fZGlyX18sdC5fX2ZpbHRlcmVkX189dGhpcy5fX2ZpbHRlcmVkX18sdC5fX2l0ZXJhdGVlc19fPUZpKHRoaXMuX19pdGVyYXRlZXNfXyksdC5fX3Rha2VDb3VudF9fPXRoaXMuX190YWtlQ291bnRfXyx0Ll9fdmlld3NfXz1GaSh0aGlzLl9fdmlld3NfXyksdH0sWG4ucHJvdG90eXBlLnJldmVyc2U9ZnVuY3Rpb24oKXtpZih0aGlzLl9fZmlsdGVyZWRfXyl7dmFyIHQ9bmV3IFhuKHRoaXMpO3QuX19kaXJfXz0tMSx0Ll9fZmlsdGVyZWRfXz0hMH1lbHNlKHQ9dGhpcy5jbG9uZSgpKS5fX2Rpcl9fKj0tMTtyZXR1cm4gdH0sWG4ucHJvdG90eXBlLnZhbHVlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fX3dyYXBwZWRfXy52YWx1ZSgpLGU9dGhpcy5fX2Rpcl9fLG49WHModCkscj1lPDAsaT1uP3QubGVuZ3RoOjAsbz1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPS0xLGk9bi5sZW5ndGg7KytyPGk7KXt2YXIgbz1uW3JdLHM9by5zaXplO3N3aXRjaChvLnR5cGUpe2Nhc2UiZHJvcCI6dCs9czticmVhaztjYXNlImRyb3BSaWdodCI6ZS09czticmVhaztjYXNlInRha2UiOmU9d24oZSx0K3MpO2JyZWFrO2Nhc2UidGFrZVJpZ2h0Ijp0PXhuKHQsZS1zKX19cmV0dXJue3N0YXJ0OnQsZW5kOmV9fSgwLGksdGhpcy5fX3ZpZXdzX18pLHM9by5zdGFydCxhPW8uZW5kLHU9YS1zLGM9cj9hOnMtMSxsPXRoaXMuX19pdGVyYXRlZXNfXyxoPWwubGVuZ3RoLGY9MCxwPXduKHUsdGhpcy5fX3Rha2VDb3VudF9fKTtpZighbnx8IXImJmk9PXUmJnA9PXUpcmV0dXJuIHlpKHQsdGhpcy5fX2FjdGlvbnNfXyk7dmFyIGQ9W107dDpmb3IoO3UtLSYmZjxwOyl7Zm9yKHZhciBnPS0xLHk9dFtjKz1lXTsrK2c8aDspe3ZhciBtPWxbZ10sdj1tLml0ZXJhdGVlLF89bS50eXBlLHg9dih5KTtpZigyPT1fKXk9eDtlbHNlIGlmKCF4KXtpZigxPT1fKWNvbnRpbnVlIHQ7YnJlYWsgdH19ZFtmKytdPXl9cmV0dXJuIGR9LHFuLnByb3RvdHlwZS5hdD15cyxxbi5wcm90b3R5cGUuY2hhaW49ZnVuY3Rpb24oKXtyZXR1cm4gZHModGhpcyl9LHFuLnByb3RvdHlwZS5jb21taXQ9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFluKHRoaXMudmFsdWUoKSx0aGlzLl9fY2hhaW5fXyl9LHFuLnByb3RvdHlwZS5uZXh0PWZ1bmN0aW9uKCl7dGhpcy5fX3ZhbHVlc19fPT09biYmKHRoaXMuX192YWx1ZXNfXz1kYSh0aGlzLnZhbHVlKCkpKTt2YXIgdD10aGlzLl9faW5kZXhfXz49dGhpcy5fX3ZhbHVlc19fLmxlbmd0aDtyZXR1cm57ZG9uZTp0LHZhbHVlOnQ/bjp0aGlzLl9fdmFsdWVzX19bdGhpcy5fX2luZGV4X18rK119fSxxbi5wcm90b3R5cGUucGxhbnQ9ZnVuY3Rpb24odCl7Zm9yKHZhciBlLHI9dGhpcztyIGluc3RhbmNlb2YgR247KXt2YXIgaT1VbyhyKTtpLl9faW5kZXhfXz0wLGkuX192YWx1ZXNfXz1uLGU/by5fX3dyYXBwZWRfXz1pOmU9aTt2YXIgbz1pO3I9ci5fX3dyYXBwZWRfX31yZXR1cm4gby5fX3dyYXBwZWRfXz10LGV9LHFuLnByb3RvdHlwZS5yZXZlcnNlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fX3dyYXBwZWRfXztpZih0IGluc3RhbmNlb2YgWG4pe3ZhciBlPXQ7cmV0dXJuIHRoaXMuX19hY3Rpb25zX18ubGVuZ3RoJiYoZT1uZXcgWG4odGhpcykpLChlPWUucmV2ZXJzZSgpKS5fX2FjdGlvbnNfXy5wdXNoKHtmdW5jOmdzLGFyZ3M6W25zXSx0aGlzQXJnOm59KSxuZXcgWW4oZSx0aGlzLl9fY2hhaW5fXyl9cmV0dXJuIHRoaXMudGhydShucyl9LHFuLnByb3RvdHlwZS50b0pTT049cW4ucHJvdG90eXBlLnZhbHVlT2Y9cW4ucHJvdG90eXBlLnZhbHVlPWZ1bmN0aW9uKCl7cmV0dXJuIHlpKHRoaXMuX193cmFwcGVkX18sdGhpcy5fX2FjdGlvbnNfXyl9LHFuLnByb3RvdHlwZS5maXJzdD1xbi5wcm90b3R5cGUuaGVhZCx0ZSYmKHFuLnByb3RvdHlwZVt0ZV09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30pLHFufSgpO3ZlPygodmUuZXhwb3J0cz12bikuXz12bixtZS5fPXZuKTp5ZS5fPXZufSkuY2FsbCh0ZSl9KSk7dmFyIG5lPTYzNzEwMDguOCxyZT17bWV0ZXJzOm5lLG1ldHJlczpuZSxtaWxsaW1ldGVyczoxZTMqbmUsbWlsbGltZXRyZXM6MWUzKm5lLGNlbnRpbWV0ZXJzOjEwMCpuZSxjZW50aW1ldHJlczoxMDAqbmUsa2lsb21ldGVyczpuZS8xZTMsa2lsb21ldHJlczpuZS8xZTMsbWlsZXM6bmUvMTYwOS4zNDQsbmF1dGljYWxtaWxlczpuZS8xODUyLGluY2hlczozOS4zNypuZSx5YXJkczpuZS8xLjA5MzYsZmVldDozLjI4MDg0Km5lLHJhZGlhbnM6MSxkZWdyZWVzOm5lLzExMTMyNX0saWU9e21ldGVyczoxLG1ldHJlczoxLG1pbGxpbWV0ZXJzOjFlMyxtaWxsaW1ldHJlczoxZTMsY2VudGltZXRlcnM6MTAwLGNlbnRpbWV0cmVzOjEwMCxraWxvbWV0ZXJzOi4wMDEsa2lsb21ldHJlczouMDAxLG1pbGVzOjEvMTYwOS4zNDQsbmF1dGljYWxtaWxlczoxLzE4NTIsaW5jaGVzOjM5LjM3LHlhcmRzOjEvMS4wOTM2LGZlZXQ6My4yODA4NCxyYWRpYW5zOjEvbmUsZGVncmVlczoxLzExMTMyNX0sb2U9e21ldGVyczoxLG1ldHJlczoxLG1pbGxpbWV0ZXJzOjFlNixtaWxsaW1ldHJlczoxZTYsY2VudGltZXRlcnM6MWU0LGNlbnRpbWV0cmVzOjFlNCxraWxvbWV0ZXJzOjFlLTYsa2lsb21ldHJlczoxZS02LGFjcmVzOjI0NzEwNWUtOSxtaWxlczozODZlLTkseWFyZHM6MS4xOTU5OTAwNDYsZmVldDoxMC43NjM5MTA0MTcsaW5jaGVzOjE1NTAuMDAzMTAwMDA2fTtmdW5jdGlvbiBzZSh0LGUsbil7aWYoIXZlKG49bnx8e30pKXRocm93IG5ldyBFcnJvcigib3B0aW9ucyBpcyBpbnZhbGlkIik7dmFyIHI9bi5iYm94LGk9bi5pZDtpZih2b2lkIDA9PT10KXRocm93IG5ldyBFcnJvcigiZ2VvbWV0cnkgaXMgcmVxdWlyZWQiKTtpZihlJiZlLmNvbnN0cnVjdG9yIT09T2JqZWN0KXRocm93IG5ldyBFcnJvcigicHJvcGVydGllcyBtdXN0IGJlIGFuIE9iamVjdCIpO3ImJl9lKHIpLGkmJnhlKGkpO3ZhciBvPXt0eXBlOiJGZWF0dXJlIn07cmV0dXJuIGkmJihvLmlkPWkpLHImJihvLmJib3g9ciksby5wcm9wZXJ0aWVzPWV8fHt9LG8uZ2VvbWV0cnk9dCxvfWZ1bmN0aW9uIGFlKHQsZSxuKXtpZighdCl0aHJvdyBuZXcgRXJyb3IoImNvb3JkaW5hdGVzIGlzIHJlcXVpcmVkIik7aWYoIUFycmF5LmlzQXJyYXkodCkpdGhyb3cgbmV3IEVycm9yKCJjb29yZGluYXRlcyBtdXN0IGJlIGFuIEFycmF5Iik7aWYodC5sZW5ndGg8Mil0aHJvdyBuZXcgRXJyb3IoImNvb3JkaW5hdGVzIG11c3QgYmUgYXQgbGVhc3QgMiBudW1iZXJzIGxvbmciKTtpZighbWUodFswXSl8fCFtZSh0WzFdKSl0aHJvdyBuZXcgRXJyb3IoImNvb3JkaW5hdGVzIG11c3QgY29udGFpbiBudW1iZXJzIik7cmV0dXJuIHNlKHt0eXBlOiJQb2ludCIsY29vcmRpbmF0ZXM6dH0sZSxuKX1mdW5jdGlvbiB1ZSh0LGUsbil7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJjb29yZGluYXRlcyBpcyByZXF1aXJlZCIpO2Zvcih2YXIgcj0wO3I8dC5sZW5ndGg7cisrKXt2YXIgaT10W3JdO2lmKGkubGVuZ3RoPDQpdGhyb3cgbmV3IEVycm9yKCJFYWNoIExpbmVhclJpbmcgb2YgYSBQb2x5Z29uIG11c3QgaGF2ZSA0IG9yIG1vcmUgUG9zaXRpb25zLiIpO2Zvcih2YXIgbz0wO288aVtpLmxlbmd0aC0xXS5sZW5ndGg7bysrKXtpZigwPT09ciYmMD09PW8mJiFtZShpWzBdWzBdKXx8IW1lKGlbMF1bMV0pKXRocm93IG5ldyBFcnJvcigiY29vcmRpbmF0ZXMgbXVzdCBjb250YWluIG51bWJlcnMiKTtpZihpW2kubGVuZ3RoLTFdW29dIT09aVswXVtvXSl0aHJvdyBuZXcgRXJyb3IoIkZpcnN0IGFuZCBsYXN0IFBvc2l0aW9uIGFyZSBub3QgZXF1aXZhbGVudC4iKX19cmV0dXJuIHNlKHt0eXBlOiJQb2x5Z29uIixjb29yZGluYXRlczp0fSxlLG4pfWZ1bmN0aW9uIGNlKHQsZSxuKXtpZighdCl0aHJvdyBuZXcgRXJyb3IoImNvb3JkaW5hdGVzIGlzIHJlcXVpcmVkIik7aWYodC5sZW5ndGg8Mil0aHJvdyBuZXcgRXJyb3IoImNvb3JkaW5hdGVzIG11c3QgYmUgYW4gYXJyYXkgb2YgdHdvIG9yIG1vcmUgcG9zaXRpb25zIik7aWYoIW1lKHRbMF1bMV0pfHwhbWUodFswXVsxXSkpdGhyb3cgbmV3IEVycm9yKCJjb29yZGluYXRlcyBtdXN0IGNvbnRhaW4gbnVtYmVycyIpO3JldHVybiBzZSh7dHlwZToiTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6dH0sZSxuKX1mdW5jdGlvbiBsZSh0LGUpe2lmKCF2ZShlPWV8fHt9KSl0aHJvdyBuZXcgRXJyb3IoIm9wdGlvbnMgaXMgaW52YWxpZCIpO3ZhciBuPWUuYmJveCxyPWUuaWQ7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJObyBmZWF0dXJlcyBwYXNzZWQiKTtpZighQXJyYXkuaXNBcnJheSh0KSl0aHJvdyBuZXcgRXJyb3IoImZlYXR1cmVzIG11c3QgYmUgYW4gQXJyYXkiKTtuJiZfZShuKSxyJiZ4ZShyKTt2YXIgaT17dHlwZToiRmVhdHVyZUNvbGxlY3Rpb24ifTtyZXR1cm4gciYmKGkuaWQ9ciksbiYmKGkuYmJveD1uKSxpLmZlYXR1cmVzPXQsaX1mdW5jdGlvbiBoZSh0LGUsbil7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJjb29yZGluYXRlcyBpcyByZXF1aXJlZCIpO3JldHVybiBzZSh7dHlwZToiTXVsdGlMaW5lU3RyaW5nIixjb29yZGluYXRlczp0fSxlLG4pfWZ1bmN0aW9uIGZlKHQsZSxuKXtpZighdCl0aHJvdyBuZXcgRXJyb3IoImNvb3JkaW5hdGVzIGlzIHJlcXVpcmVkIik7cmV0dXJuIHNlKHt0eXBlOiJNdWx0aVBvaW50Iixjb29yZGluYXRlczp0fSxlLG4pfWZ1bmN0aW9uIHBlKHQsZSxuKXtpZighdCl0aHJvdyBuZXcgRXJyb3IoImNvb3JkaW5hdGVzIGlzIHJlcXVpcmVkIik7cmV0dXJuIHNlKHt0eXBlOiJNdWx0aVBvbHlnb24iLGNvb3JkaW5hdGVzOnR9LGUsbil9ZnVuY3Rpb24gZGUodCxlKXtpZihudWxsPT10KXRocm93IG5ldyBFcnJvcigicmFkaWFucyBpcyByZXF1aXJlZCIpO2lmKGUmJiJzdHJpbmciIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3IoInVuaXRzIG11c3QgYmUgYSBzdHJpbmciKTt2YXIgbj1yZVtlfHwia2lsb21ldGVycyJdO2lmKCFuKXRocm93IG5ldyBFcnJvcihlKyIgdW5pdHMgaXMgaW52YWxpZCIpO3JldHVybiB0Km59ZnVuY3Rpb24gZ2UodCxlKXtpZihudWxsPT10KXRocm93IG5ldyBFcnJvcigiZGlzdGFuY2UgaXMgcmVxdWlyZWQiKTtpZihlJiYic3RyaW5nIiE9dHlwZW9mIGUpdGhyb3cgbmV3IEVycm9yKCJ1bml0cyBtdXN0IGJlIGEgc3RyaW5nIik7dmFyIG49cmVbZXx8ImtpbG9tZXRlcnMiXTtpZighbil0aHJvdyBuZXcgRXJyb3IoZSsiIHVuaXRzIGlzIGludmFsaWQiKTtyZXR1cm4gdC9ufWZ1bmN0aW9uIHllKHQpe2lmKG51bGw9PXQpdGhyb3cgbmV3IEVycm9yKCJyYWRpYW5zIGlzIHJlcXVpcmVkIik7cmV0dXJuIDE4MCoodCUoMipNYXRoLlBJKSkvTWF0aC5QSX1mdW5jdGlvbiBtZSh0KXtyZXR1cm4haXNOYU4odCkmJm51bGwhPT10JiYhQXJyYXkuaXNBcnJheSh0KX1mdW5jdGlvbiB2ZSh0KXtyZXR1cm4hIXQmJnQuY29uc3RydWN0b3I9PT1PYmplY3R9ZnVuY3Rpb24gX2UodCl7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJiYm94IGlzIHJlcXVpcmVkIik7aWYoIUFycmF5LmlzQXJyYXkodCkpdGhyb3cgbmV3IEVycm9yKCJiYm94IG11c3QgYmUgYW4gQXJyYXkiKTtpZig0IT09dC5sZW5ndGgmJjYhPT10Lmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoImJib3ggbXVzdCBiZSBhbiBBcnJheSBvZiA0IG9yIDYgbnVtYmVycyIpO3QuZm9yRWFjaCgoZnVuY3Rpb24odCl7aWYoIW1lKHQpKXRocm93IG5ldyBFcnJvcigiYmJveCBtdXN0IG9ubHkgY29udGFpbiBudW1iZXJzIil9KSl9ZnVuY3Rpb24geGUodCl7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJpZCBpcyByZXF1aXJlZCIpO2lmKC0xPT09WyJzdHJpbmciLCJudW1iZXIiXS5pbmRleE9mKHR5cGVvZiB0KSl0aHJvdyBuZXcgRXJyb3IoImlkIG11c3QgYmUgYSBudW1iZXIgb3IgYSBzdHJpbmciKX1mdW5jdGlvbiB3ZSh0LGUsbil7aWYobnVsbCE9PXQpZm9yKHZhciByLGksbyxzLGEsdSxjLGwsaD0wLGY9MCxwPXQudHlwZSxkPSJGZWF0dXJlQ29sbGVjdGlvbiI9PT1wLGc9IkZlYXR1cmUiPT09cCx5PWQ/dC5mZWF0dXJlcy5sZW5ndGg6MSxtPTA7bTx5O20rKyl7YT0obD0hIShjPWQ/dC5mZWF0dXJlc1ttXS5nZW9tZXRyeTpnP3QuZ2VvbWV0cnk6dCkmJiJHZW9tZXRyeUNvbGxlY3Rpb24iPT09Yy50eXBlKT9jLmdlb21ldHJpZXMubGVuZ3RoOjE7Zm9yKHZhciB2PTA7djxhO3YrKyl7dmFyIF89MCx4PTA7aWYobnVsbCE9PShzPWw/Yy5nZW9tZXRyaWVzW3ZdOmMpKXt1PXMuY29vcmRpbmF0ZXM7dmFyIHc9cy50eXBlO3N3aXRjaChoPSFufHwiUG9seWdvbiIhPT13JiYiTXVsdGlQb2x5Z29uIiE9PXc/MDoxLHcpe2Nhc2UgbnVsbDpicmVhaztjYXNlIlBvaW50IjplKHUsZixtLF8seCksZisrLF8rKzticmVhaztjYXNlIkxpbmVTdHJpbmciOmNhc2UiTXVsdGlQb2ludCI6Zm9yKHI9MDtyPHUubGVuZ3RoO3IrKyllKHVbcl0sZixtLF8seCksZisrLCJNdWx0aVBvaW50Ij09PXcmJl8rKzsiTGluZVN0cmluZyI9PT13JiZfKys7YnJlYWs7Y2FzZSJQb2x5Z29uIjpjYXNlIk11bHRpTGluZVN0cmluZyI6Zm9yKHI9MDtyPHUubGVuZ3RoO3IrKyl7Zm9yKGk9MDtpPHVbcl0ubGVuZ3RoLWg7aSsrKWUodVtyXVtpXSxmLG0sXyx4KSxmKys7Ik11bHRpTGluZVN0cmluZyI9PT13JiZfKyssIlBvbHlnb24iPT09dyYmeCsrfSJQb2x5Z29uIj09PXcmJl8rKzticmVhaztjYXNlIk11bHRpUG9seWdvbiI6Zm9yKHI9MDtyPHUubGVuZ3RoO3IrKyl7Zm9yKCJNdWx0aVBvbHlnb24iPT09dyYmKHg9MCksaT0wO2k8dVtyXS5sZW5ndGg7aSsrKXtmb3Iobz0wO288dVtyXVtpXS5sZW5ndGgtaDtvKyspZSh1W3JdW2ldW29dLGYsbSxfLHgpLGYrKzt4Kyt9XysrfWJyZWFrO2Nhc2UiR2VvbWV0cnlDb2xsZWN0aW9uIjpmb3Iocj0wO3I8cy5nZW9tZXRyaWVzLmxlbmd0aDtyKyspd2Uocy5nZW9tZXRyaWVzW3JdLGUsbik7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gR2VvbWV0cnkgVHlwZSIpfX19fX1mdW5jdGlvbiBiZSh0LGUsbixyKXt2YXIgaT1uO3JldHVybiB3ZSh0LChmdW5jdGlvbih0LHIsbyxzLGEpe2k9MD09PXImJnZvaWQgMD09PW4/dDplKGksdCxyLG8scyxhKX0pLHIpLGl9ZnVuY3Rpb24gRGUodCxlKXt2YXIgbjtzd2l0Y2godC50eXBlKXtjYXNlIkZlYXR1cmVDb2xsZWN0aW9uIjpmb3Iobj0wO248dC5mZWF0dXJlcy5sZW5ndGg7bisrKWUodC5mZWF0dXJlc1tuXS5wcm9wZXJ0aWVzLG4pO2JyZWFrO2Nhc2UiRmVhdHVyZSI6ZSh0LnByb3BlcnRpZXMsMCl9fWZ1bmN0aW9uIEVlKHQsZSl7aWYoIkZlYXR1cmUiPT09dC50eXBlKWUodCwwKTtlbHNlIGlmKCJGZWF0dXJlQ29sbGVjdGlvbiI9PT10LnR5cGUpZm9yKHZhciBuPTA7bjx0LmZlYXR1cmVzLmxlbmd0aDtuKyspZSh0LmZlYXR1cmVzW25dLG4pfWZ1bmN0aW9uIENlKHQsZSl7dmFyIG4scixpLG8scyxhLHUsYyxsLGgsZj0wLHA9IkZlYXR1cmVDb2xsZWN0aW9uIj09PXQudHlwZSxkPSJGZWF0dXJlIj09PXQudHlwZSxnPXA/dC5mZWF0dXJlcy5sZW5ndGg6MTtmb3Iobj0wO248ZztuKyspe2ZvcihhPXA/dC5mZWF0dXJlc1tuXS5nZW9tZXRyeTpkP3QuZ2VvbWV0cnk6dCxjPXA/dC5mZWF0dXJlc1tuXS5wcm9wZXJ0aWVzOmQ/dC5wcm9wZXJ0aWVzOnt9LGw9cD90LmZlYXR1cmVzW25dLmJib3g6ZD90LmJib3g6dm9pZCAwLGg9cD90LmZlYXR1cmVzW25dLmlkOmQ/dC5pZDp2b2lkIDAscz0odT0hIWEmJiJHZW9tZXRyeUNvbGxlY3Rpb24iPT09YS50eXBlKT9hLmdlb21ldHJpZXMubGVuZ3RoOjEsaT0wO2k8cztpKyspaWYobnVsbCE9PShvPXU/YS5nZW9tZXRyaWVzW2ldOmEpKXN3aXRjaChvLnR5cGUpe2Nhc2UiUG9pbnQiOmNhc2UiTGluZVN0cmluZyI6Y2FzZSJNdWx0aVBvaW50IjpjYXNlIlBvbHlnb24iOmNhc2UiTXVsdGlMaW5lU3RyaW5nIjpjYXNlIk11bHRpUG9seWdvbiI6ZShvLGYsYyxsLGgpO2JyZWFrO2Nhc2UiR2VvbWV0cnlDb2xsZWN0aW9uIjpmb3Iocj0wO3I8by5nZW9tZXRyaWVzLmxlbmd0aDtyKyspZShvLmdlb21ldHJpZXNbcl0sZixjLGwsaCk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gR2VvbWV0cnkgVHlwZSIpfWVsc2UgZShudWxsLGYsYyxsLGgpO2YrK319ZnVuY3Rpb24gU2UodCxlKXtDZSh0LChmdW5jdGlvbih0LG4scixpLG8pe3ZhciBzLGE9bnVsbD09PXQ/bnVsbDp0LnR5cGU7c3dpdGNoKGEpe2Nhc2UgbnVsbDpjYXNlIlBvaW50IjpjYXNlIkxpbmVTdHJpbmciOmNhc2UiUG9seWdvbiI6cmV0dXJuIHZvaWQgZShzZSh0LHIse2Jib3g6aSxpZDpvfSksbiwwKX1zd2l0Y2goYSl7Y2FzZSJNdWx0aVBvaW50IjpzPSJQb2ludCI7YnJlYWs7Y2FzZSJNdWx0aUxpbmVTdHJpbmciOnM9IkxpbmVTdHJpbmciO2JyZWFrO2Nhc2UiTXVsdGlQb2x5Z29uIjpzPSJQb2x5Z29uIn10LmNvb3JkaW5hdGVzLmZvckVhY2goKGZ1bmN0aW9uKHQsaSl7ZShzZSh7dHlwZTpzLGNvb3JkaW5hdGVzOnR9LHIpLG4saSl9KSl9KSl9ZnVuY3Rpb24gQWUodCxlKXtTZSh0LChmdW5jdGlvbih0LG4scil7dmFyIGk9MDtpZih0Lmdlb21ldHJ5KXt2YXIgbz10Lmdlb21ldHJ5LnR5cGU7IlBvaW50Ij09PW98fCJNdWx0aVBvaW50Ij09PW98fGJlKHQsKGZ1bmN0aW9uKG8scyxhLHUsYyxsKXt2YXIgaD1jZShbbyxzXSx0LnByb3BlcnRpZXMpO3JldHVybiBlKGgsbixyLGwsaSksaSsrLHN9KSl9fSkpfWZ1bmN0aW9uIE5lKHQsZSl7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJnZW9qc29uIGlzIHJlcXVpcmVkIik7U2UodCwoZnVuY3Rpb24odCxuLHIpe2lmKG51bGwhPT10Lmdlb21ldHJ5KXt2YXIgaT10Lmdlb21ldHJ5LnR5cGUsbz10Lmdlb21ldHJ5LmNvb3JkaW5hdGVzO3N3aXRjaChpKXtjYXNlIkxpbmVTdHJpbmciOmUodCxuLHIsMCwwKTticmVhaztjYXNlIlBvbHlnb24iOmZvcih2YXIgcz0wO3M8by5sZW5ndGg7cysrKWUoY2Uob1tzXSx0LnByb3BlcnRpZXMpLG4scixzKX19fSkpfWZ1bmN0aW9uIEllKHQpe2lmKCF0KXRocm93IG5ldyBFcnJvcigib2JqIGlzIHJlcXVpcmVkIik7dmFyIGU9TWUodCk7aWYoZS5sZW5ndGg+MSYmbWUoZVswXSkmJm1lKGVbMV0pKXJldHVybiBlO3Rocm93IG5ldyBFcnJvcigiQ29vcmRpbmF0ZSBpcyBub3QgYSB2YWxpZCBQb2ludCIpfWZ1bmN0aW9uIE1lKHQpe2lmKCF0KXRocm93IG5ldyBFcnJvcigib2JqIGlzIHJlcXVpcmVkIik7dmFyIGU7aWYodC5sZW5ndGg/ZT10OnQuY29vcmRpbmF0ZXM/ZT10LmNvb3JkaW5hdGVzOnQuZ2VvbWV0cnkmJnQuZ2VvbWV0cnkuY29vcmRpbmF0ZXMmJihlPXQuZ2VvbWV0cnkuY29vcmRpbmF0ZXMpLGUpcmV0dXJuIEZlKGUpLGU7dGhyb3cgbmV3IEVycm9yKCJObyB2YWxpZCBjb29yZGluYXRlcyIpfWZ1bmN0aW9uIEZlKHQpe2lmKHQubGVuZ3RoPjEmJm1lKHRbMF0pJiZtZSh0WzFdKSlyZXR1cm4hMDtpZihBcnJheS5pc0FycmF5KHRbMF0pJiZ0WzBdLmxlbmd0aClyZXR1cm4gRmUodFswXSk7dGhyb3cgbmV3IEVycm9yKCJjb29yZGluYXRlcyBtdXN0IG9ubHkgY29udGFpbiBudW1iZXJzIil9T2JqZWN0LmZyZWV6ZSh7ZWFydGhSYWRpdXM6bmUsZmFjdG9yczpyZSx1bml0c0ZhY3RvcnM6aWUsYXJlYUZhY3RvcnM6b2UsZmVhdHVyZTpzZSxnZW9tZXRyeTpmdW5jdGlvbih0LGUsbil7aWYoIXZlKG49bnx8e30pKXRocm93IG5ldyBFcnJvcigib3B0aW9ucyBpcyBpbnZhbGlkIik7dmFyIHIsaT1uLmJib3g7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJ0eXBlIGlzIHJlcXVpcmVkIik7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJjb29yZGluYXRlcyBpcyByZXF1aXJlZCIpO2lmKCFBcnJheS5pc0FycmF5KGUpKXRocm93IG5ldyBFcnJvcigiY29vcmRpbmF0ZXMgbXVzdCBiZSBhbiBBcnJheSIpO3N3aXRjaChpJiZfZShpKSx0KXtjYXNlIlBvaW50IjpyPWFlKGUpLmdlb21ldHJ5O2JyZWFrO2Nhc2UiTGluZVN0cmluZyI6cj1jZShlKS5nZW9tZXRyeTticmVhaztjYXNlIlBvbHlnb24iOnI9dWUoZSkuZ2VvbWV0cnk7YnJlYWs7Y2FzZSJNdWx0aVBvaW50IjpyPWZlKGUpLmdlb21ldHJ5O2JyZWFrO2Nhc2UiTXVsdGlMaW5lU3RyaW5nIjpyPWhlKGUpLmdlb21ldHJ5O2JyZWFrO2Nhc2UiTXVsdGlQb2x5Z29uIjpyPXBlKGUpLmdlb21ldHJ5O2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKHQrIiBpcyBpbnZhbGlkIil9cmV0dXJuIGkmJihyLmJib3g9aSkscn0scG9pbnQ6YWUscG9pbnRzOmZ1bmN0aW9uKHQsZSxuKXtpZighdCl0aHJvdyBuZXcgRXJyb3IoImNvb3JkaW5hdGVzIGlzIHJlcXVpcmVkIik7aWYoIUFycmF5LmlzQXJyYXkodCkpdGhyb3cgbmV3IEVycm9yKCJjb29yZGluYXRlcyBtdXN0IGJlIGFuIEFycmF5Iik7cmV0dXJuIGxlKHQubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gYWUodCxlKX0pKSxuKX0scG9seWdvbjp1ZSxwb2x5Z29uczpmdW5jdGlvbih0LGUsbil7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJjb29yZGluYXRlcyBpcyByZXF1aXJlZCIpO2lmKCFBcnJheS5pc0FycmF5KHQpKXRocm93IG5ldyBFcnJvcigiY29vcmRpbmF0ZXMgbXVzdCBiZSBhbiBBcnJheSIpO3JldHVybiBsZSh0Lm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHVlKHQsZSl9KSksbil9LGxpbmVTdHJpbmc6Y2UsbGluZVN0cmluZ3M6ZnVuY3Rpb24odCxlLG4pe2lmKCF0KXRocm93IG5ldyBFcnJvcigiY29vcmRpbmF0ZXMgaXMgcmVxdWlyZWQiKTtpZighQXJyYXkuaXNBcnJheSh0KSl0aHJvdyBuZXcgRXJyb3IoImNvb3JkaW5hdGVzIG11c3QgYmUgYW4gQXJyYXkiKTtyZXR1cm4gbGUodC5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBjZSh0LGUpfSkpLG4pfSxmZWF0dXJlQ29sbGVjdGlvbjpsZSxtdWx0aUxpbmVTdHJpbmc6aGUsbXVsdGlQb2ludDpmZSxtdWx0aVBvbHlnb246cGUsZ2VvbWV0cnlDb2xsZWN0aW9uOmZ1bmN0aW9uKHQsZSxuKXtpZighdCl0aHJvdyBuZXcgRXJyb3IoImdlb21ldHJpZXMgaXMgcmVxdWlyZWQiKTtpZighQXJyYXkuaXNBcnJheSh0KSl0aHJvdyBuZXcgRXJyb3IoImdlb21ldHJpZXMgbXVzdCBiZSBhbiBBcnJheSIpO3JldHVybiBzZSh7dHlwZToiR2VvbWV0cnlDb2xsZWN0aW9uIixnZW9tZXRyaWVzOnR9LGUsbil9LHJvdW5kOmZ1bmN0aW9uKHQsZSl7aWYobnVsbD09dHx8aXNOYU4odCkpdGhyb3cgbmV3IEVycm9yKCJudW0gaXMgcmVxdWlyZWQiKTtpZihlJiYhKGU+PTApKXRocm93IG5ldyBFcnJvcigicHJlY2lzaW9uIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXIiKTt2YXIgbj1NYXRoLnBvdygxMCxlfHwwKTtyZXR1cm4gTWF0aC5yb3VuZCh0Km4pL259LHJhZGlhbnNUb0xlbmd0aDpkZSxsZW5ndGhUb1JhZGlhbnM6Z2UsbGVuZ3RoVG9EZWdyZWVzOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHllKGdlKHQsZSkpfSxiZWFyaW5nVG9BemltdXRoOmZ1bmN0aW9uKHQpe2lmKG51bGw9PXQpdGhyb3cgbmV3IEVycm9yKCJiZWFyaW5nIGlzIHJlcXVpcmVkIik7dmFyIGU9dCUzNjA7cmV0dXJuIGU8MCYmKGUrPTM2MCksZX0scmFkaWFuc1RvRGVncmVlczp5ZSxkZWdyZWVzVG9SYWRpYW5zOmZ1bmN0aW9uKHQpe2lmKG51bGw9PXQpdGhyb3cgbmV3IEVycm9yKCJkZWdyZWVzIGlzIHJlcXVpcmVkIik7cmV0dXJuIHQlMzYwKk1hdGguUEkvMTgwfSxjb252ZXJ0TGVuZ3RoOmZ1bmN0aW9uKHQsZSxuKXtpZihudWxsPT10KXRocm93IG5ldyBFcnJvcigibGVuZ3RoIGlzIHJlcXVpcmVkIik7aWYoISh0Pj0wKSl0aHJvdyBuZXcgRXJyb3IoImxlbmd0aCBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyIik7cmV0dXJuIGRlKGdlKHQsZSksbnx8ImtpbG9tZXRlcnMiKX0sY29udmVydEFyZWE6ZnVuY3Rpb24odCxlLG4pe2lmKG51bGw9PXQpdGhyb3cgbmV3IEVycm9yKCJhcmVhIGlzIHJlcXVpcmVkIik7aWYoISh0Pj0wKSl0aHJvdyBuZXcgRXJyb3IoImFyZWEgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlciIpO3ZhciByPW9lW2V8fCJtZXRlcnMiXTtpZighcil0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgb3JpZ2luYWwgdW5pdHMiKTt2YXIgaT1vZVtufHwia2lsb21ldGVycyJdO2lmKCFpKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBmaW5hbCB1bml0cyIpO3JldHVybiB0L3IqaX0saXNOdW1iZXI6bWUsaXNPYmplY3Q6dmUsdmFsaWRhdGVCQm94Ol9lLHZhbGlkYXRlSWQ6eGUscmFkaWFuczJkZWdyZWVzOmZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJtZXRob2QgaGFzIGJlZW4gcmVuYW1lZCB0byBgcmFkaWFuc1RvRGVncmVlc2AiKX0sZGVncmVlczJyYWRpYW5zOmZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJtZXRob2QgaGFzIGJlZW4gcmVuYW1lZCB0byBgZGVncmVlc1RvUmFkaWFuc2AiKX0sZGlzdGFuY2VUb0RlZ3JlZXM6ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIm1ldGhvZCBoYXMgYmVlbiByZW5hbWVkIHRvIGBsZW5ndGhUb0RlZ3JlZXNgIil9LGRpc3RhbmNlVG9SYWRpYW5zOmZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJtZXRob2QgaGFzIGJlZW4gcmVuYW1lZCB0byBgbGVuZ3RoVG9SYWRpYW5zYCIpfSxyYWRpYW5zVG9EaXN0YW5jZTpmdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigibWV0aG9kIGhhcyBiZWVuIHJlbmFtZWQgdG8gYHJhZGlhbnNUb0xlbmd0aGAiKX0sYmVhcmluZ1RvQW5nbGU6ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIm1ldGhvZCBoYXMgYmVlbiByZW5hbWVkIHRvIGBiZWFyaW5nVG9BemltdXRoYCIpfSxjb252ZXJ0RGlzdGFuY2U6ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIm1ldGhvZCBoYXMgYmVlbiByZW5hbWVkIHRvIGBjb252ZXJ0TGVuZ3RoYCIpfX0pLE9iamVjdC5mcmVlemUoe2Nvb3JkRWFjaDp3ZSxjb29yZFJlZHVjZTpiZSxwcm9wRWFjaDpEZSxwcm9wUmVkdWNlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uO3JldHVybiBEZSh0LChmdW5jdGlvbih0LGkpe3I9MD09PWkmJnZvaWQgMD09PW4/dDplKHIsdCxpKX0pKSxyfSxmZWF0dXJlRWFjaDpFZSxmZWF0dXJlUmVkdWNlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uO3JldHVybiBFZSh0LChmdW5jdGlvbih0LGkpe3I9MD09PWkmJnZvaWQgMD09PW4/dDplKHIsdCxpKX0pKSxyfSxjb29yZEFsbDpmdW5jdGlvbih0KXt2YXIgZT1bXTtyZXR1cm4gd2UodCwoZnVuY3Rpb24odCl7ZS5wdXNoKHQpfSkpLGV9LGdlb21FYWNoOkNlLGdlb21SZWR1Y2U6ZnVuY3Rpb24odCxlLG4pe3ZhciByPW47cmV0dXJuIENlKHQsKGZ1bmN0aW9uKHQsaSxvLHMsYSl7cj0wPT09aSYmdm9pZCAwPT09bj90OmUocix0LGksbyxzLGEpfSkpLHJ9LGZsYXR0ZW5FYWNoOlNlLGZsYXR0ZW5SZWR1Y2U6ZnVuY3Rpb24odCxlLG4pe3ZhciByPW47cmV0dXJuIFNlKHQsKGZ1bmN0aW9uKHQsaSxvKXtyPTA9PT1pJiYwPT09byYmdm9pZCAwPT09bj90OmUocix0LGksbyl9KSkscn0sc2VnbWVudEVhY2g6QWUsc2VnbWVudFJlZHVjZTpmdW5jdGlvbih0LGUsbil7dmFyIHI9bixpPSExO3JldHVybiBBZSh0LChmdW5jdGlvbih0LG8scyxhLHUpe3I9ITE9PT1pJiZ2b2lkIDA9PT1uP3Q6ZShyLHQsbyxzLGEsdSksaT0hMH0pKSxyfSxsaW5lRWFjaDpOZSxsaW5lUmVkdWNlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uO3JldHVybiBOZSh0LChmdW5jdGlvbih0LGksbyxzKXtyPTA9PT1pJiZ2b2lkIDA9PT1uP3Q6ZShyLHQsaSxvLHMpfSkpLHJ9fSksT2JqZWN0LmZyZWV6ZSh7Z2V0Q29vcmQ6SWUsZ2V0Q29vcmRzOk1lLGNvbnRhaW5zTnVtYmVyOkZlLGdlb2pzb25UeXBlOmZ1bmN0aW9uKHQsZSxuKXtpZighZXx8IW4pdGhyb3cgbmV3IEVycm9yKCJ0eXBlIGFuZCBuYW1lIHJlcXVpcmVkIik7aWYoIXR8fHQudHlwZSE9PWUpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0IHRvICIrbisiOiBtdXN0IGJlIGEgIitlKyIsIGdpdmVuICIrdC50eXBlKX0sZmVhdHVyZU9mOmZ1bmN0aW9uKHQsZSxuKXtpZighdCl0aHJvdyBuZXcgRXJyb3IoIk5vIGZlYXR1cmUgcGFzc2VkIik7aWYoIW4pdGhyb3cgbmV3IEVycm9yKCIuZmVhdHVyZU9mKCkgcmVxdWlyZXMgYSBuYW1lIik7aWYoIXR8fCJGZWF0dXJlIiE9PXQudHlwZXx8IXQuZ2VvbWV0cnkpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0IHRvICIrbisiLCBGZWF0dXJlIHdpdGggZ2VvbWV0cnkgcmVxdWlyZWQiKTtpZighdC5nZW9tZXRyeXx8dC5nZW9tZXRyeS50eXBlIT09ZSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgdG8gIituKyI6IG11c3QgYmUgYSAiK2UrIiwgZ2l2ZW4gIit0Lmdlb21ldHJ5LnR5cGUpfSxjb2xsZWN0aW9uT2Y6ZnVuY3Rpb24odCxlLG4pe2lmKCF0KXRocm93IG5ldyBFcnJvcigiTm8gZmVhdHVyZUNvbGxlY3Rpb24gcGFzc2VkIik7aWYoIW4pdGhyb3cgbmV3IEVycm9yKCIuY29sbGVjdGlvbk9mKCkgcmVxdWlyZXMgYSBuYW1lIik7aWYoIXR8fCJGZWF0dXJlQ29sbGVjdGlvbiIhPT10LnR5cGUpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0IHRvICIrbisiLCBGZWF0dXJlQ29sbGVjdGlvbiByZXF1aXJlZCIpO2Zvcih2YXIgcj0wO3I8dC5mZWF0dXJlcy5sZW5ndGg7cisrKXt2YXIgaT10LmZlYXR1cmVzW3JdO2lmKCFpfHwiRmVhdHVyZSIhPT1pLnR5cGV8fCFpLmdlb21ldHJ5KXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCB0byAiK24rIiwgRmVhdHVyZSB3aXRoIGdlb21ldHJ5IHJlcXVpcmVkIik7aWYoIWkuZ2VvbWV0cnl8fGkuZ2VvbWV0cnkudHlwZSE9PWUpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0IHRvICIrbisiOiBtdXN0IGJlIGEgIitlKyIsIGdpdmVuICIraS5nZW9tZXRyeS50eXBlKX19LGdldEdlb206ZnVuY3Rpb24odCl7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJnZW9qc29uIGlzIHJlcXVpcmVkIik7aWYodm9pZCAwIT09dC5nZW9tZXRyeSlyZXR1cm4gdC5nZW9tZXRyeTtpZih0LmNvb3JkaW5hdGVzfHx0Lmdlb21ldHJpZXMpcmV0dXJuIHQ7dGhyb3cgbmV3IEVycm9yKCJnZW9qc29uIG11c3QgYmUgYSB2YWxpZCBGZWF0dXJlIG9yIEdlb21ldHJ5IE9iamVjdCIpfSxnZXRHZW9tVHlwZTpmdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiaW52YXJpYW50LmdldEdlb21UeXBlIGhhcyBiZWVuIGRlcHJlY2F0ZWQgaW4gdjUuMCBpbiBmYXZvciBvZiBpbnZhcmlhbnQuZ2V0VHlwZSIpfSxnZXRUeXBlOmZ1bmN0aW9uKHQsZSl7aWYoIXQpdGhyb3cgbmV3IEVycm9yKChlfHwiZ2VvanNvbiIpKyIgaXMgcmVxdWlyZWQiKTtpZih0Lmdlb21ldHJ5JiZ0Lmdlb21ldHJ5LnR5cGUpcmV0dXJuIHQuZ2VvbWV0cnkudHlwZTtpZih0LnR5cGUpcmV0dXJuIHQudHlwZTt0aHJvdyBuZXcgRXJyb3IoKGV8fCJnZW9qc29uIikrIiBpcyBpbnZhbGlkIil9fSk7dmFyIFRlPWZ1bmN0aW9uIHQoZSxuLHIsaSxvKXtmb3Iocj1yfHwwLGk9aXx8ZS5sZW5ndGgtMSxvPW98fExlO2k+cjspe2lmKGktcj42MDApe3ZhciBzPWktcisxLGE9bi1yKzEsdT1NYXRoLmxvZyhzKSxjPS41Kk1hdGguZXhwKDIqdS8zKSxsPS41Kk1hdGguc3FydCh1KmMqKHMtYykvcykqKGEtcy8yPDA/LTE6MSksaD1NYXRoLm1heChyLE1hdGguZmxvb3Iobi1hKmMvcytsKSksZj1NYXRoLm1pbihpLE1hdGguZmxvb3Iobisocy1hKSpjL3MrbCkpO3QoZSxuLGgsZixvKX12YXIgcD1lW25dLGQ9cixnPWk7Zm9yKE9lKGUscixuKSxvKGVbaV0scCk+MCYmT2UoZSxyLGkpO2Q8Zzspe2ZvcihPZShlLGQsZyksZCsrLGctLTtvKGVbZF0scCk8MDspZCsrO2Zvcig7byhlW2ddLHApPjA7KWctLX0wPT09byhlW3JdLHApP09lKGUscixnKTpPZShlLCsrZyxpKSxnPD1uJiYocj1nKzEpLG48PWcmJihpPWctMSl9fTtmdW5jdGlvbiBPZSh0LGUsbil7dmFyIHI9dFtlXTt0W2VdPXRbbl0sdFtuXT1yfWZ1bmN0aW9uIExlKHQsZSl7cmV0dXJuIHQ8ZT8tMTp0PmU/MTowfXZhciBQZT1SZTtmdW5jdGlvbiBSZSh0LGUpe2lmKCEodGhpcyBpbnN0YW5jZW9mIFJlKSlyZXR1cm4gbmV3IFJlKHQsZSk7dGhpcy5fbWF4RW50cmllcz1NYXRoLm1heCg0LHR8fDkpLHRoaXMuX21pbkVudHJpZXM9TWF0aC5tYXgoMixNYXRoLmNlaWwoLjQqdGhpcy5fbWF4RW50cmllcykpLGUmJnRoaXMuX2luaXRGb3JtYXQoZSksdGhpcy5jbGVhcigpfWZ1bmN0aW9uIEJlKHQsZSxuKXtpZighbilyZXR1cm4gZS5pbmRleE9mKHQpO2Zvcih2YXIgcj0wO3I8ZS5sZW5ndGg7cisrKWlmKG4odCxlW3JdKSlyZXR1cm4gcjtyZXR1cm4tMX1mdW5jdGlvbiBrZSh0LGUpe3plKHQsMCx0LmNoaWxkcmVuLmxlbmd0aCxlLHQpfWZ1bmN0aW9uIHplKHQsZSxuLHIsaSl7aXx8KGk9WmUobnVsbCkpLGkubWluWD0xLzAsaS5taW5ZPTEvMCxpLm1heFg9LTEvMCxpLm1heFk9LTEvMDtmb3IodmFyIG8scz1lO3M8bjtzKyspbz10LmNoaWxkcmVuW3NdLGplKGksdC5sZWFmP3Iobyk6byk7cmV0dXJuIGl9ZnVuY3Rpb24gamUodCxlKXtyZXR1cm4gdC5taW5YPU1hdGgubWluKHQubWluWCxlLm1pblgpLHQubWluWT1NYXRoLm1pbih0Lm1pblksZS5taW5ZKSx0Lm1heFg9TWF0aC5tYXgodC5tYXhYLGUubWF4WCksdC5tYXhZPU1hdGgubWF4KHQubWF4WSxlLm1heFkpLHR9ZnVuY3Rpb24gVWUodCxlKXtyZXR1cm4gdC5taW5YLWUubWluWH1mdW5jdGlvbiBxZSh0LGUpe3JldHVybiB0Lm1pblktZS5taW5ZfWZ1bmN0aW9uIFZlKHQpe3JldHVybih0Lm1heFgtdC5taW5YKSoodC5tYXhZLXQubWluWSl9ZnVuY3Rpb24gR2UodCl7cmV0dXJuIHQubWF4WC10Lm1pblgrKHQubWF4WS10Lm1pblkpfWZ1bmN0aW9uIFllKHQsZSl7cmV0dXJuKE1hdGgubWF4KGUubWF4WCx0Lm1heFgpLU1hdGgubWluKGUubWluWCx0Lm1pblgpKSooTWF0aC5tYXgoZS5tYXhZLHQubWF4WSktTWF0aC5taW4oZS5taW5ZLHQubWluWSkpfWZ1bmN0aW9uIFhlKHQsZSl7dmFyIG49TWF0aC5tYXgodC5taW5YLGUubWluWCkscj1NYXRoLm1heCh0Lm1pblksZS5taW5ZKSxpPU1hdGgubWluKHQubWF4WCxlLm1heFgpLG89TWF0aC5taW4odC5tYXhZLGUubWF4WSk7cmV0dXJuIE1hdGgubWF4KDAsaS1uKSpNYXRoLm1heCgwLG8tcil9ZnVuY3Rpb24gV2UodCxlKXtyZXR1cm4gdC5taW5YPD1lLm1pblgmJnQubWluWTw9ZS5taW5ZJiZlLm1heFg8PXQubWF4WCYmZS5tYXhZPD10Lm1heFl9ZnVuY3Rpb24gSGUodCxlKXtyZXR1cm4gZS5taW5YPD10Lm1heFgmJmUubWluWTw9dC5tYXhZJiZlLm1heFg+PXQubWluWCYmZS5tYXhZPj10Lm1pbll9ZnVuY3Rpb24gWmUodCl7cmV0dXJue2NoaWxkcmVuOnQsaGVpZ2h0OjEsbGVhZjohMCxtaW5YOjEvMCxtaW5ZOjEvMCxtYXhYOi0xLzAsbWF4WTotMS8wfX1mdW5jdGlvbiBLZSh0LGUsbixyLGkpe2Zvcih2YXIgbyxzPVtlLG5dO3MubGVuZ3RoOykhKChuPXMucG9wKCkpLShlPXMucG9wKCkpPD1yKSYmKG89ZStNYXRoLmNlaWwoKG4tZSkvci8yKSpyLFRlKHQsbyxlLG4saSkscy5wdXNoKGUsbyxvLG4pKX1mdW5jdGlvbiBKZSh0LGUpe3JldHVybiB0KGU9e2V4cG9ydHM6e319LGUuZXhwb3J0cyksZS5leHBvcnRzfVJlLnByb3RvdHlwZT17YWxsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2FsbCh0aGlzLmRhdGEsW10pfSxzZWFyY2g6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5kYXRhLG49W10scj10aGlzLnRvQkJveDtpZighSGUodCxlKSlyZXR1cm4gbjtmb3IodmFyIGksbyxzLGEsdT1bXTtlOyl7Zm9yKGk9MCxvPWUuY2hpbGRyZW4ubGVuZ3RoO2k8bztpKyspcz1lLmNoaWxkcmVuW2ldLEhlKHQsYT1lLmxlYWY/cihzKTpzKSYmKGUubGVhZj9uLnB1c2gocyk6V2UodCxhKT90aGlzLl9hbGwocyxuKTp1LnB1c2gocykpO2U9dS5wb3AoKX1yZXR1cm4gbn0sY29sbGlkZXM6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5kYXRhLG49dGhpcy50b0JCb3g7aWYoIUhlKHQsZSkpcmV0dXJuITE7Zm9yKHZhciByLGksbyxzLGE9W107ZTspe2ZvcihyPTAsaT1lLmNoaWxkcmVuLmxlbmd0aDtyPGk7cisrKWlmKG89ZS5jaGlsZHJlbltyXSxIZSh0LHM9ZS5sZWFmP24obyk6bykpe2lmKGUubGVhZnx8V2UodCxzKSlyZXR1cm4hMDthLnB1c2gobyl9ZT1hLnBvcCgpfXJldHVybiExfSxsb2FkOmZ1bmN0aW9uKHQpe2lmKCF0fHwhdC5sZW5ndGgpcmV0dXJuIHRoaXM7aWYodC5sZW5ndGg8dGhpcy5fbWluRW50cmllcyl7Zm9yKHZhciBlPTAsbj10Lmxlbmd0aDtlPG47ZSsrKXRoaXMuaW5zZXJ0KHRbZV0pO3JldHVybiB0aGlzfXZhciByPXRoaXMuX2J1aWxkKHQuc2xpY2UoKSwwLHQubGVuZ3RoLTEsMCk7aWYodGhpcy5kYXRhLmNoaWxkcmVuLmxlbmd0aClpZih0aGlzLmRhdGEuaGVpZ2h0PT09ci5oZWlnaHQpdGhpcy5fc3BsaXRSb290KHRoaXMuZGF0YSxyKTtlbHNle2lmKHRoaXMuZGF0YS5oZWlnaHQ8ci5oZWlnaHQpe3ZhciBpPXRoaXMuZGF0YTt0aGlzLmRhdGE9cixyPWl9dGhpcy5faW5zZXJ0KHIsdGhpcy5kYXRhLmhlaWdodC1yLmhlaWdodC0xLCEwKX1lbHNlIHRoaXMuZGF0YT1yO3JldHVybiB0aGlzfSxpbnNlcnQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnRoaXMuX2luc2VydCh0LHRoaXMuZGF0YS5oZWlnaHQtMSksdGhpc30sY2xlYXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYXRhPVplKFtdKSx0aGlzfSxyZW1vdmU6ZnVuY3Rpb24odCxlKXtpZighdClyZXR1cm4gdGhpcztmb3IodmFyIG4scixpLG8scz10aGlzLmRhdGEsYT10aGlzLnRvQkJveCh0KSx1PVtdLGM9W107c3x8dS5sZW5ndGg7KXtpZihzfHwocz11LnBvcCgpLHI9dVt1Lmxlbmd0aC0xXSxuPWMucG9wKCksbz0hMCkscy5sZWFmJiYtMSE9PShpPUJlKHQscy5jaGlsZHJlbixlKSkpcmV0dXJuIHMuY2hpbGRyZW4uc3BsaWNlKGksMSksdS5wdXNoKHMpLHRoaXMuX2NvbmRlbnNlKHUpLHRoaXM7b3x8cy5sZWFmfHwhV2UocyxhKT9yPyhuKysscz1yLmNoaWxkcmVuW25dLG89ITEpOnM9bnVsbDoodS5wdXNoKHMpLGMucHVzaChuKSxuPTAscj1zLHM9cy5jaGlsZHJlblswXSl9cmV0dXJuIHRoaXN9LHRvQkJveDpmdW5jdGlvbih0KXtyZXR1cm4gdH0sY29tcGFyZU1pblg6VWUsY29tcGFyZU1pblk6cWUsdG9KU09OOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF0YX0sZnJvbUpTT046ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZGF0YT10LHRoaXN9LF9hbGw6ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49W107dDspdC5sZWFmP2UucHVzaC5hcHBseShlLHQuY2hpbGRyZW4pOm4ucHVzaC5hcHBseShuLHQuY2hpbGRyZW4pLHQ9bi5wb3AoKTtyZXR1cm4gZX0sX2J1aWxkOmZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpLG89bi1lKzEscz10aGlzLl9tYXhFbnRyaWVzO2lmKG88PXMpcmV0dXJuIGtlKGk9WmUodC5zbGljZShlLG4rMSkpLHRoaXMudG9CQm94KSxpO3J8fChyPU1hdGguY2VpbChNYXRoLmxvZyhvKS9NYXRoLmxvZyhzKSkscz1NYXRoLmNlaWwoby9NYXRoLnBvdyhzLHItMSkpKSwoaT1aZShbXSkpLmxlYWY9ITEsaS5oZWlnaHQ9cjt2YXIgYSx1LGMsbCxoPU1hdGguY2VpbChvL3MpLGY9aCpNYXRoLmNlaWwoTWF0aC5zcXJ0KHMpKTtmb3IoS2UodCxlLG4sZix0aGlzLmNvbXBhcmVNaW5YKSxhPWU7YTw9bjthKz1mKWZvcihLZSh0LGEsYz1NYXRoLm1pbihhK2YtMSxuKSxoLHRoaXMuY29tcGFyZU1pblkpLHU9YTt1PD1jO3UrPWgpbD1NYXRoLm1pbih1K2gtMSxjKSxpLmNoaWxkcmVuLnB1c2godGhpcy5fYnVpbGQodCx1LGwsci0xKSk7cmV0dXJuIGtlKGksdGhpcy50b0JCb3gpLGl9LF9jaG9vc2VTdWJ0cmVlOmZ1bmN0aW9uKHQsZSxuLHIpe2Zvcih2YXIgaSxvLHMsYSx1LGMsbCxoO3IucHVzaChlKSwhZS5sZWFmJiZyLmxlbmd0aC0xIT09bjspe2ZvcihsPWg9MS8wLGk9MCxvPWUuY2hpbGRyZW4ubGVuZ3RoO2k8bztpKyspdT1WZShzPWUuY2hpbGRyZW5baV0pLChjPVllKHQscyktdSk8aD8oaD1jLGw9dTxsP3U6bCxhPXMpOmM9PT1oJiZ1PGwmJihsPXUsYT1zKTtlPWF8fGUuY2hpbGRyZW5bMF19cmV0dXJuIGV9LF9pbnNlcnQ6ZnVuY3Rpb24odCxlLG4pe3ZhciByPXRoaXMudG9CQm94LGk9bj90OnIodCksbz1bXSxzPXRoaXMuX2Nob29zZVN1YnRyZWUoaSx0aGlzLmRhdGEsZSxvKTtmb3Iocy5jaGlsZHJlbi5wdXNoKHQpLGplKHMsaSk7ZT49MCYmb1tlXS5jaGlsZHJlbi5sZW5ndGg+dGhpcy5fbWF4RW50cmllczspdGhpcy5fc3BsaXQobyxlKSxlLS07dGhpcy5fYWRqdXN0UGFyZW50QkJveGVzKGksbyxlKX0sX3NwbGl0OmZ1bmN0aW9uKHQsZSl7dmFyIG49dFtlXSxyPW4uY2hpbGRyZW4ubGVuZ3RoLGk9dGhpcy5fbWluRW50cmllczt0aGlzLl9jaG9vc2VTcGxpdEF4aXMobixpLHIpO3ZhciBvPXRoaXMuX2Nob29zZVNwbGl0SW5kZXgobixpLHIpLHM9WmUobi5jaGlsZHJlbi5zcGxpY2UobyxuLmNoaWxkcmVuLmxlbmd0aC1vKSk7cy5oZWlnaHQ9bi5oZWlnaHQscy5sZWFmPW4ubGVhZixrZShuLHRoaXMudG9CQm94KSxrZShzLHRoaXMudG9CQm94KSxlP3RbZS0xXS5jaGlsZHJlbi5wdXNoKHMpOnRoaXMuX3NwbGl0Um9vdChuLHMpfSxfc3BsaXRSb290OmZ1bmN0aW9uKHQsZSl7dGhpcy5kYXRhPVplKFt0LGVdKSx0aGlzLmRhdGEuaGVpZ2h0PXQuaGVpZ2h0KzEsdGhpcy5kYXRhLmxlYWY9ITEsa2UodGhpcy5kYXRhLHRoaXMudG9CQm94KX0sX2Nob29zZVNwbGl0SW5kZXg6ZnVuY3Rpb24odCxlLG4pe3ZhciByLGksbyxzLGEsdSxjLGw7Zm9yKHU9Yz0xLzAscj1lO3I8PW4tZTtyKyspcz1YZShpPXplKHQsMCxyLHRoaXMudG9CQm94KSxvPXplKHQscixuLHRoaXMudG9CQm94KSksYT1WZShpKStWZShvKSxzPHU/KHU9cyxsPXIsYz1hPGM/YTpjKTpzPT09dSYmYTxjJiYoYz1hLGw9cik7cmV0dXJuIGx9LF9jaG9vc2VTcGxpdEF4aXM6ZnVuY3Rpb24odCxlLG4pe3ZhciByPXQubGVhZj90aGlzLmNvbXBhcmVNaW5YOlVlLGk9dC5sZWFmP3RoaXMuY29tcGFyZU1pblk6cWU7dGhpcy5fYWxsRGlzdE1hcmdpbih0LGUsbixyKTx0aGlzLl9hbGxEaXN0TWFyZ2luKHQsZSxuLGkpJiZ0LmNoaWxkcmVuLnNvcnQocil9LF9hbGxEaXN0TWFyZ2luOmZ1bmN0aW9uKHQsZSxuLHIpe3QuY2hpbGRyZW4uc29ydChyKTt2YXIgaSxvLHM9dGhpcy50b0JCb3gsYT16ZSh0LDAsZSxzKSx1PXplKHQsbi1lLG4scyksYz1HZShhKStHZSh1KTtmb3IoaT1lO2k8bi1lO2krKylvPXQuY2hpbGRyZW5baV0samUoYSx0LmxlYWY/cyhvKTpvKSxjKz1HZShhKTtmb3IoaT1uLWUtMTtpPj1lO2ktLSlvPXQuY2hpbGRyZW5baV0samUodSx0LmxlYWY/cyhvKTpvKSxjKz1HZSh1KTtyZXR1cm4gY30sX2FkanVzdFBhcmVudEJCb3hlczpmdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPW47cj49MDtyLS0pamUoZVtyXSx0KX0sX2NvbmRlbnNlOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPXQubGVuZ3RoLTE7bj49MDtuLS0pMD09PXRbbl0uY2hpbGRyZW4ubGVuZ3RoP24+MD8oZT10W24tMV0uY2hpbGRyZW4pLnNwbGljZShlLmluZGV4T2YodFtuXSksMSk6dGhpcy5jbGVhcigpOmtlKHRbbl0sdGhpcy50b0JCb3gpfSxfaW5pdEZvcm1hdDpmdW5jdGlvbih0KXt2YXIgZT1bInJldHVybiBhIiwiIC0gYiIsIjsiXTt0aGlzLmNvbXBhcmVNaW5YPW5ldyBGdW5jdGlvbigiYSIsImIiLGUuam9pbih0WzBdKSksdGhpcy5jb21wYXJlTWluWT1uZXcgRnVuY3Rpb24oImEiLCJiIixlLmpvaW4odFsxXSkpLHRoaXMudG9CQm94PW5ldyBGdW5jdGlvbigiYSIsInJldHVybiB7bWluWDogYSIrdFswXSsiLCBtaW5ZOiBhIit0WzFdKyIsIG1heFg6IGEiK3RbMl0rIiwgbWF4WTogYSIrdFszXSsifTsiKX19O3ZhciBRZT1mdW5jdGlvbih0LGUsbil7dmFyIHI9dCplLGk9JGUqdCxvPWktdCxzPWktbyxhPXQtcyx1PSRlKmUsYz11LSh1LWUpLGw9ZS1jLGg9YSpsLShyLXMqYy1hKmMtcypsKTtyZXR1cm4gbj8oblswXT1oLG5bMV09cixuKTpbaCxyXX0sJGU9KyhNYXRoLnBvdygyLDI3KSsxKTt2YXIgdG49ZnVuY3Rpb24odCxlKXt2YXIgbj0wfHQubGVuZ3RoLHI9MHxlLmxlbmd0aDtpZigxPT09biYmMT09PXIpcmV0dXJuIGZ1bmN0aW9uKHQsZSl7dmFyIG49dCtlLHI9bi10LGk9bi1yLG89ZS1yLHM9dC1pLGE9cytvO3JldHVybiBhP1thLG5dOltuXX0odFswXSxlWzBdKTt2YXIgaSxvLHM9bmV3IEFycmF5KG4rciksYT0wLHU9MCxjPTAsbD1NYXRoLmFicyxoPXRbdV0sZj1sKGgpLHA9ZVtjXSxkPWwocCk7ZjxkPyhvPWgsKHUrPTEpPG4mJihoPXRbdV0sZj1sKGgpKSk6KG89cCwoYys9MSk8ciYmKHA9ZVtjXSxkPWwocCkpKSx1PG4mJmY8ZHx8Yz49cj8oaT1oLCh1Kz0xKTxuJiYoaD10W3VdLGY9bChoKSkpOihpPXAsKGMrPTEpPHImJihwPWVbY10sZD1sKHApKSk7Zm9yKHZhciBnLHksbT1pK28sdj1tLWksXz1vLXYseD1fLHc9bTt1PG4mJmM8cjspZjxkPyhpPWgsKHUrPTEpPG4mJihoPXRbdV0sZj1sKGgpKSk6KGk9cCwoYys9MSk8ciYmKHA9ZVtjXSxkPWwocCkpKSwoXz0obz14KS0odj0obT1pK28pLWkpKSYmKHNbYSsrXT1fKSx4PXctKChnPXcrbSktKHk9Zy13KSkrKG0teSksdz1nO2Zvcig7dTxuOykoXz0obz14KS0odj0obT0oaT1oKStvKS1pKSkmJihzW2ErK109XykseD13LSgoZz13K20pLSh5PWctdykpKyhtLXkpLHc9ZywodSs9MSk8biYmKGg9dFt1XSk7Zm9yKDtjPHI7KShfPShvPXgpLSh2PShtPShpPXApK28pLWkpKSYmKHNbYSsrXT1fKSx4PXctKChnPXcrbSktKHk9Zy13KSkrKG0teSksdz1nLChjKz0xKTxyJiYocD1lW2NdKTtyZXR1cm4geCYmKHNbYSsrXT14KSx3JiYoc1thKytdPXcpLGF8fChzW2ErK109MCkscy5sZW5ndGg9YSxzfTt2YXIgZW49ZnVuY3Rpb24odCxlLG4pe3ZhciByPXQrZSxpPXItdCxvPWUtaSxzPXQtKHItaSk7cmV0dXJuIG4/KG5bMF09cytvLG5bMV09cixuKTpbcytvLHJdfTt2YXIgbm49ZnVuY3Rpb24odCxlKXt2YXIgbj10Lmxlbmd0aDtpZigxPT09bil7dmFyIHI9UWUodFswXSxlKTtyZXR1cm4gclswXT9yOltyWzFdXX12YXIgaT1uZXcgQXJyYXkoMipuKSxvPVsuMSwuMV0scz1bLjEsLjFdLGE9MDtRZSh0WzBdLGUsbyksb1swXSYmKGlbYSsrXT1vWzBdKTtmb3IodmFyIHU9MTt1PG47Kyt1KXtRZSh0W3VdLGUscyk7dmFyIGM9b1sxXTtlbihjLHNbMF0sbyksb1swXSYmKGlbYSsrXT1vWzBdKTt2YXIgbD1zWzFdLGg9b1sxXSxmPWwraCxwPWgtKGYtbCk7b1sxXT1mLHAmJihpW2ErK109cCl9cmV0dXJuIG9bMV0mJihpW2ErK109b1sxXSksMD09PWEmJihpW2ErK109MCksaS5sZW5ndGg9YSxpfTt2YXIgcm49ZnVuY3Rpb24odCxlKXt2YXIgbj0wfHQubGVuZ3RoLHI9MHxlLmxlbmd0aDtpZigxPT09biYmMT09PXIpcmV0dXJuIGZ1bmN0aW9uKHQsZSl7dmFyIG49dCtlLHI9bi10LGk9bi1yLG89ZS1yLHM9dC1pLGE9cytvO3JldHVybiBhP1thLG5dOltuXX0odFswXSwtZVswXSk7dmFyIGksbyxzPW5ldyBBcnJheShuK3IpLGE9MCx1PTAsYz0wLGw9TWF0aC5hYnMsaD10W3VdLGY9bChoKSxwPS1lW2NdLGQ9bChwKTtmPGQ/KG89aCwodSs9MSk8biYmKGg9dFt1XSxmPWwoaCkpKToobz1wLChjKz0xKTxyJiYocD0tZVtjXSxkPWwocCkpKSx1PG4mJmY8ZHx8Yz49cj8oaT1oLCh1Kz0xKTxuJiYoaD10W3VdLGY9bChoKSkpOihpPXAsKGMrPTEpPHImJihwPS1lW2NdLGQ9bChwKSkpO2Zvcih2YXIgZyx5LG09aStvLHY9bS1pLF89by12LHg9Xyx3PW07dTxuJiZjPHI7KWY8ZD8oaT1oLCh1Kz0xKTxuJiYoaD10W3VdLGY9bChoKSkpOihpPXAsKGMrPTEpPHImJihwPS1lW2NdLGQ9bChwKSkpLChfPShvPXgpLSh2PShtPWkrbyktaSkpJiYoc1thKytdPV8pLHg9dy0oKGc9dyttKS0oeT1nLXcpKSsobS15KSx3PWc7Zm9yKDt1PG47KShfPShvPXgpLSh2PShtPShpPWgpK28pLWkpKSYmKHNbYSsrXT1fKSx4PXctKChnPXcrbSktKHk9Zy13KSkrKG0teSksdz1nLCh1Kz0xKTxuJiYoaD10W3VdKTtmb3IoO2M8cjspKF89KG89eCktKHY9KG09KGk9cCkrbyktaSkpJiYoc1thKytdPV8pLHg9dy0oKGc9dyttKS0oeT1nLXcpKSsobS15KSx3PWcsKGMrPTEpPHImJihwPS1lW2NdKTtyZXR1cm4geCYmKHNbYSsrXT14KSx3JiYoc1thKytdPXcpLGF8fChzW2ErK109MCkscy5sZW5ndGg9YSxzfTt2YXIgb249SmUoKGZ1bmN0aW9uKHQpe3ZhciBlPTExMTAyMjMwMjQ2MjUxNTY1ZS0zMixuPSgzKzE2KmUpKmUscj0oNys1NiplKSplO2Z1bmN0aW9uIGkodCxlKXtmb3IodmFyIG49bmV3IEFycmF5KHQubGVuZ3RoLTEpLHI9MTtyPHQubGVuZ3RoOysrcilmb3IodmFyIGk9bltyLTFdPW5ldyBBcnJheSh0Lmxlbmd0aC0xKSxvPTAscz0wO288dC5sZW5ndGg7KytvKW8hPT1lJiYoaVtzKytdPXRbcl1bb10pO3JldHVybiBufWZ1bmN0aW9uIG8odCl7cmV0dXJuIDEmdD8iLSI6IiJ9ZnVuY3Rpb24gcyh0KXtpZigxPT09dC5sZW5ndGgpcmV0dXJuIHRbMF07aWYoMj09PXQubGVuZ3RoKXJldHVyblsic3VtKCIsdFswXSwiLCIsdFsxXSwiKSJdLmpvaW4oIiIpO3ZhciBlPXQubGVuZ3RoPj4xO3JldHVyblsic3VtKCIscyh0LnNsaWNlKDAsZSkpLCIsIixzKHQuc2xpY2UoZSkpLCIpIl0uam9pbigiIil9ZnVuY3Rpb24gYSh0KXtpZigyPT09dC5sZW5ndGgpcmV0dXJuW1sic3VtKHByb2QoIix0WzBdWzBdLCIsIix0WzFdWzFdLCIpLHByb2QoLSIsdFswXVsxXSwiLCIsdFsxXVswXSwiKSkiXS5qb2luKCIiKV07Zm9yKHZhciBlPVtdLG49MDtuPHQubGVuZ3RoOysrbillLnB1c2goWyJzY2FsZSgiLHMoYShpKHQsbikpKSwiLCIsbyhuKSx0WzBdW25dLCIpIl0uam9pbigiIikpO3JldHVybiBlfWZ1bmN0aW9uIHUodCl7Zm9yKHZhciBlPVtdLG49W10scj1mdW5jdGlvbih0KXtmb3IodmFyIGU9bmV3IEFycmF5KHQpLG49MDtuPHQ7KytuKXtlW25dPW5ldyBBcnJheSh0KTtmb3IodmFyIHI9MDtyPHQ7KytyKWVbbl1bcl09WyJtIixyLCJbIix0LW4tMSwiXSJdLmpvaW4oIiIpfXJldHVybiBlfSh0KSxvPVtdLHU9MDt1PHQ7Kyt1KTEmdT9uLnB1c2guYXBwbHkobixhKGkocix1KSkpOmUucHVzaC5hcHBseShlLGEoaShyLHUpKSksby5wdXNoKCJtIit1KTt2YXIgYz1zKGUpLGw9cyhuKSxoPSJvcmllbnRhdGlvbiIrdCsiRXhhY3QiLGY9WyJmdW5jdGlvbiAiLGgsIigiLG8uam9pbigpLCIpe3ZhciBwPSIsYywiLG49IixsLCIsZD1zdWIocCxuKTtyZXR1cm4gZFtkLmxlbmd0aC0xXTt9O3JldHVybiAiLGhdLmpvaW4oIiIpO3JldHVybiBuZXcgRnVuY3Rpb24oInN1bSIsInByb2QiLCJzY2FsZSIsInN1YiIsZikodG4sUWUsbm4scm4pfXZhciBjPXUoMyksbD11KDQpLGg9W2Z1bmN0aW9uKCl7cmV0dXJuIDB9LGZ1bmN0aW9uKCl7cmV0dXJuIDB9LGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGVbMF0tdFswXX0sZnVuY3Rpb24odCxlLHIpe3ZhciBpLG89KHRbMV0tclsxXSkqKGVbMF0tclswXSkscz0odFswXS1yWzBdKSooZVsxXS1yWzFdKSxhPW8tcztpZihvPjApe2lmKHM8PTApcmV0dXJuIGE7aT1vK3N9ZWxzZXtpZighKG88MCkpcmV0dXJuIGE7aWYocz49MClyZXR1cm4gYTtpPS0obytzKX12YXIgdT1uKmk7cmV0dXJuIGE+PXV8fGE8PS11P2E6Yyh0LGUscil9LGZ1bmN0aW9uKHQsZSxuLGkpe3ZhciBvPXRbMF0taVswXSxzPWVbMF0taVswXSxhPW5bMF0taVswXSx1PXRbMV0taVsxXSxjPWVbMV0taVsxXSxoPW5bMV0taVsxXSxmPXRbMl0taVsyXSxwPWVbMl0taVsyXSxkPW5bMl0taVsyXSxnPXMqaCx5PWEqYyxtPWEqdSx2PW8qaCxfPW8qYyx4PXMqdSx3PWYqKGcteSkrcCoobS12KStkKihfLXgpLGI9KE1hdGguYWJzKGcpK01hdGguYWJzKHkpKSpNYXRoLmFicyhmKSsoTWF0aC5hYnMobSkrTWF0aC5hYnModikpKk1hdGguYWJzKHApKyhNYXRoLmFicyhfKStNYXRoLmFicyh4KSkqTWF0aC5hYnMoZCksRD1yKmI7cmV0dXJuIHc+RHx8LXc+RD93OmwodCxlLG4saSl9XTtmdW5jdGlvbiBmKHQpe3ZhciBlPWhbdC5sZW5ndGhdO3JldHVybiBlfHwoZT1oW3QubGVuZ3RoXT11KHQubGVuZ3RoKSksZS5hcHBseSh2b2lkIDAsdCl9IWZ1bmN0aW9uKCl7Zm9yKDtoLmxlbmd0aDw9NTspaC5wdXNoKHUoaC5sZW5ndGgpKTtmb3IodmFyIGU9W10sbj1bInNsb3ciXSxyPTA7cjw9NTsrK3IpZS5wdXNoKCJhIityKSxuLnB1c2goIm8iK3IpO3ZhciBpPVsiZnVuY3Rpb24gZ2V0T3JpZW50YXRpb24oIixlLmpvaW4oKSwiKXtzd2l0Y2goYXJndW1lbnRzLmxlbmd0aCl7Y2FzZSAwOmNhc2UgMTpyZXR1cm4gMDsiXTtmb3Iocj0yO3I8PTU7KytyKWkucHVzaCgiY2FzZSAiLHIsIjpyZXR1cm4gbyIsciwiKCIsZS5zbGljZSgwLHIpLmpvaW4oKSwiKTsiKTtpLnB1c2goIn12YXIgcz1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCk7Zm9yKHZhciBpPTA7aTxhcmd1bWVudHMubGVuZ3RoOysraSl7c1tpXT1hcmd1bWVudHNbaV19O3JldHVybiBzbG93KHMpO31yZXR1cm4gZ2V0T3JpZW50YXRpb24iKSxuLnB1c2goaS5qb2luKCIiKSk7dmFyIG89RnVuY3Rpb24uYXBwbHkodm9pZCAwLG4pO2Zvcih0LmV4cG9ydHM9by5hcHBseSh2b2lkIDAsW2ZdLmNvbmNhdChoKSkscj0wO3I8PTU7KytyKXQuZXhwb3J0c1tyXT1oW3JdfSgpfSkpLHNuPWZ1bmN0aW9uKHQpe3ZhciBlPXQubGVuZ3RoO2lmKGU8Myl7Zm9yKHZhciBuPW5ldyBBcnJheShlKSxyPTA7cjxlOysrciluW3JdPXI7cmV0dXJuIDI9PT1lJiZ0WzBdWzBdPT09dFsxXVswXSYmdFswXVsxXT09PXRbMV1bMV0/WzBdOm59dmFyIGk9bmV3IEFycmF5KGUpO2ZvcihyPTA7cjxlOysrcilpW3JdPXI7aS5zb3J0KChmdW5jdGlvbihlLG4pe3JldHVybiB0W2VdWzBdLXRbbl1bMF18fHRbZV1bMV0tdFtuXVsxXX0pKTt2YXIgbz1baVswXSxpWzFdXSxzPVtpWzBdLGlbMV1dO2ZvcihyPTI7cjxlOysrcil7Zm9yKHZhciBhPWlbcl0sdT10W2FdLGM9by5sZW5ndGg7Yz4xJiZhbih0W29bYy0yXV0sdFtvW2MtMV1dLHUpPD0wOyljLT0xLG8ucG9wKCk7Zm9yKG8ucHVzaChhKSxjPXMubGVuZ3RoO2M+MSYmYW4odFtzW2MtMl1dLHRbc1tjLTFdXSx1KT49MDspYy09MSxzLnBvcCgpO3MucHVzaChhKX1uPW5ldyBBcnJheShzLmxlbmd0aCtvLmxlbmd0aC0yKTtmb3IodmFyIGw9MCxoPShyPTAsby5sZW5ndGgpO3I8aDsrK3IpbltsKytdPW9bcl07Zm9yKHZhciBmPXMubGVuZ3RoLTI7Zj4wOy0tZiluW2wrK109c1tmXTtyZXR1cm4gbn0sYW49b25bM107dmFyIHVuPWxuLGNuPWxuO2Z1bmN0aW9uIGxuKHQsZSl7aWYoISh0aGlzIGluc3RhbmNlb2YgbG4pKXJldHVybiBuZXcgbG4odCxlKTtpZih0aGlzLmRhdGE9dHx8W10sdGhpcy5sZW5ndGg9dGhpcy5kYXRhLmxlbmd0aCx0aGlzLmNvbXBhcmU9ZXx8aG4sdGhpcy5sZW5ndGg+MClmb3IodmFyIG49KHRoaXMubGVuZ3RoPj4xKS0xO24+PTA7bi0tKXRoaXMuX2Rvd24obil9ZnVuY3Rpb24gaG4odCxlKXtyZXR1cm4gdDxlPy0xOnQ+ZT8xOjB9bG4ucHJvdG90eXBlPXtwdXNoOmZ1bmN0aW9uKHQpe3RoaXMuZGF0YS5wdXNoKHQpLHRoaXMubGVuZ3RoKyssdGhpcy5fdXAodGhpcy5sZW5ndGgtMSl9LHBvcDpmdW5jdGlvbigpe2lmKDAhPT10aGlzLmxlbmd0aCl7dmFyIHQ9dGhpcy5kYXRhWzBdO3JldHVybiB0aGlzLmxlbmd0aC0tLHRoaXMubGVuZ3RoPjAmJih0aGlzLmRhdGFbMF09dGhpcy5kYXRhW3RoaXMubGVuZ3RoXSx0aGlzLl9kb3duKDApKSx0aGlzLmRhdGEucG9wKCksdH19LHBlZWs6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYXRhWzBdfSxfdXA6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuZGF0YSxuPXRoaXMuY29tcGFyZSxyPWVbdF07dD4wOyl7dmFyIGk9dC0xPj4xLG89ZVtpXTtpZihuKHIsbyk+PTApYnJlYWs7ZVt0XT1vLHQ9aX1lW3RdPXJ9LF9kb3duOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLmRhdGEsbj10aGlzLmNvbXBhcmUscj10aGlzLmxlbmd0aD4+MSxpPWVbdF07dDxyOyl7dmFyIG89MSsodDw8MSkscz1vKzEsYT1lW29dO2lmKHM8dGhpcy5sZW5ndGgmJm4oZVtzXSxhKTwwJiYobz1zLGE9ZVtzXSksbihhLGkpPj0wKWJyZWFrO2VbdF09YSx0PW99ZVt0XT1pfX0sdW4uZGVmYXVsdD1jbjt2YXIgZm49ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dFswXSxyPXRbMV0saT0hMSxvPTAscz1lLmxlbmd0aC0xO288ZS5sZW5ndGg7cz1vKyspe3ZhciBhPWVbb11bMF0sdT1lW29dWzFdLGM9ZVtzXVswXSxsPWVbc11bMV07dT5yIT1sPnImJm48KGMtYSkqKHItdSkvKGwtdSkrYSYmKGk9IWkpfXJldHVybiBpfSxwbj1vblszXSxkbj1nbjtmdW5jdGlvbiBnbih0LGUsbil7ZT1NYXRoLm1heCgwLHZvaWQgMD09PWU/MjplKSxuPW58fDA7Zm9yKHZhciByLGk9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRbMF0sbj10WzBdLHI9dFswXSxpPXRbMF0sbz0wO288dC5sZW5ndGg7bysrKXt2YXIgcz10W29dO3NbMF08ZVswXSYmKGU9cyksc1swXT5yWzBdJiYocj1zKSxzWzFdPG5bMV0mJihuPXMpLHNbMV0+aVsxXSYmKGk9cyl9dmFyIGE9W2UsbixyLGldLHU9YS5zbGljZSgpO2ZvcihvPTA7bzx0Lmxlbmd0aDtvKyspZm4odFtvXSxhKXx8dS5wdXNoKHRbb10pO3ZhciBjPXNuKHUpLGw9W107Zm9yKG89MDtvPGMubGVuZ3RoO28rKylsLnB1c2godVtjW29dXSk7cmV0dXJuIGx9KHQpLG89UGUoMTYsWyJbMF0iLCJbMV0iLCJbMF0iLCJbMV0iXSkubG9hZCh0KSxzPVtdLGE9MDthPGkubGVuZ3RoO2ErKyl7dmFyIHU9aVthXTtvLnJlbW92ZSh1KSxyPURuKHUscikscy5wdXNoKHIpfXZhciBjPVBlKDE2KTtmb3IoYT0wO2E8cy5sZW5ndGg7YSsrKWMuaW5zZXJ0KGJuKHNbYV0pKTtmb3IodmFyIGw9ZSplLGg9bipuO3MubGVuZ3RoOyl7dmFyIGY9cy5zaGlmdCgpLHA9Zi5wLGQ9Zi5uZXh0LnAsZz1FbihwLGQpO2lmKCEoZzxoKSl7dmFyIHk9Zy9sOyh1PXluKG8sZi5wcmV2LnAscCxkLGYubmV4dC5uZXh0LnAseSxjKSkmJk1hdGgubWluKEVuKHUscCksRW4odSxkKSk8PXkmJihzLnB1c2goZikscy5wdXNoKERuKHUsZikpLG8ucmVtb3ZlKHUpLGMucmVtb3ZlKGYpLGMuaW5zZXJ0KGJuKGYpKSxjLmluc2VydChibihmLm5leHQpKSl9fWY9cjt2YXIgbT1bXTtkb3ttLnB1c2goZi5wKSxmPWYubmV4dH13aGlsZShmIT09cik7cmV0dXJuIG0ucHVzaChmLnApLG19ZnVuY3Rpb24geW4odCxlLG4scixpLG8scyl7Zm9yKHZhciBhPW5ldyB1bihudWxsLG1uKSx1PXQuZGF0YTt1Oyl7Zm9yKHZhciBjPTA7Yzx1LmNoaWxkcmVuLmxlbmd0aDtjKyspe3ZhciBsPXUuY2hpbGRyZW5bY10saD11LmxlYWY/Q24obCxuLHIpOnZuKG4scixsKTtoPm98fGEucHVzaCh7bm9kZTpsLGRpc3Q6aH0pfWZvcig7YS5sZW5ndGgmJiFhLnBlZWsoKS5ub2RlLmNoaWxkcmVuOyl7dmFyIGY9YS5wb3AoKSxwPWYubm9kZSxkPUNuKHAsZSxuKSxnPUNuKHAscixpKTtpZihmLmRpc3Q8ZCYmZi5kaXN0PGcmJnhuKG4scCxzKSYmeG4ocixwLHMpKXJldHVybiBwfSh1PWEucG9wKCkpJiYodT11Lm5vZGUpfXJldHVybiBudWxsfWZ1bmN0aW9uIG1uKHQsZSl7cmV0dXJuIHQuZGlzdC1lLmRpc3R9ZnVuY3Rpb24gdm4odCxlLG4pe2lmKF9uKHQsbil8fF9uKGUsbikpcmV0dXJuIDA7dmFyIHI9U24odFswXSx0WzFdLGVbMF0sZVsxXSxuLm1pblgsbi5taW5ZLG4ubWF4WCxuLm1pblkpO2lmKDA9PT1yKXJldHVybiAwO3ZhciBpPVNuKHRbMF0sdFsxXSxlWzBdLGVbMV0sbi5taW5YLG4ubWluWSxuLm1pblgsbi5tYXhZKTtpZigwPT09aSlyZXR1cm4gMDt2YXIgbz1Tbih0WzBdLHRbMV0sZVswXSxlWzFdLG4ubWF4WCxuLm1pblksbi5tYXhYLG4ubWF4WSk7aWYoMD09PW8pcmV0dXJuIDA7dmFyIHM9U24odFswXSx0WzFdLGVbMF0sZVsxXSxuLm1pblgsbi5tYXhZLG4ubWF4WCxuLm1heFkpO3JldHVybiAwPT09cz8wOk1hdGgubWluKHIsaSxvLHMpfWZ1bmN0aW9uIF9uKHQsZSl7cmV0dXJuIHRbMF0+PWUubWluWCYmdFswXTw9ZS5tYXhYJiZ0WzFdPj1lLm1pblkmJnRbMV08PWUubWF4WX1mdW5jdGlvbiB4bih0LGUsbil7Zm9yKHZhciByPU1hdGgubWluKHRbMF0sZVswXSksaT1NYXRoLm1pbih0WzFdLGVbMV0pLG89TWF0aC5tYXgodFswXSxlWzBdKSxzPU1hdGgubWF4KHRbMV0sZVsxXSksYT1uLnNlYXJjaCh7bWluWDpyLG1pblk6aSxtYXhYOm8sbWF4WTpzfSksdT0wO3U8YS5sZW5ndGg7dSsrKWlmKHduKGFbdV0ucCxhW3VdLm5leHQucCx0LGUpKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIHduKHQsZSxuLHIpe3JldHVybiB0IT09ciYmZSE9PW4mJnBuKHQsZSxuKT4wIT1wbih0LGUscik+MCYmcG4obixyLHQpPjAhPXBuKG4scixlKT4wfWZ1bmN0aW9uIGJuKHQpe3ZhciBlPXQucCxuPXQubmV4dC5wO3JldHVybiB0Lm1pblg9TWF0aC5taW4oZVswXSxuWzBdKSx0Lm1pblk9TWF0aC5taW4oZVsxXSxuWzFdKSx0Lm1heFg9TWF0aC5tYXgoZVswXSxuWzBdKSx0Lm1heFk9TWF0aC5tYXgoZVsxXSxuWzFdKSx0fWZ1bmN0aW9uIERuKHQsZSl7dmFyIG49e3A6dCxwcmV2Om51bGwsbmV4dDpudWxsLG1pblg6MCxtaW5ZOjAsbWF4WDowLG1heFk6MH07cmV0dXJuIGU/KG4ubmV4dD1lLm5leHQsbi5wcmV2PWUsZS5uZXh0LnByZXY9bixlLm5leHQ9bik6KG4ucHJldj1uLG4ubmV4dD1uKSxufWZ1bmN0aW9uIEVuKHQsZSl7dmFyIG49dFswXS1lWzBdLHI9dFsxXS1lWzFdO3JldHVybiBuKm4rcipyfWZ1bmN0aW9uIENuKHQsZSxuKXt2YXIgcj1lWzBdLGk9ZVsxXSxvPW5bMF0tcixzPW5bMV0taTtpZigwIT09b3x8MCE9PXMpe3ZhciBhPSgodFswXS1yKSpvKyh0WzFdLWkpKnMpLyhvKm8rcypzKTthPjE/KHI9blswXSxpPW5bMV0pOmE+MCYmKHIrPW8qYSxpKz1zKmEpfXJldHVybihvPXRbMF0tcikqbysocz10WzFdLWkpKnN9ZnVuY3Rpb24gU24odCxlLG4scixpLG8scyxhKXt2YXIgdSxjLGwsaCxmPW4tdCxwPXItZSxkPXMtaSxnPWEtbyx5PXQtaSxtPWUtbyx2PWYqZitwKnAsXz1mKmQrcCpnLHg9ZCpkK2cqZyx3PWYqeStwKm0sYj1kKnkrZyptLEQ9dip4LV8qXyxFPUQsQz1EOzA9PT1EPyhjPTAsRT0xLGg9YixDPXgpOihoPXYqYi1fKncsKGM9XypiLXgqdyk8MD8oYz0wLGg9YixDPXgpOmM+RSYmKGM9RSxoPWIrXyxDPXgpKSxoPDA/KGg9MCwtdzwwP2M9MDotdz52P2M9RTooYz0tdyxFPXYpKTpoPkMmJihoPUMsLXcrXzwwP2M9MDotdytfPnY/Yz1FOihjPS13K18sRT12KSk7dmFyIFM9KDEtKGw9MD09PWg/MDpoL0MpKSppK2wqcy0oKDEtKHU9MD09PWM/MDpjL0UpKSp0K3UqbiksQT0oMS1sKSpvK2wqYS0oKDEtdSkqZSt1KnIpO3JldHVybiBTKlMrQSpBfWZ1bmN0aW9uIEFuKHQsZSxuKXtpZigib2JqZWN0IiE9dHlwZW9mKG49bnx8e30pKXRocm93IG5ldyBFcnJvcigib3B0aW9ucyBpcyBpbnZhbGlkIik7dmFyIHI9bi5pZ25vcmVCb3VuZGFyeTtpZighdCl0aHJvdyBuZXcgRXJyb3IoInBvaW50IGlzIHJlcXVpcmVkIik7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJwb2x5Z29uIGlzIHJlcXVpcmVkIik7dmFyIGk9SWUodCksbz1NZShlKSxzPWUuZ2VvbWV0cnk/ZS5nZW9tZXRyeS50eXBlOmUudHlwZSxhPWUuYmJveDtpZihhJiYhMT09PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGVbMF08PXRbMF0mJmVbMV08PXRbMV0mJmVbMl0+PXRbMF0mJmVbM10+PXRbMV19KGksYSkpcmV0dXJuITE7IlBvbHlnb24iPT09cyYmKG89W29dKTtmb3IodmFyIHU9MCxjPSExO3U8by5sZW5ndGgmJiFjO3UrKylpZihObihpLG9bdV1bMF0scikpe2Zvcih2YXIgbD0hMSxoPTE7aDxvW3VdLmxlbmd0aCYmIWw7KU5uKGksb1t1XVtoXSwhcikmJihsPSEwKSxoKys7bHx8KGM9ITApfXJldHVybiBjfWZ1bmN0aW9uIE5uKHQsZSxuKXt2YXIgcj0hMTtlWzBdWzBdPT09ZVtlLmxlbmd0aC0xXVswXSYmZVswXVsxXT09PWVbZS5sZW5ndGgtMV1bMV0mJihlPWUuc2xpY2UoMCxlLmxlbmd0aC0xKSk7Zm9yKHZhciBpPTAsbz1lLmxlbmd0aC0xO2k8ZS5sZW5ndGg7bz1pKyspe3ZhciBzPWVbaV1bMF0sYT1lW2ldWzFdLHU9ZVtvXVswXSxjPWVbb11bMV07aWYodFsxXSoocy11KSthKih1LXRbMF0pK2MqKHRbMF0tcyk9PTAmJihzLXRbMF0pKih1LXRbMF0pPD0wJiYoYS10WzFdKSooYy10WzFdKTw9MClyZXR1cm4hbjthPnRbMV0hPWM+dFsxXSYmdFswXTwodS1zKSoodFsxXS1hKS8oYy1hKStzJiYocj0hcil9cmV0dXJuIHJ9ZnVuY3Rpb24gSW4odCl7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJnZW9qc29uIGlzIHJlcXVpcmVkIik7c3dpdGNoKHQudHlwZSl7Y2FzZSJGZWF0dXJlIjpyZXR1cm4gTW4odCk7Y2FzZSJGZWF0dXJlQ29sbGVjdGlvbiI6cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBlPXt0eXBlOiJGZWF0dXJlQ29sbGVjdGlvbiJ9O3JldHVybiBPYmplY3Qua2V5cyh0KS5mb3JFYWNoKChmdW5jdGlvbihuKXtzd2l0Y2gobil7Y2FzZSJ0eXBlIjpjYXNlImZlYXR1cmVzIjpyZXR1cm47ZGVmYXVsdDplW25dPXRbbl19fSkpLGUuZmVhdHVyZXM9dC5mZWF0dXJlcy5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBNbih0KX0pKSxlfSh0KTtjYXNlIlBvaW50IjpjYXNlIkxpbmVTdHJpbmciOmNhc2UiUG9seWdvbiI6Y2FzZSJNdWx0aVBvaW50IjpjYXNlIk11bHRpTGluZVN0cmluZyI6Y2FzZSJNdWx0aVBvbHlnb24iOmNhc2UiR2VvbWV0cnlDb2xsZWN0aW9uIjpyZXR1cm4gVG4odCk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoInVua25vd24gR2VvSlNPTiB0eXBlIil9fWZ1bmN0aW9uIE1uKHQpe3ZhciBlPXt0eXBlOiJGZWF0dXJlIn07cmV0dXJuIE9iamVjdC5rZXlzKHQpLmZvckVhY2goKGZ1bmN0aW9uKG4pe3N3aXRjaChuKXtjYXNlInR5cGUiOmNhc2UicHJvcGVydGllcyI6Y2FzZSJnZW9tZXRyeSI6cmV0dXJuO2RlZmF1bHQ6ZVtuXT10W25dfX0pKSxlLnByb3BlcnRpZXM9Rm4odC5wcm9wZXJ0aWVzKSxlLmdlb21ldHJ5PVRuKHQuZ2VvbWV0cnkpLGV9ZnVuY3Rpb24gRm4odCl7dmFyIGU9e307cmV0dXJuIHQmJk9iamVjdC5rZXlzKHQpLmZvckVhY2goKGZ1bmN0aW9uKG4pe3ZhciByPXRbbl07Im9iamVjdCI9PXR5cGVvZiByP251bGw9PT1yP2Vbbl09bnVsbDpyLmxlbmd0aD9lW25dPXIubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdH0pKTplW25dPUZuKHIpOmVbbl09cn0pKSxlfWZ1bmN0aW9uIFRuKHQpe3ZhciBlPXt0eXBlOnQudHlwZX07cmV0dXJuIHQuYmJveCYmKGUuYmJveD10LmJib3gpLCJHZW9tZXRyeUNvbGxlY3Rpb24iPT09dC50eXBlPyhlLmdlb21ldHJpZXM9dC5nZW9tZXRyaWVzLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIFRuKHQpfSkpLGUpOihlLmNvb3JkaW5hdGVzPU9uKHQuY29vcmRpbmF0ZXMpLGUpfWZ1bmN0aW9uIE9uKHQpe3JldHVybiJvYmplY3QiIT10eXBlb2YgdFswXT90LnNsaWNlKCk6dC5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBPbih0KX0pKX1mdW5jdGlvbiBMbih0KXtyZXR1cm4gZnVuY3Rpb24odCl7X2UodCk7dmFyIGU9TnVtYmVyKHRbMF0pLG49TnVtYmVyKHRbMV0pLHI9TnVtYmVyKHRbMl0pLGk9TnVtYmVyKHRbM10pO2lmKDY9PT10Lmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIkB0dXJmL2Jib3gtcG9seWdvbiBkb2VzIG5vdCBzdXBwb3J0IEJCb3ggd2l0aCA2IHBvc2l0aW9ucyIpO3ZhciBvPVtlLG5dO3JldHVybiB1ZShbW28sW3Isbl0sW3IsaV0sW2UsaV0sb11dKX0oZnVuY3Rpb24odCl7dmFyIGU9WzEvMCwxLzAsLTEvMCwtMS8wXTtyZXR1cm4gd2UodCwoZnVuY3Rpb24odCl7ZVswXT50WzBdJiYoZVswXT10WzBdKSxlWzFdPnRbMV0mJihlWzFdPXRbMV0pLGVbMl08dFswXSYmKGVbMl09dFswXSksZVszXTx0WzFdJiYoZVszXT10WzFdKX0pKSxlfSh0KSl9Z24uZGVmYXVsdD1kbjt2YXIgUG49Qm4sUm49Qm47ZnVuY3Rpb24gQm4odCxlLG4pe249bnx8Mjt2YXIgcixpLG8scyxhLHUsYyxsPWUmJmUubGVuZ3RoLGg9bD9lWzBdKm46dC5sZW5ndGgsZj1rbih0LDAsaCxuLCEwKSxwPVtdO2lmKCFmKXJldHVybiBwO2lmKGwmJihmPWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpLG8scyxhLHUsYz1bXTtmb3IoaT0wLG89ZS5sZW5ndGg7aTxvO2krKylzPWVbaV0qcixhPWk8by0xP2VbaSsxXSpyOnQubGVuZ3RoLCh1PWtuKHQscyxhLHIsITEpKT09PXUubmV4dCYmKHUuc3RlaW5lcj0hMCksYy5wdXNoKEhuKHUpKTtmb3IoYy5zb3J0KFluKSxpPTA7aTxjLmxlbmd0aDtpKyspWG4oY1tpXSxuKSxuPXpuKG4sbi5uZXh0KTtyZXR1cm4gbn0odCxlLGYsbikpLHQubGVuZ3RoPjgwKm4pe3I9bz10WzBdLGk9cz10WzFdO2Zvcih2YXIgZD1uO2Q8aDtkKz1uKShhPXRbZF0pPHImJihyPWEpLCh1PXRbZCsxXSk8aSYmKGk9dSksYT5vJiYobz1hKSx1PnMmJihzPXUpO2M9MCE9PShjPU1hdGgubWF4KG8tcixzLWkpKT8xL2M6MH1yZXR1cm4gam4oZixwLG4scixpLGMpLHB9ZnVuY3Rpb24ga24odCxlLG4scixpKXt2YXIgbyxzO2lmKGk9PT1vcih0LGUsbixyKT4wKWZvcihvPWU7bzxuO28rPXIpcz1ucihvLHRbb10sdFtvKzFdLHMpO2Vsc2UgZm9yKG89bi1yO28+PWU7by09cilzPW5yKG8sdFtvXSx0W28rMV0scyk7cmV0dXJuIHMmJlFuKHMscy5uZXh0KSYmKHJyKHMpLHM9cy5uZXh0KSxzfWZ1bmN0aW9uIHpuKHQsZSl7aWYoIXQpcmV0dXJuIHQ7ZXx8KGU9dCk7dmFyIG4scj10O2Rve2lmKG49ITEsci5zdGVpbmVyfHwhUW4ocixyLm5leHQpJiYwIT09Sm4oci5wcmV2LHIsci5uZXh0KSlyPXIubmV4dDtlbHNle2lmKHJyKHIpLChyPWU9ci5wcmV2KT09PXIubmV4dClicmVhaztuPSEwfX13aGlsZShufHxyIT09ZSk7cmV0dXJuIGV9ZnVuY3Rpb24gam4odCxlLG4scixpLG8scyl7aWYodCl7IXMmJm8mJmZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPXQ7ZG97bnVsbD09PWkueiYmKGkuej1XbihpLngsaS55LGUsbixyKSksaS5wcmV2Wj1pLnByZXYsaS5uZXh0Wj1pLm5leHQsaT1pLm5leHR9d2hpbGUoaSE9PXQpO2kucHJldloubmV4dFo9bnVsbCxpLnByZXZaPW51bGwsZnVuY3Rpb24odCl7dmFyIGUsbixyLGksbyxzLGEsdSxjPTE7ZG97Zm9yKG49dCx0PW51bGwsbz1udWxsLHM9MDtuOyl7Zm9yKHMrKyxyPW4sYT0wLGU9MDtlPGMmJihhKysscj1yLm5leHRaKTtlKyspO2Zvcih1PWM7YT4wfHx1PjAmJnI7KTAhPT1hJiYoMD09PXV8fCFyfHxuLno8PXIueik/KGk9bixuPW4ubmV4dFosYS0tKTooaT1yLHI9ci5uZXh0Wix1LS0pLG8/by5uZXh0Wj1pOnQ9aSxpLnByZXZaPW8sbz1pO249cn1vLm5leHRaPW51bGwsYyo9Mn13aGlsZShzPjEpfShpKX0odCxyLGksbyk7Zm9yKHZhciBhLHUsYz10O3QucHJldiE9PXQubmV4dDspaWYoYT10LnByZXYsdT10Lm5leHQsbz9xbih0LHIsaSxvKTpVbih0KSllLnB1c2goYS5pL24pLGUucHVzaCh0LmkvbiksZS5wdXNoKHUuaS9uKSxycih0KSx0PXUubmV4dCxjPXUubmV4dDtlbHNlIGlmKCh0PXUpPT09Yyl7cz8xPT09cz9qbih0PVZuKHQsZSxuKSxlLG4scixpLG8sMik6Mj09PXMmJkduKHQsZSxuLHIsaSxvKTpqbih6bih0KSxlLG4scixpLG8sMSk7YnJlYWt9fX1mdW5jdGlvbiBVbih0KXt2YXIgZT10LnByZXYsbj10LHI9dC5uZXh0O2lmKEpuKGUsbixyKT49MClyZXR1cm4hMTtmb3IodmFyIGk9dC5uZXh0Lm5leHQ7aSE9PXQucHJldjspe2lmKFpuKGUueCxlLnksbi54LG4ueSxyLngsci55LGkueCxpLnkpJiZKbihpLnByZXYsaSxpLm5leHQpPj0wKXJldHVybiExO2k9aS5uZXh0fXJldHVybiEwfWZ1bmN0aW9uIHFuKHQsZSxuLHIpe3ZhciBpPXQucHJldixvPXQscz10Lm5leHQ7aWYoSm4oaSxvLHMpPj0wKXJldHVybiExO2Zvcih2YXIgYT1pLng8by54P2kueDxzLng/aS54OnMueDpvLng8cy54P28ueDpzLngsdT1pLnk8by55P2kueTxzLnk/aS55OnMueTpvLnk8cy55P28ueTpzLnksYz1pLng+by54P2kueD5zLng/aS54OnMueDpvLng+cy54P28ueDpzLngsbD1pLnk+by55P2kueT5zLnk/aS55OnMueTpvLnk+cy55P28ueTpzLnksaD1XbihhLHUsZSxuLHIpLGY9V24oYyxsLGUsbixyKSxwPXQubmV4dFo7cCYmcC56PD1mOyl7aWYocCE9PXQucHJldiYmcCE9PXQubmV4dCYmWm4oaS54LGkueSxvLngsby55LHMueCxzLnkscC54LHAueSkmJkpuKHAucHJldixwLHAubmV4dCk+PTApcmV0dXJuITE7cD1wLm5leHRafWZvcihwPXQucHJldlo7cCYmcC56Pj1oOyl7aWYocCE9PXQucHJldiYmcCE9PXQubmV4dCYmWm4oaS54LGkueSxvLngsby55LHMueCxzLnkscC54LHAueSkmJkpuKHAucHJldixwLHAubmV4dCk+PTApcmV0dXJuITE7cD1wLnByZXZafXJldHVybiEwfWZ1bmN0aW9uIFZuKHQsZSxuKXt2YXIgcj10O2Rve3ZhciBpPXIucHJldixvPXIubmV4dC5uZXh0OyFRbihpLG8pJiYkbihpLHIsci5uZXh0LG8pJiZ0cihpLG8pJiZ0cihvLGkpJiYoZS5wdXNoKGkuaS9uKSxlLnB1c2goci5pL24pLGUucHVzaChvLmkvbikscnIocikscnIoci5uZXh0KSxyPXQ9bykscj1yLm5leHR9d2hpbGUociE9PXQpO3JldHVybiByfWZ1bmN0aW9uIEduKHQsZSxuLHIsaSxvKXt2YXIgcz10O2Rve2Zvcih2YXIgYT1zLm5leHQubmV4dDthIT09cy5wcmV2Oyl7aWYocy5pIT09YS5pJiZLbihzLGEpKXt2YXIgdT1lcihzLGEpO3JldHVybiBzPXpuKHMscy5uZXh0KSx1PXpuKHUsdS5uZXh0KSxqbihzLGUsbixyLGksbyksdm9pZCBqbih1LGUsbixyLGksbyl9YT1hLm5leHR9cz1zLm5leHR9d2hpbGUocyE9PXQpfWZ1bmN0aW9uIFluKHQsZSl7cmV0dXJuIHQueC1lLnh9ZnVuY3Rpb24gWG4odCxlKXtpZihlPWZ1bmN0aW9uKHQsZSl7dmFyIG4scj1lLGk9dC54LG89dC55LHM9LTEvMDtkb3tpZihvPD1yLnkmJm8+PXIubmV4dC55JiZyLm5leHQueSE9PXIueSl7dmFyIGE9ci54KyhvLXIueSkqKHIubmV4dC54LXIueCkvKHIubmV4dC55LXIueSk7aWYoYTw9aSYmYT5zKXtpZihzPWEsYT09PWkpe2lmKG89PT1yLnkpcmV0dXJuIHI7aWYobz09PXIubmV4dC55KXJldHVybiByLm5leHR9bj1yLng8ci5uZXh0Lng/cjpyLm5leHR9fXI9ci5uZXh0fXdoaWxlKHIhPT1lKTtpZighbilyZXR1cm4gbnVsbDtpZihpPT09cylyZXR1cm4gbi5wcmV2O3ZhciB1LGM9bixsPW4ueCxoPW4ueSxmPTEvMDtmb3Iocj1uLm5leHQ7ciE9PWM7KWk+PXIueCYmci54Pj1sJiZpIT09ci54JiZabihvPGg/aTpzLG8sbCxoLG88aD9zOmksbyxyLngsci55KSYmKCh1PU1hdGguYWJzKG8tci55KS8oaS1yLngpKTxmfHx1PT09ZiYmci54Pm4ueCkmJnRyKHIsdCkmJihuPXIsZj11KSxyPXIubmV4dDtyZXR1cm4gbn0odCxlKSxlKXt2YXIgbj1lcihlLHQpO3puKG4sbi5uZXh0KX19ZnVuY3Rpb24gV24odCxlLG4scixpKXtyZXR1cm4odD0xNDMxNjU1NzY1JigodD04NTg5OTM0NTkmKCh0PTI1MjY0NTEzNSYoKHQ9MTY3MTE5MzUmKCh0PTMyNzY3Kih0LW4pKmkpfHQ8PDgpKXx0PDw0KSl8dDw8MikpfHQ8PDEpKXwoZT0xNDMxNjU1NzY1JigoZT04NTg5OTM0NTkmKChlPTI1MjY0NTEzNSYoKGU9MTY3MTE5MzUmKChlPTMyNzY3KihlLXIpKmkpfGU8PDgpKXxlPDw0KSl8ZTw8MikpfGU8PDEpKTw8MX1mdW5jdGlvbiBIbih0KXt2YXIgZT10LG49dDtkb3tlLng8bi54JiYobj1lKSxlPWUubmV4dH13aGlsZShlIT09dCk7cmV0dXJuIG59ZnVuY3Rpb24gWm4odCxlLG4scixpLG8scyxhKXtyZXR1cm4oaS1zKSooZS1hKS0odC1zKSooby1hKT49MCYmKHQtcykqKHItYSktKG4tcykqKGUtYSk+PTAmJihuLXMpKihvLWEpLShpLXMpKihyLWEpPj0wfWZ1bmN0aW9uIEtuKHQsZSl7cmV0dXJuIHQubmV4dC5pIT09ZS5pJiZ0LnByZXYuaSE9PWUuaSYmIWZ1bmN0aW9uKHQsZSl7dmFyIG49dDtkb3tpZihuLmkhPT10LmkmJm4ubmV4dC5pIT09dC5pJiZuLmkhPT1lLmkmJm4ubmV4dC5pIT09ZS5pJiYkbihuLG4ubmV4dCx0LGUpKXJldHVybiEwO249bi5uZXh0fXdoaWxlKG4hPT10KTtyZXR1cm4hMX0odCxlKSYmdHIodCxlKSYmdHIoZSx0KSYmZnVuY3Rpb24odCxlKXt2YXIgbj10LHI9ITEsaT0odC54K2UueCkvMixvPSh0LnkrZS55KS8yO2Rve24ueT5vIT1uLm5leHQueT5vJiZuLm5leHQueSE9PW4ueSYmaTwobi5uZXh0Lngtbi54KSooby1uLnkpLyhuLm5leHQueS1uLnkpK24ueCYmKHI9IXIpLG49bi5uZXh0fXdoaWxlKG4hPT10KTtyZXR1cm4gcn0odCxlKX1mdW5jdGlvbiBKbih0LGUsbil7cmV0dXJuKGUueS10LnkpKihuLngtZS54KS0oZS54LXQueCkqKG4ueS1lLnkpfWZ1bmN0aW9uIFFuKHQsZSl7cmV0dXJuIHQueD09PWUueCYmdC55PT09ZS55fWZ1bmN0aW9uICRuKHQsZSxuLHIpe3JldHVybiEhKFFuKHQsZSkmJlFuKG4scil8fFFuKHQscikmJlFuKG4sZSkpfHxKbih0LGUsbik+MCE9Sm4odCxlLHIpPjAmJkpuKG4scix0KT4wIT1KbihuLHIsZSk+MH1mdW5jdGlvbiB0cih0LGUpe3JldHVybiBKbih0LnByZXYsdCx0Lm5leHQpPDA/Sm4odCxlLHQubmV4dCk+PTAmJkpuKHQsdC5wcmV2LGUpPj0wOkpuKHQsZSx0LnByZXYpPDB8fEpuKHQsdC5uZXh0LGUpPDB9ZnVuY3Rpb24gZXIodCxlKXt2YXIgbj1uZXcgaXIodC5pLHQueCx0LnkpLHI9bmV3IGlyKGUuaSxlLngsZS55KSxpPXQubmV4dCxvPWUucHJldjtyZXR1cm4gdC5uZXh0PWUsZS5wcmV2PXQsbi5uZXh0PWksaS5wcmV2PW4sci5uZXh0PW4sbi5wcmV2PXIsby5uZXh0PXIsci5wcmV2PW8scn1mdW5jdGlvbiBucih0LGUsbixyKXt2YXIgaT1uZXcgaXIodCxlLG4pO3JldHVybiByPyhpLm5leHQ9ci5uZXh0LGkucHJldj1yLHIubmV4dC5wcmV2PWksci5uZXh0PWkpOihpLnByZXY9aSxpLm5leHQ9aSksaX1mdW5jdGlvbiBycih0KXt0Lm5leHQucHJldj10LnByZXYsdC5wcmV2Lm5leHQ9dC5uZXh0LHQucHJldlomJih0LnByZXZaLm5leHRaPXQubmV4dFopLHQubmV4dFomJih0Lm5leHRaLnByZXZaPXQucHJldlopfWZ1bmN0aW9uIGlyKHQsZSxuKXt0aGlzLmk9dCx0aGlzLng9ZSx0aGlzLnk9bix0aGlzLnByZXY9bnVsbCx0aGlzLm5leHQ9bnVsbCx0aGlzLno9bnVsbCx0aGlzLnByZXZaPW51bGwsdGhpcy5uZXh0Wj1udWxsLHRoaXMuc3RlaW5lcj0hMX1mdW5jdGlvbiBvcih0LGUsbixyKXtmb3IodmFyIGk9MCxvPWUscz1uLXI7bzxuO28rPXIpaSs9KHRbc10tdFtvXSkqKHRbbysxXSt0W3MrMV0pLHM9bztyZXR1cm4gaX1mdW5jdGlvbiBzcih0LGUsbil7aWYoIXZlKG49bnx8e30pKXRocm93IG5ldyBFcnJvcigib3B0aW9ucyBpcyBpbnZhbGlkIik7dmFyIHI9bi5tdXRhdGU7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJnZW9qc29uIGlzIHJlcXVpcmVkIik7cmV0dXJuIEFycmF5LmlzQXJyYXkodCkmJm1lKHRbMF0pP3Q9Im1lcmNhdG9yIj09PWU/YXIodCk6dXIodCk6KCEwIT09ciYmKHQ9SW4odCkpLHdlKHQsKGZ1bmN0aW9uKHQpe3ZhciBuPSJtZXJjYXRvciI9PT1lP2FyKHQpOnVyKHQpO3RbMF09blswXSx0WzFdPW5bMV19KSkpLHR9ZnVuY3Rpb24gYXIodCl7dmFyIGU9TWF0aC5QSS8xODAsbj02Mzc4MTM3LHI9MjAwMzc1MDguMzQyNzg5MjQ0LGk9TWF0aC5hYnModFswXSk8PTE4MD90WzBdOnRbMF0tMzYwKmZ1bmN0aW9uKHQpe3JldHVybiB0PDA/LTE6dD4wPzE6MH0odFswXSksbz1bbippKmUsbipNYXRoLmxvZyhNYXRoLnRhbiguMjUqTWF0aC5QSSsuNSp0WzFdKmUpKV07cmV0dXJuIG9bMF0+ciYmKG9bMF09ciksb1swXTwtciYmKG9bMF09LXIpLG9bMV0+ciYmKG9bMV09ciksb1sxXTwtciYmKG9bMV09LXIpLG99ZnVuY3Rpb24gdXIodCl7dmFyIGU9MTgwL01hdGguUEksbj02Mzc4MTM3O3JldHVyblt0WzBdKmUvbiwoLjUqTWF0aC5QSS0yKk1hdGguYXRhbihNYXRoLmV4cCgtdFsxXS9uKSkpKmVdfWZ1bmN0aW9uIGNyKHQsZSxuKXt2YXIgcixpLG8scyxhLHU9dC5sZW5ndGgsYz1ocih0WzBdLGUpLGw9W107Zm9yKG58fChuPVtdKSxyPTE7cjx1O3IrKyl7Zm9yKGk9dFtyLTFdLHM9YT1ocihvPXRbcl0sZSk7Oyl7aWYoIShjfHMpKXtsLnB1c2goaSkscyE9PWE/KGwucHVzaChvKSxyPHUtMSYmKG4ucHVzaChsKSxsPVtdKSk6cj09PXUtMSYmbC5wdXNoKG8pO2JyZWFrfWlmKGMmcylicmVhaztjP2M9aHIoaT1scihpLG8sYyxlKSxlKTpzPWhyKG89bHIoaSxvLHMsZSksZSl9Yz1hfXJldHVybiBsLmxlbmd0aCYmbi5wdXNoKGwpLG59ZnVuY3Rpb24gbHIodCxlLG4scil7cmV0dXJuIDgmbj9bdFswXSsoZVswXS10WzBdKSooclszXS10WzFdKS8oZVsxXS10WzFdKSxyWzNdXTo0Jm4/W3RbMF0rKGVbMF0tdFswXSkqKHJbMV0tdFsxXSkvKGVbMV0tdFsxXSksclsxXV06MiZuP1tyWzJdLHRbMV0rKGVbMV0tdFsxXSkqKHJbMl0tdFswXSkvKGVbMF0tdFswXSldOjEmbj9bclswXSx0WzFdKyhlWzFdLXRbMV0pKihyWzBdLXRbMF0pLyhlWzBdLXRbMF0pXTpudWxsfWZ1bmN0aW9uIGhyKHQsZSl7dmFyIG49MDtyZXR1cm4gdFswXTxlWzBdP258PTE6dFswXT5lWzJdJiYobnw9MiksdFsxXTxlWzFdP258PTQ6dFsxXT5lWzNdJiYobnw9OCksbn1mdW5jdGlvbiBmcih0LGUpe3JldHVybiBlLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdLmV2ZXJ5KChmdW5jdGlvbihlKXtyZXR1cm4gQW4oYWUoZSksdCl9KSl9Qm4uZGV2aWF0aW9uPWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPWUmJmUubGVuZ3RoLG89aT9lWzBdKm46dC5sZW5ndGgscz1NYXRoLmFicyhvcih0LDAsbyxuKSk7aWYoaSlmb3IodmFyIGE9MCx1PWUubGVuZ3RoO2E8dTthKyspe3ZhciBjPWVbYV0qbixsPWE8dS0xP2VbYSsxXSpuOnQubGVuZ3RoO3MtPU1hdGguYWJzKG9yKHQsYyxsLG4pKX12YXIgaD0wO2ZvcihhPTA7YTxyLmxlbmd0aDthKz0zKXt2YXIgZj1yW2FdKm4scD1yW2ErMV0qbixkPXJbYSsyXSpuO2grPU1hdGguYWJzKCh0W2ZdLXRbZF0pKih0W3ArMV0tdFtmKzFdKS0odFtmXS10W3BdKSoodFtkKzFdLXRbZisxXSkpfXJldHVybiAwPT09cyYmMD09PWg/MDpNYXRoLmFicygoaC1zKS9zKX0sQm4uZmxhdHRlbj1mdW5jdGlvbih0KXtmb3IodmFyIGU9dFswXVswXS5sZW5ndGgsbj17dmVydGljZXM6W10saG9sZXM6W10sZGltZW5zaW9uczplfSxyPTAsaT0wO2k8dC5sZW5ndGg7aSsrKXtmb3IodmFyIG89MDtvPHRbaV0ubGVuZ3RoO28rKylmb3IodmFyIHM9MDtzPGU7cysrKW4udmVydGljZXMucHVzaCh0W2ldW29dW3NdKTtpPjAmJihyKz10W2ktMV0ubGVuZ3RoLG4uaG9sZXMucHVzaChyKSl9cmV0dXJuIG59LFBuLmRlZmF1bHQ9Um4sT2JqZWN0LmZyZWV6ZSh7dG9NZXJjYXRvcjpmdW5jdGlvbih0LGUpe3JldHVybiBzcih0LCJtZXJjYXRvciIsZSl9LHRvV2dzODQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gc3IodCwid2dzODQiLGUpfX0pLE51bWJlci5wcm90b3R5cGUubW9kdWxvPWZ1bmN0aW9uKHQpe3JldHVybih0aGlzJXQrdCkldH0sY3IucG9seWxpbmU9Y3IsY3IucG9seWdvbj1mdW5jdGlvbih0LGUpe3ZhciBuLHIsaSxvLHMsYSx1O2ZvcihyPTE7cjw9ODtyKj0yKXtmb3Iobj1bXSxvPSEoaHIoaT10W3QubGVuZ3RoLTFdLGUpJnIpLHM9MDtzPHQubGVuZ3RoO3MrKykodT0hKGhyKGE9dFtzXSxlKSZyKSkhPT1vJiZuLnB1c2gobHIoaSxhLHIsZSkpLHUmJm4ucHVzaChhKSxpPWEsbz11O2lmKCEodD1uKS5sZW5ndGgpYnJlYWt9cmV0dXJuIG59O3ZhciBwcj1mdW5jdGlvbigpe3RoaXMuZWRnZXM9W10sdGhpcy5wb2x5Z29uPXZvaWQgMCx0aGlzLmVudmVsb3BlPXZvaWQgMH0sZHI9e2xlbmd0aDp7Y29uZmlndXJhYmxlOiEwfX07cHIucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24odCl7dGhpc1t0aGlzLmVkZ2VzLmxlbmd0aF09dCx0aGlzLmVkZ2VzLnB1c2godCksdGhpcy5wb2x5Z29uPXRoaXMuZW52ZWxvcGU9dm9pZCAwfSxwci5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVkZ2VzW3RdfSxkci5sZW5ndGguZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWRnZXMubGVuZ3RofSxwci5wcm90b3R5cGUuZm9yRWFjaD1mdW5jdGlvbih0KXt0aGlzLmVkZ2VzLmZvckVhY2godCl9LHByLnByb3RvdHlwZS5tYXA9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZWRnZXMubWFwKHQpfSxwci5wcm90b3R5cGUuc29tZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lZGdlcy5zb21lKHQpfSxwci5wcm90b3R5cGUuaXNWYWxpZD1mdW5jdGlvbigpe3JldHVybiEwfSxwci5wcm90b3R5cGUuaXNIb2xlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPXRoaXMuZWRnZXMucmVkdWNlKChmdW5jdGlvbihlLG4scil7cmV0dXJuIG4uZnJvbS5jb29yZGluYXRlc1sxXT50LmVkZ2VzW2VdLmZyb20uY29vcmRpbmF0ZXNbMV0mJihlPXIpLGV9KSwwKSxuPSgwPT09ZT90aGlzLmxlbmd0aDplKS0xLHI9KGUrMSkldGhpcy5sZW5ndGgsaT1mdW5jdGlvbih0LGUsbil7dmFyIHI9ZVswXS10WzBdLGk9ZVsxXS10WzFdLG89blswXS1lWzBdLHM9blsxXS1lWzFdO3JldHVybiBNYXRoLnNpZ24ocipzLW8qaSl9KHRoaXMuZWRnZXNbbl0uZnJvbS5jb29yZGluYXRlcyx0aGlzLmVkZ2VzW2VdLmZyb20uY29vcmRpbmF0ZXMsdGhpcy5lZGdlc1tyXS5mcm9tLmNvb3JkaW5hdGVzKTtyZXR1cm4gMD09PWk/dGhpcy5lZGdlc1tuXS5mcm9tLmNvb3JkaW5hdGVzWzBdPnRoaXMuZWRnZXNbcl0uZnJvbS5jb29yZGluYXRlc1swXTppPjB9LHByLnByb3RvdHlwZS50b011bHRpUG9pbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gZmUodGhpcy5lZGdlcy5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmZyb20uY29vcmRpbmF0ZXN9KSkpfSxwci5wcm90b3R5cGUudG9Qb2x5Z29uPWZ1bmN0aW9uKCl7aWYodGhpcy5wb2x5Z29uKXJldHVybiB0aGlzLnBvbHlnb247dmFyIHQ9dGhpcy5lZGdlcy5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmZyb20uY29vcmRpbmF0ZXN9KSk7cmV0dXJuIHQucHVzaCh0aGlzLmVkZ2VzWzBdLmZyb20uY29vcmRpbmF0ZXMpLHRoaXMucG9seWdvbj11ZShbdF0pfSxwci5wcm90b3R5cGUuZ2V0RW52ZWxvcGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbnZlbG9wZT90aGlzLmVudmVsb3BlOnRoaXMuZW52ZWxvcGU9TG4odGhpcy50b1BvbHlnb24oKSl9LHByLmZpbmRFZGdlUmluZ0NvbnRhaW5pbmc9ZnVuY3Rpb24odCxlKXt2YXIgbixyLGk9dC5nZXRFbnZlbG9wZSgpO3JldHVybiBlLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciBvPWUuZ2V0RW52ZWxvcGUoKTtpZihyJiYobj1yLmdldEVudmVsb3BlKCkpLCFmdW5jdGlvbih0LGUpe3ZhciBuPXQuZ2VvbWV0cnkuY29vcmRpbmF0ZXMubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdFswXX0pKSxyPXQuZ2VvbWV0cnkuY29vcmRpbmF0ZXMubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdFsxXX0pKSxpPWUuZ2VvbWV0cnkuY29vcmRpbmF0ZXMubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdFswXX0pKSxvPWUuZ2VvbWV0cnkuY29vcmRpbmF0ZXMubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdFsxXX0pKTtyZXR1cm4gTWF0aC5tYXgobnVsbCxuKT09PU1hdGgubWF4KG51bGwsaSkmJk1hdGgubWF4KG51bGwscik9PT1NYXRoLm1heChudWxsLG8pJiZNYXRoLm1pbihudWxsLG4pPT09TWF0aC5taW4obnVsbCxpKSYmTWF0aC5taW4obnVsbCxyKT09PU1hdGgubWluKG51bGwsbyl9KG8saSkmJmZyKG8saSkpe3ZhciBzPXQubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdC5mcm9tLmNvb3JkaW5hdGVzfSkpLmZpbmQoKGZ1bmN0aW9uKHQpe3JldHVybiFlLnNvbWUoKGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0LGUpe3JldHVybiB0WzBdPT09ZVswXSYmdFsxXT09PWVbMV19KHQsZS5mcm9tLmNvb3JkaW5hdGVzKX0pKX0pKTtzJiZlLmluc2lkZShhZShzKSkmJighcnx8ZnIobixvKSkmJihyPWUpfX0pKSxyfSxwci5wcm90b3R5cGUuaW5zaWRlPWZ1bmN0aW9uKHQpe3JldHVybiBBbih0LHRoaXMudG9Qb2x5Z29uKCkpfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhwci5wcm90b3R5cGUsZHIpO3ZhciBncj1KZSgoZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBuKHQpe3ZhciBlPVtdO2Zvcih2YXIgbiBpbiB0KWUucHVzaChuKTtyZXR1cm4gZX0odC5leHBvcnRzPSJmdW5jdGlvbiI9PXR5cGVvZiBPYmplY3Qua2V5cz9PYmplY3Qua2V5czpuKS5zaGltPW59KSk7Z3Iuc2hpbTt2YXIgeXI9SmUoKGZ1bmN0aW9uKHQsZSl7dmFyIG49IltvYmplY3QgQXJndW1lbnRzXSI9PWZ1bmN0aW9uKCl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhcmd1bWVudHMpfSgpO2Z1bmN0aW9uIHIodCl7cmV0dXJuIltvYmplY3QgQXJndW1lbnRzXSI9PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiBpKHQpe3JldHVybiB0JiYib2JqZWN0Ij09dHlwZW9mIHQmJiJudW1iZXIiPT10eXBlb2YgdC5sZW5ndGgmJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCJjYWxsZWUiKSYmIU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh0LCJjYWxsZWUiKXx8ITF9KGU9dC5leHBvcnRzPW4/cjppKS5zdXBwb3J0ZWQ9cixlLnVuc3VwcG9ydGVkPWl9KSk7eXIuc3VwcG9ydGVkLHlyLnVuc3VwcG9ydGVkLEplKChmdW5jdGlvbih0KXt2YXIgZT1BcnJheS5wcm90b3R5cGUuc2xpY2Usbj10LmV4cG9ydHM9ZnVuY3Rpb24odCxvLHMpe3JldHVybiBzfHwocz17fSksdD09PW98fCh0IGluc3RhbmNlb2YgRGF0ZSYmbyBpbnN0YW5jZW9mIERhdGU/dC5nZXRUaW1lKCk9PT1vLmdldFRpbWUoKTohdHx8IW98fCJvYmplY3QiIT10eXBlb2YgdCYmIm9iamVjdCIhPXR5cGVvZiBvP3Muc3RyaWN0P3Q9PT1vOnQ9PW86ZnVuY3Rpb24odCxvLHMpe3ZhciBhLHU7aWYocih0KXx8cihvKXx8dC5wcm90b3R5cGUhPT1vLnByb3RvdHlwZSlyZXR1cm4hMTtpZih5cih0KSlyZXR1cm4hIXlyKG8pJiYodD1lLmNhbGwodCksbz1lLmNhbGwobyksbih0LG8scykpO2lmKGkodCkpe2lmKCFpKG8pfHx0Lmxlbmd0aCE9PW8ubGVuZ3RoKXJldHVybiExO2ZvcihhPTA7YTx0Lmxlbmd0aDthKyspaWYodFthXSE9PW9bYV0pcmV0dXJuITE7cmV0dXJuITB9dHJ5e3ZhciBjPWdyKHQpLGw9Z3Iobyl9Y2F0Y2godCl7cmV0dXJuITF9aWYoYy5sZW5ndGghPWwubGVuZ3RoKXJldHVybiExO2ZvcihjLnNvcnQoKSxsLnNvcnQoKSxhPWMubGVuZ3RoLTE7YT49MDthLS0paWYoY1thXSE9bFthXSlyZXR1cm4hMTtmb3IoYT1jLmxlbmd0aC0xO2E+PTA7YS0tKWlmKHU9Y1thXSwhbih0W3VdLG9bdV0scykpcmV0dXJuITE7cmV0dXJuIHR5cGVvZiB0PT10eXBlb2Ygb30odCxvLHMpKX07ZnVuY3Rpb24gcih0KXtyZXR1cm4gbnVsbD09dH1mdW5jdGlvbiBpKHQpe3JldHVybiEoIXR8fCJvYmplY3QiIT10eXBlb2YgdHx8Im51bWJlciIhPXR5cGVvZiB0Lmxlbmd0aHx8ImZ1bmN0aW9uIiE9dHlwZW9mIHQuY29weXx8ImZ1bmN0aW9uIiE9dHlwZW9mIHQuc2xpY2V8fHQubGVuZ3RoPjAmJiJudW1iZXIiIT10eXBlb2YgdFswXSl9fSkpO3ZhciBtcj1KZSgoZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0LGUsbixyKXt0aGlzLmRhdGFzZXQ9W10sdGhpcy5lcHNpbG9uPTEsdGhpcy5taW5QdHM9Mix0aGlzLmRpc3RhbmNlPXRoaXMuX2V1Y2xpZGVhbkRpc3RhbmNlLHRoaXMuY2x1c3RlcnM9W10sdGhpcy5ub2lzZT1bXSx0aGlzLl92aXNpdGVkPVtdLHRoaXMuX2Fzc2lnbmVkPVtdLHRoaXMuX2RhdGFzZXRMZW5ndGg9MCx0aGlzLl9pbml0KHQsZSxuLHIpfWUucHJvdG90eXBlLnJ1bj1mdW5jdGlvbih0LGUsbixyKXt0aGlzLl9pbml0KHQsZSxuLHIpO2Zvcih2YXIgaT0wO2k8dGhpcy5fZGF0YXNldExlbmd0aDtpKyspaWYoMSE9PXRoaXMuX3Zpc2l0ZWRbaV0pe3RoaXMuX3Zpc2l0ZWRbaV09MTt2YXIgbz10aGlzLl9yZWdpb25RdWVyeShpKTtpZihvLmxlbmd0aDx0aGlzLm1pblB0cyl0aGlzLm5vaXNlLnB1c2goaSk7ZWxzZXt2YXIgcz10aGlzLmNsdXN0ZXJzLmxlbmd0aDt0aGlzLmNsdXN0ZXJzLnB1c2goW10pLHRoaXMuX2FkZFRvQ2x1c3RlcihpLHMpLHRoaXMuX2V4cGFuZENsdXN0ZXIocyxvKX19cmV0dXJuIHRoaXMuY2x1c3RlcnN9LGUucHJvdG90eXBlLl9pbml0PWZ1bmN0aW9uKHQsZSxuLHIpe2lmKHQpe2lmKCEodCBpbnN0YW5jZW9mIEFycmF5KSl0aHJvdyBFcnJvcigiRGF0YXNldCBtdXN0IGJlIG9mIHR5cGUgYXJyYXksICIrdHlwZW9mIHQrIiBnaXZlbiIpO3RoaXMuZGF0YXNldD10LHRoaXMuY2x1c3RlcnM9W10sdGhpcy5ub2lzZT1bXSx0aGlzLl9kYXRhc2V0TGVuZ3RoPXQubGVuZ3RoLHRoaXMuX3Zpc2l0ZWQ9bmV3IEFycmF5KHRoaXMuX2RhdGFzZXRMZW5ndGgpLHRoaXMuX2Fzc2lnbmVkPW5ldyBBcnJheSh0aGlzLl9kYXRhc2V0TGVuZ3RoKX1lJiYodGhpcy5lcHNpbG9uPWUpLG4mJih0aGlzLm1pblB0cz1uKSxyJiYodGhpcy5kaXN0YW5jZT1yKX0sZS5wcm90b3R5cGUuX2V4cGFuZENsdXN0ZXI9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIHI9ZVtuXTtpZigxIT09dGhpcy5fdmlzaXRlZFtyXSl7dGhpcy5fdmlzaXRlZFtyXT0xO3ZhciBpPXRoaXMuX3JlZ2lvblF1ZXJ5KHIpO2kubGVuZ3RoPj10aGlzLm1pblB0cyYmKGU9dGhpcy5fbWVyZ2VBcnJheXMoZSxpKSl9MSE9PXRoaXMuX2Fzc2lnbmVkW3JdJiZ0aGlzLl9hZGRUb0NsdXN0ZXIocix0KX19LGUucHJvdG90eXBlLl9hZGRUb0NsdXN0ZXI9ZnVuY3Rpb24odCxlKXt0aGlzLmNsdXN0ZXJzW2VdLnB1c2godCksdGhpcy5fYXNzaWduZWRbdF09MX0sZS5wcm90b3R5cGUuX3JlZ2lvblF1ZXJ5PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1bXSxuPTA7bjx0aGlzLl9kYXRhc2V0TGVuZ3RoO24rKyl7dGhpcy5kaXN0YW5jZSh0aGlzLmRhdGFzZXRbdF0sdGhpcy5kYXRhc2V0W25dKTx0aGlzLmVwc2lsb24mJmUucHVzaChuKX1yZXR1cm4gZX0sZS5wcm90b3R5cGUuX21lcmdlQXJyYXlzPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPWUubGVuZ3RoLHI9MDtyPG47cisrKXt2YXIgaT1lW3JdO3QuaW5kZXhPZihpKTwwJiZ0LnB1c2goaSl9cmV0dXJuIHR9LGUucHJvdG90eXBlLl9ldWNsaWRlYW5EaXN0YW5jZT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0wLHI9TWF0aC5taW4odC5sZW5ndGgsZS5sZW5ndGgpO3ItLTspbis9KHRbcl0tZVtyXSkqKHRbcl0tZVtyXSk7cmV0dXJuIE1hdGguc3FydChuKX0sdC5leHBvcnRzJiYodC5leHBvcnRzPWUpfSkpLHZyPUplKChmdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQsZSxuKXt0aGlzLms9Myx0aGlzLmRhdGFzZXQ9W10sdGhpcy5hc3NpZ25tZW50cz1bXSx0aGlzLmNlbnRyb2lkcz1bXSx0aGlzLmluaXQodCxlLG4pfWUucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24odCxlLG4pe3RoaXMuYXNzaWdubWVudHM9W10sdGhpcy5jZW50cm9pZHM9W10sdm9pZCAwIT09dCYmKHRoaXMuZGF0YXNldD10KSx2b2lkIDAhPT1lJiYodGhpcy5rPWUpLHZvaWQgMCE9PW4mJih0aGlzLmRpc3RhbmNlPW4pfSxlLnByb3RvdHlwZS5ydW49ZnVuY3Rpb24odCxlKXt0aGlzLmluaXQodCxlKTtmb3IodmFyIG49dGhpcy5kYXRhc2V0Lmxlbmd0aCxyPTA7cjx0aGlzLms7cisrKXRoaXMuY2VudHJvaWRzW3JdPXRoaXMucmFuZG9tQ2VudHJvaWQoKTtmb3IodmFyIGk9ITA7aTspe2k9dGhpcy5hc3NpZ24oKTtmb3IodmFyIG89MDtvPHRoaXMuaztvKyspe2Zvcih2YXIgcz1uZXcgQXJyYXkobCksYT0wLHU9MDt1PGw7dSsrKXNbdV09MDtmb3IodmFyIGM9MDtjPG47YysrKXt2YXIgbD10aGlzLmRhdGFzZXRbY10ubGVuZ3RoO2lmKG89PT10aGlzLmFzc2lnbm1lbnRzW2NdKXtmb3IodT0wO3U8bDt1Kyspc1t1XSs9dGhpcy5kYXRhc2V0W2NdW3VdO2ErK319aWYoYT4wKXtmb3IodT0wO3U8bDt1Kyspc1t1XS89YTt0aGlzLmNlbnRyb2lkc1tvXT1zfWVsc2UgdGhpcy5jZW50cm9pZHNbb109dGhpcy5yYW5kb21DZW50cm9pZCgpLGk9ITB9fXJldHVybiB0aGlzLmdldENsdXN0ZXJzKCl9LGUucHJvdG90eXBlLnJhbmRvbUNlbnRyb2lkPWZ1bmN0aW9uKCl7dmFyIHQsZSxuPXRoaXMuZGF0YXNldC5sZW5ndGgtMTtkb3tlPU1hdGgucm91bmQoTWF0aC5yYW5kb20oKSpuKSx0PXRoaXMuZGF0YXNldFtlXX13aGlsZSh0aGlzLmNlbnRyb2lkcy5pbmRleE9mKHQpPj0wKTtyZXR1cm4gdH0sZS5wcm90b3R5cGUuYXNzaWduPWZ1bmN0aW9uKCl7Zm9yKHZhciB0LGU9ITEsbj10aGlzLmRhdGFzZXQubGVuZ3RoLHI9MDtyPG47cisrKSh0PXRoaXMuYXJnbWluKHRoaXMuZGF0YXNldFtyXSx0aGlzLmNlbnRyb2lkcyx0aGlzLmRpc3RhbmNlKSkhPXRoaXMuYXNzaWdubWVudHNbcl0mJih0aGlzLmFzc2lnbm1lbnRzW3JdPXQsZT0hMCk7cmV0dXJuIGV9LGUucHJvdG90eXBlLmdldENsdXN0ZXJzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0LGU9bmV3IEFycmF5KHRoaXMuayksbj0wO248dGhpcy5hc3NpZ25tZW50cy5sZW5ndGg7bisrKXZvaWQgMD09PWVbdD10aGlzLmFzc2lnbm1lbnRzW25dXSYmKGVbdF09W10pLGVbdF0ucHVzaChuKTtyZXR1cm4gZX0sZS5wcm90b3R5cGUuYXJnbWluPWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHIsaT1OdW1iZXIuTUFYX1ZBTFVFLG89MCxzPWUubGVuZ3RoLGE9MDthPHM7YSsrKShyPW4odCxlW2FdKSk8aSYmKGk9cixvPWEpO3JldHVybiBvfSxlLnByb3RvdHlwZS5kaXN0YW5jZT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0wLHI9TWF0aC5taW4odC5sZW5ndGgsZS5sZW5ndGgpO3ItLTspe3ZhciBpPXRbcl0tZVtyXTtuKz1pKml9cmV0dXJuIE1hdGguc3FydChuKX0sdC5leHBvcnRzJiYodC5leHBvcnRzPWUpfSkpLF9yPUplKChmdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQsZSxuKXt0aGlzLl9xdWV1ZT1bXSx0aGlzLl9wcmlvcml0aWVzPVtdLHRoaXMuX3NvcnRpbmc9ImRlc2MiLHRoaXMuX2luaXQodCxlLG4pfWUucHJvdG90eXBlLmluc2VydD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10aGlzLl9xdWV1ZS5sZW5ndGgscj1uO3ItLTspe3ZhciBpPXRoaXMuX3ByaW9yaXRpZXNbcl07ImRlc2MiPT09dGhpcy5fc29ydGluZz9lPmkmJihuPXIpOmU8aSYmKG49cil9dGhpcy5faW5zZXJ0QXQodCxlLG4pfSxlLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuX3F1ZXVlLmxlbmd0aDtlLS07KXtpZih0PT09dGhpcy5fcXVldWVbZV0pe3RoaXMuX3F1ZXVlLnNwbGljZShlLDEpLHRoaXMuX3ByaW9yaXRpZXMuc3BsaWNlKGUsMSk7YnJlYWt9fX0sZS5wcm90b3R5cGUuZm9yRWFjaD1mdW5jdGlvbih0KXt0aGlzLl9xdWV1ZS5mb3JFYWNoKHQpfSxlLnByb3RvdHlwZS5nZXRFbGVtZW50cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9xdWV1ZX0sZS5wcm90b3R5cGUuZ2V0RWxlbWVudFByaW9yaXR5PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wcmlvcml0aWVzW3RdfSxlLnByb3RvdHlwZS5nZXRQcmlvcml0aWVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3ByaW9yaXRpZXN9LGUucHJvdG90eXBlLmdldEVsZW1lbnRzV2l0aFByaW9yaXRpZXM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9W10sZT0wLG49dGhpcy5fcXVldWUubGVuZ3RoO2U8bjtlKyspdC5wdXNoKFt0aGlzLl9xdWV1ZVtlXSx0aGlzLl9wcmlvcml0aWVzW2VdXSk7cmV0dXJuIHR9LGUucHJvdG90eXBlLl9pbml0PWZ1bmN0aW9uKHQsZSxuKXtpZih0JiZlKXtpZih0aGlzLl9xdWV1ZT1bXSx0aGlzLl9wcmlvcml0aWVzPVtdLHQubGVuZ3RoIT09ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJBcnJheXMgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aCIpO2Zvcih2YXIgcj0wO3I8dC5sZW5ndGg7cisrKXRoaXMuaW5zZXJ0KHRbcl0sZVtyXSl9biYmKHRoaXMuX3NvcnRpbmc9bil9LGUucHJvdG90eXBlLl9pbnNlcnRBdD1mdW5jdGlvbih0LGUsbil7dGhpcy5fcXVldWUubGVuZ3RoPT09bj8odGhpcy5fcXVldWUucHVzaCh0KSx0aGlzLl9wcmlvcml0aWVzLnB1c2goZSkpOih0aGlzLl9xdWV1ZS5zcGxpY2UobiwwLHQpLHRoaXMuX3ByaW9yaXRpZXMuc3BsaWNlKG4sMCxlKSl9LHQuZXhwb3J0cyYmKHQuZXhwb3J0cz1lKX0pKSx4cj1KZSgoZnVuY3Rpb24odCl7aWYodC5leHBvcnRzKXZhciBlPV9yO2Z1bmN0aW9uIG4odCxlLG4scil7dGhpcy5lcHNpbG9uPTEsdGhpcy5taW5QdHM9MSx0aGlzLmRpc3RhbmNlPXRoaXMuX2V1Y2xpZGVhbkRpc3RhbmNlLHRoaXMuX3JlYWNoYWJpbGl0eT1bXSx0aGlzLl9wcm9jZXNzZWQ9W10sdGhpcy5fY29yZURpc3RhbmNlPTAsdGhpcy5fb3JkZXJlZExpc3Q9W10sdGhpcy5faW5pdCh0LGUsbixyKX1uLnByb3RvdHlwZS5ydW49ZnVuY3Rpb24odCxuLHIsaSl7dGhpcy5faW5pdCh0LG4scixpKTtmb3IodmFyIG89MCxzPXRoaXMuZGF0YXNldC5sZW5ndGg7bzxzO28rKylpZigxIT09dGhpcy5fcHJvY2Vzc2VkW29dKXt0aGlzLl9wcm9jZXNzZWRbb109MSx0aGlzLmNsdXN0ZXJzLnB1c2goW29dKTt2YXIgYT10aGlzLmNsdXN0ZXJzLmxlbmd0aC0xO3RoaXMuX29yZGVyZWRMaXN0LnB1c2gobyk7dmFyIHU9bmV3IGUobnVsbCxudWxsLCJhc2MiKSxjPXRoaXMuX3JlZ2lvblF1ZXJ5KG8pO3ZvaWQgMCE9PXRoaXMuX2Rpc3RhbmNlVG9Db3JlKG8pJiYodGhpcy5fdXBkYXRlUXVldWUobyxjLHUpLHRoaXMuX2V4cGFuZENsdXN0ZXIoYSx1KSl9cmV0dXJuIHRoaXMuY2x1c3RlcnN9LG4ucHJvdG90eXBlLmdldFJlYWNoYWJpbGl0eVBsb3Q9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9W10sZT0wLG49dGhpcy5fb3JkZXJlZExpc3QubGVuZ3RoO2U8bjtlKyspe3ZhciByPXRoaXMuX29yZGVyZWRMaXN0W2VdLGk9dGhpcy5fcmVhY2hhYmlsaXR5W3JdO3QucHVzaChbcixpXSl9cmV0dXJuIHR9LG4ucHJvdG90eXBlLl9pbml0PWZ1bmN0aW9uKHQsZSxuLHIpe2lmKHQpe2lmKCEodCBpbnN0YW5jZW9mIEFycmF5KSl0aHJvdyBFcnJvcigiRGF0YXNldCBtdXN0IGJlIG9mIHR5cGUgYXJyYXksICIrdHlwZW9mIHQrIiBnaXZlbiIpO3RoaXMuZGF0YXNldD10LHRoaXMuY2x1c3RlcnM9W10sdGhpcy5fcmVhY2hhYmlsaXR5PW5ldyBBcnJheSh0aGlzLmRhdGFzZXQubGVuZ3RoKSx0aGlzLl9wcm9jZXNzZWQ9bmV3IEFycmF5KHRoaXMuZGF0YXNldC5sZW5ndGgpLHRoaXMuX2NvcmVEaXN0YW5jZT0wLHRoaXMuX29yZGVyZWRMaXN0PVtdfWUmJih0aGlzLmVwc2lsb249ZSksbiYmKHRoaXMubWluUHRzPW4pLHImJih0aGlzLmRpc3RhbmNlPXIpfSxuLnByb3RvdHlwZS5fdXBkYXRlUXVldWU9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXRoaXM7dGhpcy5fY29yZURpc3RhbmNlPXRoaXMuX2Rpc3RhbmNlVG9Db3JlKHQpLGUuZm9yRWFjaCgoZnVuY3Rpb24oZSl7aWYodm9pZCAwPT09ci5fcHJvY2Vzc2VkW2VdKXt2YXIgaT1yLmRpc3RhbmNlKHIuZGF0YXNldFt0XSxyLmRhdGFzZXRbZV0pLG89TWF0aC5tYXgoci5fY29yZURpc3RhbmNlLGkpO3ZvaWQgMD09PXIuX3JlYWNoYWJpbGl0eVtlXT8oci5fcmVhY2hhYmlsaXR5W2VdPW8sbi5pbnNlcnQoZSxvKSk6bzxyLl9yZWFjaGFiaWxpdHlbZV0mJihyLl9yZWFjaGFiaWxpdHlbZV09byxuLnJlbW92ZShlKSxuLmluc2VydChlLG8pKX19KSl9LG4ucHJvdG90eXBlLl9leHBhbmRDbHVzdGVyPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPWUuZ2V0RWxlbWVudHMoKSxyPTAsaT1uLmxlbmd0aDtyPGk7cisrKXt2YXIgbz1uW3JdO2lmKHZvaWQgMD09PXRoaXMuX3Byb2Nlc3NlZFtvXSl7dmFyIHM9dGhpcy5fcmVnaW9uUXVlcnkobyk7dGhpcy5fcHJvY2Vzc2VkW29dPTEsdGhpcy5jbHVzdGVyc1t0XS5wdXNoKG8pLHRoaXMuX29yZGVyZWRMaXN0LnB1c2gobyksdm9pZCAwIT09dGhpcy5fZGlzdGFuY2VUb0NvcmUobykmJih0aGlzLl91cGRhdGVRdWV1ZShvLHMsZSksdGhpcy5fZXhwYW5kQ2x1c3Rlcih0LGUpKX19fSxuLnByb3RvdHlwZS5fZGlzdGFuY2VUb0NvcmU9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuZXBzaWxvbixuPTA7bjxlO24rKyl7aWYodGhpcy5fcmVnaW9uUXVlcnkodCxuKS5sZW5ndGg+PXRoaXMubWluUHRzKXJldHVybiBufX0sbi5wcm90b3R5cGUuX3JlZ2lvblF1ZXJ5PWZ1bmN0aW9uKHQsZSl7ZT1lfHx0aGlzLmVwc2lsb247Zm9yKHZhciBuPVtdLHI9MCxpPXRoaXMuZGF0YXNldC5sZW5ndGg7cjxpO3IrKyl0aGlzLmRpc3RhbmNlKHRoaXMuZGF0YXNldFt0XSx0aGlzLmRhdGFzZXRbcl0pPGUmJm4ucHVzaChyKTtyZXR1cm4gbn0sbi5wcm90b3R5cGUuX2V1Y2xpZGVhbkRpc3RhbmNlPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPTAscj1NYXRoLm1pbih0Lmxlbmd0aCxlLmxlbmd0aCk7ci0tOyluKz0odFtyXS1lW3JdKSoodFtyXS1lW3JdKTtyZXR1cm4gTWF0aC5zcXJ0KG4pfSx0LmV4cG9ydHMmJih0LmV4cG9ydHM9bil9KSksd3I9SmUoKGZ1bmN0aW9uKHQpe3QuZXhwb3J0cyYmKHQuZXhwb3J0cz17REJTQ0FOOm1yLEtNRUFOUzp2cixPUFRJQ1M6eHIsUHJpb3JpdHlRdWV1ZTpfcn0pfSkpO2Z1bmN0aW9uIGJyKCl7dGhpcy5fPW51bGx9ZnVuY3Rpb24gRHIodCl7dC5VPXQuQz10Lkw9dC5SPXQuUD10Lk49bnVsbH1mdW5jdGlvbiBFcih0LGUpe3ZhciBuPWUscj1lLlIsaT1uLlU7aT9pLkw9PT1uP2kuTD1yOmkuUj1yOnQuXz1yLHIuVT1pLG4uVT1yLG4uUj1yLkwsbi5SJiYobi5SLlU9biksci5MPW59ZnVuY3Rpb24gQ3IodCxlKXt2YXIgbj1lLHI9ZS5MLGk9bi5VO2k/aS5MPT09bj9pLkw9cjppLlI9cjp0Ll89cixyLlU9aSxuLlU9cixuLkw9ci5SLG4uTCYmKG4uTC5VPW4pLHIuUj1ufWZ1bmN0aW9uIFNyKHQpe2Zvcig7dC5MOyl0PXQuTDtyZXR1cm4gdH1mdW5jdGlvbiBBcih0LGUsbixyKXt2YXIgaT1bbnVsbCxudWxsXSxvPUpyLnB1c2goaSktMTtyZXR1cm4gaS5sZWZ0PXQsaS5yaWdodD1lLG4mJklyKGksdCxlLG4pLHImJklyKGksZSx0LHIpLFpyW3QuaW5kZXhdLmhhbGZlZGdlcy5wdXNoKG8pLFpyW2UuaW5kZXhdLmhhbGZlZGdlcy5wdXNoKG8pLGl9ZnVuY3Rpb24gTnIodCxlLG4pe3ZhciByPVtlLG5dO3JldHVybiByLmxlZnQ9dCxyfWZ1bmN0aW9uIElyKHQsZSxuLHIpe3RbMF18fHRbMV0/dC5sZWZ0PT09bj90WzFdPXI6dFswXT1yOih0WzBdPXIsdC5sZWZ0PWUsdC5yaWdodD1uKX1mdW5jdGlvbiBNcih0LGUsbixyLGkpe3ZhciBvLHM9dFswXSxhPXRbMV0sdT1zWzBdLGM9c1sxXSxsPTAsaD0xLGY9YVswXS11LHA9YVsxXS1jO2lmKG89ZS11LGZ8fCEobz4wKSl7aWYoby89ZixmPDApe2lmKG88bClyZXR1cm47bzxoJiYoaD1vKX1lbHNlIGlmKGY+MCl7aWYobz5oKXJldHVybjtvPmwmJihsPW8pfWlmKG89ci11LGZ8fCEobzwwKSl7aWYoby89ZixmPDApe2lmKG8+aClyZXR1cm47bz5sJiYobD1vKX1lbHNlIGlmKGY+MCl7aWYobzxsKXJldHVybjtvPGgmJihoPW8pfWlmKG89bi1jLHB8fCEobz4wKSl7aWYoby89cCxwPDApe2lmKG88bClyZXR1cm47bzxoJiYoaD1vKX1lbHNlIGlmKHA+MCl7aWYobz5oKXJldHVybjtvPmwmJihsPW8pfWlmKG89aS1jLHB8fCEobzwwKSl7aWYoby89cCxwPDApe2lmKG8+aClyZXR1cm47bz5sJiYobD1vKX1lbHNlIGlmKHA+MCl7aWYobzxsKXJldHVybjtvPGgmJihoPW8pfXJldHVybiEobD4wKSYmIShoPDEpfHwobD4wJiYodFswXT1bdStsKmYsYytsKnBdKSxoPDEmJih0WzFdPVt1K2gqZixjK2gqcF0pKSwhMH19fX19ZnVuY3Rpb24gRnIodCxlLG4scixpKXt2YXIgbz10WzFdO2lmKG8pcmV0dXJuITA7dmFyIHMsYSx1PXRbMF0sYz10LmxlZnQsbD10LnJpZ2h0LGg9Y1swXSxmPWNbMV0scD1sWzBdLGQ9bFsxXSxnPShoK3ApLzIseT0oZitkKS8yO2lmKGQ9PT1mKXtpZihnPGV8fGc+PXIpcmV0dXJuO2lmKGg+cCl7aWYodSl7aWYodVsxXT49aSlyZXR1cm59ZWxzZSB1PVtnLG5dO289W2csaV19ZWxzZXtpZih1KXtpZih1WzFdPG4pcmV0dXJufWVsc2UgdT1bZyxpXTtvPVtnLG5dfX1lbHNlIGlmKGE9eS0ocz0oaC1wKS8oZC1mKSkqZyxzPC0xfHxzPjEpaWYoaD5wKXtpZih1KXtpZih1WzFdPj1pKXJldHVybn1lbHNlIHU9WyhuLWEpL3Msbl07bz1bKGktYSkvcyxpXX1lbHNle2lmKHUpe2lmKHVbMV08bilyZXR1cm59ZWxzZSB1PVsoaS1hKS9zLGldO289WyhuLWEpL3Msbl19ZWxzZSBpZihmPGQpe2lmKHUpe2lmKHVbMF0+PXIpcmV0dXJufWVsc2UgdT1bZSxzKmUrYV07bz1bcixzKnIrYV19ZWxzZXtpZih1KXtpZih1WzBdPGUpcmV0dXJufWVsc2UgdT1bcixzKnIrYV07bz1bZSxzKmUrYV19cmV0dXJuIHRbMF09dSx0WzFdPW8sITB9ZnVuY3Rpb24gVHIodCxlKXt2YXIgbj10LnNpdGUscj1lLmxlZnQsaT1lLnJpZ2h0O3JldHVybiBuPT09aSYmKGk9cixyPW4pLGk/TWF0aC5hdGFuMihpWzFdLXJbMV0saVswXS1yWzBdKToobj09PXI/KHI9ZVsxXSxpPWVbMF0pOihyPWVbMF0saT1lWzFdKSxNYXRoLmF0YW4yKHJbMF0taVswXSxpWzFdLXJbMV0pKX1mdW5jdGlvbiBPcih0LGUpe3JldHVybiBlWysoZS5sZWZ0IT09dC5zaXRlKV19ZnVuY3Rpb24gTHIodCxlKXtyZXR1cm4gZVsrKGUubGVmdD09PXQuc2l0ZSldfXdyLkRCU0NBTix3ci5LTUVBTlMsd3IuT1BUSUNTLHdyLlByaW9yaXR5UXVldWUsYnIucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpicixpbnNlcnQ6ZnVuY3Rpb24odCxlKXt2YXIgbixyLGk7aWYodCl7aWYoZS5QPXQsZS5OPXQuTix0Lk4mJih0Lk4uUD1lKSx0Lk49ZSx0LlIpe2Zvcih0PXQuUjt0Lkw7KXQ9dC5MO3QuTD1lfWVsc2UgdC5SPWU7bj10fWVsc2UgdGhpcy5fPyh0PVNyKHRoaXMuXyksZS5QPW51bGwsZS5OPXQsdC5QPXQuTD1lLG49dCk6KGUuUD1lLk49bnVsbCx0aGlzLl89ZSxuPW51bGwpO2ZvcihlLkw9ZS5SPW51bGwsZS5VPW4sZS5DPSEwLHQ9ZTtuJiZuLkM7KW49PT0ocj1uLlUpLkw/KGk9ci5SKSYmaS5DPyhuLkM9aS5DPSExLHIuQz0hMCx0PXIpOih0PT09bi5SJiYoRXIodGhpcyxuKSxuPSh0PW4pLlUpLG4uQz0hMSxyLkM9ITAsQ3IodGhpcyxyKSk6KGk9ci5MKSYmaS5DPyhuLkM9aS5DPSExLHIuQz0hMCx0PXIpOih0PT09bi5MJiYoQ3IodGhpcyxuKSxuPSh0PW4pLlUpLG4uQz0hMSxyLkM9ITAsRXIodGhpcyxyKSksbj10LlU7dGhpcy5fLkM9ITF9LHJlbW92ZTpmdW5jdGlvbih0KXt0Lk4mJih0Lk4uUD10LlApLHQuUCYmKHQuUC5OPXQuTiksdC5OPXQuUD1udWxsO3ZhciBlLG4scixpPXQuVSxvPXQuTCxzPXQuUjtpZihuPW8/cz9TcihzKTpvOnMsaT9pLkw9PT10P2kuTD1uOmkuUj1uOnRoaXMuXz1uLG8mJnM/KHI9bi5DLG4uQz10LkMsbi5MPW8sby5VPW4sbiE9PXM/KGk9bi5VLG4uVT10LlUsdD1uLlIsaS5MPXQsbi5SPXMscy5VPW4pOihuLlU9aSxpPW4sdD1uLlIpKToocj10LkMsdD1uKSx0JiYodC5VPWkpLCFyKXtpZih0JiZ0LkMpcmV0dXJuIHZvaWQodC5DPSExKTtkb3tpZih0PT09dGhpcy5fKWJyZWFrO2lmKHQ9PT1pLkwpe2lmKChlPWkuUikuQyYmKGUuQz0hMSxpLkM9ITAsRXIodGhpcyxpKSxlPWkuUiksZS5MJiZlLkwuQ3x8ZS5SJiZlLlIuQyl7KCFlLlJ8fCFlLlIuQykmJihlLkwuQz0hMSxlLkM9ITAsQ3IodGhpcyxlKSxlPWkuUiksZS5DPWkuQyxpLkM9ZS5SLkM9ITEsRXIodGhpcyxpKSx0PXRoaXMuXzticmVha319ZWxzZSBpZigoZT1pLkwpLkMmJihlLkM9ITEsaS5DPSEwLENyKHRoaXMsaSksZT1pLkwpLGUuTCYmZS5MLkN8fGUuUiYmZS5SLkMpeyghZS5MfHwhZS5MLkMpJiYoZS5SLkM9ITEsZS5DPSEwLEVyKHRoaXMsZSksZT1pLkwpLGUuQz1pLkMsaS5DPWUuTC5DPSExLENyKHRoaXMsaSksdD10aGlzLl87YnJlYWt9ZS5DPSEwLHQ9aSxpPWkuVX13aGlsZSghdC5DKTt0JiYodC5DPSExKX19fTt2YXIgUHIsUnI9W107ZnVuY3Rpb24gQnIoKXtEcih0aGlzKSx0aGlzLng9dGhpcy55PXRoaXMuYXJjPXRoaXMuc2l0ZT10aGlzLmN5PW51bGx9ZnVuY3Rpb24ga3IodCl7dmFyIGU9dC5QLG49dC5OO2lmKGUmJm4pe3ZhciByPWUuc2l0ZSxpPXQuc2l0ZSxvPW4uc2l0ZTtpZihyIT09byl7dmFyIHM9aVswXSxhPWlbMV0sdT1yWzBdLXMsYz1yWzFdLWEsbD1vWzBdLXMsaD1vWzFdLWEsZj0yKih1KmgtYypsKTtpZighKGY+PS0kcikpe3ZhciBwPXUqdStjKmMsZD1sKmwraCpoLGc9KGgqcC1jKmQpL2YseT0odSpkLWwqcCkvZixtPVJyLnBvcCgpfHxuZXcgQnI7bS5hcmM9dCxtLnNpdGU9aSxtLng9ZytzLG0ueT0obS5jeT15K2EpK01hdGguc3FydChnKmcreSp5KSx0LmNpcmNsZT1tO2Zvcih2YXIgdj1udWxsLF89S3IuXztfOylpZihtLnk8Xy55fHxtLnk9PT1fLnkmJm0ueDw9Xy54KXtpZighXy5MKXt2PV8uUDticmVha31fPV8uTH1lbHNle2lmKCFfLlIpe3Y9XzticmVha31fPV8uUn1Lci5pbnNlcnQodixtKSx2fHwoUHI9bSl9fX19ZnVuY3Rpb24genIodCl7dmFyIGU9dC5jaXJjbGU7ZSYmKGUuUHx8KFByPWUuTiksS3IucmVtb3ZlKGUpLFJyLnB1c2goZSksRHIoZSksdC5jaXJjbGU9bnVsbCl9dmFyIGpyPVtdO2Z1bmN0aW9uIFVyKCl7RHIodGhpcyksdGhpcy5lZGdlPXRoaXMuc2l0ZT10aGlzLmNpcmNsZT1udWxsfWZ1bmN0aW9uIHFyKHQpe3ZhciBlPWpyLnBvcCgpfHxuZXcgVXI7cmV0dXJuIGUuc2l0ZT10LGV9ZnVuY3Rpb24gVnIodCl7enIodCksSHIucmVtb3ZlKHQpLGpyLnB1c2godCksRHIodCl9ZnVuY3Rpb24gR3IodCl7dmFyIGU9dC5jaXJjbGUsbj1lLngscj1lLmN5LGk9W24scl0sbz10LlAscz10Lk4sYT1bdF07VnIodCk7Zm9yKHZhciB1PW87dS5jaXJjbGUmJk1hdGguYWJzKG4tdS5jaXJjbGUueCk8UXImJk1hdGguYWJzKHItdS5jaXJjbGUuY3kpPFFyOylvPXUuUCxhLnVuc2hpZnQodSksVnIodSksdT1vO2EudW5zaGlmdCh1KSx6cih1KTtmb3IodmFyIGM9cztjLmNpcmNsZSYmTWF0aC5hYnMobi1jLmNpcmNsZS54KTxRciYmTWF0aC5hYnMoci1jLmNpcmNsZS5jeSk8UXI7KXM9Yy5OLGEucHVzaChjKSxWcihjKSxjPXM7YS5wdXNoKGMpLHpyKGMpO3ZhciBsLGg9YS5sZW5ndGg7Zm9yKGw9MTtsPGg7KytsKWM9YVtsXSx1PWFbbC0xXSxJcihjLmVkZ2UsdS5zaXRlLGMuc2l0ZSxpKTt1PWFbMF0sKGM9YVtoLTFdKS5lZGdlPUFyKHUuc2l0ZSxjLnNpdGUsbnVsbCxpKSxrcih1KSxrcihjKX1mdW5jdGlvbiBZcih0KXtmb3IodmFyIGUsbixyLGksbz10WzBdLHM9dFsxXSxhPUhyLl87YTspaWYoKHI9WHIoYSxzKS1vKT5RcilhPWEuTDtlbHNle2lmKCEoKGk9by1XcihhLHMpKT5Rcikpe3I+LVFyPyhlPWEuUCxuPWEpOmk+LVFyPyhlPWEsbj1hLk4pOmU9bj1hO2JyZWFrfWlmKCFhLlIpe2U9YTticmVha31hPWEuUn0hZnVuY3Rpb24odCl7WnJbdC5pbmRleF09e3NpdGU6dCxoYWxmZWRnZXM6W119fSh0KTt2YXIgdT1xcih0KTtpZihIci5pbnNlcnQoZSx1KSxlfHxuKXtpZihlPT09bilyZXR1cm4genIoZSksbj1xcihlLnNpdGUpLEhyLmluc2VydCh1LG4pLHUuZWRnZT1uLmVkZ2U9QXIoZS5zaXRlLHUuc2l0ZSksa3IoZSksdm9pZCBrcihuKTtpZighbilyZXR1cm4gdm9pZCh1LmVkZ2U9QXIoZS5zaXRlLHUuc2l0ZSkpO3pyKGUpLHpyKG4pO3ZhciBjPWUuc2l0ZSxsPWNbMF0saD1jWzFdLGY9dFswXS1sLHA9dFsxXS1oLGQ9bi5zaXRlLGc9ZFswXS1sLHk9ZFsxXS1oLG09MiooZip5LXAqZyksdj1mKmYrcCpwLF89ZypnK3kqeSx4PVsoeSp2LXAqXykvbStsLChmKl8tZyp2KS9tK2hdO0lyKG4uZWRnZSxjLGQseCksdS5lZGdlPUFyKGMsdCxudWxsLHgpLG4uZWRnZT1Bcih0LGQsbnVsbCx4KSxrcihlKSxrcihuKX19ZnVuY3Rpb24gWHIodCxlKXt2YXIgbj10LnNpdGUscj1uWzBdLGk9blsxXSxvPWktZTtpZighbylyZXR1cm4gcjt2YXIgcz10LlA7aWYoIXMpcmV0dXJuLTEvMDt2YXIgYT0obj1zLnNpdGUpWzBdLHU9blsxXSxjPXUtZTtpZighYylyZXR1cm4gYTt2YXIgbD1hLXIsaD0xL28tMS9jLGY9bC9jO3JldHVybiBoPygtZitNYXRoLnNxcnQoZipmLTIqaCoobCpsLygtMipjKS11K2MvMitpLW8vMikpKS9oK3I6KHIrYSkvMn1mdW5jdGlvbiBXcih0LGUpe3ZhciBuPXQuTjtpZihuKXJldHVybiBYcihuLGUpO3ZhciByPXQuc2l0ZTtyZXR1cm4gclsxXT09PWU/clswXToxLzB9dmFyIEhyLFpyLEtyLEpyLFFyPTFlLTYsJHI9MWUtMTI7ZnVuY3Rpb24gdGkodCxlLG4pe3JldHVybih0WzBdLW5bMF0pKihlWzFdLXRbMV0pLSh0WzBdLWVbMF0pKihuWzFdLXRbMV0pfWZ1bmN0aW9uIGVpKHQsZSl7cmV0dXJuIGVbMV0tdFsxXXx8ZVswXS10WzBdfWZ1bmN0aW9uIG5pKHQsZSl7dmFyIG4scixpLG89dC5zb3J0KGVpKS5wb3AoKTtmb3IoSnI9W10sWnI9bmV3IEFycmF5KHQubGVuZ3RoKSxIcj1uZXcgYnIsS3I9bmV3IGJyOzspaWYoaT1QcixvJiYoIWl8fG9bMV08aS55fHxvWzFdPT09aS55JiZvWzBdPGkueCkpKG9bMF0hPT1ufHxvWzFdIT09cikmJihZcihvKSxuPW9bMF0scj1vWzFdKSxvPXQucG9wKCk7ZWxzZXtpZighaSlicmVhaztHcihpLmFyYyl9aWYoZnVuY3Rpb24oKXtmb3IodmFyIHQsZSxuLHIsaT0wLG89WnIubGVuZ3RoO2k8bzsrK2kpaWYoKHQ9WnJbaV0pJiYocj0oZT10LmhhbGZlZGdlcykubGVuZ3RoKSl7dmFyIHM9bmV3IEFycmF5KHIpLGE9bmV3IEFycmF5KHIpO2ZvcihuPTA7bjxyOysrbilzW25dPW4sYVtuXT1Ucih0LEpyW2Vbbl1dKTtmb3Iocy5zb3J0KChmdW5jdGlvbih0LGUpe3JldHVybiBhW2VdLWFbdF19KSksbj0wO248cjsrK24pYVtuXT1lW3Nbbl1dO2ZvcihuPTA7bjxyOysrbillW25dPWFbbl19fSgpLGUpe3ZhciBzPStlWzBdWzBdLGE9K2VbMF1bMV0sdT0rZVsxXVswXSxjPStlWzFdWzFdOyhmdW5jdGlvbih0LGUsbixyKXtmb3IodmFyIGksbz1Kci5sZW5ndGg7by0tOylGcihpPUpyW29dLHQsZSxuLHIpJiZNcihpLHQsZSxuLHIpJiYoTWF0aC5hYnMoaVswXVswXS1pWzFdWzBdKT5Rcnx8TWF0aC5hYnMoaVswXVsxXS1pWzFdWzFdKT5Rcil8fGRlbGV0ZSBKcltvXX0pKHMsYSx1LGMpLGZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpLG8scyxhLHUsYyxsLGgsZixwLGQsZyx5PVpyLmxlbmd0aCxtPSEwO2ZvcihpPTA7aTx5OysraSlpZihvPVpyW2ldKXtmb3Iocz1vLnNpdGUsYT0odT1vLmhhbGZlZGdlcykubGVuZ3RoO2EtLTspSnJbdVthXV18fHUuc3BsaWNlKGEsMSk7Zm9yKGE9MCxjPXUubGVuZ3RoO2E8YzspZD0ocD1McihvLEpyW3VbYV1dKSlbMF0sZz1wWzFdLGg9KGw9T3IobyxKclt1WysrYSVjXV0pKVswXSxmPWxbMV0sKE1hdGguYWJzKGQtaCk+UXJ8fE1hdGguYWJzKGctZik+UXIpJiYodS5zcGxpY2UoYSwwLEpyLnB1c2goTnIocyxwLE1hdGguYWJzKGQtdCk8UXImJnItZz5Rcj9bdCxNYXRoLmFicyhoLXQpPFFyP2Y6cl06TWF0aC5hYnMoZy1yKTxRciYmbi1kPlFyP1tNYXRoLmFicyhmLXIpPFFyP2g6bixyXTpNYXRoLmFicyhkLW4pPFFyJiZnLWU+UXI/W24sTWF0aC5hYnMoaC1uKTxRcj9mOmVdOk1hdGguYWJzKGctZSk8UXImJmQtdD5Rcj9bTWF0aC5hYnMoZi1lKTxRcj9oOnQsZV06bnVsbCkpLTEpLCsrYyk7YyYmKG09ITEpfWlmKG0pe3ZhciB2LF8seCx3PTEvMDtmb3IoaT0wLG09bnVsbDtpPHk7KytpKShvPVpyW2ldKSYmKHg9KHY9KHM9by5zaXRlKVswXS10KSp2KyhfPXNbMV0tZSkqXyk8dyYmKHc9eCxtPW8pO2lmKG0pe3ZhciBiPVt0LGVdLEQ9W3Qscl0sRT1bbixyXSxDPVtuLGVdO20uaGFsZmVkZ2VzLnB1c2goSnIucHVzaChOcihzPW0uc2l0ZSxiLEQpKS0xLEpyLnB1c2goTnIocyxELEUpKS0xLEpyLnB1c2goTnIocyxFLEMpKS0xLEpyLnB1c2goTnIocyxDLGIpKS0xKX19Zm9yKGk9MDtpPHk7KytpKShvPVpyW2ldKSYmKG8uaGFsZmVkZ2VzLmxlbmd0aHx8ZGVsZXRlIFpyW2ldKX0ocyxhLHUsYyl9dGhpcy5lZGdlcz1Kcix0aGlzLmNlbGxzPVpyLEhyPUtyPUpyPVpyPW51bGx9ZnVuY3Rpb24gcmkodCl7aWYodmUodCkmJih0PXQuYmJveCksdCYmIUFycmF5LmlzQXJyYXkodCkpdGhyb3cgbmV3IEVycm9yKCJiYm94IGlzIGludmFsaWQiKTtyZXR1cm4gdD9mdW5jdGlvbih0KXtyZXR1cm5bTWF0aC5yYW5kb20oKSoodFsyXS10WzBdKSt0WzBdLE1hdGgucmFuZG9tKCkqKHRbM10tdFsxXSkrdFsxXV19KHQpOlszNjAqb2koKSwxODAqb2koKV19ZnVuY3Rpb24gaWkodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybltlWzBdK3RbMF0sZVsxXSt0WzFdXX19ZnVuY3Rpb24gb2koKXtyZXR1cm4gTWF0aC5yYW5kb20oKS0uNX1mdW5jdGlvbiBzaSh0LGUsbil7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJnZW9qc29uIGlzIHJlcXVpcmVkIik7aWYoIkZlYXR1cmVDb2xsZWN0aW9uIiE9PXQudHlwZSl0aHJvdyBuZXcgRXJyb3IoImdlb2pzb24gbXVzdCBiZSBhIEZlYXR1cmVDb2xsZWN0aW9uIik7aWYobnVsbD09ZSl0aHJvdyBuZXcgRXJyb3IoInByb3BlcnR5IGlzIHJlcXVpcmVkIik7Zm9yKHZhciByPWFpKHQsZSksaT1PYmplY3Qua2V5cyhyKSxvPTA7bzxpLmxlbmd0aDtvKyspe2Zvcih2YXIgcz1pW29dLGE9cltzXSx1PVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl1LnB1c2godC5mZWF0dXJlc1thW2NdXSk7bihsZSh1KSxzLG8pfX1mdW5jdGlvbiBhaSh0LGUpe3ZhciBuPXt9O3JldHVybiBFZSh0LChmdW5jdGlvbih0LHIpe3ZhciBpPXQucHJvcGVydGllc3x8e307aWYoaS5oYXNPd25Qcm9wZXJ0eShlKSl7dmFyIG89aVtlXTtuLmhhc093blByb3BlcnR5KG8pP25bb10ucHVzaChyKTpuW29dPVtyXX19KSksbn1mdW5jdGlvbiB1aSh0LGUpe2lmKHZvaWQgMD09PXQpcmV0dXJuITE7dmFyIG49dHlwZW9mIGU7aWYoIm51bWJlciI9PT1ufHwic3RyaW5nIj09PW4pcmV0dXJuIHQuaGFzT3duUHJvcGVydHkoZSk7aWYoQXJyYXkuaXNBcnJheShlKSl7Zm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKyspaWYoIXVpKHQsZVtyXSkpcmV0dXJuITE7cmV0dXJuITB9cmV0dXJuIGNpKHQsZSl9ZnVuY3Rpb24gY2kodCxlKXtmb3IodmFyIG49T2JqZWN0LmtleXMoZSkscj0wO3I8bi5sZW5ndGg7cisrKXt2YXIgaT1uW3JdO2lmKHRbaV0hPT1lW2ldKXJldHVybiExfXJldHVybiEwfW5pLnByb3RvdHlwZT17Y29uc3RydWN0b3I6bmkscG9seWdvbnM6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmVkZ2VzO3JldHVybiB0aGlzLmNlbGxzLm1hcCgoZnVuY3Rpb24oZSl7dmFyIG49ZS5oYWxmZWRnZXMubWFwKChmdW5jdGlvbihuKXtyZXR1cm4gT3IoZSx0W25dKX0pKTtyZXR1cm4gbi5kYXRhPWUuc2l0ZS5kYXRhLG59KSl9LHRyaWFuZ2xlczpmdW5jdGlvbigpe3ZhciB0PVtdLGU9dGhpcy5lZGdlcztyZXR1cm4gdGhpcy5jZWxscy5mb3JFYWNoKChmdW5jdGlvbihuLHIpe2lmKG89KGk9bi5oYWxmZWRnZXMpLmxlbmd0aClmb3IodmFyIGksbyxzLGE9bi5zaXRlLHU9LTEsYz1lW2lbby0xXV0sbD1jLmxlZnQ9PT1hP2MucmlnaHQ6Yy5sZWZ0OysrdTxvOylzPWwsbD0oYz1lW2lbdV1dKS5sZWZ0PT09YT9jLnJpZ2h0OmMubGVmdCxzJiZsJiZyPHMuaW5kZXgmJnI8bC5pbmRleCYmdGkoYSxzLGwpPDAmJnQucHVzaChbYS5kYXRhLHMuZGF0YSxsLmRhdGFdKX0pKSx0fSxsaW5rczpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVkZ2VzLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIHQucmlnaHR9KSkubWFwKChmdW5jdGlvbih0KXtyZXR1cm57c291cmNlOnQubGVmdC5kYXRhLHRhcmdldDp0LnJpZ2h0LmRhdGF9fSkpfSxmaW5kOmZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHIsaSxvPXRoaXMscz1vLl9mb3VuZHx8MCxhPW8uY2VsbHMubGVuZ3RoOyEoaT1vLmNlbGxzW3NdKTspaWYoKytzPj1hKXJldHVybiBudWxsO3ZhciB1PXQtaS5zaXRlWzBdLGM9ZS1pLnNpdGVbMV0sbD11KnUrYypjO2Rve2k9by5jZWxsc1tyPXNdLHM9bnVsbCxpLmhhbGZlZGdlcy5mb3JFYWNoKChmdW5jdGlvbihuKXt2YXIgcj1vLmVkZ2VzW25dLGE9ci5sZWZ0O2lmKGEhPT1pLnNpdGUmJmF8fChhPXIucmlnaHQpKXt2YXIgdT10LWFbMF0sYz1lLWFbMV0saD11KnUrYypjO2g8bCYmKGw9aCxzPWEuaW5kZXgpfX0pKX13aGlsZShudWxsIT09cyk7cmV0dXJuIG8uX2ZvdW5kPXIsbnVsbD09bnx8bDw9bipuP2kuc2l0ZTpudWxsfX0sT2JqZWN0LmZyZWV6ZSh7cmFuZG9tUG9zaXRpb246cmkscmFuZG9tUG9pbnQ6ZnVuY3Rpb24odCxlKXtpZighdmUoZT1lfHx7fSkpdGhyb3cgbmV3IEVycm9yKCJvcHRpb25zIGlzIGludmFsaWQiKTt2YXIgbj1lLmJib3g7bnVsbD09dCYmKHQ9MSk7Zm9yKHZhciByPVtdLGk9MDtpPHQ7aSsrKXIucHVzaChhZShyaShuKSkpO3JldHVybiBsZShyKX0scmFuZG9tUG9seWdvbjpmdW5jdGlvbih0LGUpe2lmKCF2ZShlPWV8fHt9KSl0aHJvdyBuZXcgRXJyb3IoIm9wdGlvbnMgaXMgaW52YWxpZCIpO3ZhciBuPWUuYmJveCxyPWUubnVtX3ZlcnRpY2VzLGk9ZS5tYXhfcmFkaWFsX2xlbmd0aDtudWxsPT10JiYodD0xKSxtZShyKXx8KHI9MTApLG1lKGkpfHwoaT0xMCk7Zm9yKHZhciBvPVtdLHM9MDtzPHQ7cysrKXt2YXIgYT1bXSx1PUFycmF5LmFwcGx5KG51bGwsbmV3IEFycmF5KHIrMSkpLm1hcChNYXRoLnJhbmRvbSk7dS5mb3JFYWNoKGMpLHUuZm9yRWFjaChsKSxhW2EubGVuZ3RoLTFdPWFbMF0sYT1hLm1hcChpaShyaShuKSkpLG8ucHVzaCh1ZShbYV0pKX1mdW5jdGlvbiBjKHQsZSxuKXtuW2VdPWU+MD90K25bZS0xXTp0fWZ1bmN0aW9uIGwodCl7dD0yKnQqTWF0aC5QSS91W3UubGVuZ3RoLTFdO3ZhciBlPU1hdGgucmFuZG9tKCk7YS5wdXNoKFtlKmkqTWF0aC5zaW4odCksZSppKk1hdGguY29zKHQpXSl9cmV0dXJuIGxlKG8pfSxyYW5kb21MaW5lU3RyaW5nOmZ1bmN0aW9uKHQsZSl7aWYoIXZlKGU9ZXx8e30pKXRocm93IG5ldyBFcnJvcigib3B0aW9ucyBpcyBpbnZhbGlkIik7dmFyIG49ZS5iYm94LHI9ZS5udW1fdmVydGljZXMsaT1lLm1heF9sZW5ndGgsbz1lLm1heF9yb3RhdGlvbjtudWxsPT10JiYodD0xKSwoIW1lKHIpfHxyPDIpJiYocj0xMCksbWUoaSl8fChpPTFlLTQpLG1lKG8pfHwobz1NYXRoLlBJLzgpO2Zvcih2YXIgcz1bXSxhPTA7YTx0O2ErKyl7Zm9yKHZhciB1PVtyaShuKV0sYz0wO2M8ci0xO2MrKyl7dmFyIGw9KDA9PT1jPzIqTWF0aC5yYW5kb20oKSpNYXRoLlBJOk1hdGgudGFuKCh1W2NdWzFdLXVbYy0xXVsxXSkvKHVbY11bMF0tdVtjLTFdWzBdKSkpKyhNYXRoLnJhbmRvbSgpLS41KSpvKjIsaD1NYXRoLnJhbmRvbSgpKmk7dS5wdXNoKFt1W2NdWzBdK2gqTWF0aC5jb3MobCksdVtjXVsxXStoKk1hdGguc2luKGwpXSl9cy5wdXNoKGNlKHUpKX1yZXR1cm4gbGUocyl9fSksT2JqZWN0LmZyZWV6ZSh7Z2V0Q2x1c3RlcjpmdW5jdGlvbih0LGUpe2lmKCF0KXRocm93IG5ldyBFcnJvcigiZ2VvanNvbiBpcyByZXF1aXJlZCIpO2lmKCJGZWF0dXJlQ29sbGVjdGlvbiIhPT10LnR5cGUpdGhyb3cgbmV3IEVycm9yKCJnZW9qc29uIG11c3QgYmUgYSBGZWF0dXJlQ29sbGVjdGlvbiIpO2lmKG51bGw9PWUpdGhyb3cgbmV3IEVycm9yKCJmaWx0ZXIgaXMgcmVxdWlyZWQiKTt2YXIgbj1bXTtyZXR1cm4gRWUodCwoZnVuY3Rpb24odCl7dWkodC5wcm9wZXJ0aWVzLGUpJiZuLnB1c2godCl9KSksbGUobil9LGNsdXN0ZXJFYWNoOnNpLGNsdXN0ZXJSZWR1Y2U6ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9cjtyZXR1cm4gc2kodCxlLChmdW5jdGlvbih0LGUsbyl7aT0wPT09byYmdm9pZCAwPT09cj90Om4oaSx0LGUsbyl9KSksaX0sY3JlYXRlQmluczphaSxhcHBseUZpbHRlcjp1aSxwcm9wZXJ0aWVzQ29udGFpbnNGaWx0ZXI6Y2ksZmlsdGVyUHJvcGVydGllczpmdW5jdGlvbih0LGUpe2lmKCFlKXJldHVybnt9O2lmKCFlLmxlbmd0aClyZXR1cm57fTtmb3IodmFyIG49e30scj0wO3I8ZS5sZW5ndGg7cisrKXt2YXIgaT1lW3JdO3QuaGFzT3duUHJvcGVydHkoaSkmJihuW2ldPXRbaV0pfXJldHVybiBufX0pLCJmaWxsImluIEFycmF5LnByb3RvdHlwZXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KEFycmF5LnByb3RvdHlwZSwiZmlsbCIse2NvbmZpZ3VyYWJsZTohMCx2YWx1ZTpmdW5jdGlvbih0KXtpZihudWxsPT10aGlzKXRocm93IG5ldyBUeXBlRXJyb3IodGhpcysiIGlzIG5vdCBhbiBvYmplY3QiKTt2YXIgZT1PYmplY3QodGhpcyksbj1NYXRoLm1heChNYXRoLm1pbihlLmxlbmd0aCw5MDA3MTk5MjU0NzQwOTkxKSwwKXx8MCxyPTEgaW4gYXJndW1lbnRzJiZwYXJzZUludChOdW1iZXIoYXJndW1lbnRzWzFdKSwxMCl8fDA7cj1yPDA/TWF0aC5tYXgobityLDApOk1hdGgubWluKHIsbik7dmFyIGk9MiBpbiBhcmd1bWVudHMmJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9wYXJzZUludChOdW1iZXIoYXJndW1lbnRzWzJdKSwxMCl8fDA6bjtmb3IoaT1pPDA/TWF0aC5tYXgobithcmd1bWVudHNbMl0sMCk6TWF0aC5taW4oaSxuKTtyPGk7KWVbcl09dCwrK3I7cmV0dXJuIGV9LHdyaXRhYmxlOiEwfSksTnVtYmVyLmlzRmluaXRlPU51bWJlci5pc0Zpbml0ZXx8ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0JiZpc0Zpbml0ZSh0KX0sTnVtYmVyLmlzSW50ZWdlcj1OdW1iZXIuaXNJbnRlZ2VyfHxmdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQmJmlzRmluaXRlKHQpJiZNYXRoLmZsb29yKHQpPT09dH0sTnVtYmVyLnBhcnNlRmxvYXQ9TnVtYmVyLnBhcnNlRmxvYXR8fHBhcnNlRmxvYXQsTnVtYmVyLmlzTmFOPU51bWJlci5pc05hTnx8ZnVuY3Rpb24odCl7cmV0dXJuIHQhPXR9LE1hdGgudHJ1bmM9TWF0aC50cnVuY3x8ZnVuY3Rpb24odCl7cmV0dXJuIHQ8MD9NYXRoLmNlaWwodCk6TWF0aC5mbG9vcih0KX07dmFyIGxpPWZ1bmN0aW9uKCl7fTtsaS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sbGkucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGxpfSxsaS5wcm90b3R5cGUuZXF1YWxzV2l0aFRvbGVyYW5jZT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIE1hdGguYWJzKHQtZSk8PW59O3ZhciBoaT1mdW5jdGlvbigpe30sZmk9ZnVuY3Rpb24oKXt9LHBpPXtNQVhfVkFMVUU6e2NvbmZpZ3VyYWJsZTohMH19O2ZpLmlzTmFOPWZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIuaXNOYU4odCl9LGZpLmRvdWJsZVRvTG9uZ0JpdHM9ZnVuY3Rpb24odCl7cmV0dXJuIHR9LGZpLmxvbmdCaXRzVG9Eb3VibGU9ZnVuY3Rpb24odCl7cmV0dXJuIHR9LGZpLmlzSW5maW5pdGU9ZnVuY3Rpb24odCl7cmV0dXJuIU51bWJlci5pc0Zpbml0ZSh0KX0scGkuTUFYX1ZBTFVFLmdldD1mdW5jdGlvbigpe3JldHVybiBOdW1iZXIuTUFYX1ZBTFVFfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhmaSxwaSk7dmFyIGRpPWZ1bmN0aW9uKCl7fSxnaT1mdW5jdGlvbigpe30seWk9ZnVuY3Rpb24oKXt9O2Z1bmN0aW9uIG1pKCl7fXZhciB2aT1mdW5jdGlvbiB0KCl7aWYodGhpcy54PW51bGwsdGhpcy55PW51bGwsdGhpcy56PW51bGwsMD09PWFyZ3VtZW50cy5sZW5ndGgpdGhpcy54PTAsdGhpcy55PTAsdGhpcy56PXQuTlVMTF9PUkRJTkFURTtlbHNlIGlmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF07dGhpcy54PWUueCx0aGlzLnk9ZS55LHRoaXMuej1lLnp9ZWxzZSAyPT09YXJndW1lbnRzLmxlbmd0aD8odGhpcy54PWFyZ3VtZW50c1swXSx0aGlzLnk9YXJndW1lbnRzWzFdLHRoaXMuej10Lk5VTExfT1JESU5BVEUpOjM9PT1hcmd1bWVudHMubGVuZ3RoJiYodGhpcy54PWFyZ3VtZW50c1swXSx0aGlzLnk9YXJndW1lbnRzWzFdLHRoaXMuej1hcmd1bWVudHNbMl0pfSxfaT17RGltZW5zaW9uYWxDb21wYXJhdG9yOntjb25maWd1cmFibGU6ITB9LHNlcmlhbFZlcnNpb25VSUQ6e2NvbmZpZ3VyYWJsZTohMH0sTlVMTF9PUkRJTkFURTp7Y29uZmlndXJhYmxlOiEwfSxYOntjb25maWd1cmFibGU6ITB9LFk6e2NvbmZpZ3VyYWJsZTohMH0sWjp7Y29uZmlndXJhYmxlOiEwfX07dmkucHJvdG90eXBlLnNldE9yZGluYXRlPWZ1bmN0aW9uKHQsZSl7c3dpdGNoKHQpe2Nhc2UgdmkuWDp0aGlzLng9ZTticmVhaztjYXNlIHZpLlk6dGhpcy55PWU7YnJlYWs7Y2FzZSB2aS5aOnRoaXMuej1lO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IGhpfX0sdmkucHJvdG90eXBlLmVxdWFsczJEPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4hKHRoaXMueCE9PXQueHx8dGhpcy55IT09dC55KX1pZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO3JldHVybiEoIWxpLmVxdWFsc1dpdGhUb2xlcmFuY2UodGhpcy54LGUueCxuKXx8IWxpLmVxdWFsc1dpdGhUb2xlcmFuY2UodGhpcy55LGUueSxuKSl9fSx2aS5wcm90b3R5cGUuZ2V0T3JkaW5hdGU9ZnVuY3Rpb24odCl7c3dpdGNoKHQpe2Nhc2UgdmkuWDpyZXR1cm4gdGhpcy54O2Nhc2UgdmkuWTpyZXR1cm4gdGhpcy55O2Nhc2UgdmkuWjpyZXR1cm4gdGhpcy56fXRocm93IG5ldyBoaX0sdmkucHJvdG90eXBlLmVxdWFsczNEPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLng9PT10LngmJnRoaXMueT09PXQueSYmKHRoaXMuej09PXQuenx8ZmkuaXNOYU4odGhpcy56KSkmJmZpLmlzTmFOKHQueil9LHZpLnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24odCl7cmV0dXJuIHQgaW5zdGFuY2VvZiB2aSYmdGhpcy5lcXVhbHMyRCh0KX0sdmkucHJvdG90eXBlLmVxdWFsSW5aPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGxpLmVxdWFsc1dpdGhUb2xlcmFuY2UodGhpcy56LHQueixlKX0sdmkucHJvdG90eXBlLmNvbXBhcmVUbz1mdW5jdGlvbih0KXt2YXIgZT10O3JldHVybiB0aGlzLng8ZS54Py0xOnRoaXMueD5lLng/MTp0aGlzLnk8ZS55Py0xOnRoaXMueT5lLnk/MTowfSx2aS5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXt9LHZpLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB2aSh0aGlzKX0sdmkucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIigiK3RoaXMueCsiLCAiK3RoaXMueSsiLCAiK3RoaXMueisiKSJ9LHZpLnByb3RvdHlwZS5kaXN0YW5jZTNEPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMueC10Lngsbj10aGlzLnktdC55LHI9dGhpcy56LXQuejtyZXR1cm4gTWF0aC5zcXJ0KGUqZStuKm4rcipyKX0sdmkucHJvdG90eXBlLmRpc3RhbmNlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMueC10Lngsbj10aGlzLnktdC55O3JldHVybiBNYXRoLnNxcnQoZSplK24qbil9LHZpLnByb3RvdHlwZS5oYXNoQ29kZT1mdW5jdGlvbigpe3ZhciB0PTE3O3JldHVybiB0PTM3Kih0PTM3KnQrdmkuaGFzaENvZGUodGhpcy54KSkrdmkuaGFzaENvZGUodGhpcy55KX0sdmkucHJvdG90eXBlLnNldENvb3JkaW5hdGU9ZnVuY3Rpb24odCl7dGhpcy54PXQueCx0aGlzLnk9dC55LHRoaXMuej10Lnp9LHZpLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltkaSxnaSxtaV19LHZpLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiB2aX0sdmkuaGFzaENvZGU9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7ZmkuZG91YmxlVG9Mb25nQml0cyhhcmd1bWVudHNbMF0pO3JldHVybiBNYXRoLnRydW5jKDApfX0sX2kuRGltZW5zaW9uYWxDb21wYXJhdG9yLmdldD1mdW5jdGlvbigpe3JldHVybiB4aX0sX2kuc2VyaWFsVmVyc2lvblVJRC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMHg1Y2JmMmMyMzVjN2U1ODAwfSxfaS5OVUxMX09SRElOQVRFLmdldD1mdW5jdGlvbigpe3JldHVybiBmaS5OYU59LF9pLlguZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDB9LF9pLlkuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDF9LF9pLlouZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDJ9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHZpLF9pKTt2YXIgeGk9ZnVuY3Rpb24odCl7aWYodGhpcy5fZGltZW5zaW9uc1RvVGVzdD0yLDAhPT1hcmd1bWVudHMubGVuZ3RoJiYxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdO2lmKDIhPT1lJiYzIT09ZSl0aHJvdyBuZXcgaGk7dGhpcy5fZGltZW5zaW9uc1RvVGVzdD1lfX07eGkucHJvdG90eXBlLmNvbXBhcmU9ZnVuY3Rpb24odCxlKXt2YXIgbj10LHI9ZSxpPXhpLmNvbXBhcmUobi54LHIueCk7aWYoMCE9PWkpcmV0dXJuIGk7dmFyIG89eGkuY29tcGFyZShuLnksci55KTtyZXR1cm4gMCE9PW8/bzp0aGlzLl9kaW1lbnNpb25zVG9UZXN0PD0yPzA6eGkuY29tcGFyZShuLnosci56KX0seGkucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW3lpXX0seGkucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHhpfSx4aS5jb21wYXJlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ8ZT8tMTp0PmU/MTpmaS5pc05hTih0KT9maS5pc05hTihlKT8wOi0xOmZpLmlzTmFOKGUpPzE6MH07dmFyIHdpPWZ1bmN0aW9uKCl7fTt3aS5wcm90b3R5cGUuY3JlYXRlPWZ1bmN0aW9uKCl7fSx3aS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sd2kucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHdpfTt2YXIgYmk9ZnVuY3Rpb24oKXt9LERpPXtJTlRFUklPUjp7Y29uZmlndXJhYmxlOiEwfSxCT1VOREFSWTp7Y29uZmlndXJhYmxlOiEwfSxFWFRFUklPUjp7Y29uZmlndXJhYmxlOiEwfSxOT05FOntjb25maWd1cmFibGU6ITB9fTtiaS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sYmkucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGJpfSxiaS50b0xvY2F0aW9uU3ltYm9sPWZ1bmN0aW9uKHQpe3N3aXRjaCh0KXtjYXNlIGJpLkVYVEVSSU9SOnJldHVybiJlIjtjYXNlIGJpLkJPVU5EQVJZOnJldHVybiJiIjtjYXNlIGJpLklOVEVSSU9SOnJldHVybiJpIjtjYXNlIGJpLk5PTkU6cmV0dXJuIi0ifXRocm93IG5ldyBoaX0sRGkuSU5URVJJT1IuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDB9LERpLkJPVU5EQVJZLmdldD1mdW5jdGlvbigpe3JldHVybiAxfSxEaS5FWFRFUklPUi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMn0sRGkuTk9ORS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4tMX0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoYmksRGkpO3ZhciBFaT1mdW5jdGlvbih0LGUpe3JldHVybiB0LmludGVyZmFjZXNfJiZ0LmludGVyZmFjZXNfKCkuaW5kZXhPZihlKT4tMX0sQ2k9ZnVuY3Rpb24oKXt9LFNpPXtMT0dfMTA6e2NvbmZpZ3VyYWJsZTohMH19O0NpLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxDaS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gQ2l9LENpLmxvZzEwPWZ1bmN0aW9uKHQpe3ZhciBlPU1hdGgubG9nKHQpO3JldHVybiBmaS5pc0luZmluaXRlKGUpfHxmaS5pc05hTihlKT9lOmUvQ2kuTE9HXzEwfSxDaS5taW49ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9dDtyZXR1cm4gZTxpJiYoaT1lKSxuPGkmJihpPW4pLHI8aSYmKGk9ciksaX0sQ2kuY2xhbXA9ZnVuY3Rpb24oKXtpZigibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1syXSYmIm51bWJlciI9PXR5cGVvZiBhcmd1bWVudHNbMF0mJiJudW1iZXIiPT10eXBlb2YgYXJndW1lbnRzWzFdKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV0sbj1hcmd1bWVudHNbMl07cmV0dXJuIHQ8ZT9lOnQ+bj9uOnR9aWYoTnVtYmVyLmlzSW50ZWdlcihhcmd1bWVudHNbMl0pJiZOdW1iZXIuaXNJbnRlZ2VyKGFyZ3VtZW50c1swXSkmJk51bWJlci5pc0ludGVnZXIoYXJndW1lbnRzWzFdKSl7dmFyIHI9YXJndW1lbnRzWzBdLGk9YXJndW1lbnRzWzFdLG89YXJndW1lbnRzWzJdO3JldHVybiByPGk/aTpyPm8/bzpyfX0sQ2kud3JhcD1mdW5jdGlvbih0LGUpe3JldHVybiB0PDA/ZS0gLXQlZTp0JWV9LENpLm1heD1mdW5jdGlvbigpe2lmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMV0sZT1hcmd1bWVudHNbMl0sbj1hcmd1bWVudHNbMF07cmV0dXJuIHQ+biYmKG49dCksZT5uJiYobj1lKSxufWlmKDQ9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgcj1hcmd1bWVudHNbMV0saT1hcmd1bWVudHNbMl0sbz1hcmd1bWVudHNbM10scz1hcmd1bWVudHNbMF07cmV0dXJuIHI+cyYmKHM9ciksaT5zJiYocz1pKSxvPnMmJihzPW8pLHN9fSxDaS5hdmVyYWdlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuKHQrZSkvMn0sU2kuTE9HXzEwLmdldD1mdW5jdGlvbigpe3JldHVybiBNYXRoLmxvZygxMCl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKENpLFNpKTt2YXIgQWk9ZnVuY3Rpb24odCl7dGhpcy5zdHI9dH07QWkucHJvdG90eXBlLmFwcGVuZD1mdW5jdGlvbih0KXt0aGlzLnN0cis9dH0sQWkucHJvdG90eXBlLnNldENoYXJBdD1mdW5jdGlvbih0LGUpe3RoaXMuc3RyPXRoaXMuc3RyLnN1YnN0cigwLHQpK2UrdGhpcy5zdHIuc3Vic3RyKHQrMSl9LEFpLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5zdHJ9O3ZhciBOaT1mdW5jdGlvbih0KXt0aGlzLnZhbHVlPXR9O05pLnByb3RvdHlwZS5pbnRWYWx1ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnZhbHVlfSxOaS5wcm90b3R5cGUuY29tcGFyZVRvPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnZhbHVlPHQ/LTE6dGhpcy52YWx1ZT50PzE6MH0sTmkuaXNOYU49ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlci5pc05hTih0KX07dmFyIElpPWZ1bmN0aW9uKCl7fTtJaS5pc1doaXRlc3BhY2U9ZnVuY3Rpb24odCl7cmV0dXJuIHQ8PTMyJiZ0Pj0wfHwxMjc9PT10fSxJaS50b1VwcGVyQ2FzZT1mdW5jdGlvbih0KXtyZXR1cm4gdC50b1VwcGVyQ2FzZSgpfTt2YXIgTWk9ZnVuY3Rpb24gdCgpe2lmKHRoaXMuX2hpPTAsdGhpcy5fbG89MCwwPT09YXJndW1lbnRzLmxlbmd0aCl0aGlzLmluaXQoMCk7ZWxzZSBpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7aWYoIm51bWJlciI9PXR5cGVvZiBhcmd1bWVudHNbMF0pe3ZhciBlPWFyZ3VtZW50c1swXTt0aGlzLmluaXQoZSl9ZWxzZSBpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHQpe3ZhciBuPWFyZ3VtZW50c1swXTt0aGlzLmluaXQobil9ZWxzZSBpZigic3RyaW5nIj09dHlwZW9mIGFyZ3VtZW50c1swXSl7dC5jYWxsKHRoaXMsdC5wYXJzZShhcmd1bWVudHNbMF0pKX19ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHI9YXJndW1lbnRzWzBdLGk9YXJndW1lbnRzWzFdO3RoaXMuaW5pdChyLGkpfX0sRmk9e1BJOntjb25maWd1cmFibGU6ITB9LFRXT19QSTp7Y29uZmlndXJhYmxlOiEwfSxQSV8yOntjb25maWd1cmFibGU6ITB9LEU6e2NvbmZpZ3VyYWJsZTohMH0sTmFOOntjb25maWd1cmFibGU6ITB9LEVQUzp7Y29uZmlndXJhYmxlOiEwfSxTUExJVDp7Y29uZmlndXJhYmxlOiEwfSxNQVhfUFJJTlRfRElHSVRTOntjb25maWd1cmFibGU6ITB9LFRFTjp7Y29uZmlndXJhYmxlOiEwfSxPTkU6e2NvbmZpZ3VyYWJsZTohMH0sU0NJX05PVF9FWFBPTkVOVF9DSEFSOntjb25maWd1cmFibGU6ITB9LFNDSV9OT1RfWkVSTzp7Y29uZmlndXJhYmxlOiEwfX07TWkucHJvdG90eXBlLmxlPWZ1bmN0aW9uKHQpe3JldHVybih0aGlzLl9oaTx0Ll9oaXx8dGhpcy5faGk9PT10Ll9oaSkmJnRoaXMuX2xvPD10Ll9sb30sTWkucHJvdG90eXBlLmV4dHJhY3RTaWduaWZpY2FudERpZ2l0cz1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuYWJzKCkscj1NaS5tYWduaXR1ZGUobi5faGkpLGk9TWkuVEVOLnBvdyhyKTsobj1uLmRpdmlkZShpKSkuZ3QoTWkuVEVOKT8obj1uLmRpdmlkZShNaS5URU4pLHIrPTEpOm4ubHQoTWkuT05FKSYmKG49bi5tdWx0aXBseShNaS5URU4pLHItPTEpO2Zvcih2YXIgbz1yKzEscz1uZXcgQWksYT1NaS5NQVhfUFJJTlRfRElHSVRTLTEsdT0wO3U8PWE7dSsrKXt0JiZ1PT09byYmcy5hcHBlbmQoIi4iKTt2YXIgYz1NYXRoLnRydW5jKG4uX2hpKTtpZihjPDApYnJlYWs7dmFyIGw9ITEsaD0wO2M+OT8obD0hMCxoPSI5Iik6aD0iMCIrYyxzLmFwcGVuZChoKSxuPW4uc3VidHJhY3QoTWkudmFsdWVPZihjKSkubXVsdGlwbHkoTWkuVEVOKSxsJiZuLnNlbGZBZGQoTWkuVEVOKTt2YXIgZj0hMCxwPU1pLm1hZ25pdHVkZShuLl9oaSk7aWYocDwwJiZNYXRoLmFicyhwKT49YS11JiYoZj0hMSksIWYpYnJlYWt9cmV0dXJuIGVbMF09cixzLnRvU3RyaW5nKCl9LE1pLnByb3RvdHlwZS5zcXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdWx0aXBseSh0aGlzKX0sTWkucHJvdG90eXBlLmRvdWJsZVZhbHVlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2hpK3RoaXMuX2xvfSxNaS5wcm90b3R5cGUuc3VidHJhY3Q9ZnVuY3Rpb24oKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIE1pKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuYWRkKHQubmVnYXRlKCkpfWlmKCJudW1iZXIiPT10eXBlb2YgYXJndW1lbnRzWzBdKXt2YXIgZT1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuYWRkKC1lKX19LE1pLnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLl9oaT09PXQuX2hpJiZ0aGlzLl9sbz09PXQuX2xvfX0sTWkucHJvdG90eXBlLmlzWmVybz1mdW5jdGlvbigpe3JldHVybiAwPT09dGhpcy5faGkmJjA9PT10aGlzLl9sb30sTWkucHJvdG90eXBlLnNlbGZTdWJ0cmFjdD1mdW5jdGlvbigpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgTWkpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5pc05hTigpP3RoaXM6dGhpcy5zZWxmQWRkKC10Ll9oaSwtdC5fbG8pfWlmKCJudW1iZXIiPT10eXBlb2YgYXJndW1lbnRzWzBdKXt2YXIgZT1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuaXNOYU4oKT90aGlzOnRoaXMuc2VsZkFkZCgtZSwwKX19LE1pLnByb3RvdHlwZS5nZXRTcGVjaWFsTnVtYmVyU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNaZXJvKCk/IjAuMCI6dGhpcy5pc05hTigpPyJOYU4gIjpudWxsfSxNaS5wcm90b3R5cGUubWluPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmxlKHQpP3RoaXM6dH0sTWkucHJvdG90eXBlLnNlbGZEaXZpZGU9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBNaSl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLnNlbGZEaXZpZGUodC5faGksdC5fbG8pfWlmKCJudW1iZXIiPT10eXBlb2YgYXJndW1lbnRzWzBdKXt2YXIgZT1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuc2VsZkRpdmlkZShlLDApfX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbixyLGksbyxzPWFyZ3VtZW50c1swXSxhPWFyZ3VtZW50c1sxXSx1PW51bGwsYz1udWxsLGw9bnVsbCxoPW51bGw7cmV0dXJuIGk9dGhpcy5faGkvcyxoPSh1PShsPU1pLlNQTElUKmkpLSh1PWwtaSkpKihjPShoPU1pLlNQTElUKnMpLShjPWgtcykpLShvPWkqcykrdSoocj1zLWMpKyhuPWktdSkqYytuKnIsaD1pKyhsPSh0aGlzLl9oaS1vLWgrdGhpcy5fbG8taSphKS9zKSx0aGlzLl9oaT1oLHRoaXMuX2xvPWktaCtsLHRoaXN9fSxNaS5wcm90b3R5cGUuZHVtcD1mdW5jdGlvbigpe3JldHVybiJERDwiK3RoaXMuX2hpKyIsICIrdGhpcy5fbG8rIj4ifSxNaS5wcm90b3R5cGUuZGl2aWRlPWZ1bmN0aW9uKCl7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBNaSl7dmFyIHQsZSxuLHIsaT1hcmd1bWVudHNbMF0sbz1udWxsLHM9bnVsbCxhPW51bGwsdT1udWxsO3JldHVybiB0PShuPXRoaXMuX2hpL2kuX2hpKS0obz0oYT1NaS5TUExJVCpuKS0obz1hLW4pKSx1PW8qKHM9KHU9TWkuU1BMSVQqaS5faGkpLShzPXUtaS5faGkpKS0ocj1uKmkuX2hpKStvKihlPWkuX2hpLXMpK3Qqcyt0KmUsYT0odGhpcy5faGktci11K3RoaXMuX2xvLW4qaS5fbG8pL2kuX2hpLG5ldyBNaSh1PW4rYSxuLXUrYSl9aWYoIm51bWJlciI9PXR5cGVvZiBhcmd1bWVudHNbMF0pe3ZhciBjPWFyZ3VtZW50c1swXTtyZXR1cm4gZmkuaXNOYU4oYyk/TWkuY3JlYXRlTmFOKCk6TWkuY29weSh0aGlzKS5zZWxmRGl2aWRlKGMsMCl9fSxNaS5wcm90b3R5cGUuZ2U9ZnVuY3Rpb24odCl7cmV0dXJuKHRoaXMuX2hpPnQuX2hpfHx0aGlzLl9oaT09PXQuX2hpKSYmdGhpcy5fbG8+PXQuX2xvfSxNaS5wcm90b3R5cGUucG93PWZ1bmN0aW9uKHQpe2lmKDA9PT10KXJldHVybiBNaS52YWx1ZU9mKDEpO3ZhciBlPW5ldyBNaSh0aGlzKSxuPU1pLnZhbHVlT2YoMSkscj1NYXRoLmFicyh0KTtpZihyPjEpZm9yKDtyPjA7KXIlMj09MSYmbi5zZWxmTXVsdGlwbHkoZSksKHIvPTIpPjAmJihlPWUuc3FyKCkpO2Vsc2Ugbj1lO3JldHVybiB0PDA/bi5yZWNpcHJvY2FsKCk6bn0sTWkucHJvdG90eXBlLmNlaWw9ZnVuY3Rpb24oKXtpZih0aGlzLmlzTmFOKCkpcmV0dXJuIE1pLk5hTjt2YXIgdD1NYXRoLmNlaWwodGhpcy5faGkpLGU9MDtyZXR1cm4gdD09PXRoaXMuX2hpJiYoZT1NYXRoLmNlaWwodGhpcy5fbG8pKSxuZXcgTWkodCxlKX0sTWkucHJvdG90eXBlLmNvbXBhcmVUbz1mdW5jdGlvbih0KXt2YXIgZT10O3JldHVybiB0aGlzLl9oaTxlLl9oaT8tMTp0aGlzLl9oaT5lLl9oaT8xOnRoaXMuX2xvPGUuX2xvPy0xOnRoaXMuX2xvPmUuX2xvPzE6MH0sTWkucHJvdG90eXBlLnJpbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc05hTigpP3RoaXM6dGhpcy5hZGQoLjUpLmZsb29yKCl9LE1pLnByb3RvdHlwZS5zZXRWYWx1ZT1mdW5jdGlvbigpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgTWkpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5pbml0KHQpLHRoaXN9aWYoIm51bWJlciI9PXR5cGVvZiBhcmd1bWVudHNbMF0pe3ZhciBlPWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5pbml0KGUpLHRoaXN9fSxNaS5wcm90b3R5cGUubWF4PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmdlKHQpP3RoaXM6dH0sTWkucHJvdG90eXBlLnNxcnQ9ZnVuY3Rpb24oKXtpZih0aGlzLmlzWmVybygpKXJldHVybiBNaS52YWx1ZU9mKDApO2lmKHRoaXMuaXNOZWdhdGl2ZSgpKXJldHVybiBNaS5OYU47dmFyIHQ9MS9NYXRoLnNxcnQodGhpcy5faGkpLGU9dGhpcy5faGkqdCxuPU1pLnZhbHVlT2YoZSkscj10aGlzLnN1YnRyYWN0KG4uc3FyKCkpLl9oaSooLjUqdCk7cmV0dXJuIG4uYWRkKHIpfSxNaS5wcm90b3R5cGUuc2VsZkFkZD1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIE1pKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuc2VsZkFkZCh0Ll9oaSx0Ll9sbyl9aWYoIm51bWJlciI9PXR5cGVvZiBhcmd1bWVudHNbMF0pe3ZhciBlLG4scixpLG8scz1hcmd1bWVudHNbMF0sYT1udWxsO3JldHVybiBhPShyPXRoaXMuX2hpK3MpLShpPXItdGhpcy5faGkpLG49KG89KGE9cy1pKyh0aGlzLl9oaS1hKSkrdGhpcy5fbG8pKyhyLShlPXIrbykpLHRoaXMuX2hpPWUrbix0aGlzLl9sbz1uKyhlLXRoaXMuX2hpKSx0aGlzfX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdSxjLGwsaCxmPWFyZ3VtZW50c1swXSxwPWFyZ3VtZW50c1sxXSxkPW51bGwsZz1udWxsLHk9bnVsbDtsPXRoaXMuX2hpK2YsYz10aGlzLl9sbytwLGc9bC0oeT1sLXRoaXMuX2hpKSxkPWMtKGg9Yy10aGlzLl9sbyk7dmFyIG09KHU9bCsoeT0oZz1mLXkrKHRoaXMuX2hpLWcpKStjKSkrKHk9KGQ9cC1oKyh0aGlzLl9sby1kKSkrKHkrKGwtdSkpKSx2PXkrKHUtbSk7cmV0dXJuIHRoaXMuX2hpPW0sdGhpcy5fbG89dix0aGlzfX0sTWkucHJvdG90eXBlLnNlbGZNdWx0aXBseT1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIE1pKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuc2VsZk11bHRpcGx5KHQuX2hpLHQuX2xvKX1pZigibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1swXSl7dmFyIGU9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLnNlbGZNdWx0aXBseShlLDApfX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbixyLGk9YXJndW1lbnRzWzBdLG89YXJndW1lbnRzWzFdLHM9bnVsbCxhPW51bGwsdT1udWxsLGM9bnVsbDtzPSh1PU1pLlNQTElUKnRoaXMuX2hpKS10aGlzLl9oaSxjPU1pLlNQTElUKmkscz11LXMsbj10aGlzLl9oaS1zLGE9Yy1pO3ZhciBsPSh1PXRoaXMuX2hpKmkpKyhjPXMqKGE9Yy1hKS11K3MqKHI9aS1hKStuKmErbipyKyh0aGlzLl9oaSpvK3RoaXMuX2xvKmkpKSxoPWMrKHM9dS1sKTtyZXR1cm4gdGhpcy5faGk9bCx0aGlzLl9sbz1oLHRoaXN9fSxNaS5wcm90b3R5cGUuc2VsZlNxcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNlbGZNdWx0aXBseSh0aGlzKX0sTWkucHJvdG90eXBlLmZsb29yPWZ1bmN0aW9uKCl7aWYodGhpcy5pc05hTigpKXJldHVybiBNaS5OYU47dmFyIHQ9TWF0aC5mbG9vcih0aGlzLl9oaSksZT0wO3JldHVybiB0PT09dGhpcy5faGkmJihlPU1hdGguZmxvb3IodGhpcy5fbG8pKSxuZXcgTWkodCxlKX0sTWkucHJvdG90eXBlLm5lZ2F0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzTmFOKCk/dGhpczpuZXcgTWkoLXRoaXMuX2hpLC10aGlzLl9sbyl9LE1pLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe30sTWkucHJvdG90eXBlLm11bHRpcGx5PWZ1bmN0aW9uKCl7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBNaSl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiB0LmlzTmFOKCk/TWkuY3JlYXRlTmFOKCk6TWkuY29weSh0aGlzKS5zZWxmTXVsdGlwbHkodCl9aWYoIm51bWJlciI9PXR5cGVvZiBhcmd1bWVudHNbMF0pe3ZhciBlPWFyZ3VtZW50c1swXTtyZXR1cm4gZmkuaXNOYU4oZSk/TWkuY3JlYXRlTmFOKCk6TWkuY29weSh0aGlzKS5zZWxmTXVsdGlwbHkoZSwwKX19LE1pLnByb3RvdHlwZS5pc05hTj1mdW5jdGlvbigpe3JldHVybiBmaS5pc05hTih0aGlzLl9oaSl9LE1pLnByb3RvdHlwZS5pbnRWYWx1ZT1mdW5jdGlvbigpe3JldHVybiBNYXRoLnRydW5jKHRoaXMuX2hpKX0sTWkucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIHQ9TWkubWFnbml0dWRlKHRoaXMuX2hpKTtyZXR1cm4gdD49LTMmJnQ8PTIwP3RoaXMudG9TdGFuZGFyZE5vdGF0aW9uKCk6dGhpcy50b1NjaU5vdGF0aW9uKCl9LE1pLnByb3RvdHlwZS50b1N0YW5kYXJkTm90YXRpb249ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldFNwZWNpYWxOdW1iZXJTdHJpbmcoKTtpZihudWxsIT09dClyZXR1cm4gdDt2YXIgZT1uZXcgQXJyYXkoMSkuZmlsbChudWxsKSxuPXRoaXMuZXh0cmFjdFNpZ25pZmljYW50RGlnaXRzKCEwLGUpLHI9ZVswXSsxLGk9bjtpZigiLiI9PT1uLmNoYXJBdCgwKSlpPSIwIituO2Vsc2UgaWYocjwwKWk9IjAuIitNaS5zdHJpbmdPZkNoYXIoIjAiLC1yKStuO2Vsc2UgaWYoLTE9PT1uLmluZGV4T2YoIi4iKSl7dmFyIG89ci1uLmxlbmd0aDtpPW4rTWkuc3RyaW5nT2ZDaGFyKCIwIixvKSsiLjAifXJldHVybiB0aGlzLmlzTmVnYXRpdmUoKT8iLSIraTppfSxNaS5wcm90b3R5cGUucmVjaXByb2NhbD1mdW5jdGlvbigpe3ZhciB0LGUsbixyLGk9bnVsbCxvPW51bGwscz1udWxsLGE9bnVsbDt0PShuPTEvdGhpcy5faGkpLShpPShzPU1pLlNQTElUKm4pLShpPXMtbikpLG89KGE9TWkuU1BMSVQqdGhpcy5faGkpLXRoaXMuX2hpO3ZhciB1PW4rKHM9KDEtKHI9bip0aGlzLl9oaSktKGE9aSoobz1hLW8pLXIraSooZT10aGlzLl9oaS1vKSt0Km8rdCplKS1uKnRoaXMuX2xvKS90aGlzLl9oaSk7cmV0dXJuIG5ldyBNaSh1LG4tdStzKX0sTWkucHJvdG90eXBlLnRvU2NpTm90YXRpb249ZnVuY3Rpb24oKXtpZih0aGlzLmlzWmVybygpKXJldHVybiBNaS5TQ0lfTk9UX1pFUk87dmFyIHQ9dGhpcy5nZXRTcGVjaWFsTnVtYmVyU3RyaW5nKCk7aWYobnVsbCE9PXQpcmV0dXJuIHQ7dmFyIGU9bmV3IEFycmF5KDEpLmZpbGwobnVsbCksbj10aGlzLmV4dHJhY3RTaWduaWZpY2FudERpZ2l0cyghMSxlKSxyPU1pLlNDSV9OT1RfRVhQT05FTlRfQ0hBUitlWzBdO2lmKCIwIj09PW4uY2hhckF0KDApKXRocm93IG5ldyBFcnJvcigiRm91bmQgbGVhZGluZyB6ZXJvOiAiK24pO3ZhciBpPSIiO24ubGVuZ3RoPjEmJihpPW4uc3Vic3RyaW5nKDEpKTt2YXIgbz1uLmNoYXJBdCgwKSsiLiIraTtyZXR1cm4gdGhpcy5pc05lZ2F0aXZlKCk/Ii0iK28rcjpvK3J9LE1pLnByb3RvdHlwZS5hYnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc05hTigpP01pLk5hTjp0aGlzLmlzTmVnYXRpdmUoKT90aGlzLm5lZ2F0ZSgpOm5ldyBNaSh0aGlzKX0sTWkucHJvdG90eXBlLmlzUG9zaXRpdmU9ZnVuY3Rpb24oKXtyZXR1cm4odGhpcy5faGk+MHx8MD09PXRoaXMuX2hpKSYmdGhpcy5fbG8+MH0sTWkucHJvdG90eXBlLmx0PWZ1bmN0aW9uKHQpe3JldHVybih0aGlzLl9oaTx0Ll9oaXx8dGhpcy5faGk9PT10Ll9oaSkmJnRoaXMuX2xvPHQuX2xvfSxNaS5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKCl7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBNaSl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiBNaS5jb3B5KHRoaXMpLnNlbGZBZGQodCl9aWYoIm51bWJlciI9PXR5cGVvZiBhcmd1bWVudHNbMF0pe3ZhciBlPWFyZ3VtZW50c1swXTtyZXR1cm4gTWkuY29weSh0aGlzKS5zZWxmQWRkKGUpfX0sTWkucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7aWYoIm51bWJlciI9PXR5cGVvZiBhcmd1bWVudHNbMF0pe3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLl9oaT10LHRoaXMuX2xvPTB9ZWxzZSBpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIE1pKXt2YXIgZT1hcmd1bWVudHNbMF07dGhpcy5faGk9ZS5faGksdGhpcy5fbG89ZS5fbG99fWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXTt0aGlzLl9oaT1uLHRoaXMuX2xvPXJ9fSxNaS5wcm90b3R5cGUuZ3Q9ZnVuY3Rpb24odCl7cmV0dXJuKHRoaXMuX2hpPnQuX2hpfHx0aGlzLl9oaT09PXQuX2hpKSYmdGhpcy5fbG8+dC5fbG99LE1pLnByb3RvdHlwZS5pc05lZ2F0aXZlPWZ1bmN0aW9uKCl7cmV0dXJuKHRoaXMuX2hpPDB8fDA9PT10aGlzLl9oaSkmJnRoaXMuX2xvPDB9LE1pLnByb3RvdHlwZS50cnVuYz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzTmFOKCk/TWkuTmFOOnRoaXMuaXNQb3NpdGl2ZSgpP3RoaXMuZmxvb3IoKTp0aGlzLmNlaWwoKX0sTWkucHJvdG90eXBlLnNpZ251bT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9oaT4wPzE6dGhpcy5faGk8MD8tMTp0aGlzLl9sbz4wPzE6dGhpcy5fbG88MD8tMTowfSxNaS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bbWksZGksZ2ldfSxNaS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gTWl9LE1pLnNxcj1mdW5jdGlvbih0KXtyZXR1cm4gTWkudmFsdWVPZih0KS5zZWxmTXVsdGlwbHkodCl9LE1pLnZhbHVlT2Y9ZnVuY3Rpb24oKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGFyZ3VtZW50c1swXT9NaS5wYXJzZShhcmd1bWVudHNbMF0pOiJudW1iZXIiPT10eXBlb2YgYXJndW1lbnRzWzBdP25ldyBNaShhcmd1bWVudHNbMF0pOnZvaWQgMH0sTWkuc3FydD1mdW5jdGlvbih0KXtyZXR1cm4gTWkudmFsdWVPZih0KS5zcXJ0KCl9LE1pLnBhcnNlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wLG49dC5sZW5ndGg7SWkuaXNXaGl0ZXNwYWNlKHQuY2hhckF0KGUpKTspZSsrO3ZhciByPSExO2lmKGU8bil7dmFyIGk9dC5jaGFyQXQoZSk7KCItIj09PWl8fCIrIj09PWkpJiYoZSsrLCItIj09PWkmJihyPSEwKSl9Zm9yKHZhciBvPW5ldyBNaSxzPTAsYT0wLHU9MDshKGU+PW4pOyl7dmFyIGM9dC5jaGFyQXQoZSk7aWYoZSsrLElpLmlzRGlnaXQoYykpe3ZhciBsPWMtIjAiO28uc2VsZk11bHRpcGx5KE1pLlRFTiksby5zZWxmQWRkKGwpLHMrK31lbHNle2lmKCIuIiE9PWMpe2lmKCJlIj09PWN8fCJFIj09PWMpe3ZhciBoPXQuc3Vic3RyaW5nKGUpO3RyeXt1PU5pLnBhcnNlSW50KGgpfWNhdGNoKGUpe3Rocm93IGUgaW5zdGFuY2VvZiBFcnJvcj9uZXcgRXJyb3IoIkludmFsaWQgZXhwb25lbnQgIitoKyIgaW4gc3RyaW5nICIrdCk6ZX1icmVha310aHJvdyBuZXcgRXJyb3IoIlVuZXhwZWN0ZWQgY2hhcmFjdGVyICciK2MrIicgYXQgcG9zaXRpb24gIitlKyIgaW4gc3RyaW5nICIrdCl9YT1zfX12YXIgZj1vLHA9cy1hLXU7aWYoMD09PXApZj1vO2Vsc2UgaWYocD4wKXt2YXIgZD1NaS5URU4ucG93KHApO2Y9by5kaXZpZGUoZCl9ZWxzZSBpZihwPDApe3ZhciBnPU1pLlRFTi5wb3coLXApO2Y9by5tdWx0aXBseShnKX1yZXR1cm4gcj9mLm5lZ2F0ZSgpOmZ9LE1pLmNyZWF0ZU5hTj1mdW5jdGlvbigpe3JldHVybiBuZXcgTWkoZmkuTmFOLGZpLk5hTil9LE1pLmNvcHk9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBNaSh0KX0sTWkubWFnbml0dWRlPWZ1bmN0aW9uKHQpe3ZhciBlPU1hdGguYWJzKHQpLG49TWF0aC5sb2coZSkvTWF0aC5sb2coMTApLHI9TWF0aC50cnVuYyhNYXRoLmZsb29yKG4pKTtyZXR1cm4gMTAqTWF0aC5wb3coMTAscik8PWUmJihyKz0xKSxyfSxNaS5zdHJpbmdPZkNoYXI9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49bmV3IEFpLHI9MDtyPGU7cisrKW4uYXBwZW5kKHQpO3JldHVybiBuLnRvU3RyaW5nKCl9LEZpLlBJLmdldD1mdW5jdGlvbigpe3JldHVybiBuZXcgTWkoMy4xNDE1OTI2NTM1ODk3OTMsMTIyNDY0Njc5OTE0NzM1MzJlLTMyKX0sRmkuVFdPX1BJLmdldD1mdW5jdGlvbigpe3JldHVybiBuZXcgTWkoNi4yODMxODUzMDcxNzk1ODYsMjQ0OTI5MzU5ODI5NDcwNjRlLTMyKX0sRmkuUElfMi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IE1pKDEuNTcwNzk2MzI2Nzk0ODk2Niw2MTIzMjMzOTk1NzM2NzY2ZS0zMil9LEZpLkUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBNaSgyLjcxODI4MTgyODQ1OTA0NSwxNDQ1NjQ2ODkxNzI5MjUwMmUtMzIpfSxGaS5OYU4uZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBNaShmaS5OYU4sZmkuTmFOKX0sRmkuRVBTLmdldD1mdW5jdGlvbigpe3JldHVybiAxMjMyNTk1MTY0NDA3ODNlLTQ2fSxGaS5TUExJVC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMTM0MjE3NzI5fSxGaS5NQVhfUFJJTlRfRElHSVRTLmdldD1mdW5jdGlvbigpe3JldHVybiAzMn0sRmkuVEVOLmdldD1mdW5jdGlvbigpe3JldHVybiBNaS52YWx1ZU9mKDEwKX0sRmkuT05FLmdldD1mdW5jdGlvbigpe3JldHVybiBNaS52YWx1ZU9mKDEpfSxGaS5TQ0lfTk9UX0VYUE9ORU5UX0NIQVIuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIkUifSxGaS5TQ0lfTk9UX1pFUk8uZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIjAuMEUwIn0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoTWksRmkpO3ZhciBUaT1mdW5jdGlvbigpe30sT2k9e0RQX1NBRkVfRVBTSUxPTjp7Y29uZmlndXJhYmxlOiEwfX07VGkucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LFRpLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBUaX0sVGkub3JpZW50YXRpb25JbmRleD1mdW5jdGlvbih0LGUsbil7dmFyIHI9VGkub3JpZW50YXRpb25JbmRleEZpbHRlcih0LGUsbik7aWYocjw9MSlyZXR1cm4gcjt2YXIgaT1NaS52YWx1ZU9mKGUueCkuc2VsZkFkZCgtdC54KSxvPU1pLnZhbHVlT2YoZS55KS5zZWxmQWRkKC10LnkpLHM9TWkudmFsdWVPZihuLngpLnNlbGZBZGQoLWUueCksYT1NaS52YWx1ZU9mKG4ueSkuc2VsZkFkZCgtZS55KTtyZXR1cm4gaS5zZWxmTXVsdGlwbHkoYSkuc2VsZlN1YnRyYWN0KG8uc2VsZk11bHRpcGx5KHMpKS5zaWdudW0oKX0sVGkuc2lnbk9mRGV0MngyPWZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiB0Lm11bHRpcGx5KHIpLnNlbGZTdWJ0cmFjdChlLm11bHRpcGx5KG4pKS5zaWdudW0oKX0sVGkuaW50ZXJzZWN0aW9uPWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPU1pLnZhbHVlT2Yoci55KS5zZWxmU3VidHJhY3Qobi55KS5zZWxmTXVsdGlwbHkoTWkudmFsdWVPZihlLngpLnNlbGZTdWJ0cmFjdCh0LngpKSxvPU1pLnZhbHVlT2Yoci54KS5zZWxmU3VidHJhY3Qobi54KS5zZWxmTXVsdGlwbHkoTWkudmFsdWVPZihlLnkpLnNlbGZTdWJ0cmFjdCh0LnkpKSxzPWkuc3VidHJhY3QobyksYT1NaS52YWx1ZU9mKHIueCkuc2VsZlN1YnRyYWN0KG4ueCkuc2VsZk11bHRpcGx5KE1pLnZhbHVlT2YodC55KS5zZWxmU3VidHJhY3Qobi55KSksdT1NaS52YWx1ZU9mKHIueSkuc2VsZlN1YnRyYWN0KG4ueSkuc2VsZk11bHRpcGx5KE1pLnZhbHVlT2YodC54KS5zZWxmU3VidHJhY3Qobi54KSksYz1hLnN1YnRyYWN0KHUpLnNlbGZEaXZpZGUocykuZG91YmxlVmFsdWUoKSxsPU1pLnZhbHVlT2YodC54KS5zZWxmQWRkKE1pLnZhbHVlT2YoZS54KS5zZWxmU3VidHJhY3QodC54KS5zZWxmTXVsdGlwbHkoYykpLmRvdWJsZVZhbHVlKCksaD1NaS52YWx1ZU9mKGUueCkuc2VsZlN1YnRyYWN0KHQueCkuc2VsZk11bHRpcGx5KE1pLnZhbHVlT2YodC55KS5zZWxmU3VidHJhY3Qobi55KSksZj1NaS52YWx1ZU9mKGUueSkuc2VsZlN1YnRyYWN0KHQueSkuc2VsZk11bHRpcGx5KE1pLnZhbHVlT2YodC54KS5zZWxmU3VidHJhY3Qobi54KSkscD1oLnN1YnRyYWN0KGYpLnNlbGZEaXZpZGUocykuZG91YmxlVmFsdWUoKSxkPU1pLnZhbHVlT2Yobi55KS5zZWxmQWRkKE1pLnZhbHVlT2Yoci55KS5zZWxmU3VidHJhY3Qobi55KS5zZWxmTXVsdGlwbHkocCkpLmRvdWJsZVZhbHVlKCk7cmV0dXJuIG5ldyB2aShsLGQpfSxUaS5vcmllbnRhdGlvbkluZGV4RmlsdGVyPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1udWxsLGk9KHQueC1uLngpKihlLnktbi55KSxvPSh0Lnktbi55KSooZS54LW4ueCkscz1pLW87aWYoaT4wKXtpZihvPD0wKXJldHVybiBUaS5zaWdudW0ocyk7cj1pK299ZWxzZXtpZighKGk8MCkpcmV0dXJuIFRpLnNpZ251bShzKTtpZihvPj0wKXJldHVybiBUaS5zaWdudW0ocyk7cj0taS1vfXZhciBhPVRpLkRQX1NBRkVfRVBTSUxPTipyO3JldHVybiBzPj1hfHwtcz49YT9UaS5zaWdudW0ocyk6Mn0sVGkuc2lnbnVtPWZ1bmN0aW9uKHQpe3JldHVybiB0PjA/MTp0PDA/LTE6MH0sT2kuRFBfU0FGRV9FUFNJTE9OLmdldD1mdW5jdGlvbigpe3JldHVybiAxZS0xNX0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoVGksT2kpO3ZhciBMaT1mdW5jdGlvbigpe30sUGk9e1g6e2NvbmZpZ3VyYWJsZTohMH0sWTp7Y29uZmlndXJhYmxlOiEwfSxaOntjb25maWd1cmFibGU6ITB9LE06e2NvbmZpZ3VyYWJsZTohMH19O1BpLlguZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDB9LFBpLlkuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDF9LFBpLlouZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDJ9LFBpLk0uZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDN9LExpLnByb3RvdHlwZS5zZXRPcmRpbmF0ZT1mdW5jdGlvbih0LGUsbil7fSxMaS5wcm90b3R5cGUuc2l6ZT1mdW5jdGlvbigpe30sTGkucHJvdG90eXBlLmdldE9yZGluYXRlPWZ1bmN0aW9uKHQsZSl7fSxMaS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZT1mdW5jdGlvbigpe30sTGkucHJvdG90eXBlLmdldENvb3JkaW5hdGVDb3B5PWZ1bmN0aW9uKHQpe30sTGkucHJvdG90eXBlLmdldERpbWVuc2lvbj1mdW5jdGlvbigpe30sTGkucHJvdG90eXBlLmdldFg9ZnVuY3Rpb24odCl7fSxMaS5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXt9LExpLnByb3RvdHlwZS5leHBhbmRFbnZlbG9wZT1mdW5jdGlvbih0KXt9LExpLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKCl7fSxMaS5wcm90b3R5cGUuZ2V0WT1mdW5jdGlvbih0KXt9LExpLnByb3RvdHlwZS50b0Nvb3JkaW5hdGVBcnJheT1mdW5jdGlvbigpe30sTGkucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW2dpXX0sTGkucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIExpfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhMaSxQaSk7dmFyIFJpPWZ1bmN0aW9uKCl7fSxCaT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dC5jYWxsKHRoaXMsIlByb2plY3RpdmUgcG9pbnQgbm90IHJlcHJlc2VudGFibGUgb24gdGhlIENhcnRlc2lhbiBwbGFuZS4iKX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sZX0oUmkpLGtpPWZ1bmN0aW9uKCl7fTtraS5hcnJheWNvcHk9ZnVuY3Rpb24odCxlLG4scixpKXtmb3IodmFyIG89MCxzPWU7czxlK2k7cysrKW5bcitvXT10W3NdLG8rK30sa2kuZ2V0UHJvcGVydHk9ZnVuY3Rpb24odCl7cmV0dXJueyJsaW5lLnNlcGFyYXRvciI6IlxuIn1bdF19O3ZhciB6aT1mdW5jdGlvbiB0KCl7aWYodGhpcy54PW51bGwsdGhpcy55PW51bGwsdGhpcy53PW51bGwsMD09PWFyZ3VtZW50cy5sZW5ndGgpdGhpcy54PTAsdGhpcy55PTAsdGhpcy53PTE7ZWxzZSBpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdO3RoaXMueD1lLngsdGhpcy55PWUueSx0aGlzLnc9MX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXtpZigibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1swXSYmIm51bWJlciI9PXR5cGVvZiBhcmd1bWVudHNbMV0pe3ZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXTt0aGlzLng9bix0aGlzLnk9cix0aGlzLnc9MX1lbHNlIGlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgdCYmYXJndW1lbnRzWzFdaW5zdGFuY2VvZiB0KXt2YXIgaT1hcmd1bWVudHNbMF0sbz1hcmd1bWVudHNbMV07dGhpcy54PWkueSpvLnctby55Kmkudyx0aGlzLnk9by54Kmkudy1pLngqby53LHRoaXMudz1pLngqby55LW8ueCppLnl9ZWxzZSBpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHZpJiZhcmd1bWVudHNbMV1pbnN0YW5jZW9mIHZpKXt2YXIgcz1hcmd1bWVudHNbMF0sYT1hcmd1bWVudHNbMV07dGhpcy54PXMueS1hLnksdGhpcy55PWEueC1zLngsdGhpcy53PXMueCphLnktYS54KnMueX19ZWxzZSBpZigzPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHU9YXJndW1lbnRzWzBdLGM9YXJndW1lbnRzWzFdLGw9YXJndW1lbnRzWzJdO3RoaXMueD11LHRoaXMueT1jLHRoaXMudz1sfWVsc2UgaWYoND09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBoPWFyZ3VtZW50c1swXSxmPWFyZ3VtZW50c1sxXSxwPWFyZ3VtZW50c1syXSxkPWFyZ3VtZW50c1szXSxnPWgueS1mLnkseT1mLngtaC54LG09aC54KmYueS1mLngqaC55LHY9cC55LWQueSxfPWQueC1wLngseD1wLngqZC55LWQueCpwLnk7dGhpcy54PXkqeC1fKm0sdGhpcy55PXYqbS1nKngsdGhpcy53PWcqXy12Knl9fTt6aS5wcm90b3R5cGUuZ2V0WT1mdW5jdGlvbigpe3ZhciB0PXRoaXMueS90aGlzLnc7aWYoZmkuaXNOYU4odCl8fGZpLmlzSW5maW5pdGUodCkpdGhyb3cgbmV3IEJpO3JldHVybiB0fSx6aS5wcm90b3R5cGUuZ2V0WD1mdW5jdGlvbigpe3ZhciB0PXRoaXMueC90aGlzLnc7aWYoZmkuaXNOYU4odCl8fGZpLmlzSW5maW5pdGUodCkpdGhyb3cgbmV3IEJpO3JldHVybiB0fSx6aS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZT1mdW5jdGlvbigpe3ZhciB0PW5ldyB2aTtyZXR1cm4gdC54PXRoaXMuZ2V0WCgpLHQueT10aGlzLmdldFkoKSx0fSx6aS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0semkucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHppfSx6aS5pbnRlcnNlY3Rpb249ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9dC55LWUueSxvPWUueC10Lngscz10LngqZS55LWUueCp0LnksYT1uLnktci55LHU9ci54LW4ueCxjPW4ueCpyLnktci54Km4ueSxsPWkqdS1hKm8saD0obypjLXUqcykvbCxmPShhKnMtaSpjKS9sO2lmKGZpLmlzTmFOKGgpfHxmaS5pc0luZmluaXRlKGgpfHxmaS5pc05hTihmKXx8ZmkuaXNJbmZpbml0ZShmKSl0aHJvdyBuZXcgQmk7cmV0dXJuIG5ldyB2aShoLGYpfTt2YXIgamk9ZnVuY3Rpb24gdCgpe2lmKHRoaXMuX21pbng9bnVsbCx0aGlzLl9tYXh4PW51bGwsdGhpcy5fbWlueT1udWxsLHRoaXMuX21heHk9bnVsbCwwPT09YXJndW1lbnRzLmxlbmd0aCl0aGlzLmluaXQoKTtlbHNlIGlmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHZpKXt2YXIgZT1hcmd1bWVudHNbMF07dGhpcy5pbml0KGUueCxlLngsZS55LGUueSl9ZWxzZSBpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHQpe3ZhciBuPWFyZ3VtZW50c1swXTt0aGlzLmluaXQobil9fWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciByPWFyZ3VtZW50c1swXSxpPWFyZ3VtZW50c1sxXTt0aGlzLmluaXQoci54LGkueCxyLnksaS55KX1lbHNlIGlmKDQ9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbz1hcmd1bWVudHNbMF0scz1hcmd1bWVudHNbMV0sYT1hcmd1bWVudHNbMl0sdT1hcmd1bWVudHNbM107dGhpcy5pbml0KG8scyxhLHUpfX0sVWk9e3NlcmlhbFZlcnNpb25VSUQ6e2NvbmZpZ3VyYWJsZTohMH19O2ppLnByb3RvdHlwZS5nZXRBcmVhPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0V2lkdGgoKSp0aGlzLmdldEhlaWdodCgpfSxqaS5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKHQpe2lmKCEodCBpbnN0YW5jZW9mIGppKSlyZXR1cm4hMTt2YXIgZT10O3JldHVybiB0aGlzLmlzTnVsbCgpP2UuaXNOdWxsKCk6dGhpcy5fbWF4eD09PWUuZ2V0TWF4WCgpJiZ0aGlzLl9tYXh5PT09ZS5nZXRNYXhZKCkmJnRoaXMuX21pbng9PT1lLmdldE1pblgoKSYmdGhpcy5fbWlueT09PWUuZ2V0TWluWSgpfSxqaS5wcm90b3R5cGUuaW50ZXJzZWN0aW9uPWZ1bmN0aW9uKHQpe2lmKHRoaXMuaXNOdWxsKCl8fHQuaXNOdWxsKCl8fCF0aGlzLmludGVyc2VjdHModCkpcmV0dXJuIG5ldyBqaTt2YXIgZT10aGlzLl9taW54PnQuX21pbng/dGhpcy5fbWlueDp0Ll9taW54LG49dGhpcy5fbWlueT50Ll9taW55P3RoaXMuX21pbnk6dC5fbWlueSxyPXRoaXMuX21heHg8dC5fbWF4eD90aGlzLl9tYXh4OnQuX21heHgsaT10aGlzLl9tYXh5PHQuX21heHk/dGhpcy5fbWF4eTp0Ll9tYXh5O3JldHVybiBuZXcgamkoZSxyLG4saSl9LGppLnByb3RvdHlwZS5pc051bGw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWF4eDx0aGlzLl9taW54fSxqaS5wcm90b3R5cGUuZ2V0TWF4WD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXh4fSxqaS5wcm90b3R5cGUuY292ZXJzPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2Ygdmkpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5jb3ZlcnModC54LHQueSl9aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBqaSl7dmFyIGU9YXJndW1lbnRzWzBdO3JldHVybiF0aGlzLmlzTnVsbCgpJiYhZS5pc051bGwoKSYmKGUuZ2V0TWluWCgpPj10aGlzLl9taW54JiZlLmdldE1heFgoKTw9dGhpcy5fbWF4eCYmZS5nZXRNaW5ZKCk+PXRoaXMuX21pbnkmJmUuZ2V0TWF4WSgpPD10aGlzLl9tYXh5KX19ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIG49YXJndW1lbnRzWzBdLHI9YXJndW1lbnRzWzFdO3JldHVybiF0aGlzLmlzTnVsbCgpJiYobj49dGhpcy5fbWlueCYmbjw9dGhpcy5fbWF4eCYmcj49dGhpcy5fbWlueSYmcjw9dGhpcy5fbWF4eSl9fSxqaS5wcm90b3R5cGUuaW50ZXJzZWN0cz1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIGppKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIXRoaXMuaXNOdWxsKCkmJiF0LmlzTnVsbCgpJiYhKHQuX21pbng+dGhpcy5fbWF4eHx8dC5fbWF4eDx0aGlzLl9taW54fHx0Ll9taW55PnRoaXMuX21heHl8fHQuX21heHk8dGhpcy5fbWlueSl9aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB2aSl7dmFyIGU9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLmludGVyc2VjdHMoZS54LGUueSl9fWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXTtyZXR1cm4hdGhpcy5pc051bGwoKSYmIShuPnRoaXMuX21heHh8fG48dGhpcy5fbWlueHx8cj50aGlzLl9tYXh5fHxyPHRoaXMuX21pbnkpfX0samkucHJvdG90eXBlLmdldE1pblk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWlueX0samkucHJvdG90eXBlLmdldE1pblg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWlueH0samkucHJvdG90eXBlLmV4cGFuZFRvSW5jbHVkZT1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHZpKXt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5leHBhbmRUb0luY2x1ZGUodC54LHQueSl9ZWxzZSBpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIGppKXt2YXIgZT1hcmd1bWVudHNbMF07aWYoZS5pc051bGwoKSlyZXR1cm4gbnVsbDt0aGlzLmlzTnVsbCgpPyh0aGlzLl9taW54PWUuZ2V0TWluWCgpLHRoaXMuX21heHg9ZS5nZXRNYXhYKCksdGhpcy5fbWlueT1lLmdldE1pblkoKSx0aGlzLl9tYXh5PWUuZ2V0TWF4WSgpKTooZS5fbWlueDx0aGlzLl9taW54JiYodGhpcy5fbWlueD1lLl9taW54KSxlLl9tYXh4PnRoaXMuX21heHgmJih0aGlzLl9tYXh4PWUuX21heHgpLGUuX21pbnk8dGhpcy5fbWlueSYmKHRoaXMuX21pbnk9ZS5fbWlueSksZS5fbWF4eT50aGlzLl9tYXh5JiYodGhpcy5fbWF4eT1lLl9tYXh5KSl9fWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXTt0aGlzLmlzTnVsbCgpPyh0aGlzLl9taW54PW4sdGhpcy5fbWF4eD1uLHRoaXMuX21pbnk9cix0aGlzLl9tYXh5PXIpOihuPHRoaXMuX21pbngmJih0aGlzLl9taW54PW4pLG4+dGhpcy5fbWF4eCYmKHRoaXMuX21heHg9bikscjx0aGlzLl9taW55JiYodGhpcy5fbWlueT1yKSxyPnRoaXMuX21heHkmJih0aGlzLl9tYXh5PXIpKX19LGppLnByb3RvdHlwZS5taW5FeHRlbnQ9ZnVuY3Rpb24oKXtpZih0aGlzLmlzTnVsbCgpKXJldHVybiAwO3ZhciB0PXRoaXMuZ2V0V2lkdGgoKSxlPXRoaXMuZ2V0SGVpZ2h0KCk7cmV0dXJuIHQ8ZT90OmV9LGppLnByb3RvdHlwZS5nZXRXaWR0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzTnVsbCgpPzA6dGhpcy5fbWF4eC10aGlzLl9taW54fSxqaS5wcm90b3R5cGUuY29tcGFyZVRvPWZ1bmN0aW9uKHQpe3ZhciBlPXQ7cmV0dXJuIHRoaXMuaXNOdWxsKCk/ZS5pc051bGwoKT8wOi0xOmUuaXNOdWxsKCk/MTp0aGlzLl9taW54PGUuX21pbng/LTE6dGhpcy5fbWlueD5lLl9taW54PzE6dGhpcy5fbWlueTxlLl9taW55Py0xOnRoaXMuX21pbnk+ZS5fbWlueT8xOnRoaXMuX21heHg8ZS5fbWF4eD8tMTp0aGlzLl9tYXh4PmUuX21heHg/MTp0aGlzLl9tYXh5PGUuX21heHk/LTE6dGhpcy5fbWF4eT5lLl9tYXh5PzE6MH0samkucHJvdG90eXBlLnRyYW5zbGF0ZT1mdW5jdGlvbih0LGUpe2lmKHRoaXMuaXNOdWxsKCkpcmV0dXJuIG51bGw7dGhpcy5pbml0KHRoaXMuZ2V0TWluWCgpK3QsdGhpcy5nZXRNYXhYKCkrdCx0aGlzLmdldE1pblkoKStlLHRoaXMuZ2V0TWF4WSgpK2UpfSxqaS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iRW52WyIrdGhpcy5fbWlueCsiIDogIit0aGlzLl9tYXh4KyIsICIrdGhpcy5fbWlueSsiIDogIit0aGlzLl9tYXh5KyJdIn0samkucHJvdG90eXBlLnNldFRvTnVsbD1mdW5jdGlvbigpe3RoaXMuX21pbng9MCx0aGlzLl9tYXh4PS0xLHRoaXMuX21pbnk9MCx0aGlzLl9tYXh5PS0xfSxqaS5wcm90b3R5cGUuZ2V0SGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNOdWxsKCk/MDp0aGlzLl9tYXh5LXRoaXMuX21pbnl9LGppLnByb3RvdHlwZS5tYXhFeHRlbnQ9ZnVuY3Rpb24oKXtpZih0aGlzLmlzTnVsbCgpKXJldHVybiAwO3ZhciB0PXRoaXMuZ2V0V2lkdGgoKSxlPXRoaXMuZ2V0SGVpZ2h0KCk7cmV0dXJuIHQ+ZT90OmV9LGppLnByb3RvdHlwZS5leHBhbmRCeT1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5leHBhbmRCeSh0LHQpfWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTtpZih0aGlzLmlzTnVsbCgpKXJldHVybiBudWxsO3RoaXMuX21pbngtPWUsdGhpcy5fbWF4eCs9ZSx0aGlzLl9taW55LT1uLHRoaXMuX21heHkrPW4sKHRoaXMuX21pbng+dGhpcy5fbWF4eHx8dGhpcy5fbWlueT50aGlzLl9tYXh5KSYmdGhpcy5zZXRUb051bGwoKX19LGppLnByb3RvdHlwZS5jb250YWlucz1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIGppKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuY292ZXJzKHQpfWlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2Ygdmkpe3ZhciBlPWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5jb3ZlcnMoZSl9fWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXTtyZXR1cm4gdGhpcy5jb3ZlcnMobixyKX19LGppLnByb3RvdHlwZS5jZW50cmU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc051bGwoKT9udWxsOm5ldyB2aSgodGhpcy5nZXRNaW5YKCkrdGhpcy5nZXRNYXhYKCkpLzIsKHRoaXMuZ2V0TWluWSgpK3RoaXMuZ2V0TWF4WSgpKS8yKX0samkucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oKXtpZigwPT09YXJndW1lbnRzLmxlbmd0aCl0aGlzLnNldFRvTnVsbCgpO2Vsc2UgaWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2Ygdmkpe3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLmluaXQodC54LHQueCx0LnksdC55KX1lbHNlIGlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2Ygamkpe3ZhciBlPWFyZ3VtZW50c1swXTt0aGlzLl9taW54PWUuX21pbngsdGhpcy5fbWF4eD1lLl9tYXh4LHRoaXMuX21pbnk9ZS5fbWlueSx0aGlzLl9tYXh5PWUuX21heHl9fWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXTt0aGlzLmluaXQobi54LHIueCxuLnksci55KX1lbHNlIGlmKDQ9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgaT1hcmd1bWVudHNbMF0sbz1hcmd1bWVudHNbMV0scz1hcmd1bWVudHNbMl0sYT1hcmd1bWVudHNbM107aTxvPyh0aGlzLl9taW54PWksdGhpcy5fbWF4eD1vKToodGhpcy5fbWlueD1vLHRoaXMuX21heHg9aSksczxhPyh0aGlzLl9taW55PXMsdGhpcy5fbWF4eT1hKToodGhpcy5fbWlueT1hLHRoaXMuX21heHk9cyl9fSxqaS5wcm90b3R5cGUuZ2V0TWF4WT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXh5fSxqaS5wcm90b3R5cGUuZGlzdGFuY2U9ZnVuY3Rpb24odCl7aWYodGhpcy5pbnRlcnNlY3RzKHQpKXJldHVybiAwO3ZhciBlPTA7dGhpcy5fbWF4eDx0Ll9taW54P2U9dC5fbWlueC10aGlzLl9tYXh4OnRoaXMuX21pbng+dC5fbWF4eCYmKGU9dGhpcy5fbWlueC10Ll9tYXh4KTt2YXIgbj0wO3JldHVybiB0aGlzLl9tYXh5PHQuX21pbnk/bj10Ll9taW55LXRoaXMuX21heHk6dGhpcy5fbWlueT50Ll9tYXh5JiYobj10aGlzLl9taW55LXQuX21heHkpLDA9PT1lP246MD09PW4/ZTpNYXRoLnNxcnQoZSplK24qbil9LGppLnByb3RvdHlwZS5oYXNoQ29kZT1mdW5jdGlvbigpe3ZhciB0PTE3O3JldHVybiB0PTM3Kih0PTM3Kih0PTM3Kih0PTM3KnQrdmkuaGFzaENvZGUodGhpcy5fbWlueCkpK3ZpLmhhc2hDb2RlKHRoaXMuX21heHgpKSt2aS5oYXNoQ29kZSh0aGlzLl9taW55KSkrdmkuaGFzaENvZGUodGhpcy5fbWF4eSl9LGppLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltkaSxtaV19LGppLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBqaX0samkuaW50ZXJzZWN0cz1mdW5jdGlvbigpe2lmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV0sbj1hcmd1bWVudHNbMl07cmV0dXJuIG4ueD49KHQueDxlLng/dC54OmUueCkmJm4ueDw9KHQueD5lLng/dC54OmUueCkmJm4ueT49KHQueTxlLnk/dC55OmUueSkmJm4ueTw9KHQueT5lLnk/dC55OmUueSl9aWYoND09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciByPWFyZ3VtZW50c1swXSxpPWFyZ3VtZW50c1sxXSxvPWFyZ3VtZW50c1syXSxzPWFyZ3VtZW50c1szXSxhPU1hdGgubWluKG8ueCxzLngpLHU9TWF0aC5tYXgoby54LHMueCksYz1NYXRoLm1pbihyLngsaS54KSxsPU1hdGgubWF4KHIueCxpLngpO3JldHVybiEoYz51fHxsPGF8fChhPU1hdGgubWluKG8ueSxzLnkpLHU9TWF0aC5tYXgoby55LHMueSksYz1NYXRoLm1pbihyLnksaS55KSxsPU1hdGgubWF4KHIueSxpLnkpLGM+dSl8fGw8YSl9fSxVaS5zZXJpYWxWZXJzaW9uVUlELmdldD1mdW5jdGlvbigpe3JldHVybiAweDUxODQ1Y2Q1NTIxODk4MDB9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGppLFVpKTt2YXIgcWk9e3R5cGVTdHI6L15ccyooXHcrKVxzKlwoXHMqKC4qKVxzKlwpXHMqJC8sZW1wdHlUeXBlU3RyOi9eXHMqKFx3KylccypFTVBUWVxzKiQvLHNwYWNlczovXHMrLyxwYXJlbkNvbW1hOi9cKVxzKixccypcKC8sZG91YmxlUGFyZW5Db21tYTovXClccypcKVxzKixccypcKFxzKlwoLyx0cmltUGFyZW5zOi9eXHMqXCg/KC4qPylcKT9ccyokL30sVmk9ZnVuY3Rpb24odCl7dGhpcy5nZW9tZXRyeUZhY3Rvcnk9dHx8bmV3IElzfTtWaS5wcm90b3R5cGUucmVhZD1mdW5jdGlvbih0KXt2YXIgZSxuLHI7dD10LnJlcGxhY2UoL1tcblxyXS9nLCIgIik7dmFyIGk9cWkudHlwZVN0ci5leGVjKHQpO2lmKC0xIT09dC5zZWFyY2goIkVNUFRZIikmJigoaT1xaS5lbXB0eVR5cGVTdHIuZXhlYyh0KSlbMl09dm9pZCAwKSxpJiYobj1pWzFdLnRvTG93ZXJDYXNlKCkscj1pWzJdLFlpW25dJiYoZT1ZaVtuXS5hcHBseSh0aGlzLFtyXSkpKSx2b2lkIDA9PT1lKXRocm93IG5ldyBFcnJvcigiQ291bGQgbm90IHBhcnNlIFdLVCAiK3QpO3JldHVybiBlfSxWaS5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZXh0cmFjdEdlb21ldHJ5KHQpfSxWaS5wcm90b3R5cGUuZXh0cmFjdEdlb21ldHJ5PWZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0R2VvbWV0cnlUeXBlKCkudG9Mb3dlckNhc2UoKTtpZighR2lbZV0pcmV0dXJuIG51bGw7dmFyIG49ZS50b1VwcGVyQ2FzZSgpO3JldHVybiB0LmlzRW1wdHkoKT9uKyIgRU1QVFkiOm4rIigiK0dpW2VdLmFwcGx5KHRoaXMsW3RdKSsiKSJ9O3ZhciBHaT17Y29vcmRpbmF0ZTpmdW5jdGlvbih0KXtyZXR1cm4gdC54KyIgIit0Lnl9LHBvaW50OmZ1bmN0aW9uKHQpe3JldHVybiBHaS5jb29yZGluYXRlLmNhbGwodGhpcyx0Ll9jb29yZGluYXRlcy5fY29vcmRpbmF0ZXNbMF0pfSxtdWx0aXBvaW50OmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1bXSxuPTAscj10Ll9nZW9tZXRyaWVzLmxlbmd0aDtuPHI7KytuKWUucHVzaCgiKCIrR2kucG9pbnQuYXBwbHkodGhpcyxbdC5fZ2VvbWV0cmllc1tuXV0pKyIpIik7cmV0dXJuIGUuam9pbigiLCIpfSxsaW5lc3RyaW5nOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1bXSxuPTAscj10Ll9wb2ludHMuX2Nvb3JkaW5hdGVzLmxlbmd0aDtuPHI7KytuKWUucHVzaChHaS5jb29yZGluYXRlLmFwcGx5KHRoaXMsW3QuX3BvaW50cy5fY29vcmRpbmF0ZXNbbl1dKSk7cmV0dXJuIGUuam9pbigiLCIpfSxsaW5lYXJyaW5nOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1bXSxuPTAscj10Ll9wb2ludHMuX2Nvb3JkaW5hdGVzLmxlbmd0aDtuPHI7KytuKWUucHVzaChHaS5jb29yZGluYXRlLmFwcGx5KHRoaXMsW3QuX3BvaW50cy5fY29vcmRpbmF0ZXNbbl1dKSk7cmV0dXJuIGUuam9pbigiLCIpfSxtdWx0aWxpbmVzdHJpbmc6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLG49MCxyPXQuX2dlb21ldHJpZXMubGVuZ3RoO248cjsrK24pZS5wdXNoKCIoIitHaS5saW5lc3RyaW5nLmFwcGx5KHRoaXMsW3QuX2dlb21ldHJpZXNbbl1dKSsiKSIpO3JldHVybiBlLmpvaW4oIiwiKX0scG9seWdvbjpmdW5jdGlvbih0KXt2YXIgZT1bXTtlLnB1c2goIigiK0dpLmxpbmVzdHJpbmcuYXBwbHkodGhpcyxbdC5fc2hlbGxdKSsiKSIpO2Zvcih2YXIgbj0wLHI9dC5faG9sZXMubGVuZ3RoO248cjsrK24pZS5wdXNoKCIoIitHaS5saW5lc3RyaW5nLmFwcGx5KHRoaXMsW3QuX2hvbGVzW25dXSkrIikiKTtyZXR1cm4gZS5qb2luKCIsIil9LG11bHRpcG9seWdvbjpmdW5jdGlvbih0KXtmb3IodmFyIGU9W10sbj0wLHI9dC5fZ2VvbWV0cmllcy5sZW5ndGg7bjxyOysrbillLnB1c2goIigiK0dpLnBvbHlnb24uYXBwbHkodGhpcyxbdC5fZ2VvbWV0cmllc1tuXV0pKyIpIik7cmV0dXJuIGUuam9pbigiLCIpfSxnZW9tZXRyeWNvbGxlY3Rpb246ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLG49MCxyPXQuX2dlb21ldHJpZXMubGVuZ3RoO248cjsrK24pZS5wdXNoKHRoaXMuZXh0cmFjdEdlb21ldHJ5KHQuX2dlb21ldHJpZXNbbl0pKTtyZXR1cm4gZS5qb2luKCIsIil9fSxZaT17cG9pbnQ6ZnVuY3Rpb24odCl7aWYodm9pZCAwPT09dClyZXR1cm4gdGhpcy5nZW9tZXRyeUZhY3RvcnkuY3JlYXRlUG9pbnQoKTt2YXIgZT10LnRyaW0oKS5zcGxpdChxaS5zcGFjZXMpO3JldHVybiB0aGlzLmdlb21ldHJ5RmFjdG9yeS5jcmVhdGVQb2ludChuZXcgdmkoTnVtYmVyLnBhcnNlRmxvYXQoZVswXSksTnVtYmVyLnBhcnNlRmxvYXQoZVsxXSkpKX0sbXVsdGlwb2ludDpmdW5jdGlvbih0KXtpZih2b2lkIDA9PT10KXJldHVybiB0aGlzLmdlb21ldHJ5RmFjdG9yeS5jcmVhdGVNdWx0aVBvaW50KCk7Zm9yKHZhciBlLG49dC50cmltKCkuc3BsaXQoIiwiKSxyPVtdLGk9MCxvPW4ubGVuZ3RoO2k8bzsrK2kpZT1uW2ldLnJlcGxhY2UocWkudHJpbVBhcmVucywiJDEiKSxyLnB1c2goWWkucG9pbnQuYXBwbHkodGhpcyxbZV0pKTtyZXR1cm4gdGhpcy5nZW9tZXRyeUZhY3RvcnkuY3JlYXRlTXVsdGlQb2ludChyKX0sbGluZXN0cmluZzpmdW5jdGlvbih0KXtpZih2b2lkIDA9PT10KXJldHVybiB0aGlzLmdlb21ldHJ5RmFjdG9yeS5jcmVhdGVMaW5lU3RyaW5nKCk7Zm9yKHZhciBlLG49dC50cmltKCkuc3BsaXQoIiwiKSxyPVtdLGk9MCxvPW4ubGVuZ3RoO2k8bzsrK2kpZT1uW2ldLnRyaW0oKS5zcGxpdChxaS5zcGFjZXMpLHIucHVzaChuZXcgdmkoTnVtYmVyLnBhcnNlRmxvYXQoZVswXSksTnVtYmVyLnBhcnNlRmxvYXQoZVsxXSkpKTtyZXR1cm4gdGhpcy5nZW9tZXRyeUZhY3RvcnkuY3JlYXRlTGluZVN0cmluZyhyKX0sbGluZWFycmluZzpmdW5jdGlvbih0KXtpZih2b2lkIDA9PT10KXJldHVybiB0aGlzLmdlb21ldHJ5RmFjdG9yeS5jcmVhdGVMaW5lYXJSaW5nKCk7Zm9yKHZhciBlLG49dC50cmltKCkuc3BsaXQoIiwiKSxyPVtdLGk9MCxvPW4ubGVuZ3RoO2k8bzsrK2kpZT1uW2ldLnRyaW0oKS5zcGxpdChxaS5zcGFjZXMpLHIucHVzaChuZXcgdmkoTnVtYmVyLnBhcnNlRmxvYXQoZVswXSksTnVtYmVyLnBhcnNlRmxvYXQoZVsxXSkpKTtyZXR1cm4gdGhpcy5nZW9tZXRyeUZhY3RvcnkuY3JlYXRlTGluZWFyUmluZyhyKX0sbXVsdGlsaW5lc3RyaW5nOmZ1bmN0aW9uKHQpe2lmKHZvaWQgMD09PXQpcmV0dXJuIHRoaXMuZ2VvbWV0cnlGYWN0b3J5LmNyZWF0ZU11bHRpTGluZVN0cmluZygpO2Zvcih2YXIgZSxuPXQudHJpbSgpLnNwbGl0KHFpLnBhcmVuQ29tbWEpLHI9W10saT0wLG89bi5sZW5ndGg7aTxvOysraSllPW5baV0ucmVwbGFjZShxaS50cmltUGFyZW5zLCIkMSIpLHIucHVzaChZaS5saW5lc3RyaW5nLmFwcGx5KHRoaXMsW2VdKSk7cmV0dXJuIHRoaXMuZ2VvbWV0cnlGYWN0b3J5LmNyZWF0ZU11bHRpTGluZVN0cmluZyhyKX0scG9seWdvbjpmdW5jdGlvbih0KXtpZih2b2lkIDA9PT10KXJldHVybiB0aGlzLmdlb21ldHJ5RmFjdG9yeS5jcmVhdGVQb2x5Z29uKCk7Zm9yKHZhciBlLG4scixpLG89dC50cmltKCkuc3BsaXQocWkucGFyZW5Db21tYSkscz1bXSxhPTAsdT1vLmxlbmd0aDthPHU7KythKWU9b1thXS5yZXBsYWNlKHFpLnRyaW1QYXJlbnMsIiQxIiksbj1ZaS5saW5lc3RyaW5nLmFwcGx5KHRoaXMsW2VdKSxyPXRoaXMuZ2VvbWV0cnlGYWN0b3J5LmNyZWF0ZUxpbmVhclJpbmcobi5fcG9pbnRzKSwwPT09YT9pPXI6cy5wdXNoKHIpO3JldHVybiB0aGlzLmdlb21ldHJ5RmFjdG9yeS5jcmVhdGVQb2x5Z29uKGkscyl9LG11bHRpcG9seWdvbjpmdW5jdGlvbih0KXtpZih2b2lkIDA9PT10KXJldHVybiB0aGlzLmdlb21ldHJ5RmFjdG9yeS5jcmVhdGVNdWx0aVBvbHlnb24oKTtmb3IodmFyIGUsbj10LnRyaW0oKS5zcGxpdChxaS5kb3VibGVQYXJlbkNvbW1hKSxyPVtdLGk9MCxvPW4ubGVuZ3RoO2k8bzsrK2kpZT1uW2ldLnJlcGxhY2UocWkudHJpbVBhcmVucywiJDEiKSxyLnB1c2goWWkucG9seWdvbi5hcHBseSh0aGlzLFtlXSkpO3JldHVybiB0aGlzLmdlb21ldHJ5RmFjdG9yeS5jcmVhdGVNdWx0aVBvbHlnb24ocil9LGdlb21ldHJ5Y29sbGVjdGlvbjpmdW5jdGlvbih0KXtpZih2b2lkIDA9PT10KXJldHVybiB0aGlzLmdlb21ldHJ5RmFjdG9yeS5jcmVhdGVHZW9tZXRyeUNvbGxlY3Rpb24oKTtmb3IodmFyIGU9KHQ9dC5yZXBsYWNlKC8sXHMqKFtBLVphLXpdKS9nLCJ8JDEiKSkudHJpbSgpLnNwbGl0KCJ8Iiksbj1bXSxyPTAsaT1lLmxlbmd0aDtyPGk7KytyKW4ucHVzaCh0aGlzLnJlYWQoZVtyXSkpO3JldHVybiB0aGlzLmdlb21ldHJ5RmFjdG9yeS5jcmVhdGVHZW9tZXRyeUNvbGxlY3Rpb24obil9fSxYaT1mdW5jdGlvbih0KXt0aGlzLnBhcnNlcj1uZXcgVmkodCl9O1hpLnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5wYXJzZXIud3JpdGUodCl9LFhpLnRvTGluZVN0cmluZz1mdW5jdGlvbih0LGUpe2lmKDIhPT1hcmd1bWVudHMubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiTm90IGltcGxlbWVudGVkIik7cmV0dXJuIkxJTkVTVFJJTkcgKCAiK3QueCsiICIrdC55KyIsICIrZS54KyIgIitlLnkrIiApIn07dmFyIFdpPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dC5jYWxsKHRoaXMsZSksdGhpcy5uYW1lPSJSdW50aW1lRXhjZXB0aW9uIix0aGlzLm1lc3NhZ2U9ZSx0aGlzLnN0YWNrPShuZXcgdCkuc3RhY2t9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGV9KEVycm9yKSxIaT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7aWYodC5jYWxsKHRoaXMpLDA9PT1hcmd1bWVudHMubGVuZ3RoKXQuY2FsbCh0aGlzKTtlbHNlIGlmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF07dC5jYWxsKHRoaXMsZSl9fXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxlfShXaSksWmk9ZnVuY3Rpb24oKXt9O1ppLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxaaS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gWml9LFppLnNob3VsZE5ldmVyUmVhY2hIZXJlPWZ1bmN0aW9uKCl7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpWmkuc2hvdWxkTmV2ZXJSZWFjaEhlcmUobnVsbCk7ZWxzZSBpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3Rocm93IG5ldyBIaSgiU2hvdWxkIG5ldmVyIHJlYWNoIGhlcmUiKyhudWxsIT09dD8iOiAiK3Q6IiIpKX19LFppLmlzVHJ1ZT1mdW5jdGlvbigpe3ZhciB0O2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKVppLmlzVHJ1ZShhcmd1bWVudHNbMF0sbnVsbCk7ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCYmKHQ9YXJndW1lbnRzWzFdLCFhcmd1bWVudHNbMF0pKXRocm93IG51bGw9PT10P25ldyBIaTpuZXcgSGkodCl9LFppLmVxdWFscz1mdW5jdGlvbigpe3ZhciB0LGUsbjtpZigyPT09YXJndW1lbnRzLmxlbmd0aClaaS5lcXVhbHModD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV0sbnVsbCk7ZWxzZSBpZigzPT09YXJndW1lbnRzLmxlbmd0aCYmKHQ9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzJdLCEoZT1hcmd1bWVudHNbMV0pLmVxdWFscyh0KSkpdGhyb3cgbmV3IEhpKCJFeHBlY3RlZCAiK3QrIiBidXQgZW5jb3VudGVyZWQgIitlKyhudWxsIT09bj8iOiAiK246IiIpKX07dmFyIEtpPWZ1bmN0aW9uKCl7dGhpcy5fcmVzdWx0PW51bGwsdGhpcy5faW5wdXRMaW5lcz1BcnJheSgyKS5maWxsKCkubWFwKChmdW5jdGlvbigpe3JldHVybiBBcnJheSgyKX0pKSx0aGlzLl9pbnRQdD1uZXcgQXJyYXkoMikuZmlsbChudWxsKSx0aGlzLl9pbnRMaW5lSW5kZXg9bnVsbCx0aGlzLl9pc1Byb3Blcj1udWxsLHRoaXMuX3BhPW51bGwsdGhpcy5fcGI9bnVsbCx0aGlzLl9wcmVjaXNpb25Nb2RlbD1udWxsLHRoaXMuX2ludFB0WzBdPW5ldyB2aSx0aGlzLl9pbnRQdFsxXT1uZXcgdmksdGhpcy5fcGE9dGhpcy5faW50UHRbMF0sdGhpcy5fcGI9dGhpcy5faW50UHRbMV0sdGhpcy5fcmVzdWx0PTB9LEppPXtET05UX0lOVEVSU0VDVDp7Y29uZmlndXJhYmxlOiEwfSxET19JTlRFUlNFQ1Q6e2NvbmZpZ3VyYWJsZTohMH0sQ09MTElORUFSOntjb25maWd1cmFibGU6ITB9LE5PX0lOVEVSU0VDVElPTjp7Y29uZmlndXJhYmxlOiEwfSxQT0lOVF9JTlRFUlNFQ1RJT046e2NvbmZpZ3VyYWJsZTohMH0sQ09MTElORUFSX0lOVEVSU0VDVElPTjp7Y29uZmlndXJhYmxlOiEwfX07S2kucHJvdG90eXBlLmdldEluZGV4QWxvbmdTZWdtZW50PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuY29tcHV0ZUludExpbmVJbmRleCgpLHRoaXMuX2ludExpbmVJbmRleFt0XVtlXX0sS2kucHJvdG90eXBlLmdldFRvcG9sb2d5U3VtbWFyeT1mdW5jdGlvbigpe3ZhciB0PW5ldyBBaTtyZXR1cm4gdGhpcy5pc0VuZFBvaW50KCkmJnQuYXBwZW5kKCIgZW5kcG9pbnQiKSx0aGlzLl9pc1Byb3BlciYmdC5hcHBlbmQoIiBwcm9wZXIiKSx0aGlzLmlzQ29sbGluZWFyKCkmJnQuYXBwZW5kKCIgY29sbGluZWFyIiksdC50b1N0cmluZygpfSxLaS5wcm90b3R5cGUuY29tcHV0ZUludGVyc2VjdGlvbj1mdW5jdGlvbih0LGUsbixyKXt0aGlzLl9pbnB1dExpbmVzWzBdWzBdPXQsdGhpcy5faW5wdXRMaW5lc1swXVsxXT1lLHRoaXMuX2lucHV0TGluZXNbMV1bMF09bix0aGlzLl9pbnB1dExpbmVzWzFdWzFdPXIsdGhpcy5fcmVzdWx0PXRoaXMuY29tcHV0ZUludGVyc2VjdCh0LGUsbixyKX0sS2kucHJvdG90eXBlLmdldEludGVyc2VjdGlvbk51bT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yZXN1bHR9LEtpLnByb3RvdHlwZS5jb21wdXRlSW50TGluZUluZGV4PWZ1bmN0aW9uKCl7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpbnVsbD09PXRoaXMuX2ludExpbmVJbmRleCYmKHRoaXMuX2ludExpbmVJbmRleD1BcnJheSgyKS5maWxsKCkubWFwKChmdW5jdGlvbigpe3JldHVybiBBcnJheSgyKX0pKSx0aGlzLmNvbXB1dGVJbnRMaW5lSW5kZXgoMCksdGhpcy5jb21wdXRlSW50TGluZUluZGV4KDEpKTtlbHNlIGlmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5nZXRFZGdlRGlzdGFuY2UodCwwKT50aGlzLmdldEVkZ2VEaXN0YW5jZSh0LDEpPyh0aGlzLl9pbnRMaW5lSW5kZXhbdF1bMF09MCx0aGlzLl9pbnRMaW5lSW5kZXhbdF1bMV09MSk6KHRoaXMuX2ludExpbmVJbmRleFt0XVswXT0xLHRoaXMuX2ludExpbmVJbmRleFt0XVsxXT0wKX19LEtpLnByb3RvdHlwZS5pc1Byb3Blcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmhhc0ludGVyc2VjdGlvbigpJiZ0aGlzLl9pc1Byb3Blcn0sS2kucHJvdG90eXBlLnNldFByZWNpc2lvbk1vZGVsPWZ1bmN0aW9uKHQpe3RoaXMuX3ByZWNpc2lvbk1vZGVsPXR9LEtpLnByb3RvdHlwZS5pc0ludGVyaW9ySW50ZXJzZWN0aW9uPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztpZigwPT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4hKCF0aGlzLmlzSW50ZXJpb3JJbnRlcnNlY3Rpb24oMCkmJiF0aGlzLmlzSW50ZXJpb3JJbnRlcnNlY3Rpb24oMSkpO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtmb3IodmFyIGU9YXJndW1lbnRzWzBdLG49MDtuPHRoaXMuX3Jlc3VsdDtuKyspaWYoIXQuX2ludFB0W25dLmVxdWFsczJEKHQuX2lucHV0TGluZXNbZV1bMF0pJiYhdC5faW50UHRbbl0uZXF1YWxzMkQodC5faW5wdXRMaW5lc1tlXVsxXSkpcmV0dXJuITA7cmV0dXJuITF9fSxLaS5wcm90b3R5cGUuZ2V0SW50ZXJzZWN0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9pbnRQdFt0XX0sS2kucHJvdG90eXBlLmlzRW5kUG9pbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYXNJbnRlcnNlY3Rpb24oKSYmIXRoaXMuX2lzUHJvcGVyfSxLaS5wcm90b3R5cGUuaGFzSW50ZXJzZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Jlc3VsdCE9PUtpLk5PX0lOVEVSU0VDVElPTn0sS2kucHJvdG90eXBlLmdldEVkZ2VEaXN0YW5jZT1mdW5jdGlvbih0LGUpe3JldHVybiBLaS5jb21wdXRlRWRnZURpc3RhbmNlKHRoaXMuX2ludFB0W2VdLHRoaXMuX2lucHV0TGluZXNbdF1bMF0sdGhpcy5faW5wdXRMaW5lc1t0XVsxXSl9LEtpLnByb3RvdHlwZS5pc0NvbGxpbmVhcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yZXN1bHQ9PT1LaS5DT0xMSU5FQVJfSU5URVJTRUNUSU9OfSxLaS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gWGkudG9MaW5lU3RyaW5nKHRoaXMuX2lucHV0TGluZXNbMF1bMF0sdGhpcy5faW5wdXRMaW5lc1swXVsxXSkrIiAtICIrWGkudG9MaW5lU3RyaW5nKHRoaXMuX2lucHV0TGluZXNbMV1bMF0sdGhpcy5faW5wdXRMaW5lc1sxXVsxXSkrdGhpcy5nZXRUb3BvbG9neVN1bW1hcnkoKX0sS2kucHJvdG90eXBlLmdldEVuZHBvaW50PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2lucHV0TGluZXNbdF1bZV19LEtpLnByb3RvdHlwZS5pc0ludGVyc2VjdGlvbj1mdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPHRoaXMuX3Jlc3VsdDtlKyspaWYodGhpcy5faW50UHRbZV0uZXF1YWxzMkQodCkpcmV0dXJuITA7cmV0dXJuITF9LEtpLnByb3RvdHlwZS5nZXRJbnRlcnNlY3Rpb25BbG9uZ1NlZ21lbnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5jb21wdXRlSW50TGluZUluZGV4KCksdGhpcy5faW50UHRbdGhpcy5faW50TGluZUluZGV4W3RdW2VdXX0sS2kucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LEtpLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBLaX0sS2kuY29tcHV0ZUVkZ2VEaXN0YW5jZT1mdW5jdGlvbih0LGUsbil7dmFyIHI9TWF0aC5hYnMobi54LWUueCksaT1NYXRoLmFicyhuLnktZS55KSxvPS0xO2lmKHQuZXF1YWxzKGUpKW89MDtlbHNlIGlmKHQuZXF1YWxzKG4pKW89cj5pP3I6aTtlbHNle3ZhciBzPU1hdGguYWJzKHQueC1lLngpLGE9TWF0aC5hYnModC55LWUueSk7MD09PShvPXI+aT9zOmEpJiYhdC5lcXVhbHMoZSkmJihvPU1hdGgubWF4KHMsYSkpfXJldHVybiBaaS5pc1RydWUoISgwPT09byYmIXQuZXF1YWxzKGUpKSwiQmFkIGRpc3RhbmNlIGNhbGN1bGF0aW9uIiksb30sS2kubm9uUm9idXN0Q29tcHV0ZUVkZ2VEaXN0YW5jZT1mdW5jdGlvbih0LGUsbil7dmFyIHI9dC54LWUueCxpPXQueS1lLnksbz1NYXRoLnNxcnQocipyK2kqaSk7cmV0dXJuIFppLmlzVHJ1ZSghKDA9PT1vJiYhdC5lcXVhbHMoZSkpLCJJbnZhbGlkIGRpc3RhbmNlIGNhbGN1bGF0aW9uIiksb30sSmkuRE9OVF9JTlRFUlNFQ1QuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDB9LEppLkRPX0lOVEVSU0VDVC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMX0sSmkuQ09MTElORUFSLmdldD1mdW5jdGlvbigpe3JldHVybiAyfSxKaS5OT19JTlRFUlNFQ1RJT04uZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDB9LEppLlBPSU5UX0lOVEVSU0VDVElPTi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMX0sSmkuQ09MTElORUFSX0lOVEVSU0VDVElPTi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMn0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoS2ksSmkpO3ZhciBRaT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmlzSW5TZWdtZW50RW52ZWxvcGVzPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBqaSh0aGlzLl9pbnB1dExpbmVzWzBdWzBdLHRoaXMuX2lucHV0TGluZXNbMF1bMV0pLG49bmV3IGppKHRoaXMuX2lucHV0TGluZXNbMV1bMF0sdGhpcy5faW5wdXRMaW5lc1sxXVsxXSk7cmV0dXJuIGUuY29udGFpbnModCkmJm4uY29udGFpbnModCl9LGUucHJvdG90eXBlLmNvbXB1dGVJbnRlcnNlY3Rpb249ZnVuY3Rpb24oKXtpZigzIT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdC5wcm90b3R5cGUuY29tcHV0ZUludGVyc2VjdGlvbi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdLHI9YXJndW1lbnRzWzJdO2lmKHRoaXMuX2lzUHJvcGVyPSExLGppLmludGVyc2VjdHMobixyLGUpJiYwPT09ZW8ub3JpZW50YXRpb25JbmRleChuLHIsZSkmJjA9PT1lby5vcmllbnRhdGlvbkluZGV4KHIsbixlKSlyZXR1cm4gdGhpcy5faXNQcm9wZXI9ITAsKGUuZXF1YWxzKG4pfHxlLmVxdWFscyhyKSkmJih0aGlzLl9pc1Byb3Blcj0hMSksdGhpcy5fcmVzdWx0PXQuUE9JTlRfSU5URVJTRUNUSU9OLG51bGw7dGhpcy5fcmVzdWx0PXQuTk9fSU5URVJTRUNUSU9OfSxlLnByb3RvdHlwZS5ub3JtYWxpemVUb01pbmltdW09ZnVuY3Rpb24odCxlLG4scixpKXtpLng9dGhpcy5zbWFsbGVzdEluQWJzVmFsdWUodC54LGUueCxuLngsci54KSxpLnk9dGhpcy5zbWFsbGVzdEluQWJzVmFsdWUodC55LGUueSxuLnksci55KSx0LngtPWkueCx0LnktPWkueSxlLngtPWkueCxlLnktPWkueSxuLngtPWkueCxuLnktPWkueSxyLngtPWkueCxyLnktPWkueX0sZS5wcm90b3R5cGUuc2FmZUhDb29yZGluYXRlSW50ZXJzZWN0aW9uPWZ1bmN0aW9uKHQsbixyLGkpe3ZhciBvPW51bGw7dHJ5e289emkuaW50ZXJzZWN0aW9uKHQsbixyLGkpfWNhdGNoKHMpe2lmKCEocyBpbnN0YW5jZW9mIEJpKSl0aHJvdyBzO289ZS5uZWFyZXN0RW5kcG9pbnQodCxuLHIsaSl9cmV0dXJuIG99LGUucHJvdG90eXBlLmludGVyc2VjdGlvbj1mdW5jdGlvbih0LG4scixpKXt2YXIgbz10aGlzLmludGVyc2VjdGlvbldpdGhOb3JtYWxpemF0aW9uKHQsbixyLGkpO3JldHVybiB0aGlzLmlzSW5TZWdtZW50RW52ZWxvcGVzKG8pfHwobz1uZXcgdmkoZS5uZWFyZXN0RW5kcG9pbnQodCxuLHIsaSkpKSxudWxsIT09dGhpcy5fcHJlY2lzaW9uTW9kZWwmJnRoaXMuX3ByZWNpc2lvbk1vZGVsLm1ha2VQcmVjaXNlKG8pLG99LGUucHJvdG90eXBlLnNtYWxsZXN0SW5BYnNWYWx1ZT1mdW5jdGlvbih0LGUsbixyKXt2YXIgaT10LG89TWF0aC5hYnMoaSk7cmV0dXJuIE1hdGguYWJzKGUpPG8mJihpPWUsbz1NYXRoLmFicyhlKSksTWF0aC5hYnMobik8byYmKGk9bixvPU1hdGguYWJzKG4pKSxNYXRoLmFicyhyKTxvJiYoaT1yKSxpfSxlLnByb3RvdHlwZS5jaGVja0REPWZ1bmN0aW9uKHQsZSxuLHIsaSl7dmFyIG89VGkuaW50ZXJzZWN0aW9uKHQsZSxuLHIpLHM9dGhpcy5pc0luU2VnbWVudEVudmVsb3BlcyhvKTtraS5vdXQucHJpbnRsbigiREQgaW4gZW52ID0gIitzKyIgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAiK28pLGkuZGlzdGFuY2Uobyk+MWUtNCYma2kub3V0LnByaW50bG4oIkRpc3RhbmNlID0gIitpLmRpc3RhbmNlKG8pKX0sZS5wcm90b3R5cGUuaW50ZXJzZWN0aW9uV2l0aE5vcm1hbGl6YXRpb249ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9bmV3IHZpKHQpLG89bmV3IHZpKGUpLHM9bmV3IHZpKG4pLGE9bmV3IHZpKHIpLHU9bmV3IHZpO3RoaXMubm9ybWFsaXplVG9FbnZDZW50cmUoaSxvLHMsYSx1KTt2YXIgYz10aGlzLnNhZmVIQ29vcmRpbmF0ZUludGVyc2VjdGlvbihpLG8scyxhKTtyZXR1cm4gYy54Kz11LngsYy55Kz11LnksY30sZS5wcm90b3R5cGUuY29tcHV0ZUNvbGxpbmVhckludGVyc2VjdGlvbj1mdW5jdGlvbihlLG4scixpKXt2YXIgbz1qaS5pbnRlcnNlY3RzKGUsbixyKSxzPWppLmludGVyc2VjdHMoZSxuLGkpLGE9amkuaW50ZXJzZWN0cyhyLGksZSksdT1qaS5pbnRlcnNlY3RzKHIsaSxuKTtyZXR1cm4gbyYmcz8odGhpcy5faW50UHRbMF09cix0aGlzLl9pbnRQdFsxXT1pLHQuQ09MTElORUFSX0lOVEVSU0VDVElPTik6YSYmdT8odGhpcy5faW50UHRbMF09ZSx0aGlzLl9pbnRQdFsxXT1uLHQuQ09MTElORUFSX0lOVEVSU0VDVElPTik6byYmYT8odGhpcy5faW50UHRbMF09cix0aGlzLl9pbnRQdFsxXT1lLCFyLmVxdWFscyhlKXx8c3x8dT90LkNPTExJTkVBUl9JTlRFUlNFQ1RJT046dC5QT0lOVF9JTlRFUlNFQ1RJT04pOm8mJnU/KHRoaXMuX2ludFB0WzBdPXIsdGhpcy5faW50UHRbMV09biwhci5lcXVhbHMobil8fHN8fGE/dC5DT0xMSU5FQVJfSU5URVJTRUNUSU9OOnQuUE9JTlRfSU5URVJTRUNUSU9OKTpzJiZhPyh0aGlzLl9pbnRQdFswXT1pLHRoaXMuX2ludFB0WzFdPWUsIWkuZXF1YWxzKGUpfHxvfHx1P3QuQ09MTElORUFSX0lOVEVSU0VDVElPTjp0LlBPSU5UX0lOVEVSU0VDVElPTik6cyYmdT8odGhpcy5faW50UHRbMF09aSx0aGlzLl9pbnRQdFsxXT1uLCFpLmVxdWFscyhuKXx8b3x8YT90LkNPTExJTkVBUl9JTlRFUlNFQ1RJT046dC5QT0lOVF9JTlRFUlNFQ1RJT04pOnQuTk9fSU5URVJTRUNUSU9OfSxlLnByb3RvdHlwZS5ub3JtYWxpemVUb0VudkNlbnRyZT1mdW5jdGlvbih0LGUsbixyLGkpe3ZhciBvPXQueDxlLng/dC54OmUueCxzPXQueTxlLnk/dC55OmUueSxhPXQueD5lLng/dC54OmUueCx1PXQueT5lLnk/dC55OmUueSxjPW4ueDxyLng/bi54OnIueCxsPW4ueTxyLnk/bi55OnIueSxoPW4ueD5yLng/bi54OnIueCxmPW4ueT5yLnk/bi55OnIueSxwPSgobz5jP286YykrKGE8aD9hOmgpKS8yLGQ9KChzPmw/czpsKSsodTxmP3U6ZikpLzI7aS54PXAsaS55PWQsdC54LT1pLngsdC55LT1pLnksZS54LT1pLngsZS55LT1pLnksbi54LT1pLngsbi55LT1pLnksci54LT1pLngsci55LT1pLnl9LGUucHJvdG90eXBlLmNvbXB1dGVJbnRlcnNlY3Q9ZnVuY3Rpb24oZSxuLHIsaSl7aWYodGhpcy5faXNQcm9wZXI9ITEsIWppLmludGVyc2VjdHMoZSxuLHIsaSkpcmV0dXJuIHQuTk9fSU5URVJTRUNUSU9OO3ZhciBvPWVvLm9yaWVudGF0aW9uSW5kZXgoZSxuLHIpLHM9ZW8ub3JpZW50YXRpb25JbmRleChlLG4saSk7aWYobz4wJiZzPjB8fG88MCYmczwwKXJldHVybiB0Lk5PX0lOVEVSU0VDVElPTjt2YXIgYT1lby5vcmllbnRhdGlvbkluZGV4KHIsaSxlKSx1PWVvLm9yaWVudGF0aW9uSW5kZXgocixpLG4pO3JldHVybiBhPjAmJnU+MHx8YTwwJiZ1PDA/dC5OT19JTlRFUlNFQ1RJT046MD09PW8mJjA9PT1zJiYwPT09YSYmMD09PXU/dGhpcy5jb21wdXRlQ29sbGluZWFySW50ZXJzZWN0aW9uKGUsbixyLGkpOigwPT09b3x8MD09PXN8fDA9PT1hfHwwPT09dT8odGhpcy5faXNQcm9wZXI9ITEsZS5lcXVhbHMyRChyKXx8ZS5lcXVhbHMyRChpKT90aGlzLl9pbnRQdFswXT1lOm4uZXF1YWxzMkQocil8fG4uZXF1YWxzMkQoaSk/dGhpcy5faW50UHRbMF09bjowPT09bz90aGlzLl9pbnRQdFswXT1uZXcgdmkocik6MD09PXM/dGhpcy5faW50UHRbMF09bmV3IHZpKGkpOjA9PT1hP3RoaXMuX2ludFB0WzBdPW5ldyB2aShlKTowPT09dSYmKHRoaXMuX2ludFB0WzBdPW5ldyB2aShuKSkpOih0aGlzLl9pc1Byb3Blcj0hMCx0aGlzLl9pbnRQdFswXT10aGlzLmludGVyc2VjdGlvbihlLG4scixpKSksdC5QT0lOVF9JTlRFUlNFQ1RJT04pfSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxlLm5lYXJlc3RFbmRwb2ludD1mdW5jdGlvbih0LGUsbixyKXt2YXIgaT10LG89ZW8uZGlzdGFuY2VQb2ludExpbmUodCxuLHIpLHM9ZW8uZGlzdGFuY2VQb2ludExpbmUoZSxuLHIpO3JldHVybiBzPG8mJihvPXMsaT1lKSwocz1lby5kaXN0YW5jZVBvaW50TGluZShuLHQsZSkpPG8mJihvPXMsaT1uKSwocz1lby5kaXN0YW5jZVBvaW50TGluZShyLHQsZSkpPG8mJihvPXMsaT1yKSxpfSxlfShLaSksJGk9ZnVuY3Rpb24oKXt9OyRpLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSwkaS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gJGl9LCRpLm9yaWVudGF0aW9uSW5kZXg9ZnVuY3Rpb24odCxlLG4pe3ZhciByPWUueC10LngsaT1lLnktdC55LG89bi54LWUueCxzPW4ueS1lLnk7cmV0dXJuICRpLnNpZ25PZkRldDJ4MihyLGksbyxzKX0sJGkuc2lnbk9mRGV0MngyPWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPW51bGwsbz1udWxsLHM9bnVsbDtpZihpPTEsMD09PXR8fDA9PT1yKXJldHVybiAwPT09ZXx8MD09PW4/MDplPjA/bj4wPy1pOmk6bj4wP2k6LWk7aWYoMD09PWV8fDA9PT1uKXJldHVybiByPjA/dD4wP2k6LWk6dD4wPy1pOmk7aWYoZT4wP3I+MD9lPD1yfHwoaT0taSxvPXQsdD1uLG49byxvPWUsZT1yLHI9byk6ZTw9LXI/KGk9LWksbj0tbixyPS1yKToobz10LHQ9LW4sbj1vLG89ZSxlPS1yLHI9byk6cj4wPy1lPD1yPyhpPS1pLHQ9LXQsZT0tZSk6KG89LXQsdD1uLG49byxvPS1lLGU9cixyPW8pOmU+PXI/KHQ9LXQsZT0tZSxuPS1uLHI9LXIpOihpPS1pLG89LXQsdD0tbixuPW8sbz0tZSxlPS1yLHI9byksdD4wKXtpZighKG4+MCkpcmV0dXJuIGk7aWYoISh0PD1uKSlyZXR1cm4gaX1lbHNle2lmKG4+MClyZXR1cm4taTtpZighKHQ+PW4pKXJldHVybi1pO2k9LWksdD0tdCxuPS1ufWZvcig7Oyl7aWYoKHItPShzPU1hdGguZmxvb3Iobi90KSkqZSk8MClyZXR1cm4taTtpZihyPmUpcmV0dXJuIGk7aWYodD4obi09cyp0KStuKXtpZihlPHIrcilyZXR1cm4gaX1lbHNle2lmKGU+cityKXJldHVybi1pO249dC1uLHI9ZS1yLGk9LWl9aWYoMD09PXIpcmV0dXJuIDA9PT1uPzA6LWk7aWYoMD09PW58fCh0LT0ocz1NYXRoLmZsb29yKHQvbikpKm4sKGUtPXMqcik8MCkpcmV0dXJuIGk7aWYoZT5yKXJldHVybi1pO2lmKG4+dCt0KXtpZihyPGUrZSlyZXR1cm4taX1lbHNle2lmKHI+ZStlKXJldHVybiBpO3Q9bi10LGU9ci1lLGk9LWl9aWYoMD09PWUpcmV0dXJuIDA9PT10PzA6aTtpZigwPT09dClyZXR1cm4taX19O3ZhciB0bz1mdW5jdGlvbigpe3RoaXMuX3A9bnVsbCx0aGlzLl9jcm9zc2luZ0NvdW50PTAsdGhpcy5faXNQb2ludE9uU2VnbWVudD0hMTt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5fcD10fTt0by5wcm90b3R5cGUuY291bnRTZWdtZW50PWZ1bmN0aW9uKHQsZSl7aWYodC54PHRoaXMuX3AueCYmZS54PHRoaXMuX3AueClyZXR1cm4gbnVsbDtpZih0aGlzLl9wLng9PT1lLngmJnRoaXMuX3AueT09PWUueSlyZXR1cm4gdGhpcy5faXNQb2ludE9uU2VnbWVudD0hMCxudWxsO2lmKHQueT09PXRoaXMuX3AueSYmZS55PT09dGhpcy5fcC55KXt2YXIgbj10Lngscj1lLng7cmV0dXJuIG4+ciYmKG49ZS54LHI9dC54KSx0aGlzLl9wLng+PW4mJnRoaXMuX3AueDw9ciYmKHRoaXMuX2lzUG9pbnRPblNlZ21lbnQ9ITApLG51bGx9aWYodC55PnRoaXMuX3AueSYmZS55PD10aGlzLl9wLnl8fGUueT50aGlzLl9wLnkmJnQueTw9dGhpcy5fcC55KXt2YXIgaT10LngtdGhpcy5fcC54LG89dC55LXRoaXMuX3AueSxzPWUueC10aGlzLl9wLngsYT1lLnktdGhpcy5fcC55LHU9JGkuc2lnbk9mRGV0MngyKGksbyxzLGEpO2lmKDA9PT11KXJldHVybiB0aGlzLl9pc1BvaW50T25TZWdtZW50PSEwLG51bGw7YTxvJiYodT0tdSksdT4wJiZ0aGlzLl9jcm9zc2luZ0NvdW50Kyt9fSx0by5wcm90b3R5cGUuaXNQb2ludEluUG9seWdvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldExvY2F0aW9uKCkhPT1iaS5FWFRFUklPUn0sdG8ucHJvdG90eXBlLmdldExvY2F0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzUG9pbnRPblNlZ21lbnQ/YmkuQk9VTkRBUlk6dGhpcy5fY3Jvc3NpbmdDb3VudCUyPT0xP2JpLklOVEVSSU9SOmJpLkVYVEVSSU9SfSx0by5wcm90b3R5cGUuaXNPblNlZ21lbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNQb2ludE9uU2VnbWVudH0sdG8ucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LHRvLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiB0b30sdG8ubG9jYXRlUG9pbnRJblJpbmc9ZnVuY3Rpb24oKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHZpJiZFaShhcmd1bWVudHNbMV0sTGkpKXtmb3IodmFyIHQ9YXJndW1lbnRzWzFdLGU9bmV3IHRvKGFyZ3VtZW50c1swXSksbj1uZXcgdmkscj1uZXcgdmksaT0xO2k8dC5zaXplKCk7aSsrKWlmKHQuZ2V0Q29vcmRpbmF0ZShpLG4pLHQuZ2V0Q29vcmRpbmF0ZShpLTEsciksZS5jb3VudFNlZ21lbnQobixyKSxlLmlzT25TZWdtZW50KCkpcmV0dXJuIGUuZ2V0TG9jYXRpb24oKTtyZXR1cm4gZS5nZXRMb2NhdGlvbigpfWlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgdmkmJmFyZ3VtZW50c1sxXWluc3RhbmNlb2YgQXJyYXkpe2Zvcih2YXIgbz1hcmd1bWVudHNbMV0scz1uZXcgdG8oYXJndW1lbnRzWzBdKSxhPTE7YTxvLmxlbmd0aDthKyspe3ZhciB1PW9bYV0sYz1vW2EtMV07aWYocy5jb3VudFNlZ21lbnQodSxjKSxzLmlzT25TZWdtZW50KCkpcmV0dXJuIHMuZ2V0TG9jYXRpb24oKX1yZXR1cm4gcy5nZXRMb2NhdGlvbigpfX07dmFyIGVvPWZ1bmN0aW9uKCl7fSxubz17Q0xPQ0tXSVNFOntjb25maWd1cmFibGU6ITB9LFJJR0hUOntjb25maWd1cmFibGU6ITB9LENPVU5URVJDTE9DS1dJU0U6e2NvbmZpZ3VyYWJsZTohMH0sTEVGVDp7Y29uZmlndXJhYmxlOiEwfSxDT0xMSU5FQVI6e2NvbmZpZ3VyYWJsZTohMH0sU1RSQUlHSFQ6e2NvbmZpZ3VyYWJsZTohMH19O2VvLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxlby5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZW99LGVvLm9yaWVudGF0aW9uSW5kZXg9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBUaS5vcmllbnRhdGlvbkluZGV4KHQsZSxuKX0sZW8uc2lnbmVkQXJlYT1mdW5jdGlvbigpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgQXJyYXkpe3ZhciB0PWFyZ3VtZW50c1swXTtpZih0Lmxlbmd0aDwzKXJldHVybiAwO2Zvcih2YXIgZT0wLG49dFswXS54LHI9MTtyPHQubGVuZ3RoLTE7cisrKXt2YXIgaT10W3JdLngtbixvPXRbcisxXS55O2UrPWkqKHRbci0xXS55LW8pfXJldHVybiBlLzJ9aWYoRWkoYXJndW1lbnRzWzBdLExpKSl7dmFyIHM9YXJndW1lbnRzWzBdLGE9cy5zaXplKCk7aWYoYTwzKXJldHVybiAwO3ZhciB1PW5ldyB2aSxjPW5ldyB2aSxsPW5ldyB2aTtzLmdldENvb3JkaW5hdGUoMCxjKSxzLmdldENvb3JkaW5hdGUoMSxsKTt2YXIgaD1jLng7bC54LT1oO2Zvcih2YXIgZj0wLHA9MTtwPGEtMTtwKyspdS55PWMueSxjLng9bC54LGMueT1sLnkscy5nZXRDb29yZGluYXRlKHArMSxsKSxsLngtPWgsZis9Yy54Kih1LnktbC55KTtyZXR1cm4gZi8yfX0sZW8uZGlzdGFuY2VMaW5lTGluZT1mdW5jdGlvbih0LGUsbixyKXtpZih0LmVxdWFscyhlKSlyZXR1cm4gZW8uZGlzdGFuY2VQb2ludExpbmUodCxuLHIpO2lmKG4uZXF1YWxzKHIpKXJldHVybiBlby5kaXN0YW5jZVBvaW50TGluZShyLHQsZSk7dmFyIGk9ITE7aWYoamkuaW50ZXJzZWN0cyh0LGUsbixyKSl7dmFyIG89KGUueC10LngpKihyLnktbi55KS0oZS55LXQueSkqKHIueC1uLngpO2lmKDA9PT1vKWk9ITA7ZWxzZXt2YXIgcz0odC55LW4ueSkqKHIueC1uLngpLSh0Lngtbi54KSooci55LW4ueSksYT0oKHQueS1uLnkpKihlLngtdC54KS0odC54LW4ueCkqKGUueS10LnkpKS9vLHU9cy9vOyh1PDB8fHU+MXx8YTwwfHxhPjEpJiYoaT0hMCl9fWVsc2UgaT0hMDtyZXR1cm4gaT9DaS5taW4oZW8uZGlzdGFuY2VQb2ludExpbmUodCxuLHIpLGVvLmRpc3RhbmNlUG9pbnRMaW5lKGUsbixyKSxlby5kaXN0YW5jZVBvaW50TGluZShuLHQsZSksZW8uZGlzdGFuY2VQb2ludExpbmUocix0LGUpKTowfSxlby5pc1BvaW50SW5SaW5nPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGVvLmxvY2F0ZVBvaW50SW5SaW5nKHQsZSkhPT1iaS5FWFRFUklPUn0sZW8uY29tcHV0ZUxlbmd0aD1mdW5jdGlvbih0KXt2YXIgZT10LnNpemUoKTtpZihlPD0xKXJldHVybiAwO3ZhciBuPTAscj1uZXcgdmk7dC5nZXRDb29yZGluYXRlKDAscik7Zm9yKHZhciBpPXIueCxvPXIueSxzPTE7czxlO3MrKyl7dC5nZXRDb29yZGluYXRlKHMscik7dmFyIGE9ci54LHU9ci55LGM9YS1pLGw9dS1vO24rPU1hdGguc3FydChjKmMrbCpsKSxpPWEsbz11fXJldHVybiBufSxlby5pc0NDVz1mdW5jdGlvbih0KXt2YXIgZT10Lmxlbmd0aC0xO2lmKGU8Myl0aHJvdyBuZXcgaGk7Zm9yKHZhciBuPXRbMF0scj0wLGk9MTtpPD1lO2krKyl7dmFyIG89dFtpXTtvLnk+bi55JiYobj1vLHI9aSl9dmFyIHM9cjtkb3socy09MSk8MCYmKHM9ZSl9d2hpbGUodFtzXS5lcXVhbHMyRChuKSYmcyE9PXIpO3ZhciBhPXI7ZG97YT0oYSsxKSVlfXdoaWxlKHRbYV0uZXF1YWxzMkQobikmJmEhPT1yKTt2YXIgdT10W3NdLGM9dFthXTtpZih1LmVxdWFsczJEKG4pfHxjLmVxdWFsczJEKG4pfHx1LmVxdWFsczJEKGMpKXJldHVybiExO3ZhciBsPWVvLmNvbXB1dGVPcmllbnRhdGlvbih1LG4sYyk7cmV0dXJuIDA9PT1sP3UueD5jLng6bD4wfSxlby5sb2NhdGVQb2ludEluUmluZz1mdW5jdGlvbih0LGUpe3JldHVybiB0by5sb2NhdGVQb2ludEluUmluZyh0LGUpfSxlby5kaXN0YW5jZVBvaW50TGluZVBlcnBlbmRpY3VsYXI9ZnVuY3Rpb24odCxlLG4pe3ZhciByPShuLngtZS54KSoobi54LWUueCkrKG4ueS1lLnkpKihuLnktZS55KSxpPSgoZS55LXQueSkqKG4ueC1lLngpLShlLngtdC54KSoobi55LWUueSkpL3I7cmV0dXJuIE1hdGguYWJzKGkpKk1hdGguc3FydChyKX0sZW8uY29tcHV0ZU9yaWVudGF0aW9uPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gZW8ub3JpZW50YXRpb25JbmRleCh0LGUsbil9LGVvLmRpc3RhbmNlUG9pbnRMaW5lPWZ1bmN0aW9uKCl7aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXTtpZigwPT09ZS5sZW5ndGgpdGhyb3cgbmV3IGhpO2Zvcih2YXIgbj10LmRpc3RhbmNlKGVbMF0pLHI9MDtyPGUubGVuZ3RoLTE7cisrKXt2YXIgaT1lby5kaXN0YW5jZVBvaW50TGluZSh0LGVbcl0sZVtyKzFdKTtpPG4mJihuPWkpfXJldHVybiBufWlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbz1hcmd1bWVudHNbMF0scz1hcmd1bWVudHNbMV0sYT1hcmd1bWVudHNbMl07aWYocy54PT09YS54JiZzLnk9PT1hLnkpcmV0dXJuIG8uZGlzdGFuY2Uocyk7dmFyIHU9KGEueC1zLngpKihhLngtcy54KSsoYS55LXMueSkqKGEueS1zLnkpLGM9KChvLngtcy54KSooYS54LXMueCkrKG8ueS1zLnkpKihhLnktcy55KSkvdTtpZihjPD0wKXJldHVybiBvLmRpc3RhbmNlKHMpO2lmKGM+PTEpcmV0dXJuIG8uZGlzdGFuY2UoYSk7dmFyIGw9KChzLnktby55KSooYS54LXMueCktKHMueC1vLngpKihhLnktcy55KSkvdTtyZXR1cm4gTWF0aC5hYnMobCkqTWF0aC5zcXJ0KHUpfX0sZW8uaXNPbkxpbmU9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49bmV3IFFpLHI9MTtyPGUubGVuZ3RoO3IrKyl7dmFyIGk9ZVtyLTFdLG89ZVtyXTtpZihuLmNvbXB1dGVJbnRlcnNlY3Rpb24odCxpLG8pLG4uaGFzSW50ZXJzZWN0aW9uKCkpcmV0dXJuITB9cmV0dXJuITF9LG5vLkNMT0NLV0lTRS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4tMX0sbm8uUklHSFQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIGVvLkNMT0NLV0lTRX0sbm8uQ09VTlRFUkNMT0NLV0lTRS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMX0sbm8uTEVGVC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gZW8uQ09VTlRFUkNMT0NLV0lTRX0sbm8uQ09MTElORUFSLmdldD1mdW5jdGlvbigpe3JldHVybiAwfSxuby5TVFJBSUdIVC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gZW8uQ09MTElORUFSfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlbyxubyk7dmFyIHJvPWZ1bmN0aW9uKCl7fTtyby5wcm90b3R5cGUuZmlsdGVyPWZ1bmN0aW9uKHQpe30scm8ucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LHJvLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiByb307dmFyIGlvPWZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuX2VudmVsb3BlPW51bGwsdGhpcy5fZmFjdG9yeT1udWxsLHRoaXMuX1NSSUQ9bnVsbCx0aGlzLl91c2VyRGF0YT1udWxsLHRoaXMuX2ZhY3Rvcnk9dCx0aGlzLl9TUklEPXQuZ2V0U1JJRCgpfSxvbz17c2VyaWFsVmVyc2lvblVJRDp7Y29uZmlndXJhYmxlOiEwfSxTT1JUSU5ERVhfUE9JTlQ6e2NvbmZpZ3VyYWJsZTohMH0sU09SVElOREVYX01VTFRJUE9JTlQ6e2NvbmZpZ3VyYWJsZTohMH0sU09SVElOREVYX0xJTkVTVFJJTkc6e2NvbmZpZ3VyYWJsZTohMH0sU09SVElOREVYX0xJTkVBUlJJTkc6e2NvbmZpZ3VyYWJsZTohMH0sU09SVElOREVYX01VTFRJTElORVNUUklORzp7Y29uZmlndXJhYmxlOiEwfSxTT1JUSU5ERVhfUE9MWUdPTjp7Y29uZmlndXJhYmxlOiEwfSxTT1JUSU5ERVhfTVVMVElQT0xZR09OOntjb25maWd1cmFibGU6ITB9LFNPUlRJTkRFWF9HRU9NRVRSWUNPTExFQ1RJT046e2NvbmZpZ3VyYWJsZTohMH0sZ2VvbWV0cnlDaGFuZ2VkRmlsdGVyOntjb25maWd1cmFibGU6ITB9fTtpby5wcm90b3R5cGUuaXNHZW9tZXRyeUNvbGxlY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRTb3J0SW5kZXgoKT09PWlvLlNPUlRJTkRFWF9HRU9NRVRSWUNPTExFQ1RJT059LGlvLnByb3RvdHlwZS5nZXRGYWN0b3J5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ZhY3Rvcnl9LGlvLnByb3RvdHlwZS5nZXRHZW9tZXRyeU49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXN9LGlvLnByb3RvdHlwZS5nZXRBcmVhPWZ1bmN0aW9uKCl7cmV0dXJuIDB9LGlvLnByb3RvdHlwZS5pc1JlY3RhbmdsZT1mdW5jdGlvbigpe3JldHVybiExfSxpby5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKCl7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBpbyl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiBudWxsIT09dCYmdGhpcy5lcXVhbHNUb3BvKHQpfWlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgT2JqZWN0KXt2YXIgZT1hcmd1bWVudHNbMF07aWYoIShlIGluc3RhbmNlb2YgaW8pKXJldHVybiExO3ZhciBuPWU7cmV0dXJuIHRoaXMuZXF1YWxzRXhhY3Qobil9fSxpby5wcm90b3R5cGUuZXF1YWxzRXhhY3Q9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXM9PT10fHx0aGlzLmVxdWFsc0V4YWN0KHQsMCl9LGlvLnByb3RvdHlwZS5nZW9tZXRyeUNoYW5nZWQ9ZnVuY3Rpb24oKXt0aGlzLmFwcGx5KGlvLmdlb21ldHJ5Q2hhbmdlZEZpbHRlcil9LGlvLnByb3RvdHlwZS5nZW9tZXRyeUNoYW5nZWRBY3Rpb249ZnVuY3Rpb24oKXt0aGlzLl9lbnZlbG9wZT1udWxsfSxpby5wcm90b3R5cGUuZXF1YWxzTm9ybT1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9PXQmJnRoaXMubm9ybSgpLmVxdWFsc0V4YWN0KHQubm9ybSgpKX0saW8ucHJvdG90eXBlLmdldExlbmd0aD1mdW5jdGlvbigpe3JldHVybiAwfSxpby5wcm90b3R5cGUuZ2V0TnVtR2VvbWV0cmllcz1mdW5jdGlvbigpe3JldHVybiAxfSxpby5wcm90b3R5cGUuY29tcGFyZVRvPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXSxlPXQ7cmV0dXJuIHRoaXMuZ2V0U29ydEluZGV4KCkhPT1lLmdldFNvcnRJbmRleCgpP3RoaXMuZ2V0U29ydEluZGV4KCktZS5nZXRTb3J0SW5kZXgoKTp0aGlzLmlzRW1wdHkoKSYmZS5pc0VtcHR5KCk/MDp0aGlzLmlzRW1wdHkoKT8tMTplLmlzRW1wdHkoKT8xOnRoaXMuY29tcGFyZVRvU2FtZUNsYXNzKHQpfWlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbj1hcmd1bWVudHNbMF0scj1hcmd1bWVudHNbMV07cmV0dXJuIHRoaXMuZ2V0U29ydEluZGV4KCkhPT1uLmdldFNvcnRJbmRleCgpP3RoaXMuZ2V0U29ydEluZGV4KCktbi5nZXRTb3J0SW5kZXgoKTp0aGlzLmlzRW1wdHkoKSYmbi5pc0VtcHR5KCk/MDp0aGlzLmlzRW1wdHkoKT8tMTpuLmlzRW1wdHkoKT8xOnRoaXMuY29tcGFyZVRvU2FtZUNsYXNzKG4scil9fSxpby5wcm90b3R5cGUuZ2V0VXNlckRhdGE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdXNlckRhdGF9LGlvLnByb3RvdHlwZS5nZXRTUklEPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX1NSSUR9LGlvLnByb3RvdHlwZS5nZXRFbnZlbG9wZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldEZhY3RvcnkoKS50b0dlb21ldHJ5KHRoaXMuZ2V0RW52ZWxvcGVJbnRlcm5hbCgpKX0saW8ucHJvdG90eXBlLmNoZWNrTm90R2VvbWV0cnlDb2xsZWN0aW9uPWZ1bmN0aW9uKHQpe2lmKHQuZ2V0U29ydEluZGV4KCk9PT1pby5TT1JUSU5ERVhfR0VPTUVUUllDT0xMRUNUSU9OKXRocm93IG5ldyBoaX0saW8ucHJvdG90eXBlLmVxdWFsPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gMD09PW4/dC5lcXVhbHMoZSk6dC5kaXN0YW5jZShlKTw9bn0saW8ucHJvdG90eXBlLm5vcm09ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmNvcHkoKTtyZXR1cm4gdC5ub3JtYWxpemUoKSx0fSxpby5wcm90b3R5cGUuZ2V0UHJlY2lzaW9uTW9kZWw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZmFjdG9yeS5nZXRQcmVjaXNpb25Nb2RlbCgpfSxpby5wcm90b3R5cGUuZ2V0RW52ZWxvcGVJbnRlcm5hbD1mdW5jdGlvbigpe3JldHVybiBudWxsPT09dGhpcy5fZW52ZWxvcGUmJih0aGlzLl9lbnZlbG9wZT10aGlzLmNvbXB1dGVFbnZlbG9wZUludGVybmFsKCkpLG5ldyBqaSh0aGlzLl9lbnZlbG9wZSl9LGlvLnByb3RvdHlwZS5zZXRTUklEPWZ1bmN0aW9uKHQpe3RoaXMuX1NSSUQ9dH0saW8ucHJvdG90eXBlLnNldFVzZXJEYXRhPWZ1bmN0aW9uKHQpe3RoaXMuX3VzZXJEYXRhPXR9LGlvLnByb3RvdHlwZS5jb21wYXJlPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXQuaXRlcmF0b3IoKSxyPWUuaXRlcmF0b3IoKTtuLmhhc05leHQoKSYmci5oYXNOZXh0KCk7KXt2YXIgaT1uLm5leHQoKSxvPXIubmV4dCgpLHM9aS5jb21wYXJlVG8obyk7aWYoMCE9PXMpcmV0dXJuIHN9cmV0dXJuIG4uaGFzTmV4dCgpPzE6ci5oYXNOZXh0KCk/LTE6MH0saW8ucHJvdG90eXBlLmhhc2hDb2RlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0RW52ZWxvcGVJbnRlcm5hbCgpLmhhc2hDb2RlKCl9LGlvLnByb3RvdHlwZS5pc0dlb21ldHJ5Q29sbGVjdGlvbk9yRGVyaXZlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFNvcnRJbmRleCgpPT09aW8uU09SVElOREVYX0dFT01FVFJZQ09MTEVDVElPTnx8dGhpcy5nZXRTb3J0SW5kZXgoKT09PWlvLlNPUlRJTkRFWF9NVUxUSVBPSU5UfHx0aGlzLmdldFNvcnRJbmRleCgpPT09aW8uU09SVElOREVYX01VTFRJTElORVNUUklOR3x8dGhpcy5nZXRTb3J0SW5kZXgoKT09PWlvLlNPUlRJTkRFWF9NVUxUSVBPTFlHT059LGlvLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltnaSxkaSxtaV19LGlvLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBpb30saW8uaGFzTm9uRW1wdHlFbGVtZW50cz1mdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPHQubGVuZ3RoO2UrKylpZighdFtlXS5pc0VtcHR5KCkpcmV0dXJuITA7cmV0dXJuITF9LGlvLmhhc051bGxFbGVtZW50cz1mdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPHQubGVuZ3RoO2UrKylpZihudWxsPT09dFtlXSlyZXR1cm4hMDtyZXR1cm4hMX0sb28uc2VyaWFsVmVyc2lvblVJRC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMHg3OTllYTQ2NTIyODU0YzAwfSxvby5TT1JUSU5ERVhfUE9JTlQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDB9LG9vLlNPUlRJTkRFWF9NVUxUSVBPSU5ULmdldD1mdW5jdGlvbigpe3JldHVybiAxfSxvby5TT1JUSU5ERVhfTElORVNUUklORy5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMn0sb28uU09SVElOREVYX0xJTkVBUlJJTkcuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDN9LG9vLlNPUlRJTkRFWF9NVUxUSUxJTkVTVFJJTkcuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDR9LG9vLlNPUlRJTkRFWF9QT0xZR09OLmdldD1mdW5jdGlvbigpe3JldHVybiA1fSxvby5TT1JUSU5ERVhfTVVMVElQT0xZR09OLmdldD1mdW5jdGlvbigpe3JldHVybiA2fSxvby5TT1JUSU5ERVhfR0VPTUVUUllDT0xMRUNUSU9OLmdldD1mdW5jdGlvbigpe3JldHVybiA3fSxvby5nZW9tZXRyeUNoYW5nZWRGaWx0ZXIuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHNvfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhpbyxvbyk7dmFyIHNvPWZ1bmN0aW9uKCl7fTtzby5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltyb119LHNvLmZpbHRlcj1mdW5jdGlvbih0KXt0Lmdlb21ldHJ5Q2hhbmdlZEFjdGlvbigpfTt2YXIgYW89ZnVuY3Rpb24oKXt9O2FvLnByb3RvdHlwZS5maWx0ZXI9ZnVuY3Rpb24odCl7fSxhby5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sYW8ucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGFvfTt2YXIgdW89ZnVuY3Rpb24oKXt9LGNvPXtNb2QyQm91bmRhcnlOb2RlUnVsZTp7Y29uZmlndXJhYmxlOiEwfSxFbmRQb2ludEJvdW5kYXJ5Tm9kZVJ1bGU6e2NvbmZpZ3VyYWJsZTohMH0sTXVsdGlWYWxlbnRFbmRQb2ludEJvdW5kYXJ5Tm9kZVJ1bGU6e2NvbmZpZ3VyYWJsZTohMH0sTW9ub1ZhbGVudEVuZFBvaW50Qm91bmRhcnlOb2RlUnVsZTp7Y29uZmlndXJhYmxlOiEwfSxNT0QyX0JPVU5EQVJZX1JVTEU6e2NvbmZpZ3VyYWJsZTohMH0sRU5EUE9JTlRfQk9VTkRBUllfUlVMRTp7Y29uZmlndXJhYmxlOiEwfSxNVUxUSVZBTEVOVF9FTkRQT0lOVF9CT1VOREFSWV9SVUxFOntjb25maWd1cmFibGU6ITB9LE1PTk9WQUxFTlRfRU5EUE9JTlRfQk9VTkRBUllfUlVMRTp7Y29uZmlndXJhYmxlOiEwfSxPR0NfU0ZTX0JPVU5EQVJZX1JVTEU6e2NvbmZpZ3VyYWJsZTohMH19O3VvLnByb3RvdHlwZS5pc0luQm91bmRhcnk9ZnVuY3Rpb24odCl7fSx1by5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sdW8ucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHVvfSxjby5Nb2QyQm91bmRhcnlOb2RlUnVsZS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gbG99LGNvLkVuZFBvaW50Qm91bmRhcnlOb2RlUnVsZS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gaG99LGNvLk11bHRpVmFsZW50RW5kUG9pbnRCb3VuZGFyeU5vZGVSdWxlLmdldD1mdW5jdGlvbigpe3JldHVybiBmb30sY28uTW9ub1ZhbGVudEVuZFBvaW50Qm91bmRhcnlOb2RlUnVsZS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gcG99LGNvLk1PRDJfQk9VTkRBUllfUlVMRS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGxvfSxjby5FTkRQT0lOVF9CT1VOREFSWV9SVUxFLmdldD1mdW5jdGlvbigpe3JldHVybiBuZXcgaG99LGNvLk1VTFRJVkFMRU5UX0VORFBPSU5UX0JPVU5EQVJZX1JVTEUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBmb30sY28uTU9OT1ZBTEVOVF9FTkRQT0lOVF9CT1VOREFSWV9SVUxFLmdldD1mdW5jdGlvbigpe3JldHVybiBuZXcgcG99LGNvLk9HQ19TRlNfQk9VTkRBUllfUlVMRS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdW8uTU9EMl9CT1VOREFSWV9SVUxFfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyh1byxjbyk7dmFyIGxvPWZ1bmN0aW9uKCl7fTtsby5wcm90b3R5cGUuaXNJbkJvdW5kYXJ5PWZ1bmN0aW9uKHQpe3JldHVybiB0JTI9PTF9LGxvLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVyblt1b119LGxvLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBsb307dmFyIGhvPWZ1bmN0aW9uKCl7fTtoby5wcm90b3R5cGUuaXNJbkJvdW5kYXJ5PWZ1bmN0aW9uKHQpe3JldHVybiB0PjB9LGhvLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVyblt1b119LGhvLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBob307dmFyIGZvPWZ1bmN0aW9uKCl7fTtmby5wcm90b3R5cGUuaXNJbkJvdW5kYXJ5PWZ1bmN0aW9uKHQpe3JldHVybiB0PjF9LGZvLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVyblt1b119LGZvLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBmb307dmFyIHBvPWZ1bmN0aW9uKCl7fTtwby5wcm90b3R5cGUuaXNJbkJvdW5kYXJ5PWZ1bmN0aW9uKHQpe3JldHVybiAxPT09dH0scG8ucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW3VvXX0scG8ucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHBvfTt2YXIgZ289ZnVuY3Rpb24oKXt9O2dvLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oKXt9LGdvLnByb3RvdHlwZS5hZGRBbGw9ZnVuY3Rpb24oKXt9LGdvLnByb3RvdHlwZS5pc0VtcHR5PWZ1bmN0aW9uKCl7fSxnby5wcm90b3R5cGUuaXRlcmF0b3I9ZnVuY3Rpb24oKXt9LGdvLnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKCl7fSxnby5wcm90b3R5cGUudG9BcnJheT1mdW5jdGlvbigpe30sZ28ucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbigpe307dmFyIHlvPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dC5jYWxsKHRoaXMpLHRoaXMubWVzc2FnZT1lfHwiIn10JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZTt2YXIgbj17bmFtZTp7Y29uZmlndXJhYmxlOiEwfX07cmV0dXJuIG4ubmFtZS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4iSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiJ9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsbiksZX0oRXJyb3IpLG1vPWZ1bmN0aW9uKCl7fTttby5wcm90b3R5cGUuaGFzTmV4dD1mdW5jdGlvbigpe30sbW8ucHJvdG90eXBlLm5leHQ9ZnVuY3Rpb24oKXt9LG1vLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oKXt9O3ZhciB2bz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmdldD1mdW5jdGlvbigpe30sZS5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKCl7fSxlLnByb3RvdHlwZS5pc0VtcHR5PWZ1bmN0aW9uKCl7fSxlfShnbyk7ZnVuY3Rpb24gX28odCl7dGhpcy5tZXNzYWdlPXR8fCIifV9vLnByb3RvdHlwZT1uZXcgRXJyb3IsX28ucHJvdG90eXBlLm5hbWU9Ik5vU3VjaEVsZW1lbnRFeGNlcHRpb24iO3ZhciB4bz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dC5jYWxsKHRoaXMpLHRoaXMuYXJyYXlfPVtdLGFyZ3VtZW50c1swXWluc3RhbmNlb2YgZ28mJnRoaXMuYWRkQWxsKGFyZ3VtZW50c1swXSl9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmVuc3VyZUNhcGFjaXR5PWZ1bmN0aW9uKCl7fSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVyblt0LGdvXX0sZS5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD90aGlzLmFycmF5Xy5wdXNoKHQpOnRoaXMuYXJyYXlfLnNwbGljZShhcmd1bWVudHNbMF0sYXJndW1lbnRzWzFdKSwhMH0sZS5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLmFycmF5Xz1bXX0sZS5wcm90b3R5cGUuYWRkQWxsPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10Lml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXRoaXMuYWRkKGUubmV4dCgpKTtyZXR1cm4hMH0sZS5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5hcnJheV9bdF07cmV0dXJuIHRoaXMuYXJyYXlfW3RdPWUsbn0sZS5wcm90b3R5cGUuaXRlcmF0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHdvKHRoaXMpfSxlLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7aWYodDwwfHx0Pj10aGlzLnNpemUoKSl0aHJvdyBuZXcgeW87cmV0dXJuIHRoaXMuYXJyYXlfW3RdfSxlLnByb3RvdHlwZS5pc0VtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLmFycmF5Xy5sZW5ndGh9LGUucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hcnJheV8ubGVuZ3RofSxlLnByb3RvdHlwZS50b0FycmF5PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLGU9MCxuPXRoaXMuYXJyYXlfLmxlbmd0aDtlPG47ZSsrKXQucHVzaCh0aGlzLmFycmF5X1tlXSk7cmV0dXJuIHR9LGUucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9ITEsbj0wLHI9dGhpcy5hcnJheV8ubGVuZ3RoO248cjtuKyspaWYodGhpcy5hcnJheV9bbl09PT10KXt0aGlzLmFycmF5Xy5zcGxpY2UobiwxKSxlPSEwO2JyZWFrfXJldHVybiBlfSxlfSh2byksd289ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt0LmNhbGwodGhpcyksdGhpcy5hcnJheUxpc3RfPWUsdGhpcy5wb3NpdGlvbl89MH1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUubmV4dD1mdW5jdGlvbigpe2lmKHRoaXMucG9zaXRpb25fPT09dGhpcy5hcnJheUxpc3RfLnNpemUoKSl0aHJvdyBuZXcgX287cmV0dXJuIHRoaXMuYXJyYXlMaXN0Xy5nZXQodGhpcy5wb3NpdGlvbl8rKyl9LGUucHJvdG90eXBlLmhhc05leHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wb3NpdGlvbl88dGhpcy5hcnJheUxpc3RfLnNpemUoKX0sZS5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmFycmF5TGlzdF8uc2V0KHRoaXMucG9zaXRpb25fLTEsdCl9LGUucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbigpe3RoaXMuYXJyYXlMaXN0Xy5yZW1vdmUodGhpcy5hcnJheUxpc3RfLmdldCh0aGlzLnBvc2l0aW9uXykpfSxlfShtbyksYm89ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe2lmKHQuY2FsbCh0aGlzKSwwIT09YXJndW1lbnRzLmxlbmd0aClpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdO3RoaXMuZW5zdXJlQ2FwYWNpdHkoZS5sZW5ndGgpLHRoaXMuYWRkKGUsITApfWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXTt0aGlzLmVuc3VyZUNhcGFjaXR5KG4ubGVuZ3RoKSx0aGlzLmFkZChuLHIpfX10JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZTt2YXIgbj17Y29vcmRBcnJheVR5cGU6e2NvbmZpZ3VyYWJsZTohMH19O3JldHVybiBuLmNvb3JkQXJyYXlUeXBlLmdldD1mdW5jdGlvbigpe3JldHVybiBuZXcgQXJyYXkoMCkuZmlsbChudWxsKX0sZS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5nZXQodCl9LGUucHJvdG90eXBlLmFkZEFsbD1mdW5jdGlvbigpe2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXtmb3IodmFyIGU9YXJndW1lbnRzWzFdLG49ITEscj1hcmd1bWVudHNbMF0uaXRlcmF0b3IoKTtyLmhhc05leHQoKTspdGhpcy5hZGQoci5uZXh0KCksZSksbj0hMDtyZXR1cm4gbn1yZXR1cm4gdC5wcm90b3R5cGUuYWRkQWxsLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZS5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXtmb3IodmFyIGU9dC5wcm90b3R5cGUuY2xvbmUuY2FsbCh0aGlzKSxuPTA7bjx0aGlzLnNpemUoKTtuKyspZS5hZGQobix0aGlzLmdldChuKS5jb3B5KCkpO3JldHVybiBlfSxlLnByb3RvdHlwZS50b0Nvb3JkaW5hdGVBcnJheT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRvQXJyYXkoZS5jb29yZEFycmF5VHlwZSl9LGUucHJvdG90eXBlLmFkZD1mdW5jdGlvbigpe3ZhciBlPXRoaXM7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1swXTt0LnByb3RvdHlwZS5hZGQuY2FsbCh0aGlzLG4pfWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgQXJyYXkmJiJib29sZWFuIj09dHlwZW9mIGFyZ3VtZW50c1sxXSl7dmFyIHI9YXJndW1lbnRzWzBdLGk9YXJndW1lbnRzWzFdO3JldHVybiB0aGlzLmFkZChyLGksITApLCEwfWlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgdmkmJiJib29sZWFuIj09dHlwZW9mIGFyZ3VtZW50c1sxXSl7dmFyIG89YXJndW1lbnRzWzBdO2lmKCFhcmd1bWVudHNbMV0mJnRoaXMuc2l6ZSgpPj0xKWlmKHRoaXMuZ2V0KHRoaXMuc2l6ZSgpLTEpLmVxdWFsczJEKG8pKXJldHVybiBudWxsO3QucHJvdG90eXBlLmFkZC5jYWxsKHRoaXMsbyl9ZWxzZSBpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIE9iamVjdCYmImJvb2xlYW4iPT10eXBlb2YgYXJndW1lbnRzWzFdKXt2YXIgcz1hcmd1bWVudHNbMF0sYT1hcmd1bWVudHNbMV07cmV0dXJuIHRoaXMuYWRkKHMsYSksITB9fWVsc2UgaWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKCJib29sZWFuIj09dHlwZW9mIGFyZ3VtZW50c1syXSYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBBcnJheSYmImJvb2xlYW4iPT10eXBlb2YgYXJndW1lbnRzWzFdKXt2YXIgdT1hcmd1bWVudHNbMF0sYz1hcmd1bWVudHNbMV07aWYoYXJndW1lbnRzWzJdKWZvcih2YXIgbD0wO2w8dS5sZW5ndGg7bCsrKWUuYWRkKHVbbF0sYyk7ZWxzZSBmb3IodmFyIGg9dS5sZW5ndGgtMTtoPj0wO2gtLSllLmFkZCh1W2hdLGMpO3JldHVybiEwfWlmKCJib29sZWFuIj09dHlwZW9mIGFyZ3VtZW50c1syXSYmTnVtYmVyLmlzSW50ZWdlcihhcmd1bWVudHNbMF0pJiZhcmd1bWVudHNbMV1pbnN0YW5jZW9mIHZpKXt2YXIgZj1hcmd1bWVudHNbMF0scD1hcmd1bWVudHNbMV07aWYoIWFyZ3VtZW50c1syXSl7dmFyIGQ9dGhpcy5zaXplKCk7aWYoZD4wKXtpZihmPjApaWYodGhpcy5nZXQoZi0xKS5lcXVhbHMyRChwKSlyZXR1cm4gbnVsbDtpZihmPGQpaWYodGhpcy5nZXQoZikuZXF1YWxzMkQocCkpcmV0dXJuIG51bGx9fXQucHJvdG90eXBlLmFkZC5jYWxsKHRoaXMsZixwKX19ZWxzZSBpZig0PT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGc9YXJndW1lbnRzWzBdLHk9YXJndW1lbnRzWzFdLG09YXJndW1lbnRzWzJdLHY9YXJndW1lbnRzWzNdLF89MTttPnYmJihfPS0xKTtmb3IodmFyIHg9bTt4IT09djt4Kz1fKWUuYWRkKGdbeF0seSk7cmV0dXJuITB9fSxlLnByb3RvdHlwZS5jbG9zZVJpbmc9ZnVuY3Rpb24oKXt0aGlzLnNpemUoKT4wJiZ0aGlzLmFkZChuZXcgdmkodGhpcy5nZXQoMCkpLCExKX0sZS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSxuKSxlfSh4byksRG89ZnVuY3Rpb24oKXt9LEVvPXtGb3J3YXJkQ29tcGFyYXRvcjp7Y29uZmlndXJhYmxlOiEwfSxCaWRpcmVjdGlvbmFsQ29tcGFyYXRvcjp7Y29uZmlndXJhYmxlOiEwfSxjb29yZEFycmF5VHlwZTp7Y29uZmlndXJhYmxlOiEwfX07RW8uRm9yd2FyZENvbXBhcmF0b3IuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIENvfSxFby5CaWRpcmVjdGlvbmFsQ29tcGFyYXRvci5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gU299LEVvLmNvb3JkQXJyYXlUeXBlLmdldD1mdW5jdGlvbigpe3JldHVybiBuZXcgQXJyYXkoMCkuZmlsbChudWxsKX0sRG8ucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LERvLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBEb30sRG8uaXNSaW5nPWZ1bmN0aW9uKHQpe3JldHVybiEodC5sZW5ndGg8NHx8IXRbMF0uZXF1YWxzMkQodFt0Lmxlbmd0aC0xXSkpfSxEby5wdE5vdEluTGlzdD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO2lmKERvLmluZGV4T2YocixlKTwwKXJldHVybiByfXJldHVybiBudWxsfSxEby5zY3JvbGw9ZnVuY3Rpb24odCxlKXt2YXIgbj1Eby5pbmRleE9mKGUsdCk7aWYobjwwKXJldHVybiBudWxsO3ZhciByPW5ldyBBcnJheSh0Lmxlbmd0aCkuZmlsbChudWxsKTtraS5hcnJheWNvcHkodCxuLHIsMCx0Lmxlbmd0aC1uKSxraS5hcnJheWNvcHkodCwwLHIsdC5sZW5ndGgtbixuKSxraS5hcnJheWNvcHkociwwLHQsMCx0Lmxlbmd0aCl9LERvLmVxdWFscz1mdW5jdGlvbigpe2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV07aWYodD09PWUpcmV0dXJuITA7aWYobnVsbD09PXR8fG51bGw9PT1lfHx0Lmxlbmd0aCE9PWUubGVuZ3RoKXJldHVybiExO2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKWlmKCF0W25dLmVxdWFscyhlW25dKSlyZXR1cm4hMTtyZXR1cm4hMH1pZigzPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHI9YXJndW1lbnRzWzBdLGk9YXJndW1lbnRzWzFdLG89YXJndW1lbnRzWzJdO2lmKHI9PT1pKXJldHVybiEwO2lmKG51bGw9PT1yfHxudWxsPT09aXx8ci5sZW5ndGghPT1pLmxlbmd0aClyZXR1cm4hMTtmb3IodmFyIHM9MDtzPHIubGVuZ3RoO3MrKylpZigwIT09by5jb21wYXJlKHJbc10saVtzXSkpcmV0dXJuITE7cmV0dXJuITB9fSxEby5pbnRlcnNlY3Rpb249ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49bmV3IGJvLHI9MDtyPHQubGVuZ3RoO3IrKyllLmludGVyc2VjdHModFtyXSkmJm4uYWRkKHRbcl0sITApO3JldHVybiBuLnRvQ29vcmRpbmF0ZUFycmF5KCl9LERvLmhhc1JlcGVhdGVkUG9pbnRzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0xO2U8dC5sZW5ndGg7ZSsrKWlmKHRbZS0xXS5lcXVhbHModFtlXSkpcmV0dXJuITA7cmV0dXJuITF9LERvLnJlbW92ZVJlcGVhdGVkUG9pbnRzPWZ1bmN0aW9uKHQpe3JldHVybiBEby5oYXNSZXBlYXRlZFBvaW50cyh0KT9uZXcgYm8odCwhMSkudG9Db29yZGluYXRlQXJyYXkoKTp0fSxEby5yZXZlcnNlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10Lmxlbmd0aC0xLG49TWF0aC50cnVuYyhlLzIpLHI9MDtyPD1uO3IrKyl7dmFyIGk9dFtyXTt0W3JdPXRbZS1yXSx0W2Utcl09aX19LERvLnJlbW92ZU51bGw9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTAsbj0wO248dC5sZW5ndGg7bisrKW51bGwhPT10W25dJiZlKys7dmFyIHI9bmV3IEFycmF5KGUpLmZpbGwobnVsbCk7aWYoMD09PWUpcmV0dXJuIHI7Zm9yKHZhciBpPTAsbz0wO288dC5sZW5ndGg7bysrKW51bGwhPT10W29dJiYocltpKytdPXRbb10pO3JldHVybiByfSxEby5jb3B5RGVlcD1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtmb3IodmFyIHQ9YXJndW1lbnRzWzBdLGU9bmV3IEFycmF5KHQubGVuZ3RoKS5maWxsKG51bGwpLG49MDtuPHQubGVuZ3RoO24rKyllW25dPW5ldyB2aSh0W25dKTtyZXR1cm4gZX1pZig1PT09YXJndW1lbnRzLmxlbmd0aClmb3IodmFyIHI9YXJndW1lbnRzWzBdLGk9YXJndW1lbnRzWzFdLG89YXJndW1lbnRzWzJdLHM9YXJndW1lbnRzWzNdLGE9YXJndW1lbnRzWzRdLHU9MDt1PGE7dSsrKW9bcyt1XT1uZXcgdmkocltpK3VdKX0sRG8uaXNFcXVhbFJldmVyc2VkPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl0saT1lW3QubGVuZ3RoLW4tMV07aWYoMCE9PXIuY29tcGFyZVRvKGkpKXJldHVybiExfXJldHVybiEwfSxEby5lbnZlbG9wZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9bmV3IGppLG49MDtuPHQubGVuZ3RoO24rKyllLmV4cGFuZFRvSW5jbHVkZSh0W25dKTtyZXR1cm4gZX0sRG8udG9Db29yZGluYXRlQXJyYXk9ZnVuY3Rpb24odCl7cmV0dXJuIHQudG9BcnJheShEby5jb29yZEFycmF5VHlwZSl9LERvLmF0TGVhc3ROQ29vcmRpbmF0ZXNPck5vdGhpbmc9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZS5sZW5ndGg+PXQ/ZTpbXX0sRG8uaW5kZXhPZj1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKWlmKHQuZXF1YWxzKGVbbl0pKXJldHVybiBuO3JldHVybi0xfSxEby5pbmNyZWFzaW5nRGlyZWN0aW9uPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8TWF0aC50cnVuYyh0Lmxlbmd0aC8yKTtlKyspe3ZhciBuPXQubGVuZ3RoLTEtZSxyPXRbZV0uY29tcGFyZVRvKHRbbl0pO2lmKDAhPT1yKXJldHVybiByfXJldHVybiAxfSxEby5jb21wYXJlPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aCYmbjxlLmxlbmd0aDspe3ZhciByPXRbbl0uY29tcGFyZVRvKGVbbl0pO2lmKDAhPT1yKXJldHVybiByO24rK31yZXR1cm4gbjxlLmxlbmd0aD8tMTpuPHQubGVuZ3RoPzE6MH0sRG8ubWluQ29vcmRpbmF0ZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9bnVsbCxuPTA7bjx0Lmxlbmd0aDtuKyspKG51bGw9PT1lfHxlLmNvbXBhcmVUbyh0W25dKT4wKSYmKGU9dFtuXSk7cmV0dXJuIGV9LERvLmV4dHJhY3Q9ZnVuY3Rpb24odCxlLG4pe2U9Q2kuY2xhbXAoZSwwLHQubGVuZ3RoKTt2YXIgcj0obj1DaS5jbGFtcChuLC0xLHQubGVuZ3RoKSktZSsxO248MCYmKHI9MCksZT49dC5sZW5ndGgmJihyPTApLG48ZSYmKHI9MCk7dmFyIGk9bmV3IEFycmF5KHIpLmZpbGwobnVsbCk7aWYoMD09PXIpcmV0dXJuIGk7Zm9yKHZhciBvPTAscz1lO3M8PW47cysrKWlbbysrXT10W3NdO3JldHVybiBpfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhEbyxFbyk7dmFyIENvPWZ1bmN0aW9uKCl7fTtDby5wcm90b3R5cGUuY29tcGFyZT1mdW5jdGlvbih0LGUpe3JldHVybiBEby5jb21wYXJlKHQsZSl9LENvLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVyblt5aV19LENvLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBDb307dmFyIFNvPWZ1bmN0aW9uKCl7fTtTby5wcm90b3R5cGUuY29tcGFyZT1mdW5jdGlvbih0LGUpe3ZhciBuPXQscj1lO2lmKG4ubGVuZ3RoPHIubGVuZ3RoKXJldHVybi0xO2lmKG4ubGVuZ3RoPnIubGVuZ3RoKXJldHVybiAxO2lmKDA9PT1uLmxlbmd0aClyZXR1cm4gMDt2YXIgaT1Eby5jb21wYXJlKG4scik7cmV0dXJuIERvLmlzRXF1YWxSZXZlcnNlZChuLHIpPzA6aX0sU28ucHJvdG90eXBlLk9MRGNvbXBhcmU9ZnVuY3Rpb24odCxlKXt2YXIgbj10LHI9ZTtpZihuLmxlbmd0aDxyLmxlbmd0aClyZXR1cm4tMTtpZihuLmxlbmd0aD5yLmxlbmd0aClyZXR1cm4gMTtpZigwPT09bi5sZW5ndGgpcmV0dXJuIDA7Zm9yKHZhciBpPURvLmluY3JlYXNpbmdEaXJlY3Rpb24obiksbz1Eby5pbmNyZWFzaW5nRGlyZWN0aW9uKHIpLHM9aT4wPzA6bi5sZW5ndGgtMSxhPW8+MD8wOm4ubGVuZ3RoLTEsdT0wO3U8bi5sZW5ndGg7dSsrKXt2YXIgYz1uW3NdLmNvbXBhcmVUbyhyW2FdKTtpZigwIT09YylyZXR1cm4gYztzKz1pLGErPW99cmV0dXJuIDB9LFNvLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVyblt5aV19LFNvLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBTb307dmFyIEFvPWZ1bmN0aW9uKCl7fTtBby5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKCl7fSxBby5wcm90b3R5cGUucHV0PWZ1bmN0aW9uKCl7fSxBby5wcm90b3R5cGUuc2l6ZT1mdW5jdGlvbigpe30sQW8ucHJvdG90eXBlLnZhbHVlcz1mdW5jdGlvbigpe30sQW8ucHJvdG90eXBlLmVudHJ5U2V0PWZ1bmN0aW9uKCl7fTt2YXIgTm89ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3QuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlfShBbyk7ZnVuY3Rpb24gSW8odCl7dGhpcy5tZXNzYWdlPXR8fCIifWZ1bmN0aW9uIE1vKCl7fUlvLnByb3RvdHlwZT1uZXcgRXJyb3IsSW8ucHJvdG90eXBlLm5hbWU9Ik9wZXJhdGlvbk5vdFN1cHBvcnRlZCIsTW8ucHJvdG90eXBlPW5ldyBnbyxNby5wcm90b3R5cGUuY29udGFpbnM9ZnVuY3Rpb24oKXt9O3ZhciBGbz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dC5jYWxsKHRoaXMpLHRoaXMuYXJyYXlfPVtdLGFyZ3VtZW50c1swXWluc3RhbmNlb2YgZ28mJnRoaXMuYWRkQWxsKGFyZ3VtZW50c1swXSl9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmNvbnRhaW5zPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wLG49dGhpcy5hcnJheV8ubGVuZ3RoO2U8bjtlKyspe2lmKHRoaXMuYXJyYXlfW2VdPT09dClyZXR1cm4hMH1yZXR1cm4hMX0sZS5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQpe3JldHVybiF0aGlzLmNvbnRhaW5zKHQpJiYodGhpcy5hcnJheV8ucHVzaCh0KSwhMCl9LGUucHJvdG90eXBlLmFkZEFsbD1mdW5jdGlvbih0KXtmb3IodmFyIGU9dC5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl0aGlzLmFkZChlLm5leHQoKSk7cmV0dXJuITB9LGUucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbih0KXt0aHJvdyBuZXcgRXJyb3J9LGUucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hcnJheV8ubGVuZ3RofSxlLnByb3RvdHlwZS5pc0VtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLmFycmF5Xy5sZW5ndGh9LGUucHJvdG90eXBlLnRvQXJyYXk9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9W10sZT0wLG49dGhpcy5hcnJheV8ubGVuZ3RoO2U8bjtlKyspdC5wdXNoKHRoaXMuYXJyYXlfW2VdKTtyZXR1cm4gdH0sZS5wcm90b3R5cGUuaXRlcmF0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFRvKHRoaXMpfSxlfShNbyksVG89ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt0LmNhbGwodGhpcyksdGhpcy5oYXNoU2V0Xz1lLHRoaXMucG9zaXRpb25fPTB9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLm5leHQ9ZnVuY3Rpb24oKXtpZih0aGlzLnBvc2l0aW9uXz09PXRoaXMuaGFzaFNldF8uc2l6ZSgpKXRocm93IG5ldyBfbztyZXR1cm4gdGhpcy5oYXNoU2V0Xy5hcnJheV9bdGhpcy5wb3NpdGlvbl8rK119LGUucHJvdG90eXBlLmhhc05leHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wb3NpdGlvbl88dGhpcy5oYXNoU2V0Xy5zaXplKCl9LGUucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbigpe3Rocm93IG5ldyBJb30sZX0obW8pO2Z1bmN0aW9uIE9vKHQpe3JldHVybiBudWxsPT09dD8wOnQuY29sb3J9ZnVuY3Rpb24gTG8odCl7cmV0dXJuIG51bGw9PT10P251bGw6dC5wYXJlbnR9ZnVuY3Rpb24gUG8odCxlKXtudWxsIT09dCYmKHQuY29sb3I9ZSl9ZnVuY3Rpb24gUm8odCl7cmV0dXJuIG51bGw9PT10P251bGw6dC5sZWZ0fWZ1bmN0aW9uIEJvKHQpe3JldHVybiBudWxsPT09dD9udWxsOnQucmlnaHR9ZnVuY3Rpb24ga28oKXt0aGlzLnJvb3RfPW51bGwsdGhpcy5zaXplXz0wfWtvLnByb3RvdHlwZT1uZXcgTm8sa28ucHJvdG90eXBlLmdldD1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5yb290XztudWxsIT09ZTspe3ZhciBuPXQuY29tcGFyZVRvKGUua2V5KTtpZihuPDApZT1lLmxlZnQ7ZWxzZXtpZighKG4+MCkpcmV0dXJuIGUudmFsdWU7ZT1lLnJpZ2h0fX1yZXR1cm4gbnVsbH0sa28ucHJvdG90eXBlLnB1dD1mdW5jdGlvbih0LGUpe2lmKG51bGw9PT10aGlzLnJvb3RfKXJldHVybiB0aGlzLnJvb3RfPXtrZXk6dCx2YWx1ZTplLGxlZnQ6bnVsbCxyaWdodDpudWxsLHBhcmVudDpudWxsLGNvbG9yOjAsZ2V0VmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YWx1ZX0sZ2V0S2V5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMua2V5fX0sdGhpcy5zaXplXz0xLG51bGw7dmFyIG4scixpPXRoaXMucm9vdF87ZG97aWYobj1pLChyPXQuY29tcGFyZVRvKGkua2V5KSk8MClpPWkubGVmdDtlbHNle2lmKCEocj4wKSl7dmFyIG89aS52YWx1ZTtyZXR1cm4gaS52YWx1ZT1lLG99aT1pLnJpZ2h0fX13aGlsZShudWxsIT09aSk7dmFyIHM9e2tleTp0LGxlZnQ6bnVsbCxyaWdodDpudWxsLHZhbHVlOmUscGFyZW50Om4sY29sb3I6MCxnZXRWYWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhbHVlfSxnZXRLZXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5rZXl9fTtyZXR1cm4gcjwwP24ubGVmdD1zOm4ucmlnaHQ9cyx0aGlzLmZpeEFmdGVySW5zZXJ0aW9uKHMpLHRoaXMuc2l6ZV8rKyxudWxsfSxrby5wcm90b3R5cGUuZml4QWZ0ZXJJbnNlcnRpb249ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztmb3IodC5jb2xvcj0xO251bGwhPXQmJnQhPT10aGlzLnJvb3RfJiYxPT09dC5wYXJlbnQuY29sb3I7KWlmKExvKHQpPT09Um8oTG8oTG8odCkpKSl7dmFyIG49Qm8oTG8oTG8odCkpKTsxPT09T28obik/KFBvKExvKHQpLDApLFBvKG4sMCksUG8oTG8oTG8odCkpLDEpLHQ9TG8oTG8odCkpKToodD09PUJvKExvKHQpKSYmKHQ9TG8odCksZS5yb3RhdGVMZWZ0KHQpKSxQbyhMbyh0KSwwKSxQbyhMbyhMbyh0KSksMSksZS5yb3RhdGVSaWdodChMbyhMbyh0KSkpKX1lbHNle3ZhciByPVJvKExvKExvKHQpKSk7MT09PU9vKHIpPyhQbyhMbyh0KSwwKSxQbyhyLDApLFBvKExvKExvKHQpKSwxKSx0PUxvKExvKHQpKSk6KHQ9PT1SbyhMbyh0KSkmJih0PUxvKHQpLGUucm90YXRlUmlnaHQodCkpLFBvKExvKHQpLDApLFBvKExvKExvKHQpKSwxKSxlLnJvdGF0ZUxlZnQoTG8oTG8odCkpKSl9dGhpcy5yb290Xy5jb2xvcj0wfSxrby5wcm90b3R5cGUudmFsdWVzPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IHhvLGU9dGhpcy5nZXRGaXJzdEVudHJ5KCk7aWYobnVsbCE9PWUpZm9yKHQuYWRkKGUudmFsdWUpO251bGwhPT0oZT1rby5zdWNjZXNzb3IoZSkpOyl0LmFkZChlLnZhbHVlKTtyZXR1cm4gdH0sa28ucHJvdG90eXBlLmVudHJ5U2V0PWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IEZvLGU9dGhpcy5nZXRGaXJzdEVudHJ5KCk7aWYobnVsbCE9PWUpZm9yKHQuYWRkKGUpO251bGwhPT0oZT1rby5zdWNjZXNzb3IoZSkpOyl0LmFkZChlKTtyZXR1cm4gdH0sa28ucHJvdG90eXBlLnJvdGF0ZUxlZnQ9ZnVuY3Rpb24odCl7aWYobnVsbCE9dCl7dmFyIGU9dC5yaWdodDt0LnJpZ2h0PWUubGVmdCxudWxsIT1lLmxlZnQmJihlLmxlZnQucGFyZW50PXQpLGUucGFyZW50PXQucGFyZW50LG51bGw9PT10LnBhcmVudD90aGlzLnJvb3RfPWU6dC5wYXJlbnQubGVmdD09PXQ/dC5wYXJlbnQubGVmdD1lOnQucGFyZW50LnJpZ2h0PWUsZS5sZWZ0PXQsdC5wYXJlbnQ9ZX19LGtvLnByb3RvdHlwZS5yb3RhdGVSaWdodD1mdW5jdGlvbih0KXtpZihudWxsIT10KXt2YXIgZT10LmxlZnQ7dC5sZWZ0PWUucmlnaHQsbnVsbCE9ZS5yaWdodCYmKGUucmlnaHQucGFyZW50PXQpLGUucGFyZW50PXQucGFyZW50LG51bGw9PT10LnBhcmVudD90aGlzLnJvb3RfPWU6dC5wYXJlbnQucmlnaHQ9PT10P3QucGFyZW50LnJpZ2h0PWU6dC5wYXJlbnQubGVmdD1lLGUucmlnaHQ9dCx0LnBhcmVudD1lfX0sa28ucHJvdG90eXBlLmdldEZpcnN0RW50cnk9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnJvb3RfO2lmKG51bGwhPXQpZm9yKDtudWxsIT10LmxlZnQ7KXQ9dC5sZWZ0O3JldHVybiB0fSxrby5zdWNjZXNzb3I9ZnVuY3Rpb24odCl7aWYobnVsbD09PXQpcmV0dXJuIG51bGw7aWYobnVsbCE9PXQucmlnaHQpe2Zvcih2YXIgZT10LnJpZ2h0O251bGwhPT1lLmxlZnQ7KWU9ZS5sZWZ0O3JldHVybiBlfWZvcih2YXIgbj10LnBhcmVudCxyPXQ7bnVsbCE9PW4mJnI9PT1uLnJpZ2h0OylyPW4sbj1uLnBhcmVudDtyZXR1cm4gbn0sa28ucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zaXplX307dmFyIHpvPWZ1bmN0aW9uKCl7fTtmdW5jdGlvbiBqbygpe31mdW5jdGlvbiBVbygpe3RoaXMuYXJyYXlfPVtdLGFyZ3VtZW50c1swXWluc3RhbmNlb2YgZ28mJnRoaXMuYWRkQWxsKGFyZ3VtZW50c1swXSl9em8ucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LHpvLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiB6b30sam8ucHJvdG90eXBlPW5ldyBNbyxVby5wcm90b3R5cGU9bmV3IGpvLFVvLnByb3RvdHlwZS5jb250YWlucz1mdW5jdGlvbih0KXtmb3IodmFyIGU9MCxuPXRoaXMuYXJyYXlfLmxlbmd0aDtlPG47ZSsrKXtpZigwPT09dGhpcy5hcnJheV9bZV0uY29tcGFyZVRvKHQpKXJldHVybiEwfXJldHVybiExfSxVby5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQpe2lmKHRoaXMuY29udGFpbnModCkpcmV0dXJuITE7Zm9yKHZhciBlPTAsbj10aGlzLmFycmF5Xy5sZW5ndGg7ZTxuO2UrKyl7aWYoMT09PXRoaXMuYXJyYXlfW2VdLmNvbXBhcmVUbyh0KSlyZXR1cm4gdGhpcy5hcnJheV8uc3BsaWNlKGUsMCx0KSwhMH1yZXR1cm4gdGhpcy5hcnJheV8ucHVzaCh0KSwhMH0sVW8ucHJvdG90eXBlLmFkZEFsbD1mdW5jdGlvbih0KXtmb3IodmFyIGU9dC5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl0aGlzLmFkZChlLm5leHQoKSk7cmV0dXJuITB9LFVvLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24odCl7dGhyb3cgbmV3IElvfSxVby5wcm90b3R5cGUuc2l6ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmFycmF5Xy5sZW5ndGh9LFVvLnByb3RvdHlwZS5pc0VtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLmFycmF5Xy5sZW5ndGh9LFVvLnByb3RvdHlwZS50b0FycmF5PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLGU9MCxuPXRoaXMuYXJyYXlfLmxlbmd0aDtlPG47ZSsrKXQucHVzaCh0aGlzLmFycmF5X1tlXSk7cmV0dXJuIHR9LFVvLnByb3RvdHlwZS5pdGVyYXRvcj1mdW5jdGlvbigpe3JldHVybiBuZXcgcW8odGhpcyl9O3ZhciBxbz1mdW5jdGlvbih0KXt0aGlzLnRyZWVTZXRfPXQsdGhpcy5wb3NpdGlvbl89MH07cW8ucHJvdG90eXBlLm5leHQ9ZnVuY3Rpb24oKXtpZih0aGlzLnBvc2l0aW9uXz09PXRoaXMudHJlZVNldF8uc2l6ZSgpKXRocm93IG5ldyBfbztyZXR1cm4gdGhpcy50cmVlU2V0Xy5hcnJheV9bdGhpcy5wb3NpdGlvbl8rK119LHFvLnByb3RvdHlwZS5oYXNOZXh0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucG9zaXRpb25fPHRoaXMudHJlZVNldF8uc2l6ZSgpfSxxby5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IElvfTt2YXIgVm89ZnVuY3Rpb24oKXt9O1ZvLnNvcnQ9ZnVuY3Rpb24oKXt2YXIgdCxlLG4scixpPWFyZ3VtZW50c1swXTtpZigxPT09YXJndW1lbnRzLmxlbmd0aClyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuY29tcGFyZVRvKGUpfSxpLnNvcnQocik7ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCluPWFyZ3VtZW50c1sxXSxyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4uY29tcGFyZSh0LGUpfSxpLnNvcnQocik7ZWxzZSBpZigzPT09YXJndW1lbnRzLmxlbmd0aCl7KGU9aS5zbGljZShhcmd1bWVudHNbMV0sYXJndW1lbnRzWzJdKSkuc29ydCgpO3ZhciBvPWkuc2xpY2UoMCxhcmd1bWVudHNbMV0pLmNvbmNhdChlLGkuc2xpY2UoYXJndW1lbnRzWzJdLGkubGVuZ3RoKSk7Zm9yKGkuc3BsaWNlKDAsaS5sZW5ndGgpLHQ9MDt0PG8ubGVuZ3RoO3QrKylpLnB1c2gob1t0XSl9ZWxzZSBpZig0PT09YXJndW1lbnRzLmxlbmd0aClmb3IoZT1pLnNsaWNlKGFyZ3VtZW50c1sxXSxhcmd1bWVudHNbMl0pLG49YXJndW1lbnRzWzNdLHI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbi5jb21wYXJlKHQsZSl9LGUuc29ydChyKSxvPWkuc2xpY2UoMCxhcmd1bWVudHNbMV0pLmNvbmNhdChlLGkuc2xpY2UoYXJndW1lbnRzWzJdLGkubGVuZ3RoKSksaS5zcGxpY2UoMCxpLmxlbmd0aCksdD0wO3Q8by5sZW5ndGg7dCsrKWkucHVzaChvW3RdKX0sVm8uYXNMaXN0PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgeG8sbj0wLHI9dC5sZW5ndGg7bjxyO24rKyllLmFkZCh0W25dKTtyZXR1cm4gZX07dmFyIEdvPWZ1bmN0aW9uKCl7fSxZbz17UDp7Y29uZmlndXJhYmxlOiEwfSxMOntjb25maWd1cmFibGU6ITB9LEE6e2NvbmZpZ3VyYWJsZTohMH0sRkFMU0U6e2NvbmZpZ3VyYWJsZTohMH0sVFJVRTp7Y29uZmlndXJhYmxlOiEwfSxET05UQ0FSRTp7Y29uZmlndXJhYmxlOiEwfSxTWU1fRkFMU0U6e2NvbmZpZ3VyYWJsZTohMH0sU1lNX1RSVUU6e2NvbmZpZ3VyYWJsZTohMH0sU1lNX0RPTlRDQVJFOntjb25maWd1cmFibGU6ITB9LFNZTV9QOntjb25maWd1cmFibGU6ITB9LFNZTV9MOntjb25maWd1cmFibGU6ITB9LFNZTV9BOntjb25maWd1cmFibGU6ITB9fTtZby5QLmdldD1mdW5jdGlvbigpe3JldHVybiAwfSxZby5MLmdldD1mdW5jdGlvbigpe3JldHVybiAxfSxZby5BLmdldD1mdW5jdGlvbigpe3JldHVybiAyfSxZby5GQUxTRS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4tMX0sWW8uVFJVRS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4tMn0sWW8uRE9OVENBUkUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuLTN9LFlvLlNZTV9GQUxTRS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4iRiJ9LFlvLlNZTV9UUlVFLmdldD1mdW5jdGlvbigpe3JldHVybiJUIn0sWW8uU1lNX0RPTlRDQVJFLmdldD1mdW5jdGlvbigpe3JldHVybiIqIn0sWW8uU1lNX1AuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIjAifSxZby5TWU1fTC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4iMSJ9LFlvLlNZTV9BLmdldD1mdW5jdGlvbigpe3JldHVybiIyIn0sR28ucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LEdvLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBHb30sR28udG9EaW1lbnNpb25TeW1ib2w9ZnVuY3Rpb24odCl7c3dpdGNoKHQpe2Nhc2UgR28uRkFMU0U6cmV0dXJuIEdvLlNZTV9GQUxTRTtjYXNlIEdvLlRSVUU6cmV0dXJuIEdvLlNZTV9UUlVFO2Nhc2UgR28uRE9OVENBUkU6cmV0dXJuIEdvLlNZTV9ET05UQ0FSRTtjYXNlIEdvLlA6cmV0dXJuIEdvLlNZTV9QO2Nhc2UgR28uTDpyZXR1cm4gR28uU1lNX0w7Y2FzZSBHby5BOnJldHVybiBHby5TWU1fQX10aHJvdyBuZXcgaGl9LEdvLnRvRGltZW5zaW9uVmFsdWU9ZnVuY3Rpb24odCl7c3dpdGNoKElpLnRvVXBwZXJDYXNlKHQpKXtjYXNlIEdvLlNZTV9GQUxTRTpyZXR1cm4gR28uRkFMU0U7Y2FzZSBHby5TWU1fVFJVRTpyZXR1cm4gR28uVFJVRTtjYXNlIEdvLlNZTV9ET05UQ0FSRTpyZXR1cm4gR28uRE9OVENBUkU7Y2FzZSBHby5TWU1fUDpyZXR1cm4gR28uUDtjYXNlIEdvLlNZTV9MOnJldHVybiBHby5MO2Nhc2UgR28uU1lNX0E6cmV0dXJuIEdvLkF9dGhyb3cgbmV3IGhpfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhHbyxZbyk7dmFyIFhvPWZ1bmN0aW9uKCl7fTtYby5wcm90b3R5cGUuZmlsdGVyPWZ1bmN0aW9uKHQpe30sWG8ucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LFhvLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBYb307dmFyIFdvPWZ1bmN0aW9uKCl7fTtXby5wcm90b3R5cGUuZmlsdGVyPWZ1bmN0aW9uKHQsZSl7fSxXby5wcm90b3R5cGUuaXNEb25lPWZ1bmN0aW9uKCl7fSxXby5wcm90b3R5cGUuaXNHZW9tZXRyeUNoYW5nZWQ9ZnVuY3Rpb24oKXt9LFdvLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxXby5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gV299O3ZhciBIbz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsbil7aWYodC5jYWxsKHRoaXMsbiksdGhpcy5fZ2VvbWV0cmllcz1lfHxbXSx0Lmhhc051bGxFbGVtZW50cyh0aGlzLl9nZW9tZXRyaWVzKSl0aHJvdyBuZXcgaGl9dCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWU7dmFyIG49e3NlcmlhbFZlcnNpb25VSUQ6e2NvbmZpZ3VyYWJsZTohMH19O3JldHVybiBlLnByb3RvdHlwZS5jb21wdXRlRW52ZWxvcGVJbnRlcm5hbD1mdW5jdGlvbigpe2Zvcih2YXIgdD1uZXcgamksZT0wO2U8dGhpcy5fZ2VvbWV0cmllcy5sZW5ndGg7ZSsrKXQuZXhwYW5kVG9JbmNsdWRlKHRoaXMuX2dlb21ldHJpZXNbZV0uZ2V0RW52ZWxvcGVJbnRlcm5hbCgpKTtyZXR1cm4gdH0sZS5wcm90b3R5cGUuZ2V0R2VvbWV0cnlOPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9nZW9tZXRyaWVzW3RdfSxlLnByb3RvdHlwZS5nZXRTb3J0SW5kZXg9ZnVuY3Rpb24oKXtyZXR1cm4gdC5TT1JUSU5ERVhfR0VPTUVUUllDT0xMRUNUSU9OfSxlLnByb3RvdHlwZS5nZXRDb29yZGluYXRlcz1mdW5jdGlvbigpe2Zvcih2YXIgdD1uZXcgQXJyYXkodGhpcy5nZXROdW1Qb2ludHMoKSkuZmlsbChudWxsKSxlPS0xLG49MDtuPHRoaXMuX2dlb21ldHJpZXMubGVuZ3RoO24rKylmb3IodmFyIHI9dGhpcy5fZ2VvbWV0cmllc1tuXS5nZXRDb29yZGluYXRlcygpLGk9MDtpPHIubGVuZ3RoO2krKyl0WysrZV09cltpXTtyZXR1cm4gdH0sZS5wcm90b3R5cGUuZ2V0QXJlYT1mdW5jdGlvbigpe2Zvcih2YXIgdD0wLGU9MDtlPHRoaXMuX2dlb21ldHJpZXMubGVuZ3RoO2UrKyl0Kz10aGlzLl9nZW9tZXRyaWVzW2VdLmdldEFyZWEoKTtyZXR1cm4gdH0sZS5wcm90b3R5cGUuZXF1YWxzRXhhY3Q9ZnVuY3Rpb24oKXtpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO2lmKCF0aGlzLmlzRXF1aXZhbGVudENsYXNzKGUpKXJldHVybiExO3ZhciByPWU7aWYodGhpcy5fZ2VvbWV0cmllcy5sZW5ndGghPT1yLl9nZW9tZXRyaWVzLmxlbmd0aClyZXR1cm4hMTtmb3IodmFyIGk9MDtpPHRoaXMuX2dlb21ldHJpZXMubGVuZ3RoO2krKylpZighdGhpcy5fZ2VvbWV0cmllc1tpXS5lcXVhbHNFeGFjdChyLl9nZW9tZXRyaWVzW2ldLG4pKXJldHVybiExO3JldHVybiEwfXJldHVybiB0LnByb3RvdHlwZS5lcXVhbHNFeGFjdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGUucHJvdG90eXBlLm5vcm1hbGl6ZT1mdW5jdGlvbigpe2Zvcih2YXIgdD0wO3Q8dGhpcy5fZ2VvbWV0cmllcy5sZW5ndGg7dCsrKXRoaXMuX2dlb21ldHJpZXNbdF0ubm9ybWFsaXplKCk7Vm8uc29ydCh0aGlzLl9nZW9tZXRyaWVzKX0sZS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzRW1wdHkoKT9udWxsOnRoaXMuX2dlb21ldHJpZXNbMF0uZ2V0Q29vcmRpbmF0ZSgpfSxlLnByb3RvdHlwZS5nZXRCb3VuZGFyeURpbWVuc2lvbj1mdW5jdGlvbigpe2Zvcih2YXIgdD1Hby5GQUxTRSxlPTA7ZTx0aGlzLl9nZW9tZXRyaWVzLmxlbmd0aDtlKyspdD1NYXRoLm1heCh0LHRoaXMuX2dlb21ldHJpZXNbZV0uZ2V0Qm91bmRhcnlEaW1lbnNpb24oKSk7cmV0dXJuIHR9LGUucHJvdG90eXBlLmdldERpbWVuc2lvbj1mdW5jdGlvbigpe2Zvcih2YXIgdD1Hby5GQUxTRSxlPTA7ZTx0aGlzLl9nZW9tZXRyaWVzLmxlbmd0aDtlKyspdD1NYXRoLm1heCh0LHRoaXMuX2dlb21ldHJpZXNbZV0uZ2V0RGltZW5zaW9uKCkpO3JldHVybiB0fSxlLnByb3RvdHlwZS5nZXRMZW5ndGg9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9MCxlPTA7ZTx0aGlzLl9nZW9tZXRyaWVzLmxlbmd0aDtlKyspdCs9dGhpcy5fZ2VvbWV0cmllc1tlXS5nZXRMZW5ndGgoKTtyZXR1cm4gdH0sZS5wcm90b3R5cGUuZ2V0TnVtUG9pbnRzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PTAsZT0wO2U8dGhpcy5fZ2VvbWV0cmllcy5sZW5ndGg7ZSsrKXQrPXRoaXMuX2dlb21ldHJpZXNbZV0uZ2V0TnVtUG9pbnRzKCk7cmV0dXJuIHR9LGUucHJvdG90eXBlLmdldE51bUdlb21ldHJpZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2VvbWV0cmllcy5sZW5ndGh9LGUucHJvdG90eXBlLnJldmVyc2U9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5fZ2VvbWV0cmllcy5sZW5ndGgsZT1uZXcgQXJyYXkodCkuZmlsbChudWxsKSxuPTA7bjx0aGlzLl9nZW9tZXRyaWVzLmxlbmd0aDtuKyspZVtuXT10aGlzLl9nZW9tZXRyaWVzW25dLnJldmVyc2UoKTtyZXR1cm4gdGhpcy5nZXRGYWN0b3J5KCkuY3JlYXRlR2VvbWV0cnlDb2xsZWN0aW9uKGUpfSxlLnByb3RvdHlwZS5jb21wYXJlVG9TYW1lQ2xhc3M9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9bmV3IFVvKFZvLmFzTGlzdCh0aGlzLl9nZW9tZXRyaWVzKSksbj1uZXcgVW8oVm8uYXNMaXN0KHQuX2dlb21ldHJpZXMpKTtyZXR1cm4gdGhpcy5jb21wYXJlKGUsbil9aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcih2YXIgcj1hcmd1bWVudHNbMV0saT1hcmd1bWVudHNbMF0sbz10aGlzLmdldE51bUdlb21ldHJpZXMoKSxzPWkuZ2V0TnVtR2VvbWV0cmllcygpLGE9MDthPG8mJmE8czspe3ZhciB1PXRoaXMuZ2V0R2VvbWV0cnlOKGEpLGM9aS5nZXRHZW9tZXRyeU4oYSksbD11LmNvbXBhcmVUb1NhbWVDbGFzcyhjLHIpO2lmKDAhPT1sKXJldHVybiBsO2ErK31yZXR1cm4gYTxvPzE6YTxzPy0xOjB9fSxlLnByb3RvdHlwZS5hcHBseT1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYoRWkoYXJndW1lbnRzWzBdLGFvKSlmb3IodmFyIGU9YXJndW1lbnRzWzBdLG49MDtuPHRoaXMuX2dlb21ldHJpZXMubGVuZ3RoO24rKyl0Ll9nZW9tZXRyaWVzW25dLmFwcGx5KGUpO2Vsc2UgaWYoRWkoYXJndW1lbnRzWzBdLFdvKSl7dmFyIHI9YXJndW1lbnRzWzBdO2lmKDA9PT10aGlzLl9nZW9tZXRyaWVzLmxlbmd0aClyZXR1cm4gbnVsbDtmb3IodmFyIGk9MDtpPHRoaXMuX2dlb21ldHJpZXMubGVuZ3RoJiYodC5fZ2VvbWV0cmllc1tpXS5hcHBseShyKSwhci5pc0RvbmUoKSk7aSsrKTtyLmlzR2VvbWV0cnlDaGFuZ2VkKCkmJnRoaXMuZ2VvbWV0cnlDaGFuZ2VkKCl9ZWxzZSBpZihFaShhcmd1bWVudHNbMF0sWG8pKXt2YXIgbz1hcmd1bWVudHNbMF07by5maWx0ZXIodGhpcyk7Zm9yKHZhciBzPTA7czx0aGlzLl9nZW9tZXRyaWVzLmxlbmd0aDtzKyspdC5fZ2VvbWV0cmllc1tzXS5hcHBseShvKX1lbHNlIGlmKEVpKGFyZ3VtZW50c1swXSxybykpe3ZhciBhPWFyZ3VtZW50c1swXTthLmZpbHRlcih0aGlzKTtmb3IodmFyIHU9MDt1PHRoaXMuX2dlb21ldHJpZXMubGVuZ3RoO3UrKyl0Ll9nZW9tZXRyaWVzW3VdLmFwcGx5KGEpfX0sZS5wcm90b3R5cGUuZ2V0Qm91bmRhcnk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jaGVja05vdEdlb21ldHJ5Q29sbGVjdGlvbih0aGlzKSxaaS5zaG91bGROZXZlclJlYWNoSGVyZSgpLG51bGx9LGUucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7dmFyIGU9dC5wcm90b3R5cGUuY2xvbmUuY2FsbCh0aGlzKTtlLl9nZW9tZXRyaWVzPW5ldyBBcnJheSh0aGlzLl9nZW9tZXRyaWVzLmxlbmd0aCkuZmlsbChudWxsKTtmb3IodmFyIG49MDtuPHRoaXMuX2dlb21ldHJpZXMubGVuZ3RoO24rKyllLl9nZW9tZXRyaWVzW25dPXRoaXMuX2dlb21ldHJpZXNbbl0uY2xvbmUoKTtyZXR1cm4gZX0sZS5wcm90b3R5cGUuZ2V0R2VvbWV0cnlUeXBlPWZ1bmN0aW9uKCl7cmV0dXJuIkdlb21ldHJ5Q29sbGVjdGlvbiJ9LGUucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9bmV3IEFycmF5KHRoaXMuX2dlb21ldHJpZXMubGVuZ3RoKS5maWxsKG51bGwpLG49MDtuPHQubGVuZ3RoO24rKyl0W25dPXRoaXMuX2dlb21ldHJpZXNbbl0uY29weSgpO3JldHVybiBuZXcgZSh0LHRoaXMuX2ZhY3RvcnkpfSxlLnByb3RvdHlwZS5pc0VtcHR5PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PTA7dDx0aGlzLl9nZW9tZXRyaWVzLmxlbmd0aDt0KyspaWYoIXRoaXMuX2dlb21ldHJpZXNbdF0uaXNFbXB0eSgpKXJldHVybiExO3JldHVybiEwfSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxuLnNlcmlhbFZlcnNpb25VSUQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuLTB4NGYwN2JjYjFmODU3ZDgwMH0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSxuKSxlfShpbyksWm89ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3QuYXBwbHkodGhpcyxhcmd1bWVudHMpfXQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lO3ZhciBuPXtzZXJpYWxWZXJzaW9uVUlEOntjb25maWd1cmFibGU6ITB9fTtyZXR1cm4gZS5wcm90b3R5cGUuZ2V0U29ydEluZGV4PWZ1bmN0aW9uKCl7cmV0dXJuIGlvLlNPUlRJTkRFWF9NVUxUSUxJTkVTVFJJTkd9LGUucHJvdG90eXBlLmVxdWFsc0V4YWN0PWZ1bmN0aW9uKCl7aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTtyZXR1cm4hIXRoaXMuaXNFcXVpdmFsZW50Q2xhc3MoZSkmJnQucHJvdG90eXBlLmVxdWFsc0V4YWN0LmNhbGwodGhpcyxlLG4pfXJldHVybiB0LnByb3RvdHlwZS5lcXVhbHNFeGFjdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGUucHJvdG90eXBlLmdldEJvdW5kYXJ5RGltZW5zaW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNDbG9zZWQoKT9Hby5GQUxTRTowfSxlLnByb3RvdHlwZS5pc0Nsb3NlZD1mdW5jdGlvbigpe2lmKHRoaXMuaXNFbXB0eSgpKXJldHVybiExO2Zvcih2YXIgdD0wO3Q8dGhpcy5fZ2VvbWV0cmllcy5sZW5ndGg7dCsrKWlmKCF0aGlzLl9nZW9tZXRyaWVzW3RdLmlzQ2xvc2VkKCkpcmV0dXJuITE7cmV0dXJuITB9LGUucHJvdG90eXBlLmdldERpbWVuc2lvbj1mdW5jdGlvbigpe3JldHVybiAxfSxlLnByb3RvdHlwZS5yZXZlcnNlPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX2dlb21ldHJpZXMubGVuZ3RoLGU9bmV3IEFycmF5KHQpLmZpbGwobnVsbCksbj0wO248dGhpcy5fZ2VvbWV0cmllcy5sZW5ndGg7bisrKWVbdC0xLW5dPXRoaXMuX2dlb21ldHJpZXNbbl0ucmV2ZXJzZSgpO3JldHVybiB0aGlzLmdldEZhY3RvcnkoKS5jcmVhdGVNdWx0aUxpbmVTdHJpbmcoZSl9LGUucHJvdG90eXBlLmdldEJvdW5kYXJ5PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBLbyh0aGlzKS5nZXRCb3VuZGFyeSgpfSxlLnByb3RvdHlwZS5nZXRHZW9tZXRyeVR5cGU9ZnVuY3Rpb24oKXtyZXR1cm4iTXVsdGlMaW5lU3RyaW5nIn0sZS5wcm90b3R5cGUuY29weT1mdW5jdGlvbigpe2Zvcih2YXIgdD1uZXcgQXJyYXkodGhpcy5fZ2VvbWV0cmllcy5sZW5ndGgpLmZpbGwobnVsbCksbj0wO248dC5sZW5ndGg7bisrKXRbbl09dGhpcy5fZ2VvbWV0cmllc1tuXS5jb3B5KCk7cmV0dXJuIG5ldyBlKHQsdGhpcy5fZmFjdG9yeSl9LGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW3pvXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sbi5zZXJpYWxWZXJzaW9uVUlELmdldD1mdW5jdGlvbigpe3JldHVybiAweDcxNTVkMmFiNGFmYTgwMDB9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsbiksZX0oSG8pLEtvPWZ1bmN0aW9uKCl7aWYodGhpcy5fZ2VvbT1udWxsLHRoaXMuX2dlb21GYWN0PW51bGwsdGhpcy5fYm5SdWxlPW51bGwsdGhpcy5fZW5kcG9pbnRNYXA9bnVsbCwxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9dW8uTU9EMl9CT1VOREFSWV9SVUxFO3RoaXMuX2dlb209dCx0aGlzLl9nZW9tRmFjdD10LmdldEZhY3RvcnkoKSx0aGlzLl9iblJ1bGU9ZX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbj1hcmd1bWVudHNbMF0scj1hcmd1bWVudHNbMV07dGhpcy5fZ2VvbT1uLHRoaXMuX2dlb21GYWN0PW4uZ2V0RmFjdG9yeSgpLHRoaXMuX2JuUnVsZT1yfX07S28ucHJvdG90eXBlLmJvdW5kYXJ5TXVsdGlMaW5lU3RyaW5nPWZ1bmN0aW9uKHQpe2lmKHRoaXMuX2dlb20uaXNFbXB0eSgpKXJldHVybiB0aGlzLmdldEVtcHR5TXVsdGlQb2ludCgpO3ZhciBlPXRoaXMuY29tcHV0ZUJvdW5kYXJ5Q29vcmRpbmF0ZXModCk7cmV0dXJuIDE9PT1lLmxlbmd0aD90aGlzLl9nZW9tRmFjdC5jcmVhdGVQb2ludChlWzBdKTp0aGlzLl9nZW9tRmFjdC5jcmVhdGVNdWx0aVBvaW50RnJvbUNvb3JkcyhlKX0sS28ucHJvdG90eXBlLmdldEJvdW5kYXJ5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dlb20gaW5zdGFuY2VvZiBhcz90aGlzLmJvdW5kYXJ5TGluZVN0cmluZyh0aGlzLl9nZW9tKTp0aGlzLl9nZW9tIGluc3RhbmNlb2YgWm8/dGhpcy5ib3VuZGFyeU11bHRpTGluZVN0cmluZyh0aGlzLl9nZW9tKTp0aGlzLl9nZW9tLmdldEJvdW5kYXJ5KCl9LEtvLnByb3RvdHlwZS5ib3VuZGFyeUxpbmVTdHJpbmc9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2dlb20uaXNFbXB0eSgpP3RoaXMuZ2V0RW1wdHlNdWx0aVBvaW50KCk6dC5pc0Nsb3NlZCgpP3RoaXMuX2JuUnVsZS5pc0luQm91bmRhcnkoMik/dC5nZXRTdGFydFBvaW50KCk6dGhpcy5fZ2VvbUZhY3QuY3JlYXRlTXVsdGlQb2ludCgpOnRoaXMuX2dlb21GYWN0LmNyZWF0ZU11bHRpUG9pbnQoW3QuZ2V0U3RhcnRQb2ludCgpLHQuZ2V0RW5kUG9pbnQoKV0pfSxLby5wcm90b3R5cGUuZ2V0RW1wdHlNdWx0aVBvaW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dlb21GYWN0LmNyZWF0ZU11bHRpUG9pbnQoKX0sS28ucHJvdG90eXBlLmNvbXB1dGVCb3VuZGFyeUNvb3JkaW5hdGVzPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj1uZXcgeG87dGhpcy5fZW5kcG9pbnRNYXA9bmV3IGtvO2Zvcih2YXIgcj0wO3I8dC5nZXROdW1HZW9tZXRyaWVzKCk7cisrKXt2YXIgaT10LmdldEdlb21ldHJ5TihyKTswIT09aS5nZXROdW1Qb2ludHMoKSYmKGUuYWRkRW5kcG9pbnQoaS5nZXRDb29yZGluYXRlTigwKSksZS5hZGRFbmRwb2ludChpLmdldENvb3JkaW5hdGVOKGkuZ2V0TnVtUG9pbnRzKCktMSkpKX1mb3IodmFyIG89dGhpcy5fZW5kcG9pbnRNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpO28uaGFzTmV4dCgpOyl7dmFyIHM9by5uZXh0KCksYT1zLmdldFZhbHVlKCkuY291bnQ7ZS5fYm5SdWxlLmlzSW5Cb3VuZGFyeShhKSYmbi5hZGQocy5nZXRLZXkoKSl9cmV0dXJuIERvLnRvQ29vcmRpbmF0ZUFycmF5KG4pfSxLby5wcm90b3R5cGUuYWRkRW5kcG9pbnQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fZW5kcG9pbnRNYXAuZ2V0KHQpO251bGw9PT1lJiYoZT1uZXcgSm8sdGhpcy5fZW5kcG9pbnRNYXAucHV0KHQsZSkpLGUuY291bnQrK30sS28ucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LEtvLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBLb30sS28uZ2V0Qm91bmRhcnk9ZnVuY3Rpb24oKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/bmV3IEtvKGFyZ3VtZW50c1swXSkuZ2V0Qm91bmRhcnkoKToyPT09YXJndW1lbnRzLmxlbmd0aD9uZXcgS28oYXJndW1lbnRzWzBdLGFyZ3VtZW50c1sxXSkuZ2V0Qm91bmRhcnkoKTp2b2lkIDB9O3ZhciBKbz1mdW5jdGlvbigpe3RoaXMuY291bnQ9bnVsbH07ZnVuY3Rpb24gUW8oKXt9ZnVuY3Rpb24gJG8oKXt9Sm8ucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LEpvLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBKb307dmFyIHRzPWZ1bmN0aW9uKCl7fTtmdW5jdGlvbiBlcygpe31mdW5jdGlvbiBucygpe31mdW5jdGlvbiBycygpe312YXIgaXM9ZnVuY3Rpb24oKXt9LG9zPXtORVdMSU5FOntjb25maWd1cmFibGU6ITB9LFNJTVBMRV9PUkRJTkFURV9GT1JNQVQ6e2NvbmZpZ3VyYWJsZTohMH19O2lzLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxpcy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gaXN9LGlzLmNoYXJzPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPW5ldyBBcnJheShlKS5maWxsKG51bGwpLHI9MDtyPGU7cisrKW5bcl09dDtyZXR1cm4gU3RyaW5nKG4pfSxpcy5nZXRTdGFja1RyYWNlPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXSxlPW5ldyBlcyxuPW5ldyBRbztyZXR1cm4gdC5wcmludFN0YWNrVHJhY2UobiksZS50b1N0cmluZygpfWlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgcj1hcmd1bWVudHNbMV0saT0iIjtuZXcgJG8oaXMuZ2V0U3RhY2tUcmFjZShhcmd1bWVudHNbMF0pKTtmb3IodmFyIG89bmV3IHJzLHM9MDtzPHI7cysrKXRyeXtpKz1vLnJlYWRMaW5lKCkraXMuTkVXTElORX1jYXRjaCh0KXtpZighKHQgaW5zdGFuY2VvZiBucykpdGhyb3cgdDtaaS5zaG91bGROZXZlclJlYWNoSGVyZSgpfXJldHVybiBpfX0saXMuc3BsaXQ9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49ZS5sZW5ndGgscj1uZXcgeG8saT0iIit0LG89aS5pbmRleE9mKGUpO28+PTA7KXt2YXIgcz1pLnN1YnN0cmluZygwLG8pO3IuYWRkKHMpLG89KGk9aS5zdWJzdHJpbmcobytuKSkuaW5kZXhPZihlKX1pLmxlbmd0aD4wJiZyLmFkZChpKTtmb3IodmFyIGE9bmV3IEFycmF5KHIuc2l6ZSgpKS5maWxsKG51bGwpLHU9MDt1PGEubGVuZ3RoO3UrKylhW3VdPXIuZ2V0KHUpO3JldHVybiBhfSxpcy50b1N0cmluZz1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIGlzLlNJTVBMRV9PUkRJTkFURV9GT1JNQVQuZm9ybWF0KHQpfX0saXMuc3BhY2VzPWZ1bmN0aW9uKHQpe3JldHVybiBpcy5jaGFycygiICIsdCl9LG9zLk5FV0xJTkUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIGtpLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpfSxvcy5TSU1QTEVfT1JESU5BVEVfRk9STUFULmdldD1mdW5jdGlvbigpe3JldHVybiBuZXcgdHN9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGlzLG9zKTt2YXIgc3M9ZnVuY3Rpb24oKXt9O3NzLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxzcy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gc3N9LHNzLmNvcHlDb29yZD1mdW5jdGlvbih0LGUsbixyKXtmb3IodmFyIGk9TWF0aC5taW4odC5nZXREaW1lbnNpb24oKSxuLmdldERpbWVuc2lvbigpKSxvPTA7bzxpO28rKyluLnNldE9yZGluYXRlKHIsbyx0LmdldE9yZGluYXRlKGUsbykpfSxzcy5pc1Jpbmc9ZnVuY3Rpb24odCl7dmFyIGU9dC5zaXplKCk7cmV0dXJuIDA9PT1lfHwhKGU8PTMpJiYodC5nZXRPcmRpbmF0ZSgwLExpLlgpPT09dC5nZXRPcmRpbmF0ZShlLTEsTGkuWCkmJnQuZ2V0T3JkaW5hdGUoMCxMaS5ZKT09PXQuZ2V0T3JkaW5hdGUoZS0xLExpLlkpKX0sc3MuaXNFcXVhbD1mdW5jdGlvbih0LGUpe3ZhciBuPXQuc2l6ZSgpO2lmKG4hPT1lLnNpemUoKSlyZXR1cm4hMTtmb3IodmFyIHI9TWF0aC5taW4odC5nZXREaW1lbnNpb24oKSxlLmdldERpbWVuc2lvbigpKSxpPTA7aTxuO2krKylmb3IodmFyIG89MDtvPHI7bysrKXt2YXIgcz10LmdldE9yZGluYXRlKGksbyksYT1lLmdldE9yZGluYXRlKGksbyk7aWYoISh0LmdldE9yZGluYXRlKGksbyk9PT1lLmdldE9yZGluYXRlKGksbyl8fGZpLmlzTmFOKHMpJiZmaS5pc05hTihhKSkpcmV0dXJuITF9cmV0dXJuITB9LHNzLmV4dGVuZD1mdW5jdGlvbih0LGUsbil7dmFyIHI9dC5jcmVhdGUobixlLmdldERpbWVuc2lvbigpKSxpPWUuc2l6ZSgpO2lmKHNzLmNvcHkoZSwwLHIsMCxpKSxpPjApZm9yKHZhciBvPWk7bzxuO28rKylzcy5jb3B5KGUsaS0xLHIsbywxKTtyZXR1cm4gcn0sc3MucmV2ZXJzZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9dC5zaXplKCktMSxuPU1hdGgudHJ1bmMoZS8yKSxyPTA7cjw9bjtyKyspc3Muc3dhcCh0LHIsZS1yKX0sc3Muc3dhcD1mdW5jdGlvbih0LGUsbil7aWYoZT09PW4pcmV0dXJuIG51bGw7Zm9yKHZhciByPTA7cjx0LmdldERpbWVuc2lvbigpO3IrKyl7dmFyIGk9dC5nZXRPcmRpbmF0ZShlLHIpO3Quc2V0T3JkaW5hdGUoZSxyLHQuZ2V0T3JkaW5hdGUobixyKSksdC5zZXRPcmRpbmF0ZShuLHIsaSl9fSxzcy5jb3B5PWZ1bmN0aW9uKHQsZSxuLHIsaSl7Zm9yKHZhciBvPTA7bzxpO28rKylzcy5jb3B5Q29vcmQodCxlK28sbixyK28pfSxzcy50b1N0cmluZz1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT10LnNpemUoKTtpZigwPT09ZSlyZXR1cm4iKCkiO3ZhciBuPXQuZ2V0RGltZW5zaW9uKCkscj1uZXcgQWk7ci5hcHBlbmQoIigiKTtmb3IodmFyIGk9MDtpPGU7aSsrKXtpPjAmJnIuYXBwZW5kKCIgIik7Zm9yKHZhciBvPTA7bzxuO28rKylvPjAmJnIuYXBwZW5kKCIsIiksci5hcHBlbmQoaXMudG9TdHJpbmcodC5nZXRPcmRpbmF0ZShpLG8pKSl9cmV0dXJuIHIuYXBwZW5kKCIpIiksci50b1N0cmluZygpfX0sc3MuZW5zdXJlVmFsaWRSaW5nPWZ1bmN0aW9uKHQsZSl7dmFyIG49ZS5zaXplKCk7cmV0dXJuIDA9PT1uP2U6bjw9Mz9zcy5jcmVhdGVDbG9zZWRSaW5nKHQsZSw0KTplLmdldE9yZGluYXRlKDAsTGkuWCk9PT1lLmdldE9yZGluYXRlKG4tMSxMaS5YKSYmZS5nZXRPcmRpbmF0ZSgwLExpLlkpPT09ZS5nZXRPcmRpbmF0ZShuLTEsTGkuWSk/ZTpzcy5jcmVhdGVDbG9zZWRSaW5nKHQsZSxuKzEpfSxzcy5jcmVhdGVDbG9zZWRSaW5nPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10LmNyZWF0ZShuLGUuZ2V0RGltZW5zaW9uKCkpLGk9ZS5zaXplKCk7c3MuY29weShlLDAsciwwLGkpO2Zvcih2YXIgbz1pO288bjtvKyspc3MuY29weShlLDAscixvLDEpO3JldHVybiByfTt2YXIgYXM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLG4pe3QuY2FsbCh0aGlzLG4pLHRoaXMuX3BvaW50cz1udWxsLHRoaXMuaW5pdChlKX10JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZTt2YXIgbj17c2VyaWFsVmVyc2lvblVJRDp7Y29uZmlndXJhYmxlOiEwfX07cmV0dXJuIGUucHJvdG90eXBlLmNvbXB1dGVFbnZlbG9wZUludGVybmFsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNFbXB0eSgpP25ldyBqaTp0aGlzLl9wb2ludHMuZXhwYW5kRW52ZWxvcGUobmV3IGppKX0sZS5wcm90b3R5cGUuaXNSaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNDbG9zZWQoKSYmdGhpcy5pc1NpbXBsZSgpfSxlLnByb3RvdHlwZS5nZXRTb3J0SW5kZXg9ZnVuY3Rpb24oKXtyZXR1cm4gdC5TT1JUSU5ERVhfTElORVNUUklOR30sZS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcG9pbnRzLnRvQ29vcmRpbmF0ZUFycmF5KCl9LGUucHJvdG90eXBlLmVxdWFsc0V4YWN0PWZ1bmN0aW9uKCl7aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTtpZighdGhpcy5pc0VxdWl2YWxlbnRDbGFzcyhlKSlyZXR1cm4hMTt2YXIgcj1lO2lmKHRoaXMuX3BvaW50cy5zaXplKCkhPT1yLl9wb2ludHMuc2l6ZSgpKXJldHVybiExO2Zvcih2YXIgaT0wO2k8dGhpcy5fcG9pbnRzLnNpemUoKTtpKyspaWYoIXRoaXMuZXF1YWwodGhpcy5fcG9pbnRzLmdldENvb3JkaW5hdGUoaSksci5fcG9pbnRzLmdldENvb3JkaW5hdGUoaSksbikpcmV0dXJuITE7cmV0dXJuITB9cmV0dXJuIHQucHJvdG90eXBlLmVxdWFsc0V4YWN0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZS5wcm90b3R5cGUubm9ybWFsaXplPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMsZT0wO2U8TWF0aC50cnVuYyh0aGlzLl9wb2ludHMuc2l6ZSgpLzIpO2UrKyl7dmFyIG49dC5fcG9pbnRzLnNpemUoKS0xLWU7aWYoIXQuX3BvaW50cy5nZXRDb29yZGluYXRlKGUpLmVxdWFscyh0Ll9wb2ludHMuZ2V0Q29vcmRpbmF0ZShuKSkpcmV0dXJuIHQuX3BvaW50cy5nZXRDb29yZGluYXRlKGUpLmNvbXBhcmVUbyh0Ll9wb2ludHMuZ2V0Q29vcmRpbmF0ZShuKSk+MCYmc3MucmV2ZXJzZSh0Ll9wb2ludHMpLG51bGx9fSxlLnByb3RvdHlwZS5nZXRDb29yZGluYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNFbXB0eSgpP251bGw6dGhpcy5fcG9pbnRzLmdldENvb3JkaW5hdGUoMCl9LGUucHJvdG90eXBlLmdldEJvdW5kYXJ5RGltZW5zaW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNDbG9zZWQoKT9Hby5GQUxTRTowfSxlLnByb3RvdHlwZS5pc0Nsb3NlZD1mdW5jdGlvbigpe3JldHVybiF0aGlzLmlzRW1wdHkoKSYmdGhpcy5nZXRDb29yZGluYXRlTigwKS5lcXVhbHMyRCh0aGlzLmdldENvb3JkaW5hdGVOKHRoaXMuZ2V0TnVtUG9pbnRzKCktMSkpfSxlLnByb3RvdHlwZS5nZXRFbmRQb2ludD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzRW1wdHkoKT9udWxsOnRoaXMuZ2V0UG9pbnROKHRoaXMuZ2V0TnVtUG9pbnRzKCktMSl9LGUucHJvdG90eXBlLmdldERpbWVuc2lvbj1mdW5jdGlvbigpe3JldHVybiAxfSxlLnByb3RvdHlwZS5nZXRMZW5ndGg9ZnVuY3Rpb24oKXtyZXR1cm4gZW8uY29tcHV0ZUxlbmd0aCh0aGlzLl9wb2ludHMpfSxlLnByb3RvdHlwZS5nZXROdW1Qb2ludHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcG9pbnRzLnNpemUoKX0sZS5wcm90b3R5cGUucmV2ZXJzZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX3BvaW50cy5jb3B5KCk7cmV0dXJuIHNzLnJldmVyc2UodCksdGhpcy5nZXRGYWN0b3J5KCkuY3JlYXRlTGluZVN0cmluZyh0KX0sZS5wcm90b3R5cGUuY29tcGFyZVRvU2FtZUNsYXNzPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcih2YXIgdD1hcmd1bWVudHNbMF0sZT0wLG49MDtlPHRoaXMuX3BvaW50cy5zaXplKCkmJm48dC5fcG9pbnRzLnNpemUoKTspe3ZhciByPXRoaXMuX3BvaW50cy5nZXRDb29yZGluYXRlKGUpLmNvbXBhcmVUbyh0Ll9wb2ludHMuZ2V0Q29vcmRpbmF0ZShuKSk7aWYoMCE9PXIpcmV0dXJuIHI7ZSsrLG4rK31yZXR1cm4gZTx0aGlzLl9wb2ludHMuc2l6ZSgpPzE6bjx0Ll9wb2ludHMuc2l6ZSgpPy0xOjB9aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBpPWFyZ3VtZW50c1swXTtyZXR1cm4gYXJndW1lbnRzWzFdLmNvbXBhcmUodGhpcy5fcG9pbnRzLGkuX3BvaW50cyl9fSxlLnByb3RvdHlwZS5hcHBseT1mdW5jdGlvbigpe2lmKEVpKGFyZ3VtZW50c1swXSxhbykpZm9yKHZhciB0PWFyZ3VtZW50c1swXSxlPTA7ZTx0aGlzLl9wb2ludHMuc2l6ZSgpO2UrKyl0LmZpbHRlcih0aGlzLl9wb2ludHMuZ2V0Q29vcmRpbmF0ZShlKSk7ZWxzZSBpZihFaShhcmd1bWVudHNbMF0sV28pKXt2YXIgbj1hcmd1bWVudHNbMF07aWYoMD09PXRoaXMuX3BvaW50cy5zaXplKCkpcmV0dXJuIG51bGw7Zm9yKHZhciByPTA7cjx0aGlzLl9wb2ludHMuc2l6ZSgpJiYobi5maWx0ZXIodGhpcy5fcG9pbnRzLHIpLCFuLmlzRG9uZSgpKTtyKyspO24uaXNHZW9tZXRyeUNoYW5nZWQoKSYmdGhpcy5nZW9tZXRyeUNoYW5nZWQoKX1lbHNlIGlmKEVpKGFyZ3VtZW50c1swXSxYbykpe2FyZ3VtZW50c1swXS5maWx0ZXIodGhpcyl9ZWxzZSBpZihFaShhcmd1bWVudHNbMF0scm8pKXthcmd1bWVudHNbMF0uZmlsdGVyKHRoaXMpfX0sZS5wcm90b3R5cGUuZ2V0Qm91bmRhcnk9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEtvKHRoaXMpLmdldEJvdW5kYXJ5KCl9LGUucHJvdG90eXBlLmlzRXF1aXZhbGVudENsYXNzPWZ1bmN0aW9uKHQpe3JldHVybiB0IGluc3RhbmNlb2YgZX0sZS5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXt2YXIgZT10LnByb3RvdHlwZS5jbG9uZS5jYWxsKHRoaXMpO3JldHVybiBlLl9wb2ludHM9dGhpcy5fcG9pbnRzLmNsb25lKCksZX0sZS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZU49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3BvaW50cy5nZXRDb29yZGluYXRlKHQpfSxlLnByb3RvdHlwZS5nZXRHZW9tZXRyeVR5cGU9ZnVuY3Rpb24oKXtyZXR1cm4iTGluZVN0cmluZyJ9LGUucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGUodGhpcy5fcG9pbnRzLmNvcHkoKSx0aGlzLl9mYWN0b3J5KX0sZS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3BvaW50c30sZS5wcm90b3R5cGUuaXNFbXB0eT1mdW5jdGlvbigpe3JldHVybiAwPT09dGhpcy5fcG9pbnRzLnNpemUoKX0sZS5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbih0KXtpZihudWxsPT09dCYmKHQ9dGhpcy5nZXRGYWN0b3J5KCkuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlRmFjdG9yeSgpLmNyZWF0ZShbXSkpLDE9PT10LnNpemUoKSl0aHJvdyBuZXcgaGkoIkludmFsaWQgbnVtYmVyIG9mIHBvaW50cyBpbiBMaW5lU3RyaW5nIChmb3VuZCAiK3Quc2l6ZSgpKyIgLSBtdXN0IGJlIDAgb3IgPj0gMikiKTt0aGlzLl9wb2ludHM9dH0sZS5wcm90b3R5cGUuaXNDb29yZGluYXRlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dGhpcy5fcG9pbnRzLnNpemUoKTtlKyspaWYodGhpcy5fcG9pbnRzLmdldENvb3JkaW5hdGUoZSkuZXF1YWxzKHQpKXJldHVybiEwO3JldHVybiExfSxlLnByb3RvdHlwZS5nZXRTdGFydFBvaW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNFbXB0eSgpP251bGw6dGhpcy5nZXRQb2ludE4oMCl9LGUucHJvdG90eXBlLmdldFBvaW50Tj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5nZXRGYWN0b3J5KCkuY3JlYXRlUG9pbnQodGhpcy5fcG9pbnRzLmdldENvb3JkaW5hdGUodCkpfSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVyblt6b119LGUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LG4uc2VyaWFsVmVyc2lvblVJRC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMHgyYjJiNTFiYTQzNWM4ZTAwfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLG4pLGV9KGlvKSx1cz1mdW5jdGlvbigpe307dXMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LHVzLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiB1c307dmFyIGNzPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxuKXt0LmNhbGwodGhpcyxuKSx0aGlzLl9jb29yZGluYXRlcz1lfHxudWxsLHRoaXMuaW5pdCh0aGlzLl9jb29yZGluYXRlcyl9dCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWU7dmFyIG49e3NlcmlhbFZlcnNpb25VSUQ6e2NvbmZpZ3VyYWJsZTohMH19O3JldHVybiBlLnByb3RvdHlwZS5jb21wdXRlRW52ZWxvcGVJbnRlcm5hbD1mdW5jdGlvbigpe2lmKHRoaXMuaXNFbXB0eSgpKXJldHVybiBuZXcgamk7dmFyIHQ9bmV3IGppO3JldHVybiB0LmV4cGFuZFRvSW5jbHVkZSh0aGlzLl9jb29yZGluYXRlcy5nZXRYKDApLHRoaXMuX2Nvb3JkaW5hdGVzLmdldFkoMCkpLHR9LGUucHJvdG90eXBlLmdldFNvcnRJbmRleD1mdW5jdGlvbigpe3JldHVybiB0LlNPUlRJTkRFWF9QT0lOVH0sZS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/W106W3RoaXMuZ2V0Q29vcmRpbmF0ZSgpXX0sZS5wcm90b3R5cGUuZXF1YWxzRXhhY3Q9ZnVuY3Rpb24oKXtpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO3JldHVybiEhdGhpcy5pc0VxdWl2YWxlbnRDbGFzcyhlKSYmKCEoIXRoaXMuaXNFbXB0eSgpfHwhZS5pc0VtcHR5KCkpfHx0aGlzLmlzRW1wdHkoKT09PWUuaXNFbXB0eSgpJiZ0aGlzLmVxdWFsKGUuZ2V0Q29vcmRpbmF0ZSgpLHRoaXMuZ2V0Q29vcmRpbmF0ZSgpLG4pKX1yZXR1cm4gdC5wcm90b3R5cGUuZXF1YWxzRXhhY3QuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxlLnByb3RvdHlwZS5ub3JtYWxpemU9ZnVuY3Rpb24oKXt9LGUucHJvdG90eXBlLmdldENvb3JkaW5hdGU9ZnVuY3Rpb24oKXtyZXR1cm4gMCE9PXRoaXMuX2Nvb3JkaW5hdGVzLnNpemUoKT90aGlzLl9jb29yZGluYXRlcy5nZXRDb29yZGluYXRlKDApOm51bGx9LGUucHJvdG90eXBlLmdldEJvdW5kYXJ5RGltZW5zaW9uPWZ1bmN0aW9uKCl7cmV0dXJuIEdvLkZBTFNFfSxlLnByb3RvdHlwZS5nZXREaW1lbnNpb249ZnVuY3Rpb24oKXtyZXR1cm4gMH0sZS5wcm90b3R5cGUuZ2V0TnVtUG9pbnRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNFbXB0eSgpPzA6MX0sZS5wcm90b3R5cGUucmV2ZXJzZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvcHkoKX0sZS5wcm90b3R5cGUuZ2V0WD1mdW5jdGlvbigpe2lmKG51bGw9PT10aGlzLmdldENvb3JkaW5hdGUoKSl0aHJvdyBuZXcgRXJyb3IoImdldFggY2FsbGVkIG9uIGVtcHR5IFBvaW50Iik7cmV0dXJuIHRoaXMuZ2V0Q29vcmRpbmF0ZSgpLnh9LGUucHJvdG90eXBlLmNvbXBhcmVUb1NhbWVDbGFzcz1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuZ2V0Q29vcmRpbmF0ZSgpLmNvbXBhcmVUbyh0LmdldENvb3JkaW5hdGUoKSl9aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXTtyZXR1cm4gYXJndW1lbnRzWzFdLmNvbXBhcmUodGhpcy5fY29vcmRpbmF0ZXMsZS5fY29vcmRpbmF0ZXMpfX0sZS5wcm90b3R5cGUuYXBwbHk9ZnVuY3Rpb24oKXtpZihFaShhcmd1bWVudHNbMF0sYW8pKXt2YXIgdD1hcmd1bWVudHNbMF07aWYodGhpcy5pc0VtcHR5KCkpcmV0dXJuIG51bGw7dC5maWx0ZXIodGhpcy5nZXRDb29yZGluYXRlKCkpfWVsc2UgaWYoRWkoYXJndW1lbnRzWzBdLFdvKSl7dmFyIGU9YXJndW1lbnRzWzBdO2lmKHRoaXMuaXNFbXB0eSgpKXJldHVybiBudWxsO2UuZmlsdGVyKHRoaXMuX2Nvb3JkaW5hdGVzLDApLGUuaXNHZW9tZXRyeUNoYW5nZWQoKSYmdGhpcy5nZW9tZXRyeUNoYW5nZWQoKX1lbHNlIGlmKEVpKGFyZ3VtZW50c1swXSxYbykpe2FyZ3VtZW50c1swXS5maWx0ZXIodGhpcyl9ZWxzZSBpZihFaShhcmd1bWVudHNbMF0scm8pKXthcmd1bWVudHNbMF0uZmlsdGVyKHRoaXMpfX0sZS5wcm90b3R5cGUuZ2V0Qm91bmRhcnk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRGYWN0b3J5KCkuY3JlYXRlR2VvbWV0cnlDb2xsZWN0aW9uKG51bGwpfSxlLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe3ZhciBlPXQucHJvdG90eXBlLmNsb25lLmNhbGwodGhpcyk7cmV0dXJuIGUuX2Nvb3JkaW5hdGVzPXRoaXMuX2Nvb3JkaW5hdGVzLmNsb25lKCksZX0sZS5wcm90b3R5cGUuZ2V0R2VvbWV0cnlUeXBlPWZ1bmN0aW9uKCl7cmV0dXJuIlBvaW50In0sZS5wcm90b3R5cGUuY29weT1mdW5jdGlvbigpe3JldHVybiBuZXcgZSh0aGlzLl9jb29yZGluYXRlcy5jb3B5KCksdGhpcy5fZmFjdG9yeSl9LGUucHJvdG90eXBlLmdldENvb3JkaW5hdGVTZXF1ZW5jZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb29yZGluYXRlc30sZS5wcm90b3R5cGUuZ2V0WT1mdW5jdGlvbigpe2lmKG51bGw9PT10aGlzLmdldENvb3JkaW5hdGUoKSl0aHJvdyBuZXcgRXJyb3IoImdldFkgY2FsbGVkIG9uIGVtcHR5IFBvaW50Iik7cmV0dXJuIHRoaXMuZ2V0Q29vcmRpbmF0ZSgpLnl9LGUucHJvdG90eXBlLmlzRW1wdHk9ZnVuY3Rpb24oKXtyZXR1cm4gMD09PXRoaXMuX2Nvb3JkaW5hdGVzLnNpemUoKX0sZS5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbih0KXtudWxsPT09dCYmKHQ9dGhpcy5nZXRGYWN0b3J5KCkuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlRmFjdG9yeSgpLmNyZWF0ZShbXSkpLFppLmlzVHJ1ZSh0LnNpemUoKTw9MSksdGhpcy5fY29vcmRpbmF0ZXM9dH0sZS5wcm90b3R5cGUuaXNTaW1wbGU9ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bdXNdfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxuLnNlcmlhbFZlcnNpb25VSUQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDB4NDQwNzdiYWQxNjFjYmMwMH0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSxuKSxlfShpbyksbHM9ZnVuY3Rpb24oKXt9O2xzLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxscy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gbHN9O3ZhciBocz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsbixyKXtpZih0LmNhbGwodGhpcyxyKSx0aGlzLl9zaGVsbD1udWxsLHRoaXMuX2hvbGVzPW51bGwsbnVsbD09PWUmJihlPXRoaXMuZ2V0RmFjdG9yeSgpLmNyZWF0ZUxpbmVhclJpbmcoKSksbnVsbD09PW4mJihuPVtdKSx0Lmhhc051bGxFbGVtZW50cyhuKSl0aHJvdyBuZXcgaGk7aWYoZS5pc0VtcHR5KCkmJnQuaGFzTm9uRW1wdHlFbGVtZW50cyhuKSl0aHJvdyBuZXcgaGk7dGhpcy5fc2hlbGw9ZSx0aGlzLl9ob2xlcz1ufXQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lO3ZhciBuPXtzZXJpYWxWZXJzaW9uVUlEOntjb25maWd1cmFibGU6ITB9fTtyZXR1cm4gZS5wcm90b3R5cGUuY29tcHV0ZUVudmVsb3BlSW50ZXJuYWw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2hlbGwuZ2V0RW52ZWxvcGVJbnRlcm5hbCgpfSxlLnByb3RvdHlwZS5nZXRTb3J0SW5kZXg9ZnVuY3Rpb24oKXtyZXR1cm4gdC5TT1JUSU5ERVhfUE9MWUdPTn0sZS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZXM9ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW1wdHkoKSlyZXR1cm5bXTtmb3IodmFyIHQ9bmV3IEFycmF5KHRoaXMuZ2V0TnVtUG9pbnRzKCkpLmZpbGwobnVsbCksZT0tMSxuPXRoaXMuX3NoZWxsLmdldENvb3JkaW5hdGVzKCkscj0wO3I8bi5sZW5ndGg7cisrKXRbKytlXT1uW3JdO2Zvcih2YXIgaT0wO2k8dGhpcy5faG9sZXMubGVuZ3RoO2krKylmb3IodmFyIG89dGhpcy5faG9sZXNbaV0uZ2V0Q29vcmRpbmF0ZXMoKSxzPTA7czxvLmxlbmd0aDtzKyspdFsrK2VdPW9bc107cmV0dXJuIHR9LGUucHJvdG90eXBlLmdldEFyZWE9ZnVuY3Rpb24oKXt2YXIgdD0wO3QrPU1hdGguYWJzKGVvLnNpZ25lZEFyZWEodGhpcy5fc2hlbGwuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlKCkpKTtmb3IodmFyIGU9MDtlPHRoaXMuX2hvbGVzLmxlbmd0aDtlKyspdC09TWF0aC5hYnMoZW8uc2lnbmVkQXJlYSh0aGlzLl9ob2xlc1tlXS5nZXRDb29yZGluYXRlU2VxdWVuY2UoKSkpO3JldHVybiB0fSxlLnByb3RvdHlwZS5pc1JlY3RhbmdsZT1mdW5jdGlvbigpe2lmKDAhPT10aGlzLmdldE51bUludGVyaW9yUmluZygpfHxudWxsPT09dGhpcy5fc2hlbGx8fDUhPT10aGlzLl9zaGVsbC5nZXROdW1Qb2ludHMoKSlyZXR1cm4hMTtmb3IodmFyIHQ9dGhpcy5fc2hlbGwuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlKCksZT10aGlzLmdldEVudmVsb3BlSW50ZXJuYWwoKSxuPTA7bjw1O24rKyl7dmFyIHI9dC5nZXRYKG4pO2lmKHIhPT1lLmdldE1pblgoKSYmciE9PWUuZ2V0TWF4WCgpKXJldHVybiExO3ZhciBpPXQuZ2V0WShuKTtpZihpIT09ZS5nZXRNaW5ZKCkmJmkhPT1lLmdldE1heFkoKSlyZXR1cm4hMX1mb3IodmFyIG89dC5nZXRYKDApLHM9dC5nZXRZKDApLGE9MTthPD00O2ErKyl7dmFyIHU9dC5nZXRYKGEpLGM9dC5nZXRZKGEpO2lmKHUhPT1vPT09KGMhPT1zKSlyZXR1cm4hMTtvPXUscz1jfXJldHVybiEwfSxlLnByb3RvdHlwZS5lcXVhbHNFeGFjdD1mdW5jdGlvbigpe2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07aWYoIXRoaXMuaXNFcXVpdmFsZW50Q2xhc3MoZSkpcmV0dXJuITE7dmFyIHI9ZSxpPXRoaXMuX3NoZWxsLG89ci5fc2hlbGw7aWYoIWkuZXF1YWxzRXhhY3QobyxuKXx8dGhpcy5faG9sZXMubGVuZ3RoIT09ci5faG9sZXMubGVuZ3RoKXJldHVybiExO2Zvcih2YXIgcz0wO3M8dGhpcy5faG9sZXMubGVuZ3RoO3MrKylpZighdGhpcy5faG9sZXNbc10uZXF1YWxzRXhhY3Qoci5faG9sZXNbc10sbikpcmV0dXJuITE7cmV0dXJuITB9cmV0dXJuIHQucHJvdG90eXBlLmVxdWFsc0V4YWN0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZS5wcm90b3R5cGUubm9ybWFsaXplPWZ1bmN0aW9uKCl7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpe3RoaXMubm9ybWFsaXplKHRoaXMuX3NoZWxsLCEwKTtmb3IodmFyIHQ9MDt0PHRoaXMuX2hvbGVzLmxlbmd0aDt0KyspdGhpcy5ub3JtYWxpemUodGhpcy5faG9sZXNbdF0sITEpO1ZvLnNvcnQodGhpcy5faG9sZXMpfWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTtpZihlLmlzRW1wdHkoKSlyZXR1cm4gbnVsbDt2YXIgcj1uZXcgQXJyYXkoZS5nZXRDb29yZGluYXRlcygpLmxlbmd0aC0xKS5maWxsKG51bGwpO2tpLmFycmF5Y29weShlLmdldENvb3JkaW5hdGVzKCksMCxyLDAsci5sZW5ndGgpO3ZhciBpPURvLm1pbkNvb3JkaW5hdGUoZS5nZXRDb29yZGluYXRlcygpKTtEby5zY3JvbGwocixpKSxraS5hcnJheWNvcHkociwwLGUuZ2V0Q29vcmRpbmF0ZXMoKSwwLHIubGVuZ3RoKSxlLmdldENvb3JkaW5hdGVzKClbci5sZW5ndGhdPXJbMF0sZW8uaXNDQ1coZS5nZXRDb29yZGluYXRlcygpKT09PW4mJkRvLnJldmVyc2UoZS5nZXRDb29yZGluYXRlcygpKX19LGUucHJvdG90eXBlLmdldENvb3JkaW5hdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2hlbGwuZ2V0Q29vcmRpbmF0ZSgpfSxlLnByb3RvdHlwZS5nZXROdW1JbnRlcmlvclJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faG9sZXMubGVuZ3RofSxlLnByb3RvdHlwZS5nZXRCb3VuZGFyeURpbWVuc2lvbj1mdW5jdGlvbigpe3JldHVybiAxfSxlLnByb3RvdHlwZS5nZXREaW1lbnNpb249ZnVuY3Rpb24oKXtyZXR1cm4gMn0sZS5wcm90b3R5cGUuZ2V0TGVuZ3RoPWZ1bmN0aW9uKCl7dmFyIHQ9MDt0Kz10aGlzLl9zaGVsbC5nZXRMZW5ndGgoKTtmb3IodmFyIGU9MDtlPHRoaXMuX2hvbGVzLmxlbmd0aDtlKyspdCs9dGhpcy5faG9sZXNbZV0uZ2V0TGVuZ3RoKCk7cmV0dXJuIHR9LGUucHJvdG90eXBlLmdldE51bVBvaW50cz1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9zaGVsbC5nZXROdW1Qb2ludHMoKSxlPTA7ZTx0aGlzLl9ob2xlcy5sZW5ndGg7ZSsrKXQrPXRoaXMuX2hvbGVzW2VdLmdldE51bVBvaW50cygpO3JldHVybiB0fSxlLnByb3RvdHlwZS5yZXZlcnNlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5jb3B5KCk7dC5fc2hlbGw9dGhpcy5fc2hlbGwuY29weSgpLnJldmVyc2UoKSx0Ll9ob2xlcz1uZXcgQXJyYXkodGhpcy5faG9sZXMubGVuZ3RoKS5maWxsKG51bGwpO2Zvcih2YXIgZT0wO2U8dGhpcy5faG9sZXMubGVuZ3RoO2UrKyl0Ll9ob2xlc1tlXT10aGlzLl9ob2xlc1tlXS5jb3B5KCkucmV2ZXJzZSgpO3JldHVybiB0fSxlLnByb3RvdHlwZS5jb252ZXhIdWxsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0RXh0ZXJpb3JSaW5nKCkuY29udmV4SHVsbCgpfSxlLnByb3RvdHlwZS5jb21wYXJlVG9TYW1lQ2xhc3M9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9dGhpcy5fc2hlbGwsbj10Ll9zaGVsbDtyZXR1cm4gZS5jb21wYXJlVG9TYW1lQ2xhc3Mobil9aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciByPWFyZ3VtZW50c1sxXSxpPWFyZ3VtZW50c1swXSxvPXRoaXMuX3NoZWxsLHM9aS5fc2hlbGwsYT1vLmNvbXBhcmVUb1NhbWVDbGFzcyhzLHIpO2lmKDAhPT1hKXJldHVybiBhO2Zvcih2YXIgdT10aGlzLmdldE51bUludGVyaW9yUmluZygpLGM9aS5nZXROdW1JbnRlcmlvclJpbmcoKSxsPTA7bDx1JiZsPGM7KXt2YXIgaD10aGlzLmdldEludGVyaW9yUmluZ04obCksZj1pLmdldEludGVyaW9yUmluZ04obCkscD1oLmNvbXBhcmVUb1NhbWVDbGFzcyhmLHIpO2lmKDAhPT1wKXJldHVybiBwO2wrK31yZXR1cm4gbDx1PzE6bDxjPy0xOjB9fSxlLnByb3RvdHlwZS5hcHBseT1mdW5jdGlvbih0KXt2YXIgZT10aGlzO2lmKEVpKHQsYW8pKXt0aGlzLl9zaGVsbC5hcHBseSh0KTtmb3IodmFyIG49MDtuPHRoaXMuX2hvbGVzLmxlbmd0aDtuKyspZS5faG9sZXNbbl0uYXBwbHkodCl9ZWxzZSBpZihFaSh0LFdvKSl7aWYodGhpcy5fc2hlbGwuYXBwbHkodCksIXQuaXNEb25lKCkpZm9yKHZhciByPTA7cjx0aGlzLl9ob2xlcy5sZW5ndGgmJihlLl9ob2xlc1tyXS5hcHBseSh0KSwhdC5pc0RvbmUoKSk7cisrKTt0LmlzR2VvbWV0cnlDaGFuZ2VkKCkmJnRoaXMuZ2VvbWV0cnlDaGFuZ2VkKCl9ZWxzZSBpZihFaSh0LFhvKSl0LmZpbHRlcih0aGlzKTtlbHNlIGlmKEVpKHQscm8pKXt0LmZpbHRlcih0aGlzKSx0aGlzLl9zaGVsbC5hcHBseSh0KTtmb3IodmFyIGk9MDtpPHRoaXMuX2hvbGVzLmxlbmd0aDtpKyspZS5faG9sZXNbaV0uYXBwbHkodCl9fSxlLnByb3RvdHlwZS5nZXRCb3VuZGFyeT1mdW5jdGlvbigpe2lmKHRoaXMuaXNFbXB0eSgpKXJldHVybiB0aGlzLmdldEZhY3RvcnkoKS5jcmVhdGVNdWx0aUxpbmVTdHJpbmcoKTt2YXIgdD1uZXcgQXJyYXkodGhpcy5faG9sZXMubGVuZ3RoKzEpLmZpbGwobnVsbCk7dFswXT10aGlzLl9zaGVsbDtmb3IodmFyIGU9MDtlPHRoaXMuX2hvbGVzLmxlbmd0aDtlKyspdFtlKzFdPXRoaXMuX2hvbGVzW2VdO3JldHVybiB0Lmxlbmd0aDw9MT90aGlzLmdldEZhY3RvcnkoKS5jcmVhdGVMaW5lYXJSaW5nKHRbMF0uZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlKCkpOnRoaXMuZ2V0RmFjdG9yeSgpLmNyZWF0ZU11bHRpTGluZVN0cmluZyh0KX0sZS5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXt2YXIgZT10LnByb3RvdHlwZS5jbG9uZS5jYWxsKHRoaXMpO2UuX3NoZWxsPXRoaXMuX3NoZWxsLmNsb25lKCksZS5faG9sZXM9bmV3IEFycmF5KHRoaXMuX2hvbGVzLmxlbmd0aCkuZmlsbChudWxsKTtmb3IodmFyIG49MDtuPHRoaXMuX2hvbGVzLmxlbmd0aDtuKyspZS5faG9sZXNbbl09dGhpcy5faG9sZXNbbl0uY2xvbmUoKTtyZXR1cm4gZX0sZS5wcm90b3R5cGUuZ2V0R2VvbWV0cnlUeXBlPWZ1bmN0aW9uKCl7cmV0dXJuIlBvbHlnb24ifSxlLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX3NoZWxsLmNvcHkoKSxuPW5ldyBBcnJheSh0aGlzLl9ob2xlcy5sZW5ndGgpLmZpbGwobnVsbCkscj0wO3I8bi5sZW5ndGg7cisrKW5bcl09dGhpcy5faG9sZXNbcl0uY29weSgpO3JldHVybiBuZXcgZSh0LG4sdGhpcy5fZmFjdG9yeSl9LGUucHJvdG90eXBlLmdldEV4dGVyaW9yUmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zaGVsbH0sZS5wcm90b3R5cGUuaXNFbXB0eT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zaGVsbC5pc0VtcHR5KCl9LGUucHJvdG90eXBlLmdldEludGVyaW9yUmluZ049ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2hvbGVzW3RdfSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltsc119LGUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LG4uc2VyaWFsVmVyc2lvblVJRC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4tMHgzMDdmZmVmZDhkYzk3MjAwfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLG4pLGV9KGlvKSxmcz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9dCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWU7dmFyIG49e3NlcmlhbFZlcnNpb25VSUQ6e2NvbmZpZ3VyYWJsZTohMH19O3JldHVybiBlLnByb3RvdHlwZS5nZXRTb3J0SW5kZXg9ZnVuY3Rpb24oKXtyZXR1cm4gaW8uU09SVElOREVYX01VTFRJUE9JTlR9LGUucHJvdG90eXBlLmlzVmFsaWQ9ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZS5wcm90b3R5cGUuZXF1YWxzRXhhY3Q9ZnVuY3Rpb24oKXtpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO3JldHVybiEhdGhpcy5pc0VxdWl2YWxlbnRDbGFzcyhlKSYmdC5wcm90b3R5cGUuZXF1YWxzRXhhY3QuY2FsbCh0aGlzLGUsbil9cmV0dXJuIHQucHJvdG90eXBlLmVxdWFsc0V4YWN0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZT1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuX2dlb21ldHJpZXNbZV0uZ2V0Q29vcmRpbmF0ZSgpfXJldHVybiB0LnByb3RvdHlwZS5nZXRDb29yZGluYXRlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZS5wcm90b3R5cGUuZ2V0Qm91bmRhcnlEaW1lbnNpb249ZnVuY3Rpb24oKXtyZXR1cm4gR28uRkFMU0V9LGUucHJvdG90eXBlLmdldERpbWVuc2lvbj1mdW5jdGlvbigpe3JldHVybiAwfSxlLnByb3RvdHlwZS5nZXRCb3VuZGFyeT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldEZhY3RvcnkoKS5jcmVhdGVHZW9tZXRyeUNvbGxlY3Rpb24obnVsbCl9LGUucHJvdG90eXBlLmdldEdlb21ldHJ5VHlwZT1mdW5jdGlvbigpe3JldHVybiJNdWx0aVBvaW50In0sZS5wcm90b3R5cGUuY29weT1mdW5jdGlvbigpe2Zvcih2YXIgdD1uZXcgQXJyYXkodGhpcy5fZ2VvbWV0cmllcy5sZW5ndGgpLmZpbGwobnVsbCksbj0wO248dC5sZW5ndGg7bisrKXRbbl09dGhpcy5fZ2VvbWV0cmllc1tuXS5jb3B5KCk7cmV0dXJuIG5ldyBlKHQsdGhpcy5fZmFjdG9yeSl9LGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW3VzXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sbi5zZXJpYWxWZXJzaW9uVUlELmdldD1mdW5jdGlvbigpe3JldHVybi0weDZmYjFlZDQxNjJlMGZjMDB9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsbiksZX0oSG8pLHBzPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxuKXtlIGluc3RhbmNlb2YgdmkmJm4gaW5zdGFuY2VvZiBJcyYmKGU9bi5nZXRDb29yZGluYXRlU2VxdWVuY2VGYWN0b3J5KCkuY3JlYXRlKGUpKSx0LmNhbGwodGhpcyxlLG4pLHRoaXMudmFsaWRhdGVDb25zdHJ1Y3Rpb24oKX10JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZTt2YXIgbj17TUlOSU1VTV9WQUxJRF9TSVpFOntjb25maWd1cmFibGU6ITB9LHNlcmlhbFZlcnNpb25VSUQ6e2NvbmZpZ3VyYWJsZTohMH19O3JldHVybiBlLnByb3RvdHlwZS5nZXRTb3J0SW5kZXg9ZnVuY3Rpb24oKXtyZXR1cm4gaW8uU09SVElOREVYX0xJTkVBUlJJTkd9LGUucHJvdG90eXBlLmdldEJvdW5kYXJ5RGltZW5zaW9uPWZ1bmN0aW9uKCl7cmV0dXJuIEdvLkZBTFNFfSxlLnByb3RvdHlwZS5pc0Nsb3NlZD1mdW5jdGlvbigpe3JldHVybiEhdGhpcy5pc0VtcHR5KCl8fHQucHJvdG90eXBlLmlzQ2xvc2VkLmNhbGwodGhpcyl9LGUucHJvdG90eXBlLnJldmVyc2U9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9wb2ludHMuY29weSgpO3JldHVybiBzcy5yZXZlcnNlKHQpLHRoaXMuZ2V0RmFjdG9yeSgpLmNyZWF0ZUxpbmVhclJpbmcodCl9LGUucHJvdG90eXBlLnZhbGlkYXRlQ29uc3RydWN0aW9uPWZ1bmN0aW9uKCl7aWYoIXRoaXMuaXNFbXB0eSgpJiYhdC5wcm90b3R5cGUuaXNDbG9zZWQuY2FsbCh0aGlzKSl0aHJvdyBuZXcgaGk7aWYodGhpcy5nZXRDb29yZGluYXRlU2VxdWVuY2UoKS5zaXplKCk+PTEmJnRoaXMuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlKCkuc2l6ZSgpPGUuTUlOSU1VTV9WQUxJRF9TSVpFKXRocm93IG5ldyBoaSgiSW52YWxpZCBudW1iZXIgb2YgcG9pbnRzIGluIExpbmVhclJpbmcgKGZvdW5kICIrdGhpcy5nZXRDb29yZGluYXRlU2VxdWVuY2UoKS5zaXplKCkrIiAtIG11c3QgYmUgMCBvciA+PSA0KSIpfSxlLnByb3RvdHlwZS5nZXRHZW9tZXRyeVR5cGU9ZnVuY3Rpb24oKXtyZXR1cm4iTGluZWFyUmluZyJ9LGUucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGUodGhpcy5fcG9pbnRzLmNvcHkoKSx0aGlzLl9mYWN0b3J5KX0sZS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sbi5NSU5JTVVNX1ZBTElEX1NJWkUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDR9LG4uc2VyaWFsVmVyc2lvblVJRC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4tMHgzYjIyOWUyNjIzNjdhNjAwfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLG4pLGV9KGFzKSxkcz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9dCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWU7dmFyIG49e3NlcmlhbFZlcnNpb25VSUQ6e2NvbmZpZ3VyYWJsZTohMH19O3JldHVybiBlLnByb3RvdHlwZS5nZXRTb3J0SW5kZXg9ZnVuY3Rpb24oKXtyZXR1cm4gaW8uU09SVElOREVYX01VTFRJUE9MWUdPTn0sZS5wcm90b3R5cGUuZXF1YWxzRXhhY3Q9ZnVuY3Rpb24oKXtpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO3JldHVybiEhdGhpcy5pc0VxdWl2YWxlbnRDbGFzcyhlKSYmdC5wcm90b3R5cGUuZXF1YWxzRXhhY3QuY2FsbCh0aGlzLGUsbil9cmV0dXJuIHQucHJvdG90eXBlLmVxdWFsc0V4YWN0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZS5wcm90b3R5cGUuZ2V0Qm91bmRhcnlEaW1lbnNpb249ZnVuY3Rpb24oKXtyZXR1cm4gMX0sZS5wcm90b3R5cGUuZ2V0RGltZW5zaW9uPWZ1bmN0aW9uKCl7cmV0dXJuIDJ9LGUucHJvdG90eXBlLnJldmVyc2U9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5fZ2VvbWV0cmllcy5sZW5ndGgsZT1uZXcgQXJyYXkodCkuZmlsbChudWxsKSxuPTA7bjx0aGlzLl9nZW9tZXRyaWVzLmxlbmd0aDtuKyspZVtuXT10aGlzLl9nZW9tZXRyaWVzW25dLnJldmVyc2UoKTtyZXR1cm4gdGhpcy5nZXRGYWN0b3J5KCkuY3JlYXRlTXVsdGlQb2x5Z29uKGUpfSxlLnByb3RvdHlwZS5nZXRCb3VuZGFyeT1mdW5jdGlvbigpe2lmKHRoaXMuaXNFbXB0eSgpKXJldHVybiB0aGlzLmdldEZhY3RvcnkoKS5jcmVhdGVNdWx0aUxpbmVTdHJpbmcoKTtmb3IodmFyIHQ9bmV3IHhvLGU9MDtlPHRoaXMuX2dlb21ldHJpZXMubGVuZ3RoO2UrKylmb3IodmFyIG49dGhpcy5fZ2VvbWV0cmllc1tlXS5nZXRCb3VuZGFyeSgpLHI9MDtyPG4uZ2V0TnVtR2VvbWV0cmllcygpO3IrKyl0LmFkZChuLmdldEdlb21ldHJ5TihyKSk7dmFyIGk9bmV3IEFycmF5KHQuc2l6ZSgpKS5maWxsKG51bGwpO3JldHVybiB0aGlzLmdldEZhY3RvcnkoKS5jcmVhdGVNdWx0aUxpbmVTdHJpbmcodC50b0FycmF5KGkpKX0sZS5wcm90b3R5cGUuZ2V0R2VvbWV0cnlUeXBlPWZ1bmN0aW9uKCl7cmV0dXJuIk11bHRpUG9seWdvbiJ9LGUucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9bmV3IEFycmF5KHRoaXMuX2dlb21ldHJpZXMubGVuZ3RoKS5maWxsKG51bGwpLG49MDtuPHQubGVuZ3RoO24rKyl0W25dPXRoaXMuX2dlb21ldHJpZXNbbl0uY29weSgpO3JldHVybiBuZXcgZSh0LHRoaXMuX2ZhY3RvcnkpfSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltsc119LGUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LG4uc2VyaWFsVmVyc2lvblVJRC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4tMHg3YTVhYTEzNjkxNzE5ODB9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsbiksZX0oSG8pLGdzPWZ1bmN0aW9uKHQpe3RoaXMuX2ZhY3Rvcnk9dHx8bnVsbCx0aGlzLl9pc1VzZXJEYXRhQ29waWVkPSExfSx5cz17Tm9PcEdlb21ldHJ5T3BlcmF0aW9uOntjb25maWd1cmFibGU6ITB9LENvb3JkaW5hdGVPcGVyYXRpb246e2NvbmZpZ3VyYWJsZTohMH0sQ29vcmRpbmF0ZVNlcXVlbmNlT3BlcmF0aW9uOntjb25maWd1cmFibGU6ITB9fTtncy5wcm90b3R5cGUuc2V0Q29weVVzZXJEYXRhPWZ1bmN0aW9uKHQpe3RoaXMuX2lzVXNlckRhdGFDb3BpZWQ9dH0sZ3MucHJvdG90eXBlLmVkaXQ9ZnVuY3Rpb24odCxlKXtpZihudWxsPT09dClyZXR1cm4gbnVsbDt2YXIgbj10aGlzLmVkaXRJbnRlcm5hbCh0LGUpO3JldHVybiB0aGlzLl9pc1VzZXJEYXRhQ29waWVkJiZuLnNldFVzZXJEYXRhKHQuZ2V0VXNlckRhdGEoKSksbn0sZ3MucHJvdG90eXBlLmVkaXRJbnRlcm5hbD1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT09dGhpcy5fZmFjdG9yeSYmKHRoaXMuX2ZhY3Rvcnk9dC5nZXRGYWN0b3J5KCkpLHQgaW5zdGFuY2VvZiBIbz90aGlzLmVkaXRHZW9tZXRyeUNvbGxlY3Rpb24odCxlKTp0IGluc3RhbmNlb2YgaHM/dGhpcy5lZGl0UG9seWdvbih0LGUpOnQgaW5zdGFuY2VvZiBjc3x8dCBpbnN0YW5jZW9mIGFzP2UuZWRpdCh0LHRoaXMuX2ZhY3RvcnkpOihaaS5zaG91bGROZXZlclJlYWNoSGVyZSgiVW5zdXBwb3J0ZWQgR2VvbWV0cnkgY2xhc3M6ICIrdC5nZXRDbGFzcygpLmdldE5hbWUoKSksbnVsbCl9LGdzLnByb3RvdHlwZS5lZGl0R2VvbWV0cnlDb2xsZWN0aW9uPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPWUuZWRpdCh0LHRoaXMuX2ZhY3RvcnkpLHI9bmV3IHhvLGk9MDtpPG4uZ2V0TnVtR2VvbWV0cmllcygpO2krKyl7dmFyIG89dGhpcy5lZGl0KG4uZ2V0R2VvbWV0cnlOKGkpLGUpO251bGw9PT1vfHxvLmlzRW1wdHkoKXx8ci5hZGQobyl9cmV0dXJuIG4uZ2V0Q2xhc3MoKT09PWZzP3RoaXMuX2ZhY3RvcnkuY3JlYXRlTXVsdGlQb2ludChyLnRvQXJyYXkoW10pKTpuLmdldENsYXNzKCk9PT1abz90aGlzLl9mYWN0b3J5LmNyZWF0ZU11bHRpTGluZVN0cmluZyhyLnRvQXJyYXkoW10pKTpuLmdldENsYXNzKCk9PT1kcz90aGlzLl9mYWN0b3J5LmNyZWF0ZU11bHRpUG9seWdvbihyLnRvQXJyYXkoW10pKTp0aGlzLl9mYWN0b3J5LmNyZWF0ZUdlb21ldHJ5Q29sbGVjdGlvbihyLnRvQXJyYXkoW10pKX0sZ3MucHJvdG90eXBlLmVkaXRQb2x5Z29uPWZ1bmN0aW9uKHQsZSl7dmFyIG49ZS5lZGl0KHQsdGhpcy5fZmFjdG9yeSk7aWYobnVsbD09PW4mJihuPXRoaXMuX2ZhY3RvcnkuY3JlYXRlUG9seWdvbihudWxsKSksbi5pc0VtcHR5KCkpcmV0dXJuIG47dmFyIHI9dGhpcy5lZGl0KG4uZ2V0RXh0ZXJpb3JSaW5nKCksZSk7aWYobnVsbD09PXJ8fHIuaXNFbXB0eSgpKXJldHVybiB0aGlzLl9mYWN0b3J5LmNyZWF0ZVBvbHlnb24oKTtmb3IodmFyIGk9bmV3IHhvLG89MDtvPG4uZ2V0TnVtSW50ZXJpb3JSaW5nKCk7bysrKXt2YXIgcz10aGlzLmVkaXQobi5nZXRJbnRlcmlvclJpbmdOKG8pLGUpO251bGw9PT1zfHxzLmlzRW1wdHkoKXx8aS5hZGQocyl9cmV0dXJuIHRoaXMuX2ZhY3RvcnkuY3JlYXRlUG9seWdvbihyLGkudG9BcnJheShbXSkpfSxncy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZ3MucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGdzfSxncy5HZW9tZXRyeUVkaXRvck9wZXJhdGlvbj1mdW5jdGlvbigpe30seXMuTm9PcEdlb21ldHJ5T3BlcmF0aW9uLmdldD1mdW5jdGlvbigpe3JldHVybiBtc30seXMuQ29vcmRpbmF0ZU9wZXJhdGlvbi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdnN9LHlzLkNvb3JkaW5hdGVTZXF1ZW5jZU9wZXJhdGlvbi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gX3N9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGdzLHlzKTt2YXIgbXM9ZnVuY3Rpb24oKXt9O21zLnByb3RvdHlwZS5lZGl0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHR9LG1zLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltncy5HZW9tZXRyeUVkaXRvck9wZXJhdGlvbl19LG1zLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBtc307dmFyIHZzPWZ1bmN0aW9uKCl7fTt2cy5wcm90b3R5cGUuZWRpdD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuZWRpdENvb3JkaW5hdGVzKHQuZ2V0Q29vcmRpbmF0ZXMoKSx0KTtyZXR1cm4gbnVsbD09PW4/dDp0IGluc3RhbmNlb2YgcHM/ZS5jcmVhdGVMaW5lYXJSaW5nKG4pOnQgaW5zdGFuY2VvZiBhcz9lLmNyZWF0ZUxpbmVTdHJpbmcobik6dCBpbnN0YW5jZW9mIGNzP24ubGVuZ3RoPjA/ZS5jcmVhdGVQb2ludChuWzBdKTplLmNyZWF0ZVBvaW50KCk6dH0sdnMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW2dzLkdlb21ldHJ5RWRpdG9yT3BlcmF0aW9uXX0sdnMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHZzfTt2YXIgX3M9ZnVuY3Rpb24oKXt9O19zLnByb3RvdHlwZS5lZGl0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQgaW5zdGFuY2VvZiBwcz9lLmNyZWF0ZUxpbmVhclJpbmcodGhpcy5lZGl0KHQuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlKCksdCkpOnQgaW5zdGFuY2VvZiBhcz9lLmNyZWF0ZUxpbmVTdHJpbmcodGhpcy5lZGl0KHQuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlKCksdCkpOnQgaW5zdGFuY2VvZiBjcz9lLmNyZWF0ZVBvaW50KHRoaXMuZWRpdCh0LmdldENvb3JkaW5hdGVTZXF1ZW5jZSgpLHQpKTp0fSxfcy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bZ3MuR2VvbWV0cnlFZGl0b3JPcGVyYXRpb25dfSxfcy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gX3N9O3ZhciB4cz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYodGhpcy5fZGltZW5zaW9uPTMsdGhpcy5fY29vcmRpbmF0ZXM9bnVsbCwxPT09YXJndW1lbnRzLmxlbmd0aCl7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBBcnJheSl0aGlzLl9jb29yZGluYXRlcz1hcmd1bWVudHNbMF0sdGhpcy5fZGltZW5zaW9uPTM7ZWxzZSBpZihOdW1iZXIuaXNJbnRlZ2VyKGFyZ3VtZW50c1swXSkpe3ZhciBlPWFyZ3VtZW50c1swXTt0aGlzLl9jb29yZGluYXRlcz1uZXcgQXJyYXkoZSkuZmlsbChudWxsKTtmb3IodmFyIG49MDtuPGU7bisrKXQuX2Nvb3JkaW5hdGVzW25dPW5ldyB2aX1lbHNlIGlmKEVpKGFyZ3VtZW50c1swXSxMaSkpe3ZhciByPWFyZ3VtZW50c1swXTtpZihudWxsPT09cilyZXR1cm4gdGhpcy5fY29vcmRpbmF0ZXM9bmV3IEFycmF5KDApLmZpbGwobnVsbCksbnVsbDt0aGlzLl9kaW1lbnNpb249ci5nZXREaW1lbnNpb24oKSx0aGlzLl9jb29yZGluYXRlcz1uZXcgQXJyYXkoci5zaXplKCkpLmZpbGwobnVsbCk7Zm9yKHZhciBpPTA7aTx0aGlzLl9jb29yZGluYXRlcy5sZW5ndGg7aSsrKXQuX2Nvb3JkaW5hdGVzW2ldPXIuZ2V0Q29vcmRpbmF0ZUNvcHkoaSl9fWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpaWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBBcnJheSYmTnVtYmVyLmlzSW50ZWdlcihhcmd1bWVudHNbMV0pKXt2YXIgbz1hcmd1bWVudHNbMF0scz1hcmd1bWVudHNbMV07dGhpcy5fY29vcmRpbmF0ZXM9byx0aGlzLl9kaW1lbnNpb249cyxudWxsPT09byYmKHRoaXMuX2Nvb3JkaW5hdGVzPW5ldyBBcnJheSgwKS5maWxsKG51bGwpKX1lbHNlIGlmKE51bWJlci5pc0ludGVnZXIoYXJndW1lbnRzWzBdKSYmTnVtYmVyLmlzSW50ZWdlcihhcmd1bWVudHNbMV0pKXt2YXIgYT1hcmd1bWVudHNbMF0sdT1hcmd1bWVudHNbMV07dGhpcy5fY29vcmRpbmF0ZXM9bmV3IEFycmF5KGEpLmZpbGwobnVsbCksdGhpcy5fZGltZW5zaW9uPXU7Zm9yKHZhciBjPTA7YzxhO2MrKyl0Ll9jb29yZGluYXRlc1tjXT1uZXcgdml9fSx3cz17c2VyaWFsVmVyc2lvblVJRDp7Y29uZmlndXJhYmxlOiEwfX07eHMucHJvdG90eXBlLnNldE9yZGluYXRlPWZ1bmN0aW9uKHQsZSxuKXtzd2l0Y2goZSl7Y2FzZSBMaS5YOnRoaXMuX2Nvb3JkaW5hdGVzW3RdLng9bjticmVhaztjYXNlIExpLlk6dGhpcy5fY29vcmRpbmF0ZXNbdF0ueT1uO2JyZWFrO2Nhc2UgTGkuWjp0aGlzLl9jb29yZGluYXRlc1t0XS56PW47YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgaGl9fSx4cy5wcm90b3R5cGUuc2l6ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb29yZGluYXRlcy5sZW5ndGh9LHhzLnByb3RvdHlwZS5nZXRPcmRpbmF0ZT1mdW5jdGlvbih0LGUpe3N3aXRjaChlKXtjYXNlIExpLlg6cmV0dXJuIHRoaXMuX2Nvb3JkaW5hdGVzW3RdLng7Y2FzZSBMaS5ZOnJldHVybiB0aGlzLl9jb29yZGluYXRlc1t0XS55O2Nhc2UgTGkuWjpyZXR1cm4gdGhpcy5fY29vcmRpbmF0ZXNbdF0uen1yZXR1cm4gZmkuTmFOfSx4cy5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZT1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuX2Nvb3JkaW5hdGVzW3RdfWlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07bi54PXRoaXMuX2Nvb3JkaW5hdGVzW2VdLngsbi55PXRoaXMuX2Nvb3JkaW5hdGVzW2VdLnksbi56PXRoaXMuX2Nvb3JkaW5hdGVzW2VdLnp9fSx4cy5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZUNvcHk9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyB2aSh0aGlzLl9jb29yZGluYXRlc1t0XSl9LHhzLnByb3RvdHlwZS5nZXREaW1lbnNpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGltZW5zaW9ufSx4cy5wcm90b3R5cGUuZ2V0WD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fY29vcmRpbmF0ZXNbdF0ueH0seHMucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PW5ldyBBcnJheSh0aGlzLnNpemUoKSkuZmlsbChudWxsKSxlPTA7ZTx0aGlzLl9jb29yZGluYXRlcy5sZW5ndGg7ZSsrKXRbZV09dGhpcy5fY29vcmRpbmF0ZXNbZV0uY2xvbmUoKTtyZXR1cm4gbmV3IHhzKHQsdGhpcy5fZGltZW5zaW9uKX0seHMucHJvdG90eXBlLmV4cGFuZEVudmVsb3BlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dGhpcy5fY29vcmRpbmF0ZXMubGVuZ3RoO2UrKyl0LmV4cGFuZFRvSW5jbHVkZSh0aGlzLl9jb29yZGluYXRlc1tlXSk7cmV0dXJuIHR9LHhzLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PW5ldyBBcnJheSh0aGlzLnNpemUoKSkuZmlsbChudWxsKSxlPTA7ZTx0aGlzLl9jb29yZGluYXRlcy5sZW5ndGg7ZSsrKXRbZV09dGhpcy5fY29vcmRpbmF0ZXNbZV0uY29weSgpO3JldHVybiBuZXcgeHModCx0aGlzLl9kaW1lbnNpb24pfSx4cy5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtpZih0aGlzLl9jb29yZGluYXRlcy5sZW5ndGg+MCl7dmFyIHQ9bmV3IEFpKDE3KnRoaXMuX2Nvb3JkaW5hdGVzLmxlbmd0aCk7dC5hcHBlbmQoIigiKSx0LmFwcGVuZCh0aGlzLl9jb29yZGluYXRlc1swXSk7Zm9yKHZhciBlPTE7ZTx0aGlzLl9jb29yZGluYXRlcy5sZW5ndGg7ZSsrKXQuYXBwZW5kKCIsICIpLHQuYXBwZW5kKHRoaXMuX2Nvb3JkaW5hdGVzW2VdKTtyZXR1cm4gdC5hcHBlbmQoIikiKSx0LnRvU3RyaW5nKCl9cmV0dXJuIigpIn0seHMucHJvdG90eXBlLmdldFk9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2Nvb3JkaW5hdGVzW3RdLnl9LHhzLnByb3RvdHlwZS50b0Nvb3JkaW5hdGVBcnJheT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb29yZGluYXRlc30seHMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW0xpLG1pXX0seHMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHhzfSx3cy5zZXJpYWxWZXJzaW9uVUlELmdldD1mdW5jdGlvbigpe3JldHVybi0weGNiNDRhNzc4ZGIxOGUwMH0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoeHMsd3MpO3ZhciBicz1mdW5jdGlvbigpe30sRHM9e3NlcmlhbFZlcnNpb25VSUQ6e2NvbmZpZ3VyYWJsZTohMH0saW5zdGFuY2VPYmplY3Q6e2NvbmZpZ3VyYWJsZTohMH19O2JzLnByb3RvdHlwZS5yZWFkUmVzb2x2ZT1mdW5jdGlvbigpe3JldHVybiBicy5pbnN0YW5jZSgpfSxicy5wcm90b3R5cGUuY3JlYXRlPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgQXJyYXkpcmV0dXJuIG5ldyB4cyhhcmd1bWVudHNbMF0pO2lmKEVpKGFyZ3VtZW50c1swXSxMaSkpcmV0dXJuIG5ldyB4cyhhcmd1bWVudHNbMF0pfWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXTtyZXR1cm4gZT4zJiYoZT0zKSxlPDI/bmV3IHhzKHQpOm5ldyB4cyh0LGUpfX0sYnMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW3dpLG1pXX0sYnMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGJzfSxicy5pbnN0YW5jZT1mdW5jdGlvbigpe3JldHVybiBicy5pbnN0YW5jZU9iamVjdH0sRHMuc2VyaWFsVmVyc2lvblVJRC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4tMHgzOGU0OWZhNmNmNmYyZTAwfSxEcy5pbnN0YW5jZU9iamVjdC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGJzfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhicyxEcyk7dmFyIEVzPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt0LmNhbGwodGhpcyksdGhpcy5tYXBfPW5ldyBNYXB9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmdldD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5tYXBfLmdldCh0KXx8bnVsbH0sZS5wcm90b3R5cGUucHV0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMubWFwXy5zZXQodCxlKSxlfSxlLnByb3RvdHlwZS52YWx1ZXM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9bmV3IHhvLGU9dGhpcy5tYXBfLnZhbHVlcygpLG49ZS5uZXh0KCk7IW4uZG9uZTspdC5hZGQobi52YWx1ZSksbj1lLm5leHQoKTtyZXR1cm4gdH0sZS5wcm90b3R5cGUuZW50cnlTZXQ9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgRm87cmV0dXJuIHRoaXMubWFwXy5lbnRyaWVzKCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7cmV0dXJuIHQuYWRkKGUpfSkpLHR9LGUucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXBfLnNpemUoKX0sZX0oQW8pLENzPWZ1bmN0aW9uIHQoKXtpZih0aGlzLl9tb2RlbFR5cGU9bnVsbCx0aGlzLl9zY2FsZT1udWxsLDA9PT1hcmd1bWVudHMubGVuZ3RoKXRoaXMuX21vZGVsVHlwZT10LkZMT0FUSU5HO2Vsc2UgaWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpaWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBBcyl7dmFyIGU9YXJndW1lbnRzWzBdO3RoaXMuX21vZGVsVHlwZT1lLGU9PT10LkZJWEVEJiZ0aGlzLnNldFNjYWxlKDEpfWVsc2UgaWYoIm51bWJlciI9PXR5cGVvZiBhcmd1bWVudHNbMF0pe3ZhciBuPWFyZ3VtZW50c1swXTt0aGlzLl9tb2RlbFR5cGU9dC5GSVhFRCx0aGlzLnNldFNjYWxlKG4pfWVsc2UgaWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB0KXt2YXIgcj1hcmd1bWVudHNbMF07dGhpcy5fbW9kZWxUeXBlPXIuX21vZGVsVHlwZSx0aGlzLl9zY2FsZT1yLl9zY2FsZX19LFNzPXtzZXJpYWxWZXJzaW9uVUlEOntjb25maWd1cmFibGU6ITB9LG1heGltdW1QcmVjaXNlVmFsdWU6e2NvbmZpZ3VyYWJsZTohMH19O0NzLnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24odCl7aWYoISh0IGluc3RhbmNlb2YgQ3MpKXJldHVybiExO3ZhciBlPXQ7cmV0dXJuIHRoaXMuX21vZGVsVHlwZT09PWUuX21vZGVsVHlwZSYmdGhpcy5fc2NhbGU9PT1lLl9zY2FsZX0sQ3MucHJvdG90eXBlLmNvbXBhcmVUbz1mdW5jdGlvbih0KXt2YXIgZT10LG49dGhpcy5nZXRNYXhpbXVtU2lnbmlmaWNhbnREaWdpdHMoKSxyPWUuZ2V0TWF4aW11bVNpZ25pZmljYW50RGlnaXRzKCk7cmV0dXJuIG5ldyBOaShuKS5jb21wYXJlVG8obmV3IE5pKHIpKX0sQ3MucHJvdG90eXBlLmdldFNjYWxlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NjYWxlfSxDcy5wcm90b3R5cGUuaXNGbG9hdGluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9tb2RlbFR5cGU9PT1Dcy5GTE9BVElOR3x8dGhpcy5fbW9kZWxUeXBlPT09Q3MuRkxPQVRJTkdfU0lOR0xFfSxDcy5wcm90b3R5cGUuZ2V0VHlwZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9tb2RlbFR5cGV9LENzLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3ZhciB0PSJVTktOT1dOIjtyZXR1cm4gdGhpcy5fbW9kZWxUeXBlPT09Q3MuRkxPQVRJTkc/dD0iRmxvYXRpbmciOnRoaXMuX21vZGVsVHlwZT09PUNzLkZMT0FUSU5HX1NJTkdMRT90PSJGbG9hdGluZy1TaW5nbGUiOnRoaXMuX21vZGVsVHlwZT09PUNzLkZJWEVEJiYodD0iRml4ZWQgKFNjYWxlPSIrdGhpcy5nZXRTY2FsZSgpKyIpIiksdH0sQ3MucHJvdG90eXBlLm1ha2VQcmVjaXNlPWZ1bmN0aW9uKCl7aWYoIm51bWJlciI9PXR5cGVvZiBhcmd1bWVudHNbMF0pe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gZmkuaXNOYU4odCl8fHRoaXMuX21vZGVsVHlwZT09PUNzLkZMT0FUSU5HX1NJTkdMRT90OnRoaXMuX21vZGVsVHlwZT09PUNzLkZJWEVEP01hdGgucm91bmQodCp0aGlzLl9zY2FsZSkvdGhpcy5fc2NhbGU6dH1pZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHZpKXt2YXIgZT1hcmd1bWVudHNbMF07aWYodGhpcy5fbW9kZWxUeXBlPT09Q3MuRkxPQVRJTkcpcmV0dXJuIG51bGw7ZS54PXRoaXMubWFrZVByZWNpc2UoZS54KSxlLnk9dGhpcy5tYWtlUHJlY2lzZShlLnkpfX0sQ3MucHJvdG90eXBlLmdldE1heGltdW1TaWduaWZpY2FudERpZ2l0cz1mdW5jdGlvbigpe3ZhciB0PTE2O3JldHVybiB0aGlzLl9tb2RlbFR5cGU9PT1Dcy5GTE9BVElORz90PTE2OnRoaXMuX21vZGVsVHlwZT09PUNzLkZMT0FUSU5HX1NJTkdMRT90PTY6dGhpcy5fbW9kZWxUeXBlPT09Q3MuRklYRUQmJih0PTErTWF0aC50cnVuYyhNYXRoLmNlaWwoTWF0aC5sb2codGhpcy5nZXRTY2FsZSgpKS9NYXRoLmxvZygxMCkpKSksdH0sQ3MucHJvdG90eXBlLnNldFNjYWxlPWZ1bmN0aW9uKHQpe3RoaXMuX3NjYWxlPU1hdGguYWJzKHQpfSxDcy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bbWksZGldfSxDcy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gQ3N9LENzLm1vc3RQcmVjaXNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuY29tcGFyZVRvKGUpPj0wP3Q6ZX0sU3Muc2VyaWFsVmVyc2lvblVJRC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMHg2YmVlNjQwNGU5YTI1YzAwfSxTcy5tYXhpbXVtUHJlY2lzZVZhbHVlLmdldD1mdW5jdGlvbigpe3JldHVybiA5MDA3MTk5MjU0NzQwOTkyfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhDcyxTcyk7dmFyIEFzPWZ1bmN0aW9uIHQoZSl7dGhpcy5fbmFtZT1lfHxudWxsLHQubmFtZVRvVHlwZU1hcC5wdXQoZSx0aGlzKX0sTnM9e3NlcmlhbFZlcnNpb25VSUQ6e2NvbmZpZ3VyYWJsZTohMH0sbmFtZVRvVHlwZU1hcDp7Y29uZmlndXJhYmxlOiEwfX07QXMucHJvdG90eXBlLnJlYWRSZXNvbHZlPWZ1bmN0aW9uKCl7cmV0dXJuIEFzLm5hbWVUb1R5cGVNYXAuZ2V0KHRoaXMuX25hbWUpfSxBcy5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbmFtZX0sQXMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW21pXX0sQXMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIEFzfSxOcy5zZXJpYWxWZXJzaW9uVUlELmdldD1mdW5jdGlvbigpe3JldHVybi01NTI4NjAyNjMxNzMxNTllNH0sTnMubmFtZVRvVHlwZU1hcC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEVzfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhBcyxOcyksQ3MuVHlwZT1BcyxDcy5GSVhFRD1uZXcgQXMoIkZJWEVEIiksQ3MuRkxPQVRJTkc9bmV3IEFzKCJGTE9BVElORyIpLENzLkZMT0FUSU5HX1NJTkdMRT1uZXcgQXMoIkZMT0FUSU5HIFNJTkdMRSIpO3ZhciBJcz1mdW5jdGlvbiB0KCl7dGhpcy5fcHJlY2lzaW9uTW9kZWw9bmV3IENzLHRoaXMuX1NSSUQ9MCx0aGlzLl9jb29yZGluYXRlU2VxdWVuY2VGYWN0b3J5PXQuZ2V0RGVmYXVsdENvb3JkaW5hdGVTZXF1ZW5jZUZhY3RvcnkoKSwwPT09YXJndW1lbnRzLmxlbmd0aHx8KDE9PT1hcmd1bWVudHMubGVuZ3RoP0VpKGFyZ3VtZW50c1swXSx3aSk/dGhpcy5fY29vcmRpbmF0ZVNlcXVlbmNlRmFjdG9yeT1hcmd1bWVudHNbMF06YXJndW1lbnRzWzBdaW5zdGFuY2VvZiBDcyYmKHRoaXMuX3ByZWNpc2lvbk1vZGVsPWFyZ3VtZW50c1swXSk6Mj09PWFyZ3VtZW50cy5sZW5ndGg/KHRoaXMuX3ByZWNpc2lvbk1vZGVsPWFyZ3VtZW50c1swXSx0aGlzLl9TUklEPWFyZ3VtZW50c1sxXSk6Mz09PWFyZ3VtZW50cy5sZW5ndGgmJih0aGlzLl9wcmVjaXNpb25Nb2RlbD1hcmd1bWVudHNbMF0sdGhpcy5fU1JJRD1hcmd1bWVudHNbMV0sdGhpcy5fY29vcmRpbmF0ZVNlcXVlbmNlRmFjdG9yeT1hcmd1bWVudHNbMl0pKX0sTXM9e3NlcmlhbFZlcnNpb25VSUQ6e2NvbmZpZ3VyYWJsZTohMH19O0lzLnByb3RvdHlwZS50b0dlb21ldHJ5PWZ1bmN0aW9uKHQpe3JldHVybiB0LmlzTnVsbCgpP3RoaXMuY3JlYXRlUG9pbnQobnVsbCk6dC5nZXRNaW5YKCk9PT10LmdldE1heFgoKSYmdC5nZXRNaW5ZKCk9PT10LmdldE1heFkoKT90aGlzLmNyZWF0ZVBvaW50KG5ldyB2aSh0LmdldE1pblgoKSx0LmdldE1pblkoKSkpOnQuZ2V0TWluWCgpPT09dC5nZXRNYXhYKCl8fHQuZ2V0TWluWSgpPT09dC5nZXRNYXhZKCk/dGhpcy5jcmVhdGVMaW5lU3RyaW5nKFtuZXcgdmkodC5nZXRNaW5YKCksdC5nZXRNaW5ZKCkpLG5ldyB2aSh0LmdldE1heFgoKSx0LmdldE1heFkoKSldKTp0aGlzLmNyZWF0ZVBvbHlnb24odGhpcy5jcmVhdGVMaW5lYXJSaW5nKFtuZXcgdmkodC5nZXRNaW5YKCksdC5nZXRNaW5ZKCkpLG5ldyB2aSh0LmdldE1pblgoKSx0LmdldE1heFkoKSksbmV3IHZpKHQuZ2V0TWF4WCgpLHQuZ2V0TWF4WSgpKSxuZXcgdmkodC5nZXRNYXhYKCksdC5nZXRNaW5ZKCkpLG5ldyB2aSh0LmdldE1pblgoKSx0LmdldE1pblkoKSldKSxudWxsKX0sSXMucHJvdG90eXBlLmNyZWF0ZUxpbmVTdHJpbmc9ZnVuY3Rpb24odCl7cmV0dXJuIHQ/dCBpbnN0YW5jZW9mIEFycmF5P25ldyBhcyh0aGlzLmdldENvb3JkaW5hdGVTZXF1ZW5jZUZhY3RvcnkoKS5jcmVhdGUodCksdGhpcyk6RWkodCxMaSk/bmV3IGFzKHQsdGhpcyk6dm9pZCAwOm5ldyBhcyh0aGlzLmdldENvb3JkaW5hdGVTZXF1ZW5jZUZhY3RvcnkoKS5jcmVhdGUoW10pLHRoaXMpfSxJcy5wcm90b3R5cGUuY3JlYXRlTXVsdGlMaW5lU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT1hcmd1bWVudHMubGVuZ3RoP25ldyBabyhudWxsLHRoaXMpOjE9PT1hcmd1bWVudHMubGVuZ3RoP25ldyBabyhhcmd1bWVudHNbMF0sdGhpcyk6dm9pZCAwfSxJcy5wcm90b3R5cGUuYnVpbGRHZW9tZXRyeT1mdW5jdGlvbih0KXtmb3IodmFyIGU9bnVsbCxuPSExLHI9ITEsaT10Lml0ZXJhdG9yKCk7aS5oYXNOZXh0KCk7KXt2YXIgbz1pLm5leHQoKSxzPW8uZ2V0Q2xhc3MoKTtudWxsPT09ZSYmKGU9cykscyE9PWUmJihuPSEwKSxvLmlzR2VvbWV0cnlDb2xsZWN0aW9uT3JEZXJpdmVkKCkmJihyPSEwKX1pZihudWxsPT09ZSlyZXR1cm4gdGhpcy5jcmVhdGVHZW9tZXRyeUNvbGxlY3Rpb24oKTtpZihufHxyKXJldHVybiB0aGlzLmNyZWF0ZUdlb21ldHJ5Q29sbGVjdGlvbihJcy50b0dlb21ldHJ5QXJyYXkodCkpO3ZhciBhPXQuaXRlcmF0b3IoKS5uZXh0KCk7aWYodC5zaXplKCk+MSl7aWYoYSBpbnN0YW5jZW9mIGhzKXJldHVybiB0aGlzLmNyZWF0ZU11bHRpUG9seWdvbihJcy50b1BvbHlnb25BcnJheSh0KSk7aWYoYSBpbnN0YW5jZW9mIGFzKXJldHVybiB0aGlzLmNyZWF0ZU11bHRpTGluZVN0cmluZyhJcy50b0xpbmVTdHJpbmdBcnJheSh0KSk7aWYoYSBpbnN0YW5jZW9mIGNzKXJldHVybiB0aGlzLmNyZWF0ZU11bHRpUG9pbnQoSXMudG9Qb2ludEFycmF5KHQpKTtaaS5zaG91bGROZXZlclJlYWNoSGVyZSgiVW5oYW5kbGVkIGNsYXNzOiAiK2EuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpfXJldHVybiBhfSxJcy5wcm90b3R5cGUuY3JlYXRlTXVsdGlQb2ludEZyb21Db29yZHM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY3JlYXRlTXVsdGlQb2ludChudWxsIT09dD90aGlzLmdldENvb3JkaW5hdGVTZXF1ZW5jZUZhY3RvcnkoKS5jcmVhdGUodCk6bnVsbCl9LElzLnByb3RvdHlwZS5jcmVhdGVQb2ludD1mdW5jdGlvbigpe2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiB0aGlzLmNyZWF0ZVBvaW50KHRoaXMuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlRmFjdG9yeSgpLmNyZWF0ZShbXSkpO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHZpKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuY3JlYXRlUG9pbnQobnVsbCE9PXQ/dGhpcy5nZXRDb29yZGluYXRlU2VxdWVuY2VGYWN0b3J5KCkuY3JlYXRlKFt0XSk6bnVsbCl9aWYoRWkoYXJndW1lbnRzWzBdLExpKSlyZXR1cm4gbmV3IGNzKGFyZ3VtZW50c1swXSx0aGlzKX19LElzLnByb3RvdHlwZS5nZXRDb29yZGluYXRlU2VxdWVuY2VGYWN0b3J5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Nvb3JkaW5hdGVTZXF1ZW5jZUZhY3Rvcnl9LElzLnByb3RvdHlwZS5jcmVhdGVQb2x5Z29uPWZ1bmN0aW9uKCl7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIG5ldyBocyhudWxsLG51bGwsdGhpcyk7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKEVpKGFyZ3VtZW50c1swXSxMaSkpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5jcmVhdGVQb2x5Z29uKHRoaXMuY3JlYXRlTGluZWFyUmluZyh0KSl9aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBBcnJheSl7dmFyIGU9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLmNyZWF0ZVBvbHlnb24odGhpcy5jcmVhdGVMaW5lYXJSaW5nKGUpKX1pZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHBzKXt2YXIgbj1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuY3JlYXRlUG9seWdvbihuLG51bGwpfX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXtyZXR1cm4gbmV3IGhzKGFyZ3VtZW50c1swXSxhcmd1bWVudHNbMV0sdGhpcyl9fSxJcy5wcm90b3R5cGUuZ2V0U1JJRD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9TUklEfSxJcy5wcm90b3R5cGUuY3JlYXRlR2VvbWV0cnlDb2xsZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT1hcmd1bWVudHMubGVuZ3RoP25ldyBIbyhudWxsLHRoaXMpOjE9PT1hcmd1bWVudHMubGVuZ3RoP25ldyBIbyhhcmd1bWVudHNbMF0sdGhpcyk6dm9pZCAwfSxJcy5wcm90b3R5cGUuY3JlYXRlR2VvbWV0cnk9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBncyh0aGlzKS5lZGl0KHQse2VkaXQ6ZnVuY3Rpb24oKXtpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLl9jb29yZGluYXRlU2VxdWVuY2VGYWN0b3J5LmNyZWF0ZSh0KX19fSl9LElzLnByb3RvdHlwZS5nZXRQcmVjaXNpb25Nb2RlbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wcmVjaXNpb25Nb2RlbH0sSXMucHJvdG90eXBlLmNyZWF0ZUxpbmVhclJpbmc9ZnVuY3Rpb24oKXtpZigwPT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdGhpcy5jcmVhdGVMaW5lYXJSaW5nKHRoaXMuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlRmFjdG9yeSgpLmNyZWF0ZShbXSkpO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIEFycmF5KXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuY3JlYXRlTGluZWFyUmluZyhudWxsIT09dD90aGlzLmdldENvb3JkaW5hdGVTZXF1ZW5jZUZhY3RvcnkoKS5jcmVhdGUodCk6bnVsbCl9aWYoRWkoYXJndW1lbnRzWzBdLExpKSlyZXR1cm4gbmV3IHBzKGFyZ3VtZW50c1swXSx0aGlzKX19LElzLnByb3RvdHlwZS5jcmVhdGVNdWx0aVBvbHlnb249ZnVuY3Rpb24oKXtyZXR1cm4gMD09PWFyZ3VtZW50cy5sZW5ndGg/bmV3IGRzKG51bGwsdGhpcyk6MT09PWFyZ3VtZW50cy5sZW5ndGg/bmV3IGRzKGFyZ3VtZW50c1swXSx0aGlzKTp2b2lkIDB9LElzLnByb3RvdHlwZS5jcmVhdGVNdWx0aVBvaW50PWZ1bmN0aW9uKCl7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIG5ldyBmcyhudWxsLHRoaXMpO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIEFycmF5KXJldHVybiBuZXcgZnMoYXJndW1lbnRzWzBdLHRoaXMpO2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgQXJyYXkpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5jcmVhdGVNdWx0aVBvaW50KG51bGwhPT10P3RoaXMuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlRmFjdG9yeSgpLmNyZWF0ZSh0KTpudWxsKX1pZihFaShhcmd1bWVudHNbMF0sTGkpKXt2YXIgZT1hcmd1bWVudHNbMF07aWYobnVsbD09PWUpcmV0dXJuIHRoaXMuY3JlYXRlTXVsdGlQb2ludChuZXcgQXJyYXkoMCkuZmlsbChudWxsKSk7Zm9yKHZhciBuPW5ldyBBcnJheShlLnNpemUoKSkuZmlsbChudWxsKSxyPTA7cjxlLnNpemUoKTtyKyspe3ZhciBpPXRoaXMuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlRmFjdG9yeSgpLmNyZWF0ZSgxLGUuZ2V0RGltZW5zaW9uKCkpO3NzLmNvcHkoZSxyLGksMCwxKSxuW3JdPXRoaXMuY3JlYXRlUG9pbnQoaSl9cmV0dXJuIHRoaXMuY3JlYXRlTXVsdGlQb2ludChuKX19fSxJcy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bbWldfSxJcy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gSXN9LElzLnRvTXVsdGlQb2x5Z29uQXJyYXk9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IEFycmF5KHQuc2l6ZSgpKS5maWxsKG51bGwpO3JldHVybiB0LnRvQXJyYXkoZSl9LElzLnRvR2VvbWV0cnlBcnJheT1mdW5jdGlvbih0KXtpZihudWxsPT09dClyZXR1cm4gbnVsbDt2YXIgZT1uZXcgQXJyYXkodC5zaXplKCkpLmZpbGwobnVsbCk7cmV0dXJuIHQudG9BcnJheShlKX0sSXMuZ2V0RGVmYXVsdENvb3JkaW5hdGVTZXF1ZW5jZUZhY3Rvcnk9ZnVuY3Rpb24oKXtyZXR1cm4gYnMuaW5zdGFuY2UoKX0sSXMudG9NdWx0aUxpbmVTdHJpbmdBcnJheT1mdW5jdGlvbih0KXt2YXIgZT1uZXcgQXJyYXkodC5zaXplKCkpLmZpbGwobnVsbCk7cmV0dXJuIHQudG9BcnJheShlKX0sSXMudG9MaW5lU3RyaW5nQXJyYXk9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IEFycmF5KHQuc2l6ZSgpKS5maWxsKG51bGwpO3JldHVybiB0LnRvQXJyYXkoZSl9LElzLnRvTXVsdGlQb2ludEFycmF5PWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBBcnJheSh0LnNpemUoKSkuZmlsbChudWxsKTtyZXR1cm4gdC50b0FycmF5KGUpfSxJcy50b0xpbmVhclJpbmdBcnJheT1mdW5jdGlvbih0KXt2YXIgZT1uZXcgQXJyYXkodC5zaXplKCkpLmZpbGwobnVsbCk7cmV0dXJuIHQudG9BcnJheShlKX0sSXMudG9Qb2ludEFycmF5PWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBBcnJheSh0LnNpemUoKSkuZmlsbChudWxsKTtyZXR1cm4gdC50b0FycmF5KGUpfSxJcy50b1BvbHlnb25BcnJheT1mdW5jdGlvbih0KXt2YXIgZT1uZXcgQXJyYXkodC5zaXplKCkpLmZpbGwobnVsbCk7cmV0dXJuIHQudG9BcnJheShlKX0sSXMuY3JlYXRlUG9pbnRGcm9tSW50ZXJuYWxDb29yZD1mdW5jdGlvbih0LGUpe3JldHVybiBlLmdldFByZWNpc2lvbk1vZGVsKCkubWFrZVByZWNpc2UodCksZS5nZXRGYWN0b3J5KCkuY3JlYXRlUG9pbnQodCl9LE1zLnNlcmlhbFZlcnNpb25VSUQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuLTB4NWVhNzVmMjA1MWVlYjQwMH0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoSXMsTXMpO3ZhciBGcz1mdW5jdGlvbigpe30sVHM9e09OOntjb25maWd1cmFibGU6ITB9LExFRlQ6e2NvbmZpZ3VyYWJsZTohMH0sUklHSFQ6e2NvbmZpZ3VyYWJsZTohMH19O2Z1bmN0aW9uIE9zKHQpe3RoaXMubWVzc2FnZT10fHwiIn1mdW5jdGlvbiBMcygpe3RoaXMuYXJyYXlfPVtdfUZzLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxGcy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gRnN9LEZzLm9wcG9zaXRlPWZ1bmN0aW9uKHQpe3JldHVybiB0PT09RnMuTEVGVD9Gcy5SSUdIVDp0PT09RnMuUklHSFQ/RnMuTEVGVDp0fSxUcy5PTi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMH0sVHMuTEVGVC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMX0sVHMuUklHSFQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDJ9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEZzLFRzKSxPcy5wcm90b3R5cGU9bmV3IEVycm9yLE9zLnByb3RvdHlwZS5uYW1lPSJFbXB0eVN0YWNrRXhjZXB0aW9uIixMcy5wcm90b3R5cGU9bmV3IHZvLExzLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuYXJyYXlfLnB1c2godCksITB9LExzLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7aWYodDwwfHx0Pj10aGlzLnNpemUoKSl0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIHRoaXMuYXJyYXlfW3RdfSxMcy5wcm90b3R5cGUucHVzaD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5hcnJheV8ucHVzaCh0KSx0fSxMcy5wcm90b3R5cGUucG9wPWZ1bmN0aW9uKHQpe2lmKDA9PT10aGlzLmFycmF5Xy5sZW5ndGgpdGhyb3cgbmV3IE9zO3JldHVybiB0aGlzLmFycmF5Xy5wb3AoKX0sTHMucHJvdG90eXBlLnBlZWs9ZnVuY3Rpb24oKXtpZigwPT09dGhpcy5hcnJheV8ubGVuZ3RoKXRocm93IG5ldyBPcztyZXR1cm4gdGhpcy5hcnJheV9bdGhpcy5hcnJheV8ubGVuZ3RoLTFdfSxMcy5wcm90b3R5cGUuZW1wdHk9ZnVuY3Rpb24oKXtyZXR1cm4gMD09PXRoaXMuYXJyYXlfLmxlbmd0aH0sTHMucHJvdG90eXBlLmlzRW1wdHk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbXB0eSgpfSxMcy5wcm90b3R5cGUuc2VhcmNoPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmFycmF5Xy5pbmRleE9mKHQpfSxMcy5wcm90b3R5cGUuc2l6ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmFycmF5Xy5sZW5ndGh9LExzLnByb3RvdHlwZS50b0FycmF5PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLGU9MCxuPXRoaXMuYXJyYXlfLmxlbmd0aDtlPG47ZSsrKXQucHVzaCh0aGlzLmFycmF5X1tlXSk7cmV0dXJuIHR9O3ZhciBQcz1mdW5jdGlvbigpe3RoaXMuX21pbkluZGV4PS0xLHRoaXMuX21pbkNvb3JkPW51bGwsdGhpcy5fbWluRGU9bnVsbCx0aGlzLl9vcmllbnRlZERlPW51bGx9O1BzLnByb3RvdHlwZS5nZXRDb29yZGluYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21pbkNvb3JkfSxQcy5wcm90b3R5cGUuZ2V0UmlnaHRtb3N0U2lkZT1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuZ2V0UmlnaHRtb3N0U2lkZU9mU2VnbWVudCh0LGUpO3JldHVybiBuPDAmJihuPXRoaXMuZ2V0UmlnaHRtb3N0U2lkZU9mU2VnbWVudCh0LGUtMSkpLG48MCYmKHRoaXMuX21pbkNvb3JkPW51bGwsdGhpcy5jaGVja0ZvclJpZ2h0bW9zdENvb3JkaW5hdGUodCkpLG59LFBzLnByb3RvdHlwZS5maW5kUmlnaHRtb3N0RWRnZUF0VmVydGV4PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fbWluRGUuZ2V0RWRnZSgpLmdldENvb3JkaW5hdGVzKCk7WmkuaXNUcnVlKHRoaXMuX21pbkluZGV4PjAmJnRoaXMuX21pbkluZGV4PHQubGVuZ3RoLCJyaWdodG1vc3QgcG9pbnQgZXhwZWN0ZWQgdG8gYmUgaW50ZXJpb3IgdmVydGV4IG9mIGVkZ2UiKTt2YXIgZT10W3RoaXMuX21pbkluZGV4LTFdLG49dFt0aGlzLl9taW5JbmRleCsxXSxyPWVvLmNvbXB1dGVPcmllbnRhdGlvbih0aGlzLl9taW5Db29yZCxuLGUpLGk9ITE7KGUueTx0aGlzLl9taW5Db29yZC55JiZuLnk8dGhpcy5fbWluQ29vcmQueSYmcj09PWVvLkNPVU5URVJDTE9DS1dJU0V8fGUueT50aGlzLl9taW5Db29yZC55JiZuLnk+dGhpcy5fbWluQ29vcmQueSYmcj09PWVvLkNMT0NLV0lTRSkmJihpPSEwKSxpJiYodGhpcy5fbWluSW5kZXg9dGhpcy5fbWluSW5kZXgtMSl9LFBzLnByb3RvdHlwZS5nZXRSaWdodG1vc3RTaWRlT2ZTZWdtZW50PWZ1bmN0aW9uKHQsZSl7dmFyIG49dC5nZXRFZGdlKCkuZ2V0Q29vcmRpbmF0ZXMoKTtpZihlPDB8fGUrMT49bi5sZW5ndGh8fG5bZV0ueT09PW5bZSsxXS55KXJldHVybi0xO3ZhciByPUZzLkxFRlQ7cmV0dXJuIG5bZV0ueTxuW2UrMV0ueSYmKHI9RnMuUklHSFQpLHJ9LFBzLnByb3RvdHlwZS5nZXRFZGdlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29yaWVudGVkRGV9LFBzLnByb3RvdHlwZS5jaGVja0ZvclJpZ2h0bW9zdENvb3JkaW5hdGU9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMsbj10LmdldEVkZ2UoKS5nZXRDb29yZGluYXRlcygpLHI9MDtyPG4ubGVuZ3RoLTE7cisrKShudWxsPT09ZS5fbWluQ29vcmR8fG5bcl0ueD5lLl9taW5Db29yZC54KSYmKGUuX21pbkRlPXQsZS5fbWluSW5kZXg9cixlLl9taW5Db29yZD1uW3JdKX0sUHMucHJvdG90eXBlLmZpbmRSaWdodG1vc3RFZGdlQXROb2RlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fbWluRGUuZ2V0Tm9kZSgpLmdldEVkZ2VzKCk7dGhpcy5fbWluRGU9dC5nZXRSaWdodG1vc3RFZGdlKCksdGhpcy5fbWluRGUuaXNGb3J3YXJkKCl8fCh0aGlzLl9taW5EZT10aGlzLl9taW5EZS5nZXRTeW0oKSx0aGlzLl9taW5JbmRleD10aGlzLl9taW5EZS5nZXRFZGdlKCkuZ2V0Q29vcmRpbmF0ZXMoKS5sZW5ndGgtMSl9LFBzLnByb3RvdHlwZS5maW5kRWRnZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9dC5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7dmFyIG49ZS5uZXh0KCk7IW4uaXNGb3J3YXJkKCl8fHRoaXMuY2hlY2tGb3JSaWdodG1vc3RDb29yZGluYXRlKG4pfVppLmlzVHJ1ZSgwIT09dGhpcy5fbWluSW5kZXh8fHRoaXMuX21pbkNvb3JkLmVxdWFscyh0aGlzLl9taW5EZS5nZXRDb29yZGluYXRlKCkpLCJpbmNvbnNpc3RlbmN5IGluIHJpZ2h0bW9zdCBwcm9jZXNzaW5nIiksMD09PXRoaXMuX21pbkluZGV4P3RoaXMuZmluZFJpZ2h0bW9zdEVkZ2VBdE5vZGUoKTp0aGlzLmZpbmRSaWdodG1vc3RFZGdlQXRWZXJ0ZXgoKSx0aGlzLl9vcmllbnRlZERlPXRoaXMuX21pbkRlLHRoaXMuZ2V0UmlnaHRtb3N0U2lkZSh0aGlzLl9taW5EZSx0aGlzLl9taW5JbmRleCk9PT1Gcy5MRUZUJiYodGhpcy5fb3JpZW50ZWREZT10aGlzLl9taW5EZS5nZXRTeW0oKSl9LFBzLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxQcy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gUHN9O3ZhciBScz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKG4scil7dC5jYWxsKHRoaXMsZS5tc2dXaXRoQ29vcmQobixyKSksdGhpcy5wdD1yP25ldyB2aShyKTpudWxsLHRoaXMubmFtZT0iVG9wb2xvZ3lFeGNlcHRpb24ifXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5nZXRDb29yZGluYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHR9LGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LGUubXNnV2l0aENvb3JkPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGU/dDp0KyIgWyAiK2UrIiBdIn0sZX0oV2kpLEJzPWZ1bmN0aW9uKCl7dGhpcy5hcnJheV89W119O0JzLnByb3RvdHlwZS5hZGRMYXN0PWZ1bmN0aW9uKHQpe3RoaXMuYXJyYXlfLnB1c2godCl9LEJzLnByb3RvdHlwZS5yZW1vdmVGaXJzdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmFycmF5Xy5zaGlmdCgpfSxCcy5wcm90b3R5cGUuaXNFbXB0eT1mdW5jdGlvbigpe3JldHVybiAwPT09dGhpcy5hcnJheV8ubGVuZ3RofTt2YXIga3M9ZnVuY3Rpb24oKXt0aGlzLl9maW5kZXI9bnVsbCx0aGlzLl9kaXJFZGdlTGlzdD1uZXcgeG8sdGhpcy5fbm9kZXM9bmV3IHhvLHRoaXMuX3JpZ2h0TW9zdENvb3JkPW51bGwsdGhpcy5fZW52PW51bGwsdGhpcy5fZmluZGVyPW5ldyBQc307a3MucHJvdG90eXBlLmNsZWFyVmlzaXRlZEVkZ2VzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX2RpckVkZ2VMaXN0Lml0ZXJhdG9yKCk7dC5oYXNOZXh0KCk7KXt0Lm5leHQoKS5zZXRWaXNpdGVkKCExKX19LGtzLnByb3RvdHlwZS5nZXRSaWdodG1vc3RDb29yZGluYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JpZ2h0TW9zdENvb3JkfSxrcy5wcm90b3R5cGUuY29tcHV0ZU5vZGVEZXB0aD1mdW5jdGlvbih0KXtmb3IodmFyIGU9bnVsbCxuPXQuZ2V0RWRnZXMoKS5pdGVyYXRvcigpO24uaGFzTmV4dCgpOyl7dmFyIHI9bi5uZXh0KCk7aWYoci5pc1Zpc2l0ZWQoKXx8ci5nZXRTeW0oKS5pc1Zpc2l0ZWQoKSl7ZT1yO2JyZWFrfX1pZihudWxsPT09ZSl0aHJvdyBuZXcgUnMoInVuYWJsZSB0byBmaW5kIGVkZ2UgdG8gY29tcHV0ZSBkZXB0aHMgYXQgIit0LmdldENvb3JkaW5hdGUoKSk7dC5nZXRFZGdlcygpLmNvbXB1dGVEZXB0aHMoZSk7Zm9yKHZhciBpPXQuZ2V0RWRnZXMoKS5pdGVyYXRvcigpO2kuaGFzTmV4dCgpOyl7dmFyIG89aS5uZXh0KCk7by5zZXRWaXNpdGVkKCEwKSx0aGlzLmNvcHlTeW1EZXB0aHMobyl9fSxrcy5wcm90b3R5cGUuY29tcHV0ZURlcHRoPWZ1bmN0aW9uKHQpe3RoaXMuY2xlYXJWaXNpdGVkRWRnZXMoKTt2YXIgZT10aGlzLl9maW5kZXIuZ2V0RWRnZSgpO2Uuc2V0RWRnZURlcHRocyhGcy5SSUdIVCx0KSx0aGlzLmNvcHlTeW1EZXB0aHMoZSksdGhpcy5jb21wdXRlRGVwdGhzKGUpfSxrcy5wcm90b3R5cGUuY3JlYXRlPWZ1bmN0aW9uKHQpe3RoaXMuYWRkUmVhY2hhYmxlKHQpLHRoaXMuX2ZpbmRlci5maW5kRWRnZSh0aGlzLl9kaXJFZGdlTGlzdCksdGhpcy5fcmlnaHRNb3N0Q29vcmQ9dGhpcy5fZmluZGVyLmdldENvb3JkaW5hdGUoKX0sa3MucHJvdG90eXBlLmZpbmRSZXN1bHRFZGdlcz1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9kaXJFZGdlTGlzdC5pdGVyYXRvcigpO3QuaGFzTmV4dCgpOyl7dmFyIGU9dC5uZXh0KCk7ZS5nZXREZXB0aChGcy5SSUdIVCk+PTEmJmUuZ2V0RGVwdGgoRnMuTEVGVCk8PTAmJiFlLmlzSW50ZXJpb3JBcmVhRWRnZSgpJiZlLnNldEluUmVzdWx0KCEwKX19LGtzLnByb3RvdHlwZS5jb21wdXRlRGVwdGhzPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBGbyxuPW5ldyBCcyxyPXQuZ2V0Tm9kZSgpO2ZvcihuLmFkZExhc3QociksZS5hZGQociksdC5zZXRWaXNpdGVkKCEwKTshbi5pc0VtcHR5KCk7KXt2YXIgaT1uLnJlbW92ZUZpcnN0KCk7ZS5hZGQoaSksdGhpcy5jb21wdXRlTm9kZURlcHRoKGkpO2Zvcih2YXIgbz1pLmdldEVkZ2VzKCkuaXRlcmF0b3IoKTtvLmhhc05leHQoKTspe3ZhciBzPW8ubmV4dCgpLmdldFN5bSgpO2lmKCFzLmlzVmlzaXRlZCgpKXt2YXIgYT1zLmdldE5vZGUoKTtlLmNvbnRhaW5zKGEpfHwobi5hZGRMYXN0KGEpLGUuYWRkKGEpKX19fX0sa3MucHJvdG90eXBlLmNvbXBhcmVUbz1mdW5jdGlvbih0KXt2YXIgZT10O3JldHVybiB0aGlzLl9yaWdodE1vc3RDb29yZC54PGUuX3JpZ2h0TW9zdENvb3JkLng/LTE6dGhpcy5fcmlnaHRNb3N0Q29vcmQueD5lLl9yaWdodE1vc3RDb29yZC54PzE6MH0sa3MucHJvdG90eXBlLmdldEVudmVsb3BlPWZ1bmN0aW9uKCl7aWYobnVsbD09PXRoaXMuX2Vudil7Zm9yKHZhciB0PW5ldyBqaSxlPXRoaXMuX2RpckVkZ2VMaXN0Lml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KWZvcih2YXIgbj1lLm5leHQoKS5nZXRFZGdlKCkuZ2V0Q29vcmRpbmF0ZXMoKSxyPTA7cjxuLmxlbmd0aC0xO3IrKyl0LmV4cGFuZFRvSW5jbHVkZShuW3JdKTt0aGlzLl9lbnY9dH1yZXR1cm4gdGhpcy5fZW52fSxrcy5wcm90b3R5cGUuYWRkUmVhY2hhYmxlPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBMcztmb3IoZS5hZGQodCk7IWUuZW1wdHkoKTspe3ZhciBuPWUucG9wKCk7dGhpcy5hZGQobixlKX19LGtzLnByb3RvdHlwZS5jb3B5U3ltRGVwdGhzPWZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0U3ltKCk7ZS5zZXREZXB0aChGcy5MRUZULHQuZ2V0RGVwdGgoRnMuUklHSFQpKSxlLnNldERlcHRoKEZzLlJJR0hULHQuZ2V0RGVwdGgoRnMuTEVGVCkpfSxrcy5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQsZSl7dC5zZXRWaXNpdGVkKCEwKSx0aGlzLl9ub2Rlcy5hZGQodCk7Zm9yKHZhciBuPXQuZ2V0RWRnZXMoKS5pdGVyYXRvcigpO24uaGFzTmV4dCgpOyl7dmFyIHI9bi5uZXh0KCk7dGhpcy5fZGlyRWRnZUxpc3QuYWRkKHIpO3ZhciBpPXIuZ2V0U3ltKCkuZ2V0Tm9kZSgpO2kuaXNWaXNpdGVkKCl8fGUucHVzaChpKX19LGtzLnByb3RvdHlwZS5nZXROb2Rlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9ub2Rlc30sa3MucHJvdG90eXBlLmdldERpcmVjdGVkRWRnZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGlyRWRnZUxpc3R9LGtzLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltkaV19LGtzLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBrc307dmFyIHpzPWZ1bmN0aW9uIHQoKXtpZih0aGlzLmxvY2F0aW9uPW51bGwsMT09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgQXJyYXkpe3ZhciBlPWFyZ3VtZW50c1swXTt0aGlzLmluaXQoZS5sZW5ndGgpfWVsc2UgaWYoTnVtYmVyLmlzSW50ZWdlcihhcmd1bWVudHNbMF0pKXt2YXIgbj1hcmd1bWVudHNbMF07dGhpcy5pbml0KDEpLHRoaXMubG9jYXRpb25bRnMuT05dPW59ZWxzZSBpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHQpe3ZhciByPWFyZ3VtZW50c1swXTtpZih0aGlzLmluaXQoci5sb2NhdGlvbi5sZW5ndGgpLG51bGwhPT1yKWZvcih2YXIgaT0wO2k8dGhpcy5sb2NhdGlvbi5sZW5ndGg7aSsrKXRoaXMubG9jYXRpb25baV09ci5sb2NhdGlvbltpXX19ZWxzZSBpZigzPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIG89YXJndW1lbnRzWzBdLHM9YXJndW1lbnRzWzFdLGE9YXJndW1lbnRzWzJdO3RoaXMuaW5pdCgzKSx0aGlzLmxvY2F0aW9uW0ZzLk9OXT1vLHRoaXMubG9jYXRpb25bRnMuTEVGVF09cyx0aGlzLmxvY2F0aW9uW0ZzLlJJR0hUXT1hfX07enMucHJvdG90eXBlLnNldEFsbExvY2F0aW9ucz1mdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPHRoaXMubG9jYXRpb24ubGVuZ3RoO2UrKyl0aGlzLmxvY2F0aW9uW2VdPXR9LHpzLnByb3RvdHlwZS5pc051bGw9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9MDt0PHRoaXMubG9jYXRpb24ubGVuZ3RoO3QrKylpZih0aGlzLmxvY2F0aW9uW3RdIT09YmkuTk9ORSlyZXR1cm4hMTtyZXR1cm4hMH0senMucHJvdG90eXBlLnNldEFsbExvY2F0aW9uc0lmTnVsbD1mdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPHRoaXMubG9jYXRpb24ubGVuZ3RoO2UrKyl0aGlzLmxvY2F0aW9uW2VdPT09YmkuTk9ORSYmKHRoaXMubG9jYXRpb25bZV09dCl9LHpzLnByb3RvdHlwZS5pc0xpbmU9ZnVuY3Rpb24oKXtyZXR1cm4gMT09PXRoaXMubG9jYXRpb24ubGVuZ3RofSx6cy5wcm90b3R5cGUubWVyZ2U9ZnVuY3Rpb24odCl7aWYodC5sb2NhdGlvbi5sZW5ndGg+dGhpcy5sb2NhdGlvbi5sZW5ndGgpe3ZhciBlPW5ldyBBcnJheSgzKS5maWxsKG51bGwpO2VbRnMuT05dPXRoaXMubG9jYXRpb25bRnMuT05dLGVbRnMuTEVGVF09YmkuTk9ORSxlW0ZzLlJJR0hUXT1iaS5OT05FLHRoaXMubG9jYXRpb249ZX1mb3IodmFyIG49MDtuPHRoaXMubG9jYXRpb24ubGVuZ3RoO24rKyl0aGlzLmxvY2F0aW9uW25dPT09YmkuTk9ORSYmbjx0LmxvY2F0aW9uLmxlbmd0aCYmKHRoaXMubG9jYXRpb25bbl09dC5sb2NhdGlvbltuXSl9LHpzLnByb3RvdHlwZS5nZXRMb2NhdGlvbnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sb2NhdGlvbn0senMucHJvdG90eXBlLmZsaXA9ZnVuY3Rpb24oKXtpZih0aGlzLmxvY2F0aW9uLmxlbmd0aDw9MSlyZXR1cm4gbnVsbDt2YXIgdD10aGlzLmxvY2F0aW9uW0ZzLkxFRlRdO3RoaXMubG9jYXRpb25bRnMuTEVGVF09dGhpcy5sb2NhdGlvbltGcy5SSUdIVF0sdGhpcy5sb2NhdGlvbltGcy5SSUdIVF09dH0senMucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IEFpO3JldHVybiB0aGlzLmxvY2F0aW9uLmxlbmd0aD4xJiZ0LmFwcGVuZChiaS50b0xvY2F0aW9uU3ltYm9sKHRoaXMubG9jYXRpb25bRnMuTEVGVF0pKSx0LmFwcGVuZChiaS50b0xvY2F0aW9uU3ltYm9sKHRoaXMubG9jYXRpb25bRnMuT05dKSksdGhpcy5sb2NhdGlvbi5sZW5ndGg+MSYmdC5hcHBlbmQoYmkudG9Mb2NhdGlvblN5bWJvbCh0aGlzLmxvY2F0aW9uW0ZzLlJJR0hUXSkpLHQudG9TdHJpbmcoKX0senMucHJvdG90eXBlLnNldExvY2F0aW9ucz1mdW5jdGlvbih0LGUsbil7dGhpcy5sb2NhdGlvbltGcy5PTl09dCx0aGlzLmxvY2F0aW9uW0ZzLkxFRlRdPWUsdGhpcy5sb2NhdGlvbltGcy5SSUdIVF09bn0senMucHJvdG90eXBlLmdldD1mdW5jdGlvbih0KXtyZXR1cm4gdDx0aGlzLmxvY2F0aW9uLmxlbmd0aD90aGlzLmxvY2F0aW9uW3RdOmJpLk5PTkV9LHpzLnByb3RvdHlwZS5pc0FyZWE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sb2NhdGlvbi5sZW5ndGg+MX0senMucHJvdG90eXBlLmlzQW55TnVsbD1mdW5jdGlvbigpe2Zvcih2YXIgdD0wO3Q8dGhpcy5sb2NhdGlvbi5sZW5ndGg7dCsrKWlmKHRoaXMubG9jYXRpb25bdF09PT1iaS5OT05FKXJldHVybiEwO3JldHVybiExfSx6cy5wcm90b3R5cGUuc2V0TG9jYXRpb249ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuc2V0TG9jYXRpb24oRnMuT04sdCl9ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO3RoaXMubG9jYXRpb25bZV09bn19LHpzLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKHQpe3RoaXMubG9jYXRpb249bmV3IEFycmF5KHQpLmZpbGwobnVsbCksdGhpcy5zZXRBbGxMb2NhdGlvbnMoYmkuTk9ORSl9LHpzLnByb3RvdHlwZS5pc0VxdWFsT25TaWRlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMubG9jYXRpb25bZV09PT10LmxvY2F0aW9uW2VdfSx6cy5wcm90b3R5cGUuYWxsUG9zaXRpb25zRXF1YWw9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTA7ZTx0aGlzLmxvY2F0aW9uLmxlbmd0aDtlKyspaWYodGhpcy5sb2NhdGlvbltlXSE9PXQpcmV0dXJuITE7cmV0dXJuITB9LHpzLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSx6cy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4genN9O3ZhciBqcz1mdW5jdGlvbiB0KCl7aWYodGhpcy5lbHQ9bmV3IEFycmF5KDIpLmZpbGwobnVsbCksMT09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKE51bWJlci5pc0ludGVnZXIoYXJndW1lbnRzWzBdKSl7dmFyIGU9YXJndW1lbnRzWzBdO3RoaXMuZWx0WzBdPW5ldyB6cyhlKSx0aGlzLmVsdFsxXT1uZXcgenMoZSl9ZWxzZSBpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHQpe3ZhciBuPWFyZ3VtZW50c1swXTt0aGlzLmVsdFswXT1uZXcgenMobi5lbHRbMF0pLHRoaXMuZWx0WzFdPW5ldyB6cyhuLmVsdFsxXSl9fWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciByPWFyZ3VtZW50c1swXSxpPWFyZ3VtZW50c1sxXTt0aGlzLmVsdFswXT1uZXcgenMoYmkuTk9ORSksdGhpcy5lbHRbMV09bmV3IHpzKGJpLk5PTkUpLHRoaXMuZWx0W3JdLnNldExvY2F0aW9uKGkpfWVsc2UgaWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBvPWFyZ3VtZW50c1swXSxzPWFyZ3VtZW50c1sxXSxhPWFyZ3VtZW50c1syXTt0aGlzLmVsdFswXT1uZXcgenMobyxzLGEpLHRoaXMuZWx0WzFdPW5ldyB6cyhvLHMsYSl9ZWxzZSBpZig0PT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHU9YXJndW1lbnRzWzBdLGM9YXJndW1lbnRzWzFdLGw9YXJndW1lbnRzWzJdLGg9YXJndW1lbnRzWzNdO3RoaXMuZWx0WzBdPW5ldyB6cyhiaS5OT05FLGJpLk5PTkUsYmkuTk9ORSksdGhpcy5lbHRbMV09bmV3IHpzKGJpLk5PTkUsYmkuTk9ORSxiaS5OT05FKSx0aGlzLmVsdFt1XS5zZXRMb2NhdGlvbnMoYyxsLGgpfX07anMucHJvdG90eXBlLmdldEdlb21ldHJ5Q291bnQ9ZnVuY3Rpb24oKXt2YXIgdD0wO3JldHVybiB0aGlzLmVsdFswXS5pc051bGwoKXx8dCsrLHRoaXMuZWx0WzFdLmlzTnVsbCgpfHx0KyssdH0sanMucHJvdG90eXBlLnNldEFsbExvY2F0aW9ucz1mdW5jdGlvbih0LGUpe3RoaXMuZWx0W3RdLnNldEFsbExvY2F0aW9ucyhlKX0sanMucHJvdG90eXBlLmlzTnVsbD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lbHRbdF0uaXNOdWxsKCl9LGpzLnByb3RvdHlwZS5zZXRBbGxMb2NhdGlvbnNJZk51bGw9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuc2V0QWxsTG9jYXRpb25zSWZOdWxsKDAsdCksdGhpcy5zZXRBbGxMb2NhdGlvbnNJZk51bGwoMSx0KX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07dGhpcy5lbHRbZV0uc2V0QWxsTG9jYXRpb25zSWZOdWxsKG4pfX0sanMucHJvdG90eXBlLmlzTGluZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lbHRbdF0uaXNMaW5lKCl9LGpzLnByb3RvdHlwZS5tZXJnZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcyxuPTA7bjwyO24rKyludWxsPT09ZS5lbHRbbl0mJm51bGwhPT10LmVsdFtuXT9lLmVsdFtuXT1uZXcgenModC5lbHRbbl0pOmUuZWx0W25dLm1lcmdlKHQuZWx0W25dKX0sanMucHJvdG90eXBlLmZsaXA9ZnVuY3Rpb24oKXt0aGlzLmVsdFswXS5mbGlwKCksdGhpcy5lbHRbMV0uZmxpcCgpfSxqcy5wcm90b3R5cGUuZ2V0TG9jYXRpb249ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLmVsdFt0XS5nZXQoRnMuT04pfWlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07cmV0dXJuIHRoaXMuZWx0W2VdLmdldChuKX19LGpzLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3ZhciB0PW5ldyBBaTtyZXR1cm4gbnVsbCE9PXRoaXMuZWx0WzBdJiYodC5hcHBlbmQoIkE6IiksdC5hcHBlbmQodGhpcy5lbHRbMF0udG9TdHJpbmcoKSkpLG51bGwhPT10aGlzLmVsdFsxXSYmKHQuYXBwZW5kKCIgQjoiKSx0LmFwcGVuZCh0aGlzLmVsdFsxXS50b1N0cmluZygpKSksdC50b1N0cmluZygpfSxqcy5wcm90b3R5cGUuaXNBcmVhPWZ1bmN0aW9uKCl7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHRoaXMuZWx0WzBdLmlzQXJlYSgpfHx0aGlzLmVsdFsxXS5pc0FyZWEoKTtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLmVsdFt0XS5pc0FyZWEoKX19LGpzLnByb3RvdHlwZS5pc0FueU51bGw9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZWx0W3RdLmlzQW55TnVsbCgpfSxqcy5wcm90b3R5cGUuc2V0TG9jYXRpb249ZnVuY3Rpb24oKXtpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdO3RoaXMuZWx0W3RdLnNldExvY2F0aW9uKEZzLk9OLGUpfWVsc2UgaWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXSxpPWFyZ3VtZW50c1syXTt0aGlzLmVsdFtuXS5zZXRMb2NhdGlvbihyLGkpfX0sanMucHJvdG90eXBlLmlzRXF1YWxPblNpZGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5lbHRbMF0uaXNFcXVhbE9uU2lkZSh0LmVsdFswXSxlKSYmdGhpcy5lbHRbMV0uaXNFcXVhbE9uU2lkZSh0LmVsdFsxXSxlKX0sanMucHJvdG90eXBlLmFsbFBvc2l0aW9uc0VxdWFsPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuZWx0W3RdLmFsbFBvc2l0aW9uc0VxdWFsKGUpfSxqcy5wcm90b3R5cGUudG9MaW5lPWZ1bmN0aW9uKHQpe3RoaXMuZWx0W3RdLmlzQXJlYSgpJiYodGhpcy5lbHRbdF09bmV3IHpzKHRoaXMuZWx0W3RdLmxvY2F0aW9uWzBdKSl9LGpzLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxqcy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4ganN9LGpzLnRvTGluZUxhYmVsPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcganMoYmkuTk9ORSksbj0wO248MjtuKyspZS5zZXRMb2NhdGlvbihuLHQuZ2V0TG9jYXRpb24obikpO3JldHVybiBlfTt2YXIgVXM9ZnVuY3Rpb24oKXt0aGlzLl9zdGFydERlPW51bGwsdGhpcy5fbWF4Tm9kZURlZ3JlZT0tMSx0aGlzLl9lZGdlcz1uZXcgeG8sdGhpcy5fcHRzPW5ldyB4byx0aGlzLl9sYWJlbD1uZXcganMoYmkuTk9ORSksdGhpcy5fcmluZz1udWxsLHRoaXMuX2lzSG9sZT1udWxsLHRoaXMuX3NoZWxsPW51bGwsdGhpcy5faG9sZXM9bmV3IHhvLHRoaXMuX2dlb21ldHJ5RmFjdG9yeT1udWxsO3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXTt0aGlzLl9nZW9tZXRyeUZhY3Rvcnk9ZSx0aGlzLmNvbXB1dGVQb2ludHModCksdGhpcy5jb21wdXRlUmluZygpfTtVcy5wcm90b3R5cGUuY29tcHV0ZVJpbmc9ZnVuY3Rpb24oKXtpZihudWxsIT09dGhpcy5fcmluZylyZXR1cm4gbnVsbDtmb3IodmFyIHQ9bmV3IEFycmF5KHRoaXMuX3B0cy5zaXplKCkpLmZpbGwobnVsbCksZT0wO2U8dGhpcy5fcHRzLnNpemUoKTtlKyspdFtlXT10aGlzLl9wdHMuZ2V0KGUpO3RoaXMuX3Jpbmc9dGhpcy5fZ2VvbWV0cnlGYWN0b3J5LmNyZWF0ZUxpbmVhclJpbmcodCksdGhpcy5faXNIb2xlPWVvLmlzQ0NXKHRoaXMuX3JpbmcuZ2V0Q29vcmRpbmF0ZXMoKSl9LFVzLnByb3RvdHlwZS5pc0lzb2xhdGVkPWZ1bmN0aW9uKCl7cmV0dXJuIDE9PT10aGlzLl9sYWJlbC5nZXRHZW9tZXRyeUNvdW50KCl9LFVzLnByb3RvdHlwZS5jb21wdXRlUG9pbnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7dGhpcy5fc3RhcnREZT10O3ZhciBuPXQscj0hMDtkb3tpZihudWxsPT09bil0aHJvdyBuZXcgUnMoIkZvdW5kIG51bGwgRGlyZWN0ZWRFZGdlIik7aWYobi5nZXRFZGdlUmluZygpPT09ZSl0aHJvdyBuZXcgUnMoIkRpcmVjdGVkIEVkZ2UgdmlzaXRlZCB0d2ljZSBkdXJpbmcgcmluZy1idWlsZGluZyBhdCAiK24uZ2V0Q29vcmRpbmF0ZSgpKTtlLl9lZGdlcy5hZGQobik7dmFyIGk9bi5nZXRMYWJlbCgpO1ppLmlzVHJ1ZShpLmlzQXJlYSgpKSxlLm1lcmdlTGFiZWwoaSksZS5hZGRQb2ludHMobi5nZXRFZGdlKCksbi5pc0ZvcndhcmQoKSxyKSxyPSExLGUuc2V0RWRnZVJpbmcobixlKSxuPWUuZ2V0TmV4dChuKX13aGlsZShuIT09dGhpcy5fc3RhcnREZSl9LFVzLnByb3RvdHlwZS5nZXRMaW5lYXJSaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Jpbmd9LFVzLnByb3RvdHlwZS5nZXRDb29yZGluYXRlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wdHMuZ2V0KHQpfSxVcy5wcm90b3R5cGUuY29tcHV0ZU1heE5vZGVEZWdyZWU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuX21heE5vZGVEZWdyZWU9MDt2YXIgZT10aGlzLl9zdGFydERlO2Rve3ZhciBuPWUuZ2V0Tm9kZSgpLmdldEVkZ2VzKCkuZ2V0T3V0Z29pbmdEZWdyZWUodCk7bj50Ll9tYXhOb2RlRGVncmVlJiYodC5fbWF4Tm9kZURlZ3JlZT1uKSxlPXQuZ2V0TmV4dChlKX13aGlsZShlIT09dGhpcy5fc3RhcnREZSk7dGhpcy5fbWF4Tm9kZURlZ3JlZSo9Mn0sVXMucHJvdG90eXBlLmFkZFBvaW50cz1mdW5jdGlvbih0LGUsbil7dmFyIHI9dC5nZXRDb29yZGluYXRlcygpO2lmKGUpe3ZhciBpPTE7biYmKGk9MCk7Zm9yKHZhciBvPWk7bzxyLmxlbmd0aDtvKyspdGhpcy5fcHRzLmFkZChyW29dKX1lbHNle3ZhciBzPXIubGVuZ3RoLTI7biYmKHM9ci5sZW5ndGgtMSk7Zm9yKHZhciBhPXM7YT49MDthLS0pdGhpcy5fcHRzLmFkZChyW2FdKX19LFVzLnByb3RvdHlwZS5pc0hvbGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNIb2xlfSxVcy5wcm90b3R5cGUuc2V0SW5SZXN1bHQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9zdGFydERlO2Rve3QuZ2V0RWRnZSgpLnNldEluUmVzdWx0KCEwKSx0PXQuZ2V0TmV4dCgpfXdoaWxlKHQhPT10aGlzLl9zdGFydERlKX0sVXMucHJvdG90eXBlLmNvbnRhaW5zUG9pbnQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXRMaW5lYXJSaW5nKCk7aWYoIWUuZ2V0RW52ZWxvcGVJbnRlcm5hbCgpLmNvbnRhaW5zKHQpfHwhZW8uaXNQb2ludEluUmluZyh0LGUuZ2V0Q29vcmRpbmF0ZXMoKSkpcmV0dXJuITE7Zm9yKHZhciBuPXRoaXMuX2hvbGVzLml0ZXJhdG9yKCk7bi5oYXNOZXh0KCk7KXtpZihuLm5leHQoKS5jb250YWluc1BvaW50KHQpKXJldHVybiExfXJldHVybiEwfSxVcy5wcm90b3R5cGUuYWRkSG9sZT1mdW5jdGlvbih0KXt0aGlzLl9ob2xlcy5hZGQodCl9LFVzLnByb3RvdHlwZS5pc1NoZWxsPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PT10aGlzLl9zaGVsbH0sVXMucHJvdG90eXBlLmdldExhYmVsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xhYmVsfSxVcy5wcm90b3R5cGUuZ2V0RWRnZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZWRnZXN9LFVzLnByb3RvdHlwZS5nZXRNYXhOb2RlRGVncmVlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21heE5vZGVEZWdyZWU8MCYmdGhpcy5jb21wdXRlTWF4Tm9kZURlZ3JlZSgpLHRoaXMuX21heE5vZGVEZWdyZWV9LFVzLnByb3RvdHlwZS5nZXRTaGVsbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zaGVsbH0sVXMucHJvdG90eXBlLm1lcmdlTGFiZWw9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMubWVyZ2VMYWJlbCh0LDApLHRoaXMubWVyZ2VMYWJlbCh0LDEpfWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1sxXSxuPWFyZ3VtZW50c1swXS5nZXRMb2NhdGlvbihlLEZzLlJJR0hUKTtpZihuPT09YmkuTk9ORSlyZXR1cm4gbnVsbDtpZih0aGlzLl9sYWJlbC5nZXRMb2NhdGlvbihlKT09PWJpLk5PTkUpcmV0dXJuIHRoaXMuX2xhYmVsLnNldExvY2F0aW9uKGUsbiksbnVsbH19LFVzLnByb3RvdHlwZS5zZXRTaGVsbD1mdW5jdGlvbih0KXt0aGlzLl9zaGVsbD10LG51bGwhPT10JiZ0LmFkZEhvbGUodGhpcyl9LFVzLnByb3RvdHlwZS50b1BvbHlnb249ZnVuY3Rpb24odCl7Zm9yKHZhciBlPW5ldyBBcnJheSh0aGlzLl9ob2xlcy5zaXplKCkpLmZpbGwobnVsbCksbj0wO248dGhpcy5faG9sZXMuc2l6ZSgpO24rKyllW25dPXRoaXMuX2hvbGVzLmdldChuKS5nZXRMaW5lYXJSaW5nKCk7cmV0dXJuIHQuY3JlYXRlUG9seWdvbih0aGlzLmdldExpbmVhclJpbmcoKSxlKX0sVXMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LFVzLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBVc307dmFyIHFzPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07dC5jYWxsKHRoaXMsZSxuKX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuc2V0RWRnZVJpbmc9ZnVuY3Rpb24odCxlKXt0LnNldE1pbkVkZ2VSaW5nKGUpfSxlLnByb3RvdHlwZS5nZXROZXh0PWZ1bmN0aW9uKHQpe3JldHVybiB0LmdldE5leHRNaW4oKX0sZS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sZX0oVXMpLFZzPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07dC5jYWxsKHRoaXMsZSxuKX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuYnVpbGRNaW5pbWFsUmluZ3M9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgeG8sZT10aGlzLl9zdGFydERlO2Rve2lmKG51bGw9PT1lLmdldE1pbkVkZ2VSaW5nKCkpe3ZhciBuPW5ldyBxcyhlLHRoaXMuX2dlb21ldHJ5RmFjdG9yeSk7dC5hZGQobil9ZT1lLmdldE5leHQoKX13aGlsZShlIT09dGhpcy5fc3RhcnREZSk7cmV0dXJuIHR9LGUucHJvdG90eXBlLnNldEVkZ2VSaW5nPWZ1bmN0aW9uKHQsZSl7dC5zZXRFZGdlUmluZyhlKX0sZS5wcm90b3R5cGUubGlua0RpcmVjdGVkRWRnZXNGb3JNaW5pbWFsRWRnZVJpbmdzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fc3RhcnREZTtkb3t0LmdldE5vZGUoKS5nZXRFZGdlcygpLmxpbmtNaW5pbWFsRGlyZWN0ZWRFZGdlcyh0aGlzKSx0PXQuZ2V0TmV4dCgpfXdoaWxlKHQhPT10aGlzLl9zdGFydERlKX0sZS5wcm90b3R5cGUuZ2V0TmV4dD1mdW5jdGlvbih0KXtyZXR1cm4gdC5nZXROZXh0KCl9LGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LGV9KFVzKSxHcz1mdW5jdGlvbigpe2lmKHRoaXMuX2xhYmVsPW51bGwsdGhpcy5faXNJblJlc3VsdD0hMSx0aGlzLl9pc0NvdmVyZWQ9ITEsdGhpcy5faXNDb3ZlcmVkU2V0PSExLHRoaXMuX2lzVmlzaXRlZD0hMSwwIT09YXJndW1lbnRzLmxlbmd0aCYmMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLl9sYWJlbD10fX07R3MucHJvdG90eXBlLnNldFZpc2l0ZWQ9ZnVuY3Rpb24odCl7dGhpcy5faXNWaXNpdGVkPXR9LEdzLnByb3RvdHlwZS5zZXRJblJlc3VsdD1mdW5jdGlvbih0KXt0aGlzLl9pc0luUmVzdWx0PXR9LEdzLnByb3RvdHlwZS5pc0NvdmVyZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNDb3ZlcmVkfSxHcy5wcm90b3R5cGUuaXNDb3ZlcmVkU2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzQ292ZXJlZFNldH0sR3MucHJvdG90eXBlLnNldExhYmVsPWZ1bmN0aW9uKHQpe3RoaXMuX2xhYmVsPXR9LEdzLnByb3RvdHlwZS5nZXRMYWJlbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9sYWJlbH0sR3MucHJvdG90eXBlLnNldENvdmVyZWQ9ZnVuY3Rpb24odCl7dGhpcy5faXNDb3ZlcmVkPXQsdGhpcy5faXNDb3ZlcmVkU2V0PSEwfSxHcy5wcm90b3R5cGUudXBkYXRlSU09ZnVuY3Rpb24odCl7WmkuaXNUcnVlKHRoaXMuX2xhYmVsLmdldEdlb21ldHJ5Q291bnQoKT49MiwiZm91bmQgcGFydGlhbCBsYWJlbCIpLHRoaXMuY29tcHV0ZUlNKHQpfSxHcy5wcm90b3R5cGUuaXNJblJlc3VsdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pc0luUmVzdWx0fSxHcy5wcm90b3R5cGUuaXNWaXNpdGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzVmlzaXRlZH0sR3MucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LEdzLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBHc307dmFyIFlzPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt0LmNhbGwodGhpcyksdGhpcy5fY29vcmQ9bnVsbCx0aGlzLl9lZGdlcz1udWxsO3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTt0aGlzLl9jb29yZD1lLHRoaXMuX2VkZ2VzPW4sdGhpcy5fbGFiZWw9bmV3IGpzKDAsYmkuTk9ORSl9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmlzSW5jaWRlbnRFZGdlSW5SZXN1bHQ9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5nZXRFZGdlcygpLmdldEVkZ2VzKCkuaXRlcmF0b3IoKTt0Lmhhc05leHQoKTspe2lmKHQubmV4dCgpLmdldEVkZ2UoKS5pc0luUmVzdWx0KCkpcmV0dXJuITB9cmV0dXJuITF9LGUucHJvdG90eXBlLmlzSXNvbGF0ZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gMT09PXRoaXMuX2xhYmVsLmdldEdlb21ldHJ5Q291bnQoKX0sZS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb29yZH0sZS5wcm90b3R5cGUucHJpbnQ9ZnVuY3Rpb24odCl7dC5wcmludGxuKCJub2RlICIrdGhpcy5fY29vcmQrIiBsYmw6ICIrdGhpcy5fbGFiZWwpfSxlLnByb3RvdHlwZS5jb21wdXRlSU09ZnVuY3Rpb24odCl7fSxlLnByb3RvdHlwZS5jb21wdXRlTWVyZ2VkTG9jYXRpb249ZnVuY3Rpb24odCxlKXt2YXIgbj1iaS5OT05FO2lmKG49dGhpcy5fbGFiZWwuZ2V0TG9jYXRpb24oZSksIXQuaXNOdWxsKGUpKXt2YXIgcj10LmdldExvY2F0aW9uKGUpO24hPT1iaS5CT1VOREFSWSYmKG49cil9cmV0dXJuIG59LGUucHJvdG90eXBlLnNldExhYmVsPWZ1bmN0aW9uKCl7aWYoMiE9PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHQucHJvdG90eXBlLnNldExhYmVsLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07bnVsbD09PXRoaXMuX2xhYmVsP3RoaXMuX2xhYmVsPW5ldyBqcyhlLG4pOnRoaXMuX2xhYmVsLnNldExvY2F0aW9uKGUsbil9LGUucHJvdG90eXBlLmdldEVkZ2VzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VkZ2VzfSxlLnByb3RvdHlwZS5tZXJnZUxhYmVsPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIGUpe3ZhciBuPWFyZ3VtZW50c1swXTt0aGlzLm1lcmdlTGFiZWwobi5fbGFiZWwpfWVsc2UgaWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBqcylmb3IodmFyIHI9YXJndW1lbnRzWzBdLGk9MDtpPDI7aSsrKXt2YXIgbz10LmNvbXB1dGVNZXJnZWRMb2NhdGlvbihyLGkpO3QuX2xhYmVsLmdldExvY2F0aW9uKGkpPT09YmkuTk9ORSYmdC5fbGFiZWwuc2V0TG9jYXRpb24oaSxvKX19LGUucHJvdG90eXBlLmFkZD1mdW5jdGlvbih0KXt0aGlzLl9lZGdlcy5pbnNlcnQodCksdC5zZXROb2RlKHRoaXMpfSxlLnByb3RvdHlwZS5zZXRMYWJlbEJvdW5kYXJ5PWZ1bmN0aW9uKHQpe2lmKG51bGw9PT10aGlzLl9sYWJlbClyZXR1cm4gbnVsbDt2YXIgZT1iaS5OT05FO251bGwhPT10aGlzLl9sYWJlbCYmKGU9dGhpcy5fbGFiZWwuZ2V0TG9jYXRpb24odCkpO3ZhciBuPW51bGw7aWYoZT09PWJpLkJPVU5EQVJZKW49YmkuSU5URVJJT1I7ZWxzZSBuPWJpLkJPVU5EQVJZO3RoaXMuX2xhYmVsLnNldExvY2F0aW9uKHQsbil9LGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LGV9KEdzKSxYcz1mdW5jdGlvbigpe3RoaXMubm9kZU1hcD1uZXcga28sdGhpcy5ub2RlRmFjdD1udWxsO3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLm5vZGVGYWN0PXR9O1hzLnByb3RvdHlwZS5maW5kPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm5vZGVNYXAuZ2V0KHQpfSxYcy5wcm90b3R5cGUuYWRkTm9kZT1mdW5jdGlvbigpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2Ygdmkpe3ZhciB0PWFyZ3VtZW50c1swXSxlPXRoaXMubm9kZU1hcC5nZXQodCk7cmV0dXJuIG51bGw9PT1lJiYoZT10aGlzLm5vZGVGYWN0LmNyZWF0ZU5vZGUodCksdGhpcy5ub2RlTWFwLnB1dCh0LGUpKSxlfWlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgWXMpe3ZhciBuPWFyZ3VtZW50c1swXSxyPXRoaXMubm9kZU1hcC5nZXQobi5nZXRDb29yZGluYXRlKCkpO3JldHVybiBudWxsPT09cj8odGhpcy5ub2RlTWFwLnB1dChuLmdldENvb3JkaW5hdGUoKSxuKSxuKTooci5tZXJnZUxhYmVsKG4pLHIpfX0sWHMucHJvdG90eXBlLnByaW50PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXtlLm5leHQoKS5wcmludCh0KX19LFhzLnByb3RvdHlwZS5pdGVyYXRvcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGVNYXAudmFsdWVzKCkuaXRlcmF0b3IoKX0sWHMucHJvdG90eXBlLnZhbHVlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGVNYXAudmFsdWVzKCl9LFhzLnByb3RvdHlwZS5nZXRCb3VuZGFyeU5vZGVzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgeG8sbj10aGlzLml0ZXJhdG9yKCk7bi5oYXNOZXh0KCk7KXt2YXIgcj1uLm5leHQoKTtyLmdldExhYmVsKCkuZ2V0TG9jYXRpb24odCk9PT1iaS5CT1VOREFSWSYmZS5hZGQocil9cmV0dXJuIGV9LFhzLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCl7dmFyIGU9dC5nZXRDb29yZGluYXRlKCk7dGhpcy5hZGROb2RlKGUpLmFkZCh0KX0sWHMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LFhzLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBYc307dmFyIFdzPWZ1bmN0aW9uKCl7fSxIcz17TkU6e2NvbmZpZ3VyYWJsZTohMH0sTlc6e2NvbmZpZ3VyYWJsZTohMH0sU1c6e2NvbmZpZ3VyYWJsZTohMH0sU0U6e2NvbmZpZ3VyYWJsZTohMH19O1dzLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxXcy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gV3N9LFdzLmlzTm9ydGhlcm49ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT1Xcy5ORXx8dD09PVdzLk5XfSxXcy5pc09wcG9zaXRlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQhPT1lJiYyPT09KHQtZSs0KSU0fSxXcy5jb21tb25IYWxmUGxhbmU9ZnVuY3Rpb24odCxlKXtpZih0PT09ZSlyZXR1cm4gdDtpZigyPT09KHQtZSs0KSU0KXJldHVybi0xO3ZhciBuPXQ8ZT90OmU7cmV0dXJuIDA9PT1uJiYzPT09KHQ+ZT90OmUpPzM6bn0sV3MuaXNJbkhhbGZQbGFuZT1mdW5jdGlvbih0LGUpe3JldHVybiBlPT09V3MuU0U/dD09PVdzLlNFfHx0PT09V3MuU1c6dD09PWV8fHQ9PT1lKzF9LFdzLnF1YWRyYW50PWZ1bmN0aW9uKCl7aWYoIm51bWJlciI9PXR5cGVvZiBhcmd1bWVudHNbMF0mJiJudW1iZXIiPT10eXBlb2YgYXJndW1lbnRzWzFdKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV07aWYoMD09PXQmJjA9PT1lKXRocm93IG5ldyBoaTtyZXR1cm4gdD49MD9lPj0wP1dzLk5FOldzLlNFOmU+PTA/V3MuTlc6V3MuU1d9aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB2aSYmYXJndW1lbnRzWzFdaW5zdGFuY2VvZiB2aSl7dmFyIG49YXJndW1lbnRzWzBdLHI9YXJndW1lbnRzWzFdO2lmKHIueD09PW4ueCYmci55PT09bi55KXRocm93IG5ldyBoaTtyZXR1cm4gci54Pj1uLng/ci55Pj1uLnk/V3MuTkU6V3MuU0U6ci55Pj1uLnk/V3MuTlc6V3MuU1d9fSxIcy5ORS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMH0sSHMuTlcuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDF9LEhzLlNXLmdldD1mdW5jdGlvbigpe3JldHVybiAyfSxIcy5TRS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gM30sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoV3MsSHMpO3ZhciBacz1mdW5jdGlvbigpe2lmKHRoaXMuX2VkZ2U9bnVsbCx0aGlzLl9sYWJlbD1udWxsLHRoaXMuX25vZGU9bnVsbCx0aGlzLl9wMD1udWxsLHRoaXMuX3AxPW51bGwsdGhpcy5fZHg9bnVsbCx0aGlzLl9keT1udWxsLHRoaXMuX3F1YWRyYW50PW51bGwsMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLl9lZGdlPXR9ZWxzZSBpZigzPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdLHI9YXJndW1lbnRzWzJdO3RoaXMuX2VkZ2U9ZSx0aGlzLmluaXQobixyKSx0aGlzLl9sYWJlbD1udWxsfWVsc2UgaWYoND09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBpPWFyZ3VtZW50c1swXSxvPWFyZ3VtZW50c1sxXSxzPWFyZ3VtZW50c1syXSxhPWFyZ3VtZW50c1szXTt0aGlzLl9lZGdlPWksdGhpcy5pbml0KG8scyksdGhpcy5fbGFiZWw9YX19O1pzLnByb3RvdHlwZS5jb21wYXJlRGlyZWN0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9keD09PXQuX2R4JiZ0aGlzLl9keT09PXQuX2R5PzA6dGhpcy5fcXVhZHJhbnQ+dC5fcXVhZHJhbnQ/MTp0aGlzLl9xdWFkcmFudDx0Ll9xdWFkcmFudD8tMTplby5jb21wdXRlT3JpZW50YXRpb24odC5fcDAsdC5fcDEsdGhpcy5fcDEpfSxacy5wcm90b3R5cGUuZ2V0RHk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZHl9LFpzLnByb3RvdHlwZS5nZXRDb29yZGluYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3AwfSxacy5wcm90b3R5cGUuc2V0Tm9kZT1mdW5jdGlvbih0KXt0aGlzLl9ub2RlPXR9LFpzLnByb3RvdHlwZS5wcmludD1mdW5jdGlvbih0KXt2YXIgZT1NYXRoLmF0YW4yKHRoaXMuX2R5LHRoaXMuX2R4KSxuPXRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkscj1uLmxhc3RJbmRleE9mKCIuIiksaT1uLnN1YnN0cmluZyhyKzEpO3QucHJpbnQoIiAgIitpKyI6ICIrdGhpcy5fcDArIiAtICIrdGhpcy5fcDErIiAiK3RoaXMuX3F1YWRyYW50KyI6IitlKyIgICAiK3RoaXMuX2xhYmVsKX0sWnMucHJvdG90eXBlLmNvbXBhcmVUbz1mdW5jdGlvbih0KXt2YXIgZT10O3JldHVybiB0aGlzLmNvbXBhcmVEaXJlY3Rpb24oZSl9LFpzLnByb3RvdHlwZS5nZXREaXJlY3RlZENvb3JkaW5hdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcDF9LFpzLnByb3RvdHlwZS5nZXREeD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9keH0sWnMucHJvdG90eXBlLmdldExhYmVsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xhYmVsfSxacy5wcm90b3R5cGUuZ2V0RWRnZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9lZGdlfSxacy5wcm90b3R5cGUuZ2V0UXVhZHJhbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcXVhZHJhbnR9LFpzLnByb3RvdHlwZS5nZXROb2RlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX25vZGV9LFpzLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3ZhciB0PU1hdGguYXRhbjIodGhpcy5fZHksdGhpcy5fZHgpLGU9dGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSxuPWUubGFzdEluZGV4T2YoIi4iKTtyZXR1cm4iICAiK2Uuc3Vic3RyaW5nKG4rMSkrIjogIit0aGlzLl9wMCsiIC0gIit0aGlzLl9wMSsiICIrdGhpcy5fcXVhZHJhbnQrIjoiK3QrIiAgICIrdGhpcy5fbGFiZWx9LFpzLnByb3RvdHlwZS5jb21wdXRlTGFiZWw9ZnVuY3Rpb24odCl7fSxacy5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbih0LGUpe3RoaXMuX3AwPXQsdGhpcy5fcDE9ZSx0aGlzLl9keD1lLngtdC54LHRoaXMuX2R5PWUueS10LnksdGhpcy5fcXVhZHJhbnQ9V3MucXVhZHJhbnQodGhpcy5fZHgsdGhpcy5fZHkpLFppLmlzVHJ1ZSghKDA9PT10aGlzLl9keCYmMD09PXRoaXMuX2R5KSwiRWRnZUVuZCB3aXRoIGlkZW50aWNhbCBlbmRwb2ludHMgZm91bmQiKX0sWnMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW2RpXX0sWnMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFpzfTt2YXIgS3M9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTtpZih0LmNhbGwodGhpcyxlKSx0aGlzLl9pc0ZvcndhcmQ9bnVsbCx0aGlzLl9pc0luUmVzdWx0PSExLHRoaXMuX2lzVmlzaXRlZD0hMSx0aGlzLl9zeW09bnVsbCx0aGlzLl9uZXh0PW51bGwsdGhpcy5fbmV4dE1pbj1udWxsLHRoaXMuX2VkZ2VSaW5nPW51bGwsdGhpcy5fbWluRWRnZVJpbmc9bnVsbCx0aGlzLl9kZXB0aD1bMCwtOTk5LC05OTldLHRoaXMuX2lzRm9yd2FyZD1uLG4pdGhpcy5pbml0KGUuZ2V0Q29vcmRpbmF0ZSgwKSxlLmdldENvb3JkaW5hdGUoMSkpO2Vsc2V7dmFyIHI9ZS5nZXROdW1Qb2ludHMoKS0xO3RoaXMuaW5pdChlLmdldENvb3JkaW5hdGUociksZS5nZXRDb29yZGluYXRlKHItMSkpfXRoaXMuY29tcHV0ZURpcmVjdGVkTGFiZWwoKX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuZ2V0TmV4dE1pbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9uZXh0TWlufSxlLnByb3RvdHlwZS5nZXREZXB0aD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZGVwdGhbdF19LGUucHJvdG90eXBlLnNldFZpc2l0ZWQ9ZnVuY3Rpb24odCl7dGhpcy5faXNWaXNpdGVkPXR9LGUucHJvdG90eXBlLmNvbXB1dGVEaXJlY3RlZExhYmVsPWZ1bmN0aW9uKCl7dGhpcy5fbGFiZWw9bmV3IGpzKHRoaXMuX2VkZ2UuZ2V0TGFiZWwoKSksdGhpcy5faXNGb3J3YXJkfHx0aGlzLl9sYWJlbC5mbGlwKCl9LGUucHJvdG90eXBlLmdldE5leHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbmV4dH0sZS5wcm90b3R5cGUuc2V0RGVwdGg9ZnVuY3Rpb24odCxlKXtpZigtOTk5IT09dGhpcy5fZGVwdGhbdF0mJnRoaXMuX2RlcHRoW3RdIT09ZSl0aHJvdyBuZXcgUnMoImFzc2lnbmVkIGRlcHRocyBkbyBub3QgbWF0Y2giLHRoaXMuZ2V0Q29vcmRpbmF0ZSgpKTt0aGlzLl9kZXB0aFt0XT1lfSxlLnByb3RvdHlwZS5pc0ludGVyaW9yQXJlYUVkZ2U9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcyxlPSEwLG49MDtuPDI7bisrKXQuX2xhYmVsLmlzQXJlYShuKSYmdC5fbGFiZWwuZ2V0TG9jYXRpb24obixGcy5MRUZUKT09PWJpLklOVEVSSU9SJiZ0Ll9sYWJlbC5nZXRMb2NhdGlvbihuLEZzLlJJR0hUKT09PWJpLklOVEVSSU9SfHwoZT0hMSk7cmV0dXJuIGV9LGUucHJvdG90eXBlLnNldE5leHRNaW49ZnVuY3Rpb24odCl7dGhpcy5fbmV4dE1pbj10fSxlLnByb3RvdHlwZS5wcmludD1mdW5jdGlvbihlKXt0LnByb3RvdHlwZS5wcmludC5jYWxsKHRoaXMsZSksZS5wcmludCgiICIrdGhpcy5fZGVwdGhbRnMuTEVGVF0rIi8iK3RoaXMuX2RlcHRoW0ZzLlJJR0hUXSksZS5wcmludCgiICgiK3RoaXMuZ2V0RGVwdGhEZWx0YSgpKyIpIiksdGhpcy5faXNJblJlc3VsdCYmZS5wcmludCgiIGluUmVzdWx0Iil9LGUucHJvdG90eXBlLnNldE1pbkVkZ2VSaW5nPWZ1bmN0aW9uKHQpe3RoaXMuX21pbkVkZ2VSaW5nPXR9LGUucHJvdG90eXBlLmlzTGluZUVkZ2U9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9sYWJlbC5pc0xpbmUoMCl8fHRoaXMuX2xhYmVsLmlzTGluZSgxKSxlPSF0aGlzLl9sYWJlbC5pc0FyZWEoMCl8fHRoaXMuX2xhYmVsLmFsbFBvc2l0aW9uc0VxdWFsKDAsYmkuRVhURVJJT1IpLG49IXRoaXMuX2xhYmVsLmlzQXJlYSgxKXx8dGhpcy5fbGFiZWwuYWxsUG9zaXRpb25zRXF1YWwoMSxiaS5FWFRFUklPUik7cmV0dXJuIHQmJmUmJm59LGUucHJvdG90eXBlLnNldEVkZ2VSaW5nPWZ1bmN0aW9uKHQpe3RoaXMuX2VkZ2VSaW5nPXR9LGUucHJvdG90eXBlLmdldE1pbkVkZ2VSaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21pbkVkZ2VSaW5nfSxlLnByb3RvdHlwZS5nZXREZXB0aERlbHRhPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fZWRnZS5nZXREZXB0aERlbHRhKCk7cmV0dXJuIHRoaXMuX2lzRm9yd2FyZHx8KHQ9LXQpLHR9LGUucHJvdG90eXBlLnNldEluUmVzdWx0PWZ1bmN0aW9uKHQpe3RoaXMuX2lzSW5SZXN1bHQ9dH0sZS5wcm90b3R5cGUuZ2V0U3ltPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3N5bX0sZS5wcm90b3R5cGUuaXNGb3J3YXJkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzRm9yd2FyZH0sZS5wcm90b3R5cGUuZ2V0RWRnZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9lZGdlfSxlLnByb3RvdHlwZS5wcmludEVkZ2U9ZnVuY3Rpb24odCl7dGhpcy5wcmludCh0KSx0LnByaW50KCIgIiksdGhpcy5faXNGb3J3YXJkP3RoaXMuX2VkZ2UucHJpbnQodCk6dGhpcy5fZWRnZS5wcmludFJldmVyc2UodCl9LGUucHJvdG90eXBlLnNldFN5bT1mdW5jdGlvbih0KXt0aGlzLl9zeW09dH0sZS5wcm90b3R5cGUuc2V0VmlzaXRlZEVkZ2U9ZnVuY3Rpb24odCl7dGhpcy5zZXRWaXNpdGVkKHQpLHRoaXMuX3N5bS5zZXRWaXNpdGVkKHQpfSxlLnByb3RvdHlwZS5zZXRFZGdlRGVwdGhzPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5nZXRFZGdlKCkuZ2V0RGVwdGhEZWx0YSgpO3RoaXMuX2lzRm9yd2FyZHx8KG49LW4pO3ZhciByPTE7dD09PUZzLkxFRlQmJihyPS0xKTt2YXIgaT1Gcy5vcHBvc2l0ZSh0KSxvPWUrbipyO3RoaXMuc2V0RGVwdGgodCxlKSx0aGlzLnNldERlcHRoKGksbyl9LGUucHJvdG90eXBlLmdldEVkZ2VSaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VkZ2VSaW5nfSxlLnByb3RvdHlwZS5pc0luUmVzdWx0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzSW5SZXN1bHR9LGUucHJvdG90eXBlLnNldE5leHQ9ZnVuY3Rpb24odCl7dGhpcy5fbmV4dD10fSxlLnByb3RvdHlwZS5pc1Zpc2l0ZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNWaXNpdGVkfSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxlLmRlcHRoRmFjdG9yPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PT1iaS5FWFRFUklPUiYmZT09PWJpLklOVEVSSU9SPzE6dD09PWJpLklOVEVSSU9SJiZlPT09YmkuRVhURVJJT1I/LTE6MH0sZX0oWnMpLEpzPWZ1bmN0aW9uKCl7fTtKcy5wcm90b3R5cGUuY3JlYXRlTm9kZT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IFlzKHQsbnVsbCl9LEpzLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxKcy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gSnN9O3ZhciBRcz1mdW5jdGlvbigpe2lmKHRoaXMuX2VkZ2VzPW5ldyB4byx0aGlzLl9ub2Rlcz1udWxsLHRoaXMuX2VkZ2VFbmRMaXN0PW5ldyB4bywwPT09YXJndW1lbnRzLmxlbmd0aCl0aGlzLl9ub2Rlcz1uZXcgWHMobmV3IEpzKTtlbHNlIGlmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5fbm9kZXM9bmV3IFhzKHQpfX07UXMucHJvdG90eXBlLnByaW50RWRnZXM9ZnVuY3Rpb24odCl7dC5wcmludGxuKCJFZGdlczoiKTtmb3IodmFyIGU9MDtlPHRoaXMuX2VkZ2VzLnNpemUoKTtlKyspe3QucHJpbnRsbigiZWRnZSAiK2UrIjoiKTt2YXIgbj10aGlzLl9lZGdlcy5nZXQoZSk7bi5wcmludCh0KSxuLmVpTGlzdC5wcmludCh0KX19LFFzLnByb3RvdHlwZS5maW5kPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9ub2Rlcy5maW5kKHQpfSxRcy5wcm90b3R5cGUuYWRkTm9kZT1mdW5jdGlvbigpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgWXMpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5fbm9kZXMuYWRkTm9kZSh0KX1pZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHZpKXt2YXIgZT1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuX25vZGVzLmFkZE5vZGUoZSl9fSxRcy5wcm90b3R5cGUuZ2V0Tm9kZUl0ZXJhdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX25vZGVzLml0ZXJhdG9yKCl9LFFzLnByb3RvdHlwZS5saW5rUmVzdWx0RGlyZWN0ZWRFZGdlcz1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9ub2Rlcy5pdGVyYXRvcigpO3QuaGFzTmV4dCgpOyl7dC5uZXh0KCkuZ2V0RWRnZXMoKS5saW5rUmVzdWx0RGlyZWN0ZWRFZGdlcygpfX0sUXMucHJvdG90eXBlLmRlYnVnUHJpbnRsbj1mdW5jdGlvbih0KXtraS5vdXQucHJpbnRsbih0KX0sUXMucHJvdG90eXBlLmlzQm91bmRhcnlOb2RlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fbm9kZXMuZmluZChlKTtpZihudWxsPT09bilyZXR1cm4hMTt2YXIgcj1uLmdldExhYmVsKCk7cmV0dXJuIG51bGwhPT1yJiZyLmdldExvY2F0aW9uKHQpPT09YmkuQk9VTkRBUll9LFFzLnByb3RvdHlwZS5saW5rQWxsRGlyZWN0ZWRFZGdlcz1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9ub2Rlcy5pdGVyYXRvcigpO3QuaGFzTmV4dCgpOyl7dC5uZXh0KCkuZ2V0RWRnZXMoKS5saW5rQWxsRGlyZWN0ZWRFZGdlcygpfX0sUXMucHJvdG90eXBlLm1hdGNoSW5TYW1lRGlyZWN0aW9uPWZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiEhdC5lcXVhbHMobikmJihlby5jb21wdXRlT3JpZW50YXRpb24odCxlLHIpPT09ZW8uQ09MTElORUFSJiZXcy5xdWFkcmFudCh0LGUpPT09V3MucXVhZHJhbnQobixyKSl9LFFzLnByb3RvdHlwZS5nZXRFZGdlRW5kcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9lZGdlRW5kTGlzdH0sUXMucHJvdG90eXBlLmRlYnVnUHJpbnQ9ZnVuY3Rpb24odCl7a2kub3V0LnByaW50KHQpfSxRcy5wcm90b3R5cGUuZ2V0RWRnZUl0ZXJhdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VkZ2VzLml0ZXJhdG9yKCl9LFFzLnByb3RvdHlwZS5maW5kRWRnZUluU2FtZURpcmVjdGlvbj1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10aGlzLHI9MDtyPHRoaXMuX2VkZ2VzLnNpemUoKTtyKyspe3ZhciBpPW4uX2VkZ2VzLmdldChyKSxvPWkuZ2V0Q29vcmRpbmF0ZXMoKTtpZihuLm1hdGNoSW5TYW1lRGlyZWN0aW9uKHQsZSxvWzBdLG9bMV0pfHxuLm1hdGNoSW5TYW1lRGlyZWN0aW9uKHQsZSxvW28ubGVuZ3RoLTFdLG9bby5sZW5ndGgtMl0pKXJldHVybiBpfXJldHVybiBudWxsfSxRcy5wcm90b3R5cGUuaW5zZXJ0RWRnZT1mdW5jdGlvbih0KXt0aGlzLl9lZGdlcy5hZGQodCl9LFFzLnByb3RvdHlwZS5maW5kRWRnZUVuZD1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5nZXRFZGdlRW5kcygpLml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXt2YXIgbj1lLm5leHQoKTtpZihuLmdldEVkZ2UoKT09PXQpcmV0dXJuIG59cmV0dXJuIG51bGx9LFFzLnByb3RvdHlwZS5hZGRFZGdlcz1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcyxuPXQuaXRlcmF0b3IoKTtuLmhhc05leHQoKTspe3ZhciByPW4ubmV4dCgpO2UuX2VkZ2VzLmFkZChyKTt2YXIgaT1uZXcgS3MociwhMCksbz1uZXcgS3MociwhMSk7aS5zZXRTeW0obyksby5zZXRTeW0oaSksZS5hZGQoaSksZS5hZGQobyl9fSxRcy5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQpe3RoaXMuX25vZGVzLmFkZCh0KSx0aGlzLl9lZGdlRW5kTGlzdC5hZGQodCl9LFFzLnByb3RvdHlwZS5nZXROb2Rlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9ub2Rlcy52YWx1ZXMoKX0sUXMucHJvdG90eXBlLmZpbmRFZGdlPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPTA7bjx0aGlzLl9lZGdlcy5zaXplKCk7bisrKXt2YXIgcj10aGlzLl9lZGdlcy5nZXQobiksaT1yLmdldENvb3JkaW5hdGVzKCk7aWYodC5lcXVhbHMoaVswXSkmJmUuZXF1YWxzKGlbMV0pKXJldHVybiByfXJldHVybiBudWxsfSxRcy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sUXMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFFzfSxRcy5saW5rUmVzdWx0RGlyZWN0ZWRFZGdlcz1mdW5jdGlvbih0KXtmb3IodmFyIGU9dC5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7ZS5uZXh0KCkuZ2V0RWRnZXMoKS5saW5rUmVzdWx0RGlyZWN0ZWRFZGdlcygpfX07dmFyICRzPWZ1bmN0aW9uKCl7dGhpcy5fZ2VvbWV0cnlGYWN0b3J5PW51bGwsdGhpcy5fc2hlbGxMaXN0PW5ldyB4bzt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5fZ2VvbWV0cnlGYWN0b3J5PXR9OyRzLnByb3RvdHlwZS5zb3J0U2hlbGxzQW5kSG9sZXM9ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj10Lml0ZXJhdG9yKCk7ci5oYXNOZXh0KCk7KXt2YXIgaT1yLm5leHQoKTtpLmlzSG9sZSgpP24uYWRkKGkpOmUuYWRkKGkpfX0sJHMucHJvdG90eXBlLmNvbXB1dGVQb2x5Z29ucz1mdW5jdGlvbih0KXtmb3IodmFyIGU9bmV3IHhvLG49dC5pdGVyYXRvcigpO24uaGFzTmV4dCgpOyl7dmFyIHI9bi5uZXh0KCkudG9Qb2x5Z29uKHRoaXMuX2dlb21ldHJ5RmFjdG9yeSk7ZS5hZGQocil9cmV0dXJuIGV9LCRzLnByb3RvdHlwZS5wbGFjZUZyZWVIb2xlcz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1lLml0ZXJhdG9yKCk7bi5oYXNOZXh0KCk7KXt2YXIgcj1uLm5leHQoKTtpZihudWxsPT09ci5nZXRTaGVsbCgpKXt2YXIgaT10aGlzLmZpbmRFZGdlUmluZ0NvbnRhaW5pbmcocix0KTtpZihudWxsPT09aSl0aHJvdyBuZXcgUnMoInVuYWJsZSB0byBhc3NpZ24gaG9sZSB0byBhIHNoZWxsIixyLmdldENvb3JkaW5hdGUoMCkpO3Iuc2V0U2hlbGwoaSl9fX0sJHMucHJvdG90eXBlLmJ1aWxkTWluaW1hbEVkZ2VSaW5ncz1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPW5ldyB4byxpPXQuaXRlcmF0b3IoKTtpLmhhc05leHQoKTspe3ZhciBvPWkubmV4dCgpO2lmKG8uZ2V0TWF4Tm9kZURlZ3JlZSgpPjIpe28ubGlua0RpcmVjdGVkRWRnZXNGb3JNaW5pbWFsRWRnZVJpbmdzKCk7dmFyIHM9by5idWlsZE1pbmltYWxSaW5ncygpLGE9dGhpcy5maW5kU2hlbGwocyk7bnVsbCE9PWE/KHRoaXMucGxhY2VQb2x5Z29uSG9sZXMoYSxzKSxlLmFkZChhKSk6bi5hZGRBbGwocyl9ZWxzZSByLmFkZChvKX1yZXR1cm4gcn0sJHMucHJvdG90eXBlLmNvbnRhaW5zUG9pbnQ9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuX3NoZWxsTGlzdC5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7aWYoZS5uZXh0KCkuY29udGFpbnNQb2ludCh0KSlyZXR1cm4hMH1yZXR1cm4hMX0sJHMucHJvdG90eXBlLmJ1aWxkTWF4aW1hbEVkZ2VSaW5ncz1mdW5jdGlvbih0KXtmb3IodmFyIGU9bmV3IHhvLG49dC5pdGVyYXRvcigpO24uaGFzTmV4dCgpOyl7dmFyIHI9bi5uZXh0KCk7aWYoci5pc0luUmVzdWx0KCkmJnIuZ2V0TGFiZWwoKS5pc0FyZWEoKSYmbnVsbD09PXIuZ2V0RWRnZVJpbmcoKSl7dmFyIGk9bmV3IFZzKHIsdGhpcy5fZ2VvbWV0cnlGYWN0b3J5KTtlLmFkZChpKSxpLnNldEluUmVzdWx0KCl9fXJldHVybiBlfSwkcy5wcm90b3R5cGUucGxhY2VQb2x5Z29uSG9sZXM9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49ZS5pdGVyYXRvcigpO24uaGFzTmV4dCgpOyl7dmFyIHI9bi5uZXh0KCk7ci5pc0hvbGUoKSYmci5zZXRTaGVsbCh0KX19LCRzLnByb3RvdHlwZS5nZXRQb2x5Z29ucz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbXB1dGVQb2x5Z29ucyh0aGlzLl9zaGVsbExpc3QpfSwkcy5wcm90b3R5cGUuZmluZEVkZ2VSaW5nQ29udGFpbmluZz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10LmdldExpbmVhclJpbmcoKSxyPW4uZ2V0RW52ZWxvcGVJbnRlcm5hbCgpLGk9bi5nZXRDb29yZGluYXRlTigwKSxvPW51bGwscz1udWxsLGE9ZS5pdGVyYXRvcigpO2EuaGFzTmV4dCgpOyl7dmFyIHU9YS5uZXh0KCksYz11LmdldExpbmVhclJpbmcoKSxsPWMuZ2V0RW52ZWxvcGVJbnRlcm5hbCgpO251bGwhPT1vJiYocz1vLmdldExpbmVhclJpbmcoKS5nZXRFbnZlbG9wZUludGVybmFsKCkpO3ZhciBoPSExO2wuY29udGFpbnMocikmJmVvLmlzUG9pbnRJblJpbmcoaSxjLmdldENvb3JkaW5hdGVzKCkpJiYoaD0hMCksaCYmKG51bGw9PT1vfHxzLmNvbnRhaW5zKGwpKSYmKG89dSl9cmV0dXJuIG99LCRzLnByb3RvdHlwZS5maW5kU2hlbGw9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTAsbj1udWxsLHI9dC5pdGVyYXRvcigpO3IuaGFzTmV4dCgpOyl7dmFyIGk9ci5uZXh0KCk7aS5pc0hvbGUoKXx8KG49aSxlKyspfXJldHVybiBaaS5pc1RydWUoZTw9MSwiZm91bmQgdHdvIHNoZWxscyBpbiBNaW5pbWFsRWRnZVJpbmcgbGlzdCIpLG59LCRzLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuYWRkKHQuZ2V0RWRnZUVuZHMoKSx0LmdldE5vZGVzKCkpfWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXTtRcy5saW5rUmVzdWx0RGlyZWN0ZWRFZGdlcyhhcmd1bWVudHNbMV0pO3ZhciBuPXRoaXMuYnVpbGRNYXhpbWFsRWRnZVJpbmdzKGUpLHI9bmV3IHhvLGk9dGhpcy5idWlsZE1pbmltYWxFZGdlUmluZ3Mobix0aGlzLl9zaGVsbExpc3Qscik7dGhpcy5zb3J0U2hlbGxzQW5kSG9sZXMoaSx0aGlzLl9zaGVsbExpc3QsciksdGhpcy5wbGFjZUZyZWVIb2xlcyh0aGlzLl9zaGVsbExpc3Qscil9fSwkcy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sJHMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuICRzfTt2YXIgdGE9ZnVuY3Rpb24oKXt9O3RhLnByb3RvdHlwZS5nZXRCb3VuZHM9ZnVuY3Rpb24oKXt9LHRhLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSx0YS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gdGF9O3ZhciBlYT1mdW5jdGlvbigpe3RoaXMuX2JvdW5kcz1udWxsLHRoaXMuX2l0ZW09bnVsbDt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV07dGhpcy5fYm91bmRzPXQsdGhpcy5faXRlbT1lfTtlYS5wcm90b3R5cGUuZ2V0SXRlbT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pdGVtfSxlYS5wcm90b3R5cGUuZ2V0Qm91bmRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2JvdW5kc30sZWEucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW3RhLG1pXX0sZWEucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGVhfTt2YXIgbmE9ZnVuY3Rpb24oKXt0aGlzLl9zaXplPW51bGwsdGhpcy5faXRlbXM9bnVsbCx0aGlzLl9zaXplPTAsdGhpcy5faXRlbXM9bmV3IHhvLHRoaXMuX2l0ZW1zLmFkZChudWxsKX07bmEucHJvdG90eXBlLnBvbGw9ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW1wdHkoKSlyZXR1cm4gbnVsbDt2YXIgdD10aGlzLl9pdGVtcy5nZXQoMSk7cmV0dXJuIHRoaXMuX2l0ZW1zLnNldCgxLHRoaXMuX2l0ZW1zLmdldCh0aGlzLl9zaXplKSksdGhpcy5fc2l6ZS09MSx0aGlzLnJlb3JkZXIoMSksdH0sbmEucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2l6ZX0sbmEucHJvdG90eXBlLnJlb3JkZXI9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMsbj1udWxsLHI9dGhpcy5faXRlbXMuZ2V0KHQpOzIqdDw9dGhpcy5fc2l6ZSYmKChuPTIqdCkhPT1lLl9zaXplJiZlLl9pdGVtcy5nZXQobisxKS5jb21wYXJlVG8oZS5faXRlbXMuZ2V0KG4pKTwwJiZuKyssZS5faXRlbXMuZ2V0KG4pLmNvbXBhcmVUbyhyKTwwKTt0PW4pZS5faXRlbXMuc2V0KHQsZS5faXRlbXMuZ2V0KG4pKTt0aGlzLl9pdGVtcy5zZXQodCxyKX0sbmEucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5fc2l6ZT0wLHRoaXMuX2l0ZW1zLmNsZWFyKCl9LG5hLnByb3RvdHlwZS5pc0VtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLl9zaXplfSxuYS5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQpe3RoaXMuX2l0ZW1zLmFkZChudWxsKSx0aGlzLl9zaXplKz0xO3ZhciBlPXRoaXMuX3NpemU7Zm9yKHRoaXMuX2l0ZW1zLnNldCgwLHQpO3QuY29tcGFyZVRvKHRoaXMuX2l0ZW1zLmdldChNYXRoLnRydW5jKGUvMikpKTwwO2UvPTIpdGhpcy5faXRlbXMuc2V0KGUsdGhpcy5faXRlbXMuZ2V0KE1hdGgudHJ1bmMoZS8yKSkpO3RoaXMuX2l0ZW1zLnNldChlLHQpfSxuYS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sbmEucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIG5hfTt2YXIgcmE9ZnVuY3Rpb24oKXt9O3JhLnByb3RvdHlwZS52aXNpdEl0ZW09ZnVuY3Rpb24odCl7fSxyYS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0scmEucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHJhfTt2YXIgaWE9ZnVuY3Rpb24oKXt9O2lhLnByb3RvdHlwZS5pbnNlcnQ9ZnVuY3Rpb24odCxlKXt9LGlhLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24odCxlKXt9LGlhLnByb3RvdHlwZS5xdWVyeT1mdW5jdGlvbigpe30saWEucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGlhLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBpYX07dmFyIG9hPWZ1bmN0aW9uKCl7aWYodGhpcy5fY2hpbGRCb3VuZGFibGVzPW5ldyB4byx0aGlzLl9ib3VuZHM9bnVsbCx0aGlzLl9sZXZlbD1udWxsLDAhPT1hcmd1bWVudHMubGVuZ3RoJiYxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuX2xldmVsPXR9fSxzYT17c2VyaWFsVmVyc2lvblVJRDp7Y29uZmlndXJhYmxlOiEwfX07b2EucHJvdG90eXBlLmdldExldmVsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xldmVsfSxvYS5wcm90b3R5cGUuc2l6ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jaGlsZEJvdW5kYWJsZXMuc2l6ZSgpfSxvYS5wcm90b3R5cGUuZ2V0Q2hpbGRCb3VuZGFibGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NoaWxkQm91bmRhYmxlc30sb2EucHJvdG90eXBlLmFkZENoaWxkQm91bmRhYmxlPWZ1bmN0aW9uKHQpe1ppLmlzVHJ1ZShudWxsPT09dGhpcy5fYm91bmRzKSx0aGlzLl9jaGlsZEJvdW5kYWJsZXMuYWRkKHQpfSxvYS5wcm90b3R5cGUuaXNFbXB0eT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jaGlsZEJvdW5kYWJsZXMuaXNFbXB0eSgpfSxvYS5wcm90b3R5cGUuZ2V0Qm91bmRzPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PT10aGlzLl9ib3VuZHMmJih0aGlzLl9ib3VuZHM9dGhpcy5jb21wdXRlQm91bmRzKCkpLHRoaXMuX2JvdW5kc30sb2EucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW3RhLG1pXX0sb2EucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIG9hfSxzYS5zZXJpYWxWZXJzaW9uVUlELmdldD1mdW5jdGlvbigpe3JldHVybiAweDVhMWU1NWVjNDEzNjk4MDB9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG9hLHNhKTt2YXIgYWE9ZnVuY3Rpb24oKXt9O2FhLnJldmVyc2VPcmRlcj1mdW5jdGlvbigpe3JldHVybntjb21wYXJlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUuY29tcGFyZVRvKHQpfX19LGFhLm1pbj1mdW5jdGlvbih0KXtyZXR1cm4gYWEuc29ydCh0KSx0LmdldCgwKX0sYWEuc29ydD1mdW5jdGlvbih0LGUpe3ZhciBuPXQudG9BcnJheSgpO2U/Vm8uc29ydChuLGUpOlZvLnNvcnQobik7Zm9yKHZhciByPXQuaXRlcmF0b3IoKSxpPTAsbz1uLmxlbmd0aDtpPG87aSsrKXIubmV4dCgpLHIuc2V0KG5baV0pfSxhYS5zaW5nbGV0b25MaXN0PWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyB4bztyZXR1cm4gZS5hZGQodCksZX07dmFyIHVhPWZ1bmN0aW9uKCl7dGhpcy5fYm91bmRhYmxlMT1udWxsLHRoaXMuX2JvdW5kYWJsZTI9bnVsbCx0aGlzLl9kaXN0YW5jZT1udWxsLHRoaXMuX2l0ZW1EaXN0YW5jZT1udWxsO3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXSxuPWFyZ3VtZW50c1syXTt0aGlzLl9ib3VuZGFibGUxPXQsdGhpcy5fYm91bmRhYmxlMj1lLHRoaXMuX2l0ZW1EaXN0YW5jZT1uLHRoaXMuX2Rpc3RhbmNlPXRoaXMuZGlzdGFuY2UoKX07dWEucHJvdG90eXBlLmV4cGFuZFRvUXVldWU9ZnVuY3Rpb24odCxlKXt2YXIgbj11YS5pc0NvbXBvc2l0ZSh0aGlzLl9ib3VuZGFibGUxKSxyPXVhLmlzQ29tcG9zaXRlKHRoaXMuX2JvdW5kYWJsZTIpO2lmKG4mJnIpcmV0dXJuIHVhLmFyZWEodGhpcy5fYm91bmRhYmxlMSk+dWEuYXJlYSh0aGlzLl9ib3VuZGFibGUyKT8odGhpcy5leHBhbmQodGhpcy5fYm91bmRhYmxlMSx0aGlzLl9ib3VuZGFibGUyLHQsZSksbnVsbCk6KHRoaXMuZXhwYW5kKHRoaXMuX2JvdW5kYWJsZTIsdGhpcy5fYm91bmRhYmxlMSx0LGUpLG51bGwpO2lmKG4pcmV0dXJuIHRoaXMuZXhwYW5kKHRoaXMuX2JvdW5kYWJsZTEsdGhpcy5fYm91bmRhYmxlMix0LGUpLG51bGw7aWYocilyZXR1cm4gdGhpcy5leHBhbmQodGhpcy5fYm91bmRhYmxlMix0aGlzLl9ib3VuZGFibGUxLHQsZSksbnVsbDt0aHJvdyBuZXcgaGl9LHVhLnByb3RvdHlwZS5pc0xlYXZlcz1mdW5jdGlvbigpe3JldHVybiEodWEuaXNDb21wb3NpdGUodGhpcy5fYm91bmRhYmxlMSl8fHVhLmlzQ29tcG9zaXRlKHRoaXMuX2JvdW5kYWJsZTIpKX0sdWEucHJvdG90eXBlLmNvbXBhcmVUbz1mdW5jdGlvbih0KXt2YXIgZT10O3JldHVybiB0aGlzLl9kaXN0YW5jZTxlLl9kaXN0YW5jZT8tMTp0aGlzLl9kaXN0YW5jZT5lLl9kaXN0YW5jZT8xOjB9LHVhLnByb3RvdHlwZS5leHBhbmQ9ZnVuY3Rpb24odCxlLG4scil7Zm9yKHZhciBpPXQuZ2V0Q2hpbGRCb3VuZGFibGVzKCkuaXRlcmF0b3IoKTtpLmhhc05leHQoKTspe3ZhciBvPWkubmV4dCgpLHM9bmV3IHVhKG8sZSx0aGlzLl9pdGVtRGlzdGFuY2UpO3MuZ2V0RGlzdGFuY2UoKTxyJiZuLmFkZChzKX19LHVhLnByb3RvdHlwZS5nZXRCb3VuZGFibGU9ZnVuY3Rpb24odCl7cmV0dXJuIDA9PT10P3RoaXMuX2JvdW5kYWJsZTE6dGhpcy5fYm91bmRhYmxlMn0sdWEucHJvdG90eXBlLmdldERpc3RhbmNlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Rpc3RhbmNlfSx1YS5wcm90b3R5cGUuZGlzdGFuY2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc0xlYXZlcygpP3RoaXMuX2l0ZW1EaXN0YW5jZS5kaXN0YW5jZSh0aGlzLl9ib3VuZGFibGUxLHRoaXMuX2JvdW5kYWJsZTIpOnRoaXMuX2JvdW5kYWJsZTEuZ2V0Qm91bmRzKCkuZGlzdGFuY2UodGhpcy5fYm91bmRhYmxlMi5nZXRCb3VuZHMoKSl9LHVhLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltkaV19LHVhLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiB1YX0sdWEuYXJlYT1mdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRCb3VuZHMoKS5nZXRBcmVhKCl9LHVhLmlzQ29tcG9zaXRlPWZ1bmN0aW9uKHQpe3JldHVybiB0IGluc3RhbmNlb2Ygb2F9O3ZhciBjYT1mdW5jdGlvbiB0KCl7aWYodGhpcy5fcm9vdD1udWxsLHRoaXMuX2J1aWx0PSExLHRoaXMuX2l0ZW1Cb3VuZGFibGVzPW5ldyB4byx0aGlzLl9ub2RlQ2FwYWNpdHk9bnVsbCwwPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9dC5ERUZBVUxUX05PREVfQ0FQQUNJVFk7dGhpcy5fbm9kZUNhcGFjaXR5PWV9ZWxzZSBpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIG49YXJndW1lbnRzWzBdO1ppLmlzVHJ1ZShuPjEsIk5vZGUgY2FwYWNpdHkgbXVzdCBiZSBncmVhdGVyIHRoYW4gMSIpLHRoaXMuX25vZGVDYXBhY2l0eT1ufX0sbGE9e0ludGVyc2VjdHNPcDp7Y29uZmlndXJhYmxlOiEwfSxzZXJpYWxWZXJzaW9uVUlEOntjb25maWd1cmFibGU6ITB9LERFRkFVTFRfTk9ERV9DQVBBQ0lUWTp7Y29uZmlndXJhYmxlOiEwfX07Y2EucHJvdG90eXBlLmdldE5vZGVDYXBhY2l0eT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9ub2RlQ2FwYWNpdHl9LGNhLnByb3RvdHlwZS5sYXN0Tm9kZT1mdW5jdGlvbih0KXtyZXR1cm4gdC5nZXQodC5zaXplKCktMSl9LGNhLnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKCl7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHRoaXMuaXNFbXB0eSgpPzA6KHRoaXMuYnVpbGQoKSx0aGlzLnNpemUodGhpcy5fcm9vdCkpO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtmb3IodmFyIHQ9MCxlPWFyZ3VtZW50c1swXS5nZXRDaGlsZEJvdW5kYWJsZXMoKS5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7dmFyIG49ZS5uZXh0KCk7biBpbnN0YW5jZW9mIG9hP3QrPXRoaXMuc2l6ZShuKTpuIGluc3RhbmNlb2YgZWEmJih0Kz0xKX1yZXR1cm4gdH19LGNhLnByb3RvdHlwZS5yZW1vdmVJdGVtPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPW51bGwscj10LmdldENoaWxkQm91bmRhYmxlcygpLml0ZXJhdG9yKCk7ci5oYXNOZXh0KCk7KXt2YXIgaT1yLm5leHQoKTtpIGluc3RhbmNlb2YgZWEmJmkuZ2V0SXRlbSgpPT09ZSYmKG49aSl9cmV0dXJuIG51bGwhPT1uJiYodC5nZXRDaGlsZEJvdW5kYWJsZXMoKS5yZW1vdmUobiksITApfSxjYS5wcm90b3R5cGUuaXRlbXNUcmVlPWZ1bmN0aW9uKCl7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpe3RoaXMuYnVpbGQoKTt2YXIgdD10aGlzLml0ZW1zVHJlZSh0aGlzLl9yb290KTtyZXR1cm4gbnVsbD09PXQ/bmV3IHhvOnR9aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcih2YXIgZT1hcmd1bWVudHNbMF0sbj1uZXcgeG8scj1lLmdldENoaWxkQm91bmRhYmxlcygpLml0ZXJhdG9yKCk7ci5oYXNOZXh0KCk7KXt2YXIgaT1yLm5leHQoKTtpZihpIGluc3RhbmNlb2Ygb2Epe3ZhciBvPXRoaXMuaXRlbXNUcmVlKGkpO251bGwhPT1vJiZuLmFkZChvKX1lbHNlIGkgaW5zdGFuY2VvZiBlYT9uLmFkZChpLmdldEl0ZW0oKSk6Wmkuc2hvdWxkTmV2ZXJSZWFjaEhlcmUoKX1yZXR1cm4gbi5zaXplKCk8PTA/bnVsbDpufX0sY2EucHJvdG90eXBlLmluc2VydD1mdW5jdGlvbih0LGUpe1ppLmlzVHJ1ZSghdGhpcy5fYnVpbHQsIkNhbm5vdCBpbnNlcnQgaXRlbXMgaW50byBhbiBTVFIgcGFja2VkIFItdHJlZSBhZnRlciBpdCBoYXMgYmVlbiBidWlsdC4iKSx0aGlzLl9pdGVtQm91bmRhYmxlcy5hZGQobmV3IGVhKHQsZSkpfSxjYS5wcm90b3R5cGUuYm91bmRhYmxlc0F0TGV2ZWw9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9bmV3IHhvO3JldHVybiB0aGlzLmJvdW5kYWJsZXNBdExldmVsKHQsdGhpcy5fcm9vdCxlKSxlfWlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbj1hcmd1bWVudHNbMF0scj1hcmd1bWVudHNbMV0saT1hcmd1bWVudHNbMl07aWYoWmkuaXNUcnVlKG4+LTIpLHIuZ2V0TGV2ZWwoKT09PW4pcmV0dXJuIGkuYWRkKHIpLG51bGw7Zm9yKHZhciBvPXIuZ2V0Q2hpbGRCb3VuZGFibGVzKCkuaXRlcmF0b3IoKTtvLmhhc05leHQoKTspe3ZhciBzPW8ubmV4dCgpO3MgaW5zdGFuY2VvZiBvYT90aGlzLmJvdW5kYWJsZXNBdExldmVsKG4scyxpKTooWmkuaXNUcnVlKHMgaW5zdGFuY2VvZiBlYSksLTE9PT1uJiZpLmFkZChzKSl9cmV0dXJuIG51bGx9fSxjYS5wcm90b3R5cGUucXVlcnk9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF07dGhpcy5idWlsZCgpO3ZhciBuPW5ldyB4bztyZXR1cm4gdGhpcy5pc0VtcHR5KCl8fHRoaXMuZ2V0SW50ZXJzZWN0c09wKCkuaW50ZXJzZWN0cyh0aGlzLl9yb290LmdldEJvdW5kcygpLGUpJiZ0aGlzLnF1ZXJ5KGUsdGhpcy5fcm9vdCxuKSxufWlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgcj1hcmd1bWVudHNbMF0saT1hcmd1bWVudHNbMV07aWYodGhpcy5idWlsZCgpLHRoaXMuaXNFbXB0eSgpKXJldHVybiBudWxsO3RoaXMuZ2V0SW50ZXJzZWN0c09wKCkuaW50ZXJzZWN0cyh0aGlzLl9yb290LmdldEJvdW5kcygpLHIpJiZ0aGlzLnF1ZXJ5KHIsdGhpcy5fcm9vdCxpKX1lbHNlIGlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKWlmKEVpKGFyZ3VtZW50c1syXSxyYSkmJmFyZ3VtZW50c1swXWluc3RhbmNlb2YgT2JqZWN0JiZhcmd1bWVudHNbMV1pbnN0YW5jZW9mIG9hKWZvcih2YXIgbz1hcmd1bWVudHNbMF0scz1hcmd1bWVudHNbMl0sYT1hcmd1bWVudHNbMV0uZ2V0Q2hpbGRCb3VuZGFibGVzKCksdT0wO3U8YS5zaXplKCk7dSsrKXt2YXIgYz1hLmdldCh1KTshdC5nZXRJbnRlcnNlY3RzT3AoKS5pbnRlcnNlY3RzKGMuZ2V0Qm91bmRzKCksbyl8fChjIGluc3RhbmNlb2Ygb2E/dC5xdWVyeShvLGMscyk6YyBpbnN0YW5jZW9mIGVhP3MudmlzaXRJdGVtKGMuZ2V0SXRlbSgpKTpaaS5zaG91bGROZXZlclJlYWNoSGVyZSgpKX1lbHNlIGlmKEVpKGFyZ3VtZW50c1syXSx2bykmJmFyZ3VtZW50c1swXWluc3RhbmNlb2YgT2JqZWN0JiZhcmd1bWVudHNbMV1pbnN0YW5jZW9mIG9hKWZvcih2YXIgbD1hcmd1bWVudHNbMF0saD1hcmd1bWVudHNbMl0sZj1hcmd1bWVudHNbMV0uZ2V0Q2hpbGRCb3VuZGFibGVzKCkscD0wO3A8Zi5zaXplKCk7cCsrKXt2YXIgZD1mLmdldChwKTshdC5nZXRJbnRlcnNlY3RzT3AoKS5pbnRlcnNlY3RzKGQuZ2V0Qm91bmRzKCksbCl8fChkIGluc3RhbmNlb2Ygb2E/dC5xdWVyeShsLGQsaCk6ZCBpbnN0YW5jZW9mIGVhP2guYWRkKGQuZ2V0SXRlbSgpKTpaaS5zaG91bGROZXZlclJlYWNoSGVyZSgpKX19LGNhLnByb3RvdHlwZS5idWlsZD1mdW5jdGlvbigpe2lmKHRoaXMuX2J1aWx0KXJldHVybiBudWxsO3RoaXMuX3Jvb3Q9dGhpcy5faXRlbUJvdW5kYWJsZXMuaXNFbXB0eSgpP3RoaXMuY3JlYXRlTm9kZSgwKTp0aGlzLmNyZWF0ZUhpZ2hlckxldmVscyh0aGlzLl9pdGVtQm91bmRhYmxlcywtMSksdGhpcy5faXRlbUJvdW5kYWJsZXM9bnVsbCx0aGlzLl9idWlsdD0hMH0sY2EucHJvdG90eXBlLmdldFJvb3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5idWlsZCgpLHRoaXMuX3Jvb3R9LGNhLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oKXtpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdO3JldHVybiB0aGlzLmJ1aWxkKCksISF0aGlzLmdldEludGVyc2VjdHNPcCgpLmludGVyc2VjdHModGhpcy5fcm9vdC5nZXRCb3VuZHMoKSx0KSYmdGhpcy5yZW1vdmUodCx0aGlzLl9yb290LGUpfWlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbj1hcmd1bWVudHNbMF0scj1hcmd1bWVudHNbMV0saT1hcmd1bWVudHNbMl0sbz10aGlzLnJlbW92ZUl0ZW0ocixpKTtpZihvKXJldHVybiEwO2Zvcih2YXIgcz1udWxsLGE9ci5nZXRDaGlsZEJvdW5kYWJsZXMoKS5pdGVyYXRvcigpO2EuaGFzTmV4dCgpOyl7dmFyIHU9YS5uZXh0KCk7aWYodGhpcy5nZXRJbnRlcnNlY3RzT3AoKS5pbnRlcnNlY3RzKHUuZ2V0Qm91bmRzKCksbikmJnUgaW5zdGFuY2VvZiBvYSYmKG89dGhpcy5yZW1vdmUobix1LGkpKSl7cz11O2JyZWFrfX1yZXR1cm4gbnVsbCE9PXMmJnMuZ2V0Q2hpbGRCb3VuZGFibGVzKCkuaXNFbXB0eSgpJiZyLmdldENoaWxkQm91bmRhYmxlcygpLnJlbW92ZShzKSxvfX0sY2EucHJvdG90eXBlLmNyZWF0ZUhpZ2hlckxldmVscz1mdW5jdGlvbih0LGUpe1ppLmlzVHJ1ZSghdC5pc0VtcHR5KCkpO3ZhciBuPXRoaXMuY3JlYXRlUGFyZW50Qm91bmRhYmxlcyh0LGUrMSk7cmV0dXJuIDE9PT1uLnNpemUoKT9uLmdldCgwKTp0aGlzLmNyZWF0ZUhpZ2hlckxldmVscyhuLGUrMSl9LGNhLnByb3RvdHlwZS5kZXB0aD1mdW5jdGlvbigpe2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiB0aGlzLmlzRW1wdHkoKT8wOih0aGlzLmJ1aWxkKCksdGhpcy5kZXB0aCh0aGlzLl9yb290KSk7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcih2YXIgdD0wLGU9YXJndW1lbnRzWzBdLmdldENoaWxkQm91bmRhYmxlcygpLml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXt2YXIgbj1lLm5leHQoKTtpZihuIGluc3RhbmNlb2Ygb2Epe3ZhciByPXRoaXMuZGVwdGgobik7cj50JiYodD1yKX19cmV0dXJuIHQrMX19LGNhLnByb3RvdHlwZS5jcmVhdGVQYXJlbnRCb3VuZGFibGVzPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcztaaS5pc1RydWUoIXQuaXNFbXB0eSgpKTt2YXIgcj1uZXcgeG87ci5hZGQodGhpcy5jcmVhdGVOb2RlKGUpKTt2YXIgaT1uZXcgeG8odCk7YWEuc29ydChpLHRoaXMuZ2V0Q29tcGFyYXRvcigpKTtmb3IodmFyIG89aS5pdGVyYXRvcigpO28uaGFzTmV4dCgpOyl7dmFyIHM9by5uZXh0KCk7bi5sYXN0Tm9kZShyKS5nZXRDaGlsZEJvdW5kYWJsZXMoKS5zaXplKCk9PT1uLmdldE5vZGVDYXBhY2l0eSgpJiZyLmFkZChuLmNyZWF0ZU5vZGUoZSkpLG4ubGFzdE5vZGUocikuYWRkQ2hpbGRCb3VuZGFibGUocyl9cmV0dXJuIHJ9LGNhLnByb3RvdHlwZS5pc0VtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2J1aWx0P3RoaXMuX3Jvb3QuaXNFbXB0eSgpOnRoaXMuX2l0ZW1Cb3VuZGFibGVzLmlzRW1wdHkoKX0sY2EucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW21pXX0sY2EucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGNhfSxjYS5jb21wYXJlRG91Ymxlcz1mdW5jdGlvbih0LGUpe3JldHVybiB0PmU/MTp0PGU/LTE6MH0sbGEuSW50ZXJzZWN0c09wLmdldD1mdW5jdGlvbigpe3JldHVybiBoYX0sbGEuc2VyaWFsVmVyc2lvblVJRC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4tMHgzNWVmNjRjODJkNGM1NDAwfSxsYS5ERUZBVUxUX05PREVfQ0FQQUNJVFkuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDEwfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhjYSxsYSk7dmFyIGhhPWZ1bmN0aW9uKCl7fSxmYT1mdW5jdGlvbigpe307ZmEucHJvdG90eXBlLmRpc3RhbmNlPWZ1bmN0aW9uKHQsZSl7fSxmYS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZmEucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGZhfTt2YXIgcGE9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShuKXtuPW58fGUuREVGQVVMVF9OT0RFX0NBUEFDSVRZLHQuY2FsbCh0aGlzLG4pfXQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lO3ZhciBuPXtTVFJ0cmVlTm9kZTp7Y29uZmlndXJhYmxlOiEwfSxzZXJpYWxWZXJzaW9uVUlEOntjb25maWd1cmFibGU6ITB9LHhDb21wYXJhdG9yOntjb25maWd1cmFibGU6ITB9LHlDb21wYXJhdG9yOntjb25maWd1cmFibGU6ITB9LGludGVyc2VjdHNPcDp7Y29uZmlndXJhYmxlOiEwfSxERUZBVUxUX05PREVfQ0FQQUNJVFk6e2NvbmZpZ3VyYWJsZTohMH19O3JldHVybiBlLnByb3RvdHlwZS5jcmVhdGVQYXJlbnRCb3VuZGFibGVzRnJvbVZlcnRpY2FsU2xpY2VzPWZ1bmN0aW9uKHQsZSl7WmkuaXNUcnVlKHQubGVuZ3RoPjApO2Zvcih2YXIgbj1uZXcgeG8scj0wO3I8dC5sZW5ndGg7cisrKW4uYWRkQWxsKHRoaXMuY3JlYXRlUGFyZW50Qm91bmRhYmxlc0Zyb21WZXJ0aWNhbFNsaWNlKHRbcl0sZSkpO3JldHVybiBufSxlLnByb3RvdHlwZS5jcmVhdGVOb2RlPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZGEodCl9LGUucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gMD09PWFyZ3VtZW50cy5sZW5ndGg/dC5wcm90b3R5cGUuc2l6ZS5jYWxsKHRoaXMpOnQucHJvdG90eXBlLnNpemUuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxlLnByb3RvdHlwZS5pbnNlcnQ9ZnVuY3Rpb24oKXtpZigyIT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdC5wcm90b3R5cGUuaW5zZXJ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07aWYoZS5pc051bGwoKSlyZXR1cm4gbnVsbDt0LnByb3RvdHlwZS5pbnNlcnQuY2FsbCh0aGlzLGUsbil9LGUucHJvdG90eXBlLmdldEludGVyc2VjdHNPcD1mdW5jdGlvbigpe3JldHVybiBlLmludGVyc2VjdHNPcH0sZS5wcm90b3R5cGUudmVydGljYWxTbGljZXM9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49TWF0aC50cnVuYyhNYXRoLmNlaWwodC5zaXplKCkvZSkpLHI9bmV3IEFycmF5KGUpLmZpbGwobnVsbCksaT10Lml0ZXJhdG9yKCksbz0wO288ZTtvKyspe3Jbb109bmV3IHhvO2Zvcih2YXIgcz0wO2kuaGFzTmV4dCgpJiZzPG47KXt2YXIgYT1pLm5leHQoKTtyW29dLmFkZChhKSxzKyt9fXJldHVybiByfSxlLnByb3RvdHlwZS5xdWVyeT1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF07cmV0dXJuIHQucHJvdG90eXBlLnF1ZXJ5LmNhbGwodGhpcyxlKX1pZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIG49YXJndW1lbnRzWzBdLHI9YXJndW1lbnRzWzFdO3QucHJvdG90eXBlLnF1ZXJ5LmNhbGwodGhpcyxuLHIpfWVsc2UgaWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpaWYoRWkoYXJndW1lbnRzWzJdLHJhKSYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBPYmplY3QmJmFyZ3VtZW50c1sxXWluc3RhbmNlb2Ygb2Epe3ZhciBpPWFyZ3VtZW50c1swXSxvPWFyZ3VtZW50c1sxXSxzPWFyZ3VtZW50c1syXTt0LnByb3RvdHlwZS5xdWVyeS5jYWxsKHRoaXMsaSxvLHMpfWVsc2UgaWYoRWkoYXJndW1lbnRzWzJdLHZvKSYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBPYmplY3QmJmFyZ3VtZW50c1sxXWluc3RhbmNlb2Ygb2Epe3ZhciBhPWFyZ3VtZW50c1swXSx1PWFyZ3VtZW50c1sxXSxjPWFyZ3VtZW50c1syXTt0LnByb3RvdHlwZS5xdWVyeS5jYWxsKHRoaXMsYSx1LGMpfX0sZS5wcm90b3R5cGUuZ2V0Q29tcGFyYXRvcj1mdW5jdGlvbigpe3JldHVybiBlLnlDb21wYXJhdG9yfSxlLnByb3RvdHlwZS5jcmVhdGVQYXJlbnRCb3VuZGFibGVzRnJvbVZlcnRpY2FsU2xpY2U9ZnVuY3Rpb24oZSxuKXtyZXR1cm4gdC5wcm90b3R5cGUuY3JlYXRlUGFyZW50Qm91bmRhYmxlcy5jYWxsKHRoaXMsZSxuKX0sZS5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKCl7aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTtyZXR1cm4gdC5wcm90b3R5cGUucmVtb3ZlLmNhbGwodGhpcyxlLG4pfXJldHVybiB0LnByb3RvdHlwZS5yZW1vdmUuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxlLnByb3RvdHlwZS5kZXB0aD1mdW5jdGlvbigpe3JldHVybiAwPT09YXJndW1lbnRzLmxlbmd0aD90LnByb3RvdHlwZS5kZXB0aC5jYWxsKHRoaXMpOnQucHJvdG90eXBlLmRlcHRoLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZS5wcm90b3R5cGUuY3JlYXRlUGFyZW50Qm91bmRhYmxlcz1mdW5jdGlvbih0LG4pe1ppLmlzVHJ1ZSghdC5pc0VtcHR5KCkpO3ZhciByPU1hdGgudHJ1bmMoTWF0aC5jZWlsKHQuc2l6ZSgpL3RoaXMuZ2V0Tm9kZUNhcGFjaXR5KCkpKSxpPW5ldyB4byh0KTthYS5zb3J0KGksZS54Q29tcGFyYXRvcik7dmFyIG89dGhpcy52ZXJ0aWNhbFNsaWNlcyhpLE1hdGgudHJ1bmMoTWF0aC5jZWlsKE1hdGguc3FydChyKSkpKTtyZXR1cm4gdGhpcy5jcmVhdGVQYXJlbnRCb3VuZGFibGVzRnJvbVZlcnRpY2FsU2xpY2VzKG8sbil9LGUucHJvdG90eXBlLm5lYXJlc3ROZWlnaGJvdXI9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7aWYoRWkoYXJndW1lbnRzWzBdLGZhKSl7dmFyIHQ9YXJndW1lbnRzWzBdLG49bmV3IHVhKHRoaXMuZ2V0Um9vdCgpLHRoaXMuZ2V0Um9vdCgpLHQpO3JldHVybiB0aGlzLm5lYXJlc3ROZWlnaGJvdXIobil9aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB1YSl7dmFyIHI9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLm5lYXJlc3ROZWlnaGJvdXIocixmaS5QT1NJVElWRV9JTkZJTklUWSl9fWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgZSYmRWkoYXJndW1lbnRzWzFdLGZhKSl7dmFyIGk9YXJndW1lbnRzWzBdLG89YXJndW1lbnRzWzFdLHM9bmV3IHVhKHRoaXMuZ2V0Um9vdCgpLGkuZ2V0Um9vdCgpLG8pO3JldHVybiB0aGlzLm5lYXJlc3ROZWlnaGJvdXIocyl9aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB1YSYmIm51bWJlciI9PXR5cGVvZiBhcmd1bWVudHNbMV0pe3ZhciBhPWFyZ3VtZW50c1swXSx1PWFyZ3VtZW50c1sxXSxjPW51bGwsbD1uZXcgbmE7Zm9yKGwuYWRkKGEpOyFsLmlzRW1wdHkoKSYmdT4wOyl7dmFyIGg9bC5wb2xsKCksZj1oLmdldERpc3RhbmNlKCk7aWYoZj49dSlicmVhaztoLmlzTGVhdmVzKCk/KHU9ZixjPWgpOmguZXhwYW5kVG9RdWV1ZShsLHUpfXJldHVybltjLmdldEJvdW5kYWJsZSgwKS5nZXRJdGVtKCksYy5nZXRCb3VuZGFibGUoMSkuZ2V0SXRlbSgpXX19ZWxzZSBpZigzPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHA9YXJndW1lbnRzWzJdLGQ9bmV3IGVhKGFyZ3VtZW50c1swXSxhcmd1bWVudHNbMV0pLGc9bmV3IHVhKHRoaXMuZ2V0Um9vdCgpLGQscCk7cmV0dXJuIHRoaXMubmVhcmVzdE5laWdoYm91cihnKVswXX19LGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW2lhLG1pXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sZS5jZW50cmVYPWZ1bmN0aW9uKHQpe3JldHVybiBlLmF2Zyh0LmdldE1pblgoKSx0LmdldE1heFgoKSl9LGUuYXZnPWZ1bmN0aW9uKHQsZSl7cmV0dXJuKHQrZSkvMn0sZS5jZW50cmVZPWZ1bmN0aW9uKHQpe3JldHVybiBlLmF2Zyh0LmdldE1pblkoKSx0LmdldE1heFkoKSl9LG4uU1RSdHJlZU5vZGUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIGRhfSxuLnNlcmlhbFZlcnNpb25VSUQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDB4Mzk5MjBmN2Q1ZjI2MWUwfSxuLnhDb21wYXJhdG9yLmdldD1mdW5jdGlvbigpe3JldHVybntpbnRlcmZhY2VzXzpmdW5jdGlvbigpe3JldHVyblt5aV19LGNvbXBhcmU6ZnVuY3Rpb24obixyKXtyZXR1cm4gdC5jb21wYXJlRG91YmxlcyhlLmNlbnRyZVgobi5nZXRCb3VuZHMoKSksZS5jZW50cmVYKHIuZ2V0Qm91bmRzKCkpKX19fSxuLnlDb21wYXJhdG9yLmdldD1mdW5jdGlvbigpe3JldHVybntpbnRlcmZhY2VzXzpmdW5jdGlvbigpe3JldHVyblt5aV19LGNvbXBhcmU6ZnVuY3Rpb24obixyKXtyZXR1cm4gdC5jb21wYXJlRG91YmxlcyhlLmNlbnRyZVkobi5nZXRCb3VuZHMoKSksZS5jZW50cmVZKHIuZ2V0Qm91bmRzKCkpKX19fSxuLmludGVyc2VjdHNPcC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm57aW50ZXJmYWNlc186ZnVuY3Rpb24oKXtyZXR1cm5bdC5JbnRlcnNlY3RzT3BdfSxpbnRlcnNlY3RzOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuaW50ZXJzZWN0cyhlKX19fSxuLkRFRkFVTFRfTk9ERV9DQVBBQ0lUWS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMTB9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsbiksZX0oY2EpLGRhPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgZT1hcmd1bWVudHNbMF07dC5jYWxsKHRoaXMsZSl9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmNvbXB1dGVCb3VuZHM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9bnVsbCxlPXRoaXMuZ2V0Q2hpbGRCb3VuZGFibGVzKCkuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspe3ZhciBuPWUubmV4dCgpO251bGw9PT10P3Q9bmV3IGppKG4uZ2V0Qm91bmRzKCkpOnQuZXhwYW5kVG9JbmNsdWRlKG4uZ2V0Qm91bmRzKCkpfXJldHVybiB0fSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxlfShvYSksZ2E9ZnVuY3Rpb24oKXt9O2dhLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxnYS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZ2F9LGdhLnJlbGF0aXZlU2lnbj1mdW5jdGlvbih0LGUpe3JldHVybiB0PGU/LTE6dD5lPzE6MH0sZ2EuY29tcGFyZT1mdW5jdGlvbih0LGUsbil7aWYoZS5lcXVhbHMyRChuKSlyZXR1cm4gMDt2YXIgcj1nYS5yZWxhdGl2ZVNpZ24oZS54LG4ueCksaT1nYS5yZWxhdGl2ZVNpZ24oZS55LG4ueSk7c3dpdGNoKHQpe2Nhc2UgMDpyZXR1cm4gZ2EuY29tcGFyZVZhbHVlKHIsaSk7Y2FzZSAxOnJldHVybiBnYS5jb21wYXJlVmFsdWUoaSxyKTtjYXNlIDI6cmV0dXJuIGdhLmNvbXBhcmVWYWx1ZShpLC1yKTtjYXNlIDM6cmV0dXJuIGdhLmNvbXBhcmVWYWx1ZSgtcixpKTtjYXNlIDQ6cmV0dXJuIGdhLmNvbXBhcmVWYWx1ZSgtciwtaSk7Y2FzZSA1OnJldHVybiBnYS5jb21wYXJlVmFsdWUoLWksLXIpO2Nhc2UgNjpyZXR1cm4gZ2EuY29tcGFyZVZhbHVlKC1pLHIpO2Nhc2UgNzpyZXR1cm4gZ2EuY29tcGFyZVZhbHVlKHIsLWkpfXJldHVybiBaaS5zaG91bGROZXZlclJlYWNoSGVyZSgiaW52YWxpZCBvY3RhbnQgdmFsdWUiKSwwfSxnYS5jb21wYXJlVmFsdWU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdDwwPy0xOnQ+MD8xOmU8MD8tMTplPjA/MTowfTt2YXIgeWE9ZnVuY3Rpb24oKXt0aGlzLl9zZWdTdHJpbmc9bnVsbCx0aGlzLmNvb3JkPW51bGwsdGhpcy5zZWdtZW50SW5kZXg9bnVsbCx0aGlzLl9zZWdtZW50T2N0YW50PW51bGwsdGhpcy5faXNJbnRlcmlvcj1udWxsO3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXSxuPWFyZ3VtZW50c1syXSxyPWFyZ3VtZW50c1szXTt0aGlzLl9zZWdTdHJpbmc9dCx0aGlzLmNvb3JkPW5ldyB2aShlKSx0aGlzLnNlZ21lbnRJbmRleD1uLHRoaXMuX3NlZ21lbnRPY3RhbnQ9cix0aGlzLl9pc0ludGVyaW9yPSFlLmVxdWFsczJEKHQuZ2V0Q29vcmRpbmF0ZShuKSl9O3lhLnByb3RvdHlwZS5nZXRDb29yZGluYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29vcmR9LHlhLnByb3RvdHlwZS5wcmludD1mdW5jdGlvbih0KXt0LnByaW50KHRoaXMuY29vcmQpLHQucHJpbnQoIiBzZWcgIyA9ICIrdGhpcy5zZWdtZW50SW5kZXgpfSx5YS5wcm90b3R5cGUuY29tcGFyZVRvPWZ1bmN0aW9uKHQpe3ZhciBlPXQ7cmV0dXJuIHRoaXMuc2VnbWVudEluZGV4PGUuc2VnbWVudEluZGV4Py0xOnRoaXMuc2VnbWVudEluZGV4PmUuc2VnbWVudEluZGV4PzE6dGhpcy5jb29yZC5lcXVhbHMyRChlLmNvb3JkKT8wOmdhLmNvbXBhcmUodGhpcy5fc2VnbWVudE9jdGFudCx0aGlzLmNvb3JkLGUuY29vcmQpfSx5YS5wcm90b3R5cGUuaXNFbmRQb2ludD1mdW5jdGlvbih0KXtyZXR1cm4gMD09PXRoaXMuc2VnbWVudEluZGV4JiYhdGhpcy5faXNJbnRlcmlvcnx8dGhpcy5zZWdtZW50SW5kZXg9PT10fSx5YS5wcm90b3R5cGUuaXNJbnRlcmlvcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pc0ludGVyaW9yfSx5YS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bZGldfSx5YS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4geWF9O3ZhciBtYT1mdW5jdGlvbigpe3RoaXMuX25vZGVNYXA9bmV3IGtvLHRoaXMuX2VkZ2U9bnVsbDt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5fZWRnZT10fTttYS5wcm90b3R5cGUuZ2V0U3BsaXRDb29yZGluYXRlcz1mdW5jdGlvbigpe3ZhciB0PW5ldyBibzt0aGlzLmFkZEVuZHBvaW50cygpO2Zvcih2YXIgZT10aGlzLml0ZXJhdG9yKCksbj1lLm5leHQoKTtlLmhhc05leHQoKTspe3ZhciByPWUubmV4dCgpO3RoaXMuYWRkRWRnZUNvb3JkaW5hdGVzKG4scix0KSxuPXJ9cmV0dXJuIHQudG9Db29yZGluYXRlQXJyYXkoKX0sbWEucHJvdG90eXBlLmFkZENvbGxhcHNlZE5vZGVzPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IHhvO3RoaXMuZmluZENvbGxhcHNlc0Zyb21JbnNlcnRlZE5vZGVzKHQpLHRoaXMuZmluZENvbGxhcHNlc0Zyb21FeGlzdGluZ1ZlcnRpY2VzKHQpO2Zvcih2YXIgZT10Lml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXt2YXIgbj1lLm5leHQoKS5pbnRWYWx1ZSgpO3RoaXMuYWRkKHRoaXMuX2VkZ2UuZ2V0Q29vcmRpbmF0ZShuKSxuKX19LG1hLnByb3RvdHlwZS5wcmludD1mdW5jdGlvbih0KXt0LnByaW50bG4oIkludGVyc2VjdGlvbnM6Iik7Zm9yKHZhciBlPXRoaXMuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspe2UubmV4dCgpLnByaW50KHQpfX0sbWEucHJvdG90eXBlLmZpbmRDb2xsYXBzZXNGcm9tRXhpc3RpbmdWZXJ0aWNlcz1mdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPHRoaXMuX2VkZ2Uuc2l6ZSgpLTI7ZSsrKXt2YXIgbj10aGlzLl9lZGdlLmdldENvb3JkaW5hdGUoZSkscj10aGlzLl9lZGdlLmdldENvb3JkaW5hdGUoZSsyKTtuLmVxdWFsczJEKHIpJiZ0LmFkZChuZXcgTmkoZSsxKSl9fSxtYS5wcm90b3R5cGUuYWRkRWRnZUNvb3JkaW5hdGVzPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10aGlzLl9lZGdlLmdldENvb3JkaW5hdGUoZS5zZWdtZW50SW5kZXgpLGk9ZS5pc0ludGVyaW9yKCl8fCFlLmNvb3JkLmVxdWFsczJEKHIpO24uYWRkKG5ldyB2aSh0LmNvb3JkKSwhMSk7Zm9yKHZhciBvPXQuc2VnbWVudEluZGV4KzE7bzw9ZS5zZWdtZW50SW5kZXg7bysrKW4uYWRkKHRoaXMuX2VkZ2UuZ2V0Q29vcmRpbmF0ZShvKSk7aSYmbi5hZGQobmV3IHZpKGUuY29vcmQpKX0sbWEucHJvdG90eXBlLml0ZXJhdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX25vZGVNYXAudmFsdWVzKCkuaXRlcmF0b3IoKX0sbWEucHJvdG90eXBlLmFkZFNwbGl0RWRnZXM9ZnVuY3Rpb24odCl7dGhpcy5hZGRFbmRwb2ludHMoKSx0aGlzLmFkZENvbGxhcHNlZE5vZGVzKCk7Zm9yKHZhciBlPXRoaXMuaXRlcmF0b3IoKSxuPWUubmV4dCgpO2UuaGFzTmV4dCgpOyl7dmFyIHI9ZS5uZXh0KCksaT10aGlzLmNyZWF0ZVNwbGl0RWRnZShuLHIpO3QuYWRkKGkpLG49cn19LG1hLnByb3RvdHlwZS5maW5kQ29sbGFwc2VJbmRleD1mdW5jdGlvbih0LGUsbil7aWYoIXQuY29vcmQuZXF1YWxzMkQoZS5jb29yZCkpcmV0dXJuITE7dmFyIHI9ZS5zZWdtZW50SW5kZXgtdC5zZWdtZW50SW5kZXg7cmV0dXJuIGUuaXNJbnRlcmlvcigpfHxyLS0sMT09PXImJihuWzBdPXQuc2VnbWVudEluZGV4KzEsITApfSxtYS5wcm90b3R5cGUuZmluZENvbGxhcHNlc0Zyb21JbnNlcnRlZE5vZGVzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgQXJyYXkoMSkuZmlsbChudWxsKSxuPXRoaXMuaXRlcmF0b3IoKSxyPW4ubmV4dCgpO24uaGFzTmV4dCgpOyl7dmFyIGk9bi5uZXh0KCk7dGhpcy5maW5kQ29sbGFwc2VJbmRleChyLGksZSkmJnQuYWRkKG5ldyBOaShlWzBdKSkscj1pfX0sbWEucHJvdG90eXBlLmdldEVkZ2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZWRnZX0sbWEucHJvdG90eXBlLmFkZEVuZHBvaW50cz1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX2VkZ2Uuc2l6ZSgpLTE7dGhpcy5hZGQodGhpcy5fZWRnZS5nZXRDb29yZGluYXRlKDApLDApLHRoaXMuYWRkKHRoaXMuX2VkZ2UuZ2V0Q29vcmRpbmF0ZSh0KSx0KX0sbWEucHJvdG90eXBlLmNyZWF0ZVNwbGl0RWRnZT1mdW5jdGlvbih0LGUpe3ZhciBuPWUuc2VnbWVudEluZGV4LXQuc2VnbWVudEluZGV4KzIscj10aGlzLl9lZGdlLmdldENvb3JkaW5hdGUoZS5zZWdtZW50SW5kZXgpLGk9ZS5pc0ludGVyaW9yKCl8fCFlLmNvb3JkLmVxdWFsczJEKHIpO2l8fG4tLTt2YXIgbz1uZXcgQXJyYXkobikuZmlsbChudWxsKSxzPTA7b1tzKytdPW5ldyB2aSh0LmNvb3JkKTtmb3IodmFyIGE9dC5zZWdtZW50SW5kZXgrMTthPD1lLnNlZ21lbnRJbmRleDthKyspb1tzKytdPXRoaXMuX2VkZ2UuZ2V0Q29vcmRpbmF0ZShhKTtyZXR1cm4gaSYmKG9bc109bmV3IHZpKGUuY29vcmQpKSxuZXcgd2Eobyx0aGlzLl9lZGdlLmdldERhdGEoKSl9LG1hLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCxlKXt2YXIgbj1uZXcgeWEodGhpcy5fZWRnZSx0LGUsdGhpcy5fZWRnZS5nZXRTZWdtZW50T2N0YW50KGUpKSxyPXRoaXMuX25vZGVNYXAuZ2V0KG4pO3JldHVybiBudWxsIT09cj8oWmkuaXNUcnVlKHIuY29vcmQuZXF1YWxzMkQodCksIkZvdW5kIGVxdWFsIG5vZGVzIHdpdGggZGlmZmVyZW50IGNvb3JkaW5hdGVzIikscik6KHRoaXMuX25vZGVNYXAucHV0KG4sbiksbil9LG1hLnByb3RvdHlwZS5jaGVja1NwbGl0RWRnZXNDb3JyZWN0bmVzcz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9lZGdlLmdldENvb3JkaW5hdGVzKCksbj10LmdldCgwKS5nZXRDb29yZGluYXRlKDApO2lmKCFuLmVxdWFsczJEKGVbMF0pKXRocm93IG5ldyBXaSgiYmFkIHNwbGl0IGVkZ2Ugc3RhcnQgcG9pbnQgYXQgIituKTt2YXIgcj10LmdldCh0LnNpemUoKS0xKS5nZXRDb29yZGluYXRlcygpLGk9cltyLmxlbmd0aC0xXTtpZighaS5lcXVhbHMyRChlW2UubGVuZ3RoLTFdKSl0aHJvdyBuZXcgV2koImJhZCBzcGxpdCBlZGdlIGVuZCBwb2ludCBhdCAiK2kpfSxtYS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sbWEucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIG1hfTt2YXIgdmE9ZnVuY3Rpb24oKXt9O3ZhLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSx2YS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gdmF9LHZhLm9jdGFudD1mdW5jdGlvbigpe2lmKCJudW1iZXIiPT10eXBlb2YgYXJndW1lbnRzWzBdJiYibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1sxXSl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdO2lmKDA9PT10JiYwPT09ZSl0aHJvdyBuZXcgaGk7dmFyIG49TWF0aC5hYnModCkscj1NYXRoLmFicyhlKTtyZXR1cm4gdD49MD9lPj0wP24+PXI/MDoxOm4+PXI/Nzo2OmU+PTA/bj49cj8zOjI6bj49cj80OjV9aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB2aSYmYXJndW1lbnRzWzFdaW5zdGFuY2VvZiB2aSl7dmFyIGk9YXJndW1lbnRzWzBdLG89YXJndW1lbnRzWzFdLHM9by54LWkueCxhPW8ueS1pLnk7aWYoMD09PXMmJjA9PT1hKXRocm93IG5ldyBoaTtyZXR1cm4gdmEub2N0YW50KHMsYSl9fTt2YXIgX2E9ZnVuY3Rpb24oKXt9O19hLnByb3RvdHlwZS5nZXRDb29yZGluYXRlcz1mdW5jdGlvbigpe30sX2EucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24oKXt9LF9hLnByb3RvdHlwZS5nZXRDb29yZGluYXRlPWZ1bmN0aW9uKHQpe30sX2EucHJvdG90eXBlLmlzQ2xvc2VkPWZ1bmN0aW9uKCl7fSxfYS5wcm90b3R5cGUuc2V0RGF0YT1mdW5jdGlvbih0KXt9LF9hLnByb3RvdHlwZS5nZXREYXRhPWZ1bmN0aW9uKCl7fSxfYS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sX2EucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIF9hfTt2YXIgeGE9ZnVuY3Rpb24oKXt9O3hhLnByb3RvdHlwZS5hZGRJbnRlcnNlY3Rpb249ZnVuY3Rpb24odCxlKXt9LHhhLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltfYV19LHhhLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiB4YX07dmFyIHdhPWZ1bmN0aW9uKCl7dGhpcy5fbm9kZUxpc3Q9bmV3IG1hKHRoaXMpLHRoaXMuX3B0cz1udWxsLHRoaXMuX2RhdGE9bnVsbDt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV07dGhpcy5fcHRzPXQsdGhpcy5fZGF0YT1lfTt3YS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHRzfSx3YS5wcm90b3R5cGUuc2l6ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wdHMubGVuZ3RofSx3YS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcHRzW3RdfSx3YS5wcm90b3R5cGUuaXNDbG9zZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHRzWzBdLmVxdWFscyh0aGlzLl9wdHNbdGhpcy5fcHRzLmxlbmd0aC0xXSl9LHdhLnByb3RvdHlwZS5nZXRTZWdtZW50T2N0YW50PWZ1bmN0aW9uKHQpe3JldHVybiB0PT09dGhpcy5fcHRzLmxlbmd0aC0xPy0xOnRoaXMuc2FmZU9jdGFudCh0aGlzLmdldENvb3JkaW5hdGUodCksdGhpcy5nZXRDb29yZGluYXRlKHQrMSkpfSx3YS5wcm90b3R5cGUuc2V0RGF0YT1mdW5jdGlvbih0KXt0aGlzLl9kYXRhPXR9LHdhLnByb3RvdHlwZS5zYWZlT2N0YW50PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuZXF1YWxzMkQoZSk/MDp2YS5vY3RhbnQodCxlKX0sd2EucHJvdG90eXBlLmdldERhdGE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGF0YX0sd2EucHJvdG90eXBlLmFkZEludGVyc2VjdGlvbj1mdW5jdGlvbigpe2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV07dGhpcy5hZGRJbnRlcnNlY3Rpb25Ob2RlKHQsZSl9ZWxzZSBpZig0PT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIG49YXJndW1lbnRzWzFdLHI9YXJndW1lbnRzWzNdLGk9bmV3IHZpKGFyZ3VtZW50c1swXS5nZXRJbnRlcnNlY3Rpb24ocikpO3RoaXMuYWRkSW50ZXJzZWN0aW9uKGksbil9fSx3YS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gWGkudG9MaW5lU3RyaW5nKG5ldyB4cyh0aGlzLl9wdHMpKX0sd2EucHJvdG90eXBlLmdldE5vZGVMaXN0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX25vZGVMaXN0fSx3YS5wcm90b3R5cGUuYWRkSW50ZXJzZWN0aW9uTm9kZT1mdW5jdGlvbih0LGUpe3ZhciBuPWUscj1uKzE7aWYocjx0aGlzLl9wdHMubGVuZ3RoKXt2YXIgaT10aGlzLl9wdHNbcl07dC5lcXVhbHMyRChpKSYmKG49cil9cmV0dXJuIHRoaXMuX25vZGVMaXN0LmFkZCh0LG4pfSx3YS5wcm90b3R5cGUuYWRkSW50ZXJzZWN0aW9ucz1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPTA7cjx0LmdldEludGVyc2VjdGlvbk51bSgpO3IrKyl0aGlzLmFkZEludGVyc2VjdGlvbih0LGUsbixyKX0sd2EucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW3hhXX0sd2EucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHdhfSx3YS5nZXROb2RlZFN1YnN0cmluZ3M9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9bmV3IHhvO3JldHVybiB3YS5nZXROb2RlZFN1YnN0cmluZ3ModCxlKSxlfWlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKWZvcih2YXIgbj1hcmd1bWVudHNbMV0scj1hcmd1bWVudHNbMF0uaXRlcmF0b3IoKTtyLmhhc05leHQoKTspe3IubmV4dCgpLmdldE5vZGVMaXN0KCkuYWRkU3BsaXRFZGdlcyhuKX19O3ZhciBiYT1mdW5jdGlvbigpe2lmKHRoaXMucDA9bnVsbCx0aGlzLnAxPW51bGwsMD09PWFyZ3VtZW50cy5sZW5ndGgpdGhpcy5wMD1uZXcgdmksdGhpcy5wMT1uZXcgdmk7ZWxzZSBpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMucDA9bmV3IHZpKHQucDApLHRoaXMucDE9bmV3IHZpKHQucDEpfWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpdGhpcy5wMD1hcmd1bWVudHNbMF0sdGhpcy5wMT1hcmd1bWVudHNbMV07ZWxzZSBpZig0PT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdLHI9YXJndW1lbnRzWzJdLGk9YXJndW1lbnRzWzNdO3RoaXMucDA9bmV3IHZpKGUsbiksdGhpcy5wMT1uZXcgdmkocixpKX19LERhPXtzZXJpYWxWZXJzaW9uVUlEOntjb25maWd1cmFibGU6ITB9fTtiYS5wcm90b3R5cGUubWluWD1mdW5jdGlvbigpe3JldHVybiBNYXRoLm1pbih0aGlzLnAwLngsdGhpcy5wMS54KX0sYmEucHJvdG90eXBlLm9yaWVudGF0aW9uSW5kZXg9ZnVuY3Rpb24oKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIGJhKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1lby5vcmllbnRhdGlvbkluZGV4KHRoaXMucDAsdGhpcy5wMSx0LnAwKSxuPWVvLm9yaWVudGF0aW9uSW5kZXgodGhpcy5wMCx0aGlzLnAxLHQucDEpO3JldHVybiBlPj0wJiZuPj0wfHxlPD0wJiZuPD0wP01hdGgubWF4KGUsbik6MH1pZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHZpKXt2YXIgcj1hcmd1bWVudHNbMF07cmV0dXJuIGVvLm9yaWVudGF0aW9uSW5kZXgodGhpcy5wMCx0aGlzLnAxLHIpfX0sYmEucHJvdG90eXBlLnRvR2VvbWV0cnk9ZnVuY3Rpb24odCl7cmV0dXJuIHQuY3JlYXRlTGluZVN0cmluZyhbdGhpcy5wMCx0aGlzLnAxXSl9LGJhLnByb3RvdHlwZS5pc1ZlcnRpY2FsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucDAueD09PXRoaXMucDEueH0sYmEucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbih0KXtpZighKHQgaW5zdGFuY2VvZiBiYSkpcmV0dXJuITE7dmFyIGU9dDtyZXR1cm4gdGhpcy5wMC5lcXVhbHMoZS5wMCkmJnRoaXMucDEuZXF1YWxzKGUucDEpfSxiYS5wcm90b3R5cGUuaW50ZXJzZWN0aW9uPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBRaTtyZXR1cm4gZS5jb21wdXRlSW50ZXJzZWN0aW9uKHRoaXMucDAsdGhpcy5wMSx0LnAwLHQucDEpLGUuaGFzSW50ZXJzZWN0aW9uKCk/ZS5nZXRJbnRlcnNlY3Rpb24oMCk6bnVsbH0sYmEucHJvdG90eXBlLnByb2plY3Q9ZnVuY3Rpb24oKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHZpKXt2YXIgdD1hcmd1bWVudHNbMF07aWYodC5lcXVhbHModGhpcy5wMCl8fHQuZXF1YWxzKHRoaXMucDEpKXJldHVybiBuZXcgdmkodCk7dmFyIGU9dGhpcy5wcm9qZWN0aW9uRmFjdG9yKHQpLG49bmV3IHZpO3JldHVybiBuLng9dGhpcy5wMC54K2UqKHRoaXMucDEueC10aGlzLnAwLngpLG4ueT10aGlzLnAwLnkrZSoodGhpcy5wMS55LXRoaXMucDAueSksbn1pZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIGJhKXt2YXIgcj1hcmd1bWVudHNbMF0saT10aGlzLnByb2plY3Rpb25GYWN0b3Ioci5wMCksbz10aGlzLnByb2plY3Rpb25GYWN0b3Ioci5wMSk7aWYoaT49MSYmbz49MXx8aTw9MCYmbzw9MClyZXR1cm4gbnVsbDt2YXIgcz10aGlzLnByb2plY3Qoci5wMCk7aTwwJiYocz10aGlzLnAwKSxpPjEmJihzPXRoaXMucDEpO3ZhciBhPXRoaXMucHJvamVjdChyLnAxKTtyZXR1cm4gbzwwJiYoYT10aGlzLnAwKSxvPjEmJihhPXRoaXMucDEpLG5ldyBiYShzLGEpfX0sYmEucHJvdG90eXBlLm5vcm1hbGl6ZT1mdW5jdGlvbigpe3RoaXMucDEuY29tcGFyZVRvKHRoaXMucDApPDAmJnRoaXMucmV2ZXJzZSgpfSxiYS5wcm90b3R5cGUuYW5nbGU9ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5hdGFuMih0aGlzLnAxLnktdGhpcy5wMC55LHRoaXMucDEueC10aGlzLnAwLngpfSxiYS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gMD09PXQ/dGhpcy5wMDp0aGlzLnAxfSxiYS5wcm90b3R5cGUuZGlzdGFuY2VQZXJwZW5kaWN1bGFyPWZ1bmN0aW9uKHQpe3JldHVybiBlby5kaXN0YW5jZVBvaW50TGluZVBlcnBlbmRpY3VsYXIodCx0aGlzLnAwLHRoaXMucDEpfSxiYS5wcm90b3R5cGUubWluWT1mdW5jdGlvbigpe3JldHVybiBNYXRoLm1pbih0aGlzLnAwLnksdGhpcy5wMS55KX0sYmEucHJvdG90eXBlLm1pZFBvaW50PWZ1bmN0aW9uKCl7cmV0dXJuIGJhLm1pZFBvaW50KHRoaXMucDAsdGhpcy5wMSl9LGJhLnByb3RvdHlwZS5wcm9qZWN0aW9uRmFjdG9yPWZ1bmN0aW9uKHQpe2lmKHQuZXF1YWxzKHRoaXMucDApKXJldHVybiAwO2lmKHQuZXF1YWxzKHRoaXMucDEpKXJldHVybiAxO3ZhciBlPXRoaXMucDEueC10aGlzLnAwLngsbj10aGlzLnAxLnktdGhpcy5wMC55LHI9ZSplK24qbjtyZXR1cm4gcjw9MD9maS5OYU46KCh0LngtdGhpcy5wMC54KSplKyh0LnktdGhpcy5wMC55KSpuKS9yfSxiYS5wcm90b3R5cGUuY2xvc2VzdFBvaW50cz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmludGVyc2VjdGlvbih0KTtpZihudWxsIT09ZSlyZXR1cm5bZSxlXTt2YXIgbj1uZXcgQXJyYXkoMikuZmlsbChudWxsKSxyPWZpLk1BWF9WQUxVRSxpPW51bGwsbz10aGlzLmNsb3Nlc3RQb2ludCh0LnAwKTtyPW8uZGlzdGFuY2UodC5wMCksblswXT1vLG5bMV09dC5wMDt2YXIgcz10aGlzLmNsb3Nlc3RQb2ludCh0LnAxKTsoaT1zLmRpc3RhbmNlKHQucDEpKTxyJiYocj1pLG5bMF09cyxuWzFdPXQucDEpO3ZhciBhPXQuY2xvc2VzdFBvaW50KHRoaXMucDApOyhpPWEuZGlzdGFuY2UodGhpcy5wMCkpPHImJihyPWksblswXT10aGlzLnAwLG5bMV09YSk7dmFyIHU9dC5jbG9zZXN0UG9pbnQodGhpcy5wMSk7cmV0dXJuKGk9dS5kaXN0YW5jZSh0aGlzLnAxKSk8ciYmKHI9aSxuWzBdPXRoaXMucDEsblsxXT11KSxufSxiYS5wcm90b3R5cGUuY2xvc2VzdFBvaW50PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMucHJvamVjdGlvbkZhY3Rvcih0KTtyZXR1cm4gZT4wJiZlPDE/dGhpcy5wcm9qZWN0KHQpOnRoaXMucDAuZGlzdGFuY2UodCk8dGhpcy5wMS5kaXN0YW5jZSh0KT90aGlzLnAwOnRoaXMucDF9LGJhLnByb3RvdHlwZS5tYXhYPWZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgubWF4KHRoaXMucDAueCx0aGlzLnAxLngpfSxiYS5wcm90b3R5cGUuZ2V0TGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucDAuZGlzdGFuY2UodGhpcy5wMSl9LGJhLnByb3RvdHlwZS5jb21wYXJlVG89ZnVuY3Rpb24odCl7dmFyIGU9dCxuPXRoaXMucDAuY29tcGFyZVRvKGUucDApO3JldHVybiAwIT09bj9uOnRoaXMucDEuY29tcGFyZVRvKGUucDEpfSxiYS5wcm90b3R5cGUucmV2ZXJzZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMucDA7dGhpcy5wMD10aGlzLnAxLHRoaXMucDE9dH0sYmEucHJvdG90eXBlLmVxdWFsc1RvcG89ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucDAuZXF1YWxzKHQucDApJiYodGhpcy5wMS5lcXVhbHModC5wMSl8fHRoaXMucDAuZXF1YWxzKHQucDEpKSYmdGhpcy5wMS5lcXVhbHModC5wMCl9LGJhLnByb3RvdHlwZS5saW5lSW50ZXJzZWN0aW9uPWZ1bmN0aW9uKHQpe3RyeXtyZXR1cm4gemkuaW50ZXJzZWN0aW9uKHRoaXMucDAsdGhpcy5wMSx0LnAwLHQucDEpfWNhdGNoKHQpe2lmKCEodCBpbnN0YW5jZW9mIEJpKSl0aHJvdyB0fXJldHVybiBudWxsfSxiYS5wcm90b3R5cGUubWF4WT1mdW5jdGlvbigpe3JldHVybiBNYXRoLm1heCh0aGlzLnAwLnksdGhpcy5wMS55KX0sYmEucHJvdG90eXBlLnBvaW50QWxvbmdPZmZzZXQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLnAwLngrdCoodGhpcy5wMS54LXRoaXMucDAueCkscj10aGlzLnAwLnkrdCoodGhpcy5wMS55LXRoaXMucDAueSksaT10aGlzLnAxLngtdGhpcy5wMC54LG89dGhpcy5wMS55LXRoaXMucDAueSxzPU1hdGguc3FydChpKmkrbypvKSxhPTAsdT0wO2lmKDAhPT1lKXtpZihzPD0wKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IGNvbXB1dGUgb2Zmc2V0IGZyb20gemVyby1sZW5ndGggbGluZSBzZWdtZW50Iik7YT1lKmkvcyx1PWUqby9zfXJldHVybiBuZXcgdmkobi11LHIrYSl9LGJhLnByb3RvdHlwZS5zZXRDb29yZGluYXRlcz1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5zZXRDb29yZGluYXRlcyh0LnAwLHQucDEpfWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTt0aGlzLnAwLng9ZS54LHRoaXMucDAueT1lLnksdGhpcy5wMS54PW4ueCx0aGlzLnAxLnk9bi55fX0sYmEucHJvdG90eXBlLnNlZ21lbnRGcmFjdGlvbj1mdW5jdGlvbih0KXt2YXIgZT10aGlzLnByb2plY3Rpb25GYWN0b3IodCk7cmV0dXJuIGU8MD9lPTA6KGU+MXx8ZmkuaXNOYU4oZSkpJiYoZT0xKSxlfSxiYS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iTElORVNUUklORyggIit0aGlzLnAwLngrIiAiK3RoaXMucDAueSsiLCAiK3RoaXMucDEueCsiICIrdGhpcy5wMS55KyIpIn0sYmEucHJvdG90eXBlLmlzSG9yaXpvbnRhbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnAwLnk9PT10aGlzLnAxLnl9LGJhLnByb3RvdHlwZS5kaXN0YW5jZT1mdW5jdGlvbigpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgYmEpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gZW8uZGlzdGFuY2VMaW5lTGluZSh0aGlzLnAwLHRoaXMucDEsdC5wMCx0LnAxKX1pZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHZpKXt2YXIgZT1hcmd1bWVudHNbMF07cmV0dXJuIGVvLmRpc3RhbmNlUG9pbnRMaW5lKGUsdGhpcy5wMCx0aGlzLnAxKX19LGJhLnByb3RvdHlwZS5wb2ludEFsb25nPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyB2aTtyZXR1cm4gZS54PXRoaXMucDAueCt0Kih0aGlzLnAxLngtdGhpcy5wMC54KSxlLnk9dGhpcy5wMC55K3QqKHRoaXMucDEueS10aGlzLnAwLnkpLGV9LGJhLnByb3RvdHlwZS5oYXNoQ29kZT1mdW5jdGlvbigpe3ZhciB0PWZpLmRvdWJsZVRvTG9uZ0JpdHModGhpcy5wMC54KTt0Xj0zMSpmaS5kb3VibGVUb0xvbmdCaXRzKHRoaXMucDAueSk7dmFyIGU9TWF0aC50cnVuYyh0KV5NYXRoLnRydW5jKHQ+PjMyKSxuPWZpLmRvdWJsZVRvTG9uZ0JpdHModGhpcy5wMS54KTtyZXR1cm4gbl49MzEqZmkuZG91YmxlVG9Mb25nQml0cyh0aGlzLnAxLnkpLGVeKE1hdGgudHJ1bmMobileTWF0aC50cnVuYyhuPj4zMikpfSxiYS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bZGksbWldfSxiYS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gYmF9LGJhLm1pZFBvaW50PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyB2aSgodC54K2UueCkvMiwodC55K2UueSkvMil9LERhLnNlcmlhbFZlcnNpb25VSUQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDB4MmQyMTcyMTM1ZjQxMWMwMH0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoYmEsRGEpO3ZhciBFYT1mdW5jdGlvbigpe3RoaXMudGVtcEVudjE9bmV3IGppLHRoaXMudGVtcEVudjI9bmV3IGppLHRoaXMuX292ZXJsYXBTZWcxPW5ldyBiYSx0aGlzLl9vdmVybGFwU2VnMj1uZXcgYmF9O0VhLnByb3RvdHlwZS5vdmVybGFwPWZ1bmN0aW9uKCl7aWYoMiE9PWFyZ3VtZW50cy5sZW5ndGgmJjQ9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMV0sZT1hcmd1bWVudHNbMl0sbj1hcmd1bWVudHNbM107YXJndW1lbnRzWzBdLmdldExpbmVTZWdtZW50KHQsdGhpcy5fb3ZlcmxhcFNlZzEpLGUuZ2V0TGluZVNlZ21lbnQobix0aGlzLl9vdmVybGFwU2VnMiksdGhpcy5vdmVybGFwKHRoaXMuX292ZXJsYXBTZWcxLHRoaXMuX292ZXJsYXBTZWcyKX19LEVhLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxFYS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gRWF9O3ZhciBDYT1mdW5jdGlvbigpe3RoaXMuX3B0cz1udWxsLHRoaXMuX3N0YXJ0PW51bGwsdGhpcy5fZW5kPW51bGwsdGhpcy5fZW52PW51bGwsdGhpcy5fY29udGV4dD1udWxsLHRoaXMuX2lkPW51bGw7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdLG49YXJndW1lbnRzWzJdLHI9YXJndW1lbnRzWzNdO3RoaXMuX3B0cz10LHRoaXMuX3N0YXJ0PWUsdGhpcy5fZW5kPW4sdGhpcy5fY29udGV4dD1yfTtDYS5wcm90b3R5cGUuZ2V0TGluZVNlZ21lbnQ9ZnVuY3Rpb24odCxlKXtlLnAwPXRoaXMuX3B0c1t0XSxlLnAxPXRoaXMuX3B0c1t0KzFdfSxDYS5wcm90b3R5cGUuY29tcHV0ZVNlbGVjdD1mdW5jdGlvbih0LGUsbixyKXt2YXIgaT10aGlzLl9wdHNbZV0sbz10aGlzLl9wdHNbbl07aWYoci50ZW1wRW52MS5pbml0KGksbyksbi1lPT0xKXJldHVybiByLnNlbGVjdCh0aGlzLGUpLG51bGw7aWYoIXQuaW50ZXJzZWN0cyhyLnRlbXBFbnYxKSlyZXR1cm4gbnVsbDt2YXIgcz1NYXRoLnRydW5jKChlK24pLzIpO2U8cyYmdGhpcy5jb21wdXRlU2VsZWN0KHQsZSxzLHIpLHM8biYmdGhpcy5jb21wdXRlU2VsZWN0KHQscyxuLHIpfSxDYS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZXM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9bmV3IEFycmF5KHRoaXMuX2VuZC10aGlzLl9zdGFydCsxKS5maWxsKG51bGwpLGU9MCxuPXRoaXMuX3N0YXJ0O248PXRoaXMuX2VuZDtuKyspdFtlKytdPXRoaXMuX3B0c1tuXTtyZXR1cm4gdH0sQ2EucHJvdG90eXBlLmNvbXB1dGVPdmVybGFwcz1mdW5jdGlvbih0LGUpe3RoaXMuY29tcHV0ZU92ZXJsYXBzSW50ZXJuYWwodGhpcy5fc3RhcnQsdGhpcy5fZW5kLHQsdC5fc3RhcnQsdC5fZW5kLGUpfSxDYS5wcm90b3R5cGUuc2V0SWQ9ZnVuY3Rpb24odCl7dGhpcy5faWQ9dH0sQ2EucHJvdG90eXBlLnNlbGVjdD1mdW5jdGlvbih0LGUpe3RoaXMuY29tcHV0ZVNlbGVjdCh0LHRoaXMuX3N0YXJ0LHRoaXMuX2VuZCxlKX0sQ2EucHJvdG90eXBlLmdldEVudmVsb3BlPWZ1bmN0aW9uKCl7aWYobnVsbD09PXRoaXMuX2Vudil7dmFyIHQ9dGhpcy5fcHRzW3RoaXMuX3N0YXJ0XSxlPXRoaXMuX3B0c1t0aGlzLl9lbmRdO3RoaXMuX2Vudj1uZXcgamkodCxlKX1yZXR1cm4gdGhpcy5fZW52fSxDYS5wcm90b3R5cGUuZ2V0RW5kSW5kZXg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZW5kfSxDYS5wcm90b3R5cGUuZ2V0U3RhcnRJbmRleD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zdGFydH0sQ2EucHJvdG90eXBlLmdldENvbnRleHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY29udGV4dH0sQ2EucHJvdG90eXBlLmdldElkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lkfSxDYS5wcm90b3R5cGUuY29tcHV0ZU92ZXJsYXBzSW50ZXJuYWw9ZnVuY3Rpb24odCxlLG4scixpLG8pe3ZhciBzPXRoaXMuX3B0c1t0XSxhPXRoaXMuX3B0c1tlXSx1PW4uX3B0c1tyXSxjPW4uX3B0c1tpXTtpZihlLXQ9PTEmJmktcj09MSlyZXR1cm4gby5vdmVybGFwKHRoaXMsdCxuLHIpLG51bGw7aWYoby50ZW1wRW52MS5pbml0KHMsYSksby50ZW1wRW52Mi5pbml0KHUsYyksIW8udGVtcEVudjEuaW50ZXJzZWN0cyhvLnRlbXBFbnYyKSlyZXR1cm4gbnVsbDt2YXIgbD1NYXRoLnRydW5jKCh0K2UpLzIpLGg9TWF0aC50cnVuYygocitpKS8yKTt0PGwmJihyPGgmJnRoaXMuY29tcHV0ZU92ZXJsYXBzSW50ZXJuYWwodCxsLG4scixoLG8pLGg8aSYmdGhpcy5jb21wdXRlT3ZlcmxhcHNJbnRlcm5hbCh0LGwsbixoLGksbykpLGw8ZSYmKHI8aCYmdGhpcy5jb21wdXRlT3ZlcmxhcHNJbnRlcm5hbChsLGUsbixyLGgsbyksaDxpJiZ0aGlzLmNvbXB1dGVPdmVybGFwc0ludGVybmFsKGwsZSxuLGgsaSxvKSl9LENhLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxDYS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gQ2F9O3ZhciBTYT1mdW5jdGlvbigpe307U2EucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LFNhLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBTYX0sU2EuZ2V0Q2hhaW5TdGFydEluZGljZXM9ZnVuY3Rpb24odCl7dmFyIGU9MCxuPW5ldyB4bztuLmFkZChuZXcgTmkoZSkpO2Rve3ZhciByPVNhLmZpbmRDaGFpbkVuZCh0LGUpO24uYWRkKG5ldyBOaShyKSksZT1yfXdoaWxlKGU8dC5sZW5ndGgtMSk7cmV0dXJuIFNhLnRvSW50QXJyYXkobil9LFNhLmZpbmRDaGFpbkVuZD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1lO248dC5sZW5ndGgtMSYmdFtuXS5lcXVhbHMyRCh0W24rMV0pOyluKys7aWYobj49dC5sZW5ndGgtMSlyZXR1cm4gdC5sZW5ndGgtMTtmb3IodmFyIHI9V3MucXVhZHJhbnQodFtuXSx0W24rMV0pLGk9ZSsxO2k8dC5sZW5ndGg7KXtpZighdFtpLTFdLmVxdWFsczJEKHRbaV0pKWlmKFdzLnF1YWRyYW50KHRbaS0xXSx0W2ldKSE9PXIpYnJlYWs7aSsrfXJldHVybiBpLTF9LFNhLmdldENoYWlucz1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiBTYS5nZXRDaGFpbnMoYXJndW1lbnRzWzBdLG51bGwpO2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXtmb3IodmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdLG49bmV3IHhvLHI9U2EuZ2V0Q2hhaW5TdGFydEluZGljZXModCksaT0wO2k8ci5sZW5ndGgtMTtpKyspe3ZhciBvPW5ldyBDYSh0LHJbaV0scltpKzFdLGUpO24uYWRkKG8pfXJldHVybiBufX0sU2EudG9JbnRBcnJheT1mdW5jdGlvbih0KXtmb3IodmFyIGU9bmV3IEFycmF5KHQuc2l6ZSgpKS5maWxsKG51bGwpLG49MDtuPGUubGVuZ3RoO24rKyllW25dPXQuZ2V0KG4pLmludFZhbHVlKCk7cmV0dXJuIGV9O3ZhciBBYT1mdW5jdGlvbigpe307QWEucHJvdG90eXBlLmNvbXB1dGVOb2Rlcz1mdW5jdGlvbih0KXt9LEFhLnByb3RvdHlwZS5nZXROb2RlZFN1YnN0cmluZ3M9ZnVuY3Rpb24oKXt9LEFhLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxBYS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gQWF9O3ZhciBOYT1mdW5jdGlvbigpe2lmKHRoaXMuX3NlZ0ludD1udWxsLDAhPT1hcmd1bWVudHMubGVuZ3RoJiYxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuc2V0U2VnbWVudEludGVyc2VjdG9yKHQpfX07TmEucHJvdG90eXBlLnNldFNlZ21lbnRJbnRlcnNlY3Rvcj1mdW5jdGlvbih0KXt0aGlzLl9zZWdJbnQ9dH0sTmEucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW0FhXX0sTmEucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIE5hfTt2YXIgSWE9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXtlP3QuY2FsbCh0aGlzLGUpOnQuY2FsbCh0aGlzKSx0aGlzLl9tb25vQ2hhaW5zPW5ldyB4byx0aGlzLl9pbmRleD1uZXcgcGEsdGhpcy5faWRDb3VudGVyPTAsdGhpcy5fbm9kZWRTZWdTdHJpbmdzPW51bGwsdGhpcy5fbk92ZXJsYXBzPTB9dCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWU7dmFyIG49e1NlZ21lbnRPdmVybGFwQWN0aW9uOntjb25maWd1cmFibGU6ITB9fTtyZXR1cm4gZS5wcm90b3R5cGUuZ2V0TW9ub3RvbmVDaGFpbnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbW9ub0NoYWluc30sZS5wcm90b3R5cGUuZ2V0Tm9kZWRTdWJzdHJpbmdzPWZ1bmN0aW9uKCl7cmV0dXJuIHdhLmdldE5vZGVkU3Vic3RyaW5ncyh0aGlzLl9ub2RlZFNlZ1N0cmluZ3MpfSxlLnByb3RvdHlwZS5nZXRJbmRleD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pbmRleH0sZS5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLG49U2EuZ2V0Q2hhaW5zKHQuZ2V0Q29vcmRpbmF0ZXMoKSx0KS5pdGVyYXRvcigpO24uaGFzTmV4dCgpOyl7dmFyIHI9bi5uZXh0KCk7ci5zZXRJZChlLl9pZENvdW50ZXIrKyksZS5faW5kZXguaW5zZXJ0KHIuZ2V0RW52ZWxvcGUoKSxyKSxlLl9tb25vQ2hhaW5zLmFkZChyKX19LGUucHJvdG90eXBlLmNvbXB1dGVOb2Rlcz1mdW5jdGlvbih0KXt0aGlzLl9ub2RlZFNlZ1N0cmluZ3M9dDtmb3IodmFyIGU9dC5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl0aGlzLmFkZChlLm5leHQoKSk7dGhpcy5pbnRlcnNlY3RDaGFpbnMoKX0sZS5wcm90b3R5cGUuaW50ZXJzZWN0Q2hhaW5zPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMsZT1uZXcgTWEodGhpcy5fc2VnSW50KSxuPXRoaXMuX21vbm9DaGFpbnMuaXRlcmF0b3IoKTtuLmhhc05leHQoKTspZm9yKHZhciByPW4ubmV4dCgpLGk9dC5faW5kZXgucXVlcnkoci5nZXRFbnZlbG9wZSgpKS5pdGVyYXRvcigpO2kuaGFzTmV4dCgpOyl7dmFyIG89aS5uZXh0KCk7aWYoby5nZXRJZCgpPnIuZ2V0SWQoKSYmKHIuY29tcHV0ZU92ZXJsYXBzKG8sZSksdC5fbk92ZXJsYXBzKyspLHQuX3NlZ0ludC5pc0RvbmUoKSlyZXR1cm4gbnVsbH19LGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LG4uU2VnbWVudE92ZXJsYXBBY3Rpb24uZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIE1hfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLG4pLGV9KE5hKSxNYT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dC5jYWxsKHRoaXMpLHRoaXMuX3NpPW51bGw7dmFyIGU9YXJndW1lbnRzWzBdO3RoaXMuX3NpPWV9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLm92ZXJsYXA9ZnVuY3Rpb24oKXtpZig0IT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdC5wcm90b3R5cGUub3ZlcmxhcC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIGU9YXJndW1lbnRzWzFdLG49YXJndW1lbnRzWzJdLHI9YXJndW1lbnRzWzNdLGk9YXJndW1lbnRzWzBdLmdldENvbnRleHQoKSxvPW4uZ2V0Q29udGV4dCgpO3RoaXMuX3NpLnByb2Nlc3NJbnRlcnNlY3Rpb25zKGksZSxvLHIpfSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxlfShFYSksRmE9ZnVuY3Rpb24gdCgpe2lmKHRoaXMuX3F1YWRyYW50U2VnbWVudHM9dC5ERUZBVUxUX1FVQURSQU5UX1NFR01FTlRTLHRoaXMuX2VuZENhcFN0eWxlPXQuQ0FQX1JPVU5ELHRoaXMuX2pvaW5TdHlsZT10LkpPSU5fUk9VTkQsdGhpcy5fbWl0cmVMaW1pdD10LkRFRkFVTFRfTUlUUkVfTElNSVQsdGhpcy5faXNTaW5nbGVTaWRlZD0hMSx0aGlzLl9zaW1wbGlmeUZhY3Rvcj10LkRFRkFVTFRfU0lNUExJRllfRkFDVE9SLDAhPT1hcmd1bWVudHMubGVuZ3RoKWlmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF07dGhpcy5zZXRRdWFkcmFudFNlZ21lbnRzKGUpfWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXTt0aGlzLnNldFF1YWRyYW50U2VnbWVudHMobiksdGhpcy5zZXRFbmRDYXBTdHlsZShyKX1lbHNlIGlmKDQ9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgaT1hcmd1bWVudHNbMF0sbz1hcmd1bWVudHNbMV0scz1hcmd1bWVudHNbMl0sYT1hcmd1bWVudHNbM107dGhpcy5zZXRRdWFkcmFudFNlZ21lbnRzKGkpLHRoaXMuc2V0RW5kQ2FwU3R5bGUobyksdGhpcy5zZXRKb2luU3R5bGUocyksdGhpcy5zZXRNaXRyZUxpbWl0KGEpfX0sVGE9e0NBUF9ST1VORDp7Y29uZmlndXJhYmxlOiEwfSxDQVBfRkxBVDp7Y29uZmlndXJhYmxlOiEwfSxDQVBfU1FVQVJFOntjb25maWd1cmFibGU6ITB9LEpPSU5fUk9VTkQ6e2NvbmZpZ3VyYWJsZTohMH0sSk9JTl9NSVRSRTp7Y29uZmlndXJhYmxlOiEwfSxKT0lOX0JFVkVMOntjb25maWd1cmFibGU6ITB9LERFRkFVTFRfUVVBRFJBTlRfU0VHTUVOVFM6e2NvbmZpZ3VyYWJsZTohMH0sREVGQVVMVF9NSVRSRV9MSU1JVDp7Y29uZmlndXJhYmxlOiEwfSxERUZBVUxUX1NJTVBMSUZZX0ZBQ1RPUjp7Y29uZmlndXJhYmxlOiEwfX07RmEucHJvdG90eXBlLmdldEVuZENhcFN0eWxlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VuZENhcFN0eWxlfSxGYS5wcm90b3R5cGUuaXNTaW5nbGVTaWRlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pc1NpbmdsZVNpZGVkfSxGYS5wcm90b3R5cGUuc2V0UXVhZHJhbnRTZWdtZW50cz1mdW5jdGlvbih0KXt0aGlzLl9xdWFkcmFudFNlZ21lbnRzPXQsMD09PXRoaXMuX3F1YWRyYW50U2VnbWVudHMmJih0aGlzLl9qb2luU3R5bGU9RmEuSk9JTl9CRVZFTCksdGhpcy5fcXVhZHJhbnRTZWdtZW50czwwJiYodGhpcy5fam9pblN0eWxlPUZhLkpPSU5fTUlUUkUsdGhpcy5fbWl0cmVMaW1pdD1NYXRoLmFicyh0aGlzLl9xdWFkcmFudFNlZ21lbnRzKSksdDw9MCYmKHRoaXMuX3F1YWRyYW50U2VnbWVudHM9MSksdGhpcy5fam9pblN0eWxlIT09RmEuSk9JTl9ST1VORCYmKHRoaXMuX3F1YWRyYW50U2VnbWVudHM9RmEuREVGQVVMVF9RVUFEUkFOVF9TRUdNRU5UUyl9LEZhLnByb3RvdHlwZS5nZXRKb2luU3R5bGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fam9pblN0eWxlfSxGYS5wcm90b3R5cGUuc2V0Sm9pblN0eWxlPWZ1bmN0aW9uKHQpe3RoaXMuX2pvaW5TdHlsZT10fSxGYS5wcm90b3R5cGUuc2V0U2ltcGxpZnlGYWN0b3I9ZnVuY3Rpb24odCl7dGhpcy5fc2ltcGxpZnlGYWN0b3I9dDwwPzA6dH0sRmEucHJvdG90eXBlLmdldFNpbXBsaWZ5RmFjdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NpbXBsaWZ5RmFjdG9yfSxGYS5wcm90b3R5cGUuZ2V0UXVhZHJhbnRTZWdtZW50cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9xdWFkcmFudFNlZ21lbnRzfSxGYS5wcm90b3R5cGUuc2V0RW5kQ2FwU3R5bGU9ZnVuY3Rpb24odCl7dGhpcy5fZW5kQ2FwU3R5bGU9dH0sRmEucHJvdG90eXBlLmdldE1pdHJlTGltaXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWl0cmVMaW1pdH0sRmEucHJvdG90eXBlLnNldE1pdHJlTGltaXQ9ZnVuY3Rpb24odCl7dGhpcy5fbWl0cmVMaW1pdD10fSxGYS5wcm90b3R5cGUuc2V0U2luZ2xlU2lkZWQ9ZnVuY3Rpb24odCl7dGhpcy5faXNTaW5nbGVTaWRlZD10fSxGYS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sRmEucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIEZhfSxGYS5idWZmZXJEaXN0YW5jZUVycm9yPWZ1bmN0aW9uKHQpe3ZhciBlPU1hdGguUEkvMi90O3JldHVybiAxLU1hdGguY29zKGUvMil9LFRhLkNBUF9ST1VORC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMX0sVGEuQ0FQX0ZMQVQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDJ9LFRhLkNBUF9TUVVBUkUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDN9LFRhLkpPSU5fUk9VTkQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDF9LFRhLkpPSU5fTUlUUkUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDJ9LFRhLkpPSU5fQkVWRUwuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDN9LFRhLkRFRkFVTFRfUVVBRFJBTlRfU0VHTUVOVFMuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDh9LFRhLkRFRkFVTFRfTUlUUkVfTElNSVQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDV9LFRhLkRFRkFVTFRfU0lNUExJRllfRkFDVE9SLmdldD1mdW5jdGlvbigpe3JldHVybi4wMX0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoRmEsVGEpO3ZhciBPYT1mdW5jdGlvbih0KXt0aGlzLl9kaXN0YW5jZVRvbD1udWxsLHRoaXMuX2lzRGVsZXRlZD1udWxsLHRoaXMuX2FuZ2xlT3JpZW50YXRpb249ZW8uQ09VTlRFUkNMT0NLV0lTRSx0aGlzLl9pbnB1dExpbmU9dHx8bnVsbH0sTGE9e0lOSVQ6e2NvbmZpZ3VyYWJsZTohMH0sREVMRVRFOntjb25maWd1cmFibGU6ITB9LEtFRVA6e2NvbmZpZ3VyYWJsZTohMH0sTlVNX1BUU19UT19DSEVDSzp7Y29uZmlndXJhYmxlOiEwfX07T2EucHJvdG90eXBlLmlzRGVsZXRhYmxlPWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPXRoaXMuX2lucHV0TGluZVt0XSxvPXRoaXMuX2lucHV0TGluZVtlXSxzPXRoaXMuX2lucHV0TGluZVtuXTtyZXR1cm4hKCF0aGlzLmlzQ29uY2F2ZShpLG8scyl8fCF0aGlzLmlzU2hhbGxvdyhpLG8scyxyKSkmJnRoaXMuaXNTaGFsbG93U2FtcGxlZChpLG8sdCxuLHIpfSxPYS5wcm90b3R5cGUuZGVsZXRlU2hhbGxvd0NvbmNhdml0aWVzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMsZT0xLG49dGhpcy5maW5kTmV4dE5vbkRlbGV0ZWRJbmRleChlKSxyPXRoaXMuZmluZE5leHROb25EZWxldGVkSW5kZXgobiksaT0hMTtyPHRoaXMuX2lucHV0TGluZS5sZW5ndGg7KXt2YXIgbz0hMTt0LmlzRGVsZXRhYmxlKGUsbixyLHQuX2Rpc3RhbmNlVG9sKSYmKHQuX2lzRGVsZXRlZFtuXT1PYS5ERUxFVEUsbz0hMCxpPSEwKSxlPW8/cjpuLG49dC5maW5kTmV4dE5vbkRlbGV0ZWRJbmRleChlKSxyPXQuZmluZE5leHROb25EZWxldGVkSW5kZXgobil9cmV0dXJuIGl9LE9hLnByb3RvdHlwZS5pc1NoYWxsb3dDb25jYXZpdHk9ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIGVvLmNvbXB1dGVPcmllbnRhdGlvbih0LGUsbik9PT10aGlzLl9hbmdsZU9yaWVudGF0aW9uJiZlby5kaXN0YW5jZVBvaW50TGluZShlLHQsbik8cn0sT2EucHJvdG90eXBlLmlzU2hhbGxvd1NhbXBsZWQ9ZnVuY3Rpb24odCxlLG4scixpKXt2YXIgbz1NYXRoLnRydW5jKChyLW4pL09hLk5VTV9QVFNfVE9fQ0hFQ0spO288PTAmJihvPTEpO2Zvcih2YXIgcz1uO3M8cjtzKz1vKWlmKCF0aGlzLmlzU2hhbGxvdyh0LGUsdGhpcy5faW5wdXRMaW5lW3NdLGkpKXJldHVybiExO3JldHVybiEwfSxPYS5wcm90b3R5cGUuaXNDb25jYXZlPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gZW8uY29tcHV0ZU9yaWVudGF0aW9uKHQsZSxuKT09PXRoaXMuX2FuZ2xlT3JpZW50YXRpb259LE9hLnByb3RvdHlwZS5zaW1wbGlmeT1mdW5jdGlvbih0KXt0aGlzLl9kaXN0YW5jZVRvbD1NYXRoLmFicyh0KSx0PDAmJih0aGlzLl9hbmdsZU9yaWVudGF0aW9uPWVvLkNMT0NLV0lTRSksdGhpcy5faXNEZWxldGVkPW5ldyBBcnJheSh0aGlzLl9pbnB1dExpbmUubGVuZ3RoKS5maWxsKG51bGwpO3ZhciBlPSExO2Rve2U9dGhpcy5kZWxldGVTaGFsbG93Q29uY2F2aXRpZXMoKX13aGlsZShlKTtyZXR1cm4gdGhpcy5jb2xsYXBzZUxpbmUoKX0sT2EucHJvdG90eXBlLmZpbmROZXh0Tm9uRGVsZXRlZEluZGV4PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10KzE7ZTx0aGlzLl9pbnB1dExpbmUubGVuZ3RoJiZ0aGlzLl9pc0RlbGV0ZWRbZV09PT1PYS5ERUxFVEU7KWUrKztyZXR1cm4gZX0sT2EucHJvdG90eXBlLmlzU2hhbGxvdz1mdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gZW8uZGlzdGFuY2VQb2ludExpbmUoZSx0LG4pPHJ9LE9hLnByb3RvdHlwZS5jb2xsYXBzZUxpbmU9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9bmV3IGJvLGU9MDtlPHRoaXMuX2lucHV0TGluZS5sZW5ndGg7ZSsrKXRoaXMuX2lzRGVsZXRlZFtlXSE9PU9hLkRFTEVURSYmdC5hZGQodGhpcy5faW5wdXRMaW5lW2VdKTtyZXR1cm4gdC50b0Nvb3JkaW5hdGVBcnJheSgpfSxPYS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sT2EucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIE9hfSxPYS5zaW1wbGlmeT1mdW5jdGlvbih0LGUpe3JldHVybiBuZXcgT2EodCkuc2ltcGxpZnkoZSl9LExhLklOSVQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDB9LExhLkRFTEVURS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMX0sTGEuS0VFUC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMX0sTGEuTlVNX1BUU19UT19DSEVDSy5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMTB9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKE9hLExhKTt2YXIgUGE9ZnVuY3Rpb24oKXt0aGlzLl9wdExpc3Q9bnVsbCx0aGlzLl9wcmVjaXNpb25Nb2RlbD1udWxsLHRoaXMuX21pbmltaW1WZXJ0ZXhEaXN0YW5jZT0wLHRoaXMuX3B0TGlzdD1uZXcgeG99LFJhPXtDT09SRElOQVRFX0FSUkFZX1RZUEU6e2NvbmZpZ3VyYWJsZTohMH19O1BhLnByb3RvdHlwZS5nZXRDb29yZGluYXRlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wdExpc3QudG9BcnJheShQYS5DT09SRElOQVRFX0FSUkFZX1RZUEUpfSxQYS5wcm90b3R5cGUuc2V0UHJlY2lzaW9uTW9kZWw9ZnVuY3Rpb24odCl7dGhpcy5fcHJlY2lzaW9uTW9kZWw9dH0sUGEucHJvdG90eXBlLmFkZFB0PWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyB2aSh0KTtpZih0aGlzLl9wcmVjaXNpb25Nb2RlbC5tYWtlUHJlY2lzZShlKSx0aGlzLmlzUmVkdW5kYW50KGUpKXJldHVybiBudWxsO3RoaXMuX3B0TGlzdC5hZGQoZSl9LFBhLnByb3RvdHlwZS5yZXZlcmU9ZnVuY3Rpb24oKXt9LFBhLnByb3RvdHlwZS5hZGRQdHM9ZnVuY3Rpb24odCxlKXtpZihlKWZvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXRoaXMuYWRkUHQodFtuXSk7ZWxzZSBmb3IodmFyIHI9dC5sZW5ndGgtMTtyPj0wO3ItLSl0aGlzLmFkZFB0KHRbcl0pfSxQYS5wcm90b3R5cGUuaXNSZWR1bmRhbnQ9ZnVuY3Rpb24odCl7aWYodGhpcy5fcHRMaXN0LnNpemUoKTwxKXJldHVybiExO3ZhciBlPXRoaXMuX3B0TGlzdC5nZXQodGhpcy5fcHRMaXN0LnNpemUoKS0xKTtyZXR1cm4gdC5kaXN0YW5jZShlKTx0aGlzLl9taW5pbWltVmVydGV4RGlzdGFuY2V9LFBhLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybihuZXcgSXMpLmNyZWF0ZUxpbmVTdHJpbmcodGhpcy5nZXRDb29yZGluYXRlcygpKS50b1N0cmluZygpfSxQYS5wcm90b3R5cGUuY2xvc2VSaW5nPWZ1bmN0aW9uKCl7aWYodGhpcy5fcHRMaXN0LnNpemUoKTwxKXJldHVybiBudWxsO3ZhciB0PW5ldyB2aSh0aGlzLl9wdExpc3QuZ2V0KDApKSxlPXRoaXMuX3B0TGlzdC5nZXQodGhpcy5fcHRMaXN0LnNpemUoKS0xKTtpZih0LmVxdWFscyhlKSlyZXR1cm4gbnVsbDt0aGlzLl9wdExpc3QuYWRkKHQpfSxQYS5wcm90b3R5cGUuc2V0TWluaW11bVZlcnRleERpc3RhbmNlPWZ1bmN0aW9uKHQpe3RoaXMuX21pbmltaW1WZXJ0ZXhEaXN0YW5jZT10fSxQYS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sUGEucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFBhfSxSYS5DT09SRElOQVRFX0FSUkFZX1RZUEUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBBcnJheSgwKS5maWxsKG51bGwpfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhQYSxSYSk7dmFyIEJhPWZ1bmN0aW9uKCl7fSxrYT17UElfVElNRVNfMjp7Y29uZmlndXJhYmxlOiEwfSxQSV9PVkVSXzI6e2NvbmZpZ3VyYWJsZTohMH0sUElfT1ZFUl80Ontjb25maWd1cmFibGU6ITB9LENPVU5URVJDTE9DS1dJU0U6e2NvbmZpZ3VyYWJsZTohMH0sQ0xPQ0tXSVNFOntjb25maWd1cmFibGU6ITB9LE5PTkU6e2NvbmZpZ3VyYWJsZTohMH19O0JhLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxCYS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gQmF9LEJhLnRvRGVncmVlcz1mdW5jdGlvbih0KXtyZXR1cm4gMTgwKnQvTWF0aC5QSX0sQmEubm9ybWFsaXplPWZ1bmN0aW9uKHQpe2Zvcig7dD5NYXRoLlBJOyl0LT1CYS5QSV9USU1FU18yO2Zvcig7dDw9LU1hdGguUEk7KXQrPUJhLlBJX1RJTUVTXzI7cmV0dXJuIHR9LEJhLmFuZ2xlPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gTWF0aC5hdGFuMih0LnksdC54KX1pZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdLHI9bi54LWUueCxpPW4ueS1lLnk7cmV0dXJuIE1hdGguYXRhbjIoaSxyKX19LEJhLmlzQWN1dGU9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXQueC1lLngsaT10LnktZS55O3JldHVybiByKihuLngtZS54KStpKihuLnktZS55KT4wfSxCYS5pc09idHVzZT1mdW5jdGlvbih0LGUsbil7dmFyIHI9dC54LWUueCxpPXQueS1lLnk7cmV0dXJuIHIqKG4ueC1lLngpK2kqKG4ueS1lLnkpPDB9LEJhLmludGVyaW9yQW5nbGU9ZnVuY3Rpb24odCxlLG4pe3ZhciByPUJhLmFuZ2xlKGUsdCksaT1CYS5hbmdsZShlLG4pO3JldHVybiBNYXRoLmFicyhpLXIpfSxCYS5ub3JtYWxpemVQb3NpdGl2ZT1mdW5jdGlvbih0KXtpZih0PDApe2Zvcig7dDwwOyl0Kz1CYS5QSV9USU1FU18yO3Q+PUJhLlBJX1RJTUVTXzImJih0PTApfWVsc2V7Zm9yKDt0Pj1CYS5QSV9USU1FU18yOyl0LT1CYS5QSV9USU1FU18yO3Q8MCYmKHQ9MCl9cmV0dXJuIHR9LEJhLmFuZ2xlQmV0d2Vlbj1mdW5jdGlvbih0LGUsbil7dmFyIHI9QmEuYW5nbGUoZSx0KSxpPUJhLmFuZ2xlKGUsbik7cmV0dXJuIEJhLmRpZmYocixpKX0sQmEuZGlmZj1mdW5jdGlvbih0LGUpe3ZhciBuPW51bGw7cmV0dXJuKG49dDxlP2UtdDp0LWUpPk1hdGguUEkmJihuPTIqTWF0aC5QSS1uKSxufSxCYS50b1JhZGlhbnM9ZnVuY3Rpb24odCl7cmV0dXJuIHQqTWF0aC5QSS8xODB9LEJhLmdldFR1cm49ZnVuY3Rpb24odCxlKXt2YXIgbj1NYXRoLnNpbihlLXQpO3JldHVybiBuPjA/QmEuQ09VTlRFUkNMT0NLV0lTRTpuPDA/QmEuQ0xPQ0tXSVNFOkJhLk5PTkV9LEJhLmFuZ2xlQmV0d2Vlbk9yaWVudGVkPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1CYS5hbmdsZShlLHQpLGk9QmEuYW5nbGUoZSxuKS1yO3JldHVybiBpPD0tTWF0aC5QST9pK0JhLlBJX1RJTUVTXzI6aT5NYXRoLlBJP2ktQmEuUElfVElNRVNfMjppfSxrYS5QSV9USU1FU18yLmdldD1mdW5jdGlvbigpe3JldHVybiAyKk1hdGguUEl9LGthLlBJX09WRVJfMi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5QSS8yfSxrYS5QSV9PVkVSXzQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguUEkvNH0sa2EuQ09VTlRFUkNMT0NLV0lTRS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gZW8uQ09VTlRFUkNMT0NLV0lTRX0sa2EuQ0xPQ0tXSVNFLmdldD1mdW5jdGlvbigpe3JldHVybiBlby5DTE9DS1dJU0V9LGthLk5PTkUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIGVvLkNPTExJTkVBUn0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQmEsa2EpO3ZhciB6YT1mdW5jdGlvbiB0KCl7dGhpcy5fbWF4Q3VydmVTZWdtZW50RXJyb3I9MCx0aGlzLl9maWxsZXRBbmdsZVF1YW50dW09bnVsbCx0aGlzLl9jbG9zaW5nU2VnTGVuZ3RoRmFjdG9yPTEsdGhpcy5fc2VnTGlzdD1udWxsLHRoaXMuX2Rpc3RhbmNlPTAsdGhpcy5fcHJlY2lzaW9uTW9kZWw9bnVsbCx0aGlzLl9idWZQYXJhbXM9bnVsbCx0aGlzLl9saT1udWxsLHRoaXMuX3MwPW51bGwsdGhpcy5fczE9bnVsbCx0aGlzLl9zMj1udWxsLHRoaXMuX3NlZzA9bmV3IGJhLHRoaXMuX3NlZzE9bmV3IGJhLHRoaXMuX29mZnNldDA9bmV3IGJhLHRoaXMuX29mZnNldDE9bmV3IGJhLHRoaXMuX3NpZGU9MCx0aGlzLl9oYXNOYXJyb3dDb25jYXZlQW5nbGU9ITE7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdLHI9YXJndW1lbnRzWzJdO3RoaXMuX3ByZWNpc2lvbk1vZGVsPWUsdGhpcy5fYnVmUGFyYW1zPW4sdGhpcy5fbGk9bmV3IFFpLHRoaXMuX2ZpbGxldEFuZ2xlUXVhbnR1bT1NYXRoLlBJLzIvbi5nZXRRdWFkcmFudFNlZ21lbnRzKCksbi5nZXRRdWFkcmFudFNlZ21lbnRzKCk+PTgmJm4uZ2V0Sm9pblN0eWxlKCk9PT1GYS5KT0lOX1JPVU5EJiYodGhpcy5fY2xvc2luZ1NlZ0xlbmd0aEZhY3Rvcj10Lk1BWF9DTE9TSU5HX1NFR19MRU5fRkFDVE9SKSx0aGlzLmluaXQocil9LGphPXtPRkZTRVRfU0VHTUVOVF9TRVBBUkFUSU9OX0ZBQ1RPUjp7Y29uZmlndXJhYmxlOiEwfSxJTlNJREVfVFVSTl9WRVJURVhfU05BUF9ESVNUQU5DRV9GQUNUT1I6e2NvbmZpZ3VyYWJsZTohMH0sQ1VSVkVfVkVSVEVYX1NOQVBfRElTVEFOQ0VfRkFDVE9SOntjb25maWd1cmFibGU6ITB9LE1BWF9DTE9TSU5HX1NFR19MRU5fRkFDVE9SOntjb25maWd1cmFibGU6ITB9fTt6YS5wcm90b3R5cGUuYWRkTmV4dFNlZ21lbnQ9ZnVuY3Rpb24odCxlKXtpZih0aGlzLl9zMD10aGlzLl9zMSx0aGlzLl9zMT10aGlzLl9zMix0aGlzLl9zMj10LHRoaXMuX3NlZzAuc2V0Q29vcmRpbmF0ZXModGhpcy5fczAsdGhpcy5fczEpLHRoaXMuY29tcHV0ZU9mZnNldFNlZ21lbnQodGhpcy5fc2VnMCx0aGlzLl9zaWRlLHRoaXMuX2Rpc3RhbmNlLHRoaXMuX29mZnNldDApLHRoaXMuX3NlZzEuc2V0Q29vcmRpbmF0ZXModGhpcy5fczEsdGhpcy5fczIpLHRoaXMuY29tcHV0ZU9mZnNldFNlZ21lbnQodGhpcy5fc2VnMSx0aGlzLl9zaWRlLHRoaXMuX2Rpc3RhbmNlLHRoaXMuX29mZnNldDEpLHRoaXMuX3MxLmVxdWFscyh0aGlzLl9zMikpcmV0dXJuIG51bGw7dmFyIG49ZW8uY29tcHV0ZU9yaWVudGF0aW9uKHRoaXMuX3MwLHRoaXMuX3MxLHRoaXMuX3MyKSxyPW49PT1lby5DTE9DS1dJU0UmJnRoaXMuX3NpZGU9PT1Gcy5MRUZUfHxuPT09ZW8uQ09VTlRFUkNMT0NLV0lTRSYmdGhpcy5fc2lkZT09PUZzLlJJR0hUOzA9PT1uP3RoaXMuYWRkQ29sbGluZWFyKGUpOnI/dGhpcy5hZGRPdXRzaWRlVHVybihuLGUpOnRoaXMuYWRkSW5zaWRlVHVybihuLGUpfSx6YS5wcm90b3R5cGUuYWRkTGluZUVuZENhcD1mdW5jdGlvbih0LGUpe3ZhciBuPW5ldyBiYSh0LGUpLHI9bmV3IGJhO3RoaXMuY29tcHV0ZU9mZnNldFNlZ21lbnQobixGcy5MRUZULHRoaXMuX2Rpc3RhbmNlLHIpO3ZhciBpPW5ldyBiYTt0aGlzLmNvbXB1dGVPZmZzZXRTZWdtZW50KG4sRnMuUklHSFQsdGhpcy5fZGlzdGFuY2UsaSk7dmFyIG89ZS54LXQueCxzPWUueS10LnksYT1NYXRoLmF0YW4yKHMsbyk7c3dpdGNoKHRoaXMuX2J1ZlBhcmFtcy5nZXRFbmRDYXBTdHlsZSgpKXtjYXNlIEZhLkNBUF9ST1VORDp0aGlzLl9zZWdMaXN0LmFkZFB0KHIucDEpLHRoaXMuYWRkRmlsbGV0QXJjKGUsYStNYXRoLlBJLzIsYS1NYXRoLlBJLzIsZW8uQ0xPQ0tXSVNFLHRoaXMuX2Rpc3RhbmNlKSx0aGlzLl9zZWdMaXN0LmFkZFB0KGkucDEpO2JyZWFrO2Nhc2UgRmEuQ0FQX0ZMQVQ6dGhpcy5fc2VnTGlzdC5hZGRQdChyLnAxKSx0aGlzLl9zZWdMaXN0LmFkZFB0KGkucDEpO2JyZWFrO2Nhc2UgRmEuQ0FQX1NRVUFSRTp2YXIgdT1uZXcgdmk7dS54PU1hdGguYWJzKHRoaXMuX2Rpc3RhbmNlKSpNYXRoLmNvcyhhKSx1Lnk9TWF0aC5hYnModGhpcy5fZGlzdGFuY2UpKk1hdGguc2luKGEpO3ZhciBjPW5ldyB2aShyLnAxLngrdS54LHIucDEueSt1LnkpLGw9bmV3IHZpKGkucDEueCt1LngsaS5wMS55K3UueSk7dGhpcy5fc2VnTGlzdC5hZGRQdChjKSx0aGlzLl9zZWdMaXN0LmFkZFB0KGwpfX0semEucHJvdG90eXBlLmdldENvb3JkaW5hdGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NlZ0xpc3QuZ2V0Q29vcmRpbmF0ZXMoKX0semEucHJvdG90eXBlLmFkZE1pdHJlSm9pbj1mdW5jdGlvbih0LGUsbixyKXt2YXIgaT0hMCxvPW51bGw7dHJ5e289emkuaW50ZXJzZWN0aW9uKGUucDAsZS5wMSxuLnAwLG4ucDEpLChyPD0wPzE6by5kaXN0YW5jZSh0KS9NYXRoLmFicyhyKSk+dGhpcy5fYnVmUGFyYW1zLmdldE1pdHJlTGltaXQoKSYmKGk9ITEpfWNhdGNoKHQpe2lmKCEodCBpbnN0YW5jZW9mIEJpKSl0aHJvdyB0O289bmV3IHZpKDAsMCksaT0hMX1pP3RoaXMuX3NlZ0xpc3QuYWRkUHQobyk6dGhpcy5hZGRMaW1pdGVkTWl0cmVKb2luKGUsbixyLHRoaXMuX2J1ZlBhcmFtcy5nZXRNaXRyZUxpbWl0KCkpfSx6YS5wcm90b3R5cGUuYWRkRmlsbGV0Q29ybmVyPWZ1bmN0aW9uKHQsZSxuLHIsaSl7dmFyIG89ZS54LXQueCxzPWUueS10LnksYT1NYXRoLmF0YW4yKHMsbyksdT1uLngtdC54LGM9bi55LXQueSxsPU1hdGguYXRhbjIoYyx1KTtyPT09ZW8uQ0xPQ0tXSVNFP2E8PWwmJihhKz0yKk1hdGguUEkpOmE+PWwmJihhLT0yKk1hdGguUEkpLHRoaXMuX3NlZ0xpc3QuYWRkUHQoZSksdGhpcy5hZGRGaWxsZXRBcmModCxhLGwscixpKSx0aGlzLl9zZWdMaXN0LmFkZFB0KG4pfSx6YS5wcm90b3R5cGUuYWRkT3V0c2lkZVR1cm49ZnVuY3Rpb24odCxlKXtpZih0aGlzLl9vZmZzZXQwLnAxLmRpc3RhbmNlKHRoaXMuX29mZnNldDEucDApPHRoaXMuX2Rpc3RhbmNlKnphLk9GRlNFVF9TRUdNRU5UX1NFUEFSQVRJT05fRkFDVE9SKXJldHVybiB0aGlzLl9zZWdMaXN0LmFkZFB0KHRoaXMuX29mZnNldDAucDEpLG51bGw7dGhpcy5fYnVmUGFyYW1zLmdldEpvaW5TdHlsZSgpPT09RmEuSk9JTl9NSVRSRT90aGlzLmFkZE1pdHJlSm9pbih0aGlzLl9zMSx0aGlzLl9vZmZzZXQwLHRoaXMuX29mZnNldDEsdGhpcy5fZGlzdGFuY2UpOnRoaXMuX2J1ZlBhcmFtcy5nZXRKb2luU3R5bGUoKT09PUZhLkpPSU5fQkVWRUw/dGhpcy5hZGRCZXZlbEpvaW4odGhpcy5fb2Zmc2V0MCx0aGlzLl9vZmZzZXQxKTooZSYmdGhpcy5fc2VnTGlzdC5hZGRQdCh0aGlzLl9vZmZzZXQwLnAxKSx0aGlzLmFkZEZpbGxldENvcm5lcih0aGlzLl9zMSx0aGlzLl9vZmZzZXQwLnAxLHRoaXMuX29mZnNldDEucDAsdCx0aGlzLl9kaXN0YW5jZSksdGhpcy5fc2VnTGlzdC5hZGRQdCh0aGlzLl9vZmZzZXQxLnAwKSl9LHphLnByb3RvdHlwZS5jcmVhdGVTcXVhcmU9ZnVuY3Rpb24odCl7dGhpcy5fc2VnTGlzdC5hZGRQdChuZXcgdmkodC54K3RoaXMuX2Rpc3RhbmNlLHQueSt0aGlzLl9kaXN0YW5jZSkpLHRoaXMuX3NlZ0xpc3QuYWRkUHQobmV3IHZpKHQueCt0aGlzLl9kaXN0YW5jZSx0LnktdGhpcy5fZGlzdGFuY2UpKSx0aGlzLl9zZWdMaXN0LmFkZFB0KG5ldyB2aSh0LngtdGhpcy5fZGlzdGFuY2UsdC55LXRoaXMuX2Rpc3RhbmNlKSksdGhpcy5fc2VnTGlzdC5hZGRQdChuZXcgdmkodC54LXRoaXMuX2Rpc3RhbmNlLHQueSt0aGlzLl9kaXN0YW5jZSkpLHRoaXMuX3NlZ0xpc3QuY2xvc2VSaW5nKCl9LHphLnByb3RvdHlwZS5hZGRTZWdtZW50cz1mdW5jdGlvbih0LGUpe3RoaXMuX3NlZ0xpc3QuYWRkUHRzKHQsZSl9LHphLnByb3RvdHlwZS5hZGRGaXJzdFNlZ21lbnQ9ZnVuY3Rpb24oKXt0aGlzLl9zZWdMaXN0LmFkZFB0KHRoaXMuX29mZnNldDEucDApfSx6YS5wcm90b3R5cGUuYWRkTGFzdFNlZ21lbnQ9ZnVuY3Rpb24oKXt0aGlzLl9zZWdMaXN0LmFkZFB0KHRoaXMuX29mZnNldDEucDEpfSx6YS5wcm90b3R5cGUuaW5pdFNpZGVTZWdtZW50cz1mdW5jdGlvbih0LGUsbil7dGhpcy5fczE9dCx0aGlzLl9zMj1lLHRoaXMuX3NpZGU9bix0aGlzLl9zZWcxLnNldENvb3JkaW5hdGVzKHQsZSksdGhpcy5jb21wdXRlT2Zmc2V0U2VnbWVudCh0aGlzLl9zZWcxLG4sdGhpcy5fZGlzdGFuY2UsdGhpcy5fb2Zmc2V0MSl9LHphLnByb3RvdHlwZS5hZGRMaW1pdGVkTWl0cmVKb2luPWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPXRoaXMuX3NlZzAucDEsbz1CYS5hbmdsZShpLHRoaXMuX3NlZzAucDApLHM9QmEuYW5nbGVCZXR3ZWVuT3JpZW50ZWQodGhpcy5fc2VnMC5wMCxpLHRoaXMuX3NlZzEucDEpLzIsYT1CYS5ub3JtYWxpemUobytzKSx1PUJhLm5vcm1hbGl6ZShhK01hdGguUEkpLGM9cipuLGw9bi1jKk1hdGguYWJzKE1hdGguc2luKHMpKSxoPWkueCtjKk1hdGguY29zKHUpLGY9aS55K2MqTWF0aC5zaW4odSkscD1uZXcgdmkoaCxmKSxkPW5ldyBiYShpLHApLGc9ZC5wb2ludEFsb25nT2Zmc2V0KDEsbCkseT1kLnBvaW50QWxvbmdPZmZzZXQoMSwtbCk7dGhpcy5fc2lkZT09PUZzLkxFRlQ/KHRoaXMuX3NlZ0xpc3QuYWRkUHQoZyksdGhpcy5fc2VnTGlzdC5hZGRQdCh5KSk6KHRoaXMuX3NlZ0xpc3QuYWRkUHQoeSksdGhpcy5fc2VnTGlzdC5hZGRQdChnKSl9LHphLnByb3RvdHlwZS5jb21wdXRlT2Zmc2V0U2VnbWVudD1mdW5jdGlvbih0LGUsbixyKXt2YXIgaT1lPT09RnMuTEVGVD8xOi0xLG89dC5wMS54LXQucDAueCxzPXQucDEueS10LnAwLnksYT1NYXRoLnNxcnQobypvK3MqcyksdT1pKm4qby9hLGM9aSpuKnMvYTtyLnAwLng9dC5wMC54LWMsci5wMC55PXQucDAueSt1LHIucDEueD10LnAxLngtYyxyLnAxLnk9dC5wMS55K3V9LHphLnByb3RvdHlwZS5hZGRGaWxsZXRBcmM9ZnVuY3Rpb24odCxlLG4scixpKXt2YXIgbz1yPT09ZW8uQ0xPQ0tXSVNFPy0xOjEscz1NYXRoLmFicyhlLW4pLGE9TWF0aC50cnVuYyhzL3RoaXMuX2ZpbGxldEFuZ2xlUXVhbnR1bSsuNSk7aWYoYTwxKXJldHVybiBudWxsO2Zvcih2YXIgdT1zL2EsYz0wLGw9bmV3IHZpO2M8czspe3ZhciBoPWUrbypjO2wueD10LngraSpNYXRoLmNvcyhoKSxsLnk9dC55K2kqTWF0aC5zaW4oaCksdGhpcy5fc2VnTGlzdC5hZGRQdChsKSxjKz11fX0semEucHJvdG90eXBlLmFkZEluc2lkZVR1cm49ZnVuY3Rpb24odCxlKXtpZih0aGlzLl9saS5jb21wdXRlSW50ZXJzZWN0aW9uKHRoaXMuX29mZnNldDAucDAsdGhpcy5fb2Zmc2V0MC5wMSx0aGlzLl9vZmZzZXQxLnAwLHRoaXMuX29mZnNldDEucDEpLHRoaXMuX2xpLmhhc0ludGVyc2VjdGlvbigpKXRoaXMuX3NlZ0xpc3QuYWRkUHQodGhpcy5fbGkuZ2V0SW50ZXJzZWN0aW9uKDApKTtlbHNlIGlmKHRoaXMuX2hhc05hcnJvd0NvbmNhdmVBbmdsZT0hMCx0aGlzLl9vZmZzZXQwLnAxLmRpc3RhbmNlKHRoaXMuX29mZnNldDEucDApPHRoaXMuX2Rpc3RhbmNlKnphLklOU0lERV9UVVJOX1ZFUlRFWF9TTkFQX0RJU1RBTkNFX0ZBQ1RPUil0aGlzLl9zZWdMaXN0LmFkZFB0KHRoaXMuX29mZnNldDAucDEpO2Vsc2V7aWYodGhpcy5fc2VnTGlzdC5hZGRQdCh0aGlzLl9vZmZzZXQwLnAxKSx0aGlzLl9jbG9zaW5nU2VnTGVuZ3RoRmFjdG9yPjApe3ZhciBuPW5ldyB2aSgodGhpcy5fY2xvc2luZ1NlZ0xlbmd0aEZhY3Rvcip0aGlzLl9vZmZzZXQwLnAxLngrdGhpcy5fczEueCkvKHRoaXMuX2Nsb3NpbmdTZWdMZW5ndGhGYWN0b3IrMSksKHRoaXMuX2Nsb3NpbmdTZWdMZW5ndGhGYWN0b3IqdGhpcy5fb2Zmc2V0MC5wMS55K3RoaXMuX3MxLnkpLyh0aGlzLl9jbG9zaW5nU2VnTGVuZ3RoRmFjdG9yKzEpKTt0aGlzLl9zZWdMaXN0LmFkZFB0KG4pO3ZhciByPW5ldyB2aSgodGhpcy5fY2xvc2luZ1NlZ0xlbmd0aEZhY3Rvcip0aGlzLl9vZmZzZXQxLnAwLngrdGhpcy5fczEueCkvKHRoaXMuX2Nsb3NpbmdTZWdMZW5ndGhGYWN0b3IrMSksKHRoaXMuX2Nsb3NpbmdTZWdMZW5ndGhGYWN0b3IqdGhpcy5fb2Zmc2V0MS5wMC55K3RoaXMuX3MxLnkpLyh0aGlzLl9jbG9zaW5nU2VnTGVuZ3RoRmFjdG9yKzEpKTt0aGlzLl9zZWdMaXN0LmFkZFB0KHIpfWVsc2UgdGhpcy5fc2VnTGlzdC5hZGRQdCh0aGlzLl9zMSk7dGhpcy5fc2VnTGlzdC5hZGRQdCh0aGlzLl9vZmZzZXQxLnAwKX19LHphLnByb3RvdHlwZS5jcmVhdGVDaXJjbGU9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IHZpKHQueCt0aGlzLl9kaXN0YW5jZSx0LnkpO3RoaXMuX3NlZ0xpc3QuYWRkUHQoZSksdGhpcy5hZGRGaWxsZXRBcmModCwwLDIqTWF0aC5QSSwtMSx0aGlzLl9kaXN0YW5jZSksdGhpcy5fc2VnTGlzdC5jbG9zZVJpbmcoKX0semEucHJvdG90eXBlLmFkZEJldmVsSm9pbj1mdW5jdGlvbih0LGUpe3RoaXMuX3NlZ0xpc3QuYWRkUHQodC5wMSksdGhpcy5fc2VnTGlzdC5hZGRQdChlLnAwKX0semEucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24odCl7dGhpcy5fZGlzdGFuY2U9dCx0aGlzLl9tYXhDdXJ2ZVNlZ21lbnRFcnJvcj10KigxLU1hdGguY29zKHRoaXMuX2ZpbGxldEFuZ2xlUXVhbnR1bS8yKSksdGhpcy5fc2VnTGlzdD1uZXcgUGEsdGhpcy5fc2VnTGlzdC5zZXRQcmVjaXNpb25Nb2RlbCh0aGlzLl9wcmVjaXNpb25Nb2RlbCksdGhpcy5fc2VnTGlzdC5zZXRNaW5pbXVtVmVydGV4RGlzdGFuY2UodCp6YS5DVVJWRV9WRVJURVhfU05BUF9ESVNUQU5DRV9GQUNUT1IpfSx6YS5wcm90b3R5cGUuYWRkQ29sbGluZWFyPWZ1bmN0aW9uKHQpe3RoaXMuX2xpLmNvbXB1dGVJbnRlcnNlY3Rpb24odGhpcy5fczAsdGhpcy5fczEsdGhpcy5fczEsdGhpcy5fczIpLHRoaXMuX2xpLmdldEludGVyc2VjdGlvbk51bSgpPj0yJiYodGhpcy5fYnVmUGFyYW1zLmdldEpvaW5TdHlsZSgpPT09RmEuSk9JTl9CRVZFTHx8dGhpcy5fYnVmUGFyYW1zLmdldEpvaW5TdHlsZSgpPT09RmEuSk9JTl9NSVRSRT8odCYmdGhpcy5fc2VnTGlzdC5hZGRQdCh0aGlzLl9vZmZzZXQwLnAxKSx0aGlzLl9zZWdMaXN0LmFkZFB0KHRoaXMuX29mZnNldDEucDApKTp0aGlzLmFkZEZpbGxldENvcm5lcih0aGlzLl9zMSx0aGlzLl9vZmZzZXQwLnAxLHRoaXMuX29mZnNldDEucDAsZW8uQ0xPQ0tXSVNFLHRoaXMuX2Rpc3RhbmNlKSl9LHphLnByb3RvdHlwZS5jbG9zZVJpbmc9ZnVuY3Rpb24oKXt0aGlzLl9zZWdMaXN0LmNsb3NlUmluZygpfSx6YS5wcm90b3R5cGUuaGFzTmFycm93Q29uY2F2ZUFuZ2xlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2hhc05hcnJvd0NvbmNhdmVBbmdsZX0semEucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LHphLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiB6YX0samEuT0ZGU0VUX1NFR01FTlRfU0VQQVJBVElPTl9GQUNUT1IuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuLjAwMX0samEuSU5TSURFX1RVUk5fVkVSVEVYX1NOQVBfRElTVEFOQ0VfRkFDVE9SLmdldD1mdW5jdGlvbigpe3JldHVybi4wMDF9LGphLkNVUlZFX1ZFUlRFWF9TTkFQX0RJU1RBTkNFX0ZBQ1RPUi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMWUtNn0samEuTUFYX0NMT1NJTkdfU0VHX0xFTl9GQUNUT1IuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDgwfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyh6YSxqYSk7dmFyIFVhPWZ1bmN0aW9uKCl7dGhpcy5fZGlzdGFuY2U9MCx0aGlzLl9wcmVjaXNpb25Nb2RlbD1udWxsLHRoaXMuX2J1ZlBhcmFtcz1udWxsO3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXTt0aGlzLl9wcmVjaXNpb25Nb2RlbD10LHRoaXMuX2J1ZlBhcmFtcz1lfTtVYS5wcm90b3R5cGUuZ2V0T2Zmc2V0Q3VydmU9ZnVuY3Rpb24odCxlKXtpZih0aGlzLl9kaXN0YW5jZT1lLDA9PT1lKXJldHVybiBudWxsO3ZhciBuPWU8MCxyPU1hdGguYWJzKGUpLGk9dGhpcy5nZXRTZWdHZW4ocik7dC5sZW5ndGg8PTE/dGhpcy5jb21wdXRlUG9pbnRDdXJ2ZSh0WzBdLGkpOnRoaXMuY29tcHV0ZU9mZnNldEN1cnZlKHQsbixpKTt2YXIgbz1pLmdldENvb3JkaW5hdGVzKCk7cmV0dXJuIG4mJkRvLnJldmVyc2Uobyksb30sVWEucHJvdG90eXBlLmNvbXB1dGVTaW5nbGVTaWRlZEJ1ZmZlckN1cnZlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10aGlzLnNpbXBsaWZ5VG9sZXJhbmNlKHRoaXMuX2Rpc3RhbmNlKTtpZihlKXtuLmFkZFNlZ21lbnRzKHQsITApO3ZhciBpPU9hLnNpbXBsaWZ5KHQsLXIpLG89aS5sZW5ndGgtMTtuLmluaXRTaWRlU2VnbWVudHMoaVtvXSxpW28tMV0sRnMuTEVGVCksbi5hZGRGaXJzdFNlZ21lbnQoKTtmb3IodmFyIHM9by0yO3M+PTA7cy0tKW4uYWRkTmV4dFNlZ21lbnQoaVtzXSwhMCl9ZWxzZXtuLmFkZFNlZ21lbnRzKHQsITEpO3ZhciBhPU9hLnNpbXBsaWZ5KHQsciksdT1hLmxlbmd0aC0xO24uaW5pdFNpZGVTZWdtZW50cyhhWzBdLGFbMV0sRnMuTEVGVCksbi5hZGRGaXJzdFNlZ21lbnQoKTtmb3IodmFyIGM9MjtjPD11O2MrKyluLmFkZE5leHRTZWdtZW50KGFbY10sITApfW4uYWRkTGFzdFNlZ21lbnQoKSxuLmNsb3NlUmluZygpfSxVYS5wcm90b3R5cGUuY29tcHV0ZVJpbmdCdWZmZXJDdXJ2ZT1mdW5jdGlvbih0LGUsbil7dmFyIHI9dGhpcy5zaW1wbGlmeVRvbGVyYW5jZSh0aGlzLl9kaXN0YW5jZSk7ZT09PUZzLlJJR0hUJiYocj0tcik7dmFyIGk9T2Euc2ltcGxpZnkodCxyKSxvPWkubGVuZ3RoLTE7bi5pbml0U2lkZVNlZ21lbnRzKGlbby0xXSxpWzBdLGUpO2Zvcih2YXIgcz0xO3M8PW87cysrKXt2YXIgYT0xIT09cztuLmFkZE5leHRTZWdtZW50KGlbc10sYSl9bi5jbG9zZVJpbmcoKX0sVWEucHJvdG90eXBlLmNvbXB1dGVMaW5lQnVmZmVyQ3VydmU9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLnNpbXBsaWZ5VG9sZXJhbmNlKHRoaXMuX2Rpc3RhbmNlKSxyPU9hLnNpbXBsaWZ5KHQsbiksaT1yLmxlbmd0aC0xO2UuaW5pdFNpZGVTZWdtZW50cyhyWzBdLHJbMV0sRnMuTEVGVCk7Zm9yKHZhciBvPTI7bzw9aTtvKyspZS5hZGROZXh0U2VnbWVudChyW29dLCEwKTtlLmFkZExhc3RTZWdtZW50KCksZS5hZGRMaW5lRW5kQ2FwKHJbaS0xXSxyW2ldKTt2YXIgcz1PYS5zaW1wbGlmeSh0LC1uKSxhPXMubGVuZ3RoLTE7ZS5pbml0U2lkZVNlZ21lbnRzKHNbYV0sc1thLTFdLEZzLkxFRlQpO2Zvcih2YXIgdT1hLTI7dT49MDt1LS0pZS5hZGROZXh0U2VnbWVudChzW3VdLCEwKTtlLmFkZExhc3RTZWdtZW50KCksZS5hZGRMaW5lRW5kQ2FwKHNbMV0sc1swXSksZS5jbG9zZVJpbmcoKX0sVWEucHJvdG90eXBlLmNvbXB1dGVQb2ludEN1cnZlPWZ1bmN0aW9uKHQsZSl7c3dpdGNoKHRoaXMuX2J1ZlBhcmFtcy5nZXRFbmRDYXBTdHlsZSgpKXtjYXNlIEZhLkNBUF9ST1VORDplLmNyZWF0ZUNpcmNsZSh0KTticmVhaztjYXNlIEZhLkNBUF9TUVVBUkU6ZS5jcmVhdGVTcXVhcmUodCl9fSxVYS5wcm90b3R5cGUuZ2V0TGluZUN1cnZlPWZ1bmN0aW9uKHQsZSl7aWYodGhpcy5fZGlzdGFuY2U9ZSxlPDAmJiF0aGlzLl9idWZQYXJhbXMuaXNTaW5nbGVTaWRlZCgpfHwwPT09ZSlyZXR1cm4gbnVsbDt2YXIgbj1NYXRoLmFicyhlKSxyPXRoaXMuZ2V0U2VnR2VuKG4pO2lmKHQubGVuZ3RoPD0xKXRoaXMuY29tcHV0ZVBvaW50Q3VydmUodFswXSxyKTtlbHNlIGlmKHRoaXMuX2J1ZlBhcmFtcy5pc1NpbmdsZVNpZGVkKCkpe3ZhciBpPWU8MDt0aGlzLmNvbXB1dGVTaW5nbGVTaWRlZEJ1ZmZlckN1cnZlKHQsaSxyKX1lbHNlIHRoaXMuY29tcHV0ZUxpbmVCdWZmZXJDdXJ2ZSh0LHIpO3JldHVybiByLmdldENvb3JkaW5hdGVzKCl9LFVhLnByb3RvdHlwZS5nZXRCdWZmZXJQYXJhbWV0ZXJzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2J1ZlBhcmFtc30sVWEucHJvdG90eXBlLnNpbXBsaWZ5VG9sZXJhbmNlPWZ1bmN0aW9uKHQpe3JldHVybiB0KnRoaXMuX2J1ZlBhcmFtcy5nZXRTaW1wbGlmeUZhY3RvcigpfSxVYS5wcm90b3R5cGUuZ2V0UmluZ0N1cnZlPWZ1bmN0aW9uKHQsZSxuKXtpZih0aGlzLl9kaXN0YW5jZT1uLHQubGVuZ3RoPD0yKXJldHVybiB0aGlzLmdldExpbmVDdXJ2ZSh0LG4pO2lmKDA9PT1uKXJldHVybiBVYS5jb3B5Q29vcmRpbmF0ZXModCk7dmFyIHI9dGhpcy5nZXRTZWdHZW4obik7cmV0dXJuIHRoaXMuY29tcHV0ZVJpbmdCdWZmZXJDdXJ2ZSh0LGUsciksci5nZXRDb29yZGluYXRlcygpfSxVYS5wcm90b3R5cGUuY29tcHV0ZU9mZnNldEN1cnZlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10aGlzLnNpbXBsaWZ5VG9sZXJhbmNlKHRoaXMuX2Rpc3RhbmNlKTtpZihlKXt2YXIgaT1PYS5zaW1wbGlmeSh0LC1yKSxvPWkubGVuZ3RoLTE7bi5pbml0U2lkZVNlZ21lbnRzKGlbb10saVtvLTFdLEZzLkxFRlQpLG4uYWRkRmlyc3RTZWdtZW50KCk7Zm9yKHZhciBzPW8tMjtzPj0wO3MtLSluLmFkZE5leHRTZWdtZW50KGlbc10sITApfWVsc2V7dmFyIGE9T2Euc2ltcGxpZnkodCxyKSx1PWEubGVuZ3RoLTE7bi5pbml0U2lkZVNlZ21lbnRzKGFbMF0sYVsxXSxGcy5MRUZUKSxuLmFkZEZpcnN0U2VnbWVudCgpO2Zvcih2YXIgYz0yO2M8PXU7YysrKW4uYWRkTmV4dFNlZ21lbnQoYVtjXSwhMCl9bi5hZGRMYXN0U2VnbWVudCgpfSxVYS5wcm90b3R5cGUuZ2V0U2VnR2VuPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgemEodGhpcy5fcHJlY2lzaW9uTW9kZWwsdGhpcy5fYnVmUGFyYW1zLHQpfSxVYS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sVWEucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFVhfSxVYS5jb3B5Q29vcmRpbmF0ZXM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPW5ldyBBcnJheSh0Lmxlbmd0aCkuZmlsbChudWxsKSxuPTA7bjxlLmxlbmd0aDtuKyspZVtuXT1uZXcgdmkodFtuXSk7cmV0dXJuIGV9O3ZhciBxYT1mdW5jdGlvbigpe3RoaXMuX3N1YmdyYXBocz1udWxsLHRoaXMuX3NlZz1uZXcgYmEsdGhpcy5fY2dhPW5ldyBlbzt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5fc3ViZ3JhcGhzPXR9LFZhPXtEZXB0aFNlZ21lbnQ6e2NvbmZpZ3VyYWJsZTohMH19O3FhLnByb3RvdHlwZS5maW5kU3RhYmJlZFNlZ21lbnRzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKHZhciBlPWFyZ3VtZW50c1swXSxuPW5ldyB4byxyPXRoaXMuX3N1YmdyYXBocy5pdGVyYXRvcigpO3IuaGFzTmV4dCgpOyl7dmFyIGk9ci5uZXh0KCksbz1pLmdldEVudmVsb3BlKCk7ZS55PG8uZ2V0TWluWSgpfHxlLnk+by5nZXRNYXhZKCl8fHQuZmluZFN0YWJiZWRTZWdtZW50cyhlLGkuZ2V0RGlyZWN0ZWRFZGdlcygpLG4pfXJldHVybiBufWlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKWlmKEVpKGFyZ3VtZW50c1syXSx2bykmJmFyZ3VtZW50c1swXWluc3RhbmNlb2YgdmkmJmFyZ3VtZW50c1sxXWluc3RhbmNlb2YgS3MpZm9yKHZhciBzPWFyZ3VtZW50c1swXSxhPWFyZ3VtZW50c1sxXSx1PWFyZ3VtZW50c1syXSxjPWEuZ2V0RWRnZSgpLmdldENvb3JkaW5hdGVzKCksbD0wO2w8Yy5sZW5ndGgtMTtsKyspe2lmKHQuX3NlZy5wMD1jW2xdLHQuX3NlZy5wMT1jW2wrMV0sdC5fc2VnLnAwLnk+dC5fc2VnLnAxLnkmJnQuX3NlZy5yZXZlcnNlKCksIShNYXRoLm1heCh0Ll9zZWcucDAueCx0Ll9zZWcucDEueCk8cy54fHx0Ll9zZWcuaXNIb3Jpem9udGFsKCl8fHMueTx0Ll9zZWcucDAueXx8cy55PnQuX3NlZy5wMS55fHxlby5jb21wdXRlT3JpZW50YXRpb24odC5fc2VnLnAwLHQuX3NlZy5wMSxzKT09PWVvLlJJR0hUKSl7dmFyIGg9YS5nZXREZXB0aChGcy5MRUZUKTt0Ll9zZWcucDAuZXF1YWxzKGNbbF0pfHwoaD1hLmdldERlcHRoKEZzLlJJR0hUKSk7dmFyIGY9bmV3IEdhKHQuX3NlZyxoKTt1LmFkZChmKX19ZWxzZSBpZihFaShhcmd1bWVudHNbMl0sdm8pJiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHZpJiZFaShhcmd1bWVudHNbMV0sdm8pKWZvcih2YXIgcD1hcmd1bWVudHNbMF0sZD1hcmd1bWVudHNbMl0sZz1hcmd1bWVudHNbMV0uaXRlcmF0b3IoKTtnLmhhc05leHQoKTspe3ZhciB5PWcubmV4dCgpOyF5LmlzRm9yd2FyZCgpfHx0LmZpbmRTdGFiYmVkU2VnbWVudHMocCx5LGQpfX0scWEucHJvdG90eXBlLmdldERlcHRoPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZmluZFN0YWJiZWRTZWdtZW50cyh0KTtyZXR1cm4gMD09PWUuc2l6ZSgpPzA6YWEubWluKGUpLl9sZWZ0RGVwdGh9LHFhLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxxYS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gcWF9LFZhLkRlcHRoU2VnbWVudC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gR2F9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHFhLFZhKTt2YXIgR2E9ZnVuY3Rpb24oKXt0aGlzLl91cHdhcmRTZWc9bnVsbCx0aGlzLl9sZWZ0RGVwdGg9bnVsbDt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV07dGhpcy5fdXB3YXJkU2VnPW5ldyBiYSh0KSx0aGlzLl9sZWZ0RGVwdGg9ZX07R2EucHJvdG90eXBlLmNvbXBhcmVUbz1mdW5jdGlvbih0KXt2YXIgZT10O2lmKHRoaXMuX3Vwd2FyZFNlZy5taW5YKCk+PWUuX3Vwd2FyZFNlZy5tYXhYKCkpcmV0dXJuIDE7aWYodGhpcy5fdXB3YXJkU2VnLm1heFgoKTw9ZS5fdXB3YXJkU2VnLm1pblgoKSlyZXR1cm4tMTt2YXIgbj10aGlzLl91cHdhcmRTZWcub3JpZW50YXRpb25JbmRleChlLl91cHdhcmRTZWcpO3JldHVybiAwIT09bnx8MCE9PShuPS0xKmUuX3Vwd2FyZFNlZy5vcmllbnRhdGlvbkluZGV4KHRoaXMuX3Vwd2FyZFNlZykpP246dGhpcy5fdXB3YXJkU2VnLmNvbXBhcmVUbyhlLl91cHdhcmRTZWcpfSxHYS5wcm90b3R5cGUuY29tcGFyZVg9ZnVuY3Rpb24odCxlKXt2YXIgbj10LnAwLmNvbXBhcmVUbyhlLnAwKTtyZXR1cm4gMCE9PW4/bjp0LnAxLmNvbXBhcmVUbyhlLnAxKX0sR2EucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Vwd2FyZFNlZy50b1N0cmluZygpfSxHYS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bZGldfSxHYS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gR2F9O3ZhciBZYT1mdW5jdGlvbih0LGUsbil7dGhpcy5wMD10fHxudWxsLHRoaXMucDE9ZXx8bnVsbCx0aGlzLnAyPW58fG51bGx9O1lhLnByb3RvdHlwZS5hcmVhPWZ1bmN0aW9uKCl7cmV0dXJuIFlhLmFyZWEodGhpcy5wMCx0aGlzLnAxLHRoaXMucDIpfSxZYS5wcm90b3R5cGUuc2lnbmVkQXJlYT1mdW5jdGlvbigpe3JldHVybiBZYS5zaWduZWRBcmVhKHRoaXMucDAsdGhpcy5wMSx0aGlzLnAyKX0sWWEucHJvdG90eXBlLmludGVycG9sYXRlWj1mdW5jdGlvbih0KXtpZihudWxsPT09dCl0aHJvdyBuZXcgaGk7cmV0dXJuIFlhLmludGVycG9sYXRlWih0LHRoaXMucDAsdGhpcy5wMSx0aGlzLnAyKX0sWWEucHJvdG90eXBlLmxvbmdlc3RTaWRlTGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIFlhLmxvbmdlc3RTaWRlTGVuZ3RoKHRoaXMucDAsdGhpcy5wMSx0aGlzLnAyKX0sWWEucHJvdG90eXBlLmlzQWN1dGU9ZnVuY3Rpb24oKXtyZXR1cm4gWWEuaXNBY3V0ZSh0aGlzLnAwLHRoaXMucDEsdGhpcy5wMil9LFlhLnByb3RvdHlwZS5jaXJjdW1jZW50cmU9ZnVuY3Rpb24oKXtyZXR1cm4gWWEuY2lyY3VtY2VudHJlKHRoaXMucDAsdGhpcy5wMSx0aGlzLnAyKX0sWWEucHJvdG90eXBlLmFyZWEzRD1mdW5jdGlvbigpe3JldHVybiBZYS5hcmVhM0QodGhpcy5wMCx0aGlzLnAxLHRoaXMucDIpfSxZYS5wcm90b3R5cGUuY2VudHJvaWQ9ZnVuY3Rpb24oKXtyZXR1cm4gWWEuY2VudHJvaWQodGhpcy5wMCx0aGlzLnAxLHRoaXMucDIpfSxZYS5wcm90b3R5cGUuaW5DZW50cmU9ZnVuY3Rpb24oKXtyZXR1cm4gWWEuaW5DZW50cmUodGhpcy5wMCx0aGlzLnAxLHRoaXMucDIpfSxZYS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sWWEucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFlhfSxZYS5hcmVhPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gTWF0aC5hYnMoKChuLngtdC54KSooZS55LXQueSktKGUueC10LngpKihuLnktdC55KSkvMil9LFlhLnNpZ25lZEFyZWE9ZnVuY3Rpb24odCxlLG4pe3JldHVybigobi54LXQueCkqKGUueS10LnkpLShlLngtdC54KSoobi55LXQueSkpLzJ9LFlhLmRldD1mdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gdCpyLWUqbn0sWWEuaW50ZXJwb2xhdGVaPWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPWUueCxvPWUueSxzPW4ueC1pLGE9ci54LWksdT1uLnktbyxjPXIueS1vLGw9cypjLWEqdSxoPXQueC1pLGY9dC55LW8scD0oYypoLWEqZikvbCxkPSgtdSpoK3MqZikvbDtyZXR1cm4gZS56K3AqKG4uei1lLnopK2QqKHIuei1lLnopfSxZYS5sb25nZXN0U2lkZUxlbmd0aD1mdW5jdGlvbih0LGUsbil7dmFyIHI9dC5kaXN0YW5jZShlKSxpPWUuZGlzdGFuY2Uobiksbz1uLmRpc3RhbmNlKHQpLHM9cjtyZXR1cm4gaT5zJiYocz1pKSxvPnMmJihzPW8pLHN9LFlhLmlzQWN1dGU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiEoIUJhLmlzQWN1dGUodCxlLG4pfHwhQmEuaXNBY3V0ZShlLG4sdCl8fCFCYS5pc0FjdXRlKG4sdCxlKSl9LFlhLmNpcmN1bWNlbnRyZT1mdW5jdGlvbih0LGUsbil7dmFyIHI9bi54LGk9bi55LG89dC54LXIscz10LnktaSxhPWUueC1yLHU9ZS55LWksYz0yKllhLmRldChvLHMsYSx1KSxsPVlhLmRldChzLG8qbytzKnMsdSxhKmErdSp1KSxoPVlhLmRldChvLG8qbytzKnMsYSxhKmErdSp1KTtyZXR1cm4gbmV3IHZpKHItbC9jLGkraC9jKX0sWWEucGVycGVuZGljdWxhckJpc2VjdG9yPWZ1bmN0aW9uKHQsZSl7dmFyIG49ZS54LXQueCxyPWUueS10LnksaT1uZXcgemkodC54K24vMix0Lnkrci8yLDEpLG89bmV3IHppKHQueC1yK24vMix0LnkrbityLzIsMSk7cmV0dXJuIG5ldyB6aShpLG8pfSxZYS5hbmdsZUJpc2VjdG9yPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1lLmRpc3RhbmNlKHQpLGk9ci8ocitlLmRpc3RhbmNlKG4pKSxvPW4ueC10Lngscz1uLnktdC55O3JldHVybiBuZXcgdmkodC54K2kqbyx0LnkraSpzKX0sWWEuYXJlYTNEPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1lLngtdC54LGk9ZS55LXQueSxvPWUuei10Lnoscz1uLngtdC54LGE9bi55LXQueSx1PW4uei10LnosYz1pKnUtbyphLGw9bypzLXIqdSxoPXIqYS1pKnMsZj1jKmMrbCpsK2gqaDtyZXR1cm4gTWF0aC5zcXJ0KGYpLzJ9LFlhLmNlbnRyb2lkPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj0odC54K2UueCtuLngpLzMsaT0odC55K2UueStuLnkpLzM7cmV0dXJuIG5ldyB2aShyLGkpfSxZYS5pbkNlbnRyZT1mdW5jdGlvbih0LGUsbil7dmFyIHI9ZS5kaXN0YW5jZShuKSxpPXQuZGlzdGFuY2Uobiksbz10LmRpc3RhbmNlKGUpLHM9citpK28sYT0ocip0LngraSplLngrbypuLngpL3MsdT0ocip0LnkraSplLnkrbypuLnkpL3M7cmV0dXJuIG5ldyB2aShhLHUpfTt2YXIgWGE9ZnVuY3Rpb24oKXt0aGlzLl9pbnB1dEdlb209bnVsbCx0aGlzLl9kaXN0YW5jZT1udWxsLHRoaXMuX2N1cnZlQnVpbGRlcj1udWxsLHRoaXMuX2N1cnZlTGlzdD1uZXcgeG87dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdLG49YXJndW1lbnRzWzJdO3RoaXMuX2lucHV0R2VvbT10LHRoaXMuX2Rpc3RhbmNlPWUsdGhpcy5fY3VydmVCdWlsZGVyPW59O1hhLnByb3RvdHlwZS5hZGRQb2ludD1mdW5jdGlvbih0KXtpZih0aGlzLl9kaXN0YW5jZTw9MClyZXR1cm4gbnVsbDt2YXIgZT10LmdldENvb3JkaW5hdGVzKCksbj10aGlzLl9jdXJ2ZUJ1aWxkZXIuZ2V0TGluZUN1cnZlKGUsdGhpcy5fZGlzdGFuY2UpO3RoaXMuYWRkQ3VydmUobixiaS5FWFRFUklPUixiaS5JTlRFUklPUil9LFhhLnByb3RvdHlwZS5hZGRQb2x5Z29uPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj10aGlzLl9kaXN0YW5jZSxyPUZzLkxFRlQ7dGhpcy5fZGlzdGFuY2U8MCYmKG49LXRoaXMuX2Rpc3RhbmNlLHI9RnMuUklHSFQpO3ZhciBpPXQuZ2V0RXh0ZXJpb3JSaW5nKCksbz1Eby5yZW1vdmVSZXBlYXRlZFBvaW50cyhpLmdldENvb3JkaW5hdGVzKCkpO2lmKHRoaXMuX2Rpc3RhbmNlPDAmJnRoaXMuaXNFcm9kZWRDb21wbGV0ZWx5KGksdGhpcy5fZGlzdGFuY2UpfHx0aGlzLl9kaXN0YW5jZTw9MCYmby5sZW5ndGg8MylyZXR1cm4gbnVsbDt0aGlzLmFkZFBvbHlnb25SaW5nKG8sbixyLGJpLkVYVEVSSU9SLGJpLklOVEVSSU9SKTtmb3IodmFyIHM9MDtzPHQuZ2V0TnVtSW50ZXJpb3JSaW5nKCk7cysrKXt2YXIgYT10LmdldEludGVyaW9yUmluZ04ocyksdT1Eby5yZW1vdmVSZXBlYXRlZFBvaW50cyhhLmdldENvb3JkaW5hdGVzKCkpO2UuX2Rpc3RhbmNlPjAmJmUuaXNFcm9kZWRDb21wbGV0ZWx5KGEsLWUuX2Rpc3RhbmNlKXx8ZS5hZGRQb2x5Z29uUmluZyh1LG4sRnMub3Bwb3NpdGUociksYmkuSU5URVJJT1IsYmkuRVhURVJJT1IpfX0sWGEucHJvdG90eXBlLmlzVHJpYW5nbGVFcm9kZWRDb21wbGV0ZWx5PWZ1bmN0aW9uKHQsZSl7dmFyIG49bmV3IFlhKHRbMF0sdFsxXSx0WzJdKSxyPW4uaW5DZW50cmUoKTtyZXR1cm4gZW8uZGlzdGFuY2VQb2ludExpbmUocixuLnAwLG4ucDEpPE1hdGguYWJzKGUpfSxYYS5wcm90b3R5cGUuYWRkTGluZVN0cmluZz1mdW5jdGlvbih0KXtpZih0aGlzLl9kaXN0YW5jZTw9MCYmIXRoaXMuX2N1cnZlQnVpbGRlci5nZXRCdWZmZXJQYXJhbWV0ZXJzKCkuaXNTaW5nbGVTaWRlZCgpKXJldHVybiBudWxsO3ZhciBlPURvLnJlbW92ZVJlcGVhdGVkUG9pbnRzKHQuZ2V0Q29vcmRpbmF0ZXMoKSksbj10aGlzLl9jdXJ2ZUJ1aWxkZXIuZ2V0TGluZUN1cnZlKGUsdGhpcy5fZGlzdGFuY2UpO3RoaXMuYWRkQ3VydmUobixiaS5FWFRFUklPUixiaS5JTlRFUklPUil9LFhhLnByb3RvdHlwZS5hZGRDdXJ2ZT1mdW5jdGlvbih0LGUsbil7aWYobnVsbD09PXR8fHQubGVuZ3RoPDIpcmV0dXJuIG51bGw7dmFyIHI9bmV3IHdhKHQsbmV3IGpzKDAsYmkuQk9VTkRBUlksZSxuKSk7dGhpcy5fY3VydmVMaXN0LmFkZChyKX0sWGEucHJvdG90eXBlLmdldEN1cnZlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmFkZCh0aGlzLl9pbnB1dEdlb20pLHRoaXMuX2N1cnZlTGlzdH0sWGEucHJvdG90eXBlLmFkZFBvbHlnb25SaW5nPWZ1bmN0aW9uKHQsZSxuLHIsaSl7aWYoMD09PWUmJnQubGVuZ3RoPHBzLk1JTklNVU1fVkFMSURfU0laRSlyZXR1cm4gbnVsbDt2YXIgbz1yLHM9aTt0Lmxlbmd0aD49cHMuTUlOSU1VTV9WQUxJRF9TSVpFJiZlby5pc0NDVyh0KSYmKG89aSxzPXIsbj1Gcy5vcHBvc2l0ZShuKSk7dmFyIGE9dGhpcy5fY3VydmVCdWlsZGVyLmdldFJpbmdDdXJ2ZSh0LG4sZSk7dGhpcy5hZGRDdXJ2ZShhLG8scyl9LFhhLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCl7aWYodC5pc0VtcHR5KCkpcmV0dXJuIG51bGw7dCBpbnN0YW5jZW9mIGhzP3RoaXMuYWRkUG9seWdvbih0KTp0IGluc3RhbmNlb2YgYXM/dGhpcy5hZGRMaW5lU3RyaW5nKHQpOnQgaW5zdGFuY2VvZiBjcz90aGlzLmFkZFBvaW50KHQpOih0IGluc3RhbmNlb2YgZnN8fHQgaW5zdGFuY2VvZiBab3x8dCBpbnN0YW5jZW9mIGRzfHx0IGluc3RhbmNlb2YgSG8pJiZ0aGlzLmFkZENvbGxlY3Rpb24odCl9LFhhLnByb3RvdHlwZS5pc0Vyb2RlZENvbXBsZXRlbHk9ZnVuY3Rpb24odCxlKXt2YXIgbj10LmdldENvb3JkaW5hdGVzKCk7aWYobi5sZW5ndGg8NClyZXR1cm4gZTwwO2lmKDQ9PT1uLmxlbmd0aClyZXR1cm4gdGhpcy5pc1RyaWFuZ2xlRXJvZGVkQ29tcGxldGVseShuLGUpO3ZhciByPXQuZ2V0RW52ZWxvcGVJbnRlcm5hbCgpLGk9TWF0aC5taW4oci5nZXRIZWlnaHQoKSxyLmdldFdpZHRoKCkpO3JldHVybiBlPDAmJjIqTWF0aC5hYnMoZSk+aX0sWGEucHJvdG90eXBlLmFkZENvbGxlY3Rpb249ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTA7ZTx0LmdldE51bUdlb21ldHJpZXMoKTtlKyspe3ZhciBuPXQuZ2V0R2VvbWV0cnlOKGUpO3RoaXMuYWRkKG4pfX0sWGEucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LFhhLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBYYX07dmFyIFdhPWZ1bmN0aW9uKCl7fTtXYS5wcm90b3R5cGUubG9jYXRlPWZ1bmN0aW9uKHQpe30sV2EucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LFdhLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBXYX07dmFyIEhhPWZ1bmN0aW9uKCl7dGhpcy5fcGFyZW50PW51bGwsdGhpcy5fYXRTdGFydD1udWxsLHRoaXMuX21heD1udWxsLHRoaXMuX2luZGV4PW51bGwsdGhpcy5fc3ViY29sbGVjdGlvbkl0ZXJhdG9yPW51bGw7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuX3BhcmVudD10LHRoaXMuX2F0U3RhcnQ9ITAsdGhpcy5faW5kZXg9MCx0aGlzLl9tYXg9dC5nZXROdW1HZW9tZXRyaWVzKCl9O0hhLnByb3RvdHlwZS5uZXh0PWZ1bmN0aW9uKCl7aWYodGhpcy5fYXRTdGFydClyZXR1cm4gdGhpcy5fYXRTdGFydD0hMSxIYS5pc0F0b21pYyh0aGlzLl9wYXJlbnQpJiZ0aGlzLl9pbmRleCsrLHRoaXMuX3BhcmVudDtpZihudWxsIT09dGhpcy5fc3ViY29sbGVjdGlvbkl0ZXJhdG9yKXtpZih0aGlzLl9zdWJjb2xsZWN0aW9uSXRlcmF0b3IuaGFzTmV4dCgpKXJldHVybiB0aGlzLl9zdWJjb2xsZWN0aW9uSXRlcmF0b3IubmV4dCgpO3RoaXMuX3N1YmNvbGxlY3Rpb25JdGVyYXRvcj1udWxsfWlmKHRoaXMuX2luZGV4Pj10aGlzLl9tYXgpdGhyb3cgbmV3IF9vO3ZhciB0PXRoaXMuX3BhcmVudC5nZXRHZW9tZXRyeU4odGhpcy5faW5kZXgrKyk7cmV0dXJuIHQgaW5zdGFuY2VvZiBIbz8odGhpcy5fc3ViY29sbGVjdGlvbkl0ZXJhdG9yPW5ldyBIYSh0KSx0aGlzLl9zdWJjb2xsZWN0aW9uSXRlcmF0b3IubmV4dCgpKTp0fSxIYS5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpfSxIYS5wcm90b3R5cGUuaGFzTmV4dD1mdW5jdGlvbigpe2lmKHRoaXMuX2F0U3RhcnQpcmV0dXJuITA7aWYobnVsbCE9PXRoaXMuX3N1YmNvbGxlY3Rpb25JdGVyYXRvcil7aWYodGhpcy5fc3ViY29sbGVjdGlvbkl0ZXJhdG9yLmhhc05leHQoKSlyZXR1cm4hMDt0aGlzLl9zdWJjb2xsZWN0aW9uSXRlcmF0b3I9bnVsbH1yZXR1cm4hKHRoaXMuX2luZGV4Pj10aGlzLl9tYXgpfSxIYS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bbW9dfSxIYS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gSGF9LEhhLmlzQXRvbWljPWZ1bmN0aW9uKHQpe3JldHVybiEodCBpbnN0YW5jZW9mIEhvKX07dmFyIFphPWZ1bmN0aW9uKCl7dGhpcy5fZ2VvbT1udWxsO3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLl9nZW9tPXR9O1phLnByb3RvdHlwZS5sb2NhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIFphLmxvY2F0ZSh0LHRoaXMuX2dlb20pfSxaYS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bV2FdfSxaYS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gWmF9LFphLmlzUG9pbnRJblJpbmc9ZnVuY3Rpb24odCxlKXtyZXR1cm4hIWUuZ2V0RW52ZWxvcGVJbnRlcm5hbCgpLmludGVyc2VjdHModCkmJmVvLmlzUG9pbnRJblJpbmcodCxlLmdldENvb3JkaW5hdGVzKCkpfSxaYS5jb250YWluc1BvaW50SW5Qb2x5Z29uPWZ1bmN0aW9uKHQsZSl7aWYoZS5pc0VtcHR5KCkpcmV0dXJuITE7dmFyIG49ZS5nZXRFeHRlcmlvclJpbmcoKTtpZighWmEuaXNQb2ludEluUmluZyh0LG4pKXJldHVybiExO2Zvcih2YXIgcj0wO3I8ZS5nZXROdW1JbnRlcmlvclJpbmcoKTtyKyspe3ZhciBpPWUuZ2V0SW50ZXJpb3JSaW5nTihyKTtpZihaYS5pc1BvaW50SW5SaW5nKHQsaSkpcmV0dXJuITF9cmV0dXJuITB9LFphLmNvbnRhaW5zUG9pbnQ9ZnVuY3Rpb24odCxlKXtpZihlIGluc3RhbmNlb2YgaHMpcmV0dXJuIFphLmNvbnRhaW5zUG9pbnRJblBvbHlnb24odCxlKTtpZihlIGluc3RhbmNlb2YgSG8pZm9yKHZhciBuPW5ldyBIYShlKTtuLmhhc05leHQoKTspe3ZhciByPW4ubmV4dCgpO2lmKHIhPT1lJiZaYS5jb250YWluc1BvaW50KHQscikpcmV0dXJuITB9cmV0dXJuITF9LFphLmxvY2F0ZT1mdW5jdGlvbih0LGUpe3JldHVybiBlLmlzRW1wdHkoKT9iaS5FWFRFUklPUjpaYS5jb250YWluc1BvaW50KHQsZSk/YmkuSU5URVJJT1I6YmkuRVhURVJJT1J9O3ZhciBLYT1mdW5jdGlvbigpe3RoaXMuX2VkZ2VNYXA9bmV3IGtvLHRoaXMuX2VkZ2VMaXN0PW51bGwsdGhpcy5fcHRJbkFyZWFMb2NhdGlvbj1bYmkuTk9ORSxiaS5OT05FXX07S2EucHJvdG90eXBlLmdldE5leHRDVz1mdW5jdGlvbih0KXt0aGlzLmdldEVkZ2VzKCk7dmFyIGU9dGhpcy5fZWRnZUxpc3QuaW5kZXhPZih0KSxuPWUtMTtyZXR1cm4gMD09PWUmJihuPXRoaXMuX2VkZ2VMaXN0LnNpemUoKS0xKSx0aGlzLl9lZGdlTGlzdC5nZXQobil9LEthLnByb3RvdHlwZS5wcm9wYWdhdGVTaWRlTGFiZWxzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1iaS5OT05FLG49dGhpcy5pdGVyYXRvcigpO24uaGFzTmV4dCgpOyl7dmFyIHI9bi5uZXh0KCkuZ2V0TGFiZWwoKTtyLmlzQXJlYSh0KSYmci5nZXRMb2NhdGlvbih0LEZzLkxFRlQpIT09YmkuTk9ORSYmKGU9ci5nZXRMb2NhdGlvbih0LEZzLkxFRlQpKX1pZihlPT09YmkuTk9ORSlyZXR1cm4gbnVsbDtmb3IodmFyIGk9ZSxvPXRoaXMuaXRlcmF0b3IoKTtvLmhhc05leHQoKTspe3ZhciBzPW8ubmV4dCgpLGE9cy5nZXRMYWJlbCgpO2lmKGEuZ2V0TG9jYXRpb24odCxGcy5PTik9PT1iaS5OT05FJiZhLnNldExvY2F0aW9uKHQsRnMuT04saSksYS5pc0FyZWEodCkpe3ZhciB1PWEuZ2V0TG9jYXRpb24odCxGcy5MRUZUKSxjPWEuZ2V0TG9jYXRpb24odCxGcy5SSUdIVCk7aWYoYyE9PWJpLk5PTkUpe2lmKGMhPT1pKXRocm93IG5ldyBScygic2lkZSBsb2NhdGlvbiBjb25mbGljdCIscy5nZXRDb29yZGluYXRlKCkpO3U9PT1iaS5OT05FJiZaaS5zaG91bGROZXZlclJlYWNoSGVyZSgiZm91bmQgc2luZ2xlIG51bGwgc2lkZSAoYXQgIitzLmdldENvb3JkaW5hdGUoKSsiKSIpLGk9dX1lbHNlIFppLmlzVHJ1ZShhLmdldExvY2F0aW9uKHQsRnMuTEVGVCk9PT1iaS5OT05FLCJmb3VuZCBzaW5nbGUgbnVsbCBzaWRlIiksYS5zZXRMb2NhdGlvbih0LEZzLlJJR0hULGkpLGEuc2V0TG9jYXRpb24odCxGcy5MRUZULGkpfX19LEthLnByb3RvdHlwZS5nZXRDb29yZGluYXRlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5pdGVyYXRvcigpO3JldHVybiB0Lmhhc05leHQoKT90Lm5leHQoKS5nZXRDb29yZGluYXRlKCk6bnVsbH0sS2EucHJvdG90eXBlLnByaW50PWZ1bmN0aW9uKHQpe2tpLm91dC5wcmludGxuKCJFZGdlRW5kU3RhcjogICAiK3RoaXMuZ2V0Q29vcmRpbmF0ZSgpKTtmb3IodmFyIGU9dGhpcy5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7ZS5uZXh0KCkucHJpbnQodCl9fSxLYS5wcm90b3R5cGUuaXNBcmVhTGFiZWxzQ29uc2lzdGVudD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jb21wdXRlRWRnZUVuZExhYmVscyh0LmdldEJvdW5kYXJ5Tm9kZVJ1bGUoKSksdGhpcy5jaGVja0FyZWFMYWJlbHNDb25zaXN0ZW50KDApfSxLYS5wcm90b3R5cGUuY2hlY2tBcmVhTGFiZWxzQ29uc2lzdGVudD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldEVkZ2VzKCk7aWYoZS5zaXplKCk8PTApcmV0dXJuITA7dmFyIG49ZS5zaXplKCktMSxyPWUuZ2V0KG4pLmdldExhYmVsKCkuZ2V0TG9jYXRpb24odCxGcy5MRUZUKTtaaS5pc1RydWUociE9PWJpLk5PTkUsIkZvdW5kIHVubGFiZWxsZWQgYXJlYSBlZGdlIik7Zm9yKHZhciBpPXIsbz10aGlzLml0ZXJhdG9yKCk7by5oYXNOZXh0KCk7KXt2YXIgcz1vLm5leHQoKS5nZXRMYWJlbCgpO1ppLmlzVHJ1ZShzLmlzQXJlYSh0KSwiRm91bmQgbm9uLWFyZWEgZWRnZSIpO3ZhciBhPXMuZ2V0TG9jYXRpb24odCxGcy5MRUZUKSx1PXMuZ2V0TG9jYXRpb24odCxGcy5SSUdIVCk7aWYoYT09PXV8fHUhPT1pKXJldHVybiExO2k9YX1yZXR1cm4hMH0sS2EucHJvdG90eXBlLmZpbmRJbmRleD1mdW5jdGlvbih0KXt0aGlzLml0ZXJhdG9yKCk7Zm9yKHZhciBlPTA7ZTx0aGlzLl9lZGdlTGlzdC5zaXplKCk7ZSsrKXtpZih0aGlzLl9lZGdlTGlzdC5nZXQoZSk9PT10KXJldHVybiBlfXJldHVybi0xfSxLYS5wcm90b3R5cGUuaXRlcmF0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRFZGdlcygpLml0ZXJhdG9yKCl9LEthLnByb3RvdHlwZS5nZXRFZGdlcz1mdW5jdGlvbigpe3JldHVybiBudWxsPT09dGhpcy5fZWRnZUxpc3QmJih0aGlzLl9lZGdlTGlzdD1uZXcgeG8odGhpcy5fZWRnZU1hcC52YWx1ZXMoKSkpLHRoaXMuX2VkZ2VMaXN0fSxLYS5wcm90b3R5cGUuZ2V0TG9jYXRpb249ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0aGlzLl9wdEluQXJlYUxvY2F0aW9uW3RdPT09YmkuTk9ORSYmKHRoaXMuX3B0SW5BcmVhTG9jYXRpb25bdF09WmEubG9jYXRlKGUsblt0XS5nZXRHZW9tZXRyeSgpKSksdGhpcy5fcHRJbkFyZWFMb2NhdGlvblt0XX0sS2EucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IEFpO3QuYXBwZW5kKCJFZGdlRW5kU3RhcjogICAiK3RoaXMuZ2V0Q29vcmRpbmF0ZSgpKSx0LmFwcGVuZCgiXG4iKTtmb3IodmFyIGU9dGhpcy5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7dmFyIG49ZS5uZXh0KCk7dC5hcHBlbmQobiksdC5hcHBlbmQoIlxuIil9cmV0dXJuIHQudG9TdHJpbmcoKX0sS2EucHJvdG90eXBlLmNvbXB1dGVFZGdlRW5kTGFiZWxzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXtlLm5leHQoKS5jb21wdXRlTGFiZWwodCl9fSxLYS5wcm90b3R5cGUuY29tcHV0ZUxhYmVsbGluZz1mdW5jdGlvbih0KXt0aGlzLmNvbXB1dGVFZGdlRW5kTGFiZWxzKHRbMF0uZ2V0Qm91bmRhcnlOb2RlUnVsZSgpKSx0aGlzLnByb3BhZ2F0ZVNpZGVMYWJlbHMoMCksdGhpcy5wcm9wYWdhdGVTaWRlTGFiZWxzKDEpO2Zvcih2YXIgZT1bITEsITFdLG49dGhpcy5pdGVyYXRvcigpO24uaGFzTmV4dCgpOylmb3IodmFyIHI9bi5uZXh0KCkuZ2V0TGFiZWwoKSxpPTA7aTwyO2krKylyLmlzTGluZShpKSYmci5nZXRMb2NhdGlvbihpKT09PWJpLkJPVU5EQVJZJiYoZVtpXT0hMCk7Zm9yKHZhciBvPXRoaXMuaXRlcmF0b3IoKTtvLmhhc05leHQoKTspZm9yKHZhciBzPW8ubmV4dCgpLGE9cy5nZXRMYWJlbCgpLHU9MDt1PDI7dSsrKWlmKGEuaXNBbnlOdWxsKHUpKXt2YXIgYz1iaS5OT05FO2lmKGVbdV0pYz1iaS5FWFRFUklPUjtlbHNle3ZhciBsPXMuZ2V0Q29vcmRpbmF0ZSgpO2M9dGhpcy5nZXRMb2NhdGlvbih1LGwsdCl9YS5zZXRBbGxMb2NhdGlvbnNJZk51bGwodSxjKX19LEthLnByb3RvdHlwZS5nZXREZWdyZWU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZWRnZU1hcC5zaXplKCl9LEthLnByb3RvdHlwZS5pbnNlcnRFZGdlRW5kPWZ1bmN0aW9uKHQsZSl7dGhpcy5fZWRnZU1hcC5wdXQodCxlKSx0aGlzLl9lZGdlTGlzdD1udWxsfSxLYS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sS2EucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIEthfTt2YXIgSmE9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3QuY2FsbCh0aGlzKSx0aGlzLl9yZXN1bHRBcmVhRWRnZUxpc3Q9bnVsbCx0aGlzLl9sYWJlbD1udWxsLHRoaXMuX1NDQU5OSU5HX0ZPUl9JTkNPTUlORz0xLHRoaXMuX0xJTktJTkdfVE9fT1VUR09JTkc9Mn1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUubGlua1Jlc3VsdERpcmVjdGVkRWRnZXM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuZ2V0UmVzdWx0QXJlYUVkZ2VzKCk7Zm9yKHZhciBlPW51bGwsbj1udWxsLHI9dGhpcy5fU0NBTk5JTkdfRk9SX0lOQ09NSU5HLGk9MDtpPHRoaXMuX3Jlc3VsdEFyZWFFZGdlTGlzdC5zaXplKCk7aSsrKXt2YXIgbz10Ll9yZXN1bHRBcmVhRWRnZUxpc3QuZ2V0KGkpLHM9by5nZXRTeW0oKTtpZihvLmdldExhYmVsKCkuaXNBcmVhKCkpc3dpdGNoKG51bGw9PT1lJiZvLmlzSW5SZXN1bHQoKSYmKGU9bykscil7Y2FzZSB0Ll9TQ0FOTklOR19GT1JfSU5DT01JTkc6aWYoIXMuaXNJblJlc3VsdCgpKWNvbnRpbnVlO249cyxyPXQuX0xJTktJTkdfVE9fT1VUR09JTkc7YnJlYWs7Y2FzZSB0Ll9MSU5LSU5HX1RPX09VVEdPSU5HOmlmKCFvLmlzSW5SZXN1bHQoKSljb250aW51ZTtuLnNldE5leHQobykscj10Ll9TQ0FOTklOR19GT1JfSU5DT01JTkd9fWlmKHI9PT10aGlzLl9MSU5LSU5HX1RPX09VVEdPSU5HKXtpZihudWxsPT09ZSl0aHJvdyBuZXcgUnMoIm5vIG91dGdvaW5nIGRpckVkZ2UgZm91bmQiLHRoaXMuZ2V0Q29vcmRpbmF0ZSgpKTtaaS5pc1RydWUoZS5pc0luUmVzdWx0KCksInVuYWJsZSB0byBsaW5rIGxhc3QgaW5jb21pbmcgZGlyRWRnZSIpLG4uc2V0TmV4dChlKX19LGUucHJvdG90eXBlLmluc2VydD1mdW5jdGlvbih0KXt2YXIgZT10O3RoaXMuaW5zZXJ0RWRnZUVuZChlLGUpfSxlLnByb3RvdHlwZS5nZXRSaWdodG1vc3RFZGdlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXRFZGdlcygpLGU9dC5zaXplKCk7aWYoZTwxKXJldHVybiBudWxsO3ZhciBuPXQuZ2V0KDApO2lmKDE9PT1lKXJldHVybiBuO3ZhciByPXQuZ2V0KGUtMSksaT1uLmdldFF1YWRyYW50KCksbz1yLmdldFF1YWRyYW50KCk7cmV0dXJuIFdzLmlzTm9ydGhlcm4oaSkmJldzLmlzTm9ydGhlcm4obyk/bjpXcy5pc05vcnRoZXJuKGkpfHxXcy5pc05vcnRoZXJuKG8pPzAhPT1uLmdldER5KCk/bjowIT09ci5nZXREeSgpP3I6KFppLnNob3VsZE5ldmVyUmVhY2hIZXJlKCJmb3VuZCB0d28gaG9yaXpvbnRhbCBlZGdlcyBpbmNpZGVudCBvbiBub2RlIiksbnVsbCk6cn0sZS5wcm90b3R5cGUucHJpbnQ9ZnVuY3Rpb24odCl7a2kub3V0LnByaW50bG4oIkRpcmVjdGVkRWRnZVN0YXI6ICIrdGhpcy5nZXRDb29yZGluYXRlKCkpO2Zvcih2YXIgZT10aGlzLml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXt2YXIgbj1lLm5leHQoKTt0LnByaW50KCJvdXQgIiksbi5wcmludCh0KSx0LnByaW50bG4oKSx0LnByaW50KCJpbiAiKSxuLmdldFN5bSgpLnByaW50KHQpLHQucHJpbnRsbigpfX0sZS5wcm90b3R5cGUuZ2V0UmVzdWx0QXJlYUVkZ2VzPWZ1bmN0aW9uKCl7aWYobnVsbCE9PXRoaXMuX3Jlc3VsdEFyZWFFZGdlTGlzdClyZXR1cm4gdGhpcy5fcmVzdWx0QXJlYUVkZ2VMaXN0O3RoaXMuX3Jlc3VsdEFyZWFFZGdlTGlzdD1uZXcgeG87Zm9yKHZhciB0PXRoaXMuaXRlcmF0b3IoKTt0Lmhhc05leHQoKTspe3ZhciBlPXQubmV4dCgpOyhlLmlzSW5SZXN1bHQoKXx8ZS5nZXRTeW0oKS5pc0luUmVzdWx0KCkpJiZ0aGlzLl9yZXN1bHRBcmVhRWRnZUxpc3QuYWRkKGUpfXJldHVybiB0aGlzLl9yZXN1bHRBcmVhRWRnZUxpc3R9LGUucHJvdG90eXBlLnVwZGF0ZUxhYmVsbGluZz1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7dmFyIG49ZS5uZXh0KCkuZ2V0TGFiZWwoKTtuLnNldEFsbExvY2F0aW9uc0lmTnVsbCgwLHQuZ2V0TG9jYXRpb24oMCkpLG4uc2V0QWxsTG9jYXRpb25zSWZOdWxsKDEsdC5nZXRMb2NhdGlvbigxKSl9fSxlLnByb3RvdHlwZS5saW5rQWxsRGlyZWN0ZWRFZGdlcz1mdW5jdGlvbigpe3RoaXMuZ2V0RWRnZXMoKTtmb3IodmFyIHQ9bnVsbCxlPW51bGwsbj10aGlzLl9lZGdlTGlzdC5zaXplKCktMTtuPj0wO24tLSl7dmFyIHI9dGhpcy5fZWRnZUxpc3QuZ2V0KG4pLGk9ci5nZXRTeW0oKTtudWxsPT09ZSYmKGU9aSksbnVsbCE9PXQmJmkuc2V0TmV4dCh0KSx0PXJ9ZS5zZXROZXh0KHQpfSxlLnByb3RvdHlwZS5jb21wdXRlRGVwdGhzPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXSxlPXRoaXMuZmluZEluZGV4KHQpLG49dC5nZXREZXB0aChGcy5MRUZUKSxyPXQuZ2V0RGVwdGgoRnMuUklHSFQpLGk9dGhpcy5jb21wdXRlRGVwdGhzKGUrMSx0aGlzLl9lZGdlTGlzdC5zaXplKCksbik7aWYodGhpcy5jb21wdXRlRGVwdGhzKDAsZSxpKSE9PXIpdGhyb3cgbmV3IFJzKCJkZXB0aCBtaXNtYXRjaCBhdCAiK3QuZ2V0Q29vcmRpbmF0ZSgpKX1lbHNlIGlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXtmb3IodmFyIG89YXJndW1lbnRzWzFdLHM9YXJndW1lbnRzWzJdLGE9YXJndW1lbnRzWzBdO2E8bzthKyspe3ZhciB1PXRoaXMuX2VkZ2VMaXN0LmdldChhKTt1LnNldEVkZ2VEZXB0aHMoRnMuUklHSFQscykscz11LmdldERlcHRoKEZzLkxFRlQpfXJldHVybiBzfX0sZS5wcm90b3R5cGUubWVyZ2VTeW1MYWJlbHM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5pdGVyYXRvcigpO3QuaGFzTmV4dCgpOyl7dmFyIGU9dC5uZXh0KCk7ZS5nZXRMYWJlbCgpLm1lcmdlKGUuZ2V0U3ltKCkuZ2V0TGFiZWwoKSl9fSxlLnByb3RvdHlwZS5saW5rTWluaW1hbERpcmVjdGVkRWRnZXM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMsbj1udWxsLHI9bnVsbCxpPXRoaXMuX1NDQU5OSU5HX0ZPUl9JTkNPTUlORyxvPXRoaXMuX3Jlc3VsdEFyZWFFZGdlTGlzdC5zaXplKCktMTtvPj0wO28tLSl7dmFyIHM9ZS5fcmVzdWx0QXJlYUVkZ2VMaXN0LmdldChvKSxhPXMuZ2V0U3ltKCk7c3dpdGNoKG51bGw9PT1uJiZzLmdldEVkZ2VSaW5nKCk9PT10JiYobj1zKSxpKXtjYXNlIGUuX1NDQU5OSU5HX0ZPUl9JTkNPTUlORzppZihhLmdldEVkZ2VSaW5nKCkhPT10KWNvbnRpbnVlO3I9YSxpPWUuX0xJTktJTkdfVE9fT1VUR09JTkc7YnJlYWs7Y2FzZSBlLl9MSU5LSU5HX1RPX09VVEdPSU5HOmlmKHMuZ2V0RWRnZVJpbmcoKSE9PXQpY29udGludWU7ci5zZXROZXh0TWluKHMpLGk9ZS5fU0NBTk5JTkdfRk9SX0lOQ09NSU5HfX1pPT09dGhpcy5fTElOS0lOR19UT19PVVRHT0lORyYmKFppLmlzVHJ1ZShudWxsIT09biwiZm91bmQgbnVsbCBmb3IgZmlyc3Qgb3V0Z29pbmcgZGlyRWRnZSIpLFppLmlzVHJ1ZShuLmdldEVkZ2VSaW5nKCk9PT10LCJ1bmFibGUgdG8gbGluayBsYXN0IGluY29taW5nIGRpckVkZ2UiKSxyLnNldE5leHRNaW4obikpfSxlLnByb3RvdHlwZS5nZXRPdXRnb2luZ0RlZ3JlZT1mdW5jdGlvbigpe2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXtmb3IodmFyIHQ9MCxlPXRoaXMuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspe2UubmV4dCgpLmlzSW5SZXN1bHQoKSYmdCsrfXJldHVybiB0fWlmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtmb3IodmFyIG49YXJndW1lbnRzWzBdLHI9MCxpPXRoaXMuaXRlcmF0b3IoKTtpLmhhc05leHQoKTspe2kubmV4dCgpLmdldEVkZ2VSaW5nKCk9PT1uJiZyKyt9cmV0dXJuIHJ9fSxlLnByb3RvdHlwZS5nZXRMYWJlbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9sYWJlbH0sZS5wcm90b3R5cGUuZmluZENvdmVyZWRMaW5lRWRnZXM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9YmkuTk9ORSxlPXRoaXMuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspe3ZhciBuPWUubmV4dCgpLHI9bi5nZXRTeW0oKTtpZighbi5pc0xpbmVFZGdlKCkpe2lmKG4uaXNJblJlc3VsdCgpKXt0PWJpLklOVEVSSU9SO2JyZWFrfWlmKHIuaXNJblJlc3VsdCgpKXt0PWJpLkVYVEVSSU9SO2JyZWFrfX19aWYodD09PWJpLk5PTkUpcmV0dXJuIG51bGw7Zm9yKHZhciBpPXQsbz10aGlzLml0ZXJhdG9yKCk7by5oYXNOZXh0KCk7KXt2YXIgcz1vLm5leHQoKSxhPXMuZ2V0U3ltKCk7cy5pc0xpbmVFZGdlKCk/cy5nZXRFZGdlKCkuc2V0Q292ZXJlZChpPT09YmkuSU5URVJJT1IpOihzLmlzSW5SZXN1bHQoKSYmKGk9YmkuRVhURVJJT1IpLGEuaXNJblJlc3VsdCgpJiYoaT1iaS5JTlRFUklPUikpfX0sZS5wcm90b3R5cGUuY29tcHV0ZUxhYmVsbGluZz1mdW5jdGlvbihlKXt0LnByb3RvdHlwZS5jb21wdXRlTGFiZWxsaW5nLmNhbGwodGhpcyxlKSx0aGlzLl9sYWJlbD1uZXcganMoYmkuTk9ORSk7Zm9yKHZhciBuPXRoaXMuaXRlcmF0b3IoKTtuLmhhc05leHQoKTspZm9yKHZhciByPW4ubmV4dCgpLmdldEVkZ2UoKS5nZXRMYWJlbCgpLGk9MDtpPDI7aSsrKXt2YXIgbz1yLmdldExvY2F0aW9uKGkpOyhvPT09YmkuSU5URVJJT1J8fG89PT1iaS5CT1VOREFSWSkmJnRoaXMuX2xhYmVsLnNldExvY2F0aW9uKGksYmkuSU5URVJJT1IpfX0sZS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sZX0oS2EpLFFhPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuY3JlYXRlTm9kZT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IFlzKHQsbmV3IEphKX0sZS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sZX0oSnMpLCRhPWZ1bmN0aW9uIHQoKXt0aGlzLl9wdHM9bnVsbCx0aGlzLl9vcmllbnRhdGlvbj1udWxsO3ZhciBlPWFyZ3VtZW50c1swXTt0aGlzLl9wdHM9ZSx0aGlzLl9vcmllbnRhdGlvbj10Lm9yaWVudGF0aW9uKGUpfTskYS5wcm90b3R5cGUuY29tcGFyZVRvPWZ1bmN0aW9uKHQpe3ZhciBlPXQ7cmV0dXJuICRhLmNvbXBhcmVPcmllbnRlZCh0aGlzLl9wdHMsdGhpcy5fb3JpZW50YXRpb24sZS5fcHRzLGUuX29yaWVudGF0aW9uKX0sJGEucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW2RpXX0sJGEucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuICRhfSwkYS5vcmllbnRhdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gMT09PURvLmluY3JlYXNpbmdEaXJlY3Rpb24odCl9LCRhLmNvbXBhcmVPcmllbnRlZD1mdW5jdGlvbih0LGUsbixyKXtmb3IodmFyIGk9ZT8xOi0xLG89cj8xOi0xLHM9ZT90Lmxlbmd0aDotMSxhPXI/bi5sZW5ndGg6LTEsdT1lPzA6dC5sZW5ndGgtMSxjPXI/MDpuLmxlbmd0aC0xOzspe3ZhciBsPXRbdV0uY29tcGFyZVRvKG5bY10pO2lmKDAhPT1sKXJldHVybiBsO3ZhciBoPSh1Kz1pKT09PXMsZj0oYys9byk9PT1hO2lmKGgmJiFmKXJldHVybi0xO2lmKCFoJiZmKXJldHVybiAxO2lmKGgmJmYpcmV0dXJuIDB9fTt2YXIgdHU9ZnVuY3Rpb24oKXt0aGlzLl9lZGdlcz1uZXcgeG8sdGhpcy5fb2NhTWFwPW5ldyBrb307dHUucHJvdG90eXBlLnByaW50PWZ1bmN0aW9uKHQpe3QucHJpbnQoIk1VTFRJTElORVNUUklORyAoICIpO2Zvcih2YXIgZT0wO2U8dGhpcy5fZWRnZXMuc2l6ZSgpO2UrKyl7dmFyIG49dGhpcy5fZWRnZXMuZ2V0KGUpO2U+MCYmdC5wcmludCgiLCIpLHQucHJpbnQoIigiKTtmb3IodmFyIHI9bi5nZXRDb29yZGluYXRlcygpLGk9MDtpPHIubGVuZ3RoO2krKylpPjAmJnQucHJpbnQoIiwiKSx0LnByaW50KHJbaV0ueCsiICIrcltpXS55KTt0LnByaW50bG4oIikiKX10LnByaW50KCIpICAiKX0sdHUucHJvdG90eXBlLmFkZEFsbD1mdW5jdGlvbih0KXtmb3IodmFyIGU9dC5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl0aGlzLmFkZChlLm5leHQoKSl9LHR1LnByb3RvdHlwZS5maW5kRWRnZUluZGV4PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dGhpcy5fZWRnZXMuc2l6ZSgpO2UrKylpZih0aGlzLl9lZGdlcy5nZXQoZSkuZXF1YWxzKHQpKXJldHVybiBlO3JldHVybi0xfSx0dS5wcm90b3R5cGUuaXRlcmF0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZWRnZXMuaXRlcmF0b3IoKX0sdHUucHJvdG90eXBlLmdldEVkZ2VzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VkZ2VzfSx0dS5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9lZGdlcy5nZXQodCl9LHR1LnByb3RvdHlwZS5maW5kRXF1YWxFZGdlPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyAkYSh0LmdldENvb3JkaW5hdGVzKCkpO3JldHVybiB0aGlzLl9vY2FNYXAuZ2V0KGUpfSx0dS5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQpe3RoaXMuX2VkZ2VzLmFkZCh0KTt2YXIgZT1uZXcgJGEodC5nZXRDb29yZGluYXRlcygpKTt0aGlzLl9vY2FNYXAucHV0KGUsdCl9LHR1LnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSx0dS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gdHV9O3ZhciBldT1mdW5jdGlvbigpe307ZXUucHJvdG90eXBlLnByb2Nlc3NJbnRlcnNlY3Rpb25zPWZ1bmN0aW9uKHQsZSxuLHIpe30sZXUucHJvdG90eXBlLmlzRG9uZT1mdW5jdGlvbigpe30sZXUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGV1LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBldX07dmFyIG51PWZ1bmN0aW9uKCl7dGhpcy5faGFzSW50ZXJzZWN0aW9uPSExLHRoaXMuX2hhc1Byb3Blcj0hMSx0aGlzLl9oYXNQcm9wZXJJbnRlcmlvcj0hMSx0aGlzLl9oYXNJbnRlcmlvcj0hMSx0aGlzLl9wcm9wZXJJbnRlcnNlY3Rpb25Qb2ludD1udWxsLHRoaXMuX2xpPW51bGwsdGhpcy5faXNTZWxmSW50ZXJzZWN0aW9uPW51bGwsdGhpcy5udW1JbnRlcnNlY3Rpb25zPTAsdGhpcy5udW1JbnRlcmlvckludGVyc2VjdGlvbnM9MCx0aGlzLm51bVByb3BlckludGVyc2VjdGlvbnM9MCx0aGlzLm51bVRlc3RzPTA7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuX2xpPXR9O251LnByb3RvdHlwZS5pc1RyaXZpYWxJbnRlcnNlY3Rpb249ZnVuY3Rpb24odCxlLG4scil7aWYodD09PW4mJjE9PT10aGlzLl9saS5nZXRJbnRlcnNlY3Rpb25OdW0oKSl7aWYobnUuaXNBZGphY2VudFNlZ21lbnRzKGUscikpcmV0dXJuITA7aWYodC5pc0Nsb3NlZCgpKXt2YXIgaT10LnNpemUoKS0xO2lmKDA9PT1lJiZyPT09aXx8MD09PXImJmU9PT1pKXJldHVybiEwfX1yZXR1cm4hMX0sbnUucHJvdG90eXBlLmdldFByb3BlckludGVyc2VjdGlvblBvaW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Byb3BlckludGVyc2VjdGlvblBvaW50fSxudS5wcm90b3R5cGUuaGFzUHJvcGVySW50ZXJpb3JJbnRlcnNlY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faGFzUHJvcGVySW50ZXJpb3J9LG51LnByb3RvdHlwZS5nZXRMaW5lSW50ZXJzZWN0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbGl9LG51LnByb3RvdHlwZS5oYXNQcm9wZXJJbnRlcnNlY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faGFzUHJvcGVyfSxudS5wcm90b3R5cGUucHJvY2Vzc0ludGVyc2VjdGlvbnM9ZnVuY3Rpb24odCxlLG4scil7aWYodD09PW4mJmU9PT1yKXJldHVybiBudWxsO3RoaXMubnVtVGVzdHMrKzt2YXIgaT10LmdldENvb3JkaW5hdGVzKClbZV0sbz10LmdldENvb3JkaW5hdGVzKClbZSsxXSxzPW4uZ2V0Q29vcmRpbmF0ZXMoKVtyXSxhPW4uZ2V0Q29vcmRpbmF0ZXMoKVtyKzFdO3RoaXMuX2xpLmNvbXB1dGVJbnRlcnNlY3Rpb24oaSxvLHMsYSksdGhpcy5fbGkuaGFzSW50ZXJzZWN0aW9uKCkmJih0aGlzLm51bUludGVyc2VjdGlvbnMrKyx0aGlzLl9saS5pc0ludGVyaW9ySW50ZXJzZWN0aW9uKCkmJih0aGlzLm51bUludGVyaW9ySW50ZXJzZWN0aW9ucysrLHRoaXMuX2hhc0ludGVyaW9yPSEwKSx0aGlzLmlzVHJpdmlhbEludGVyc2VjdGlvbih0LGUsbixyKXx8KHRoaXMuX2hhc0ludGVyc2VjdGlvbj0hMCx0LmFkZEludGVyc2VjdGlvbnModGhpcy5fbGksZSwwKSxuLmFkZEludGVyc2VjdGlvbnModGhpcy5fbGksciwxKSx0aGlzLl9saS5pc1Byb3BlcigpJiYodGhpcy5udW1Qcm9wZXJJbnRlcnNlY3Rpb25zKyssdGhpcy5faGFzUHJvcGVyPSEwLHRoaXMuX2hhc1Byb3BlckludGVyaW9yPSEwKSkpfSxudS5wcm90b3R5cGUuaGFzSW50ZXJzZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2hhc0ludGVyc2VjdGlvbn0sbnUucHJvdG90eXBlLmlzRG9uZT1mdW5jdGlvbigpe3JldHVybiExfSxudS5wcm90b3R5cGUuaGFzSW50ZXJpb3JJbnRlcnNlY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faGFzSW50ZXJpb3J9LG51LnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltldV19LG51LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBudX0sbnUuaXNBZGphY2VudFNlZ21lbnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIDE9PT1NYXRoLmFicyh0LWUpfTt2YXIgcnU9ZnVuY3Rpb24oKXt0aGlzLmNvb3JkPW51bGwsdGhpcy5zZWdtZW50SW5kZXg9bnVsbCx0aGlzLmRpc3Q9bnVsbDt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV0sbj1hcmd1bWVudHNbMl07dGhpcy5jb29yZD1uZXcgdmkodCksdGhpcy5zZWdtZW50SW5kZXg9ZSx0aGlzLmRpc3Q9bn07cnUucHJvdG90eXBlLmdldFNlZ21lbnRJbmRleD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNlZ21lbnRJbmRleH0scnUucHJvdG90eXBlLmdldENvb3JkaW5hdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb29yZH0scnUucHJvdG90eXBlLnByaW50PWZ1bmN0aW9uKHQpe3QucHJpbnQodGhpcy5jb29yZCksdC5wcmludCgiIHNlZyAjID0gIit0aGlzLnNlZ21lbnRJbmRleCksdC5wcmludGxuKCIgZGlzdCA9ICIrdGhpcy5kaXN0KX0scnUucHJvdG90eXBlLmNvbXBhcmVUbz1mdW5jdGlvbih0KXt2YXIgZT10O3JldHVybiB0aGlzLmNvbXBhcmUoZS5zZWdtZW50SW5kZXgsZS5kaXN0KX0scnUucHJvdG90eXBlLmlzRW5kUG9pbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIDA9PT10aGlzLnNlZ21lbnRJbmRleCYmMD09PXRoaXMuZGlzdHx8dGhpcy5zZWdtZW50SW5kZXg9PT10fSxydS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb29yZCsiIHNlZyAjID0gIit0aGlzLnNlZ21lbnRJbmRleCsiIGRpc3QgPSAiK3RoaXMuZGlzdH0scnUucHJvdG90eXBlLmdldERpc3RhbmNlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGlzdH0scnUucHJvdG90eXBlLmNvbXBhcmU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5zZWdtZW50SW5kZXg8dD8tMTp0aGlzLnNlZ21lbnRJbmRleD50PzE6dGhpcy5kaXN0PGU/LTE6dGhpcy5kaXN0PmU/MTowfSxydS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bZGldfSxydS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gcnV9O3ZhciBpdT1mdW5jdGlvbigpe3RoaXMuX25vZGVNYXA9bmV3IGtvLHRoaXMuZWRnZT1udWxsO3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLmVkZ2U9dH07aXUucHJvdG90eXBlLnByaW50PWZ1bmN0aW9uKHQpe3QucHJpbnRsbigiSW50ZXJzZWN0aW9uczoiKTtmb3IodmFyIGU9dGhpcy5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7ZS5uZXh0KCkucHJpbnQodCl9fSxpdS5wcm90b3R5cGUuaXRlcmF0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbm9kZU1hcC52YWx1ZXMoKS5pdGVyYXRvcigpfSxpdS5wcm90b3R5cGUuYWRkU3BsaXRFZGdlcz1mdW5jdGlvbih0KXt0aGlzLmFkZEVuZHBvaW50cygpO2Zvcih2YXIgZT10aGlzLml0ZXJhdG9yKCksbj1lLm5leHQoKTtlLmhhc05leHQoKTspe3ZhciByPWUubmV4dCgpLGk9dGhpcy5jcmVhdGVTcGxpdEVkZ2UobixyKTt0LmFkZChpKSxuPXJ9fSxpdS5wcm90b3R5cGUuYWRkRW5kcG9pbnRzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5lZGdlLnB0cy5sZW5ndGgtMTt0aGlzLmFkZCh0aGlzLmVkZ2UucHRzWzBdLDAsMCksdGhpcy5hZGQodGhpcy5lZGdlLnB0c1t0XSx0LDApfSxpdS5wcm90b3R5cGUuY3JlYXRlU3BsaXRFZGdlPWZ1bmN0aW9uKHQsZSl7dmFyIG49ZS5zZWdtZW50SW5kZXgtdC5zZWdtZW50SW5kZXgrMixyPXRoaXMuZWRnZS5wdHNbZS5zZWdtZW50SW5kZXhdLGk9ZS5kaXN0PjB8fCFlLmNvb3JkLmVxdWFsczJEKHIpO2l8fG4tLTt2YXIgbz1uZXcgQXJyYXkobikuZmlsbChudWxsKSxzPTA7b1tzKytdPW5ldyB2aSh0LmNvb3JkKTtmb3IodmFyIGE9dC5zZWdtZW50SW5kZXgrMTthPD1lLnNlZ21lbnRJbmRleDthKyspb1tzKytdPXRoaXMuZWRnZS5wdHNbYV07cmV0dXJuIGkmJihvW3NdPWUuY29vcmQpLG5ldyBjdShvLG5ldyBqcyh0aGlzLmVkZ2UuX2xhYmVsKSl9LGl1LnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCxlLG4pe3ZhciByPW5ldyBydSh0LGUsbiksaT10aGlzLl9ub2RlTWFwLmdldChyKTtyZXR1cm4gbnVsbCE9PWk/aToodGhpcy5fbm9kZU1hcC5wdXQocixyKSxyKX0saXUucHJvdG90eXBlLmlzSW50ZXJzZWN0aW9uPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXtpZihlLm5leHQoKS5jb29yZC5lcXVhbHModCkpcmV0dXJuITB9cmV0dXJuITF9LGl1LnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxpdS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gaXV9O3ZhciBvdT1mdW5jdGlvbigpe307b3UucHJvdG90eXBlLmdldENoYWluU3RhcnRJbmRpY2VzPWZ1bmN0aW9uKHQpe3ZhciBlPTAsbj1uZXcgeG87bi5hZGQobmV3IE5pKGUpKTtkb3t2YXIgcj10aGlzLmZpbmRDaGFpbkVuZCh0LGUpO24uYWRkKG5ldyBOaShyKSksZT1yfXdoaWxlKGU8dC5sZW5ndGgtMSk7cmV0dXJuIG91LnRvSW50QXJyYXkobil9LG91LnByb3RvdHlwZS5maW5kQ2hhaW5FbmQ9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49V3MucXVhZHJhbnQodFtlXSx0W2UrMV0pLHI9ZSsxO3I8dC5sZW5ndGg7KXtpZihXcy5xdWFkcmFudCh0W3ItMV0sdFtyXSkhPT1uKWJyZWFrO3IrK31yZXR1cm4gci0xfSxvdS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sb3UucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIG91fSxvdS50b0ludEFycmF5PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgQXJyYXkodC5zaXplKCkpLmZpbGwobnVsbCksbj0wO248ZS5sZW5ndGg7bisrKWVbbl09dC5nZXQobikuaW50VmFsdWUoKTtyZXR1cm4gZX07dmFyIHN1PWZ1bmN0aW9uKCl7dGhpcy5lPW51bGwsdGhpcy5wdHM9bnVsbCx0aGlzLnN0YXJ0SW5kZXg9bnVsbCx0aGlzLmVudjE9bmV3IGppLHRoaXMuZW52Mj1uZXcgamk7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuZT10LHRoaXMucHRzPXQuZ2V0Q29vcmRpbmF0ZXMoKTt2YXIgZT1uZXcgb3U7dGhpcy5zdGFydEluZGV4PWUuZ2V0Q2hhaW5TdGFydEluZGljZXModGhpcy5wdHMpfTtzdS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdHN9LHN1LnByb3RvdHlwZS5nZXRNYXhYPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMucHRzW3RoaXMuc3RhcnRJbmRleFt0XV0ueCxuPXRoaXMucHRzW3RoaXMuc3RhcnRJbmRleFt0KzFdXS54O3JldHVybiBlPm4/ZTpufSxzdS5wcm90b3R5cGUuZ2V0TWluWD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLnB0c1t0aGlzLnN0YXJ0SW5kZXhbdF1dLngsbj10aGlzLnB0c1t0aGlzLnN0YXJ0SW5kZXhbdCsxXV0ueDtyZXR1cm4gZTxuP2U6bn0sc3UucHJvdG90eXBlLmNvbXB1dGVJbnRlcnNlY3RzRm9yQ2hhaW49ZnVuY3Rpb24oKXtpZig0PT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdLG49YXJndW1lbnRzWzJdLHI9YXJndW1lbnRzWzNdO3RoaXMuY29tcHV0ZUludGVyc2VjdHNGb3JDaGFpbih0aGlzLnN0YXJ0SW5kZXhbdF0sdGhpcy5zdGFydEluZGV4W3QrMV0sZSxlLnN0YXJ0SW5kZXhbbl0sZS5zdGFydEluZGV4W24rMV0scil9ZWxzZSBpZig2PT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGk9YXJndW1lbnRzWzBdLG89YXJndW1lbnRzWzFdLHM9YXJndW1lbnRzWzJdLGE9YXJndW1lbnRzWzNdLHU9YXJndW1lbnRzWzRdLGM9YXJndW1lbnRzWzVdLGw9dGhpcy5wdHNbaV0saD10aGlzLnB0c1tvXSxmPXMucHRzW2FdLHA9cy5wdHNbdV07aWYoby1pPT0xJiZ1LWE9PTEpcmV0dXJuIGMuYWRkSW50ZXJzZWN0aW9ucyh0aGlzLmUsaSxzLmUsYSksbnVsbDtpZih0aGlzLmVudjEuaW5pdChsLGgpLHRoaXMuZW52Mi5pbml0KGYscCksIXRoaXMuZW52MS5pbnRlcnNlY3RzKHRoaXMuZW52MikpcmV0dXJuIG51bGw7dmFyIGQ9TWF0aC50cnVuYygoaStvKS8yKSxnPU1hdGgudHJ1bmMoKGErdSkvMik7aTxkJiYoYTxnJiZ0aGlzLmNvbXB1dGVJbnRlcnNlY3RzRm9yQ2hhaW4oaSxkLHMsYSxnLGMpLGc8dSYmdGhpcy5jb21wdXRlSW50ZXJzZWN0c0ZvckNoYWluKGksZCxzLGcsdSxjKSksZDxvJiYoYTxnJiZ0aGlzLmNvbXB1dGVJbnRlcnNlY3RzRm9yQ2hhaW4oZCxvLHMsYSxnLGMpLGc8dSYmdGhpcy5jb21wdXRlSW50ZXJzZWN0c0ZvckNoYWluKGQsbyxzLGcsdSxjKSl9fSxzdS5wcm90b3R5cGUuZ2V0U3RhcnRJbmRleGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhcnRJbmRleH0sc3UucHJvdG90eXBlLmNvbXB1dGVJbnRlcnNlY3RzPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPTA7bjx0aGlzLnN0YXJ0SW5kZXgubGVuZ3RoLTE7bisrKWZvcih2YXIgcj0wO3I8dC5zdGFydEluZGV4Lmxlbmd0aC0xO3IrKyl0aGlzLmNvbXB1dGVJbnRlcnNlY3RzRm9yQ2hhaW4obix0LHIsZSl9LHN1LnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxzdS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gc3V9O3ZhciBhdT1mdW5jdGlvbiB0KCl7dGhpcy5fZGVwdGg9QXJyYXkoMikuZmlsbCgpLm1hcCgoZnVuY3Rpb24oKXtyZXR1cm4gQXJyYXkoMyl9KSk7Zm9yKHZhciBlPTA7ZTwyO2UrKylmb3IodmFyIG49MDtuPDM7bisrKXRoaXMuX2RlcHRoW2VdW25dPXQuTlVMTF9WQUxVRX0sdXU9e05VTExfVkFMVUU6e2NvbmZpZ3VyYWJsZTohMH19O2F1LnByb3RvdHlwZS5nZXREZXB0aD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl9kZXB0aFt0XVtlXX0sYXUucHJvdG90eXBlLnNldERlcHRoPWZ1bmN0aW9uKHQsZSxuKXt0aGlzLl9kZXB0aFt0XVtlXT1ufSxhdS5wcm90b3R5cGUuaXNOdWxsPWZ1bmN0aW9uKCl7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcih2YXIgdD0wO3Q8Mjt0KyspZm9yKHZhciBlPTA7ZTwzO2UrKylpZih0aGlzLl9kZXB0aFt0XVtlXSE9PWF1Lk5VTExfVkFMVUUpcmV0dXJuITE7cmV0dXJuITB9aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5fZGVwdGhbbl1bMV09PT1hdS5OVUxMX1ZBTFVFfWlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgcj1hcmd1bWVudHNbMF0saT1hcmd1bWVudHNbMV07cmV0dXJuIHRoaXMuX2RlcHRoW3JdW2ldPT09YXUuTlVMTF9WQUxVRX19LGF1LnByb3RvdHlwZS5ub3JtYWxpemU9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcyxlPTA7ZTwyO2UrKylpZighdC5pc051bGwoZSkpe3ZhciBuPXQuX2RlcHRoW2VdWzFdO3QuX2RlcHRoW2VdWzJdPG4mJihuPXQuX2RlcHRoW2VdWzJdKSxuPDAmJihuPTApO2Zvcih2YXIgcj0xO3I8MztyKyspe3ZhciBpPTA7dC5fZGVwdGhbZV1bcl0+biYmKGk9MSksdC5fZGVwdGhbZV1bcl09aX19fSxhdS5wcm90b3R5cGUuZ2V0RGVsdGE9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2RlcHRoW3RdW0ZzLlJJR0hUXS10aGlzLl9kZXB0aFt0XVtGcy5MRUZUXX0sYXUucHJvdG90eXBlLmdldExvY2F0aW9uPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2RlcHRoW3RdW2VdPD0wP2JpLkVYVEVSSU9SOmJpLklOVEVSSU9SfSxhdS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iQTogIit0aGlzLl9kZXB0aFswXVsxXSsiLCIrdGhpcy5fZGVwdGhbMF1bMl0rIiBCOiAiK3RoaXMuX2RlcHRoWzFdWzFdKyIsIit0aGlzLl9kZXB0aFsxXVsyXX0sYXUucHJvdG90eXBlLmFkZD1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKHZhciBlPWFyZ3VtZW50c1swXSxuPTA7bjwyO24rKylmb3IodmFyIHI9MTtyPDM7cisrKXt2YXIgaT1lLmdldExvY2F0aW9uKG4scik7KGk9PT1iaS5FWFRFUklPUnx8aT09PWJpLklOVEVSSU9SKSYmKHQuaXNOdWxsKG4scik/dC5fZGVwdGhbbl1bcl09YXUuZGVwdGhBdExvY2F0aW9uKGkpOnQuX2RlcHRoW25dW3JdKz1hdS5kZXB0aEF0TG9jYXRpb24oaSkpfWVsc2UgaWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBvPWFyZ3VtZW50c1swXSxzPWFyZ3VtZW50c1sxXTthcmd1bWVudHNbMl09PT1iaS5JTlRFUklPUiYmdGhpcy5fZGVwdGhbb11bc10rK319LGF1LnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxhdS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gYXV9LGF1LmRlcHRoQXRMb2NhdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gdD09PWJpLkVYVEVSSU9SPzA6dD09PWJpLklOVEVSSU9SPzE6YXUuTlVMTF9WQUxVRX0sdXUuTlVMTF9WQUxVRS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4tMX0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoYXUsdXUpO3ZhciBjdT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7aWYodC5jYWxsKHRoaXMpLHRoaXMucHRzPW51bGwsdGhpcy5fZW52PW51bGwsdGhpcy5laUxpc3Q9bmV3IGl1KHRoaXMpLHRoaXMuX25hbWU9bnVsbCx0aGlzLl9tY2U9bnVsbCx0aGlzLl9pc0lzb2xhdGVkPSEwLHRoaXMuX2RlcHRoPW5ldyBhdSx0aGlzLl9kZXB0aERlbHRhPTAsMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1swXTtlLmNhbGwodGhpcyxuLG51bGwpfWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciByPWFyZ3VtZW50c1swXSxpPWFyZ3VtZW50c1sxXTt0aGlzLnB0cz1yLHRoaXMuX2xhYmVsPWl9fXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5nZXREZXB0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kZXB0aH0sZS5wcm90b3R5cGUuZ2V0Q29sbGFwc2VkRWRnZT1mdW5jdGlvbigpe3ZhciB0PW5ldyBBcnJheSgyKS5maWxsKG51bGwpO3JldHVybiB0WzBdPXRoaXMucHRzWzBdLHRbMV09dGhpcy5wdHNbMV0sbmV3IGUodCxqcy50b0xpbmVMYWJlbCh0aGlzLl9sYWJlbCkpfSxlLnByb3RvdHlwZS5pc0lzb2xhdGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzSXNvbGF0ZWR9LGUucHJvdG90eXBlLmdldENvb3JkaW5hdGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHRzfSxlLnByb3RvdHlwZS5zZXRJc29sYXRlZD1mdW5jdGlvbih0KXt0aGlzLl9pc0lzb2xhdGVkPXR9LGUucHJvdG90eXBlLnNldE5hbWU9ZnVuY3Rpb24odCl7dGhpcy5fbmFtZT10fSxlLnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24odCl7aWYoISh0IGluc3RhbmNlb2YgZSkpcmV0dXJuITE7dmFyIG49dDtpZih0aGlzLnB0cy5sZW5ndGghPT1uLnB0cy5sZW5ndGgpcmV0dXJuITE7Zm9yKHZhciByPSEwLGk9ITAsbz10aGlzLnB0cy5sZW5ndGgscz0wO3M8dGhpcy5wdHMubGVuZ3RoO3MrKylpZih0aGlzLnB0c1tzXS5lcXVhbHMyRChuLnB0c1tzXSl8fChyPSExKSx0aGlzLnB0c1tzXS5lcXVhbHMyRChuLnB0c1stLW9dKXx8KGk9ITEpLCFyJiYhaSlyZXR1cm4hMTtyZXR1cm4hMH0sZS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZT1mdW5jdGlvbigpe2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiB0aGlzLnB0cy5sZW5ndGg+MD90aGlzLnB0c1swXTpudWxsO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMucHRzW3RdfX0sZS5wcm90b3R5cGUucHJpbnQ9ZnVuY3Rpb24odCl7dC5wcmludCgiZWRnZSAiK3RoaXMuX25hbWUrIjogIiksdC5wcmludCgiTElORVNUUklORyAoIik7Zm9yKHZhciBlPTA7ZTx0aGlzLnB0cy5sZW5ndGg7ZSsrKWU+MCYmdC5wcmludCgiLCIpLHQucHJpbnQodGhpcy5wdHNbZV0ueCsiICIrdGhpcy5wdHNbZV0ueSk7dC5wcmludCgiKSAgIit0aGlzLl9sYWJlbCsiICIrdGhpcy5fZGVwdGhEZWx0YSl9LGUucHJvdG90eXBlLmNvbXB1dGVJTT1mdW5jdGlvbih0KXtlLnVwZGF0ZUlNKHRoaXMuX2xhYmVsLHQpfSxlLnByb3RvdHlwZS5pc0NvbGxhcHNlZD1mdW5jdGlvbigpe3JldHVybiEoIXRoaXMuX2xhYmVsLmlzQXJlYSgpfHwzIT09dGhpcy5wdHMubGVuZ3RoKSYmISF0aGlzLnB0c1swXS5lcXVhbHModGhpcy5wdHNbMl0pfSxlLnByb3RvdHlwZS5pc0Nsb3NlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnB0c1swXS5lcXVhbHModGhpcy5wdHNbdGhpcy5wdHMubGVuZ3RoLTFdKX0sZS5wcm90b3R5cGUuZ2V0TWF4aW11bVNlZ21lbnRJbmRleD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnB0cy5sZW5ndGgtMX0sZS5wcm90b3R5cGUuZ2V0RGVwdGhEZWx0YT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kZXB0aERlbHRhfSxlLnByb3RvdHlwZS5nZXROdW1Qb2ludHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdHMubGVuZ3RofSxlLnByb3RvdHlwZS5wcmludFJldmVyc2U9ZnVuY3Rpb24odCl7dC5wcmludCgiZWRnZSAiK3RoaXMuX25hbWUrIjogIik7Zm9yKHZhciBlPXRoaXMucHRzLmxlbmd0aC0xO2U+PTA7ZS0tKXQucHJpbnQodGhpcy5wdHNbZV0rIiAiKTt0LnByaW50bG4oIiIpfSxlLnByb3RvdHlwZS5nZXRNb25vdG9uZUNoYWluRWRnZT1mdW5jdGlvbigpe3JldHVybiBudWxsPT09dGhpcy5fbWNlJiYodGhpcy5fbWNlPW5ldyBzdSh0aGlzKSksdGhpcy5fbWNlfSxlLnByb3RvdHlwZS5nZXRFbnZlbG9wZT1mdW5jdGlvbigpe2lmKG51bGw9PT10aGlzLl9lbnYpe3RoaXMuX2Vudj1uZXcgamk7Zm9yKHZhciB0PTA7dDx0aGlzLnB0cy5sZW5ndGg7dCsrKXRoaXMuX2Vudi5leHBhbmRUb0luY2x1ZGUodGhpcy5wdHNbdF0pfXJldHVybiB0aGlzLl9lbnZ9LGUucHJvdG90eXBlLmFkZEludGVyc2VjdGlvbj1mdW5jdGlvbih0LGUsbixyKXt2YXIgaT1uZXcgdmkodC5nZXRJbnRlcnNlY3Rpb24ocikpLG89ZSxzPXQuZ2V0RWRnZURpc3RhbmNlKG4sciksYT1vKzE7aWYoYTx0aGlzLnB0cy5sZW5ndGgpe3ZhciB1PXRoaXMucHRzW2FdO2kuZXF1YWxzMkQodSkmJihvPWEscz0wKX10aGlzLmVpTGlzdC5hZGQoaSxvLHMpfSxlLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3ZhciB0PW5ldyBBaTt0LmFwcGVuZCgiZWRnZSAiK3RoaXMuX25hbWUrIjogIiksdC5hcHBlbmQoIkxJTkVTVFJJTkcgKCIpO2Zvcih2YXIgZT0wO2U8dGhpcy5wdHMubGVuZ3RoO2UrKyllPjAmJnQuYXBwZW5kKCIsIiksdC5hcHBlbmQodGhpcy5wdHNbZV0ueCsiICIrdGhpcy5wdHNbZV0ueSk7cmV0dXJuIHQuYXBwZW5kKCIpICAiK3RoaXMuX2xhYmVsKyIgIit0aGlzLl9kZXB0aERlbHRhKSx0LnRvU3RyaW5nKCl9LGUucHJvdG90eXBlLmlzUG9pbnR3aXNlRXF1YWw9ZnVuY3Rpb24odCl7aWYodGhpcy5wdHMubGVuZ3RoIT09dC5wdHMubGVuZ3RoKXJldHVybiExO2Zvcih2YXIgZT0wO2U8dGhpcy5wdHMubGVuZ3RoO2UrKylpZighdGhpcy5wdHNbZV0uZXF1YWxzMkQodC5wdHNbZV0pKXJldHVybiExO3JldHVybiEwfSxlLnByb3RvdHlwZS5zZXREZXB0aERlbHRhPWZ1bmN0aW9uKHQpe3RoaXMuX2RlcHRoRGVsdGE9dH0sZS5wcm90b3R5cGUuZ2V0RWRnZUludGVyc2VjdGlvbkxpc3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5laUxpc3R9LGUucHJvdG90eXBlLmFkZEludGVyc2VjdGlvbnM9ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj0wO3I8dC5nZXRJbnRlcnNlY3Rpb25OdW0oKTtyKyspdGhpcy5hZGRJbnRlcnNlY3Rpb24odCxlLG4scil9LGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LGUudXBkYXRlSU09ZnVuY3Rpb24oKXtpZigyIT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdC5wcm90b3R5cGUudXBkYXRlSU0uYXBwbHkodGhpcyxhcmd1bWVudHMpO3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTtuLnNldEF0TGVhc3RJZlZhbGlkKGUuZ2V0TG9jYXRpb24oMCxGcy5PTiksZS5nZXRMb2NhdGlvbigxLEZzLk9OKSwxKSxlLmlzQXJlYSgpJiYobi5zZXRBdExlYXN0SWZWYWxpZChlLmdldExvY2F0aW9uKDAsRnMuTEVGVCksZS5nZXRMb2NhdGlvbigxLEZzLkxFRlQpLDIpLG4uc2V0QXRMZWFzdElmVmFsaWQoZS5nZXRMb2NhdGlvbigwLEZzLlJJR0hUKSxlLmdldExvY2F0aW9uKDEsRnMuUklHSFQpLDIpKX0sZX0oR3MpLGx1PWZ1bmN0aW9uKHQpe3RoaXMuX3dvcmtpbmdQcmVjaXNpb25Nb2RlbD1udWxsLHRoaXMuX3dvcmtpbmdOb2Rlcj1udWxsLHRoaXMuX2dlb21GYWN0PW51bGwsdGhpcy5fZ3JhcGg9bnVsbCx0aGlzLl9lZGdlTGlzdD1uZXcgdHUsdGhpcy5fYnVmUGFyYW1zPXR8fG51bGx9O2x1LnByb3RvdHlwZS5zZXRXb3JraW5nUHJlY2lzaW9uTW9kZWw9ZnVuY3Rpb24odCl7dGhpcy5fd29ya2luZ1ByZWNpc2lvbk1vZGVsPXR9LGx1LnByb3RvdHlwZS5pbnNlcnRVbmlxdWVFZGdlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2VkZ2VMaXN0LmZpbmRFcXVhbEVkZ2UodCk7aWYobnVsbCE9PWUpe3ZhciBuPWUuZ2V0TGFiZWwoKSxyPXQuZ2V0TGFiZWwoKTtlLmlzUG9pbnR3aXNlRXF1YWwodCl8fChyPW5ldyBqcyh0LmdldExhYmVsKCkpKS5mbGlwKCksbi5tZXJnZShyKTt2YXIgaT1sdS5kZXB0aERlbHRhKHIpLG89ZS5nZXREZXB0aERlbHRhKCkraTtlLnNldERlcHRoRGVsdGEobyl9ZWxzZSB0aGlzLl9lZGdlTGlzdC5hZGQodCksdC5zZXREZXB0aERlbHRhKGx1LmRlcHRoRGVsdGEodC5nZXRMYWJlbCgpKSl9LGx1LnByb3RvdHlwZS5idWlsZFN1YmdyYXBocz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1uZXcgeG8scj10Lml0ZXJhdG9yKCk7ci5oYXNOZXh0KCk7KXt2YXIgaT1yLm5leHQoKSxvPWkuZ2V0UmlnaHRtb3N0Q29vcmRpbmF0ZSgpLHM9bmV3IHFhKG4pLmdldERlcHRoKG8pO2kuY29tcHV0ZURlcHRoKHMpLGkuZmluZFJlc3VsdEVkZ2VzKCksbi5hZGQoaSksZS5hZGQoaS5nZXREaXJlY3RlZEVkZ2VzKCksaS5nZXROb2RlcygpKX19LGx1LnByb3RvdHlwZS5jcmVhdGVTdWJncmFwaHM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPW5ldyB4byxuPXQuZ2V0Tm9kZXMoKS5pdGVyYXRvcigpO24uaGFzTmV4dCgpOyl7dmFyIHI9bi5uZXh0KCk7aWYoIXIuaXNWaXNpdGVkKCkpe3ZhciBpPW5ldyBrcztpLmNyZWF0ZShyKSxlLmFkZChpKX19cmV0dXJuIGFhLnNvcnQoZSxhYS5yZXZlcnNlT3JkZXIoKSksZX0sbHUucHJvdG90eXBlLmNyZWF0ZUVtcHR5UmVzdWx0R2VvbWV0cnk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2VvbUZhY3QuY3JlYXRlUG9seWdvbigpfSxsdS5wcm90b3R5cGUuZ2V0Tm9kZXI9ZnVuY3Rpb24odCl7aWYobnVsbCE9PXRoaXMuX3dvcmtpbmdOb2RlcilyZXR1cm4gdGhpcy5fd29ya2luZ05vZGVyO3ZhciBlPW5ldyBJYSxuPW5ldyBRaTtyZXR1cm4gbi5zZXRQcmVjaXNpb25Nb2RlbCh0KSxlLnNldFNlZ21lbnRJbnRlcnNlY3RvcihuZXcgbnUobikpLGV9LGx1LnByb3RvdHlwZS5idWZmZXI9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl93b3JraW5nUHJlY2lzaW9uTW9kZWw7bnVsbD09PW4mJihuPXQuZ2V0UHJlY2lzaW9uTW9kZWwoKSksdGhpcy5fZ2VvbUZhY3Q9dC5nZXRGYWN0b3J5KCk7dmFyIHI9bmV3IFVhKG4sdGhpcy5fYnVmUGFyYW1zKSxpPW5ldyBYYSh0LGUscikuZ2V0Q3VydmVzKCk7aWYoaS5zaXplKCk8PTApcmV0dXJuIHRoaXMuY3JlYXRlRW1wdHlSZXN1bHRHZW9tZXRyeSgpO3RoaXMuY29tcHV0ZU5vZGVkRWRnZXMoaSxuKSx0aGlzLl9ncmFwaD1uZXcgUXMobmV3IFFhKSx0aGlzLl9ncmFwaC5hZGRFZGdlcyh0aGlzLl9lZGdlTGlzdC5nZXRFZGdlcygpKTt2YXIgbz10aGlzLmNyZWF0ZVN1YmdyYXBocyh0aGlzLl9ncmFwaCkscz1uZXcgJHModGhpcy5fZ2VvbUZhY3QpO3RoaXMuYnVpbGRTdWJncmFwaHMobyxzKTt2YXIgYT1zLmdldFBvbHlnb25zKCk7cmV0dXJuIGEuc2l6ZSgpPD0wP3RoaXMuY3JlYXRlRW1wdHlSZXN1bHRHZW9tZXRyeSgpOnRoaXMuX2dlb21GYWN0LmJ1aWxkR2VvbWV0cnkoYSl9LGx1LnByb3RvdHlwZS5jb21wdXRlTm9kZWRFZGdlcz1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuZ2V0Tm9kZXIoZSk7bi5jb21wdXRlTm9kZXModCk7Zm9yKHZhciByPW4uZ2V0Tm9kZWRTdWJzdHJpbmdzKCkuaXRlcmF0b3IoKTtyLmhhc05leHQoKTspe3ZhciBpPXIubmV4dCgpLG89aS5nZXRDb29yZGluYXRlcygpO2lmKDIhPT1vLmxlbmd0aHx8IW9bMF0uZXF1YWxzMkQob1sxXSkpe3ZhciBzPWkuZ2V0RGF0YSgpLGE9bmV3IGN1KGkuZ2V0Q29vcmRpbmF0ZXMoKSxuZXcganMocykpO3RoaXMuaW5zZXJ0VW5pcXVlRWRnZShhKX19fSxsdS5wcm90b3R5cGUuc2V0Tm9kZXI9ZnVuY3Rpb24odCl7dGhpcy5fd29ya2luZ05vZGVyPXR9LGx1LnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxsdS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gbHV9LGx1LmRlcHRoRGVsdGE9ZnVuY3Rpb24odCl7dmFyIGU9dC5nZXRMb2NhdGlvbigwLEZzLkxFRlQpLG49dC5nZXRMb2NhdGlvbigwLEZzLlJJR0hUKTtyZXR1cm4gZT09PWJpLklOVEVSSU9SJiZuPT09YmkuRVhURVJJT1I/MTplPT09YmkuRVhURVJJT1ImJm49PT1iaS5JTlRFUklPUj8tMTowfSxsdS5jb252ZXJ0U2VnU3RyaW5ncz1mdW5jdGlvbih0KXtmb3IodmFyIGU9bmV3IElzLG49bmV3IHhvO3QuaGFzTmV4dCgpOyl7dmFyIHI9dC5uZXh0KCksaT1lLmNyZWF0ZUxpbmVTdHJpbmcoci5nZXRDb29yZGluYXRlcygpKTtuLmFkZChpKX1yZXR1cm4gZS5idWlsZEdlb21ldHJ5KG4pfTt2YXIgaHU9ZnVuY3Rpb24oKXtpZih0aGlzLl9ub2Rlcj1udWxsLHRoaXMuX3NjYWxlRmFjdG9yPW51bGwsdGhpcy5fb2Zmc2V0WD1udWxsLHRoaXMuX29mZnNldFk9bnVsbCx0aGlzLl9pc1NjYWxlZD0hMSwyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdO3RoaXMuX25vZGVyPXQsdGhpcy5fc2NhbGVGYWN0b3I9ZSx0aGlzLl9vZmZzZXRYPTAsdGhpcy5fb2Zmc2V0WT0wLHRoaXMuX2lzU2NhbGVkPSF0aGlzLmlzSW50ZWdlclByZWNpc2lvbigpfWVsc2UgaWYoND09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXSxpPWFyZ3VtZW50c1syXSxvPWFyZ3VtZW50c1szXTt0aGlzLl9ub2Rlcj1uLHRoaXMuX3NjYWxlRmFjdG9yPXIsdGhpcy5fb2Zmc2V0WD1pLHRoaXMuX29mZnNldFk9byx0aGlzLl9pc1NjYWxlZD0hdGhpcy5pc0ludGVnZXJQcmVjaXNpb24oKX19O2h1LnByb3RvdHlwZS5yZXNjYWxlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztpZihFaShhcmd1bWVudHNbMF0sZ28pKWZvcih2YXIgZT1hcmd1bWVudHNbMF0uaXRlcmF0b3IoKTtlLmhhc05leHQoKTspe3ZhciBuPWUubmV4dCgpO3QucmVzY2FsZShuLmdldENvb3JkaW5hdGVzKCkpfWVsc2UgaWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBBcnJheSl7Zm9yKHZhciByPWFyZ3VtZW50c1swXSxpPTA7aTxyLmxlbmd0aDtpKyspcltpXS54PXJbaV0ueC90Ll9zY2FsZUZhY3Rvcit0Ll9vZmZzZXRYLHJbaV0ueT1yW2ldLnkvdC5fc2NhbGVGYWN0b3IrdC5fb2Zmc2V0WTsyPT09ci5sZW5ndGgmJnJbMF0uZXF1YWxzMkQoclsxXSkmJmtpLm91dC5wcmludGxuKHIpfX0saHUucHJvdG90eXBlLnNjYWxlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztpZihFaShhcmd1bWVudHNbMF0sZ28pKXtmb3IodmFyIGU9YXJndW1lbnRzWzBdLG49bmV3IHhvLHI9ZS5pdGVyYXRvcigpO3IuaGFzTmV4dCgpOyl7dmFyIGk9ci5uZXh0KCk7bi5hZGQobmV3IHdhKHQuc2NhbGUoaS5nZXRDb29yZGluYXRlcygpKSxpLmdldERhdGEoKSkpfXJldHVybiBufWlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgQXJyYXkpe2Zvcih2YXIgbz1hcmd1bWVudHNbMF0scz1uZXcgQXJyYXkoby5sZW5ndGgpLmZpbGwobnVsbCksYT0wO2E8by5sZW5ndGg7YSsrKXNbYV09bmV3IHZpKE1hdGgucm91bmQoKG9bYV0ueC10Ll9vZmZzZXRYKSp0Ll9zY2FsZUZhY3RvciksTWF0aC5yb3VuZCgob1thXS55LXQuX29mZnNldFkpKnQuX3NjYWxlRmFjdG9yKSxvW2FdLnopO3JldHVybiBEby5yZW1vdmVSZXBlYXRlZFBvaW50cyhzKX19LGh1LnByb3RvdHlwZS5pc0ludGVnZXJQcmVjaXNpb249ZnVuY3Rpb24oKXtyZXR1cm4gMT09PXRoaXMuX3NjYWxlRmFjdG9yfSxodS5wcm90b3R5cGUuZ2V0Tm9kZWRTdWJzdHJpbmdzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fbm9kZXIuZ2V0Tm9kZWRTdWJzdHJpbmdzKCk7cmV0dXJuIHRoaXMuX2lzU2NhbGVkJiZ0aGlzLnJlc2NhbGUodCksdH0saHUucHJvdG90eXBlLmNvbXB1dGVOb2Rlcz1mdW5jdGlvbih0KXt2YXIgZT10O3RoaXMuX2lzU2NhbGVkJiYoZT10aGlzLnNjYWxlKHQpKSx0aGlzLl9ub2Rlci5jb21wdXRlTm9kZXMoZSl9LGh1LnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltBYV19LGh1LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBodX07dmFyIGZ1PWZ1bmN0aW9uKCl7dGhpcy5fbGk9bmV3IFFpLHRoaXMuX3NlZ1N0cmluZ3M9bnVsbDt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5fc2VnU3RyaW5ncz10fSxwdT17ZmFjdDp7Y29uZmlndXJhYmxlOiEwfX07ZnUucHJvdG90eXBlLmNoZWNrRW5kUHRWZXJ0ZXhJbnRlcnNlY3Rpb25zPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztpZigwPT09YXJndW1lbnRzLmxlbmd0aClmb3IodmFyIGU9dGhpcy5fc2VnU3RyaW5ncy5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7dmFyIG49ZS5uZXh0KCkuZ2V0Q29vcmRpbmF0ZXMoKTt0LmNoZWNrRW5kUHRWZXJ0ZXhJbnRlcnNlY3Rpb25zKG5bMF0sdC5fc2VnU3RyaW5ncyksdC5jaGVja0VuZFB0VmVydGV4SW50ZXJzZWN0aW9ucyhuW24ubGVuZ3RoLTFdLHQuX3NlZ1N0cmluZ3MpfWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKHZhciByPWFyZ3VtZW50c1swXSxpPWFyZ3VtZW50c1sxXS5pdGVyYXRvcigpO2kuaGFzTmV4dCgpOylmb3IodmFyIG89aS5uZXh0KCkuZ2V0Q29vcmRpbmF0ZXMoKSxzPTE7czxvLmxlbmd0aC0xO3MrKylpZihvW3NdLmVxdWFscyhyKSl0aHJvdyBuZXcgV2koImZvdW5kIGVuZHB0L2ludGVyaW9yIHB0IGludGVyc2VjdGlvbiBhdCBpbmRleCAiK3MrIiA6cHQgIityKX0sZnUucHJvdG90eXBlLmNoZWNrSW50ZXJpb3JJbnRlcnNlY3Rpb25zPWZ1bmN0aW9uKCl7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKHZhciB0PXRoaXMuX3NlZ1N0cmluZ3MuaXRlcmF0b3IoKTt0Lmhhc05leHQoKTspZm9yKHZhciBlPXQubmV4dCgpLG49dGhpcy5fc2VnU3RyaW5ncy5pdGVyYXRvcigpO24uaGFzTmV4dCgpOyl7dmFyIHI9bi5uZXh0KCk7dGhpcy5jaGVja0ludGVyaW9ySW50ZXJzZWN0aW9ucyhlLHIpfWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKHZhciBpPWFyZ3VtZW50c1swXSxvPWFyZ3VtZW50c1sxXSxzPWkuZ2V0Q29vcmRpbmF0ZXMoKSxhPW8uZ2V0Q29vcmRpbmF0ZXMoKSx1PTA7dTxzLmxlbmd0aC0xO3UrKylmb3IodmFyIGM9MDtjPGEubGVuZ3RoLTE7YysrKXRoaXMuY2hlY2tJbnRlcmlvckludGVyc2VjdGlvbnMoaSx1LG8sYyk7ZWxzZSBpZig0PT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGw9YXJndW1lbnRzWzBdLGg9YXJndW1lbnRzWzFdLGY9YXJndW1lbnRzWzJdLHA9YXJndW1lbnRzWzNdO2lmKGw9PT1mJiZoPT09cClyZXR1cm4gbnVsbDt2YXIgZD1sLmdldENvb3JkaW5hdGVzKClbaF0sZz1sLmdldENvb3JkaW5hdGVzKClbaCsxXSx5PWYuZ2V0Q29vcmRpbmF0ZXMoKVtwXSxtPWYuZ2V0Q29vcmRpbmF0ZXMoKVtwKzFdO2lmKHRoaXMuX2xpLmNvbXB1dGVJbnRlcnNlY3Rpb24oZCxnLHksbSksdGhpcy5fbGkuaGFzSW50ZXJzZWN0aW9uKCkmJih0aGlzLl9saS5pc1Byb3BlcigpfHx0aGlzLmhhc0ludGVyaW9ySW50ZXJzZWN0aW9uKHRoaXMuX2xpLGQsZyl8fHRoaXMuaGFzSW50ZXJpb3JJbnRlcnNlY3Rpb24odGhpcy5fbGkseSxtKSkpdGhyb3cgbmV3IFdpKCJmb3VuZCBub24tbm9kZWQgaW50ZXJzZWN0aW9uIGF0ICIrZCsiLSIrZysiIGFuZCAiK3krIi0iK20pfX0sZnUucHJvdG90eXBlLmNoZWNrVmFsaWQ9ZnVuY3Rpb24oKXt0aGlzLmNoZWNrRW5kUHRWZXJ0ZXhJbnRlcnNlY3Rpb25zKCksdGhpcy5jaGVja0ludGVyaW9ySW50ZXJzZWN0aW9ucygpLHRoaXMuY2hlY2tDb2xsYXBzZXMoKX0sZnUucHJvdG90eXBlLmNoZWNrQ29sbGFwc2VzPWZ1bmN0aW9uKCl7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKHZhciB0PXRoaXMuX3NlZ1N0cmluZ3MuaXRlcmF0b3IoKTt0Lmhhc05leHQoKTspe3ZhciBlPXQubmV4dCgpO3RoaXMuY2hlY2tDb2xsYXBzZXMoZSl9ZWxzZSBpZigxPT09YXJndW1lbnRzLmxlbmd0aClmb3IodmFyIG49YXJndW1lbnRzWzBdLmdldENvb3JkaW5hdGVzKCkscj0wO3I8bi5sZW5ndGgtMjtyKyspdGhpcy5jaGVja0NvbGxhcHNlKG5bcl0sbltyKzFdLG5bcisyXSl9LGZ1LnByb3RvdHlwZS5oYXNJbnRlcmlvckludGVyc2VjdGlvbj1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPTA7cjx0LmdldEludGVyc2VjdGlvbk51bSgpO3IrKyl7dmFyIGk9dC5nZXRJbnRlcnNlY3Rpb24ocik7aWYoIWkuZXF1YWxzKGUpJiYhaS5lcXVhbHMobikpcmV0dXJuITB9cmV0dXJuITF9LGZ1LnByb3RvdHlwZS5jaGVja0NvbGxhcHNlPWZ1bmN0aW9uKHQsZSxuKXtpZih0LmVxdWFscyhuKSl0aHJvdyBuZXcgV2koImZvdW5kIG5vbi1ub2RlZCBjb2xsYXBzZSBhdCAiK2Z1LmZhY3QuY3JlYXRlTGluZVN0cmluZyhbdCxlLG5dKSl9LGZ1LnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxmdS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZnV9LHB1LmZhY3QuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBJc30sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZnUscHUpO3ZhciBkdT1mdW5jdGlvbigpe3RoaXMuX2xpPW51bGwsdGhpcy5fcHQ9bnVsbCx0aGlzLl9vcmlnaW5hbFB0PW51bGwsdGhpcy5fcHRTY2FsZWQ9bnVsbCx0aGlzLl9wMFNjYWxlZD1udWxsLHRoaXMuX3AxU2NhbGVkPW51bGwsdGhpcy5fc2NhbGVGYWN0b3I9bnVsbCx0aGlzLl9taW54PW51bGwsdGhpcy5fbWF4eD1udWxsLHRoaXMuX21pbnk9bnVsbCx0aGlzLl9tYXh5PW51bGwsdGhpcy5fY29ybmVyPW5ldyBBcnJheSg0KS5maWxsKG51bGwpLHRoaXMuX3NhZmVFbnY9bnVsbDt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV0sbj1hcmd1bWVudHNbMl07aWYodGhpcy5fb3JpZ2luYWxQdD10LHRoaXMuX3B0PXQsdGhpcy5fc2NhbGVGYWN0b3I9ZSx0aGlzLl9saT1uLGU8PTApdGhyb3cgbmV3IGhpOzEhPT1lJiYodGhpcy5fcHQ9bmV3IHZpKHRoaXMuc2NhbGUodC54KSx0aGlzLnNjYWxlKHQueSkpLHRoaXMuX3AwU2NhbGVkPW5ldyB2aSx0aGlzLl9wMVNjYWxlZD1uZXcgdmkpLHRoaXMuaW5pdENvcm5lcnModGhpcy5fcHQpfSxndT17U0FGRV9FTlZfRVhQQU5TSU9OX0ZBQ1RPUjp7Y29uZmlndXJhYmxlOiEwfX07ZHUucHJvdG90eXBlLmludGVyc2VjdHNTY2FsZWQ9ZnVuY3Rpb24odCxlKXt2YXIgbj1NYXRoLm1pbih0LngsZS54KSxyPU1hdGgubWF4KHQueCxlLngpLGk9TWF0aC5taW4odC55LGUueSksbz1NYXRoLm1heCh0LnksZS55KSxzPXRoaXMuX21heHg8bnx8dGhpcy5fbWlueD5yfHx0aGlzLl9tYXh5PGl8fHRoaXMuX21pbnk+bztpZihzKXJldHVybiExO3ZhciBhPXRoaXMuaW50ZXJzZWN0c1RvbGVyYW5jZVNxdWFyZSh0LGUpO3JldHVybiBaaS5pc1RydWUoIShzJiZhKSwiRm91bmQgYmFkIGVudmVsb3BlIHRlc3QiKSxhfSxkdS5wcm90b3R5cGUuaW5pdENvcm5lcnM9ZnVuY3Rpb24odCl7dmFyIGU9LjU7dGhpcy5fbWlueD10LngtZSx0aGlzLl9tYXh4PXQueCtlLHRoaXMuX21pbnk9dC55LWUsdGhpcy5fbWF4eT10LnkrZSx0aGlzLl9jb3JuZXJbMF09bmV3IHZpKHRoaXMuX21heHgsdGhpcy5fbWF4eSksdGhpcy5fY29ybmVyWzFdPW5ldyB2aSh0aGlzLl9taW54LHRoaXMuX21heHkpLHRoaXMuX2Nvcm5lclsyXT1uZXcgdmkodGhpcy5fbWlueCx0aGlzLl9taW55KSx0aGlzLl9jb3JuZXJbM109bmV3IHZpKHRoaXMuX21heHgsdGhpcy5fbWlueSl9LGR1LnByb3RvdHlwZS5pbnRlcnNlY3RzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIDE9PT10aGlzLl9zY2FsZUZhY3Rvcj90aGlzLmludGVyc2VjdHNTY2FsZWQodCxlKToodGhpcy5jb3B5U2NhbGVkKHQsdGhpcy5fcDBTY2FsZWQpLHRoaXMuY29weVNjYWxlZChlLHRoaXMuX3AxU2NhbGVkKSx0aGlzLmludGVyc2VjdHNTY2FsZWQodGhpcy5fcDBTY2FsZWQsdGhpcy5fcDFTY2FsZWQpKX0sZHUucHJvdG90eXBlLnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnJvdW5kKHQqdGhpcy5fc2NhbGVGYWN0b3IpfSxkdS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9vcmlnaW5hbFB0fSxkdS5wcm90b3R5cGUuY29weVNjYWxlZD1mdW5jdGlvbih0LGUpe2UueD10aGlzLnNjYWxlKHQueCksZS55PXRoaXMuc2NhbGUodC55KX0sZHUucHJvdG90eXBlLmdldFNhZmVFbnZlbG9wZT1mdW5jdGlvbigpe2lmKG51bGw9PT10aGlzLl9zYWZlRW52KXt2YXIgdD1kdS5TQUZFX0VOVl9FWFBBTlNJT05fRkFDVE9SL3RoaXMuX3NjYWxlRmFjdG9yO3RoaXMuX3NhZmVFbnY9bmV3IGppKHRoaXMuX29yaWdpbmFsUHQueC10LHRoaXMuX29yaWdpbmFsUHQueCt0LHRoaXMuX29yaWdpbmFsUHQueS10LHRoaXMuX29yaWdpbmFsUHQueSt0KX1yZXR1cm4gdGhpcy5fc2FmZUVudn0sZHUucHJvdG90eXBlLmludGVyc2VjdHNQaXhlbENsb3N1cmU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fbGkuY29tcHV0ZUludGVyc2VjdGlvbih0LGUsdGhpcy5fY29ybmVyWzBdLHRoaXMuX2Nvcm5lclsxXSksISEodGhpcy5fbGkuaGFzSW50ZXJzZWN0aW9uKCl8fCh0aGlzLl9saS5jb21wdXRlSW50ZXJzZWN0aW9uKHQsZSx0aGlzLl9jb3JuZXJbMV0sdGhpcy5fY29ybmVyWzJdKSx0aGlzLl9saS5oYXNJbnRlcnNlY3Rpb24oKSl8fCh0aGlzLl9saS5jb21wdXRlSW50ZXJzZWN0aW9uKHQsZSx0aGlzLl9jb3JuZXJbMl0sdGhpcy5fY29ybmVyWzNdKSx0aGlzLl9saS5oYXNJbnRlcnNlY3Rpb24oKSl8fCh0aGlzLl9saS5jb21wdXRlSW50ZXJzZWN0aW9uKHQsZSx0aGlzLl9jb3JuZXJbM10sdGhpcy5fY29ybmVyWzBdKSx0aGlzLl9saS5oYXNJbnRlcnNlY3Rpb24oKSkpfSxkdS5wcm90b3R5cGUuaW50ZXJzZWN0c1RvbGVyYW5jZVNxdWFyZT1mdW5jdGlvbih0LGUpe3ZhciBuPSExLHI9ITE7cmV0dXJuIHRoaXMuX2xpLmNvbXB1dGVJbnRlcnNlY3Rpb24odCxlLHRoaXMuX2Nvcm5lclswXSx0aGlzLl9jb3JuZXJbMV0pLCEhKHRoaXMuX2xpLmlzUHJvcGVyKCl8fCh0aGlzLl9saS5jb21wdXRlSW50ZXJzZWN0aW9uKHQsZSx0aGlzLl9jb3JuZXJbMV0sdGhpcy5fY29ybmVyWzJdKSx0aGlzLl9saS5pc1Byb3BlcigpKXx8KHRoaXMuX2xpLmhhc0ludGVyc2VjdGlvbigpJiYobj0hMCksdGhpcy5fbGkuY29tcHV0ZUludGVyc2VjdGlvbih0LGUsdGhpcy5fY29ybmVyWzJdLHRoaXMuX2Nvcm5lclszXSksdGhpcy5fbGkuaXNQcm9wZXIoKSl8fCh0aGlzLl9saS5oYXNJbnRlcnNlY3Rpb24oKSYmKHI9ITApLHRoaXMuX2xpLmNvbXB1dGVJbnRlcnNlY3Rpb24odCxlLHRoaXMuX2Nvcm5lclszXSx0aGlzLl9jb3JuZXJbMF0pLHRoaXMuX2xpLmlzUHJvcGVyKCkpfHxuJiZyfHx0LmVxdWFscyh0aGlzLl9wdCl8fGUuZXF1YWxzKHRoaXMuX3B0KSl9LGR1LnByb3RvdHlwZS5hZGRTbmFwcGVkTm9kZT1mdW5jdGlvbih0LGUpe3ZhciBuPXQuZ2V0Q29vcmRpbmF0ZShlKSxyPXQuZ2V0Q29vcmRpbmF0ZShlKzEpO3JldHVybiEhdGhpcy5pbnRlcnNlY3RzKG4scikmJih0LmFkZEludGVyc2VjdGlvbih0aGlzLmdldENvb3JkaW5hdGUoKSxlKSwhMCl9LGR1LnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxkdS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZHV9LGd1LlNBRkVfRU5WX0VYUEFOU0lPTl9GQUNUT1IuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuLjc1fSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhkdSxndSk7dmFyIHl1PWZ1bmN0aW9uKCl7dGhpcy50ZW1wRW52MT1uZXcgamksdGhpcy5zZWxlY3RlZFNlZ21lbnQ9bmV3IGJhfTt5dS5wcm90b3R5cGUuc2VsZWN0PWZ1bmN0aW9uKCl7aWYoMSE9PWFyZ3VtZW50cy5sZW5ndGgmJjI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMV07YXJndW1lbnRzWzBdLmdldExpbmVTZWdtZW50KHQsdGhpcy5zZWxlY3RlZFNlZ21lbnQpLHRoaXMuc2VsZWN0KHRoaXMuc2VsZWN0ZWRTZWdtZW50KX19LHl1LnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSx5dS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4geXV9O3ZhciBtdT1mdW5jdGlvbigpe3RoaXMuX2luZGV4PW51bGw7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuX2luZGV4PXR9LHZ1PXtIb3RQaXhlbFNuYXBBY3Rpb246e2NvbmZpZ3VyYWJsZTohMH19O211LnByb3RvdHlwZS5zbmFwPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5zbmFwKHQsbnVsbCwtMSl9aWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXSxyPWFyZ3VtZW50c1syXSxpPWUuZ2V0U2FmZUVudmVsb3BlKCksbz1uZXcgX3UoZSxuLHIpO3JldHVybiB0aGlzLl9pbmRleC5xdWVyeShpLHtpbnRlcmZhY2VzXzpmdW5jdGlvbigpe3JldHVybltyYV19LHZpc2l0SXRlbTpmdW5jdGlvbih0KXt0LnNlbGVjdChpLG8pfX0pLG8uaXNOb2RlQWRkZWQoKX19LG11LnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxtdS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gbXV9LHZ1LkhvdFBpeGVsU25hcEFjdGlvbi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gX3V9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG11LHZ1KTt2YXIgX3U9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3QuY2FsbCh0aGlzKSx0aGlzLl9ob3RQaXhlbD1udWxsLHRoaXMuX3BhcmVudEVkZ2U9bnVsbCx0aGlzLl9ob3RQaXhlbFZlcnRleEluZGV4PW51bGwsdGhpcy5faXNOb2RlQWRkZWQ9ITE7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdLHI9YXJndW1lbnRzWzJdO3RoaXMuX2hvdFBpeGVsPWUsdGhpcy5fcGFyZW50RWRnZT1uLHRoaXMuX2hvdFBpeGVsVmVydGV4SW5kZXg9cn1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuaXNOb2RlQWRkZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNOb2RlQWRkZWR9LGUucHJvdG90eXBlLnNlbGVjdD1mdW5jdGlvbigpe2lmKDIhPT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiB0LnByb3RvdHlwZS5zZWxlY3QuYXBwbHkodGhpcyxhcmd1bWVudHMpO3ZhciBlPWFyZ3VtZW50c1sxXSxuPWFyZ3VtZW50c1swXS5nZXRDb250ZXh0KCk7aWYobnVsbCE9PXRoaXMuX3BhcmVudEVkZ2UmJm49PT10aGlzLl9wYXJlbnRFZGdlJiZlPT09dGhpcy5faG90UGl4ZWxWZXJ0ZXhJbmRleClyZXR1cm4gbnVsbDt0aGlzLl9pc05vZGVBZGRlZD10aGlzLl9ob3RQaXhlbC5hZGRTbmFwcGVkTm9kZShuLGUpfSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxlfSh5dSkseHU9ZnVuY3Rpb24oKXt0aGlzLl9saT1udWxsLHRoaXMuX2ludGVyaW9ySW50ZXJzZWN0aW9ucz1udWxsO3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLl9saT10LHRoaXMuX2ludGVyaW9ySW50ZXJzZWN0aW9ucz1uZXcgeG99O3h1LnByb3RvdHlwZS5wcm9jZXNzSW50ZXJzZWN0aW9ucz1mdW5jdGlvbih0LGUsbixyKXtpZih0PT09biYmZT09PXIpcmV0dXJuIG51bGw7dmFyIGk9dC5nZXRDb29yZGluYXRlcygpW2VdLG89dC5nZXRDb29yZGluYXRlcygpW2UrMV0scz1uLmdldENvb3JkaW5hdGVzKClbcl0sYT1uLmdldENvb3JkaW5hdGVzKClbcisxXTtpZih0aGlzLl9saS5jb21wdXRlSW50ZXJzZWN0aW9uKGksbyxzLGEpLHRoaXMuX2xpLmhhc0ludGVyc2VjdGlvbigpJiZ0aGlzLl9saS5pc0ludGVyaW9ySW50ZXJzZWN0aW9uKCkpe2Zvcih2YXIgdT0wO3U8dGhpcy5fbGkuZ2V0SW50ZXJzZWN0aW9uTnVtKCk7dSsrKXRoaXMuX2ludGVyaW9ySW50ZXJzZWN0aW9ucy5hZGQodGhpcy5fbGkuZ2V0SW50ZXJzZWN0aW9uKHUpKTt0LmFkZEludGVyc2VjdGlvbnModGhpcy5fbGksZSwwKSxuLmFkZEludGVyc2VjdGlvbnModGhpcy5fbGksciwxKX19LHh1LnByb3RvdHlwZS5pc0RvbmU9ZnVuY3Rpb24oKXtyZXR1cm4hMX0seHUucHJvdG90eXBlLmdldEludGVyaW9ySW50ZXJzZWN0aW9ucz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pbnRlcmlvckludGVyc2VjdGlvbnN9LHh1LnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltldV19LHh1LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiB4dX07dmFyIHd1PWZ1bmN0aW9uKCl7dGhpcy5fcG09bnVsbCx0aGlzLl9saT1udWxsLHRoaXMuX3NjYWxlRmFjdG9yPW51bGwsdGhpcy5fbm9kZXI9bnVsbCx0aGlzLl9wb2ludFNuYXBwZXI9bnVsbCx0aGlzLl9ub2RlZFNlZ1N0cmluZ3M9bnVsbDt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5fcG09dCx0aGlzLl9saT1uZXcgUWksdGhpcy5fbGkuc2V0UHJlY2lzaW9uTW9kZWwodCksdGhpcy5fc2NhbGVGYWN0b3I9dC5nZXRTY2FsZSgpfTt3dS5wcm90b3R5cGUuY2hlY2tDb3JyZWN0bmVzcz1mdW5jdGlvbih0KXt2YXIgZT13YS5nZXROb2RlZFN1YnN0cmluZ3ModCksbj1uZXcgZnUoZSk7dHJ5e24uY2hlY2tWYWxpZCgpfWNhdGNoKHQpe2lmKCEodCBpbnN0YW5jZW9mIFJpKSl0aHJvdyB0O3QucHJpbnRTdGFja1RyYWNlKCl9fSx3dS5wcm90b3R5cGUuZ2V0Tm9kZWRTdWJzdHJpbmdzPWZ1bmN0aW9uKCl7cmV0dXJuIHdhLmdldE5vZGVkU3Vic3RyaW5ncyh0aGlzLl9ub2RlZFNlZ1N0cmluZ3MpfSx3dS5wcm90b3R5cGUuc25hcFJvdW5kPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5maW5kSW50ZXJpb3JJbnRlcnNlY3Rpb25zKHQsZSk7dGhpcy5jb21wdXRlSW50ZXJzZWN0aW9uU25hcHMobiksdGhpcy5jb21wdXRlVmVydGV4U25hcHModCl9LHd1LnByb3RvdHlwZS5maW5kSW50ZXJpb3JJbnRlcnNlY3Rpb25zPWZ1bmN0aW9uKHQsZSl7dmFyIG49bmV3IHh1KGUpO3JldHVybiB0aGlzLl9ub2Rlci5zZXRTZWdtZW50SW50ZXJzZWN0b3IobiksdGhpcy5fbm9kZXIuY29tcHV0ZU5vZGVzKHQpLG4uZ2V0SW50ZXJpb3JJbnRlcnNlY3Rpb25zKCl9LHd1LnByb3RvdHlwZS5jb21wdXRlVmVydGV4U25hcHM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKEVpKGFyZ3VtZW50c1swXSxnbykpZm9yKHZhciBlPWFyZ3VtZW50c1swXS5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7dmFyIG49ZS5uZXh0KCk7dC5jb21wdXRlVmVydGV4U25hcHMobil9ZWxzZSBpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHdhKWZvcih2YXIgcj1hcmd1bWVudHNbMF0saT1yLmdldENvb3JkaW5hdGVzKCksbz0wO288aS5sZW5ndGg7bysrKXt2YXIgcz1uZXcgZHUoaVtvXSx0Ll9zY2FsZUZhY3Rvcix0Ll9saSk7dC5fcG9pbnRTbmFwcGVyLnNuYXAocyxyLG8pJiZyLmFkZEludGVyc2VjdGlvbihpW29dLG8pfX0sd3UucHJvdG90eXBlLmNvbXB1dGVOb2Rlcz1mdW5jdGlvbih0KXt0aGlzLl9ub2RlZFNlZ1N0cmluZ3M9dCx0aGlzLl9ub2Rlcj1uZXcgSWEsdGhpcy5fcG9pbnRTbmFwcGVyPW5ldyBtdSh0aGlzLl9ub2Rlci5nZXRJbmRleCgpKSx0aGlzLnNuYXBSb3VuZCh0LHRoaXMuX2xpKX0sd3UucHJvdG90eXBlLmNvbXB1dGVJbnRlcnNlY3Rpb25TbmFwcz1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcyxuPXQuaXRlcmF0b3IoKTtuLmhhc05leHQoKTspe3ZhciByPW4ubmV4dCgpLGk9bmV3IGR1KHIsZS5fc2NhbGVGYWN0b3IsZS5fbGkpO2UuX3BvaW50U25hcHBlci5zbmFwKGkpfX0sd3UucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW0FhXX0sd3UucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHd1fTt2YXIgYnU9ZnVuY3Rpb24oKXtpZih0aGlzLl9hcmdHZW9tPW51bGwsdGhpcy5fZGlzdGFuY2U9bnVsbCx0aGlzLl9idWZQYXJhbXM9bmV3IEZhLHRoaXMuX3Jlc3VsdEdlb21ldHJ5PW51bGwsdGhpcy5fc2F2ZUV4Y2VwdGlvbj1udWxsLDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5fYXJnR2VvbT10fWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTt0aGlzLl9hcmdHZW9tPWUsdGhpcy5fYnVmUGFyYW1zPW59fSxEdT17Q0FQX1JPVU5EOntjb25maWd1cmFibGU6ITB9LENBUF9CVVRUOntjb25maWd1cmFibGU6ITB9LENBUF9GTEFUOntjb25maWd1cmFibGU6ITB9LENBUF9TUVVBUkU6e2NvbmZpZ3VyYWJsZTohMH0sTUFYX1BSRUNJU0lPTl9ESUdJVFM6e2NvbmZpZ3VyYWJsZTohMH19O2J1LnByb3RvdHlwZS5idWZmZXJGaXhlZFByZWNpc2lvbj1mdW5jdGlvbih0KXt2YXIgZT1uZXcgaHUobmV3IHd1KG5ldyBDcygxKSksdC5nZXRTY2FsZSgpKSxuPW5ldyBsdSh0aGlzLl9idWZQYXJhbXMpO24uc2V0V29ya2luZ1ByZWNpc2lvbk1vZGVsKHQpLG4uc2V0Tm9kZXIoZSksdGhpcy5fcmVzdWx0R2VvbWV0cnk9bi5idWZmZXIodGhpcy5fYXJnR2VvbSx0aGlzLl9kaXN0YW5jZSl9LGJ1LnByb3RvdHlwZS5idWZmZXJSZWR1Y2VkUHJlY2lzaW9uPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztpZigwPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKHZhciBlPWJ1Lk1BWF9QUkVDSVNJT05fRElHSVRTO2U+PTA7ZS0tKXt0cnl7dC5idWZmZXJSZWR1Y2VkUHJlY2lzaW9uKGUpfWNhdGNoKGUpe2lmKCEoZSBpbnN0YW5jZW9mIFJzKSl0aHJvdyBlO3QuX3NhdmVFeGNlcHRpb249ZX1pZihudWxsIT09dC5fcmVzdWx0R2VvbWV0cnkpcmV0dXJuIG51bGx9dGhyb3cgdGhpcy5fc2F2ZUV4Y2VwdGlvbn1pZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIG49YXJndW1lbnRzWzBdLHI9YnUucHJlY2lzaW9uU2NhbGVGYWN0b3IodGhpcy5fYXJnR2VvbSx0aGlzLl9kaXN0YW5jZSxuKSxpPW5ldyBDcyhyKTt0aGlzLmJ1ZmZlckZpeGVkUHJlY2lzaW9uKGkpfX0sYnUucHJvdG90eXBlLmNvbXB1dGVHZW9tZXRyeT1mdW5jdGlvbigpe2lmKHRoaXMuYnVmZmVyT3JpZ2luYWxQcmVjaXNpb24oKSxudWxsIT09dGhpcy5fcmVzdWx0R2VvbWV0cnkpcmV0dXJuIG51bGw7dmFyIHQ9dGhpcy5fYXJnR2VvbS5nZXRGYWN0b3J5KCkuZ2V0UHJlY2lzaW9uTW9kZWwoKTt0LmdldFR5cGUoKT09PUNzLkZJWEVEP3RoaXMuYnVmZmVyRml4ZWRQcmVjaXNpb24odCk6dGhpcy5idWZmZXJSZWR1Y2VkUHJlY2lzaW9uKCl9LGJ1LnByb3RvdHlwZS5zZXRRdWFkcmFudFNlZ21lbnRzPWZ1bmN0aW9uKHQpe3RoaXMuX2J1ZlBhcmFtcy5zZXRRdWFkcmFudFNlZ21lbnRzKHQpfSxidS5wcm90b3R5cGUuYnVmZmVyT3JpZ2luYWxQcmVjaXNpb249ZnVuY3Rpb24oKXt0cnl7dmFyIHQ9bmV3IGx1KHRoaXMuX2J1ZlBhcmFtcyk7dGhpcy5fcmVzdWx0R2VvbWV0cnk9dC5idWZmZXIodGhpcy5fYXJnR2VvbSx0aGlzLl9kaXN0YW5jZSl9Y2F0Y2godCl7aWYoISh0IGluc3RhbmNlb2YgV2kpKXRocm93IHQ7dGhpcy5fc2F2ZUV4Y2VwdGlvbj10fX0sYnUucHJvdG90eXBlLmdldFJlc3VsdEdlb21ldHJ5PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9kaXN0YW5jZT10LHRoaXMuY29tcHV0ZUdlb21ldHJ5KCksdGhpcy5fcmVzdWx0R2VvbWV0cnl9LGJ1LnByb3RvdHlwZS5zZXRFbmRDYXBTdHlsZT1mdW5jdGlvbih0KXt0aGlzLl9idWZQYXJhbXMuc2V0RW5kQ2FwU3R5bGUodCl9LGJ1LnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxidS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gYnV9LGJ1LmJ1ZmZlck9wPWZ1bmN0aW9uKCl7aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1sxXTtyZXR1cm4gbmV3IGJ1KGFyZ3VtZW50c1swXSkuZ2V0UmVzdWx0R2VvbWV0cnkodCl9aWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKE51bWJlci5pc0ludGVnZXIoYXJndW1lbnRzWzJdKSYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBpbyYmIm51bWJlciI9PXR5cGVvZiBhcmd1bWVudHNbMV0pe3ZhciBlPWFyZ3VtZW50c1sxXSxuPWFyZ3VtZW50c1syXSxyPW5ldyBidShhcmd1bWVudHNbMF0pO3JldHVybiByLnNldFF1YWRyYW50U2VnbWVudHMobiksci5nZXRSZXN1bHRHZW9tZXRyeShlKX1pZihhcmd1bWVudHNbMl1pbnN0YW5jZW9mIEZhJiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIGlvJiYibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1sxXSl7dmFyIGk9YXJndW1lbnRzWzFdO3JldHVybiBuZXcgYnUoYXJndW1lbnRzWzBdLGFyZ3VtZW50c1syXSkuZ2V0UmVzdWx0R2VvbWV0cnkoaSl9fWVsc2UgaWYoND09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBvPWFyZ3VtZW50c1sxXSxzPWFyZ3VtZW50c1syXSxhPWFyZ3VtZW50c1szXSx1PW5ldyBidShhcmd1bWVudHNbMF0pO3JldHVybiB1LnNldFF1YWRyYW50U2VnbWVudHMocyksdS5zZXRFbmRDYXBTdHlsZShhKSx1LmdldFJlc3VsdEdlb21ldHJ5KG8pfX0sYnUucHJlY2lzaW9uU2NhbGVGYWN0b3I9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXQuZ2V0RW52ZWxvcGVJbnRlcm5hbCgpLGk9Q2kubWF4KE1hdGguYWJzKHIuZ2V0TWF4WCgpKSxNYXRoLmFicyhyLmdldE1heFkoKSksTWF0aC5hYnMoci5nZXRNaW5YKCkpLE1hdGguYWJzKHIuZ2V0TWluWSgpKSkrMiooZT4wP2U6MCksbz1uLU1hdGgudHJ1bmMoTWF0aC5sb2coaSkvTWF0aC5sb2coMTApKzEpO3JldHVybiBNYXRoLnBvdygxMCxvKX0sRHUuQ0FQX1JPVU5ELmdldD1mdW5jdGlvbigpe3JldHVybiBGYS5DQVBfUk9VTkR9LER1LkNBUF9CVVRULmdldD1mdW5jdGlvbigpe3JldHVybiBGYS5DQVBfRkxBVH0sRHUuQ0FQX0ZMQVQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIEZhLkNBUF9GTEFUfSxEdS5DQVBfU1FVQVJFLmdldD1mdW5jdGlvbigpe3JldHVybiBGYS5DQVBfU1FVQVJFfSxEdS5NQVhfUFJFQ0lTSU9OX0RJR0lUUy5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMTJ9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGJ1LER1KTt2YXIgRXU9ZnVuY3Rpb24oKXt0aGlzLl9wdD1bbmV3IHZpLG5ldyB2aV0sdGhpcy5fZGlzdGFuY2U9ZmkuTmFOLHRoaXMuX2lzTnVsbD0hMH07RXUucHJvdG90eXBlLmdldENvb3JkaW5hdGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3B0fSxFdS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcHRbdF19LEV1LnByb3RvdHlwZS5zZXRNaW5pbXVtPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLnNldE1pbmltdW0odC5fcHRbMF0sdC5fcHRbMV0pfWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTtpZih0aGlzLl9pc051bGwpcmV0dXJuIHRoaXMuaW5pdGlhbGl6ZShlLG4pLG51bGw7dmFyIHI9ZS5kaXN0YW5jZShuKTtyPHRoaXMuX2Rpc3RhbmNlJiZ0aGlzLmluaXRpYWxpemUoZSxuLHIpfX0sRXUucHJvdG90eXBlLmluaXRpYWxpemU9ZnVuY3Rpb24oKXtpZigwPT09YXJndW1lbnRzLmxlbmd0aCl0aGlzLl9pc051bGw9ITA7ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdO3RoaXMuX3B0WzBdLnNldENvb3JkaW5hdGUodCksdGhpcy5fcHRbMV0uc2V0Q29vcmRpbmF0ZShlKSx0aGlzLl9kaXN0YW5jZT10LmRpc3RhbmNlKGUpLHRoaXMuX2lzTnVsbD0hMX1lbHNlIGlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbj1hcmd1bWVudHNbMF0scj1hcmd1bWVudHNbMV0saT1hcmd1bWVudHNbMl07dGhpcy5fcHRbMF0uc2V0Q29vcmRpbmF0ZShuKSx0aGlzLl9wdFsxXS5zZXRDb29yZGluYXRlKHIpLHRoaXMuX2Rpc3RhbmNlPWksdGhpcy5faXNOdWxsPSExfX0sRXUucHJvdG90eXBlLmdldERpc3RhbmNlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Rpc3RhbmNlfSxFdS5wcm90b3R5cGUuc2V0TWF4aW11bT1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5zZXRNYXhpbXVtKHQuX3B0WzBdLHQuX3B0WzFdKX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07aWYodGhpcy5faXNOdWxsKXJldHVybiB0aGlzLmluaXRpYWxpemUoZSxuKSxudWxsO3ZhciByPWUuZGlzdGFuY2Uobik7cj50aGlzLl9kaXN0YW5jZSYmdGhpcy5pbml0aWFsaXplKGUsbixyKX19LEV1LnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxFdS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gRXV9O3ZhciBDdT1mdW5jdGlvbigpe307Q3UucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LEN1LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBDdX0sQ3UuY29tcHV0ZURpc3RhbmNlPWZ1bmN0aW9uKCl7aWYoYXJndW1lbnRzWzJdaW5zdGFuY2VvZiBFdSYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBhcyYmYXJndW1lbnRzWzFdaW5zdGFuY2VvZiB2aSlmb3IodmFyIHQ9YXJndW1lbnRzWzFdLGU9YXJndW1lbnRzWzJdLG49YXJndW1lbnRzWzBdLmdldENvb3JkaW5hdGVzKCkscj1uZXcgYmEsaT0wO2k8bi5sZW5ndGgtMTtpKyspe3Iuc2V0Q29vcmRpbmF0ZXMobltpXSxuW2krMV0pO3ZhciBvPXIuY2xvc2VzdFBvaW50KHQpO2Uuc2V0TWluaW11bShvLHQpfWVsc2UgaWYoYXJndW1lbnRzWzJdaW5zdGFuY2VvZiBFdSYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBocyYmYXJndW1lbnRzWzFdaW5zdGFuY2VvZiB2aSl7dmFyIHM9YXJndW1lbnRzWzBdLGE9YXJndW1lbnRzWzFdLHU9YXJndW1lbnRzWzJdO0N1LmNvbXB1dGVEaXN0YW5jZShzLmdldEV4dGVyaW9yUmluZygpLGEsdSk7Zm9yKHZhciBjPTA7YzxzLmdldE51bUludGVyaW9yUmluZygpO2MrKylDdS5jb21wdXRlRGlzdGFuY2Uocy5nZXRJbnRlcmlvclJpbmdOKGMpLGEsdSl9ZWxzZSBpZihhcmd1bWVudHNbMl1pbnN0YW5jZW9mIEV1JiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIGlvJiZhcmd1bWVudHNbMV1pbnN0YW5jZW9mIHZpKXt2YXIgbD1hcmd1bWVudHNbMF0saD1hcmd1bWVudHNbMV0sZj1hcmd1bWVudHNbMl07aWYobCBpbnN0YW5jZW9mIGFzKUN1LmNvbXB1dGVEaXN0YW5jZShsLGgsZik7ZWxzZSBpZihsIGluc3RhbmNlb2YgaHMpQ3UuY29tcHV0ZURpc3RhbmNlKGwsaCxmKTtlbHNlIGlmKGwgaW5zdGFuY2VvZiBIbylmb3IodmFyIHA9bCxkPTA7ZDxwLmdldE51bUdlb21ldHJpZXMoKTtkKyspe3ZhciBnPXAuZ2V0R2VvbWV0cnlOKGQpO0N1LmNvbXB1dGVEaXN0YW5jZShnLGgsZil9ZWxzZSBmLnNldE1pbmltdW0obC5nZXRDb29yZGluYXRlKCksaCl9ZWxzZSBpZihhcmd1bWVudHNbMl1pbnN0YW5jZW9mIEV1JiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIGJhJiZhcmd1bWVudHNbMV1pbnN0YW5jZW9mIHZpKXt2YXIgeT1hcmd1bWVudHNbMV0sbT1hcmd1bWVudHNbMl0sdj1hcmd1bWVudHNbMF0uY2xvc2VzdFBvaW50KHkpO20uc2V0TWluaW11bSh2LHkpfX07dmFyIFN1PWZ1bmN0aW9uKHQpe3RoaXMuX21heFB0RGlzdD1uZXcgRXUsdGhpcy5faW5wdXRHZW9tPXR8fG51bGx9LEF1PXtNYXhQb2ludERpc3RhbmNlRmlsdGVyOntjb25maWd1cmFibGU6ITB9LE1heE1pZHBvaW50RGlzdGFuY2VGaWx0ZXI6e2NvbmZpZ3VyYWJsZTohMH19O1N1LnByb3RvdHlwZS5jb21wdXRlTWF4TWlkcG9pbnREaXN0YW5jZT1mdW5jdGlvbih0KXt2YXIgZT1uZXcgSXUodGhpcy5faW5wdXRHZW9tKTt0LmFwcGx5KGUpLHRoaXMuX21heFB0RGlzdC5zZXRNYXhpbXVtKGUuZ2V0TWF4UG9pbnREaXN0YW5jZSgpKX0sU3UucHJvdG90eXBlLmNvbXB1dGVNYXhWZXJ0ZXhEaXN0YW5jZT1mdW5jdGlvbih0KXt2YXIgZT1uZXcgTnUodGhpcy5faW5wdXRHZW9tKTt0LmFwcGx5KGUpLHRoaXMuX21heFB0RGlzdC5zZXRNYXhpbXVtKGUuZ2V0TWF4UG9pbnREaXN0YW5jZSgpKX0sU3UucHJvdG90eXBlLmZpbmREaXN0YW5jZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jb21wdXRlTWF4VmVydGV4RGlzdGFuY2UodCksdGhpcy5jb21wdXRlTWF4TWlkcG9pbnREaXN0YW5jZSh0KSx0aGlzLl9tYXhQdERpc3QuZ2V0RGlzdGFuY2UoKX0sU3UucHJvdG90eXBlLmdldERpc3RhbmNlUG9pbnRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21heFB0RGlzdH0sU3UucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LFN1LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBTdX0sQXUuTWF4UG9pbnREaXN0YW5jZUZpbHRlci5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gTnV9LEF1Lk1heE1pZHBvaW50RGlzdGFuY2VGaWx0ZXIuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIEl1fSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhTdSxBdSk7dmFyIE51PWZ1bmN0aW9uKHQpe3RoaXMuX21heFB0RGlzdD1uZXcgRXUsdGhpcy5fbWluUHREaXN0PW5ldyBFdSx0aGlzLl9nZW9tPXR8fG51bGx9O051LnByb3RvdHlwZS5maWx0ZXI9ZnVuY3Rpb24odCl7dGhpcy5fbWluUHREaXN0LmluaXRpYWxpemUoKSxDdS5jb21wdXRlRGlzdGFuY2UodGhpcy5fZ2VvbSx0LHRoaXMuX21pblB0RGlzdCksdGhpcy5fbWF4UHREaXN0LnNldE1heGltdW0odGhpcy5fbWluUHREaXN0KX0sTnUucHJvdG90eXBlLmdldE1heFBvaW50RGlzdGFuY2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWF4UHREaXN0fSxOdS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bYW9dfSxOdS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gTnV9O3ZhciBJdT1mdW5jdGlvbih0KXt0aGlzLl9tYXhQdERpc3Q9bmV3IEV1LHRoaXMuX21pblB0RGlzdD1uZXcgRXUsdGhpcy5fZ2VvbT10fHxudWxsfTtJdS5wcm90b3R5cGUuZmlsdGVyPWZ1bmN0aW9uKHQsZSl7aWYoMD09PWUpcmV0dXJuIG51bGw7dmFyIG49dC5nZXRDb29yZGluYXRlKGUtMSkscj10LmdldENvb3JkaW5hdGUoZSksaT1uZXcgdmkoKG4ueCtyLngpLzIsKG4ueStyLnkpLzIpO3RoaXMuX21pblB0RGlzdC5pbml0aWFsaXplKCksQ3UuY29tcHV0ZURpc3RhbmNlKHRoaXMuX2dlb20saSx0aGlzLl9taW5QdERpc3QpLHRoaXMuX21heFB0RGlzdC5zZXRNYXhpbXVtKHRoaXMuX21pblB0RGlzdCl9LEl1LnByb3RvdHlwZS5pc0RvbmU9ZnVuY3Rpb24oKXtyZXR1cm4hMX0sSXUucHJvdG90eXBlLmlzR2VvbWV0cnlDaGFuZ2VkPWZ1bmN0aW9uKCl7cmV0dXJuITF9LEl1LnByb3RvdHlwZS5nZXRNYXhQb2ludERpc3RhbmNlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21heFB0RGlzdH0sSXUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW1dvXX0sSXUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIEl1fTt2YXIgTXU9ZnVuY3Rpb24odCl7dGhpcy5fY29tcHM9dHx8bnVsbH07TXUucHJvdG90eXBlLmZpbHRlcj1mdW5jdGlvbih0KXt0IGluc3RhbmNlb2YgaHMmJnRoaXMuX2NvbXBzLmFkZCh0KX0sTXUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW1hvXX0sTXUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIE11fSxNdS5nZXRQb2x5Z29ucz1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiBNdS5nZXRQb2x5Z29ucyhhcmd1bWVudHNbMF0sbmV3IHhvKTtpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdO3JldHVybiB0IGluc3RhbmNlb2YgaHM/ZS5hZGQodCk6dCBpbnN0YW5jZW9mIEhvJiZ0LmFwcGx5KG5ldyBNdShlKSksZX19O3ZhciBGdT1mdW5jdGlvbigpe2lmKHRoaXMuX2xpbmVzPW51bGwsdGhpcy5faXNGb3JjZWRUb0xpbmVTdHJpbmc9ITEsMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLl9saW5lcz10fWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTt0aGlzLl9saW5lcz1lLHRoaXMuX2lzRm9yY2VkVG9MaW5lU3RyaW5nPW59fTtGdS5wcm90b3R5cGUuZmlsdGVyPWZ1bmN0aW9uKHQpe2lmKHRoaXMuX2lzRm9yY2VkVG9MaW5lU3RyaW5nJiZ0IGluc3RhbmNlb2YgcHMpe3ZhciBlPXQuZ2V0RmFjdG9yeSgpLmNyZWF0ZUxpbmVTdHJpbmcodC5nZXRDb29yZGluYXRlU2VxdWVuY2UoKSk7cmV0dXJuIHRoaXMuX2xpbmVzLmFkZChlKSxudWxsfXQgaW5zdGFuY2VvZiBhcyYmdGhpcy5fbGluZXMuYWRkKHQpfSxGdS5wcm90b3R5cGUuc2V0Rm9yY2VUb0xpbmVTdHJpbmc9ZnVuY3Rpb24odCl7dGhpcy5faXNGb3JjZWRUb0xpbmVTdHJpbmc9dH0sRnUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW3JvXX0sRnUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIEZ1fSxGdS5nZXRHZW9tZXRyeT1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIHQuZ2V0RmFjdG9yeSgpLmJ1aWxkR2VvbWV0cnkoRnUuZ2V0TGluZXModCkpfWlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07cmV0dXJuIGUuZ2V0RmFjdG9yeSgpLmJ1aWxkR2VvbWV0cnkoRnUuZ2V0TGluZXMoZSxuKSl9fSxGdS5nZXRMaW5lcz1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiBGdS5nZXRMaW5lcyhhcmd1bWVudHNbMF0sITEpO2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXtpZihFaShhcmd1bWVudHNbMF0sZ28pJiZFaShhcmd1bWVudHNbMV0sZ28pKXtmb3IodmFyIHQ9YXJndW1lbnRzWzFdLGU9YXJndW1lbnRzWzBdLml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXt2YXIgbj1lLm5leHQoKTtGdS5nZXRMaW5lcyhuLHQpfXJldHVybiB0fWlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgaW8mJiJib29sZWFuIj09dHlwZW9mIGFyZ3VtZW50c1sxXSl7dmFyIHI9YXJndW1lbnRzWzBdLGk9YXJndW1lbnRzWzFdLG89bmV3IHhvO3JldHVybiByLmFwcGx5KG5ldyBGdShvLGkpKSxvfWlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgaW8mJkVpKGFyZ3VtZW50c1sxXSxnbykpe3ZhciBzPWFyZ3VtZW50c1swXSxhPWFyZ3VtZW50c1sxXTtyZXR1cm4gcyBpbnN0YW5jZW9mIGFzP2EuYWRkKHMpOnMuYXBwbHkobmV3IEZ1KGEpKSxhfX1lbHNlIGlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXtpZigiYm9vbGVhbiI9PXR5cGVvZiBhcmd1bWVudHNbMl0mJkVpKGFyZ3VtZW50c1swXSxnbykmJkVpKGFyZ3VtZW50c1sxXSxnbykpe2Zvcih2YXIgdT1hcmd1bWVudHNbMV0sYz1hcmd1bWVudHNbMl0sbD1hcmd1bWVudHNbMF0uaXRlcmF0b3IoKTtsLmhhc05leHQoKTspe3ZhciBoPWwubmV4dCgpO0Z1LmdldExpbmVzKGgsdSxjKX1yZXR1cm4gdX1pZigiYm9vbGVhbiI9PXR5cGVvZiBhcmd1bWVudHNbMl0mJmFyZ3VtZW50c1swXWluc3RhbmNlb2YgaW8mJkVpKGFyZ3VtZW50c1sxXSxnbykpe3ZhciBmPWFyZ3VtZW50c1sxXSxwPWFyZ3VtZW50c1syXTtyZXR1cm4gYXJndW1lbnRzWzBdLmFwcGx5KG5ldyBGdShmLHApKSxmfX19O3ZhciBUdT1mdW5jdGlvbigpe2lmKHRoaXMuX2JvdW5kYXJ5UnVsZT11by5PR0NfU0ZTX0JPVU5EQVJZX1JVTEUsdGhpcy5faXNJbj1udWxsLHRoaXMuX251bUJvdW5kYXJpZXM9bnVsbCwwIT09YXJndW1lbnRzLmxlbmd0aCYmMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTtpZihudWxsPT09dCl0aHJvdyBuZXcgaGk7dGhpcy5fYm91bmRhcnlSdWxlPXR9fTtUdS5wcm90b3R5cGUubG9jYXRlSW50ZXJuYWw9ZnVuY3Rpb24oKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHZpJiZhcmd1bWVudHNbMV1pbnN0YW5jZW9mIGhzKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV07aWYoZS5pc0VtcHR5KCkpcmV0dXJuIGJpLkVYVEVSSU9SO3ZhciBuPWUuZ2V0RXh0ZXJpb3JSaW5nKCkscj10aGlzLmxvY2F0ZUluUG9seWdvblJpbmcodCxuKTtpZihyPT09YmkuRVhURVJJT1IpcmV0dXJuIGJpLkVYVEVSSU9SO2lmKHI9PT1iaS5CT1VOREFSWSlyZXR1cm4gYmkuQk9VTkRBUlk7Zm9yKHZhciBpPTA7aTxlLmdldE51bUludGVyaW9yUmluZygpO2krKyl7dmFyIG89ZS5nZXRJbnRlcmlvclJpbmdOKGkpLHM9dGhpcy5sb2NhdGVJblBvbHlnb25SaW5nKHQsbyk7aWYocz09PWJpLklOVEVSSU9SKXJldHVybiBiaS5FWFRFUklPUjtpZihzPT09YmkuQk9VTkRBUlkpcmV0dXJuIGJpLkJPVU5EQVJZfXJldHVybiBiaS5JTlRFUklPUn1pZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHZpJiZhcmd1bWVudHNbMV1pbnN0YW5jZW9mIGFzKXt2YXIgYT1hcmd1bWVudHNbMF0sdT1hcmd1bWVudHNbMV07aWYoIXUuZ2V0RW52ZWxvcGVJbnRlcm5hbCgpLmludGVyc2VjdHMoYSkpcmV0dXJuIGJpLkVYVEVSSU9SO3ZhciBjPXUuZ2V0Q29vcmRpbmF0ZXMoKTtyZXR1cm4gdS5pc0Nsb3NlZCgpfHwhYS5lcXVhbHMoY1swXSkmJiFhLmVxdWFscyhjW2MubGVuZ3RoLTFdKT9lby5pc09uTGluZShhLGMpP2JpLklOVEVSSU9SOmJpLkVYVEVSSU9SOmJpLkJPVU5EQVJZfWlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgdmkmJmFyZ3VtZW50c1sxXWluc3RhbmNlb2YgY3Mpe3ZhciBsPWFyZ3VtZW50c1swXTtyZXR1cm4gYXJndW1lbnRzWzFdLmdldENvb3JkaW5hdGUoKS5lcXVhbHMyRChsKT9iaS5JTlRFUklPUjpiaS5FWFRFUklPUn19LFR1LnByb3RvdHlwZS5sb2NhdGVJblBvbHlnb25SaW5nPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUuZ2V0RW52ZWxvcGVJbnRlcm5hbCgpLmludGVyc2VjdHModCk/ZW8ubG9jYXRlUG9pbnRJblJpbmcodCxlLmdldENvb3JkaW5hdGVzKCkpOmJpLkVYVEVSSU9SfSxUdS5wcm90b3R5cGUuaW50ZXJzZWN0cz1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmxvY2F0ZSh0LGUpIT09YmkuRVhURVJJT1J9LFR1LnByb3RvdHlwZS51cGRhdGVMb2NhdGlvbkluZm89ZnVuY3Rpb24odCl7dD09PWJpLklOVEVSSU9SJiYodGhpcy5faXNJbj0hMCksdD09PWJpLkJPVU5EQVJZJiZ0aGlzLl9udW1Cb3VuZGFyaWVzKyt9LFR1LnByb3RvdHlwZS5jb21wdXRlTG9jYXRpb249ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO2lmKGUgaW5zdGFuY2VvZiBjcyYmdGhpcy51cGRhdGVMb2NhdGlvbkluZm8odGhpcy5sb2NhdGVJbnRlcm5hbCh0LGUpKSxlIGluc3RhbmNlb2YgYXMpdGhpcy51cGRhdGVMb2NhdGlvbkluZm8odGhpcy5sb2NhdGVJbnRlcm5hbCh0LGUpKTtlbHNlIGlmKGUgaW5zdGFuY2VvZiBocyl0aGlzLnVwZGF0ZUxvY2F0aW9uSW5mbyh0aGlzLmxvY2F0ZUludGVybmFsKHQsZSkpO2Vsc2UgaWYoZSBpbnN0YW5jZW9mIFpvKWZvcih2YXIgcj1lLGk9MDtpPHIuZ2V0TnVtR2VvbWV0cmllcygpO2krKyl7dmFyIG89ci5nZXRHZW9tZXRyeU4oaSk7bi51cGRhdGVMb2NhdGlvbkluZm8obi5sb2NhdGVJbnRlcm5hbCh0LG8pKX1lbHNlIGlmKGUgaW5zdGFuY2VvZiBkcylmb3IodmFyIHM9ZSxhPTA7YTxzLmdldE51bUdlb21ldHJpZXMoKTthKyspe3ZhciB1PXMuZ2V0R2VvbWV0cnlOKGEpO24udXBkYXRlTG9jYXRpb25JbmZvKG4ubG9jYXRlSW50ZXJuYWwodCx1KSl9ZWxzZSBpZihlIGluc3RhbmNlb2YgSG8pZm9yKHZhciBjPW5ldyBIYShlKTtjLmhhc05leHQoKTspe3ZhciBsPWMubmV4dCgpO2whPT1lJiZuLmNvbXB1dGVMb2NhdGlvbih0LGwpfX0sVHUucHJvdG90eXBlLmxvY2F0ZT1mdW5jdGlvbih0LGUpe3JldHVybiBlLmlzRW1wdHkoKT9iaS5FWFRFUklPUjplIGluc3RhbmNlb2YgYXN8fGUgaW5zdGFuY2VvZiBocz90aGlzLmxvY2F0ZUludGVybmFsKHQsZSk6KHRoaXMuX2lzSW49ITEsdGhpcy5fbnVtQm91bmRhcmllcz0wLHRoaXMuY29tcHV0ZUxvY2F0aW9uKHQsZSksdGhpcy5fYm91bmRhcnlSdWxlLmlzSW5Cb3VuZGFyeSh0aGlzLl9udW1Cb3VuZGFyaWVzKT9iaS5CT1VOREFSWTp0aGlzLl9udW1Cb3VuZGFyaWVzPjB8fHRoaXMuX2lzSW4/YmkuSU5URVJJT1I6YmkuRVhURVJJT1IpfSxUdS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sVHUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFR1fTt2YXIgT3U9ZnVuY3Rpb24gdCgpe2lmKHRoaXMuX2NvbXBvbmVudD1udWxsLHRoaXMuX3NlZ0luZGV4PW51bGwsdGhpcy5fcHQ9bnVsbCwyPT09YXJndW1lbnRzLmxlbmd0aCl0LmNhbGwodGhpcyxhcmd1bWVudHNbMF0sdC5JTlNJREVfQVJFQSxhcmd1bWVudHNbMV0pO2Vsc2UgaWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXSxyPWFyZ3VtZW50c1syXTt0aGlzLl9jb21wb25lbnQ9ZSx0aGlzLl9zZWdJbmRleD1uLHRoaXMuX3B0PXJ9fSxMdT17SU5TSURFX0FSRUE6e2NvbmZpZ3VyYWJsZTohMH19O091LnByb3RvdHlwZS5pc0luc2lkZUFyZWE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2VnSW5kZXg9PT1PdS5JTlNJREVfQVJFQX0sT3UucHJvdG90eXBlLmdldENvb3JkaW5hdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHR9LE91LnByb3RvdHlwZS5nZXRHZW9tZXRyeUNvbXBvbmVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb21wb25lbnR9LE91LnByb3RvdHlwZS5nZXRTZWdtZW50SW5kZXg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2VnSW5kZXh9LE91LnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxPdS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gT3V9LEx1LklOU0lERV9BUkVBLmdldD1mdW5jdGlvbigpe3JldHVybi0xfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhPdSxMdSk7dmFyIFB1PWZ1bmN0aW9uKHQpe3RoaXMuX3B0cz10fHxudWxsfTtQdS5wcm90b3R5cGUuZmlsdGVyPWZ1bmN0aW9uKHQpe3QgaW5zdGFuY2VvZiBjcyYmdGhpcy5fcHRzLmFkZCh0KX0sUHUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW1hvXX0sUHUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFB1fSxQdS5nZXRQb2ludHM9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiB0IGluc3RhbmNlb2YgY3M/YWEuc2luZ2xldG9uTGlzdCh0KTpQdS5nZXRQb2ludHModCxuZXcgeG8pfWlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07cmV0dXJuIGUgaW5zdGFuY2VvZiBjcz9uLmFkZChlKTplIGluc3RhbmNlb2YgSG8mJmUuYXBwbHkobmV3IFB1KG4pKSxufX07dmFyIFJ1PWZ1bmN0aW9uKCl7dGhpcy5fbG9jYXRpb25zPW51bGw7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuX2xvY2F0aW9ucz10fTtSdS5wcm90b3R5cGUuZmlsdGVyPWZ1bmN0aW9uKHQpeyh0IGluc3RhbmNlb2YgY3N8fHQgaW5zdGFuY2VvZiBhc3x8dCBpbnN0YW5jZW9mIGhzKSYmdGhpcy5fbG9jYXRpb25zLmFkZChuZXcgT3UodCwwLHQuZ2V0Q29vcmRpbmF0ZSgpKSl9LFJ1LnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltYb119LFJ1LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBSdX0sUnUuZ2V0TG9jYXRpb25zPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyB4bztyZXR1cm4gdC5hcHBseShuZXcgUnUoZSkpLGV9O3ZhciBCdT1mdW5jdGlvbigpe2lmKHRoaXMuX2dlb209bnVsbCx0aGlzLl90ZXJtaW5hdGVEaXN0YW5jZT0wLHRoaXMuX3B0TG9jYXRvcj1uZXcgVHUsdGhpcy5fbWluRGlzdGFuY2VMb2NhdGlvbj1udWxsLHRoaXMuX21pbkRpc3RhbmNlPWZpLk1BWF9WQUxVRSwyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdO3RoaXMuX2dlb209W3QsZV0sdGhpcy5fdGVybWluYXRlRGlzdGFuY2U9MH1lbHNlIGlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbj1hcmd1bWVudHNbMF0scj1hcmd1bWVudHNbMV0saT1hcmd1bWVudHNbMl07dGhpcy5fZ2VvbT1uZXcgQXJyYXkoMikuZmlsbChudWxsKSx0aGlzLl9nZW9tWzBdPW4sdGhpcy5fZ2VvbVsxXT1yLHRoaXMuX3Rlcm1pbmF0ZURpc3RhbmNlPWl9fTtCdS5wcm90b3R5cGUuY29tcHV0ZUNvbnRhaW5tZW50RGlzdGFuY2U9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1uZXcgQXJyYXkoMikuZmlsbChudWxsKTtpZih0aGlzLmNvbXB1dGVDb250YWlubWVudERpc3RhbmNlKDAsZSksdGhpcy5fbWluRGlzdGFuY2U8PXRoaXMuX3Rlcm1pbmF0ZURpc3RhbmNlKXJldHVybiBudWxsO3RoaXMuY29tcHV0ZUNvbnRhaW5tZW50RGlzdGFuY2UoMSxlKX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbj1hcmd1bWVudHNbMF0scj1hcmd1bWVudHNbMV0saT0xLW4sbz1NdS5nZXRQb2x5Z29ucyh0aGlzLl9nZW9tW25dKTtpZihvLnNpemUoKT4wKXt2YXIgcz1SdS5nZXRMb2NhdGlvbnModGhpcy5fZ2VvbVtpXSk7aWYodGhpcy5jb21wdXRlQ29udGFpbm1lbnREaXN0YW5jZShzLG8sciksdGhpcy5fbWluRGlzdGFuY2U8PXRoaXMuX3Rlcm1pbmF0ZURpc3RhbmNlKXJldHVybiB0aGlzLl9taW5EaXN0YW5jZUxvY2F0aW9uW2ldPXJbMF0sdGhpcy5fbWluRGlzdGFuY2VMb2NhdGlvbltuXT1yWzFdLG51bGx9fWVsc2UgaWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpaWYoYXJndW1lbnRzWzJdaW5zdGFuY2VvZiBBcnJheSYmRWkoYXJndW1lbnRzWzBdLHZvKSYmRWkoYXJndW1lbnRzWzFdLHZvKSl7Zm9yKHZhciBhPWFyZ3VtZW50c1swXSx1PWFyZ3VtZW50c1sxXSxjPWFyZ3VtZW50c1syXSxsPTA7bDxhLnNpemUoKTtsKyspZm9yKHZhciBoPWEuZ2V0KGwpLGY9MDtmPHUuc2l6ZSgpO2YrKylpZih0LmNvbXB1dGVDb250YWlubWVudERpc3RhbmNlKGgsdS5nZXQoZiksYyksdC5fbWluRGlzdGFuY2U8PXQuX3Rlcm1pbmF0ZURpc3RhbmNlKXJldHVybiBudWxsfWVsc2UgaWYoYXJndW1lbnRzWzJdaW5zdGFuY2VvZiBBcnJheSYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBPdSYmYXJndW1lbnRzWzFdaW5zdGFuY2VvZiBocyl7dmFyIHA9YXJndW1lbnRzWzBdLGQ9YXJndW1lbnRzWzFdLGc9YXJndW1lbnRzWzJdLHk9cC5nZXRDb29yZGluYXRlKCk7aWYoYmkuRVhURVJJT1IhPT10aGlzLl9wdExvY2F0b3IubG9jYXRlKHksZCkpcmV0dXJuIHRoaXMuX21pbkRpc3RhbmNlPTAsZ1swXT1wLGdbMV09bmV3IE91KGQseSksbnVsbH19LEJ1LnByb3RvdHlwZS5jb21wdXRlTWluRGlzdGFuY2VMaW5lc1BvaW50cz1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPXRoaXMsaT0wO2k8dC5zaXplKCk7aSsrKWZvcih2YXIgbz10LmdldChpKSxzPTA7czxlLnNpemUoKTtzKyspe3ZhciBhPWUuZ2V0KHMpO2lmKHIuY29tcHV0ZU1pbkRpc3RhbmNlKG8sYSxuKSxyLl9taW5EaXN0YW5jZTw9ci5fdGVybWluYXRlRGlzdGFuY2UpcmV0dXJuIG51bGx9fSxCdS5wcm90b3R5cGUuY29tcHV0ZUZhY2V0RGlzdGFuY2U9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgQXJyYXkoMikuZmlsbChudWxsKSxlPUZ1LmdldExpbmVzKHRoaXMuX2dlb21bMF0pLG49RnUuZ2V0TGluZXModGhpcy5fZ2VvbVsxXSkscj1QdS5nZXRQb2ludHModGhpcy5fZ2VvbVswXSksaT1QdS5nZXRQb2ludHModGhpcy5fZ2VvbVsxXSk7aWYodGhpcy5jb21wdXRlTWluRGlzdGFuY2VMaW5lcyhlLG4sdCksdGhpcy51cGRhdGVNaW5EaXN0YW5jZSh0LCExKSx0aGlzLl9taW5EaXN0YW5jZTw9dGhpcy5fdGVybWluYXRlRGlzdGFuY2V8fCh0WzBdPW51bGwsdFsxXT1udWxsLHRoaXMuY29tcHV0ZU1pbkRpc3RhbmNlTGluZXNQb2ludHMoZSxpLHQpLHRoaXMudXBkYXRlTWluRGlzdGFuY2UodCwhMSksdGhpcy5fbWluRGlzdGFuY2U8PXRoaXMuX3Rlcm1pbmF0ZURpc3RhbmNlKXx8KHRbMF09bnVsbCx0WzFdPW51bGwsdGhpcy5jb21wdXRlTWluRGlzdGFuY2VMaW5lc1BvaW50cyhuLHIsdCksdGhpcy51cGRhdGVNaW5EaXN0YW5jZSh0LCEwKSx0aGlzLl9taW5EaXN0YW5jZTw9dGhpcy5fdGVybWluYXRlRGlzdGFuY2UpKXJldHVybiBudWxsO3RbMF09bnVsbCx0WzFdPW51bGwsdGhpcy5jb21wdXRlTWluRGlzdGFuY2VQb2ludHMocixpLHQpLHRoaXMudXBkYXRlTWluRGlzdGFuY2UodCwhMSl9LEJ1LnByb3RvdHlwZS5uZWFyZXN0TG9jYXRpb25zPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29tcHV0ZU1pbkRpc3RhbmNlKCksdGhpcy5fbWluRGlzdGFuY2VMb2NhdGlvbn0sQnUucHJvdG90eXBlLnVwZGF0ZU1pbkRpc3RhbmNlPWZ1bmN0aW9uKHQsZSl7aWYobnVsbD09PXRbMF0pcmV0dXJuIG51bGw7ZT8odGhpcy5fbWluRGlzdGFuY2VMb2NhdGlvblswXT10WzFdLHRoaXMuX21pbkRpc3RhbmNlTG9jYXRpb25bMV09dFswXSk6KHRoaXMuX21pbkRpc3RhbmNlTG9jYXRpb25bMF09dFswXSx0aGlzLl9taW5EaXN0YW5jZUxvY2F0aW9uWzFdPXRbMV0pfSxCdS5wcm90b3R5cGUubmVhcmVzdFBvaW50cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbXB1dGVNaW5EaXN0YW5jZSgpLFt0aGlzLl9taW5EaXN0YW5jZUxvY2F0aW9uWzBdLmdldENvb3JkaW5hdGUoKSx0aGlzLl9taW5EaXN0YW5jZUxvY2F0aW9uWzFdLmdldENvb3JkaW5hdGUoKV19LEJ1LnByb3RvdHlwZS5jb21wdXRlTWluRGlzdGFuY2U9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXtpZihudWxsIT09dGhpcy5fbWluRGlzdGFuY2VMb2NhdGlvbnx8KHRoaXMuX21pbkRpc3RhbmNlTG9jYXRpb249bmV3IEFycmF5KDIpLmZpbGwobnVsbCksdGhpcy5jb21wdXRlQ29udGFpbm1lbnREaXN0YW5jZSgpLHRoaXMuX21pbkRpc3RhbmNlPD10aGlzLl90ZXJtaW5hdGVEaXN0YW5jZSkpcmV0dXJuIG51bGw7dGhpcy5jb21wdXRlRmFjZXREaXN0YW5jZSgpfWVsc2UgaWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpaWYoYXJndW1lbnRzWzJdaW5zdGFuY2VvZiBBcnJheSYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBhcyYmYXJndW1lbnRzWzFdaW5zdGFuY2VvZiBjcyl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdLHI9YXJndW1lbnRzWzJdO2lmKGUuZ2V0RW52ZWxvcGVJbnRlcm5hbCgpLmRpc3RhbmNlKG4uZ2V0RW52ZWxvcGVJbnRlcm5hbCgpKT50aGlzLl9taW5EaXN0YW5jZSlyZXR1cm4gbnVsbDtmb3IodmFyIGk9ZS5nZXRDb29yZGluYXRlcygpLG89bi5nZXRDb29yZGluYXRlKCkscz0wO3M8aS5sZW5ndGgtMTtzKyspe3ZhciBhPWVvLmRpc3RhbmNlUG9pbnRMaW5lKG8saVtzXSxpW3MrMV0pO2lmKGE8dC5fbWluRGlzdGFuY2Upe3QuX21pbkRpc3RhbmNlPWE7dmFyIHU9bmV3IGJhKGlbc10saVtzKzFdKS5jbG9zZXN0UG9pbnQobyk7clswXT1uZXcgT3UoZSxzLHUpLHJbMV09bmV3IE91KG4sMCxvKX1pZih0Ll9taW5EaXN0YW5jZTw9dC5fdGVybWluYXRlRGlzdGFuY2UpcmV0dXJuIG51bGx9fWVsc2UgaWYoYXJndW1lbnRzWzJdaW5zdGFuY2VvZiBBcnJheSYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBhcyYmYXJndW1lbnRzWzFdaW5zdGFuY2VvZiBhcyl7dmFyIGM9YXJndW1lbnRzWzBdLGw9YXJndW1lbnRzWzFdLGg9YXJndW1lbnRzWzJdO2lmKGMuZ2V0RW52ZWxvcGVJbnRlcm5hbCgpLmRpc3RhbmNlKGwuZ2V0RW52ZWxvcGVJbnRlcm5hbCgpKT50aGlzLl9taW5EaXN0YW5jZSlyZXR1cm4gbnVsbDtmb3IodmFyIGY9Yy5nZXRDb29yZGluYXRlcygpLHA9bC5nZXRDb29yZGluYXRlcygpLGQ9MDtkPGYubGVuZ3RoLTE7ZCsrKWZvcih2YXIgZz0wO2c8cC5sZW5ndGgtMTtnKyspe3ZhciB5PWVvLmRpc3RhbmNlTGluZUxpbmUoZltkXSxmW2QrMV0scFtnXSxwW2crMV0pO2lmKHk8dC5fbWluRGlzdGFuY2Upe3QuX21pbkRpc3RhbmNlPXk7dmFyIG09bmV3IGJhKGZbZF0sZltkKzFdKSx2PW5ldyBiYShwW2ddLHBbZysxXSksXz1tLmNsb3Nlc3RQb2ludHModik7aFswXT1uZXcgT3UoYyxkLF9bMF0pLGhbMV09bmV3IE91KGwsZyxfWzFdKX1pZih0Ll9taW5EaXN0YW5jZTw9dC5fdGVybWluYXRlRGlzdGFuY2UpcmV0dXJuIG51bGx9fX0sQnUucHJvdG90eXBlLmNvbXB1dGVNaW5EaXN0YW5jZVBvaW50cz1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPXRoaXMsaT0wO2k8dC5zaXplKCk7aSsrKWZvcih2YXIgbz10LmdldChpKSxzPTA7czxlLnNpemUoKTtzKyspe3ZhciBhPWUuZ2V0KHMpLHU9by5nZXRDb29yZGluYXRlKCkuZGlzdGFuY2UoYS5nZXRDb29yZGluYXRlKCkpO2lmKHU8ci5fbWluRGlzdGFuY2UmJihyLl9taW5EaXN0YW5jZT11LG5bMF09bmV3IE91KG8sMCxvLmdldENvb3JkaW5hdGUoKSksblsxXT1uZXcgT3UoYSwwLGEuZ2V0Q29vcmRpbmF0ZSgpKSksci5fbWluRGlzdGFuY2U8PXIuX3Rlcm1pbmF0ZURpc3RhbmNlKXJldHVybiBudWxsfX0sQnUucHJvdG90eXBlLmRpc3RhbmNlPWZ1bmN0aW9uKCl7aWYobnVsbD09PXRoaXMuX2dlb21bMF18fG51bGw9PT10aGlzLl9nZW9tWzFdKXRocm93IG5ldyBoaTtyZXR1cm4gdGhpcy5fZ2VvbVswXS5pc0VtcHR5KCl8fHRoaXMuX2dlb21bMV0uaXNFbXB0eSgpPzA6KHRoaXMuY29tcHV0ZU1pbkRpc3RhbmNlKCksdGhpcy5fbWluRGlzdGFuY2UpfSxCdS5wcm90b3R5cGUuY29tcHV0ZU1pbkRpc3RhbmNlTGluZXM9ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj10aGlzLGk9MDtpPHQuc2l6ZSgpO2krKylmb3IodmFyIG89dC5nZXQoaSkscz0wO3M8ZS5zaXplKCk7cysrKXt2YXIgYT1lLmdldChzKTtpZihyLmNvbXB1dGVNaW5EaXN0YW5jZShvLGEsbiksci5fbWluRGlzdGFuY2U8PXIuX3Rlcm1pbmF0ZURpc3RhbmNlKXJldHVybiBudWxsfX0sQnUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LEJ1LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBCdX0sQnUuZGlzdGFuY2U9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IEJ1KHQsZSkuZGlzdGFuY2UoKX0sQnUuaXNXaXRoaW5EaXN0YW5jZT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIG5ldyBCdSh0LGUsbikuZGlzdGFuY2UoKTw9bn0sQnUubmVhcmVzdFBvaW50cz1mdW5jdGlvbih0LGUpe3JldHVybiBuZXcgQnUodCxlKS5uZWFyZXN0UG9pbnRzKCl9O3ZhciBrdT1mdW5jdGlvbigpe3RoaXMuX3B0PVtuZXcgdmksbmV3IHZpXSx0aGlzLl9kaXN0YW5jZT1maS5OYU4sdGhpcy5faXNOdWxsPSEwfTtrdS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHR9LGt1LnByb3RvdHlwZS5nZXRDb29yZGluYXRlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wdFt0XX0sa3UucHJvdG90eXBlLnNldE1pbmltdW09ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuc2V0TWluaW11bSh0Ll9wdFswXSx0Ll9wdFsxXSl9ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO2lmKHRoaXMuX2lzTnVsbClyZXR1cm4gdGhpcy5pbml0aWFsaXplKGUsbiksbnVsbDt2YXIgcj1lLmRpc3RhbmNlKG4pO3I8dGhpcy5fZGlzdGFuY2UmJnRoaXMuaW5pdGlhbGl6ZShlLG4scil9fSxrdS5wcm90b3R5cGUuaW5pdGlhbGl6ZT1mdW5jdGlvbigpe2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXRoaXMuX2lzTnVsbD0hMDtlbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV07dGhpcy5fcHRbMF0uc2V0Q29vcmRpbmF0ZSh0KSx0aGlzLl9wdFsxXS5zZXRDb29yZGluYXRlKGUpLHRoaXMuX2Rpc3RhbmNlPXQuZGlzdGFuY2UoZSksdGhpcy5faXNOdWxsPSExfWVsc2UgaWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXSxpPWFyZ3VtZW50c1syXTt0aGlzLl9wdFswXS5zZXRDb29yZGluYXRlKG4pLHRoaXMuX3B0WzFdLnNldENvb3JkaW5hdGUociksdGhpcy5fZGlzdGFuY2U9aSx0aGlzLl9pc051bGw9ITF9fSxrdS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gWGkudG9MaW5lU3RyaW5nKHRoaXMuX3B0WzBdLHRoaXMuX3B0WzFdKX0sa3UucHJvdG90eXBlLmdldERpc3RhbmNlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Rpc3RhbmNlfSxrdS5wcm90b3R5cGUuc2V0TWF4aW11bT1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5zZXRNYXhpbXVtKHQuX3B0WzBdLHQuX3B0WzFdKX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07aWYodGhpcy5faXNOdWxsKXJldHVybiB0aGlzLmluaXRpYWxpemUoZSxuKSxudWxsO3ZhciByPWUuZGlzdGFuY2Uobik7cj50aGlzLl9kaXN0YW5jZSYmdGhpcy5pbml0aWFsaXplKGUsbixyKX19LGt1LnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxrdS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4ga3V9O3ZhciB6dT1mdW5jdGlvbigpe307enUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LHp1LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiB6dX0senUuY29tcHV0ZURpc3RhbmNlPWZ1bmN0aW9uKCl7aWYoYXJndW1lbnRzWzJdaW5zdGFuY2VvZiBrdSYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBhcyYmYXJndW1lbnRzWzFdaW5zdGFuY2VvZiB2aSlmb3IodmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdLG49YXJndW1lbnRzWzJdLHI9bmV3IGJhLGk9dC5nZXRDb29yZGluYXRlcygpLG89MDtvPGkubGVuZ3RoLTE7bysrKXtyLnNldENvb3JkaW5hdGVzKGlbb10saVtvKzFdKTt2YXIgcz1yLmNsb3Nlc3RQb2ludChlKTtuLnNldE1pbmltdW0ocyxlKX1lbHNlIGlmKGFyZ3VtZW50c1syXWluc3RhbmNlb2Yga3UmJmFyZ3VtZW50c1swXWluc3RhbmNlb2YgaHMmJmFyZ3VtZW50c1sxXWluc3RhbmNlb2Ygdmkpe3ZhciBhPWFyZ3VtZW50c1swXSx1PWFyZ3VtZW50c1sxXSxjPWFyZ3VtZW50c1syXTt6dS5jb21wdXRlRGlzdGFuY2UoYS5nZXRFeHRlcmlvclJpbmcoKSx1LGMpO2Zvcih2YXIgbD0wO2w8YS5nZXROdW1JbnRlcmlvclJpbmcoKTtsKyspenUuY29tcHV0ZURpc3RhbmNlKGEuZ2V0SW50ZXJpb3JSaW5nTihsKSx1LGMpfWVsc2UgaWYoYXJndW1lbnRzWzJdaW5zdGFuY2VvZiBrdSYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBpbyYmYXJndW1lbnRzWzFdaW5zdGFuY2VvZiB2aSl7dmFyIGg9YXJndW1lbnRzWzBdLGY9YXJndW1lbnRzWzFdLHA9YXJndW1lbnRzWzJdO2lmKGggaW5zdGFuY2VvZiBhcyl6dS5jb21wdXRlRGlzdGFuY2UoaCxmLHApO2Vsc2UgaWYoaCBpbnN0YW5jZW9mIGhzKXp1LmNvbXB1dGVEaXN0YW5jZShoLGYscCk7ZWxzZSBpZihoIGluc3RhbmNlb2YgSG8pZm9yKHZhciBkPWgsZz0wO2c8ZC5nZXROdW1HZW9tZXRyaWVzKCk7ZysrKXt2YXIgeT1kLmdldEdlb21ldHJ5TihnKTt6dS5jb21wdXRlRGlzdGFuY2UoeSxmLHApfWVsc2UgcC5zZXRNaW5pbXVtKGguZ2V0Q29vcmRpbmF0ZSgpLGYpfWVsc2UgaWYoYXJndW1lbnRzWzJdaW5zdGFuY2VvZiBrdSYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBiYSYmYXJndW1lbnRzWzFdaW5zdGFuY2VvZiB2aSl7dmFyIG09YXJndW1lbnRzWzFdLHY9YXJndW1lbnRzWzJdLF89YXJndW1lbnRzWzBdLmNsb3Nlc3RQb2ludChtKTt2LnNldE1pbmltdW0oXyxtKX19O3ZhciBqdT1mdW5jdGlvbigpe3RoaXMuX2cwPW51bGwsdGhpcy5fZzE9bnVsbCx0aGlzLl9wdERpc3Q9bmV3IGt1LHRoaXMuX2RlbnNpZnlGcmFjPTA7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdO3RoaXMuX2cwPXQsdGhpcy5fZzE9ZX0sVXU9e01heFBvaW50RGlzdGFuY2VGaWx0ZXI6e2NvbmZpZ3VyYWJsZTohMH0sTWF4RGVuc2lmaWVkQnlGcmFjdGlvbkRpc3RhbmNlRmlsdGVyOntjb25maWd1cmFibGU6ITB9fTtqdS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHREaXN0LmdldENvb3JkaW5hdGVzKCl9LGp1LnByb3RvdHlwZS5zZXREZW5zaWZ5RnJhY3Rpb249ZnVuY3Rpb24odCl7aWYodD4xfHx0PD0wKXRocm93IG5ldyBoaTt0aGlzLl9kZW5zaWZ5RnJhYz10fSxqdS5wcm90b3R5cGUuY29tcHV0ZT1mdW5jdGlvbih0LGUpe3RoaXMuY29tcHV0ZU9yaWVudGVkRGlzdGFuY2UodCxlLHRoaXMuX3B0RGlzdCksdGhpcy5jb21wdXRlT3JpZW50ZWREaXN0YW5jZShlLHQsdGhpcy5fcHREaXN0KX0sanUucHJvdG90eXBlLmRpc3RhbmNlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29tcHV0ZSh0aGlzLl9nMCx0aGlzLl9nMSksdGhpcy5fcHREaXN0LmdldERpc3RhbmNlKCl9LGp1LnByb3RvdHlwZS5jb21wdXRlT3JpZW50ZWREaXN0YW5jZT1mdW5jdGlvbih0LGUsbil7dmFyIHI9bmV3IHF1KGUpO2lmKHQuYXBwbHkociksbi5zZXRNYXhpbXVtKHIuZ2V0TWF4UG9pbnREaXN0YW5jZSgpKSx0aGlzLl9kZW5zaWZ5RnJhYz4wKXt2YXIgaT1uZXcgVnUoZSx0aGlzLl9kZW5zaWZ5RnJhYyk7dC5hcHBseShpKSxuLnNldE1heGltdW0oaS5nZXRNYXhQb2ludERpc3RhbmNlKCkpfX0sanUucHJvdG90eXBlLm9yaWVudGVkRGlzdGFuY2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb21wdXRlT3JpZW50ZWREaXN0YW5jZSh0aGlzLl9nMCx0aGlzLl9nMSx0aGlzLl9wdERpc3QpLHRoaXMuX3B0RGlzdC5nZXREaXN0YW5jZSgpfSxqdS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sanUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGp1fSxqdS5kaXN0YW5jZT1mdW5jdGlvbigpe2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiBuZXcganUoYXJndW1lbnRzWzBdLGFyZ3VtZW50c1sxXSkuZGlzdGFuY2UoKTtpZigzPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzJdLGU9bmV3IGp1KGFyZ3VtZW50c1swXSxhcmd1bWVudHNbMV0pO3JldHVybiBlLnNldERlbnNpZnlGcmFjdGlvbih0KSxlLmRpc3RhbmNlKCl9fSxVdS5NYXhQb2ludERpc3RhbmNlRmlsdGVyLmdldD1mdW5jdGlvbigpe3JldHVybiBxdX0sVXUuTWF4RGVuc2lmaWVkQnlGcmFjdGlvbkRpc3RhbmNlRmlsdGVyLmdldD1mdW5jdGlvbigpe3JldHVybiBWdX0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoanUsVXUpO3ZhciBxdT1mdW5jdGlvbigpe3RoaXMuX21heFB0RGlzdD1uZXcga3UsdGhpcy5fbWluUHREaXN0PW5ldyBrdSx0aGlzLl9ldWNsaWRlYW5EaXN0PW5ldyB6dSx0aGlzLl9nZW9tPW51bGw7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuX2dlb209dH07cXUucHJvdG90eXBlLmZpbHRlcj1mdW5jdGlvbih0KXt0aGlzLl9taW5QdERpc3QuaW5pdGlhbGl6ZSgpLHp1LmNvbXB1dGVEaXN0YW5jZSh0aGlzLl9nZW9tLHQsdGhpcy5fbWluUHREaXN0KSx0aGlzLl9tYXhQdERpc3Quc2V0TWF4aW11bSh0aGlzLl9taW5QdERpc3QpfSxxdS5wcm90b3R5cGUuZ2V0TWF4UG9pbnREaXN0YW5jZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXhQdERpc3R9LHF1LnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVyblthb119LHF1LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBxdX07dmFyIFZ1PWZ1bmN0aW9uKCl7dGhpcy5fbWF4UHREaXN0PW5ldyBrdSx0aGlzLl9taW5QdERpc3Q9bmV3IGt1LHRoaXMuX2dlb209bnVsbCx0aGlzLl9udW1TdWJTZWdzPTA7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdO3RoaXMuX2dlb209dCx0aGlzLl9udW1TdWJTZWdzPU1hdGgudHJ1bmMoTWF0aC5yb3VuZCgxL2UpKX07VnUucHJvdG90eXBlLmZpbHRlcj1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXM7aWYoMD09PWUpcmV0dXJuIG51bGw7Zm9yKHZhciByPXQuZ2V0Q29vcmRpbmF0ZShlLTEpLGk9dC5nZXRDb29yZGluYXRlKGUpLG89KGkueC1yLngpL3RoaXMuX251bVN1YlNlZ3Mscz0oaS55LXIueSkvdGhpcy5fbnVtU3ViU2VncyxhPTA7YTx0aGlzLl9udW1TdWJTZWdzO2ErKyl7dmFyIHU9ci54K2EqbyxjPXIueSthKnMsbD1uZXcgdmkodSxjKTtuLl9taW5QdERpc3QuaW5pdGlhbGl6ZSgpLHp1LmNvbXB1dGVEaXN0YW5jZShuLl9nZW9tLGwsbi5fbWluUHREaXN0KSxuLl9tYXhQdERpc3Quc2V0TWF4aW11bShuLl9taW5QdERpc3QpfX0sVnUucHJvdG90eXBlLmlzRG9uZT1mdW5jdGlvbigpe3JldHVybiExfSxWdS5wcm90b3R5cGUuaXNHZW9tZXRyeUNoYW5nZWQ9ZnVuY3Rpb24oKXtyZXR1cm4hMX0sVnUucHJvdG90eXBlLmdldE1heFBvaW50RGlzdGFuY2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWF4UHREaXN0fSxWdS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bV29dfSxWdS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gVnV9O3ZhciBHdT1mdW5jdGlvbih0LGUsbil7dGhpcy5fbWluVmFsaWREaXN0YW5jZT1udWxsLHRoaXMuX21heFZhbGlkRGlzdGFuY2U9bnVsbCx0aGlzLl9taW5EaXN0YW5jZUZvdW5kPW51bGwsdGhpcy5fbWF4RGlzdGFuY2VGb3VuZD1udWxsLHRoaXMuX2lzVmFsaWQ9ITAsdGhpcy5fZXJyTXNnPW51bGwsdGhpcy5fZXJyb3JMb2NhdGlvbj1udWxsLHRoaXMuX2Vycm9ySW5kaWNhdG9yPW51bGwsdGhpcy5faW5wdXQ9dHx8bnVsbCx0aGlzLl9idWZEaXN0YW5jZT1lfHxudWxsLHRoaXMuX3Jlc3VsdD1ufHxudWxsfSxZdT17VkVSQk9TRTp7Y29uZmlndXJhYmxlOiEwfSxNQVhfRElTVEFOQ0VfRElGRl9GUkFDOntjb25maWd1cmFibGU6ITB9fTtHdS5wcm90b3R5cGUuY2hlY2tNYXhpbXVtRGlzdGFuY2U9ZnVuY3Rpb24odCxlLG4pe3ZhciByPW5ldyBqdShlLHQpO2lmKHIuc2V0RGVuc2lmeUZyYWN0aW9uKC4yNSksdGhpcy5fbWF4RGlzdGFuY2VGb3VuZD1yLm9yaWVudGVkRGlzdGFuY2UoKSx0aGlzLl9tYXhEaXN0YW5jZUZvdW5kPm4pe3RoaXMuX2lzVmFsaWQ9ITE7dmFyIGk9ci5nZXRDb29yZGluYXRlcygpO3RoaXMuX2Vycm9yTG9jYXRpb249aVsxXSx0aGlzLl9lcnJvckluZGljYXRvcj10LmdldEZhY3RvcnkoKS5jcmVhdGVMaW5lU3RyaW5nKGkpLHRoaXMuX2Vyck1zZz0iRGlzdGFuY2UgYmV0d2VlbiBidWZmZXIgY3VydmUgYW5kIGlucHV0IGlzIHRvbyBsYXJnZSAoIit0aGlzLl9tYXhEaXN0YW5jZUZvdW5kKyIgYXQgIitYaS50b0xpbmVTdHJpbmcoaVswXSxpWzFdKSsiKSJ9fSxHdS5wcm90b3R5cGUuaXNWYWxpZD1mdW5jdGlvbigpe3ZhciB0PU1hdGguYWJzKHRoaXMuX2J1ZkRpc3RhbmNlKSxlPUd1Lk1BWF9ESVNUQU5DRV9ESUZGX0ZSQUMqdDtyZXR1cm4gdGhpcy5fbWluVmFsaWREaXN0YW5jZT10LWUsdGhpcy5fbWF4VmFsaWREaXN0YW5jZT10K2UsISghdGhpcy5faW5wdXQuaXNFbXB0eSgpJiYhdGhpcy5fcmVzdWx0LmlzRW1wdHkoKSl8fCh0aGlzLl9idWZEaXN0YW5jZT4wP3RoaXMuY2hlY2tQb3NpdGl2ZVZhbGlkKCk6dGhpcy5jaGVja05lZ2F0aXZlVmFsaWQoKSxHdS5WRVJCT1NFJiZraS5vdXQucHJpbnRsbigiTWluIERpc3Q9ICIrdGhpcy5fbWluRGlzdGFuY2VGb3VuZCsiICBlcnI9ICIrKDEtdGhpcy5fbWluRGlzdGFuY2VGb3VuZC90aGlzLl9idWZEaXN0YW5jZSkrIiAgTWF4IERpc3Q9ICIrdGhpcy5fbWF4RGlzdGFuY2VGb3VuZCsiICBlcnI9ICIrKHRoaXMuX21heERpc3RhbmNlRm91bmQvdGhpcy5fYnVmRGlzdGFuY2UtMSkpLHRoaXMuX2lzVmFsaWQpfSxHdS5wcm90b3R5cGUuY2hlY2tOZWdhdGl2ZVZhbGlkPWZ1bmN0aW9uKCl7aWYoISh0aGlzLl9pbnB1dCBpbnN0YW5jZW9mIGhzfHx0aGlzLl9pbnB1dCBpbnN0YW5jZW9mIGRzfHx0aGlzLl9pbnB1dCBpbnN0YW5jZW9mIEhvKSlyZXR1cm4gbnVsbDt2YXIgdD10aGlzLmdldFBvbHlnb25MaW5lcyh0aGlzLl9pbnB1dCk7aWYodGhpcy5jaGVja01pbmltdW1EaXN0YW5jZSh0LHRoaXMuX3Jlc3VsdCx0aGlzLl9taW5WYWxpZERpc3RhbmNlKSwhdGhpcy5faXNWYWxpZClyZXR1cm4gbnVsbDt0aGlzLmNoZWNrTWF4aW11bURpc3RhbmNlKHQsdGhpcy5fcmVzdWx0LHRoaXMuX21heFZhbGlkRGlzdGFuY2UpfSxHdS5wcm90b3R5cGUuZ2V0RXJyb3JJbmRpY2F0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZXJyb3JJbmRpY2F0b3J9LEd1LnByb3RvdHlwZS5jaGVja01pbmltdW1EaXN0YW5jZT1mdW5jdGlvbih0LGUsbil7dmFyIHI9bmV3IEJ1KHQsZSxuKTtpZih0aGlzLl9taW5EaXN0YW5jZUZvdW5kPXIuZGlzdGFuY2UoKSx0aGlzLl9taW5EaXN0YW5jZUZvdW5kPG4pe3RoaXMuX2lzVmFsaWQ9ITE7dmFyIGk9ci5uZWFyZXN0UG9pbnRzKCk7dGhpcy5fZXJyb3JMb2NhdGlvbj1yLm5lYXJlc3RQb2ludHMoKVsxXSx0aGlzLl9lcnJvckluZGljYXRvcj10LmdldEZhY3RvcnkoKS5jcmVhdGVMaW5lU3RyaW5nKGkpLHRoaXMuX2Vyck1zZz0iRGlzdGFuY2UgYmV0d2VlbiBidWZmZXIgY3VydmUgYW5kIGlucHV0IGlzIHRvbyBzbWFsbCAoIit0aGlzLl9taW5EaXN0YW5jZUZvdW5kKyIgYXQgIitYaS50b0xpbmVTdHJpbmcoaVswXSxpWzFdKSsiICkifX0sR3UucHJvdG90eXBlLmNoZWNrUG9zaXRpdmVWYWxpZD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX3Jlc3VsdC5nZXRCb3VuZGFyeSgpO2lmKHRoaXMuY2hlY2tNaW5pbXVtRGlzdGFuY2UodGhpcy5faW5wdXQsdCx0aGlzLl9taW5WYWxpZERpc3RhbmNlKSwhdGhpcy5faXNWYWxpZClyZXR1cm4gbnVsbDt0aGlzLmNoZWNrTWF4aW11bURpc3RhbmNlKHRoaXMuX2lucHV0LHQsdGhpcy5fbWF4VmFsaWREaXN0YW5jZSl9LEd1LnByb3RvdHlwZS5nZXRFcnJvckxvY2F0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Vycm9yTG9jYXRpb259LEd1LnByb3RvdHlwZS5nZXRQb2x5Z29uTGluZXM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPW5ldyB4byxuPW5ldyBGdShlKSxyPU11LmdldFBvbHlnb25zKHQpLml0ZXJhdG9yKCk7ci5oYXNOZXh0KCk7KXtyLm5leHQoKS5hcHBseShuKX1yZXR1cm4gdC5nZXRGYWN0b3J5KCkuYnVpbGRHZW9tZXRyeShlKX0sR3UucHJvdG90eXBlLmdldEVycm9yTWVzc2FnZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9lcnJNc2d9LEd1LnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxHdS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gR3V9LFl1LlZFUkJPU0UuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuITF9LFl1Lk1BWF9ESVNUQU5DRV9ESUZGX0ZSQUMuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuLjAxMn0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoR3UsWXUpO3ZhciBYdT1mdW5jdGlvbih0LGUsbil7dGhpcy5faXNWYWxpZD0hMCx0aGlzLl9lcnJvck1zZz1udWxsLHRoaXMuX2Vycm9yTG9jYXRpb249bnVsbCx0aGlzLl9lcnJvckluZGljYXRvcj1udWxsLHRoaXMuX2lucHV0PXR8fG51bGwsdGhpcy5fZGlzdGFuY2U9ZXx8bnVsbCx0aGlzLl9yZXN1bHQ9bnx8bnVsbH0sV3U9e1ZFUkJPU0U6e2NvbmZpZ3VyYWJsZTohMH0sTUFYX0VOVl9ESUZGX0ZSQUM6e2NvbmZpZ3VyYWJsZTohMH19O1h1LnByb3RvdHlwZS5pc1ZhbGlkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2hlY2tQb2x5Z29uYWwoKSx0aGlzLl9pc1ZhbGlkPyh0aGlzLmNoZWNrRXhwZWN0ZWRFbXB0eSgpLHRoaXMuX2lzVmFsaWQ/KHRoaXMuY2hlY2tFbnZlbG9wZSgpLHRoaXMuX2lzVmFsaWQ/KHRoaXMuY2hlY2tBcmVhKCksdGhpcy5faXNWYWxpZD8odGhpcy5jaGVja0Rpc3RhbmNlKCksdGhpcy5faXNWYWxpZCk6dGhpcy5faXNWYWxpZCk6dGhpcy5faXNWYWxpZCk6dGhpcy5faXNWYWxpZCk6dGhpcy5faXNWYWxpZH0sWHUucHJvdG90eXBlLmNoZWNrRW52ZWxvcGU9ZnVuY3Rpb24oKXtpZih0aGlzLl9kaXN0YW5jZTwwKXJldHVybiBudWxsO3ZhciB0PXRoaXMuX2Rpc3RhbmNlKlh1Lk1BWF9FTlZfRElGRl9GUkFDOzA9PT10JiYodD0uMDAxKTt2YXIgZT1uZXcgamkodGhpcy5faW5wdXQuZ2V0RW52ZWxvcGVJbnRlcm5hbCgpKTtlLmV4cGFuZEJ5KHRoaXMuX2Rpc3RhbmNlKTt2YXIgbj1uZXcgamkodGhpcy5fcmVzdWx0LmdldEVudmVsb3BlSW50ZXJuYWwoKSk7bi5leHBhbmRCeSh0KSxuLmNvbnRhaW5zKGUpfHwodGhpcy5faXNWYWxpZD0hMSx0aGlzLl9lcnJvck1zZz0iQnVmZmVyIGVudmVsb3BlIGlzIGluY29ycmVjdCIsdGhpcy5fZXJyb3JJbmRpY2F0b3I9dGhpcy5faW5wdXQuZ2V0RmFjdG9yeSgpLnRvR2VvbWV0cnkobikpLHRoaXMucmVwb3J0KCJFbnZlbG9wZSIpfSxYdS5wcm90b3R5cGUuY2hlY2tEaXN0YW5jZT1mdW5jdGlvbigpe3ZhciB0PW5ldyBHdSh0aGlzLl9pbnB1dCx0aGlzLl9kaXN0YW5jZSx0aGlzLl9yZXN1bHQpO3QuaXNWYWxpZCgpfHwodGhpcy5faXNWYWxpZD0hMSx0aGlzLl9lcnJvck1zZz10LmdldEVycm9yTWVzc2FnZSgpLHRoaXMuX2Vycm9yTG9jYXRpb249dC5nZXRFcnJvckxvY2F0aW9uKCksdGhpcy5fZXJyb3JJbmRpY2F0b3I9dC5nZXRFcnJvckluZGljYXRvcigpKSx0aGlzLnJlcG9ydCgiRGlzdGFuY2UiKX0sWHUucHJvdG90eXBlLmNoZWNrQXJlYT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX2lucHV0LmdldEFyZWEoKSxlPXRoaXMuX3Jlc3VsdC5nZXRBcmVhKCk7dGhpcy5fZGlzdGFuY2U+MCYmdD5lJiYodGhpcy5faXNWYWxpZD0hMSx0aGlzLl9lcnJvck1zZz0iQXJlYSBvZiBwb3NpdGl2ZSBidWZmZXIgaXMgc21hbGxlciB0aGFuIGlucHV0Iix0aGlzLl9lcnJvckluZGljYXRvcj10aGlzLl9yZXN1bHQpLHRoaXMuX2Rpc3RhbmNlPDAmJnQ8ZSYmKHRoaXMuX2lzVmFsaWQ9ITEsdGhpcy5fZXJyb3JNc2c9IkFyZWEgb2YgbmVnYXRpdmUgYnVmZmVyIGlzIGxhcmdlciB0aGFuIGlucHV0Iix0aGlzLl9lcnJvckluZGljYXRvcj10aGlzLl9yZXN1bHQpLHRoaXMucmVwb3J0KCJBcmVhIil9LFh1LnByb3RvdHlwZS5jaGVja1BvbHlnb25hbD1mdW5jdGlvbigpe3RoaXMuX3Jlc3VsdCBpbnN0YW5jZW9mIGhzfHx0aGlzLl9yZXN1bHQgaW5zdGFuY2VvZiBkc3x8KHRoaXMuX2lzVmFsaWQ9ITEpLHRoaXMuX2Vycm9yTXNnPSJSZXN1bHQgaXMgbm90IHBvbHlnb25hbCIsdGhpcy5fZXJyb3JJbmRpY2F0b3I9dGhpcy5fcmVzdWx0LHRoaXMucmVwb3J0KCJQb2x5Z29uYWwiKX0sWHUucHJvdG90eXBlLmdldEVycm9ySW5kaWNhdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Vycm9ySW5kaWNhdG9yfSxYdS5wcm90b3R5cGUuZ2V0RXJyb3JMb2NhdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9lcnJvckxvY2F0aW9ufSxYdS5wcm90b3R5cGUuY2hlY2tFeHBlY3RlZEVtcHR5PWZ1bmN0aW9uKCl7aWYodGhpcy5faW5wdXQuZ2V0RGltZW5zaW9uKCk+PTJ8fHRoaXMuX2Rpc3RhbmNlPjApcmV0dXJuIG51bGw7dGhpcy5fcmVzdWx0LmlzRW1wdHkoKXx8KHRoaXMuX2lzVmFsaWQ9ITEsdGhpcy5fZXJyb3JNc2c9IlJlc3VsdCBpcyBub24tZW1wdHkiLHRoaXMuX2Vycm9ySW5kaWNhdG9yPXRoaXMuX3Jlc3VsdCksdGhpcy5yZXBvcnQoIkV4cGVjdGVkRW1wdHkiKX0sWHUucHJvdG90eXBlLnJlcG9ydD1mdW5jdGlvbih0KXtpZighWHUuVkVSQk9TRSlyZXR1cm4gbnVsbDtraS5vdXQucHJpbnRsbigiQ2hlY2sgIit0KyI6ICIrKHRoaXMuX2lzVmFsaWQ/InBhc3NlZCI6IkZBSUxFRCIpKX0sWHUucHJvdG90eXBlLmdldEVycm9yTWVzc2FnZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9lcnJvck1zZ30sWHUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LFh1LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBYdX0sWHUuaXNWYWxpZE1zZz1mdW5jdGlvbih0LGUsbil7dmFyIHI9bmV3IFh1KHQsZSxuKTtyZXR1cm4gci5pc1ZhbGlkKCk/bnVsbDpyLmdldEVycm9yTWVzc2FnZSgpfSxYdS5pc1ZhbGlkPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4hIW5ldyBYdSh0LGUsbikuaXNWYWxpZCgpfSxXdS5WRVJCT1NFLmdldD1mdW5jdGlvbigpe3JldHVybiExfSxXdS5NQVhfRU5WX0RJRkZfRlJBQy5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4uMDEyfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhYdSxXdSk7dmFyIEh1PWZ1bmN0aW9uKCl7dGhpcy5fcHRzPW51bGwsdGhpcy5fZGF0YT1udWxsO3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXTt0aGlzLl9wdHM9dCx0aGlzLl9kYXRhPWV9O0h1LnByb3RvdHlwZS5nZXRDb29yZGluYXRlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wdHN9LEh1LnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3B0cy5sZW5ndGh9LEh1LnByb3RvdHlwZS5nZXRDb29yZGluYXRlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wdHNbdF19LEh1LnByb3RvdHlwZS5pc0Nsb3NlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wdHNbMF0uZXF1YWxzKHRoaXMuX3B0c1t0aGlzLl9wdHMubGVuZ3RoLTFdKX0sSHUucHJvdG90eXBlLmdldFNlZ21lbnRPY3RhbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT10aGlzLl9wdHMubGVuZ3RoLTE/LTE6dmEub2N0YW50KHRoaXMuZ2V0Q29vcmRpbmF0ZSh0KSx0aGlzLmdldENvb3JkaW5hdGUodCsxKSl9LEh1LnByb3RvdHlwZS5zZXREYXRhPWZ1bmN0aW9uKHQpe3RoaXMuX2RhdGE9dH0sSHUucHJvdG90eXBlLmdldERhdGE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGF0YX0sSHUucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIFhpLnRvTGluZVN0cmluZyhuZXcgeHModGhpcy5fcHRzKSl9LEh1LnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltfYV19LEh1LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBIdX07dmFyIFp1PWZ1bmN0aW9uKCl7dGhpcy5fZmluZEFsbEludGVyc2VjdGlvbnM9ITEsdGhpcy5faXNDaGVja0VuZFNlZ21lbnRzT25seT0hMSx0aGlzLl9saT1udWxsLHRoaXMuX2ludGVyaW9ySW50ZXJzZWN0aW9uPW51bGwsdGhpcy5faW50U2VnbWVudHM9bnVsbCx0aGlzLl9pbnRlcnNlY3Rpb25zPW5ldyB4byx0aGlzLl9pbnRlcnNlY3Rpb25Db3VudD0wLHRoaXMuX2tlZXBJbnRlcnNlY3Rpb25zPSEwO3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLl9saT10LHRoaXMuX2ludGVyaW9ySW50ZXJzZWN0aW9uPW51bGx9O1p1LnByb3RvdHlwZS5nZXRJbnRlcmlvckludGVyc2VjdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pbnRlcmlvckludGVyc2VjdGlvbn0sWnUucHJvdG90eXBlLnNldENoZWNrRW5kU2VnbWVudHNPbmx5PWZ1bmN0aW9uKHQpe3RoaXMuX2lzQ2hlY2tFbmRTZWdtZW50c09ubHk9dH0sWnUucHJvdG90eXBlLmdldEludGVyc2VjdGlvblNlZ21lbnRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ludFNlZ21lbnRzfSxadS5wcm90b3R5cGUuY291bnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faW50ZXJzZWN0aW9uQ291bnR9LFp1LnByb3RvdHlwZS5nZXRJbnRlcnNlY3Rpb25zPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ludGVyc2VjdGlvbnN9LFp1LnByb3RvdHlwZS5zZXRGaW5kQWxsSW50ZXJzZWN0aW9ucz1mdW5jdGlvbih0KXt0aGlzLl9maW5kQWxsSW50ZXJzZWN0aW9ucz10fSxadS5wcm90b3R5cGUuc2V0S2VlcEludGVyc2VjdGlvbnM9ZnVuY3Rpb24odCl7dGhpcy5fa2VlcEludGVyc2VjdGlvbnM9dH0sWnUucHJvdG90eXBlLnByb2Nlc3NJbnRlcnNlY3Rpb25zPWZ1bmN0aW9uKHQsZSxuLHIpe2lmKCF0aGlzLl9maW5kQWxsSW50ZXJzZWN0aW9ucyYmdGhpcy5oYXNJbnRlcnNlY3Rpb24oKXx8dD09PW4mJmU9PT1yKXJldHVybiBudWxsO2lmKHRoaXMuX2lzQ2hlY2tFbmRTZWdtZW50c09ubHkmJiEodGhpcy5pc0VuZFNlZ21lbnQodCxlKXx8dGhpcy5pc0VuZFNlZ21lbnQobixyKSkpcmV0dXJuIG51bGw7dmFyIGk9dC5nZXRDb29yZGluYXRlcygpW2VdLG89dC5nZXRDb29yZGluYXRlcygpW2UrMV0scz1uLmdldENvb3JkaW5hdGVzKClbcl0sYT1uLmdldENvb3JkaW5hdGVzKClbcisxXTt0aGlzLl9saS5jb21wdXRlSW50ZXJzZWN0aW9uKGksbyxzLGEpLHRoaXMuX2xpLmhhc0ludGVyc2VjdGlvbigpJiZ0aGlzLl9saS5pc0ludGVyaW9ySW50ZXJzZWN0aW9uKCkmJih0aGlzLl9pbnRTZWdtZW50cz1uZXcgQXJyYXkoNCkuZmlsbChudWxsKSx0aGlzLl9pbnRTZWdtZW50c1swXT1pLHRoaXMuX2ludFNlZ21lbnRzWzFdPW8sdGhpcy5faW50U2VnbWVudHNbMl09cyx0aGlzLl9pbnRTZWdtZW50c1szXT1hLHRoaXMuX2ludGVyaW9ySW50ZXJzZWN0aW9uPXRoaXMuX2xpLmdldEludGVyc2VjdGlvbigwKSx0aGlzLl9rZWVwSW50ZXJzZWN0aW9ucyYmdGhpcy5faW50ZXJzZWN0aW9ucy5hZGQodGhpcy5faW50ZXJpb3JJbnRlcnNlY3Rpb24pLHRoaXMuX2ludGVyc2VjdGlvbkNvdW50KyspfSxadS5wcm90b3R5cGUuaXNFbmRTZWdtZW50PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIDA9PT1lfHxlPj10LnNpemUoKS0yfSxadS5wcm90b3R5cGUuaGFzSW50ZXJzZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPT10aGlzLl9pbnRlcmlvckludGVyc2VjdGlvbn0sWnUucHJvdG90eXBlLmlzRG9uZT1mdW5jdGlvbigpe3JldHVybiF0aGlzLl9maW5kQWxsSW50ZXJzZWN0aW9ucyYmbnVsbCE9PXRoaXMuX2ludGVyaW9ySW50ZXJzZWN0aW9ufSxadS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bZXVdfSxadS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gWnV9LFp1LmNyZWF0ZUFsbEludGVyc2VjdGlvbnNGaW5kZXI9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IFp1KHQpO3JldHVybiBlLnNldEZpbmRBbGxJbnRlcnNlY3Rpb25zKCEwKSxlfSxadS5jcmVhdGVBbnlJbnRlcnNlY3Rpb25GaW5kZXI9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBadSh0KX0sWnUuY3JlYXRlSW50ZXJzZWN0aW9uQ291bnRlcj1mdW5jdGlvbih0KXt2YXIgZT1uZXcgWnUodCk7cmV0dXJuIGUuc2V0RmluZEFsbEludGVyc2VjdGlvbnMoITApLGUuc2V0S2VlcEludGVyc2VjdGlvbnMoITEpLGV9O3ZhciBLdT1mdW5jdGlvbigpe3RoaXMuX2xpPW5ldyBRaSx0aGlzLl9zZWdTdHJpbmdzPW51bGwsdGhpcy5fZmluZEFsbEludGVyc2VjdGlvbnM9ITEsdGhpcy5fc2VnSW50PW51bGwsdGhpcy5faXNWYWxpZD0hMDt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5fc2VnU3RyaW5ncz10fTtLdS5wcm90b3R5cGUuZXhlY3V0ZT1mdW5jdGlvbigpe2lmKG51bGwhPT10aGlzLl9zZWdJbnQpcmV0dXJuIG51bGw7dGhpcy5jaGVja0ludGVyaW9ySW50ZXJzZWN0aW9ucygpfSxLdS5wcm90b3R5cGUuZ2V0SW50ZXJzZWN0aW9ucz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zZWdJbnQuZ2V0SW50ZXJzZWN0aW9ucygpfSxLdS5wcm90b3R5cGUuaXNWYWxpZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmV4ZWN1dGUoKSx0aGlzLl9pc1ZhbGlkfSxLdS5wcm90b3R5cGUuc2V0RmluZEFsbEludGVyc2VjdGlvbnM9ZnVuY3Rpb24odCl7dGhpcy5fZmluZEFsbEludGVyc2VjdGlvbnM9dH0sS3UucHJvdG90eXBlLmNoZWNrSW50ZXJpb3JJbnRlcnNlY3Rpb25zPWZ1bmN0aW9uKCl7dGhpcy5faXNWYWxpZD0hMCx0aGlzLl9zZWdJbnQ9bmV3IFp1KHRoaXMuX2xpKSx0aGlzLl9zZWdJbnQuc2V0RmluZEFsbEludGVyc2VjdGlvbnModGhpcy5fZmluZEFsbEludGVyc2VjdGlvbnMpO3ZhciB0PW5ldyBJYTtpZih0LnNldFNlZ21lbnRJbnRlcnNlY3Rvcih0aGlzLl9zZWdJbnQpLHQuY29tcHV0ZU5vZGVzKHRoaXMuX3NlZ1N0cmluZ3MpLHRoaXMuX3NlZ0ludC5oYXNJbnRlcnNlY3Rpb24oKSlyZXR1cm4gdGhpcy5faXNWYWxpZD0hMSxudWxsfSxLdS5wcm90b3R5cGUuY2hlY2tWYWxpZD1mdW5jdGlvbigpe2lmKHRoaXMuZXhlY3V0ZSgpLCF0aGlzLl9pc1ZhbGlkKXRocm93IG5ldyBScyh0aGlzLmdldEVycm9yTWVzc2FnZSgpLHRoaXMuX3NlZ0ludC5nZXRJbnRlcmlvckludGVyc2VjdGlvbigpKX0sS3UucHJvdG90eXBlLmdldEVycm9yTWVzc2FnZT1mdW5jdGlvbigpe2lmKHRoaXMuX2lzVmFsaWQpcmV0dXJuIm5vIGludGVyc2VjdGlvbnMgZm91bmQiO3ZhciB0PXRoaXMuX3NlZ0ludC5nZXRJbnRlcnNlY3Rpb25TZWdtZW50cygpO3JldHVybiJmb3VuZCBub24tbm9kZWQgaW50ZXJzZWN0aW9uIGJldHdlZW4gIitYaS50b0xpbmVTdHJpbmcodFswXSx0WzFdKSsiIGFuZCAiK1hpLnRvTGluZVN0cmluZyh0WzJdLHRbM10pfSxLdS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sS3UucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIEt1fSxLdS5jb21wdXRlSW50ZXJzZWN0aW9ucz1mdW5jdGlvbih0KXt2YXIgZT1uZXcgS3UodCk7cmV0dXJuIGUuc2V0RmluZEFsbEludGVyc2VjdGlvbnMoITApLGUuaXNWYWxpZCgpLGUuZ2V0SW50ZXJzZWN0aW9ucygpfTt2YXIgSnU9ZnVuY3Rpb24gdCgpe3RoaXMuX252PW51bGw7dmFyIGU9YXJndW1lbnRzWzBdO3RoaXMuX252PW5ldyBLdSh0LnRvU2VnbWVudFN0cmluZ3MoZSkpfTtKdS5wcm90b3R5cGUuY2hlY2tWYWxpZD1mdW5jdGlvbigpe3RoaXMuX252LmNoZWNrVmFsaWQoKX0sSnUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LEp1LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBKdX0sSnUudG9TZWdtZW50U3RyaW5ncz1mdW5jdGlvbih0KXtmb3IodmFyIGU9bmV3IHhvLG49dC5pdGVyYXRvcigpO24uaGFzTmV4dCgpOyl7dmFyIHI9bi5uZXh0KCk7ZS5hZGQobmV3IEh1KHIuZ2V0Q29vcmRpbmF0ZXMoKSxyKSl9cmV0dXJuIGV9LEp1LmNoZWNrVmFsaWQ9ZnVuY3Rpb24odCl7bmV3IEp1KHQpLmNoZWNrVmFsaWQoKX07dmFyIFF1PWZ1bmN0aW9uKHQpe3RoaXMuX21hcE9wPXR9O1F1LnByb3RvdHlwZS5tYXA9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPW5ldyB4byxuPTA7bjx0LmdldE51bUdlb21ldHJpZXMoKTtuKyspe3ZhciByPXRoaXMuX21hcE9wLm1hcCh0LmdldEdlb21ldHJ5TihuKSk7ci5pc0VtcHR5KCl8fGUuYWRkKHIpfXJldHVybiB0LmdldEZhY3RvcnkoKS5jcmVhdGVHZW9tZXRyeUNvbGxlY3Rpb24oSXMudG9HZW9tZXRyeUFycmF5KGUpKX0sUXUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LFF1LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBRdX0sUXUubWFwPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBRdShlKS5tYXAodCl9O3ZhciAkdT1mdW5jdGlvbigpe3RoaXMuX29wPW51bGwsdGhpcy5fZ2VvbWV0cnlGYWN0b3J5PW51bGwsdGhpcy5fcHRMb2NhdG9yPW51bGwsdGhpcy5fbGluZUVkZ2VzTGlzdD1uZXcgeG8sdGhpcy5fcmVzdWx0TGluZUxpc3Q9bmV3IHhvO3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXSxuPWFyZ3VtZW50c1syXTt0aGlzLl9vcD10LHRoaXMuX2dlb21ldHJ5RmFjdG9yeT1lLHRoaXMuX3B0TG9jYXRvcj1ufTskdS5wcm90b3R5cGUuY29sbGVjdExpbmVzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLG49dGhpcy5fb3AuZ2V0R3JhcGgoKS5nZXRFZGdlRW5kcygpLml0ZXJhdG9yKCk7bi5oYXNOZXh0KCk7KXt2YXIgcj1uLm5leHQoKTtlLmNvbGxlY3RMaW5lRWRnZShyLHQsZS5fbGluZUVkZ2VzTGlzdCksZS5jb2xsZWN0Qm91bmRhcnlUb3VjaEVkZ2Uocix0LGUuX2xpbmVFZGdlc0xpc3QpfX0sJHUucHJvdG90eXBlLmxhYmVsSXNvbGF0ZWRMaW5lPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fcHRMb2NhdG9yLmxvY2F0ZSh0LmdldENvb3JkaW5hdGUoKSx0aGlzLl9vcC5nZXRBcmdHZW9tZXRyeShlKSk7dC5nZXRMYWJlbCgpLnNldExvY2F0aW9uKGUsbil9LCR1LnByb3RvdHlwZS5idWlsZD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5maW5kQ292ZXJlZExpbmVFZGdlcygpLHRoaXMuY29sbGVjdExpbmVzKHQpLHRoaXMuYnVpbGRMaW5lcyh0KSx0aGlzLl9yZXN1bHRMaW5lTGlzdH0sJHUucHJvdG90eXBlLmNvbGxlY3RMaW5lRWRnZT1mdW5jdGlvbih0LGUsbil7dmFyIHI9dC5nZXRMYWJlbCgpLGk9dC5nZXRFZGdlKCk7dC5pc0xpbmVFZGdlKCkmJiF0LmlzVmlzaXRlZCgpJiZPYy5pc1Jlc3VsdE9mT3AocixlKSYmIWkuaXNDb3ZlcmVkKCkmJihuLmFkZChpKSx0LnNldFZpc2l0ZWRFZGdlKCEwKSl9LCR1LnByb3RvdHlwZS5maW5kQ292ZXJlZExpbmVFZGdlcz1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9vcC5nZXRHcmFwaCgpLmdldE5vZGVzKCkuaXRlcmF0b3IoKTt0Lmhhc05leHQoKTspe3QubmV4dCgpLmdldEVkZ2VzKCkuZmluZENvdmVyZWRMaW5lRWRnZXMoKX1mb3IodmFyIGU9dGhpcy5fb3AuZ2V0R3JhcGgoKS5nZXRFZGdlRW5kcygpLml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXt2YXIgbj1lLm5leHQoKSxyPW4uZ2V0RWRnZSgpO2lmKG4uaXNMaW5lRWRnZSgpJiYhci5pc0NvdmVyZWRTZXQoKSl7dmFyIGk9dGhpcy5fb3AuaXNDb3ZlcmVkQnlBKG4uZ2V0Q29vcmRpbmF0ZSgpKTtyLnNldENvdmVyZWQoaSl9fX0sJHUucHJvdG90eXBlLmxhYmVsSXNvbGF0ZWRMaW5lcz1mdW5jdGlvbih0KXtmb3IodmFyIGU9dC5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7dmFyIG49ZS5uZXh0KCkscj1uLmdldExhYmVsKCk7bi5pc0lzb2xhdGVkKCkmJihyLmlzTnVsbCgwKT90aGlzLmxhYmVsSXNvbGF0ZWRMaW5lKG4sMCk6dGhpcy5sYWJlbElzb2xhdGVkTGluZShuLDEpKX19LCR1LnByb3RvdHlwZS5idWlsZExpbmVzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLl9saW5lRWRnZXNMaXN0Lml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXt2YXIgbj1lLm5leHQoKSxyPXRoaXMuX2dlb21ldHJ5RmFjdG9yeS5jcmVhdGVMaW5lU3RyaW5nKG4uZ2V0Q29vcmRpbmF0ZXMoKSk7dGhpcy5fcmVzdWx0TGluZUxpc3QuYWRkKHIpLG4uc2V0SW5SZXN1bHQoITApfX0sJHUucHJvdG90eXBlLmNvbGxlY3RCb3VuZGFyeVRvdWNoRWRnZT1mdW5jdGlvbih0LGUsbil7dmFyIHI9dC5nZXRMYWJlbCgpO2lmKHQuaXNMaW5lRWRnZSgpfHx0LmlzVmlzaXRlZCgpfHx0LmlzSW50ZXJpb3JBcmVhRWRnZSgpfHx0LmdldEVkZ2UoKS5pc0luUmVzdWx0KCkpcmV0dXJuIG51bGw7WmkuaXNUcnVlKCEodC5pc0luUmVzdWx0KCl8fHQuZ2V0U3ltKCkuaXNJblJlc3VsdCgpKXx8IXQuZ2V0RWRnZSgpLmlzSW5SZXN1bHQoKSksT2MuaXNSZXN1bHRPZk9wKHIsZSkmJmU9PT1PYy5JTlRFUlNFQ1RJT04mJihuLmFkZCh0LmdldEVkZ2UoKSksdC5zZXRWaXNpdGVkRWRnZSghMCkpfSwkdS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sJHUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuICR1fTt2YXIgdGM9ZnVuY3Rpb24oKXt0aGlzLl9vcD1udWxsLHRoaXMuX2dlb21ldHJ5RmFjdG9yeT1udWxsLHRoaXMuX3Jlc3VsdFBvaW50TGlzdD1uZXcgeG87dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdO3RoaXMuX29wPXQsdGhpcy5fZ2VvbWV0cnlGYWN0b3J5PWV9O3RjLnByb3RvdHlwZS5maWx0ZXJDb3ZlcmVkTm9kZVRvUG9pbnQ9ZnVuY3Rpb24odCl7dmFyIGU9dC5nZXRDb29yZGluYXRlKCk7aWYoIXRoaXMuX29wLmlzQ292ZXJlZEJ5TEEoZSkpe3ZhciBuPXRoaXMuX2dlb21ldHJ5RmFjdG9yeS5jcmVhdGVQb2ludChlKTt0aGlzLl9yZXN1bHRQb2ludExpc3QuYWRkKG4pfX0sdGMucHJvdG90eXBlLmV4dHJhY3ROb25Db3ZlcmVkUmVzdWx0Tm9kZXM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuX29wLmdldEdyYXBoKCkuZ2V0Tm9kZXMoKS5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7dmFyIG49ZS5uZXh0KCk7aWYoIShuLmlzSW5SZXN1bHQoKXx8bi5pc0luY2lkZW50RWRnZUluUmVzdWx0KCl8fDAhPT1uLmdldEVkZ2VzKCkuZ2V0RGVncmVlKCkmJnQhPT1PYy5JTlRFUlNFQ1RJT04pKXt2YXIgcj1uLmdldExhYmVsKCk7T2MuaXNSZXN1bHRPZk9wKHIsdCkmJnRoaXMuZmlsdGVyQ292ZXJlZE5vZGVUb1BvaW50KG4pfX19LHRjLnByb3RvdHlwZS5idWlsZD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5leHRyYWN0Tm9uQ292ZXJlZFJlc3VsdE5vZGVzKHQpLHRoaXMuX3Jlc3VsdFBvaW50TGlzdH0sdGMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LHRjLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiB0Y307dmFyIGVjPWZ1bmN0aW9uKCl7dGhpcy5faW5wdXRHZW9tPW51bGwsdGhpcy5fZmFjdG9yeT1udWxsLHRoaXMuX3BydW5lRW1wdHlHZW9tZXRyeT0hMCx0aGlzLl9wcmVzZXJ2ZUdlb21ldHJ5Q29sbGVjdGlvblR5cGU9ITAsdGhpcy5fcHJlc2VydmVDb2xsZWN0aW9ucz0hMSx0aGlzLl9wcmVzZXJ2ZVR5cGU9ITF9O2VjLnByb3RvdHlwZS50cmFuc2Zvcm1Qb2ludD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl9mYWN0b3J5LmNyZWF0ZVBvaW50KHRoaXMudHJhbnNmb3JtQ29vcmRpbmF0ZXModC5nZXRDb29yZGluYXRlU2VxdWVuY2UoKSx0KSl9LGVjLnByb3RvdHlwZS50cmFuc2Zvcm1Qb2x5Z29uPWZ1bmN0aW9uKHQsZSl7dmFyIG49ITAscj10aGlzLnRyYW5zZm9ybUxpbmVhclJpbmcodC5nZXRFeHRlcmlvclJpbmcoKSx0KTsobnVsbD09PXJ8fCEociBpbnN0YW5jZW9mIHBzKXx8ci5pc0VtcHR5KCkpJiYobj0hMSk7Zm9yKHZhciBpPW5ldyB4byxvPTA7bzx0LmdldE51bUludGVyaW9yUmluZygpO28rKyl7dmFyIHM9dGhpcy50cmFuc2Zvcm1MaW5lYXJSaW5nKHQuZ2V0SW50ZXJpb3JSaW5nTihvKSx0KTtudWxsPT09c3x8cy5pc0VtcHR5KCl8fChzIGluc3RhbmNlb2YgcHN8fChuPSExKSxpLmFkZChzKSl9aWYobilyZXR1cm4gdGhpcy5fZmFjdG9yeS5jcmVhdGVQb2x5Z29uKHIsaS50b0FycmF5KFtdKSk7dmFyIGE9bmV3IHhvO3JldHVybiBudWxsIT09ciYmYS5hZGQociksYS5hZGRBbGwoaSksdGhpcy5fZmFjdG9yeS5idWlsZEdlb21ldHJ5KGEpfSxlYy5wcm90b3R5cGUuY3JlYXRlQ29vcmRpbmF0ZVNlcXVlbmNlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9mYWN0b3J5LmdldENvb3JkaW5hdGVTZXF1ZW5jZUZhY3RvcnkoKS5jcmVhdGUodCl9LGVjLnByb3RvdHlwZS5nZXRJbnB1dEdlb21ldHJ5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lucHV0R2VvbX0sZWMucHJvdG90eXBlLnRyYW5zZm9ybU11bHRpTGluZVN0cmluZz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1uZXcgeG8scj0wO3I8dC5nZXROdW1HZW9tZXRyaWVzKCk7cisrKXt2YXIgaT10aGlzLnRyYW5zZm9ybUxpbmVTdHJpbmcodC5nZXRHZW9tZXRyeU4ociksdCk7bnVsbCE9PWkmJihpLmlzRW1wdHkoKXx8bi5hZGQoaSkpfXJldHVybiB0aGlzLl9mYWN0b3J5LmJ1aWxkR2VvbWV0cnkobil9LGVjLnByb3RvdHlwZS50cmFuc2Zvcm1Db29yZGluYXRlcz1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmNvcHkodCl9LGVjLnByb3RvdHlwZS50cmFuc2Zvcm1MaW5lU3RyaW5nPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2ZhY3RvcnkuY3JlYXRlTGluZVN0cmluZyh0aGlzLnRyYW5zZm9ybUNvb3JkaW5hdGVzKHQuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlKCksdCkpfSxlYy5wcm90b3R5cGUudHJhbnNmb3JtTXVsdGlQb2ludD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1uZXcgeG8scj0wO3I8dC5nZXROdW1HZW9tZXRyaWVzKCk7cisrKXt2YXIgaT10aGlzLnRyYW5zZm9ybVBvaW50KHQuZ2V0R2VvbWV0cnlOKHIpLHQpO251bGwhPT1pJiYoaS5pc0VtcHR5KCl8fG4uYWRkKGkpKX1yZXR1cm4gdGhpcy5fZmFjdG9yeS5idWlsZEdlb21ldHJ5KG4pfSxlYy5wcm90b3R5cGUudHJhbnNmb3JtTXVsdGlQb2x5Z29uPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPW5ldyB4byxyPTA7cjx0LmdldE51bUdlb21ldHJpZXMoKTtyKyspe3ZhciBpPXRoaXMudHJhbnNmb3JtUG9seWdvbih0LmdldEdlb21ldHJ5TihyKSx0KTtudWxsIT09aSYmKGkuaXNFbXB0eSgpfHxuLmFkZChpKSl9cmV0dXJuIHRoaXMuX2ZhY3RvcnkuYnVpbGRHZW9tZXRyeShuKX0sZWMucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24odCl7cmV0dXJuIHQuY29weSgpfSxlYy5wcm90b3R5cGUudHJhbnNmb3JtR2VvbWV0cnlDb2xsZWN0aW9uPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPW5ldyB4byxyPTA7cjx0LmdldE51bUdlb21ldHJpZXMoKTtyKyspe3ZhciBpPXRoaXMudHJhbnNmb3JtKHQuZ2V0R2VvbWV0cnlOKHIpKTtudWxsIT09aSYmKHRoaXMuX3BydW5lRW1wdHlHZW9tZXRyeSYmaS5pc0VtcHR5KCl8fG4uYWRkKGkpKX1yZXR1cm4gdGhpcy5fcHJlc2VydmVHZW9tZXRyeUNvbGxlY3Rpb25UeXBlP3RoaXMuX2ZhY3RvcnkuY3JlYXRlR2VvbWV0cnlDb2xsZWN0aW9uKElzLnRvR2VvbWV0cnlBcnJheShuKSk6dGhpcy5fZmFjdG9yeS5idWlsZEdlb21ldHJ5KG4pfSxlYy5wcm90b3R5cGUudHJhbnNmb3JtPWZ1bmN0aW9uKHQpe2lmKHRoaXMuX2lucHV0R2VvbT10LHRoaXMuX2ZhY3Rvcnk9dC5nZXRGYWN0b3J5KCksdCBpbnN0YW5jZW9mIGNzKXJldHVybiB0aGlzLnRyYW5zZm9ybVBvaW50KHQsbnVsbCk7aWYodCBpbnN0YW5jZW9mIGZzKXJldHVybiB0aGlzLnRyYW5zZm9ybU11bHRpUG9pbnQodCxudWxsKTtpZih0IGluc3RhbmNlb2YgcHMpcmV0dXJuIHRoaXMudHJhbnNmb3JtTGluZWFyUmluZyh0LG51bGwpO2lmKHQgaW5zdGFuY2VvZiBhcylyZXR1cm4gdGhpcy50cmFuc2Zvcm1MaW5lU3RyaW5nKHQsbnVsbCk7aWYodCBpbnN0YW5jZW9mIFpvKXJldHVybiB0aGlzLnRyYW5zZm9ybU11bHRpTGluZVN0cmluZyh0LG51bGwpO2lmKHQgaW5zdGFuY2VvZiBocylyZXR1cm4gdGhpcy50cmFuc2Zvcm1Qb2x5Z29uKHQsbnVsbCk7aWYodCBpbnN0YW5jZW9mIGRzKXJldHVybiB0aGlzLnRyYW5zZm9ybU11bHRpUG9seWdvbih0LG51bGwpO2lmKHQgaW5zdGFuY2VvZiBIbylyZXR1cm4gdGhpcy50cmFuc2Zvcm1HZW9tZXRyeUNvbGxlY3Rpb24odCxudWxsKTt0aHJvdyBuZXcgaGkoIlVua25vd24gR2VvbWV0cnkgc3VidHlwZTogIit0LmdldENsYXNzKCkuZ2V0TmFtZSgpKX0sZWMucHJvdG90eXBlLnRyYW5zZm9ybUxpbmVhclJpbmc9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLnRyYW5zZm9ybUNvb3JkaW5hdGVzKHQuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlKCksdCk7aWYobnVsbD09PW4pcmV0dXJuIHRoaXMuX2ZhY3RvcnkuY3JlYXRlTGluZWFyUmluZyhudWxsKTt2YXIgcj1uLnNpemUoKTtyZXR1cm4gcj4wJiZyPDQmJiF0aGlzLl9wcmVzZXJ2ZVR5cGU/dGhpcy5fZmFjdG9yeS5jcmVhdGVMaW5lU3RyaW5nKG4pOnRoaXMuX2ZhY3RvcnkuY3JlYXRlTGluZWFyUmluZyhuKX0sZWMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGVjLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlY307dmFyIG5jPWZ1bmN0aW9uIHQoKXtpZih0aGlzLl9zbmFwVG9sZXJhbmNlPTAsdGhpcy5fc3JjUHRzPW51bGwsdGhpcy5fc2VnPW5ldyBiYSx0aGlzLl9hbGxvd1NuYXBwaW5nVG9Tb3VyY2VWZXJ0aWNlcz0hMSx0aGlzLl9pc0Nsb3NlZD0hMSxhcmd1bWVudHNbMF1pbnN0YW5jZW9mIGFzJiYibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1sxXSl7dmFyIGU9YXJndW1lbnRzWzFdO3QuY2FsbCh0aGlzLGFyZ3VtZW50c1swXS5nZXRDb29yZGluYXRlcygpLGUpfWVsc2UgaWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBBcnJheSYmIm51bWJlciI9PXR5cGVvZiBhcmd1bWVudHNbMV0pe3ZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXTt0aGlzLl9zcmNQdHM9bix0aGlzLl9pc0Nsb3NlZD10LmlzQ2xvc2VkKG4pLHRoaXMuX3NuYXBUb2xlcmFuY2U9cn19O25jLnByb3RvdHlwZS5zbmFwVmVydGljZXM9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dGhpcy5faXNDbG9zZWQ/dC5zaXplKCktMTp0LnNpemUoKSxyPTA7cjxuO3IrKyl7dmFyIGk9dC5nZXQociksbz10aGlzLmZpbmRTbmFwRm9yVmVydGV4KGksZSk7bnVsbCE9PW8mJih0LnNldChyLG5ldyB2aShvKSksMD09PXImJnRoaXMuX2lzQ2xvc2VkJiZ0LnNldCh0LnNpemUoKS0xLG5ldyB2aShvKSkpfX0sbmMucHJvdG90eXBlLmZpbmRTbmFwRm9yVmVydGV4PWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe2lmKHQuZXF1YWxzMkQoZVtuXSkpcmV0dXJuIG51bGw7aWYodC5kaXN0YW5jZShlW25dKTx0aGlzLl9zbmFwVG9sZXJhbmNlKXJldHVybiBlW25dfXJldHVybiBudWxsfSxuYy5wcm90b3R5cGUuc25hcFRvPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBibyh0aGlzLl9zcmNQdHMpO3JldHVybiB0aGlzLnNuYXBWZXJ0aWNlcyhlLHQpLHRoaXMuc25hcFNlZ21lbnRzKGUsdCksZS50b0Nvb3JkaW5hdGVBcnJheSgpfSxuYy5wcm90b3R5cGUuc25hcFNlZ21lbnRzPWZ1bmN0aW9uKHQsZSl7aWYoMD09PWUubGVuZ3RoKXJldHVybiBudWxsO3ZhciBuPWUubGVuZ3RoO2VbMF0uZXF1YWxzMkQoZVtlLmxlbmd0aC0xXSkmJihuPWUubGVuZ3RoLTEpO2Zvcih2YXIgcj0wO3I8bjtyKyspe3ZhciBpPWVbcl0sbz10aGlzLmZpbmRTZWdtZW50SW5kZXhUb1NuYXAoaSx0KTtvPj0wJiZ0LmFkZChvKzEsbmV3IHZpKGkpLCExKX19LG5jLnByb3RvdHlwZS5maW5kU2VnbWVudEluZGV4VG9TbmFwPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXRoaXMscj1maS5NQVhfVkFMVUUsaT0tMSxvPTA7bzxlLnNpemUoKS0xO28rKyl7aWYobi5fc2VnLnAwPWUuZ2V0KG8pLG4uX3NlZy5wMT1lLmdldChvKzEpLG4uX3NlZy5wMC5lcXVhbHMyRCh0KXx8bi5fc2VnLnAxLmVxdWFsczJEKHQpKXtpZihuLl9hbGxvd1NuYXBwaW5nVG9Tb3VyY2VWZXJ0aWNlcyljb250aW51ZTtyZXR1cm4tMX12YXIgcz1uLl9zZWcuZGlzdGFuY2UodCk7czxuLl9zbmFwVG9sZXJhbmNlJiZzPHImJihyPXMsaT1vKX1yZXR1cm4gaX0sbmMucHJvdG90eXBlLnNldEFsbG93U25hcHBpbmdUb1NvdXJjZVZlcnRpY2VzPWZ1bmN0aW9uKHQpe3RoaXMuX2FsbG93U25hcHBpbmdUb1NvdXJjZVZlcnRpY2VzPXR9LG5jLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxuYy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gbmN9LG5jLmlzQ2xvc2VkPWZ1bmN0aW9uKHQpe3JldHVybiEodC5sZW5ndGg8PTEpJiZ0WzBdLmVxdWFsczJEKHRbdC5sZW5ndGgtMV0pfTt2YXIgcmM9ZnVuY3Rpb24odCl7dGhpcy5fc3JjR2VvbT10fHxudWxsfSxpYz17U05BUF9QUkVDSVNJT05fRkFDVE9SOntjb25maWd1cmFibGU6ITB9fTtyYy5wcm90b3R5cGUuc25hcFRvPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5leHRyYWN0VGFyZ2V0Q29vcmRpbmF0ZXModCk7cmV0dXJuIG5ldyBvYyhlLG4pLnRyYW5zZm9ybSh0aGlzLl9zcmNHZW9tKX0scmMucHJvdG90eXBlLnNuYXBUb1NlbGY9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmV4dHJhY3RUYXJnZXRDb29yZGluYXRlcyh0aGlzLl9zcmNHZW9tKSxyPW5ldyBvYyh0LG4sITApLnRyYW5zZm9ybSh0aGlzLl9zcmNHZW9tKSxpPXI7cmV0dXJuIGUmJkVpKGksbHMpJiYoaT1yLmJ1ZmZlcigwKSksaX0scmMucHJvdG90eXBlLmNvbXB1dGVTbmFwVG9sZXJhbmNlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNvbXB1dGVNaW5pbXVtU2VnbWVudExlbmd0aCh0KS8xMH0scmMucHJvdG90eXBlLmV4dHJhY3RUYXJnZXRDb29yZGluYXRlcz1mdW5jdGlvbih0KXtmb3IodmFyIGU9bmV3IFVvLG49dC5nZXRDb29yZGluYXRlcygpLHI9MDtyPG4ubGVuZ3RoO3IrKyllLmFkZChuW3JdKTtyZXR1cm4gZS50b0FycmF5KG5ldyBBcnJheSgwKS5maWxsKG51bGwpKX0scmMucHJvdG90eXBlLmNvbXB1dGVNaW5pbXVtU2VnbWVudExlbmd0aD1mdW5jdGlvbih0KXtmb3IodmFyIGU9ZmkuTUFYX1ZBTFVFLG49MDtuPHQubGVuZ3RoLTE7bisrKXt2YXIgcj10W25dLmRpc3RhbmNlKHRbbisxXSk7cjxlJiYoZT1yKX1yZXR1cm4gZX0scmMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LHJjLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiByY30scmMuc25hcD1mdW5jdGlvbih0LGUsbil7dmFyIHI9bmV3IEFycmF5KDIpLmZpbGwobnVsbCksaT1uZXcgcmModCk7clswXT1pLnNuYXBUbyhlLG4pO3ZhciBvPW5ldyByYyhlKTtyZXR1cm4gclsxXT1vLnNuYXBUbyhyWzBdLG4pLHJ9LHJjLmNvbXB1dGVPdmVybGF5U25hcFRvbGVyYW5jZT1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1yYy5jb21wdXRlU2l6ZUJhc2VkU25hcFRvbGVyYW5jZSh0KSxuPXQuZ2V0UHJlY2lzaW9uTW9kZWwoKTtpZihuLmdldFR5cGUoKT09PUNzLkZJWEVEKXt2YXIgcj0xL24uZ2V0U2NhbGUoKSoyLzEuNDE1O3I+ZSYmKGU9cil9cmV0dXJuIGV9aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBpPWFyZ3VtZW50c1swXSxvPWFyZ3VtZW50c1sxXTtyZXR1cm4gTWF0aC5taW4ocmMuY29tcHV0ZU92ZXJsYXlTbmFwVG9sZXJhbmNlKGkpLHJjLmNvbXB1dGVPdmVybGF5U25hcFRvbGVyYW5jZShvKSl9fSxyYy5jb21wdXRlU2l6ZUJhc2VkU25hcFRvbGVyYW5jZT1mdW5jdGlvbih0KXt2YXIgZT10LmdldEVudmVsb3BlSW50ZXJuYWwoKTtyZXR1cm4gTWF0aC5taW4oZS5nZXRIZWlnaHQoKSxlLmdldFdpZHRoKCkpKnJjLlNOQVBfUFJFQ0lTSU9OX0ZBQ1RPUn0scmMuc25hcFRvU2VsZj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIG5ldyByYyh0KS5zbmFwVG9TZWxmKGUsbil9LGljLlNOQVBfUFJFQ0lTSU9OX0ZBQ1RPUi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMWUtOX0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMocmMsaWMpO3ZhciBvYz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsbixyKXt0LmNhbGwodGhpcyksdGhpcy5fc25hcFRvbGVyYW5jZT1lfHxudWxsLHRoaXMuX3NuYXBQdHM9bnx8bnVsbCx0aGlzLl9pc1NlbGZTbmFwPXZvaWQgMCE9PXImJnJ9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLnNuYXBMaW5lPWZ1bmN0aW9uKHQsZSl7dmFyIG49bmV3IG5jKHQsdGhpcy5fc25hcFRvbGVyYW5jZSk7cmV0dXJuIG4uc2V0QWxsb3dTbmFwcGluZ1RvU291cmNlVmVydGljZXModGhpcy5faXNTZWxmU25hcCksbi5zbmFwVG8oZSl9LGUucHJvdG90eXBlLnRyYW5zZm9ybUNvb3JkaW5hdGVzPWZ1bmN0aW9uKHQsZSl7dmFyIG49dC50b0Nvb3JkaW5hdGVBcnJheSgpLHI9dGhpcy5zbmFwTGluZShuLHRoaXMuX3NuYXBQdHMpO3JldHVybiB0aGlzLl9mYWN0b3J5LmdldENvb3JkaW5hdGVTZXF1ZW5jZUZhY3RvcnkoKS5jcmVhdGUocil9LGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LGV9KGVjKSxzYz1mdW5jdGlvbigpe3RoaXMuX2lzRmlyc3Q9ITAsdGhpcy5fY29tbW9uTWFudGlzc2FCaXRzQ291bnQ9NTMsdGhpcy5fY29tbW9uQml0cz0wLHRoaXMuX2NvbW1vblNpZ25FeHA9bnVsbH07c2MucHJvdG90eXBlLmdldENvbW1vbj1mdW5jdGlvbigpe3JldHVybiBmaS5sb25nQml0c1RvRG91YmxlKHRoaXMuX2NvbW1vbkJpdHMpfSxzYy5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQpe3ZhciBlPWZpLmRvdWJsZVRvTG9uZ0JpdHModCk7cmV0dXJuIHRoaXMuX2lzRmlyc3Q/KHRoaXMuX2NvbW1vbkJpdHM9ZSx0aGlzLl9jb21tb25TaWduRXhwPXNjLnNpZ25FeHBCaXRzKHRoaXMuX2NvbW1vbkJpdHMpLHRoaXMuX2lzRmlyc3Q9ITEsbnVsbCk6c2Muc2lnbkV4cEJpdHMoZSkhPT10aGlzLl9jb21tb25TaWduRXhwPyh0aGlzLl9jb21tb25CaXRzPTAsbnVsbCk6KHRoaXMuX2NvbW1vbk1hbnRpc3NhQml0c0NvdW50PXNjLm51bUNvbW1vbk1vc3RTaWdNYW50aXNzYUJpdHModGhpcy5fY29tbW9uQml0cyxlKSx2b2lkKHRoaXMuX2NvbW1vbkJpdHM9c2MuemVyb0xvd2VyQml0cyh0aGlzLl9jb21tb25CaXRzLDY0LSgxMit0aGlzLl9jb21tb25NYW50aXNzYUJpdHNDb3VudCkpKSl9LHNjLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1maS5sb25nQml0c1RvRG91YmxlKHQpLG49IjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiK2ZpLnRvQmluYXJ5U3RyaW5nKHQpLHI9bi5zdWJzdHJpbmcobi5sZW5ndGgtNjQpO3JldHVybiByLnN1YnN0cmluZygwLDEpKyIgICIrci5zdWJzdHJpbmcoMSwxMikrIihleHApICIrci5zdWJzdHJpbmcoMTIpKyIgWyAiK2UrIiBdIn19LHNjLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxzYy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gc2N9LHNjLmdldEJpdD1mdW5jdGlvbih0LGUpe3JldHVybiB0JjE8PGU/MTowfSxzYy5zaWduRXhwQml0cz1mdW5jdGlvbih0KXtyZXR1cm4gdD4+NTJ9LHNjLnplcm9Mb3dlckJpdHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdCZ+KCgxPDxlKS0xKX0sc2MubnVtQ29tbW9uTW9zdFNpZ01hbnRpc3NhQml0cz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0wLHI9NTI7cj49MDtyLS0pe2lmKHNjLmdldEJpdCh0LHIpIT09c2MuZ2V0Qml0KGUscikpcmV0dXJuIG47bisrfXJldHVybiA1Mn07dmFyIGFjPWZ1bmN0aW9uKCl7dGhpcy5fY29tbW9uQ29vcmQ9bnVsbCx0aGlzLl9jY0ZpbHRlcj1uZXcgY2N9LHVjPXtDb21tb25Db29yZGluYXRlRmlsdGVyOntjb25maWd1cmFibGU6ITB9LFRyYW5zbGF0ZXI6e2NvbmZpZ3VyYWJsZTohMH19O2FjLnByb3RvdHlwZS5hZGRDb21tb25CaXRzPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBsYyh0aGlzLl9jb21tb25Db29yZCk7dC5hcHBseShlKSx0Lmdlb21ldHJ5Q2hhbmdlZCgpfSxhYy5wcm90b3R5cGUucmVtb3ZlQ29tbW9uQml0cz1mdW5jdGlvbih0KXtpZigwPT09dGhpcy5fY29tbW9uQ29vcmQueCYmMD09PXRoaXMuX2NvbW1vbkNvb3JkLnkpcmV0dXJuIHQ7dmFyIGU9bmV3IHZpKHRoaXMuX2NvbW1vbkNvb3JkKTtlLng9LWUueCxlLnk9LWUueTt2YXIgbj1uZXcgbGMoZSk7cmV0dXJuIHQuYXBwbHkobiksdC5nZW9tZXRyeUNoYW5nZWQoKSx0fSxhYy5wcm90b3R5cGUuZ2V0Q29tbW9uQ29vcmRpbmF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb21tb25Db29yZH0sYWMucHJvdG90eXBlLmFkZD1mdW5jdGlvbih0KXt0LmFwcGx5KHRoaXMuX2NjRmlsdGVyKSx0aGlzLl9jb21tb25Db29yZD10aGlzLl9jY0ZpbHRlci5nZXRDb21tb25Db29yZGluYXRlKCl9LGFjLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxhYy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gYWN9LHVjLkNvbW1vbkNvb3JkaW5hdGVGaWx0ZXIuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIGNjfSx1Yy5UcmFuc2xhdGVyLmdldD1mdW5jdGlvbigpe3JldHVybiBsY30sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoYWMsdWMpO3ZhciBjYz1mdW5jdGlvbigpe3RoaXMuX2NvbW1vbkJpdHNYPW5ldyBzYyx0aGlzLl9jb21tb25CaXRzWT1uZXcgc2N9O2NjLnByb3RvdHlwZS5maWx0ZXI9ZnVuY3Rpb24odCl7dGhpcy5fY29tbW9uQml0c1guYWRkKHQueCksdGhpcy5fY29tbW9uQml0c1kuYWRkKHQueSl9LGNjLnByb3RvdHlwZS5nZXRDb21tb25Db29yZGluYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB2aSh0aGlzLl9jb21tb25CaXRzWC5nZXRDb21tb24oKSx0aGlzLl9jb21tb25CaXRzWS5nZXRDb21tb24oKSl9LGNjLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVyblthb119LGNjLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBjY307dmFyIGxjPWZ1bmN0aW9uKCl7dGhpcy50cmFucz1udWxsO3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLnRyYW5zPXR9O2xjLnByb3RvdHlwZS5maWx0ZXI9ZnVuY3Rpb24odCxlKXt2YXIgbj10LmdldE9yZGluYXRlKGUsMCkrdGhpcy50cmFucy54LHI9dC5nZXRPcmRpbmF0ZShlLDEpK3RoaXMudHJhbnMueTt0LnNldE9yZGluYXRlKGUsMCxuKSx0LnNldE9yZGluYXRlKGUsMSxyKX0sbGMucHJvdG90eXBlLmlzRG9uZT1mdW5jdGlvbigpe3JldHVybiExfSxsYy5wcm90b3R5cGUuaXNHZW9tZXRyeUNoYW5nZWQ9ZnVuY3Rpb24oKXtyZXR1cm4hMH0sbGMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW1dvXX0sbGMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGxjfTt2YXIgaGM9ZnVuY3Rpb24odCxlKXt0aGlzLl9nZW9tPW5ldyBBcnJheSgyKS5maWxsKG51bGwpLHRoaXMuX3NuYXBUb2xlcmFuY2U9bnVsbCx0aGlzLl9jYnI9bnVsbCx0aGlzLl9nZW9tWzBdPXQsdGhpcy5fZ2VvbVsxXT1lLHRoaXMuY29tcHV0ZVNuYXBUb2xlcmFuY2UoKX07aGMucHJvdG90eXBlLnNlbGZTbmFwPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgcmModCkuc25hcFRvKHQsdGhpcy5fc25hcFRvbGVyYW5jZSl9LGhjLnByb3RvdHlwZS5yZW1vdmVDb21tb25CaXRzPWZ1bmN0aW9uKHQpe3RoaXMuX2Nicj1uZXcgYWMsdGhpcy5fY2JyLmFkZCh0WzBdKSx0aGlzLl9jYnIuYWRkKHRbMV0pO3ZhciBlPW5ldyBBcnJheSgyKS5maWxsKG51bGwpO3JldHVybiBlWzBdPXRoaXMuX2Nici5yZW1vdmVDb21tb25CaXRzKHRbMF0uY29weSgpKSxlWzFdPXRoaXMuX2Nici5yZW1vdmVDb21tb25CaXRzKHRbMV0uY29weSgpKSxlfSxoYy5wcm90b3R5cGUucHJlcGFyZVJlc3VsdD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fY2JyLmFkZENvbW1vbkJpdHModCksdH0saGMucHJvdG90eXBlLmdldFJlc3VsdEdlb21ldHJ5PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuc25hcCh0aGlzLl9nZW9tKSxuPU9jLm92ZXJsYXlPcChlWzBdLGVbMV0sdCk7cmV0dXJuIHRoaXMucHJlcGFyZVJlc3VsdChuKX0saGMucHJvdG90eXBlLmNoZWNrVmFsaWQ9ZnVuY3Rpb24odCl7dC5pc1ZhbGlkKCl8fGtpLm91dC5wcmludGxuKCJTbmFwcGVkIGdlb21ldHJ5IGlzIGludmFsaWQiKX0saGMucHJvdG90eXBlLmNvbXB1dGVTbmFwVG9sZXJhbmNlPWZ1bmN0aW9uKCl7dGhpcy5fc25hcFRvbGVyYW5jZT1yYy5jb21wdXRlT3ZlcmxheVNuYXBUb2xlcmFuY2UodGhpcy5fZ2VvbVswXSx0aGlzLl9nZW9tWzFdKX0saGMucHJvdG90eXBlLnNuYXA9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5yZW1vdmVDb21tb25CaXRzKHQpO3JldHVybiByYy5zbmFwKGVbMF0sZVsxXSx0aGlzLl9zbmFwVG9sZXJhbmNlKX0saGMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGhjLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBoY30saGMub3ZlcmxheU9wPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gbmV3IGhjKHQsZSkuZ2V0UmVzdWx0R2VvbWV0cnkobil9LGhjLnVuaW9uPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGhjLm92ZXJsYXlPcCh0LGUsT2MuVU5JT04pfSxoYy5pbnRlcnNlY3Rpb249ZnVuY3Rpb24odCxlKXtyZXR1cm4gaGMub3ZlcmxheU9wKHQsZSxPYy5JTlRFUlNFQ1RJT04pfSxoYy5zeW1EaWZmZXJlbmNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGhjLm92ZXJsYXlPcCh0LGUsT2MuU1lNRElGRkVSRU5DRSl9LGhjLmRpZmZlcmVuY2U9ZnVuY3Rpb24odCxlKXtyZXR1cm4gaGMub3ZlcmxheU9wKHQsZSxPYy5ESUZGRVJFTkNFKX07dmFyIGZjPWZ1bmN0aW9uKHQsZSl7dGhpcy5fZ2VvbT1uZXcgQXJyYXkoMikuZmlsbChudWxsKSx0aGlzLl9nZW9tWzBdPXQsdGhpcy5fZ2VvbVsxXT1lfTtmYy5wcm90b3R5cGUuZ2V0UmVzdWx0R2VvbWV0cnk9ZnVuY3Rpb24odCl7dmFyIGU9bnVsbCxuPSExLHI9bnVsbDt0cnl7ZT1PYy5vdmVybGF5T3AodGhpcy5fZ2VvbVswXSx0aGlzLl9nZW9tWzFdLHQpO249ITB9Y2F0Y2godCl7aWYoISh0IGluc3RhbmNlb2YgV2kpKXRocm93IHQ7cj10fWlmKCFuKXRyeXtlPWhjLm92ZXJsYXlPcCh0aGlzLl9nZW9tWzBdLHRoaXMuX2dlb21bMV0sdCl9Y2F0Y2godCl7dGhyb3cgdCBpbnN0YW5jZW9mIFdpP3I6dH1yZXR1cm4gZX0sZmMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGZjLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBmY30sZmMub3ZlcmxheU9wPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gbmV3IGZjKHQsZSkuZ2V0UmVzdWx0R2VvbWV0cnkobil9LGZjLnVuaW9uPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGZjLm92ZXJsYXlPcCh0LGUsT2MuVU5JT04pfSxmYy5pbnRlcnNlY3Rpb249ZnVuY3Rpb24odCxlKXtyZXR1cm4gZmMub3ZlcmxheU9wKHQsZSxPYy5JTlRFUlNFQ1RJT04pfSxmYy5zeW1EaWZmZXJlbmNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGZjLm92ZXJsYXlPcCh0LGUsT2MuU1lNRElGRkVSRU5DRSl9LGZjLmRpZmZlcmVuY2U9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZmMub3ZlcmxheU9wKHQsZSxPYy5ESUZGRVJFTkNFKX07dmFyIHBjPWZ1bmN0aW9uKCl7dGhpcy5tY2U9bnVsbCx0aGlzLmNoYWluSW5kZXg9bnVsbDt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV07dGhpcy5tY2U9dCx0aGlzLmNoYWluSW5kZXg9ZX07cGMucHJvdG90eXBlLmNvbXB1dGVJbnRlcnNlY3Rpb25zPWZ1bmN0aW9uKHQsZSl7dGhpcy5tY2UuY29tcHV0ZUludGVyc2VjdHNGb3JDaGFpbih0aGlzLmNoYWluSW5kZXgsdC5tY2UsdC5jaGFpbkluZGV4LGUpfSxwYy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0scGMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHBjfTt2YXIgZGM9ZnVuY3Rpb24gdCgpe2lmKHRoaXMuX2xhYmVsPW51bGwsdGhpcy5feFZhbHVlPW51bGwsdGhpcy5fZXZlbnRUeXBlPW51bGwsdGhpcy5faW5zZXJ0RXZlbnQ9bnVsbCx0aGlzLl9kZWxldGVFdmVudEluZGV4PW51bGwsdGhpcy5fb2JqPW51bGwsMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTt0aGlzLl9ldmVudFR5cGU9dC5ERUxFVEUsdGhpcy5feFZhbHVlPWUsdGhpcy5faW5zZXJ0RXZlbnQ9bn1lbHNlIGlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgcj1hcmd1bWVudHNbMF0saT1hcmd1bWVudHNbMV0sbz1hcmd1bWVudHNbMl07dGhpcy5fZXZlbnRUeXBlPXQuSU5TRVJULHRoaXMuX2xhYmVsPXIsdGhpcy5feFZhbHVlPWksdGhpcy5fb2JqPW99fSxnYz17SU5TRVJUOntjb25maWd1cmFibGU6ITB9LERFTEVURTp7Y29uZmlndXJhYmxlOiEwfX07ZGMucHJvdG90eXBlLmlzRGVsZXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2V2ZW50VHlwZT09PWRjLkRFTEVURX0sZGMucHJvdG90eXBlLnNldERlbGV0ZUV2ZW50SW5kZXg9ZnVuY3Rpb24odCl7dGhpcy5fZGVsZXRlRXZlbnRJbmRleD10fSxkYy5wcm90b3R5cGUuZ2V0T2JqZWN0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29ian0sZGMucHJvdG90eXBlLmNvbXBhcmVUbz1mdW5jdGlvbih0KXt2YXIgZT10O3JldHVybiB0aGlzLl94VmFsdWU8ZS5feFZhbHVlPy0xOnRoaXMuX3hWYWx1ZT5lLl94VmFsdWU/MTp0aGlzLl9ldmVudFR5cGU8ZS5fZXZlbnRUeXBlPy0xOnRoaXMuX2V2ZW50VHlwZT5lLl9ldmVudFR5cGU/MTowfSxkYy5wcm90b3R5cGUuZ2V0SW5zZXJ0RXZlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faW5zZXJ0RXZlbnR9LGRjLnByb3RvdHlwZS5pc0luc2VydD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9ldmVudFR5cGU9PT1kYy5JTlNFUlR9LGRjLnByb3RvdHlwZS5pc1NhbWVMYWJlbD1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9PXRoaXMuX2xhYmVsJiZ0aGlzLl9sYWJlbD09PXQuX2xhYmVsfSxkYy5wcm90b3R5cGUuZ2V0RGVsZXRlRXZlbnRJbmRleD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kZWxldGVFdmVudEluZGV4fSxkYy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bZGldfSxkYy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZGN9LGdjLklOU0VSVC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMX0sZ2MuREVMRVRFLmdldD1mdW5jdGlvbigpe3JldHVybiAyfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhkYyxnYyk7dmFyIHljPWZ1bmN0aW9uKCl7fTt5Yy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0seWMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHljfTt2YXIgbWM9ZnVuY3Rpb24oKXt0aGlzLl9oYXNJbnRlcnNlY3Rpb249ITEsdGhpcy5faGFzUHJvcGVyPSExLHRoaXMuX2hhc1Byb3BlckludGVyaW9yPSExLHRoaXMuX3Byb3BlckludGVyc2VjdGlvblBvaW50PW51bGwsdGhpcy5fbGk9bnVsbCx0aGlzLl9pbmNsdWRlUHJvcGVyPW51bGwsdGhpcy5fcmVjb3JkSXNvbGF0ZWQ9bnVsbCx0aGlzLl9pc1NlbGZJbnRlcnNlY3Rpb249bnVsbCx0aGlzLl9udW1JbnRlcnNlY3Rpb25zPTAsdGhpcy5udW1UZXN0cz0wLHRoaXMuX2JkeU5vZGVzPW51bGwsdGhpcy5faXNEb25lPSExLHRoaXMuX2lzRG9uZVdoZW5Qcm9wZXJJbnQ9ITE7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdLG49YXJndW1lbnRzWzJdO3RoaXMuX2xpPXQsdGhpcy5faW5jbHVkZVByb3Blcj1lLHRoaXMuX3JlY29yZElzb2xhdGVkPW59O21jLnByb3RvdHlwZS5pc1RyaXZpYWxJbnRlcnNlY3Rpb249ZnVuY3Rpb24odCxlLG4scil7aWYodD09PW4mJjE9PT10aGlzLl9saS5nZXRJbnRlcnNlY3Rpb25OdW0oKSl7aWYobWMuaXNBZGphY2VudFNlZ21lbnRzKGUscikpcmV0dXJuITA7aWYodC5pc0Nsb3NlZCgpKXt2YXIgaT10LmdldE51bVBvaW50cygpLTE7aWYoMD09PWUmJnI9PT1pfHwwPT09ciYmZT09PWkpcmV0dXJuITB9fXJldHVybiExfSxtYy5wcm90b3R5cGUuZ2V0UHJvcGVySW50ZXJzZWN0aW9uUG9pbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHJvcGVySW50ZXJzZWN0aW9uUG9pbnR9LG1jLnByb3RvdHlwZS5zZXRJc0RvbmVJZlByb3BlckludD1mdW5jdGlvbih0KXt0aGlzLl9pc0RvbmVXaGVuUHJvcGVySW50PXR9LG1jLnByb3RvdHlwZS5oYXNQcm9wZXJJbnRlcmlvckludGVyc2VjdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9oYXNQcm9wZXJJbnRlcmlvcn0sbWMucHJvdG90eXBlLmlzQm91bmRhcnlQb2ludEludGVybmFsPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPWUuaXRlcmF0b3IoKTtuLmhhc05leHQoKTspe3ZhciByPW4ubmV4dCgpLmdldENvb3JkaW5hdGUoKTtpZih0LmlzSW50ZXJzZWN0aW9uKHIpKXJldHVybiEwfXJldHVybiExfSxtYy5wcm90b3R5cGUuaGFzUHJvcGVySW50ZXJzZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2hhc1Byb3Blcn0sbWMucHJvdG90eXBlLmhhc0ludGVyc2VjdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9oYXNJbnRlcnNlY3Rpb259LG1jLnByb3RvdHlwZS5pc0RvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNEb25lfSxtYy5wcm90b3R5cGUuaXNCb3VuZGFyeVBvaW50PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGwhPT1lJiYhKCF0aGlzLmlzQm91bmRhcnlQb2ludEludGVybmFsKHQsZVswXSkmJiF0aGlzLmlzQm91bmRhcnlQb2ludEludGVybmFsKHQsZVsxXSkpfSxtYy5wcm90b3R5cGUuc2V0Qm91bmRhcnlOb2Rlcz1mdW5jdGlvbih0LGUpe3RoaXMuX2JkeU5vZGVzPW5ldyBBcnJheSgyKS5maWxsKG51bGwpLHRoaXMuX2JkeU5vZGVzWzBdPXQsdGhpcy5fYmR5Tm9kZXNbMV09ZX0sbWMucHJvdG90eXBlLmFkZEludGVyc2VjdGlvbnM9ZnVuY3Rpb24odCxlLG4scil7aWYodD09PW4mJmU9PT1yKXJldHVybiBudWxsO3RoaXMubnVtVGVzdHMrKzt2YXIgaT10LmdldENvb3JkaW5hdGVzKClbZV0sbz10LmdldENvb3JkaW5hdGVzKClbZSsxXSxzPW4uZ2V0Q29vcmRpbmF0ZXMoKVtyXSxhPW4uZ2V0Q29vcmRpbmF0ZXMoKVtyKzFdO3RoaXMuX2xpLmNvbXB1dGVJbnRlcnNlY3Rpb24oaSxvLHMsYSksdGhpcy5fbGkuaGFzSW50ZXJzZWN0aW9uKCkmJih0aGlzLl9yZWNvcmRJc29sYXRlZCYmKHQuc2V0SXNvbGF0ZWQoITEpLG4uc2V0SXNvbGF0ZWQoITEpKSx0aGlzLl9udW1JbnRlcnNlY3Rpb25zKyssdGhpcy5pc1RyaXZpYWxJbnRlcnNlY3Rpb24odCxlLG4scil8fCh0aGlzLl9oYXNJbnRlcnNlY3Rpb249ITAsKHRoaXMuX2luY2x1ZGVQcm9wZXJ8fCF0aGlzLl9saS5pc1Byb3BlcigpKSYmKHQuYWRkSW50ZXJzZWN0aW9ucyh0aGlzLl9saSxlLDApLG4uYWRkSW50ZXJzZWN0aW9ucyh0aGlzLl9saSxyLDEpKSx0aGlzLl9saS5pc1Byb3BlcigpJiYodGhpcy5fcHJvcGVySW50ZXJzZWN0aW9uUG9pbnQ9dGhpcy5fbGkuZ2V0SW50ZXJzZWN0aW9uKDApLmNvcHkoKSx0aGlzLl9oYXNQcm9wZXI9ITAsdGhpcy5faXNEb25lV2hlblByb3BlckludCYmKHRoaXMuX2lzRG9uZT0hMCksdGhpcy5pc0JvdW5kYXJ5UG9pbnQodGhpcy5fbGksdGhpcy5fYmR5Tm9kZXMpfHwodGhpcy5faGFzUHJvcGVySW50ZXJpb3I9ITApKSkpfSxtYy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sbWMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIG1jfSxtYy5pc0FkamFjZW50U2VnbWVudHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gMT09PU1hdGguYWJzKHQtZSl9O3ZhciB2Yz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dC5jYWxsKHRoaXMpLHRoaXMuZXZlbnRzPW5ldyB4byx0aGlzLm5PdmVybGFwcz1udWxsfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5wcmVwYXJlRXZlbnRzPWZ1bmN0aW9uKCl7YWEuc29ydCh0aGlzLmV2ZW50cyk7Zm9yKHZhciB0PTA7dDx0aGlzLmV2ZW50cy5zaXplKCk7dCsrKXt2YXIgZT10aGlzLmV2ZW50cy5nZXQodCk7ZS5pc0RlbGV0ZSgpJiZlLmdldEluc2VydEV2ZW50KCkuc2V0RGVsZXRlRXZlbnRJbmRleCh0KX19LGUucHJvdG90eXBlLmNvbXB1dGVJbnRlcnNlY3Rpb25zPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLm5PdmVybGFwcz0wLHRoaXMucHJlcGFyZUV2ZW50cygpO2Zvcih2YXIgZT0wO2U8dGhpcy5ldmVudHMuc2l6ZSgpO2UrKyl7dmFyIG49dGhpcy5ldmVudHMuZ2V0KGUpO2lmKG4uaXNJbnNlcnQoKSYmdGhpcy5wcm9jZXNzT3ZlcmxhcHMoZSxuLmdldERlbGV0ZUV2ZW50SW5kZXgoKSxuLHQpLHQuaXNEb25lKCkpYnJlYWt9fWVsc2UgaWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpaWYoYXJndW1lbnRzWzJdaW5zdGFuY2VvZiBtYyYmRWkoYXJndW1lbnRzWzBdLHZvKSYmRWkoYXJndW1lbnRzWzFdLHZvKSl7dmFyIHI9YXJndW1lbnRzWzBdLGk9YXJndW1lbnRzWzFdLG89YXJndW1lbnRzWzJdO3RoaXMuYWRkRWRnZXMocixyKSx0aGlzLmFkZEVkZ2VzKGksaSksdGhpcy5jb21wdXRlSW50ZXJzZWN0aW9ucyhvKX1lbHNlIGlmKCJib29sZWFuIj09dHlwZW9mIGFyZ3VtZW50c1syXSYmRWkoYXJndW1lbnRzWzBdLHZvKSYmYXJndW1lbnRzWzFdaW5zdGFuY2VvZiBtYyl7dmFyIHM9YXJndW1lbnRzWzBdLGE9YXJndW1lbnRzWzFdO2FyZ3VtZW50c1syXT90aGlzLmFkZEVkZ2VzKHMsbnVsbCk6dGhpcy5hZGRFZGdlcyhzKSx0aGlzLmNvbXB1dGVJbnRlcnNlY3Rpb25zKGEpfX0sZS5wcm90b3R5cGUuYWRkRWRnZT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10LmdldE1vbm90b25lQ2hhaW5FZGdlKCkscj1uLmdldFN0YXJ0SW5kZXhlcygpLGk9MDtpPHIubGVuZ3RoLTE7aSsrKXt2YXIgbz1uZXcgcGMobixpKSxzPW5ldyBkYyhlLG4uZ2V0TWluWChpKSxvKTt0aGlzLmV2ZW50cy5hZGQocyksdGhpcy5ldmVudHMuYWRkKG5ldyBkYyhuLmdldE1heFgoaSkscykpfX0sZS5wcm90b3R5cGUucHJvY2Vzc092ZXJsYXBzPWZ1bmN0aW9uKHQsZSxuLHIpe2Zvcih2YXIgaT1uLmdldE9iamVjdCgpLG89dDtvPGU7bysrKXt2YXIgcz10aGlzLmV2ZW50cy5nZXQobyk7aWYocy5pc0luc2VydCgpKXt2YXIgYT1zLmdldE9iamVjdCgpO24uaXNTYW1lTGFiZWwocyl8fChpLmNvbXB1dGVJbnRlcnNlY3Rpb25zKGEsciksdGhpcy5uT3ZlcmxhcHMrKyl9fX0sZS5wcm90b3R5cGUuYWRkRWRnZXM9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aClmb3IodmFyIHQ9YXJndW1lbnRzWzBdLml0ZXJhdG9yKCk7dC5oYXNOZXh0KCk7KXt2YXIgZT10Lm5leHQoKTt0aGlzLmFkZEVkZ2UoZSxlKX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKWZvcih2YXIgbj1hcmd1bWVudHNbMV0scj1hcmd1bWVudHNbMF0uaXRlcmF0b3IoKTtyLmhhc05leHQoKTspe3ZhciBpPXIubmV4dCgpO3RoaXMuYWRkRWRnZShpLG4pfX0sZS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sZX0oeWMpLF9jPWZ1bmN0aW9uKCl7dGhpcy5fbWluPWZpLlBPU0lUSVZFX0lORklOSVRZLHRoaXMuX21heD1maS5ORUdBVElWRV9JTkZJTklUWX0seGM9e05vZGVDb21wYXJhdG9yOntjb25maWd1cmFibGU6ITB9fTtfYy5wcm90b3R5cGUuZ2V0TWluPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21pbn0sX2MucHJvdG90eXBlLmludGVyc2VjdHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4hKHRoaXMuX21pbj5lfHx0aGlzLl9tYXg8dCl9LF9jLnByb3RvdHlwZS5nZXRNYXg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWF4fSxfYy5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gWGkudG9MaW5lU3RyaW5nKG5ldyB2aSh0aGlzLl9taW4sMCksbmV3IHZpKHRoaXMuX21heCwwKSl9LF9jLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxfYy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gX2N9LHhjLk5vZGVDb21wYXJhdG9yLmdldD1mdW5jdGlvbigpe3JldHVybiB3Y30sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoX2MseGMpO3ZhciB3Yz1mdW5jdGlvbigpe307d2MucHJvdG90eXBlLmNvbXBhcmU9ZnVuY3Rpb24odCxlKXt2YXIgbj10LHI9ZSxpPShuLl9taW4rbi5fbWF4KS8yLG89KHIuX21pbityLl9tYXgpLzI7cmV0dXJuIGk8bz8tMTppPm8/MTowfSx3Yy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5beWldfSx3Yy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gd2N9O3ZhciBiYz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dC5jYWxsKHRoaXMpLHRoaXMuX2l0ZW09bnVsbDt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV0scj1hcmd1bWVudHNbMl07dGhpcy5fbWluPWUsdGhpcy5fbWF4PW4sdGhpcy5faXRlbT1yfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5xdWVyeT1mdW5jdGlvbih0LGUsbil7aWYoIXRoaXMuaW50ZXJzZWN0cyh0LGUpKXJldHVybiBudWxsO24udmlzaXRJdGVtKHRoaXMuX2l0ZW0pfSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxlfShfYyksRGM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3QuY2FsbCh0aGlzKSx0aGlzLl9ub2RlMT1udWxsLHRoaXMuX25vZGUyPW51bGw7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO3RoaXMuX25vZGUxPWUsdGhpcy5fbm9kZTI9bix0aGlzLmJ1aWxkRXh0ZW50KHRoaXMuX25vZGUxLHRoaXMuX25vZGUyKX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuYnVpbGRFeHRlbnQ9ZnVuY3Rpb24odCxlKXt0aGlzLl9taW49TWF0aC5taW4odC5fbWluLGUuX21pbiksdGhpcy5fbWF4PU1hdGgubWF4KHQuX21heCxlLl9tYXgpfSxlLnByb3RvdHlwZS5xdWVyeT1mdW5jdGlvbih0LGUsbil7aWYoIXRoaXMuaW50ZXJzZWN0cyh0LGUpKXJldHVybiBudWxsO251bGwhPT10aGlzLl9ub2RlMSYmdGhpcy5fbm9kZTEucXVlcnkodCxlLG4pLG51bGwhPT10aGlzLl9ub2RlMiYmdGhpcy5fbm9kZTIucXVlcnkodCxlLG4pfSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxlfShfYyksRWM9ZnVuY3Rpb24oKXt0aGlzLl9sZWF2ZXM9bmV3IHhvLHRoaXMuX3Jvb3Q9bnVsbCx0aGlzLl9sZXZlbD0wfTtFYy5wcm90b3R5cGUuYnVpbGRUcmVlPWZ1bmN0aW9uKCl7YWEuc29ydCh0aGlzLl9sZWF2ZXMsbmV3IF9jLk5vZGVDb21wYXJhdG9yKTtmb3IodmFyIHQ9dGhpcy5fbGVhdmVzLGU9bnVsbCxuPW5ldyB4bzs7KXtpZih0aGlzLmJ1aWxkTGV2ZWwodCxuKSwxPT09bi5zaXplKCkpcmV0dXJuIG4uZ2V0KDApO2U9dCx0PW4sbj1lfX0sRWMucHJvdG90eXBlLmluc2VydD1mdW5jdGlvbih0LGUsbil7aWYobnVsbCE9PXRoaXMuX3Jvb3QpdGhyb3cgbmV3IEVycm9yKCJJbmRleCBjYW5ub3QgYmUgYWRkZWQgdG8gb25jZSBpdCBoYXMgYmVlbiBxdWVyaWVkIik7dGhpcy5fbGVhdmVzLmFkZChuZXcgYmModCxlLG4pKX0sRWMucHJvdG90eXBlLnF1ZXJ5PWZ1bmN0aW9uKHQsZSxuKXt0aGlzLmluaXQoKSx0aGlzLl9yb290LnF1ZXJ5KHQsZSxuKX0sRWMucHJvdG90eXBlLmJ1aWxkUm9vdD1mdW5jdGlvbigpe2lmKG51bGwhPT10aGlzLl9yb290KXJldHVybiBudWxsO3RoaXMuX3Jvb3Q9dGhpcy5idWlsZFRyZWUoKX0sRWMucHJvdG90eXBlLnByaW50Tm9kZT1mdW5jdGlvbih0KXtraS5vdXQucHJpbnRsbihYaS50b0xpbmVTdHJpbmcobmV3IHZpKHQuX21pbix0aGlzLl9sZXZlbCksbmV3IHZpKHQuX21heCx0aGlzLl9sZXZlbCkpKX0sRWMucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oKXtpZihudWxsIT09dGhpcy5fcm9vdClyZXR1cm4gbnVsbDt0aGlzLmJ1aWxkUm9vdCgpfSxFYy5wcm90b3R5cGUuYnVpbGRMZXZlbD1mdW5jdGlvbih0LGUpe3RoaXMuX2xldmVsKyssZS5jbGVhcigpO2Zvcih2YXIgbj0wO248dC5zaXplKCk7bis9Mil7dmFyIHI9dC5nZXQobik7aWYobnVsbD09PShuKzE8dC5zaXplKCk/dC5nZXQobik6bnVsbCkpZS5hZGQocik7ZWxzZXt2YXIgaT1uZXcgRGModC5nZXQobiksdC5nZXQobisxKSk7ZS5hZGQoaSl9fX0sRWMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LEVjLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBFY307dmFyIENjPWZ1bmN0aW9uKCl7dGhpcy5faXRlbXM9bmV3IHhvfTtDYy5wcm90b3R5cGUudmlzaXRJdGVtPWZ1bmN0aW9uKHQpe3RoaXMuX2l0ZW1zLmFkZCh0KX0sQ2MucHJvdG90eXBlLmdldEl0ZW1zPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2l0ZW1zfSxDYy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bcmFdfSxDYy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gQ2N9O3ZhciBTYz1mdW5jdGlvbigpe3RoaXMuX2luZGV4PW51bGw7dmFyIHQ9YXJndW1lbnRzWzBdO2lmKCFFaSh0LGxzKSl0aHJvdyBuZXcgaGk7dGhpcy5faW5kZXg9bmV3IEljKHQpfSxBYz17U2VnbWVudFZpc2l0b3I6e2NvbmZpZ3VyYWJsZTohMH0sSW50ZXJ2YWxJbmRleGVkR2VvbWV0cnk6e2NvbmZpZ3VyYWJsZTohMH19O1NjLnByb3RvdHlwZS5sb2NhdGU9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IHRvKHQpLG49bmV3IE5jKGUpO3JldHVybiB0aGlzLl9pbmRleC5xdWVyeSh0LnksdC55LG4pLGUuZ2V0TG9jYXRpb24oKX0sU2MucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW1dhXX0sU2MucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFNjfSxBYy5TZWdtZW50VmlzaXRvci5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gTmN9LEFjLkludGVydmFsSW5kZXhlZEdlb21ldHJ5LmdldD1mdW5jdGlvbigpe3JldHVybiBJY30sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoU2MsQWMpO3ZhciBOYz1mdW5jdGlvbigpe3RoaXMuX2NvdW50ZXI9bnVsbDt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5fY291bnRlcj10fTtOYy5wcm90b3R5cGUudmlzaXRJdGVtPWZ1bmN0aW9uKHQpe3ZhciBlPXQ7dGhpcy5fY291bnRlci5jb3VudFNlZ21lbnQoZS5nZXRDb29yZGluYXRlKDApLGUuZ2V0Q29vcmRpbmF0ZSgxKSl9LE5jLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltyYV19LE5jLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBOY307dmFyIEljPWZ1bmN0aW9uKCl7dGhpcy5faW5kZXg9bmV3IEVjO3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLmluaXQodCl9O0ljLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1GdS5nZXRMaW5lcyh0KS5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7dmFyIG49ZS5uZXh0KCkuZ2V0Q29vcmRpbmF0ZXMoKTt0aGlzLmFkZExpbmUobil9fSxJYy5wcm90b3R5cGUuYWRkTGluZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9MTtlPHQubGVuZ3RoO2UrKyl7dmFyIG49bmV3IGJhKHRbZS0xXSx0W2VdKSxyPU1hdGgubWluKG4ucDAueSxuLnAxLnkpLGk9TWF0aC5tYXgobi5wMC55LG4ucDEueSk7dGhpcy5faW5kZXguaW5zZXJ0KHIsaSxuKX19LEljLnByb3RvdHlwZS5xdWVyeT1mdW5jdGlvbigpe2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV0sbj1uZXcgQ2M7cmV0dXJuIHRoaXMuX2luZGV4LnF1ZXJ5KHQsZSxuKSxuLmdldEl0ZW1zKCl9aWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciByPWFyZ3VtZW50c1swXSxpPWFyZ3VtZW50c1sxXSxvPWFyZ3VtZW50c1syXTt0aGlzLl9pbmRleC5xdWVyeShyLGksbyl9fSxJYy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sSWMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIEljfTt2YXIgTWM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe2lmKHQuY2FsbCh0aGlzKSx0aGlzLl9wYXJlbnRHZW9tPW51bGwsdGhpcy5fbGluZUVkZ2VNYXA9bmV3IEVzLHRoaXMuX2JvdW5kYXJ5Tm9kZVJ1bGU9bnVsbCx0aGlzLl91c2VCb3VuZGFyeURldGVybWluYXRpb25SdWxlPSEwLHRoaXMuX2FyZ0luZGV4PW51bGwsdGhpcy5fYm91bmRhcnlOb2Rlcz1udWxsLHRoaXMuX2hhc1Rvb0Zld1BvaW50cz0hMSx0aGlzLl9pbnZhbGlkUG9pbnQ9bnVsbCx0aGlzLl9hcmVhUHRMb2NhdG9yPW51bGwsdGhpcy5fcHRMb2NhdG9yPW5ldyBUdSwyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdLHI9dW8uT0dDX1NGU19CT1VOREFSWV9SVUxFO3RoaXMuX2FyZ0luZGV4PWUsdGhpcy5fcGFyZW50R2VvbT1uLHRoaXMuX2JvdW5kYXJ5Tm9kZVJ1bGU9cixudWxsIT09biYmdGhpcy5hZGQobil9ZWxzZSBpZigzPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGk9YXJndW1lbnRzWzBdLG89YXJndW1lbnRzWzFdLHM9YXJndW1lbnRzWzJdO3RoaXMuX2FyZ0luZGV4PWksdGhpcy5fcGFyZW50R2VvbT1vLHRoaXMuX2JvdW5kYXJ5Tm9kZVJ1bGU9cyxudWxsIT09byYmdGhpcy5hZGQobyl9fXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5pbnNlcnRCb3VuZGFyeVBvaW50PWZ1bmN0aW9uKHQsbil7dmFyIHI9dGhpcy5fbm9kZXMuYWRkTm9kZShuKS5nZXRMYWJlbCgpLGk9MTtyLmdldExvY2F0aW9uKHQsRnMuT04pPT09YmkuQk9VTkRBUlkmJmkrKzt2YXIgbz1lLmRldGVybWluZUJvdW5kYXJ5KHRoaXMuX2JvdW5kYXJ5Tm9kZVJ1bGUsaSk7ci5zZXRMb2NhdGlvbih0LG8pfSxlLnByb3RvdHlwZS5jb21wdXRlU2VsZk5vZGVzPWZ1bmN0aW9uKCl7aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXTtyZXR1cm4gdGhpcy5jb21wdXRlU2VsZk5vZGVzKHQsZSwhMSl9aWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1sxXSxyPWFyZ3VtZW50c1syXSxpPW5ldyBtYyhhcmd1bWVudHNbMF0sITAsITEpO2kuc2V0SXNEb25lSWZQcm9wZXJJbnQocik7dmFyIG89dGhpcy5jcmVhdGVFZGdlU2V0SW50ZXJzZWN0b3IoKSxzPXRoaXMuX3BhcmVudEdlb20gaW5zdGFuY2VvZiBwc3x8dGhpcy5fcGFyZW50R2VvbSBpbnN0YW5jZW9mIGhzfHx0aGlzLl9wYXJlbnRHZW9tIGluc3RhbmNlb2YgZHMsYT1ufHwhcztyZXR1cm4gby5jb21wdXRlSW50ZXJzZWN0aW9ucyh0aGlzLl9lZGdlcyxpLGEpLHRoaXMuYWRkU2VsZkludGVyc2VjdGlvbk5vZGVzKHRoaXMuX2FyZ0luZGV4KSxpfX0sZS5wcm90b3R5cGUuY29tcHV0ZVNwbGl0RWRnZXM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuX2VkZ2VzLml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXtlLm5leHQoKS5laUxpc3QuYWRkU3BsaXRFZGdlcyh0KX19LGUucHJvdG90eXBlLmNvbXB1dGVFZGdlSW50ZXJzZWN0aW9ucz1mdW5jdGlvbih0LGUsbil7dmFyIHI9bmV3IG1jKGUsbiwhMCk7cmV0dXJuIHIuc2V0Qm91bmRhcnlOb2Rlcyh0aGlzLmdldEJvdW5kYXJ5Tm9kZXMoKSx0LmdldEJvdW5kYXJ5Tm9kZXMoKSksdGhpcy5jcmVhdGVFZGdlU2V0SW50ZXJzZWN0b3IoKS5jb21wdXRlSW50ZXJzZWN0aW9ucyh0aGlzLl9lZGdlcyx0Ll9lZGdlcyxyKSxyfSxlLnByb3RvdHlwZS5nZXRHZW9tZXRyeT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wYXJlbnRHZW9tfSxlLnByb3RvdHlwZS5nZXRCb3VuZGFyeU5vZGVSdWxlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2JvdW5kYXJ5Tm9kZVJ1bGV9LGUucHJvdG90eXBlLmhhc1Rvb0Zld1BvaW50cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9oYXNUb29GZXdQb2ludHN9LGUucHJvdG90eXBlLmFkZFBvaW50PWZ1bmN0aW9uKCl7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBjcyl7dmFyIHQ9YXJndW1lbnRzWzBdLmdldENvb3JkaW5hdGUoKTt0aGlzLmluc2VydFBvaW50KHRoaXMuX2FyZ0luZGV4LHQsYmkuSU5URVJJT1IpfWVsc2UgaWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB2aSl7dmFyIGU9YXJndW1lbnRzWzBdO3RoaXMuaW5zZXJ0UG9pbnQodGhpcy5fYXJnSW5kZXgsZSxiaS5JTlRFUklPUil9fSxlLnByb3RvdHlwZS5hZGRQb2x5Z29uPWZ1bmN0aW9uKHQpe3RoaXMuYWRkUG9seWdvblJpbmcodC5nZXRFeHRlcmlvclJpbmcoKSxiaS5FWFRFUklPUixiaS5JTlRFUklPUik7Zm9yKHZhciBlPTA7ZTx0LmdldE51bUludGVyaW9yUmluZygpO2UrKyl7dmFyIG49dC5nZXRJbnRlcmlvclJpbmdOKGUpO3RoaXMuYWRkUG9seWdvblJpbmcobixiaS5JTlRFUklPUixiaS5FWFRFUklPUil9fSxlLnByb3RvdHlwZS5hZGRFZGdlPWZ1bmN0aW9uKHQpe3RoaXMuaW5zZXJ0RWRnZSh0KTt2YXIgZT10LmdldENvb3JkaW5hdGVzKCk7dGhpcy5pbnNlcnRQb2ludCh0aGlzLl9hcmdJbmRleCxlWzBdLGJpLkJPVU5EQVJZKSx0aGlzLmluc2VydFBvaW50KHRoaXMuX2FyZ0luZGV4LGVbZS5sZW5ndGgtMV0sYmkuQk9VTkRBUlkpfSxlLnByb3RvdHlwZS5hZGRMaW5lU3RyaW5nPWZ1bmN0aW9uKHQpe3ZhciBlPURvLnJlbW92ZVJlcGVhdGVkUG9pbnRzKHQuZ2V0Q29vcmRpbmF0ZXMoKSk7aWYoZS5sZW5ndGg8MilyZXR1cm4gdGhpcy5faGFzVG9vRmV3UG9pbnRzPSEwLHRoaXMuX2ludmFsaWRQb2ludD1lWzBdLG51bGw7dmFyIG49bmV3IGN1KGUsbmV3IGpzKHRoaXMuX2FyZ0luZGV4LGJpLklOVEVSSU9SKSk7dGhpcy5fbGluZUVkZ2VNYXAucHV0KHQsbiksdGhpcy5pbnNlcnRFZGdlKG4pLFppLmlzVHJ1ZShlLmxlbmd0aD49MiwiZm91bmQgTGluZVN0cmluZyB3aXRoIHNpbmdsZSBwb2ludCIpLHRoaXMuaW5zZXJ0Qm91bmRhcnlQb2ludCh0aGlzLl9hcmdJbmRleCxlWzBdKSx0aGlzLmluc2VydEJvdW5kYXJ5UG9pbnQodGhpcy5fYXJnSW5kZXgsZVtlLmxlbmd0aC0xXSl9LGUucHJvdG90eXBlLmdldEludmFsaWRQb2ludD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pbnZhbGlkUG9pbnR9LGUucHJvdG90eXBlLmdldEJvdW5kYXJ5UG9pbnRzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuZ2V0Qm91bmRhcnlOb2RlcygpLGU9bmV3IEFycmF5KHQuc2l6ZSgpKS5maWxsKG51bGwpLG49MCxyPXQuaXRlcmF0b3IoKTtyLmhhc05leHQoKTspe3ZhciBpPXIubmV4dCgpO2VbbisrXT1pLmdldENvb3JkaW5hdGUoKS5jb3B5KCl9cmV0dXJuIGV9LGUucHJvdG90eXBlLmdldEJvdW5kYXJ5Tm9kZXM9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbD09PXRoaXMuX2JvdW5kYXJ5Tm9kZXMmJih0aGlzLl9ib3VuZGFyeU5vZGVzPXRoaXMuX25vZGVzLmdldEJvdW5kYXJ5Tm9kZXModGhpcy5fYXJnSW5kZXgpKSx0aGlzLl9ib3VuZGFyeU5vZGVzfSxlLnByb3RvdHlwZS5hZGRTZWxmSW50ZXJzZWN0aW9uTm9kZT1mdW5jdGlvbih0LGUsbil7aWYodGhpcy5pc0JvdW5kYXJ5Tm9kZSh0LGUpKXJldHVybiBudWxsO249PT1iaS5CT1VOREFSWSYmdGhpcy5fdXNlQm91bmRhcnlEZXRlcm1pbmF0aW9uUnVsZT90aGlzLmluc2VydEJvdW5kYXJ5UG9pbnQodCxlKTp0aGlzLmluc2VydFBvaW50KHQsZSxuKX0sZS5wcm90b3R5cGUuYWRkUG9seWdvblJpbmc9ZnVuY3Rpb24odCxlLG4pe2lmKHQuaXNFbXB0eSgpKXJldHVybiBudWxsO3ZhciByPURvLnJlbW92ZVJlcGVhdGVkUG9pbnRzKHQuZ2V0Q29vcmRpbmF0ZXMoKSk7aWYoci5sZW5ndGg8NClyZXR1cm4gdGhpcy5faGFzVG9vRmV3UG9pbnRzPSEwLHRoaXMuX2ludmFsaWRQb2ludD1yWzBdLG51bGw7dmFyIGk9ZSxvPW47ZW8uaXNDQ1cocikmJihpPW4sbz1lKTt2YXIgcz1uZXcgY3UocixuZXcganModGhpcy5fYXJnSW5kZXgsYmkuQk9VTkRBUlksaSxvKSk7dGhpcy5fbGluZUVkZ2VNYXAucHV0KHQscyksdGhpcy5pbnNlcnRFZGdlKHMpLHRoaXMuaW5zZXJ0UG9pbnQodGhpcy5fYXJnSW5kZXgsclswXSxiaS5CT1VOREFSWSl9LGUucHJvdG90eXBlLmluc2VydFBvaW50PWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10aGlzLl9ub2Rlcy5hZGROb2RlKGUpLGk9ci5nZXRMYWJlbCgpO251bGw9PT1pP3IuX2xhYmVsPW5ldyBqcyh0LG4pOmkuc2V0TG9jYXRpb24odCxuKX0sZS5wcm90b3R5cGUuY3JlYXRlRWRnZVNldEludGVyc2VjdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB2Y30sZS5wcm90b3R5cGUuYWRkU2VsZkludGVyc2VjdGlvbk5vZGVzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLl9lZGdlcy5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOylmb3IodmFyIG49ZS5uZXh0KCkscj1uLmdldExhYmVsKCkuZ2V0TG9jYXRpb24odCksaT1uLmVpTGlzdC5pdGVyYXRvcigpO2kuaGFzTmV4dCgpOyl7dmFyIG89aS5uZXh0KCk7dGhpcy5hZGRTZWxmSW50ZXJzZWN0aW9uTm9kZSh0LG8uY29vcmQscil9fSxlLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oKXtpZigxIT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdC5wcm90b3R5cGUuYWRkLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgZT1hcmd1bWVudHNbMF07aWYoZS5pc0VtcHR5KCkpcmV0dXJuIG51bGw7aWYoZSBpbnN0YW5jZW9mIGRzJiYodGhpcy5fdXNlQm91bmRhcnlEZXRlcm1pbmF0aW9uUnVsZT0hMSksZSBpbnN0YW5jZW9mIGhzKXRoaXMuYWRkUG9seWdvbihlKTtlbHNlIGlmKGUgaW5zdGFuY2VvZiBhcyl0aGlzLmFkZExpbmVTdHJpbmcoZSk7ZWxzZSBpZihlIGluc3RhbmNlb2YgY3MpdGhpcy5hZGRQb2ludChlKTtlbHNlIGlmKGUgaW5zdGFuY2VvZiBmcyl0aGlzLmFkZENvbGxlY3Rpb24oZSk7ZWxzZSBpZihlIGluc3RhbmNlb2YgWm8pdGhpcy5hZGRDb2xsZWN0aW9uKGUpO2Vsc2UgaWYoZSBpbnN0YW5jZW9mIGRzKXRoaXMuYWRkQ29sbGVjdGlvbihlKTtlbHNle2lmKCEoZSBpbnN0YW5jZW9mIEhvKSl0aHJvdyBuZXcgRXJyb3IoZS5nZXRDbGFzcygpLmdldE5hbWUoKSk7dGhpcy5hZGRDb2xsZWN0aW9uKGUpfX0sZS5wcm90b3R5cGUuYWRkQ29sbGVjdGlvbj1mdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPHQuZ2V0TnVtR2VvbWV0cmllcygpO2UrKyl7dmFyIG49dC5nZXRHZW9tZXRyeU4oZSk7dGhpcy5hZGQobil9fSxlLnByb3RvdHlwZS5sb2NhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIEVpKHRoaXMuX3BhcmVudEdlb20sbHMpJiZ0aGlzLl9wYXJlbnRHZW9tLmdldE51bUdlb21ldHJpZXMoKT41MD8obnVsbD09PXRoaXMuX2FyZWFQdExvY2F0b3ImJih0aGlzLl9hcmVhUHRMb2NhdG9yPW5ldyBTYyh0aGlzLl9wYXJlbnRHZW9tKSksdGhpcy5fYXJlYVB0TG9jYXRvci5sb2NhdGUodCkpOnRoaXMuX3B0TG9jYXRvci5sb2NhdGUodCx0aGlzLl9wYXJlbnRHZW9tKX0sZS5wcm90b3R5cGUuZmluZEVkZ2U9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLl9saW5lRWRnZU1hcC5nZXQoZSl9cmV0dXJuIHQucHJvdG90eXBlLmZpbmRFZGdlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sZS5kZXRlcm1pbmVCb3VuZGFyeT1mdW5jdGlvbih0LGUpe3JldHVybiB0LmlzSW5Cb3VuZGFyeShlKT9iaS5CT1VOREFSWTpiaS5JTlRFUklPUn0sZX0oUXMpLEZjPWZ1bmN0aW9uKCl7aWYodGhpcy5fbGk9bmV3IFFpLHRoaXMuX3Jlc3VsdFByZWNpc2lvbk1vZGVsPW51bGwsdGhpcy5fYXJnPW51bGwsMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLnNldENvbXB1dGF0aW9uUHJlY2lzaW9uKHQuZ2V0UHJlY2lzaW9uTW9kZWwoKSksdGhpcy5fYXJnPW5ldyBBcnJheSgxKS5maWxsKG51bGwpLHRoaXMuX2FyZ1swXT1uZXcgTWMoMCx0KX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV0scj11by5PR0NfU0ZTX0JPVU5EQVJZX1JVTEU7ZS5nZXRQcmVjaXNpb25Nb2RlbCgpLmNvbXBhcmVUbyhuLmdldFByZWNpc2lvbk1vZGVsKCkpPj0wP3RoaXMuc2V0Q29tcHV0YXRpb25QcmVjaXNpb24oZS5nZXRQcmVjaXNpb25Nb2RlbCgpKTp0aGlzLnNldENvbXB1dGF0aW9uUHJlY2lzaW9uKG4uZ2V0UHJlY2lzaW9uTW9kZWwoKSksdGhpcy5fYXJnPW5ldyBBcnJheSgyKS5maWxsKG51bGwpLHRoaXMuX2FyZ1swXT1uZXcgTWMoMCxlLHIpLHRoaXMuX2FyZ1sxXT1uZXcgTWMoMSxuLHIpfWVsc2UgaWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBpPWFyZ3VtZW50c1swXSxvPWFyZ3VtZW50c1sxXSxzPWFyZ3VtZW50c1syXTtpLmdldFByZWNpc2lvbk1vZGVsKCkuY29tcGFyZVRvKG8uZ2V0UHJlY2lzaW9uTW9kZWwoKSk+PTA/dGhpcy5zZXRDb21wdXRhdGlvblByZWNpc2lvbihpLmdldFByZWNpc2lvbk1vZGVsKCkpOnRoaXMuc2V0Q29tcHV0YXRpb25QcmVjaXNpb24oby5nZXRQcmVjaXNpb25Nb2RlbCgpKSx0aGlzLl9hcmc9bmV3IEFycmF5KDIpLmZpbGwobnVsbCksdGhpcy5fYXJnWzBdPW5ldyBNYygwLGkscyksdGhpcy5fYXJnWzFdPW5ldyBNYygxLG8scyl9fTtGYy5wcm90b3R5cGUuZ2V0QXJnR2VvbWV0cnk9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2FyZ1t0XS5nZXRHZW9tZXRyeSgpfSxGYy5wcm90b3R5cGUuc2V0Q29tcHV0YXRpb25QcmVjaXNpb249ZnVuY3Rpb24odCl7dGhpcy5fcmVzdWx0UHJlY2lzaW9uTW9kZWw9dCx0aGlzLl9saS5zZXRQcmVjaXNpb25Nb2RlbCh0aGlzLl9yZXN1bHRQcmVjaXNpb25Nb2RlbCl9LEZjLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxGYy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gRmN9O3ZhciBUYz1mdW5jdGlvbigpe307VGMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LFRjLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBUY30sVGMubWFwPWZ1bmN0aW9uKCl7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBpbyYmRWkoYXJndW1lbnRzWzFdLFRjLk1hcE9wKSl7Zm9yKHZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXSxuPW5ldyB4byxyPTA7cjx0LmdldE51bUdlb21ldHJpZXMoKTtyKyspe3ZhciBpPWUubWFwKHQuZ2V0R2VvbWV0cnlOKHIpKTtudWxsIT09aSYmbi5hZGQoaSl9cmV0dXJuIHQuZ2V0RmFjdG9yeSgpLmJ1aWxkR2VvbWV0cnkobil9aWYoRWkoYXJndW1lbnRzWzBdLGdvKSYmRWkoYXJndW1lbnRzWzFdLFRjLk1hcE9wKSl7Zm9yKHZhciBvPWFyZ3VtZW50c1swXSxzPWFyZ3VtZW50c1sxXSxhPW5ldyB4byx1PW8uaXRlcmF0b3IoKTt1Lmhhc05leHQoKTspe3ZhciBjPXUubmV4dCgpLGw9cy5tYXAoYyk7bnVsbCE9PWwmJmEuYWRkKGwpfXJldHVybiBhfX0sVGMuTWFwT3A9ZnVuY3Rpb24oKXt9O3ZhciBPYz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO3QuY2FsbCh0aGlzLGUsbiksdGhpcy5fcHRMb2NhdG9yPW5ldyBUdSx0aGlzLl9nZW9tRmFjdD1udWxsLHRoaXMuX3Jlc3VsdEdlb209bnVsbCx0aGlzLl9ncmFwaD1udWxsLHRoaXMuX2VkZ2VMaXN0PW5ldyB0dSx0aGlzLl9yZXN1bHRQb2x5TGlzdD1uZXcgeG8sdGhpcy5fcmVzdWx0TGluZUxpc3Q9bmV3IHhvLHRoaXMuX3Jlc3VsdFBvaW50TGlzdD1uZXcgeG8sdGhpcy5fZ3JhcGg9bmV3IFFzKG5ldyBRYSksdGhpcy5fZ2VvbUZhY3Q9ZS5nZXRGYWN0b3J5KCl9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmluc2VydFVuaXF1ZUVkZ2U9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fZWRnZUxpc3QuZmluZEVxdWFsRWRnZSh0KTtpZihudWxsIT09ZSl7dmFyIG49ZS5nZXRMYWJlbCgpLHI9dC5nZXRMYWJlbCgpO2UuaXNQb2ludHdpc2VFcXVhbCh0KXx8KHI9bmV3IGpzKHQuZ2V0TGFiZWwoKSkpLmZsaXAoKTt2YXIgaT1lLmdldERlcHRoKCk7aS5pc051bGwoKSYmaS5hZGQobiksaS5hZGQociksbi5tZXJnZShyKX1lbHNlIHRoaXMuX2VkZ2VMaXN0LmFkZCh0KX0sZS5wcm90b3R5cGUuZ2V0R3JhcGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ3JhcGh9LGUucHJvdG90eXBlLmNhbmNlbER1cGxpY2F0ZVJlc3VsdEVkZ2VzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX2dyYXBoLmdldEVkZ2VFbmRzKCkuaXRlcmF0b3IoKTt0Lmhhc05leHQoKTspe3ZhciBlPXQubmV4dCgpLG49ZS5nZXRTeW0oKTtlLmlzSW5SZXN1bHQoKSYmbi5pc0luUmVzdWx0KCkmJihlLnNldEluUmVzdWx0KCExKSxuLnNldEluUmVzdWx0KCExKSl9fSxlLnByb3RvdHlwZS5pc0NvdmVyZWRCeUxBPWZ1bmN0aW9uKHQpe3JldHVybiEoIXRoaXMuaXNDb3ZlcmVkKHQsdGhpcy5fcmVzdWx0TGluZUxpc3QpJiYhdGhpcy5pc0NvdmVyZWQodCx0aGlzLl9yZXN1bHRQb2x5TGlzdCkpfSxlLnByb3RvdHlwZS5jb21wdXRlR2VvbWV0cnk9ZnVuY3Rpb24odCxuLHIsaSl7dmFyIG89bmV3IHhvO3JldHVybiBvLmFkZEFsbCh0KSxvLmFkZEFsbChuKSxvLmFkZEFsbChyKSxvLmlzRW1wdHkoKT9lLmNyZWF0ZUVtcHR5UmVzdWx0KGksdGhpcy5fYXJnWzBdLmdldEdlb21ldHJ5KCksdGhpcy5fYXJnWzFdLmdldEdlb21ldHJ5KCksdGhpcy5fZ2VvbUZhY3QpOnRoaXMuX2dlb21GYWN0LmJ1aWxkR2VvbWV0cnkobyl9LGUucHJvdG90eXBlLm1lcmdlU3ltTGFiZWxzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX2dyYXBoLmdldE5vZGVzKCkuaXRlcmF0b3IoKTt0Lmhhc05leHQoKTspe3QubmV4dCgpLmdldEVkZ2VzKCkubWVyZ2VTeW1MYWJlbHMoKX19LGUucHJvdG90eXBlLmlzQ292ZXJlZD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1lLml0ZXJhdG9yKCk7bi5oYXNOZXh0KCk7KXt2YXIgcj1uLm5leHQoKTtpZih0aGlzLl9wdExvY2F0b3IubG9jYXRlKHQscikhPT1iaS5FWFRFUklPUilyZXR1cm4hMH1yZXR1cm4hMX0sZS5wcm90b3R5cGUucmVwbGFjZUNvbGxhcHNlZEVkZ2VzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PW5ldyB4byxlPXRoaXMuX2VkZ2VMaXN0Lml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXt2YXIgbj1lLm5leHQoKTtuLmlzQ29sbGFwc2VkKCkmJihlLnJlbW92ZSgpLHQuYWRkKG4uZ2V0Q29sbGFwc2VkRWRnZSgpKSl9dGhpcy5fZWRnZUxpc3QuYWRkQWxsKHQpfSxlLnByb3RvdHlwZS51cGRhdGVOb2RlTGFiZWxsaW5nPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX2dyYXBoLmdldE5vZGVzKCkuaXRlcmF0b3IoKTt0Lmhhc05leHQoKTspe3ZhciBlPXQubmV4dCgpLG49ZS5nZXRFZGdlcygpLmdldExhYmVsKCk7ZS5nZXRMYWJlbCgpLm1lcmdlKG4pfX0sZS5wcm90b3R5cGUuZ2V0UmVzdWx0R2VvbWV0cnk9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY29tcHV0ZU92ZXJsYXkodCksdGhpcy5fcmVzdWx0R2VvbX0sZS5wcm90b3R5cGUuaW5zZXJ0VW5pcXVlRWRnZXM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspe3ZhciBuPWUubmV4dCgpO3RoaXMuaW5zZXJ0VW5pcXVlRWRnZShuKX19LGUucHJvdG90eXBlLmNvbXB1dGVPdmVybGF5PWZ1bmN0aW9uKHQpe3RoaXMuY29weVBvaW50cygwKSx0aGlzLmNvcHlQb2ludHMoMSksdGhpcy5fYXJnWzBdLmNvbXB1dGVTZWxmTm9kZXModGhpcy5fbGksITEpLHRoaXMuX2FyZ1sxXS5jb21wdXRlU2VsZk5vZGVzKHRoaXMuX2xpLCExKSx0aGlzLl9hcmdbMF0uY29tcHV0ZUVkZ2VJbnRlcnNlY3Rpb25zKHRoaXMuX2FyZ1sxXSx0aGlzLl9saSwhMCk7dmFyIGU9bmV3IHhvO3RoaXMuX2FyZ1swXS5jb21wdXRlU3BsaXRFZGdlcyhlKSx0aGlzLl9hcmdbMV0uY29tcHV0ZVNwbGl0RWRnZXMoZSksdGhpcy5pbnNlcnRVbmlxdWVFZGdlcyhlKSx0aGlzLmNvbXB1dGVMYWJlbHNGcm9tRGVwdGhzKCksdGhpcy5yZXBsYWNlQ29sbGFwc2VkRWRnZXMoKSxKdS5jaGVja1ZhbGlkKHRoaXMuX2VkZ2VMaXN0LmdldEVkZ2VzKCkpLHRoaXMuX2dyYXBoLmFkZEVkZ2VzKHRoaXMuX2VkZ2VMaXN0LmdldEVkZ2VzKCkpLHRoaXMuY29tcHV0ZUxhYmVsbGluZygpLHRoaXMubGFiZWxJbmNvbXBsZXRlTm9kZXMoKSx0aGlzLmZpbmRSZXN1bHRBcmVhRWRnZXModCksdGhpcy5jYW5jZWxEdXBsaWNhdGVSZXN1bHRFZGdlcygpO3ZhciBuPW5ldyAkcyh0aGlzLl9nZW9tRmFjdCk7bi5hZGQodGhpcy5fZ3JhcGgpLHRoaXMuX3Jlc3VsdFBvbHlMaXN0PW4uZ2V0UG9seWdvbnMoKTt2YXIgcj1uZXcgJHUodGhpcyx0aGlzLl9nZW9tRmFjdCx0aGlzLl9wdExvY2F0b3IpO3RoaXMuX3Jlc3VsdExpbmVMaXN0PXIuYnVpbGQodCk7dmFyIGk9bmV3IHRjKHRoaXMsdGhpcy5fZ2VvbUZhY3QsdGhpcy5fcHRMb2NhdG9yKTt0aGlzLl9yZXN1bHRQb2ludExpc3Q9aS5idWlsZCh0KSx0aGlzLl9yZXN1bHRHZW9tPXRoaXMuY29tcHV0ZUdlb21ldHJ5KHRoaXMuX3Jlc3VsdFBvaW50TGlzdCx0aGlzLl9yZXN1bHRMaW5lTGlzdCx0aGlzLl9yZXN1bHRQb2x5TGlzdCx0KX0sZS5wcm90b3R5cGUubGFiZWxJbmNvbXBsZXRlTm9kZT1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX3B0TG9jYXRvci5sb2NhdGUodC5nZXRDb29yZGluYXRlKCksdGhpcy5fYXJnW2VdLmdldEdlb21ldHJ5KCkpO3QuZ2V0TGFiZWwoKS5zZXRMb2NhdGlvbihlLG4pfSxlLnByb3RvdHlwZS5jb3B5UG9pbnRzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLl9hcmdbdF0uZ2V0Tm9kZUl0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXt2YXIgbj1lLm5leHQoKTt0aGlzLl9ncmFwaC5hZGROb2RlKG4uZ2V0Q29vcmRpbmF0ZSgpKS5zZXRMYWJlbCh0LG4uZ2V0TGFiZWwoKS5nZXRMb2NhdGlvbih0KSl9fSxlLnByb3RvdHlwZS5maW5kUmVzdWx0QXJlYUVkZ2VzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgbj10aGlzLl9ncmFwaC5nZXRFZGdlRW5kcygpLml0ZXJhdG9yKCk7bi5oYXNOZXh0KCk7KXt2YXIgcj1uLm5leHQoKSxpPXIuZ2V0TGFiZWwoKTtpLmlzQXJlYSgpJiYhci5pc0ludGVyaW9yQXJlYUVkZ2UoKSYmZS5pc1Jlc3VsdE9mT3AoaS5nZXRMb2NhdGlvbigwLEZzLlJJR0hUKSxpLmdldExvY2F0aW9uKDEsRnMuUklHSFQpLHQpJiZyLnNldEluUmVzdWx0KCEwKX19LGUucHJvdG90eXBlLmNvbXB1dGVMYWJlbHNGcm9tRGVwdGhzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX2VkZ2VMaXN0Lml0ZXJhdG9yKCk7dC5oYXNOZXh0KCk7KXt2YXIgZT10Lm5leHQoKSxuPWUuZ2V0TGFiZWwoKSxyPWUuZ2V0RGVwdGgoKTtpZighci5pc051bGwoKSl7ci5ub3JtYWxpemUoKTtmb3IodmFyIGk9MDtpPDI7aSsrKSFuLmlzTnVsbChpKSYmbi5pc0FyZWEoKSYmIXIuaXNOdWxsKGkpJiYoMD09PXIuZ2V0RGVsdGEoaSk/bi50b0xpbmUoaSk6KFppLmlzVHJ1ZSghci5pc051bGwoaSxGcy5MRUZUKSwiZGVwdGggb2YgTEVGVCBzaWRlIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCIpLG4uc2V0TG9jYXRpb24oaSxGcy5MRUZULHIuZ2V0TG9jYXRpb24oaSxGcy5MRUZUKSksWmkuaXNUcnVlKCFyLmlzTnVsbChpLEZzLlJJR0hUKSwiZGVwdGggb2YgUklHSFQgc2lkZSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQiKSxuLnNldExvY2F0aW9uKGksRnMuUklHSFQsci5nZXRMb2NhdGlvbihpLEZzLlJJR0hUKSkpKX19fSxlLnByb3RvdHlwZS5jb21wdXRlTGFiZWxsaW5nPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX2dyYXBoLmdldE5vZGVzKCkuaXRlcmF0b3IoKTt0Lmhhc05leHQoKTspe3QubmV4dCgpLmdldEVkZ2VzKCkuY29tcHV0ZUxhYmVsbGluZyh0aGlzLl9hcmcpfXRoaXMubWVyZ2VTeW1MYWJlbHMoKSx0aGlzLnVwZGF0ZU5vZGVMYWJlbGxpbmcoKX0sZS5wcm90b3R5cGUubGFiZWxJbmNvbXBsZXRlTm9kZXM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5fZ3JhcGguZ2V0Tm9kZXMoKS5pdGVyYXRvcigpO3QuaGFzTmV4dCgpOyl7dmFyIGU9dC5uZXh0KCksbj1lLmdldExhYmVsKCk7ZS5pc0lzb2xhdGVkKCkmJihuLmlzTnVsbCgwKT90aGlzLmxhYmVsSW5jb21wbGV0ZU5vZGUoZSwwKTp0aGlzLmxhYmVsSW5jb21wbGV0ZU5vZGUoZSwxKSksZS5nZXRFZGdlcygpLnVwZGF0ZUxhYmVsbGluZyhuKX19LGUucHJvdG90eXBlLmlzQ292ZXJlZEJ5QT1mdW5jdGlvbih0KXtyZXR1cm4hIXRoaXMuaXNDb3ZlcmVkKHQsdGhpcy5fcmVzdWx0UG9seUxpc3QpfSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxlfShGYyk7T2Mub3ZlcmxheU9wPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gbmV3IE9jKHQsZSkuZ2V0UmVzdWx0R2VvbWV0cnkobil9LE9jLmludGVyc2VjdGlvbj1mdW5jdGlvbih0LGUpe2lmKHQuaXNFbXB0eSgpfHxlLmlzRW1wdHkoKSlyZXR1cm4gT2MuY3JlYXRlRW1wdHlSZXN1bHQoT2MuSU5URVJTRUNUSU9OLHQsZSx0LmdldEZhY3RvcnkoKSk7aWYodC5pc0dlb21ldHJ5Q29sbGVjdGlvbigpKXt2YXIgbj1lO3JldHVybiBRdS5tYXAodCx7aW50ZXJmYWNlc186ZnVuY3Rpb24oKXtyZXR1cm5bVGMuTWFwT3BdfSxtYXA6ZnVuY3Rpb24odCl7cmV0dXJuIHQuaW50ZXJzZWN0aW9uKG4pfX0pfXJldHVybiB0LmNoZWNrTm90R2VvbWV0cnlDb2xsZWN0aW9uKHQpLHQuY2hlY2tOb3RHZW9tZXRyeUNvbGxlY3Rpb24oZSksZmMub3ZlcmxheU9wKHQsZSxPYy5JTlRFUlNFQ1RJT04pfSxPYy5zeW1EaWZmZXJlbmNlPWZ1bmN0aW9uKHQsZSl7aWYodC5pc0VtcHR5KCl8fGUuaXNFbXB0eSgpKXtpZih0LmlzRW1wdHkoKSYmZS5pc0VtcHR5KCkpcmV0dXJuIE9jLmNyZWF0ZUVtcHR5UmVzdWx0KE9jLlNZTURJRkZFUkVOQ0UsdCxlLHQuZ2V0RmFjdG9yeSgpKTtpZih0LmlzRW1wdHkoKSlyZXR1cm4gZS5jb3B5KCk7aWYoZS5pc0VtcHR5KCkpcmV0dXJuIHQuY29weSgpfXJldHVybiB0LmNoZWNrTm90R2VvbWV0cnlDb2xsZWN0aW9uKHQpLHQuY2hlY2tOb3RHZW9tZXRyeUNvbGxlY3Rpb24oZSksZmMub3ZlcmxheU9wKHQsZSxPYy5TWU1ESUZGRVJFTkNFKX0sT2MucmVzdWx0RGltZW5zaW9uPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1lLmdldERpbWVuc2lvbigpLGk9bi5nZXREaW1lbnNpb24oKSxvPS0xO3N3aXRjaCh0KXtjYXNlIE9jLklOVEVSU0VDVElPTjpvPU1hdGgubWluKHIsaSk7YnJlYWs7Y2FzZSBPYy5VTklPTjpvPU1hdGgubWF4KHIsaSk7YnJlYWs7Y2FzZSBPYy5ESUZGRVJFTkNFOm89cjticmVhaztjYXNlIE9jLlNZTURJRkZFUkVOQ0U6bz1NYXRoLm1heChyLGkpfXJldHVybiBvfSxPYy5jcmVhdGVFbXB0eVJlc3VsdD1mdW5jdGlvbih0LGUsbixyKXt2YXIgaT1udWxsO3N3aXRjaChPYy5yZXN1bHREaW1lbnNpb24odCxlLG4pKXtjYXNlLTE6aT1yLmNyZWF0ZUdlb21ldHJ5Q29sbGVjdGlvbihuZXcgQXJyYXkoMCkuZmlsbChudWxsKSk7YnJlYWs7Y2FzZSAwOmk9ci5jcmVhdGVQb2ludCgpO2JyZWFrO2Nhc2UgMTppPXIuY3JlYXRlTGluZVN0cmluZygpO2JyZWFrO2Nhc2UgMjppPXIuY3JlYXRlUG9seWdvbigpfXJldHVybiBpfSxPYy5kaWZmZXJlbmNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuaXNFbXB0eSgpP09jLmNyZWF0ZUVtcHR5UmVzdWx0KE9jLkRJRkZFUkVOQ0UsdCxlLHQuZ2V0RmFjdG9yeSgpKTplLmlzRW1wdHkoKT90LmNvcHkoKToodC5jaGVja05vdEdlb21ldHJ5Q29sbGVjdGlvbih0KSx0LmNoZWNrTm90R2VvbWV0cnlDb2xsZWN0aW9uKGUpLGZjLm92ZXJsYXlPcCh0LGUsT2MuRElGRkVSRU5DRSkpfSxPYy5pc1Jlc3VsdE9mT3A9ZnVuY3Rpb24oKXtpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdLG49dC5nZXRMb2NhdGlvbigwKSxyPXQuZ2V0TG9jYXRpb24oMSk7cmV0dXJuIE9jLmlzUmVzdWx0T2ZPcChuLHIsZSl9aWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBpPWFyZ3VtZW50c1swXSxvPWFyZ3VtZW50c1sxXTtzd2l0Y2goaT09PWJpLkJPVU5EQVJZJiYoaT1iaS5JTlRFUklPUiksbz09PWJpLkJPVU5EQVJZJiYobz1iaS5JTlRFUklPUiksYXJndW1lbnRzWzJdKXtjYXNlIE9jLklOVEVSU0VDVElPTjpyZXR1cm4gaT09PWJpLklOVEVSSU9SJiZvPT09YmkuSU5URVJJT1I7Y2FzZSBPYy5VTklPTjpyZXR1cm4gaT09PWJpLklOVEVSSU9SfHxvPT09YmkuSU5URVJJT1I7Y2FzZSBPYy5ESUZGRVJFTkNFOnJldHVybiBpPT09YmkuSU5URVJJT1ImJm8hPT1iaS5JTlRFUklPUjtjYXNlIE9jLlNZTURJRkZFUkVOQ0U6cmV0dXJuIGk9PT1iaS5JTlRFUklPUiYmbyE9PWJpLklOVEVSSU9SfHxpIT09YmkuSU5URVJJT1ImJm89PT1iaS5JTlRFUklPUn1yZXR1cm4hMX19LE9jLklOVEVSU0VDVElPTj0xLE9jLlVOSU9OPTIsT2MuRElGRkVSRU5DRT0zLE9jLlNZTURJRkZFUkVOQ0U9NDt2YXIgTGM9ZnVuY3Rpb24oKXt0aGlzLl9nPW51bGwsdGhpcy5fYm91bmRhcnlEaXN0YW5jZVRvbGVyYW5jZT1udWxsLHRoaXMuX2xpbmV3b3JrPW51bGwsdGhpcy5fcHRMb2NhdG9yPW5ldyBUdSx0aGlzLl9zZWc9bmV3IGJhO3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXTt0aGlzLl9nPXQsdGhpcy5fYm91bmRhcnlEaXN0YW5jZVRvbGVyYW5jZT1lLHRoaXMuX2xpbmV3b3JrPXRoaXMuZXh0cmFjdExpbmV3b3JrKHQpfTtMYy5wcm90b3R5cGUuaXNXaXRoaW5Ub2xlcmFuY2VPZkJvdW5kYXJ5PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLG49MDtuPHRoaXMuX2xpbmV3b3JrLmdldE51bUdlb21ldHJpZXMoKTtuKyspZm9yKHZhciByPWUuX2xpbmV3b3JrLmdldEdlb21ldHJ5TihuKS5nZXRDb29yZGluYXRlU2VxdWVuY2UoKSxpPTA7aTxyLnNpemUoKS0xO2krKyl7aWYoci5nZXRDb29yZGluYXRlKGksZS5fc2VnLnAwKSxyLmdldENvb3JkaW5hdGUoaSsxLGUuX3NlZy5wMSksZS5fc2VnLmRpc3RhbmNlKHQpPD1lLl9ib3VuZGFyeURpc3RhbmNlVG9sZXJhbmNlKXJldHVybiEwfXJldHVybiExfSxMYy5wcm90b3R5cGUuZ2V0TG9jYXRpb249ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaXNXaXRoaW5Ub2xlcmFuY2VPZkJvdW5kYXJ5KHQpP2JpLkJPVU5EQVJZOnRoaXMuX3B0TG9jYXRvci5sb2NhdGUodCx0aGlzLl9nKX0sTGMucHJvdG90eXBlLmV4dHJhY3RMaW5ld29yaz1mdW5jdGlvbih0KXt2YXIgZT1uZXcgUGM7dC5hcHBseShlKTt2YXIgbj1lLmdldExpbmV3b3JrKCkscj1Jcy50b0xpbmVTdHJpbmdBcnJheShuKTtyZXR1cm4gdC5nZXRGYWN0b3J5KCkuY3JlYXRlTXVsdGlMaW5lU3RyaW5nKHIpfSxMYy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sTGMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIExjfTt2YXIgUGM9ZnVuY3Rpb24oKXt0aGlzLl9saW5ld29yaz1udWxsLHRoaXMuX2xpbmV3b3JrPW5ldyB4b307UGMucHJvdG90eXBlLmdldExpbmV3b3JrPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xpbmV3b3JrfSxQYy5wcm90b3R5cGUuZmlsdGVyPWZ1bmN0aW9uKHQpe2lmKHQgaW5zdGFuY2VvZiBocyl7dmFyIGU9dDt0aGlzLl9saW5ld29yay5hZGQoZS5nZXRFeHRlcmlvclJpbmcoKSk7Zm9yKHZhciBuPTA7bjxlLmdldE51bUludGVyaW9yUmluZygpO24rKyl0aGlzLl9saW5ld29yay5hZGQoZS5nZXRJbnRlcmlvclJpbmdOKG4pKX19LFBjLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltYb119LFBjLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBQY307dmFyIFJjPWZ1bmN0aW9uKCl7dGhpcy5fZz1udWxsLHRoaXMuX2RvTGVmdD0hMCx0aGlzLl9kb1JpZ2h0PSEwO3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLl9nPXR9O1JjLnByb3RvdHlwZS5leHRyYWN0UG9pbnRzPWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHI9dC5nZXRDb29yZGluYXRlcygpLGk9MDtpPHIubGVuZ3RoLTE7aSsrKXRoaXMuY29tcHV0ZU9mZnNldFBvaW50cyhyW2ldLHJbaSsxXSxlLG4pfSxSYy5wcm90b3R5cGUuc2V0U2lkZXNUb0dlbmVyYXRlPWZ1bmN0aW9uKHQsZSl7dGhpcy5fZG9MZWZ0PXQsdGhpcy5fZG9SaWdodD1lfSxSYy5wcm90b3R5cGUuZ2V0UG9pbnRzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgeG8sbj1GdS5nZXRMaW5lcyh0aGlzLl9nKS5pdGVyYXRvcigpO24uaGFzTmV4dCgpOyl7dmFyIHI9bi5uZXh0KCk7dGhpcy5leHRyYWN0UG9pbnRzKHIsdCxlKX1yZXR1cm4gZX0sUmMucHJvdG90eXBlLmNvbXB1dGVPZmZzZXRQb2ludHM9ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9ZS54LXQueCxvPWUueS10Lnkscz1NYXRoLnNxcnQoaSppK28qbyksYT1uKmkvcyx1PW4qby9zLGM9KGUueCt0LngpLzIsbD0oZS55K3QueSkvMjtpZih0aGlzLl9kb0xlZnQpe3ZhciBoPW5ldyB2aShjLXUsbCthKTtyLmFkZChoKX1pZih0aGlzLl9kb1JpZ2h0KXt2YXIgZj1uZXcgdmkoYyt1LGwtYSk7ci5hZGQoZil9fSxSYy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sUmMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFJjfTt2YXIgQmM9ZnVuY3Rpb24gdCgpe3RoaXMuX2dlb209bnVsbCx0aGlzLl9sb2NGaW5kZXI9bnVsbCx0aGlzLl9sb2NhdGlvbj1uZXcgQXJyYXkoMykuZmlsbChudWxsKSx0aGlzLl9pbnZhbGlkTG9jYXRpb249bnVsbCx0aGlzLl9ib3VuZGFyeURpc3RhbmNlVG9sZXJhbmNlPXQuVE9MRVJBTkNFLHRoaXMuX3Rlc3RDb29yZHM9bmV3IHhvO3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXSxyPWFyZ3VtZW50c1syXTt0aGlzLl9ib3VuZGFyeURpc3RhbmNlVG9sZXJhbmNlPXQuY29tcHV0ZUJvdW5kYXJ5RGlzdGFuY2VUb2xlcmFuY2UoZSxuKSx0aGlzLl9nZW9tPVtlLG4scl0sdGhpcy5fbG9jRmluZGVyPVtuZXcgTGModGhpcy5fZ2VvbVswXSx0aGlzLl9ib3VuZGFyeURpc3RhbmNlVG9sZXJhbmNlKSxuZXcgTGModGhpcy5fZ2VvbVsxXSx0aGlzLl9ib3VuZGFyeURpc3RhbmNlVG9sZXJhbmNlKSxuZXcgTGModGhpcy5fZ2VvbVsyXSx0aGlzLl9ib3VuZGFyeURpc3RhbmNlVG9sZXJhbmNlKV19LGtjPXtUT0xFUkFOQ0U6e2NvbmZpZ3VyYWJsZTohMH19O0JjLnByb3RvdHlwZS5yZXBvcnRSZXN1bHQ9ZnVuY3Rpb24odCxlLG4pe2tpLm91dC5wcmludGxuKCJPdmVybGF5IHJlc3VsdCBpbnZhbGlkIC0gQToiK2JpLnRvTG9jYXRpb25TeW1ib2woZVswXSkrIiBCOiIrYmkudG9Mb2NhdGlvblN5bWJvbChlWzFdKSsiIGV4cGVjdGVkOiIrKG4/ImkiOiJlIikrIiBhY3R1YWw6IitiaS50b0xvY2F0aW9uU3ltYm9sKGVbMl0pKX0sQmMucHJvdG90eXBlLmlzVmFsaWQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuYWRkVGVzdFB0cyh0aGlzLl9nZW9tWzBdKSx0aGlzLmFkZFRlc3RQdHModGhpcy5fZ2VvbVsxXSksdGhpcy5jaGVja1ZhbGlkKHQpfSxCYy5wcm90b3R5cGUuY2hlY2tWYWxpZD1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcih2YXIgZT1hcmd1bWVudHNbMF0sbj0wO248dGhpcy5fdGVzdENvb3Jkcy5zaXplKCk7bisrKXt2YXIgcj10Ll90ZXN0Q29vcmRzLmdldChuKTtpZighdC5jaGVja1ZhbGlkKGUscikpcmV0dXJuIHQuX2ludmFsaWRMb2NhdGlvbj1yLCExfXJldHVybiEwfWlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgaT1hcmd1bWVudHNbMF0sbz1hcmd1bWVudHNbMV07cmV0dXJuIHRoaXMuX2xvY2F0aW9uWzBdPXRoaXMuX2xvY0ZpbmRlclswXS5nZXRMb2NhdGlvbihvKSx0aGlzLl9sb2NhdGlvblsxXT10aGlzLl9sb2NGaW5kZXJbMV0uZ2V0TG9jYXRpb24obyksdGhpcy5fbG9jYXRpb25bMl09dGhpcy5fbG9jRmluZGVyWzJdLmdldExvY2F0aW9uKG8pLCEhQmMuaGFzTG9jYXRpb24odGhpcy5fbG9jYXRpb24sYmkuQk9VTkRBUlkpfHx0aGlzLmlzVmFsaWRSZXN1bHQoaSx0aGlzLl9sb2NhdGlvbil9fSxCYy5wcm90b3R5cGUuYWRkVGVzdFB0cz1mdW5jdGlvbih0KXt2YXIgZT1uZXcgUmModCk7dGhpcy5fdGVzdENvb3Jkcy5hZGRBbGwoZS5nZXRQb2ludHMoNSp0aGlzLl9ib3VuZGFyeURpc3RhbmNlVG9sZXJhbmNlKSl9LEJjLnByb3RvdHlwZS5pc1ZhbGlkUmVzdWx0PWZ1bmN0aW9uKHQsZSl7dmFyIG49T2MuaXNSZXN1bHRPZk9wKGVbMF0sZVsxXSx0KSxyPSEobl5lWzJdPT09YmkuSU5URVJJT1IpO3JldHVybiByfHx0aGlzLnJlcG9ydFJlc3VsdCh0LGUsbikscn0sQmMucHJvdG90eXBlLmdldEludmFsaWRMb2NhdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pbnZhbGlkTG9jYXRpb259LEJjLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxCYy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gQmN9LEJjLmhhc0xvY2F0aW9uPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPTA7bjwzO24rKylpZih0W25dPT09ZSlyZXR1cm4hMDtyZXR1cm4hMX0sQmMuY29tcHV0ZUJvdW5kYXJ5RGlzdGFuY2VUb2xlcmFuY2U9ZnVuY3Rpb24odCxlKXtyZXR1cm4gTWF0aC5taW4ocmMuY29tcHV0ZVNpemVCYXNlZFNuYXBUb2xlcmFuY2UodCkscmMuY29tcHV0ZVNpemVCYXNlZFNuYXBUb2xlcmFuY2UoZSkpfSxCYy5pc1ZhbGlkPWZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiBuZXcgQmModCxlLHIpLmlzVmFsaWQobil9LGtjLlRPTEVSQU5DRS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMWUtNn0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQmMsa2MpO3ZhciB6Yz1mdW5jdGlvbiB0KGUpe3RoaXMuX2dlb21GYWN0b3J5PW51bGwsdGhpcy5fc2tpcEVtcHR5PSExLHRoaXMuX2lucHV0R2VvbXM9bnVsbCx0aGlzLl9nZW9tRmFjdG9yeT10LmV4dHJhY3RGYWN0b3J5KGUpLHRoaXMuX2lucHV0R2VvbXM9ZX07emMucHJvdG90eXBlLmV4dHJhY3RFbGVtZW50cz1mdW5jdGlvbih0LGUpe2lmKG51bGw9PT10KXJldHVybiBudWxsO2Zvcih2YXIgbj0wO248dC5nZXROdW1HZW9tZXRyaWVzKCk7bisrKXt2YXIgcj10LmdldEdlb21ldHJ5TihuKTt0aGlzLl9za2lwRW1wdHkmJnIuaXNFbXB0eSgpfHxlLmFkZChyKX19LHpjLnByb3RvdHlwZS5jb21iaW5lPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PW5ldyB4byxlPXRoaXMuX2lucHV0R2VvbXMuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspe3ZhciBuPWUubmV4dCgpO3RoaXMuZXh0cmFjdEVsZW1lbnRzKG4sdCl9cmV0dXJuIDA9PT10LnNpemUoKT9udWxsIT09dGhpcy5fZ2VvbUZhY3Rvcnk/dGhpcy5fZ2VvbUZhY3RvcnkuY3JlYXRlR2VvbWV0cnlDb2xsZWN0aW9uKG51bGwpOm51bGw6dGhpcy5fZ2VvbUZhY3RvcnkuYnVpbGRHZW9tZXRyeSh0KX0semMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LHpjLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiB6Y30semMuY29tYmluZT1mdW5jdGlvbigpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9uZXcgemMoYXJndW1lbnRzWzBdKS5jb21iaW5lKCk6Mj09PWFyZ3VtZW50cy5sZW5ndGg/bmV3IHpjKHpjLmNyZWF0ZUxpc3QoYXJndW1lbnRzWzBdLGFyZ3VtZW50c1sxXSkpLmNvbWJpbmUoKTozPT09YXJndW1lbnRzLmxlbmd0aD9uZXcgemMoemMuY3JlYXRlTGlzdChhcmd1bWVudHNbMF0sYXJndW1lbnRzWzFdLGFyZ3VtZW50c1syXSkpLmNvbWJpbmUoKTp2b2lkIDB9LHpjLmV4dHJhY3RGYWN0b3J5PWZ1bmN0aW9uKHQpe3JldHVybiB0LmlzRW1wdHkoKT9udWxsOnQuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0RmFjdG9yeSgpfSx6Yy5jcmVhdGVMaXN0PWZ1bmN0aW9uKCl7aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXSxuPW5ldyB4bztyZXR1cm4gbi5hZGQodCksbi5hZGQoZSksbn1pZigzPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHI9YXJndW1lbnRzWzBdLGk9YXJndW1lbnRzWzFdLG89YXJndW1lbnRzWzJdLHM9bmV3IHhvO3JldHVybiBzLmFkZChyKSxzLmFkZChpKSxzLmFkZChvKSxzfX07dmFyIGpjPWZ1bmN0aW9uKCl7dGhpcy5faW5wdXRQb2x5cz1udWxsLHRoaXMuX2dlb21GYWN0b3J5PW51bGw7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuX2lucHV0UG9seXM9dCxudWxsPT09dGhpcy5faW5wdXRQb2x5cyYmKHRoaXMuX2lucHV0UG9seXM9bmV3IHhvKX0sVWM9e1NUUlRSRUVfTk9ERV9DQVBBQ0lUWTp7Y29uZmlndXJhYmxlOiEwfX07amMucHJvdG90eXBlLnJlZHVjZVRvR2VvbWV0cmllcz1mdW5jdGlvbih0KXtmb3IodmFyIGU9bmV3IHhvLG49dC5pdGVyYXRvcigpO24uaGFzTmV4dCgpOyl7dmFyIHI9bi5uZXh0KCksaT1udWxsO0VpKHIsdm8pP2k9dGhpcy51bmlvblRyZWUocik6ciBpbnN0YW5jZW9mIGlvJiYoaT1yKSxlLmFkZChpKX1yZXR1cm4gZX0samMucHJvdG90eXBlLmV4dHJhY3RCeUVudmVsb3BlPWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHI9bmV3IHhvLGk9MDtpPGUuZ2V0TnVtR2VvbWV0cmllcygpO2krKyl7dmFyIG89ZS5nZXRHZW9tZXRyeU4oaSk7by5nZXRFbnZlbG9wZUludGVybmFsKCkuaW50ZXJzZWN0cyh0KT9yLmFkZChvKTpuLmFkZChvKX1yZXR1cm4gdGhpcy5fZ2VvbUZhY3RvcnkuYnVpbGRHZW9tZXRyeShyKX0samMucHJvdG90eXBlLnVuaW9uT3B0aW1pemVkPWZ1bmN0aW9uKHQsZSl7dmFyIG49dC5nZXRFbnZlbG9wZUludGVybmFsKCkscj1lLmdldEVudmVsb3BlSW50ZXJuYWwoKTtpZighbi5pbnRlcnNlY3RzKHIpKXJldHVybiB6Yy5jb21iaW5lKHQsZSk7aWYodC5nZXROdW1HZW9tZXRyaWVzKCk8PTEmJmUuZ2V0TnVtR2VvbWV0cmllcygpPD0xKXJldHVybiB0aGlzLnVuaW9uQWN0dWFsKHQsZSk7dmFyIGk9bi5pbnRlcnNlY3Rpb24ocik7cmV0dXJuIHRoaXMudW5pb25Vc2luZ0VudmVsb3BlSW50ZXJzZWN0aW9uKHQsZSxpKX0samMucHJvdG90eXBlLnVuaW9uPWZ1bmN0aW9uKCl7aWYobnVsbD09PXRoaXMuX2lucHV0UG9seXMpdGhyb3cgbmV3IEVycm9yKCJ1bmlvbigpIG1ldGhvZCBjYW5ub3QgYmUgY2FsbGVkIHR3aWNlIik7aWYodGhpcy5faW5wdXRQb2x5cy5pc0VtcHR5KCkpcmV0dXJuIG51bGw7dGhpcy5fZ2VvbUZhY3Rvcnk9dGhpcy5faW5wdXRQb2x5cy5pdGVyYXRvcigpLm5leHQoKS5nZXRGYWN0b3J5KCk7Zm9yKHZhciB0PW5ldyBwYShqYy5TVFJUUkVFX05PREVfQ0FQQUNJVFkpLGU9dGhpcy5faW5wdXRQb2x5cy5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7dmFyIG49ZS5uZXh0KCk7dC5pbnNlcnQobi5nZXRFbnZlbG9wZUludGVybmFsKCksbil9dGhpcy5faW5wdXRQb2x5cz1udWxsO3ZhciByPXQuaXRlbXNUcmVlKCk7cmV0dXJuIHRoaXMudW5pb25UcmVlKHIpfSxqYy5wcm90b3R5cGUuYmluYXJ5VW5pb249ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLmJpbmFyeVVuaW9uKHQsMCx0LnNpemUoKSl9aWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXSxyPWFyZ3VtZW50c1syXTtpZihyLW48PTEpe3ZhciBpPWpjLmdldEdlb21ldHJ5KGUsbik7cmV0dXJuIHRoaXMudW5pb25TYWZlKGksbnVsbCl9aWYoci1uPT0yKXJldHVybiB0aGlzLnVuaW9uU2FmZShqYy5nZXRHZW9tZXRyeShlLG4pLGpjLmdldEdlb21ldHJ5KGUsbisxKSk7dmFyIG89TWF0aC50cnVuYygocituKS8yKSxzPXRoaXMuYmluYXJ5VW5pb24oZSxuLG8pLGE9dGhpcy5iaW5hcnlVbmlvbihlLG8scik7cmV0dXJuIHRoaXMudW5pb25TYWZlKHMsYSl9fSxqYy5wcm90b3R5cGUucmVwZWF0ZWRVbmlvbj1mdW5jdGlvbih0KXtmb3IodmFyIGU9bnVsbCxuPXQuaXRlcmF0b3IoKTtuLmhhc05leHQoKTspe3ZhciByPW4ubmV4dCgpO2U9bnVsbD09PWU/ci5jb3B5KCk6ZS51bmlvbihyKX1yZXR1cm4gZX0samMucHJvdG90eXBlLnVuaW9uU2FmZT1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT09dCYmbnVsbD09PWU/bnVsbDpudWxsPT09dD9lLmNvcHkoKTpudWxsPT09ZT90LmNvcHkoKTp0aGlzLnVuaW9uT3B0aW1pemVkKHQsZSl9LGpjLnByb3RvdHlwZS51bmlvbkFjdHVhbD1mdW5jdGlvbih0LGUpe3JldHVybiBqYy5yZXN0cmljdFRvUG9seWdvbnModC51bmlvbihlKSl9LGpjLnByb3RvdHlwZS51bmlvblRyZWU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5yZWR1Y2VUb0dlb21ldHJpZXModCk7cmV0dXJuIHRoaXMuYmluYXJ5VW5pb24oZSl9LGpjLnByb3RvdHlwZS51bmlvblVzaW5nRW52ZWxvcGVJbnRlcnNlY3Rpb249ZnVuY3Rpb24odCxlLG4pe3ZhciByPW5ldyB4byxpPXRoaXMuZXh0cmFjdEJ5RW52ZWxvcGUobix0LHIpLG89dGhpcy5leHRyYWN0QnlFbnZlbG9wZShuLGUscikscz10aGlzLnVuaW9uQWN0dWFsKGksbyk7cmV0dXJuIHIuYWRkKHMpLHpjLmNvbWJpbmUocil9LGpjLnByb3RvdHlwZS5idWZmZXJVbmlvbj1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIHQuZ2V0KDApLmdldEZhY3RvcnkoKS5idWlsZEdlb21ldHJ5KHQpLmJ1ZmZlcigwKX1pZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO3JldHVybiBlLmdldEZhY3RvcnkoKS5jcmVhdGVHZW9tZXRyeUNvbGxlY3Rpb24oW2Usbl0pLmJ1ZmZlcigwKX19LGpjLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxqYy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gamN9LGpjLnJlc3RyaWN0VG9Qb2x5Z29ucz1mdW5jdGlvbih0KXtpZihFaSh0LGxzKSlyZXR1cm4gdDt2YXIgZT1NdS5nZXRQb2x5Z29ucyh0KTtyZXR1cm4gMT09PWUuc2l6ZSgpP2UuZ2V0KDApOnQuZ2V0RmFjdG9yeSgpLmNyZWF0ZU11bHRpUG9seWdvbihJcy50b1BvbHlnb25BcnJheShlKSl9LGpjLmdldEdlb21ldHJ5PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGU+PXQuc2l6ZSgpP251bGw6dC5nZXQoZSl9LGpjLnVuaW9uPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgamModCkudW5pb24oKX0sVWMuU1RSVFJFRV9OT0RFX0NBUEFDSVRZLmdldD1mdW5jdGlvbigpe3JldHVybiA0fSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhqYyxVYyk7dmFyIHFjPWZ1bmN0aW9uKCl7fTtxYy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0scWMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHFjfSxxYy51bmlvbj1mdW5jdGlvbih0LGUpe2lmKHQuaXNFbXB0eSgpfHxlLmlzRW1wdHkoKSl7aWYodC5pc0VtcHR5KCkmJmUuaXNFbXB0eSgpKXJldHVybiBPYy5jcmVhdGVFbXB0eVJlc3VsdChPYy5VTklPTix0LGUsdC5nZXRGYWN0b3J5KCkpO2lmKHQuaXNFbXB0eSgpKXJldHVybiBlLmNvcHkoKTtpZihlLmlzRW1wdHkoKSlyZXR1cm4gdC5jb3B5KCl9cmV0dXJuIHQuY2hlY2tOb3RHZW9tZXRyeUNvbGxlY3Rpb24odCksdC5jaGVja05vdEdlb21ldHJ5Q29sbGVjdGlvbihlKSxmYy5vdmVybGF5T3AodCxlLE9jLlVOSU9OKX07dmFyIFZjPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBHY307ZnVuY3Rpb24gR2MoKXt0aGlzLnJlc2V0KCl9R2MucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpHYyxyZXNldDpmdW5jdGlvbigpe3RoaXMucz10aGlzLnQ9MH0sYWRkOmZ1bmN0aW9uKHQpe1hjKFljLHQsdGhpcy50KSxYYyh0aGlzLFljLnMsdGhpcy5zKSx0aGlzLnM/dGhpcy50Kz1ZYy50OnRoaXMucz1ZYy50fSx2YWx1ZU9mOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc319O3ZhciBZYz1uZXcgR2M7ZnVuY3Rpb24gWGModCxlLG4pe3ZhciByPXQucz1lK24saT1yLWUsbz1yLWk7dC50PWUtbysobi1pKX12YXIgV2M9TWF0aC5QSSxIYz0yKldjO2Z1bmN0aW9uIFpjKHQsZSl7cmV0dXJuW3Q+V2M/dC1IYzp0PC1XYz90K0hjOnQsZV19VmMoKSxWYygpLFZjKCksWmMuaW52ZXJ0PVpjO3ZhciBLYyxKYyxRYywkYyx0bCxlbCxubCxybCxpbCxvbCxzbCxhbCx1bCxjbCxsbCxobCxmbCxwbCxkbCxnbCx5bCxtbCx2bCxfbCx4bCx3bCxibCxEbCxFbCxDbCxTbCxBbCxObCxJbCxNbCxGbCxUbCxPbCxMbCxQbCxSbCxCbD1mdW5jdGlvbih0LGUpe3JldHVybiB0PGU/LTE6dD5lPzE6dD49ZT8wOk5hTn07ZnVuY3Rpb24ga2woKXt9ZnVuY3Rpb24gemwodCxlLG4pe3ZhciByPXZvaWQgMD09PWU/bnVsbDplLGk9ZnVuY3Rpb24odCxlKXt2YXIgbj1hdG9iKHQpO2lmKGUpe2Zvcih2YXIgcj1uZXcgVWludDhBcnJheShuLmxlbmd0aCksaT0wLG89bi5sZW5ndGg7aTxvOysraSlyW2ldPW4uY2hhckNvZGVBdChpKTtyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLG5ldyBVaW50MTZBcnJheShyLmJ1ZmZlcikpfXJldHVybiBufSh0LHZvaWQgMCE9PW4mJm4pLG89aS5pbmRleE9mKCJcbiIsMTApKzEscz1pLnN1YnN0cmluZyhvKSsocj8iLy8jIHNvdXJjZU1hcHBpbmdVUkw9IityOiIiKSxhPW5ldyBCbG9iKFtzXSx7dHlwZToiYXBwbGljYXRpb24vamF2YXNjcmlwdCJ9KTtyZXR1cm4gVVJMLmNyZWF0ZU9iamVjdFVSTChhKX1mdW5jdGlvbiBqbCh0PTgsZT02Mil7Y29uc3Qgbj0iMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiLnNwbGl0KCIiKSxyPVtdO2xldCBpO2lmKGU9ZXx8bi5sZW5ndGgsdClmb3IoaT0wO2k8dDtpKyspcltpXT1uWzB8TWF0aC5yYW5kb20oKSplXTtlbHNle2xldCB0O2ZvcihyWzhdPXJbMTNdPXJbMThdPXJbMjNdPSItIixyWzE0XT0iNCIsaT0wO2k8MzY7aSsrKXJbaV18fCh0PTB8MTYqTWF0aC5yYW5kb20oKSxyW2ldPW5bMTk9PT1pPzMmdHw4OnRdKX1yZXR1cm4gci5qb2luKCIiKX0oZnVuY3Rpb24odCl7MT09PXQubGVuZ3RoJiYodD1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSxuKXtyZXR1cm4gQmwodChlKSxuKX19KHQpKX0pKEJsKSxWYygpLFZjKCksVmMoKSxWYygpLFZjKCksa2wucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjprbCxwb2ludDpmdW5jdGlvbih0LGUpe3RoaXMuc3RyZWFtLnBvaW50KHQsZSl9LHNwaGVyZTpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLnNwaGVyZSgpfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5saW5lU3RhcnQoKX0sbGluZUVuZDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLmxpbmVFbmQoKX0scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ucG9seWdvblN0YXJ0KCl9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5wb2x5Z29uRW5kKCl9fSxmdW5jdGlvbih0KXt0LlBvaW50Q2xvdWQ9InBvaW50Q2xvdWRUb29sIn0oS2N8fChLYz17fSkpLGZ1bmN0aW9uKHQpe3QuVmlkZW9UZXh0VG9vbD0idmlkZW9UZXh0VG9vbCIsdC5WaWRlb1RhZ1Rvb2w9InZpZGVvVGFnVG9vbCIsdC5WaWRlb0NsaXBUb29sPSJ2aWRlb0NsaXBUb29sIn0oSmN8fChKYz17fSkpLGZ1bmN0aW9uKHQpe3QuQXVkaW9UZXh0VG9vbD0iYXVkaW9UZXh0VG9vbCJ9KFFjfHwoUWM9e30pKSxmdW5jdGlvbih0KXt0W3QuUmVjdD0wXT0iUmVjdCIsdFt0LlRhZz0xXT0iVGFnIn0oJGN8fCgkYz17fSkpLGZ1bmN0aW9uKHQpe3QuUmVjdD0icmVjdFRvb2wiLHQuVGFnPSJ0YWdUb29sIix0LlBvaW50PSJwb2ludFRvb2wiLHQuUG9pbnRNYXJrZXI9InBvaW50TWFya2VyVG9vbCIsdC5TZWdtZW50YXRpb249InNlZ21lbnRhdGlvblRvb2wiLHQuRmlsdGVyPSJmaWx0ZXJUb29sIix0LlRleHQ9InRleHRUb29sIix0LlBvbHlnb249InBvbHlnb25Ub29sIix0LkxpbmU9ImxpbmVUb29sIix0LkxpbmVNYXJrZXI9ImxpbmVNYXJrZXJUb29sIix0LkVtcHR5PSJlbXB0eVRvb2wiLHQuRm9sZGVyVGFnPSJmb2xkZXJUYWdUb29sIix0LlJlY3RUcmFjaz0icmVjdFRyYWNrVG9vbCIsdC5TY3JpYmJsZVRvb2w9InNjcmliYmxlVG9vbCIsdC5GYWNlPSJmYWNlVG9vbCIsdC5DbGllbnRBdHRyaWJ1dGU9ImNsaWVudEF0dHJpYnV0ZVRvb2wiLHQuT0NSUmVsYXRpb249Ik9DUlJlbGF0aW9uVG9vbCIsdC5TZWdtZW50QnlSZWN0PSJzZWdtZW50QnlSZWN0VG9vbCIsdC5DdWJvaWQ9ImN1Ym9pZFRvb2wiLHQuUG9pbnRDbG91ZFBvbHlnb249InBvaW50Q2xvdWRQb2x5Z29uIix0LkxMTT0iTExNVG9vbCIsdC5OTFA9Ik5MUFRvb2wiLHQuTExNTXVsdGlXaGVlbD0iTExNTXVsdGlXaGVlbFRvb2wifSh0bHx8KHRsPXt9KSksZnVuY3Rpb24odCl7dC5DaGVjaz0iY2hlY2sifShlbHx8KGVsPXt9KSksZnVuY3Rpb24odCl7dFt0Lm5vdGhpbmc9MF09Im5vdGhpbmciLHRbdC5SZWN0Qkc9MV09IlJlY3RCRyIsdFt0LnNob3dPcmRlcj0yXT0ic2hvd09yZGVyIn0obmx8fChubD17fSkpLHRsLlJlY3QsdGwuVGFnLHRsLlBvaW50LHRsLlBvaW50TWFya2VyLHRsLlNlZ21lbnRhdGlvbix0bC5GaWx0ZXIsdGwuVGV4dCx0bC5Qb2x5Z29uLHRsLkxpbmUsdGwuTGluZU1hcmtlcix0bC5Gb2xkZXJUYWcsdGwuUmVjdFRyYWNrLHRsLkZhY2UsdGwuQ2xpZW50QXR0cmlidXRlLHRsLk9DUlJlbGF0aW9uLHRsLlNlZ21lbnRCeVJlY3QsSmMuVmlkZW9UZXh0VG9vbCxKYy5WaWRlb1RhZ1Rvb2wsSmMuVmlkZW9DbGlwVG9vbCxLYy5Qb2ludENsb3VkLHRsLkN1Ym9pZCx0bC5MTE0sdGwuTkxQLHRsLkxMTU11bHRpV2hlZWwsdGwuUmVjdCx0bC5UYWcsdGwuUG9pbnQsdGwuUG9pbnRNYXJrZXIsdGwuU2VnbWVudGF0aW9uLHRsLkZpbHRlcix0bC5UZXh0LHRsLlBvbHlnb24sdGwuTGluZSx0bC5MaW5lTWFya2VyLHRsLkZvbGRlclRhZyx0bC5SZWN0VHJhY2ssdGwuRmFjZSx0bC5DbGllbnRBdHRyaWJ1dGUsdGwuT0NSUmVsYXRpb24sdGwuU2VnbWVudEJ5UmVjdCxKYy5WaWRlb1RleHRUb29sLEpjLlZpZGVvVGFnVG9vbCxKYy5WaWRlb0NsaXBUb29sLEtjLlBvaW50Q2xvdWQsdGwuQ3Vib2lkLHRsLkxMTSx0bC5OTFAsdGwuTExNTXVsdGlXaGVlbCxmdW5jdGlvbih0KXt0W3Qubm9EZXBlbmQ9MV09Im5vRGVwZW5kIix0W3QuZGVwZW5kT3JpZ2luPTJdPSJkZXBlbmRPcmlnaW4iLHRbdC5kZXBlbmRTaGFwZT0zXT0iZGVwZW5kU2hhcGUiLHRbdC5kZXBlbmRMaW5lPTRdPSJkZXBlbmRMaW5lIix0W3QuZGVwZW5kUG9seWdvbj01XT0iZGVwZW5kUG9seWdvbiIsdFt0LmRlcGVuZFByZVNoYXBlPTEwMV09ImRlcGVuZFByZVNoYXBlIix0W3QuZGVwZW5kUHJlTGluZT0xMDJdPSJkZXBlbmRQcmVMaW5lIix0W3QuZGVwZW5kUHJlUG9seWdvbj0xMDNdPSJkZXBlbmRQcmVQb2x5Z29uIn0ocmx8fChybD17fSkpLGZ1bmN0aW9uKHQpe3QubGM9ImxlZnRDbGljayIsdC5yYz0icmlnaHRDbGljayIsdC5jbGM9ImN0cmxMZWZ0Q2xpY2siLHQuY3JjPSJjdHJsUmlnaHRDbGljayJ9KGlsfHwoaWw9e30pKSxmdW5jdGlvbih0KXt0W3QuTm9ybWFsPTFdPSJOb3JtYWwiLHRbdC5Nb2RpZnk9Ml09Ik1vZGlmeSJ9KG9sfHwob2w9e30pKSxmdW5jdGlvbih0KXt0W3QuTGluZT0wXT0iTGluZSIsdFt0LkN1cnZlPTFdPSJDdXJ2ZSJ9KHNsfHwoc2w9e30pKSxmdW5jdGlvbih0KXt0W3QuU2luZ2xlQ29sb3I9MF09IlNpbmdsZUNvbG9yIix0W3QuTXVsdGlDb2xvcj0xXT0iTXVsdGlDb2xvciJ9KGFsfHwoYWw9e30pKSxmdW5jdGlvbih0KXt0W3QuRm9ybT0xXT0iRm9ybSIsdFt0Lkpzb249Ml09Ikpzb24ifSh1bHx8KHVsPXt9KSksZnVuY3Rpb24odCl7dFt0LlBvaW50PTBdPSJQb2ludCIsdFt0LkxpbmU9MV09IkxpbmUiLHRbdC5QbGFuZT0yXT0iUGxhbmUifShjbHx8KGNsPXt9KSksZnVuY3Rpb24odCl7dFt0Lk5vbmU9MF09Ik5vbmUiLHRbdC5EcmF3aW5nPTFdPSJEcmF3aW5nIix0W3QuRWRpdD0yXT0iRWRpdCJ9KGxsfHwobGw9e30pKSxmdW5jdGlvbih0KXt0W3QuQmFja3dhcmQ9MF09IkJhY2t3YXJkIix0W3QuRm9yd2FyZD0xXT0iRm9yd2FyZCIsdFt0Lkp1bXBTa2lwPTJdPSJKdW1wU2tpcCIsdFt0Lk5vbmU9M109Ik5vbmUifShobHx8KGhsPXt9KSksZnVuY3Rpb24odCl7dFt0LldhaXQ9MF09IldhaXQiLHRbdC5QYXNzPTFdPSJQYXNzIix0W3QuRmFpbD0yXT0iRmFpbCIsdFt0LkxvYWRpbmc9M109IkxvYWRpbmcifShmbHx8KGZsPXt9KSksZnVuY3Rpb24odCl7dFt0LkFueVN0cmluZz0wXT0iQW55U3RyaW5nIix0W3QuT3JkZXI9MV09Ik9yZGVyIix0W3QuRW5nbGlzaE9ubHk9Ml09IkVuZ2xpc2hPbmx5Iix0W3QuTnVtYmVyT25seT0zXT0iTnVtYmVyT25seSIsdFt0LkN1c3RvbUZvcm1hdD00XT0iQ3VzdG9tRm9ybWF0In0ocGx8fChwbD17fSkpLGZ1bmN0aW9uKHQpe3RbdC5JbWdMaXN0PTFlM109IkltZ0xpc3QiLHRbdC5UcmFja1ByZWRpY3Rpb249MTAwMV09IlRyYWNrUHJlZGljdGlvbiIsdFt0LkltZ1NlYXJjaD0xMDAyXT0iSW1nU2VhcmNoIn0oZGx8fChkbD17fSkpLEtjLlBvaW50Q2xvdWQsdGwuQ2xpZW50QXR0cmlidXRlLHRsLkZhY2UsdGwuT0NSUmVsYXRpb24sS2MuUG9pbnRDbG91ZCx0bC5DbGllbnRBdHRyaWJ1dGUsdGwuRmFjZSx0bC5PQ1JSZWxhdGlvbixmdW5jdGlvbih0KXt0W3QuTm9ybWFsPTBdPSJOb3JtYWwiLHRbdC5SZWN0PTFdPSJSZWN0In0oZ2x8fChnbD17fSkpLGZ1bmN0aW9uKHQpe3RbdC5TY3JpYmJsZT0xXT0iU2NyaWJibGUiLHRbdC5FcmFzZT0yXT0iRXJhc2UifSh5bHx8KHlsPXt9KSksZnVuY3Rpb24odCl7dFt0LkdlbmVyYWw9MV09IkdlbmVyYWwiLHRbdC5NdWx0aU1vdmU9Ml09Ik11bHRpTW92ZSJ9KG1sfHwobWw9e30pKSxmdW5jdGlvbih0KXt0LlRocmVlUG9pbnRzPSJ0aHJlZV9wb2ludHMiLHQuVHdvUG9pbnRzPSJ0d29fcG9pbnRzIn0odmx8fCh2bD17fSkpLGZ1bmN0aW9uKHQpe3RbdC5BTk5PVEFUSU9OPTFdPSJBTk5PVEFUSU9OIix0W3QuUVVBTElUWV9JTlNQRUNUSU9OPTJdPSJRVUFMSVRZX0lOU1BFQ1RJT04iLHRbdC5QUkVfQU5OT1RBVElPTj0zXT0iUFJFX0FOTk9UQVRJT04iLHRbdC5NQU5VQUxfQ09SUkVDVElPTj00XT0iTUFOVUFMX0NPUlJFQ1RJT04ifShfbHx8KF9sPXt9KSksZnVuY3Rpb24odCl7dFt0LkJhY2t3YXJkPTBdPSJCYWNrd2FyZCIsdFt0LkZvcndhcmQ9MV09IkZvcndhcmQiLHRbdC5KdW1wU2tpcD0yXT0iSnVtcFNraXAiLHRbdC5Ob25lPTNdPSJOb25lIn0oeGx8fCh4bD17fSkpLGZ1bmN0aW9uKHQpe3RbdC5TdGFydD0wXT0iU3RhcnQiLHRbdC5TdG9wPTFdPSJTdG9wIix0W3QuV2FpdD0yXT0iV2FpdCIsdFt0Lk1vdmU9M109Ik1vdmUifSh3bHx8KHdsPXt9KSksZnVuY3Rpb24odCl7dFt0LlBvaW50PTBdPSJQb2ludCIsdFt0LkxpbmU9MV09IkxpbmUiLHRbdC5QbGFuZT0yXT0iUGxhbmUiLHRbdC5DdWJvaWQ9M109IkN1Ym9pZCJ9KGJsfHwoYmw9e30pKSxmdW5jdGlvbih0KXt0W3QuYXNjZW5kPTBdPSJhc2NlbmQiLHRbdC5kZXNjZW5kPTFdPSJkZXNjZW5kIn0oRGx8fChEbD17fSkpLGZ1bmN0aW9uKHQpe3RbdC5JbnRlbGxpZ2VuY2U9MF09IkludGVsbGlnZW5jZSIsdFt0LkxpbmVhcj0xXT0iTGluZWFyIn0oRWx8fChFbD17fSkpLGZ1bmN0aW9uKHQpe3QuWmg9InpoX0NOIix0LlVTPSJlbl9VUyJ9KENsfHwoQ2w9e30pKSxmdW5jdGlvbih0KXt0W3QuQ2xvY2t3aXNlPTBdPSJDbG9ja3dpc2UiLHRbdC5BbnRpY2xvY2t3aXNlPTFdPSJBbnRpY2xvY2t3aXNlIn0oU2x8fChTbD17fSkpLGZ1bmN0aW9uKHQpe3QuRnJvbnQ9ImZyb250Iix0LkJhY2s9ImJhY2siLHQuU2lkZT0ic2lkZSJ9KEFsfHwoQWw9e30pKSxmdW5jdGlvbih0KXt0LlRMPSJ0bCIsdC5UUj0idHIiLHQuQkw9ImJsIix0LkJSPSJiciJ9KE5sfHwoTmw9e30pKSxmdW5jdGlvbih0KXt0LkZyb250PSJmcm9udCIsdC5CYWNrPSJiYWNrIix0LkxlZnQ9ImxlZnQiLHQuUmlnaHQ9InJpZ2h0Iix0LlRvcD0idG9wIn0oSWx8fChJbD17fSkpLGZ1bmN0aW9uKHQpe3QuUm93PSJyb3ciLHQuQ29sdW1uPSJjb2x1bW4ifShNbHx8KE1sPXt9KSksTmwuVEwsTmwuVFIsTmwuVFIsTmwuVEwsTmwuQkwsTmwuQlIsTmwuQlIsTmwuQkwsTmwuVEwsTmwuQkwsTmwuVFIsTmwuQlIsTmwuQkwsTmwuVEwsTmwuQlIsTmwuVFIsZnVuY3Rpb24odCl7dFt0LkE9NjVdPSJBIix0W3QuQj02Nl09IkIiLHRbdC5DPTY3XT0iQyIsdFt0LkQ9NjhdPSJEIix0W3QuRT02OV09IkUiLHRbdC5GPTcwXT0iRiIsdFt0Lkc9NzFdPSJHIix0W3QuSD03Ml09IkgiLHRbdC5JPTczXT0iSSIsdFt0Lk89NzldPSJPIix0W3QuTD03Nl09IkwiLHRbdC5SPTgyXT0iUiIsdFt0Llo9OTBdPSJaIix0W3QuVz04N109IlciLHRbdC5YPTg4XT0iWCIsdFt0Llk9ODldPSJZIix0W3QuUz04M109IlMiLHRbdC5RPTgxXT0iUSIsdFt0LlA9ODBdPSJQIix0W3QuT25lPTQ5XT0iT25lIix0W3QuVHdvPTUwXT0iVHdvIix0W3QuVGhyZWU9NTFdPSJUaHJlZSIsdFt0LkRlbGV0ZT00Nl09IkRlbGV0ZSIsdFt0LkYxMT0xMjJdPSJGMTEiLHRbdC5TcGFjZT0zMl09IlNwYWNlIix0W3QuRXNjPTI3XT0iRXNjIix0W3QuTGVmdD0zN109IkxlZnQiLHRbdC5VcD0zOF09IlVwIix0W3QuUmlnaHQ9MzldPSJSaWdodCIsdFt0LkRvd249NDBdPSJEb3duIix0W3QuRW50ZXI9MTNdPSJFbnRlciIsdFt0LkN0cmw9MTddPSJDdHJsIix0W3QuQWx0PTE4XT0iQWx0Iix0W3QuU2hpZnQ9MTZdPSJTaGlmdCIsdFt0LlRhYj05XT0iVGFiIix0W3QuQmFja1NwYWNlPThdPSJCYWNrU3BhY2UiLHRbdC5NaW51cz0xODldPSJNaW51cyIsdFt0LkVxdWFsPTE4N109IkVxdWFsIn0oRmx8fChGbD17fSkpLGZ1bmN0aW9uKHQpe3RbdC5DcmVhdGU9MF09IkNyZWF0ZSIsdFt0LkFjdGl2ZT0xXT0iQWN0aXZlIix0W3QuRWRpdD0xXT0iRWRpdCIsdFt0Lk5vbmU9Ml09Ik5vbmUifShUbHx8KFRsPXt9KSksZnVuY3Rpb24odCl7dC5BY3RpdmVBcmVhPSIjQjNCOEZGIn0oT2x8fChPbD17fSkpLGZ1bmN0aW9uKHQpe3RbdC5PdXRzaWRlPTBdPSJPdXRzaWRlIix0W3QuUGFydGlhbGx5SW5zaWRlPTFdPSJQYXJ0aWFsbHlJbnNpZGUiLHRbdC5GdWxseUluc2lkZT0yXT0iRnVsbHlJbnNpZGUifShMbHx8KExsPXt9KSksZnVuY3Rpb24odCl7dC5Ob1JvdGF0ZU5vdGljZT0ibm9Sb3RhdGVOb3RpY2UiLHQuUmVjdEVycm9yU2l6ZU5vdGljZT0icmVjdEVycm9yU2l6ZU5vdGljZSIsdC5UZXh0Q2hlY2tOdW1iZXJFcnJvck5vdGljZT0idGV4dENoZWNrTnVtYmVyRXJyb3JOb3RpY2UiLHQuVGV4dENoZWNrRW5nbGlzaEVycm9yTm90aWNlPSJ0ZXh0Q2hlY2tFbmdsaXNoRXJyb3JOb3RpY2UiLHQuVGV4dENoZWNrQ3VzdG9tRXJyb3JOb3RpY2U9InRleHRDaGVja0N1c3RvbUVycm9yTm90aWNlIix0LlVwcGVyTGltaXRFcnJvck5vdGljZT0iVXBwZXJMaW1pdEVycm9yTm90aWNlIix0Lkxvd2VyTGltaXRFcnJvck5vdGljZT0iTG93ZXJMaW1pdEVycm9yTm90aWNlIix0Lk1pbkFyZWFMaW1pdEVycm9yTm90aWNlPSJNaW5BcmVhTGltaXRFcnJvck5vdGljZSIsdC5NaW5MZW5ndGhMaW1pdEVycm9yTm90aWNlPSJNaW5MZW5ndGhMaW1pdEVycm9yTm90aWNlIix0LkludmFsaWRJbWFnZT0iSW52YWxpZEltYWdlIix0LkRpc2FibGVEZWxldGU9IkRpc2FibGVEZWxldGUiLHQuQ2xlYXJQYXJ0aWFsRGF0YT0iQ2xlYXJQYXJ0aWFsRGF0YSIsdC5NYXJrZXJGaW5pc2g9Ik1hcmtlckZpbmlzaCIsdC5Mb3dlckxpbWl0UG9pbnQ9Ikxvd2VyTGltaXRQb2ludCIsdC5Ob1JvdGF0ZUluRGVwZW5kZW5jZT0ibm9Sb3RhdGVJbkRlcGVuZGVuY2UiLHQuVW5hYmxlVG9SZWFubm90YXRpb249InVuYWJsZVRvUmVhbm5vdGF0aW9uIix0LkZvcmJpZGRlbkNyZWF0aW9uT3V0c2lkZUJvdW5kYXJ5PSJGb3JiaWRkZW5DcmVhdGlvbk91dHNpZGVCb3VuZGFyeSIsdC5TdWNjZXNzZnVsRWRnZUFkc29ycHRpb249IlN1Y2Nlc3NmdWxFZGdlQWRzb3JwdGlvbiIsdC5Gb3JiaWRBZGROZXdQb2ludD0iRm9yYmlkQWRkTmV3UG9pbnQifShQbHx8KFBsPXt9KSksUGwuTm9Sb3RhdGVOb3RpY2UsUGwuUmVjdEVycm9yU2l6ZU5vdGljZSxQbC5UZXh0Q2hlY2tOdW1iZXJFcnJvck5vdGljZSxQbC5UZXh0Q2hlY2tFbmdsaXNoRXJyb3JOb3RpY2UsUGwuVGV4dENoZWNrQ3VzdG9tRXJyb3JOb3RpY2UsUGwuVXBwZXJMaW1pdEVycm9yTm90aWNlLFBsLkxvd2VyTGltaXRFcnJvck5vdGljZSxQbC5NaW5BcmVhTGltaXRFcnJvck5vdGljZSxQbC5NaW5MZW5ndGhMaW1pdEVycm9yTm90aWNlLFBsLkludmFsaWRJbWFnZSxQbC5EaXNhYmxlRGVsZXRlLFBsLkNsZWFyUGFydGlhbERhdGEsUGwuTWFya2VyRmluaXNoLFBsLkxvd2VyTGltaXRQb2ludCxQbC5Ob1JvdGF0ZUluRGVwZW5kZW5jZSxQbC5VbmFibGVUb1JlYW5ub3RhdGlvbixQbC5Gb3JiaWRkZW5DcmVhdGlvbk91dHNpZGVCb3VuZGFyeSxQbC5TdWNjZXNzZnVsRWRnZUFkc29ycHRpb24sUGwuRm9yYmlkQWRkTmV3UG9pbnQsUGwuTm9Sb3RhdGVOb3RpY2UsUGwuUmVjdEVycm9yU2l6ZU5vdGljZSxQbC5UZXh0Q2hlY2tOdW1iZXJFcnJvck5vdGljZSxQbC5UZXh0Q2hlY2tFbmdsaXNoRXJyb3JOb3RpY2UsUGwuVGV4dENoZWNrQ3VzdG9tRXJyb3JOb3RpY2UsUGwuVXBwZXJMaW1pdEVycm9yTm90aWNlLFBsLkxvd2VyTGltaXRFcnJvck5vdGljZSxQbC5NaW5BcmVhTGltaXRFcnJvck5vdGljZSxQbC5NaW5MZW5ndGhMaW1pdEVycm9yTm90aWNlLFBsLkludmFsaWRJbWFnZSxQbC5EaXNhYmxlRGVsZXRlLFBsLkNsZWFyUGFydGlhbERhdGEsUGwuTWFya2VyRmluaXNoLFBsLkxvd2VyTGltaXRQb2ludCxQbC5Ob1JvdGF0ZUluRGVwZW5kZW5jZSxQbC5VbmFibGVUb1JlYW5ub3RhdGlvbixQbC5Gb3JiaWRkZW5DcmVhdGlvbk91dHNpZGVCb3VuZGFyeSxQbC5TdWNjZXNzZnVsRWRnZUFkc29ycHRpb24sUGwuRm9yYmlkQWRkTmV3UG9pbnQsaWwubGMsaWwucmMsaWwuY2xjLGlsLmNyYyxbMSw1LDEwLDIwLDMwLDUwLDgwLDEwMF0uY29uY2F0KEFycmF5LmZyb20oe2xlbmd0aDo5fSkubWFwKCgodCxlKT0+MTAwKihlKzIpKSkpLENsLlpoLENsLlVTLGZ1bmN0aW9uKHQpe3RbdC5DcmVhdGU9MF09IkNyZWF0ZSIsdFt0LkFjdGl2ZT0xXT0iQWN0aXZlIix0W3QuTm9uZT0yXT0iTm9uZSJ9KFJsfHwoUmw9e30pKTtjb25zdCBVbD0xMDAxLHFsPSJzcmdiIixWbD0ic3JnYi1saW5lYXIiLEdsPSJsaW5lYXIiLFlsPSJzcmdiIixYbD0yZTM7Y2xhc3MgV2x7YWRkRXZlbnRMaXN0ZW5lcih0LGUpe3ZvaWQgMD09PXRoaXMuX2xpc3RlbmVycyYmKHRoaXMuX2xpc3RlbmVycz17fSk7Y29uc3Qgbj10aGlzLl9saXN0ZW5lcnM7dm9pZCAwPT09blt0XSYmKG5bdF09W10pLC0xPT09blt0XS5pbmRleE9mKGUpJiZuW3RdLnB1c2goZSl9aGFzRXZlbnRMaXN0ZW5lcih0LGUpe2lmKHZvaWQgMD09PXRoaXMuX2xpc3RlbmVycylyZXR1cm4hMTtjb25zdCBuPXRoaXMuX2xpc3RlbmVycztyZXR1cm4gdm9pZCAwIT09blt0XSYmLTEhPT1uW3RdLmluZGV4T2YoZSl9cmVtb3ZlRXZlbnRMaXN0ZW5lcih0LGUpe2lmKHZvaWQgMD09PXRoaXMuX2xpc3RlbmVycylyZXR1cm47Y29uc3Qgbj10aGlzLl9saXN0ZW5lcnNbdF07aWYodm9pZCAwIT09bil7Y29uc3QgdD1uLmluZGV4T2YoZSk7LTEhPT10JiZuLnNwbGljZSh0LDEpfX1kaXNwYXRjaEV2ZW50KHQpe2lmKHZvaWQgMD09PXRoaXMuX2xpc3RlbmVycylyZXR1cm47Y29uc3QgZT10aGlzLl9saXN0ZW5lcnNbdC50eXBlXTtpZih2b2lkIDAhPT1lKXt0LnRhcmdldD10aGlzO2NvbnN0IG49ZS5zbGljZSgwKTtmb3IobGV0IGU9MCxyPW4ubGVuZ3RoO2U8cjtlKyspbltlXS5jYWxsKHRoaXMsdCk7dC50YXJnZXQ9bnVsbH19fWNvbnN0IEhsPVsiMDAiLCIwMSIsIjAyIiwiMDMiLCIwNCIsIjA1IiwiMDYiLCIwNyIsIjA4IiwiMDkiLCIwYSIsIjBiIiwiMGMiLCIwZCIsIjBlIiwiMGYiLCIxMCIsIjExIiwiMTIiLCIxMyIsIjE0IiwiMTUiLCIxNiIsIjE3IiwiMTgiLCIxOSIsIjFhIiwiMWIiLCIxYyIsIjFkIiwiMWUiLCIxZiIsIjIwIiwiMjEiLCIyMiIsIjIzIiwiMjQiLCIyNSIsIjI2IiwiMjciLCIyOCIsIjI5IiwiMmEiLCIyYiIsIjJjIiwiMmQiLCIyZSIsIjJmIiwiMzAiLCIzMSIsIjMyIiwiMzMiLCIzNCIsIjM1IiwiMzYiLCIzNyIsIjM4IiwiMzkiLCIzYSIsIjNiIiwiM2MiLCIzZCIsIjNlIiwiM2YiLCI0MCIsIjQxIiwiNDIiLCI0MyIsIjQ0IiwiNDUiLCI0NiIsIjQ3IiwiNDgiLCI0OSIsIjRhIiwiNGIiLCI0YyIsIjRkIiwiNGUiLCI0ZiIsIjUwIiwiNTEiLCI1MiIsIjUzIiwiNTQiLCI1NSIsIjU2IiwiNTciLCI1OCIsIjU5IiwiNWEiLCI1YiIsIjVjIiwiNWQiLCI1ZSIsIjVmIiwiNjAiLCI2MSIsIjYyIiwiNjMiLCI2NCIsIjY1IiwiNjYiLCI2NyIsIjY4IiwiNjkiLCI2YSIsIjZiIiwiNmMiLCI2ZCIsIjZlIiwiNmYiLCI3MCIsIjcxIiwiNzIiLCI3MyIsIjc0IiwiNzUiLCI3NiIsIjc3IiwiNzgiLCI3OSIsIjdhIiwiN2IiLCI3YyIsIjdkIiwiN2UiLCI3ZiIsIjgwIiwiODEiLCI4MiIsIjgzIiwiODQiLCI4NSIsIjg2IiwiODciLCI4OCIsIjg5IiwiOGEiLCI4YiIsIjhjIiwiOGQiLCI4ZSIsIjhmIiwiOTAiLCI5MSIsIjkyIiwiOTMiLCI5NCIsIjk1IiwiOTYiLCI5NyIsIjk4IiwiOTkiLCI5YSIsIjliIiwiOWMiLCI5ZCIsIjllIiwiOWYiLCJhMCIsImExIiwiYTIiLCJhMyIsImE0IiwiYTUiLCJhNiIsImE3IiwiYTgiLCJhOSIsImFhIiwiYWIiLCJhYyIsImFkIiwiYWUiLCJhZiIsImIwIiwiYjEiLCJiMiIsImIzIiwiYjQiLCJiNSIsImI2IiwiYjciLCJiOCIsImI5IiwiYmEiLCJiYiIsImJjIiwiYmQiLCJiZSIsImJmIiwiYzAiLCJjMSIsImMyIiwiYzMiLCJjNCIsImM1IiwiYzYiLCJjNyIsImM4IiwiYzkiLCJjYSIsImNiIiwiY2MiLCJjZCIsImNlIiwiY2YiLCJkMCIsImQxIiwiZDIiLCJkMyIsImQ0IiwiZDUiLCJkNiIsImQ3IiwiZDgiLCJkOSIsImRhIiwiZGIiLCJkYyIsImRkIiwiZGUiLCJkZiIsImUwIiwiZTEiLCJlMiIsImUzIiwiZTQiLCJlNSIsImU2IiwiZTciLCJlOCIsImU5IiwiZWEiLCJlYiIsImVjIiwiZWQiLCJlZSIsImVmIiwiZjAiLCJmMSIsImYyIiwiZjMiLCJmNCIsImY1IiwiZjYiLCJmNyIsImY4IiwiZjkiLCJmYSIsImZiIiwiZmMiLCJmZCIsImZlIiwiZmYiXTtmdW5jdGlvbiBabCgpe2NvbnN0IHQ9NDI5NDk2NzI5NSpNYXRoLnJhbmRvbSgpfDAsZT00Mjk0OTY3Mjk1Kk1hdGgucmFuZG9tKCl8MCxuPTQyOTQ5NjcyOTUqTWF0aC5yYW5kb20oKXwwLHI9NDI5NDk2NzI5NSpNYXRoLnJhbmRvbSgpfDA7cmV0dXJuKEhsWzI1NSZ0XStIbFt0Pj44JjI1NV0rSGxbdD4+MTYmMjU1XStIbFt0Pj4yNCYyNTVdKyItIitIbFsyNTUmZV0rSGxbZT4+OCYyNTVdKyItIitIbFtlPj4xNiYxNXw2NF0rSGxbZT4+MjQmMjU1XSsiLSIrSGxbNjMmbnwxMjhdK0hsW24+PjgmMjU1XSsiLSIrSGxbbj4+MTYmMjU1XStIbFtuPj4yNCYyNTVdK0hsWzI1NSZyXStIbFtyPj44JjI1NV0rSGxbcj4+MTYmMjU1XStIbFtyPj4yNCYyNTVdKS50b0xvd2VyQ2FzZSgpfWZ1bmN0aW9uIEtsKHQsZSxuKXtyZXR1cm4gTWF0aC5tYXgoZSxNYXRoLm1pbihuLHQpKX1mdW5jdGlvbiBKbCh0LGUsbil7cmV0dXJuKDEtbikqdCtuKmV9Y2xhc3MgUWx7Y29uc3RydWN0b3IodD0wLGU9MCl7UWwucHJvdG90eXBlLmlzVmVjdG9yMj0hMCx0aGlzLng9dCx0aGlzLnk9ZX1nZXQgd2lkdGgoKXtyZXR1cm4gdGhpcy54fXNldCB3aWR0aCh0KXt0aGlzLng9dH1nZXQgaGVpZ2h0KCl7cmV0dXJuIHRoaXMueX1zZXQgaGVpZ2h0KHQpe3RoaXMueT10fXNldCh0LGUpe3JldHVybiB0aGlzLng9dCx0aGlzLnk9ZSx0aGlzfXNldFNjYWxhcih0KXtyZXR1cm4gdGhpcy54PXQsdGhpcy55PXQsdGhpc31zZXRYKHQpe3JldHVybiB0aGlzLng9dCx0aGlzfXNldFkodCl7cmV0dXJuIHRoaXMueT10LHRoaXN9c2V0Q29tcG9uZW50KHQsZSl7c3dpdGNoKHQpe2Nhc2UgMDp0aGlzLng9ZTticmVhaztjYXNlIDE6dGhpcy55PWU7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIit0KX1yZXR1cm4gdGhpc31nZXRDb21wb25lbnQodCl7c3dpdGNoKHQpe2Nhc2UgMDpyZXR1cm4gdGhpcy54O2Nhc2UgMTpyZXR1cm4gdGhpcy55O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrdCl9fWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMueCx0aGlzLnkpfWNvcHkodCl7cmV0dXJuIHRoaXMueD10LngsdGhpcy55PXQueSx0aGlzfWFkZCh0KXtyZXR1cm4gdGhpcy54Kz10LngsdGhpcy55Kz10LnksdGhpc31hZGRTY2FsYXIodCl7cmV0dXJuIHRoaXMueCs9dCx0aGlzLnkrPXQsdGhpc31hZGRWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngrZS54LHRoaXMueT10LnkrZS55LHRoaXN9YWRkU2NhbGVkVmVjdG9yKHQsZSl7cmV0dXJuIHRoaXMueCs9dC54KmUsdGhpcy55Kz10LnkqZSx0aGlzfXN1Yih0KXtyZXR1cm4gdGhpcy54LT10LngsdGhpcy55LT10LnksdGhpc31zdWJTY2FsYXIodCl7cmV0dXJuIHRoaXMueC09dCx0aGlzLnktPXQsdGhpc31zdWJWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngtZS54LHRoaXMueT10LnktZS55LHRoaXN9bXVsdGlwbHkodCl7cmV0dXJuIHRoaXMueCo9dC54LHRoaXMueSo9dC55LHRoaXN9bXVsdGlwbHlTY2FsYXIodCl7cmV0dXJuIHRoaXMueCo9dCx0aGlzLnkqPXQsdGhpc31kaXZpZGUodCl7cmV0dXJuIHRoaXMueC89dC54LHRoaXMueS89dC55LHRoaXN9ZGl2aWRlU2NhbGFyKHQpe3JldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKDEvdCl9YXBwbHlNYXRyaXgzKHQpe2NvbnN0IGU9dGhpcy54LG49dGhpcy55LHI9dC5lbGVtZW50cztyZXR1cm4gdGhpcy54PXJbMF0qZStyWzNdKm4rcls2XSx0aGlzLnk9clsxXSplK3JbNF0qbityWzddLHRoaXN9bWluKHQpe3JldHVybiB0aGlzLng9TWF0aC5taW4odGhpcy54LHQueCksdGhpcy55PU1hdGgubWluKHRoaXMueSx0LnkpLHRoaXN9bWF4KHQpe3JldHVybiB0aGlzLng9TWF0aC5tYXgodGhpcy54LHQueCksdGhpcy55PU1hdGgubWF4KHRoaXMueSx0LnkpLHRoaXN9Y2xhbXAodCxlKXtyZXR1cm4gdGhpcy54PUtsKHRoaXMueCx0LngsZS54KSx0aGlzLnk9S2wodGhpcy55LHQueSxlLnkpLHRoaXN9Y2xhbXBTY2FsYXIodCxlKXtyZXR1cm4gdGhpcy54PUtsKHRoaXMueCx0LGUpLHRoaXMueT1LbCh0aGlzLnksdCxlKSx0aGlzfWNsYW1wTGVuZ3RoKHQsZSl7Y29uc3Qgbj10aGlzLmxlbmd0aCgpO3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcihufHwxKS5tdWx0aXBseVNjYWxhcihLbChuLHQsZSkpfWZsb29yKCl7cmV0dXJuIHRoaXMueD1NYXRoLmZsb29yKHRoaXMueCksdGhpcy55PU1hdGguZmxvb3IodGhpcy55KSx0aGlzfWNlaWwoKXtyZXR1cm4gdGhpcy54PU1hdGguY2VpbCh0aGlzLngpLHRoaXMueT1NYXRoLmNlaWwodGhpcy55KSx0aGlzfXJvdW5kKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJvdW5kKHRoaXMueCksdGhpcy55PU1hdGgucm91bmQodGhpcy55KSx0aGlzfXJvdW5kVG9aZXJvKCl7cmV0dXJuIHRoaXMueD1NYXRoLnRydW5jKHRoaXMueCksdGhpcy55PU1hdGgudHJ1bmModGhpcy55KSx0aGlzfW5lZ2F0ZSgpe3JldHVybiB0aGlzLng9LXRoaXMueCx0aGlzLnk9LXRoaXMueSx0aGlzfWRvdCh0KXtyZXR1cm4gdGhpcy54KnQueCt0aGlzLnkqdC55fWNyb3NzKHQpe3JldHVybiB0aGlzLngqdC55LXRoaXMueSp0Lnh9bGVuZ3RoU3EoKXtyZXR1cm4gdGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55fWxlbmd0aCgpe3JldHVybiBNYXRoLnNxcnQodGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55KX1tYW5oYXR0YW5MZW5ndGgoKXtyZXR1cm4gTWF0aC5hYnModGhpcy54KStNYXRoLmFicyh0aGlzLnkpfW5vcm1hbGl6ZSgpe3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcih0aGlzLmxlbmd0aCgpfHwxKX1hbmdsZSgpe3JldHVybiBNYXRoLmF0YW4yKC10aGlzLnksLXRoaXMueCkrTWF0aC5QSX1hbmdsZVRvKHQpe2NvbnN0IGU9TWF0aC5zcXJ0KHRoaXMubGVuZ3RoU3EoKSp0Lmxlbmd0aFNxKCkpO2lmKDA9PT1lKXJldHVybiBNYXRoLlBJLzI7Y29uc3Qgbj10aGlzLmRvdCh0KS9lO3JldHVybiBNYXRoLmFjb3MoS2wobiwtMSwxKSl9ZGlzdGFuY2VUbyh0KXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMuZGlzdGFuY2VUb1NxdWFyZWQodCkpfWRpc3RhbmNlVG9TcXVhcmVkKHQpe2NvbnN0IGU9dGhpcy54LXQueCxuPXRoaXMueS10Lnk7cmV0dXJuIGUqZStuKm59bWFuaGF0dGFuRGlzdGFuY2VUbyh0KXtyZXR1cm4gTWF0aC5hYnModGhpcy54LXQueCkrTWF0aC5hYnModGhpcy55LXQueSl9c2V0TGVuZ3RoKHQpe3JldHVybiB0aGlzLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKHQpfWxlcnAodCxlKXtyZXR1cm4gdGhpcy54Kz0odC54LXRoaXMueCkqZSx0aGlzLnkrPSh0LnktdGhpcy55KSplLHRoaXN9bGVycFZlY3RvcnModCxlLG4pe3JldHVybiB0aGlzLng9dC54KyhlLngtdC54KSpuLHRoaXMueT10LnkrKGUueS10LnkpKm4sdGhpc31lcXVhbHModCl7cmV0dXJuIHQueD09PXRoaXMueCYmdC55PT09dGhpcy55fWZyb21BcnJheSh0LGU9MCl7cmV0dXJuIHRoaXMueD10W2VdLHRoaXMueT10W2UrMV0sdGhpc310b0FycmF5KHQ9W10sZT0wKXtyZXR1cm4gdFtlXT10aGlzLngsdFtlKzFdPXRoaXMueSx0fWZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKXtyZXR1cm4gdGhpcy54PXQuZ2V0WChlKSx0aGlzLnk9dC5nZXRZKGUpLHRoaXN9cm90YXRlQXJvdW5kKHQsZSl7Y29uc3Qgbj1NYXRoLmNvcyhlKSxyPU1hdGguc2luKGUpLGk9dGhpcy54LXQueCxvPXRoaXMueS10Lnk7cmV0dXJuIHRoaXMueD1pKm4tbypyK3QueCx0aGlzLnk9aSpyK28qbit0LnksdGhpc31yYW5kb20oKXtyZXR1cm4gdGhpcy54PU1hdGgucmFuZG9tKCksdGhpcy55PU1hdGgucmFuZG9tKCksdGhpc30qW1N5bWJvbC5pdGVyYXRvcl0oKXt5aWVsZCB0aGlzLngseWllbGQgdGhpcy55fX1jbGFzcyAkbHtjb25zdHJ1Y3Rvcih0LGUsbixyLGksbyxzLGEsdSl7JGwucHJvdG90eXBlLmlzTWF0cml4Mz0hMCx0aGlzLmVsZW1lbnRzPVsxLDAsMCwwLDEsMCwwLDAsMV0sdm9pZCAwIT09dCYmdGhpcy5zZXQodCxlLG4scixpLG8scyxhLHUpfXNldCh0LGUsbixyLGksbyxzLGEsdSl7Y29uc3QgYz10aGlzLmVsZW1lbnRzO3JldHVybiBjWzBdPXQsY1sxXT1yLGNbMl09cyxjWzNdPWUsY1s0XT1pLGNbNV09YSxjWzZdPW4sY1s3XT1vLGNbOF09dSx0aGlzfWlkZW50aXR5KCl7cmV0dXJuIHRoaXMuc2V0KDEsMCwwLDAsMSwwLDAsMCwxKSx0aGlzfWNvcHkodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLG49dC5lbGVtZW50cztyZXR1cm4gZVswXT1uWzBdLGVbMV09blsxXSxlWzJdPW5bMl0sZVszXT1uWzNdLGVbNF09bls0XSxlWzVdPW5bNV0sZVs2XT1uWzZdLGVbN109bls3XSxlWzhdPW5bOF0sdGhpc31leHRyYWN0QmFzaXModCxlLG4pe3JldHVybiB0LnNldEZyb21NYXRyaXgzQ29sdW1uKHRoaXMsMCksZS5zZXRGcm9tTWF0cml4M0NvbHVtbih0aGlzLDEpLG4uc2V0RnJvbU1hdHJpeDNDb2x1bW4odGhpcywyKSx0aGlzfXNldEZyb21NYXRyaXg0KHQpe2NvbnN0IGU9dC5lbGVtZW50cztyZXR1cm4gdGhpcy5zZXQoZVswXSxlWzRdLGVbOF0sZVsxXSxlWzVdLGVbOV0sZVsyXSxlWzZdLGVbMTBdKSx0aGlzfW11bHRpcGx5KHQpe3JldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXModGhpcyx0KX1wcmVtdWx0aXBseSh0KXtyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKHQsdGhpcyl9bXVsdGlwbHlNYXRyaWNlcyh0LGUpe2NvbnN0IG49dC5lbGVtZW50cyxyPWUuZWxlbWVudHMsaT10aGlzLmVsZW1lbnRzLG89blswXSxzPW5bM10sYT1uWzZdLHU9blsxXSxjPW5bNF0sbD1uWzddLGg9blsyXSxmPW5bNV0scD1uWzhdLGQ9clswXSxnPXJbM10seT1yWzZdLG09clsxXSx2PXJbNF0sXz1yWzddLHg9clsyXSx3PXJbNV0sYj1yWzhdO3JldHVybiBpWzBdPW8qZCtzKm0rYSp4LGlbM109bypnK3MqdithKncsaVs2XT1vKnkrcypfK2EqYixpWzFdPXUqZCtjKm0rbCp4LGlbNF09dSpnK2MqditsKncsaVs3XT11KnkrYypfK2wqYixpWzJdPWgqZCtmKm0rcCp4LGlbNV09aCpnK2YqditwKncsaVs4XT1oKnkrZipfK3AqYix0aGlzfW11bHRpcGx5U2NhbGFyKHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cztyZXR1cm4gZVswXSo9dCxlWzNdKj10LGVbNl0qPXQsZVsxXSo9dCxlWzRdKj10LGVbN10qPXQsZVsyXSo9dCxlWzVdKj10LGVbOF0qPXQsdGhpc31kZXRlcm1pbmFudCgpe2NvbnN0IHQ9dGhpcy5lbGVtZW50cyxlPXRbMF0sbj10WzFdLHI9dFsyXSxpPXRbM10sbz10WzRdLHM9dFs1XSxhPXRbNl0sdT10WzddLGM9dFs4XTtyZXR1cm4gZSpvKmMtZSpzKnUtbippKmMrbipzKmErcippKnUtcipvKmF9aW52ZXJ0KCl7Y29uc3QgdD10aGlzLmVsZW1lbnRzLGU9dFswXSxuPXRbMV0scj10WzJdLGk9dFszXSxvPXRbNF0scz10WzVdLGE9dFs2XSx1PXRbN10sYz10WzhdLGw9YypvLXMqdSxoPXMqYS1jKmksZj11KmktbyphLHA9ZSpsK24qaCtyKmY7aWYoMD09PXApcmV0dXJuIHRoaXMuc2V0KDAsMCwwLDAsMCwwLDAsMCwwKTtjb25zdCBkPTEvcDtyZXR1cm4gdFswXT1sKmQsdFsxXT0ocip1LWMqbikqZCx0WzJdPShzKm4tcipvKSpkLHRbM109aCpkLHRbNF09KGMqZS1yKmEpKmQsdFs1XT0ocippLXMqZSkqZCx0WzZdPWYqZCx0WzddPShuKmEtdSplKSpkLHRbOF09KG8qZS1uKmkpKmQsdGhpc310cmFuc3Bvc2UoKXtsZXQgdDtjb25zdCBlPXRoaXMuZWxlbWVudHM7cmV0dXJuIHQ9ZVsxXSxlWzFdPWVbM10sZVszXT10LHQ9ZVsyXSxlWzJdPWVbNl0sZVs2XT10LHQ9ZVs1XSxlWzVdPWVbN10sZVs3XT10LHRoaXN9Z2V0Tm9ybWFsTWF0cml4KHQpe3JldHVybiB0aGlzLnNldEZyb21NYXRyaXg0KHQpLmludmVydCgpLnRyYW5zcG9zZSgpfXRyYW5zcG9zZUludG9BcnJheSh0KXtjb25zdCBlPXRoaXMuZWxlbWVudHM7cmV0dXJuIHRbMF09ZVswXSx0WzFdPWVbM10sdFsyXT1lWzZdLHRbM109ZVsxXSx0WzRdPWVbNF0sdFs1XT1lWzddLHRbNl09ZVsyXSx0WzddPWVbNV0sdFs4XT1lWzhdLHRoaXN9c2V0VXZUcmFuc2Zvcm0odCxlLG4scixpLG8scyl7Y29uc3QgYT1NYXRoLmNvcyhpKSx1PU1hdGguc2luKGkpO3JldHVybiB0aGlzLnNldChuKmEsbip1LC1uKihhKm8rdSpzKStvK3QsLXIqdSxyKmEsLXIqKC11Km8rYSpzKStzK2UsMCwwLDEpLHRoaXN9c2NhbGUodCxlKXtyZXR1cm4gdGhpcy5wcmVtdWx0aXBseSh0aC5tYWtlU2NhbGUodCxlKSksdGhpc31yb3RhdGUodCl7cmV0dXJuIHRoaXMucHJlbXVsdGlwbHkodGgubWFrZVJvdGF0aW9uKC10KSksdGhpc310cmFuc2xhdGUodCxlKXtyZXR1cm4gdGhpcy5wcmVtdWx0aXBseSh0aC5tYWtlVHJhbnNsYXRpb24odCxlKSksdGhpc31tYWtlVHJhbnNsYXRpb24odCxlKXtyZXR1cm4gdC5pc1ZlY3RvcjI/dGhpcy5zZXQoMSwwLHQueCwwLDEsdC55LDAsMCwxKTp0aGlzLnNldCgxLDAsdCwwLDEsZSwwLDAsMSksdGhpc31tYWtlUm90YXRpb24odCl7Y29uc3QgZT1NYXRoLmNvcyh0KSxuPU1hdGguc2luKHQpO3JldHVybiB0aGlzLnNldChlLC1uLDAsbixlLDAsMCwwLDEpLHRoaXN9bWFrZVNjYWxlKHQsZSl7cmV0dXJuIHRoaXMuc2V0KHQsMCwwLDAsZSwwLDAsMCwxKSx0aGlzfWVxdWFscyh0KXtjb25zdCBlPXRoaXMuZWxlbWVudHMsbj10LmVsZW1lbnRzO2ZvcihsZXQgdD0wO3Q8OTt0KyspaWYoZVt0XSE9PW5bdF0pcmV0dXJuITE7cmV0dXJuITB9ZnJvbUFycmF5KHQsZT0wKXtmb3IobGV0IG49MDtuPDk7bisrKXRoaXMuZWxlbWVudHNbbl09dFtuK2VdO3JldHVybiB0aGlzfXRvQXJyYXkodD1bXSxlPTApe2NvbnN0IG49dGhpcy5lbGVtZW50cztyZXR1cm4gdFtlXT1uWzBdLHRbZSsxXT1uWzFdLHRbZSsyXT1uWzJdLHRbZSszXT1uWzNdLHRbZSs0XT1uWzRdLHRbZSs1XT1uWzVdLHRbZSs2XT1uWzZdLHRbZSs3XT1uWzddLHRbZSs4XT1uWzhdLHR9Y2xvbmUoKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmZyb21BcnJheSh0aGlzLmVsZW1lbnRzKX19Y29uc3QgdGg9bmV3ICRsO2Z1bmN0aW9uIGVoKHQpe3JldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLHQpfWNvbnN0IG5oPShuZXcgJGwpLnNldCguNDEyMzkwOCwuMzU3NTg0MywuMTgwNDgwOCwuMjEyNjM5LC43MTUxNjg3LC4wNzIxOTIzLC4wMTkzMzA4LC4xMTkxOTQ4LC45NTA1MzIyKSxyaD0obmV3ICRsKS5zZXQoMy4yNDA5Njk5LC0xLjUzNzM4MzIsLS40OTg2MTA4LC0uOTY5MjQzNiwxLjg3NTk2NzUsLjA0MTU1NTEsLjA1NTYzMDEsLS4yMDM5NzcsMS4wNTY5NzE1KTtjb25zdCBpaD1mdW5jdGlvbigpe2NvbnN0IHQ9e2VuYWJsZWQ6ITAsd29ya2luZ0NvbG9yU3BhY2U6Vmwsc3BhY2VzOnt9LGNvbnZlcnQ6ZnVuY3Rpb24odCxlLG4pe3JldHVybiExPT09dGhpcy5lbmFibGVkfHxlPT09bnx8IWV8fCFufHwodGhpcy5zcGFjZXNbZV0udHJhbnNmZXI9PT1ZbCYmKHQucj1vaCh0LnIpLHQuZz1vaCh0LmcpLHQuYj1vaCh0LmIpKSx0aGlzLnNwYWNlc1tlXS5wcmltYXJpZXMhPT10aGlzLnNwYWNlc1tuXS5wcmltYXJpZXMmJih0LmFwcGx5TWF0cml4Myh0aGlzLnNwYWNlc1tlXS50b1hZWiksdC5hcHBseU1hdHJpeDModGhpcy5zcGFjZXNbbl0uZnJvbVhZWikpLHRoaXMuc3BhY2VzW25dLnRyYW5zZmVyPT09WWwmJih0LnI9c2godC5yKSx0Lmc9c2godC5nKSx0LmI9c2godC5iKSkpLHR9LGZyb21Xb3JraW5nQ29sb3JTcGFjZTpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmNvbnZlcnQodCx0aGlzLndvcmtpbmdDb2xvclNwYWNlLGUpfSx0b1dvcmtpbmdDb2xvclNwYWNlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuY29udmVydCh0LGUsdGhpcy53b3JraW5nQ29sb3JTcGFjZSl9LGdldFByaW1hcmllczpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5zcGFjZXNbdF0ucHJpbWFyaWVzfSxnZXRUcmFuc2ZlcjpmdW5jdGlvbih0KXtyZXR1cm4iIj09PXQ/R2w6dGhpcy5zcGFjZXNbdF0udHJhbnNmZXJ9LGdldEx1bWluYW5jZUNvZWZmaWNpZW50czpmdW5jdGlvbih0LGU9dGhpcy53b3JraW5nQ29sb3JTcGFjZSl7cmV0dXJuIHQuZnJvbUFycmF5KHRoaXMuc3BhY2VzW2VdLmx1bWluYW5jZUNvZWZmaWNpZW50cyl9LGRlZmluZTpmdW5jdGlvbih0KXtPYmplY3QuYXNzaWduKHRoaXMuc3BhY2VzLHQpfSxfZ2V0TWF0cml4OmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdC5jb3B5KHRoaXMuc3BhY2VzW2VdLnRvWFlaKS5tdWx0aXBseSh0aGlzLnNwYWNlc1tuXS5mcm9tWFlaKX0sX2dldERyYXdpbmdCdWZmZXJDb2xvclNwYWNlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnNwYWNlc1t0XS5vdXRwdXRDb2xvclNwYWNlQ29uZmlnLmRyYXdpbmdCdWZmZXJDb2xvclNwYWNlfSxfZ2V0VW5wYWNrQ29sb3JTcGFjZTpmdW5jdGlvbih0PXRoaXMud29ya2luZ0NvbG9yU3BhY2Upe3JldHVybiB0aGlzLnNwYWNlc1t0XS53b3JraW5nQ29sb3JTcGFjZUNvbmZpZy51bnBhY2tDb2xvclNwYWNlfX0sZT1bLjY0LC4zMywuMywuNiwuMTUsLjA2XSxuPVsuMjEyNiwuNzE1MiwuMDcyMl0scj1bLjMxMjcsLjMyOV07cmV0dXJuIHQuZGVmaW5lKHtbVmxdOntwcmltYXJpZXM6ZSx3aGl0ZVBvaW50OnIsdHJhbnNmZXI6R2wsdG9YWVo6bmgsZnJvbVhZWjpyaCxsdW1pbmFuY2VDb2VmZmljaWVudHM6bix3b3JraW5nQ29sb3JTcGFjZUNvbmZpZzp7dW5wYWNrQ29sb3JTcGFjZTpxbH0sb3V0cHV0Q29sb3JTcGFjZUNvbmZpZzp7ZHJhd2luZ0J1ZmZlckNvbG9yU3BhY2U6cWx9fSxbcWxdOntwcmltYXJpZXM6ZSx3aGl0ZVBvaW50OnIsdHJhbnNmZXI6WWwsdG9YWVo6bmgsZnJvbVhZWjpyaCxsdW1pbmFuY2VDb2VmZmljaWVudHM6bixvdXRwdXRDb2xvclNwYWNlQ29uZmlnOntkcmF3aW5nQnVmZmVyQ29sb3JTcGFjZTpxbH19fSksdH0oKTtmdW5jdGlvbiBvaCh0KXtyZXR1cm4gdDwuMDQwNDU/LjA3NzM5OTM4MDgqdDpNYXRoLnBvdyguOTQ3ODY3Mjk4Nip0Ky4wNTIxMzI3MDE0LDIuNCl9ZnVuY3Rpb24gc2godCl7cmV0dXJuIHQ8LjAwMzEzMDg/MTIuOTIqdDoxLjA1NSpNYXRoLnBvdyh0LC40MTY2NiktLjA1NX1sZXQgYWg7Y2xhc3MgdWh7c3RhdGljIGdldERhdGFVUkwodCl7aWYoL15kYXRhOi9pLnRlc3QodC5zcmMpfHwidW5kZWZpbmVkIj09dHlwZW9mIEhUTUxDYW52YXNFbGVtZW50KXJldHVybiB0LnNyYztsZXQgZTtpZih0IGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQpZT10O2Vsc2V7dm9pZCAwPT09YWgmJihhaD1laCgiY2FudmFzIikpLGFoLndpZHRoPXQud2lkdGgsYWguaGVpZ2h0PXQuaGVpZ2h0O2NvbnN0IG49YWguZ2V0Q29udGV4dCgiMmQiKTt0IGluc3RhbmNlb2YgSW1hZ2VEYXRhP24ucHV0SW1hZ2VEYXRhKHQsMCwwKTpuLmRyYXdJbWFnZSh0LDAsMCx0LndpZHRoLHQuaGVpZ2h0KSxlPWFofXJldHVybiBlLndpZHRoPjIwNDh8fGUuaGVpZ2h0PjIwNDg/ZS50b0RhdGFVUkwoImltYWdlL2pwZWciLC42KTplLnRvRGF0YVVSTCgiaW1hZ2UvcG5nIil9c3RhdGljIHNSR0JUb0xpbmVhcih0KXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIEhUTUxJbWFnZUVsZW1lbnQmJnQgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50fHwidW5kZWZpbmVkIiE9dHlwZW9mIEhUTUxDYW52YXNFbGVtZW50JiZ0IGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnR8fCJ1bmRlZmluZWQiIT10eXBlb2YgSW1hZ2VCaXRtYXAmJnQgaW5zdGFuY2VvZiBJbWFnZUJpdG1hcCl7Y29uc3QgZT1laCgiY2FudmFzIik7ZS53aWR0aD10LndpZHRoLGUuaGVpZ2h0PXQuaGVpZ2h0O2NvbnN0IG49ZS5nZXRDb250ZXh0KCIyZCIpO24uZHJhd0ltYWdlKHQsMCwwLHQud2lkdGgsdC5oZWlnaHQpO2NvbnN0IHI9bi5nZXRJbWFnZURhdGEoMCwwLHQud2lkdGgsdC5oZWlnaHQpLGk9ci5kYXRhO2ZvcihsZXQgdD0wO3Q8aS5sZW5ndGg7dCsrKWlbdF09MjU1Km9oKGlbdF0vMjU1KTtyZXR1cm4gbi5wdXRJbWFnZURhdGEociwwLDApLGV9aWYodC5kYXRhKXtjb25zdCBlPXQuZGF0YS5zbGljZSgwKTtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrKyllIGluc3RhbmNlb2YgVWludDhBcnJheXx8ZSBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5P2VbdF09TWF0aC5mbG9vcigyNTUqb2goZVt0XS8yNTUpKTplW3RdPW9oKGVbdF0pO3JldHVybntkYXRhOmUsd2lkdGg6dC53aWR0aCxoZWlnaHQ6dC5oZWlnaHR9fXJldHVybiB0fX1sZXQgY2g9MDtjbGFzcyBsaHtjb25zdHJ1Y3Rvcih0PW51bGwpe3RoaXMuaXNTb3VyY2U9ITAsT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlkIix7dmFsdWU6Y2grK30pLHRoaXMudXVpZD1abCgpLHRoaXMuZGF0YT10LHRoaXMuZGF0YVJlYWR5PSEwLHRoaXMudmVyc2lvbj0wfXNldCBuZWVkc1VwZGF0ZSh0KXshMD09PXQmJnRoaXMudmVyc2lvbisrfXRvSlNPTih0KXtjb25zdCBlPXZvaWQgMD09PXR8fCJzdHJpbmciPT10eXBlb2YgdDtpZighZSYmdm9pZCAwIT09dC5pbWFnZXNbdGhpcy51dWlkXSlyZXR1cm4gdC5pbWFnZXNbdGhpcy51dWlkXTtjb25zdCBuPXt1dWlkOnRoaXMudXVpZCx1cmw6IiJ9LHI9dGhpcy5kYXRhO2lmKG51bGwhPT1yKXtsZXQgdDtpZihBcnJheS5pc0FycmF5KHIpKXt0PVtdO2ZvcihsZXQgZT0wLG49ci5sZW5ndGg7ZTxuO2UrKylyW2VdLmlzRGF0YVRleHR1cmU/dC5wdXNoKGhoKHJbZV0uaW1hZ2UpKTp0LnB1c2goaGgocltlXSkpfWVsc2UgdD1oaChyKTtuLnVybD10fXJldHVybiBlfHwodC5pbWFnZXNbdGhpcy51dWlkXT1uKSxufX1mdW5jdGlvbiBoaCh0KXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIEhUTUxJbWFnZUVsZW1lbnQmJnQgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50fHwidW5kZWZpbmVkIiE9dHlwZW9mIEhUTUxDYW52YXNFbGVtZW50JiZ0IGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnR8fCJ1bmRlZmluZWQiIT10eXBlb2YgSW1hZ2VCaXRtYXAmJnQgaW5zdGFuY2VvZiBJbWFnZUJpdG1hcD91aC5nZXREYXRhVVJMKHQpOnQuZGF0YT97ZGF0YTpBcnJheS5mcm9tKHQuZGF0YSksd2lkdGg6dC53aWR0aCxoZWlnaHQ6dC5oZWlnaHQsdHlwZTp0LmRhdGEuY29uc3RydWN0b3IubmFtZX06e319bGV0IGZoPTA7Y2xhc3MgcGggZXh0ZW5kcyBXbHtjb25zdHJ1Y3Rvcih0PXBoLkRFRkFVTFRfSU1BR0UsZT1waC5ERUZBVUxUX01BUFBJTkcsbj1VbCxyPVVsLGk9MTAwNixvPTEwMDgscz0xMDIzLGE9MTAwOSx1PXBoLkRFRkFVTFRfQU5JU09UUk9QWSxjPSIiKXtzdXBlcigpLHRoaXMuaXNUZXh0dXJlPSEwLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpZCIse3ZhbHVlOmZoKyt9KSx0aGlzLnV1aWQ9WmwoKSx0aGlzLm5hbWU9IiIsdGhpcy5zb3VyY2U9bmV3IGxoKHQpLHRoaXMubWlwbWFwcz1bXSx0aGlzLm1hcHBpbmc9ZSx0aGlzLmNoYW5uZWw9MCx0aGlzLndyYXBTPW4sdGhpcy53cmFwVD1yLHRoaXMubWFnRmlsdGVyPWksdGhpcy5taW5GaWx0ZXI9byx0aGlzLmFuaXNvdHJvcHk9dSx0aGlzLmZvcm1hdD1zLHRoaXMuaW50ZXJuYWxGb3JtYXQ9bnVsbCx0aGlzLnR5cGU9YSx0aGlzLm9mZnNldD1uZXcgUWwoMCwwKSx0aGlzLnJlcGVhdD1uZXcgUWwoMSwxKSx0aGlzLmNlbnRlcj1uZXcgUWwoMCwwKSx0aGlzLnJvdGF0aW9uPTAsdGhpcy5tYXRyaXhBdXRvVXBkYXRlPSEwLHRoaXMubWF0cml4PW5ldyAkbCx0aGlzLmdlbmVyYXRlTWlwbWFwcz0hMCx0aGlzLnByZW11bHRpcGx5QWxwaGE9ITEsdGhpcy5mbGlwWT0hMCx0aGlzLnVucGFja0FsaWdubWVudD00LHRoaXMuY29sb3JTcGFjZT1jLHRoaXMudXNlckRhdGE9e30sdGhpcy52ZXJzaW9uPTAsdGhpcy5vblVwZGF0ZT1udWxsLHRoaXMucmVuZGVyVGFyZ2V0PW51bGwsdGhpcy5pc1JlbmRlclRhcmdldFRleHR1cmU9ITEsdGhpcy5wbXJlbVZlcnNpb249MH1nZXQgaW1hZ2UoKXtyZXR1cm4gdGhpcy5zb3VyY2UuZGF0YX1zZXQgaW1hZ2UodD1udWxsKXt0aGlzLnNvdXJjZS5kYXRhPXR9dXBkYXRlTWF0cml4KCl7dGhpcy5tYXRyaXguc2V0VXZUcmFuc2Zvcm0odGhpcy5vZmZzZXQueCx0aGlzLm9mZnNldC55LHRoaXMucmVwZWF0LngsdGhpcy5yZXBlYXQueSx0aGlzLnJvdGF0aW9uLHRoaXMuY2VudGVyLngsdGhpcy5jZW50ZXIueSl9Y2xvbmUoKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9Y29weSh0KXtyZXR1cm4gdGhpcy5uYW1lPXQubmFtZSx0aGlzLnNvdXJjZT10LnNvdXJjZSx0aGlzLm1pcG1hcHM9dC5taXBtYXBzLnNsaWNlKDApLHRoaXMubWFwcGluZz10Lm1hcHBpbmcsdGhpcy5jaGFubmVsPXQuY2hhbm5lbCx0aGlzLndyYXBTPXQud3JhcFMsdGhpcy53cmFwVD10LndyYXBULHRoaXMubWFnRmlsdGVyPXQubWFnRmlsdGVyLHRoaXMubWluRmlsdGVyPXQubWluRmlsdGVyLHRoaXMuYW5pc290cm9weT10LmFuaXNvdHJvcHksdGhpcy5mb3JtYXQ9dC5mb3JtYXQsdGhpcy5pbnRlcm5hbEZvcm1hdD10LmludGVybmFsRm9ybWF0LHRoaXMudHlwZT10LnR5cGUsdGhpcy5vZmZzZXQuY29weSh0Lm9mZnNldCksdGhpcy5yZXBlYXQuY29weSh0LnJlcGVhdCksdGhpcy5jZW50ZXIuY29weSh0LmNlbnRlciksdGhpcy5yb3RhdGlvbj10LnJvdGF0aW9uLHRoaXMubWF0cml4QXV0b1VwZGF0ZT10Lm1hdHJpeEF1dG9VcGRhdGUsdGhpcy5tYXRyaXguY29weSh0Lm1hdHJpeCksdGhpcy5nZW5lcmF0ZU1pcG1hcHM9dC5nZW5lcmF0ZU1pcG1hcHMsdGhpcy5wcmVtdWx0aXBseUFscGhhPXQucHJlbXVsdGlwbHlBbHBoYSx0aGlzLmZsaXBZPXQuZmxpcFksdGhpcy51bnBhY2tBbGlnbm1lbnQ9dC51bnBhY2tBbGlnbm1lbnQsdGhpcy5jb2xvclNwYWNlPXQuY29sb3JTcGFjZSx0aGlzLnJlbmRlclRhcmdldD10LnJlbmRlclRhcmdldCx0aGlzLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZT10LmlzUmVuZGVyVGFyZ2V0VGV4dHVyZSx0aGlzLnVzZXJEYXRhPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodC51c2VyRGF0YSkpLHRoaXMubmVlZHNVcGRhdGU9ITAsdGhpc310b0pTT04odCl7Y29uc3QgZT12b2lkIDA9PT10fHwic3RyaW5nIj09dHlwZW9mIHQ7aWYoIWUmJnZvaWQgMCE9PXQudGV4dHVyZXNbdGhpcy51dWlkXSlyZXR1cm4gdC50ZXh0dXJlc1t0aGlzLnV1aWRdO2NvbnN0IG49e21ldGFkYXRhOnt2ZXJzaW9uOjQuNix0eXBlOiJUZXh0dXJlIixnZW5lcmF0b3I6IlRleHR1cmUudG9KU09OIn0sdXVpZDp0aGlzLnV1aWQsbmFtZTp0aGlzLm5hbWUsaW1hZ2U6dGhpcy5zb3VyY2UudG9KU09OKHQpLnV1aWQsbWFwcGluZzp0aGlzLm1hcHBpbmcsY2hhbm5lbDp0aGlzLmNoYW5uZWwscmVwZWF0Olt0aGlzLnJlcGVhdC54LHRoaXMucmVwZWF0LnldLG9mZnNldDpbdGhpcy5vZmZzZXQueCx0aGlzLm9mZnNldC55XSxjZW50ZXI6W3RoaXMuY2VudGVyLngsdGhpcy5jZW50ZXIueV0scm90YXRpb246dGhpcy5yb3RhdGlvbix3cmFwOlt0aGlzLndyYXBTLHRoaXMud3JhcFRdLGZvcm1hdDp0aGlzLmZvcm1hdCxpbnRlcm5hbEZvcm1hdDp0aGlzLmludGVybmFsRm9ybWF0LHR5cGU6dGhpcy50eXBlLGNvbG9yU3BhY2U6dGhpcy5jb2xvclNwYWNlLG1pbkZpbHRlcjp0aGlzLm1pbkZpbHRlcixtYWdGaWx0ZXI6dGhpcy5tYWdGaWx0ZXIsYW5pc290cm9weTp0aGlzLmFuaXNvdHJvcHksZmxpcFk6dGhpcy5mbGlwWSxnZW5lcmF0ZU1pcG1hcHM6dGhpcy5nZW5lcmF0ZU1pcG1hcHMscHJlbXVsdGlwbHlBbHBoYTp0aGlzLnByZW11bHRpcGx5QWxwaGEsdW5wYWNrQWxpZ25tZW50OnRoaXMudW5wYWNrQWxpZ25tZW50fTtyZXR1cm4gT2JqZWN0LmtleXModGhpcy51c2VyRGF0YSkubGVuZ3RoPjAmJihuLnVzZXJEYXRhPXRoaXMudXNlckRhdGEpLGV8fCh0LnRleHR1cmVzW3RoaXMudXVpZF09biksbn1kaXNwb3NlKCl7dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJkaXNwb3NlIn0pfXRyYW5zZm9ybVV2KHQpe2lmKDMwMCE9PXRoaXMubWFwcGluZylyZXR1cm4gdDtpZih0LmFwcGx5TWF0cml4Myh0aGlzLm1hdHJpeCksdC54PDB8fHQueD4xKXN3aXRjaCh0aGlzLndyYXBTKXtjYXNlIDFlMzp0Lng9dC54LU1hdGguZmxvb3IodC54KTticmVhaztjYXNlIFVsOnQueD10Lng8MD8wOjE7YnJlYWs7Y2FzZSAxMDAyOjE9PT1NYXRoLmFicyhNYXRoLmZsb29yKHQueCklMik/dC54PU1hdGguY2VpbCh0LngpLXQueDp0Lng9dC54LU1hdGguZmxvb3IodC54KX1pZih0Lnk8MHx8dC55PjEpc3dpdGNoKHRoaXMud3JhcFQpe2Nhc2UgMWUzOnQueT10LnktTWF0aC5mbG9vcih0LnkpO2JyZWFrO2Nhc2UgVWw6dC55PXQueTwwPzA6MTticmVhaztjYXNlIDEwMDI6MT09PU1hdGguYWJzKE1hdGguZmxvb3IodC55KSUyKT90Lnk9TWF0aC5jZWlsKHQueSktdC55OnQueT10LnktTWF0aC5mbG9vcih0LnkpfXJldHVybiB0aGlzLmZsaXBZJiYodC55PTEtdC55KSx0fXNldCBuZWVkc1VwZGF0ZSh0KXshMD09PXQmJih0aGlzLnZlcnNpb24rKyx0aGlzLnNvdXJjZS5uZWVkc1VwZGF0ZT0hMCl9c2V0IG5lZWRzUE1SRU1VcGRhdGUodCl7ITA9PT10JiZ0aGlzLnBtcmVtVmVyc2lvbisrfX1waC5ERUZBVUxUX0lNQUdFPW51bGwscGguREVGQVVMVF9NQVBQSU5HPTMwMCxwaC5ERUZBVUxUX0FOSVNPVFJPUFk9MTtjbGFzcyBkaHtjb25zdHJ1Y3Rvcih0PTAsZT0wLG49MCxyPTEpe2RoLnByb3RvdHlwZS5pc1ZlY3RvcjQ9ITAsdGhpcy54PXQsdGhpcy55PWUsdGhpcy56PW4sdGhpcy53PXJ9Z2V0IHdpZHRoKCl7cmV0dXJuIHRoaXMuen1zZXQgd2lkdGgodCl7dGhpcy56PXR9Z2V0IGhlaWdodCgpe3JldHVybiB0aGlzLnd9c2V0IGhlaWdodCh0KXt0aGlzLnc9dH1zZXQodCxlLG4scil7cmV0dXJuIHRoaXMueD10LHRoaXMueT1lLHRoaXMuej1uLHRoaXMudz1yLHRoaXN9c2V0U2NhbGFyKHQpe3JldHVybiB0aGlzLng9dCx0aGlzLnk9dCx0aGlzLno9dCx0aGlzLnc9dCx0aGlzfXNldFgodCl7cmV0dXJuIHRoaXMueD10LHRoaXN9c2V0WSh0KXtyZXR1cm4gdGhpcy55PXQsdGhpc31zZXRaKHQpe3JldHVybiB0aGlzLno9dCx0aGlzfXNldFcodCl7cmV0dXJuIHRoaXMudz10LHRoaXN9c2V0Q29tcG9uZW50KHQsZSl7c3dpdGNoKHQpe2Nhc2UgMDp0aGlzLng9ZTticmVhaztjYXNlIDE6dGhpcy55PWU7YnJlYWs7Y2FzZSAyOnRoaXMuej1lO2JyZWFrO2Nhc2UgMzp0aGlzLnc9ZTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAiK3QpfXJldHVybiB0aGlzfWdldENvbXBvbmVudCh0KXtzd2l0Y2godCl7Y2FzZSAwOnJldHVybiB0aGlzLng7Y2FzZSAxOnJldHVybiB0aGlzLnk7Y2FzZSAyOnJldHVybiB0aGlzLno7Y2FzZSAzOnJldHVybiB0aGlzLnc7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIit0KX19Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy54LHRoaXMueSx0aGlzLnosdGhpcy53KX1jb3B5KHQpe3JldHVybiB0aGlzLng9dC54LHRoaXMueT10LnksdGhpcy56PXQueix0aGlzLnc9dm9pZCAwIT09dC53P3QudzoxLHRoaXN9YWRkKHQpe3JldHVybiB0aGlzLngrPXQueCx0aGlzLnkrPXQueSx0aGlzLnorPXQueix0aGlzLncrPXQudyx0aGlzfWFkZFNjYWxhcih0KXtyZXR1cm4gdGhpcy54Kz10LHRoaXMueSs9dCx0aGlzLnorPXQsdGhpcy53Kz10LHRoaXN9YWRkVmVjdG9ycyh0LGUpe3JldHVybiB0aGlzLng9dC54K2UueCx0aGlzLnk9dC55K2UueSx0aGlzLno9dC56K2Uueix0aGlzLnc9dC53K2Uudyx0aGlzfWFkZFNjYWxlZFZlY3Rvcih0LGUpe3JldHVybiB0aGlzLngrPXQueCplLHRoaXMueSs9dC55KmUsdGhpcy56Kz10LnoqZSx0aGlzLncrPXQudyplLHRoaXN9c3ViKHQpe3JldHVybiB0aGlzLngtPXQueCx0aGlzLnktPXQueSx0aGlzLnotPXQueix0aGlzLnctPXQudyx0aGlzfXN1YlNjYWxhcih0KXtyZXR1cm4gdGhpcy54LT10LHRoaXMueS09dCx0aGlzLnotPXQsdGhpcy53LT10LHRoaXN9c3ViVmVjdG9ycyh0LGUpe3JldHVybiB0aGlzLng9dC54LWUueCx0aGlzLnk9dC55LWUueSx0aGlzLno9dC56LWUueix0aGlzLnc9dC53LWUudyx0aGlzfW11bHRpcGx5KHQpe3JldHVybiB0aGlzLngqPXQueCx0aGlzLnkqPXQueSx0aGlzLnoqPXQueix0aGlzLncqPXQudyx0aGlzfW11bHRpcGx5U2NhbGFyKHQpe3JldHVybiB0aGlzLngqPXQsdGhpcy55Kj10LHRoaXMueio9dCx0aGlzLncqPXQsdGhpc31hcHBseU1hdHJpeDQodCl7Y29uc3QgZT10aGlzLngsbj10aGlzLnkscj10aGlzLnosaT10aGlzLncsbz10LmVsZW1lbnRzO3JldHVybiB0aGlzLng9b1swXSplK29bNF0qbitvWzhdKnIrb1sxMl0qaSx0aGlzLnk9b1sxXSplK29bNV0qbitvWzldKnIrb1sxM10qaSx0aGlzLno9b1syXSplK29bNl0qbitvWzEwXSpyK29bMTRdKmksdGhpcy53PW9bM10qZStvWzddKm4rb1sxMV0qcitvWzE1XSppLHRoaXN9ZGl2aWRlKHQpe3JldHVybiB0aGlzLngvPXQueCx0aGlzLnkvPXQueSx0aGlzLnovPXQueix0aGlzLncvPXQudyx0aGlzfWRpdmlkZVNjYWxhcih0KXtyZXR1cm4gdGhpcy5tdWx0aXBseVNjYWxhcigxL3QpfXNldEF4aXNBbmdsZUZyb21RdWF0ZXJuaW9uKHQpe3RoaXMudz0yKk1hdGguYWNvcyh0LncpO2NvbnN0IGU9TWF0aC5zcXJ0KDEtdC53KnQudyk7cmV0dXJuIGU8MWUtND8odGhpcy54PTEsdGhpcy55PTAsdGhpcy56PTApOih0aGlzLng9dC54L2UsdGhpcy55PXQueS9lLHRoaXMuej10LnovZSksdGhpc31zZXRBeGlzQW5nbGVGcm9tUm90YXRpb25NYXRyaXgodCl7bGV0IGUsbixyLGk7Y29uc3Qgbz0uMDEscz0uMSxhPXQuZWxlbWVudHMsdT1hWzBdLGM9YVs0XSxsPWFbOF0saD1hWzFdLGY9YVs1XSxwPWFbOV0sZD1hWzJdLGc9YVs2XSx5PWFbMTBdO2lmKE1hdGguYWJzKGMtaCk8byYmTWF0aC5hYnMobC1kKTxvJiZNYXRoLmFicyhwLWcpPG8pe2lmKE1hdGguYWJzKGMraCk8cyYmTWF0aC5hYnMobCtkKTxzJiZNYXRoLmFicyhwK2cpPHMmJk1hdGguYWJzKHUrZit5LTMpPHMpcmV0dXJuIHRoaXMuc2V0KDEsMCwwLDApLHRoaXM7ZT1NYXRoLlBJO2NvbnN0IHQ9KHUrMSkvMixhPShmKzEpLzIsbT0oeSsxKS8yLHY9KGMraCkvNCxfPShsK2QpLzQseD0ocCtnKS80O3JldHVybiB0PmEmJnQ+bT90PG8/KG49MCxyPS43MDcxMDY3ODEsaT0uNzA3MTA2NzgxKToobj1NYXRoLnNxcnQodCkscj12L24saT1fL24pOmE+bT9hPG8/KG49LjcwNzEwNjc4MSxyPTAsaT0uNzA3MTA2NzgxKToocj1NYXRoLnNxcnQoYSksbj12L3IsaT14L3IpOm08bz8obj0uNzA3MTA2NzgxLHI9LjcwNzEwNjc4MSxpPTApOihpPU1hdGguc3FydChtKSxuPV8vaSxyPXgvaSksdGhpcy5zZXQobixyLGksZSksdGhpc31sZXQgbT1NYXRoLnNxcnQoKGctcCkqKGctcCkrKGwtZCkqKGwtZCkrKGgtYykqKGgtYykpO3JldHVybiBNYXRoLmFicyhtKTwuMDAxJiYobT0xKSx0aGlzLng9KGctcCkvbSx0aGlzLnk9KGwtZCkvbSx0aGlzLno9KGgtYykvbSx0aGlzLnc9TWF0aC5hY29zKCh1K2YreS0xKS8yKSx0aGlzfXNldEZyb21NYXRyaXhQb3NpdGlvbih0KXtjb25zdCBlPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMueD1lWzEyXSx0aGlzLnk9ZVsxM10sdGhpcy56PWVbMTRdLHRoaXMudz1lWzE1XSx0aGlzfW1pbih0KXtyZXR1cm4gdGhpcy54PU1hdGgubWluKHRoaXMueCx0LngpLHRoaXMueT1NYXRoLm1pbih0aGlzLnksdC55KSx0aGlzLno9TWF0aC5taW4odGhpcy56LHQueiksdGhpcy53PU1hdGgubWluKHRoaXMudyx0LncpLHRoaXN9bWF4KHQpe3JldHVybiB0aGlzLng9TWF0aC5tYXgodGhpcy54LHQueCksdGhpcy55PU1hdGgubWF4KHRoaXMueSx0LnkpLHRoaXMuej1NYXRoLm1heCh0aGlzLnosdC56KSx0aGlzLnc9TWF0aC5tYXgodGhpcy53LHQudyksdGhpc31jbGFtcCh0LGUpe3JldHVybiB0aGlzLng9S2wodGhpcy54LHQueCxlLngpLHRoaXMueT1LbCh0aGlzLnksdC55LGUueSksdGhpcy56PUtsKHRoaXMueix0LnosZS56KSx0aGlzLnc9S2wodGhpcy53LHQudyxlLncpLHRoaXN9Y2xhbXBTY2FsYXIodCxlKXtyZXR1cm4gdGhpcy54PUtsKHRoaXMueCx0LGUpLHRoaXMueT1LbCh0aGlzLnksdCxlKSx0aGlzLno9S2wodGhpcy56LHQsZSksdGhpcy53PUtsKHRoaXMudyx0LGUpLHRoaXN9Y2xhbXBMZW5ndGgodCxlKXtjb25zdCBuPXRoaXMubGVuZ3RoKCk7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKG58fDEpLm11bHRpcGx5U2NhbGFyKEtsKG4sdCxlKSl9Zmxvb3IoKXtyZXR1cm4gdGhpcy54PU1hdGguZmxvb3IodGhpcy54KSx0aGlzLnk9TWF0aC5mbG9vcih0aGlzLnkpLHRoaXMuej1NYXRoLmZsb29yKHRoaXMueiksdGhpcy53PU1hdGguZmxvb3IodGhpcy53KSx0aGlzfWNlaWwoKXtyZXR1cm4gdGhpcy54PU1hdGguY2VpbCh0aGlzLngpLHRoaXMueT1NYXRoLmNlaWwodGhpcy55KSx0aGlzLno9TWF0aC5jZWlsKHRoaXMueiksdGhpcy53PU1hdGguY2VpbCh0aGlzLncpLHRoaXN9cm91bmQoKXtyZXR1cm4gdGhpcy54PU1hdGgucm91bmQodGhpcy54KSx0aGlzLnk9TWF0aC5yb3VuZCh0aGlzLnkpLHRoaXMuej1NYXRoLnJvdW5kKHRoaXMueiksdGhpcy53PU1hdGgucm91bmQodGhpcy53KSx0aGlzfXJvdW5kVG9aZXJvKCl7cmV0dXJuIHRoaXMueD1NYXRoLnRydW5jKHRoaXMueCksdGhpcy55PU1hdGgudHJ1bmModGhpcy55KSx0aGlzLno9TWF0aC50cnVuYyh0aGlzLnopLHRoaXMudz1NYXRoLnRydW5jKHRoaXMudyksdGhpc31uZWdhdGUoKXtyZXR1cm4gdGhpcy54PS10aGlzLngsdGhpcy55PS10aGlzLnksdGhpcy56PS10aGlzLnosdGhpcy53PS10aGlzLncsdGhpc31kb3QodCl7cmV0dXJuIHRoaXMueCp0LngrdGhpcy55KnQueSt0aGlzLnoqdC56K3RoaXMudyp0Lnd9bGVuZ3RoU3EoKXtyZXR1cm4gdGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55K3RoaXMueip0aGlzLnordGhpcy53KnRoaXMud31sZW5ndGgoKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSt0aGlzLnoqdGhpcy56K3RoaXMudyp0aGlzLncpfW1hbmhhdHRhbkxlbmd0aCgpe3JldHVybiBNYXRoLmFicyh0aGlzLngpK01hdGguYWJzKHRoaXMueSkrTWF0aC5hYnModGhpcy56KStNYXRoLmFicyh0aGlzLncpfW5vcm1hbGl6ZSgpe3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcih0aGlzLmxlbmd0aCgpfHwxKX1zZXRMZW5ndGgodCl7cmV0dXJuIHRoaXMubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIodCl9bGVycCh0LGUpe3JldHVybiB0aGlzLngrPSh0LngtdGhpcy54KSplLHRoaXMueSs9KHQueS10aGlzLnkpKmUsdGhpcy56Kz0odC56LXRoaXMueikqZSx0aGlzLncrPSh0LnctdGhpcy53KSplLHRoaXN9bGVycFZlY3RvcnModCxlLG4pe3JldHVybiB0aGlzLng9dC54KyhlLngtdC54KSpuLHRoaXMueT10LnkrKGUueS10LnkpKm4sdGhpcy56PXQueisoZS56LXQueikqbix0aGlzLnc9dC53KyhlLnctdC53KSpuLHRoaXN9ZXF1YWxzKHQpe3JldHVybiB0Lng9PT10aGlzLngmJnQueT09PXRoaXMueSYmdC56PT09dGhpcy56JiZ0Lnc9PT10aGlzLnd9ZnJvbUFycmF5KHQsZT0wKXtyZXR1cm4gdGhpcy54PXRbZV0sdGhpcy55PXRbZSsxXSx0aGlzLno9dFtlKzJdLHRoaXMudz10W2UrM10sdGhpc310b0FycmF5KHQ9W10sZT0wKXtyZXR1cm4gdFtlXT10aGlzLngsdFtlKzFdPXRoaXMueSx0W2UrMl09dGhpcy56LHRbZSszXT10aGlzLncsdH1mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSl7cmV0dXJuIHRoaXMueD10LmdldFgoZSksdGhpcy55PXQuZ2V0WShlKSx0aGlzLno9dC5nZXRaKGUpLHRoaXMudz10LmdldFcoZSksdGhpc31yYW5kb20oKXtyZXR1cm4gdGhpcy54PU1hdGgucmFuZG9tKCksdGhpcy55PU1hdGgucmFuZG9tKCksdGhpcy56PU1hdGgucmFuZG9tKCksdGhpcy53PU1hdGgucmFuZG9tKCksdGhpc30qW1N5bWJvbC5pdGVyYXRvcl0oKXt5aWVsZCB0aGlzLngseWllbGQgdGhpcy55LHlpZWxkIHRoaXMueix5aWVsZCB0aGlzLnd9fWNsYXNzIGdoe2NvbnN0cnVjdG9yKHQ9MCxlPTAsbj0wLHI9MSl7dGhpcy5pc1F1YXRlcm5pb249ITAsdGhpcy5feD10LHRoaXMuX3k9ZSx0aGlzLl96PW4sdGhpcy5fdz1yfXN0YXRpYyBzbGVycEZsYXQodCxlLG4scixpLG8scyl7bGV0IGE9bltyKzBdLHU9bltyKzFdLGM9bltyKzJdLGw9bltyKzNdO2NvbnN0IGg9aVtvKzBdLGY9aVtvKzFdLHA9aVtvKzJdLGQ9aVtvKzNdO2lmKDA9PT1zKXJldHVybiB0W2UrMF09YSx0W2UrMV09dSx0W2UrMl09Yyx2b2lkKHRbZSszXT1sKTtpZigxPT09cylyZXR1cm4gdFtlKzBdPWgsdFtlKzFdPWYsdFtlKzJdPXAsdm9pZCh0W2UrM109ZCk7aWYobCE9PWR8fGEhPT1ofHx1IT09Znx8YyE9PXApe2xldCB0PTEtcztjb25zdCBlPWEqaCt1KmYrYypwK2wqZCxuPWU+PTA/MTotMSxyPTEtZSplO2lmKHI+TnVtYmVyLkVQU0lMT04pe2NvbnN0IGk9TWF0aC5zcXJ0KHIpLG89TWF0aC5hdGFuMihpLGUqbik7dD1NYXRoLnNpbih0Km8pL2kscz1NYXRoLnNpbihzKm8pL2l9Y29uc3QgaT1zKm47aWYoYT1hKnQraCppLHU9dSp0K2YqaSxjPWMqdCtwKmksbD1sKnQrZCppLHQ9PT0xLXMpe2NvbnN0IHQ9MS9NYXRoLnNxcnQoYSphK3UqdStjKmMrbCpsKTthKj10LHUqPXQsYyo9dCxsKj10fX10W2VdPWEsdFtlKzFdPXUsdFtlKzJdPWMsdFtlKzNdPWx9c3RhdGljIG11bHRpcGx5UXVhdGVybmlvbnNGbGF0KHQsZSxuLHIsaSxvKXtjb25zdCBzPW5bcl0sYT1uW3IrMV0sdT1uW3IrMl0sYz1uW3IrM10sbD1pW29dLGg9aVtvKzFdLGY9aVtvKzJdLHA9aVtvKzNdO3JldHVybiB0W2VdPXMqcCtjKmwrYSpmLXUqaCx0W2UrMV09YSpwK2MqaCt1KmwtcypmLHRbZSsyXT11KnArYypmK3MqaC1hKmwsdFtlKzNdPWMqcC1zKmwtYSpoLXUqZix0fWdldCB4KCl7cmV0dXJuIHRoaXMuX3h9c2V0IHgodCl7dGhpcy5feD10LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1nZXQgeSgpe3JldHVybiB0aGlzLl95fXNldCB5KHQpe3RoaXMuX3k9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9Z2V0IHooKXtyZXR1cm4gdGhpcy5fen1zZXQgeih0KXt0aGlzLl96PXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfWdldCB3KCl7cmV0dXJuIHRoaXMuX3d9c2V0IHcodCl7dGhpcy5fdz10LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1zZXQodCxlLG4scil7cmV0dXJuIHRoaXMuX3g9dCx0aGlzLl95PWUsdGhpcy5fej1uLHRoaXMuX3c9cix0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLl94LHRoaXMuX3ksdGhpcy5feix0aGlzLl93KX1jb3B5KHQpe3JldHVybiB0aGlzLl94PXQueCx0aGlzLl95PXQueSx0aGlzLl96PXQueix0aGlzLl93PXQudyx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zZXRGcm9tRXVsZXIodCxlPSEwKXtjb25zdCBuPXQuX3gscj10Ll95LGk9dC5feixvPXQuX29yZGVyLHM9TWF0aC5jb3MsYT1NYXRoLnNpbix1PXMobi8yKSxjPXMoci8yKSxsPXMoaS8yKSxoPWEobi8yKSxmPWEoci8yKSxwPWEoaS8yKTtzd2l0Y2gobyl7Y2FzZSJYWVoiOnRoaXMuX3g9aCpjKmwrdSpmKnAsdGhpcy5feT11KmYqbC1oKmMqcCx0aGlzLl96PXUqYypwK2gqZipsLHRoaXMuX3c9dSpjKmwtaCpmKnA7YnJlYWs7Y2FzZSJZWFoiOnRoaXMuX3g9aCpjKmwrdSpmKnAsdGhpcy5feT11KmYqbC1oKmMqcCx0aGlzLl96PXUqYypwLWgqZipsLHRoaXMuX3c9dSpjKmwraCpmKnA7YnJlYWs7Y2FzZSJaWFkiOnRoaXMuX3g9aCpjKmwtdSpmKnAsdGhpcy5feT11KmYqbCtoKmMqcCx0aGlzLl96PXUqYypwK2gqZipsLHRoaXMuX3c9dSpjKmwtaCpmKnA7YnJlYWs7Y2FzZSJaWVgiOnRoaXMuX3g9aCpjKmwtdSpmKnAsdGhpcy5feT11KmYqbCtoKmMqcCx0aGlzLl96PXUqYypwLWgqZipsLHRoaXMuX3c9dSpjKmwraCpmKnA7YnJlYWs7Y2FzZSJZWlgiOnRoaXMuX3g9aCpjKmwrdSpmKnAsdGhpcy5feT11KmYqbCtoKmMqcCx0aGlzLl96PXUqYypwLWgqZipsLHRoaXMuX3c9dSpjKmwtaCpmKnA7YnJlYWs7Y2FzZSJYWlkiOnRoaXMuX3g9aCpjKmwtdSpmKnAsdGhpcy5feT11KmYqbC1oKmMqcCx0aGlzLl96PXUqYypwK2gqZipsLHRoaXMuX3c9dSpjKmwraCpmKnB9cmV0dXJuITA9PT1lJiZ0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zZXRGcm9tQXhpc0FuZ2xlKHQsZSl7Y29uc3Qgbj1lLzIscj1NYXRoLnNpbihuKTtyZXR1cm4gdGhpcy5feD10Lngqcix0aGlzLl95PXQueSpyLHRoaXMuX3o9dC56KnIsdGhpcy5fdz1NYXRoLmNvcyhuKSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zZXRGcm9tUm90YXRpb25NYXRyaXgodCl7Y29uc3QgZT10LmVsZW1lbnRzLG49ZVswXSxyPWVbNF0saT1lWzhdLG89ZVsxXSxzPWVbNV0sYT1lWzldLHU9ZVsyXSxjPWVbNl0sbD1lWzEwXSxoPW4rcytsO2lmKGg+MCl7Y29uc3QgdD0uNS9NYXRoLnNxcnQoaCsxKTt0aGlzLl93PS4yNS90LHRoaXMuX3g9KGMtYSkqdCx0aGlzLl95PShpLXUpKnQsdGhpcy5fej0oby1yKSp0fWVsc2UgaWYobj5zJiZuPmwpe2NvbnN0IHQ9MipNYXRoLnNxcnQoMStuLXMtbCk7dGhpcy5fdz0oYy1hKS90LHRoaXMuX3g9LjI1KnQsdGhpcy5feT0ocitvKS90LHRoaXMuX3o9KGkrdSkvdH1lbHNlIGlmKHM+bCl7Y29uc3QgdD0yKk1hdGguc3FydCgxK3Mtbi1sKTt0aGlzLl93PShpLXUpL3QsdGhpcy5feD0ocitvKS90LHRoaXMuX3k9LjI1KnQsdGhpcy5fej0oYStjKS90fWVsc2V7Y29uc3QgdD0yKk1hdGguc3FydCgxK2wtbi1zKTt0aGlzLl93PShvLXIpL3QsdGhpcy5feD0oaSt1KS90LHRoaXMuX3k9KGErYykvdCx0aGlzLl96PS4yNSp0fXJldHVybiB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zZXRGcm9tVW5pdFZlY3RvcnModCxlKXtsZXQgbj10LmRvdChlKSsxO3JldHVybiBuPE51bWJlci5FUFNJTE9OPyhuPTAsTWF0aC5hYnModC54KT5NYXRoLmFicyh0LnopPyh0aGlzLl94PS10LnksdGhpcy5feT10LngsdGhpcy5fej0wLHRoaXMuX3c9bik6KHRoaXMuX3g9MCx0aGlzLl95PS10LnosdGhpcy5fej10LnksdGhpcy5fdz1uKSk6KHRoaXMuX3g9dC55KmUuei10LnoqZS55LHRoaXMuX3k9dC56KmUueC10LngqZS56LHRoaXMuX3o9dC54KmUueS10LnkqZS54LHRoaXMuX3c9biksdGhpcy5ub3JtYWxpemUoKX1hbmdsZVRvKHQpe3JldHVybiAyKk1hdGguYWNvcyhNYXRoLmFicyhLbCh0aGlzLmRvdCh0KSwtMSwxKSkpfXJvdGF0ZVRvd2FyZHModCxlKXtjb25zdCBuPXRoaXMuYW5nbGVUbyh0KTtpZigwPT09bilyZXR1cm4gdGhpcztjb25zdCByPU1hdGgubWluKDEsZS9uKTtyZXR1cm4gdGhpcy5zbGVycCh0LHIpLHRoaXN9aWRlbnRpdHkoKXtyZXR1cm4gdGhpcy5zZXQoMCwwLDAsMSl9aW52ZXJ0KCl7cmV0dXJuIHRoaXMuY29uanVnYXRlKCl9Y29uanVnYXRlKCl7cmV0dXJuIHRoaXMuX3gqPS0xLHRoaXMuX3kqPS0xLHRoaXMuX3oqPS0xLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfWRvdCh0KXtyZXR1cm4gdGhpcy5feCp0Ll94K3RoaXMuX3kqdC5feSt0aGlzLl96KnQuX3ordGhpcy5fdyp0Ll93fWxlbmd0aFNxKCl7cmV0dXJuIHRoaXMuX3gqdGhpcy5feCt0aGlzLl95KnRoaXMuX3krdGhpcy5feip0aGlzLl96K3RoaXMuX3cqdGhpcy5fd31sZW5ndGgoKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMuX3gqdGhpcy5feCt0aGlzLl95KnRoaXMuX3krdGhpcy5feip0aGlzLl96K3RoaXMuX3cqdGhpcy5fdyl9bm9ybWFsaXplKCl7bGV0IHQ9dGhpcy5sZW5ndGgoKTtyZXR1cm4gMD09PXQ/KHRoaXMuX3g9MCx0aGlzLl95PTAsdGhpcy5fej0wLHRoaXMuX3c9MSk6KHQ9MS90LHRoaXMuX3g9dGhpcy5feCp0LHRoaXMuX3k9dGhpcy5feSp0LHRoaXMuX3o9dGhpcy5feip0LHRoaXMuX3c9dGhpcy5fdyp0KSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31tdWx0aXBseSh0KXtyZXR1cm4gdGhpcy5tdWx0aXBseVF1YXRlcm5pb25zKHRoaXMsdCl9cHJlbXVsdGlwbHkodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlRdWF0ZXJuaW9ucyh0LHRoaXMpfW11bHRpcGx5UXVhdGVybmlvbnModCxlKXtjb25zdCBuPXQuX3gscj10Ll95LGk9dC5feixvPXQuX3cscz1lLl94LGE9ZS5feSx1PWUuX3osYz1lLl93O3JldHVybiB0aGlzLl94PW4qYytvKnMrcip1LWkqYSx0aGlzLl95PXIqYytvKmEraSpzLW4qdSx0aGlzLl96PWkqYytvKnUrbiphLXIqcyx0aGlzLl93PW8qYy1uKnMtciphLWkqdSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zbGVycCh0LGUpe2lmKDA9PT1lKXJldHVybiB0aGlzO2lmKDE9PT1lKXJldHVybiB0aGlzLmNvcHkodCk7Y29uc3Qgbj10aGlzLl94LHI9dGhpcy5feSxpPXRoaXMuX3osbz10aGlzLl93O2xldCBzPW8qdC5fdytuKnQuX3grcip0Ll95K2kqdC5fejtpZihzPDA/KHRoaXMuX3c9LXQuX3csdGhpcy5feD0tdC5feCx0aGlzLl95PS10Ll95LHRoaXMuX3o9LXQuX3oscz0tcyk6dGhpcy5jb3B5KHQpLHM+PTEpcmV0dXJuIHRoaXMuX3c9byx0aGlzLl94PW4sdGhpcy5feT1yLHRoaXMuX3o9aSx0aGlzO2NvbnN0IGE9MS1zKnM7aWYoYTw9TnVtYmVyLkVQU0lMT04pe2NvbnN0IHQ9MS1lO3JldHVybiB0aGlzLl93PXQqbytlKnRoaXMuX3csdGhpcy5feD10Km4rZSp0aGlzLl94LHRoaXMuX3k9dCpyK2UqdGhpcy5feSx0aGlzLl96PXQqaStlKnRoaXMuX3osdGhpcy5ub3JtYWxpemUoKSx0aGlzfWNvbnN0IHU9TWF0aC5zcXJ0KGEpLGM9TWF0aC5hdGFuMih1LHMpLGw9TWF0aC5zaW4oKDEtZSkqYykvdSxoPU1hdGguc2luKGUqYykvdTtyZXR1cm4gdGhpcy5fdz1vKmwrdGhpcy5fdypoLHRoaXMuX3g9bipsK3RoaXMuX3gqaCx0aGlzLl95PXIqbCt0aGlzLl95KmgsdGhpcy5fej1pKmwrdGhpcy5feipoLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNsZXJwUXVhdGVybmlvbnModCxlLG4pe3JldHVybiB0aGlzLmNvcHkodCkuc2xlcnAoZSxuKX1yYW5kb20oKXtjb25zdCB0PTIqTWF0aC5QSSpNYXRoLnJhbmRvbSgpLGU9MipNYXRoLlBJKk1hdGgucmFuZG9tKCksbj1NYXRoLnJhbmRvbSgpLHI9TWF0aC5zcXJ0KDEtbiksaT1NYXRoLnNxcnQobik7cmV0dXJuIHRoaXMuc2V0KHIqTWF0aC5zaW4odCkscipNYXRoLmNvcyh0KSxpKk1hdGguc2luKGUpLGkqTWF0aC5jb3MoZSkpfWVxdWFscyh0KXtyZXR1cm4gdC5feD09PXRoaXMuX3gmJnQuX3k9PT10aGlzLl95JiZ0Ll96PT09dGhpcy5feiYmdC5fdz09PXRoaXMuX3d9ZnJvbUFycmF5KHQsZT0wKXtyZXR1cm4gdGhpcy5feD10W2VdLHRoaXMuX3k9dFtlKzFdLHRoaXMuX3o9dFtlKzJdLHRoaXMuX3c9dFtlKzNdLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXRvQXJyYXkodD1bXSxlPTApe3JldHVybiB0W2VdPXRoaXMuX3gsdFtlKzFdPXRoaXMuX3ksdFtlKzJdPXRoaXMuX3osdFtlKzNdPXRoaXMuX3csdH1mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSl7cmV0dXJuIHRoaXMuX3g9dC5nZXRYKGUpLHRoaXMuX3k9dC5nZXRZKGUpLHRoaXMuX3o9dC5nZXRaKGUpLHRoaXMuX3c9dC5nZXRXKGUpLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXRvSlNPTigpe3JldHVybiB0aGlzLnRvQXJyYXkoKX1fb25DaGFuZ2UodCl7cmV0dXJuIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2s9dCx0aGlzfV9vbkNoYW5nZUNhbGxiYWNrKCl7fSpbU3ltYm9sLml0ZXJhdG9yXSgpe3lpZWxkIHRoaXMuX3gseWllbGQgdGhpcy5feSx5aWVsZCB0aGlzLl96LHlpZWxkIHRoaXMuX3d9fWNsYXNzIHloe2NvbnN0cnVjdG9yKHQ9MCxlPTAsbj0wKXt5aC5wcm90b3R5cGUuaXNWZWN0b3IzPSEwLHRoaXMueD10LHRoaXMueT1lLHRoaXMuej1ufXNldCh0LGUsbil7cmV0dXJuIHZvaWQgMD09PW4mJihuPXRoaXMueiksdGhpcy54PXQsdGhpcy55PWUsdGhpcy56PW4sdGhpc31zZXRTY2FsYXIodCl7cmV0dXJuIHRoaXMueD10LHRoaXMueT10LHRoaXMuej10LHRoaXN9c2V0WCh0KXtyZXR1cm4gdGhpcy54PXQsdGhpc31zZXRZKHQpe3JldHVybiB0aGlzLnk9dCx0aGlzfXNldFoodCl7cmV0dXJuIHRoaXMuej10LHRoaXN9c2V0Q29tcG9uZW50KHQsZSl7c3dpdGNoKHQpe2Nhc2UgMDp0aGlzLng9ZTticmVhaztjYXNlIDE6dGhpcy55PWU7YnJlYWs7Y2FzZSAyOnRoaXMuej1lO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrdCl9cmV0dXJuIHRoaXN9Z2V0Q29tcG9uZW50KHQpe3N3aXRjaCh0KXtjYXNlIDA6cmV0dXJuIHRoaXMueDtjYXNlIDE6cmV0dXJuIHRoaXMueTtjYXNlIDI6cmV0dXJuIHRoaXMuejtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAiK3QpfX1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLngsdGhpcy55LHRoaXMueil9Y29weSh0KXtyZXR1cm4gdGhpcy54PXQueCx0aGlzLnk9dC55LHRoaXMuej10LnosdGhpc31hZGQodCl7cmV0dXJuIHRoaXMueCs9dC54LHRoaXMueSs9dC55LHRoaXMueis9dC56LHRoaXN9YWRkU2NhbGFyKHQpe3JldHVybiB0aGlzLngrPXQsdGhpcy55Kz10LHRoaXMueis9dCx0aGlzfWFkZFZlY3RvcnModCxlKXtyZXR1cm4gdGhpcy54PXQueCtlLngsdGhpcy55PXQueStlLnksdGhpcy56PXQueitlLnosdGhpc31hZGRTY2FsZWRWZWN0b3IodCxlKXtyZXR1cm4gdGhpcy54Kz10LngqZSx0aGlzLnkrPXQueSplLHRoaXMueis9dC56KmUsdGhpc31zdWIodCl7cmV0dXJuIHRoaXMueC09dC54LHRoaXMueS09dC55LHRoaXMuei09dC56LHRoaXN9c3ViU2NhbGFyKHQpe3JldHVybiB0aGlzLngtPXQsdGhpcy55LT10LHRoaXMuei09dCx0aGlzfXN1YlZlY3RvcnModCxlKXtyZXR1cm4gdGhpcy54PXQueC1lLngsdGhpcy55PXQueS1lLnksdGhpcy56PXQuei1lLnosdGhpc31tdWx0aXBseSh0KXtyZXR1cm4gdGhpcy54Kj10LngsdGhpcy55Kj10LnksdGhpcy56Kj10LnosdGhpc31tdWx0aXBseVNjYWxhcih0KXtyZXR1cm4gdGhpcy54Kj10LHRoaXMueSo9dCx0aGlzLnoqPXQsdGhpc31tdWx0aXBseVZlY3RvcnModCxlKXtyZXR1cm4gdGhpcy54PXQueCplLngsdGhpcy55PXQueSplLnksdGhpcy56PXQueiplLnosdGhpc31hcHBseUV1bGVyKHQpe3JldHVybiB0aGlzLmFwcGx5UXVhdGVybmlvbih2aC5zZXRGcm9tRXVsZXIodCkpfWFwcGx5QXhpc0FuZ2xlKHQsZSl7cmV0dXJuIHRoaXMuYXBwbHlRdWF0ZXJuaW9uKHZoLnNldEZyb21BeGlzQW5nbGUodCxlKSl9YXBwbHlNYXRyaXgzKHQpe2NvbnN0IGU9dGhpcy54LG49dGhpcy55LHI9dGhpcy56LGk9dC5lbGVtZW50cztyZXR1cm4gdGhpcy54PWlbMF0qZStpWzNdKm4raVs2XSpyLHRoaXMueT1pWzFdKmUraVs0XSpuK2lbN10qcix0aGlzLno9aVsyXSplK2lbNV0qbitpWzhdKnIsdGhpc31hcHBseU5vcm1hbE1hdHJpeCh0KXtyZXR1cm4gdGhpcy5hcHBseU1hdHJpeDModCkubm9ybWFsaXplKCl9YXBwbHlNYXRyaXg0KHQpe2NvbnN0IGU9dGhpcy54LG49dGhpcy55LHI9dGhpcy56LGk9dC5lbGVtZW50cyxvPTEvKGlbM10qZStpWzddKm4raVsxMV0qcitpWzE1XSk7cmV0dXJuIHRoaXMueD0oaVswXSplK2lbNF0qbitpWzhdKnIraVsxMl0pKm8sdGhpcy55PShpWzFdKmUraVs1XSpuK2lbOV0qcitpWzEzXSkqbyx0aGlzLno9KGlbMl0qZStpWzZdKm4raVsxMF0qcitpWzE0XSkqbyx0aGlzfWFwcGx5UXVhdGVybmlvbih0KXtjb25zdCBlPXRoaXMueCxuPXRoaXMueSxyPXRoaXMueixpPXQueCxvPXQueSxzPXQueixhPXQudyx1PTIqKG8qci1zKm4pLGM9MioocyplLWkqciksbD0yKihpKm4tbyplKTtyZXR1cm4gdGhpcy54PWUrYSp1K28qbC1zKmMsdGhpcy55PW4rYSpjK3MqdS1pKmwsdGhpcy56PXIrYSpsK2kqYy1vKnUsdGhpc31wcm9qZWN0KHQpe3JldHVybiB0aGlzLmFwcGx5TWF0cml4NCh0Lm1hdHJpeFdvcmxkSW52ZXJzZSkuYXBwbHlNYXRyaXg0KHQucHJvamVjdGlvbk1hdHJpeCl9dW5wcm9qZWN0KHQpe3JldHVybiB0aGlzLmFwcGx5TWF0cml4NCh0LnByb2plY3Rpb25NYXRyaXhJbnZlcnNlKS5hcHBseU1hdHJpeDQodC5tYXRyaXhXb3JsZCl9dHJhbnNmb3JtRGlyZWN0aW9uKHQpe2NvbnN0IGU9dGhpcy54LG49dGhpcy55LHI9dGhpcy56LGk9dC5lbGVtZW50cztyZXR1cm4gdGhpcy54PWlbMF0qZStpWzRdKm4raVs4XSpyLHRoaXMueT1pWzFdKmUraVs1XSpuK2lbOV0qcix0aGlzLno9aVsyXSplK2lbNl0qbitpWzEwXSpyLHRoaXMubm9ybWFsaXplKCl9ZGl2aWRlKHQpe3JldHVybiB0aGlzLngvPXQueCx0aGlzLnkvPXQueSx0aGlzLnovPXQueix0aGlzfWRpdmlkZVNjYWxhcih0KXtyZXR1cm4gdGhpcy5tdWx0aXBseVNjYWxhcigxL3QpfW1pbih0KXtyZXR1cm4gdGhpcy54PU1hdGgubWluKHRoaXMueCx0LngpLHRoaXMueT1NYXRoLm1pbih0aGlzLnksdC55KSx0aGlzLno9TWF0aC5taW4odGhpcy56LHQueiksdGhpc31tYXgodCl7cmV0dXJuIHRoaXMueD1NYXRoLm1heCh0aGlzLngsdC54KSx0aGlzLnk9TWF0aC5tYXgodGhpcy55LHQueSksdGhpcy56PU1hdGgubWF4KHRoaXMueix0LnopLHRoaXN9Y2xhbXAodCxlKXtyZXR1cm4gdGhpcy54PUtsKHRoaXMueCx0LngsZS54KSx0aGlzLnk9S2wodGhpcy55LHQueSxlLnkpLHRoaXMuej1LbCh0aGlzLnosdC56LGUueiksdGhpc31jbGFtcFNjYWxhcih0LGUpe3JldHVybiB0aGlzLng9S2wodGhpcy54LHQsZSksdGhpcy55PUtsKHRoaXMueSx0LGUpLHRoaXMuej1LbCh0aGlzLnosdCxlKSx0aGlzfWNsYW1wTGVuZ3RoKHQsZSl7Y29uc3Qgbj10aGlzLmxlbmd0aCgpO3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcihufHwxKS5tdWx0aXBseVNjYWxhcihLbChuLHQsZSkpfWZsb29yKCl7cmV0dXJuIHRoaXMueD1NYXRoLmZsb29yKHRoaXMueCksdGhpcy55PU1hdGguZmxvb3IodGhpcy55KSx0aGlzLno9TWF0aC5mbG9vcih0aGlzLnopLHRoaXN9Y2VpbCgpe3JldHVybiB0aGlzLng9TWF0aC5jZWlsKHRoaXMueCksdGhpcy55PU1hdGguY2VpbCh0aGlzLnkpLHRoaXMuej1NYXRoLmNlaWwodGhpcy56KSx0aGlzfXJvdW5kKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJvdW5kKHRoaXMueCksdGhpcy55PU1hdGgucm91bmQodGhpcy55KSx0aGlzLno9TWF0aC5yb3VuZCh0aGlzLnopLHRoaXN9cm91bmRUb1plcm8oKXtyZXR1cm4gdGhpcy54PU1hdGgudHJ1bmModGhpcy54KSx0aGlzLnk9TWF0aC50cnVuYyh0aGlzLnkpLHRoaXMuej1NYXRoLnRydW5jKHRoaXMueiksdGhpc31uZWdhdGUoKXtyZXR1cm4gdGhpcy54PS10aGlzLngsdGhpcy55PS10aGlzLnksdGhpcy56PS10aGlzLnosdGhpc31kb3QodCl7cmV0dXJuIHRoaXMueCp0LngrdGhpcy55KnQueSt0aGlzLnoqdC56fWxlbmd0aFNxKCl7cmV0dXJuIHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSt0aGlzLnoqdGhpcy56fWxlbmd0aCgpe3JldHVybiBNYXRoLnNxcnQodGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55K3RoaXMueip0aGlzLnopfW1hbmhhdHRhbkxlbmd0aCgpe3JldHVybiBNYXRoLmFicyh0aGlzLngpK01hdGguYWJzKHRoaXMueSkrTWF0aC5hYnModGhpcy56KX1ub3JtYWxpemUoKXtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIodGhpcy5sZW5ndGgoKXx8MSl9c2V0TGVuZ3RoKHQpe3JldHVybiB0aGlzLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKHQpfWxlcnAodCxlKXtyZXR1cm4gdGhpcy54Kz0odC54LXRoaXMueCkqZSx0aGlzLnkrPSh0LnktdGhpcy55KSplLHRoaXMueis9KHQuei10aGlzLnopKmUsdGhpc31sZXJwVmVjdG9ycyh0LGUsbil7cmV0dXJuIHRoaXMueD10LngrKGUueC10LngpKm4sdGhpcy55PXQueSsoZS55LXQueSkqbix0aGlzLno9dC56KyhlLnotdC56KSpuLHRoaXN9Y3Jvc3ModCl7cmV0dXJuIHRoaXMuY3Jvc3NWZWN0b3JzKHRoaXMsdCl9Y3Jvc3NWZWN0b3JzKHQsZSl7Y29uc3Qgbj10Lngscj10LnksaT10Lnosbz1lLngscz1lLnksYT1lLno7cmV0dXJuIHRoaXMueD1yKmEtaSpzLHRoaXMueT1pKm8tbiphLHRoaXMuej1uKnMtcipvLHRoaXN9cHJvamVjdE9uVmVjdG9yKHQpe2NvbnN0IGU9dC5sZW5ndGhTcSgpO2lmKDA9PT1lKXJldHVybiB0aGlzLnNldCgwLDAsMCk7Y29uc3Qgbj10LmRvdCh0aGlzKS9lO3JldHVybiB0aGlzLmNvcHkodCkubXVsdGlwbHlTY2FsYXIobil9cHJvamVjdE9uUGxhbmUodCl7cmV0dXJuIG1oLmNvcHkodGhpcykucHJvamVjdE9uVmVjdG9yKHQpLHRoaXMuc3ViKG1oKX1yZWZsZWN0KHQpe3JldHVybiB0aGlzLnN1YihtaC5jb3B5KHQpLm11bHRpcGx5U2NhbGFyKDIqdGhpcy5kb3QodCkpKX1hbmdsZVRvKHQpe2NvbnN0IGU9TWF0aC5zcXJ0KHRoaXMubGVuZ3RoU3EoKSp0Lmxlbmd0aFNxKCkpO2lmKDA9PT1lKXJldHVybiBNYXRoLlBJLzI7Y29uc3Qgbj10aGlzLmRvdCh0KS9lO3JldHVybiBNYXRoLmFjb3MoS2wobiwtMSwxKSl9ZGlzdGFuY2VUbyh0KXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMuZGlzdGFuY2VUb1NxdWFyZWQodCkpfWRpc3RhbmNlVG9TcXVhcmVkKHQpe2NvbnN0IGU9dGhpcy54LXQueCxuPXRoaXMueS10Lnkscj10aGlzLnotdC56O3JldHVybiBlKmUrbipuK3Iqcn1tYW5oYXR0YW5EaXN0YW5jZVRvKHQpe3JldHVybiBNYXRoLmFicyh0aGlzLngtdC54KStNYXRoLmFicyh0aGlzLnktdC55KStNYXRoLmFicyh0aGlzLnotdC56KX1zZXRGcm9tU3BoZXJpY2FsKHQpe3JldHVybiB0aGlzLnNldEZyb21TcGhlcmljYWxDb29yZHModC5yYWRpdXMsdC5waGksdC50aGV0YSl9c2V0RnJvbVNwaGVyaWNhbENvb3Jkcyh0LGUsbil7Y29uc3Qgcj1NYXRoLnNpbihlKSp0O3JldHVybiB0aGlzLng9cipNYXRoLnNpbihuKSx0aGlzLnk9TWF0aC5jb3MoZSkqdCx0aGlzLno9cipNYXRoLmNvcyhuKSx0aGlzfXNldEZyb21DeWxpbmRyaWNhbCh0KXtyZXR1cm4gdGhpcy5zZXRGcm9tQ3lsaW5kcmljYWxDb29yZHModC5yYWRpdXMsdC50aGV0YSx0LnkpfXNldEZyb21DeWxpbmRyaWNhbENvb3Jkcyh0LGUsbil7cmV0dXJuIHRoaXMueD10Kk1hdGguc2luKGUpLHRoaXMueT1uLHRoaXMuej10Kk1hdGguY29zKGUpLHRoaXN9c2V0RnJvbU1hdHJpeFBvc2l0aW9uKHQpe2NvbnN0IGU9dC5lbGVtZW50cztyZXR1cm4gdGhpcy54PWVbMTJdLHRoaXMueT1lWzEzXSx0aGlzLno9ZVsxNF0sdGhpc31zZXRGcm9tTWF0cml4U2NhbGUodCl7Y29uc3QgZT10aGlzLnNldEZyb21NYXRyaXhDb2x1bW4odCwwKS5sZW5ndGgoKSxuPXRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbih0LDEpLmxlbmd0aCgpLHI9dGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKHQsMikubGVuZ3RoKCk7cmV0dXJuIHRoaXMueD1lLHRoaXMueT1uLHRoaXMuej1yLHRoaXN9c2V0RnJvbU1hdHJpeENvbHVtbih0LGUpe3JldHVybiB0aGlzLmZyb21BcnJheSh0LmVsZW1lbnRzLDQqZSl9c2V0RnJvbU1hdHJpeDNDb2x1bW4odCxlKXtyZXR1cm4gdGhpcy5mcm9tQXJyYXkodC5lbGVtZW50cywzKmUpfXNldEZyb21FdWxlcih0KXtyZXR1cm4gdGhpcy54PXQuX3gsdGhpcy55PXQuX3ksdGhpcy56PXQuX3osdGhpc31zZXRGcm9tQ29sb3IodCl7cmV0dXJuIHRoaXMueD10LnIsdGhpcy55PXQuZyx0aGlzLno9dC5iLHRoaXN9ZXF1YWxzKHQpe3JldHVybiB0Lng9PT10aGlzLngmJnQueT09PXRoaXMueSYmdC56PT09dGhpcy56fWZyb21BcnJheSh0LGU9MCl7cmV0dXJuIHRoaXMueD10W2VdLHRoaXMueT10W2UrMV0sdGhpcy56PXRbZSsyXSx0aGlzfXRvQXJyYXkodD1bXSxlPTApe3JldHVybiB0W2VdPXRoaXMueCx0W2UrMV09dGhpcy55LHRbZSsyXT10aGlzLnosdH1mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSl7cmV0dXJuIHRoaXMueD10LmdldFgoZSksdGhpcy55PXQuZ2V0WShlKSx0aGlzLno9dC5nZXRaKGUpLHRoaXN9cmFuZG9tKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJhbmRvbSgpLHRoaXMueT1NYXRoLnJhbmRvbSgpLHRoaXMuej1NYXRoLnJhbmRvbSgpLHRoaXN9cmFuZG9tRGlyZWN0aW9uKCl7Y29uc3QgdD1NYXRoLnJhbmRvbSgpKk1hdGguUEkqMixlPTIqTWF0aC5yYW5kb20oKS0xLG49TWF0aC5zcXJ0KDEtZSplKTtyZXR1cm4gdGhpcy54PW4qTWF0aC5jb3ModCksdGhpcy55PWUsdGhpcy56PW4qTWF0aC5zaW4odCksdGhpc30qW1N5bWJvbC5pdGVyYXRvcl0oKXt5aWVsZCB0aGlzLngseWllbGQgdGhpcy55LHlpZWxkIHRoaXMuen19Y29uc3QgbWg9bmV3IHloLHZoPW5ldyBnaDtjbGFzcyBfaHtjb25zdHJ1Y3Rvcih0PW5ldyB5aCgxLzAsMS8wLDEvMCksZT1uZXcgeWgoLTEvMCwtMS8wLC0xLzApKXt0aGlzLmlzQm94Mz0hMCx0aGlzLm1pbj10LHRoaXMubWF4PWV9c2V0KHQsZSl7cmV0dXJuIHRoaXMubWluLmNvcHkodCksdGhpcy5tYXguY29weShlKSx0aGlzfXNldEZyb21BcnJheSh0KXt0aGlzLm1ha2VFbXB0eSgpO2ZvcihsZXQgZT0wLG49dC5sZW5ndGg7ZTxuO2UrPTMpdGhpcy5leHBhbmRCeVBvaW50KHdoLmZyb21BcnJheSh0LGUpKTtyZXR1cm4gdGhpc31zZXRGcm9tQnVmZmVyQXR0cmlidXRlKHQpe3RoaXMubWFrZUVtcHR5KCk7Zm9yKGxldCBlPTAsbj10LmNvdW50O2U8bjtlKyspdGhpcy5leHBhbmRCeVBvaW50KHdoLmZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKSk7cmV0dXJuIHRoaXN9c2V0RnJvbVBvaW50cyh0KXt0aGlzLm1ha2VFbXB0eSgpO2ZvcihsZXQgZT0wLG49dC5sZW5ndGg7ZTxuO2UrKyl0aGlzLmV4cGFuZEJ5UG9pbnQodFtlXSk7cmV0dXJuIHRoaXN9c2V0RnJvbUNlbnRlckFuZFNpemUodCxlKXtjb25zdCBuPXdoLmNvcHkoZSkubXVsdGlwbHlTY2FsYXIoLjUpO3JldHVybiB0aGlzLm1pbi5jb3B5KHQpLnN1YihuKSx0aGlzLm1heC5jb3B5KHQpLmFkZChuKSx0aGlzfXNldEZyb21PYmplY3QodCxlPSExKXtyZXR1cm4gdGhpcy5tYWtlRW1wdHkoKSx0aGlzLmV4cGFuZEJ5T2JqZWN0KHQsZSl9Y2xvbmUoKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9Y29weSh0KXtyZXR1cm4gdGhpcy5taW4uY29weSh0Lm1pbiksdGhpcy5tYXguY29weSh0Lm1heCksdGhpc31tYWtlRW1wdHkoKXtyZXR1cm4gdGhpcy5taW4ueD10aGlzLm1pbi55PXRoaXMubWluLno9MS8wLHRoaXMubWF4Lng9dGhpcy5tYXgueT10aGlzLm1heC56PS0xLzAsdGhpc31pc0VtcHR5KCl7cmV0dXJuIHRoaXMubWF4Lng8dGhpcy5taW4ueHx8dGhpcy5tYXgueTx0aGlzLm1pbi55fHx0aGlzLm1heC56PHRoaXMubWluLnp9Z2V0Q2VudGVyKHQpe3JldHVybiB0aGlzLmlzRW1wdHkoKT90LnNldCgwLDAsMCk6dC5hZGRWZWN0b3JzKHRoaXMubWluLHRoaXMubWF4KS5tdWx0aXBseVNjYWxhciguNSl9Z2V0U2l6ZSh0KXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/dC5zZXQoMCwwLDApOnQuc3ViVmVjdG9ycyh0aGlzLm1heCx0aGlzLm1pbil9ZXhwYW5kQnlQb2ludCh0KXtyZXR1cm4gdGhpcy5taW4ubWluKHQpLHRoaXMubWF4Lm1heCh0KSx0aGlzfWV4cGFuZEJ5VmVjdG9yKHQpe3JldHVybiB0aGlzLm1pbi5zdWIodCksdGhpcy5tYXguYWRkKHQpLHRoaXN9ZXhwYW5kQnlTY2FsYXIodCl7cmV0dXJuIHRoaXMubWluLmFkZFNjYWxhcigtdCksdGhpcy5tYXguYWRkU2NhbGFyKHQpLHRoaXN9ZXhwYW5kQnlPYmplY3QodCxlPSExKXt0LnVwZGF0ZVdvcmxkTWF0cml4KCExLCExKTtjb25zdCBuPXQuZ2VvbWV0cnk7aWYodm9pZCAwIT09bil7Y29uc3Qgcj1uLmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKTtpZighMD09PWUmJnZvaWQgMCE9PXImJiEwIT09dC5pc0luc3RhbmNlZE1lc2gpZm9yKGxldCBlPTAsbj1yLmNvdW50O2U8bjtlKyspITA9PT10LmlzTWVzaD90LmdldFZlcnRleFBvc2l0aW9uKGUsd2gpOndoLmZyb21CdWZmZXJBdHRyaWJ1dGUocixlKSx3aC5hcHBseU1hdHJpeDQodC5tYXRyaXhXb3JsZCksdGhpcy5leHBhbmRCeVBvaW50KHdoKTtlbHNlIHZvaWQgMCE9PXQuYm91bmRpbmdCb3g/KG51bGw9PT10LmJvdW5kaW5nQm94JiZ0LmNvbXB1dGVCb3VuZGluZ0JveCgpLGJoLmNvcHkodC5ib3VuZGluZ0JveCkpOihudWxsPT09bi5ib3VuZGluZ0JveCYmbi5jb21wdXRlQm91bmRpbmdCb3goKSxiaC5jb3B5KG4uYm91bmRpbmdCb3gpKSxiaC5hcHBseU1hdHJpeDQodC5tYXRyaXhXb3JsZCksdGhpcy51bmlvbihiaCl9Y29uc3Qgcj10LmNoaWxkcmVuO2ZvcihsZXQgdD0wLG49ci5sZW5ndGg7dDxuO3QrKyl0aGlzLmV4cGFuZEJ5T2JqZWN0KHJbdF0sZSk7cmV0dXJuIHRoaXN9Y29udGFpbnNQb2ludCh0KXtyZXR1cm4gdC54Pj10aGlzLm1pbi54JiZ0Lng8PXRoaXMubWF4LngmJnQueT49dGhpcy5taW4ueSYmdC55PD10aGlzLm1heC55JiZ0Lno+PXRoaXMubWluLnomJnQuejw9dGhpcy5tYXguen1jb250YWluc0JveCh0KXtyZXR1cm4gdGhpcy5taW4ueDw9dC5taW4ueCYmdC5tYXgueDw9dGhpcy5tYXgueCYmdGhpcy5taW4ueTw9dC5taW4ueSYmdC5tYXgueTw9dGhpcy5tYXgueSYmdGhpcy5taW4uejw9dC5taW4ueiYmdC5tYXguejw9dGhpcy5tYXguen1nZXRQYXJhbWV0ZXIodCxlKXtyZXR1cm4gZS5zZXQoKHQueC10aGlzLm1pbi54KS8odGhpcy5tYXgueC10aGlzLm1pbi54KSwodC55LXRoaXMubWluLnkpLyh0aGlzLm1heC55LXRoaXMubWluLnkpLCh0LnotdGhpcy5taW4ueikvKHRoaXMubWF4LnotdGhpcy5taW4ueikpfWludGVyc2VjdHNCb3godCl7cmV0dXJuIHQubWF4Lng+PXRoaXMubWluLngmJnQubWluLng8PXRoaXMubWF4LngmJnQubWF4Lnk+PXRoaXMubWluLnkmJnQubWluLnk8PXRoaXMubWF4LnkmJnQubWF4Lno+PXRoaXMubWluLnomJnQubWluLno8PXRoaXMubWF4Lnp9aW50ZXJzZWN0c1NwaGVyZSh0KXtyZXR1cm4gdGhpcy5jbGFtcFBvaW50KHQuY2VudGVyLHdoKSx3aC5kaXN0YW5jZVRvU3F1YXJlZCh0LmNlbnRlcik8PXQucmFkaXVzKnQucmFkaXVzfWludGVyc2VjdHNQbGFuZSh0KXtsZXQgZSxuO3JldHVybiB0Lm5vcm1hbC54PjA/KGU9dC5ub3JtYWwueCp0aGlzLm1pbi54LG49dC5ub3JtYWwueCp0aGlzLm1heC54KTooZT10Lm5vcm1hbC54KnRoaXMubWF4Lngsbj10Lm5vcm1hbC54KnRoaXMubWluLngpLHQubm9ybWFsLnk+MD8oZSs9dC5ub3JtYWwueSp0aGlzLm1pbi55LG4rPXQubm9ybWFsLnkqdGhpcy5tYXgueSk6KGUrPXQubm9ybWFsLnkqdGhpcy5tYXgueSxuKz10Lm5vcm1hbC55KnRoaXMubWluLnkpLHQubm9ybWFsLno+MD8oZSs9dC5ub3JtYWwueip0aGlzLm1pbi56LG4rPXQubm9ybWFsLnoqdGhpcy5tYXgueik6KGUrPXQubm9ybWFsLnoqdGhpcy5tYXgueixuKz10Lm5vcm1hbC56KnRoaXMubWluLnopLGU8PS10LmNvbnN0YW50JiZuPj0tdC5jb25zdGFudH1pbnRlcnNlY3RzVHJpYW5nbGUodCl7aWYodGhpcy5pc0VtcHR5KCkpcmV0dXJuITE7dGhpcy5nZXRDZW50ZXIoSWgpLE1oLnN1YlZlY3RvcnModGhpcy5tYXgsSWgpLERoLnN1YlZlY3RvcnModC5hLEloKSxFaC5zdWJWZWN0b3JzKHQuYixJaCksQ2guc3ViVmVjdG9ycyh0LmMsSWgpLFNoLnN1YlZlY3RvcnMoRWgsRGgpLEFoLnN1YlZlY3RvcnMoQ2gsRWgpLE5oLnN1YlZlY3RvcnMoRGgsQ2gpO2xldCBlPVswLC1TaC56LFNoLnksMCwtQWgueixBaC55LDAsLU5oLnosTmgueSxTaC56LDAsLVNoLngsQWgueiwwLC1BaC54LE5oLnosMCwtTmgueCwtU2gueSxTaC54LDAsLUFoLnksQWgueCwwLC1OaC55LE5oLngsMF07cmV0dXJuISghT2goZSxEaCxFaCxDaCxNaCl8fChlPVsxLDAsMCwwLDEsMCwwLDAsMV0sIU9oKGUsRGgsRWgsQ2gsTWgpKSkmJihGaC5jcm9zc1ZlY3RvcnMoU2gsQWgpLGU9W0ZoLngsRmgueSxGaC56XSxPaChlLERoLEVoLENoLE1oKSl9Y2xhbXBQb2ludCh0LGUpe3JldHVybiBlLmNvcHkodCkuY2xhbXAodGhpcy5taW4sdGhpcy5tYXgpfWRpc3RhbmNlVG9Qb2ludCh0KXtyZXR1cm4gdGhpcy5jbGFtcFBvaW50KHQsd2gpLmRpc3RhbmNlVG8odCl9Z2V0Qm91bmRpbmdTcGhlcmUodCl7cmV0dXJuIHRoaXMuaXNFbXB0eSgpP3QubWFrZUVtcHR5KCk6KHRoaXMuZ2V0Q2VudGVyKHQuY2VudGVyKSx0LnJhZGl1cz0uNSp0aGlzLmdldFNpemUod2gpLmxlbmd0aCgpKSx0fWludGVyc2VjdCh0KXtyZXR1cm4gdGhpcy5taW4ubWF4KHQubWluKSx0aGlzLm1heC5taW4odC5tYXgpLHRoaXMuaXNFbXB0eSgpJiZ0aGlzLm1ha2VFbXB0eSgpLHRoaXN9dW5pb24odCl7cmV0dXJuIHRoaXMubWluLm1pbih0Lm1pbiksdGhpcy5tYXgubWF4KHQubWF4KSx0aGlzfWFwcGx5TWF0cml4NCh0KXtyZXR1cm4gdGhpcy5pc0VtcHR5KCl8fCh4aFswXS5zZXQodGhpcy5taW4ueCx0aGlzLm1pbi55LHRoaXMubWluLnopLmFwcGx5TWF0cml4NCh0KSx4aFsxXS5zZXQodGhpcy5taW4ueCx0aGlzLm1pbi55LHRoaXMubWF4LnopLmFwcGx5TWF0cml4NCh0KSx4aFsyXS5zZXQodGhpcy5taW4ueCx0aGlzLm1heC55LHRoaXMubWluLnopLmFwcGx5TWF0cml4NCh0KSx4aFszXS5zZXQodGhpcy5taW4ueCx0aGlzLm1heC55LHRoaXMubWF4LnopLmFwcGx5TWF0cml4NCh0KSx4aFs0XS5zZXQodGhpcy5tYXgueCx0aGlzLm1pbi55LHRoaXMubWluLnopLmFwcGx5TWF0cml4NCh0KSx4aFs1XS5zZXQodGhpcy5tYXgueCx0aGlzLm1pbi55LHRoaXMubWF4LnopLmFwcGx5TWF0cml4NCh0KSx4aFs2XS5zZXQodGhpcy5tYXgueCx0aGlzLm1heC55LHRoaXMubWluLnopLmFwcGx5TWF0cml4NCh0KSx4aFs3XS5zZXQodGhpcy5tYXgueCx0aGlzLm1heC55LHRoaXMubWF4LnopLmFwcGx5TWF0cml4NCh0KSx0aGlzLnNldEZyb21Qb2ludHMoeGgpKSx0aGlzfXRyYW5zbGF0ZSh0KXtyZXR1cm4gdGhpcy5taW4uYWRkKHQpLHRoaXMubWF4LmFkZCh0KSx0aGlzfWVxdWFscyh0KXtyZXR1cm4gdC5taW4uZXF1YWxzKHRoaXMubWluKSYmdC5tYXguZXF1YWxzKHRoaXMubWF4KX19Y29uc3QgeGg9W25ldyB5aCxuZXcgeWgsbmV3IHloLG5ldyB5aCxuZXcgeWgsbmV3IHloLG5ldyB5aCxuZXcgeWhdLHdoPW5ldyB5aCxiaD1uZXcgX2gsRGg9bmV3IHloLEVoPW5ldyB5aCxDaD1uZXcgeWgsU2g9bmV3IHloLEFoPW5ldyB5aCxOaD1uZXcgeWgsSWg9bmV3IHloLE1oPW5ldyB5aCxGaD1uZXcgeWgsVGg9bmV3IHloO2Z1bmN0aW9uIE9oKHQsZSxuLHIsaSl7Zm9yKGxldCBvPTAscz10Lmxlbmd0aC0zO288PXM7bys9Myl7VGguZnJvbUFycmF5KHQsbyk7Y29uc3Qgcz1pLngqTWF0aC5hYnMoVGgueCkraS55Kk1hdGguYWJzKFRoLnkpK2kueipNYXRoLmFicyhUaC56KSxhPWUuZG90KFRoKSx1PW4uZG90KFRoKSxjPXIuZG90KFRoKTtpZihNYXRoLm1heCgtTWF0aC5tYXgoYSx1LGMpLE1hdGgubWluKGEsdSxjKSk+cylyZXR1cm4hMX1yZXR1cm4hMH1jb25zdCBMaD1uZXcgX2gsUGg9bmV3IHloLFJoPW5ldyB5aDtjbGFzcyBCaHtjb25zdHJ1Y3Rvcih0PW5ldyB5aCxlPS0xKXt0aGlzLmlzU3BoZXJlPSEwLHRoaXMuY2VudGVyPXQsdGhpcy5yYWRpdXM9ZX1zZXQodCxlKXtyZXR1cm4gdGhpcy5jZW50ZXIuY29weSh0KSx0aGlzLnJhZGl1cz1lLHRoaXN9c2V0RnJvbVBvaW50cyh0LGUpe2NvbnN0IG49dGhpcy5jZW50ZXI7dm9pZCAwIT09ZT9uLmNvcHkoZSk6TGguc2V0RnJvbVBvaW50cyh0KS5nZXRDZW50ZXIobik7bGV0IHI9MDtmb3IobGV0IGU9MCxpPXQubGVuZ3RoO2U8aTtlKyspcj1NYXRoLm1heChyLG4uZGlzdGFuY2VUb1NxdWFyZWQodFtlXSkpO3JldHVybiB0aGlzLnJhZGl1cz1NYXRoLnNxcnQociksdGhpc31jb3B5KHQpe3JldHVybiB0aGlzLmNlbnRlci5jb3B5KHQuY2VudGVyKSx0aGlzLnJhZGl1cz10LnJhZGl1cyx0aGlzfWlzRW1wdHkoKXtyZXR1cm4gdGhpcy5yYWRpdXM8MH1tYWtlRW1wdHkoKXtyZXR1cm4gdGhpcy5jZW50ZXIuc2V0KDAsMCwwKSx0aGlzLnJhZGl1cz0tMSx0aGlzfWNvbnRhaW5zUG9pbnQodCl7cmV0dXJuIHQuZGlzdGFuY2VUb1NxdWFyZWQodGhpcy5jZW50ZXIpPD10aGlzLnJhZGl1cyp0aGlzLnJhZGl1c31kaXN0YW5jZVRvUG9pbnQodCl7cmV0dXJuIHQuZGlzdGFuY2VUbyh0aGlzLmNlbnRlciktdGhpcy5yYWRpdXN9aW50ZXJzZWN0c1NwaGVyZSh0KXtjb25zdCBlPXRoaXMucmFkaXVzK3QucmFkaXVzO3JldHVybiB0LmNlbnRlci5kaXN0YW5jZVRvU3F1YXJlZCh0aGlzLmNlbnRlcik8PWUqZX1pbnRlcnNlY3RzQm94KHQpe3JldHVybiB0LmludGVyc2VjdHNTcGhlcmUodGhpcyl9aW50ZXJzZWN0c1BsYW5lKHQpe3JldHVybiBNYXRoLmFicyh0LmRpc3RhbmNlVG9Qb2ludCh0aGlzLmNlbnRlcikpPD10aGlzLnJhZGl1c31jbGFtcFBvaW50KHQsZSl7Y29uc3Qgbj10aGlzLmNlbnRlci5kaXN0YW5jZVRvU3F1YXJlZCh0KTtyZXR1cm4gZS5jb3B5KHQpLG4+dGhpcy5yYWRpdXMqdGhpcy5yYWRpdXMmJihlLnN1Yih0aGlzLmNlbnRlcikubm9ybWFsaXplKCksZS5tdWx0aXBseVNjYWxhcih0aGlzLnJhZGl1cykuYWRkKHRoaXMuY2VudGVyKSksZX1nZXRCb3VuZGluZ0JveCh0KXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/KHQubWFrZUVtcHR5KCksdCk6KHQuc2V0KHRoaXMuY2VudGVyLHRoaXMuY2VudGVyKSx0LmV4cGFuZEJ5U2NhbGFyKHRoaXMucmFkaXVzKSx0KX1hcHBseU1hdHJpeDQodCl7cmV0dXJuIHRoaXMuY2VudGVyLmFwcGx5TWF0cml4NCh0KSx0aGlzLnJhZGl1cz10aGlzLnJhZGl1cyp0LmdldE1heFNjYWxlT25BeGlzKCksdGhpc310cmFuc2xhdGUodCl7cmV0dXJuIHRoaXMuY2VudGVyLmFkZCh0KSx0aGlzfWV4cGFuZEJ5UG9pbnQodCl7aWYodGhpcy5pc0VtcHR5KCkpcmV0dXJuIHRoaXMuY2VudGVyLmNvcHkodCksdGhpcy5yYWRpdXM9MCx0aGlzO1BoLnN1YlZlY3RvcnModCx0aGlzLmNlbnRlcik7Y29uc3QgZT1QaC5sZW5ndGhTcSgpO2lmKGU+dGhpcy5yYWRpdXMqdGhpcy5yYWRpdXMpe2NvbnN0IHQ9TWF0aC5zcXJ0KGUpLG49LjUqKHQtdGhpcy5yYWRpdXMpO3RoaXMuY2VudGVyLmFkZFNjYWxlZFZlY3RvcihQaCxuL3QpLHRoaXMucmFkaXVzKz1ufXJldHVybiB0aGlzfXVuaW9uKHQpe3JldHVybiB0LmlzRW1wdHkoKT90aGlzOnRoaXMuaXNFbXB0eSgpPyh0aGlzLmNvcHkodCksdGhpcyk6KCEwPT09dGhpcy5jZW50ZXIuZXF1YWxzKHQuY2VudGVyKT90aGlzLnJhZGl1cz1NYXRoLm1heCh0aGlzLnJhZGl1cyx0LnJhZGl1cyk6KFJoLnN1YlZlY3RvcnModC5jZW50ZXIsdGhpcy5jZW50ZXIpLnNldExlbmd0aCh0LnJhZGl1cyksdGhpcy5leHBhbmRCeVBvaW50KFBoLmNvcHkodC5jZW50ZXIpLmFkZChSaCkpLHRoaXMuZXhwYW5kQnlQb2ludChQaC5jb3B5KHQuY2VudGVyKS5zdWIoUmgpKSksdGhpcyl9ZXF1YWxzKHQpe3JldHVybiB0LmNlbnRlci5lcXVhbHModGhpcy5jZW50ZXIpJiZ0LnJhZGl1cz09PXRoaXMucmFkaXVzfWNsb25lKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfX1jb25zdCBraD1uZXcgeWgsemg9bmV3IHloLGpoPW5ldyB5aCxVaD1uZXcgeWgscWg9bmV3IHloLFZoPW5ldyB5aCxHaD1uZXcgeWg7Y2xhc3MgWWh7Y29uc3RydWN0b3IodCxlLG4scixpLG8scyxhLHUsYyxsLGgsZixwLGQsZyl7WWgucHJvdG90eXBlLmlzTWF0cml4ND0hMCx0aGlzLmVsZW1lbnRzPVsxLDAsMCwwLDAsMSwwLDAsMCwwLDEsMCwwLDAsMCwxXSx2b2lkIDAhPT10JiZ0aGlzLnNldCh0LGUsbixyLGksbyxzLGEsdSxjLGwsaCxmLHAsZCxnKX1zZXQodCxlLG4scixpLG8scyxhLHUsYyxsLGgsZixwLGQsZyl7Y29uc3QgeT10aGlzLmVsZW1lbnRzO3JldHVybiB5WzBdPXQseVs0XT1lLHlbOF09bix5WzEyXT1yLHlbMV09aSx5WzVdPW8seVs5XT1zLHlbMTNdPWEseVsyXT11LHlbNl09Yyx5WzEwXT1sLHlbMTRdPWgseVszXT1mLHlbN109cCx5WzExXT1kLHlbMTVdPWcsdGhpc31pZGVudGl0eSgpe3JldHVybiB0aGlzLnNldCgxLDAsMCwwLDAsMSwwLDAsMCwwLDEsMCwwLDAsMCwxKSx0aGlzfWNsb25lKCl7cmV0dXJuKG5ldyBZaCkuZnJvbUFycmF5KHRoaXMuZWxlbWVudHMpfWNvcHkodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLG49dC5lbGVtZW50cztyZXR1cm4gZVswXT1uWzBdLGVbMV09blsxXSxlWzJdPW5bMl0sZVszXT1uWzNdLGVbNF09bls0XSxlWzVdPW5bNV0sZVs2XT1uWzZdLGVbN109bls3XSxlWzhdPW5bOF0sZVs5XT1uWzldLGVbMTBdPW5bMTBdLGVbMTFdPW5bMTFdLGVbMTJdPW5bMTJdLGVbMTNdPW5bMTNdLGVbMTRdPW5bMTRdLGVbMTVdPW5bMTVdLHRoaXN9Y29weVBvc2l0aW9uKHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cyxuPXQuZWxlbWVudHM7cmV0dXJuIGVbMTJdPW5bMTJdLGVbMTNdPW5bMTNdLGVbMTRdPW5bMTRdLHRoaXN9c2V0RnJvbU1hdHJpeDModCl7Y29uc3QgZT10LmVsZW1lbnRzO3JldHVybiB0aGlzLnNldChlWzBdLGVbM10sZVs2XSwwLGVbMV0sZVs0XSxlWzddLDAsZVsyXSxlWzVdLGVbOF0sMCwwLDAsMCwxKSx0aGlzfWV4dHJhY3RCYXNpcyh0LGUsbil7cmV0dXJuIHQuc2V0RnJvbU1hdHJpeENvbHVtbih0aGlzLDApLGUuc2V0RnJvbU1hdHJpeENvbHVtbih0aGlzLDEpLG4uc2V0RnJvbU1hdHJpeENvbHVtbih0aGlzLDIpLHRoaXN9bWFrZUJhc2lzKHQsZSxuKXtyZXR1cm4gdGhpcy5zZXQodC54LGUueCxuLngsMCx0LnksZS55LG4ueSwwLHQueixlLnosbi56LDAsMCwwLDAsMSksdGhpc31leHRyYWN0Um90YXRpb24odCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLG49dC5lbGVtZW50cyxyPTEvWGguc2V0RnJvbU1hdHJpeENvbHVtbih0LDApLmxlbmd0aCgpLGk9MS9YaC5zZXRGcm9tTWF0cml4Q29sdW1uKHQsMSkubGVuZ3RoKCksbz0xL1hoLnNldEZyb21NYXRyaXhDb2x1bW4odCwyKS5sZW5ndGgoKTtyZXR1cm4gZVswXT1uWzBdKnIsZVsxXT1uWzFdKnIsZVsyXT1uWzJdKnIsZVszXT0wLGVbNF09bls0XSppLGVbNV09bls1XSppLGVbNl09bls2XSppLGVbN109MCxlWzhdPW5bOF0qbyxlWzldPW5bOV0qbyxlWzEwXT1uWzEwXSpvLGVbMTFdPTAsZVsxMl09MCxlWzEzXT0wLGVbMTRdPTAsZVsxNV09MSx0aGlzfW1ha2VSb3RhdGlvbkZyb21FdWxlcih0KXtjb25zdCBlPXRoaXMuZWxlbWVudHMsbj10Lngscj10LnksaT10Lnosbz1NYXRoLmNvcyhuKSxzPU1hdGguc2luKG4pLGE9TWF0aC5jb3MociksdT1NYXRoLnNpbihyKSxjPU1hdGguY29zKGkpLGw9TWF0aC5zaW4oaSk7aWYoIlhZWiI9PT10Lm9yZGVyKXtjb25zdCB0PW8qYyxuPW8qbCxyPXMqYyxpPXMqbDtlWzBdPWEqYyxlWzRdPS1hKmwsZVs4XT11LGVbMV09bityKnUsZVs1XT10LWkqdSxlWzldPS1zKmEsZVsyXT1pLXQqdSxlWzZdPXIrbip1LGVbMTBdPW8qYX1lbHNlIGlmKCJZWFoiPT09dC5vcmRlcil7Y29uc3QgdD1hKmMsbj1hKmwscj11KmMsaT11Kmw7ZVswXT10K2kqcyxlWzRdPXIqcy1uLGVbOF09byp1LGVbMV09bypsLGVbNV09bypjLGVbOV09LXMsZVsyXT1uKnMtcixlWzZdPWkrdCpzLGVbMTBdPW8qYX1lbHNlIGlmKCJaWFkiPT09dC5vcmRlcil7Y29uc3QgdD1hKmMsbj1hKmwscj11KmMsaT11Kmw7ZVswXT10LWkqcyxlWzRdPS1vKmwsZVs4XT1yK24qcyxlWzFdPW4rcipzLGVbNV09bypjLGVbOV09aS10KnMsZVsyXT0tbyp1LGVbNl09cyxlWzEwXT1vKmF9ZWxzZSBpZigiWllYIj09PXQub3JkZXIpe2NvbnN0IHQ9bypjLG49bypsLHI9cypjLGk9cypsO2VbMF09YSpjLGVbNF09cip1LW4sZVs4XT10KnUraSxlWzFdPWEqbCxlWzVdPWkqdSt0LGVbOV09bip1LXIsZVsyXT0tdSxlWzZdPXMqYSxlWzEwXT1vKmF9ZWxzZSBpZigiWVpYIj09PXQub3JkZXIpe2NvbnN0IHQ9byphLG49byp1LHI9cyphLGk9cyp1O2VbMF09YSpjLGVbNF09aS10KmwsZVs4XT1yKmwrbixlWzFdPWwsZVs1XT1vKmMsZVs5XT0tcypjLGVbMl09LXUqYyxlWzZdPW4qbCtyLGVbMTBdPXQtaSpsfWVsc2UgaWYoIlhaWSI9PT10Lm9yZGVyKXtjb25zdCB0PW8qYSxuPW8qdSxyPXMqYSxpPXMqdTtlWzBdPWEqYyxlWzRdPS1sLGVbOF09dSpjLGVbMV09dCpsK2ksZVs1XT1vKmMsZVs5XT1uKmwtcixlWzJdPXIqbC1uLGVbNl09cypjLGVbMTBdPWkqbCt0fXJldHVybiBlWzNdPTAsZVs3XT0wLGVbMTFdPTAsZVsxMl09MCxlWzEzXT0wLGVbMTRdPTAsZVsxNV09MSx0aGlzfW1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKHQpe3JldHVybiB0aGlzLmNvbXBvc2UoSGgsdCxaaCl9bG9va0F0KHQsZSxuKXtjb25zdCByPXRoaXMuZWxlbWVudHM7cmV0dXJuIFFoLnN1YlZlY3RvcnModCxlKSwwPT09UWgubGVuZ3RoU3EoKSYmKFFoLno9MSksUWgubm9ybWFsaXplKCksS2guY3Jvc3NWZWN0b3JzKG4sUWgpLDA9PT1LaC5sZW5ndGhTcSgpJiYoMT09PU1hdGguYWJzKG4ueik/UWgueCs9MWUtNDpRaC56Kz0xZS00LFFoLm5vcm1hbGl6ZSgpLEtoLmNyb3NzVmVjdG9ycyhuLFFoKSksS2gubm9ybWFsaXplKCksSmguY3Jvc3NWZWN0b3JzKFFoLEtoKSxyWzBdPUtoLngscls0XT1KaC54LHJbOF09UWgueCxyWzFdPUtoLnkscls1XT1KaC55LHJbOV09UWgueSxyWzJdPUtoLnoscls2XT1KaC56LHJbMTBdPVFoLnosdGhpc31tdWx0aXBseSh0KXtyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKHRoaXMsdCl9cHJlbXVsdGlwbHkodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyh0LHRoaXMpfW11bHRpcGx5TWF0cmljZXModCxlKXtjb25zdCBuPXQuZWxlbWVudHMscj1lLmVsZW1lbnRzLGk9dGhpcy5lbGVtZW50cyxvPW5bMF0scz1uWzRdLGE9bls4XSx1PW5bMTJdLGM9blsxXSxsPW5bNV0saD1uWzldLGY9blsxM10scD1uWzJdLGQ9bls2XSxnPW5bMTBdLHk9blsxNF0sbT1uWzNdLHY9bls3XSxfPW5bMTFdLHg9blsxNV0sdz1yWzBdLGI9cls0XSxEPXJbOF0sRT1yWzEyXSxDPXJbMV0sUz1yWzVdLEE9cls5XSxOPXJbMTNdLEk9clsyXSxNPXJbNl0sRj1yWzEwXSxUPXJbMTRdLE89clszXSxMPXJbN10sUD1yWzExXSxSPXJbMTVdO3JldHVybiBpWzBdPW8qdytzKkMrYSpJK3UqTyxpWzRdPW8qYitzKlMrYSpNK3UqTCxpWzhdPW8qRCtzKkErYSpGK3UqUCxpWzEyXT1vKkUrcypOK2EqVCt1KlIsaVsxXT1jKncrbCpDK2gqSStmKk8saVs1XT1jKmIrbCpTK2gqTStmKkwsaVs5XT1jKkQrbCpBK2gqRitmKlAsaVsxM109YypFK2wqTitoKlQrZipSLGlbMl09cCp3K2QqQytnKkkreSpPLGlbNl09cCpiK2QqUytnKk0reSpMLGlbMTBdPXAqRCtkKkErZypGK3kqUCxpWzE0XT1wKkUrZCpOK2cqVCt5KlIsaVszXT1tKncrdipDK18qSSt4Kk8saVs3XT1tKmIrdipTK18qTSt4KkwsaVsxMV09bSpEK3YqQStfKkYreCpQLGlbMTVdPW0qRSt2Kk4rXypUK3gqUix0aGlzfW11bHRpcGx5U2NhbGFyKHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cztyZXR1cm4gZVswXSo9dCxlWzRdKj10LGVbOF0qPXQsZVsxMl0qPXQsZVsxXSo9dCxlWzVdKj10LGVbOV0qPXQsZVsxM10qPXQsZVsyXSo9dCxlWzZdKj10LGVbMTBdKj10LGVbMTRdKj10LGVbM10qPXQsZVs3XSo9dCxlWzExXSo9dCxlWzE1XSo9dCx0aGlzfWRldGVybWluYW50KCl7Y29uc3QgdD10aGlzLmVsZW1lbnRzLGU9dFswXSxuPXRbNF0scj10WzhdLGk9dFsxMl0sbz10WzFdLHM9dFs1XSxhPXRbOV0sdT10WzEzXSxjPXRbMl0sbD10WzZdLGg9dFsxMF0sZj10WzE0XTtyZXR1cm4gdFszXSooK2kqYSpsLXIqdSpsLWkqcypoK24qdSpoK3IqcypmLW4qYSpmKSt0WzddKigrZSphKmYtZSp1KmgraSpvKmgtcipvKmYrcip1KmMtaSphKmMpK3RbMTFdKigrZSp1KmwtZSpzKmYtaSpvKmwrbipvKmYraSpzKmMtbip1KmMpK3RbMTVdKigtcipzKmMtZSphKmwrZSpzKmgrcipvKmwtbipvKmgrbiphKmMpfXRyYW5zcG9zZSgpe2NvbnN0IHQ9dGhpcy5lbGVtZW50cztsZXQgZTtyZXR1cm4gZT10WzFdLHRbMV09dFs0XSx0WzRdPWUsZT10WzJdLHRbMl09dFs4XSx0WzhdPWUsZT10WzZdLHRbNl09dFs5XSx0WzldPWUsZT10WzNdLHRbM109dFsxMl0sdFsxMl09ZSxlPXRbN10sdFs3XT10WzEzXSx0WzEzXT1lLGU9dFsxMV0sdFsxMV09dFsxNF0sdFsxNF09ZSx0aGlzfXNldFBvc2l0aW9uKHQsZSxuKXtjb25zdCByPXRoaXMuZWxlbWVudHM7cmV0dXJuIHQuaXNWZWN0b3IzPyhyWzEyXT10LngsclsxM109dC55LHJbMTRdPXQueik6KHJbMTJdPXQsclsxM109ZSxyWzE0XT1uKSx0aGlzfWludmVydCgpe2NvbnN0IHQ9dGhpcy5lbGVtZW50cyxlPXRbMF0sbj10WzFdLHI9dFsyXSxpPXRbM10sbz10WzRdLHM9dFs1XSxhPXRbNl0sdT10WzddLGM9dFs4XSxsPXRbOV0saD10WzEwXSxmPXRbMTFdLHA9dFsxMl0sZD10WzEzXSxnPXRbMTRdLHk9dFsxNV0sbT1sKmcqdS1kKmgqdStkKmEqZi1zKmcqZi1sKmEqeStzKmgqeSx2PXAqaCp1LWMqZyp1LXAqYSpmK28qZypmK2MqYSp5LW8qaCp5LF89YypkKnUtcCpsKnUrcCpzKmYtbypkKmYtYypzKnkrbypsKnkseD1wKmwqYS1jKmQqYS1wKnMqaCtvKmQqaCtjKnMqZy1vKmwqZyx3PWUqbStuKnYrcipfK2kqeDtpZigwPT09dylyZXR1cm4gdGhpcy5zZXQoMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCk7Y29uc3QgYj0xL3c7cmV0dXJuIHRbMF09bSpiLHRbMV09KGQqaCppLWwqZyppLWQqcipmK24qZypmK2wqcip5LW4qaCp5KSpiLHRbMl09KHMqZyppLWQqYSppK2Qqcip1LW4qZyp1LXMqcip5K24qYSp5KSpiLHRbM109KGwqYSppLXMqaCppLWwqcip1K24qaCp1K3MqcipmLW4qYSpmKSpiLHRbNF09dipiLHRbNV09KGMqZyppLXAqaCppK3AqcipmLWUqZypmLWMqcip5K2UqaCp5KSpiLHRbNl09KHAqYSppLW8qZyppLXAqcip1K2UqZyp1K28qcip5LWUqYSp5KSpiLHRbN109KG8qaCppLWMqYSppK2Mqcip1LWUqaCp1LW8qcipmK2UqYSpmKSpiLHRbOF09XypiLHRbOV09KHAqbCppLWMqZCppLXAqbipmK2UqZCpmK2Mqbip5LWUqbCp5KSpiLHRbMTBdPShvKmQqaS1wKnMqaStwKm4qdS1lKmQqdS1vKm4qeStlKnMqeSkqYix0WzExXT0oYypzKmktbypsKmktYypuKnUrZSpsKnUrbypuKmYtZSpzKmYpKmIsdFsxMl09eCpiLHRbMTNdPShjKmQqci1wKmwqcitwKm4qaC1lKmQqaC1jKm4qZytlKmwqZykqYix0WzE0XT0ocCpzKnItbypkKnItcCpuKmErZSpkKmErbypuKmctZSpzKmcpKmIsdFsxNV09KG8qbCpyLWMqcypyK2MqbiphLWUqbCphLW8qbipoK2UqcypoKSpiLHRoaXN9c2NhbGUodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLG49dC54LHI9dC55LGk9dC56O3JldHVybiBlWzBdKj1uLGVbNF0qPXIsZVs4XSo9aSxlWzFdKj1uLGVbNV0qPXIsZVs5XSo9aSxlWzJdKj1uLGVbNl0qPXIsZVsxMF0qPWksZVszXSo9bixlWzddKj1yLGVbMTFdKj1pLHRoaXN9Z2V0TWF4U2NhbGVPbkF4aXMoKXtjb25zdCB0PXRoaXMuZWxlbWVudHMsZT10WzBdKnRbMF0rdFsxXSp0WzFdK3RbMl0qdFsyXSxuPXRbNF0qdFs0XSt0WzVdKnRbNV0rdFs2XSp0WzZdLHI9dFs4XSp0WzhdK3RbOV0qdFs5XSt0WzEwXSp0WzEwXTtyZXR1cm4gTWF0aC5zcXJ0KE1hdGgubWF4KGUsbixyKSl9bWFrZVRyYW5zbGF0aW9uKHQsZSxuKXtyZXR1cm4gdC5pc1ZlY3RvcjM/dGhpcy5zZXQoMSwwLDAsdC54LDAsMSwwLHQueSwwLDAsMSx0LnosMCwwLDAsMSk6dGhpcy5zZXQoMSwwLDAsdCwwLDEsMCxlLDAsMCwxLG4sMCwwLDAsMSksdGhpc31tYWtlUm90YXRpb25YKHQpe2NvbnN0IGU9TWF0aC5jb3ModCksbj1NYXRoLnNpbih0KTtyZXR1cm4gdGhpcy5zZXQoMSwwLDAsMCwwLGUsLW4sMCwwLG4sZSwwLDAsMCwwLDEpLHRoaXN9bWFrZVJvdGF0aW9uWSh0KXtjb25zdCBlPU1hdGguY29zKHQpLG49TWF0aC5zaW4odCk7cmV0dXJuIHRoaXMuc2V0KGUsMCxuLDAsMCwxLDAsMCwtbiwwLGUsMCwwLDAsMCwxKSx0aGlzfW1ha2VSb3RhdGlvbloodCl7Y29uc3QgZT1NYXRoLmNvcyh0KSxuPU1hdGguc2luKHQpO3JldHVybiB0aGlzLnNldChlLC1uLDAsMCxuLGUsMCwwLDAsMCwxLDAsMCwwLDAsMSksdGhpc31tYWtlUm90YXRpb25BeGlzKHQsZSl7Y29uc3Qgbj1NYXRoLmNvcyhlKSxyPU1hdGguc2luKGUpLGk9MS1uLG89dC54LHM9dC55LGE9dC56LHU9aSpvLGM9aSpzO3JldHVybiB0aGlzLnNldCh1Km8rbix1KnMtciphLHUqYStyKnMsMCx1KnMrciphLGMqcytuLGMqYS1yKm8sMCx1KmEtcipzLGMqYStyKm8saSphKmErbiwwLDAsMCwwLDEpLHRoaXN9bWFrZVNjYWxlKHQsZSxuKXtyZXR1cm4gdGhpcy5zZXQodCwwLDAsMCwwLGUsMCwwLDAsMCxuLDAsMCwwLDAsMSksdGhpc31tYWtlU2hlYXIodCxlLG4scixpLG8pe3JldHVybiB0aGlzLnNldCgxLG4saSwwLHQsMSxvLDAsZSxyLDEsMCwwLDAsMCwxKSx0aGlzfWNvbXBvc2UodCxlLG4pe2NvbnN0IHI9dGhpcy5lbGVtZW50cyxpPWUuX3gsbz1lLl95LHM9ZS5feixhPWUuX3csdT1pK2ksYz1vK28sbD1zK3MsaD1pKnUsZj1pKmMscD1pKmwsZD1vKmMsZz1vKmwseT1zKmwsbT1hKnUsdj1hKmMsXz1hKmwseD1uLngsdz1uLnksYj1uLno7cmV0dXJuIHJbMF09KDEtKGQreSkpKngsclsxXT0oZitfKSp4LHJbMl09KHAtdikqeCxyWzNdPTAscls0XT0oZi1fKSp3LHJbNV09KDEtKGgreSkpKncscls2XT0oZyttKSp3LHJbN109MCxyWzhdPShwK3YpKmIscls5XT0oZy1tKSpiLHJbMTBdPSgxLShoK2QpKSpiLHJbMTFdPTAsclsxMl09dC54LHJbMTNdPXQueSxyWzE0XT10LnosclsxNV09MSx0aGlzfWRlY29tcG9zZSh0LGUsbil7Y29uc3Qgcj10aGlzLmVsZW1lbnRzO2xldCBpPVhoLnNldChyWzBdLHJbMV0sclsyXSkubGVuZ3RoKCk7Y29uc3Qgbz1YaC5zZXQocls0XSxyWzVdLHJbNl0pLmxlbmd0aCgpLHM9WGguc2V0KHJbOF0scls5XSxyWzEwXSkubGVuZ3RoKCk7dGhpcy5kZXRlcm1pbmFudCgpPDAmJihpPS1pKSx0Lng9clsxMl0sdC55PXJbMTNdLHQuej1yWzE0XSxXaC5jb3B5KHRoaXMpO2NvbnN0IGE9MS9pLHU9MS9vLGM9MS9zO3JldHVybiBXaC5lbGVtZW50c1swXSo9YSxXaC5lbGVtZW50c1sxXSo9YSxXaC5lbGVtZW50c1syXSo9YSxXaC5lbGVtZW50c1s0XSo9dSxXaC5lbGVtZW50c1s1XSo9dSxXaC5lbGVtZW50c1s2XSo9dSxXaC5lbGVtZW50c1s4XSo9YyxXaC5lbGVtZW50c1s5XSo9YyxXaC5lbGVtZW50c1sxMF0qPWMsZS5zZXRGcm9tUm90YXRpb25NYXRyaXgoV2gpLG4ueD1pLG4ueT1vLG4uej1zLHRoaXN9bWFrZVBlcnNwZWN0aXZlKHQsZSxuLHIsaSxvLHM9WGwpe2NvbnN0IGE9dGhpcy5lbGVtZW50cyx1PTIqaS8oZS10KSxjPTIqaS8obi1yKSxsPShlK3QpLyhlLXQpLGg9KG4rcikvKG4tcik7bGV0IGYscDtpZihzPT09WGwpZj0tKG8raSkvKG8taSkscD0tMipvKmkvKG8taSk7ZWxzZXtpZigyMDAxIT09cyl0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLk1hdHJpeDQubWFrZVBlcnNwZWN0aXZlKCk6IEludmFsaWQgY29vcmRpbmF0ZSBzeXN0ZW06ICIrcyk7Zj0tby8oby1pKSxwPS1vKmkvKG8taSl9cmV0dXJuIGFbMF09dSxhWzRdPTAsYVs4XT1sLGFbMTJdPTAsYVsxXT0wLGFbNV09YyxhWzldPWgsYVsxM109MCxhWzJdPTAsYVs2XT0wLGFbMTBdPWYsYVsxNF09cCxhWzNdPTAsYVs3XT0wLGFbMTFdPS0xLGFbMTVdPTAsdGhpc31tYWtlT3J0aG9ncmFwaGljKHQsZSxuLHIsaSxvLHM9WGwpe2NvbnN0IGE9dGhpcy5lbGVtZW50cyx1PTEvKGUtdCksYz0xLyhuLXIpLGw9MS8oby1pKSxoPShlK3QpKnUsZj0obityKSpjO2xldCBwLGQ7aWYocz09PVhsKXA9KG8raSkqbCxkPS0yKmw7ZWxzZXtpZigyMDAxIT09cyl0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLk1hdHJpeDQubWFrZU9ydGhvZ3JhcGhpYygpOiBJbnZhbGlkIGNvb3JkaW5hdGUgc3lzdGVtOiAiK3MpO3A9aSpsLGQ9LTEqbH1yZXR1cm4gYVswXT0yKnUsYVs0XT0wLGFbOF09MCxhWzEyXT0taCxhWzFdPTAsYVs1XT0yKmMsYVs5XT0wLGFbMTNdPS1mLGFbMl09MCxhWzZdPTAsYVsxMF09ZCxhWzE0XT0tcCxhWzNdPTAsYVs3XT0wLGFbMTFdPTAsYVsxNV09MSx0aGlzfWVxdWFscyh0KXtjb25zdCBlPXRoaXMuZWxlbWVudHMsbj10LmVsZW1lbnRzO2ZvcihsZXQgdD0wO3Q8MTY7dCsrKWlmKGVbdF0hPT1uW3RdKXJldHVybiExO3JldHVybiEwfWZyb21BcnJheSh0LGU9MCl7Zm9yKGxldCBuPTA7bjwxNjtuKyspdGhpcy5lbGVtZW50c1tuXT10W24rZV07cmV0dXJuIHRoaXN9dG9BcnJheSh0PVtdLGU9MCl7Y29uc3Qgbj10aGlzLmVsZW1lbnRzO3JldHVybiB0W2VdPW5bMF0sdFtlKzFdPW5bMV0sdFtlKzJdPW5bMl0sdFtlKzNdPW5bM10sdFtlKzRdPW5bNF0sdFtlKzVdPW5bNV0sdFtlKzZdPW5bNl0sdFtlKzddPW5bN10sdFtlKzhdPW5bOF0sdFtlKzldPW5bOV0sdFtlKzEwXT1uWzEwXSx0W2UrMTFdPW5bMTFdLHRbZSsxMl09blsxMl0sdFtlKzEzXT1uWzEzXSx0W2UrMTRdPW5bMTRdLHRbZSsxNV09blsxNV0sdH19Y29uc3QgWGg9bmV3IHloLFdoPW5ldyBZaCxIaD1uZXcgeWgoMCwwLDApLFpoPW5ldyB5aCgxLDEsMSksS2g9bmV3IHloLEpoPW5ldyB5aCxRaD1uZXcgeWgsJGg9bmV3IFloLHRmPW5ldyBnaDtjbGFzcyBlZntjb25zdHJ1Y3Rvcih0PTAsZT0wLG49MCxyPWVmLkRFRkFVTFRfT1JERVIpe3RoaXMuaXNFdWxlcj0hMCx0aGlzLl94PXQsdGhpcy5feT1lLHRoaXMuX3o9bix0aGlzLl9vcmRlcj1yfWdldCB4KCl7cmV0dXJuIHRoaXMuX3h9c2V0IHgodCl7dGhpcy5feD10LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1nZXQgeSgpe3JldHVybiB0aGlzLl95fXNldCB5KHQpe3RoaXMuX3k9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9Z2V0IHooKXtyZXR1cm4gdGhpcy5fen1zZXQgeih0KXt0aGlzLl96PXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfWdldCBvcmRlcigpe3JldHVybiB0aGlzLl9vcmRlcn1zZXQgb3JkZXIodCl7dGhpcy5fb3JkZXI9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9c2V0KHQsZSxuLHI9dGhpcy5fb3JkZXIpe3JldHVybiB0aGlzLl94PXQsdGhpcy5feT1lLHRoaXMuX3o9bix0aGlzLl9vcmRlcj1yLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuX3gsdGhpcy5feSx0aGlzLl96LHRoaXMuX29yZGVyKX1jb3B5KHQpe3JldHVybiB0aGlzLl94PXQuX3gsdGhpcy5feT10Ll95LHRoaXMuX3o9dC5feix0aGlzLl9vcmRlcj10Ll9vcmRlcix0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zZXRGcm9tUm90YXRpb25NYXRyaXgodCxlPXRoaXMuX29yZGVyLG49ITApe2NvbnN0IHI9dC5lbGVtZW50cyxpPXJbMF0sbz1yWzRdLHM9cls4XSxhPXJbMV0sdT1yWzVdLGM9cls5XSxsPXJbMl0saD1yWzZdLGY9clsxMF07c3dpdGNoKGUpe2Nhc2UiWFlaIjp0aGlzLl95PU1hdGguYXNpbihLbChzLC0xLDEpKSxNYXRoLmFicyhzKTwuOTk5OTk5OT8odGhpcy5feD1NYXRoLmF0YW4yKC1jLGYpLHRoaXMuX3o9TWF0aC5hdGFuMigtbyxpKSk6KHRoaXMuX3g9TWF0aC5hdGFuMihoLHUpLHRoaXMuX3o9MCk7YnJlYWs7Y2FzZSJZWFoiOnRoaXMuX3g9TWF0aC5hc2luKC1LbChjLC0xLDEpKSxNYXRoLmFicyhjKTwuOTk5OTk5OT8odGhpcy5feT1NYXRoLmF0YW4yKHMsZiksdGhpcy5fej1NYXRoLmF0YW4yKGEsdSkpOih0aGlzLl95PU1hdGguYXRhbjIoLWwsaSksdGhpcy5fej0wKTticmVhaztjYXNlIlpYWSI6dGhpcy5feD1NYXRoLmFzaW4oS2woaCwtMSwxKSksTWF0aC5hYnMoaCk8Ljk5OTk5OTk/KHRoaXMuX3k9TWF0aC5hdGFuMigtbCxmKSx0aGlzLl96PU1hdGguYXRhbjIoLW8sdSkpOih0aGlzLl95PTAsdGhpcy5fej1NYXRoLmF0YW4yKGEsaSkpO2JyZWFrO2Nhc2UiWllYIjp0aGlzLl95PU1hdGguYXNpbigtS2wobCwtMSwxKSksTWF0aC5hYnMobCk8Ljk5OTk5OTk/KHRoaXMuX3g9TWF0aC5hdGFuMihoLGYpLHRoaXMuX3o9TWF0aC5hdGFuMihhLGkpKToodGhpcy5feD0wLHRoaXMuX3o9TWF0aC5hdGFuMigtbyx1KSk7YnJlYWs7Y2FzZSJZWlgiOnRoaXMuX3o9TWF0aC5hc2luKEtsKGEsLTEsMSkpLE1hdGguYWJzKGEpPC45OTk5OTk5Pyh0aGlzLl94PU1hdGguYXRhbjIoLWMsdSksdGhpcy5feT1NYXRoLmF0YW4yKC1sLGkpKToodGhpcy5feD0wLHRoaXMuX3k9TWF0aC5hdGFuMihzLGYpKTticmVhaztjYXNlIlhaWSI6dGhpcy5fej1NYXRoLmFzaW4oLUtsKG8sLTEsMSkpLE1hdGguYWJzKG8pPC45OTk5OTk5Pyh0aGlzLl94PU1hdGguYXRhbjIoaCx1KSx0aGlzLl95PU1hdGguYXRhbjIocyxpKSk6KHRoaXMuX3g9TWF0aC5hdGFuMigtYyxmKSx0aGlzLl95PTApfXJldHVybiB0aGlzLl9vcmRlcj1lLCEwPT09biYmdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2V0RnJvbVF1YXRlcm5pb24odCxlLG4pe3JldHVybiAkaC5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbih0KSx0aGlzLnNldEZyb21Sb3RhdGlvbk1hdHJpeCgkaCxlLG4pfXNldEZyb21WZWN0b3IzKHQsZT10aGlzLl9vcmRlcil7cmV0dXJuIHRoaXMuc2V0KHQueCx0LnksdC56LGUpfXJlb3JkZXIodCl7cmV0dXJuIHRmLnNldEZyb21FdWxlcih0aGlzKSx0aGlzLnNldEZyb21RdWF0ZXJuaW9uKHRmLHQpfWVxdWFscyh0KXtyZXR1cm4gdC5feD09PXRoaXMuX3gmJnQuX3k9PT10aGlzLl95JiZ0Ll96PT09dGhpcy5feiYmdC5fb3JkZXI9PT10aGlzLl9vcmRlcn1mcm9tQXJyYXkodCl7cmV0dXJuIHRoaXMuX3g9dFswXSx0aGlzLl95PXRbMV0sdGhpcy5fej10WzJdLHZvaWQgMCE9PXRbM10mJih0aGlzLl9vcmRlcj10WzNdKSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc310b0FycmF5KHQ9W10sZT0wKXtyZXR1cm4gdFtlXT10aGlzLl94LHRbZSsxXT10aGlzLl95LHRbZSsyXT10aGlzLl96LHRbZSszXT10aGlzLl9vcmRlcix0fV9vbkNoYW5nZSh0KXtyZXR1cm4gdGhpcy5fb25DaGFuZ2VDYWxsYmFjaz10LHRoaXN9X29uQ2hhbmdlQ2FsbGJhY2soKXt9KltTeW1ib2wuaXRlcmF0b3JdKCl7eWllbGQgdGhpcy5feCx5aWVsZCB0aGlzLl95LHlpZWxkIHRoaXMuX3oseWllbGQgdGhpcy5fb3JkZXJ9fWVmLkRFRkFVTFRfT1JERVI9IlhZWiI7Y2xhc3MgbmZ7Y29uc3RydWN0b3IoKXt0aGlzLm1hc2s9MX1zZXQodCl7dGhpcy5tYXNrPTE8PHQ+Pj4wfWVuYWJsZSh0KXt0aGlzLm1hc2t8PTE8PHR9ZW5hYmxlQWxsKCl7dGhpcy5tYXNrPS0xfXRvZ2dsZSh0KXt0aGlzLm1hc2tePTE8PHR9ZGlzYWJsZSh0KXt0aGlzLm1hc2smPX4oMTw8dCl9ZGlzYWJsZUFsbCgpe3RoaXMubWFzaz0wfXRlc3QodCl7cmV0dXJuISEodGhpcy5tYXNrJnQubWFzayl9aXNFbmFibGVkKHQpe3JldHVybiEhKHRoaXMubWFzayYxPDx0KX19bGV0IHJmPTA7Y29uc3Qgb2Y9bmV3IHloLHNmPW5ldyBnaCxhZj1uZXcgWWgsdWY9bmV3IHloLGNmPW5ldyB5aCxsZj1uZXcgeWgsaGY9bmV3IGdoLGZmPW5ldyB5aCgxLDAsMCkscGY9bmV3IHloKDAsMSwwKSxkZj1uZXcgeWgoMCwwLDEpLGdmPXt0eXBlOiJhZGRlZCJ9LHlmPXt0eXBlOiJyZW1vdmVkIn0sbWY9e3R5cGU6ImNoaWxkYWRkZWQiLGNoaWxkOm51bGx9LHZmPXt0eXBlOiJjaGlsZHJlbW92ZWQiLGNoaWxkOm51bGx9O2NsYXNzIF9mIGV4dGVuZHMgV2x7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMuaXNPYmplY3QzRD0hMCxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaWQiLHt2YWx1ZTpyZisrfSksdGhpcy51dWlkPVpsKCksdGhpcy5uYW1lPSIiLHRoaXMudHlwZT0iT2JqZWN0M0QiLHRoaXMucGFyZW50PW51bGwsdGhpcy5jaGlsZHJlbj1bXSx0aGlzLnVwPV9mLkRFRkFVTFRfVVAuY2xvbmUoKTtjb25zdCB0PW5ldyB5aCxlPW5ldyBlZixuPW5ldyBnaCxyPW5ldyB5aCgxLDEsMSk7ZS5fb25DaGFuZ2UoKGZ1bmN0aW9uKCl7bi5zZXRGcm9tRXVsZXIoZSwhMSl9KSksbi5fb25DaGFuZ2UoKGZ1bmN0aW9uKCl7ZS5zZXRGcm9tUXVhdGVybmlvbihuLHZvaWQgMCwhMSl9KSksT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcyx7cG9zaXRpb246e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOnR9LHJvdGF0aW9uOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTplfSxxdWF0ZXJuaW9uOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTpufSxzY2FsZTp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6cn0sbW9kZWxWaWV3TWF0cml4Ont2YWx1ZTpuZXcgWWh9LG5vcm1hbE1hdHJpeDp7dmFsdWU6bmV3ICRsfX0pLHRoaXMubWF0cml4PW5ldyBZaCx0aGlzLm1hdHJpeFdvcmxkPW5ldyBZaCx0aGlzLm1hdHJpeEF1dG9VcGRhdGU9X2YuREVGQVVMVF9NQVRSSVhfQVVUT19VUERBVEUsdGhpcy5tYXRyaXhXb3JsZEF1dG9VcGRhdGU9X2YuREVGQVVMVF9NQVRSSVhfV09STERfQVVUT19VUERBVEUsdGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPSExLHRoaXMubGF5ZXJzPW5ldyBuZix0aGlzLnZpc2libGU9ITAsdGhpcy5jYXN0U2hhZG93PSExLHRoaXMucmVjZWl2ZVNoYWRvdz0hMSx0aGlzLmZydXN0dW1DdWxsZWQ9ITAsdGhpcy5yZW5kZXJPcmRlcj0wLHRoaXMuYW5pbWF0aW9ucz1bXSx0aGlzLnVzZXJEYXRhPXt9fW9uQmVmb3JlU2hhZG93KCl7fW9uQWZ0ZXJTaGFkb3coKXt9b25CZWZvcmVSZW5kZXIoKXt9b25BZnRlclJlbmRlcigpe31hcHBseU1hdHJpeDQodCl7dGhpcy5tYXRyaXhBdXRvVXBkYXRlJiZ0aGlzLnVwZGF0ZU1hdHJpeCgpLHRoaXMubWF0cml4LnByZW11bHRpcGx5KHQpLHRoaXMubWF0cml4LmRlY29tcG9zZSh0aGlzLnBvc2l0aW9uLHRoaXMucXVhdGVybmlvbix0aGlzLnNjYWxlKX1hcHBseVF1YXRlcm5pb24odCl7cmV0dXJuIHRoaXMucXVhdGVybmlvbi5wcmVtdWx0aXBseSh0KSx0aGlzfXNldFJvdGF0aW9uRnJvbUF4aXNBbmdsZSh0LGUpe3RoaXMucXVhdGVybmlvbi5zZXRGcm9tQXhpc0FuZ2xlKHQsZSl9c2V0Um90YXRpb25Gcm9tRXVsZXIodCl7dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21FdWxlcih0LCEwKX1zZXRSb3RhdGlvbkZyb21NYXRyaXgodCl7dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21Sb3RhdGlvbk1hdHJpeCh0KX1zZXRSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKHQpe3RoaXMucXVhdGVybmlvbi5jb3B5KHQpfXJvdGF0ZU9uQXhpcyh0LGUpe3JldHVybiBzZi5zZXRGcm9tQXhpc0FuZ2xlKHQsZSksdGhpcy5xdWF0ZXJuaW9uLm11bHRpcGx5KHNmKSx0aGlzfXJvdGF0ZU9uV29ybGRBeGlzKHQsZSl7cmV0dXJuIHNmLnNldEZyb21BeGlzQW5nbGUodCxlKSx0aGlzLnF1YXRlcm5pb24ucHJlbXVsdGlwbHkoc2YpLHRoaXN9cm90YXRlWCh0KXtyZXR1cm4gdGhpcy5yb3RhdGVPbkF4aXMoZmYsdCl9cm90YXRlWSh0KXtyZXR1cm4gdGhpcy5yb3RhdGVPbkF4aXMocGYsdCl9cm90YXRlWih0KXtyZXR1cm4gdGhpcy5yb3RhdGVPbkF4aXMoZGYsdCl9dHJhbnNsYXRlT25BeGlzKHQsZSl7cmV0dXJuIG9mLmNvcHkodCkuYXBwbHlRdWF0ZXJuaW9uKHRoaXMucXVhdGVybmlvbiksdGhpcy5wb3NpdGlvbi5hZGQob2YubXVsdGlwbHlTY2FsYXIoZSkpLHRoaXN9dHJhbnNsYXRlWCh0KXtyZXR1cm4gdGhpcy50cmFuc2xhdGVPbkF4aXMoZmYsdCl9dHJhbnNsYXRlWSh0KXtyZXR1cm4gdGhpcy50cmFuc2xhdGVPbkF4aXMocGYsdCl9dHJhbnNsYXRlWih0KXtyZXR1cm4gdGhpcy50cmFuc2xhdGVPbkF4aXMoZGYsdCl9bG9jYWxUb1dvcmxkKHQpe3JldHVybiB0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx0LmFwcGx5TWF0cml4NCh0aGlzLm1hdHJpeFdvcmxkKX13b3JsZFRvTG9jYWwodCl7cmV0dXJuIHRoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLHQuYXBwbHlNYXRyaXg0KGFmLmNvcHkodGhpcy5tYXRyaXhXb3JsZCkuaW52ZXJ0KCkpfWxvb2tBdCh0LGUsbil7dC5pc1ZlY3RvcjM/dWYuY29weSh0KTp1Zi5zZXQodCxlLG4pO2NvbnN0IHI9dGhpcy5wYXJlbnQ7dGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksY2Yuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHRoaXMubWF0cml4V29ybGQpLHRoaXMuaXNDYW1lcmF8fHRoaXMuaXNMaWdodD9hZi5sb29rQXQoY2YsdWYsdGhpcy51cCk6YWYubG9va0F0KHVmLGNmLHRoaXMudXApLHRoaXMucXVhdGVybmlvbi5zZXRGcm9tUm90YXRpb25NYXRyaXgoYWYpLHImJihhZi5leHRyYWN0Um90YXRpb24oci5tYXRyaXhXb3JsZCksc2Yuc2V0RnJvbVJvdGF0aW9uTWF0cml4KGFmKSx0aGlzLnF1YXRlcm5pb24ucHJlbXVsdGlwbHkoc2YuaW52ZXJ0KCkpKX1hZGQodCl7aWYoYXJndW1lbnRzLmxlbmd0aD4xKXtmb3IobGV0IHQ9MDt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKXRoaXMuYWRkKGFyZ3VtZW50c1t0XSk7cmV0dXJuIHRoaXN9cmV0dXJuIHQ9PT10aGlzfHx0JiZ0LmlzT2JqZWN0M0QmJih0LnJlbW92ZUZyb21QYXJlbnQoKSx0LnBhcmVudD10aGlzLHRoaXMuY2hpbGRyZW4ucHVzaCh0KSx0LmRpc3BhdGNoRXZlbnQoZ2YpLG1mLmNoaWxkPXQsdGhpcy5kaXNwYXRjaEV2ZW50KG1mKSxtZi5jaGlsZD1udWxsKSx0aGlzfXJlbW92ZSh0KXtpZihhcmd1bWVudHMubGVuZ3RoPjEpe2ZvcihsZXQgdD0wO3Q8YXJndW1lbnRzLmxlbmd0aDt0KyspdGhpcy5yZW1vdmUoYXJndW1lbnRzW3RdKTtyZXR1cm4gdGhpc31jb25zdCBlPXRoaXMuY2hpbGRyZW4uaW5kZXhPZih0KTtyZXR1cm4tMSE9PWUmJih0LnBhcmVudD1udWxsLHRoaXMuY2hpbGRyZW4uc3BsaWNlKGUsMSksdC5kaXNwYXRjaEV2ZW50KHlmKSx2Zi5jaGlsZD10LHRoaXMuZGlzcGF0Y2hFdmVudCh2ZiksdmYuY2hpbGQ9bnVsbCksdGhpc31yZW1vdmVGcm9tUGFyZW50KCl7Y29uc3QgdD10aGlzLnBhcmVudDtyZXR1cm4gbnVsbCE9PXQmJnQucmVtb3ZlKHRoaXMpLHRoaXN9Y2xlYXIoKXtyZXR1cm4gdGhpcy5yZW1vdmUoLi4udGhpcy5jaGlsZHJlbil9YXR0YWNoKHQpe3JldHVybiB0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSxhZi5jb3B5KHRoaXMubWF0cml4V29ybGQpLmludmVydCgpLG51bGwhPT10LnBhcmVudCYmKHQucGFyZW50LnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSxhZi5tdWx0aXBseSh0LnBhcmVudC5tYXRyaXhXb3JsZCkpLHQuYXBwbHlNYXRyaXg0KGFmKSx0LnJlbW92ZUZyb21QYXJlbnQoKSx0LnBhcmVudD10aGlzLHRoaXMuY2hpbGRyZW4ucHVzaCh0KSx0LnVwZGF0ZVdvcmxkTWF0cml4KCExLCEwKSx0LmRpc3BhdGNoRXZlbnQoZ2YpLG1mLmNoaWxkPXQsdGhpcy5kaXNwYXRjaEV2ZW50KG1mKSxtZi5jaGlsZD1udWxsLHRoaXN9Z2V0T2JqZWN0QnlJZCh0KXtyZXR1cm4gdGhpcy5nZXRPYmplY3RCeVByb3BlcnR5KCJpZCIsdCl9Z2V0T2JqZWN0QnlOYW1lKHQpe3JldHVybiB0aGlzLmdldE9iamVjdEJ5UHJvcGVydHkoIm5hbWUiLHQpfWdldE9iamVjdEJ5UHJvcGVydHkodCxlKXtpZih0aGlzW3RdPT09ZSlyZXR1cm4gdGhpcztmb3IobGV0IG49MCxyPXRoaXMuY2hpbGRyZW4ubGVuZ3RoO248cjtuKyspe2NvbnN0IHI9dGhpcy5jaGlsZHJlbltuXS5nZXRPYmplY3RCeVByb3BlcnR5KHQsZSk7aWYodm9pZCAwIT09cilyZXR1cm4gcn19Z2V0T2JqZWN0c0J5UHJvcGVydHkodCxlLG49W10pe3RoaXNbdF09PT1lJiZuLnB1c2godGhpcyk7Y29uc3Qgcj10aGlzLmNoaWxkcmVuO2ZvcihsZXQgaT0wLG89ci5sZW5ndGg7aTxvO2krKylyW2ldLmdldE9iamVjdHNCeVByb3BlcnR5KHQsZSxuKTtyZXR1cm4gbn1nZXRXb3JsZFBvc2l0aW9uKHQpe3JldHVybiB0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx0LnNldEZyb21NYXRyaXhQb3NpdGlvbih0aGlzLm1hdHJpeFdvcmxkKX1nZXRXb3JsZFF1YXRlcm5pb24odCl7cmV0dXJuIHRoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLHRoaXMubWF0cml4V29ybGQuZGVjb21wb3NlKGNmLHQsbGYpLHR9Z2V0V29ybGRTY2FsZSh0KXtyZXR1cm4gdGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksdGhpcy5tYXRyaXhXb3JsZC5kZWNvbXBvc2UoY2YsaGYsdCksdH1nZXRXb3JsZERpcmVjdGlvbih0KXt0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKTtjb25zdCBlPXRoaXMubWF0cml4V29ybGQuZWxlbWVudHM7cmV0dXJuIHQuc2V0KGVbOF0sZVs5XSxlWzEwXSkubm9ybWFsaXplKCl9cmF5Y2FzdCgpe310cmF2ZXJzZSh0KXt0KHRoaXMpO2NvbnN0IGU9dGhpcy5jaGlsZHJlbjtmb3IobGV0IG49MCxyPWUubGVuZ3RoO248cjtuKyspZVtuXS50cmF2ZXJzZSh0KX10cmF2ZXJzZVZpc2libGUodCl7aWYoITE9PT10aGlzLnZpc2libGUpcmV0dXJuO3QodGhpcyk7Y29uc3QgZT10aGlzLmNoaWxkcmVuO2ZvcihsZXQgbj0wLHI9ZS5sZW5ndGg7bjxyO24rKyllW25dLnRyYXZlcnNlVmlzaWJsZSh0KX10cmF2ZXJzZUFuY2VzdG9ycyh0KXtjb25zdCBlPXRoaXMucGFyZW50O251bGwhPT1lJiYodChlKSxlLnRyYXZlcnNlQW5jZXN0b3JzKHQpKX11cGRhdGVNYXRyaXgoKXt0aGlzLm1hdHJpeC5jb21wb3NlKHRoaXMucG9zaXRpb24sdGhpcy5xdWF0ZXJuaW9uLHRoaXMuc2NhbGUpLHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMH11cGRhdGVNYXRyaXhXb3JsZCh0KXt0aGlzLm1hdHJpeEF1dG9VcGRhdGUmJnRoaXMudXBkYXRlTWF0cml4KCksKHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZXx8dCkmJighMD09PXRoaXMubWF0cml4V29ybGRBdXRvVXBkYXRlJiYobnVsbD09PXRoaXMucGFyZW50P3RoaXMubWF0cml4V29ybGQuY29weSh0aGlzLm1hdHJpeCk6dGhpcy5tYXRyaXhXb3JsZC5tdWx0aXBseU1hdHJpY2VzKHRoaXMucGFyZW50Lm1hdHJpeFdvcmxkLHRoaXMubWF0cml4KSksdGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPSExLHQ9ITApO2NvbnN0IGU9dGhpcy5jaGlsZHJlbjtmb3IobGV0IG49MCxyPWUubGVuZ3RoO248cjtuKyspZVtuXS51cGRhdGVNYXRyaXhXb3JsZCh0KX11cGRhdGVXb3JsZE1hdHJpeCh0LGUpe2NvbnN0IG49dGhpcy5wYXJlbnQ7aWYoITA9PT10JiZudWxsIT09biYmbi51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksdGhpcy5tYXRyaXhBdXRvVXBkYXRlJiZ0aGlzLnVwZGF0ZU1hdHJpeCgpLCEwPT09dGhpcy5tYXRyaXhXb3JsZEF1dG9VcGRhdGUmJihudWxsPT09dGhpcy5wYXJlbnQ/dGhpcy5tYXRyaXhXb3JsZC5jb3B5KHRoaXMubWF0cml4KTp0aGlzLm1hdHJpeFdvcmxkLm11bHRpcGx5TWF0cmljZXModGhpcy5wYXJlbnQubWF0cml4V29ybGQsdGhpcy5tYXRyaXgpKSwhMD09PWUpe2NvbnN0IHQ9dGhpcy5jaGlsZHJlbjtmb3IobGV0IGU9MCxuPXQubGVuZ3RoO2U8bjtlKyspdFtlXS51cGRhdGVXb3JsZE1hdHJpeCghMSwhMCl9fXRvSlNPTih0KXtjb25zdCBlPXZvaWQgMD09PXR8fCJzdHJpbmciPT10eXBlb2YgdCxuPXt9O2UmJih0PXtnZW9tZXRyaWVzOnt9LG1hdGVyaWFsczp7fSx0ZXh0dXJlczp7fSxpbWFnZXM6e30sc2hhcGVzOnt9LHNrZWxldG9uczp7fSxhbmltYXRpb25zOnt9LG5vZGVzOnt9fSxuLm1ldGFkYXRhPXt2ZXJzaW9uOjQuNix0eXBlOiJPYmplY3QiLGdlbmVyYXRvcjoiT2JqZWN0M0QudG9KU09OIn0pO2NvbnN0IHI9e307ZnVuY3Rpb24gaShlLG4pe3JldHVybiB2b2lkIDA9PT1lW24udXVpZF0mJihlW24udXVpZF09bi50b0pTT04odCkpLG4udXVpZH1pZihyLnV1aWQ9dGhpcy51dWlkLHIudHlwZT10aGlzLnR5cGUsIiIhPT10aGlzLm5hbWUmJihyLm5hbWU9dGhpcy5uYW1lKSwhMD09PXRoaXMuY2FzdFNoYWRvdyYmKHIuY2FzdFNoYWRvdz0hMCksITA9PT10aGlzLnJlY2VpdmVTaGFkb3cmJihyLnJlY2VpdmVTaGFkb3c9ITApLCExPT09dGhpcy52aXNpYmxlJiYoci52aXNpYmxlPSExKSwhMT09PXRoaXMuZnJ1c3R1bUN1bGxlZCYmKHIuZnJ1c3R1bUN1bGxlZD0hMSksMCE9PXRoaXMucmVuZGVyT3JkZXImJihyLnJlbmRlck9yZGVyPXRoaXMucmVuZGVyT3JkZXIpLE9iamVjdC5rZXlzKHRoaXMudXNlckRhdGEpLmxlbmd0aD4wJiYoci51c2VyRGF0YT10aGlzLnVzZXJEYXRhKSxyLmxheWVycz10aGlzLmxheWVycy5tYXNrLHIubWF0cml4PXRoaXMubWF0cml4LnRvQXJyYXkoKSxyLnVwPXRoaXMudXAudG9BcnJheSgpLCExPT09dGhpcy5tYXRyaXhBdXRvVXBkYXRlJiYoci5tYXRyaXhBdXRvVXBkYXRlPSExKSx0aGlzLmlzSW5zdGFuY2VkTWVzaCYmKHIudHlwZT0iSW5zdGFuY2VkTWVzaCIsci5jb3VudD10aGlzLmNvdW50LHIuaW5zdGFuY2VNYXRyaXg9dGhpcy5pbnN0YW5jZU1hdHJpeC50b0pTT04oKSxudWxsIT09dGhpcy5pbnN0YW5jZUNvbG9yJiYoci5pbnN0YW5jZUNvbG9yPXRoaXMuaW5zdGFuY2VDb2xvci50b0pTT04oKSkpLHRoaXMuaXNCYXRjaGVkTWVzaCYmKHIudHlwZT0iQmF0Y2hlZE1lc2giLHIucGVyT2JqZWN0RnJ1c3R1bUN1bGxlZD10aGlzLnBlck9iamVjdEZydXN0dW1DdWxsZWQsci5zb3J0T2JqZWN0cz10aGlzLnNvcnRPYmplY3RzLHIuZHJhd1Jhbmdlcz10aGlzLl9kcmF3UmFuZ2VzLHIucmVzZXJ2ZWRSYW5nZXM9dGhpcy5fcmVzZXJ2ZWRSYW5nZXMsci52aXNpYmlsaXR5PXRoaXMuX3Zpc2liaWxpdHksci5hY3RpdmU9dGhpcy5fYWN0aXZlLHIuYm91bmRzPXRoaXMuX2JvdW5kcy5tYXAoKHQ9Pih7Ym94SW5pdGlhbGl6ZWQ6dC5ib3hJbml0aWFsaXplZCxib3hNaW46dC5ib3gubWluLnRvQXJyYXkoKSxib3hNYXg6dC5ib3gubWF4LnRvQXJyYXkoKSxzcGhlcmVJbml0aWFsaXplZDp0LnNwaGVyZUluaXRpYWxpemVkLHNwaGVyZVJhZGl1czp0LnNwaGVyZS5yYWRpdXMsc3BoZXJlQ2VudGVyOnQuc3BoZXJlLmNlbnRlci50b0FycmF5KCl9KSkpLHIubWF4SW5zdGFuY2VDb3VudD10aGlzLl9tYXhJbnN0YW5jZUNvdW50LHIubWF4VmVydGV4Q291bnQ9dGhpcy5fbWF4VmVydGV4Q291bnQsci5tYXhJbmRleENvdW50PXRoaXMuX21heEluZGV4Q291bnQsci5nZW9tZXRyeUluaXRpYWxpemVkPXRoaXMuX2dlb21ldHJ5SW5pdGlhbGl6ZWQsci5nZW9tZXRyeUNvdW50PXRoaXMuX2dlb21ldHJ5Q291bnQsci5tYXRyaWNlc1RleHR1cmU9dGhpcy5fbWF0cmljZXNUZXh0dXJlLnRvSlNPTih0KSxudWxsIT09dGhpcy5fY29sb3JzVGV4dHVyZSYmKHIuY29sb3JzVGV4dHVyZT10aGlzLl9jb2xvcnNUZXh0dXJlLnRvSlNPTih0KSksbnVsbCE9PXRoaXMuYm91bmRpbmdTcGhlcmUmJihyLmJvdW5kaW5nU3BoZXJlPXtjZW50ZXI6ci5ib3VuZGluZ1NwaGVyZS5jZW50ZXIudG9BcnJheSgpLHJhZGl1czpyLmJvdW5kaW5nU3BoZXJlLnJhZGl1c30pLG51bGwhPT10aGlzLmJvdW5kaW5nQm94JiYoci5ib3VuZGluZ0JveD17bWluOnIuYm91bmRpbmdCb3gubWluLnRvQXJyYXkoKSxtYXg6ci5ib3VuZGluZ0JveC5tYXgudG9BcnJheSgpfSkpLHRoaXMuaXNTY2VuZSl0aGlzLmJhY2tncm91bmQmJih0aGlzLmJhY2tncm91bmQuaXNDb2xvcj9yLmJhY2tncm91bmQ9dGhpcy5iYWNrZ3JvdW5kLnRvSlNPTigpOnRoaXMuYmFja2dyb3VuZC5pc1RleHR1cmUmJihyLmJhY2tncm91bmQ9dGhpcy5iYWNrZ3JvdW5kLnRvSlNPTih0KS51dWlkKSksdGhpcy5lbnZpcm9ubWVudCYmdGhpcy5lbnZpcm9ubWVudC5pc1RleHR1cmUmJiEwIT09dGhpcy5lbnZpcm9ubWVudC5pc1JlbmRlclRhcmdldFRleHR1cmUmJihyLmVudmlyb25tZW50PXRoaXMuZW52aXJvbm1lbnQudG9KU09OKHQpLnV1aWQpO2Vsc2UgaWYodGhpcy5pc01lc2h8fHRoaXMuaXNMaW5lfHx0aGlzLmlzUG9pbnRzKXtyLmdlb21ldHJ5PWkodC5nZW9tZXRyaWVzLHRoaXMuZ2VvbWV0cnkpO2NvbnN0IGU9dGhpcy5nZW9tZXRyeS5wYXJhbWV0ZXJzO2lmKHZvaWQgMCE9PWUmJnZvaWQgMCE9PWUuc2hhcGVzKXtjb25zdCBuPWUuc2hhcGVzO2lmKEFycmF5LmlzQXJyYXkobikpZm9yKGxldCBlPTAscj1uLmxlbmd0aDtlPHI7ZSsrKXtjb25zdCByPW5bZV07aSh0LnNoYXBlcyxyKX1lbHNlIGkodC5zaGFwZXMsbil9fWlmKHRoaXMuaXNTa2lubmVkTWVzaCYmKHIuYmluZE1vZGU9dGhpcy5iaW5kTW9kZSxyLmJpbmRNYXRyaXg9dGhpcy5iaW5kTWF0cml4LnRvQXJyYXkoKSx2b2lkIDAhPT10aGlzLnNrZWxldG9uJiYoaSh0LnNrZWxldG9ucyx0aGlzLnNrZWxldG9uKSxyLnNrZWxldG9uPXRoaXMuc2tlbGV0b24udXVpZCkpLHZvaWQgMCE9PXRoaXMubWF0ZXJpYWwpaWYoQXJyYXkuaXNBcnJheSh0aGlzLm1hdGVyaWFsKSl7Y29uc3QgZT1bXTtmb3IobGV0IG49MCxyPXRoaXMubWF0ZXJpYWwubGVuZ3RoO248cjtuKyspZS5wdXNoKGkodC5tYXRlcmlhbHMsdGhpcy5tYXRlcmlhbFtuXSkpO3IubWF0ZXJpYWw9ZX1lbHNlIHIubWF0ZXJpYWw9aSh0Lm1hdGVyaWFscyx0aGlzLm1hdGVyaWFsKTtpZih0aGlzLmNoaWxkcmVuLmxlbmd0aD4wKXtyLmNoaWxkcmVuPVtdO2ZvcihsZXQgZT0wO2U8dGhpcy5jaGlsZHJlbi5sZW5ndGg7ZSsrKXIuY2hpbGRyZW4ucHVzaCh0aGlzLmNoaWxkcmVuW2VdLnRvSlNPTih0KS5vYmplY3QpfWlmKHRoaXMuYW5pbWF0aW9ucy5sZW5ndGg+MCl7ci5hbmltYXRpb25zPVtdO2ZvcihsZXQgZT0wO2U8dGhpcy5hbmltYXRpb25zLmxlbmd0aDtlKyspe2NvbnN0IG49dGhpcy5hbmltYXRpb25zW2VdO3IuYW5pbWF0aW9ucy5wdXNoKGkodC5hbmltYXRpb25zLG4pKX19aWYoZSl7Y29uc3QgZT1vKHQuZ2VvbWV0cmllcykscj1vKHQubWF0ZXJpYWxzKSxpPW8odC50ZXh0dXJlcykscz1vKHQuaW1hZ2VzKSxhPW8odC5zaGFwZXMpLHU9byh0LnNrZWxldG9ucyksYz1vKHQuYW5pbWF0aW9ucyksbD1vKHQubm9kZXMpO2UubGVuZ3RoPjAmJihuLmdlb21ldHJpZXM9ZSksci5sZW5ndGg+MCYmKG4ubWF0ZXJpYWxzPXIpLGkubGVuZ3RoPjAmJihuLnRleHR1cmVzPWkpLHMubGVuZ3RoPjAmJihuLmltYWdlcz1zKSxhLmxlbmd0aD4wJiYobi5zaGFwZXM9YSksdS5sZW5ndGg+MCYmKG4uc2tlbGV0b25zPXUpLGMubGVuZ3RoPjAmJihuLmFuaW1hdGlvbnM9YyksbC5sZW5ndGg+MCYmKG4ubm9kZXM9bCl9cmV0dXJuIG4ub2JqZWN0PXIsbjtmdW5jdGlvbiBvKHQpe2NvbnN0IGU9W107Zm9yKGNvbnN0IG4gaW4gdCl7Y29uc3Qgcj10W25dO2RlbGV0ZSByLm1ldGFkYXRhLGUucHVzaChyKX1yZXR1cm4gZX19Y2xvbmUodCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMsdCl9Y29weSh0LGU9ITApe2lmKHRoaXMubmFtZT10Lm5hbWUsdGhpcy51cC5jb3B5KHQudXApLHRoaXMucG9zaXRpb24uY29weSh0LnBvc2l0aW9uKSx0aGlzLnJvdGF0aW9uLm9yZGVyPXQucm90YXRpb24ub3JkZXIsdGhpcy5xdWF0ZXJuaW9uLmNvcHkodC5xdWF0ZXJuaW9uKSx0aGlzLnNjYWxlLmNvcHkodC5zY2FsZSksdGhpcy5tYXRyaXguY29weSh0Lm1hdHJpeCksdGhpcy5tYXRyaXhXb3JsZC5jb3B5KHQubWF0cml4V29ybGQpLHRoaXMubWF0cml4QXV0b1VwZGF0ZT10Lm1hdHJpeEF1dG9VcGRhdGUsdGhpcy5tYXRyaXhXb3JsZEF1dG9VcGRhdGU9dC5tYXRyaXhXb3JsZEF1dG9VcGRhdGUsdGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPXQubWF0cml4V29ybGROZWVkc1VwZGF0ZSx0aGlzLmxheWVycy5tYXNrPXQubGF5ZXJzLm1hc2ssdGhpcy52aXNpYmxlPXQudmlzaWJsZSx0aGlzLmNhc3RTaGFkb3c9dC5jYXN0U2hhZG93LHRoaXMucmVjZWl2ZVNoYWRvdz10LnJlY2VpdmVTaGFkb3csdGhpcy5mcnVzdHVtQ3VsbGVkPXQuZnJ1c3R1bUN1bGxlZCx0aGlzLnJlbmRlck9yZGVyPXQucmVuZGVyT3JkZXIsdGhpcy5hbmltYXRpb25zPXQuYW5pbWF0aW9ucy5zbGljZSgpLHRoaXMudXNlckRhdGE9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0LnVzZXJEYXRhKSksITA9PT1lKWZvcihsZXQgZT0wO2U8dC5jaGlsZHJlbi5sZW5ndGg7ZSsrKXtjb25zdCBuPXQuY2hpbGRyZW5bZV07dGhpcy5hZGQobi5jbG9uZSgpKX1yZXR1cm4gdGhpc319X2YuREVGQVVMVF9VUD1uZXcgeWgoMCwxLDApLF9mLkRFRkFVTFRfTUFUUklYX0FVVE9fVVBEQVRFPSEwLF9mLkRFRkFVTFRfTUFUUklYX1dPUkxEX0FVVE9fVVBEQVRFPSEwO2NvbnN0IHhmPXthbGljZWJsdWU6MTU3OTIzODMsYW50aXF1ZXdoaXRlOjE2NDQ0Mzc1LGFxdWE6NjU1MzUsYXF1YW1hcmluZTo4Mzg4NTY0LGF6dXJlOjE1Nzk0MTc1LGJlaWdlOjE2MTE5MjYwLGJpc3F1ZToxNjc3MDI0NCxibGFjazowLGJsYW5jaGVkYWxtb25kOjE2NzcyMDQ1LGJsdWU6MjU1LGJsdWV2aW9sZXQ6OTA1NTIwMixicm93bjoxMDgyNDIzNCxidXJseXdvb2Q6MTQ1OTYyMzEsY2FkZXRibHVlOjYyNjY1MjgsY2hhcnRyZXVzZTo4Mzg4MzUyLGNob2NvbGF0ZToxMzc4OTQ3MCxjb3JhbDoxNjc0NDI3Mixjb3JuZmxvd2VyYmx1ZTo2NTkxOTgxLGNvcm5zaWxrOjE2Nzc1Mzg4LGNyaW1zb246MTQ0MjMxMDAsY3lhbjo2NTUzNSxkYXJrYmx1ZToxMzksZGFya2N5YW46MzU3MjMsZGFya2dvbGRlbnJvZDoxMjA5MjkzOSxkYXJrZ3JheToxMTExOTAxNyxkYXJrZ3JlZW46MjU2MDAsZGFya2dyZXk6MTExMTkwMTcsZGFya2toYWtpOjEyNDMzMjU5LGRhcmttYWdlbnRhOjkxMDk2NDMsZGFya29saXZlZ3JlZW46NTU5Nzk5OSxkYXJrb3JhbmdlOjE2NzQ3NTIwLGRhcmtvcmNoaWQ6MTAwNDAwMTIsZGFya3JlZDo5MTA5NTA0LGRhcmtzYWxtb246MTUzMDg0MTAsZGFya3NlYWdyZWVuOjk0MTk5MTksZGFya3NsYXRlYmx1ZTo0NzM0MzQ3LGRhcmtzbGF0ZWdyYXk6MzEwMDQ5NSxkYXJrc2xhdGVncmV5OjMxMDA0OTUsZGFya3R1cnF1b2lzZTo1Mjk0NSxkYXJrdmlvbGV0Ojk2OTk1MzksZGVlcHBpbms6MTY3MTY5NDcsZGVlcHNreWJsdWU6NDkxNTEsZGltZ3JheTo2OTA4MjY1LGRpbWdyZXk6NjkwODI2NSxkb2RnZXJibHVlOjIwMDMxOTksZmlyZWJyaWNrOjExNjc0MTQ2LGZsb3JhbHdoaXRlOjE2Nzc1OTIwLGZvcmVzdGdyZWVuOjIyNjM4NDIsZnVjaHNpYToxNjcxMTkzNSxnYWluc2Jvcm86MTQ0NzQ0NjAsZ2hvc3R3aGl0ZToxNjMxNjY3MSxnb2xkOjE2NzY2NzIwLGdvbGRlbnJvZDoxNDMyOTEyMCxncmF5Ojg0MjE1MDQsZ3JlZW46MzI3NjgsZ3JlZW55ZWxsb3c6MTE0MDMwNTUsZ3JleTo4NDIxNTA0LGhvbmV5ZGV3OjE1Nzk0MTYwLGhvdHBpbms6MTY3Mzg3NDAsaW5kaWFucmVkOjEzNDU4NTI0LGluZGlnbzo0OTE1MzMwLGl2b3J5OjE2Nzc3MjAwLGtoYWtpOjE1Nzg3NjYwLGxhdmVuZGVyOjE1MTMyNDEwLGxhdmVuZGVyYmx1c2g6MTY3NzMzNjUsbGF3bmdyZWVuOjgxOTA5NzYsbGVtb25jaGlmZm9uOjE2Nzc1ODg1LGxpZ2h0Ymx1ZToxMTM5MzI1NCxsaWdodGNvcmFsOjE1NzYxNTM2LGxpZ2h0Y3lhbjoxNDc0NTU5OSxsaWdodGdvbGRlbnJvZHllbGxvdzoxNjQ0ODIxMCxsaWdodGdyYXk6MTM4ODIzMjMsbGlnaHRncmVlbjo5NDk4MjU2LGxpZ2h0Z3JleToxMzg4MjMyMyxsaWdodHBpbms6MTY3NTg0NjUsbGlnaHRzYWxtb246MTY3NTI3NjIsbGlnaHRzZWFncmVlbjoyMTQyODkwLGxpZ2h0c2t5Ymx1ZTo4OTAwMzQ2LGxpZ2h0c2xhdGVncmF5Ojc4MzM3NTMsbGlnaHRzbGF0ZWdyZXk6NzgzMzc1MyxsaWdodHN0ZWVsYmx1ZToxMTU4NDczNCxsaWdodHllbGxvdzoxNjc3NzE4NCxsaW1lOjY1MjgwLGxpbWVncmVlbjozMzI5MzMwLGxpbmVuOjE2NDQ1NjcwLG1hZ2VudGE6MTY3MTE5MzUsbWFyb29uOjgzODg2MDgsbWVkaXVtYXF1YW1hcmluZTo2NzM3MzIyLG1lZGl1bWJsdWU6MjA1LG1lZGl1bW9yY2hpZDoxMjIxMTY2NyxtZWRpdW1wdXJwbGU6OTY2MjY4MyxtZWRpdW1zZWFncmVlbjozOTc4MDk3LG1lZGl1bXNsYXRlYmx1ZTo4MDg3NzkwLG1lZGl1bXNwcmluZ2dyZWVuOjY0MTU0LG1lZGl1bXR1cnF1b2lzZTo0NzcyMzAwLG1lZGl1bXZpb2xldHJlZDoxMzA0NzE3MyxtaWRuaWdodGJsdWU6MTY0NDkxMixtaW50Y3JlYW06MTYxMjE4NTAsbWlzdHlyb3NlOjE2NzcwMjczLG1vY2Nhc2luOjE2NzcwMjI5LG5hdmFqb3doaXRlOjE2NzY4Njg1LG5hdnk6MTI4LG9sZGxhY2U6MTY2NDM1NTgsb2xpdmU6ODQyMTM3NixvbGl2ZWRyYWI6NzA0ODczOSxvcmFuZ2U6MTY3NTM5MjAsb3JhbmdlcmVkOjE2NzI5MzQ0LG9yY2hpZDoxNDMxNTczNCxwYWxlZ29sZGVucm9kOjE1NjU3MTMwLHBhbGVncmVlbjoxMDAyNTg4MCxwYWxldHVycXVvaXNlOjExNTI5OTY2LHBhbGV2aW9sZXRyZWQ6MTQzODEyMDMscGFwYXlhd2hpcDoxNjc3MzA3NyxwZWFjaHB1ZmY6MTY3Njc2NzMscGVydToxMzQ2ODk5MSxwaW5rOjE2NzYxMDM1LHBsdW06MTQ1MjQ2MzcscG93ZGVyYmx1ZToxMTU5MTkxMCxwdXJwbGU6ODM4ODczNixyZWJlY2NhcHVycGxlOjY2OTc4ODEscmVkOjE2NzExNjgwLHJvc3licm93bjoxMjM1NzUxOSxyb3lhbGJsdWU6NDI4Njk0NSxzYWRkbGVicm93bjo5MTI3MTg3LHNhbG1vbjoxNjQxNjg4MixzYW5keWJyb3duOjE2MDMyODY0LHNlYWdyZWVuOjMwNTAzMjcsc2Vhc2hlbGw6MTY3NzQ2Mzgsc2llbm5hOjEwNTA2Nzk3LHNpbHZlcjoxMjYzMjI1Nixza3libHVlOjg5MDAzMzEsc2xhdGVibHVlOjY5NzAwNjEsc2xhdGVncmF5OjczNzI5NDQsc2xhdGVncmV5OjczNzI5NDQsc25vdzoxNjc3NTkzMCxzcHJpbmdncmVlbjo2NTQwNyxzdGVlbGJsdWU6NDYyMDk4MCx0YW46MTM4MDg3ODAsdGVhbDozMjg5Nix0aGlzdGxlOjE0MjA0ODg4LHRvbWF0bzoxNjczNzA5NSx0dXJxdW9pc2U6NDI1MTg1Nix2aW9sZXQ6MTU2MzEwODYsd2hlYXQ6MTYxMTMzMzEsd2hpdGU6MTY3NzcyMTUsd2hpdGVzbW9rZToxNjExOTI4NSx5ZWxsb3c6MTY3NzY5NjAseWVsbG93Z3JlZW46MTAxNDUwNzR9LHdmPXtoOjAsczowLGw6MH0sYmY9e2g6MCxzOjAsbDowfTtmdW5jdGlvbiBEZih0LGUsbil7cmV0dXJuIG48MCYmKG4rPTEpLG4+MSYmKG4tPTEpLG48MS82P3QrNiooZS10KSpuOm48LjU/ZTpuPDIvMz90KzYqKGUtdCkqKDIvMy1uKTp0fWNsYXNzIEVme2NvbnN0cnVjdG9yKHQsZSxuKXtyZXR1cm4gdGhpcy5pc0NvbG9yPSEwLHRoaXMucj0xLHRoaXMuZz0xLHRoaXMuYj0xLHRoaXMuc2V0KHQsZSxuKX1zZXQodCxlLG4pe2lmKHZvaWQgMD09PWUmJnZvaWQgMD09PW4pe2NvbnN0IGU9dDtlJiZlLmlzQ29sb3I/dGhpcy5jb3B5KGUpOiJudW1iZXIiPT10eXBlb2YgZT90aGlzLnNldEhleChlKToic3RyaW5nIj09dHlwZW9mIGUmJnRoaXMuc2V0U3R5bGUoZSl9ZWxzZSB0aGlzLnNldFJHQih0LGUsbik7cmV0dXJuIHRoaXN9c2V0U2NhbGFyKHQpe3JldHVybiB0aGlzLnI9dCx0aGlzLmc9dCx0aGlzLmI9dCx0aGlzfXNldEhleCh0LGU9cWwpe3JldHVybiB0PU1hdGguZmxvb3IodCksdGhpcy5yPSh0Pj4xNiYyNTUpLzI1NSx0aGlzLmc9KHQ+PjgmMjU1KS8yNTUsdGhpcy5iPSgyNTUmdCkvMjU1LGloLnRvV29ya2luZ0NvbG9yU3BhY2UodGhpcyxlKSx0aGlzfXNldFJHQih0LGUsbixyPWloLndvcmtpbmdDb2xvclNwYWNlKXtyZXR1cm4gdGhpcy5yPXQsdGhpcy5nPWUsdGhpcy5iPW4saWgudG9Xb3JraW5nQ29sb3JTcGFjZSh0aGlzLHIpLHRoaXN9c2V0SFNMKHQsZSxuLHI9aWgud29ya2luZ0NvbG9yU3BhY2Upe2lmKHQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4odCVlK2UpJWV9KHQsMSksZT1LbChlLDAsMSksbj1LbChuLDAsMSksMD09PWUpdGhpcy5yPXRoaXMuZz10aGlzLmI9bjtlbHNle2NvbnN0IHI9bjw9LjU/biooMStlKTpuK2UtbiplLGk9MipuLXI7dGhpcy5yPURmKGkscix0KzEvMyksdGhpcy5nPURmKGkscix0KSx0aGlzLmI9RGYoaSxyLHQtMS8zKX1yZXR1cm4gaWgudG9Xb3JraW5nQ29sb3JTcGFjZSh0aGlzLHIpLHRoaXN9c2V0U3R5bGUodCxlPXFsKXtmdW5jdGlvbiBuKHQpe3ZvaWQgMCE9PXQmJnBhcnNlRmxvYXQodCl9bGV0IHI7aWYocj0vXihcdyspXCgoW15cKV0qKVwpLy5leGVjKHQpKXtsZXQgdDtjb25zdCBpPXJbMV0sbz1yWzJdO3N3aXRjaChpKXtjYXNlInJnYiI6Y2FzZSJyZ2JhIjppZih0PS9eXHMqKFxkKylccyosXHMqKFxkKylccyosXHMqKFxkKylccyooPzosXHMqKFxkKlwuP1xkKylccyopPyQvLmV4ZWMobykpcmV0dXJuIG4odFs0XSksdGhpcy5zZXRSR0IoTWF0aC5taW4oMjU1LHBhcnNlSW50KHRbMV0sMTApKS8yNTUsTWF0aC5taW4oMjU1LHBhcnNlSW50KHRbMl0sMTApKS8yNTUsTWF0aC5taW4oMjU1LHBhcnNlSW50KHRbM10sMTApKS8yNTUsZSk7aWYodD0vXlxzKihcZCspXCVccyosXHMqKFxkKylcJVxzKixccyooXGQrKVwlXHMqKD86LFxzKihcZCpcLj9cZCspXHMqKT8kLy5leGVjKG8pKXJldHVybiBuKHRbNF0pLHRoaXMuc2V0UkdCKE1hdGgubWluKDEwMCxwYXJzZUludCh0WzFdLDEwKSkvMTAwLE1hdGgubWluKDEwMCxwYXJzZUludCh0WzJdLDEwKSkvMTAwLE1hdGgubWluKDEwMCxwYXJzZUludCh0WzNdLDEwKSkvMTAwLGUpO2JyZWFrO2Nhc2UiaHNsIjpjYXNlImhzbGEiOmlmKHQ9L15ccyooXGQqXC4/XGQrKVxzKixccyooXGQqXC4/XGQrKVwlXHMqLFxzKihcZCpcLj9cZCspXCVccyooPzosXHMqKFxkKlwuP1xkKylccyopPyQvLmV4ZWMobykpcmV0dXJuIG4odFs0XSksdGhpcy5zZXRIU0wocGFyc2VGbG9hdCh0WzFdKS8zNjAscGFyc2VGbG9hdCh0WzJdKS8xMDAscGFyc2VGbG9hdCh0WzNdKS8xMDAsZSl9fWVsc2UgaWYocj0vXlwjKFtBLUZhLWZcZF0rKSQvLmV4ZWModCkpe2NvbnN0IHQ9clsxXSxuPXQubGVuZ3RoO2lmKDM9PT1uKXJldHVybiB0aGlzLnNldFJHQihwYXJzZUludCh0LmNoYXJBdCgwKSwxNikvMTUscGFyc2VJbnQodC5jaGFyQXQoMSksMTYpLzE1LHBhcnNlSW50KHQuY2hhckF0KDIpLDE2KS8xNSxlKTtpZig2PT09bilyZXR1cm4gdGhpcy5zZXRIZXgocGFyc2VJbnQodCwxNiksZSl9ZWxzZSBpZih0JiZ0Lmxlbmd0aD4wKXJldHVybiB0aGlzLnNldENvbG9yTmFtZSh0LGUpO3JldHVybiB0aGlzfXNldENvbG9yTmFtZSh0LGU9cWwpe2NvbnN0IG49eGZbdC50b0xvd2VyQ2FzZSgpXTtyZXR1cm4gdm9pZCAwIT09biYmdGhpcy5zZXRIZXgobixlKSx0aGlzfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMucix0aGlzLmcsdGhpcy5iKX1jb3B5KHQpe3JldHVybiB0aGlzLnI9dC5yLHRoaXMuZz10LmcsdGhpcy5iPXQuYix0aGlzfWNvcHlTUkdCVG9MaW5lYXIodCl7cmV0dXJuIHRoaXMucj1vaCh0LnIpLHRoaXMuZz1vaCh0LmcpLHRoaXMuYj1vaCh0LmIpLHRoaXN9Y29weUxpbmVhclRvU1JHQih0KXtyZXR1cm4gdGhpcy5yPXNoKHQuciksdGhpcy5nPXNoKHQuZyksdGhpcy5iPXNoKHQuYiksdGhpc31jb252ZXJ0U1JHQlRvTGluZWFyKCl7cmV0dXJuIHRoaXMuY29weVNSR0JUb0xpbmVhcih0aGlzKSx0aGlzfWNvbnZlcnRMaW5lYXJUb1NSR0IoKXtyZXR1cm4gdGhpcy5jb3B5TGluZWFyVG9TUkdCKHRoaXMpLHRoaXN9Z2V0SGV4KHQ9cWwpe3JldHVybiBpaC5mcm9tV29ya2luZ0NvbG9yU3BhY2UoQ2YuY29weSh0aGlzKSx0KSw2NTUzNipNYXRoLnJvdW5kKEtsKDI1NSpDZi5yLDAsMjU1KSkrMjU2Kk1hdGgucm91bmQoS2woMjU1KkNmLmcsMCwyNTUpKStNYXRoLnJvdW5kKEtsKDI1NSpDZi5iLDAsMjU1KSl9Z2V0SGV4U3RyaW5nKHQ9cWwpe3JldHVybigiMDAwMDAwIit0aGlzLmdldEhleCh0KS50b1N0cmluZygxNikpLnNsaWNlKC02KX1nZXRIU0wodCxlPWloLndvcmtpbmdDb2xvclNwYWNlKXtpaC5mcm9tV29ya2luZ0NvbG9yU3BhY2UoQ2YuY29weSh0aGlzKSxlKTtjb25zdCBuPUNmLnIscj1DZi5nLGk9Q2YuYixvPU1hdGgubWF4KG4scixpKSxzPU1hdGgubWluKG4scixpKTtsZXQgYSx1O2NvbnN0IGM9KHMrbykvMjtpZihzPT09bylhPTAsdT0wO2Vsc2V7Y29uc3QgdD1vLXM7c3dpdGNoKHU9Yzw9LjU/dC8obytzKTp0LygyLW8tcyksbyl7Y2FzZSBuOmE9KHItaSkvdCsocjxpPzY6MCk7YnJlYWs7Y2FzZSByOmE9KGktbikvdCsyO2JyZWFrO2Nhc2UgaTphPShuLXIpL3QrNH1hLz02fXJldHVybiB0Lmg9YSx0LnM9dSx0Lmw9Yyx0fWdldFJHQih0LGU9aWgud29ya2luZ0NvbG9yU3BhY2Upe3JldHVybiBpaC5mcm9tV29ya2luZ0NvbG9yU3BhY2UoQ2YuY29weSh0aGlzKSxlKSx0LnI9Q2Yucix0Lmc9Q2YuZyx0LmI9Q2YuYix0fWdldFN0eWxlKHQ9cWwpe2loLmZyb21Xb3JraW5nQ29sb3JTcGFjZShDZi5jb3B5KHRoaXMpLHQpO2NvbnN0IGU9Q2YucixuPUNmLmcscj1DZi5iO3JldHVybiB0IT09cWw/YGNvbG9yKCR7dH0gJHtlLnRvRml4ZWQoMyl9ICR7bi50b0ZpeGVkKDMpfSAke3IudG9GaXhlZCgzKX0pYDpgcmdiKCR7TWF0aC5yb3VuZCgyNTUqZSl9LCR7TWF0aC5yb3VuZCgyNTUqbil9LCR7TWF0aC5yb3VuZCgyNTUqcil9KWB9b2Zmc2V0SFNMKHQsZSxuKXtyZXR1cm4gdGhpcy5nZXRIU0wod2YpLHRoaXMuc2V0SFNMKHdmLmgrdCx3Zi5zK2Usd2YubCtuKX1hZGQodCl7cmV0dXJuIHRoaXMucis9dC5yLHRoaXMuZys9dC5nLHRoaXMuYis9dC5iLHRoaXN9YWRkQ29sb3JzKHQsZSl7cmV0dXJuIHRoaXMucj10LnIrZS5yLHRoaXMuZz10LmcrZS5nLHRoaXMuYj10LmIrZS5iLHRoaXN9YWRkU2NhbGFyKHQpe3JldHVybiB0aGlzLnIrPXQsdGhpcy5nKz10LHRoaXMuYis9dCx0aGlzfXN1Yih0KXtyZXR1cm4gdGhpcy5yPU1hdGgubWF4KDAsdGhpcy5yLXQuciksdGhpcy5nPU1hdGgubWF4KDAsdGhpcy5nLXQuZyksdGhpcy5iPU1hdGgubWF4KDAsdGhpcy5iLXQuYiksdGhpc31tdWx0aXBseSh0KXtyZXR1cm4gdGhpcy5yKj10LnIsdGhpcy5nKj10LmcsdGhpcy5iKj10LmIsdGhpc31tdWx0aXBseVNjYWxhcih0KXtyZXR1cm4gdGhpcy5yKj10LHRoaXMuZyo9dCx0aGlzLmIqPXQsdGhpc31sZXJwKHQsZSl7cmV0dXJuIHRoaXMucis9KHQuci10aGlzLnIpKmUsdGhpcy5nKz0odC5nLXRoaXMuZykqZSx0aGlzLmIrPSh0LmItdGhpcy5iKSplLHRoaXN9bGVycENvbG9ycyh0LGUsbil7cmV0dXJuIHRoaXMucj10LnIrKGUuci10LnIpKm4sdGhpcy5nPXQuZysoZS5nLXQuZykqbix0aGlzLmI9dC5iKyhlLmItdC5iKSpuLHRoaXN9bGVycEhTTCh0LGUpe3RoaXMuZ2V0SFNMKHdmKSx0LmdldEhTTChiZik7Y29uc3Qgbj1KbCh3Zi5oLGJmLmgsZSkscj1KbCh3Zi5zLGJmLnMsZSksaT1KbCh3Zi5sLGJmLmwsZSk7cmV0dXJuIHRoaXMuc2V0SFNMKG4scixpKSx0aGlzfXNldEZyb21WZWN0b3IzKHQpe3JldHVybiB0aGlzLnI9dC54LHRoaXMuZz10LnksdGhpcy5iPXQueix0aGlzfWFwcGx5TWF0cml4Myh0KXtjb25zdCBlPXRoaXMucixuPXRoaXMuZyxyPXRoaXMuYixpPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMucj1pWzBdKmUraVszXSpuK2lbNl0qcix0aGlzLmc9aVsxXSplK2lbNF0qbitpWzddKnIsdGhpcy5iPWlbMl0qZStpWzVdKm4raVs4XSpyLHRoaXN9ZXF1YWxzKHQpe3JldHVybiB0LnI9PT10aGlzLnImJnQuZz09PXRoaXMuZyYmdC5iPT09dGhpcy5ifWZyb21BcnJheSh0LGU9MCl7cmV0dXJuIHRoaXMucj10W2VdLHRoaXMuZz10W2UrMV0sdGhpcy5iPXRbZSsyXSx0aGlzfXRvQXJyYXkodD1bXSxlPTApe3JldHVybiB0W2VdPXRoaXMucix0W2UrMV09dGhpcy5nLHRbZSsyXT10aGlzLmIsdH1mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSl7cmV0dXJuIHRoaXMucj10LmdldFgoZSksdGhpcy5nPXQuZ2V0WShlKSx0aGlzLmI9dC5nZXRaKGUpLHRoaXN9dG9KU09OKCl7cmV0dXJuIHRoaXMuZ2V0SGV4KCl9KltTeW1ib2wuaXRlcmF0b3JdKCl7eWllbGQgdGhpcy5yLHlpZWxkIHRoaXMuZyx5aWVsZCB0aGlzLmJ9fWNvbnN0IENmPW5ldyBFZjtFZi5OQU1FUz14ZjtuZXcgeWgsbmV3IFFsO25ldyBZaCxuZXcgX2YsbmV3IHloLG5ldyBfaCxuZXcgX2gsbmV3IHloO25ldyBZaCxuZXcgY2xhc3N7Y29uc3RydWN0b3IodD1uZXcgeWgsZT1uZXcgeWgoMCwwLC0xKSl7dGhpcy5vcmlnaW49dCx0aGlzLmRpcmVjdGlvbj1lfXNldCh0LGUpe3JldHVybiB0aGlzLm9yaWdpbi5jb3B5KHQpLHRoaXMuZGlyZWN0aW9uLmNvcHkoZSksdGhpc31jb3B5KHQpe3JldHVybiB0aGlzLm9yaWdpbi5jb3B5KHQub3JpZ2luKSx0aGlzLmRpcmVjdGlvbi5jb3B5KHQuZGlyZWN0aW9uKSx0aGlzfWF0KHQsZSl7cmV0dXJuIGUuY29weSh0aGlzLm9yaWdpbikuYWRkU2NhbGVkVmVjdG9yKHRoaXMuZGlyZWN0aW9uLHQpfWxvb2tBdCh0KXtyZXR1cm4gdGhpcy5kaXJlY3Rpb24uY29weSh0KS5zdWIodGhpcy5vcmlnaW4pLm5vcm1hbGl6ZSgpLHRoaXN9cmVjYXN0KHQpe3JldHVybiB0aGlzLm9yaWdpbi5jb3B5KHRoaXMuYXQodCxraCkpLHRoaXN9Y2xvc2VzdFBvaW50VG9Qb2ludCh0LGUpe2Uuc3ViVmVjdG9ycyh0LHRoaXMub3JpZ2luKTtjb25zdCBuPWUuZG90KHRoaXMuZGlyZWN0aW9uKTtyZXR1cm4gbjwwP2UuY29weSh0aGlzLm9yaWdpbik6ZS5jb3B5KHRoaXMub3JpZ2luKS5hZGRTY2FsZWRWZWN0b3IodGhpcy5kaXJlY3Rpb24sbil9ZGlzdGFuY2VUb1BvaW50KHQpe3JldHVybiBNYXRoLnNxcnQodGhpcy5kaXN0YW5jZVNxVG9Qb2ludCh0KSl9ZGlzdGFuY2VTcVRvUG9pbnQodCl7Y29uc3QgZT1raC5zdWJWZWN0b3JzKHQsdGhpcy5vcmlnaW4pLmRvdCh0aGlzLmRpcmVjdGlvbik7cmV0dXJuIGU8MD90aGlzLm9yaWdpbi5kaXN0YW5jZVRvU3F1YXJlZCh0KTooa2guY29weSh0aGlzLm9yaWdpbikuYWRkU2NhbGVkVmVjdG9yKHRoaXMuZGlyZWN0aW9uLGUpLGtoLmRpc3RhbmNlVG9TcXVhcmVkKHQpKX1kaXN0YW5jZVNxVG9TZWdtZW50KHQsZSxuLHIpe3poLmNvcHkodCkuYWRkKGUpLm11bHRpcGx5U2NhbGFyKC41KSxqaC5jb3B5KGUpLnN1Yih0KS5ub3JtYWxpemUoKSxVaC5jb3B5KHRoaXMub3JpZ2luKS5zdWIoemgpO2NvbnN0IGk9LjUqdC5kaXN0YW5jZVRvKGUpLG89LXRoaXMuZGlyZWN0aW9uLmRvdChqaCkscz1VaC5kb3QodGhpcy5kaXJlY3Rpb24pLGE9LVVoLmRvdChqaCksdT1VaC5sZW5ndGhTcSgpLGM9TWF0aC5hYnMoMS1vKm8pO2xldCBsLGgsZixwO2lmKGM+MClpZihsPW8qYS1zLGg9bypzLWEscD1pKmMsbD49MClpZihoPj0tcClpZihoPD1wKXtjb25zdCB0PTEvYztsKj10LGgqPXQsZj1sKihsK28qaCsyKnMpK2gqKG8qbCtoKzIqYSkrdX1lbHNlIGg9aSxsPU1hdGgubWF4KDAsLShvKmgrcykpLGY9LWwqbCtoKihoKzIqYSkrdTtlbHNlIGg9LWksbD1NYXRoLm1heCgwLC0obypoK3MpKSxmPS1sKmwraCooaCsyKmEpK3U7ZWxzZSBoPD0tcD8obD1NYXRoLm1heCgwLC0oLW8qaStzKSksaD1sPjA/LWk6TWF0aC5taW4oTWF0aC5tYXgoLWksLWEpLGkpLGY9LWwqbCtoKihoKzIqYSkrdSk6aDw9cD8obD0wLGg9TWF0aC5taW4oTWF0aC5tYXgoLWksLWEpLGkpLGY9aCooaCsyKmEpK3UpOihsPU1hdGgubWF4KDAsLShvKmkrcykpLGg9bD4wP2k6TWF0aC5taW4oTWF0aC5tYXgoLWksLWEpLGkpLGY9LWwqbCtoKihoKzIqYSkrdSk7ZWxzZSBoPW8+MD8taTppLGw9TWF0aC5tYXgoMCwtKG8qaCtzKSksZj0tbCpsK2gqKGgrMiphKSt1O3JldHVybiBuJiZuLmNvcHkodGhpcy5vcmlnaW4pLmFkZFNjYWxlZFZlY3Rvcih0aGlzLmRpcmVjdGlvbixsKSxyJiZyLmNvcHkoemgpLmFkZFNjYWxlZFZlY3RvcihqaCxoKSxmfWludGVyc2VjdFNwaGVyZSh0LGUpe2toLnN1YlZlY3RvcnModC5jZW50ZXIsdGhpcy5vcmlnaW4pO2NvbnN0IG49a2guZG90KHRoaXMuZGlyZWN0aW9uKSxyPWtoLmRvdChraCktbipuLGk9dC5yYWRpdXMqdC5yYWRpdXM7aWYocj5pKXJldHVybiBudWxsO2NvbnN0IG89TWF0aC5zcXJ0KGktcikscz1uLW8sYT1uK287cmV0dXJuIGE8MD9udWxsOnM8MD90aGlzLmF0KGEsZSk6dGhpcy5hdChzLGUpfWludGVyc2VjdHNTcGhlcmUodCl7cmV0dXJuIHRoaXMuZGlzdGFuY2VTcVRvUG9pbnQodC5jZW50ZXIpPD10LnJhZGl1cyp0LnJhZGl1c31kaXN0YW5jZVRvUGxhbmUodCl7Y29uc3QgZT10Lm5vcm1hbC5kb3QodGhpcy5kaXJlY3Rpb24pO2lmKDA9PT1lKXJldHVybiAwPT09dC5kaXN0YW5jZVRvUG9pbnQodGhpcy5vcmlnaW4pPzA6bnVsbDtjb25zdCBuPS0odGhpcy5vcmlnaW4uZG90KHQubm9ybWFsKSt0LmNvbnN0YW50KS9lO3JldHVybiBuPj0wP246bnVsbH1pbnRlcnNlY3RQbGFuZSh0LGUpe2NvbnN0IG49dGhpcy5kaXN0YW5jZVRvUGxhbmUodCk7cmV0dXJuIG51bGw9PT1uP251bGw6dGhpcy5hdChuLGUpfWludGVyc2VjdHNQbGFuZSh0KXtjb25zdCBlPXQuZGlzdGFuY2VUb1BvaW50KHRoaXMub3JpZ2luKTtyZXR1cm4gMD09PWV8fHQubm9ybWFsLmRvdCh0aGlzLmRpcmVjdGlvbikqZTwwfWludGVyc2VjdEJveCh0LGUpe2xldCBuLHIsaSxvLHMsYTtjb25zdCB1PTEvdGhpcy5kaXJlY3Rpb24ueCxjPTEvdGhpcy5kaXJlY3Rpb24ueSxsPTEvdGhpcy5kaXJlY3Rpb24ueixoPXRoaXMub3JpZ2luO3JldHVybiB1Pj0wPyhuPSh0Lm1pbi54LWgueCkqdSxyPSh0Lm1heC54LWgueCkqdSk6KG49KHQubWF4LngtaC54KSp1LHI9KHQubWluLngtaC54KSp1KSxjPj0wPyhpPSh0Lm1pbi55LWgueSkqYyxvPSh0Lm1heC55LWgueSkqYyk6KGk9KHQubWF4LnktaC55KSpjLG89KHQubWluLnktaC55KSpjKSxuPm98fGk+cnx8KChpPm58fGlzTmFOKG4pKSYmKG49aSksKG88cnx8aXNOYU4ocikpJiYocj1vKSxsPj0wPyhzPSh0Lm1pbi56LWgueikqbCxhPSh0Lm1heC56LWgueikqbCk6KHM9KHQubWF4LnotaC56KSpsLGE9KHQubWluLnotaC56KSpsKSxuPmF8fHM+cil8fCgocz5ufHxuIT1uKSYmKG49cyksKGE8cnx8ciE9cikmJihyPWEpLHI8MCk/bnVsbDp0aGlzLmF0KG4+PTA/bjpyLGUpfWludGVyc2VjdHNCb3godCl7cmV0dXJuIG51bGwhPT10aGlzLmludGVyc2VjdEJveCh0LGtoKX1pbnRlcnNlY3RUcmlhbmdsZSh0LGUsbixyLGkpe3FoLnN1YlZlY3RvcnMoZSx0KSxWaC5zdWJWZWN0b3JzKG4sdCksR2guY3Jvc3NWZWN0b3JzKHFoLFZoKTtsZXQgbyxzPXRoaXMuZGlyZWN0aW9uLmRvdChHaCk7aWYocz4wKXtpZihyKXJldHVybiBudWxsO289MX1lbHNle2lmKCEoczwwKSlyZXR1cm4gbnVsbDtvPS0xLHM9LXN9VWguc3ViVmVjdG9ycyh0aGlzLm9yaWdpbix0KTtjb25zdCBhPW8qdGhpcy5kaXJlY3Rpb24uZG90KFZoLmNyb3NzVmVjdG9ycyhVaCxWaCkpO2lmKGE8MClyZXR1cm4gbnVsbDtjb25zdCB1PW8qdGhpcy5kaXJlY3Rpb24uZG90KHFoLmNyb3NzKFVoKSk7aWYodTwwfHxhK3U+cylyZXR1cm4gbnVsbDtjb25zdCBjPS1vKlVoLmRvdChHaCk7cmV0dXJuIGM8MD9udWxsOnRoaXMuYXQoYy9zLGkpfWFwcGx5TWF0cml4NCh0KXtyZXR1cm4gdGhpcy5vcmlnaW4uYXBwbHlNYXRyaXg0KHQpLHRoaXMuZGlyZWN0aW9uLnRyYW5zZm9ybURpcmVjdGlvbih0KSx0aGlzfWVxdWFscyh0KXtyZXR1cm4gdC5vcmlnaW4uZXF1YWxzKHRoaXMub3JpZ2luKSYmdC5kaXJlY3Rpb24uZXF1YWxzKHRoaXMuZGlyZWN0aW9uKX1jbG9uZSgpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX19LG5ldyBCaCxuZXcgeWg7Y29uc3QgU2Y9bmV3IGNsYXNze2NvbnN0cnVjdG9yKHQsZSxuKXtjb25zdCByPXRoaXM7bGV0IGksbz0hMSxzPTAsYT0wO2NvbnN0IHU9W107dGhpcy5vblN0YXJ0PXZvaWQgMCx0aGlzLm9uTG9hZD10LHRoaXMub25Qcm9ncmVzcz1lLHRoaXMub25FcnJvcj1uLHRoaXMuaXRlbVN0YXJ0PWZ1bmN0aW9uKHQpe2ErKywhMT09PW8mJnZvaWQgMCE9PXIub25TdGFydCYmci5vblN0YXJ0KHQscyxhKSxvPSEwfSx0aGlzLml0ZW1FbmQ9ZnVuY3Rpb24odCl7cysrLHZvaWQgMCE9PXIub25Qcm9ncmVzcyYmci5vblByb2dyZXNzKHQscyxhKSxzPT09YSYmKG89ITEsdm9pZCAwIT09ci5vbkxvYWQmJnIub25Mb2FkKCkpfSx0aGlzLml0ZW1FcnJvcj1mdW5jdGlvbih0KXt2b2lkIDAhPT1yLm9uRXJyb3ImJnIub25FcnJvcih0KX0sdGhpcy5yZXNvbHZlVVJMPWZ1bmN0aW9uKHQpe3JldHVybiBpP2kodCk6dH0sdGhpcy5zZXRVUkxNb2RpZmllcj1mdW5jdGlvbih0KXtyZXR1cm4gaT10LHRoaXN9LHRoaXMuYWRkSGFuZGxlcj1mdW5jdGlvbih0LGUpe3JldHVybiB1LnB1c2godCxlKSx0aGlzfSx0aGlzLnJlbW92ZUhhbmRsZXI9ZnVuY3Rpb24odCl7Y29uc3QgZT11LmluZGV4T2YodCk7cmV0dXJuLTEhPT1lJiZ1LnNwbGljZShlLDIpLHRoaXN9LHRoaXMuZ2V0SGFuZGxlcj1mdW5jdGlvbih0KXtmb3IobGV0IGU9MCxuPXUubGVuZ3RoO2U8bjtlKz0yKXtjb25zdCBuPXVbZV0scj11W2UrMV07aWYobi5nbG9iYWwmJihuLmxhc3RJbmRleD0wKSxuLnRlc3QodCkpcmV0dXJuIHJ9cmV0dXJuIG51bGx9fX07Y2xhc3MgQWZ7Y29uc3RydWN0b3IodCl7dGhpcy5tYW5hZ2VyPXZvaWQgMCE9PXQ/dDpTZix0aGlzLmNyb3NzT3JpZ2luPSJhbm9ueW1vdXMiLHRoaXMud2l0aENyZWRlbnRpYWxzPSExLHRoaXMucGF0aD0iIix0aGlzLnJlc291cmNlUGF0aD0iIix0aGlzLnJlcXVlc3RIZWFkZXI9e319bG9hZCgpe31sb2FkQXN5bmModCxlKXtjb25zdCBuPXRoaXM7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihyLGkpe24ubG9hZCh0LHIsZSxpKX0pKX1wYXJzZSgpe31zZXRDcm9zc09yaWdpbih0KXtyZXR1cm4gdGhpcy5jcm9zc09yaWdpbj10LHRoaXN9c2V0V2l0aENyZWRlbnRpYWxzKHQpe3JldHVybiB0aGlzLndpdGhDcmVkZW50aWFscz10LHRoaXN9c2V0UGF0aCh0KXtyZXR1cm4gdGhpcy5wYXRoPXQsdGhpc31zZXRSZXNvdXJjZVBhdGgodCl7cmV0dXJuIHRoaXMucmVzb3VyY2VQYXRoPXQsdGhpc31zZXRSZXF1ZXN0SGVhZGVyKHQpe3JldHVybiB0aGlzLnJlcXVlc3RIZWFkZXI9dCx0aGlzfX1BZi5ERUZBVUxUX01BVEVSSUFMX05BTUU9Il9fREVGQVVMVCI7RXJyb3I7ZnVuY3Rpb24gTmYoKXtyZXR1cm4gTmY9T2JqZWN0LmFzc2lnbj9PYmplY3QuYXNzaWduLmJpbmQoKTpmdW5jdGlvbih0KXtmb3IodmFyIGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXt2YXIgbj1hcmd1bWVudHNbZV07Zm9yKHZhciByIGluIG4pKHt9KS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4scikmJih0W3JdPW5bcl0pfXJldHVybiB0fSxOZi5hcHBseShudWxsLGFyZ3VtZW50cyl9InVuZGVmaW5lZCIhPXR5cGVvZiBfX1RIUkVFX0RFVlRPT0xTX18mJl9fVEhSRUVfREVWVE9PTFNfXy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgicmVnaXN0ZXIiLHtkZXRhaWw6e3JldmlzaW9uOiIxNzIifX0pKSwidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmKHdpbmRvdy5fX1RIUkVFX198fCh3aW5kb3cuX19USFJFRV9fPSIxNzIiKSk7dmFyIElmPXtlcHNpbG9uOjFlLTEyLG1hdHJpeDoiTWF0cml4IixudW1iZXI6Im51bWJlciIscHJlY2lzaW9uOjY0LHByZWRpY3RhYmxlOiExLHJhbmRvbVNlZWQ6bnVsbH07ZnVuY3Rpb24gTWYodCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0fWZ1bmN0aW9uIEZmKHQpe3JldHVybiEoIXR8fCJvYmplY3QiIT10eXBlb2YgdHx8ImZ1bmN0aW9uIiE9dHlwZW9mIHQuY29uc3RydWN0b3IpJiYoITA9PT10LmlzQmlnTnVtYmVyJiYib2JqZWN0Ij09dHlwZW9mIHQuY29uc3RydWN0b3IucHJvdG90eXBlJiYhMD09PXQuY29uc3RydWN0b3IucHJvdG90eXBlLmlzQmlnTnVtYmVyfHwiZnVuY3Rpb24iPT10eXBlb2YgdC5jb25zdHJ1Y3Rvci5pc0RlY2ltYWwmJiEwPT09dC5jb25zdHJ1Y3Rvci5pc0RlY2ltYWwodCkpfWZ1bmN0aW9uIFRmKHQpe3JldHVybiB0JiYib2JqZWN0Ij09dHlwZW9mIHQmJiEwPT09T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpLmlzQ29tcGxleHx8ITF9ZnVuY3Rpb24gT2YodCl7cmV0dXJuIHQmJiJvYmplY3QiPT10eXBlb2YgdCYmITA9PT1PYmplY3QuZ2V0UHJvdG90eXBlT2YodCkuaXNGcmFjdGlvbnx8ITF9ZnVuY3Rpb24gTGYodCl7cmV0dXJuIHQmJiEwPT09dC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuaXNVbml0fHwhMX1mdW5jdGlvbiBSZih0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHR9dmFyIEJmPUFycmF5LmlzQXJyYXk7ZnVuY3Rpb24ga2YodCl7cmV0dXJuIHQmJiEwPT09dC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuaXNNYXRyaXh8fCExfWZ1bmN0aW9uIHpmKHQpe3JldHVybiBBcnJheS5pc0FycmF5KHQpfHxrZih0KX1mdW5jdGlvbiBqZih0KXtyZXR1cm4gdCYmdC5pc0RlbnNlTWF0cml4JiYhMD09PXQuY29uc3RydWN0b3IucHJvdG90eXBlLmlzTWF0cml4fHwhMX1mdW5jdGlvbiBVZih0KXtyZXR1cm4gdCYmdC5pc1NwYXJzZU1hdHJpeCYmITA9PT10LmNvbnN0cnVjdG9yLnByb3RvdHlwZS5pc01hdHJpeHx8ITF9ZnVuY3Rpb24gcWYodCl7cmV0dXJuIHQmJiEwPT09dC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuaXNSYW5nZXx8ITF9ZnVuY3Rpb24gVmYodCl7cmV0dXJuIHQmJiEwPT09dC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuaXNJbmRleHx8ITF9ZnVuY3Rpb24gR2YodCl7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgdH1mdW5jdGlvbiBZZih0KXtyZXR1cm4gdCYmITA9PT10LmNvbnN0cnVjdG9yLnByb3RvdHlwZS5pc1Jlc3VsdFNldHx8ITF9ZnVuY3Rpb24gWGYodCl7cmV0dXJuIHQmJiEwPT09dC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuaXNIZWxwfHwhMX1mdW5jdGlvbiBXZih0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdH1mdW5jdGlvbiBIZih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIERhdGV9ZnVuY3Rpb24gWmYodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBSZWdFeHB9ZnVuY3Rpb24gS2YodCl7cmV0dXJuISghdHx8Im9iamVjdCIhPXR5cGVvZiB0fHx0LmNvbnN0cnVjdG9yIT09T2JqZWN0fHxUZih0KXx8T2YodCkpfWZ1bmN0aW9uIEpmKHQpe3JldHVybiBudWxsPT09dH1mdW5jdGlvbiBRZih0KXtyZXR1cm4gdm9pZCAwPT09dH1mdW5jdGlvbiAkZih0KXtyZXR1cm4gdCYmITA9PT10LmlzQWNjZXNzb3JOb2RlJiYhMD09PXQuY29uc3RydWN0b3IucHJvdG90eXBlLmlzTm9kZXx8ITF9ZnVuY3Rpb24gdHAodCl7cmV0dXJuIHQmJiEwPT09dC5pc0FycmF5Tm9kZSYmITA9PT10LmNvbnN0cnVjdG9yLnByb3RvdHlwZS5pc05vZGV8fCExfWZ1bmN0aW9uIGVwKHQpe3JldHVybiB0JiYhMD09PXQuaXNBc3NpZ25tZW50Tm9kZSYmITA9PT10LmNvbnN0cnVjdG9yLnByb3RvdHlwZS5pc05vZGV8fCExfWZ1bmN0aW9uIG5wKHQpe3JldHVybiB0JiYhMD09PXQuaXNCbG9ja05vZGUmJiEwPT09dC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuaXNOb2RlfHwhMX1mdW5jdGlvbiBycCh0KXtyZXR1cm4gdCYmITA9PT10LmlzQ29uZGl0aW9uYWxOb2RlJiYhMD09PXQuY29uc3RydWN0b3IucHJvdG90eXBlLmlzTm9kZXx8ITF9ZnVuY3Rpb24gaXAodCl7cmV0dXJuIHQmJiEwPT09dC5pc0NvbnN0YW50Tm9kZSYmITA9PT10LmNvbnN0cnVjdG9yLnByb3RvdHlwZS5pc05vZGV8fCExfWZ1bmN0aW9uIG9wKHQpe3JldHVybiB0JiYhMD09PXQuaXNGdW5jdGlvbkFzc2lnbm1lbnROb2RlJiYhMD09PXQuY29uc3RydWN0b3IucHJvdG90eXBlLmlzTm9kZXx8ITF9ZnVuY3Rpb24gc3AodCl7cmV0dXJuIHQmJiEwPT09dC5pc0Z1bmN0aW9uTm9kZSYmITA9PT10LmNvbnN0cnVjdG9yLnByb3RvdHlwZS5pc05vZGV8fCExfWZ1bmN0aW9uIGFwKHQpe3JldHVybiB0JiYhMD09PXQuaXNJbmRleE5vZGUmJiEwPT09dC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuaXNOb2RlfHwhMX1mdW5jdGlvbiB1cCh0KXtyZXR1cm4gdCYmITA9PT10LmlzTm9kZSYmITA9PT10LmNvbnN0cnVjdG9yLnByb3RvdHlwZS5pc05vZGV8fCExfWZ1bmN0aW9uIGNwKHQpe3JldHVybiB0JiYhMD09PXQuaXNPYmplY3ROb2RlJiYhMD09PXQuY29uc3RydWN0b3IucHJvdG90eXBlLmlzTm9kZXx8ITF9ZnVuY3Rpb24gbHAodCl7cmV0dXJuIHQmJiEwPT09dC5pc09wZXJhdG9yTm9kZSYmITA9PT10LmNvbnN0cnVjdG9yLnByb3RvdHlwZS5pc05vZGV8fCExfWZ1bmN0aW9uIGhwKHQpe3JldHVybiB0JiYhMD09PXQuaXNQYXJlbnRoZXNpc05vZGUmJiEwPT09dC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuaXNOb2RlfHwhMX1mdW5jdGlvbiBmcCh0KXtyZXR1cm4gdCYmITA9PT10LmlzUmFuZ2VOb2RlJiYhMD09PXQuY29uc3RydWN0b3IucHJvdG90eXBlLmlzTm9kZXx8ITF9ZnVuY3Rpb24gcHAodCl7cmV0dXJuIHQmJiEwPT09dC5pc1JlbGF0aW9uYWxOb2RlJiYhMD09PXQuY29uc3RydWN0b3IucHJvdG90eXBlLmlzTm9kZXx8ITF9ZnVuY3Rpb24gZHAodCl7cmV0dXJuIHQmJiEwPT09dC5pc1N5bWJvbE5vZGUmJiEwPT09dC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuaXNOb2RlfHwhMX1mdW5jdGlvbiBncCh0KXtyZXR1cm4gdCYmITA9PT10LmNvbnN0cnVjdG9yLnByb3RvdHlwZS5pc0NoYWlufHwhMX1mdW5jdGlvbiB5cCh0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4ib2JqZWN0Ij09PWU/bnVsbD09PXQ/Im51bGwiOkZmKHQpPyJCaWdOdW1iZXIiOnQuY29uc3RydWN0b3ImJnQuY29uc3RydWN0b3IubmFtZT90LmNvbnN0cnVjdG9yLm5hbWU6Ik9iamVjdCI6ZX1mdW5jdGlvbiBtcCh0KXt2YXIgZT10eXBlb2YgdDtpZigibnVtYmVyIj09PWV8fCJzdHJpbmciPT09ZXx8ImJvb2xlYW4iPT09ZXx8bnVsbD09dClyZXR1cm4gdDtpZigiZnVuY3Rpb24iPT10eXBlb2YgdC5jbG9uZSlyZXR1cm4gdC5jbG9uZSgpO2lmKEFycmF5LmlzQXJyYXkodCkpcmV0dXJuIHQubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gbXAodCl9KSk7aWYodCBpbnN0YW5jZW9mIERhdGUpcmV0dXJuIG5ldyBEYXRlKHQudmFsdWVPZigpKTtpZihGZih0KSlyZXR1cm4gdDtpZih0IGluc3RhbmNlb2YgUmVnRXhwKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjbG9uZSAiK3QpO3JldHVybiBmdW5jdGlvbih0LGUpe3ZhciBuPXt9O2Zvcih2YXIgciBpbiB0KV9wKHQscikmJihuW3JdPWUodFtyXSkpO3JldHVybiBufSh0LG1wKX1mdW5jdGlvbiB2cCh0LGUpe3ZhciBuLHIsaTtpZihBcnJheS5pc0FycmF5KHQpKXtpZighQXJyYXkuaXNBcnJheShlKXx8dC5sZW5ndGghPT1lLmxlbmd0aClyZXR1cm4hMTtmb3Iocj0wLGk9dC5sZW5ndGg7cjxpO3IrKylpZighdnAodFtyXSxlW3JdKSlyZXR1cm4hMTtyZXR1cm4hMH1pZigiZnVuY3Rpb24iPT10eXBlb2YgdClyZXR1cm4gdD09PWU7aWYodCBpbnN0YW5jZW9mIE9iamVjdCl7aWYoQXJyYXkuaXNBcnJheShlKXx8IShlIGluc3RhbmNlb2YgT2JqZWN0KSlyZXR1cm4hMTtmb3IobiBpbiB0KWlmKCEobiBpbiBlKXx8IXZwKHRbbl0sZVtuXSkpcmV0dXJuITE7Zm9yKG4gaW4gZSlpZighKG4gaW4gdCkpcmV0dXJuITE7cmV0dXJuITB9cmV0dXJuIHQ9PT1lfWZ1bmN0aW9uIF9wKHQsZSl7cmV0dXJuIHQmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsZSl9dmFyIHhwPWZ1bmN0aW9uKHQpe2lmKHQpdGhyb3cgbmV3IEVycm9yKCJUaGUgZ2xvYmFsIGNvbmZpZyBpcyByZWFkb25seS4gXG5QbGVhc2UgY3JlYXRlIGEgbWF0aGpzIGluc3RhbmNlIGlmIHlvdSB3YW50IHRvIGNoYW5nZSB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uLiBcbkV4YW1wbGU6XG5cbiAgaW1wb3J0IHsgY3JlYXRlLCBhbGwgfSBmcm9tICdtYXRoanMnO1xuICBjb25zdCBtYXRoanMgPSBjcmVhdGUoYWxsKTtcbiAgbWF0aGpzLmNvbmZpZyh7IG51bWJlcjogJ0JpZ051bWJlcicgfSk7XG4iKTtyZXR1cm4gT2JqZWN0LmZyZWV6ZShJZil9O2Z1bmN0aW9uIHdwKCl7cmV0dXJuITB9ZnVuY3Rpb24gYnAoKXtyZXR1cm4hMX1mdW5jdGlvbiBEcCgpe31OZih4cCxJZix7TUFUUklYX09QVElPTlM6WyJNYXRyaXgiLCJBcnJheSJdLE5VTUJFUl9PUFRJT05TOlsibnVtYmVyIiwiQmlnTnVtYmVyIiwiRnJhY3Rpb24iXX0pO2NvbnN0IEVwPSJBcmd1bWVudCBpcyBub3QgYSB0eXBlZC1mdW5jdGlvbi4iO3ZhciBDcD1mdW5jdGlvbiB0KCl7ZnVuY3Rpb24gZSh0KXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHQmJm51bGwhPT10JiZ0LmNvbnN0cnVjdG9yPT09T2JqZWN0fWNvbnN0IG49W3tuYW1lOiJudW1iZXIiLHRlc3Q6ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0fX0se25hbWU6InN0cmluZyIsdGVzdDpmdW5jdGlvbih0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHR9fSx7bmFtZToiYm9vbGVhbiIsdGVzdDpmdW5jdGlvbih0KXtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiB0fX0se25hbWU6IkZ1bmN0aW9uIix0ZXN0OmZ1bmN0aW9uKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0fX0se25hbWU6IkFycmF5Iix0ZXN0OkFycmF5LmlzQXJyYXl9LHtuYW1lOiJEYXRlIix0ZXN0OmZ1bmN0aW9uKHQpe3JldHVybiB0IGluc3RhbmNlb2YgRGF0ZX19LHtuYW1lOiJSZWdFeHAiLHRlc3Q6ZnVuY3Rpb24odCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBSZWdFeHB9fSx7bmFtZToiT2JqZWN0Iix0ZXN0OmV9LHtuYW1lOiJudWxsIix0ZXN0OmZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT09dH19LHtuYW1lOiJ1bmRlZmluZWQiLHRlc3Q6ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMD09PXR9fV0scj17bmFtZToiYW55Iix0ZXN0OndwLGlzQW55OiEwfTtsZXQgaSxvLHM9MCxhPXtjcmVhdGVDb3VudDowfTtmdW5jdGlvbiB1KHQpe2NvbnN0IGU9aS5nZXQodCk7aWYoZSlyZXR1cm4gZTtsZXQgbj0nVW5rbm93biB0eXBlICInK3QrJyInO2NvbnN0IHI9dC50b0xvd2VyQ2FzZSgpO2xldCBzO2ZvcihzIG9mIG8paWYocy50b0xvd2VyQ2FzZSgpPT09cil7bis9Jy4gRGlkIHlvdSBtZWFuICInK3MrJyIgPyc7YnJlYWt9dGhyb3cgbmV3IFR5cGVFcnJvcihuKX1mdW5jdGlvbiBjKHQpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXToiYW55Ijtjb25zdCBuPWU/dShlKS5pbmRleDpvLmxlbmd0aCxyPVtdO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7KytlKXtpZighdFtlXXx8InN0cmluZyIhPXR5cGVvZiB0W2VdLm5hbWV8fCJmdW5jdGlvbiIhPXR5cGVvZiB0W2VdLnRlc3QpdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IHdpdGggcHJvcGVydGllcyB7bmFtZTogc3RyaW5nLCB0ZXN0OiBmdW5jdGlvbn0gZXhwZWN0ZWQiKTtjb25zdCBvPXRbZV0ubmFtZTtpZihpLmhhcyhvKSl0aHJvdyBuZXcgVHlwZUVycm9yKCdEdXBsaWNhdGUgdHlwZSBuYW1lICInK28rJyInKTtyLnB1c2gobyksaS5zZXQobyx7bmFtZTpvLHRlc3Q6dFtlXS50ZXN0LGlzQW55OnRbZV0uaXNBbnksaW5kZXg6bitlLGNvbnZlcnNpb25zVG86W119KX1jb25zdCBzPW8uc2xpY2Uobik7bz1vLnNsaWNlKDAsbikuY29uY2F0KHIpLmNvbmNhdChzKTtmb3IobGV0IHQ9bityLmxlbmd0aDt0PG8ubGVuZ3RoOysrdClpLmdldChvW3RdKS5pbmRleD10fWZ1bmN0aW9uIGwoKXtpPW5ldyBNYXAsbz1bXSxzPTAsYyhbcl0sITEpfWZ1bmN0aW9uIGgodCl7Y29uc3QgZT1vLmZpbHRlcigoZT0+e2NvbnN0IG49aS5nZXQoZSk7cmV0dXJuIW4uaXNBbnkmJm4udGVzdCh0KX0pKTtyZXR1cm4gZS5sZW5ndGg/ZTpbImFueSJdfWZ1bmN0aW9uIGYodCl7cmV0dXJuIHQmJiJmdW5jdGlvbiI9PXR5cGVvZiB0JiYiX3R5cGVkRnVuY3Rpb25EYXRhImluIHR9ZnVuY3Rpb24gcCh0LGUsbil7aWYoIWYodCkpdGhyb3cgbmV3IFR5cGVFcnJvcihFcCk7Y29uc3Qgcj1uJiZuLmV4YWN0LGk9dihBcnJheS5pc0FycmF5KGUpP2Uuam9pbigiLCIpOmUpLG89ZChpKTtpZighcnx8byBpbiB0LnNpZ25hdHVyZXMpe2NvbnN0IGU9dC5fdHlwZWRGdW5jdGlvbkRhdGEuc2lnbmF0dXJlTWFwLmdldChvKTtpZihlKXJldHVybiBlfWNvbnN0IHM9aS5sZW5ndGg7bGV0IGEsdTtpZihyKXtsZXQgZTtmb3IoZSBpbiBhPVtdLHQuc2lnbmF0dXJlcylhLnB1c2godC5fdHlwZWRGdW5jdGlvbkRhdGEuc2lnbmF0dXJlTWFwLmdldChlKSl9ZWxzZSBhPXQuX3R5cGVkRnVuY3Rpb25EYXRhLnNpZ25hdHVyZXM7Zm9yKGxldCB0PTA7dDxzOysrdCl7Y29uc3QgZT1pW3RdLG49W107bGV0IHI7Zm9yKHIgb2YgYSl7Y29uc3QgaT1iKHIucGFyYW1zLHQpO2lmKGkmJighZS5yZXN0UGFyYW18fGkucmVzdFBhcmFtKSl7aWYoIWkuaGFzQW55KXtjb25zdCB0PW0oaSk7aWYoZS50eXBlcy5zb21lKChlPT4hdC5oYXMoZS5uYW1lKSkpKWNvbnRpbnVlfW4ucHVzaChyKX19aWYoYT1uLDA9PT1hLmxlbmd0aClicmVha31mb3IodSBvZiBhKWlmKHUucGFyYW1zLmxlbmd0aDw9cylyZXR1cm4gdTt0aHJvdyBuZXcgVHlwZUVycm9yKCJTaWduYXR1cmUgbm90IGZvdW5kIChzaWduYXR1cmU6ICIrKHQubmFtZXx8InVubmFtZWQiKSsiKCIrZChpLCIsICIpKyIpKSIpfWZ1bmN0aW9uIGQodCl7bGV0IGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOiIsIjtyZXR1cm4gdC5tYXAoKHQ9PnQubmFtZSkpLmpvaW4oZSl9ZnVuY3Rpb24gZyh0KXtjb25zdCBlPTA9PT10LmluZGV4T2YoIi4uLiIpLG49KGU/dC5sZW5ndGg+Mz90LnNsaWNlKDMpOiJhbnkiOnQpLnNwbGl0KCJ8IikubWFwKCh0PT51KHQudHJpbSgpKSkpO2xldCByPSExLGk9ZT8iLi4uIjoiIjtyZXR1cm57dHlwZXM6bi5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiByPXQuaXNBbnl8fHIsaSs9dC5uYW1lKyJ8Iix7bmFtZTp0Lm5hbWUsdHlwZUluZGV4OnQuaW5kZXgsdGVzdDp0LnRlc3QsaXNBbnk6dC5pc0FueSxjb252ZXJzaW9uOm51bGwsY29udmVyc2lvbkluZGV4Oi0xfX0pKSxuYW1lOmkuc2xpY2UoMCwtMSksaGFzQW55OnIsaGFzQ29udmVyc2lvbjohMSxyZXN0UGFyYW06ZX19ZnVuY3Rpb24geSh0KXtjb25zdCBlPWZ1bmN0aW9uKHQpe2lmKDA9PT10Lmxlbmd0aClyZXR1cm5bXTtjb25zdCBlPXQubWFwKHUpO3QubGVuZ3RoPjEmJmUuc29ydCgoKHQsZSk9PnQuaW5kZXgtZS5pbmRleCkpO2xldCBuPWVbMF0uY29udmVyc2lvbnNUbztpZigxPT09dC5sZW5ndGgpcmV0dXJuIG47bj1uLmNvbmNhdChbXSk7Y29uc3Qgcj1uZXcgU2V0KHQpO2ZvcihsZXQgdD0xO3Q8ZS5sZW5ndGg7Kyt0KXtsZXQgaTtmb3IoaSBvZiBlW3RdLmNvbnZlcnNpb25zVG8pci5oYXMoaS5mcm9tKXx8KG4ucHVzaChpKSxyLmFkZChpLmZyb20pKX1yZXR1cm4gbn0odC50eXBlcy5tYXAoKHQ9PnQubmFtZSkpKTtsZXQgbj10Lmhhc0FueSxyPXQubmFtZTtjb25zdCBpPWUubWFwKChmdW5jdGlvbih0KXtjb25zdCBlPXUodC5mcm9tKTtyZXR1cm4gbj1lLmlzQW55fHxuLHIrPSJ8Iit0LmZyb20se25hbWU6dC5mcm9tLHR5cGVJbmRleDplLmluZGV4LHRlc3Q6ZS50ZXN0LGlzQW55OmUuaXNBbnksY29udmVyc2lvbjp0LGNvbnZlcnNpb25JbmRleDp0LmluZGV4fX0pKTtyZXR1cm57dHlwZXM6dC50eXBlcy5jb25jYXQoaSksbmFtZTpyLGhhc0FueTpuLGhhc0NvbnZlcnNpb246aS5sZW5ndGg+MCxyZXN0UGFyYW06dC5yZXN0UGFyYW19fWZ1bmN0aW9uIG0odCl7cmV0dXJuIHQudHlwZVNldHx8KHQudHlwZVNldD1uZXcgU2V0LHQudHlwZXMuZm9yRWFjaCgoZT0+dC50eXBlU2V0LmFkZChlLm5hbWUpKSkpLHQudHlwZVNldH1mdW5jdGlvbiB2KHQpe2NvbnN0IGU9W107aWYoInN0cmluZyIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoIlNpZ25hdHVyZXMgbXVzdCBiZSBzdHJpbmdzIik7Y29uc3Qgbj10LnRyaW0oKTtpZigiIj09PW4pcmV0dXJuIGU7Y29uc3Qgcj1uLnNwbGl0KCIsIik7Zm9yKGxldCB0PTA7dDxyLmxlbmd0aDsrK3Qpe2NvbnN0IG49ZyhyW3RdLnRyaW0oKSk7aWYobi5yZXN0UGFyYW0mJnQhPT1yLmxlbmd0aC0xKXRocm93IG5ldyBTeW50YXhFcnJvcignVW5leHBlY3RlZCByZXN0IHBhcmFtZXRlciAiJytyW3RdKyciOiBvbmx5IGFsbG93ZWQgZm9yIHRoZSBsYXN0IHBhcmFtZXRlcicpO2lmKDA9PT1uLnR5cGVzLmxlbmd0aClyZXR1cm4gbnVsbDtlLnB1c2gobil9cmV0dXJuIGV9ZnVuY3Rpb24gXyh0KXtjb25zdCBlPWoodCk7cmV0dXJuISFlJiZlLnJlc3RQYXJhbX1mdW5jdGlvbiB4KHQpe2lmKCF0fHwwPT09dC50eXBlcy5sZW5ndGgpcmV0dXJuIHdwO2lmKDE9PT10LnR5cGVzLmxlbmd0aClyZXR1cm4gdSh0LnR5cGVzWzBdLm5hbWUpLnRlc3Q7aWYoMj09PXQudHlwZXMubGVuZ3RoKXtjb25zdCBlPXUodC50eXBlc1swXS5uYW1lKS50ZXN0LG49dSh0LnR5cGVzWzFdLm5hbWUpLnRlc3Q7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBlKHQpfHxuKHQpfX17Y29uc3QgZT10LnR5cGVzLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHUodC5uYW1lKS50ZXN0fSkpO3JldHVybiBmdW5jdGlvbih0KXtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rKylpZihlW25dKHQpKXJldHVybiEwO3JldHVybiExfX19ZnVuY3Rpb24gdyh0KXtsZXQgZSxuLHI7aWYoXyh0KSl7ZT16KHQpLm1hcCh4KTtjb25zdCBuPWUubGVuZ3RoLHI9eChqKHQpKSxpPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT1uO2U8dC5sZW5ndGg7ZSsrKWlmKCFyKHRbZV0pKXJldHVybiExO3JldHVybiEwfTtyZXR1cm4gZnVuY3Rpb24odCl7Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspaWYoIWVbbl0odFtuXSkpcmV0dXJuITE7cmV0dXJuIGkodCkmJnQubGVuZ3RoPj1uKzF9fXJldHVybiAwPT09dC5sZW5ndGg/ZnVuY3Rpb24odCl7cmV0dXJuIDA9PT10Lmxlbmd0aH06MT09PXQubGVuZ3RoPyhuPXgodFswXSksZnVuY3Rpb24odCl7cmV0dXJuIG4odFswXSkmJjE9PT10Lmxlbmd0aH0pOjI9PT10Lmxlbmd0aD8obj14KHRbMF0pLHI9eCh0WzFdKSxmdW5jdGlvbih0KXtyZXR1cm4gbih0WzBdKSYmcih0WzFdKSYmMj09PXQubGVuZ3RofSk6KGU9dC5tYXAoeCksZnVuY3Rpb24odCl7Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspaWYoIWVbbl0odFtuXSkpcmV0dXJuITE7cmV0dXJuIHQubGVuZ3RoPT09ZS5sZW5ndGh9KX1mdW5jdGlvbiBiKHQsZSl7cmV0dXJuIGU8dC5sZW5ndGg/dFtlXTpfKHQpP2oodCk6bnVsbH1mdW5jdGlvbiBEKHQsZSl7Y29uc3Qgbj1iKHQsZSk7cmV0dXJuIG4/bShuKTpuZXcgU2V0fWZ1bmN0aW9uIEUodCl7cmV0dXJuIG51bGw9PT10LmNvbnZlcnNpb258fHZvaWQgMD09PXQuY29udmVyc2lvbn1mdW5jdGlvbiBDKHQsZSl7Y29uc3Qgbj1uZXcgU2V0O3JldHVybiB0LmZvckVhY2goKHQ9Pntjb25zdCByPUQodC5wYXJhbXMsZSk7bGV0IGk7Zm9yKGkgb2YgciluLmFkZChpKX0pKSxuLmhhcygiYW55Iik/WyJhbnkiXTpBcnJheS5mcm9tKG4pfWZ1bmN0aW9uIFModCxlLG4pe2xldCByLGk7Y29uc3Qgbz10fHwidW5uYW1lZCI7bGV0IHMsYT1uO2ZvcihzPTA7czxlLmxlbmd0aDtzKyspe2NvbnN0IHQ9W107aWYoYS5mb3JFYWNoKChuPT57Y29uc3Qgcj14KGIobi5wYXJhbXMscykpOyhzPG4ucGFyYW1zLmxlbmd0aHx8XyhuLnBhcmFtcykpJiZyKGVbc10pJiZ0LnB1c2gobil9KSksMD09PXQubGVuZ3RoKXtpZihpPUMoYSxzKSxpLmxlbmd0aD4wKXtjb25zdCB0PWgoZVtzXSk7cmV0dXJuIHI9bmV3IFR5cGVFcnJvcigiVW5leHBlY3RlZCB0eXBlIG9mIGFyZ3VtZW50IGluIGZ1bmN0aW9uICIrbysiIChleHBlY3RlZDogIitpLmpvaW4oIiBvciAiKSsiLCBhY3R1YWw6ICIrdC5qb2luKCIgfCAiKSsiLCBpbmRleDogIitzKyIpIiksci5kYXRhPXtjYXRlZ29yeToid3JvbmdUeXBlIixmbjpvLGluZGV4OnMsYWN0dWFsOnQsZXhwZWN0ZWQ6aX0scn19ZWxzZSBhPXR9Y29uc3QgdT1hLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIF8odC5wYXJhbXMpPzEvMDp0LnBhcmFtcy5sZW5ndGh9KSk7aWYoZS5sZW5ndGg8TWF0aC5taW4uYXBwbHkobnVsbCx1KSlyZXR1cm4gaT1DKGEscykscj1uZXcgVHlwZUVycm9yKCJUb28gZmV3IGFyZ3VtZW50cyBpbiBmdW5jdGlvbiAiK28rIiAoZXhwZWN0ZWQ6ICIraS5qb2luKCIgb3IgIikrIiwgaW5kZXg6ICIrZS5sZW5ndGgrIikiKSxyLmRhdGE9e2NhdGVnb3J5OiJ0b29GZXdBcmdzIixmbjpvLGluZGV4OmUubGVuZ3RoLGV4cGVjdGVkOml9LHI7Y29uc3QgYz1NYXRoLm1heC5hcHBseShudWxsLHUpO2lmKGUubGVuZ3RoPmMpcmV0dXJuIHI9bmV3IFR5cGVFcnJvcigiVG9vIG1hbnkgYXJndW1lbnRzIGluIGZ1bmN0aW9uICIrbysiIChleHBlY3RlZDogIitjKyIsIGFjdHVhbDogIitlLmxlbmd0aCsiKSIpLHIuZGF0YT17Y2F0ZWdvcnk6InRvb01hbnlBcmdzIixmbjpvLGluZGV4OmUubGVuZ3RoLGV4cGVjdGVkTGVuZ3RoOmN9LHI7Y29uc3QgbD1bXTtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoOysrdClsLnB1c2goaChlW3RdKS5qb2luKCJ8IikpO3JldHVybiByPW5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50cyBvZiB0eXBlICInK2wuam9pbigiLCAiKSsnIiBkbyBub3QgbWF0Y2ggYW55IG9mIHRoZSBkZWZpbmVkIHNpZ25hdHVyZXMgb2YgZnVuY3Rpb24gJytvKyIuIiksci5kYXRhPXtjYXRlZ29yeToibWlzbWF0Y2giLGFjdHVhbDpsfSxyfWZ1bmN0aW9uIEEodCl7bGV0IGU9by5sZW5ndGgrMTtmb3IobGV0IG49MDtuPHQudHlwZXMubGVuZ3RoO24rKylFKHQudHlwZXNbbl0pJiYoZT1NYXRoLm1pbihlLHQudHlwZXNbbl0udHlwZUluZGV4KSk7cmV0dXJuIGV9ZnVuY3Rpb24gTih0KXtsZXQgZT1zKzE7Zm9yKGxldCBuPTA7bjx0LnR5cGVzLmxlbmd0aDtuKyspRSh0LnR5cGVzW25dKXx8KGU9TWF0aC5taW4oZSx0LnR5cGVzW25dLmNvbnZlcnNpb25JbmRleCkpO3JldHVybiBlfWZ1bmN0aW9uIEkodCxlKXtpZih0Lmhhc0FueSl7aWYoIWUuaGFzQW55KXJldHVybiAxfWVsc2UgaWYoZS5oYXNBbnkpcmV0dXJuLTE7aWYodC5yZXN0UGFyYW0pe2lmKCFlLnJlc3RQYXJhbSlyZXR1cm4gMX1lbHNlIGlmKGUucmVzdFBhcmFtKXJldHVybi0xO2lmKHQuaGFzQ29udmVyc2lvbil7aWYoIWUuaGFzQ29udmVyc2lvbilyZXR1cm4gMX1lbHNlIGlmKGUuaGFzQ29udmVyc2lvbilyZXR1cm4tMTtjb25zdCBuPUEodCktQShlKTtpZihuPDApcmV0dXJuLTE7aWYobj4wKXJldHVybiAxO2NvbnN0IHI9Tih0KS1OKGUpO3JldHVybiByPDA/LTE6cj4wPzE6MH1mdW5jdGlvbiBNKHQsZSl7Y29uc3Qgbj10LnBhcmFtcyxyPWUucGFyYW1zLGk9aihuKSxvPWoocikscz1fKG4pLGE9XyhyKTtpZihzJiZpLmhhc0FueSl7aWYoIWF8fCFvLmhhc0FueSlyZXR1cm4gMX1lbHNlIGlmKGEmJm8uaGFzQW55KXJldHVybi0xO2xldCB1LGM9MCxsPTA7Zm9yKHUgb2Ygbil1Lmhhc0FueSYmKytjLHUuaGFzQ29udmVyc2lvbiYmKytsO2xldCBoPTAsZj0wO2Zvcih1IG9mIHIpdS5oYXNBbnkmJisraCx1Lmhhc0NvbnZlcnNpb24mJisrZjtpZihjIT09aClyZXR1cm4gYy1oO2lmKHMmJmkuaGFzQ29udmVyc2lvbil7aWYoIWF8fCFvLmhhc0NvbnZlcnNpb24pcmV0dXJuIDF9ZWxzZSBpZihhJiZvLmhhc0NvbnZlcnNpb24pcmV0dXJuLTE7aWYobCE9PWYpcmV0dXJuIGwtZjtpZihzKXtpZighYSlyZXR1cm4gMX1lbHNlIGlmKGEpcmV0dXJuLTE7Y29uc3QgcD0obi5sZW5ndGgtci5sZW5ndGgpKihzPy0xOjEpO2lmKDAhPT1wKXJldHVybiBwO2NvbnN0IGQ9W107bGV0IGcseT0wO2ZvcihsZXQgdD0wO3Q8bi5sZW5ndGg7Kyt0KXtjb25zdCBlPUkoblt0XSxyW3RdKTtkLnB1c2goZSkseSs9ZX1pZigwIT09eSlyZXR1cm4geTtmb3IoZyBvZiBkKWlmKDAhPT1nKXJldHVybiBnO3JldHVybiAwfWZ1bmN0aW9uIEYodCxlKXtsZXQgbj1lO2lmKHQuc29tZSgodD0+dC5oYXNDb252ZXJzaW9uKSkpe2NvbnN0IHI9Xyh0KSxpPXQubWFwKFQpO249ZnVuY3Rpb24oKXtjb25zdCB0PVtdLG49cj9hcmd1bWVudHMubGVuZ3RoLTE6YXJndW1lbnRzLmxlbmd0aDtmb3IobGV0IGU9MDtlPG47ZSsrKXRbZV09aVtlXShhcmd1bWVudHNbZV0pO3JldHVybiByJiYodFtuXT1hcmd1bWVudHNbbl0ubWFwKGlbbl0pKSxlLmFwcGx5KHRoaXMsdCl9fWxldCByPW47aWYoXyh0KSl7Y29uc3QgZT10Lmxlbmd0aC0xO3I9ZnVuY3Rpb24oKXtyZXR1cm4gbi5hcHBseSh0aGlzLFUoYXJndW1lbnRzLDAsZSkuY29uY2F0KFtVKGFyZ3VtZW50cyxlKV0pKX19cmV0dXJuIHJ9ZnVuY3Rpb24gVCh0KXtsZXQgZSxuLHIsaTtjb25zdCBvPVtdLHM9W107c3dpdGNoKHQudHlwZXMuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5jb252ZXJzaW9uJiYoby5wdXNoKHUodC5jb252ZXJzaW9uLmZyb20pLnRlc3QpLHMucHVzaCh0LmNvbnZlcnNpb24uY29udmVydCkpfSkpLHMubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiB0fTtjYXNlIDE6cmV0dXJuIGU9b1swXSxyPXNbMF0sZnVuY3Rpb24odCl7cmV0dXJuIGUodCk/cih0KTp0fTtjYXNlIDI6cmV0dXJuIGU9b1swXSxuPW9bMV0scj1zWzBdLGk9c1sxXSxmdW5jdGlvbih0KXtyZXR1cm4gZSh0KT9yKHQpOm4odCk/aSh0KTp0fTtkZWZhdWx0OnJldHVybiBmdW5jdGlvbih0KXtmb3IobGV0IGU9MDtlPHMubGVuZ3RoO2UrKylpZihvW2VdKHQpKXJldHVybiBzW2VdKHQpO3JldHVybiB0fX19ZnVuY3Rpb24gTyh0KXtyZXR1cm4gZnVuY3Rpb24gdChlLG4scil7aWYobjxlLmxlbmd0aCl7Y29uc3QgaT1lW25dO2xldCBvPVtdO2lmKGkucmVzdFBhcmFtKXtjb25zdCB0PWkudHlwZXMuZmlsdGVyKEUpO3QubGVuZ3RoPGkudHlwZXMubGVuZ3RoJiZvLnB1c2goe3R5cGVzOnQsbmFtZToiLi4uIit0Lm1hcCgodD0+dC5uYW1lKSkuam9pbigifCIpLGhhc0FueTp0LnNvbWUoKHQ9PnQuaXNBbnkpKSxoYXNDb252ZXJzaW9uOiExLHJlc3RQYXJhbTohMH0pLG8ucHVzaChpKX1lbHNlIG89aS50eXBlcy5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybnt0eXBlczpbdF0sbmFtZTp0Lm5hbWUsaGFzQW55OnQuaXNBbnksaGFzQ29udmVyc2lvbjp0LmNvbnZlcnNpb24scmVzdFBhcmFtOiExfX0pKTtyZXR1cm4gZnVuY3Rpb24odCxlKXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmNvbmNhdC5hcHBseShbXSx0Lm1hcChlKSl9KG8sKGZ1bmN0aW9uKGkpe3JldHVybiB0KGUsbisxLHIuY29uY2F0KFtpXSkpfSkpfXJldHVybltyXX0odCwwLFtdKX1mdW5jdGlvbiBMKHQsZSl7Y29uc3Qgbj1NYXRoLm1heCh0Lmxlbmd0aCxlLmxlbmd0aCk7Zm9yKGxldCByPTA7cjxuO3IrKyl7Y29uc3Qgbj1EKHQsciksaT1EKGUscik7bGV0IG8scz0hMTtmb3IobyBvZiBpKWlmKG4uaGFzKG8pKXtzPSEwO2JyZWFrfWlmKCFzKXJldHVybiExfWNvbnN0IHI9dC5sZW5ndGgsaT1lLmxlbmd0aCxvPV8odCkscz1fKGUpO3JldHVybiBvP3M/cj09PWk6aT49cjpzP3I+PWk6cj09PWl9ZnVuY3Rpb24gUCh0LGUsbil7Y29uc3Qgcj1bXTtsZXQgaTtmb3IoaSBvZiB0KXtsZXQgdD1uW2ldO2lmKCJudW1iZXIiIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCdObyBkZWZpbml0aW9uIGZvciByZWZlcmVuY2VkIHNpZ25hdHVyZSAiJytpKyciJyk7aWYodD1lW3RdLCJmdW5jdGlvbiIhPXR5cGVvZiB0KXJldHVybiExO3IucHVzaCh0KX1yZXR1cm4gcn1mdW5jdGlvbiBSKHQsZSxuKXtjb25zdCByPWZ1bmN0aW9uKHQpe3JldHVybiB0Lm1hcCgodD0+WSh0KT9WKHQucmVmZXJUb1NlbGYuY2FsbGJhY2spOkcodCk/cSh0LnJlZmVyVG8ucmVmZXJlbmNlcyx0LnJlZmVyVG8uY2FsbGJhY2spOnQpKX0odCksaT1uZXcgQXJyYXkoci5sZW5ndGgpLmZpbGwoITEpO2xldCBvPSEwO2Zvcig7bzspe289ITE7bGV0IHQ9ITA7Zm9yKGxldCBzPTA7czxyLmxlbmd0aDsrK3Mpe2lmKGlbc10pY29udGludWU7Y29uc3QgYT1yW3NdO2lmKFkoYSkpcltzXT1hLnJlZmVyVG9TZWxmLmNhbGxiYWNrKG4pLHJbc10ucmVmZXJUb1NlbGY9YS5yZWZlclRvU2VsZixpW3NdPSEwLHQ9ITE7ZWxzZSBpZihHKGEpKXtjb25zdCBuPVAoYS5yZWZlclRvLnJlZmVyZW5jZXMscixlKTtuPyhyW3NdPWEucmVmZXJUby5jYWxsYmFjay5hcHBseSh0aGlzLG4pLHJbc10ucmVmZXJUbz1hLnJlZmVyVG8saVtzXT0hMCx0PSExKTpvPSEwfX1pZih0JiZvKXRocm93IG5ldyBTeW50YXhFcnJvcigiQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkIGluIHJlc29sdmluZyB0eXBlZC5yZWZlclRvIil9cmV0dXJuIHJ9ZnVuY3Rpb24gQih0LGUpe2lmKGEuY3JlYXRlQ291bnQrKywwPT09T2JqZWN0LmtleXMoZSkubGVuZ3RoKXRocm93IG5ldyBTeW50YXhFcnJvcigiTm8gc2lnbmF0dXJlcyBwcm92aWRlZCIpO2Eud2FybkFnYWluc3REZXByZWNhdGVkVGhpcyYmZnVuY3Rpb24odCl7Y29uc3QgZT0vXGJ0aGlzKFwofFwuc2lnbmF0dXJlc1xiKS87T2JqZWN0LmtleXModCkuZm9yRWFjaCgobj0+e2NvbnN0IHI9dFtuXTtpZihlLnRlc3Qoci50b1N0cmluZygpKSl0aHJvdyBuZXcgU3ludGF4RXJyb3IoIlVzaW5nIGB0aGlzYCB0byBzZWxmLXJlZmVyZW5jZSBhIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQgc2luY2UgdHlwZWQtZnVuY3Rpb25AMy4gVXNlIHR5cGVkLnJlZmVyVG8gYW5kIHR5cGVkLnJlZmVyVG9TZWxmIGluc3RlYWQuIil9KSl9KGUpO2NvbnN0IG49W10scj1bXSxpPXt9LG89W107bGV0IHM7Zm9yKHMgaW4gZSl7aWYoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHMpKWNvbnRpbnVlO2NvbnN0IHQ9dihzKTtpZighdCljb250aW51ZTtuLmZvckVhY2goKGZ1bmN0aW9uKGUpe2lmKEwoZSx0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCdDb25mbGljdGluZyBzaWduYXR1cmVzICInK2QoZSkrJyIgYW5kICInK2QodCkrJyIuJyl9KSksbi5wdXNoKHQpO2NvbnN0IGE9ci5sZW5ndGg7ci5wdXNoKGVbc10pO2NvbnN0IHU9dC5tYXAoeSk7bGV0IGM7Zm9yKGMgb2YgTyh1KSl7Y29uc3QgdD1kKGMpO28ucHVzaCh7cGFyYW1zOmMsbmFtZTp0LGZuOmF9KSxjLmV2ZXJ5KCh0PT4hdC5oYXNDb252ZXJzaW9uKSkmJihpW3RdPWEpfX1vLnNvcnQoTSk7Y29uc3QgdT1SKHIsaSxvdCk7bGV0IGM7Zm9yKGMgaW4gaSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoaSxjKSYmKGlbY109dVtpW2NdXSk7Y29uc3QgbD1bXSxoPW5ldyBNYXA7Zm9yKGMgb2YgbyloLmhhcyhjLm5hbWUpfHwoYy5mbj11W2MuZm5dLGwucHVzaChjKSxoLnNldChjLm5hbWUsYykpO2NvbnN0IGY9bFswXSYmbFswXS5wYXJhbXMubGVuZ3RoPD0yJiYhXyhsWzBdLnBhcmFtcykscD1sWzFdJiZsWzFdLnBhcmFtcy5sZW5ndGg8PTImJiFfKGxbMV0ucGFyYW1zKSxnPWxbMl0mJmxbMl0ucGFyYW1zLmxlbmd0aDw9MiYmIV8obFsyXS5wYXJhbXMpLG09bFszXSYmbFszXS5wYXJhbXMubGVuZ3RoPD0yJiYhXyhsWzNdLnBhcmFtcyksYj1sWzRdJiZsWzRdLnBhcmFtcy5sZW5ndGg8PTImJiFfKGxbNF0ucGFyYW1zKSxEPWxbNV0mJmxbNV0ucGFyYW1zLmxlbmd0aDw9MiYmIV8obFs1XS5wYXJhbXMpLEU9ZiYmcCYmZyYmbSYmYiYmRDtmb3IobGV0IHQ9MDt0PGwubGVuZ3RoOysrdClsW3RdLnRlc3Q9dyhsW3RdLnBhcmFtcyk7Y29uc3QgQz1mP3gobFswXS5wYXJhbXNbMF0pOmJwLFM9cD94KGxbMV0ucGFyYW1zWzBdKTpicCxBPWc/eChsWzJdLnBhcmFtc1swXSk6YnAsTj1tP3gobFszXS5wYXJhbXNbMF0pOmJwLEk9Yj94KGxbNF0ucGFyYW1zWzBdKTpicCxUPUQ/eChsWzVdLnBhcmFtc1swXSk6YnAsUD1mP3gobFswXS5wYXJhbXNbMV0pOmJwLEI9cD94KGxbMV0ucGFyYW1zWzFdKTpicCxrPWc/eChsWzJdLnBhcmFtc1sxXSk6YnAsej1tP3gobFszXS5wYXJhbXNbMV0pOmJwLGo9Yj94KGxbNF0ucGFyYW1zWzFdKTpicCxVPUQ/eChsWzVdLnBhcmFtc1sxXSk6YnA7Zm9yKGxldCB0PTA7dDxsLmxlbmd0aDsrK3QpbFt0XS5pbXBsZW1lbnRhdGlvbj1GKGxbdF0ucGFyYW1zLGxbdF0uZm4pO2NvbnN0IHE9Zj9sWzBdLmltcGxlbWVudGF0aW9uOkRwLFY9cD9sWzFdLmltcGxlbWVudGF0aW9uOkRwLEc9Zz9sWzJdLmltcGxlbWVudGF0aW9uOkRwLFk9bT9sWzNdLmltcGxlbWVudGF0aW9uOkRwLFg9Yj9sWzRdLmltcGxlbWVudGF0aW9uOkRwLFc9RD9sWzVdLmltcGxlbWVudGF0aW9uOkRwLEg9Zj9sWzBdLnBhcmFtcy5sZW5ndGg6LTEsWj1wP2xbMV0ucGFyYW1zLmxlbmd0aDotMSxLPWc/bFsyXS5wYXJhbXMubGVuZ3RoOi0xLEo9bT9sWzNdLnBhcmFtcy5sZW5ndGg6LTEsUT1iP2xbNF0ucGFyYW1zLmxlbmd0aDotMSwkPUQ/bFs1XS5wYXJhbXMubGVuZ3RoOi0xLHR0PUU/NjowLGV0PWwubGVuZ3RoLG50PWwubWFwKCh0PT50LnRlc3QpKSxydD1sLm1hcCgodD0+dC5pbXBsZW1lbnRhdGlvbikpLGl0PWZ1bmN0aW9uKCl7Zm9yKGxldCB0PXR0O3Q8ZXQ7dCsrKWlmKG50W3RdKGFyZ3VtZW50cykpcmV0dXJuIHJ0W3RdLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gYS5vbk1pc21hdGNoKHQsYXJndW1lbnRzLGwpfTtmdW5jdGlvbiBvdCh0LGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPT09SCYmQyh0KSYmUChlKT9xLmFwcGx5KHRoaXMsYXJndW1lbnRzKTphcmd1bWVudHMubGVuZ3RoPT09WiYmUyh0KSYmQihlKT9WLmFwcGx5KHRoaXMsYXJndW1lbnRzKTphcmd1bWVudHMubGVuZ3RoPT09SyYmQSh0KSYmayhlKT9HLmFwcGx5KHRoaXMsYXJndW1lbnRzKTphcmd1bWVudHMubGVuZ3RoPT09SiYmTih0KSYmeihlKT9ZLmFwcGx5KHRoaXMsYXJndW1lbnRzKTphcmd1bWVudHMubGVuZ3RoPT09USYmSSh0KSYmaihlKT9YLmFwcGx5KHRoaXMsYXJndW1lbnRzKTphcmd1bWVudHMubGVuZ3RoPT09JCYmVCh0KSYmVShlKT9XLmFwcGx5KHRoaXMsYXJndW1lbnRzKTppdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9dHJ5e09iamVjdC5kZWZpbmVQcm9wZXJ0eShvdCwibmFtZSIse3ZhbHVlOnR9KX1jYXRjaCh0KXt9cmV0dXJuIG90LnNpZ25hdHVyZXM9aSxvdC5fdHlwZWRGdW5jdGlvbkRhdGE9e3NpZ25hdHVyZXM6bCxzaWduYXR1cmVNYXA6aH0sb3R9ZnVuY3Rpb24gayh0LGUsbil7dGhyb3cgUyh0LGUsbil9ZnVuY3Rpb24geih0KXtyZXR1cm4gVSh0LDAsdC5sZW5ndGgtMSl9ZnVuY3Rpb24gaih0KXtyZXR1cm4gdFt0Lmxlbmd0aC0xXX1mdW5jdGlvbiBVKHQsZSxuKXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodCxlLG4pfWZ1bmN0aW9uIHEodCxlKXtyZXR1cm57cmVmZXJUbzp7cmVmZXJlbmNlczp0LGNhbGxiYWNrOmV9fX1mdW5jdGlvbiBWKHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbGxiYWNrIGZ1bmN0aW9uIGV4cGVjdGVkIGFzIGZpcnN0IGFyZ3VtZW50Iik7cmV0dXJue3JlZmVyVG9TZWxmOntjYWxsYmFjazp0fX19ZnVuY3Rpb24gRyh0KXtyZXR1cm4gdCYmIm9iamVjdCI9PXR5cGVvZiB0LnJlZmVyVG8mJkFycmF5LmlzQXJyYXkodC5yZWZlclRvLnJlZmVyZW5jZXMpJiYiZnVuY3Rpb24iPT10eXBlb2YgdC5yZWZlclRvLmNhbGxiYWNrfWZ1bmN0aW9uIFkodCl7cmV0dXJuIHQmJiJvYmplY3QiPT10eXBlb2YgdC5yZWZlclRvU2VsZiYmImZ1bmN0aW9uIj09dHlwZW9mIHQucmVmZXJUb1NlbGYuY2FsbGJhY2t9ZnVuY3Rpb24gWCh0LGUpe2lmKCF0KXJldHVybiBlO2lmKGUmJmUhPT10KXtjb25zdCBuPW5ldyBFcnJvcigiRnVuY3Rpb24gbmFtZXMgZG8gbm90IG1hdGNoIChleHBlY3RlZDogIit0KyIsIGFjdHVhbDogIitlKyIpIik7dGhyb3cgbi5kYXRhPXthY3R1YWw6ZSxleHBlY3RlZDp0fSxufXJldHVybiB0fWZ1bmN0aW9uIFcodCl7bGV0IGU7Zm9yKGNvbnN0IG4gaW4gdClPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxuKSYmKGYodFtuXSl8fCJzdHJpbmciPT10eXBlb2YgdFtuXS5zaWduYXR1cmUpJiYoZT1YKGUsdFtuXS5uYW1lKSk7cmV0dXJuIGV9ZnVuY3Rpb24gSCh0LGUpe2xldCBuO2ZvcihuIGluIGUpaWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsbikpe2lmKG4gaW4gdCYmZVtuXSE9PXRbbl0pe2NvbnN0IHI9bmV3IEVycm9yKCdTaWduYXR1cmUgIicrbisnIiBpcyBkZWZpbmVkIHR3aWNlJyk7dGhyb3cgci5kYXRhPXtzaWduYXR1cmU6bixzb3VyY2VGdW5jdGlvbjplW25dLGRlc3RGdW5jdGlvbjp0W25dfSxyfXRbbl09ZVtuXX19bCgpLGMobik7Y29uc3QgWj1hO2Z1bmN0aW9uIEsodCl7aWYoIXR8fCJzdHJpbmciIT10eXBlb2YgdC5mcm9tfHwic3RyaW5nIiE9dHlwZW9mIHQudG98fCJmdW5jdGlvbiIhPXR5cGVvZiB0LmNvbnZlcnQpdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IHdpdGggcHJvcGVydGllcyB7ZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBjb252ZXJ0OiBmdW5jdGlvbn0gZXhwZWN0ZWQiKTtpZih0LnRvPT09dC5mcm9tKXRocm93IG5ldyBTeW50YXhFcnJvcignSWxsZWdhbCB0byBkZWZpbmUgY29udmVyc2lvbiBmcm9tICInK3QuZnJvbSsnIiB0byBpdHNlbGYuJyl9cmV0dXJuIGE9ZnVuY3Rpb24odCl7Y29uc3Qgbj0ic3RyaW5nIj09dHlwZW9mIHQ7bGV0IHI9bj90OiIiO2NvbnN0IGk9e307Zm9yKGxldCB0PW4/MTowO3Q8YXJndW1lbnRzLmxlbmd0aDsrK3Qpe2NvbnN0IG89YXJndW1lbnRzW3RdO2xldCBzLGE9e307aWYoImZ1bmN0aW9uIj09dHlwZW9mIG8/KHM9by5uYW1lLCJzdHJpbmciPT10eXBlb2Ygby5zaWduYXR1cmU/YVtvLnNpZ25hdHVyZV09bzpmKG8pJiYoYT1vLnNpZ25hdHVyZXMpKTplKG8pJiYoYT1vLG58fChzPVcobykpKSwwPT09T2JqZWN0LmtleXMoYSkubGVuZ3RoKXtjb25zdCBlPW5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IHRvICd0eXBlZCcgYXQgaW5kZXggIit0KyIgaXMgbm90IGEgKHR5cGVkKSBmdW5jdGlvbiwgbm9yIGFuIG9iamVjdCB3aXRoIHNpZ25hdHVyZXMgYXMga2V5cyBhbmQgZnVuY3Rpb25zIGFzIHZhbHVlcy4iKTt0aHJvdyBlLmRhdGE9e2luZGV4OnQsYXJndW1lbnQ6b30sZX1ufHwocj1YKHIscykpLEgoaSxhKX1yZXR1cm4gQihyfHwiIixpKX0sYS5jcmVhdGU9dCxhLmNyZWF0ZUNvdW50PVouY3JlYXRlQ291bnQsYS5vbk1pc21hdGNoPWssYS50aHJvd01pc21hdGNoRXJyb3I9ayxhLmNyZWF0ZUVycm9yPVMsYS5jbGVhcj1sLGEuY2xlYXJDb252ZXJzaW9ucz1mdW5jdGlvbigpe2xldCB0O2Zvcih0IG9mIG8paS5nZXQodCkuY29udmVyc2lvbnNUbz1bXTtzPTB9LGEuYWRkVHlwZXM9YyxhLl9maW5kVHlwZT11LGEucmVmZXJUbz1mdW5jdGlvbigpe2NvbnN0IHQ9eihhcmd1bWVudHMpLm1hcCgodD0+ZCh2KHQpKSkpLGU9aihhcmd1bWVudHMpO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbGxiYWNrIGZ1bmN0aW9uIGV4cGVjdGVkIGFzIGxhc3QgYXJndW1lbnQiKTtyZXR1cm4gcSh0LGUpfSxhLnJlZmVyVG9TZWxmPVYsYS5jb252ZXJ0PWZ1bmN0aW9uKHQsZSl7Y29uc3Qgbj11KGUpO2lmKG4udGVzdCh0KSlyZXR1cm4gdDtjb25zdCByPW4uY29udmVyc2lvbnNUbztpZigwPT09ci5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJUaGVyZSBhcmUgbm8gY29udmVyc2lvbnMgdG8gIitlKyIgZGVmaW5lZC4iKTtmb3IobGV0IGU9MDtlPHIubGVuZ3RoO2UrKylpZih1KHJbZV0uZnJvbSkudGVzdCh0KSlyZXR1cm4gcltlXS5jb252ZXJ0KHQpO3Rocm93IG5ldyBFcnJvcigiQ2Fubm90IGNvbnZlcnQgIit0KyIgdG8gIitlKX0sYS5maW5kU2lnbmF0dXJlPXAsYS5maW5kPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gcCh0LGUsbikuaW1wbGVtZW50YXRpb259LGEuaXNUeXBlZEZ1bmN0aW9uPWYsYS53YXJuQWdhaW5zdERlcHJlY2F0ZWRUaGlzPSEwLGEuYWRkVHlwZT1mdW5jdGlvbih0LGUpe2xldCBuPSJhbnkiOyExIT09ZSYmaS5oYXMoIk9iamVjdCIpJiYobj0iT2JqZWN0IiksYS5hZGRUeXBlcyhbdF0sbil9LGEuYWRkQ29udmVyc2lvbj1mdW5jdGlvbih0KXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e292ZXJyaWRlOiExfTtLKHQpO2NvbnN0IG49dSh0LnRvKSxyPW4uY29udmVyc2lvbnNUby5maW5kKChlPT5lLmZyb209PT10LmZyb20pKTtpZihyKXtpZighZXx8IWUub3ZlcnJpZGUpdGhyb3cgbmV3IEVycm9yKCdUaGVyZSBpcyBhbHJlYWR5IGEgY29udmVyc2lvbiBmcm9tICInK3QuZnJvbSsnIiB0byAiJytuLm5hbWUrJyInKTthLnJlbW92ZUNvbnZlcnNpb24oe2Zyb206ci5mcm9tLHRvOnQudG8sY29udmVydDpyLmNvbnZlcnR9KX1uLmNvbnZlcnNpb25zVG8ucHVzaCh7ZnJvbTp0LmZyb20sY29udmVydDp0LmNvbnZlcnQsaW5kZXg6cysrfSl9LGEuYWRkQ29udmVyc2lvbnM9ZnVuY3Rpb24odCxlKXt0LmZvckVhY2goKHQ9PmEuYWRkQ29udmVyc2lvbih0LGUpKSl9LGEucmVtb3ZlQ29udmVyc2lvbj1mdW5jdGlvbih0KXtLKHQpO2NvbnN0IGU9dSh0LnRvKSxuPWZ1bmN0aW9uKHQsZSl7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspaWYoZSh0W25dKSlyZXR1cm4gdFtuXX0oZS5jb252ZXJzaW9uc1RvLChlPT5lLmZyb209PT10LmZyb20pKTtpZighbil0aHJvdyBuZXcgRXJyb3IoIkF0dGVtcHQgdG8gcmVtb3ZlIG5vbmV4aXN0ZW50IGNvbnZlcnNpb24gZnJvbSAiK3QuZnJvbSsiIHRvICIrdC50byk7aWYobi5jb252ZXJ0IT09dC5jb252ZXJ0KXRocm93IG5ldyBFcnJvcigiQ29udmVyc2lvbiB0byByZW1vdmUgZG9lcyBub3QgbWF0Y2ggZXhpc3RpbmcgY29udmVyc2lvbiIpO2NvbnN0IHI9ZS5jb252ZXJzaW9uc1RvLmluZGV4T2Yobik7ZS5jb252ZXJzaW9uc1RvLnNwbGljZShyLDEpfSxhLnJlc29sdmU9ZnVuY3Rpb24odCxlKXtpZighZih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKEVwKTtjb25zdCBuPXQuX3R5cGVkRnVuY3Rpb25EYXRhLnNpZ25hdHVyZXM7Zm9yKGxldCB0PTA7dDxuLmxlbmd0aDsrK3QpaWYoblt0XS50ZXN0KGUpKXJldHVybiBuW3RdO3JldHVybiBudWxsfSxhfSgpO2Z1bmN0aW9uIFNwKHQpe3JldHVybiJib29sZWFuIj09dHlwZW9mIHR8fCEhaXNGaW5pdGUodCkmJnQ9PT1NYXRoLnJvdW5kKHQpfWZ1bmN0aW9uIEFwKHQsZSxuKXt2YXIgcj17MjoiMGIiLDg6IjBvIiwxNjoiMHgifVtlXSxpPSIiO2lmKG4pe2lmKG48MSl0aHJvdyBuZXcgRXJyb3IoInNpemUgbXVzdCBiZSBpbiBncmVhdGVyIHRoYW4gMCIpO2lmKCFTcChuKSl0aHJvdyBuZXcgRXJyb3IoInNpemUgbXVzdCBiZSBhbiBpbnRlZ2VyIik7aWYodD5QZigyLG4tMSktMXx8dDwtUGYoMixuLTEpKXRocm93IG5ldyBFcnJvcigiVmFsdWUgbXVzdCBiZSBpbiByYW5nZSBbLTJeIi5jb25jYXQobi0xLCIsIDJeIikuY29uY2F0KG4tMSwiLTFdIikpO2lmKCFTcCh0KSl0aHJvdyBuZXcgRXJyb3IoIlZhbHVlIG11c3QgYmUgYW4gaW50ZWdlciIpO3Q8MCYmKHQrPVBmKDIsbikpLGk9ImkiLmNvbmNhdChuKX12YXIgbz0iIjtyZXR1cm4gdDwwJiYodD0tdCxvPSItIiksIiIuY29uY2F0KG8pLmNvbmNhdChyKS5jb25jYXQodC50b1N0cmluZyhlKSkuY29uY2F0KGkpfWZ1bmN0aW9uIE5wKHQsZSl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGUpcmV0dXJuIGUodCk7aWYodD09PTEvMClyZXR1cm4iSW5maW5pdHkiO2lmKHQ9PT0tMS8wKXJldHVybiItSW5maW5pdHkiO2lmKGlzTmFOKHQpKXJldHVybiJOYU4iO3ZhciBuLHIsaT0iYXV0byI7aWYoZSYmKGUubm90YXRpb24mJihpPWUubm90YXRpb24pLE1mKGUpP249ZTpNZihlLnByZWNpc2lvbikmJihuPWUucHJlY2lzaW9uKSxlLndvcmRTaXplJiYibnVtYmVyIiE9dHlwZW9mKHI9ZS53b3JkU2l6ZSkpKXRocm93IG5ldyBFcnJvcignT3B0aW9uICJ3b3JkU2l6ZSIgbXVzdCBiZSBhIG51bWJlcicpO3N3aXRjaChpKXtjYXNlImZpeGVkIjpyZXR1cm4gZnVuY3Rpb24odCxlKXtpZihpc05hTih0KXx8IWlzRmluaXRlKHQpKXJldHVybiBTdHJpbmcodCk7dmFyIG49SXAodCkscj0ibnVtYmVyIj09dHlwZW9mIGU/RnAobixuLmV4cG9uZW50KzErZSk6bixpPXIuY29lZmZpY2llbnRzLG89ci5leHBvbmVudCsxLHM9bysoZXx8MCk7cmV0dXJuIGkubGVuZ3RoPHMmJihpPWkuY29uY2F0KFRwKHMtaS5sZW5ndGgpKSksbzwwJiYoaT1UcCgxLW8pLmNvbmNhdChpKSxvPTEpLG88aS5sZW5ndGgmJmkuc3BsaWNlKG8sMCwwPT09bz8iMC4iOiIuIiksci5zaWduK2kuam9pbigiIil9KHQsbik7Y2FzZSJleHBvbmVudGlhbCI6cmV0dXJuIE1wKHQsbik7Y2FzZSJlbmdpbmVlcmluZyI6cmV0dXJuIGZ1bmN0aW9uKHQsZSl7aWYoaXNOYU4odCl8fCFpc0Zpbml0ZSh0KSlyZXR1cm4gU3RyaW5nKHQpO3ZhciBuPUlwKHQpLHI9RnAobixlKSxpPXIuZXhwb25lbnQsbz1yLmNvZWZmaWNpZW50cyxzPWklMz09MD9pOmk8MD9pLTMtaSUzOmktaSUzO2lmKE1mKGUpKWZvcig7ZT5vLmxlbmd0aHx8aS1zKzE+by5sZW5ndGg7KW8ucHVzaCgwKTtlbHNlIGZvcih2YXIgYT1NYXRoLmFicyhpLXMpLShvLmxlbmd0aC0xKSx1PTA7dTxhO3UrKylvLnB1c2goMCk7Zm9yKHZhciBjPU1hdGguYWJzKGktcyksbD0xO2M+MDspbCsrLGMtLTt2YXIgaD1vLnNsaWNlKGwpLmpvaW4oIiIpLGY9TWYoZSkmJmgubGVuZ3RofHxoLm1hdGNoKC9bMS05XS8pPyIuIitoOiIiLHA9by5zbGljZSgwLGwpLmpvaW4oIiIpK2YrImUiKyhpPj0wPyIrIjoiIikrcy50b1N0cmluZygpO3JldHVybiByLnNpZ24rcH0odCxuKTtjYXNlImJpbiI6cmV0dXJuIEFwKHQsMixyKTtjYXNlIm9jdCI6cmV0dXJuIEFwKHQsOCxyKTtjYXNlImhleCI6cmV0dXJuIEFwKHQsMTYscik7Y2FzZSJhdXRvIjpyZXR1cm4gZnVuY3Rpb24odCxlLG4pe2lmKGlzTmFOKHQpfHwhaXNGaW5pdGUodCkpcmV0dXJuIFN0cmluZyh0KTt2YXIgcj1uJiZ2b2lkIDAhPT1uLmxvd2VyRXhwP24ubG93ZXJFeHA6LTMsaT1uJiZ2b2lkIDAhPT1uLnVwcGVyRXhwP24udXBwZXJFeHA6NSxvPUlwKHQpLHM9ZT9GcChvLGUpOm87aWYocy5leHBvbmVudDxyfHxzLmV4cG9uZW50Pj1pKXJldHVybiBNcCh0LGUpO3ZhciBhPXMuY29lZmZpY2llbnRzLHU9cy5leHBvbmVudDthLmxlbmd0aDxlJiYoYT1hLmNvbmNhdChUcChlLWEubGVuZ3RoKSkpLGE9YS5jb25jYXQoVHAodS1hLmxlbmd0aCsxKyhhLmxlbmd0aDxlP2UtYS5sZW5ndGg6MCkpKSxhPVRwKC11KS5jb25jYXQoYSk7dmFyIGM9dT4wP3U6MDtyZXR1cm4gYzxhLmxlbmd0aC0xJiZhLnNwbGljZShjKzEsMCwiLiIpLHMuc2lnbithLmpvaW4oIiIpfSh0LG4sZSYmZSkucmVwbGFjZSgvKChcLlxkKj8pKDArKSkoJHxlKS8sKGZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzWzJdLGU9YXJndW1lbnRzWzRdO3JldHVybiIuIiE9PXQ/dCtlOmV9KSk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gbm90YXRpb24gIicraSsnIi4gQ2hvb3NlICJhdXRvIiwgImV4cG9uZW50aWFsIiwgImZpeGVkIiwgImJpbiIsICJvY3QiLCBvciAiaGV4LicpfX1mdW5jdGlvbiBJcCh0KXt2YXIgZT1TdHJpbmcodCkudG9Mb3dlckNhc2UoKS5tYXRjaCgvXigtPykoXGQrXC4/XGQqKShlKFsrLV0/XGQrKSk/JC8pO2lmKCFlKXRocm93IG5ldyBTeW50YXhFcnJvcigiSW52YWxpZCBudW1iZXIgIit0KTt2YXIgbj1lWzFdLHI9ZVsyXSxpPXBhcnNlRmxvYXQoZVs0XXx8IjAiKSxvPXIuaW5kZXhPZigiLiIpO2krPS0xIT09bz9vLTE6ci5sZW5ndGgtMTt2YXIgcz1yLnJlcGxhY2UoIi4iLCIiKS5yZXBsYWNlKC9eMCovLChmdW5jdGlvbih0KXtyZXR1cm4gaS09dC5sZW5ndGgsIiJ9KSkucmVwbGFjZSgvMCokLywiIikuc3BsaXQoIiIpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHBhcnNlSW50KHQpfSkpO3JldHVybiAwPT09cy5sZW5ndGgmJihzLnB1c2goMCksaSsrKSx7c2lnbjpuLGNvZWZmaWNpZW50czpzLGV4cG9uZW50Oml9fWZ1bmN0aW9uIE1wKHQsZSl7aWYoaXNOYU4odCl8fCFpc0Zpbml0ZSh0KSlyZXR1cm4gU3RyaW5nKHQpO3ZhciBuPUlwKHQpLHI9ZT9GcChuLGUpOm4saT1yLmNvZWZmaWNpZW50cyxvPXIuZXhwb25lbnQ7aS5sZW5ndGg8ZSYmKGk9aS5jb25jYXQoVHAoZS1pLmxlbmd0aCkpKTt2YXIgcz1pLnNoaWZ0KCk7cmV0dXJuIHIuc2lnbitzKyhpLmxlbmd0aD4wPyIuIitpLmpvaW4oIiIpOiIiKSsiZSIrKG8+PTA/IisiOiIiKStvfWZ1bmN0aW9uIEZwKHQsZSl7Zm9yKHZhciBuPXtzaWduOnQuc2lnbixjb2VmZmljaWVudHM6dC5jb2VmZmljaWVudHMsZXhwb25lbnQ6dC5leHBvbmVudH0scj1uLmNvZWZmaWNpZW50cztlPD0wOylyLnVuc2hpZnQoMCksbi5leHBvbmVudCsrLGUrKztpZihyLmxlbmd0aD5lJiZyLnNwbGljZShlLHIubGVuZ3RoLWUpWzBdPj01KXt2YXIgaT1lLTE7Zm9yKHJbaV0rKzsxMD09PXJbaV07KXIucG9wKCksMD09PWkmJihyLnVuc2hpZnQoMCksbi5leHBvbmVudCsrLGkrKyksclstLWldKyt9cmV0dXJuIG59ZnVuY3Rpb24gVHAodCl7Zm9yKHZhciBlPVtdLG49MDtuPHQ7bisrKWUucHVzaCgwKTtyZXR1cm4gZX12YXIgT3A9TnVtYmVyLkVQU0lMT058fDIyMjA0NDYwNDkyNTAzMTNlLTMxO2Z1bmN0aW9uIExwKHQsZSxuKXtpZihudWxsPT1uKXJldHVybiB0PT09ZTtpZih0PT09ZSlyZXR1cm4hMDtpZihpc05hTih0KXx8aXNOYU4oZSkpcmV0dXJuITE7aWYoaXNGaW5pdGUodCkmJmlzRmluaXRlKGUpKXt2YXIgcj1NYXRoLmFicyh0LWUpO3JldHVybiByPE9wfHxyPD1NYXRoLm1heChNYXRoLmFicyh0KSxNYXRoLmFicyhlKSkqbn1yZXR1cm4hMX1mdW5jdGlvbiBQcCh0LGUsbil7dmFyIHI9bmV3KDAsdC5jb25zdHJ1Y3RvcikoMiksaT0iIjtpZihuKXtpZihuPDEpdGhyb3cgbmV3IEVycm9yKCJzaXplIG11c3QgYmUgaW4gZ3JlYXRlciB0aGFuIDAiKTtpZighU3AobikpdGhyb3cgbmV3IEVycm9yKCJzaXplIG11c3QgYmUgYW4gaW50ZWdlciIpO2lmKHQuZ3JlYXRlclRoYW4oci5wb3cobi0xKS5zdWIoMSkpfHx0Lmxlc3NUaGFuKHIucG93KG4tMSkubXVsKC0xKSkpdGhyb3cgbmV3IEVycm9yKCJWYWx1ZSBtdXN0IGJlIGluIHJhbmdlIFstMl4iLmNvbmNhdChuLTEsIiwgMl4iKS5jb25jYXQobi0xLCItMV0iKSk7aWYoIXQuaXNJbnRlZ2VyKCkpdGhyb3cgbmV3IEVycm9yKCJWYWx1ZSBtdXN0IGJlIGFuIGludGVnZXIiKTt0Lmxlc3NUaGFuKDApJiYodD10LmFkZChyLnBvdyhuKSkpLGk9ImkiLmNvbmNhdChuKX1zd2l0Y2goZSl7Y2FzZSAyOnJldHVybiIiLmNvbmNhdCh0LnRvQmluYXJ5KCkpLmNvbmNhdChpKTtjYXNlIDg6cmV0dXJuIiIuY29uY2F0KHQudG9PY3RhbCgpKS5jb25jYXQoaSk7Y2FzZSAxNjpyZXR1cm4iIi5jb25jYXQodC50b0hleGFkZWNpbWFsKCkpLmNvbmNhdChpKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiQmFzZSAiLmNvbmNhdChlLCIgbm90IHN1cHBvcnRlZCAiKSl9fWZ1bmN0aW9uIFJwKHQsZSl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGUpcmV0dXJuIGUodCk7aWYoIXQuaXNGaW5pdGUoKSlyZXR1cm4gdC5pc05hTigpPyJOYU4iOnQuZ3QoMCk/IkluZmluaXR5IjoiLUluZmluaXR5Ijt2YXIgbixyLGk9ImF1dG8iO2lmKHZvaWQgMCE9PWUmJihlLm5vdGF0aW9uJiYoaT1lLm5vdGF0aW9uKSwibnVtYmVyIj09dHlwZW9mIGU/bj1lOnZvaWQgMCE9PWUucHJlY2lzaW9uJiYobj1lLnByZWNpc2lvbiksZS53b3JkU2l6ZSYmIm51bWJlciIhPXR5cGVvZihyPWUud29yZFNpemUpKSl0aHJvdyBuZXcgRXJyb3IoJ09wdGlvbiAid29yZFNpemUiIG11c3QgYmUgYSBudW1iZXInKTtzd2l0Y2goaSl7Y2FzZSJmaXhlZCI6cmV0dXJuIGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQudG9GaXhlZChlKX0odCxuKTtjYXNlImV4cG9uZW50aWFsIjpyZXR1cm4gQnAodCxuKTtjYXNlImVuZ2luZWVyaW5nIjpyZXR1cm4gZnVuY3Rpb24odCxlKXt2YXIgbj10LmUscj1uJTM9PTA/bjpuPDA/bi0zLW4lMzpuLW4lMyxpPXQubXVsKE1hdGgucG93KDEwLC1yKSksbz1pLnRvUHJlY2lzaW9uKGUpO2lmKC0xIT09by5pbmRleE9mKCJlIikpe289bmV3KDAsdC5jb25zdHJ1Y3RvcikobykudG9GaXhlZCgpfXJldHVybiBvKyJlIisobj49MD8iKyI6IiIpK3IudG9TdHJpbmcoKX0odCxuKTtjYXNlImJpbiI6cmV0dXJuIFBwKHQsMixyKTtjYXNlIm9jdCI6cmV0dXJuIFBwKHQsOCxyKTtjYXNlImhleCI6cmV0dXJuIFBwKHQsMTYscik7Y2FzZSJhdXRvIjp2YXIgbz1lJiZ2b2lkIDAhPT1lLmxvd2VyRXhwP2UubG93ZXJFeHA6LTMscz1lJiZ2b2lkIDAhPT1lLnVwcGVyRXhwP2UudXBwZXJFeHA6NTtpZih0LmlzWmVybygpKXJldHVybiIwIjt2YXIgYT10LnRvU2lnbmlmaWNhbnREaWdpdHMobiksdT1hLmU7cmV0dXJuKHU+PW8mJnU8cz9hLnRvRml4ZWQoKTpCcCh0LG4pKS5yZXBsYWNlKC8oKFwuXGQqPykoMCspKSgkfGUpLywoZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHNbMl0sZT1hcmd1bWVudHNbNF07cmV0dXJuIi4iIT09dD90K2U6ZX0pKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcignVW5rbm93biBub3RhdGlvbiAiJytpKyciLiBDaG9vc2UgImF1dG8iLCAiZXhwb25lbnRpYWwiLCAiZml4ZWQiLCAiYmluIiwgIm9jdCIsIG9yICJoZXguJyl9fWZ1bmN0aW9uIEJwKHQsZSl7cmV0dXJuIHZvaWQgMCE9PWU/dC50b0V4cG9uZW50aWFsKGUtMSk6dC50b0V4cG9uZW50aWFsKCl9ZnVuY3Rpb24ga3AodCxlKXt2YXIgbj1mdW5jdGlvbih0LGUpe2lmKCJudW1iZXIiPT10eXBlb2YgdClyZXR1cm4gTnAodCxlKTtpZihGZih0KSlyZXR1cm4gUnAodCxlKTtpZihmdW5jdGlvbih0KXtyZXR1cm4gdCYmIm9iamVjdCI9PXR5cGVvZiB0JiYibnVtYmVyIj09dHlwZW9mIHQucyYmIm51bWJlciI9PXR5cGVvZiB0Lm4mJiJudW1iZXIiPT10eXBlb2YgdC5kfHwhMX0odCkpcmV0dXJuIGUmJiJkZWNpbWFsIj09PWUuZnJhY3Rpb24/dC50b1N0cmluZygpOnQucyp0Lm4rIi8iK3QuZDtpZihBcnJheS5pc0FycmF5KHQpKXJldHVybiB6cCh0LGUpO2lmKFJmKHQpKXJldHVybiciJyt0KyciJztpZigiZnVuY3Rpb24iPT10eXBlb2YgdClyZXR1cm4gdC5zeW50YXg/U3RyaW5nKHQuc3ludGF4KToiZnVuY3Rpb24iO2lmKHQmJiJvYmplY3QiPT10eXBlb2YgdCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQuZm9ybWF0P3QuZm9ybWF0KGUpOnQmJnQudG9TdHJpbmcoZSkhPT17fS50b1N0cmluZygpP3QudG9TdHJpbmcoZSk6InsiK09iamVjdC5rZXlzKHQpLm1hcCgobj0+JyInK24rJyI6ICcra3AodFtuXSxlKSkpLmpvaW4oIiwgIikrIn0ifXJldHVybiBTdHJpbmcodCl9KHQsZSk7cmV0dXJuIGUmJiJvYmplY3QiPT10eXBlb2YgZSYmInRydW5jYXRlImluIGUmJm4ubGVuZ3RoPmUudHJ1bmNhdGU/bi5zdWJzdHJpbmcoMCxlLnRydW5jYXRlLTMpKyIuLi4iOm59ZnVuY3Rpb24genAodCxlKXtpZihBcnJheS5pc0FycmF5KHQpKXtmb3IodmFyIG49IlsiLHI9dC5sZW5ndGgsaT0wO2k8cjtpKyspMCE9PWkmJihuKz0iLCAiKSxuKz16cCh0W2ldLGUpO3JldHVybiBuKz0iXSJ9cmV0dXJuIGtwKHQsZSl9ZnVuY3Rpb24ganAodCxlLG4pe2lmKCEodGhpcyBpbnN0YW5jZW9mIGpwKSl0aHJvdyBuZXcgU3ludGF4RXJyb3IoIkNvbnN0cnVjdG9yIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIG5ldyBvcGVyYXRvciIpO3RoaXMuYWN0dWFsPXQsdGhpcy5leHBlY3RlZD1lLHRoaXMucmVsYXRpb249bix0aGlzLm1lc3NhZ2U9IkRpbWVuc2lvbiBtaXNtYXRjaCAoIisoQXJyYXkuaXNBcnJheSh0KT8iWyIrdC5qb2luKCIsICIpKyJdIjp0KSsiICIrKHRoaXMucmVsYXRpb258fCIhPSIpKyIgIisoQXJyYXkuaXNBcnJheShlKT8iWyIrZS5qb2luKCIsICIpKyJdIjplKSsiKSIsdGhpcy5zdGFjaz0obmV3IEVycm9yKS5zdGFja31mdW5jdGlvbiBVcCh0LGUsbil7aWYoISh0aGlzIGluc3RhbmNlb2YgVXApKXRocm93IG5ldyBTeW50YXhFcnJvcigiQ29uc3RydWN0b3IgbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgbmV3IG9wZXJhdG9yIik7dGhpcy5pbmRleD10LGFyZ3VtZW50cy5sZW5ndGg8Mz8odGhpcy5taW49MCx0aGlzLm1heD1lKToodGhpcy5taW49ZSx0aGlzLm1heD1uKSx2b2lkIDAhPT10aGlzLm1pbiYmdGhpcy5pbmRleDx0aGlzLm1pbj90aGlzLm1lc3NhZ2U9IkluZGV4IG91dCBvZiByYW5nZSAoIit0aGlzLmluZGV4KyIgPCAiK3RoaXMubWluKyIpIjp2b2lkIDAhPT10aGlzLm1heCYmdGhpcy5pbmRleD49dGhpcy5tYXg/dGhpcy5tZXNzYWdlPSJJbmRleCBvdXQgb2YgcmFuZ2UgKCIrdGhpcy5pbmRleCsiID4gIisodGhpcy5tYXgtMSkrIikiOnRoaXMubWVzc2FnZT0iSW5kZXggb3V0IG9mIHJhbmdlICgiK3RoaXMuaW5kZXgrIikiLHRoaXMuc3RhY2s9KG5ldyBFcnJvcikuc3RhY2t9ZnVuY3Rpb24gcXAodCl7Zm9yKHZhciBlPVtdO0FycmF5LmlzQXJyYXkodCk7KWUucHVzaCh0Lmxlbmd0aCksdD10WzBdO3JldHVybiBlfWZ1bmN0aW9uIFZwKHQsZSxuKXt2YXIgcixpPXQubGVuZ3RoO2lmKGkhPT1lW25dKXRocm93IG5ldyBqcChpLGVbbl0pO2lmKG48ZS5sZW5ndGgtMSl7dmFyIG89bisxO2ZvcihyPTA7cjxpO3IrKyl7dmFyIHM9dFtyXTtpZighQXJyYXkuaXNBcnJheShzKSl0aHJvdyBuZXcganAoZS5sZW5ndGgtMSxlLmxlbmd0aCwiPCIpO1ZwKHRbcl0sZSxvKX19ZWxzZSBmb3Iocj0wO3I8aTtyKyspaWYoQXJyYXkuaXNBcnJheSh0W3JdKSl0aHJvdyBuZXcganAoZS5sZW5ndGgrMSxlLmxlbmd0aCwiPiIpfWZ1bmN0aW9uIEdwKHQsZSl7aWYoMD09PWUubGVuZ3RoKXtpZihBcnJheS5pc0FycmF5KHQpKXRocm93IG5ldyBqcCh0Lmxlbmd0aCwwKX1lbHNlIFZwKHQsZSwwKX1mdW5jdGlvbiBZcCh0LGUpe2lmKCFNZih0KXx8IVNwKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkluZGV4IG11c3QgYmUgYW4gaW50ZWdlciAodmFsdWU6ICIrdCsiKSIpO2lmKHQ8MHx8Im51bWJlciI9PXR5cGVvZiBlJiZ0Pj1lKXRocm93IG5ldyBVcCh0LGUpfWZ1bmN0aW9uIFhwKHQsZSxuKXtpZighQXJyYXkuaXNBcnJheSh0KXx8IUFycmF5LmlzQXJyYXkoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJyYXkgZXhwZWN0ZWQiKTtpZigwPT09ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJSZXNpemluZyB0byBzY2FsYXIgaXMgbm90IHN1cHBvcnRlZCIpO3JldHVybiBlLmZvckVhY2goKGZ1bmN0aW9uKHQpe2lmKCFNZih0KXx8IVNwKHQpfHx0PDApdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBzaXplLCBtdXN0IGNvbnRhaW4gcG9zaXRpdmUgaW50ZWdlcnMgKHNpemU6ICIra3AoZSkrIikiKX0pKSxXcCh0LGUsMCx2b2lkIDAhPT1uP246MCksdH1mdW5jdGlvbiBXcCh0LGUsbixyKXt2YXIgaSxvLHM9dC5sZW5ndGgsYT1lW25dLHU9TWF0aC5taW4ocyxhKTtpZih0Lmxlbmd0aD1hLG48ZS5sZW5ndGgtMSl7dmFyIGM9bisxO2ZvcihpPTA7aTx1O2krKylvPXRbaV0sQXJyYXkuaXNBcnJheShvKXx8KG89W29dLHRbaV09byksV3AobyxlLGMscik7Zm9yKGk9dTtpPGE7aSsrKW89W10sdFtpXT1vLFdwKG8sZSxjLHIpfWVsc2V7Zm9yKGk9MDtpPHU7aSsrKWZvcig7QXJyYXkuaXNBcnJheSh0W2ldKTspdFtpXT10W2ldWzBdO2ZvcihpPXU7aTxhO2krKyl0W2ldPXJ9fWZ1bmN0aW9uIEhwKHQsZSl7dmFyIG49ZnVuY3Rpb24odCl7aWYoIUFycmF5LmlzQXJyYXkodCkpcmV0dXJuIHQ7dmFyIGU9W107cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24gdChuKXtBcnJheS5pc0FycmF5KG4pP24uZm9yRWFjaCh0KTplLnB1c2gobil9KSksZX0odCkscj1uLmxlbmd0aDtpZighQXJyYXkuaXNBcnJheSh0KXx8IUFycmF5LmlzQXJyYXkoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJyYXkgZXhwZWN0ZWQiKTtpZigwPT09ZS5sZW5ndGgpdGhyb3cgbmV3IGpwKDAsciwiIT0iKTt2YXIgaT1LcChlPVpwKGUscikpO2lmKHIhPT1pKXRocm93IG5ldyBqcChpLHIsIiE9Iik7dHJ5e3JldHVybiBmdW5jdGlvbih0LGUpe2Zvcih2YXIgbixyPXQsaT1lLmxlbmd0aC0xO2k+MDtpLS0pe3ZhciBvPWVbaV07bj1bXTtmb3IodmFyIHM9ci5sZW5ndGgvbyxhPTA7YTxzO2ErKyluLnB1c2goci5zbGljZShhKm8sKGErMSkqbykpO3I9bn1yZXR1cm4gcn0obixlKX1jYXRjaCh0KXt0aHJvdyB0IGluc3RhbmNlb2YganA/bmV3IGpwKGksciwiIT0iKTp0fX1mdW5jdGlvbiBacCh0LGUpe3ZhciBuPUtwKHQpLHI9dC5zbGljZSgpLGk9dC5pbmRleE9mKC0xKTtpZih0LmluZGV4T2YoLTEsaSsxKT49MCl0aHJvdyBuZXcgRXJyb3IoIk1vcmUgdGhhbiBvbmUgd2lsZGNhcmQgaW4gc2l6ZXMiKTtpZihpPj0wKXtpZighKGUlbj09MCkpdGhyb3cgbmV3IEVycm9yKCJDb3VsZCBub3QgcmVwbGFjZSB3aWxkY2FyZCwgc2luY2UgIitlKyIgaXMgbm8gbXVsdGlwbGUgb2YgIistbik7cltpXT0tZS9ufXJldHVybiByfWZ1bmN0aW9uIEtwKHQpe3JldHVybiB0LnJlZHVjZSgoKHQsZSk9PnQqZSksMSl9ZnVuY3Rpb24gSnAodCxlLG4scil7dmFyIGk9cnx8cXAodCk7aWYobilmb3IodmFyIG89MDtvPG47bysrKXQ9W3RdLGkudW5zaGlmdCgxKTtmb3IodD1RcCh0LGUsMCk7aS5sZW5ndGg8ZTspaS5wdXNoKDEpO3JldHVybiB0fWZ1bmN0aW9uIFFwKHQsZSxuKXt2YXIgcixpO2lmKEFycmF5LmlzQXJyYXkodCkpe3ZhciBvPW4rMTtmb3Iocj0wLGk9dC5sZW5ndGg7cjxpO3IrKyl0W3JdPVFwKHRbcl0sZSxvKX1lbHNlIGZvcih2YXIgcz1uO3M8ZTtzKyspdD1bdF07cmV0dXJuIHR9ZnVuY3Rpb24gJHAodCxlKXtmb3IodmFyIG4scj0wLGk9MDtpPHQubGVuZ3RoO2krKyl7dmFyIG89dFtpXSxzPUFycmF5LmlzQXJyYXkobyk7aWYoMD09PWkmJnMmJihyPW8ubGVuZ3RoKSxzJiZvLmxlbmd0aCE9PXIpcmV0dXJuO3ZhciBhPXM/JHAobyxlKTplKG8pO2lmKHZvaWQgMD09PW4pbj1hO2Vsc2UgaWYobiE9PWEpcmV0dXJuIm1peGVkIn1yZXR1cm4gbn1mdW5jdGlvbiB0ZCh0LGUsbixyKXtmdW5jdGlvbiBpKHIpe3ZhciBpPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXt9LHI9MDtyPGUubGVuZ3RoO3IrKyl7dmFyIGk9ZVtyXSxvPXRbaV07dm9pZCAwIT09byYmKG5baV09byl9cmV0dXJuIG59KHIsZS5tYXAoZWQpKTtyZXR1cm4gZnVuY3Rpb24odCxlLG4pe3ZhciByPWUuZmlsdGVyKCh0PT4hZnVuY3Rpb24odCl7cmV0dXJuIHQmJiI/Ij09PXRbMF19KHQpKSkuZXZlcnkoKHQ9PnZvaWQgMCE9PW5bdF0pKTtpZighcil7dmFyIGk9ZS5maWx0ZXIoKHQ9PnZvaWQgMD09PW5bdF0pKTt0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjcmVhdGUgZnVuY3Rpb24gIicuY29uY2F0KHQsJyIsICcpKyJzb21lIGRlcGVuZGVuY2llcyBhcmUgbWlzc2luZzogIi5jb25jYXQoaS5tYXAoKHQ9PiciJy5jb25jYXQodCwnIicpKSkuam9pbigiLCAiKSwiLiIpKX19KHQsZSxyKSxuKGkpfXJldHVybiBpLmlzRmFjdG9yeT0hMCxpLmZuPXQsaS5kZXBlbmRlbmNpZXM9ZS5zbGljZSgpLnNvcnQoKSxyJiYoaS5tZXRhPXIpLGl9ZnVuY3Rpb24gZWQodCl7cmV0dXJuIHQmJiI/Ij09PXRbMF0/dC5zbGljZSgxKTp0fWZ1bmN0aW9uIG5kKHQsZSl7aWYob2QodCkmJmlkKHQsZSkpcmV0dXJuIHRbZV07dGhyb3ciZnVuY3Rpb24iPT10eXBlb2YgdFtlXSYmZnVuY3Rpb24odCxlKXtyZXR1cm4hKG51bGw9PXR8fCJmdW5jdGlvbiIhPXR5cGVvZiB0W2VdfHxfcCh0LGUpJiZPYmplY3QuZ2V0UHJvdG90eXBlT2YmJmUgaW4gT2JqZWN0LmdldFByb3RvdHlwZU9mKHQpKSYmKCEhX3AoYWQsZSl8fCEoZSBpbiBPYmplY3QucHJvdG90eXBlfHxlIGluIEZ1bmN0aW9uLnByb3RvdHlwZSkpfSh0LGUpP25ldyBFcnJvcignQ2Fubm90IGFjY2VzcyBtZXRob2QgIicrZSsnIiBhcyBhIHByb3BlcnR5Jyk6bmV3IEVycm9yKCdObyBhY2Nlc3MgdG8gcHJvcGVydHkgIicrZSsnIicpfWZ1bmN0aW9uIHJkKHQsZSxuKXtpZihvZCh0KSYmaWQodCxlKSlyZXR1cm4gdFtlXT1uLG47dGhyb3cgbmV3IEVycm9yKCdObyBhY2Nlc3MgdG8gcHJvcGVydHkgIicrZSsnIicpfWZ1bmN0aW9uIGlkKHQsZSl7cmV0dXJuISghdHx8Im9iamVjdCIhPXR5cGVvZiB0KSYmKCEhX3Aoc2QsZSl8fCEoZSBpbiBPYmplY3QucHJvdG90eXBlfHxlIGluIEZ1bmN0aW9uLnByb3RvdHlwZSkpfWZ1bmN0aW9uIG9kKHQpe3JldHVybiJvYmplY3QiPT10eXBlb2YgdCYmdCYmdC5jb25zdHJ1Y3Rvcj09PU9iamVjdH1qcC5wcm90b3R5cGU9bmV3IFJhbmdlRXJyb3IsanAucHJvdG90eXBlLmNvbnN0cnVjdG9yPVJhbmdlRXJyb3IsanAucHJvdG90eXBlLm5hbWU9IkRpbWVuc2lvbkVycm9yIixqcC5wcm90b3R5cGUuaXNEaW1lbnNpb25FcnJvcj0hMCxVcC5wcm90b3R5cGU9bmV3IFJhbmdlRXJyb3IsVXAucHJvdG90eXBlLmNvbnN0cnVjdG9yPVJhbmdlRXJyb3IsVXAucHJvdG90eXBlLm5hbWU9IkluZGV4RXJyb3IiLFVwLnByb3RvdHlwZS5pc0luZGV4RXJyb3I9ITA7dmFyIHNkPXtsZW5ndGg6ITAsbmFtZTohMH0sYWQ9e3RvU3RyaW5nOiEwLHZhbHVlT2Y6ITAsdG9Mb2NhbGVTdHJpbmc6ITB9O2NsYXNzIHVke2NvbnN0cnVjdG9yKHQpe3RoaXMud3JhcHBlZE9iamVjdD10fWtleXMoKXtyZXR1cm4gT2JqZWN0LmtleXModGhpcy53cmFwcGVkT2JqZWN0KX1nZXQodCl7cmV0dXJuIG5kKHRoaXMud3JhcHBlZE9iamVjdCx0KX1zZXQodCxlKXtyZXR1cm4gcmQodGhpcy53cmFwcGVkT2JqZWN0LHQsZSksdGhpc31oYXModCl7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUgaW4gdH0odGhpcy53cmFwcGVkT2JqZWN0LHQpfX1mdW5jdGlvbiBjZCh0KXtyZXR1cm4hIXQmJih0IGluc3RhbmNlb2YgTWFwfHx0IGluc3RhbmNlb2YgdWR8fCJmdW5jdGlvbiI9PXR5cGVvZiB0LnNldCYmImZ1bmN0aW9uIj09dHlwZW9mIHQuZ2V0JiYiZnVuY3Rpb24iPT10eXBlb2YgdC5rZXlzJiYiZnVuY3Rpb24iPT10eXBlb2YgdC5oYXMpfXZhciBsZD1mdW5jdGlvbigpe3JldHVybiBsZD1DcC5jcmVhdGUsQ3B9LGhkPXRkKCJ0eXBlZCIsWyI/QmlnTnVtYmVyIiwiP0NvbXBsZXgiLCI/RGVuc2VNYXRyaXgiLCI/RnJhY3Rpb24iXSwoZnVuY3Rpb24odCl7dmFye0JpZ051bWJlcjplLENvbXBsZXg6bixEZW5zZU1hdHJpeDpyLEZyYWN0aW9uOml9PXQsbz1sZCgpO3JldHVybiBvLmNsZWFyKCksby5hZGRUeXBlcyhbe25hbWU6Im51bWJlciIsdGVzdDpNZn0se25hbWU6IkNvbXBsZXgiLHRlc3Q6VGZ9LHtuYW1lOiJCaWdOdW1iZXIiLHRlc3Q6RmZ9LHtuYW1lOiJGcmFjdGlvbiIsdGVzdDpPZn0se25hbWU6IlVuaXQiLHRlc3Q6TGZ9LHtuYW1lOiJpZGVudGlmaWVyIix0ZXN0OnQ9PlJmJiYvXig/OltBLVphLXpceEFBXHhCNVx4QkFceEMwLVx4RDZceEQ4LVx4RjZceEY4LVx1MDJDMVx1MDJDNi1cdTAyRDFcdTAyRTAtXHUwMkU0XHUwMkVDXHUwMkVFXHUwMzcwLVx1MDM3NFx1MDM3Nlx1MDM3N1x1MDM3QS1cdTAzN0RcdTAzN0ZcdTAzODZcdTAzODgtXHUwMzhBXHUwMzhDXHUwMzhFLVx1MDNBMVx1MDNBMy1cdTAzRjVcdTAzRjctXHUwNDgxXHUwNDhBLVx1MDUyRlx1MDUzMS1cdTA1NTZcdTA1NTlcdTA1NjAtXHUwNTg4XHUwNUQwLVx1MDVFQVx1MDVFRi1cdTA1RjJcdTA2MjAtXHUwNjRBXHUwNjZFXHUwNjZGXHUwNjcxLVx1MDZEM1x1MDZENVx1MDZFNVx1MDZFNlx1MDZFRVx1MDZFRlx1MDZGQS1cdTA2RkNcdTA2RkZcdTA3MTBcdTA3MTItXHUwNzJGXHUwNzRELVx1MDdBNVx1MDdCMVx1MDdDQS1cdTA3RUFcdTA3RjRcdTA3RjVcdTA3RkFcdTA4MDAtXHUwODE1XHUwODFBXHUwODI0XHUwODI4XHUwODQwLVx1MDg1OFx1MDg2MC1cdTA4NkFcdTA4NzAtXHUwODg3XHUwODg5LVx1MDg4RVx1MDhBMC1cdTA4QzlcdTA5MDQtXHUwOTM5XHUwOTNEXHUwOTUwXHUwOTU4LVx1MDk2MVx1MDk3MS1cdTA5ODBcdTA5ODUtXHUwOThDXHUwOThGXHUwOTkwXHUwOTkzLVx1MDlBOFx1MDlBQS1cdTA5QjBcdTA5QjJcdTA5QjYtXHUwOUI5XHUwOUJEXHUwOUNFXHUwOURDXHUwOUREXHUwOURGLVx1MDlFMVx1MDlGMFx1MDlGMVx1MDlGQ1x1MEEwNS1cdTBBMEFcdTBBMEZcdTBBMTBcdTBBMTMtXHUwQTI4XHUwQTJBLVx1MEEzMFx1MEEzMlx1MEEzM1x1MEEzNVx1MEEzNlx1MEEzOFx1MEEzOVx1MEE1OS1cdTBBNUNcdTBBNUVcdTBBNzItXHUwQTc0XHUwQTg1LVx1MEE4RFx1MEE4Ri1cdTBBOTFcdTBBOTMtXHUwQUE4XHUwQUFBLVx1MEFCMFx1MEFCMlx1MEFCM1x1MEFCNS1cdTBBQjlcdTBBQkRcdTBBRDBcdTBBRTBcdTBBRTFcdTBBRjlcdTBCMDUtXHUwQjBDXHUwQjBGXHUwQjEwXHUwQjEzLVx1MEIyOFx1MEIyQS1cdTBCMzBcdTBCMzJcdTBCMzNcdTBCMzUtXHUwQjM5XHUwQjNEXHUwQjVDXHUwQjVEXHUwQjVGLVx1MEI2MVx1MEI3MVx1MEI4M1x1MEI4NS1cdTBCOEFcdTBCOEUtXHUwQjkwXHUwQjkyLVx1MEI5NVx1MEI5OVx1MEI5QVx1MEI5Q1x1MEI5RVx1MEI5Rlx1MEJBM1x1MEJBNFx1MEJBOC1cdTBCQUFcdTBCQUUtXHUwQkI5XHUwQkQwXHUwQzA1LVx1MEMwQ1x1MEMwRS1cdTBDMTBcdTBDMTItXHUwQzI4XHUwQzJBLVx1MEMzOVx1MEMzRFx1MEM1OC1cdTBDNUFcdTBDNURcdTBDNjBcdTBDNjFcdTBDODBcdTBDODUtXHUwQzhDXHUwQzhFLVx1MEM5MFx1MEM5Mi1cdTBDQThcdTBDQUEtXHUwQ0IzXHUwQ0I1LVx1MENCOVx1MENCRFx1MENERFx1MENERVx1MENFMFx1MENFMVx1MENGMVx1MENGMlx1MEQwNC1cdTBEMENcdTBEMEUtXHUwRDEwXHUwRDEyLVx1MEQzQVx1MEQzRFx1MEQ0RVx1MEQ1NC1cdTBENTZcdTBENUYtXHUwRDYxXHUwRDdBLVx1MEQ3Rlx1MEQ4NS1cdTBEOTZcdTBEOUEtXHUwREIxXHUwREIzLVx1MERCQlx1MERCRFx1MERDMC1cdTBEQzZcdTBFMDEtXHUwRTMwXHUwRTMyXHUwRTMzXHUwRTQwLVx1MEU0Nlx1MEU4MVx1MEU4Mlx1MEU4NFx1MEU4Ni1cdTBFOEFcdTBFOEMtXHUwRUEzXHUwRUE1XHUwRUE3LVx1MEVCMFx1MEVCMlx1MEVCM1x1MEVCRFx1MEVDMC1cdTBFQzRcdTBFQzZcdTBFREMtXHUwRURGXHUwRjAwXHUwRjQwLVx1MEY0N1x1MEY0OS1cdTBGNkNcdTBGODgtXHUwRjhDXHUxMDAwLVx1MTAyQVx1MTAzRlx1MTA1MC1cdTEwNTVcdTEwNUEtXHUxMDVEXHUxMDYxXHUxMDY1XHUxMDY2XHUxMDZFLVx1MTA3MFx1MTA3NS1cdTEwODFcdTEwOEVcdTEwQTAtXHUxMEM1XHUxMEM3XHUxMENEXHUxMEQwLVx1MTBGQVx1MTBGQy1cdTEyNDhcdTEyNEEtXHUxMjREXHUxMjUwLVx1MTI1Nlx1MTI1OFx1MTI1QS1cdTEyNURcdTEyNjAtXHUxMjg4XHUxMjhBLVx1MTI4RFx1MTI5MC1cdTEyQjBcdTEyQjItXHUxMkI1XHUxMkI4LVx1MTJCRVx1MTJDMFx1MTJDMi1cdTEyQzVcdTEyQzgtXHUxMkQ2XHUxMkQ4LVx1MTMxMFx1MTMxMi1cdTEzMTVcdTEzMTgtXHUxMzVBXHUxMzgwLVx1MTM4Rlx1MTNBMC1cdTEzRjVcdTEzRjgtXHUxM0ZEXHUxNDAxLVx1MTY2Q1x1MTY2Ri1cdTE2N0ZcdTE2ODEtXHUxNjlBXHUxNkEwLVx1MTZFQVx1MTZGMS1cdTE2RjhcdTE3MDAtXHUxNzExXHUxNzFGLVx1MTczMVx1MTc0MC1cdTE3NTFcdTE3NjAtXHUxNzZDXHUxNzZFLVx1MTc3MFx1MTc4MC1cdTE3QjNcdTE3RDdcdTE3RENcdTE4MjAtXHUxODc4XHUxODgwLVx1MTg4NFx1MTg4Ny1cdTE4QThcdTE4QUFcdTE4QjAtXHUxOEY1XHUxOTAwLVx1MTkxRVx1MTk1MC1cdTE5NkRcdTE5NzAtXHUxOTc0XHUxOTgwLVx1MTlBQlx1MTlCMC1cdTE5QzlcdTFBMDAtXHUxQTE2XHUxQTIwLVx1MUE1NFx1MUFBN1x1MUIwNS1cdTFCMzNcdTFCNDUtXHUxQjRDXHUxQjgzLVx1MUJBMFx1MUJBRVx1MUJBRlx1MUJCQS1cdTFCRTVcdTFDMDAtXHUxQzIzXHUxQzRELVx1MUM0Rlx1MUM1QS1cdTFDN0RcdTFDODAtXHUxQzg4XHUxQzkwLVx1MUNCQVx1MUNCRC1cdTFDQkZcdTFDRTktXHUxQ0VDXHUxQ0VFLVx1MUNGM1x1MUNGNVx1MUNGNlx1MUNGQVx1MUQwMC1cdTFEQkZcdTFFMDAtXHUxRjE1XHUxRjE4LVx1MUYxRFx1MUYyMC1cdTFGNDVcdTFGNDgtXHUxRjREXHUxRjUwLVx1MUY1N1x1MUY1OVx1MUY1Qlx1MUY1RFx1MUY1Ri1cdTFGN0RcdTFGODAtXHUxRkI0XHUxRkI2LVx1MUZCQ1x1MUZCRVx1MUZDMi1cdTFGQzRcdTFGQzYtXHUxRkNDXHUxRkQwLVx1MUZEM1x1MUZENi1cdTFGREJcdTFGRTAtXHUxRkVDXHUxRkYyLVx1MUZGNFx1MUZGNi1cdTFGRkNcdTIwNzFcdTIwN0ZcdTIwOTAtXHUyMDlDXHUyMTAyXHUyMTA3XHUyMTBBLVx1MjExM1x1MjExNVx1MjExOS1cdTIxMURcdTIxMjRcdTIxMjZcdTIxMjhcdTIxMkEtXHUyMTJEXHUyMTJGLVx1MjEzOVx1MjEzQy1cdTIxM0ZcdTIxNDUtXHUyMTQ5XHUyMTRFXHUyMTgzXHUyMTg0XHUyQzAwLVx1MkNFNFx1MkNFQi1cdTJDRUVcdTJDRjJcdTJDRjNcdTJEMDAtXHUyRDI1XHUyRDI3XHUyRDJEXHUyRDMwLVx1MkQ2N1x1MkQ2Rlx1MkQ4MC1cdTJEOTZcdTJEQTAtXHUyREE2XHUyREE4LVx1MkRBRVx1MkRCMC1cdTJEQjZcdTJEQjgtXHUyREJFXHUyREMwLVx1MkRDNlx1MkRDOC1cdTJEQ0VcdTJERDAtXHUyREQ2XHUyREQ4LVx1MkRERVx1MkUyRlx1MzAwNVx1MzAwNlx1MzAzMS1cdTMwMzVcdTMwM0JcdTMwM0NcdTMwNDEtXHUzMDk2XHUzMDlELVx1MzA5Rlx1MzBBMS1cdTMwRkFcdTMwRkMtXHUzMEZGXHUzMTA1LVx1MzEyRlx1MzEzMS1cdTMxOEVcdTMxQTAtXHUzMUJGXHUzMUYwLVx1MzFGRlx1MzQwMC1cdTREQkZcdTRFMDAtXHVBNDhDXHVBNEQwLVx1QTRGRFx1QTUwMC1cdUE2MENcdUE2MTAtXHVBNjFGXHVBNjJBXHVBNjJCXHVBNjQwLVx1QTY2RVx1QTY3Ri1cdUE2OURcdUE2QTAtXHVBNkU1XHVBNzE3LVx1QTcxRlx1QTcyMi1cdUE3ODhcdUE3OEItXHVBN0NBXHVBN0QwXHVBN0QxXHVBN0QzXHVBN0Q1LVx1QTdEOVx1QTdGMi1cdUE4MDFcdUE4MDMtXHVBODA1XHVBODA3LVx1QTgwQVx1QTgwQy1cdUE4MjJcdUE4NDAtXHVBODczXHVBODgyLVx1QThCM1x1QThGMi1cdUE4RjdcdUE4RkJcdUE4RkRcdUE4RkVcdUE5MEEtXHVBOTI1XHVBOTMwLVx1QTk0Nlx1QTk2MC1cdUE5N0NcdUE5ODQtXHVBOUIyXHVBOUNGXHVBOUUwLVx1QTlFNFx1QTlFNi1cdUE5RUZcdUE5RkEtXHVBOUZFXHVBQTAwLVx1QUEyOFx1QUE0MC1cdUFBNDJcdUFBNDQtXHVBQTRCXHVBQTYwLVx1QUE3Nlx1QUE3QVx1QUE3RS1cdUFBQUZcdUFBQjFcdUFBQjVcdUFBQjZcdUFBQjktXHVBQUJEXHVBQUMwXHVBQUMyXHVBQURCLVx1QUFERFx1QUFFMC1cdUFBRUFcdUFBRjItXHVBQUY0XHVBQjAxLVx1QUIwNlx1QUIwOS1cdUFCMEVcdUFCMTEtXHVBQjE2XHVBQjIwLVx1QUIyNlx1QUIyOC1cdUFCMkVcdUFCMzAtXHVBQjVBXHVBQjVDLVx1QUI2OVx1QUI3MC1cdUFCRTJcdUFDMDAtXHVEN0EzXHVEN0IwLVx1RDdDNlx1RDdDQi1cdUQ3RkJcdUY5MDAtXHVGQTZEXHVGQTcwLVx1RkFEOVx1RkIwMC1cdUZCMDZcdUZCMTMtXHVGQjE3XHVGQjFEXHVGQjFGLVx1RkIyOFx1RkIyQS1cdUZCMzZcdUZCMzgtXHVGQjNDXHVGQjNFXHVGQjQwXHVGQjQxXHVGQjQzXHVGQjQ0XHVGQjQ2LVx1RkJCMVx1RkJEMy1cdUZEM0RcdUZENTAtXHVGRDhGXHVGRDkyLVx1RkRDN1x1RkRGMC1cdUZERkJcdUZFNzAtXHVGRTc0XHVGRTc2LVx1RkVGQ1x1RkYyMS1cdUZGM0FcdUZGNDEtXHVGRjVBXHVGRjY2LVx1RkZCRVx1RkZDMi1cdUZGQzdcdUZGQ0EtXHVGRkNGXHVGRkQyLVx1RkZEN1x1RkZEQS1cdUZGRENdfFx1RDgwMFtcdURDMDAtXHVEQzBCXHVEQzBELVx1REMyNlx1REMyOC1cdURDM0FcdURDM0NcdURDM0RcdURDM0YtXHVEQzREXHVEQzUwLVx1REM1RFx1REM4MC1cdURDRkFcdURFODAtXHVERTlDXHVERUEwLVx1REVEMFx1REYwMC1cdURGMUZcdURGMkQtXHVERjQwXHVERjQyLVx1REY0OVx1REY1MC1cdURGNzVcdURGODAtXHVERjlEXHVERkEwLVx1REZDM1x1REZDOC1cdURGQ0ZdfFx1RDgwMVtcdURDMDAtXHVEQzlEXHVEQ0IwLVx1RENEM1x1RENEOC1cdURDRkJcdUREMDAtXHVERDI3XHVERDMwLVx1REQ2M1x1REQ3MC1cdUREN0FcdUREN0MtXHVERDhBXHVERDhDLVx1REQ5Mlx1REQ5NFx1REQ5NVx1REQ5Ny1cdUREQTFcdUREQTMtXHVEREIxXHVEREIzLVx1RERCOVx1RERCQlx1RERCQ1x1REUwMC1cdURGMzZcdURGNDAtXHVERjU1XHVERjYwLVx1REY2N1x1REY4MC1cdURGODVcdURGODctXHVERkIwXHVERkIyLVx1REZCQV18XHVEODAyW1x1REMwMC1cdURDMDVcdURDMDhcdURDMEEtXHVEQzM1XHVEQzM3XHVEQzM4XHVEQzNDXHVEQzNGLVx1REM1NVx1REM2MC1cdURDNzZcdURDODAtXHVEQzlFXHVEQ0UwLVx1RENGMlx1RENGNFx1RENGNVx1REQwMC1cdUREMTVcdUREMjAtXHVERDM5XHVERDgwLVx1RERCN1x1RERCRVx1RERCRlx1REUwMFx1REUxMC1cdURFMTNcdURFMTUtXHVERTE3XHVERTE5LVx1REUzNVx1REU2MC1cdURFN0NcdURFODAtXHVERTlDXHVERUMwLVx1REVDN1x1REVDOS1cdURFRTRcdURGMDAtXHVERjM1XHVERjQwLVx1REY1NVx1REY2MC1cdURGNzJcdURGODAtXHVERjkxXXxcdUQ4MDNbXHVEQzAwLVx1REM0OFx1REM4MC1cdURDQjJcdURDQzAtXHVEQ0YyXHVERDAwLVx1REQyM1x1REU4MC1cdURFQTlcdURFQjBcdURFQjFcdURGMDAtXHVERjFDXHVERjI3XHVERjMwLVx1REY0NVx1REY3MC1cdURGODFcdURGQjAtXHVERkM0XHVERkUwLVx1REZGNl18XHVEODA0W1x1REMwMy1cdURDMzdcdURDNzFcdURDNzJcdURDNzVcdURDODMtXHVEQ0FGXHVEQ0QwLVx1RENFOFx1REQwMy1cdUREMjZcdURENDRcdURENDdcdURENTAtXHVERDcyXHVERDc2XHVERDgzLVx1RERCMlx1RERDMS1cdUREQzRcdUREREFcdURERENcdURFMDAtXHVERTExXHVERTEzLVx1REUyQlx1REUzRlx1REU0MFx1REU4MC1cdURFODZcdURFODhcdURFOEEtXHVERThEXHVERThGLVx1REU5RFx1REU5Ri1cdURFQThcdURFQjAtXHVERURFXHVERjA1LVx1REYwQ1x1REYwRlx1REYxMFx1REYxMy1cdURGMjhcdURGMkEtXHVERjMwXHVERjMyXHVERjMzXHVERjM1LVx1REYzOVx1REYzRFx1REY1MFx1REY1RC1cdURGNjFdfFx1RDgwNVtcdURDMDAtXHVEQzM0XHVEQzQ3LVx1REM0QVx1REM1Ri1cdURDNjFcdURDODAtXHVEQ0FGXHVEQ0M0XHVEQ0M1XHVEQ0M3XHVERDgwLVx1RERBRVx1REREOC1cdUREREJcdURFMDAtXHVERTJGXHVERTQ0XHVERTgwLVx1REVBQVx1REVCOFx1REYwMC1cdURGMUFcdURGNDAtXHVERjQ2XXxcdUQ4MDZbXHVEQzAwLVx1REMyQlx1RENBMC1cdURDREZcdURDRkYtXHVERDA2XHVERDA5XHVERDBDLVx1REQxM1x1REQxNVx1REQxNlx1REQxOC1cdUREMkZcdUREM0ZcdURENDFcdUREQTAtXHVEREE3XHVEREFBLVx1REREMFx1RERFMVx1RERFM1x1REUwMFx1REUwQi1cdURFMzJcdURFM0FcdURFNTBcdURFNUMtXHVERTg5XHVERTlEXHVERUIwLVx1REVGOF18XHVEODA3W1x1REMwMC1cdURDMDhcdURDMEEtXHVEQzJFXHVEQzQwXHVEQzcyLVx1REM4Rlx1REQwMC1cdUREMDZcdUREMDhcdUREMDlcdUREMEItXHVERDMwXHVERDQ2XHVERDYwLVx1REQ2NVx1REQ2N1x1REQ2OFx1REQ2QS1cdUREODlcdUREOThcdURFRTAtXHVERUYyXHVERjAyXHVERjA0LVx1REYxMFx1REYxMi1cdURGMzNcdURGQjBdfFx1RDgwOFtcdURDMDAtXHVERjk5XXxcdUQ4MDlbXHVEQzgwLVx1REQ0M118XHVEODBCW1x1REY5MC1cdURGRjBdfFtcdUQ4MENcdUQ4MUMtXHVEODIwXHVEODIyXHVEODQwLVx1RDg2OFx1RDg2QS1cdUQ4NkNcdUQ4NkYtXHVEODcyXHVEODc0LVx1RDg3OVx1RDg4MC1cdUQ4ODNcdUQ4ODUtXHVEODg3XVtcdURDMDAtXHVERkZGXXxcdUQ4MERbXHVEQzAwLVx1REMyRlx1REM0MS1cdURDNDZdfFx1RDgxMVtcdURDMDAtXHVERTQ2XXxcdUQ4MUFbXHVEQzAwLVx1REUzOFx1REU0MC1cdURFNUVcdURFNzAtXHVERUJFXHVERUQwLVx1REVFRFx1REYwMC1cdURGMkZcdURGNDAtXHVERjQzXHVERjYzLVx1REY3N1x1REY3RC1cdURGOEZdfFx1RDgxQltcdURFNDAtXHVERTdGXHVERjAwLVx1REY0QVx1REY1MFx1REY5My1cdURGOUZcdURGRTBcdURGRTFcdURGRTNdfFx1RDgyMVtcdURDMDAtXHVERkY3XXxcdUQ4MjNbXHVEQzAwLVx1RENENVx1REQwMC1cdUREMDhdfFx1RDgyQltcdURGRjAtXHVERkYzXHVERkY1LVx1REZGQlx1REZGRFx1REZGRV18XHVEODJDW1x1REMwMC1cdUREMjJcdUREMzJcdURENTAtXHVERDUyXHVERDU1XHVERDY0LVx1REQ2N1x1REQ3MC1cdURFRkJdfFx1RDgyRltcdURDMDAtXHVEQzZBXHVEQzcwLVx1REM3Q1x1REM4MC1cdURDODhcdURDOTAtXHVEQzk5XXxcdUQ4MzVbXHVEQzAwLVx1REM1NFx1REM1Ni1cdURDOUNcdURDOUVcdURDOUZcdURDQTJcdURDQTVcdURDQTZcdURDQTktXHVEQ0FDXHVEQ0FFLVx1RENCOVx1RENCQlx1RENCRC1cdURDQzNcdURDQzUtXHVERDA1XHVERDA3LVx1REQwQVx1REQwRC1cdUREMTRcdUREMTYtXHVERDFDXHVERDFFLVx1REQzOVx1REQzQi1cdUREM0VcdURENDAtXHVERDQ0XHVERDQ2XHVERDRBLVx1REQ1MFx1REQ1Mi1cdURFQTVcdURFQTgtXHVERUMwXHVERUMyLVx1REVEQVx1REVEQy1cdURFRkFcdURFRkMtXHVERjE0XHVERjE2LVx1REYzNFx1REYzNi1cdURGNEVcdURGNTAtXHVERjZFXHVERjcwLVx1REY4OFx1REY4QS1cdURGQThcdURGQUEtXHVERkMyXHVERkM0LVx1REZDQl18XHVEODM3W1x1REYwMC1cdURGMUVcdURGMjUtXHVERjJBXXxcdUQ4MzhbXHVEQzMwLVx1REM2RFx1REQwMC1cdUREMkNcdUREMzctXHVERDNEXHVERDRFXHVERTkwLVx1REVBRFx1REVDMC1cdURFRUJdfFx1RDgzOVtcdURDRDAtXHVEQ0VCXHVERkUwLVx1REZFNlx1REZFOC1cdURGRUJcdURGRURcdURGRUVcdURGRjAtXHVERkZFXXxcdUQ4M0FbXHVEQzAwLVx1RENDNFx1REQwMC1cdURENDNcdURENEJdfFx1RDgzQltcdURFMDAtXHVERTAzXHVERTA1LVx1REUxRlx1REUyMVx1REUyMlx1REUyNFx1REUyN1x1REUyOS1cdURFMzJcdURFMzQtXHVERTM3XHVERTM5XHVERTNCXHVERTQyXHVERTQ3XHVERTQ5XHVERTRCXHVERTRELVx1REU0Rlx1REU1MVx1REU1Mlx1REU1NFx1REU1N1x1REU1OVx1REU1Qlx1REU1RFx1REU1Rlx1REU2MVx1REU2Mlx1REU2NFx1REU2Ny1cdURFNkFcdURFNkMtXHVERTcyXHVERTc0LVx1REU3N1x1REU3OS1cdURFN0NcdURFN0VcdURFODAtXHVERTg5XHVERThCLVx1REU5Qlx1REVBMS1cdURFQTNcdURFQTUtXHVERUE5XHVERUFCLVx1REVCQl18XHVEODY5W1x1REMwMC1cdURFREZcdURGMDAtXHVERkZGXXxcdUQ4NkRbXHVEQzAwLVx1REYzOVx1REY0MC1cdURGRkZdfFx1RDg2RVtcdURDMDAtXHVEQzFEXHVEQzIwLVx1REZGRl18XHVEODczW1x1REMwMC1cdURFQTFcdURFQjAtXHVERkZGXXxcdUQ4N0FbXHVEQzAwLVx1REZFMF18XHVEODdFW1x1REMwMC1cdURFMURdfFx1RDg4NFtcdURDMDAtXHVERjRBXHVERjUwLVx1REZGRl18XHVEODg4W1x1REMwMC1cdURGQUZdKSg/OlswLTlBLVphLXpceEFBXHhCNVx4QkFceEMwLVx4RDZceEQ4LVx4RjZceEY4LVx1MDJDMVx1MDJDNi1cdTAyRDFcdTAyRTAtXHUwMkU0XHUwMkVDXHUwMkVFXHUwMzcwLVx1MDM3NFx1MDM3Nlx1MDM3N1x1MDM3QS1cdTAzN0RcdTAzN0ZcdTAzODZcdTAzODgtXHUwMzhBXHUwMzhDXHUwMzhFLVx1MDNBMVx1MDNBMy1cdTAzRjVcdTAzRjctXHUwNDgxXHUwNDhBLVx1MDUyRlx1MDUzMS1cdTA1NTZcdTA1NTlcdTA1NjAtXHUwNTg4XHUwNUQwLVx1MDVFQVx1MDVFRi1cdTA1RjJcdTA2MjAtXHUwNjRBXHUwNjZFXHUwNjZGXHUwNjcxLVx1MDZEM1x1MDZENVx1MDZFNVx1MDZFNlx1MDZFRVx1MDZFRlx1MDZGQS1cdTA2RkNcdTA2RkZcdTA3MTBcdTA3MTItXHUwNzJGXHUwNzRELVx1MDdBNVx1MDdCMVx1MDdDQS1cdTA3RUFcdTA3RjRcdTA3RjVcdTA3RkFcdTA4MDAtXHUwODE1XHUwODFBXHUwODI0XHUwODI4XHUwODQwLVx1MDg1OFx1MDg2MC1cdTA4NkFcdTA4NzAtXHUwODg3XHUwODg5LVx1MDg4RVx1MDhBMC1cdTA4QzlcdTA5MDQtXHUwOTM5XHUwOTNEXHUwOTUwXHUwOTU4LVx1MDk2MVx1MDk3MS1cdTA5ODBcdTA5ODUtXHUwOThDXHUwOThGXHUwOTkwXHUwOTkzLVx1MDlBOFx1MDlBQS1cdTA5QjBcdTA5QjJcdTA5QjYtXHUwOUI5XHUwOUJEXHUwOUNFXHUwOURDXHUwOUREXHUwOURGLVx1MDlFMVx1MDlGMFx1MDlGMVx1MDlGQ1x1MEEwNS1cdTBBMEFcdTBBMEZcdTBBMTBcdTBBMTMtXHUwQTI4XHUwQTJBLVx1MEEzMFx1MEEzMlx1MEEzM1x1MEEzNVx1MEEzNlx1MEEzOFx1MEEzOVx1MEE1OS1cdTBBNUNcdTBBNUVcdTBBNzItXHUwQTc0XHUwQTg1LVx1MEE4RFx1MEE4Ri1cdTBBOTFcdTBBOTMtXHUwQUE4XHUwQUFBLVx1MEFCMFx1MEFCMlx1MEFCM1x1MEFCNS1cdTBBQjlcdTBBQkRcdTBBRDBcdTBBRTBcdTBBRTFcdTBBRjlcdTBCMDUtXHUwQjBDXHUwQjBGXHUwQjEwXHUwQjEzLVx1MEIyOFx1MEIyQS1cdTBCMzBcdTBCMzJcdTBCMzNcdTBCMzUtXHUwQjM5XHUwQjNEXHUwQjVDXHUwQjVEXHUwQjVGLVx1MEI2MVx1MEI3MVx1MEI4M1x1MEI4NS1cdTBCOEFcdTBCOEUtXHUwQjkwXHUwQjkyLVx1MEI5NVx1MEI5OVx1MEI5QVx1MEI5Q1x1MEI5RVx1MEI5Rlx1MEJBM1x1MEJBNFx1MEJBOC1cdTBCQUFcdTBCQUUtXHUwQkI5XHUwQkQwXHUwQzA1LVx1MEMwQ1x1MEMwRS1cdTBDMTBcdTBDMTItXHUwQzI4XHUwQzJBLVx1MEMzOVx1MEMzRFx1MEM1OC1cdTBDNUFcdTBDNURcdTBDNjBcdTBDNjFcdTBDODBcdTBDODUtXHUwQzhDXHUwQzhFLVx1MEM5MFx1MEM5Mi1cdTBDQThcdTBDQUEtXHUwQ0IzXHUwQ0I1LVx1MENCOVx1MENCRFx1MENERFx1MENERVx1MENFMFx1MENFMVx1MENGMVx1MENGMlx1MEQwNC1cdTBEMENcdTBEMEUtXHUwRDEwXHUwRDEyLVx1MEQzQVx1MEQzRFx1MEQ0RVx1MEQ1NC1cdTBENTZcdTBENUYtXHUwRDYxXHUwRDdBLVx1MEQ3Rlx1MEQ4NS1cdTBEOTZcdTBEOUEtXHUwREIxXHUwREIzLVx1MERCQlx1MERCRFx1MERDMC1cdTBEQzZcdTBFMDEtXHUwRTMwXHUwRTMyXHUwRTMzXHUwRTQwLVx1MEU0Nlx1MEU4MVx1MEU4Mlx1MEU4NFx1MEU4Ni1cdTBFOEFcdTBFOEMtXHUwRUEzXHUwRUE1XHUwRUE3LVx1MEVCMFx1MEVCMlx1MEVCM1x1MEVCRFx1MEVDMC1cdTBFQzRcdTBFQzZcdTBFREMtXHUwRURGXHUwRjAwXHUwRjQwLVx1MEY0N1x1MEY0OS1cdTBGNkNcdTBGODgtXHUwRjhDXHUxMDAwLVx1MTAyQVx1MTAzRlx1MTA1MC1cdTEwNTVcdTEwNUEtXHUxMDVEXHUxMDYxXHUxMDY1XHUxMDY2XHUxMDZFLVx1MTA3MFx1MTA3NS1cdTEwODFcdTEwOEVcdTEwQTAtXHUxMEM1XHUxMEM3XHUxMENEXHUxMEQwLVx1MTBGQVx1MTBGQy1cdTEyNDhcdTEyNEEtXHUxMjREXHUxMjUwLVx1MTI1Nlx1MTI1OFx1MTI1QS1cdTEyNURcdTEyNjAtXHUxMjg4XHUxMjhBLVx1MTI4RFx1MTI5MC1cdTEyQjBcdTEyQjItXHUxMkI1XHUxMkI4LVx1MTJCRVx1MTJDMFx1MTJDMi1cdTEyQzVcdTEyQzgtXHUxMkQ2XHUxMkQ4LVx1MTMxMFx1MTMxMi1cdTEzMTVcdTEzMTgtXHUxMzVBXHUxMzgwLVx1MTM4Rlx1MTNBMC1cdTEzRjVcdTEzRjgtXHUxM0ZEXHUxNDAxLVx1MTY2Q1x1MTY2Ri1cdTE2N0ZcdTE2ODEtXHUxNjlBXHUxNkEwLVx1MTZFQVx1MTZGMS1cdTE2RjhcdTE3MDAtXHUxNzExXHUxNzFGLVx1MTczMVx1MTc0MC1cdTE3NTFcdTE3NjAtXHUxNzZDXHUxNzZFLVx1MTc3MFx1MTc4MC1cdTE3QjNcdTE3RDdcdTE3RENcdTE4MjAtXHUxODc4XHUxODgwLVx1MTg4NFx1MTg4Ny1cdTE4QThcdTE4QUFcdTE4QjAtXHUxOEY1XHUxOTAwLVx1MTkxRVx1MTk1MC1cdTE5NkRcdTE5NzAtXHUxOTc0XHUxOTgwLVx1MTlBQlx1MTlCMC1cdTE5QzlcdTFBMDAtXHUxQTE2XHUxQTIwLVx1MUE1NFx1MUFBN1x1MUIwNS1cdTFCMzNcdTFCNDUtXHUxQjRDXHUxQjgzLVx1MUJBMFx1MUJBRVx1MUJBRlx1MUJCQS1cdTFCRTVcdTFDMDAtXHUxQzIzXHUxQzRELVx1MUM0Rlx1MUM1QS1cdTFDN0RcdTFDODAtXHUxQzg4XHUxQzkwLVx1MUNCQVx1MUNCRC1cdTFDQkZcdTFDRTktXHUxQ0VDXHUxQ0VFLVx1MUNGM1x1MUNGNVx1MUNGNlx1MUNGQVx1MUQwMC1cdTFEQkZcdTFFMDAtXHUxRjE1XHUxRjE4LVx1MUYxRFx1MUYyMC1cdTFGNDVcdTFGNDgtXHUxRjREXHUxRjUwLVx1MUY1N1x1MUY1OVx1MUY1Qlx1MUY1RFx1MUY1Ri1cdTFGN0RcdTFGODAtXHUxRkI0XHUxRkI2LVx1MUZCQ1x1MUZCRVx1MUZDMi1cdTFGQzRcdTFGQzYtXHUxRkNDXHUxRkQwLVx1MUZEM1x1MUZENi1cdTFGREJcdTFGRTAtXHUxRkVDXHUxRkYyLVx1MUZGNFx1MUZGNi1cdTFGRkNcdTIwNzFcdTIwN0ZcdTIwOTAtXHUyMDlDXHUyMTAyXHUyMTA3XHUyMTBBLVx1MjExM1x1MjExNVx1MjExOS1cdTIxMURcdTIxMjRcdTIxMjZcdTIxMjhcdTIxMkEtXHUyMTJEXHUyMTJGLVx1MjEzOVx1MjEzQy1cdTIxM0ZcdTIxNDUtXHUyMTQ5XHUyMTRFXHUyMTgzXHUyMTg0XHUyQzAwLVx1MkNFNFx1MkNFQi1cdTJDRUVcdTJDRjJcdTJDRjNcdTJEMDAtXHUyRDI1XHUyRDI3XHUyRDJEXHUyRDMwLVx1MkQ2N1x1MkQ2Rlx1MkQ4MC1cdTJEOTZcdTJEQTAtXHUyREE2XHUyREE4LVx1MkRBRVx1MkRCMC1cdTJEQjZcdTJEQjgtXHUyREJFXHUyREMwLVx1MkRDNlx1MkRDOC1cdTJEQ0VcdTJERDAtXHUyREQ2XHUyREQ4LVx1MkRERVx1MkUyRlx1MzAwNVx1MzAwNlx1MzAzMS1cdTMwMzVcdTMwM0JcdTMwM0NcdTMwNDEtXHUzMDk2XHUzMDlELVx1MzA5Rlx1MzBBMS1cdTMwRkFcdTMwRkMtXHUzMEZGXHUzMTA1LVx1MzEyRlx1MzEzMS1cdTMxOEVcdTMxQTAtXHUzMUJGXHUzMUYwLVx1MzFGRlx1MzQwMC1cdTREQkZcdTRFMDAtXHVBNDhDXHVBNEQwLVx1QTRGRFx1QTUwMC1cdUE2MENcdUE2MTAtXHVBNjFGXHVBNjJBXHVBNjJCXHVBNjQwLVx1QTY2RVx1QTY3Ri1cdUE2OURcdUE2QTAtXHVBNkU1XHVBNzE3LVx1QTcxRlx1QTcyMi1cdUE3ODhcdUE3OEItXHVBN0NBXHVBN0QwXHVBN0QxXHVBN0QzXHVBN0Q1LVx1QTdEOVx1QTdGMi1cdUE4MDFcdUE4MDMtXHVBODA1XHVBODA3LVx1QTgwQVx1QTgwQy1cdUE4MjJcdUE4NDAtXHVBODczXHVBODgyLVx1QThCM1x1QThGMi1cdUE4RjdcdUE4RkJcdUE4RkRcdUE4RkVcdUE5MEEtXHVBOTI1XHVBOTMwLVx1QTk0Nlx1QTk2MC1cdUE5N0NcdUE5ODQtXHVBOUIyXHVBOUNGXHVBOUUwLVx1QTlFNFx1QTlFNi1cdUE5RUZcdUE5RkEtXHVBOUZFXHVBQTAwLVx1QUEyOFx1QUE0MC1cdUFBNDJcdUFBNDQtXHVBQTRCXHVBQTYwLVx1QUE3Nlx1QUE3QVx1QUE3RS1cdUFBQUZcdUFBQjFcdUFBQjVcdUFBQjZcdUFBQjktXHVBQUJEXHVBQUMwXHVBQUMyXHVBQURCLVx1QUFERFx1QUFFMC1cdUFBRUFcdUFBRjItXHVBQUY0XHVBQjAxLVx1QUIwNlx1QUIwOS1cdUFCMEVcdUFCMTEtXHVBQjE2XHVBQjIwLVx1QUIyNlx1QUIyOC1cdUFCMkVcdUFCMzAtXHVBQjVBXHVBQjVDLVx1QUI2OVx1QUI3MC1cdUFCRTJcdUFDMDAtXHVEN0EzXHVEN0IwLVx1RDdDNlx1RDdDQi1cdUQ3RkJcdUY5MDAtXHVGQTZEXHVGQTcwLVx1RkFEOVx1RkIwMC1cdUZCMDZcdUZCMTMtXHVGQjE3XHVGQjFEXHVGQjFGLVx1RkIyOFx1RkIyQS1cdUZCMzZcdUZCMzgtXHVGQjNDXHVGQjNFXHVGQjQwXHVGQjQxXHVGQjQzXHVGQjQ0XHVGQjQ2LVx1RkJCMVx1RkJEMy1cdUZEM0RcdUZENTAtXHVGRDhGXHVGRDkyLVx1RkRDN1x1RkRGMC1cdUZERkJcdUZFNzAtXHVGRTc0XHVGRTc2LVx1RkVGQ1x1RkYyMS1cdUZGM0FcdUZGNDEtXHVGRjVBXHVGRjY2LVx1RkZCRVx1RkZDMi1cdUZGQzdcdUZGQ0EtXHVGRkNGXHVGRkQyLVx1RkZEN1x1RkZEQS1cdUZGRENdfFx1RDgwMFtcdURDMDAtXHVEQzBCXHVEQzBELVx1REMyNlx1REMyOC1cdURDM0FcdURDM0NcdURDM0RcdURDM0YtXHVEQzREXHVEQzUwLVx1REM1RFx1REM4MC1cdURDRkFcdURFODAtXHVERTlDXHVERUEwLVx1REVEMFx1REYwMC1cdURGMUZcdURGMkQtXHVERjQwXHVERjQyLVx1REY0OVx1REY1MC1cdURGNzVcdURGODAtXHVERjlEXHVERkEwLVx1REZDM1x1REZDOC1cdURGQ0ZdfFx1RDgwMVtcdURDMDAtXHVEQzlEXHVEQ0IwLVx1RENEM1x1RENEOC1cdURDRkJcdUREMDAtXHVERDI3XHVERDMwLVx1REQ2M1x1REQ3MC1cdUREN0FcdUREN0MtXHVERDhBXHVERDhDLVx1REQ5Mlx1REQ5NFx1REQ5NVx1REQ5Ny1cdUREQTFcdUREQTMtXHVEREIxXHVEREIzLVx1RERCOVx1RERCQlx1RERCQ1x1REUwMC1cdURGMzZcdURGNDAtXHVERjU1XHVERjYwLVx1REY2N1x1REY4MC1cdURGODVcdURGODctXHVERkIwXHVERkIyLVx1REZCQV18XHVEODAyW1x1REMwMC1cdURDMDVcdURDMDhcdURDMEEtXHVEQzM1XHVEQzM3XHVEQzM4XHVEQzNDXHVEQzNGLVx1REM1NVx1REM2MC1cdURDNzZcdURDODAtXHVEQzlFXHVEQ0UwLVx1RENGMlx1RENGNFx1RENGNVx1REQwMC1cdUREMTVcdUREMjAtXHVERDM5XHVERDgwLVx1RERCN1x1RERCRVx1RERCRlx1REUwMFx1REUxMC1cdURFMTNcdURFMTUtXHVERTE3XHVERTE5LVx1REUzNVx1REU2MC1cdURFN0NcdURFODAtXHVERTlDXHVERUMwLVx1REVDN1x1REVDOS1cdURFRTRcdURGMDAtXHVERjM1XHVERjQwLVx1REY1NVx1REY2MC1cdURGNzJcdURGODAtXHVERjkxXXxcdUQ4MDNbXHVEQzAwLVx1REM0OFx1REM4MC1cdURDQjJcdURDQzAtXHVEQ0YyXHVERDAwLVx1REQyM1x1REU4MC1cdURFQTlcdURFQjBcdURFQjFcdURGMDAtXHVERjFDXHVERjI3XHVERjMwLVx1REY0NVx1REY3MC1cdURGODFcdURGQjAtXHVERkM0XHVERkUwLVx1REZGNl18XHVEODA0W1x1REMwMy1cdURDMzdcdURDNzFcdURDNzJcdURDNzVcdURDODMtXHVEQ0FGXHVEQ0QwLVx1RENFOFx1REQwMy1cdUREMjZcdURENDRcdURENDdcdURENTAtXHVERDcyXHVERDc2XHVERDgzLVx1RERCMlx1RERDMS1cdUREQzRcdUREREFcdURERENcdURFMDAtXHVERTExXHVERTEzLVx1REUyQlx1REUzRlx1REU0MFx1REU4MC1cdURFODZcdURFODhcdURFOEEtXHVERThEXHVERThGLVx1REU5RFx1REU5Ri1cdURFQThcdURFQjAtXHVERURFXHVERjA1LVx1REYwQ1x1REYwRlx1REYxMFx1REYxMy1cdURGMjhcdURGMkEtXHVERjMwXHVERjMyXHVERjMzXHVERjM1LVx1REYzOVx1REYzRFx1REY1MFx1REY1RC1cdURGNjFdfFx1RDgwNVtcdURDMDAtXHVEQzM0XHVEQzQ3LVx1REM0QVx1REM1Ri1cdURDNjFcdURDODAtXHVEQ0FGXHVEQ0M0XHVEQ0M1XHVEQ0M3XHVERDgwLVx1RERBRVx1REREOC1cdUREREJcdURFMDAtXHVERTJGXHVERTQ0XHVERTgwLVx1REVBQVx1REVCOFx1REYwMC1cdURGMUFcdURGNDAtXHVERjQ2XXxcdUQ4MDZbXHVEQzAwLVx1REMyQlx1RENBMC1cdURDREZcdURDRkYtXHVERDA2XHVERDA5XHVERDBDLVx1REQxM1x1REQxNVx1REQxNlx1REQxOC1cdUREMkZcdUREM0ZcdURENDFcdUREQTAtXHVEREE3XHVEREFBLVx1REREMFx1RERFMVx1RERFM1x1REUwMFx1REUwQi1cdURFMzJcdURFM0FcdURFNTBcdURFNUMtXHVERTg5XHVERTlEXHVERUIwLVx1REVGOF18XHVEODA3W1x1REMwMC1cdURDMDhcdURDMEEtXHVEQzJFXHVEQzQwXHVEQzcyLVx1REM4Rlx1REQwMC1cdUREMDZcdUREMDhcdUREMDlcdUREMEItXHVERDMwXHVERDQ2XHVERDYwLVx1REQ2NVx1REQ2N1x1REQ2OFx1REQ2QS1cdUREODlcdUREOThcdURFRTAtXHVERUYyXHVERjAyXHVERjA0LVx1REYxMFx1REYxMi1cdURGMzNcdURGQjBdfFx1RDgwOFtcdURDMDAtXHVERjk5XXxcdUQ4MDlbXHVEQzgwLVx1REQ0M118XHVEODBCW1x1REY5MC1cdURGRjBdfFtcdUQ4MENcdUQ4MUMtXHVEODIwXHVEODIyXHVEODQwLVx1RDg2OFx1RDg2QS1cdUQ4NkNcdUQ4NkYtXHVEODcyXHVEODc0LVx1RDg3OVx1RDg4MC1cdUQ4ODNcdUQ4ODUtXHVEODg3XVtcdURDMDAtXHVERkZGXXxcdUQ4MERbXHVEQzAwLVx1REMyRlx1REM0MS1cdURDNDZdfFx1RDgxMVtcdURDMDAtXHVERTQ2XXxcdUQ4MUFbXHVEQzAwLVx1REUzOFx1REU0MC1cdURFNUVcdURFNzAtXHVERUJFXHVERUQwLVx1REVFRFx1REYwMC1cdURGMkZcdURGNDAtXHVERjQzXHVERjYzLVx1REY3N1x1REY3RC1cdURGOEZdfFx1RDgxQltcdURFNDAtXHVERTdGXHVERjAwLVx1REY0QVx1REY1MFx1REY5My1cdURGOUZcdURGRTBcdURGRTFcdURGRTNdfFx1RDgyMVtcdURDMDAtXHVERkY3XXxcdUQ4MjNbXHVEQzAwLVx1RENENVx1REQwMC1cdUREMDhdfFx1RDgyQltcdURGRjAtXHVERkYzXHVERkY1LVx1REZGQlx1REZGRFx1REZGRV18XHVEODJDW1x1REMwMC1cdUREMjJcdUREMzJcdURENTAtXHVERDUyXHVERDU1XHVERDY0LVx1REQ2N1x1REQ3MC1cdURFRkJdfFx1RDgyRltcdURDMDAtXHVEQzZBXHVEQzcwLVx1REM3Q1x1REM4MC1cdURDODhcdURDOTAtXHVEQzk5XXxcdUQ4MzVbXHVEQzAwLVx1REM1NFx1REM1Ni1cdURDOUNcdURDOUVcdURDOUZcdURDQTJcdURDQTVcdURDQTZcdURDQTktXHVEQ0FDXHVEQ0FFLVx1RENCOVx1RENCQlx1RENCRC1cdURDQzNcdURDQzUtXHVERDA1XHVERDA3LVx1REQwQVx1REQwRC1cdUREMTRcdUREMTYtXHVERDFDXHVERDFFLVx1REQzOVx1REQzQi1cdUREM0VcdURENDAtXHVERDQ0XHVERDQ2XHVERDRBLVx1REQ1MFx1REQ1Mi1cdURFQTVcdURFQTgtXHVERUMwXHVERUMyLVx1REVEQVx1REVEQy1cdURFRkFcdURFRkMtXHVERjE0XHVERjE2LVx1REYzNFx1REYzNi1cdURGNEVcdURGNTAtXHVERjZFXHVERjcwLVx1REY4OFx1REY4QS1cdURGQThcdURGQUEtXHVERkMyXHVERkM0LVx1REZDQl18XHVEODM3W1x1REYwMC1cdURGMUVcdURGMjUtXHVERjJBXXxcdUQ4MzhbXHVEQzMwLVx1REM2RFx1REQwMC1cdUREMkNcdUREMzctXHVERDNEXHVERDRFXHVERTkwLVx1REVBRFx1REVDMC1cdURFRUJdfFx1RDgzOVtcdURDRDAtXHVEQ0VCXHVERkUwLVx1REZFNlx1REZFOC1cdURGRUJcdURGRURcdURGRUVcdURGRjAtXHVERkZFXXxcdUQ4M0FbXHVEQzAwLVx1RENDNFx1REQwMC1cdURENDNcdURENEJdfFx1RDgzQltcdURFMDAtXHVERTAzXHVERTA1LVx1REUxRlx1REUyMVx1REUyMlx1REUyNFx1REUyN1x1REUyOS1cdURFMzJcdURFMzQtXHVERTM3XHVERTM5XHVERTNCXHVERTQyXHVERTQ3XHVERTQ5XHVERTRCXHVERTRELVx1REU0Rlx1REU1MVx1REU1Mlx1REU1NFx1REU1N1x1REU1OVx1REU1Qlx1REU1RFx1REU1Rlx1REU2MVx1REU2Mlx1REU2NFx1REU2Ny1cdURFNkFcdURFNkMtXHVERTcyXHVERTc0LVx1REU3N1x1REU3OS1cdURFN0NcdURFN0VcdURFODAtXHVERTg5XHVERThCLVx1REU5Qlx1REVBMS1cdURFQTNcdURFQTUtXHVERUE5XHVERUFCLVx1REVCQl18XHVEODY5W1x1REMwMC1cdURFREZcdURGMDAtXHVERkZGXXxcdUQ4NkRbXHVEQzAwLVx1REYzOVx1REY0MC1cdURGRkZdfFx1RDg2RVtcdURDMDAtXHVEQzFEXHVEQzIwLVx1REZGRl18XHVEODczW1x1REMwMC1cdURFQTFcdURFQjAtXHVERkZGXXxcdUQ4N0FbXHVEQzAwLVx1REZFMF18XHVEODdFW1x1REMwMC1cdURFMURdfFx1RDg4NFtcdURDMDAtXHVERjRBXHVERjUwLVx1REZGRl18XHVEODg4W1x1REMwMC1cdURGQUZdKSokLy50ZXN0KHQpfSx7bmFtZToic3RyaW5nIix0ZXN0OlJmfSx7bmFtZToiQ2hhaW4iLHRlc3Q6Z3B9LHtuYW1lOiJBcnJheSIsdGVzdDpCZn0se25hbWU6Ik1hdHJpeCIsdGVzdDprZn0se25hbWU6IkRlbnNlTWF0cml4Iix0ZXN0OmpmfSx7bmFtZToiU3BhcnNlTWF0cml4Iix0ZXN0OlVmfSx7bmFtZToiUmFuZ2UiLHRlc3Q6cWZ9LHtuYW1lOiJJbmRleCIsdGVzdDpWZn0se25hbWU6ImJvb2xlYW4iLHRlc3Q6R2Z9LHtuYW1lOiJSZXN1bHRTZXQiLHRlc3Q6WWZ9LHtuYW1lOiJIZWxwIix0ZXN0OlhmfSx7bmFtZToiZnVuY3Rpb24iLHRlc3Q6V2Z9LHtuYW1lOiJEYXRlIix0ZXN0OkhmfSx7bmFtZToiUmVnRXhwIix0ZXN0OlpmfSx7bmFtZToibnVsbCIsdGVzdDpKZn0se25hbWU6InVuZGVmaW5lZCIsdGVzdDpRZn0se25hbWU6IkFjY2Vzc29yTm9kZSIsdGVzdDokZn0se25hbWU6IkFycmF5Tm9kZSIsdGVzdDp0cH0se25hbWU6IkFzc2lnbm1lbnROb2RlIix0ZXN0OmVwfSx7bmFtZToiQmxvY2tOb2RlIix0ZXN0Om5wfSx7bmFtZToiQ29uZGl0aW9uYWxOb2RlIix0ZXN0OnJwfSx7bmFtZToiQ29uc3RhbnROb2RlIix0ZXN0OmlwfSx7bmFtZToiRnVuY3Rpb25Ob2RlIix0ZXN0OnNwfSx7bmFtZToiRnVuY3Rpb25Bc3NpZ25tZW50Tm9kZSIsdGVzdDpvcH0se25hbWU6IkluZGV4Tm9kZSIsdGVzdDphcH0se25hbWU6Ik5vZGUiLHRlc3Q6dXB9LHtuYW1lOiJPYmplY3ROb2RlIix0ZXN0OmNwfSx7bmFtZToiT3BlcmF0b3JOb2RlIix0ZXN0OmxwfSx7bmFtZToiUGFyZW50aGVzaXNOb2RlIix0ZXN0OmhwfSx7bmFtZToiUmFuZ2VOb2RlIix0ZXN0OmZwfSx7bmFtZToiUmVsYXRpb25hbE5vZGUiLHRlc3Q6cHB9LHtuYW1lOiJTeW1ib2xOb2RlIix0ZXN0OmRwfSx7bmFtZToiTWFwIix0ZXN0OmNkfSx7bmFtZToiT2JqZWN0Iix0ZXN0OktmfV0pLG8uYWRkQ29udmVyc2lvbnMoW3tmcm9tOiJudW1iZXIiLHRvOiJCaWdOdW1iZXIiLGNvbnZlcnQ6ZnVuY3Rpb24odCl7aWYoZXx8ZmQodCksZnVuY3Rpb24odCl7cmV0dXJuIHQudG9FeHBvbmVudGlhbCgpLnJlcGxhY2UoL2UuKiQvLCIiKS5yZXBsYWNlKC9eMFwuPzAqfFwuLywiIikubGVuZ3RofSh0KT4xNSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgaW1wbGljaXRseSBjb252ZXJ0IGEgbnVtYmVyIHdpdGggPjE1IHNpZ25pZmljYW50IGRpZ2l0cyB0byBCaWdOdW1iZXIgKHZhbHVlOiAiK3QrIikuIFVzZSBmdW5jdGlvbiBiaWdudW1iZXIoeCkgdG8gY29udmVydCB0byBCaWdOdW1iZXIuIik7cmV0dXJuIG5ldyBlKHQpfX0se2Zyb206Im51bWJlciIsdG86IkNvbXBsZXgiLGNvbnZlcnQ6ZnVuY3Rpb24odCl7cmV0dXJuIG58fHBkKHQpLG5ldyBuKHQsMCl9fSx7ZnJvbToiQmlnTnVtYmVyIix0bzoiQ29tcGxleCIsY29udmVydDpmdW5jdGlvbih0KXtyZXR1cm4gbnx8cGQodCksbmV3IG4odC50b051bWJlcigpLDApfX0se2Zyb206IkZyYWN0aW9uIix0bzoiQmlnTnVtYmVyIixjb252ZXJ0OmZ1bmN0aW9uKHQpe3Rocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBpbXBsaWNpdGx5IGNvbnZlcnQgYSBGcmFjdGlvbiB0byBCaWdOdW1iZXIgb3IgdmljZSB2ZXJzYS4gVXNlIGZ1bmN0aW9uIGJpZ251bWJlcih4KSB0byBjb252ZXJ0IHRvIEJpZ051bWJlciBvciBmcmFjdGlvbih4KSB0byBjb252ZXJ0IHRvIEZyYWN0aW9uLiIpfX0se2Zyb206IkZyYWN0aW9uIix0bzoiQ29tcGxleCIsY29udmVydDpmdW5jdGlvbih0KXtyZXR1cm4gbnx8cGQodCksbmV3IG4odC52YWx1ZU9mKCksMCl9fSx7ZnJvbToibnVtYmVyIix0bzoiRnJhY3Rpb24iLGNvbnZlcnQ6ZnVuY3Rpb24odCl7aXx8ZGQodCk7dmFyIGU9bmV3IGkodCk7aWYoZS52YWx1ZU9mKCkhPT10KXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBpbXBsaWNpdGx5IGNvbnZlcnQgYSBudW1iZXIgdG8gYSBGcmFjdGlvbiB3aGVuIHRoZXJlIHdpbGwgYmUgYSBsb3NzIG9mIHByZWNpc2lvbiAodmFsdWU6ICIrdCsiKS4gVXNlIGZ1bmN0aW9uIGZyYWN0aW9uKHgpIHRvIGNvbnZlcnQgdG8gRnJhY3Rpb24uIik7cmV0dXJuIGV9fSx7ZnJvbToic3RyaW5nIix0bzoibnVtYmVyIixjb252ZXJ0OmZ1bmN0aW9uKHQpe3ZhciBlPU51bWJlcih0KTtpZihpc05hTihlKSl0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0ICInK3QrJyIgdG8gYSBudW1iZXInKTtyZXR1cm4gZX19LHtmcm9tOiJzdHJpbmciLHRvOiJCaWdOdW1iZXIiLGNvbnZlcnQ6ZnVuY3Rpb24odCl7ZXx8ZmQodCk7dHJ5e3JldHVybiBuZXcgZSh0KX1jYXRjaChlKXt0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0ICInK3QrJyIgdG8gQmlnTnVtYmVyJyl9fX0se2Zyb206InN0cmluZyIsdG86IkZyYWN0aW9uIixjb252ZXJ0OmZ1bmN0aW9uKHQpe2l8fGRkKHQpO3RyeXtyZXR1cm4gbmV3IGkodCl9Y2F0Y2goZSl7dGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY29udmVydCAiJyt0KyciIHRvIEZyYWN0aW9uJyl9fX0se2Zyb206InN0cmluZyIsdG86IkNvbXBsZXgiLGNvbnZlcnQ6ZnVuY3Rpb24odCl7bnx8cGQodCk7dHJ5e3JldHVybiBuZXcgbih0KX1jYXRjaChlKXt0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0ICInK3QrJyIgdG8gQ29tcGxleCcpfX19LHtmcm9tOiJib29sZWFuIix0bzoibnVtYmVyIixjb252ZXJ0OmZ1bmN0aW9uKHQpe3JldHVybit0fX0se2Zyb206ImJvb2xlYW4iLHRvOiJCaWdOdW1iZXIiLGNvbnZlcnQ6ZnVuY3Rpb24odCl7cmV0dXJuIGV8fGZkKHQpLG5ldyBlKCt0KX19LHtmcm9tOiJib29sZWFuIix0bzoiRnJhY3Rpb24iLGNvbnZlcnQ6ZnVuY3Rpb24odCl7cmV0dXJuIGl8fGRkKHQpLG5ldyBpKCt0KX19LHtmcm9tOiJib29sZWFuIix0bzoic3RyaW5nIixjb252ZXJ0OmZ1bmN0aW9uKHQpe3JldHVybiBTdHJpbmcodCl9fSx7ZnJvbToiQXJyYXkiLHRvOiJNYXRyaXgiLGNvbnZlcnQ6ZnVuY3Rpb24odCl7cmV0dXJuIHJ8fGZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgY29udmVydCBhcnJheSBpbnRvIGEgTWF0cml4OiBubyBjbGFzcyAnRGVuc2VNYXRyaXgnIHByb3ZpZGVkIil9KCksbmV3IHIodCl9fSx7ZnJvbToiTWF0cml4Iix0bzoiQXJyYXkiLGNvbnZlcnQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQudmFsdWVPZigpfX1dKSxvLm9uTWlzbWF0Y2g9KHQsZSxuKT0+e3ZhciByPW8uY3JlYXRlRXJyb3IodCxlLG4pO2lmKFsid3JvbmdUeXBlIiwibWlzbWF0Y2giXS5pbmNsdWRlcyhyLmRhdGEuY2F0ZWdvcnkpJiYxPT09ZS5sZW5ndGgmJnpmKGVbMF0pJiZuLnNvbWUoKHQ9PiF0LnBhcmFtcy5pbmNsdWRlcygiLCIpKSkpe3ZhciBpPW5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uICciLmNvbmNhdCh0LCInIGRvZXNuJ3QgYXBwbHkgdG8gbWF0cmljZXMuIFRvIGNhbGwgaXQgIikrImVsZW1lbnR3aXNlIG9uIGEgbWF0cml4ICdNJywgdHJ5ICdtYXAoTSwgIi5jb25jYXQodCwiKScuIikpO3Rocm93IGkuZGF0YT1yLmRhdGEsaX10aHJvdyByfSxvLm9uTWlzbWF0Y2g9KHQsZSxuKT0+e3ZhciByPW8uY3JlYXRlRXJyb3IodCxlLG4pO2lmKFsid3JvbmdUeXBlIiwibWlzbWF0Y2giXS5pbmNsdWRlcyhyLmRhdGEuY2F0ZWdvcnkpJiYxPT09ZS5sZW5ndGgmJnpmKGVbMF0pJiZuLnNvbWUoKHQ9PiF0LnBhcmFtcy5pbmNsdWRlcygiLCIpKSkpe3ZhciBpPW5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uICciLmNvbmNhdCh0LCInIGRvZXNuJ3QgYXBwbHkgdG8gbWF0cmljZXMuIFRvIGNhbGwgaXQgIikrImVsZW1lbnR3aXNlIG9uIGEgbWF0cml4ICdNJywgdHJ5ICdtYXAoTSwgIi5jb25jYXQodCwiKScuIikpO3Rocm93IGkuZGF0YT1yLmRhdGEsaX10aHJvdyByfSxvfSkpO2Z1bmN0aW9uIGZkKHQpe3Rocm93IG5ldyBFcnJvcigiQ2Fubm90IGNvbnZlcnQgdmFsdWUgIi5jb25jYXQodCwiIGludG8gYSBCaWdOdW1iZXI6IG5vIGNsYXNzICdCaWdOdW1iZXInIHByb3ZpZGVkIikpfWZ1bmN0aW9uIHBkKHQpe3Rocm93IG5ldyBFcnJvcigiQ2Fubm90IGNvbnZlcnQgdmFsdWUgIi5jb25jYXQodCwiIGludG8gYSBDb21wbGV4IG51bWJlcjogbm8gY2xhc3MgJ0NvbXBsZXgnIHByb3ZpZGVkIikpfWZ1bmN0aW9uIGRkKHQpe3Rocm93IG5ldyBFcnJvcigiQ2Fubm90IGNvbnZlcnQgdmFsdWUgIi5jb25jYXQodCwiIGludG8gYSBGcmFjdGlvbiwgbm8gY2xhc3MgJ0ZyYWN0aW9uJyBwcm92aWRlZC4iKSl9dmFyIGdkLHlkLG1kPTllMTUsdmQ9MWU5LF9kPSIwMTIzNDU2Nzg5YWJjZGVmIix4ZD0iMi4zMDI1ODUwOTI5OTQwNDU2ODQwMTc5OTE0NTQ2ODQzNjQyMDc2MDExMDE0ODg2Mjg3NzI5NzYwMzMzMjc5MDA5Njc1NzI2MDk2NzczNTI0ODAyMzU5OTcyMDUwODk1OTgyOTgzNDE5Njc3ODQwNDIyODYyNDg2MzM0MDk1MjU0NjUwODI4MDY3NTY2NjYyODczNjkwOTg3ODE2ODk0ODI5MDcyMDgzMjU1NTQ2ODA4NDM3OTk4OTQ4MjYyMzMxOTg1MjgzOTM1MDUzMDg5NjUzNzc3MzI2Mjg4NDYxNjMzNjYyMjIyODc2OTgyMTk4ODY3NDY1NDM2Njc0NzQ0MDQyNDMyNzQzNjUxNTUwNDg5MzQzMTQ5MzkzOTE0Nzk2MTk0MDQ0MDAyMjIxMDUxMDE3MTQxNzQ4MDAzNjg4MDg0MDEyNjQ3MDgwNjg1NTY3NzQzMjE2MjI4MzU1MjIwMTE0ODA0NjYzNzE1NjU5MTIxMzczNDUwNzQ3ODU2OTQ3NjgzNDYzNjE2NzkyMTAxODA2NDQ1MDcwNjQ4MDAwMjc3NTAyNjg0OTE2NzQ2NTUwNTg2ODU2OTM1NjczNDIwNjcwNTgxMTM2NDI5MjI0NTU0NDA1NzU4OTI1NzI0MjA4MjQxMzE0Njk1Njg5MDE2NzU4OTQwMjU2Nzc2MzExMzU2OTE5MjkyMDMzMzc2NTg3MTQxNjYwMjMwMTA1NzAzMDg5NjM0NTcyMDc1NDQwMzcwODQ3NDY5OTQwMTY4MjY5MjgyODA4NDgxMTg0Mjg5MzE0ODQ4NTI0OTQ4NjQ0ODcxOTI3ODA5Njc2MjcxMjc1Nzc1Mzk3MDI3NjY4NjA1OTUyNDk2NzE2Njc0MTgzNDg1NzA0NDIyNTA3MTk3OTY1MDA0NzE0OTUxMDUwNDkyMjE0Nzc2NTY3NjM2OTM4NjYyOTc2OTc5NTIyMTEwNzE4MjY0NTQ5NzM0NzcyNjYyNDI1NzA5NDI5MzIyNTgyNzk4NTAyNTg1NTA5Nzg1MjY1MzgzMjA3NjA2NzI2MzE3MTY0MzA5NTA1OTk1MDg3ODA3NTIzNzEwMzMzMTAxMTk3ODU3NTQ3MzMxNTQxNDIxODA4NDI3NTQzODYzNTkxNzc4MTE3MDU0MzA5ODI3NDgyMzg1MDQ1NjQ4MDE5MDk1NjEwMjk5MjkxODI0MzE4MjM3NTI1MzU3NzA5NzUwNTM5NTY1MTg3Njk3NTEwMzc0OTcwODg4NjkyMTgwMjA1MTg5MzM5NTA3MjM4NTM5MjA1MTQ0NjM0MTk3MjY1Mjg3Mjg2OTY1MTEwODYyNTcxNDkyMTk4ODQ5OTc4NzQ4ODczNzcxMzQ1Njg2MjA5MTY3MDU4Iix3ZD0iMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjI2NDMzODMyNzk1MDI4ODQxOTcxNjkzOTkzNzUxMDU4MjA5NzQ5NDQ1OTIzMDc4MTY0MDYyODYyMDg5OTg2MjgwMzQ4MjUzNDIxMTcwNjc5ODIxNDgwODY1MTMyODIzMDY2NDcwOTM4NDQ2MDk1NTA1ODIyMzE3MjUzNTk0MDgxMjg0ODExMTc0NTAyODQxMDI3MDE5Mzg1MjExMDU1NTk2NDQ2MjI5NDg5NTQ5MzAzODE5NjQ0Mjg4MTA5NzU2NjU5MzM0NDYxMjg0NzU2NDgyMzM3ODY3ODMxNjUyNzEyMDE5MDkxNDU2NDg1NjY5MjM0NjAzNDg2MTA0NTQzMjY2NDgyMTMzOTM2MDcyNjAyNDkxNDEyNzM3MjQ1ODcwMDY2MDYzMTU1ODgxNzQ4ODE1MjA5MjA5NjI4MjkyNTQwOTE3MTUzNjQzNjc4OTI1OTAzNjAwMTEzMzA1MzA1NDg4MjA0NjY1MjEzODQxNDY5NTE5NDE1MTE2MDk0MzMwNTcyNzAzNjU3NTk1OTE5NTMwOTIxODYxMTczODE5MzI2MTE3OTMxMDUxMTg1NDgwNzQ0NjIzNzk5NjI3NDk1NjczNTE4ODU3NTI3MjQ4OTEyMjc5MzgxODMwMTE5NDkxMjk4MzM2NzMzNjI0NDA2NTY2NDMwODYwMjEzOTQ5NDYzOTUyMjQ3MzcxOTA3MDIxNzk4NjA5NDM3MDI3NzA1MzkyMTcxNzYyOTMxNzY3NTIzODQ2NzQ4MTg0Njc2Njk0MDUxMzIwMDA1NjgxMjcxNDUyNjM1NjA4Mjc3ODU3NzEzNDI3NTc3ODk2MDkxNzM2MzcxNzg3MjE0Njg0NDA5MDEyMjQ5NTM0MzAxNDY1NDk1ODUzNzEwNTA3OTIyNzk2ODkyNTg5MjM1NDIwMTk5NTYxMTIxMjkwMjE5NjA4NjQwMzQ0MTgxNTk4MTM2Mjk3NzQ3NzEzMDk5NjA1MTg3MDcyMTEzNDk5OTk5OTgzNzI5NzgwNDk5NTEwNTk3MzE3MzI4MTYwOTYzMTg1OTUwMjQ0NTk0NTUzNDY5MDgzMDI2NDI1MjIzMDgyNTMzNDQ2ODUwMzUyNjE5MzExODgxNzEwMTAwMDMxMzc4Mzg3NTI4ODY1ODc1MzMyMDgzODE0MjA2MTcxNzc2NjkxNDczMDM1OTgyNTM0OTA0Mjg3NTU0Njg3MzExNTk1NjI4NjM4ODIzNTM3ODc1OTM3NTE5NTc3ODE4NTc3ODA1MzIxNzEyMjY4MDY2MTMwMDE5Mjc4NzY2MTExOTU5MDkyMTY0MjAxOTg5MzgwOTUyNTcyMDEwNjU0ODU4NjMyNzg5IixiZD17cHJlY2lzaW9uOjIwLHJvdW5kaW5nOjQsbW9kdWxvOjEsdG9FeHBOZWc6LTcsdG9FeHBQb3M6MjEsbWluRTotbWQsbWF4RTptZCxjcnlwdG86ITF9LERkPSEwLEVkPSJbRGVjaW1hbEVycm9yXSAiLENkPUVkKyJJbnZhbGlkIGFyZ3VtZW50OiAiLFNkPUVkKyJQcmVjaXNpb24gbGltaXQgZXhjZWVkZWQiLEFkPUVkKyJjcnlwdG8gdW5hdmFpbGFibGUiLE5kPSJbb2JqZWN0IERlY2ltYWxdIixJZD1NYXRoLmZsb29yLE1kPU1hdGgucG93LEZkPS9eMGIoWzAxXSsoXC5bMDFdKik/fFwuWzAxXSspKHBbKy1dP1xkKyk/JC9pLFRkPS9eMHgoWzAtOWEtZl0rKFwuWzAtOWEtZl0qKT98XC5bMC05YS1mXSspKHBbKy1dP1xkKyk/JC9pLE9kPS9eMG8oWzAtN10rKFwuWzAtN10qKT98XC5bMC03XSspKHBbKy1dP1xkKyk/JC9pLExkPS9eKFxkKyhcLlxkKik/fFwuXGQrKShlWystXT9cZCspPyQvaSxQZD0xZTcsUmQ9eGQubGVuZ3RoLTEsQmQ9d2QubGVuZ3RoLTEsa2Q9e3RvU3RyaW5nVGFnOk5kfTtmdW5jdGlvbiB6ZCh0KXt2YXIgZSxuLHIsaT10Lmxlbmd0aC0xLG89IiIscz10WzBdO2lmKGk+MCl7Zm9yKG8rPXMsZT0xO2U8aTtlKyspKG49Ny0ocj10W2VdKyIiKS5sZW5ndGgpJiYobys9S2QobikpLG8rPXI7KG49Ny0ocj0ocz10W2VdKSsiIikubGVuZ3RoKSYmKG8rPUtkKG4pKX1lbHNlIGlmKDA9PT1zKXJldHVybiIwIjtmb3IoO3MlMTA9PTA7KXMvPTEwO3JldHVybiBvK3N9ZnVuY3Rpb24gamQodCxlLG4pe2lmKHQhPT1+fnR8fHQ8ZXx8dD5uKXRocm93IEVycm9yKENkK3QpfWZ1bmN0aW9uIFVkKHQsZSxuLHIpe3ZhciBpLG8scyxhO2ZvcihvPXRbMF07bz49MTA7by89MTApLS1lO3JldHVybi0tZTwwPyhlKz03LGk9MCk6KGk9TWF0aC5jZWlsKChlKzEpLzcpLGUlPTcpLG89TWQoMTAsNy1lKSxhPXRbaV0lb3wwLG51bGw9PXI/ZTwzPygwPT1lP2E9YS8xMDB8MDoxPT1lJiYoYT1hLzEwfDApLHM9bjw0JiY5OTk5OT09YXx8bj4zJiY0OTk5OT09YXx8NWU0PT1hfHwwPT1hKTpzPShuPDQmJmErMT09b3x8bj4zJiZhKzE9PW8vMikmJih0W2krMV0vby8xMDB8MCk9PU1kKDEwLGUtMiktMXx8KGE9PW8vMnx8MD09YSkmJiEodFtpKzFdL28vMTAwfDApOmU8ND8oMD09ZT9hPWEvMWUzfDA6MT09ZT9hPWEvMTAwfDA6Mj09ZSYmKGE9YS8xMHwwKSxzPShyfHxuPDQpJiY5OTk5PT1hfHwhciYmbj4zJiY0OTk5PT1hKTpzPSgocnx8bjw0KSYmYSsxPT1vfHwhciYmbj4zJiZhKzE9PW8vMikmJih0W2krMV0vby8xZTN8MCk9PU1kKDEwLGUtMyktMSxzfWZ1bmN0aW9uIHFkKHQsZSxuKXtmb3IodmFyIHIsaSxvPVswXSxzPTAsYT10Lmxlbmd0aDtzPGE7KXtmb3IoaT1vLmxlbmd0aDtpLS07KW9baV0qPWU7Zm9yKG9bMF0rPV9kLmluZGV4T2YodC5jaGFyQXQocysrKSkscj0wO3I8by5sZW5ndGg7cisrKW9bcl0+bi0xJiYodm9pZCAwPT09b1tyKzFdJiYob1tyKzFdPTApLG9bcisxXSs9b1tyXS9ufDAsb1tyXSU9bil9cmV0dXJuIG8ucmV2ZXJzZSgpfWtkLmFic29sdXRlVmFsdWU9a2QuYWJzPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IHRoaXMuY29uc3RydWN0b3IodGhpcyk7cmV0dXJuIHQuczwwJiYodC5zPTEpLEdkKHQpfSxrZC5jZWlsPWZ1bmN0aW9uKCl7cmV0dXJuIEdkKG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMpLHRoaXMuZSsxLDIpfSxrZC5jbGFtcGVkVG89a2QuY2xhbXA9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLHI9bi5jb25zdHJ1Y3RvcjtpZih0PW5ldyByKHQpLGU9bmV3IHIoZSksIXQuc3x8IWUucylyZXR1cm4gbmV3IHIoTmFOKTtpZih0Lmd0KGUpKXRocm93IEVycm9yKENkK2UpO3JldHVybiBuLmNtcCh0KTwwP3Q6bi5jbXAoZSk+MD9lOm5ldyByKG4pfSxrZC5jb21wYXJlZFRvPWtkLmNtcD1mdW5jdGlvbih0KXt2YXIgZSxuLHIsaSxvPXRoaXMscz1vLmQsYT0odD1uZXcgby5jb25zdHJ1Y3Rvcih0KSkuZCx1PW8ucyxjPXQucztpZighc3x8IWEpcmV0dXJuIHUmJmM/dSE9PWM/dTpzPT09YT8wOiFzXnU8MD8xOi0xOk5hTjtpZighc1swXXx8IWFbMF0pcmV0dXJuIHNbMF0/dTphWzBdPy1jOjA7aWYodSE9PWMpcmV0dXJuIHU7aWYoby5lIT09dC5lKXJldHVybiBvLmU+dC5lXnU8MD8xOi0xO2ZvcihlPTAsbj0ocj1zLmxlbmd0aCk8KGk9YS5sZW5ndGgpP3I6aTtlPG47KytlKWlmKHNbZV0hPT1hW2VdKXJldHVybiBzW2VdPmFbZV1edTwwPzE6LTE7cmV0dXJuIHI9PT1pPzA6cj5pXnU8MD8xOi0xfSxrZC5jb3NpbmU9a2QuY29zPWZ1bmN0aW9uKCl7dmFyIHQsZSxuPXRoaXMscj1uLmNvbnN0cnVjdG9yO3JldHVybiBuLmQ/bi5kWzBdPyh0PXIucHJlY2lzaW9uLGU9ci5yb3VuZGluZyxyLnByZWNpc2lvbj10K01hdGgubWF4KG4uZSxuLnNkKCkpKzcsci5yb3VuZGluZz0xLG49ZnVuY3Rpb24odCxlKXt2YXIgbixyLGk7aWYoZS5pc1plcm8oKSlyZXR1cm4gZTtyPWUuZC5sZW5ndGgscjwzMj8obj1NYXRoLmNlaWwoci8zKSxpPSgxL29nKDQsbikpLnRvU3RyaW5nKCkpOihuPTE2LGk9IjIuMzI4MzA2NDM2NTM4Njk2Mjg5MDYyNWUtMTAiKSx0LnByZWNpc2lvbis9bixlPWlnKHQsMSxlLnRpbWVzKGkpLG5ldyB0KDEpKTtmb3IodmFyIG89bjtvLS07KXt2YXIgcz1lLnRpbWVzKGUpO2U9cy50aW1lcyhzKS5taW51cyhzKS50aW1lcyg4KS5wbHVzKDEpfXJldHVybiB0LnByZWNpc2lvbi09bixlfShyLHNnKHIsbikpLHIucHJlY2lzaW9uPXQsci5yb3VuZGluZz1lLEdkKDI9PXlkfHwzPT15ZD9uLm5lZygpOm4sdCxlLCEwKSk6bmV3IHIoMSk6bmV3IHIoTmFOKX0sa2QuY3ViZVJvb3Q9a2QuY2JydD1mdW5jdGlvbigpe3ZhciB0LGUsbixyLGksbyxzLGEsdSxjLGw9dGhpcyxoPWwuY29uc3RydWN0b3I7aWYoIWwuaXNGaW5pdGUoKXx8bC5pc1plcm8oKSlyZXR1cm4gbmV3IGgobCk7Zm9yKERkPSExLChvPWwucypNZChsLnMqbCwxLzMpKSYmTWF0aC5hYnMobykhPTEvMD9yPW5ldyBoKG8udG9TdHJpbmcoKSk6KG49emQobC5kKSwobz0oKHQ9bC5lKS1uLmxlbmd0aCsxKSUzKSYmKG4rPTE9PW98fC0yPT1vPyIwIjoiMDAiKSxvPU1kKG4sMS8zKSx0PUlkKCh0KzEpLzMpLSh0JTM9PSh0PDA/LTE6MikpLG89PTEvMD9uPSI1ZSIrdDpuPShuPW8udG9FeHBvbmVudGlhbCgpKS5zbGljZSgwLG4uaW5kZXhPZigiZSIpKzEpK3QsKHI9bmV3IGgobikpLnM9bC5zKSxzPSh0PWgucHJlY2lzaW9uKSszOzspaWYoYz0odT0oYT1yKS50aW1lcyhhKS50aW1lcyhhKSkucGx1cyhsKSxyPVZkKGMucGx1cyhsKS50aW1lcyhhKSxjLnBsdXModSkscysyLDEpLHpkKGEuZCkuc2xpY2UoMCxzKT09PShuPXpkKHIuZCkpLnNsaWNlKDAscykpe2lmKCI5OTk5IiE9KG49bi5zbGljZShzLTMscysxKSkmJihpfHwiNDk5OSIhPW4pKXsoIStufHwhK24uc2xpY2UoMSkmJiI1Ij09bi5jaGFyQXQoMCkpJiYoR2Qocix0KzEsMSksZT0hci50aW1lcyhyKS50aW1lcyhyKS5lcShsKSk7YnJlYWt9aWYoIWkmJihHZChhLHQrMSwwKSxhLnRpbWVzKGEpLnRpbWVzKGEpLmVxKGwpKSl7cj1hO2JyZWFrfXMrPTQsaT0xfXJldHVybiBEZD0hMCxHZChyLHQsaC5yb3VuZGluZyxlKX0sa2QuZGVjaW1hbFBsYWNlcz1rZC5kcD1mdW5jdGlvbigpe3ZhciB0LGU9dGhpcy5kLG49TmFOO2lmKGUpe2lmKG49NyooKHQ9ZS5sZW5ndGgtMSktSWQodGhpcy5lLzcpKSx0PWVbdF0pZm9yKDt0JTEwPT0wO3QvPTEwKW4tLTtuPDAmJihuPTApfXJldHVybiBufSxrZC5kaXZpZGVkQnk9a2QuZGl2PWZ1bmN0aW9uKHQpe3JldHVybiBWZCh0aGlzLG5ldyB0aGlzLmNvbnN0cnVjdG9yKHQpKX0sa2QuZGl2aWRlZFRvSW50ZWdlckJ5PWtkLmRpdlRvSW50PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuY29uc3RydWN0b3I7cmV0dXJuIEdkKFZkKHRoaXMsbmV3IGUodCksMCwxLDEpLGUucHJlY2lzaW9uLGUucm91bmRpbmcpfSxrZC5lcXVhbHM9a2QuZXE9ZnVuY3Rpb24odCl7cmV0dXJuIDA9PT10aGlzLmNtcCh0KX0sa2QuZmxvb3I9ZnVuY3Rpb24oKXtyZXR1cm4gR2QobmV3IHRoaXMuY29uc3RydWN0b3IodGhpcyksdGhpcy5lKzEsMyl9LGtkLmdyZWF0ZXJUaGFuPWtkLmd0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNtcCh0KT4wfSxrZC5ncmVhdGVyVGhhbk9yRXF1YWxUbz1rZC5ndGU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5jbXAodCk7cmV0dXJuIDE9PWV8fDA9PT1lfSxrZC5oeXBlcmJvbGljQ29zaW5lPWtkLmNvc2g9ZnVuY3Rpb24oKXt2YXIgdCxlLG4scixpLG89dGhpcyxzPW8uY29uc3RydWN0b3IsYT1uZXcgcygxKTtpZighby5pc0Zpbml0ZSgpKXJldHVybiBuZXcgcyhvLnM/MS8wOk5hTik7aWYoby5pc1plcm8oKSlyZXR1cm4gYTtuPXMucHJlY2lzaW9uLHI9cy5yb3VuZGluZyxzLnByZWNpc2lvbj1uK01hdGgubWF4KG8uZSxvLnNkKCkpKzQscy5yb3VuZGluZz0xLChpPW8uZC5sZW5ndGgpPDMyP2U9KDEvb2coNCx0PU1hdGguY2VpbChpLzMpKSkudG9TdHJpbmcoKToodD0xNixlPSIyLjMyODMwNjQzNjUzODY5NjI4OTA2MjVlLTEwIiksbz1pZyhzLDEsby50aW1lcyhlKSxuZXcgcygxKSwhMCk7Zm9yKHZhciB1LGM9dCxsPW5ldyBzKDgpO2MtLTspdT1vLnRpbWVzKG8pLG89YS5taW51cyh1LnRpbWVzKGwubWludXModS50aW1lcyhsKSkpKTtyZXR1cm4gR2QobyxzLnByZWNpc2lvbj1uLHMucm91bmRpbmc9ciwhMCl9LGtkLmh5cGVyYm9saWNTaW5lPWtkLnNpbmg9ZnVuY3Rpb24oKXt2YXIgdCxlLG4scixpPXRoaXMsbz1pLmNvbnN0cnVjdG9yO2lmKCFpLmlzRmluaXRlKCl8fGkuaXNaZXJvKCkpcmV0dXJuIG5ldyBvKGkpO2lmKGU9by5wcmVjaXNpb24sbj1vLnJvdW5kaW5nLG8ucHJlY2lzaW9uPWUrTWF0aC5tYXgoaS5lLGkuc2QoKSkrNCxvLnJvdW5kaW5nPTEsKHI9aS5kLmxlbmd0aCk8MylpPWlnKG8sMixpLGksITApO2Vsc2V7dD0odD0xLjQqTWF0aC5zcXJ0KHIpKT4xNj8xNjowfHQsaT1pZyhvLDIsaT1pLnRpbWVzKDEvb2coNSx0KSksaSwhMCk7Zm9yKHZhciBzLGE9bmV3IG8oNSksdT1uZXcgbygxNiksYz1uZXcgbygyMCk7dC0tOylzPWkudGltZXMoaSksaT1pLnRpbWVzKGEucGx1cyhzLnRpbWVzKHUudGltZXMocykucGx1cyhjKSkpKX1yZXR1cm4gby5wcmVjaXNpb249ZSxvLnJvdW5kaW5nPW4sR2QoaSxlLG4sITApfSxrZC5oeXBlcmJvbGljVGFuZ2VudD1rZC50YW5oPWZ1bmN0aW9uKCl7dmFyIHQsZSxuPXRoaXMscj1uLmNvbnN0cnVjdG9yO3JldHVybiBuLmlzRmluaXRlKCk/bi5pc1plcm8oKT9uZXcgcihuKToodD1yLnByZWNpc2lvbixlPXIucm91bmRpbmcsci5wcmVjaXNpb249dCs3LHIucm91bmRpbmc9MSxWZChuLnNpbmgoKSxuLmNvc2goKSxyLnByZWNpc2lvbj10LHIucm91bmRpbmc9ZSkpOm5ldyByKG4ucyl9LGtkLmludmVyc2VDb3NpbmU9a2QuYWNvcz1mdW5jdGlvbigpe3ZhciB0LGU9dGhpcyxuPWUuY29uc3RydWN0b3Iscj1lLmFicygpLmNtcCgxKSxpPW4ucHJlY2lzaW9uLG89bi5yb3VuZGluZztyZXR1cm4tMSE9PXI/MD09PXI/ZS5pc05lZygpP0hkKG4saSxvKTpuZXcgbigwKTpuZXcgbihOYU4pOmUuaXNaZXJvKCk/SGQobixpKzQsbykudGltZXMoLjUpOihuLnByZWNpc2lvbj1pKzYsbi5yb3VuZGluZz0xLGU9ZS5hc2luKCksdD1IZChuLGkrNCxvKS50aW1lcyguNSksbi5wcmVjaXNpb249aSxuLnJvdW5kaW5nPW8sdC5taW51cyhlKSl9LGtkLmludmVyc2VIeXBlcmJvbGljQ29zaW5lPWtkLmFjb3NoPWZ1bmN0aW9uKCl7dmFyIHQsZSxuPXRoaXMscj1uLmNvbnN0cnVjdG9yO3JldHVybiBuLmx0ZSgxKT9uZXcgcihuLmVxKDEpPzA6TmFOKTpuLmlzRmluaXRlKCk/KHQ9ci5wcmVjaXNpb24sZT1yLnJvdW5kaW5nLHIucHJlY2lzaW9uPXQrTWF0aC5tYXgoTWF0aC5hYnMobi5lKSxuLnNkKCkpKzQsci5yb3VuZGluZz0xLERkPSExLG49bi50aW1lcyhuKS5taW51cygxKS5zcXJ0KCkucGx1cyhuKSxEZD0hMCxyLnByZWNpc2lvbj10LHIucm91bmRpbmc9ZSxuLmxuKCkpOm5ldyByKG4pfSxrZC5pbnZlcnNlSHlwZXJib2xpY1NpbmU9a2QuYXNpbmg9ZnVuY3Rpb24oKXt2YXIgdCxlLG49dGhpcyxyPW4uY29uc3RydWN0b3I7cmV0dXJuIW4uaXNGaW5pdGUoKXx8bi5pc1plcm8oKT9uZXcgcihuKToodD1yLnByZWNpc2lvbixlPXIucm91bmRpbmcsci5wcmVjaXNpb249dCsyKk1hdGgubWF4KE1hdGguYWJzKG4uZSksbi5zZCgpKSs2LHIucm91bmRpbmc9MSxEZD0hMSxuPW4udGltZXMobikucGx1cygxKS5zcXJ0KCkucGx1cyhuKSxEZD0hMCxyLnByZWNpc2lvbj10LHIucm91bmRpbmc9ZSxuLmxuKCkpfSxrZC5pbnZlcnNlSHlwZXJib2xpY1RhbmdlbnQ9a2QuYXRhbmg9ZnVuY3Rpb24oKXt2YXIgdCxlLG4scixpPXRoaXMsbz1pLmNvbnN0cnVjdG9yO3JldHVybiBpLmlzRmluaXRlKCk/aS5lPj0wP25ldyBvKGkuYWJzKCkuZXEoMSk/aS5zLzA6aS5pc1plcm8oKT9pOk5hTik6KHQ9by5wcmVjaXNpb24sZT1vLnJvdW5kaW5nLHI9aS5zZCgpLE1hdGgubWF4KHIsdCk8MiotaS5lLTE/R2QobmV3IG8oaSksdCxlLCEwKTooby5wcmVjaXNpb249bj1yLWkuZSxpPVZkKGkucGx1cygxKSxuZXcgbygxKS5taW51cyhpKSxuK3QsMSksby5wcmVjaXNpb249dCs0LG8ucm91bmRpbmc9MSxpPWkubG4oKSxvLnByZWNpc2lvbj10LG8ucm91bmRpbmc9ZSxpLnRpbWVzKC41KSkpOm5ldyBvKE5hTil9LGtkLmludmVyc2VTaW5lPWtkLmFzaW49ZnVuY3Rpb24oKXt2YXIgdCxlLG4scixpPXRoaXMsbz1pLmNvbnN0cnVjdG9yO3JldHVybiBpLmlzWmVybygpP25ldyBvKGkpOihlPWkuYWJzKCkuY21wKDEpLG49by5wcmVjaXNpb24scj1vLnJvdW5kaW5nLC0xIT09ZT8wPT09ZT8oKHQ9SGQobyxuKzQscikudGltZXMoLjUpKS5zPWkucyx0KTpuZXcgbyhOYU4pOihvLnByZWNpc2lvbj1uKzYsby5yb3VuZGluZz0xLGk9aS5kaXYobmV3IG8oMSkubWludXMoaS50aW1lcyhpKSkuc3FydCgpLnBsdXMoMSkpLmF0YW4oKSxvLnByZWNpc2lvbj1uLG8ucm91bmRpbmc9cixpLnRpbWVzKDIpKSl9LGtkLmludmVyc2VUYW5nZW50PWtkLmF0YW49ZnVuY3Rpb24oKXt2YXIgdCxlLG4scixpLG8scyxhLHUsYz10aGlzLGw9Yy5jb25zdHJ1Y3RvcixoPWwucHJlY2lzaW9uLGY9bC5yb3VuZGluZztpZihjLmlzRmluaXRlKCkpe2lmKGMuaXNaZXJvKCkpcmV0dXJuIG5ldyBsKGMpO2lmKGMuYWJzKCkuZXEoMSkmJmgrNDw9QmQpcmV0dXJuKHM9SGQobCxoKzQsZikudGltZXMoLjI1KSkucz1jLnMsc31lbHNle2lmKCFjLnMpcmV0dXJuIG5ldyBsKE5hTik7aWYoaCs0PD1CZClyZXR1cm4ocz1IZChsLGgrNCxmKS50aW1lcyguNSkpLnM9Yy5zLHN9Zm9yKGwucHJlY2lzaW9uPWE9aCsxMCxsLnJvdW5kaW5nPTEsdD1uPU1hdGgubWluKDI4LGEvNysyfDApO3Q7LS10KWM9Yy5kaXYoYy50aW1lcyhjKS5wbHVzKDEpLnNxcnQoKS5wbHVzKDEpKTtmb3IoRGQ9ITEsZT1NYXRoLmNlaWwoYS83KSxyPTEsdT1jLnRpbWVzKGMpLHM9bmV3IGwoYyksaT1jOy0xIT09dDspaWYoaT1pLnRpbWVzKHUpLG89cy5taW51cyhpLmRpdihyKz0yKSksaT1pLnRpbWVzKHUpLHZvaWQgMCE9PShzPW8ucGx1cyhpLmRpdihyKz0yKSkpLmRbZV0pZm9yKHQ9ZTtzLmRbdF09PT1vLmRbdF0mJnQtLTspO3JldHVybiBuJiYocz1zLnRpbWVzKDI8PG4tMSkpLERkPSEwLEdkKHMsbC5wcmVjaXNpb249aCxsLnJvdW5kaW5nPWYsITApfSxrZC5pc0Zpbml0ZT1mdW5jdGlvbigpe3JldHVybiEhdGhpcy5kfSxrZC5pc0ludGVnZXI9a2QuaXNJbnQ9ZnVuY3Rpb24oKXtyZXR1cm4hIXRoaXMuZCYmSWQodGhpcy5lLzcpPnRoaXMuZC5sZW5ndGgtMn0sa2QuaXNOYU49ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5zfSxrZC5pc05lZ2F0aXZlPWtkLmlzTmVnPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuczwwfSxrZC5pc1Bvc2l0aXZlPWtkLmlzUG9zPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucz4wfSxrZC5pc1plcm89ZnVuY3Rpb24oKXtyZXR1cm4hIXRoaXMuZCYmMD09PXRoaXMuZFswXX0sa2QubGVzc1RoYW49a2QubHQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY21wKHQpPDB9LGtkLmxlc3NUaGFuT3JFcXVhbFRvPWtkLmx0ZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbXAodCk8MX0sa2QubG9nYXJpdGhtPWtkLmxvZz1mdW5jdGlvbih0KXt2YXIgZSxuLHIsaSxvLHMsYSx1LGM9dGhpcyxsPWMuY29uc3RydWN0b3IsaD1sLnByZWNpc2lvbixmPWwucm91bmRpbmc7aWYobnVsbD09dCl0PW5ldyBsKDEwKSxlPSEwO2Vsc2V7aWYobj0odD1uZXcgbCh0KSkuZCx0LnM8MHx8IW58fCFuWzBdfHx0LmVxKDEpKXJldHVybiBuZXcgbChOYU4pO2U9dC5lcSgxMCl9aWYobj1jLmQsYy5zPDB8fCFufHwhblswXXx8Yy5lcSgxKSlyZXR1cm4gbmV3IGwobiYmIW5bMF0/LTEvMDoxIT1jLnM/TmFOOm4/MDoxLzApO2lmKGUpaWYobi5sZW5ndGg+MSlvPSEwO2Vsc2V7Zm9yKGk9blswXTtpJTEwPT0wOylpLz0xMDtvPTEhPT1pfWlmKERkPSExLHM9ZWcoYyxhPWgrNSkscj1lP1dkKGwsYSsxMCk6ZWcodCxhKSxVZCgodT1WZChzLHIsYSwxKSkuZCxpPWgsZikpZG97aWYocz1lZyhjLGErPTEwKSxyPWU/V2QobCxhKzEwKTplZyh0LGEpLHU9VmQocyxyLGEsMSksIW8peyt6ZCh1LmQpLnNsaWNlKGkrMSxpKzE1KSsxPT0xZTE0JiYodT1HZCh1LGgrMSwwKSk7YnJlYWt9fXdoaWxlKFVkKHUuZCxpKz0xMCxmKSk7cmV0dXJuIERkPSEwLEdkKHUsaCxmKX0sa2QubWludXM9a2Quc3ViPWZ1bmN0aW9uKHQpe3ZhciBlLG4scixpLG8scyxhLHUsYyxsLGgsZixwPXRoaXMsZD1wLmNvbnN0cnVjdG9yO2lmKHQ9bmV3IGQodCksIXAuZHx8IXQuZClyZXR1cm4gcC5zJiZ0LnM/cC5kP3Qucz0tdC5zOnQ9bmV3IGQodC5kfHxwLnMhPT10LnM/cDpOYU4pOnQ9bmV3IGQoTmFOKSx0O2lmKHAucyE9dC5zKXJldHVybiB0LnM9LXQucyxwLnBsdXModCk7aWYoYz1wLmQsZj10LmQsYT1kLnByZWNpc2lvbix1PWQucm91bmRpbmcsIWNbMF18fCFmWzBdKXtpZihmWzBdKXQucz0tdC5zO2Vsc2V7aWYoIWNbMF0pcmV0dXJuIG5ldyBkKDM9PT11Py0wOjApO3Q9bmV3IGQocCl9cmV0dXJuIERkP0dkKHQsYSx1KTp0fWlmKG49SWQodC5lLzcpLGw9SWQocC5lLzcpLGM9Yy5zbGljZSgpLG89bC1uKXtmb3IoKGg9bzwwKT8oZT1jLG89LW8scz1mLmxlbmd0aCk6KGU9ZixuPWwscz1jLmxlbmd0aCksbz4ocj1NYXRoLm1heChNYXRoLmNlaWwoYS83KSxzKSsyKSYmKG89cixlLmxlbmd0aD0xKSxlLnJldmVyc2UoKSxyPW87ci0tOyllLnB1c2goMCk7ZS5yZXZlcnNlKCl9ZWxzZXtmb3IoKGg9KHI9Yy5sZW5ndGgpPChzPWYubGVuZ3RoKSkmJihzPXIpLHI9MDtyPHM7cisrKWlmKGNbcl0hPWZbcl0pe2g9Y1tyXTxmW3JdO2JyZWFrfW89MH1mb3IoaCYmKGU9YyxjPWYsZj1lLHQucz0tdC5zKSxzPWMubGVuZ3RoLHI9Zi5sZW5ndGgtcztyPjA7LS1yKWNbcysrXT0wO2ZvcihyPWYubGVuZ3RoO3I+bzspe2lmKGNbLS1yXTxmW3JdKXtmb3IoaT1yO2kmJjA9PT1jWy0taV07KWNbaV09UGQtMTstLWNbaV0sY1tyXSs9UGR9Y1tyXS09ZltyXX1mb3IoOzA9PT1jWy0tc107KWMucG9wKCk7Zm9yKDswPT09Y1swXTtjLnNoaWZ0KCkpLS1uO3JldHVybiBjWzBdPyh0LmQ9Yyx0LmU9WGQoYyxuKSxEZD9HZCh0LGEsdSk6dCk6bmV3IGQoMz09PXU/LTA6MCl9LGtkLm1vZHVsbz1rZC5tb2Q9ZnVuY3Rpb24odCl7dmFyIGUsbj10aGlzLHI9bi5jb25zdHJ1Y3RvcjtyZXR1cm4gdD1uZXcgcih0KSwhbi5kfHwhdC5zfHx0LmQmJiF0LmRbMF0/bmV3IHIoTmFOKTohdC5kfHxuLmQmJiFuLmRbMF0/R2QobmV3IHIobiksci5wcmVjaXNpb24sci5yb3VuZGluZyk6KERkPSExLDk9PXIubW9kdWxvPyhlPVZkKG4sdC5hYnMoKSwwLDMsMSkpLnMqPXQuczplPVZkKG4sdCwwLHIubW9kdWxvLDEpLGU9ZS50aW1lcyh0KSxEZD0hMCxuLm1pbnVzKGUpKX0sa2QubmF0dXJhbEV4cG9uZW50aWFsPWtkLmV4cD1mdW5jdGlvbigpe3JldHVybiB0Zyh0aGlzKX0sa2QubmF0dXJhbExvZ2FyaXRobT1rZC5sbj1mdW5jdGlvbigpe3JldHVybiBlZyh0aGlzKX0sa2QubmVnYXRlZD1rZC5uZWc9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzKTtyZXR1cm4gdC5zPS10LnMsR2QodCl9LGtkLnBsdXM9a2QuYWRkPWZ1bmN0aW9uKHQpe3ZhciBlLG4scixpLG8scyxhLHUsYyxsLGg9dGhpcyxmPWguY29uc3RydWN0b3I7aWYodD1uZXcgZih0KSwhaC5kfHwhdC5kKXJldHVybiBoLnMmJnQucz9oLmR8fCh0PW5ldyBmKHQuZHx8aC5zPT09dC5zP2g6TmFOKSk6dD1uZXcgZihOYU4pLHQ7aWYoaC5zIT10LnMpcmV0dXJuIHQucz0tdC5zLGgubWludXModCk7aWYoYz1oLmQsbD10LmQsYT1mLnByZWNpc2lvbix1PWYucm91bmRpbmcsIWNbMF18fCFsWzBdKXJldHVybiBsWzBdfHwodD1uZXcgZihoKSksRGQ/R2QodCxhLHUpOnQ7aWYobz1JZChoLmUvNykscj1JZCh0LmUvNyksYz1jLnNsaWNlKCksaT1vLXIpe2ZvcihpPDA/KG49YyxpPS1pLHM9bC5sZW5ndGgpOihuPWwscj1vLHM9Yy5sZW5ndGgpLGk+KHM9KG89TWF0aC5jZWlsKGEvNykpPnM/bysxOnMrMSkmJihpPXMsbi5sZW5ndGg9MSksbi5yZXZlcnNlKCk7aS0tOyluLnB1c2goMCk7bi5yZXZlcnNlKCl9Zm9yKChzPWMubGVuZ3RoKS0oaT1sLmxlbmd0aCk8MCYmKGk9cyxuPWwsbD1jLGM9biksZT0wO2k7KWU9KGNbLS1pXT1jW2ldK2xbaV0rZSkvUGR8MCxjW2ldJT1QZDtmb3IoZSYmKGMudW5zaGlmdChlKSwrK3IpLHM9Yy5sZW5ndGg7MD09Y1stLXNdOyljLnBvcCgpO3JldHVybiB0LmQ9Yyx0LmU9WGQoYyxyKSxEZD9HZCh0LGEsdSk6dH0sa2QucHJlY2lzaW9uPWtkLnNkPWZ1bmN0aW9uKHQpe3ZhciBlLG49dGhpcztpZih2b2lkIDAhPT10JiZ0IT09ISF0JiYxIT09dCYmMCE9PXQpdGhyb3cgRXJyb3IoQ2QrdCk7cmV0dXJuIG4uZD8oZT1aZChuLmQpLHQmJm4uZSsxPmUmJihlPW4uZSsxKSk6ZT1OYU4sZX0sa2Qucm91bmQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dC5jb25zdHJ1Y3RvcjtyZXR1cm4gR2QobmV3IGUodCksdC5lKzEsZS5yb3VuZGluZyl9LGtkLnNpbmU9a2Quc2luPWZ1bmN0aW9uKCl7dmFyIHQsZSxuPXRoaXMscj1uLmNvbnN0cnVjdG9yO3JldHVybiBuLmlzRmluaXRlKCk/bi5pc1plcm8oKT9uZXcgcihuKToodD1yLnByZWNpc2lvbixlPXIucm91bmRpbmcsci5wcmVjaXNpb249dCtNYXRoLm1heChuLmUsbi5zZCgpKSs3LHIucm91bmRpbmc9MSxuPWZ1bmN0aW9uKHQsZSl7dmFyIG4scj1lLmQubGVuZ3RoO2lmKHI8MylyZXR1cm4gZS5pc1plcm8oKT9lOmlnKHQsMixlLGUpO249MS40Kk1hdGguc3FydChyKSxuPW4+MTY/MTY6MHxuLGU9ZS50aW1lcygxL29nKDUsbikpLGU9aWcodCwyLGUsZSk7Zm9yKHZhciBpLG89bmV3IHQoNSkscz1uZXcgdCgxNiksYT1uZXcgdCgyMCk7bi0tOylpPWUudGltZXMoZSksZT1lLnRpbWVzKG8ucGx1cyhpLnRpbWVzKHMudGltZXMoaSkubWludXMoYSkpKSk7cmV0dXJuIGV9KHIsc2cocixuKSksci5wcmVjaXNpb249dCxyLnJvdW5kaW5nPWUsR2QoeWQ+Mj9uLm5lZygpOm4sdCxlLCEwKSk6bmV3IHIoTmFOKX0sa2Quc3F1YXJlUm9vdD1rZC5zcXJ0PWZ1bmN0aW9uKCl7dmFyIHQsZSxuLHIsaSxvLHM9dGhpcyxhPXMuZCx1PXMuZSxjPXMucyxsPXMuY29uc3RydWN0b3I7aWYoMSE9PWN8fCFhfHwhYVswXSlyZXR1cm4gbmV3IGwoIWN8fGM8MCYmKCFhfHxhWzBdKT9OYU46YT9zOjEvMCk7Zm9yKERkPSExLDA9PShjPU1hdGguc3FydCgrcykpfHxjPT0xLzA/KCgoZT16ZChhKSkubGVuZ3RoK3UpJTI9PTAmJihlKz0iMCIpLGM9TWF0aC5zcXJ0KGUpLHU9SWQoKHUrMSkvMiktKHU8MHx8dSUyKSxjPT0xLzA/ZT0iNWUiK3U6ZT0oZT1jLnRvRXhwb25lbnRpYWwoKSkuc2xpY2UoMCxlLmluZGV4T2YoImUiKSsxKSt1LHI9bmV3IGwoZSkpOnI9bmV3IGwoYy50b1N0cmluZygpKSxuPSh1PWwucHJlY2lzaW9uKSszOzspaWYocj0obz1yKS5wbHVzKFZkKHMsbyxuKzIsMSkpLnRpbWVzKC41KSx6ZChvLmQpLnNsaWNlKDAsbik9PT0oZT16ZChyLmQpKS5zbGljZSgwLG4pKXtpZigiOTk5OSIhPShlPWUuc2xpY2Uobi0zLG4rMSkpJiYoaXx8IjQ5OTkiIT1lKSl7KCErZXx8IStlLnNsaWNlKDEpJiYiNSI9PWUuY2hhckF0KDApKSYmKEdkKHIsdSsxLDEpLHQ9IXIudGltZXMocikuZXEocykpO2JyZWFrfWlmKCFpJiYoR2Qobyx1KzEsMCksby50aW1lcyhvKS5lcShzKSkpe3I9bzticmVha31uKz00LGk9MX1yZXR1cm4gRGQ9ITAsR2Qocix1LGwucm91bmRpbmcsdCl9LGtkLnRhbmdlbnQ9a2QudGFuPWZ1bmN0aW9uKCl7dmFyIHQsZSxuPXRoaXMscj1uLmNvbnN0cnVjdG9yO3JldHVybiBuLmlzRmluaXRlKCk/bi5pc1plcm8oKT9uZXcgcihuKToodD1yLnByZWNpc2lvbixlPXIucm91bmRpbmcsci5wcmVjaXNpb249dCsxMCxyLnJvdW5kaW5nPTEsKG49bi5zaW4oKSkucz0xLG49VmQobixuZXcgcigxKS5taW51cyhuLnRpbWVzKG4pKS5zcXJ0KCksdCsxMCwwKSxyLnByZWNpc2lvbj10LHIucm91bmRpbmc9ZSxHZCgyPT15ZHx8ND09eWQ/bi5uZWcoKTpuLHQsZSwhMCkpOm5ldyByKE5hTil9LGtkLnRpbWVzPWtkLm11bD1mdW5jdGlvbih0KXt2YXIgZSxuLHIsaSxvLHMsYSx1LGMsbD10aGlzLGg9bC5jb25zdHJ1Y3RvcixmPWwuZCxwPSh0PW5ldyBoKHQpKS5kO2lmKHQucyo9bC5zLCEoZiYmZlswXSYmcCYmcFswXSkpcmV0dXJuIG5ldyBoKCF0LnN8fGYmJiFmWzBdJiYhcHx8cCYmIXBbMF0mJiFmP05hTjpmJiZwPzAqdC5zOnQucy8wKTtmb3Iobj1JZChsLmUvNykrSWQodC5lLzcpLCh1PWYubGVuZ3RoKTwoYz1wLmxlbmd0aCkmJihvPWYsZj1wLHA9byxzPXUsdT1jLGM9cyksbz1bXSxyPXM9dStjO3ItLTspby5wdXNoKDApO2ZvcihyPWM7LS1yPj0wOyl7Zm9yKGU9MCxpPXUrcjtpPnI7KWE9b1tpXStwW3JdKmZbaS1yLTFdK2Usb1tpLS1dPWElUGR8MCxlPWEvUGR8MDtvW2ldPShvW2ldK2UpJVBkfDB9Zm9yKDshb1stLXNdOylvLnBvcCgpO3JldHVybiBlPysrbjpvLnNoaWZ0KCksdC5kPW8sdC5lPVhkKG8sbiksRGQ/R2QodCxoLnByZWNpc2lvbixoLnJvdW5kaW5nKTp0fSxrZC50b0JpbmFyeT1mdW5jdGlvbih0LGUpe3JldHVybiBhZyh0aGlzLDIsdCxlKX0sa2QudG9EZWNpbWFsUGxhY2VzPWtkLnRvRFA9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLHI9bi5jb25zdHJ1Y3RvcjtyZXR1cm4gbj1uZXcgcihuKSx2b2lkIDA9PT10P246KGpkKHQsMCx2ZCksdm9pZCAwPT09ZT9lPXIucm91bmRpbmc6amQoZSwwLDgpLEdkKG4sdCtuLmUrMSxlKSl9LGtkLnRvRXhwb25lbnRpYWw9ZnVuY3Rpb24odCxlKXt2YXIgbixyPXRoaXMsaT1yLmNvbnN0cnVjdG9yO3JldHVybiB2b2lkIDA9PT10P249WWQociwhMCk6KGpkKHQsMCx2ZCksdm9pZCAwPT09ZT9lPWkucm91bmRpbmc6amQoZSwwLDgpLG49WWQocj1HZChuZXcgaShyKSx0KzEsZSksITAsdCsxKSksci5pc05lZygpJiYhci5pc1plcm8oKT8iLSIrbjpufSxrZC50b0ZpeGVkPWZ1bmN0aW9uKHQsZSl7dmFyIG4scixpPXRoaXMsbz1pLmNvbnN0cnVjdG9yO3JldHVybiB2b2lkIDA9PT10P249WWQoaSk6KGpkKHQsMCx2ZCksdm9pZCAwPT09ZT9lPW8ucm91bmRpbmc6amQoZSwwLDgpLG49WWQocj1HZChuZXcgbyhpKSx0K2kuZSsxLGUpLCExLHQrci5lKzEpKSxpLmlzTmVnKCkmJiFpLmlzWmVybygpPyItIituOm59LGtkLnRvRnJhY3Rpb249ZnVuY3Rpb24odCl7dmFyIGUsbixyLGksbyxzLGEsdSxjLGwsaCxmLHA9dGhpcyxkPXAuZCxnPXAuY29uc3RydWN0b3I7aWYoIWQpcmV0dXJuIG5ldyBnKHApO2lmKGM9bj1uZXcgZygxKSxyPXU9bmV3IGcoMCkscz0obz0oZT1uZXcgZyhyKSkuZT1aZChkKS1wLmUtMSklNyxlLmRbMF09TWQoMTAsczwwPzcrczpzKSxudWxsPT10KXQ9bz4wP2U6YztlbHNle2lmKCEoYT1uZXcgZyh0KSkuaXNJbnQoKXx8YS5sdChjKSl0aHJvdyBFcnJvcihDZCthKTt0PWEuZ3QoZSk/bz4wP2U6YzphfWZvcihEZD0hMSxhPW5ldyBnKHpkKGQpKSxsPWcucHJlY2lzaW9uLGcucHJlY2lzaW9uPW89NypkLmxlbmd0aCoyO2g9VmQoYSxlLDAsMSwxKSwxIT0oaT1uLnBsdXMoaC50aW1lcyhyKSkpLmNtcCh0KTspbj1yLHI9aSxpPWMsYz11LnBsdXMoaC50aW1lcyhpKSksdT1pLGk9ZSxlPWEubWludXMoaC50aW1lcyhpKSksYT1pO3JldHVybiBpPVZkKHQubWludXMobiksciwwLDEsMSksdT11LnBsdXMoaS50aW1lcyhjKSksbj1uLnBsdXMoaS50aW1lcyhyKSksdS5zPWMucz1wLnMsZj1WZChjLHIsbywxKS5taW51cyhwKS5hYnMoKS5jbXAoVmQodSxuLG8sMSkubWludXMocCkuYWJzKCkpPDE/W2Mscl06W3Usbl0sZy5wcmVjaXNpb249bCxEZD0hMCxmfSxrZC50b0hleGFkZWNpbWFsPWtkLnRvSGV4PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGFnKHRoaXMsMTYsdCxlKX0sa2QudG9OZWFyZXN0PWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcyxyPW4uY29uc3RydWN0b3I7aWYobj1uZXcgcihuKSxudWxsPT10KXtpZighbi5kKXJldHVybiBuO3Q9bmV3IHIoMSksZT1yLnJvdW5kaW5nfWVsc2V7aWYodD1uZXcgcih0KSx2b2lkIDA9PT1lP2U9ci5yb3VuZGluZzpqZChlLDAsOCksIW4uZClyZXR1cm4gdC5zP246dDtpZighdC5kKXJldHVybiB0LnMmJih0LnM9bi5zKSx0fXJldHVybiB0LmRbMF0/KERkPSExLG49VmQobix0LDAsZSwxKS50aW1lcyh0KSxEZD0hMCxHZChuKSk6KHQucz1uLnMsbj10KSxufSxrZC50b051bWJlcj1mdW5jdGlvbigpe3JldHVybit0aGlzfSxrZC50b09jdGFsPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGFnKHRoaXMsOCx0LGUpfSxrZC50b1Bvd2VyPWtkLnBvdz1mdW5jdGlvbih0KXt2YXIgZSxuLHIsaSxvLHMsYT10aGlzLHU9YS5jb25zdHJ1Y3RvcixjPSsodD1uZXcgdSh0KSk7aWYoIShhLmQmJnQuZCYmYS5kWzBdJiZ0LmRbMF0pKXJldHVybiBuZXcgdShNZCgrYSxjKSk7aWYoKGE9bmV3IHUoYSkpLmVxKDEpKXJldHVybiBhO2lmKHI9dS5wcmVjaXNpb24sbz11LnJvdW5kaW5nLHQuZXEoMSkpcmV0dXJuIEdkKGEscixvKTtpZigoZT1JZCh0LmUvNykpPj10LmQubGVuZ3RoLTEmJihuPWM8MD8tYzpjKTw9OTAwNzE5OTI1NDc0MDk5MSlyZXR1cm4gaT1KZCh1LGEsbixyKSx0LnM8MD9uZXcgdSgxKS5kaXYoaSk6R2QoaSxyLG8pO2lmKChzPWEucyk8MCl7aWYoZTx0LmQubGVuZ3RoLTEpcmV0dXJuIG5ldyB1KE5hTik7aWYoISgxJnQuZFtlXSkmJihzPTEpLDA9PWEuZSYmMT09YS5kWzBdJiYxPT1hLmQubGVuZ3RoKXJldHVybiBhLnM9cyxhfXJldHVybihlPTAhPShuPU1kKCthLGMpKSYmaXNGaW5pdGUobik/bmV3IHUobisiIikuZTpJZChjKihNYXRoLmxvZygiMC4iK3pkKGEuZCkpL01hdGguTE4xMCthLmUrMSkpKT51Lm1heEUrMXx8ZTx1Lm1pbkUtMT9uZXcgdShlPjA/cy8wOjApOihEZD0hMSx1LnJvdW5kaW5nPWEucz0xLG49TWF0aC5taW4oMTIsKGUrIiIpLmxlbmd0aCksKGk9dGcodC50aW1lcyhlZyhhLHIrbikpLHIpKS5kJiYoVWQoKGk9R2QoaSxyKzUsMSkpLmQscixvKSYmKGU9cisxMCwremQoKGk9R2QodGcodC50aW1lcyhlZyhhLGUrbikpLGUpLGUrNSwxKSkuZCkuc2xpY2UocisxLHIrMTUpKzE9PTFlMTQmJihpPUdkKGkscisxLDApKSkpLGkucz1zLERkPSEwLHUucm91bmRpbmc9byxHZChpLHIsbykpfSxrZC50b1ByZWNpc2lvbj1mdW5jdGlvbih0LGUpe3ZhciBuLHI9dGhpcyxpPXIuY29uc3RydWN0b3I7cmV0dXJuIHZvaWQgMD09PXQ/bj1ZZChyLHIuZTw9aS50b0V4cE5lZ3x8ci5lPj1pLnRvRXhwUG9zKTooamQodCwxLHZkKSx2b2lkIDA9PT1lP2U9aS5yb3VuZGluZzpqZChlLDAsOCksbj1ZZChyPUdkKG5ldyBpKHIpLHQsZSksdDw9ci5lfHxyLmU8PWkudG9FeHBOZWcsdCkpLHIuaXNOZWcoKSYmIXIuaXNaZXJvKCk/Ii0iK246bn0sa2QudG9TaWduaWZpY2FudERpZ2l0cz1rZC50b1NEPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gdm9pZCAwPT09dD8odD1uLnByZWNpc2lvbixlPW4ucm91bmRpbmcpOihqZCh0LDEsdmQpLHZvaWQgMD09PWU/ZT1uLnJvdW5kaW5nOmpkKGUsMCw4KSksR2QobmV3IG4odGhpcyksdCxlKX0sa2QudG9TdHJpbmc9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dC5jb25zdHJ1Y3RvcixuPVlkKHQsdC5lPD1lLnRvRXhwTmVnfHx0LmU+PWUudG9FeHBQb3MpO3JldHVybiB0LmlzTmVnKCkmJiF0LmlzWmVybygpPyItIituOm59LGtkLnRydW5jYXRlZD1rZC50cnVuYz1mdW5jdGlvbigpe3JldHVybiBHZChuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzKSx0aGlzLmUrMSwxKX0sa2QudmFsdWVPZj1rZC50b0pTT049ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dC5jb25zdHJ1Y3RvcixuPVlkKHQsdC5lPD1lLnRvRXhwTmVnfHx0LmU+PWUudG9FeHBQb3MpO3JldHVybiB0LmlzTmVnKCk/Ii0iK246bn07dmFyIFZkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUsbil7dmFyIHIsaT0wLG89dC5sZW5ndGg7Zm9yKHQ9dC5zbGljZSgpO28tLTspcj10W29dKmUraSx0W29dPXIlbnwwLGk9ci9ufDA7cmV0dXJuIGkmJnQudW5zaGlmdChpKSx0fWZ1bmN0aW9uIGUodCxlLG4scil7dmFyIGksbztpZihuIT1yKW89bj5yPzE6LTE7ZWxzZSBmb3IoaT1vPTA7aTxuO2krKylpZih0W2ldIT1lW2ldKXtvPXRbaV0+ZVtpXT8xOi0xO2JyZWFrfXJldHVybiBvfWZ1bmN0aW9uIG4odCxlLG4scil7Zm9yKHZhciBpPTA7bi0tOyl0W25dLT1pLGk9dFtuXTxlW25dPzE6MCx0W25dPWkqcit0W25dLWVbbl07Zm9yKDshdFswXSYmdC5sZW5ndGg+MTspdC5zaGlmdCgpfXJldHVybiBmdW5jdGlvbihyLGksbyxzLGEsdSl7dmFyIGMsbCxoLGYscCxkLGcseSxtLHYsXyx4LHcsYixELEUsQyxTLEEsTixJPXIuY29uc3RydWN0b3IsTT1yLnM9PWkucz8xOi0xLEY9ci5kLFQ9aS5kO2lmKCEoRiYmRlswXSYmVCYmVFswXSkpcmV0dXJuIG5ldyBJKHIucyYmaS5zJiYoRj8hVHx8RlswXSE9VFswXTpUKT9GJiYwPT1GWzBdfHwhVD8wKk06TS8wOk5hTik7Zm9yKHU/KHA9MSxsPXIuZS1pLmUpOih1PVBkLHA9NyxsPUlkKHIuZS9wKS1JZChpLmUvcCkpLEE9VC5sZW5ndGgsQz1GLmxlbmd0aCx2PShtPW5ldyBJKE0pKS5kPVtdLGg9MDtUW2hdPT0oRltoXXx8MCk7aCsrKTtpZihUW2hdPihGW2hdfHwwKSYmbC0tLG51bGw9PW8/KGI9bz1JLnByZWNpc2lvbixzPUkucm91bmRpbmcpOmI9YT9vKyhyLmUtaS5lKSsxOm8sYjwwKXYucHVzaCgxKSxkPSEwO2Vsc2V7aWYoYj1iL3ArMnwwLGg9MCwxPT1BKXtmb3IoZj0wLFQ9VFswXSxiKys7KGg8Q3x8ZikmJmItLTtoKyspRD1mKnUrKEZbaF18fDApLHZbaF09RC9UfDAsZj1EJVR8MDtkPWZ8fGg8Q31lbHNle2ZvcigoZj11LyhUWzBdKzEpfDApPjEmJihUPXQoVCxmLHUpLEY9dChGLGYsdSksQT1ULmxlbmd0aCxDPUYubGVuZ3RoKSxFPUEseD0oXz1GLnNsaWNlKDAsQSkpLmxlbmd0aDt4PEE7KV9beCsrXT0wOyhOPVQuc2xpY2UoKSkudW5zaGlmdCgwKSxTPVRbMF0sVFsxXT49dS8yJiYrK1M7ZG97Zj0wLChjPWUoVCxfLEEseCkpPDA/KHc9X1swXSxBIT14JiYodz13KnUrKF9bMV18fDApKSwoZj13L1N8MCk+MT8oZj49dSYmKGY9dS0xKSwxPT0oYz1lKGc9dChULGYsdSksXyx5PWcubGVuZ3RoLHg9Xy5sZW5ndGgpKSYmKGYtLSxuKGcsQTx5P046VCx5LHUpKSk6KDA9PWYmJihjPWY9MSksZz1ULnNsaWNlKCkpLCh5PWcubGVuZ3RoKTx4JiZnLnVuc2hpZnQoMCksbihfLGcseCx1KSwtMT09YyYmKChjPWUoVCxfLEEseD1fLmxlbmd0aCkpPDEmJihmKyssbihfLEE8eD9OOlQseCx1KSkpLHg9Xy5sZW5ndGgpOjA9PT1jJiYoZisrLF89WzBdKSx2W2grK109ZixjJiZfWzBdP19beCsrXT1GW0VdfHwwOihfPVtGW0VdXSx4PTEpfXdoaWxlKChFKys8Q3x8dm9pZCAwIT09X1swXSkmJmItLSk7ZD12b2lkIDAhPT1fWzBdfXZbMF18fHYuc2hpZnQoKX1pZigxPT1wKW0uZT1sLGdkPWQ7ZWxzZXtmb3IoaD0xLGY9dlswXTtmPj0xMDtmLz0xMCloKys7bS5lPWgrbCpwLTEsR2QobSxhP28rbS5lKzE6byxzLGQpfXJldHVybiBtfX0oKTtmdW5jdGlvbiBHZCh0LGUsbixyKXt2YXIgaSxvLHMsYSx1LGMsbCxoLGYscD10LmNvbnN0cnVjdG9yO3Q6aWYobnVsbCE9ZSl7aWYoIShoPXQuZCkpcmV0dXJuIHQ7Zm9yKGk9MSxhPWhbMF07YT49MTA7YS89MTApaSsrO2lmKChvPWUtaSk8MClvKz03LHM9ZSx1PShsPWhbZj0wXSkvTWQoMTAsaS1zLTEpJTEwfDA7ZWxzZSBpZigoZj1NYXRoLmNlaWwoKG8rMSkvNykpPj0oYT1oLmxlbmd0aCkpe2lmKCFyKWJyZWFrIHQ7Zm9yKDthKys8PWY7KWgucHVzaCgwKTtsPXU9MCxpPTEscz0obyU9NyktNysxfWVsc2V7Zm9yKGw9YT1oW2ZdLGk9MTthPj0xMDthLz0xMClpKys7dT0ocz0obyU9NyktNytpKTwwPzA6bC9NZCgxMCxpLXMtMSklMTB8MH1pZihyPXJ8fGU8MHx8dm9pZCAwIT09aFtmKzFdfHwoczwwP2w6bCVNZCgxMCxpLXMtMSkpLGM9bjw0Pyh1fHxyKSYmKDA9PW58fG49PSh0LnM8MD8zOjIpKTp1PjV8fDU9PXUmJig0PT1ufHxyfHw2PT1uJiYobz4wP3M+MD9sL01kKDEwLGktcyk6MDpoW2YtMV0pJTEwJjF8fG49PSh0LnM8MD84OjcpKSxlPDF8fCFoWzBdKXJldHVybiBoLmxlbmd0aD0wLGM/KGUtPXQuZSsxLGhbMF09TWQoMTAsKDctZSU3KSU3KSx0LmU9LWV8fDApOmhbMF09dC5lPTAsdDtpZigwPT1vPyhoLmxlbmd0aD1mLGE9MSxmLS0pOihoLmxlbmd0aD1mKzEsYT1NZCgxMCw3LW8pLGhbZl09cz4wPyhsL01kKDEwLGktcyklTWQoMTAscyl8MCkqYTowKSxjKWZvcig7Oyl7aWYoMD09Zil7Zm9yKG89MSxzPWhbMF07cz49MTA7cy89MTApbysrO2ZvcihzPWhbMF0rPWEsYT0xO3M+PTEwO3MvPTEwKWErKztvIT1hJiYodC5lKyssaFswXT09UGQmJihoWzBdPTEpKTticmVha31pZihoW2ZdKz1hLGhbZl0hPVBkKWJyZWFrO2hbZi0tXT0wLGE9MX1mb3Iobz1oLmxlbmd0aDswPT09aFstLW9dOyloLnBvcCgpfXJldHVybiBEZCYmKHQuZT5wLm1heEU/KHQuZD1udWxsLHQuZT1OYU4pOnQuZTxwLm1pbkUmJih0LmU9MCx0LmQ9WzBdKSksdH1mdW5jdGlvbiBZZCh0LGUsbil7aWYoIXQuaXNGaW5pdGUoKSlyZXR1cm4gbmcodCk7dmFyIHIsaT10LmUsbz16ZCh0LmQpLHM9by5sZW5ndGg7cmV0dXJuIGU/KG4mJihyPW4tcyk+MD9vPW8uY2hhckF0KDApKyIuIitvLnNsaWNlKDEpK0tkKHIpOnM+MSYmKG89by5jaGFyQXQoMCkrIi4iK28uc2xpY2UoMSkpLG89bysodC5lPDA/ImUiOiJlKyIpK3QuZSk6aTwwPyhvPSIwLiIrS2QoLWktMSkrbyxuJiYocj1uLXMpPjAmJihvKz1LZChyKSkpOmk+PXM/KG8rPUtkKGkrMS1zKSxuJiYocj1uLWktMSk+MCYmKG89bysiLiIrS2QocikpKTooKHI9aSsxKTxzJiYobz1vLnNsaWNlKDAscikrIi4iK28uc2xpY2UocikpLG4mJihyPW4tcyk+MCYmKGkrMT09PXMmJihvKz0iLiIpLG8rPUtkKHIpKSksb31mdW5jdGlvbiBYZCh0LGUpe3ZhciBuPXRbMF07Zm9yKGUqPTc7bj49MTA7bi89MTApZSsrO3JldHVybiBlfWZ1bmN0aW9uIFdkKHQsZSxuKXtpZihlPlJkKXRocm93IERkPSEwLG4mJih0LnByZWNpc2lvbj1uKSxFcnJvcihTZCk7cmV0dXJuIEdkKG5ldyB0KHhkKSxlLDEsITApfWZ1bmN0aW9uIEhkKHQsZSxuKXtpZihlPkJkKXRocm93IEVycm9yKFNkKTtyZXR1cm4gR2QobmV3IHQod2QpLGUsbiwhMCl9ZnVuY3Rpb24gWmQodCl7dmFyIGU9dC5sZW5ndGgtMSxuPTcqZSsxO2lmKGU9dFtlXSl7Zm9yKDtlJTEwPT0wO2UvPTEwKW4tLTtmb3IoZT10WzBdO2U+PTEwO2UvPTEwKW4rK31yZXR1cm4gbn1mdW5jdGlvbiBLZCh0KXtmb3IodmFyIGU9IiI7dC0tOyllKz0iMCI7cmV0dXJuIGV9ZnVuY3Rpb24gSmQodCxlLG4scil7dmFyIGksbz1uZXcgdCgxKSxzPU1hdGguY2VpbChyLzcrNCk7Zm9yKERkPSExOzspe2lmKG4lMiYmKHVnKChvPW8udGltZXMoZSkpLmQscykmJihpPSEwKSksMD09PShuPUlkKG4vMikpKXtuPW8uZC5sZW5ndGgtMSxpJiYwPT09by5kW25dJiYrK28uZFtuXTticmVha311ZygoZT1lLnRpbWVzKGUpKS5kLHMpfXJldHVybiBEZD0hMCxvfWZ1bmN0aW9uIFFkKHQpe3JldHVybiAxJnQuZFt0LmQubGVuZ3RoLTFdfWZ1bmN0aW9uICRkKHQsZSxuKXtmb3IodmFyIHIsaT1uZXcgdChlWzBdKSxvPTA7KytvPGUubGVuZ3RoOyl7aWYoIShyPW5ldyB0KGVbb10pKS5zKXtpPXI7YnJlYWt9aVtuXShyKSYmKGk9cil9cmV0dXJuIGl9ZnVuY3Rpb24gdGcodCxlKXt2YXIgbixyLGksbyxzLGEsdSxjPTAsbD0wLGg9MCxmPXQuY29uc3RydWN0b3IscD1mLnJvdW5kaW5nLGQ9Zi5wcmVjaXNpb247aWYoIXQuZHx8IXQuZFswXXx8dC5lPjE3KXJldHVybiBuZXcgZih0LmQ/dC5kWzBdP3QuczwwPzA6MS8wOjE6dC5zP3QuczwwPzA6dDpOYU4pO2ZvcihudWxsPT1lPyhEZD0hMSx1PWQpOnU9ZSxhPW5ldyBmKC4wMzEyNSk7dC5lPi0yOyl0PXQudGltZXMoYSksaCs9NTtmb3IodSs9cj1NYXRoLmxvZyhNZCgyLGgpKS9NYXRoLkxOMTAqMis1fDAsbj1vPXM9bmV3IGYoMSksZi5wcmVjaXNpb249dTs7KXtpZihvPUdkKG8udGltZXModCksdSwxKSxuPW4udGltZXMoKytsKSx6ZCgoYT1zLnBsdXMoVmQobyxuLHUsMSkpKS5kKS5zbGljZSgwLHUpPT09emQocy5kKS5zbGljZSgwLHUpKXtmb3IoaT1oO2ktLTspcz1HZChzLnRpbWVzKHMpLHUsMSk7aWYobnVsbCE9ZSlyZXR1cm4gZi5wcmVjaXNpb249ZCxzO2lmKCEoYzwzJiZVZChzLmQsdS1yLHAsYykpKXJldHVybiBHZChzLGYucHJlY2lzaW9uPWQscCxEZD0hMCk7Zi5wcmVjaXNpb249dSs9MTAsbj1vPWE9bmV3IGYoMSksbD0wLGMrK31zPWF9fWZ1bmN0aW9uIGVnKHQsZSl7dmFyIG4scixpLG8scyxhLHUsYyxsLGgsZixwPTEsZD10LGc9ZC5kLHk9ZC5jb25zdHJ1Y3RvcixtPXkucm91bmRpbmcsdj15LnByZWNpc2lvbjtpZihkLnM8MHx8IWd8fCFnWzBdfHwhZC5lJiYxPT1nWzBdJiYxPT1nLmxlbmd0aClyZXR1cm4gbmV3IHkoZyYmIWdbMF0/LTEvMDoxIT1kLnM/TmFOOmc/MDpkKTtpZihudWxsPT1lPyhEZD0hMSxsPXYpOmw9ZSx5LnByZWNpc2lvbj1sKz0xMCxyPShuPXpkKGcpKS5jaGFyQXQoMCksIShNYXRoLmFicyhvPWQuZSk8MTVlMTQpKXJldHVybiBjPVdkKHksbCsyLHYpLnRpbWVzKG8rIiIpLGQ9ZWcobmV3IHkocisiLiIrbi5zbGljZSgxKSksbC0xMCkucGx1cyhjKSx5LnByZWNpc2lvbj12LG51bGw9PWU/R2QoZCx2LG0sRGQ9ITApOmQ7Zm9yKDtyPDcmJjEhPXJ8fDE9PXImJm4uY2hhckF0KDEpPjM7KXI9KG49emQoKGQ9ZC50aW1lcyh0KSkuZCkpLmNoYXJBdCgwKSxwKys7Zm9yKG89ZC5lLHI+MT8oZD1uZXcgeSgiMC4iK24pLG8rKyk6ZD1uZXcgeShyKyIuIituLnNsaWNlKDEpKSxoPWQsdT1zPWQ9VmQoZC5taW51cygxKSxkLnBsdXMoMSksbCwxKSxmPUdkKGQudGltZXMoZCksbCwxKSxpPTM7Oyl7aWYocz1HZChzLnRpbWVzKGYpLGwsMSksemQoKGM9dS5wbHVzKFZkKHMsbmV3IHkoaSksbCwxKSkpLmQpLnNsaWNlKDAsbCk9PT16ZCh1LmQpLnNsaWNlKDAsbCkpe2lmKHU9dS50aW1lcygyKSwwIT09byYmKHU9dS5wbHVzKFdkKHksbCsyLHYpLnRpbWVzKG8rIiIpKSksdT1WZCh1LG5ldyB5KHApLGwsMSksbnVsbCE9ZSlyZXR1cm4geS5wcmVjaXNpb249dix1O2lmKCFVZCh1LmQsbC0xMCxtLGEpKXJldHVybiBHZCh1LHkucHJlY2lzaW9uPXYsbSxEZD0hMCk7eS5wcmVjaXNpb249bCs9MTAsYz1zPWQ9VmQoaC5taW51cygxKSxoLnBsdXMoMSksbCwxKSxmPUdkKGQudGltZXMoZCksbCwxKSxpPWE9MX11PWMsaSs9Mn19ZnVuY3Rpb24gbmcodCl7cmV0dXJuIFN0cmluZyh0LnMqdC5zLzApfWZ1bmN0aW9uIHJnKHQsZSl7dmFyIG4scixpO2Zvcigobj1lLmluZGV4T2YoIi4iKSk+LTEmJihlPWUucmVwbGFjZSgiLiIsIiIpKSwocj1lLnNlYXJjaCgvZS9pKSk+MD8objwwJiYobj1yKSxuKz0rZS5zbGljZShyKzEpLGU9ZS5zdWJzdHJpbmcoMCxyKSk6bjwwJiYobj1lLmxlbmd0aCkscj0wOzQ4PT09ZS5jaGFyQ29kZUF0KHIpO3IrKyk7Zm9yKGk9ZS5sZW5ndGg7NDg9PT1lLmNoYXJDb2RlQXQoaS0xKTstLWkpO2lmKGU9ZS5zbGljZShyLGkpKXtpZihpLT1yLHQuZT1uPW4tci0xLHQuZD1bXSxyPShuKzEpJTcsbjwwJiYocis9NykscjxpKXtmb3IociYmdC5kLnB1c2goK2Uuc2xpY2UoMCxyKSksaS09NztyPGk7KXQuZC5wdXNoKCtlLnNsaWNlKHIscis9NykpO3I9Ny0oZT1lLnNsaWNlKHIpKS5sZW5ndGh9ZWxzZSByLT1pO2Zvcig7ci0tOyllKz0iMCI7dC5kLnB1c2goK2UpLERkJiYodC5lPnQuY29uc3RydWN0b3IubWF4RT8odC5kPW51bGwsdC5lPU5hTik6dC5lPHQuY29uc3RydWN0b3IubWluRSYmKHQuZT0wLHQuZD1bMF0pKX1lbHNlIHQuZT0wLHQuZD1bMF07cmV0dXJuIHR9ZnVuY3Rpb24gaWcodCxlLG4scixpKXt2YXIgbyxzLGEsdSxjPXQucHJlY2lzaW9uLGw9TWF0aC5jZWlsKGMvNyk7Zm9yKERkPSExLHU9bi50aW1lcyhuKSxhPW5ldyB0KHIpOzspe2lmKHM9VmQoYS50aW1lcyh1KSxuZXcgdChlKysqZSsrKSxjLDEpLGE9aT9yLnBsdXMocyk6ci5taW51cyhzKSxyPVZkKHMudGltZXModSksbmV3IHQoZSsrKmUrKyksYywxKSx2b2lkIDAhPT0ocz1hLnBsdXMocikpLmRbbF0pe2ZvcihvPWw7cy5kW29dPT09YS5kW29dJiZvLS07KTtpZigtMT09bylicmVha31vPWEsYT1yLHI9cyxzPW99cmV0dXJuIERkPSEwLHMuZC5sZW5ndGg9bCsxLHN9ZnVuY3Rpb24gb2codCxlKXtmb3IodmFyIG49dDstLWU7KW4qPXQ7cmV0dXJuIG59ZnVuY3Rpb24gc2codCxlKXt2YXIgbixyPWUuczwwLGk9SGQodCx0LnByZWNpc2lvbiwxKSxvPWkudGltZXMoLjUpO2lmKChlPWUuYWJzKCkpLmx0ZShvKSlyZXR1cm4geWQ9cj80OjEsZTtpZigobj1lLmRpdlRvSW50KGkpKS5pc1plcm8oKSl5ZD1yPzM6MjtlbHNle2lmKChlPWUubWludXMobi50aW1lcyhpKSkpLmx0ZShvKSlyZXR1cm4geWQ9UWQobik/cj8yOjM6cj80OjEsZTt5ZD1RZChuKT9yPzE6NDpyPzM6Mn1yZXR1cm4gZS5taW51cyhpKS5hYnMoKX1mdW5jdGlvbiBhZyh0LGUsbixyKXt2YXIgaSxvLHMsYSx1LGMsbCxoLGYscD10LmNvbnN0cnVjdG9yLGQ9dm9pZCAwIT09bjtpZihkPyhqZChuLDEsdmQpLHZvaWQgMD09PXI/cj1wLnJvdW5kaW5nOmpkKHIsMCw4KSk6KG49cC5wcmVjaXNpb24scj1wLnJvdW5kaW5nKSx0LmlzRmluaXRlKCkpe2ZvcihkPyhpPTIsMTY9PWU/bj00Km4tMzo4PT1lJiYobj0zKm4tMikpOmk9ZSwocz0obD1ZZCh0KSkuaW5kZXhPZigiLiIpKT49MCYmKGw9bC5yZXBsYWNlKCIuIiwiIiksKGY9bmV3IHAoMSkpLmU9bC5sZW5ndGgtcyxmLmQ9cWQoWWQoZiksMTAsaSksZi5lPWYuZC5sZW5ndGgpLG89dT0oaD1xZChsLDEwLGkpKS5sZW5ndGg7MD09aFstLXVdOyloLnBvcCgpO2lmKGhbMF0pe2lmKHM8MD9vLS06KCh0PW5ldyBwKHQpKS5kPWgsdC5lPW8saD0odD1WZCh0LGYsbixyLDAsaSkpLmQsbz10LmUsYz1nZCkscz1oW25dLGE9aS8yLGM9Y3x8dm9pZCAwIT09aFtuKzFdLGM9cjw0Pyh2b2lkIDAhPT1zfHxjKSYmKDA9PT1yfHxyPT09KHQuczwwPzM6MikpOnM+YXx8cz09PWEmJig0PT09cnx8Y3x8Nj09PXImJjEmaFtuLTFdfHxyPT09KHQuczwwPzg6NykpLGgubGVuZ3RoPW4sYylmb3IoOysraFstLW5dPmktMTspaFtuXT0wLG58fCgrK28saC51bnNoaWZ0KDEpKTtmb3IodT1oLmxlbmd0aDshaFt1LTFdOy0tdSk7Zm9yKHM9MCxsPSIiO3M8dTtzKyspbCs9X2QuY2hhckF0KGhbc10pO2lmKGQpe2lmKHU+MSlpZigxNj09ZXx8OD09ZSl7Zm9yKHM9MTY9PWU/NDozLC0tdTt1JXM7dSsrKWwrPSIwIjtmb3IodT0oaD1xZChsLGksZSkpLmxlbmd0aDshaFt1LTFdOy0tdSk7Zm9yKHM9MSxsPSIxLiI7czx1O3MrKylsKz1fZC5jaGFyQXQoaFtzXSl9ZWxzZSBsPWwuY2hhckF0KDApKyIuIitsLnNsaWNlKDEpO2w9bCsobzwwPyJwIjoicCsiKStvfWVsc2UgaWYobzwwKXtmb3IoOysrbzspbD0iMCIrbDtsPSIwLiIrbH1lbHNlIGlmKCsrbz51KWZvcihvLT11O28tLTspbCs9IjAiO2Vsc2Ugbzx1JiYobD1sLnNsaWNlKDAsbykrIi4iK2wuc2xpY2UobykpfWVsc2UgbD1kPyIwcCswIjoiMCI7bD0oMTY9PWU/IjB4IjoyPT1lPyIwYiI6OD09ZT8iMG8iOiIiKStsfWVsc2UgbD1uZyh0KTtyZXR1cm4gdC5zPDA/Ii0iK2w6bH1mdW5jdGlvbiB1Zyh0LGUpe2lmKHQubGVuZ3RoPmUpcmV0dXJuIHQubGVuZ3RoPWUsITB9ZnVuY3Rpb24gY2codCl7cmV0dXJuIG5ldyB0aGlzKHQpLmFicygpfWZ1bmN0aW9uIGxnKHQpe3JldHVybiBuZXcgdGhpcyh0KS5hY29zKCl9ZnVuY3Rpb24gaGcodCl7cmV0dXJuIG5ldyB0aGlzKHQpLmFjb3NoKCl9ZnVuY3Rpb24gZmcodCxlKXtyZXR1cm4gbmV3IHRoaXModCkucGx1cyhlKX1mdW5jdGlvbiBwZyh0KXtyZXR1cm4gbmV3IHRoaXModCkuYXNpbigpfWZ1bmN0aW9uIGRnKHQpe3JldHVybiBuZXcgdGhpcyh0KS5hc2luaCgpfWZ1bmN0aW9uIGdnKHQpe3JldHVybiBuZXcgdGhpcyh0KS5hdGFuKCl9ZnVuY3Rpb24geWcodCl7cmV0dXJuIG5ldyB0aGlzKHQpLmF0YW5oKCl9ZnVuY3Rpb24gbWcodCxlKXt0PW5ldyB0aGlzKHQpLGU9bmV3IHRoaXMoZSk7dmFyIG4scj10aGlzLnByZWNpc2lvbixpPXRoaXMucm91bmRpbmcsbz1yKzQ7cmV0dXJuIHQucyYmZS5zP3QuZHx8ZS5kPyFlLmR8fHQuaXNaZXJvKCk/KG49ZS5zPDA/SGQodGhpcyxyLGkpOm5ldyB0aGlzKDApKS5zPXQuczohdC5kfHxlLmlzWmVybygpPyhuPUhkKHRoaXMsbywxKS50aW1lcyguNSkpLnM9dC5zOmUuczwwPyh0aGlzLnByZWNpc2lvbj1vLHRoaXMucm91bmRpbmc9MSxuPXRoaXMuYXRhbihWZCh0LGUsbywxKSksZT1IZCh0aGlzLG8sMSksdGhpcy5wcmVjaXNpb249cix0aGlzLnJvdW5kaW5nPWksbj10LnM8MD9uLm1pbnVzKGUpOm4ucGx1cyhlKSk6bj10aGlzLmF0YW4oVmQodCxlLG8sMSkpOihuPUhkKHRoaXMsbywxKS50aW1lcyhlLnM+MD8uMjU6Ljc1KSkucz10LnM6bj1uZXcgdGhpcyhOYU4pLG59ZnVuY3Rpb24gdmcodCl7cmV0dXJuIG5ldyB0aGlzKHQpLmNicnQoKX1mdW5jdGlvbiBfZyh0KXtyZXR1cm4gR2QodD1uZXcgdGhpcyh0KSx0LmUrMSwyKX1mdW5jdGlvbiB4Zyh0LGUsbil7cmV0dXJuIG5ldyB0aGlzKHQpLmNsYW1wKGUsbil9ZnVuY3Rpb24gd2codCl7aWYoIXR8fCJvYmplY3QiIT10eXBlb2YgdCl0aHJvdyBFcnJvcihFZCsiT2JqZWN0IGV4cGVjdGVkIik7dmFyIGUsbixyLGk9ITA9PT10LmRlZmF1bHRzLG89WyJwcmVjaXNpb24iLDEsdmQsInJvdW5kaW5nIiwwLDgsInRvRXhwTmVnIiwtbWQsMCwidG9FeHBQb3MiLDAsbWQsIm1heEUiLDAsbWQsIm1pbkUiLC1tZCwwLCJtb2R1bG8iLDAsOV07Zm9yKGU9MDtlPG8ubGVuZ3RoO2UrPTMpaWYobj1vW2VdLGkmJih0aGlzW25dPWJkW25dKSx2b2lkIDAhPT0ocj10W25dKSl7aWYoIShJZChyKT09PXImJnI+PW9bZSsxXSYmcjw9b1tlKzJdKSl0aHJvdyBFcnJvcihDZCtuKyI6ICIrcik7dGhpc1tuXT1yfWlmKG49ImNyeXB0byIsaSYmKHRoaXNbbl09YmRbbl0pLHZvaWQgMCE9PShyPXRbbl0pKXtpZighMCE9PXImJiExIT09ciYmMCE9PXImJjEhPT1yKXRocm93IEVycm9yKENkK24rIjogIityKTtpZihyKXtpZigidW5kZWZpbmVkIj09dHlwZW9mIGNyeXB0b3x8IWNyeXB0b3x8IWNyeXB0by5nZXRSYW5kb21WYWx1ZXMmJiFjcnlwdG8ucmFuZG9tQnl0ZXMpdGhyb3cgRXJyb3IoQWQpO3RoaXNbbl09ITB9ZWxzZSB0aGlzW25dPSExfXJldHVybiB0aGlzfWZ1bmN0aW9uIGJnKHQpe3JldHVybiBuZXcgdGhpcyh0KS5jb3MoKX1mdW5jdGlvbiBEZyh0KXtyZXR1cm4gbmV3IHRoaXModCkuY29zaCgpfWZ1bmN0aW9uIEVnKHQsZSl7cmV0dXJuIG5ldyB0aGlzKHQpLmRpdihlKX1mdW5jdGlvbiBDZyh0KXtyZXR1cm4gbmV3IHRoaXModCkuZXhwKCl9ZnVuY3Rpb24gU2codCl7cmV0dXJuIEdkKHQ9bmV3IHRoaXModCksdC5lKzEsMyl9ZnVuY3Rpb24gQWcoKXt2YXIgdCxlLG49bmV3IHRoaXMoMCk7Zm9yKERkPSExLHQ9MDt0PGFyZ3VtZW50cy5sZW5ndGg7KWlmKChlPW5ldyB0aGlzKGFyZ3VtZW50c1t0KytdKSkuZCluLmQmJihuPW4ucGx1cyhlLnRpbWVzKGUpKSk7ZWxzZXtpZihlLnMpcmV0dXJuIERkPSEwLG5ldyB0aGlzKDEvMCk7bj1lfXJldHVybiBEZD0hMCxuLnNxcnQoKX1mdW5jdGlvbiBOZyh0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIFpnfHx0JiZ0LnRvU3RyaW5nVGFnPT09TmR8fCExfWZ1bmN0aW9uIElnKHQpe3JldHVybiBuZXcgdGhpcyh0KS5sbigpfWZ1bmN0aW9uIE1nKHQsZSl7cmV0dXJuIG5ldyB0aGlzKHQpLmxvZyhlKX1mdW5jdGlvbiBGZyh0KXtyZXR1cm4gbmV3IHRoaXModCkubG9nKDIpfWZ1bmN0aW9uIFRnKHQpe3JldHVybiBuZXcgdGhpcyh0KS5sb2coMTApfWZ1bmN0aW9uIE9nKCl7cmV0dXJuICRkKHRoaXMsYXJndW1lbnRzLCJsdCIpfWZ1bmN0aW9uIExnKCl7cmV0dXJuICRkKHRoaXMsYXJndW1lbnRzLCJndCIpfWZ1bmN0aW9uIFBnKHQsZSl7cmV0dXJuIG5ldyB0aGlzKHQpLm1vZChlKX1mdW5jdGlvbiBSZyh0LGUpe3JldHVybiBuZXcgdGhpcyh0KS5tdWwoZSl9ZnVuY3Rpb24gQmcodCxlKXtyZXR1cm4gbmV3IHRoaXModCkucG93KGUpfWZ1bmN0aW9uIGtnKHQpe3ZhciBlLG4scixpLG89MCxzPW5ldyB0aGlzKDEpLGE9W107aWYodm9pZCAwPT09dD90PXRoaXMucHJlY2lzaW9uOmpkKHQsMSx2ZCkscj1NYXRoLmNlaWwodC83KSx0aGlzLmNyeXB0bylpZihjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKWZvcihlPWNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQzMkFycmF5KHIpKTtvPHI7KShpPWVbb10pPj00MjllNz9lW29dPWNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQzMkFycmF5KDEpKVswXTphW28rK109aSUxZTc7ZWxzZXtpZighY3J5cHRvLnJhbmRvbUJ5dGVzKXRocm93IEVycm9yKEFkKTtmb3IoZT1jcnlwdG8ucmFuZG9tQnl0ZXMocio9NCk7bzxyOykoaT1lW29dKyhlW28rMV08PDgpKyhlW28rMl08PDE2KSsoKDEyNyZlW28rM10pPDwyNCkpPj0yMTRlNz9jcnlwdG8ucmFuZG9tQnl0ZXMoNCkuY29weShlLG8pOihhLnB1c2goaSUxZTcpLG8rPTQpO289ci80fWVsc2UgZm9yKDtvPHI7KWFbbysrXT0xZTcqTWF0aC5yYW5kb20oKXwwO2Zvcih0JT03LChyPWFbLS1vXSkmJnQmJihpPU1kKDEwLDctdCksYVtvXT0oci9pfDApKmkpOzA9PT1hW29dO28tLSlhLnBvcCgpO2lmKG88MCluPTAsYT1bMF07ZWxzZXtmb3Iobj0tMTswPT09YVswXTtuLT03KWEuc2hpZnQoKTtmb3Iocj0xLGk9YVswXTtpPj0xMDtpLz0xMClyKys7cjw3JiYobi09Ny1yKX1yZXR1cm4gcy5lPW4scy5kPWEsc31mdW5jdGlvbiB6Zyh0KXtyZXR1cm4gR2QodD1uZXcgdGhpcyh0KSx0LmUrMSx0aGlzLnJvdW5kaW5nKX1mdW5jdGlvbiBqZyh0KXtyZXR1cm4odD1uZXcgdGhpcyh0KSkuZD90LmRbMF0/dC5zOjAqdC5zOnQuc3x8TmFOfWZ1bmN0aW9uIFVnKHQpe3JldHVybiBuZXcgdGhpcyh0KS5zaW4oKX1mdW5jdGlvbiBxZyh0KXtyZXR1cm4gbmV3IHRoaXModCkuc2luaCgpfWZ1bmN0aW9uIFZnKHQpe3JldHVybiBuZXcgdGhpcyh0KS5zcXJ0KCl9ZnVuY3Rpb24gR2codCxlKXtyZXR1cm4gbmV3IHRoaXModCkuc3ViKGUpfWZ1bmN0aW9uIFlnKCl7dmFyIHQ9MCxlPWFyZ3VtZW50cyxuPW5ldyB0aGlzKGVbdF0pO2ZvcihEZD0hMTtuLnMmJisrdDxlLmxlbmd0aDspbj1uLnBsdXMoZVt0XSk7cmV0dXJuIERkPSEwLEdkKG4sdGhpcy5wcmVjaXNpb24sdGhpcy5yb3VuZGluZyl9ZnVuY3Rpb24gWGcodCl7cmV0dXJuIG5ldyB0aGlzKHQpLnRhbigpfWZ1bmN0aW9uIFdnKHQpe3JldHVybiBuZXcgdGhpcyh0KS50YW5oKCl9ZnVuY3Rpb24gSGcodCl7cmV0dXJuIEdkKHQ9bmV3IHRoaXModCksdC5lKzEsMSl9a2RbU3ltYm9sLmZvcigibm9kZWpzLnV0aWwuaW5zcGVjdC5jdXN0b20iKV09a2QudG9TdHJpbmcsa2RbU3ltYm9sLnRvU3RyaW5nVGFnXT0iRGVjaW1hbCI7dmFyIFpnPWtkLmNvbnN0cnVjdG9yPWZ1bmN0aW9uIHQoZSl7dmFyIG4scixpO2Z1bmN0aW9uIG8odCl7dmFyIGUsbixyLGk9dGhpcztpZighKGkgaW5zdGFuY2VvZiBvKSlyZXR1cm4gbmV3IG8odCk7aWYoaS5jb25zdHJ1Y3Rvcj1vLE5nKHQpKXJldHVybiBpLnM9dC5zLHZvaWQoRGQ/IXQuZHx8dC5lPm8ubWF4RT8oaS5lPU5hTixpLmQ9bnVsbCk6dC5lPG8ubWluRT8oaS5lPTAsaS5kPVswXSk6KGkuZT10LmUsaS5kPXQuZC5zbGljZSgpKTooaS5lPXQuZSxpLmQ9dC5kP3QuZC5zbGljZSgpOnQuZCkpO2lmKCJudW1iZXIiPT09KHI9dHlwZW9mIHQpKXtpZigwPT09dClyZXR1cm4gaS5zPTEvdDwwPy0xOjEsaS5lPTAsdm9pZChpLmQ9WzBdKTtpZih0PDA/KHQ9LXQsaS5zPS0xKTppLnM9MSx0PT09fn50JiZ0PDFlNyl7Zm9yKGU9MCxuPXQ7bj49MTA7bi89MTApZSsrO3JldHVybiB2b2lkKERkP2U+by5tYXhFPyhpLmU9TmFOLGkuZD1udWxsKTplPG8ubWluRT8oaS5lPTAsaS5kPVswXSk6KGkuZT1lLGkuZD1bdF0pOihpLmU9ZSxpLmQ9W3RdKSl9cmV0dXJuIDAqdCE9MD8odHx8KGkucz1OYU4pLGkuZT1OYU4sdm9pZChpLmQ9bnVsbCkpOnJnKGksdC50b1N0cmluZygpKX1pZigic3RyaW5nIiE9PXIpdGhyb3cgRXJyb3IoQ2QrdCk7cmV0dXJuIDQ1PT09KG49dC5jaGFyQ29kZUF0KDApKT8odD10LnNsaWNlKDEpLGkucz0tMSk6KDQzPT09biYmKHQ9dC5zbGljZSgxKSksaS5zPTEpLExkLnRlc3QodCk/cmcoaSx0KTpmdW5jdGlvbih0LGUpe3ZhciBuLHIsaSxvLHMsYSx1LGMsbDtpZihlLmluZGV4T2YoIl8iKT4tMSl7aWYoZT1lLnJlcGxhY2UoLyhcZClfKD89XGQpL2csIiQxIiksTGQudGVzdChlKSlyZXR1cm4gcmcodCxlKX1lbHNlIGlmKCJJbmZpbml0eSI9PT1lfHwiTmFOIj09PWUpcmV0dXJuK2V8fCh0LnM9TmFOKSx0LmU9TmFOLHQuZD1udWxsLHQ7aWYoVGQudGVzdChlKSluPTE2LGU9ZS50b0xvd2VyQ2FzZSgpO2Vsc2UgaWYoRmQudGVzdChlKSluPTI7ZWxzZXtpZighT2QudGVzdChlKSl0aHJvdyBFcnJvcihDZCtlKTtuPTh9Zm9yKChvPWUuc2VhcmNoKC9wL2kpKT4wPyh1PStlLnNsaWNlKG8rMSksZT1lLnN1YnN0cmluZygyLG8pKTplPWUuc2xpY2UoMikscz0obz1lLmluZGV4T2YoIi4iKSk+PTAscj10LmNvbnN0cnVjdG9yLHMmJihvPShhPShlPWUucmVwbGFjZSgiLiIsIiIpKS5sZW5ndGgpLW8saT1KZChyLG5ldyByKG4pLG8sMipvKSksbz1sPShjPXFkKGUsbixQZCkpLmxlbmd0aC0xOzA9PT1jW29dOy0tbyljLnBvcCgpO3JldHVybiBvPDA/bmV3IHIoMCp0LnMpOih0LmU9WGQoYyxsKSx0LmQ9YyxEZD0hMSxzJiYodD1WZCh0LGksNCphKSksdSYmKHQ9dC50aW1lcyhNYXRoLmFicyh1KTw1ND9NZCgyLHUpOlpnLnBvdygyLHUpKSksRGQ9ITAsdCl9KGksdCl9aWYoby5wcm90b3R5cGU9a2Qsby5ST1VORF9VUD0wLG8uUk9VTkRfRE9XTj0xLG8uUk9VTkRfQ0VJTD0yLG8uUk9VTkRfRkxPT1I9MyxvLlJPVU5EX0hBTEZfVVA9NCxvLlJPVU5EX0hBTEZfRE9XTj01LG8uUk9VTkRfSEFMRl9FVkVOPTYsby5ST1VORF9IQUxGX0NFSUw9NyxvLlJPVU5EX0hBTEZfRkxPT1I9OCxvLkVVQ0xJRD05LG8uY29uZmlnPW8uc2V0PXdnLG8uY2xvbmU9dCxvLmlzRGVjaW1hbD1OZyxvLmFicz1jZyxvLmFjb3M9bGcsby5hY29zaD1oZyxvLmFkZD1mZyxvLmFzaW49cGcsby5hc2luaD1kZyxvLmF0YW49Z2csby5hdGFuaD15ZyxvLmF0YW4yPW1nLG8uY2JydD12ZyxvLmNlaWw9X2csby5jbGFtcD14ZyxvLmNvcz1iZyxvLmNvc2g9RGcsby5kaXY9RWcsby5leHA9Q2csby5mbG9vcj1TZyxvLmh5cG90PUFnLG8ubG49SWcsby5sb2c9TWcsby5sb2cxMD1UZyxvLmxvZzI9Rmcsby5tYXg9T2csby5taW49TGcsby5tb2Q9UGcsby5tdWw9Umcsby5wb3c9Qmcsby5yYW5kb209a2csby5yb3VuZD16ZyxvLnNpZ249amcsby5zaW49VWcsby5zaW5oPXFnLG8uc3FydD1WZyxvLnN1Yj1HZyxvLnN1bT1ZZyxvLnRhbj1YZyxvLnRhbmg9V2csby50cnVuYz1IZyx2b2lkIDA9PT1lJiYoZT17fSksZSYmITAhPT1lLmRlZmF1bHRzKWZvcihpPVsicHJlY2lzaW9uIiwicm91bmRpbmciLCJ0b0V4cE5lZyIsInRvRXhwUG9zIiwibWF4RSIsIm1pbkUiLCJtb2R1bG8iLCJjcnlwdG8iXSxuPTA7bjxpLmxlbmd0aDspZS5oYXNPd25Qcm9wZXJ0eShyPWlbbisrXSl8fChlW3JdPXRoaXNbcl0pO3JldHVybiBvLmNvbmZpZyhlKSxvfShiZCk7eGQ9bmV3IFpnKHhkKSx3ZD1uZXcgWmcod2QpO3ZhciBLZz10ZCgiQmlnTnVtYmVyIixbIj9vbiIsImNvbmZpZyJdLCh0PT57dmFye29uOmUsY29uZmlnOm59PXQscj1aZy5jbG9uZSh7cHJlY2lzaW9uOm4ucHJlY2lzaW9uLG1vZHVsbzpaZy5FVUNMSUR9KTtyZXR1cm4gci5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShyLnByb3RvdHlwZSksci5wcm90b3R5cGUudHlwZT0iQmlnTnVtYmVyIixyLnByb3RvdHlwZS5pc0JpZ051bWJlcj0hMCxyLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm57bWF0aGpzOiJCaWdOdW1iZXIiLHZhbHVlOnRoaXMudG9TdHJpbmcoKX19LHIuZnJvbUpTT049ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyByKHQudmFsdWUpfSxlJiZlKCJjb25maWciLChmdW5jdGlvbih0LGUpe3QucHJlY2lzaW9uIT09ZS5wcmVjaXNpb24mJnIuY29uZmlnKHtwcmVjaXNpb246dC5wcmVjaXNpb259KX0pKSxyfSkse2lzQ2xhc3M6ITB9KTtjb25zdCBKZz1NYXRoLmNvc2h8fGZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLmFicyh0KTwxZS05PzEtdDouNSooTWF0aC5leHAodCkrTWF0aC5leHAoLXQpKX0sUWc9TWF0aC5zaW5ofHxmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5hYnModCk8MWUtOT90Oi41KihNYXRoLmV4cCh0KS1NYXRoLmV4cCgtdCkpfSwkZz1mdW5jdGlvbih0LGUpe3JldHVybih0PU1hdGguYWJzKHQpKTwoZT1NYXRoLmFicyhlKSkmJihbdCxlXT1bZSx0XSksdDwxZTg/TWF0aC5zcXJ0KHQqdCtlKmUpOihlLz10LHQqTWF0aC5zcXJ0KDErZSplKSl9LHR5PWZ1bmN0aW9uKCl7dGhyb3cgU3ludGF4RXJyb3IoIkludmFsaWQgUGFyYW0iKX07ZnVuY3Rpb24gZXkodCxlKXtjb25zdCBuPU1hdGguYWJzKHQpLHI9TWF0aC5hYnMoZSk7cmV0dXJuIDA9PT10P01hdGgubG9nKHIpOjA9PT1lP01hdGgubG9nKG4pOm48M2UzJiZyPDNlMz8uNSpNYXRoLmxvZyh0KnQrZSplKToodCo9LjUsZSo9LjUsLjUqTWF0aC5sb2codCp0K2UqZSkrTWF0aC5MTjIpfWNvbnN0IG55PXtyZTowLGltOjB9LHJ5PWZ1bmN0aW9uKHQsZSl7Y29uc3Qgbj1ueTtpZihudWxsPT10KW4ucmU9bi5pbT0wO2Vsc2UgaWYodm9pZCAwIT09ZSluLnJlPXQsbi5pbT1lO2Vsc2Ugc3dpdGNoKHR5cGVvZiB0KXtjYXNlIm9iamVjdCI6aWYoImltImluIHQmJiJyZSJpbiB0KW4ucmU9dC5yZSxuLmltPXQuaW07ZWxzZSBpZigiYWJzImluIHQmJiJhcmciaW4gdCl7aWYoIWlzRmluaXRlKHQuYWJzKSYmaXNGaW5pdGUodC5hcmcpKXJldHVybiBpeS5JTkZJTklUWTtuLnJlPXQuYWJzKk1hdGguY29zKHQuYXJnKSxuLmltPXQuYWJzKk1hdGguc2luKHQuYXJnKX1lbHNlIGlmKCJyImluIHQmJiJwaGkiaW4gdCl7aWYoIWlzRmluaXRlKHQucikmJmlzRmluaXRlKHQucGhpKSlyZXR1cm4gaXkuSU5GSU5JVFk7bi5yZT10LnIqTWF0aC5jb3ModC5waGkpLG4uaW09dC5yKk1hdGguc2luKHQucGhpKX1lbHNlIDI9PT10Lmxlbmd0aD8obi5yZT10WzBdLG4uaW09dFsxXSk6dHkoKTticmVhaztjYXNlInN0cmluZyI6bi5pbT1uLnJlPTA7Y29uc3QgZT10LnJlcGxhY2UoL18vZywiIikubWF0Y2goL1xkK1wuP1xkKmVbKy1dP1xkK3xcZCtcLj9cZCp8XC5cZCt8Li9nKTtsZXQgcj0xLGk9MDtudWxsPT09ZSYmdHkoKTtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrKyl7Y29uc3Qgbz1lW3RdOyIgIj09PW98fCJcdCI9PT1vfHwiXG4iPT09b3x8KCIrIj09PW8/cisrOiItIj09PW8/aSsrOiJpIj09PW98fCJJIj09PW8/KHIraT09PTAmJnR5KCksIiAiPT09ZVt0KzFdfHxpc05hTihlW3QrMV0pP24uaW0rPXBhcnNlRmxvYXQoKGklMj8iLSI6IiIpKyIxIik6KG4uaW0rPXBhcnNlRmxvYXQoKGklMj8iLSI6IiIpK2VbdCsxXSksdCsrKSxyPWk9MCk6KChyK2k9PT0wfHxpc05hTihvKSkmJnR5KCksImkiPT09ZVt0KzFdfHwiSSI9PT1lW3QrMV0/KG4uaW0rPXBhcnNlRmxvYXQoKGklMj8iLSI6IiIpK28pLHQrKyk6bi5yZSs9cGFyc2VGbG9hdCgoaSUyPyItIjoiIikrbykscj1pPTApKX1yK2k+MCYmdHkoKTticmVhaztjYXNlIm51bWJlciI6bi5pbT0wLG4ucmU9dDticmVhaztkZWZhdWx0OnR5KCl9cmV0dXJuIGlzTmFOKG4ucmUpfHxpc05hTihuLmltKSxufTtmdW5jdGlvbiBpeSh0LGUpe2lmKCEodGhpcyBpbnN0YW5jZW9mIGl5KSlyZXR1cm4gbmV3IGl5KHQsZSk7Y29uc3Qgbj1yeSh0LGUpO3RoaXMucmU9bi5yZSx0aGlzLmltPW4uaW19aXkucHJvdG90eXBlPXtyZTowLGltOjAsc2lnbjpmdW5jdGlvbigpe2NvbnN0IHQ9JGcodGhpcy5yZSx0aGlzLmltKTtyZXR1cm4gbmV3IGl5KHRoaXMucmUvdCx0aGlzLmltL3QpfSxhZGQ6ZnVuY3Rpb24odCxlKXtjb25zdCBuPXJ5KHQsZSkscj10aGlzLmlzSW5maW5pdGUoKSxpPSEoaXNGaW5pdGUobi5yZSkmJmlzRmluaXRlKG4uaW0pKTtyZXR1cm4gcnx8aT9yJiZpP2l5Lk5BTjppeS5JTkZJTklUWTpuZXcgaXkodGhpcy5yZStuLnJlLHRoaXMuaW0rbi5pbSl9LHN1YjpmdW5jdGlvbih0LGUpe2NvbnN0IG49cnkodCxlKSxyPXRoaXMuaXNJbmZpbml0ZSgpLGk9IShpc0Zpbml0ZShuLnJlKSYmaXNGaW5pdGUobi5pbSkpO3JldHVybiByfHxpP3ImJmk/aXkuTkFOOml5LklORklOSVRZOm5ldyBpeSh0aGlzLnJlLW4ucmUsdGhpcy5pbS1uLmltKX0sbXVsOmZ1bmN0aW9uKHQsZSl7Y29uc3Qgbj1yeSh0LGUpLHI9dGhpcy5pc0luZmluaXRlKCksaT0hKGlzRmluaXRlKG4ucmUpJiZpc0Zpbml0ZShuLmltKSksbz0wPT09dGhpcy5yZSYmMD09PXRoaXMuaW0scz0wPT09bi5yZSYmMD09PW4uaW07cmV0dXJuIHImJnN8fGkmJm8/aXkuTkFOOnJ8fGk/aXkuSU5GSU5JVFk6MD09PW4uaW0mJjA9PT10aGlzLmltP25ldyBpeSh0aGlzLnJlKm4ucmUsMCk6bmV3IGl5KHRoaXMucmUqbi5yZS10aGlzLmltKm4uaW0sdGhpcy5yZSpuLmltK3RoaXMuaW0qbi5yZSl9LGRpdjpmdW5jdGlvbih0LGUpe2NvbnN0IG49cnkodCxlKSxyPXRoaXMuaXNJbmZpbml0ZSgpLGk9IShpc0Zpbml0ZShuLnJlKSYmaXNGaW5pdGUobi5pbSkpLG89MD09PXRoaXMucmUmJjA9PT10aGlzLmltLHM9MD09PW4ucmUmJjA9PT1uLmltO2lmKG8mJnN8fHImJmkpcmV0dXJuIGl5Lk5BTjtpZihzfHxyKXJldHVybiBpeS5JTkZJTklUWTtpZihvfHxpKXJldHVybiBpeS5aRVJPO2lmKDA9PT1uLmltKXJldHVybiBuZXcgaXkodGhpcy5yZS9uLnJlLHRoaXMuaW0vbi5yZSk7aWYoTWF0aC5hYnMobi5yZSk8TWF0aC5hYnMobi5pbSkpe2NvbnN0IHQ9bi5yZS9uLmltLGU9bi5yZSp0K24uaW07cmV0dXJuIG5ldyBpeSgodGhpcy5yZSp0K3RoaXMuaW0pL2UsKHRoaXMuaW0qdC10aGlzLnJlKS9lKX17Y29uc3QgdD1uLmltL24ucmUsZT1uLmltKnQrbi5yZTtyZXR1cm4gbmV3IGl5KCh0aGlzLnJlK3RoaXMuaW0qdCkvZSwodGhpcy5pbS10aGlzLnJlKnQpL2UpfX0scG93OmZ1bmN0aW9uKHQsZSl7Y29uc3Qgbj1yeSh0LGUpLHI9MD09PXRoaXMucmUmJjA9PT10aGlzLmltO2lmKDA9PT1uLnJlJiYwPT09bi5pbSlyZXR1cm4gaXkuT05FO2lmKDA9PT1uLmltKXtpZigwPT09dGhpcy5pbSYmdGhpcy5yZT4wKXJldHVybiBuZXcgaXkoTWF0aC5wb3codGhpcy5yZSxuLnJlKSwwKTtpZigwPT09dGhpcy5yZSlzd2l0Y2goKG4ucmUlNCs0KSU0KXtjYXNlIDA6cmV0dXJuIG5ldyBpeShNYXRoLnBvdyh0aGlzLmltLG4ucmUpLDApO2Nhc2UgMTpyZXR1cm4gbmV3IGl5KDAsTWF0aC5wb3codGhpcy5pbSxuLnJlKSk7Y2FzZSAyOnJldHVybiBuZXcgaXkoLU1hdGgucG93KHRoaXMuaW0sbi5yZSksMCk7Y2FzZSAzOnJldHVybiBuZXcgaXkoMCwtTWF0aC5wb3codGhpcy5pbSxuLnJlKSl9fWlmKHImJm4ucmU+MClyZXR1cm4gaXkuWkVSTztjb25zdCBpPU1hdGguYXRhbjIodGhpcy5pbSx0aGlzLnJlKSxvPWV5KHRoaXMucmUsdGhpcy5pbSk7bGV0IHM9TWF0aC5leHAobi5yZSpvLW4uaW0qaSksYT1uLmltKm8rbi5yZSppO3JldHVybiBuZXcgaXkocypNYXRoLmNvcyhhKSxzKk1hdGguc2luKGEpKX0sc3FydDpmdW5jdGlvbigpe2NvbnN0IHQ9dGhpcy5yZSxlPXRoaXMuaW07aWYoMD09PWUpcmV0dXJuIHQ+PTA/bmV3IGl5KE1hdGguc3FydCh0KSwwKTpuZXcgaXkoMCxNYXRoLnNxcnQoLXQpKTtjb25zdCBuPSRnKHQsZSk7bGV0IHI9TWF0aC5zcXJ0KC41KihuK01hdGguYWJzKHQpKSksaT1NYXRoLmFicyhlKS8oMipyKTtyZXR1cm4gdD49MD9uZXcgaXkocixlPDA/LWk6aSk6bmV3IGl5KGksZTwwPy1yOnIpfSxleHA6ZnVuY3Rpb24oKXtjb25zdCB0PU1hdGguZXhwKHRoaXMucmUpO3JldHVybiAwPT09dGhpcy5pbT9uZXcgaXkodCwwKTpuZXcgaXkodCpNYXRoLmNvcyh0aGlzLmltKSx0Kk1hdGguc2luKHRoaXMuaW0pKX0sZXhwbTE6ZnVuY3Rpb24oKXtjb25zdCB0PXRoaXMucmUsZT10aGlzLmltO3JldHVybiBuZXcgaXkoTWF0aC5leHBtMSh0KSpNYXRoLmNvcyhlKStmdW5jdGlvbih0KXtjb25zdCBlPU1hdGguUEkvNDtpZigtZT50fHx0PmUpcmV0dXJuIE1hdGguY29zKHQpLTE7Y29uc3Qgbj10KnQ7cmV0dXJuIG4qKG4qKG4qKG4qKG4qKG4qKG4qKG4vMjA5MjI3ODk4ODhlMy0xLzg3MTc4MjkxMjAwKSsxLzQ3OTAwMTYwMCktMS8zNjI4ODAwKSsxLzQwMzIwKS0xLzcyMCkrMS8yNCktLjUpfShlKSxNYXRoLmV4cCh0KSpNYXRoLnNpbihlKSl9LGxvZzpmdW5jdGlvbigpe2NvbnN0IHQ9dGhpcy5yZSxlPXRoaXMuaW07cmV0dXJuIDA9PT1lJiZ0PjA/bmV3IGl5KE1hdGgubG9nKHQpLDApOm5ldyBpeShleSh0LGUpLE1hdGguYXRhbjIoZSx0KSl9LGFiczpmdW5jdGlvbigpe3JldHVybiAkZyh0aGlzLnJlLHRoaXMuaW0pfSxhcmc6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5hdGFuMih0aGlzLmltLHRoaXMucmUpfSxzaW46ZnVuY3Rpb24oKXtjb25zdCB0PXRoaXMucmUsZT10aGlzLmltO3JldHVybiBuZXcgaXkoTWF0aC5zaW4odCkqSmcoZSksTWF0aC5jb3ModCkqUWcoZSkpfSxjb3M6ZnVuY3Rpb24oKXtjb25zdCB0PXRoaXMucmUsZT10aGlzLmltO3JldHVybiBuZXcgaXkoTWF0aC5jb3ModCkqSmcoZSksLU1hdGguc2luKHQpKlFnKGUpKX0sdGFuOmZ1bmN0aW9uKCl7Y29uc3QgdD0yKnRoaXMucmUsZT0yKnRoaXMuaW0sbj1NYXRoLmNvcyh0KStKZyhlKTtyZXR1cm4gbmV3IGl5KE1hdGguc2luKHQpL24sUWcoZSkvbil9LGNvdDpmdW5jdGlvbigpe2NvbnN0IHQ9Mip0aGlzLnJlLGU9Mip0aGlzLmltLG49TWF0aC5jb3ModCktSmcoZSk7cmV0dXJuIG5ldyBpeSgtTWF0aC5zaW4odCkvbixRZyhlKS9uKX0sc2VjOmZ1bmN0aW9uKCl7Y29uc3QgdD10aGlzLnJlLGU9dGhpcy5pbSxuPS41KkpnKDIqZSkrLjUqTWF0aC5jb3MoMip0KTtyZXR1cm4gbmV3IGl5KE1hdGguY29zKHQpKkpnKGUpL24sTWF0aC5zaW4odCkqUWcoZSkvbil9LGNzYzpmdW5jdGlvbigpe2NvbnN0IHQ9dGhpcy5yZSxlPXRoaXMuaW0sbj0uNSpKZygyKmUpLS41Kk1hdGguY29zKDIqdCk7cmV0dXJuIG5ldyBpeShNYXRoLnNpbih0KSpKZyhlKS9uLC1NYXRoLmNvcyh0KSpRZyhlKS9uKX0sYXNpbjpmdW5jdGlvbigpe2NvbnN0IHQ9dGhpcy5yZSxlPXRoaXMuaW0sbj1uZXcgaXkoZSplLXQqdCsxLC0yKnQqZSkuc3FydCgpLHI9bmV3IGl5KG4ucmUtZSxuLmltK3QpLmxvZygpO3JldHVybiBuZXcgaXkoci5pbSwtci5yZSl9LGFjb3M6ZnVuY3Rpb24oKXtjb25zdCB0PXRoaXMucmUsZT10aGlzLmltLG49bmV3IGl5KGUqZS10KnQrMSwtMip0KmUpLnNxcnQoKSxyPW5ldyBpeShuLnJlLWUsbi5pbSt0KS5sb2coKTtyZXR1cm4gbmV3IGl5KE1hdGguUEkvMi1yLmltLHIucmUpfSxhdGFuOmZ1bmN0aW9uKCl7Y29uc3QgdD10aGlzLnJlLGU9dGhpcy5pbTtpZigwPT09dCl7aWYoMT09PWUpcmV0dXJuIG5ldyBpeSgwLDEvMCk7aWYoLTE9PT1lKXJldHVybiBuZXcgaXkoMCwtMS8wKX1jb25zdCBuPXQqdCsoMS1lKSooMS1lKSxyPW5ldyBpeSgoMS1lKmUtdCp0KS9uLC0yKnQvbikubG9nKCk7cmV0dXJuIG5ldyBpeSgtLjUqci5pbSwuNSpyLnJlKX0sYWNvdDpmdW5jdGlvbigpe2NvbnN0IHQ9dGhpcy5yZSxlPXRoaXMuaW07aWYoMD09PWUpcmV0dXJuIG5ldyBpeShNYXRoLmF0YW4yKDEsdCksMCk7Y29uc3Qgbj10KnQrZSplO3JldHVybiAwIT09bj9uZXcgaXkodC9uLC1lL24pLmF0YW4oKTpuZXcgaXkoMCE9PXQ/dC8wOjAsMCE9PWU/LWUvMDowKS5hdGFuKCl9LGFzZWM6ZnVuY3Rpb24oKXtjb25zdCB0PXRoaXMucmUsZT10aGlzLmltO2lmKDA9PT10JiYwPT09ZSlyZXR1cm4gbmV3IGl5KDAsMS8wKTtjb25zdCBuPXQqdCtlKmU7cmV0dXJuIDAhPT1uP25ldyBpeSh0L24sLWUvbikuYWNvcygpOm5ldyBpeSgwIT09dD90LzA6MCwwIT09ZT8tZS8wOjApLmFjb3MoKX0sYWNzYzpmdW5jdGlvbigpe2NvbnN0IHQ9dGhpcy5yZSxlPXRoaXMuaW07aWYoMD09PXQmJjA9PT1lKXJldHVybiBuZXcgaXkoTWF0aC5QSS8yLDEvMCk7Y29uc3Qgbj10KnQrZSplO3JldHVybiAwIT09bj9uZXcgaXkodC9uLC1lL24pLmFzaW4oKTpuZXcgaXkoMCE9PXQ/dC8wOjAsMCE9PWU/LWUvMDowKS5hc2luKCl9LHNpbmg6ZnVuY3Rpb24oKXtjb25zdCB0PXRoaXMucmUsZT10aGlzLmltO3JldHVybiBuZXcgaXkoUWcodCkqTWF0aC5jb3MoZSksSmcodCkqTWF0aC5zaW4oZSkpfSxjb3NoOmZ1bmN0aW9uKCl7Y29uc3QgdD10aGlzLnJlLGU9dGhpcy5pbTtyZXR1cm4gbmV3IGl5KEpnKHQpKk1hdGguY29zKGUpLFFnKHQpKk1hdGguc2luKGUpKX0sdGFuaDpmdW5jdGlvbigpe2NvbnN0IHQ9Mip0aGlzLnJlLGU9Mip0aGlzLmltLG49SmcodCkrTWF0aC5jb3MoZSk7cmV0dXJuIG5ldyBpeShRZyh0KS9uLE1hdGguc2luKGUpL24pfSxjb3RoOmZ1bmN0aW9uKCl7Y29uc3QgdD0yKnRoaXMucmUsZT0yKnRoaXMuaW0sbj1KZyh0KS1NYXRoLmNvcyhlKTtyZXR1cm4gbmV3IGl5KFFnKHQpL24sLU1hdGguc2luKGUpL24pfSxjc2NoOmZ1bmN0aW9uKCl7Y29uc3QgdD10aGlzLnJlLGU9dGhpcy5pbSxuPU1hdGguY29zKDIqZSktSmcoMip0KTtyZXR1cm4gbmV3IGl5KC0yKlFnKHQpKk1hdGguY29zKGUpL24sMipKZyh0KSpNYXRoLnNpbihlKS9uKX0sc2VjaDpmdW5jdGlvbigpe2NvbnN0IHQ9dGhpcy5yZSxlPXRoaXMuaW0sbj1NYXRoLmNvcygyKmUpK0pnKDIqdCk7cmV0dXJuIG5ldyBpeSgyKkpnKHQpKk1hdGguY29zKGUpL24sLTIqUWcodCkqTWF0aC5zaW4oZSkvbil9LGFzaW5oOmZ1bmN0aW9uKCl7bGV0IHQ9dGhpcy5pbTt0aGlzLmltPS10aGlzLnJlLHRoaXMucmU9dDtjb25zdCBlPXRoaXMuYXNpbigpO3JldHVybiB0aGlzLnJlPS10aGlzLmltLHRoaXMuaW09dCx0PWUucmUsZS5yZT0tZS5pbSxlLmltPXQsZX0sYWNvc2g6ZnVuY3Rpb24oKXtjb25zdCB0PXRoaXMuYWNvcygpO2lmKHQuaW08PTApe2NvbnN0IGU9dC5yZTt0LnJlPS10LmltLHQuaW09ZX1lbHNle2NvbnN0IGU9dC5pbTt0LmltPS10LnJlLHQucmU9ZX1yZXR1cm4gdH0sYXRhbmg6ZnVuY3Rpb24oKXtjb25zdCB0PXRoaXMucmUsZT10aGlzLmltLG49dD4xJiYwPT09ZSxyPTEtdCxpPTErdCxvPXIqcitlKmUscz0wIT09bz9uZXcgaXkoKGkqci1lKmUpL28sKGUqcitpKmUpL28pOm5ldyBpeSgtMSE9PXQ/dC8wOjAsMCE9PWU/ZS8wOjApLGE9cy5yZTtyZXR1cm4gcy5yZT1leShzLnJlLHMuaW0pLzIscy5pbT1NYXRoLmF0YW4yKHMuaW0sYSkvMixuJiYocy5pbT0tcy5pbSksc30sYWNvdGg6ZnVuY3Rpb24oKXtjb25zdCB0PXRoaXMucmUsZT10aGlzLmltO2lmKDA9PT10JiYwPT09ZSlyZXR1cm4gbmV3IGl5KDAsTWF0aC5QSS8yKTtjb25zdCBuPXQqdCtlKmU7cmV0dXJuIDAhPT1uP25ldyBpeSh0L24sLWUvbikuYXRhbmgoKTpuZXcgaXkoMCE9PXQ/dC8wOjAsMCE9PWU/LWUvMDowKS5hdGFuaCgpfSxhY3NjaDpmdW5jdGlvbigpe2NvbnN0IHQ9dGhpcy5yZSxlPXRoaXMuaW07aWYoMD09PWUpcmV0dXJuIG5ldyBpeSgwIT09dD9NYXRoLmxvZyh0K01hdGguc3FydCh0KnQrMSkpOjEvMCwwKTtjb25zdCBuPXQqdCtlKmU7cmV0dXJuIDAhPT1uP25ldyBpeSh0L24sLWUvbikuYXNpbmgoKTpuZXcgaXkoMCE9PXQ/dC8wOjAsMCE9PWU/LWUvMDowKS5hc2luaCgpfSxhc2VjaDpmdW5jdGlvbigpe2NvbnN0IHQ9dGhpcy5yZSxlPXRoaXMuaW07aWYodGhpcy5pc1plcm8oKSlyZXR1cm4gaXkuSU5GSU5JVFk7Y29uc3Qgbj10KnQrZSplO3JldHVybiAwIT09bj9uZXcgaXkodC9uLC1lL24pLmFjb3NoKCk6bmV3IGl5KDAhPT10P3QvMDowLDAhPT1lPy1lLzA6MCkuYWNvc2goKX0saW52ZXJzZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNaZXJvKCkpcmV0dXJuIGl5LklORklOSVRZO2lmKHRoaXMuaXNJbmZpbml0ZSgpKXJldHVybiBpeS5aRVJPO2NvbnN0IHQ9dGhpcy5yZSxlPXRoaXMuaW0sbj10KnQrZSplO3JldHVybiBuZXcgaXkodC9uLC1lL24pfSxjb25qdWdhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGl5KHRoaXMucmUsLXRoaXMuaW0pfSxuZWc6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGl5KC10aGlzLnJlLC10aGlzLmltKX0sY2VpbDpmdW5jdGlvbih0KXtyZXR1cm4gdD1NYXRoLnBvdygxMCx0fHwwKSxuZXcgaXkoTWF0aC5jZWlsKHRoaXMucmUqdCkvdCxNYXRoLmNlaWwodGhpcy5pbSp0KS90KX0sZmxvb3I6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9TWF0aC5wb3coMTAsdHx8MCksbmV3IGl5KE1hdGguZmxvb3IodGhpcy5yZSp0KS90LE1hdGguZmxvb3IodGhpcy5pbSp0KS90KX0scm91bmQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9TWF0aC5wb3coMTAsdHx8MCksbmV3IGl5KE1hdGgucm91bmQodGhpcy5yZSp0KS90LE1hdGgucm91bmQodGhpcy5pbSp0KS90KX0sZXF1YWxzOmZ1bmN0aW9uKHQsZSl7Y29uc3Qgbj1yeSh0LGUpO3JldHVybiBNYXRoLmFicyhuLnJlLXRoaXMucmUpPD1peS5FUFNJTE9OJiZNYXRoLmFicyhuLmltLXRoaXMuaW0pPD1peS5FUFNJTE9OfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybiBuZXcgaXkodGhpcy5yZSx0aGlzLmltKX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXtsZXQgdD10aGlzLnJlLGU9dGhpcy5pbSxuPSIiO3JldHVybiB0aGlzLmlzTmFOKCk/Ik5hTiI6dGhpcy5pc0luZmluaXRlKCk/IkluZmluaXR5IjooTWF0aC5hYnModCk8aXkuRVBTSUxPTiYmKHQ9MCksTWF0aC5hYnMoZSk8aXkuRVBTSUxPTiYmKGU9MCksMD09PWU/bit0OigwIT09dD8obis9dCxuKz0iICIsZTwwPyhlPS1lLG4rPSItIik6bis9IisiLG4rPSIgIik6ZTwwJiYoZT0tZSxuKz0iLSIpLDEhPT1lJiYobis9ZSksbisiaSIpKX0sdG9WZWN0b3I6ZnVuY3Rpb24oKXtyZXR1cm5bdGhpcy5yZSx0aGlzLmltXX0sdmFsdWVPZjpmdW5jdGlvbigpe3JldHVybiAwPT09dGhpcy5pbT90aGlzLnJlOm51bGx9LGlzTmFOOmZ1bmN0aW9uKCl7cmV0dXJuIGlzTmFOKHRoaXMucmUpfHxpc05hTih0aGlzLmltKX0saXNaZXJvOmZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLmltJiYwPT09dGhpcy5yZX0saXNGaW5pdGU6ZnVuY3Rpb24oKXtyZXR1cm4gaXNGaW5pdGUodGhpcy5yZSkmJmlzRmluaXRlKHRoaXMuaW0pfSxpc0luZmluaXRlOmZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuaXNGaW5pdGUoKX19LGl5LlpFUk89bmV3IGl5KDAsMCksaXkuT05FPW5ldyBpeSgxLDApLGl5Lkk9bmV3IGl5KDAsMSksaXkuUEk9bmV3IGl5KE1hdGguUEksMCksaXkuRT1uZXcgaXkoTWF0aC5FLDApLGl5LklORklOSVRZPW5ldyBpeSgxLzAsMS8wKSxpeS5OQU49bmV3IGl5KE5hTixOYU4pLGl5LkVQU0lMT049MWUtMTU7dmFyIG95PXRkKCJDb21wbGV4IixbXSwoKCk9PihPYmplY3QuZGVmaW5lUHJvcGVydHkoaXksIm5hbWUiLHt2YWx1ZToiQ29tcGxleCJ9KSxpeS5wcm90b3R5cGUuY29uc3RydWN0b3I9aXksaXkucHJvdG90eXBlLnR5cGU9IkNvbXBsZXgiLGl5LnByb3RvdHlwZS5pc0NvbXBsZXg9ITAsaXkucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybnttYXRoanM6IkNvbXBsZXgiLHJlOnRoaXMucmUsaW06dGhpcy5pbX19LGl5LnByb3RvdHlwZS50b1BvbGFyPWZ1bmN0aW9uKCl7cmV0dXJue3I6dGhpcy5hYnMoKSxwaGk6dGhpcy5hcmcoKX19LGl5LnByb3RvdHlwZS5mb3JtYXQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5pbSxuPXRoaXMucmUscj1OcCh0aGlzLnJlLHQpLGk9TnAodGhpcy5pbSx0KSxvPU1mKHQpP3Q6dD90LnByZWNpc2lvbjpudWxsO2lmKG51bGwhPT1vKXt2YXIgcz1NYXRoLnBvdygxMCwtbyk7TWF0aC5hYnMobi9lKTxzJiYobj0wKSxNYXRoLmFicyhlL24pPHMmJihlPTApfXJldHVybiAwPT09ZT9yOjA9PT1uPzE9PT1lPyJpIjotMT09PWU/Ii1pIjppKyJpIjplPDA/LTE9PT1lP3IrIiAtIGkiOnIrIiAtICIraS5zdWJzdHJpbmcoMSkrImkiOjE9PT1lP3IrIiArIGkiOnIrIiArICIraSsiaSJ9LGl5LmZyb21Qb2xhcj1mdW5jdGlvbih0KXtzd2l0Y2goYXJndW1lbnRzLmxlbmd0aCl7Y2FzZSAxOnZhciBlPWFyZ3VtZW50c1swXTtpZigib2JqZWN0Ij09dHlwZW9mIGUpcmV0dXJuIGl5KGUpO3Rocm93IG5ldyBUeXBlRXJyb3IoIklucHV0IGhhcyB0byBiZSBhbiBvYmplY3Qgd2l0aCByIGFuZCBwaGkga2V5cy4iKTtjYXNlIDI6dmFyIG49YXJndW1lbnRzWzBdLHI9YXJndW1lbnRzWzFdO2lmKE1mKG4pKXtpZihMZihyKSYmci5oYXNCYXNlKCJBTkdMRSIpJiYocj1yLnRvTnVtYmVyKCJyYWQiKSksTWYocikpcmV0dXJuIG5ldyBpeSh7cjpuLHBoaTpyfSk7dGhyb3cgbmV3IFR5cGVFcnJvcigiUGhpIGlzIG5vdCBhIG51bWJlciBub3IgYW4gYW5nbGUgdW5pdC4iKX10aHJvdyBuZXcgVHlwZUVycm9yKCJSYWRpdXMgciBpcyBub3QgYSBudW1iZXIuIik7ZGVmYXVsdDp0aHJvdyBuZXcgU3ludGF4RXJyb3IoIldyb25nIG51bWJlciBvZiBhcmd1bWVudHMgaW4gZnVuY3Rpb24gZnJvbVBvbGFyIil9fSxpeS5wcm90b3R5cGUudmFsdWVPZj1peS5wcm90b3R5cGUudG9TdHJpbmcsaXkuZnJvbUpTT049ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBpeSh0KX0saXkuY29tcGFyZT1mdW5jdGlvbih0LGUpe3JldHVybiB0LnJlPmUucmU/MTp0LnJlPGUucmU/LTE6dC5pbT5lLmltPzE6dC5pbTxlLmltPy0xOjB9LGl5KSkse2lzQ2xhc3M6ITB9KSxzeT17czoxLG46MCxkOjF9O2Z1bmN0aW9uIGF5KHQsZSl7aWYoaXNOYU4odD1wYXJzZUludCh0LDEwKSkpdGhyb3cgZHkoKTtyZXR1cm4gdCplfWZ1bmN0aW9uIHV5KHQsZSl7aWYoMD09PWUpdGhyb3cgcHkoKTt2YXIgbj1PYmplY3QuY3JlYXRlKGZ5LnByb3RvdHlwZSk7bi5zPXQ8MD8tMToxO3ZhciByPWh5KHQ9dDwwPy10OnQsZSk7cmV0dXJuIG4ubj10L3Isbi5kPWUvcixufWZ1bmN0aW9uIGN5KHQpe2Zvcih2YXIgZT17fSxuPXQscj0yLGk9NDtpPD1uOyl7Zm9yKDtuJXI9PTA7KW4vPXIsZVtyXT0oZVtyXXx8MCkrMTtpKz0xKzIqcisrfXJldHVybiBuIT09dD9uPjEmJihlW25dPShlW25dfHwwKSsxKTplW3RdPShlW3RdfHwwKSsxLGV9dmFyIGx5PWZ1bmN0aW9uKHQsZSl7dmFyIG4scj0wLGk9MSxvPTEscz0wLGE9MCx1PTAsYz0xLGw9MSxoPTAsZj0xLHA9MSxkPTEsZz0xZTc7aWYobnVsbCE9dClpZih2b2lkIDAhPT1lKXtpZihvPShyPXQpKihpPWUpLHIlMSE9MHx8aSUxIT0wKXRocm93IGd5KCl9ZWxzZSBzd2l0Y2godHlwZW9mIHQpe2Nhc2Uib2JqZWN0IjppZigiZCJpbiB0JiYibiJpbiB0KXI9dC5uLGk9dC5kLCJzImluIHQmJihyKj10LnMpO2Vsc2V7aWYoISgwIGluIHQpKXRocm93IGR5KCk7cj10WzBdLDEgaW4gdCYmKGk9dFsxXSl9bz1yKmk7YnJlYWs7Y2FzZSJudW1iZXIiOmlmKHQ8MCYmKG89dCx0PS10KSx0JTE9PTApcj10O2Vsc2UgaWYodD4wKXtmb3IodD49MSYmKHQvPWw9TWF0aC5wb3coMTAsTWF0aC5mbG9vcigxK01hdGgubG9nKHQpL01hdGguTE4xMCkpKTtmPD1nJiZkPD1nOyl7aWYodD09PShuPShoK3ApLyhmK2QpKSl7ZitkPD1nPyhyPWgrcCxpPWYrZCk6ZD5mPyhyPXAsaT1kKToocj1oLGk9Zik7YnJlYWt9dD5uPyhoKz1wLGYrPWQpOihwKz1oLGQrPWYpLGY+Zz8ocj1wLGk9ZCk6KHI9aCxpPWYpfXIqPWx9ZWxzZShpc05hTih0KXx8aXNOYU4oZSkpJiYoaT1yPU5hTik7YnJlYWs7Y2FzZSJzdHJpbmciOmlmKG51bGw9PT0oZj10Lm1hdGNoKC9cZCt8Li9nKSkpdGhyb3cgZHkoKTtpZigiLSI9PT1mW2hdPyhvPS0xLGgrKyk6IisiPT09ZltoXSYmaCsrLGYubGVuZ3RoPT09aCsxP2E9YXkoZltoKytdLG8pOiIuIj09PWZbaCsxXXx8Ii4iPT09ZltoXT8oIi4iIT09ZltoXSYmKHM9YXkoZltoKytdLG8pKSwoKytoKzE9PT1mLmxlbmd0aHx8IigiPT09ZltoKzFdJiYiKSI9PT1mW2grM118fCInIj09PWZbaCsxXSYmIiciPT09ZltoKzNdKSYmKGE9YXkoZltoXSxvKSxjPU1hdGgucG93KDEwLGZbaF0ubGVuZ3RoKSxoKyspLCgiKCI9PT1mW2hdJiYiKSI9PT1mW2grMl18fCInIj09PWZbaF0mJiInIj09PWZbaCsyXSkmJih1PWF5KGZbaCsxXSxvKSxsPU1hdGgucG93KDEwLGZbaCsxXS5sZW5ndGgpLTEsaCs9MykpOiIvIj09PWZbaCsxXXx8IjoiPT09ZltoKzFdPyhhPWF5KGZbaF0sbyksYz1heShmW2grMl0sMSksaCs9Myk6Ii8iPT09ZltoKzNdJiYiICI9PT1mW2grMV0mJihzPWF5KGZbaF0sbyksYT1heShmW2grMl0sbyksYz1heShmW2grNF0sMSksaCs9NSksZi5sZW5ndGg8PWgpe289cj11KyhpPWMqbCkqcytsKmE7YnJlYWt9ZGVmYXVsdDp0aHJvdyBkeSgpfWlmKDA9PT1pKXRocm93IHB5KCk7c3kucz1vPDA/LTE6MSxzeS5uPU1hdGguYWJzKHIpLHN5LmQ9TWF0aC5hYnMoaSl9O2Z1bmN0aW9uIGh5KHQsZSl7aWYoIXQpcmV0dXJuIGU7aWYoIWUpcmV0dXJuIHQ7Zm9yKDs7KXtpZighKHQlPWUpKXJldHVybiBlO2lmKCEoZSU9dCkpcmV0dXJuIHR9fWZ1bmN0aW9uIGZ5KHQsZSl7aWYobHkodCxlKSwhKHRoaXMgaW5zdGFuY2VvZiBmeSkpcmV0dXJuIHV5KHN5LnMqc3kubixzeS5kKTt0PWh5KHN5LmQsc3kubiksdGhpcy5zPXN5LnMsdGhpcy5uPXN5Lm4vdCx0aGlzLmQ9c3kuZC90fXZhciBweT1mdW5jdGlvbigpe3JldHVybiBuZXcgRXJyb3IoIkRpdmlzaW9uIGJ5IFplcm8iKX0sZHk9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEVycm9yKCJJbnZhbGlkIGFyZ3VtZW50Iil9LGd5PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBFcnJvcigiUGFyYW1ldGVycyBtdXN0IGJlIGludGVnZXIiKX07ZnkucHJvdG90eXBlPXtzOjEsbjowLGQ6MSxhYnM6ZnVuY3Rpb24oKXtyZXR1cm4gdXkodGhpcy5uLHRoaXMuZCl9LG5lZzpmdW5jdGlvbigpe3JldHVybiB1eSgtdGhpcy5zKnRoaXMubix0aGlzLmQpfSxhZGQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gbHkodCxlKSx1eSh0aGlzLnMqdGhpcy5uKnN5LmQrc3kucyp0aGlzLmQqc3kubix0aGlzLmQqc3kuZCl9LHN1YjpmdW5jdGlvbih0LGUpe3JldHVybiBseSh0LGUpLHV5KHRoaXMucyp0aGlzLm4qc3kuZC1zeS5zKnRoaXMuZCpzeS5uLHRoaXMuZCpzeS5kKX0sbXVsOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGx5KHQsZSksdXkodGhpcy5zKnN5LnMqdGhpcy5uKnN5Lm4sdGhpcy5kKnN5LmQpfSxkaXY6ZnVuY3Rpb24odCxlKXtyZXR1cm4gbHkodCxlKSx1eSh0aGlzLnMqc3kucyp0aGlzLm4qc3kuZCx0aGlzLmQqc3kubil9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuIHV5KHRoaXMucyp0aGlzLm4sdGhpcy5kKX0sbW9kOmZ1bmN0aW9uKHQsZSl7aWYoaXNOYU4odGhpcy5uKXx8aXNOYU4odGhpcy5kKSlyZXR1cm4gbmV3IGZ5KE5hTik7aWYodm9pZCAwPT09dClyZXR1cm4gdXkodGhpcy5zKnRoaXMubiV0aGlzLmQsMSk7aWYobHkodCxlKSwwPT09c3kubiYmMD09PXRoaXMuZCl0aHJvdyBweSgpO3JldHVybiB1eSh0aGlzLnMqKHN5LmQqdGhpcy5uKSUoc3kubip0aGlzLmQpLHN5LmQqdGhpcy5kKX0sZ2NkOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGx5KHQsZSksdXkoaHkoc3kubix0aGlzLm4pKmh5KHN5LmQsdGhpcy5kKSxzeS5kKnRoaXMuZCl9LGxjbTpmdW5jdGlvbih0LGUpe3JldHVybiBseSh0LGUpLDA9PT1zeS5uJiYwPT09dGhpcy5uP3V5KDAsMSk6dXkoc3kubip0aGlzLm4saHkoc3kubix0aGlzLm4pKmh5KHN5LmQsdGhpcy5kKSl9LGNlaWw6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9TWF0aC5wb3coMTAsdHx8MCksaXNOYU4odGhpcy5uKXx8aXNOYU4odGhpcy5kKT9uZXcgZnkoTmFOKTp1eShNYXRoLmNlaWwodCp0aGlzLnMqdGhpcy5uL3RoaXMuZCksdCl9LGZsb29yOmZ1bmN0aW9uKHQpe3JldHVybiB0PU1hdGgucG93KDEwLHR8fDApLGlzTmFOKHRoaXMubil8fGlzTmFOKHRoaXMuZCk/bmV3IGZ5KE5hTik6dXkoTWF0aC5mbG9vcih0KnRoaXMucyp0aGlzLm4vdGhpcy5kKSx0KX0scm91bmQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9TWF0aC5wb3coMTAsdHx8MCksaXNOYU4odGhpcy5uKXx8aXNOYU4odGhpcy5kKT9uZXcgZnkoTmFOKTp1eShNYXRoLnJvdW5kKHQqdGhpcy5zKnRoaXMubi90aGlzLmQpLHQpfSxyb3VuZFRvOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGx5KHQsZSksdXkodGhpcy5zKk1hdGgucm91bmQodGhpcy5uKnN5LmQvKHRoaXMuZCpzeS5uKSkqc3kubixzeS5kKX0saW52ZXJzZTpmdW5jdGlvbigpe3JldHVybiB1eSh0aGlzLnMqdGhpcy5kLHRoaXMubil9LHBvdzpmdW5jdGlvbih0LGUpe2lmKGx5KHQsZSksMT09PXN5LmQpcmV0dXJuIHN5LnM8MD91eShNYXRoLnBvdyh0aGlzLnMqdGhpcy5kLHN5Lm4pLE1hdGgucG93KHRoaXMubixzeS5uKSk6dXkoTWF0aC5wb3codGhpcy5zKnRoaXMubixzeS5uKSxNYXRoLnBvdyh0aGlzLmQsc3kubikpO2lmKHRoaXMuczwwKXJldHVybiBudWxsO3ZhciBuPWN5KHRoaXMubikscj1jeSh0aGlzLmQpLGk9MSxvPTE7Zm9yKHZhciBzIGluIG4paWYoIjEiIT09cyl7aWYoIjAiPT09cyl7aT0wO2JyZWFrfWlmKG5bc10qPXN5Lm4sbltzXSVzeS5kIT0wKXJldHVybiBudWxsO25bc10vPXN5LmQsaSo9TWF0aC5wb3cocyxuW3NdKX1mb3IodmFyIHMgaW4gcilpZigiMSIhPT1zKXtpZihyW3NdKj1zeS5uLHJbc10lc3kuZCE9MClyZXR1cm4gbnVsbDtyW3NdLz1zeS5kLG8qPU1hdGgucG93KHMscltzXSl9cmV0dXJuIHN5LnM8MD91eShvLGkpOnV5KGksbyl9LGVxdWFsczpmdW5jdGlvbih0LGUpe3JldHVybiBseSh0LGUpLHRoaXMucyp0aGlzLm4qc3kuZD09c3kucypzeS5uKnRoaXMuZH0sY29tcGFyZTpmdW5jdGlvbih0LGUpe2x5KHQsZSk7dmFyIG49dGhpcy5zKnRoaXMubipzeS5kLXN5LnMqc3kubip0aGlzLmQ7cmV0dXJuKDA8biktKG48MCl9LHNpbXBsaWZ5OmZ1bmN0aW9uKHQpe2lmKGlzTmFOKHRoaXMubil8fGlzTmFOKHRoaXMuZCkpcmV0dXJuIHRoaXM7dD10fHwuMDAxO2Zvcih2YXIgZT10aGlzLmFicygpLG49ZS50b0NvbnRpbnVlZCgpLHI9MTtyPG4ubGVuZ3RoO3IrKyl7Zm9yKHZhciBpPXV5KG5bci0xXSwxKSxvPXItMjtvPj0wO28tLSlpPWkuaW52ZXJzZSgpLmFkZChuW29dKTtpZihNYXRoLmFicyhpLnN1YihlKS52YWx1ZU9mKCkpPHQpcmV0dXJuIGkubXVsKHRoaXMucyl9cmV0dXJuIHRoaXN9LGRpdmlzaWJsZTpmdW5jdGlvbih0LGUpe3JldHVybiBseSh0LGUpLCEoIShzeS5uKnRoaXMuZCl8fHRoaXMubipzeS5kJShzeS5uKnRoaXMuZCkpfSx2YWx1ZU9mOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucyp0aGlzLm4vdGhpcy5kfSx0b0ZyYWN0aW9uOmZ1bmN0aW9uKHQpe3ZhciBlLG49IiIscj10aGlzLm4saT10aGlzLmQ7cmV0dXJuIHRoaXMuczwwJiYobis9Ii0iKSwxPT09aT9uKz1yOih0JiYoZT1NYXRoLmZsb29yKHIvaSkpPjAmJihuKz1lLG4rPSIgIixyJT1pKSxuKz1yLG4rPSIvIixuKz1pKSxufSx0b0xhdGV4OmZ1bmN0aW9uKHQpe3ZhciBlLG49IiIscj10aGlzLm4saT10aGlzLmQ7cmV0dXJuIHRoaXMuczwwJiYobis9Ii0iKSwxPT09aT9uKz1yOih0JiYoZT1NYXRoLmZsb29yKHIvaSkpPjAmJihuKz1lLHIlPWkpLG4rPSJcXGZyYWN7IixuKz1yLG4rPSJ9eyIsbis9aSxuKz0ifSIpLG59LHRvQ29udGludWVkOmZ1bmN0aW9uKCl7dmFyIHQsZT10aGlzLm4sbj10aGlzLmQscj1bXTtpZihpc05hTihlKXx8aXNOYU4obikpcmV0dXJuIHI7ZG97ci5wdXNoKE1hdGguZmxvb3IoZS9uKSksdD1lJW4sZT1uLG49dH13aGlsZSgxIT09ZSk7cmV0dXJuIHJ9LHRvU3RyaW5nOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMubixuPXRoaXMuZDtpZihpc05hTihlKXx8aXNOYU4obikpcmV0dXJuIk5hTiI7dD10fHwxNTt2YXIgcj1mdW5jdGlvbih0LGUpe2Zvcig7ZSUyPT0wO2UvPTIpO2Zvcig7ZSU1PT0wO2UvPTUpO2lmKDE9PT1lKXJldHVybiAwO2Zvcih2YXIgbj0xMCVlLHI9MTsxIT09bjtyKyspaWYobj0xMCpuJWUscj4yZTMpcmV0dXJuIDA7cmV0dXJuIHJ9KDAsbiksaT1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPTEsaT1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPTE7ZT4wO3Q9dCp0JW4sZT4+PTEpMSZlJiYocj1yKnQlbik7cmV0dXJuIHJ9KDEwLG4sZSksbz0wO288MzAwO28rKyl7aWYocj09PWkpcmV0dXJuIG87cj0xMCpyJWUsaT0xMCppJWV9cmV0dXJuIDB9KDAsbixyKSxvPXRoaXMuczwwPyItIjoiIjtpZihvKz1lL258MCxlJT1uLChlKj0xMCkmJihvKz0iLiIpLHIpe2Zvcih2YXIgcz1pO3MtLTspbys9ZS9ufDAsZSU9bixlKj0xMDtvKz0iKCI7Zm9yKHM9cjtzLS07KW8rPWUvbnwwLGUlPW4sZSo9MTA7bys9IikifWVsc2UgZm9yKHM9dDtlJiZzLS07KW8rPWUvbnwwLGUlPW4sZSo9MTA7cmV0dXJuIG99fTt2YXIgeXk9dGQoIkZyYWN0aW9uIixbXSwoKCk9PihPYmplY3QuZGVmaW5lUHJvcGVydHkoZnksIm5hbWUiLHt2YWx1ZToiRnJhY3Rpb24ifSksZnkucHJvdG90eXBlLmNvbnN0cnVjdG9yPWZ5LGZ5LnByb3RvdHlwZS50eXBlPSJGcmFjdGlvbiIsZnkucHJvdG90eXBlLmlzRnJhY3Rpb249ITAsZnkucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybnttYXRoanM6IkZyYWN0aW9uIixuOnRoaXMucyp0aGlzLm4sZDp0aGlzLmR9fSxmeS5mcm9tSlNPTj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGZ5KHQpfSxmeSkpLHtpc0NsYXNzOiEwfSksbXk9dGQoIk1hdHJpeCIsW10sKCgpPT57ZnVuY3Rpb24gdCgpe2lmKCEodGhpcyBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBTeW50YXhFcnJvcigiQ29uc3RydWN0b3IgbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgbmV3IG9wZXJhdG9yIil9cmV0dXJuIHQucHJvdG90eXBlLnR5cGU9Ik1hdHJpeCIsdC5wcm90b3R5cGUuaXNNYXRyaXg9ITAsdC5wcm90b3R5cGUuc3RvcmFnZT1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiQ2Fubm90IGludm9rZSBzdG9yYWdlIG9uIGEgTWF0cml4IGludGVyZmFjZSIpfSx0LnByb3RvdHlwZS5kYXRhdHlwZT1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiQ2Fubm90IGludm9rZSBkYXRhdHlwZSBvbiBhIE1hdHJpeCBpbnRlcmZhY2UiKX0sdC5wcm90b3R5cGUuY3JlYXRlPWZ1bmN0aW9uKHQsZSl7dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaW52b2tlIGNyZWF0ZSBvbiBhIE1hdHJpeCBpbnRlcmZhY2UiKX0sdC5wcm90b3R5cGUuc3Vic2V0PWZ1bmN0aW9uKHQsZSxuKXt0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBpbnZva2Ugc3Vic2V0IG9uIGEgTWF0cml4IGludGVyZmFjZSIpfSx0LnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaW52b2tlIGdldCBvbiBhIE1hdHJpeCBpbnRlcmZhY2UiKX0sdC5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQsZSxuKXt0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBpbnZva2Ugc2V0IG9uIGEgTWF0cml4IGludGVyZmFjZSIpfSx0LnByb3RvdHlwZS5yZXNpemU9ZnVuY3Rpb24odCxlKXt0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBpbnZva2UgcmVzaXplIG9uIGEgTWF0cml4IGludGVyZmFjZSIpfSx0LnByb3RvdHlwZS5yZXNoYXBlPWZ1bmN0aW9uKHQsZSl7dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaW52b2tlIHJlc2hhcGUgb24gYSBNYXRyaXggaW50ZXJmYWNlIil9LHQucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaW52b2tlIGNsb25lIG9uIGEgTWF0cml4IGludGVyZmFjZSIpfSx0LnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaW52b2tlIHNpemUgb24gYSBNYXRyaXggaW50ZXJmYWNlIil9LHQucHJvdG90eXBlLm1hcD1mdW5jdGlvbih0LGUpe3Rocm93IG5ldyBFcnJvcigiQ2Fubm90IGludm9rZSBtYXAgb24gYSBNYXRyaXggaW50ZXJmYWNlIil9LHQucHJvdG90eXBlLmZvckVhY2g9ZnVuY3Rpb24odCl7dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaW52b2tlIGZvckVhY2ggb24gYSBNYXRyaXggaW50ZXJmYWNlIil9LHQucHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl09ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBpdGVyYXRlIGEgTWF0cml4IGludGVyZmFjZSIpfSx0LnByb3RvdHlwZS50b0FycmF5PWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaW52b2tlIHRvQXJyYXkgb24gYSBNYXRyaXggaW50ZXJmYWNlIil9LHQucHJvdG90eXBlLnZhbHVlT2Y9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBpbnZva2UgdmFsdWVPZiBvbiBhIE1hdHJpeCBpbnRlcmZhY2UiKX0sdC5wcm90b3R5cGUuZm9ybWF0PWZ1bmN0aW9uKHQpe3Rocm93IG5ldyBFcnJvcigiQ2Fubm90IGludm9rZSBmb3JtYXQgb24gYSBNYXRyaXggaW50ZXJmYWNlIil9LHQucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaW52b2tlIHRvU3RyaW5nIG9uIGEgTWF0cml4IGludGVyZmFjZSIpfSx0fSkse2lzQ2xhc3M6ITB9KTtmdW5jdGlvbiB2eSh0KXtyZXR1cm4gT2JqZWN0LmtleXModC5zaWduYXR1cmVzfHx7fSkucmVkdWNlKChmdW5jdGlvbih0LGUpe3ZhciBuPShlLm1hdGNoKC8sL2cpfHxbXSkubGVuZ3RoKzE7cmV0dXJuIE1hdGgubWF4KHQsbil9KSwtMSl9dmFyIF95PXRkKCJEZW5zZU1hdHJpeCIsWyJNYXRyaXgiXSwodD0+e3ZhcntNYXRyaXg6ZX09dDtmdW5jdGlvbiBuKHQsZSl7aWYoISh0aGlzIGluc3RhbmNlb2YgbikpdGhyb3cgbmV3IFN5bnRheEVycm9yKCJDb25zdHJ1Y3RvciBtdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBuZXcgb3BlcmF0b3IiKTtpZihlJiYhUmYoZSkpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGRhdGF0eXBlOiAiK2UpO2lmKGtmKHQpKSJEZW5zZU1hdHJpeCI9PT10LnR5cGU/KHRoaXMuX2RhdGE9bXAodC5fZGF0YSksdGhpcy5fc2l6ZT1tcCh0Ll9zaXplKSx0aGlzLl9kYXRhdHlwZT1lfHx0Ll9kYXRhdHlwZSk6KHRoaXMuX2RhdGE9dC50b0FycmF5KCksdGhpcy5fc2l6ZT10LnNpemUoKSx0aGlzLl9kYXRhdHlwZT1lfHx0Ll9kYXRhdHlwZSk7ZWxzZSBpZih0JiZCZih0LmRhdGEpJiZCZih0LnNpemUpKXRoaXMuX2RhdGE9dC5kYXRhLHRoaXMuX3NpemU9dC5zaXplLEdwKHRoaXMuX2RhdGEsdGhpcy5fc2l6ZSksdGhpcy5fZGF0YXR5cGU9ZXx8dC5kYXRhdHlwZTtlbHNlIGlmKEJmKHQpKXRoaXMuX2RhdGE9YSh0KSx0aGlzLl9zaXplPXFwKHRoaXMuX2RhdGEpLEdwKHRoaXMuX2RhdGEsdGhpcy5fc2l6ZSksdGhpcy5fZGF0YXR5cGU9ZTtlbHNle2lmKHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5zdXBwb3J0ZWQgdHlwZSBvZiBkYXRhICgiK3lwKHQpKyIpIik7dGhpcy5fZGF0YT1bXSx0aGlzLl9zaXplPVswXSx0aGlzLl9kYXRhdHlwZT1lfX1mdW5jdGlvbiByKHQsZSxuLGkpe3ZhciBvPWk9PT1uLTEscz1lLmRpbWVuc2lvbihpKTtyZXR1cm4gbz9zLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIFlwKGUsdC5sZW5ndGgpLHRbZV19KSkudmFsdWVPZigpOnMubWFwKChmdW5jdGlvbihvKXtyZXR1cm4gWXAobyx0Lmxlbmd0aCkscih0W29dLGUsbixpKzEpfSkpLnZhbHVlT2YoKX1mdW5jdGlvbiBpKHQsZSxuLHIsbyl7dmFyIHM9bz09PXItMSxhPWUuZGltZW5zaW9uKG8pO3M/YS5mb3JFYWNoKChmdW5jdGlvbihlLHIpe1lwKGUpLHRbZV09bltyWzBdXX0pKTphLmZvckVhY2goKGZ1bmN0aW9uKHMsYSl7WXAocyksaSh0W3NdLGUsblthWzBdXSxyLG8rMSl9KSl9ZnVuY3Rpb24gbyh0LGUsbil7aWYoMD09PWUubGVuZ3RoKXtmb3IodmFyIHI9dC5fZGF0YTtCZihyKTspcj1yWzBdO3JldHVybiByfXJldHVybiB0Ll9zaXplPWUuc2xpY2UoMCksdC5fZGF0YT1YcCh0Ll9kYXRhLHQuX3NpemUsbiksdH1mdW5jdGlvbiBzKHQsZSxuKXtmb3IodmFyIHI9dC5fc2l6ZS5zbGljZSgwKSxpPSExO3IubGVuZ3RoPGUubGVuZ3RoOylyLnB1c2goMCksaT0hMDtmb3IodmFyIHM9MCxhPWUubGVuZ3RoO3M8YTtzKyspZVtzXT5yW3NdJiYocltzXT1lW3NdLGk9ITApO2kmJm8odCxyLG4pfWZ1bmN0aW9uIGEodCl7Zm9yKHZhciBlPTAsbj10Lmxlbmd0aDtlPG47ZSsrKXt2YXIgcj10W2VdO0JmKHIpP3RbZV09YShyKTpyJiYhMD09PXIuaXNNYXRyaXgmJih0W2VdPWEoci52YWx1ZU9mKCkpKX1yZXR1cm4gdH1yZXR1cm4gbi5wcm90b3R5cGU9bmV3IGUsbi5wcm90b3R5cGUuY3JlYXRlRGVuc2VNYXRyaXg9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IG4odCxlKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KG4sIm5hbWUiLHt2YWx1ZToiRGVuc2VNYXRyaXgifSksbi5wcm90b3R5cGUuY29uc3RydWN0b3I9bixuLnByb3RvdHlwZS50eXBlPSJEZW5zZU1hdHJpeCIsbi5wcm90b3R5cGUuaXNEZW5zZU1hdHJpeD0hMCxuLnByb3RvdHlwZS5nZXREYXRhVHlwZT1mdW5jdGlvbigpe3JldHVybiAkcCh0aGlzLl9kYXRhLHlwKX0sbi5wcm90b3R5cGUuc3RvcmFnZT1mdW5jdGlvbigpe3JldHVybiJkZW5zZSJ9LG4ucHJvdG90eXBlLmRhdGF0eXBlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RhdGF0eXBlfSxuLnByb3RvdHlwZS5jcmVhdGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IG4odCxlKX0sbi5wcm90b3R5cGUuc3Vic2V0PWZ1bmN0aW9uKHQsZSxvKXtzd2l0Y2goYXJndW1lbnRzLmxlbmd0aCl7Y2FzZSAxOnJldHVybiBmdW5jdGlvbih0LGUpe2lmKCFWZihlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGluZGV4Iik7dmFyIGk9ZS5pc1NjYWxhcigpO2lmKGkpcmV0dXJuIHQuZ2V0KGUubWluKCkpO3ZhciBvPWUuc2l6ZSgpO2lmKG8ubGVuZ3RoIT09dC5fc2l6ZS5sZW5ndGgpdGhyb3cgbmV3IGpwKG8ubGVuZ3RoLHQuX3NpemUubGVuZ3RoKTtmb3IodmFyIHM9ZS5taW4oKSxhPWUubWF4KCksdT0wLGM9dC5fc2l6ZS5sZW5ndGg7dTxjO3UrKylZcChzW3VdLHQuX3NpemVbdV0pLFlwKGFbdV0sdC5fc2l6ZVt1XSk7cmV0dXJuIG5ldyBuKHIodC5fZGF0YSxlLG8ubGVuZ3RoLDApLHQuX2RhdGF0eXBlKX0odGhpcyx0KTtjYXNlIDI6Y2FzZSAzOnJldHVybiBmdW5jdGlvbih0LGUsbixyKXtpZighZXx8ITAhPT1lLmlzSW5kZXgpdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBpbmRleCIpO3ZhciBvLGE9ZS5zaXplKCksdT1lLmlzU2NhbGFyKCk7aWYoa2Yobik/KG89bi5zaXplKCksbj1uLnZhbHVlT2YoKSk6bz1xcChuKSx1KXtpZigwIT09by5sZW5ndGgpdGhyb3cgbmV3IFR5cGVFcnJvcigiU2NhbGFyIGV4cGVjdGVkIik7dC5zZXQoZS5taW4oKSxuLHIpfWVsc2V7aWYoYS5sZW5ndGg8dC5fc2l6ZS5sZW5ndGgpdGhyb3cgbmV3IGpwKGEubGVuZ3RoLHQuX3NpemUubGVuZ3RoLCI8Iik7aWYoby5sZW5ndGg8YS5sZW5ndGgpe2Zvcih2YXIgYz0wLGw9MDsxPT09YVtjXSYmMT09PW9bY107KWMrKztmb3IoOzE9PT1hW2NdOylsKyssYysrO249SnAobixhLmxlbmd0aCxsLG8pfWlmKCF2cChhLG8pKXRocm93IG5ldyBqcChhLG8sIj4iKTtzKHQsZS5tYXgoKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0KzF9KSkscik7dmFyIGg9YS5sZW5ndGgsZj0wO2kodC5fZGF0YSxlLG4saCxmKX1yZXR1cm4gdH0odGhpcyx0LGUsbyk7ZGVmYXVsdDp0aHJvdyBuZXcgU3ludGF4RXJyb3IoIldyb25nIG51bWJlciBvZiBhcmd1bWVudHMiKX19LG4ucHJvdG90eXBlLmdldD1mdW5jdGlvbih0KXtpZighQmYodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJyYXkgZXhwZWN0ZWQiKTtpZih0Lmxlbmd0aCE9PXRoaXMuX3NpemUubGVuZ3RoKXRocm93IG5ldyBqcCh0Lmxlbmd0aCx0aGlzLl9zaXplLmxlbmd0aCk7Zm9yKHZhciBlPTA7ZTx0Lmxlbmd0aDtlKyspWXAodFtlXSx0aGlzLl9zaXplW2VdKTtmb3IodmFyIG49dGhpcy5fZGF0YSxyPTAsaT10Lmxlbmd0aDtyPGk7cisrKXt2YXIgbz10W3JdO1lwKG8sbi5sZW5ndGgpLG49bltvXX1yZXR1cm4gbn0sbi5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQsZSxuKXtpZighQmYodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJyYXkgZXhwZWN0ZWQiKTtpZih0Lmxlbmd0aDx0aGlzLl9zaXplLmxlbmd0aCl0aHJvdyBuZXcganAodC5sZW5ndGgsdGhpcy5fc2l6ZS5sZW5ndGgsIjwiKTt2YXIgcixpLG87cyh0aGlzLHQubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdCsxfSkpLG4pO3ZhciBhPXRoaXMuX2RhdGE7Zm9yKHI9MCxpPXQubGVuZ3RoLTE7cjxpO3IrKylZcChvPXRbcl0sYS5sZW5ndGgpLGE9YVtvXTtyZXR1cm4gWXAobz10W3QubGVuZ3RoLTFdLGEubGVuZ3RoKSxhW29dPWUsdGhpc30sbi5wcm90b3R5cGUucmVzaXplPWZ1bmN0aW9uKHQsZSxuKXtpZighemYodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJyYXkgb3IgTWF0cml4IGV4cGVjdGVkIik7dmFyIHI9dC52YWx1ZU9mKCkubWFwKCh0PT5BcnJheS5pc0FycmF5KHQpJiYxPT09dC5sZW5ndGg/dFswXTp0KSk7cmV0dXJuIG8obj90aGlzLmNsb25lKCk6dGhpcyxyLGUpfSxuLnByb3RvdHlwZS5yZXNoYXBlPWZ1bmN0aW9uKHQsZSl7dmFyIG49ZT90aGlzLmNsb25lKCk6dGhpcztuLl9kYXRhPUhwKG4uX2RhdGEsdCk7dmFyIHI9bi5fc2l6ZS5yZWR1Y2UoKCh0LGUpPT50KmUpKTtyZXR1cm4gbi5fc2l6ZT1acCh0LHIpLG59LG4ucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBuKHtkYXRhOm1wKHRoaXMuX2RhdGEpLHNpemU6bXAodGhpcy5fc2l6ZSksZGF0YXR5cGU6dGhpcy5fZGF0YXR5cGV9KX0sbi5wcm90b3R5cGUuc2l6ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zaXplLnNsaWNlKDApfSxuLnByb3RvdHlwZS5tYXA9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxyPXZ5KHQpLGk9ZnVuY3Rpb24gbihpLG8pe3JldHVybiBCZihpKT9pLm1hcCgoZnVuY3Rpb24odCxlKXtyZXR1cm4gbih0LG8uY29uY2F0KGUpKX0pKToxPT09cj90KGkpOjI9PT1yP3QoaSxvKTp0KGksbyxlKX0odGhpcy5fZGF0YSxbXSk7cmV0dXJuIG5ldyBuKGksdm9pZCAwIT09dGhpcy5fZGF0YXR5cGU/JHAoaSx5cCk6dm9pZCAwKX0sbi5wcm90b3R5cGUuZm9yRWFjaD1mdW5jdGlvbih0KXt2YXIgZT10aGlzOyFmdW5jdGlvbiBuKHIsaSl7QmYocik/ci5mb3JFYWNoKChmdW5jdGlvbih0LGUpe24odCxpLmNvbmNhdChlKSl9KSk6dChyLGksZSl9KHRoaXMuX2RhdGEsW10pfSxuLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdPWZ1bmN0aW9uKigpe3lpZWxkKmZ1bmN0aW9uKnQoZSxuKXtpZihCZihlKSlmb3IodmFyIHI9MDtyPGUubGVuZ3RoO3IrKyl5aWVsZCp0KGVbcl0sbi5jb25jYXQocikpO2Vsc2UgeWllbGR7dmFsdWU6ZSxpbmRleDpufX0odGhpcy5fZGF0YSxbXSl9LG4ucHJvdG90eXBlLnJvd3M9ZnVuY3Rpb24oKXt2YXIgdD1bXTtpZigyIT09dGhpcy5zaXplKCkubGVuZ3RoKXRocm93IG5ldyBUeXBlRXJyb3IoIlJvd3MgY2FuIG9ubHkgYmUgcmV0dXJuZWQgZm9yIGEgMkQgbWF0cml4LiIpO3ZhciBlPXRoaXMuX2RhdGE7Zm9yKHZhciByIG9mIGUpdC5wdXNoKG5ldyBuKFtyXSx0aGlzLl9kYXRhdHlwZSkpO3JldHVybiB0fSxuLnByb3RvdHlwZS5jb2x1bW5zPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPVtdLHI9dGhpcy5zaXplKCk7aWYoMiE9PXIubGVuZ3RoKXRocm93IG5ldyBUeXBlRXJyb3IoIlJvd3MgY2FuIG9ubHkgYmUgcmV0dXJuZWQgZm9yIGEgMkQgbWF0cml4LiIpO2Zvcih2YXIgaT10aGlzLl9kYXRhLG89ZnVuY3Rpb24ocil7dmFyIG89aS5tYXAoKHQ9Plt0W3JdXSkpO2UucHVzaChuZXcgbihvLHQuX2RhdGF0eXBlKSl9LHM9MDtzPHJbMV07cysrKW8ocyk7cmV0dXJuIGV9LG4ucHJvdG90eXBlLnRvQXJyYXk9ZnVuY3Rpb24oKXtyZXR1cm4gbXAodGhpcy5fZGF0YSl9LG4ucHJvdG90eXBlLnZhbHVlT2Y9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGF0YX0sbi5wcm90b3R5cGUuZm9ybWF0PWZ1bmN0aW9uKHQpe3JldHVybiBrcCh0aGlzLl9kYXRhLHQpfSxuLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiBrcCh0aGlzLl9kYXRhKX0sbi5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJue21hdGhqczoiRGVuc2VNYXRyaXgiLGRhdGE6dGhpcy5fZGF0YSxzaXplOnRoaXMuX3NpemUsZGF0YXR5cGU6dGhpcy5fZGF0YXR5cGV9fSxuLnByb3RvdHlwZS5kaWFnb25hbD1mdW5jdGlvbih0KXtpZih0KXtpZihGZih0KSYmKHQ9dC50b051bWJlcigpKSwhTWYodCl8fCFTcCh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGUgcGFyYW1ldGVyIGsgbXVzdCBiZSBhbiBpbnRlZ2VyIG51bWJlciIpfWVsc2UgdD0wO2Zvcih2YXIgZT10PjA/dDowLHI9dDwwPy10OjAsaT10aGlzLl9zaXplWzBdLG89dGhpcy5fc2l6ZVsxXSxzPU1hdGgubWluKGktcixvLWUpLGE9W10sdT0wO3U8czt1KyspYVt1XT10aGlzLl9kYXRhW3Urcl1bdStlXTtyZXR1cm4gbmV3IG4oe2RhdGE6YSxzaXplOltzXSxkYXRhdHlwZTp0aGlzLl9kYXRhdHlwZX0pfSxuLmRpYWdvbmFsPWZ1bmN0aW9uKHQsZSxyLGkpe2lmKCFCZih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcnJheSBleHBlY3RlZCwgc2l6ZSBwYXJhbWV0ZXIiKTtpZigyIT09dC5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJPbmx5IHR3byBkaW1lbnNpb25zIG1hdHJpeCBhcmUgc3VwcG9ydGVkIik7aWYodD10Lm1hcCgoZnVuY3Rpb24odCl7aWYoRmYodCkmJih0PXQudG9OdW1iZXIoKSksIU1mKHQpfHwhU3AodCl8fHQ8MSl0aHJvdyBuZXcgRXJyb3IoIlNpemUgdmFsdWVzIG11c3QgYmUgcG9zaXRpdmUgaW50ZWdlcnMiKTtyZXR1cm4gdH0pKSxyKXtpZihGZihyKSYmKHI9ci50b051bWJlcigpKSwhTWYocil8fCFTcChyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGUgcGFyYW1ldGVyIGsgbXVzdCBiZSBhbiBpbnRlZ2VyIG51bWJlciIpfWVsc2Ugcj0wO3ZhciBvLHM9cj4wP3I6MCxhPXI8MD8tcjowLHU9dFswXSxjPXRbMV0sbD1NYXRoLm1pbih1LWEsYy1zKTtpZihCZihlKSl7aWYoZS5sZW5ndGghPT1sKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCB2YWx1ZSBhcnJheSBsZW5ndGgiKTtvPWZ1bmN0aW9uKHQpe3JldHVybiBlW3RdfX1lbHNlIGlmKGtmKGUpKXt2YXIgaD1lLnNpemUoKTtpZigxIT09aC5sZW5ndGh8fGhbMF0hPT1sKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBtYXRyaXggbGVuZ3RoIik7bz1mdW5jdGlvbih0KXtyZXR1cm4gZS5nZXQoW3RdKX19ZWxzZSBvPWZ1bmN0aW9uKCl7cmV0dXJuIGV9O2l8fChpPUZmKG8oMCkpP28oMCkubXVsKDApOjApO3ZhciBmPVtdO2lmKHQubGVuZ3RoPjApe2Y9WHAoZix0LGkpO2Zvcih2YXIgcD0wO3A8bDtwKyspZltwK2FdW3Arc109byhwKX1yZXR1cm4gbmV3IG4oe2RhdGE6ZixzaXplOlt1LGNdfSl9LG4uZnJvbUpTT049ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBuKHQpfSxuLnByb3RvdHlwZS5zd2FwUm93cz1mdW5jdGlvbih0LGUpe2lmKCEoTWYodCkmJlNwKHQpJiZNZihlKSYmU3AoZSkpKXRocm93IG5ldyBFcnJvcigiUm93IGluZGV4IG11c3QgYmUgcG9zaXRpdmUgaW50ZWdlcnMiKTtpZigyIT09dGhpcy5fc2l6ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJPbmx5IHR3byBkaW1lbnNpb25hbCBtYXRyaXggaXMgc3VwcG9ydGVkIik7cmV0dXJuIFlwKHQsdGhpcy5fc2l6ZVswXSksWXAoZSx0aGlzLl9zaXplWzBdKSxuLl9zd2FwUm93cyh0LGUsdGhpcy5fZGF0YSksdGhpc30sbi5fc3dhcFJvd3M9ZnVuY3Rpb24odCxlLG4pe3ZhciByPW5bdF07blt0XT1uW2VdLG5bZV09cn0sbn0pLHtpc0NsYXNzOiEwfSk7ZnVuY3Rpb24geHkodCxlLG4pe3JldHVybiB0JiYiZnVuY3Rpb24iPT10eXBlb2YgdC5tYXA/dC5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB4eSh0LGUpfSkpOmUodCl9dmFyIHd5PSJpc0ludGVnZXIiLGJ5PXRkKHd5LFsidHlwZWQiXSwodD0+e3Zhcnt0eXBlZDplfT10O3JldHVybiBlKHd5LHtudW1iZXI6U3AsQmlnTnVtYmVyOmZ1bmN0aW9uKHQpe3JldHVybiB0LmlzSW50KCl9LEZyYWN0aW9uOmZ1bmN0aW9uKHQpe3JldHVybiAxPT09dC5kJiZpc0Zpbml0ZSh0Lm4pfSwiQXJyYXkgfCBNYXRyaXgiOmUucmVmZXJUb1NlbGYoKHQ9PmU9Pnh5KGUsdCkpKX0pfSkpLER5PSJudW1iZXIsIG51bWJlciI7ZnVuY3Rpb24gRXkodCxlKXtyZXR1cm4gdCtlfWZ1bmN0aW9uIEN5KHQsZSl7cmV0dXJuIHQqZX1mdW5jdGlvbiBTeSh0LGUsbil7aWYobnVsbD09bilyZXR1cm4gdC5lcShlKTtpZih0LmVxKGUpKXJldHVybiEwO2lmKHQuaXNOYU4oKXx8ZS5pc05hTigpKXJldHVybiExO2lmKHQuaXNGaW5pdGUoKSYmZS5pc0Zpbml0ZSgpKXt2YXIgcj10Lm1pbnVzKGUpLmFicygpO2lmKHIuaXNaZXJvKCkpcmV0dXJuITA7dmFyIGk9dC5jb25zdHJ1Y3Rvci5tYXgodC5hYnMoKSxlLmFicygpKTtyZXR1cm4gci5sdGUoaS50aW1lcyhuKSl9cmV0dXJuITF9RXkuc2lnbmF0dXJlPUR5LEN5LnNpZ25hdHVyZT1EeTt2YXIgQXk9dGQoImNvbXBhcmVVbml0cyIsWyJ0eXBlZCJdLCh0PT57dmFye3R5cGVkOmV9PXQ7cmV0dXJueyJVbml0LCBVbml0IjplLnJlZmVyVG9TZWxmKCh0PT4obixyKT0+e2lmKCFuLmVxdWFsQmFzZShyKSl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBjb21wYXJlIHVuaXRzIHdpdGggZGlmZmVyZW50IGJhc2UiKTtyZXR1cm4gZS5maW5kKHQsW24udmFsdWVUeXBlKCksci52YWx1ZVR5cGUoKV0pKG4udmFsdWUsci52YWx1ZSl9KSl9fSkpLE55PSJlcXVhbFNjYWxhciIsSXk9dGQoTnksWyJ0eXBlZCIsImNvbmZpZyJdLCh0PT57dmFye3R5cGVkOmUsY29uZmlnOm59PXQscj1BeSh7dHlwZWQ6ZX0pO3JldHVybiBlKE55LHsiYm9vbGVhbiwgYm9vbGVhbiI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD09PWV9LCJudW1iZXIsIG51bWJlciI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gTHAodCxlLG4uZXBzaWxvbil9LCJCaWdOdW1iZXIsIEJpZ051bWJlciI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5lcShlKXx8U3kodCxlLG4uZXBzaWxvbil9LCJGcmFjdGlvbiwgRnJhY3Rpb24iOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuZXF1YWxzKGUpfSwiQ29tcGxleCwgQ29tcGxleCI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gZnVuY3Rpb24odCxlLG4pe3JldHVybiBMcCh0LnJlLGUucmUsbikmJkxwKHQuaW0sZS5pbSxuKX0odCxlLG4uZXBzaWxvbil9fSxyKX0pKTt0ZChOeSxbInR5cGVkIiwiY29uZmlnIl0sKHQ9Pnt2YXJ7dHlwZWQ6ZSxjb25maWc6bn09dDtyZXR1cm4gZShOeSx7Im51bWJlciwgbnVtYmVyIjpmdW5jdGlvbih0LGUpe3JldHVybiBMcCh0LGUsbi5lcHNpbG9uKX19KX0pKTt2YXIgTXk9dGQoIlNwYXJzZU1hdHJpeCIsWyJ0eXBlZCIsImVxdWFsU2NhbGFyIiwiTWF0cml4Il0sKHQ9Pnt2YXJ7dHlwZWQ6ZSxlcXVhbFNjYWxhcjpuLE1hdHJpeDpyfT10O2Z1bmN0aW9uIGkodCxlKXtpZighKHRoaXMgaW5zdGFuY2VvZiBpKSl0aHJvdyBuZXcgU3ludGF4RXJyb3IoIkNvbnN0cnVjdG9yIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIG5ldyBvcGVyYXRvciIpO2lmKGUmJiFSZihlKSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgZGF0YXR5cGU6ICIrZSk7aWYoa2YodCkpIWZ1bmN0aW9uKHQsZSxuKXsiU3BhcnNlTWF0cml4Ij09PWUudHlwZT8odC5fdmFsdWVzPWUuX3ZhbHVlcz9tcChlLl92YWx1ZXMpOnZvaWQgMCx0Ll9pbmRleD1tcChlLl9pbmRleCksdC5fcHRyPW1wKGUuX3B0ciksdC5fc2l6ZT1tcChlLl9zaXplKSx0Ll9kYXRhdHlwZT1ufHxlLl9kYXRhdHlwZSk6byh0LGUudmFsdWVPZigpLG58fGUuX2RhdGF0eXBlKX0odGhpcyx0LGUpO2Vsc2UgaWYodCYmQmYodC5pbmRleCkmJkJmKHQucHRyKSYmQmYodC5zaXplKSl0aGlzLl92YWx1ZXM9dC52YWx1ZXMsdGhpcy5faW5kZXg9dC5pbmRleCx0aGlzLl9wdHI9dC5wdHIsdGhpcy5fc2l6ZT10LnNpemUsdGhpcy5fZGF0YXR5cGU9ZXx8dC5kYXRhdHlwZTtlbHNlIGlmKEJmKHQpKW8odGhpcyx0LGUpO2Vsc2V7aWYodCl0aHJvdyBuZXcgVHlwZUVycm9yKCJVbnN1cHBvcnRlZCB0eXBlIG9mIGRhdGEgKCIreXAodCkrIikiKTt0aGlzLl92YWx1ZXM9W10sdGhpcy5faW5kZXg9W10sdGhpcy5fcHRyPVswXSx0aGlzLl9zaXplPVswLDBdLHRoaXMuX2RhdGF0eXBlPWV9fWZ1bmN0aW9uIG8odCxyLGkpe3QuX3ZhbHVlcz1bXSx0Ll9pbmRleD1bXSx0Ll9wdHI9W10sdC5fZGF0YXR5cGU9aTt2YXIgbz1yLmxlbmd0aCxzPTAsYT1uLHU9MDtpZihSZihpKSYmKGE9ZS5maW5kKG4sW2ksaV0pfHxuLHU9ZS5jb252ZXJ0KDAsaSkpLG8+MCl7dmFyIGM9MDtkb3t0Ll9wdHIucHVzaCh0Ll9pbmRleC5sZW5ndGgpO2Zvcih2YXIgbD0wO2w8bztsKyspe3ZhciBoPXJbbF07aWYoQmYoaCkpe2lmKDA9PT1jJiZzPGgubGVuZ3RoJiYocz1oLmxlbmd0aCksYzxoLmxlbmd0aCl7dmFyIGY9aFtjXTthKGYsdSl8fCh0Ll92YWx1ZXMucHVzaChmKSx0Ll9pbmRleC5wdXNoKGwpKX19ZWxzZSAwPT09YyYmczwxJiYocz0xKSxhKGgsdSl8fCh0Ll92YWx1ZXMucHVzaChoKSx0Ll9pbmRleC5wdXNoKGwpKX1jKyt9d2hpbGUoYzxzKX10Ll9wdHIucHVzaCh0Ll9pbmRleC5sZW5ndGgpLHQuX3NpemU9W28sc119ZnVuY3Rpb24gcyh0LGUsbixyKXtpZihuLWU9PTApcmV0dXJuIG47Zm9yKHZhciBpPWU7aTxuO2krKylpZihyW2ldPT09dClyZXR1cm4gaTtyZXR1cm4gZX1mdW5jdGlvbiBhKHQsZSxuLHIsaSxvLHMpe2kuc3BsaWNlKHQsMCxyKSxvLnNwbGljZSh0LDAsZSk7Zm9yKHZhciBhPW4rMTthPHMubGVuZ3RoO2ErKylzW2FdKyt9ZnVuY3Rpb24gdSh0LHIsaSxvKXt2YXIgcz1vfHwwLGE9bix1PTA7UmYodC5fZGF0YXR5cGUpJiYoYT1lLmZpbmQobixbdC5fZGF0YXR5cGUsdC5fZGF0YXR5cGVdKXx8bix1PWUuY29udmVydCgwLHQuX2RhdGF0eXBlKSxzPWUuY29udmVydChzLHQuX2RhdGF0eXBlKSk7dmFyIGMsbCxoLGY9IWEocyx1KSxwPXQuX3NpemVbMF0sZD10Ll9zaXplWzFdO2lmKGk+ZCl7Zm9yKGw9ZDtsPGk7bCsrKWlmKHQuX3B0cltsXT10Ll92YWx1ZXMubGVuZ3RoLGYpZm9yKGM9MDtjPHA7YysrKXQuX3ZhbHVlcy5wdXNoKHMpLHQuX2luZGV4LnB1c2goYyk7dC5fcHRyW2ldPXQuX3ZhbHVlcy5sZW5ndGh9ZWxzZSBpPGQmJih0Ll9wdHIuc3BsaWNlKGkrMSxkLWkpLHQuX3ZhbHVlcy5zcGxpY2UodC5fcHRyW2ldLHQuX3ZhbHVlcy5sZW5ndGgpLHQuX2luZGV4LnNwbGljZSh0Ll9wdHJbaV0sdC5faW5kZXgubGVuZ3RoKSk7aWYoZD1pLHI+cCl7aWYoZil7dmFyIGc9MDtmb3IobD0wO2w8ZDtsKyspe3QuX3B0cltsXT10Ll9wdHJbbF0rZyxoPXQuX3B0cltsKzFdK2c7dmFyIHk9MDtmb3IoYz1wO2M8cjtjKysseSsrKXQuX3ZhbHVlcy5zcGxpY2UoaCt5LDAscyksdC5faW5kZXguc3BsaWNlKGgreSwwLGMpLGcrK310Ll9wdHJbZF09dC5fdmFsdWVzLmxlbmd0aH19ZWxzZSBpZihyPHApe3ZhciBtPTA7Zm9yKGw9MDtsPGQ7bCsrKXt0Ll9wdHJbbF09dC5fcHRyW2xdLW07dmFyIHY9dC5fcHRyW2xdLF89dC5fcHRyW2wrMV0tbTtmb3IoaD12O2g8XztoKyspKGM9dC5faW5kZXhbaF0pPnItMSYmKHQuX3ZhbHVlcy5zcGxpY2UoaCwxKSx0Ll9pbmRleC5zcGxpY2UoaCwxKSxtKyspfXQuX3B0cltsXT10Ll92YWx1ZXMubGVuZ3RofXJldHVybiB0Ll9zaXplWzBdPXIsdC5fc2l6ZVsxXT1pLHR9ZnVuY3Rpb24gYyh0LGUsbixyLGkpe3ZhciBvLHMsYT1yWzBdLHU9clsxXSxjPVtdO2ZvcihvPTA7bzxhO28rKylmb3IoY1tvXT1bXSxzPTA7czx1O3MrKyljW29dW3NdPTA7Zm9yKHM9MDtzPHU7cysrKWZvcih2YXIgbD1uW3NdLGg9bltzKzFdLGY9bDtmPGg7ZisrKWNbbz1lW2ZdXVtzXT10P2k/bXAodFtmXSk6dFtmXToxO3JldHVybiBjfXJldHVybiBpLnByb3RvdHlwZT1uZXcgcixpLnByb3RvdHlwZS5jcmVhdGVTcGFyc2VNYXRyaXg9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IGkodCxlKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KGksIm5hbWUiLHt2YWx1ZToiU3BhcnNlTWF0cml4In0pLGkucHJvdG90eXBlLmNvbnN0cnVjdG9yPWksaS5wcm90b3R5cGUudHlwZT0iU3BhcnNlTWF0cml4IixpLnByb3RvdHlwZS5pc1NwYXJzZU1hdHJpeD0hMCxpLnByb3RvdHlwZS5nZXREYXRhVHlwZT1mdW5jdGlvbigpe3JldHVybiAkcCh0aGlzLl92YWx1ZXMseXApfSxpLnByb3RvdHlwZS5zdG9yYWdlPWZ1bmN0aW9uKCl7cmV0dXJuInNwYXJzZSJ9LGkucHJvdG90eXBlLmRhdGF0eXBlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RhdGF0eXBlfSxpLnByb3RvdHlwZS5jcmVhdGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IGkodCxlKX0saS5wcm90b3R5cGUuZGVuc2l0eT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX3NpemVbMF0sZT10aGlzLl9zaXplWzFdO3JldHVybiAwIT09dCYmMCE9PWU/dGhpcy5faW5kZXgubGVuZ3RoLyh0KmUpOjB9LGkucHJvdG90eXBlLnN1YnNldD1mdW5jdGlvbih0LGUsbil7aWYoIXRoaXMuX3ZhbHVlcyl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBpbnZva2Ugc3Vic2V0IG9uIGEgUGF0dGVybiBvbmx5IG1hdHJpeCIpO3N3aXRjaChhcmd1bWVudHMubGVuZ3RoKXtjYXNlIDE6cmV0dXJuIGZ1bmN0aW9uKHQsZSl7aWYoIVZmKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgaW5kZXgiKTt2YXIgbj1lLmlzU2NhbGFyKCk7aWYobilyZXR1cm4gdC5nZXQoZS5taW4oKSk7dmFyIHI9ZS5zaXplKCk7aWYoci5sZW5ndGghPT10Ll9zaXplLmxlbmd0aCl0aHJvdyBuZXcganAoci5sZW5ndGgsdC5fc2l6ZS5sZW5ndGgpO3ZhciBvLHMsYSx1LGM9ZS5taW4oKSxsPWUubWF4KCk7Zm9yKG89MCxzPXQuX3NpemUubGVuZ3RoO288cztvKyspWXAoY1tvXSx0Ll9zaXplW29dKSxZcChsW29dLHQuX3NpemVbb10pO3ZhciBoPXQuX3ZhbHVlcyxmPXQuX2luZGV4LHA9dC5fcHRyLGQ9ZS5kaW1lbnNpb24oMCksZz1lLmRpbWVuc2lvbigxKSx5PVtdLG09W107ZC5mb3JFYWNoKChmdW5jdGlvbih0LGUpe21bdF09ZVswXSx5W3RdPSEwfSkpO3ZhciB2PWg/W106dm9pZCAwLF89W10seD1bXTtyZXR1cm4gZy5mb3JFYWNoKChmdW5jdGlvbih0KXtmb3IoeC5wdXNoKF8ubGVuZ3RoKSxhPXBbdF0sdT1wW3QrMV07YTx1O2ErKylvPWZbYV0sITA9PT15W29dJiYoXy5wdXNoKG1bb10pLHYmJnYucHVzaChoW2FdKSl9KSkseC5wdXNoKF8ubGVuZ3RoKSxuZXcgaSh7dmFsdWVzOnYsaW5kZXg6XyxwdHI6eCxzaXplOnIsZGF0YXR5cGU6dC5fZGF0YXR5cGV9KX0odGhpcyx0KTtjYXNlIDI6Y2FzZSAzOnJldHVybiBmdW5jdGlvbih0LGUsbixyKXtpZighZXx8ITAhPT1lLmlzSW5kZXgpdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBpbmRleCIpO3ZhciBpLG89ZS5zaXplKCkscz1lLmlzU2NhbGFyKCk7aWYoa2Yobik/KGk9bi5zaXplKCksbj1uLnRvQXJyYXkoKSk6aT1xcChuKSxzKXtpZigwIT09aS5sZW5ndGgpdGhyb3cgbmV3IFR5cGVFcnJvcigiU2NhbGFyIGV4cGVjdGVkIik7dC5zZXQoZS5taW4oKSxuLHIpfWVsc2V7aWYoMSE9PW8ubGVuZ3RoJiYyIT09by5sZW5ndGgpdGhyb3cgbmV3IGpwKG8ubGVuZ3RoLHQuX3NpemUubGVuZ3RoLCI8Iik7aWYoaS5sZW5ndGg8by5sZW5ndGgpe2Zvcih2YXIgYT0wLHU9MDsxPT09b1thXSYmMT09PWlbYV07KWErKztmb3IoOzE9PT1vW2FdOyl1KyssYSsrO249SnAobixvLmxlbmd0aCx1LGkpfWlmKCF2cChvLGkpKXRocm93IG5ldyBqcChvLGksIj4iKTtpZigxPT09by5sZW5ndGgpe2UuZGltZW5zaW9uKDApLmZvckVhY2goKGZ1bmN0aW9uKGUsaSl7WXAoZSksdC5zZXQoW2UsMF0sbltpWzBdXSxyKX0pKX1lbHNle3ZhciBjPWUuZGltZW5zaW9uKDApLGw9ZS5kaW1lbnNpb24oMSk7Yy5mb3JFYWNoKChmdW5jdGlvbihlLGkpe1lwKGUpLGwuZm9yRWFjaCgoZnVuY3Rpb24obyxzKXtZcChvKSx0LnNldChbZSxvXSxuW2lbMF1dW3NbMF1dLHIpfSkpfSkpfX1yZXR1cm4gdH0odGhpcyx0LGUsbik7ZGVmYXVsdDp0aHJvdyBuZXcgU3ludGF4RXJyb3IoIldyb25nIG51bWJlciBvZiBhcmd1bWVudHMiKX19LGkucHJvdG90eXBlLmdldD1mdW5jdGlvbih0KXtpZighQmYodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJyYXkgZXhwZWN0ZWQiKTtpZih0Lmxlbmd0aCE9PXRoaXMuX3NpemUubGVuZ3RoKXRocm93IG5ldyBqcCh0Lmxlbmd0aCx0aGlzLl9zaXplLmxlbmd0aCk7aWYoIXRoaXMuX3ZhbHVlcyl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBpbnZva2UgZ2V0IG9uIGEgUGF0dGVybiBvbmx5IG1hdHJpeCIpO3ZhciBlPXRbMF0sbj10WzFdO1lwKGUsdGhpcy5fc2l6ZVswXSksWXAobix0aGlzLl9zaXplWzFdKTt2YXIgcj1zKGUsdGhpcy5fcHRyW25dLHRoaXMuX3B0cltuKzFdLHRoaXMuX2luZGV4KTtyZXR1cm4gcjx0aGlzLl9wdHJbbisxXSYmdGhpcy5faW5kZXhbcl09PT1lP3RoaXMuX3ZhbHVlc1tyXTowfSxpLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxyLGkpe2lmKCFCZih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcnJheSBleHBlY3RlZCIpO2lmKHQubGVuZ3RoIT09dGhpcy5fc2l6ZS5sZW5ndGgpdGhyb3cgbmV3IGpwKHQubGVuZ3RoLHRoaXMuX3NpemUubGVuZ3RoKTtpZighdGhpcy5fdmFsdWVzKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IGludm9rZSBzZXQgb24gYSBQYXR0ZXJuIG9ubHkgbWF0cml4Iik7dmFyIG89dFswXSxjPXRbMV0sbD10aGlzLl9zaXplWzBdLGg9dGhpcy5fc2l6ZVsxXSxmPW4scD0wO1JmKHRoaXMuX2RhdGF0eXBlKSYmKGY9ZS5maW5kKG4sW3RoaXMuX2RhdGF0eXBlLHRoaXMuX2RhdGF0eXBlXSl8fG4scD1lLmNvbnZlcnQoMCx0aGlzLl9kYXRhdHlwZSkpLChvPmwtMXx8Yz5oLTEpJiYodSh0aGlzLE1hdGgubWF4KG8rMSxsKSxNYXRoLm1heChjKzEsaCksaSksbD10aGlzLl9zaXplWzBdLGg9dGhpcy5fc2l6ZVsxXSksWXAobyxsKSxZcChjLGgpO3ZhciBkPXMobyx0aGlzLl9wdHJbY10sdGhpcy5fcHRyW2MrMV0sdGhpcy5faW5kZXgpO3JldHVybiBkPHRoaXMuX3B0cltjKzFdJiZ0aGlzLl9pbmRleFtkXT09PW8/ZihyLHApP2Z1bmN0aW9uKHQsZSxuLHIsaSl7bi5zcGxpY2UodCwxKSxyLnNwbGljZSh0LDEpO2Zvcih2YXIgbz1lKzE7bzxpLmxlbmd0aDtvKyspaVtvXS0tfShkLGMsdGhpcy5fdmFsdWVzLHRoaXMuX2luZGV4LHRoaXMuX3B0cik6dGhpcy5fdmFsdWVzW2RdPXI6ZihyLHApfHxhKGQsbyxjLHIsdGhpcy5fdmFsdWVzLHRoaXMuX2luZGV4LHRoaXMuX3B0ciksdGhpc30saS5wcm90b3R5cGUucmVzaXplPWZ1bmN0aW9uKHQsZSxuKXtpZighemYodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJyYXkgb3IgTWF0cml4IGV4cGVjdGVkIik7dmFyIHI9dC52YWx1ZU9mKCkubWFwKCh0PT5BcnJheS5pc0FycmF5KHQpJiYxPT09dC5sZW5ndGg/dFswXTp0KSk7aWYoMiE9PXIubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiT25seSB0d28gZGltZW5zaW9ucyBtYXRyaXggYXJlIHN1cHBvcnRlZCIpO3JldHVybiByLmZvckVhY2goKGZ1bmN0aW9uKHQpe2lmKCFNZih0KXx8IVNwKHQpfHx0PDApdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBzaXplLCBtdXN0IGNvbnRhaW4gcG9zaXRpdmUgaW50ZWdlcnMgKHNpemU6ICIra3AocikrIikiKX0pKSx1KG4/dGhpcy5jbG9uZSgpOnRoaXMsclswXSxyWzFdLGUpfSxpLnByb3RvdHlwZS5yZXNoYXBlPWZ1bmN0aW9uKHQsZSl7aWYoIUJmKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFycmF5IGV4cGVjdGVkIik7aWYoMiE9PXQubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiU3BhcnNlIG1hdHJpY2VzIGNhbiBvbmx5IGJlIHJlc2hhcGVkIGluIHR3byBkaW1lbnNpb25zIik7dC5mb3JFYWNoKChmdW5jdGlvbihlKXtpZighTWYoZSl8fCFTcChlKXx8ZTw9LTJ8fDA9PT1lKXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgc2l6ZSwgbXVzdCBjb250YWluIHBvc2l0aXZlIGludGVnZXJzIG9yIC0xIChzaXplOiAiK2twKHQpKyIpIil9KSk7dmFyIG49dGhpcy5fc2l6ZVswXSp0aGlzLl9zaXplWzFdO2lmKG4hPT0odD1acCh0LG4pKVswXSp0WzFdKXRocm93IG5ldyBFcnJvcigiUmVzaGFwaW5nIHNwYXJzZSBtYXRyaXggd2lsbCByZXN1bHQgaW4gdGhlIHdyb25nIG51bWJlciBvZiBlbGVtZW50cyIpO3ZhciByPWU/dGhpcy5jbG9uZSgpOnRoaXM7aWYodGhpcy5fc2l6ZVswXT09PXRbMF0mJnRoaXMuX3NpemVbMV09PT10WzFdKXJldHVybiByO2Zvcih2YXIgaT1bXSxvPTA7bzxyLl9wdHIubGVuZ3RoO28rKylmb3IodmFyIHU9MDt1PHIuX3B0cltvKzFdLXIuX3B0cltvXTt1KyspaS5wdXNoKG8pO2Zvcih2YXIgYz1yLl92YWx1ZXMuc2xpY2UoKSxsPXIuX2luZGV4LnNsaWNlKCksaD0wO2g8ci5faW5kZXgubGVuZ3RoO2grKyl7dmFyIGY9bFtoXSxwPWlbaF0sZD1mKnIuX3NpemVbMV0rcDtpW2hdPWQldFsxXSxsW2hdPU1hdGguZmxvb3IoZC90WzFdKX1yLl92YWx1ZXMubGVuZ3RoPTAsci5faW5kZXgubGVuZ3RoPTAsci5fcHRyLmxlbmd0aD10WzFdKzEsci5fc2l6ZT10LnNsaWNlKCk7Zm9yKHZhciBnPTA7ZzxyLl9wdHIubGVuZ3RoO2crKylyLl9wdHJbZ109MDtmb3IodmFyIHk9MDt5PGMubGVuZ3RoO3krKyl7dmFyIG09bFt5XSx2PWlbeV0sXz1jW3ldO2EocyhtLHIuX3B0clt2XSxyLl9wdHJbdisxXSxyLl9pbmRleCksbSx2LF8sci5fdmFsdWVzLHIuX2luZGV4LHIuX3B0cil9cmV0dXJuIHJ9LGkucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBpKHt2YWx1ZXM6dGhpcy5fdmFsdWVzP21wKHRoaXMuX3ZhbHVlcyk6dm9pZCAwLGluZGV4Om1wKHRoaXMuX2luZGV4KSxwdHI6bXAodGhpcy5fcHRyKSxzaXplOm1wKHRoaXMuX3NpemUpLGRhdGF0eXBlOnRoaXMuX2RhdGF0eXBlfSl9LGkucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2l6ZS5zbGljZSgwKX0saS5wcm90b3R5cGUubWFwPWZ1bmN0aW9uKHQscil7aWYoIXRoaXMuX3ZhbHVlcyl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBpbnZva2UgbWFwIG9uIGEgUGF0dGVybiBvbmx5IG1hdHJpeCIpO3ZhciBvPXRoaXMscz10aGlzLl9zaXplWzBdLGE9dGhpcy5fc2l6ZVsxXSx1PXZ5KHQpO3JldHVybiBmdW5jdGlvbih0LHIsbyxzLGEsdSxjKXt2YXIgbD1bXSxoPVtdLGY9W10scD1uLGQ9MDtSZih0Ll9kYXRhdHlwZSkmJihwPWUuZmluZChuLFt0Ll9kYXRhdHlwZSx0Ll9kYXRhdHlwZV0pfHxuLGQ9ZS5jb252ZXJ0KDAsdC5fZGF0YXR5cGUpKTtmb3IodmFyIGc9ZnVuY3Rpb24odCxlLG4pe3Q9dSh0LGUsbikscCh0LGQpfHwobC5wdXNoKHQpLGgucHVzaChlKSl9LHk9czt5PD1hO3krKyl7Zi5wdXNoKGwubGVuZ3RoKTt2YXIgbT10Ll9wdHJbeV0sdj10Ll9wdHJbeSsxXTtpZihjKWZvcih2YXIgXz1tO188djtfKyspe3ZhciB4PXQuX2luZGV4W19dO3g+PXImJng8PW8mJmcodC5fdmFsdWVzW19dLHgtcix5LXMpfWVsc2V7Zm9yKHZhciB3PXt9LGI9bTtiPHY7YisrKXt3W3QuX2luZGV4W2JdXT10Ll92YWx1ZXNbYl19Zm9yKHZhciBEPXI7RDw9bztEKyspe2coRCBpbiB3P3dbRF06MCxELXIseS1zKX19fXJldHVybiBmLnB1c2gobC5sZW5ndGgpLG5ldyBpKHt2YWx1ZXM6bCxpbmRleDpoLHB0cjpmLHNpemU6W28tcisxLGEtcysxXX0pfSh0aGlzLDAscy0xLDAsYS0xLChmdW5jdGlvbihlLG4scil7cmV0dXJuIDE9PT11P3QoZSk6Mj09PXU/dChlLFtuLHJdKTp0KGUsW24scl0sbyl9KSxyKX0saS5wcm90b3R5cGUuZm9yRWFjaD1mdW5jdGlvbih0LGUpe2lmKCF0aGlzLl92YWx1ZXMpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaW52b2tlIGZvckVhY2ggb24gYSBQYXR0ZXJuIG9ubHkgbWF0cml4Iik7Zm9yKHZhciBuPXRoaXMuX3NpemVbMF0scj10aGlzLl9zaXplWzFdLGk9MDtpPHI7aSsrKXt2YXIgbz10aGlzLl9wdHJbaV0scz10aGlzLl9wdHJbaSsxXTtpZihlKWZvcih2YXIgYT1vO2E8czthKyspe3ZhciB1PXRoaXMuX2luZGV4W2FdO3QodGhpcy5fdmFsdWVzW2FdLFt1LGldLHRoaXMpfWVsc2V7Zm9yKHZhciBjPXt9LGw9bztsPHM7bCsrKXtjW3RoaXMuX2luZGV4W2xdXT10aGlzLl92YWx1ZXNbbF19Zm9yKHZhciBoPTA7aDxuO2grKyl7dChoIGluIGM/Y1toXTowLFtoLGldLHRoaXMpfX19fSxpLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdPWZ1bmN0aW9uKigpe2lmKCF0aGlzLl92YWx1ZXMpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaXRlcmF0ZSBhIFBhdHRlcm4gb25seSBtYXRyaXgiKTtmb3IodmFyIHQ9dGhpcy5fc2l6ZVsxXSxlPTA7ZTx0O2UrKylmb3IodmFyIG49dGhpcy5fcHRyW2VdLHI9dGhpcy5fcHRyW2UrMV0saT1uO2k8cjtpKyspe3ZhciBvPXRoaXMuX2luZGV4W2ldO3lpZWxke3ZhbHVlOnRoaXMuX3ZhbHVlc1tpXSxpbmRleDpbbyxlXX19fSxpLnByb3RvdHlwZS50b0FycmF5PWZ1bmN0aW9uKCl7cmV0dXJuIGModGhpcy5fdmFsdWVzLHRoaXMuX2luZGV4LHRoaXMuX3B0cix0aGlzLl9zaXplLCEwKX0saS5wcm90b3R5cGUudmFsdWVPZj1mdW5jdGlvbigpe3JldHVybiBjKHRoaXMuX3ZhbHVlcyx0aGlzLl9pbmRleCx0aGlzLl9wdHIsdGhpcy5fc2l6ZSwhMSl9LGkucHJvdG90eXBlLmZvcm1hdD1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5fc2l6ZVswXSxuPXRoaXMuX3NpemVbMV0scj10aGlzLmRlbnNpdHkoKSxpPSJTcGFyc2UgTWF0cml4IFsiK2twKGUsdCkrIiB4ICIra3Aobix0KSsiXSBkZW5zaXR5OiAiK2twKHIsdCkrIlxuIixvPTA7bzxuO28rKylmb3IodmFyIHM9dGhpcy5fcHRyW29dLGE9dGhpcy5fcHRyW28rMV0sdT1zO3U8YTt1Kyspe2krPSJcbiAgICAoIitrcCh0aGlzLl9pbmRleFt1XSx0KSsiLCAiK2twKG8sdCkrIikgPT0+ICIrKHRoaXMuX3ZhbHVlcz9rcCh0aGlzLl92YWx1ZXNbdV0sdCk6IlgiKX1yZXR1cm4gaX0saS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4ga3AodGhpcy50b0FycmF5KCkpfSxpLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm57bWF0aGpzOiJTcGFyc2VNYXRyaXgiLHZhbHVlczp0aGlzLl92YWx1ZXMsaW5kZXg6dGhpcy5faW5kZXgscHRyOnRoaXMuX3B0cixzaXplOnRoaXMuX3NpemUsZGF0YXR5cGU6dGhpcy5fZGF0YXR5cGV9fSxpLnByb3RvdHlwZS5kaWFnb25hbD1mdW5jdGlvbih0KXtpZih0KXtpZihGZih0KSYmKHQ9dC50b051bWJlcigpKSwhTWYodCl8fCFTcCh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGUgcGFyYW1ldGVyIGsgbXVzdCBiZSBhbiBpbnRlZ2VyIG51bWJlciIpfWVsc2UgdD0wO3ZhciBlPXQ+MD90OjAsbj10PDA/LXQ6MCxyPXRoaXMuX3NpemVbMF0sbz10aGlzLl9zaXplWzFdLHM9TWF0aC5taW4oci1uLG8tZSksYT1bXSx1PVtdLGM9W107Y1swXT0wO2Zvcih2YXIgbD1lO2w8byYmYS5sZW5ndGg8cztsKyspZm9yKHZhciBoPXRoaXMuX3B0cltsXSxmPXRoaXMuX3B0cltsKzFdLHA9aDtwPGY7cCsrKXt2YXIgZD10aGlzLl9pbmRleFtwXTtpZihkPT09bC1lK24pe2EucHVzaCh0aGlzLl92YWx1ZXNbcF0pLHVbYS5sZW5ndGgtMV09ZC1uO2JyZWFrfX1yZXR1cm4gYy5wdXNoKGEubGVuZ3RoKSxuZXcgaSh7dmFsdWVzOmEsaW5kZXg6dSxwdHI6YyxzaXplOltzLDFdfSl9LGkuZnJvbUpTT049ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBpKHQpfSxpLmRpYWdvbmFsPWZ1bmN0aW9uKHQscixvLHMsYSl7aWYoIUJmKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFycmF5IGV4cGVjdGVkLCBzaXplIHBhcmFtZXRlciIpO2lmKDIhPT10Lmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIk9ubHkgdHdvIGRpbWVuc2lvbnMgbWF0cml4IGFyZSBzdXBwb3J0ZWQiKTtpZih0PXQubWFwKChmdW5jdGlvbih0KXtpZihGZih0KSYmKHQ9dC50b051bWJlcigpKSwhTWYodCl8fCFTcCh0KXx8dDwxKXRocm93IG5ldyBFcnJvcigiU2l6ZSB2YWx1ZXMgbXVzdCBiZSBwb3NpdGl2ZSBpbnRlZ2VycyIpO3JldHVybiB0fSkpLG8pe2lmKEZmKG8pJiYobz1vLnRvTnVtYmVyKCkpLCFNZihvKXx8IVNwKG8pKXRocm93IG5ldyBUeXBlRXJyb3IoIlRoZSBwYXJhbWV0ZXIgayBtdXN0IGJlIGFuIGludGVnZXIgbnVtYmVyIil9ZWxzZSBvPTA7dmFyIHU9bixjPTA7UmYoYSkmJih1PWUuZmluZChuLFthLGFdKXx8bixjPWUuY29udmVydCgwLGEpKTt2YXIgbCxoPW8+MD9vOjAsZj1vPDA/LW86MCxwPXRbMF0sZD10WzFdLGc9TWF0aC5taW4ocC1mLGQtaCk7aWYoQmYocikpe2lmKHIubGVuZ3RoIT09Zyl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgdmFsdWUgYXJyYXkgbGVuZ3RoIik7bD1mdW5jdGlvbih0KXtyZXR1cm4gclt0XX19ZWxzZSBpZihrZihyKSl7dmFyIHk9ci5zaXplKCk7aWYoMSE9PXkubGVuZ3RofHx5WzBdIT09Zyl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgbWF0cml4IGxlbmd0aCIpO2w9ZnVuY3Rpb24odCl7cmV0dXJuIHIuZ2V0KFt0XSl9fWVsc2UgbD1mdW5jdGlvbigpe3JldHVybiByfTtmb3IodmFyIG09W10sdj1bXSxfPVtdLHg9MDt4PGQ7eCsrKXtfLnB1c2gobS5sZW5ndGgpO3ZhciB3PXgtaDtpZih3Pj0wJiZ3PGcpe3ZhciBiPWwodyk7dShiLGMpfHwodi5wdXNoKHcrZiksbS5wdXNoKGIpKX19cmV0dXJuIF8ucHVzaChtLmxlbmd0aCksbmV3IGkoe3ZhbHVlczptLGluZGV4OnYscHRyOl8sc2l6ZTpbcCxkXX0pfSxpLnByb3RvdHlwZS5zd2FwUm93cz1mdW5jdGlvbih0LGUpe2lmKCEoTWYodCkmJlNwKHQpJiZNZihlKSYmU3AoZSkpKXRocm93IG5ldyBFcnJvcigiUm93IGluZGV4IG11c3QgYmUgcG9zaXRpdmUgaW50ZWdlcnMiKTtpZigyIT09dGhpcy5fc2l6ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJPbmx5IHR3byBkaW1lbnNpb25hbCBtYXRyaXggaXMgc3VwcG9ydGVkIik7cmV0dXJuIFlwKHQsdGhpcy5fc2l6ZVswXSksWXAoZSx0aGlzLl9zaXplWzBdKSxpLl9zd2FwUm93cyh0LGUsdGhpcy5fc2l6ZVsxXSx0aGlzLl92YWx1ZXMsdGhpcy5faW5kZXgsdGhpcy5fcHRyKSx0aGlzfSxpLl9mb3JFYWNoUm93PWZ1bmN0aW9uKHQsZSxuLHIsaSl7Zm9yKHZhciBvPXJbdF0scz1yW3QrMV0sYT1vO2E8czthKyspaShuW2FdLGVbYV0pfSxpLl9zd2FwUm93cz1mdW5jdGlvbih0LGUsbixyLGksbyl7Zm9yKHZhciBhPTA7YTxuO2ErKyl7dmFyIHU9b1thXSxjPW9bYSsxXSxsPXModCx1LGMsaSksaD1zKGUsdSxjLGkpO2lmKGw8YyYmaDxjJiZpW2xdPT09dCYmaVtoXT09PWUpe2lmKHIpe3ZhciBmPXJbbF07cltsXT1yW2hdLHJbaF09Zn19ZWxzZSBpZihsPGMmJmlbbF09PT10JiYoaD49Y3x8aVtoXSE9PWUpKXt2YXIgcD1yP3JbbF06dm9pZCAwO2kuc3BsaWNlKGgsMCxlKSxyJiZyLnNwbGljZShoLDAscCksaS5zcGxpY2UoaDw9bD9sKzE6bCwxKSxyJiZyLnNwbGljZShoPD1sP2wrMTpsLDEpfWVsc2UgaWYoaDxjJiZpW2hdPT09ZSYmKGw+PWN8fGlbbF0hPT10KSl7dmFyIGQ9cj9yW2hdOnZvaWQgMDtpLnNwbGljZShsLDAsdCksciYmci5zcGxpY2UobCwwLGQpLGkuc3BsaWNlKGw8PWg/aCsxOmgsMSksciYmci5zcGxpY2UobDw9aD9oKzE6aCwxKX19fSxpfSkse2lzQ2xhc3M6ITB9KTt2YXIgRnk9dGQoIm51bWJlciIsWyJ0eXBlZCJdLCh0PT57dmFye3R5cGVkOmV9PXQsbj1lKCJudW1iZXIiLHsiIjpmdW5jdGlvbigpe3JldHVybiAwfSxudW1iZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHR9LHN0cmluZzpmdW5jdGlvbih0KXtpZigiTmFOIj09PXQpcmV0dXJuIE5hTjt2YXIgZT1mdW5jdGlvbih0KXt2YXIgZT10Lm1hdGNoKC8oMFtib3hdKShbMC05YS1mQS1GXSopXC4oWzAtOWEtZkEtRl0qKS8pO3JldHVybiBlP3tpbnB1dDp0LHJhZGl4OnsiMGIiOjIsIjBvIjo4LCIweCI6MTZ9W2VbMV1dLGludGVnZXJQYXJ0OmVbMl0sZnJhY3Rpb25hbFBhcnQ6ZVszXX06bnVsbH0odCk7aWYoZSlyZXR1cm4gZnVuY3Rpb24odCl7Zm9yKHZhciBlPXBhcnNlSW50KHQuaW50ZWdlclBhcnQsdC5yYWRpeCksbj0wLHI9MDtyPHQuZnJhY3Rpb25hbFBhcnQubGVuZ3RoO3IrKyluKz1wYXJzZUludCh0LmZyYWN0aW9uYWxQYXJ0W3JdLHQucmFkaXgpL01hdGgucG93KHQucmFkaXgscisxKTt2YXIgaT1lK247aWYoaXNOYU4oaSkpdGhyb3cgbmV3IFN5bnRheEVycm9yKCdTdHJpbmcgIicrdC5pbnB1dCsnIiBpcyBubyB2YWxpZCBudW1iZXInKTtyZXR1cm4gaX0oZSk7dmFyIG49MCxyPXQubWF0Y2goLygwW2JveF1bMC05YS1mQS1GXSopaShbMC05XSopLyk7ciYmKG49TnVtYmVyKHJbMl0pLHQ9clsxXSk7dmFyIGk9TnVtYmVyKHQpO2lmKGlzTmFOKGkpKXRocm93IG5ldyBTeW50YXhFcnJvcignU3RyaW5nICInK3QrJyIgaXMgbm8gdmFsaWQgbnVtYmVyJyk7aWYocil7aWYoaT5QZigyLG4pLTEpdGhyb3cgbmV3IFN5bnRheEVycm9yKCdTdHJpbmcgIicuY29uY2F0KHQsJyIgaXMgb3V0IG9mIHJhbmdlJykpO2k+PVBmKDIsbi0xKSYmKGktPVBmKDIsbikpfXJldHVybiBpfSxCaWdOdW1iZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQudG9OdW1iZXIoKX0sRnJhY3Rpb246ZnVuY3Rpb24odCl7cmV0dXJuIHQudmFsdWVPZigpfSxVbml0OmUucmVmZXJUb1NlbGYoKHQ9PmU9Pnt2YXIgbj1lLmNsb25lKCk7cmV0dXJuIG4udmFsdWU9dChlLnZhbHVlKSxufSkpLG51bGw6ZnVuY3Rpb24odCl7cmV0dXJuIDB9LCJVbml0LCBzdHJpbmcgfCBVbml0IjpmdW5jdGlvbih0LGUpe3JldHVybiB0LnRvTnVtYmVyKGUpfSwiQXJyYXkgfCBNYXRyaXgiOmUucmVmZXJUb1NlbGYoKHQ9PmU9Pnh5KGUsdCkpKX0pO3JldHVybiBuLmZyb21KU09OPWZ1bmN0aW9uKHQpe3JldHVybiBwYXJzZUZsb2F0KHQudmFsdWUpfSxufSkpLFR5PXRkKCJiaWdudW1iZXIiLFsidHlwZWQiLCJCaWdOdW1iZXIiXSwodD0+e3Zhcnt0eXBlZDplLEJpZ051bWJlcjpufT10O3JldHVybiBlKCJiaWdudW1iZXIiLHsiIjpmdW5jdGlvbigpe3JldHVybiBuZXcgbigwKX0sbnVtYmVyOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgbih0KyIiKX0sc3RyaW5nOmZ1bmN0aW9uKHQpe3ZhciBlPXQubWF0Y2goLygwW2JveF1bMC05YS1mQS1GXSopaShbMC05XSopLyk7aWYoZSl7dmFyIHI9ZVsyXSxpPW4oZVsxXSksbz1uZXcgbigyKS5wb3coTnVtYmVyKHIpKTtpZihpLmd0KG8uc3ViKDEpKSl0aHJvdyBuZXcgU3ludGF4RXJyb3IoJ1N0cmluZyAiJy5jb25jYXQodCwnIiBpcyBvdXQgb2YgcmFuZ2UnKSk7dmFyIHM9bmV3IG4oMikucG93KE51bWJlcihyKS0xKTtyZXR1cm4gaS5ndGUocyk/aS5zdWIobyk6aX1yZXR1cm4gbmV3IG4odCl9LEJpZ051bWJlcjpmdW5jdGlvbih0KXtyZXR1cm4gdH0sVW5pdDplLnJlZmVyVG9TZWxmKCh0PT5lPT57dmFyIG49ZS5jbG9uZSgpO3JldHVybiBuLnZhbHVlPXQoZS52YWx1ZSksbn0pKSxGcmFjdGlvbjpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IG4odC5uKS5kaXYodC5kKS50aW1lcyh0LnMpfSxudWxsOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgbigwKX0sIkFycmF5IHwgTWF0cml4IjplLnJlZmVyVG9TZWxmKCh0PT5lPT54eShlLHQpKSl9KX0pKSxPeT10ZCgiZnJhY3Rpb24iLFsidHlwZWQiLCJGcmFjdGlvbiJdLCh0PT57dmFye3R5cGVkOmUsRnJhY3Rpb246bn09dDtyZXR1cm4gZSgiZnJhY3Rpb24iLHtudW1iZXI6ZnVuY3Rpb24odCl7aWYoIWlzRmluaXRlKHQpfHxpc05hTih0KSl0aHJvdyBuZXcgRXJyb3IodCsiIGNhbm5vdCBiZSByZXByZXNlbnRlZCBhcyBhIGZyYWN0aW9uIik7cmV0dXJuIG5ldyBuKHQpfSxzdHJpbmc6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBuKHQpfSwibnVtYmVyLCBudW1iZXIiOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBuKHQsZSl9LG51bGw6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBuKDApfSxCaWdOdW1iZXI6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBuKHQudG9TdHJpbmcoKSl9LEZyYWN0aW9uOmZ1bmN0aW9uKHQpe3JldHVybiB0fSxVbml0OmUucmVmZXJUb1NlbGYoKHQ9PmU9Pnt2YXIgbj1lLmNsb25lKCk7cmV0dXJuIG4udmFsdWU9dChlLnZhbHVlKSxufSkpLE9iamVjdDpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IG4odCl9LCJBcnJheSB8IE1hdHJpeCI6ZS5yZWZlclRvU2VsZigodD0+ZT0+eHkoZSx0KSkpfSl9KSksTHk9Im1hdHJpeCIsUHk9dGQoTHksWyJ0eXBlZCIsIk1hdHJpeCIsIkRlbnNlTWF0cml4IiwiU3BhcnNlTWF0cml4Il0sKHQ9Pnt2YXJ7dHlwZWQ6ZSxNYXRyaXg6bixEZW5zZU1hdHJpeDpyLFNwYXJzZU1hdHJpeDppfT10O3JldHVybiBlKEx5LHsiIjpmdW5jdGlvbigpe3JldHVybiBvKFtdKX0sc3RyaW5nOmZ1bmN0aW9uKHQpe3JldHVybiBvKFtdLHQpfSwic3RyaW5nLCBzdHJpbmciOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIG8oW10sdCxlKX0sQXJyYXk6ZnVuY3Rpb24odCl7cmV0dXJuIG8odCl9LE1hdHJpeDpmdW5jdGlvbih0KXtyZXR1cm4gbyh0LHQuc3RvcmFnZSgpKX0sIkFycmF5IHwgTWF0cml4LCBzdHJpbmciOm8sIkFycmF5IHwgTWF0cml4LCBzdHJpbmcsIHN0cmluZyI6b30pO2Z1bmN0aW9uIG8odCxlLG4pe2lmKCJkZW5zZSI9PT1lfHwiZGVmYXVsdCI9PT1lfHx2b2lkIDA9PT1lKXJldHVybiBuZXcgcih0LG4pO2lmKCJzcGFyc2UiPT09ZSlyZXR1cm4gbmV3IGkodCxuKTt0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIG1hdHJpeCB0eXBlICIrSlNPTi5zdHJpbmdpZnkoZSkrIi4iKX19KSksUnk9ImFkZFNjYWxhciIsQnk9dGQoUnksWyJ0eXBlZCJdLCh0PT57dmFye3R5cGVkOmV9PXQ7cmV0dXJuIGUoUnkseyJudW1iZXIsIG51bWJlciI6RXksIkNvbXBsZXgsIENvbXBsZXgiOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuYWRkKGUpfSwiQmlnTnVtYmVyLCBCaWdOdW1iZXIiOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQucGx1cyhlKX0sIkZyYWN0aW9uLCBGcmFjdGlvbiI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5hZGQoZSl9LCJVbml0LCBVbml0IjplLnJlZmVyVG9TZWxmKCh0PT4obixyKT0+e2lmKG51bGw9PT1uLnZhbHVlfHx2b2lkIDA9PT1uLnZhbHVlKXRocm93IG5ldyBFcnJvcigiUGFyYW1ldGVyIHggY29udGFpbnMgYSB1bml0IHdpdGggdW5kZWZpbmVkIHZhbHVlIik7aWYobnVsbD09PXIudmFsdWV8fHZvaWQgMD09PXIudmFsdWUpdGhyb3cgbmV3IEVycm9yKCJQYXJhbWV0ZXIgeSBjb250YWlucyBhIHVuaXQgd2l0aCB1bmRlZmluZWQgdmFsdWUiKTtpZighbi5lcXVhbEJhc2UocikpdGhyb3cgbmV3IEVycm9yKCJVbml0cyBkbyBub3QgbWF0Y2giKTt2YXIgaT1uLmNsb25lKCk7cmV0dXJuIGkudmFsdWU9ZS5maW5kKHQsW2kudmFsdWVUeXBlKCksci52YWx1ZVR5cGUoKV0pKGkudmFsdWUsci52YWx1ZSksaS5maXhQcmVmaXg9ITEsaX0pKX0pfSkpLGt5PXRkKCJtYXRBbGdvMTF4UzBzIixbInR5cGVkIiwiZXF1YWxTY2FsYXIiXSwodD0+e3Zhcnt0eXBlZDplLGVxdWFsU2NhbGFyOm59PXQ7cmV0dXJuIGZ1bmN0aW9uKHQscixpLG8pe3ZhciBzPXQuX3ZhbHVlcyxhPXQuX2luZGV4LHU9dC5fcHRyLGM9dC5fc2l6ZSxsPXQuX2RhdGF0eXBlO2lmKCFzKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IHBlcmZvcm0gb3BlcmF0aW9uIG9uIFBhdHRlcm4gU3BhcnNlIE1hdHJpeCBhbmQgU2NhbGFyIHZhbHVlIik7dmFyIGgsZj1jWzBdLHA9Y1sxXSxkPW4sZz0wLHk9aTsic3RyaW5nIj09dHlwZW9mIGwmJihoPWwsZD1lLmZpbmQobixbaCxoXSksZz1lLmNvbnZlcnQoMCxoKSxyPWUuY29udmVydChyLGgpLHk9ZS5maW5kKGksW2gsaF0pKTtmb3IodmFyIG09W10sdj1bXSxfPVtdLHg9MDt4PHA7eCsrKXtfW3hdPXYubGVuZ3RoO2Zvcih2YXIgdz11W3hdLGI9dVt4KzFdLEQ9dztEPGI7RCsrKXt2YXIgRT1hW0RdLEM9bz95KHIsc1tEXSk6eShzW0RdLHIpO2QoQyxnKXx8KHYucHVzaChFKSxtLnB1c2goQykpfX1yZXR1cm4gX1twXT12Lmxlbmd0aCx0LmNyZWF0ZVNwYXJzZU1hdHJpeCh7dmFsdWVzOm0saW5kZXg6dixwdHI6XyxzaXplOltmLHBdLGRhdGF0eXBlOmh9KX19KSksenk9dGQoIm1hdEFsZ28xMnhTZnMiLFsidHlwZWQiLCJEZW5zZU1hdHJpeCJdLCh0PT57dmFye3R5cGVkOmUsRGVuc2VNYXRyaXg6bn09dDtyZXR1cm4gZnVuY3Rpb24odCxyLGksbyl7dmFyIHM9dC5fdmFsdWVzLGE9dC5faW5kZXgsdT10Ll9wdHIsYz10Ll9zaXplLGw9dC5fZGF0YXR5cGU7aWYoIXMpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgcGVyZm9ybSBvcGVyYXRpb24gb24gUGF0dGVybiBTcGFyc2UgTWF0cml4IGFuZCBTY2FsYXIgdmFsdWUiKTt2YXIgaCxmPWNbMF0scD1jWzFdLGQ9aTsic3RyaW5nIj09dHlwZW9mIGwmJihoPWwscj1lLmNvbnZlcnQocixoKSxkPWUuZmluZChpLFtoLGhdKSk7Zm9yKHZhciBnPVtdLHk9W10sbT1bXSx2PTA7djxwO3YrKyl7Zm9yKHZhciBfPXYrMSx4PXVbdl0sdz11W3YrMV0sYj14O2I8dztiKyspe3ZhciBEPWFbYl07eVtEXT1zW2JdLG1bRF09X31mb3IodmFyIEU9MDtFPGY7RSsrKTA9PT12JiYoZ1tFXT1bXSksbVtFXT09PV8/Z1tFXVt2XT1vP2Qocix5W0VdKTpkKHlbRV0scik6Z1tFXVt2XT1vP2QociwwKTpkKDAscil9cmV0dXJuIG5ldyBuKHtkYXRhOmcsc2l6ZTpbZixwXSxkYXRhdHlwZTpofSl9fSkpLGp5PXRkKCJtYXRBbGdvMTR4RHMiLFsidHlwZWQiXSwodD0+e3Zhcnt0eXBlZDplfT10O3JldHVybiBmdW5jdGlvbih0LHIsaSxvKXt2YXIgcyxhPXQuX2RhdGEsdT10Ll9zaXplLGM9dC5fZGF0YXR5cGUsbD1pOyJzdHJpbmciPT10eXBlb2YgYyYmKHM9YyxyPWUuY29udmVydChyLHMpLGw9ZS5maW5kKGksW3Msc10pKTt2YXIgaD11Lmxlbmd0aD4wP24obCwwLHUsdVswXSxhLHIsbyk6W107cmV0dXJuIHQuY3JlYXRlRGVuc2VNYXRyaXgoe2RhdGE6aCxzaXplOm1wKHUpLGRhdGF0eXBlOnN9KX07ZnVuY3Rpb24gbih0LGUscixpLG8scyxhKXt2YXIgdT1bXTtpZihlPT09ci5sZW5ndGgtMSlmb3IodmFyIGM9MDtjPGk7YysrKXVbY109YT90KHMsb1tjXSk6dChvW2NdLHMpO2Vsc2UgZm9yKHZhciBsPTA7bDxpO2wrKyl1W2xdPW4odCxlKzEscixyW2UrMV0sb1tsXSxzLGEpO3JldHVybiB1fX0pKSxVeT10ZCgibWF0QWxnbzAxeERTaWQiLFsidHlwZWQiXSwodD0+e3Zhcnt0eXBlZDplfT10O3JldHVybiBmdW5jdGlvbih0LG4scixpKXt2YXIgbz10Ll9kYXRhLHM9dC5fc2l6ZSxhPXQuX2RhdGF0eXBlLHU9bi5fdmFsdWVzLGM9bi5faW5kZXgsbD1uLl9wdHIsaD1uLl9zaXplLGY9bi5fZGF0YXR5cGU7aWYocy5sZW5ndGghPT1oLmxlbmd0aCl0aHJvdyBuZXcganAocy5sZW5ndGgsaC5sZW5ndGgpO2lmKHNbMF0hPT1oWzBdfHxzWzFdIT09aFsxXSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiRGltZW5zaW9uIG1pc21hdGNoLiBNYXRyaXggQSAoIitzKyIpIG11c3QgbWF0Y2ggTWF0cml4IEIgKCIraCsiKSIpO2lmKCF1KXRocm93IG5ldyBFcnJvcigiQ2Fubm90IHBlcmZvcm0gb3BlcmF0aW9uIG9uIERlbnNlIE1hdHJpeCBhbmQgUGF0dGVybiBTcGFyc2UgTWF0cml4Iik7dmFyIHAsZCxnPXNbMF0seT1zWzFdLG09InN0cmluZyI9PXR5cGVvZiBhJiZhPT09Zj9hOnZvaWQgMCx2PW0/ZS5maW5kKHIsW20sbV0pOnIsXz1bXTtmb3IocD0wO3A8ZztwKyspX1twXT1bXTt2YXIgeD1bXSx3PVtdO2ZvcihkPTA7ZDx5O2QrKyl7Zm9yKHZhciBiPWQrMSxEPWxbZF0sRT1sW2QrMV0sQz1EO0M8RTtDKyspeFtwPWNbQ11dPWk/dih1W0NdLG9bcF1bZF0pOnYob1twXVtkXSx1W0NdKSx3W3BdPWI7Zm9yKHA9MDtwPGc7cCsrKXdbcF09PT1iP19bcF1bZF09eFtwXTpfW3BdW2RdPW9bcF1bZF19cmV0dXJuIHQuY3JlYXRlRGVuc2VNYXRyaXgoe2RhdGE6XyxzaXplOltnLHldLGRhdGF0eXBlOm19KX19KSkscXk9dGQoIm1hdEFsZ28wNHhTaWRTaWQiLFsidHlwZWQiLCJlcXVhbFNjYWxhciJdLCh0PT57dmFye3R5cGVkOmUsZXF1YWxTY2FsYXI6bn09dDtyZXR1cm4gZnVuY3Rpb24odCxyLGkpe3ZhciBvPXQuX3ZhbHVlcyxzPXQuX2luZGV4LGE9dC5fcHRyLHU9dC5fc2l6ZSxjPXQuX2RhdGF0eXBlLGw9ci5fdmFsdWVzLGg9ci5faW5kZXgsZj1yLl9wdHIscD1yLl9zaXplLGQ9ci5fZGF0YXR5cGU7aWYodS5sZW5ndGghPT1wLmxlbmd0aCl0aHJvdyBuZXcganAodS5sZW5ndGgscC5sZW5ndGgpO2lmKHVbMF0hPT1wWzBdfHx1WzFdIT09cFsxXSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiRGltZW5zaW9uIG1pc21hdGNoLiBNYXRyaXggQSAoIit1KyIpIG11c3QgbWF0Y2ggTWF0cml4IEIgKCIrcCsiKSIpO3ZhciBnLHk9dVswXSxtPXVbMV0sdj1uLF89MCx4PWk7InN0cmluZyI9PXR5cGVvZiBjJiZjPT09ZCYmKGc9Yyx2PWUuZmluZChuLFtnLGddKSxfPWUuY29udmVydCgwLGcpLHg9ZS5maW5kKGksW2csZ10pKTt2YXIgdyxiLEQsRSxDLFM9byYmbD9bXTp2b2lkIDAsQT1bXSxOPVtdLEk9byYmbD9bXTp2b2lkIDAsTT1vJiZsP1tdOnZvaWQgMCxGPVtdLFQ9W107Zm9yKGI9MDtiPG07YisrKXtOW2JdPUEubGVuZ3RoO3ZhciBPPWIrMTtmb3IoRT1hW2JdLEM9YVtiKzFdLEQ9RTtEPEM7RCsrKXc9c1tEXSxBLnB1c2godyksRlt3XT1PLEkmJihJW3ddPW9bRF0pO2ZvcihFPWZbYl0sQz1mW2IrMV0sRD1FO0Q8QztEKyspaWYoRlt3PWhbRF1dPT09Tyl7aWYoSSl7dmFyIEw9eChJW3ddLGxbRF0pO3YoTCxfKT9GW3ddPW51bGw6SVt3XT1MfX1lbHNlIEEucHVzaCh3KSxUW3ddPU8sTSYmKE1bd109bFtEXSk7aWYoSSYmTSlmb3IoRD1OW2JdO0Q8QS5sZW5ndGg7KUZbdz1BW0RdXT09PU8/KFNbRF09SVt3XSxEKyspOlRbd109PT1PPyhTW0RdPU1bd10sRCsrKTpBLnNwbGljZShELDEpfXJldHVybiBOW21dPUEubGVuZ3RoLHQuY3JlYXRlU3BhcnNlTWF0cml4KHt2YWx1ZXM6UyxpbmRleDpBLHB0cjpOLHNpemU6W3ksbV0sZGF0YXR5cGU6Z30pfX0pKSxWeT10ZCgibWF0QWxnbzEweFNpZHMiLFsidHlwZWQiLCJEZW5zZU1hdHJpeCJdLCh0PT57dmFye3R5cGVkOmUsRGVuc2VNYXRyaXg6bn09dDtyZXR1cm4gZnVuY3Rpb24odCxyLGksbyl7dmFyIHM9dC5fdmFsdWVzLGE9dC5faW5kZXgsdT10Ll9wdHIsYz10Ll9zaXplLGw9dC5fZGF0YXR5cGU7aWYoIXMpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgcGVyZm9ybSBvcGVyYXRpb24gb24gUGF0dGVybiBTcGFyc2UgTWF0cml4IGFuZCBTY2FsYXIgdmFsdWUiKTt2YXIgaCxmPWNbMF0scD1jWzFdLGQ9aTsic3RyaW5nIj09dHlwZW9mIGwmJihoPWwscj1lLmNvbnZlcnQocixoKSxkPWUuZmluZChpLFtoLGhdKSk7Zm9yKHZhciBnPVtdLHk9W10sbT1bXSx2PTA7djxwO3YrKyl7Zm9yKHZhciBfPXYrMSx4PXVbdl0sdz11W3YrMV0sYj14O2I8dztiKyspe3ZhciBEPWFbYl07eVtEXT1zW2JdLG1bRF09X31mb3IodmFyIEU9MDtFPGY7RSsrKTA9PT12JiYoZ1tFXT1bXSksbVtFXT09PV8/Z1tFXVt2XT1vP2Qocix5W0VdKTpkKHlbRV0scik6Z1tFXVt2XT1yfXJldHVybiBuZXcgbih7ZGF0YTpnLHNpemU6W2YscF0sZGF0YXR5cGU6aH0pfX0pKSxHeT10ZCgibWF0QWxnbzEzeEREIixbInR5cGVkIl0sKHQ9Pnt2YXJ7dHlwZWQ6ZX09dDtyZXR1cm4gZnVuY3Rpb24odCxyLGkpe3ZhciBvPXQuX2RhdGEscz10Ll9zaXplLGE9dC5fZGF0YXR5cGUsdT1yLl9kYXRhLGM9ci5fc2l6ZSxsPXIuX2RhdGF0eXBlLGg9W107aWYocy5sZW5ndGghPT1jLmxlbmd0aCl0aHJvdyBuZXcganAocy5sZW5ndGgsYy5sZW5ndGgpO2Zvcih2YXIgZj0wO2Y8cy5sZW5ndGg7ZisrKXtpZihzW2ZdIT09Y1tmXSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiRGltZW5zaW9uIG1pc21hdGNoLiBNYXRyaXggQSAoIitzKyIpIG11c3QgbWF0Y2ggTWF0cml4IEIgKCIrYysiKSIpO2hbZl09c1tmXX12YXIgcCxkPWk7InN0cmluZyI9PXR5cGVvZiBhJiZhPT09bCYmKHA9YSxkPWUuZmluZChpLFtwLHBdKSk7dmFyIGc9aC5sZW5ndGg+MD9uKGQsMCxoLGhbMF0sbyx1KTpbXTtyZXR1cm4gdC5jcmVhdGVEZW5zZU1hdHJpeCh7ZGF0YTpnLHNpemU6aCxkYXRhdHlwZTpwfSl9O2Z1bmN0aW9uIG4odCxlLHIsaSxvLHMpe3ZhciBhPVtdO2lmKGU9PT1yLmxlbmd0aC0xKWZvcih2YXIgdT0wO3U8aTt1KyspYVt1XT10KG9bdV0sc1t1XSk7ZWxzZSBmb3IodmFyIGM9MDtjPGk7YysrKWFbY109bih0LGUrMSxyLHJbZSsxXSxvW2NdLHNbY10pO3JldHVybiBhfX0pKSxZeT10ZCgiYnJvYWRjYXN0IixbImNvbmNhdCJdLCh0PT57dmFye2NvbmNhdDplfT10O3JldHVybiBmdW5jdGlvbih0LGUpe3ZhciBvPU1hdGgubWF4KHQuX3NpemUubGVuZ3RoLGUuX3NpemUubGVuZ3RoKTtpZih0Ll9zaXplLmxlbmd0aD09PWUuX3NpemUubGVuZ3RoJiZ0Ll9zaXplLmV2ZXJ5KCgodCxuKT0+dD09PWUuX3NpemVbbl0pKSlyZXR1cm5bdCxlXTtmb3IodmFyIHM9bih0Ll9zaXplLG8sMCksYT1uKGUuX3NpemUsbywwKSx1PVtdLGM9MDtjPG87YysrKXVbY109TWF0aC5tYXgoc1tjXSxhW2NdKTtmb3IodmFyIGw9MDtsPG87bCsrKWkocyx1LGwpLGkoYSx1LGwpO3ZhciBoPXQuY2xvbmUoKSxmPWUuY2xvbmUoKTtoLl9zaXplLmxlbmd0aDxvP2gucmVzaGFwZShuKGguX3NpemUsbywxKSk6Zi5fc2l6ZS5sZW5ndGg8byYmZi5yZXNoYXBlKG4oZi5fc2l6ZSxvLDEpKTtmb3IodmFyIHA9MDtwPG87cCsrKWguX3NpemVbcF08dVtwXSYmKGg9cihoLHVbcF0scCkpLGYuX3NpemVbcF08dVtwXSYmKGY9cihmLHVbcF0scCkpO3JldHVybltoLGZdfTtmdW5jdGlvbiBuKHQsZSxuKXtyZXR1cm5bLi4uQXJyYXkoZS10Lmxlbmd0aCkuZmlsbChuKSwuLi50XX1mdW5jdGlvbiByKHQsbixyKXtyZXR1cm4gZSguLi5BcnJheShuKS5maWxsKHQpLHIpfWZ1bmN0aW9uIGkodCxlLG4pe2lmKHRbbl08ZVtuXSZ0W25dPjEpdGhyb3cgbmV3IEVycm9yKCJzaGFwZSBtaXNzbWF0Y2g6IG1pc3NtYXRjaCBpcyBmb3VuZCBpbiBhcmcgd2l0aCBzaGFwZSAoIi5jb25jYXQodCwiKSBub3QgcG9zc2libGUgdG8gYnJvYWRjYXN0IGRpbWVuc2lvbiAiKS5jb25jYXQobiwiIHdpdGggc2l6ZSAiKS5jb25jYXQodFtuXSwiIHRvIHNpemUgIikuY29uY2F0KGVbbl0pKX19KSksWHk9dGQoIm1hdHJpeEFsZ29yaXRobVN1aXRlIixbInR5cGVkIiwibWF0cml4IiwiY29uY2F0Il0sKHQ9Pnt2YXJ7dHlwZWQ6ZSxtYXRyaXg6bixjb25jYXQ6cn09dCxpPUd5KHt0eXBlZDplfSksbz1qeSh7dHlwZWQ6ZX0pLHM9WXkoe2NvbmNhdDpyfSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciByLGE9dC5lbG9wLHU9dC5TRHx8dC5EUzthPyhyPXsiRGVuc2VNYXRyaXgsIERlbnNlTWF0cml4IjoodCxlKT0+aSguLi5zKHQsZSksYSksIkFycmF5LCBBcnJheSI6KHQsZSk9PmkoLi4ucyhuKHQpLG4oZSkpLGEpLnZhbHVlT2YoKSwiQXJyYXksIERlbnNlTWF0cml4IjoodCxlKT0+aSguLi5zKG4odCksZSksYSksIkRlbnNlTWF0cml4LCBBcnJheSI6KHQsZSk9PmkoLi4ucyh0LG4oZSkpLGEpfSx0LlNTJiYoclsiU3BhcnNlTWF0cml4LCBTcGFyc2VNYXRyaXgiXT0oZSxuKT0+dC5TUyguLi5zKGUsbiksYSwhMSkpLHQuRFMmJihyWyJEZW5zZU1hdHJpeCwgU3BhcnNlTWF0cml4Il09KGUsbik9PnQuRFMoLi4ucyhlLG4pLGEsITEpLHJbIkFycmF5LCBTcGFyc2VNYXRyaXgiXT0oZSxyKT0+dC5EUyguLi5zKG4oZSksciksYSwhMSkpLHUmJihyWyJTcGFyc2VNYXRyaXgsIERlbnNlTWF0cml4Il09KHQsZSk9PnUoLi4ucyhlLHQpLGEsITApLHJbIlNwYXJzZU1hdHJpeCwgQXJyYXkiXT0odCxlKT0+dSguLi5zKG4oZSksdCksYSwhMCkpKToocj17IkRlbnNlTWF0cml4LCBEZW5zZU1hdHJpeCI6ZS5yZWZlclRvU2VsZigodD0+KGUsbik9PmkoLi4ucyhlLG4pLHQpKSksIkFycmF5LCBBcnJheSI6ZS5yZWZlclRvU2VsZigodD0+KGUscik9PmkoLi4ucyhuKGUpLG4ocikpLHQpLnZhbHVlT2YoKSkpLCJBcnJheSwgRGVuc2VNYXRyaXgiOmUucmVmZXJUb1NlbGYoKHQ9PihlLHIpPT5pKC4uLnMobihlKSxyKSx0KSkpLCJEZW5zZU1hdHJpeCwgQXJyYXkiOmUucmVmZXJUb1NlbGYoKHQ9PihlLHIpPT5pKC4uLnMoZSxuKHIpKSx0KSkpfSx0LlNTJiYoclsiU3BhcnNlTWF0cml4LCBTcGFyc2VNYXRyaXgiXT1lLnJlZmVyVG9TZWxmKChlPT4obixyKT0+dC5TUyguLi5zKG4sciksZSwhMSkpKSksdC5EUyYmKHJbIkRlbnNlTWF0cml4LCBTcGFyc2VNYXRyaXgiXT1lLnJlZmVyVG9TZWxmKChlPT4obixyKT0+dC5EUyguLi5zKG4sciksZSwhMSkpKSxyWyJBcnJheSwgU3BhcnNlTWF0cml4Il09ZS5yZWZlclRvU2VsZigoZT0+KHIsaSk9PnQuRFMoLi4ucyhuKHIpLGkpLGUsITEpKSkpLHUmJihyWyJTcGFyc2VNYXRyaXgsIERlbnNlTWF0cml4Il09ZS5yZWZlclRvU2VsZigodD0+KGUsbik9PnUoLi4ucyhuLGUpLHQsITApKSksclsiU3BhcnNlTWF0cml4LCBBcnJheSJdPWUucmVmZXJUb1NlbGYoKHQ9PihlLHIpPT51KC4uLnMobihyKSxlKSx0LCEwKSkpKSk7dmFyIGM9dC5zY2FsYXJ8fCJhbnkiOyh0LkRzfHx0LlNzKSYmKGE/KHJbIkRlbnNlTWF0cml4LCIrY109KHQsZSk9Pm8odCxlLGEsITEpLHJbYysiLCBEZW5zZU1hdHJpeCJdPSh0LGUpPT5vKGUsdCxhLCEwKSxyWyJBcnJheSwiK2NdPSh0LGUpPT5vKG4odCksZSxhLCExKS52YWx1ZU9mKCkscltjKyIsIEFycmF5Il09KHQsZSk9Pm8obihlKSx0LGEsITApLnZhbHVlT2YoKSk6KHJbIkRlbnNlTWF0cml4LCIrY109ZS5yZWZlclRvU2VsZigodD0+KGUsbik9Pm8oZSxuLHQsITEpKSkscltjKyIsIERlbnNlTWF0cml4Il09ZS5yZWZlclRvU2VsZigodD0+KGUsbik9Pm8obixlLHQsITApKSksclsiQXJyYXksIitjXT1lLnJlZmVyVG9TZWxmKCh0PT4oZSxyKT0+byhuKGUpLHIsdCwhMSkudmFsdWVPZigpKSkscltjKyIsIEFycmF5Il09ZS5yZWZlclRvU2VsZigodD0+KGUscik9Pm8obihyKSxlLHQsITApLnZhbHVlT2YoKSkpKSk7dmFyIGw9dm9pZCAwIT09dC5zUz90LnNTOnQuU3M7cmV0dXJuIGE/KHQuU3MmJihyWyJTcGFyc2VNYXRyaXgsIitjXT0oZSxuKT0+dC5TcyhlLG4sYSwhMSkpLGwmJihyW2MrIiwgU3BhcnNlTWF0cml4Il09KHQsZSk9PmwoZSx0LGEsITApKSk6KHQuU3MmJihyWyJTcGFyc2VNYXRyaXgsIitjXT1lLnJlZmVyVG9TZWxmKChlPT4obixyKT0+dC5TcyhuLHIsZSwhMSkpKSksbCYmKHJbYysiLCBTcGFyc2VNYXRyaXgiXT1lLnJlZmVyVG9TZWxmKCh0PT4oZSxuKT0+bChuLGUsdCwhMCkpKSkpLGEmJmEuc2lnbmF0dXJlcyYmZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSlfcChlLG4pJiYodFtuXT1lW25dKX0ocixhLnNpZ25hdHVyZXMpLHJ9fSkpLFd5PXRkKCJtYXRBbGdvMDJ4RFMwIixbInR5cGVkIiwiZXF1YWxTY2FsYXIiXSwodD0+e3Zhcnt0eXBlZDplLGVxdWFsU2NhbGFyOm59PXQ7cmV0dXJuIGZ1bmN0aW9uKHQscixpLG8pe3ZhciBzPXQuX2RhdGEsYT10Ll9zaXplLHU9dC5fZGF0YXR5cGUsYz1yLl92YWx1ZXMsbD1yLl9pbmRleCxoPXIuX3B0cixmPXIuX3NpemUscD1yLl9kYXRhdHlwZTtpZihhLmxlbmd0aCE9PWYubGVuZ3RoKXRocm93IG5ldyBqcChhLmxlbmd0aCxmLmxlbmd0aCk7aWYoYVswXSE9PWZbMF18fGFbMV0hPT1mWzFdKXRocm93IG5ldyBSYW5nZUVycm9yKCJEaW1lbnNpb24gbWlzbWF0Y2guIE1hdHJpeCBBICgiK2ErIikgbXVzdCBtYXRjaCBNYXRyaXggQiAoIitmKyIpIik7aWYoIWMpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgcGVyZm9ybSBvcGVyYXRpb24gb24gRGVuc2UgTWF0cml4IGFuZCBQYXR0ZXJuIFNwYXJzZSBNYXRyaXgiKTt2YXIgZCxnPWFbMF0seT1hWzFdLG09bix2PTAsXz1pOyJzdHJpbmciPT10eXBlb2YgdSYmdT09PXAmJihkPXUsbT1lLmZpbmQobixbZCxkXSksdj1lLmNvbnZlcnQoMCxkKSxfPWUuZmluZChpLFtkLGRdKSk7Zm9yKHZhciB4PVtdLHc9W10sYj1bXSxEPTA7RDx5O0QrKyl7YltEXT13Lmxlbmd0aDtmb3IodmFyIEU9aFtEXSxDPWhbRCsxXSxTPUU7UzxDO1MrKyl7dmFyIEE9bFtTXSxOPW8/XyhjW1NdLHNbQV1bRF0pOl8oc1tBXVtEXSxjW1NdKTttKE4sdil8fCh3LnB1c2goQSkseC5wdXNoKE4pKX19cmV0dXJuIGJbeV09dy5sZW5ndGgsci5jcmVhdGVTcGFyc2VNYXRyaXgoe3ZhbHVlczp4LGluZGV4OncscHRyOmIsc2l6ZTpbZyx5XSxkYXRhdHlwZTpkfSl9fSkpLEh5PXRkKCJtYXRBbGdvMDN4RFNmIixbInR5cGVkIl0sKHQ9Pnt2YXJ7dHlwZWQ6ZX09dDtyZXR1cm4gZnVuY3Rpb24odCxuLHIsaSl7dmFyIG89dC5fZGF0YSxzPXQuX3NpemUsYT10Ll9kYXRhdHlwZSx1PW4uX3ZhbHVlcyxjPW4uX2luZGV4LGw9bi5fcHRyLGg9bi5fc2l6ZSxmPW4uX2RhdGF0eXBlO2lmKHMubGVuZ3RoIT09aC5sZW5ndGgpdGhyb3cgbmV3IGpwKHMubGVuZ3RoLGgubGVuZ3RoKTtpZihzWzBdIT09aFswXXx8c1sxXSE9PWhbMV0pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkRpbWVuc2lvbiBtaXNtYXRjaC4gTWF0cml4IEEgKCIrcysiKSBtdXN0IG1hdGNoIE1hdHJpeCBCICgiK2grIikiKTtpZighdSl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBwZXJmb3JtIG9wZXJhdGlvbiBvbiBEZW5zZSBNYXRyaXggYW5kIFBhdHRlcm4gU3BhcnNlIE1hdHJpeCIpO3ZhciBwLGQ9c1swXSxnPXNbMV0seT0wLG09cjsic3RyaW5nIj09dHlwZW9mIGEmJmE9PT1mJiYocD1hLHk9ZS5jb252ZXJ0KDAscCksbT1lLmZpbmQocixbcCxwXSkpO2Zvcih2YXIgdj1bXSxfPTA7XzxkO18rKyl2W19dPVtdO2Zvcih2YXIgeD1bXSx3PVtdLGI9MDtiPGc7YisrKXtmb3IodmFyIEQ9YisxLEU9bFtiXSxDPWxbYisxXSxTPUU7UzxDO1MrKyl7dmFyIEE9Y1tTXTt4W0FdPWk/bSh1W1NdLG9bQV1bYl0pOm0ob1tBXVtiXSx1W1NdKSx3W0FdPUR9Zm9yKHZhciBOPTA7TjxkO04rKyl3W05dPT09RD92W05dW2JdPXhbTl06dltOXVtiXT1pP20oeSxvW05dW2JdKTptKG9bTl1bYl0seSl9cmV0dXJuIHQuY3JlYXRlRGVuc2VNYXRyaXgoe2RhdGE6dixzaXplOltkLGddLGRhdGF0eXBlOnB9KX19KSksWnk9dGQoIm11bHRpcGx5U2NhbGFyIixbInR5cGVkIl0sKHQ9Pnt2YXJ7dHlwZWQ6ZX09dDtyZXR1cm4gZSgibXVsdGlwbHlTY2FsYXIiLHsibnVtYmVyLCBudW1iZXIiOkN5LCJDb21wbGV4LCBDb21wbGV4IjpmdW5jdGlvbih0LGUpe3JldHVybiB0Lm11bChlKX0sIkJpZ051bWJlciwgQmlnTnVtYmVyIjpmdW5jdGlvbih0LGUpe3JldHVybiB0LnRpbWVzKGUpfSwiRnJhY3Rpb24sIEZyYWN0aW9uIjpmdW5jdGlvbih0LGUpe3JldHVybiB0Lm11bChlKX0sIm51bWJlciB8IEZyYWN0aW9uIHwgQmlnTnVtYmVyIHwgQ29tcGxleCwgVW5pdCI6KHQsZSk9PmUubXVsdGlwbHkodCksIlVuaXQsIG51bWJlciB8IEZyYWN0aW9uIHwgQmlnTnVtYmVyIHwgQ29tcGxleCB8IFVuaXQiOih0LGUpPT50Lm11bHRpcGx5KGUpfSl9KSksS3k9Im11bHRpcGx5IixKeT10ZChLeSxbInR5cGVkIiwibWF0cml4IiwiYWRkU2NhbGFyIiwibXVsdGlwbHlTY2FsYXIiLCJlcXVhbFNjYWxhciIsImRvdCJdLCh0PT57dmFye3R5cGVkOmUsbWF0cml4Om4sYWRkU2NhbGFyOnIsbXVsdGlwbHlTY2FsYXI6aSxlcXVhbFNjYWxhcjpvLGRvdDpzfT10LGE9a3koe3R5cGVkOmUsZXF1YWxTY2FsYXI6b30pLHU9ankoe3R5cGVkOmV9KTtmdW5jdGlvbiBjKHQsZSl7c3dpdGNoKHQubGVuZ3RoKXtjYXNlIDE6c3dpdGNoKGUubGVuZ3RoKXtjYXNlIDE6aWYodFswXSE9PWVbMF0pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkRpbWVuc2lvbiBtaXNtYXRjaCBpbiBtdWx0aXBsaWNhdGlvbi4gVmVjdG9ycyBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIik7YnJlYWs7Y2FzZSAyOmlmKHRbMF0hPT1lWzBdKXRocm93IG5ldyBSYW5nZUVycm9yKCJEaW1lbnNpb24gbWlzbWF0Y2ggaW4gbXVsdGlwbGljYXRpb24uIFZlY3RvciBsZW5ndGggKCIrdFswXSsiKSBtdXN0IG1hdGNoIE1hdHJpeCByb3dzICgiK2VbMF0rIikiKTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiQ2FuIG9ubHkgbXVsdGlwbHkgYSAxIG9yIDIgZGltZW5zaW9uYWwgbWF0cml4IChNYXRyaXggQiBoYXMgIitlLmxlbmd0aCsiIGRpbWVuc2lvbnMpIil9YnJlYWs7Y2FzZSAyOnN3aXRjaChlLmxlbmd0aCl7Y2FzZSAxOmlmKHRbMV0hPT1lWzBdKXRocm93IG5ldyBSYW5nZUVycm9yKCJEaW1lbnNpb24gbWlzbWF0Y2ggaW4gbXVsdGlwbGljYXRpb24uIE1hdHJpeCBjb2x1bW5zICgiK3RbMV0rIikgbXVzdCBtYXRjaCBWZWN0b3IgbGVuZ3RoICgiK2VbMF0rIikiKTticmVhaztjYXNlIDI6aWYodFsxXSE9PWVbMF0pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkRpbWVuc2lvbiBtaXNtYXRjaCBpbiBtdWx0aXBsaWNhdGlvbi4gTWF0cml4IEEgY29sdW1ucyAoIit0WzFdKyIpIG11c3QgbWF0Y2ggTWF0cml4IEIgcm93cyAoIitlWzBdKyIpIik7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIkNhbiBvbmx5IG11bHRpcGx5IGEgMSBvciAyIGRpbWVuc2lvbmFsIG1hdHJpeCAoTWF0cml4IEIgaGFzICIrZS5sZW5ndGgrIiBkaW1lbnNpb25zKSIpfWJyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJDYW4gb25seSBtdWx0aXBseSBhIDEgb3IgMiBkaW1lbnNpb25hbCBtYXRyaXggKE1hdHJpeCBBIGhhcyAiK3QubGVuZ3RoKyIgZGltZW5zaW9ucykiKX19ZnVuY3Rpb24gbCh0LG4pe2lmKCJkZW5zZSIhPT1uLnN0b3JhZ2UoKSl0aHJvdyBuZXcgRXJyb3IoIlN1cHBvcnQgZm9yIFNwYXJzZU1hdHJpeCBub3QgaW1wbGVtZW50ZWQiKTtyZXR1cm4gZnVuY3Rpb24odCxuKXt2YXIgbyxzPXQuX2RhdGEsYT10Ll9zaXplLHU9dC5fZGF0YXR5cGUsYz1uLl9kYXRhLGw9bi5fc2l6ZSxoPW4uX2RhdGF0eXBlLGY9YVswXSxwPWxbMV0sZD1yLGc9aTt1JiZoJiZ1PT09aCYmInN0cmluZyI9PXR5cGVvZiB1JiYobz11LGQ9ZS5maW5kKHIsW28sb10pLGc9ZS5maW5kKGksW28sb10pKTtmb3IodmFyIHk9W10sbT0wO208cDttKyspe2Zvcih2YXIgdj1nKHNbMF0sY1swXVttXSksXz0xO188ZjtfKyspdj1kKHYsZyhzW19dLGNbX11bbV0pKTt5W21dPXZ9cmV0dXJuIHQuY3JlYXRlRGVuc2VNYXRyaXgoe2RhdGE6eSxzaXplOltwXSxkYXRhdHlwZTpvfSl9KHQsbil9dmFyIGg9ZSgiX211bHRpcGx5TWF0cml4VmVjdG9yIix7IkRlbnNlTWF0cml4LCBhbnkiOmZ1bmN0aW9uKHQsbil7dmFyIG8scz10Ll9kYXRhLGE9dC5fc2l6ZSx1PXQuX2RhdGF0eXBlLGM9bi5fZGF0YSxsPW4uX2RhdGF0eXBlLGg9YVswXSxmPWFbMV0scD1yLGQ9aTt1JiZsJiZ1PT09bCYmInN0cmluZyI9PXR5cGVvZiB1JiYobz11LHA9ZS5maW5kKHIsW28sb10pLGQ9ZS5maW5kKGksW28sb10pKTtmb3IodmFyIGc9W10seT0wO3k8aDt5Kyspe2Zvcih2YXIgbT1zW3ldLHY9ZChtWzBdLGNbMF0pLF89MTtfPGY7XysrKXY9cCh2LGQobVtfXSxjW19dKSk7Z1t5XT12fXJldHVybiB0LmNyZWF0ZURlbnNlTWF0cml4KHtkYXRhOmcsc2l6ZTpbaF0sZGF0YXR5cGU6b30pfSwiU3BhcnNlTWF0cml4LCBhbnkiOmZ1bmN0aW9uKHQsbil7dmFyIHM9dC5fdmFsdWVzLGE9dC5faW5kZXgsdT10Ll9wdHIsYz10Ll9kYXRhdHlwZTtpZighcyl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBtdWx0aXBseSBQYXR0ZXJuIG9ubHkgTWF0cml4IHRpbWVzIERlbnNlIE1hdHJpeCIpO3ZhciBsLGg9bi5fZGF0YSxmPW4uX2RhdGF0eXBlLHA9dC5fc2l6ZVswXSxkPW4uX3NpemVbMF0sZz1bXSx5PVtdLG09W10sdj1yLF89aSx4PW8sdz0wO2MmJmYmJmM9PT1mJiYic3RyaW5nIj09dHlwZW9mIGMmJihsPWMsdj1lLmZpbmQocixbbCxsXSksXz1lLmZpbmQoaSxbbCxsXSkseD1lLmZpbmQobyxbbCxsXSksdz1lLmNvbnZlcnQoMCxsKSk7dmFyIGI9W10sRD1bXTttWzBdPTA7Zm9yKHZhciBFPTA7RTxkO0UrKyl7dmFyIEM9aFtFXTtpZigheChDLHcpKWZvcih2YXIgUz11W0VdLEE9dVtFKzFdLE49UztOPEE7TisrKXt2YXIgST1hW05dO0RbSV0/YltJXT12KGJbSV0sXyhDLHNbTl0pKTooRFtJXT0hMCx5LnB1c2goSSksYltJXT1fKEMsc1tOXSkpfX1mb3IodmFyIE09eS5sZW5ndGgsRj0wO0Y8TTtGKyspe3ZhciBUPXlbRl07Z1tGXT1iW1RdfXJldHVybiBtWzFdPXkubGVuZ3RoLHQuY3JlYXRlU3BhcnNlTWF0cml4KHt2YWx1ZXM6ZyxpbmRleDp5LHB0cjptLHNpemU6W3AsMV0sZGF0YXR5cGU6bH0pfX0pLGY9ZSgiX211bHRpcGx5TWF0cml4TWF0cml4Iix7IkRlbnNlTWF0cml4LCBEZW5zZU1hdHJpeCI6ZnVuY3Rpb24odCxuKXt2YXIgbyxzPXQuX2RhdGEsYT10Ll9zaXplLHU9dC5fZGF0YXR5cGUsYz1uLl9kYXRhLGw9bi5fc2l6ZSxoPW4uX2RhdGF0eXBlLGY9YVswXSxwPWFbMV0sZD1sWzFdLGc9cix5PWk7dSYmaCYmdT09PWgmJiJzdHJpbmciPT10eXBlb2YgdSYmKG89dSxnPWUuZmluZChyLFtvLG9dKSx5PWUuZmluZChpLFtvLG9dKSk7Zm9yKHZhciBtPVtdLHY9MDt2PGY7disrKXt2YXIgXz1zW3ZdO21bdl09W107Zm9yKHZhciB4PTA7eDxkO3grKyl7Zm9yKHZhciB3PXkoX1swXSxjWzBdW3hdKSxiPTE7YjxwO2IrKyl3PWcodyx5KF9bYl0sY1tiXVt4XSkpO21bdl1beF09d319cmV0dXJuIHQuY3JlYXRlRGVuc2VNYXRyaXgoe2RhdGE6bSxzaXplOltmLGRdLGRhdGF0eXBlOm99KX0sIkRlbnNlTWF0cml4LCBTcGFyc2VNYXRyaXgiOmZ1bmN0aW9uKHQsbil7dmFyIHM9dC5fZGF0YSxhPXQuX3NpemUsdT10Ll9kYXRhdHlwZSxjPW4uX3ZhbHVlcyxsPW4uX2luZGV4LGg9bi5fcHRyLGY9bi5fc2l6ZSxwPW4uX2RhdGF0eXBlO2lmKCFjKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IG11bHRpcGx5IERlbnNlIE1hdHJpeCB0aW1lcyBQYXR0ZXJuIG9ubHkgTWF0cml4Iik7dmFyIGQsZz1hWzBdLHk9ZlsxXSxtPXIsdj1pLF89byx4PTA7dSYmcCYmdT09PXAmJiJzdHJpbmciPT10eXBlb2YgdSYmKGQ9dSxtPWUuZmluZChyLFtkLGRdKSx2PWUuZmluZChpLFtkLGRdKSxfPWUuZmluZChvLFtkLGRdKSx4PWUuY29udmVydCgwLGQpKTtmb3IodmFyIHc9W10sYj1bXSxEPVtdLEU9bi5jcmVhdGVTcGFyc2VNYXRyaXgoe3ZhbHVlczp3LGluZGV4OmIscHRyOkQsc2l6ZTpbZyx5XSxkYXRhdHlwZTpkfSksQz0wO0M8eTtDKyspe0RbQ109Yi5sZW5ndGg7dmFyIFM9aFtDXSxBPWhbQysxXTtpZihBPlMpZm9yKHZhciBOPTAsST0wO0k8ZztJKyspe2Zvcih2YXIgTT1JKzEsRj12b2lkIDAsVD1TO1Q8QTtUKyspe3ZhciBPPWxbVF07TiE9PU0/KEY9dihzW0ldW09dLGNbVF0pLE49TSk6Rj1tKEYsdihzW0ldW09dLGNbVF0pKX1OPT09TSYmIV8oRix4KSYmKGIucHVzaChJKSx3LnB1c2goRikpfX1yZXR1cm4gRFt5XT1iLmxlbmd0aCxFfSwiU3BhcnNlTWF0cml4LCBEZW5zZU1hdHJpeCI6ZnVuY3Rpb24odCxuKXt2YXIgcz10Ll92YWx1ZXMsYT10Ll9pbmRleCx1PXQuX3B0cixjPXQuX2RhdGF0eXBlO2lmKCFzKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IG11bHRpcGx5IFBhdHRlcm4gb25seSBNYXRyaXggdGltZXMgRGVuc2UgTWF0cml4Iik7dmFyIGwsaD1uLl9kYXRhLGY9bi5fZGF0YXR5cGUscD10Ll9zaXplWzBdLGQ9bi5fc2l6ZVswXSxnPW4uX3NpemVbMV0seT1yLG09aSx2PW8sXz0wO2MmJmYmJmM9PT1mJiYic3RyaW5nIj09dHlwZW9mIGMmJihsPWMseT1lLmZpbmQocixbbCxsXSksbT1lLmZpbmQoaSxbbCxsXSksdj1lLmZpbmQobyxbbCxsXSksXz1lLmNvbnZlcnQoMCxsKSk7Zm9yKHZhciB4PVtdLHc9W10sYj1bXSxEPXQuY3JlYXRlU3BhcnNlTWF0cml4KHt2YWx1ZXM6eCxpbmRleDp3LHB0cjpiLHNpemU6W3AsZ10sZGF0YXR5cGU6bH0pLEU9W10sQz1bXSxTPTA7UzxnO1MrKyl7YltTXT13Lmxlbmd0aDtmb3IodmFyIEE9UysxLE49MDtOPGQ7TisrKXt2YXIgST1oW05dW1NdO2lmKCF2KEksXykpZm9yKHZhciBNPXVbTl0sRj11W04rMV0sVD1NO1Q8RjtUKyspe3ZhciBPPWFbVF07Q1tPXSE9PUE/KENbT109QSx3LnB1c2goTyksRVtPXT1tKEksc1tUXSkpOkVbT109eShFW09dLG0oSSxzW1RdKSl9fWZvcih2YXIgTD1iW1NdLFA9dy5sZW5ndGgsUj1MO1I8UDtSKyspe3ZhciBCPXdbUl07eFtSXT1FW0JdfX1yZXR1cm4gYltnXT13Lmxlbmd0aCxEfSwiU3BhcnNlTWF0cml4LCBTcGFyc2VNYXRyaXgiOmZ1bmN0aW9uKHQsbil7dmFyIG8scz10Ll92YWx1ZXMsYT10Ll9pbmRleCx1PXQuX3B0cixjPXQuX2RhdGF0eXBlLGw9bi5fdmFsdWVzLGg9bi5faW5kZXgsZj1uLl9wdHIscD1uLl9kYXRhdHlwZSxkPXQuX3NpemVbMF0sZz1uLl9zaXplWzFdLHk9cyYmbCxtPXIsdj1pO2MmJnAmJmM9PT1wJiYic3RyaW5nIj09dHlwZW9mIGMmJihvPWMsbT1lLmZpbmQocixbbyxvXSksdj1lLmZpbmQoaSxbbyxvXSkpO2Zvcih2YXIgXyx4LHcsYixELEUsQyxTLEE9eT9bXTp2b2lkIDAsTj1bXSxJPVtdLE09dC5jcmVhdGVTcGFyc2VNYXRyaXgoe3ZhbHVlczpBLGluZGV4Ok4scHRyOkksc2l6ZTpbZCxnXSxkYXRhdHlwZTpvfSksRj15P1tdOnZvaWQgMCxUPVtdLE89MDtPPGc7TysrKXtJW09dPU4ubGVuZ3RoO3ZhciBMPU8rMTtmb3IoRD1mW09dLEU9ZltPKzFdLGI9RDtiPEU7YisrKWlmKFM9aFtiXSx5KWZvcih4PXVbU10sdz11W1MrMV0sXz14O188dztfKyspVFtDPWFbX11dIT09TD8oVFtDXT1MLE4ucHVzaChDKSxGW0NdPXYobFtiXSxzW19dKSk6RltDXT1tKEZbQ10sdihsW2JdLHNbX10pKTtlbHNlIGZvcih4PXVbU10sdz11W1MrMV0sXz14O188dztfKyspVFtDPWFbX11dIT09TCYmKFRbQ109TCxOLnB1c2goQykpO2lmKHkpZm9yKHZhciBQPUlbT10sUj1OLmxlbmd0aCxCPVA7QjxSO0IrKyl7dmFyIGs9TltCXTtBW0JdPUZba119fXJldHVybiBJW2ddPU4ubGVuZ3RoLE19fSk7cmV0dXJuIGUoS3ksaSx7IkFycmF5LCBBcnJheSI6ZS5yZWZlclRvKCJNYXRyaXgsIE1hdHJpeCIsKHQ9PihlLHIpPT57YyhxcChlKSxxcChyKSk7dmFyIGk9dChuKGUpLG4ocikpO3JldHVybiBrZihpKT9pLnZhbHVlT2YoKTppfSkpLCJNYXRyaXgsIE1hdHJpeCI6ZnVuY3Rpb24odCxlKXt2YXIgbj10LnNpemUoKSxyPWUuc2l6ZSgpO3JldHVybiBjKG4sciksMT09PW4ubGVuZ3RoPzE9PT1yLmxlbmd0aD9mdW5jdGlvbih0LGUsbil7aWYoMD09PW4pdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgbXVsdGlwbHkgdHdvIGVtcHR5IHZlY3RvcnMiKTtyZXR1cm4gcyh0LGUpfSh0LGUsblswXSk6bCh0LGUpOjE9PT1yLmxlbmd0aD9oKHQsZSk6Zih0LGUpfSwiTWF0cml4LCBBcnJheSI6ZS5yZWZlclRvKCJNYXRyaXgsTWF0cml4IiwodD0+KGUscik9PnQoZSxuKHIpKSkpLCJBcnJheSwgTWF0cml4IjplLnJlZmVyVG9TZWxmKCh0PT4oZSxyKT0+dChuKGUsci5zdG9yYWdlKCkpLHIpKSksIlNwYXJzZU1hdHJpeCwgYW55IjpmdW5jdGlvbih0LGUpe3JldHVybiBhKHQsZSxpLCExKX0sIkRlbnNlTWF0cml4LCBhbnkiOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHUodCxlLGksITEpfSwiYW55LCBTcGFyc2VNYXRyaXgiOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGEoZSx0LGksITApfSwiYW55LCBEZW5zZU1hdHJpeCI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdShlLHQsaSwhMCl9LCJBcnJheSwgYW55IjpmdW5jdGlvbih0LGUpe3JldHVybiB1KG4odCksZSxpLCExKS52YWx1ZU9mKCl9LCJhbnksIEFycmF5IjpmdW5jdGlvbih0LGUpe3JldHVybiB1KG4oZSksdCxpLCEwKS52YWx1ZU9mKCl9LCJhbnksIGFueSI6aSwiYW55LCBhbnksIC4uLmFueSI6ZS5yZWZlclRvU2VsZigodD0+KGUsbixyKT0+e2Zvcih2YXIgaT10KGUsbiksbz0wO288ci5sZW5ndGg7bysrKWk9dChpLHJbb10pO3JldHVybiBpfSkpfSl9KSksUXk9dGQoIm1hdEFsZ28wOXhTMFNmIixbInR5cGVkIiwiZXF1YWxTY2FsYXIiXSwodD0+e3Zhcnt0eXBlZDplLGVxdWFsU2NhbGFyOm59PXQ7cmV0dXJuIGZ1bmN0aW9uKHQscixpKXt2YXIgbz10Ll92YWx1ZXMscz10Ll9pbmRleCxhPXQuX3B0cix1PXQuX3NpemUsYz10Ll9kYXRhdHlwZSxsPXIuX3ZhbHVlcyxoPXIuX2luZGV4LGY9ci5fcHRyLHA9ci5fc2l6ZSxkPXIuX2RhdGF0eXBlO2lmKHUubGVuZ3RoIT09cC5sZW5ndGgpdGhyb3cgbmV3IGpwKHUubGVuZ3RoLHAubGVuZ3RoKTtpZih1WzBdIT09cFswXXx8dVsxXSE9PXBbMV0pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkRpbWVuc2lvbiBtaXNtYXRjaC4gTWF0cml4IEEgKCIrdSsiKSBtdXN0IG1hdGNoIE1hdHJpeCBCICgiK3ArIikiKTt2YXIgZyx5PXVbMF0sbT11WzFdLHY9bixfPTAseD1pOyJzdHJpbmciPT10eXBlb2YgYyYmYz09PWQmJihnPWMsdj1lLmZpbmQobixbZyxnXSksXz1lLmNvbnZlcnQoMCxnKSx4PWUuZmluZChpLFtnLGddKSk7dmFyIHcsYixELEUsQyxTPW8mJmw/W106dm9pZCAwLEE9W10sTj1bXSxJPVM/W106dm9pZCAwLE09W107Zm9yKGI9MDtiPG07YisrKXtOW2JdPUEubGVuZ3RoO3ZhciBGPWIrMTtpZihJKWZvcihFPWZbYl0sQz1mW2IrMV0sRD1FO0Q8QztEKyspTVt3PWhbRF1dPUYsSVt3XT1sW0RdO2ZvcihFPWFbYl0sQz1hW2IrMV0sRD1FO0Q8QztEKyspaWYodz1zW0RdLEkpe3ZhciBUPU1bd109PT1GP0lbd106XyxPPXgob1tEXSxUKTt2KE8sXyl8fChBLnB1c2godyksUy5wdXNoKE8pKX1lbHNlIEEucHVzaCh3KX1yZXR1cm4gTlttXT1BLmxlbmd0aCx0LmNyZWF0ZVNwYXJzZU1hdHJpeCh7dmFsdWVzOlMsaW5kZXg6QSxwdHI6TixzaXplOlt5LG1dLGRhdGF0eXBlOmd9KX19KSksJHk9dGQoIm1hdEFsZ28wN3hTU2YiLFsidHlwZWQiLCJEZW5zZU1hdHJpeCJdLCh0PT57dmFye3R5cGVkOmUsRGVuc2VNYXRyaXg6bn09dDtyZXR1cm4gZnVuY3Rpb24odCxpLG8pe3ZhciBzPXQuX3NpemUsYT10Ll9kYXRhdHlwZSx1PWkuX3NpemUsYz1pLl9kYXRhdHlwZTtpZihzLmxlbmd0aCE9PXUubGVuZ3RoKXRocm93IG5ldyBqcChzLmxlbmd0aCx1Lmxlbmd0aCk7aWYoc1swXSE9PXVbMF18fHNbMV0hPT11WzFdKXRocm93IG5ldyBSYW5nZUVycm9yKCJEaW1lbnNpb24gbWlzbWF0Y2guIE1hdHJpeCBBICgiK3MrIikgbXVzdCBtYXRjaCBNYXRyaXggQiAoIit1KyIpIik7dmFyIGwsaD1zWzBdLGY9c1sxXSxwPTAsZD1vOyJzdHJpbmciPT10eXBlb2YgYSYmYT09PWMmJihsPWEscD1lLmNvbnZlcnQoMCxsKSxkPWUuZmluZChvLFtsLGxdKSk7dmFyIGcseSxtPVtdO2ZvcihnPTA7ZzxoO2crKyltW2ddPVtdO3ZhciB2PVtdLF89W10seD1bXSx3PVtdO2Zvcih5PTA7eTxmO3krKyl7dmFyIGI9eSsxO2ZvcihyKHQseSx4LHYsYikscihpLHksdyxfLGIpLGc9MDtnPGg7ZysrKXt2YXIgRD14W2ddPT09Yj92W2ddOnAsRT13W2ddPT09Yj9fW2ddOnA7bVtnXVt5XT1kKEQsRSl9fXJldHVybiBuZXcgbih7ZGF0YTptLHNpemU6W2gsZl0sZGF0YXR5cGU6bH0pfTtmdW5jdGlvbiByKHQsZSxuLHIsaSl7Zm9yKHZhciBvPXQuX3ZhbHVlcyxzPXQuX2luZGV4LGE9dC5fcHRyLHU9YVtlXSxjPWFbZSsxXTt1PGM7dSsrKXt2YXIgbD1zW3VdO25bbF09aSxyW2xdPW9bdV19fX0pKSx0bT0iY29uaiIsZW09dGQodG0sWyJ0eXBlZCJdLCh0PT57dmFye3R5cGVkOmV9PXQ7cmV0dXJuIGUodG0seyJudW1iZXIgfCBCaWdOdW1iZXIgfCBGcmFjdGlvbiI6dD0+dCxDb21wbGV4OnQ9PnQuY29uanVnYXRlKCksIkFycmF5IHwgTWF0cml4IjplLnJlZmVyVG9TZWxmKCh0PT5lPT54eShlLHQpKSl9KX0pKSxubT0iY29uY2F0IixybT10ZChubSxbInR5cGVkIiwibWF0cml4IiwiaXNJbnRlZ2VyIl0sKHQ9Pnt2YXJ7dHlwZWQ6ZSxtYXRyaXg6bixpc0ludGVnZXI6cn09dDtyZXR1cm4gZShubSx7Ii4uLkFycmF5IHwgTWF0cml4IHwgbnVtYmVyIHwgQmlnTnVtYmVyIjpmdW5jdGlvbih0KXt2YXIgZSxpLG89dC5sZW5ndGgscz0tMSxhPSExLHU9W107Zm9yKGU9MDtlPG87ZSsrKXt2YXIgYz10W2VdO2lmKGtmKGMpJiYoYT0hMCksTWYoYyl8fEZmKGMpKXtpZihlIT09by0xKXRocm93IG5ldyBFcnJvcigiRGltZW5zaW9uIG11c3QgYmUgc3BlY2lmaWVkIGFzIGxhc3QgYXJndW1lbnQiKTtpZihpPXMscz1jLnZhbHVlT2YoKSwhcihzKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnRlZ2VyIG51bWJlciBleHBlY3RlZCBmb3IgZGltZW5zaW9uIik7aWYoczwwfHxlPjAmJnM+aSl0aHJvdyBuZXcgVXAocyxpKzEpfWVsc2V7dmFyIGw9bXAoYykudmFsdWVPZigpLGg9cXAobCk7aWYodVtlXT1sLGk9cyxzPWgubGVuZ3RoLTEsZT4wJiZzIT09aSl0aHJvdyBuZXcganAoaSsxLHMrMSl9fWlmKDA9PT11Lmxlbmd0aCl0aHJvdyBuZXcgU3ludGF4RXJyb3IoIkF0IGxlYXN0IG9uZSBtYXRyaXggZXhwZWN0ZWQiKTtmb3IodmFyIGY9dS5zaGlmdCgpO3UubGVuZ3RoOylmPWltKGYsdS5zaGlmdCgpLHMsMCk7cmV0dXJuIGE/bihmKTpmfSwiLi4uc3RyaW5nIjpmdW5jdGlvbih0KXtyZXR1cm4gdC5qb2luKCIiKX19KX0pKTtmdW5jdGlvbiBpbSh0LGUsbixyKXtpZihyPG4pe2lmKHQubGVuZ3RoIT09ZS5sZW5ndGgpdGhyb3cgbmV3IGpwKHQubGVuZ3RoLGUubGVuZ3RoKTtmb3IodmFyIGk9W10sbz0wO288dC5sZW5ndGg7bysrKWlbb109aW0odFtvXSxlW29dLG4scisxKTtyZXR1cm4gaX1yZXR1cm4gdC5jb25jYXQoZSl9dmFyIG9tPXRkKCJvbmVzIixbInR5cGVkIiwiY29uZmlnIiwibWF0cml4IiwiQmlnTnVtYmVyIl0sKHQ9Pnt2YXJ7dHlwZWQ6ZSxjb25maWc6bixtYXRyaXg6cixCaWdOdW1iZXI6aX09dDtyZXR1cm4gZSgib25lcyIseyIiOmZ1bmN0aW9uKCl7cmV0dXJuIkFycmF5Ij09PW4ubWF0cml4P28oW10pOm8oW10sImRlZmF1bHQiKX0sIi4uLm51bWJlciB8IEJpZ051bWJlciB8IHN0cmluZyI6ZnVuY3Rpb24odCl7aWYoInN0cmluZyI9PXR5cGVvZiB0W3QubGVuZ3RoLTFdKXt2YXIgZT10LnBvcCgpO3JldHVybiBvKHQsZSl9cmV0dXJuIkFycmF5Ij09PW4ubWF0cml4P28odCk6byh0LCJkZWZhdWx0Iil9LEFycmF5Om8sTWF0cml4OmZ1bmN0aW9uKHQpe3ZhciBlPXQuc3RvcmFnZSgpO3JldHVybiBvKHQudmFsdWVPZigpLGUpfSwiQXJyYXkgfCBNYXRyaXgsIHN0cmluZyI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gbyh0LnZhbHVlT2YoKSxlKX19KTtmdW5jdGlvbiBvKHQsZSl7dmFyIG49ZnVuY3Rpb24odCl7dmFyIGU9ITE7cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCxuLHIpe0ZmKHQpJiYoZT0hMCxyW25dPXQudG9OdW1iZXIoKSl9KSksZX0odCksbz1uP25ldyBpKDEpOjE7aWYoZnVuY3Rpb24odCl7dC5mb3JFYWNoKChmdW5jdGlvbih0KXtpZigibnVtYmVyIiE9dHlwZW9mIHR8fCFTcCh0KXx8dDwwKXRocm93IG5ldyBFcnJvcigiUGFyYW1ldGVycyBpbiBmdW5jdGlvbiBvbmVzIG11c3QgYmUgcG9zaXRpdmUgaW50ZWdlcnMiKX0pKX0odCksZSl7dmFyIHM9cihlKTtyZXR1cm4gdC5sZW5ndGg+MD9zLnJlc2l6ZSh0LG8pOnN9dmFyIGE9W107cmV0dXJuIHQubGVuZ3RoPjA/WHAoYSx0LG8pOmF9fSkpO2Z1bmN0aW9uIHNtKCl7dGhyb3cgbmV3IEVycm9yKCdObyAiYmlnbnVtYmVyIiBpbXBsZW1lbnRhdGlvbiBhdmFpbGFibGUnKX1mdW5jdGlvbiBhbSgpe3Rocm93IG5ldyBFcnJvcignTm8gImZyYWN0aW9uIiBpbXBsZW1lbnRhdGlvbiBhdmFpbGFibGUnKX1mdW5jdGlvbiB1bSgpe3Rocm93IG5ldyBFcnJvcignTm8gIm1hdHJpeCIgaW1wbGVtZW50YXRpb24gYXZhaWxhYmxlJyl9dmFyIGNtPSJyYW5nZSIsbG09dGQoY20sWyJ0eXBlZCIsImNvbmZpZyIsIj9tYXRyaXgiLCI/YmlnbnVtYmVyIiwic21hbGxlciIsInNtYWxsZXJFcSIsImxhcmdlciIsImxhcmdlckVxIl0sKHQ9Pnt2YXJ7dHlwZWQ6ZSxjb25maWc6bixtYXRyaXg6cixiaWdudW1iZXI6aSxzbWFsbGVyOm8sc21hbGxlckVxOnMsbGFyZ2VyOmEsbGFyZ2VyRXE6dX09dDtyZXR1cm4gZShjbSx7c3RyaW5nOmwsInN0cmluZywgYm9vbGVhbiI6bCwibnVtYmVyLCBudW1iZXIiOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGMoaCh0LGUsMSkpfSwibnVtYmVyLCBudW1iZXIsIG51bWJlciI6ZnVuY3Rpb24odCxlLG4pe3JldHVybiBjKGgodCxlLG4pKX0sIm51bWJlciwgbnVtYmVyLCBib29sZWFuIjpmdW5jdGlvbih0LGUsbil7cmV0dXJuIGMobj9mKHQsZSwxKTpoKHQsZSwxKSl9LCJudW1iZXIsIG51bWJlciwgbnVtYmVyLCBib29sZWFuIjpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gYyhyP2YodCxlLG4pOmgodCxlLG4pKX0sIkJpZ051bWJlciwgQmlnTnVtYmVyIjpmdW5jdGlvbih0LGUpe3JldHVybiBjKHAodCxlLG5ldygwLHQuY29uc3RydWN0b3IpKDEpKSl9LCJCaWdOdW1iZXIsIEJpZ051bWJlciwgQmlnTnVtYmVyIjpmdW5jdGlvbih0LGUsbil7cmV0dXJuIGMocCh0LGUsbikpfSwiQmlnTnVtYmVyLCBCaWdOdW1iZXIsIGJvb2xlYW4iOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10LmNvbnN0cnVjdG9yO3JldHVybiBjKG4/ZCh0LGUsbmV3IHIoMSkpOnAodCxlLG5ldyByKDEpKSl9LCJCaWdOdW1iZXIsIEJpZ051bWJlciwgQmlnTnVtYmVyLCBib29sZWFuIjpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gYyhyP2QodCxlLG4pOnAodCxlLG4pKX19KTtmdW5jdGlvbiBjKHQpe3JldHVybiJNYXRyaXgiPT09bi5tYXRyaXg/cj9yKHQpOnVtKCk6dH1mdW5jdGlvbiBsKHQsZSl7dmFyIHI9ZnVuY3Rpb24odCl7dmFyIGU9dC5zcGxpdCgiOiIpLG49ZS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodCl9KSkscj1uLnNvbWUoKGZ1bmN0aW9uKHQpe3JldHVybiBpc05hTih0KX0pKTtpZihyKXJldHVybiBudWxsO3N3aXRjaChuLmxlbmd0aCl7Y2FzZSAyOnJldHVybntzdGFydDpuWzBdLGVuZDpuWzFdLHN0ZXA6MX07Y2FzZSAzOnJldHVybntzdGFydDpuWzBdLGVuZDpuWzJdLHN0ZXA6blsxXX07ZGVmYXVsdDpyZXR1cm4gbnVsbH19KHQpO2lmKCFyKXRocm93IG5ldyBTeW50YXhFcnJvcignU3RyaW5nICInK3QrJyIgaXMgbm8gdmFsaWQgcmFuZ2UnKTtyZXR1cm4iQmlnTnVtYmVyIj09PW4ubnVtYmVyPyh2b2lkIDA9PT1pJiZzbSgpLGMoKGU/ZDpwKShpKHIuc3RhcnQpLGkoci5lbmQpLGkoci5zdGVwKSkpKTpjKChlP2Y6aCkoci5zdGFydCxyLmVuZCxyLnN0ZXApKX1mdW5jdGlvbiBoKHQsZSxuKXt2YXIgcj1bXSxpPXQ7aWYobj4wKWZvcig7byhpLGUpOylyLnB1c2goaSksaSs9bjtlbHNlIGlmKG48MClmb3IoO2EoaSxlKTspci5wdXNoKGkpLGkrPW47cmV0dXJuIHJ9ZnVuY3Rpb24gZih0LGUsbil7dmFyIHI9W10saT10O2lmKG4+MClmb3IoO3MoaSxlKTspci5wdXNoKGkpLGkrPW47ZWxzZSBpZihuPDApZm9yKDt1KGksZSk7KXIucHVzaChpKSxpKz1uO3JldHVybiByfWZ1bmN0aW9uIHAodCxlLG4pe3ZhciByPWkoMCkscz1bXSx1PXQ7aWYobi5ndChyKSlmb3IoO28odSxlKTspcy5wdXNoKHUpLHU9dS5wbHVzKG4pO2Vsc2UgaWYobi5sdChyKSlmb3IoO2EodSxlKTspcy5wdXNoKHUpLHU9dS5wbHVzKG4pO3JldHVybiBzfWZ1bmN0aW9uIGQodCxlLG4pe3ZhciByPWkoMCksbz1bXSxhPXQ7aWYobi5ndChyKSlmb3IoO3MoYSxlKTspby5wdXNoKGEpLGE9YS5wbHVzKG4pO2Vsc2UgaWYobi5sdChyKSlmb3IoO3UoYSxlKTspby5wdXNoKGEpLGE9YS5wbHVzKG4pO3JldHVybiBvfX0pKSxobT0ic2l6ZSIsZm09dGQoaG0sWyJ0eXBlZCIsImNvbmZpZyIsIj9tYXRyaXgiXSwodD0+e3Zhcnt0eXBlZDplLGNvbmZpZzpuLG1hdHJpeDpyfT10O3JldHVybiBlKGhtLHtNYXRyaXg6ZnVuY3Rpb24odCl7cmV0dXJuIHQuY3JlYXRlKHQuc2l6ZSgpKX0sQXJyYXk6cXAsc3RyaW5nOmZ1bmN0aW9uKHQpe3JldHVybiJBcnJheSI9PT1uLm1hdHJpeD9bdC5sZW5ndGhdOnIoW3QubGVuZ3RoXSl9LCJudW1iZXIgfCBDb21wbGV4IHwgQmlnTnVtYmVyIHwgVW5pdCB8IGJvb2xlYW4gfCBudWxsIjpmdW5jdGlvbih0KXtyZXR1cm4iQXJyYXkiPT09bi5tYXRyaXg/W106cj9yKFtdKTp1bSgpfX0pfSkpLHBtPSJzdWJzZXQiLGRtPXRkKHBtLFsidHlwZWQiLCJtYXRyaXgiXSwodD0+e3Zhcnt0eXBlZDplLG1hdHJpeDpufT10O3JldHVybiBlKHBtLHsiQXJyYXksIEluZGV4IjpmdW5jdGlvbih0LGUpe3ZhciByPW4odCkuc3Vic2V0KGUpO3JldHVybiBlLmlzU2NhbGFyKCk/cjpyLnZhbHVlT2YoKX0sIk1hdHJpeCwgSW5kZXgiOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuc3Vic2V0KGUpfSwiT2JqZWN0LCBJbmRleCI6bW0sInN0cmluZywgSW5kZXgiOmdtLCJBcnJheSwgSW5kZXgsIGFueSI6ZnVuY3Rpb24odCxlLHIpe3JldHVybiBuKG1wKHQpKS5zdWJzZXQoZSxyLHZvaWQgMCkudmFsdWVPZigpfSwiQXJyYXksIEluZGV4LCBhbnksIGFueSI6ZnVuY3Rpb24odCxlLHIsaSl7cmV0dXJuIG4obXAodCkpLnN1YnNldChlLHIsaSkudmFsdWVPZigpfSwiTWF0cml4LCBJbmRleCwgYW55IjpmdW5jdGlvbih0LGUsbil7cmV0dXJuIHQuY2xvbmUoKS5zdWJzZXQoZSxuKX0sIk1hdHJpeCwgSW5kZXgsIGFueSwgYW55IjpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gdC5jbG9uZSgpLnN1YnNldChlLG4scil9LCJzdHJpbmcsIEluZGV4LCBzdHJpbmciOnltLCJzdHJpbmcsIEluZGV4LCBzdHJpbmcsIHN0cmluZyI6eW0sIk9iamVjdCwgSW5kZXgsIGFueSI6dm19KX0pKTtmdW5jdGlvbiBnbSh0LGUpe2lmKCFWZihlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbmRleCBleHBlY3RlZCIpO2lmKDEhPT1lLnNpemUoKS5sZW5ndGgpdGhyb3cgbmV3IGpwKGUuc2l6ZSgpLmxlbmd0aCwxKTt2YXIgbj10Lmxlbmd0aDtZcChlLm1pbigpWzBdLG4pLFlwKGUubWF4KClbMF0sbik7dmFyIHI9ZS5kaW1lbnNpb24oMCksaT0iIjtyZXR1cm4gci5mb3JFYWNoKChmdW5jdGlvbihlKXtpKz10LmNoYXJBdChlKX0pKSxpfWZ1bmN0aW9uIHltKHQsZSxuLHIpe2lmKCFlfHwhMCE9PWUuaXNJbmRleCl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbmRleCBleHBlY3RlZCIpO2lmKDEhPT1lLnNpemUoKS5sZW5ndGgpdGhyb3cgbmV3IGpwKGUuc2l6ZSgpLmxlbmd0aCwxKTtpZih2b2lkIDAhPT1yKXtpZigic3RyaW5nIiE9dHlwZW9mIHJ8fDEhPT1yLmxlbmd0aCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTaW5nbGUgY2hhcmFjdGVyIGV4cGVjdGVkIGFzIGRlZmF1bHRWYWx1ZSIpfWVsc2Ugcj0iICI7dmFyIGk9ZS5kaW1lbnNpb24oMCk7aWYoaS5zaXplKClbMF0hPT1uLmxlbmd0aCl0aHJvdyBuZXcganAoaS5zaXplKClbMF0sbi5sZW5ndGgpO3ZhciBvPXQubGVuZ3RoO1lwKGUubWluKClbMF0pLFlwKGUubWF4KClbMF0pO2Zvcih2YXIgcz1bXSxhPTA7YTxvO2ErKylzW2FdPXQuY2hhckF0KGEpO2lmKGkuZm9yRWFjaCgoZnVuY3Rpb24odCxlKXtzW3RdPW4uY2hhckF0KGVbMF0pfSkpLHMubGVuZ3RoPm8pZm9yKHZhciB1PW8tMSxjPXMubGVuZ3RoO3U8Yzt1Kyspc1t1XXx8KHNbdV09cik7cmV0dXJuIHMuam9pbigiIil9ZnVuY3Rpb24gbW0odCxlKXtpZigxIT09ZS5zaXplKCkubGVuZ3RoKXRocm93IG5ldyBqcChlLnNpemUoKSwxKTt2YXIgbj1lLmRpbWVuc2lvbigwKTtpZigic3RyaW5nIiE9dHlwZW9mIG4pdGhyb3cgbmV3IFR5cGVFcnJvcigiU3RyaW5nIGV4cGVjdGVkIGFzIGluZGV4IHRvIHJldHJpZXZlIGFuIG9iamVjdCBwcm9wZXJ0eSIpO3JldHVybiBuZCh0LG4pfWZ1bmN0aW9uIHZtKHQsZSxuKXtpZigxIT09ZS5zaXplKCkubGVuZ3RoKXRocm93IG5ldyBqcChlLnNpemUoKSwxKTt2YXIgcj1lLmRpbWVuc2lvbigwKTtpZigic3RyaW5nIiE9dHlwZW9mIHIpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3RyaW5nIGV4cGVjdGVkIGFzIGluZGV4IHRvIHJldHJpZXZlIGFuIG9iamVjdCBwcm9wZXJ0eSIpO3ZhciBpPW1wKHQpO3JldHVybiByZChpLHIsbiksaX12YXIgX209InRyYW5zcG9zZSIseG09dGQoX20sWyJ0eXBlZCIsIm1hdHJpeCJdLCh0PT57dmFye3R5cGVkOmUsbWF0cml4Om59PXQ7cmV0dXJuIGUoX20se0FycmF5OnQ9PnIobih0KSkudmFsdWVPZigpLE1hdHJpeDpyLGFueTptcH0pO2Z1bmN0aW9uIHIodCl7dmFyIGUsbj10LnNpemUoKTtzd2l0Y2gobi5sZW5ndGgpe2Nhc2UgMTplPXQuY2xvbmUoKTticmVhaztjYXNlIDI6dmFyIHI9blswXSxpPW5bMV07aWYoMD09PWkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkNhbm5vdCB0cmFuc3Bvc2UgYSAyRCBtYXRyaXggd2l0aCBubyBjb2x1bW5zIChzaXplOiAiK2twKG4pKyIpIik7c3dpdGNoKHQuc3RvcmFnZSgpKXtjYXNlImRlbnNlIjplPWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHIsaT10Ll9kYXRhLG89W10scz0wO3M8bjtzKyspe3I9b1tzXT1bXTtmb3IodmFyIGE9MDthPGU7YSsrKXJbYV09bXAoaVthXVtzXSl9cmV0dXJuIHQuY3JlYXRlRGVuc2VNYXRyaXgoe2RhdGE6byxzaXplOltuLGVdLGRhdGF0eXBlOnQuX2RhdGF0eXBlfSl9KHQscixpKTticmVhaztjYXNlInNwYXJzZSI6ZT1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPXQuX3ZhbHVlcyxpPXQuX2luZGV4LG89dC5fcHRyLHM9cj9bXTp2b2lkIDAsYT1bXSx1PVtdLGM9W10sbD0wO2w8ZTtsKyspY1tsXT0wO3ZhciBoLGYscDtmb3IoaD0wLGY9aS5sZW5ndGg7aDxmO2grKyljW2lbaF1dKys7Zm9yKHZhciBkPTAsZz0wO2c8ZTtnKyspdS5wdXNoKGQpLGQrPWNbZ10sY1tnXT11W2ddO2Zvcih1LnB1c2goZCkscD0wO3A8bjtwKyspZm9yKHZhciB5PW9bcF0sbT1vW3ArMV0sdj15O3Y8bTt2Kyspe3ZhciBfPWNbaVt2XV0rKzthW19dPXAsciYmKHNbX109bXAoclt2XSkpfXJldHVybiB0LmNyZWF0ZVNwYXJzZU1hdHJpeCh7dmFsdWVzOnMsaW5kZXg6YSxwdHI6dSxzaXplOltuLGVdLGRhdGF0eXBlOnQuX2RhdGF0eXBlfSl9KHQscixpKX1icmVhaztkZWZhdWx0OnRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaXggbXVzdCBiZSBhIHZlY3RvciBvciB0d28gZGltZW5zaW9uYWwgKHNpemU6ICIra3AobikrIikiKX1yZXR1cm4gZX19KSksd209dGQoIm51bWVyaWMiLFsibnVtYmVyIiwiP2JpZ251bWJlciIsIj9mcmFjdGlvbiJdLCh0PT57dmFye251bWJlcjplLGJpZ251bWJlcjpuLGZyYWN0aW9uOnJ9PXQsaT17c3RyaW5nOiEwLG51bWJlcjohMCxCaWdOdW1iZXI6ITAsRnJhY3Rpb246ITB9LG89e251bWJlcjp0PT5lKHQpLEJpZ051bWJlcjpuP3Q9Pm4odCk6c20sRnJhY3Rpb246cj90PT5yKHQpOmFtfTtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOiJudW1iZXIiO2lmKHZvaWQgMCE9PShhcmd1bWVudHMubGVuZ3RoPjI/YXJndW1lbnRzWzJdOnZvaWQgMCkpdGhyb3cgbmV3IFN5bnRheEVycm9yKCJudW1lcmljKCkgdGFrZXMgb25lIG9yIHR3byBhcmd1bWVudHMiKTt2YXIgbj15cCh0KTtpZighKG4gaW4gaSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNvbnZlcnQgIit0Kycgb2YgdHlwZSAiJytuKyciOyB2YWxpZCBpbnB1dCB0eXBlcyBhcmUgJytPYmplY3Qua2V5cyhpKS5qb2luKCIsICIpKTtpZighKGUgaW4gbykpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNvbnZlcnQgIit0KycgdG8gdHlwZSAiJytlKyciOyB2YWxpZCBvdXRwdXQgdHlwZXMgYXJlICcrT2JqZWN0LmtleXMobykuam9pbigiLCAiKSk7cmV0dXJuIGU9PT1uP3Q6b1tlXSh0KX19KSksYm09ImRpdmlkZVNjYWxhciIsRG09dGQoYm0sWyJ0eXBlZCIsIm51bWVyaWMiXSwodD0+e3Zhcnt0eXBlZDplLG51bWVyaWM6bn09dDtyZXR1cm4gZShibSx7Im51bWJlciwgbnVtYmVyIjpmdW5jdGlvbih0LGUpe3JldHVybiB0L2V9LCJDb21wbGV4LCBDb21wbGV4IjpmdW5jdGlvbih0LGUpe3JldHVybiB0LmRpdihlKX0sIkJpZ051bWJlciwgQmlnTnVtYmVyIjpmdW5jdGlvbih0LGUpe3JldHVybiB0LmRpdihlKX0sIkZyYWN0aW9uLCBGcmFjdGlvbiI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5kaXYoZSl9LCJVbml0LCBudW1iZXIgfCBDb21wbGV4IHwgRnJhY3Rpb24gfCBCaWdOdW1iZXIgfCBVbml0IjoodCxlKT0+dC5kaXZpZGUoZSksIm51bWJlciB8IEZyYWN0aW9uIHwgQ29tcGxleCB8IEJpZ051bWJlciwgVW5pdCI6KHQsZSk9PmUuZGl2aWRlSW50byh0KX0pfSkpLEVtPSJkb3REaXZpZGUiLENtPXRkKEVtLFsidHlwZWQiLCJtYXRyaXgiLCJlcXVhbFNjYWxhciIsImRpdmlkZVNjYWxhciIsIkRlbnNlTWF0cml4IiwiY29uY2F0Il0sKHQ9Pnt2YXJ7dHlwZWQ6ZSxtYXRyaXg6bixlcXVhbFNjYWxhcjpyLGRpdmlkZVNjYWxhcjppLERlbnNlTWF0cml4Om8sY29uY2F0OnN9PXQsYT1XeSh7dHlwZWQ6ZSxlcXVhbFNjYWxhcjpyfSksdT1IeSh7dHlwZWQ6ZX0pLGM9JHkoe3R5cGVkOmUsRGVuc2VNYXRyaXg6b30pLGw9a3koe3R5cGVkOmUsZXF1YWxTY2FsYXI6cn0pLGg9enkoe3R5cGVkOmUsRGVuc2VNYXRyaXg6b30pLGY9WHkoe3R5cGVkOmUsbWF0cml4Om4sY29uY2F0OnN9KTtyZXR1cm4gZShFbSxmKHtlbG9wOmksU1M6YyxEUzp1LFNEOmEsU3M6bCxzUzpofSkpfSkpLFNtPSJzbWFsbGVyIixBbT10ZChTbSxbInR5cGVkIiwiY29uZmlnIiwibWF0cml4IiwiRGVuc2VNYXRyaXgiLCJjb25jYXQiXSwodD0+e3Zhcnt0eXBlZDplLGNvbmZpZzpuLG1hdHJpeDpyLERlbnNlTWF0cml4OmksY29uY2F0Om99PXQscz1IeSh7dHlwZWQ6ZX0pLGE9JHkoe3R5cGVkOmUsRGVuc2VNYXRyaXg6aX0pLHU9enkoe3R5cGVkOmUsRGVuc2VNYXRyaXg6aX0pLGM9WHkoe3R5cGVkOmUsbWF0cml4OnIsY29uY2F0Om99KSxsPUF5KHt0eXBlZDplfSk7cmV0dXJuIGUoU20sTm0oe3R5cGVkOmUsY29uZmlnOm59KSx7ImJvb2xlYW4sIGJvb2xlYW4iOih0LGUpPT50PGUsIkJpZ051bWJlciwgQmlnTnVtYmVyIjpmdW5jdGlvbih0LGUpe3JldHVybiB0Lmx0KGUpJiYhU3kodCxlLG4uZXBzaWxvbil9LCJGcmFjdGlvbiwgRnJhY3Rpb24iOih0LGUpPT4tMT09PXQuY29tcGFyZShlKSwiQ29tcGxleCwgQ29tcGxleCI6ZnVuY3Rpb24odCxlKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJObyBvcmRlcmluZyByZWxhdGlvbiBpcyBkZWZpbmVkIGZvciBjb21wbGV4IG51bWJlcnMiKX19LGwsYyh7U1M6YSxEUzpzLFNzOnV9KSl9KSksTm09dGQoU20sWyJ0eXBlZCIsImNvbmZpZyJdLCh0PT57dmFye3R5cGVkOmUsY29uZmlnOm59PXQ7cmV0dXJuIGUoU20seyJudW1iZXIsIG51bWJlciI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdDxlJiYhTHAodCxlLG4uZXBzaWxvbil9fSl9KSksSW09InNtYWxsZXJFcSIsTW09dGQoSW0sWyJ0eXBlZCIsImNvbmZpZyIsIm1hdHJpeCIsIkRlbnNlTWF0cml4IiwiY29uY2F0Il0sKHQ9Pnt2YXJ7dHlwZWQ6ZSxjb25maWc6bixtYXRyaXg6cixEZW5zZU1hdHJpeDppLGNvbmNhdDpvfT10LHM9SHkoe3R5cGVkOmV9KSxhPSR5KHt0eXBlZDplLERlbnNlTWF0cml4Oml9KSx1PXp5KHt0eXBlZDplLERlbnNlTWF0cml4Oml9KSxjPVh5KHt0eXBlZDplLG1hdHJpeDpyLGNvbmNhdDpvfSksbD1BeSh7dHlwZWQ6ZX0pO3JldHVybiBlKEltLEZtKHt0eXBlZDplLGNvbmZpZzpufSkseyJib29sZWFuLCBib29sZWFuIjoodCxlKT0+dDw9ZSwiQmlnTnVtYmVyLCBCaWdOdW1iZXIiOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQubHRlKGUpfHxTeSh0LGUsbi5lcHNpbG9uKX0sIkZyYWN0aW9uLCBGcmFjdGlvbiI6KHQsZSk9PjEhPT10LmNvbXBhcmUoZSksIkNvbXBsZXgsIENvbXBsZXgiOmZ1bmN0aW9uKCl7dGhyb3cgbmV3IFR5cGVFcnJvcigiTm8gb3JkZXJpbmcgcmVsYXRpb24gaXMgZGVmaW5lZCBmb3IgY29tcGxleCBudW1iZXJzIil9fSxsLGMoe1NTOmEsRFM6cyxTczp1fSkpfSkpLEZtPXRkKEltLFsidHlwZWQiLCJjb25maWciXSwodD0+e3Zhcnt0eXBlZDplLGNvbmZpZzpufT10O3JldHVybiBlKEltLHsibnVtYmVyLCBudW1iZXIiOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ8PWV8fExwKHQsZSxuLmVwc2lsb24pfX0pfSkpLFRtPSJsYXJnZXIiLE9tPXRkKFRtLFsidHlwZWQiLCJjb25maWciLCJtYXRyaXgiLCJEZW5zZU1hdHJpeCIsImNvbmNhdCJdLCh0PT57dmFye3R5cGVkOmUsY29uZmlnOm4sbWF0cml4OnIsRGVuc2VNYXRyaXg6aSxjb25jYXQ6b309dCxzPUh5KHt0eXBlZDplfSksYT0keSh7dHlwZWQ6ZSxEZW5zZU1hdHJpeDppfSksdT16eSh7dHlwZWQ6ZSxEZW5zZU1hdHJpeDppfSksYz1YeSh7dHlwZWQ6ZSxtYXRyaXg6cixjb25jYXQ6b30pLGw9QXkoe3R5cGVkOmV9KTtyZXR1cm4gZShUbSxMbSh7dHlwZWQ6ZSxjb25maWc6bn0pLHsiYm9vbGVhbiwgYm9vbGVhbiI6KHQsZSk9PnQ+ZSwiQmlnTnVtYmVyLCBCaWdOdW1iZXIiOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuZ3QoZSkmJiFTeSh0LGUsbi5lcHNpbG9uKX0sIkZyYWN0aW9uLCBGcmFjdGlvbiI6KHQsZSk9PjE9PT10LmNvbXBhcmUoZSksIkNvbXBsZXgsIENvbXBsZXgiOmZ1bmN0aW9uKCl7dGhyb3cgbmV3IFR5cGVFcnJvcigiTm8gb3JkZXJpbmcgcmVsYXRpb24gaXMgZGVmaW5lZCBmb3IgY29tcGxleCBudW1iZXJzIil9fSxsLGMoe1NTOmEsRFM6cyxTczp1fSkpfSkpLExtPXRkKFRtLFsidHlwZWQiLCJjb25maWciXSwodD0+e3Zhcnt0eXBlZDplLGNvbmZpZzpufT10O3JldHVybiBlKFRtLHsibnVtYmVyLCBudW1iZXIiOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ+ZSYmIUxwKHQsZSxuLmVwc2lsb24pfX0pfSkpLFBtPSJsYXJnZXJFcSIsUm09dGQoUG0sWyJ0eXBlZCIsImNvbmZpZyIsIm1hdHJpeCIsIkRlbnNlTWF0cml4IiwiY29uY2F0Il0sKHQ9Pnt2YXJ7dHlwZWQ6ZSxjb25maWc6bixtYXRyaXg6cixEZW5zZU1hdHJpeDppLGNvbmNhdDpvfT10LHM9SHkoe3R5cGVkOmV9KSxhPSR5KHt0eXBlZDplLERlbnNlTWF0cml4Oml9KSx1PXp5KHt0eXBlZDplLERlbnNlTWF0cml4Oml9KSxjPVh5KHt0eXBlZDplLG1hdHJpeDpyLGNvbmNhdDpvfSksbD1BeSh7dHlwZWQ6ZX0pO3JldHVybiBlKFBtLEJtKHt0eXBlZDplLGNvbmZpZzpufSkseyJib29sZWFuLCBib29sZWFuIjoodCxlKT0+dD49ZSwiQmlnTnVtYmVyLCBCaWdOdW1iZXIiOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuZ3RlKGUpfHxTeSh0LGUsbi5lcHNpbG9uKX0sIkZyYWN0aW9uLCBGcmFjdGlvbiI6KHQsZSk9Pi0xIT09dC5jb21wYXJlKGUpLCJDb21wbGV4LCBDb21wbGV4IjpmdW5jdGlvbigpe3Rocm93IG5ldyBUeXBlRXJyb3IoIk5vIG9yZGVyaW5nIHJlbGF0aW9uIGlzIGRlZmluZWQgZm9yIGNvbXBsZXggbnVtYmVycyIpfX0sbCxjKHtTUzphLERTOnMsU3M6dX0pKX0pKSxCbT10ZChQbSxbInR5cGVkIiwiY29uZmlnIl0sKHQ9Pnt2YXJ7dHlwZWQ6ZSxjb25maWc6bn09dDtyZXR1cm4gZShQbSx7Im51bWJlciwgbnVtYmVyIjpmdW5jdGlvbih0LGUpe3JldHVybiB0Pj1lfHxMcCh0LGUsbi5lcHNpbG9uKX19KX0pKSxrbT10ZCgiSW1tdXRhYmxlRGVuc2VNYXRyaXgiLFsic21hbGxlciIsIkRlbnNlTWF0cml4Il0sKHQ9Pnt2YXJ7c21hbGxlcjplLERlbnNlTWF0cml4Om59PXQ7ZnVuY3Rpb24gcih0LGUpe2lmKCEodGhpcyBpbnN0YW5jZW9mIHIpKXRocm93IG5ldyBTeW50YXhFcnJvcigiQ29uc3RydWN0b3IgbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgbmV3IG9wZXJhdG9yIik7aWYoZSYmIVJmKGUpKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBkYXRhdHlwZTogIitlKTtpZihrZih0KXx8QmYodCkpe3ZhciBpPW5ldyBuKHQsZSk7dGhpcy5fZGF0YT1pLl9kYXRhLHRoaXMuX3NpemU9aS5fc2l6ZSx0aGlzLl9kYXRhdHlwZT1pLl9kYXRhdHlwZSx0aGlzLl9taW49bnVsbCx0aGlzLl9tYXg9bnVsbH1lbHNlIGlmKHQmJkJmKHQuZGF0YSkmJkJmKHQuc2l6ZSkpdGhpcy5fZGF0YT10LmRhdGEsdGhpcy5fc2l6ZT10LnNpemUsdGhpcy5fZGF0YXR5cGU9dC5kYXRhdHlwZSx0aGlzLl9taW49dm9pZCAwIT09dC5taW4/dC5taW46bnVsbCx0aGlzLl9tYXg9dm9pZCAwIT09dC5tYXg/dC5tYXg6bnVsbDtlbHNle2lmKHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5zdXBwb3J0ZWQgdHlwZSBvZiBkYXRhICgiK3lwKHQpKyIpIik7dGhpcy5fZGF0YT1bXSx0aGlzLl9zaXplPVswXSx0aGlzLl9kYXRhdHlwZT1lLHRoaXMuX21pbj1udWxsLHRoaXMuX21heD1udWxsfX1yZXR1cm4gci5wcm90b3R5cGU9bmV3IG4sci5wcm90b3R5cGUudHlwZT0iSW1tdXRhYmxlRGVuc2VNYXRyaXgiLHIucHJvdG90eXBlLmlzSW1tdXRhYmxlRGVuc2VNYXRyaXg9ITAsci5wcm90b3R5cGUuc3Vic2V0PWZ1bmN0aW9uKHQpe3N3aXRjaChhcmd1bWVudHMubGVuZ3RoKXtjYXNlIDE6dmFyIGU9bi5wcm90b3R5cGUuc3Vic2V0LmNhbGwodGhpcyx0KTtyZXR1cm4ga2YoZSk/bmV3IHIoe2RhdGE6ZS5fZGF0YSxzaXplOmUuX3NpemUsZGF0YXR5cGU6ZS5fZGF0YXR5cGV9KTplO2Nhc2UgMjpjYXNlIDM6dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaW52b2tlIHNldCBzdWJzZXQgb24gYW4gSW1tdXRhYmxlIE1hdHJpeCBpbnN0YW5jZSIpO2RlZmF1bHQ6dGhyb3cgbmV3IFN5bnRheEVycm9yKCJXcm9uZyBudW1iZXIgb2YgYXJndW1lbnRzIil9fSxyLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBpbnZva2Ugc2V0IG9uIGFuIEltbXV0YWJsZSBNYXRyaXggaW5zdGFuY2UiKX0sci5wcm90b3R5cGUucmVzaXplPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaW52b2tlIHJlc2l6ZSBvbiBhbiBJbW11dGFibGUgTWF0cml4IGluc3RhbmNlIil9LHIucHJvdG90eXBlLnJlc2hhcGU9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBpbnZva2UgcmVzaGFwZSBvbiBhbiBJbW11dGFibGUgTWF0cml4IGluc3RhbmNlIil9LHIucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyByKHtkYXRhOm1wKHRoaXMuX2RhdGEpLHNpemU6bXAodGhpcy5fc2l6ZSksZGF0YXR5cGU6dGhpcy5fZGF0YXR5cGV9KX0sci5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJue21hdGhqczoiSW1tdXRhYmxlRGVuc2VNYXRyaXgiLGRhdGE6dGhpcy5fZGF0YSxzaXplOnRoaXMuX3NpemUsZGF0YXR5cGU6dGhpcy5fZGF0YXR5cGV9fSxyLmZyb21KU09OPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgcih0KX0sci5wcm90b3R5cGUuc3dhcFJvd3M9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBpbnZva2Ugc3dhcFJvd3Mgb24gYW4gSW1tdXRhYmxlIE1hdHJpeCBpbnN0YW5jZSIpfSxyLnByb3RvdHlwZS5taW49ZnVuY3Rpb24oKXtpZihudWxsPT09dGhpcy5fbWluKXt2YXIgdD1udWxsO3RoaXMuZm9yRWFjaCgoZnVuY3Rpb24obil7KG51bGw9PT10fHxlKG4sdCkpJiYodD1uKX0pKSx0aGlzLl9taW49bnVsbCE9PXQ/dDp2b2lkIDB9cmV0dXJuIHRoaXMuX21pbn0sci5wcm90b3R5cGUubWF4PWZ1bmN0aW9uKCl7aWYobnVsbD09PXRoaXMuX21heCl7dmFyIHQ9bnVsbDt0aGlzLmZvckVhY2goKGZ1bmN0aW9uKG4peyhudWxsPT09dHx8ZSh0LG4pKSYmKHQ9bil9KSksdGhpcy5fbWF4PW51bGwhPT10P3Q6dm9pZCAwfXJldHVybiB0aGlzLl9tYXh9LHJ9KSx7aXNDbGFzczohMH0pLHptPXRkKCJJbmRleCIsWyJJbW11dGFibGVEZW5zZU1hdHJpeCJdLCh0PT57dmFye0ltbXV0YWJsZURlbnNlTWF0cml4OmV9PXQ7ZnVuY3Rpb24gbih0KXtpZighKHRoaXMgaW5zdGFuY2VvZiBuKSl0aHJvdyBuZXcgU3ludGF4RXJyb3IoIkNvbnN0cnVjdG9yIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIG5ldyBvcGVyYXRvciIpO3RoaXMuX2RpbWVuc2lvbnM9W10sdGhpcy5faXNTY2FsYXI9ITA7Zm9yKHZhciBlPTAsaT1hcmd1bWVudHMubGVuZ3RoO2U8aTtlKyspe3ZhciBvPWFyZ3VtZW50c1tlXTtpZihxZihvKSl0aGlzLl9kaW1lbnNpb25zLnB1c2gobyksdGhpcy5faXNTY2FsYXI9ITE7ZWxzZSBpZihBcnJheS5pc0FycmF5KG8pfHxrZihvKSl7dmFyIHM9cihvLnZhbHVlT2YoKSk7dGhpcy5fZGltZW5zaW9ucy5wdXNoKHMpO3ZhciBhPXMuc2l6ZSgpOygxIT09YS5sZW5ndGh8fDEhPT1hWzBdKSYmKHRoaXMuX2lzU2NhbGFyPSExKX1lbHNlIGlmKCJudW1iZXIiPT10eXBlb2Ygbyl0aGlzLl9kaW1lbnNpb25zLnB1c2gocihbb10pKTtlbHNle2lmKCJzdHJpbmciIT10eXBlb2Ygbyl0aHJvdyBuZXcgVHlwZUVycm9yKCJEaW1lbnNpb24gbXVzdCBiZSBhbiBBcnJheSwgTWF0cml4LCBudW1iZXIsIHN0cmluZywgb3IgUmFuZ2UiKTt0aGlzLl9kaW1lbnNpb25zLnB1c2gobyl9fX1mdW5jdGlvbiByKHQpe2Zvcih2YXIgbj0wLHI9dC5sZW5ndGg7bjxyO24rKylpZigibnVtYmVyIiE9dHlwZW9mIHRbbl18fCFTcCh0W25dKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbmRleCBwYXJhbWV0ZXJzIG11c3QgYmUgcG9zaXRpdmUgaW50ZWdlciBudW1iZXJzIik7cmV0dXJuIG5ldyBlKHQpfXJldHVybiBuLnByb3RvdHlwZS50eXBlPSJJbmRleCIsbi5wcm90b3R5cGUuaXNJbmRleD0hMCxuLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe3ZhciB0PW5ldyBuO3JldHVybiB0Ll9kaW1lbnNpb25zPW1wKHRoaXMuX2RpbWVuc2lvbnMpLHQuX2lzU2NhbGFyPXRoaXMuX2lzU2NhbGFyLHR9LG4uY3JlYXRlPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBuO3JldHVybiBuLmFwcGx5KGUsdCksZX0sbi5wcm90b3R5cGUuc2l6ZT1mdW5jdGlvbigpe2Zvcih2YXIgdD1bXSxlPTAsbj10aGlzLl9kaW1lbnNpb25zLmxlbmd0aDtlPG47ZSsrKXt2YXIgcj10aGlzLl9kaW1lbnNpb25zW2VdO3RbZV09InN0cmluZyI9PXR5cGVvZiByPzE6ci5zaXplKClbMF19cmV0dXJuIHR9LG4ucHJvdG90eXBlLm1heD1mdW5jdGlvbigpe2Zvcih2YXIgdD1bXSxlPTAsbj10aGlzLl9kaW1lbnNpb25zLmxlbmd0aDtlPG47ZSsrKXt2YXIgcj10aGlzLl9kaW1lbnNpb25zW2VdO3RbZV09InN0cmluZyI9PXR5cGVvZiByP3I6ci5tYXgoKX1yZXR1cm4gdH0sbi5wcm90b3R5cGUubWluPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLGU9MCxuPXRoaXMuX2RpbWVuc2lvbnMubGVuZ3RoO2U8bjtlKyspe3ZhciByPXRoaXMuX2RpbWVuc2lvbnNbZV07dFtlXT0ic3RyaW5nIj09dHlwZW9mIHI/cjpyLm1pbigpfXJldHVybiB0fSxuLnByb3RvdHlwZS5mb3JFYWNoPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wLG49dGhpcy5fZGltZW5zaW9ucy5sZW5ndGg7ZTxuO2UrKyl0KHRoaXMuX2RpbWVuc2lvbnNbZV0sZSx0aGlzKX0sbi5wcm90b3R5cGUuZGltZW5zaW9uPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9kaW1lbnNpb25zW3RdfHxudWxsfSxuLnByb3RvdHlwZS5pc09iamVjdFByb3BlcnR5PWZ1bmN0aW9uKCl7cmV0dXJuIDE9PT10aGlzLl9kaW1lbnNpb25zLmxlbmd0aCYmInN0cmluZyI9PXR5cGVvZiB0aGlzLl9kaW1lbnNpb25zWzBdfSxuLnByb3RvdHlwZS5nZXRPYmplY3RQcm9wZXJ0eT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzT2JqZWN0UHJvcGVydHkoKT90aGlzLl9kaW1lbnNpb25zWzBdOm51bGx9LG4ucHJvdG90eXBlLmlzU2NhbGFyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzU2NhbGFyfSxuLnByb3RvdHlwZS50b0FycmF5PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLGU9MCxuPXRoaXMuX2RpbWVuc2lvbnMubGVuZ3RoO2U8bjtlKyspe3ZhciByPXRoaXMuX2RpbWVuc2lvbnNbZV07dC5wdXNoKCJzdHJpbmciPT10eXBlb2Ygcj9yOnIudG9BcnJheSgpKX1yZXR1cm4gdH0sbi5wcm90b3R5cGUudmFsdWVPZj1uLnByb3RvdHlwZS50b0FycmF5LG4ucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLGU9MCxuPXRoaXMuX2RpbWVuc2lvbnMubGVuZ3RoO2U8bjtlKyspe3ZhciByPXRoaXMuX2RpbWVuc2lvbnNbZV07InN0cmluZyI9PXR5cGVvZiByP3QucHVzaChKU09OLnN0cmluZ2lmeShyKSk6dC5wdXNoKHIudG9TdHJpbmcoKSl9cmV0dXJuIlsiK3Quam9pbigiLCAiKSsiXSJ9LG4ucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybnttYXRoanM6IkluZGV4IixkaW1lbnNpb25zOnRoaXMuX2RpbWVuc2lvbnN9fSxuLmZyb21KU09OPWZ1bmN0aW9uKHQpe3JldHVybiBuLmNyZWF0ZSh0LmRpbWVuc2lvbnMpfSxufSkse2lzQ2xhc3M6ITB9KSxqbT0iYXRhbjIiLFVtPXRkKGptLFsidHlwZWQiLCJtYXRyaXgiLCJlcXVhbFNjYWxhciIsIkJpZ051bWJlciIsIkRlbnNlTWF0cml4IiwiY29uY2F0Il0sKHQ9Pnt2YXJ7dHlwZWQ6ZSxtYXRyaXg6bixlcXVhbFNjYWxhcjpyLEJpZ051bWJlcjppLERlbnNlTWF0cml4Om8sY29uY2F0OnN9PXQsYT1XeSh7dHlwZWQ6ZSxlcXVhbFNjYWxhcjpyfSksdT1IeSh7dHlwZWQ6ZX0pLGM9UXkoe3R5cGVkOmUsZXF1YWxTY2FsYXI6cn0pLGw9a3koe3R5cGVkOmUsZXF1YWxTY2FsYXI6cn0pLGg9enkoe3R5cGVkOmUsRGVuc2VNYXRyaXg6b30pLGY9WHkoe3R5cGVkOmUsbWF0cml4Om4sY29uY2F0OnN9KTtyZXR1cm4gZShqbSx7Im51bWJlciwgbnVtYmVyIjpNYXRoLmF0YW4yLCJCaWdOdW1iZXIsIEJpZ051bWJlciI6KHQsZSk9PmkuYXRhbjIodCxlKX0sZih7c2NhbGFyOiJudW1iZXIgfCBCaWdOdW1iZXIiLFNTOmMsRFM6dSxTRDphLFNzOmwsc1M6aH0pKX0pKSxxbT10ZCgiYWRkIixbInR5cGVkIiwibWF0cml4IiwiYWRkU2NhbGFyIiwiZXF1YWxTY2FsYXIiLCJEZW5zZU1hdHJpeCIsIlNwYXJzZU1hdHJpeCIsImNvbmNhdCJdLCh0PT57dmFye3R5cGVkOmUsbWF0cml4Om4sYWRkU2NhbGFyOnIsZXF1YWxTY2FsYXI6aSxEZW5zZU1hdHJpeDpvLFNwYXJzZU1hdHJpeDpzLGNvbmNhdDphfT10LHU9VXkoe3R5cGVkOmV9KSxjPXF5KHt0eXBlZDplLGVxdWFsU2NhbGFyOml9KSxsPVZ5KHt0eXBlZDplLERlbnNlTWF0cml4Om99KSxoPVh5KHt0eXBlZDplLG1hdHJpeDpuLGNvbmNhdDphfSk7cmV0dXJuIGUoImFkZCIseyJhbnksIGFueSI6ciwiYW55LCBhbnksIC4uLmFueSI6ZS5yZWZlclRvU2VsZigodD0+KGUsbixyKT0+e2Zvcih2YXIgaT10KGUsbiksbz0wO288ci5sZW5ndGg7bysrKWk9dChpLHJbb10pO3JldHVybiBpfSkpfSxoKHtlbG9wOnIsRFM6dSxTUzpjLFNzOmx9KSl9KSksVm09dGQoImRvdCIsWyJ0eXBlZCIsImFkZFNjYWxhciIsIm11bHRpcGx5U2NhbGFyIiwiY29uaiIsInNpemUiXSwodD0+e3Zhcnt0eXBlZDplLGFkZFNjYWxhcjpuLG11bHRpcGx5U2NhbGFyOnIsY29uajppLHNpemU6b309dDtyZXR1cm4gZSgiZG90Iix7IkFycmF5IHwgRGVuc2VNYXRyaXgsIEFycmF5IHwgRGVuc2VNYXRyaXgiOmZ1bmN0aW9uKHQsbyl7dmFyIHU9cyh0LG8pLGM9a2YodCk/dC5fZGF0YTp0LGw9a2YodCk/dC5fZGF0YXR5cGU6dm9pZCAwLGg9a2Yobyk/by5fZGF0YTpvLGY9a2Yobyk/by5fZGF0YXR5cGU6dm9pZCAwLHA9Mj09PWEodCkubGVuZ3RoLGQ9Mj09PWEobykubGVuZ3RoLGc9bix5PXI7aWYobCYmZiYmbD09PWYmJiJzdHJpbmciPT10eXBlb2YgbCl7dmFyIG09bDtnPWUuZmluZChuLFttLG1dKSx5PWUuZmluZChyLFttLG1dKX1pZighcCYmIWQpe2Zvcih2YXIgdj15KGkoY1swXSksaFswXSksXz0xO188dTtfKyspdj1nKHYseShpKGNbX10pLGhbX10pKTtyZXR1cm4gdn1pZighcCYmZCl7Zm9yKHZhciB4PXkoaShjWzBdKSxoWzBdWzBdKSx3PTE7dzx1O3crKyl4PWcoeCx5KGkoY1t3XSksaFt3XVswXSkpO3JldHVybiB4fWlmKHAmJiFkKXtmb3IodmFyIGI9eShpKGNbMF1bMF0pLGhbMF0pLEQ9MTtEPHU7RCsrKWI9ZyhiLHkoaShjW0RdWzBdKSxoW0RdKSk7cmV0dXJuIGJ9aWYocCYmZCl7Zm9yKHZhciBFPXkoaShjWzBdWzBdKSxoWzBdWzBdKSxDPTE7Qzx1O0MrKylFPWcoRSx5KGkoY1tDXVswXSksaFtDXVswXSkpO3JldHVybiBFfX0sIlNwYXJzZU1hdHJpeCwgU3BhcnNlTWF0cml4IjpmdW5jdGlvbih0LGUpe3ModCxlKTtmb3IodmFyIGk9dC5faW5kZXgsbz10Ll92YWx1ZXMsYT1lLl9pbmRleCx1PWUuX3ZhbHVlcyxjPTAsbD1uLGg9cixmPTAscD0wO2Y8aS5sZW5ndGgmJnA8YS5sZW5ndGg7KXt2YXIgZD1pW2ZdLGc9YVtwXTtkPGc/ZisrOmQ+Zz9wKys6ZD09PWcmJihjPWwoYyxoKG9bZl0sdVtwXSkpLGYrKyxwKyspfXJldHVybiBjfX0pO2Z1bmN0aW9uIHModCxlKXt2YXIgbixyLGk9YSh0KSxvPWEoZSk7aWYoMT09PWkubGVuZ3RoKW49aVswXTtlbHNle2lmKDIhPT1pLmxlbmd0aHx8MSE9PWlbMV0pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkV4cGVjdGVkIGEgY29sdW1uIHZlY3RvciwgaW5zdGVhZCBnb3QgYSBtYXRyaXggb2Ygc2l6ZSAoIitpLmpvaW4oIiwgIikrIikiKTtuPWlbMF19aWYoMT09PW8ubGVuZ3RoKXI9b1swXTtlbHNle2lmKDIhPT1vLmxlbmd0aHx8MSE9PW9bMV0pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkV4cGVjdGVkIGEgY29sdW1uIHZlY3RvciwgaW5zdGVhZCBnb3QgYSBtYXRyaXggb2Ygc2l6ZSAoIitvLmpvaW4oIiwgIikrIikiKTtyPW9bMF19aWYobiE9PXIpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIlZlY3RvcnMgbXVzdCBoYXZlIGVxdWFsIGxlbmd0aCAoIituKyIgIT0gIityKyIpIik7aWYoMD09PW4pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkNhbm5vdCBjYWxjdWxhdGUgdGhlIGRvdCBwcm9kdWN0IG9mIGVtcHR5IHZlY3RvcnMiKTtyZXR1cm4gbn1mdW5jdGlvbiBhKHQpe3JldHVybiBrZih0KT90LnNpemUoKTpvKHQpfX0pKSxHbT0iaW5kZXgiLFltPXRkKEdtLFsidHlwZWQiLCJJbmRleCJdLCh0PT57dmFye3R5cGVkOmUsSW5kZXg6bn09dDtyZXR1cm4gZShHbSx7Ii4uLm51bWJlciB8IHN0cmluZyB8IEJpZ051bWJlciB8IFJhbmdlIHwgQXJyYXkgfCBNYXRyaXgiOmZ1bmN0aW9uKHQpe3ZhciBlPXQubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gRmYodCk/dC50b051bWJlcigpOkFycmF5LmlzQXJyYXkodCl8fGtmKHQpP3QubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gRmYodCk/dC50b051bWJlcigpOnR9KSk6dH0pKSxyPW5ldyBuO3JldHVybiBuLmFwcGx5KHIsZSkscn19KX0pKSxYbT1LZyh7Y29uZmlnOnhwfSksV209b3koe30pLEhtPXl5KHt9KSxabT1teSh7fSksS209X3koe01hdHJpeDpabX0pLEptPWhkKHtCaWdOdW1iZXI6WG0sQ29tcGxleDpXbSxEZW5zZU1hdHJpeDpLbSxGcmFjdGlvbjpIbX0pLFFtPUJ5KHt0eXBlZDpKbX0pLCRtPVR5KHtCaWdOdW1iZXI6WG0sdHlwZWQ6Sm19KSx0dj1lbSh7dHlwZWQ6Sm19KSxldj1JeSh7Y29uZmlnOnhwLHR5cGVkOkptfSksbnY9Ynkoe3R5cGVkOkptfSkscnY9Wnkoe3R5cGVkOkptfSksaXY9Rnkoe3R5cGVkOkptfSksb3Y9TXkoe01hdHJpeDpabSxlcXVhbFNjYWxhcjpldix0eXBlZDpKbX0pLHN2PU95KHtGcmFjdGlvbjpIbSx0eXBlZDpKbX0pLGF2PVB5KHtEZW5zZU1hdHJpeDpLbSxNYXRyaXg6Wm0sU3BhcnNlTWF0cml4Om92LHR5cGVkOkptfSksdXY9d20oe2JpZ251bWJlcjokbSxmcmFjdGlvbjpzdixudW1iZXI6aXZ9KSxjdj1mbSh7bWF0cml4OmF2LGNvbmZpZzp4cCx0eXBlZDpKbX0pLGx2PWRtKHttYXRyaXg6YXYsdHlwZWQ6Sm19KSxodj14bSh7bWF0cml4OmF2LHR5cGVkOkptfSksZnY9cm0oe2lzSW50ZWdlcjpudixtYXRyaXg6YXYsdHlwZWQ6Sm19KSxwdj1DbSh7RGVuc2VNYXRyaXg6S20sY29uY2F0OmZ2LGRpdmlkZVNjYWxhcjpEbSh7bnVtZXJpYzp1dix0eXBlZDpKbX0pLGVxdWFsU2NhbGFyOmV2LG1hdHJpeDphdix0eXBlZDpKbX0pLGR2PVJtKHtEZW5zZU1hdHJpeDpLbSxjb25jYXQ6ZnYsY29uZmlnOnhwLG1hdHJpeDphdix0eXBlZDpKbX0pLGd2PW9tKHtCaWdOdW1iZXI6WG0sY29uZmlnOnhwLG1hdHJpeDphdix0eXBlZDpKbX0pLHl2PUFtKHtEZW5zZU1hdHJpeDpLbSxjb25jYXQ6ZnYsY29uZmlnOnhwLG1hdHJpeDphdix0eXBlZDpKbX0pLG12PXFtKHtEZW5zZU1hdHJpeDpLbSxTcGFyc2VNYXRyaXg6b3YsYWRkU2NhbGFyOlFtLGNvbmNhdDpmdixlcXVhbFNjYWxhcjpldixtYXRyaXg6YXYsdHlwZWQ6Sm19KSx2dj1WbSh7YWRkU2NhbGFyOlFtLGNvbmo6dHYsbXVsdGlwbHlTY2FsYXI6cnYsc2l6ZTpjdix0eXBlZDpKbX0pLF92PXptKHtJbW11dGFibGVEZW5zZU1hdHJpeDprbSh7RGVuc2VNYXRyaXg6S20sc21hbGxlcjp5dn0pfSkseHY9T20oe0RlbnNlTWF0cml4OkttLGNvbmNhdDpmdixjb25maWc6eHAsbWF0cml4OmF2LHR5cGVkOkptfSksd3Y9Snkoe2FkZFNjYWxhcjpRbSxkb3Q6dnYsZXF1YWxTY2FsYXI6ZXYsbWF0cml4OmF2LG11bHRpcGx5U2NhbGFyOnJ2LHR5cGVkOkptfSksYnY9TW0oe0RlbnNlTWF0cml4OkttLGNvbmNhdDpmdixjb25maWc6eHAsbWF0cml4OmF2LHR5cGVkOkptfSksRHY9WW0oe0luZGV4Ol92LHR5cGVkOkptfSksRXY9bG0oe2JpZ251bWJlcjokbSxtYXRyaXg6YXYsY29uZmlnOnhwLGxhcmdlcjp4dixsYXJnZXJFcTpkdixzbWFsbGVyOnl2LHNtYWxsZXJFcTpidix0eXBlZDpKbX0pLEN2PVVtKHtCaWdOdW1iZXI6WG0sRGVuc2VNYXRyaXg6S20sY29uY2F0OmZ2LGVxdWFsU2NhbGFyOmV2LG1hdHJpeDphdix0eXBlZDpKbX0pO2Z1bmN0aW9uIFN2KHQsZSxuKXtjb25zdCByPWF2KFtbZVswXVswXSxlWzBdWzFdXSxbZVsxXVswXSxlWzFdWzFdXV0pLGk9ZVswXVsyXSxvPWVbMV1bMl0scz1uLGE9ZnVuY3Rpb24odCl7Y29uc3QgZT1bXTtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKyl7Y29uc3Qgcj10W25dLGk9clswXSpyWzBdK3JbMV0qclsxXSxvPU1hdGguc3FydChpKTtlLnB1c2gobyl9cmV0dXJuIGV9KHQudG9BcnJheSgpLm1hcCgodD0+dC5zbGljZSgwLDIpKSkpLHU9cHYoZ3YoYXYoYSkuc2l6ZSgpKSxhKSxjPWZ1bmN0aW9uKHQsZSl7Y29uc3Qgbj10Lmxlbmd0aCxyPVtdO2ZvcihsZXQgaT0wO2k8ZS5sZW5ndGg7aSsrKXtsZXQgbz0wO2ZvcihsZXQgcj0wO3I8dC5sZW5ndGg7cisrKW89dFtuLXItMV0rbyplW2ldO3IucHVzaChvKX1yZXR1cm4gcn0ocyxDdih3digtMSx0LnN1YnNldChEdihFdigwLGF2KHQpLnNpemUoKVswXSksMikpKSxhKSk7bGV0IGw9Z3YoMix0LnNpemUoKVswXSk7Y29uc3QgaD13dih0LnN1YnNldChEdihFdigwLHQuc2l6ZSgpWzBdKSwwKSksdSpjKSxmPXd2KHQuc3Vic2V0KER2KEV2KDAsdC5zaXplKClbMF0pLDEpKSx1KmMpLHA9YXYoW1toLDBdLFtmLDBdXSk7bD1sdihwLER2KEV2KDAscC5zaXplKClbMF0pLDApKTtjb25zdCBkPWF2KFtpLG9dKSxnPXd2KHIsbCkseT1kLnJlc2hhcGUoWzIsMV0pO3JldHVybiBodihtdihnLHkpKS50b0FycmF5KCl9ZnVuY3Rpb24gQXYodD1bXSxlLG4scil7Y29uc3QgaT1hdihmdW5jdGlvbih0KXtpZigxIT09dC5sZW5ndGh8fDMhPT10WzBdLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIklucHV0IG1hdHJpeCBtdXN0IGJlIGEgMXgzIG9yIDN4MSBtYXRyaXgiKTtyZXR1cm5bW3RbMF1bMF1dLFt0WzBdWzFdXSxbdFswXVsyXV0sWzFdXX0odCkpLG89YXYoZSkscz13dihvLGkpO3JldHVybiBTdihodihzKSxuLHIpfXZhciBOdj1PYmplY3QuZGVmaW5lUHJvcGVydHksSXY9T2JqZWN0LmRlZmluZVByb3BlcnRpZXMsTXY9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMsRnY9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyxUdj1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LE92PU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUsTHY9TWF0aC5wb3csUHY9KHQsZSxuKT0+ZSBpbiB0P052KHQsZSx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6bn0pOnRbZV09bjtmdW5jdGlvbiBSdih0KXtyZXR1cm4obmV3IFloKS5zZXQoLi4udCl9ZnVuY3Rpb24gQnYodCxlLG4pe3RyeXtjb25zdCByPVZ0LnRyYW5zZmVyTWF0cml4MzRGcm9tS2l0dGkyVGhyZWUodCksaT1WdC50cmFuc2Zlck1hdHJpeDMzRnJvbUtpdHRpMlRocmVlKGUpLG89VnQudHJhbnNmZXJNYXRyaXgzNEZyb21LaXR0aTJUaHJlZShuKSxzPVJ2KHIpLGE9UnYoaSksdT1SdihvKTtyZXR1cm57Y29tcG9zZU1hdHJpeDQ6dS5jbG9uZSgpLnByZW11bHRpcGx5KGEpLnByZW11bHRpcGx5KHMpLFBNOnMsUk06YSxUTTp1fX1jYXRjaCh0KXt9fWNvbnN0IGt2PSh0LGUpPT5lLnNvbWUoKGU9PmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4hKHQubGVuZ3RoIT09ZXx8dC5zb21lKCh0PT50Lmxlbmd0aCE9PW4pKSl9KHQsZVswXSxlWzFdKSkpLHp2PXQ9Pnt2YXIgZTtyZXR1cm4hISgobnVsbD09KGU9dC5maXNoZXllRGlzdG9ydGlvbik/dm9pZCAwOmUubGVuZ3RoKT4wJiZrdih0LlAsW1szLDRdLFs0LDRdXSkmJmt2KHQuVCxbWzMsNF0sWzQsNF1dKSl9LGp2PSh0LGUpPT57aWYoITEhPT16dihlKSlyZXR1cm4obnVsbD09ZT92b2lkIDA6ZS5jYW1lcmFUeXBlKT09PUp0Lk9tbmlDYW1lcmE/KCh0LGUpPT57aWYoITE9PT16dihlKSlyZXR1cm47Y29uc3R7UDpuLGZpc2hleWVEaXN0b3J0aW9uOnIsVDppfT1lLG89bmV3IGRoKHQueCx0LnksdC56KSxzPVJ2KFZ0LnRyYW5zZmVyTWF0cml4MzRGcm9tS2l0dGkyVGhyZWUoaSkpLGE9UnYoVnQudHJhbnNmZXJNYXRyaXgzNEZyb21LaXR0aTJUaHJlZShuKSksdT1vLmFwcGx5TWF0cml4NChzKSxjPUx2KEx2KHUueCwyKStMdih1LnksMiksLjUpLGw9TWF0aC5hdGFuKHUuei9jKSxoPXIucmVkdWNlKCgodCxlLG4pPT50K2UqTHYobCxuKSksMCk7cmV0dXJuIHUueD11LngvYypoLHUueT11LnkvYypoLHUuej0xLHUuYXBwbHlNYXRyaXg0KGEpfSkodCxlKToobnVsbD09ZT92b2lkIDA6ZS5jYW1lcmFUeXBlKT09PUp0Lkthbm5hbGFCcmFuZHQ/KCh0LGUpPT57Y29uc3R7UDpuLFQ6cixmaXNoZXllRGlzdG9ydGlvbjppfT1lLG89W3QueCx0LnksdC56LDFdLHM9ci5tYXAoKHQ9PnQucmVkdWNlKCgodCxlLG4pPT50K2Uqb1tuXSksMCkpKSxhPXNbMF0sdT1zWzFdLGM9c1syXTtpZighKGM+PS4wMSYmaXNGaW5pdGUoYykpKXJldHVybjtjb25zdCBsPVtbblswXVswXSxuWzBdWzFdXSxbblsxXVswXSxuWzFdWzFdXV0saD1uWzBdWzJdLGY9blsxXVsyXSxwPU1hdGguc3FydChhKmErdSp1KSxkPU1hdGguYXRhbjIocCxjKSxnPWQraS5yZWR1Y2UoKCh0LGUsbik9PnQrZSpNYXRoLnBvdyhkLDIqbiszKSksMCk7bGV0IHksbTtyZXR1cm4gMCE9PXA/KHk9YSpnL3AsbT11KmcvcCk6KHk9MCxtPTApLHt4OmxbMF1bMF0qeStsWzBdWzFdKm0raCx5OmxbMV1bMF0qeStsWzFdWzFdKm0rZn19KSh0LGUpOihudWxsPT1lP3ZvaWQgMDplLmNhbWVyYVR5cGUpPT09SnQuT21uaUNhbWVyYTExVj8oKHQsZSk9PntpZighMT09PXp2KGUpKXJldHVybjtjb25zdHtQOm4sZmlzaGV5ZURpc3RvcnRpb246cixUOml9PWUsbz1BdihbW3QueCx0LnksdC56XV0saSxuLHIpO3JldHVybiBuZXcgZGgob1swXVswXSxvWzBdWzFdLDEpfSkodCxlKTp2b2lkIDB9O2Z1bmN0aW9uIFV2KHQsZSl7Y29uc3Qgbj1uZXcgZGgodC54LHQueSx0LnopLmFwcGx5TWF0cml4NChlKTtpZihuLno8MClyZXR1cm47Y29uc3Qgcj0xL24ueixpPShuZXcgWWgpLnNldChyLDAsMCwwLDAsciwwLDAsMCwwLHIsMCwwLDAsMCwxKTtyZXR1cm4gbi5hcHBseU1hdHJpeDQoaSl9ZnVuY3Rpb24gcXYodCxlLG4pe2NvbnN0IHI9ZS54LXQueCxpPWUueS10Lnksbz1uLngtdC54O3JldHVybiByKihuLnktdC55KS1vKml9ZnVuY3Rpb24gVnYodCxlLG49e2NyZWF0ZVJhbmdlOiExfSl7dmFyIHI7aWYoIWUpcmV0dXJue3RyYW5zZmVyVmlld0RhdGE6W10sdmlld1JhbmdlUG9pbnRMaXN0OltdfTtjb25zdHtjcmVhdGVSYW5nZTppfT1uLG89VXQuZ2V0QWxsVmlld0RhdGEodCkscz16dihlKSx7UDphLFI6dSxUOmN9PWU7bGV0IGw7aWYoITE9PT1zKXtjb25zdHtjb21wb3NlTWF0cml4NDp0fT1udWxsIT0ocj1CdihhLHUsYykpP3I6e307aWYoIXQpcmV0dXJuO2w9dH1jb25zdCBoPW8ubWFwKChuPT4oe3R5cGU6bi50eXBlLHBvaW50TGlzdDpuLnBvaW50TGlzdC5tYXAoKGU9PmZ1bmN0aW9uKHQsZSxuKXt2YXIgcjtjb25zdCBpPW5ldyB5aCh0LngsdC55LG51bGwhPShyPW51bGw9PXQ/dm9pZCAwOnQueik/cjoxKSxvPShuZXcgWWgpLm1ha2VSb3RhdGlvbloobikscz0obmV3IFloKS5tYWtlVHJhbnNsYXRpb24oZS54LGUueSxlLnopLGE9KG5ldyBZaCkubWFrZVRyYW5zbGF0aW9uKC1lLngsLWUueSwtZS56KTtyZXR1cm4gaS5jbG9uZSgpLmFwcGx5TWF0cml4NChhKS5hcHBseU1hdHJpeDQobykuYXBwbHlNYXRyaXg0KHMpfShlLHQuY2VudGVyLHQucm90YXRpb24pKSkubWFwKCh0PT5zP2p2KHQsZSk6bCYmVXYodCxsKSkpLm1hcCgodD0+e2lmKHQpcmV0dXJue2lkOmpsKCkseDpudWxsPT10P3ZvaWQgMDp0LngseTpudWxsPT10P3ZvaWQgMDp0Lnl9fSkpLmZpbHRlcigodD0+dm9pZCAwIT09dCkpfSkpKS5maWx0ZXIoKHQ9PjAhPT10LnBvaW50TGlzdC5sZW5ndGgpKTtoWzBdJiZoWzBdLnBvaW50TGlzdCYmKGhbMF0ucG9pbnRMaXN0PWhbMF0ucG9pbnRMaXN0Lm1hcCgodD0+KCh0LGUpPT5Jdih0LE12KGUpKSkoKCh0LGUpPT57Zm9yKHZhciBuIGluIGV8fChlPXt9KSlUdi5jYWxsKGUsbikmJlB2KHQsbixlW25dKTtpZihGdilmb3IodmFyIG4gb2YgRnYoZSkpT3YuY2FsbChlLG4pJiZQdih0LG4sZVtuXSk7cmV0dXJuIHR9KSh7fSx0KSx7c3BlY2lhbEVkZ2U6ITB9KSkpKTtsZXQgZj1bXTtpZig2PT09aC5sZW5ndGgmJiEwPT09aSl7Zj1mdW5jdGlvbih0KXtjb25zdCBlPWZ1bmN0aW9uKHQpe2NvbnN0IGU9dC5zbGljZSgpO3JldHVybiBlLnNvcnQoKCh0LGUpPT50Lng9PT1lLng/ZS55LXQueTp0LngtZS54KSksZX0odCksbj1bXTtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrKyl7Zm9yKDtuLmxlbmd0aD49MiYmcXYobltuLmxlbmd0aC0yXSxuW24ubGVuZ3RoLTFdLGVbdF0pPD0wOyluLnBvcCgpO24ucHVzaChlW3RdKX1jb25zdCByPVtdO2ZvcihsZXQgdD1lLmxlbmd0aC0xO3Q+PTA7dC0tKXtmb3IoO3IubGVuZ3RoPj0yJiZxdihyW3IubGVuZ3RoLTJdLHJbci5sZW5ndGgtMV0sZVt0XSk8PTA7KXIucG9wKCk7ci5wdXNoKGVbdF0pfXJldHVybiBuLnBvcCgpLHIucG9wKCksbi5jb25jYXQocil9KFsuLi5oWzBdLnBvaW50TGlzdCwuLi5oWzFdLnBvaW50TGlzdF0pfXJldHVybnt0cmFuc2ZlclZpZXdEYXRhOmgsdmlld1JhbmdlUG9pbnRMaXN0OmZ9fXZhciBHdixZdjshZnVuY3Rpb24odCl7dFt0LlVwbG9hZD0wXT0iVXBsb2FkIix0W3QuVXBsb2FkUmV0cnk9MV09IlVwbG9hZFJldHJ5Iix0W3QuVXBsb2FkRmFpbD0yXT0iVXBsb2FkRmFpbCIsdFt0LkFubm90YXRpb249M109IkFubm90YXRpb24iLHRbdC5UZXJtaW5hdGVkPTRdPSJUZXJtaW5hdGVkIix0W3QuRmluaXNoPTVdPSJGaW5pc2giLHRbdC5QdWJsaXNoPTZdPSJQdWJsaXNoIn0oR3Z8fChHdj17fSkpLGZ1bmN0aW9uKHQpe3RbdC5SZWFkeT0xXT0iUmVhZHkiLHRbdC5GaXJzdFBvaW50PTJdPSJGaXJzdFBvaW50Iix0W3QuQ3Vib2lkPTNdPSJDdWJvaWQifShZdnx8KFl2PXt9KSk7dmFyIFh2PWZ1bmN0aW9uKHQsZSxuKXt2YXIgcjtyZXR1cm4gZnVuY3Rpb24oaSl7cmV0dXJuIHI9cnx8emwodCxlLG4pLG5ldyBXb3JrZXIocixpKX19KCJMeW9nY205c2JIVndMWEJzZFdkcGJpMTNaV0l0ZDI5eWEyVnlMV3h2WVdSbGNpQXFMd3AyWVhJZ2QyOXlhMlZ5WDJOdlpHVTlablZ1WTNScGIyNG9jQ2w3SW5WelpTQnpkSEpwWTNRaU8yTnZibk4wSUhZOVd5MHhMQzB4TEMweFhUdHNaWFFnU1QwaE1UdG1kVzVqZEdsdmJpQkNLR1VwZTJOdmJuTjBJSFE5TFRjc2J6MHpMRzQ5YnkxME8zSmxkSFZ5YmlCbFBIUW1KaWhsUFhRcExHVStieVltS0dVOWJ5a3NUV0YwYUM1bWJHOXZjaWdvWlMxMEtTOXVLakkxTlNsOVpuVnVZM1JwYjI0Z1JTZ3BlMnhsZENCbE8yTnZibk4wSUhROWJtVjNJRUZ5Y21GNUtESTFOaWt1Wm1sc2JDZ2lJaWt1YldGd0tDZ3BQVDV1WlhjZ1FYSnlZWGtvTXlrdVptbHNiQ2dpSWlrcE8yWnZjaWhzWlhRZ2J6MHdPMjg4TWpBN2J5c3JLWHRtYjNJb1pUMHdPMlU4TXpJN1pTc3JLWFJiWlYxYk1GMDlNVEk0S3pRcVpTeDBXMlZkV3pGZFBUQXNkRnRsWFZzeVhUMHdPMlp2Y2loMFd6TXlYVnN3WFQweU5UVXNkRnN6TWwxYk1WMDlNQ3gwV3pNeVhWc3lYVDB3TEdVOU1EdGxQRFl6TzJVckt5bDBXek16SzJWZFd6QmRQVEkxTlN4MFd6TXpLMlZkV3pGZFBUUXJOQ3BsTEhSYk16TXJaVjFiTWwwOU1EdG1iM0lvZEZzNU5sMWJNRjA5TWpVMExIUmJPVFpkV3pGZFBUSTFOU3gwV3prMlhWc3lYVDB5TEdVOU1EdGxQRFl5TzJVckt5bDBXemszSzJWZFd6QmRQVEkxTUMwMEttVXNkRnM1Tnl0bFhWc3hYVDB5TlRVc2RGczVOeXRsWFZzeVhUMDJLelFxWlR0bWIzSW9kRnN4TlRsZFd6QmRQVEVzZEZzeE5UbGRXekZkUFRJMU5TeDBXekUxT1YxYk1sMDlNalUwTEdVOU1EdGxQRFkwTzJVckt5bDBXekUyTUN0bFhWc3dYVDB3TEhSYk1UWXdLMlZkV3pGZFBUSTFNaTFsS2pRc2RGc3hOakFyWlYxYk1sMDlNalUxTzJadmNpaGxQVEE3WlR3ek1qdGxLeXNwZEZzeU1qUXJaVjFiTUYwOU1DeDBXekl5TkN0bFhWc3hYVDB3TEhSYk1qSTBLMlZkV3pKZFBUSTFNaTAwS21WOWNtVjBkWEp1SUhSOVkyOXVjM1FnVWoxRktDazdablZ1WTNScGIyNGdhQ2hsTEhRc2J6MHdLWHRzWlhRZ2JqMHdMR0VzZUN4cExHdzdkRDFiTGk0dWRGMHNiejA5UFRFbUppaDBQV055WldGMFpWTnRiMjkwYUVOMWNuWmxVRzlwYm5SektIUXVjbVZrZFdObEtDaDVMR01wUFQ1YkxpNHVlU3hqTG5nc1l5NTVYU3hiWFNrc0xqVXNJVEFzVTBWSFRVVk9WRjlPVlUxQ1JWSXBLU3hiYVYwOWREdGpiMjV6ZENCMVBYUXViR1Z1WjNSb08yWnZjaWhoUFRFN1lUdzlkVHRoS3lzcGJEMTBXMkVsZFYwc1pTNTRQazFoZEdndWJXbHVLR2t1ZUN4c0xuZ3BKaVpsTG5nOFBVMWhkR2d1YldGNEtHa3VlQ3hzTG5ncEppWmxMbms4UFUxaGRHZ3ViV0Y0S0drdWVTeHNMbmtwSmlacExuZ2hQVDFzTG5nbUppaDRQU2hsTG5ndGFTNTRLU29vYkM1NUxXa3VlU2t2S0d3dWVDMXBMbmdwSzJrdWVTd29hUzU1UFQwOWJDNTVmSHhsTG5rOFBYZ3BKaVp1S3lzcExHazliRHR5WlhSMWNtNGdiaVV5SVQwd2ZXWjFibU4wYVc5dUlFOG9lM3BOYVc0NlpTeDZUV0Y0T25Rc2NHOXNlV2R2YmxCdmFXNTBUR2x6ZERwdkxHRjBkSEpwWW5WMFpUcHVMSGc2WVN4NU9uZ3NlanBwTEdOdmJHOXlUR2x6ZERwc0xIWmhiR2xrT25WOUtYdHBaaWhvS0h0NE9tRXNlVHA0ZlN4dktTWW1hVDQ5WlNZbWFUdzlkQ2x5WlhSMWNtNGdkVDA5UFNFeFAxc3hMREV3TXk4eU5UVXNNVEF5THpJMU5WMDZiRnR1WFQ5c1cyNWRMbkpuWW1FdWMyeHBZMlVvTUN3ektTNXRZWEFvWXowK1l5OHlOVFVwT2xzeExEQXNNRjE5Wm5WdVkzUnBiMjRnYlNobEtYdGpiMjV6ZENCMFBVSW9aU2tzYnoxU1czUmRMRnR1TEdFc2VGMDlienR5WlhSMWNtNWJiaTh5TlRVc1lTOHlOVFVzZUM4eU5UVmRmWEpsZEhWeWJpQnZibTFsYzNOaFoyVTlablZ1WTNScGIyNG9kQ2w3WTI5dWMzUjdjRzl6YVhScGIyNDZieXhqYjJ4dmNqcHVMR04xWW05cFpFeHBjM1E2WVN4amIyeHZja3hwYzNRNmVDeG9hV2RvYkdsbmFIUkpibVJsZURwcGZUMTBMbVJoZEdFN2JHVjBlMjF2WkdsbWFXVmtRbTk0U1dSek9tdzlXMTBzY21WelpYUkJjbVZoY3pwMVBWdGRmVDEwTG1SaGRHRXNlVDB3TzJaMWJtTjBhVzl1SUdNb0tYdDVLejB4ZldsbUtDRnZLWEpsZEhWeWJqdGpiMjV6ZENCZlBTRWhLR2s5UFc1MWJHdy9kbTlwWkNBd09ta3ViR1Z1WjNSb0tUc29YM3g4U1NrbUppaHNQVnRkTEhVOVcxMHBPMk52Ym5OMElIYzliQzVzWlc1bmRHZy9ZUzVtYVd4MFpYSW9jajArYkM1cGJtTnNkV1JsY3loeUxtbGtLU2s2WVR0bWIzSW9iR1YwSUhJOU1EdHlQRzh1YkdWdVozUm9PM0lyUFRNcGUyTnZibk4wSUVNOWIxdHlYU3hNUFc5YmNpc3hYU3hrUFc5YmNpc3lYVHRzWlhRZ1p6dHBaaWgxTG14bGJtZDBhRDA5UFRFbUppRnNMbXhsYm1kMGFDbG9LSHQ0T2tNc2VUcE1mU3gxV3pCZEtUOW5QVzBvWkNrNlp6MTJPMlZzYzJVZ2FXWW9kUzVzWlc1bmRHaDhmR3d1YkdWdVozUm9LWHRzWlhRZ2N6MGhNVHQzTG5OdmJXVW9aajArZTJOdmJuTjBJRTA5VHloN2NHOXNlV2R2YmxCdmFXNTBUR2x6ZERwbUxuQnZiSGxuYjI1UWIybHVkRXhwYzNRc2VrMXBianBtTG5wTmFXNHNlazFoZURwbUxucE5ZWGdzZURwRExIazZUQ3g2T21Rc1lYUjBjbWxpZFhSbE9tWXVZWFIwY21saWRYUmxMR052Ykc5eVRHbHpkRHA0TEhaaGJHbGtPbVl1ZG1Gc2FXUjlLVHR5WlhSMWNtNGdUVDhvWXlncExHYzlUU3h6UFNFd0xDRXdLVG9oTVgwcExDRnpKaVoxTG14bGJtZDBhQ1ltS0hNOWRTNXpiMjFsS0dZOVBtZ29lM2c2UXl4NU9reDlMR1lwUHloblBXMG9aQ2tzSVRBcE9pRXhLU2tzSVhNbUppRmZKaVlvU1Q5blBXMG9aQ2s2WnoxMktYMWxiSE5sSUhjdWMyOXRaU2h6UFQ1N1kyOXVjM1FnWmoxUEtIdHdiMng1WjI5dVVHOXBiblJNYVhOME9uTXVjRzlzZVdkdmJsQnZhVzUwVEdsemRDeDZUV2x1T25NdWVrMXBiaXg2VFdGNE9uTXVlazFoZUN4NE9rTXNlVHBNTEhvNlpDeGhkSFJ5YVdKMWRHVTZjeTVoZEhSeWFXSjFkR1VzWTI5c2IzSk1hWE4wT25nc2RtRnNhV1E2Y3k1MllXeHBaSDBwTzNKbGRIVnliaUJtUHloaktDa3NaejFtTENFd0tUb2hNWDBwTzJOdmJuTjBJRUU5Y3owK2UyTnZibk4wSUdZOVRXRjBhQzVtYkc5dmNpaHpMek1wTzNKbGRIVnliaUJwSmlacFcyWmRQVDA5TVgwN2FXWW9aeWxwWmlobld6QmRQVDA5ZGxzd1hTWW1RU2h5S1NsdVczSmRQVEFzYmx0eUt6RmRQVEFzYmx0eUt6SmRQVEE3Wld4elpYdGpiMjV6ZEZ0ekxHWXNUVjA5Wnp0dVczSmRQWE1zYmx0eUt6RmRQV1lzYmx0eUt6SmRQVTE5Wld4elpTQnBaaWhCS0hJcEtXNWJjbDA5TUN4dVczSXJNVjA5TUN4dVczSXJNbDA5TUR0bGJITmxlMk52Ym5OMFczTXNaaXhOWFQxdEtHUXBPMjViY2wwOWN5eHVXM0lyTVYwOVppeHVXM0lyTWwwOVRYMTlTVDFmTEhCdmMzUk5aWE56WVdkbEtIdHdiMmx1ZEhNNmJ5eGpiMnh2Y2pwdUxHNTFiVHA1ZlNsOUxIQXVhWE5KYmxCdmJIbG5iMjQ5YUN4UFltcGxZM1F1WkdWbWFXNWxVSEp2Y0dWeWRIa29jQ3dpWDE5bGMwMXZaSFZzWlNJc2UzWmhiSFZsT2lFd2ZTa3NjSDBvZTMwcE93b0siLG51bGwsITEpO09iamVjdC5kZWZpbmVQcm9wZXJ0eTtuZXcgY2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLnNlZ21lbnRTdGF0dXM9S3QuUmVhZHl9c3RhdHVzVG9nZ2xlKCl7c3dpdGNoKHRoaXMuc2VnbWVudFN0YXR1cyl7Y2FzZSBLdC5SZWFkeTp0aGlzLnNlZ21lbnRTdGF0dXM9S3QuQ2hlY2s7YnJlYWs7Y2FzZSBLdC5DaGVjazp0aGlzLnNlZ21lbnRTdGF0dXM9S3QuRWRpdDticmVhaztjYXNlIEt0LkVkaXQ6dGhpcy5zZWdtZW50U3RhdHVzPUt0LlJlYWR5fX11cGRhdGVTdGF0dXMyRWRpdCgpe3RoaXMuc2VnbWVudFN0YXR1cz1LdC5FZGl0fXVwZGF0ZVN0YXR1czJDaGVjaygpe3RoaXMuc2VnbWVudFN0YXR1cz1LdC5DaGVja311cGRhdGVTdGF0dXMyUmVhZHkoKXt0aGlzLnNlZ21lbnRTdGF0dXM9S3QuUmVhZHl9Z2V0IGlzUmVhZHlTdGF0dXMoKXtyZXR1cm4gdGhpcy5zZWdtZW50U3RhdHVzPT09S3QuUmVhZHl9Z2V0IGlzQ2hlY2tTdGF0dXMoKXtyZXR1cm4gdGhpcy5zZWdtZW50U3RhdHVzPT09S3QuQ2hlY2t9Z2V0IGlzRWRpdFN0YXR1cygpe3JldHVybiB0aGlzLnNlZ21lbnRTdGF0dXM9PT1LdC5FZGl0fX0sbmV3IFh2KHt0eXBlOiJtb2R1bGUifSk7dmFyIFd2PWVlKChmdW5jdGlvbih0LGUpeyhmdW5jdGlvbigpe3ZhciBuLHI9IkV4cGVjdGVkIGEgZnVuY3Rpb24iLGk9Il9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iLG89Il9fbG9kYXNoX3BsYWNlaG9sZGVyX18iLHM9MTYsYT0zMix1PTY0LGM9MTI4LGw9MjU2LGg9MS8wLGY9OTAwNzE5OTI1NDc0MDk5MSxwPU5hTixkPTQyOTQ5NjcyOTUsZz1kLTEseT1kPj4+MSxtPVtbImFyeSIsY10sWyJiaW5kIiwxXSxbImJpbmRLZXkiLDJdLFsiY3VycnkiLDhdLFsiY3VycnlSaWdodCIsc10sWyJmbGlwIiw1MTJdLFsicGFydGlhbCIsYV0sWyJwYXJ0aWFsUmlnaHQiLHVdLFsicmVhcmciLGxdXSx2PSJbb2JqZWN0IEFyZ3VtZW50c10iLF89IltvYmplY3QgQXJyYXldIix4PSJbb2JqZWN0IEJvb2xlYW5dIix3PSJbb2JqZWN0IERhdGVdIixiPSJbb2JqZWN0IEVycm9yXSIsRD0iW29iamVjdCBGdW5jdGlvbl0iLEU9IltvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dIixDPSJbb2JqZWN0IE1hcF0iLFM9IltvYmplY3QgTnVtYmVyXSIsQT0iW29iamVjdCBPYmplY3RdIixOPSJbb2JqZWN0IFByb21pc2VdIixJPSJbb2JqZWN0IFJlZ0V4cF0iLE09IltvYmplY3QgU2V0XSIsRj0iW29iamVjdCBTdHJpbmddIixUPSJbb2JqZWN0IFN5bWJvbF0iLE89IltvYmplY3QgV2Vha01hcF0iLEw9IltvYmplY3QgQXJyYXlCdWZmZXJdIixQPSJbb2JqZWN0IERhdGFWaWV3XSIsUj0iW29iamVjdCBGbG9hdDMyQXJyYXldIixCPSJbb2JqZWN0IEZsb2F0NjRBcnJheV0iLGs9IltvYmplY3QgSW50OEFycmF5XSIsej0iW29iamVjdCBJbnQxNkFycmF5XSIsaj0iW29iamVjdCBJbnQzMkFycmF5XSIsVT0iW29iamVjdCBVaW50OEFycmF5XSIscT0iW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0iLFY9IltvYmplY3QgVWludDE2QXJyYXldIixHPSJbb2JqZWN0IFVpbnQzMkFycmF5XSIsWT0vXGJfX3AgXCs9ICcnOy9nLFg9L1xiKF9fcCBcKz0pICcnIFwrL2csVz0vKF9fZVwoLio/XCl8XGJfX3RcKSkgXCtcbicnOy9nLEg9LyYoPzphbXB8bHR8Z3R8cXVvdHwjMzkpOy9nLFo9L1smPD4iJ10vZyxLPVJlZ0V4cChILnNvdXJjZSksSj1SZWdFeHAoWi5zb3VyY2UpLFE9LzwlLShbXHNcU10rPyklPi9nLCQ9LzwlKFtcc1xTXSs/KSU+L2csdHQ9LzwlPShbXHNcU10rPyklPi9nLGV0PS9cLnxcWyg/OlteW1xdXSp8KFsiJ10pKD86KD8hXDEpW15cXF18XFwuKSo/XDEpXF0vLG50PS9eXHcqJC8scnQ9L1teLltcXV0rfFxbKD86KC0/XGQrKD86XC5cZCspPyl8KFsiJ10pKCg/Oig/IVwyKVteXFxdfFxcLikqPylcMilcXXwoPz0oPzpcLnxcW1xdKSg/OlwufFxbXF18JCkpL2csaXQ9L1tcXF4kLiorPygpW1xde318XS9nLG90PVJlZ0V4cChpdC5zb3VyY2UpLHN0PS9eXHMrLyxhdD0vXHMvLHV0PS9ceyg/OlxuXC9cKiBcW3dyYXBwZWQgd2l0aCAuK1xdIFwqXC8pP1xuPy8sY3Q9L1x7XG5cL1wqIFxbd3JhcHBlZCB3aXRoICguKylcXSBcKi8sbHQ9Lyw/ICYgLyxodD0vW15ceDAwLVx4MmZceDNhLVx4NDBceDViLVx4NjBceDdiLVx4N2ZdKy9nLGZ0PS9bKCk9LHt9XFtcXVwvXHNdLyxwdD0vXFwoXFwpPy9nLGR0PS9cJFx7KFteXFx9XSooPzpcXC5bXlxcfV0qKSopXH0vZyxndD0vXHcqJC8seXQ9L15bLStdMHhbMC05YS1mXSskL2ksbXQ9L14wYlswMV0rJC9pLHZ0PS9eXFtvYmplY3QgLis/Q29uc3RydWN0b3JcXSQvLF90PS9eMG9bMC03XSskL2kseHQ9L14oPzowfFsxLTldXGQqKSQvLHd0PS9bXHhjMC1ceGQ2XHhkOC1ceGY2XHhmOC1ceGZmXHUwMTAwLVx1MDE3Zl0vZyxidD0vKCReKS8sRHQ9L1snXG5cclx1MjAyOFx1MjAyOVxcXS9nLEV0PSJcXHVkODAwLVxcdWRmZmYiLEN0PSJcXHUwMzAwLVxcdTAzNmZcXHVmZTIwLVxcdWZlMmZcXHUyMGQwLVxcdTIwZmYiLFN0PSJcXHUyNzAwLVxcdTI3YmYiLEF0PSJhLXpcXHhkZi1cXHhmNlxceGY4LVxceGZmIixOdD0iQS1aXFx4YzAtXFx4ZDZcXHhkOC1cXHhkZSIsSXQ9IlxcdWZlMGVcXHVmZTBmIixNdD0iXFx4YWNcXHhiMVxceGQ3XFx4ZjdcXHgwMC1cXHgyZlxceDNhLVxceDQwXFx4NWItXFx4NjBcXHg3Yi1cXHhiZlxcdTIwMDAtXFx1MjA2ZiBcXHRcXHgwYlxcZlxceGEwXFx1ZmVmZlxcblxcclxcdTIwMjhcXHUyMDI5XFx1MTY4MFxcdTE4MGVcXHUyMDAwXFx1MjAwMVxcdTIwMDJcXHUyMDAzXFx1MjAwNFxcdTIwMDVcXHUyMDA2XFx1MjAwN1xcdTIwMDhcXHUyMDA5XFx1MjAwYVxcdTIwMmZcXHUyMDVmXFx1MzAwMCIsRnQ9Ilsn4oCZXSIsVHQ9IlsiK0V0KyJdIixPdD0iWyIrTXQrIl0iLEx0PSJbIitDdCsiXSIsUHQ9IlxcZCsiLFJ0PSJbIitTdCsiXSIsQnQ9IlsiK0F0KyJdIixrdD0iW14iK0V0K010K1B0K1N0K0F0K050KyJdIix6dD0iXFx1ZDgzY1tcXHVkZmZiLVxcdWRmZmZdIixqdD0iW14iK0V0KyJdIixVdD0iKD86XFx1ZDgzY1tcXHVkZGU2LVxcdWRkZmZdKXsyfSIscXQ9IltcXHVkODAwLVxcdWRiZmZdW1xcdWRjMDAtXFx1ZGZmZl0iLFZ0PSJbIitOdCsiXSIsR3Q9IlxcdTIwMGQiLFl0PSIoPzoiK0J0KyJ8IitrdCsiKSIsWHQ9Iig/OiIrVnQrInwiK2t0KyIpIixXdD0iKD86WyfigJldKD86ZHxsbHxtfHJlfHN8dHx2ZSkpPyIsSHQ9Iig/Olsn4oCZXSg/OkR8TEx8TXxSRXxTfFR8VkUpKT8iLFp0PSIoPzoiK0x0KyJ8Iit6dCsiKSIrIj8iLEt0PSJbIitJdCsiXT8iLEp0PUt0K1p0KygiKD86IitHdCsiKD86IitbanQsVXQscXRdLmpvaW4oInwiKSsiKSIrS3QrWnQrIikqIiksUXQ9Iig/OiIrW1J0LFV0LHF0XS5qb2luKCJ8IikrIikiK0p0LCR0PSIoPzoiK1tqdCtMdCsiPyIsTHQsVXQscXQsVHRdLmpvaW4oInwiKSsiKSIsZWU9UmVnRXhwKEZ0LCJnIiksbmU9UmVnRXhwKEx0LCJnIikscmU9UmVnRXhwKHp0KyIoPz0iK3p0KyIpfCIrJHQrSnQsImciKSxpZT1SZWdFeHAoW1Z0KyI/IitCdCsiKyIrV3QrIig/PSIrW090LFZ0LCIkIl0uam9pbigifCIpKyIpIixYdCsiKyIrSHQrIig/PSIrW090LFZ0K1l0LCIkIl0uam9pbigifCIpKyIpIixWdCsiPyIrWXQrIisiK1d0LFZ0KyIrIitIdCwiXFxkKig/OjFTVHwyTkR8M1JEfCg/IVsxMjNdKVxcZFRIKSg/PVxcYnxbYS16X10pIiwiXFxkKig/OjFzdHwybmR8M3JkfCg/IVsxMjNdKVxcZHRoKSg/PVxcYnxbQS1aX10pIixQdCxRdF0uam9pbigifCIpLCJnIiksb2U9UmVnRXhwKCJbIitHdCtFdCtDdCtJdCsiXSIpLHNlPS9bYS16XVtBLVpdfFtBLVpdezJ9W2Etel18WzAtOV1bYS16QS1aXXxbYS16QS1aXVswLTldfFteYS16QS1aMC05IF0vLGFlPVsiQXJyYXkiLCJCdWZmZXIiLCJEYXRhVmlldyIsIkRhdGUiLCJFcnJvciIsIkZsb2F0MzJBcnJheSIsIkZsb2F0NjRBcnJheSIsIkZ1bmN0aW9uIiwiSW50OEFycmF5IiwiSW50MTZBcnJheSIsIkludDMyQXJyYXkiLCJNYXAiLCJNYXRoIiwiT2JqZWN0IiwiUHJvbWlzZSIsIlJlZ0V4cCIsIlNldCIsIlN0cmluZyIsIlN5bWJvbCIsIlR5cGVFcnJvciIsIlVpbnQ4QXJyYXkiLCJVaW50OENsYW1wZWRBcnJheSIsIlVpbnQxNkFycmF5IiwiVWludDMyQXJyYXkiLCJXZWFrTWFwIiwiXyIsImNsZWFyVGltZW91dCIsImlzRmluaXRlIiwicGFyc2VJbnQiLCJzZXRUaW1lb3V0Il0sdWU9LTEsY2U9e307Y2VbUl09Y2VbQl09Y2Vba109Y2Vbel09Y2Vbal09Y2VbVV09Y2VbcV09Y2VbVl09Y2VbR109ITAsY2Vbdl09Y2VbX109Y2VbTF09Y2VbeF09Y2VbUF09Y2Vbd109Y2VbYl09Y2VbRF09Y2VbQ109Y2VbU109Y2VbQV09Y2VbSV09Y2VbTV09Y2VbRl09Y2VbT109ITE7dmFyIGxlPXt9O2xlW3ZdPWxlW19dPWxlW0xdPWxlW1BdPWxlW3hdPWxlW3ddPWxlW1JdPWxlW0JdPWxlW2tdPWxlW3pdPWxlW2pdPWxlW0NdPWxlW1NdPWxlW0FdPWxlW0ldPWxlW01dPWxlW0ZdPWxlW1RdPWxlW1VdPWxlW3FdPWxlW1ZdPWxlW0ddPSEwLGxlW2JdPWxlW0RdPWxlW09dPSExO3ZhciBoZT17IlxcIjoiXFwiLCInIjoiJyIsIlxuIjoibiIsIlxyIjoiciIsIlx1MjAyOCI6InUyMDI4IiwiXHUyMDI5IjoidTIwMjkifSxmZT1wYXJzZUZsb2F0LHBlPXBhcnNlSW50LGRlPSJvYmplY3QiPT10eXBlb2YgdGUmJnRlJiZ0ZS5PYmplY3Q9PT1PYmplY3QmJnRlLGdlPSJvYmplY3QiPT10eXBlb2Ygc2VsZiYmc2VsZiYmc2VsZi5PYmplY3Q9PT1PYmplY3QmJnNlbGYseWU9ZGV8fGdlfHxGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpLG1lPWUmJiFlLm5vZGVUeXBlJiZlLHZlPW1lJiZ0JiYhdC5ub2RlVHlwZSYmdCxfZT12ZSYmdmUuZXhwb3J0cz09PW1lLHhlPV9lJiZkZS5wcm9jZXNzLHdlPWZ1bmN0aW9uKCl7dHJ5e3JldHVybiB2ZSYmdmUucmVxdWlyZSYmdmUucmVxdWlyZSgidXRpbCIpLnR5cGVzfHx4ZSYmeGUuYmluZGluZyYmeGUuYmluZGluZygidXRpbCIpfWNhdGNoKHQpe319KCksYmU9d2UmJndlLmlzQXJyYXlCdWZmZXIsRGU9d2UmJndlLmlzRGF0ZSxFZT13ZSYmd2UuaXNNYXAsQ2U9d2UmJndlLmlzUmVnRXhwLFNlPXdlJiZ3ZS5pc1NldCxBZT13ZSYmd2UuaXNUeXBlZEFycmF5O2Z1bmN0aW9uIE5lKHQsZSxuKXtzd2l0Y2gobi5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4gdC5jYWxsKGUpO2Nhc2UgMTpyZXR1cm4gdC5jYWxsKGUsblswXSk7Y2FzZSAyOnJldHVybiB0LmNhbGwoZSxuWzBdLG5bMV0pO2Nhc2UgMzpyZXR1cm4gdC5jYWxsKGUsblswXSxuWzFdLG5bMl0pfXJldHVybiB0LmFwcGx5KGUsbil9ZnVuY3Rpb24gSWUodCxlLG4scil7Zm9yKHZhciBpPS0xLG89bnVsbD09dD8wOnQubGVuZ3RoOysraTxvOyl7dmFyIHM9dFtpXTtlKHIscyxuKHMpLHQpfXJldHVybiByfWZ1bmN0aW9uIE1lKHQsZSl7Zm9yKHZhciBuPS0xLHI9bnVsbD09dD8wOnQubGVuZ3RoOysrbjxyJiYhMSE9PWUodFtuXSxuLHQpOyk7cmV0dXJuIHR9ZnVuY3Rpb24gRmUodCxlKXtmb3IodmFyIG49bnVsbD09dD8wOnQubGVuZ3RoO24tLSYmITEhPT1lKHRbbl0sbix0KTspO3JldHVybiB0fWZ1bmN0aW9uIFRlKHQsZSl7Zm9yKHZhciBuPS0xLHI9bnVsbD09dD8wOnQubGVuZ3RoOysrbjxyOylpZighZSh0W25dLG4sdCkpcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gT2UodCxlKXtmb3IodmFyIG49LTEscj1udWxsPT10PzA6dC5sZW5ndGgsaT0wLG89W107KytuPHI7KXt2YXIgcz10W25dO2UocyxuLHQpJiYob1tpKytdPXMpfXJldHVybiBvfWZ1bmN0aW9uIExlKHQsZSl7cmV0dXJuISEobnVsbD09dD8wOnQubGVuZ3RoKSYmR2UodCxlLDApPi0xfWZ1bmN0aW9uIFBlKHQsZSxuKXtmb3IodmFyIHI9LTEsaT1udWxsPT10PzA6dC5sZW5ndGg7KytyPGk7KWlmKG4oZSx0W3JdKSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBSZSh0LGUpe2Zvcih2YXIgbj0tMSxyPW51bGw9PXQ/MDp0Lmxlbmd0aCxpPUFycmF5KHIpOysrbjxyOylpW25dPWUodFtuXSxuLHQpO3JldHVybiBpfWZ1bmN0aW9uIEJlKHQsZSl7Zm9yKHZhciBuPS0xLHI9ZS5sZW5ndGgsaT10Lmxlbmd0aDsrK248cjspdFtpK25dPWVbbl07cmV0dXJuIHR9ZnVuY3Rpb24ga2UodCxlLG4scil7dmFyIGk9LTEsbz1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHImJm8mJihuPXRbKytpXSk7KytpPG87KW49ZShuLHRbaV0saSx0KTtyZXR1cm4gbn1mdW5jdGlvbiB6ZSh0LGUsbixyKXt2YXIgaT1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHImJmkmJihuPXRbLS1pXSk7aS0tOyluPWUobix0W2ldLGksdCk7cmV0dXJuIG59ZnVuY3Rpb24gamUodCxlKXtmb3IodmFyIG49LTEscj1udWxsPT10PzA6dC5sZW5ndGg7KytuPHI7KWlmKGUodFtuXSxuLHQpKXJldHVybiEwO3JldHVybiExfXZhciBVZT1IZSgibGVuZ3RoIik7ZnVuY3Rpb24gcWUodCxlLG4pe3ZhciByO3JldHVybiBuKHQsKGZ1bmN0aW9uKHQsbixpKXtpZihlKHQsbixpKSlyZXR1cm4gcj1uLCExfSkpLHJ9ZnVuY3Rpb24gVmUodCxlLG4scil7Zm9yKHZhciBpPXQubGVuZ3RoLG89bisocj8xOi0xKTtyP28tLTorK288aTspaWYoZSh0W29dLG8sdCkpcmV0dXJuIG87cmV0dXJuLTF9ZnVuY3Rpb24gR2UodCxlLG4pe3JldHVybiBlPT1lP2Z1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHI9bi0xLGk9dC5sZW5ndGg7KytyPGk7KWlmKHRbcl09PT1lKXJldHVybiByO3JldHVybi0xfSh0LGUsbik6VmUodCxYZSxuKX1mdW5jdGlvbiBZZSh0LGUsbixyKXtmb3IodmFyIGk9bi0xLG89dC5sZW5ndGg7KytpPG87KWlmKHIodFtpXSxlKSlyZXR1cm4gaTtyZXR1cm4tMX1mdW5jdGlvbiBYZSh0KXtyZXR1cm4gdCE9dH1mdW5jdGlvbiBXZSh0LGUpe3ZhciBuPW51bGw9PXQ/MDp0Lmxlbmd0aDtyZXR1cm4gbj9KZSh0LGUpL246cH1mdW5jdGlvbiBIZSh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/bjplW3RdfX1mdW5jdGlvbiBaZSh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PXQ/bjp0W2VdfX1mdW5jdGlvbiBLZSh0LGUsbixyLGkpe3JldHVybiBpKHQsKGZ1bmN0aW9uKHQsaSxvKXtuPXI/KHI9ITEsdCk6ZShuLHQsaSxvKX0pKSxufWZ1bmN0aW9uIEplKHQsZSl7Zm9yKHZhciByLGk9LTEsbz10Lmxlbmd0aDsrK2k8bzspe3ZhciBzPWUodFtpXSk7cyE9PW4mJihyPXI9PT1uP3M6citzKX1yZXR1cm4gcn1mdW5jdGlvbiBRZSh0LGUpe2Zvcih2YXIgbj0tMSxyPUFycmF5KHQpOysrbjx0OylyW25dPWUobik7cmV0dXJuIHJ9ZnVuY3Rpb24gJGUodCl7cmV0dXJuIHQmJnQuc2xpY2UoMCx5bih0KSsxKS5yZXBsYWNlKHN0LCIiKX1mdW5jdGlvbiB0bih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQoZSl9fWZ1bmN0aW9uIGVuKHQsZSl7cmV0dXJuIFJlKGUsKGZ1bmN0aW9uKGUpe3JldHVybiB0W2VdfSkpfWZ1bmN0aW9uIG5uKHQsZSl7cmV0dXJuIHQuaGFzKGUpfWZ1bmN0aW9uIHJuKHQsZSl7Zm9yKHZhciBuPS0xLHI9dC5sZW5ndGg7KytuPHImJkdlKGUsdFtuXSwwKT4tMTspO3JldHVybiBufWZ1bmN0aW9uIG9uKHQsZSl7Zm9yKHZhciBuPXQubGVuZ3RoO24tLSYmR2UoZSx0W25dLDApPi0xOyk7cmV0dXJuIG59dmFyIHNuPVplKHsiw4AiOiJBIiwiw4EiOiJBIiwiw4IiOiJBIiwiw4MiOiJBIiwiw4QiOiJBIiwiw4UiOiJBIiwiw6AiOiJhIiwiw6EiOiJhIiwiw6IiOiJhIiwiw6MiOiJhIiwiw6QiOiJhIiwiw6UiOiJhIiwiw4ciOiJDIiwiw6ciOiJjIiwiw5AiOiJEIiwiw7AiOiJkIiwiw4giOiJFIiwiw4kiOiJFIiwiw4oiOiJFIiwiw4siOiJFIiwiw6giOiJlIiwiw6kiOiJlIiwiw6oiOiJlIiwiw6siOiJlIiwiw4wiOiJJIiwiw40iOiJJIiwiw44iOiJJIiwiw48iOiJJIiwiw6wiOiJpIiwiw60iOiJpIiwiw64iOiJpIiwiw68iOiJpIiwiw5EiOiJOIiwiw7EiOiJuIiwiw5IiOiJPIiwiw5MiOiJPIiwiw5QiOiJPIiwiw5UiOiJPIiwiw5YiOiJPIiwiw5giOiJPIiwiw7IiOiJvIiwiw7MiOiJvIiwiw7QiOiJvIiwiw7UiOiJvIiwiw7YiOiJvIiwiw7giOiJvIiwiw5kiOiJVIiwiw5oiOiJVIiwiw5siOiJVIiwiw5wiOiJVIiwiw7kiOiJ1Iiwiw7oiOiJ1Iiwiw7siOiJ1Iiwiw7wiOiJ1Iiwiw50iOiJZIiwiw70iOiJ5Iiwiw78iOiJ5Iiwiw4YiOiJBZSIsIsOmIjoiYWUiLCLDniI6IlRoIiwiw74iOiJ0aCIsIsOfIjoic3MiLCLEgCI6IkEiLCLEgiI6IkEiLCLEhCI6IkEiLCLEgSI6ImEiLCLEgyI6ImEiLCLEhSI6ImEiLCLEhiI6IkMiLCLEiCI6IkMiLCLEiiI6IkMiLCLEjCI6IkMiLCLEhyI6ImMiLCLEiSI6ImMiLCLEiyI6ImMiLCLEjSI6ImMiLCLEjiI6IkQiLCLEkCI6IkQiLCLEjyI6ImQiLCLEkSI6ImQiLCLEkiI6IkUiLCLElCI6IkUiLCLEliI6IkUiLCLEmCI6IkUiLCLEmiI6IkUiLCLEkyI6ImUiLCLElSI6ImUiLCLElyI6ImUiLCLEmSI6ImUiLCLEmyI6ImUiLCLEnCI6IkciLCLEniI6IkciLCLEoCI6IkciLCLEoiI6IkciLCLEnSI6ImciLCLEnyI6ImciLCLEoSI6ImciLCLEoyI6ImciLCLEpCI6IkgiLCLEpiI6IkgiLCLEpSI6ImgiLCLEpyI6ImgiLCLEqCI6IkkiLCLEqiI6IkkiLCLErCI6IkkiLCLEriI6IkkiLCLEsCI6IkkiLCLEqSI6ImkiLCLEqyI6ImkiLCLErSI6ImkiLCLEryI6ImkiLCLEsSI6ImkiLCLEtCI6IkoiLCLEtSI6ImoiLCLEtiI6IksiLCLEtyI6ImsiLCLEuCI6ImsiLCLEuSI6IkwiLCLEuyI6IkwiLCLEvSI6IkwiLCLEvyI6IkwiLCLFgSI6IkwiLCLEuiI6ImwiLCLEvCI6ImwiLCLEviI6ImwiLCLFgCI6ImwiLCLFgiI6ImwiLCLFgyI6Ik4iLCLFhSI6Ik4iLCLFhyI6Ik4iLCLFiiI6Ik4iLCLFhCI6Im4iLCLFhiI6Im4iLCLFiCI6Im4iLCLFiyI6Im4iLCLFjCI6Ik8iLCLFjiI6Ik8iLCLFkCI6Ik8iLCLFjSI6Im8iLCLFjyI6Im8iLCLFkSI6Im8iLCLFlCI6IlIiLCLFliI6IlIiLCLFmCI6IlIiLCLFlSI6InIiLCLFlyI6InIiLCLFmSI6InIiLCLFmiI6IlMiLCLFnCI6IlMiLCLFniI6IlMiLCLFoCI6IlMiLCLFmyI6InMiLCLFnSI6InMiLCLFnyI6InMiLCLFoSI6InMiLCLFoiI6IlQiLCLFpCI6IlQiLCLFpiI6IlQiLCLFoyI6InQiLCLFpSI6InQiLCLFpyI6InQiLCLFqCI6IlUiLCLFqiI6IlUiLCLFrCI6IlUiLCLFriI6IlUiLCLFsCI6IlUiLCLFsiI6IlUiLCLFqSI6InUiLCLFqyI6InUiLCLFrSI6InUiLCLFryI6InUiLCLFsSI6InUiLCLFsyI6InUiLCLFtCI6IlciLCLFtSI6InciLCLFtiI6IlkiLCLFtyI6InkiLCLFuCI6IlkiLCLFuSI6IloiLCLFuyI6IloiLCLFvSI6IloiLCLFuiI6InoiLCLFvCI6InoiLCLFviI6InoiLCLEsiI6IklKIiwixLMiOiJpaiIsIsWSIjoiT2UiLCLFkyI6Im9lIiwixYkiOiInbiIsIsW/IjoicyJ9KSxhbj1aZSh7IiYiOiImYW1wOyIsIjwiOiImbHQ7IiwiPiI6IiZndDsiLCciJzoiJnF1b3Q7IiwiJyI6IiYjMzk7In0pO2Z1bmN0aW9uIHVuKHQpe3JldHVybiJcXCIraGVbdF19ZnVuY3Rpb24gY24odCl7cmV0dXJuIG9lLnRlc3QodCl9ZnVuY3Rpb24gbG4odCl7dmFyIGU9LTEsbj1BcnJheSh0LnNpemUpO3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQscil7blsrK2VdPVtyLHRdfSkpLG59ZnVuY3Rpb24gaG4odCxlKXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHQoZShuKSl9fWZ1bmN0aW9uIGZuKHQsZSl7Zm9yKHZhciBuPS0xLHI9dC5sZW5ndGgsaT0wLHM9W107KytuPHI7KXt2YXIgYT10W25dOyhhPT09ZXx8YT09PW8pJiYodFtuXT1vLHNbaSsrXT1uKX1yZXR1cm4gc31mdW5jdGlvbiBwbih0KXt2YXIgZT0tMSxuPUFycmF5KHQuc2l6ZSk7cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCl7blsrK2VdPXR9KSksbn1mdW5jdGlvbiBkbih0KXtyZXR1cm4gY24odCk/ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXJlLmxhc3RJbmRleD0wO3JlLnRlc3QodCk7KSsrZTtyZXR1cm4gZX0odCk6VWUodCl9ZnVuY3Rpb24gZ24odCl7cmV0dXJuIGNuKHQpP2Z1bmN0aW9uKHQpe3JldHVybiB0Lm1hdGNoKHJlKXx8W119KHQpOmZ1bmN0aW9uKHQpe3JldHVybiB0LnNwbGl0KCIiKX0odCl9ZnVuY3Rpb24geW4odCl7Zm9yKHZhciBlPXQubGVuZ3RoO2UtLSYmYXQudGVzdCh0LmNoYXJBdChlKSk7KTtyZXR1cm4gZX12YXIgbW49WmUoeyImYW1wOyI6IiYiLCImbHQ7IjoiPCIsIiZndDsiOiI+IiwiJnF1b3Q7IjonIicsIiYjMzk7IjoiJyJ9KTt2YXIgdm49ZnVuY3Rpb24gdChlKXt2YXIgYXQsRXQ9KGU9bnVsbD09ZT95ZTp2bi5kZWZhdWx0cyh5ZS5PYmplY3QoKSxlLHZuLnBpY2soeWUsYWUpKSkuQXJyYXksQ3Q9ZS5EYXRlLFN0PWUuRXJyb3IsQXQ9ZS5GdW5jdGlvbixOdD1lLk1hdGgsSXQ9ZS5PYmplY3QsTXQ9ZS5SZWdFeHAsRnQ9ZS5TdHJpbmcsVHQ9ZS5UeXBlRXJyb3IsT3Q9RXQucHJvdG90eXBlLEx0PUF0LnByb3RvdHlwZSxQdD1JdC5wcm90b3R5cGUsUnQ9ZVsiX19jb3JlLWpzX3NoYXJlZF9fIl0sQnQ9THQudG9TdHJpbmcsa3Q9UHQuaGFzT3duUHJvcGVydHksenQ9MCxqdD0oYXQ9L1teLl0rJC8uZXhlYyhSdCYmUnQua2V5cyYmUnQua2V5cy5JRV9QUk9UT3x8IiIpKT8iU3ltYm9sKHNyYylfMS4iK2F0OiIiLFV0PVB0LnRvU3RyaW5nLHF0PUJ0LmNhbGwoSXQpLFZ0PXllLl8sR3Q9TXQoIl4iK0J0LmNhbGwoa3QpLnJlcGxhY2UoaXQsIlxcJCYiKS5yZXBsYWNlKC9oYXNPd25Qcm9wZXJ0eXwoZnVuY3Rpb24pLio/KD89XFxcKCl8IGZvciAuKz8oPz1cXFxdKS9nLCIkMS4qPyIpKyIkIiksWXQ9X2U/ZS5CdWZmZXI6bixYdD1lLlN5bWJvbCxXdD1lLlVpbnQ4QXJyYXksSHQ9WXQ/WXQuYWxsb2NVbnNhZmU6bixadD1obihJdC5nZXRQcm90b3R5cGVPZixJdCksS3Q9SXQuY3JlYXRlLEp0PVB0LnByb3BlcnR5SXNFbnVtZXJhYmxlLFF0PU90LnNwbGljZSwkdD1YdD9YdC5pc0NvbmNhdFNwcmVhZGFibGU6bix0ZT1YdD9YdC5pdGVyYXRvcjpuLHJlPVh0P1h0LnRvU3RyaW5nVGFnOm4sb2U9ZnVuY3Rpb24oKXt0cnl7dmFyIHQ9cG8oSXQsImRlZmluZVByb3BlcnR5Iik7cmV0dXJuIHQoe30sIiIse30pLHR9Y2F0Y2godCl7fX0oKSxoZT1lLmNsZWFyVGltZW91dCE9PXllLmNsZWFyVGltZW91dCYmZS5jbGVhclRpbWVvdXQsZGU9Q3QmJkN0Lm5vdyE9PXllLkRhdGUubm93JiZDdC5ub3csZ2U9ZS5zZXRUaW1lb3V0IT09eWUuc2V0VGltZW91dCYmZS5zZXRUaW1lb3V0LG1lPU50LmNlaWwsdmU9TnQuZmxvb3IseGU9SXQuZ2V0T3duUHJvcGVydHlTeW1ib2xzLHdlPVl0P1l0LmlzQnVmZmVyOm4sVWU9ZS5pc0Zpbml0ZSxaZT1PdC5qb2luLF9uPWhuKEl0LmtleXMsSXQpLHhuPU50Lm1heCx3bj1OdC5taW4sYm49Q3Qubm93LERuPWUucGFyc2VJbnQsRW49TnQucmFuZG9tLENuPU90LnJldmVyc2UsU249cG8oZSwiRGF0YVZpZXciKSxBbj1wbyhlLCJNYXAiKSxObj1wbyhlLCJQcm9taXNlIiksSW49cG8oZSwiU2V0IiksTW49cG8oZSwiV2Vha01hcCIpLEZuPXBvKEl0LCJjcmVhdGUiKSxUbj1NbiYmbmV3IE1uLE9uPXt9LExuPWpvKFNuKSxQbj1qbyhBbiksUm49am8oTm4pLEJuPWpvKEluKSxrbj1qbyhNbiksem49WHQ/WHQucHJvdG90eXBlOm4sam49em4/em4udmFsdWVPZjpuLFVuPXpuP3puLnRvU3RyaW5nOm47ZnVuY3Rpb24gcW4odCl7aWYocmEodCkmJiFYcyh0KSYmISh0IGluc3RhbmNlb2YgWG4pKXtpZih0IGluc3RhbmNlb2YgWW4pcmV0dXJuIHQ7aWYoa3QuY2FsbCh0LCJfX3dyYXBwZWRfXyIpKXJldHVybiBVbyh0KX1yZXR1cm4gbmV3IFluKHQpfXZhciBWbj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt9cmV0dXJuIGZ1bmN0aW9uKGUpe2lmKCFuYShlKSlyZXR1cm57fTtpZihLdClyZXR1cm4gS3QoZSk7dC5wcm90b3R5cGU9ZTt2YXIgcj1uZXcgdDtyZXR1cm4gdC5wcm90b3R5cGU9bixyfX0oKTtmdW5jdGlvbiBHbigpe31mdW5jdGlvbiBZbih0LGUpe3RoaXMuX193cmFwcGVkX189dCx0aGlzLl9fYWN0aW9uc19fPVtdLHRoaXMuX19jaGFpbl9fPSEhZSx0aGlzLl9faW5kZXhfXz0wLHRoaXMuX192YWx1ZXNfXz1ufWZ1bmN0aW9uIFhuKHQpe3RoaXMuX193cmFwcGVkX189dCx0aGlzLl9fYWN0aW9uc19fPVtdLHRoaXMuX19kaXJfXz0xLHRoaXMuX19maWx0ZXJlZF9fPSExLHRoaXMuX19pdGVyYXRlZXNfXz1bXSx0aGlzLl9fdGFrZUNvdW50X189ZCx0aGlzLl9fdmlld3NfXz1bXX1mdW5jdGlvbiBXbih0KXt2YXIgZT0tMSxuPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxuOyl7dmFyIHI9dFtlXTt0aGlzLnNldChyWzBdLHJbMV0pfX1mdW5jdGlvbiBIbih0KXt2YXIgZT0tMSxuPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxuOyl7dmFyIHI9dFtlXTt0aGlzLnNldChyWzBdLHJbMV0pfX1mdW5jdGlvbiBabih0KXt2YXIgZT0tMSxuPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxuOyl7dmFyIHI9dFtlXTt0aGlzLnNldChyWzBdLHJbMV0pfX1mdW5jdGlvbiBLbih0KXt2YXIgZT0tMSxuPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5fX2RhdGFfXz1uZXcgWm47KytlPG47KXRoaXMuYWRkKHRbZV0pfWZ1bmN0aW9uIEpuKHQpe3ZhciBlPXRoaXMuX19kYXRhX189bmV3IEhuKHQpO3RoaXMuc2l6ZT1lLnNpemV9ZnVuY3Rpb24gUW4odCxlKXt2YXIgbj1Ycyh0KSxyPSFuJiZZcyh0KSxpPSFuJiYhciYmS3ModCksbz0hbiYmIXImJiFpJiZoYSh0KSxzPW58fHJ8fGl8fG8sYT1zP1FlKHQubGVuZ3RoLEZ0KTpbXSx1PWEubGVuZ3RoO2Zvcih2YXIgYyBpbiB0KShlfHxrdC5jYWxsKHQsYykpJiYoIXN8fCEoImxlbmd0aCI9PWN8fGkmJigib2Zmc2V0Ij09Y3x8InBhcmVudCI9PWMpfHxvJiYoImJ1ZmZlciI9PWN8fCJieXRlTGVuZ3RoIj09Y3x8ImJ5dGVPZmZzZXQiPT1jKXx8d28oYyx1KSkpJiZhLnB1c2goYyk7cmV0dXJuIGF9ZnVuY3Rpb24gJG4odCl7dmFyIGU9dC5sZW5ndGg7cmV0dXJuIGU/dFtLcigwLGUtMSldOm59ZnVuY3Rpb24gdHIodCxlKXtyZXR1cm4gQm8oRmkodCksY3IoZSwwLHQubGVuZ3RoKSl9ZnVuY3Rpb24gZXIodCl7cmV0dXJuIEJvKEZpKHQpKX1mdW5jdGlvbiBucih0LGUscil7KHIhPT1uJiYhcXModFtlXSxyKXx8cj09PW4mJiEoZSBpbiB0KSkmJmFyKHQsZSxyKX1mdW5jdGlvbiBycih0LGUscil7dmFyIGk9dFtlXTsoIWt0LmNhbGwodCxlKXx8IXFzKGkscil8fHI9PT1uJiYhKGUgaW4gdCkpJiZhcih0LGUscil9ZnVuY3Rpb24gaXIodCxlKXtmb3IodmFyIG49dC5sZW5ndGg7bi0tOylpZihxcyh0W25dWzBdLGUpKXJldHVybiBuO3JldHVybi0xfWZ1bmN0aW9uIG9yKHQsZSxuLHIpe3JldHVybiBkcih0LChmdW5jdGlvbih0LGksbyl7ZShyLHQsbih0KSxvKX0pKSxyfWZ1bmN0aW9uIHNyKHQsZSl7cmV0dXJuIHQmJlRpKGUsT2EoZSksdCl9ZnVuY3Rpb24gYXIodCxlLG4peyJfX3Byb3RvX18iPT1lJiZvZT9vZSh0LGUse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOm4sd3JpdGFibGU6ITB9KTp0W2VdPW59ZnVuY3Rpb24gdXIodCxlKXtmb3IodmFyIHI9LTEsaT1lLmxlbmd0aCxvPUV0KGkpLHM9bnVsbD09dDsrK3I8aTspb1tyXT1zP246TmEodCxlW3JdKTtyZXR1cm4gb31mdW5jdGlvbiBjcih0LGUscil7cmV0dXJuIHQ9PXQmJihyIT09biYmKHQ9dDw9cj90OnIpLGUhPT1uJiYodD10Pj1lP3Q6ZSkpLHR9ZnVuY3Rpb24gbHIodCxlLHIsaSxvLHMpe3ZhciBhLHU9MSZlLGM9MiZlLGw9NCZlO2lmKHImJihhPW8/cih0LGksbyxzKTpyKHQpKSxhIT09bilyZXR1cm4gYTtpZighbmEodCkpcmV0dXJuIHQ7dmFyIGg9WHModCk7aWYoaCl7aWYoYT1mdW5jdGlvbih0KXt2YXIgZT10Lmxlbmd0aCxuPW5ldyB0LmNvbnN0cnVjdG9yKGUpO3JldHVybiBlJiYic3RyaW5nIj09dHlwZW9mIHRbMF0mJmt0LmNhbGwodCwiaW5kZXgiKSYmKG4uaW5kZXg9dC5pbmRleCxuLmlucHV0PXQuaW5wdXQpLG59KHQpLCF1KXJldHVybiBGaSh0LGEpfWVsc2V7dmFyIGY9bW8odCkscD1mPT1EfHxmPT1FO2lmKEtzKHQpKXJldHVybiBDaSh0LHUpO2lmKGY9PUF8fGY9PXZ8fHAmJiFvKXtpZihhPWN8fHA/e306X28odCksIXUpcmV0dXJuIGM/ZnVuY3Rpb24odCxlKXtyZXR1cm4gVGkodCx5byh0KSxlKX0odCxmdW5jdGlvbih0LGUpe3JldHVybiB0JiZUaShlLExhKGUpLHQpfShhLHQpKTpmdW5jdGlvbih0LGUpe3JldHVybiBUaSh0LGdvKHQpLGUpfSh0LHNyKGEsdCkpfWVsc2V7aWYoIWxlW2ZdKXJldHVybiBvP3Q6e307YT1mdW5jdGlvbih0LGUsbil7dmFyIHI9dC5jb25zdHJ1Y3Rvcjtzd2l0Y2goZSl7Y2FzZSBMOnJldHVybiBTaSh0KTtjYXNlIHg6Y2FzZSB3OnJldHVybiBuZXcgcigrdCk7Y2FzZSBQOnJldHVybiBmdW5jdGlvbih0LGUpe3ZhciBuPWU/U2kodC5idWZmZXIpOnQuYnVmZmVyO3JldHVybiBuZXcgdC5jb25zdHJ1Y3RvcihuLHQuYnl0ZU9mZnNldCx0LmJ5dGVMZW5ndGgpfSh0LG4pO2Nhc2UgUjpjYXNlIEI6Y2FzZSBrOmNhc2UgejpjYXNlIGo6Y2FzZSBVOmNhc2UgcTpjYXNlIFY6Y2FzZSBHOnJldHVybiBBaSh0LG4pO2Nhc2UgQzpyZXR1cm4gbmV3IHI7Y2FzZSBTOmNhc2UgRjpyZXR1cm4gbmV3IHIodCk7Y2FzZSBJOnJldHVybiBmdW5jdGlvbih0KXt2YXIgZT1uZXcgdC5jb25zdHJ1Y3Rvcih0LnNvdXJjZSxndC5leGVjKHQpKTtyZXR1cm4gZS5sYXN0SW5kZXg9dC5sYXN0SW5kZXgsZX0odCk7Y2FzZSBNOnJldHVybiBuZXcgcjtjYXNlIFQ6cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBqbj9JdChqbi5jYWxsKHQpKTp7fX0odCl9fSh0LGYsdSl9fXN8fChzPW5ldyBKbik7dmFyIGQ9cy5nZXQodCk7aWYoZClyZXR1cm4gZDtzLnNldCh0LGEpLHVhKHQpP3QuZm9yRWFjaCgoZnVuY3Rpb24obil7YS5hZGQobHIobixlLHIsbix0LHMpKX0pKTppYSh0KSYmdC5mb3JFYWNoKChmdW5jdGlvbihuLGkpe2Euc2V0KGksbHIobixlLHIsaSx0LHMpKX0pKTt2YXIgZz1oP246KGw/Yz9zbzpvbzpjP0xhOk9hKSh0KTtyZXR1cm4gTWUoZ3x8dCwoZnVuY3Rpb24obixpKXtnJiYobj10W2k9bl0pLHJyKGEsaSxscihuLGUscixpLHQscykpfSkpLGF9ZnVuY3Rpb24gaHIodCxlLHIpe3ZhciBpPXIubGVuZ3RoO2lmKG51bGw9PXQpcmV0dXJuIWk7Zm9yKHQ9SXQodCk7aS0tOyl7dmFyIG89cltpXSxzPWVbb10sYT10W29dO2lmKGE9PT1uJiYhKG8gaW4gdCl8fCFzKGEpKXJldHVybiExfXJldHVybiEwfWZ1bmN0aW9uIGZyKHQsZSxpKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgVHQocik7cmV0dXJuIE9vKChmdW5jdGlvbigpe3QuYXBwbHkobixpKX0pLGUpfWZ1bmN0aW9uIHByKHQsZSxuLHIpe3ZhciBpPS0xLG89TGUscz0hMCxhPXQubGVuZ3RoLHU9W10sYz1lLmxlbmd0aDtpZighYSlyZXR1cm4gdTtuJiYoZT1SZShlLHRuKG4pKSkscj8obz1QZSxzPSExKTplLmxlbmd0aD49MjAwJiYobz1ubixzPSExLGU9bmV3IEtuKGUpKTt0OmZvcig7KytpPGE7KXt2YXIgbD10W2ldLGg9bnVsbD09bj9sOm4obCk7aWYobD1yfHwwIT09bD9sOjAscyYmaD09aCl7Zm9yKHZhciBmPWM7Zi0tOylpZihlW2ZdPT09aCljb250aW51ZSB0O3UucHVzaChsKX1lbHNlIG8oZSxoLHIpfHx1LnB1c2gobCl9cmV0dXJuIHV9cW4udGVtcGxhdGVTZXR0aW5ncz17ZXNjYXBlOlEsZXZhbHVhdGU6JCxpbnRlcnBvbGF0ZTp0dCx2YXJpYWJsZToiIixpbXBvcnRzOntfOnFufX0scW4ucHJvdG90eXBlPUduLnByb3RvdHlwZSxxbi5wcm90b3R5cGUuY29uc3RydWN0b3I9cW4sWW4ucHJvdG90eXBlPVZuKEduLnByb3RvdHlwZSksWW4ucHJvdG90eXBlLmNvbnN0cnVjdG9yPVluLFhuLnByb3RvdHlwZT1WbihHbi5wcm90b3R5cGUpLFhuLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1YbixXbi5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLl9fZGF0YV9fPUZuP0ZuKG51bGwpOnt9LHRoaXMuc2l6ZT0wfSxXbi5wcm90b3R5cGUuZGVsZXRlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuaGFzKHQpJiZkZWxldGUgdGhpcy5fX2RhdGFfX1t0XTtyZXR1cm4gdGhpcy5zaXplLT1lPzE6MCxlfSxXbi5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX19kYXRhX187aWYoRm4pe3ZhciByPWVbdF07cmV0dXJuIHI9PT1pP246cn1yZXR1cm4ga3QuY2FsbChlLHQpP2VbdF06bn0sV24ucHJvdG90eXBlLmhhcz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fO3JldHVybiBGbj9lW3RdIT09bjprdC5jYWxsKGUsdCl9LFduLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLl9fZGF0YV9fO3JldHVybiB0aGlzLnNpemUrPXRoaXMuaGFzKHQpPzA6MSxyW3RdPUZuJiZlPT09bj9pOmUsdGhpc30sSG4ucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5fX2RhdGFfXz1bXSx0aGlzLnNpemU9MH0sSG4ucHJvdG90eXBlLmRlbGV0ZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fLG49aXIoZSx0KTtyZXR1cm4hKG48MCkmJihuPT1lLmxlbmd0aC0xP2UucG9wKCk6UXQuY2FsbChlLG4sMSksLS10aGlzLnNpemUsITApfSxIbi5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX19kYXRhX18scj1pcihlLHQpO3JldHVybiByPDA/bjplW3JdWzFdfSxIbi5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKHQpe3JldHVybiBpcih0aGlzLl9fZGF0YV9fLHQpPi0xfSxIbi5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fX2RhdGFfXyxyPWlyKG4sdCk7cmV0dXJuIHI8MD8oKyt0aGlzLnNpemUsbi5wdXNoKFt0LGVdKSk6bltyXVsxXT1lLHRoaXN9LFpuLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuc2l6ZT0wLHRoaXMuX19kYXRhX189e2hhc2g6bmV3IFduLG1hcDpuZXcoQW58fEhuKSxzdHJpbmc6bmV3IFdufX0sWm4ucHJvdG90eXBlLmRlbGV0ZT1mdW5jdGlvbih0KXt2YXIgZT1obyh0aGlzLHQpLmRlbGV0ZSh0KTtyZXR1cm4gdGhpcy5zaXplLT1lPzE6MCxlfSxabi5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiBobyh0aGlzLHQpLmdldCh0KX0sWm4ucHJvdG90eXBlLmhhcz1mdW5jdGlvbih0KXtyZXR1cm4gaG8odGhpcyx0KS5oYXModCl9LFpuLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxlKXt2YXIgbj1obyh0aGlzLHQpLHI9bi5zaXplO3JldHVybiBuLnNldCh0LGUpLHRoaXMuc2l6ZSs9bi5zaXplPT1yPzA6MSx0aGlzfSxLbi5wcm90b3R5cGUuYWRkPUtuLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLnNldCh0LGkpLHRoaXN9LEtuLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKHQpfSxKbi5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLl9fZGF0YV9fPW5ldyBIbix0aGlzLnNpemU9MH0sSm4ucHJvdG90eXBlLmRlbGV0ZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fLG49ZS5kZWxldGUodCk7cmV0dXJuIHRoaXMuc2l6ZT1lLnNpemUsbn0sSm4ucHJvdG90eXBlLmdldD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5nZXQodCl9LEpuLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKHQpfSxKbi5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fX2RhdGFfXztpZihuIGluc3RhbmNlb2YgSG4pe3ZhciByPW4uX19kYXRhX187aWYoIUFufHxyLmxlbmd0aDwxOTkpcmV0dXJuIHIucHVzaChbdCxlXSksdGhpcy5zaXplPSsrbi5zaXplLHRoaXM7bj10aGlzLl9fZGF0YV9fPW5ldyBabihyKX1yZXR1cm4gbi5zZXQodCxlKSx0aGlzLnNpemU9bi5zaXplLHRoaXN9O3ZhciBkcj1QaShiciksZ3I9UGkoRHIsITApO2Z1bmN0aW9uIHlyKHQsZSl7dmFyIG49ITA7cmV0dXJuIGRyKHQsKGZ1bmN0aW9uKHQscixpKXtyZXR1cm4gbj0hIWUodCxyLGkpfSkpLG59ZnVuY3Rpb24gbXIodCxlLHIpe2Zvcih2YXIgaT0tMSxvPXQubGVuZ3RoOysraTxvOyl7dmFyIHM9dFtpXSxhPWUocyk7aWYobnVsbCE9YSYmKHU9PT1uP2E9PWEmJiFsYShhKTpyKGEsdSkpKXZhciB1PWEsYz1zfXJldHVybiBjfWZ1bmN0aW9uIHZyKHQsZSl7dmFyIG49W107cmV0dXJuIGRyKHQsKGZ1bmN0aW9uKHQscixpKXtlKHQscixpKSYmbi5wdXNoKHQpfSkpLG59ZnVuY3Rpb24gX3IodCxlLG4scixpKXt2YXIgbz0tMSxzPXQubGVuZ3RoO2ZvcihufHwobj14byksaXx8KGk9W10pOysrbzxzOyl7dmFyIGE9dFtvXTtlPjAmJm4oYSk/ZT4xP19yKGEsZS0xLG4scixpKTpCZShpLGEpOnJ8fChpW2kubGVuZ3RoXT1hKX1yZXR1cm4gaX12YXIgeHI9UmkoKSx3cj1SaSghMCk7ZnVuY3Rpb24gYnIodCxlKXtyZXR1cm4gdCYmeHIodCxlLE9hKX1mdW5jdGlvbiBEcih0LGUpe3JldHVybiB0JiZ3cih0LGUsT2EpfWZ1bmN0aW9uIEVyKHQsZSl7cmV0dXJuIE9lKGUsKGZ1bmN0aW9uKGUpe3JldHVybiAkcyh0W2VdKX0pKX1mdW5jdGlvbiBDcih0LGUpe2Zvcih2YXIgcj0wLGk9KGU9d2koZSx0KSkubGVuZ3RoO251bGwhPXQmJnI8aTspdD10W3pvKGVbcisrXSldO3JldHVybiByJiZyPT1pP3Q6bn1mdW5jdGlvbiBTcih0LGUsbil7dmFyIHI9ZSh0KTtyZXR1cm4gWHModCk/cjpCZShyLG4odCkpfWZ1bmN0aW9uIEFyKHQpe3JldHVybiBudWxsPT10P3Q9PT1uPyJbb2JqZWN0IFVuZGVmaW5lZF0iOiJbb2JqZWN0IE51bGxdIjpyZSYmcmUgaW4gSXQodCk/ZnVuY3Rpb24odCl7dmFyIGU9a3QuY2FsbCh0LHJlKSxyPXRbcmVdO3RyeXt0W3JlXT1uO3ZhciBpPSEwfWNhdGNoKHQpe312YXIgbz1VdC5jYWxsKHQpO3JldHVybiBpJiYoZT90W3JlXT1yOmRlbGV0ZSB0W3JlXSksb30odCk6ZnVuY3Rpb24odCl7cmV0dXJuIFV0LmNhbGwodCl9KHQpfWZ1bmN0aW9uIE5yKHQsZSl7cmV0dXJuIHQ+ZX1mdW5jdGlvbiBJcih0LGUpe3JldHVybiBudWxsIT10JiZrdC5jYWxsKHQsZSl9ZnVuY3Rpb24gTXIodCxlKXtyZXR1cm4gbnVsbCE9dCYmZSBpbiBJdCh0KX1mdW5jdGlvbiBGcih0LGUscil7Zm9yKHZhciBpPXI/UGU6TGUsbz10WzBdLmxlbmd0aCxzPXQubGVuZ3RoLGE9cyx1PUV0KHMpLGM9MS8wLGw9W107YS0tOyl7dmFyIGg9dFthXTthJiZlJiYoaD1SZShoLHRuKGUpKSksYz13bihoLmxlbmd0aCxjKSx1W2FdPSFyJiYoZXx8bz49MTIwJiZoLmxlbmd0aD49MTIwKT9uZXcgS24oYSYmaCk6bn1oPXRbMF07dmFyIGY9LTEscD11WzBdO3Q6Zm9yKDsrK2Y8byYmbC5sZW5ndGg8Yzspe3ZhciBkPWhbZl0sZz1lP2UoZCk6ZDtpZihkPXJ8fDAhPT1kP2Q6MCwhKHA/bm4ocCxnKTppKGwsZyxyKSkpe2ZvcihhPXM7LS1hOyl7dmFyIHk9dVthXTtpZighKHk/bm4oeSxnKTppKHRbYV0sZyxyKSkpY29udGludWUgdH1wJiZwLnB1c2goZyksbC5wdXNoKGQpfX1yZXR1cm4gbH1mdW5jdGlvbiBUcih0LGUscil7dmFyIGk9bnVsbD09KHQ9TW8odCxlPXdpKGUsdCkpKT90OnRbem8oUW8oZSkpXTtyZXR1cm4gbnVsbD09aT9uOk5lKGksdCxyKX1mdW5jdGlvbiBPcih0KXtyZXR1cm4gcmEodCkmJkFyKHQpPT12fWZ1bmN0aW9uIExyKHQsZSxyLGksbyl7cmV0dXJuIHQ9PT1lfHwobnVsbD09dHx8bnVsbD09ZXx8IXJhKHQpJiYhcmEoZSk/dCE9dCYmZSE9ZTpmdW5jdGlvbih0LGUscixpLG8scyl7dmFyIGE9WHModCksdT1YcyhlKSxjPWE/Xzptbyh0KSxsPXU/XzptbyhlKSxoPShjPWM9PXY/QTpjKT09QSxmPShsPWw9PXY/QTpsKT09QSxwPWM9PWw7aWYocCYmS3ModCkpe2lmKCFLcyhlKSlyZXR1cm4hMTthPSEwLGg9ITF9aWYocCYmIWgpcmV0dXJuIHN8fChzPW5ldyBKbiksYXx8aGEodCk/cm8odCxlLHIsaSxvLHMpOmZ1bmN0aW9uKHQsZSxuLHIsaSxvLHMpe3N3aXRjaChuKXtjYXNlIFA6aWYodC5ieXRlTGVuZ3RoIT1lLmJ5dGVMZW5ndGh8fHQuYnl0ZU9mZnNldCE9ZS5ieXRlT2Zmc2V0KXJldHVybiExO3Q9dC5idWZmZXIsZT1lLmJ1ZmZlcjtjYXNlIEw6cmV0dXJuISh0LmJ5dGVMZW5ndGghPWUuYnl0ZUxlbmd0aHx8IW8obmV3IFd0KHQpLG5ldyBXdChlKSkpO2Nhc2UgeDpjYXNlIHc6Y2FzZSBTOnJldHVybiBxcygrdCwrZSk7Y2FzZSBiOnJldHVybiB0Lm5hbWU9PWUubmFtZSYmdC5tZXNzYWdlPT1lLm1lc3NhZ2U7Y2FzZSBJOmNhc2UgRjpyZXR1cm4gdD09ZSsiIjtjYXNlIEM6dmFyIGE9bG47Y2FzZSBNOnZhciB1PTEmcjtpZihhfHwoYT1wbiksdC5zaXplIT1lLnNpemUmJiF1KXJldHVybiExO3ZhciBjPXMuZ2V0KHQpO2lmKGMpcmV0dXJuIGM9PWU7cnw9MixzLnNldCh0LGUpO3ZhciBsPXJvKGEodCksYShlKSxyLGksbyxzKTtyZXR1cm4gcy5kZWxldGUodCksbDtjYXNlIFQ6aWYoam4pcmV0dXJuIGpuLmNhbGwodCk9PWpuLmNhbGwoZSl9cmV0dXJuITF9KHQsZSxjLHIsaSxvLHMpO2lmKCEoMSZyKSl7dmFyIGQ9aCYma3QuY2FsbCh0LCJfX3dyYXBwZWRfXyIpLGc9ZiYma3QuY2FsbChlLCJfX3dyYXBwZWRfXyIpO2lmKGR8fGcpe3ZhciB5PWQ/dC52YWx1ZSgpOnQsbT1nP2UudmFsdWUoKTplO3JldHVybiBzfHwocz1uZXcgSm4pLG8oeSxtLHIsaSxzKX19cmV0dXJuISFwJiYoc3x8KHM9bmV3IEpuKSxmdW5jdGlvbih0LGUscixpLG8scyl7dmFyIGE9MSZyLHU9b28odCksYz11Lmxlbmd0aCxsPW9vKGUpLGg9bC5sZW5ndGg7aWYoYyE9aCYmIWEpcmV0dXJuITE7Zm9yKHZhciBmPWM7Zi0tOyl7dmFyIHA9dVtmXTtpZighKGE/cCBpbiBlOmt0LmNhbGwoZSxwKSkpcmV0dXJuITF9dmFyIGQ9cy5nZXQodCksZz1zLmdldChlKTtpZihkJiZnKXJldHVybiBkPT1lJiZnPT10O3ZhciB5PSEwO3Muc2V0KHQsZSkscy5zZXQoZSx0KTtmb3IodmFyIG09YTsrK2Y8Yzspe3ZhciB2PXRbcD11W2ZdXSxfPWVbcF07aWYoaSl2YXIgeD1hP2koXyx2LHAsZSx0LHMpOmkodixfLHAsdCxlLHMpO2lmKCEoeD09PW4/dj09PV98fG8odixfLHIsaSxzKTp4KSl7eT0hMTticmVha31tfHwobT0iY29uc3RydWN0b3IiPT1wKX1pZih5JiYhbSl7dmFyIHc9dC5jb25zdHJ1Y3RvcixiPWUuY29uc3RydWN0b3I7dyE9YiYmImNvbnN0cnVjdG9yImluIHQmJiJjb25zdHJ1Y3RvciJpbiBlJiYhKCJmdW5jdGlvbiI9PXR5cGVvZiB3JiZ3IGluc3RhbmNlb2YgdyYmImZ1bmN0aW9uIj09dHlwZW9mIGImJmIgaW5zdGFuY2VvZiBiKSYmKHk9ITEpfXJldHVybiBzLmRlbGV0ZSh0KSxzLmRlbGV0ZShlKSx5fSh0LGUscixpLG8scykpfSh0LGUscixpLExyLG8pKX1mdW5jdGlvbiBQcih0LGUscixpKXt2YXIgbz1yLmxlbmd0aCxzPW8sYT0haTtpZihudWxsPT10KXJldHVybiFzO2Zvcih0PUl0KHQpO28tLTspe3ZhciB1PXJbb107aWYoYSYmdVsyXT91WzFdIT09dFt1WzBdXTohKHVbMF1pbiB0KSlyZXR1cm4hMX1mb3IoOysrbzxzOyl7dmFyIGM9KHU9cltvXSlbMF0sbD10W2NdLGg9dVsxXTtpZihhJiZ1WzJdKXtpZihsPT09biYmIShjIGluIHQpKXJldHVybiExfWVsc2V7dmFyIGY9bmV3IEpuO2lmKGkpdmFyIHA9aShsLGgsYyx0LGUsZik7aWYoIShwPT09bj9McihoLGwsMyxpLGYpOnApKXJldHVybiExfX1yZXR1cm4hMH1mdW5jdGlvbiBScih0KXtyZXR1cm4hKCFuYSh0KXx8ZnVuY3Rpb24odCl7cmV0dXJuISFqdCYmanQgaW4gdH0odCkpJiYoJHModCk/R3Q6dnQpLnRlc3Qoam8odCkpfWZ1bmN0aW9uIEJyKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6bnVsbD09dD9vdToib2JqZWN0Ij09dHlwZW9mIHQ/WHModCk/VnIodFswXSx0WzFdKTpxcih0KTpkdSh0KX1mdW5jdGlvbiBrcih0KXtpZighU28odCkpcmV0dXJuIF9uKHQpO3ZhciBlPVtdO2Zvcih2YXIgbiBpbiBJdCh0KSlrdC5jYWxsKHQsbikmJiJjb25zdHJ1Y3RvciIhPW4mJmUucHVzaChuKTtyZXR1cm4gZX1mdW5jdGlvbiB6cih0KXtpZighbmEodCkpcmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBlPVtdO2lmKG51bGwhPXQpZm9yKHZhciBuIGluIEl0KHQpKWUucHVzaChuKTtyZXR1cm4gZX0odCk7dmFyIGU9U28odCksbj1bXTtmb3IodmFyIHIgaW4gdCkiY29uc3RydWN0b3IiPT1yJiYoZXx8IWt0LmNhbGwodCxyKSl8fG4ucHVzaChyKTtyZXR1cm4gbn1mdW5jdGlvbiBqcih0LGUpe3JldHVybiB0PGV9ZnVuY3Rpb24gVXIodCxlKXt2YXIgbj0tMSxyPUhzKHQpP0V0KHQubGVuZ3RoKTpbXTtyZXR1cm4gZHIodCwoZnVuY3Rpb24odCxpLG8pe3JbKytuXT1lKHQsaSxvKX0pKSxyfWZ1bmN0aW9uIHFyKHQpe3ZhciBlPWZvKHQpO3JldHVybiAxPT1lLmxlbmd0aCYmZVswXVsyXT9ObyhlWzBdWzBdLGVbMF1bMV0pOmZ1bmN0aW9uKG4pe3JldHVybiBuPT09dHx8UHIobix0LGUpfX1mdW5jdGlvbiBWcih0LGUpe3JldHVybiBEbyh0KSYmQW8oZSk/Tm8oem8odCksZSk6ZnVuY3Rpb24ocil7dmFyIGk9TmEocix0KTtyZXR1cm4gaT09PW4mJmk9PT1lP0lhKHIsdCk6THIoZSxpLDMpfX1mdW5jdGlvbiBHcih0LGUscixpLG8pe3QhPT1lJiZ4cihlLChmdW5jdGlvbihzLGEpe2lmKG98fChvPW5ldyBKbiksbmEocykpIWZ1bmN0aW9uKHQsZSxyLGksbyxzLGEpe3ZhciB1PUZvKHQsciksYz1GbyhlLHIpLGw9YS5nZXQoYyk7aWYobClyZXR1cm4gdm9pZCBucih0LHIsbCk7dmFyIGg9cz9zKHUsYyxyKyIiLHQsZSxhKTpuLGY9aD09PW47aWYoZil7dmFyIHA9WHMoYyksZD0hcCYmS3MoYyksZz0hcCYmIWQmJmhhKGMpO2g9YyxwfHxkfHxnP1hzKHUpP2g9dTpacyh1KT9oPUZpKHUpOmQ/KGY9ITEsaD1DaShjLCEwKSk6Zz8oZj0hMSxoPUFpKGMsITApKTpoPVtdOnNhKGMpfHxZcyhjKT8oaD11LFlzKHUpP2g9X2EodSk6KCFuYSh1KXx8JHModSkpJiYoaD1fbyhjKSkpOmY9ITF9ZiYmKGEuc2V0KGMsaCksbyhoLGMsaSxzLGEpLGEuZGVsZXRlKGMpKSxucih0LHIsaCl9KHQsZSxhLHIsR3IsaSxvKTtlbHNle3ZhciB1PWk/aShGbyh0LGEpLHMsYSsiIix0LGUsbyk6bjt1PT09biYmKHU9cyksbnIodCxhLHUpfX0pLExhKX1mdW5jdGlvbiBZcih0LGUpe3ZhciByPXQubGVuZ3RoO2lmKHIpcmV0dXJuIHdvKGUrPWU8MD9yOjAscik/dFtlXTpufWZ1bmN0aW9uIFhyKHQsZSxuKXtlPWUubGVuZ3RoP1JlKGUsKGZ1bmN0aW9uKHQpe3JldHVybiBYcyh0KT9mdW5jdGlvbihlKXtyZXR1cm4gQ3IoZSwxPT09dC5sZW5ndGg/dFswXTp0KX06dH0pKTpbb3VdO3ZhciByPS0xO3JldHVybiBlPVJlKGUsdG4obG8oKSkpLGZ1bmN0aW9uKHQsZSl7dmFyIG49dC5sZW5ndGg7Zm9yKHQuc29ydChlKTtuLS07KXRbbl09dFtuXS52YWx1ZTtyZXR1cm4gdH0oVXIodCwoZnVuY3Rpb24odCxuLGkpe3JldHVybntjcml0ZXJpYTpSZShlLChmdW5jdGlvbihlKXtyZXR1cm4gZSh0KX0pKSxpbmRleDorK3IsdmFsdWU6dH19KSksKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHI9LTEsaT10LmNyaXRlcmlhLG89ZS5jcml0ZXJpYSxzPWkubGVuZ3RoLGE9bi5sZW5ndGg7KytyPHM7KXt2YXIgdT1OaShpW3JdLG9bcl0pO2lmKHUpcmV0dXJuIHI+PWE/dTp1KigiZGVzYyI9PW5bcl0/LTE6MSl9cmV0dXJuIHQuaW5kZXgtZS5pbmRleH0odCxlLG4pfSkpfWZ1bmN0aW9uIFdyKHQsZSxuKXtmb3IodmFyIHI9LTEsaT1lLmxlbmd0aCxvPXt9OysrcjxpOyl7dmFyIHM9ZVtyXSxhPUNyKHQscyk7bihhLHMpJiZlaShvLHdpKHMsdCksYSl9cmV0dXJuIG99ZnVuY3Rpb24gSHIodCxlLG4scil7dmFyIGk9cj9ZZTpHZSxvPS0xLHM9ZS5sZW5ndGgsYT10O2Zvcih0PT09ZSYmKGU9RmkoZSkpLG4mJihhPVJlKHQsdG4obikpKTsrK288czspZm9yKHZhciB1PTAsYz1lW29dLGw9bj9uKGMpOmM7KHU9aShhLGwsdSxyKSk+LTE7KWEhPT10JiZRdC5jYWxsKGEsdSwxKSxRdC5jYWxsKHQsdSwxKTtyZXR1cm4gdH1mdW5jdGlvbiBacih0LGUpe2Zvcih2YXIgbj10P2UubGVuZ3RoOjAscj1uLTE7bi0tOyl7dmFyIGk9ZVtuXTtpZihuPT1yfHxpIT09byl7dmFyIG89aTt3byhpKT9RdC5jYWxsKHQsaSwxKTpwaSh0LGkpfX1yZXR1cm4gdH1mdW5jdGlvbiBLcih0LGUpe3JldHVybiB0K3ZlKEVuKCkqKGUtdCsxKSl9ZnVuY3Rpb24gSnIodCxlKXt2YXIgbj0iIjtpZighdHx8ZTwxfHxlPmYpcmV0dXJuIG47ZG97ZSUyJiYobis9dCksKGU9dmUoZS8yKSkmJih0Kz10KX13aGlsZShlKTtyZXR1cm4gbn1mdW5jdGlvbiBRcih0LGUpe3JldHVybiBMbyhJbyh0LGUsb3UpLHQrIiIpfWZ1bmN0aW9uICRyKHQpe3JldHVybiAkbihxYSh0KSl9ZnVuY3Rpb24gdGkodCxlKXt2YXIgbj1xYSh0KTtyZXR1cm4gQm8obixjcihlLDAsbi5sZW5ndGgpKX1mdW5jdGlvbiBlaSh0LGUscixpKXtpZighbmEodCkpcmV0dXJuIHQ7Zm9yKHZhciBvPS0xLHM9KGU9d2koZSx0KSkubGVuZ3RoLGE9cy0xLHU9dDtudWxsIT11JiYrK288czspe3ZhciBjPXpvKGVbb10pLGw9cjtpZigiX19wcm90b19fIj09PWN8fCJjb25zdHJ1Y3RvciI9PT1jfHwicHJvdG90eXBlIj09PWMpcmV0dXJuIHQ7aWYobyE9YSl7dmFyIGg9dVtjXTsobD1pP2koaCxjLHUpOm4pPT09biYmKGw9bmEoaCk/aDp3byhlW28rMV0pP1tdOnt9KX1ycih1LGMsbCksdT11W2NdfXJldHVybiB0fXZhciBuaT1Ubj9mdW5jdGlvbih0LGUpe3JldHVybiBUbi5zZXQodCxlKSx0fTpvdSxyaT1vZT9mdW5jdGlvbih0LGUpe3JldHVybiBvZSh0LCJ0b1N0cmluZyIse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiExLHZhbHVlOm51KGUpLHdyaXRhYmxlOiEwfSl9Om91O2Z1bmN0aW9uIGlpKHQpe3JldHVybiBCbyhxYSh0KSl9ZnVuY3Rpb24gb2kodCxlLG4pe3ZhciByPS0xLGk9dC5sZW5ndGg7ZTwwJiYoZT0tZT5pPzA6aStlKSwobj1uPmk/aTpuKTwwJiYobis9aSksaT1lPm4/MDpuLWU+Pj4wLGU+Pj49MDtmb3IodmFyIG89RXQoaSk7KytyPGk7KW9bcl09dFtyK2VdO3JldHVybiBvfWZ1bmN0aW9uIHNpKHQsZSl7dmFyIG47cmV0dXJuIGRyKHQsKGZ1bmN0aW9uKHQscixpKXtyZXR1cm4hKG49ZSh0LHIsaSkpfSkpLCEhbn1mdW5jdGlvbiBhaSh0LGUsbil7dmFyIHI9MCxpPW51bGw9PXQ/cjp0Lmxlbmd0aDtpZigibnVtYmVyIj09dHlwZW9mIGUmJmU9PWUmJmk8PXkpe2Zvcig7cjxpOyl7dmFyIG89citpPj4+MSxzPXRbb107bnVsbCE9PXMmJiFsYShzKSYmKG4/czw9ZTpzPGUpP3I9bysxOmk9b31yZXR1cm4gaX1yZXR1cm4gdWkodCxlLG91LG4pfWZ1bmN0aW9uIHVpKHQsZSxyLGkpe3ZhciBvPTAscz1udWxsPT10PzA6dC5sZW5ndGg7aWYoMD09PXMpcmV0dXJuIDA7Zm9yKHZhciBhPShlPXIoZSkpIT1lLHU9bnVsbD09PWUsYz1sYShlKSxsPWU9PT1uO288czspe3ZhciBoPXZlKChvK3MpLzIpLGY9cih0W2hdKSxwPWYhPT1uLGQ9bnVsbD09PWYseT1mPT1mLG09bGEoZik7aWYoYSl2YXIgdj1pfHx5O2Vsc2Ugdj1sP3kmJihpfHxwKTp1P3kmJnAmJihpfHwhZCk6Yz95JiZwJiYhZCYmKGl8fCFtKTohZCYmIW0mJihpP2Y8PWU6ZjxlKTt2P289aCsxOnM9aH1yZXR1cm4gd24ocyxnKX1mdW5jdGlvbiBjaSh0LGUpe2Zvcih2YXIgbj0tMSxyPXQubGVuZ3RoLGk9MCxvPVtdOysrbjxyOyl7dmFyIHM9dFtuXSxhPWU/ZShzKTpzO2lmKCFufHwhcXMoYSx1KSl7dmFyIHU9YTtvW2krK109MD09PXM/MDpzfX1yZXR1cm4gb31mdW5jdGlvbiBsaSh0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/dDpsYSh0KT9wOit0fWZ1bmN0aW9uIGhpKHQpe2lmKCJzdHJpbmciPT10eXBlb2YgdClyZXR1cm4gdDtpZihYcyh0KSlyZXR1cm4gUmUodCxoaSkrIiI7aWYobGEodCkpcmV0dXJuIFVuP1VuLmNhbGwodCk6IiI7dmFyIGU9dCsiIjtyZXR1cm4iMCI9PWUmJjEvdD09LWg/Ii0wIjplfWZ1bmN0aW9uIGZpKHQsZSxuKXt2YXIgcj0tMSxpPUxlLG89dC5sZW5ndGgscz0hMCxhPVtdLHU9YTtpZihuKXM9ITEsaT1QZTtlbHNlIGlmKG8+PTIwMCl7dmFyIGM9ZT9udWxsOkppKHQpO2lmKGMpcmV0dXJuIHBuKGMpO3M9ITEsaT1ubix1PW5ldyBLbn1lbHNlIHU9ZT9bXTphO3Q6Zm9yKDsrK3I8bzspe3ZhciBsPXRbcl0saD1lP2UobCk6bDtpZihsPW58fDAhPT1sP2w6MCxzJiZoPT1oKXtmb3IodmFyIGY9dS5sZW5ndGg7Zi0tOylpZih1W2ZdPT09aCljb250aW51ZSB0O2UmJnUucHVzaChoKSxhLnB1c2gobCl9ZWxzZSBpKHUsaCxuKXx8KHUhPT1hJiZ1LnB1c2goaCksYS5wdXNoKGwpKX1yZXR1cm4gYX1mdW5jdGlvbiBwaSh0LGUpe3JldHVybiBudWxsPT0odD1Nbyh0LGU9d2koZSx0KSkpfHxkZWxldGUgdFt6byhRbyhlKSldfWZ1bmN0aW9uIGRpKHQsZSxuLHIpe3JldHVybiBlaSh0LGUsbihDcih0LGUpKSxyKX1mdW5jdGlvbiBnaSh0LGUsbixyKXtmb3IodmFyIGk9dC5sZW5ndGgsbz1yP2k6LTE7KHI/by0tOisrbzxpKSYmZSh0W29dLG8sdCk7KTtyZXR1cm4gbj9vaSh0LHI/MDpvLHI/bysxOmkpOm9pKHQscj9vKzE6MCxyP2k6byl9ZnVuY3Rpb24geWkodCxlKXt2YXIgbj10O3JldHVybiBuIGluc3RhbmNlb2YgWG4mJihuPW4udmFsdWUoKSksa2UoZSwoZnVuY3Rpb24odCxlKXtyZXR1cm4gZS5mdW5jLmFwcGx5KGUudGhpc0FyZyxCZShbdF0sZS5hcmdzKSl9KSxuKX1mdW5jdGlvbiBtaSh0LGUsbil7dmFyIHI9dC5sZW5ndGg7aWYocjwyKXJldHVybiByP2ZpKHRbMF0pOltdO2Zvcih2YXIgaT0tMSxvPUV0KHIpOysraTxyOylmb3IodmFyIHM9dFtpXSxhPS0xOysrYTxyOylhIT1pJiYob1tpXT1wcihvW2ldfHxzLHRbYV0sZSxuKSk7cmV0dXJuIGZpKF9yKG8sMSksZSxuKX1mdW5jdGlvbiB2aSh0LGUscil7Zm9yKHZhciBpPS0xLG89dC5sZW5ndGgscz1lLmxlbmd0aCxhPXt9OysraTxvOyl7dmFyIHU9aTxzP2VbaV06bjtyKGEsdFtpXSx1KX1yZXR1cm4gYX1mdW5jdGlvbiBfaSh0KXtyZXR1cm4gWnModCk/dDpbXX1mdW5jdGlvbiB4aSh0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD90Om91fWZ1bmN0aW9uIHdpKHQsZSl7cmV0dXJuIFhzKHQpP3Q6RG8odCxlKT9bdF06a28oeGEodCkpfXZhciBiaT1RcjtmdW5jdGlvbiBEaSh0LGUscil7dmFyIGk9dC5sZW5ndGg7cmV0dXJuIHI9cj09PW4/aTpyLCFlJiZyPj1pP3Q6b2kodCxlLHIpfXZhciBFaT1oZXx8ZnVuY3Rpb24odCl7cmV0dXJuIHllLmNsZWFyVGltZW91dCh0KX07ZnVuY3Rpb24gQ2kodCxlKXtpZihlKXJldHVybiB0LnNsaWNlKCk7dmFyIG49dC5sZW5ndGgscj1IdD9IdChuKTpuZXcgdC5jb25zdHJ1Y3RvcihuKTtyZXR1cm4gdC5jb3B5KHIpLHJ9ZnVuY3Rpb24gU2kodCl7dmFyIGU9bmV3IHQuY29uc3RydWN0b3IodC5ieXRlTGVuZ3RoKTtyZXR1cm4gbmV3IFd0KGUpLnNldChuZXcgV3QodCkpLGV9ZnVuY3Rpb24gQWkodCxlKXt2YXIgbj1lP1NpKHQuYnVmZmVyKTp0LmJ1ZmZlcjtyZXR1cm4gbmV3IHQuY29uc3RydWN0b3Iobix0LmJ5dGVPZmZzZXQsdC5sZW5ndGgpfWZ1bmN0aW9uIE5pKHQsZSl7aWYodCE9PWUpe3ZhciByPXQhPT1uLGk9bnVsbD09PXQsbz10PT10LHM9bGEodCksYT1lIT09bix1PW51bGw9PT1lLGM9ZT09ZSxsPWxhKGUpO2lmKCF1JiYhbCYmIXMmJnQ+ZXx8cyYmYSYmYyYmIXUmJiFsfHxpJiZhJiZjfHwhciYmY3x8IW8pcmV0dXJuIDE7aWYoIWkmJiFzJiYhbCYmdDxlfHxsJiZyJiZvJiYhaSYmIXN8fHUmJnImJm98fCFhJiZvfHwhYylyZXR1cm4tMX1yZXR1cm4gMH1mdW5jdGlvbiBJaSh0LGUsbixyKXtmb3IodmFyIGk9LTEsbz10Lmxlbmd0aCxzPW4ubGVuZ3RoLGE9LTEsdT1lLmxlbmd0aCxjPXhuKG8tcywwKSxsPUV0KHUrYyksaD0hcjsrK2E8dTspbFthXT1lW2FdO2Zvcig7KytpPHM7KShofHxpPG8pJiYobFtuW2ldXT10W2ldKTtmb3IoO2MtLTspbFthKytdPXRbaSsrXTtyZXR1cm4gbH1mdW5jdGlvbiBNaSh0LGUsbixyKXtmb3IodmFyIGk9LTEsbz10Lmxlbmd0aCxzPS0xLGE9bi5sZW5ndGgsdT0tMSxjPWUubGVuZ3RoLGw9eG4oby1hLDApLGg9RXQobCtjKSxmPSFyOysraTxsOyloW2ldPXRbaV07Zm9yKHZhciBwPWk7Kyt1PGM7KWhbcCt1XT1lW3VdO2Zvcig7KytzPGE7KShmfHxpPG8pJiYoaFtwK25bc11dPXRbaSsrXSk7cmV0dXJuIGh9ZnVuY3Rpb24gRmkodCxlKXt2YXIgbj0tMSxyPXQubGVuZ3RoO2ZvcihlfHwoZT1FdChyKSk7KytuPHI7KWVbbl09dFtuXTtyZXR1cm4gZX1mdW5jdGlvbiBUaSh0LGUscixpKXt2YXIgbz0hcjtyfHwocj17fSk7Zm9yKHZhciBzPS0xLGE9ZS5sZW5ndGg7KytzPGE7KXt2YXIgdT1lW3NdLGM9aT9pKHJbdV0sdFt1XSx1LHIsdCk6bjtjPT09biYmKGM9dFt1XSksbz9hcihyLHUsYyk6cnIocix1LGMpfXJldHVybiByfWZ1bmN0aW9uIE9pKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4scil7dmFyIGk9WHMobik/SWU6b3Isbz1lP2UoKTp7fTtyZXR1cm4gaShuLHQsbG8ociwyKSxvKX19ZnVuY3Rpb24gTGkodCl7cmV0dXJuIFFyKChmdW5jdGlvbihlLHIpe3ZhciBpPS0xLG89ci5sZW5ndGgscz1vPjE/cltvLTFdOm4sYT1vPjI/clsyXTpuO2ZvcihzPXQubGVuZ3RoPjMmJiJmdW5jdGlvbiI9PXR5cGVvZiBzPyhvLS0scyk6bixhJiZibyhyWzBdLHJbMV0sYSkmJihzPW88Mz9uOnMsbz0xKSxlPUl0KGUpOysraTxvOyl7dmFyIHU9cltpXTt1JiZ0KGUsdSxpLHMpfXJldHVybiBlfSkpfWZ1bmN0aW9uIFBpKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4scil7aWYobnVsbD09bilyZXR1cm4gbjtpZighSHMobikpcmV0dXJuIHQobixyKTtmb3IodmFyIGk9bi5sZW5ndGgsbz1lP2k6LTEscz1JdChuKTsoZT9vLS06KytvPGkpJiYhMSE9PXIoc1tvXSxvLHMpOyk7cmV0dXJuIG59fWZ1bmN0aW9uIFJpKHQpe3JldHVybiBmdW5jdGlvbihlLG4scil7Zm9yKHZhciBpPS0xLG89SXQoZSkscz1yKGUpLGE9cy5sZW5ndGg7YS0tOyl7dmFyIHU9c1t0P2E6KytpXTtpZighMT09PW4ob1t1XSx1LG8pKWJyZWFrfXJldHVybiBlfX1mdW5jdGlvbiBCaSh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHI9Y24oZT14YShlKSk/Z24oZSk6bixpPXI/clswXTplLmNoYXJBdCgwKSxvPXI/RGkociwxKS5qb2luKCIiKTplLnNsaWNlKDEpO3JldHVybiBpW3RdKCkrb319ZnVuY3Rpb24ga2kodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBrZSgkYShZYShlKS5yZXBsYWNlKGVlLCIiKSksdCwiIil9fWZ1bmN0aW9uIHppKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPWFyZ3VtZW50cztzd2l0Y2goZS5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4gbmV3IHQ7Y2FzZSAxOnJldHVybiBuZXcgdChlWzBdKTtjYXNlIDI6cmV0dXJuIG5ldyB0KGVbMF0sZVsxXSk7Y2FzZSAzOnJldHVybiBuZXcgdChlWzBdLGVbMV0sZVsyXSk7Y2FzZSA0OnJldHVybiBuZXcgdChlWzBdLGVbMV0sZVsyXSxlWzNdKTtjYXNlIDU6cmV0dXJuIG5ldyB0KGVbMF0sZVsxXSxlWzJdLGVbM10sZVs0XSk7Y2FzZSA2OnJldHVybiBuZXcgdChlWzBdLGVbMV0sZVsyXSxlWzNdLGVbNF0sZVs1XSk7Y2FzZSA3OnJldHVybiBuZXcgdChlWzBdLGVbMV0sZVsyXSxlWzNdLGVbNF0sZVs1XSxlWzZdKX12YXIgbj1Wbih0LnByb3RvdHlwZSkscj10LmFwcGx5KG4sZSk7cmV0dXJuIG5hKHIpP3I6bn19ZnVuY3Rpb24gamkodCl7cmV0dXJuIGZ1bmN0aW9uKGUscixpKXt2YXIgbz1JdChlKTtpZighSHMoZSkpe3ZhciBzPWxvKHIsMyk7ZT1PYShlKSxyPWZ1bmN0aW9uKHQpe3JldHVybiBzKG9bdF0sdCxvKX19dmFyIGE9dChlLHIsaSk7cmV0dXJuIGE+LTE/b1tzP2VbYV06YV06bn19ZnVuY3Rpb24gVWkodCl7cmV0dXJuIGlvKChmdW5jdGlvbihlKXt2YXIgaT1lLmxlbmd0aCxvPWkscz1Zbi5wcm90b3R5cGUudGhydTtmb3IodCYmZS5yZXZlcnNlKCk7by0tOyl7dmFyIGE9ZVtvXTtpZigiZnVuY3Rpb24iIT10eXBlb2YgYSl0aHJvdyBuZXcgVHQocik7aWYocyYmIXUmJiJ3cmFwcGVyIj09dW8oYSkpdmFyIHU9bmV3IFluKFtdLCEwKX1mb3Iobz11P286aTsrK288aTspe3ZhciBjPXVvKGE9ZVtvXSksbD0id3JhcHBlciI9PWM/YW8oYSk6bjt1PWwmJkVvKGxbMF0pJiY0MjQ9PWxbMV0mJiFsWzRdLmxlbmd0aCYmMT09bFs5XT91W3VvKGxbMF0pXS5hcHBseSh1LGxbM10pOjE9PWEubGVuZ3RoJiZFbyhhKT91W2NdKCk6dS50aHJ1KGEpfXJldHVybiBmdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cyxuPXRbMF07aWYodSYmMT09dC5sZW5ndGgmJlhzKG4pKXJldHVybiB1LnBsYW50KG4pLnZhbHVlKCk7Zm9yKHZhciByPTAsbz1pP2Vbcl0uYXBwbHkodGhpcyx0KTpuOysrcjxpOylvPWVbcl0uY2FsbCh0aGlzLG8pO3JldHVybiBvfX0pKX1mdW5jdGlvbiBxaSh0LGUscixpLG8scyxhLHUsbCxoKXt2YXIgZj1lJmMscD0xJmUsZD0yJmUsZz0yNCZlLHk9NTEyJmUsbT1kP246emkodCk7cmV0dXJuIGZ1bmN0aW9uIGMoKXtmb3IodmFyIHY9YXJndW1lbnRzLmxlbmd0aCxfPUV0KHYpLHg9djt4LS07KV9beF09YXJndW1lbnRzW3hdO2lmKGcpdmFyIHc9Y28oYyksYj1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10Lmxlbmd0aCxyPTA7bi0tOyl0W25dPT09ZSYmKytyO3JldHVybiByfShfLHcpO2lmKGkmJihfPUlpKF8saSxvLGcpKSxzJiYoXz1NaShfLHMsYSxnKSksdi09YixnJiZ2PGgpe3ZhciBEPWZuKF8sdyk7cmV0dXJuIFppKHQsZSxxaSxjLnBsYWNlaG9sZGVyLHIsXyxELHUsbCxoLXYpfXZhciBFPXA/cjp0aGlzLEM9ZD9FW3RdOnQ7cmV0dXJuIHY9Xy5sZW5ndGgsdT9fPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPXQubGVuZ3RoLGk9d24oZS5sZW5ndGgsciksbz1GaSh0KTtpLS07KXt2YXIgcz1lW2ldO3RbaV09d28ocyxyKT9vW3NdOm59cmV0dXJuIHR9KF8sdSk6eSYmdj4xJiZfLnJldmVyc2UoKSxmJiZsPHYmJihfLmxlbmd0aD1sKSx0aGlzJiZ0aGlzIT09eWUmJnRoaXMgaW5zdGFuY2VvZiBjJiYoQz1tfHx6aShDKSksQy5hcHBseShFLF8pfX1mdW5jdGlvbiBWaSh0LGUpe3JldHVybiBmdW5jdGlvbihuLHIpe3JldHVybiBmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gYnIodCwoZnVuY3Rpb24odCxpLG8pe2UocixuKHQpLGksbyl9KSkscn0obix0LGUocikse30pfX1mdW5jdGlvbiBHaSh0LGUpe3JldHVybiBmdW5jdGlvbihyLGkpe3ZhciBvO2lmKHI9PT1uJiZpPT09bilyZXR1cm4gZTtpZihyIT09biYmKG89ciksaSE9PW4pe2lmKG89PT1uKXJldHVybiBpOyJzdHJpbmciPT10eXBlb2Ygcnx8InN0cmluZyI9PXR5cGVvZiBpPyhyPWhpKHIpLGk9aGkoaSkpOihyPWxpKHIpLGk9bGkoaSkpLG89dChyLGkpfXJldHVybiBvfX1mdW5jdGlvbiBZaSh0KXtyZXR1cm4gaW8oKGZ1bmN0aW9uKGUpe3JldHVybiBlPVJlKGUsdG4obG8oKSkpLFFyKChmdW5jdGlvbihuKXt2YXIgcj10aGlzO3JldHVybiB0KGUsKGZ1bmN0aW9uKHQpe3JldHVybiBOZSh0LHIsbil9KSl9KSl9KSl9ZnVuY3Rpb24gWGkodCxlKXt2YXIgcj0oZT1lPT09bj8iICI6aGkoZSkpLmxlbmd0aDtpZihyPDIpcmV0dXJuIHI/SnIoZSx0KTplO3ZhciBpPUpyKGUsbWUodC9kbihlKSkpO3JldHVybiBjbihlKT9EaShnbihpKSwwLHQpLmpvaW4oIiIpOmkuc2xpY2UoMCx0KX1mdW5jdGlvbiBXaSh0KXtyZXR1cm4gZnVuY3Rpb24oZSxyLGkpe3JldHVybiBpJiYibnVtYmVyIiE9dHlwZW9mIGkmJmJvKGUscixpKSYmKHI9aT1uKSxlPWdhKGUpLHI9PT1uPyhyPWUsZT0wKTpyPWdhKHIpLGZ1bmN0aW9uKHQsZSxuLHIpe2Zvcih2YXIgaT0tMSxvPXhuKG1lKChlLXQpLyhufHwxKSksMCkscz1FdChvKTtvLS07KXNbcj9vOisraV09dCx0Kz1uO3JldHVybiBzfShlLHIsaT1pPT09bj9lPHI/MTotMTpnYShpKSx0KX19ZnVuY3Rpb24gSGkodCl7cmV0dXJuIGZ1bmN0aW9uKGUsbil7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBlJiYic3RyaW5nIj09dHlwZW9mIG58fChlPXZhKGUpLG49dmEobikpLHQoZSxuKX19ZnVuY3Rpb24gWmkodCxlLHIsaSxvLHMsYyxsLGgsZil7dmFyIHA9OCZlO2V8PXA/YTp1LDQmKGUmPX4ocD91OmEpKXx8KGUmPS00KTt2YXIgZD1bdCxlLG8scD9zOm4scD9jOm4scD9uOnMscD9uOmMsbCxoLGZdLGc9ci5hcHBseShuLGQpO3JldHVybiBFbyh0KSYmVG8oZyxkKSxnLnBsYWNlaG9sZGVyPWksUG8oZyx0LGUpfWZ1bmN0aW9uIEtpKHQpe3ZhciBlPU50W3RdO3JldHVybiBmdW5jdGlvbih0LG4pe2lmKHQ9dmEodCksKG49bnVsbD09bj8wOnduKHlhKG4pLDI5MikpJiZVZSh0KSl7dmFyIHI9KHhhKHQpKyJlIikuc3BsaXQoImUiKTtyZXR1cm4rKChyPSh4YShlKHJbMF0rImUiKygrclsxXStuKSkpKyJlIikuc3BsaXQoImUiKSlbMF0rImUiKygrclsxXS1uKSl9cmV0dXJuIGUodCl9fXZhciBKaT1JbiYmMS9wbihuZXcgSW4oWywtMF0pKVsxXT09aD9mdW5jdGlvbih0KXtyZXR1cm4gbmV3IEluKHQpfTpsdTtmdW5jdGlvbiBRaSh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIG49bW8oZSk7cmV0dXJuIG49PUM/bG4oZSk6bj09TT9mdW5jdGlvbih0KXt2YXIgZT0tMSxuPUFycmF5KHQuc2l6ZSk7cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCl7blsrK2VdPVt0LHRdfSkpLG59KGUpOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIFJlKGUsKGZ1bmN0aW9uKGUpe3JldHVybltlLHRbZV1dfSkpfShlLHQoZSkpfX1mdW5jdGlvbiAkaSh0LGUsaSxoLGYscCxkLGcpe3ZhciB5PTImZTtpZigheSYmImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR0KHIpO3ZhciBtPWg/aC5sZW5ndGg6MDtpZihtfHwoZSY9LTk3LGg9Zj1uKSxkPWQ9PT1uP2Q6eG4oeWEoZCksMCksZz1nPT09bj9nOnlhKGcpLG0tPWY/Zi5sZW5ndGg6MCxlJnUpe3ZhciB2PWgsXz1mO2g9Zj1ufXZhciB4PXk/bjphbyh0KSx3PVt0LGUsaSxoLGYsdixfLHAsZCxnXTtpZih4JiZmdW5jdGlvbih0LGUpe3ZhciBuPXRbMV0scj1lWzFdLGk9bnxyLHM9aTwxMzEsYT1yPT1jJiY4PT1ufHxyPT1jJiZuPT1sJiZ0WzddLmxlbmd0aDw9ZVs4XXx8Mzg0PT1yJiZlWzddLmxlbmd0aDw9ZVs4XSYmOD09bjtpZighcyYmIWEpcmV0dXJuIHQ7MSZyJiYodFsyXT1lWzJdLGl8PTEmbj8wOjQpO3ZhciB1PWVbM107aWYodSl7dmFyIGg9dFszXTt0WzNdPWg/SWkoaCx1LGVbNF0pOnUsdFs0XT1oP2ZuKHRbM10sbyk6ZVs0XX11PWVbNV0sdSYmKGg9dFs1XSx0WzVdPWg/TWkoaCx1LGVbNl0pOnUsdFs2XT1oP2ZuKHRbNV0sbyk6ZVs2XSksdT1lWzddLHUmJih0WzddPXUpLHImYyYmKHRbOF09bnVsbD09dFs4XT9lWzhdOnduKHRbOF0sZVs4XSkpLG51bGw9PXRbOV0mJih0WzldPWVbOV0pLHRbMF09ZVswXSx0WzFdPWl9KHcseCksdD13WzBdLGU9d1sxXSxpPXdbMl0saD13WzNdLGY9d1s0XSwhKGc9d1s5XT13WzldPT09bj95PzA6dC5sZW5ndGg6eG4od1s5XS1tLDApKSYmMjQmZSYmKGUmPS0yNSksZSYmMSE9ZSliPTg9PWV8fGU9PXM/ZnVuY3Rpb24odCxlLHIpe3ZhciBpPXppKHQpO3JldHVybiBmdW5jdGlvbiBvKCl7Zm9yKHZhciBzPWFyZ3VtZW50cy5sZW5ndGgsYT1FdChzKSx1PXMsYz1jbyhvKTt1LS07KWFbdV09YXJndW1lbnRzW3VdO3ZhciBsPXM8MyYmYVswXSE9PWMmJmFbcy0xXSE9PWM/W106Zm4oYSxjKTtyZXR1cm4ocy09bC5sZW5ndGgpPHI/WmkodCxlLHFpLG8ucGxhY2Vob2xkZXIsbixhLGwsbixuLHItcyk6TmUodGhpcyYmdGhpcyE9PXllJiZ0aGlzIGluc3RhbmNlb2Ygbz9pOnQsdGhpcyxhKX19KHQsZSxnKTplIT1hJiYzMyE9ZXx8Zi5sZW5ndGg/cWkuYXBwbHkobix3KTpmdW5jdGlvbih0LGUsbixyKXt2YXIgaT0xJmUsbz16aSh0KTtyZXR1cm4gZnVuY3Rpb24gZSgpe2Zvcih2YXIgcz0tMSxhPWFyZ3VtZW50cy5sZW5ndGgsdT0tMSxjPXIubGVuZ3RoLGw9RXQoYythKSxoPXRoaXMmJnRoaXMhPT15ZSYmdGhpcyBpbnN0YW5jZW9mIGU/bzp0OysrdTxjOylsW3VdPXJbdV07Zm9yKDthLS07KWxbdSsrXT1hcmd1bWVudHNbKytzXTtyZXR1cm4gTmUoaCxpP246dGhpcyxsKX19KHQsZSxpLGgpO2Vsc2UgdmFyIGI9ZnVuY3Rpb24odCxlLG4pe3ZhciByPTEmZSxpPXppKHQpO3JldHVybiBmdW5jdGlvbiBlKCl7cmV0dXJuKHRoaXMmJnRoaXMhPT15ZSYmdGhpcyBpbnN0YW5jZW9mIGU/aTp0KS5hcHBseShyP246dGhpcyxhcmd1bWVudHMpfX0odCxlLGkpO3JldHVybiBQbygoeD9uaTpUbykoYix3KSx0LGUpfWZ1bmN0aW9uIHRvKHQsZSxyLGkpe3JldHVybiB0PT09bnx8cXModCxQdFtyXSkmJiFrdC5jYWxsKGkscik/ZTp0fWZ1bmN0aW9uIGVvKHQsZSxyLGksbyxzKXtyZXR1cm4gbmEodCkmJm5hKGUpJiYocy5zZXQoZSx0KSxHcih0LGUsbixlbyxzKSxzLmRlbGV0ZShlKSksdH1mdW5jdGlvbiBubyh0KXtyZXR1cm4gc2EodCk/bjp0fWZ1bmN0aW9uIHJvKHQsZSxyLGksbyxzKXt2YXIgYT0xJnIsdT10Lmxlbmd0aCxjPWUubGVuZ3RoO2lmKHUhPWMmJiEoYSYmYz51KSlyZXR1cm4hMTt2YXIgbD1zLmdldCh0KSxoPXMuZ2V0KGUpO2lmKGwmJmgpcmV0dXJuIGw9PWUmJmg9PXQ7dmFyIGY9LTEscD0hMCxkPTImcj9uZXcgS246bjtmb3Iocy5zZXQodCxlKSxzLnNldChlLHQpOysrZjx1Oyl7dmFyIGc9dFtmXSx5PWVbZl07aWYoaSl2YXIgbT1hP2koeSxnLGYsZSx0LHMpOmkoZyx5LGYsdCxlLHMpO2lmKG0hPT1uKXtpZihtKWNvbnRpbnVlO3A9ITE7YnJlYWt9aWYoZCl7aWYoIWplKGUsKGZ1bmN0aW9uKHQsZSl7aWYoIW5uKGQsZSkmJihnPT09dHx8byhnLHQscixpLHMpKSlyZXR1cm4gZC5wdXNoKGUpfSkpKXtwPSExO2JyZWFrfX1lbHNlIGlmKGchPT15JiYhbyhnLHkscixpLHMpKXtwPSExO2JyZWFrfX1yZXR1cm4gcy5kZWxldGUodCkscy5kZWxldGUoZSkscH1mdW5jdGlvbiBpbyh0KXtyZXR1cm4gTG8oSW8odCxuLFdvKSx0KyIiKX1mdW5jdGlvbiBvbyh0KXtyZXR1cm4gU3IodCxPYSxnbyl9ZnVuY3Rpb24gc28odCl7cmV0dXJuIFNyKHQsTGEseW8pfXZhciBhbz1Ubj9mdW5jdGlvbih0KXtyZXR1cm4gVG4uZ2V0KHQpfTpsdTtmdW5jdGlvbiB1byh0KXtmb3IodmFyIGU9dC5uYW1lKyIiLG49T25bZV0scj1rdC5jYWxsKE9uLGUpP24ubGVuZ3RoOjA7ci0tOyl7dmFyIGk9bltyXSxvPWkuZnVuYztpZihudWxsPT1vfHxvPT10KXJldHVybiBpLm5hbWV9cmV0dXJuIGV9ZnVuY3Rpb24gY28odCl7cmV0dXJuKGt0LmNhbGwocW4sInBsYWNlaG9sZGVyIik/cW46dCkucGxhY2Vob2xkZXJ9ZnVuY3Rpb24gbG8oKXt2YXIgdD1xbi5pdGVyYXRlZXx8c3U7cmV0dXJuIHQ9dD09PXN1P0JyOnQsYXJndW1lbnRzLmxlbmd0aD90KGFyZ3VtZW50c1swXSxhcmd1bWVudHNbMV0pOnR9ZnVuY3Rpb24gaG8odCxlKXt2YXIgbj10Ll9fZGF0YV9fO3JldHVybiBmdW5jdGlvbih0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4ic3RyaW5nIj09ZXx8Im51bWJlciI9PWV8fCJzeW1ib2wiPT1lfHwiYm9vbGVhbiI9PWU/Il9fcHJvdG9fXyIhPT10Om51bGw9PT10fShlKT9uWyJzdHJpbmciPT10eXBlb2YgZT8ic3RyaW5nIjoiaGFzaCJdOm4ubWFwfWZ1bmN0aW9uIGZvKHQpe2Zvcih2YXIgZT1PYSh0KSxuPWUubGVuZ3RoO24tLTspe3ZhciByPWVbbl0saT10W3JdO2Vbbl09W3IsaSxBbyhpKV19cmV0dXJuIGV9ZnVuY3Rpb24gcG8odCxlKXt2YXIgcj1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT10P246dFtlXX0odCxlKTtyZXR1cm4gUnIocik/cjpufXZhciBnbz14ZT9mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD9bXToodD1JdCh0KSxPZSh4ZSh0KSwoZnVuY3Rpb24oZSl7cmV0dXJuIEp0LmNhbGwodCxlKX0pKSl9Om11LHlvPXhlP2Z1bmN0aW9uKHQpe2Zvcih2YXIgZT1bXTt0OylCZShlLGdvKHQpKSx0PVp0KHQpO3JldHVybiBlfTptdSxtbz1BcjtmdW5jdGlvbiB2byh0LGUsbil7Zm9yKHZhciByPS0xLGk9KGU9d2koZSx0KSkubGVuZ3RoLG89ITE7KytyPGk7KXt2YXIgcz16byhlW3JdKTtpZighKG89bnVsbCE9dCYmbih0LHMpKSlicmVhazt0PXRbc119cmV0dXJuIG98fCsrciE9aT9vOiEhKGk9bnVsbD09dD8wOnQubGVuZ3RoKSYmZWEoaSkmJndvKHMsaSkmJihYcyh0KXx8WXModCkpfWZ1bmN0aW9uIF9vKHQpe3JldHVybiJmdW5jdGlvbiIhPXR5cGVvZiB0LmNvbnN0cnVjdG9yfHxTbyh0KT97fTpWbihadCh0KSl9ZnVuY3Rpb24geG8odCl7cmV0dXJuIFhzKHQpfHxZcyh0KXx8ISEoJHQmJnQmJnRbJHRdKX1mdW5jdGlvbiB3byh0LGUpe3ZhciBuPXR5cGVvZiB0O3JldHVybiEhKGU9bnVsbD09ZT9mOmUpJiYoIm51bWJlciI9PW58fCJzeW1ib2wiIT1uJiZ4dC50ZXN0KHQpKSYmdD4tMSYmdCUxPT0wJiZ0PGV9ZnVuY3Rpb24gYm8odCxlLG4pe2lmKCFuYShuKSlyZXR1cm4hMTt2YXIgcj10eXBlb2YgZTtyZXR1cm4hISgibnVtYmVyIj09cj9IcyhuKSYmd28oZSxuLmxlbmd0aCk6InN0cmluZyI9PXImJmUgaW4gbikmJnFzKG5bZV0sdCl9ZnVuY3Rpb24gRG8odCxlKXtpZihYcyh0KSlyZXR1cm4hMTt2YXIgbj10eXBlb2YgdDtyZXR1cm4hKCJudW1iZXIiIT1uJiYic3ltYm9sIiE9biYmImJvb2xlYW4iIT1uJiZudWxsIT10JiYhbGEodCkpfHwobnQudGVzdCh0KXx8IWV0LnRlc3QodCl8fG51bGwhPWUmJnQgaW4gSXQoZSkpfWZ1bmN0aW9uIEVvKHQpe3ZhciBlPXVvKHQpLG49cW5bZV07aWYoImZ1bmN0aW9uIiE9dHlwZW9mIG58fCEoZSBpbiBYbi5wcm90b3R5cGUpKXJldHVybiExO2lmKHQ9PT1uKXJldHVybiEwO3ZhciByPWFvKG4pO3JldHVybiEhciYmdD09PXJbMF19KFNuJiZtbyhuZXcgU24obmV3IEFycmF5QnVmZmVyKDEpKSkhPVB8fEFuJiZtbyhuZXcgQW4pIT1DfHxObiYmbW8oTm4ucmVzb2x2ZSgpKSE9Tnx8SW4mJm1vKG5ldyBJbikhPU18fE1uJiZtbyhuZXcgTW4pIT1PKSYmKG1vPWZ1bmN0aW9uKHQpe3ZhciBlPUFyKHQpLHI9ZT09QT90LmNvbnN0cnVjdG9yOm4saT1yP2pvKHIpOiIiO2lmKGkpc3dpdGNoKGkpe2Nhc2UgTG46cmV0dXJuIFA7Y2FzZSBQbjpyZXR1cm4gQztjYXNlIFJuOnJldHVybiBOO2Nhc2UgQm46cmV0dXJuIE07Y2FzZSBrbjpyZXR1cm4gT31yZXR1cm4gZX0pO3ZhciBDbz1SdD8kczp2dTtmdW5jdGlvbiBTbyh0KXt2YXIgZT10JiZ0LmNvbnN0cnVjdG9yO3JldHVybiB0PT09KCJmdW5jdGlvbiI9PXR5cGVvZiBlJiZlLnByb3RvdHlwZXx8UHQpfWZ1bmN0aW9uIEFvKHQpe3JldHVybiB0PT10JiYhbmEodCl9ZnVuY3Rpb24gTm8odCxlKXtyZXR1cm4gZnVuY3Rpb24ocil7cmV0dXJuIG51bGwhPXImJihyW3RdPT09ZSYmKGUhPT1ufHx0IGluIEl0KHIpKSl9fWZ1bmN0aW9uIElvKHQsZSxyKXtyZXR1cm4gZT14bihlPT09bj90Lmxlbmd0aC0xOmUsMCksZnVuY3Rpb24oKXtmb3IodmFyIG49YXJndW1lbnRzLGk9LTEsbz14bihuLmxlbmd0aC1lLDApLHM9RXQobyk7KytpPG87KXNbaV09bltlK2ldO2k9LTE7Zm9yKHZhciBhPUV0KGUrMSk7KytpPGU7KWFbaV09bltpXTtyZXR1cm4gYVtlXT1yKHMpLE5lKHQsdGhpcyxhKX19ZnVuY3Rpb24gTW8odCxlKXtyZXR1cm4gZS5sZW5ndGg8Mj90OkNyKHQsb2koZSwwLC0xKSl9ZnVuY3Rpb24gRm8odCxlKXtpZigoImNvbnN0cnVjdG9yIiE9PWV8fCJmdW5jdGlvbiIhPXR5cGVvZiB0W2VdKSYmIl9fcHJvdG9fXyIhPWUpcmV0dXJuIHRbZV19dmFyIFRvPVJvKG5pKSxPbz1nZXx8ZnVuY3Rpb24odCxlKXtyZXR1cm4geWUuc2V0VGltZW91dCh0LGUpfSxMbz1SbyhyaSk7ZnVuY3Rpb24gUG8odCxlLG4pe3ZhciByPWUrIiI7cmV0dXJuIExvKHQsZnVuY3Rpb24odCxlKXt2YXIgbj1lLmxlbmd0aDtpZighbilyZXR1cm4gdDt2YXIgcj1uLTE7cmV0dXJuIGVbcl09KG4+MT8iJiAiOiIiKStlW3JdLGU9ZS5qb2luKG4+Mj8iLCAiOiIgIiksdC5yZXBsYWNlKHV0LCJ7XG4vKiBbd3JhcHBlZCB3aXRoICIrZSsiXSAqL1xuIil9KHIsZnVuY3Rpb24odCxlKXtyZXR1cm4gTWUobSwoZnVuY3Rpb24obil7dmFyIHI9Il8uIituWzBdO2UmblsxXSYmIUxlKHQscikmJnQucHVzaChyKX0pKSx0LnNvcnQoKX0oZnVuY3Rpb24odCl7dmFyIGU9dC5tYXRjaChjdCk7cmV0dXJuIGU/ZVsxXS5zcGxpdChsdCk6W119KHIpLG4pKSl9ZnVuY3Rpb24gUm8odCl7dmFyIGU9MCxyPTA7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGk9Ym4oKSxvPTE2LShpLXIpO2lmKHI9aSxvPjApe2lmKCsrZT49ODAwKXJldHVybiBhcmd1bWVudHNbMF19ZWxzZSBlPTA7cmV0dXJuIHQuYXBwbHkobixhcmd1bWVudHMpfX1mdW5jdGlvbiBCbyh0LGUpe3ZhciByPS0xLGk9dC5sZW5ndGgsbz1pLTE7Zm9yKGU9ZT09PW4/aTplOysrcjxlOyl7dmFyIHM9S3IocixvKSxhPXRbc107dFtzXT10W3JdLHRbcl09YX1yZXR1cm4gdC5sZW5ndGg9ZSx0fXZhciBrbz1mdW5jdGlvbih0KXt2YXIgZT1Scyh0LChmdW5jdGlvbih0KXtyZXR1cm4gNTAwPT09bi5zaXplJiZuLmNsZWFyKCksdH0pKSxuPWUuY2FjaGU7cmV0dXJuIGV9KChmdW5jdGlvbih0KXt2YXIgZT1bXTtyZXR1cm4gNDY9PT10LmNoYXJDb2RlQXQoMCkmJmUucHVzaCgiIiksdC5yZXBsYWNlKHJ0LChmdW5jdGlvbih0LG4scixpKXtlLnB1c2gocj9pLnJlcGxhY2UocHQsIiQxIik6bnx8dCl9KSksZX0pKTtmdW5jdGlvbiB6byh0KXtpZigic3RyaW5nIj09dHlwZW9mIHR8fGxhKHQpKXJldHVybiB0O3ZhciBlPXQrIiI7cmV0dXJuIjAiPT1lJiYxL3Q9PS1oPyItMCI6ZX1mdW5jdGlvbiBqbyh0KXtpZihudWxsIT10KXt0cnl7cmV0dXJuIEJ0LmNhbGwodCl9Y2F0Y2godCl7fXRyeXtyZXR1cm4gdCsiIn1jYXRjaCh0KXt9fXJldHVybiIifWZ1bmN0aW9uIFVvKHQpe2lmKHQgaW5zdGFuY2VvZiBYbilyZXR1cm4gdC5jbG9uZSgpO3ZhciBlPW5ldyBZbih0Ll9fd3JhcHBlZF9fLHQuX19jaGFpbl9fKTtyZXR1cm4gZS5fX2FjdGlvbnNfXz1GaSh0Ll9fYWN0aW9uc19fKSxlLl9faW5kZXhfXz10Ll9faW5kZXhfXyxlLl9fdmFsdWVzX189dC5fX3ZhbHVlc19fLGV9dmFyIHFvPVFyKChmdW5jdGlvbih0LGUpe3JldHVybiBacyh0KT9wcih0LF9yKGUsMSxacywhMCkpOltdfSkpLFZvPVFyKChmdW5jdGlvbih0LGUpe3ZhciByPVFvKGUpO3JldHVybiBacyhyKSYmKHI9biksWnModCk/cHIodCxfcihlLDEsWnMsITApLGxvKHIsMikpOltdfSkpLEdvPVFyKChmdW5jdGlvbih0LGUpe3ZhciByPVFvKGUpO3JldHVybiBacyhyKSYmKHI9biksWnModCk/cHIodCxfcihlLDEsWnMsITApLG4scik6W119KSk7ZnVuY3Rpb24gWW8odCxlLG4pe3ZhciByPW51bGw9PXQ/MDp0Lmxlbmd0aDtpZighcilyZXR1cm4tMTt2YXIgaT1udWxsPT1uPzA6eWEobik7cmV0dXJuIGk8MCYmKGk9eG4ocitpLDApKSxWZSh0LGxvKGUsMyksaSl9ZnVuY3Rpb24gWG8odCxlLHIpe3ZhciBpPW51bGw9PXQ/MDp0Lmxlbmd0aDtpZighaSlyZXR1cm4tMTt2YXIgbz1pLTE7cmV0dXJuIHIhPT1uJiYobz15YShyKSxvPXI8MD94bihpK28sMCk6d24obyxpLTEpKSxWZSh0LGxvKGUsMyksbywhMCl9ZnVuY3Rpb24gV28odCl7cmV0dXJuKG51bGw9PXQ/MDp0Lmxlbmd0aCk/X3IodCwxKTpbXX1mdW5jdGlvbiBIbyh0KXtyZXR1cm4gdCYmdC5sZW5ndGg/dFswXTpufXZhciBabz1RcigoZnVuY3Rpb24odCl7dmFyIGU9UmUodCxfaSk7cmV0dXJuIGUubGVuZ3RoJiZlWzBdPT09dFswXT9GcihlKTpbXX0pKSxLbz1RcigoZnVuY3Rpb24odCl7dmFyIGU9UW8odCkscj1SZSh0LF9pKTtyZXR1cm4gZT09PVFvKHIpP2U9bjpyLnBvcCgpLHIubGVuZ3RoJiZyWzBdPT09dFswXT9GcihyLGxvKGUsMikpOltdfSkpLEpvPVFyKChmdW5jdGlvbih0KXt2YXIgZT1Rbyh0KSxyPVJlKHQsX2kpO3JldHVybihlPSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6bikmJnIucG9wKCksci5sZW5ndGgmJnJbMF09PT10WzBdP0ZyKHIsbixlKTpbXX0pKTtmdW5jdGlvbiBRbyh0KXt2YXIgZT1udWxsPT10PzA6dC5sZW5ndGg7cmV0dXJuIGU/dFtlLTFdOm59dmFyICRvPVFyKHRzKTtmdW5jdGlvbiB0cyh0LGUpe3JldHVybiB0JiZ0Lmxlbmd0aCYmZSYmZS5sZW5ndGg/SHIodCxlKTp0fXZhciBlcz1pbygoZnVuY3Rpb24odCxlKXt2YXIgbj1udWxsPT10PzA6dC5sZW5ndGgscj11cih0LGUpO3JldHVybiBacih0LFJlKGUsKGZ1bmN0aW9uKHQpe3JldHVybiB3byh0LG4pPyt0OnR9KSkuc29ydChOaSkpLHJ9KSk7ZnVuY3Rpb24gbnModCl7cmV0dXJuIG51bGw9PXQ/dDpDbi5jYWxsKHQpfXZhciBycz1RcigoZnVuY3Rpb24odCl7cmV0dXJuIGZpKF9yKHQsMSxacywhMCkpfSkpLGlzPVFyKChmdW5jdGlvbih0KXt2YXIgZT1Rbyh0KTtyZXR1cm4gWnMoZSkmJihlPW4pLGZpKF9yKHQsMSxacywhMCksbG8oZSwyKSl9KSksb3M9UXIoKGZ1bmN0aW9uKHQpe3ZhciBlPVFvKHQpO3JldHVybiBlPSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6bixmaShfcih0LDEsWnMsITApLG4sZSl9KSk7ZnVuY3Rpb24gc3ModCl7aWYoIXR8fCF0Lmxlbmd0aClyZXR1cm5bXTt2YXIgZT0wO3JldHVybiB0PU9lKHQsKGZ1bmN0aW9uKHQpe2lmKFpzKHQpKXJldHVybiBlPXhuKHQubGVuZ3RoLGUpLCEwfSkpLFFlKGUsKGZ1bmN0aW9uKGUpe3JldHVybiBSZSh0LEhlKGUpKX0pKX1mdW5jdGlvbiBhcyh0LGUpe2lmKCF0fHwhdC5sZW5ndGgpcmV0dXJuW107dmFyIHI9c3ModCk7cmV0dXJuIG51bGw9PWU/cjpSZShyLChmdW5jdGlvbih0KXtyZXR1cm4gTmUoZSxuLHQpfSkpfXZhciB1cz1RcigoZnVuY3Rpb24odCxlKXtyZXR1cm4gWnModCk/cHIodCxlKTpbXX0pKSxjcz1RcigoZnVuY3Rpb24odCl7cmV0dXJuIG1pKE9lKHQsWnMpKX0pKSxscz1RcigoZnVuY3Rpb24odCl7dmFyIGU9UW8odCk7cmV0dXJuIFpzKGUpJiYoZT1uKSxtaShPZSh0LFpzKSxsbyhlLDIpKX0pKSxocz1RcigoZnVuY3Rpb24odCl7dmFyIGU9UW8odCk7cmV0dXJuIGU9ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpuLG1pKE9lKHQsWnMpLG4sZSl9KSksZnM9UXIoc3MpO3ZhciBwcz1RcigoZnVuY3Rpb24odCl7dmFyIGU9dC5sZW5ndGgscj1lPjE/dFtlLTFdOm47cmV0dXJuIHI9ImZ1bmN0aW9uIj09dHlwZW9mIHI/KHQucG9wKCkscik6bixhcyh0LHIpfSkpO2Z1bmN0aW9uIGRzKHQpe3ZhciBlPXFuKHQpO3JldHVybiBlLl9fY2hhaW5fXz0hMCxlfWZ1bmN0aW9uIGdzKHQsZSl7cmV0dXJuIGUodCl9dmFyIHlzPWlvKChmdW5jdGlvbih0KXt2YXIgZT10Lmxlbmd0aCxyPWU/dFswXTowLGk9dGhpcy5fX3dyYXBwZWRfXyxvPWZ1bmN0aW9uKGUpe3JldHVybiB1cihlLHQpfTtyZXR1cm4hKGU+MXx8dGhpcy5fX2FjdGlvbnNfXy5sZW5ndGgpJiZpIGluc3RhbmNlb2YgWG4mJndvKHIpPygoaT1pLnNsaWNlKHIsK3IrKGU/MTowKSkpLl9fYWN0aW9uc19fLnB1c2goe2Z1bmM6Z3MsYXJnczpbb10sdGhpc0FyZzpufSksbmV3IFluKGksdGhpcy5fX2NoYWluX18pLnRocnUoKGZ1bmN0aW9uKHQpe3JldHVybiBlJiYhdC5sZW5ndGgmJnQucHVzaChuKSx0fSkpKTp0aGlzLnRocnUobyl9KSk7dmFyIG1zPU9pKChmdW5jdGlvbih0LGUsbil7a3QuY2FsbCh0LG4pPysrdFtuXTphcih0LG4sMSl9KSk7dmFyIHZzPWppKFlvKSxfcz1qaShYbyk7ZnVuY3Rpb24geHModCxlKXtyZXR1cm4oWHModCk/TWU6ZHIpKHQsbG8oZSwzKSl9ZnVuY3Rpb24gd3ModCxlKXtyZXR1cm4oWHModCk/RmU6Z3IpKHQsbG8oZSwzKSl9dmFyIGJzPU9pKChmdW5jdGlvbih0LGUsbil7a3QuY2FsbCh0LG4pP3Rbbl0ucHVzaChlKTphcih0LG4sW2VdKX0pKTt2YXIgRHM9UXIoKGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj0tMSxpPSJmdW5jdGlvbiI9PXR5cGVvZiBlLG89SHModCk/RXQodC5sZW5ndGgpOltdO3JldHVybiBkcih0LChmdW5jdGlvbih0KXtvWysrcl09aT9OZShlLHQsbik6VHIodCxlLG4pfSkpLG99KSksRXM9T2koKGZ1bmN0aW9uKHQsZSxuKXthcih0LG4sZSl9KSk7ZnVuY3Rpb24gQ3ModCxlKXtyZXR1cm4oWHModCk/UmU6VXIpKHQsbG8oZSwzKSl9dmFyIFNzPU9pKChmdW5jdGlvbih0LGUsbil7dFtuPzA6MV0ucHVzaChlKX0pLChmdW5jdGlvbigpe3JldHVybltbXSxbXV19KSk7dmFyIEFzPVFyKChmdW5jdGlvbih0LGUpe2lmKG51bGw9PXQpcmV0dXJuW107dmFyIG49ZS5sZW5ndGg7cmV0dXJuIG4+MSYmYm8odCxlWzBdLGVbMV0pP2U9W106bj4yJiZibyhlWzBdLGVbMV0sZVsyXSkmJihlPVtlWzBdXSksWHIodCxfcihlLDEpLFtdKX0pKSxOcz1kZXx8ZnVuY3Rpb24oKXtyZXR1cm4geWUuRGF0ZS5ub3coKX07ZnVuY3Rpb24gSXModCxlLHIpe3JldHVybiBlPXI/bjplLGU9dCYmbnVsbD09ZT90Lmxlbmd0aDplLCRpKHQsYyxuLG4sbixuLGUpfWZ1bmN0aW9uIE1zKHQsZSl7dmFyIGk7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR0KHIpO3JldHVybiB0PXlhKHQpLGZ1bmN0aW9uKCl7cmV0dXJuLS10PjAmJihpPWUuYXBwbHkodGhpcyxhcmd1bWVudHMpKSx0PD0xJiYoZT1uKSxpfX12YXIgRnM9UXIoKGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj0xO2lmKG4ubGVuZ3RoKXt2YXIgaT1mbihuLGNvKEZzKSk7cnw9YX1yZXR1cm4gJGkodCxyLGUsbixpKX0pKSxUcz1RcigoZnVuY3Rpb24odCxlLG4pe3ZhciByPTM7aWYobi5sZW5ndGgpe3ZhciBpPWZuKG4sY28oVHMpKTtyfD1hfXJldHVybiAkaShlLHIsdCxuLGkpfSkpO2Z1bmN0aW9uIE9zKHQsZSxpKXt2YXIgbyxzLGEsdSxjLGwsaD0wLGY9ITEscD0hMSxkPSEwO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBUdChyKTtmdW5jdGlvbiBnKGUpe3ZhciByPW8saT1zO3JldHVybiBvPXM9bixoPWUsdT10LmFwcGx5KGkscil9ZnVuY3Rpb24geSh0KXt2YXIgcj10LWw7cmV0dXJuIGw9PT1ufHxyPj1lfHxyPDB8fHAmJnQtaD49YX1mdW5jdGlvbiBtKCl7dmFyIHQ9TnMoKTtpZih5KHQpKXJldHVybiB2KHQpO2M9T28obSxmdW5jdGlvbih0KXt2YXIgbj1lLSh0LWwpO3JldHVybiBwP3duKG4sYS0odC1oKSk6bn0odCkpfWZ1bmN0aW9uIHYodCl7cmV0dXJuIGM9bixkJiZvP2codCk6KG89cz1uLHUpfWZ1bmN0aW9uIF8oKXt2YXIgdD1OcygpLHI9eSh0KTtpZihvPWFyZ3VtZW50cyxzPXRoaXMsbD10LHIpe2lmKGM9PT1uKXJldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gaD10LGM9T28obSxlKSxmP2codCk6dX0obCk7aWYocClyZXR1cm4gRWkoYyksYz1PbyhtLGUpLGcobCl9cmV0dXJuIGM9PT1uJiYoYz1PbyhtLGUpKSx1fXJldHVybiBlPXZhKGUpfHwwLG5hKGkpJiYoZj0hIWkubGVhZGluZyxhPShwPSJtYXhXYWl0ImluIGkpP3huKHZhKGkubWF4V2FpdCl8fDAsZSk6YSxkPSJ0cmFpbGluZyJpbiBpPyEhaS50cmFpbGluZzpkKSxfLmNhbmNlbD1mdW5jdGlvbigpe2MhPT1uJiZFaShjKSxoPTAsbz1sPXM9Yz1ufSxfLmZsdXNoPWZ1bmN0aW9uKCl7cmV0dXJuIGM9PT1uP3U6dihOcygpKX0sX312YXIgTHM9UXIoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGZyKHQsMSxlKX0pKSxQcz1RcigoZnVuY3Rpb24odCxlLG4pe3JldHVybiBmcih0LHZhKGUpfHwwLG4pfSkpO2Z1bmN0aW9uIFJzKHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHR8fG51bGwhPWUmJiJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBUdChyKTt2YXIgbj1mdW5jdGlvbigpe3ZhciByPWFyZ3VtZW50cyxpPWU/ZS5hcHBseSh0aGlzLHIpOnJbMF0sbz1uLmNhY2hlO2lmKG8uaGFzKGkpKXJldHVybiBvLmdldChpKTt2YXIgcz10LmFwcGx5KHRoaXMscik7cmV0dXJuIG4uY2FjaGU9by5zZXQoaSxzKXx8byxzfTtyZXR1cm4gbi5jYWNoZT1uZXcoUnMuQ2FjaGV8fFpuKSxufWZ1bmN0aW9uIEJzKHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBUdChyKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT1hcmd1bWVudHM7c3dpdGNoKGUubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIXQuY2FsbCh0aGlzKTtjYXNlIDE6cmV0dXJuIXQuY2FsbCh0aGlzLGVbMF0pO2Nhc2UgMjpyZXR1cm4hdC5jYWxsKHRoaXMsZVswXSxlWzFdKTtjYXNlIDM6cmV0dXJuIXQuY2FsbCh0aGlzLGVbMF0sZVsxXSxlWzJdKX1yZXR1cm4hdC5hcHBseSh0aGlzLGUpfX1Scy5DYWNoZT1abjt2YXIga3M9YmkoKGZ1bmN0aW9uKHQsZSl7dmFyIG49KGU9MT09ZS5sZW5ndGgmJlhzKGVbMF0pP1JlKGVbMF0sdG4obG8oKSkpOlJlKF9yKGUsMSksdG4obG8oKSkpKS5sZW5ndGg7cmV0dXJuIFFyKChmdW5jdGlvbihyKXtmb3IodmFyIGk9LTEsbz13bihyLmxlbmd0aCxuKTsrK2k8bzspcltpXT1lW2ldLmNhbGwodGhpcyxyW2ldKTtyZXR1cm4gTmUodCx0aGlzLHIpfSkpfSkpLHpzPVFyKChmdW5jdGlvbih0LGUpe3ZhciByPWZuKGUsY28oenMpKTtyZXR1cm4gJGkodCxhLG4sZSxyKX0pKSxqcz1RcigoZnVuY3Rpb24odCxlKXt2YXIgcj1mbihlLGNvKGpzKSk7cmV0dXJuICRpKHQsdSxuLGUscil9KSksVXM9aW8oKGZ1bmN0aW9uKHQsZSl7cmV0dXJuICRpKHQsbCxuLG4sbixlKX0pKTtmdW5jdGlvbiBxcyh0LGUpe3JldHVybiB0PT09ZXx8dCE9dCYmZSE9ZX12YXIgVnM9SGkoTnIpLEdzPUhpKChmdW5jdGlvbih0LGUpe3JldHVybiB0Pj1lfSkpLFlzPU9yKGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50c30oKSk/T3I6ZnVuY3Rpb24odCl7cmV0dXJuIHJhKHQpJiZrdC5jYWxsKHQsImNhbGxlZSIpJiYhSnQuY2FsbCh0LCJjYWxsZWUiKX0sWHM9RXQuaXNBcnJheSxXcz1iZT90bihiZSk6ZnVuY3Rpb24odCl7cmV0dXJuIHJhKHQpJiZBcih0KT09TH07ZnVuY3Rpb24gSHModCl7cmV0dXJuIG51bGwhPXQmJmVhKHQubGVuZ3RoKSYmISRzKHQpfWZ1bmN0aW9uIFpzKHQpe3JldHVybiByYSh0KSYmSHModCl9dmFyIEtzPXdlfHx2dSxKcz1EZT90bihEZSk6ZnVuY3Rpb24odCl7cmV0dXJuIHJhKHQpJiZBcih0KT09d307ZnVuY3Rpb24gUXModCl7aWYoIXJhKHQpKXJldHVybiExO3ZhciBlPUFyKHQpO3JldHVybiBlPT1ifHwiW29iamVjdCBET01FeGNlcHRpb25dIj09ZXx8InN0cmluZyI9PXR5cGVvZiB0Lm1lc3NhZ2UmJiJzdHJpbmciPT10eXBlb2YgdC5uYW1lJiYhc2EodCl9ZnVuY3Rpb24gJHModCl7aWYoIW5hKHQpKXJldHVybiExO3ZhciBlPUFyKHQpO3JldHVybiBlPT1EfHxlPT1FfHwiW29iamVjdCBBc3luY0Z1bmN0aW9uXSI9PWV8fCJbb2JqZWN0IFByb3h5XSI9PWV9ZnVuY3Rpb24gdGEodCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0JiZ0PT15YSh0KX1mdW5jdGlvbiBlYSh0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQmJnQ+LTEmJnQlMT09MCYmdDw9Zn1mdW5jdGlvbiBuYSh0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4gbnVsbCE9dCYmKCJvYmplY3QiPT1lfHwiZnVuY3Rpb24iPT1lKX1mdW5jdGlvbiByYSh0KXtyZXR1cm4gbnVsbCE9dCYmIm9iamVjdCI9PXR5cGVvZiB0fXZhciBpYT1FZT90bihFZSk6ZnVuY3Rpb24odCl7cmV0dXJuIHJhKHQpJiZtbyh0KT09Q307ZnVuY3Rpb24gb2EodCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0fHxyYSh0KSYmQXIodCk9PVN9ZnVuY3Rpb24gc2EodCl7aWYoIXJhKHQpfHxBcih0KSE9QSlyZXR1cm4hMTt2YXIgZT1adCh0KTtpZihudWxsPT09ZSlyZXR1cm4hMDt2YXIgbj1rdC5jYWxsKGUsImNvbnN0cnVjdG9yIikmJmUuY29uc3RydWN0b3I7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIG4mJm4gaW5zdGFuY2VvZiBuJiZCdC5jYWxsKG4pPT1xdH12YXIgYWE9Q2U/dG4oQ2UpOmZ1bmN0aW9uKHQpe3JldHVybiByYSh0KSYmQXIodCk9PUl9O3ZhciB1YT1TZT90bihTZSk6ZnVuY3Rpb24odCl7cmV0dXJuIHJhKHQpJiZtbyh0KT09TX07ZnVuY3Rpb24gY2EodCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0fHwhWHModCkmJnJhKHQpJiZBcih0KT09Rn1mdW5jdGlvbiBsYSh0KXtyZXR1cm4ic3ltYm9sIj09dHlwZW9mIHR8fHJhKHQpJiZBcih0KT09VH12YXIgaGE9QWU/dG4oQWUpOmZ1bmN0aW9uKHQpe3JldHVybiByYSh0KSYmZWEodC5sZW5ndGgpJiYhIWNlW0FyKHQpXX07dmFyIGZhPUhpKGpyKSxwYT1IaSgoZnVuY3Rpb24odCxlKXtyZXR1cm4gdDw9ZX0pKTtmdW5jdGlvbiBkYSh0KXtpZighdClyZXR1cm5bXTtpZihIcyh0KSlyZXR1cm4gY2EodCk/Z24odCk6RmkodCk7aWYodGUmJnRbdGVdKXJldHVybiBmdW5jdGlvbih0KXtmb3IodmFyIGUsbj1bXTshKGU9dC5uZXh0KCkpLmRvbmU7KW4ucHVzaChlLnZhbHVlKTtyZXR1cm4gbn0odFt0ZV0oKSk7dmFyIGU9bW8odCk7cmV0dXJuKGU9PUM/bG46ZT09TT9wbjpxYSkodCl9ZnVuY3Rpb24gZ2EodCl7cmV0dXJuIHQ/KHQ9dmEodCkpPT09aHx8dD09PS1oPzE3OTc2OTMxMzQ4NjIzMTU3ZTI5MioodDwwPy0xOjEpOnQ9PXQ/dDowOjA9PT10P3Q6MH1mdW5jdGlvbiB5YSh0KXt2YXIgZT1nYSh0KSxuPWUlMTtyZXR1cm4gZT09ZT9uP2UtbjplOjB9ZnVuY3Rpb24gbWEodCl7cmV0dXJuIHQ/Y3IoeWEodCksMCxkKTowfWZ1bmN0aW9uIHZhKHQpe2lmKCJudW1iZXIiPT10eXBlb2YgdClyZXR1cm4gdDtpZihsYSh0KSlyZXR1cm4gcDtpZihuYSh0KSl7dmFyIGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQudmFsdWVPZj90LnZhbHVlT2YoKTp0O3Q9bmEoZSk/ZSsiIjplfWlmKCJzdHJpbmciIT10eXBlb2YgdClyZXR1cm4gMD09PXQ/dDordDt0PSRlKHQpO3ZhciBuPW10LnRlc3QodCk7cmV0dXJuIG58fF90LnRlc3QodCk/cGUodC5zbGljZSgyKSxuPzI6OCk6eXQudGVzdCh0KT9wOit0fWZ1bmN0aW9uIF9hKHQpe3JldHVybiBUaSh0LExhKHQpKX1mdW5jdGlvbiB4YSh0KXtyZXR1cm4gbnVsbD09dD8iIjpoaSh0KX12YXIgd2E9TGkoKGZ1bmN0aW9uKHQsZSl7aWYoU28oZSl8fEhzKGUpKVRpKGUsT2EoZSksdCk7ZWxzZSBmb3IodmFyIG4gaW4gZSlrdC5jYWxsKGUsbikmJnJyKHQsbixlW25dKX0pKSxiYT1MaSgoZnVuY3Rpb24odCxlKXtUaShlLExhKGUpLHQpfSkpLERhPUxpKChmdW5jdGlvbih0LGUsbixyKXtUaShlLExhKGUpLHQscil9KSksRWE9TGkoKGZ1bmN0aW9uKHQsZSxuLHIpe1RpKGUsT2EoZSksdCxyKX0pKSxDYT1pbyh1cik7dmFyIFNhPVFyKChmdW5jdGlvbih0LGUpe3Q9SXQodCk7dmFyIHI9LTEsaT1lLmxlbmd0aCxvPWk+Mj9lWzJdOm47Zm9yKG8mJmJvKGVbMF0sZVsxXSxvKSYmKGk9MSk7KytyPGk7KWZvcih2YXIgcz1lW3JdLGE9TGEocyksdT0tMSxjPWEubGVuZ3RoOysrdTxjOyl7dmFyIGw9YVt1XSxoPXRbbF07KGg9PT1ufHxxcyhoLFB0W2xdKSYmIWt0LmNhbGwodCxsKSkmJih0W2xdPXNbbF0pfXJldHVybiB0fSkpLEFhPVFyKChmdW5jdGlvbih0KXtyZXR1cm4gdC5wdXNoKG4sZW8pLE5lKFJhLG4sdCl9KSk7ZnVuY3Rpb24gTmEodCxlLHIpe3ZhciBpPW51bGw9PXQ/bjpDcih0LGUpO3JldHVybiBpPT09bj9yOml9ZnVuY3Rpb24gSWEodCxlKXtyZXR1cm4gbnVsbCE9dCYmdm8odCxlLE1yKX12YXIgTWE9VmkoKGZ1bmN0aW9uKHQsZSxuKXtudWxsIT1lJiYiZnVuY3Rpb24iIT10eXBlb2YgZS50b1N0cmluZyYmKGU9VXQuY2FsbChlKSksdFtlXT1ufSksbnUob3UpKSxGYT1WaSgoZnVuY3Rpb24odCxlLG4pe251bGwhPWUmJiJmdW5jdGlvbiIhPXR5cGVvZiBlLnRvU3RyaW5nJiYoZT1VdC5jYWxsKGUpKSxrdC5jYWxsKHQsZSk/dFtlXS5wdXNoKG4pOnRbZV09W25dfSksbG8pLFRhPVFyKFRyKTtmdW5jdGlvbiBPYSh0KXtyZXR1cm4gSHModCk/UW4odCk6a3IodCl9ZnVuY3Rpb24gTGEodCl7cmV0dXJuIEhzKHQpP1FuKHQsITApOnpyKHQpfXZhciBQYT1MaSgoZnVuY3Rpb24odCxlLG4pe0dyKHQsZSxuKX0pKSxSYT1MaSgoZnVuY3Rpb24odCxlLG4scil7R3IodCxlLG4scil9KSksQmE9aW8oKGZ1bmN0aW9uKHQsZSl7dmFyIG49e307aWYobnVsbD09dClyZXR1cm4gbjt2YXIgcj0hMTtlPVJlKGUsKGZ1bmN0aW9uKGUpe3JldHVybiBlPXdpKGUsdCkscnx8KHI9ZS5sZW5ndGg+MSksZX0pKSxUaSh0LHNvKHQpLG4pLHImJihuPWxyKG4sNyxubykpO2Zvcih2YXIgaT1lLmxlbmd0aDtpLS07KXBpKG4sZVtpXSk7cmV0dXJuIG59KSk7dmFyIGthPWlvKChmdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT10P3t9OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIFdyKHQsZSwoZnVuY3Rpb24oZSxuKXtyZXR1cm4gSWEodCxuKX0pKX0odCxlKX0pKTtmdW5jdGlvbiB6YSh0LGUpe2lmKG51bGw9PXQpcmV0dXJue307dmFyIG49UmUoc28odCksKGZ1bmN0aW9uKHQpe3JldHVyblt0XX0pKTtyZXR1cm4gZT1sbyhlKSxXcih0LG4sKGZ1bmN0aW9uKHQsbil7cmV0dXJuIGUodCxuWzBdKX0pKX12YXIgamE9UWkoT2EpLFVhPVFpKExhKTtmdW5jdGlvbiBxYSh0KXtyZXR1cm4gbnVsbD09dD9bXTplbih0LE9hKHQpKX12YXIgVmE9a2koKGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gZT1lLnRvTG93ZXJDYXNlKCksdCsobj9HYShlKTplKX0pKTtmdW5jdGlvbiBHYSh0KXtyZXR1cm4gUWEoeGEodCkudG9Mb3dlckNhc2UoKSl9ZnVuY3Rpb24gWWEodCl7cmV0dXJuKHQ9eGEodCkpJiZ0LnJlcGxhY2Uod3Qsc24pLnJlcGxhY2UobmUsIiIpfXZhciBYYT1raSgoZnVuY3Rpb24odCxlLG4pe3JldHVybiB0KyhuPyItIjoiIikrZS50b0xvd2VyQ2FzZSgpfSkpLFdhPWtpKChmdW5jdGlvbih0LGUsbil7cmV0dXJuIHQrKG4/IiAiOiIiKStlLnRvTG93ZXJDYXNlKCl9KSksSGE9QmkoInRvTG93ZXJDYXNlIik7dmFyIFphPWtpKChmdW5jdGlvbih0LGUsbil7cmV0dXJuIHQrKG4/Il8iOiIiKStlLnRvTG93ZXJDYXNlKCl9KSk7dmFyIEthPWtpKChmdW5jdGlvbih0LGUsbil7cmV0dXJuIHQrKG4/IiAiOiIiKStRYShlKX0pKTt2YXIgSmE9a2koKGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdCsobj8iICI6IiIpK2UudG9VcHBlckNhc2UoKX0pKSxRYT1CaSgidG9VcHBlckNhc2UiKTtmdW5jdGlvbiAkYSh0LGUscil7cmV0dXJuIHQ9eGEodCksKGU9cj9uOmUpPT09bj9mdW5jdGlvbih0KXtyZXR1cm4gc2UudGVzdCh0KX0odCk/ZnVuY3Rpb24odCl7cmV0dXJuIHQubWF0Y2goaWUpfHxbXX0odCk6ZnVuY3Rpb24odCl7cmV0dXJuIHQubWF0Y2goaHQpfHxbXX0odCk6dC5tYXRjaChlKXx8W119dmFyIHR1PVFyKChmdW5jdGlvbih0LGUpe3RyeXtyZXR1cm4gTmUodCxuLGUpfWNhdGNoKHQpe3JldHVybiBRcyh0KT90Om5ldyBTdCh0KX19KSksZXU9aW8oKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIE1lKGUsKGZ1bmN0aW9uKGUpe2U9em8oZSksYXIodCxlLEZzKHRbZV0sdCkpfSkpLHR9KSk7ZnVuY3Rpb24gbnUodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fXZhciBydT1VaSgpLGl1PVVpKCEwKTtmdW5jdGlvbiBvdSh0KXtyZXR1cm4gdH1mdW5jdGlvbiBzdSh0KXtyZXR1cm4gQnIoImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpscih0LDEpKX12YXIgYXU9UXIoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBUcihuLHQsZSl9fSkpLHV1PVFyKChmdW5jdGlvbih0LGUpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gVHIodCxuLGUpfX0pKTtmdW5jdGlvbiBjdSh0LGUsbil7dmFyIHI9T2EoZSksaT1FcihlLHIpO251bGw9PW4mJighbmEoZSl8fCFpLmxlbmd0aCYmci5sZW5ndGgpJiYobj1lLGU9dCx0PXRoaXMsaT1FcihlLE9hKGUpKSk7dmFyIG89IShuYShuKSYmImNoYWluImluIG4mJiFuLmNoYWluKSxzPSRzKHQpO3JldHVybiBNZShpLChmdW5jdGlvbihuKXt2YXIgcj1lW25dO3Rbbl09cixzJiYodC5wcm90b3R5cGVbbl09ZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9fY2hhaW5fXztpZihvfHxlKXt2YXIgbj10KHRoaXMuX193cmFwcGVkX18pO3JldHVybihuLl9fYWN0aW9uc19fPUZpKHRoaXMuX19hY3Rpb25zX18pKS5wdXNoKHtmdW5jOnIsYXJnczphcmd1bWVudHMsdGhpc0FyZzp0fSksbi5fX2NoYWluX189ZSxufXJldHVybiByLmFwcGx5KHQsQmUoW3RoaXMudmFsdWUoKV0sYXJndW1lbnRzKSl9KX0pKSx0fWZ1bmN0aW9uIGx1KCl7fXZhciBodT1ZaShSZSksZnU9WWkoVGUpLHB1PVlpKGplKTtmdW5jdGlvbiBkdSh0KXtyZXR1cm4gRG8odCk/SGUoem8odCkpOmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gQ3IoZSx0KX19KHQpfXZhciBndT1XaSgpLHl1PVdpKCEwKTtmdW5jdGlvbiBtdSgpe3JldHVybltdfWZ1bmN0aW9uIHZ1KCl7cmV0dXJuITF9dmFyIF91PUdpKChmdW5jdGlvbih0LGUpe3JldHVybiB0K2V9KSwwKSx4dT1LaSgiY2VpbCIpLHd1PUdpKChmdW5jdGlvbih0LGUpe3JldHVybiB0L2V9KSwxKSxidT1LaSgiZmxvb3IiKTt2YXIgRHU9R2koKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQqZX0pLDEpLEV1PUtpKCJyb3VuZCIpLEN1PUdpKChmdW5jdGlvbih0LGUpe3JldHVybiB0LWV9KSwwKTtyZXR1cm4gcW4uYWZ0ZXI9ZnVuY3Rpb24odCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgVHQocik7cmV0dXJuIHQ9eWEodCksZnVuY3Rpb24oKXtpZigtLXQ8MSlyZXR1cm4gZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fSxxbi5hcnk9SXMscW4uYXNzaWduPXdhLHFuLmFzc2lnbkluPWJhLHFuLmFzc2lnbkluV2l0aD1EYSxxbi5hc3NpZ25XaXRoPUVhLHFuLmF0PUNhLHFuLmJlZm9yZT1Ncyxxbi5iaW5kPUZzLHFuLmJpbmRBbGw9ZXUscW4uYmluZEtleT1Ucyxxbi5jYXN0QXJyYXk9ZnVuY3Rpb24oKXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm5bXTt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIFhzKHQpP3Q6W3RdfSxxbi5jaGFpbj1kcyxxbi5jaHVuaz1mdW5jdGlvbih0LGUscil7ZT0ocj9ibyh0LGUscik6ZT09PW4pPzE6eG4oeWEoZSksMCk7dmFyIGk9bnVsbD09dD8wOnQubGVuZ3RoO2lmKCFpfHxlPDEpcmV0dXJuW107Zm9yKHZhciBvPTAscz0wLGE9RXQobWUoaS9lKSk7bzxpOylhW3MrK109b2kodCxvLG8rPWUpO3JldHVybiBhfSxxbi5jb21wYWN0PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0tMSxuPW51bGw9PXQ/MDp0Lmxlbmd0aCxyPTAsaT1bXTsrK2U8bjspe3ZhciBvPXRbZV07byYmKGlbcisrXT1vKX1yZXR1cm4gaX0scW4uY29uY2F0PWZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aDtpZighdClyZXR1cm5bXTtmb3IodmFyIGU9RXQodC0xKSxuPWFyZ3VtZW50c1swXSxyPXQ7ci0tOyllW3ItMV09YXJndW1lbnRzW3JdO3JldHVybiBCZShYcyhuKT9GaShuKTpbbl0sX3IoZSwxKSl9LHFuLmNvbmQ9ZnVuY3Rpb24odCl7dmFyIGU9bnVsbD09dD8wOnQubGVuZ3RoLG49bG8oKTtyZXR1cm4gdD1lP1JlKHQsKGZ1bmN0aW9uKHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0WzFdKXRocm93IG5ldyBUdChyKTtyZXR1cm5bbih0WzBdKSx0WzFdXX0pKTpbXSxRcigoZnVuY3Rpb24obil7Zm9yKHZhciByPS0xOysrcjxlOyl7dmFyIGk9dFtyXTtpZihOZShpWzBdLHRoaXMsbikpcmV0dXJuIE5lKGlbMV0sdGhpcyxuKX19KSl9LHFuLmNvbmZvcm1zPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbih0KXt2YXIgZT1PYSh0KTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIGhyKG4sdCxlKX19KGxyKHQsMSkpfSxxbi5jb25zdGFudD1udSxxbi5jb3VudEJ5PW1zLHFuLmNyZWF0ZT1mdW5jdGlvbih0LGUpe3ZhciBuPVZuKHQpO3JldHVybiBudWxsPT1lP246c3IobixlKX0scW4uY3Vycnk9ZnVuY3Rpb24gdChlLHIsaSl7dmFyIG89JGkoZSw4LG4sbixuLG4sbixyPWk/bjpyKTtyZXR1cm4gby5wbGFjZWhvbGRlcj10LnBsYWNlaG9sZGVyLG99LHFuLmN1cnJ5UmlnaHQ9ZnVuY3Rpb24gdChlLHIsaSl7dmFyIG89JGkoZSxzLG4sbixuLG4sbixyPWk/bjpyKTtyZXR1cm4gby5wbGFjZWhvbGRlcj10LnBsYWNlaG9sZGVyLG99LHFuLmRlYm91bmNlPU9zLHFuLmRlZmF1bHRzPVNhLHFuLmRlZmF1bHRzRGVlcD1BYSxxbi5kZWZlcj1Mcyxxbi5kZWxheT1Qcyxxbi5kaWZmZXJlbmNlPXFvLHFuLmRpZmZlcmVuY2VCeT1Wbyxxbi5kaWZmZXJlbmNlV2l0aD1Hbyxxbi5kcm9wPWZ1bmN0aW9uKHQsZSxyKXt2YXIgaT1udWxsPT10PzA6dC5sZW5ndGg7cmV0dXJuIGk/b2kodCwoZT1yfHxlPT09bj8xOnlhKGUpKTwwPzA6ZSxpKTpbXX0scW4uZHJvcFJpZ2h0PWZ1bmN0aW9uKHQsZSxyKXt2YXIgaT1udWxsPT10PzA6dC5sZW5ndGg7cmV0dXJuIGk/b2kodCwwLChlPWktKGU9cnx8ZT09PW4/MTp5YShlKSkpPDA/MDplKTpbXX0scW4uZHJvcFJpZ2h0V2hpbGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdCYmdC5sZW5ndGg/Z2kodCxsbyhlLDMpLCEwLCEwKTpbXX0scW4uZHJvcFdoaWxlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQmJnQubGVuZ3RoP2dpKHQsbG8oZSwzKSwhMCk6W119LHFuLmZpbGw9ZnVuY3Rpb24odCxlLHIsaSl7dmFyIG89bnVsbD09dD8wOnQubGVuZ3RoO3JldHVybiBvPyhyJiYibnVtYmVyIiE9dHlwZW9mIHImJmJvKHQsZSxyKSYmKHI9MCxpPW8pLGZ1bmN0aW9uKHQsZSxyLGkpe3ZhciBvPXQubGVuZ3RoO2Zvcigocj15YShyKSk8MCYmKHI9LXI+bz8wOm8rciksKGk9aT09PW58fGk+bz9vOnlhKGkpKTwwJiYoaSs9byksaT1yPmk/MDptYShpKTtyPGk7KXRbcisrXT1lO3JldHVybiB0fSh0LGUscixpKSk6W119LHFuLmZpbHRlcj1mdW5jdGlvbih0LGUpe3JldHVybihYcyh0KT9PZTp2cikodCxsbyhlLDMpKX0scW4uZmxhdE1hcD1mdW5jdGlvbih0LGUpe3JldHVybiBfcihDcyh0LGUpLDEpfSxxbi5mbGF0TWFwRGVlcD1mdW5jdGlvbih0LGUpe3JldHVybiBfcihDcyh0LGUpLGgpfSxxbi5mbGF0TWFwRGVwdGg9ZnVuY3Rpb24odCxlLHIpe3JldHVybiByPXI9PT1uPzE6eWEociksX3IoQ3ModCxlKSxyKX0scW4uZmxhdHRlbj1Xbyxxbi5mbGF0dGVuRGVlcD1mdW5jdGlvbih0KXtyZXR1cm4obnVsbD09dD8wOnQubGVuZ3RoKT9fcih0LGgpOltdfSxxbi5mbGF0dGVuRGVwdGg9ZnVuY3Rpb24odCxlKXtyZXR1cm4obnVsbD09dD8wOnQubGVuZ3RoKT9fcih0LGU9ZT09PW4/MTp5YShlKSk6W119LHFuLmZsaXA9ZnVuY3Rpb24odCl7cmV0dXJuICRpKHQsNTEyKX0scW4uZmxvdz1ydSxxbi5mbG93UmlnaHQ9aXUscW4uZnJvbVBhaXJzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0tMSxuPW51bGw9PXQ/MDp0Lmxlbmd0aCxyPXt9OysrZTxuOyl7dmFyIGk9dFtlXTtyW2lbMF1dPWlbMV19cmV0dXJuIHJ9LHFuLmZ1bmN0aW9ucz1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD9bXTpFcih0LE9hKHQpKX0scW4uZnVuY3Rpb25zSW49ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/W106RXIodCxMYSh0KSl9LHFuLmdyb3VwQnk9YnMscW4uaW5pdGlhbD1mdW5jdGlvbih0KXtyZXR1cm4obnVsbD09dD8wOnQubGVuZ3RoKT9vaSh0LDAsLTEpOltdfSxxbi5pbnRlcnNlY3Rpb249Wm8scW4uaW50ZXJzZWN0aW9uQnk9S28scW4uaW50ZXJzZWN0aW9uV2l0aD1Kbyxxbi5pbnZlcnQ9TWEscW4uaW52ZXJ0Qnk9RmEscW4uaW52b2tlTWFwPURzLHFuLml0ZXJhdGVlPXN1LHFuLmtleUJ5PUVzLHFuLmtleXM9T2EscW4ua2V5c0luPUxhLHFuLm1hcD1Dcyxxbi5tYXBLZXlzPWZ1bmN0aW9uKHQsZSl7dmFyIG49e307cmV0dXJuIGU9bG8oZSwzKSxicih0LChmdW5jdGlvbih0LHIsaSl7YXIobixlKHQscixpKSx0KX0pKSxufSxxbi5tYXBWYWx1ZXM9ZnVuY3Rpb24odCxlKXt2YXIgbj17fTtyZXR1cm4gZT1sbyhlLDMpLGJyKHQsKGZ1bmN0aW9uKHQscixpKXthcihuLHIsZSh0LHIsaSkpfSkpLG59LHFuLm1hdGNoZXM9ZnVuY3Rpb24odCl7cmV0dXJuIHFyKGxyKHQsMSkpfSxxbi5tYXRjaGVzUHJvcGVydHk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gVnIodCxscihlLDEpKX0scW4ubWVtb2l6ZT1Scyxxbi5tZXJnZT1QYSxxbi5tZXJnZVdpdGg9UmEscW4ubWV0aG9kPWF1LHFuLm1ldGhvZE9mPXV1LHFuLm1peGluPWN1LHFuLm5lZ2F0ZT1Ccyxxbi5udGhBcmc9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9eWEodCksUXIoKGZ1bmN0aW9uKGUpe3JldHVybiBZcihlLHQpfSkpfSxxbi5vbWl0PUJhLHFuLm9taXRCeT1mdW5jdGlvbih0LGUpe3JldHVybiB6YSh0LEJzKGxvKGUpKSl9LHFuLm9uY2U9ZnVuY3Rpb24odCl7cmV0dXJuIE1zKDIsdCl9LHFuLm9yZGVyQnk9ZnVuY3Rpb24odCxlLHIsaSl7cmV0dXJuIG51bGw9PXQ/W106KFhzKGUpfHwoZT1udWxsPT1lP1tdOltlXSksWHMocj1pP246cil8fChyPW51bGw9PXI/W106W3JdKSxYcih0LGUscikpfSxxbi5vdmVyPWh1LHFuLm92ZXJBcmdzPWtzLHFuLm92ZXJFdmVyeT1mdSxxbi5vdmVyU29tZT1wdSxxbi5wYXJ0aWFsPXpzLHFuLnBhcnRpYWxSaWdodD1qcyxxbi5wYXJ0aXRpb249U3MscW4ucGljaz1rYSxxbi5waWNrQnk9emEscW4ucHJvcGVydHk9ZHUscW4ucHJvcGVydHlPZj1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PXQ/bjpDcih0LGUpfX0scW4ucHVsbD0kbyxxbi5wdWxsQWxsPXRzLHFuLnB1bGxBbGxCeT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQmJnQubGVuZ3RoJiZlJiZlLmxlbmd0aD9Icih0LGUsbG8obiwyKSk6dH0scW4ucHVsbEFsbFdpdGg9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0JiZ0Lmxlbmd0aCYmZSYmZS5sZW5ndGg/SHIodCxlLG4scik6dH0scW4ucHVsbEF0PWVzLHFuLnJhbmdlPWd1LHFuLnJhbmdlUmlnaHQ9eXUscW4ucmVhcmc9VXMscW4ucmVqZWN0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuKFhzKHQpP09lOnZyKSh0LEJzKGxvKGUsMykpKX0scW4ucmVtb3ZlPWZ1bmN0aW9uKHQsZSl7dmFyIG49W107aWYoIXR8fCF0Lmxlbmd0aClyZXR1cm4gbjt2YXIgcj0tMSxpPVtdLG89dC5sZW5ndGg7Zm9yKGU9bG8oZSwzKTsrK3I8bzspe3ZhciBzPXRbcl07ZShzLHIsdCkmJihuLnB1c2gocyksaS5wdXNoKHIpKX1yZXR1cm4gWnIodCxpKSxufSxxbi5yZXN0PWZ1bmN0aW9uKHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR0KHIpO3JldHVybiBRcih0LGU9ZT09PW4/ZTp5YShlKSl9LHFuLnJldmVyc2U9bnMscW4uc2FtcGxlU2l6ZT1mdW5jdGlvbih0LGUscil7cmV0dXJuIGU9KHI/Ym8odCxlLHIpOmU9PT1uKT8xOnlhKGUpLChYcyh0KT90cjp0aSkodCxlKX0scW4uc2V0PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gbnVsbD09dD90OmVpKHQsZSxuKX0scW4uc2V0V2l0aD1mdW5jdGlvbih0LGUscixpKXtyZXR1cm4gaT0iZnVuY3Rpb24iPT10eXBlb2YgaT9pOm4sbnVsbD09dD90OmVpKHQsZSxyLGkpfSxxbi5zaHVmZmxlPWZ1bmN0aW9uKHQpe3JldHVybihYcyh0KT9lcjppaSkodCl9LHFuLnNsaWNlPWZ1bmN0aW9uKHQsZSxyKXt2YXIgaT1udWxsPT10PzA6dC5sZW5ndGg7cmV0dXJuIGk/KHImJiJudW1iZXIiIT10eXBlb2YgciYmYm8odCxlLHIpPyhlPTAscj1pKTooZT1udWxsPT1lPzA6eWEoZSkscj1yPT09bj9pOnlhKHIpKSxvaSh0LGUscikpOltdfSxxbi5zb3J0Qnk9QXMscW4uc29ydGVkVW5pcT1mdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5sZW5ndGg/Y2kodCk6W119LHFuLnNvcnRlZFVuaXFCeT1mdW5jdGlvbih0LGUpe3JldHVybiB0JiZ0Lmxlbmd0aD9jaSh0LGxvKGUsMikpOltdfSxxbi5zcGxpdD1mdW5jdGlvbih0LGUscil7cmV0dXJuIHImJiJudW1iZXIiIT10eXBlb2YgciYmYm8odCxlLHIpJiYoZT1yPW4pLChyPXI9PT1uP2Q6cj4+PjApPyh0PXhhKHQpKSYmKCJzdHJpbmciPT10eXBlb2YgZXx8bnVsbCE9ZSYmIWFhKGUpKSYmKCEoZT1oaShlKSkmJmNuKHQpKT9EaShnbih0KSwwLHIpOnQuc3BsaXQoZSxyKTpbXX0scW4uc3ByZWFkPWZ1bmN0aW9uKHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR0KHIpO3JldHVybiBlPW51bGw9PWU/MDp4bih5YShlKSwwKSxRcigoZnVuY3Rpb24obil7dmFyIHI9bltlXSxpPURpKG4sMCxlKTtyZXR1cm4gciYmQmUoaSxyKSxOZSh0LHRoaXMsaSl9KSl9LHFuLnRhaWw9ZnVuY3Rpb24odCl7dmFyIGU9bnVsbD09dD8wOnQubGVuZ3RoO3JldHVybiBlP29pKHQsMSxlKTpbXX0scW4udGFrZT1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQmJnQubGVuZ3RoP29pKHQsMCwoZT1yfHxlPT09bj8xOnlhKGUpKTwwPzA6ZSk6W119LHFuLnRha2VSaWdodD1mdW5jdGlvbih0LGUscil7dmFyIGk9bnVsbD09dD8wOnQubGVuZ3RoO3JldHVybiBpP29pKHQsKGU9aS0oZT1yfHxlPT09bj8xOnlhKGUpKSk8MD8wOmUsaSk6W119LHFuLnRha2VSaWdodFdoaWxlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQmJnQubGVuZ3RoP2dpKHQsbG8oZSwzKSwhMSwhMCk6W119LHFuLnRha2VXaGlsZT1mdW5jdGlvbih0LGUpe3JldHVybiB0JiZ0Lmxlbmd0aD9naSh0LGxvKGUsMykpOltdfSxxbi50YXA9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZSh0KSx0fSxxbi50aHJvdHRsZT1mdW5jdGlvbih0LGUsbil7dmFyIGk9ITAsbz0hMDtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgVHQocik7cmV0dXJuIG5hKG4pJiYoaT0ibGVhZGluZyJpbiBuPyEhbi5sZWFkaW5nOmksbz0idHJhaWxpbmciaW4gbj8hIW4udHJhaWxpbmc6byksT3ModCxlLHtsZWFkaW5nOmksbWF4V2FpdDplLHRyYWlsaW5nOm99KX0scW4udGhydT1ncyxxbi50b0FycmF5PWRhLHFuLnRvUGFpcnM9amEscW4udG9QYWlyc0luPVVhLHFuLnRvUGF0aD1mdW5jdGlvbih0KXtyZXR1cm4gWHModCk/UmUodCx6byk6bGEodCk/W3RdOkZpKGtvKHhhKHQpKSl9LHFuLnRvUGxhaW5PYmplY3Q9X2EscW4udHJhbnNmb3JtPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1Ycyh0KSxpPXJ8fEtzKHQpfHxoYSh0KTtpZihlPWxvKGUsNCksbnVsbD09bil7dmFyIG89dCYmdC5jb25zdHJ1Y3RvcjtuPWk/cj9uZXcgbzpbXTpuYSh0KSYmJHMobyk/Vm4oWnQodCkpOnt9fXJldHVybihpP01lOmJyKSh0LChmdW5jdGlvbih0LHIsaSl7cmV0dXJuIGUobix0LHIsaSl9KSksbn0scW4udW5hcnk9ZnVuY3Rpb24odCl7cmV0dXJuIElzKHQsMSl9LHFuLnVuaW9uPXJzLHFuLnVuaW9uQnk9aXMscW4udW5pb25XaXRoPW9zLHFuLnVuaXE9ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQubGVuZ3RoP2ZpKHQpOltdfSxxbi51bmlxQnk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdCYmdC5sZW5ndGg/ZmkodCxsbyhlLDIpKTpbXX0scW4udW5pcVdpdGg9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZT0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOm4sdCYmdC5sZW5ndGg/ZmkodCxuLGUpOltdfSxxbi51bnNldD1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT10fHxwaSh0LGUpfSxxbi51bnppcD1zcyxxbi51bnppcFdpdGg9YXMscW4udXBkYXRlPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gbnVsbD09dD90OmRpKHQsZSx4aShuKSl9LHFuLnVwZGF0ZVdpdGg9ZnVuY3Rpb24odCxlLHIsaSl7cmV0dXJuIGk9ImZ1bmN0aW9uIj09dHlwZW9mIGk/aTpuLG51bGw9PXQ/dDpkaSh0LGUseGkociksaSl9LHFuLnZhbHVlcz1xYSxxbi52YWx1ZXNJbj1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD9bXTplbih0LExhKHQpKX0scW4ud2l0aG91dD11cyxxbi53b3Jkcz0kYSxxbi53cmFwPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHpzKHhpKGUpLHQpfSxxbi54b3I9Y3MscW4ueG9yQnk9bHMscW4ueG9yV2l0aD1ocyxxbi56aXA9ZnMscW4uemlwT2JqZWN0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHZpKHR8fFtdLGV8fFtdLHJyKX0scW4uemlwT2JqZWN0RGVlcD1mdW5jdGlvbih0LGUpe3JldHVybiB2aSh0fHxbXSxlfHxbXSxlaSl9LHFuLnppcFdpdGg9cHMscW4uZW50cmllcz1qYSxxbi5lbnRyaWVzSW49VWEscW4uZXh0ZW5kPWJhLHFuLmV4dGVuZFdpdGg9RGEsY3UocW4scW4pLHFuLmFkZD1fdSxxbi5hdHRlbXB0PXR1LHFuLmNhbWVsQ2FzZT1WYSxxbi5jYXBpdGFsaXplPUdhLHFuLmNlaWw9eHUscW4uY2xhbXA9ZnVuY3Rpb24odCxlLHIpe3JldHVybiByPT09biYmKHI9ZSxlPW4pLHIhPT1uJiYocj0ocj12YShyKSk9PXI/cjowKSxlIT09biYmKGU9KGU9dmEoZSkpPT1lP2U6MCksY3IodmEodCksZSxyKX0scW4uY2xvbmU9ZnVuY3Rpb24odCl7cmV0dXJuIGxyKHQsNCl9LHFuLmNsb25lRGVlcD1mdW5jdGlvbih0KXtyZXR1cm4gbHIodCw1KX0scW4uY2xvbmVEZWVwV2l0aD1mdW5jdGlvbih0LGUpe3JldHVybiBscih0LDUsZT0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOm4pfSxxbi5jbG9uZVdpdGg9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbHIodCw0LGU9ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpuKX0scW4uY29uZm9ybXNUbz1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT1lfHxocih0LGUsT2EoZSkpfSxxbi5kZWJ1cnI9WWEscW4uZGVmYXVsdFRvPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGw9PXR8fHQhPXQ/ZTp0fSxxbi5kaXZpZGU9d3UscW4uZW5kc1dpdGg9ZnVuY3Rpb24odCxlLHIpe3Q9eGEodCksZT1oaShlKTt2YXIgaT10Lmxlbmd0aCxvPXI9cj09PW4/aTpjcih5YShyKSwwLGkpO3JldHVybihyLT1lLmxlbmd0aCk+PTAmJnQuc2xpY2UocixvKT09ZX0scW4uZXE9cXMscW4uZXNjYXBlPWZ1bmN0aW9uKHQpe3JldHVybih0PXhhKHQpKSYmSi50ZXN0KHQpP3QucmVwbGFjZShaLGFuKTp0fSxxbi5lc2NhcGVSZWdFeHA9ZnVuY3Rpb24odCl7cmV0dXJuKHQ9eGEodCkpJiZvdC50ZXN0KHQpP3QucmVwbGFjZShpdCwiXFwkJiIpOnR9LHFuLmV2ZXJ5PWZ1bmN0aW9uKHQsZSxyKXt2YXIgaT1Ycyh0KT9UZTp5cjtyZXR1cm4gciYmYm8odCxlLHIpJiYoZT1uKSxpKHQsbG8oZSwzKSl9LHFuLmZpbmQ9dnMscW4uZmluZEluZGV4PVlvLHFuLmZpbmRLZXk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gcWUodCxsbyhlLDMpLGJyKX0scW4uZmluZExhc3Q9X3MscW4uZmluZExhc3RJbmRleD1Ybyxxbi5maW5kTGFzdEtleT1mdW5jdGlvbih0LGUpe3JldHVybiBxZSh0LGxvKGUsMyksRHIpfSxxbi5mbG9vcj1idSxxbi5mb3JFYWNoPXhzLHFuLmZvckVhY2hSaWdodD13cyxxbi5mb3JJbj1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT10P3Q6eHIodCxsbyhlLDMpLExhKX0scW4uZm9ySW5SaWdodD1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT10P3Q6d3IodCxsbyhlLDMpLExhKX0scW4uZm9yT3duPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQmJmJyKHQsbG8oZSwzKSl9LHFuLmZvck93blJpZ2h0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQmJkRyKHQsbG8oZSwzKSl9LHFuLmdldD1OYSxxbi5ndD1Wcyxxbi5ndGU9R3MscW4uaGFzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGwhPXQmJnZvKHQsZSxJcil9LHFuLmhhc0luPUlhLHFuLmhlYWQ9SG8scW4uaWRlbnRpdHk9b3UscW4uaW5jbHVkZXM9ZnVuY3Rpb24odCxlLG4scil7dD1Icyh0KT90OnFhKHQpLG49biYmIXI/eWEobik6MDt2YXIgaT10Lmxlbmd0aDtyZXR1cm4gbjwwJiYobj14bihpK24sMCkpLGNhKHQpP248PWkmJnQuaW5kZXhPZihlLG4pPi0xOiEhaSYmR2UodCxlLG4pPi0xfSxxbi5pbmRleE9mPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1udWxsPT10PzA6dC5sZW5ndGg7aWYoIXIpcmV0dXJuLTE7dmFyIGk9bnVsbD09bj8wOnlhKG4pO3JldHVybiBpPDAmJihpPXhuKHIraSwwKSksR2UodCxlLGkpfSxxbi5pblJhbmdlPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gZT1nYShlKSxyPT09bj8ocj1lLGU9MCk6cj1nYShyKSxmdW5jdGlvbih0LGUsbil7cmV0dXJuIHQ+PXduKGUsbikmJnQ8eG4oZSxuKX0odD12YSh0KSxlLHIpfSxxbi5pbnZva2U9VGEscW4uaXNBcmd1bWVudHM9WXMscW4uaXNBcnJheT1Ycyxxbi5pc0FycmF5QnVmZmVyPVdzLHFuLmlzQXJyYXlMaWtlPUhzLHFuLmlzQXJyYXlMaWtlT2JqZWN0PVpzLHFuLmlzQm9vbGVhbj1mdW5jdGlvbih0KXtyZXR1cm4hMD09PXR8fCExPT09dHx8cmEodCkmJkFyKHQpPT14fSxxbi5pc0J1ZmZlcj1Lcyxxbi5pc0RhdGU9SnMscW4uaXNFbGVtZW50PWZ1bmN0aW9uKHQpe3JldHVybiByYSh0KSYmMT09PXQubm9kZVR5cGUmJiFzYSh0KX0scW4uaXNFbXB0eT1mdW5jdGlvbih0KXtpZihudWxsPT10KXJldHVybiEwO2lmKEhzKHQpJiYoWHModCl8fCJzdHJpbmciPT10eXBlb2YgdHx8ImZ1bmN0aW9uIj09dHlwZW9mIHQuc3BsaWNlfHxLcyh0KXx8aGEodCl8fFlzKHQpKSlyZXR1cm4hdC5sZW5ndGg7dmFyIGU9bW8odCk7aWYoZT09Q3x8ZT09TSlyZXR1cm4hdC5zaXplO2lmKFNvKHQpKXJldHVybiFrcih0KS5sZW5ndGg7Zm9yKHZhciBuIGluIHQpaWYoa3QuY2FsbCh0LG4pKXJldHVybiExO3JldHVybiEwfSxxbi5pc0VxdWFsPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIExyKHQsZSl9LHFuLmlzRXF1YWxXaXRoPWZ1bmN0aW9uKHQsZSxyKXt2YXIgaT0ocj0iZnVuY3Rpb24iPT10eXBlb2Ygcj9yOm4pP3IodCxlKTpuO3JldHVybiBpPT09bj9Mcih0LGUsbixyKTohIWl9LHFuLmlzRXJyb3I9UXMscW4uaXNGaW5pdGU9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0JiZVZSh0KX0scW4uaXNGdW5jdGlvbj0kcyxxbi5pc0ludGVnZXI9dGEscW4uaXNMZW5ndGg9ZWEscW4uaXNNYXA9aWEscW4uaXNNYXRjaD1mdW5jdGlvbih0LGUpe3JldHVybiB0PT09ZXx8UHIodCxlLGZvKGUpKX0scW4uaXNNYXRjaFdpdGg9ZnVuY3Rpb24odCxlLHIpe3JldHVybiByPSJmdW5jdGlvbiI9PXR5cGVvZiByP3I6bixQcih0LGUsZm8oZSkscil9LHFuLmlzTmFOPWZ1bmN0aW9uKHQpe3JldHVybiBvYSh0KSYmdCE9K3R9LHFuLmlzTmF0aXZlPWZ1bmN0aW9uKHQpe2lmKENvKHQpKXRocm93IG5ldyBTdCgiVW5zdXBwb3J0ZWQgY29yZS1qcyB1c2UuIFRyeSBodHRwczovL25wbXMuaW8vc2VhcmNoP3E9cG9ueWZpbGwuIik7cmV0dXJuIFJyKHQpfSxxbi5pc05pbD1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dH0scW4uaXNOdWxsPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT09dH0scW4uaXNOdW1iZXI9b2EscW4uaXNPYmplY3Q9bmEscW4uaXNPYmplY3RMaWtlPXJhLHFuLmlzUGxhaW5PYmplY3Q9c2EscW4uaXNSZWdFeHA9YWEscW4uaXNTYWZlSW50ZWdlcj1mdW5jdGlvbih0KXtyZXR1cm4gdGEodCkmJnQ+PS1mJiZ0PD1mfSxxbi5pc1NldD11YSxxbi5pc1N0cmluZz1jYSxxbi5pc1N5bWJvbD1sYSxxbi5pc1R5cGVkQXJyYXk9aGEscW4uaXNVbmRlZmluZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT1ufSxxbi5pc1dlYWtNYXA9ZnVuY3Rpb24odCl7cmV0dXJuIHJhKHQpJiZtbyh0KT09T30scW4uaXNXZWFrU2V0PWZ1bmN0aW9uKHQpe3JldHVybiByYSh0KSYmIltvYmplY3QgV2Vha1NldF0iPT1Bcih0KX0scW4uam9pbj1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT10PyIiOlplLmNhbGwodCxlKX0scW4ua2ViYWJDYXNlPVhhLHFuLmxhc3Q9UW8scW4ubGFzdEluZGV4T2Y9ZnVuY3Rpb24odCxlLHIpe3ZhciBpPW51bGw9PXQ/MDp0Lmxlbmd0aDtpZighaSlyZXR1cm4tMTt2YXIgbz1pO3JldHVybiByIT09biYmKG89KG89eWEocikpPDA/eG4oaStvLDApOnduKG8saS0xKSksZT09ZT9mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPW4rMTtyLS07KWlmKHRbcl09PT1lKXJldHVybiByO3JldHVybiByfSh0LGUsbyk6VmUodCxYZSxvLCEwKX0scW4ubG93ZXJDYXNlPVdhLHFuLmxvd2VyRmlyc3Q9SGEscW4ubHQ9ZmEscW4ubHRlPXBhLHFuLm1heD1mdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5sZW5ndGg/bXIodCxvdSxOcik6bn0scW4ubWF4Qnk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdCYmdC5sZW5ndGg/bXIodCxsbyhlLDIpLE5yKTpufSxxbi5tZWFuPWZ1bmN0aW9uKHQpe3JldHVybiBXZSh0LG91KX0scW4ubWVhbkJ5PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIFdlKHQsbG8oZSwyKSl9LHFuLm1pbj1mdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5sZW5ndGg/bXIodCxvdSxqcik6bn0scW4ubWluQnk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdCYmdC5sZW5ndGg/bXIodCxsbyhlLDIpLGpyKTpufSxxbi5zdHViQXJyYXk9bXUscW4uc3R1YkZhbHNlPXZ1LHFuLnN0dWJPYmplY3Q9ZnVuY3Rpb24oKXtyZXR1cm57fX0scW4uc3R1YlN0cmluZz1mdW5jdGlvbigpe3JldHVybiIifSxxbi5zdHViVHJ1ZT1mdW5jdGlvbigpe3JldHVybiEwfSxxbi5tdWx0aXBseT1EdSxxbi5udGg9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdCYmdC5sZW5ndGg/WXIodCx5YShlKSk6bn0scW4ubm9Db25mbGljdD1mdW5jdGlvbigpe3JldHVybiB5ZS5fPT09dGhpcyYmKHllLl89VnQpLHRoaXN9LHFuLm5vb3A9bHUscW4ubm93PU5zLHFuLnBhZD1mdW5jdGlvbih0LGUsbil7dD14YSh0KTt2YXIgcj0oZT15YShlKSk/ZG4odCk6MDtpZighZXx8cj49ZSlyZXR1cm4gdDt2YXIgaT0oZS1yKS8yO3JldHVybiBYaSh2ZShpKSxuKSt0K1hpKG1lKGkpLG4pfSxxbi5wYWRFbmQ9ZnVuY3Rpb24odCxlLG4pe3Q9eGEodCk7dmFyIHI9KGU9eWEoZSkpP2RuKHQpOjA7cmV0dXJuIGUmJnI8ZT90K1hpKGUtcixuKTp0fSxxbi5wYWRTdGFydD1mdW5jdGlvbih0LGUsbil7dD14YSh0KTt2YXIgcj0oZT15YShlKSk/ZG4odCk6MDtyZXR1cm4gZSYmcjxlP1hpKGUtcixuKSt0OnR9LHFuLnBhcnNlSW50PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gbnx8bnVsbD09ZT9lPTA6ZSYmKGU9K2UpLERuKHhhKHQpLnJlcGxhY2Uoc3QsIiIpLGV8fDApfSxxbi5yYW5kb209ZnVuY3Rpb24odCxlLHIpe2lmKHImJiJib29sZWFuIiE9dHlwZW9mIHImJmJvKHQsZSxyKSYmKGU9cj1uKSxyPT09biYmKCJib29sZWFuIj09dHlwZW9mIGU/KHI9ZSxlPW4pOiJib29sZWFuIj09dHlwZW9mIHQmJihyPXQsdD1uKSksdD09PW4mJmU9PT1uPyh0PTAsZT0xKToodD1nYSh0KSxlPT09bj8oZT10LHQ9MCk6ZT1nYShlKSksdD5lKXt2YXIgaT10O3Q9ZSxlPWl9aWYocnx8dCUxfHxlJTEpe3ZhciBvPUVuKCk7cmV0dXJuIHduKHQrbyooZS10K2ZlKCIxZS0iKygobysiIikubGVuZ3RoLTEpKSksZSl9cmV0dXJuIEtyKHQsZSl9LHFuLnJlZHVjZT1mdW5jdGlvbih0LGUsbil7dmFyIHI9WHModCk/a2U6S2UsaT1hcmd1bWVudHMubGVuZ3RoPDM7cmV0dXJuIHIodCxsbyhlLDQpLG4saSxkcil9LHFuLnJlZHVjZVJpZ2h0PWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1Ycyh0KT96ZTpLZSxpPWFyZ3VtZW50cy5sZW5ndGg8MztyZXR1cm4gcih0LGxvKGUsNCksbixpLGdyKX0scW4ucmVwZWF0PWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gZT0ocj9ibyh0LGUscik6ZT09PW4pPzE6eWEoZSksSnIoeGEodCksZSl9LHFuLnJlcGxhY2U9ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHMsZT14YSh0WzBdKTtyZXR1cm4gdC5sZW5ndGg8Mz9lOmUucmVwbGFjZSh0WzFdLHRbMl0pfSxxbi5yZXN1bHQ9ZnVuY3Rpb24odCxlLHIpe3ZhciBpPS0xLG89KGU9d2koZSx0KSkubGVuZ3RoO2ZvcihvfHwobz0xLHQ9bik7KytpPG87KXt2YXIgcz1udWxsPT10P246dFt6byhlW2ldKV07cz09PW4mJihpPW8scz1yKSx0PSRzKHMpP3MuY2FsbCh0KTpzfXJldHVybiB0fSxxbi5yb3VuZD1FdSxxbi5ydW5JbkNvbnRleHQ9dCxxbi5zYW1wbGU9ZnVuY3Rpb24odCl7cmV0dXJuKFhzKHQpPyRuOiRyKSh0KX0scW4uc2l6ZT1mdW5jdGlvbih0KXtpZihudWxsPT10KXJldHVybiAwO2lmKEhzKHQpKXJldHVybiBjYSh0KT9kbih0KTp0Lmxlbmd0aDt2YXIgZT1tbyh0KTtyZXR1cm4gZT09Q3x8ZT09TT90LnNpemU6a3IodCkubGVuZ3RofSxxbi5zbmFrZUNhc2U9WmEscW4uc29tZT1mdW5jdGlvbih0LGUscil7dmFyIGk9WHModCk/amU6c2k7cmV0dXJuIHImJmJvKHQsZSxyKSYmKGU9biksaSh0LGxvKGUsMykpfSxxbi5zb3J0ZWRJbmRleD1mdW5jdGlvbih0LGUpe3JldHVybiBhaSh0LGUpfSxxbi5zb3J0ZWRJbmRleEJ5PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdWkodCxlLGxvKG4sMikpfSxxbi5zb3J0ZWRJbmRleE9mPWZ1bmN0aW9uKHQsZSl7dmFyIG49bnVsbD09dD8wOnQubGVuZ3RoO2lmKG4pe3ZhciByPWFpKHQsZSk7aWYocjxuJiZxcyh0W3JdLGUpKXJldHVybiByfXJldHVybi0xfSxxbi5zb3J0ZWRMYXN0SW5kZXg9ZnVuY3Rpb24odCxlKXtyZXR1cm4gYWkodCxlLCEwKX0scW4uc29ydGVkTGFzdEluZGV4Qnk9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB1aSh0LGUsbG8obiwyKSwhMCl9LHFuLnNvcnRlZExhc3RJbmRleE9mPWZ1bmN0aW9uKHQsZSl7aWYobnVsbD09dD8wOnQubGVuZ3RoKXt2YXIgbj1haSh0LGUsITApLTE7aWYocXModFtuXSxlKSlyZXR1cm4gbn1yZXR1cm4tMX0scW4uc3RhcnRDYXNlPUthLHFuLnN0YXJ0c1dpdGg9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0PXhhKHQpLG49bnVsbD09bj8wOmNyKHlhKG4pLDAsdC5sZW5ndGgpLGU9aGkoZSksdC5zbGljZShuLG4rZS5sZW5ndGgpPT1lfSxxbi5zdWJ0cmFjdD1DdSxxbi5zdW09ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQubGVuZ3RoP0plKHQsb3UpOjB9LHFuLnN1bUJ5PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQmJnQubGVuZ3RoP0plKHQsbG8oZSwyKSk6MH0scW4udGVtcGxhdGU9ZnVuY3Rpb24odCxlLHIpe3ZhciBpPXFuLnRlbXBsYXRlU2V0dGluZ3M7ciYmYm8odCxlLHIpJiYoZT1uKSx0PXhhKHQpLGU9RGEoe30sZSxpLHRvKTt2YXIgbyxzLGE9RGEoe30sZS5pbXBvcnRzLGkuaW1wb3J0cyx0byksdT1PYShhKSxjPWVuKGEsdSksbD0wLGg9ZS5pbnRlcnBvbGF0ZXx8YnQsZj0iX19wICs9ICciLHA9TXQoKGUuZXNjYXBlfHxidCkuc291cmNlKyJ8IitoLnNvdXJjZSsifCIrKGg9PT10dD9kdDpidCkuc291cmNlKyJ8IisoZS5ldmFsdWF0ZXx8YnQpLnNvdXJjZSsifCQiLCJnIiksZD0iLy8jIHNvdXJjZVVSTD0iKyhrdC5jYWxsKGUsInNvdXJjZVVSTCIpPyhlLnNvdXJjZVVSTCsiIikucmVwbGFjZSgvXHMvZywiICIpOiJsb2Rhc2gudGVtcGxhdGVTb3VyY2VzWyIrICsrdWUrIl0iKSsiXG4iO3QucmVwbGFjZShwLChmdW5jdGlvbihlLG4scixpLGEsdSl7cmV0dXJuIHJ8fChyPWkpLGYrPXQuc2xpY2UobCx1KS5yZXBsYWNlKER0LHVuKSxuJiYobz0hMCxmKz0iJyArXG5fX2UoIituKyIpICtcbiciKSxhJiYocz0hMCxmKz0iJztcbiIrYSsiO1xuX19wICs9ICciKSxyJiYoZis9IicgK1xuKChfX3QgPSAoIityKyIpKSA9PSBudWxsID8gJycgOiBfX3QpICtcbiciKSxsPXUrZS5sZW5ndGgsZX0pKSxmKz0iJztcbiI7dmFyIGc9a3QuY2FsbChlLCJ2YXJpYWJsZSIpJiZlLnZhcmlhYmxlO2lmKGcpe2lmKGZ0LnRlc3QoZykpdGhyb3cgbmV3IFN0KCJJbnZhbGlkIGB2YXJpYWJsZWAgb3B0aW9uIHBhc3NlZCBpbnRvIGBfLnRlbXBsYXRlYCIpfWVsc2UgZj0id2l0aCAob2JqKSB7XG4iK2YrIlxufVxuIjtmPShzP2YucmVwbGFjZShZLCIiKTpmKS5yZXBsYWNlKFgsIiQxIikucmVwbGFjZShXLCIkMTsiKSxmPSJmdW5jdGlvbigiKyhnfHwib2JqIikrIikge1xuIisoZz8iIjoib2JqIHx8IChvYmogPSB7fSk7XG4iKSsidmFyIF9fdCwgX19wID0gJyciKyhvPyIsIF9fZSA9IF8uZXNjYXBlIjoiIikrKHM/IiwgX19qID0gQXJyYXkucHJvdG90eXBlLmpvaW47XG5mdW5jdGlvbiBwcmludCgpIHsgX19wICs9IF9fai5jYWxsKGFyZ3VtZW50cywgJycpIH1cbiI6IjtcbiIpK2YrInJldHVybiBfX3Bcbn0iO3ZhciB5PXR1KChmdW5jdGlvbigpe3JldHVybiBBdCh1LGQrInJldHVybiAiK2YpLmFwcGx5KG4sYyl9KSk7aWYoeS5zb3VyY2U9ZixRcyh5KSl0aHJvdyB5O3JldHVybiB5fSxxbi50aW1lcz1mdW5jdGlvbih0LGUpe2lmKCh0PXlhKHQpKTwxfHx0PmYpcmV0dXJuW107dmFyIG49ZCxyPXduKHQsZCk7ZT1sbyhlKSx0LT1kO2Zvcih2YXIgaT1RZShyLGUpOysrbjx0OyllKG4pO3JldHVybiBpfSxxbi50b0Zpbml0ZT1nYSxxbi50b0ludGVnZXI9eWEscW4udG9MZW5ndGg9bWEscW4udG9Mb3dlcj1mdW5jdGlvbih0KXtyZXR1cm4geGEodCkudG9Mb3dlckNhc2UoKX0scW4udG9OdW1iZXI9dmEscW4udG9TYWZlSW50ZWdlcj1mdW5jdGlvbih0KXtyZXR1cm4gdD9jcih5YSh0KSwtZixmKTowPT09dD90OjB9LHFuLnRvU3RyaW5nPXhhLHFuLnRvVXBwZXI9ZnVuY3Rpb24odCl7cmV0dXJuIHhhKHQpLnRvVXBwZXJDYXNlKCl9LHFuLnRyaW09ZnVuY3Rpb24odCxlLHIpe2lmKCh0PXhhKHQpKSYmKHJ8fGU9PT1uKSlyZXR1cm4gJGUodCk7aWYoIXR8fCEoZT1oaShlKSkpcmV0dXJuIHQ7dmFyIGk9Z24odCksbz1nbihlKTtyZXR1cm4gRGkoaSxybihpLG8pLG9uKGksbykrMSkuam9pbigiIil9LHFuLnRyaW1FbmQ9ZnVuY3Rpb24odCxlLHIpe2lmKCh0PXhhKHQpKSYmKHJ8fGU9PT1uKSlyZXR1cm4gdC5zbGljZSgwLHluKHQpKzEpO2lmKCF0fHwhKGU9aGkoZSkpKXJldHVybiB0O3ZhciBpPWduKHQpO3JldHVybiBEaShpLDAsb24oaSxnbihlKSkrMSkuam9pbigiIil9LHFuLnRyaW1TdGFydD1mdW5jdGlvbih0LGUscil7aWYoKHQ9eGEodCkpJiYocnx8ZT09PW4pKXJldHVybiB0LnJlcGxhY2Uoc3QsIiIpO2lmKCF0fHwhKGU9aGkoZSkpKXJldHVybiB0O3ZhciBpPWduKHQpO3JldHVybiBEaShpLHJuKGksZ24oZSkpKS5qb2luKCIiKX0scW4udHJ1bmNhdGU9ZnVuY3Rpb24odCxlKXt2YXIgcj0zMCxpPSIuLi4iO2lmKG5hKGUpKXt2YXIgbz0ic2VwYXJhdG9yImluIGU/ZS5zZXBhcmF0b3I6bztyPSJsZW5ndGgiaW4gZT95YShlLmxlbmd0aCk6cixpPSJvbWlzc2lvbiJpbiBlP2hpKGUub21pc3Npb24pOml9dmFyIHM9KHQ9eGEodCkpLmxlbmd0aDtpZihjbih0KSl7dmFyIGE9Z24odCk7cz1hLmxlbmd0aH1pZihyPj1zKXJldHVybiB0O3ZhciB1PXItZG4oaSk7aWYodTwxKXJldHVybiBpO3ZhciBjPWE/RGkoYSwwLHUpLmpvaW4oIiIpOnQuc2xpY2UoMCx1KTtpZihvPT09bilyZXR1cm4gYytpO2lmKGEmJih1Kz1jLmxlbmd0aC11KSxhYShvKSl7aWYodC5zbGljZSh1KS5zZWFyY2gobykpe3ZhciBsLGg9Yztmb3Ioby5nbG9iYWx8fChvPU10KG8uc291cmNlLHhhKGd0LmV4ZWMobykpKyJnIikpLG8ubGFzdEluZGV4PTA7bD1vLmV4ZWMoaCk7KXZhciBmPWwuaW5kZXg7Yz1jLnNsaWNlKDAsZj09PW4/dTpmKX19ZWxzZSBpZih0LmluZGV4T2YoaGkobyksdSkhPXUpe3ZhciBwPWMubGFzdEluZGV4T2Yobyk7cD4tMSYmKGM9Yy5zbGljZSgwLHApKX1yZXR1cm4gYytpfSxxbi51bmVzY2FwZT1mdW5jdGlvbih0KXtyZXR1cm4odD14YSh0KSkmJksudGVzdCh0KT90LnJlcGxhY2UoSCxtbik6dH0scW4udW5pcXVlSWQ9ZnVuY3Rpb24odCl7dmFyIGU9Kyt6dDtyZXR1cm4geGEodCkrZX0scW4udXBwZXJDYXNlPUphLHFuLnVwcGVyRmlyc3Q9UWEscW4uZWFjaD14cyxxbi5lYWNoUmlnaHQ9d3MscW4uZmlyc3Q9SG8sY3UocW4sZnVuY3Rpb24oKXt2YXIgdD17fTtyZXR1cm4gYnIocW4sKGZ1bmN0aW9uKGUsbil7a3QuY2FsbChxbi5wcm90b3R5cGUsbil8fCh0W25dPWUpfSkpLHR9KCkse2NoYWluOiExfSkscW4uVkVSU0lPTj0iNC4xNy4yMSIsTWUoWyJiaW5kIiwiYmluZEtleSIsImN1cnJ5IiwiY3VycnlSaWdodCIsInBhcnRpYWwiLCJwYXJ0aWFsUmlnaHQiXSwoZnVuY3Rpb24odCl7cW5bdF0ucGxhY2Vob2xkZXI9cW59KSksTWUoWyJkcm9wIiwidGFrZSJdLChmdW5jdGlvbih0LGUpe1huLnByb3RvdHlwZVt0XT1mdW5jdGlvbihyKXtyPXI9PT1uPzE6eG4oeWEociksMCk7dmFyIGk9dGhpcy5fX2ZpbHRlcmVkX18mJiFlP25ldyBYbih0aGlzKTp0aGlzLmNsb25lKCk7cmV0dXJuIGkuX19maWx0ZXJlZF9fP2kuX190YWtlQ291bnRfXz13bihyLGkuX190YWtlQ291bnRfXyk6aS5fX3ZpZXdzX18ucHVzaCh7c2l6ZTp3bihyLGQpLHR5cGU6dCsoaS5fX2Rpcl9fPDA/IlJpZ2h0IjoiIil9KSxpfSxYbi5wcm90b3R5cGVbdCsiUmlnaHQiXT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5yZXZlcnNlKClbdF0oZSkucmV2ZXJzZSgpfX0pKSxNZShbImZpbHRlciIsIm1hcCIsInRha2VXaGlsZSJdLChmdW5jdGlvbih0LGUpe3ZhciBuPWUrMSxyPTE9PW58fDM9PW47WG4ucHJvdG90eXBlW3RdPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuY2xvbmUoKTtyZXR1cm4gZS5fX2l0ZXJhdGVlc19fLnB1c2goe2l0ZXJhdGVlOmxvKHQsMyksdHlwZTpufSksZS5fX2ZpbHRlcmVkX189ZS5fX2ZpbHRlcmVkX198fHIsZX19KSksTWUoWyJoZWFkIiwibGFzdCJdLChmdW5jdGlvbih0LGUpe3ZhciBuPSJ0YWtlIisoZT8iUmlnaHQiOiIiKTtYbi5wcm90b3R5cGVbdF09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1tuXSgxKS52YWx1ZSgpWzBdfX0pKSxNZShbImluaXRpYWwiLCJ0YWlsIl0sKGZ1bmN0aW9uKHQsZSl7dmFyIG49ImRyb3AiKyhlPyIiOiJSaWdodCIpO1huLnByb3RvdHlwZVt0XT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9fZmlsdGVyZWRfXz9uZXcgWG4odGhpcyk6dGhpc1tuXSgxKX19KSksWG4ucHJvdG90eXBlLmNvbXBhY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5maWx0ZXIob3UpfSxYbi5wcm90b3R5cGUuZmluZD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5maWx0ZXIodCkuaGVhZCgpfSxYbi5wcm90b3R5cGUuZmluZExhc3Q9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucmV2ZXJzZSgpLmZpbmQodCl9LFhuLnByb3RvdHlwZS5pbnZva2VNYXA9UXIoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQ/bmV3IFhuKHRoaXMpOnRoaXMubWFwKChmdW5jdGlvbihuKXtyZXR1cm4gVHIobix0LGUpfSkpfSkpLFhuLnByb3RvdHlwZS5yZWplY3Q9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZmlsdGVyKEJzKGxvKHQpKSl9LFhuLnByb3RvdHlwZS5zbGljZT1mdW5jdGlvbih0LGUpe3Q9eWEodCk7dmFyIHI9dGhpcztyZXR1cm4gci5fX2ZpbHRlcmVkX18mJih0PjB8fGU8MCk/bmV3IFhuKHIpOih0PDA/cj1yLnRha2VSaWdodCgtdCk6dCYmKHI9ci5kcm9wKHQpKSxlIT09biYmKHI9KGU9eWEoZSkpPDA/ci5kcm9wUmlnaHQoLWUpOnIudGFrZShlLXQpKSxyKX0sWG4ucHJvdG90eXBlLnRha2VSaWdodFdoaWxlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnJldmVyc2UoKS50YWtlV2hpbGUodCkucmV2ZXJzZSgpfSxYbi5wcm90b3R5cGUudG9BcnJheT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRha2UoZCl9LGJyKFhuLnByb3RvdHlwZSwoZnVuY3Rpb24odCxlKXt2YXIgcj0vXig/OmZpbHRlcnxmaW5kfG1hcHxyZWplY3QpfFdoaWxlJC8udGVzdChlKSxpPS9eKD86aGVhZHxsYXN0KSQvLnRlc3QoZSksbz1xbltpPyJ0YWtlIisoImxhc3QiPT1lPyJSaWdodCI6IiIpOmVdLHM9aXx8L15maW5kLy50ZXN0KGUpOyFvfHwocW4ucHJvdG90eXBlW2VdPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5fX3dyYXBwZWRfXyxhPWk/WzFdOmFyZ3VtZW50cyx1PWUgaW5zdGFuY2VvZiBYbixjPWFbMF0sbD11fHxYcyhlKSxoPWZ1bmN0aW9uKHQpe3ZhciBlPW8uYXBwbHkocW4sQmUoW3RdLGEpKTtyZXR1cm4gaSYmZj9lWzBdOmV9O2wmJnImJiJmdW5jdGlvbiI9PXR5cGVvZiBjJiYxIT1jLmxlbmd0aCYmKHU9bD0hMSk7dmFyIGY9dGhpcy5fX2NoYWluX18scD0hIXRoaXMuX19hY3Rpb25zX18ubGVuZ3RoLGQ9cyYmIWYsZz11JiYhcDtpZighcyYmbCl7ZT1nP2U6bmV3IFhuKHRoaXMpO3ZhciB5PXQuYXBwbHkoZSxhKTtyZXR1cm4geS5fX2FjdGlvbnNfXy5wdXNoKHtmdW5jOmdzLGFyZ3M6W2hdLHRoaXNBcmc6bn0pLG5ldyBZbih5LGYpfXJldHVybiBkJiZnP3QuYXBwbHkodGhpcyxhKTooeT10aGlzLnRocnUoaCksZD9pP3kudmFsdWUoKVswXTp5LnZhbHVlKCk6eSl9KX0pKSxNZShbInBvcCIsInB1c2giLCJzaGlmdCIsInNvcnQiLCJzcGxpY2UiLCJ1bnNoaWZ0Il0sKGZ1bmN0aW9uKHQpe3ZhciBlPU90W3RdLG49L14oPzpwdXNofHNvcnR8dW5zaGlmdCkkLy50ZXN0KHQpPyJ0YXAiOiJ0aHJ1IixyPS9eKD86cG9wfHNoaWZ0KSQvLnRlc3QodCk7cW4ucHJvdG90eXBlW3RdPWZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzO2lmKHImJiF0aGlzLl9fY2hhaW5fXyl7dmFyIGk9dGhpcy52YWx1ZSgpO3JldHVybiBlLmFwcGx5KFhzKGkpP2k6W10sdCl9cmV0dXJuIHRoaXNbbl0oKGZ1bmN0aW9uKG4pe3JldHVybiBlLmFwcGx5KFhzKG4pP246W10sdCl9KSl9fSkpLGJyKFhuLnByb3RvdHlwZSwoZnVuY3Rpb24odCxlKXt2YXIgbj1xbltlXTtpZihuKXt2YXIgcj1uLm5hbWUrIiI7a3QuY2FsbChPbixyKXx8KE9uW3JdPVtdKSxPbltyXS5wdXNoKHtuYW1lOmUsZnVuYzpufSl9fSkpLE9uW3FpKG4sMikubmFtZV09W3tuYW1lOiJ3cmFwcGVyIixmdW5jOm59XSxYbi5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgWG4odGhpcy5fX3dyYXBwZWRfXyk7cmV0dXJuIHQuX19hY3Rpb25zX189RmkodGhpcy5fX2FjdGlvbnNfXyksdC5fX2Rpcl9fPXRoaXMuX19kaXJfXyx0Ll9fZmlsdGVyZWRfXz10aGlzLl9fZmlsdGVyZWRfXyx0Ll9faXRlcmF0ZWVzX189RmkodGhpcy5fX2l0ZXJhdGVlc19fKSx0Ll9fdGFrZUNvdW50X189dGhpcy5fX3Rha2VDb3VudF9fLHQuX192aWV3c19fPUZpKHRoaXMuX192aWV3c19fKSx0fSxYbi5wcm90b3R5cGUucmV2ZXJzZT1mdW5jdGlvbigpe2lmKHRoaXMuX19maWx0ZXJlZF9fKXt2YXIgdD1uZXcgWG4odGhpcyk7dC5fX2Rpcl9fPS0xLHQuX19maWx0ZXJlZF9fPSEwfWVsc2UodD10aGlzLmNsb25lKCkpLl9fZGlyX18qPS0xO3JldHVybiB0fSxYbi5wcm90b3R5cGUudmFsdWU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9fd3JhcHBlZF9fLnZhbHVlKCksZT10aGlzLl9fZGlyX18sbj1Ycyh0KSxyPWU8MCxpPW4/dC5sZW5ndGg6MCxvPWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHI9LTEsaT1uLmxlbmd0aDsrK3I8aTspe3ZhciBvPW5bcl0scz1vLnNpemU7c3dpdGNoKG8udHlwZSl7Y2FzZSJkcm9wIjp0Kz1zO2JyZWFrO2Nhc2UiZHJvcFJpZ2h0IjplLT1zO2JyZWFrO2Nhc2UidGFrZSI6ZT13bihlLHQrcyk7YnJlYWs7Y2FzZSJ0YWtlUmlnaHQiOnQ9eG4odCxlLXMpfX1yZXR1cm57c3RhcnQ6dCxlbmQ6ZX19KDAsaSx0aGlzLl9fdmlld3NfXykscz1vLnN0YXJ0LGE9by5lbmQsdT1hLXMsYz1yP2E6cy0xLGw9dGhpcy5fX2l0ZXJhdGVlc19fLGg9bC5sZW5ndGgsZj0wLHA9d24odSx0aGlzLl9fdGFrZUNvdW50X18pO2lmKCFufHwhciYmaT09dSYmcD09dSlyZXR1cm4geWkodCx0aGlzLl9fYWN0aW9uc19fKTt2YXIgZD1bXTt0OmZvcig7dS0tJiZmPHA7KXtmb3IodmFyIGc9LTEseT10W2MrPWVdOysrZzxoOyl7dmFyIG09bFtnXSx2PW0uaXRlcmF0ZWUsXz1tLnR5cGUseD12KHkpO2lmKDI9PV8peT14O2Vsc2UgaWYoIXgpe2lmKDE9PV8pY29udGludWUgdDticmVhayB0fX1kW2YrK109eX1yZXR1cm4gZH0scW4ucHJvdG90eXBlLmF0PXlzLHFuLnByb3RvdHlwZS5jaGFpbj1mdW5jdGlvbigpe3JldHVybiBkcyh0aGlzKX0scW4ucHJvdG90eXBlLmNvbW1pdD1mdW5jdGlvbigpe3JldHVybiBuZXcgWW4odGhpcy52YWx1ZSgpLHRoaXMuX19jaGFpbl9fKX0scW4ucHJvdG90eXBlLm5leHQ9ZnVuY3Rpb24oKXt0aGlzLl9fdmFsdWVzX189PT1uJiYodGhpcy5fX3ZhbHVlc19fPWRhKHRoaXMudmFsdWUoKSkpO3ZhciB0PXRoaXMuX19pbmRleF9fPj10aGlzLl9fdmFsdWVzX18ubGVuZ3RoO3JldHVybntkb25lOnQsdmFsdWU6dD9uOnRoaXMuX192YWx1ZXNfX1t0aGlzLl9faW5kZXhfXysrXX19LHFuLnByb3RvdHlwZS5wbGFudD1mdW5jdGlvbih0KXtmb3IodmFyIGUscj10aGlzO3IgaW5zdGFuY2VvZiBHbjspe3ZhciBpPVVvKHIpO2kuX19pbmRleF9fPTAsaS5fX3ZhbHVlc19fPW4sZT9vLl9fd3JhcHBlZF9fPWk6ZT1pO3ZhciBvPWk7cj1yLl9fd3JhcHBlZF9ffXJldHVybiBvLl9fd3JhcHBlZF9fPXQsZX0scW4ucHJvdG90eXBlLnJldmVyc2U9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9fd3JhcHBlZF9fO2lmKHQgaW5zdGFuY2VvZiBYbil7dmFyIGU9dDtyZXR1cm4gdGhpcy5fX2FjdGlvbnNfXy5sZW5ndGgmJihlPW5ldyBYbih0aGlzKSksKGU9ZS5yZXZlcnNlKCkpLl9fYWN0aW9uc19fLnB1c2goe2Z1bmM6Z3MsYXJnczpbbnNdLHRoaXNBcmc6bn0pLG5ldyBZbihlLHRoaXMuX19jaGFpbl9fKX1yZXR1cm4gdGhpcy50aHJ1KG5zKX0scW4ucHJvdG90eXBlLnRvSlNPTj1xbi5wcm90b3R5cGUudmFsdWVPZj1xbi5wcm90b3R5cGUudmFsdWU9ZnVuY3Rpb24oKXtyZXR1cm4geWkodGhpcy5fX3dyYXBwZWRfXyx0aGlzLl9fYWN0aW9uc19fKX0scW4ucHJvdG90eXBlLmZpcnN0PXFuLnByb3RvdHlwZS5oZWFkLHRlJiYocW4ucHJvdG90eXBlW3RlXT1mdW5jdGlvbigpe3JldHVybiB0aGlzfSkscW59KCk7dmU/KCh2ZS5leHBvcnRzPXZuKS5fPXZuLG1lLl89dm4pOnllLl89dm59KS5jYWxsKHRlKX0pKTtjb25zdCBIdj0odCxlLG4pPT57aWYobltlXSlyZXR1cm4gbnVsbCE9PSgodCxlKT0+e2NvbnN0IG49TWF0aC5tYXgodC54LGUueCkscj1NYXRoLm1heCh0LnksZS55KSxpPU1hdGgubWluKHQueCt0LndpZHRoLGUueCtlLndpZHRoKS1uLG89TWF0aC5taW4odC55K3QuaGVpZ2h0LGUueStlLmhlaWdodCktcjtyZXR1cm4gaT49MCYmbz49MD97eDpuLHk6cix3aWR0aDppLGhlaWdodDpvfTpudWxsfSkodCx7eDowLHk6MCx3aWR0aDpuW2VdLndpZHRoLGhlaWdodDpuW2VdLmhlaWdodH0pO3JldHVybiExfTt2YXIgWnY9T2JqZWN0LmRlZmluZVByb3BlcnR5LEt2PU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzLEp2PU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzLFF2PU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsJHY9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSx0Xz1PYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLGVfPSh0LGUsbik9PmUgaW4gdD9adih0LGUse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOm59KTp0W2VdPW4sbl89KHQsZSk9Pntmb3IodmFyIG4gaW4gZXx8KGU9e30pKSR2LmNhbGwoZSxuKSYmZV8odCxuLGVbbl0pO2lmKFF2KWZvcih2YXIgbiBvZiBRdihlKSl0Xy5jYWxsKGUsbikmJmVfKHQsbixlW25dKTtyZXR1cm4gdH0scl89KHQsZSk9Pkt2KHQsSnYoZSkpO2Z1bmN0aW9uIGlfKHQpe3ZhciBlO2NvbnN0e2N1cnJlbnREYXRhOm4sZGlzcGxheVBvaW50Q2xvdWRMaXN0OnIsc2VsZWN0ZWRJRDppLGhpZ2hsaWdodEF0dHJpYnV0ZTpvLGltYWdlU2l6ZXM6cyxjb25maWc6YSxwb2x5Z29uTGlzdDp1LHNlbGVjdGVkSURzOmN9PXQsbD17ZmlsbDoidHJhbnNwYXJlbnQiLGNvbG9yOiJncmVlbiJ9O2xldCBoPVtdO3JldHVybiBudWxsPT0oZT1udWxsPT1uP3ZvaWQgMDpuLm1hcHBpbmdJbWdMaXN0KXx8ZS5mb3JFYWNoKCh0PT57dmFyIGUsbixmLHA7Y29uc3QgZD1yLnJlZHVjZSgoKGUsbik9Pnt2YXIgcix1O2NvbnN0IGM9bi5pZD09PWl8fG89PT1uLmF0dHJpYnV0ZSx7dHJhbnNmZXJWaWV3RGF0YTpoLHZpZXdSYW5nZVBvaW50TGlzdDpmfT1udWxsIT0ocj1WdihuLHQuY2FsaWIse2NyZWF0ZVJhbmdlOmN9KSk/cjp7fTtpZighaHx8IWYpcmV0dXJuW107Y29uc3QgcD1oLnJlZHVjZSgoKHQsZSk9PiJsaW5lIj09PWUudHlwZT9bLi4udCwuLi5lLnBvaW50TGlzdF06dCksW10pLGQ9cl8obl8oe30sKHQ9PntsZXQgZT0xLzAsbj0xLzAscj0tMS8wLGk9LTEvMDtmb3IoY29uc3QgbyBvZiB0KWU9TWF0aC5taW4oZSxvLngpLG49TWF0aC5taW4obixvLnkpLHI9TWF0aC5tYXgocixvLngpLGk9TWF0aC5tYXgoaSxvLnkpO3JldHVybnt4OmUseTpuLHdpZHRoOnItZSxoZWlnaHQ6aS1ufX0pKHApKSx7aW1hZ2VOYW1lOnQucGF0aH0pO2lmKCFIdihkLHQucGF0aCxzKSlyZXR1cm4gZTtjb25zdCBnPW51bGw9PSh1PUZ0LmdldENvbG9yRnJvbUNvbmZpZyh7YXR0cmlidXRlOm4uYXR0cmlidXRlfSxyXyhuXyh7fSxhKSx7YXR0cmlidXRlQ29uZmlndXJhYmxlOiEwfSkse30pKT92b2lkIDA6dS5zdHJva2UseT0oKHt2aWV3RGF0YVBvaW50TGlzdDp0LHBvaW50Q2xvdWRCb3g6ZSxkZWZhdWx0Vmlld1N0eWxlOm4sc3Ryb2tlOnJ9KT0+dD90Lm1hcCgodD0+KHt0eXBlOnQudHlwZSxhbm5vdGF0aW9uOnJfKG5fKHtpZDplLmlkLHBvaW50TGlzdDp0LnBvaW50TGlzdH0sbikse3N0cm9rZTpyfSl9KSkpOltdKSh7dmlld0RhdGFQb2ludExpc3Q6aCxwb2ludENsb3VkQm94Om4sZGVmYXVsdFZpZXdTdHlsZTpsLHN0cm9rZTpnfSksbT1bLi4uZSwuLi55XTtyZXR1cm4obnVsbD09Zj92b2lkIDA6Zi5sZW5ndGgpPjAmJm0udW5zaGlmdCh7dHlwZToicG9seWdvbiIsYW5ub3RhdGlvbjpyXyhuXyh7aWQ6aSxwb2ludExpc3Q6Zn0sbCkse3N0cm9rZTpnLGZpbGw6InJnYmEoMjU1LCAyNTUsIDI1NSwgMC42KSJ9KX0pLG19KSxbXSksZz1zW251bGwhPShlPW51bGw9PXQ/dm9pZCAwOnQucGF0aCk/ZToiIl07ZyYmV3YuaXNOdW1iZXIobnVsbD09KG49bnVsbD09dD92b2lkIDA6dC5jYWxpYik/dm9pZCAwOm4uZ3JvdW5kSGVpZ2h0KSYmdS5mb3JFYWNoKChlPT57Y29uc3Qgbj1mdW5jdGlvbih0LGUsbil7dmFyIHI7aWYoIWV8fCFuKXJldHVybjtjb25zdCBpPXp2KGUpLHtQOm8sUjpzLFQ6YX09ZTtsZXQgdTtpZighMT09PWkpe2NvbnN0e2NvbXBvc2VNYXRyaXg0OnR9PW51bGwhPShyPUJ2KG8scyxhKSk/cjp7fTtpZighdClyZXR1cm47dT10fWNvbnN0IGM9W107cmV0dXJuIHQuZm9yRWFjaCgodD0+e2xldCBuO2lmKG49aT9qdih0LGUpOnUmJlV2KHQsdSksbil7Y29uc3R7eDp0LHk6ZX09bjtjLnB1c2goe3g6dCx5OmV9KX19KSksYy5zb21lKCh0PT50Lng+MCYmdC54PG4ud2lkdGgmJnQueT4wJiZ0Lnk8bi5oZWlnaHQpKT9jOnZvaWQgMH0oZS5wb2ludExpc3QubWFwKChlPT57dmFyIG47cmV0dXJuIHJfKG5fKHt9LGUpLHt6Om51bGw9PShuPW51bGw9PXQ/dm9pZCAwOnQuY2FsaWIpP3ZvaWQgMDpuLmdyb3VuZEhlaWdodH0pfSkpLG51bGw9PXQ/dm9pZCAwOnQuY2FsaWIsZyk7aWYobil7Y29uc3QgdD1GdC5nZXRDb2xvckZyb21Db25maWcoe2F0dHJpYnV0ZTplLmF0dHJpYnV0ZX0scl8obl8oe30sYSkse2F0dHJpYnV0ZUNvbmZpZ3VyYWJsZTohMH0pLHt9KTtkLnB1c2goe3R5cGU6InBvbHlnb24iLGFubm90YXRpb246cl8obl8oe2lkOmUuaWQscG9pbnRMaXN0Om59LGwpLHtzdHJva2U6bnVsbD09dD92b2lkIDA6dC5zdHJva2UsZmlsbDpjLmluY2x1ZGVzKGUuaWQpP251bGw9PXQ/dm9pZCAwOnQuZmlsbDoicmdiYSgyNTUsIDI1NSwgMjU1LCAwLjYpIn0pfSl9fSkpLGgucHVzaCh7YW5ub3RhdGlvbnM6ZCx1cmw6bnVsbD09dD92b2lkIDA6dC51cmwsZmFsbGJhY2tVcmw6bnVsbCE9KGY9bnVsbD09dD92b2lkIDA6dC5mYWxsYmFja1VybCk/ZjoiIixjYWxOYW1lOm51bGw9PShwPW51bGw9PXQ/dm9pZCAwOnQuY2FsaWIpP3ZvaWQgMDpwLmNhbE5hbWUsY2FsaWI6bnVsbD09dD92b2lkIDA6dC5jYWxpYixwYXRoOm51bGw9PXQ/dm9pZCAwOnQucGF0aH0pfSkpLGh9b25tZXNzYWdlPXQ9Pntjb25zdHtjdXJyZW50RGF0YTplLGRpc3BsYXlQb2ludENsb3VkTGlzdDpuLHNlbGVjdGVkSUQ6cixoaWdobGlnaHRBdHRyaWJ1dGU6aSxpbWFnZVNpemVzOm8sY29uZmlnOnMscG9seWdvbkxpc3Q6YSxzZWxlY3RlZElEczp1fT10LmRhdGEsYz1pXyh7Y3VycmVudERhdGE6ZSxkaXNwbGF5UG9pbnRDbG91ZExpc3Q6bixzZWxlY3RlZElEOnIsaGlnaGxpZ2h0QXR0cmlidXRlOmksaW1hZ2VTaXplczpvLGNvbmZpZzpzLHBvbHlnb25MaXN0OmEsc2VsZWN0ZWRJRHM6dX0pO3Bvc3RNZXNzYWdlKGMpfX0oKTsKCg==",null,!1);export{l as default};
1
+ import{createBase64WorkerFactory as b}from"./_rollup-plugin-web-worker-loader__helper__browser__createBase64WorkerFactory.js";var l=b("Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24oTCxQLFYpeyJ1c2Ugc3RyaWN0Ijtjb25zdCB6PWk9PntsZXQgdD1JbmZpbml0eSxuPUluZmluaXR5LG89LUluZmluaXR5LHI9LUluZmluaXR5O2Zvcihjb25zdCBsIG9mIGkpdD1NYXRoLm1pbih0LGwueCksbj1NYXRoLm1pbihuLGwueSksbz1NYXRoLm1heChvLGwueCkscj1NYXRoLm1heChyLGwueSk7cmV0dXJue3g6dCx5Om4sd2lkdGg6by10LGhlaWdodDpyLW59fSxGPSgoKT0+e2NvbnN0IGk9KHQsbik9Pntjb25zdCBvPU1hdGgubWF4KHQueCxuLngpLHI9TWF0aC5tYXgodC55LG4ueSksbD1NYXRoLm1pbih0LngrdC53aWR0aCxuLngrbi53aWR0aCksZD1NYXRoLm1pbih0LnkrdC5oZWlnaHQsbi55K24uaGVpZ2h0KSx1PWwtbyxnPWQtcjtyZXR1cm4gdT49MCYmZz49MD97eDpvLHk6cix3aWR0aDp1LGhlaWdodDpnfTpudWxsfTtyZXR1cm4odCxuLG8pPT57aWYob1tuXSl7Y29uc3Qgcj1vW25dLndpZHRoLGw9b1tuXS5oZWlnaHQ7cmV0dXJuIGkodCx7eDowLHk6MCx3aWR0aDpyLGhlaWdodDpsfSkhPT1udWxsfXJldHVybiExfX0pKCk7dmFyIFU9T2JqZWN0LmRlZmluZVByb3BlcnR5LFg9T2JqZWN0LmRlZmluZVByb3BlcnRpZXMsWT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyxPPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsVz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LHE9T2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZSx4PShpLHQsbik9PnQgaW4gaT9VKGksdCx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6bn0pOmlbdF09bixjPShpLHQpPT57Zm9yKHZhciBuIGluIHR8fCh0PXt9KSlXLmNhbGwodCxuKSYmeChpLG4sdFtuXSk7aWYoTylmb3IodmFyIG4gb2YgTyh0KSlxLmNhbGwodCxuKSYmeChpLG4sdFtuXSk7cmV0dXJuIGl9LGE9KGksdCk9PlgoaSxZKHQpKTtjb25zdCBHPSh7dmlld0RhdGFQb2ludExpc3Q6aSxwb2ludENsb3VkQm94OnQsZGVmYXVsdFZpZXdTdHlsZTpuLHN0cm9rZTpvfSk9Pmk/aS5tYXAocj0+KHt0eXBlOnIudHlwZSxhbm5vdGF0aW9uOmEoYyh7aWQ6dC5pZCxwb2ludExpc3Q6ci5wb2ludExpc3R9LG4pLHtzdHJva2U6b30pfSkpOltdO2Z1bmN0aW9uIEooaSl7dmFyIHQ7Y29uc3R7Y3VycmVudERhdGE6bixkaXNwbGF5UG9pbnRDbG91ZExpc3Q6byxzZWxlY3RlZElEOnIsaGlnaGxpZ2h0QXR0cmlidXRlOmwsaW1hZ2VTaXplczpkLGNvbmZpZzp1LHBvbHlnb25MaXN0Omcsc2VsZWN0ZWRJRHM6bX09aSx3PXtmaWxsOiJ0cmFuc3BhcmVudCIsY29sb3I6ImdyZWVuIn07bGV0IHA9W107cmV0dXJuKHQ9bj09bnVsbD92b2lkIDA6bi5tYXBwaW5nSW1nTGlzdCk9PW51bGx8fHQuZm9yRWFjaChlPT57dmFyIE0sUixDLEE7Y29uc3QgUz1vLnJlZHVjZSgoZixoKT0+e3ZhciB2LHM7Y29uc3QgeT1oLmlkPT09cnx8bD09PWguYXR0cmlidXRlLHt0cmFuc2ZlclZpZXdEYXRhOkksdmlld1JhbmdlUG9pbnRMaXN0OmJ9PSh2PVAucG9pbnRDbG91ZExpZGFyMmltYWdlKGgsZS5jYWxpYix7Y3JlYXRlUmFuZ2U6eX0pKSE9bnVsbD92Ont9O2lmKCFJfHwhYilyZXR1cm5bXTtjb25zdCBLPUkucmVkdWNlKChFLEgpPT5ILnR5cGU9PT0ibGluZSI/Wy4uLkUsLi4uSC5wb2ludExpc3RdOkUsW10pLFE9YShjKHt9LHooSykpLHtpbWFnZU5hbWU6ZS5wYXRofSk7aWYoIUYoUSxlLnBhdGgsZCkpcmV0dXJuIGY7Y29uc3Qgaj0ocz1MLnRvb2xTdHlsZUNvbnZlcnRlci5nZXRDb2xvckZyb21Db25maWcoe2F0dHJpYnV0ZTpoLmF0dHJpYnV0ZX0sYShjKHt9LHUpLHthdHRyaWJ1dGVDb25maWd1cmFibGU6ITB9KSx7fSkpPT1udWxsP3ZvaWQgMDpzLnN0cm9rZSxUPUcoe3ZpZXdEYXRhUG9pbnRMaXN0OkkscG9pbnRDbG91ZEJveDpoLGRlZmF1bHRWaWV3U3R5bGU6dyxzdHJva2U6an0pLGs9Wy4uLmYsLi4uVF07cmV0dXJuKGI9PW51bGw/dm9pZCAwOmIubGVuZ3RoKT4wJiZrLnVuc2hpZnQoe3R5cGU6InBvbHlnb24iLGFubm90YXRpb246YShjKHtpZDpyLHBvaW50TGlzdDpifSx3KSx7c3Ryb2tlOmosZmlsbDoicmdiYSgyNTUsIDI1NSwgMjU1LCAwLjYpIn0pfSksa30sW10pLE49ZFsoTT1lPT1udWxsP3ZvaWQgMDplLnBhdGgpIT1udWxsP006IiJdO04mJlYuaXNOdW1iZXIoKFI9ZT09bnVsbD92b2lkIDA6ZS5jYWxpYik9PW51bGw/dm9pZCAwOlIuZ3JvdW5kSGVpZ2h0KSYmZy5mb3JFYWNoKGY9Pntjb25zdCBoPWYucG9pbnRMaXN0Lm1hcChzPT57dmFyIHk7cmV0dXJuIGEoYyh7fSxzKSx7ejooeT1lPT1udWxsP3ZvaWQgMDplLmNhbGliKT09bnVsbD92b2lkIDA6eS5ncm91bmRIZWlnaHR9KX0pLHY9UC5wb2ludExpc3RMaWRhcjJJbWcoaCxlPT1udWxsP3ZvaWQgMDplLmNhbGliLE4pO2lmKHYpe2NvbnN0IHM9TC50b29sU3R5bGVDb252ZXJ0ZXIuZ2V0Q29sb3JGcm9tQ29uZmlnKHthdHRyaWJ1dGU6Zi5hdHRyaWJ1dGV9LGEoYyh7fSx1KSx7YXR0cmlidXRlQ29uZmlndXJhYmxlOiEwfSkse30pO1MucHVzaCh7dHlwZToicG9seWdvbiIsYW5ub3RhdGlvbjphKGMoe2lkOmYuaWQscG9pbnRMaXN0OnZ9LHcpLHtzdHJva2U6cz09bnVsbD92b2lkIDA6cy5zdHJva2UsZmlsbDptLmluY2x1ZGVzKGYuaWQpP3M9PW51bGw/dm9pZCAwOnMuZmlsbDoicmdiYSgyNTUsIDI1NSwgMjU1LCAwLjYpIn0pfSl9fSkscC5wdXNoKHthbm5vdGF0aW9uczpTLHVybDplPT1udWxsP3ZvaWQgMDplLnVybCxmYWxsYmFja1VybDooQz1lPT1udWxsP3ZvaWQgMDplLmZhbGxiYWNrVXJsKSE9bnVsbD9DOiIiLGNhbE5hbWU6KEE9ZT09bnVsbD92b2lkIDA6ZS5jYWxpYik9PW51bGw/dm9pZCAwOkEuY2FsTmFtZSxjYWxpYjplPT1udWxsP3ZvaWQgMDplLmNhbGliLHBhdGg6ZT09bnVsbD92b2lkIDA6ZS5wYXRofSl9KSxwfW9ubWVzc2FnZT1pPT57Y29uc3R7Y3VycmVudERhdGE6dCxkaXNwbGF5UG9pbnRDbG91ZExpc3Q6bixzZWxlY3RlZElEOm8saGlnaGxpZ2h0QXR0cmlidXRlOnIsaW1hZ2VTaXplczpsLGNvbmZpZzpkLHBvbHlnb25MaXN0OnUsc2VsZWN0ZWRJRHM6Z309aS5kYXRhLG09Sih7Y3VycmVudERhdGE6dCxkaXNwbGF5UG9pbnRDbG91ZExpc3Q6bixzZWxlY3RlZElEOm8saGlnaGxpZ2h0QXR0cmlidXRlOnIsaW1hZ2VTaXplczpsLGNvbmZpZzpkLHBvbHlnb25MaXN0OnUsc2VsZWN0ZWRJRHM6Z30pO3Bvc3RNZXNzYWdlKG0pfX0pKGxiVXRpbHMsbGJBbm5vdGF0aW9uLF8pOwoK",null,!1);export{l as default};