w-gis 1.0.38 → 1.0.39
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.
- package/README.md +1 -1
- package/dist/interp2.wk.umd.js +1 -1
- package/dist/w-gis.umd.js +2 -2
- package/dist/w-gis.umd.js.map +1 -1
- package/docs/-_class.mjs.html +1 -1
- package/docs/bufferMultiPolygon.mjs.html +1 -1
- package/docs/convertCoordinate.mjs.html +1 -1
- package/docs/examples/ex-convertCoordinate.html +1 -1
- package/docs/examples/ex-getCenterOfMassMultiPolygon.html +1 -1
- package/docs/examples/ex-getCentroidMultiPolygon.html +1 -1
- package/docs/fixCloseMultiPolygon.mjs.html +1 -1
- package/docs/fixNoCloseMultiPolygon.mjs.html +1 -1
- package/docs/getAreaMultiPolygon.mjs.html +1 -1
- package/docs/getAreaMultiPolygonSm.mjs.html +1 -1
- package/docs/getAreaPolygon.mjs.html +1 -1
- package/docs/getAreaRingString.mjs.html +1 -1
- package/docs/getBoxPolygon.mjs.html +1 -1
- package/docs/getCenterOfMassMultiPolygon.mjs.html +1 -1
- package/docs/getCentroidMultiPolygon.mjs.html +1 -1
- package/docs/importTurf.mjs.html +1 -1
- package/docs/index.html +1 -1
- package/docs/interp2.mjs.html +1 -1
- package/docs/interp2Kriging.mjs.html +1 -1
- package/docs/interp2NaturalNeighbor.mjs.html +51 -5
- package/docs/normalizeArray.mjs.html +1 -1
- package/docs/ptsXYZtoArr.mjs.html +1 -1
- package/docs/ptsXYtoArr.mjs.html +1 -1
- package/docs/toMultiPoint.mjs.html +1 -1
- package/docs/toMultiPolygon.mjs.html +1 -1
- package/docs/toPolygon.mjs.html +1 -1
- package/docs/w-gis.html +3 -3
- package/g-interp2NaturalNeighbor.mjs +14 -0
- package/package.json +1 -1
- package/src/interp2NaturalNeighbor.mjs +50 -4
package/dist/interp2.wk.umd.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
!function(b,d){"object"==typeof exports&&"undefined"!=typeof module?module.exports=d(require("worker_threads")):"function"==typeof define&&define.amd?define(["worker_threads"],d):(b="undefined"!=typeof globalThis?globalThis:b||self).interp2=d(b.worker_threads)}(this,(function(b){"use strict";"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;var d={};!function(d,l){d.exports=function(b){var d={};!function(b){var d=Object.prototype.hasOwnProperty,l="~";function Z(){}function m(b,d,l){this.fn=b,this.context=d,this.once=l||!1}function X(b,d,Z,X,G){if("function"!=typeof Z)throw new TypeError("The listener must be a function");var W=new m(Z,X||b,G),c=l?l+d:d;return b._events[c]?b._events[c].fn?b._events[c]=[b._events[c],W]:b._events[c].push(W):(b._events[c]=W,b._eventsCount++),b}function G(b,d){0==--b._eventsCount?b._events=new Z:delete b._events[d]}function W(){this._events=new Z,this._eventsCount=0}Object.create&&(Z.prototype=Object.create(null),(new Z).__proto__||(l=!1)),W.prototype.eventNames=function(){var b,Z,m=[];if(0===this._eventsCount)return m;for(Z in b=this._events)d.call(b,Z)&&m.push(l?Z.slice(1):Z);return Object.getOwnPropertySymbols?m.concat(Object.getOwnPropertySymbols(b)):m},W.prototype.listeners=function(b){var d=l?l+b:b,Z=this._events[d];if(!Z)return[];if(Z.fn)return[Z.fn];for(var m=0,X=Z.length,G=new Array(X);m<X;m++)G[m]=Z[m].fn;return G},W.prototype.listenerCount=function(b){var d=l?l+b:b,Z=this._events[d];return Z?Z.fn?1:Z.length:0},W.prototype.emit=function(b,d,Z,m,X,G){var W=l?l+b:b;if(!this._events[W])return!1;var c,p,K=this._events[W],s=arguments.length;if(K.fn){switch(K.once&&this.removeListener(b,K.fn,void 0,!0),s){case 1:return K.fn.call(K.context),!0;case 2:return K.fn.call(K.context,d),!0;case 3:return K.fn.call(K.context,d,Z),!0;case 4:return K.fn.call(K.context,d,Z,m),!0;case 5:return K.fn.call(K.context,d,Z,m,X),!0;case 6:return K.fn.call(K.context,d,Z,m,X,G),!0}for(p=1,c=new Array(s-1);p<s;p++)c[p-1]=arguments[p];K.fn.apply(K.context,c)}else{var y,i=K.length;for(p=0;p<i;p++)switch(K[p].once&&this.removeListener(b,K[p].fn,void 0,!0),s){case 1:K[p].fn.call(K[p].context);break;case 2:K[p].fn.call(K[p].context,d);break;case 3:K[p].fn.call(K[p].context,d,Z);break;case 4:K[p].fn.call(K[p].context,d,Z,m);break;default:if(!c)for(y=1,c=new Array(s-1);y<s;y++)c[y-1]=arguments[y];K[p].fn.apply(K[p].context,c)}}return!0},W.prototype.on=function(b,d,l){return X(this,b,d,l,!1)},W.prototype.once=function(b,d,l){return X(this,b,d,l,!0)},W.prototype.removeListener=function(b,d,Z,m){var X=l?l+b:b;if(!this._events[X])return this;if(!d)return G(this,X),this;var W=this._events[X];if(W.fn)W.fn!==d||m&&!W.once||Z&&W.context!==Z||G(this,X);else{for(var c=0,p=[],K=W.length;c<K;c++)(W[c].fn!==d||m&&!W[c].once||Z&&W[c].context!==Z)&&p.push(W[c]);p.length?this._events[X]=1===p.length?p[0]:p:G(this,X)}return this},W.prototype.removeAllListeners=function(b){var d;return b?(d=l?l+b:b,this._events[d]&&G(this,d)):(this._events=new Z,this._eventsCount=0),this},W.prototype.off=W.prototype.removeListener,W.prototype.addListener=W.prototype.on,W.prefixed=l,W.EventEmitter=W,b.exports=W}({get exports(){return d},set exports(b){d=b}});var l=d;let Z;return function(){if("nodejs"!=("undefined"!=typeof window&&void 0!==window.document?"browser":"nodejs"))return null;let d=(m="CgogICAgICAgIGxldCB7IHBhcmVudFBvcnQgfSA9IHJlcXVpcmUoJ3dvcmtlcl90aHJlYWRzJykKICAgICAgICAKCnZhciB0PSJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsVGhpcz9nbG9iYWxUaGlzOiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzoidW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbD9nbG9iYWw6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmP3NlbGY6e307ZnVuY3Rpb24gZSh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwiZGVmYXVsdCIpP3QuZGVmYXVsdDp0fXZhciBuPUFycmF5LmlzQXJyYXkscj0ib2JqZWN0Ij09dHlwZW9mIHQmJnQmJnQuT2JqZWN0PT09T2JqZWN0JiZ0LGk9cixvPSJvYmplY3QiPT10eXBlb2Ygc2VsZiYmc2VsZiYmc2VsZi5PYmplY3Q9PT1PYmplY3QmJnNlbGYsbD1pfHxvfHxGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpLGE9bC5TeW1ib2wscz1hLHU9T2JqZWN0LnByb3RvdHlwZSxjPXUuaGFzT3duUHJvcGVydHksZj11LnRvU3RyaW5nLGg9cz9zLnRvU3RyaW5nVGFnOnZvaWQgMDt2YXIgZz1mdW5jdGlvbih0KXt2YXIgZT1jLmNhbGwodCxoKSxuPXRbaF07dHJ5e3RbaF09dm9pZCAwO3ZhciByPSEwfWNhdGNoKHQpe312YXIgaT1mLmNhbGwodCk7cmV0dXJuIHImJihlP3RbaF09bjpkZWxldGUgdFtoXSksaX0sdj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO3ZhciBkPWcscD1mdW5jdGlvbih0KXtyZXR1cm4gdi5jYWxsKHQpfSx5PWE/YS50b1N0cmluZ1RhZzp2b2lkIDA7dmFyIG09ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dm9pZCAwPT09dD8iW29iamVjdCBVbmRlZmluZWRdIjoiW29iamVjdCBOdWxsXSI6eSYmeSBpbiBPYmplY3QodCk/ZCh0KTpwKHQpfTt2YXIgXz1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dCYmIm9iamVjdCI9PXR5cGVvZiB0fSxiPW0seD1fO3ZhciB3PWZ1bmN0aW9uKHQpe3JldHVybiJzeW1ib2wiPT10eXBlb2YgdHx8eCh0KSYmIltvYmplY3QgU3ltYm9sXSI9PWIodCl9LGo9bixTPXcsQT0vXC58XFsoPzpbXltcXV0qfChbIiddKSg/Oig/IVwxKVteXFxdfFxcLikqP1wxKVxdLyxPPS9eXHcqJC87dmFyIE09ZnVuY3Rpb24odCxlKXtpZihqKHQpKXJldHVybiExO3ZhciBuPXR5cGVvZiB0O3JldHVybiEoIm51bWJlciIhPW4mJiJzeW1ib2wiIT1uJiYiYm9vbGVhbiIhPW4mJm51bGwhPXQmJiFTKHQpKXx8KE8udGVzdCh0KXx8IUEudGVzdCh0KXx8bnVsbCE9ZSYmdCBpbiBPYmplY3QoZSkpfTt2YXIgaz1mdW5jdGlvbih0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4gbnVsbCE9dCYmKCJvYmplY3QiPT1lfHwiZnVuY3Rpb24iPT1lKX0sUD1tLEY9azt2YXIgVCx6PWZ1bmN0aW9uKHQpe2lmKCFGKHQpKXJldHVybiExO3ZhciBlPVAodCk7cmV0dXJuIltvYmplY3QgRnVuY3Rpb25dIj09ZXx8IltvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dIj09ZXx8IltvYmplY3QgQXN5bmNGdW5jdGlvbl0iPT1lfHwiW29iamVjdCBQcm94eV0iPT1lfSxJPWxbIl9fY29yZS1qc19zaGFyZWRfXyJdLCQ9KFQ9L1teLl0rJC8uZXhlYyhJJiZJLmtleXMmJkkua2V5cy5JRV9QUk9UT3x8IiIpKT8iU3ltYm9sKHNyYylfMS4iK1Q6IiI7dmFyIEU9ZnVuY3Rpb24odCl7cmV0dXJuISEkJiYkIGluIHR9LE49RnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nO3ZhciBSPWZ1bmN0aW9uKHQpe2lmKG51bGwhPXQpe3RyeXtyZXR1cm4gTi5jYWxsKHQpfWNhdGNoKHQpe310cnl7cmV0dXJuIHQrIiJ9Y2F0Y2godCl7fX1yZXR1cm4iIn0sQz16LEI9RSxVPWssTD1SLEQ9L15cW29iamVjdCAuKz9Db25zdHJ1Y3RvclxdJC8sSD1GdW5jdGlvbi5wcm90b3R5cGUsWD1PYmplY3QucHJvdG90eXBlLFk9SC50b1N0cmluZyxLPVguaGFzT3duUHJvcGVydHksWj1SZWdFeHAoIl4iK1kuY2FsbChLKS5yZXBsYWNlKC9bXFxeJC4qKz8oKVtcXXt9fF0vZywiXFwkJiIpLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFwoKXwgZm9yIC4rPyg/PVxcXF0pL2csIiQxLio/IikrIiQiKTt2YXIgSj1mdW5jdGlvbih0KXtyZXR1cm4hKCFVKHQpfHxCKHQpKSYmKEModCk/WjpEKS50ZXN0KEwodCkpfSxWPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGw9PXQ/dm9pZCAwOnRbZV19O3ZhciBXPWZ1bmN0aW9uKHQsZSl7dmFyIG49Vih0LGUpO3JldHVybiBKKG4pP246dm9pZCAwfSxxPVcoT2JqZWN0LCJjcmVhdGUiKSxHPXE7dmFyIFE9ZnVuY3Rpb24oKXt0aGlzLl9fZGF0YV9fPUc/RyhudWxsKTp7fSx0aGlzLnNpemU9MH07dmFyIHR0PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuaGFzKHQpJiZkZWxldGUgdGhpcy5fX2RhdGFfX1t0XTtyZXR1cm4gdGhpcy5zaXplLT1lPzE6MCxlfSxldD1xLG50PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dmFyIHJ0PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX19kYXRhX187aWYoZXQpe3ZhciBuPWVbdF07cmV0dXJuIl9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iPT09bj92b2lkIDA6bn1yZXR1cm4gbnQuY2FsbChlLHQpP2VbdF06dm9pZCAwfSxpdD1xLG90PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dmFyIGx0PXE7dmFyIGF0PVEsc3Q9dHQsdXQ9cnQsY3Q9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXztyZXR1cm4gaXQ/dm9pZCAwIT09ZVt0XTpvdC5jYWxsKGUsdCl9LGZ0PWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fX2RhdGFfXztyZXR1cm4gdGhpcy5zaXplKz10aGlzLmhhcyh0KT8wOjEsblt0XT1sdCYmdm9pZCAwPT09ZT8iX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyI6ZSx0aGlzfTtmdW5jdGlvbiBodCh0KXt2YXIgZT0tMSxuPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxuOyl7dmFyIHI9dFtlXTt0aGlzLnNldChyWzBdLHJbMV0pfX1odC5wcm90b3R5cGUuY2xlYXI9YXQsaHQucHJvdG90eXBlLmRlbGV0ZT1zdCxodC5wcm90b3R5cGUuZ2V0PXV0LGh0LnByb3RvdHlwZS5oYXM9Y3QsaHQucHJvdG90eXBlLnNldD1mdDt2YXIgZ3Q9aHQ7dmFyIHZ0PWZ1bmN0aW9uKCl7dGhpcy5fX2RhdGFfXz1bXSx0aGlzLnNpemU9MH07dmFyIGR0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PT1lfHx0IT10JiZlIT1lfSxwdD1kdDt2YXIgeXQ9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dC5sZW5ndGg7bi0tOylpZihwdCh0W25dWzBdLGUpKXJldHVybiBuO3JldHVybi0xfSxtdD15dCxfdD1BcnJheS5wcm90b3R5cGUuc3BsaWNlO3ZhciBidD15dDt2YXIgeHQ9eXQ7dmFyIHd0PXl0O3ZhciBqdD12dCxTdD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fLG49bXQoZSx0KTtyZXR1cm4hKG48MCkmJihuPT1lLmxlbmd0aC0xP2UucG9wKCk6X3QuY2FsbChlLG4sMSksLS10aGlzLnNpemUsITApfSxBdD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fLG49YnQoZSx0KTtyZXR1cm4gbjwwP3ZvaWQgMDplW25dWzFdfSxPdD1mdW5jdGlvbih0KXtyZXR1cm4geHQodGhpcy5fX2RhdGFfXyx0KT4tMX0sTXQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9fZGF0YV9fLHI9d3Qobix0KTtyZXR1cm4gcjwwPygrK3RoaXMuc2l6ZSxuLnB1c2goW3QsZV0pKTpuW3JdWzFdPWUsdGhpc307ZnVuY3Rpb24ga3QodCl7dmFyIGU9LTEsbj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8bjspe3ZhciByPXRbZV07dGhpcy5zZXQoclswXSxyWzFdKX19a3QucHJvdG90eXBlLmNsZWFyPWp0LGt0LnByb3RvdHlwZS5kZWxldGU9U3Qsa3QucHJvdG90eXBlLmdldD1BdCxrdC5wcm90b3R5cGUuaGFzPU90LGt0LnByb3RvdHlwZS5zZXQ9TXQ7dmFyIFB0PWt0LEZ0PVcobCwiTWFwIiksVHQ9Z3QsenQ9UHQsSXQ9RnQ7dmFyICR0PWZ1bmN0aW9uKHQpe3ZhciBlPXR5cGVvZiB0O3JldHVybiJzdHJpbmciPT1lfHwibnVtYmVyIj09ZXx8InN5bWJvbCI9PWV8fCJib29sZWFuIj09ZT8iX19wcm90b19fIiE9PXQ6bnVsbD09PXR9O3ZhciBFdD1mdW5jdGlvbih0LGUpe3ZhciBuPXQuX19kYXRhX187cmV0dXJuICR0KGUpP25bInN0cmluZyI9PXR5cGVvZiBlPyJzdHJpbmciOiJoYXNoIl06bi5tYXB9LE50PUV0O3ZhciBSdD1FdDt2YXIgQ3Q9RXQ7dmFyIEJ0PUV0O3ZhciBVdD1mdW5jdGlvbih0LGUpe3ZhciBuPUJ0KHRoaXMsdCkscj1uLnNpemU7cmV0dXJuIG4uc2V0KHQsZSksdGhpcy5zaXplKz1uLnNpemU9PXI/MDoxLHRoaXN9LEx0PWZ1bmN0aW9uKCl7dGhpcy5zaXplPTAsdGhpcy5fX2RhdGFfXz17aGFzaDpuZXcgVHQsbWFwOm5ldyhJdHx8enQpLHN0cmluZzpuZXcgVHR9fSxEdD1mdW5jdGlvbih0KXt2YXIgZT1OdCh0aGlzLHQpLmRlbGV0ZSh0KTtyZXR1cm4gdGhpcy5zaXplLT1lPzE6MCxlfSxIdD1mdW5jdGlvbih0KXtyZXR1cm4gUnQodGhpcyx0KS5nZXQodCl9LFh0PWZ1bmN0aW9uKHQpe3JldHVybiBDdCh0aGlzLHQpLmhhcyh0KX0sWXQ9VXQ7ZnVuY3Rpb24gS3QodCl7dmFyIGU9LTEsbj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8bjspe3ZhciByPXRbZV07dGhpcy5zZXQoclswXSxyWzFdKX19S3QucHJvdG90eXBlLmNsZWFyPUx0LEt0LnByb3RvdHlwZS5kZWxldGU9RHQsS3QucHJvdG90eXBlLmdldD1IdCxLdC5wcm90b3R5cGUuaGFzPVh0LEt0LnByb3RvdHlwZS5zZXQ9WXQ7dmFyIFp0PUt0LEp0PVp0O2Z1bmN0aW9uIFZ0KHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHR8fG51bGwhPWUmJiJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIkV4cGVjdGVkIGEgZnVuY3Rpb24iKTt2YXIgbj1mdW5jdGlvbigpe3ZhciByPWFyZ3VtZW50cyxpPWU/ZS5hcHBseSh0aGlzLHIpOnJbMF0sbz1uLmNhY2hlO2lmKG8uaGFzKGkpKXJldHVybiBvLmdldChpKTt2YXIgbD10LmFwcGx5KHRoaXMscik7cmV0dXJuIG4uY2FjaGU9by5zZXQoaSxsKXx8byxsfTtyZXR1cm4gbi5jYWNoZT1uZXcoVnQuQ2FjaGV8fEp0KSxufVZ0LkNhY2hlPUp0O3ZhciBXdD1WdDt2YXIgcXQ9L1teLltcXV0rfFxbKD86KC0/XGQrKD86XC5cZCspPyl8KFsiJ10pKCg/Oig/IVwyKVteXFxdfFxcLikqPylcMilcXXwoPz0oPzpcLnxcW1xdKSg/OlwufFxbXF18JCkpL2csR3Q9L1xcKFxcKT8vZyxRdD1mdW5jdGlvbih0KXt2YXIgZT1XdCh0LChmdW5jdGlvbih0KXtyZXR1cm4gNTAwPT09bi5zaXplJiZuLmNsZWFyKCksdH0pKSxuPWUuY2FjaGU7cmV0dXJuIGV9KChmdW5jdGlvbih0KXt2YXIgZT1bXTtyZXR1cm4gNDY9PT10LmNoYXJDb2RlQXQoMCkmJmUucHVzaCgiIiksdC5yZXBsYWNlKHF0LChmdW5jdGlvbih0LG4scixpKXtlLnB1c2gocj9pLnJlcGxhY2UoR3QsIiQxIik6bnx8dCl9KSksZX0pKTt2YXIgdGU9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49LTEscj1udWxsPT10PzA6dC5sZW5ndGgsaT1BcnJheShyKTsrK248cjspaVtuXT1lKHRbbl0sbix0KTtyZXR1cm4gaX0sZWU9dGUsbmU9bixyZT13LGllPWE/YS5wcm90b3R5cGU6dm9pZCAwLG9lPWllP2llLnRvU3RyaW5nOnZvaWQgMDt2YXIgbGU9ZnVuY3Rpb24gdChlKXtpZigic3RyaW5nIj09dHlwZW9mIGUpcmV0dXJuIGU7aWYobmUoZSkpcmV0dXJuIGVlKGUsdCkrIiI7aWYocmUoZSkpcmV0dXJuIG9lP29lLmNhbGwoZSk6IiI7dmFyIG49ZSsiIjtyZXR1cm4iMCI9PW4mJjEvZT09LUluZmluaXR5PyItMCI6bn0sYWU9bGU7dmFyIHNlPW4sdWU9TSxjZT1RdCxmZT1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD8iIjphZSh0KX07dmFyIGhlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHNlKHQpP3Q6dWUodCxlKT9bdF06Y2UoZmUodCkpfSxnZT13O3ZhciB2ZT1mdW5jdGlvbih0KXtpZigic3RyaW5nIj09dHlwZW9mIHR8fGdlKHQpKXJldHVybiB0O3ZhciBlPXQrIiI7cmV0dXJuIjAiPT1lJiYxL3Q9PS1JbmZpbml0eT8iLTAiOmV9LGRlPWhlLHBlPXZlO3ZhciB5ZT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0wLHI9KGU9ZGUoZSx0KSkubGVuZ3RoO251bGwhPXQmJm48cjspdD10W3BlKGVbbisrXSldO3JldHVybiBuJiZuPT1yP3Q6dm9pZCAwfSxtZT15ZTt2YXIgX2U9ZnVuY3Rpb24odCxlLG4pe3ZhciByPW51bGw9PXQ/dm9pZCAwOm1lKHQsZSk7cmV0dXJuIHZvaWQgMD09PXI/bjpyfSxiZT1tLHhlPV87dmFyIHdlPWZ1bmN0aW9uKHQpe3JldHVybiEwPT09dHx8ITE9PT10fHx4ZSh0KSYmIltvYmplY3QgQm9vbGVhbl0iPT1iZSh0KX07ZnVuY3Rpb24gamUodCl7cmV0dXJuIHdlKHQpfWZ1bmN0aW9uIFNlKHQpe3JldHVybiJbb2JqZWN0IFN0cmluZ10iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWZ1bmN0aW9uIEFlKHQpe3JldHVybiEoIVNlKHQpfHwiIj09PXQpfXZhciBPZT17fSxNZT17Z2V0IGV4cG9ydHMoKXtyZXR1cm4gT2V9LHNldCBleHBvcnRzKHQpe09lPXR9fTt2YXIga2U9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49LTEscj1udWxsPT10PzA6dC5sZW5ndGg7KytuPHImJiExIT09ZSh0W25dLG4sdCk7KTtyZXR1cm4gdH07dmFyIFBlPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlLG4scil7Zm9yKHZhciBpPS0xLG89T2JqZWN0KGUpLGw9cihlKSxhPWwubGVuZ3RoO2EtLTspe3ZhciBzPWxbdD9hOisraV07aWYoITE9PT1uKG9bc10scyxvKSlicmVha31yZXR1cm4gZX19KCk7dmFyIEZlPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPS0xLHI9QXJyYXkodCk7KytuPHQ7KXJbbl09ZShuKTtyZXR1cm4gcn0sVGU9bSx6ZT1fO3ZhciBJZT1mdW5jdGlvbih0KXtyZXR1cm4gemUodCkmJiJbb2JqZWN0IEFyZ3VtZW50c10iPT1UZSh0KX0sJGU9XyxFZT1PYmplY3QucHJvdG90eXBlLE5lPUVlLmhhc093blByb3BlcnR5LFJlPUVlLnByb3BlcnR5SXNFbnVtZXJhYmxlLENlPUllKGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50c30oKSk/SWU6ZnVuY3Rpb24odCl7cmV0dXJuICRlKHQpJiZOZS5jYWxsKHQsImNhbGxlZSIpJiYhUmUuY2FsbCh0LCJjYWxsZWUiKX0sQmU9e307dmFyIFVlPWZ1bmN0aW9uKCl7cmV0dXJuITF9OyFmdW5jdGlvbih0LGUpe3ZhciBuPWwscj1VZSxpPWUmJiFlLm5vZGVUeXBlJiZlLG89aSYmdCYmIXQubm9kZVR5cGUmJnQsYT1vJiZvLmV4cG9ydHM9PT1pP24uQnVmZmVyOnZvaWQgMCxzPShhP2EuaXNCdWZmZXI6dm9pZCAwKXx8cjt0LmV4cG9ydHM9c30oe2dldCBleHBvcnRzKCl7cmV0dXJuIEJlfSxzZXQgZXhwb3J0cyh0KXtCZT10fX0sQmUpO3ZhciBMZT0vXig/OjB8WzEtOV1cZCopJC87dmFyIERlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dHlwZW9mIHQ7cmV0dXJuISEoZT1udWxsPT1lPzkwMDcxOTkyNTQ3NDA5OTE6ZSkmJigibnVtYmVyIj09bnx8InN5bWJvbCIhPW4mJkxlLnRlc3QodCkpJiZ0Pi0xJiZ0JTE9PTAmJnQ8ZX07dmFyIEhlPWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdCYmdD4tMSYmdCUxPT0wJiZ0PD05MDA3MTk5MjU0NzQwOTkxfSxYZT1tLFllPUhlLEtlPV8sWmU9e307WmVbIltvYmplY3QgRmxvYXQzMkFycmF5XSJdPVplWyJbb2JqZWN0IEZsb2F0NjRBcnJheV0iXT1aZVsiW29iamVjdCBJbnQ4QXJyYXldIl09WmVbIltvYmplY3QgSW50MTZBcnJheV0iXT1aZVsiW29iamVjdCBJbnQzMkFycmF5XSJdPVplWyJbb2JqZWN0IFVpbnQ4QXJyYXldIl09WmVbIltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIl09WmVbIltvYmplY3QgVWludDE2QXJyYXldIl09WmVbIltvYmplY3QgVWludDMyQXJyYXldIl09ITAsWmVbIltvYmplY3QgQXJndW1lbnRzXSJdPVplWyJbb2JqZWN0IEFycmF5XSJdPVplWyJbb2JqZWN0IEFycmF5QnVmZmVyXSJdPVplWyJbb2JqZWN0IEJvb2xlYW5dIl09WmVbIltvYmplY3QgRGF0YVZpZXddIl09WmVbIltvYmplY3QgRGF0ZV0iXT1aZVsiW29iamVjdCBFcnJvcl0iXT1aZVsiW29iamVjdCBGdW5jdGlvbl0iXT1aZVsiW29iamVjdCBNYXBdIl09WmVbIltvYmplY3QgTnVtYmVyXSJdPVplWyJbb2JqZWN0IE9iamVjdF0iXT1aZVsiW29iamVjdCBSZWdFeHBdIl09WmVbIltvYmplY3QgU2V0XSJdPVplWyJbb2JqZWN0IFN0cmluZ10iXT1aZVsiW29iamVjdCBXZWFrTWFwXSJdPSExO3ZhciBKZT1mdW5jdGlvbih0KXtyZXR1cm4gS2UodCkmJlllKHQubGVuZ3RoKSYmISFaZVtYZSh0KV19O3ZhciBWZT1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQoZSl9fSxXZT17fTshZnVuY3Rpb24odCxlKXt2YXIgbj1yLGk9ZSYmIWUubm9kZVR5cGUmJmUsbz1pJiZ0JiYhdC5ub2RlVHlwZSYmdCxsPW8mJm8uZXhwb3J0cz09PWkmJm4ucHJvY2VzcyxhPWZ1bmN0aW9uKCl7dHJ5e3ZhciB0PW8mJm8ucmVxdWlyZSYmby5yZXF1aXJlKCJ1dGlsIikudHlwZXM7cmV0dXJuIHR8fGwmJmwuYmluZGluZyYmbC5iaW5kaW5nKCJ1dGlsIil9Y2F0Y2godCl7fX0oKTt0LmV4cG9ydHM9YX0oe2dldCBleHBvcnRzKCl7cmV0dXJuIFdlfSxzZXQgZXhwb3J0cyh0KXtXZT10fX0sV2UpO3ZhciBxZT1KZSxHZT1WZSxRZT1XZSYmV2UuaXNUeXBlZEFycmF5LHRuPVFlP0dlKFFlKTpxZSxlbj1GZSxubj1DZSxybj1uLG9uPUJlLGxuPURlLGFuPXRuLHNuPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dmFyIHVuPWZ1bmN0aW9uKHQsZSl7dmFyIG49cm4odCkscj0hbiYmbm4odCksaT0hbiYmIXImJm9uKHQpLG89IW4mJiFyJiYhaSYmYW4odCksbD1ufHxyfHxpfHxvLGE9bD9lbih0Lmxlbmd0aCxTdHJpbmcpOltdLHM9YS5sZW5ndGg7Zm9yKHZhciB1IGluIHQpIWUmJiFzbi5jYWxsKHQsdSl8fGwmJigibGVuZ3RoIj09dXx8aSYmKCJvZmZzZXQiPT11fHwicGFyZW50Ij09dSl8fG8mJigiYnVmZmVyIj09dXx8ImJ5dGVMZW5ndGgiPT11fHwiYnl0ZU9mZnNldCI9PXUpfHxsbih1LHMpKXx8YS5wdXNoKHUpO3JldHVybiBhfSxjbj1PYmplY3QucHJvdG90eXBlO3ZhciBmbj1mdW5jdGlvbih0KXt2YXIgZT10JiZ0LmNvbnN0cnVjdG9yO3JldHVybiB0PT09KCJmdW5jdGlvbiI9PXR5cGVvZiBlJiZlLnByb3RvdHlwZXx8Y24pfTt2YXIgaG49ZnVuY3Rpb24odCxlKXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHQoZShuKSl9fShPYmplY3Qua2V5cyxPYmplY3QpLGduPWZuLHZuPWhuLGRuPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dmFyIHBuPWZ1bmN0aW9uKHQpe2lmKCFnbih0KSlyZXR1cm4gdm4odCk7dmFyIGU9W107Zm9yKHZhciBuIGluIE9iamVjdCh0KSlkbi5jYWxsKHQsbikmJiJjb25zdHJ1Y3RvciIhPW4mJmUucHVzaChuKTtyZXR1cm4gZX0seW49eixtbj1IZTt2YXIgX249ZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPXQmJm1uKHQubGVuZ3RoKSYmIXluKHQpfSxibj11bix4bj1wbix3bj1fbjt2YXIgam49ZnVuY3Rpb24odCl7cmV0dXJuIHduKHQpP2JuKHQpOnhuKHQpfSxTbj1QZSxBbj1qbjt2YXIgT249X247dmFyIE1uPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4scil7aWYobnVsbD09bilyZXR1cm4gbjtpZighT24obikpcmV0dXJuIHQobixyKTtmb3IodmFyIGk9bi5sZW5ndGgsbz1lP2k6LTEsbD1PYmplY3Qobik7KGU/by0tOisrbzxpKSYmITEhPT1yKGxbb10sbyxsKTspO3JldHVybiBufX0oKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQmJlNuKHQsZSxBbil9KSk7dmFyIGtuPWZ1bmN0aW9uKHQpe3JldHVybiB0fSxQbj1rbjt2YXIgRm49a2UsVG49TW4sem49ZnVuY3Rpb24odCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpQbn0sSW49bjt2YXIgJG49ZnVuY3Rpb24odCxlKXtyZXR1cm4oSW4odCk/Rm46VG4pKHQsem4oZSkpfTtNZS5leHBvcnRzPSRuO3ZhciBFbj1lKE9lKSxObj1QdDt2YXIgUm49UHQsQ249RnQsQm49WnQ7dmFyIFVuPVB0LExuPWZ1bmN0aW9uKCl7dGhpcy5fX2RhdGFfXz1uZXcgTm4sdGhpcy5zaXplPTB9LERuPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX19kYXRhX18sbj1lLmRlbGV0ZSh0KTtyZXR1cm4gdGhpcy5zaXplPWUuc2l6ZSxufSxIbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5nZXQodCl9LFhuPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLmhhcyh0KX0sWW49ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9fZGF0YV9fO2lmKG4gaW5zdGFuY2VvZiBSbil7dmFyIHI9bi5fX2RhdGFfXztpZighQ258fHIubGVuZ3RoPDE5OSlyZXR1cm4gci5wdXNoKFt0LGVdKSx0aGlzLnNpemU9KytuLnNpemUsdGhpcztuPXRoaXMuX19kYXRhX189bmV3IEJuKHIpfXJldHVybiBuLnNldCh0LGUpLHRoaXMuc2l6ZT1uLnNpemUsdGhpc307ZnVuY3Rpb24gS24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXz1uZXcgVW4odCk7dGhpcy5zaXplPWUuc2l6ZX1Lbi5wcm90b3R5cGUuY2xlYXI9TG4sS24ucHJvdG90eXBlLmRlbGV0ZT1EbixLbi5wcm90b3R5cGUuZ2V0PUhuLEtuLnByb3RvdHlwZS5oYXM9WG4sS24ucHJvdG90eXBlLnNldD1Zbjt2YXIgWm49S247dmFyIEpuPVp0LFZuPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLnNldCh0LCJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIiksdGhpc30sV249ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKHQpfTtmdW5jdGlvbiBxbih0KXt2YXIgZT0tMSxuPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5fX2RhdGFfXz1uZXcgSm47KytlPG47KXRoaXMuYWRkKHRbZV0pfXFuLnByb3RvdHlwZS5hZGQ9cW4ucHJvdG90eXBlLnB1c2g9Vm4scW4ucHJvdG90eXBlLmhhcz1Xbjt2YXIgR249cW4sUW49ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49LTEscj1udWxsPT10PzA6dC5sZW5ndGg7KytuPHI7KWlmKGUodFtuXSxuLHQpKXJldHVybiEwO3JldHVybiExfSx0cj1mdW5jdGlvbih0LGUpe3JldHVybiB0LmhhcyhlKX07dmFyIGVyPWZ1bmN0aW9uKHQsZSxuLHIsaSxvKXt2YXIgbD0xJm4sYT10Lmxlbmd0aCxzPWUubGVuZ3RoO2lmKGEhPXMmJiEobCYmcz5hKSlyZXR1cm4hMTt2YXIgdT1vLmdldCh0KSxjPW8uZ2V0KGUpO2lmKHUmJmMpcmV0dXJuIHU9PWUmJmM9PXQ7dmFyIGY9LTEsaD0hMCxnPTImbj9uZXcgR246dm9pZCAwO2ZvcihvLnNldCh0LGUpLG8uc2V0KGUsdCk7KytmPGE7KXt2YXIgdj10W2ZdLGQ9ZVtmXTtpZihyKXZhciBwPWw/cihkLHYsZixlLHQsbyk6cih2LGQsZix0LGUsbyk7aWYodm9pZCAwIT09cCl7aWYocCljb250aW51ZTtoPSExO2JyZWFrfWlmKGcpe2lmKCFRbihlLChmdW5jdGlvbih0LGUpe2lmKCF0cihnLGUpJiYodj09PXR8fGkodix0LG4scixvKSkpcmV0dXJuIGcucHVzaChlKX0pKSl7aD0hMTticmVha319ZWxzZSBpZih2IT09ZCYmIWkodixkLG4scixvKSl7aD0hMTticmVha319cmV0dXJuIG8uZGVsZXRlKHQpLG8uZGVsZXRlKGUpLGh9O3ZhciBucj1mdW5jdGlvbih0KXt2YXIgZT0tMSxuPUFycmF5KHQuc2l6ZSk7cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCxyKXtuWysrZV09W3IsdF19KSksbn07dmFyIHJyPWwuVWludDhBcnJheSxpcj1kdCxvcj1lcixscj1ucixhcj1mdW5jdGlvbih0KXt2YXIgZT0tMSxuPUFycmF5KHQuc2l6ZSk7cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCl7blsrK2VdPXR9KSksbn0sc3I9YT9hLnByb3RvdHlwZTp2b2lkIDAsdXI9c3I/c3IudmFsdWVPZjp2b2lkIDA7dmFyIGNyPWZ1bmN0aW9uKHQsZSxuLHIsaSxvLGwpe3N3aXRjaChuKXtjYXNlIltvYmplY3QgRGF0YVZpZXddIjppZih0LmJ5dGVMZW5ndGghPWUuYnl0ZUxlbmd0aHx8dC5ieXRlT2Zmc2V0IT1lLmJ5dGVPZmZzZXQpcmV0dXJuITE7dD10LmJ1ZmZlcixlPWUuYnVmZmVyO2Nhc2UiW29iamVjdCBBcnJheUJ1ZmZlcl0iOnJldHVybiEodC5ieXRlTGVuZ3RoIT1lLmJ5dGVMZW5ndGh8fCFvKG5ldyBycih0KSxuZXcgcnIoZSkpKTtjYXNlIltvYmplY3QgQm9vbGVhbl0iOmNhc2UiW29iamVjdCBEYXRlXSI6Y2FzZSJbb2JqZWN0IE51bWJlcl0iOnJldHVybiBpcigrdCwrZSk7Y2FzZSJbb2JqZWN0IEVycm9yXSI6cmV0dXJuIHQubmFtZT09ZS5uYW1lJiZ0Lm1lc3NhZ2U9PWUubWVzc2FnZTtjYXNlIltvYmplY3QgUmVnRXhwXSI6Y2FzZSJbb2JqZWN0IFN0cmluZ10iOnJldHVybiB0PT1lKyIiO2Nhc2UiW29iamVjdCBNYXBdIjp2YXIgYT1scjtjYXNlIltvYmplY3QgU2V0XSI6dmFyIHM9MSZyO2lmKGF8fChhPWFyKSx0LnNpemUhPWUuc2l6ZSYmIXMpcmV0dXJuITE7dmFyIHU9bC5nZXQodCk7aWYodSlyZXR1cm4gdT09ZTtyfD0yLGwuc2V0KHQsZSk7dmFyIGM9b3IoYSh0KSxhKGUpLHIsaSxvLGwpO3JldHVybiBsLmRlbGV0ZSh0KSxjO2Nhc2UiW29iamVjdCBTeW1ib2xdIjppZih1cilyZXR1cm4gdXIuY2FsbCh0KT09dXIuY2FsbChlKX1yZXR1cm4hMX07dmFyIGZyPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPS0xLHI9ZS5sZW5ndGgsaT10Lmxlbmd0aDsrK248cjspdFtpK25dPWVbbl07cmV0dXJuIHR9LGhyPWZyLGdyPW47dmFyIHZyPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1lKHQpO3JldHVybiBncih0KT9yOmhyKHIsbih0KSl9O3ZhciBkcj1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0tMSxyPW51bGw9PXQ/MDp0Lmxlbmd0aCxpPTAsbz1bXTsrK248cjspe3ZhciBsPXRbbl07ZShsLG4sdCkmJihvW2krK109bCl9cmV0dXJuIG99O3ZhciBwcj1kcix5cj1mdW5jdGlvbigpe3JldHVybltdfSxtcj1PYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLF9yPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsYnI9dnIseHI9X3I/ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/W106KHQ9T2JqZWN0KHQpLHByKF9yKHQpLChmdW5jdGlvbihlKXtyZXR1cm4gbXIuY2FsbCh0LGUpfSkpKX06eXIsd3I9am47dmFyIGpyPWZ1bmN0aW9uKHQpe3JldHVybiBicih0LHdyLHhyKX0sU3I9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt2YXIgQXI9ZnVuY3Rpb24odCxlLG4scixpLG8pe3ZhciBsPTEmbixhPWpyKHQpLHM9YS5sZW5ndGg7aWYocyE9anIoZSkubGVuZ3RoJiYhbClyZXR1cm4hMTtmb3IodmFyIHU9czt1LS07KXt2YXIgYz1hW3VdO2lmKCEobD9jIGluIGU6U3IuY2FsbChlLGMpKSlyZXR1cm4hMX12YXIgZj1vLmdldCh0KSxoPW8uZ2V0KGUpO2lmKGYmJmgpcmV0dXJuIGY9PWUmJmg9PXQ7dmFyIGc9ITA7by5zZXQodCxlKSxvLnNldChlLHQpO2Zvcih2YXIgdj1sOysrdTxzOyl7dmFyIGQ9dFtjPWFbdV1dLHA9ZVtjXTtpZihyKXZhciB5PWw/cihwLGQsYyxlLHQsbyk6cihkLHAsYyx0LGUsbyk7aWYoISh2b2lkIDA9PT15P2Q9PT1wfHxpKGQscCxuLHIsbyk6eSkpe2c9ITE7YnJlYWt9dnx8KHY9ImNvbnN0cnVjdG9yIj09Yyl9aWYoZyYmIXYpe3ZhciBtPXQuY29uc3RydWN0b3IsXz1lLmNvbnN0cnVjdG9yO209PV98fCEoImNvbnN0cnVjdG9yImluIHQpfHwhKCJjb25zdHJ1Y3RvciJpbiBlKXx8ImZ1bmN0aW9uIj09dHlwZW9mIG0mJm0gaW5zdGFuY2VvZiBtJiYiZnVuY3Rpb24iPT10eXBlb2YgXyYmXyBpbnN0YW5jZW9mIF98fChnPSExKX1yZXR1cm4gby5kZWxldGUodCksby5kZWxldGUoZSksZ30sT3I9VyhsLCJEYXRhVmlldyIpLE1yPUZ0LGtyPVcobCwiUHJvbWlzZSIpLFByPVcobCwiU2V0IiksRnI9VyhsLCJXZWFrTWFwIiksVHI9bSx6cj1SLElyPSJbb2JqZWN0IE1hcF0iLCRyPSJbb2JqZWN0IFByb21pc2VdIixFcj0iW29iamVjdCBTZXRdIixOcj0iW29iamVjdCBXZWFrTWFwXSIsUnI9IltvYmplY3QgRGF0YVZpZXddIixDcj16cihPciksQnI9enIoTXIpLFVyPXpyKGtyKSxMcj16cihQciksRHI9enIoRnIpLEhyPVRyOyhPciYmSHIobmV3IE9yKG5ldyBBcnJheUJ1ZmZlcigxKSkpIT1Scnx8TXImJkhyKG5ldyBNcikhPUlyfHxrciYmSHIoa3IucmVzb2x2ZSgpKSE9JHJ8fFByJiZIcihuZXcgUHIpIT1Fcnx8RnImJkhyKG5ldyBGcikhPU5yKSYmKEhyPWZ1bmN0aW9uKHQpe3ZhciBlPVRyKHQpLG49IltvYmplY3QgT2JqZWN0XSI9PWU/dC5jb25zdHJ1Y3Rvcjp2b2lkIDAscj1uP3pyKG4pOiIiO2lmKHIpc3dpdGNoKHIpe2Nhc2UgQ3I6cmV0dXJuIFJyO2Nhc2UgQnI6cmV0dXJuIElyO2Nhc2UgVXI6cmV0dXJuICRyO2Nhc2UgTHI6cmV0dXJuIEVyO2Nhc2UgRHI6cmV0dXJuIE5yfXJldHVybiBlfSk7dmFyIFhyPUhyLFlyPVpuLEtyPWVyLFpyPWNyLEpyPUFyLFZyPVhyLFdyPW4scXI9QmUsR3I9dG4sUXI9IltvYmplY3QgQXJndW1lbnRzXSIsdGk9IltvYmplY3QgQXJyYXldIixlaT0iW29iamVjdCBPYmplY3RdIixuaT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3ZhciByaT1mdW5jdGlvbih0LGUsbixyLGksbyl7dmFyIGw9V3IodCksYT1XcihlKSxzPWw/dGk6VnIodCksdT1hP3RpOlZyKGUpLGM9KHM9cz09UXI/ZWk6cyk9PWVpLGY9KHU9dT09UXI/ZWk6dSk9PWVpLGg9cz09dTtpZihoJiZxcih0KSl7aWYoIXFyKGUpKXJldHVybiExO2w9ITAsYz0hMX1pZihoJiYhYylyZXR1cm4gb3x8KG89bmV3IFlyKSxsfHxHcih0KT9Lcih0LGUsbixyLGksbyk6WnIodCxlLHMsbixyLGksbyk7aWYoISgxJm4pKXt2YXIgZz1jJiZuaS5jYWxsKHQsIl9fd3JhcHBlZF9fIiksdj1mJiZuaS5jYWxsKGUsIl9fd3JhcHBlZF9fIik7aWYoZ3x8dil7dmFyIGQ9Zz90LnZhbHVlKCk6dCxwPXY/ZS52YWx1ZSgpOmU7cmV0dXJuIG98fChvPW5ldyBZciksaShkLHAsbixyLG8pfX1yZXR1cm4hIWgmJihvfHwobz1uZXcgWXIpLEpyKHQsZSxuLHIsaSxvKSl9LGlpPV87dmFyIG9pPWZ1bmN0aW9uIHQoZSxuLHIsaSxvKXtyZXR1cm4gZT09PW58fChudWxsPT1lfHxudWxsPT1ufHwhaWkoZSkmJiFpaShuKT9lIT1lJiZuIT1uOnJpKGUsbixyLGksdCxvKSl9LGxpPVpuLGFpPW9pO3ZhciBzaT1rO3ZhciB1aT1mdW5jdGlvbih0KXtyZXR1cm4gdD09dCYmIXNpKHQpfSxjaT11aSxmaT1qbjt2YXIgaGk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIG51bGwhPW4mJihuW3RdPT09ZSYmKHZvaWQgMCE9PWV8fHQgaW4gT2JqZWN0KG4pKSl9fSxnaT1mdW5jdGlvbih0LGUsbixyKXt2YXIgaT1uLmxlbmd0aCxvPWksbD0hcjtpZihudWxsPT10KXJldHVybiFvO2Zvcih0PU9iamVjdCh0KTtpLS07KXt2YXIgYT1uW2ldO2lmKGwmJmFbMl0/YVsxXSE9PXRbYVswXV06IShhWzBdaW4gdCkpcmV0dXJuITF9Zm9yKDsrK2k8bzspe3ZhciBzPShhPW5baV0pWzBdLHU9dFtzXSxjPWFbMV07aWYobCYmYVsyXSl7aWYodm9pZCAwPT09dSYmIShzIGluIHQpKXJldHVybiExfWVsc2V7dmFyIGY9bmV3IGxpO2lmKHIpdmFyIGg9cih1LGMscyx0LGUsZik7aWYoISh2b2lkIDA9PT1oP2FpKGMsdSwzLHIsZik6aCkpcmV0dXJuITF9fXJldHVybiEwfSx2aT1mdW5jdGlvbih0KXtmb3IodmFyIGU9ZmkodCksbj1lLmxlbmd0aDtuLS07KXt2YXIgcj1lW25dLGk9dFtyXTtlW25dPVtyLGksY2koaSldfXJldHVybiBlfSxkaT1oaTt2YXIgcGk9aGUseWk9Q2UsbWk9bixfaT1EZSxiaT1IZSx4aT12ZTt2YXIgd2k9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbCE9dCYmZSBpbiBPYmplY3QodCl9LGppPWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHI9LTEsaT0oZT1waShlLHQpKS5sZW5ndGgsbz0hMTsrK3I8aTspe3ZhciBsPXhpKGVbcl0pO2lmKCEobz1udWxsIT10JiZuKHQsbCkpKWJyZWFrO3Q9dFtsXX1yZXR1cm4gb3x8KytyIT1pP286ISEoaT1udWxsPT10PzA6dC5sZW5ndGgpJiZiaShpKSYmX2kobCxpKSYmKG1pKHQpfHx5aSh0KSl9O3ZhciBTaT1vaSxBaT1fZSxPaT1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsIT10JiZqaSh0LGUsd2kpfSxNaT1NLGtpPXVpLFBpPWhpLEZpPXZlO3ZhciBUaT1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/dm9pZCAwOmVbdF19fSx6aT15ZTt2YXIgSWk9VGksJGk9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB6aShlLHQpfX0sRWk9TSxOaT12ZTt2YXIgUmk9ZnVuY3Rpb24odCl7dmFyIGU9dmkodCk7cmV0dXJuIDE9PWUubGVuZ3RoJiZlWzBdWzJdP2RpKGVbMF1bMF0sZVswXVsxXSk6ZnVuY3Rpb24obil7cmV0dXJuIG49PT10fHxnaShuLHQsZSl9fSxDaT1mdW5jdGlvbih0LGUpe3JldHVybiBNaSh0KSYma2koZSk/UGkoRmkodCksZSk6ZnVuY3Rpb24obil7dmFyIHI9QWkobix0KTtyZXR1cm4gdm9pZCAwPT09ciYmcj09PWU/T2kobix0KTpTaShlLHIsMyl9fSxCaT1rbixVaT1uLExpPWZ1bmN0aW9uKHQpe3JldHVybiBFaSh0KT9JaShOaSh0KSk6JGkodCl9O3ZhciBEaT1mdW5jdGlvbih0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD90Om51bGw9PXQ/Qmk6Im9iamVjdCI9PXR5cGVvZiB0P1VpKHQpP0NpKHRbMF0sdFsxXSk6UmkodCk6TGkodCl9LEhpPU1uLFhpPV9uO3ZhciBZaT10ZSxLaT1EaSxaaT1mdW5jdGlvbih0LGUpe3ZhciBuPS0xLHI9WGkodCk/QXJyYXkodC5sZW5ndGgpOltdO3JldHVybiBIaSh0LChmdW5jdGlvbih0LGksbyl7clsrK25dPWUodCxpLG8pfSkpLHJ9LEppPW47dmFyIFZpPWZ1bmN0aW9uKHQsZSl7cmV0dXJuKEppKHQpP1lpOlppKSh0LEtpKGUpKX07dmFyIFdpPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuLHI9LTEsaT10Lmxlbmd0aDsrK3I8aTspe3ZhciBvPWUodFtyXSk7dm9pZCAwIT09byYmKG49dm9pZCAwPT09bj9vOm4rbyl9cmV0dXJuIG59LHFpPVdpLEdpPWtuO3ZhciBRaT1mdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5sZW5ndGg/cWkodCxHaSk6MH0sdG89bSxlbz1uLG5vPV87dmFyIHJvPWZ1bmN0aW9uKHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdHx8IWVvKHQpJiZubyh0KSYmIltvYmplY3QgU3RyaW5nXSI9PXRvKHQpfSxpbz1UaSgibGVuZ3RoIiksb289UmVnRXhwKCJbXFx1MjAwZFxcdWQ4MDAtXFx1ZGZmZlxcdTAzMDAtXFx1MDM2ZlxcdWZlMjAtXFx1ZmUyZlxcdTIwZDAtXFx1MjBmZlxcdWZlMGVcXHVmZTBmXSIpO3ZhciBsbz1mdW5jdGlvbih0KXtyZXR1cm4gb28udGVzdCh0KX0sYW89IlxcdWQ4MDAtXFx1ZGZmZiIsc289IlsiK2FvKyJdIix1bz0iW1xcdTAzMDAtXFx1MDM2ZlxcdWZlMjAtXFx1ZmUyZlxcdTIwZDAtXFx1MjBmZl0iLGNvPSJcXHVkODNjW1xcdWRmZmItXFx1ZGZmZl0iLGZvPSJbXiIrYW8rIl0iLGhvPSIoPzpcXHVkODNjW1xcdWRkZTYtXFx1ZGRmZl0pezJ9Iixnbz0iW1xcdWQ4MDAtXFx1ZGJmZl1bXFx1ZGMwMC1cXHVkZmZmXSIsdm89Iig/OiIrdW8rInwiK2NvKyIpIisiPyIscG89IltcXHVmZTBlXFx1ZmUwZl0/Iix5bz1wbyt2bysoIig/OlxcdTIwMGQoPzoiK1tmbyxobyxnb10uam9pbigifCIpKyIpIitwbyt2bysiKSoiKSxtbz0iKD86IitbZm8rdW8rIj8iLHVvLGhvLGdvLHNvXS5qb2luKCJ8IikrIikiLF9vPVJlZ0V4cChjbysiKD89IitjbysiKXwiK21vK3lvLCJnIik7dmFyIGJvPWlvLHhvPWxvLHdvPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1fby5sYXN0SW5kZXg9MDtfby50ZXN0KHQpOykrK2U7cmV0dXJuIGV9O3ZhciBqbz1wbixTbz1YcixBbz1fbixPbz1ybyxNbz1mdW5jdGlvbih0KXtyZXR1cm4geG8odCk/d28odCk6Ym8odCl9O3ZhciBrbz1mdW5jdGlvbih0KXtpZihudWxsPT10KXJldHVybiAwO2lmKEFvKHQpKXJldHVybiBPbyh0KT9Nbyh0KTp0Lmxlbmd0aDt2YXIgZT1Tbyh0KTtyZXR1cm4iW29iamVjdCBNYXBdIj09ZXx8IltvYmplY3QgU2V0XSI9PWU/dC5zaXplOmpvKHQpLmxlbmd0aH0sUG89bSxGbz1fO3ZhciBUbz1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHR8fEZvKHQpJiYiW29iamVjdCBOdW1iZXJdIj09UG8odCl9O2Z1bmN0aW9uIHpvKHQpe3JldHVybiJbb2JqZWN0IE9iamVjdF0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWZ1bmN0aW9uIElvKHQpe2lmKHpvKHQpKXtmb3IobGV0IGUgaW4gdClyZXR1cm4hMDtyZXR1cm4hMX1yZXR1cm4hMX1mdW5jdGlvbiAkbyh0KXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWZ1bmN0aW9uIEVvKHQpe3JldHVybiEhZnVuY3Rpb24odCl7cmV0dXJuIltvYmplY3QgVW5kZWZpbmVkXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9KHQpfHwoISFmdW5jdGlvbih0KXtyZXR1cm4iW29iamVjdCBOdWxsXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9KHQpfHwoISFmdW5jdGlvbih0KXtpZih6byh0KSl7Zm9yKGxldCBlIGluIHQpcmV0dXJuITE7cmV0dXJuITB9cmV0dXJuITF9KHQpfHwoISFmdW5jdGlvbih0KXtyZXR1cm4hKCFTZSh0KXx8IiIhPT10KX0odCl8fCEhZnVuY3Rpb24odCl7cmV0dXJuISEkbyh0KSYmMD09PXQubGVuZ3RofSh0KSkpKX1mdW5jdGlvbiBObyh0KXtyZXR1cm4hISRvKHQpJiYoMCE9PXQubGVuZ3RoJiYoMSE9PXQubGVuZ3RofHwhRW8odFswXSkpKX1mdW5jdGlvbiBSbyh0KXtsZXQgZT0hMTtyZXR1cm4gQWUodCk/ZT0haXNOYU4oTnVtYmVyKHQpKTpmdW5jdGlvbih0KXtyZXR1cm4iW29iamVjdCBOdW1iZXJdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX0odCkmJihlPSEwKSxlfXZhciBDbz0vXHMvO3ZhciBCbz1mdW5jdGlvbih0KXtmb3IodmFyIGU9dC5sZW5ndGg7ZS0tJiZDby50ZXN0KHQuY2hhckF0KGUpKTspO3JldHVybiBlfSxVbz0vXlxzKy87dmFyIExvPWZ1bmN0aW9uKHQpe3JldHVybiB0P3Quc2xpY2UoMCxCbyh0KSsxKS5yZXBsYWNlKFVvLCIiKTp0fSxEbz1rLEhvPXcsWG89L15bLStdMHhbMC05YS1mXSskL2ksWW89L14wYlswMV0rJC9pLEtvPS9eMG9bMC03XSskL2ksWm89cGFyc2VJbnQ7dmFyIEpvPWZ1bmN0aW9uKHQpe2lmKCJudW1iZXIiPT10eXBlb2YgdClyZXR1cm4gdDtpZihIbyh0KSlyZXR1cm4gTmFOO2lmKERvKHQpKXt2YXIgZT0iZnVuY3Rpb24iPT10eXBlb2YgdC52YWx1ZU9mP3QudmFsdWVPZigpOnQ7dD1EbyhlKT9lKyIiOmV9aWYoInN0cmluZyIhPXR5cGVvZiB0KXJldHVybiAwPT09dD90Oit0O3Q9TG8odCk7dmFyIG49WW8udGVzdCh0KTtyZXR1cm4gbnx8S28udGVzdCh0KT9abyh0LnNsaWNlKDIpLG4/Mjo4KTpYby50ZXN0KHQpP05hTjordH0sVm89Sm8sV289MS8wO3ZhciBxbz1mdW5jdGlvbih0KXtyZXR1cm4gdD8odD1Wbyh0KSk9PT1Xb3x8dD09PS0xLzA/MTc5NzY5MzEzNDg2MjMxNTdlMjkyKih0PDA/LTE6MSk6dD09dD90OjA6MD09PXQ/dDowfTtmdW5jdGlvbiBHbyh0KXtpZighUm8odCkpcmV0dXJuIDA7cmV0dXJuIHFvKHQpfWZ1bmN0aW9uIFFvKHQsZSl7cmV0dXJuISF6byh0KSYmKCEoIUFlKGUpJiYhUm8oZSkpJiZlIGluIHQpfWZ1bmN0aW9uIHRsKHQsZT17fSl7aWYoa28odCk8PTApcmV0dXJuW107bGV0IG49X2UoZSwia2V5WCIpO0FlKG4pfHwobj0ieCIpO2xldCByPV9lKGUsImtleVkiKTtBZShyKXx8KHI9InkiKTtsZXQgaT1fZShlLCJrZXlJbmQiLCIiKTtBZShpKXx8KGk9ImluZCIpO2xldCBvPVtdO3JldHVybiBFbih0LCgodCxlKT0+e2xldCBsPW51bGwsYT1udWxsOyRvKHQpJiZrbyh0KT49Mj8obD1fZSh0LDApLGE9X2UodCwxKSk6KGw9X2UodCxuLG51bGwpLGE9X2UodCxyLG51bGwpKSxSbyhsKSYmUm8oYSkmJihsPUpvKGwpLGE9Sm8oYSksby5wdXNoKHt4OmwseTphLFtpXTplfSkpfSkpLG99ZnVuY3Rpb24gZWwodCxlPXt9KXtpZihrbyh0KTw9MClyZXR1cm5bXTtsZXQgbj1fZShlLCJrZXlYIik7QWUobil8fChuPSJ4Iik7bGV0IHI9X2UoZSwia2V5WSIpO0FlKHIpfHwocj0ieSIpO2xldCBpPV9lKGUsImtleVoiLCIiKTtBZShpKXx8KGk9InoiKTtsZXQgbz1fZShlLCJrZXlJbmQiLCIiKTtBZShvKXx8KG89ImluZCIpO2xldCBsPVtdO3JldHVybiBFbih0LCgodCxlKT0+e2xldCBhPW51bGwscz1udWxsLHU9bnVsbDskbyh0KSYma28odCk+PTM/KGE9X2UodCwwKSxzPV9lKHQsMSksdT1fZSh0LDIpKTooYT1fZSh0LG4sbnVsbCkscz1fZSh0LHIsbnVsbCksdT1fZSh0LGksbnVsbCkpLFJvKGEpJiZSbyhzKSYmUm8odSkmJihhPUpvKGEpLHM9Sm8ocyksdT1Kbyh1KSxsLnB1c2goe3g6YSx5OnMsejp1LFtvXTplfSkpfSkpLGx9dmFyIG5sPXc7dmFyIHJsPWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHI9LTEsaT10Lmxlbmd0aDsrK3I8aTspe3ZhciBvPXRbcl0sbD1lKG8pO2lmKG51bGwhPWwmJih2b2lkIDA9PT1hP2w9PWwmJiFubChsKTpuKGwsYSkpKXZhciBhPWwscz1vfXJldHVybiBzfTt2YXIgaWw9cmwsb2w9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdDxlfSxsbD1rbjt2YXIgYWw9ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQubGVuZ3RoP2lsKHQsbGwsb2wpOnZvaWQgMH07dmFyIHNsPXJsLHVsPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ+ZX0sY2w9a247dmFyIGZsPWZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0Lmxlbmd0aD9zbCh0LGNsLHVsKTp2b2lkIDB9O2Z1bmN0aW9uIGhsKHQpe3JldHVybiBobD0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYic3ltYm9sIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbih0KXtyZXR1cm4gdHlwZW9mIHR9OmZ1bmN0aW9uKHQpe3JldHVybiB0JiYiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZ0LmNvbnN0cnVjdG9yPT09U3ltYm9sJiZ0IT09U3ltYm9sLnByb3RvdHlwZT8ic3ltYm9sIjp0eXBlb2YgdH0saGwodCl9ZnVuY3Rpb24gZ2wodCl7dmFyIGU9ZnVuY3Rpb24odCxlKXtpZigib2JqZWN0IiE9PWhsKHQpfHxudWxsPT09dClyZXR1cm4gdDt2YXIgbj10W1N5bWJvbC50b1ByaW1pdGl2ZV07aWYodm9pZCAwIT09bil7dmFyIHI9bi5jYWxsKHQsZXx8ImRlZmF1bHQiKTtpZigib2JqZWN0IiE9PWhsKHIpKXJldHVybiByO3Rocm93IG5ldyBUeXBlRXJyb3IoIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuIil9cmV0dXJuKCJzdHJpbmciPT09ZT9TdHJpbmc6TnVtYmVyKSh0KX0odCwic3RyaW5nIik7cmV0dXJuInN5bWJvbCI9PT1obChlKT9lOlN0cmluZyhlKX1mdW5jdGlvbiB2bCh0LGUsbil7cmV0dXJuKGU9Z2woZSkpaW4gdD9PYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLHt2YWx1ZTpuLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSk6dFtlXT1uLHR9dmFyIGRsPU1uO3ZhciBwbD1kcix5bD1mdW5jdGlvbih0LGUpe3ZhciBuPVtdO3JldHVybiBkbCh0LChmdW5jdGlvbih0LHIsaSl7ZSh0LHIsaSkmJm4ucHVzaCh0KX0pKSxufSxtbD1EaSxfbD1uO3ZhciBibD1mdW5jdGlvbih0LGUpe3JldHVybihfbCh0KT9wbDp5bCkodCxtbChlKSl9LHhsPU1hdGguY2VpbCx3bD1NYXRoLm1heDt2YXIgamw9ZHQsU2w9X24sQWw9RGUsT2w9azt2YXIgTWw9ZnVuY3Rpb24odCxlLG4scil7Zm9yKHZhciBpPS0xLG89d2woeGwoKGUtdCkvKG58fDEpKSwwKSxsPUFycmF5KG8pO28tLTspbFtyP286KytpXT10LHQrPW47cmV0dXJuIGx9LGtsPWZ1bmN0aW9uKHQsZSxuKXtpZighT2wobikpcmV0dXJuITE7dmFyIHI9dHlwZW9mIGU7cmV0dXJuISEoIm51bWJlciI9PXI/U2wobikmJkFsKGUsbi5sZW5ndGgpOiJzdHJpbmciPT1yJiZlIGluIG4pJiZqbChuW2VdLHQpfSxQbD1xbzt2YXIgRmw9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUsbixyKXtyZXR1cm4gciYmIm51bWJlciIhPXR5cGVvZiByJiZrbChlLG4scikmJihuPXI9dm9pZCAwKSxlPVBsKGUpLHZvaWQgMD09PW4/KG49ZSxlPTApOm49UGwobikscj12b2lkIDA9PT1yP2U8bj8xOi0xOlBsKHIpLE1sKGUsbixyLHQpfX0oKSxUbD1XaTt2YXIgemw9ZnVuY3Rpb24odCxlKXt2YXIgbj1udWxsPT10PzA6dC5sZW5ndGg7cmV0dXJuIG4/VGwodCxlKS9uOk5hTn0sSWw9a247dmFyICRsPWZ1bmN0aW9uKHQpe3JldHVybiB6bCh0LElsKX07ZnVuY3Rpb24gRWwodCxlKXt2YXIgbj1PYmplY3Qua2V5cyh0KTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgcj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHQpO2UmJihyPXIuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LGUpLmVudW1lcmFibGV9KSkpLG4ucHVzaC5hcHBseShuLHIpfXJldHVybiBufWZ1bmN0aW9uIE5sKHQpe2lmKCFObyh0KSlyZXR1cm57ZXJyOiJhcnIgaXMgbm90IGFuIGVmZmVjdGl2ZSBhcnJheSJ9O2xldCBlPV9lKHQsMCksbj0wO05vKGUpJiYobj1rbyhlKSk7bGV0IHI9W107aWYoMD09PW4/KHI9YmwodCxSbykscj1WaShyLEdvKSk6RW4odCwodD0+e2xldCBlPSEwLGk9W107RW4oRmwobiksKG49PntsZXQgcj1fZSh0LG4pO1JvKHIpfHwoZT0hMSksaS5wdXNoKEdvKHIpKX0pKSxlJiZyLnB1c2goaSl9KSksMD09PWtvKHIpKXJldHVybntlcnI6ImFyciBoYXMgbm8gZWZmZWN0aXZlIGRhdGEifTtsZXQgaT10PT57bGV0IGU9KHQ9PntsZXQgZT1hbCh0KSxuPWZsKHQpO3JldHVybnttaW46ZSxtYXg6bixyYW5nZTpuLWUsbWlkOihuK2UpLzIsYXZnOiRsKHQpfX0pKHQpLG49KCh0LGUsbixyKT0+VmkodCwodD0+KHQtZSkvcikpKSh0LGUubWluLGUubWF4LGUucmFuZ2UpO3JldHVybiBmdW5jdGlvbih0KXtmb3IodmFyIGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXt2YXIgbj1udWxsIT1hcmd1bWVudHNbZV0/YXJndW1lbnRzW2VdOnt9O2UlMj9FbChPYmplY3QobiksITApLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZsKHQsZSxuW2VdKX0pKTpPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycz9PYmplY3QuZGVmaW5lUHJvcGVydGllcyh0LE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG4pKTpFbChPYmplY3QobikpLmZvckVhY2goKGZ1bmN0aW9uKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihuLGUpKX0pKX1yZXR1cm4gdH0oe2FycjpufSxlKX0sbz1udWxsO3JldHVybiBvPTA9PT1uP2kocik6VmkoRmwobiksKHQ9PntsZXQgZT1WaShyLHQpO3JldHVybiBpKGUpfSkpLG99ZnVuY3Rpb24gUmwodCxlPVtdKXtpZighTm8odCkpcmV0dXJue2VycjoiYXJyIGlzIG5vdCBhbiBlZmZlY3RpdmUgYXJyYXkifTtpZihrbyhlKT4wKXtpZighSW8oX2UodCwwKSkpcmV0dXJue2VycjoiYXJyIGlzIG5vdCBhbiBlZmZlY3RpdmUgYXJyYXkgb2Ygb2JqZWN0cyJ9O2xldCBuPVtdO0VuKHQsKHQ9PntsZXQgcj1bXTtFbihlLChlPT57ci5wdXNoKF9lKHQsZSwiIikpfSkpLG4ucHVzaChyKX0pKSx0PW59cmV0dXJuIE5sKHQpfWZ1bmN0aW9uIENsKHQsZT17fSl7bGV0IG49X2UoZSwia2V5WCIpO0FlKG4pfHwobj0ieCIpO2xldCByPV9lKGUsImtleVkiKTtBZShyKXx8KHI9InkiKTtsZXQgaT1fZShlLCJrZXlaIiwiIik7QWUoaSl8fChpPSJ6Iik7bGV0IG89X2UoZSwia2V5SW5kIiwiIik7QWUobyl8fChvPSJpbmQiKTtsZXQgbD1fZShlLCJzY2FsZSIpO2lmKFJvKGwpfHwobD0xKSxsPUdvKGwpLGw8PTApdGhyb3cgbmV3IEVycm9yKCJzY2FsZSBuZWVkID49IDAiKTtsZXQgYT1SbChWaSh0LG4pKSxzPVJsKFZpKHQscikpLHU9UmwoVmkodCxpKSksYz1NYXRoLm1heChhLnJhbmdlLHMucmFuZ2UpLGY9Yy8yLGg9W3ttaW46YS5taWQtZixtYXg6YS5taWQrZixyYW5nZTpjfSx7bWluOnMubWlkLWYsbWF4OnMubWlkK2YscmFuZ2U6Y30se21pbjp1Lm1pbixtYXg6dS5tYXgscmFuZ2U6dS5yYW5nZX1dLGc9KHQsZSk9PlRvKHQpP2hbZV0ucmFuZ2U8PTA/dDoodC1oW2VdLm1pbikvaFtlXS5yYW5nZSpsOm51bGw7dD1WaSh0LCh0PT57bGV0IGU9Zyh0W25dLDApLGw9Zyh0W3JdLDEpLGE9Zyh0W2ldLDIpLHM9dFtvXTtyZXR1cm57W25dOmUsW3JdOmwsW2ldOmEsW29dOnN9fSkpO2xldCB2PVZpKHQsbiksZD1hbCh2KSxwPWZsKHYpLHk9VmkodCxyKSxtPWFsKHkpLF89ZmwoeSksYj1WaSh0LGkpO3JldHVybntwczp0LHBzTWluTWF4Ont4bWluOmQseG1heDpwLHltaW46bSx5bWF4Ol8sem1pbjphbChiKSx6bWF4OmZsKGIpfSxzdDpoLG52OmcsaW52Oih0LGUpPT5Ubyh0KT9sPD0wP3Q6dC9sKmhbZV0ucmFuZ2UraFtlXS5taW46bnVsbH19dmFyIEJsPUNlLFVsPW4sTGw9YT9hLmlzQ29uY2F0U3ByZWFkYWJsZTp2b2lkIDA7dmFyIERsPWZyLEhsPWZ1bmN0aW9uKHQpe3JldHVybiBVbCh0KXx8QmwodCl8fCEhKExsJiZ0JiZ0W0xsXSl9O3ZhciBYbD1mdW5jdGlvbiB0KGUsbixyLGksbyl7dmFyIGw9LTEsYT1lLmxlbmd0aDtmb3Iocnx8KHI9SGwpLG98fChvPVtdKTsrK2w8YTspe3ZhciBzPWVbbF07bj4wJiZyKHMpP24+MT90KHMsbi0xLHIsaSxvKTpEbChvLHMpOml8fChvW28ubGVuZ3RoXT1zKX1yZXR1cm4gb30sWWw9WGw7dmFyIEtsPWZ1bmN0aW9uKHQpe3JldHVybihudWxsPT10PzA6dC5sZW5ndGgpP1lsKHQsMSk6W119O2Z1bmN0aW9uIFpsKHQpe2xldCBlPWZ1bmN0aW9uKHQpe2xldCBlPWtvKF9lKHQsIjAiLG51bGwpKSxuPWtvKF9lKHQsIjAuMCIsbnVsbCkpO3JldHVybiAyPT09a28oX2UodCwiMC4wLjAiLG51bGwpKT8zOjI9PT1uPzI6Mj09PWU/MTowPT09ZT8wOihjb25zb2xlLmxvZygiaW52YWxpZCBwb2ludCBkZXB0aCIsdCksbnVsbCl9KHQpO3JldHVybiAzPT09ZT9LbCh0KToyPT09ZT90OjE9PT1lP1t0XTowPT09ZT9bXTp0fWZ1bmN0aW9uIEpsKHQpe2lmKCFObyh0KSlyZXR1cm4gMDt0PVpsKHQpO2xldCBlPTA7cmV0dXJuIEVuKHQsKCh0LG4pPT57bGV0IHI9ZnVuY3Rpb24odCxlPXt9KXtsZXQgbj1fZShlLCJ1c2VBYnMiKTtpZihqZShuKXx8KG49ITApLCFObyh0KSlyZXR1cm4gMDtsZXQgcj1bXTtpZihFbih0LCh0PT57Mj09PWtvKHQpJiZSbyh0WzBdKSYmUm8odFsxXSkmJnIucHVzaChbR28odFswXSksR28odFsxXSldKX0pKSwhTm8ocikpcmV0dXJuIDA7bGV0IGksbz0tMSxsPWtvKHIpLGE9cltsLTFdLHM9MDtmb3IoOysrbzxsOylpPWEsYT1yW29dLHMrPWlbMV0qYVswXS1pWzBdKmFbMV07bGV0IHU9cy8yO3JldHVybiBuJiYodT1NYXRoLmFicyh1KSksdX0odCk7MD09PW4/ZT1yOmUtPXJ9KSksZTwwPzA6ZX12YXIgVmw9ZnVuY3Rpb24odCl7Im51bWJlciIhPXR5cGVvZiB0JiYodD0xZS0xMCk7dmFyIGU9e2Vwc2lsb246ZnVuY3Rpb24oZSl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiBlJiYodD1lKSx0fSxwb2ludEFib3ZlT3JPbkxpbmU6ZnVuY3Rpb24oZSxuLHIpe3ZhciBpPW5bMF0sbz1uWzFdLGw9clswXSxhPXJbMV0scz1lWzBdO3JldHVybihsLWkpKihlWzFdLW8pLShhLW8pKihzLWkpPj0tdH0scG9pbnRCZXR3ZWVuOmZ1bmN0aW9uKGUsbixyKXt2YXIgaT1lWzFdLW5bMV0sbz1yWzBdLW5bMF0sbD1lWzBdLW5bMF0sYT1yWzFdLW5bMV0scz1sKm8raSphO3JldHVybiEoczx0KSYmIShzLShvKm8rYSphKT4tdCl9LHBvaW50c1NhbWVYOmZ1bmN0aW9uKGUsbil7cmV0dXJuIE1hdGguYWJzKGVbMF0tblswXSk8dH0scG9pbnRzU2FtZVk6ZnVuY3Rpb24oZSxuKXtyZXR1cm4gTWF0aC5hYnMoZVsxXS1uWzFdKTx0fSxwb2ludHNTYW1lOmZ1bmN0aW9uKHQsbil7cmV0dXJuIGUucG9pbnRzU2FtZVgodCxuKSYmZS5wb2ludHNTYW1lWSh0LG4pfSxwb2ludHNDb21wYXJlOmZ1bmN0aW9uKHQsbil7cmV0dXJuIGUucG9pbnRzU2FtZVgodCxuKT9lLnBvaW50c1NhbWVZKHQsbik/MDp0WzFdPG5bMV0/LTE6MTp0WzBdPG5bMF0/LTE6MX0scG9pbnRzQ29sbGluZWFyOmZ1bmN0aW9uKGUsbixyKXt2YXIgaT1lWzBdLW5bMF0sbz1lWzFdLW5bMV0sbD1uWzBdLXJbMF0sYT1uWzFdLXJbMV07cmV0dXJuIE1hdGguYWJzKGkqYS1sKm8pPHR9LGxpbmVzSW50ZXJzZWN0OmZ1bmN0aW9uKGUsbixyLGkpe3ZhciBvPW5bMF0tZVswXSxsPW5bMV0tZVsxXSxhPWlbMF0tclswXSxzPWlbMV0tclsxXSx1PW8qcy1sKmE7aWYoTWF0aC5hYnModSk8dClyZXR1cm4hMTt2YXIgYz1lWzBdLXJbMF0sZj1lWzFdLXJbMV0saD0oYSpmLXMqYykvdSxnPShvKmYtbCpjKS91LHY9e2Fsb25nQTowLGFsb25nQjowLHB0OltlWzBdK2gqbyxlWzFdK2gqbF19O3JldHVybiB2LmFsb25nQT1oPD0tdD8tMjpoPHQ/LTE6aC0xPD0tdD8wOmgtMTx0PzE6Mix2LmFsb25nQj1nPD0tdD8tMjpnPHQ/LTE6Zy0xPD0tdD8wOmctMTx0PzE6Mix2fSxwb2ludEluc2lkZVJlZ2lvbjpmdW5jdGlvbihlLG4pe2Zvcih2YXIgcj1lWzBdLGk9ZVsxXSxvPW5bbi5sZW5ndGgtMV1bMF0sbD1uW24ubGVuZ3RoLTFdWzFdLGE9ITEscz0wO3M8bi5sZW5ndGg7cysrKXt2YXIgdT1uW3NdWzBdLGM9bltzXVsxXTtjLWk+dCE9bC1pPnQmJihvLXUpKihpLWMpLyhsLWMpK3Utcj50JiYoYT0hYSksbz11LGw9Y31yZXR1cm4gYX19O3JldHVybiBlfSxXbD17Y3JlYXRlOmZ1bmN0aW9uKCl7dmFyIHQ9e3Jvb3Q6e3Jvb3Q6ITAsbmV4dDpudWxsfSxleGlzdHM6ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGwhPT1lJiZlIT09dC5yb290fSxpc0VtcHR5OmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PT10LnJvb3QubmV4dH0sZ2V0SGVhZDpmdW5jdGlvbigpe3JldHVybiB0LnJvb3QubmV4dH0saW5zZXJ0QmVmb3JlOmZ1bmN0aW9uKGUsbil7Zm9yKHZhciByPXQucm9vdCxpPXQucm9vdC5uZXh0O251bGwhPT1pOyl7aWYobihpKSlyZXR1cm4gZS5wcmV2PWkucHJldixlLm5leHQ9aSxpLnByZXYubmV4dD1lLHZvaWQoaS5wcmV2PWUpO3I9aSxpPWkubmV4dH1yLm5leHQ9ZSxlLnByZXY9cixlLm5leHQ9bnVsbH0sZmluZFRyYW5zaXRpb246ZnVuY3Rpb24oZSl7Zm9yKHZhciBuPXQucm9vdCxyPXQucm9vdC5uZXh0O251bGwhPT1yJiYhZShyKTspbj1yLHI9ci5uZXh0O3JldHVybntiZWZvcmU6bj09PXQucm9vdD9udWxsOm4sYWZ0ZXI6cixpbnNlcnQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQucHJldj1uLHQubmV4dD1yLG4ubmV4dD10LG51bGwhPT1yJiYoci5wcmV2PXQpLHR9fX19O3JldHVybiB0fSxub2RlOmZ1bmN0aW9uKHQpe3JldHVybiB0LnByZXY9bnVsbCx0Lm5leHQ9bnVsbCx0LnJlbW92ZT1mdW5jdGlvbigpe3QucHJldi5uZXh0PXQubmV4dCx0Lm5leHQmJih0Lm5leHQucHJldj10LnByZXYpLHQucHJldj1udWxsLHQubmV4dD1udWxsfSx0fX07dmFyIHFsPWZ1bmN0aW9uKHQsZSxuKXtmdW5jdGlvbiByKHQsZSxyKXtyZXR1cm57aWQ6bj9uLnNlZ21lbnRJZCgpOi0xLHN0YXJ0OnQsZW5kOmUsbXlGaWxsOnthYm92ZTpyLm15RmlsbC5hYm92ZSxiZWxvdzpyLm15RmlsbC5iZWxvd30sb3RoZXJGaWxsOm51bGx9fXZhciBpPVdsLmNyZWF0ZSgpO2Z1bmN0aW9uIG8odCxuKXtpLmluc2VydEJlZm9yZSh0LChmdW5jdGlvbihyKXtyZXR1cm4gZnVuY3Rpb24odCxuLHIsaSxvLGwpe3ZhciBhPWUucG9pbnRzQ29tcGFyZShuLG8pO3JldHVybiAwIT09YT9hOmUucG9pbnRzU2FtZShyLGwpPzA6dCE9PWk/dD8xOi0xOmUucG9pbnRBYm92ZU9yT25MaW5lKHIsaT9vOmwsaT9sOm8pPzE6LTF9KHQuaXNTdGFydCx0LnB0LG4sci5pc1N0YXJ0LHIucHQsci5vdGhlci5wdCk8MH0pKX1mdW5jdGlvbiBsKHQsZSl7dmFyIG49ZnVuY3Rpb24odCxlKXt2YXIgbj1XbC5ub2RlKHtpc1N0YXJ0OiEwLHB0OnQuc3RhcnQsc2VnOnQscHJpbWFyeTplLG90aGVyOm51bGwsc3RhdHVzOm51bGx9KTtyZXR1cm4gbyhuLHQuZW5kKSxufSh0LGUpO3JldHVybiBmdW5jdGlvbih0LGUsbil7dmFyIHI9V2wubm9kZSh7aXNTdGFydDohMSxwdDplLmVuZCxzZWc6ZSxwcmltYXJ5Om4sb3RoZXI6dCxzdGF0dXM6bnVsbH0pO3Qub3RoZXI9cixvKHIsdC5wdCl9KG4sdCxlKSxufWZ1bmN0aW9uIGEodCxlKXt2YXIgaT1yKGUsdC5zZWcuZW5kLHQuc2VnKTtyZXR1cm4gZnVuY3Rpb24odCxlKXtuJiZuLnNlZ21lbnRDaG9wKHQuc2VnLGUpLHQub3RoZXIucmVtb3ZlKCksdC5zZWcuZW5kPWUsdC5vdGhlci5wdD1lLG8odC5vdGhlcix0LnB0KX0odCxlKSxsKGksdC5wcmltYXJ5KX1mdW5jdGlvbiBzKHIsbyl7dmFyIGw9V2wuY3JlYXRlKCk7ZnVuY3Rpb24gcyh0KXtyZXR1cm4gbC5maW5kVHJhbnNpdGlvbigoZnVuY3Rpb24obil7dmFyIHIsaSxvLGwsYSxzO3JldHVybihyPXQsaT1uLmV2LG89ci5zZWcuc3RhcnQsbD1yLnNlZy5lbmQsYT1pLnNlZy5zdGFydCxzPWkuc2VnLmVuZCxlLnBvaW50c0NvbGxpbmVhcihvLGEscyk/ZS5wb2ludHNDb2xsaW5lYXIobCxhLHMpfHxlLnBvaW50QWJvdmVPck9uTGluZShsLGEscyk/MTotMTplLnBvaW50QWJvdmVPck9uTGluZShvLGEscyk/MTotMSk+MH0pKX1mdW5jdGlvbiB1KHQscil7dmFyIGk9dC5zZWcsbz1yLnNlZyxsPWkuc3RhcnQscz1pLmVuZCx1PW8uc3RhcnQsYz1vLmVuZDtuJiZuLmNoZWNrSW50ZXJzZWN0aW9uKGksbyk7dmFyIGY9ZS5saW5lc0ludGVyc2VjdChsLHMsdSxjKTtpZighMT09PWYpe2lmKCFlLnBvaW50c0NvbGxpbmVhcihsLHMsdSkpcmV0dXJuITE7aWYoZS5wb2ludHNTYW1lKGwsYyl8fGUucG9pbnRzU2FtZShzLHUpKXJldHVybiExO3ZhciBoPWUucG9pbnRzU2FtZShsLHUpLGc9ZS5wb2ludHNTYW1lKHMsYyk7aWYoaCYmZylyZXR1cm4gcjt2YXIgdj0haCYmZS5wb2ludEJldHdlZW4obCx1LGMpLGQ9IWcmJmUucG9pbnRCZXR3ZWVuKHMsdSxjKTtpZihoKXJldHVybiBkP2EocixzKTphKHQsYykscjt2JiYoZ3x8KGQ/YShyLHMpOmEodCxjKSksYShyLGwpKX1lbHNlIDA9PT1mLmFsb25nQSYmKC0xPT09Zi5hbG9uZ0I/YSh0LHUpOjA9PT1mLmFsb25nQj9hKHQsZi5wdCk6MT09PWYuYWxvbmdCJiZhKHQsYykpLDA9PT1mLmFsb25nQiYmKC0xPT09Zi5hbG9uZ0E/YShyLGwpOjA9PT1mLmFsb25nQT9hKHIsZi5wdCk6MT09PWYuYWxvbmdBJiZhKHIscykpO3JldHVybiExfWZvcih2YXIgYz1bXTshaS5pc0VtcHR5KCk7KXt2YXIgZj1pLmdldEhlYWQoKTtpZihuJiZuLnZlcnQoZi5wdFswXSksZi5pc1N0YXJ0KXtuJiZuLnNlZ21lbnROZXcoZi5zZWcsZi5wcmltYXJ5KTt2YXIgaD1zKGYpLGc9aC5iZWZvcmU/aC5iZWZvcmUuZXY6bnVsbCx2PWguYWZ0ZXI/aC5hZnRlci5ldjpudWxsO2Z1bmN0aW9uIGQoKXtpZihnKXt2YXIgdD11KGYsZyk7aWYodClyZXR1cm4gdH1yZXR1cm4hIXYmJnUoZix2KX1uJiZuLnRlbXBTdGF0dXMoZi5zZWcsISFnJiZnLnNlZywhIXYmJnYuc2VnKTt2YXIgcCx5PWQoKTtpZih5KXt2YXIgbTtpZih0KShtPW51bGw9PT1mLnNlZy5teUZpbGwuYmVsb3d8fGYuc2VnLm15RmlsbC5hYm92ZSE9PWYuc2VnLm15RmlsbC5iZWxvdykmJih5LnNlZy5teUZpbGwuYWJvdmU9IXkuc2VnLm15RmlsbC5hYm92ZSk7ZWxzZSB5LnNlZy5vdGhlckZpbGw9Zi5zZWcubXlGaWxsO24mJm4uc2VnbWVudFVwZGF0ZSh5LnNlZyksZi5vdGhlci5yZW1vdmUoKSxmLnJlbW92ZSgpfWlmKGkuZ2V0SGVhZCgpIT09Zil7biYmbi5yZXdpbmQoZi5zZWcpO2NvbnRpbnVlfWlmKHQpbT1udWxsPT09Zi5zZWcubXlGaWxsLmJlbG93fHxmLnNlZy5teUZpbGwuYWJvdmUhPT1mLnNlZy5teUZpbGwuYmVsb3csZi5zZWcubXlGaWxsLmJlbG93PXY/di5zZWcubXlGaWxsLmFib3ZlOnIsZi5zZWcubXlGaWxsLmFib3ZlPW0/IWYuc2VnLm15RmlsbC5iZWxvdzpmLnNlZy5teUZpbGwuYmVsb3c7ZWxzZSBpZihudWxsPT09Zi5zZWcub3RoZXJGaWxsKXA9dj9mLnByaW1hcnk9PT12LnByaW1hcnk/di5zZWcub3RoZXJGaWxsLmFib3ZlOnYuc2VnLm15RmlsbC5hYm92ZTpmLnByaW1hcnk/bzpyLGYuc2VnLm90aGVyRmlsbD17YWJvdmU6cCxiZWxvdzpwfTtuJiZuLnN0YXR1cyhmLnNlZywhIWcmJmcuc2VnLCEhdiYmdi5zZWcpLGYub3RoZXIuc3RhdHVzPWguaW5zZXJ0KFdsLm5vZGUoe2V2OmZ9KSl9ZWxzZXt2YXIgXz1mLnN0YXR1cztpZihudWxsPT09Xyl0aHJvdyBuZXcgRXJyb3IoIlBvbHlCb29sOiBaZXJvLWxlbmd0aCBzZWdtZW50IGRldGVjdGVkOyB5b3VyIGVwc2lsb24gaXMgcHJvYmFibHkgdG9vIHNtYWxsIG9yIHRvbyBsYXJnZSIpO2lmKGwuZXhpc3RzKF8ucHJldikmJmwuZXhpc3RzKF8ubmV4dCkmJnUoXy5wcmV2LmV2LF8ubmV4dC5ldiksbiYmbi5zdGF0dXNSZW1vdmUoXy5ldi5zZWcpLF8ucmVtb3ZlKCksIWYucHJpbWFyeSl7dmFyIGI9Zi5zZWcubXlGaWxsO2Yuc2VnLm15RmlsbD1mLnNlZy5vdGhlckZpbGwsZi5zZWcub3RoZXJGaWxsPWJ9Yy5wdXNoKGYuc2VnKX1pLmdldEhlYWQoKS5yZW1vdmUoKX1yZXR1cm4gbiYmbi5kb25lKCksY31yZXR1cm4gdD97YWRkUmVnaW9uOmZ1bmN0aW9uKHQpe2Zvcih2YXIgcixpLG8sYT10W3QubGVuZ3RoLTFdLHM9MDtzPHQubGVuZ3RoO3MrKyl7cj1hLGE9dFtzXTt2YXIgdT1lLnBvaW50c0NvbXBhcmUocixhKTswIT09dSYmbCgoaT11PDA/cjphLG89dTwwP2E6cix7aWQ6bj9uLnNlZ21lbnRJZCgpOi0xLHN0YXJ0OmksZW5kOm8sbXlGaWxsOnthYm92ZTpudWxsLGJlbG93Om51bGx9LG90aGVyRmlsbDpudWxsfSksITApfX0sY2FsY3VsYXRlOmZ1bmN0aW9uKHQpe3JldHVybiBzKHQsITEpfX06e2NhbGN1bGF0ZTpmdW5jdGlvbih0LGUsbixpKXtyZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbih0KXtsKHIodC5zdGFydCx0LmVuZCx0KSwhMCl9KSksbi5mb3JFYWNoKChmdW5jdGlvbih0KXtsKHIodC5zdGFydCx0LmVuZCx0KSwhMSl9KSkscyhlLGkpfX19O3ZhciBHbD1mdW5jdGlvbih0LGUsbil7dmFyIHI9W10saT1bXTtyZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgbz10LnN0YXJ0LGw9dC5lbmQ7aWYoZS5wb2ludHNTYW1lKG8sbCkpY29uc29sZS53YXJuKCJQb2x5Qm9vbDogV2FybmluZzogWmVyby1sZW5ndGggc2VnbWVudCBkZXRlY3RlZDsgeW91ciBlcHNpbG9uIGlzIHByb2JhYmx5IHRvbyBzbWFsbCBvciB0b28gbGFyZ2UiKTtlbHNle24mJm4uY2hhaW5TdGFydCh0KTtmb3IodmFyIGE9e2luZGV4OjAsbWF0Y2hlc19oZWFkOiExLG1hdGNoZXNfcHQxOiExfSxzPXtpbmRleDowLG1hdGNoZXNfaGVhZDohMSxtYXRjaGVzX3B0MTohMX0sdT1hLGM9MDtjPHIubGVuZ3RoO2MrKyl7dmFyIGY9KHA9cltjXSlbMF07cFsxXTt2YXIgaD1wW3AubGVuZ3RoLTFdO2lmKHBbcC5sZW5ndGgtMl0sZS5wb2ludHNTYW1lKGYsbykpe2lmKFMoYywhMCwhMCkpYnJlYWt9ZWxzZSBpZihlLnBvaW50c1NhbWUoZixsKSl7aWYoUyhjLCEwLCExKSlicmVha31lbHNlIGlmKGUucG9pbnRzU2FtZShoLG8pKXtpZihTKGMsITEsITApKWJyZWFrfWVsc2UgaWYoZS5wb2ludHNTYW1lKGgsbCkmJlMoYywhMSwhMSkpYnJlYWt9aWYodT09PWEpcmV0dXJuIHIucHVzaChbbyxsXSksdm9pZChuJiZuLmNoYWluTmV3KG8sbCkpO2lmKHU9PT1zKXtuJiZuLmNoYWluTWF0Y2goYS5pbmRleCk7dmFyIGc9YS5pbmRleCx2PWEubWF0Y2hlc19wdDE/bDpvLGQ9YS5tYXRjaGVzX2hlYWQscD1yW2ddLHk9ZD9wWzBdOnBbcC5sZW5ndGgtMV0sbT1kP3BbMV06cFtwLmxlbmd0aC0yXSxfPWQ/cFtwLmxlbmd0aC0xXTpwWzBdLGI9ZD9wW3AubGVuZ3RoLTJdOnBbMV07cmV0dXJuIGUucG9pbnRzQ29sbGluZWFyKG0seSx2KSYmKGQ/KG4mJm4uY2hhaW5SZW1vdmVIZWFkKGEuaW5kZXgsdikscC5zaGlmdCgpKToobiYmbi5jaGFpblJlbW92ZVRhaWwoYS5pbmRleCx2KSxwLnBvcCgpKSx5PW0pLGUucG9pbnRzU2FtZShfLHYpPyhyLnNwbGljZShnLDEpLGUucG9pbnRzQ29sbGluZWFyKGIsXyx5KSYmKGQ/KG4mJm4uY2hhaW5SZW1vdmVUYWlsKGEuaW5kZXgseSkscC5wb3AoKSk6KG4mJm4uY2hhaW5SZW1vdmVIZWFkKGEuaW5kZXgseSkscC5zaGlmdCgpKSksbiYmbi5jaGFpbkNsb3NlKGEuaW5kZXgpLHZvaWQgaS5wdXNoKHApKTp2b2lkKGQ/KG4mJm4uY2hhaW5BZGRIZWFkKGEuaW5kZXgsdikscC51bnNoaWZ0KHYpKToobiYmbi5jaGFpbkFkZFRhaWwoYS5pbmRleCx2KSxwLnB1c2godikpKX12YXIgeD1hLmluZGV4LHc9cy5pbmRleDtuJiZuLmNoYWluQ29ubmVjdCh4LHcpO3ZhciBqPXJbeF0ubGVuZ3RoPHJbd10ubGVuZ3RoO2EubWF0Y2hlc19oZWFkP3MubWF0Y2hlc19oZWFkP2o/KEEoeCksTyh4LHcpKTooQSh3KSxPKHcseCkpOk8odyx4KTpzLm1hdGNoZXNfaGVhZD9PKHgsdyk6aj8oQSh4KSxPKHcseCkpOihBKHcpLE8oeCx3KSl9ZnVuY3Rpb24gUyh0LGUsbil7cmV0dXJuIHUuaW5kZXg9dCx1Lm1hdGNoZXNfaGVhZD1lLHUubWF0Y2hlc19wdDE9bix1PT09YT8odT1zLCExKToodT1udWxsLCEwKX1mdW5jdGlvbiBBKHQpe24mJm4uY2hhaW5SZXZlcnNlKHQpLHJbdF0ucmV2ZXJzZSgpfWZ1bmN0aW9uIE8odCxpKXt2YXIgbz1yW3RdLGw9cltpXSxhPW9bby5sZW5ndGgtMV0scz1vW28ubGVuZ3RoLTJdLHU9bFswXSxjPWxbMV07ZS5wb2ludHNDb2xsaW5lYXIocyxhLHUpJiYobiYmbi5jaGFpblJlbW92ZVRhaWwodCxhKSxvLnBvcCgpLGE9cyksZS5wb2ludHNDb2xsaW5lYXIoYSx1LGMpJiYobiYmbi5jaGFpblJlbW92ZUhlYWQoaSx1KSxsLnNoaWZ0KCkpLG4mJm4uY2hhaW5Kb2luKHQsaSksclt0XT1vLmNvbmNhdChsKSxyLnNwbGljZShpLDEpfX0pKSxpfTtmdW5jdGlvbiBRbCh0LGUsbil7dmFyIHI9W107cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGk9KHQubXlGaWxsLmFib3ZlPzg6MCkrKHQubXlGaWxsLmJlbG93PzQ6MCkrKHQub3RoZXJGaWxsJiZ0Lm90aGVyRmlsbC5hYm92ZT8yOjApKyh0Lm90aGVyRmlsbCYmdC5vdGhlckZpbGwuYmVsb3c/MTowKTswIT09ZVtpXSYmci5wdXNoKHtpZDpuP24uc2VnbWVudElkKCk6LTEsc3RhcnQ6dC5zdGFydCxlbmQ6dC5lbmQsbXlGaWxsOnthYm92ZToxPT09ZVtpXSxiZWxvdzoyPT09ZVtpXX0sb3RoZXJGaWxsOm51bGx9KX0pKSxuJiZuLnNlbGVjdGVkKHIpLHJ9dmFyIHRhLGVhPXt1bmlvbjpmdW5jdGlvbih0LGUpe3JldHVybiBRbCh0LFswLDIsMSwwLDIsMiwwLDAsMSwwLDEsMCwwLDAsMCwwXSxlKX0saW50ZXJzZWN0OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIFFsKHQsWzAsMCwwLDAsMCwyLDAsMiwwLDAsMSwxLDAsMiwxLDBdLGUpfSxkaWZmZXJlbmNlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIFFsKHQsWzAsMCwwLDAsMiwwLDIsMCwxLDEsMCwwLDAsMSwyLDBdLGUpfSxkaWZmZXJlbmNlUmV2OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIFFsKHQsWzAsMiwxLDAsMCwwLDEsMSwwLDIsMCwyLDAsMCwwLDBdLGUpfSx4b3I6ZnVuY3Rpb24odCxlKXtyZXR1cm4gUWwodCxbMCwyLDEsMCwyLDAsMCwxLDEsMCwwLDIsMCwxLDIsMF0sZSl9fSxuYT17dG9Qb2x5Z29uOmZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbihlKXtpZihlLmxlbmd0aDw9MClyZXR1cm4gdC5zZWdtZW50cyh7aW52ZXJ0ZWQ6ITEscmVnaW9uczpbXX0pO2Z1bmN0aW9uIG4oZSl7dmFyIG49ZS5zbGljZSgwLGUubGVuZ3RoLTEpO3JldHVybiB0LnNlZ21lbnRzKHtpbnZlcnRlZDohMSxyZWdpb25zOltuXX0pfWZvcih2YXIgcj1uKGVbMF0pLGk9MTtpPGUubGVuZ3RoO2krKylyPXQuc2VsZWN0RGlmZmVyZW5jZSh0LmNvbWJpbmUocixuKGVbaV0pKSk7cmV0dXJuIHJ9aWYoIlBvbHlnb24iPT09ZS50eXBlKXJldHVybiB0LnBvbHlnb24obihlLmNvb3JkaW5hdGVzKSk7aWYoIk11bHRpUG9seWdvbiI9PT1lLnR5cGUpe2Zvcih2YXIgcj10LnNlZ21lbnRzKHtpbnZlcnRlZDohMSxyZWdpb25zOltdfSksaT0wO2k8ZS5jb29yZGluYXRlcy5sZW5ndGg7aSsrKXI9dC5zZWxlY3RVbmlvbih0LmNvbWJpbmUocixuKGUuY29vcmRpbmF0ZXNbaV0pKSk7cmV0dXJuIHQucG9seWdvbihyKX10aHJvdyBuZXcgRXJyb3IoIlBvbHlCb29sOiBDYW5ub3QgY29udmVydCBHZW9KU09OIG9iamVjdCB0byBQb2x5Qm9vbCBwb2x5Z29uIil9LGZyb21Qb2x5Z29uOmZ1bmN0aW9uKHQsZSxuKXtmdW5jdGlvbiByKHQsbil7cmV0dXJuIGUucG9pbnRJbnNpZGVSZWdpb24oWy41Kih0WzBdWzBdK3RbMV1bMF0pLC41Kih0WzBdWzFdK3RbMV1bMV0pXSxuKX1mdW5jdGlvbiBpKHQpe3JldHVybntyZWdpb246dCxjaGlsZHJlbjpbXX19bj10LnBvbHlnb24odC5zZWdtZW50cyhuKSk7dmFyIG89aShudWxsKTtmdW5jdGlvbiBsKHQsZSl7Zm9yKHZhciBuPTA7bjx0LmNoaWxkcmVuLmxlbmd0aDtuKyspe2lmKHIoZSwoYT10LmNoaWxkcmVuW25dKS5yZWdpb24pKXJldHVybiB2b2lkIGwoYSxlKX12YXIgbz1pKGUpO2ZvcihuPTA7bjx0LmNoaWxkcmVuLmxlbmd0aDtuKyspe3ZhciBhO3IoKGE9dC5jaGlsZHJlbltuXSkucmVnaW9uLGUpJiYoby5jaGlsZHJlbi5wdXNoKGEpLHQuY2hpbGRyZW4uc3BsaWNlKG4sMSksbi0tKX10LmNoaWxkcmVuLnB1c2gobyl9Zm9yKHZhciBhPTA7YTxuLnJlZ2lvbnMubGVuZ3RoO2ErKyl7dmFyIHM9bi5yZWdpb25zW2FdO3MubGVuZ3RoPDN8fGwobyxzKX1mdW5jdGlvbiB1KHQsZSl7Zm9yKHZhciBuPTAscj10W3QubGVuZ3RoLTFdWzBdLGk9dFt0Lmxlbmd0aC0xXVsxXSxvPVtdLGw9MDtsPHQubGVuZ3RoO2wrKyl7dmFyIGE9dFtsXVswXSxzPXRbbF1bMV07by5wdXNoKFthLHNdKSxuKz1zKnItYSppLHI9YSxpPXN9cmV0dXJuIG48MCE9PWUmJm8ucmV2ZXJzZSgpLG8ucHVzaChbb1swXVswXSxvWzBdWzFdXSksb312YXIgYz1bXTtmdW5jdGlvbiBmKHQpe3ZhciBlPVt1KHQucmVnaW9uLCExKV07Yy5wdXNoKGUpO2Zvcih2YXIgbj0wO248dC5jaGlsZHJlbi5sZW5ndGg7bisrKWUucHVzaChoKHQuY2hpbGRyZW5bbl0pKX1mdW5jdGlvbiBoKHQpe2Zvcih2YXIgZT0wO2U8dC5jaGlsZHJlbi5sZW5ndGg7ZSsrKWYodC5jaGlsZHJlbltlXSk7cmV0dXJuIHUodC5yZWdpb24sITApfWZvcihhPTA7YTxvLmNoaWxkcmVuLmxlbmd0aDthKyspZihvLmNoaWxkcmVuW2FdKTtyZXR1cm4gYy5sZW5ndGg8PTA/e3R5cGU6IlBvbHlnb24iLGNvb3JkaW5hdGVzOltdfToxPT1jLmxlbmd0aD97dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6Y1swXX06e3R5cGU6Ik11bHRpUG9seWdvbiIsY29vcmRpbmF0ZXM6Y319fSxyYT1mdW5jdGlvbigpe3ZhciB0LGU9MCxuPSExO2Z1bmN0aW9uIHIoZSxuKXtyZXR1cm4gdC5saXN0LnB1c2goe3R5cGU6ZSxkYXRhOm4/SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShuKSk6dm9pZCAwfSksdH1yZXR1cm4gdD17bGlzdDpbXSxzZWdtZW50SWQ6ZnVuY3Rpb24oKXtyZXR1cm4gZSsrfSxjaGVja0ludGVyc2VjdGlvbjpmdW5jdGlvbih0LGUpe3JldHVybiByKCJjaGVjayIse3NlZzE6dCxzZWcyOmV9KX0sc2VnbWVudENob3A6ZnVuY3Rpb24odCxlKXtyZXR1cm4gcigiZGl2X3NlZyIse3NlZzp0LHB0OmV9KSxyKCJjaG9wIix7c2VnOnQscHQ6ZX0pfSxzdGF0dXNSZW1vdmU6ZnVuY3Rpb24odCl7cmV0dXJuIHIoInBvcF9zZWciLHtzZWc6dH0pfSxzZWdtZW50VXBkYXRlOmZ1bmN0aW9uKHQpe3JldHVybiByKCJzZWdfdXBkYXRlIix7c2VnOnR9KX0sc2VnbWVudE5ldzpmdW5jdGlvbih0LGUpe3JldHVybiByKCJuZXdfc2VnIix7c2VnOnQscHJpbWFyeTplfSl9LHNlZ21lbnRSZW1vdmU6ZnVuY3Rpb24odCl7cmV0dXJuIHIoInJlbV9zZWciLHtzZWc6dH0pfSx0ZW1wU3RhdHVzOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gcigidGVtcF9zdGF0dXMiLHtzZWc6dCxhYm92ZTplLGJlbG93Om59KX0scmV3aW5kOmZ1bmN0aW9uKHQpe3JldHVybiByKCJyZXdpbmQiLHtzZWc6dH0pfSxzdGF0dXM6ZnVuY3Rpb24odCxlLG4pe3JldHVybiByKCJzdGF0dXMiLHtzZWc6dCxhYm92ZTplLGJlbG93Om59KX0sdmVydDpmdW5jdGlvbihlKXtyZXR1cm4gZT09PW4/dDoobj1lLHIoInZlcnQiLHt4OmV9KSl9LGxvZzpmdW5jdGlvbih0KXtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIHQmJih0PUpTT04uc3RyaW5naWZ5KHQsITEsIiAgIikpLHIoImxvZyIse3R4dDp0fSl9LHJlc2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHIoInJlc2V0Iil9LHNlbGVjdGVkOmZ1bmN0aW9uKHQpe3JldHVybiByKCJzZWxlY3RlZCIse3NlZ3M6dH0pfSxjaGFpblN0YXJ0OmZ1bmN0aW9uKHQpe3JldHVybiByKCJjaGFpbl9zdGFydCIse3NlZzp0fSl9LGNoYWluUmVtb3ZlSGVhZDpmdW5jdGlvbih0LGUpe3JldHVybiByKCJjaGFpbl9yZW1faGVhZCIse2luZGV4OnQscHQ6ZX0pfSxjaGFpblJlbW92ZVRhaWw6ZnVuY3Rpb24odCxlKXtyZXR1cm4gcigiY2hhaW5fcmVtX3RhaWwiLHtpbmRleDp0LHB0OmV9KX0sY2hhaW5OZXc6ZnVuY3Rpb24odCxlKXtyZXR1cm4gcigiY2hhaW5fbmV3Iix7cHQxOnQscHQyOmV9KX0sY2hhaW5NYXRjaDpmdW5jdGlvbih0KXtyZXR1cm4gcigiY2hhaW5fbWF0Y2giLHtpbmRleDp0fSl9LGNoYWluQ2xvc2U6ZnVuY3Rpb24odCl7cmV0dXJuIHIoImNoYWluX2Nsb3NlIix7aW5kZXg6dH0pfSxjaGFpbkFkZEhlYWQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gcigiY2hhaW5fYWRkX2hlYWQiLHtpbmRleDp0LHB0OmV9KX0sY2hhaW5BZGRUYWlsOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHIoImNoYWluX2FkZF90YWlsIix7aW5kZXg6dCxwdDplfSl9LGNoYWluQ29ubmVjdDpmdW5jdGlvbih0LGUpe3JldHVybiByKCJjaGFpbl9jb24iLHtpbmRleDE6dCxpbmRleDI6ZX0pfSxjaGFpblJldmVyc2U6ZnVuY3Rpb24odCl7cmV0dXJuIHIoImNoYWluX3JldiIse2luZGV4OnR9KX0sY2hhaW5Kb2luOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHIoImNoYWluX2pvaW4iLHtpbmRleDE6dCxpbmRleDI6ZX0pfSxkb25lOmZ1bmN0aW9uKCl7cmV0dXJuIHIoImRvbmUiKX19fSxpYT1xbCxvYT1HbCxsYT1lYSxhYT1uYSxzYT0hMSx1YT1WbCgpO2Z1bmN0aW9uIGNhKHQsZSxuKXt2YXIgcj10YS5zZWdtZW50cyh0KSxpPXRhLnNlZ21lbnRzKGUpLG89bih0YS5jb21iaW5lKHIsaSkpO3JldHVybiB0YS5wb2x5Z29uKG8pfXRhPXtidWlsZExvZzpmdW5jdGlvbih0KXtyZXR1cm4hMD09PXQ/c2E9cmEoKTohMT09PXQmJihzYT0hMSksITEhPT1zYSYmc2EubGlzdH0sZXBzaWxvbjpmdW5jdGlvbih0KXtyZXR1cm4gdWEuZXBzaWxvbih0KX0sc2VnbWVudHM6ZnVuY3Rpb24odCl7dmFyIGU9aWEoITAsdWEsc2EpO3JldHVybiB0LnJlZ2lvbnMuZm9yRWFjaChlLmFkZFJlZ2lvbikse3NlZ21lbnRzOmUuY2FsY3VsYXRlKHQuaW52ZXJ0ZWQpLGludmVydGVkOnQuaW52ZXJ0ZWR9fSxjb21iaW5lOmZ1bmN0aW9uKHQsZSl7cmV0dXJue2NvbWJpbmVkOmlhKCExLHVhLHNhKS5jYWxjdWxhdGUodC5zZWdtZW50cyx0LmludmVydGVkLGUuc2VnbWVudHMsZS5pbnZlcnRlZCksaW52ZXJ0ZWQxOnQuaW52ZXJ0ZWQsaW52ZXJ0ZWQyOmUuaW52ZXJ0ZWR9fSxzZWxlY3RVbmlvbjpmdW5jdGlvbih0KXtyZXR1cm57c2VnbWVudHM6bGEudW5pb24odC5jb21iaW5lZCxzYSksaW52ZXJ0ZWQ6dC5pbnZlcnRlZDF8fHQuaW52ZXJ0ZWQyfX0sc2VsZWN0SW50ZXJzZWN0OmZ1bmN0aW9uKHQpe3JldHVybntzZWdtZW50czpsYS5pbnRlcnNlY3QodC5jb21iaW5lZCxzYSksaW52ZXJ0ZWQ6dC5pbnZlcnRlZDEmJnQuaW52ZXJ0ZWQyfX0sc2VsZWN0RGlmZmVyZW5jZTpmdW5jdGlvbih0KXtyZXR1cm57c2VnbWVudHM6bGEuZGlmZmVyZW5jZSh0LmNvbWJpbmVkLHNhKSxpbnZlcnRlZDp0LmludmVydGVkMSYmIXQuaW52ZXJ0ZWQyfX0sc2VsZWN0RGlmZmVyZW5jZVJldjpmdW5jdGlvbih0KXtyZXR1cm57c2VnbWVudHM6bGEuZGlmZmVyZW5jZVJldih0LmNvbWJpbmVkLHNhKSxpbnZlcnRlZDohdC5pbnZlcnRlZDEmJnQuaW52ZXJ0ZWQyfX0sc2VsZWN0WG9yOmZ1bmN0aW9uKHQpe3JldHVybntzZWdtZW50czpsYS54b3IodC5jb21iaW5lZCxzYSksaW52ZXJ0ZWQ6dC5pbnZlcnRlZDEhPT10LmludmVydGVkMn19LHBvbHlnb246ZnVuY3Rpb24odCl7cmV0dXJue3JlZ2lvbnM6b2EodC5zZWdtZW50cyx1YSxzYSksaW52ZXJ0ZWQ6dC5pbnZlcnRlZH19LHBvbHlnb25Gcm9tR2VvSlNPTjpmdW5jdGlvbih0KXtyZXR1cm4gYWEudG9Qb2x5Z29uKHRhLHQpfSxwb2x5Z29uVG9HZW9KU09OOmZ1bmN0aW9uKHQpe3JldHVybiBhYS5mcm9tUG9seWdvbih0YSx1YSx0KX0sdW5pb246ZnVuY3Rpb24odCxlKXtyZXR1cm4gY2EodCxlLHRhLnNlbGVjdFVuaW9uKX0saW50ZXJzZWN0OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGNhKHQsZSx0YS5zZWxlY3RJbnRlcnNlY3QpfSxkaWZmZXJlbmNlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGNhKHQsZSx0YS5zZWxlY3REaWZmZXJlbmNlKX0sZGlmZmVyZW5jZVJldjpmdW5jdGlvbih0LGUpe3JldHVybiBjYSh0LGUsdGEuc2VsZWN0RGlmZmVyZW5jZVJldil9LHhvcjpmdW5jdGlvbih0LGUpe3JldHVybiBjYSh0LGUsdGEuc2VsZWN0WG9yKX19LCJvYmplY3QiPT10eXBlb2Ygd2luZG93JiYod2luZG93LlBvbHlCb29sPXRhKTt2YXIgZmE9dGE7Y29uc3QgaGE9MTM0MjE3NzI5LGdhPTMzMzA2NjkwNzM4NzU0NzA2ZS0zMjtmdW5jdGlvbiB2YSh0LGUsbixyLGkpe2xldCBvLGwsYSxzLHU9ZVswXSxjPXJbMF0sZj0wLGg9MDtjPnU9PWM+LXU/KG89dSx1PWVbKytmXSk6KG89YyxjPXJbKytoXSk7bGV0IGc9MDtpZihmPHQmJmg8bilmb3IoYz51PT1jPi11PyhsPXUrbyxhPW8tKGwtdSksdT1lWysrZl0pOihsPWMrbyxhPW8tKGwtYyksYz1yWysraF0pLG89bCwwIT09YSYmKGlbZysrXT1hKTtmPHQmJmg8bjspYz51PT1jPi11PyhsPW8rdSxzPWwtbyxhPW8tKGwtcykrKHUtcyksdT1lWysrZl0pOihsPW8rYyxzPWwtbyxhPW8tKGwtcykrKGMtcyksYz1yWysraF0pLG89bCwwIT09YSYmKGlbZysrXT1hKTtmb3IoO2Y8dDspbD1vK3Uscz1sLW8sYT1vLShsLXMpKyh1LXMpLHU9ZVsrK2ZdLG89bCwwIT09YSYmKGlbZysrXT1hKTtmb3IoO2g8bjspbD1vK2Mscz1sLW8sYT1vLShsLXMpKyhjLXMpLGM9clsrK2hdLG89bCwwIT09YSYmKGlbZysrXT1hKTtyZXR1cm4gMD09PW8mJjAhPT1nfHwoaVtnKytdPW8pLGd9ZnVuY3Rpb24gZGEodCl7cmV0dXJuIG5ldyBGbG9hdDY0QXJyYXkodCl9Y29uc3QgcGE9MjIyMDQ0NjA0OTI1MDMxNDZlLTMyLHlhPTExMDkzMzU2NDc5NjcwNDg3ZS00NyxtYT1kYSg0KSxfYT1kYSg4KSxiYT1kYSgxMikseGE9ZGEoMTYpLHdhPWRhKDQpO2Z1bmN0aW9uIGphKHQsZSxuLHIsaSxvKXtjb25zdCBsPShlLW8pKihuLWkpLGE9KHQtaSkqKHItbykscz1sLWE7aWYoMD09PWx8fDA9PT1hfHxsPjAhPWE+MClyZXR1cm4gcztjb25zdCB1PU1hdGguYWJzKGwrYSk7cmV0dXJuIE1hdGguYWJzKHMpPj0zMzMwNjY5MDczODc1NDcxNmUtMzIqdT9zOi1mdW5jdGlvbih0LGUsbixyLGksbyxsKXtsZXQgYSxzLHUsYyxmLGgsZyx2LGQscCx5LG0sXyxiLHgsdyxqLFM7Y29uc3QgQT10LWksTz1uLWksTT1lLW8saz1yLW87Yj1BKmssaD1oYSpBLGc9aC0oaC1BKSx2PUEtZyxoPWhhKmssZD1oLShoLWspLHA9ay1kLHg9dipwLShiLWcqZC12KmQtZypwKSx3PU0qTyxoPWhhKk0sZz1oLShoLU0pLHY9TS1nLGg9aGEqTyxkPWgtKGgtTykscD1PLWQsaj12KnAtKHctZypkLXYqZC1nKnApLHk9eC1qLGY9eC15LG1hWzBdPXgtKHkrZikrKGYtaiksbT1iK3ksZj1tLWIsXz1iLShtLWYpKyh5LWYpLHk9Xy13LGY9Xy15LG1hWzFdPV8tKHkrZikrKGYtdyksUz1tK3ksZj1TLW0sbWFbMl09bS0oUy1mKSsoeS1mKSxtYVszXT1TO2xldCBQPWZ1bmN0aW9uKHQsZSl7bGV0IG49ZVswXTtmb3IobGV0IHI9MTtyPHQ7cisrKW4rPWVbcl07cmV0dXJuIG59KDQsbWEpLEY9cGEqbDtpZihQPj1GfHwtUD49RilyZXR1cm4gUDtpZihmPXQtQSxhPXQtKEErZikrKGYtaSksZj1uLU8sdT1uLShPK2YpKyhmLWkpLGY9ZS1NLHM9ZS0oTStmKSsoZi1vKSxmPXItayxjPXItKGsrZikrKGYtbyksMD09PWEmJjA9PT1zJiYwPT09dSYmMD09PWMpcmV0dXJuIFA7aWYoRj15YSpsK2dhKk1hdGguYWJzKFApLFArPUEqYytrKmEtKE0qdStPKnMpLFA+PUZ8fC1QPj1GKXJldHVybiBQO2I9YSprLGg9aGEqYSxnPWgtKGgtYSksdj1hLWcsaD1oYSprLGQ9aC0oaC1rKSxwPWstZCx4PXYqcC0oYi1nKmQtdipkLWcqcCksdz1zKk8saD1oYSpzLGc9aC0oaC1zKSx2PXMtZyxoPWhhKk8sZD1oLShoLU8pLHA9Ty1kLGo9dipwLSh3LWcqZC12KmQtZypwKSx5PXgtaixmPXgteSx3YVswXT14LSh5K2YpKyhmLWopLG09Yit5LGY9bS1iLF89Yi0obS1mKSsoeS1mKSx5PV8tdyxmPV8teSx3YVsxXT1fLSh5K2YpKyhmLXcpLFM9bSt5LGY9Uy1tLHdhWzJdPW0tKFMtZikrKHktZiksd2FbM109Uztjb25zdCBUPXZhKDQsbWEsNCx3YSxfYSk7Yj1BKmMsaD1oYSpBLGc9aC0oaC1BKSx2PUEtZyxoPWhhKmMsZD1oLShoLWMpLHA9Yy1kLHg9dipwLShiLWcqZC12KmQtZypwKSx3PU0qdSxoPWhhKk0sZz1oLShoLU0pLHY9TS1nLGg9aGEqdSxkPWgtKGgtdSkscD11LWQsaj12KnAtKHctZypkLXYqZC1nKnApLHk9eC1qLGY9eC15LHdhWzBdPXgtKHkrZikrKGYtaiksbT1iK3ksZj1tLWIsXz1iLShtLWYpKyh5LWYpLHk9Xy13LGY9Xy15LHdhWzFdPV8tKHkrZikrKGYtdyksUz1tK3ksZj1TLW0sd2FbMl09bS0oUy1mKSsoeS1mKSx3YVszXT1TO2NvbnN0IHo9dmEoVCxfYSw0LHdhLGJhKTtiPWEqYyxoPWhhKmEsZz1oLShoLWEpLHY9YS1nLGg9aGEqYyxkPWgtKGgtYykscD1jLWQseD12KnAtKGItZypkLXYqZC1nKnApLHc9cyp1LGg9aGEqcyxnPWgtKGgtcyksdj1zLWcsaD1oYSp1LGQ9aC0oaC11KSxwPXUtZCxqPXYqcC0ody1nKmQtdipkLWcqcCkseT14LWosZj14LXksd2FbMF09eC0oeStmKSsoZi1qKSxtPWIreSxmPW0tYixfPWItKG0tZikrKHktZikseT1fLXcsZj1fLXksd2FbMV09Xy0oeStmKSsoZi13KSxTPW0reSxmPVMtbSx3YVsyXT1tLShTLWYpKyh5LWYpLHdhWzNdPVM7Y29uc3QgST12YSh6LGJhLDQsd2EseGEpO3JldHVybiB4YVtJLTFdfSh0LGUsbixyLGksbyx1KX1jb25zdCBTYT1NYXRoLnBvdygyLC01MiksQWE9bmV3IFVpbnQzMkFycmF5KDUxMik7Y2xhc3MgT2F7c3RhdGljIGZyb20odCxlPXphLG49SWEpe2NvbnN0IHI9dC5sZW5ndGgsaT1uZXcgRmxvYXQ2NEFycmF5KDIqcik7Zm9yKGxldCBvPTA7bzxyO28rKyl7Y29uc3Qgcj10W29dO2lbMipvXT1lKHIpLGlbMipvKzFdPW4ocil9cmV0dXJuIG5ldyBPYShpKX1jb25zdHJ1Y3Rvcih0KXtjb25zdCBlPXQubGVuZ3RoPj4xO2lmKGU+MCYmIm51bWJlciIhPXR5cGVvZiB0WzBdKXRocm93IG5ldyBFcnJvcigiRXhwZWN0ZWQgY29vcmRzIHRvIGNvbnRhaW4gbnVtYmVycy4iKTt0aGlzLmNvb3Jkcz10O2NvbnN0IG49TWF0aC5tYXgoMiplLTUsMCk7dGhpcy5fdHJpYW5nbGVzPW5ldyBVaW50MzJBcnJheSgzKm4pLHRoaXMuX2hhbGZlZGdlcz1uZXcgSW50MzJBcnJheSgzKm4pLHRoaXMuX2hhc2hTaXplPU1hdGguY2VpbChNYXRoLnNxcnQoZSkpLHRoaXMuX2h1bGxQcmV2PW5ldyBVaW50MzJBcnJheShlKSx0aGlzLl9odWxsTmV4dD1uZXcgVWludDMyQXJyYXkoZSksdGhpcy5faHVsbFRyaT1uZXcgVWludDMyQXJyYXkoZSksdGhpcy5faHVsbEhhc2g9bmV3IEludDMyQXJyYXkodGhpcy5faGFzaFNpemUpLmZpbGwoLTEpLHRoaXMuX2lkcz1uZXcgVWludDMyQXJyYXkoZSksdGhpcy5fZGlzdHM9bmV3IEZsb2F0NjRBcnJheShlKSx0aGlzLnVwZGF0ZSgpfXVwZGF0ZSgpe2NvbnN0e2Nvb3Jkczp0LF9odWxsUHJldjplLF9odWxsTmV4dDpuLF9odWxsVHJpOnIsX2h1bGxIYXNoOml9PXRoaXMsbz10Lmxlbmd0aD4+MTtsZXQgbD0xLzAsYT0xLzAscz0tMS8wLHU9LTEvMDtmb3IobGV0IGU9MDtlPG87ZSsrKXtjb25zdCBuPXRbMiplXSxyPXRbMiplKzFdO248bCYmKGw9bikscjxhJiYoYT1yKSxuPnMmJihzPW4pLHI+dSYmKHU9ciksdGhpcy5faWRzW2VdPWV9Y29uc3QgYz0obCtzKS8yLGY9KGErdSkvMjtsZXQgaCxnLHYsZD0xLzA7Zm9yKGxldCBlPTA7ZTxvO2UrKyl7Y29uc3Qgbj1NYShjLGYsdFsyKmVdLHRbMiplKzFdKTtuPGQmJihoPWUsZD1uKX1jb25zdCBwPXRbMipoXSx5PXRbMipoKzFdO2Q9MS8wO2ZvcihsZXQgZT0wO2U8bztlKyspe2lmKGU9PT1oKWNvbnRpbnVlO2NvbnN0IG49TWEocCx5LHRbMiplXSx0WzIqZSsxXSk7bjxkJiZuPjAmJihnPWUsZD1uKX1sZXQgbT10WzIqZ10sXz10WzIqZysxXSxiPTEvMDtmb3IobGV0IGU9MDtlPG87ZSsrKXtpZihlPT09aHx8ZT09PWcpY29udGludWU7Y29uc3Qgbj1QYShwLHksbSxfLHRbMiplXSx0WzIqZSsxXSk7bjxiJiYodj1lLGI9bil9bGV0IHg9dFsyKnZdLHc9dFsyKnYrMV07aWYoYj09PTEvMCl7Zm9yKGxldCBlPTA7ZTxvO2UrKyl0aGlzLl9kaXN0c1tlXT10WzIqZV0tdFswXXx8dFsyKmUrMV0tdFsxXTtGYSh0aGlzLl9pZHMsdGhpcy5fZGlzdHMsMCxvLTEpO2NvbnN0IGU9bmV3IFVpbnQzMkFycmF5KG8pO2xldCBuPTA7Zm9yKGxldCB0PTAscj0tMS8wO3Q8bzt0Kyspe2NvbnN0IGk9dGhpcy5faWRzW3RdO3RoaXMuX2Rpc3RzW2ldPnImJihlW24rK109aSxyPXRoaXMuX2Rpc3RzW2ldKX1yZXR1cm4gdGhpcy5odWxsPWUuc3ViYXJyYXkoMCxuKSx0aGlzLnRyaWFuZ2xlcz1uZXcgVWludDMyQXJyYXkoMCksdm9pZCh0aGlzLmhhbGZlZGdlcz1uZXcgVWludDMyQXJyYXkoMCkpfWlmKGphKHAseSxtLF8seCx3KTwwKXtjb25zdCB0PWcsZT1tLG49XztnPXYsbT14LF89dyx2PXQseD1lLHc9bn1jb25zdCBqPWZ1bmN0aW9uKHQsZSxuLHIsaSxvKXtjb25zdCBsPW4tdCxhPXItZSxzPWktdCx1PW8tZSxjPWwqbCthKmEsZj1zKnMrdSp1LGg9LjUvKGwqdS1hKnMpO3JldHVybnt4OnQrKHUqYy1hKmYpKmgseTplKyhsKmYtcypjKSpofX0ocCx5LG0sXyx4LHcpO3RoaXMuX2N4PWoueCx0aGlzLl9jeT1qLnk7Zm9yKGxldCBlPTA7ZTxvO2UrKyl0aGlzLl9kaXN0c1tlXT1NYSh0WzIqZV0sdFsyKmUrMV0sai54LGoueSk7RmEodGhpcy5faWRzLHRoaXMuX2Rpc3RzLDAsby0xKSx0aGlzLl9odWxsU3RhcnQ9aDtsZXQgUz0zO25baF09ZVt2XT1nLG5bZ109ZVtoXT12LG5bdl09ZVtnXT1oLHJbaF09MCxyW2ddPTEsclt2XT0yLGkuZmlsbCgtMSksaVt0aGlzLl9oYXNoS2V5KHAseSldPWgsaVt0aGlzLl9oYXNoS2V5KG0sXyldPWcsaVt0aGlzLl9oYXNoS2V5KHgsdyldPXYsdGhpcy50cmlhbmdsZXNMZW49MCx0aGlzLl9hZGRUcmlhbmdsZShoLGcsdiwtMSwtMSwtMSk7Zm9yKGxldCBvLGwsYT0wO2E8dGhpcy5faWRzLmxlbmd0aDthKyspe2NvbnN0IHM9dGhpcy5faWRzW2FdLHU9dFsyKnNdLGM9dFsyKnMrMV07aWYoYT4wJiZNYXRoLmFicyh1LW8pPD1TYSYmTWF0aC5hYnMoYy1sKTw9U2EpY29udGludWU7aWYobz11LGw9YyxzPT09aHx8cz09PWd8fHM9PT12KWNvbnRpbnVlO2xldCBmPTA7Zm9yKGxldCB0PTAsZT10aGlzLl9oYXNoS2V5KHUsYyk7dDx0aGlzLl9oYXNoU2l6ZSYmKGY9aVsoZSt0KSV0aGlzLl9oYXNoU2l6ZV0sLTE9PT1mfHxmPT09bltmXSk7dCsrKTtmPWVbZl07bGV0IGQscD1mO2Zvcig7ZD1uW3BdLGphKHUsYyx0WzIqcF0sdFsyKnArMV0sdFsyKmRdLHRbMipkKzFdKT49MDspaWYocD1kLHA9PT1mKXtwPS0xO2JyZWFrfWlmKC0xPT09cCljb250aW51ZTtsZXQgeT10aGlzLl9hZGRUcmlhbmdsZShwLHMsbltwXSwtMSwtMSxyW3BdKTtyW3NdPXRoaXMuX2xlZ2FsaXplKHkrMikscltwXT15LFMrKztsZXQgbT1uW3BdO2Zvcig7ZD1uW21dLGphKHUsYyx0WzIqbV0sdFsyKm0rMV0sdFsyKmRdLHRbMipkKzFdKTwwOyl5PXRoaXMuX2FkZFRyaWFuZ2xlKG0scyxkLHJbc10sLTEsclttXSkscltzXT10aGlzLl9sZWdhbGl6ZSh5KzIpLG5bbV09bSxTLS0sbT1kO2lmKHA9PT1mKWZvcig7ZD1lW3BdLGphKHUsYyx0WzIqZF0sdFsyKmQrMV0sdFsyKnBdLHRbMipwKzFdKTwwOyl5PXRoaXMuX2FkZFRyaWFuZ2xlKGQscyxwLC0xLHJbcF0scltkXSksdGhpcy5fbGVnYWxpemUoeSsyKSxyW2RdPXksbltwXT1wLFMtLSxwPWQ7dGhpcy5faHVsbFN0YXJ0PWVbc109cCxuW3BdPWVbbV09cyxuW3NdPW0saVt0aGlzLl9oYXNoS2V5KHUsYyldPXMsaVt0aGlzLl9oYXNoS2V5KHRbMipwXSx0WzIqcCsxXSldPXB9dGhpcy5odWxsPW5ldyBVaW50MzJBcnJheShTKTtmb3IobGV0IHQ9MCxlPXRoaXMuX2h1bGxTdGFydDt0PFM7dCsrKXRoaXMuaHVsbFt0XT1lLGU9bltlXTt0aGlzLnRyaWFuZ2xlcz10aGlzLl90cmlhbmdsZXMuc3ViYXJyYXkoMCx0aGlzLnRyaWFuZ2xlc0xlbiksdGhpcy5oYWxmZWRnZXM9dGhpcy5faGFsZmVkZ2VzLnN1YmFycmF5KDAsdGhpcy50cmlhbmdsZXNMZW4pfV9oYXNoS2V5KHQsZSl7cmV0dXJuIE1hdGguZmxvb3IoZnVuY3Rpb24odCxlKXtjb25zdCBuPXQvKE1hdGguYWJzKHQpK01hdGguYWJzKGUpKTtyZXR1cm4oZT4wPzMtbjoxK24pLzR9KHQtdGhpcy5fY3gsZS10aGlzLl9jeSkqdGhpcy5faGFzaFNpemUpJXRoaXMuX2hhc2hTaXplfV9sZWdhbGl6ZSh0KXtjb25zdHtfdHJpYW5nbGVzOmUsX2hhbGZlZGdlczpuLGNvb3JkczpyfT10aGlzO2xldCBpPTAsbz0wO2Zvcig7Oyl7Y29uc3QgbD1uW3RdLGE9dC10JTM7aWYobz1hKyh0KzIpJTMsLTE9PT1sKXtpZigwPT09aSlicmVhazt0PUFhWy0taV07Y29udGludWV9Y29uc3Qgcz1sLWwlMyx1PWErKHQrMSklMyxjPXMrKGwrMiklMyxmPWVbb10saD1lW3RdLGc9ZVt1XSx2PWVbY107aWYoa2EoclsyKmZdLHJbMipmKzFdLHJbMipoXSxyWzIqaCsxXSxyWzIqZ10sclsyKmcrMV0sclsyKnZdLHJbMip2KzFdKSl7ZVt0XT12LGVbbF09Zjtjb25zdCByPW5bY107aWYoLTE9PT1yKXtsZXQgZT10aGlzLl9odWxsU3RhcnQ7ZG97aWYodGhpcy5faHVsbFRyaVtlXT09PWMpe3RoaXMuX2h1bGxUcmlbZV09dDticmVha31lPXRoaXMuX2h1bGxQcmV2W2VdfXdoaWxlKGUhPT10aGlzLl9odWxsU3RhcnQpfXRoaXMuX2xpbmsodCxyKSx0aGlzLl9saW5rKGwsbltvXSksdGhpcy5fbGluayhvLGMpO2NvbnN0IGE9cysobCsxKSUzO2k8QWEubGVuZ3RoJiYoQWFbaSsrXT1hKX1lbHNle2lmKDA9PT1pKWJyZWFrO3Q9QWFbLS1pXX19cmV0dXJuIG99X2xpbmsodCxlKXt0aGlzLl9oYWxmZWRnZXNbdF09ZSwtMSE9PWUmJih0aGlzLl9oYWxmZWRnZXNbZV09dCl9X2FkZFRyaWFuZ2xlKHQsZSxuLHIsaSxvKXtjb25zdCBsPXRoaXMudHJpYW5nbGVzTGVuO3JldHVybiB0aGlzLl90cmlhbmdsZXNbbF09dCx0aGlzLl90cmlhbmdsZXNbbCsxXT1lLHRoaXMuX3RyaWFuZ2xlc1tsKzJdPW4sdGhpcy5fbGluayhsLHIpLHRoaXMuX2xpbmsobCsxLGkpLHRoaXMuX2xpbmsobCsyLG8pLHRoaXMudHJpYW5nbGVzTGVuKz0zLGx9fWZ1bmN0aW9uIE1hKHQsZSxuLHIpe2NvbnN0IGk9dC1uLG89ZS1yO3JldHVybiBpKmkrbypvfWZ1bmN0aW9uIGthKHQsZSxuLHIsaSxvLGwsYSl7Y29uc3Qgcz10LWwsdT1lLWEsYz1uLWwsZj1yLWEsaD1pLWwsZz1vLWEsdj1jKmMrZipmLGQ9aCpoK2cqZztyZXR1cm4gcyooZipkLXYqZyktdSooYypkLXYqaCkrKHMqcyt1KnUpKihjKmctZipoKTwwfWZ1bmN0aW9uIFBhKHQsZSxuLHIsaSxvKXtjb25zdCBsPW4tdCxhPXItZSxzPWktdCx1PW8tZSxjPWwqbCthKmEsZj1zKnMrdSp1LGg9LjUvKGwqdS1hKnMpLGc9KHUqYy1hKmYpKmgsdj0obCpmLXMqYykqaDtyZXR1cm4gZypnK3Yqdn1mdW5jdGlvbiBGYSh0LGUsbixyKXtpZihyLW48PTIwKWZvcihsZXQgaT1uKzE7aTw9cjtpKyspe2NvbnN0IHI9dFtpXSxvPWVbcl07bGV0IGw9aS0xO2Zvcig7bD49biYmZVt0W2xdXT5vOyl0W2wrMV09dFtsLS1dO3RbbCsxXT1yfWVsc2V7bGV0IGk9bisxLG89cjtUYSh0LG4rcj4+MSxpKSxlW3Rbbl1dPmVbdFtyXV0mJlRhKHQsbixyKSxlW3RbaV1dPmVbdFtyXV0mJlRhKHQsaSxyKSxlW3Rbbl1dPmVbdFtpXV0mJlRhKHQsbixpKTtjb25zdCBsPXRbaV0sYT1lW2xdO2Zvcig7Oyl7ZG97aSsrfXdoaWxlKGVbdFtpXV08YSk7ZG97by0tfXdoaWxlKGVbdFtvXV0+YSk7aWYobzxpKWJyZWFrO1RhKHQsaSxvKX10W24rMV09dFtvXSx0W29dPWwsci1pKzE+PW8tbj8oRmEodCxlLGksciksRmEodCxlLG4sby0xKSk6KEZhKHQsZSxuLG8tMSksRmEodCxlLGkscikpfX1mdW5jdGlvbiBUYSh0LGUsbil7Y29uc3Qgcj10W2VdO3RbZV09dFtuXSx0W25dPXJ9ZnVuY3Rpb24gemEodCl7cmV0dXJuIHRbMF19ZnVuY3Rpb24gSWEodCl7cmV0dXJuIHRbMV19Y29uc3QgJGE9MWUtNjtjbGFzcyBFYXtjb25zdHJ1Y3Rvcigpe3RoaXMuX3gwPXRoaXMuX3kwPXRoaXMuX3gxPXRoaXMuX3kxPW51bGwsdGhpcy5fPSIifW1vdmVUbyh0LGUpe3RoaXMuXys9YE0ke3RoaXMuX3gwPXRoaXMuX3gxPSt0fSwke3RoaXMuX3kwPXRoaXMuX3kxPStlfWB9Y2xvc2VQYXRoKCl7bnVsbCE9PXRoaXMuX3gxJiYodGhpcy5feDE9dGhpcy5feDAsdGhpcy5feTE9dGhpcy5feTAsdGhpcy5fKz0iWiIpfWxpbmVUbyh0LGUpe3RoaXMuXys9YEwke3RoaXMuX3gxPSt0fSwke3RoaXMuX3kxPStlfWB9YXJjKHQsZSxuKXtjb25zdCByPSh0PSt0KSsobj0rbiksaT1lPStlO2lmKG48MCl0aHJvdyBuZXcgRXJyb3IoIm5lZ2F0aXZlIHJhZGl1cyIpO251bGw9PT10aGlzLl94MT90aGlzLl8rPWBNJHtyfSwke2l9YDooTWF0aC5hYnModGhpcy5feDEtcik+JGF8fE1hdGguYWJzKHRoaXMuX3kxLWkpPiRhKSYmKHRoaXMuXys9IkwiK3IrIiwiK2kpLG4mJih0aGlzLl8rPWBBJHtufSwke259LDAsMSwxLCR7dC1ufSwke2V9QSR7bn0sJHtufSwwLDEsMSwke3RoaXMuX3gxPXJ9LCR7dGhpcy5feTE9aX1gKX1yZWN0KHQsZSxuLHIpe3RoaXMuXys9YE0ke3RoaXMuX3gwPXRoaXMuX3gxPSt0fSwke3RoaXMuX3kwPXRoaXMuX3kxPStlfWgkeytufXYkeytyfWgkey1ufVpgfXZhbHVlKCl7cmV0dXJuIHRoaXMuX3x8bnVsbH19Y2xhc3MgTmF7Y29uc3RydWN0b3IoKXt0aGlzLl89W119bW92ZVRvKHQsZSl7dGhpcy5fLnB1c2goW3QsZV0pfWNsb3NlUGF0aCgpe3RoaXMuXy5wdXNoKHRoaXMuX1swXS5zbGljZSgpKX1saW5lVG8odCxlKXt0aGlzLl8ucHVzaChbdCxlXSl9dmFsdWUoKXtyZXR1cm4gdGhpcy5fLmxlbmd0aD90aGlzLl86bnVsbH19Y2xhc3MgUmF7Y29uc3RydWN0b3IodCxbZSxuLHIsaV09WzAsMCw5NjAsNTAwXSl7aWYoISgocj0rcik+PShlPStlKSYmKGk9K2kpPj0obj0rbikpKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBib3VuZHMiKTt0aGlzLmRlbGF1bmF5PXQsdGhpcy5fY2lyY3VtY2VudGVycz1uZXcgRmxvYXQ2NEFycmF5KDIqdC5wb2ludHMubGVuZ3RoKSx0aGlzLnZlY3RvcnM9bmV3IEZsb2F0NjRBcnJheSgyKnQucG9pbnRzLmxlbmd0aCksdGhpcy54bWF4PXIsdGhpcy54bWluPWUsdGhpcy55bWF4PWksdGhpcy55bWluPW4sdGhpcy5faW5pdCgpfXVwZGF0ZSgpe3JldHVybiB0aGlzLmRlbGF1bmF5LnVwZGF0ZSgpLHRoaXMuX2luaXQoKSx0aGlzfV9pbml0KCl7Y29uc3R7ZGVsYXVuYXk6e3BvaW50czp0LGh1bGw6ZSx0cmlhbmdsZXM6bn0sdmVjdG9yczpyfT10aGlzLGk9dGhpcy5jaXJjdW1jZW50ZXJzPXRoaXMuX2NpcmN1bWNlbnRlcnMuc3ViYXJyYXkoMCxuLmxlbmd0aC8zKjIpO2ZvcihsZXQgZSxyLG89MCxsPTAsYT1uLmxlbmd0aDtvPGE7bys9MyxsKz0yKXtjb25zdCBhPTIqbltvXSxzPTIqbltvKzFdLHU9MipuW28rMl0sYz10W2FdLGY9dFthKzFdLGg9dFtzXSxnPXRbcysxXSx2PXRbdV0sZD10W3UrMV0scD1oLWMseT1nLWYsbT12LWMsXz1kLWYsYj0yKihwKl8teSptKTtpZihNYXRoLmFicyhiKTwxZS05KXtsZXQgaT0xZTk7Y29uc3Qgbz0yKm5bMF07aSo9TWF0aC5zaWduKCh0W29dLWMpKl8tKHRbbysxXS1mKSptKSxlPShjK3YpLzItaSpfLHI9KGYrZCkvMitpKm19ZWxzZXtjb25zdCB0PTEvYixuPXAqcCt5KnksaT1tKm0rXypfO2U9YysoXypuLXkqaSkqdCxyPWYrKHAqaS1tKm4pKnR9aVtsXT1lLGlbbCsxXT1yfWxldCBvLGwsYSxzPWVbZS5sZW5ndGgtMV0sdT00KnMsYz10WzIqc10sZj10WzIqcysxXTtyLmZpbGwoMCk7Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDsrK24pcz1lW25dLG89dSxsPWMsYT1mLHU9NCpzLGM9dFsyKnNdLGY9dFsyKnMrMV0scltvKzJdPXJbdV09YS1mLHJbbyszXT1yW3UrMV09Yy1sfXJlbmRlcih0KXtjb25zdCBlPW51bGw9PXQ/dD1uZXcgRWE6dm9pZCAwLHtkZWxhdW5heTp7aGFsZmVkZ2VzOm4saW5lZGdlczpyLGh1bGw6aX0sY2lyY3VtY2VudGVyczpvLHZlY3RvcnM6bH09dGhpcztpZihpLmxlbmd0aDw9MSlyZXR1cm4gbnVsbDtmb3IobGV0IGU9MCxyPW4ubGVuZ3RoO2U8cjsrK2Upe2NvbnN0IHI9bltlXTtpZihyPGUpY29udGludWU7Y29uc3QgaT0yKk1hdGguZmxvb3IoZS8zKSxsPTIqTWF0aC5mbG9vcihyLzMpLGE9b1tpXSxzPW9baSsxXSx1PW9bbF0sYz1vW2wrMV07dGhpcy5fcmVuZGVyU2VnbWVudChhLHMsdSxjLHQpfWxldCBhLHM9aVtpLmxlbmd0aC0xXTtmb3IobGV0IGU9MDtlPGkubGVuZ3RoOysrZSl7YT1zLHM9aVtlXTtjb25zdCBuPTIqTWF0aC5mbG9vcihyW3NdLzMpLHU9b1tuXSxjPW9bbisxXSxmPTQqYSxoPXRoaXMuX3Byb2plY3QodSxjLGxbZisyXSxsW2YrM10pO2gmJnRoaXMuX3JlbmRlclNlZ21lbnQodSxjLGhbMF0saFsxXSx0KX1yZXR1cm4gZSYmZS52YWx1ZSgpfXJlbmRlckJvdW5kcyh0KXtjb25zdCBlPW51bGw9PXQ/dD1uZXcgRWE6dm9pZCAwO3JldHVybiB0LnJlY3QodGhpcy54bWluLHRoaXMueW1pbix0aGlzLnhtYXgtdGhpcy54bWluLHRoaXMueW1heC10aGlzLnltaW4pLGUmJmUudmFsdWUoKX1yZW5kZXJDZWxsKHQsZSl7Y29uc3Qgbj1udWxsPT1lP2U9bmV3IEVhOnZvaWQgMCxyPXRoaXMuX2NsaXAodCk7aWYobnVsbD09PXJ8fCFyLmxlbmd0aClyZXR1cm47ZS5tb3ZlVG8oclswXSxyWzFdKTtsZXQgaT1yLmxlbmd0aDtmb3IoO3JbMF09PT1yW2ktMl0mJnJbMV09PT1yW2ktMV0mJmk+MTspaS09Mjtmb3IobGV0IHQ9Mjt0PGk7dCs9MilyW3RdPT09clt0LTJdJiZyW3QrMV09PT1yW3QtMV18fGUubGluZVRvKHJbdF0sclt0KzFdKTtyZXR1cm4gZS5jbG9zZVBhdGgoKSxuJiZuLnZhbHVlKCl9KmNlbGxQb2x5Z29ucygpe2NvbnN0e2RlbGF1bmF5Ontwb2ludHM6dH19PXRoaXM7Zm9yKGxldCBlPTAsbj10Lmxlbmd0aC8yO2U8bjsrK2Upe2NvbnN0IHQ9dGhpcy5jZWxsUG9seWdvbihlKTt0JiYodC5pbmRleD1lLHlpZWxkIHQpfX1jZWxsUG9seWdvbih0KXtjb25zdCBlPW5ldyBOYTtyZXR1cm4gdGhpcy5yZW5kZXJDZWxsKHQsZSksZS52YWx1ZSgpfV9yZW5kZXJTZWdtZW50KHQsZSxuLHIsaSl7bGV0IG87Y29uc3QgbD10aGlzLl9yZWdpb25jb2RlKHQsZSksYT10aGlzLl9yZWdpb25jb2RlKG4scik7MD09PWwmJjA9PT1hPyhpLm1vdmVUbyh0LGUpLGkubGluZVRvKG4scikpOihvPXRoaXMuX2NsaXBTZWdtZW50KHQsZSxuLHIsbCxhKSkmJihpLm1vdmVUbyhvWzBdLG9bMV0pLGkubGluZVRvKG9bMl0sb1szXSkpfWNvbnRhaW5zKHQsZSxuKXtyZXR1cm4oZT0rZSk9PWUmJihuPStuKT09biYmdGhpcy5kZWxhdW5heS5fc3RlcCh0LGUsbik9PT10fSpuZWlnaGJvcnModCl7Y29uc3QgZT10aGlzLl9jbGlwKHQpO2lmKGUpZm9yKGNvbnN0IG4gb2YgdGhpcy5kZWxhdW5heS5uZWlnaGJvcnModCkpe2NvbnN0IHQ9dGhpcy5fY2xpcChuKTtpZih0KXQ6Zm9yKGxldCByPTAsaT1lLmxlbmd0aDtyPGk7cis9Milmb3IobGV0IG89MCxsPXQubGVuZ3RoO288bDtvKz0yKWlmKGVbcl09PT10W29dJiZlW3IrMV09PT10W28rMV0mJmVbKHIrMiklaV09PT10WyhvK2wtMiklbF0mJmVbKHIrMyklaV09PT10WyhvK2wtMSklbF0pe3lpZWxkIG47YnJlYWsgdH19fV9jZWxsKHQpe2NvbnN0e2NpcmN1bWNlbnRlcnM6ZSxkZWxhdW5heTp7aW5lZGdlczpuLGhhbGZlZGdlczpyLHRyaWFuZ2xlczppfX09dGhpcyxvPW5bdF07aWYoLTE9PT1vKXJldHVybiBudWxsO2NvbnN0IGw9W107bGV0IGE9bztkb3tjb25zdCBuPU1hdGguZmxvb3IoYS8zKTtpZihsLnB1c2goZVsyKm5dLGVbMipuKzFdKSxhPWElMz09Mj9hLTI6YSsxLGlbYV0hPT10KWJyZWFrO2E9clthXX13aGlsZShhIT09byYmLTEhPT1hKTtyZXR1cm4gbH1fY2xpcCh0KXtpZigwPT09dCYmMT09PXRoaXMuZGVsYXVuYXkuaHVsbC5sZW5ndGgpcmV0dXJuW3RoaXMueG1heCx0aGlzLnltaW4sdGhpcy54bWF4LHRoaXMueW1heCx0aGlzLnhtaW4sdGhpcy55bWF4LHRoaXMueG1pbix0aGlzLnltaW5dO2NvbnN0IGU9dGhpcy5fY2VsbCh0KTtpZihudWxsPT09ZSlyZXR1cm4gbnVsbDtjb25zdHt2ZWN0b3JzOm59PXRoaXMscj00KnQ7cmV0dXJuIHRoaXMuX3NpbXBsaWZ5KG5bcl18fG5bcisxXT90aGlzLl9jbGlwSW5maW5pdGUodCxlLG5bcl0sbltyKzFdLG5bcisyXSxuW3IrM10pOnRoaXMuX2NsaXBGaW5pdGUodCxlKSl9X2NsaXBGaW5pdGUodCxlKXtjb25zdCBuPWUubGVuZ3RoO2xldCByLGksbyxsLGE9bnVsbCxzPWVbbi0yXSx1PWVbbi0xXSxjPXRoaXMuX3JlZ2lvbmNvZGUocyx1KSxmPTA7Zm9yKGxldCBoPTA7aDxuO2grPTIpaWYocj1zLGk9dSxzPWVbaF0sdT1lW2grMV0sbz1jLGM9dGhpcy5fcmVnaW9uY29kZShzLHUpLDA9PT1vJiYwPT09YylsPWYsZj0wLGE/YS5wdXNoKHMsdSk6YT1bcyx1XTtlbHNle2xldCBlLG4saCxnLHY7aWYoMD09PW8pe2lmKG51bGw9PT0oZT10aGlzLl9jbGlwU2VnbWVudChyLGkscyx1LG8sYykpKWNvbnRpbnVlO1tuLGgsZyx2XT1lfWVsc2V7aWYobnVsbD09PShlPXRoaXMuX2NsaXBTZWdtZW50KHMsdSxyLGksYyxvKSkpY29udGludWU7W2csdixuLGhdPWUsbD1mLGY9dGhpcy5fZWRnZWNvZGUobixoKSxsJiZmJiZ0aGlzLl9lZGdlKHQsbCxmLGEsYS5sZW5ndGgpLGE/YS5wdXNoKG4saCk6YT1bbixoXX1sPWYsZj10aGlzLl9lZGdlY29kZShnLHYpLGwmJmYmJnRoaXMuX2VkZ2UodCxsLGYsYSxhLmxlbmd0aCksYT9hLnB1c2goZyx2KTphPVtnLHZdfWlmKGEpbD1mLGY9dGhpcy5fZWRnZWNvZGUoYVswXSxhWzFdKSxsJiZmJiZ0aGlzLl9lZGdlKHQsbCxmLGEsYS5sZW5ndGgpO2Vsc2UgaWYodGhpcy5jb250YWlucyh0LCh0aGlzLnhtaW4rdGhpcy54bWF4KS8yLCh0aGlzLnltaW4rdGhpcy55bWF4KS8yKSlyZXR1cm5bdGhpcy54bWF4LHRoaXMueW1pbix0aGlzLnhtYXgsdGhpcy55bWF4LHRoaXMueG1pbix0aGlzLnltYXgsdGhpcy54bWluLHRoaXMueW1pbl07cmV0dXJuIGF9X2NsaXBTZWdtZW50KHQsZSxuLHIsaSxvKXtjb25zdCBsPWk8bztmb3IobCYmKFt0LGUsbixyLGksb109W24scix0LGUsbyxpXSk7Oyl7aWYoMD09PWkmJjA9PT1vKXJldHVybiBsP1tuLHIsdCxlXTpbdCxlLG4scl07aWYoaSZvKXJldHVybiBudWxsO2xldCBhLHMsdT1pfHxvOzgmdT8oYT10KyhuLXQpKih0aGlzLnltYXgtZSkvKHItZSkscz10aGlzLnltYXgpOjQmdT8oYT10KyhuLXQpKih0aGlzLnltaW4tZSkvKHItZSkscz10aGlzLnltaW4pOjImdT8ocz1lKyhyLWUpKih0aGlzLnhtYXgtdCkvKG4tdCksYT10aGlzLnhtYXgpOihzPWUrKHItZSkqKHRoaXMueG1pbi10KS8obi10KSxhPXRoaXMueG1pbiksaT8odD1hLGU9cyxpPXRoaXMuX3JlZ2lvbmNvZGUodCxlKSk6KG49YSxyPXMsbz10aGlzLl9yZWdpb25jb2RlKG4scikpfX1fY2xpcEluZmluaXRlKHQsZSxuLHIsaSxvKXtsZXQgbCxhPUFycmF5LmZyb20oZSk7aWYoKGw9dGhpcy5fcHJvamVjdChhWzBdLGFbMV0sbixyKSkmJmEudW5zaGlmdChsWzBdLGxbMV0pLChsPXRoaXMuX3Byb2plY3QoYVthLmxlbmd0aC0yXSxhW2EubGVuZ3RoLTFdLGksbykpJiZhLnB1c2gobFswXSxsWzFdKSxhPXRoaXMuX2NsaXBGaW5pdGUodCxhKSlmb3IobGV0IGUsbj0wLHI9YS5sZW5ndGgsaT10aGlzLl9lZGdlY29kZShhW3ItMl0sYVtyLTFdKTtuPHI7bis9MillPWksaT10aGlzLl9lZGdlY29kZShhW25dLGFbbisxXSksZSYmaSYmKG49dGhpcy5fZWRnZSh0LGUsaSxhLG4pLHI9YS5sZW5ndGgpO2Vsc2UgdGhpcy5jb250YWlucyh0LCh0aGlzLnhtaW4rdGhpcy54bWF4KS8yLCh0aGlzLnltaW4rdGhpcy55bWF4KS8yKSYmKGE9W3RoaXMueG1pbix0aGlzLnltaW4sdGhpcy54bWF4LHRoaXMueW1pbix0aGlzLnhtYXgsdGhpcy55bWF4LHRoaXMueG1pbix0aGlzLnltYXhdKTtyZXR1cm4gYX1fZWRnZSh0LGUsbixyLGkpe2Zvcig7ZSE9PW47KXtsZXQgbixvO3N3aXRjaChlKXtjYXNlIDU6ZT00O2NvbnRpbnVlO2Nhc2UgNDplPTYsbj10aGlzLnhtYXgsbz10aGlzLnltaW47YnJlYWs7Y2FzZSA2OmU9Mjtjb250aW51ZTtjYXNlIDI6ZT0xMCxuPXRoaXMueG1heCxvPXRoaXMueW1heDticmVhaztjYXNlIDEwOmU9ODtjb250aW51ZTtjYXNlIDg6ZT05LG49dGhpcy54bWluLG89dGhpcy55bWF4O2JyZWFrO2Nhc2UgOTplPTE7Y29udGludWU7Y2FzZSAxOmU9NSxuPXRoaXMueG1pbixvPXRoaXMueW1pbn1yW2ldPT09biYmcltpKzFdPT09b3x8IXRoaXMuY29udGFpbnModCxuLG8pfHwoci5zcGxpY2UoaSwwLG4sbyksaSs9Mil9cmV0dXJuIGl9X3Byb2plY3QodCxlLG4scil7bGV0IGksbyxsLGE9MS8wO2lmKHI8MCl7aWYoZTw9dGhpcy55bWluKXJldHVybiBudWxsOyhpPSh0aGlzLnltaW4tZSkvcik8YSYmKGw9dGhpcy55bWluLG89dCsoYT1pKSpuKX1lbHNlIGlmKHI+MCl7aWYoZT49dGhpcy55bWF4KXJldHVybiBudWxsOyhpPSh0aGlzLnltYXgtZSkvcik8YSYmKGw9dGhpcy55bWF4LG89dCsoYT1pKSpuKX1pZihuPjApe2lmKHQ+PXRoaXMueG1heClyZXR1cm4gbnVsbDsoaT0odGhpcy54bWF4LXQpL24pPGEmJihvPXRoaXMueG1heCxsPWUrKGE9aSkqcil9ZWxzZSBpZihuPDApe2lmKHQ8PXRoaXMueG1pbilyZXR1cm4gbnVsbDsoaT0odGhpcy54bWluLXQpL24pPGEmJihvPXRoaXMueG1pbixsPWUrKGE9aSkqcil9cmV0dXJuW28sbF19X2VkZ2Vjb2RlKHQsZSl7cmV0dXJuKHQ9PT10aGlzLnhtaW4/MTp0PT09dGhpcy54bWF4PzI6MCl8KGU9PT10aGlzLnltaW4/NDplPT09dGhpcy55bWF4Pzg6MCl9X3JlZ2lvbmNvZGUodCxlKXtyZXR1cm4odDx0aGlzLnhtaW4/MTp0PnRoaXMueG1heD8yOjApfChlPHRoaXMueW1pbj80OmU+dGhpcy55bWF4Pzg6MCl9X3NpbXBsaWZ5KHQpe2lmKHQmJnQubGVuZ3RoPjQpe2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSs9Mil7Y29uc3Qgbj0oZSsyKSV0Lmxlbmd0aCxyPShlKzQpJXQubGVuZ3RoOyh0W2VdPT09dFtuXSYmdFtuXT09PXRbcl18fHRbZSsxXT09PXRbbisxXSYmdFtuKzFdPT09dFtyKzFdKSYmKHQuc3BsaWNlKG4sMiksZS09Mil9dC5sZW5ndGh8fCh0PW51bGwpfXJldHVybiB0fX1jb25zdCBDYT0yKk1hdGguUEksQmE9TWF0aC5wb3c7ZnVuY3Rpb24gVWEodCl7cmV0dXJuIHRbMF19ZnVuY3Rpb24gTGEodCl7cmV0dXJuIHRbMV19ZnVuY3Rpb24gRGEodCxlLG4pe3JldHVyblt0K01hdGguc2luKHQrZSkqbixlK01hdGguY29zKHQtZSkqbl19Y2xhc3MgSGF7c3RhdGljIGZyb20odCxlPVVhLG49TGEscil7cmV0dXJuIG5ldyBIYSgibGVuZ3RoImluIHQ/ZnVuY3Rpb24odCxlLG4scil7Y29uc3QgaT10Lmxlbmd0aCxvPW5ldyBGbG9hdDY0QXJyYXkoMippKTtmb3IobGV0IGw9MDtsPGk7KytsKXtjb25zdCBpPXRbbF07b1syKmxdPWUuY2FsbChyLGksbCx0KSxvWzIqbCsxXT1uLmNhbGwocixpLGwsdCl9cmV0dXJuIG99KHQsZSxuLHIpOkZsb2F0NjRBcnJheS5mcm9tKGZ1bmN0aW9uKih0LGUsbixyKXtsZXQgaT0wO2Zvcihjb25zdCBvIG9mIHQpeWllbGQgZS5jYWxsKHIsbyxpLHQpLHlpZWxkIG4uY2FsbChyLG8saSx0KSwrK2l9KHQsZSxuLHIpKSl9Y29uc3RydWN0b3IodCl7dGhpcy5fZGVsYXVuYXRvcj1uZXcgT2EodCksdGhpcy5pbmVkZ2VzPW5ldyBJbnQzMkFycmF5KHQubGVuZ3RoLzIpLHRoaXMuX2h1bGxJbmRleD1uZXcgSW50MzJBcnJheSh0Lmxlbmd0aC8yKSx0aGlzLnBvaW50cz10aGlzLl9kZWxhdW5hdG9yLmNvb3Jkcyx0aGlzLl9pbml0KCl9dXBkYXRlKCl7cmV0dXJuIHRoaXMuX2RlbGF1bmF0b3IudXBkYXRlKCksdGhpcy5faW5pdCgpLHRoaXN9X2luaXQoKXtjb25zdCB0PXRoaXMuX2RlbGF1bmF0b3IsZT10aGlzLnBvaW50cztpZih0Lmh1bGwmJnQuaHVsbC5sZW5ndGg+MiYmZnVuY3Rpb24odCl7Y29uc3R7dHJpYW5nbGVzOmUsY29vcmRzOm59PXQ7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0Kz0zKXtjb25zdCByPTIqZVt0XSxpPTIqZVt0KzFdLG89MiplW3QrMl07aWYoKG5bb10tbltyXSkqKG5baSsxXS1uW3IrMV0pLShuW2ldLW5bcl0pKihuW28rMV0tbltyKzFdKT4xZS0xMClyZXR1cm4hMX1yZXR1cm4hMH0odCkpe3RoaXMuY29sbGluZWFyPUludDMyQXJyYXkuZnJvbSh7bGVuZ3RoOmUubGVuZ3RoLzJ9LCgodCxlKT0+ZSkpLnNvcnQoKCh0LG4pPT5lWzIqdF0tZVsyKm5dfHxlWzIqdCsxXS1lWzIqbisxXSkpO2NvbnN0IHQ9dGhpcy5jb2xsaW5lYXJbMF0sbj10aGlzLmNvbGxpbmVhclt0aGlzLmNvbGxpbmVhci5sZW5ndGgtMV0scj1bZVsyKnRdLGVbMip0KzFdLGVbMipuXSxlWzIqbisxXV0saT0xZS04Kk1hdGguaHlwb3QoclszXS1yWzFdLHJbMl0tclswXSk7Zm9yKGxldCB0PTAsbj1lLmxlbmd0aC8yO3Q8bjsrK3Qpe2NvbnN0IG49RGEoZVsyKnRdLGVbMip0KzFdLGkpO2VbMip0XT1uWzBdLGVbMip0KzFdPW5bMV19dGhpcy5fZGVsYXVuYXRvcj1uZXcgT2EoZSl9ZWxzZSBkZWxldGUgdGhpcy5jb2xsaW5lYXI7Y29uc3Qgbj10aGlzLmhhbGZlZGdlcz10aGlzLl9kZWxhdW5hdG9yLmhhbGZlZGdlcyxyPXRoaXMuaHVsbD10aGlzLl9kZWxhdW5hdG9yLmh1bGwsaT10aGlzLnRyaWFuZ2xlcz10aGlzLl9kZWxhdW5hdG9yLnRyaWFuZ2xlcyxvPXRoaXMuaW5lZGdlcy5maWxsKC0xKSxsPXRoaXMuX2h1bGxJbmRleC5maWxsKC0xKTtmb3IobGV0IHQ9MCxlPW4ubGVuZ3RoO3Q8ZTsrK3Qpe2NvbnN0IGU9aVt0JTM9PTI/dC0yOnQrMV07LTEhPT1uW3RdJiYtMSE9PW9bZV18fChvW2VdPXQpfWZvcihsZXQgdD0wLGU9ci5sZW5ndGg7dDxlOysrdClsW3JbdF1dPXQ7ci5sZW5ndGg8PTImJnIubGVuZ3RoPjAmJih0aGlzLnRyaWFuZ2xlcz1uZXcgSW50MzJBcnJheSgzKS5maWxsKC0xKSx0aGlzLmhhbGZlZGdlcz1uZXcgSW50MzJBcnJheSgzKS5maWxsKC0xKSx0aGlzLnRyaWFuZ2xlc1swXT1yWzBdLG9bclswXV09MSwyPT09ci5sZW5ndGgmJihvW3JbMV1dPTAsdGhpcy50cmlhbmdsZXNbMV09clsxXSx0aGlzLnRyaWFuZ2xlc1syXT1yWzFdKSl9dm9yb25vaSh0KXtyZXR1cm4gbmV3IFJhKHRoaXMsdCl9Km5laWdoYm9ycyh0KXtjb25zdHtpbmVkZ2VzOmUsaHVsbDpuLF9odWxsSW5kZXg6cixoYWxmZWRnZXM6aSx0cmlhbmdsZXM6byxjb2xsaW5lYXI6bH09dGhpcztpZihsKXtjb25zdCBlPWwuaW5kZXhPZih0KTtyZXR1cm4gZT4wJiYoeWllbGQgbFtlLTFdKSx2b2lkKGU8bC5sZW5ndGgtMSYmKHlpZWxkIGxbZSsxXSkpfWNvbnN0IGE9ZVt0XTtpZigtMT09PWEpcmV0dXJuO2xldCBzPWEsdT0tMTtkb3tpZih5aWVsZCB1PW9bc10scz1zJTM9PTI/cy0yOnMrMSxvW3NdIT09dClyZXR1cm47aWYocz1pW3NdLC0xPT09cyl7Y29uc3QgZT1uWyhyW3RdKzEpJW4ubGVuZ3RoXTtyZXR1cm4gdm9pZChlIT09dSYmKHlpZWxkIGUpKX19d2hpbGUocyE9PWEpfWZpbmQodCxlLG49MCl7aWYoKHQ9K3QpIT10fHwoZT0rZSkhPWUpcmV0dXJuLTE7Y29uc3Qgcj1uO2xldCBpO2Zvcig7KGk9dGhpcy5fc3RlcChuLHQsZSkpPj0wJiZpIT09biYmaSE9PXI7KW49aTtyZXR1cm4gaX1fc3RlcCh0LGUsbil7Y29uc3R7aW5lZGdlczpyLGh1bGw6aSxfaHVsbEluZGV4Om8saGFsZmVkZ2VzOmwsdHJpYW5nbGVzOmEscG9pbnRzOnN9PXRoaXM7aWYoLTE9PT1yW3RdfHwhcy5sZW5ndGgpcmV0dXJuKHQrMSklKHMubGVuZ3RoPj4xKTtsZXQgdT10LGM9QmEoZS1zWzIqdF0sMikrQmEobi1zWzIqdCsxXSwyKTtjb25zdCBmPXJbdF07bGV0IGg9Zjtkb3tsZXQgcj1hW2hdO2NvbnN0IGY9QmEoZS1zWzIqcl0sMikrQmEobi1zWzIqcisxXSwyKTtpZihmPGMmJihjPWYsdT1yKSxoPWglMz09Mj9oLTI6aCsxLGFbaF0hPT10KWJyZWFrO2lmKGg9bFtoXSwtMT09PWgpe2lmKGg9aVsob1t0XSsxKSVpLmxlbmd0aF0saCE9PXImJkJhKGUtc1syKmhdLDIpK0JhKG4tc1syKmgrMV0sMik8YylyZXR1cm4gaDticmVha319d2hpbGUoaCE9PWYpO3JldHVybiB1fXJlbmRlcih0KXtjb25zdCBlPW51bGw9PXQ/dD1uZXcgRWE6dm9pZCAwLHtwb2ludHM6bixoYWxmZWRnZXM6cix0cmlhbmdsZXM6aX09dGhpcztmb3IobGV0IGU9MCxvPXIubGVuZ3RoO2U8bzsrK2Upe2NvbnN0IG89cltlXTtpZihvPGUpY29udGludWU7Y29uc3QgbD0yKmlbZV0sYT0yKmlbb107dC5tb3ZlVG8obltsXSxuW2wrMV0pLHQubGluZVRvKG5bYV0sblthKzFdKX1yZXR1cm4gdGhpcy5yZW5kZXJIdWxsKHQpLGUmJmUudmFsdWUoKX1yZW5kZXJQb2ludHModCxlKXt2b2lkIDAhPT1lfHx0JiYiZnVuY3Rpb24iPT10eXBlb2YgdC5tb3ZlVG98fChlPXQsdD1udWxsKSxlPW51bGw9PWU/MjorZTtjb25zdCBuPW51bGw9PXQ/dD1uZXcgRWE6dm9pZCAwLHtwb2ludHM6cn09dGhpcztmb3IobGV0IG49MCxpPXIubGVuZ3RoO248aTtuKz0yKXtjb25zdCBpPXJbbl0sbz1yW24rMV07dC5tb3ZlVG8oaStlLG8pLHQuYXJjKGksbyxlLDAsQ2EpfXJldHVybiBuJiZuLnZhbHVlKCl9cmVuZGVySHVsbCh0KXtjb25zdCBlPW51bGw9PXQ/dD1uZXcgRWE6dm9pZCAwLHtodWxsOm4scG9pbnRzOnJ9PXRoaXMsaT0yKm5bMF0sbz1uLmxlbmd0aDt0Lm1vdmVUbyhyW2ldLHJbaSsxXSk7Zm9yKGxldCBlPTE7ZTxvOysrZSl7Y29uc3QgaT0yKm5bZV07dC5saW5lVG8ocltpXSxyW2krMV0pfXJldHVybiB0LmNsb3NlUGF0aCgpLGUmJmUudmFsdWUoKX1odWxsUG9seWdvbigpe2NvbnN0IHQ9bmV3IE5hO3JldHVybiB0aGlzLnJlbmRlckh1bGwodCksdC52YWx1ZSgpfXJlbmRlclRyaWFuZ2xlKHQsZSl7Y29uc3Qgbj1udWxsPT1lP2U9bmV3IEVhOnZvaWQgMCx7cG9pbnRzOnIsdHJpYW5nbGVzOml9PXRoaXMsbz0yKmlbdCo9M10sbD0yKmlbdCsxXSxhPTIqaVt0KzJdO3JldHVybiBlLm1vdmVUbyhyW29dLHJbbysxXSksZS5saW5lVG8ocltsXSxyW2wrMV0pLGUubGluZVRvKHJbYV0sclthKzFdKSxlLmNsb3NlUGF0aCgpLG4mJm4udmFsdWUoKX0qdHJpYW5nbGVQb2x5Z29ucygpe2NvbnN0e3RyaWFuZ2xlczp0fT10aGlzO2ZvcihsZXQgZT0wLG49dC5sZW5ndGgvMztlPG47KytlKXlpZWxkIHRoaXMudHJpYW5nbGVQb2x5Z29uKGUpfXRyaWFuZ2xlUG9seWdvbih0KXtjb25zdCBlPW5ldyBOYTtyZXR1cm4gdGhpcy5yZW5kZXJUcmlhbmdsZSh0LGUpLGUudmFsdWUoKX19ZnVuY3Rpb24gWGEodCxlLG49e30pe2lmKCFObyh0KSlyZXR1cm57ZXJyOiJwc1NyYyBpcyBub3QgYW4gYXJyYXkifTtpZighSW8oZSkmJiFObyhlKSlyZXR1cm57ZXJyOiJwc1RhciBpcyBub3QgYW4gb2JqZWN0IG9yIGFycmF5In07bGV0IHI9SW8oZSk7ciYmKGU9W2VdKTtsZXQgaT1fZShuLCJrZXlYIik7QWUoaSl8fChpPSJ4Iik7bGV0IG89X2Uobiwia2V5WSIpO0FlKG8pfHwobz0ieSIpO2xldCBsPV9lKG4sImtleVoiKTtBZShsKXx8KGw9InoiKTtsZXQgYT1fZShuLCJzY2FsZSIpO1JvKGEpfHwoYT0xKSxhPUdvKGEpO2xldCBzPV9lKG4sImZ1bkludGVycEZyYWdtZW50IiksdT1mdW5jdGlvbih0KXtsZXQgZT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCk7cmV0dXJuIltvYmplY3QgRnVuY3Rpb25dIj09PWV8fCJbb2JqZWN0IEFzeW5jRnVuY3Rpb25dIj09PWV9KHMpLGM9ImluZCI7aWYodD1lbCh0LHtrZXlYOmksa2V5WTpvLGtleVo6bCxrZXlJbmQ6Y30pLDA9PT1rbyh0KSlyZXR1cm57ZXJyOiJwc1NyYyBoYXMgbm8gZWZmZWN0aXZlIGRhdGEifTtpZihlPXRsKGUse2tleVg6aSxrZXlZOm8sa2V5SW5kOmN9KSwwPT09a28oZSkpcmV0dXJue2VycjoicHNUYXIgaGFzIG5vIGVmZmVjdGl2ZSBkYXRhIn07bGV0IGY9Q2wodCx7a2V5SW5kOmMsc2NhbGU6YX0pO3Q9Zi5wcztsZXQgaD1mLm52LGc9Zi5pbnYsdj1bLi4udF0sZD1bLi4udF0scD17fTtFbih0LCh0PT57bGV0IGU9YCR7dC54fS0ke3QueX1gO3BbZV09dC56fSkpO2xldCB5LG09SGEuZnJvbShkLCh0PT50LngpLCh0PT50LnkpKSxfPVswLDAsYSxhXSxiPW0udm9yb25vaShfKSx4PShlLG4scik9PntsZXQgaT1bLi4udF0sbz17eDpuLHk6cix6OjB9O2kucHVzaChvKSxlLnB1c2gobyk7bGV0IGw9SGEuZnJvbShpLCh0PT50LngpLCh0PT50LnkpKS52b3Jvbm9pKF8pLGE9aS5sZW5ndGgtMSxjPWwuY2VsbFBvbHlnb24oYSksZj1KbChjKSxoPW51bGw7aWYoZj4wKXtsZXQgdD1bXSxuPWwuZGVsYXVuYXkubmVpZ2hib3JzKGEpLHI9bi5uZXh0KCk7Zm9yKDshci5kb25lOyl7bGV0IGU9ci52YWx1ZTt0LnB1c2goZSkscj1uLm5leHQoKX1sZXQgaT1WaSh0LCh0PT57bGV0IGU9W2NdLG49W2IuY2VsbFBvbHlnb24odCldLHI9W107dHJ5e3I9ZnVuY3Rpb24odCxlKXtpZighTm8odCkpcmV0dXJuIG51bGw7aWYoIU5vKGUpKXJldHVybiBudWxsO3Q9WmwodCksZT1abChlKTtsZXQgbj1mYS5pbnRlcnNlY3Qoe3JlZ2lvbnM6dH0se3JlZ2lvbnM6ZX0pO3JldHVybiBfZShuLCJyZWdpb25zIixbXSl9KGUsbil9Y2F0Y2godCl7Y29uc29sZS5sb2coInBnczEiLGUpLGNvbnNvbGUubG9nKCJwZ3MyIixuKSxjb25zb2xlLmxvZyh0KX1sZXQgaT0wO2lmKDE9PT1rbyhyKSl0cnl7aT1KbChyWzBdKX1jYXRjaCh0KXtjb25zb2xlLmxvZygicGdzSW50cyIsciksY29uc29sZS5sb2codCl9cmV0dXJue2lhOmksaWR4OnR9fSkpO2g9VmkoaSwodD0+e2xldCBuPXQuaWEvZixyPWVbdC5pZHhdLnosaT1uKnI7cmV0dXJuIHUmJihyPXMoe3Y6aSxhcmVhOnQuaWEsYXJlYVRvdGFsOmYsYXJlYVJhdGlvOm4sejpyLGluZDp0LmlkeH0pKSxpfSkpLGg9UWkoaCl9cmV0dXJuIGVbZS5sZW5ndGgtMV0uej1oLGh9LHc9KHQsZSk9PntsZXQgbj1gJHt0fS0ke2V9YDtpZihRbyhwLG4pKXJldHVybiBwW25dO2lmKHQ8X1swXXx8dD5fWzJdfHxlPF9bMV18fGU+X1szXSlyZXR1cm4gbnVsbDtsZXQgcj0oKHQsZSxuKT0+e2xldCByO3RyeXtyPXgodCxlLG4pfWNhdGNoKGUpe2NvbnNvbGUubG9nKGUpLHI9bnVsbCx0LnBvcCgpfXJldHVybiByfSkodix0LGUpO3JldHVybiBwW25dPXIscn0saj10PT57bGV0IGU9dC54LG49aChlLDApO2lmKCFUbyhuKSl0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgbnhbJHtufV1gKTtsZXQgcj10LnksYT1oKHIsMSk7aWYoIVRvKGEpKXRocm93IG5ldyBFcnJvcihgaW52YWxpZCBueVske2F9XWApO2xldCBzPXcobixhKSx1PWcocywyKTtyZXR1cm4gVG8odSl8fCh1PW51bGwpLHtbaV06ZSxbb106cixbbF06dX19O2lmKHIpe2xldCB0PWVbMF07eT1qKHQpfWVsc2UgeT1bXSxFbihlLCh0PT57eS5wdXNoKGoodCkpfSkpO3JldHVybiB5fWxldCBZYT17fSxLYT1mdW5jdGlvbih0LGUpe2xldCBuPVtdO2ZvcihsZXQgcj0wO3I8ZTtyKyspbi5wdXNoKHQpO3JldHVybiBufSxaYT1mdW5jdGlvbih0LGUpe2xldCBuPUthKDAsZSplKTtmb3IobGV0IHI9MDtyPGU7cisrKW5bciplK3JdPXQ7cmV0dXJuIG59LEphPWZ1bmN0aW9uKHQsZSxuLHIpe2xldCBpLG8sbD1BcnJheShuKnIpO2ZvcihpPTA7aTxuO2krKylmb3Iobz0wO288cjtvKyspbFtpKnIrb109dFtpKnIrb10rZVtpKnIrb107cmV0dXJuIGx9LFZhPWZ1bmN0aW9uKHQsZSxuLHIsaSl7bGV0IG8sbCxhLHM9QXJyYXkobippKTtmb3Iobz0wO288bjtvKyspZm9yKGw9MDtsPGk7bCsrKWZvcihzW28qaStsXT0wLGE9MDthPHI7YSsrKXNbbyppK2xdKz10W28qcithXSplW2EqaStsXTtyZXR1cm4gc30sV2E9ZnVuY3Rpb24odCxlKXtsZXQgbixyLGksbz1BcnJheShlKTtmb3Iobj0wO248ZTtuKyspb1tuXT10W24qZStuXTtmb3Iobj0wO248ZTtuKyspe2ZvcihyPTA7cjxuO3IrKylvW25dLT10W24qZStyXSp0W24qZStyXTtpZihvW25dPD0wKXJldHVybiExO2ZvcihvW25dPU1hdGguc3FydChvW25dKSxyPW4rMTtyPGU7cisrKXtmb3IoaT0wO2k8bjtpKyspdFtyKmUrbl0tPXRbciplK2ldKnRbbiplK2ldO3RbciplK25dLz1vW25dfX1mb3Iobj0wO248ZTtuKyspdFtuKmUrbl09b1tuXTtyZXR1cm4hMH0scWE9ZnVuY3Rpb24odCxlKXtsZXQgbixyLGksbztmb3Iobj0wO248ZTtuKyspZm9yKHRbbiplK25dPTEvdFtuKmUrbl0scj1uKzE7cjxlO3IrKyl7Zm9yKG89MCxpPW47aTxyO2krKylvLT10W3IqZStpXSp0W2kqZStuXTt0W3IqZStuXT1vL3RbciplK3JdfWZvcihuPTA7bjxlO24rKylmb3Iocj1uKzE7cjxlO3IrKyl0W24qZStyXT0wO2ZvcihuPTA7bjxlO24rKyl7Zm9yKHRbbiplK25dKj10W24qZStuXSxpPW4rMTtpPGU7aSsrKXRbbiplK25dKz10W2kqZStuXSp0W2kqZStuXTtmb3Iocj1uKzE7cjxlO3IrKylmb3IoaT1yO2k8ZTtpKyspdFtuKmUrcl0rPXRbaSplK25dKnRbaSplK3JdfWZvcihuPTA7bjxlO24rKylmb3Iocj0wO3I8bjtyKyspdFtuKmUrcl09dFtyKmUrbl19LEdhPWZ1bmN0aW9uKHQsZSl7bGV0IG4scixpLG8sbCxhLHMsdSxjLGYsaCxnPWUsdj1BcnJheShlKmUpLGQ9QXJyYXkoZSkscD1BcnJheShlKSx5PUFycmF5KGUpO2ZvcihuPTA7bjxlO24rKylmb3Iobz0wO288ZTtvKyspdltuKmUrb109bj09PW8/MTowO2ZvcihvPTA7bzxlO28rKyl5W29dPTA7Zm9yKG49MDtuPGU7bisrKXtmb3IodT0wLG89MDtvPGU7bysrKWlmKDEhPT15W29dKWZvcihsPTA7bDxlO2wrKykwPT09eVtsXSYmTWF0aC5hYnModFtvKmUrbF0pPj11JiYodT1NYXRoLmFicyh0W28qZStsXSksaT1vLHI9bCk7aWYoKyt5W3JdLGkhPT1yKXtmb3IoYT0wO2E8ZTthKyspaD10W2kqZSthXSx0W2kqZSthXT10W3IqZSthXSx0W3IqZSthXT1oO2ZvcihhPTA7YTxnO2ErKyloPXZbaSplK2FdLHZbaSplK2FdPXZbciplK2FdLHZbciplK2FdPWh9aWYocFtuXT1pLGRbbl09ciwwPT09dFtyKmUrcl0pcmV0dXJuITE7Zm9yKGY9MS90W3IqZStyXSx0W3IqZStyXT0xLGE9MDthPGU7YSsrKXRbciplK2FdKj1mO2ZvcihhPTA7YTxnO2ErKyl2W3IqZSthXSo9Zjtmb3Iocz0wO3M8ZTtzKyspaWYocyE9PXIpe2ZvcihjPXRbcyplK3JdLHRbcyplK3JdPTAsYT0wO2E8ZTthKyspdFtzKmUrYV0tPXRbciplK2FdKmM7Zm9yKGE9MDthPGc7YSsrKXZbcyplK2FdLT12W3IqZSthXSpjfX1mb3IoYT1lLTE7YT49MDthLS0paWYocFthXSE9PWRbYV0pZm9yKGw9MDtsPGU7bCsrKWg9dFtsKmUrcFthXV0sdFtsKmUrcFthXV09dFtsKmUrZFthXV0sdFtsKmUrZFthXV09aDtyZXR1cm4hMH0sUWE9ZnVuY3Rpb24odCxlLG4scixpKXtyZXR1cm4gZSsoci1lKS9uKigxLU1hdGguZXhwKC0xL2kqTWF0aC5wb3codC9uLDIpKSl9LHRzPWZ1bmN0aW9uKHQsZSxuLHIsaSl7cmV0dXJuIGUrKHItZSkvbiooMS1NYXRoLmV4cCgtMS9pKih0L24pKSl9LGVzPWZ1bmN0aW9uKHQsZSxuLHIsaSl7cmV0dXJuIHQ+bj9lKyhyLWUpL246ZSsoci1lKS9uKih0L24qMS41LS41Kk1hdGgucG93KHQvbiwzKSl9O2Z1bmN0aW9uIG5zKHQsZSxuPXt9KXtpZighTm8odCkpcmV0dXJue2VycjoicHNTcmMgaXMgbm90IGFuIGFycmF5In07aWYoIUlvKGUpJiYhTm8oZSkpcmV0dXJue2VycjoicHNUYXIgaXMgbm90IGFuIG9iamVjdCBvciBhcnJheSJ9O2xldCByPUlvKGUpO3ImJihlPVtlXSk7bGV0IGk9X2Uobiwia2V5WCIpO0FlKGkpfHwoaT0ieCIpO2xldCBvPV9lKG4sImtleVkiKTtBZShvKXx8KG89InkiKTtsZXQgbD1fZShuLCJrZXlaIik7QWUobCl8fChsPSJ6Iik7bGV0IGE9X2Uobiwic2NhbGUiKTtSbyhhKXx8KGE9MSksYT1HbyhhKTtsZXQgcz1fZShuLCJtb2RlbCIpOyJleHBvbmVudGlhbCIhPT1zJiYiZ2F1c3NpYW4iIT09cyYmInNwaGVyaWNhbCIhPT1zJiYocz0iZXhwb25lbnRpYWwiKTtsZXQgdT1fZShuLCJzaWdtYTIiKTtSbyh1KXx8KHU9MCksdT1Hbyh1KTtsZXQgYz1fZShuLCJhbHBoYSIpO1JvKGMpfHwoYz0xMDApLGM9R28oYyk7bGV0IGY9X2UobiwicmV0dXJuV2l0aFZhcmlvZ3JhbSIpO2lmKGplKGYpfHwoZj0hMSksdD1lbCh0LG4pLDA9PT1rbyh0KSlyZXR1cm57ZXJyOiJwc1NyYyBoYXMgbm8gZWZmZWN0aXZlIGRhdGEifTtpZihlPXRsKGUsbiksMD09PWtvKGUpKXJldHVybntlcnI6InBzVGFyIGhhcyBubyBlZmZlY3RpdmUgZGF0YSJ9O2xldCBoPUNsKHQse3NjYWxlOmF9KTt0PWgucHM7bGV0IGc9aC5udix2PWguaW52LGQ9e307RW4odCwodD0+e2xldCBlPWAke3QueH0tJHt0Lnl9YDtkW2VdPXQuen0pKTtsZXQgcD1bXSx5PVtdLG09W107RW4odCwodD0+e3AucHVzaCh0LngpLHkucHVzaCh0LnkpLG0ucHVzaCh0LnopfSkpO2xldCBfLGI9WWEudHJhaW4obSxwLHkscyx1LGMpLHg9dD0+e2xldCBlPXQueCxuPWcoZSwwKTtpZighVG8obikpdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG54WyR7bn1dYCk7bGV0IHI9dC55LGE9ZyhyLDEpO2lmKCFUbyhhKSl0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgbnlbJHthfV1gKTtsZXQgcz0oKHQsZSk9PntsZXQgbj1gJHt0fS0ke2V9YDtpZihRbyhkLG4pKXJldHVybiBkW25dO2xldCByPVlhLnByZWRpY3QodCxlLGIpO3JldHVybiBkW25dPXIscn0pKG4sYSksdT12KHMsMik7cmV0dXJuIFRvKHUpfHwodT1udWxsKSx7W2ldOmUsW29dOnIsW2xdOnV9fTtpZihyKXtsZXQgdD1lWzBdO189eCh0KX1lbHNlIF89W10sRW4oZSwodD0+e18ucHVzaCh4KHQpKX0pKTtyZXR1cm4gZiYmKF89e3Jlc3VsdDpfLHZhcmlvZ3JhbTpifSksX31mdW5jdGlvbiBpbnRlcnAyKHQsZSxuPXt9KXtsZXQgcj1fZShuLCJtZXRob2QiKTsibmF0dXJhbE5laWdoYm9yIiE9PXImJiJrcmlnaW5nIiE9PXImJihyPSJuYXR1cmFsTmVpZ2hib3IiKTtsZXQgaT1fZShuLCJ1c2VTeW5jIik7amUoaSl8fChpPSExKTtsZXQgbz0oKT0+e2xldCBpPW51bGw7dHJ5eyJuYXR1cmFsTmVpZ2hib3IiPT09cj9pPVhhKHQsZSxuKToia3JpZ2luZyI9PT1yJiYoaT1ucyh0LGUsbikpfWNhdGNoKHQpe2k9e2Vycjp0LnRvU3RyaW5nKCl9fXJldHVybiBpfTtyZXR1cm4gaT9vKCk6KGFzeW5jKCk9PntsZXQgdD1udWxsO3RyeXt0PW8oKTtsZXQgZT1fZSh0LCJlcnIiKTtyZXR1cm4gQWUoZSk/UHJvbWlzZS5yZWplY3QoZSk6dH1jYXRjaCh0KXtyZXR1cm4gY29uc29sZS5sb2codCksUHJvbWlzZS5yZWplY3QodC50b1N0cmluZygpKX19KSgpfVlhLnRyYWluPWZ1bmN0aW9uKHQsZSxuLHIsaSxvKXtsZXQgbCxhLHMsdSxjPXt0OnQseDplLHk6bixudWdnZXQ6MCxyYW5nZTowLHNpbGw6MCxBOjEvMyxuOjB9O3N3aXRjaChyKXtjYXNlImdhdXNzaWFuIjpjLm1vZGVsPVFhO2JyZWFrO2Nhc2UiZXhwb25lbnRpYWwiOmMubW9kZWw9dHM7YnJlYWs7Y2FzZSJzcGhlcmljYWwiOmMubW9kZWw9ZXN9bGV0IGY9dC5sZW5ndGgsaD1BcnJheSgoZipmLWYpLzIpO2ZvcihsPTAscz0wO2w8ZjtsKyspZm9yKGE9MDthPGw7YSsrLHMrKyloW3NdPUFycmF5KDIpLGhbc11bMF09TWF0aC5wb3coTWF0aC5wb3coZVtsXS1lW2FdLDIpK01hdGgucG93KG5bbF0tblthXSwyKSwuNSksaFtzXVsxXT1NYXRoLmFicyh0W2xdLXRbYV0pO2guc29ydCgoZnVuY3Rpb24odCxlKXtyZXR1cm4gdFswXS1lWzBdfSkpLGMucmFuZ2U9aFsoZipmLWYpLzItMV1bMF07bGV0IGc9KGYqZi1mKS8yPjMwPzMwOihmKmYtZikvMix2PWMucmFuZ2UvZyxkPUthKDAsZykscD1LYSgwLGcpO2lmKGc8MzApZm9yKHU9MDt1PGc7dSsrKWRbdV09aFt1XVswXSxwW3VdPWhbdV1bMV07ZWxzZXtmb3IobD0wLGE9MCxzPTAsdT0wO2w8ZyYmYTwoZipmLWYpLzI7bCsrLHM9MCl7Zm9yKDtoW2FdWzBdPD0obCsxKSp2JiYoZFt1XSs9aFthXVswXSxwW3VdKz1oW2FdWzFdLGErKyxzKyssIShhPj0oZipmLWYpLzIpKTspO3M+MCYmKGRbdV0vPXMscFt1XS89cyx1KyspfWlmKHU8MilyZXR1cm4gY31sZXQgeT1bXTtmb3IobD0wO2w8dTtsKyspe2xldCB0PWRbbF0sZT1wW2xdO3kucHVzaChbdCxlXSl9bGV0IG09e2RhdGE6aCxiYXJzOnl9O2Muc3ZwZD1tLGY9dSxjLnJhbmdlPWRbZi0xXS1kWzBdO2xldCBfPUthKDEsMipmKSxiPUFycmF5KGYpLHg9Yy5BO2ZvcihsPTA7bDxmO2wrKyl7c3dpdGNoKHIpe2Nhc2UiZ2F1c3NpYW4iOl9bMipsKzFdPTEtTWF0aC5leHAoLTEveCpNYXRoLnBvdyhkW2xdL2MucmFuZ2UsMikpO2JyZWFrO2Nhc2UiZXhwb25lbnRpYWwiOl9bMipsKzFdPTEtTWF0aC5leHAoLTEveCpkW2xdL2MucmFuZ2UpO2JyZWFrO2Nhc2Uic3BoZXJpY2FsIjpfWzIqbCsxXT1kW2xdL2MucmFuZ2UqMS41LS41Kk1hdGgucG93KGRbbF0vYy5yYW5nZSwzKX1iW2xdPXBbbF19bGV0IHc9ZnVuY3Rpb24odCxlLG4pe2xldCByLGksbz1BcnJheShuKmUpO2ZvcihyPTA7cjxlO3IrKylmb3IoaT0wO2k8bjtpKyspb1tpKmUrcl09dFtyKm4raV07cmV0dXJuIG99KF8sZiwyKSxqPVZhKHcsXywyLGYsMik7aj1KYShqLFphKDEvbywyKSwyLDIpO2xldCBTPWouc2xpY2UoMCk7V2EoaiwyKT9xYShqLDIpOihHYShTLDIpLGo9Uyk7bGV0IEE9VmEoVmEoaix3LDIsMixmKSxiLDIsZiwxKTtjLm51Z2dldD1BWzBdLGMuc2lsbD1BWzFdKmMucmFuZ2UrYy5udWdnZXQsYy5uPWUubGVuZ3RoLGY9ZS5sZW5ndGg7bGV0IE89QXJyYXkoZipmKTtmb3IobD0wO2w8ZjtsKyspe2ZvcihhPTA7YTxsO2ErKylPW2wqZithXT1jLm1vZGVsKE1hdGgucG93KE1hdGgucG93KGVbbF0tZVthXSwyKStNYXRoLnBvdyhuW2xdLW5bYV0sMiksLjUpLGMubnVnZ2V0LGMucmFuZ2UsYy5zaWxsLGMuQSksT1thKmYrbF09T1tsKmYrYV07T1tsKmYrbF09Yy5tb2RlbCgwLGMubnVnZ2V0LGMucmFuZ2UsYy5zaWxsLGMuQSl9bGV0IE09SmEoTyxaYShpLGYpLGYsZiksaz1NLnNsaWNlKDApO1dhKE0sZik/cWEoTSxmKTooR2EoayxmKSxNPWspO2xldCBQPU0uc2xpY2UoMCksRj1WYShNLHQsZixmLDEpO3JldHVybiBjLks9UCxjLk09RixjfSxZYS5wcmVkaWN0PWZ1bmN0aW9uKHQsZSxuKXtsZXQgcixpPUFycmF5KG4ubik7Zm9yKHI9MDtyPG4ubjtyKyspaVtyXT1uLm1vZGVsKE1hdGgucG93KE1hdGgucG93KHQtbi54W3JdLDIpK01hdGgucG93KGUtbi55W3JdLDIpLC41KSxuLm51Z2dldCxuLnJhbmdlLG4uc2lsbCxuLkEpO3JldHVybiBWYShpLG4uTSwxLG4ubiwxKVswXX0sWWEudmFyaWFuY2U9ZnVuY3Rpb24odCxlLG4pe2xldCByLGk9QXJyYXkobi5uKTtmb3Iocj0wO3I8bi5uO3IrKylpW3JdPW4ubW9kZWwoTWF0aC5wb3coTWF0aC5wb3codC1uLnhbcl0sMikrTWF0aC5wb3coZS1uLnlbcl0sMiksLjUpLG4ubnVnZ2V0LG4ucmFuZ2Usbi5zaWxsLG4uQSk7cmV0dXJuIG4ubW9kZWwoMCxuLm51Z2dldCxuLnJhbmdlLG4uc2lsbCxuLkEpK1ZhKFZhKGksbi5LLDEsbi5uLG4ubiksaSwxLG4ubiwxKVswXX07CgpsZXQgaW5zdGFuY2UgPSBudWxsCmZ1bmN0aW9uIGluaXQoaW5wdXQpewoKICAgIC8vaW5pdAogICAgbGV0IHIKICAgIAogICAgICAgIHIgPSB7CiAgICAgICAgICAgIG1haW46IGludGVycDIKICAgICAgICB9CiAgICAgICAgCgogICAgLy9vbgogICAgCgogICAgLy9zYXZlCiAgICBpbnN0YW5jZSA9IHIKCn0KCmZ1bmN0aW9uIHNlbmRNZXNzYWdlKGRhdGEpIHsKICAgIAogICAgICAgIHBhcmVudFBvcnQucG9zdE1lc3NhZ2UoZGF0YSkKICAgICAgICAKfQoKYXN5bmMgZnVuY3Rpb24gcnVuKGRhdGEpIHsKICAgIC8vIGNvbnNvbGUubG9nKCdpbm5lciB3b3JrZXIgcnVuJyxkYXRhKQoKICAgIC8vbW9kZQogICAgbGV0IG1vZGUgPSBkYXRhLm1vZGUKCiAgICAvL2NoZWNrCiAgICBpZihtb2RlICE9PSAnaW5pdCcgJiYgbW9kZSAhPT0gJ2NhbGwnKXsKICAgICAgICByZXR1cm4KICAgIH0KCiAgICAvL2luaXQKICAgIGlmKG1vZGUgPT09ICdpbml0Jyl7CiAgICAgICAgCiAgICAgICAgdHJ5ewoKICAgICAgICAgICAgLy90eXBlCiAgICAgICAgICAgIGxldCB0eXBlID0gZGF0YS50eXBlCgogICAgICAgICAgICAvL2lucHV0CiAgICAgICAgICAgIGxldCBpbnB1dCA9IGRhdGEuaW5wdXQKICAgIAogICAgICAgICAgICAvL2luc3RhbmNlCiAgICAgICAgICAgIGlmKHR5cGUgPT09ICdmdW5jdGlvbicpewogICAgICAgICAgICAgICAgaW5pdCguLi5pbnB1dCkKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmKHR5cGUgPT09ICdvYmplY3QnKXsKICAgICAgICAgICAgICAgIGluc3RhbmNlID0gaW50ZXJwMgogICAgICAgICAgICB9CgogICAgICAgIH0KICAgICAgICBjYXRjaChlcnIpewogICAgICAgIAogICAgICAgICAgICAvL3NlbmRNZXNzYWdlCiAgICAgICAgICAgIGxldCByZXMgPSB7CiAgICAgICAgICAgICAgICBtb2RlOiAnZW1pdCcsCiAgICAgICAgICAgICAgICBldk5hbWU6ICdlcnJvcicsCiAgICAgICAgICAgICAgICBtc2c6IGVyciwKICAgICAgICAgICAgfQogICAgICAgICAgICBzZW5kTWVzc2FnZShyZXMpCgogICAgICAgIH0KICAgICAgICAgICAgCiAgICB9CgogICAgLy9jaGVjawogICAgaWYobW9kZSA9PT0gJ2NhbGwnKXsKICAgICAgICBsZXQgc3RhdGUgPSAnJwogICAgICAgIGxldCBtc2cgPSBudWxsCgogICAgICAgIHRyeXsKCiAgICAgICAgICAgIC8vZnVuCiAgICAgICAgICAgIGxldCBmdW4gPSBpbnN0YW5jZVtkYXRhLmZ1bl0KCiAgICAgICAgICAgIC8vaW5wdXQKICAgICAgICAgICAgbGV0IGlucHV0ID0gZGF0YS5pbnB1dAoKICAgICAgICAgICAgLy9leGVjCiAgICAgICAgICAgIGF3YWl0IGZ1biguLi5pbnB1dCkKICAgICAgICAgICAgICAgIC50aGVuKChzdWMpID0+IHsKICAgICAgICAgICAgICAgICAgICBzdGF0ZT0nc3VjY2VzcycKICAgICAgICAgICAgICAgICAgICBtc2c9c3VjCiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgLmNhdGNoKChlcnIpID0+IHsKICAgICAgICAgICAgICAgICAgICBzdGF0ZT0nZXJyb3InCiAgICAgICAgICAgICAgICAgICAgbXNnPWVycgogICAgICAgICAgICAgICAgfSkKCiAgICAgICAgfQogICAgICAgIGNhdGNoKGVycil7CiAgICAgICAgICAgIHN0YXRlID0gJ2Vycm9yJwogICAgICAgICAgICBtc2cgPSBlcnIKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLy9zZW5kTWVzc2FnZQogICAgICAgIGxldCByZXMgPSB7CiAgICAgICAgICAgIG1vZGU6ICdyZXR1cm4nLAogICAgICAgICAgICBpZDogZGF0YS5pZCwKICAgICAgICAgICAgZnVuOiBkYXRhLmZ1biwKICAgICAgICAgICAgc3RhdGUsCiAgICAgICAgICAgIG1zZywKICAgICAgICB9CiAgICAgICAgc2VuZE1lc3NhZ2UocmVzKQoKICAgIH0KCn0KCmZ1bmN0aW9uIHJlY3ZNZXNzYWdlKGRhdGEpIHsKICAgIC8vIGNvbnNvbGUubG9nKCdpbm5lciB3b3JrZXIgcmVjdjonLCBkYXRhKQoKICAgIC8vZGF0YVJlY3YKICAgIGxldCBkYXRhUmVjdiA9IGRhdGEKCiAgICAvL3J1bgogICAgcnVuKGRhdGFSZWN2KQoKfQoKCiAgICAgICAgcGFyZW50UG9ydC5vbignbWVzc2FnZScsIHJlY3ZNZXNzYWdlKQogICAgICAgIAoK",Buffer.from(m,"base64").toString("utf8"));var m;function X(){let Z=new l,m=function(d){try{return new b.Worker(d,{eval:!0})}catch(b){G(b)}}(d);if(!m)return G("invalid worker"),null;function X(){let b=function(){let b,d,l=new Promise((function(){b=arguments[0],d=arguments[1]}));return l.resolve=b,l.reject=d,l}(),d=function(){let b=arguments.length>0&&void 0!==arguments[0]?arguments[0]:10,d=[],l="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""),Z=l.length;for(let m=0;m<b;m++)d[m]=l[0|Math.random()*Z];return d.join("")}(),l={mode:"call",id:d,fun:"main",input:[...arguments]};return m.postMessage(l),Z.once(d,(d=>{"success"===d.state?b.resolve(d.msg):b.reject(d.msg)})),b}function G(b){Z.emit("error",b)}return m.on("message",(function(b){let d=b,l=d.mode;"emit"!==l&&"return"!==l||("emit"===l&&Z.emit(d.evName,d.msg),"return"===l&&Z.emit(d.id,d))})),m.on("error",G),function(){let b={mode:"init",type:"function",input:[...arguments]};m.postMessage(b)}([...arguments]),Z.main=X,Z.main=X,Z.terminate=function(){m?(m.terminate(),m=void 0):G("worker has been terminated")},Z}Z=async function(){let b=[...arguments],d=X();return await d.main(...b).finally((()=>{d.terminate()}))}}(),Z}(b)}({get exports(){return d},set exports(b){d=b}});var l=d,Z={};!function(b,d){b.exports=function(){const b="function"==typeof atob,d="function"==typeof Buffer,l="function"==typeof TextDecoder?new TextDecoder:void 0,Z=(b=>{let d={};return b.forEach(((b,l)=>d[b]=l)),d})(("function"==typeof TextEncoder&&new TextEncoder,Array.prototype.slice.call("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="))),m=/^(?:[A-Za-z\d+\/]{4})*?(?:[A-Za-z\d+\/]{2}(?:==)?|[A-Za-z\d+\/]{3}=?)?$/,X=String.fromCharCode.bind(String),G="function"==typeof Uint8Array.from?Uint8Array.from.bind(Uint8Array):b=>new Uint8Array(Array.prototype.slice.call(b,0)),W=b=>b.replace(/[^A-Za-z0-9\+\/]/g,""),c=/[\xC0-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF7][\x80-\xBF]{3}/g,p=b=>{switch(b.length){case 4:var d=((7&b.charCodeAt(0))<<18|(63&b.charCodeAt(1))<<12|(63&b.charCodeAt(2))<<6|63&b.charCodeAt(3))-65536;return X(55296+(d>>>10))+X(56320+(1023&d));case 3:return X((15&b.charCodeAt(0))<<12|(63&b.charCodeAt(1))<<6|63&b.charCodeAt(2));default:return X((31&b.charCodeAt(0))<<6|63&b.charCodeAt(1))}},K=b=>b.replace(c,p),s=b=>{if(b=b.replace(/\s+/g,""),!m.test(b))throw new TypeError("malformed base64.");b+="==".slice(2-(3&b.length));let d,l,G,W="";for(let m=0;m<b.length;)d=Z[b.charAt(m++)]<<18|Z[b.charAt(m++)]<<12|(l=Z[b.charAt(m++)])<<6|(G=Z[b.charAt(m++)]),W+=64===l?X(d>>16&255):64===G?X(d>>16&255,d>>8&255):X(d>>16&255,d>>8&255,255&d);return W},y=b?b=>atob(W(b)):d?b=>Buffer.from(b,"base64").toString("binary"):s,i=d?b=>G(Buffer.from(b,"base64")):b=>G(y(b).split("").map((b=>b.charCodeAt(0)))),h=d?b=>Buffer.from(b,"base64").toString("utf8"):l?b=>l.decode(i(b)):b=>K(y(b)),u=b=>W(b.replace(/[-_]/g,(b=>"-"==b?"+":"/"))),I=b=>h(u(b)),V=I;var L={};!function(b){var d=Object.prototype.hasOwnProperty,l="~";function Z(){}function m(b,d,l){this.fn=b,this.context=d,this.once=l||!1}function X(b,d,Z,X,G){if("function"!=typeof Z)throw new TypeError("The listener must be a function");var W=new m(Z,X||b,G),c=l?l+d:d;return b._events[c]?b._events[c].fn?b._events[c]=[b._events[c],W]:b._events[c].push(W):(b._events[c]=W,b._eventsCount++),b}function G(b,d){0==--b._eventsCount?b._events=new Z:delete b._events[d]}function W(){this._events=new Z,this._eventsCount=0}Object.create&&(Z.prototype=Object.create(null),(new Z).__proto__||(l=!1)),W.prototype.eventNames=function(){var b,Z,m=[];if(0===this._eventsCount)return m;for(Z in b=this._events)d.call(b,Z)&&m.push(l?Z.slice(1):Z);return Object.getOwnPropertySymbols?m.concat(Object.getOwnPropertySymbols(b)):m},W.prototype.listeners=function(b){var d=l?l+b:b,Z=this._events[d];if(!Z)return[];if(Z.fn)return[Z.fn];for(var m=0,X=Z.length,G=new Array(X);m<X;m++)G[m]=Z[m].fn;return G},W.prototype.listenerCount=function(b){var d=l?l+b:b,Z=this._events[d];return Z?Z.fn?1:Z.length:0},W.prototype.emit=function(b,d,Z,m,X,G){var W=l?l+b:b;if(!this._events[W])return!1;var c,p,K=this._events[W],s=arguments.length;if(K.fn){switch(K.once&&this.removeListener(b,K.fn,void 0,!0),s){case 1:return K.fn.call(K.context),!0;case 2:return K.fn.call(K.context,d),!0;case 3:return K.fn.call(K.context,d,Z),!0;case 4:return K.fn.call(K.context,d,Z,m),!0;case 5:return K.fn.call(K.context,d,Z,m,X),!0;case 6:return K.fn.call(K.context,d,Z,m,X,G),!0}for(p=1,c=new Array(s-1);p<s;p++)c[p-1]=arguments[p];K.fn.apply(K.context,c)}else{var y,i=K.length;for(p=0;p<i;p++)switch(K[p].once&&this.removeListener(b,K[p].fn,void 0,!0),s){case 1:K[p].fn.call(K[p].context);break;case 2:K[p].fn.call(K[p].context,d);break;case 3:K[p].fn.call(K[p].context,d,Z);break;case 4:K[p].fn.call(K[p].context,d,Z,m);break;default:if(!c)for(y=1,c=new Array(s-1);y<s;y++)c[y-1]=arguments[y];K[p].fn.apply(K[p].context,c)}}return!0},W.prototype.on=function(b,d,l){return X(this,b,d,l,!1)},W.prototype.once=function(b,d,l){return X(this,b,d,l,!0)},W.prototype.removeListener=function(b,d,Z,m){var X=l?l+b:b;if(!this._events[X])return this;if(!d)return G(this,X),this;var W=this._events[X];if(W.fn)W.fn!==d||m&&!W.once||Z&&W.context!==Z||G(this,X);else{for(var c=0,p=[],K=W.length;c<K;c++)(W[c].fn!==d||m&&!W[c].once||Z&&W[c].context!==Z)&&p.push(W[c]);p.length?this._events[X]=1===p.length?p[0]:p:G(this,X)}return this},W.prototype.removeAllListeners=function(b){var d;return b?(d=l?l+b:b,this._events[d]&&G(this,d)):(this._events=new Z,this._eventsCount=0),this},W.prototype.off=W.prototype.removeListener,W.prototype.addListener=W.prototype.on,W.prefixed=l,W.EventEmitter=W,b.exports=W}({get exports(){return L},set exports(b){L=b}});var x=L;let Y;return function(){if("browser"!=("undefined"!=typeof window&&void 0!==window.document?"browser":"nodejs"))return null;let b=V("CgoKdmFyIHQ9InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWxUaGlzP2dsb2JhbFRoaXM6InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OiJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsP2dsb2JhbDoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjp7fTtmdW5jdGlvbiBlKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGUmJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCJkZWZhdWx0Iik/dC5kZWZhdWx0OnR9dmFyIG49QXJyYXkuaXNBcnJheSxyPSJvYmplY3QiPT10eXBlb2YgdCYmdCYmdC5PYmplY3Q9PT1PYmplY3QmJnQsaT1yLG89Im9iamVjdCI9PXR5cGVvZiBzZWxmJiZzZWxmJiZzZWxmLk9iamVjdD09PU9iamVjdCYmc2VsZixsPWl8fG98fEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCksYT1sLlN5bWJvbCxzPWEsdT1PYmplY3QucHJvdG90eXBlLGM9dS5oYXNPd25Qcm9wZXJ0eSxmPXUudG9TdHJpbmcsaD1zP3MudG9TdHJpbmdUYWc6dm9pZCAwO3ZhciBnPWZ1bmN0aW9uKHQpe3ZhciBlPWMuY2FsbCh0LGgpLG49dFtoXTt0cnl7dFtoXT12b2lkIDA7dmFyIHI9ITB9Y2F0Y2godCl7fXZhciBpPWYuY2FsbCh0KTtyZXR1cm4gciYmKGU/dFtoXT1uOmRlbGV0ZSB0W2hdKSxpfSx2PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7dmFyIGQ9ZyxwPWZ1bmN0aW9uKHQpe3JldHVybiB2LmNhbGwodCl9LHk9YT9hLnRvU3RyaW5nVGFnOnZvaWQgMDt2YXIgbT1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD92b2lkIDA9PT10PyJbb2JqZWN0IFVuZGVmaW5lZF0iOiJbb2JqZWN0IE51bGxdIjp5JiZ5IGluIE9iamVjdCh0KT9kKHQpOnAodCl9O3ZhciBfPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsIT10JiYib2JqZWN0Ij09dHlwZW9mIHR9LGI9bSx4PV87dmFyIHc9ZnVuY3Rpb24odCl7cmV0dXJuInN5bWJvbCI9PXR5cGVvZiB0fHx4KHQpJiYiW29iamVjdCBTeW1ib2xdIj09Yih0KX0saj1uLFM9dyxBPS9cLnxcWyg/OlteW1xdXSp8KFsiJ10pKD86KD8hXDEpW15cXF18XFwuKSo/XDEpXF0vLE89L15cdyokLzt2YXIgTT1mdW5jdGlvbih0LGUpe2lmKGoodCkpcmV0dXJuITE7dmFyIG49dHlwZW9mIHQ7cmV0dXJuISgibnVtYmVyIiE9biYmInN5bWJvbCIhPW4mJiJib29sZWFuIiE9biYmbnVsbCE9dCYmIVModCkpfHwoTy50ZXN0KHQpfHwhQS50ZXN0KHQpfHxudWxsIT1lJiZ0IGluIE9iamVjdChlKSl9O3ZhciBrPWZ1bmN0aW9uKHQpe3ZhciBlPXR5cGVvZiB0O3JldHVybiBudWxsIT10JiYoIm9iamVjdCI9PWV8fCJmdW5jdGlvbiI9PWUpfSxQPW0sRj1rO3ZhciBULHo9ZnVuY3Rpb24odCl7aWYoIUYodCkpcmV0dXJuITE7dmFyIGU9UCh0KTtyZXR1cm4iW29iamVjdCBGdW5jdGlvbl0iPT1lfHwiW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0iPT1lfHwiW29iamVjdCBBc3luY0Z1bmN0aW9uXSI9PWV8fCJbb2JqZWN0IFByb3h5XSI9PWV9LEk9bFsiX19jb3JlLWpzX3NoYXJlZF9fIl0sJD0oVD0vW14uXSskLy5leGVjKEkmJkkua2V5cyYmSS5rZXlzLklFX1BST1RPfHwiIikpPyJTeW1ib2woc3JjKV8xLiIrVDoiIjt2YXIgRT1mdW5jdGlvbih0KXtyZXR1cm4hISQmJiQgaW4gdH0sTj1GdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmc7dmFyIFI9ZnVuY3Rpb24odCl7aWYobnVsbCE9dCl7dHJ5e3JldHVybiBOLmNhbGwodCl9Y2F0Y2godCl7fXRyeXtyZXR1cm4gdCsiIn1jYXRjaCh0KXt9fXJldHVybiIifSxDPXosQj1FLFU9ayxMPVIsRD0vXlxbb2JqZWN0IC4rP0NvbnN0cnVjdG9yXF0kLyxIPUZ1bmN0aW9uLnByb3RvdHlwZSxYPU9iamVjdC5wcm90b3R5cGUsWT1ILnRvU3RyaW5nLEs9WC5oYXNPd25Qcm9wZXJ0eSxaPVJlZ0V4cCgiXiIrWS5jYWxsKEspLnJlcGxhY2UoL1tcXF4kLiorPygpW1xde318XS9nLCJcXCQmIikucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXCgpfCBmb3IgLis/KD89XFxcXSkvZywiJDEuKj8iKSsiJCIpO3ZhciBKPWZ1bmN0aW9uKHQpe3JldHVybiEoIVUodCl8fEIodCkpJiYoQyh0KT9aOkQpLnRlc3QoTCh0KSl9LFY9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09dD92b2lkIDA6dFtlXX07dmFyIFc9ZnVuY3Rpb24odCxlKXt2YXIgbj1WKHQsZSk7cmV0dXJuIEoobik/bjp2b2lkIDB9LHE9VyhPYmplY3QsImNyZWF0ZSIpLEc9cTt2YXIgUT1mdW5jdGlvbigpe3RoaXMuX19kYXRhX189Rz9HKG51bGwpOnt9LHRoaXMuc2l6ZT0wfTt2YXIgdHQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5oYXModCkmJmRlbGV0ZSB0aGlzLl9fZGF0YV9fW3RdO3JldHVybiB0aGlzLnNpemUtPWU/MTowLGV9LGV0PXEsbnQ9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt2YXIgcnQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXztpZihldCl7dmFyIG49ZVt0XTtyZXR1cm4iX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyI9PT1uP3ZvaWQgMDpufXJldHVybiBudC5jYWxsKGUsdCk/ZVt0XTp2b2lkIDB9LGl0PXEsb3Q9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt2YXIgbHQ9cTt2YXIgYXQ9USxzdD10dCx1dD1ydCxjdD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fO3JldHVybiBpdD92b2lkIDAhPT1lW3RdOm90LmNhbGwoZSx0KX0sZnQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9fZGF0YV9fO3JldHVybiB0aGlzLnNpemUrPXRoaXMuaGFzKHQpPzA6MSxuW3RdPWx0JiZ2b2lkIDA9PT1lPyJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIjplLHRoaXN9O2Z1bmN0aW9uIGh0KHQpe3ZhciBlPS0xLG49bnVsbD09dD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPG47KXt2YXIgcj10W2VdO3RoaXMuc2V0KHJbMF0sclsxXSl9fWh0LnByb3RvdHlwZS5jbGVhcj1hdCxodC5wcm90b3R5cGUuZGVsZXRlPXN0LGh0LnByb3RvdHlwZS5nZXQ9dXQsaHQucHJvdG90eXBlLmhhcz1jdCxodC5wcm90b3R5cGUuc2V0PWZ0O3ZhciBndD1odDt2YXIgdnQ9ZnVuY3Rpb24oKXt0aGlzLl9fZGF0YV9fPVtdLHRoaXMuc2l6ZT0wfTt2YXIgZHQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD09PWV8fHQhPXQmJmUhPWV9LHB0PWR0O3ZhciB5dD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10Lmxlbmd0aDtuLS07KWlmKHB0KHRbbl1bMF0sZSkpcmV0dXJuIG47cmV0dXJuLTF9LG10PXl0LF90PUFycmF5LnByb3RvdHlwZS5zcGxpY2U7dmFyIGJ0PXl0O3ZhciB4dD15dDt2YXIgd3Q9eXQ7dmFyIGp0PXZ0LFN0PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX19kYXRhX18sbj1tdChlLHQpO3JldHVybiEobjwwKSYmKG49PWUubGVuZ3RoLTE/ZS5wb3AoKTpfdC5jYWxsKGUsbiwxKSwtLXRoaXMuc2l6ZSwhMCl9LEF0PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX19kYXRhX18sbj1idChlLHQpO3JldHVybiBuPDA/dm9pZCAwOmVbbl1bMV19LE90PWZ1bmN0aW9uKHQpe3JldHVybiB4dCh0aGlzLl9fZGF0YV9fLHQpPi0xfSxNdD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX19kYXRhX18scj13dChuLHQpO3JldHVybiByPDA/KCsrdGhpcy5zaXplLG4ucHVzaChbdCxlXSkpOm5bcl1bMV09ZSx0aGlzfTtmdW5jdGlvbiBrdCh0KXt2YXIgZT0tMSxuPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxuOyl7dmFyIHI9dFtlXTt0aGlzLnNldChyWzBdLHJbMV0pfX1rdC5wcm90b3R5cGUuY2xlYXI9anQsa3QucHJvdG90eXBlLmRlbGV0ZT1TdCxrdC5wcm90b3R5cGUuZ2V0PUF0LGt0LnByb3RvdHlwZS5oYXM9T3Qsa3QucHJvdG90eXBlLnNldD1NdDt2YXIgUHQ9a3QsRnQ9VyhsLCJNYXAiKSxUdD1ndCx6dD1QdCxJdD1GdDt2YXIgJHQ9ZnVuY3Rpb24odCl7dmFyIGU9dHlwZW9mIHQ7cmV0dXJuInN0cmluZyI9PWV8fCJudW1iZXIiPT1lfHwic3ltYm9sIj09ZXx8ImJvb2xlYW4iPT1lPyJfX3Byb3RvX18iIT09dDpudWxsPT09dH07dmFyIEV0PWZ1bmN0aW9uKHQsZSl7dmFyIG49dC5fX2RhdGFfXztyZXR1cm4gJHQoZSk/blsic3RyaW5nIj09dHlwZW9mIGU/InN0cmluZyI6Imhhc2giXTpuLm1hcH0sTnQ9RXQ7dmFyIFJ0PUV0O3ZhciBDdD1FdDt2YXIgQnQ9RXQ7dmFyIFV0PWZ1bmN0aW9uKHQsZSl7dmFyIG49QnQodGhpcyx0KSxyPW4uc2l6ZTtyZXR1cm4gbi5zZXQodCxlKSx0aGlzLnNpemUrPW4uc2l6ZT09cj8wOjEsdGhpc30sTHQ9ZnVuY3Rpb24oKXt0aGlzLnNpemU9MCx0aGlzLl9fZGF0YV9fPXtoYXNoOm5ldyBUdCxtYXA6bmV3KEl0fHx6dCksc3RyaW5nOm5ldyBUdH19LER0PWZ1bmN0aW9uKHQpe3ZhciBlPU50KHRoaXMsdCkuZGVsZXRlKHQpO3JldHVybiB0aGlzLnNpemUtPWU/MTowLGV9LEh0PWZ1bmN0aW9uKHQpe3JldHVybiBSdCh0aGlzLHQpLmdldCh0KX0sWHQ9ZnVuY3Rpb24odCl7cmV0dXJuIEN0KHRoaXMsdCkuaGFzKHQpfSxZdD1VdDtmdW5jdGlvbiBLdCh0KXt2YXIgZT0tMSxuPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxuOyl7dmFyIHI9dFtlXTt0aGlzLnNldChyWzBdLHJbMV0pfX1LdC5wcm90b3R5cGUuY2xlYXI9THQsS3QucHJvdG90eXBlLmRlbGV0ZT1EdCxLdC5wcm90b3R5cGUuZ2V0PUh0LEt0LnByb3RvdHlwZS5oYXM9WHQsS3QucHJvdG90eXBlLnNldD1ZdDt2YXIgWnQ9S3QsSnQ9WnQ7ZnVuY3Rpb24gVnQodCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdHx8bnVsbCE9ZSYmImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigiRXhwZWN0ZWQgYSBmdW5jdGlvbiIpO3ZhciBuPWZ1bmN0aW9uKCl7dmFyIHI9YXJndW1lbnRzLGk9ZT9lLmFwcGx5KHRoaXMscik6clswXSxvPW4uY2FjaGU7aWYoby5oYXMoaSkpcmV0dXJuIG8uZ2V0KGkpO3ZhciBsPXQuYXBwbHkodGhpcyxyKTtyZXR1cm4gbi5jYWNoZT1vLnNldChpLGwpfHxvLGx9O3JldHVybiBuLmNhY2hlPW5ldyhWdC5DYWNoZXx8SnQpLG59VnQuQ2FjaGU9SnQ7dmFyIFd0PVZ0O3ZhciBxdD0vW14uW1xdXSt8XFsoPzooLT9cZCsoPzpcLlxkKyk/KXwoWyInXSkoKD86KD8hXDIpW15cXF18XFwuKSo/KVwyKVxdfCg/PSg/OlwufFxbXF0pKD86XC58XFtcXXwkKSkvZyxHdD0vXFwoXFwpPy9nLFF0PWZ1bmN0aW9uKHQpe3ZhciBlPVd0KHQsKGZ1bmN0aW9uKHQpe3JldHVybiA1MDA9PT1uLnNpemUmJm4uY2xlYXIoKSx0fSkpLG49ZS5jYWNoZTtyZXR1cm4gZX0oKGZ1bmN0aW9uKHQpe3ZhciBlPVtdO3JldHVybiA0Nj09PXQuY2hhckNvZGVBdCgwKSYmZS5wdXNoKCIiKSx0LnJlcGxhY2UocXQsKGZ1bmN0aW9uKHQsbixyLGkpe2UucHVzaChyP2kucmVwbGFjZShHdCwiJDEiKTpufHx0KX0pKSxlfSkpO3ZhciB0ZT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0tMSxyPW51bGw9PXQ/MDp0Lmxlbmd0aCxpPUFycmF5KHIpOysrbjxyOylpW25dPWUodFtuXSxuLHQpO3JldHVybiBpfSxlZT10ZSxuZT1uLHJlPXcsaWU9YT9hLnByb3RvdHlwZTp2b2lkIDAsb2U9aWU/aWUudG9TdHJpbmc6dm9pZCAwO3ZhciBsZT1mdW5jdGlvbiB0KGUpe2lmKCJzdHJpbmciPT10eXBlb2YgZSlyZXR1cm4gZTtpZihuZShlKSlyZXR1cm4gZWUoZSx0KSsiIjtpZihyZShlKSlyZXR1cm4gb2U/b2UuY2FsbChlKToiIjt2YXIgbj1lKyIiO3JldHVybiIwIj09biYmMS9lPT0tSW5maW5pdHk/Ii0wIjpufSxhZT1sZTt2YXIgc2U9bix1ZT1NLGNlPVF0LGZlPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10PyIiOmFlKHQpfTt2YXIgaGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gc2UodCk/dDp1ZSh0LGUpP1t0XTpjZShmZSh0KSl9LGdlPXc7dmFyIHZlPWZ1bmN0aW9uKHQpe2lmKCJzdHJpbmciPT10eXBlb2YgdHx8Z2UodCkpcmV0dXJuIHQ7dmFyIGU9dCsiIjtyZXR1cm4iMCI9PWUmJjEvdD09LUluZmluaXR5PyItMCI6ZX0sZGU9aGUscGU9dmU7dmFyIHllPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPTAscj0oZT1kZShlLHQpKS5sZW5ndGg7bnVsbCE9dCYmbjxyOyl0PXRbcGUoZVtuKytdKV07cmV0dXJuIG4mJm49PXI/dDp2b2lkIDB9LG1lPXllO3ZhciBfZT1mdW5jdGlvbih0LGUsbil7dmFyIHI9bnVsbD09dD92b2lkIDA6bWUodCxlKTtyZXR1cm4gdm9pZCAwPT09cj9uOnJ9LGJlPW0seGU9Xzt2YXIgd2U9ZnVuY3Rpb24odCl7cmV0dXJuITA9PT10fHwhMT09PXR8fHhlKHQpJiYiW29iamVjdCBCb29sZWFuXSI9PWJlKHQpfTtmdW5jdGlvbiBqZSh0KXtyZXR1cm4gd2UodCl9ZnVuY3Rpb24gU2UodCl7cmV0dXJuIltvYmplY3QgU3RyaW5nXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9ZnVuY3Rpb24gQWUodCl7cmV0dXJuISghU2UodCl8fCIiPT09dCl9dmFyIE9lPXt9LE1lPXtnZXQgZXhwb3J0cygpe3JldHVybiBPZX0sc2V0IGV4cG9ydHModCl7T2U9dH19O3ZhciBrZT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0tMSxyPW51bGw9PXQ/MDp0Lmxlbmd0aDsrK248ciYmITEhPT1lKHRbbl0sbix0KTspO3JldHVybiB0fTt2YXIgUGU9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUsbixyKXtmb3IodmFyIGk9LTEsbz1PYmplY3QoZSksbD1yKGUpLGE9bC5sZW5ndGg7YS0tOyl7dmFyIHM9bFt0P2E6KytpXTtpZighMT09PW4ob1tzXSxzLG8pKWJyZWFrfXJldHVybiBlfX0oKTt2YXIgRmU9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49LTEscj1BcnJheSh0KTsrK248dDspcltuXT1lKG4pO3JldHVybiByfSxUZT1tLHplPV87dmFyIEllPWZ1bmN0aW9uKHQpe3JldHVybiB6ZSh0KSYmIltvYmplY3QgQXJndW1lbnRzXSI9PVRlKHQpfSwkZT1fLEVlPU9iamVjdC5wcm90b3R5cGUsTmU9RWUuaGFzT3duUHJvcGVydHksUmU9RWUucHJvcGVydHlJc0VudW1lcmFibGUsQ2U9SWUoZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzfSgpKT9JZTpmdW5jdGlvbih0KXtyZXR1cm4gJGUodCkmJk5lLmNhbGwodCwiY2FsbGVlIikmJiFSZS5jYWxsKHQsImNhbGxlZSIpfSxCZT17fTt2YXIgVWU9ZnVuY3Rpb24oKXtyZXR1cm4hMX07IWZ1bmN0aW9uKHQsZSl7dmFyIG49bCxyPVVlLGk9ZSYmIWUubm9kZVR5cGUmJmUsbz1pJiZ0JiYhdC5ub2RlVHlwZSYmdCxhPW8mJm8uZXhwb3J0cz09PWk/bi5CdWZmZXI6dm9pZCAwLHM9KGE/YS5pc0J1ZmZlcjp2b2lkIDApfHxyO3QuZXhwb3J0cz1zfSh7Z2V0IGV4cG9ydHMoKXtyZXR1cm4gQmV9LHNldCBleHBvcnRzKHQpe0JlPXR9fSxCZSk7dmFyIExlPS9eKD86MHxbMS05XVxkKikkLzt2YXIgRGU9ZnVuY3Rpb24odCxlKXt2YXIgbj10eXBlb2YgdDtyZXR1cm4hIShlPW51bGw9PWU/OTAwNzE5OTI1NDc0MDk5MTplKSYmKCJudW1iZXIiPT1ufHwic3ltYm9sIiE9biYmTGUudGVzdCh0KSkmJnQ+LTEmJnQlMT09MCYmdDxlfTt2YXIgSGU9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0JiZ0Pi0xJiZ0JTE9PTAmJnQ8PTkwMDcxOTkyNTQ3NDA5OTF9LFhlPW0sWWU9SGUsS2U9XyxaZT17fTtaZVsiW29iamVjdCBGbG9hdDMyQXJyYXldIl09WmVbIltvYmplY3QgRmxvYXQ2NEFycmF5XSJdPVplWyJbb2JqZWN0IEludDhBcnJheV0iXT1aZVsiW29iamVjdCBJbnQxNkFycmF5XSJdPVplWyJbb2JqZWN0IEludDMyQXJyYXldIl09WmVbIltvYmplY3QgVWludDhBcnJheV0iXT1aZVsiW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0iXT1aZVsiW29iamVjdCBVaW50MTZBcnJheV0iXT1aZVsiW29iamVjdCBVaW50MzJBcnJheV0iXT0hMCxaZVsiW29iamVjdCBBcmd1bWVudHNdIl09WmVbIltvYmplY3QgQXJyYXldIl09WmVbIltvYmplY3QgQXJyYXlCdWZmZXJdIl09WmVbIltvYmplY3QgQm9vbGVhbl0iXT1aZVsiW29iamVjdCBEYXRhVmlld10iXT1aZVsiW29iamVjdCBEYXRlXSJdPVplWyJbb2JqZWN0IEVycm9yXSJdPVplWyJbb2JqZWN0IEZ1bmN0aW9uXSJdPVplWyJbb2JqZWN0IE1hcF0iXT1aZVsiW29iamVjdCBOdW1iZXJdIl09WmVbIltvYmplY3QgT2JqZWN0XSJdPVplWyJbb2JqZWN0IFJlZ0V4cF0iXT1aZVsiW29iamVjdCBTZXRdIl09WmVbIltvYmplY3QgU3RyaW5nXSJdPVplWyJbb2JqZWN0IFdlYWtNYXBdIl09ITE7dmFyIEplPWZ1bmN0aW9uKHQpe3JldHVybiBLZSh0KSYmWWUodC5sZW5ndGgpJiYhIVplW1hlKHQpXX07dmFyIFZlPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdChlKX19LFdlPXt9OyFmdW5jdGlvbih0LGUpe3ZhciBuPXIsaT1lJiYhZS5ub2RlVHlwZSYmZSxvPWkmJnQmJiF0Lm5vZGVUeXBlJiZ0LGw9byYmby5leHBvcnRzPT09aSYmbi5wcm9jZXNzLGE9ZnVuY3Rpb24oKXt0cnl7dmFyIHQ9byYmby5yZXF1aXJlJiZvLnJlcXVpcmUoInV0aWwiKS50eXBlcztyZXR1cm4gdHx8bCYmbC5iaW5kaW5nJiZsLmJpbmRpbmcoInV0aWwiKX1jYXRjaCh0KXt9fSgpO3QuZXhwb3J0cz1hfSh7Z2V0IGV4cG9ydHMoKXtyZXR1cm4gV2V9LHNldCBleHBvcnRzKHQpe1dlPXR9fSxXZSk7dmFyIHFlPUplLEdlPVZlLFFlPVdlJiZXZS5pc1R5cGVkQXJyYXksdG49UWU/R2UoUWUpOnFlLGVuPUZlLG5uPUNlLHJuPW4sb249QmUsbG49RGUsYW49dG4sc249T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt2YXIgdW49ZnVuY3Rpb24odCxlKXt2YXIgbj1ybih0KSxyPSFuJiZubih0KSxpPSFuJiYhciYmb24odCksbz0hbiYmIXImJiFpJiZhbih0KSxsPW58fHJ8fGl8fG8sYT1sP2VuKHQubGVuZ3RoLFN0cmluZyk6W10scz1hLmxlbmd0aDtmb3IodmFyIHUgaW4gdCkhZSYmIXNuLmNhbGwodCx1KXx8bCYmKCJsZW5ndGgiPT11fHxpJiYoIm9mZnNldCI9PXV8fCJwYXJlbnQiPT11KXx8byYmKCJidWZmZXIiPT11fHwiYnl0ZUxlbmd0aCI9PXV8fCJieXRlT2Zmc2V0Ij09dSl8fGxuKHUscykpfHxhLnB1c2godSk7cmV0dXJuIGF9LGNuPU9iamVjdC5wcm90b3R5cGU7dmFyIGZuPWZ1bmN0aW9uKHQpe3ZhciBlPXQmJnQuY29uc3RydWN0b3I7cmV0dXJuIHQ9PT0oImZ1bmN0aW9uIj09dHlwZW9mIGUmJmUucHJvdG90eXBlfHxjbil9O3ZhciBobj1mdW5jdGlvbih0LGUpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gdChlKG4pKX19KE9iamVjdC5rZXlzLE9iamVjdCksZ249Zm4sdm49aG4sZG49T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt2YXIgcG49ZnVuY3Rpb24odCl7aWYoIWduKHQpKXJldHVybiB2bih0KTt2YXIgZT1bXTtmb3IodmFyIG4gaW4gT2JqZWN0KHQpKWRuLmNhbGwodCxuKSYmImNvbnN0cnVjdG9yIiE9biYmZS5wdXNoKG4pO3JldHVybiBlfSx5bj16LG1uPUhlO3ZhciBfbj1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dCYmbW4odC5sZW5ndGgpJiYheW4odCl9LGJuPXVuLHhuPXBuLHduPV9uO3ZhciBqbj1mdW5jdGlvbih0KXtyZXR1cm4gd24odCk/Ym4odCk6eG4odCl9LFNuPVBlLEFuPWpuO3ZhciBPbj1fbjt2YXIgTW49ZnVuY3Rpb24odCxlKXtyZXR1cm4gZnVuY3Rpb24obixyKXtpZihudWxsPT1uKXJldHVybiBuO2lmKCFPbihuKSlyZXR1cm4gdChuLHIpO2Zvcih2YXIgaT1uLmxlbmd0aCxvPWU/aTotMSxsPU9iamVjdChuKTsoZT9vLS06KytvPGkpJiYhMSE9PXIobFtvXSxvLGwpOyk7cmV0dXJuIG59fSgoZnVuY3Rpb24odCxlKXtyZXR1cm4gdCYmU24odCxlLEFuKX0pKTt2YXIga249ZnVuY3Rpb24odCl7cmV0dXJuIHR9LFBuPWtuO3ZhciBGbj1rZSxUbj1Nbix6bj1mdW5jdGlvbih0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD90OlBufSxJbj1uO3ZhciAkbj1mdW5jdGlvbih0LGUpe3JldHVybihJbih0KT9GbjpUbikodCx6bihlKSl9O01lLmV4cG9ydHM9JG47dmFyIEVuPWUoT2UpLE5uPVB0O3ZhciBSbj1QdCxDbj1GdCxCbj1adDt2YXIgVW49UHQsTG49ZnVuY3Rpb24oKXt0aGlzLl9fZGF0YV9fPW5ldyBObix0aGlzLnNpemU9MH0sRG49ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxuPWUuZGVsZXRlKHQpO3JldHVybiB0aGlzLnNpemU9ZS5zaXplLG59LEhuPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLmdldCh0KX0sWG49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKHQpfSxZbj1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX19kYXRhX187aWYobiBpbnN0YW5jZW9mIFJuKXt2YXIgcj1uLl9fZGF0YV9fO2lmKCFDbnx8ci5sZW5ndGg8MTk5KXJldHVybiByLnB1c2goW3QsZV0pLHRoaXMuc2l6ZT0rK24uc2l6ZSx0aGlzO249dGhpcy5fX2RhdGFfXz1uZXcgQm4ocil9cmV0dXJuIG4uc2V0KHQsZSksdGhpcy5zaXplPW4uc2l6ZSx0aGlzfTtmdW5jdGlvbiBLbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fPW5ldyBVbih0KTt0aGlzLnNpemU9ZS5zaXplfUtuLnByb3RvdHlwZS5jbGVhcj1MbixLbi5wcm90b3R5cGUuZGVsZXRlPURuLEtuLnByb3RvdHlwZS5nZXQ9SG4sS24ucHJvdG90eXBlLmhhcz1YbixLbi5wcm90b3R5cGUuc2V0PVluO3ZhciBabj1Lbjt2YXIgSm49WnQsVm49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX19kYXRhX18uc2V0KHQsIl9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iKSx0aGlzfSxXbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXModCl9O2Z1bmN0aW9uIHFuKHQpe3ZhciBlPS0xLG49bnVsbD09dD8wOnQubGVuZ3RoO2Zvcih0aGlzLl9fZGF0YV9fPW5ldyBKbjsrK2U8bjspdGhpcy5hZGQodFtlXSl9cW4ucHJvdG90eXBlLmFkZD1xbi5wcm90b3R5cGUucHVzaD1Wbixxbi5wcm90b3R5cGUuaGFzPVduO3ZhciBHbj1xbixRbj1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0tMSxyPW51bGw9PXQ/MDp0Lmxlbmd0aDsrK248cjspaWYoZSh0W25dLG4sdCkpcmV0dXJuITA7cmV0dXJuITF9LHRyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuaGFzKGUpfTt2YXIgZXI9ZnVuY3Rpb24odCxlLG4scixpLG8pe3ZhciBsPTEmbixhPXQubGVuZ3RoLHM9ZS5sZW5ndGg7aWYoYSE9cyYmIShsJiZzPmEpKXJldHVybiExO3ZhciB1PW8uZ2V0KHQpLGM9by5nZXQoZSk7aWYodSYmYylyZXR1cm4gdT09ZSYmYz09dDt2YXIgZj0tMSxoPSEwLGc9MiZuP25ldyBHbjp2b2lkIDA7Zm9yKG8uc2V0KHQsZSksby5zZXQoZSx0KTsrK2Y8YTspe3ZhciB2PXRbZl0sZD1lW2ZdO2lmKHIpdmFyIHA9bD9yKGQsdixmLGUsdCxvKTpyKHYsZCxmLHQsZSxvKTtpZih2b2lkIDAhPT1wKXtpZihwKWNvbnRpbnVlO2g9ITE7YnJlYWt9aWYoZyl7aWYoIVFuKGUsKGZ1bmN0aW9uKHQsZSl7aWYoIXRyKGcsZSkmJih2PT09dHx8aSh2LHQsbixyLG8pKSlyZXR1cm4gZy5wdXNoKGUpfSkpKXtoPSExO2JyZWFrfX1lbHNlIGlmKHYhPT1kJiYhaSh2LGQsbixyLG8pKXtoPSExO2JyZWFrfX1yZXR1cm4gby5kZWxldGUodCksby5kZWxldGUoZSksaH07dmFyIG5yPWZ1bmN0aW9uKHQpe3ZhciBlPS0xLG49QXJyYXkodC5zaXplKTtyZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbih0LHIpe25bKytlXT1bcix0XX0pKSxufTt2YXIgcnI9bC5VaW50OEFycmF5LGlyPWR0LG9yPWVyLGxyPW5yLGFyPWZ1bmN0aW9uKHQpe3ZhciBlPS0xLG49QXJyYXkodC5zaXplKTtyZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbih0KXtuWysrZV09dH0pKSxufSxzcj1hP2EucHJvdG90eXBlOnZvaWQgMCx1cj1zcj9zci52YWx1ZU9mOnZvaWQgMDt2YXIgY3I9ZnVuY3Rpb24odCxlLG4scixpLG8sbCl7c3dpdGNoKG4pe2Nhc2UiW29iamVjdCBEYXRhVmlld10iOmlmKHQuYnl0ZUxlbmd0aCE9ZS5ieXRlTGVuZ3RofHx0LmJ5dGVPZmZzZXQhPWUuYnl0ZU9mZnNldClyZXR1cm4hMTt0PXQuYnVmZmVyLGU9ZS5idWZmZXI7Y2FzZSJbb2JqZWN0IEFycmF5QnVmZmVyXSI6cmV0dXJuISh0LmJ5dGVMZW5ndGghPWUuYnl0ZUxlbmd0aHx8IW8obmV3IHJyKHQpLG5ldyBycihlKSkpO2Nhc2UiW29iamVjdCBCb29sZWFuXSI6Y2FzZSJbb2JqZWN0IERhdGVdIjpjYXNlIltvYmplY3QgTnVtYmVyXSI6cmV0dXJuIGlyKCt0LCtlKTtjYXNlIltvYmplY3QgRXJyb3JdIjpyZXR1cm4gdC5uYW1lPT1lLm5hbWUmJnQubWVzc2FnZT09ZS5tZXNzYWdlO2Nhc2UiW29iamVjdCBSZWdFeHBdIjpjYXNlIltvYmplY3QgU3RyaW5nXSI6cmV0dXJuIHQ9PWUrIiI7Y2FzZSJbb2JqZWN0IE1hcF0iOnZhciBhPWxyO2Nhc2UiW29iamVjdCBTZXRdIjp2YXIgcz0xJnI7aWYoYXx8KGE9YXIpLHQuc2l6ZSE9ZS5zaXplJiYhcylyZXR1cm4hMTt2YXIgdT1sLmdldCh0KTtpZih1KXJldHVybiB1PT1lO3J8PTIsbC5zZXQodCxlKTt2YXIgYz1vcihhKHQpLGEoZSkscixpLG8sbCk7cmV0dXJuIGwuZGVsZXRlKHQpLGM7Y2FzZSJbb2JqZWN0IFN5bWJvbF0iOmlmKHVyKXJldHVybiB1ci5jYWxsKHQpPT11ci5jYWxsKGUpfXJldHVybiExfTt2YXIgZnI9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49LTEscj1lLmxlbmd0aCxpPXQubGVuZ3RoOysrbjxyOyl0W2krbl09ZVtuXTtyZXR1cm4gdH0saHI9ZnIsZ3I9bjt2YXIgdnI9ZnVuY3Rpb24odCxlLG4pe3ZhciByPWUodCk7cmV0dXJuIGdyKHQpP3I6aHIocixuKHQpKX07dmFyIGRyPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPS0xLHI9bnVsbD09dD8wOnQubGVuZ3RoLGk9MCxvPVtdOysrbjxyOyl7dmFyIGw9dFtuXTtlKGwsbix0KSYmKG9baSsrXT1sKX1yZXR1cm4gb307dmFyIHByPWRyLHlyPWZ1bmN0aW9uKCl7cmV0dXJuW119LG1yPU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUsX3I9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyxicj12cix4cj1fcj9mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD9bXToodD1PYmplY3QodCkscHIoX3IodCksKGZ1bmN0aW9uKGUpe3JldHVybiBtci5jYWxsKHQsZSl9KSkpfTp5cix3cj1qbjt2YXIganI9ZnVuY3Rpb24odCl7cmV0dXJuIGJyKHQsd3IseHIpfSxTcj1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3ZhciBBcj1mdW5jdGlvbih0LGUsbixyLGksbyl7dmFyIGw9MSZuLGE9anIodCkscz1hLmxlbmd0aDtpZihzIT1qcihlKS5sZW5ndGgmJiFsKXJldHVybiExO2Zvcih2YXIgdT1zO3UtLTspe3ZhciBjPWFbdV07aWYoIShsP2MgaW4gZTpTci5jYWxsKGUsYykpKXJldHVybiExfXZhciBmPW8uZ2V0KHQpLGg9by5nZXQoZSk7aWYoZiYmaClyZXR1cm4gZj09ZSYmaD09dDt2YXIgZz0hMDtvLnNldCh0LGUpLG8uc2V0KGUsdCk7Zm9yKHZhciB2PWw7Kyt1PHM7KXt2YXIgZD10W2M9YVt1XV0scD1lW2NdO2lmKHIpdmFyIHk9bD9yKHAsZCxjLGUsdCxvKTpyKGQscCxjLHQsZSxvKTtpZighKHZvaWQgMD09PXk/ZD09PXB8fGkoZCxwLG4scixvKTp5KSl7Zz0hMTticmVha312fHwodj0iY29uc3RydWN0b3IiPT1jKX1pZihnJiYhdil7dmFyIG09dC5jb25zdHJ1Y3RvcixfPWUuY29uc3RydWN0b3I7bT09X3x8ISgiY29uc3RydWN0b3IiaW4gdCl8fCEoImNvbnN0cnVjdG9yImluIGUpfHwiZnVuY3Rpb24iPT10eXBlb2YgbSYmbSBpbnN0YW5jZW9mIG0mJiJmdW5jdGlvbiI9PXR5cGVvZiBfJiZfIGluc3RhbmNlb2YgX3x8KGc9ITEpfXJldHVybiBvLmRlbGV0ZSh0KSxvLmRlbGV0ZShlKSxnfSxPcj1XKGwsIkRhdGFWaWV3IiksTXI9RnQsa3I9VyhsLCJQcm9taXNlIiksUHI9VyhsLCJTZXQiKSxGcj1XKGwsIldlYWtNYXAiKSxUcj1tLHpyPVIsSXI9IltvYmplY3QgTWFwXSIsJHI9IltvYmplY3QgUHJvbWlzZV0iLEVyPSJbb2JqZWN0IFNldF0iLE5yPSJbb2JqZWN0IFdlYWtNYXBdIixScj0iW29iamVjdCBEYXRhVmlld10iLENyPXpyKE9yKSxCcj16cihNciksVXI9enIoa3IpLExyPXpyKFByKSxEcj16cihGciksSHI9VHI7KE9yJiZIcihuZXcgT3IobmV3IEFycmF5QnVmZmVyKDEpKSkhPVJyfHxNciYmSHIobmV3IE1yKSE9SXJ8fGtyJiZIcihrci5yZXNvbHZlKCkpIT0kcnx8UHImJkhyKG5ldyBQcikhPUVyfHxGciYmSHIobmV3IEZyKSE9TnIpJiYoSHI9ZnVuY3Rpb24odCl7dmFyIGU9VHIodCksbj0iW29iamVjdCBPYmplY3RdIj09ZT90LmNvbnN0cnVjdG9yOnZvaWQgMCxyPW4/enIobik6IiI7aWYocilzd2l0Y2gocil7Y2FzZSBDcjpyZXR1cm4gUnI7Y2FzZSBCcjpyZXR1cm4gSXI7Y2FzZSBVcjpyZXR1cm4gJHI7Y2FzZSBMcjpyZXR1cm4gRXI7Y2FzZSBEcjpyZXR1cm4gTnJ9cmV0dXJuIGV9KTt2YXIgWHI9SHIsWXI9Wm4sS3I9ZXIsWnI9Y3IsSnI9QXIsVnI9WHIsV3I9bixxcj1CZSxHcj10bixRcj0iW29iamVjdCBBcmd1bWVudHNdIix0aT0iW29iamVjdCBBcnJheV0iLGVpPSJbb2JqZWN0IE9iamVjdF0iLG5pPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dmFyIHJpPWZ1bmN0aW9uKHQsZSxuLHIsaSxvKXt2YXIgbD1Xcih0KSxhPVdyKGUpLHM9bD90aTpWcih0KSx1PWE/dGk6VnIoZSksYz0ocz1zPT1Rcj9laTpzKT09ZWksZj0odT11PT1Rcj9laTp1KT09ZWksaD1zPT11O2lmKGgmJnFyKHQpKXtpZighcXIoZSkpcmV0dXJuITE7bD0hMCxjPSExfWlmKGgmJiFjKXJldHVybiBvfHwobz1uZXcgWXIpLGx8fEdyKHQpP0tyKHQsZSxuLHIsaSxvKTpacih0LGUscyxuLHIsaSxvKTtpZighKDEmbikpe3ZhciBnPWMmJm5pLmNhbGwodCwiX193cmFwcGVkX18iKSx2PWYmJm5pLmNhbGwoZSwiX193cmFwcGVkX18iKTtpZihnfHx2KXt2YXIgZD1nP3QudmFsdWUoKTp0LHA9dj9lLnZhbHVlKCk6ZTtyZXR1cm4gb3x8KG89bmV3IFlyKSxpKGQscCxuLHIsbyl9fXJldHVybiEhaCYmKG98fChvPW5ldyBZciksSnIodCxlLG4scixpLG8pKX0saWk9Xzt2YXIgb2k9ZnVuY3Rpb24gdChlLG4scixpLG8pe3JldHVybiBlPT09bnx8KG51bGw9PWV8fG51bGw9PW58fCFpaShlKSYmIWlpKG4pP2UhPWUmJm4hPW46cmkoZSxuLHIsaSx0LG8pKX0sbGk9Wm4sYWk9b2k7dmFyIHNpPWs7dmFyIHVpPWZ1bmN0aW9uKHQpe3JldHVybiB0PT10JiYhc2kodCl9LGNpPXVpLGZpPWpuO3ZhciBoaT1mdW5jdGlvbih0LGUpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gbnVsbCE9biYmKG5bdF09PT1lJiYodm9pZCAwIT09ZXx8dCBpbiBPYmplY3QobikpKX19LGdpPWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPW4ubGVuZ3RoLG89aSxsPSFyO2lmKG51bGw9PXQpcmV0dXJuIW87Zm9yKHQ9T2JqZWN0KHQpO2ktLTspe3ZhciBhPW5baV07aWYobCYmYVsyXT9hWzFdIT09dFthWzBdXTohKGFbMF1pbiB0KSlyZXR1cm4hMX1mb3IoOysraTxvOyl7dmFyIHM9KGE9bltpXSlbMF0sdT10W3NdLGM9YVsxXTtpZihsJiZhWzJdKXtpZih2b2lkIDA9PT11JiYhKHMgaW4gdCkpcmV0dXJuITF9ZWxzZXt2YXIgZj1uZXcgbGk7aWYocil2YXIgaD1yKHUsYyxzLHQsZSxmKTtpZighKHZvaWQgMD09PWg/YWkoYyx1LDMscixmKTpoKSlyZXR1cm4hMX19cmV0dXJuITB9LHZpPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1maSh0KSxuPWUubGVuZ3RoO24tLTspe3ZhciByPWVbbl0saT10W3JdO2Vbbl09W3IsaSxjaShpKV19cmV0dXJuIGV9LGRpPWhpO3ZhciBwaT1oZSx5aT1DZSxtaT1uLF9pPURlLGJpPUhlLHhpPXZlO3ZhciB3aT1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsIT10JiZlIGluIE9iamVjdCh0KX0samk9ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj0tMSxpPShlPXBpKGUsdCkpLmxlbmd0aCxvPSExOysrcjxpOyl7dmFyIGw9eGkoZVtyXSk7aWYoIShvPW51bGwhPXQmJm4odCxsKSkpYnJlYWs7dD10W2xdfXJldHVybiBvfHwrK3IhPWk/bzohIShpPW51bGw9PXQ/MDp0Lmxlbmd0aCkmJmJpKGkpJiZfaShsLGkpJiYobWkodCl8fHlpKHQpKX07dmFyIFNpPW9pLEFpPV9lLE9pPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGwhPXQmJmppKHQsZSx3aSl9LE1pPU0sa2k9dWksUGk9aGksRmk9dmU7dmFyIFRpPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZT92b2lkIDA6ZVt0XX19LHppPXllO3ZhciBJaT1UaSwkaT1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHppKGUsdCl9fSxFaT1NLE5pPXZlO3ZhciBSaT1mdW5jdGlvbih0KXt2YXIgZT12aSh0KTtyZXR1cm4gMT09ZS5sZW5ndGgmJmVbMF1bMl0/ZGkoZVswXVswXSxlWzBdWzFdKTpmdW5jdGlvbihuKXtyZXR1cm4gbj09PXR8fGdpKG4sdCxlKX19LENpPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIE1pKHQpJiZraShlKT9QaShGaSh0KSxlKTpmdW5jdGlvbihuKXt2YXIgcj1BaShuLHQpO3JldHVybiB2b2lkIDA9PT1yJiZyPT09ZT9PaShuLHQpOlNpKGUsciwzKX19LEJpPWtuLFVpPW4sTGk9ZnVuY3Rpb24odCl7cmV0dXJuIEVpKHQpP0lpKE5pKHQpKTokaSh0KX07dmFyIERpPWZ1bmN0aW9uKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6bnVsbD09dD9CaToib2JqZWN0Ij09dHlwZW9mIHQ/VWkodCk/Q2kodFswXSx0WzFdKTpSaSh0KTpMaSh0KX0sSGk9TW4sWGk9X247dmFyIFlpPXRlLEtpPURpLFppPWZ1bmN0aW9uKHQsZSl7dmFyIG49LTEscj1YaSh0KT9BcnJheSh0Lmxlbmd0aCk6W107cmV0dXJuIEhpKHQsKGZ1bmN0aW9uKHQsaSxvKXtyWysrbl09ZSh0LGksbyl9KSkscn0sSmk9bjt2YXIgVmk9ZnVuY3Rpb24odCxlKXtyZXR1cm4oSmkodCk/WWk6WmkpKHQsS2koZSkpfTt2YXIgV2k9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4scj0tMSxpPXQubGVuZ3RoOysrcjxpOyl7dmFyIG89ZSh0W3JdKTt2b2lkIDAhPT1vJiYobj12b2lkIDA9PT1uP286bitvKX1yZXR1cm4gbn0scWk9V2ksR2k9a247dmFyIFFpPWZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0Lmxlbmd0aD9xaSh0LEdpKTowfSx0bz1tLGVvPW4sbm89Xzt2YXIgcm89ZnVuY3Rpb24odCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0fHwhZW8odCkmJm5vKHQpJiYiW29iamVjdCBTdHJpbmddIj09dG8odCl9LGlvPVRpKCJsZW5ndGgiKSxvbz1SZWdFeHAoIltcXHUyMDBkXFx1ZDgwMC1cXHVkZmZmXFx1MDMwMC1cXHUwMzZmXFx1ZmUyMC1cXHVmZTJmXFx1MjBkMC1cXHUyMGZmXFx1ZmUwZVxcdWZlMGZdIik7dmFyIGxvPWZ1bmN0aW9uKHQpe3JldHVybiBvby50ZXN0KHQpfSxhbz0iXFx1ZDgwMC1cXHVkZmZmIixzbz0iWyIrYW8rIl0iLHVvPSJbXFx1MDMwMC1cXHUwMzZmXFx1ZmUyMC1cXHVmZTJmXFx1MjBkMC1cXHUyMGZmXSIsY289IlxcdWQ4M2NbXFx1ZGZmYi1cXHVkZmZmXSIsZm89IlteIithbysiXSIsaG89Iig/OlxcdWQ4M2NbXFx1ZGRlNi1cXHVkZGZmXSl7Mn0iLGdvPSJbXFx1ZDgwMC1cXHVkYmZmXVtcXHVkYzAwLVxcdWRmZmZdIix2bz0iKD86Iit1bysifCIrY28rIikiKyI/Iixwbz0iW1xcdWZlMGVcXHVmZTBmXT8iLHlvPXBvK3ZvKygiKD86XFx1MjAwZCg/OiIrW2ZvLGhvLGdvXS5qb2luKCJ8IikrIikiK3BvK3ZvKyIpKiIpLG1vPSIoPzoiK1tmbyt1bysiPyIsdW8saG8sZ28sc29dLmpvaW4oInwiKSsiKSIsX289UmVnRXhwKGNvKyIoPz0iK2NvKyIpfCIrbW8reW8sImciKTt2YXIgYm89aW8seG89bG8sd289ZnVuY3Rpb24odCl7Zm9yKHZhciBlPV9vLmxhc3RJbmRleD0wO19vLnRlc3QodCk7KSsrZTtyZXR1cm4gZX07dmFyIGpvPXBuLFNvPVhyLEFvPV9uLE9vPXJvLE1vPWZ1bmN0aW9uKHQpe3JldHVybiB4byh0KT93byh0KTpibyh0KX07dmFyIGtvPWZ1bmN0aW9uKHQpe2lmKG51bGw9PXQpcmV0dXJuIDA7aWYoQW8odCkpcmV0dXJuIE9vKHQpP01vKHQpOnQubGVuZ3RoO3ZhciBlPVNvKHQpO3JldHVybiJbb2JqZWN0IE1hcF0iPT1lfHwiW29iamVjdCBTZXRdIj09ZT90LnNpemU6am8odCkubGVuZ3RofSxQbz1tLEZvPV87dmFyIFRvPWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdHx8Rm8odCkmJiJbb2JqZWN0IE51bWJlcl0iPT1Qbyh0KX07ZnVuY3Rpb24gem8odCl7cmV0dXJuIltvYmplY3QgT2JqZWN0XSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9ZnVuY3Rpb24gSW8odCl7aWYoem8odCkpe2ZvcihsZXQgZSBpbiB0KXJldHVybiEwO3JldHVybiExfXJldHVybiExfWZ1bmN0aW9uICRvKHQpe3JldHVybiJbb2JqZWN0IEFycmF5XSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9ZnVuY3Rpb24gRW8odCl7cmV0dXJuISFmdW5jdGlvbih0KXtyZXR1cm4iW29iamVjdCBVbmRlZmluZWRdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX0odCl8fCghIWZ1bmN0aW9uKHQpe3JldHVybiJbb2JqZWN0IE51bGxdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX0odCl8fCghIWZ1bmN0aW9uKHQpe2lmKHpvKHQpKXtmb3IobGV0IGUgaW4gdClyZXR1cm4hMTtyZXR1cm4hMH1yZXR1cm4hMX0odCl8fCghIWZ1bmN0aW9uKHQpe3JldHVybiEoIVNlKHQpfHwiIiE9PXQpfSh0KXx8ISFmdW5jdGlvbih0KXtyZXR1cm4hISRvKHQpJiYwPT09dC5sZW5ndGh9KHQpKSkpfWZ1bmN0aW9uIE5vKHQpe3JldHVybiEhJG8odCkmJigwIT09dC5sZW5ndGgmJigxIT09dC5sZW5ndGh8fCFFbyh0WzBdKSkpfWZ1bmN0aW9uIFJvKHQpe2xldCBlPSExO3JldHVybiBBZSh0KT9lPSFpc05hTihOdW1iZXIodCkpOmZ1bmN0aW9uKHQpe3JldHVybiJbb2JqZWN0IE51bWJlcl0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfSh0KSYmKGU9ITApLGV9dmFyIENvPS9ccy87dmFyIEJvPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10Lmxlbmd0aDtlLS0mJkNvLnRlc3QodC5jaGFyQXQoZSkpOyk7cmV0dXJuIGV9LFVvPS9eXHMrLzt2YXIgTG89ZnVuY3Rpb24odCl7cmV0dXJuIHQ/dC5zbGljZSgwLEJvKHQpKzEpLnJlcGxhY2UoVW8sIiIpOnR9LERvPWssSG89dyxYbz0vXlstK10weFswLTlhLWZdKyQvaSxZbz0vXjBiWzAxXSskL2ksS289L14wb1swLTddKyQvaSxabz1wYXJzZUludDt2YXIgSm89ZnVuY3Rpb24odCl7aWYoIm51bWJlciI9PXR5cGVvZiB0KXJldHVybiB0O2lmKEhvKHQpKXJldHVybiBOYU47aWYoRG8odCkpe3ZhciBlPSJmdW5jdGlvbiI9PXR5cGVvZiB0LnZhbHVlT2Y/dC52YWx1ZU9mKCk6dDt0PURvKGUpP2UrIiI6ZX1pZigic3RyaW5nIiE9dHlwZW9mIHQpcmV0dXJuIDA9PT10P3Q6K3Q7dD1Mbyh0KTt2YXIgbj1Zby50ZXN0KHQpO3JldHVybiBufHxLby50ZXN0KHQpP1pvKHQuc2xpY2UoMiksbj8yOjgpOlhvLnRlc3QodCk/TmFOOit0fSxWbz1KbyxXbz0xLzA7dmFyIHFvPWZ1bmN0aW9uKHQpe3JldHVybiB0Pyh0PVZvKHQpKT09PVdvfHx0PT09LTEvMD8xNzk3NjkzMTM0ODYyMzE1N2UyOTIqKHQ8MD8tMToxKTp0PT10P3Q6MDowPT09dD90OjB9O2Z1bmN0aW9uIEdvKHQpe2lmKCFSbyh0KSlyZXR1cm4gMDtyZXR1cm4gcW8odCl9ZnVuY3Rpb24gUW8odCxlKXtyZXR1cm4hIXpvKHQpJiYoISghQWUoZSkmJiFSbyhlKSkmJmUgaW4gdCl9ZnVuY3Rpb24gdGwodCxlPXt9KXtpZihrbyh0KTw9MClyZXR1cm5bXTtsZXQgbj1fZShlLCJrZXlYIik7QWUobil8fChuPSJ4Iik7bGV0IHI9X2UoZSwia2V5WSIpO0FlKHIpfHwocj0ieSIpO2xldCBpPV9lKGUsImtleUluZCIsIiIpO0FlKGkpfHwoaT0iaW5kIik7bGV0IG89W107cmV0dXJuIEVuKHQsKCh0LGUpPT57bGV0IGw9bnVsbCxhPW51bGw7JG8odCkmJmtvKHQpPj0yPyhsPV9lKHQsMCksYT1fZSh0LDEpKToobD1fZSh0LG4sbnVsbCksYT1fZSh0LHIsbnVsbCkpLFJvKGwpJiZSbyhhKSYmKGw9Sm8obCksYT1KbyhhKSxvLnB1c2goe3g6bCx5OmEsW2ldOmV9KSl9KSksb31mdW5jdGlvbiBlbCh0LGU9e30pe2lmKGtvKHQpPD0wKXJldHVybltdO2xldCBuPV9lKGUsImtleVgiKTtBZShuKXx8KG49IngiKTtsZXQgcj1fZShlLCJrZXlZIik7QWUocil8fChyPSJ5Iik7bGV0IGk9X2UoZSwia2V5WiIsIiIpO0FlKGkpfHwoaT0ieiIpO2xldCBvPV9lKGUsImtleUluZCIsIiIpO0FlKG8pfHwobz0iaW5kIik7bGV0IGw9W107cmV0dXJuIEVuKHQsKCh0LGUpPT57bGV0IGE9bnVsbCxzPW51bGwsdT1udWxsOyRvKHQpJiZrbyh0KT49Mz8oYT1fZSh0LDApLHM9X2UodCwxKSx1PV9lKHQsMikpOihhPV9lKHQsbixudWxsKSxzPV9lKHQscixudWxsKSx1PV9lKHQsaSxudWxsKSksUm8oYSkmJlJvKHMpJiZSbyh1KSYmKGE9Sm8oYSkscz1KbyhzKSx1PUpvKHUpLGwucHVzaCh7eDphLHk6cyx6OnUsW29dOmV9KSl9KSksbH12YXIgbmw9dzt2YXIgcmw9ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj0tMSxpPXQubGVuZ3RoOysrcjxpOyl7dmFyIG89dFtyXSxsPWUobyk7aWYobnVsbCE9bCYmKHZvaWQgMD09PWE/bD09bCYmIW5sKGwpOm4obCxhKSkpdmFyIGE9bCxzPW99cmV0dXJuIHN9O3ZhciBpbD1ybCxvbD1mdW5jdGlvbih0LGUpe3JldHVybiB0PGV9LGxsPWtuO3ZhciBhbD1mdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5sZW5ndGg/aWwodCxsbCxvbCk6dm9pZCAwfTt2YXIgc2w9cmwsdWw9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD5lfSxjbD1rbjt2YXIgZmw9ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQubGVuZ3RoP3NsKHQsY2wsdWwpOnZvaWQgMH07ZnVuY3Rpb24gaGwodCl7cmV0dXJuIGhsPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJiJzeW1ib2wiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKHQpe3JldHVybiB0eXBlb2YgdH06ZnVuY3Rpb24odCl7cmV0dXJuIHQmJiJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJnQuY29uc3RydWN0b3I9PT1TeW1ib2wmJnQhPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiB0fSxobCh0KX1mdW5jdGlvbiBnbCh0KXt2YXIgZT1mdW5jdGlvbih0LGUpe2lmKCJvYmplY3QiIT09aGwodCl8fG51bGw9PT10KXJldHVybiB0O3ZhciBuPXRbU3ltYm9sLnRvUHJpbWl0aXZlXTtpZih2b2lkIDAhPT1uKXt2YXIgcj1uLmNhbGwodCxlfHwiZGVmYXVsdCIpO2lmKCJvYmplY3QiIT09aGwocikpcmV0dXJuIHI7dGhyb3cgbmV3IFR5cGVFcnJvcigiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS4iKX1yZXR1cm4oInN0cmluZyI9PT1lP1N0cmluZzpOdW1iZXIpKHQpfSh0LCJzdHJpbmciKTtyZXR1cm4ic3ltYm9sIj09PWhsKGUpP2U6U3RyaW5nKGUpfWZ1bmN0aW9uIHZsKHQsZSxuKXtyZXR1cm4oZT1nbChlKSlpbiB0P09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUse3ZhbHVlOm4sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTp0W2VdPW4sdH12YXIgZGw9TW47dmFyIHBsPWRyLHlsPWZ1bmN0aW9uKHQsZSl7dmFyIG49W107cmV0dXJuIGRsKHQsKGZ1bmN0aW9uKHQscixpKXtlKHQscixpKSYmbi5wdXNoKHQpfSkpLG59LG1sPURpLF9sPW47dmFyIGJsPWZ1bmN0aW9uKHQsZSl7cmV0dXJuKF9sKHQpP3BsOnlsKSh0LG1sKGUpKX0seGw9TWF0aC5jZWlsLHdsPU1hdGgubWF4O3ZhciBqbD1kdCxTbD1fbixBbD1EZSxPbD1rO3ZhciBNbD1mdW5jdGlvbih0LGUsbixyKXtmb3IodmFyIGk9LTEsbz13bCh4bCgoZS10KS8obnx8MSkpLDApLGw9QXJyYXkobyk7by0tOylsW3I/bzorK2ldPXQsdCs9bjtyZXR1cm4gbH0sa2w9ZnVuY3Rpb24odCxlLG4pe2lmKCFPbChuKSlyZXR1cm4hMTt2YXIgcj10eXBlb2YgZTtyZXR1cm4hISgibnVtYmVyIj09cj9TbChuKSYmQWwoZSxuLmxlbmd0aCk6InN0cmluZyI9PXImJmUgaW4gbikmJmpsKG5bZV0sdCl9LFBsPXFvO3ZhciBGbD1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSxuLHIpe3JldHVybiByJiYibnVtYmVyIiE9dHlwZW9mIHImJmtsKGUsbixyKSYmKG49cj12b2lkIDApLGU9UGwoZSksdm9pZCAwPT09bj8obj1lLGU9MCk6bj1QbChuKSxyPXZvaWQgMD09PXI/ZTxuPzE6LTE6UGwociksTWwoZSxuLHIsdCl9fSgpLFRsPVdpO3ZhciB6bD1mdW5jdGlvbih0LGUpe3ZhciBuPW51bGw9PXQ/MDp0Lmxlbmd0aDtyZXR1cm4gbj9UbCh0LGUpL246TmFOfSxJbD1rbjt2YXIgJGw9ZnVuY3Rpb24odCl7cmV0dXJuIHpsKHQsSWwpfTtmdW5jdGlvbiBFbCh0LGUpe3ZhciBuPU9iamVjdC5rZXlzKHQpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModCk7ZSYmKHI9ci5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsZSkuZW51bWVyYWJsZX0pKSksbi5wdXNoLmFwcGx5KG4scil9cmV0dXJuIG59ZnVuY3Rpb24gTmwodCl7aWYoIU5vKHQpKXJldHVybntlcnI6ImFyciBpcyBub3QgYW4gZWZmZWN0aXZlIGFycmF5In07bGV0IGU9X2UodCwwKSxuPTA7Tm8oZSkmJihuPWtvKGUpKTtsZXQgcj1bXTtpZigwPT09bj8ocj1ibCh0LFJvKSxyPVZpKHIsR28pKTpFbih0LCh0PT57bGV0IGU9ITAsaT1bXTtFbihGbChuKSwobj0+e2xldCByPV9lKHQsbik7Um8ocil8fChlPSExKSxpLnB1c2goR28ocikpfSkpLGUmJnIucHVzaChpKX0pKSwwPT09a28ocikpcmV0dXJue2VycjoiYXJyIGhhcyBubyBlZmZlY3RpdmUgZGF0YSJ9O2xldCBpPXQ9PntsZXQgZT0odD0+e2xldCBlPWFsKHQpLG49ZmwodCk7cmV0dXJue21pbjplLG1heDpuLHJhbmdlOm4tZSxtaWQ6KG4rZSkvMixhdmc6JGwodCl9fSkodCksbj0oKHQsZSxuLHIpPT5WaSh0LCh0PT4odC1lKS9yKSkpKHQsZS5taW4sZS5tYXgsZS5yYW5nZSk7cmV0dXJuIGZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe3ZhciBuPW51bGwhPWFyZ3VtZW50c1tlXT9hcmd1bWVudHNbZV06e307ZSUyP0VsKE9iamVjdChuKSwhMCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmwodCxlLG5bZV0pfSkpOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHQsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobikpOkVsKE9iamVjdChuKSkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG4sZSkpfSkpfXJldHVybiB0fSh7YXJyOm59LGUpfSxvPW51bGw7cmV0dXJuIG89MD09PW4/aShyKTpWaShGbChuKSwodD0+e2xldCBlPVZpKHIsdCk7cmV0dXJuIGkoZSl9KSksb31mdW5jdGlvbiBSbCh0LGU9W10pe2lmKCFObyh0KSlyZXR1cm57ZXJyOiJhcnIgaXMgbm90IGFuIGVmZmVjdGl2ZSBhcnJheSJ9O2lmKGtvKGUpPjApe2lmKCFJbyhfZSh0LDApKSlyZXR1cm57ZXJyOiJhcnIgaXMgbm90IGFuIGVmZmVjdGl2ZSBhcnJheSBvZiBvYmplY3RzIn07bGV0IG49W107RW4odCwodD0+e2xldCByPVtdO0VuKGUsKGU9PntyLnB1c2goX2UodCxlLCIiKSl9KSksbi5wdXNoKHIpfSkpLHQ9bn1yZXR1cm4gTmwodCl9ZnVuY3Rpb24gQ2wodCxlPXt9KXtsZXQgbj1fZShlLCJrZXlYIik7QWUobil8fChuPSJ4Iik7bGV0IHI9X2UoZSwia2V5WSIpO0FlKHIpfHwocj0ieSIpO2xldCBpPV9lKGUsImtleVoiLCIiKTtBZShpKXx8KGk9InoiKTtsZXQgbz1fZShlLCJrZXlJbmQiLCIiKTtBZShvKXx8KG89ImluZCIpO2xldCBsPV9lKGUsInNjYWxlIik7aWYoUm8obCl8fChsPTEpLGw9R28obCksbDw9MCl0aHJvdyBuZXcgRXJyb3IoInNjYWxlIG5lZWQgPj0gMCIpO2xldCBhPVJsKFZpKHQsbikpLHM9UmwoVmkodCxyKSksdT1SbChWaSh0LGkpKSxjPU1hdGgubWF4KGEucmFuZ2Uscy5yYW5nZSksZj1jLzIsaD1be21pbjphLm1pZC1mLG1heDphLm1pZCtmLHJhbmdlOmN9LHttaW46cy5taWQtZixtYXg6cy5taWQrZixyYW5nZTpjfSx7bWluOnUubWluLG1heDp1Lm1heCxyYW5nZTp1LnJhbmdlfV0sZz0odCxlKT0+VG8odCk/aFtlXS5yYW5nZTw9MD90Oih0LWhbZV0ubWluKS9oW2VdLnJhbmdlKmw6bnVsbDt0PVZpKHQsKHQ9PntsZXQgZT1nKHRbbl0sMCksbD1nKHRbcl0sMSksYT1nKHRbaV0sMikscz10W29dO3JldHVybntbbl06ZSxbcl06bCxbaV06YSxbb106c319KSk7bGV0IHY9VmkodCxuKSxkPWFsKHYpLHA9ZmwodikseT1WaSh0LHIpLG09YWwoeSksXz1mbCh5KSxiPVZpKHQsaSk7cmV0dXJue3BzOnQscHNNaW5NYXg6e3htaW46ZCx4bWF4OnAseW1pbjptLHltYXg6Xyx6bWluOmFsKGIpLHptYXg6ZmwoYil9LHN0OmgsbnY6ZyxpbnY6KHQsZSk9PlRvKHQpP2w8PTA/dDp0L2wqaFtlXS5yYW5nZStoW2VdLm1pbjpudWxsfX12YXIgQmw9Q2UsVWw9bixMbD1hP2EuaXNDb25jYXRTcHJlYWRhYmxlOnZvaWQgMDt2YXIgRGw9ZnIsSGw9ZnVuY3Rpb24odCl7cmV0dXJuIFVsKHQpfHxCbCh0KXx8ISEoTGwmJnQmJnRbTGxdKX07dmFyIFhsPWZ1bmN0aW9uIHQoZSxuLHIsaSxvKXt2YXIgbD0tMSxhPWUubGVuZ3RoO2ZvcihyfHwocj1IbCksb3x8KG89W10pOysrbDxhOyl7dmFyIHM9ZVtsXTtuPjAmJnIocyk/bj4xP3QocyxuLTEscixpLG8pOkRsKG8scyk6aXx8KG9bby5sZW5ndGhdPXMpfXJldHVybiBvfSxZbD1YbDt2YXIgS2w9ZnVuY3Rpb24odCl7cmV0dXJuKG51bGw9PXQ/MDp0Lmxlbmd0aCk/WWwodCwxKTpbXX07ZnVuY3Rpb24gWmwodCl7bGV0IGU9ZnVuY3Rpb24odCl7bGV0IGU9a28oX2UodCwiMCIsbnVsbCkpLG49a28oX2UodCwiMC4wIixudWxsKSk7cmV0dXJuIDI9PT1rbyhfZSh0LCIwLjAuMCIsbnVsbCkpPzM6Mj09PW4/MjoyPT09ZT8xOjA9PT1lPzA6KGNvbnNvbGUubG9nKCJpbnZhbGlkIHBvaW50IGRlcHRoIix0KSxudWxsKX0odCk7cmV0dXJuIDM9PT1lP0tsKHQpOjI9PT1lP3Q6MT09PWU/W3RdOjA9PT1lP1tdOnR9ZnVuY3Rpb24gSmwodCl7aWYoIU5vKHQpKXJldHVybiAwO3Q9WmwodCk7bGV0IGU9MDtyZXR1cm4gRW4odCwoKHQsbik9PntsZXQgcj1mdW5jdGlvbih0LGU9e30pe2xldCBuPV9lKGUsInVzZUFicyIpO2lmKGplKG4pfHwobj0hMCksIU5vKHQpKXJldHVybiAwO2xldCByPVtdO2lmKEVuKHQsKHQ9PnsyPT09a28odCkmJlJvKHRbMF0pJiZSbyh0WzFdKSYmci5wdXNoKFtHbyh0WzBdKSxHbyh0WzFdKV0pfSkpLCFObyhyKSlyZXR1cm4gMDtsZXQgaSxvPS0xLGw9a28ociksYT1yW2wtMV0scz0wO2Zvcig7KytvPGw7KWk9YSxhPXJbb10scys9aVsxXSphWzBdLWlbMF0qYVsxXTtsZXQgdT1zLzI7cmV0dXJuIG4mJih1PU1hdGguYWJzKHUpKSx1fSh0KTswPT09bj9lPXI6ZS09cn0pKSxlPDA/MDplfXZhciBWbD1mdW5jdGlvbih0KXsibnVtYmVyIiE9dHlwZW9mIHQmJih0PTFlLTEwKTt2YXIgZT17ZXBzaWxvbjpmdW5jdGlvbihlKXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIGUmJih0PWUpLHR9LHBvaW50QWJvdmVPck9uTGluZTpmdW5jdGlvbihlLG4scil7dmFyIGk9blswXSxvPW5bMV0sbD1yWzBdLGE9clsxXSxzPWVbMF07cmV0dXJuKGwtaSkqKGVbMV0tbyktKGEtbykqKHMtaSk+PS10fSxwb2ludEJldHdlZW46ZnVuY3Rpb24oZSxuLHIpe3ZhciBpPWVbMV0tblsxXSxvPXJbMF0tblswXSxsPWVbMF0tblswXSxhPXJbMV0tblsxXSxzPWwqbytpKmE7cmV0dXJuIShzPHQpJiYhKHMtKG8qbythKmEpPi10KX0scG9pbnRzU2FtZVg6ZnVuY3Rpb24oZSxuKXtyZXR1cm4gTWF0aC5hYnMoZVswXS1uWzBdKTx0fSxwb2ludHNTYW1lWTpmdW5jdGlvbihlLG4pe3JldHVybiBNYXRoLmFicyhlWzFdLW5bMV0pPHR9LHBvaW50c1NhbWU6ZnVuY3Rpb24odCxuKXtyZXR1cm4gZS5wb2ludHNTYW1lWCh0LG4pJiZlLnBvaW50c1NhbWVZKHQsbil9LHBvaW50c0NvbXBhcmU6ZnVuY3Rpb24odCxuKXtyZXR1cm4gZS5wb2ludHNTYW1lWCh0LG4pP2UucG9pbnRzU2FtZVkodCxuKT8wOnRbMV08blsxXT8tMToxOnRbMF08blswXT8tMToxfSxwb2ludHNDb2xsaW5lYXI6ZnVuY3Rpb24oZSxuLHIpe3ZhciBpPWVbMF0tblswXSxvPWVbMV0tblsxXSxsPW5bMF0tclswXSxhPW5bMV0tclsxXTtyZXR1cm4gTWF0aC5hYnMoaSphLWwqbyk8dH0sbGluZXNJbnRlcnNlY3Q6ZnVuY3Rpb24oZSxuLHIsaSl7dmFyIG89blswXS1lWzBdLGw9blsxXS1lWzFdLGE9aVswXS1yWzBdLHM9aVsxXS1yWzFdLHU9bypzLWwqYTtpZihNYXRoLmFicyh1KTx0KXJldHVybiExO3ZhciBjPWVbMF0tclswXSxmPWVbMV0tclsxXSxoPShhKmYtcypjKS91LGc9KG8qZi1sKmMpL3Usdj17YWxvbmdBOjAsYWxvbmdCOjAscHQ6W2VbMF0raCpvLGVbMV0raCpsXX07cmV0dXJuIHYuYWxvbmdBPWg8PS10Py0yOmg8dD8tMTpoLTE8PS10PzA6aC0xPHQ/MToyLHYuYWxvbmdCPWc8PS10Py0yOmc8dD8tMTpnLTE8PS10PzA6Zy0xPHQ/MToyLHZ9LHBvaW50SW5zaWRlUmVnaW9uOmZ1bmN0aW9uKGUsbil7Zm9yKHZhciByPWVbMF0saT1lWzFdLG89bltuLmxlbmd0aC0xXVswXSxsPW5bbi5sZW5ndGgtMV1bMV0sYT0hMSxzPTA7czxuLmxlbmd0aDtzKyspe3ZhciB1PW5bc11bMF0sYz1uW3NdWzFdO2MtaT50IT1sLWk+dCYmKG8tdSkqKGktYykvKGwtYykrdS1yPnQmJihhPSFhKSxvPXUsbD1jfXJldHVybiBhfX07cmV0dXJuIGV9LFdsPXtjcmVhdGU6ZnVuY3Rpb24oKXt2YXIgdD17cm9vdDp7cm9vdDohMCxuZXh0Om51bGx9LGV4aXN0czpmdW5jdGlvbihlKXtyZXR1cm4gbnVsbCE9PWUmJmUhPT10LnJvb3R9LGlzRW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbD09PXQucm9vdC5uZXh0fSxnZXRIZWFkOmZ1bmN0aW9uKCl7cmV0dXJuIHQucm9vdC5uZXh0fSxpbnNlcnRCZWZvcmU6ZnVuY3Rpb24oZSxuKXtmb3IodmFyIHI9dC5yb290LGk9dC5yb290Lm5leHQ7bnVsbCE9PWk7KXtpZihuKGkpKXJldHVybiBlLnByZXY9aS5wcmV2LGUubmV4dD1pLGkucHJldi5uZXh0PWUsdm9pZChpLnByZXY9ZSk7cj1pLGk9aS5uZXh0fXIubmV4dD1lLGUucHJldj1yLGUubmV4dD1udWxsfSxmaW5kVHJhbnNpdGlvbjpmdW5jdGlvbihlKXtmb3IodmFyIG49dC5yb290LHI9dC5yb290Lm5leHQ7bnVsbCE9PXImJiFlKHIpOyluPXIscj1yLm5leHQ7cmV0dXJue2JlZm9yZTpuPT09dC5yb290P251bGw6bixhZnRlcjpyLGluc2VydDpmdW5jdGlvbih0KXtyZXR1cm4gdC5wcmV2PW4sdC5uZXh0PXIsbi5uZXh0PXQsbnVsbCE9PXImJihyLnByZXY9dCksdH19fX07cmV0dXJuIHR9LG5vZGU6ZnVuY3Rpb24odCl7cmV0dXJuIHQucHJldj1udWxsLHQubmV4dD1udWxsLHQucmVtb3ZlPWZ1bmN0aW9uKCl7dC5wcmV2Lm5leHQ9dC5uZXh0LHQubmV4dCYmKHQubmV4dC5wcmV2PXQucHJldiksdC5wcmV2PW51bGwsdC5uZXh0PW51bGx9LHR9fTt2YXIgcWw9ZnVuY3Rpb24odCxlLG4pe2Z1bmN0aW9uIHIodCxlLHIpe3JldHVybntpZDpuP24uc2VnbWVudElkKCk6LTEsc3RhcnQ6dCxlbmQ6ZSxteUZpbGw6e2Fib3ZlOnIubXlGaWxsLmFib3ZlLGJlbG93OnIubXlGaWxsLmJlbG93fSxvdGhlckZpbGw6bnVsbH19dmFyIGk9V2wuY3JlYXRlKCk7ZnVuY3Rpb24gbyh0LG4pe2kuaW5zZXJ0QmVmb3JlKHQsKGZ1bmN0aW9uKHIpe3JldHVybiBmdW5jdGlvbih0LG4scixpLG8sbCl7dmFyIGE9ZS5wb2ludHNDb21wYXJlKG4sbyk7cmV0dXJuIDAhPT1hP2E6ZS5wb2ludHNTYW1lKHIsbCk/MDp0IT09aT90PzE6LTE6ZS5wb2ludEFib3ZlT3JPbkxpbmUocixpP286bCxpP2w6byk/MTotMX0odC5pc1N0YXJ0LHQucHQsbixyLmlzU3RhcnQsci5wdCxyLm90aGVyLnB0KTwwfSkpfWZ1bmN0aW9uIGwodCxlKXt2YXIgbj1mdW5jdGlvbih0LGUpe3ZhciBuPVdsLm5vZGUoe2lzU3RhcnQ6ITAscHQ6dC5zdGFydCxzZWc6dCxwcmltYXJ5OmUsb3RoZXI6bnVsbCxzdGF0dXM6bnVsbH0pO3JldHVybiBvKG4sdC5lbmQpLG59KHQsZSk7cmV0dXJuIGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1XbC5ub2RlKHtpc1N0YXJ0OiExLHB0OmUuZW5kLHNlZzplLHByaW1hcnk6bixvdGhlcjp0LHN0YXR1czpudWxsfSk7dC5vdGhlcj1yLG8ocix0LnB0KX0obix0LGUpLG59ZnVuY3Rpb24gYSh0LGUpe3ZhciBpPXIoZSx0LnNlZy5lbmQsdC5zZWcpO3JldHVybiBmdW5jdGlvbih0LGUpe24mJm4uc2VnbWVudENob3AodC5zZWcsZSksdC5vdGhlci5yZW1vdmUoKSx0LnNlZy5lbmQ9ZSx0Lm90aGVyLnB0PWUsbyh0Lm90aGVyLHQucHQpfSh0LGUpLGwoaSx0LnByaW1hcnkpfWZ1bmN0aW9uIHMocixvKXt2YXIgbD1XbC5jcmVhdGUoKTtmdW5jdGlvbiBzKHQpe3JldHVybiBsLmZpbmRUcmFuc2l0aW9uKChmdW5jdGlvbihuKXt2YXIgcixpLG8sbCxhLHM7cmV0dXJuKHI9dCxpPW4uZXYsbz1yLnNlZy5zdGFydCxsPXIuc2VnLmVuZCxhPWkuc2VnLnN0YXJ0LHM9aS5zZWcuZW5kLGUucG9pbnRzQ29sbGluZWFyKG8sYSxzKT9lLnBvaW50c0NvbGxpbmVhcihsLGEscyl8fGUucG9pbnRBYm92ZU9yT25MaW5lKGwsYSxzKT8xOi0xOmUucG9pbnRBYm92ZU9yT25MaW5lKG8sYSxzKT8xOi0xKT4wfSkpfWZ1bmN0aW9uIHUodCxyKXt2YXIgaT10LnNlZyxvPXIuc2VnLGw9aS5zdGFydCxzPWkuZW5kLHU9by5zdGFydCxjPW8uZW5kO24mJm4uY2hlY2tJbnRlcnNlY3Rpb24oaSxvKTt2YXIgZj1lLmxpbmVzSW50ZXJzZWN0KGwscyx1LGMpO2lmKCExPT09Zil7aWYoIWUucG9pbnRzQ29sbGluZWFyKGwscyx1KSlyZXR1cm4hMTtpZihlLnBvaW50c1NhbWUobCxjKXx8ZS5wb2ludHNTYW1lKHMsdSkpcmV0dXJuITE7dmFyIGg9ZS5wb2ludHNTYW1lKGwsdSksZz1lLnBvaW50c1NhbWUocyxjKTtpZihoJiZnKXJldHVybiByO3ZhciB2PSFoJiZlLnBvaW50QmV0d2VlbihsLHUsYyksZD0hZyYmZS5wb2ludEJldHdlZW4ocyx1LGMpO2lmKGgpcmV0dXJuIGQ/YShyLHMpOmEodCxjKSxyO3YmJihnfHwoZD9hKHIscyk6YSh0LGMpKSxhKHIsbCkpfWVsc2UgMD09PWYuYWxvbmdBJiYoLTE9PT1mLmFsb25nQj9hKHQsdSk6MD09PWYuYWxvbmdCP2EodCxmLnB0KToxPT09Zi5hbG9uZ0ImJmEodCxjKSksMD09PWYuYWxvbmdCJiYoLTE9PT1mLmFsb25nQT9hKHIsbCk6MD09PWYuYWxvbmdBP2EocixmLnB0KToxPT09Zi5hbG9uZ0EmJmEocixzKSk7cmV0dXJuITF9Zm9yKHZhciBjPVtdOyFpLmlzRW1wdHkoKTspe3ZhciBmPWkuZ2V0SGVhZCgpO2lmKG4mJm4udmVydChmLnB0WzBdKSxmLmlzU3RhcnQpe24mJm4uc2VnbWVudE5ldyhmLnNlZyxmLnByaW1hcnkpO3ZhciBoPXMoZiksZz1oLmJlZm9yZT9oLmJlZm9yZS5ldjpudWxsLHY9aC5hZnRlcj9oLmFmdGVyLmV2Om51bGw7ZnVuY3Rpb24gZCgpe2lmKGcpe3ZhciB0PXUoZixnKTtpZih0KXJldHVybiB0fXJldHVybiEhdiYmdShmLHYpfW4mJm4udGVtcFN0YXR1cyhmLnNlZywhIWcmJmcuc2VnLCEhdiYmdi5zZWcpO3ZhciBwLHk9ZCgpO2lmKHkpe3ZhciBtO2lmKHQpKG09bnVsbD09PWYuc2VnLm15RmlsbC5iZWxvd3x8Zi5zZWcubXlGaWxsLmFib3ZlIT09Zi5zZWcubXlGaWxsLmJlbG93KSYmKHkuc2VnLm15RmlsbC5hYm92ZT0heS5zZWcubXlGaWxsLmFib3ZlKTtlbHNlIHkuc2VnLm90aGVyRmlsbD1mLnNlZy5teUZpbGw7biYmbi5zZWdtZW50VXBkYXRlKHkuc2VnKSxmLm90aGVyLnJlbW92ZSgpLGYucmVtb3ZlKCl9aWYoaS5nZXRIZWFkKCkhPT1mKXtuJiZuLnJld2luZChmLnNlZyk7Y29udGludWV9aWYodCltPW51bGw9PT1mLnNlZy5teUZpbGwuYmVsb3d8fGYuc2VnLm15RmlsbC5hYm92ZSE9PWYuc2VnLm15RmlsbC5iZWxvdyxmLnNlZy5teUZpbGwuYmVsb3c9dj92LnNlZy5teUZpbGwuYWJvdmU6cixmLnNlZy5teUZpbGwuYWJvdmU9bT8hZi5zZWcubXlGaWxsLmJlbG93OmYuc2VnLm15RmlsbC5iZWxvdztlbHNlIGlmKG51bGw9PT1mLnNlZy5vdGhlckZpbGwpcD12P2YucHJpbWFyeT09PXYucHJpbWFyeT92LnNlZy5vdGhlckZpbGwuYWJvdmU6di5zZWcubXlGaWxsLmFib3ZlOmYucHJpbWFyeT9vOnIsZi5zZWcub3RoZXJGaWxsPXthYm92ZTpwLGJlbG93OnB9O24mJm4uc3RhdHVzKGYuc2VnLCEhZyYmZy5zZWcsISF2JiZ2LnNlZyksZi5vdGhlci5zdGF0dXM9aC5pbnNlcnQoV2wubm9kZSh7ZXY6Zn0pKX1lbHNle3ZhciBfPWYuc3RhdHVzO2lmKG51bGw9PT1fKXRocm93IG5ldyBFcnJvcigiUG9seUJvb2w6IFplcm8tbGVuZ3RoIHNlZ21lbnQgZGV0ZWN0ZWQ7IHlvdXIgZXBzaWxvbiBpcyBwcm9iYWJseSB0b28gc21hbGwgb3IgdG9vIGxhcmdlIik7aWYobC5leGlzdHMoXy5wcmV2KSYmbC5leGlzdHMoXy5uZXh0KSYmdShfLnByZXYuZXYsXy5uZXh0LmV2KSxuJiZuLnN0YXR1c1JlbW92ZShfLmV2LnNlZyksXy5yZW1vdmUoKSwhZi5wcmltYXJ5KXt2YXIgYj1mLnNlZy5teUZpbGw7Zi5zZWcubXlGaWxsPWYuc2VnLm90aGVyRmlsbCxmLnNlZy5vdGhlckZpbGw9Yn1jLnB1c2goZi5zZWcpfWkuZ2V0SGVhZCgpLnJlbW92ZSgpfXJldHVybiBuJiZuLmRvbmUoKSxjfXJldHVybiB0P3thZGRSZWdpb246ZnVuY3Rpb24odCl7Zm9yKHZhciByLGksbyxhPXRbdC5sZW5ndGgtMV0scz0wO3M8dC5sZW5ndGg7cysrKXtyPWEsYT10W3NdO3ZhciB1PWUucG9pbnRzQ29tcGFyZShyLGEpOzAhPT11JiZsKChpPXU8MD9yOmEsbz11PDA/YTpyLHtpZDpuP24uc2VnbWVudElkKCk6LTEsc3RhcnQ6aSxlbmQ6byxteUZpbGw6e2Fib3ZlOm51bGwsYmVsb3c6bnVsbH0sb3RoZXJGaWxsOm51bGx9KSwhMCl9fSxjYWxjdWxhdGU6ZnVuY3Rpb24odCl7cmV0dXJuIHModCwhMSl9fTp7Y2FsY3VsYXRlOmZ1bmN0aW9uKHQsZSxuLGkpe3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQpe2wocih0LnN0YXJ0LHQuZW5kLHQpLCEwKX0pKSxuLmZvckVhY2goKGZ1bmN0aW9uKHQpe2wocih0LnN0YXJ0LHQuZW5kLHQpLCExKX0pKSxzKGUsaSl9fX07dmFyIEdsPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1bXSxpPVtdO3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBvPXQuc3RhcnQsbD10LmVuZDtpZihlLnBvaW50c1NhbWUobyxsKSljb25zb2xlLndhcm4oIlBvbHlCb29sOiBXYXJuaW5nOiBaZXJvLWxlbmd0aCBzZWdtZW50IGRldGVjdGVkOyB5b3VyIGVwc2lsb24gaXMgcHJvYmFibHkgdG9vIHNtYWxsIG9yIHRvbyBsYXJnZSIpO2Vsc2V7biYmbi5jaGFpblN0YXJ0KHQpO2Zvcih2YXIgYT17aW5kZXg6MCxtYXRjaGVzX2hlYWQ6ITEsbWF0Y2hlc19wdDE6ITF9LHM9e2luZGV4OjAsbWF0Y2hlc19oZWFkOiExLG1hdGNoZXNfcHQxOiExfSx1PWEsYz0wO2M8ci5sZW5ndGg7YysrKXt2YXIgZj0ocD1yW2NdKVswXTtwWzFdO3ZhciBoPXBbcC5sZW5ndGgtMV07aWYocFtwLmxlbmd0aC0yXSxlLnBvaW50c1NhbWUoZixvKSl7aWYoUyhjLCEwLCEwKSlicmVha31lbHNlIGlmKGUucG9pbnRzU2FtZShmLGwpKXtpZihTKGMsITAsITEpKWJyZWFrfWVsc2UgaWYoZS5wb2ludHNTYW1lKGgsbykpe2lmKFMoYywhMSwhMCkpYnJlYWt9ZWxzZSBpZihlLnBvaW50c1NhbWUoaCxsKSYmUyhjLCExLCExKSlicmVha31pZih1PT09YSlyZXR1cm4gci5wdXNoKFtvLGxdKSx2b2lkKG4mJm4uY2hhaW5OZXcobyxsKSk7aWYodT09PXMpe24mJm4uY2hhaW5NYXRjaChhLmluZGV4KTt2YXIgZz1hLmluZGV4LHY9YS5tYXRjaGVzX3B0MT9sOm8sZD1hLm1hdGNoZXNfaGVhZCxwPXJbZ10seT1kP3BbMF06cFtwLmxlbmd0aC0xXSxtPWQ/cFsxXTpwW3AubGVuZ3RoLTJdLF89ZD9wW3AubGVuZ3RoLTFdOnBbMF0sYj1kP3BbcC5sZW5ndGgtMl06cFsxXTtyZXR1cm4gZS5wb2ludHNDb2xsaW5lYXIobSx5LHYpJiYoZD8obiYmbi5jaGFpblJlbW92ZUhlYWQoYS5pbmRleCx2KSxwLnNoaWZ0KCkpOihuJiZuLmNoYWluUmVtb3ZlVGFpbChhLmluZGV4LHYpLHAucG9wKCkpLHk9bSksZS5wb2ludHNTYW1lKF8sdik/KHIuc3BsaWNlKGcsMSksZS5wb2ludHNDb2xsaW5lYXIoYixfLHkpJiYoZD8obiYmbi5jaGFpblJlbW92ZVRhaWwoYS5pbmRleCx5KSxwLnBvcCgpKToobiYmbi5jaGFpblJlbW92ZUhlYWQoYS5pbmRleCx5KSxwLnNoaWZ0KCkpKSxuJiZuLmNoYWluQ2xvc2UoYS5pbmRleCksdm9pZCBpLnB1c2gocCkpOnZvaWQoZD8obiYmbi5jaGFpbkFkZEhlYWQoYS5pbmRleCx2KSxwLnVuc2hpZnQodikpOihuJiZuLmNoYWluQWRkVGFpbChhLmluZGV4LHYpLHAucHVzaCh2KSkpfXZhciB4PWEuaW5kZXgsdz1zLmluZGV4O24mJm4uY2hhaW5Db25uZWN0KHgsdyk7dmFyIGo9clt4XS5sZW5ndGg8clt3XS5sZW5ndGg7YS5tYXRjaGVzX2hlYWQ/cy5tYXRjaGVzX2hlYWQ/aj8oQSh4KSxPKHgsdykpOihBKHcpLE8odyx4KSk6Tyh3LHgpOnMubWF0Y2hlc19oZWFkP08oeCx3KTpqPyhBKHgpLE8odyx4KSk6KEEodyksTyh4LHcpKX1mdW5jdGlvbiBTKHQsZSxuKXtyZXR1cm4gdS5pbmRleD10LHUubWF0Y2hlc19oZWFkPWUsdS5tYXRjaGVzX3B0MT1uLHU9PT1hPyh1PXMsITEpOih1PW51bGwsITApfWZ1bmN0aW9uIEEodCl7biYmbi5jaGFpblJldmVyc2UodCksclt0XS5yZXZlcnNlKCl9ZnVuY3Rpb24gTyh0LGkpe3ZhciBvPXJbdF0sbD1yW2ldLGE9b1tvLmxlbmd0aC0xXSxzPW9bby5sZW5ndGgtMl0sdT1sWzBdLGM9bFsxXTtlLnBvaW50c0NvbGxpbmVhcihzLGEsdSkmJihuJiZuLmNoYWluUmVtb3ZlVGFpbCh0LGEpLG8ucG9wKCksYT1zKSxlLnBvaW50c0NvbGxpbmVhcihhLHUsYykmJihuJiZuLmNoYWluUmVtb3ZlSGVhZChpLHUpLGwuc2hpZnQoKSksbiYmbi5jaGFpbkpvaW4odCxpKSxyW3RdPW8uY29uY2F0KGwpLHIuc3BsaWNlKGksMSl9fSkpLGl9O2Z1bmN0aW9uIFFsKHQsZSxuKXt2YXIgcj1bXTtyZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgaT0odC5teUZpbGwuYWJvdmU/ODowKSsodC5teUZpbGwuYmVsb3c/NDowKSsodC5vdGhlckZpbGwmJnQub3RoZXJGaWxsLmFib3ZlPzI6MCkrKHQub3RoZXJGaWxsJiZ0Lm90aGVyRmlsbC5iZWxvdz8xOjApOzAhPT1lW2ldJiZyLnB1c2goe2lkOm4/bi5zZWdtZW50SWQoKTotMSxzdGFydDp0LnN0YXJ0LGVuZDp0LmVuZCxteUZpbGw6e2Fib3ZlOjE9PT1lW2ldLGJlbG93OjI9PT1lW2ldfSxvdGhlckZpbGw6bnVsbH0pfSkpLG4mJm4uc2VsZWN0ZWQocikscn12YXIgdGEsZWE9e3VuaW9uOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIFFsKHQsWzAsMiwxLDAsMiwyLDAsMCwxLDAsMSwwLDAsMCwwLDBdLGUpfSxpbnRlcnNlY3Q6ZnVuY3Rpb24odCxlKXtyZXR1cm4gUWwodCxbMCwwLDAsMCwwLDIsMCwyLDAsMCwxLDEsMCwyLDEsMF0sZSl9LGRpZmZlcmVuY2U6ZnVuY3Rpb24odCxlKXtyZXR1cm4gUWwodCxbMCwwLDAsMCwyLDAsMiwwLDEsMSwwLDAsMCwxLDIsMF0sZSl9LGRpZmZlcmVuY2VSZXY6ZnVuY3Rpb24odCxlKXtyZXR1cm4gUWwodCxbMCwyLDEsMCwwLDAsMSwxLDAsMiwwLDIsMCwwLDAsMF0sZSl9LHhvcjpmdW5jdGlvbih0LGUpe3JldHVybiBRbCh0LFswLDIsMSwwLDIsMCwwLDEsMSwwLDAsMiwwLDEsMiwwXSxlKX19LG5hPXt0b1BvbHlnb246ZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBuKGUpe2lmKGUubGVuZ3RoPD0wKXJldHVybiB0LnNlZ21lbnRzKHtpbnZlcnRlZDohMSxyZWdpb25zOltdfSk7ZnVuY3Rpb24gbihlKXt2YXIgbj1lLnNsaWNlKDAsZS5sZW5ndGgtMSk7cmV0dXJuIHQuc2VnbWVudHMoe2ludmVydGVkOiExLHJlZ2lvbnM6W25dfSl9Zm9yKHZhciByPW4oZVswXSksaT0xO2k8ZS5sZW5ndGg7aSsrKXI9dC5zZWxlY3REaWZmZXJlbmNlKHQuY29tYmluZShyLG4oZVtpXSkpKTtyZXR1cm4gcn1pZigiUG9seWdvbiI9PT1lLnR5cGUpcmV0dXJuIHQucG9seWdvbihuKGUuY29vcmRpbmF0ZXMpKTtpZigiTXVsdGlQb2x5Z29uIj09PWUudHlwZSl7Zm9yKHZhciByPXQuc2VnbWVudHMoe2ludmVydGVkOiExLHJlZ2lvbnM6W119KSxpPTA7aTxlLmNvb3JkaW5hdGVzLmxlbmd0aDtpKyspcj10LnNlbGVjdFVuaW9uKHQuY29tYmluZShyLG4oZS5jb29yZGluYXRlc1tpXSkpKTtyZXR1cm4gdC5wb2x5Z29uKHIpfXRocm93IG5ldyBFcnJvcigiUG9seUJvb2w6IENhbm5vdCBjb252ZXJ0IEdlb0pTT04gb2JqZWN0IHRvIFBvbHlCb29sIHBvbHlnb24iKX0sZnJvbVBvbHlnb246ZnVuY3Rpb24odCxlLG4pe2Z1bmN0aW9uIHIodCxuKXtyZXR1cm4gZS5wb2ludEluc2lkZVJlZ2lvbihbLjUqKHRbMF1bMF0rdFsxXVswXSksLjUqKHRbMF1bMV0rdFsxXVsxXSldLG4pfWZ1bmN0aW9uIGkodCl7cmV0dXJue3JlZ2lvbjp0LGNoaWxkcmVuOltdfX1uPXQucG9seWdvbih0LnNlZ21lbnRzKG4pKTt2YXIgbz1pKG51bGwpO2Z1bmN0aW9uIGwodCxlKXtmb3IodmFyIG49MDtuPHQuY2hpbGRyZW4ubGVuZ3RoO24rKyl7aWYocihlLChhPXQuY2hpbGRyZW5bbl0pLnJlZ2lvbikpcmV0dXJuIHZvaWQgbChhLGUpfXZhciBvPWkoZSk7Zm9yKG49MDtuPHQuY2hpbGRyZW4ubGVuZ3RoO24rKyl7dmFyIGE7cigoYT10LmNoaWxkcmVuW25dKS5yZWdpb24sZSkmJihvLmNoaWxkcmVuLnB1c2goYSksdC5jaGlsZHJlbi5zcGxpY2UobiwxKSxuLS0pfXQuY2hpbGRyZW4ucHVzaChvKX1mb3IodmFyIGE9MDthPG4ucmVnaW9ucy5sZW5ndGg7YSsrKXt2YXIgcz1uLnJlZ2lvbnNbYV07cy5sZW5ndGg8M3x8bChvLHMpfWZ1bmN0aW9uIHUodCxlKXtmb3IodmFyIG49MCxyPXRbdC5sZW5ndGgtMV1bMF0saT10W3QubGVuZ3RoLTFdWzFdLG89W10sbD0wO2w8dC5sZW5ndGg7bCsrKXt2YXIgYT10W2xdWzBdLHM9dFtsXVsxXTtvLnB1c2goW2Esc10pLG4rPXMqci1hKmkscj1hLGk9c31yZXR1cm4gbjwwIT09ZSYmby5yZXZlcnNlKCksby5wdXNoKFtvWzBdWzBdLG9bMF1bMV1dKSxvfXZhciBjPVtdO2Z1bmN0aW9uIGYodCl7dmFyIGU9W3UodC5yZWdpb24sITEpXTtjLnB1c2goZSk7Zm9yKHZhciBuPTA7bjx0LmNoaWxkcmVuLmxlbmd0aDtuKyspZS5wdXNoKGgodC5jaGlsZHJlbltuXSkpfWZ1bmN0aW9uIGgodCl7Zm9yKHZhciBlPTA7ZTx0LmNoaWxkcmVuLmxlbmd0aDtlKyspZih0LmNoaWxkcmVuW2VdKTtyZXR1cm4gdSh0LnJlZ2lvbiwhMCl9Zm9yKGE9MDthPG8uY2hpbGRyZW4ubGVuZ3RoO2ErKylmKG8uY2hpbGRyZW5bYV0pO3JldHVybiBjLmxlbmd0aDw9MD97dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6W119OjE9PWMubGVuZ3RoP3t0eXBlOiJQb2x5Z29uIixjb29yZGluYXRlczpjWzBdfTp7dHlwZToiTXVsdGlQb2x5Z29uIixjb29yZGluYXRlczpjfX19LHJhPWZ1bmN0aW9uKCl7dmFyIHQsZT0wLG49ITE7ZnVuY3Rpb24gcihlLG4pe3JldHVybiB0Lmxpc3QucHVzaCh7dHlwZTplLGRhdGE6bj9KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG4pKTp2b2lkIDB9KSx0fXJldHVybiB0PXtsaXN0OltdLHNlZ21lbnRJZDpmdW5jdGlvbigpe3JldHVybiBlKyt9LGNoZWNrSW50ZXJzZWN0aW9uOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHIoImNoZWNrIix7c2VnMTp0LHNlZzI6ZX0pfSxzZWdtZW50Q2hvcDpmdW5jdGlvbih0LGUpe3JldHVybiByKCJkaXZfc2VnIix7c2VnOnQscHQ6ZX0pLHIoImNob3AiLHtzZWc6dCxwdDplfSl9LHN0YXR1c1JlbW92ZTpmdW5jdGlvbih0KXtyZXR1cm4gcigicG9wX3NlZyIse3NlZzp0fSl9LHNlZ21lbnRVcGRhdGU6ZnVuY3Rpb24odCl7cmV0dXJuIHIoInNlZ191cGRhdGUiLHtzZWc6dH0pfSxzZWdtZW50TmV3OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHIoIm5ld19zZWciLHtzZWc6dCxwcmltYXJ5OmV9KX0sc2VnbWVudFJlbW92ZTpmdW5jdGlvbih0KXtyZXR1cm4gcigicmVtX3NlZyIse3NlZzp0fSl9LHRlbXBTdGF0dXM6ZnVuY3Rpb24odCxlLG4pe3JldHVybiByKCJ0ZW1wX3N0YXR1cyIse3NlZzp0LGFib3ZlOmUsYmVsb3c6bn0pfSxyZXdpbmQ6ZnVuY3Rpb24odCl7cmV0dXJuIHIoInJld2luZCIse3NlZzp0fSl9LHN0YXR1czpmdW5jdGlvbih0LGUsbil7cmV0dXJuIHIoInN0YXR1cyIse3NlZzp0LGFib3ZlOmUsYmVsb3c6bn0pfSx2ZXJ0OmZ1bmN0aW9uKGUpe3JldHVybiBlPT09bj90OihuPWUscigidmVydCIse3g6ZX0pKX0sbG9nOmZ1bmN0aW9uKHQpe3JldHVybiJzdHJpbmciIT10eXBlb2YgdCYmKHQ9SlNPTi5zdHJpbmdpZnkodCwhMSwiICAiKSkscigibG9nIix7dHh0OnR9KX0scmVzZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gcigicmVzZXQiKX0sc2VsZWN0ZWQ6ZnVuY3Rpb24odCl7cmV0dXJuIHIoInNlbGVjdGVkIix7c2Vnczp0fSl9LGNoYWluU3RhcnQ6ZnVuY3Rpb24odCl7cmV0dXJuIHIoImNoYWluX3N0YXJ0Iix7c2VnOnR9KX0sY2hhaW5SZW1vdmVIZWFkOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHIoImNoYWluX3JlbV9oZWFkIix7aW5kZXg6dCxwdDplfSl9LGNoYWluUmVtb3ZlVGFpbDpmdW5jdGlvbih0LGUpe3JldHVybiByKCJjaGFpbl9yZW1fdGFpbCIse2luZGV4OnQscHQ6ZX0pfSxjaGFpbk5ldzpmdW5jdGlvbih0LGUpe3JldHVybiByKCJjaGFpbl9uZXciLHtwdDE6dCxwdDI6ZX0pfSxjaGFpbk1hdGNoOmZ1bmN0aW9uKHQpe3JldHVybiByKCJjaGFpbl9tYXRjaCIse2luZGV4OnR9KX0sY2hhaW5DbG9zZTpmdW5jdGlvbih0KXtyZXR1cm4gcigiY2hhaW5fY2xvc2UiLHtpbmRleDp0fSl9LGNoYWluQWRkSGVhZDpmdW5jdGlvbih0LGUpe3JldHVybiByKCJjaGFpbl9hZGRfaGVhZCIse2luZGV4OnQscHQ6ZX0pfSxjaGFpbkFkZFRhaWw6ZnVuY3Rpb24odCxlKXtyZXR1cm4gcigiY2hhaW5fYWRkX3RhaWwiLHtpbmRleDp0LHB0OmV9KX0sY2hhaW5Db25uZWN0OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHIoImNoYWluX2NvbiIse2luZGV4MTp0LGluZGV4MjplfSl9LGNoYWluUmV2ZXJzZTpmdW5jdGlvbih0KXtyZXR1cm4gcigiY2hhaW5fcmV2Iix7aW5kZXg6dH0pfSxjaGFpbkpvaW46ZnVuY3Rpb24odCxlKXtyZXR1cm4gcigiY2hhaW5fam9pbiIse2luZGV4MTp0LGluZGV4MjplfSl9LGRvbmU6ZnVuY3Rpb24oKXtyZXR1cm4gcigiZG9uZSIpfX19LGlhPXFsLG9hPUdsLGxhPWVhLGFhPW5hLHNhPSExLHVhPVZsKCk7ZnVuY3Rpb24gY2EodCxlLG4pe3ZhciByPXRhLnNlZ21lbnRzKHQpLGk9dGEuc2VnbWVudHMoZSksbz1uKHRhLmNvbWJpbmUocixpKSk7cmV0dXJuIHRhLnBvbHlnb24obyl9dGE9e2J1aWxkTG9nOmZ1bmN0aW9uKHQpe3JldHVybiEwPT09dD9zYT1yYSgpOiExPT09dCYmKHNhPSExKSwhMSE9PXNhJiZzYS5saXN0fSxlcHNpbG9uOmZ1bmN0aW9uKHQpe3JldHVybiB1YS5lcHNpbG9uKHQpfSxzZWdtZW50czpmdW5jdGlvbih0KXt2YXIgZT1pYSghMCx1YSxzYSk7cmV0dXJuIHQucmVnaW9ucy5mb3JFYWNoKGUuYWRkUmVnaW9uKSx7c2VnbWVudHM6ZS5jYWxjdWxhdGUodC5pbnZlcnRlZCksaW52ZXJ0ZWQ6dC5pbnZlcnRlZH19LGNvbWJpbmU6ZnVuY3Rpb24odCxlKXtyZXR1cm57Y29tYmluZWQ6aWEoITEsdWEsc2EpLmNhbGN1bGF0ZSh0LnNlZ21lbnRzLHQuaW52ZXJ0ZWQsZS5zZWdtZW50cyxlLmludmVydGVkKSxpbnZlcnRlZDE6dC5pbnZlcnRlZCxpbnZlcnRlZDI6ZS5pbnZlcnRlZH19LHNlbGVjdFVuaW9uOmZ1bmN0aW9uKHQpe3JldHVybntzZWdtZW50czpsYS51bmlvbih0LmNvbWJpbmVkLHNhKSxpbnZlcnRlZDp0LmludmVydGVkMXx8dC5pbnZlcnRlZDJ9fSxzZWxlY3RJbnRlcnNlY3Q6ZnVuY3Rpb24odCl7cmV0dXJue3NlZ21lbnRzOmxhLmludGVyc2VjdCh0LmNvbWJpbmVkLHNhKSxpbnZlcnRlZDp0LmludmVydGVkMSYmdC5pbnZlcnRlZDJ9fSxzZWxlY3REaWZmZXJlbmNlOmZ1bmN0aW9uKHQpe3JldHVybntzZWdtZW50czpsYS5kaWZmZXJlbmNlKHQuY29tYmluZWQsc2EpLGludmVydGVkOnQuaW52ZXJ0ZWQxJiYhdC5pbnZlcnRlZDJ9fSxzZWxlY3REaWZmZXJlbmNlUmV2OmZ1bmN0aW9uKHQpe3JldHVybntzZWdtZW50czpsYS5kaWZmZXJlbmNlUmV2KHQuY29tYmluZWQsc2EpLGludmVydGVkOiF0LmludmVydGVkMSYmdC5pbnZlcnRlZDJ9fSxzZWxlY3RYb3I6ZnVuY3Rpb24odCl7cmV0dXJue3NlZ21lbnRzOmxhLnhvcih0LmNvbWJpbmVkLHNhKSxpbnZlcnRlZDp0LmludmVydGVkMSE9PXQuaW52ZXJ0ZWQyfX0scG9seWdvbjpmdW5jdGlvbih0KXtyZXR1cm57cmVnaW9uczpvYSh0LnNlZ21lbnRzLHVhLHNhKSxpbnZlcnRlZDp0LmludmVydGVkfX0scG9seWdvbkZyb21HZW9KU09OOmZ1bmN0aW9uKHQpe3JldHVybiBhYS50b1BvbHlnb24odGEsdCl9LHBvbHlnb25Ub0dlb0pTT046ZnVuY3Rpb24odCl7cmV0dXJuIGFhLmZyb21Qb2x5Z29uKHRhLHVhLHQpfSx1bmlvbjpmdW5jdGlvbih0LGUpe3JldHVybiBjYSh0LGUsdGEuc2VsZWN0VW5pb24pfSxpbnRlcnNlY3Q6ZnVuY3Rpb24odCxlKXtyZXR1cm4gY2EodCxlLHRhLnNlbGVjdEludGVyc2VjdCl9LGRpZmZlcmVuY2U6ZnVuY3Rpb24odCxlKXtyZXR1cm4gY2EodCxlLHRhLnNlbGVjdERpZmZlcmVuY2UpfSxkaWZmZXJlbmNlUmV2OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGNhKHQsZSx0YS5zZWxlY3REaWZmZXJlbmNlUmV2KX0seG9yOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGNhKHQsZSx0YS5zZWxlY3RYb3IpfX0sIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJih3aW5kb3cuUG9seUJvb2w9dGEpO3ZhciBmYT10YTtjb25zdCBoYT0xMzQyMTc3MjksZ2E9MzMzMDY2OTA3Mzg3NTQ3MDZlLTMyO2Z1bmN0aW9uIHZhKHQsZSxuLHIsaSl7bGV0IG8sbCxhLHMsdT1lWzBdLGM9clswXSxmPTAsaD0wO2M+dT09Yz4tdT8obz11LHU9ZVsrK2ZdKToobz1jLGM9clsrK2hdKTtsZXQgZz0wO2lmKGY8dCYmaDxuKWZvcihjPnU9PWM+LXU/KGw9dStvLGE9by0obC11KSx1PWVbKytmXSk6KGw9YytvLGE9by0obC1jKSxjPXJbKytoXSksbz1sLDAhPT1hJiYoaVtnKytdPWEpO2Y8dCYmaDxuOyljPnU9PWM+LXU/KGw9byt1LHM9bC1vLGE9by0obC1zKSsodS1zKSx1PWVbKytmXSk6KGw9bytjLHM9bC1vLGE9by0obC1zKSsoYy1zKSxjPXJbKytoXSksbz1sLDAhPT1hJiYoaVtnKytdPWEpO2Zvcig7Zjx0OylsPW8rdSxzPWwtbyxhPW8tKGwtcykrKHUtcyksdT1lWysrZl0sbz1sLDAhPT1hJiYoaVtnKytdPWEpO2Zvcig7aDxuOylsPW8rYyxzPWwtbyxhPW8tKGwtcykrKGMtcyksYz1yWysraF0sbz1sLDAhPT1hJiYoaVtnKytdPWEpO3JldHVybiAwPT09byYmMCE9PWd8fChpW2crK109byksZ31mdW5jdGlvbiBkYSh0KXtyZXR1cm4gbmV3IEZsb2F0NjRBcnJheSh0KX1jb25zdCBwYT0yMjIwNDQ2MDQ5MjUwMzE0NmUtMzIseWE9MTEwOTMzNTY0Nzk2NzA0ODdlLTQ3LG1hPWRhKDQpLF9hPWRhKDgpLGJhPWRhKDEyKSx4YT1kYSgxNiksd2E9ZGEoNCk7ZnVuY3Rpb24gamEodCxlLG4scixpLG8pe2NvbnN0IGw9KGUtbykqKG4taSksYT0odC1pKSooci1vKSxzPWwtYTtpZigwPT09bHx8MD09PWF8fGw+MCE9YT4wKXJldHVybiBzO2NvbnN0IHU9TWF0aC5hYnMobCthKTtyZXR1cm4gTWF0aC5hYnMocyk+PTMzMzA2NjkwNzM4NzU0NzE2ZS0zMip1P3M6LWZ1bmN0aW9uKHQsZSxuLHIsaSxvLGwpe2xldCBhLHMsdSxjLGYsaCxnLHYsZCxwLHksbSxfLGIseCx3LGosUztjb25zdCBBPXQtaSxPPW4taSxNPWUtbyxrPXItbztiPUEqayxoPWhhKkEsZz1oLShoLUEpLHY9QS1nLGg9aGEqayxkPWgtKGgtaykscD1rLWQseD12KnAtKGItZypkLXYqZC1nKnApLHc9TSpPLGg9aGEqTSxnPWgtKGgtTSksdj1NLWcsaD1oYSpPLGQ9aC0oaC1PKSxwPU8tZCxqPXYqcC0ody1nKmQtdipkLWcqcCkseT14LWosZj14LXksbWFbMF09eC0oeStmKSsoZi1qKSxtPWIreSxmPW0tYixfPWItKG0tZikrKHktZikseT1fLXcsZj1fLXksbWFbMV09Xy0oeStmKSsoZi13KSxTPW0reSxmPVMtbSxtYVsyXT1tLShTLWYpKyh5LWYpLG1hWzNdPVM7bGV0IFA9ZnVuY3Rpb24odCxlKXtsZXQgbj1lWzBdO2ZvcihsZXQgcj0xO3I8dDtyKyspbis9ZVtyXTtyZXR1cm4gbn0oNCxtYSksRj1wYSpsO2lmKFA+PUZ8fC1QPj1GKXJldHVybiBQO2lmKGY9dC1BLGE9dC0oQStmKSsoZi1pKSxmPW4tTyx1PW4tKE8rZikrKGYtaSksZj1lLU0scz1lLShNK2YpKyhmLW8pLGY9ci1rLGM9ci0oaytmKSsoZi1vKSwwPT09YSYmMD09PXMmJjA9PT11JiYwPT09YylyZXR1cm4gUDtpZihGPXlhKmwrZ2EqTWF0aC5hYnMoUCksUCs9QSpjK2sqYS0oTSp1K08qcyksUD49Rnx8LVA+PUYpcmV0dXJuIFA7Yj1hKmssaD1oYSphLGc9aC0oaC1hKSx2PWEtZyxoPWhhKmssZD1oLShoLWspLHA9ay1kLHg9dipwLShiLWcqZC12KmQtZypwKSx3PXMqTyxoPWhhKnMsZz1oLShoLXMpLHY9cy1nLGg9aGEqTyxkPWgtKGgtTykscD1PLWQsaj12KnAtKHctZypkLXYqZC1nKnApLHk9eC1qLGY9eC15LHdhWzBdPXgtKHkrZikrKGYtaiksbT1iK3ksZj1tLWIsXz1iLShtLWYpKyh5LWYpLHk9Xy13LGY9Xy15LHdhWzFdPV8tKHkrZikrKGYtdyksUz1tK3ksZj1TLW0sd2FbMl09bS0oUy1mKSsoeS1mKSx3YVszXT1TO2NvbnN0IFQ9dmEoNCxtYSw0LHdhLF9hKTtiPUEqYyxoPWhhKkEsZz1oLShoLUEpLHY9QS1nLGg9aGEqYyxkPWgtKGgtYykscD1jLWQseD12KnAtKGItZypkLXYqZC1nKnApLHc9TSp1LGg9aGEqTSxnPWgtKGgtTSksdj1NLWcsaD1oYSp1LGQ9aC0oaC11KSxwPXUtZCxqPXYqcC0ody1nKmQtdipkLWcqcCkseT14LWosZj14LXksd2FbMF09eC0oeStmKSsoZi1qKSxtPWIreSxmPW0tYixfPWItKG0tZikrKHktZikseT1fLXcsZj1fLXksd2FbMV09Xy0oeStmKSsoZi13KSxTPW0reSxmPVMtbSx3YVsyXT1tLShTLWYpKyh5LWYpLHdhWzNdPVM7Y29uc3Qgej12YShULF9hLDQsd2EsYmEpO2I9YSpjLGg9aGEqYSxnPWgtKGgtYSksdj1hLWcsaD1oYSpjLGQ9aC0oaC1jKSxwPWMtZCx4PXYqcC0oYi1nKmQtdipkLWcqcCksdz1zKnUsaD1oYSpzLGc9aC0oaC1zKSx2PXMtZyxoPWhhKnUsZD1oLShoLXUpLHA9dS1kLGo9dipwLSh3LWcqZC12KmQtZypwKSx5PXgtaixmPXgteSx3YVswXT14LSh5K2YpKyhmLWopLG09Yit5LGY9bS1iLF89Yi0obS1mKSsoeS1mKSx5PV8tdyxmPV8teSx3YVsxXT1fLSh5K2YpKyhmLXcpLFM9bSt5LGY9Uy1tLHdhWzJdPW0tKFMtZikrKHktZiksd2FbM109Uztjb25zdCBJPXZhKHosYmEsNCx3YSx4YSk7cmV0dXJuIHhhW0ktMV19KHQsZSxuLHIsaSxvLHUpfWNvbnN0IFNhPU1hdGgucG93KDIsLTUyKSxBYT1uZXcgVWludDMyQXJyYXkoNTEyKTtjbGFzcyBPYXtzdGF0aWMgZnJvbSh0LGU9emEsbj1JYSl7Y29uc3Qgcj10Lmxlbmd0aCxpPW5ldyBGbG9hdDY0QXJyYXkoMipyKTtmb3IobGV0IG89MDtvPHI7bysrKXtjb25zdCByPXRbb107aVsyKm9dPWUociksaVsyKm8rMV09bihyKX1yZXR1cm4gbmV3IE9hKGkpfWNvbnN0cnVjdG9yKHQpe2NvbnN0IGU9dC5sZW5ndGg+PjE7aWYoZT4wJiYibnVtYmVyIiE9dHlwZW9mIHRbMF0pdGhyb3cgbmV3IEVycm9yKCJFeHBlY3RlZCBjb29yZHMgdG8gY29udGFpbiBudW1iZXJzLiIpO3RoaXMuY29vcmRzPXQ7Y29uc3Qgbj1NYXRoLm1heCgyKmUtNSwwKTt0aGlzLl90cmlhbmdsZXM9bmV3IFVpbnQzMkFycmF5KDMqbiksdGhpcy5faGFsZmVkZ2VzPW5ldyBJbnQzMkFycmF5KDMqbiksdGhpcy5faGFzaFNpemU9TWF0aC5jZWlsKE1hdGguc3FydChlKSksdGhpcy5faHVsbFByZXY9bmV3IFVpbnQzMkFycmF5KGUpLHRoaXMuX2h1bGxOZXh0PW5ldyBVaW50MzJBcnJheShlKSx0aGlzLl9odWxsVHJpPW5ldyBVaW50MzJBcnJheShlKSx0aGlzLl9odWxsSGFzaD1uZXcgSW50MzJBcnJheSh0aGlzLl9oYXNoU2l6ZSkuZmlsbCgtMSksdGhpcy5faWRzPW5ldyBVaW50MzJBcnJheShlKSx0aGlzLl9kaXN0cz1uZXcgRmxvYXQ2NEFycmF5KGUpLHRoaXMudXBkYXRlKCl9dXBkYXRlKCl7Y29uc3R7Y29vcmRzOnQsX2h1bGxQcmV2OmUsX2h1bGxOZXh0Om4sX2h1bGxUcmk6cixfaHVsbEhhc2g6aX09dGhpcyxvPXQubGVuZ3RoPj4xO2xldCBsPTEvMCxhPTEvMCxzPS0xLzAsdT0tMS8wO2ZvcihsZXQgZT0wO2U8bztlKyspe2NvbnN0IG49dFsyKmVdLHI9dFsyKmUrMV07bjxsJiYobD1uKSxyPGEmJihhPXIpLG4+cyYmKHM9bikscj51JiYodT1yKSx0aGlzLl9pZHNbZV09ZX1jb25zdCBjPShsK3MpLzIsZj0oYSt1KS8yO2xldCBoLGcsdixkPTEvMDtmb3IobGV0IGU9MDtlPG87ZSsrKXtjb25zdCBuPU1hKGMsZix0WzIqZV0sdFsyKmUrMV0pO248ZCYmKGg9ZSxkPW4pfWNvbnN0IHA9dFsyKmhdLHk9dFsyKmgrMV07ZD0xLzA7Zm9yKGxldCBlPTA7ZTxvO2UrKyl7aWYoZT09PWgpY29udGludWU7Y29uc3Qgbj1NYShwLHksdFsyKmVdLHRbMiplKzFdKTtuPGQmJm4+MCYmKGc9ZSxkPW4pfWxldCBtPXRbMipnXSxfPXRbMipnKzFdLGI9MS8wO2ZvcihsZXQgZT0wO2U8bztlKyspe2lmKGU9PT1ofHxlPT09Zyljb250aW51ZTtjb25zdCBuPVBhKHAseSxtLF8sdFsyKmVdLHRbMiplKzFdKTtuPGImJih2PWUsYj1uKX1sZXQgeD10WzIqdl0sdz10WzIqdisxXTtpZihiPT09MS8wKXtmb3IobGV0IGU9MDtlPG87ZSsrKXRoaXMuX2Rpc3RzW2VdPXRbMiplXS10WzBdfHx0WzIqZSsxXS10WzFdO0ZhKHRoaXMuX2lkcyx0aGlzLl9kaXN0cywwLG8tMSk7Y29uc3QgZT1uZXcgVWludDMyQXJyYXkobyk7bGV0IG49MDtmb3IobGV0IHQ9MCxyPS0xLzA7dDxvO3QrKyl7Y29uc3QgaT10aGlzLl9pZHNbdF07dGhpcy5fZGlzdHNbaV0+ciYmKGVbbisrXT1pLHI9dGhpcy5fZGlzdHNbaV0pfXJldHVybiB0aGlzLmh1bGw9ZS5zdWJhcnJheSgwLG4pLHRoaXMudHJpYW5nbGVzPW5ldyBVaW50MzJBcnJheSgwKSx2b2lkKHRoaXMuaGFsZmVkZ2VzPW5ldyBVaW50MzJBcnJheSgwKSl9aWYoamEocCx5LG0sXyx4LHcpPDApe2NvbnN0IHQ9ZyxlPW0sbj1fO2c9dixtPXgsXz13LHY9dCx4PWUsdz1ufWNvbnN0IGo9ZnVuY3Rpb24odCxlLG4scixpLG8pe2NvbnN0IGw9bi10LGE9ci1lLHM9aS10LHU9by1lLGM9bCpsK2EqYSxmPXMqcyt1KnUsaD0uNS8obCp1LWEqcyk7cmV0dXJue3g6dCsodSpjLWEqZikqaCx5OmUrKGwqZi1zKmMpKmh9fShwLHksbSxfLHgsdyk7dGhpcy5fY3g9ai54LHRoaXMuX2N5PWoueTtmb3IobGV0IGU9MDtlPG87ZSsrKXRoaXMuX2Rpc3RzW2VdPU1hKHRbMiplXSx0WzIqZSsxXSxqLngsai55KTtGYSh0aGlzLl9pZHMsdGhpcy5fZGlzdHMsMCxvLTEpLHRoaXMuX2h1bGxTdGFydD1oO2xldCBTPTM7bltoXT1lW3ZdPWcsbltnXT1lW2hdPXYsblt2XT1lW2ddPWgscltoXT0wLHJbZ109MSxyW3ZdPTIsaS5maWxsKC0xKSxpW3RoaXMuX2hhc2hLZXkocCx5KV09aCxpW3RoaXMuX2hhc2hLZXkobSxfKV09ZyxpW3RoaXMuX2hhc2hLZXkoeCx3KV09dix0aGlzLnRyaWFuZ2xlc0xlbj0wLHRoaXMuX2FkZFRyaWFuZ2xlKGgsZyx2LC0xLC0xLC0xKTtmb3IobGV0IG8sbCxhPTA7YTx0aGlzLl9pZHMubGVuZ3RoO2ErKyl7Y29uc3Qgcz10aGlzLl9pZHNbYV0sdT10WzIqc10sYz10WzIqcysxXTtpZihhPjAmJk1hdGguYWJzKHUtbyk8PVNhJiZNYXRoLmFicyhjLWwpPD1TYSljb250aW51ZTtpZihvPXUsbD1jLHM9PT1ofHxzPT09Z3x8cz09PXYpY29udGludWU7bGV0IGY9MDtmb3IobGV0IHQ9MCxlPXRoaXMuX2hhc2hLZXkodSxjKTt0PHRoaXMuX2hhc2hTaXplJiYoZj1pWyhlK3QpJXRoaXMuX2hhc2hTaXplXSwtMT09PWZ8fGY9PT1uW2ZdKTt0KyspO2Y9ZVtmXTtsZXQgZCxwPWY7Zm9yKDtkPW5bcF0samEodSxjLHRbMipwXSx0WzIqcCsxXSx0WzIqZF0sdFsyKmQrMV0pPj0wOylpZihwPWQscD09PWYpe3A9LTE7YnJlYWt9aWYoLTE9PT1wKWNvbnRpbnVlO2xldCB5PXRoaXMuX2FkZFRyaWFuZ2xlKHAscyxuW3BdLC0xLC0xLHJbcF0pO3Jbc109dGhpcy5fbGVnYWxpemUoeSsyKSxyW3BdPXksUysrO2xldCBtPW5bcF07Zm9yKDtkPW5bbV0samEodSxjLHRbMiptXSx0WzIqbSsxXSx0WzIqZF0sdFsyKmQrMV0pPDA7KXk9dGhpcy5fYWRkVHJpYW5nbGUobSxzLGQscltzXSwtMSxyW21dKSxyW3NdPXRoaXMuX2xlZ2FsaXplKHkrMiksblttXT1tLFMtLSxtPWQ7aWYocD09PWYpZm9yKDtkPWVbcF0samEodSxjLHRbMipkXSx0WzIqZCsxXSx0WzIqcF0sdFsyKnArMV0pPDA7KXk9dGhpcy5fYWRkVHJpYW5nbGUoZCxzLHAsLTEscltwXSxyW2RdKSx0aGlzLl9sZWdhbGl6ZSh5KzIpLHJbZF09eSxuW3BdPXAsUy0tLHA9ZDt0aGlzLl9odWxsU3RhcnQ9ZVtzXT1wLG5bcF09ZVttXT1zLG5bc109bSxpW3RoaXMuX2hhc2hLZXkodSxjKV09cyxpW3RoaXMuX2hhc2hLZXkodFsyKnBdLHRbMipwKzFdKV09cH10aGlzLmh1bGw9bmV3IFVpbnQzMkFycmF5KFMpO2ZvcihsZXQgdD0wLGU9dGhpcy5faHVsbFN0YXJ0O3Q8Uzt0KyspdGhpcy5odWxsW3RdPWUsZT1uW2VdO3RoaXMudHJpYW5nbGVzPXRoaXMuX3RyaWFuZ2xlcy5zdWJhcnJheSgwLHRoaXMudHJpYW5nbGVzTGVuKSx0aGlzLmhhbGZlZGdlcz10aGlzLl9oYWxmZWRnZXMuc3ViYXJyYXkoMCx0aGlzLnRyaWFuZ2xlc0xlbil9X2hhc2hLZXkodCxlKXtyZXR1cm4gTWF0aC5mbG9vcihmdW5jdGlvbih0LGUpe2NvbnN0IG49dC8oTWF0aC5hYnModCkrTWF0aC5hYnMoZSkpO3JldHVybihlPjA/My1uOjErbikvNH0odC10aGlzLl9jeCxlLXRoaXMuX2N5KSp0aGlzLl9oYXNoU2l6ZSkldGhpcy5faGFzaFNpemV9X2xlZ2FsaXplKHQpe2NvbnN0e190cmlhbmdsZXM6ZSxfaGFsZmVkZ2VzOm4sY29vcmRzOnJ9PXRoaXM7bGV0IGk9MCxvPTA7Zm9yKDs7KXtjb25zdCBsPW5bdF0sYT10LXQlMztpZihvPWErKHQrMiklMywtMT09PWwpe2lmKDA9PT1pKWJyZWFrO3Q9QWFbLS1pXTtjb250aW51ZX1jb25zdCBzPWwtbCUzLHU9YSsodCsxKSUzLGM9cysobCsyKSUzLGY9ZVtvXSxoPWVbdF0sZz1lW3VdLHY9ZVtjXTtpZihrYShyWzIqZl0sclsyKmYrMV0sclsyKmhdLHJbMipoKzFdLHJbMipnXSxyWzIqZysxXSxyWzIqdl0sclsyKnYrMV0pKXtlW3RdPXYsZVtsXT1mO2NvbnN0IHI9bltjXTtpZigtMT09PXIpe2xldCBlPXRoaXMuX2h1bGxTdGFydDtkb3tpZih0aGlzLl9odWxsVHJpW2VdPT09Yyl7dGhpcy5faHVsbFRyaVtlXT10O2JyZWFrfWU9dGhpcy5faHVsbFByZXZbZV19d2hpbGUoZSE9PXRoaXMuX2h1bGxTdGFydCl9dGhpcy5fbGluayh0LHIpLHRoaXMuX2xpbmsobCxuW29dKSx0aGlzLl9saW5rKG8sYyk7Y29uc3QgYT1zKyhsKzEpJTM7aTxBYS5sZW5ndGgmJihBYVtpKytdPWEpfWVsc2V7aWYoMD09PWkpYnJlYWs7dD1BYVstLWldfX1yZXR1cm4gb31fbGluayh0LGUpe3RoaXMuX2hhbGZlZGdlc1t0XT1lLC0xIT09ZSYmKHRoaXMuX2hhbGZlZGdlc1tlXT10KX1fYWRkVHJpYW5nbGUodCxlLG4scixpLG8pe2NvbnN0IGw9dGhpcy50cmlhbmdsZXNMZW47cmV0dXJuIHRoaXMuX3RyaWFuZ2xlc1tsXT10LHRoaXMuX3RyaWFuZ2xlc1tsKzFdPWUsdGhpcy5fdHJpYW5nbGVzW2wrMl09bix0aGlzLl9saW5rKGwsciksdGhpcy5fbGluayhsKzEsaSksdGhpcy5fbGluayhsKzIsbyksdGhpcy50cmlhbmdsZXNMZW4rPTMsbH19ZnVuY3Rpb24gTWEodCxlLG4scil7Y29uc3QgaT10LW4sbz1lLXI7cmV0dXJuIGkqaStvKm99ZnVuY3Rpb24ga2EodCxlLG4scixpLG8sbCxhKXtjb25zdCBzPXQtbCx1PWUtYSxjPW4tbCxmPXItYSxoPWktbCxnPW8tYSx2PWMqYytmKmYsZD1oKmgrZypnO3JldHVybiBzKihmKmQtdipnKS11KihjKmQtdipoKSsocypzK3UqdSkqKGMqZy1mKmgpPDB9ZnVuY3Rpb24gUGEodCxlLG4scixpLG8pe2NvbnN0IGw9bi10LGE9ci1lLHM9aS10LHU9by1lLGM9bCpsK2EqYSxmPXMqcyt1KnUsaD0uNS8obCp1LWEqcyksZz0odSpjLWEqZikqaCx2PShsKmYtcypjKSpoO3JldHVybiBnKmcrdip2fWZ1bmN0aW9uIEZhKHQsZSxuLHIpe2lmKHItbjw9MjApZm9yKGxldCBpPW4rMTtpPD1yO2krKyl7Y29uc3Qgcj10W2ldLG89ZVtyXTtsZXQgbD1pLTE7Zm9yKDtsPj1uJiZlW3RbbF1dPm87KXRbbCsxXT10W2wtLV07dFtsKzFdPXJ9ZWxzZXtsZXQgaT1uKzEsbz1yO1RhKHQsbityPj4xLGkpLGVbdFtuXV0+ZVt0W3JdXSYmVGEodCxuLHIpLGVbdFtpXV0+ZVt0W3JdXSYmVGEodCxpLHIpLGVbdFtuXV0+ZVt0W2ldXSYmVGEodCxuLGkpO2NvbnN0IGw9dFtpXSxhPWVbbF07Zm9yKDs7KXtkb3tpKyt9d2hpbGUoZVt0W2ldXTxhKTtkb3tvLS19d2hpbGUoZVt0W29dXT5hKTtpZihvPGkpYnJlYWs7VGEodCxpLG8pfXRbbisxXT10W29dLHRbb109bCxyLWkrMT49by1uPyhGYSh0LGUsaSxyKSxGYSh0LGUsbixvLTEpKTooRmEodCxlLG4sby0xKSxGYSh0LGUsaSxyKSl9fWZ1bmN0aW9uIFRhKHQsZSxuKXtjb25zdCByPXRbZV07dFtlXT10W25dLHRbbl09cn1mdW5jdGlvbiB6YSh0KXtyZXR1cm4gdFswXX1mdW5jdGlvbiBJYSh0KXtyZXR1cm4gdFsxXX1jb25zdCAkYT0xZS02O2NsYXNzIEVhe2NvbnN0cnVjdG9yKCl7dGhpcy5feDA9dGhpcy5feTA9dGhpcy5feDE9dGhpcy5feTE9bnVsbCx0aGlzLl89IiJ9bW92ZVRvKHQsZSl7dGhpcy5fKz1gTSR7dGhpcy5feDA9dGhpcy5feDE9K3R9LCR7dGhpcy5feTA9dGhpcy5feTE9K2V9YH1jbG9zZVBhdGgoKXtudWxsIT09dGhpcy5feDEmJih0aGlzLl94MT10aGlzLl94MCx0aGlzLl95MT10aGlzLl95MCx0aGlzLl8rPSJaIil9bGluZVRvKHQsZSl7dGhpcy5fKz1gTCR7dGhpcy5feDE9K3R9LCR7dGhpcy5feTE9K2V9YH1hcmModCxlLG4pe2NvbnN0IHI9KHQ9K3QpKyhuPStuKSxpPWU9K2U7aWYobjwwKXRocm93IG5ldyBFcnJvcigibmVnYXRpdmUgcmFkaXVzIik7bnVsbD09PXRoaXMuX3gxP3RoaXMuXys9YE0ke3J9LCR7aX1gOihNYXRoLmFicyh0aGlzLl94MS1yKT4kYXx8TWF0aC5hYnModGhpcy5feTEtaSk+JGEpJiYodGhpcy5fKz0iTCIrcisiLCIraSksbiYmKHRoaXMuXys9YEEke259LCR7bn0sMCwxLDEsJHt0LW59LCR7ZX1BJHtufSwke259LDAsMSwxLCR7dGhpcy5feDE9cn0sJHt0aGlzLl95MT1pfWApfXJlY3QodCxlLG4scil7dGhpcy5fKz1gTSR7dGhpcy5feDA9dGhpcy5feDE9K3R9LCR7dGhpcy5feTA9dGhpcy5feTE9K2V9aCR7K259diR7K3J9aCR7LW59WmB9dmFsdWUoKXtyZXR1cm4gdGhpcy5ffHxudWxsfX1jbGFzcyBOYXtjb25zdHJ1Y3Rvcigpe3RoaXMuXz1bXX1tb3ZlVG8odCxlKXt0aGlzLl8ucHVzaChbdCxlXSl9Y2xvc2VQYXRoKCl7dGhpcy5fLnB1c2godGhpcy5fWzBdLnNsaWNlKCkpfWxpbmVUbyh0LGUpe3RoaXMuXy5wdXNoKFt0LGVdKX12YWx1ZSgpe3JldHVybiB0aGlzLl8ubGVuZ3RoP3RoaXMuXzpudWxsfX1jbGFzcyBSYXtjb25zdHJ1Y3Rvcih0LFtlLG4scixpXT1bMCwwLDk2MCw1MDBdKXtpZighKChyPStyKT49KGU9K2UpJiYoaT0raSk+PShuPStuKSkpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGJvdW5kcyIpO3RoaXMuZGVsYXVuYXk9dCx0aGlzLl9jaXJjdW1jZW50ZXJzPW5ldyBGbG9hdDY0QXJyYXkoMip0LnBvaW50cy5sZW5ndGgpLHRoaXMudmVjdG9ycz1uZXcgRmxvYXQ2NEFycmF5KDIqdC5wb2ludHMubGVuZ3RoKSx0aGlzLnhtYXg9cix0aGlzLnhtaW49ZSx0aGlzLnltYXg9aSx0aGlzLnltaW49bix0aGlzLl9pbml0KCl9dXBkYXRlKCl7cmV0dXJuIHRoaXMuZGVsYXVuYXkudXBkYXRlKCksdGhpcy5faW5pdCgpLHRoaXN9X2luaXQoKXtjb25zdHtkZWxhdW5heTp7cG9pbnRzOnQsaHVsbDplLHRyaWFuZ2xlczpufSx2ZWN0b3JzOnJ9PXRoaXMsaT10aGlzLmNpcmN1bWNlbnRlcnM9dGhpcy5fY2lyY3VtY2VudGVycy5zdWJhcnJheSgwLG4ubGVuZ3RoLzMqMik7Zm9yKGxldCBlLHIsbz0wLGw9MCxhPW4ubGVuZ3RoO288YTtvKz0zLGwrPTIpe2NvbnN0IGE9MipuW29dLHM9MipuW28rMV0sdT0yKm5bbysyXSxjPXRbYV0sZj10W2ErMV0saD10W3NdLGc9dFtzKzFdLHY9dFt1XSxkPXRbdSsxXSxwPWgtYyx5PWctZixtPXYtYyxfPWQtZixiPTIqKHAqXy15Km0pO2lmKE1hdGguYWJzKGIpPDFlLTkpe2xldCBpPTFlOTtjb25zdCBvPTIqblswXTtpKj1NYXRoLnNpZ24oKHRbb10tYykqXy0odFtvKzFdLWYpKm0pLGU9KGMrdikvMi1pKl8scj0oZitkKS8yK2kqbX1lbHNle2NvbnN0IHQ9MS9iLG49cCpwK3kqeSxpPW0qbStfKl87ZT1jKyhfKm4teSppKSp0LHI9ZisocCppLW0qbikqdH1pW2xdPWUsaVtsKzFdPXJ9bGV0IG8sbCxhLHM9ZVtlLmxlbmd0aC0xXSx1PTQqcyxjPXRbMipzXSxmPXRbMipzKzFdO3IuZmlsbCgwKTtmb3IobGV0IG49MDtuPGUubGVuZ3RoOysrbilzPWVbbl0sbz11LGw9YyxhPWYsdT00KnMsYz10WzIqc10sZj10WzIqcysxXSxyW28rMl09clt1XT1hLWYscltvKzNdPXJbdSsxXT1jLWx9cmVuZGVyKHQpe2NvbnN0IGU9bnVsbD09dD90PW5ldyBFYTp2b2lkIDAse2RlbGF1bmF5OntoYWxmZWRnZXM6bixpbmVkZ2VzOnIsaHVsbDppfSxjaXJjdW1jZW50ZXJzOm8sdmVjdG9yczpsfT10aGlzO2lmKGkubGVuZ3RoPD0xKXJldHVybiBudWxsO2ZvcihsZXQgZT0wLHI9bi5sZW5ndGg7ZTxyOysrZSl7Y29uc3Qgcj1uW2VdO2lmKHI8ZSljb250aW51ZTtjb25zdCBpPTIqTWF0aC5mbG9vcihlLzMpLGw9MipNYXRoLmZsb29yKHIvMyksYT1vW2ldLHM9b1tpKzFdLHU9b1tsXSxjPW9bbCsxXTt0aGlzLl9yZW5kZXJTZWdtZW50KGEscyx1LGMsdCl9bGV0IGEscz1pW2kubGVuZ3RoLTFdO2ZvcihsZXQgZT0wO2U8aS5sZW5ndGg7KytlKXthPXMscz1pW2VdO2NvbnN0IG49MipNYXRoLmZsb29yKHJbc10vMyksdT1vW25dLGM9b1tuKzFdLGY9NCphLGg9dGhpcy5fcHJvamVjdCh1LGMsbFtmKzJdLGxbZiszXSk7aCYmdGhpcy5fcmVuZGVyU2VnbWVudCh1LGMsaFswXSxoWzFdLHQpfXJldHVybiBlJiZlLnZhbHVlKCl9cmVuZGVyQm91bmRzKHQpe2NvbnN0IGU9bnVsbD09dD90PW5ldyBFYTp2b2lkIDA7cmV0dXJuIHQucmVjdCh0aGlzLnhtaW4sdGhpcy55bWluLHRoaXMueG1heC10aGlzLnhtaW4sdGhpcy55bWF4LXRoaXMueW1pbiksZSYmZS52YWx1ZSgpfXJlbmRlckNlbGwodCxlKXtjb25zdCBuPW51bGw9PWU/ZT1uZXcgRWE6dm9pZCAwLHI9dGhpcy5fY2xpcCh0KTtpZihudWxsPT09cnx8IXIubGVuZ3RoKXJldHVybjtlLm1vdmVUbyhyWzBdLHJbMV0pO2xldCBpPXIubGVuZ3RoO2Zvcig7clswXT09PXJbaS0yXSYmclsxXT09PXJbaS0xXSYmaT4xOylpLT0yO2ZvcihsZXQgdD0yO3Q8aTt0Kz0yKXJbdF09PT1yW3QtMl0mJnJbdCsxXT09PXJbdC0xXXx8ZS5saW5lVG8oclt0XSxyW3QrMV0pO3JldHVybiBlLmNsb3NlUGF0aCgpLG4mJm4udmFsdWUoKX0qY2VsbFBvbHlnb25zKCl7Y29uc3R7ZGVsYXVuYXk6e3BvaW50czp0fX09dGhpcztmb3IobGV0IGU9MCxuPXQubGVuZ3RoLzI7ZTxuOysrZSl7Y29uc3QgdD10aGlzLmNlbGxQb2x5Z29uKGUpO3QmJih0LmluZGV4PWUseWllbGQgdCl9fWNlbGxQb2x5Z29uKHQpe2NvbnN0IGU9bmV3IE5hO3JldHVybiB0aGlzLnJlbmRlckNlbGwodCxlKSxlLnZhbHVlKCl9X3JlbmRlclNlZ21lbnQodCxlLG4scixpKXtsZXQgbztjb25zdCBsPXRoaXMuX3JlZ2lvbmNvZGUodCxlKSxhPXRoaXMuX3JlZ2lvbmNvZGUobixyKTswPT09bCYmMD09PWE/KGkubW92ZVRvKHQsZSksaS5saW5lVG8obixyKSk6KG89dGhpcy5fY2xpcFNlZ21lbnQodCxlLG4scixsLGEpKSYmKGkubW92ZVRvKG9bMF0sb1sxXSksaS5saW5lVG8ob1syXSxvWzNdKSl9Y29udGFpbnModCxlLG4pe3JldHVybihlPStlKT09ZSYmKG49K24pPT1uJiZ0aGlzLmRlbGF1bmF5Ll9zdGVwKHQsZSxuKT09PXR9Km5laWdoYm9ycyh0KXtjb25zdCBlPXRoaXMuX2NsaXAodCk7aWYoZSlmb3IoY29uc3QgbiBvZiB0aGlzLmRlbGF1bmF5Lm5laWdoYm9ycyh0KSl7Y29uc3QgdD10aGlzLl9jbGlwKG4pO2lmKHQpdDpmb3IobGV0IHI9MCxpPWUubGVuZ3RoO3I8aTtyKz0yKWZvcihsZXQgbz0wLGw9dC5sZW5ndGg7bzxsO28rPTIpaWYoZVtyXT09PXRbb10mJmVbcisxXT09PXRbbysxXSYmZVsocisyKSVpXT09PXRbKG8rbC0yKSVsXSYmZVsociszKSVpXT09PXRbKG8rbC0xKSVsXSl7eWllbGQgbjticmVhayB0fX19X2NlbGwodCl7Y29uc3R7Y2lyY3VtY2VudGVyczplLGRlbGF1bmF5OntpbmVkZ2VzOm4saGFsZmVkZ2VzOnIsdHJpYW5nbGVzOml9fT10aGlzLG89blt0XTtpZigtMT09PW8pcmV0dXJuIG51bGw7Y29uc3QgbD1bXTtsZXQgYT1vO2Rve2NvbnN0IG49TWF0aC5mbG9vcihhLzMpO2lmKGwucHVzaChlWzIqbl0sZVsyKm4rMV0pLGE9YSUzPT0yP2EtMjphKzEsaVthXSE9PXQpYnJlYWs7YT1yW2FdfXdoaWxlKGEhPT1vJiYtMSE9PWEpO3JldHVybiBsfV9jbGlwKHQpe2lmKDA9PT10JiYxPT09dGhpcy5kZWxhdW5heS5odWxsLmxlbmd0aClyZXR1cm5bdGhpcy54bWF4LHRoaXMueW1pbix0aGlzLnhtYXgsdGhpcy55bWF4LHRoaXMueG1pbix0aGlzLnltYXgsdGhpcy54bWluLHRoaXMueW1pbl07Y29uc3QgZT10aGlzLl9jZWxsKHQpO2lmKG51bGw9PT1lKXJldHVybiBudWxsO2NvbnN0e3ZlY3RvcnM6bn09dGhpcyxyPTQqdDtyZXR1cm4gdGhpcy5fc2ltcGxpZnkobltyXXx8bltyKzFdP3RoaXMuX2NsaXBJbmZpbml0ZSh0LGUsbltyXSxuW3IrMV0sbltyKzJdLG5bciszXSk6dGhpcy5fY2xpcEZpbml0ZSh0LGUpKX1fY2xpcEZpbml0ZSh0LGUpe2NvbnN0IG49ZS5sZW5ndGg7bGV0IHIsaSxvLGwsYT1udWxsLHM9ZVtuLTJdLHU9ZVtuLTFdLGM9dGhpcy5fcmVnaW9uY29kZShzLHUpLGY9MDtmb3IobGV0IGg9MDtoPG47aCs9MilpZihyPXMsaT11LHM9ZVtoXSx1PWVbaCsxXSxvPWMsYz10aGlzLl9yZWdpb25jb2RlKHMsdSksMD09PW8mJjA9PT1jKWw9ZixmPTAsYT9hLnB1c2gocyx1KTphPVtzLHVdO2Vsc2V7bGV0IGUsbixoLGcsdjtpZigwPT09byl7aWYobnVsbD09PShlPXRoaXMuX2NsaXBTZWdtZW50KHIsaSxzLHUsbyxjKSkpY29udGludWU7W24saCxnLHZdPWV9ZWxzZXtpZihudWxsPT09KGU9dGhpcy5fY2xpcFNlZ21lbnQocyx1LHIsaSxjLG8pKSljb250aW51ZTtbZyx2LG4saF09ZSxsPWYsZj10aGlzLl9lZGdlY29kZShuLGgpLGwmJmYmJnRoaXMuX2VkZ2UodCxsLGYsYSxhLmxlbmd0aCksYT9hLnB1c2gobixoKTphPVtuLGhdfWw9ZixmPXRoaXMuX2VkZ2Vjb2RlKGcsdiksbCYmZiYmdGhpcy5fZWRnZSh0LGwsZixhLGEubGVuZ3RoKSxhP2EucHVzaChnLHYpOmE9W2csdl19aWYoYSlsPWYsZj10aGlzLl9lZGdlY29kZShhWzBdLGFbMV0pLGwmJmYmJnRoaXMuX2VkZ2UodCxsLGYsYSxhLmxlbmd0aCk7ZWxzZSBpZih0aGlzLmNvbnRhaW5zKHQsKHRoaXMueG1pbit0aGlzLnhtYXgpLzIsKHRoaXMueW1pbit0aGlzLnltYXgpLzIpKXJldHVyblt0aGlzLnhtYXgsdGhpcy55bWluLHRoaXMueG1heCx0aGlzLnltYXgsdGhpcy54bWluLHRoaXMueW1heCx0aGlzLnhtaW4sdGhpcy55bWluXTtyZXR1cm4gYX1fY2xpcFNlZ21lbnQodCxlLG4scixpLG8pe2NvbnN0IGw9aTxvO2ZvcihsJiYoW3QsZSxuLHIsaSxvXT1bbixyLHQsZSxvLGldKTs7KXtpZigwPT09aSYmMD09PW8pcmV0dXJuIGw/W24scix0LGVdOlt0LGUsbixyXTtpZihpJm8pcmV0dXJuIG51bGw7bGV0IGEscyx1PWl8fG87OCZ1PyhhPXQrKG4tdCkqKHRoaXMueW1heC1lKS8oci1lKSxzPXRoaXMueW1heCk6NCZ1PyhhPXQrKG4tdCkqKHRoaXMueW1pbi1lKS8oci1lKSxzPXRoaXMueW1pbik6MiZ1PyhzPWUrKHItZSkqKHRoaXMueG1heC10KS8obi10KSxhPXRoaXMueG1heCk6KHM9ZSsoci1lKSoodGhpcy54bWluLXQpLyhuLXQpLGE9dGhpcy54bWluKSxpPyh0PWEsZT1zLGk9dGhpcy5fcmVnaW9uY29kZSh0LGUpKToobj1hLHI9cyxvPXRoaXMuX3JlZ2lvbmNvZGUobixyKSl9fV9jbGlwSW5maW5pdGUodCxlLG4scixpLG8pe2xldCBsLGE9QXJyYXkuZnJvbShlKTtpZigobD10aGlzLl9wcm9qZWN0KGFbMF0sYVsxXSxuLHIpKSYmYS51bnNoaWZ0KGxbMF0sbFsxXSksKGw9dGhpcy5fcHJvamVjdChhW2EubGVuZ3RoLTJdLGFbYS5sZW5ndGgtMV0saSxvKSkmJmEucHVzaChsWzBdLGxbMV0pLGE9dGhpcy5fY2xpcEZpbml0ZSh0LGEpKWZvcihsZXQgZSxuPTAscj1hLmxlbmd0aCxpPXRoaXMuX2VkZ2Vjb2RlKGFbci0yXSxhW3ItMV0pO248cjtuKz0yKWU9aSxpPXRoaXMuX2VkZ2Vjb2RlKGFbbl0sYVtuKzFdKSxlJiZpJiYobj10aGlzLl9lZGdlKHQsZSxpLGEsbikscj1hLmxlbmd0aCk7ZWxzZSB0aGlzLmNvbnRhaW5zKHQsKHRoaXMueG1pbit0aGlzLnhtYXgpLzIsKHRoaXMueW1pbit0aGlzLnltYXgpLzIpJiYoYT1bdGhpcy54bWluLHRoaXMueW1pbix0aGlzLnhtYXgsdGhpcy55bWluLHRoaXMueG1heCx0aGlzLnltYXgsdGhpcy54bWluLHRoaXMueW1heF0pO3JldHVybiBhfV9lZGdlKHQsZSxuLHIsaSl7Zm9yKDtlIT09bjspe2xldCBuLG87c3dpdGNoKGUpe2Nhc2UgNTplPTQ7Y29udGludWU7Y2FzZSA0OmU9NixuPXRoaXMueG1heCxvPXRoaXMueW1pbjticmVhaztjYXNlIDY6ZT0yO2NvbnRpbnVlO2Nhc2UgMjplPTEwLG49dGhpcy54bWF4LG89dGhpcy55bWF4O2JyZWFrO2Nhc2UgMTA6ZT04O2NvbnRpbnVlO2Nhc2UgODplPTksbj10aGlzLnhtaW4sbz10aGlzLnltYXg7YnJlYWs7Y2FzZSA5OmU9MTtjb250aW51ZTtjYXNlIDE6ZT01LG49dGhpcy54bWluLG89dGhpcy55bWlufXJbaV09PT1uJiZyW2krMV09PT1vfHwhdGhpcy5jb250YWlucyh0LG4sbyl8fChyLnNwbGljZShpLDAsbixvKSxpKz0yKX1yZXR1cm4gaX1fcHJvamVjdCh0LGUsbixyKXtsZXQgaSxvLGwsYT0xLzA7aWYocjwwKXtpZihlPD10aGlzLnltaW4pcmV0dXJuIG51bGw7KGk9KHRoaXMueW1pbi1lKS9yKTxhJiYobD10aGlzLnltaW4sbz10KyhhPWkpKm4pfWVsc2UgaWYocj4wKXtpZihlPj10aGlzLnltYXgpcmV0dXJuIG51bGw7KGk9KHRoaXMueW1heC1lKS9yKTxhJiYobD10aGlzLnltYXgsbz10KyhhPWkpKm4pfWlmKG4+MCl7aWYodD49dGhpcy54bWF4KXJldHVybiBudWxsOyhpPSh0aGlzLnhtYXgtdCkvbik8YSYmKG89dGhpcy54bWF4LGw9ZSsoYT1pKSpyKX1lbHNlIGlmKG48MCl7aWYodDw9dGhpcy54bWluKXJldHVybiBudWxsOyhpPSh0aGlzLnhtaW4tdCkvbik8YSYmKG89dGhpcy54bWluLGw9ZSsoYT1pKSpyKX1yZXR1cm5bbyxsXX1fZWRnZWNvZGUodCxlKXtyZXR1cm4odD09PXRoaXMueG1pbj8xOnQ9PT10aGlzLnhtYXg/MjowKXwoZT09PXRoaXMueW1pbj80OmU9PT10aGlzLnltYXg/ODowKX1fcmVnaW9uY29kZSh0LGUpe3JldHVybih0PHRoaXMueG1pbj8xOnQ+dGhpcy54bWF4PzI6MCl8KGU8dGhpcy55bWluPzQ6ZT50aGlzLnltYXg/ODowKX1fc2ltcGxpZnkodCl7aWYodCYmdC5sZW5ndGg+NCl7Zm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDtlKz0yKXtjb25zdCBuPShlKzIpJXQubGVuZ3RoLHI9KGUrNCkldC5sZW5ndGg7KHRbZV09PT10W25dJiZ0W25dPT09dFtyXXx8dFtlKzFdPT09dFtuKzFdJiZ0W24rMV09PT10W3IrMV0pJiYodC5zcGxpY2UobiwyKSxlLT0yKX10Lmxlbmd0aHx8KHQ9bnVsbCl9cmV0dXJuIHR9fWNvbnN0IENhPTIqTWF0aC5QSSxCYT1NYXRoLnBvdztmdW5jdGlvbiBVYSh0KXtyZXR1cm4gdFswXX1mdW5jdGlvbiBMYSh0KXtyZXR1cm4gdFsxXX1mdW5jdGlvbiBEYSh0LGUsbil7cmV0dXJuW3QrTWF0aC5zaW4odCtlKSpuLGUrTWF0aC5jb3ModC1lKSpuXX1jbGFzcyBIYXtzdGF0aWMgZnJvbSh0LGU9VWEsbj1MYSxyKXtyZXR1cm4gbmV3IEhhKCJsZW5ndGgiaW4gdD9mdW5jdGlvbih0LGUsbixyKXtjb25zdCBpPXQubGVuZ3RoLG89bmV3IEZsb2F0NjRBcnJheSgyKmkpO2ZvcihsZXQgbD0wO2w8aTsrK2wpe2NvbnN0IGk9dFtsXTtvWzIqbF09ZS5jYWxsKHIsaSxsLHQpLG9bMipsKzFdPW4uY2FsbChyLGksbCx0KX1yZXR1cm4gb30odCxlLG4scik6RmxvYXQ2NEFycmF5LmZyb20oZnVuY3Rpb24qKHQsZSxuLHIpe2xldCBpPTA7Zm9yKGNvbnN0IG8gb2YgdCl5aWVsZCBlLmNhbGwocixvLGksdCkseWllbGQgbi5jYWxsKHIsbyxpLHQpLCsraX0odCxlLG4scikpKX1jb25zdHJ1Y3Rvcih0KXt0aGlzLl9kZWxhdW5hdG9yPW5ldyBPYSh0KSx0aGlzLmluZWRnZXM9bmV3IEludDMyQXJyYXkodC5sZW5ndGgvMiksdGhpcy5faHVsbEluZGV4PW5ldyBJbnQzMkFycmF5KHQubGVuZ3RoLzIpLHRoaXMucG9pbnRzPXRoaXMuX2RlbGF1bmF0b3IuY29vcmRzLHRoaXMuX2luaXQoKX11cGRhdGUoKXtyZXR1cm4gdGhpcy5fZGVsYXVuYXRvci51cGRhdGUoKSx0aGlzLl9pbml0KCksdGhpc31faW5pdCgpe2NvbnN0IHQ9dGhpcy5fZGVsYXVuYXRvcixlPXRoaXMucG9pbnRzO2lmKHQuaHVsbCYmdC5odWxsLmxlbmd0aD4yJiZmdW5jdGlvbih0KXtjb25zdHt0cmlhbmdsZXM6ZSxjb29yZHM6bn09dDtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrPTMpe2NvbnN0IHI9MiplW3RdLGk9MiplW3QrMV0sbz0yKmVbdCsyXTtpZigobltvXS1uW3JdKSoobltpKzFdLW5bcisxXSktKG5baV0tbltyXSkqKG5bbysxXS1uW3IrMV0pPjFlLTEwKXJldHVybiExfXJldHVybiEwfSh0KSl7dGhpcy5jb2xsaW5lYXI9SW50MzJBcnJheS5mcm9tKHtsZW5ndGg6ZS5sZW5ndGgvMn0sKCh0LGUpPT5lKSkuc29ydCgoKHQsbik9PmVbMip0XS1lWzIqbl18fGVbMip0KzFdLWVbMipuKzFdKSk7Y29uc3QgdD10aGlzLmNvbGxpbmVhclswXSxuPXRoaXMuY29sbGluZWFyW3RoaXMuY29sbGluZWFyLmxlbmd0aC0xXSxyPVtlWzIqdF0sZVsyKnQrMV0sZVsyKm5dLGVbMipuKzFdXSxpPTFlLTgqTWF0aC5oeXBvdChyWzNdLXJbMV0sclsyXS1yWzBdKTtmb3IobGV0IHQ9MCxuPWUubGVuZ3RoLzI7dDxuOysrdCl7Y29uc3Qgbj1EYShlWzIqdF0sZVsyKnQrMV0saSk7ZVsyKnRdPW5bMF0sZVsyKnQrMV09blsxXX10aGlzLl9kZWxhdW5hdG9yPW5ldyBPYShlKX1lbHNlIGRlbGV0ZSB0aGlzLmNvbGxpbmVhcjtjb25zdCBuPXRoaXMuaGFsZmVkZ2VzPXRoaXMuX2RlbGF1bmF0b3IuaGFsZmVkZ2VzLHI9dGhpcy5odWxsPXRoaXMuX2RlbGF1bmF0b3IuaHVsbCxpPXRoaXMudHJpYW5nbGVzPXRoaXMuX2RlbGF1bmF0b3IudHJpYW5nbGVzLG89dGhpcy5pbmVkZ2VzLmZpbGwoLTEpLGw9dGhpcy5faHVsbEluZGV4LmZpbGwoLTEpO2ZvcihsZXQgdD0wLGU9bi5sZW5ndGg7dDxlOysrdCl7Y29uc3QgZT1pW3QlMz09Mj90LTI6dCsxXTstMSE9PW5bdF0mJi0xIT09b1tlXXx8KG9bZV09dCl9Zm9yKGxldCB0PTAsZT1yLmxlbmd0aDt0PGU7Kyt0KWxbclt0XV09dDtyLmxlbmd0aDw9MiYmci5sZW5ndGg+MCYmKHRoaXMudHJpYW5nbGVzPW5ldyBJbnQzMkFycmF5KDMpLmZpbGwoLTEpLHRoaXMuaGFsZmVkZ2VzPW5ldyBJbnQzMkFycmF5KDMpLmZpbGwoLTEpLHRoaXMudHJpYW5nbGVzWzBdPXJbMF0sb1tyWzBdXT0xLDI9PT1yLmxlbmd0aCYmKG9bclsxXV09MCx0aGlzLnRyaWFuZ2xlc1sxXT1yWzFdLHRoaXMudHJpYW5nbGVzWzJdPXJbMV0pKX12b3Jvbm9pKHQpe3JldHVybiBuZXcgUmEodGhpcyx0KX0qbmVpZ2hib3JzKHQpe2NvbnN0e2luZWRnZXM6ZSxodWxsOm4sX2h1bGxJbmRleDpyLGhhbGZlZGdlczppLHRyaWFuZ2xlczpvLGNvbGxpbmVhcjpsfT10aGlzO2lmKGwpe2NvbnN0IGU9bC5pbmRleE9mKHQpO3JldHVybiBlPjAmJih5aWVsZCBsW2UtMV0pLHZvaWQoZTxsLmxlbmd0aC0xJiYoeWllbGQgbFtlKzFdKSl9Y29uc3QgYT1lW3RdO2lmKC0xPT09YSlyZXR1cm47bGV0IHM9YSx1PS0xO2Rve2lmKHlpZWxkIHU9b1tzXSxzPXMlMz09Mj9zLTI6cysxLG9bc10hPT10KXJldHVybjtpZihzPWlbc10sLTE9PT1zKXtjb25zdCBlPW5bKHJbdF0rMSklbi5sZW5ndGhdO3JldHVybiB2b2lkKGUhPT11JiYoeWllbGQgZSkpfX13aGlsZShzIT09YSl9ZmluZCh0LGUsbj0wKXtpZigodD0rdCkhPXR8fChlPStlKSE9ZSlyZXR1cm4tMTtjb25zdCByPW47bGV0IGk7Zm9yKDsoaT10aGlzLl9zdGVwKG4sdCxlKSk+PTAmJmkhPT1uJiZpIT09cjspbj1pO3JldHVybiBpfV9zdGVwKHQsZSxuKXtjb25zdHtpbmVkZ2VzOnIsaHVsbDppLF9odWxsSW5kZXg6byxoYWxmZWRnZXM6bCx0cmlhbmdsZXM6YSxwb2ludHM6c309dGhpcztpZigtMT09PXJbdF18fCFzLmxlbmd0aClyZXR1cm4odCsxKSUocy5sZW5ndGg+PjEpO2xldCB1PXQsYz1CYShlLXNbMip0XSwyKStCYShuLXNbMip0KzFdLDIpO2NvbnN0IGY9clt0XTtsZXQgaD1mO2Rve2xldCByPWFbaF07Y29uc3QgZj1CYShlLXNbMipyXSwyKStCYShuLXNbMipyKzFdLDIpO2lmKGY8YyYmKGM9Zix1PXIpLGg9aCUzPT0yP2gtMjpoKzEsYVtoXSE9PXQpYnJlYWs7aWYoaD1sW2hdLC0xPT09aCl7aWYoaD1pWyhvW3RdKzEpJWkubGVuZ3RoXSxoIT09ciYmQmEoZS1zWzIqaF0sMikrQmEobi1zWzIqaCsxXSwyKTxjKXJldHVybiBoO2JyZWFrfX13aGlsZShoIT09Zik7cmV0dXJuIHV9cmVuZGVyKHQpe2NvbnN0IGU9bnVsbD09dD90PW5ldyBFYTp2b2lkIDAse3BvaW50czpuLGhhbGZlZGdlczpyLHRyaWFuZ2xlczppfT10aGlzO2ZvcihsZXQgZT0wLG89ci5sZW5ndGg7ZTxvOysrZSl7Y29uc3Qgbz1yW2VdO2lmKG88ZSljb250aW51ZTtjb25zdCBsPTIqaVtlXSxhPTIqaVtvXTt0Lm1vdmVUbyhuW2xdLG5bbCsxXSksdC5saW5lVG8oblthXSxuW2ErMV0pfXJldHVybiB0aGlzLnJlbmRlckh1bGwodCksZSYmZS52YWx1ZSgpfXJlbmRlclBvaW50cyh0LGUpe3ZvaWQgMCE9PWV8fHQmJiJmdW5jdGlvbiI9PXR5cGVvZiB0Lm1vdmVUb3x8KGU9dCx0PW51bGwpLGU9bnVsbD09ZT8yOitlO2NvbnN0IG49bnVsbD09dD90PW5ldyBFYTp2b2lkIDAse3BvaW50czpyfT10aGlzO2ZvcihsZXQgbj0wLGk9ci5sZW5ndGg7bjxpO24rPTIpe2NvbnN0IGk9cltuXSxvPXJbbisxXTt0Lm1vdmVUbyhpK2UsbyksdC5hcmMoaSxvLGUsMCxDYSl9cmV0dXJuIG4mJm4udmFsdWUoKX1yZW5kZXJIdWxsKHQpe2NvbnN0IGU9bnVsbD09dD90PW5ldyBFYTp2b2lkIDAse2h1bGw6bixwb2ludHM6cn09dGhpcyxpPTIqblswXSxvPW4ubGVuZ3RoO3QubW92ZVRvKHJbaV0scltpKzFdKTtmb3IobGV0IGU9MTtlPG87KytlKXtjb25zdCBpPTIqbltlXTt0LmxpbmVUbyhyW2ldLHJbaSsxXSl9cmV0dXJuIHQuY2xvc2VQYXRoKCksZSYmZS52YWx1ZSgpfWh1bGxQb2x5Z29uKCl7Y29uc3QgdD1uZXcgTmE7cmV0dXJuIHRoaXMucmVuZGVySHVsbCh0KSx0LnZhbHVlKCl9cmVuZGVyVHJpYW5nbGUodCxlKXtjb25zdCBuPW51bGw9PWU/ZT1uZXcgRWE6dm9pZCAwLHtwb2ludHM6cix0cmlhbmdsZXM6aX09dGhpcyxvPTIqaVt0Kj0zXSxsPTIqaVt0KzFdLGE9MippW3QrMl07cmV0dXJuIGUubW92ZVRvKHJbb10scltvKzFdKSxlLmxpbmVUbyhyW2xdLHJbbCsxXSksZS5saW5lVG8oclthXSxyW2ErMV0pLGUuY2xvc2VQYXRoKCksbiYmbi52YWx1ZSgpfSp0cmlhbmdsZVBvbHlnb25zKCl7Y29uc3R7dHJpYW5nbGVzOnR9PXRoaXM7Zm9yKGxldCBlPTAsbj10Lmxlbmd0aC8zO2U8bjsrK2UpeWllbGQgdGhpcy50cmlhbmdsZVBvbHlnb24oZSl9dHJpYW5nbGVQb2x5Z29uKHQpe2NvbnN0IGU9bmV3IE5hO3JldHVybiB0aGlzLnJlbmRlclRyaWFuZ2xlKHQsZSksZS52YWx1ZSgpfX1mdW5jdGlvbiBYYSh0LGUsbj17fSl7aWYoIU5vKHQpKXJldHVybntlcnI6InBzU3JjIGlzIG5vdCBhbiBhcnJheSJ9O2lmKCFJbyhlKSYmIU5vKGUpKXJldHVybntlcnI6InBzVGFyIGlzIG5vdCBhbiBvYmplY3Qgb3IgYXJyYXkifTtsZXQgcj1JbyhlKTtyJiYoZT1bZV0pO2xldCBpPV9lKG4sImtleVgiKTtBZShpKXx8KGk9IngiKTtsZXQgbz1fZShuLCJrZXlZIik7QWUobyl8fChvPSJ5Iik7bGV0IGw9X2Uobiwia2V5WiIpO0FlKGwpfHwobD0ieiIpO2xldCBhPV9lKG4sInNjYWxlIik7Um8oYSl8fChhPTEpLGE9R28oYSk7bGV0IHM9X2UobiwiZnVuSW50ZXJwRnJhZ21lbnQiKSx1PWZ1bmN0aW9uKHQpe2xldCBlPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KTtyZXR1cm4iW29iamVjdCBGdW5jdGlvbl0iPT09ZXx8IltvYmplY3QgQXN5bmNGdW5jdGlvbl0iPT09ZX0ocyksYz0iaW5kIjtpZih0PWVsKHQse2tleVg6aSxrZXlZOm8sa2V5WjpsLGtleUluZDpjfSksMD09PWtvKHQpKXJldHVybntlcnI6InBzU3JjIGhhcyBubyBlZmZlY3RpdmUgZGF0YSJ9O2lmKGU9dGwoZSx7a2V5WDppLGtleVk6byxrZXlJbmQ6Y30pLDA9PT1rbyhlKSlyZXR1cm57ZXJyOiJwc1RhciBoYXMgbm8gZWZmZWN0aXZlIGRhdGEifTtsZXQgZj1DbCh0LHtrZXlJbmQ6YyxzY2FsZTphfSk7dD1mLnBzO2xldCBoPWYubnYsZz1mLmludix2PVsuLi50XSxkPVsuLi50XSxwPXt9O0VuKHQsKHQ9PntsZXQgZT1gJHt0Lnh9LSR7dC55fWA7cFtlXT10Lnp9KSk7bGV0IHksbT1IYS5mcm9tKGQsKHQ9PnQueCksKHQ9PnQueSkpLF89WzAsMCxhLGFdLGI9bS52b3Jvbm9pKF8pLHg9KGUsbixyKT0+e2xldCBpPVsuLi50XSxvPXt4Om4seTpyLHo6MH07aS5wdXNoKG8pLGUucHVzaChvKTtsZXQgbD1IYS5mcm9tKGksKHQ9PnQueCksKHQ9PnQueSkpLnZvcm9ub2koXyksYT1pLmxlbmd0aC0xLGM9bC5jZWxsUG9seWdvbihhKSxmPUpsKGMpLGg9bnVsbDtpZihmPjApe2xldCB0PVtdLG49bC5kZWxhdW5heS5uZWlnaGJvcnMoYSkscj1uLm5leHQoKTtmb3IoOyFyLmRvbmU7KXtsZXQgZT1yLnZhbHVlO3QucHVzaChlKSxyPW4ubmV4dCgpfWxldCBpPVZpKHQsKHQ9PntsZXQgZT1bY10sbj1bYi5jZWxsUG9seWdvbih0KV0scj1bXTt0cnl7cj1mdW5jdGlvbih0LGUpe2lmKCFObyh0KSlyZXR1cm4gbnVsbDtpZighTm8oZSkpcmV0dXJuIG51bGw7dD1abCh0KSxlPVpsKGUpO2xldCBuPWZhLmludGVyc2VjdCh7cmVnaW9uczp0fSx7cmVnaW9uczplfSk7cmV0dXJuIF9lKG4sInJlZ2lvbnMiLFtdKX0oZSxuKX1jYXRjaCh0KXtjb25zb2xlLmxvZygicGdzMSIsZSksY29uc29sZS5sb2coInBnczIiLG4pLGNvbnNvbGUubG9nKHQpfWxldCBpPTA7aWYoMT09PWtvKHIpKXRyeXtpPUpsKHJbMF0pfWNhdGNoKHQpe2NvbnNvbGUubG9nKCJwZ3NJbnRzIixyKSxjb25zb2xlLmxvZyh0KX1yZXR1cm57aWE6aSxpZHg6dH19KSk7aD1WaShpLCh0PT57bGV0IG49dC5pYS9mLHI9ZVt0LmlkeF0ueixpPW4qcjtyZXR1cm4gdSYmKHI9cyh7djppLGFyZWE6dC5pYSxhcmVhVG90YWw6ZixhcmVhUmF0aW86bix6OnIsaW5kOnQuaWR4fSkpLGl9KSksaD1RaShoKX1yZXR1cm4gZVtlLmxlbmd0aC0xXS56PWgsaH0sdz0odCxlKT0+e2xldCBuPWAke3R9LSR7ZX1gO2lmKFFvKHAsbikpcmV0dXJuIHBbbl07aWYodDxfWzBdfHx0Pl9bMl18fGU8X1sxXXx8ZT5fWzNdKXJldHVybiBudWxsO2xldCByPSgodCxlLG4pPT57bGV0IHI7dHJ5e3I9eCh0LGUsbil9Y2F0Y2goZSl7Y29uc29sZS5sb2coZSkscj1udWxsLHQucG9wKCl9cmV0dXJuIHJ9KSh2LHQsZSk7cmV0dXJuIHBbbl09cixyfSxqPXQ9PntsZXQgZT10Lngsbj1oKGUsMCk7aWYoIVRvKG4pKXRocm93IG5ldyBFcnJvcihgaW52YWxpZCBueFske259XWApO2xldCByPXQueSxhPWgociwxKTtpZighVG8oYSkpdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG55WyR7YX1dYCk7bGV0IHM9dyhuLGEpLHU9ZyhzLDIpO3JldHVybiBUbyh1KXx8KHU9bnVsbCkse1tpXTplLFtvXTpyLFtsXTp1fX07aWYocil7bGV0IHQ9ZVswXTt5PWoodCl9ZWxzZSB5PVtdLEVuKGUsKHQ9Pnt5LnB1c2goaih0KSl9KSk7cmV0dXJuIHl9bGV0IFlhPXt9LEthPWZ1bmN0aW9uKHQsZSl7bGV0IG49W107Zm9yKGxldCByPTA7cjxlO3IrKyluLnB1c2godCk7cmV0dXJuIG59LFphPWZ1bmN0aW9uKHQsZSl7bGV0IG49S2EoMCxlKmUpO2ZvcihsZXQgcj0wO3I8ZTtyKyspbltyKmUrcl09dDtyZXR1cm4gbn0sSmE9ZnVuY3Rpb24odCxlLG4scil7bGV0IGksbyxsPUFycmF5KG4qcik7Zm9yKGk9MDtpPG47aSsrKWZvcihvPTA7bzxyO28rKylsW2kqcitvXT10W2kqcitvXStlW2kqcitvXTtyZXR1cm4gbH0sVmE9ZnVuY3Rpb24odCxlLG4scixpKXtsZXQgbyxsLGEscz1BcnJheShuKmkpO2ZvcihvPTA7bzxuO28rKylmb3IobD0wO2w8aTtsKyspZm9yKHNbbyppK2xdPTAsYT0wO2E8cjthKyspc1tvKmkrbF0rPXRbbypyK2FdKmVbYSppK2xdO3JldHVybiBzfSxXYT1mdW5jdGlvbih0LGUpe2xldCBuLHIsaSxvPUFycmF5KGUpO2ZvcihuPTA7bjxlO24rKylvW25dPXRbbiplK25dO2ZvcihuPTA7bjxlO24rKyl7Zm9yKHI9MDtyPG47cisrKW9bbl0tPXRbbiplK3JdKnRbbiplK3JdO2lmKG9bbl08PTApcmV0dXJuITE7Zm9yKG9bbl09TWF0aC5zcXJ0KG9bbl0pLHI9bisxO3I8ZTtyKyspe2ZvcihpPTA7aTxuO2krKyl0W3IqZStuXS09dFtyKmUraV0qdFtuKmUraV07dFtyKmUrbl0vPW9bbl19fWZvcihuPTA7bjxlO24rKyl0W24qZStuXT1vW25dO3JldHVybiEwfSxxYT1mdW5jdGlvbih0LGUpe2xldCBuLHIsaSxvO2ZvcihuPTA7bjxlO24rKylmb3IodFtuKmUrbl09MS90W24qZStuXSxyPW4rMTtyPGU7cisrKXtmb3Iobz0wLGk9bjtpPHI7aSsrKW8tPXRbciplK2ldKnRbaSplK25dO3RbciplK25dPW8vdFtyKmUrcl19Zm9yKG49MDtuPGU7bisrKWZvcihyPW4rMTtyPGU7cisrKXRbbiplK3JdPTA7Zm9yKG49MDtuPGU7bisrKXtmb3IodFtuKmUrbl0qPXRbbiplK25dLGk9bisxO2k8ZTtpKyspdFtuKmUrbl0rPXRbaSplK25dKnRbaSplK25dO2ZvcihyPW4rMTtyPGU7cisrKWZvcihpPXI7aTxlO2krKyl0W24qZStyXSs9dFtpKmUrbl0qdFtpKmUrcl19Zm9yKG49MDtuPGU7bisrKWZvcihyPTA7cjxuO3IrKyl0W24qZStyXT10W3IqZStuXX0sR2E9ZnVuY3Rpb24odCxlKXtsZXQgbixyLGksbyxsLGEscyx1LGMsZixoLGc9ZSx2PUFycmF5KGUqZSksZD1BcnJheShlKSxwPUFycmF5KGUpLHk9QXJyYXkoZSk7Zm9yKG49MDtuPGU7bisrKWZvcihvPTA7bzxlO28rKyl2W24qZStvXT1uPT09bz8xOjA7Zm9yKG89MDtvPGU7bysrKXlbb109MDtmb3Iobj0wO248ZTtuKyspe2Zvcih1PTAsbz0wO288ZTtvKyspaWYoMSE9PXlbb10pZm9yKGw9MDtsPGU7bCsrKTA9PT15W2xdJiZNYXRoLmFicyh0W28qZStsXSk+PXUmJih1PU1hdGguYWJzKHRbbyplK2xdKSxpPW8scj1sKTtpZigrK3lbcl0saSE9PXIpe2ZvcihhPTA7YTxlO2ErKyloPXRbaSplK2FdLHRbaSplK2FdPXRbciplK2FdLHRbciplK2FdPWg7Zm9yKGE9MDthPGc7YSsrKWg9dltpKmUrYV0sdltpKmUrYV09dltyKmUrYV0sdltyKmUrYV09aH1pZihwW25dPWksZFtuXT1yLDA9PT10W3IqZStyXSlyZXR1cm4hMTtmb3IoZj0xL3RbciplK3JdLHRbciplK3JdPTEsYT0wO2E8ZTthKyspdFtyKmUrYV0qPWY7Zm9yKGE9MDthPGc7YSsrKXZbciplK2FdKj1mO2ZvcihzPTA7czxlO3MrKylpZihzIT09cil7Zm9yKGM9dFtzKmUrcl0sdFtzKmUrcl09MCxhPTA7YTxlO2ErKyl0W3MqZSthXS09dFtyKmUrYV0qYztmb3IoYT0wO2E8ZzthKyspdltzKmUrYV0tPXZbciplK2FdKmN9fWZvcihhPWUtMTthPj0wO2EtLSlpZihwW2FdIT09ZFthXSlmb3IobD0wO2w8ZTtsKyspaD10W2wqZStwW2FdXSx0W2wqZStwW2FdXT10W2wqZStkW2FdXSx0W2wqZStkW2FdXT1oO3JldHVybiEwfSxRYT1mdW5jdGlvbih0LGUsbixyLGkpe3JldHVybiBlKyhyLWUpL24qKDEtTWF0aC5leHAoLTEvaSpNYXRoLnBvdyh0L24sMikpKX0sdHM9ZnVuY3Rpb24odCxlLG4scixpKXtyZXR1cm4gZSsoci1lKS9uKigxLU1hdGguZXhwKC0xL2kqKHQvbikpKX0sZXM9ZnVuY3Rpb24odCxlLG4scixpKXtyZXR1cm4gdD5uP2UrKHItZSkvbjplKyhyLWUpL24qKHQvbioxLjUtLjUqTWF0aC5wb3codC9uLDMpKX07ZnVuY3Rpb24gbnModCxlLG49e30pe2lmKCFObyh0KSlyZXR1cm57ZXJyOiJwc1NyYyBpcyBub3QgYW4gYXJyYXkifTtpZighSW8oZSkmJiFObyhlKSlyZXR1cm57ZXJyOiJwc1RhciBpcyBub3QgYW4gb2JqZWN0IG9yIGFycmF5In07bGV0IHI9SW8oZSk7ciYmKGU9W2VdKTtsZXQgaT1fZShuLCJrZXlYIik7QWUoaSl8fChpPSJ4Iik7bGV0IG89X2Uobiwia2V5WSIpO0FlKG8pfHwobz0ieSIpO2xldCBsPV9lKG4sImtleVoiKTtBZShsKXx8KGw9InoiKTtsZXQgYT1fZShuLCJzY2FsZSIpO1JvKGEpfHwoYT0xKSxhPUdvKGEpO2xldCBzPV9lKG4sIm1vZGVsIik7ImV4cG9uZW50aWFsIiE9PXMmJiJnYXVzc2lhbiIhPT1zJiYic3BoZXJpY2FsIiE9PXMmJihzPSJleHBvbmVudGlhbCIpO2xldCB1PV9lKG4sInNpZ21hMiIpO1JvKHUpfHwodT0wKSx1PUdvKHUpO2xldCBjPV9lKG4sImFscGhhIik7Um8oYyl8fChjPTEwMCksYz1HbyhjKTtsZXQgZj1fZShuLCJyZXR1cm5XaXRoVmFyaW9ncmFtIik7aWYoamUoZil8fChmPSExKSx0PWVsKHQsbiksMD09PWtvKHQpKXJldHVybntlcnI6InBzU3JjIGhhcyBubyBlZmZlY3RpdmUgZGF0YSJ9O2lmKGU9dGwoZSxuKSwwPT09a28oZSkpcmV0dXJue2VycjoicHNUYXIgaGFzIG5vIGVmZmVjdGl2ZSBkYXRhIn07bGV0IGg9Q2wodCx7c2NhbGU6YX0pO3Q9aC5wcztsZXQgZz1oLm52LHY9aC5pbnYsZD17fTtFbih0LCh0PT57bGV0IGU9YCR7dC54fS0ke3QueX1gO2RbZV09dC56fSkpO2xldCBwPVtdLHk9W10sbT1bXTtFbih0LCh0PT57cC5wdXNoKHQueCkseS5wdXNoKHQueSksbS5wdXNoKHQueil9KSk7bGV0IF8sYj1ZYS50cmFpbihtLHAseSxzLHUsYykseD10PT57bGV0IGU9dC54LG49ZyhlLDApO2lmKCFUbyhuKSl0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgbnhbJHtufV1gKTtsZXQgcj10LnksYT1nKHIsMSk7aWYoIVRvKGEpKXRocm93IG5ldyBFcnJvcihgaW52YWxpZCBueVske2F9XWApO2xldCBzPSgodCxlKT0+e2xldCBuPWAke3R9LSR7ZX1gO2lmKFFvKGQsbikpcmV0dXJuIGRbbl07bGV0IHI9WWEucHJlZGljdCh0LGUsYik7cmV0dXJuIGRbbl09cixyfSkobixhKSx1PXYocywyKTtyZXR1cm4gVG8odSl8fCh1PW51bGwpLHtbaV06ZSxbb106cixbbF06dX19O2lmKHIpe2xldCB0PWVbMF07Xz14KHQpfWVsc2UgXz1bXSxFbihlLCh0PT57Xy5wdXNoKHgodCkpfSkpO3JldHVybiBmJiYoXz17cmVzdWx0Ol8sdmFyaW9ncmFtOmJ9KSxffWZ1bmN0aW9uIGludGVycDIodCxlLG49e30pe2xldCByPV9lKG4sIm1ldGhvZCIpOyJuYXR1cmFsTmVpZ2hib3IiIT09ciYmImtyaWdpbmciIT09ciYmKHI9Im5hdHVyYWxOZWlnaGJvciIpO2xldCBpPV9lKG4sInVzZVN5bmMiKTtqZShpKXx8KGk9ITEpO2xldCBvPSgpPT57bGV0IGk9bnVsbDt0cnl7Im5hdHVyYWxOZWlnaGJvciI9PT1yP2k9WGEodCxlLG4pOiJrcmlnaW5nIj09PXImJihpPW5zKHQsZSxuKSl9Y2F0Y2godCl7aT17ZXJyOnQudG9TdHJpbmcoKX19cmV0dXJuIGl9O3JldHVybiBpP28oKTooYXN5bmMoKT0+e2xldCB0PW51bGw7dHJ5e3Q9bygpO2xldCBlPV9lKHQsImVyciIpO3JldHVybiBBZShlKT9Qcm9taXNlLnJlamVjdChlKTp0fWNhdGNoKHQpe3JldHVybiBjb25zb2xlLmxvZyh0KSxQcm9taXNlLnJlamVjdCh0LnRvU3RyaW5nKCkpfX0pKCl9WWEudHJhaW49ZnVuY3Rpb24odCxlLG4scixpLG8pe2xldCBsLGEscyx1LGM9e3Q6dCx4OmUseTpuLG51Z2dldDowLHJhbmdlOjAsc2lsbDowLEE6MS8zLG46MH07c3dpdGNoKHIpe2Nhc2UiZ2F1c3NpYW4iOmMubW9kZWw9UWE7YnJlYWs7Y2FzZSJleHBvbmVudGlhbCI6Yy5tb2RlbD10czticmVhaztjYXNlInNwaGVyaWNhbCI6Yy5tb2RlbD1lc31sZXQgZj10Lmxlbmd0aCxoPUFycmF5KChmKmYtZikvMik7Zm9yKGw9MCxzPTA7bDxmO2wrKylmb3IoYT0wO2E8bDthKysscysrKWhbc109QXJyYXkoMiksaFtzXVswXT1NYXRoLnBvdyhNYXRoLnBvdyhlW2xdLWVbYV0sMikrTWF0aC5wb3cobltsXS1uW2FdLDIpLC41KSxoW3NdWzFdPU1hdGguYWJzKHRbbF0tdFthXSk7aC5zb3J0KChmdW5jdGlvbih0LGUpe3JldHVybiB0WzBdLWVbMF19KSksYy5yYW5nZT1oWyhmKmYtZikvMi0xXVswXTtsZXQgZz0oZipmLWYpLzI+MzA/MzA6KGYqZi1mKS8yLHY9Yy5yYW5nZS9nLGQ9S2EoMCxnKSxwPUthKDAsZyk7aWYoZzwzMClmb3IodT0wO3U8Zzt1KyspZFt1XT1oW3VdWzBdLHBbdV09aFt1XVsxXTtlbHNle2ZvcihsPTAsYT0wLHM9MCx1PTA7bDxnJiZhPChmKmYtZikvMjtsKysscz0wKXtmb3IoO2hbYV1bMF08PShsKzEpKnYmJihkW3VdKz1oW2FdWzBdLHBbdV0rPWhbYV1bMV0sYSsrLHMrKywhKGE+PShmKmYtZikvMikpOyk7cz4wJiYoZFt1XS89cyxwW3VdLz1zLHUrKyl9aWYodTwyKXJldHVybiBjfWxldCB5PVtdO2ZvcihsPTA7bDx1O2wrKyl7bGV0IHQ9ZFtsXSxlPXBbbF07eS5wdXNoKFt0LGVdKX1sZXQgbT17ZGF0YTpoLGJhcnM6eX07Yy5zdnBkPW0sZj11LGMucmFuZ2U9ZFtmLTFdLWRbMF07bGV0IF89S2EoMSwyKmYpLGI9QXJyYXkoZikseD1jLkE7Zm9yKGw9MDtsPGY7bCsrKXtzd2l0Y2gocil7Y2FzZSJnYXVzc2lhbiI6X1syKmwrMV09MS1NYXRoLmV4cCgtMS94Kk1hdGgucG93KGRbbF0vYy5yYW5nZSwyKSk7YnJlYWs7Y2FzZSJleHBvbmVudGlhbCI6X1syKmwrMV09MS1NYXRoLmV4cCgtMS94KmRbbF0vYy5yYW5nZSk7YnJlYWs7Y2FzZSJzcGhlcmljYWwiOl9bMipsKzFdPWRbbF0vYy5yYW5nZSoxLjUtLjUqTWF0aC5wb3coZFtsXS9jLnJhbmdlLDMpfWJbbF09cFtsXX1sZXQgdz1mdW5jdGlvbih0LGUsbil7bGV0IHIsaSxvPUFycmF5KG4qZSk7Zm9yKHI9MDtyPGU7cisrKWZvcihpPTA7aTxuO2krKylvW2kqZStyXT10W3IqbitpXTtyZXR1cm4gb30oXyxmLDIpLGo9VmEodyxfLDIsZiwyKTtqPUphKGosWmEoMS9vLDIpLDIsMik7bGV0IFM9ai5zbGljZSgwKTtXYShqLDIpP3FhKGosMik6KEdhKFMsMiksaj1TKTtsZXQgQT1WYShWYShqLHcsMiwyLGYpLGIsMixmLDEpO2MubnVnZ2V0PUFbMF0sYy5zaWxsPUFbMV0qYy5yYW5nZStjLm51Z2dldCxjLm49ZS5sZW5ndGgsZj1lLmxlbmd0aDtsZXQgTz1BcnJheShmKmYpO2ZvcihsPTA7bDxmO2wrKyl7Zm9yKGE9MDthPGw7YSsrKU9bbCpmK2FdPWMubW9kZWwoTWF0aC5wb3coTWF0aC5wb3coZVtsXS1lW2FdLDIpK01hdGgucG93KG5bbF0tblthXSwyKSwuNSksYy5udWdnZXQsYy5yYW5nZSxjLnNpbGwsYy5BKSxPW2EqZitsXT1PW2wqZithXTtPW2wqZitsXT1jLm1vZGVsKDAsYy5udWdnZXQsYy5yYW5nZSxjLnNpbGwsYy5BKX1sZXQgTT1KYShPLFphKGksZiksZixmKSxrPU0uc2xpY2UoMCk7V2EoTSxmKT9xYShNLGYpOihHYShrLGYpLE09ayk7bGV0IFA9TS5zbGljZSgwKSxGPVZhKE0sdCxmLGYsMSk7cmV0dXJuIGMuSz1QLGMuTT1GLGN9LFlhLnByZWRpY3Q9ZnVuY3Rpb24odCxlLG4pe2xldCByLGk9QXJyYXkobi5uKTtmb3Iocj0wO3I8bi5uO3IrKylpW3JdPW4ubW9kZWwoTWF0aC5wb3coTWF0aC5wb3codC1uLnhbcl0sMikrTWF0aC5wb3coZS1uLnlbcl0sMiksLjUpLG4ubnVnZ2V0LG4ucmFuZ2Usbi5zaWxsLG4uQSk7cmV0dXJuIFZhKGksbi5NLDEsbi5uLDEpWzBdfSxZYS52YXJpYW5jZT1mdW5jdGlvbih0LGUsbil7bGV0IHIsaT1BcnJheShuLm4pO2ZvcihyPTA7cjxuLm47cisrKWlbcl09bi5tb2RlbChNYXRoLnBvdyhNYXRoLnBvdyh0LW4ueFtyXSwyKStNYXRoLnBvdyhlLW4ueVtyXSwyKSwuNSksbi5udWdnZXQsbi5yYW5nZSxuLnNpbGwsbi5BKTtyZXR1cm4gbi5tb2RlbCgwLG4ubnVnZ2V0LG4ucmFuZ2Usbi5zaWxsLG4uQSkrVmEoVmEoaSxuLkssMSxuLm4sbi5uKSxpLDEsbi5uLDEpWzBdfTsKCmxldCBpbnN0YW5jZSA9IG51bGwKZnVuY3Rpb24gaW5pdChpbnB1dCl7CgogICAgLy9pbml0CiAgICBsZXQgcgogICAgCiAgICAgICAgciA9IHsKICAgICAgICAgICAgbWFpbjogaW50ZXJwMgogICAgICAgIH0KICAgICAgICAKCiAgICAvL29uCiAgICAKCiAgICAvL3NhdmUKICAgIGluc3RhbmNlID0gcgoKfQoKZnVuY3Rpb24gc2VuZE1lc3NhZ2UoZGF0YSkgewogICAgCiAgICAgICAgc2VsZi5wb3N0TWVzc2FnZShkYXRhKQogICAgICAgIAp9Cgphc3luYyBmdW5jdGlvbiBydW4oZGF0YSkgewogICAgLy8gY29uc29sZS5sb2coJ2lubmVyIHdvcmtlciBydW4nLGRhdGEpCgogICAgLy9tb2RlCiAgICBsZXQgbW9kZSA9IGRhdGEubW9kZQoKICAgIC8vY2hlY2sKICAgIGlmKG1vZGUgIT09ICdpbml0JyAmJiBtb2RlICE9PSAnY2FsbCcpewogICAgICAgIHJldHVybgogICAgfQoKICAgIC8vaW5pdAogICAgaWYobW9kZSA9PT0gJ2luaXQnKXsKICAgICAgICAKICAgICAgICB0cnl7CgogICAgICAgICAgICAvL3R5cGUKICAgICAgICAgICAgbGV0IHR5cGUgPSBkYXRhLnR5cGUKCiAgICAgICAgICAgIC8vaW5wdXQKICAgICAgICAgICAgbGV0IGlucHV0ID0gZGF0YS5pbnB1dAogICAgCiAgICAgICAgICAgIC8vaW5zdGFuY2UKICAgICAgICAgICAgaWYodHlwZSA9PT0gJ2Z1bmN0aW9uJyl7CiAgICAgICAgICAgICAgICBpbml0KC4uLmlucHV0KQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYodHlwZSA9PT0gJ29iamVjdCcpewogICAgICAgICAgICAgICAgaW5zdGFuY2UgPSBpbnRlcnAyCiAgICAgICAgICAgIH0KCiAgICAgICAgfQogICAgICAgIGNhdGNoKGVycil7CiAgICAgICAgCiAgICAgICAgICAgIC8vc2VuZE1lc3NhZ2UKICAgICAgICAgICAgbGV0IHJlcyA9IHsKICAgICAgICAgICAgICAgIG1vZGU6ICdlbWl0JywKICAgICAgICAgICAgICAgIGV2TmFtZTogJ2Vycm9yJywKICAgICAgICAgICAgICAgIG1zZzogZXJyLAogICAgICAgICAgICB9CiAgICAgICAgICAgIHNlbmRNZXNzYWdlKHJlcykKCiAgICAgICAgfQogICAgICAgICAgICAKICAgIH0KCiAgICAvL2NoZWNrCiAgICBpZihtb2RlID09PSAnY2FsbCcpewogICAgICAgIGxldCBzdGF0ZSA9ICcnCiAgICAgICAgbGV0IG1zZyA9IG51bGwKCiAgICAgICAgdHJ5ewoKICAgICAgICAgICAgLy9mdW4KICAgICAgICAgICAgbGV0IGZ1biA9IGluc3RhbmNlW2RhdGEuZnVuXQoKICAgICAgICAgICAgLy9pbnB1dAogICAgICAgICAgICBsZXQgaW5wdXQgPSBkYXRhLmlucHV0CgogICAgICAgICAgICAvL2V4ZWMKICAgICAgICAgICAgYXdhaXQgZnVuKC4uLmlucHV0KQogICAgICAgICAgICAgICAgLnRoZW4oKHN1YykgPT4gewogICAgICAgICAgICAgICAgICAgIHN0YXRlPSdzdWNjZXNzJwogICAgICAgICAgICAgICAgICAgIG1zZz1zdWMKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAuY2F0Y2goKGVycikgPT4gewogICAgICAgICAgICAgICAgICAgIHN0YXRlPSdlcnJvcicKICAgICAgICAgICAgICAgICAgICBtc2c9ZXJyCiAgICAgICAgICAgICAgICB9KQoKICAgICAgICB9CiAgICAgICAgY2F0Y2goZXJyKXsKICAgICAgICAgICAgc3RhdGUgPSAnZXJyb3InCiAgICAgICAgICAgIG1zZyA9IGVycgogICAgICAgIH0KICAgICAgICAKICAgICAgICAvL3NlbmRNZXNzYWdlCiAgICAgICAgbGV0IHJlcyA9IHsKICAgICAgICAgICAgbW9kZTogJ3JldHVybicsCiAgICAgICAgICAgIGlkOiBkYXRhLmlkLAogICAgICAgICAgICBmdW46IGRhdGEuZnVuLAogICAgICAgICAgICBzdGF0ZSwKICAgICAgICAgICAgbXNnLAogICAgICAgIH0KICAgICAgICBzZW5kTWVzc2FnZShyZXMpCgogICAgfQoKfQoKZnVuY3Rpb24gcmVjdk1lc3NhZ2UoZGF0YSkgewogICAgLy8gY29uc29sZS5sb2coJ2lubmVyIHdvcmtlciByZWN2OicsIGRhdGEpCgogICAgLy9kYXRhUmVjdgogICAgbGV0IGRhdGFSZWN2ID0gZGF0YQoKICAgIC8vcnVuCiAgICBydW4oZGF0YVJlY3YpCgp9CgoKICAgICAgICBzZWxmLm9ubWVzc2FnZSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIHJlY3ZNZXNzYWdlKGUuZGF0YSkKICAgICAgICB9CiAgICAgICAgCgo=");function d(){let d=new x,l=function(b){try{let d=new Blob([b]),l=window.URL||window.webkitURL;return new Worker(l.createObjectURL(d))}catch(b){m(b)}}(b);if(!l)return m("invalid worker"),null;function Z(){let b=function(){let b,d,l=new Promise((function(){b=arguments[0],d=arguments[1]}));return l.resolve=b,l.reject=d,l}(),Z=function(){let b=arguments.length>0&&void 0!==arguments[0]?arguments[0]:10,d=[],l="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""),Z=l.length;for(let m=0;m<b;m++)d[m]=l[0|Math.random()*Z];return d.join("")}(),m={mode:"call",id:Z,fun:"main",input:[...arguments]};return l.postMessage(m),d.once(Z,(d=>{"success"===d.state?b.resolve(d.msg):b.reject(d.msg)})),b}function m(b){d.emit("error",b)}return l.onmessage=function(b){!function(b){let l=b,Z=l.mode;"emit"!==Z&&"return"!==Z||("emit"===Z&&d.emit(l.evName,l.msg),"return"===Z&&d.emit(l.id,l))}(b.data)},l.onerror=m,function(){let b={mode:"init",type:"function",input:[...arguments]};l.postMessage(b)}([...arguments]),d.main=Z,d.main=Z,d.terminate=function(){l?(l.terminate(),l=void 0):m("worker has been terminated")},d}Y=async function(){let b=[...arguments],l=d();return await l.main(...b).finally((()=>{l.terminate()}))}}(),Y}()}({get exports(){return Z},set exports(b){Z=b}});var m=Z;let X;return X="undefined"!=typeof window&&void 0!==window.document?m:l,X}));
|
|
1
|
+
!function(b,d){"object"==typeof exports&&"undefined"!=typeof module?module.exports=d(require("worker_threads")):"function"==typeof define&&define.amd?define(["worker_threads"],d):(b="undefined"!=typeof globalThis?globalThis:b||self).interp2=d(b.worker_threads)}(this,(function(b){"use strict";"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;var d={};!function(d,l){d.exports=function(b){var d={};!function(b){var d=Object.prototype.hasOwnProperty,l="~";function Z(){}function m(b,d,l){this.fn=b,this.context=d,this.once=l||!1}function X(b,d,Z,X,G){if("function"!=typeof Z)throw new TypeError("The listener must be a function");var W=new m(Z,X||b,G),c=l?l+d:d;return b._events[c]?b._events[c].fn?b._events[c]=[b._events[c],W]:b._events[c].push(W):(b._events[c]=W,b._eventsCount++),b}function G(b,d){0==--b._eventsCount?b._events=new Z:delete b._events[d]}function W(){this._events=new Z,this._eventsCount=0}Object.create&&(Z.prototype=Object.create(null),(new Z).__proto__||(l=!1)),W.prototype.eventNames=function(){var b,Z,m=[];if(0===this._eventsCount)return m;for(Z in b=this._events)d.call(b,Z)&&m.push(l?Z.slice(1):Z);return Object.getOwnPropertySymbols?m.concat(Object.getOwnPropertySymbols(b)):m},W.prototype.listeners=function(b){var d=l?l+b:b,Z=this._events[d];if(!Z)return[];if(Z.fn)return[Z.fn];for(var m=0,X=Z.length,G=new Array(X);m<X;m++)G[m]=Z[m].fn;return G},W.prototype.listenerCount=function(b){var d=l?l+b:b,Z=this._events[d];return Z?Z.fn?1:Z.length:0},W.prototype.emit=function(b,d,Z,m,X,G){var W=l?l+b:b;if(!this._events[W])return!1;var c,s,K=this._events[W],p=arguments.length;if(K.fn){switch(K.once&&this.removeListener(b,K.fn,void 0,!0),p){case 1:return K.fn.call(K.context),!0;case 2:return K.fn.call(K.context,d),!0;case 3:return K.fn.call(K.context,d,Z),!0;case 4:return K.fn.call(K.context,d,Z,m),!0;case 5:return K.fn.call(K.context,d,Z,m,X),!0;case 6:return K.fn.call(K.context,d,Z,m,X,G),!0}for(s=1,c=new Array(p-1);s<p;s++)c[s-1]=arguments[s];K.fn.apply(K.context,c)}else{var y,i=K.length;for(s=0;s<i;s++)switch(K[s].once&&this.removeListener(b,K[s].fn,void 0,!0),p){case 1:K[s].fn.call(K[s].context);break;case 2:K[s].fn.call(K[s].context,d);break;case 3:K[s].fn.call(K[s].context,d,Z);break;case 4:K[s].fn.call(K[s].context,d,Z,m);break;default:if(!c)for(y=1,c=new Array(p-1);y<p;y++)c[y-1]=arguments[y];K[s].fn.apply(K[s].context,c)}}return!0},W.prototype.on=function(b,d,l){return X(this,b,d,l,!1)},W.prototype.once=function(b,d,l){return X(this,b,d,l,!0)},W.prototype.removeListener=function(b,d,Z,m){var X=l?l+b:b;if(!this._events[X])return this;if(!d)return G(this,X),this;var W=this._events[X];if(W.fn)W.fn!==d||m&&!W.once||Z&&W.context!==Z||G(this,X);else{for(var c=0,s=[],K=W.length;c<K;c++)(W[c].fn!==d||m&&!W[c].once||Z&&W[c].context!==Z)&&s.push(W[c]);s.length?this._events[X]=1===s.length?s[0]:s:G(this,X)}return this},W.prototype.removeAllListeners=function(b){var d;return b?(d=l?l+b:b,this._events[d]&&G(this,d)):(this._events=new Z,this._eventsCount=0),this},W.prototype.off=W.prototype.removeListener,W.prototype.addListener=W.prototype.on,W.prefixed=l,W.EventEmitter=W,b.exports=W}({get exports(){return d},set exports(b){d=b}});var l=d;let Z;return function(){if("nodejs"!=("undefined"!=typeof window&&void 0!==window.document?"browser":"nodejs"))return null;let d=(m="CgogICAgICAgIGxldCB7IHBhcmVudFBvcnQgfSA9IHJlcXVpcmUoJ3dvcmtlcl90aHJlYWRzJykKICAgICAgICAKCnZhciB0PSJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsVGhpcz9nbG9iYWxUaGlzOiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzoidW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbD9nbG9iYWw6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmP3NlbGY6e307ZnVuY3Rpb24gZSh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwiZGVmYXVsdCIpP3QuZGVmYXVsdDp0fXZhciBuPUFycmF5LmlzQXJyYXkscj0ib2JqZWN0Ij09dHlwZW9mIHQmJnQmJnQuT2JqZWN0PT09T2JqZWN0JiZ0LGk9cixvPSJvYmplY3QiPT10eXBlb2Ygc2VsZiYmc2VsZiYmc2VsZi5PYmplY3Q9PT1PYmplY3QmJnNlbGYsbD1pfHxvfHxGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpLGE9bC5TeW1ib2wscz1hLHU9T2JqZWN0LnByb3RvdHlwZSxjPXUuaGFzT3duUHJvcGVydHksZj11LnRvU3RyaW5nLGg9cz9zLnRvU3RyaW5nVGFnOnZvaWQgMDt2YXIgZz1mdW5jdGlvbih0KXt2YXIgZT1jLmNhbGwodCxoKSxuPXRbaF07dHJ5e3RbaF09dm9pZCAwO3ZhciByPSEwfWNhdGNoKHQpe312YXIgaT1mLmNhbGwodCk7cmV0dXJuIHImJihlP3RbaF09bjpkZWxldGUgdFtoXSksaX0sdj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO3ZhciBkPWcscD1mdW5jdGlvbih0KXtyZXR1cm4gdi5jYWxsKHQpfSx5PWE/YS50b1N0cmluZ1RhZzp2b2lkIDA7dmFyIG09ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dm9pZCAwPT09dD8iW29iamVjdCBVbmRlZmluZWRdIjoiW29iamVjdCBOdWxsXSI6eSYmeSBpbiBPYmplY3QodCk/ZCh0KTpwKHQpfTt2YXIgXz1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dCYmIm9iamVjdCI9PXR5cGVvZiB0fSxiPW0seD1fO3ZhciB3PWZ1bmN0aW9uKHQpe3JldHVybiJzeW1ib2wiPT10eXBlb2YgdHx8eCh0KSYmIltvYmplY3QgU3ltYm9sXSI9PWIodCl9LGo9bixTPXcsQT0vXC58XFsoPzpbXltcXV0qfChbIiddKSg/Oig/IVwxKVteXFxdfFxcLikqP1wxKVxdLyxPPS9eXHcqJC87dmFyIE09ZnVuY3Rpb24odCxlKXtpZihqKHQpKXJldHVybiExO3ZhciBuPXR5cGVvZiB0O3JldHVybiEoIm51bWJlciIhPW4mJiJzeW1ib2wiIT1uJiYiYm9vbGVhbiIhPW4mJm51bGwhPXQmJiFTKHQpKXx8KE8udGVzdCh0KXx8IUEudGVzdCh0KXx8bnVsbCE9ZSYmdCBpbiBPYmplY3QoZSkpfTt2YXIgaz1mdW5jdGlvbih0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4gbnVsbCE9dCYmKCJvYmplY3QiPT1lfHwiZnVuY3Rpb24iPT1lKX0sUD1tLEY9azt2YXIgVCx6PWZ1bmN0aW9uKHQpe2lmKCFGKHQpKXJldHVybiExO3ZhciBlPVAodCk7cmV0dXJuIltvYmplY3QgRnVuY3Rpb25dIj09ZXx8IltvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dIj09ZXx8IltvYmplY3QgQXN5bmNGdW5jdGlvbl0iPT1lfHwiW29iamVjdCBQcm94eV0iPT1lfSxJPWxbIl9fY29yZS1qc19zaGFyZWRfXyJdLCQ9KFQ9L1teLl0rJC8uZXhlYyhJJiZJLmtleXMmJkkua2V5cy5JRV9QUk9UT3x8IiIpKT8iU3ltYm9sKHNyYylfMS4iK1Q6IiI7dmFyIEU9ZnVuY3Rpb24odCl7cmV0dXJuISEkJiYkIGluIHR9LE49RnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nO3ZhciBSPWZ1bmN0aW9uKHQpe2lmKG51bGwhPXQpe3RyeXtyZXR1cm4gTi5jYWxsKHQpfWNhdGNoKHQpe310cnl7cmV0dXJuIHQrIiJ9Y2F0Y2godCl7fX1yZXR1cm4iIn0sQz16LEI9RSxVPWssTD1SLEQ9L15cW29iamVjdCAuKz9Db25zdHJ1Y3RvclxdJC8sSD1GdW5jdGlvbi5wcm90b3R5cGUsWD1PYmplY3QucHJvdG90eXBlLFk9SC50b1N0cmluZyxLPVguaGFzT3duUHJvcGVydHksWj1SZWdFeHAoIl4iK1kuY2FsbChLKS5yZXBsYWNlKC9bXFxeJC4qKz8oKVtcXXt9fF0vZywiXFwkJiIpLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFwoKXwgZm9yIC4rPyg/PVxcXF0pL2csIiQxLio/IikrIiQiKTt2YXIgSj1mdW5jdGlvbih0KXtyZXR1cm4hKCFVKHQpfHxCKHQpKSYmKEModCk/WjpEKS50ZXN0KEwodCkpfSxWPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGw9PXQ/dm9pZCAwOnRbZV19O3ZhciBXPWZ1bmN0aW9uKHQsZSl7dmFyIG49Vih0LGUpO3JldHVybiBKKG4pP246dm9pZCAwfSxxPVcoT2JqZWN0LCJjcmVhdGUiKSxHPXE7dmFyIFE9ZnVuY3Rpb24oKXt0aGlzLl9fZGF0YV9fPUc/RyhudWxsKTp7fSx0aGlzLnNpemU9MH07dmFyIHR0PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuaGFzKHQpJiZkZWxldGUgdGhpcy5fX2RhdGFfX1t0XTtyZXR1cm4gdGhpcy5zaXplLT1lPzE6MCxlfSxldD1xLG50PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dmFyIHJ0PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX19kYXRhX187aWYoZXQpe3ZhciBuPWVbdF07cmV0dXJuIl9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iPT09bj92b2lkIDA6bn1yZXR1cm4gbnQuY2FsbChlLHQpP2VbdF06dm9pZCAwfSxpdD1xLG90PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dmFyIGx0PXE7dmFyIGF0PVEsc3Q9dHQsdXQ9cnQsY3Q9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXztyZXR1cm4gaXQ/dm9pZCAwIT09ZVt0XTpvdC5jYWxsKGUsdCl9LGZ0PWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fX2RhdGFfXztyZXR1cm4gdGhpcy5zaXplKz10aGlzLmhhcyh0KT8wOjEsblt0XT1sdCYmdm9pZCAwPT09ZT8iX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyI6ZSx0aGlzfTtmdW5jdGlvbiBodCh0KXt2YXIgZT0tMSxuPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxuOyl7dmFyIHI9dFtlXTt0aGlzLnNldChyWzBdLHJbMV0pfX1odC5wcm90b3R5cGUuY2xlYXI9YXQsaHQucHJvdG90eXBlLmRlbGV0ZT1zdCxodC5wcm90b3R5cGUuZ2V0PXV0LGh0LnByb3RvdHlwZS5oYXM9Y3QsaHQucHJvdG90eXBlLnNldD1mdDt2YXIgZ3Q9aHQ7dmFyIHZ0PWZ1bmN0aW9uKCl7dGhpcy5fX2RhdGFfXz1bXSx0aGlzLnNpemU9MH07dmFyIGR0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PT1lfHx0IT10JiZlIT1lfSxwdD1kdDt2YXIgeXQ9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dC5sZW5ndGg7bi0tOylpZihwdCh0W25dWzBdLGUpKXJldHVybiBuO3JldHVybi0xfSxtdD15dCxfdD1BcnJheS5wcm90b3R5cGUuc3BsaWNlO3ZhciBidD15dDt2YXIgeHQ9eXQ7dmFyIHd0PXl0O3ZhciBqdD12dCxTdD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fLG49bXQoZSx0KTtyZXR1cm4hKG48MCkmJihuPT1lLmxlbmd0aC0xP2UucG9wKCk6X3QuY2FsbChlLG4sMSksLS10aGlzLnNpemUsITApfSxBdD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fLG49YnQoZSx0KTtyZXR1cm4gbjwwP3ZvaWQgMDplW25dWzFdfSxPdD1mdW5jdGlvbih0KXtyZXR1cm4geHQodGhpcy5fX2RhdGFfXyx0KT4tMX0sTXQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9fZGF0YV9fLHI9d3Qobix0KTtyZXR1cm4gcjwwPygrK3RoaXMuc2l6ZSxuLnB1c2goW3QsZV0pKTpuW3JdWzFdPWUsdGhpc307ZnVuY3Rpb24ga3QodCl7dmFyIGU9LTEsbj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8bjspe3ZhciByPXRbZV07dGhpcy5zZXQoclswXSxyWzFdKX19a3QucHJvdG90eXBlLmNsZWFyPWp0LGt0LnByb3RvdHlwZS5kZWxldGU9U3Qsa3QucHJvdG90eXBlLmdldD1BdCxrdC5wcm90b3R5cGUuaGFzPU90LGt0LnByb3RvdHlwZS5zZXQ9TXQ7dmFyIFB0PWt0LEZ0PVcobCwiTWFwIiksVHQ9Z3QsenQ9UHQsSXQ9RnQ7dmFyICR0PWZ1bmN0aW9uKHQpe3ZhciBlPXR5cGVvZiB0O3JldHVybiJzdHJpbmciPT1lfHwibnVtYmVyIj09ZXx8InN5bWJvbCI9PWV8fCJib29sZWFuIj09ZT8iX19wcm90b19fIiE9PXQ6bnVsbD09PXR9O3ZhciBFdD1mdW5jdGlvbih0LGUpe3ZhciBuPXQuX19kYXRhX187cmV0dXJuICR0KGUpP25bInN0cmluZyI9PXR5cGVvZiBlPyJzdHJpbmciOiJoYXNoIl06bi5tYXB9LE50PUV0O3ZhciBSdD1FdDt2YXIgQ3Q9RXQ7dmFyIEJ0PUV0O3ZhciBVdD1mdW5jdGlvbih0LGUpe3ZhciBuPUJ0KHRoaXMsdCkscj1uLnNpemU7cmV0dXJuIG4uc2V0KHQsZSksdGhpcy5zaXplKz1uLnNpemU9PXI/MDoxLHRoaXN9LEx0PWZ1bmN0aW9uKCl7dGhpcy5zaXplPTAsdGhpcy5fX2RhdGFfXz17aGFzaDpuZXcgVHQsbWFwOm5ldyhJdHx8enQpLHN0cmluZzpuZXcgVHR9fSxEdD1mdW5jdGlvbih0KXt2YXIgZT1OdCh0aGlzLHQpLmRlbGV0ZSh0KTtyZXR1cm4gdGhpcy5zaXplLT1lPzE6MCxlfSxIdD1mdW5jdGlvbih0KXtyZXR1cm4gUnQodGhpcyx0KS5nZXQodCl9LFh0PWZ1bmN0aW9uKHQpe3JldHVybiBDdCh0aGlzLHQpLmhhcyh0KX0sWXQ9VXQ7ZnVuY3Rpb24gS3QodCl7dmFyIGU9LTEsbj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8bjspe3ZhciByPXRbZV07dGhpcy5zZXQoclswXSxyWzFdKX19S3QucHJvdG90eXBlLmNsZWFyPUx0LEt0LnByb3RvdHlwZS5kZWxldGU9RHQsS3QucHJvdG90eXBlLmdldD1IdCxLdC5wcm90b3R5cGUuaGFzPVh0LEt0LnByb3RvdHlwZS5zZXQ9WXQ7dmFyIFp0PUt0LEp0PVp0O2Z1bmN0aW9uIFZ0KHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHR8fG51bGwhPWUmJiJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIkV4cGVjdGVkIGEgZnVuY3Rpb24iKTt2YXIgbj1mdW5jdGlvbigpe3ZhciByPWFyZ3VtZW50cyxpPWU/ZS5hcHBseSh0aGlzLHIpOnJbMF0sbz1uLmNhY2hlO2lmKG8uaGFzKGkpKXJldHVybiBvLmdldChpKTt2YXIgbD10LmFwcGx5KHRoaXMscik7cmV0dXJuIG4uY2FjaGU9by5zZXQoaSxsKXx8byxsfTtyZXR1cm4gbi5jYWNoZT1uZXcoVnQuQ2FjaGV8fEp0KSxufVZ0LkNhY2hlPUp0O3ZhciBXdD1WdDt2YXIgcXQ9L1teLltcXV0rfFxbKD86KC0/XGQrKD86XC5cZCspPyl8KFsiJ10pKCg/Oig/IVwyKVteXFxdfFxcLikqPylcMilcXXwoPz0oPzpcLnxcW1xdKSg/OlwufFxbXF18JCkpL2csR3Q9L1xcKFxcKT8vZyxRdD1mdW5jdGlvbih0KXt2YXIgZT1XdCh0LChmdW5jdGlvbih0KXtyZXR1cm4gNTAwPT09bi5zaXplJiZuLmNsZWFyKCksdH0pKSxuPWUuY2FjaGU7cmV0dXJuIGV9KChmdW5jdGlvbih0KXt2YXIgZT1bXTtyZXR1cm4gNDY9PT10LmNoYXJDb2RlQXQoMCkmJmUucHVzaCgiIiksdC5yZXBsYWNlKHF0LChmdW5jdGlvbih0LG4scixpKXtlLnB1c2gocj9pLnJlcGxhY2UoR3QsIiQxIik6bnx8dCl9KSksZX0pKTt2YXIgdGU9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49LTEscj1udWxsPT10PzA6dC5sZW5ndGgsaT1BcnJheShyKTsrK248cjspaVtuXT1lKHRbbl0sbix0KTtyZXR1cm4gaX0sZWU9dGUsbmU9bixyZT13LGllPWE/YS5wcm90b3R5cGU6dm9pZCAwLG9lPWllP2llLnRvU3RyaW5nOnZvaWQgMDt2YXIgbGU9ZnVuY3Rpb24gdChlKXtpZigic3RyaW5nIj09dHlwZW9mIGUpcmV0dXJuIGU7aWYobmUoZSkpcmV0dXJuIGVlKGUsdCkrIiI7aWYocmUoZSkpcmV0dXJuIG9lP29lLmNhbGwoZSk6IiI7dmFyIG49ZSsiIjtyZXR1cm4iMCI9PW4mJjEvZT09LUluZmluaXR5PyItMCI6bn0sYWU9bGU7dmFyIHNlPW4sdWU9TSxjZT1RdCxmZT1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD8iIjphZSh0KX07dmFyIGhlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHNlKHQpP3Q6dWUodCxlKT9bdF06Y2UoZmUodCkpfSxnZT13O3ZhciB2ZT1mdW5jdGlvbih0KXtpZigic3RyaW5nIj09dHlwZW9mIHR8fGdlKHQpKXJldHVybiB0O3ZhciBlPXQrIiI7cmV0dXJuIjAiPT1lJiYxL3Q9PS1JbmZpbml0eT8iLTAiOmV9LGRlPWhlLHBlPXZlO3ZhciB5ZT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0wLHI9KGU9ZGUoZSx0KSkubGVuZ3RoO251bGwhPXQmJm48cjspdD10W3BlKGVbbisrXSldO3JldHVybiBuJiZuPT1yP3Q6dm9pZCAwfSxtZT15ZTt2YXIgX2U9ZnVuY3Rpb24odCxlLG4pe3ZhciByPW51bGw9PXQ/dm9pZCAwOm1lKHQsZSk7cmV0dXJuIHZvaWQgMD09PXI/bjpyfSxiZT1tLHhlPV87dmFyIHdlPWZ1bmN0aW9uKHQpe3JldHVybiEwPT09dHx8ITE9PT10fHx4ZSh0KSYmIltvYmplY3QgQm9vbGVhbl0iPT1iZSh0KX07ZnVuY3Rpb24gamUodCl7cmV0dXJuIHdlKHQpfWZ1bmN0aW9uIFNlKHQpe3JldHVybiJbb2JqZWN0IFN0cmluZ10iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWZ1bmN0aW9uIEFlKHQpe3JldHVybiEoIVNlKHQpfHwiIj09PXQpfXZhciBPZT17fSxNZT17Z2V0IGV4cG9ydHMoKXtyZXR1cm4gT2V9LHNldCBleHBvcnRzKHQpe09lPXR9fTt2YXIga2U9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49LTEscj1udWxsPT10PzA6dC5sZW5ndGg7KytuPHImJiExIT09ZSh0W25dLG4sdCk7KTtyZXR1cm4gdH07dmFyIFBlPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlLG4scil7Zm9yKHZhciBpPS0xLG89T2JqZWN0KGUpLGw9cihlKSxhPWwubGVuZ3RoO2EtLTspe3ZhciBzPWxbdD9hOisraV07aWYoITE9PT1uKG9bc10scyxvKSlicmVha31yZXR1cm4gZX19KCk7dmFyIEZlPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPS0xLHI9QXJyYXkodCk7KytuPHQ7KXJbbl09ZShuKTtyZXR1cm4gcn0sVGU9bSx6ZT1fO3ZhciBJZT1mdW5jdGlvbih0KXtyZXR1cm4gemUodCkmJiJbb2JqZWN0IEFyZ3VtZW50c10iPT1UZSh0KX0sJGU9XyxFZT1PYmplY3QucHJvdG90eXBlLE5lPUVlLmhhc093blByb3BlcnR5LFJlPUVlLnByb3BlcnR5SXNFbnVtZXJhYmxlLENlPUllKGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50c30oKSk/SWU6ZnVuY3Rpb24odCl7cmV0dXJuICRlKHQpJiZOZS5jYWxsKHQsImNhbGxlZSIpJiYhUmUuY2FsbCh0LCJjYWxsZWUiKX0sQmU9e307dmFyIFVlPWZ1bmN0aW9uKCl7cmV0dXJuITF9OyFmdW5jdGlvbih0LGUpe3ZhciBuPWwscj1VZSxpPWUmJiFlLm5vZGVUeXBlJiZlLG89aSYmdCYmIXQubm9kZVR5cGUmJnQsYT1vJiZvLmV4cG9ydHM9PT1pP24uQnVmZmVyOnZvaWQgMCxzPShhP2EuaXNCdWZmZXI6dm9pZCAwKXx8cjt0LmV4cG9ydHM9c30oe2dldCBleHBvcnRzKCl7cmV0dXJuIEJlfSxzZXQgZXhwb3J0cyh0KXtCZT10fX0sQmUpO3ZhciBMZT0vXig/OjB8WzEtOV1cZCopJC87dmFyIERlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dHlwZW9mIHQ7cmV0dXJuISEoZT1udWxsPT1lPzkwMDcxOTkyNTQ3NDA5OTE6ZSkmJigibnVtYmVyIj09bnx8InN5bWJvbCIhPW4mJkxlLnRlc3QodCkpJiZ0Pi0xJiZ0JTE9PTAmJnQ8ZX07dmFyIEhlPWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdCYmdD4tMSYmdCUxPT0wJiZ0PD05MDA3MTk5MjU0NzQwOTkxfSxYZT1tLFllPUhlLEtlPV8sWmU9e307WmVbIltvYmplY3QgRmxvYXQzMkFycmF5XSJdPVplWyJbb2JqZWN0IEZsb2F0NjRBcnJheV0iXT1aZVsiW29iamVjdCBJbnQ4QXJyYXldIl09WmVbIltvYmplY3QgSW50MTZBcnJheV0iXT1aZVsiW29iamVjdCBJbnQzMkFycmF5XSJdPVplWyJbb2JqZWN0IFVpbnQ4QXJyYXldIl09WmVbIltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIl09WmVbIltvYmplY3QgVWludDE2QXJyYXldIl09WmVbIltvYmplY3QgVWludDMyQXJyYXldIl09ITAsWmVbIltvYmplY3QgQXJndW1lbnRzXSJdPVplWyJbb2JqZWN0IEFycmF5XSJdPVplWyJbb2JqZWN0IEFycmF5QnVmZmVyXSJdPVplWyJbb2JqZWN0IEJvb2xlYW5dIl09WmVbIltvYmplY3QgRGF0YVZpZXddIl09WmVbIltvYmplY3QgRGF0ZV0iXT1aZVsiW29iamVjdCBFcnJvcl0iXT1aZVsiW29iamVjdCBGdW5jdGlvbl0iXT1aZVsiW29iamVjdCBNYXBdIl09WmVbIltvYmplY3QgTnVtYmVyXSJdPVplWyJbb2JqZWN0IE9iamVjdF0iXT1aZVsiW29iamVjdCBSZWdFeHBdIl09WmVbIltvYmplY3QgU2V0XSJdPVplWyJbb2JqZWN0IFN0cmluZ10iXT1aZVsiW29iamVjdCBXZWFrTWFwXSJdPSExO3ZhciBKZT1mdW5jdGlvbih0KXtyZXR1cm4gS2UodCkmJlllKHQubGVuZ3RoKSYmISFaZVtYZSh0KV19O3ZhciBWZT1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQoZSl9fSxXZT17fTshZnVuY3Rpb24odCxlKXt2YXIgbj1yLGk9ZSYmIWUubm9kZVR5cGUmJmUsbz1pJiZ0JiYhdC5ub2RlVHlwZSYmdCxsPW8mJm8uZXhwb3J0cz09PWkmJm4ucHJvY2VzcyxhPWZ1bmN0aW9uKCl7dHJ5e3ZhciB0PW8mJm8ucmVxdWlyZSYmby5yZXF1aXJlKCJ1dGlsIikudHlwZXM7cmV0dXJuIHR8fGwmJmwuYmluZGluZyYmbC5iaW5kaW5nKCJ1dGlsIil9Y2F0Y2godCl7fX0oKTt0LmV4cG9ydHM9YX0oe2dldCBleHBvcnRzKCl7cmV0dXJuIFdlfSxzZXQgZXhwb3J0cyh0KXtXZT10fX0sV2UpO3ZhciBxZT1KZSxHZT1WZSxRZT1XZSYmV2UuaXNUeXBlZEFycmF5LHRuPVFlP0dlKFFlKTpxZSxlbj1GZSxubj1DZSxybj1uLG9uPUJlLGxuPURlLGFuPXRuLHNuPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dmFyIHVuPWZ1bmN0aW9uKHQsZSl7dmFyIG49cm4odCkscj0hbiYmbm4odCksaT0hbiYmIXImJm9uKHQpLG89IW4mJiFyJiYhaSYmYW4odCksbD1ufHxyfHxpfHxvLGE9bD9lbih0Lmxlbmd0aCxTdHJpbmcpOltdLHM9YS5sZW5ndGg7Zm9yKHZhciB1IGluIHQpIWUmJiFzbi5jYWxsKHQsdSl8fGwmJigibGVuZ3RoIj09dXx8aSYmKCJvZmZzZXQiPT11fHwicGFyZW50Ij09dSl8fG8mJigiYnVmZmVyIj09dXx8ImJ5dGVMZW5ndGgiPT11fHwiYnl0ZU9mZnNldCI9PXUpfHxsbih1LHMpKXx8YS5wdXNoKHUpO3JldHVybiBhfSxjbj1PYmplY3QucHJvdG90eXBlO3ZhciBmbj1mdW5jdGlvbih0KXt2YXIgZT10JiZ0LmNvbnN0cnVjdG9yO3JldHVybiB0PT09KCJmdW5jdGlvbiI9PXR5cGVvZiBlJiZlLnByb3RvdHlwZXx8Y24pfTt2YXIgaG49ZnVuY3Rpb24odCxlKXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHQoZShuKSl9fShPYmplY3Qua2V5cyxPYmplY3QpLGduPWZuLHZuPWhuLGRuPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dmFyIHBuPWZ1bmN0aW9uKHQpe2lmKCFnbih0KSlyZXR1cm4gdm4odCk7dmFyIGU9W107Zm9yKHZhciBuIGluIE9iamVjdCh0KSlkbi5jYWxsKHQsbikmJiJjb25zdHJ1Y3RvciIhPW4mJmUucHVzaChuKTtyZXR1cm4gZX0seW49eixtbj1IZTt2YXIgX249ZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPXQmJm1uKHQubGVuZ3RoKSYmIXluKHQpfSxibj11bix4bj1wbix3bj1fbjt2YXIgam49ZnVuY3Rpb24odCl7cmV0dXJuIHduKHQpP2JuKHQpOnhuKHQpfSxTbj1QZSxBbj1qbjt2YXIgT249X247dmFyIE1uPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4scil7aWYobnVsbD09bilyZXR1cm4gbjtpZighT24obikpcmV0dXJuIHQobixyKTtmb3IodmFyIGk9bi5sZW5ndGgsbz1lP2k6LTEsbD1PYmplY3Qobik7KGU/by0tOisrbzxpKSYmITEhPT1yKGxbb10sbyxsKTspO3JldHVybiBufX0oKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQmJlNuKHQsZSxBbil9KSk7dmFyIGtuPWZ1bmN0aW9uKHQpe3JldHVybiB0fSxQbj1rbjt2YXIgRm49a2UsVG49TW4sem49ZnVuY3Rpb24odCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpQbn0sSW49bjt2YXIgJG49ZnVuY3Rpb24odCxlKXtyZXR1cm4oSW4odCk/Rm46VG4pKHQsem4oZSkpfTtNZS5leHBvcnRzPSRuO3ZhciBFbj1lKE9lKSxObj1QdDt2YXIgUm49UHQsQ249RnQsQm49WnQ7dmFyIFVuPVB0LExuPWZ1bmN0aW9uKCl7dGhpcy5fX2RhdGFfXz1uZXcgTm4sdGhpcy5zaXplPTB9LERuPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX19kYXRhX18sbj1lLmRlbGV0ZSh0KTtyZXR1cm4gdGhpcy5zaXplPWUuc2l6ZSxufSxIbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5nZXQodCl9LFhuPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLmhhcyh0KX0sWW49ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9fZGF0YV9fO2lmKG4gaW5zdGFuY2VvZiBSbil7dmFyIHI9bi5fX2RhdGFfXztpZighQ258fHIubGVuZ3RoPDE5OSlyZXR1cm4gci5wdXNoKFt0LGVdKSx0aGlzLnNpemU9KytuLnNpemUsdGhpcztuPXRoaXMuX19kYXRhX189bmV3IEJuKHIpfXJldHVybiBuLnNldCh0LGUpLHRoaXMuc2l6ZT1uLnNpemUsdGhpc307ZnVuY3Rpb24gS24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXz1uZXcgVW4odCk7dGhpcy5zaXplPWUuc2l6ZX1Lbi5wcm90b3R5cGUuY2xlYXI9TG4sS24ucHJvdG90eXBlLmRlbGV0ZT1EbixLbi5wcm90b3R5cGUuZ2V0PUhuLEtuLnByb3RvdHlwZS5oYXM9WG4sS24ucHJvdG90eXBlLnNldD1Zbjt2YXIgWm49S247dmFyIEpuPVp0LFZuPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLnNldCh0LCJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIiksdGhpc30sV249ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKHQpfTtmdW5jdGlvbiBxbih0KXt2YXIgZT0tMSxuPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5fX2RhdGFfXz1uZXcgSm47KytlPG47KXRoaXMuYWRkKHRbZV0pfXFuLnByb3RvdHlwZS5hZGQ9cW4ucHJvdG90eXBlLnB1c2g9Vm4scW4ucHJvdG90eXBlLmhhcz1Xbjt2YXIgR249cW4sUW49ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49LTEscj1udWxsPT10PzA6dC5sZW5ndGg7KytuPHI7KWlmKGUodFtuXSxuLHQpKXJldHVybiEwO3JldHVybiExfSx0cj1mdW5jdGlvbih0LGUpe3JldHVybiB0LmhhcyhlKX07dmFyIGVyPWZ1bmN0aW9uKHQsZSxuLHIsaSxvKXt2YXIgbD0xJm4sYT10Lmxlbmd0aCxzPWUubGVuZ3RoO2lmKGEhPXMmJiEobCYmcz5hKSlyZXR1cm4hMTt2YXIgdT1vLmdldCh0KSxjPW8uZ2V0KGUpO2lmKHUmJmMpcmV0dXJuIHU9PWUmJmM9PXQ7dmFyIGY9LTEsaD0hMCxnPTImbj9uZXcgR246dm9pZCAwO2ZvcihvLnNldCh0LGUpLG8uc2V0KGUsdCk7KytmPGE7KXt2YXIgdj10W2ZdLGQ9ZVtmXTtpZihyKXZhciBwPWw/cihkLHYsZixlLHQsbyk6cih2LGQsZix0LGUsbyk7aWYodm9pZCAwIT09cCl7aWYocCljb250aW51ZTtoPSExO2JyZWFrfWlmKGcpe2lmKCFRbihlLChmdW5jdGlvbih0LGUpe2lmKCF0cihnLGUpJiYodj09PXR8fGkodix0LG4scixvKSkpcmV0dXJuIGcucHVzaChlKX0pKSl7aD0hMTticmVha319ZWxzZSBpZih2IT09ZCYmIWkodixkLG4scixvKSl7aD0hMTticmVha319cmV0dXJuIG8uZGVsZXRlKHQpLG8uZGVsZXRlKGUpLGh9O3ZhciBucj1mdW5jdGlvbih0KXt2YXIgZT0tMSxuPUFycmF5KHQuc2l6ZSk7cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCxyKXtuWysrZV09W3IsdF19KSksbn07dmFyIHJyPWwuVWludDhBcnJheSxpcj1kdCxvcj1lcixscj1ucixhcj1mdW5jdGlvbih0KXt2YXIgZT0tMSxuPUFycmF5KHQuc2l6ZSk7cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCl7blsrK2VdPXR9KSksbn0sc3I9YT9hLnByb3RvdHlwZTp2b2lkIDAsdXI9c3I/c3IudmFsdWVPZjp2b2lkIDA7dmFyIGNyPWZ1bmN0aW9uKHQsZSxuLHIsaSxvLGwpe3N3aXRjaChuKXtjYXNlIltvYmplY3QgRGF0YVZpZXddIjppZih0LmJ5dGVMZW5ndGghPWUuYnl0ZUxlbmd0aHx8dC5ieXRlT2Zmc2V0IT1lLmJ5dGVPZmZzZXQpcmV0dXJuITE7dD10LmJ1ZmZlcixlPWUuYnVmZmVyO2Nhc2UiW29iamVjdCBBcnJheUJ1ZmZlcl0iOnJldHVybiEodC5ieXRlTGVuZ3RoIT1lLmJ5dGVMZW5ndGh8fCFvKG5ldyBycih0KSxuZXcgcnIoZSkpKTtjYXNlIltvYmplY3QgQm9vbGVhbl0iOmNhc2UiW29iamVjdCBEYXRlXSI6Y2FzZSJbb2JqZWN0IE51bWJlcl0iOnJldHVybiBpcigrdCwrZSk7Y2FzZSJbb2JqZWN0IEVycm9yXSI6cmV0dXJuIHQubmFtZT09ZS5uYW1lJiZ0Lm1lc3NhZ2U9PWUubWVzc2FnZTtjYXNlIltvYmplY3QgUmVnRXhwXSI6Y2FzZSJbb2JqZWN0IFN0cmluZ10iOnJldHVybiB0PT1lKyIiO2Nhc2UiW29iamVjdCBNYXBdIjp2YXIgYT1scjtjYXNlIltvYmplY3QgU2V0XSI6dmFyIHM9MSZyO2lmKGF8fChhPWFyKSx0LnNpemUhPWUuc2l6ZSYmIXMpcmV0dXJuITE7dmFyIHU9bC5nZXQodCk7aWYodSlyZXR1cm4gdT09ZTtyfD0yLGwuc2V0KHQsZSk7dmFyIGM9b3IoYSh0KSxhKGUpLHIsaSxvLGwpO3JldHVybiBsLmRlbGV0ZSh0KSxjO2Nhc2UiW29iamVjdCBTeW1ib2xdIjppZih1cilyZXR1cm4gdXIuY2FsbCh0KT09dXIuY2FsbChlKX1yZXR1cm4hMX07dmFyIGZyPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPS0xLHI9ZS5sZW5ndGgsaT10Lmxlbmd0aDsrK248cjspdFtpK25dPWVbbl07cmV0dXJuIHR9LGhyPWZyLGdyPW47dmFyIHZyPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1lKHQpO3JldHVybiBncih0KT9yOmhyKHIsbih0KSl9O3ZhciBkcj1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0tMSxyPW51bGw9PXQ/MDp0Lmxlbmd0aCxpPTAsbz1bXTsrK248cjspe3ZhciBsPXRbbl07ZShsLG4sdCkmJihvW2krK109bCl9cmV0dXJuIG99O3ZhciBwcj1kcix5cj1mdW5jdGlvbigpe3JldHVybltdfSxtcj1PYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLF9yPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsYnI9dnIseHI9X3I/ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/W106KHQ9T2JqZWN0KHQpLHByKF9yKHQpLChmdW5jdGlvbihlKXtyZXR1cm4gbXIuY2FsbCh0LGUpfSkpKX06eXIsd3I9am47dmFyIGpyPWZ1bmN0aW9uKHQpe3JldHVybiBicih0LHdyLHhyKX0sU3I9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt2YXIgQXI9ZnVuY3Rpb24odCxlLG4scixpLG8pe3ZhciBsPTEmbixhPWpyKHQpLHM9YS5sZW5ndGg7aWYocyE9anIoZSkubGVuZ3RoJiYhbClyZXR1cm4hMTtmb3IodmFyIHU9czt1LS07KXt2YXIgYz1hW3VdO2lmKCEobD9jIGluIGU6U3IuY2FsbChlLGMpKSlyZXR1cm4hMX12YXIgZj1vLmdldCh0KSxoPW8uZ2V0KGUpO2lmKGYmJmgpcmV0dXJuIGY9PWUmJmg9PXQ7dmFyIGc9ITA7by5zZXQodCxlKSxvLnNldChlLHQpO2Zvcih2YXIgdj1sOysrdTxzOyl7dmFyIGQ9dFtjPWFbdV1dLHA9ZVtjXTtpZihyKXZhciB5PWw/cihwLGQsYyxlLHQsbyk6cihkLHAsYyx0LGUsbyk7aWYoISh2b2lkIDA9PT15P2Q9PT1wfHxpKGQscCxuLHIsbyk6eSkpe2c9ITE7YnJlYWt9dnx8KHY9ImNvbnN0cnVjdG9yIj09Yyl9aWYoZyYmIXYpe3ZhciBtPXQuY29uc3RydWN0b3IsXz1lLmNvbnN0cnVjdG9yO209PV98fCEoImNvbnN0cnVjdG9yImluIHQpfHwhKCJjb25zdHJ1Y3RvciJpbiBlKXx8ImZ1bmN0aW9uIj09dHlwZW9mIG0mJm0gaW5zdGFuY2VvZiBtJiYiZnVuY3Rpb24iPT10eXBlb2YgXyYmXyBpbnN0YW5jZW9mIF98fChnPSExKX1yZXR1cm4gby5kZWxldGUodCksby5kZWxldGUoZSksZ30sT3I9VyhsLCJEYXRhVmlldyIpLE1yPUZ0LGtyPVcobCwiUHJvbWlzZSIpLFByPVcobCwiU2V0IiksRnI9VyhsLCJXZWFrTWFwIiksVHI9bSx6cj1SLElyPSJbb2JqZWN0IE1hcF0iLCRyPSJbb2JqZWN0IFByb21pc2VdIixFcj0iW29iamVjdCBTZXRdIixOcj0iW29iamVjdCBXZWFrTWFwXSIsUnI9IltvYmplY3QgRGF0YVZpZXddIixDcj16cihPciksQnI9enIoTXIpLFVyPXpyKGtyKSxMcj16cihQciksRHI9enIoRnIpLEhyPVRyOyhPciYmSHIobmV3IE9yKG5ldyBBcnJheUJ1ZmZlcigxKSkpIT1Scnx8TXImJkhyKG5ldyBNcikhPUlyfHxrciYmSHIoa3IucmVzb2x2ZSgpKSE9JHJ8fFByJiZIcihuZXcgUHIpIT1Fcnx8RnImJkhyKG5ldyBGcikhPU5yKSYmKEhyPWZ1bmN0aW9uKHQpe3ZhciBlPVRyKHQpLG49IltvYmplY3QgT2JqZWN0XSI9PWU/dC5jb25zdHJ1Y3Rvcjp2b2lkIDAscj1uP3pyKG4pOiIiO2lmKHIpc3dpdGNoKHIpe2Nhc2UgQ3I6cmV0dXJuIFJyO2Nhc2UgQnI6cmV0dXJuIElyO2Nhc2UgVXI6cmV0dXJuICRyO2Nhc2UgTHI6cmV0dXJuIEVyO2Nhc2UgRHI6cmV0dXJuIE5yfXJldHVybiBlfSk7dmFyIFhyPUhyLFlyPVpuLEtyPWVyLFpyPWNyLEpyPUFyLFZyPVhyLFdyPW4scXI9QmUsR3I9dG4sUXI9IltvYmplY3QgQXJndW1lbnRzXSIsdGk9IltvYmplY3QgQXJyYXldIixlaT0iW29iamVjdCBPYmplY3RdIixuaT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3ZhciByaT1mdW5jdGlvbih0LGUsbixyLGksbyl7dmFyIGw9V3IodCksYT1XcihlKSxzPWw/dGk6VnIodCksdT1hP3RpOlZyKGUpLGM9KHM9cz09UXI/ZWk6cyk9PWVpLGY9KHU9dT09UXI/ZWk6dSk9PWVpLGg9cz09dTtpZihoJiZxcih0KSl7aWYoIXFyKGUpKXJldHVybiExO2w9ITAsYz0hMX1pZihoJiYhYylyZXR1cm4gb3x8KG89bmV3IFlyKSxsfHxHcih0KT9Lcih0LGUsbixyLGksbyk6WnIodCxlLHMsbixyLGksbyk7aWYoISgxJm4pKXt2YXIgZz1jJiZuaS5jYWxsKHQsIl9fd3JhcHBlZF9fIiksdj1mJiZuaS5jYWxsKGUsIl9fd3JhcHBlZF9fIik7aWYoZ3x8dil7dmFyIGQ9Zz90LnZhbHVlKCk6dCxwPXY/ZS52YWx1ZSgpOmU7cmV0dXJuIG98fChvPW5ldyBZciksaShkLHAsbixyLG8pfX1yZXR1cm4hIWgmJihvfHwobz1uZXcgWXIpLEpyKHQsZSxuLHIsaSxvKSl9LGlpPV87dmFyIG9pPWZ1bmN0aW9uIHQoZSxuLHIsaSxvKXtyZXR1cm4gZT09PW58fChudWxsPT1lfHxudWxsPT1ufHwhaWkoZSkmJiFpaShuKT9lIT1lJiZuIT1uOnJpKGUsbixyLGksdCxvKSl9LGxpPVpuLGFpPW9pO3ZhciBzaT1rO3ZhciB1aT1mdW5jdGlvbih0KXtyZXR1cm4gdD09dCYmIXNpKHQpfSxjaT11aSxmaT1qbjt2YXIgaGk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIG51bGwhPW4mJihuW3RdPT09ZSYmKHZvaWQgMCE9PWV8fHQgaW4gT2JqZWN0KG4pKSl9fSxnaT1mdW5jdGlvbih0LGUsbixyKXt2YXIgaT1uLmxlbmd0aCxvPWksbD0hcjtpZihudWxsPT10KXJldHVybiFvO2Zvcih0PU9iamVjdCh0KTtpLS07KXt2YXIgYT1uW2ldO2lmKGwmJmFbMl0/YVsxXSE9PXRbYVswXV06IShhWzBdaW4gdCkpcmV0dXJuITF9Zm9yKDsrK2k8bzspe3ZhciBzPShhPW5baV0pWzBdLHU9dFtzXSxjPWFbMV07aWYobCYmYVsyXSl7aWYodm9pZCAwPT09dSYmIShzIGluIHQpKXJldHVybiExfWVsc2V7dmFyIGY9bmV3IGxpO2lmKHIpdmFyIGg9cih1LGMscyx0LGUsZik7aWYoISh2b2lkIDA9PT1oP2FpKGMsdSwzLHIsZik6aCkpcmV0dXJuITF9fXJldHVybiEwfSx2aT1mdW5jdGlvbih0KXtmb3IodmFyIGU9ZmkodCksbj1lLmxlbmd0aDtuLS07KXt2YXIgcj1lW25dLGk9dFtyXTtlW25dPVtyLGksY2koaSldfXJldHVybiBlfSxkaT1oaTt2YXIgcGk9aGUseWk9Q2UsbWk9bixfaT1EZSxiaT1IZSx4aT12ZTt2YXIgd2k9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbCE9dCYmZSBpbiBPYmplY3QodCl9LGppPWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHI9LTEsaT0oZT1waShlLHQpKS5sZW5ndGgsbz0hMTsrK3I8aTspe3ZhciBsPXhpKGVbcl0pO2lmKCEobz1udWxsIT10JiZuKHQsbCkpKWJyZWFrO3Q9dFtsXX1yZXR1cm4gb3x8KytyIT1pP286ISEoaT1udWxsPT10PzA6dC5sZW5ndGgpJiZiaShpKSYmX2kobCxpKSYmKG1pKHQpfHx5aSh0KSl9O3ZhciBTaT1vaSxBaT1fZSxPaT1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsIT10JiZqaSh0LGUsd2kpfSxNaT1NLGtpPXVpLFBpPWhpLEZpPXZlO3ZhciBUaT1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/dm9pZCAwOmVbdF19fSx6aT15ZTt2YXIgSWk9VGksJGk9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB6aShlLHQpfX0sRWk9TSxOaT12ZTt2YXIgUmk9ZnVuY3Rpb24odCl7dmFyIGU9dmkodCk7cmV0dXJuIDE9PWUubGVuZ3RoJiZlWzBdWzJdP2RpKGVbMF1bMF0sZVswXVsxXSk6ZnVuY3Rpb24obil7cmV0dXJuIG49PT10fHxnaShuLHQsZSl9fSxDaT1mdW5jdGlvbih0LGUpe3JldHVybiBNaSh0KSYma2koZSk/UGkoRmkodCksZSk6ZnVuY3Rpb24obil7dmFyIHI9QWkobix0KTtyZXR1cm4gdm9pZCAwPT09ciYmcj09PWU/T2kobix0KTpTaShlLHIsMyl9fSxCaT1rbixVaT1uLExpPWZ1bmN0aW9uKHQpe3JldHVybiBFaSh0KT9JaShOaSh0KSk6JGkodCl9O3ZhciBEaT1mdW5jdGlvbih0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD90Om51bGw9PXQ/Qmk6Im9iamVjdCI9PXR5cGVvZiB0P1VpKHQpP0NpKHRbMF0sdFsxXSk6UmkodCk6TGkodCl9LEhpPU1uLFhpPV9uO3ZhciBZaT10ZSxLaT1EaSxaaT1mdW5jdGlvbih0LGUpe3ZhciBuPS0xLHI9WGkodCk/QXJyYXkodC5sZW5ndGgpOltdO3JldHVybiBIaSh0LChmdW5jdGlvbih0LGksbyl7clsrK25dPWUodCxpLG8pfSkpLHJ9LEppPW47dmFyIFZpPWZ1bmN0aW9uKHQsZSl7cmV0dXJuKEppKHQpP1lpOlppKSh0LEtpKGUpKX07dmFyIFdpPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuLHI9LTEsaT10Lmxlbmd0aDsrK3I8aTspe3ZhciBvPWUodFtyXSk7dm9pZCAwIT09byYmKG49dm9pZCAwPT09bj9vOm4rbyl9cmV0dXJuIG59LHFpPVdpLEdpPWtuO3ZhciBRaT1mdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5sZW5ndGg/cWkodCxHaSk6MH0sdG89bSxlbz1uLG5vPV87dmFyIHJvPWZ1bmN0aW9uKHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdHx8IWVvKHQpJiZubyh0KSYmIltvYmplY3QgU3RyaW5nXSI9PXRvKHQpfSxpbz1UaSgibGVuZ3RoIiksb289UmVnRXhwKCJbXFx1MjAwZFxcdWQ4MDAtXFx1ZGZmZlxcdTAzMDAtXFx1MDM2ZlxcdWZlMjAtXFx1ZmUyZlxcdTIwZDAtXFx1MjBmZlxcdWZlMGVcXHVmZTBmXSIpO3ZhciBsbz1mdW5jdGlvbih0KXtyZXR1cm4gb28udGVzdCh0KX0sYW89IlxcdWQ4MDAtXFx1ZGZmZiIsc289IlsiK2FvKyJdIix1bz0iW1xcdTAzMDAtXFx1MDM2ZlxcdWZlMjAtXFx1ZmUyZlxcdTIwZDAtXFx1MjBmZl0iLGNvPSJcXHVkODNjW1xcdWRmZmItXFx1ZGZmZl0iLGZvPSJbXiIrYW8rIl0iLGhvPSIoPzpcXHVkODNjW1xcdWRkZTYtXFx1ZGRmZl0pezJ9Iixnbz0iW1xcdWQ4MDAtXFx1ZGJmZl1bXFx1ZGMwMC1cXHVkZmZmXSIsdm89Iig/OiIrdW8rInwiK2NvKyIpIisiPyIscG89IltcXHVmZTBlXFx1ZmUwZl0/Iix5bz1wbyt2bysoIig/OlxcdTIwMGQoPzoiK1tmbyxobyxnb10uam9pbigifCIpKyIpIitwbyt2bysiKSoiKSxtbz0iKD86IitbZm8rdW8rIj8iLHVvLGhvLGdvLHNvXS5qb2luKCJ8IikrIikiLF9vPVJlZ0V4cChjbysiKD89IitjbysiKXwiK21vK3lvLCJnIik7dmFyIGJvPWlvLHhvPWxvLHdvPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1fby5sYXN0SW5kZXg9MDtfby50ZXN0KHQpOykrK2U7cmV0dXJuIGV9O3ZhciBqbz1wbixTbz1YcixBbz1fbixPbz1ybyxNbz1mdW5jdGlvbih0KXtyZXR1cm4geG8odCk/d28odCk6Ym8odCl9O3ZhciBrbz1mdW5jdGlvbih0KXtpZihudWxsPT10KXJldHVybiAwO2lmKEFvKHQpKXJldHVybiBPbyh0KT9Nbyh0KTp0Lmxlbmd0aDt2YXIgZT1Tbyh0KTtyZXR1cm4iW29iamVjdCBNYXBdIj09ZXx8IltvYmplY3QgU2V0XSI9PWU/dC5zaXplOmpvKHQpLmxlbmd0aH0sUG89bSxGbz1fO3ZhciBUbz1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHR8fEZvKHQpJiYiW29iamVjdCBOdW1iZXJdIj09UG8odCl9O2Z1bmN0aW9uIHpvKHQpe3JldHVybiJbb2JqZWN0IE9iamVjdF0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWZ1bmN0aW9uIElvKHQpe2lmKHpvKHQpKXtmb3IobGV0IGUgaW4gdClyZXR1cm4hMDtyZXR1cm4hMX1yZXR1cm4hMX1mdW5jdGlvbiAkbyh0KXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWZ1bmN0aW9uIEVvKHQpe3JldHVybiEhZnVuY3Rpb24odCl7cmV0dXJuIltvYmplY3QgVW5kZWZpbmVkXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9KHQpfHwoISFmdW5jdGlvbih0KXtyZXR1cm4iW29iamVjdCBOdWxsXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9KHQpfHwoISFmdW5jdGlvbih0KXtpZih6byh0KSl7Zm9yKGxldCBlIGluIHQpcmV0dXJuITE7cmV0dXJuITB9cmV0dXJuITF9KHQpfHwoISFmdW5jdGlvbih0KXtyZXR1cm4hKCFTZSh0KXx8IiIhPT10KX0odCl8fCEhZnVuY3Rpb24odCl7cmV0dXJuISEkbyh0KSYmMD09PXQubGVuZ3RofSh0KSkpKX1mdW5jdGlvbiBObyh0KXtyZXR1cm4hISRvKHQpJiYoMCE9PXQubGVuZ3RoJiYoMSE9PXQubGVuZ3RofHwhRW8odFswXSkpKX1mdW5jdGlvbiBSbyh0KXtsZXQgZT0hMTtyZXR1cm4gQWUodCk/ZT0haXNOYU4oTnVtYmVyKHQpKTpmdW5jdGlvbih0KXtyZXR1cm4iW29iamVjdCBOdW1iZXJdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX0odCkmJihlPSEwKSxlfWZ1bmN0aW9uIENvKHQpe2xldCBlPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KTtyZXR1cm4iW29iamVjdCBGdW5jdGlvbl0iPT09ZXx8IltvYmplY3QgQXN5bmNGdW5jdGlvbl0iPT09ZX12YXIgQm89L1xzLzt2YXIgVW89ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQubGVuZ3RoO2UtLSYmQm8udGVzdCh0LmNoYXJBdChlKSk7KTtyZXR1cm4gZX0sTG89L15ccysvO3ZhciBEbz1mdW5jdGlvbih0KXtyZXR1cm4gdD90LnNsaWNlKDAsVW8odCkrMSkucmVwbGFjZShMbywiIik6dH0sSG89ayxYbz13LFlvPS9eWy0rXTB4WzAtOWEtZl0rJC9pLEtvPS9eMGJbMDFdKyQvaSxabz0vXjBvWzAtN10rJC9pLEpvPXBhcnNlSW50O3ZhciBWbz1mdW5jdGlvbih0KXtpZigibnVtYmVyIj09dHlwZW9mIHQpcmV0dXJuIHQ7aWYoWG8odCkpcmV0dXJuIE5hTjtpZihIbyh0KSl7dmFyIGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQudmFsdWVPZj90LnZhbHVlT2YoKTp0O3Q9SG8oZSk/ZSsiIjplfWlmKCJzdHJpbmciIT10eXBlb2YgdClyZXR1cm4gMD09PXQ/dDordDt0PURvKHQpO3ZhciBuPUtvLnRlc3QodCk7cmV0dXJuIG58fFpvLnRlc3QodCk/Sm8odC5zbGljZSgyKSxuPzI6OCk6WW8udGVzdCh0KT9OYU46K3R9LFdvPVZvLHFvPTEvMDt2YXIgR289ZnVuY3Rpb24odCl7cmV0dXJuIHQ/KHQ9V28odCkpPT09cW98fHQ9PT0tMS8wPzE3OTc2OTMxMzQ4NjIzMTU3ZTI5MioodDwwPy0xOjEpOnQ9PXQ/dDowOjA9PT10P3Q6MH07ZnVuY3Rpb24gUW8odCl7aWYoIVJvKHQpKXJldHVybiAwO3JldHVybiBHbyh0KX1mdW5jdGlvbiB0bCh0LGUpe3JldHVybiEhem8odCkmJighKCFBZShlKSYmIVJvKGUpKSYmZSBpbiB0KX1mdW5jdGlvbiBlbCh0LGU9e30pe2lmKGtvKHQpPD0wKXJldHVybltdO2xldCBuPV9lKGUsImtleVgiKTtBZShuKXx8KG49IngiKTtsZXQgcj1fZShlLCJrZXlZIik7QWUocil8fChyPSJ5Iik7bGV0IGk9X2UoZSwia2V5SW5kIiwiIik7QWUoaSl8fChpPSJpbmQiKTtsZXQgbz1bXTtyZXR1cm4gRW4odCwoKHQsZSk9PntsZXQgbD1udWxsLGE9bnVsbDskbyh0KSYma28odCk+PTI/KGw9X2UodCwwKSxhPV9lKHQsMSkpOihsPV9lKHQsbixudWxsKSxhPV9lKHQscixudWxsKSksUm8obCkmJlJvKGEpJiYobD1WbyhsKSxhPVZvKGEpLG8ucHVzaCh7eDpsLHk6YSxbaV06ZX0pKX0pKSxvfWZ1bmN0aW9uIG5sKHQsZT17fSl7aWYoa28odCk8PTApcmV0dXJuW107bGV0IG49X2UoZSwia2V5WCIpO0FlKG4pfHwobj0ieCIpO2xldCByPV9lKGUsImtleVkiKTtBZShyKXx8KHI9InkiKTtsZXQgaT1fZShlLCJrZXlaIiwiIik7QWUoaSl8fChpPSJ6Iik7bGV0IG89X2UoZSwia2V5SW5kIiwiIik7QWUobyl8fChvPSJpbmQiKTtsZXQgbD1bXTtyZXR1cm4gRW4odCwoKHQsZSk9PntsZXQgYT1udWxsLHM9bnVsbCx1PW51bGw7JG8odCkmJmtvKHQpPj0zPyhhPV9lKHQsMCkscz1fZSh0LDEpLHU9X2UodCwyKSk6KGE9X2UodCxuLG51bGwpLHM9X2UodCxyLG51bGwpLHU9X2UodCxpLG51bGwpKSxSbyhhKSYmUm8ocykmJlJvKHUpJiYoYT1WbyhhKSxzPVZvKHMpLHU9Vm8odSksbC5wdXNoKHt4OmEseTpzLHo6dSxbb106ZX0pKX0pKSxsfXZhciBybD13O3ZhciBpbD1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPS0xLGk9dC5sZW5ndGg7KytyPGk7KXt2YXIgbz10W3JdLGw9ZShvKTtpZihudWxsIT1sJiYodm9pZCAwPT09YT9sPT1sJiYhcmwobCk6bihsLGEpKSl2YXIgYT1sLHM9b31yZXR1cm4gc307dmFyIG9sPWlsLGxsPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ8ZX0sYWw9a247dmFyIHNsPWZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0Lmxlbmd0aD9vbCh0LGFsLGxsKTp2b2lkIDB9O3ZhciB1bD1pbCxjbD1mdW5jdGlvbih0LGUpe3JldHVybiB0PmV9LGZsPWtuO3ZhciBobD1mdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5sZW5ndGg/dWwodCxmbCxjbCk6dm9pZCAwfTtmdW5jdGlvbiBnbCh0KXtyZXR1cm4gZ2w9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIHR9LGdsKHQpfWZ1bmN0aW9uIHZsKHQpe3ZhciBlPWZ1bmN0aW9uKHQsZSl7aWYoIm9iamVjdCIhPT1nbCh0KXx8bnVsbD09PXQpcmV0dXJuIHQ7dmFyIG49dFtTeW1ib2wudG9QcmltaXRpdmVdO2lmKHZvaWQgMCE9PW4pe3ZhciByPW4uY2FsbCh0LGV8fCJkZWZhdWx0Iik7aWYoIm9iamVjdCIhPT1nbChyKSlyZXR1cm4gcjt0aHJvdyBuZXcgVHlwZUVycm9yKCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLiIpfXJldHVybigic3RyaW5nIj09PWU/U3RyaW5nOk51bWJlcikodCl9KHQsInN0cmluZyIpO3JldHVybiJzeW1ib2wiPT09Z2woZSk/ZTpTdHJpbmcoZSl9ZnVuY3Rpb24gZGwodCxlLG4pe3JldHVybihlPXZsKGUpKWluIHQ/T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7dmFsdWU6bixlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOnRbZV09bix0fXZhciBwbD1Nbjt2YXIgeWw9ZHIsbWw9ZnVuY3Rpb24odCxlKXt2YXIgbj1bXTtyZXR1cm4gcGwodCwoZnVuY3Rpb24odCxyLGkpe2UodCxyLGkpJiZuLnB1c2godCl9KSksbn0sX2w9RGksYmw9bjt2YXIgeGw9ZnVuY3Rpb24odCxlKXtyZXR1cm4oYmwodCk/eWw6bWwpKHQsX2woZSkpfSx3bD1NYXRoLmNlaWwsamw9TWF0aC5tYXg7dmFyIFNsPWR0LEFsPV9uLE9sPURlLE1sPWs7dmFyIGtsPWZ1bmN0aW9uKHQsZSxuLHIpe2Zvcih2YXIgaT0tMSxvPWpsKHdsKChlLXQpLyhufHwxKSksMCksbD1BcnJheShvKTtvLS07KWxbcj9vOisraV09dCx0Kz1uO3JldHVybiBsfSxQbD1mdW5jdGlvbih0LGUsbil7aWYoIU1sKG4pKXJldHVybiExO3ZhciByPXR5cGVvZiBlO3JldHVybiEhKCJudW1iZXIiPT1yP0FsKG4pJiZPbChlLG4ubGVuZ3RoKToic3RyaW5nIj09ciYmZSBpbiBuKSYmU2wobltlXSx0KX0sRmw9R287dmFyIFRsPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlLG4scil7cmV0dXJuIHImJiJudW1iZXIiIT10eXBlb2YgciYmUGwoZSxuLHIpJiYobj1yPXZvaWQgMCksZT1GbChlKSx2b2lkIDA9PT1uPyhuPWUsZT0wKTpuPUZsKG4pLHI9dm9pZCAwPT09cj9lPG4/MTotMTpGbChyKSxrbChlLG4scix0KX19KCksemw9V2k7dmFyIElsPWZ1bmN0aW9uKHQsZSl7dmFyIG49bnVsbD09dD8wOnQubGVuZ3RoO3JldHVybiBuP3psKHQsZSkvbjpOYU59LCRsPWtuO3ZhciBFbD1mdW5jdGlvbih0KXtyZXR1cm4gSWwodCwkbCl9O2Z1bmN0aW9uIE5sKHQsZSl7dmFyIG49T2JqZWN0LmtleXModCk7aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIHI9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0KTtlJiYocj1yLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxlKS5lbnVtZXJhYmxlfSkpKSxuLnB1c2guYXBwbHkobixyKX1yZXR1cm4gbn1mdW5jdGlvbiBSbCh0KXtpZighTm8odCkpcmV0dXJue2VycjoiYXJyIGlzIG5vdCBhbiBlZmZlY3RpdmUgYXJyYXkifTtsZXQgZT1fZSh0LDApLG49MDtObyhlKSYmKG49a28oZSkpO2xldCByPVtdO2lmKDA9PT1uPyhyPXhsKHQsUm8pLHI9VmkocixRbykpOkVuKHQsKHQ9PntsZXQgZT0hMCxpPVtdO0VuKFRsKG4pLChuPT57bGV0IHI9X2UodCxuKTtSbyhyKXx8KGU9ITEpLGkucHVzaChRbyhyKSl9KSksZSYmci5wdXNoKGkpfSkpLDA9PT1rbyhyKSlyZXR1cm57ZXJyOiJhcnIgaGFzIG5vIGVmZmVjdGl2ZSBkYXRhIn07bGV0IGk9dD0+e2xldCBlPSh0PT57bGV0IGU9c2wodCksbj1obCh0KTtyZXR1cm57bWluOmUsbWF4Om4scmFuZ2U6bi1lLG1pZDoobitlKS8yLGF2ZzpFbCh0KX19KSh0KSxuPSgodCxlLG4scik9PlZpKHQsKHQ9Pih0LWUpL3IpKSkodCxlLm1pbixlLm1heCxlLnJhbmdlKTtyZXR1cm4gZnVuY3Rpb24odCl7Zm9yKHZhciBlPTE7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl7dmFyIG49bnVsbCE9YXJndW1lbnRzW2VdP2FyZ3VtZW50c1tlXTp7fTtlJTI/TmwoT2JqZWN0KG4pLCEwKS5mb3JFYWNoKChmdW5jdGlvbihlKXtkbCh0LGUsbltlXSl9KSk6T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM/T2JqZWN0LmRlZmluZVByb3BlcnRpZXModCxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhuKSk6TmwoT2JqZWN0KG4pKS5mb3JFYWNoKChmdW5jdGlvbihlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobixlKSl9KSl9cmV0dXJuIHR9KHthcnI6bn0sZSl9LG89bnVsbDtyZXR1cm4gbz0wPT09bj9pKHIpOlZpKFRsKG4pLCh0PT57bGV0IGU9Vmkocix0KTtyZXR1cm4gaShlKX0pKSxvfWZ1bmN0aW9uIENsKHQsZT1bXSl7aWYoIU5vKHQpKXJldHVybntlcnI6ImFyciBpcyBub3QgYW4gZWZmZWN0aXZlIGFycmF5In07aWYoa28oZSk+MCl7aWYoIUlvKF9lKHQsMCkpKXJldHVybntlcnI6ImFyciBpcyBub3QgYW4gZWZmZWN0aXZlIGFycmF5IG9mIG9iamVjdHMifTtsZXQgbj1bXTtFbih0LCh0PT57bGV0IHI9W107RW4oZSwoZT0+e3IucHVzaChfZSh0LGUsIiIpKX0pKSxuLnB1c2gocil9KSksdD1ufXJldHVybiBSbCh0KX1mdW5jdGlvbiBCbCh0LGU9e30pe2xldCBuPV9lKGUsImtleVgiKTtBZShuKXx8KG49IngiKTtsZXQgcj1fZShlLCJrZXlZIik7QWUocil8fChyPSJ5Iik7bGV0IGk9X2UoZSwia2V5WiIsIiIpO0FlKGkpfHwoaT0ieiIpO2xldCBvPV9lKGUsImtleUluZCIsIiIpO0FlKG8pfHwobz0iaW5kIik7bGV0IGw9X2UoZSwic2NhbGUiKTtpZihSbyhsKXx8KGw9MSksbD1RbyhsKSxsPD0wKXRocm93IG5ldyBFcnJvcigic2NhbGUgbmVlZCA+PSAwIik7bGV0IGE9Q2woVmkodCxuKSkscz1DbChWaSh0LHIpKSx1PUNsKFZpKHQsaSkpLGM9TWF0aC5tYXgoYS5yYW5nZSxzLnJhbmdlKSxmPWMvMixoPVt7bWluOmEubWlkLWYsbWF4OmEubWlkK2YscmFuZ2U6Y30se21pbjpzLm1pZC1mLG1heDpzLm1pZCtmLHJhbmdlOmN9LHttaW46dS5taW4sbWF4OnUubWF4LHJhbmdlOnUucmFuZ2V9XSxnPSh0LGUpPT5Ubyh0KT9oW2VdLnJhbmdlPD0wP3Q6KHQtaFtlXS5taW4pL2hbZV0ucmFuZ2UqbDpudWxsO3Q9VmkodCwodD0+e2xldCBlPWcodFtuXSwwKSxsPWcodFtyXSwxKSxhPWcodFtpXSwyKSxzPXRbb107cmV0dXJue1tuXTplLFtyXTpsLFtpXTphLFtvXTpzfX0pKTtsZXQgdj1WaSh0LG4pLGQ9c2wodikscD1obCh2KSx5PVZpKHQsciksbT1zbCh5KSxfPWhsKHkpLGI9VmkodCxpKTtyZXR1cm57cHM6dCxwc01pbk1heDp7eG1pbjpkLHhtYXg6cCx5bWluOm0seW1heDpfLHptaW46c2woYiksem1heDpobChiKX0sc3Q6aCxudjpnLGludjoodCxlKT0+VG8odCk/bDw9MD90OnQvbCpoW2VdLnJhbmdlK2hbZV0ubWluOm51bGx9fXZhciBVbD1DZSxMbD1uLERsPWE/YS5pc0NvbmNhdFNwcmVhZGFibGU6dm9pZCAwO3ZhciBIbD1mcixYbD1mdW5jdGlvbih0KXtyZXR1cm4gTGwodCl8fFVsKHQpfHwhIShEbCYmdCYmdFtEbF0pfTt2YXIgWWw9ZnVuY3Rpb24gdChlLG4scixpLG8pe3ZhciBsPS0xLGE9ZS5sZW5ndGg7Zm9yKHJ8fChyPVhsKSxvfHwobz1bXSk7KytsPGE7KXt2YXIgcz1lW2xdO24+MCYmcihzKT9uPjE/dChzLG4tMSxyLGksbyk6SGwobyxzKTppfHwob1tvLmxlbmd0aF09cyl9cmV0dXJuIG99LEtsPVlsO3ZhciBabD1mdW5jdGlvbih0KXtyZXR1cm4obnVsbD09dD8wOnQubGVuZ3RoKT9LbCh0LDEpOltdfTtmdW5jdGlvbiBKbCh0KXtsZXQgZT1mdW5jdGlvbih0KXtsZXQgZT1rbyhfZSh0LCIwIixudWxsKSksbj1rbyhfZSh0LCIwLjAiLG51bGwpKTtyZXR1cm4gMj09PWtvKF9lKHQsIjAuMC4wIixudWxsKSk/MzoyPT09bj8yOjI9PT1lPzE6MD09PWU/MDooY29uc29sZS5sb2coImludmFsaWQgcG9pbnQgZGVwdGgiLHQpLG51bGwpfSh0KTtyZXR1cm4gMz09PWU/WmwodCk6Mj09PWU/dDoxPT09ZT9bdF06MD09PWU/W106dH1mdW5jdGlvbiBWbCh0KXtpZighTm8odCkpcmV0dXJuIDA7dD1KbCh0KTtsZXQgZT0wO3JldHVybiBFbih0LCgodCxuKT0+e2xldCByPWZ1bmN0aW9uKHQsZT17fSl7bGV0IG49X2UoZSwidXNlQWJzIik7aWYoamUobil8fChuPSEwKSwhTm8odCkpcmV0dXJuIDA7bGV0IHI9W107aWYoRW4odCwodD0+ezI9PT1rbyh0KSYmUm8odFswXSkmJlJvKHRbMV0pJiZyLnB1c2goW1FvKHRbMF0pLFFvKHRbMV0pXSl9KSksIU5vKHIpKXJldHVybiAwO2xldCBpLG89LTEsbD1rbyhyKSxhPXJbbC0xXSxzPTA7Zm9yKDsrK288bDspaT1hLGE9cltvXSxzKz1pWzFdKmFbMF0taVswXSphWzFdO2xldCB1PXMvMjtyZXR1cm4gbiYmKHU9TWF0aC5hYnModSkpLHV9KHQpOzA9PT1uP2U9cjplLT1yfSkpLGU8MD8wOmV9dmFyIFdsPWZ1bmN0aW9uKHQpeyJudW1iZXIiIT10eXBlb2YgdCYmKHQ9MWUtMTApO3ZhciBlPXtlcHNpbG9uOmZ1bmN0aW9uKGUpe3JldHVybiJudW1iZXIiPT10eXBlb2YgZSYmKHQ9ZSksdH0scG9pbnRBYm92ZU9yT25MaW5lOmZ1bmN0aW9uKGUsbixyKXt2YXIgaT1uWzBdLG89blsxXSxsPXJbMF0sYT1yWzFdLHM9ZVswXTtyZXR1cm4obC1pKSooZVsxXS1vKS0oYS1vKSoocy1pKT49LXR9LHBvaW50QmV0d2VlbjpmdW5jdGlvbihlLG4scil7dmFyIGk9ZVsxXS1uWzFdLG89clswXS1uWzBdLGw9ZVswXS1uWzBdLGE9clsxXS1uWzFdLHM9bCpvK2kqYTtyZXR1cm4hKHM8dCkmJiEocy0obypvK2EqYSk+LXQpfSxwb2ludHNTYW1lWDpmdW5jdGlvbihlLG4pe3JldHVybiBNYXRoLmFicyhlWzBdLW5bMF0pPHR9LHBvaW50c1NhbWVZOmZ1bmN0aW9uKGUsbil7cmV0dXJuIE1hdGguYWJzKGVbMV0tblsxXSk8dH0scG9pbnRzU2FtZTpmdW5jdGlvbih0LG4pe3JldHVybiBlLnBvaW50c1NhbWVYKHQsbikmJmUucG9pbnRzU2FtZVkodCxuKX0scG9pbnRzQ29tcGFyZTpmdW5jdGlvbih0LG4pe3JldHVybiBlLnBvaW50c1NhbWVYKHQsbik/ZS5wb2ludHNTYW1lWSh0LG4pPzA6dFsxXTxuWzFdPy0xOjE6dFswXTxuWzBdPy0xOjF9LHBvaW50c0NvbGxpbmVhcjpmdW5jdGlvbihlLG4scil7dmFyIGk9ZVswXS1uWzBdLG89ZVsxXS1uWzFdLGw9blswXS1yWzBdLGE9blsxXS1yWzFdO3JldHVybiBNYXRoLmFicyhpKmEtbCpvKTx0fSxsaW5lc0ludGVyc2VjdDpmdW5jdGlvbihlLG4scixpKXt2YXIgbz1uWzBdLWVbMF0sbD1uWzFdLWVbMV0sYT1pWzBdLXJbMF0scz1pWzFdLXJbMV0sdT1vKnMtbCphO2lmKE1hdGguYWJzKHUpPHQpcmV0dXJuITE7dmFyIGM9ZVswXS1yWzBdLGY9ZVsxXS1yWzFdLGg9KGEqZi1zKmMpL3UsZz0obypmLWwqYykvdSx2PXthbG9uZ0E6MCxhbG9uZ0I6MCxwdDpbZVswXStoKm8sZVsxXStoKmxdfTtyZXR1cm4gdi5hbG9uZ0E9aDw9LXQ/LTI6aDx0Py0xOmgtMTw9LXQ/MDpoLTE8dD8xOjIsdi5hbG9uZ0I9Zzw9LXQ/LTI6Zzx0Py0xOmctMTw9LXQ/MDpnLTE8dD8xOjIsdn0scG9pbnRJbnNpZGVSZWdpb246ZnVuY3Rpb24oZSxuKXtmb3IodmFyIHI9ZVswXSxpPWVbMV0sbz1uW24ubGVuZ3RoLTFdWzBdLGw9bltuLmxlbmd0aC0xXVsxXSxhPSExLHM9MDtzPG4ubGVuZ3RoO3MrKyl7dmFyIHU9bltzXVswXSxjPW5bc11bMV07Yy1pPnQhPWwtaT50JiYoby11KSooaS1jKS8obC1jKSt1LXI+dCYmKGE9IWEpLG89dSxsPWN9cmV0dXJuIGF9fTtyZXR1cm4gZX0scWw9e2NyZWF0ZTpmdW5jdGlvbigpe3ZhciB0PXtyb290Ontyb290OiEwLG5leHQ6bnVsbH0sZXhpc3RzOmZ1bmN0aW9uKGUpe3JldHVybiBudWxsIT09ZSYmZSE9PXQucm9vdH0saXNFbXB0eTpmdW5jdGlvbigpe3JldHVybiBudWxsPT09dC5yb290Lm5leHR9LGdldEhlYWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdC5yb290Lm5leHR9LGluc2VydEJlZm9yZTpmdW5jdGlvbihlLG4pe2Zvcih2YXIgcj10LnJvb3QsaT10LnJvb3QubmV4dDtudWxsIT09aTspe2lmKG4oaSkpcmV0dXJuIGUucHJldj1pLnByZXYsZS5uZXh0PWksaS5wcmV2Lm5leHQ9ZSx2b2lkKGkucHJldj1lKTtyPWksaT1pLm5leHR9ci5uZXh0PWUsZS5wcmV2PXIsZS5uZXh0PW51bGx9LGZpbmRUcmFuc2l0aW9uOmZ1bmN0aW9uKGUpe2Zvcih2YXIgbj10LnJvb3Qscj10LnJvb3QubmV4dDtudWxsIT09ciYmIWUocik7KW49cixyPXIubmV4dDtyZXR1cm57YmVmb3JlOm49PT10LnJvb3Q/bnVsbDpuLGFmdGVyOnIsaW5zZXJ0OmZ1bmN0aW9uKHQpe3JldHVybiB0LnByZXY9bix0Lm5leHQ9cixuLm5leHQ9dCxudWxsIT09ciYmKHIucHJldj10KSx0fX19fTtyZXR1cm4gdH0sbm9kZTpmdW5jdGlvbih0KXtyZXR1cm4gdC5wcmV2PW51bGwsdC5uZXh0PW51bGwsdC5yZW1vdmU9ZnVuY3Rpb24oKXt0LnByZXYubmV4dD10Lm5leHQsdC5uZXh0JiYodC5uZXh0LnByZXY9dC5wcmV2KSx0LnByZXY9bnVsbCx0Lm5leHQ9bnVsbH0sdH19O3ZhciBHbD1mdW5jdGlvbih0LGUsbil7ZnVuY3Rpb24gcih0LGUscil7cmV0dXJue2lkOm4/bi5zZWdtZW50SWQoKTotMSxzdGFydDp0LGVuZDplLG15RmlsbDp7YWJvdmU6ci5teUZpbGwuYWJvdmUsYmVsb3c6ci5teUZpbGwuYmVsb3d9LG90aGVyRmlsbDpudWxsfX12YXIgaT1xbC5jcmVhdGUoKTtmdW5jdGlvbiBvKHQsbil7aS5pbnNlcnRCZWZvcmUodCwoZnVuY3Rpb24ocil7cmV0dXJuIGZ1bmN0aW9uKHQsbixyLGksbyxsKXt2YXIgYT1lLnBvaW50c0NvbXBhcmUobixvKTtyZXR1cm4gMCE9PWE/YTplLnBvaW50c1NhbWUocixsKT8wOnQhPT1pP3Q/MTotMTplLnBvaW50QWJvdmVPck9uTGluZShyLGk/bzpsLGk/bDpvKT8xOi0xfSh0LmlzU3RhcnQsdC5wdCxuLHIuaXNTdGFydCxyLnB0LHIub3RoZXIucHQpPDB9KSl9ZnVuY3Rpb24gbCh0LGUpe3ZhciBuPWZ1bmN0aW9uKHQsZSl7dmFyIG49cWwubm9kZSh7aXNTdGFydDohMCxwdDp0LnN0YXJ0LHNlZzp0LHByaW1hcnk6ZSxvdGhlcjpudWxsLHN0YXR1czpudWxsfSk7cmV0dXJuIG8obix0LmVuZCksbn0odCxlKTtyZXR1cm4gZnVuY3Rpb24odCxlLG4pe3ZhciByPXFsLm5vZGUoe2lzU3RhcnQ6ITEscHQ6ZS5lbmQsc2VnOmUscHJpbWFyeTpuLG90aGVyOnQsc3RhdHVzOm51bGx9KTt0Lm90aGVyPXIsbyhyLHQucHQpfShuLHQsZSksbn1mdW5jdGlvbiBhKHQsZSl7dmFyIGk9cihlLHQuc2VnLmVuZCx0LnNlZyk7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7biYmbi5zZWdtZW50Q2hvcCh0LnNlZyxlKSx0Lm90aGVyLnJlbW92ZSgpLHQuc2VnLmVuZD1lLHQub3RoZXIucHQ9ZSxvKHQub3RoZXIsdC5wdCl9KHQsZSksbChpLHQucHJpbWFyeSl9ZnVuY3Rpb24gcyhyLG8pe3ZhciBsPXFsLmNyZWF0ZSgpO2Z1bmN0aW9uIHModCl7cmV0dXJuIGwuZmluZFRyYW5zaXRpb24oKGZ1bmN0aW9uKG4pe3ZhciByLGksbyxsLGEscztyZXR1cm4ocj10LGk9bi5ldixvPXIuc2VnLnN0YXJ0LGw9ci5zZWcuZW5kLGE9aS5zZWcuc3RhcnQscz1pLnNlZy5lbmQsZS5wb2ludHNDb2xsaW5lYXIobyxhLHMpP2UucG9pbnRzQ29sbGluZWFyKGwsYSxzKXx8ZS5wb2ludEFib3ZlT3JPbkxpbmUobCxhLHMpPzE6LTE6ZS5wb2ludEFib3ZlT3JPbkxpbmUobyxhLHMpPzE6LTEpPjB9KSl9ZnVuY3Rpb24gdSh0LHIpe3ZhciBpPXQuc2VnLG89ci5zZWcsbD1pLnN0YXJ0LHM9aS5lbmQsdT1vLnN0YXJ0LGM9by5lbmQ7biYmbi5jaGVja0ludGVyc2VjdGlvbihpLG8pO3ZhciBmPWUubGluZXNJbnRlcnNlY3QobCxzLHUsYyk7aWYoITE9PT1mKXtpZighZS5wb2ludHNDb2xsaW5lYXIobCxzLHUpKXJldHVybiExO2lmKGUucG9pbnRzU2FtZShsLGMpfHxlLnBvaW50c1NhbWUocyx1KSlyZXR1cm4hMTt2YXIgaD1lLnBvaW50c1NhbWUobCx1KSxnPWUucG9pbnRzU2FtZShzLGMpO2lmKGgmJmcpcmV0dXJuIHI7dmFyIHY9IWgmJmUucG9pbnRCZXR3ZWVuKGwsdSxjKSxkPSFnJiZlLnBvaW50QmV0d2VlbihzLHUsYyk7aWYoaClyZXR1cm4gZD9hKHIscyk6YSh0LGMpLHI7diYmKGd8fChkP2EocixzKTphKHQsYykpLGEocixsKSl9ZWxzZSAwPT09Zi5hbG9uZ0EmJigtMT09PWYuYWxvbmdCP2EodCx1KTowPT09Zi5hbG9uZ0I/YSh0LGYucHQpOjE9PT1mLmFsb25nQiYmYSh0LGMpKSwwPT09Zi5hbG9uZ0ImJigtMT09PWYuYWxvbmdBP2EocixsKTowPT09Zi5hbG9uZ0E/YShyLGYucHQpOjE9PT1mLmFsb25nQSYmYShyLHMpKTtyZXR1cm4hMX1mb3IodmFyIGM9W107IWkuaXNFbXB0eSgpOyl7dmFyIGY9aS5nZXRIZWFkKCk7aWYobiYmbi52ZXJ0KGYucHRbMF0pLGYuaXNTdGFydCl7biYmbi5zZWdtZW50TmV3KGYuc2VnLGYucHJpbWFyeSk7dmFyIGg9cyhmKSxnPWguYmVmb3JlP2guYmVmb3JlLmV2Om51bGwsdj1oLmFmdGVyP2guYWZ0ZXIuZXY6bnVsbDtmdW5jdGlvbiBkKCl7aWYoZyl7dmFyIHQ9dShmLGcpO2lmKHQpcmV0dXJuIHR9cmV0dXJuISF2JiZ1KGYsdil9biYmbi50ZW1wU3RhdHVzKGYuc2VnLCEhZyYmZy5zZWcsISF2JiZ2LnNlZyk7dmFyIHAseT1kKCk7aWYoeSl7dmFyIG07aWYodCkobT1udWxsPT09Zi5zZWcubXlGaWxsLmJlbG93fHxmLnNlZy5teUZpbGwuYWJvdmUhPT1mLnNlZy5teUZpbGwuYmVsb3cpJiYoeS5zZWcubXlGaWxsLmFib3ZlPSF5LnNlZy5teUZpbGwuYWJvdmUpO2Vsc2UgeS5zZWcub3RoZXJGaWxsPWYuc2VnLm15RmlsbDtuJiZuLnNlZ21lbnRVcGRhdGUoeS5zZWcpLGYub3RoZXIucmVtb3ZlKCksZi5yZW1vdmUoKX1pZihpLmdldEhlYWQoKSE9PWYpe24mJm4ucmV3aW5kKGYuc2VnKTtjb250aW51ZX1pZih0KW09bnVsbD09PWYuc2VnLm15RmlsbC5iZWxvd3x8Zi5zZWcubXlGaWxsLmFib3ZlIT09Zi5zZWcubXlGaWxsLmJlbG93LGYuc2VnLm15RmlsbC5iZWxvdz12P3Yuc2VnLm15RmlsbC5hYm92ZTpyLGYuc2VnLm15RmlsbC5hYm92ZT1tPyFmLnNlZy5teUZpbGwuYmVsb3c6Zi5zZWcubXlGaWxsLmJlbG93O2Vsc2UgaWYobnVsbD09PWYuc2VnLm90aGVyRmlsbClwPXY/Zi5wcmltYXJ5PT09di5wcmltYXJ5P3Yuc2VnLm90aGVyRmlsbC5hYm92ZTp2LnNlZy5teUZpbGwuYWJvdmU6Zi5wcmltYXJ5P286cixmLnNlZy5vdGhlckZpbGw9e2Fib3ZlOnAsYmVsb3c6cH07biYmbi5zdGF0dXMoZi5zZWcsISFnJiZnLnNlZywhIXYmJnYuc2VnKSxmLm90aGVyLnN0YXR1cz1oLmluc2VydChxbC5ub2RlKHtldjpmfSkpfWVsc2V7dmFyIF89Zi5zdGF0dXM7aWYobnVsbD09PV8pdGhyb3cgbmV3IEVycm9yKCJQb2x5Qm9vbDogWmVyby1sZW5ndGggc2VnbWVudCBkZXRlY3RlZDsgeW91ciBlcHNpbG9uIGlzIHByb2JhYmx5IHRvbyBzbWFsbCBvciB0b28gbGFyZ2UiKTtpZihsLmV4aXN0cyhfLnByZXYpJiZsLmV4aXN0cyhfLm5leHQpJiZ1KF8ucHJldi5ldixfLm5leHQuZXYpLG4mJm4uc3RhdHVzUmVtb3ZlKF8uZXYuc2VnKSxfLnJlbW92ZSgpLCFmLnByaW1hcnkpe3ZhciBiPWYuc2VnLm15RmlsbDtmLnNlZy5teUZpbGw9Zi5zZWcub3RoZXJGaWxsLGYuc2VnLm90aGVyRmlsbD1ifWMucHVzaChmLnNlZyl9aS5nZXRIZWFkKCkucmVtb3ZlKCl9cmV0dXJuIG4mJm4uZG9uZSgpLGN9cmV0dXJuIHQ/e2FkZFJlZ2lvbjpmdW5jdGlvbih0KXtmb3IodmFyIHIsaSxvLGE9dFt0Lmxlbmd0aC0xXSxzPTA7czx0Lmxlbmd0aDtzKyspe3I9YSxhPXRbc107dmFyIHU9ZS5wb2ludHNDb21wYXJlKHIsYSk7MCE9PXUmJmwoKGk9dTwwP3I6YSxvPXU8MD9hOnIse2lkOm4/bi5zZWdtZW50SWQoKTotMSxzdGFydDppLGVuZDpvLG15RmlsbDp7YWJvdmU6bnVsbCxiZWxvdzpudWxsfSxvdGhlckZpbGw6bnVsbH0pLCEwKX19LGNhbGN1bGF0ZTpmdW5jdGlvbih0KXtyZXR1cm4gcyh0LCExKX19OntjYWxjdWxhdGU6ZnVuY3Rpb24odCxlLG4saSl7cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCl7bChyKHQuc3RhcnQsdC5lbmQsdCksITApfSkpLG4uZm9yRWFjaCgoZnVuY3Rpb24odCl7bChyKHQuc3RhcnQsdC5lbmQsdCksITEpfSkpLHMoZSxpKX19fTt2YXIgUWw9ZnVuY3Rpb24odCxlLG4pe3ZhciByPVtdLGk9W107cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIG89dC5zdGFydCxsPXQuZW5kO2lmKGUucG9pbnRzU2FtZShvLGwpKWNvbnNvbGUud2FybigiUG9seUJvb2w6IFdhcm5pbmc6IFplcm8tbGVuZ3RoIHNlZ21lbnQgZGV0ZWN0ZWQ7IHlvdXIgZXBzaWxvbiBpcyBwcm9iYWJseSB0b28gc21hbGwgb3IgdG9vIGxhcmdlIik7ZWxzZXtuJiZuLmNoYWluU3RhcnQodCk7Zm9yKHZhciBhPXtpbmRleDowLG1hdGNoZXNfaGVhZDohMSxtYXRjaGVzX3B0MTohMX0scz17aW5kZXg6MCxtYXRjaGVzX2hlYWQ6ITEsbWF0Y2hlc19wdDE6ITF9LHU9YSxjPTA7YzxyLmxlbmd0aDtjKyspe3ZhciBmPShwPXJbY10pWzBdO3BbMV07dmFyIGg9cFtwLmxlbmd0aC0xXTtpZihwW3AubGVuZ3RoLTJdLGUucG9pbnRzU2FtZShmLG8pKXtpZihTKGMsITAsITApKWJyZWFrfWVsc2UgaWYoZS5wb2ludHNTYW1lKGYsbCkpe2lmKFMoYywhMCwhMSkpYnJlYWt9ZWxzZSBpZihlLnBvaW50c1NhbWUoaCxvKSl7aWYoUyhjLCExLCEwKSlicmVha31lbHNlIGlmKGUucG9pbnRzU2FtZShoLGwpJiZTKGMsITEsITEpKWJyZWFrfWlmKHU9PT1hKXJldHVybiByLnB1c2goW28sbF0pLHZvaWQobiYmbi5jaGFpbk5ldyhvLGwpKTtpZih1PT09cyl7biYmbi5jaGFpbk1hdGNoKGEuaW5kZXgpO3ZhciBnPWEuaW5kZXgsdj1hLm1hdGNoZXNfcHQxP2w6byxkPWEubWF0Y2hlc19oZWFkLHA9cltnXSx5PWQ/cFswXTpwW3AubGVuZ3RoLTFdLG09ZD9wWzFdOnBbcC5sZW5ndGgtMl0sXz1kP3BbcC5sZW5ndGgtMV06cFswXSxiPWQ/cFtwLmxlbmd0aC0yXTpwWzFdO3JldHVybiBlLnBvaW50c0NvbGxpbmVhcihtLHksdikmJihkPyhuJiZuLmNoYWluUmVtb3ZlSGVhZChhLmluZGV4LHYpLHAuc2hpZnQoKSk6KG4mJm4uY2hhaW5SZW1vdmVUYWlsKGEuaW5kZXgsdikscC5wb3AoKSkseT1tKSxlLnBvaW50c1NhbWUoXyx2KT8oci5zcGxpY2UoZywxKSxlLnBvaW50c0NvbGxpbmVhcihiLF8seSkmJihkPyhuJiZuLmNoYWluUmVtb3ZlVGFpbChhLmluZGV4LHkpLHAucG9wKCkpOihuJiZuLmNoYWluUmVtb3ZlSGVhZChhLmluZGV4LHkpLHAuc2hpZnQoKSkpLG4mJm4uY2hhaW5DbG9zZShhLmluZGV4KSx2b2lkIGkucHVzaChwKSk6dm9pZChkPyhuJiZuLmNoYWluQWRkSGVhZChhLmluZGV4LHYpLHAudW5zaGlmdCh2KSk6KG4mJm4uY2hhaW5BZGRUYWlsKGEuaW5kZXgsdikscC5wdXNoKHYpKSl9dmFyIHg9YS5pbmRleCx3PXMuaW5kZXg7biYmbi5jaGFpbkNvbm5lY3QoeCx3KTt2YXIgaj1yW3hdLmxlbmd0aDxyW3ddLmxlbmd0aDthLm1hdGNoZXNfaGVhZD9zLm1hdGNoZXNfaGVhZD9qPyhBKHgpLE8oeCx3KSk6KEEodyksTyh3LHgpKTpPKHcseCk6cy5tYXRjaGVzX2hlYWQ/Tyh4LHcpOmo/KEEoeCksTyh3LHgpKTooQSh3KSxPKHgsdykpfWZ1bmN0aW9uIFModCxlLG4pe3JldHVybiB1LmluZGV4PXQsdS5tYXRjaGVzX2hlYWQ9ZSx1Lm1hdGNoZXNfcHQxPW4sdT09PWE/KHU9cywhMSk6KHU9bnVsbCwhMCl9ZnVuY3Rpb24gQSh0KXtuJiZuLmNoYWluUmV2ZXJzZSh0KSxyW3RdLnJldmVyc2UoKX1mdW5jdGlvbiBPKHQsaSl7dmFyIG89clt0XSxsPXJbaV0sYT1vW28ubGVuZ3RoLTFdLHM9b1tvLmxlbmd0aC0yXSx1PWxbMF0sYz1sWzFdO2UucG9pbnRzQ29sbGluZWFyKHMsYSx1KSYmKG4mJm4uY2hhaW5SZW1vdmVUYWlsKHQsYSksby5wb3AoKSxhPXMpLGUucG9pbnRzQ29sbGluZWFyKGEsdSxjKSYmKG4mJm4uY2hhaW5SZW1vdmVIZWFkKGksdSksbC5zaGlmdCgpKSxuJiZuLmNoYWluSm9pbih0LGkpLHJbdF09by5jb25jYXQobCksci5zcGxpY2UoaSwxKX19KSksaX07ZnVuY3Rpb24gdGEodCxlLG4pe3ZhciByPVtdO3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBpPSh0Lm15RmlsbC5hYm92ZT84OjApKyh0Lm15RmlsbC5iZWxvdz80OjApKyh0Lm90aGVyRmlsbCYmdC5vdGhlckZpbGwuYWJvdmU/MjowKSsodC5vdGhlckZpbGwmJnQub3RoZXJGaWxsLmJlbG93PzE6MCk7MCE9PWVbaV0mJnIucHVzaCh7aWQ6bj9uLnNlZ21lbnRJZCgpOi0xLHN0YXJ0OnQuc3RhcnQsZW5kOnQuZW5kLG15RmlsbDp7YWJvdmU6MT09PWVbaV0sYmVsb3c6Mj09PWVbaV19LG90aGVyRmlsbDpudWxsfSl9KSksbiYmbi5zZWxlY3RlZChyKSxyfXZhciBlYSxuYT17dW5pb246ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGEodCxbMCwyLDEsMCwyLDIsMCwwLDEsMCwxLDAsMCwwLDAsMF0sZSl9LGludGVyc2VjdDpmdW5jdGlvbih0LGUpe3JldHVybiB0YSh0LFswLDAsMCwwLDAsMiwwLDIsMCwwLDEsMSwwLDIsMSwwXSxlKX0sZGlmZmVyZW5jZTpmdW5jdGlvbih0LGUpe3JldHVybiB0YSh0LFswLDAsMCwwLDIsMCwyLDAsMSwxLDAsMCwwLDEsMiwwXSxlKX0sZGlmZmVyZW5jZVJldjpmdW5jdGlvbih0LGUpe3JldHVybiB0YSh0LFswLDIsMSwwLDAsMCwxLDEsMCwyLDAsMiwwLDAsMCwwXSxlKX0seG9yOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRhKHQsWzAsMiwxLDAsMiwwLDAsMSwxLDAsMCwyLDAsMSwyLDBdLGUpfX0scmE9e3RvUG9seWdvbjpmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4oZSl7aWYoZS5sZW5ndGg8PTApcmV0dXJuIHQuc2VnbWVudHMoe2ludmVydGVkOiExLHJlZ2lvbnM6W119KTtmdW5jdGlvbiBuKGUpe3ZhciBuPWUuc2xpY2UoMCxlLmxlbmd0aC0xKTtyZXR1cm4gdC5zZWdtZW50cyh7aW52ZXJ0ZWQ6ITEscmVnaW9uczpbbl19KX1mb3IodmFyIHI9bihlWzBdKSxpPTE7aTxlLmxlbmd0aDtpKyspcj10LnNlbGVjdERpZmZlcmVuY2UodC5jb21iaW5lKHIsbihlW2ldKSkpO3JldHVybiByfWlmKCJQb2x5Z29uIj09PWUudHlwZSlyZXR1cm4gdC5wb2x5Z29uKG4oZS5jb29yZGluYXRlcykpO2lmKCJNdWx0aVBvbHlnb24iPT09ZS50eXBlKXtmb3IodmFyIHI9dC5zZWdtZW50cyh7aW52ZXJ0ZWQ6ITEscmVnaW9uczpbXX0pLGk9MDtpPGUuY29vcmRpbmF0ZXMubGVuZ3RoO2krKylyPXQuc2VsZWN0VW5pb24odC5jb21iaW5lKHIsbihlLmNvb3JkaW5hdGVzW2ldKSkpO3JldHVybiB0LnBvbHlnb24ocil9dGhyb3cgbmV3IEVycm9yKCJQb2x5Qm9vbDogQ2Fubm90IGNvbnZlcnQgR2VvSlNPTiBvYmplY3QgdG8gUG9seUJvb2wgcG9seWdvbiIpfSxmcm9tUG9seWdvbjpmdW5jdGlvbih0LGUsbil7ZnVuY3Rpb24gcih0LG4pe3JldHVybiBlLnBvaW50SW5zaWRlUmVnaW9uKFsuNSoodFswXVswXSt0WzFdWzBdKSwuNSoodFswXVsxXSt0WzFdWzFdKV0sbil9ZnVuY3Rpb24gaSh0KXtyZXR1cm57cmVnaW9uOnQsY2hpbGRyZW46W119fW49dC5wb2x5Z29uKHQuc2VnbWVudHMobikpO3ZhciBvPWkobnVsbCk7ZnVuY3Rpb24gbCh0LGUpe2Zvcih2YXIgbj0wO248dC5jaGlsZHJlbi5sZW5ndGg7bisrKXtpZihyKGUsKGE9dC5jaGlsZHJlbltuXSkucmVnaW9uKSlyZXR1cm4gdm9pZCBsKGEsZSl9dmFyIG89aShlKTtmb3Iobj0wO248dC5jaGlsZHJlbi5sZW5ndGg7bisrKXt2YXIgYTtyKChhPXQuY2hpbGRyZW5bbl0pLnJlZ2lvbixlKSYmKG8uY2hpbGRyZW4ucHVzaChhKSx0LmNoaWxkcmVuLnNwbGljZShuLDEpLG4tLSl9dC5jaGlsZHJlbi5wdXNoKG8pfWZvcih2YXIgYT0wO2E8bi5yZWdpb25zLmxlbmd0aDthKyspe3ZhciBzPW4ucmVnaW9uc1thXTtzLmxlbmd0aDwzfHxsKG8scyl9ZnVuY3Rpb24gdSh0LGUpe2Zvcih2YXIgbj0wLHI9dFt0Lmxlbmd0aC0xXVswXSxpPXRbdC5sZW5ndGgtMV1bMV0sbz1bXSxsPTA7bDx0Lmxlbmd0aDtsKyspe3ZhciBhPXRbbF1bMF0scz10W2xdWzFdO28ucHVzaChbYSxzXSksbis9cypyLWEqaSxyPWEsaT1zfXJldHVybiBuPDAhPT1lJiZvLnJldmVyc2UoKSxvLnB1c2goW29bMF1bMF0sb1swXVsxXV0pLG99dmFyIGM9W107ZnVuY3Rpb24gZih0KXt2YXIgZT1bdSh0LnJlZ2lvbiwhMSldO2MucHVzaChlKTtmb3IodmFyIG49MDtuPHQuY2hpbGRyZW4ubGVuZ3RoO24rKyllLnB1c2goaCh0LmNoaWxkcmVuW25dKSl9ZnVuY3Rpb24gaCh0KXtmb3IodmFyIGU9MDtlPHQuY2hpbGRyZW4ubGVuZ3RoO2UrKylmKHQuY2hpbGRyZW5bZV0pO3JldHVybiB1KHQucmVnaW9uLCEwKX1mb3IoYT0wO2E8by5jaGlsZHJlbi5sZW5ndGg7YSsrKWYoby5jaGlsZHJlblthXSk7cmV0dXJuIGMubGVuZ3RoPD0wP3t0eXBlOiJQb2x5Z29uIixjb29yZGluYXRlczpbXX06MT09Yy5sZW5ndGg/e3R5cGU6IlBvbHlnb24iLGNvb3JkaW5hdGVzOmNbMF19Ont0eXBlOiJNdWx0aVBvbHlnb24iLGNvb3JkaW5hdGVzOmN9fX0saWE9ZnVuY3Rpb24oKXt2YXIgdCxlPTAsbj0hMTtmdW5jdGlvbiByKGUsbil7cmV0dXJuIHQubGlzdC5wdXNoKHt0eXBlOmUsZGF0YTpuP0pTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobikpOnZvaWQgMH0pLHR9cmV0dXJuIHQ9e2xpc3Q6W10sc2VnbWVudElkOmZ1bmN0aW9uKCl7cmV0dXJuIGUrK30sY2hlY2tJbnRlcnNlY3Rpb246ZnVuY3Rpb24odCxlKXtyZXR1cm4gcigiY2hlY2siLHtzZWcxOnQsc2VnMjplfSl9LHNlZ21lbnRDaG9wOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHIoImRpdl9zZWciLHtzZWc6dCxwdDplfSkscigiY2hvcCIse3NlZzp0LHB0OmV9KX0sc3RhdHVzUmVtb3ZlOmZ1bmN0aW9uKHQpe3JldHVybiByKCJwb3Bfc2VnIix7c2VnOnR9KX0sc2VnbWVudFVwZGF0ZTpmdW5jdGlvbih0KXtyZXR1cm4gcigic2VnX3VwZGF0ZSIse3NlZzp0fSl9LHNlZ21lbnROZXc6ZnVuY3Rpb24odCxlKXtyZXR1cm4gcigibmV3X3NlZyIse3NlZzp0LHByaW1hcnk6ZX0pfSxzZWdtZW50UmVtb3ZlOmZ1bmN0aW9uKHQpe3JldHVybiByKCJyZW1fc2VnIix7c2VnOnR9KX0sdGVtcFN0YXR1czpmdW5jdGlvbih0LGUsbil7cmV0dXJuIHIoInRlbXBfc3RhdHVzIix7c2VnOnQsYWJvdmU6ZSxiZWxvdzpufSl9LHJld2luZDpmdW5jdGlvbih0KXtyZXR1cm4gcigicmV3aW5kIix7c2VnOnR9KX0sc3RhdHVzOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gcigic3RhdHVzIix7c2VnOnQsYWJvdmU6ZSxiZWxvdzpufSl9LHZlcnQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT1uP3Q6KG49ZSxyKCJ2ZXJ0Iix7eDplfSkpfSxsb2c6ZnVuY3Rpb24odCl7cmV0dXJuInN0cmluZyIhPXR5cGVvZiB0JiYodD1KU09OLnN0cmluZ2lmeSh0LCExLCIgICIpKSxyKCJsb2ciLHt0eHQ6dH0pfSxyZXNldDpmdW5jdGlvbigpe3JldHVybiByKCJyZXNldCIpfSxzZWxlY3RlZDpmdW5jdGlvbih0KXtyZXR1cm4gcigic2VsZWN0ZWQiLHtzZWdzOnR9KX0sY2hhaW5TdGFydDpmdW5jdGlvbih0KXtyZXR1cm4gcigiY2hhaW5fc3RhcnQiLHtzZWc6dH0pfSxjaGFpblJlbW92ZUhlYWQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gcigiY2hhaW5fcmVtX2hlYWQiLHtpbmRleDp0LHB0OmV9KX0sY2hhaW5SZW1vdmVUYWlsOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHIoImNoYWluX3JlbV90YWlsIix7aW5kZXg6dCxwdDplfSl9LGNoYWluTmV3OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHIoImNoYWluX25ldyIse3B0MTp0LHB0MjplfSl9LGNoYWluTWF0Y2g6ZnVuY3Rpb24odCl7cmV0dXJuIHIoImNoYWluX21hdGNoIix7aW5kZXg6dH0pfSxjaGFpbkNsb3NlOmZ1bmN0aW9uKHQpe3JldHVybiByKCJjaGFpbl9jbG9zZSIse2luZGV4OnR9KX0sY2hhaW5BZGRIZWFkOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHIoImNoYWluX2FkZF9oZWFkIix7aW5kZXg6dCxwdDplfSl9LGNoYWluQWRkVGFpbDpmdW5jdGlvbih0LGUpe3JldHVybiByKCJjaGFpbl9hZGRfdGFpbCIse2luZGV4OnQscHQ6ZX0pfSxjaGFpbkNvbm5lY3Q6ZnVuY3Rpb24odCxlKXtyZXR1cm4gcigiY2hhaW5fY29uIix7aW5kZXgxOnQsaW5kZXgyOmV9KX0sY2hhaW5SZXZlcnNlOmZ1bmN0aW9uKHQpe3JldHVybiByKCJjaGFpbl9yZXYiLHtpbmRleDp0fSl9LGNoYWluSm9pbjpmdW5jdGlvbih0LGUpe3JldHVybiByKCJjaGFpbl9qb2luIix7aW5kZXgxOnQsaW5kZXgyOmV9KX0sZG9uZTpmdW5jdGlvbigpe3JldHVybiByKCJkb25lIil9fX0sb2E9R2wsbGE9UWwsYWE9bmEsc2E9cmEsdWE9ITEsY2E9V2woKTtmdW5jdGlvbiBmYSh0LGUsbil7dmFyIHI9ZWEuc2VnbWVudHModCksaT1lYS5zZWdtZW50cyhlKSxvPW4oZWEuY29tYmluZShyLGkpKTtyZXR1cm4gZWEucG9seWdvbihvKX1lYT17YnVpbGRMb2c6ZnVuY3Rpb24odCl7cmV0dXJuITA9PT10P3VhPWlhKCk6ITE9PT10JiYodWE9ITEpLCExIT09dWEmJnVhLmxpc3R9LGVwc2lsb246ZnVuY3Rpb24odCl7cmV0dXJuIGNhLmVwc2lsb24odCl9LHNlZ21lbnRzOmZ1bmN0aW9uKHQpe3ZhciBlPW9hKCEwLGNhLHVhKTtyZXR1cm4gdC5yZWdpb25zLmZvckVhY2goZS5hZGRSZWdpb24pLHtzZWdtZW50czplLmNhbGN1bGF0ZSh0LmludmVydGVkKSxpbnZlcnRlZDp0LmludmVydGVkfX0sY29tYmluZTpmdW5jdGlvbih0LGUpe3JldHVybntjb21iaW5lZDpvYSghMSxjYSx1YSkuY2FsY3VsYXRlKHQuc2VnbWVudHMsdC5pbnZlcnRlZCxlLnNlZ21lbnRzLGUuaW52ZXJ0ZWQpLGludmVydGVkMTp0LmludmVydGVkLGludmVydGVkMjplLmludmVydGVkfX0sc2VsZWN0VW5pb246ZnVuY3Rpb24odCl7cmV0dXJue3NlZ21lbnRzOmFhLnVuaW9uKHQuY29tYmluZWQsdWEpLGludmVydGVkOnQuaW52ZXJ0ZWQxfHx0LmludmVydGVkMn19LHNlbGVjdEludGVyc2VjdDpmdW5jdGlvbih0KXtyZXR1cm57c2VnbWVudHM6YWEuaW50ZXJzZWN0KHQuY29tYmluZWQsdWEpLGludmVydGVkOnQuaW52ZXJ0ZWQxJiZ0LmludmVydGVkMn19LHNlbGVjdERpZmZlcmVuY2U6ZnVuY3Rpb24odCl7cmV0dXJue3NlZ21lbnRzOmFhLmRpZmZlcmVuY2UodC5jb21iaW5lZCx1YSksaW52ZXJ0ZWQ6dC5pbnZlcnRlZDEmJiF0LmludmVydGVkMn19LHNlbGVjdERpZmZlcmVuY2VSZXY6ZnVuY3Rpb24odCl7cmV0dXJue3NlZ21lbnRzOmFhLmRpZmZlcmVuY2VSZXYodC5jb21iaW5lZCx1YSksaW52ZXJ0ZWQ6IXQuaW52ZXJ0ZWQxJiZ0LmludmVydGVkMn19LHNlbGVjdFhvcjpmdW5jdGlvbih0KXtyZXR1cm57c2VnbWVudHM6YWEueG9yKHQuY29tYmluZWQsdWEpLGludmVydGVkOnQuaW52ZXJ0ZWQxIT09dC5pbnZlcnRlZDJ9fSxwb2x5Z29uOmZ1bmN0aW9uKHQpe3JldHVybntyZWdpb25zOmxhKHQuc2VnbWVudHMsY2EsdWEpLGludmVydGVkOnQuaW52ZXJ0ZWR9fSxwb2x5Z29uRnJvbUdlb0pTT046ZnVuY3Rpb24odCl7cmV0dXJuIHNhLnRvUG9seWdvbihlYSx0KX0scG9seWdvblRvR2VvSlNPTjpmdW5jdGlvbih0KXtyZXR1cm4gc2EuZnJvbVBvbHlnb24oZWEsY2EsdCl9LHVuaW9uOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGZhKHQsZSxlYS5zZWxlY3RVbmlvbil9LGludGVyc2VjdDpmdW5jdGlvbih0LGUpe3JldHVybiBmYSh0LGUsZWEuc2VsZWN0SW50ZXJzZWN0KX0sZGlmZmVyZW5jZTpmdW5jdGlvbih0LGUpe3JldHVybiBmYSh0LGUsZWEuc2VsZWN0RGlmZmVyZW5jZSl9LGRpZmZlcmVuY2VSZXY6ZnVuY3Rpb24odCxlKXtyZXR1cm4gZmEodCxlLGVhLnNlbGVjdERpZmZlcmVuY2VSZXYpfSx4b3I6ZnVuY3Rpb24odCxlKXtyZXR1cm4gZmEodCxlLGVhLnNlbGVjdFhvcil9fSwib2JqZWN0Ij09dHlwZW9mIHdpbmRvdyYmKHdpbmRvdy5Qb2x5Qm9vbD1lYSk7dmFyIGhhPWVhO2NvbnN0IGdhPTEzNDIxNzcyOSx2YT0zMzMwNjY5MDczODc1NDcwNmUtMzI7ZnVuY3Rpb24gZGEodCxlLG4scixpKXtsZXQgbyxsLGEscyx1PWVbMF0sYz1yWzBdLGY9MCxoPTA7Yz51PT1jPi11PyhvPXUsdT1lWysrZl0pOihvPWMsYz1yWysraF0pO2xldCBnPTA7aWYoZjx0JiZoPG4pZm9yKGM+dT09Yz4tdT8obD11K28sYT1vLShsLXUpLHU9ZVsrK2ZdKToobD1jK28sYT1vLShsLWMpLGM9clsrK2hdKSxvPWwsMCE9PWEmJihpW2crK109YSk7Zjx0JiZoPG47KWM+dT09Yz4tdT8obD1vK3Uscz1sLW8sYT1vLShsLXMpKyh1LXMpLHU9ZVsrK2ZdKToobD1vK2Mscz1sLW8sYT1vLShsLXMpKyhjLXMpLGM9clsrK2hdKSxvPWwsMCE9PWEmJihpW2crK109YSk7Zm9yKDtmPHQ7KWw9byt1LHM9bC1vLGE9by0obC1zKSsodS1zKSx1PWVbKytmXSxvPWwsMCE9PWEmJihpW2crK109YSk7Zm9yKDtoPG47KWw9bytjLHM9bC1vLGE9by0obC1zKSsoYy1zKSxjPXJbKytoXSxvPWwsMCE9PWEmJihpW2crK109YSk7cmV0dXJuIDA9PT1vJiYwIT09Z3x8KGlbZysrXT1vKSxnfWZ1bmN0aW9uIHBhKHQpe3JldHVybiBuZXcgRmxvYXQ2NEFycmF5KHQpfWNvbnN0IHlhPTIyMjA0NDYwNDkyNTAzMTQ2ZS0zMixtYT0xMTA5MzM1NjQ3OTY3MDQ4N2UtNDcsX2E9cGEoNCksYmE9cGEoOCkseGE9cGEoMTIpLHdhPXBhKDE2KSxqYT1wYSg0KTtmdW5jdGlvbiBTYSh0LGUsbixyLGksbyl7Y29uc3QgbD0oZS1vKSoobi1pKSxhPSh0LWkpKihyLW8pLHM9bC1hO2lmKDA9PT1sfHwwPT09YXx8bD4wIT1hPjApcmV0dXJuIHM7Y29uc3QgdT1NYXRoLmFicyhsK2EpO3JldHVybiBNYXRoLmFicyhzKT49MzMzMDY2OTA3Mzg3NTQ3MTZlLTMyKnU/czotZnVuY3Rpb24odCxlLG4scixpLG8sbCl7bGV0IGEscyx1LGMsZixoLGcsdixkLHAseSxtLF8sYix4LHcsaixTO2NvbnN0IEE9dC1pLE89bi1pLE09ZS1vLGs9ci1vO2I9QSprLGg9Z2EqQSxnPWgtKGgtQSksdj1BLWcsaD1nYSprLGQ9aC0oaC1rKSxwPWstZCx4PXYqcC0oYi1nKmQtdipkLWcqcCksdz1NKk8saD1nYSpNLGc9aC0oaC1NKSx2PU0tZyxoPWdhKk8sZD1oLShoLU8pLHA9Ty1kLGo9dipwLSh3LWcqZC12KmQtZypwKSx5PXgtaixmPXgteSxfYVswXT14LSh5K2YpKyhmLWopLG09Yit5LGY9bS1iLF89Yi0obS1mKSsoeS1mKSx5PV8tdyxmPV8teSxfYVsxXT1fLSh5K2YpKyhmLXcpLFM9bSt5LGY9Uy1tLF9hWzJdPW0tKFMtZikrKHktZiksX2FbM109UztsZXQgUD1mdW5jdGlvbih0LGUpe2xldCBuPWVbMF07Zm9yKGxldCByPTE7cjx0O3IrKyluKz1lW3JdO3JldHVybiBufSg0LF9hKSxGPXlhKmw7aWYoUD49Rnx8LVA+PUYpcmV0dXJuIFA7aWYoZj10LUEsYT10LShBK2YpKyhmLWkpLGY9bi1PLHU9bi0oTytmKSsoZi1pKSxmPWUtTSxzPWUtKE0rZikrKGYtbyksZj1yLWssYz1yLShrK2YpKyhmLW8pLDA9PT1hJiYwPT09cyYmMD09PXUmJjA9PT1jKXJldHVybiBQO2lmKEY9bWEqbCt2YSpNYXRoLmFicyhQKSxQKz1BKmMrayphLShNKnUrTypzKSxQPj1GfHwtUD49RilyZXR1cm4gUDtiPWEqayxoPWdhKmEsZz1oLShoLWEpLHY9YS1nLGg9Z2EqayxkPWgtKGgtaykscD1rLWQseD12KnAtKGItZypkLXYqZC1nKnApLHc9cypPLGg9Z2EqcyxnPWgtKGgtcyksdj1zLWcsaD1nYSpPLGQ9aC0oaC1PKSxwPU8tZCxqPXYqcC0ody1nKmQtdipkLWcqcCkseT14LWosZj14LXksamFbMF09eC0oeStmKSsoZi1qKSxtPWIreSxmPW0tYixfPWItKG0tZikrKHktZikseT1fLXcsZj1fLXksamFbMV09Xy0oeStmKSsoZi13KSxTPW0reSxmPVMtbSxqYVsyXT1tLShTLWYpKyh5LWYpLGphWzNdPVM7Y29uc3QgVD1kYSg0LF9hLDQsamEsYmEpO2I9QSpjLGg9Z2EqQSxnPWgtKGgtQSksdj1BLWcsaD1nYSpjLGQ9aC0oaC1jKSxwPWMtZCx4PXYqcC0oYi1nKmQtdipkLWcqcCksdz1NKnUsaD1nYSpNLGc9aC0oaC1NKSx2PU0tZyxoPWdhKnUsZD1oLShoLXUpLHA9dS1kLGo9dipwLSh3LWcqZC12KmQtZypwKSx5PXgtaixmPXgteSxqYVswXT14LSh5K2YpKyhmLWopLG09Yit5LGY9bS1iLF89Yi0obS1mKSsoeS1mKSx5PV8tdyxmPV8teSxqYVsxXT1fLSh5K2YpKyhmLXcpLFM9bSt5LGY9Uy1tLGphWzJdPW0tKFMtZikrKHktZiksamFbM109Uztjb25zdCB6PWRhKFQsYmEsNCxqYSx4YSk7Yj1hKmMsaD1nYSphLGc9aC0oaC1hKSx2PWEtZyxoPWdhKmMsZD1oLShoLWMpLHA9Yy1kLHg9dipwLShiLWcqZC12KmQtZypwKSx3PXMqdSxoPWdhKnMsZz1oLShoLXMpLHY9cy1nLGg9Z2EqdSxkPWgtKGgtdSkscD11LWQsaj12KnAtKHctZypkLXYqZC1nKnApLHk9eC1qLGY9eC15LGphWzBdPXgtKHkrZikrKGYtaiksbT1iK3ksZj1tLWIsXz1iLShtLWYpKyh5LWYpLHk9Xy13LGY9Xy15LGphWzFdPV8tKHkrZikrKGYtdyksUz1tK3ksZj1TLW0samFbMl09bS0oUy1mKSsoeS1mKSxqYVszXT1TO2NvbnN0IEk9ZGEoeix4YSw0LGphLHdhKTtyZXR1cm4gd2FbSS0xXX0odCxlLG4scixpLG8sdSl9Y29uc3QgQWE9TWF0aC5wb3coMiwtNTIpLE9hPW5ldyBVaW50MzJBcnJheSg1MTIpO2NsYXNzIE1he3N0YXRpYyBmcm9tKHQsZT1JYSxuPSRhKXtjb25zdCByPXQubGVuZ3RoLGk9bmV3IEZsb2F0NjRBcnJheSgyKnIpO2ZvcihsZXQgbz0wO288cjtvKyspe2NvbnN0IHI9dFtvXTtpWzIqb109ZShyKSxpWzIqbysxXT1uKHIpfXJldHVybiBuZXcgTWEoaSl9Y29uc3RydWN0b3IodCl7Y29uc3QgZT10Lmxlbmd0aD4+MTtpZihlPjAmJiJudW1iZXIiIT10eXBlb2YgdFswXSl0aHJvdyBuZXcgRXJyb3IoIkV4cGVjdGVkIGNvb3JkcyB0byBjb250YWluIG51bWJlcnMuIik7dGhpcy5jb29yZHM9dDtjb25zdCBuPU1hdGgubWF4KDIqZS01LDApO3RoaXMuX3RyaWFuZ2xlcz1uZXcgVWludDMyQXJyYXkoMypuKSx0aGlzLl9oYWxmZWRnZXM9bmV3IEludDMyQXJyYXkoMypuKSx0aGlzLl9oYXNoU2l6ZT1NYXRoLmNlaWwoTWF0aC5zcXJ0KGUpKSx0aGlzLl9odWxsUHJldj1uZXcgVWludDMyQXJyYXkoZSksdGhpcy5faHVsbE5leHQ9bmV3IFVpbnQzMkFycmF5KGUpLHRoaXMuX2h1bGxUcmk9bmV3IFVpbnQzMkFycmF5KGUpLHRoaXMuX2h1bGxIYXNoPW5ldyBJbnQzMkFycmF5KHRoaXMuX2hhc2hTaXplKS5maWxsKC0xKSx0aGlzLl9pZHM9bmV3IFVpbnQzMkFycmF5KGUpLHRoaXMuX2Rpc3RzPW5ldyBGbG9hdDY0QXJyYXkoZSksdGhpcy51cGRhdGUoKX11cGRhdGUoKXtjb25zdHtjb29yZHM6dCxfaHVsbFByZXY6ZSxfaHVsbE5leHQ6bixfaHVsbFRyaTpyLF9odWxsSGFzaDppfT10aGlzLG89dC5sZW5ndGg+PjE7bGV0IGw9MS8wLGE9MS8wLHM9LTEvMCx1PS0xLzA7Zm9yKGxldCBlPTA7ZTxvO2UrKyl7Y29uc3Qgbj10WzIqZV0scj10WzIqZSsxXTtuPGwmJihsPW4pLHI8YSYmKGE9ciksbj5zJiYocz1uKSxyPnUmJih1PXIpLHRoaXMuX2lkc1tlXT1lfWNvbnN0IGM9KGwrcykvMixmPShhK3UpLzI7bGV0IGgsZyx2LGQ9MS8wO2ZvcihsZXQgZT0wO2U8bztlKyspe2NvbnN0IG49a2EoYyxmLHRbMiplXSx0WzIqZSsxXSk7bjxkJiYoaD1lLGQ9bil9Y29uc3QgcD10WzIqaF0seT10WzIqaCsxXTtkPTEvMDtmb3IobGV0IGU9MDtlPG87ZSsrKXtpZihlPT09aCljb250aW51ZTtjb25zdCBuPWthKHAseSx0WzIqZV0sdFsyKmUrMV0pO248ZCYmbj4wJiYoZz1lLGQ9bil9bGV0IG09dFsyKmddLF89dFsyKmcrMV0sYj0xLzA7Zm9yKGxldCBlPTA7ZTxvO2UrKyl7aWYoZT09PWh8fGU9PT1nKWNvbnRpbnVlO2NvbnN0IG49RmEocCx5LG0sXyx0WzIqZV0sdFsyKmUrMV0pO248YiYmKHY9ZSxiPW4pfWxldCB4PXRbMip2XSx3PXRbMip2KzFdO2lmKGI9PT0xLzApe2ZvcihsZXQgZT0wO2U8bztlKyspdGhpcy5fZGlzdHNbZV09dFsyKmVdLXRbMF18fHRbMiplKzFdLXRbMV07VGEodGhpcy5faWRzLHRoaXMuX2Rpc3RzLDAsby0xKTtjb25zdCBlPW5ldyBVaW50MzJBcnJheShvKTtsZXQgbj0wO2ZvcihsZXQgdD0wLHI9LTEvMDt0PG87dCsrKXtjb25zdCBpPXRoaXMuX2lkc1t0XTt0aGlzLl9kaXN0c1tpXT5yJiYoZVtuKytdPWkscj10aGlzLl9kaXN0c1tpXSl9cmV0dXJuIHRoaXMuaHVsbD1lLnN1YmFycmF5KDAsbiksdGhpcy50cmlhbmdsZXM9bmV3IFVpbnQzMkFycmF5KDApLHZvaWQodGhpcy5oYWxmZWRnZXM9bmV3IFVpbnQzMkFycmF5KDApKX1pZihTYShwLHksbSxfLHgsdyk8MCl7Y29uc3QgdD1nLGU9bSxuPV87Zz12LG09eCxfPXcsdj10LHg9ZSx3PW59Y29uc3Qgaj1mdW5jdGlvbih0LGUsbixyLGksbyl7Y29uc3QgbD1uLXQsYT1yLWUscz1pLXQsdT1vLWUsYz1sKmwrYSphLGY9cypzK3UqdSxoPS41LyhsKnUtYSpzKTtyZXR1cm57eDp0Kyh1KmMtYSpmKSpoLHk6ZSsobCpmLXMqYykqaH19KHAseSxtLF8seCx3KTt0aGlzLl9jeD1qLngsdGhpcy5fY3k9ai55O2ZvcihsZXQgZT0wO2U8bztlKyspdGhpcy5fZGlzdHNbZV09a2EodFsyKmVdLHRbMiplKzFdLGoueCxqLnkpO1RhKHRoaXMuX2lkcyx0aGlzLl9kaXN0cywwLG8tMSksdGhpcy5faHVsbFN0YXJ0PWg7bGV0IFM9MztuW2hdPWVbdl09ZyxuW2ddPWVbaF09dixuW3ZdPWVbZ109aCxyW2hdPTAscltnXT0xLHJbdl09MixpLmZpbGwoLTEpLGlbdGhpcy5faGFzaEtleShwLHkpXT1oLGlbdGhpcy5faGFzaEtleShtLF8pXT1nLGlbdGhpcy5faGFzaEtleSh4LHcpXT12LHRoaXMudHJpYW5nbGVzTGVuPTAsdGhpcy5fYWRkVHJpYW5nbGUoaCxnLHYsLTEsLTEsLTEpO2ZvcihsZXQgbyxsLGE9MDthPHRoaXMuX2lkcy5sZW5ndGg7YSsrKXtjb25zdCBzPXRoaXMuX2lkc1thXSx1PXRbMipzXSxjPXRbMipzKzFdO2lmKGE+MCYmTWF0aC5hYnModS1vKTw9QWEmJk1hdGguYWJzKGMtbCk8PUFhKWNvbnRpbnVlO2lmKG89dSxsPWMscz09PWh8fHM9PT1nfHxzPT09diljb250aW51ZTtsZXQgZj0wO2ZvcihsZXQgdD0wLGU9dGhpcy5faGFzaEtleSh1LGMpO3Q8dGhpcy5faGFzaFNpemUmJihmPWlbKGUrdCkldGhpcy5faGFzaFNpemVdLC0xPT09Znx8Zj09PW5bZl0pO3QrKyk7Zj1lW2ZdO2xldCBkLHA9Zjtmb3IoO2Q9bltwXSxTYSh1LGMsdFsyKnBdLHRbMipwKzFdLHRbMipkXSx0WzIqZCsxXSk+PTA7KWlmKHA9ZCxwPT09Zil7cD0tMTticmVha31pZigtMT09PXApY29udGludWU7bGV0IHk9dGhpcy5fYWRkVHJpYW5nbGUocCxzLG5bcF0sLTEsLTEscltwXSk7cltzXT10aGlzLl9sZWdhbGl6ZSh5KzIpLHJbcF09eSxTKys7bGV0IG09bltwXTtmb3IoO2Q9blttXSxTYSh1LGMsdFsyKm1dLHRbMiptKzFdLHRbMipkXSx0WzIqZCsxXSk8MDspeT10aGlzLl9hZGRUcmlhbmdsZShtLHMsZCxyW3NdLC0xLHJbbV0pLHJbc109dGhpcy5fbGVnYWxpemUoeSsyKSxuW21dPW0sUy0tLG09ZDtpZihwPT09Zilmb3IoO2Q9ZVtwXSxTYSh1LGMsdFsyKmRdLHRbMipkKzFdLHRbMipwXSx0WzIqcCsxXSk8MDspeT10aGlzLl9hZGRUcmlhbmdsZShkLHMscCwtMSxyW3BdLHJbZF0pLHRoaXMuX2xlZ2FsaXplKHkrMikscltkXT15LG5bcF09cCxTLS0scD1kO3RoaXMuX2h1bGxTdGFydD1lW3NdPXAsbltwXT1lW21dPXMsbltzXT1tLGlbdGhpcy5faGFzaEtleSh1LGMpXT1zLGlbdGhpcy5faGFzaEtleSh0WzIqcF0sdFsyKnArMV0pXT1wfXRoaXMuaHVsbD1uZXcgVWludDMyQXJyYXkoUyk7Zm9yKGxldCB0PTAsZT10aGlzLl9odWxsU3RhcnQ7dDxTO3QrKyl0aGlzLmh1bGxbdF09ZSxlPW5bZV07dGhpcy50cmlhbmdsZXM9dGhpcy5fdHJpYW5nbGVzLnN1YmFycmF5KDAsdGhpcy50cmlhbmdsZXNMZW4pLHRoaXMuaGFsZmVkZ2VzPXRoaXMuX2hhbGZlZGdlcy5zdWJhcnJheSgwLHRoaXMudHJpYW5nbGVzTGVuKX1faGFzaEtleSh0LGUpe3JldHVybiBNYXRoLmZsb29yKGZ1bmN0aW9uKHQsZSl7Y29uc3Qgbj10LyhNYXRoLmFicyh0KStNYXRoLmFicyhlKSk7cmV0dXJuKGU+MD8zLW46MStuKS80fSh0LXRoaXMuX2N4LGUtdGhpcy5fY3kpKnRoaXMuX2hhc2hTaXplKSV0aGlzLl9oYXNoU2l6ZX1fbGVnYWxpemUodCl7Y29uc3R7X3RyaWFuZ2xlczplLF9oYWxmZWRnZXM6bixjb29yZHM6cn09dGhpcztsZXQgaT0wLG89MDtmb3IoOzspe2NvbnN0IGw9blt0XSxhPXQtdCUzO2lmKG89YSsodCsyKSUzLC0xPT09bCl7aWYoMD09PWkpYnJlYWs7dD1PYVstLWldO2NvbnRpbnVlfWNvbnN0IHM9bC1sJTMsdT1hKyh0KzEpJTMsYz1zKyhsKzIpJTMsZj1lW29dLGg9ZVt0XSxnPWVbdV0sdj1lW2NdO2lmKFBhKHJbMipmXSxyWzIqZisxXSxyWzIqaF0sclsyKmgrMV0sclsyKmddLHJbMipnKzFdLHJbMip2XSxyWzIqdisxXSkpe2VbdF09dixlW2xdPWY7Y29uc3Qgcj1uW2NdO2lmKC0xPT09cil7bGV0IGU9dGhpcy5faHVsbFN0YXJ0O2Rve2lmKHRoaXMuX2h1bGxUcmlbZV09PT1jKXt0aGlzLl9odWxsVHJpW2VdPXQ7YnJlYWt9ZT10aGlzLl9odWxsUHJldltlXX13aGlsZShlIT09dGhpcy5faHVsbFN0YXJ0KX10aGlzLl9saW5rKHQsciksdGhpcy5fbGluayhsLG5bb10pLHRoaXMuX2xpbmsobyxjKTtjb25zdCBhPXMrKGwrMSklMztpPE9hLmxlbmd0aCYmKE9hW2krK109YSl9ZWxzZXtpZigwPT09aSlicmVhazt0PU9hWy0taV19fXJldHVybiBvfV9saW5rKHQsZSl7dGhpcy5faGFsZmVkZ2VzW3RdPWUsLTEhPT1lJiYodGhpcy5faGFsZmVkZ2VzW2VdPXQpfV9hZGRUcmlhbmdsZSh0LGUsbixyLGksbyl7Y29uc3QgbD10aGlzLnRyaWFuZ2xlc0xlbjtyZXR1cm4gdGhpcy5fdHJpYW5nbGVzW2xdPXQsdGhpcy5fdHJpYW5nbGVzW2wrMV09ZSx0aGlzLl90cmlhbmdsZXNbbCsyXT1uLHRoaXMuX2xpbmsobCxyKSx0aGlzLl9saW5rKGwrMSxpKSx0aGlzLl9saW5rKGwrMixvKSx0aGlzLnRyaWFuZ2xlc0xlbis9MyxsfX1mdW5jdGlvbiBrYSh0LGUsbixyKXtjb25zdCBpPXQtbixvPWUtcjtyZXR1cm4gaSppK28qb31mdW5jdGlvbiBQYSh0LGUsbixyLGksbyxsLGEpe2NvbnN0IHM9dC1sLHU9ZS1hLGM9bi1sLGY9ci1hLGg9aS1sLGc9by1hLHY9YypjK2YqZixkPWgqaCtnKmc7cmV0dXJuIHMqKGYqZC12KmcpLXUqKGMqZC12KmgpKyhzKnMrdSp1KSooYypnLWYqaCk8MH1mdW5jdGlvbiBGYSh0LGUsbixyLGksbyl7Y29uc3QgbD1uLXQsYT1yLWUscz1pLXQsdT1vLWUsYz1sKmwrYSphLGY9cypzK3UqdSxoPS41LyhsKnUtYSpzKSxnPSh1KmMtYSpmKSpoLHY9KGwqZi1zKmMpKmg7cmV0dXJuIGcqZyt2KnZ9ZnVuY3Rpb24gVGEodCxlLG4scil7aWYoci1uPD0yMClmb3IobGV0IGk9bisxO2k8PXI7aSsrKXtjb25zdCByPXRbaV0sbz1lW3JdO2xldCBsPWktMTtmb3IoO2w+PW4mJmVbdFtsXV0+bzspdFtsKzFdPXRbbC0tXTt0W2wrMV09cn1lbHNle2xldCBpPW4rMSxvPXI7emEodCxuK3I+PjEsaSksZVt0W25dXT5lW3Rbcl1dJiZ6YSh0LG4sciksZVt0W2ldXT5lW3Rbcl1dJiZ6YSh0LGksciksZVt0W25dXT5lW3RbaV1dJiZ6YSh0LG4saSk7Y29uc3QgbD10W2ldLGE9ZVtsXTtmb3IoOzspe2Rve2krK313aGlsZShlW3RbaV1dPGEpO2Rve28tLX13aGlsZShlW3Rbb11dPmEpO2lmKG88aSlicmVhazt6YSh0LGksbyl9dFtuKzFdPXRbb10sdFtvXT1sLHItaSsxPj1vLW4/KFRhKHQsZSxpLHIpLFRhKHQsZSxuLG8tMSkpOihUYSh0LGUsbixvLTEpLFRhKHQsZSxpLHIpKX19ZnVuY3Rpb24gemEodCxlLG4pe2NvbnN0IHI9dFtlXTt0W2VdPXRbbl0sdFtuXT1yfWZ1bmN0aW9uIElhKHQpe3JldHVybiB0WzBdfWZ1bmN0aW9uICRhKHQpe3JldHVybiB0WzFdfWNvbnN0IEVhPTFlLTY7Y2xhc3MgTmF7Y29uc3RydWN0b3IoKXt0aGlzLl94MD10aGlzLl95MD10aGlzLl94MT10aGlzLl95MT1udWxsLHRoaXMuXz0iIn1tb3ZlVG8odCxlKXt0aGlzLl8rPWBNJHt0aGlzLl94MD10aGlzLl94MT0rdH0sJHt0aGlzLl95MD10aGlzLl95MT0rZX1gfWNsb3NlUGF0aCgpe251bGwhPT10aGlzLl94MSYmKHRoaXMuX3gxPXRoaXMuX3gwLHRoaXMuX3kxPXRoaXMuX3kwLHRoaXMuXys9IloiKX1saW5lVG8odCxlKXt0aGlzLl8rPWBMJHt0aGlzLl94MT0rdH0sJHt0aGlzLl95MT0rZX1gfWFyYyh0LGUsbil7Y29uc3Qgcj0odD0rdCkrKG49K24pLGk9ZT0rZTtpZihuPDApdGhyb3cgbmV3IEVycm9yKCJuZWdhdGl2ZSByYWRpdXMiKTtudWxsPT09dGhpcy5feDE/dGhpcy5fKz1gTSR7cn0sJHtpfWA6KE1hdGguYWJzKHRoaXMuX3gxLXIpPkVhfHxNYXRoLmFicyh0aGlzLl95MS1pKT5FYSkmJih0aGlzLl8rPSJMIityKyIsIitpKSxuJiYodGhpcy5fKz1gQSR7bn0sJHtufSwwLDEsMSwke3Qtbn0sJHtlfUEke259LCR7bn0sMCwxLDEsJHt0aGlzLl94MT1yfSwke3RoaXMuX3kxPWl9YCl9cmVjdCh0LGUsbixyKXt0aGlzLl8rPWBNJHt0aGlzLl94MD10aGlzLl94MT0rdH0sJHt0aGlzLl95MD10aGlzLl95MT0rZX1oJHsrbn12JHsrcn1oJHstbn1aYH12YWx1ZSgpe3JldHVybiB0aGlzLl98fG51bGx9fWNsYXNzIFJhe2NvbnN0cnVjdG9yKCl7dGhpcy5fPVtdfW1vdmVUbyh0LGUpe3RoaXMuXy5wdXNoKFt0LGVdKX1jbG9zZVBhdGgoKXt0aGlzLl8ucHVzaCh0aGlzLl9bMF0uc2xpY2UoKSl9bGluZVRvKHQsZSl7dGhpcy5fLnB1c2goW3QsZV0pfXZhbHVlKCl7cmV0dXJuIHRoaXMuXy5sZW5ndGg/dGhpcy5fOm51bGx9fWNsYXNzIENhe2NvbnN0cnVjdG9yKHQsW2UsbixyLGldPVswLDAsOTYwLDUwMF0pe2lmKCEoKHI9K3IpPj0oZT0rZSkmJihpPStpKT49KG49K24pKSl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgYm91bmRzIik7dGhpcy5kZWxhdW5heT10LHRoaXMuX2NpcmN1bWNlbnRlcnM9bmV3IEZsb2F0NjRBcnJheSgyKnQucG9pbnRzLmxlbmd0aCksdGhpcy52ZWN0b3JzPW5ldyBGbG9hdDY0QXJyYXkoMip0LnBvaW50cy5sZW5ndGgpLHRoaXMueG1heD1yLHRoaXMueG1pbj1lLHRoaXMueW1heD1pLHRoaXMueW1pbj1uLHRoaXMuX2luaXQoKX11cGRhdGUoKXtyZXR1cm4gdGhpcy5kZWxhdW5heS51cGRhdGUoKSx0aGlzLl9pbml0KCksdGhpc31faW5pdCgpe2NvbnN0e2RlbGF1bmF5Ontwb2ludHM6dCxodWxsOmUsdHJpYW5nbGVzOm59LHZlY3RvcnM6cn09dGhpcyxpPXRoaXMuY2lyY3VtY2VudGVycz10aGlzLl9jaXJjdW1jZW50ZXJzLnN1YmFycmF5KDAsbi5sZW5ndGgvMyoyKTtmb3IobGV0IGUscixvPTAsbD0wLGE9bi5sZW5ndGg7bzxhO28rPTMsbCs9Mil7Y29uc3QgYT0yKm5bb10scz0yKm5bbysxXSx1PTIqbltvKzJdLGM9dFthXSxmPXRbYSsxXSxoPXRbc10sZz10W3MrMV0sdj10W3VdLGQ9dFt1KzFdLHA9aC1jLHk9Zy1mLG09di1jLF89ZC1mLGI9MioocCpfLXkqbSk7aWYoTWF0aC5hYnMoYik8MWUtOSl7bGV0IGk9MWU5O2NvbnN0IG89MipuWzBdO2kqPU1hdGguc2lnbigodFtvXS1jKSpfLSh0W28rMV0tZikqbSksZT0oYyt2KS8yLWkqXyxyPShmK2QpLzIraSptfWVsc2V7Y29uc3QgdD0xL2Isbj1wKnAreSp5LGk9bSptK18qXztlPWMrKF8qbi15KmkpKnQscj1mKyhwKmktbSpuKSp0fWlbbF09ZSxpW2wrMV09cn1sZXQgbyxsLGEscz1lW2UubGVuZ3RoLTFdLHU9NCpzLGM9dFsyKnNdLGY9dFsyKnMrMV07ci5maWxsKDApO2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7KytuKXM9ZVtuXSxvPXUsbD1jLGE9Zix1PTQqcyxjPXRbMipzXSxmPXRbMipzKzFdLHJbbysyXT1yW3VdPWEtZixyW28rM109clt1KzFdPWMtbH1yZW5kZXIodCl7Y29uc3QgZT1udWxsPT10P3Q9bmV3IE5hOnZvaWQgMCx7ZGVsYXVuYXk6e2hhbGZlZGdlczpuLGluZWRnZXM6cixodWxsOml9LGNpcmN1bWNlbnRlcnM6byx2ZWN0b3JzOmx9PXRoaXM7aWYoaS5sZW5ndGg8PTEpcmV0dXJuIG51bGw7Zm9yKGxldCBlPTAscj1uLmxlbmd0aDtlPHI7KytlKXtjb25zdCByPW5bZV07aWYocjxlKWNvbnRpbnVlO2NvbnN0IGk9MipNYXRoLmZsb29yKGUvMyksbD0yKk1hdGguZmxvb3Ioci8zKSxhPW9baV0scz1vW2krMV0sdT1vW2xdLGM9b1tsKzFdO3RoaXMuX3JlbmRlclNlZ21lbnQoYSxzLHUsYyx0KX1sZXQgYSxzPWlbaS5sZW5ndGgtMV07Zm9yKGxldCBlPTA7ZTxpLmxlbmd0aDsrK2Upe2E9cyxzPWlbZV07Y29uc3Qgbj0yKk1hdGguZmxvb3IocltzXS8zKSx1PW9bbl0sYz1vW24rMV0sZj00KmEsaD10aGlzLl9wcm9qZWN0KHUsYyxsW2YrMl0sbFtmKzNdKTtoJiZ0aGlzLl9yZW5kZXJTZWdtZW50KHUsYyxoWzBdLGhbMV0sdCl9cmV0dXJuIGUmJmUudmFsdWUoKX1yZW5kZXJCb3VuZHModCl7Y29uc3QgZT1udWxsPT10P3Q9bmV3IE5hOnZvaWQgMDtyZXR1cm4gdC5yZWN0KHRoaXMueG1pbix0aGlzLnltaW4sdGhpcy54bWF4LXRoaXMueG1pbix0aGlzLnltYXgtdGhpcy55bWluKSxlJiZlLnZhbHVlKCl9cmVuZGVyQ2VsbCh0LGUpe2NvbnN0IG49bnVsbD09ZT9lPW5ldyBOYTp2b2lkIDAscj10aGlzLl9jbGlwKHQpO2lmKG51bGw9PT1yfHwhci5sZW5ndGgpcmV0dXJuO2UubW92ZVRvKHJbMF0sclsxXSk7bGV0IGk9ci5sZW5ndGg7Zm9yKDtyWzBdPT09cltpLTJdJiZyWzFdPT09cltpLTFdJiZpPjE7KWktPTI7Zm9yKGxldCB0PTI7dDxpO3QrPTIpclt0XT09PXJbdC0yXSYmclt0KzFdPT09clt0LTFdfHxlLmxpbmVUbyhyW3RdLHJbdCsxXSk7cmV0dXJuIGUuY2xvc2VQYXRoKCksbiYmbi52YWx1ZSgpfSpjZWxsUG9seWdvbnMoKXtjb25zdHtkZWxhdW5heTp7cG9pbnRzOnR9fT10aGlzO2ZvcihsZXQgZT0wLG49dC5sZW5ndGgvMjtlPG47KytlKXtjb25zdCB0PXRoaXMuY2VsbFBvbHlnb24oZSk7dCYmKHQuaW5kZXg9ZSx5aWVsZCB0KX19Y2VsbFBvbHlnb24odCl7Y29uc3QgZT1uZXcgUmE7cmV0dXJuIHRoaXMucmVuZGVyQ2VsbCh0LGUpLGUudmFsdWUoKX1fcmVuZGVyU2VnbWVudCh0LGUsbixyLGkpe2xldCBvO2NvbnN0IGw9dGhpcy5fcmVnaW9uY29kZSh0LGUpLGE9dGhpcy5fcmVnaW9uY29kZShuLHIpOzA9PT1sJiYwPT09YT8oaS5tb3ZlVG8odCxlKSxpLmxpbmVUbyhuLHIpKToobz10aGlzLl9jbGlwU2VnbWVudCh0LGUsbixyLGwsYSkpJiYoaS5tb3ZlVG8ob1swXSxvWzFdKSxpLmxpbmVUbyhvWzJdLG9bM10pKX1jb250YWlucyh0LGUsbil7cmV0dXJuKGU9K2UpPT1lJiYobj0rbik9PW4mJnRoaXMuZGVsYXVuYXkuX3N0ZXAodCxlLG4pPT09dH0qbmVpZ2hib3JzKHQpe2NvbnN0IGU9dGhpcy5fY2xpcCh0KTtpZihlKWZvcihjb25zdCBuIG9mIHRoaXMuZGVsYXVuYXkubmVpZ2hib3JzKHQpKXtjb25zdCB0PXRoaXMuX2NsaXAobik7aWYodCl0OmZvcihsZXQgcj0wLGk9ZS5sZW5ndGg7cjxpO3IrPTIpZm9yKGxldCBvPTAsbD10Lmxlbmd0aDtvPGw7bys9MilpZihlW3JdPT09dFtvXSYmZVtyKzFdPT09dFtvKzFdJiZlWyhyKzIpJWldPT09dFsobytsLTIpJWxdJiZlWyhyKzMpJWldPT09dFsobytsLTEpJWxdKXt5aWVsZCBuO2JyZWFrIHR9fX1fY2VsbCh0KXtjb25zdHtjaXJjdW1jZW50ZXJzOmUsZGVsYXVuYXk6e2luZWRnZXM6bixoYWxmZWRnZXM6cix0cmlhbmdsZXM6aX19PXRoaXMsbz1uW3RdO2lmKC0xPT09bylyZXR1cm4gbnVsbDtjb25zdCBsPVtdO2xldCBhPW87ZG97Y29uc3Qgbj1NYXRoLmZsb29yKGEvMyk7aWYobC5wdXNoKGVbMipuXSxlWzIqbisxXSksYT1hJTM9PTI/YS0yOmErMSxpW2FdIT09dClicmVhazthPXJbYV19d2hpbGUoYSE9PW8mJi0xIT09YSk7cmV0dXJuIGx9X2NsaXAodCl7aWYoMD09PXQmJjE9PT10aGlzLmRlbGF1bmF5Lmh1bGwubGVuZ3RoKXJldHVyblt0aGlzLnhtYXgsdGhpcy55bWluLHRoaXMueG1heCx0aGlzLnltYXgsdGhpcy54bWluLHRoaXMueW1heCx0aGlzLnhtaW4sdGhpcy55bWluXTtjb25zdCBlPXRoaXMuX2NlbGwodCk7aWYobnVsbD09PWUpcmV0dXJuIG51bGw7Y29uc3R7dmVjdG9yczpufT10aGlzLHI9NCp0O3JldHVybiB0aGlzLl9zaW1wbGlmeShuW3JdfHxuW3IrMV0/dGhpcy5fY2xpcEluZmluaXRlKHQsZSxuW3JdLG5bcisxXSxuW3IrMl0sbltyKzNdKTp0aGlzLl9jbGlwRmluaXRlKHQsZSkpfV9jbGlwRmluaXRlKHQsZSl7Y29uc3Qgbj1lLmxlbmd0aDtsZXQgcixpLG8sbCxhPW51bGwscz1lW24tMl0sdT1lW24tMV0sYz10aGlzLl9yZWdpb25jb2RlKHMsdSksZj0wO2ZvcihsZXQgaD0wO2g8bjtoKz0yKWlmKHI9cyxpPXUscz1lW2hdLHU9ZVtoKzFdLG89YyxjPXRoaXMuX3JlZ2lvbmNvZGUocyx1KSwwPT09byYmMD09PWMpbD1mLGY9MCxhP2EucHVzaChzLHUpOmE9W3MsdV07ZWxzZXtsZXQgZSxuLGgsZyx2O2lmKDA9PT1vKXtpZihudWxsPT09KGU9dGhpcy5fY2xpcFNlZ21lbnQocixpLHMsdSxvLGMpKSljb250aW51ZTtbbixoLGcsdl09ZX1lbHNle2lmKG51bGw9PT0oZT10aGlzLl9jbGlwU2VnbWVudChzLHUscixpLGMsbykpKWNvbnRpbnVlO1tnLHYsbixoXT1lLGw9ZixmPXRoaXMuX2VkZ2Vjb2RlKG4saCksbCYmZiYmdGhpcy5fZWRnZSh0LGwsZixhLGEubGVuZ3RoKSxhP2EucHVzaChuLGgpOmE9W24saF19bD1mLGY9dGhpcy5fZWRnZWNvZGUoZyx2KSxsJiZmJiZ0aGlzLl9lZGdlKHQsbCxmLGEsYS5sZW5ndGgpLGE/YS5wdXNoKGcsdik6YT1bZyx2XX1pZihhKWw9ZixmPXRoaXMuX2VkZ2Vjb2RlKGFbMF0sYVsxXSksbCYmZiYmdGhpcy5fZWRnZSh0LGwsZixhLGEubGVuZ3RoKTtlbHNlIGlmKHRoaXMuY29udGFpbnModCwodGhpcy54bWluK3RoaXMueG1heCkvMiwodGhpcy55bWluK3RoaXMueW1heCkvMikpcmV0dXJuW3RoaXMueG1heCx0aGlzLnltaW4sdGhpcy54bWF4LHRoaXMueW1heCx0aGlzLnhtaW4sdGhpcy55bWF4LHRoaXMueG1pbix0aGlzLnltaW5dO3JldHVybiBhfV9jbGlwU2VnbWVudCh0LGUsbixyLGksbyl7Y29uc3QgbD1pPG87Zm9yKGwmJihbdCxlLG4scixpLG9dPVtuLHIsdCxlLG8saV0pOzspe2lmKDA9PT1pJiYwPT09bylyZXR1cm4gbD9bbixyLHQsZV06W3QsZSxuLHJdO2lmKGkmbylyZXR1cm4gbnVsbDtsZXQgYSxzLHU9aXx8bzs4JnU/KGE9dCsobi10KSoodGhpcy55bWF4LWUpLyhyLWUpLHM9dGhpcy55bWF4KTo0JnU/KGE9dCsobi10KSoodGhpcy55bWluLWUpLyhyLWUpLHM9dGhpcy55bWluKToyJnU/KHM9ZSsoci1lKSoodGhpcy54bWF4LXQpLyhuLXQpLGE9dGhpcy54bWF4KToocz1lKyhyLWUpKih0aGlzLnhtaW4tdCkvKG4tdCksYT10aGlzLnhtaW4pLGk/KHQ9YSxlPXMsaT10aGlzLl9yZWdpb25jb2RlKHQsZSkpOihuPWEscj1zLG89dGhpcy5fcmVnaW9uY29kZShuLHIpKX19X2NsaXBJbmZpbml0ZSh0LGUsbixyLGksbyl7bGV0IGwsYT1BcnJheS5mcm9tKGUpO2lmKChsPXRoaXMuX3Byb2plY3QoYVswXSxhWzFdLG4scikpJiZhLnVuc2hpZnQobFswXSxsWzFdKSwobD10aGlzLl9wcm9qZWN0KGFbYS5sZW5ndGgtMl0sYVthLmxlbmd0aC0xXSxpLG8pKSYmYS5wdXNoKGxbMF0sbFsxXSksYT10aGlzLl9jbGlwRmluaXRlKHQsYSkpZm9yKGxldCBlLG49MCxyPWEubGVuZ3RoLGk9dGhpcy5fZWRnZWNvZGUoYVtyLTJdLGFbci0xXSk7bjxyO24rPTIpZT1pLGk9dGhpcy5fZWRnZWNvZGUoYVtuXSxhW24rMV0pLGUmJmkmJihuPXRoaXMuX2VkZ2UodCxlLGksYSxuKSxyPWEubGVuZ3RoKTtlbHNlIHRoaXMuY29udGFpbnModCwodGhpcy54bWluK3RoaXMueG1heCkvMiwodGhpcy55bWluK3RoaXMueW1heCkvMikmJihhPVt0aGlzLnhtaW4sdGhpcy55bWluLHRoaXMueG1heCx0aGlzLnltaW4sdGhpcy54bWF4LHRoaXMueW1heCx0aGlzLnhtaW4sdGhpcy55bWF4XSk7cmV0dXJuIGF9X2VkZ2UodCxlLG4scixpKXtmb3IoO2UhPT1uOyl7bGV0IG4sbztzd2l0Y2goZSl7Y2FzZSA1OmU9NDtjb250aW51ZTtjYXNlIDQ6ZT02LG49dGhpcy54bWF4LG89dGhpcy55bWluO2JyZWFrO2Nhc2UgNjplPTI7Y29udGludWU7Y2FzZSAyOmU9MTAsbj10aGlzLnhtYXgsbz10aGlzLnltYXg7YnJlYWs7Y2FzZSAxMDplPTg7Y29udGludWU7Y2FzZSA4OmU9OSxuPXRoaXMueG1pbixvPXRoaXMueW1heDticmVhaztjYXNlIDk6ZT0xO2NvbnRpbnVlO2Nhc2UgMTplPTUsbj10aGlzLnhtaW4sbz10aGlzLnltaW59cltpXT09PW4mJnJbaSsxXT09PW98fCF0aGlzLmNvbnRhaW5zKHQsbixvKXx8KHIuc3BsaWNlKGksMCxuLG8pLGkrPTIpfXJldHVybiBpfV9wcm9qZWN0KHQsZSxuLHIpe2xldCBpLG8sbCxhPTEvMDtpZihyPDApe2lmKGU8PXRoaXMueW1pbilyZXR1cm4gbnVsbDsoaT0odGhpcy55bWluLWUpL3IpPGEmJihsPXRoaXMueW1pbixvPXQrKGE9aSkqbil9ZWxzZSBpZihyPjApe2lmKGU+PXRoaXMueW1heClyZXR1cm4gbnVsbDsoaT0odGhpcy55bWF4LWUpL3IpPGEmJihsPXRoaXMueW1heCxvPXQrKGE9aSkqbil9aWYobj4wKXtpZih0Pj10aGlzLnhtYXgpcmV0dXJuIG51bGw7KGk9KHRoaXMueG1heC10KS9uKTxhJiYobz10aGlzLnhtYXgsbD1lKyhhPWkpKnIpfWVsc2UgaWYobjwwKXtpZih0PD10aGlzLnhtaW4pcmV0dXJuIG51bGw7KGk9KHRoaXMueG1pbi10KS9uKTxhJiYobz10aGlzLnhtaW4sbD1lKyhhPWkpKnIpfXJldHVybltvLGxdfV9lZGdlY29kZSh0LGUpe3JldHVybih0PT09dGhpcy54bWluPzE6dD09PXRoaXMueG1heD8yOjApfChlPT09dGhpcy55bWluPzQ6ZT09PXRoaXMueW1heD84OjApfV9yZWdpb25jb2RlKHQsZSl7cmV0dXJuKHQ8dGhpcy54bWluPzE6dD50aGlzLnhtYXg/MjowKXwoZTx0aGlzLnltaW4/NDplPnRoaXMueW1heD84OjApfV9zaW1wbGlmeSh0KXtpZih0JiZ0Lmxlbmd0aD40KXtmb3IobGV0IGU9MDtlPHQubGVuZ3RoO2UrPTIpe2NvbnN0IG49KGUrMikldC5sZW5ndGgscj0oZSs0KSV0Lmxlbmd0aDsodFtlXT09PXRbbl0mJnRbbl09PT10W3JdfHx0W2UrMV09PT10W24rMV0mJnRbbisxXT09PXRbcisxXSkmJih0LnNwbGljZShuLDIpLGUtPTIpfXQubGVuZ3RofHwodD1udWxsKX1yZXR1cm4gdH19Y29uc3QgQmE9MipNYXRoLlBJLFVhPU1hdGgucG93O2Z1bmN0aW9uIExhKHQpe3JldHVybiB0WzBdfWZ1bmN0aW9uIERhKHQpe3JldHVybiB0WzFdfWZ1bmN0aW9uIEhhKHQsZSxuKXtyZXR1cm5bdCtNYXRoLnNpbih0K2UpKm4sZStNYXRoLmNvcyh0LWUpKm5dfWNsYXNzIFhhe3N0YXRpYyBmcm9tKHQsZT1MYSxuPURhLHIpe3JldHVybiBuZXcgWGEoImxlbmd0aCJpbiB0P2Z1bmN0aW9uKHQsZSxuLHIpe2NvbnN0IGk9dC5sZW5ndGgsbz1uZXcgRmxvYXQ2NEFycmF5KDIqaSk7Zm9yKGxldCBsPTA7bDxpOysrbCl7Y29uc3QgaT10W2xdO29bMipsXT1lLmNhbGwocixpLGwsdCksb1syKmwrMV09bi5jYWxsKHIsaSxsLHQpfXJldHVybiBvfSh0LGUsbixyKTpGbG9hdDY0QXJyYXkuZnJvbShmdW5jdGlvbioodCxlLG4scil7bGV0IGk9MDtmb3IoY29uc3QgbyBvZiB0KXlpZWxkIGUuY2FsbChyLG8saSx0KSx5aWVsZCBuLmNhbGwocixvLGksdCksKytpfSh0LGUsbixyKSkpfWNvbnN0cnVjdG9yKHQpe3RoaXMuX2RlbGF1bmF0b3I9bmV3IE1hKHQpLHRoaXMuaW5lZGdlcz1uZXcgSW50MzJBcnJheSh0Lmxlbmd0aC8yKSx0aGlzLl9odWxsSW5kZXg9bmV3IEludDMyQXJyYXkodC5sZW5ndGgvMiksdGhpcy5wb2ludHM9dGhpcy5fZGVsYXVuYXRvci5jb29yZHMsdGhpcy5faW5pdCgpfXVwZGF0ZSgpe3JldHVybiB0aGlzLl9kZWxhdW5hdG9yLnVwZGF0ZSgpLHRoaXMuX2luaXQoKSx0aGlzfV9pbml0KCl7Y29uc3QgdD10aGlzLl9kZWxhdW5hdG9yLGU9dGhpcy5wb2ludHM7aWYodC5odWxsJiZ0Lmh1bGwubGVuZ3RoPjImJmZ1bmN0aW9uKHQpe2NvbnN0e3RyaWFuZ2xlczplLGNvb3JkczpufT10O2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCs9Myl7Y29uc3Qgcj0yKmVbdF0saT0yKmVbdCsxXSxvPTIqZVt0KzJdO2lmKChuW29dLW5bcl0pKihuW2krMV0tbltyKzFdKS0obltpXS1uW3JdKSoobltvKzFdLW5bcisxXSk+MWUtMTApcmV0dXJuITF9cmV0dXJuITB9KHQpKXt0aGlzLmNvbGxpbmVhcj1JbnQzMkFycmF5LmZyb20oe2xlbmd0aDplLmxlbmd0aC8yfSwoKHQsZSk9PmUpKS5zb3J0KCgodCxuKT0+ZVsyKnRdLWVbMipuXXx8ZVsyKnQrMV0tZVsyKm4rMV0pKTtjb25zdCB0PXRoaXMuY29sbGluZWFyWzBdLG49dGhpcy5jb2xsaW5lYXJbdGhpcy5jb2xsaW5lYXIubGVuZ3RoLTFdLHI9W2VbMip0XSxlWzIqdCsxXSxlWzIqbl0sZVsyKm4rMV1dLGk9MWUtOCpNYXRoLmh5cG90KHJbM10tclsxXSxyWzJdLXJbMF0pO2ZvcihsZXQgdD0wLG49ZS5sZW5ndGgvMjt0PG47Kyt0KXtjb25zdCBuPUhhKGVbMip0XSxlWzIqdCsxXSxpKTtlWzIqdF09blswXSxlWzIqdCsxXT1uWzFdfXRoaXMuX2RlbGF1bmF0b3I9bmV3IE1hKGUpfWVsc2UgZGVsZXRlIHRoaXMuY29sbGluZWFyO2NvbnN0IG49dGhpcy5oYWxmZWRnZXM9dGhpcy5fZGVsYXVuYXRvci5oYWxmZWRnZXMscj10aGlzLmh1bGw9dGhpcy5fZGVsYXVuYXRvci5odWxsLGk9dGhpcy50cmlhbmdsZXM9dGhpcy5fZGVsYXVuYXRvci50cmlhbmdsZXMsbz10aGlzLmluZWRnZXMuZmlsbCgtMSksbD10aGlzLl9odWxsSW5kZXguZmlsbCgtMSk7Zm9yKGxldCB0PTAsZT1uLmxlbmd0aDt0PGU7Kyt0KXtjb25zdCBlPWlbdCUzPT0yP3QtMjp0KzFdOy0xIT09blt0XSYmLTEhPT1vW2VdfHwob1tlXT10KX1mb3IobGV0IHQ9MCxlPXIubGVuZ3RoO3Q8ZTsrK3QpbFtyW3RdXT10O3IubGVuZ3RoPD0yJiZyLmxlbmd0aD4wJiYodGhpcy50cmlhbmdsZXM9bmV3IEludDMyQXJyYXkoMykuZmlsbCgtMSksdGhpcy5oYWxmZWRnZXM9bmV3IEludDMyQXJyYXkoMykuZmlsbCgtMSksdGhpcy50cmlhbmdsZXNbMF09clswXSxvW3JbMF1dPTEsMj09PXIubGVuZ3RoJiYob1tyWzFdXT0wLHRoaXMudHJpYW5nbGVzWzFdPXJbMV0sdGhpcy50cmlhbmdsZXNbMl09clsxXSkpfXZvcm9ub2kodCl7cmV0dXJuIG5ldyBDYSh0aGlzLHQpfSpuZWlnaGJvcnModCl7Y29uc3R7aW5lZGdlczplLGh1bGw6bixfaHVsbEluZGV4OnIsaGFsZmVkZ2VzOmksdHJpYW5nbGVzOm8sY29sbGluZWFyOmx9PXRoaXM7aWYobCl7Y29uc3QgZT1sLmluZGV4T2YodCk7cmV0dXJuIGU+MCYmKHlpZWxkIGxbZS0xXSksdm9pZChlPGwubGVuZ3RoLTEmJih5aWVsZCBsW2UrMV0pKX1jb25zdCBhPWVbdF07aWYoLTE9PT1hKXJldHVybjtsZXQgcz1hLHU9LTE7ZG97aWYoeWllbGQgdT1vW3NdLHM9cyUzPT0yP3MtMjpzKzEsb1tzXSE9PXQpcmV0dXJuO2lmKHM9aVtzXSwtMT09PXMpe2NvbnN0IGU9blsoclt0XSsxKSVuLmxlbmd0aF07cmV0dXJuIHZvaWQoZSE9PXUmJih5aWVsZCBlKSl9fXdoaWxlKHMhPT1hKX1maW5kKHQsZSxuPTApe2lmKCh0PSt0KSE9dHx8KGU9K2UpIT1lKXJldHVybi0xO2NvbnN0IHI9bjtsZXQgaTtmb3IoOyhpPXRoaXMuX3N0ZXAobix0LGUpKT49MCYmaSE9PW4mJmkhPT1yOyluPWk7cmV0dXJuIGl9X3N0ZXAodCxlLG4pe2NvbnN0e2luZWRnZXM6cixodWxsOmksX2h1bGxJbmRleDpvLGhhbGZlZGdlczpsLHRyaWFuZ2xlczphLHBvaW50czpzfT10aGlzO2lmKC0xPT09clt0XXx8IXMubGVuZ3RoKXJldHVybih0KzEpJShzLmxlbmd0aD4+MSk7bGV0IHU9dCxjPVVhKGUtc1syKnRdLDIpK1VhKG4tc1syKnQrMV0sMik7Y29uc3QgZj1yW3RdO2xldCBoPWY7ZG97bGV0IHI9YVtoXTtjb25zdCBmPVVhKGUtc1syKnJdLDIpK1VhKG4tc1syKnIrMV0sMik7aWYoZjxjJiYoYz1mLHU9ciksaD1oJTM9PTI/aC0yOmgrMSxhW2hdIT09dClicmVhaztpZihoPWxbaF0sLTE9PT1oKXtpZihoPWlbKG9bdF0rMSklaS5sZW5ndGhdLGghPT1yJiZVYShlLXNbMipoXSwyKStVYShuLXNbMipoKzFdLDIpPGMpcmV0dXJuIGg7YnJlYWt9fXdoaWxlKGghPT1mKTtyZXR1cm4gdX1yZW5kZXIodCl7Y29uc3QgZT1udWxsPT10P3Q9bmV3IE5hOnZvaWQgMCx7cG9pbnRzOm4saGFsZmVkZ2VzOnIsdHJpYW5nbGVzOml9PXRoaXM7Zm9yKGxldCBlPTAsbz1yLmxlbmd0aDtlPG87KytlKXtjb25zdCBvPXJbZV07aWYobzxlKWNvbnRpbnVlO2NvbnN0IGw9MippW2VdLGE9MippW29dO3QubW92ZVRvKG5bbF0sbltsKzFdKSx0LmxpbmVUbyhuW2FdLG5bYSsxXSl9cmV0dXJuIHRoaXMucmVuZGVySHVsbCh0KSxlJiZlLnZhbHVlKCl9cmVuZGVyUG9pbnRzKHQsZSl7dm9pZCAwIT09ZXx8dCYmImZ1bmN0aW9uIj09dHlwZW9mIHQubW92ZVRvfHwoZT10LHQ9bnVsbCksZT1udWxsPT1lPzI6K2U7Y29uc3Qgbj1udWxsPT10P3Q9bmV3IE5hOnZvaWQgMCx7cG9pbnRzOnJ9PXRoaXM7Zm9yKGxldCBuPTAsaT1yLmxlbmd0aDtuPGk7bis9Mil7Y29uc3QgaT1yW25dLG89cltuKzFdO3QubW92ZVRvKGkrZSxvKSx0LmFyYyhpLG8sZSwwLEJhKX1yZXR1cm4gbiYmbi52YWx1ZSgpfXJlbmRlckh1bGwodCl7Y29uc3QgZT1udWxsPT10P3Q9bmV3IE5hOnZvaWQgMCx7aHVsbDpuLHBvaW50czpyfT10aGlzLGk9MipuWzBdLG89bi5sZW5ndGg7dC5tb3ZlVG8ocltpXSxyW2krMV0pO2ZvcihsZXQgZT0xO2U8bzsrK2Upe2NvbnN0IGk9MipuW2VdO3QubGluZVRvKHJbaV0scltpKzFdKX1yZXR1cm4gdC5jbG9zZVBhdGgoKSxlJiZlLnZhbHVlKCl9aHVsbFBvbHlnb24oKXtjb25zdCB0PW5ldyBSYTtyZXR1cm4gdGhpcy5yZW5kZXJIdWxsKHQpLHQudmFsdWUoKX1yZW5kZXJUcmlhbmdsZSh0LGUpe2NvbnN0IG49bnVsbD09ZT9lPW5ldyBOYTp2b2lkIDAse3BvaW50czpyLHRyaWFuZ2xlczppfT10aGlzLG89MippW3QqPTNdLGw9MippW3QrMV0sYT0yKmlbdCsyXTtyZXR1cm4gZS5tb3ZlVG8ocltvXSxyW28rMV0pLGUubGluZVRvKHJbbF0scltsKzFdKSxlLmxpbmVUbyhyW2FdLHJbYSsxXSksZS5jbG9zZVBhdGgoKSxuJiZuLnZhbHVlKCl9KnRyaWFuZ2xlUG9seWdvbnMoKXtjb25zdHt0cmlhbmdsZXM6dH09dGhpcztmb3IobGV0IGU9MCxuPXQubGVuZ3RoLzM7ZTxuOysrZSl5aWVsZCB0aGlzLnRyaWFuZ2xlUG9seWdvbihlKX10cmlhbmdsZVBvbHlnb24odCl7Y29uc3QgZT1uZXcgUmE7cmV0dXJuIHRoaXMucmVuZGVyVHJpYW5nbGUodCxlKSxlLnZhbHVlKCl9fWZ1bmN0aW9uIFlhKHQsZSxuPXt9KXtpZighTm8odCkpcmV0dXJue2VycjoicHNTcmMgaXMgbm90IGFuIGFycmF5In07aWYoIUlvKGUpJiYhTm8oZSkpcmV0dXJue2VycjoicHNUYXIgaXMgbm90IGFuIG9iamVjdCBvciBhcnJheSJ9O2xldCByPUlvKGUpO3ImJihlPVtlXSk7bGV0IGk9X2Uobiwia2V5WCIpO0FlKGkpfHwoaT0ieCIpO2xldCBvPV9lKG4sImtleVkiKTtBZShvKXx8KG89InkiKTtsZXQgbD1fZShuLCJrZXlaIik7QWUobCl8fChsPSJ6Iik7bGV0IGE9X2Uobiwic2NhbGUiKTtSbyhhKXx8KGE9MSksYT1RbyhhKTtsZXQgcz1fZShuLCJmdW5JbnRlcnBGcmFnbWVudCIpLHU9Q28ocyksYz1fZShuLCJmdW5JbnRlcnBGcmFnbWVudHMiKSxmPUNvKGMpLGg9ImluZCI7aWYodD1ubCh0LHtrZXlYOmksa2V5WTpvLGtleVo6bCxrZXlJbmQ6aH0pLDA9PT1rbyh0KSlyZXR1cm57ZXJyOiJwc1NyYyBoYXMgbm8gZWZmZWN0aXZlIGRhdGEifTtpZihlPWVsKGUse2tleVg6aSxrZXlZOm8sa2V5SW5kOmh9KSwwPT09a28oZSkpcmV0dXJue2VycjoicHNUYXIgaGFzIG5vIGVmZmVjdGl2ZSBkYXRhIn07bGV0IGc9QmwodCx7a2V5SW5kOmgsc2NhbGU6YX0pO3Q9Zy5wcztsZXQgdj1nLm52LGQ9Zy5pbnYscD1bLi4udF0seT1bLi4udF0sbT17fTtFbih0LCh0PT57bGV0IGU9YCR7dC54fS0ke3QueX1gO21bZV09dC56fSkpO2xldCBfLGI9WGEuZnJvbSh5LCh0PT50LngpLCh0PT50LnkpKSx4PVswLDAsYSxhXSx3PWIudm9yb25vaSh4KSxqPShlLG4scik9PntsZXQgaT1bLi4udF0sbz17eDpuLHk6cix6OjB9O2kucHVzaChvKSxlLnB1c2gobyk7bGV0IGw9WGEuZnJvbShpLCh0PT50LngpLCh0PT50LnkpKS52b3Jvbm9pKHgpLGE9aS5sZW5ndGgtMSxoPWwuY2VsbFBvbHlnb24oYSksZz1WbChoKSx2PW51bGw7aWYoZz4wKXtsZXQgdD1bXSxuPWwuZGVsYXVuYXkubmVpZ2hib3JzKGEpLHI9bi5uZXh0KCk7Zm9yKDshci5kb25lOyl7bGV0IGU9ci52YWx1ZTt0LnB1c2goZSkscj1uLm5leHQoKX1sZXQgaT1WaSh0LCh0PT57bGV0IGU9W2hdLG49W3cuY2VsbFBvbHlnb24odCldLHI9W107dHJ5e3I9ZnVuY3Rpb24odCxlKXtpZighTm8odCkpcmV0dXJuIG51bGw7aWYoIU5vKGUpKXJldHVybiBudWxsO3Q9SmwodCksZT1KbChlKTtsZXQgbj1oYS5pbnRlcnNlY3Qoe3JlZ2lvbnM6dH0se3JlZ2lvbnM6ZX0pO3JldHVybiBfZShuLCJyZWdpb25zIixbXSl9KGUsbil9Y2F0Y2godCl7Y29uc29sZS5sb2coInBnczEiLGUpLGNvbnNvbGUubG9nKCJwZ3MyIixuKSxjb25zb2xlLmxvZyh0KX1sZXQgaT0wO2lmKDE9PT1rbyhyKSl0cnl7aT1WbChyWzBdKX1jYXRjaCh0KXtjb25zb2xlLmxvZygicGdzSW50cyIsciksY29uc29sZS5sb2codCl9cmV0dXJue2lhOmksaWR4OnR9fSkpLG89W107RW4oaSwodD0+e2xldCBuPXQuaWEvZyxyPWVbdC5pZHhdLnosaT1uKnI7dSYmKHI9cyh7djppLGFyZWE6dC5pYSxhcmVhVG90YWw6ZyxhcmVhUmF0aW86bix6OnIsaW5kOnQuaWR4fSkpO2xldCBsPXt2OmksYXJlYTp0LmlhLGFyZWFUb3RhbDpnLGFyZWFSYXRpbzpuLHo6cixpbmQ6dC5pZHh9O28ucHVzaChsKX0pKTtsZXQgZD1RaShWaShvLCJ2IikpO2YmJihkPWMoe3BzOm8sdjpkfSkpLHY9ZH1yZXR1cm4gZVtlLmxlbmd0aC0xXS56PXYsdn0sUz0odCxlKT0+e2xldCBuPWAke3R9LSR7ZX1gO2lmKHRsKG0sbikpcmV0dXJuIG1bbl07aWYodDx4WzBdfHx0PnhbMl18fGU8eFsxXXx8ZT54WzNdKXJldHVybiBudWxsO2xldCByPSgodCxlLG4pPT57bGV0IHI7dHJ5e3I9aih0LGUsbil9Y2F0Y2goZSl7Y29uc29sZS5sb2coZSkscj1udWxsLHQucG9wKCl9cmV0dXJuIHJ9KShwLHQsZSk7cmV0dXJuIG1bbl09cixyfSxBPXQ9PntsZXQgZT10Lngsbj12KGUsMCk7aWYoIVRvKG4pKXRocm93IG5ldyBFcnJvcihgaW52YWxpZCBueFske259XWApO2xldCByPXQueSxhPXYociwxKTtpZighVG8oYSkpdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG55WyR7YX1dYCk7bGV0IHM9UyhuLGEpLHU9ZChzLDIpO3JldHVybiBUbyh1KXx8KHU9bnVsbCkse1tpXTplLFtvXTpyLFtsXTp1fX07aWYocil7bGV0IHQ9ZVswXTtfPUEodCl9ZWxzZSBfPVtdLEVuKGUsKHQ9PntfLnB1c2goQSh0KSl9KSk7cmV0dXJuIF99bGV0IEthPXt9LFphPWZ1bmN0aW9uKHQsZSl7bGV0IG49W107Zm9yKGxldCByPTA7cjxlO3IrKyluLnB1c2godCk7cmV0dXJuIG59LEphPWZ1bmN0aW9uKHQsZSl7bGV0IG49WmEoMCxlKmUpO2ZvcihsZXQgcj0wO3I8ZTtyKyspbltyKmUrcl09dDtyZXR1cm4gbn0sVmE9ZnVuY3Rpb24odCxlLG4scil7bGV0IGksbyxsPUFycmF5KG4qcik7Zm9yKGk9MDtpPG47aSsrKWZvcihvPTA7bzxyO28rKylsW2kqcitvXT10W2kqcitvXStlW2kqcitvXTtyZXR1cm4gbH0sV2E9ZnVuY3Rpb24odCxlLG4scixpKXtsZXQgbyxsLGEscz1BcnJheShuKmkpO2ZvcihvPTA7bzxuO28rKylmb3IobD0wO2w8aTtsKyspZm9yKHNbbyppK2xdPTAsYT0wO2E8cjthKyspc1tvKmkrbF0rPXRbbypyK2FdKmVbYSppK2xdO3JldHVybiBzfSxxYT1mdW5jdGlvbih0LGUpe2xldCBuLHIsaSxvPUFycmF5KGUpO2ZvcihuPTA7bjxlO24rKylvW25dPXRbbiplK25dO2ZvcihuPTA7bjxlO24rKyl7Zm9yKHI9MDtyPG47cisrKW9bbl0tPXRbbiplK3JdKnRbbiplK3JdO2lmKG9bbl08PTApcmV0dXJuITE7Zm9yKG9bbl09TWF0aC5zcXJ0KG9bbl0pLHI9bisxO3I8ZTtyKyspe2ZvcihpPTA7aTxuO2krKyl0W3IqZStuXS09dFtyKmUraV0qdFtuKmUraV07dFtyKmUrbl0vPW9bbl19fWZvcihuPTA7bjxlO24rKyl0W24qZStuXT1vW25dO3JldHVybiEwfSxHYT1mdW5jdGlvbih0LGUpe2xldCBuLHIsaSxvO2ZvcihuPTA7bjxlO24rKylmb3IodFtuKmUrbl09MS90W24qZStuXSxyPW4rMTtyPGU7cisrKXtmb3Iobz0wLGk9bjtpPHI7aSsrKW8tPXRbciplK2ldKnRbaSplK25dO3RbciplK25dPW8vdFtyKmUrcl19Zm9yKG49MDtuPGU7bisrKWZvcihyPW4rMTtyPGU7cisrKXRbbiplK3JdPTA7Zm9yKG49MDtuPGU7bisrKXtmb3IodFtuKmUrbl0qPXRbbiplK25dLGk9bisxO2k8ZTtpKyspdFtuKmUrbl0rPXRbaSplK25dKnRbaSplK25dO2ZvcihyPW4rMTtyPGU7cisrKWZvcihpPXI7aTxlO2krKyl0W24qZStyXSs9dFtpKmUrbl0qdFtpKmUrcl19Zm9yKG49MDtuPGU7bisrKWZvcihyPTA7cjxuO3IrKyl0W24qZStyXT10W3IqZStuXX0sUWE9ZnVuY3Rpb24odCxlKXtsZXQgbixyLGksbyxsLGEscyx1LGMsZixoLGc9ZSx2PUFycmF5KGUqZSksZD1BcnJheShlKSxwPUFycmF5KGUpLHk9QXJyYXkoZSk7Zm9yKG49MDtuPGU7bisrKWZvcihvPTA7bzxlO28rKyl2W24qZStvXT1uPT09bz8xOjA7Zm9yKG89MDtvPGU7bysrKXlbb109MDtmb3Iobj0wO248ZTtuKyspe2Zvcih1PTAsbz0wO288ZTtvKyspaWYoMSE9PXlbb10pZm9yKGw9MDtsPGU7bCsrKTA9PT15W2xdJiZNYXRoLmFicyh0W28qZStsXSk+PXUmJih1PU1hdGguYWJzKHRbbyplK2xdKSxpPW8scj1sKTtpZigrK3lbcl0saSE9PXIpe2ZvcihhPTA7YTxlO2ErKyloPXRbaSplK2FdLHRbaSplK2FdPXRbciplK2FdLHRbciplK2FdPWg7Zm9yKGE9MDthPGc7YSsrKWg9dltpKmUrYV0sdltpKmUrYV09dltyKmUrYV0sdltyKmUrYV09aH1pZihwW25dPWksZFtuXT1yLDA9PT10W3IqZStyXSlyZXR1cm4hMTtmb3IoZj0xL3RbciplK3JdLHRbciplK3JdPTEsYT0wO2E8ZTthKyspdFtyKmUrYV0qPWY7Zm9yKGE9MDthPGc7YSsrKXZbciplK2FdKj1mO2ZvcihzPTA7czxlO3MrKylpZihzIT09cil7Zm9yKGM9dFtzKmUrcl0sdFtzKmUrcl09MCxhPTA7YTxlO2ErKyl0W3MqZSthXS09dFtyKmUrYV0qYztmb3IoYT0wO2E8ZzthKyspdltzKmUrYV0tPXZbciplK2FdKmN9fWZvcihhPWUtMTthPj0wO2EtLSlpZihwW2FdIT09ZFthXSlmb3IobD0wO2w8ZTtsKyspaD10W2wqZStwW2FdXSx0W2wqZStwW2FdXT10W2wqZStkW2FdXSx0W2wqZStkW2FdXT1oO3JldHVybiEwfSx0cz1mdW5jdGlvbih0LGUsbixyLGkpe3JldHVybiBlKyhyLWUpL24qKDEtTWF0aC5leHAoLTEvaSpNYXRoLnBvdyh0L24sMikpKX0sZXM9ZnVuY3Rpb24odCxlLG4scixpKXtyZXR1cm4gZSsoci1lKS9uKigxLU1hdGguZXhwKC0xL2kqKHQvbikpKX0sbnM9ZnVuY3Rpb24odCxlLG4scixpKXtyZXR1cm4gdD5uP2UrKHItZSkvbjplKyhyLWUpL24qKHQvbioxLjUtLjUqTWF0aC5wb3codC9uLDMpKX07ZnVuY3Rpb24gcnModCxlLG49e30pe2lmKCFObyh0KSlyZXR1cm57ZXJyOiJwc1NyYyBpcyBub3QgYW4gYXJyYXkifTtpZighSW8oZSkmJiFObyhlKSlyZXR1cm57ZXJyOiJwc1RhciBpcyBub3QgYW4gb2JqZWN0IG9yIGFycmF5In07bGV0IHI9SW8oZSk7ciYmKGU9W2VdKTtsZXQgaT1fZShuLCJrZXlYIik7QWUoaSl8fChpPSJ4Iik7bGV0IG89X2Uobiwia2V5WSIpO0FlKG8pfHwobz0ieSIpO2xldCBsPV9lKG4sImtleVoiKTtBZShsKXx8KGw9InoiKTtsZXQgYT1fZShuLCJzY2FsZSIpO1JvKGEpfHwoYT0xKSxhPVFvKGEpO2xldCBzPV9lKG4sIm1vZGVsIik7ImV4cG9uZW50aWFsIiE9PXMmJiJnYXVzc2lhbiIhPT1zJiYic3BoZXJpY2FsIiE9PXMmJihzPSJleHBvbmVudGlhbCIpO2xldCB1PV9lKG4sInNpZ21hMiIpO1JvKHUpfHwodT0wKSx1PVFvKHUpO2xldCBjPV9lKG4sImFscGhhIik7Um8oYyl8fChjPTEwMCksYz1RbyhjKTtsZXQgZj1fZShuLCJyZXR1cm5XaXRoVmFyaW9ncmFtIik7aWYoamUoZil8fChmPSExKSx0PW5sKHQsbiksMD09PWtvKHQpKXJldHVybntlcnI6InBzU3JjIGhhcyBubyBlZmZlY3RpdmUgZGF0YSJ9O2lmKGU9ZWwoZSxuKSwwPT09a28oZSkpcmV0dXJue2VycjoicHNUYXIgaGFzIG5vIGVmZmVjdGl2ZSBkYXRhIn07bGV0IGg9QmwodCx7c2NhbGU6YX0pO3Q9aC5wcztsZXQgZz1oLm52LHY9aC5pbnYsZD17fTtFbih0LCh0PT57bGV0IGU9YCR7dC54fS0ke3QueX1gO2RbZV09dC56fSkpO2xldCBwPVtdLHk9W10sbT1bXTtFbih0LCh0PT57cC5wdXNoKHQueCkseS5wdXNoKHQueSksbS5wdXNoKHQueil9KSk7bGV0IF8sYj1LYS50cmFpbihtLHAseSxzLHUsYykseD10PT57bGV0IGU9dC54LG49ZyhlLDApO2lmKCFUbyhuKSl0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgbnhbJHtufV1gKTtsZXQgcj10LnksYT1nKHIsMSk7aWYoIVRvKGEpKXRocm93IG5ldyBFcnJvcihgaW52YWxpZCBueVske2F9XWApO2xldCBzPSgodCxlKT0+e2xldCBuPWAke3R9LSR7ZX1gO2lmKHRsKGQsbikpcmV0dXJuIGRbbl07bGV0IHI9S2EucHJlZGljdCh0LGUsYik7cmV0dXJuIGRbbl09cixyfSkobixhKSx1PXYocywyKTtyZXR1cm4gVG8odSl8fCh1PW51bGwpLHtbaV06ZSxbb106cixbbF06dX19O2lmKHIpe2xldCB0PWVbMF07Xz14KHQpfWVsc2UgXz1bXSxFbihlLCh0PT57Xy5wdXNoKHgodCkpfSkpO3JldHVybiBmJiYoXz17cmVzdWx0Ol8sdmFyaW9ncmFtOmJ9KSxffWZ1bmN0aW9uIGludGVycDIodCxlLG49e30pe2xldCByPV9lKG4sIm1ldGhvZCIpOyJuYXR1cmFsTmVpZ2hib3IiIT09ciYmImtyaWdpbmciIT09ciYmKHI9Im5hdHVyYWxOZWlnaGJvciIpO2xldCBpPV9lKG4sInVzZVN5bmMiKTtqZShpKXx8KGk9ITEpO2xldCBvPSgpPT57bGV0IGk9bnVsbDt0cnl7Im5hdHVyYWxOZWlnaGJvciI9PT1yP2k9WWEodCxlLG4pOiJrcmlnaW5nIj09PXImJihpPXJzKHQsZSxuKSl9Y2F0Y2godCl7aT17ZXJyOnQudG9TdHJpbmcoKX19cmV0dXJuIGl9O3JldHVybiBpP28oKTooYXN5bmMoKT0+e2xldCB0PW51bGw7dHJ5e3Q9bygpO2xldCBlPV9lKHQsImVyciIpO3JldHVybiBBZShlKT9Qcm9taXNlLnJlamVjdChlKTp0fWNhdGNoKHQpe3JldHVybiBjb25zb2xlLmxvZyh0KSxQcm9taXNlLnJlamVjdCh0LnRvU3RyaW5nKCkpfX0pKCl9S2EudHJhaW49ZnVuY3Rpb24odCxlLG4scixpLG8pe2xldCBsLGEscyx1LGM9e3Q6dCx4OmUseTpuLG51Z2dldDowLHJhbmdlOjAsc2lsbDowLEE6MS8zLG46MH07c3dpdGNoKHIpe2Nhc2UiZ2F1c3NpYW4iOmMubW9kZWw9dHM7YnJlYWs7Y2FzZSJleHBvbmVudGlhbCI6Yy5tb2RlbD1lczticmVhaztjYXNlInNwaGVyaWNhbCI6Yy5tb2RlbD1uc31sZXQgZj10Lmxlbmd0aCxoPUFycmF5KChmKmYtZikvMik7Zm9yKGw9MCxzPTA7bDxmO2wrKylmb3IoYT0wO2E8bDthKysscysrKWhbc109QXJyYXkoMiksaFtzXVswXT1NYXRoLnBvdyhNYXRoLnBvdyhlW2xdLWVbYV0sMikrTWF0aC5wb3cobltsXS1uW2FdLDIpLC41KSxoW3NdWzFdPU1hdGguYWJzKHRbbF0tdFthXSk7aC5zb3J0KChmdW5jdGlvbih0LGUpe3JldHVybiB0WzBdLWVbMF19KSksYy5yYW5nZT1oWyhmKmYtZikvMi0xXVswXTtsZXQgZz0oZipmLWYpLzI+MzA/MzA6KGYqZi1mKS8yLHY9Yy5yYW5nZS9nLGQ9WmEoMCxnKSxwPVphKDAsZyk7aWYoZzwzMClmb3IodT0wO3U8Zzt1KyspZFt1XT1oW3VdWzBdLHBbdV09aFt1XVsxXTtlbHNle2ZvcihsPTAsYT0wLHM9MCx1PTA7bDxnJiZhPChmKmYtZikvMjtsKysscz0wKXtmb3IoO2hbYV1bMF08PShsKzEpKnYmJihkW3VdKz1oW2FdWzBdLHBbdV0rPWhbYV1bMV0sYSsrLHMrKywhKGE+PShmKmYtZikvMikpOyk7cz4wJiYoZFt1XS89cyxwW3VdLz1zLHUrKyl9aWYodTwyKXJldHVybiBjfWxldCB5PVtdO2ZvcihsPTA7bDx1O2wrKyl7bGV0IHQ9ZFtsXSxlPXBbbF07eS5wdXNoKFt0LGVdKX1sZXQgbT17ZGF0YTpoLGJhcnM6eX07Yy5zdnBkPW0sZj11LGMucmFuZ2U9ZFtmLTFdLWRbMF07bGV0IF89WmEoMSwyKmYpLGI9QXJyYXkoZikseD1jLkE7Zm9yKGw9MDtsPGY7bCsrKXtzd2l0Y2gocil7Y2FzZSJnYXVzc2lhbiI6X1syKmwrMV09MS1NYXRoLmV4cCgtMS94Kk1hdGgucG93KGRbbF0vYy5yYW5nZSwyKSk7YnJlYWs7Y2FzZSJleHBvbmVudGlhbCI6X1syKmwrMV09MS1NYXRoLmV4cCgtMS94KmRbbF0vYy5yYW5nZSk7YnJlYWs7Y2FzZSJzcGhlcmljYWwiOl9bMipsKzFdPWRbbF0vYy5yYW5nZSoxLjUtLjUqTWF0aC5wb3coZFtsXS9jLnJhbmdlLDMpfWJbbF09cFtsXX1sZXQgdz1mdW5jdGlvbih0LGUsbil7bGV0IHIsaSxvPUFycmF5KG4qZSk7Zm9yKHI9MDtyPGU7cisrKWZvcihpPTA7aTxuO2krKylvW2kqZStyXT10W3IqbitpXTtyZXR1cm4gb30oXyxmLDIpLGo9V2EodyxfLDIsZiwyKTtqPVZhKGosSmEoMS9vLDIpLDIsMik7bGV0IFM9ai5zbGljZSgwKTtxYShqLDIpP0dhKGosMik6KFFhKFMsMiksaj1TKTtsZXQgQT1XYShXYShqLHcsMiwyLGYpLGIsMixmLDEpO2MubnVnZ2V0PUFbMF0sYy5zaWxsPUFbMV0qYy5yYW5nZStjLm51Z2dldCxjLm49ZS5sZW5ndGgsZj1lLmxlbmd0aDtsZXQgTz1BcnJheShmKmYpO2ZvcihsPTA7bDxmO2wrKyl7Zm9yKGE9MDthPGw7YSsrKU9bbCpmK2FdPWMubW9kZWwoTWF0aC5wb3coTWF0aC5wb3coZVtsXS1lW2FdLDIpK01hdGgucG93KG5bbF0tblthXSwyKSwuNSksYy5udWdnZXQsYy5yYW5nZSxjLnNpbGwsYy5BKSxPW2EqZitsXT1PW2wqZithXTtPW2wqZitsXT1jLm1vZGVsKDAsYy5udWdnZXQsYy5yYW5nZSxjLnNpbGwsYy5BKX1sZXQgTT1WYShPLEphKGksZiksZixmKSxrPU0uc2xpY2UoMCk7cWEoTSxmKT9HYShNLGYpOihRYShrLGYpLE09ayk7bGV0IFA9TS5zbGljZSgwKSxGPVdhKE0sdCxmLGYsMSk7cmV0dXJuIGMuSz1QLGMuTT1GLGN9LEthLnByZWRpY3Q9ZnVuY3Rpb24odCxlLG4pe2xldCByLGk9QXJyYXkobi5uKTtmb3Iocj0wO3I8bi5uO3IrKylpW3JdPW4ubW9kZWwoTWF0aC5wb3coTWF0aC5wb3codC1uLnhbcl0sMikrTWF0aC5wb3coZS1uLnlbcl0sMiksLjUpLG4ubnVnZ2V0LG4ucmFuZ2Usbi5zaWxsLG4uQSk7cmV0dXJuIFdhKGksbi5NLDEsbi5uLDEpWzBdfSxLYS52YXJpYW5jZT1mdW5jdGlvbih0LGUsbil7bGV0IHIsaT1BcnJheShuLm4pO2ZvcihyPTA7cjxuLm47cisrKWlbcl09bi5tb2RlbChNYXRoLnBvdyhNYXRoLnBvdyh0LW4ueFtyXSwyKStNYXRoLnBvdyhlLW4ueVtyXSwyKSwuNSksbi5udWdnZXQsbi5yYW5nZSxuLnNpbGwsbi5BKTtyZXR1cm4gbi5tb2RlbCgwLG4ubnVnZ2V0LG4ucmFuZ2Usbi5zaWxsLG4uQSkrV2EoV2EoaSxuLkssMSxuLm4sbi5uKSxpLDEsbi5uLDEpWzBdfTsKCmxldCBpbnN0YW5jZSA9IG51bGwKZnVuY3Rpb24gaW5pdChpbnB1dCl7CgogICAgLy9pbml0CiAgICBsZXQgcgogICAgCiAgICAgICAgciA9IHsKICAgICAgICAgICAgbWFpbjogaW50ZXJwMgogICAgICAgIH0KICAgICAgICAKCiAgICAvL29uCiAgICAKCiAgICAvL3NhdmUKICAgIGluc3RhbmNlID0gcgoKfQoKZnVuY3Rpb24gc2VuZE1lc3NhZ2UoZGF0YSkgewogICAgCiAgICAgICAgcGFyZW50UG9ydC5wb3N0TWVzc2FnZShkYXRhKQogICAgICAgIAp9Cgphc3luYyBmdW5jdGlvbiBydW4oZGF0YSkgewogICAgLy8gY29uc29sZS5sb2coJ2lubmVyIHdvcmtlciBydW4nLGRhdGEpCgogICAgLy9tb2RlCiAgICBsZXQgbW9kZSA9IGRhdGEubW9kZQoKICAgIC8vY2hlY2sKICAgIGlmKG1vZGUgIT09ICdpbml0JyAmJiBtb2RlICE9PSAnY2FsbCcpewogICAgICAgIHJldHVybgogICAgfQoKICAgIC8vaW5pdAogICAgaWYobW9kZSA9PT0gJ2luaXQnKXsKICAgICAgICAKICAgICAgICB0cnl7CgogICAgICAgICAgICAvL3R5cGUKICAgICAgICAgICAgbGV0IHR5cGUgPSBkYXRhLnR5cGUKCiAgICAgICAgICAgIC8vaW5wdXQKICAgICAgICAgICAgbGV0IGlucHV0ID0gZGF0YS5pbnB1dAogICAgCiAgICAgICAgICAgIC8vaW5zdGFuY2UKICAgICAgICAgICAgaWYodHlwZSA9PT0gJ2Z1bmN0aW9uJyl7CiAgICAgICAgICAgICAgICBpbml0KC4uLmlucHV0KQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYodHlwZSA9PT0gJ29iamVjdCcpewogICAgICAgICAgICAgICAgaW5zdGFuY2UgPSBpbnRlcnAyCiAgICAgICAgICAgIH0KCiAgICAgICAgfQogICAgICAgIGNhdGNoKGVycil7CiAgICAgICAgCiAgICAgICAgICAgIC8vc2VuZE1lc3NhZ2UKICAgICAgICAgICAgbGV0IHJlcyA9IHsKICAgICAgICAgICAgICAgIG1vZGU6ICdlbWl0JywKICAgICAgICAgICAgICAgIGV2TmFtZTogJ2Vycm9yJywKICAgICAgICAgICAgICAgIG1zZzogZXJyLAogICAgICAgICAgICB9CiAgICAgICAgICAgIHNlbmRNZXNzYWdlKHJlcykKCiAgICAgICAgfQogICAgICAgICAgICAKICAgIH0KCiAgICAvL2NoZWNrCiAgICBpZihtb2RlID09PSAnY2FsbCcpewogICAgICAgIGxldCBzdGF0ZSA9ICcnCiAgICAgICAgbGV0IG1zZyA9IG51bGwKCiAgICAgICAgdHJ5ewoKICAgICAgICAgICAgLy9mdW4KICAgICAgICAgICAgbGV0IGZ1biA9IGluc3RhbmNlW2RhdGEuZnVuXQoKICAgICAgICAgICAgLy9pbnB1dAogICAgICAgICAgICBsZXQgaW5wdXQgPSBkYXRhLmlucHV0CgogICAgICAgICAgICAvL2V4ZWMKICAgICAgICAgICAgYXdhaXQgZnVuKC4uLmlucHV0KQogICAgICAgICAgICAgICAgLnRoZW4oKHN1YykgPT4gewogICAgICAgICAgICAgICAgICAgIHN0YXRlPSdzdWNjZXNzJwogICAgICAgICAgICAgICAgICAgIG1zZz1zdWMKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAuY2F0Y2goKGVycikgPT4gewogICAgICAgICAgICAgICAgICAgIHN0YXRlPSdlcnJvcicKICAgICAgICAgICAgICAgICAgICBtc2c9ZXJyCiAgICAgICAgICAgICAgICB9KQoKICAgICAgICB9CiAgICAgICAgY2F0Y2goZXJyKXsKICAgICAgICAgICAgc3RhdGUgPSAnZXJyb3InCiAgICAgICAgICAgIG1zZyA9IGVycgogICAgICAgIH0KICAgICAgICAKICAgICAgICAvL3NlbmRNZXNzYWdlCiAgICAgICAgbGV0IHJlcyA9IHsKICAgICAgICAgICAgbW9kZTogJ3JldHVybicsCiAgICAgICAgICAgIGlkOiBkYXRhLmlkLAogICAgICAgICAgICBmdW46IGRhdGEuZnVuLAogICAgICAgICAgICBzdGF0ZSwKICAgICAgICAgICAgbXNnLAogICAgICAgIH0KICAgICAgICBzZW5kTWVzc2FnZShyZXMpCgogICAgfQoKfQoKZnVuY3Rpb24gcmVjdk1lc3NhZ2UoZGF0YSkgewogICAgLy8gY29uc29sZS5sb2coJ2lubmVyIHdvcmtlciByZWN2OicsIGRhdGEpCgogICAgLy9kYXRhUmVjdgogICAgbGV0IGRhdGFSZWN2ID0gZGF0YQoKICAgIC8vcnVuCiAgICBydW4oZGF0YVJlY3YpCgp9CgoKICAgICAgICBwYXJlbnRQb3J0Lm9uKCdtZXNzYWdlJywgcmVjdk1lc3NhZ2UpCiAgICAgICAgCgo=",Buffer.from(m,"base64").toString("utf8"));var m;function X(){let Z=new l,m=function(d){try{return new b.Worker(d,{eval:!0})}catch(b){G(b)}}(d);if(!m)return G("invalid worker"),null;function X(){let b=function(){let b,d,l=new Promise((function(){b=arguments[0],d=arguments[1]}));return l.resolve=b,l.reject=d,l}(),d=function(){let b=arguments.length>0&&void 0!==arguments[0]?arguments[0]:10,d=[],l="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""),Z=l.length;for(let m=0;m<b;m++)d[m]=l[0|Math.random()*Z];return d.join("")}(),l={mode:"call",id:d,fun:"main",input:[...arguments]};return m.postMessage(l),Z.once(d,(d=>{"success"===d.state?b.resolve(d.msg):b.reject(d.msg)})),b}function G(b){Z.emit("error",b)}return m.on("message",(function(b){let d=b,l=d.mode;"emit"!==l&&"return"!==l||("emit"===l&&Z.emit(d.evName,d.msg),"return"===l&&Z.emit(d.id,d))})),m.on("error",G),function(){let b={mode:"init",type:"function",input:[...arguments]};m.postMessage(b)}([...arguments]),Z.main=X,Z.main=X,Z.terminate=function(){m?(m.terminate(),m=void 0):G("worker has been terminated")},Z}Z=async function(){let b=[...arguments],d=X();return await d.main(...b).finally((()=>{d.terminate()}))}}(),Z}(b)}({get exports(){return d},set exports(b){d=b}});var l=d,Z={};!function(b,d){b.exports=function(){const b="function"==typeof atob,d="function"==typeof Buffer,l="function"==typeof TextDecoder?new TextDecoder:void 0,Z=(b=>{let d={};return b.forEach(((b,l)=>d[b]=l)),d})(("function"==typeof TextEncoder&&new TextEncoder,Array.prototype.slice.call("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="))),m=/^(?:[A-Za-z\d+\/]{4})*?(?:[A-Za-z\d+\/]{2}(?:==)?|[A-Za-z\d+\/]{3}=?)?$/,X=String.fromCharCode.bind(String),G="function"==typeof Uint8Array.from?Uint8Array.from.bind(Uint8Array):b=>new Uint8Array(Array.prototype.slice.call(b,0)),W=b=>b.replace(/[^A-Za-z0-9\+\/]/g,""),c=/[\xC0-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF7][\x80-\xBF]{3}/g,s=b=>{switch(b.length){case 4:var d=((7&b.charCodeAt(0))<<18|(63&b.charCodeAt(1))<<12|(63&b.charCodeAt(2))<<6|63&b.charCodeAt(3))-65536;return X(55296+(d>>>10))+X(56320+(1023&d));case 3:return X((15&b.charCodeAt(0))<<12|(63&b.charCodeAt(1))<<6|63&b.charCodeAt(2));default:return X((31&b.charCodeAt(0))<<6|63&b.charCodeAt(1))}},K=b=>b.replace(c,s),p=b=>{if(b=b.replace(/\s+/g,""),!m.test(b))throw new TypeError("malformed base64.");b+="==".slice(2-(3&b.length));let d,l,G,W="";for(let m=0;m<b.length;)d=Z[b.charAt(m++)]<<18|Z[b.charAt(m++)]<<12|(l=Z[b.charAt(m++)])<<6|(G=Z[b.charAt(m++)]),W+=64===l?X(d>>16&255):64===G?X(d>>16&255,d>>8&255):X(d>>16&255,d>>8&255,255&d);return W},y=b?b=>atob(W(b)):d?b=>Buffer.from(b,"base64").toString("binary"):p,i=d?b=>G(Buffer.from(b,"base64")):b=>G(y(b).split("").map((b=>b.charCodeAt(0)))),h=d?b=>Buffer.from(b,"base64").toString("utf8"):l?b=>l.decode(i(b)):b=>K(y(b)),u=b=>W(b.replace(/[-_]/g,(b=>"-"==b?"+":"/"))),V=b=>h(u(b)),I=V;var L={};!function(b){var d=Object.prototype.hasOwnProperty,l="~";function Z(){}function m(b,d,l){this.fn=b,this.context=d,this.once=l||!1}function X(b,d,Z,X,G){if("function"!=typeof Z)throw new TypeError("The listener must be a function");var W=new m(Z,X||b,G),c=l?l+d:d;return b._events[c]?b._events[c].fn?b._events[c]=[b._events[c],W]:b._events[c].push(W):(b._events[c]=W,b._eventsCount++),b}function G(b,d){0==--b._eventsCount?b._events=new Z:delete b._events[d]}function W(){this._events=new Z,this._eventsCount=0}Object.create&&(Z.prototype=Object.create(null),(new Z).__proto__||(l=!1)),W.prototype.eventNames=function(){var b,Z,m=[];if(0===this._eventsCount)return m;for(Z in b=this._events)d.call(b,Z)&&m.push(l?Z.slice(1):Z);return Object.getOwnPropertySymbols?m.concat(Object.getOwnPropertySymbols(b)):m},W.prototype.listeners=function(b){var d=l?l+b:b,Z=this._events[d];if(!Z)return[];if(Z.fn)return[Z.fn];for(var m=0,X=Z.length,G=new Array(X);m<X;m++)G[m]=Z[m].fn;return G},W.prototype.listenerCount=function(b){var d=l?l+b:b,Z=this._events[d];return Z?Z.fn?1:Z.length:0},W.prototype.emit=function(b,d,Z,m,X,G){var W=l?l+b:b;if(!this._events[W])return!1;var c,s,K=this._events[W],p=arguments.length;if(K.fn){switch(K.once&&this.removeListener(b,K.fn,void 0,!0),p){case 1:return K.fn.call(K.context),!0;case 2:return K.fn.call(K.context,d),!0;case 3:return K.fn.call(K.context,d,Z),!0;case 4:return K.fn.call(K.context,d,Z,m),!0;case 5:return K.fn.call(K.context,d,Z,m,X),!0;case 6:return K.fn.call(K.context,d,Z,m,X,G),!0}for(s=1,c=new Array(p-1);s<p;s++)c[s-1]=arguments[s];K.fn.apply(K.context,c)}else{var y,i=K.length;for(s=0;s<i;s++)switch(K[s].once&&this.removeListener(b,K[s].fn,void 0,!0),p){case 1:K[s].fn.call(K[s].context);break;case 2:K[s].fn.call(K[s].context,d);break;case 3:K[s].fn.call(K[s].context,d,Z);break;case 4:K[s].fn.call(K[s].context,d,Z,m);break;default:if(!c)for(y=1,c=new Array(p-1);y<p;y++)c[y-1]=arguments[y];K[s].fn.apply(K[s].context,c)}}return!0},W.prototype.on=function(b,d,l){return X(this,b,d,l,!1)},W.prototype.once=function(b,d,l){return X(this,b,d,l,!0)},W.prototype.removeListener=function(b,d,Z,m){var X=l?l+b:b;if(!this._events[X])return this;if(!d)return G(this,X),this;var W=this._events[X];if(W.fn)W.fn!==d||m&&!W.once||Z&&W.context!==Z||G(this,X);else{for(var c=0,s=[],K=W.length;c<K;c++)(W[c].fn!==d||m&&!W[c].once||Z&&W[c].context!==Z)&&s.push(W[c]);s.length?this._events[X]=1===s.length?s[0]:s:G(this,X)}return this},W.prototype.removeAllListeners=function(b){var d;return b?(d=l?l+b:b,this._events[d]&&G(this,d)):(this._events=new Z,this._eventsCount=0),this},W.prototype.off=W.prototype.removeListener,W.prototype.addListener=W.prototype.on,W.prefixed=l,W.EventEmitter=W,b.exports=W}({get exports(){return L},set exports(b){L=b}});var Y=L;let x;return function(){if("browser"!=("undefined"!=typeof window&&void 0!==window.document?"browser":"nodejs"))return null;let b=I("CgoKdmFyIHQ9InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWxUaGlzP2dsb2JhbFRoaXM6InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OiJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsP2dsb2JhbDoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjp7fTtmdW5jdGlvbiBlKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGUmJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCJkZWZhdWx0Iik/dC5kZWZhdWx0OnR9dmFyIG49QXJyYXkuaXNBcnJheSxyPSJvYmplY3QiPT10eXBlb2YgdCYmdCYmdC5PYmplY3Q9PT1PYmplY3QmJnQsaT1yLG89Im9iamVjdCI9PXR5cGVvZiBzZWxmJiZzZWxmJiZzZWxmLk9iamVjdD09PU9iamVjdCYmc2VsZixsPWl8fG98fEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCksYT1sLlN5bWJvbCxzPWEsdT1PYmplY3QucHJvdG90eXBlLGM9dS5oYXNPd25Qcm9wZXJ0eSxmPXUudG9TdHJpbmcsaD1zP3MudG9TdHJpbmdUYWc6dm9pZCAwO3ZhciBnPWZ1bmN0aW9uKHQpe3ZhciBlPWMuY2FsbCh0LGgpLG49dFtoXTt0cnl7dFtoXT12b2lkIDA7dmFyIHI9ITB9Y2F0Y2godCl7fXZhciBpPWYuY2FsbCh0KTtyZXR1cm4gciYmKGU/dFtoXT1uOmRlbGV0ZSB0W2hdKSxpfSx2PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7dmFyIGQ9ZyxwPWZ1bmN0aW9uKHQpe3JldHVybiB2LmNhbGwodCl9LHk9YT9hLnRvU3RyaW5nVGFnOnZvaWQgMDt2YXIgbT1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD92b2lkIDA9PT10PyJbb2JqZWN0IFVuZGVmaW5lZF0iOiJbb2JqZWN0IE51bGxdIjp5JiZ5IGluIE9iamVjdCh0KT9kKHQpOnAodCl9O3ZhciBfPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsIT10JiYib2JqZWN0Ij09dHlwZW9mIHR9LGI9bSx4PV87dmFyIHc9ZnVuY3Rpb24odCl7cmV0dXJuInN5bWJvbCI9PXR5cGVvZiB0fHx4KHQpJiYiW29iamVjdCBTeW1ib2xdIj09Yih0KX0saj1uLFM9dyxBPS9cLnxcWyg/OlteW1xdXSp8KFsiJ10pKD86KD8hXDEpW15cXF18XFwuKSo/XDEpXF0vLE89L15cdyokLzt2YXIgTT1mdW5jdGlvbih0LGUpe2lmKGoodCkpcmV0dXJuITE7dmFyIG49dHlwZW9mIHQ7cmV0dXJuISgibnVtYmVyIiE9biYmInN5bWJvbCIhPW4mJiJib29sZWFuIiE9biYmbnVsbCE9dCYmIVModCkpfHwoTy50ZXN0KHQpfHwhQS50ZXN0KHQpfHxudWxsIT1lJiZ0IGluIE9iamVjdChlKSl9O3ZhciBrPWZ1bmN0aW9uKHQpe3ZhciBlPXR5cGVvZiB0O3JldHVybiBudWxsIT10JiYoIm9iamVjdCI9PWV8fCJmdW5jdGlvbiI9PWUpfSxQPW0sRj1rO3ZhciBULHo9ZnVuY3Rpb24odCl7aWYoIUYodCkpcmV0dXJuITE7dmFyIGU9UCh0KTtyZXR1cm4iW29iamVjdCBGdW5jdGlvbl0iPT1lfHwiW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0iPT1lfHwiW29iamVjdCBBc3luY0Z1bmN0aW9uXSI9PWV8fCJbb2JqZWN0IFByb3h5XSI9PWV9LEk9bFsiX19jb3JlLWpzX3NoYXJlZF9fIl0sJD0oVD0vW14uXSskLy5leGVjKEkmJkkua2V5cyYmSS5rZXlzLklFX1BST1RPfHwiIikpPyJTeW1ib2woc3JjKV8xLiIrVDoiIjt2YXIgRT1mdW5jdGlvbih0KXtyZXR1cm4hISQmJiQgaW4gdH0sTj1GdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmc7dmFyIFI9ZnVuY3Rpb24odCl7aWYobnVsbCE9dCl7dHJ5e3JldHVybiBOLmNhbGwodCl9Y2F0Y2godCl7fXRyeXtyZXR1cm4gdCsiIn1jYXRjaCh0KXt9fXJldHVybiIifSxDPXosQj1FLFU9ayxMPVIsRD0vXlxbb2JqZWN0IC4rP0NvbnN0cnVjdG9yXF0kLyxIPUZ1bmN0aW9uLnByb3RvdHlwZSxYPU9iamVjdC5wcm90b3R5cGUsWT1ILnRvU3RyaW5nLEs9WC5oYXNPd25Qcm9wZXJ0eSxaPVJlZ0V4cCgiXiIrWS5jYWxsKEspLnJlcGxhY2UoL1tcXF4kLiorPygpW1xde318XS9nLCJcXCQmIikucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXCgpfCBmb3IgLis/KD89XFxcXSkvZywiJDEuKj8iKSsiJCIpO3ZhciBKPWZ1bmN0aW9uKHQpe3JldHVybiEoIVUodCl8fEIodCkpJiYoQyh0KT9aOkQpLnRlc3QoTCh0KSl9LFY9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09dD92b2lkIDA6dFtlXX07dmFyIFc9ZnVuY3Rpb24odCxlKXt2YXIgbj1WKHQsZSk7cmV0dXJuIEoobik/bjp2b2lkIDB9LHE9VyhPYmplY3QsImNyZWF0ZSIpLEc9cTt2YXIgUT1mdW5jdGlvbigpe3RoaXMuX19kYXRhX189Rz9HKG51bGwpOnt9LHRoaXMuc2l6ZT0wfTt2YXIgdHQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5oYXModCkmJmRlbGV0ZSB0aGlzLl9fZGF0YV9fW3RdO3JldHVybiB0aGlzLnNpemUtPWU/MTowLGV9LGV0PXEsbnQ9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt2YXIgcnQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXztpZihldCl7dmFyIG49ZVt0XTtyZXR1cm4iX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyI9PT1uP3ZvaWQgMDpufXJldHVybiBudC5jYWxsKGUsdCk/ZVt0XTp2b2lkIDB9LGl0PXEsb3Q9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt2YXIgbHQ9cTt2YXIgYXQ9USxzdD10dCx1dD1ydCxjdD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fO3JldHVybiBpdD92b2lkIDAhPT1lW3RdOm90LmNhbGwoZSx0KX0sZnQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9fZGF0YV9fO3JldHVybiB0aGlzLnNpemUrPXRoaXMuaGFzKHQpPzA6MSxuW3RdPWx0JiZ2b2lkIDA9PT1lPyJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIjplLHRoaXN9O2Z1bmN0aW9uIGh0KHQpe3ZhciBlPS0xLG49bnVsbD09dD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPG47KXt2YXIgcj10W2VdO3RoaXMuc2V0KHJbMF0sclsxXSl9fWh0LnByb3RvdHlwZS5jbGVhcj1hdCxodC5wcm90b3R5cGUuZGVsZXRlPXN0LGh0LnByb3RvdHlwZS5nZXQ9dXQsaHQucHJvdG90eXBlLmhhcz1jdCxodC5wcm90b3R5cGUuc2V0PWZ0O3ZhciBndD1odDt2YXIgdnQ9ZnVuY3Rpb24oKXt0aGlzLl9fZGF0YV9fPVtdLHRoaXMuc2l6ZT0wfTt2YXIgZHQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD09PWV8fHQhPXQmJmUhPWV9LHB0PWR0O3ZhciB5dD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10Lmxlbmd0aDtuLS07KWlmKHB0KHRbbl1bMF0sZSkpcmV0dXJuIG47cmV0dXJuLTF9LG10PXl0LF90PUFycmF5LnByb3RvdHlwZS5zcGxpY2U7dmFyIGJ0PXl0O3ZhciB4dD15dDt2YXIgd3Q9eXQ7dmFyIGp0PXZ0LFN0PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX19kYXRhX18sbj1tdChlLHQpO3JldHVybiEobjwwKSYmKG49PWUubGVuZ3RoLTE/ZS5wb3AoKTpfdC5jYWxsKGUsbiwxKSwtLXRoaXMuc2l6ZSwhMCl9LEF0PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX19kYXRhX18sbj1idChlLHQpO3JldHVybiBuPDA/dm9pZCAwOmVbbl1bMV19LE90PWZ1bmN0aW9uKHQpe3JldHVybiB4dCh0aGlzLl9fZGF0YV9fLHQpPi0xfSxNdD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX19kYXRhX18scj13dChuLHQpO3JldHVybiByPDA/KCsrdGhpcy5zaXplLG4ucHVzaChbdCxlXSkpOm5bcl1bMV09ZSx0aGlzfTtmdW5jdGlvbiBrdCh0KXt2YXIgZT0tMSxuPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxuOyl7dmFyIHI9dFtlXTt0aGlzLnNldChyWzBdLHJbMV0pfX1rdC5wcm90b3R5cGUuY2xlYXI9anQsa3QucHJvdG90eXBlLmRlbGV0ZT1TdCxrdC5wcm90b3R5cGUuZ2V0PUF0LGt0LnByb3RvdHlwZS5oYXM9T3Qsa3QucHJvdG90eXBlLnNldD1NdDt2YXIgUHQ9a3QsRnQ9VyhsLCJNYXAiKSxUdD1ndCx6dD1QdCxJdD1GdDt2YXIgJHQ9ZnVuY3Rpb24odCl7dmFyIGU9dHlwZW9mIHQ7cmV0dXJuInN0cmluZyI9PWV8fCJudW1iZXIiPT1lfHwic3ltYm9sIj09ZXx8ImJvb2xlYW4iPT1lPyJfX3Byb3RvX18iIT09dDpudWxsPT09dH07dmFyIEV0PWZ1bmN0aW9uKHQsZSl7dmFyIG49dC5fX2RhdGFfXztyZXR1cm4gJHQoZSk/blsic3RyaW5nIj09dHlwZW9mIGU/InN0cmluZyI6Imhhc2giXTpuLm1hcH0sTnQ9RXQ7dmFyIFJ0PUV0O3ZhciBDdD1FdDt2YXIgQnQ9RXQ7dmFyIFV0PWZ1bmN0aW9uKHQsZSl7dmFyIG49QnQodGhpcyx0KSxyPW4uc2l6ZTtyZXR1cm4gbi5zZXQodCxlKSx0aGlzLnNpemUrPW4uc2l6ZT09cj8wOjEsdGhpc30sTHQ9ZnVuY3Rpb24oKXt0aGlzLnNpemU9MCx0aGlzLl9fZGF0YV9fPXtoYXNoOm5ldyBUdCxtYXA6bmV3KEl0fHx6dCksc3RyaW5nOm5ldyBUdH19LER0PWZ1bmN0aW9uKHQpe3ZhciBlPU50KHRoaXMsdCkuZGVsZXRlKHQpO3JldHVybiB0aGlzLnNpemUtPWU/MTowLGV9LEh0PWZ1bmN0aW9uKHQpe3JldHVybiBSdCh0aGlzLHQpLmdldCh0KX0sWHQ9ZnVuY3Rpb24odCl7cmV0dXJuIEN0KHRoaXMsdCkuaGFzKHQpfSxZdD1VdDtmdW5jdGlvbiBLdCh0KXt2YXIgZT0tMSxuPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxuOyl7dmFyIHI9dFtlXTt0aGlzLnNldChyWzBdLHJbMV0pfX1LdC5wcm90b3R5cGUuY2xlYXI9THQsS3QucHJvdG90eXBlLmRlbGV0ZT1EdCxLdC5wcm90b3R5cGUuZ2V0PUh0LEt0LnByb3RvdHlwZS5oYXM9WHQsS3QucHJvdG90eXBlLnNldD1ZdDt2YXIgWnQ9S3QsSnQ9WnQ7ZnVuY3Rpb24gVnQodCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdHx8bnVsbCE9ZSYmImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigiRXhwZWN0ZWQgYSBmdW5jdGlvbiIpO3ZhciBuPWZ1bmN0aW9uKCl7dmFyIHI9YXJndW1lbnRzLGk9ZT9lLmFwcGx5KHRoaXMscik6clswXSxvPW4uY2FjaGU7aWYoby5oYXMoaSkpcmV0dXJuIG8uZ2V0KGkpO3ZhciBsPXQuYXBwbHkodGhpcyxyKTtyZXR1cm4gbi5jYWNoZT1vLnNldChpLGwpfHxvLGx9O3JldHVybiBuLmNhY2hlPW5ldyhWdC5DYWNoZXx8SnQpLG59VnQuQ2FjaGU9SnQ7dmFyIFd0PVZ0O3ZhciBxdD0vW14uW1xdXSt8XFsoPzooLT9cZCsoPzpcLlxkKyk/KXwoWyInXSkoKD86KD8hXDIpW15cXF18XFwuKSo/KVwyKVxdfCg/PSg/OlwufFxbXF0pKD86XC58XFtcXXwkKSkvZyxHdD0vXFwoXFwpPy9nLFF0PWZ1bmN0aW9uKHQpe3ZhciBlPVd0KHQsKGZ1bmN0aW9uKHQpe3JldHVybiA1MDA9PT1uLnNpemUmJm4uY2xlYXIoKSx0fSkpLG49ZS5jYWNoZTtyZXR1cm4gZX0oKGZ1bmN0aW9uKHQpe3ZhciBlPVtdO3JldHVybiA0Nj09PXQuY2hhckNvZGVBdCgwKSYmZS5wdXNoKCIiKSx0LnJlcGxhY2UocXQsKGZ1bmN0aW9uKHQsbixyLGkpe2UucHVzaChyP2kucmVwbGFjZShHdCwiJDEiKTpufHx0KX0pKSxlfSkpO3ZhciB0ZT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0tMSxyPW51bGw9PXQ/MDp0Lmxlbmd0aCxpPUFycmF5KHIpOysrbjxyOylpW25dPWUodFtuXSxuLHQpO3JldHVybiBpfSxlZT10ZSxuZT1uLHJlPXcsaWU9YT9hLnByb3RvdHlwZTp2b2lkIDAsb2U9aWU/aWUudG9TdHJpbmc6dm9pZCAwO3ZhciBsZT1mdW5jdGlvbiB0KGUpe2lmKCJzdHJpbmciPT10eXBlb2YgZSlyZXR1cm4gZTtpZihuZShlKSlyZXR1cm4gZWUoZSx0KSsiIjtpZihyZShlKSlyZXR1cm4gb2U/b2UuY2FsbChlKToiIjt2YXIgbj1lKyIiO3JldHVybiIwIj09biYmMS9lPT0tSW5maW5pdHk/Ii0wIjpufSxhZT1sZTt2YXIgc2U9bix1ZT1NLGNlPVF0LGZlPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10PyIiOmFlKHQpfTt2YXIgaGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gc2UodCk/dDp1ZSh0LGUpP1t0XTpjZShmZSh0KSl9LGdlPXc7dmFyIHZlPWZ1bmN0aW9uKHQpe2lmKCJzdHJpbmciPT10eXBlb2YgdHx8Z2UodCkpcmV0dXJuIHQ7dmFyIGU9dCsiIjtyZXR1cm4iMCI9PWUmJjEvdD09LUluZmluaXR5PyItMCI6ZX0sZGU9aGUscGU9dmU7dmFyIHllPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPTAscj0oZT1kZShlLHQpKS5sZW5ndGg7bnVsbCE9dCYmbjxyOyl0PXRbcGUoZVtuKytdKV07cmV0dXJuIG4mJm49PXI/dDp2b2lkIDB9LG1lPXllO3ZhciBfZT1mdW5jdGlvbih0LGUsbil7dmFyIHI9bnVsbD09dD92b2lkIDA6bWUodCxlKTtyZXR1cm4gdm9pZCAwPT09cj9uOnJ9LGJlPW0seGU9Xzt2YXIgd2U9ZnVuY3Rpb24odCl7cmV0dXJuITA9PT10fHwhMT09PXR8fHhlKHQpJiYiW29iamVjdCBCb29sZWFuXSI9PWJlKHQpfTtmdW5jdGlvbiBqZSh0KXtyZXR1cm4gd2UodCl9ZnVuY3Rpb24gU2UodCl7cmV0dXJuIltvYmplY3QgU3RyaW5nXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9ZnVuY3Rpb24gQWUodCl7cmV0dXJuISghU2UodCl8fCIiPT09dCl9dmFyIE9lPXt9LE1lPXtnZXQgZXhwb3J0cygpe3JldHVybiBPZX0sc2V0IGV4cG9ydHModCl7T2U9dH19O3ZhciBrZT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0tMSxyPW51bGw9PXQ/MDp0Lmxlbmd0aDsrK248ciYmITEhPT1lKHRbbl0sbix0KTspO3JldHVybiB0fTt2YXIgUGU9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUsbixyKXtmb3IodmFyIGk9LTEsbz1PYmplY3QoZSksbD1yKGUpLGE9bC5sZW5ndGg7YS0tOyl7dmFyIHM9bFt0P2E6KytpXTtpZighMT09PW4ob1tzXSxzLG8pKWJyZWFrfXJldHVybiBlfX0oKTt2YXIgRmU9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49LTEscj1BcnJheSh0KTsrK248dDspcltuXT1lKG4pO3JldHVybiByfSxUZT1tLHplPV87dmFyIEllPWZ1bmN0aW9uKHQpe3JldHVybiB6ZSh0KSYmIltvYmplY3QgQXJndW1lbnRzXSI9PVRlKHQpfSwkZT1fLEVlPU9iamVjdC5wcm90b3R5cGUsTmU9RWUuaGFzT3duUHJvcGVydHksUmU9RWUucHJvcGVydHlJc0VudW1lcmFibGUsQ2U9SWUoZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzfSgpKT9JZTpmdW5jdGlvbih0KXtyZXR1cm4gJGUodCkmJk5lLmNhbGwodCwiY2FsbGVlIikmJiFSZS5jYWxsKHQsImNhbGxlZSIpfSxCZT17fTt2YXIgVWU9ZnVuY3Rpb24oKXtyZXR1cm4hMX07IWZ1bmN0aW9uKHQsZSl7dmFyIG49bCxyPVVlLGk9ZSYmIWUubm9kZVR5cGUmJmUsbz1pJiZ0JiYhdC5ub2RlVHlwZSYmdCxhPW8mJm8uZXhwb3J0cz09PWk/bi5CdWZmZXI6dm9pZCAwLHM9KGE/YS5pc0J1ZmZlcjp2b2lkIDApfHxyO3QuZXhwb3J0cz1zfSh7Z2V0IGV4cG9ydHMoKXtyZXR1cm4gQmV9LHNldCBleHBvcnRzKHQpe0JlPXR9fSxCZSk7dmFyIExlPS9eKD86MHxbMS05XVxkKikkLzt2YXIgRGU9ZnVuY3Rpb24odCxlKXt2YXIgbj10eXBlb2YgdDtyZXR1cm4hIShlPW51bGw9PWU/OTAwNzE5OTI1NDc0MDk5MTplKSYmKCJudW1iZXIiPT1ufHwic3ltYm9sIiE9biYmTGUudGVzdCh0KSkmJnQ+LTEmJnQlMT09MCYmdDxlfTt2YXIgSGU9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0JiZ0Pi0xJiZ0JTE9PTAmJnQ8PTkwMDcxOTkyNTQ3NDA5OTF9LFhlPW0sWWU9SGUsS2U9XyxaZT17fTtaZVsiW29iamVjdCBGbG9hdDMyQXJyYXldIl09WmVbIltvYmplY3QgRmxvYXQ2NEFycmF5XSJdPVplWyJbb2JqZWN0IEludDhBcnJheV0iXT1aZVsiW29iamVjdCBJbnQxNkFycmF5XSJdPVplWyJbb2JqZWN0IEludDMyQXJyYXldIl09WmVbIltvYmplY3QgVWludDhBcnJheV0iXT1aZVsiW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0iXT1aZVsiW29iamVjdCBVaW50MTZBcnJheV0iXT1aZVsiW29iamVjdCBVaW50MzJBcnJheV0iXT0hMCxaZVsiW29iamVjdCBBcmd1bWVudHNdIl09WmVbIltvYmplY3QgQXJyYXldIl09WmVbIltvYmplY3QgQXJyYXlCdWZmZXJdIl09WmVbIltvYmplY3QgQm9vbGVhbl0iXT1aZVsiW29iamVjdCBEYXRhVmlld10iXT1aZVsiW29iamVjdCBEYXRlXSJdPVplWyJbb2JqZWN0IEVycm9yXSJdPVplWyJbb2JqZWN0IEZ1bmN0aW9uXSJdPVplWyJbb2JqZWN0IE1hcF0iXT1aZVsiW29iamVjdCBOdW1iZXJdIl09WmVbIltvYmplY3QgT2JqZWN0XSJdPVplWyJbb2JqZWN0IFJlZ0V4cF0iXT1aZVsiW29iamVjdCBTZXRdIl09WmVbIltvYmplY3QgU3RyaW5nXSJdPVplWyJbb2JqZWN0IFdlYWtNYXBdIl09ITE7dmFyIEplPWZ1bmN0aW9uKHQpe3JldHVybiBLZSh0KSYmWWUodC5sZW5ndGgpJiYhIVplW1hlKHQpXX07dmFyIFZlPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdChlKX19LFdlPXt9OyFmdW5jdGlvbih0LGUpe3ZhciBuPXIsaT1lJiYhZS5ub2RlVHlwZSYmZSxvPWkmJnQmJiF0Lm5vZGVUeXBlJiZ0LGw9byYmby5leHBvcnRzPT09aSYmbi5wcm9jZXNzLGE9ZnVuY3Rpb24oKXt0cnl7dmFyIHQ9byYmby5yZXF1aXJlJiZvLnJlcXVpcmUoInV0aWwiKS50eXBlcztyZXR1cm4gdHx8bCYmbC5iaW5kaW5nJiZsLmJpbmRpbmcoInV0aWwiKX1jYXRjaCh0KXt9fSgpO3QuZXhwb3J0cz1hfSh7Z2V0IGV4cG9ydHMoKXtyZXR1cm4gV2V9LHNldCBleHBvcnRzKHQpe1dlPXR9fSxXZSk7dmFyIHFlPUplLEdlPVZlLFFlPVdlJiZXZS5pc1R5cGVkQXJyYXksdG49UWU/R2UoUWUpOnFlLGVuPUZlLG5uPUNlLHJuPW4sb249QmUsbG49RGUsYW49dG4sc249T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt2YXIgdW49ZnVuY3Rpb24odCxlKXt2YXIgbj1ybih0KSxyPSFuJiZubih0KSxpPSFuJiYhciYmb24odCksbz0hbiYmIXImJiFpJiZhbih0KSxsPW58fHJ8fGl8fG8sYT1sP2VuKHQubGVuZ3RoLFN0cmluZyk6W10scz1hLmxlbmd0aDtmb3IodmFyIHUgaW4gdCkhZSYmIXNuLmNhbGwodCx1KXx8bCYmKCJsZW5ndGgiPT11fHxpJiYoIm9mZnNldCI9PXV8fCJwYXJlbnQiPT11KXx8byYmKCJidWZmZXIiPT11fHwiYnl0ZUxlbmd0aCI9PXV8fCJieXRlT2Zmc2V0Ij09dSl8fGxuKHUscykpfHxhLnB1c2godSk7cmV0dXJuIGF9LGNuPU9iamVjdC5wcm90b3R5cGU7dmFyIGZuPWZ1bmN0aW9uKHQpe3ZhciBlPXQmJnQuY29uc3RydWN0b3I7cmV0dXJuIHQ9PT0oImZ1bmN0aW9uIj09dHlwZW9mIGUmJmUucHJvdG90eXBlfHxjbil9O3ZhciBobj1mdW5jdGlvbih0LGUpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gdChlKG4pKX19KE9iamVjdC5rZXlzLE9iamVjdCksZ249Zm4sdm49aG4sZG49T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt2YXIgcG49ZnVuY3Rpb24odCl7aWYoIWduKHQpKXJldHVybiB2bih0KTt2YXIgZT1bXTtmb3IodmFyIG4gaW4gT2JqZWN0KHQpKWRuLmNhbGwodCxuKSYmImNvbnN0cnVjdG9yIiE9biYmZS5wdXNoKG4pO3JldHVybiBlfSx5bj16LG1uPUhlO3ZhciBfbj1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dCYmbW4odC5sZW5ndGgpJiYheW4odCl9LGJuPXVuLHhuPXBuLHduPV9uO3ZhciBqbj1mdW5jdGlvbih0KXtyZXR1cm4gd24odCk/Ym4odCk6eG4odCl9LFNuPVBlLEFuPWpuO3ZhciBPbj1fbjt2YXIgTW49ZnVuY3Rpb24odCxlKXtyZXR1cm4gZnVuY3Rpb24obixyKXtpZihudWxsPT1uKXJldHVybiBuO2lmKCFPbihuKSlyZXR1cm4gdChuLHIpO2Zvcih2YXIgaT1uLmxlbmd0aCxvPWU/aTotMSxsPU9iamVjdChuKTsoZT9vLS06KytvPGkpJiYhMSE9PXIobFtvXSxvLGwpOyk7cmV0dXJuIG59fSgoZnVuY3Rpb24odCxlKXtyZXR1cm4gdCYmU24odCxlLEFuKX0pKTt2YXIga249ZnVuY3Rpb24odCl7cmV0dXJuIHR9LFBuPWtuO3ZhciBGbj1rZSxUbj1Nbix6bj1mdW5jdGlvbih0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD90OlBufSxJbj1uO3ZhciAkbj1mdW5jdGlvbih0LGUpe3JldHVybihJbih0KT9GbjpUbikodCx6bihlKSl9O01lLmV4cG9ydHM9JG47dmFyIEVuPWUoT2UpLE5uPVB0O3ZhciBSbj1QdCxDbj1GdCxCbj1adDt2YXIgVW49UHQsTG49ZnVuY3Rpb24oKXt0aGlzLl9fZGF0YV9fPW5ldyBObix0aGlzLnNpemU9MH0sRG49ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxuPWUuZGVsZXRlKHQpO3JldHVybiB0aGlzLnNpemU9ZS5zaXplLG59LEhuPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLmdldCh0KX0sWG49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKHQpfSxZbj1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX19kYXRhX187aWYobiBpbnN0YW5jZW9mIFJuKXt2YXIgcj1uLl9fZGF0YV9fO2lmKCFDbnx8ci5sZW5ndGg8MTk5KXJldHVybiByLnB1c2goW3QsZV0pLHRoaXMuc2l6ZT0rK24uc2l6ZSx0aGlzO249dGhpcy5fX2RhdGFfXz1uZXcgQm4ocil9cmV0dXJuIG4uc2V0KHQsZSksdGhpcy5zaXplPW4uc2l6ZSx0aGlzfTtmdW5jdGlvbiBLbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fPW5ldyBVbih0KTt0aGlzLnNpemU9ZS5zaXplfUtuLnByb3RvdHlwZS5jbGVhcj1MbixLbi5wcm90b3R5cGUuZGVsZXRlPURuLEtuLnByb3RvdHlwZS5nZXQ9SG4sS24ucHJvdG90eXBlLmhhcz1YbixLbi5wcm90b3R5cGUuc2V0PVluO3ZhciBabj1Lbjt2YXIgSm49WnQsVm49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX19kYXRhX18uc2V0KHQsIl9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iKSx0aGlzfSxXbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXModCl9O2Z1bmN0aW9uIHFuKHQpe3ZhciBlPS0xLG49bnVsbD09dD8wOnQubGVuZ3RoO2Zvcih0aGlzLl9fZGF0YV9fPW5ldyBKbjsrK2U8bjspdGhpcy5hZGQodFtlXSl9cW4ucHJvdG90eXBlLmFkZD1xbi5wcm90b3R5cGUucHVzaD1Wbixxbi5wcm90b3R5cGUuaGFzPVduO3ZhciBHbj1xbixRbj1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0tMSxyPW51bGw9PXQ/MDp0Lmxlbmd0aDsrK248cjspaWYoZSh0W25dLG4sdCkpcmV0dXJuITA7cmV0dXJuITF9LHRyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuaGFzKGUpfTt2YXIgZXI9ZnVuY3Rpb24odCxlLG4scixpLG8pe3ZhciBsPTEmbixhPXQubGVuZ3RoLHM9ZS5sZW5ndGg7aWYoYSE9cyYmIShsJiZzPmEpKXJldHVybiExO3ZhciB1PW8uZ2V0KHQpLGM9by5nZXQoZSk7aWYodSYmYylyZXR1cm4gdT09ZSYmYz09dDt2YXIgZj0tMSxoPSEwLGc9MiZuP25ldyBHbjp2b2lkIDA7Zm9yKG8uc2V0KHQsZSksby5zZXQoZSx0KTsrK2Y8YTspe3ZhciB2PXRbZl0sZD1lW2ZdO2lmKHIpdmFyIHA9bD9yKGQsdixmLGUsdCxvKTpyKHYsZCxmLHQsZSxvKTtpZih2b2lkIDAhPT1wKXtpZihwKWNvbnRpbnVlO2g9ITE7YnJlYWt9aWYoZyl7aWYoIVFuKGUsKGZ1bmN0aW9uKHQsZSl7aWYoIXRyKGcsZSkmJih2PT09dHx8aSh2LHQsbixyLG8pKSlyZXR1cm4gZy5wdXNoKGUpfSkpKXtoPSExO2JyZWFrfX1lbHNlIGlmKHYhPT1kJiYhaSh2LGQsbixyLG8pKXtoPSExO2JyZWFrfX1yZXR1cm4gby5kZWxldGUodCksby5kZWxldGUoZSksaH07dmFyIG5yPWZ1bmN0aW9uKHQpe3ZhciBlPS0xLG49QXJyYXkodC5zaXplKTtyZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbih0LHIpe25bKytlXT1bcix0XX0pKSxufTt2YXIgcnI9bC5VaW50OEFycmF5LGlyPWR0LG9yPWVyLGxyPW5yLGFyPWZ1bmN0aW9uKHQpe3ZhciBlPS0xLG49QXJyYXkodC5zaXplKTtyZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbih0KXtuWysrZV09dH0pKSxufSxzcj1hP2EucHJvdG90eXBlOnZvaWQgMCx1cj1zcj9zci52YWx1ZU9mOnZvaWQgMDt2YXIgY3I9ZnVuY3Rpb24odCxlLG4scixpLG8sbCl7c3dpdGNoKG4pe2Nhc2UiW29iamVjdCBEYXRhVmlld10iOmlmKHQuYnl0ZUxlbmd0aCE9ZS5ieXRlTGVuZ3RofHx0LmJ5dGVPZmZzZXQhPWUuYnl0ZU9mZnNldClyZXR1cm4hMTt0PXQuYnVmZmVyLGU9ZS5idWZmZXI7Y2FzZSJbb2JqZWN0IEFycmF5QnVmZmVyXSI6cmV0dXJuISh0LmJ5dGVMZW5ndGghPWUuYnl0ZUxlbmd0aHx8IW8obmV3IHJyKHQpLG5ldyBycihlKSkpO2Nhc2UiW29iamVjdCBCb29sZWFuXSI6Y2FzZSJbb2JqZWN0IERhdGVdIjpjYXNlIltvYmplY3QgTnVtYmVyXSI6cmV0dXJuIGlyKCt0LCtlKTtjYXNlIltvYmplY3QgRXJyb3JdIjpyZXR1cm4gdC5uYW1lPT1lLm5hbWUmJnQubWVzc2FnZT09ZS5tZXNzYWdlO2Nhc2UiW29iamVjdCBSZWdFeHBdIjpjYXNlIltvYmplY3QgU3RyaW5nXSI6cmV0dXJuIHQ9PWUrIiI7Y2FzZSJbb2JqZWN0IE1hcF0iOnZhciBhPWxyO2Nhc2UiW29iamVjdCBTZXRdIjp2YXIgcz0xJnI7aWYoYXx8KGE9YXIpLHQuc2l6ZSE9ZS5zaXplJiYhcylyZXR1cm4hMTt2YXIgdT1sLmdldCh0KTtpZih1KXJldHVybiB1PT1lO3J8PTIsbC5zZXQodCxlKTt2YXIgYz1vcihhKHQpLGEoZSkscixpLG8sbCk7cmV0dXJuIGwuZGVsZXRlKHQpLGM7Y2FzZSJbb2JqZWN0IFN5bWJvbF0iOmlmKHVyKXJldHVybiB1ci5jYWxsKHQpPT11ci5jYWxsKGUpfXJldHVybiExfTt2YXIgZnI9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49LTEscj1lLmxlbmd0aCxpPXQubGVuZ3RoOysrbjxyOyl0W2krbl09ZVtuXTtyZXR1cm4gdH0saHI9ZnIsZ3I9bjt2YXIgdnI9ZnVuY3Rpb24odCxlLG4pe3ZhciByPWUodCk7cmV0dXJuIGdyKHQpP3I6aHIocixuKHQpKX07dmFyIGRyPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPS0xLHI9bnVsbD09dD8wOnQubGVuZ3RoLGk9MCxvPVtdOysrbjxyOyl7dmFyIGw9dFtuXTtlKGwsbix0KSYmKG9baSsrXT1sKX1yZXR1cm4gb307dmFyIHByPWRyLHlyPWZ1bmN0aW9uKCl7cmV0dXJuW119LG1yPU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUsX3I9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyxicj12cix4cj1fcj9mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD9bXToodD1PYmplY3QodCkscHIoX3IodCksKGZ1bmN0aW9uKGUpe3JldHVybiBtci5jYWxsKHQsZSl9KSkpfTp5cix3cj1qbjt2YXIganI9ZnVuY3Rpb24odCl7cmV0dXJuIGJyKHQsd3IseHIpfSxTcj1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3ZhciBBcj1mdW5jdGlvbih0LGUsbixyLGksbyl7dmFyIGw9MSZuLGE9anIodCkscz1hLmxlbmd0aDtpZihzIT1qcihlKS5sZW5ndGgmJiFsKXJldHVybiExO2Zvcih2YXIgdT1zO3UtLTspe3ZhciBjPWFbdV07aWYoIShsP2MgaW4gZTpTci5jYWxsKGUsYykpKXJldHVybiExfXZhciBmPW8uZ2V0KHQpLGg9by5nZXQoZSk7aWYoZiYmaClyZXR1cm4gZj09ZSYmaD09dDt2YXIgZz0hMDtvLnNldCh0LGUpLG8uc2V0KGUsdCk7Zm9yKHZhciB2PWw7Kyt1PHM7KXt2YXIgZD10W2M9YVt1XV0scD1lW2NdO2lmKHIpdmFyIHk9bD9yKHAsZCxjLGUsdCxvKTpyKGQscCxjLHQsZSxvKTtpZighKHZvaWQgMD09PXk/ZD09PXB8fGkoZCxwLG4scixvKTp5KSl7Zz0hMTticmVha312fHwodj0iY29uc3RydWN0b3IiPT1jKX1pZihnJiYhdil7dmFyIG09dC5jb25zdHJ1Y3RvcixfPWUuY29uc3RydWN0b3I7bT09X3x8ISgiY29uc3RydWN0b3IiaW4gdCl8fCEoImNvbnN0cnVjdG9yImluIGUpfHwiZnVuY3Rpb24iPT10eXBlb2YgbSYmbSBpbnN0YW5jZW9mIG0mJiJmdW5jdGlvbiI9PXR5cGVvZiBfJiZfIGluc3RhbmNlb2YgX3x8KGc9ITEpfXJldHVybiBvLmRlbGV0ZSh0KSxvLmRlbGV0ZShlKSxnfSxPcj1XKGwsIkRhdGFWaWV3IiksTXI9RnQsa3I9VyhsLCJQcm9taXNlIiksUHI9VyhsLCJTZXQiKSxGcj1XKGwsIldlYWtNYXAiKSxUcj1tLHpyPVIsSXI9IltvYmplY3QgTWFwXSIsJHI9IltvYmplY3QgUHJvbWlzZV0iLEVyPSJbb2JqZWN0IFNldF0iLE5yPSJbb2JqZWN0IFdlYWtNYXBdIixScj0iW29iamVjdCBEYXRhVmlld10iLENyPXpyKE9yKSxCcj16cihNciksVXI9enIoa3IpLExyPXpyKFByKSxEcj16cihGciksSHI9VHI7KE9yJiZIcihuZXcgT3IobmV3IEFycmF5QnVmZmVyKDEpKSkhPVJyfHxNciYmSHIobmV3IE1yKSE9SXJ8fGtyJiZIcihrci5yZXNvbHZlKCkpIT0kcnx8UHImJkhyKG5ldyBQcikhPUVyfHxGciYmSHIobmV3IEZyKSE9TnIpJiYoSHI9ZnVuY3Rpb24odCl7dmFyIGU9VHIodCksbj0iW29iamVjdCBPYmplY3RdIj09ZT90LmNvbnN0cnVjdG9yOnZvaWQgMCxyPW4/enIobik6IiI7aWYocilzd2l0Y2gocil7Y2FzZSBDcjpyZXR1cm4gUnI7Y2FzZSBCcjpyZXR1cm4gSXI7Y2FzZSBVcjpyZXR1cm4gJHI7Y2FzZSBMcjpyZXR1cm4gRXI7Y2FzZSBEcjpyZXR1cm4gTnJ9cmV0dXJuIGV9KTt2YXIgWHI9SHIsWXI9Wm4sS3I9ZXIsWnI9Y3IsSnI9QXIsVnI9WHIsV3I9bixxcj1CZSxHcj10bixRcj0iW29iamVjdCBBcmd1bWVudHNdIix0aT0iW29iamVjdCBBcnJheV0iLGVpPSJbb2JqZWN0IE9iamVjdF0iLG5pPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dmFyIHJpPWZ1bmN0aW9uKHQsZSxuLHIsaSxvKXt2YXIgbD1Xcih0KSxhPVdyKGUpLHM9bD90aTpWcih0KSx1PWE/dGk6VnIoZSksYz0ocz1zPT1Rcj9laTpzKT09ZWksZj0odT11PT1Rcj9laTp1KT09ZWksaD1zPT11O2lmKGgmJnFyKHQpKXtpZighcXIoZSkpcmV0dXJuITE7bD0hMCxjPSExfWlmKGgmJiFjKXJldHVybiBvfHwobz1uZXcgWXIpLGx8fEdyKHQpP0tyKHQsZSxuLHIsaSxvKTpacih0LGUscyxuLHIsaSxvKTtpZighKDEmbikpe3ZhciBnPWMmJm5pLmNhbGwodCwiX193cmFwcGVkX18iKSx2PWYmJm5pLmNhbGwoZSwiX193cmFwcGVkX18iKTtpZihnfHx2KXt2YXIgZD1nP3QudmFsdWUoKTp0LHA9dj9lLnZhbHVlKCk6ZTtyZXR1cm4gb3x8KG89bmV3IFlyKSxpKGQscCxuLHIsbyl9fXJldHVybiEhaCYmKG98fChvPW5ldyBZciksSnIodCxlLG4scixpLG8pKX0saWk9Xzt2YXIgb2k9ZnVuY3Rpb24gdChlLG4scixpLG8pe3JldHVybiBlPT09bnx8KG51bGw9PWV8fG51bGw9PW58fCFpaShlKSYmIWlpKG4pP2UhPWUmJm4hPW46cmkoZSxuLHIsaSx0LG8pKX0sbGk9Wm4sYWk9b2k7dmFyIHNpPWs7dmFyIHVpPWZ1bmN0aW9uKHQpe3JldHVybiB0PT10JiYhc2kodCl9LGNpPXVpLGZpPWpuO3ZhciBoaT1mdW5jdGlvbih0LGUpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gbnVsbCE9biYmKG5bdF09PT1lJiYodm9pZCAwIT09ZXx8dCBpbiBPYmplY3QobikpKX19LGdpPWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPW4ubGVuZ3RoLG89aSxsPSFyO2lmKG51bGw9PXQpcmV0dXJuIW87Zm9yKHQ9T2JqZWN0KHQpO2ktLTspe3ZhciBhPW5baV07aWYobCYmYVsyXT9hWzFdIT09dFthWzBdXTohKGFbMF1pbiB0KSlyZXR1cm4hMX1mb3IoOysraTxvOyl7dmFyIHM9KGE9bltpXSlbMF0sdT10W3NdLGM9YVsxXTtpZihsJiZhWzJdKXtpZih2b2lkIDA9PT11JiYhKHMgaW4gdCkpcmV0dXJuITF9ZWxzZXt2YXIgZj1uZXcgbGk7aWYocil2YXIgaD1yKHUsYyxzLHQsZSxmKTtpZighKHZvaWQgMD09PWg/YWkoYyx1LDMscixmKTpoKSlyZXR1cm4hMX19cmV0dXJuITB9LHZpPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1maSh0KSxuPWUubGVuZ3RoO24tLTspe3ZhciByPWVbbl0saT10W3JdO2Vbbl09W3IsaSxjaShpKV19cmV0dXJuIGV9LGRpPWhpO3ZhciBwaT1oZSx5aT1DZSxtaT1uLF9pPURlLGJpPUhlLHhpPXZlO3ZhciB3aT1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsIT10JiZlIGluIE9iamVjdCh0KX0samk9ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj0tMSxpPShlPXBpKGUsdCkpLmxlbmd0aCxvPSExOysrcjxpOyl7dmFyIGw9eGkoZVtyXSk7aWYoIShvPW51bGwhPXQmJm4odCxsKSkpYnJlYWs7dD10W2xdfXJldHVybiBvfHwrK3IhPWk/bzohIShpPW51bGw9PXQ/MDp0Lmxlbmd0aCkmJmJpKGkpJiZfaShsLGkpJiYobWkodCl8fHlpKHQpKX07dmFyIFNpPW9pLEFpPV9lLE9pPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGwhPXQmJmppKHQsZSx3aSl9LE1pPU0sa2k9dWksUGk9aGksRmk9dmU7dmFyIFRpPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZT92b2lkIDA6ZVt0XX19LHppPXllO3ZhciBJaT1UaSwkaT1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHppKGUsdCl9fSxFaT1NLE5pPXZlO3ZhciBSaT1mdW5jdGlvbih0KXt2YXIgZT12aSh0KTtyZXR1cm4gMT09ZS5sZW5ndGgmJmVbMF1bMl0/ZGkoZVswXVswXSxlWzBdWzFdKTpmdW5jdGlvbihuKXtyZXR1cm4gbj09PXR8fGdpKG4sdCxlKX19LENpPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIE1pKHQpJiZraShlKT9QaShGaSh0KSxlKTpmdW5jdGlvbihuKXt2YXIgcj1BaShuLHQpO3JldHVybiB2b2lkIDA9PT1yJiZyPT09ZT9PaShuLHQpOlNpKGUsciwzKX19LEJpPWtuLFVpPW4sTGk9ZnVuY3Rpb24odCl7cmV0dXJuIEVpKHQpP0lpKE5pKHQpKTokaSh0KX07dmFyIERpPWZ1bmN0aW9uKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6bnVsbD09dD9CaToib2JqZWN0Ij09dHlwZW9mIHQ/VWkodCk/Q2kodFswXSx0WzFdKTpSaSh0KTpMaSh0KX0sSGk9TW4sWGk9X247dmFyIFlpPXRlLEtpPURpLFppPWZ1bmN0aW9uKHQsZSl7dmFyIG49LTEscj1YaSh0KT9BcnJheSh0Lmxlbmd0aCk6W107cmV0dXJuIEhpKHQsKGZ1bmN0aW9uKHQsaSxvKXtyWysrbl09ZSh0LGksbyl9KSkscn0sSmk9bjt2YXIgVmk9ZnVuY3Rpb24odCxlKXtyZXR1cm4oSmkodCk/WWk6WmkpKHQsS2koZSkpfTt2YXIgV2k9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4scj0tMSxpPXQubGVuZ3RoOysrcjxpOyl7dmFyIG89ZSh0W3JdKTt2b2lkIDAhPT1vJiYobj12b2lkIDA9PT1uP286bitvKX1yZXR1cm4gbn0scWk9V2ksR2k9a247dmFyIFFpPWZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0Lmxlbmd0aD9xaSh0LEdpKTowfSx0bz1tLGVvPW4sbm89Xzt2YXIgcm89ZnVuY3Rpb24odCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0fHwhZW8odCkmJm5vKHQpJiYiW29iamVjdCBTdHJpbmddIj09dG8odCl9LGlvPVRpKCJsZW5ndGgiKSxvbz1SZWdFeHAoIltcXHUyMDBkXFx1ZDgwMC1cXHVkZmZmXFx1MDMwMC1cXHUwMzZmXFx1ZmUyMC1cXHVmZTJmXFx1MjBkMC1cXHUyMGZmXFx1ZmUwZVxcdWZlMGZdIik7dmFyIGxvPWZ1bmN0aW9uKHQpe3JldHVybiBvby50ZXN0KHQpfSxhbz0iXFx1ZDgwMC1cXHVkZmZmIixzbz0iWyIrYW8rIl0iLHVvPSJbXFx1MDMwMC1cXHUwMzZmXFx1ZmUyMC1cXHVmZTJmXFx1MjBkMC1cXHUyMGZmXSIsY289IlxcdWQ4M2NbXFx1ZGZmYi1cXHVkZmZmXSIsZm89IlteIithbysiXSIsaG89Iig/OlxcdWQ4M2NbXFx1ZGRlNi1cXHVkZGZmXSl7Mn0iLGdvPSJbXFx1ZDgwMC1cXHVkYmZmXVtcXHVkYzAwLVxcdWRmZmZdIix2bz0iKD86Iit1bysifCIrY28rIikiKyI/Iixwbz0iW1xcdWZlMGVcXHVmZTBmXT8iLHlvPXBvK3ZvKygiKD86XFx1MjAwZCg/OiIrW2ZvLGhvLGdvXS5qb2luKCJ8IikrIikiK3BvK3ZvKyIpKiIpLG1vPSIoPzoiK1tmbyt1bysiPyIsdW8saG8sZ28sc29dLmpvaW4oInwiKSsiKSIsX289UmVnRXhwKGNvKyIoPz0iK2NvKyIpfCIrbW8reW8sImciKTt2YXIgYm89aW8seG89bG8sd289ZnVuY3Rpb24odCl7Zm9yKHZhciBlPV9vLmxhc3RJbmRleD0wO19vLnRlc3QodCk7KSsrZTtyZXR1cm4gZX07dmFyIGpvPXBuLFNvPVhyLEFvPV9uLE9vPXJvLE1vPWZ1bmN0aW9uKHQpe3JldHVybiB4byh0KT93byh0KTpibyh0KX07dmFyIGtvPWZ1bmN0aW9uKHQpe2lmKG51bGw9PXQpcmV0dXJuIDA7aWYoQW8odCkpcmV0dXJuIE9vKHQpP01vKHQpOnQubGVuZ3RoO3ZhciBlPVNvKHQpO3JldHVybiJbb2JqZWN0IE1hcF0iPT1lfHwiW29iamVjdCBTZXRdIj09ZT90LnNpemU6am8odCkubGVuZ3RofSxQbz1tLEZvPV87dmFyIFRvPWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdHx8Rm8odCkmJiJbb2JqZWN0IE51bWJlcl0iPT1Qbyh0KX07ZnVuY3Rpb24gem8odCl7cmV0dXJuIltvYmplY3QgT2JqZWN0XSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9ZnVuY3Rpb24gSW8odCl7aWYoem8odCkpe2ZvcihsZXQgZSBpbiB0KXJldHVybiEwO3JldHVybiExfXJldHVybiExfWZ1bmN0aW9uICRvKHQpe3JldHVybiJbb2JqZWN0IEFycmF5XSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9ZnVuY3Rpb24gRW8odCl7cmV0dXJuISFmdW5jdGlvbih0KXtyZXR1cm4iW29iamVjdCBVbmRlZmluZWRdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX0odCl8fCghIWZ1bmN0aW9uKHQpe3JldHVybiJbb2JqZWN0IE51bGxdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX0odCl8fCghIWZ1bmN0aW9uKHQpe2lmKHpvKHQpKXtmb3IobGV0IGUgaW4gdClyZXR1cm4hMTtyZXR1cm4hMH1yZXR1cm4hMX0odCl8fCghIWZ1bmN0aW9uKHQpe3JldHVybiEoIVNlKHQpfHwiIiE9PXQpfSh0KXx8ISFmdW5jdGlvbih0KXtyZXR1cm4hISRvKHQpJiYwPT09dC5sZW5ndGh9KHQpKSkpfWZ1bmN0aW9uIE5vKHQpe3JldHVybiEhJG8odCkmJigwIT09dC5sZW5ndGgmJigxIT09dC5sZW5ndGh8fCFFbyh0WzBdKSkpfWZ1bmN0aW9uIFJvKHQpe2xldCBlPSExO3JldHVybiBBZSh0KT9lPSFpc05hTihOdW1iZXIodCkpOmZ1bmN0aW9uKHQpe3JldHVybiJbb2JqZWN0IE51bWJlcl0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfSh0KSYmKGU9ITApLGV9ZnVuY3Rpb24gQ28odCl7bGV0IGU9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpO3JldHVybiJbb2JqZWN0IEZ1bmN0aW9uXSI9PT1lfHwiW29iamVjdCBBc3luY0Z1bmN0aW9uXSI9PT1lfXZhciBCbz0vXHMvO3ZhciBVbz1mdW5jdGlvbih0KXtmb3IodmFyIGU9dC5sZW5ndGg7ZS0tJiZCby50ZXN0KHQuY2hhckF0KGUpKTspO3JldHVybiBlfSxMbz0vXlxzKy87dmFyIERvPWZ1bmN0aW9uKHQpe3JldHVybiB0P3Quc2xpY2UoMCxVbyh0KSsxKS5yZXBsYWNlKExvLCIiKTp0fSxIbz1rLFhvPXcsWW89L15bLStdMHhbMC05YS1mXSskL2ksS289L14wYlswMV0rJC9pLFpvPS9eMG9bMC03XSskL2ksSm89cGFyc2VJbnQ7dmFyIFZvPWZ1bmN0aW9uKHQpe2lmKCJudW1iZXIiPT10eXBlb2YgdClyZXR1cm4gdDtpZihYbyh0KSlyZXR1cm4gTmFOO2lmKEhvKHQpKXt2YXIgZT0iZnVuY3Rpb24iPT10eXBlb2YgdC52YWx1ZU9mP3QudmFsdWVPZigpOnQ7dD1IbyhlKT9lKyIiOmV9aWYoInN0cmluZyIhPXR5cGVvZiB0KXJldHVybiAwPT09dD90Oit0O3Q9RG8odCk7dmFyIG49S28udGVzdCh0KTtyZXR1cm4gbnx8Wm8udGVzdCh0KT9Kbyh0LnNsaWNlKDIpLG4/Mjo4KTpZby50ZXN0KHQpP05hTjordH0sV289Vm8scW89MS8wO3ZhciBHbz1mdW5jdGlvbih0KXtyZXR1cm4gdD8odD1Xbyh0KSk9PT1xb3x8dD09PS0xLzA/MTc5NzY5MzEzNDg2MjMxNTdlMjkyKih0PDA/LTE6MSk6dD09dD90OjA6MD09PXQ/dDowfTtmdW5jdGlvbiBRbyh0KXtpZighUm8odCkpcmV0dXJuIDA7cmV0dXJuIEdvKHQpfWZ1bmN0aW9uIHRsKHQsZSl7cmV0dXJuISF6byh0KSYmKCEoIUFlKGUpJiYhUm8oZSkpJiZlIGluIHQpfWZ1bmN0aW9uIGVsKHQsZT17fSl7aWYoa28odCk8PTApcmV0dXJuW107bGV0IG49X2UoZSwia2V5WCIpO0FlKG4pfHwobj0ieCIpO2xldCByPV9lKGUsImtleVkiKTtBZShyKXx8KHI9InkiKTtsZXQgaT1fZShlLCJrZXlJbmQiLCIiKTtBZShpKXx8KGk9ImluZCIpO2xldCBvPVtdO3JldHVybiBFbih0LCgodCxlKT0+e2xldCBsPW51bGwsYT1udWxsOyRvKHQpJiZrbyh0KT49Mj8obD1fZSh0LDApLGE9X2UodCwxKSk6KGw9X2UodCxuLG51bGwpLGE9X2UodCxyLG51bGwpKSxSbyhsKSYmUm8oYSkmJihsPVZvKGwpLGE9Vm8oYSksby5wdXNoKHt4OmwseTphLFtpXTplfSkpfSkpLG99ZnVuY3Rpb24gbmwodCxlPXt9KXtpZihrbyh0KTw9MClyZXR1cm5bXTtsZXQgbj1fZShlLCJrZXlYIik7QWUobil8fChuPSJ4Iik7bGV0IHI9X2UoZSwia2V5WSIpO0FlKHIpfHwocj0ieSIpO2xldCBpPV9lKGUsImtleVoiLCIiKTtBZShpKXx8KGk9InoiKTtsZXQgbz1fZShlLCJrZXlJbmQiLCIiKTtBZShvKXx8KG89ImluZCIpO2xldCBsPVtdO3JldHVybiBFbih0LCgodCxlKT0+e2xldCBhPW51bGwscz1udWxsLHU9bnVsbDskbyh0KSYma28odCk+PTM/KGE9X2UodCwwKSxzPV9lKHQsMSksdT1fZSh0LDIpKTooYT1fZSh0LG4sbnVsbCkscz1fZSh0LHIsbnVsbCksdT1fZSh0LGksbnVsbCkpLFJvKGEpJiZSbyhzKSYmUm8odSkmJihhPVZvKGEpLHM9Vm8ocyksdT1Wbyh1KSxsLnB1c2goe3g6YSx5OnMsejp1LFtvXTplfSkpfSkpLGx9dmFyIHJsPXc7dmFyIGlsPWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHI9LTEsaT10Lmxlbmd0aDsrK3I8aTspe3ZhciBvPXRbcl0sbD1lKG8pO2lmKG51bGwhPWwmJih2b2lkIDA9PT1hP2w9PWwmJiFybChsKTpuKGwsYSkpKXZhciBhPWwscz1vfXJldHVybiBzfTt2YXIgb2w9aWwsbGw9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdDxlfSxhbD1rbjt2YXIgc2w9ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQubGVuZ3RoP29sKHQsYWwsbGwpOnZvaWQgMH07dmFyIHVsPWlsLGNsPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ+ZX0sZmw9a247dmFyIGhsPWZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0Lmxlbmd0aD91bCh0LGZsLGNsKTp2b2lkIDB9O2Z1bmN0aW9uIGdsKHQpe3JldHVybiBnbD0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYic3ltYm9sIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbih0KXtyZXR1cm4gdHlwZW9mIHR9OmZ1bmN0aW9uKHQpe3JldHVybiB0JiYiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZ0LmNvbnN0cnVjdG9yPT09U3ltYm9sJiZ0IT09U3ltYm9sLnByb3RvdHlwZT8ic3ltYm9sIjp0eXBlb2YgdH0sZ2wodCl9ZnVuY3Rpb24gdmwodCl7dmFyIGU9ZnVuY3Rpb24odCxlKXtpZigib2JqZWN0IiE9PWdsKHQpfHxudWxsPT09dClyZXR1cm4gdDt2YXIgbj10W1N5bWJvbC50b1ByaW1pdGl2ZV07aWYodm9pZCAwIT09bil7dmFyIHI9bi5jYWxsKHQsZXx8ImRlZmF1bHQiKTtpZigib2JqZWN0IiE9PWdsKHIpKXJldHVybiByO3Rocm93IG5ldyBUeXBlRXJyb3IoIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuIil9cmV0dXJuKCJzdHJpbmciPT09ZT9TdHJpbmc6TnVtYmVyKSh0KX0odCwic3RyaW5nIik7cmV0dXJuInN5bWJvbCI9PT1nbChlKT9lOlN0cmluZyhlKX1mdW5jdGlvbiBkbCh0LGUsbil7cmV0dXJuKGU9dmwoZSkpaW4gdD9PYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLHt2YWx1ZTpuLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSk6dFtlXT1uLHR9dmFyIHBsPU1uO3ZhciB5bD1kcixtbD1mdW5jdGlvbih0LGUpe3ZhciBuPVtdO3JldHVybiBwbCh0LChmdW5jdGlvbih0LHIsaSl7ZSh0LHIsaSkmJm4ucHVzaCh0KX0pKSxufSxfbD1EaSxibD1uO3ZhciB4bD1mdW5jdGlvbih0LGUpe3JldHVybihibCh0KT95bDptbCkodCxfbChlKSl9LHdsPU1hdGguY2VpbCxqbD1NYXRoLm1heDt2YXIgU2w9ZHQsQWw9X24sT2w9RGUsTWw9azt2YXIga2w9ZnVuY3Rpb24odCxlLG4scil7Zm9yKHZhciBpPS0xLG89amwod2woKGUtdCkvKG58fDEpKSwwKSxsPUFycmF5KG8pO28tLTspbFtyP286KytpXT10LHQrPW47cmV0dXJuIGx9LFBsPWZ1bmN0aW9uKHQsZSxuKXtpZighTWwobikpcmV0dXJuITE7dmFyIHI9dHlwZW9mIGU7cmV0dXJuISEoIm51bWJlciI9PXI/QWwobikmJk9sKGUsbi5sZW5ndGgpOiJzdHJpbmciPT1yJiZlIGluIG4pJiZTbChuW2VdLHQpfSxGbD1Hbzt2YXIgVGw9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUsbixyKXtyZXR1cm4gciYmIm51bWJlciIhPXR5cGVvZiByJiZQbChlLG4scikmJihuPXI9dm9pZCAwKSxlPUZsKGUpLHZvaWQgMD09PW4/KG49ZSxlPTApOm49Rmwobikscj12b2lkIDA9PT1yP2U8bj8xOi0xOkZsKHIpLGtsKGUsbixyLHQpfX0oKSx6bD1XaTt2YXIgSWw9ZnVuY3Rpb24odCxlKXt2YXIgbj1udWxsPT10PzA6dC5sZW5ndGg7cmV0dXJuIG4/emwodCxlKS9uOk5hTn0sJGw9a247dmFyIEVsPWZ1bmN0aW9uKHQpe3JldHVybiBJbCh0LCRsKX07ZnVuY3Rpb24gTmwodCxlKXt2YXIgbj1PYmplY3Qua2V5cyh0KTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgcj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHQpO2UmJihyPXIuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LGUpLmVudW1lcmFibGV9KSkpLG4ucHVzaC5hcHBseShuLHIpfXJldHVybiBufWZ1bmN0aW9uIFJsKHQpe2lmKCFObyh0KSlyZXR1cm57ZXJyOiJhcnIgaXMgbm90IGFuIGVmZmVjdGl2ZSBhcnJheSJ9O2xldCBlPV9lKHQsMCksbj0wO05vKGUpJiYobj1rbyhlKSk7bGV0IHI9W107aWYoMD09PW4/KHI9eGwodCxSbykscj1WaShyLFFvKSk6RW4odCwodD0+e2xldCBlPSEwLGk9W107RW4oVGwobiksKG49PntsZXQgcj1fZSh0LG4pO1JvKHIpfHwoZT0hMSksaS5wdXNoKFFvKHIpKX0pKSxlJiZyLnB1c2goaSl9KSksMD09PWtvKHIpKXJldHVybntlcnI6ImFyciBoYXMgbm8gZWZmZWN0aXZlIGRhdGEifTtsZXQgaT10PT57bGV0IGU9KHQ9PntsZXQgZT1zbCh0KSxuPWhsKHQpO3JldHVybnttaW46ZSxtYXg6bixyYW5nZTpuLWUsbWlkOihuK2UpLzIsYXZnOkVsKHQpfX0pKHQpLG49KCh0LGUsbixyKT0+VmkodCwodD0+KHQtZSkvcikpKSh0LGUubWluLGUubWF4LGUucmFuZ2UpO3JldHVybiBmdW5jdGlvbih0KXtmb3IodmFyIGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXt2YXIgbj1udWxsIT1hcmd1bWVudHNbZV0/YXJndW1lbnRzW2VdOnt9O2UlMj9ObChPYmplY3QobiksITApLmZvckVhY2goKGZ1bmN0aW9uKGUpe2RsKHQsZSxuW2VdKX0pKTpPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycz9PYmplY3QuZGVmaW5lUHJvcGVydGllcyh0LE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG4pKTpObChPYmplY3QobikpLmZvckVhY2goKGZ1bmN0aW9uKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihuLGUpKX0pKX1yZXR1cm4gdH0oe2FycjpufSxlKX0sbz1udWxsO3JldHVybiBvPTA9PT1uP2kocik6VmkoVGwobiksKHQ9PntsZXQgZT1WaShyLHQpO3JldHVybiBpKGUpfSkpLG99ZnVuY3Rpb24gQ2wodCxlPVtdKXtpZighTm8odCkpcmV0dXJue2VycjoiYXJyIGlzIG5vdCBhbiBlZmZlY3RpdmUgYXJyYXkifTtpZihrbyhlKT4wKXtpZighSW8oX2UodCwwKSkpcmV0dXJue2VycjoiYXJyIGlzIG5vdCBhbiBlZmZlY3RpdmUgYXJyYXkgb2Ygb2JqZWN0cyJ9O2xldCBuPVtdO0VuKHQsKHQ9PntsZXQgcj1bXTtFbihlLChlPT57ci5wdXNoKF9lKHQsZSwiIikpfSkpLG4ucHVzaChyKX0pKSx0PW59cmV0dXJuIFJsKHQpfWZ1bmN0aW9uIEJsKHQsZT17fSl7bGV0IG49X2UoZSwia2V5WCIpO0FlKG4pfHwobj0ieCIpO2xldCByPV9lKGUsImtleVkiKTtBZShyKXx8KHI9InkiKTtsZXQgaT1fZShlLCJrZXlaIiwiIik7QWUoaSl8fChpPSJ6Iik7bGV0IG89X2UoZSwia2V5SW5kIiwiIik7QWUobyl8fChvPSJpbmQiKTtsZXQgbD1fZShlLCJzY2FsZSIpO2lmKFJvKGwpfHwobD0xKSxsPVFvKGwpLGw8PTApdGhyb3cgbmV3IEVycm9yKCJzY2FsZSBuZWVkID49IDAiKTtsZXQgYT1DbChWaSh0LG4pKSxzPUNsKFZpKHQscikpLHU9Q2woVmkodCxpKSksYz1NYXRoLm1heChhLnJhbmdlLHMucmFuZ2UpLGY9Yy8yLGg9W3ttaW46YS5taWQtZixtYXg6YS5taWQrZixyYW5nZTpjfSx7bWluOnMubWlkLWYsbWF4OnMubWlkK2YscmFuZ2U6Y30se21pbjp1Lm1pbixtYXg6dS5tYXgscmFuZ2U6dS5yYW5nZX1dLGc9KHQsZSk9PlRvKHQpP2hbZV0ucmFuZ2U8PTA/dDoodC1oW2VdLm1pbikvaFtlXS5yYW5nZSpsOm51bGw7dD1WaSh0LCh0PT57bGV0IGU9Zyh0W25dLDApLGw9Zyh0W3JdLDEpLGE9Zyh0W2ldLDIpLHM9dFtvXTtyZXR1cm57W25dOmUsW3JdOmwsW2ldOmEsW29dOnN9fSkpO2xldCB2PVZpKHQsbiksZD1zbCh2KSxwPWhsKHYpLHk9VmkodCxyKSxtPXNsKHkpLF89aGwoeSksYj1WaSh0LGkpO3JldHVybntwczp0LHBzTWluTWF4Ont4bWluOmQseG1heDpwLHltaW46bSx5bWF4Ol8sem1pbjpzbChiKSx6bWF4OmhsKGIpfSxzdDpoLG52OmcsaW52Oih0LGUpPT5Ubyh0KT9sPD0wP3Q6dC9sKmhbZV0ucmFuZ2UraFtlXS5taW46bnVsbH19dmFyIFVsPUNlLExsPW4sRGw9YT9hLmlzQ29uY2F0U3ByZWFkYWJsZTp2b2lkIDA7dmFyIEhsPWZyLFhsPWZ1bmN0aW9uKHQpe3JldHVybiBMbCh0KXx8VWwodCl8fCEhKERsJiZ0JiZ0W0RsXSl9O3ZhciBZbD1mdW5jdGlvbiB0KGUsbixyLGksbyl7dmFyIGw9LTEsYT1lLmxlbmd0aDtmb3Iocnx8KHI9WGwpLG98fChvPVtdKTsrK2w8YTspe3ZhciBzPWVbbF07bj4wJiZyKHMpP24+MT90KHMsbi0xLHIsaSxvKTpIbChvLHMpOml8fChvW28ubGVuZ3RoXT1zKX1yZXR1cm4gb30sS2w9WWw7dmFyIFpsPWZ1bmN0aW9uKHQpe3JldHVybihudWxsPT10PzA6dC5sZW5ndGgpP0tsKHQsMSk6W119O2Z1bmN0aW9uIEpsKHQpe2xldCBlPWZ1bmN0aW9uKHQpe2xldCBlPWtvKF9lKHQsIjAiLG51bGwpKSxuPWtvKF9lKHQsIjAuMCIsbnVsbCkpO3JldHVybiAyPT09a28oX2UodCwiMC4wLjAiLG51bGwpKT8zOjI9PT1uPzI6Mj09PWU/MTowPT09ZT8wOihjb25zb2xlLmxvZygiaW52YWxpZCBwb2ludCBkZXB0aCIsdCksbnVsbCl9KHQpO3JldHVybiAzPT09ZT9abCh0KToyPT09ZT90OjE9PT1lP1t0XTowPT09ZT9bXTp0fWZ1bmN0aW9uIFZsKHQpe2lmKCFObyh0KSlyZXR1cm4gMDt0PUpsKHQpO2xldCBlPTA7cmV0dXJuIEVuKHQsKCh0LG4pPT57bGV0IHI9ZnVuY3Rpb24odCxlPXt9KXtsZXQgbj1fZShlLCJ1c2VBYnMiKTtpZihqZShuKXx8KG49ITApLCFObyh0KSlyZXR1cm4gMDtsZXQgcj1bXTtpZihFbih0LCh0PT57Mj09PWtvKHQpJiZSbyh0WzBdKSYmUm8odFsxXSkmJnIucHVzaChbUW8odFswXSksUW8odFsxXSldKX0pKSwhTm8ocikpcmV0dXJuIDA7bGV0IGksbz0tMSxsPWtvKHIpLGE9cltsLTFdLHM9MDtmb3IoOysrbzxsOylpPWEsYT1yW29dLHMrPWlbMV0qYVswXS1pWzBdKmFbMV07bGV0IHU9cy8yO3JldHVybiBuJiYodT1NYXRoLmFicyh1KSksdX0odCk7MD09PW4/ZT1yOmUtPXJ9KSksZTwwPzA6ZX12YXIgV2w9ZnVuY3Rpb24odCl7Im51bWJlciIhPXR5cGVvZiB0JiYodD0xZS0xMCk7dmFyIGU9e2Vwc2lsb246ZnVuY3Rpb24oZSl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiBlJiYodD1lKSx0fSxwb2ludEFib3ZlT3JPbkxpbmU6ZnVuY3Rpb24oZSxuLHIpe3ZhciBpPW5bMF0sbz1uWzFdLGw9clswXSxhPXJbMV0scz1lWzBdO3JldHVybihsLWkpKihlWzFdLW8pLShhLW8pKihzLWkpPj0tdH0scG9pbnRCZXR3ZWVuOmZ1bmN0aW9uKGUsbixyKXt2YXIgaT1lWzFdLW5bMV0sbz1yWzBdLW5bMF0sbD1lWzBdLW5bMF0sYT1yWzFdLW5bMV0scz1sKm8raSphO3JldHVybiEoczx0KSYmIShzLShvKm8rYSphKT4tdCl9LHBvaW50c1NhbWVYOmZ1bmN0aW9uKGUsbil7cmV0dXJuIE1hdGguYWJzKGVbMF0tblswXSk8dH0scG9pbnRzU2FtZVk6ZnVuY3Rpb24oZSxuKXtyZXR1cm4gTWF0aC5hYnMoZVsxXS1uWzFdKTx0fSxwb2ludHNTYW1lOmZ1bmN0aW9uKHQsbil7cmV0dXJuIGUucG9pbnRzU2FtZVgodCxuKSYmZS5wb2ludHNTYW1lWSh0LG4pfSxwb2ludHNDb21wYXJlOmZ1bmN0aW9uKHQsbil7cmV0dXJuIGUucG9pbnRzU2FtZVgodCxuKT9lLnBvaW50c1NhbWVZKHQsbik/MDp0WzFdPG5bMV0/LTE6MTp0WzBdPG5bMF0/LTE6MX0scG9pbnRzQ29sbGluZWFyOmZ1bmN0aW9uKGUsbixyKXt2YXIgaT1lWzBdLW5bMF0sbz1lWzFdLW5bMV0sbD1uWzBdLXJbMF0sYT1uWzFdLXJbMV07cmV0dXJuIE1hdGguYWJzKGkqYS1sKm8pPHR9LGxpbmVzSW50ZXJzZWN0OmZ1bmN0aW9uKGUsbixyLGkpe3ZhciBvPW5bMF0tZVswXSxsPW5bMV0tZVsxXSxhPWlbMF0tclswXSxzPWlbMV0tclsxXSx1PW8qcy1sKmE7aWYoTWF0aC5hYnModSk8dClyZXR1cm4hMTt2YXIgYz1lWzBdLXJbMF0sZj1lWzFdLXJbMV0saD0oYSpmLXMqYykvdSxnPShvKmYtbCpjKS91LHY9e2Fsb25nQTowLGFsb25nQjowLHB0OltlWzBdK2gqbyxlWzFdK2gqbF19O3JldHVybiB2LmFsb25nQT1oPD0tdD8tMjpoPHQ/LTE6aC0xPD0tdD8wOmgtMTx0PzE6Mix2LmFsb25nQj1nPD0tdD8tMjpnPHQ/LTE6Zy0xPD0tdD8wOmctMTx0PzE6Mix2fSxwb2ludEluc2lkZVJlZ2lvbjpmdW5jdGlvbihlLG4pe2Zvcih2YXIgcj1lWzBdLGk9ZVsxXSxvPW5bbi5sZW5ndGgtMV1bMF0sbD1uW24ubGVuZ3RoLTFdWzFdLGE9ITEscz0wO3M8bi5sZW5ndGg7cysrKXt2YXIgdT1uW3NdWzBdLGM9bltzXVsxXTtjLWk+dCE9bC1pPnQmJihvLXUpKihpLWMpLyhsLWMpK3Utcj50JiYoYT0hYSksbz11LGw9Y31yZXR1cm4gYX19O3JldHVybiBlfSxxbD17Y3JlYXRlOmZ1bmN0aW9uKCl7dmFyIHQ9e3Jvb3Q6e3Jvb3Q6ITAsbmV4dDpudWxsfSxleGlzdHM6ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGwhPT1lJiZlIT09dC5yb290fSxpc0VtcHR5OmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PT10LnJvb3QubmV4dH0sZ2V0SGVhZDpmdW5jdGlvbigpe3JldHVybiB0LnJvb3QubmV4dH0saW5zZXJ0QmVmb3JlOmZ1bmN0aW9uKGUsbil7Zm9yKHZhciByPXQucm9vdCxpPXQucm9vdC5uZXh0O251bGwhPT1pOyl7aWYobihpKSlyZXR1cm4gZS5wcmV2PWkucHJldixlLm5leHQ9aSxpLnByZXYubmV4dD1lLHZvaWQoaS5wcmV2PWUpO3I9aSxpPWkubmV4dH1yLm5leHQ9ZSxlLnByZXY9cixlLm5leHQ9bnVsbH0sZmluZFRyYW5zaXRpb246ZnVuY3Rpb24oZSl7Zm9yKHZhciBuPXQucm9vdCxyPXQucm9vdC5uZXh0O251bGwhPT1yJiYhZShyKTspbj1yLHI9ci5uZXh0O3JldHVybntiZWZvcmU6bj09PXQucm9vdD9udWxsOm4sYWZ0ZXI6cixpbnNlcnQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQucHJldj1uLHQubmV4dD1yLG4ubmV4dD10LG51bGwhPT1yJiYoci5wcmV2PXQpLHR9fX19O3JldHVybiB0fSxub2RlOmZ1bmN0aW9uKHQpe3JldHVybiB0LnByZXY9bnVsbCx0Lm5leHQ9bnVsbCx0LnJlbW92ZT1mdW5jdGlvbigpe3QucHJldi5uZXh0PXQubmV4dCx0Lm5leHQmJih0Lm5leHQucHJldj10LnByZXYpLHQucHJldj1udWxsLHQubmV4dD1udWxsfSx0fX07dmFyIEdsPWZ1bmN0aW9uKHQsZSxuKXtmdW5jdGlvbiByKHQsZSxyKXtyZXR1cm57aWQ6bj9uLnNlZ21lbnRJZCgpOi0xLHN0YXJ0OnQsZW5kOmUsbXlGaWxsOnthYm92ZTpyLm15RmlsbC5hYm92ZSxiZWxvdzpyLm15RmlsbC5iZWxvd30sb3RoZXJGaWxsOm51bGx9fXZhciBpPXFsLmNyZWF0ZSgpO2Z1bmN0aW9uIG8odCxuKXtpLmluc2VydEJlZm9yZSh0LChmdW5jdGlvbihyKXtyZXR1cm4gZnVuY3Rpb24odCxuLHIsaSxvLGwpe3ZhciBhPWUucG9pbnRzQ29tcGFyZShuLG8pO3JldHVybiAwIT09YT9hOmUucG9pbnRzU2FtZShyLGwpPzA6dCE9PWk/dD8xOi0xOmUucG9pbnRBYm92ZU9yT25MaW5lKHIsaT9vOmwsaT9sOm8pPzE6LTF9KHQuaXNTdGFydCx0LnB0LG4sci5pc1N0YXJ0LHIucHQsci5vdGhlci5wdCk8MH0pKX1mdW5jdGlvbiBsKHQsZSl7dmFyIG49ZnVuY3Rpb24odCxlKXt2YXIgbj1xbC5ub2RlKHtpc1N0YXJ0OiEwLHB0OnQuc3RhcnQsc2VnOnQscHJpbWFyeTplLG90aGVyOm51bGwsc3RhdHVzOm51bGx9KTtyZXR1cm4gbyhuLHQuZW5kKSxufSh0LGUpO3JldHVybiBmdW5jdGlvbih0LGUsbil7dmFyIHI9cWwubm9kZSh7aXNTdGFydDohMSxwdDplLmVuZCxzZWc6ZSxwcmltYXJ5Om4sb3RoZXI6dCxzdGF0dXM6bnVsbH0pO3Qub3RoZXI9cixvKHIsdC5wdCl9KG4sdCxlKSxufWZ1bmN0aW9uIGEodCxlKXt2YXIgaT1yKGUsdC5zZWcuZW5kLHQuc2VnKTtyZXR1cm4gZnVuY3Rpb24odCxlKXtuJiZuLnNlZ21lbnRDaG9wKHQuc2VnLGUpLHQub3RoZXIucmVtb3ZlKCksdC5zZWcuZW5kPWUsdC5vdGhlci5wdD1lLG8odC5vdGhlcix0LnB0KX0odCxlKSxsKGksdC5wcmltYXJ5KX1mdW5jdGlvbiBzKHIsbyl7dmFyIGw9cWwuY3JlYXRlKCk7ZnVuY3Rpb24gcyh0KXtyZXR1cm4gbC5maW5kVHJhbnNpdGlvbigoZnVuY3Rpb24obil7dmFyIHIsaSxvLGwsYSxzO3JldHVybihyPXQsaT1uLmV2LG89ci5zZWcuc3RhcnQsbD1yLnNlZy5lbmQsYT1pLnNlZy5zdGFydCxzPWkuc2VnLmVuZCxlLnBvaW50c0NvbGxpbmVhcihvLGEscyk/ZS5wb2ludHNDb2xsaW5lYXIobCxhLHMpfHxlLnBvaW50QWJvdmVPck9uTGluZShsLGEscyk/MTotMTplLnBvaW50QWJvdmVPck9uTGluZShvLGEscyk/MTotMSk+MH0pKX1mdW5jdGlvbiB1KHQscil7dmFyIGk9dC5zZWcsbz1yLnNlZyxsPWkuc3RhcnQscz1pLmVuZCx1PW8uc3RhcnQsYz1vLmVuZDtuJiZuLmNoZWNrSW50ZXJzZWN0aW9uKGksbyk7dmFyIGY9ZS5saW5lc0ludGVyc2VjdChsLHMsdSxjKTtpZighMT09PWYpe2lmKCFlLnBvaW50c0NvbGxpbmVhcihsLHMsdSkpcmV0dXJuITE7aWYoZS5wb2ludHNTYW1lKGwsYyl8fGUucG9pbnRzU2FtZShzLHUpKXJldHVybiExO3ZhciBoPWUucG9pbnRzU2FtZShsLHUpLGc9ZS5wb2ludHNTYW1lKHMsYyk7aWYoaCYmZylyZXR1cm4gcjt2YXIgdj0haCYmZS5wb2ludEJldHdlZW4obCx1LGMpLGQ9IWcmJmUucG9pbnRCZXR3ZWVuKHMsdSxjKTtpZihoKXJldHVybiBkP2EocixzKTphKHQsYykscjt2JiYoZ3x8KGQ/YShyLHMpOmEodCxjKSksYShyLGwpKX1lbHNlIDA9PT1mLmFsb25nQSYmKC0xPT09Zi5hbG9uZ0I/YSh0LHUpOjA9PT1mLmFsb25nQj9hKHQsZi5wdCk6MT09PWYuYWxvbmdCJiZhKHQsYykpLDA9PT1mLmFsb25nQiYmKC0xPT09Zi5hbG9uZ0E/YShyLGwpOjA9PT1mLmFsb25nQT9hKHIsZi5wdCk6MT09PWYuYWxvbmdBJiZhKHIscykpO3JldHVybiExfWZvcih2YXIgYz1bXTshaS5pc0VtcHR5KCk7KXt2YXIgZj1pLmdldEhlYWQoKTtpZihuJiZuLnZlcnQoZi5wdFswXSksZi5pc1N0YXJ0KXtuJiZuLnNlZ21lbnROZXcoZi5zZWcsZi5wcmltYXJ5KTt2YXIgaD1zKGYpLGc9aC5iZWZvcmU/aC5iZWZvcmUuZXY6bnVsbCx2PWguYWZ0ZXI/aC5hZnRlci5ldjpudWxsO2Z1bmN0aW9uIGQoKXtpZihnKXt2YXIgdD11KGYsZyk7aWYodClyZXR1cm4gdH1yZXR1cm4hIXYmJnUoZix2KX1uJiZuLnRlbXBTdGF0dXMoZi5zZWcsISFnJiZnLnNlZywhIXYmJnYuc2VnKTt2YXIgcCx5PWQoKTtpZih5KXt2YXIgbTtpZih0KShtPW51bGw9PT1mLnNlZy5teUZpbGwuYmVsb3d8fGYuc2VnLm15RmlsbC5hYm92ZSE9PWYuc2VnLm15RmlsbC5iZWxvdykmJih5LnNlZy5teUZpbGwuYWJvdmU9IXkuc2VnLm15RmlsbC5hYm92ZSk7ZWxzZSB5LnNlZy5vdGhlckZpbGw9Zi5zZWcubXlGaWxsO24mJm4uc2VnbWVudFVwZGF0ZSh5LnNlZyksZi5vdGhlci5yZW1vdmUoKSxmLnJlbW92ZSgpfWlmKGkuZ2V0SGVhZCgpIT09Zil7biYmbi5yZXdpbmQoZi5zZWcpO2NvbnRpbnVlfWlmKHQpbT1udWxsPT09Zi5zZWcubXlGaWxsLmJlbG93fHxmLnNlZy5teUZpbGwuYWJvdmUhPT1mLnNlZy5teUZpbGwuYmVsb3csZi5zZWcubXlGaWxsLmJlbG93PXY/di5zZWcubXlGaWxsLmFib3ZlOnIsZi5zZWcubXlGaWxsLmFib3ZlPW0/IWYuc2VnLm15RmlsbC5iZWxvdzpmLnNlZy5teUZpbGwuYmVsb3c7ZWxzZSBpZihudWxsPT09Zi5zZWcub3RoZXJGaWxsKXA9dj9mLnByaW1hcnk9PT12LnByaW1hcnk/di5zZWcub3RoZXJGaWxsLmFib3ZlOnYuc2VnLm15RmlsbC5hYm92ZTpmLnByaW1hcnk/bzpyLGYuc2VnLm90aGVyRmlsbD17YWJvdmU6cCxiZWxvdzpwfTtuJiZuLnN0YXR1cyhmLnNlZywhIWcmJmcuc2VnLCEhdiYmdi5zZWcpLGYub3RoZXIuc3RhdHVzPWguaW5zZXJ0KHFsLm5vZGUoe2V2OmZ9KSl9ZWxzZXt2YXIgXz1mLnN0YXR1cztpZihudWxsPT09Xyl0aHJvdyBuZXcgRXJyb3IoIlBvbHlCb29sOiBaZXJvLWxlbmd0aCBzZWdtZW50IGRldGVjdGVkOyB5b3VyIGVwc2lsb24gaXMgcHJvYmFibHkgdG9vIHNtYWxsIG9yIHRvbyBsYXJnZSIpO2lmKGwuZXhpc3RzKF8ucHJldikmJmwuZXhpc3RzKF8ubmV4dCkmJnUoXy5wcmV2LmV2LF8ubmV4dC5ldiksbiYmbi5zdGF0dXNSZW1vdmUoXy5ldi5zZWcpLF8ucmVtb3ZlKCksIWYucHJpbWFyeSl7dmFyIGI9Zi5zZWcubXlGaWxsO2Yuc2VnLm15RmlsbD1mLnNlZy5vdGhlckZpbGwsZi5zZWcub3RoZXJGaWxsPWJ9Yy5wdXNoKGYuc2VnKX1pLmdldEhlYWQoKS5yZW1vdmUoKX1yZXR1cm4gbiYmbi5kb25lKCksY31yZXR1cm4gdD97YWRkUmVnaW9uOmZ1bmN0aW9uKHQpe2Zvcih2YXIgcixpLG8sYT10W3QubGVuZ3RoLTFdLHM9MDtzPHQubGVuZ3RoO3MrKyl7cj1hLGE9dFtzXTt2YXIgdT1lLnBvaW50c0NvbXBhcmUocixhKTswIT09dSYmbCgoaT11PDA/cjphLG89dTwwP2E6cix7aWQ6bj9uLnNlZ21lbnRJZCgpOi0xLHN0YXJ0OmksZW5kOm8sbXlGaWxsOnthYm92ZTpudWxsLGJlbG93Om51bGx9LG90aGVyRmlsbDpudWxsfSksITApfX0sY2FsY3VsYXRlOmZ1bmN0aW9uKHQpe3JldHVybiBzKHQsITEpfX06e2NhbGN1bGF0ZTpmdW5jdGlvbih0LGUsbixpKXtyZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbih0KXtsKHIodC5zdGFydCx0LmVuZCx0KSwhMCl9KSksbi5mb3JFYWNoKChmdW5jdGlvbih0KXtsKHIodC5zdGFydCx0LmVuZCx0KSwhMSl9KSkscyhlLGkpfX19O3ZhciBRbD1mdW5jdGlvbih0LGUsbil7dmFyIHI9W10saT1bXTtyZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgbz10LnN0YXJ0LGw9dC5lbmQ7aWYoZS5wb2ludHNTYW1lKG8sbCkpY29uc29sZS53YXJuKCJQb2x5Qm9vbDogV2FybmluZzogWmVyby1sZW5ndGggc2VnbWVudCBkZXRlY3RlZDsgeW91ciBlcHNpbG9uIGlzIHByb2JhYmx5IHRvbyBzbWFsbCBvciB0b28gbGFyZ2UiKTtlbHNle24mJm4uY2hhaW5TdGFydCh0KTtmb3IodmFyIGE9e2luZGV4OjAsbWF0Y2hlc19oZWFkOiExLG1hdGNoZXNfcHQxOiExfSxzPXtpbmRleDowLG1hdGNoZXNfaGVhZDohMSxtYXRjaGVzX3B0MTohMX0sdT1hLGM9MDtjPHIubGVuZ3RoO2MrKyl7dmFyIGY9KHA9cltjXSlbMF07cFsxXTt2YXIgaD1wW3AubGVuZ3RoLTFdO2lmKHBbcC5sZW5ndGgtMl0sZS5wb2ludHNTYW1lKGYsbykpe2lmKFMoYywhMCwhMCkpYnJlYWt9ZWxzZSBpZihlLnBvaW50c1NhbWUoZixsKSl7aWYoUyhjLCEwLCExKSlicmVha31lbHNlIGlmKGUucG9pbnRzU2FtZShoLG8pKXtpZihTKGMsITEsITApKWJyZWFrfWVsc2UgaWYoZS5wb2ludHNTYW1lKGgsbCkmJlMoYywhMSwhMSkpYnJlYWt9aWYodT09PWEpcmV0dXJuIHIucHVzaChbbyxsXSksdm9pZChuJiZuLmNoYWluTmV3KG8sbCkpO2lmKHU9PT1zKXtuJiZuLmNoYWluTWF0Y2goYS5pbmRleCk7dmFyIGc9YS5pbmRleCx2PWEubWF0Y2hlc19wdDE/bDpvLGQ9YS5tYXRjaGVzX2hlYWQscD1yW2ddLHk9ZD9wWzBdOnBbcC5sZW5ndGgtMV0sbT1kP3BbMV06cFtwLmxlbmd0aC0yXSxfPWQ/cFtwLmxlbmd0aC0xXTpwWzBdLGI9ZD9wW3AubGVuZ3RoLTJdOnBbMV07cmV0dXJuIGUucG9pbnRzQ29sbGluZWFyKG0seSx2KSYmKGQ/KG4mJm4uY2hhaW5SZW1vdmVIZWFkKGEuaW5kZXgsdikscC5zaGlmdCgpKToobiYmbi5jaGFpblJlbW92ZVRhaWwoYS5pbmRleCx2KSxwLnBvcCgpKSx5PW0pLGUucG9pbnRzU2FtZShfLHYpPyhyLnNwbGljZShnLDEpLGUucG9pbnRzQ29sbGluZWFyKGIsXyx5KSYmKGQ/KG4mJm4uY2hhaW5SZW1vdmVUYWlsKGEuaW5kZXgseSkscC5wb3AoKSk6KG4mJm4uY2hhaW5SZW1vdmVIZWFkKGEuaW5kZXgseSkscC5zaGlmdCgpKSksbiYmbi5jaGFpbkNsb3NlKGEuaW5kZXgpLHZvaWQgaS5wdXNoKHApKTp2b2lkKGQ/KG4mJm4uY2hhaW5BZGRIZWFkKGEuaW5kZXgsdikscC51bnNoaWZ0KHYpKToobiYmbi5jaGFpbkFkZFRhaWwoYS5pbmRleCx2KSxwLnB1c2godikpKX12YXIgeD1hLmluZGV4LHc9cy5pbmRleDtuJiZuLmNoYWluQ29ubmVjdCh4LHcpO3ZhciBqPXJbeF0ubGVuZ3RoPHJbd10ubGVuZ3RoO2EubWF0Y2hlc19oZWFkP3MubWF0Y2hlc19oZWFkP2o/KEEoeCksTyh4LHcpKTooQSh3KSxPKHcseCkpOk8odyx4KTpzLm1hdGNoZXNfaGVhZD9PKHgsdyk6aj8oQSh4KSxPKHcseCkpOihBKHcpLE8oeCx3KSl9ZnVuY3Rpb24gUyh0LGUsbil7cmV0dXJuIHUuaW5kZXg9dCx1Lm1hdGNoZXNfaGVhZD1lLHUubWF0Y2hlc19wdDE9bix1PT09YT8odT1zLCExKToodT1udWxsLCEwKX1mdW5jdGlvbiBBKHQpe24mJm4uY2hhaW5SZXZlcnNlKHQpLHJbdF0ucmV2ZXJzZSgpfWZ1bmN0aW9uIE8odCxpKXt2YXIgbz1yW3RdLGw9cltpXSxhPW9bby5sZW5ndGgtMV0scz1vW28ubGVuZ3RoLTJdLHU9bFswXSxjPWxbMV07ZS5wb2ludHNDb2xsaW5lYXIocyxhLHUpJiYobiYmbi5jaGFpblJlbW92ZVRhaWwodCxhKSxvLnBvcCgpLGE9cyksZS5wb2ludHNDb2xsaW5lYXIoYSx1LGMpJiYobiYmbi5jaGFpblJlbW92ZUhlYWQoaSx1KSxsLnNoaWZ0KCkpLG4mJm4uY2hhaW5Kb2luKHQsaSksclt0XT1vLmNvbmNhdChsKSxyLnNwbGljZShpLDEpfX0pKSxpfTtmdW5jdGlvbiB0YSh0LGUsbil7dmFyIHI9W107cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGk9KHQubXlGaWxsLmFib3ZlPzg6MCkrKHQubXlGaWxsLmJlbG93PzQ6MCkrKHQub3RoZXJGaWxsJiZ0Lm90aGVyRmlsbC5hYm92ZT8yOjApKyh0Lm90aGVyRmlsbCYmdC5vdGhlckZpbGwuYmVsb3c/MTowKTswIT09ZVtpXSYmci5wdXNoKHtpZDpuP24uc2VnbWVudElkKCk6LTEsc3RhcnQ6dC5zdGFydCxlbmQ6dC5lbmQsbXlGaWxsOnthYm92ZToxPT09ZVtpXSxiZWxvdzoyPT09ZVtpXX0sb3RoZXJGaWxsOm51bGx9KX0pKSxuJiZuLnNlbGVjdGVkKHIpLHJ9dmFyIGVhLG5hPXt1bmlvbjpmdW5jdGlvbih0LGUpe3JldHVybiB0YSh0LFswLDIsMSwwLDIsMiwwLDAsMSwwLDEsMCwwLDAsMCwwXSxlKX0saW50ZXJzZWN0OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRhKHQsWzAsMCwwLDAsMCwyLDAsMiwwLDAsMSwxLDAsMiwxLDBdLGUpfSxkaWZmZXJlbmNlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRhKHQsWzAsMCwwLDAsMiwwLDIsMCwxLDEsMCwwLDAsMSwyLDBdLGUpfSxkaWZmZXJlbmNlUmV2OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRhKHQsWzAsMiwxLDAsMCwwLDEsMSwwLDIsMCwyLDAsMCwwLDBdLGUpfSx4b3I6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGEodCxbMCwyLDEsMCwyLDAsMCwxLDEsMCwwLDIsMCwxLDIsMF0sZSl9fSxyYT17dG9Qb2x5Z29uOmZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbihlKXtpZihlLmxlbmd0aDw9MClyZXR1cm4gdC5zZWdtZW50cyh7aW52ZXJ0ZWQ6ITEscmVnaW9uczpbXX0pO2Z1bmN0aW9uIG4oZSl7dmFyIG49ZS5zbGljZSgwLGUubGVuZ3RoLTEpO3JldHVybiB0LnNlZ21lbnRzKHtpbnZlcnRlZDohMSxyZWdpb25zOltuXX0pfWZvcih2YXIgcj1uKGVbMF0pLGk9MTtpPGUubGVuZ3RoO2krKylyPXQuc2VsZWN0RGlmZmVyZW5jZSh0LmNvbWJpbmUocixuKGVbaV0pKSk7cmV0dXJuIHJ9aWYoIlBvbHlnb24iPT09ZS50eXBlKXJldHVybiB0LnBvbHlnb24obihlLmNvb3JkaW5hdGVzKSk7aWYoIk11bHRpUG9seWdvbiI9PT1lLnR5cGUpe2Zvcih2YXIgcj10LnNlZ21lbnRzKHtpbnZlcnRlZDohMSxyZWdpb25zOltdfSksaT0wO2k8ZS5jb29yZGluYXRlcy5sZW5ndGg7aSsrKXI9dC5zZWxlY3RVbmlvbih0LmNvbWJpbmUocixuKGUuY29vcmRpbmF0ZXNbaV0pKSk7cmV0dXJuIHQucG9seWdvbihyKX10aHJvdyBuZXcgRXJyb3IoIlBvbHlCb29sOiBDYW5ub3QgY29udmVydCBHZW9KU09OIG9iamVjdCB0byBQb2x5Qm9vbCBwb2x5Z29uIil9LGZyb21Qb2x5Z29uOmZ1bmN0aW9uKHQsZSxuKXtmdW5jdGlvbiByKHQsbil7cmV0dXJuIGUucG9pbnRJbnNpZGVSZWdpb24oWy41Kih0WzBdWzBdK3RbMV1bMF0pLC41Kih0WzBdWzFdK3RbMV1bMV0pXSxuKX1mdW5jdGlvbiBpKHQpe3JldHVybntyZWdpb246dCxjaGlsZHJlbjpbXX19bj10LnBvbHlnb24odC5zZWdtZW50cyhuKSk7dmFyIG89aShudWxsKTtmdW5jdGlvbiBsKHQsZSl7Zm9yKHZhciBuPTA7bjx0LmNoaWxkcmVuLmxlbmd0aDtuKyspe2lmKHIoZSwoYT10LmNoaWxkcmVuW25dKS5yZWdpb24pKXJldHVybiB2b2lkIGwoYSxlKX12YXIgbz1pKGUpO2ZvcihuPTA7bjx0LmNoaWxkcmVuLmxlbmd0aDtuKyspe3ZhciBhO3IoKGE9dC5jaGlsZHJlbltuXSkucmVnaW9uLGUpJiYoby5jaGlsZHJlbi5wdXNoKGEpLHQuY2hpbGRyZW4uc3BsaWNlKG4sMSksbi0tKX10LmNoaWxkcmVuLnB1c2gobyl9Zm9yKHZhciBhPTA7YTxuLnJlZ2lvbnMubGVuZ3RoO2ErKyl7dmFyIHM9bi5yZWdpb25zW2FdO3MubGVuZ3RoPDN8fGwobyxzKX1mdW5jdGlvbiB1KHQsZSl7Zm9yKHZhciBuPTAscj10W3QubGVuZ3RoLTFdWzBdLGk9dFt0Lmxlbmd0aC0xXVsxXSxvPVtdLGw9MDtsPHQubGVuZ3RoO2wrKyl7dmFyIGE9dFtsXVswXSxzPXRbbF1bMV07by5wdXNoKFthLHNdKSxuKz1zKnItYSppLHI9YSxpPXN9cmV0dXJuIG48MCE9PWUmJm8ucmV2ZXJzZSgpLG8ucHVzaChbb1swXVswXSxvWzBdWzFdXSksb312YXIgYz1bXTtmdW5jdGlvbiBmKHQpe3ZhciBlPVt1KHQucmVnaW9uLCExKV07Yy5wdXNoKGUpO2Zvcih2YXIgbj0wO248dC5jaGlsZHJlbi5sZW5ndGg7bisrKWUucHVzaChoKHQuY2hpbGRyZW5bbl0pKX1mdW5jdGlvbiBoKHQpe2Zvcih2YXIgZT0wO2U8dC5jaGlsZHJlbi5sZW5ndGg7ZSsrKWYodC5jaGlsZHJlbltlXSk7cmV0dXJuIHUodC5yZWdpb24sITApfWZvcihhPTA7YTxvLmNoaWxkcmVuLmxlbmd0aDthKyspZihvLmNoaWxkcmVuW2FdKTtyZXR1cm4gYy5sZW5ndGg8PTA/e3R5cGU6IlBvbHlnb24iLGNvb3JkaW5hdGVzOltdfToxPT1jLmxlbmd0aD97dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6Y1swXX06e3R5cGU6Ik11bHRpUG9seWdvbiIsY29vcmRpbmF0ZXM6Y319fSxpYT1mdW5jdGlvbigpe3ZhciB0LGU9MCxuPSExO2Z1bmN0aW9uIHIoZSxuKXtyZXR1cm4gdC5saXN0LnB1c2goe3R5cGU6ZSxkYXRhOm4/SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShuKSk6dm9pZCAwfSksdH1yZXR1cm4gdD17bGlzdDpbXSxzZWdtZW50SWQ6ZnVuY3Rpb24oKXtyZXR1cm4gZSsrfSxjaGVja0ludGVyc2VjdGlvbjpmdW5jdGlvbih0LGUpe3JldHVybiByKCJjaGVjayIse3NlZzE6dCxzZWcyOmV9KX0sc2VnbWVudENob3A6ZnVuY3Rpb24odCxlKXtyZXR1cm4gcigiZGl2X3NlZyIse3NlZzp0LHB0OmV9KSxyKCJjaG9wIix7c2VnOnQscHQ6ZX0pfSxzdGF0dXNSZW1vdmU6ZnVuY3Rpb24odCl7cmV0dXJuIHIoInBvcF9zZWciLHtzZWc6dH0pfSxzZWdtZW50VXBkYXRlOmZ1bmN0aW9uKHQpe3JldHVybiByKCJzZWdfdXBkYXRlIix7c2VnOnR9KX0sc2VnbWVudE5ldzpmdW5jdGlvbih0LGUpe3JldHVybiByKCJuZXdfc2VnIix7c2VnOnQscHJpbWFyeTplfSl9LHNlZ21lbnRSZW1vdmU6ZnVuY3Rpb24odCl7cmV0dXJuIHIoInJlbV9zZWciLHtzZWc6dH0pfSx0ZW1wU3RhdHVzOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gcigidGVtcF9zdGF0dXMiLHtzZWc6dCxhYm92ZTplLGJlbG93Om59KX0scmV3aW5kOmZ1bmN0aW9uKHQpe3JldHVybiByKCJyZXdpbmQiLHtzZWc6dH0pfSxzdGF0dXM6ZnVuY3Rpb24odCxlLG4pe3JldHVybiByKCJzdGF0dXMiLHtzZWc6dCxhYm92ZTplLGJlbG93Om59KX0sdmVydDpmdW5jdGlvbihlKXtyZXR1cm4gZT09PW4/dDoobj1lLHIoInZlcnQiLHt4OmV9KSl9LGxvZzpmdW5jdGlvbih0KXtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIHQmJih0PUpTT04uc3RyaW5naWZ5KHQsITEsIiAgIikpLHIoImxvZyIse3R4dDp0fSl9LHJlc2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHIoInJlc2V0Iil9LHNlbGVjdGVkOmZ1bmN0aW9uKHQpe3JldHVybiByKCJzZWxlY3RlZCIse3NlZ3M6dH0pfSxjaGFpblN0YXJ0OmZ1bmN0aW9uKHQpe3JldHVybiByKCJjaGFpbl9zdGFydCIse3NlZzp0fSl9LGNoYWluUmVtb3ZlSGVhZDpmdW5jdGlvbih0LGUpe3JldHVybiByKCJjaGFpbl9yZW1faGVhZCIse2luZGV4OnQscHQ6ZX0pfSxjaGFpblJlbW92ZVRhaWw6ZnVuY3Rpb24odCxlKXtyZXR1cm4gcigiY2hhaW5fcmVtX3RhaWwiLHtpbmRleDp0LHB0OmV9KX0sY2hhaW5OZXc6ZnVuY3Rpb24odCxlKXtyZXR1cm4gcigiY2hhaW5fbmV3Iix7cHQxOnQscHQyOmV9KX0sY2hhaW5NYXRjaDpmdW5jdGlvbih0KXtyZXR1cm4gcigiY2hhaW5fbWF0Y2giLHtpbmRleDp0fSl9LGNoYWluQ2xvc2U6ZnVuY3Rpb24odCl7cmV0dXJuIHIoImNoYWluX2Nsb3NlIix7aW5kZXg6dH0pfSxjaGFpbkFkZEhlYWQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gcigiY2hhaW5fYWRkX2hlYWQiLHtpbmRleDp0LHB0OmV9KX0sY2hhaW5BZGRUYWlsOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHIoImNoYWluX2FkZF90YWlsIix7aW5kZXg6dCxwdDplfSl9LGNoYWluQ29ubmVjdDpmdW5jdGlvbih0LGUpe3JldHVybiByKCJjaGFpbl9jb24iLHtpbmRleDE6dCxpbmRleDI6ZX0pfSxjaGFpblJldmVyc2U6ZnVuY3Rpb24odCl7cmV0dXJuIHIoImNoYWluX3JldiIse2luZGV4OnR9KX0sY2hhaW5Kb2luOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHIoImNoYWluX2pvaW4iLHtpbmRleDE6dCxpbmRleDI6ZX0pfSxkb25lOmZ1bmN0aW9uKCl7cmV0dXJuIHIoImRvbmUiKX19fSxvYT1HbCxsYT1RbCxhYT1uYSxzYT1yYSx1YT0hMSxjYT1XbCgpO2Z1bmN0aW9uIGZhKHQsZSxuKXt2YXIgcj1lYS5zZWdtZW50cyh0KSxpPWVhLnNlZ21lbnRzKGUpLG89bihlYS5jb21iaW5lKHIsaSkpO3JldHVybiBlYS5wb2x5Z29uKG8pfWVhPXtidWlsZExvZzpmdW5jdGlvbih0KXtyZXR1cm4hMD09PXQ/dWE9aWEoKTohMT09PXQmJih1YT0hMSksITEhPT11YSYmdWEubGlzdH0sZXBzaWxvbjpmdW5jdGlvbih0KXtyZXR1cm4gY2EuZXBzaWxvbih0KX0sc2VnbWVudHM6ZnVuY3Rpb24odCl7dmFyIGU9b2EoITAsY2EsdWEpO3JldHVybiB0LnJlZ2lvbnMuZm9yRWFjaChlLmFkZFJlZ2lvbikse3NlZ21lbnRzOmUuY2FsY3VsYXRlKHQuaW52ZXJ0ZWQpLGludmVydGVkOnQuaW52ZXJ0ZWR9fSxjb21iaW5lOmZ1bmN0aW9uKHQsZSl7cmV0dXJue2NvbWJpbmVkOm9hKCExLGNhLHVhKS5jYWxjdWxhdGUodC5zZWdtZW50cyx0LmludmVydGVkLGUuc2VnbWVudHMsZS5pbnZlcnRlZCksaW52ZXJ0ZWQxOnQuaW52ZXJ0ZWQsaW52ZXJ0ZWQyOmUuaW52ZXJ0ZWR9fSxzZWxlY3RVbmlvbjpmdW5jdGlvbih0KXtyZXR1cm57c2VnbWVudHM6YWEudW5pb24odC5jb21iaW5lZCx1YSksaW52ZXJ0ZWQ6dC5pbnZlcnRlZDF8fHQuaW52ZXJ0ZWQyfX0sc2VsZWN0SW50ZXJzZWN0OmZ1bmN0aW9uKHQpe3JldHVybntzZWdtZW50czphYS5pbnRlcnNlY3QodC5jb21iaW5lZCx1YSksaW52ZXJ0ZWQ6dC5pbnZlcnRlZDEmJnQuaW52ZXJ0ZWQyfX0sc2VsZWN0RGlmZmVyZW5jZTpmdW5jdGlvbih0KXtyZXR1cm57c2VnbWVudHM6YWEuZGlmZmVyZW5jZSh0LmNvbWJpbmVkLHVhKSxpbnZlcnRlZDp0LmludmVydGVkMSYmIXQuaW52ZXJ0ZWQyfX0sc2VsZWN0RGlmZmVyZW5jZVJldjpmdW5jdGlvbih0KXtyZXR1cm57c2VnbWVudHM6YWEuZGlmZmVyZW5jZVJldih0LmNvbWJpbmVkLHVhKSxpbnZlcnRlZDohdC5pbnZlcnRlZDEmJnQuaW52ZXJ0ZWQyfX0sc2VsZWN0WG9yOmZ1bmN0aW9uKHQpe3JldHVybntzZWdtZW50czphYS54b3IodC5jb21iaW5lZCx1YSksaW52ZXJ0ZWQ6dC5pbnZlcnRlZDEhPT10LmludmVydGVkMn19LHBvbHlnb246ZnVuY3Rpb24odCl7cmV0dXJue3JlZ2lvbnM6bGEodC5zZWdtZW50cyxjYSx1YSksaW52ZXJ0ZWQ6dC5pbnZlcnRlZH19LHBvbHlnb25Gcm9tR2VvSlNPTjpmdW5jdGlvbih0KXtyZXR1cm4gc2EudG9Qb2x5Z29uKGVhLHQpfSxwb2x5Z29uVG9HZW9KU09OOmZ1bmN0aW9uKHQpe3JldHVybiBzYS5mcm9tUG9seWdvbihlYSxjYSx0KX0sdW5pb246ZnVuY3Rpb24odCxlKXtyZXR1cm4gZmEodCxlLGVhLnNlbGVjdFVuaW9uKX0saW50ZXJzZWN0OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGZhKHQsZSxlYS5zZWxlY3RJbnRlcnNlY3QpfSxkaWZmZXJlbmNlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGZhKHQsZSxlYS5zZWxlY3REaWZmZXJlbmNlKX0sZGlmZmVyZW5jZVJldjpmdW5jdGlvbih0LGUpe3JldHVybiBmYSh0LGUsZWEuc2VsZWN0RGlmZmVyZW5jZVJldil9LHhvcjpmdW5jdGlvbih0LGUpe3JldHVybiBmYSh0LGUsZWEuc2VsZWN0WG9yKX19LCJvYmplY3QiPT10eXBlb2Ygd2luZG93JiYod2luZG93LlBvbHlCb29sPWVhKTt2YXIgaGE9ZWE7Y29uc3QgZ2E9MTM0MjE3NzI5LHZhPTMzMzA2NjkwNzM4NzU0NzA2ZS0zMjtmdW5jdGlvbiBkYSh0LGUsbixyLGkpe2xldCBvLGwsYSxzLHU9ZVswXSxjPXJbMF0sZj0wLGg9MDtjPnU9PWM+LXU/KG89dSx1PWVbKytmXSk6KG89YyxjPXJbKytoXSk7bGV0IGc9MDtpZihmPHQmJmg8bilmb3IoYz51PT1jPi11PyhsPXUrbyxhPW8tKGwtdSksdT1lWysrZl0pOihsPWMrbyxhPW8tKGwtYyksYz1yWysraF0pLG89bCwwIT09YSYmKGlbZysrXT1hKTtmPHQmJmg8bjspYz51PT1jPi11PyhsPW8rdSxzPWwtbyxhPW8tKGwtcykrKHUtcyksdT1lWysrZl0pOihsPW8rYyxzPWwtbyxhPW8tKGwtcykrKGMtcyksYz1yWysraF0pLG89bCwwIT09YSYmKGlbZysrXT1hKTtmb3IoO2Y8dDspbD1vK3Uscz1sLW8sYT1vLShsLXMpKyh1LXMpLHU9ZVsrK2ZdLG89bCwwIT09YSYmKGlbZysrXT1hKTtmb3IoO2g8bjspbD1vK2Mscz1sLW8sYT1vLShsLXMpKyhjLXMpLGM9clsrK2hdLG89bCwwIT09YSYmKGlbZysrXT1hKTtyZXR1cm4gMD09PW8mJjAhPT1nfHwoaVtnKytdPW8pLGd9ZnVuY3Rpb24gcGEodCl7cmV0dXJuIG5ldyBGbG9hdDY0QXJyYXkodCl9Y29uc3QgeWE9MjIyMDQ0NjA0OTI1MDMxNDZlLTMyLG1hPTExMDkzMzU2NDc5NjcwNDg3ZS00NyxfYT1wYSg0KSxiYT1wYSg4KSx4YT1wYSgxMiksd2E9cGEoMTYpLGphPXBhKDQpO2Z1bmN0aW9uIFNhKHQsZSxuLHIsaSxvKXtjb25zdCBsPShlLW8pKihuLWkpLGE9KHQtaSkqKHItbykscz1sLWE7aWYoMD09PWx8fDA9PT1hfHxsPjAhPWE+MClyZXR1cm4gcztjb25zdCB1PU1hdGguYWJzKGwrYSk7cmV0dXJuIE1hdGguYWJzKHMpPj0zMzMwNjY5MDczODc1NDcxNmUtMzIqdT9zOi1mdW5jdGlvbih0LGUsbixyLGksbyxsKXtsZXQgYSxzLHUsYyxmLGgsZyx2LGQscCx5LG0sXyxiLHgsdyxqLFM7Y29uc3QgQT10LWksTz1uLWksTT1lLW8saz1yLW87Yj1BKmssaD1nYSpBLGc9aC0oaC1BKSx2PUEtZyxoPWdhKmssZD1oLShoLWspLHA9ay1kLHg9dipwLShiLWcqZC12KmQtZypwKSx3PU0qTyxoPWdhKk0sZz1oLShoLU0pLHY9TS1nLGg9Z2EqTyxkPWgtKGgtTykscD1PLWQsaj12KnAtKHctZypkLXYqZC1nKnApLHk9eC1qLGY9eC15LF9hWzBdPXgtKHkrZikrKGYtaiksbT1iK3ksZj1tLWIsXz1iLShtLWYpKyh5LWYpLHk9Xy13LGY9Xy15LF9hWzFdPV8tKHkrZikrKGYtdyksUz1tK3ksZj1TLW0sX2FbMl09bS0oUy1mKSsoeS1mKSxfYVszXT1TO2xldCBQPWZ1bmN0aW9uKHQsZSl7bGV0IG49ZVswXTtmb3IobGV0IHI9MTtyPHQ7cisrKW4rPWVbcl07cmV0dXJuIG59KDQsX2EpLEY9eWEqbDtpZihQPj1GfHwtUD49RilyZXR1cm4gUDtpZihmPXQtQSxhPXQtKEErZikrKGYtaSksZj1uLU8sdT1uLShPK2YpKyhmLWkpLGY9ZS1NLHM9ZS0oTStmKSsoZi1vKSxmPXItayxjPXItKGsrZikrKGYtbyksMD09PWEmJjA9PT1zJiYwPT09dSYmMD09PWMpcmV0dXJuIFA7aWYoRj1tYSpsK3ZhKk1hdGguYWJzKFApLFArPUEqYytrKmEtKE0qdStPKnMpLFA+PUZ8fC1QPj1GKXJldHVybiBQO2I9YSprLGg9Z2EqYSxnPWgtKGgtYSksdj1hLWcsaD1nYSprLGQ9aC0oaC1rKSxwPWstZCx4PXYqcC0oYi1nKmQtdipkLWcqcCksdz1zKk8saD1nYSpzLGc9aC0oaC1zKSx2PXMtZyxoPWdhKk8sZD1oLShoLU8pLHA9Ty1kLGo9dipwLSh3LWcqZC12KmQtZypwKSx5PXgtaixmPXgteSxqYVswXT14LSh5K2YpKyhmLWopLG09Yit5LGY9bS1iLF89Yi0obS1mKSsoeS1mKSx5PV8tdyxmPV8teSxqYVsxXT1fLSh5K2YpKyhmLXcpLFM9bSt5LGY9Uy1tLGphWzJdPW0tKFMtZikrKHktZiksamFbM109Uztjb25zdCBUPWRhKDQsX2EsNCxqYSxiYSk7Yj1BKmMsaD1nYSpBLGc9aC0oaC1BKSx2PUEtZyxoPWdhKmMsZD1oLShoLWMpLHA9Yy1kLHg9dipwLShiLWcqZC12KmQtZypwKSx3PU0qdSxoPWdhKk0sZz1oLShoLU0pLHY9TS1nLGg9Z2EqdSxkPWgtKGgtdSkscD11LWQsaj12KnAtKHctZypkLXYqZC1nKnApLHk9eC1qLGY9eC15LGphWzBdPXgtKHkrZikrKGYtaiksbT1iK3ksZj1tLWIsXz1iLShtLWYpKyh5LWYpLHk9Xy13LGY9Xy15LGphWzFdPV8tKHkrZikrKGYtdyksUz1tK3ksZj1TLW0samFbMl09bS0oUy1mKSsoeS1mKSxqYVszXT1TO2NvbnN0IHo9ZGEoVCxiYSw0LGphLHhhKTtiPWEqYyxoPWdhKmEsZz1oLShoLWEpLHY9YS1nLGg9Z2EqYyxkPWgtKGgtYykscD1jLWQseD12KnAtKGItZypkLXYqZC1nKnApLHc9cyp1LGg9Z2EqcyxnPWgtKGgtcyksdj1zLWcsaD1nYSp1LGQ9aC0oaC11KSxwPXUtZCxqPXYqcC0ody1nKmQtdipkLWcqcCkseT14LWosZj14LXksamFbMF09eC0oeStmKSsoZi1qKSxtPWIreSxmPW0tYixfPWItKG0tZikrKHktZikseT1fLXcsZj1fLXksamFbMV09Xy0oeStmKSsoZi13KSxTPW0reSxmPVMtbSxqYVsyXT1tLShTLWYpKyh5LWYpLGphWzNdPVM7Y29uc3QgST1kYSh6LHhhLDQsamEsd2EpO3JldHVybiB3YVtJLTFdfSh0LGUsbixyLGksbyx1KX1jb25zdCBBYT1NYXRoLnBvdygyLC01MiksT2E9bmV3IFVpbnQzMkFycmF5KDUxMik7Y2xhc3MgTWF7c3RhdGljIGZyb20odCxlPUlhLG49JGEpe2NvbnN0IHI9dC5sZW5ndGgsaT1uZXcgRmxvYXQ2NEFycmF5KDIqcik7Zm9yKGxldCBvPTA7bzxyO28rKyl7Y29uc3Qgcj10W29dO2lbMipvXT1lKHIpLGlbMipvKzFdPW4ocil9cmV0dXJuIG5ldyBNYShpKX1jb25zdHJ1Y3Rvcih0KXtjb25zdCBlPXQubGVuZ3RoPj4xO2lmKGU+MCYmIm51bWJlciIhPXR5cGVvZiB0WzBdKXRocm93IG5ldyBFcnJvcigiRXhwZWN0ZWQgY29vcmRzIHRvIGNvbnRhaW4gbnVtYmVycy4iKTt0aGlzLmNvb3Jkcz10O2NvbnN0IG49TWF0aC5tYXgoMiplLTUsMCk7dGhpcy5fdHJpYW5nbGVzPW5ldyBVaW50MzJBcnJheSgzKm4pLHRoaXMuX2hhbGZlZGdlcz1uZXcgSW50MzJBcnJheSgzKm4pLHRoaXMuX2hhc2hTaXplPU1hdGguY2VpbChNYXRoLnNxcnQoZSkpLHRoaXMuX2h1bGxQcmV2PW5ldyBVaW50MzJBcnJheShlKSx0aGlzLl9odWxsTmV4dD1uZXcgVWludDMyQXJyYXkoZSksdGhpcy5faHVsbFRyaT1uZXcgVWludDMyQXJyYXkoZSksdGhpcy5faHVsbEhhc2g9bmV3IEludDMyQXJyYXkodGhpcy5faGFzaFNpemUpLmZpbGwoLTEpLHRoaXMuX2lkcz1uZXcgVWludDMyQXJyYXkoZSksdGhpcy5fZGlzdHM9bmV3IEZsb2F0NjRBcnJheShlKSx0aGlzLnVwZGF0ZSgpfXVwZGF0ZSgpe2NvbnN0e2Nvb3Jkczp0LF9odWxsUHJldjplLF9odWxsTmV4dDpuLF9odWxsVHJpOnIsX2h1bGxIYXNoOml9PXRoaXMsbz10Lmxlbmd0aD4+MTtsZXQgbD0xLzAsYT0xLzAscz0tMS8wLHU9LTEvMDtmb3IobGV0IGU9MDtlPG87ZSsrKXtjb25zdCBuPXRbMiplXSxyPXRbMiplKzFdO248bCYmKGw9bikscjxhJiYoYT1yKSxuPnMmJihzPW4pLHI+dSYmKHU9ciksdGhpcy5faWRzW2VdPWV9Y29uc3QgYz0obCtzKS8yLGY9KGErdSkvMjtsZXQgaCxnLHYsZD0xLzA7Zm9yKGxldCBlPTA7ZTxvO2UrKyl7Y29uc3Qgbj1rYShjLGYsdFsyKmVdLHRbMiplKzFdKTtuPGQmJihoPWUsZD1uKX1jb25zdCBwPXRbMipoXSx5PXRbMipoKzFdO2Q9MS8wO2ZvcihsZXQgZT0wO2U8bztlKyspe2lmKGU9PT1oKWNvbnRpbnVlO2NvbnN0IG49a2EocCx5LHRbMiplXSx0WzIqZSsxXSk7bjxkJiZuPjAmJihnPWUsZD1uKX1sZXQgbT10WzIqZ10sXz10WzIqZysxXSxiPTEvMDtmb3IobGV0IGU9MDtlPG87ZSsrKXtpZihlPT09aHx8ZT09PWcpY29udGludWU7Y29uc3Qgbj1GYShwLHksbSxfLHRbMiplXSx0WzIqZSsxXSk7bjxiJiYodj1lLGI9bil9bGV0IHg9dFsyKnZdLHc9dFsyKnYrMV07aWYoYj09PTEvMCl7Zm9yKGxldCBlPTA7ZTxvO2UrKyl0aGlzLl9kaXN0c1tlXT10WzIqZV0tdFswXXx8dFsyKmUrMV0tdFsxXTtUYSh0aGlzLl9pZHMsdGhpcy5fZGlzdHMsMCxvLTEpO2NvbnN0IGU9bmV3IFVpbnQzMkFycmF5KG8pO2xldCBuPTA7Zm9yKGxldCB0PTAscj0tMS8wO3Q8bzt0Kyspe2NvbnN0IGk9dGhpcy5faWRzW3RdO3RoaXMuX2Rpc3RzW2ldPnImJihlW24rK109aSxyPXRoaXMuX2Rpc3RzW2ldKX1yZXR1cm4gdGhpcy5odWxsPWUuc3ViYXJyYXkoMCxuKSx0aGlzLnRyaWFuZ2xlcz1uZXcgVWludDMyQXJyYXkoMCksdm9pZCh0aGlzLmhhbGZlZGdlcz1uZXcgVWludDMyQXJyYXkoMCkpfWlmKFNhKHAseSxtLF8seCx3KTwwKXtjb25zdCB0PWcsZT1tLG49XztnPXYsbT14LF89dyx2PXQseD1lLHc9bn1jb25zdCBqPWZ1bmN0aW9uKHQsZSxuLHIsaSxvKXtjb25zdCBsPW4tdCxhPXItZSxzPWktdCx1PW8tZSxjPWwqbCthKmEsZj1zKnMrdSp1LGg9LjUvKGwqdS1hKnMpO3JldHVybnt4OnQrKHUqYy1hKmYpKmgseTplKyhsKmYtcypjKSpofX0ocCx5LG0sXyx4LHcpO3RoaXMuX2N4PWoueCx0aGlzLl9jeT1qLnk7Zm9yKGxldCBlPTA7ZTxvO2UrKyl0aGlzLl9kaXN0c1tlXT1rYSh0WzIqZV0sdFsyKmUrMV0sai54LGoueSk7VGEodGhpcy5faWRzLHRoaXMuX2Rpc3RzLDAsby0xKSx0aGlzLl9odWxsU3RhcnQ9aDtsZXQgUz0zO25baF09ZVt2XT1nLG5bZ109ZVtoXT12LG5bdl09ZVtnXT1oLHJbaF09MCxyW2ddPTEsclt2XT0yLGkuZmlsbCgtMSksaVt0aGlzLl9oYXNoS2V5KHAseSldPWgsaVt0aGlzLl9oYXNoS2V5KG0sXyldPWcsaVt0aGlzLl9oYXNoS2V5KHgsdyldPXYsdGhpcy50cmlhbmdsZXNMZW49MCx0aGlzLl9hZGRUcmlhbmdsZShoLGcsdiwtMSwtMSwtMSk7Zm9yKGxldCBvLGwsYT0wO2E8dGhpcy5faWRzLmxlbmd0aDthKyspe2NvbnN0IHM9dGhpcy5faWRzW2FdLHU9dFsyKnNdLGM9dFsyKnMrMV07aWYoYT4wJiZNYXRoLmFicyh1LW8pPD1BYSYmTWF0aC5hYnMoYy1sKTw9QWEpY29udGludWU7aWYobz11LGw9YyxzPT09aHx8cz09PWd8fHM9PT12KWNvbnRpbnVlO2xldCBmPTA7Zm9yKGxldCB0PTAsZT10aGlzLl9oYXNoS2V5KHUsYyk7dDx0aGlzLl9oYXNoU2l6ZSYmKGY9aVsoZSt0KSV0aGlzLl9oYXNoU2l6ZV0sLTE9PT1mfHxmPT09bltmXSk7dCsrKTtmPWVbZl07bGV0IGQscD1mO2Zvcig7ZD1uW3BdLFNhKHUsYyx0WzIqcF0sdFsyKnArMV0sdFsyKmRdLHRbMipkKzFdKT49MDspaWYocD1kLHA9PT1mKXtwPS0xO2JyZWFrfWlmKC0xPT09cCljb250aW51ZTtsZXQgeT10aGlzLl9hZGRUcmlhbmdsZShwLHMsbltwXSwtMSwtMSxyW3BdKTtyW3NdPXRoaXMuX2xlZ2FsaXplKHkrMikscltwXT15LFMrKztsZXQgbT1uW3BdO2Zvcig7ZD1uW21dLFNhKHUsYyx0WzIqbV0sdFsyKm0rMV0sdFsyKmRdLHRbMipkKzFdKTwwOyl5PXRoaXMuX2FkZFRyaWFuZ2xlKG0scyxkLHJbc10sLTEsclttXSkscltzXT10aGlzLl9sZWdhbGl6ZSh5KzIpLG5bbV09bSxTLS0sbT1kO2lmKHA9PT1mKWZvcig7ZD1lW3BdLFNhKHUsYyx0WzIqZF0sdFsyKmQrMV0sdFsyKnBdLHRbMipwKzFdKTwwOyl5PXRoaXMuX2FkZFRyaWFuZ2xlKGQscyxwLC0xLHJbcF0scltkXSksdGhpcy5fbGVnYWxpemUoeSsyKSxyW2RdPXksbltwXT1wLFMtLSxwPWQ7dGhpcy5faHVsbFN0YXJ0PWVbc109cCxuW3BdPWVbbV09cyxuW3NdPW0saVt0aGlzLl9oYXNoS2V5KHUsYyldPXMsaVt0aGlzLl9oYXNoS2V5KHRbMipwXSx0WzIqcCsxXSldPXB9dGhpcy5odWxsPW5ldyBVaW50MzJBcnJheShTKTtmb3IobGV0IHQ9MCxlPXRoaXMuX2h1bGxTdGFydDt0PFM7dCsrKXRoaXMuaHVsbFt0XT1lLGU9bltlXTt0aGlzLnRyaWFuZ2xlcz10aGlzLl90cmlhbmdsZXMuc3ViYXJyYXkoMCx0aGlzLnRyaWFuZ2xlc0xlbiksdGhpcy5oYWxmZWRnZXM9dGhpcy5faGFsZmVkZ2VzLnN1YmFycmF5KDAsdGhpcy50cmlhbmdsZXNMZW4pfV9oYXNoS2V5KHQsZSl7cmV0dXJuIE1hdGguZmxvb3IoZnVuY3Rpb24odCxlKXtjb25zdCBuPXQvKE1hdGguYWJzKHQpK01hdGguYWJzKGUpKTtyZXR1cm4oZT4wPzMtbjoxK24pLzR9KHQtdGhpcy5fY3gsZS10aGlzLl9jeSkqdGhpcy5faGFzaFNpemUpJXRoaXMuX2hhc2hTaXplfV9sZWdhbGl6ZSh0KXtjb25zdHtfdHJpYW5nbGVzOmUsX2hhbGZlZGdlczpuLGNvb3JkczpyfT10aGlzO2xldCBpPTAsbz0wO2Zvcig7Oyl7Y29uc3QgbD1uW3RdLGE9dC10JTM7aWYobz1hKyh0KzIpJTMsLTE9PT1sKXtpZigwPT09aSlicmVhazt0PU9hWy0taV07Y29udGludWV9Y29uc3Qgcz1sLWwlMyx1PWErKHQrMSklMyxjPXMrKGwrMiklMyxmPWVbb10saD1lW3RdLGc9ZVt1XSx2PWVbY107aWYoUGEoclsyKmZdLHJbMipmKzFdLHJbMipoXSxyWzIqaCsxXSxyWzIqZ10sclsyKmcrMV0sclsyKnZdLHJbMip2KzFdKSl7ZVt0XT12LGVbbF09Zjtjb25zdCByPW5bY107aWYoLTE9PT1yKXtsZXQgZT10aGlzLl9odWxsU3RhcnQ7ZG97aWYodGhpcy5faHVsbFRyaVtlXT09PWMpe3RoaXMuX2h1bGxUcmlbZV09dDticmVha31lPXRoaXMuX2h1bGxQcmV2W2VdfXdoaWxlKGUhPT10aGlzLl9odWxsU3RhcnQpfXRoaXMuX2xpbmsodCxyKSx0aGlzLl9saW5rKGwsbltvXSksdGhpcy5fbGluayhvLGMpO2NvbnN0IGE9cysobCsxKSUzO2k8T2EubGVuZ3RoJiYoT2FbaSsrXT1hKX1lbHNle2lmKDA9PT1pKWJyZWFrO3Q9T2FbLS1pXX19cmV0dXJuIG99X2xpbmsodCxlKXt0aGlzLl9oYWxmZWRnZXNbdF09ZSwtMSE9PWUmJih0aGlzLl9oYWxmZWRnZXNbZV09dCl9X2FkZFRyaWFuZ2xlKHQsZSxuLHIsaSxvKXtjb25zdCBsPXRoaXMudHJpYW5nbGVzTGVuO3JldHVybiB0aGlzLl90cmlhbmdsZXNbbF09dCx0aGlzLl90cmlhbmdsZXNbbCsxXT1lLHRoaXMuX3RyaWFuZ2xlc1tsKzJdPW4sdGhpcy5fbGluayhsLHIpLHRoaXMuX2xpbmsobCsxLGkpLHRoaXMuX2xpbmsobCsyLG8pLHRoaXMudHJpYW5nbGVzTGVuKz0zLGx9fWZ1bmN0aW9uIGthKHQsZSxuLHIpe2NvbnN0IGk9dC1uLG89ZS1yO3JldHVybiBpKmkrbypvfWZ1bmN0aW9uIFBhKHQsZSxuLHIsaSxvLGwsYSl7Y29uc3Qgcz10LWwsdT1lLWEsYz1uLWwsZj1yLWEsaD1pLWwsZz1vLWEsdj1jKmMrZipmLGQ9aCpoK2cqZztyZXR1cm4gcyooZipkLXYqZyktdSooYypkLXYqaCkrKHMqcyt1KnUpKihjKmctZipoKTwwfWZ1bmN0aW9uIEZhKHQsZSxuLHIsaSxvKXtjb25zdCBsPW4tdCxhPXItZSxzPWktdCx1PW8tZSxjPWwqbCthKmEsZj1zKnMrdSp1LGg9LjUvKGwqdS1hKnMpLGc9KHUqYy1hKmYpKmgsdj0obCpmLXMqYykqaDtyZXR1cm4gZypnK3Yqdn1mdW5jdGlvbiBUYSh0LGUsbixyKXtpZihyLW48PTIwKWZvcihsZXQgaT1uKzE7aTw9cjtpKyspe2NvbnN0IHI9dFtpXSxvPWVbcl07bGV0IGw9aS0xO2Zvcig7bD49biYmZVt0W2xdXT5vOyl0W2wrMV09dFtsLS1dO3RbbCsxXT1yfWVsc2V7bGV0IGk9bisxLG89cjt6YSh0LG4rcj4+MSxpKSxlW3Rbbl1dPmVbdFtyXV0mJnphKHQsbixyKSxlW3RbaV1dPmVbdFtyXV0mJnphKHQsaSxyKSxlW3Rbbl1dPmVbdFtpXV0mJnphKHQsbixpKTtjb25zdCBsPXRbaV0sYT1lW2xdO2Zvcig7Oyl7ZG97aSsrfXdoaWxlKGVbdFtpXV08YSk7ZG97by0tfXdoaWxlKGVbdFtvXV0+YSk7aWYobzxpKWJyZWFrO3phKHQsaSxvKX10W24rMV09dFtvXSx0W29dPWwsci1pKzE+PW8tbj8oVGEodCxlLGksciksVGEodCxlLG4sby0xKSk6KFRhKHQsZSxuLG8tMSksVGEodCxlLGkscikpfX1mdW5jdGlvbiB6YSh0LGUsbil7Y29uc3Qgcj10W2VdO3RbZV09dFtuXSx0W25dPXJ9ZnVuY3Rpb24gSWEodCl7cmV0dXJuIHRbMF19ZnVuY3Rpb24gJGEodCl7cmV0dXJuIHRbMV19Y29uc3QgRWE9MWUtNjtjbGFzcyBOYXtjb25zdHJ1Y3Rvcigpe3RoaXMuX3gwPXRoaXMuX3kwPXRoaXMuX3gxPXRoaXMuX3kxPW51bGwsdGhpcy5fPSIifW1vdmVUbyh0LGUpe3RoaXMuXys9YE0ke3RoaXMuX3gwPXRoaXMuX3gxPSt0fSwke3RoaXMuX3kwPXRoaXMuX3kxPStlfWB9Y2xvc2VQYXRoKCl7bnVsbCE9PXRoaXMuX3gxJiYodGhpcy5feDE9dGhpcy5feDAsdGhpcy5feTE9dGhpcy5feTAsdGhpcy5fKz0iWiIpfWxpbmVUbyh0LGUpe3RoaXMuXys9YEwke3RoaXMuX3gxPSt0fSwke3RoaXMuX3kxPStlfWB9YXJjKHQsZSxuKXtjb25zdCByPSh0PSt0KSsobj0rbiksaT1lPStlO2lmKG48MCl0aHJvdyBuZXcgRXJyb3IoIm5lZ2F0aXZlIHJhZGl1cyIpO251bGw9PT10aGlzLl94MT90aGlzLl8rPWBNJHtyfSwke2l9YDooTWF0aC5hYnModGhpcy5feDEtcik+RWF8fE1hdGguYWJzKHRoaXMuX3kxLWkpPkVhKSYmKHRoaXMuXys9IkwiK3IrIiwiK2kpLG4mJih0aGlzLl8rPWBBJHtufSwke259LDAsMSwxLCR7dC1ufSwke2V9QSR7bn0sJHtufSwwLDEsMSwke3RoaXMuX3gxPXJ9LCR7dGhpcy5feTE9aX1gKX1yZWN0KHQsZSxuLHIpe3RoaXMuXys9YE0ke3RoaXMuX3gwPXRoaXMuX3gxPSt0fSwke3RoaXMuX3kwPXRoaXMuX3kxPStlfWgkeytufXYkeytyfWgkey1ufVpgfXZhbHVlKCl7cmV0dXJuIHRoaXMuX3x8bnVsbH19Y2xhc3MgUmF7Y29uc3RydWN0b3IoKXt0aGlzLl89W119bW92ZVRvKHQsZSl7dGhpcy5fLnB1c2goW3QsZV0pfWNsb3NlUGF0aCgpe3RoaXMuXy5wdXNoKHRoaXMuX1swXS5zbGljZSgpKX1saW5lVG8odCxlKXt0aGlzLl8ucHVzaChbdCxlXSl9dmFsdWUoKXtyZXR1cm4gdGhpcy5fLmxlbmd0aD90aGlzLl86bnVsbH19Y2xhc3MgQ2F7Y29uc3RydWN0b3IodCxbZSxuLHIsaV09WzAsMCw5NjAsNTAwXSl7aWYoISgocj0rcik+PShlPStlKSYmKGk9K2kpPj0obj0rbikpKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBib3VuZHMiKTt0aGlzLmRlbGF1bmF5PXQsdGhpcy5fY2lyY3VtY2VudGVycz1uZXcgRmxvYXQ2NEFycmF5KDIqdC5wb2ludHMubGVuZ3RoKSx0aGlzLnZlY3RvcnM9bmV3IEZsb2F0NjRBcnJheSgyKnQucG9pbnRzLmxlbmd0aCksdGhpcy54bWF4PXIsdGhpcy54bWluPWUsdGhpcy55bWF4PWksdGhpcy55bWluPW4sdGhpcy5faW5pdCgpfXVwZGF0ZSgpe3JldHVybiB0aGlzLmRlbGF1bmF5LnVwZGF0ZSgpLHRoaXMuX2luaXQoKSx0aGlzfV9pbml0KCl7Y29uc3R7ZGVsYXVuYXk6e3BvaW50czp0LGh1bGw6ZSx0cmlhbmdsZXM6bn0sdmVjdG9yczpyfT10aGlzLGk9dGhpcy5jaXJjdW1jZW50ZXJzPXRoaXMuX2NpcmN1bWNlbnRlcnMuc3ViYXJyYXkoMCxuLmxlbmd0aC8zKjIpO2ZvcihsZXQgZSxyLG89MCxsPTAsYT1uLmxlbmd0aDtvPGE7bys9MyxsKz0yKXtjb25zdCBhPTIqbltvXSxzPTIqbltvKzFdLHU9MipuW28rMl0sYz10W2FdLGY9dFthKzFdLGg9dFtzXSxnPXRbcysxXSx2PXRbdV0sZD10W3UrMV0scD1oLWMseT1nLWYsbT12LWMsXz1kLWYsYj0yKihwKl8teSptKTtpZihNYXRoLmFicyhiKTwxZS05KXtsZXQgaT0xZTk7Y29uc3Qgbz0yKm5bMF07aSo9TWF0aC5zaWduKCh0W29dLWMpKl8tKHRbbysxXS1mKSptKSxlPShjK3YpLzItaSpfLHI9KGYrZCkvMitpKm19ZWxzZXtjb25zdCB0PTEvYixuPXAqcCt5KnksaT1tKm0rXypfO2U9YysoXypuLXkqaSkqdCxyPWYrKHAqaS1tKm4pKnR9aVtsXT1lLGlbbCsxXT1yfWxldCBvLGwsYSxzPWVbZS5sZW5ndGgtMV0sdT00KnMsYz10WzIqc10sZj10WzIqcysxXTtyLmZpbGwoMCk7Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDsrK24pcz1lW25dLG89dSxsPWMsYT1mLHU9NCpzLGM9dFsyKnNdLGY9dFsyKnMrMV0scltvKzJdPXJbdV09YS1mLHJbbyszXT1yW3UrMV09Yy1sfXJlbmRlcih0KXtjb25zdCBlPW51bGw9PXQ/dD1uZXcgTmE6dm9pZCAwLHtkZWxhdW5heTp7aGFsZmVkZ2VzOm4saW5lZGdlczpyLGh1bGw6aX0sY2lyY3VtY2VudGVyczpvLHZlY3RvcnM6bH09dGhpcztpZihpLmxlbmd0aDw9MSlyZXR1cm4gbnVsbDtmb3IobGV0IGU9MCxyPW4ubGVuZ3RoO2U8cjsrK2Upe2NvbnN0IHI9bltlXTtpZihyPGUpY29udGludWU7Y29uc3QgaT0yKk1hdGguZmxvb3IoZS8zKSxsPTIqTWF0aC5mbG9vcihyLzMpLGE9b1tpXSxzPW9baSsxXSx1PW9bbF0sYz1vW2wrMV07dGhpcy5fcmVuZGVyU2VnbWVudChhLHMsdSxjLHQpfWxldCBhLHM9aVtpLmxlbmd0aC0xXTtmb3IobGV0IGU9MDtlPGkubGVuZ3RoOysrZSl7YT1zLHM9aVtlXTtjb25zdCBuPTIqTWF0aC5mbG9vcihyW3NdLzMpLHU9b1tuXSxjPW9bbisxXSxmPTQqYSxoPXRoaXMuX3Byb2plY3QodSxjLGxbZisyXSxsW2YrM10pO2gmJnRoaXMuX3JlbmRlclNlZ21lbnQodSxjLGhbMF0saFsxXSx0KX1yZXR1cm4gZSYmZS52YWx1ZSgpfXJlbmRlckJvdW5kcyh0KXtjb25zdCBlPW51bGw9PXQ/dD1uZXcgTmE6dm9pZCAwO3JldHVybiB0LnJlY3QodGhpcy54bWluLHRoaXMueW1pbix0aGlzLnhtYXgtdGhpcy54bWluLHRoaXMueW1heC10aGlzLnltaW4pLGUmJmUudmFsdWUoKX1yZW5kZXJDZWxsKHQsZSl7Y29uc3Qgbj1udWxsPT1lP2U9bmV3IE5hOnZvaWQgMCxyPXRoaXMuX2NsaXAodCk7aWYobnVsbD09PXJ8fCFyLmxlbmd0aClyZXR1cm47ZS5tb3ZlVG8oclswXSxyWzFdKTtsZXQgaT1yLmxlbmd0aDtmb3IoO3JbMF09PT1yW2ktMl0mJnJbMV09PT1yW2ktMV0mJmk+MTspaS09Mjtmb3IobGV0IHQ9Mjt0PGk7dCs9MilyW3RdPT09clt0LTJdJiZyW3QrMV09PT1yW3QtMV18fGUubGluZVRvKHJbdF0sclt0KzFdKTtyZXR1cm4gZS5jbG9zZVBhdGgoKSxuJiZuLnZhbHVlKCl9KmNlbGxQb2x5Z29ucygpe2NvbnN0e2RlbGF1bmF5Ontwb2ludHM6dH19PXRoaXM7Zm9yKGxldCBlPTAsbj10Lmxlbmd0aC8yO2U8bjsrK2Upe2NvbnN0IHQ9dGhpcy5jZWxsUG9seWdvbihlKTt0JiYodC5pbmRleD1lLHlpZWxkIHQpfX1jZWxsUG9seWdvbih0KXtjb25zdCBlPW5ldyBSYTtyZXR1cm4gdGhpcy5yZW5kZXJDZWxsKHQsZSksZS52YWx1ZSgpfV9yZW5kZXJTZWdtZW50KHQsZSxuLHIsaSl7bGV0IG87Y29uc3QgbD10aGlzLl9yZWdpb25jb2RlKHQsZSksYT10aGlzLl9yZWdpb25jb2RlKG4scik7MD09PWwmJjA9PT1hPyhpLm1vdmVUbyh0LGUpLGkubGluZVRvKG4scikpOihvPXRoaXMuX2NsaXBTZWdtZW50KHQsZSxuLHIsbCxhKSkmJihpLm1vdmVUbyhvWzBdLG9bMV0pLGkubGluZVRvKG9bMl0sb1szXSkpfWNvbnRhaW5zKHQsZSxuKXtyZXR1cm4oZT0rZSk9PWUmJihuPStuKT09biYmdGhpcy5kZWxhdW5heS5fc3RlcCh0LGUsbik9PT10fSpuZWlnaGJvcnModCl7Y29uc3QgZT10aGlzLl9jbGlwKHQpO2lmKGUpZm9yKGNvbnN0IG4gb2YgdGhpcy5kZWxhdW5heS5uZWlnaGJvcnModCkpe2NvbnN0IHQ9dGhpcy5fY2xpcChuKTtpZih0KXQ6Zm9yKGxldCByPTAsaT1lLmxlbmd0aDtyPGk7cis9Milmb3IobGV0IG89MCxsPXQubGVuZ3RoO288bDtvKz0yKWlmKGVbcl09PT10W29dJiZlW3IrMV09PT10W28rMV0mJmVbKHIrMiklaV09PT10WyhvK2wtMiklbF0mJmVbKHIrMyklaV09PT10WyhvK2wtMSklbF0pe3lpZWxkIG47YnJlYWsgdH19fV9jZWxsKHQpe2NvbnN0e2NpcmN1bWNlbnRlcnM6ZSxkZWxhdW5heTp7aW5lZGdlczpuLGhhbGZlZGdlczpyLHRyaWFuZ2xlczppfX09dGhpcyxvPW5bdF07aWYoLTE9PT1vKXJldHVybiBudWxsO2NvbnN0IGw9W107bGV0IGE9bztkb3tjb25zdCBuPU1hdGguZmxvb3IoYS8zKTtpZihsLnB1c2goZVsyKm5dLGVbMipuKzFdKSxhPWElMz09Mj9hLTI6YSsxLGlbYV0hPT10KWJyZWFrO2E9clthXX13aGlsZShhIT09byYmLTEhPT1hKTtyZXR1cm4gbH1fY2xpcCh0KXtpZigwPT09dCYmMT09PXRoaXMuZGVsYXVuYXkuaHVsbC5sZW5ndGgpcmV0dXJuW3RoaXMueG1heCx0aGlzLnltaW4sdGhpcy54bWF4LHRoaXMueW1heCx0aGlzLnhtaW4sdGhpcy55bWF4LHRoaXMueG1pbix0aGlzLnltaW5dO2NvbnN0IGU9dGhpcy5fY2VsbCh0KTtpZihudWxsPT09ZSlyZXR1cm4gbnVsbDtjb25zdHt2ZWN0b3JzOm59PXRoaXMscj00KnQ7cmV0dXJuIHRoaXMuX3NpbXBsaWZ5KG5bcl18fG5bcisxXT90aGlzLl9jbGlwSW5maW5pdGUodCxlLG5bcl0sbltyKzFdLG5bcisyXSxuW3IrM10pOnRoaXMuX2NsaXBGaW5pdGUodCxlKSl9X2NsaXBGaW5pdGUodCxlKXtjb25zdCBuPWUubGVuZ3RoO2xldCByLGksbyxsLGE9bnVsbCxzPWVbbi0yXSx1PWVbbi0xXSxjPXRoaXMuX3JlZ2lvbmNvZGUocyx1KSxmPTA7Zm9yKGxldCBoPTA7aDxuO2grPTIpaWYocj1zLGk9dSxzPWVbaF0sdT1lW2grMV0sbz1jLGM9dGhpcy5fcmVnaW9uY29kZShzLHUpLDA9PT1vJiYwPT09YylsPWYsZj0wLGE/YS5wdXNoKHMsdSk6YT1bcyx1XTtlbHNle2xldCBlLG4saCxnLHY7aWYoMD09PW8pe2lmKG51bGw9PT0oZT10aGlzLl9jbGlwU2VnbWVudChyLGkscyx1LG8sYykpKWNvbnRpbnVlO1tuLGgsZyx2XT1lfWVsc2V7aWYobnVsbD09PShlPXRoaXMuX2NsaXBTZWdtZW50KHMsdSxyLGksYyxvKSkpY29udGludWU7W2csdixuLGhdPWUsbD1mLGY9dGhpcy5fZWRnZWNvZGUobixoKSxsJiZmJiZ0aGlzLl9lZGdlKHQsbCxmLGEsYS5sZW5ndGgpLGE/YS5wdXNoKG4saCk6YT1bbixoXX1sPWYsZj10aGlzLl9lZGdlY29kZShnLHYpLGwmJmYmJnRoaXMuX2VkZ2UodCxsLGYsYSxhLmxlbmd0aCksYT9hLnB1c2goZyx2KTphPVtnLHZdfWlmKGEpbD1mLGY9dGhpcy5fZWRnZWNvZGUoYVswXSxhWzFdKSxsJiZmJiZ0aGlzLl9lZGdlKHQsbCxmLGEsYS5sZW5ndGgpO2Vsc2UgaWYodGhpcy5jb250YWlucyh0LCh0aGlzLnhtaW4rdGhpcy54bWF4KS8yLCh0aGlzLnltaW4rdGhpcy55bWF4KS8yKSlyZXR1cm5bdGhpcy54bWF4LHRoaXMueW1pbix0aGlzLnhtYXgsdGhpcy55bWF4LHRoaXMueG1pbix0aGlzLnltYXgsdGhpcy54bWluLHRoaXMueW1pbl07cmV0dXJuIGF9X2NsaXBTZWdtZW50KHQsZSxuLHIsaSxvKXtjb25zdCBsPWk8bztmb3IobCYmKFt0LGUsbixyLGksb109W24scix0LGUsbyxpXSk7Oyl7aWYoMD09PWkmJjA9PT1vKXJldHVybiBsP1tuLHIsdCxlXTpbdCxlLG4scl07aWYoaSZvKXJldHVybiBudWxsO2xldCBhLHMsdT1pfHxvOzgmdT8oYT10KyhuLXQpKih0aGlzLnltYXgtZSkvKHItZSkscz10aGlzLnltYXgpOjQmdT8oYT10KyhuLXQpKih0aGlzLnltaW4tZSkvKHItZSkscz10aGlzLnltaW4pOjImdT8ocz1lKyhyLWUpKih0aGlzLnhtYXgtdCkvKG4tdCksYT10aGlzLnhtYXgpOihzPWUrKHItZSkqKHRoaXMueG1pbi10KS8obi10KSxhPXRoaXMueG1pbiksaT8odD1hLGU9cyxpPXRoaXMuX3JlZ2lvbmNvZGUodCxlKSk6KG49YSxyPXMsbz10aGlzLl9yZWdpb25jb2RlKG4scikpfX1fY2xpcEluZmluaXRlKHQsZSxuLHIsaSxvKXtsZXQgbCxhPUFycmF5LmZyb20oZSk7aWYoKGw9dGhpcy5fcHJvamVjdChhWzBdLGFbMV0sbixyKSkmJmEudW5zaGlmdChsWzBdLGxbMV0pLChsPXRoaXMuX3Byb2plY3QoYVthLmxlbmd0aC0yXSxhW2EubGVuZ3RoLTFdLGksbykpJiZhLnB1c2gobFswXSxsWzFdKSxhPXRoaXMuX2NsaXBGaW5pdGUodCxhKSlmb3IobGV0IGUsbj0wLHI9YS5sZW5ndGgsaT10aGlzLl9lZGdlY29kZShhW3ItMl0sYVtyLTFdKTtuPHI7bis9MillPWksaT10aGlzLl9lZGdlY29kZShhW25dLGFbbisxXSksZSYmaSYmKG49dGhpcy5fZWRnZSh0LGUsaSxhLG4pLHI9YS5sZW5ndGgpO2Vsc2UgdGhpcy5jb250YWlucyh0LCh0aGlzLnhtaW4rdGhpcy54bWF4KS8yLCh0aGlzLnltaW4rdGhpcy55bWF4KS8yKSYmKGE9W3RoaXMueG1pbix0aGlzLnltaW4sdGhpcy54bWF4LHRoaXMueW1pbix0aGlzLnhtYXgsdGhpcy55bWF4LHRoaXMueG1pbix0aGlzLnltYXhdKTtyZXR1cm4gYX1fZWRnZSh0LGUsbixyLGkpe2Zvcig7ZSE9PW47KXtsZXQgbixvO3N3aXRjaChlKXtjYXNlIDU6ZT00O2NvbnRpbnVlO2Nhc2UgNDplPTYsbj10aGlzLnhtYXgsbz10aGlzLnltaW47YnJlYWs7Y2FzZSA2OmU9Mjtjb250aW51ZTtjYXNlIDI6ZT0xMCxuPXRoaXMueG1heCxvPXRoaXMueW1heDticmVhaztjYXNlIDEwOmU9ODtjb250aW51ZTtjYXNlIDg6ZT05LG49dGhpcy54bWluLG89dGhpcy55bWF4O2JyZWFrO2Nhc2UgOTplPTE7Y29udGludWU7Y2FzZSAxOmU9NSxuPXRoaXMueG1pbixvPXRoaXMueW1pbn1yW2ldPT09biYmcltpKzFdPT09b3x8IXRoaXMuY29udGFpbnModCxuLG8pfHwoci5zcGxpY2UoaSwwLG4sbyksaSs9Mil9cmV0dXJuIGl9X3Byb2plY3QodCxlLG4scil7bGV0IGksbyxsLGE9MS8wO2lmKHI8MCl7aWYoZTw9dGhpcy55bWluKXJldHVybiBudWxsOyhpPSh0aGlzLnltaW4tZSkvcik8YSYmKGw9dGhpcy55bWluLG89dCsoYT1pKSpuKX1lbHNlIGlmKHI+MCl7aWYoZT49dGhpcy55bWF4KXJldHVybiBudWxsOyhpPSh0aGlzLnltYXgtZSkvcik8YSYmKGw9dGhpcy55bWF4LG89dCsoYT1pKSpuKX1pZihuPjApe2lmKHQ+PXRoaXMueG1heClyZXR1cm4gbnVsbDsoaT0odGhpcy54bWF4LXQpL24pPGEmJihvPXRoaXMueG1heCxsPWUrKGE9aSkqcil9ZWxzZSBpZihuPDApe2lmKHQ8PXRoaXMueG1pbilyZXR1cm4gbnVsbDsoaT0odGhpcy54bWluLXQpL24pPGEmJihvPXRoaXMueG1pbixsPWUrKGE9aSkqcil9cmV0dXJuW28sbF19X2VkZ2Vjb2RlKHQsZSl7cmV0dXJuKHQ9PT10aGlzLnhtaW4/MTp0PT09dGhpcy54bWF4PzI6MCl8KGU9PT10aGlzLnltaW4/NDplPT09dGhpcy55bWF4Pzg6MCl9X3JlZ2lvbmNvZGUodCxlKXtyZXR1cm4odDx0aGlzLnhtaW4/MTp0PnRoaXMueG1heD8yOjApfChlPHRoaXMueW1pbj80OmU+dGhpcy55bWF4Pzg6MCl9X3NpbXBsaWZ5KHQpe2lmKHQmJnQubGVuZ3RoPjQpe2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSs9Mil7Y29uc3Qgbj0oZSsyKSV0Lmxlbmd0aCxyPShlKzQpJXQubGVuZ3RoOyh0W2VdPT09dFtuXSYmdFtuXT09PXRbcl18fHRbZSsxXT09PXRbbisxXSYmdFtuKzFdPT09dFtyKzFdKSYmKHQuc3BsaWNlKG4sMiksZS09Mil9dC5sZW5ndGh8fCh0PW51bGwpfXJldHVybiB0fX1jb25zdCBCYT0yKk1hdGguUEksVWE9TWF0aC5wb3c7ZnVuY3Rpb24gTGEodCl7cmV0dXJuIHRbMF19ZnVuY3Rpb24gRGEodCl7cmV0dXJuIHRbMV19ZnVuY3Rpb24gSGEodCxlLG4pe3JldHVyblt0K01hdGguc2luKHQrZSkqbixlK01hdGguY29zKHQtZSkqbl19Y2xhc3MgWGF7c3RhdGljIGZyb20odCxlPUxhLG49RGEscil7cmV0dXJuIG5ldyBYYSgibGVuZ3RoImluIHQ/ZnVuY3Rpb24odCxlLG4scil7Y29uc3QgaT10Lmxlbmd0aCxvPW5ldyBGbG9hdDY0QXJyYXkoMippKTtmb3IobGV0IGw9MDtsPGk7KytsKXtjb25zdCBpPXRbbF07b1syKmxdPWUuY2FsbChyLGksbCx0KSxvWzIqbCsxXT1uLmNhbGwocixpLGwsdCl9cmV0dXJuIG99KHQsZSxuLHIpOkZsb2F0NjRBcnJheS5mcm9tKGZ1bmN0aW9uKih0LGUsbixyKXtsZXQgaT0wO2Zvcihjb25zdCBvIG9mIHQpeWllbGQgZS5jYWxsKHIsbyxpLHQpLHlpZWxkIG4uY2FsbChyLG8saSx0KSwrK2l9KHQsZSxuLHIpKSl9Y29uc3RydWN0b3IodCl7dGhpcy5fZGVsYXVuYXRvcj1uZXcgTWEodCksdGhpcy5pbmVkZ2VzPW5ldyBJbnQzMkFycmF5KHQubGVuZ3RoLzIpLHRoaXMuX2h1bGxJbmRleD1uZXcgSW50MzJBcnJheSh0Lmxlbmd0aC8yKSx0aGlzLnBvaW50cz10aGlzLl9kZWxhdW5hdG9yLmNvb3Jkcyx0aGlzLl9pbml0KCl9dXBkYXRlKCl7cmV0dXJuIHRoaXMuX2RlbGF1bmF0b3IudXBkYXRlKCksdGhpcy5faW5pdCgpLHRoaXN9X2luaXQoKXtjb25zdCB0PXRoaXMuX2RlbGF1bmF0b3IsZT10aGlzLnBvaW50cztpZih0Lmh1bGwmJnQuaHVsbC5sZW5ndGg+MiYmZnVuY3Rpb24odCl7Y29uc3R7dHJpYW5nbGVzOmUsY29vcmRzOm59PXQ7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0Kz0zKXtjb25zdCByPTIqZVt0XSxpPTIqZVt0KzFdLG89MiplW3QrMl07aWYoKG5bb10tbltyXSkqKG5baSsxXS1uW3IrMV0pLShuW2ldLW5bcl0pKihuW28rMV0tbltyKzFdKT4xZS0xMClyZXR1cm4hMX1yZXR1cm4hMH0odCkpe3RoaXMuY29sbGluZWFyPUludDMyQXJyYXkuZnJvbSh7bGVuZ3RoOmUubGVuZ3RoLzJ9LCgodCxlKT0+ZSkpLnNvcnQoKCh0LG4pPT5lWzIqdF0tZVsyKm5dfHxlWzIqdCsxXS1lWzIqbisxXSkpO2NvbnN0IHQ9dGhpcy5jb2xsaW5lYXJbMF0sbj10aGlzLmNvbGxpbmVhclt0aGlzLmNvbGxpbmVhci5sZW5ndGgtMV0scj1bZVsyKnRdLGVbMip0KzFdLGVbMipuXSxlWzIqbisxXV0saT0xZS04Kk1hdGguaHlwb3QoclszXS1yWzFdLHJbMl0tclswXSk7Zm9yKGxldCB0PTAsbj1lLmxlbmd0aC8yO3Q8bjsrK3Qpe2NvbnN0IG49SGEoZVsyKnRdLGVbMip0KzFdLGkpO2VbMip0XT1uWzBdLGVbMip0KzFdPW5bMV19dGhpcy5fZGVsYXVuYXRvcj1uZXcgTWEoZSl9ZWxzZSBkZWxldGUgdGhpcy5jb2xsaW5lYXI7Y29uc3Qgbj10aGlzLmhhbGZlZGdlcz10aGlzLl9kZWxhdW5hdG9yLmhhbGZlZGdlcyxyPXRoaXMuaHVsbD10aGlzLl9kZWxhdW5hdG9yLmh1bGwsaT10aGlzLnRyaWFuZ2xlcz10aGlzLl9kZWxhdW5hdG9yLnRyaWFuZ2xlcyxvPXRoaXMuaW5lZGdlcy5maWxsKC0xKSxsPXRoaXMuX2h1bGxJbmRleC5maWxsKC0xKTtmb3IobGV0IHQ9MCxlPW4ubGVuZ3RoO3Q8ZTsrK3Qpe2NvbnN0IGU9aVt0JTM9PTI/dC0yOnQrMV07LTEhPT1uW3RdJiYtMSE9PW9bZV18fChvW2VdPXQpfWZvcihsZXQgdD0wLGU9ci5sZW5ndGg7dDxlOysrdClsW3JbdF1dPXQ7ci5sZW5ndGg8PTImJnIubGVuZ3RoPjAmJih0aGlzLnRyaWFuZ2xlcz1uZXcgSW50MzJBcnJheSgzKS5maWxsKC0xKSx0aGlzLmhhbGZlZGdlcz1uZXcgSW50MzJBcnJheSgzKS5maWxsKC0xKSx0aGlzLnRyaWFuZ2xlc1swXT1yWzBdLG9bclswXV09MSwyPT09ci5sZW5ndGgmJihvW3JbMV1dPTAsdGhpcy50cmlhbmdsZXNbMV09clsxXSx0aGlzLnRyaWFuZ2xlc1syXT1yWzFdKSl9dm9yb25vaSh0KXtyZXR1cm4gbmV3IENhKHRoaXMsdCl9Km5laWdoYm9ycyh0KXtjb25zdHtpbmVkZ2VzOmUsaHVsbDpuLF9odWxsSW5kZXg6cixoYWxmZWRnZXM6aSx0cmlhbmdsZXM6byxjb2xsaW5lYXI6bH09dGhpcztpZihsKXtjb25zdCBlPWwuaW5kZXhPZih0KTtyZXR1cm4gZT4wJiYoeWllbGQgbFtlLTFdKSx2b2lkKGU8bC5sZW5ndGgtMSYmKHlpZWxkIGxbZSsxXSkpfWNvbnN0IGE9ZVt0XTtpZigtMT09PWEpcmV0dXJuO2xldCBzPWEsdT0tMTtkb3tpZih5aWVsZCB1PW9bc10scz1zJTM9PTI/cy0yOnMrMSxvW3NdIT09dClyZXR1cm47aWYocz1pW3NdLC0xPT09cyl7Y29uc3QgZT1uWyhyW3RdKzEpJW4ubGVuZ3RoXTtyZXR1cm4gdm9pZChlIT09dSYmKHlpZWxkIGUpKX19d2hpbGUocyE9PWEpfWZpbmQodCxlLG49MCl7aWYoKHQ9K3QpIT10fHwoZT0rZSkhPWUpcmV0dXJuLTE7Y29uc3Qgcj1uO2xldCBpO2Zvcig7KGk9dGhpcy5fc3RlcChuLHQsZSkpPj0wJiZpIT09biYmaSE9PXI7KW49aTtyZXR1cm4gaX1fc3RlcCh0LGUsbil7Y29uc3R7aW5lZGdlczpyLGh1bGw6aSxfaHVsbEluZGV4Om8saGFsZmVkZ2VzOmwsdHJpYW5nbGVzOmEscG9pbnRzOnN9PXRoaXM7aWYoLTE9PT1yW3RdfHwhcy5sZW5ndGgpcmV0dXJuKHQrMSklKHMubGVuZ3RoPj4xKTtsZXQgdT10LGM9VWEoZS1zWzIqdF0sMikrVWEobi1zWzIqdCsxXSwyKTtjb25zdCBmPXJbdF07bGV0IGg9Zjtkb3tsZXQgcj1hW2hdO2NvbnN0IGY9VWEoZS1zWzIqcl0sMikrVWEobi1zWzIqcisxXSwyKTtpZihmPGMmJihjPWYsdT1yKSxoPWglMz09Mj9oLTI6aCsxLGFbaF0hPT10KWJyZWFrO2lmKGg9bFtoXSwtMT09PWgpe2lmKGg9aVsob1t0XSsxKSVpLmxlbmd0aF0saCE9PXImJlVhKGUtc1syKmhdLDIpK1VhKG4tc1syKmgrMV0sMik8YylyZXR1cm4gaDticmVha319d2hpbGUoaCE9PWYpO3JldHVybiB1fXJlbmRlcih0KXtjb25zdCBlPW51bGw9PXQ/dD1uZXcgTmE6dm9pZCAwLHtwb2ludHM6bixoYWxmZWRnZXM6cix0cmlhbmdsZXM6aX09dGhpcztmb3IobGV0IGU9MCxvPXIubGVuZ3RoO2U8bzsrK2Upe2NvbnN0IG89cltlXTtpZihvPGUpY29udGludWU7Y29uc3QgbD0yKmlbZV0sYT0yKmlbb107dC5tb3ZlVG8obltsXSxuW2wrMV0pLHQubGluZVRvKG5bYV0sblthKzFdKX1yZXR1cm4gdGhpcy5yZW5kZXJIdWxsKHQpLGUmJmUudmFsdWUoKX1yZW5kZXJQb2ludHModCxlKXt2b2lkIDAhPT1lfHx0JiYiZnVuY3Rpb24iPT10eXBlb2YgdC5tb3ZlVG98fChlPXQsdD1udWxsKSxlPW51bGw9PWU/MjorZTtjb25zdCBuPW51bGw9PXQ/dD1uZXcgTmE6dm9pZCAwLHtwb2ludHM6cn09dGhpcztmb3IobGV0IG49MCxpPXIubGVuZ3RoO248aTtuKz0yKXtjb25zdCBpPXJbbl0sbz1yW24rMV07dC5tb3ZlVG8oaStlLG8pLHQuYXJjKGksbyxlLDAsQmEpfXJldHVybiBuJiZuLnZhbHVlKCl9cmVuZGVySHVsbCh0KXtjb25zdCBlPW51bGw9PXQ/dD1uZXcgTmE6dm9pZCAwLHtodWxsOm4scG9pbnRzOnJ9PXRoaXMsaT0yKm5bMF0sbz1uLmxlbmd0aDt0Lm1vdmVUbyhyW2ldLHJbaSsxXSk7Zm9yKGxldCBlPTE7ZTxvOysrZSl7Y29uc3QgaT0yKm5bZV07dC5saW5lVG8ocltpXSxyW2krMV0pfXJldHVybiB0LmNsb3NlUGF0aCgpLGUmJmUudmFsdWUoKX1odWxsUG9seWdvbigpe2NvbnN0IHQ9bmV3IFJhO3JldHVybiB0aGlzLnJlbmRlckh1bGwodCksdC52YWx1ZSgpfXJlbmRlclRyaWFuZ2xlKHQsZSl7Y29uc3Qgbj1udWxsPT1lP2U9bmV3IE5hOnZvaWQgMCx7cG9pbnRzOnIsdHJpYW5nbGVzOml9PXRoaXMsbz0yKmlbdCo9M10sbD0yKmlbdCsxXSxhPTIqaVt0KzJdO3JldHVybiBlLm1vdmVUbyhyW29dLHJbbysxXSksZS5saW5lVG8ocltsXSxyW2wrMV0pLGUubGluZVRvKHJbYV0sclthKzFdKSxlLmNsb3NlUGF0aCgpLG4mJm4udmFsdWUoKX0qdHJpYW5nbGVQb2x5Z29ucygpe2NvbnN0e3RyaWFuZ2xlczp0fT10aGlzO2ZvcihsZXQgZT0wLG49dC5sZW5ndGgvMztlPG47KytlKXlpZWxkIHRoaXMudHJpYW5nbGVQb2x5Z29uKGUpfXRyaWFuZ2xlUG9seWdvbih0KXtjb25zdCBlPW5ldyBSYTtyZXR1cm4gdGhpcy5yZW5kZXJUcmlhbmdsZSh0LGUpLGUudmFsdWUoKX19ZnVuY3Rpb24gWWEodCxlLG49e30pe2lmKCFObyh0KSlyZXR1cm57ZXJyOiJwc1NyYyBpcyBub3QgYW4gYXJyYXkifTtpZighSW8oZSkmJiFObyhlKSlyZXR1cm57ZXJyOiJwc1RhciBpcyBub3QgYW4gb2JqZWN0IG9yIGFycmF5In07bGV0IHI9SW8oZSk7ciYmKGU9W2VdKTtsZXQgaT1fZShuLCJrZXlYIik7QWUoaSl8fChpPSJ4Iik7bGV0IG89X2Uobiwia2V5WSIpO0FlKG8pfHwobz0ieSIpO2xldCBsPV9lKG4sImtleVoiKTtBZShsKXx8KGw9InoiKTtsZXQgYT1fZShuLCJzY2FsZSIpO1JvKGEpfHwoYT0xKSxhPVFvKGEpO2xldCBzPV9lKG4sImZ1bkludGVycEZyYWdtZW50IiksdT1DbyhzKSxjPV9lKG4sImZ1bkludGVycEZyYWdtZW50cyIpLGY9Q28oYyksaD0iaW5kIjtpZih0PW5sKHQse2tleVg6aSxrZXlZOm8sa2V5WjpsLGtleUluZDpofSksMD09PWtvKHQpKXJldHVybntlcnI6InBzU3JjIGhhcyBubyBlZmZlY3RpdmUgZGF0YSJ9O2lmKGU9ZWwoZSx7a2V5WDppLGtleVk6byxrZXlJbmQ6aH0pLDA9PT1rbyhlKSlyZXR1cm57ZXJyOiJwc1RhciBoYXMgbm8gZWZmZWN0aXZlIGRhdGEifTtsZXQgZz1CbCh0LHtrZXlJbmQ6aCxzY2FsZTphfSk7dD1nLnBzO2xldCB2PWcubnYsZD1nLmludixwPVsuLi50XSx5PVsuLi50XSxtPXt9O0VuKHQsKHQ9PntsZXQgZT1gJHt0Lnh9LSR7dC55fWA7bVtlXT10Lnp9KSk7bGV0IF8sYj1YYS5mcm9tKHksKHQ9PnQueCksKHQ9PnQueSkpLHg9WzAsMCxhLGFdLHc9Yi52b3Jvbm9pKHgpLGo9KGUsbixyKT0+e2xldCBpPVsuLi50XSxvPXt4Om4seTpyLHo6MH07aS5wdXNoKG8pLGUucHVzaChvKTtsZXQgbD1YYS5mcm9tKGksKHQ9PnQueCksKHQ9PnQueSkpLnZvcm9ub2koeCksYT1pLmxlbmd0aC0xLGg9bC5jZWxsUG9seWdvbihhKSxnPVZsKGgpLHY9bnVsbDtpZihnPjApe2xldCB0PVtdLG49bC5kZWxhdW5heS5uZWlnaGJvcnMoYSkscj1uLm5leHQoKTtmb3IoOyFyLmRvbmU7KXtsZXQgZT1yLnZhbHVlO3QucHVzaChlKSxyPW4ubmV4dCgpfWxldCBpPVZpKHQsKHQ9PntsZXQgZT1baF0sbj1bdy5jZWxsUG9seWdvbih0KV0scj1bXTt0cnl7cj1mdW5jdGlvbih0LGUpe2lmKCFObyh0KSlyZXR1cm4gbnVsbDtpZighTm8oZSkpcmV0dXJuIG51bGw7dD1KbCh0KSxlPUpsKGUpO2xldCBuPWhhLmludGVyc2VjdCh7cmVnaW9uczp0fSx7cmVnaW9uczplfSk7cmV0dXJuIF9lKG4sInJlZ2lvbnMiLFtdKX0oZSxuKX1jYXRjaCh0KXtjb25zb2xlLmxvZygicGdzMSIsZSksY29uc29sZS5sb2coInBnczIiLG4pLGNvbnNvbGUubG9nKHQpfWxldCBpPTA7aWYoMT09PWtvKHIpKXRyeXtpPVZsKHJbMF0pfWNhdGNoKHQpe2NvbnNvbGUubG9nKCJwZ3NJbnRzIixyKSxjb25zb2xlLmxvZyh0KX1yZXR1cm57aWE6aSxpZHg6dH19KSksbz1bXTtFbihpLCh0PT57bGV0IG49dC5pYS9nLHI9ZVt0LmlkeF0ueixpPW4qcjt1JiYocj1zKHt2OmksYXJlYTp0LmlhLGFyZWFUb3RhbDpnLGFyZWFSYXRpbzpuLHo6cixpbmQ6dC5pZHh9KSk7bGV0IGw9e3Y6aSxhcmVhOnQuaWEsYXJlYVRvdGFsOmcsYXJlYVJhdGlvOm4sejpyLGluZDp0LmlkeH07by5wdXNoKGwpfSkpO2xldCBkPVFpKFZpKG8sInYiKSk7ZiYmKGQ9Yyh7cHM6byx2OmR9KSksdj1kfXJldHVybiBlW2UubGVuZ3RoLTFdLno9dix2fSxTPSh0LGUpPT57bGV0IG49YCR7dH0tJHtlfWA7aWYodGwobSxuKSlyZXR1cm4gbVtuXTtpZih0PHhbMF18fHQ+eFsyXXx8ZTx4WzFdfHxlPnhbM10pcmV0dXJuIG51bGw7bGV0IHI9KCh0LGUsbik9PntsZXQgcjt0cnl7cj1qKHQsZSxuKX1jYXRjaChlKXtjb25zb2xlLmxvZyhlKSxyPW51bGwsdC5wb3AoKX1yZXR1cm4gcn0pKHAsdCxlKTtyZXR1cm4gbVtuXT1yLHJ9LEE9dD0+e2xldCBlPXQueCxuPXYoZSwwKTtpZighVG8obikpdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG54WyR7bn1dYCk7bGV0IHI9dC55LGE9dihyLDEpO2lmKCFUbyhhKSl0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgbnlbJHthfV1gKTtsZXQgcz1TKG4sYSksdT1kKHMsMik7cmV0dXJuIFRvKHUpfHwodT1udWxsKSx7W2ldOmUsW29dOnIsW2xdOnV9fTtpZihyKXtsZXQgdD1lWzBdO189QSh0KX1lbHNlIF89W10sRW4oZSwodD0+e18ucHVzaChBKHQpKX0pKTtyZXR1cm4gX31sZXQgS2E9e30sWmE9ZnVuY3Rpb24odCxlKXtsZXQgbj1bXTtmb3IobGV0IHI9MDtyPGU7cisrKW4ucHVzaCh0KTtyZXR1cm4gbn0sSmE9ZnVuY3Rpb24odCxlKXtsZXQgbj1aYSgwLGUqZSk7Zm9yKGxldCByPTA7cjxlO3IrKyluW3IqZStyXT10O3JldHVybiBufSxWYT1mdW5jdGlvbih0LGUsbixyKXtsZXQgaSxvLGw9QXJyYXkobipyKTtmb3IoaT0wO2k8bjtpKyspZm9yKG89MDtvPHI7bysrKWxbaSpyK29dPXRbaSpyK29dK2VbaSpyK29dO3JldHVybiBsfSxXYT1mdW5jdGlvbih0LGUsbixyLGkpe2xldCBvLGwsYSxzPUFycmF5KG4qaSk7Zm9yKG89MDtvPG47bysrKWZvcihsPTA7bDxpO2wrKylmb3Ioc1tvKmkrbF09MCxhPTA7YTxyO2ErKylzW28qaStsXSs9dFtvKnIrYV0qZVthKmkrbF07cmV0dXJuIHN9LHFhPWZ1bmN0aW9uKHQsZSl7bGV0IG4scixpLG89QXJyYXkoZSk7Zm9yKG49MDtuPGU7bisrKW9bbl09dFtuKmUrbl07Zm9yKG49MDtuPGU7bisrKXtmb3Iocj0wO3I8bjtyKyspb1tuXS09dFtuKmUrcl0qdFtuKmUrcl07aWYob1tuXTw9MClyZXR1cm4hMTtmb3Iob1tuXT1NYXRoLnNxcnQob1tuXSkscj1uKzE7cjxlO3IrKyl7Zm9yKGk9MDtpPG47aSsrKXRbciplK25dLT10W3IqZStpXSp0W24qZStpXTt0W3IqZStuXS89b1tuXX19Zm9yKG49MDtuPGU7bisrKXRbbiplK25dPW9bbl07cmV0dXJuITB9LEdhPWZ1bmN0aW9uKHQsZSl7bGV0IG4scixpLG87Zm9yKG49MDtuPGU7bisrKWZvcih0W24qZStuXT0xL3RbbiplK25dLHI9bisxO3I8ZTtyKyspe2ZvcihvPTAsaT1uO2k8cjtpKyspby09dFtyKmUraV0qdFtpKmUrbl07dFtyKmUrbl09by90W3IqZStyXX1mb3Iobj0wO248ZTtuKyspZm9yKHI9bisxO3I8ZTtyKyspdFtuKmUrcl09MDtmb3Iobj0wO248ZTtuKyspe2Zvcih0W24qZStuXSo9dFtuKmUrbl0saT1uKzE7aTxlO2krKyl0W24qZStuXSs9dFtpKmUrbl0qdFtpKmUrbl07Zm9yKHI9bisxO3I8ZTtyKyspZm9yKGk9cjtpPGU7aSsrKXRbbiplK3JdKz10W2kqZStuXSp0W2kqZStyXX1mb3Iobj0wO248ZTtuKyspZm9yKHI9MDtyPG47cisrKXRbbiplK3JdPXRbciplK25dfSxRYT1mdW5jdGlvbih0LGUpe2xldCBuLHIsaSxvLGwsYSxzLHUsYyxmLGgsZz1lLHY9QXJyYXkoZSplKSxkPUFycmF5KGUpLHA9QXJyYXkoZSkseT1BcnJheShlKTtmb3Iobj0wO248ZTtuKyspZm9yKG89MDtvPGU7bysrKXZbbiplK29dPW49PT1vPzE6MDtmb3Iobz0wO288ZTtvKyspeVtvXT0wO2ZvcihuPTA7bjxlO24rKyl7Zm9yKHU9MCxvPTA7bzxlO28rKylpZigxIT09eVtvXSlmb3IobD0wO2w8ZTtsKyspMD09PXlbbF0mJk1hdGguYWJzKHRbbyplK2xdKT49dSYmKHU9TWF0aC5hYnModFtvKmUrbF0pLGk9byxyPWwpO2lmKCsreVtyXSxpIT09cil7Zm9yKGE9MDthPGU7YSsrKWg9dFtpKmUrYV0sdFtpKmUrYV09dFtyKmUrYV0sdFtyKmUrYV09aDtmb3IoYT0wO2E8ZzthKyspaD12W2kqZSthXSx2W2kqZSthXT12W3IqZSthXSx2W3IqZSthXT1ofWlmKHBbbl09aSxkW25dPXIsMD09PXRbciplK3JdKXJldHVybiExO2ZvcihmPTEvdFtyKmUrcl0sdFtyKmUrcl09MSxhPTA7YTxlO2ErKyl0W3IqZSthXSo9Zjtmb3IoYT0wO2E8ZzthKyspdltyKmUrYV0qPWY7Zm9yKHM9MDtzPGU7cysrKWlmKHMhPT1yKXtmb3IoYz10W3MqZStyXSx0W3MqZStyXT0wLGE9MDthPGU7YSsrKXRbcyplK2FdLT10W3IqZSthXSpjO2ZvcihhPTA7YTxnO2ErKyl2W3MqZSthXS09dltyKmUrYV0qY319Zm9yKGE9ZS0xO2E+PTA7YS0tKWlmKHBbYV0hPT1kW2FdKWZvcihsPTA7bDxlO2wrKyloPXRbbCplK3BbYV1dLHRbbCplK3BbYV1dPXRbbCplK2RbYV1dLHRbbCplK2RbYV1dPWg7cmV0dXJuITB9LHRzPWZ1bmN0aW9uKHQsZSxuLHIsaSl7cmV0dXJuIGUrKHItZSkvbiooMS1NYXRoLmV4cCgtMS9pKk1hdGgucG93KHQvbiwyKSkpfSxlcz1mdW5jdGlvbih0LGUsbixyLGkpe3JldHVybiBlKyhyLWUpL24qKDEtTWF0aC5leHAoLTEvaSoodC9uKSkpfSxucz1mdW5jdGlvbih0LGUsbixyLGkpe3JldHVybiB0Pm4/ZSsoci1lKS9uOmUrKHItZSkvbioodC9uKjEuNS0uNSpNYXRoLnBvdyh0L24sMykpfTtmdW5jdGlvbiBycyh0LGUsbj17fSl7aWYoIU5vKHQpKXJldHVybntlcnI6InBzU3JjIGlzIG5vdCBhbiBhcnJheSJ9O2lmKCFJbyhlKSYmIU5vKGUpKXJldHVybntlcnI6InBzVGFyIGlzIG5vdCBhbiBvYmplY3Qgb3IgYXJyYXkifTtsZXQgcj1JbyhlKTtyJiYoZT1bZV0pO2xldCBpPV9lKG4sImtleVgiKTtBZShpKXx8KGk9IngiKTtsZXQgbz1fZShuLCJrZXlZIik7QWUobyl8fChvPSJ5Iik7bGV0IGw9X2Uobiwia2V5WiIpO0FlKGwpfHwobD0ieiIpO2xldCBhPV9lKG4sInNjYWxlIik7Um8oYSl8fChhPTEpLGE9UW8oYSk7bGV0IHM9X2UobiwibW9kZWwiKTsiZXhwb25lbnRpYWwiIT09cyYmImdhdXNzaWFuIiE9PXMmJiJzcGhlcmljYWwiIT09cyYmKHM9ImV4cG9uZW50aWFsIik7bGV0IHU9X2Uobiwic2lnbWEyIik7Um8odSl8fCh1PTApLHU9UW8odSk7bGV0IGM9X2UobiwiYWxwaGEiKTtSbyhjKXx8KGM9MTAwKSxjPVFvKGMpO2xldCBmPV9lKG4sInJldHVybldpdGhWYXJpb2dyYW0iKTtpZihqZShmKXx8KGY9ITEpLHQ9bmwodCxuKSwwPT09a28odCkpcmV0dXJue2VycjoicHNTcmMgaGFzIG5vIGVmZmVjdGl2ZSBkYXRhIn07aWYoZT1lbChlLG4pLDA9PT1rbyhlKSlyZXR1cm57ZXJyOiJwc1RhciBoYXMgbm8gZWZmZWN0aXZlIGRhdGEifTtsZXQgaD1CbCh0LHtzY2FsZTphfSk7dD1oLnBzO2xldCBnPWgubnYsdj1oLmludixkPXt9O0VuKHQsKHQ9PntsZXQgZT1gJHt0Lnh9LSR7dC55fWA7ZFtlXT10Lnp9KSk7bGV0IHA9W10seT1bXSxtPVtdO0VuKHQsKHQ9PntwLnB1c2godC54KSx5LnB1c2godC55KSxtLnB1c2godC56KX0pKTtsZXQgXyxiPUthLnRyYWluKG0scCx5LHMsdSxjKSx4PXQ9PntsZXQgZT10Lngsbj1nKGUsMCk7aWYoIVRvKG4pKXRocm93IG5ldyBFcnJvcihgaW52YWxpZCBueFske259XWApO2xldCByPXQueSxhPWcociwxKTtpZighVG8oYSkpdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG55WyR7YX1dYCk7bGV0IHM9KCh0LGUpPT57bGV0IG49YCR7dH0tJHtlfWA7aWYodGwoZCxuKSlyZXR1cm4gZFtuXTtsZXQgcj1LYS5wcmVkaWN0KHQsZSxiKTtyZXR1cm4gZFtuXT1yLHJ9KShuLGEpLHU9dihzLDIpO3JldHVybiBUbyh1KXx8KHU9bnVsbCkse1tpXTplLFtvXTpyLFtsXTp1fX07aWYocil7bGV0IHQ9ZVswXTtfPXgodCl9ZWxzZSBfPVtdLEVuKGUsKHQ9PntfLnB1c2goeCh0KSl9KSk7cmV0dXJuIGYmJihfPXtyZXN1bHQ6Xyx2YXJpb2dyYW06Yn0pLF99ZnVuY3Rpb24gaW50ZXJwMih0LGUsbj17fSl7bGV0IHI9X2UobiwibWV0aG9kIik7Im5hdHVyYWxOZWlnaGJvciIhPT1yJiYia3JpZ2luZyIhPT1yJiYocj0ibmF0dXJhbE5laWdoYm9yIik7bGV0IGk9X2UobiwidXNlU3luYyIpO2plKGkpfHwoaT0hMSk7bGV0IG89KCk9PntsZXQgaT1udWxsO3RyeXsibmF0dXJhbE5laWdoYm9yIj09PXI/aT1ZYSh0LGUsbik6ImtyaWdpbmciPT09ciYmKGk9cnModCxlLG4pKX1jYXRjaCh0KXtpPXtlcnI6dC50b1N0cmluZygpfX1yZXR1cm4gaX07cmV0dXJuIGk/bygpOihhc3luYygpPT57bGV0IHQ9bnVsbDt0cnl7dD1vKCk7bGV0IGU9X2UodCwiZXJyIik7cmV0dXJuIEFlKGUpP1Byb21pc2UucmVqZWN0KGUpOnR9Y2F0Y2godCl7cmV0dXJuIGNvbnNvbGUubG9nKHQpLFByb21pc2UucmVqZWN0KHQudG9TdHJpbmcoKSl9fSkoKX1LYS50cmFpbj1mdW5jdGlvbih0LGUsbixyLGksbyl7bGV0IGwsYSxzLHUsYz17dDp0LHg6ZSx5Om4sbnVnZ2V0OjAscmFuZ2U6MCxzaWxsOjAsQToxLzMsbjowfTtzd2l0Y2gocil7Y2FzZSJnYXVzc2lhbiI6Yy5tb2RlbD10czticmVhaztjYXNlImV4cG9uZW50aWFsIjpjLm1vZGVsPWVzO2JyZWFrO2Nhc2Uic3BoZXJpY2FsIjpjLm1vZGVsPW5zfWxldCBmPXQubGVuZ3RoLGg9QXJyYXkoKGYqZi1mKS8yKTtmb3IobD0wLHM9MDtsPGY7bCsrKWZvcihhPTA7YTxsO2ErKyxzKyspaFtzXT1BcnJheSgyKSxoW3NdWzBdPU1hdGgucG93KE1hdGgucG93KGVbbF0tZVthXSwyKStNYXRoLnBvdyhuW2xdLW5bYV0sMiksLjUpLGhbc11bMV09TWF0aC5hYnModFtsXS10W2FdKTtoLnNvcnQoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRbMF0tZVswXX0pKSxjLnJhbmdlPWhbKGYqZi1mKS8yLTFdWzBdO2xldCBnPShmKmYtZikvMj4zMD8zMDooZipmLWYpLzIsdj1jLnJhbmdlL2csZD1aYSgwLGcpLHA9WmEoMCxnKTtpZihnPDMwKWZvcih1PTA7dTxnO3UrKylkW3VdPWhbdV1bMF0scFt1XT1oW3VdWzFdO2Vsc2V7Zm9yKGw9MCxhPTAscz0wLHU9MDtsPGcmJmE8KGYqZi1mKS8yO2wrKyxzPTApe2Zvcig7aFthXVswXTw9KGwrMSkqdiYmKGRbdV0rPWhbYV1bMF0scFt1XSs9aFthXVsxXSxhKysscysrLCEoYT49KGYqZi1mKS8yKSk7KTtzPjAmJihkW3VdLz1zLHBbdV0vPXMsdSsrKX1pZih1PDIpcmV0dXJuIGN9bGV0IHk9W107Zm9yKGw9MDtsPHU7bCsrKXtsZXQgdD1kW2xdLGU9cFtsXTt5LnB1c2goW3QsZV0pfWxldCBtPXtkYXRhOmgsYmFyczp5fTtjLnN2cGQ9bSxmPXUsYy5yYW5nZT1kW2YtMV0tZFswXTtsZXQgXz1aYSgxLDIqZiksYj1BcnJheShmKSx4PWMuQTtmb3IobD0wO2w8ZjtsKyspe3N3aXRjaChyKXtjYXNlImdhdXNzaWFuIjpfWzIqbCsxXT0xLU1hdGguZXhwKC0xL3gqTWF0aC5wb3coZFtsXS9jLnJhbmdlLDIpKTticmVhaztjYXNlImV4cG9uZW50aWFsIjpfWzIqbCsxXT0xLU1hdGguZXhwKC0xL3gqZFtsXS9jLnJhbmdlKTticmVhaztjYXNlInNwaGVyaWNhbCI6X1syKmwrMV09ZFtsXS9jLnJhbmdlKjEuNS0uNSpNYXRoLnBvdyhkW2xdL2MucmFuZ2UsMyl9YltsXT1wW2xdfWxldCB3PWZ1bmN0aW9uKHQsZSxuKXtsZXQgcixpLG89QXJyYXkobiplKTtmb3Iocj0wO3I8ZTtyKyspZm9yKGk9MDtpPG47aSsrKW9baSplK3JdPXRbcipuK2ldO3JldHVybiBvfShfLGYsMiksaj1XYSh3LF8sMixmLDIpO2o9VmEoaixKYSgxL28sMiksMiwyKTtsZXQgUz1qLnNsaWNlKDApO3FhKGosMik/R2EoaiwyKTooUWEoUywyKSxqPVMpO2xldCBBPVdhKFdhKGosdywyLDIsZiksYiwyLGYsMSk7Yy5udWdnZXQ9QVswXSxjLnNpbGw9QVsxXSpjLnJhbmdlK2MubnVnZ2V0LGMubj1lLmxlbmd0aCxmPWUubGVuZ3RoO2xldCBPPUFycmF5KGYqZik7Zm9yKGw9MDtsPGY7bCsrKXtmb3IoYT0wO2E8bDthKyspT1tsKmYrYV09Yy5tb2RlbChNYXRoLnBvdyhNYXRoLnBvdyhlW2xdLWVbYV0sMikrTWF0aC5wb3cobltsXS1uW2FdLDIpLC41KSxjLm51Z2dldCxjLnJhbmdlLGMuc2lsbCxjLkEpLE9bYSpmK2xdPU9bbCpmK2FdO09bbCpmK2xdPWMubW9kZWwoMCxjLm51Z2dldCxjLnJhbmdlLGMuc2lsbCxjLkEpfWxldCBNPVZhKE8sSmEoaSxmKSxmLGYpLGs9TS5zbGljZSgwKTtxYShNLGYpP0dhKE0sZik6KFFhKGssZiksTT1rKTtsZXQgUD1NLnNsaWNlKDApLEY9V2EoTSx0LGYsZiwxKTtyZXR1cm4gYy5LPVAsYy5NPUYsY30sS2EucHJlZGljdD1mdW5jdGlvbih0LGUsbil7bGV0IHIsaT1BcnJheShuLm4pO2ZvcihyPTA7cjxuLm47cisrKWlbcl09bi5tb2RlbChNYXRoLnBvdyhNYXRoLnBvdyh0LW4ueFtyXSwyKStNYXRoLnBvdyhlLW4ueVtyXSwyKSwuNSksbi5udWdnZXQsbi5yYW5nZSxuLnNpbGwsbi5BKTtyZXR1cm4gV2EoaSxuLk0sMSxuLm4sMSlbMF19LEthLnZhcmlhbmNlPWZ1bmN0aW9uKHQsZSxuKXtsZXQgcixpPUFycmF5KG4ubik7Zm9yKHI9MDtyPG4ubjtyKyspaVtyXT1uLm1vZGVsKE1hdGgucG93KE1hdGgucG93KHQtbi54W3JdLDIpK01hdGgucG93KGUtbi55W3JdLDIpLC41KSxuLm51Z2dldCxuLnJhbmdlLG4uc2lsbCxuLkEpO3JldHVybiBuLm1vZGVsKDAsbi5udWdnZXQsbi5yYW5nZSxuLnNpbGwsbi5BKStXYShXYShpLG4uSywxLG4ubixuLm4pLGksMSxuLm4sMSlbMF19OwoKbGV0IGluc3RhbmNlID0gbnVsbApmdW5jdGlvbiBpbml0KGlucHV0KXsKCiAgICAvL2luaXQKICAgIGxldCByCiAgICAKICAgICAgICByID0gewogICAgICAgICAgICBtYWluOiBpbnRlcnAyCiAgICAgICAgfQogICAgICAgIAoKICAgIC8vb24KICAgIAoKICAgIC8vc2F2ZQogICAgaW5zdGFuY2UgPSByCgp9CgpmdW5jdGlvbiBzZW5kTWVzc2FnZShkYXRhKSB7CiAgICAKICAgICAgICBzZWxmLnBvc3RNZXNzYWdlKGRhdGEpCiAgICAgICAgCn0KCmFzeW5jIGZ1bmN0aW9uIHJ1bihkYXRhKSB7CiAgICAvLyBjb25zb2xlLmxvZygnaW5uZXIgd29ya2VyIHJ1bicsZGF0YSkKCiAgICAvL21vZGUKICAgIGxldCBtb2RlID0gZGF0YS5tb2RlCgogICAgLy9jaGVjawogICAgaWYobW9kZSAhPT0gJ2luaXQnICYmIG1vZGUgIT09ICdjYWxsJyl7CiAgICAgICAgcmV0dXJuCiAgICB9CgogICAgLy9pbml0CiAgICBpZihtb2RlID09PSAnaW5pdCcpewogICAgICAgIAogICAgICAgIHRyeXsKCiAgICAgICAgICAgIC8vdHlwZQogICAgICAgICAgICBsZXQgdHlwZSA9IGRhdGEudHlwZQoKICAgICAgICAgICAgLy9pbnB1dAogICAgICAgICAgICBsZXQgaW5wdXQgPSBkYXRhLmlucHV0CiAgICAKICAgICAgICAgICAgLy9pbnN0YW5jZQogICAgICAgICAgICBpZih0eXBlID09PSAnZnVuY3Rpb24nKXsKICAgICAgICAgICAgICAgIGluaXQoLi4uaW5wdXQpCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZih0eXBlID09PSAnb2JqZWN0Jyl7CiAgICAgICAgICAgICAgICBpbnN0YW5jZSA9IGludGVycDIKICAgICAgICAgICAgfQoKICAgICAgICB9CiAgICAgICAgY2F0Y2goZXJyKXsKICAgICAgICAKICAgICAgICAgICAgLy9zZW5kTWVzc2FnZQogICAgICAgICAgICBsZXQgcmVzID0gewogICAgICAgICAgICAgICAgbW9kZTogJ2VtaXQnLAogICAgICAgICAgICAgICAgZXZOYW1lOiAnZXJyb3InLAogICAgICAgICAgICAgICAgbXNnOiBlcnIsCiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2VuZE1lc3NhZ2UocmVzKQoKICAgICAgICB9CiAgICAgICAgICAgIAogICAgfQoKICAgIC8vY2hlY2sKICAgIGlmKG1vZGUgPT09ICdjYWxsJyl7CiAgICAgICAgbGV0IHN0YXRlID0gJycKICAgICAgICBsZXQgbXNnID0gbnVsbAoKICAgICAgICB0cnl7CgogICAgICAgICAgICAvL2Z1bgogICAgICAgICAgICBsZXQgZnVuID0gaW5zdGFuY2VbZGF0YS5mdW5dCgogICAgICAgICAgICAvL2lucHV0CiAgICAgICAgICAgIGxldCBpbnB1dCA9IGRhdGEuaW5wdXQKCiAgICAgICAgICAgIC8vZXhlYwogICAgICAgICAgICBhd2FpdCBmdW4oLi4uaW5wdXQpCiAgICAgICAgICAgICAgICAudGhlbigoc3VjKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGU9J3N1Y2Nlc3MnCiAgICAgICAgICAgICAgICAgICAgbXNnPXN1YwogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgIC5jYXRjaCgoZXJyKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGU9J2Vycm9yJwogICAgICAgICAgICAgICAgICAgIG1zZz1lcnIKICAgICAgICAgICAgICAgIH0pCgogICAgICAgIH0KICAgICAgICBjYXRjaChlcnIpewogICAgICAgICAgICBzdGF0ZSA9ICdlcnJvcicKICAgICAgICAgICAgbXNnID0gZXJyCiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vc2VuZE1lc3NhZ2UKICAgICAgICBsZXQgcmVzID0gewogICAgICAgICAgICBtb2RlOiAncmV0dXJuJywKICAgICAgICAgICAgaWQ6IGRhdGEuaWQsCiAgICAgICAgICAgIGZ1bjogZGF0YS5mdW4sCiAgICAgICAgICAgIHN0YXRlLAogICAgICAgICAgICBtc2csCiAgICAgICAgfQogICAgICAgIHNlbmRNZXNzYWdlKHJlcykKCiAgICB9Cgp9CgpmdW5jdGlvbiByZWN2TWVzc2FnZShkYXRhKSB7CiAgICAvLyBjb25zb2xlLmxvZygnaW5uZXIgd29ya2VyIHJlY3Y6JywgZGF0YSkKCiAgICAvL2RhdGFSZWN2CiAgICBsZXQgZGF0YVJlY3YgPSBkYXRhCgogICAgLy9ydW4KICAgIHJ1bihkYXRhUmVjdikKCn0KCgogICAgICAgIHNlbGYub25tZXNzYWdlID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgcmVjdk1lc3NhZ2UoZS5kYXRhKQogICAgICAgIH0KICAgICAgICAKCg==");function d(){let d=new Y,l=function(b){try{let d=new Blob([b]),l=window.URL||window.webkitURL;return new Worker(l.createObjectURL(d))}catch(b){m(b)}}(b);if(!l)return m("invalid worker"),null;function Z(){let b=function(){let b,d,l=new Promise((function(){b=arguments[0],d=arguments[1]}));return l.resolve=b,l.reject=d,l}(),Z=function(){let b=arguments.length>0&&void 0!==arguments[0]?arguments[0]:10,d=[],l="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""),Z=l.length;for(let m=0;m<b;m++)d[m]=l[0|Math.random()*Z];return d.join("")}(),m={mode:"call",id:Z,fun:"main",input:[...arguments]};return l.postMessage(m),d.once(Z,(d=>{"success"===d.state?b.resolve(d.msg):b.reject(d.msg)})),b}function m(b){d.emit("error",b)}return l.onmessage=function(b){!function(b){let l=b,Z=l.mode;"emit"!==Z&&"return"!==Z||("emit"===Z&&d.emit(l.evName,l.msg),"return"===Z&&d.emit(l.id,l))}(b.data)},l.onerror=m,function(){let b={mode:"init",type:"function",input:[...arguments]};l.postMessage(b)}([...arguments]),d.main=Z,d.main=Z,d.terminate=function(){l?(l.terminate(),l=void 0):m("worker has been terminated")},d}x=async function(){let b=[...arguments],l=d();return await l.main(...b).finally((()=>{l.terminate()}))}}(),x}()}({get exports(){return Z},set exports(b){Z=b}});var m=Z;let X;return X="undefined"!=typeof window&&void 0!==window.document?m:l,X}));
|