w-cluster 1.0.18 → 1.0.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- !function(d,l){"object"==typeof exports&&"undefined"!=typeof module?module.exports=l(require("worker_threads")):"function"==typeof define&&define.amd?define(["worker_threads"],l):(d="undefined"!=typeof globalThis?globalThis:d||self)["w-cluster"]=l(d.worker_threads)}(this,(function(d){"use strict";"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;var l={};!function(l,b){l.exports=function(d){var l={};!function(d){var l=Object.prototype.hasOwnProperty,b="~";function Z(){}function c(d,l,b){this.fn=d,this.context=l,this.once=b||!1}function X(d,l,Z,X,G){if("function"!=typeof Z)throw new TypeError("The listener must be a function");var m=new c(Z,X||d,G),y=b?b+l:l;return d._events[y]?d._events[y].fn?d._events[y]=[d._events[y],m]:d._events[y].push(m):(d._events[y]=m,d._eventsCount++),d}function G(d,l){0==--d._eventsCount?d._events=new Z:delete d._events[l]}function m(){this._events=new Z,this._eventsCount=0}Object.create&&(Z.prototype=Object.create(null),(new Z).__proto__||(b=!1)),m.prototype.eventNames=function(){var d,Z,c=[];if(0===this._eventsCount)return c;for(Z in d=this._events)l.call(d,Z)&&c.push(b?Z.slice(1):Z);return Object.getOwnPropertySymbols?c.concat(Object.getOwnPropertySymbols(d)):c},m.prototype.listeners=function(d){var l=b?b+d:d,Z=this._events[l];if(!Z)return[];if(Z.fn)return[Z.fn];for(var c=0,X=Z.length,G=new Array(X);c<X;c++)G[c]=Z[c].fn;return G},m.prototype.listenerCount=function(d){var l=b?b+d:d,Z=this._events[l];return Z?Z.fn?1:Z.length:0},m.prototype.emit=function(d,l,Z,c,X,G){var m=b?b+d:d;if(!this._events[m])return!1;var y,K,W=this._events[m],p=arguments.length;if(W.fn){switch(W.once&&this.removeListener(d,W.fn,void 0,!0),p){case 1:return W.fn.call(W.context),!0;case 2:return W.fn.call(W.context,l),!0;case 3:return W.fn.call(W.context,l,Z),!0;case 4:return W.fn.call(W.context,l,Z,c),!0;case 5:return W.fn.call(W.context,l,Z,c,X),!0;case 6:return W.fn.call(W.context,l,Z,c,X,G),!0}for(K=1,y=new Array(p-1);K<p;K++)y[K-1]=arguments[K];W.fn.apply(W.context,y)}else{var I,V=W.length;for(K=0;K<V;K++)switch(W[K].once&&this.removeListener(d,W[K].fn,void 0,!0),p){case 1:W[K].fn.call(W[K].context);break;case 2:W[K].fn.call(W[K].context,l);break;case 3:W[K].fn.call(W[K].context,l,Z);break;case 4:W[K].fn.call(W[K].context,l,Z,c);break;default:if(!y)for(I=1,y=new Array(p-1);I<p;I++)y[I-1]=arguments[I];W[K].fn.apply(W[K].context,y)}}return!0},m.prototype.on=function(d,l,b){return X(this,d,l,b,!1)},m.prototype.once=function(d,l,b){return X(this,d,l,b,!0)},m.prototype.removeListener=function(d,l,Z,c){var X=b?b+d:d;if(!this._events[X])return this;if(!l)return G(this,X),this;var m=this._events[X];if(m.fn)m.fn!==l||c&&!m.once||Z&&m.context!==Z||G(this,X);else{for(var y=0,K=[],W=m.length;y<W;y++)(m[y].fn!==l||c&&!m[y].once||Z&&m[y].context!==Z)&&K.push(m[y]);K.length?this._events[X]=1===K.length?K[0]:K:G(this,X)}return this},m.prototype.removeAllListeners=function(d){var l;return d?(l=b?b+d:d,this._events[l]&&G(this,l)):(this._events=new Z,this._eventsCount=0),this},m.prototype.off=m.prototype.removeListener,m.prototype.addListener=m.prototype.on,m.prefixed=b,m.EventEmitter=m,d.exports=m}({get exports(){return l},set exports(d){l=d}});var b=l;let Z;return function(){if("nodejs"!=("undefined"!=typeof window&&void 0!==window.document?"browser":"nodejs"))return null;function l(){return new b}function c(){let d,l,b=new Promise((function(){d=arguments[0],l=arguments[1]}));return b.resolve=d,b.reject=l,b}function X(){let d=arguments.length>0&&void 0!==arguments[0]?arguments[0]:10,l=[],b="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""),Z=b.length;for(let c=0;c<d;c++)l[c]=b[0|Math.random()*Z];return l.join("")}let G=(m="CgogICAgICAgIGxldCB7IHBhcmVudFBvcnQgfSA9IHJlcXVpcmUoJ3dvcmtlcl90aHJlYWRzJykKICAgICAgICAKCnZhciB0PSJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsVGhpcz9nbG9iYWxUaGlzOiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzoidW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbD9nbG9iYWw6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmP3NlbGY6e307ZnVuY3Rpb24gZSh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwiZGVmYXVsdCIpP3QuZGVmYXVsdDp0fXZhciByPUFycmF5LmlzQXJyYXksbj0ib2JqZWN0Ij09dHlwZW9mIHQmJnQmJnQuT2JqZWN0PT09T2JqZWN0JiZ0LG89bixzPSJvYmplY3QiPT10eXBlb2Ygc2VsZiYmc2VsZiYmc2VsZi5PYmplY3Q9PT1PYmplY3QmJnNlbGYsaT1vfHxzfHxGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpLHU9aS5TeW1ib2wsYT11LGw9T2JqZWN0LnByb3RvdHlwZSxoPWwuaGFzT3duUHJvcGVydHksYz1sLnRvU3RyaW5nLGY9YT9hLnRvU3RyaW5nVGFnOnZvaWQgMDt2YXIgbT1mdW5jdGlvbih0KXt2YXIgZT1oLmNhbGwodCxmKSxyPXRbZl07dHJ5e3RbZl09dm9pZCAwO3ZhciBuPSEwfWNhdGNoKHQpe312YXIgbz1jLmNhbGwodCk7cmV0dXJuIG4mJihlP3RbZl09cjpkZWxldGUgdFtmXSksb30sZz1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO3ZhciBwPW0sdz1mdW5jdGlvbih0KXtyZXR1cm4gZy5jYWxsKHQpfSxkPXU/dS50b1N0cmluZ1RhZzp2b2lkIDA7dmFyIGI9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dm9pZCAwPT09dD8iW29iamVjdCBVbmRlZmluZWRdIjoiW29iamVjdCBOdWxsXSI6ZCYmZCBpbiBPYmplY3QodCk/cCh0KTp3KHQpfTt2YXIgeT1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dCYmIm9iamVjdCI9PXR5cGVvZiB0fSx2PWIsTT15O3ZhciBqPWZ1bmN0aW9uKHQpe3JldHVybiJzeW1ib2wiPT10eXBlb2YgdHx8TSh0KSYmIltvYmplY3QgU3ltYm9sXSI9PXYodCl9LHg9cixfPWosRT0vXC58XFsoPzpbXltcXV0qfChbIiddKSg/Oig/IVwxKVteXFxdfFxcLikqP1wxKVxdLyxTPS9eXHcqJC87dmFyIE89ZnVuY3Rpb24odCxlKXtpZih4KHQpKXJldHVybiExO3ZhciByPXR5cGVvZiB0O3JldHVybiEoIm51bWJlciIhPXImJiJzeW1ib2wiIT1yJiYiYm9vbGVhbiIhPXImJm51bGwhPXQmJiFfKHQpKXx8KFMudGVzdCh0KXx8IUUudGVzdCh0KXx8bnVsbCE9ZSYmdCBpbiBPYmplY3QoZSkpfTt2YXIgQT1mdW5jdGlvbih0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4gbnVsbCE9dCYmKCJvYmplY3QiPT1lfHwiZnVuY3Rpb24iPT1lKX0sQz1iLFI9QTt2YXIgSSxOPWZ1bmN0aW9uKHQpe2lmKCFSKHQpKXJldHVybiExO3ZhciBlPUModCk7cmV0dXJuIltvYmplY3QgRnVuY3Rpb25dIj09ZXx8IltvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dIj09ZXx8IltvYmplY3QgQXN5bmNGdW5jdGlvbl0iPT1lfHwiW29iamVjdCBQcm94eV0iPT1lfSxrPWlbIl9fY29yZS1qc19zaGFyZWRfXyJdLEY9KEk9L1teLl0rJC8uZXhlYyhrJiZrLmtleXMmJmsua2V5cy5JRV9QUk9UT3x8IiIpKT8iU3ltYm9sKHNyYylfMS4iK0k6IiI7dmFyIFA9ZnVuY3Rpb24odCl7cmV0dXJuISFGJiZGIGluIHR9LFQ9RnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nO3ZhciB6PWZ1bmN0aW9uKHQpe2lmKG51bGwhPXQpe3RyeXtyZXR1cm4gVC5jYWxsKHQpfWNhdGNoKHQpe310cnl7cmV0dXJuIHQrIiJ9Y2F0Y2godCl7fX1yZXR1cm4iIn0sVj1OLCQ9UCxxPUEsRD16LFU9L15cW29iamVjdCAuKz9Db25zdHJ1Y3RvclxdJC8sTD1GdW5jdGlvbi5wcm90b3R5cGUsQj1PYmplY3QucHJvdG90eXBlLEc9TC50b1N0cmluZyxXPUIuaGFzT3duUHJvcGVydHksSz1SZWdFeHAoIl4iK0cuY2FsbChXKS5yZXBsYWNlKC9bXFxeJC4qKz8oKVtcXXt9fF0vZywiXFwkJiIpLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFwoKXwgZm9yIC4rPyg/PVxcXF0pL2csIiQxLio/IikrIiQiKTt2YXIgWT1mdW5jdGlvbih0KXtyZXR1cm4hKCFxKHQpfHwkKHQpKSYmKFYodCk/SzpVKS50ZXN0KEQodCkpfSxYPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGw9PXQ/dm9pZCAwOnRbZV19O3ZhciBKPWZ1bmN0aW9uKHQsZSl7dmFyIHI9WCh0LGUpO3JldHVybiBZKHIpP3I6dm9pZCAwfSxaPUooT2JqZWN0LCJjcmVhdGUiKSxIPVo7dmFyIFE9ZnVuY3Rpb24oKXt0aGlzLl9fZGF0YV9fPUg/SChudWxsKTp7fSx0aGlzLnNpemU9MH07dmFyIHR0PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuaGFzKHQpJiZkZWxldGUgdGhpcy5fX2RhdGFfX1t0XTtyZXR1cm4gdGhpcy5zaXplLT1lPzE6MCxlfSxldD1aLHJ0PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dmFyIG50PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX19kYXRhX187aWYoZXQpe3ZhciByPWVbdF07cmV0dXJuIl9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iPT09cj92b2lkIDA6cn1yZXR1cm4gcnQuY2FsbChlLHQpP2VbdF06dm9pZCAwfSxvdD1aLHN0PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dmFyIGl0PVo7dmFyIHV0PVEsYXQ9dHQsbHQ9bnQsaHQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXztyZXR1cm4gb3Q/dm9pZCAwIT09ZVt0XTpzdC5jYWxsKGUsdCl9LGN0PWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5fX2RhdGFfXztyZXR1cm4gdGhpcy5zaXplKz10aGlzLmhhcyh0KT8wOjEsclt0XT1pdCYmdm9pZCAwPT09ZT8iX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyI6ZSx0aGlzfTtmdW5jdGlvbiBmdCh0KXt2YXIgZT0tMSxyPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxyOyl7dmFyIG49dFtlXTt0aGlzLnNldChuWzBdLG5bMV0pfX1mdC5wcm90b3R5cGUuY2xlYXI9dXQsZnQucHJvdG90eXBlLmRlbGV0ZT1hdCxmdC5wcm90b3R5cGUuZ2V0PWx0LGZ0LnByb3RvdHlwZS5oYXM9aHQsZnQucHJvdG90eXBlLnNldD1jdDt2YXIgbXQ9ZnQ7dmFyIGd0PWZ1bmN0aW9uKCl7dGhpcy5fX2RhdGFfXz1bXSx0aGlzLnNpemU9MH07dmFyIHB0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PT1lfHx0IT10JiZlIT1lfSx3dD1wdDt2YXIgZHQ9ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9dC5sZW5ndGg7ci0tOylpZih3dCh0W3JdWzBdLGUpKXJldHVybiByO3JldHVybi0xfSxidD1kdCx5dD1BcnJheS5wcm90b3R5cGUuc3BsaWNlO3ZhciB2dD1kdDt2YXIgTXQ9ZHQ7dmFyIGp0PWR0O3ZhciB4dD1ndCxfdD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fLHI9YnQoZSx0KTtyZXR1cm4hKHI8MCkmJihyPT1lLmxlbmd0aC0xP2UucG9wKCk6eXQuY2FsbChlLHIsMSksLS10aGlzLnNpemUsITApfSxFdD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fLHI9dnQoZSx0KTtyZXR1cm4gcjwwP3ZvaWQgMDplW3JdWzFdfSxTdD1mdW5jdGlvbih0KXtyZXR1cm4gTXQodGhpcy5fX2RhdGFfXyx0KT4tMX0sT3Q9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLl9fZGF0YV9fLG49anQocix0KTtyZXR1cm4gbjwwPygrK3RoaXMuc2l6ZSxyLnB1c2goW3QsZV0pKTpyW25dWzFdPWUsdGhpc307ZnVuY3Rpb24gQXQodCl7dmFyIGU9LTEscj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8cjspe3ZhciBuPXRbZV07dGhpcy5zZXQoblswXSxuWzFdKX19QXQucHJvdG90eXBlLmNsZWFyPXh0LEF0LnByb3RvdHlwZS5kZWxldGU9X3QsQXQucHJvdG90eXBlLmdldD1FdCxBdC5wcm90b3R5cGUuaGFzPVN0LEF0LnByb3RvdHlwZS5zZXQ9T3Q7dmFyIEN0PUF0LFJ0PUooaSwiTWFwIiksSXQ9bXQsTnQ9Q3Qsa3Q9UnQ7dmFyIEZ0PWZ1bmN0aW9uKHQpe3ZhciBlPXR5cGVvZiB0O3JldHVybiJzdHJpbmciPT1lfHwibnVtYmVyIj09ZXx8InN5bWJvbCI9PWV8fCJib29sZWFuIj09ZT8iX19wcm90b19fIiE9PXQ6bnVsbD09PXR9O3ZhciBQdD1mdW5jdGlvbih0LGUpe3ZhciByPXQuX19kYXRhX187cmV0dXJuIEZ0KGUpP3JbInN0cmluZyI9PXR5cGVvZiBlPyJzdHJpbmciOiJoYXNoIl06ci5tYXB9LFR0PVB0O3ZhciB6dD1QdDt2YXIgVnQ9UHQ7dmFyICR0PVB0O3ZhciBxdD1mdW5jdGlvbih0LGUpe3ZhciByPSR0KHRoaXMsdCksbj1yLnNpemU7cmV0dXJuIHIuc2V0KHQsZSksdGhpcy5zaXplKz1yLnNpemU9PW4/MDoxLHRoaXN9LER0PWZ1bmN0aW9uKCl7dGhpcy5zaXplPTAsdGhpcy5fX2RhdGFfXz17aGFzaDpuZXcgSXQsbWFwOm5ldyhrdHx8TnQpLHN0cmluZzpuZXcgSXR9fSxVdD1mdW5jdGlvbih0KXt2YXIgZT1UdCh0aGlzLHQpLmRlbGV0ZSh0KTtyZXR1cm4gdGhpcy5zaXplLT1lPzE6MCxlfSxMdD1mdW5jdGlvbih0KXtyZXR1cm4genQodGhpcyx0KS5nZXQodCl9LEJ0PWZ1bmN0aW9uKHQpe3JldHVybiBWdCh0aGlzLHQpLmhhcyh0KX0sR3Q9cXQ7ZnVuY3Rpb24gV3QodCl7dmFyIGU9LTEscj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8cjspe3ZhciBuPXRbZV07dGhpcy5zZXQoblswXSxuWzFdKX19V3QucHJvdG90eXBlLmNsZWFyPUR0LFd0LnByb3RvdHlwZS5kZWxldGU9VXQsV3QucHJvdG90eXBlLmdldD1MdCxXdC5wcm90b3R5cGUuaGFzPUJ0LFd0LnByb3RvdHlwZS5zZXQ9R3Q7dmFyIEt0PVd0LFl0PUt0O2Z1bmN0aW9uIFh0KHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHR8fG51bGwhPWUmJiJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIkV4cGVjdGVkIGEgZnVuY3Rpb24iKTt2YXIgcj1mdW5jdGlvbigpe3ZhciBuPWFyZ3VtZW50cyxvPWU/ZS5hcHBseSh0aGlzLG4pOm5bMF0scz1yLmNhY2hlO2lmKHMuaGFzKG8pKXJldHVybiBzLmdldChvKTt2YXIgaT10LmFwcGx5KHRoaXMsbik7cmV0dXJuIHIuY2FjaGU9cy5zZXQobyxpKXx8cyxpfTtyZXR1cm4gci5jYWNoZT1uZXcoWHQuQ2FjaGV8fFl0KSxyfVh0LkNhY2hlPVl0O3ZhciBKdD1YdDt2YXIgWnQ9ZnVuY3Rpb24odCl7dmFyIGU9SnQodCwoZnVuY3Rpb24odCl7cmV0dXJuIDUwMD09PXIuc2l6ZSYmci5jbGVhcigpLHR9KSkscj1lLmNhY2hlO3JldHVybiBlfSxIdD0vW14uW1xdXSt8XFsoPzooLT9cZCsoPzpcLlxkKyk/KXwoWyInXSkoKD86KD8hXDIpW15cXF18XFwuKSo/KVwyKVxdfCg/PSg/OlwufFxbXF0pKD86XC58XFtcXXwkKSkvZyxRdD0vXFwoXFwpPy9nLHRlPVp0KChmdW5jdGlvbih0KXt2YXIgZT1bXTtyZXR1cm4gNDY9PT10LmNoYXJDb2RlQXQoMCkmJmUucHVzaCgiIiksdC5yZXBsYWNlKEh0LChmdW5jdGlvbih0LHIsbixvKXtlLnB1c2gobj9vLnJlcGxhY2UoUXQsIiQxIik6cnx8dCl9KSksZX0pKTt2YXIgZWU9ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9LTEsbj1udWxsPT10PzA6dC5sZW5ndGgsbz1BcnJheShuKTsrK3I8bjspb1tyXT1lKHRbcl0scix0KTtyZXR1cm4gb30scmU9ZWUsbmU9cixvZT1qLHNlPXU/dS5wcm90b3R5cGU6dm9pZCAwLGllPXNlP3NlLnRvU3RyaW5nOnZvaWQgMDt2YXIgdWU9ZnVuY3Rpb24gdChlKXtpZigic3RyaW5nIj09dHlwZW9mIGUpcmV0dXJuIGU7aWYobmUoZSkpcmV0dXJuIHJlKGUsdCkrIiI7aWYob2UoZSkpcmV0dXJuIGllP2llLmNhbGwoZSk6IiI7dmFyIHI9ZSsiIjtyZXR1cm4iMCI9PXImJjEvZT09LUluZmluaXR5PyItMCI6cn0sYWU9dWU7dmFyIGxlPXIsaGU9TyxjZT10ZSxmZT1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD8iIjphZSh0KX07dmFyIG1lPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGxlKHQpP3Q6aGUodCxlKT9bdF06Y2UoZmUodCkpfSxnZT1qO3ZhciBwZT1mdW5jdGlvbih0KXtpZigic3RyaW5nIj09dHlwZW9mIHR8fGdlKHQpKXJldHVybiB0O3ZhciBlPXQrIiI7cmV0dXJuIjAiPT1lJiYxL3Q9PS1JbmZpbml0eT8iLTAiOmV9LHdlPW1lLGRlPXBlO3ZhciBiZT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj0wLG49KGU9d2UoZSx0KSkubGVuZ3RoO251bGwhPXQmJnI8bjspdD10W2RlKGVbcisrXSldO3JldHVybiByJiZyPT1uP3Q6dm9pZCAwfSx5ZT1iZTt2YXIgdmU9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPW51bGw9PXQ/dm9pZCAwOnllKHQsZSk7cmV0dXJuIHZvaWQgMD09PW4/cjpufSxNZT1PYmplY3QucHJvdG90eXBlO3ZhciBqZT1mdW5jdGlvbih0KXt2YXIgZT10JiZ0LmNvbnN0cnVjdG9yO3JldHVybiB0PT09KCJmdW5jdGlvbiI9PXR5cGVvZiBlJiZlLnByb3RvdHlwZXx8TWUpfTt2YXIgeGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZnVuY3Rpb24ocil7cmV0dXJuIHQoZShyKSl9fSxfZT14ZShPYmplY3Qua2V5cyxPYmplY3QpLEVlPWplLFNlPV9lLE9lPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dmFyIEFlPWZ1bmN0aW9uKHQpe2lmKCFFZSh0KSlyZXR1cm4gU2UodCk7dmFyIGU9W107Zm9yKHZhciByIGluIE9iamVjdCh0KSlPZS5jYWxsKHQscikmJiJjb25zdHJ1Y3RvciIhPXImJmUucHVzaChyKTtyZXR1cm4gZX0sQ2U9SihpLCJEYXRhVmlldyIpLFJlPVJ0LEllPUooaSwiUHJvbWlzZSIpLE5lPUooaSwiU2V0Iiksa2U9SihpLCJXZWFrTWFwIiksRmU9YixQZT16LFRlPSJbb2JqZWN0IE1hcF0iLHplPSJbb2JqZWN0IFByb21pc2VdIixWZT0iW29iamVjdCBTZXRdIiwkZT0iW29iamVjdCBXZWFrTWFwXSIscWU9IltvYmplY3QgRGF0YVZpZXddIixEZT1QZShDZSksVWU9UGUoUmUpLExlPVBlKEllKSxCZT1QZShOZSksR2U9UGUoa2UpLFdlPUZlOyhDZSYmV2UobmV3IENlKG5ldyBBcnJheUJ1ZmZlcigxKSkpIT1xZXx8UmUmJldlKG5ldyBSZSkhPVRlfHxJZSYmV2UoSWUucmVzb2x2ZSgpKSE9emV8fE5lJiZXZShuZXcgTmUpIT1WZXx8a2UmJldlKG5ldyBrZSkhPSRlKSYmKFdlPWZ1bmN0aW9uKHQpe3ZhciBlPUZlKHQpLHI9IltvYmplY3QgT2JqZWN0XSI9PWU/dC5jb25zdHJ1Y3Rvcjp2b2lkIDAsbj1yP1BlKHIpOiIiO2lmKG4pc3dpdGNoKG4pe2Nhc2UgRGU6cmV0dXJuIHFlO2Nhc2UgVWU6cmV0dXJuIFRlO2Nhc2UgTGU6cmV0dXJuIHplO2Nhc2UgQmU6cmV0dXJuIFZlO2Nhc2UgR2U6cmV0dXJuICRlfXJldHVybiBlfSk7dmFyIEtlPVdlO3ZhciBZZT1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQmJnQ+LTEmJnQlMT09MCYmdDw9OTAwNzE5OTI1NDc0MDk5MX0sWGU9TixKZT1ZZTt2YXIgWmU9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPXQmJkplKHQubGVuZ3RoKSYmIVhlKHQpfSxIZT1iLFFlPXIsdHI9eTt2YXIgZXI9ZnVuY3Rpb24odCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0fHwhUWUodCkmJnRyKHQpJiYiW29iamVjdCBTdHJpbmddIj09SGUodCl9O3ZhciBycj1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/dm9pZCAwOmVbdF19fSxucj1ycigibGVuZ3RoIiksb3I9UmVnRXhwKCJbXFx1MjAwZFxcdWQ4MDAtXFx1ZGZmZlxcdTAzMDAtXFx1MDM2ZlxcdWZlMjAtXFx1ZmUyZlxcdTIwZDAtXFx1MjBmZlxcdWZlMGVcXHVmZTBmXSIpO3ZhciBzcj1mdW5jdGlvbih0KXtyZXR1cm4gb3IudGVzdCh0KX0saXI9IlxcdWQ4MDAtXFx1ZGZmZiIsdXI9IlsiK2lyKyJdIixhcj0iW1xcdTAzMDAtXFx1MDM2ZlxcdWZlMjAtXFx1ZmUyZlxcdTIwZDAtXFx1MjBmZl0iLGxyPSJcXHVkODNjW1xcdWRmZmItXFx1ZGZmZl0iLGhyPSJbXiIraXIrIl0iLGNyPSIoPzpcXHVkODNjW1xcdWRkZTYtXFx1ZGRmZl0pezJ9Iixmcj0iW1xcdWQ4MDAtXFx1ZGJmZl1bXFx1ZGMwMC1cXHVkZmZmXSIsbXI9Iig/OiIrYXIrInwiK2xyKyIpIisiPyIsZ3I9IltcXHVmZTBlXFx1ZmUwZl0/Iixwcj1ncittcisoIig/OlxcdTIwMGQoPzoiK1tocixjcixmcl0uam9pbigifCIpKyIpIitncittcisiKSoiKSx3cj0iKD86IitbaHIrYXIrIj8iLGFyLGNyLGZyLHVyXS5qb2luKCJ8IikrIikiLGRyPVJlZ0V4cChscisiKD89IitscisiKXwiK3dyK3ByLCJnIik7dmFyIGJyPW5yLHlyPXNyLHZyPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1kci5sYXN0SW5kZXg9MDtkci50ZXN0KHQpOykrK2U7cmV0dXJuIGV9O3ZhciBNcj1BZSxqcj1LZSx4cj1aZSxfcj1lcixFcj1mdW5jdGlvbih0KXtyZXR1cm4geXIodCk/dnIodCk6YnIodCl9O3ZhciBTcj1mdW5jdGlvbih0KXtpZihudWxsPT10KXJldHVybiAwO2lmKHhyKHQpKXJldHVybiBfcih0KT9Fcih0KTp0Lmxlbmd0aDt2YXIgZT1qcih0KTtyZXR1cm4iW29iamVjdCBNYXBdIj09ZXx8IltvYmplY3QgU2V0XSI9PWU/dC5zaXplOk1yKHQpLmxlbmd0aH07ZnVuY3Rpb24gT3IodCl7cmV0dXJuIltvYmplY3QgQXJyYXldIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiBBcih0KXtyZXR1cm4iW29iamVjdCBPYmplY3RdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiBDcih0KXtyZXR1cm4iW29iamVjdCBTdHJpbmddIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiBScih0KXtyZXR1cm4gdCE9dH1mdW5jdGlvbiBJcih0KXtyZXR1cm4hIWZ1bmN0aW9uKHQpe3JldHVybiJbb2JqZWN0IFVuZGVmaW5lZF0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfSh0KXx8KCEhZnVuY3Rpb24odCl7cmV0dXJuIltvYmplY3QgTnVsbF0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfSh0KXx8KCEhZnVuY3Rpb24odCl7aWYoQXIodCkpe2ZvcihsZXQgZSBpbiB0KXJldHVybiExO3JldHVybiEwfXJldHVybiExfSh0KXx8KCEhZnVuY3Rpb24odCl7cmV0dXJuISghQ3IodCl8fCIiIT09dCl9KHQpfHwoISFmdW5jdGlvbih0KXtyZXR1cm4hIU9yKHQpJiYwPT09dC5sZW5ndGh9KHQpfHwhIVJyKHQpKSkpKX1mdW5jdGlvbiBOcih0KXtyZXR1cm4hIU9yKHQpJiYoMCE9PXQubGVuZ3RoJiYoMSE9PXQubGVuZ3RofHwhSXIodFswXSkpKX12YXIga3I9Im9iamVjdCI9PXR5cGVvZiBnbG9iYWwmJmdsb2JhbCYmZ2xvYmFsLk9iamVjdD09PU9iamVjdCYmZ2xvYmFsLEZyPSJvYmplY3QiPT10eXBlb2Ygc2VsZiYmc2VsZiYmc2VsZi5PYmplY3Q9PT1PYmplY3QmJnNlbGYsUHI9a3J8fEZyfHxGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpLFRyPVByLlN5bWJvbCx6cj1PYmplY3QucHJvdG90eXBlLFZyPXpyLmhhc093blByb3BlcnR5LCRyPXpyLnRvU3RyaW5nLHFyPVRyP1RyLnRvU3RyaW5nVGFnOnZvaWQgMDt2YXIgRHI9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZzt2YXIgVXI9IltvYmplY3QgTnVsbF0iLExyPSJbb2JqZWN0IFVuZGVmaW5lZF0iLEJyPVRyP1RyLnRvU3RyaW5nVGFnOnZvaWQgMDtmdW5jdGlvbiBHcih0KXtyZXR1cm4gbnVsbD09dD92b2lkIDA9PT10P0xyOlVyOkJyJiZCciBpbiBPYmplY3QodCk/ZnVuY3Rpb24odCl7dmFyIGU9VnIuY2FsbCh0LHFyKSxyPXRbcXJdO3RyeXt0W3FyXT12b2lkIDA7dmFyIG49ITB9Y2F0Y2godCl7fXZhciBvPSRyLmNhbGwodCk7cmV0dXJuIG4mJihlP3RbcXJdPXI6ZGVsZXRlIHRbcXJdKSxvfSh0KTpmdW5jdGlvbih0KXtyZXR1cm4gRHIuY2FsbCh0KX0odCl9ZnVuY3Rpb24gV3IodCl7cmV0dXJuIG51bGwhPXQmJiJvYmplY3QiPT10eXBlb2YgdH12YXIgS3I9IltvYmplY3QgQm9vbGVhbl0iO2Z1bmN0aW9uIFlyKHQpe3JldHVybiEwPT09KGU9dCl8fCExPT09ZXx8V3IoZSkmJkdyKGUpPT1Lcjt2YXIgZX1mdW5jdGlvbiBYcih0KXtyZXR1cm4hKCFDcih0KXx8IiI9PT10KX1mdW5jdGlvbiBKcih0KXtsZXQgZT0hMTtpZihYcih0KSllPSFpc05hTihOdW1iZXIodCkpO2Vsc2UgaWYoZnVuY3Rpb24odCl7cmV0dXJuIltvYmplY3QgTnVtYmVyXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9KHQpKXtpZihScih0KSlyZXR1cm4hMTtlPSEwfXJldHVybiBlfXZhciBacj0vXHMvO3ZhciBIcj0vXlxzKy87ZnVuY3Rpb24gUXIodCl7cmV0dXJuIHQ/dC5zbGljZSgwLGZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10Lmxlbmd0aDtlLS0mJlpyLnRlc3QodC5jaGFyQXQoZSkpOyk7cmV0dXJuIGV9KHQpKzEpLnJlcGxhY2UoSHIsIiIpOnR9ZnVuY3Rpb24gdG4odCl7dmFyIGU9dHlwZW9mIHQ7cmV0dXJuIG51bGwhPXQmJigib2JqZWN0Ij09ZXx8ImZ1bmN0aW9uIj09ZSl9dmFyIGVuPSJbb2JqZWN0IFN5bWJvbF0iO2Z1bmN0aW9uIHJuKHQpe3JldHVybiJzeW1ib2wiPT10eXBlb2YgdHx8V3IodCkmJkdyKHQpPT1lbn12YXIgbm49TmFOLG9uPS9eWy0rXTB4WzAtOWEtZl0rJC9pLHNuPS9eMGJbMDFdKyQvaSx1bj0vXjBvWzAtN10rJC9pLGFuPXBhcnNlSW50O2Z1bmN0aW9uIGxuKHQpe2lmKCJudW1iZXIiPT10eXBlb2YgdClyZXR1cm4gdDtpZihybih0KSlyZXR1cm4gbm47aWYodG4odCkpe3ZhciBlPSJmdW5jdGlvbiI9PXR5cGVvZiB0LnZhbHVlT2Y/dC52YWx1ZU9mKCk6dDt0PXRuKGUpP2UrIiI6ZX1pZigic3RyaW5nIiE9dHlwZW9mIHQpcmV0dXJuIDA9PT10P3Q6K3Q7dD1Rcih0KTt2YXIgcj1zbi50ZXN0KHQpO3JldHVybiByfHx1bi50ZXN0KHQpP2FuKHQuc2xpY2UoMikscj8yOjgpOm9uLnRlc3QodCk/bm46K3R9dmFyIGhuPTEvMCxjbj0xNzk3NjkzMTM0ODYyMzE1N2UyOTI7ZnVuY3Rpb24gZm4odCl7cmV0dXJuIHQ/KHQ9bG4odCkpPT09aG58fHQ9PT0taG4/KHQ8MD8tMToxKSpjbjp0PT10P3Q6MDowPT09dD90OjB9dmFyIG1uPUFycmF5LmlzQXJyYXksZ249MS8wLHBuPVRyP1RyLnByb3RvdHlwZTp2b2lkIDAsd249cG4/cG4udG9TdHJpbmc6dm9pZCAwO2Z1bmN0aW9uIGRuKHQpe2lmKCJzdHJpbmciPT10eXBlb2YgdClyZXR1cm4gdDtpZihtbih0KSlyZXR1cm4gZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9LTEsbj1udWxsPT10PzA6dC5sZW5ndGgsbz1BcnJheShuKTsrK3I8bjspb1tyXT1lKHRbcl0scix0KTtyZXR1cm4gb30odCxkbikrIiI7aWYocm4odCkpcmV0dXJuIHduP3duLmNhbGwodCk6IiI7dmFyIGU9dCsiIjtyZXR1cm4iMCI9PWUmJjEvdD09LWduPyItMCI6ZX1mdW5jdGlvbiBibih0KXtyZXR1cm4gbnVsbD09dD8iIjpkbih0KX12YXIgeW49UHIuaXNGaW5pdGUsdm49TWF0aC5taW47dmFyIE1uLGpuPShNbj1NYXRoWyJyb3VuZCJdLGZ1bmN0aW9uKHQsZSl7aWYodD1sbih0KSxlPW51bGw9PWU/MDp2bihmdW5jdGlvbih0KXt2YXIgZT1mbih0KSxyPWUlMTtyZXR1cm4gZT09ZT9yP2UtcjplOjB9KGUpLDI5MiksZSYmeW4odCkpe3ZhciByPShibih0KSsiZSIpLnNwbGl0KCJlIik7cmV0dXJuKygocj0oYm4oTW4oclswXSsiZSIrKCtyWzFdK2UpKSkrImUiKS5zcGxpdCgiZSIpKVswXSsiZSIrKCtyWzFdLWUpKX1yZXR1cm4gTW4odCl9KTtmdW5jdGlvbiB4bih0KXtpZighSnIodCkpcmV0dXJuIDA7dD1mdW5jdGlvbih0KXtyZXR1cm4gSnIodCk/Zm4odCk6MH0odCk7bGV0IGU9am4odCk7cmV0dXJuIjAiPT09U3RyaW5nKGUpPzA6ZX1jb25zdCBfbj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO2Z1bmN0aW9uIEVuKHQpe3JldHVybiBfbi5jYWxsKHQpLmVuZHNXaXRoKCJBcnJheV0iKX1mdW5jdGlvbiBTbih0KXt2YXIgZSxyPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fTtpZighRW4odCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiaW5wdXQgbXVzdCBiZSBhbiBhcnJheSIpO2lmKDA9PT10Lmxlbmd0aCl0aHJvdyBuZXcgVHlwZUVycm9yKCJpbnB1dCBtdXN0IG5vdCBiZSBlbXB0eSIpO2lmKHZvaWQgMCE9PXIub3V0cHV0KXtpZighRW4oci5vdXRwdXQpKXRocm93IG5ldyBUeXBlRXJyb3IoIm91dHB1dCBvcHRpb24gbXVzdCBiZSBhbiBhcnJheSBpZiBzcGVjaWZpZWQiKTtlPXIub3V0cHV0fWVsc2UgZT1uZXcgQXJyYXkodC5sZW5ndGgpO3ZhciBuPWZ1bmN0aW9uKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fTtpZighRW4odCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiaW5wdXQgbXVzdCBiZSBhbiBhcnJheSIpO2lmKDA9PT10Lmxlbmd0aCl0aHJvdyBuZXcgVHlwZUVycm9yKCJpbnB1dCBtdXN0IG5vdCBiZSBlbXB0eSIpO3ZhciByPWUuZnJvbUluZGV4LG49dm9pZCAwPT09cj8wOnIsbz1lLnRvSW5kZXgscz12b2lkIDA9PT1vP3QubGVuZ3RoOm87aWYobjwwfHxuPj10Lmxlbmd0aHx8IU51bWJlci5pc0ludGVnZXIobikpdGhyb3cgbmV3IEVycm9yKCJmcm9tSW5kZXggbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgc21hbGxlciB0aGFuIGxlbmd0aCIpO2lmKHM8PW58fHM+dC5sZW5ndGh8fCFOdW1iZXIuaXNJbnRlZ2VyKHMpKXRocm93IG5ldyBFcnJvcigidG9JbmRleCBtdXN0IGJlIGFuIGludGVnZXIgZ3JlYXRlciB0aGFuIGZyb21JbmRleCBhbmQgYXQgbW9zdCBlcXVhbCB0byBsZW5ndGgiKTtmb3IodmFyIGk9dFtuXSx1PW4rMTt1PHM7dSsrKXRbdV08aSYmKGk9dFt1XSk7cmV0dXJuIGl9KHQpLG89ZnVuY3Rpb24odCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9O2lmKCFFbih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJpbnB1dCBtdXN0IGJlIGFuIGFycmF5Iik7aWYoMD09PXQubGVuZ3RoKXRocm93IG5ldyBUeXBlRXJyb3IoImlucHV0IG11c3Qgbm90IGJlIGVtcHR5Iik7dmFyIHI9ZS5mcm9tSW5kZXgsbj12b2lkIDA9PT1yPzA6cixvPWUudG9JbmRleCxzPXZvaWQgMD09PW8/dC5sZW5ndGg6bztpZihuPDB8fG4+PXQubGVuZ3RofHwhTnVtYmVyLmlzSW50ZWdlcihuKSl0aHJvdyBuZXcgRXJyb3IoImZyb21JbmRleCBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciBzbWFsbGVyIHRoYW4gbGVuZ3RoIik7aWYoczw9bnx8cz50Lmxlbmd0aHx8IU51bWJlci5pc0ludGVnZXIocykpdGhyb3cgbmV3IEVycm9yKCJ0b0luZGV4IG11c3QgYmUgYW4gaW50ZWdlciBncmVhdGVyIHRoYW4gZnJvbUluZGV4IGFuZCBhdCBtb3N0IGVxdWFsIHRvIGxlbmd0aCIpO2Zvcih2YXIgaT10W25dLHU9bisxO3U8czt1KyspdFt1XT5pJiYoaT10W3VdKTtyZXR1cm4gaX0odCk7aWYobj09PW8pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm1pbmltdW0gYW5kIG1heGltdW0gaW5wdXQgdmFsdWVzIGFyZSBlcXVhbC4gQ2Fubm90IHJlc2NhbGUgYSBjb25zdGFudCBhcnJheSIpO3ZhciBzPXIubWluLGk9dm9pZCAwPT09cz9yLmF1dG9NaW5NYXg/bjowOnMsdT1yLm1heCxhPXZvaWQgMD09PXU/ci5hdXRvTWluTWF4P286MTp1O2lmKGk+PWEpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm1pbiBvcHRpb24gbXVzdCBiZSBzbWFsbGVyIHRoYW4gbWF4IG9wdGlvbiIpO2Zvcih2YXIgbD0oYS1pKS8oby1uKSxoPTA7aDx0Lmxlbmd0aDtoKyspZVtoXT0odFtoXS1uKSpsK2k7cmV0dXJuIGV9Y29uc3QgT249IiAiLnJlcGVhdCgyKSxBbj0iICIucmVwZWF0KDQpO2Z1bmN0aW9uIENuKHQsZT17fSl7Y29uc3R7bWF4Um93czpyPTE1LG1heENvbHVtbnM6bj0xMCxtYXhOdW1TaXplOm89OCxwYWRNaW51czpzPSJhdXRvIn09ZTtyZXR1cm5gJHt0LmNvbnN0cnVjdG9yLm5hbWV9IHtcbiR7T259W1xuJHtBbn0ke2Z1bmN0aW9uKHQsZSxyLG4sbyl7Y29uc3R7cm93czpzLGNvbHVtbnM6aX09dCx1PU1hdGgubWluKHMsZSksYT1NYXRoLm1pbihpLHIpLGw9W107aWYoImF1dG8iPT09byl7bz0hMTt0OmZvcihsZXQgZT0wO2U8dTtlKyspZm9yKGxldCByPTA7cjxhO3IrKylpZih0LmdldChlLHIpPDApe289ITA7YnJlYWsgdH19Zm9yKGxldCBlPTA7ZTx1O2UrKyl7bGV0IHI9W107Zm9yKGxldCBzPTA7czxhO3MrKylyLnB1c2goUm4odC5nZXQoZSxzKSxuLG8pKTtsLnB1c2goYCR7ci5qb2luKCIgIil9YCl9YSE9PWkmJihsW2wubGVuZ3RoLTFdKz1gIC4uLiAke2ktcn0gbW9yZSBjb2x1bW5zYCk7dSE9PXMmJmwucHVzaChgLi4uICR7cy1lfSBtb3JlIHJvd3NgKTtyZXR1cm4gbC5qb2luKGBcbiR7QW59YCl9KHQscixuLG8scyl9XG4ke09ufV1cbiR7T259cm93czogJHt0LnJvd3N9XG4ke09ufWNvbHVtbnM6ICR7dC5jb2x1bW5zfVxufWB9ZnVuY3Rpb24gUm4odCxlLHIpe3JldHVybih0Pj0wJiZyP2AgJHtJbih0LGUtMSl9YDpJbih0LGUpKS5wYWRFbmQoZSl9ZnVuY3Rpb24gSW4odCxlKXtsZXQgcj10LnRvU3RyaW5nKCk7aWYoci5sZW5ndGg8PWUpcmV0dXJuIHI7bGV0IG49dC50b0ZpeGVkKGUpO2lmKG4ubGVuZ3RoPmUmJihuPXQudG9GaXhlZChNYXRoLm1heCgwLGUtKG4ubGVuZ3RoLWUpKSkpLG4ubGVuZ3RoPD1lJiYhbi5zdGFydHNXaXRoKCIwLjAwMCIpJiYhbi5zdGFydHNXaXRoKCItMC4wMDAiKSlyZXR1cm4gbjtsZXQgbz10LnRvRXhwb25lbnRpYWwoZSk7cmV0dXJuIG8ubGVuZ3RoPmUmJihvPXQudG9FeHBvbmVudGlhbChNYXRoLm1heCgwLGUtKG8ubGVuZ3RoLWUpKSkpLG8uc2xpY2UoMCl9ZnVuY3Rpb24gTm4odCxlLHIpe2xldCBuPXI/dC5yb3dzOnQucm93cy0xO2lmKGU8MHx8ZT5uKXRocm93IG5ldyBSYW5nZUVycm9yKCJSb3cgaW5kZXggb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24ga24odCxlLHIpe2xldCBuPXI/dC5jb2x1bW5zOnQuY29sdW1ucy0xO2lmKGU8MHx8ZT5uKXRocm93IG5ldyBSYW5nZUVycm9yKCJDb2x1bW4gaW5kZXggb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gRm4odCxlKXtpZihlLnRvMURBcnJheSYmKGU9ZS50bzFEQXJyYXkoKSksZS5sZW5ndGghPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoInZlY3RvciBzaXplIG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiBjb2x1bW5zIik7cmV0dXJuIGV9ZnVuY3Rpb24gUG4odCxlKXtpZihlLnRvMURBcnJheSYmKGU9ZS50bzFEQXJyYXkoKSksZS5sZW5ndGghPT10LnJvd3MpdGhyb3cgbmV3IFJhbmdlRXJyb3IoInZlY3RvciBzaXplIG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiByb3dzIik7cmV0dXJuIGV9ZnVuY3Rpb24gVG4odCxlLHIsbixvKXtpZig1IT09YXJndW1lbnRzLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiZXhwZWN0ZWQgNCBhcmd1bWVudHMiKTtpZihWbigic3RhcnRSb3ciLGUpLFZuKCJlbmRSb3ciLHIpLFZuKCJzdGFydENvbHVtbiIsbiksVm4oImVuZENvbHVtbiIsbyksZT5yfHxuPm98fGU8MHx8ZT49dC5yb3dzfHxyPDB8fHI+PXQucm93c3x8bjwwfHxuPj10LmNvbHVtbnN8fG88MHx8bz49dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJTdWJtYXRyaXggaW5kaWNlcyBhcmUgb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gem4odCxlPTApe2xldCByPVtdO2ZvcihsZXQgbj0wO248dDtuKyspci5wdXNoKGUpO3JldHVybiByfWZ1bmN0aW9uIFZuKHQsZSl7aWYoIm51bWJlciIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoYCR7dH0gbXVzdCBiZSBhIG51bWJlcmApfWZ1bmN0aW9uICRuKHQpe2lmKHQuaXNFbXB0eSgpKXRocm93IG5ldyBFcnJvcigiRW1wdHkgbWF0cml4IGhhcyBubyBlbGVtZW50cyB0byBpbmRleCIpfWNsYXNzIHFue3N0YXRpYyBmcm9tMURBcnJheSh0LGUscil7aWYodCplIT09ci5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoImRhdGEgbGVuZ3RoIGRvZXMgbm90IG1hdGNoIGdpdmVuIGRpbWVuc2lvbnMiKTtsZXQgbj1uZXcgVW4odCxlKTtmb3IobGV0IG89MDtvPHQ7bysrKWZvcihsZXQgdD0wO3Q8ZTt0Kyspbi5zZXQobyx0LHJbbyplK3RdKTtyZXR1cm4gbn1zdGF0aWMgcm93VmVjdG9yKHQpe2xldCBlPW5ldyBVbigxLHQubGVuZ3RoKTtmb3IobGV0IHI9MDtyPHQubGVuZ3RoO3IrKyllLnNldCgwLHIsdFtyXSk7cmV0dXJuIGV9c3RhdGljIGNvbHVtblZlY3Rvcih0KXtsZXQgZT1uZXcgVW4odC5sZW5ndGgsMSk7Zm9yKGxldCByPTA7cjx0Lmxlbmd0aDtyKyspZS5zZXQociwwLHRbcl0pO3JldHVybiBlfXN0YXRpYyB6ZXJvcyh0LGUpe3JldHVybiBuZXcgVW4odCxlKX1zdGF0aWMgb25lcyh0LGUpe3JldHVybiBuZXcgVW4odCxlKS5maWxsKDEpfXN0YXRpYyByYW5kKHQsZSxyPXt9KXtpZigib2JqZWN0IiE9dHlwZW9mIHIpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIpO2NvbnN0e3JhbmRvbTpuPU1hdGgucmFuZG9tfT1yO2xldCBvPW5ldyBVbih0LGUpO2ZvcihsZXQgcj0wO3I8dDtyKyspZm9yKGxldCB0PTA7dDxlO3QrKylvLnNldChyLHQsbigpKTtyZXR1cm4gb31zdGF0aWMgcmFuZEludCh0LGUscj17fSl7aWYoIm9iamVjdCIhPXR5cGVvZiByKXRocm93IG5ldyBUeXBlRXJyb3IoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiKTtjb25zdHttaW46bj0wLG1heDpvPTFlMyxyYW5kb206cz1NYXRoLnJhbmRvbX09cjtpZighTnVtYmVyLmlzSW50ZWdlcihuKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJtaW4gbXVzdCBiZSBhbiBpbnRlZ2VyIik7aWYoIU51bWJlci5pc0ludGVnZXIobykpdGhyb3cgbmV3IFR5cGVFcnJvcigibWF4IG11c3QgYmUgYW4gaW50ZWdlciIpO2lmKG4+PW8pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm1pbiBtdXN0IGJlIHNtYWxsZXIgdGhhbiBtYXgiKTtsZXQgaT1vLW4sdT1uZXcgVW4odCxlKTtmb3IobGV0IHI9MDtyPHQ7cisrKWZvcihsZXQgdD0wO3Q8ZTt0Kyspe2xldCBlPW4rTWF0aC5yb3VuZChzKCkqaSk7dS5zZXQocix0LGUpfXJldHVybiB1fXN0YXRpYyBleWUodCxlLHIpe3ZvaWQgMD09PWUmJihlPXQpLHZvaWQgMD09PXImJihyPTEpO2xldCBuPU1hdGgubWluKHQsZSksbz10aGlzLnplcm9zKHQsZSk7Zm9yKGxldCB0PTA7dDxuO3QrKylvLnNldCh0LHQscik7cmV0dXJuIG99c3RhdGljIGRpYWcodCxlLHIpe2xldCBuPXQubGVuZ3RoO3ZvaWQgMD09PWUmJihlPW4pLHZvaWQgMD09PXImJihyPWUpO2xldCBvPU1hdGgubWluKG4sZSxyKSxzPXRoaXMuemVyb3MoZSxyKTtmb3IobGV0IGU9MDtlPG87ZSsrKXMuc2V0KGUsZSx0W2VdKTtyZXR1cm4gc31zdGF0aWMgbWluKHQsZSl7dD10aGlzLmNoZWNrTWF0cml4KHQpLGU9dGhpcy5jaGVja01hdHJpeChlKTtsZXQgcj10LnJvd3Msbj10LmNvbHVtbnMsbz1uZXcgVW4ocixuKTtmb3IobGV0IHM9MDtzPHI7cysrKWZvcihsZXQgcj0wO3I8bjtyKyspby5zZXQocyxyLE1hdGgubWluKHQuZ2V0KHMsciksZS5nZXQocyxyKSkpO3JldHVybiBvfXN0YXRpYyBtYXgodCxlKXt0PXRoaXMuY2hlY2tNYXRyaXgodCksZT10aGlzLmNoZWNrTWF0cml4KGUpO2xldCByPXQucm93cyxuPXQuY29sdW1ucyxvPW5ldyB0aGlzKHIsbik7Zm9yKGxldCBzPTA7czxyO3MrKylmb3IobGV0IHI9MDtyPG47cisrKW8uc2V0KHMscixNYXRoLm1heCh0LmdldChzLHIpLGUuZ2V0KHMscikpKTtyZXR1cm4gb31zdGF0aWMgY2hlY2tNYXRyaXgodCl7cmV0dXJuIHFuLmlzTWF0cml4KHQpP3Q6bmV3IFVuKHQpfXN0YXRpYyBpc01hdHJpeCh0KXtyZXR1cm4gbnVsbCE9dCYmIk1hdHJpeCI9PT10LmtsYXNzfWdldCBzaXplKCl7cmV0dXJuIHRoaXMucm93cyp0aGlzLmNvbHVtbnN9YXBwbHkodCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiY2FsbGJhY2sgbXVzdCBiZSBhIGZ1bmN0aW9uIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0LmNhbGwodGhpcyxlLHIpO3JldHVybiB0aGlzfXRvMURBcnJheSgpe2xldCB0PVtdO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdC5wdXNoKHRoaXMuZ2V0KGUscikpO3JldHVybiB0fXRvMkRBcnJheSgpe2xldCB0PVtdO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKyl7dC5wdXNoKFtdKTtmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdFtlXS5wdXNoKHRoaXMuZ2V0KGUscikpfXJldHVybiB0fXRvSlNPTigpe3JldHVybiB0aGlzLnRvMkRBcnJheSgpfWlzUm93VmVjdG9yKCl7cmV0dXJuIDE9PT10aGlzLnJvd3N9aXNDb2x1bW5WZWN0b3IoKXtyZXR1cm4gMT09PXRoaXMuY29sdW1uc31pc1ZlY3Rvcigpe3JldHVybiAxPT09dGhpcy5yb3dzfHwxPT09dGhpcy5jb2x1bW5zfWlzU3F1YXJlKCl7cmV0dXJuIHRoaXMucm93cz09PXRoaXMuY29sdW1uc31pc0VtcHR5KCl7cmV0dXJuIDA9PT10aGlzLnJvd3N8fDA9PT10aGlzLmNvbHVtbnN9aXNTeW1tZXRyaWMoKXtpZih0aGlzLmlzU3F1YXJlKCkpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPD10O2UrKylpZih0aGlzLmdldCh0LGUpIT09dGhpcy5nZXQoZSx0KSlyZXR1cm4hMTtyZXR1cm4hMH1yZXR1cm4hMX1pc0VjaGVsb25Gb3JtKCl7bGV0IHQ9MCxlPTAscj0tMSxuPSEwLG89ITE7Zm9yKDt0PHRoaXMucm93cyYmbjspe2ZvcihlPTAsbz0hMTtlPHRoaXMuY29sdW1ucyYmITE9PT1vOykwPT09dGhpcy5nZXQodCxlKT9lKys6MT09PXRoaXMuZ2V0KHQsZSkmJmU+cj8obz0hMCxyPWUpOihuPSExLG89ITApO3QrK31yZXR1cm4gbn1pc1JlZHVjZWRFY2hlbG9uRm9ybSgpe2xldCB0PTAsZT0wLHI9LTEsbj0hMCxvPSExO2Zvcig7dDx0aGlzLnJvd3MmJm47KXtmb3IoZT0wLG89ITE7ZTx0aGlzLmNvbHVtbnMmJiExPT09bzspMD09PXRoaXMuZ2V0KHQsZSk/ZSsrOjE9PT10aGlzLmdldCh0LGUpJiZlPnI/KG89ITAscj1lKToobj0hMSxvPSEwKTtmb3IobGV0IHI9ZSsxO3I8dGhpcy5yb3dzO3IrKykwIT09dGhpcy5nZXQodCxyKSYmKG49ITEpO3QrK31yZXR1cm4gbn1lY2hlbG9uRm9ybSgpe2xldCB0PXRoaXMuY2xvbmUoKSxlPTAscj0wO2Zvcig7ZTx0LnJvd3MmJnI8dC5jb2x1bW5zOyl7bGV0IG49ZTtmb3IobGV0IG89ZTtvPHQucm93cztvKyspdC5nZXQobyxyKT50LmdldChuLHIpJiYobj1vKTtpZigwPT09dC5nZXQobixyKSlyKys7ZWxzZXt0LnN3YXBSb3dzKGUsbik7bGV0IG89dC5nZXQoZSxyKTtmb3IobGV0IG49cjtuPHQuY29sdW1ucztuKyspdC5zZXQoZSxuLHQuZ2V0KGUsbikvbyk7Zm9yKGxldCBuPWUrMTtuPHQucm93cztuKyspe2xldCBvPXQuZ2V0KG4scikvdC5nZXQoZSxyKTt0LnNldChuLHIsMCk7Zm9yKGxldCBzPXIrMTtzPHQuY29sdW1ucztzKyspdC5zZXQobixzLHQuZ2V0KG4scyktdC5nZXQoZSxzKSpvKX1lKysscisrfX1yZXR1cm4gdH1yZWR1Y2VkRWNoZWxvbkZvcm0oKXtsZXQgdD10aGlzLmVjaGVsb25Gb3JtKCksZT10LmNvbHVtbnMscj10LnJvd3Msbj1yLTE7Zm9yKDtuPj0wOylpZigwPT09dC5tYXhSb3cobikpbi0tO2Vsc2V7bGV0IG89MCxzPSExO2Zvcig7bzxyJiYhMT09PXM7KTE9PT10LmdldChuLG8pP3M9ITA6bysrO2ZvcihsZXQgcj0wO3I8bjtyKyspe2xldCBzPXQuZ2V0KHIsbyk7Zm9yKGxldCBpPW87aTxlO2krKyl7bGV0IGU9dC5nZXQocixpKS1zKnQuZ2V0KG4saSk7dC5zZXQocixpLGUpfX1uLS19cmV0dXJuIHR9c2V0KCl7dGhyb3cgbmV3IEVycm9yKCJzZXQgbWV0aG9kIGlzIHVuaW1wbGVtZW50ZWQiKX1nZXQoKXt0aHJvdyBuZXcgRXJyb3IoImdldCBtZXRob2QgaXMgdW5pbXBsZW1lbnRlZCIpfXJlcGVhdCh0PXt9KXtpZigib2JqZWN0IiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIpO2NvbnN0e3Jvd3M6ZT0xLGNvbHVtbnM6cj0xfT10O2lmKCFOdW1iZXIuaXNJbnRlZ2VyKGUpfHxlPD0wKXRocm93IG5ldyBUeXBlRXJyb3IoInJvd3MgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIiKTtpZighTnVtYmVyLmlzSW50ZWdlcihyKXx8cjw9MCl0aHJvdyBuZXcgVHlwZUVycm9yKCJjb2x1bW5zIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIik7bGV0IG49bmV3IFVuKHRoaXMucm93cyplLHRoaXMuY29sdW1ucypyKTtmb3IobGV0IHQ9MDt0PGU7dCsrKWZvcihsZXQgZT0wO2U8cjtlKyspbi5zZXRTdWJNYXRyaXgodGhpcyx0aGlzLnJvd3MqdCx0aGlzLmNvbHVtbnMqZSk7cmV0dXJuIG59ZmlsbCh0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0KTtyZXR1cm4gdGhpc31uZWcoKXtyZXR1cm4gdGhpcy5tdWxTKC0xKX1nZXRSb3codCl7Tm4odGhpcyx0KTtsZXQgZT1bXTtmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspZS5wdXNoKHRoaXMuZ2V0KHQscikpO3JldHVybiBlfWdldFJvd1ZlY3Rvcih0KXtyZXR1cm4gVW4ucm93VmVjdG9yKHRoaXMuZ2V0Um93KHQpKX1zZXRSb3codCxlKXtObih0aGlzLHQpLGU9Rm4odGhpcyxlKTtmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQodCxyLGVbcl0pO3JldHVybiB0aGlzfXN3YXBSb3dzKHQsZSl7Tm4odGhpcyx0KSxObih0aGlzLGUpO2ZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl7bGV0IG49dGhpcy5nZXQodCxyKTt0aGlzLnNldCh0LHIsdGhpcy5nZXQoZSxyKSksdGhpcy5zZXQoZSxyLG4pfXJldHVybiB0aGlzfWdldENvbHVtbih0KXtrbih0aGlzLHQpO2xldCBlPVtdO2ZvcihsZXQgcj0wO3I8dGhpcy5yb3dzO3IrKyllLnB1c2godGhpcy5nZXQocix0KSk7cmV0dXJuIGV9Z2V0Q29sdW1uVmVjdG9yKHQpe3JldHVybiBVbi5jb2x1bW5WZWN0b3IodGhpcy5nZXRDb2x1bW4odCkpfXNldENvbHVtbih0LGUpe2tuKHRoaXMsdCksZT1Qbih0aGlzLGUpO2ZvcihsZXQgcj0wO3I8dGhpcy5yb3dzO3IrKyl0aGlzLnNldChyLHQsZVtyXSk7cmV0dXJuIHRoaXN9c3dhcENvbHVtbnModCxlKXtrbih0aGlzLHQpLGtuKHRoaXMsZSk7Zm9yKGxldCByPTA7cjx0aGlzLnJvd3M7cisrKXtsZXQgbj10aGlzLmdldChyLHQpO3RoaXMuc2V0KHIsdCx0aGlzLmdldChyLGUpKSx0aGlzLnNldChyLGUsbil9cmV0dXJuIHRoaXN9YWRkUm93VmVjdG9yKHQpe3Q9Rm4odGhpcyx0KTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpK3Rbcl0pO3JldHVybiB0aGlzfXN1YlJvd1ZlY3Rvcih0KXt0PUZuKHRoaXMsdCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKS10W3JdKTtyZXR1cm4gdGhpc31tdWxSb3dWZWN0b3IodCl7dD1Gbih0aGlzLHQpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikqdFtyXSk7cmV0dXJuIHRoaXN9ZGl2Um93VmVjdG9yKHQpe3Q9Rm4odGhpcyx0KTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpL3Rbcl0pO3JldHVybiB0aGlzfWFkZENvbHVtblZlY3Rvcih0KXt0PVBuKHRoaXMsdCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKSt0W2VdKTtyZXR1cm4gdGhpc31zdWJDb2x1bW5WZWN0b3IodCl7dD1Qbih0aGlzLHQpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUsciktdFtlXSk7cmV0dXJuIHRoaXN9bXVsQ29sdW1uVmVjdG9yKHQpe3Q9UG4odGhpcyx0KTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpKnRbZV0pO3JldHVybiB0aGlzfWRpdkNvbHVtblZlY3Rvcih0KXt0PVBuKHRoaXMsdCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKS90W2VdKTtyZXR1cm4gdGhpc31tdWxSb3codCxlKXtObih0aGlzLHQpO2ZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldCh0LHIsdGhpcy5nZXQodCxyKSplKTtyZXR1cm4gdGhpc31tdWxDb2x1bW4odCxlKXtrbih0aGlzLHQpO2ZvcihsZXQgcj0wO3I8dGhpcy5yb3dzO3IrKyl0aGlzLnNldChyLHQsdGhpcy5nZXQocix0KSplKTtyZXR1cm4gdGhpc31tYXgodCl7aWYodGhpcy5pc0VtcHR5KCkpcmV0dXJuIE5hTjtzd2l0Y2godCl7Y2FzZSJyb3ciOntjb25zdCB0PW5ldyBBcnJheSh0aGlzLnJvd3MpLmZpbGwoTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuZ2V0KGUscik+dFtlXSYmKHRbZV09dGhpcy5nZXQoZSxyKSk7cmV0dXJuIHR9Y2FzZSJjb2x1bW4iOntjb25zdCB0PW5ldyBBcnJheSh0aGlzLmNvbHVtbnMpLmZpbGwoTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuZ2V0KGUscik+dFtyXSYmKHRbcl09dGhpcy5nZXQoZSxyKSk7cmV0dXJuIHR9Y2FzZSB2b2lkIDA6e2xldCB0PXRoaXMuZ2V0KDAsMCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLmdldChlLHIpPnQmJih0PXRoaXMuZ2V0KGUscikpO3JldHVybiB0fWRlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG9wdGlvbjogJHt0fWApfX1tYXhJbmRleCgpeyRuKHRoaXMpO2xldCB0PXRoaXMuZ2V0KDAsMCksZT1bMCwwXTtmb3IobGV0IHI9MDtyPHRoaXMucm93cztyKyspZm9yKGxldCBuPTA7bjx0aGlzLmNvbHVtbnM7bisrKXRoaXMuZ2V0KHIsbik+dCYmKHQ9dGhpcy5nZXQocixuKSxlWzBdPXIsZVsxXT1uKTtyZXR1cm4gZX1taW4odCl7aWYodGhpcy5pc0VtcHR5KCkpcmV0dXJuIE5hTjtzd2l0Y2godCl7Y2FzZSJyb3ciOntjb25zdCB0PW5ldyBBcnJheSh0aGlzLnJvd3MpLmZpbGwoTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuZ2V0KGUscik8dFtlXSYmKHRbZV09dGhpcy5nZXQoZSxyKSk7cmV0dXJuIHR9Y2FzZSJjb2x1bW4iOntjb25zdCB0PW5ldyBBcnJheSh0aGlzLmNvbHVtbnMpLmZpbGwoTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuZ2V0KGUscik8dFtyXSYmKHRbcl09dGhpcy5nZXQoZSxyKSk7cmV0dXJuIHR9Y2FzZSB2b2lkIDA6e2xldCB0PXRoaXMuZ2V0KDAsMCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLmdldChlLHIpPHQmJih0PXRoaXMuZ2V0KGUscikpO3JldHVybiB0fWRlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG9wdGlvbjogJHt0fWApfX1taW5JbmRleCgpeyRuKHRoaXMpO2xldCB0PXRoaXMuZ2V0KDAsMCksZT1bMCwwXTtmb3IobGV0IHI9MDtyPHRoaXMucm93cztyKyspZm9yKGxldCBuPTA7bjx0aGlzLmNvbHVtbnM7bisrKXRoaXMuZ2V0KHIsbik8dCYmKHQ9dGhpcy5nZXQocixuKSxlWzBdPXIsZVsxXT1uKTtyZXR1cm4gZX1tYXhSb3codCl7aWYoTm4odGhpcyx0KSx0aGlzLmlzRW1wdHkoKSlyZXR1cm4gTmFOO2xldCBlPXRoaXMuZ2V0KHQsMCk7Zm9yKGxldCByPTE7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuZ2V0KHQscik+ZSYmKGU9dGhpcy5nZXQodCxyKSk7cmV0dXJuIGV9bWF4Um93SW5kZXgodCl7Tm4odGhpcyx0KSwkbih0aGlzKTtsZXQgZT10aGlzLmdldCh0LDApLHI9W3QsMF07Zm9yKGxldCBuPTE7bjx0aGlzLmNvbHVtbnM7bisrKXRoaXMuZ2V0KHQsbik+ZSYmKGU9dGhpcy5nZXQodCxuKSxyWzFdPW4pO3JldHVybiByfW1pblJvdyh0KXtpZihObih0aGlzLHQpLHRoaXMuaXNFbXB0eSgpKXJldHVybiBOYU47bGV0IGU9dGhpcy5nZXQodCwwKTtmb3IobGV0IHI9MTtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5nZXQodCxyKTxlJiYoZT10aGlzLmdldCh0LHIpKTtyZXR1cm4gZX1taW5Sb3dJbmRleCh0KXtObih0aGlzLHQpLCRuKHRoaXMpO2xldCBlPXRoaXMuZ2V0KHQsMCkscj1bdCwwXTtmb3IobGV0IG49MTtuPHRoaXMuY29sdW1ucztuKyspdGhpcy5nZXQodCxuKTxlJiYoZT10aGlzLmdldCh0LG4pLHJbMV09bik7cmV0dXJuIHJ9bWF4Q29sdW1uKHQpe2lmKGtuKHRoaXMsdCksdGhpcy5pc0VtcHR5KCkpcmV0dXJuIE5hTjtsZXQgZT10aGlzLmdldCgwLHQpO2ZvcihsZXQgcj0xO3I8dGhpcy5yb3dzO3IrKyl0aGlzLmdldChyLHQpPmUmJihlPXRoaXMuZ2V0KHIsdCkpO3JldHVybiBlfW1heENvbHVtbkluZGV4KHQpe2tuKHRoaXMsdCksJG4odGhpcyk7bGV0IGU9dGhpcy5nZXQoMCx0KSxyPVswLHRdO2ZvcihsZXQgbj0xO248dGhpcy5yb3dzO24rKyl0aGlzLmdldChuLHQpPmUmJihlPXRoaXMuZ2V0KG4sdCksclswXT1uKTtyZXR1cm4gcn1taW5Db2x1bW4odCl7aWYoa24odGhpcyx0KSx0aGlzLmlzRW1wdHkoKSlyZXR1cm4gTmFOO2xldCBlPXRoaXMuZ2V0KDAsdCk7Zm9yKGxldCByPTE7cjx0aGlzLnJvd3M7cisrKXRoaXMuZ2V0KHIsdCk8ZSYmKGU9dGhpcy5nZXQocix0KSk7cmV0dXJuIGV9bWluQ29sdW1uSW5kZXgodCl7a24odGhpcyx0KSwkbih0aGlzKTtsZXQgZT10aGlzLmdldCgwLHQpLHI9WzAsdF07Zm9yKGxldCBuPTE7bjx0aGlzLnJvd3M7bisrKXRoaXMuZ2V0KG4sdCk8ZSYmKGU9dGhpcy5nZXQobix0KSxyWzBdPW4pO3JldHVybiByfWRpYWcoKXtsZXQgdD1NYXRoLm1pbih0aGlzLnJvd3MsdGhpcy5jb2x1bW5zKSxlPVtdO2ZvcihsZXQgcj0wO3I8dDtyKyspZS5wdXNoKHRoaXMuZ2V0KHIscikpO3JldHVybiBlfW5vcm0odD0iZnJvYmVuaXVzIil7bGV0IGU9MDtpZigibWF4Ij09PXQpcmV0dXJuIHRoaXMubWF4KCk7aWYoImZyb2Jlbml1cyI9PT10KXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKWUrPXRoaXMuZ2V0KHQscikqdGhpcy5nZXQodCxyKTtyZXR1cm4gTWF0aC5zcXJ0KGUpfXRocm93IG5ldyBSYW5nZUVycm9yKGB1bmtub3duIG5vcm0gdHlwZTogJHt0fWApfWN1bXVsYXRpdmVTdW0oKXtsZXQgdD0wO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdCs9dGhpcy5nZXQoZSxyKSx0aGlzLnNldChlLHIsdCk7cmV0dXJuIHRoaXN9ZG90KHQpe3FuLmlzTWF0cml4KHQpJiYodD10LnRvMURBcnJheSgpKTtsZXQgZT10aGlzLnRvMURBcnJheSgpO2lmKGUubGVuZ3RoIT09dC5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoInZlY3RvcnMgZG8gbm90IGhhdmUgdGhlIHNhbWUgc2l6ZSIpO2xldCByPTA7Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspcis9ZVtuXSp0W25dO3JldHVybiByfW1tdWwodCl7dD1Vbi5jaGVja01hdHJpeCh0KTtsZXQgZT10aGlzLnJvd3Mscj10aGlzLmNvbHVtbnMsbj10LmNvbHVtbnMsbz1uZXcgVW4oZSxuKSxzPW5ldyBGbG9hdDY0QXJyYXkocik7Zm9yKGxldCBpPTA7aTxuO2krKyl7Zm9yKGxldCBlPTA7ZTxyO2UrKylzW2VdPXQuZ2V0KGUsaSk7Zm9yKGxldCB0PTA7dDxlO3QrKyl7bGV0IGU9MDtmb3IobGV0IG49MDtuPHI7bisrKWUrPXRoaXMuZ2V0KHQsbikqc1tuXTtvLnNldCh0LGksZSl9fXJldHVybiBvfXN0cmFzc2VuMngyKHQpe3Q9VW4uY2hlY2tNYXRyaXgodCk7bGV0IGU9bmV3IFVuKDIsMik7Y29uc3Qgcj10aGlzLmdldCgwLDApLG49dC5nZXQoMCwwKSxvPXRoaXMuZ2V0KDAsMSkscz10LmdldCgwLDEpLGk9dGhpcy5nZXQoMSwwKSx1PXQuZ2V0KDEsMCksYT10aGlzLmdldCgxLDEpLGw9dC5nZXQoMSwxKSxoPShyK2EpKihuK2wpLGM9KGkrYSkqbixmPXIqKHMtbCksbT1hKih1LW4pLGc9KHIrbykqbCxwPWgrbS1nKyhvLWEpKih1K2wpLHc9ZitnLGQ9YyttLGI9aC1jK2YrKGktcikqKG4rcyk7cmV0dXJuIGUuc2V0KDAsMCxwKSxlLnNldCgwLDEsdyksZS5zZXQoMSwwLGQpLGUuc2V0KDEsMSxiKSxlfXN0cmFzc2VuM3gzKHQpe3Q9VW4uY2hlY2tNYXRyaXgodCk7bGV0IGU9bmV3IFVuKDMsMyk7Y29uc3Qgcj10aGlzLmdldCgwLDApLG49dGhpcy5nZXQoMCwxKSxvPXRoaXMuZ2V0KDAsMikscz10aGlzLmdldCgxLDApLGk9dGhpcy5nZXQoMSwxKSx1PXRoaXMuZ2V0KDEsMiksYT10aGlzLmdldCgyLDApLGw9dGhpcy5nZXQoMiwxKSxoPXRoaXMuZ2V0KDIsMiksYz10LmdldCgwLDApLGY9dC5nZXQoMCwxKSxtPXQuZ2V0KDAsMiksZz10LmdldCgxLDApLHA9dC5nZXQoMSwxKSx3PXQuZ2V0KDEsMiksZD10LmdldCgyLDApLGI9dC5nZXQoMiwxKSx5PXQuZ2V0KDIsMiksdj0oci1zKSooLWYrcCksTT0oLXIrcytpKSooYy1mK3ApLGo9KHMraSkqKC1jK2YpLHg9cipjLF89KC1yK2ErbCkqKGMtbSt3KSxFPSgtcithKSoobS13KSxTPShhK2wpKigtYyttKSxPPSgtbytsK2gpKihwK2QtYiksQT0oby1oKSoocC1iKSxDPW8qZCxSPShsK2gpKigtZCtiKSxJPSgtbytpK3UpKih3K2QteSksTj0oby11KSoody15KSxrPShpK3UpKigtZCt5KSxGPXgrQytuKmcsUD0ocituK28tcy1pLWwtaCkqcCtNK2oreCtPK0MrUixUPXgrXytTKyhyK24rby1pLXUtYS1sKSp3K0MrSStrLHo9ditpKigtYytmK2ctcC13LWQreSkrTSt4K0MrSStOLFY9ditNK2oreCt1KmIsJD1DK0krTitrK3MqbSxxPXgrXytFK2wqKC1jK20rZy1wLXctZCtiKStPK0ErQyxEPU8rQStDK1IrYSpmLFU9eCtfK0UrUytoKnk7cmV0dXJuIGUuc2V0KDAsMCxGKSxlLnNldCgwLDEsUCksZS5zZXQoMCwyLFQpLGUuc2V0KDEsMCx6KSxlLnNldCgxLDEsViksZS5zZXQoMSwyLCQpLGUuc2V0KDIsMCxxKSxlLnNldCgyLDEsRCksZS5zZXQoMiwyLFUpLGV9bW11bFN0cmFzc2VuKHQpe3Q9VW4uY2hlY2tNYXRyaXgodCk7bGV0IGU9dGhpcy5jbG9uZSgpLHI9ZS5yb3dzLG49ZS5jb2x1bW5zLG89dC5yb3dzLHM9dC5jb2x1bW5zO2Z1bmN0aW9uIGkodCxlLHIpe2xldCBuPXQucm93cyxvPXQuY29sdW1ucztpZihuPT09ZSYmbz09PXIpcmV0dXJuIHQ7e2xldCBuPXFuLnplcm9zKGUscik7cmV0dXJuIG49bi5zZXRTdWJNYXRyaXgodCwwLDApLG59fW4hPT1vJiZjb25zb2xlLndhcm4oYE11bHRpcGx5aW5nICR7cn0geCAke259IGFuZCAke299IHggJHtzfSBtYXRyaXg6IGRpbWVuc2lvbnMgZG8gbm90IG1hdGNoLmApO2xldCB1PU1hdGgubWF4KHIsbyksYT1NYXRoLm1heChuLHMpO3JldHVybiBlPWkoZSx1LGEpLGZ1bmN0aW9uIHQoZSxyLG4sbyl7aWYobjw9NTEyfHxvPD01MTIpcmV0dXJuIGUubW11bChyKTtuJTI9PTEmJm8lMj09MT8oZT1pKGUsbisxLG8rMSkscj1pKHIsbisxLG8rMSkpOm4lMj09MT8oZT1pKGUsbisxLG8pLHI9aShyLG4rMSxvKSk6byUyPT0xJiYoZT1pKGUsbixvKzEpLHI9aShyLG4sbysxKSk7bGV0IHM9cGFyc2VJbnQoZS5yb3dzLzIsMTApLHU9cGFyc2VJbnQoZS5jb2x1bW5zLzIsMTApLGE9ZS5zdWJNYXRyaXgoMCxzLTEsMCx1LTEpLGw9ci5zdWJNYXRyaXgoMCxzLTEsMCx1LTEpLGg9ZS5zdWJNYXRyaXgoMCxzLTEsdSxlLmNvbHVtbnMtMSksYz1yLnN1Yk1hdHJpeCgwLHMtMSx1LHIuY29sdW1ucy0xKSxmPWUuc3ViTWF0cml4KHMsZS5yb3dzLTEsMCx1LTEpLG09ci5zdWJNYXRyaXgocyxyLnJvd3MtMSwwLHUtMSksZz1lLnN1Yk1hdHJpeChzLGUucm93cy0xLHUsZS5jb2x1bW5zLTEpLHA9ci5zdWJNYXRyaXgocyxyLnJvd3MtMSx1LHIuY29sdW1ucy0xKSx3PXQocW4uYWRkKGEsZykscW4uYWRkKGwscCkscyx1KSxkPXQocW4uYWRkKGYsZyksbCxzLHUpLGI9dChhLHFuLnN1YihjLHApLHMsdSkseT10KGcscW4uc3ViKG0sbCkscyx1KSx2PXQocW4uYWRkKGEsaCkscCxzLHUpLE09dChxbi5zdWIoZixhKSxxbi5hZGQobCxjKSxzLHUpLGo9dChxbi5zdWIoaCxnKSxxbi5hZGQobSxwKSxzLHUpLHg9cW4uYWRkKHcseSk7eC5zdWIodikseC5hZGQoaik7bGV0IF89cW4uYWRkKGIsdiksRT1xbi5hZGQoZCx5KSxTPXFuLnN1Yih3LGQpO1MuYWRkKGIpLFMuYWRkKE0pO2xldCBPPXFuLnplcm9zKDIqeC5yb3dzLDIqeC5jb2x1bW5zKTtyZXR1cm4gTz1PLnNldFN1Yk1hdHJpeCh4LDAsMCksTz1PLnNldFN1Yk1hdHJpeChfLHgucm93cywwKSxPPU8uc2V0U3ViTWF0cml4KEUsMCx4LmNvbHVtbnMpLE89Ty5zZXRTdWJNYXRyaXgoUyx4LnJvd3MseC5jb2x1bW5zKSxPLnN1Yk1hdHJpeCgwLG4tMSwwLG8tMSl9KGUsdD1pKHQsdSxhKSx1LGEpfXNjYWxlUm93cyh0PXt9KXtpZigib2JqZWN0IiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIpO2NvbnN0e21pbjplPTAsbWF4OnI9MX09dDtpZighTnVtYmVyLmlzRmluaXRlKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIm1pbiBtdXN0IGJlIGEgbnVtYmVyIik7aWYoIU51bWJlci5pc0Zpbml0ZShyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJtYXggbXVzdCBiZSBhIG51bWJlciIpO2lmKGU+PXIpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm1pbiBtdXN0IGJlIHNtYWxsZXIgdGhhbiBtYXgiKTtsZXQgbj1uZXcgVW4odGhpcy5yb3dzLHRoaXMuY29sdW1ucyk7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKXtjb25zdCBvPXRoaXMuZ2V0Um93KHQpO28ubGVuZ3RoPjAmJlNuKG8se21pbjplLG1heDpyLG91dHB1dDpvfSksbi5zZXRSb3codCxvKX1yZXR1cm4gbn1zY2FsZUNvbHVtbnModD17fSl7aWYoIm9iamVjdCIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiKTtjb25zdHttaW46ZT0wLG1heDpyPTF9PXQ7aWYoIU51bWJlci5pc0Zpbml0ZShlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJtaW4gbXVzdCBiZSBhIG51bWJlciIpO2lmKCFOdW1iZXIuaXNGaW5pdGUocikpdGhyb3cgbmV3IFR5cGVFcnJvcigibWF4IG11c3QgYmUgYSBudW1iZXIiKTtpZihlPj1yKXRocm93IG5ldyBSYW5nZUVycm9yKCJtaW4gbXVzdCBiZSBzbWFsbGVyIHRoYW4gbWF4Iik7bGV0IG49bmV3IFVuKHRoaXMucm93cyx0aGlzLmNvbHVtbnMpO2ZvcihsZXQgdD0wO3Q8dGhpcy5jb2x1bW5zO3QrKyl7Y29uc3Qgbz10aGlzLmdldENvbHVtbih0KTtvLmxlbmd0aCYmU24obyx7bWluOmUsbWF4OnIsb3V0cHV0Om99KSxuLnNldENvbHVtbih0LG8pfXJldHVybiBufWZsaXBSb3dzKCl7Y29uc3QgdD1NYXRoLmNlaWwodGhpcy5jb2x1bW5zLzIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHQ7cisrKXtsZXQgdD10aGlzLmdldChlLHIpLG49dGhpcy5nZXQoZSx0aGlzLmNvbHVtbnMtMS1yKTt0aGlzLnNldChlLHIsbiksdGhpcy5zZXQoZSx0aGlzLmNvbHVtbnMtMS1yLHQpfXJldHVybiB0aGlzfWZsaXBDb2x1bW5zKCl7Y29uc3QgdD1NYXRoLmNlaWwodGhpcy5yb3dzLzIpO2ZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKylmb3IobGV0IHI9MDtyPHQ7cisrKXtsZXQgdD10aGlzLmdldChyLGUpLG49dGhpcy5nZXQodGhpcy5yb3dzLTEtcixlKTt0aGlzLnNldChyLGUsbiksdGhpcy5zZXQodGhpcy5yb3dzLTEtcixlLHQpfXJldHVybiB0aGlzfWtyb25lY2tlclByb2R1Y3QodCl7dD1Vbi5jaGVja01hdHJpeCh0KTtsZXQgZT10aGlzLnJvd3Mscj10aGlzLmNvbHVtbnMsbj10LnJvd3Msbz10LmNvbHVtbnMscz1uZXcgVW4oZSpuLHIqbyk7Zm9yKGxldCBpPTA7aTxlO2krKylmb3IobGV0IGU9MDtlPHI7ZSsrKWZvcihsZXQgcj0wO3I8bjtyKyspZm9yKGxldCB1PTA7dTxvO3UrKylzLnNldChuKmkrcixvKmUrdSx0aGlzLmdldChpLGUpKnQuZ2V0KHIsdSkpO3JldHVybiBzfWtyb25lY2tlclN1bSh0KXtpZih0PVVuLmNoZWNrTWF0cml4KHQpLCF0aGlzLmlzU3F1YXJlKCl8fCF0LmlzU3F1YXJlKCkpdGhyb3cgbmV3IEVycm9yKCJLcm9uZWNrZXIgU3VtIG5lZWRzIHR3byBTcXVhcmUgTWF0cmljZXMiKTtsZXQgZT10aGlzLnJvd3Mscj10LnJvd3Msbj10aGlzLmtyb25lY2tlclByb2R1Y3QoVW4uZXllKHIscikpLG89VW4uZXllKGUsZSkua3JvbmVja2VyUHJvZHVjdCh0KTtyZXR1cm4gbi5hZGQobyl9dHJhbnNwb3NlKCl7bGV0IHQ9bmV3IFVuKHRoaXMuY29sdW1ucyx0aGlzLnJvd3MpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdC5zZXQocixlLHRoaXMuZ2V0KGUscikpO3JldHVybiB0fXNvcnRSb3dzKHQ9RG4pe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKyl0aGlzLnNldFJvdyhlLHRoaXMuZ2V0Um93KGUpLnNvcnQodCkpO3JldHVybiB0aGlzfXNvcnRDb2x1bW5zKHQ9RG4pe2ZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldENvbHVtbihlLHRoaXMuZ2V0Q29sdW1uKGUpLnNvcnQodCkpO3JldHVybiB0aGlzfXN1Yk1hdHJpeCh0LGUscixuKXtUbih0aGlzLHQsZSxyLG4pO2xldCBvPW5ldyBVbihlLXQrMSxuLXIrMSk7Zm9yKGxldCBzPXQ7czw9ZTtzKyspZm9yKGxldCBlPXI7ZTw9bjtlKyspby5zZXQocy10LGUtcix0aGlzLmdldChzLGUpKTtyZXR1cm4gb31zdWJNYXRyaXhSb3codCxlLHIpe2lmKHZvaWQgMD09PWUmJihlPTApLHZvaWQgMD09PXImJihyPXRoaXMuY29sdW1ucy0xKSxlPnJ8fGU8MHx8ZT49dGhpcy5jb2x1bW5zfHxyPDB8fHI+PXRoaXMuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQXJndW1lbnQgb3V0IG9mIHJhbmdlIik7bGV0IG49bmV3IFVuKHQubGVuZ3RoLHItZSsxKTtmb3IobGV0IG89MDtvPHQubGVuZ3RoO28rKylmb3IobGV0IHM9ZTtzPD1yO3MrKyl7aWYodFtvXTwwfHx0W29dPj10aGlzLnJvd3MpdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFJvdyBpbmRleCBvdXQgb2YgcmFuZ2U6ICR7dFtvXX1gKTtuLnNldChvLHMtZSx0aGlzLmdldCh0W29dLHMpKX1yZXR1cm4gbn1zdWJNYXRyaXhDb2x1bW4odCxlLHIpe2lmKHZvaWQgMD09PWUmJihlPTApLHZvaWQgMD09PXImJihyPXRoaXMucm93cy0xKSxlPnJ8fGU8MHx8ZT49dGhpcy5yb3dzfHxyPDB8fHI+PXRoaXMucm93cyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQXJndW1lbnQgb3V0IG9mIHJhbmdlIik7bGV0IG49bmV3IFVuKHItZSsxLHQubGVuZ3RoKTtmb3IobGV0IG89MDtvPHQubGVuZ3RoO28rKylmb3IobGV0IHM9ZTtzPD1yO3MrKyl7aWYodFtvXTwwfHx0W29dPj10aGlzLmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoYENvbHVtbiBpbmRleCBvdXQgb2YgcmFuZ2U6ICR7dFtvXX1gKTtuLnNldChzLWUsbyx0aGlzLmdldChzLHRbb10pKX1yZXR1cm4gbn1zZXRTdWJNYXRyaXgodCxlLHIpe2lmKCh0PVVuLmNoZWNrTWF0cml4KHQpKS5pc0VtcHR5KCkpcmV0dXJuIHRoaXM7VG4odGhpcyxlLGUrdC5yb3dzLTEscixyK3QuY29sdW1ucy0xKTtmb3IobGV0IG49MDtuPHQucm93cztuKyspZm9yKGxldCBvPTA7bzx0LmNvbHVtbnM7bysrKXRoaXMuc2V0KGUrbixyK28sdC5nZXQobixvKSk7cmV0dXJuIHRoaXN9c2VsZWN0aW9uKHQsZSl7IWZ1bmN0aW9uKHQsZSl7aWYoIUVuKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoInJvdyBpbmRpY2VzIG11c3QgYmUgYW4gYXJyYXkiKTtmb3IobGV0IHI9MDtyPGUubGVuZ3RoO3IrKylpZihlW3JdPDB8fGVbcl0+PXQucm93cyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigicm93IGluZGljZXMgYXJlIG91dCBvZiByYW5nZSIpfSh0aGlzLHQpLGZ1bmN0aW9uKHQsZSl7aWYoIUVuKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoImNvbHVtbiBpbmRpY2VzIG11c3QgYmUgYW4gYXJyYXkiKTtmb3IobGV0IHI9MDtyPGUubGVuZ3RoO3IrKylpZihlW3JdPDB8fGVbcl0+PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiY29sdW1uIGluZGljZXMgYXJlIG91dCBvZiByYW5nZSIpfSh0aGlzLGUpO2xldCByPW5ldyBVbih0Lmxlbmd0aCxlLmxlbmd0aCk7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspe2xldCBvPXRbbl07Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0Kyspe2xldCBzPWVbdF07ci5zZXQobix0LHRoaXMuZ2V0KG8scykpfX1yZXR1cm4gcn10cmFjZSgpe2xldCB0PU1hdGgubWluKHRoaXMucm93cyx0aGlzLmNvbHVtbnMpLGU9MDtmb3IobGV0IHI9MDtyPHQ7cisrKWUrPXRoaXMuZ2V0KHIscik7cmV0dXJuIGV9Y2xvbmUoKXtsZXQgdD1uZXcgVW4odGhpcy5yb3dzLHRoaXMuY29sdW1ucyk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0LnNldChlLHIsdGhpcy5nZXQoZSxyKSk7cmV0dXJuIHR9c3VtKHQpe3N3aXRjaCh0KXtjYXNlInJvdyI6cmV0dXJuIGZ1bmN0aW9uKHQpe2xldCBlPXpuKHQucm93cyk7Zm9yKGxldCByPTA7cjx0LnJvd3M7KytyKWZvcihsZXQgbj0wO248dC5jb2x1bW5zOysrbillW3JdKz10LmdldChyLG4pO3JldHVybiBlfSh0aGlzKTtjYXNlImNvbHVtbiI6cmV0dXJuIGZ1bmN0aW9uKHQpe2xldCBlPXpuKHQuY29sdW1ucyk7Zm9yKGxldCByPTA7cjx0LnJvd3M7KytyKWZvcihsZXQgbj0wO248dC5jb2x1bW5zOysrbillW25dKz10LmdldChyLG4pO3JldHVybiBlfSh0aGlzKTtjYXNlIHZvaWQgMDpyZXR1cm4gZnVuY3Rpb24odCl7bGV0IGU9MDtmb3IobGV0IHI9MDtyPHQucm93cztyKyspZm9yKGxldCBuPTA7bjx0LmNvbHVtbnM7bisrKWUrPXQuZ2V0KHIsbik7cmV0dXJuIGV9KHRoaXMpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG9wdGlvbjogJHt0fWApfX1wcm9kdWN0KHQpe3N3aXRjaCh0KXtjYXNlInJvdyI6cmV0dXJuIGZ1bmN0aW9uKHQpe2xldCBlPXpuKHQucm93cywxKTtmb3IobGV0IHI9MDtyPHQucm93czsrK3IpZm9yKGxldCBuPTA7bjx0LmNvbHVtbnM7KytuKWVbcl0qPXQuZ2V0KHIsbik7cmV0dXJuIGV9KHRoaXMpO2Nhc2UiY29sdW1uIjpyZXR1cm4gZnVuY3Rpb24odCl7bGV0IGU9em4odC5jb2x1bW5zLDEpO2ZvcihsZXQgcj0wO3I8dC5yb3dzOysrcilmb3IobGV0IG49MDtuPHQuY29sdW1uczsrK24pZVtuXSo9dC5nZXQocixuKTtyZXR1cm4gZX0odGhpcyk7Y2FzZSB2b2lkIDA6cmV0dXJuIGZ1bmN0aW9uKHQpe2xldCBlPTE7Zm9yKGxldCByPTA7cjx0LnJvd3M7cisrKWZvcihsZXQgbj0wO248dC5jb2x1bW5zO24rKyllKj10LmdldChyLG4pO3JldHVybiBlfSh0aGlzKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgaW52YWxpZCBvcHRpb246ICR7dH1gKX19bWVhbih0KXtjb25zdCBlPXRoaXMuc3VtKHQpO3N3aXRjaCh0KXtjYXNlInJvdyI6Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWVbdF0vPXRoaXMuY29sdW1ucztyZXR1cm4gZTtjYXNlImNvbHVtbiI6Zm9yKGxldCB0PTA7dDx0aGlzLmNvbHVtbnM7dCsrKWVbdF0vPXRoaXMucm93cztyZXR1cm4gZTtjYXNlIHZvaWQgMDpyZXR1cm4gZS90aGlzLnNpemU7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgb3B0aW9uOiAke3R9YCl9fXZhcmlhbmNlKHQsZT17fSl7aWYoIm9iamVjdCI9PXR5cGVvZiB0JiYoZT10LHQ9dm9pZCAwKSwib2JqZWN0IiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIpO2NvbnN0e3VuYmlhc2VkOnI9ITAsbWVhbjpuPXRoaXMubWVhbih0KX09ZTtpZigiYm9vbGVhbiIhPXR5cGVvZiByKXRocm93IG5ldyBUeXBlRXJyb3IoInVuYmlhc2VkIG11c3QgYmUgYSBib29sZWFuIik7c3dpdGNoKHQpe2Nhc2Uicm93IjppZighRW4obikpdGhyb3cgbmV3IFR5cGVFcnJvcigibWVhbiBtdXN0IGJlIGFuIGFycmF5Iik7cmV0dXJuIGZ1bmN0aW9uKHQsZSxyKXtjb25zdCBuPXQucm93cyxvPXQuY29sdW1ucyxzPVtdO2ZvcihsZXQgaT0wO2k8bjtpKyspe2xldCBuPTAsdT0wLGE9MDtmb3IobGV0IGU9MDtlPG87ZSsrKWE9dC5nZXQoaSxlKS1yW2ldLG4rPWEsdSs9YSphO2U/cy5wdXNoKCh1LW4qbi9vKS8oby0xKSk6cy5wdXNoKCh1LW4qbi9vKS9vKX1yZXR1cm4gc30odGhpcyxyLG4pO2Nhc2UiY29sdW1uIjppZighRW4obikpdGhyb3cgbmV3IFR5cGVFcnJvcigibWVhbiBtdXN0IGJlIGFuIGFycmF5Iik7cmV0dXJuIGZ1bmN0aW9uKHQsZSxyKXtjb25zdCBuPXQucm93cyxvPXQuY29sdW1ucyxzPVtdO2ZvcihsZXQgaT0wO2k8bztpKyspe2xldCBvPTAsdT0wLGE9MDtmb3IobGV0IGU9MDtlPG47ZSsrKWE9dC5nZXQoZSxpKS1yW2ldLG8rPWEsdSs9YSphO2U/cy5wdXNoKCh1LW8qby9uKS8obi0xKSk6cy5wdXNoKCh1LW8qby9uKS9uKX1yZXR1cm4gc30odGhpcyxyLG4pO2Nhc2Ugdm9pZCAwOmlmKCJudW1iZXIiIT10eXBlb2Ygbil0aHJvdyBuZXcgVHlwZUVycm9yKCJtZWFuIG11c3QgYmUgYSBudW1iZXIiKTtyZXR1cm4gZnVuY3Rpb24odCxlLHIpe2NvbnN0IG49dC5yb3dzLG89dC5jb2x1bW5zLHM9bipvO2xldCBpPTAsdT0wLGE9MDtmb3IobGV0IGU9MDtlPG47ZSsrKWZvcihsZXQgbj0wO248bztuKyspYT10LmdldChlLG4pLXIsaSs9YSx1Kz1hKmE7cmV0dXJuIGU/KHUtaSppL3MpLyhzLTEpOih1LWkqaS9zKS9zfSh0aGlzLHIsbik7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgb3B0aW9uOiAke3R9YCl9fXN0YW5kYXJkRGV2aWF0aW9uKHQsZSl7Im9iamVjdCI9PXR5cGVvZiB0JiYoZT10LHQ9dm9pZCAwKTtjb25zdCByPXRoaXMudmFyaWFuY2UodCxlKTtpZih2b2lkIDA9PT10KXJldHVybiBNYXRoLnNxcnQocik7Zm9yKGxldCB0PTA7dDxyLmxlbmd0aDt0Kyspclt0XT1NYXRoLnNxcnQoclt0XSk7cmV0dXJuIHJ9Y2VudGVyKHQsZT17fSl7aWYoIm9iamVjdCI9PXR5cGVvZiB0JiYoZT10LHQ9dm9pZCAwKSwib2JqZWN0IiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIpO2NvbnN0e2NlbnRlcjpyPXRoaXMubWVhbih0KX09ZTtzd2l0Y2godCl7Y2FzZSJyb3ciOmlmKCFFbihyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJjZW50ZXIgbXVzdCBiZSBhbiBhcnJheSIpO3JldHVybiBmdW5jdGlvbih0LGUpe2ZvcihsZXQgcj0wO3I8dC5yb3dzO3IrKylmb3IobGV0IG49MDtuPHQuY29sdW1ucztuKyspdC5zZXQocixuLHQuZ2V0KHIsbiktZVtyXSl9KHRoaXMsciksdGhpcztjYXNlImNvbHVtbiI6aWYoIUVuKHIpKXRocm93IG5ldyBUeXBlRXJyb3IoImNlbnRlciBtdXN0IGJlIGFuIGFycmF5Iik7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7Zm9yKGxldCByPTA7cjx0LnJvd3M7cisrKWZvcihsZXQgbj0wO248dC5jb2x1bW5zO24rKyl0LnNldChyLG4sdC5nZXQocixuKS1lW25dKX0odGhpcyxyKSx0aGlzO2Nhc2Ugdm9pZCAwOmlmKCJudW1iZXIiIT10eXBlb2Ygcil0aHJvdyBuZXcgVHlwZUVycm9yKCJjZW50ZXIgbXVzdCBiZSBhIG51bWJlciIpO3JldHVybiBmdW5jdGlvbih0LGUpe2ZvcihsZXQgcj0wO3I8dC5yb3dzO3IrKylmb3IobGV0IG49MDtuPHQuY29sdW1ucztuKyspdC5zZXQocixuLHQuZ2V0KHIsbiktZSl9KHRoaXMsciksdGhpcztkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgaW52YWxpZCBvcHRpb246ICR7dH1gKX19c2NhbGUodCxlPXt9KXtpZigib2JqZWN0Ij09dHlwZW9mIHQmJihlPXQsdD12b2lkIDApLCJvYmplY3QiIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0Iik7bGV0IHI9ZS5zY2FsZTtzd2l0Y2godCl7Y2FzZSJyb3ciOmlmKHZvaWQgMD09PXIpcj1mdW5jdGlvbih0KXtjb25zdCBlPVtdO2ZvcihsZXQgcj0wO3I8dC5yb3dzO3IrKyl7bGV0IG49MDtmb3IobGV0IGU9MDtlPHQuY29sdW1ucztlKyspbis9TWF0aC5wb3codC5nZXQocixlKSwyKS8odC5jb2x1bW5zLTEpO2UucHVzaChNYXRoLnNxcnQobikpfXJldHVybiBlfSh0aGlzKTtlbHNlIGlmKCFFbihyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJzY2FsZSBtdXN0IGJlIGFuIGFycmF5Iik7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7Zm9yKGxldCByPTA7cjx0LnJvd3M7cisrKWZvcihsZXQgbj0wO248dC5jb2x1bW5zO24rKyl0LnNldChyLG4sdC5nZXQocixuKS9lW3JdKX0odGhpcyxyKSx0aGlzO2Nhc2UiY29sdW1uIjppZih2b2lkIDA9PT1yKXI9ZnVuY3Rpb24odCl7Y29uc3QgZT1bXTtmb3IobGV0IHI9MDtyPHQuY29sdW1ucztyKyspe2xldCBuPTA7Zm9yKGxldCBlPTA7ZTx0LnJvd3M7ZSsrKW4rPU1hdGgucG93KHQuZ2V0KGUsciksMikvKHQucm93cy0xKTtlLnB1c2goTWF0aC5zcXJ0KG4pKX1yZXR1cm4gZX0odGhpcyk7ZWxzZSBpZighRW4ocikpdGhyb3cgbmV3IFR5cGVFcnJvcigic2NhbGUgbXVzdCBiZSBhbiBhcnJheSIpO3JldHVybiBmdW5jdGlvbih0LGUpe2ZvcihsZXQgcj0wO3I8dC5yb3dzO3IrKylmb3IobGV0IG49MDtuPHQuY29sdW1ucztuKyspdC5zZXQocixuLHQuZ2V0KHIsbikvZVtuXSl9KHRoaXMsciksdGhpcztjYXNlIHZvaWQgMDppZih2b2lkIDA9PT1yKXI9ZnVuY3Rpb24odCl7Y29uc3QgZT10LnNpemUtMTtsZXQgcj0wO2ZvcihsZXQgbj0wO248dC5jb2x1bW5zO24rKylmb3IobGV0IG89MDtvPHQucm93cztvKyspcis9TWF0aC5wb3codC5nZXQobyxuKSwyKS9lO3JldHVybiBNYXRoLnNxcnQocil9KHRoaXMpO2Vsc2UgaWYoIm51bWJlciIhPXR5cGVvZiByKXRocm93IG5ldyBUeXBlRXJyb3IoInNjYWxlIG11c3QgYmUgYSBudW1iZXIiKTtyZXR1cm4gZnVuY3Rpb24odCxlKXtmb3IobGV0IHI9MDtyPHQucm93cztyKyspZm9yKGxldCBuPTA7bjx0LmNvbHVtbnM7bisrKXQuc2V0KHIsbix0LmdldChyLG4pL2UpfSh0aGlzLHIpLHRoaXM7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgb3B0aW9uOiAke3R9YCl9fXRvU3RyaW5nKHQpe3JldHVybiBDbih0aGlzLHQpfX1mdW5jdGlvbiBEbih0LGUpe3JldHVybiB0LWV9cW4ucHJvdG90eXBlLmtsYXNzPSJNYXRyaXgiLCJ1bmRlZmluZWQiIT10eXBlb2YgU3ltYm9sJiYocW4ucHJvdG90eXBlW1N5bWJvbC5mb3IoIm5vZGVqcy51dGlsLmluc3BlY3QuY3VzdG9tIildPWZ1bmN0aW9uKCl7cmV0dXJuIENuKHRoaXMpfSkscW4ucmFuZG9tPXFuLnJhbmQscW4ucmFuZG9tSW50PXFuLnJhbmRJbnQscW4uZGlhZ29uYWw9cW4uZGlhZyxxbi5wcm90b3R5cGUuZGlhZ29uYWw9cW4ucHJvdG90eXBlLmRpYWcscW4uaWRlbnRpdHk9cW4uZXllLHFuLnByb3RvdHlwZS5uZWdhdGU9cW4ucHJvdG90eXBlLm5lZyxxbi5wcm90b3R5cGUudGVuc29yUHJvZHVjdD1xbi5wcm90b3R5cGUua3JvbmVja2VyUHJvZHVjdDtjbGFzcyBVbiBleHRlbmRzIHFue2NvbnN0cnVjdG9yKHQsZSl7aWYoc3VwZXIoKSxVbi5pc01hdHJpeCh0KSlyZXR1cm4gdC5jbG9uZSgpO2lmKE51bWJlci5pc0ludGVnZXIodCkmJnQ+PTApe2lmKHRoaXMuZGF0YT1bXSwhKE51bWJlci5pc0ludGVnZXIoZSkmJmU+PTApKXRocm93IG5ldyBUeXBlRXJyb3IoIm5Db2x1bW5zIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIik7Zm9yKGxldCByPTA7cjx0O3IrKyl0aGlzLmRhdGEucHVzaChuZXcgRmxvYXQ2NEFycmF5KGUpKX1lbHNle2lmKCFFbih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJGaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyIG9yIGFuIGFycmF5Iik7e2NvbnN0IHI9dDtpZigibnVtYmVyIiE9dHlwZW9mKGU9KHQ9ci5sZW5ndGgpP3JbMF0ubGVuZ3RoOjApKXRocm93IG5ldyBUeXBlRXJyb3IoIkRhdGEgbXVzdCBiZSBhIDJEIGFycmF5IHdpdGggYXQgbGVhc3Qgb25lIGVsZW1lbnQiKTt0aGlzLmRhdGE9W107Zm9yKGxldCBuPTA7bjx0O24rKyl7aWYocltuXS5sZW5ndGghPT1lKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmNvbnNpc3RlbnQgYXJyYXkgZGltZW5zaW9ucyIpO2lmKCFyW25dLmV2ZXJ5KCh0PT4ibnVtYmVyIj09dHlwZW9mIHQpKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnB1dCBkYXRhIGNvbnRhaW5zIG5vbi1udW1lcmljIHZhbHVlcyIpO3RoaXMuZGF0YS5wdXNoKEZsb2F0NjRBcnJheS5mcm9tKHJbbl0pKX19fXRoaXMucm93cz10LHRoaXMuY29sdW1ucz1lfXNldCh0LGUscil7cmV0dXJuIHRoaXMuZGF0YVt0XVtlXT1yLHRoaXN9Z2V0KHQsZSl7cmV0dXJuIHRoaXMuZGF0YVt0XVtlXX1yZW1vdmVSb3codCl7cmV0dXJuIE5uKHRoaXMsdCksdGhpcy5kYXRhLnNwbGljZSh0LDEpLHRoaXMucm93cy09MSx0aGlzfWFkZFJvdyh0LGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT10LHQ9dGhpcy5yb3dzKSxObih0aGlzLHQsITApLGU9RmxvYXQ2NEFycmF5LmZyb20oRm4odGhpcyxlKSksdGhpcy5kYXRhLnNwbGljZSh0LDAsZSksdGhpcy5yb3dzKz0xLHRoaXN9cmVtb3ZlQ29sdW1uKHQpe2tuKHRoaXMsdCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKXtjb25zdCByPW5ldyBGbG9hdDY0QXJyYXkodGhpcy5jb2x1bW5zLTEpO2ZvcihsZXQgbj0wO248dDtuKyspcltuXT10aGlzLmRhdGFbZV1bbl07Zm9yKGxldCBuPXQrMTtuPHRoaXMuY29sdW1ucztuKyspcltuLTFdPXRoaXMuZGF0YVtlXVtuXTt0aGlzLmRhdGFbZV09cn1yZXR1cm4gdGhpcy5jb2x1bW5zLT0xLHRoaXN9YWRkQ29sdW1uKHQsZSl7dm9pZCAwPT09ZSYmKGU9dCx0PXRoaXMuY29sdW1ucyksa24odGhpcyx0LCEwKSxlPVBuKHRoaXMsZSk7Zm9yKGxldCByPTA7cjx0aGlzLnJvd3M7cisrKXtjb25zdCBuPW5ldyBGbG9hdDY0QXJyYXkodGhpcy5jb2x1bW5zKzEpO2xldCBvPTA7Zm9yKDtvPHQ7bysrKW5bb109dGhpcy5kYXRhW3JdW29dO2ZvcihuW28rK109ZVtyXTtvPHRoaXMuY29sdW1ucysxO28rKyluW29dPXRoaXMuZGF0YVtyXVtvLTFdO3RoaXMuZGF0YVtyXT1ufXJldHVybiB0aGlzLmNvbHVtbnMrPTEsdGhpc319IWZ1bmN0aW9uKHQsZSl7dC5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90aGlzLmFkZFModCk6dGhpcy5hZGRNKHQpfSx0LnByb3RvdHlwZS5hZGRTPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikrdCk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLmFkZE09ZnVuY3Rpb24odCl7aWYodD1lLmNoZWNrTWF0cml4KHQpLHRoaXMucm93cyE9PXQucm93c3x8dGhpcy5jb2x1bW5zIT09dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpK3QuZ2V0KGUscikpO3JldHVybiB0aGlzfSx0LmFkZD1mdW5jdGlvbih0LHIpe3JldHVybiBuZXcgZSh0KS5hZGQocil9LHQucHJvdG90eXBlLnN1Yj1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/dGhpcy5zdWJTKHQpOnRoaXMuc3ViTSh0KX0sdC5wcm90b3R5cGUuc3ViUz1mdW5jdGlvbih0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpLXQpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5zdWJNPWZ1bmN0aW9uKHQpe2lmKHQ9ZS5jaGVja01hdHJpeCh0KSx0aGlzLnJvd3MhPT10LnJvd3N8fHRoaXMuY29sdW1ucyE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKS10LmdldChlLHIpKTtyZXR1cm4gdGhpc30sdC5zdWI9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbmV3IGUodCkuc3ViKHIpfSx0LnByb3RvdHlwZS5zdWJ0cmFjdD10LnByb3RvdHlwZS5zdWIsdC5wcm90b3R5cGUuc3VidHJhY3RTPXQucHJvdG90eXBlLnN1YlMsdC5wcm90b3R5cGUuc3VidHJhY3RNPXQucHJvdG90eXBlLnN1Yk0sdC5zdWJ0cmFjdD10LnN1Yix0LnByb3RvdHlwZS5tdWw9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3RoaXMubXVsUyh0KTp0aGlzLm11bE0odCl9LHQucHJvdG90eXBlLm11bFM9ZnVuY3Rpb24odCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKSp0KTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUubXVsTT1mdW5jdGlvbih0KXtpZih0PWUuY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikqdC5nZXQoZSxyKSk7cmV0dXJuIHRoaXN9LHQubXVsPWZ1bmN0aW9uKHQscil7cmV0dXJuIG5ldyBlKHQpLm11bChyKX0sdC5wcm90b3R5cGUubXVsdGlwbHk9dC5wcm90b3R5cGUubXVsLHQucHJvdG90eXBlLm11bHRpcGx5Uz10LnByb3RvdHlwZS5tdWxTLHQucHJvdG90eXBlLm11bHRpcGx5TT10LnByb3RvdHlwZS5tdWxNLHQubXVsdGlwbHk9dC5tdWwsdC5wcm90b3R5cGUuZGl2PWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90aGlzLmRpdlModCk6dGhpcy5kaXZNKHQpfSx0LnByb3RvdHlwZS5kaXZTPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikvdCk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLmRpdk09ZnVuY3Rpb24odCl7aWYodD1lLmNoZWNrTWF0cml4KHQpLHRoaXMucm93cyE9PXQucm93c3x8dGhpcy5jb2x1bW5zIT09dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpL3QuZ2V0KGUscikpO3JldHVybiB0aGlzfSx0LmRpdj1mdW5jdGlvbih0LHIpe3JldHVybiBuZXcgZSh0KS5kaXYocil9LHQucHJvdG90eXBlLmRpdmlkZT10LnByb3RvdHlwZS5kaXYsdC5wcm90b3R5cGUuZGl2aWRlUz10LnByb3RvdHlwZS5kaXZTLHQucHJvdG90eXBlLmRpdmlkZU09dC5wcm90b3R5cGUuZGl2TSx0LmRpdmlkZT10LmRpdix0LnByb3RvdHlwZS5tb2Q9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3RoaXMubW9kUyh0KTp0aGlzLm1vZE0odCl9LHQucHJvdG90eXBlLm1vZFM9ZnVuY3Rpb24odCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKSV0KTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUubW9kTT1mdW5jdGlvbih0KXtpZih0PWUuY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikldC5nZXQoZSxyKSk7cmV0dXJuIHRoaXN9LHQubW9kPWZ1bmN0aW9uKHQscil7cmV0dXJuIG5ldyBlKHQpLm1vZChyKX0sdC5wcm90b3R5cGUubW9kdWx1cz10LnByb3RvdHlwZS5tb2QsdC5wcm90b3R5cGUubW9kdWx1c1M9dC5wcm90b3R5cGUubW9kUyx0LnByb3RvdHlwZS5tb2R1bHVzTT10LnByb3RvdHlwZS5tb2RNLHQubW9kdWx1cz10Lm1vZCx0LnByb3RvdHlwZS5hbmQ9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3RoaXMuYW5kUyh0KTp0aGlzLmFuZE0odCl9LHQucHJvdG90eXBlLmFuZFM9ZnVuY3Rpb24odCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKSZ0KTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUuYW5kTT1mdW5jdGlvbih0KXtpZih0PWUuY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikmdC5nZXQoZSxyKSk7cmV0dXJuIHRoaXN9LHQuYW5kPWZ1bmN0aW9uKHQscil7cmV0dXJuIG5ldyBlKHQpLmFuZChyKX0sdC5wcm90b3R5cGUub3I9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3RoaXMub3JTKHQpOnRoaXMub3JNKHQpfSx0LnByb3RvdHlwZS5vclM9ZnVuY3Rpb24odCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKXx0KTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUub3JNPWZ1bmN0aW9uKHQpe2lmKHQ9ZS5jaGVja01hdHJpeCh0KSx0aGlzLnJvd3MhPT10LnJvd3N8fHRoaXMuY29sdW1ucyE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKXx0LmdldChlLHIpKTtyZXR1cm4gdGhpc30sdC5vcj1mdW5jdGlvbih0LHIpe3JldHVybiBuZXcgZSh0KS5vcihyKX0sdC5wcm90b3R5cGUueG9yPWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90aGlzLnhvclModCk6dGhpcy54b3JNKHQpfSx0LnByb3RvdHlwZS54b3JTPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUsciledCk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLnhvck09ZnVuY3Rpb24odCl7aWYodD1lLmNoZWNrTWF0cml4KHQpLHRoaXMucm93cyE9PXQucm93c3x8dGhpcy5jb2x1bW5zIT09dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpXnQuZ2V0KGUscikpO3JldHVybiB0aGlzfSx0Lnhvcj1mdW5jdGlvbih0LHIpe3JldHVybiBuZXcgZSh0KS54b3Iocil9LHQucHJvdG90eXBlLmxlZnRTaGlmdD1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/dGhpcy5sZWZ0U2hpZnRTKHQpOnRoaXMubGVmdFNoaWZ0TSh0KX0sdC5wcm90b3R5cGUubGVmdFNoaWZ0Uz1mdW5jdGlvbih0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpPDx0KTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUubGVmdFNoaWZ0TT1mdW5jdGlvbih0KXtpZih0PWUuY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscik8PHQuZ2V0KGUscikpO3JldHVybiB0aGlzfSx0LmxlZnRTaGlmdD1mdW5jdGlvbih0LHIpe3JldHVybiBuZXcgZSh0KS5sZWZ0U2hpZnQocil9LHQucHJvdG90eXBlLnNpZ25Qcm9wYWdhdGluZ1JpZ2h0U2hpZnQ9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3RoaXMuc2lnblByb3BhZ2F0aW5nUmlnaHRTaGlmdFModCk6dGhpcy5zaWduUHJvcGFnYXRpbmdSaWdodFNoaWZ0TSh0KX0sdC5wcm90b3R5cGUuc2lnblByb3BhZ2F0aW5nUmlnaHRTaGlmdFM9ZnVuY3Rpb24odCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKT4+dCk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLnNpZ25Qcm9wYWdhdGluZ1JpZ2h0U2hpZnRNPWZ1bmN0aW9uKHQpe2lmKHQ9ZS5jaGVja01hdHJpeCh0KSx0aGlzLnJvd3MhPT10LnJvd3N8fHRoaXMuY29sdW1ucyE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKT4+dC5nZXQoZSxyKSk7cmV0dXJuIHRoaXN9LHQuc2lnblByb3BhZ2F0aW5nUmlnaHRTaGlmdD1mdW5jdGlvbih0LHIpe3JldHVybiBuZXcgZSh0KS5zaWduUHJvcGFnYXRpbmdSaWdodFNoaWZ0KHIpfSx0LnByb3RvdHlwZS5yaWdodFNoaWZ0PWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90aGlzLnJpZ2h0U2hpZnRTKHQpOnRoaXMucmlnaHRTaGlmdE0odCl9LHQucHJvdG90eXBlLnJpZ2h0U2hpZnRTPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscik+Pj50KTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUucmlnaHRTaGlmdE09ZnVuY3Rpb24odCl7aWYodD1lLmNoZWNrTWF0cml4KHQpLHRoaXMucm93cyE9PXQucm93c3x8dGhpcy5jb2x1bW5zIT09dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpPj4+dC5nZXQoZSxyKSk7cmV0dXJuIHRoaXN9LHQucmlnaHRTaGlmdD1mdW5jdGlvbih0LHIpe3JldHVybiBuZXcgZSh0KS5yaWdodFNoaWZ0KHIpfSx0LnByb3RvdHlwZS56ZXJvRmlsbFJpZ2h0U2hpZnQ9dC5wcm90b3R5cGUucmlnaHRTaGlmdCx0LnByb3RvdHlwZS56ZXJvRmlsbFJpZ2h0U2hpZnRTPXQucHJvdG90eXBlLnJpZ2h0U2hpZnRTLHQucHJvdG90eXBlLnplcm9GaWxsUmlnaHRTaGlmdE09dC5wcm90b3R5cGUucmlnaHRTaGlmdE0sdC56ZXJvRmlsbFJpZ2h0U2hpZnQ9dC5yaWdodFNoaWZ0LHQucHJvdG90eXBlLm5vdD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLH50aGlzLmdldCh0LGUpKTtyZXR1cm4gdGhpc30sdC5ub3Q9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLm5vdCgpfSx0LnByb3RvdHlwZS5hYnM9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmFicyh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuYWJzPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5hYnMoKX0sdC5wcm90b3R5cGUuYWNvcz1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguYWNvcyh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuYWNvcz1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuYWNvcygpfSx0LnByb3RvdHlwZS5hY29zaD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguYWNvc2godGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmFjb3NoPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5hY29zaCgpfSx0LnByb3RvdHlwZS5hc2luPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5hc2luKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5hc2luPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5hc2luKCl9LHQucHJvdG90eXBlLmFzaW5oPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5hc2luaCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuYXNpbmg9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmFzaW5oKCl9LHQucHJvdG90eXBlLmF0YW49ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmF0YW4odGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmF0YW49ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmF0YW4oKX0sdC5wcm90b3R5cGUuYXRhbmg9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmF0YW5oKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5hdGFuaD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuYXRhbmgoKX0sdC5wcm90b3R5cGUuY2JydD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguY2JydCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuY2JydD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuY2JydCgpfSx0LnByb3RvdHlwZS5jZWlsPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5jZWlsKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5jZWlsPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5jZWlsKCl9LHQucHJvdG90eXBlLmNsejMyPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5jbHozMih0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuY2x6MzI9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmNsejMyKCl9LHQucHJvdG90eXBlLmNvcz1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguY29zKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5jb3M9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmNvcygpfSx0LnByb3RvdHlwZS5jb3NoPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5jb3NoKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5jb3NoPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5jb3NoKCl9LHQucHJvdG90eXBlLmV4cD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguZXhwKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5leHA9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmV4cCgpfSx0LnByb3RvdHlwZS5leHBtMT1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguZXhwbTEodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmV4cG0xPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5leHBtMSgpfSx0LnByb3RvdHlwZS5mbG9vcj1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguZmxvb3IodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmZsb29yPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5mbG9vcigpfSx0LnByb3RvdHlwZS5mcm91bmQ9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmZyb3VuZCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuZnJvdW5kPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5mcm91bmQoKX0sdC5wcm90b3R5cGUubG9nPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5sb2codGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmxvZz1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkubG9nKCl9LHQucHJvdG90eXBlLmxvZzFwPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5sb2cxcCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQubG9nMXA9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmxvZzFwKCl9LHQucHJvdG90eXBlLmxvZzEwPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5sb2cxMCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQubG9nMTA9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmxvZzEwKCl9LHQucHJvdG90eXBlLmxvZzI9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmxvZzIodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmxvZzI9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmxvZzIoKX0sdC5wcm90b3R5cGUucm91bmQ9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLnJvdW5kKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5yb3VuZD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkucm91bmQoKX0sdC5wcm90b3R5cGUuc2lnbj1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguc2lnbih0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuc2lnbj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuc2lnbigpfSx0LnByb3RvdHlwZS5zaW49ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLnNpbih0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuc2luPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5zaW4oKX0sdC5wcm90b3R5cGUuc2luaD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguc2luaCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuc2luaD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuc2luaCgpfSx0LnByb3RvdHlwZS5zcXJ0PWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5zcXJ0KHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5zcXJ0PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5zcXJ0KCl9LHQucHJvdG90eXBlLnRhbj1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGgudGFuKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC50YW49ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLnRhbigpfSx0LnByb3RvdHlwZS50YW5oPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC50YW5oKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC50YW5oPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS50YW5oKCl9LHQucHJvdG90eXBlLnRydW5jPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC50cnVuYyh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQudHJ1bmM9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLnRydW5jKCl9LHQucG93PWZ1bmN0aW9uKHQscil7cmV0dXJuIG5ldyBlKHQpLnBvdyhyKX0sdC5wcm90b3R5cGUucG93PWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90aGlzLnBvd1ModCk6dGhpcy5wb3dNKHQpfSx0LnByb3RvdHlwZS5wb3dTPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLE1hdGgucG93KHRoaXMuZ2V0KGUsciksdCkpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5wb3dNPWZ1bmN0aW9uKHQpe2lmKHQ9ZS5jaGVja01hdHJpeCh0KSx0aGlzLnJvd3MhPT10LnJvd3N8fHRoaXMuY29sdW1ucyE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsTWF0aC5wb3codGhpcy5nZXQoZSxyKSx0LmdldChlLHIpKSk7cmV0dXJuIHRoaXN9fShxbixVbik7Y2xhc3MgTG4gZXh0ZW5kcyBxbntjb25zdHJ1Y3Rvcih0LGUscil7c3VwZXIoKSx0aGlzLm1hdHJpeD10LHRoaXMucm93cz1lLHRoaXMuY29sdW1ucz1yfX1jbGFzcyBCbiBleHRlbmRzIExue2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQsdC5jb2x1bW5zLHQucm93cyl9c2V0KHQsZSxyKXtyZXR1cm4gdGhpcy5tYXRyaXguc2V0KGUsdCxyKSx0aGlzfWdldCh0LGUpe3JldHVybiB0aGlzLm1hdHJpeC5nZXQoZSx0KX19Y2xhc3MgR24gZXh0ZW5kcyBxbntjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMuZGF0YT10LHRoaXMucm93cz10Lmxlbmd0aCx0aGlzLmNvbHVtbnM9dFswXS5sZW5ndGh9c2V0KHQsZSxyKXtyZXR1cm4gdGhpcy5kYXRhW3RdW2VdPXIsdGhpc31nZXQodCxlKXtyZXR1cm4gdGhpcy5kYXRhW3RdW2VdfX1mdW5jdGlvbiBXbih0LGUpe2xldCByPTA7cmV0dXJuIE1hdGguYWJzKHQpPk1hdGguYWJzKGUpPyhyPWUvdCxNYXRoLmFicyh0KSpNYXRoLnNxcnQoMStyKnIpKTowIT09ZT8ocj10L2UsTWF0aC5hYnMoZSkqTWF0aC5zcXJ0KDErcipyKSk6MH1jbGFzcyBLbntjb25zdHJ1Y3Rvcih0LGU9e30pe2lmKCh0PUduLmNoZWNrTWF0cml4KHQpKS5pc0VtcHR5KCkpdGhyb3cgbmV3IEVycm9yKCJNYXRyaXggbXVzdCBiZSBub24tZW1wdHkiKTtsZXQgcj10LnJvd3Msbj10LmNvbHVtbnM7Y29uc3R7Y29tcHV0ZUxlZnRTaW5ndWxhclZlY3RvcnM6bz0hMCxjb21wdXRlUmlnaHRTaW5ndWxhclZlY3RvcnM6cz0hMCxhdXRvVHJhbnNwb3NlOmk9ITF9PWU7bGV0IHUsYT1Cb29sZWFuKG8pLGw9Qm9vbGVhbihzKSxoPSExO2lmKHI8bilpZihpKXt1PXQudHJhbnNwb3NlKCkscj11LnJvd3Msbj11LmNvbHVtbnMsaD0hMDtsZXQgZT1hO2E9bCxsPWV9ZWxzZSB1PXQuY2xvbmUoKSxjb25zb2xlLndhcm4oIkNvbXB1dGluZyBTVkQgb24gYSBtYXRyaXggd2l0aCBtb3JlIGNvbHVtbnMgdGhhbiByb3dzLiBDb25zaWRlciBlbmFibGluZyBhdXRvVHJhbnNwb3NlIik7ZWxzZSB1PXQuY2xvbmUoKTtsZXQgYz1NYXRoLm1pbihyLG4pLGY9TWF0aC5taW4ocisxLG4pLG09bmV3IEZsb2F0NjRBcnJheShmKSxnPW5ldyBVbihyLGMpLHA9bmV3IFVuKG4sbiksdz1uZXcgRmxvYXQ2NEFycmF5KG4pLGQ9bmV3IEZsb2F0NjRBcnJheShyKSxiPW5ldyBGbG9hdDY0QXJyYXkoZik7Zm9yKGxldCB0PTA7dDxmO3QrKyliW3RdPXQ7bGV0IHk9TWF0aC5taW4oci0xLG4pLHY9TWF0aC5tYXgoMCxNYXRoLm1pbihuLTIscikpLE09TWF0aC5tYXgoeSx2KTtmb3IobGV0IHQ9MDt0PE07dCsrKXtpZih0PHkpe21bdF09MDtmb3IobGV0IGU9dDtlPHI7ZSsrKW1bdF09V24obVt0XSx1LmdldChlLHQpKTtpZigwIT09bVt0XSl7dS5nZXQodCx0KTwwJiYobVt0XT0tbVt0XSk7Zm9yKGxldCBlPXQ7ZTxyO2UrKyl1LnNldChlLHQsdS5nZXQoZSx0KS9tW3RdKTt1LnNldCh0LHQsdS5nZXQodCx0KSsxKX1tW3RdPS1tW3RdfWZvcihsZXQgZT10KzE7ZTxuO2UrKyl7aWYodDx5JiYwIT09bVt0XSl7bGV0IG49MDtmb3IobGV0IG89dDtvPHI7bysrKW4rPXUuZ2V0KG8sdCkqdS5nZXQobyxlKTtuPS1uL3UuZ2V0KHQsdCk7Zm9yKGxldCBvPXQ7bzxyO28rKyl1LnNldChvLGUsdS5nZXQobyxlKStuKnUuZ2V0KG8sdCkpfXdbZV09dS5nZXQodCxlKX1pZihhJiZ0PHkpZm9yKGxldCBlPXQ7ZTxyO2UrKylnLnNldChlLHQsdS5nZXQoZSx0KSk7aWYodDx2KXt3W3RdPTA7Zm9yKGxldCBlPXQrMTtlPG47ZSsrKXdbdF09V24od1t0XSx3W2VdKTtpZigwIT09d1t0XSl7d1t0KzFdPDAmJih3W3RdPTAtd1t0XSk7Zm9yKGxldCBlPXQrMTtlPG47ZSsrKXdbZV0vPXdbdF07d1t0KzFdKz0xfWlmKHdbdF09LXdbdF0sdCsxPHImJjAhPT13W3RdKXtmb3IobGV0IGU9dCsxO2U8cjtlKyspZFtlXT0wO2ZvcihsZXQgZT10KzE7ZTxyO2UrKylmb3IobGV0IHI9dCsxO3I8bjtyKyspZFtlXSs9d1tyXSp1LmdldChlLHIpO2ZvcihsZXQgZT10KzE7ZTxuO2UrKyl7bGV0IG49LXdbZV0vd1t0KzFdO2ZvcihsZXQgbz10KzE7bzxyO28rKyl1LnNldChvLGUsdS5nZXQobyxlKStuKmRbb10pfX1pZihsKWZvcihsZXQgZT10KzE7ZTxuO2UrKylwLnNldChlLHQsd1tlXSl9fWxldCBqPU1hdGgubWluKG4scisxKTtpZih5PG4mJihtW3ldPXUuZ2V0KHkseSkpLHI8aiYmKG1bai0xXT0wKSx2KzE8aiYmKHdbdl09dS5nZXQodixqLTEpKSx3W2otMV09MCxhKXtmb3IobGV0IHQ9eTt0PGM7dCsrKXtmb3IobGV0IGU9MDtlPHI7ZSsrKWcuc2V0KGUsdCwwKTtnLnNldCh0LHQsMSl9Zm9yKGxldCB0PXktMTt0Pj0wO3QtLSlpZigwIT09bVt0XSl7Zm9yKGxldCBlPXQrMTtlPGM7ZSsrKXtsZXQgbj0wO2ZvcihsZXQgbz10O288cjtvKyspbis9Zy5nZXQobyx0KSpnLmdldChvLGUpO249LW4vZy5nZXQodCx0KTtmb3IobGV0IG89dDtvPHI7bysrKWcuc2V0KG8sZSxnLmdldChvLGUpK24qZy5nZXQobyx0KSl9Zm9yKGxldCBlPXQ7ZTxyO2UrKylnLnNldChlLHQsLWcuZ2V0KGUsdCkpO2cuc2V0KHQsdCwxK2cuZ2V0KHQsdCkpO2ZvcihsZXQgZT0wO2U8dC0xO2UrKylnLnNldChlLHQsMCl9ZWxzZXtmb3IobGV0IGU9MDtlPHI7ZSsrKWcuc2V0KGUsdCwwKTtnLnNldCh0LHQsMSl9fWlmKGwpZm9yKGxldCB0PW4tMTt0Pj0wO3QtLSl7aWYodDx2JiYwIT09d1t0XSlmb3IobGV0IGU9dCsxO2U8bjtlKyspe2xldCByPTA7Zm9yKGxldCBvPXQrMTtvPG47bysrKXIrPXAuZ2V0KG8sdCkqcC5nZXQobyxlKTtyPS1yL3AuZ2V0KHQrMSx0KTtmb3IobGV0IG89dCsxO288bjtvKyspcC5zZXQobyxlLHAuZ2V0KG8sZSkrcipwLmdldChvLHQpKX1mb3IobGV0IGU9MDtlPG47ZSsrKXAuc2V0KGUsdCwwKTtwLnNldCh0LHQsMSl9bGV0IHg9ai0xLF89TnVtYmVyLkVQU0lMT047Zm9yKDtqPjA7KXtsZXQgdCxlO2Zvcih0PWotMjt0Pj0tMSYmLTEhPT10O3QtLSl7Y29uc3QgZT1OdW1iZXIuTUlOX1ZBTFVFK18qTWF0aC5hYnMobVt0XStNYXRoLmFicyhtW3QrMV0pKTtpZihNYXRoLmFicyh3W3RdKTw9ZXx8TnVtYmVyLmlzTmFOKHdbdF0pKXt3W3RdPTA7YnJlYWt9fWlmKHQ9PT1qLTIpZT00O2Vsc2V7bGV0IHI7Zm9yKHI9ai0xO3I+PXQmJnIhPT10O3ItLSl7bGV0IGU9KHIhPT1qP01hdGguYWJzKHdbcl0pOjApKyhyIT09dCsxP01hdGguYWJzKHdbci0xXSk6MCk7aWYoTWF0aC5hYnMobVtyXSk8PV8qZSl7bVtyXT0wO2JyZWFrfX1yPT09dD9lPTM6cj09PWotMT9lPTE6KGU9Mix0PXIpfXN3aXRjaCh0KyssZSl7Y2FzZSAxOntsZXQgZT13W2otMl07d1tqLTJdPTA7Zm9yKGxldCByPWotMjtyPj10O3ItLSl7bGV0IG89V24obVtyXSxlKSxzPW1bcl0vbyxpPWUvbztpZihtW3JdPW8sciE9PXQmJihlPS1pKndbci0xXSx3W3ItMV09cyp3W3ItMV0pLGwpZm9yKGxldCB0PTA7dDxuO3QrKylvPXMqcC5nZXQodCxyKStpKnAuZ2V0KHQsai0xKSxwLnNldCh0LGotMSwtaSpwLmdldCh0LHIpK3MqcC5nZXQodCxqLTEpKSxwLnNldCh0LHIsbyl9YnJlYWt9Y2FzZSAyOntsZXQgZT13W3QtMV07d1t0LTFdPTA7Zm9yKGxldCBuPXQ7bjxqO24rKyl7bGV0IG89V24obVtuXSxlKSxzPW1bbl0vbyxpPWUvbztpZihtW25dPW8sZT0taSp3W25dLHdbbl09cyp3W25dLGEpZm9yKGxldCBlPTA7ZTxyO2UrKylvPXMqZy5nZXQoZSxuKStpKmcuZ2V0KGUsdC0xKSxnLnNldChlLHQtMSwtaSpnLmdldChlLG4pK3MqZy5nZXQoZSx0LTEpKSxnLnNldChlLG4sbyl9YnJlYWt9Y2FzZSAzOntjb25zdCBlPU1hdGgubWF4KE1hdGguYWJzKG1bai0xXSksTWF0aC5hYnMobVtqLTJdKSxNYXRoLmFicyh3W2otMl0pLE1hdGguYWJzKG1bdF0pLE1hdGguYWJzKHdbdF0pKSxvPW1bai0xXS9lLHM9bVtqLTJdL2UsaT13W2otMl0vZSx1PW1bdF0vZSxoPXdbdF0vZSxjPSgocytvKSoocy1vKStpKmkpLzIsZj1vKmkqKG8qaSk7bGV0IGQ9MDswPT09YyYmMD09PWZ8fChkPWM8MD8wLU1hdGguc3FydChjKmMrZik6TWF0aC5zcXJ0KGMqYytmKSxkPWYvKGMrZCkpO2xldCBiPSh1K28pKih1LW8pK2QseT11Kmg7Zm9yKGxldCBlPXQ7ZTxqLTE7ZSsrKXtsZXQgbz1XbihiLHkpOzA9PT1vJiYobz1OdW1iZXIuTUlOX1ZBTFVFKTtsZXQgcz1iL28saT15L287aWYoZSE9PXQmJih3W2UtMV09byksYj1zKm1bZV0raSp3W2VdLHdbZV09cyp3W2VdLWkqbVtlXSx5PWkqbVtlKzFdLG1bZSsxXT1zKm1bZSsxXSxsKWZvcihsZXQgdD0wO3Q8bjt0Kyspbz1zKnAuZ2V0KHQsZSkraSpwLmdldCh0LGUrMSkscC5zZXQodCxlKzEsLWkqcC5nZXQodCxlKStzKnAuZ2V0KHQsZSsxKSkscC5zZXQodCxlLG8pO2lmKG89V24oYix5KSwwPT09byYmKG89TnVtYmVyLk1JTl9WQUxVRSkscz1iL28saT15L28sbVtlXT1vLGI9cyp3W2VdK2kqbVtlKzFdLG1bZSsxXT0taSp3W2VdK3MqbVtlKzFdLHk9aSp3W2UrMV0sd1tlKzFdPXMqd1tlKzFdLGEmJmU8ci0xKWZvcihsZXQgdD0wO3Q8cjt0Kyspbz1zKmcuZ2V0KHQsZSkraSpnLmdldCh0LGUrMSksZy5zZXQodCxlKzEsLWkqZy5nZXQodCxlKStzKmcuZ2V0KHQsZSsxKSksZy5zZXQodCxlLG8pfXdbai0yXT1iO2JyZWFrfWNhc2UgNDppZihtW3RdPD0wJiYobVt0XT1tW3RdPDA/LW1bdF06MCxsKSlmb3IobGV0IGU9MDtlPD14O2UrKylwLnNldChlLHQsLXAuZ2V0KGUsdCkpO2Zvcig7dDx4JiYhKG1bdF0+PW1bdCsxXSk7KXtsZXQgZT1tW3RdO2lmKG1bdF09bVt0KzFdLG1bdCsxXT1lLGwmJnQ8bi0xKWZvcihsZXQgcj0wO3I8bjtyKyspZT1wLmdldChyLHQrMSkscC5zZXQocix0KzEscC5nZXQocix0KSkscC5zZXQocix0LGUpO2lmKGEmJnQ8ci0xKWZvcihsZXQgbj0wO248cjtuKyspZT1nLmdldChuLHQrMSksZy5zZXQobix0KzEsZy5nZXQobix0KSksZy5zZXQobix0LGUpO3QrK31qLS19fWlmKGgpe2xldCB0PXA7cD1nLGc9dH10aGlzLm09cix0aGlzLm49bix0aGlzLnM9bSx0aGlzLlU9Zyx0aGlzLlY9cH1zb2x2ZSh0KXtsZXQgZT10LHI9dGhpcy50aHJlc2hvbGQsbj10aGlzLnMubGVuZ3RoLG89VW4uemVyb3MobixuKTtmb3IobGV0IHQ9MDt0PG47dCsrKU1hdGguYWJzKHRoaXMuc1t0XSk8PXI/by5zZXQodCx0LDApOm8uc2V0KHQsdCwxL3RoaXMuc1t0XSk7bGV0IHM9dGhpcy5VLGk9dGhpcy5yaWdodFNpbmd1bGFyVmVjdG9ycyx1PWkubW11bChvKSxhPWkucm93cyxsPXMucm93cyxoPVVuLnplcm9zKGEsbCk7Zm9yKGxldCB0PTA7dDxhO3QrKylmb3IobGV0IGU9MDtlPGw7ZSsrKXtsZXQgcj0wO2ZvcihsZXQgbz0wO288bjtvKyspcis9dS5nZXQodCxvKSpzLmdldChlLG8pO2guc2V0KHQsZSxyKX1yZXR1cm4gaC5tbXVsKGUpfXNvbHZlRm9yRGlhZ29uYWwodCl7cmV0dXJuIHRoaXMuc29sdmUoVW4uZGlhZyh0KSl9aW52ZXJzZSgpe2xldCB0PXRoaXMuVixlPXRoaXMudGhyZXNob2xkLHI9dC5yb3dzLG49dC5jb2x1bW5zLG89bmV3IFVuKHIsdGhpcy5zLmxlbmd0aCk7Zm9yKGxldCBzPTA7czxyO3MrKylmb3IobGV0IHI9MDtyPG47cisrKU1hdGguYWJzKHRoaXMuc1tyXSk+ZSYmby5zZXQocyxyLHQuZ2V0KHMscikvdGhpcy5zW3JdKTtsZXQgcz10aGlzLlUsaT1zLnJvd3MsdT1zLmNvbHVtbnMsYT1uZXcgVW4ocixpKTtmb3IobGV0IHQ9MDt0PHI7dCsrKWZvcihsZXQgZT0wO2U8aTtlKyspe2xldCByPTA7Zm9yKGxldCBuPTA7bjx1O24rKylyKz1vLmdldCh0LG4pKnMuZ2V0KGUsbik7YS5zZXQodCxlLHIpfXJldHVybiBhfWdldCBjb25kaXRpb24oKXtyZXR1cm4gdGhpcy5zWzBdL3RoaXMuc1tNYXRoLm1pbih0aGlzLm0sdGhpcy5uKS0xXX1nZXQgbm9ybTIoKXtyZXR1cm4gdGhpcy5zWzBdfWdldCByYW5rKCl7bGV0IHQ9TWF0aC5tYXgodGhpcy5tLHRoaXMubikqdGhpcy5zWzBdKk51bWJlci5FUFNJTE9OLGU9MCxyPXRoaXMucztmb3IobGV0IG49MCxvPXIubGVuZ3RoO248bztuKyspcltuXT50JiZlKys7cmV0dXJuIGV9Z2V0IGRpYWdvbmFsKCl7cmV0dXJuIEFycmF5LmZyb20odGhpcy5zKX1nZXQgdGhyZXNob2xkKCl7cmV0dXJuIE51bWJlci5FUFNJTE9OLzIqTWF0aC5tYXgodGhpcy5tLHRoaXMubikqdGhpcy5zWzBdfWdldCBsZWZ0U2luZ3VsYXJWZWN0b3JzKCl7cmV0dXJuIHRoaXMuVX1nZXQgcmlnaHRTaW5ndWxhclZlY3RvcnMoKXtyZXR1cm4gdGhpcy5WfWdldCBkaWFnb25hbE1hdHJpeCgpe3JldHVybiBVbi5kaWFnKHRoaXMucyl9fWNsYXNzIFlue2NvbnN0cnVjdG9yKHQsZT17fSl7Y29uc3R7YXNzdW1lU3ltbWV0cmljOnI9ITF9PWU7aWYoISh0PUduLmNoZWNrTWF0cml4KHQpKS5pc1NxdWFyZSgpKXRocm93IG5ldyBFcnJvcigiTWF0cml4IGlzIG5vdCBhIHNxdWFyZSBtYXRyaXgiKTtpZih0LmlzRW1wdHkoKSl0aHJvdyBuZXcgRXJyb3IoIk1hdHJpeCBtdXN0IGJlIG5vbi1lbXB0eSIpO2xldCBuLG8scz10LmNvbHVtbnMsaT1uZXcgVW4ocyxzKSx1PW5ldyBGbG9hdDY0QXJyYXkocyksYT1uZXcgRmxvYXQ2NEFycmF5KHMpLGw9dCxoPSExO2lmKGg9ISFyfHx0LmlzU3ltbWV0cmljKCksaCl7Zm9yKG49MDtuPHM7bisrKWZvcihvPTA7bzxzO28rKylpLnNldChuLG8sbC5nZXQobixvKSk7IWZ1bmN0aW9uKHQsZSxyLG4pe2xldCBvLHMsaSx1LGEsbCxoLGM7Zm9yKGE9MDthPHQ7YSsrKXJbYV09bi5nZXQodC0xLGEpO2Zvcih1PXQtMTt1PjA7dS0tKXtmb3IoYz0wLGk9MCxsPTA7bDx1O2wrKyljKz1NYXRoLmFicyhyW2xdKTtpZigwPT09Yylmb3IoZVt1XT1yW3UtMV0sYT0wO2E8dTthKyspclthXT1uLmdldCh1LTEsYSksbi5zZXQodSxhLDApLG4uc2V0KGEsdSwwKTtlbHNle2ZvcihsPTA7bDx1O2wrKylyW2xdLz1jLGkrPXJbbF0qcltsXTtmb3Iobz1yW3UtMV0scz1NYXRoLnNxcnQoaSksbz4wJiYocz0tcyksZVt1XT1jKnMsaS09bypzLHJbdS0xXT1vLXMsYT0wO2E8dTthKyspZVthXT0wO2ZvcihhPTA7YTx1O2ErKyl7Zm9yKG89clthXSxuLnNldChhLHUsbykscz1lW2FdK24uZ2V0KGEsYSkqbyxsPWErMTtsPD11LTE7bCsrKXMrPW4uZ2V0KGwsYSkqcltsXSxlW2xdKz1uLmdldChsLGEpKm87ZVthXT1zfWZvcihvPTAsYT0wO2E8dTthKyspZVthXS89aSxvKz1lW2FdKnJbYV07Zm9yKGg9by8oaStpKSxhPTA7YTx1O2ErKyllW2FdLT1oKnJbYV07Zm9yKGE9MDthPHU7YSsrKXtmb3Iobz1yW2FdLHM9ZVthXSxsPWE7bDw9dS0xO2wrKyluLnNldChsLGEsbi5nZXQobCxhKS0obyplW2xdK3MqcltsXSkpO3JbYV09bi5nZXQodS0xLGEpLG4uc2V0KHUsYSwwKX19clt1XT1pfWZvcih1PTA7dTx0LTE7dSsrKXtpZihuLnNldCh0LTEsdSxuLmdldCh1LHUpKSxuLnNldCh1LHUsMSksaT1yW3UrMV0sMCE9PWkpe2ZvcihsPTA7bDw9dTtsKyspcltsXT1uLmdldChsLHUrMSkvaTtmb3IoYT0wO2E8PXU7YSsrKXtmb3Iocz0wLGw9MDtsPD11O2wrKylzKz1uLmdldChsLHUrMSkqbi5nZXQobCxhKTtmb3IobD0wO2w8PXU7bCsrKW4uc2V0KGwsYSxuLmdldChsLGEpLXMqcltsXSl9fWZvcihsPTA7bDw9dTtsKyspbi5zZXQobCx1KzEsMCl9Zm9yKGE9MDthPHQ7YSsrKXJbYV09bi5nZXQodC0xLGEpLG4uc2V0KHQtMSxhLDApO24uc2V0KHQtMSx0LTEsMSksZVswXT0wfShzLGEsdSxpKSxmdW5jdGlvbih0LGUscixuKXtsZXQgbyxzLGksdSxhLGwsaCxjLGYsbSxnLHAsdyxkLGIseTtmb3IoaT0xO2k8dDtpKyspZVtpLTFdPWVbaV07ZVt0LTFdPTA7bGV0IHY9MCxNPTAsaj1OdW1iZXIuRVBTSUxPTjtmb3IobD0wO2w8dDtsKyspe2ZvcihNPU1hdGgubWF4KE0sTWF0aC5hYnMocltsXSkrTWF0aC5hYnMoZVtsXSkpLGg9bDtoPHQmJiEoTWF0aC5hYnMoZVtoXSk8PWoqTSk7KWgrKztpZihoPmwpZG97Zm9yKG89cltsXSxjPShyW2wrMV0tbykvKDIqZVtsXSksZj1XbihjLDEpLGM8MCYmKGY9LWYpLHJbbF09ZVtsXS8oYytmKSxyW2wrMV09ZVtsXSooYytmKSxtPXJbbCsxXSxzPW8tcltsXSxpPWwrMjtpPHQ7aSsrKXJbaV0tPXM7Zm9yKHYrPXMsYz1yW2hdLGc9MSxwPWcsdz1nLGQ9ZVtsKzFdLGI9MCx5PTAsaT1oLTE7aT49bDtpLS0pZm9yKHc9cCxwPWcseT1iLG89ZyplW2ldLHM9ZypjLGY9V24oYyxlW2ldKSxlW2krMV09YipmLGI9ZVtpXS9mLGc9Yy9mLGM9ZypyW2ldLWIqbyxyW2krMV09cytiKihnKm8rYipyW2ldKSxhPTA7YTx0O2ErKylzPW4uZ2V0KGEsaSsxKSxuLnNldChhLGkrMSxiKm4uZ2V0KGEsaSkrZypzKSxuLnNldChhLGksZypuLmdldChhLGkpLWIqcyk7Yz0tYip5KncqZCplW2xdL20sZVtsXT1iKmMscltsXT1nKmN9d2hpbGUoTWF0aC5hYnMoZVtsXSk+aipNKTtyW2xdPXJbbF0rdixlW2xdPTB9Zm9yKGk9MDtpPHQtMTtpKyspe2ZvcihhPWksYz1yW2ldLHU9aSsxO3U8dDt1Kyspclt1XTxjJiYoYT11LGM9clt1XSk7aWYoYSE9PWkpZm9yKHJbYV09cltpXSxyW2ldPWMsdT0wO3U8dDt1KyspYz1uLmdldCh1LGkpLG4uc2V0KHUsaSxuLmdldCh1LGEpKSxuLnNldCh1LGEsYyl9fShzLGEsdSxpKX1lbHNle2xldCB0PW5ldyBVbihzLHMpLGU9bmV3IEZsb2F0NjRBcnJheShzKTtmb3Iobz0wO288cztvKyspZm9yKG49MDtuPHM7bisrKXQuc2V0KG4sbyxsLmdldChuLG8pKTshZnVuY3Rpb24odCxlLHIsbil7bGV0IG8scyxpLHUsYSxsLGgsYz0wLGY9dC0xO2ZvcihsPWMrMTtsPD1mLTE7bCsrKXtmb3IoaD0wLHU9bDt1PD1mO3UrKyloKz1NYXRoLmFicyhlLmdldCh1LGwtMSkpO2lmKDAhPT1oKXtmb3IoaT0wLHU9Zjt1Pj1sO3UtLSlyW3VdPWUuZ2V0KHUsbC0xKS9oLGkrPXJbdV0qclt1XTtmb3Iocz1NYXRoLnNxcnQoaSkscltsXT4wJiYocz0tcyksaS09cltsXSpzLHJbbF09cltsXS1zLGE9bDthPHQ7YSsrKXtmb3Iobz0wLHU9Zjt1Pj1sO3UtLSlvKz1yW3VdKmUuZ2V0KHUsYSk7Zm9yKG8vPWksdT1sO3U8PWY7dSsrKWUuc2V0KHUsYSxlLmdldCh1LGEpLW8qclt1XSl9Zm9yKHU9MDt1PD1mO3UrKyl7Zm9yKG89MCxhPWY7YT49bDthLS0pbys9clthXSplLmdldCh1LGEpO2ZvcihvLz1pLGE9bDthPD1mO2ErKyllLnNldCh1LGEsZS5nZXQodSxhKS1vKnJbYV0pfXJbbF09aCpyW2xdLGUuc2V0KGwsbC0xLGgqcyl9fWZvcih1PTA7dTx0O3UrKylmb3IoYT0wO2E8dDthKyspbi5zZXQodSxhLHU9PT1hPzE6MCk7Zm9yKGw9Zi0xO2w+PWMrMTtsLS0paWYoMCE9PWUuZ2V0KGwsbC0xKSl7Zm9yKHU9bCsxO3U8PWY7dSsrKXJbdV09ZS5nZXQodSxsLTEpO2ZvcihhPWw7YTw9ZjthKyspe2ZvcihzPTAsdT1sO3U8PWY7dSsrKXMrPXJbdV0qbi5nZXQodSxhKTtmb3Iocz1zL3JbbF0vZS5nZXQobCxsLTEpLHU9bDt1PD1mO3UrKyluLnNldCh1LGEsbi5nZXQodSxhKStzKnJbdV0pfX19KHMsdCxlLGkpLGZ1bmN0aW9uKHQsZSxyLG4sbyl7bGV0IHMsaSx1LGEsbCxoLGMsZixtLGcscCx3LGQsYix5LHY9dC0xLE09MCxqPXQtMSx4PU51bWJlci5FUFNJTE9OLF89MCxFPTAsUz0wLE89MCxBPTAsQz0wLFI9MCxJPTA7Zm9yKHM9MDtzPHQ7cysrKWZvcigoczxNfHxzPmopJiYocltzXT1vLmdldChzLHMpLGVbc109MCksaT1NYXRoLm1heChzLTEsMCk7aTx0O2krKylFKz1NYXRoLmFicyhvLmdldChzLGkpKTtmb3IoO3Y+PU07KXtmb3IoYT12O2E+TSYmKEM9TWF0aC5hYnMoby5nZXQoYS0xLGEtMSkpK01hdGguYWJzKG8uZ2V0KGEsYSkpLDA9PT1DJiYoQz1FKSwhKE1hdGguYWJzKG8uZ2V0KGEsYS0xKSk8eCpDKSk7KWEtLTtpZihhPT09dilvLnNldCh2LHYsby5nZXQodix2KStfKSxyW3ZdPW8uZ2V0KHYsdiksZVt2XT0wLHYtLSxJPTA7ZWxzZSBpZihhPT09di0xKXtpZihjPW8uZ2V0KHYsdi0xKSpvLmdldCh2LTEsdiksUz0oby5nZXQodi0xLHYtMSktby5nZXQodix2KSkvMixPPVMqUytjLFI9TWF0aC5zcXJ0KE1hdGguYWJzKE8pKSxvLnNldCh2LHYsby5nZXQodix2KStfKSxvLnNldCh2LTEsdi0xLG8uZ2V0KHYtMSx2LTEpK18pLGY9by5nZXQodix2KSxPPj0wKXtmb3IoUj1TPj0wP1MrUjpTLVIsclt2LTFdPWYrUixyW3ZdPXJbdi0xXSwwIT09UiYmKHJbdl09Zi1jL1IpLGVbdi0xXT0wLGVbdl09MCxmPW8uZ2V0KHYsdi0xKSxDPU1hdGguYWJzKGYpK01hdGguYWJzKFIpLFM9Zi9DLE89Ui9DLEE9TWF0aC5zcXJ0KFMqUytPKk8pLFMvPUEsTy89QSxpPXYtMTtpPHQ7aSsrKVI9by5nZXQodi0xLGkpLG8uc2V0KHYtMSxpLE8qUitTKm8uZ2V0KHYsaSkpLG8uc2V0KHYsaSxPKm8uZ2V0KHYsaSktUypSKTtmb3Iocz0wO3M8PXY7cysrKVI9by5nZXQocyx2LTEpLG8uc2V0KHMsdi0xLE8qUitTKm8uZ2V0KHMsdikpLG8uc2V0KHMsdixPKm8uZ2V0KHMsdiktUypSKTtmb3Iocz1NO3M8PWo7cysrKVI9bi5nZXQocyx2LTEpLG4uc2V0KHMsdi0xLE8qUitTKm4uZ2V0KHMsdikpLG4uc2V0KHMsdixPKm4uZ2V0KHMsdiktUypSKX1lbHNlIHJbdi0xXT1mK1Msclt2XT1mK1MsZVt2LTFdPVIsZVt2XT0tUjt2LT0yLEk9MH1lbHNle2lmKGY9by5nZXQodix2KSxtPTAsYz0wLGE8diYmKG09by5nZXQodi0xLHYtMSksYz1vLmdldCh2LHYtMSkqby5nZXQodi0xLHYpKSwxMD09PUkpe2ZvcihfKz1mLHM9TTtzPD12O3MrKylvLnNldChzLHMsby5nZXQocyxzKS1mKTtDPU1hdGguYWJzKG8uZ2V0KHYsdi0xKSkrTWF0aC5hYnMoby5nZXQodi0xLHYtMikpLGY9bT0uNzUqQyxjPS0uNDM3NSpDKkN9aWYoMzA9PT1JJiYoQz0obS1mKS8yLEM9QypDK2MsQz4wKSl7Zm9yKEM9TWF0aC5zcXJ0KEMpLG08ZiYmKEM9LUMpLEM9Zi1jLygobS1mKS8yK0MpLHM9TTtzPD12O3MrKylvLnNldChzLHMsby5nZXQocyxzKS1DKTtfKz1DLGY9bT1jPS45NjR9Zm9yKEkrPTEsbD12LTI7bD49YSYmKFI9by5nZXQobCxsKSxBPWYtUixDPW0tUixTPShBKkMtYykvby5nZXQobCsxLGwpK28uZ2V0KGwsbCsxKSxPPW8uZ2V0KGwrMSxsKzEpLVItQS1DLEE9by5nZXQobCsyLGwrMSksQz1NYXRoLmFicyhTKStNYXRoLmFicyhPKStNYXRoLmFicyhBKSxTLz1DLE8vPUMsQS89QyxsIT09YSkmJiEoTWF0aC5hYnMoby5nZXQobCxsLTEpKSooTWF0aC5hYnMoTykrTWF0aC5hYnMoQSkpPHgqKE1hdGguYWJzKFMpKihNYXRoLmFicyhvLmdldChsLTEsbC0xKSkrTWF0aC5hYnMoUikrTWF0aC5hYnMoby5nZXQobCsxLGwrMSkpKSkpOylsLS07Zm9yKHM9bCsyO3M8PXY7cysrKW8uc2V0KHMscy0yLDApLHM+bCsyJiZvLnNldChzLHMtMywwKTtmb3IodT1sO3U8PXYtMSYmKGI9dSE9PXYtMSx1IT09bCYmKFM9by5nZXQodSx1LTEpLE89by5nZXQodSsxLHUtMSksQT1iP28uZ2V0KHUrMix1LTEpOjAsZj1NYXRoLmFicyhTKStNYXRoLmFicyhPKStNYXRoLmFicyhBKSwwIT09ZiYmKFMvPWYsTy89ZixBLz1mKSksMCE9PWYpO3UrKylpZihDPU1hdGguc3FydChTKlMrTypPK0EqQSksUzwwJiYoQz0tQyksMCE9PUMpe2Zvcih1IT09bD9vLnNldCh1LHUtMSwtQypmKTphIT09bCYmby5zZXQodSx1LTEsLW8uZ2V0KHUsdS0xKSksUys9QyxmPVMvQyxtPU8vQyxSPUEvQyxPLz1TLEEvPVMsaT11O2k8dDtpKyspUz1vLmdldCh1LGkpK08qby5nZXQodSsxLGkpLGImJihTKz1BKm8uZ2V0KHUrMixpKSxvLnNldCh1KzIsaSxvLmdldCh1KzIsaSktUypSKSksby5zZXQodSxpLG8uZ2V0KHUsaSktUypmKSxvLnNldCh1KzEsaSxvLmdldCh1KzEsaSktUyptKTtmb3Iocz0wO3M8PU1hdGgubWluKHYsdSszKTtzKyspUz1mKm8uZ2V0KHMsdSkrbSpvLmdldChzLHUrMSksYiYmKFMrPVIqby5nZXQocyx1KzIpLG8uc2V0KHMsdSsyLG8uZ2V0KHMsdSsyKS1TKkEpKSxvLnNldChzLHUsby5nZXQocyx1KS1TKSxvLnNldChzLHUrMSxvLmdldChzLHUrMSktUypPKTtmb3Iocz1NO3M8PWo7cysrKVM9ZipuLmdldChzLHUpK20qbi5nZXQocyx1KzEpLGImJihTKz1SKm4uZ2V0KHMsdSsyKSxuLnNldChzLHUrMixuLmdldChzLHUrMiktUypBKSksbi5zZXQocyx1LG4uZ2V0KHMsdSktUyksbi5zZXQocyx1KzEsbi5nZXQocyx1KzEpLVMqTyl9fX1pZigwPT09RSlyZXR1cm47Zm9yKHY9dC0xO3Y+PTA7di0tKWlmKFM9clt2XSxPPWVbdl0sMD09PU8pZm9yKGE9dixvLnNldCh2LHYsMSkscz12LTE7cz49MDtzLS0pe2ZvcihjPW8uZ2V0KHMscyktUyxBPTAsaT1hO2k8PXY7aSsrKUErPW8uZ2V0KHMsaSkqby5nZXQoaSx2KTtpZihlW3NdPDApUj1jLEM9QTtlbHNlIGlmKGE9cywwPT09ZVtzXT9vLnNldChzLHYsMCE9PWM/LUEvYzotQS8oeCpFKSk6KGY9by5nZXQocyxzKzEpLG09by5nZXQocysxLHMpLE89KHJbc10tUykqKHJbc10tUykrZVtzXSplW3NdLGg9KGYqQy1SKkEpL08sby5zZXQocyx2LGgpLG8uc2V0KHMrMSx2LE1hdGguYWJzKGYpPk1hdGguYWJzKFIpPygtQS1jKmgpL2Y6KC1DLW0qaCkvUikpLGg9TWF0aC5hYnMoby5nZXQocyx2KSkseCpoKmg+MSlmb3IoaT1zO2k8PXY7aSsrKW8uc2V0KGksdixvLmdldChpLHYpL2gpfWVsc2UgaWYoTzwwKWZvcihhPXYtMSxNYXRoLmFicyhvLmdldCh2LHYtMSkpPk1hdGguYWJzKG8uZ2V0KHYtMSx2KSk/KG8uc2V0KHYtMSx2LTEsTy9vLmdldCh2LHYtMSkpLG8uc2V0KHYtMSx2LC0oby5nZXQodix2KS1TKS9vLmdldCh2LHYtMSkpKTooeT1YbigwLC1vLmdldCh2LTEsdiksby5nZXQodi0xLHYtMSktUyxPKSxvLnNldCh2LTEsdi0xLHlbMF0pLG8uc2V0KHYtMSx2LHlbMV0pKSxvLnNldCh2LHYtMSwwKSxvLnNldCh2LHYsMSkscz12LTI7cz49MDtzLS0pe2ZvcihnPTAscD0wLGk9YTtpPD12O2krKylnKz1vLmdldChzLGkpKm8uZ2V0KGksdi0xKSxwKz1vLmdldChzLGkpKm8uZ2V0KGksdik7aWYoYz1vLmdldChzLHMpLVMsZVtzXTwwKVI9YyxBPWcsQz1wO2Vsc2UgaWYoYT1zLDA9PT1lW3NdPyh5PVhuKC1nLC1wLGMsTyksby5zZXQocyx2LTEseVswXSksby5zZXQocyx2LHlbMV0pKTooZj1vLmdldChzLHMrMSksbT1vLmdldChzKzEscyksdz0ocltzXS1TKSoocltzXS1TKStlW3NdKmVbc10tTypPLGQ9MioocltzXS1TKSpPLDA9PT13JiYwPT09ZCYmKHc9eCpFKihNYXRoLmFicyhjKStNYXRoLmFicyhPKStNYXRoLmFicyhmKStNYXRoLmFicyhtKStNYXRoLmFicyhSKSkpLHk9WG4oZipBLVIqZytPKnAsZipDLVIqcC1PKmcsdyxkKSxvLnNldChzLHYtMSx5WzBdKSxvLnNldChzLHYseVsxXSksTWF0aC5hYnMoZik+TWF0aC5hYnMoUikrTWF0aC5hYnMoTyk/KG8uc2V0KHMrMSx2LTEsKC1nLWMqby5nZXQocyx2LTEpK08qby5nZXQocyx2KSkvZiksby5zZXQocysxLHYsKC1wLWMqby5nZXQocyx2KS1PKm8uZ2V0KHMsdi0xKSkvZikpOih5PVhuKC1BLW0qby5nZXQocyx2LTEpLC1DLW0qby5nZXQocyx2KSxSLE8pLG8uc2V0KHMrMSx2LTEseVswXSksby5zZXQocysxLHYseVsxXSkpKSxoPU1hdGgubWF4KE1hdGguYWJzKG8uZ2V0KHMsdi0xKSksTWF0aC5hYnMoby5nZXQocyx2KSkpLHgqaCpoPjEpZm9yKGk9cztpPD12O2krKylvLnNldChpLHYtMSxvLmdldChpLHYtMSkvaCksby5zZXQoaSx2LG8uZ2V0KGksdikvaCl9Zm9yKHM9MDtzPHQ7cysrKWlmKHM8TXx8cz5qKWZvcihpPXM7aTx0O2krKyluLnNldChzLGksby5nZXQocyxpKSk7Zm9yKGk9dC0xO2k+PU07aS0tKWZvcihzPU07czw9ajtzKyspe2ZvcihSPTAsdT1NO3U8PU1hdGgubWluKGksaik7dSsrKVIrPW4uZ2V0KHMsdSkqby5nZXQodSxpKTtuLnNldChzLGksUil9fShzLGEsdSxpLHQpfXRoaXMubj1zLHRoaXMuZT1hLHRoaXMuZD11LHRoaXMuVj1pfWdldCByZWFsRWlnZW52YWx1ZXMoKXtyZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmQpfWdldCBpbWFnaW5hcnlFaWdlbnZhbHVlcygpe3JldHVybiBBcnJheS5mcm9tKHRoaXMuZSl9Z2V0IGVpZ2VudmVjdG9yTWF0cml4KCl7cmV0dXJuIHRoaXMuVn1nZXQgZGlhZ29uYWxNYXRyaXgoKXtsZXQgdCxlLHI9dGhpcy5uLG49dGhpcy5lLG89dGhpcy5kLHM9bmV3IFVuKHIscik7Zm9yKHQ9MDt0PHI7dCsrKXtmb3IoZT0wO2U8cjtlKyspcy5zZXQodCxlLDApO3Muc2V0KHQsdCxvW3RdKSxuW3RdPjA/cy5zZXQodCx0KzEsblt0XSk6blt0XTwwJiZzLnNldCh0LHQtMSxuW3RdKX1yZXR1cm4gc319ZnVuY3Rpb24gWG4odCxlLHIsbil7bGV0IG8scztyZXR1cm4gTWF0aC5hYnMocik+TWF0aC5hYnMobik/KG89bi9yLHM9citvKm4sWyh0K28qZSkvcywoZS1vKnQpL3NdKToobz1yL24scz1uK28qcixbKG8qdCtlKS9zLChvKmUtdCkvc10pfWNsYXNzIEpue2NvbnN0cnVjdG9yKHQsZT17fSl7dD1Hbi5jaGVja01hdHJpeCh0KTtsZXR7WTpyfT1lO2NvbnN0e3NjYWxlU2NvcmVzOm49ITEsbWF4SXRlcmF0aW9uczpvPTFlMyx0ZXJtaW5hdGlvbkNyaXRlcmlhOnM9MWUtMTB9PWU7bGV0IGk7aWYocil7aWYocj1FbihyKSYmIm51bWJlciI9PXR5cGVvZiByWzBdP1VuLmNvbHVtblZlY3RvcihyKTpHbi5jaGVja01hdHJpeChyKSxyLnJvd3MhPT10LnJvd3MpdGhyb3cgbmV3IEVycm9yKCJZIHNob3VsZCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiByb3dzIGFzIFgiKTtpPXIuZ2V0Q29sdW1uVmVjdG9yKDApfWVsc2UgaT10LmdldENvbHVtblZlY3RvcigwKTtsZXQgdSxhLGwsaCxjPTE7Zm9yKGxldCBlPTA7ZTxvJiZjPnM7ZSsrKWw9dC50cmFuc3Bvc2UoKS5tbXVsKGkpLmRpdihpLnRyYW5zcG9zZSgpLm1tdWwoaSkuZ2V0KDAsMCkpLGw9bC5kaXYobC5ub3JtKCkpLHU9dC5tbXVsKGwpLmRpdihsLnRyYW5zcG9zZSgpLm1tdWwobCkuZ2V0KDAsMCkpLGU+MCYmKGM9dS5jbG9uZSgpLnN1YihoKS5wb3coMikuc3VtKCkpLGg9dS5jbG9uZSgpLHI/KGE9ci50cmFuc3Bvc2UoKS5tbXVsKHUpLmRpdih1LnRyYW5zcG9zZSgpLm1tdWwodSkuZ2V0KDAsMCkpLGE9YS5kaXYoYS5ub3JtKCkpLGk9ci5tbXVsKGEpLmRpdihhLnRyYW5zcG9zZSgpLm1tdWwoYSkuZ2V0KDAsMCkpKTppPXU7aWYocil7bGV0IGU9dC50cmFuc3Bvc2UoKS5tbXVsKHUpLmRpdih1LnRyYW5zcG9zZSgpLm1tdWwodSkuZ2V0KDAsMCkpO2U9ZS5kaXYoZS5ub3JtKCkpO2xldCBuPXQuY2xvbmUoKS5zdWIodS5jbG9uZSgpLm1tdWwoZS50cmFuc3Bvc2UoKSkpLG89aS50cmFuc3Bvc2UoKS5tbXVsKHUpLmRpdih1LnRyYW5zcG9zZSgpLm1tdWwodSkuZ2V0KDAsMCkpLHM9ci5jbG9uZSgpLnN1Yih1LmNsb25lKCkubXVsUyhvLmdldCgwLDApKS5tbXVsKGEudHJhbnNwb3NlKCkpKTt0aGlzLnQ9dSx0aGlzLnA9ZS50cmFuc3Bvc2UoKSx0aGlzLnc9bC50cmFuc3Bvc2UoKSx0aGlzLnE9YSx0aGlzLnU9aSx0aGlzLnM9dS50cmFuc3Bvc2UoKS5tbXVsKHUpLHRoaXMueFJlc2lkdWFsPW4sdGhpcy55UmVzaWR1YWw9cyx0aGlzLmJldGFzPW99ZWxzZSB0aGlzLnc9bC50cmFuc3Bvc2UoKSx0aGlzLnM9dS50cmFuc3Bvc2UoKS5tbXVsKHUpLnNxcnQoKSx0aGlzLnQ9bj91LmNsb25lKCkuZGl2KHRoaXMucy5nZXQoMCwwKSk6dSx0aGlzLnhSZXNpZHVhbD10LnN1Yih1Lm1tdWwobC50cmFuc3Bvc2UoKSkpfX1sZXQgWm49Y2xhc3MgdHtjb25zdHJ1Y3Rvcih0LGU9e30scil7aWYodGhpcy5VPW51bGwsdGhpcy5TPW51bGwscilyZXR1cm4gdGhpcy5jZW50ZXI9ci5jZW50ZXIsdGhpcy5zY2FsZT1yLnNjYWxlLHRoaXMubWVhbnM9ci5tZWFucyx0aGlzLnN0ZGV2cz1yLnN0ZGV2cyx0aGlzLlU9VW4uY2hlY2tNYXRyaXgoci5VKSx0aGlzLlM9ci5TLHRoaXMuUj1yLlIsdm9pZCh0aGlzLmV4Y2x1ZGVkRmVhdHVyZXM9ci5leGNsdWRlZEZlYXR1cmVzfHxbXSk7bGV0IG47bj0oQXJyYXkuaXNBcnJheSh0KSxuZXcgVW4odCkpO2NvbnN0e2lzQ292YXJpYW5jZU1hdHJpeDpvPSExLG1ldGhvZDpzPSJTVkQiLG5Db21wTklQQUxTOmk9MixjZW50ZXI6dT0hMCxzY2FsZTphPSExLGlnbm9yZVplcm9WYXJpYW5jZTpsPSExfT1lO2lmKHRoaXMuY2VudGVyPXUsdGhpcy5zY2FsZT1hLHRoaXMubWVhbnM9bnVsbCx0aGlzLnN0ZGV2cz1udWxsLHRoaXMuZXhjbHVkZWRGZWF0dXJlcz1bXSxvKXRoaXMuX2NvbXB1dGVGcm9tQ292YXJpYW5jZU1hdHJpeChuKTtlbHNlIHN3aXRjaCh0aGlzLl9hZGp1c3QobixsKSxzKXtjYXNlImNvdmFyaWFuY2VNYXRyaXgiOntjb25zdCB0PW5ldyBCbihuKS5tbXVsKG4pLmRpdihuLnJvd3MtMSk7dGhpcy5fY29tcHV0ZUZyb21Db3ZhcmlhbmNlTWF0cml4KHQpO2JyZWFrfWNhc2UiTklQQUxTIjp0aGlzLl9jb21wdXRlV2l0aE5JUEFMUyhuLGkpO2JyZWFrO2Nhc2UiU1ZEIjp7Y29uc3QgdD1uZXcgS24obix7Y29tcHV0ZUxlZnRTaW5ndWxhclZlY3RvcnM6ITEsY29tcHV0ZVJpZ2h0U2luZ3VsYXJWZWN0b3JzOiEwLGF1dG9UcmFuc3Bvc2U6ITB9KTt0aGlzLlU9dC5yaWdodFNpbmd1bGFyVmVjdG9ycztjb25zdCBlPXQuZGlhZ29uYWwscj1bXTtmb3IoY29uc3QgdCBvZiBlKXIucHVzaCh0KnQvKG4ucm93cy0xKSk7dGhpcy5TPXI7YnJlYWt9ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYHVua25vd24gbWV0aG9kOiAke3N9YCl9fXN0YXRpYyBsb2FkKGUpe2lmKCJzdHJpbmciIT10eXBlb2YgZS5uYW1lKXRocm93IG5ldyBUeXBlRXJyb3IoIm1vZGVsIG11c3QgaGF2ZSBhIG5hbWUgcHJvcGVydHkiKTtpZigiUENBIiE9PWUubmFtZSl0aHJvdyBuZXcgUmFuZ2VFcnJvcihgaW52YWxpZCBtb2RlbDogJHtlLm5hbWV9YCk7cmV0dXJuIG5ldyB0KHZvaWQgMCx2b2lkIDAsZSl9cHJlZGljdCh0LGU9e30pe2NvbnN0e25Db21wb25lbnRzOnI9dGhpcy5VLmNvbHVtbnN9PWU7bGV0IG47aWYobj0oQXJyYXkuaXNBcnJheSh0KSxuZXcgVW4odCkpLHRoaXMuY2VudGVyJiYobi5zdWJSb3dWZWN0b3IodGhpcy5tZWFucyksdGhpcy5zY2FsZSkpe2ZvcihsZXQgdCBvZiB0aGlzLmV4Y2x1ZGVkRmVhdHVyZXMpbi5yZW1vdmVDb2x1bW4odCk7bi5kaXZSb3dWZWN0b3IodGhpcy5zdGRldnMpfWxldCBvPW4ubW11bCh0aGlzLlUpO3JldHVybiBvLnN1Yk1hdHJpeCgwLG8ucm93cy0xLDAsci0xKX1pbnZlcnQodCl7bGV0IGU9KHQ9VW4uY2hlY2tNYXRyaXgodCkpLm1tdWwodGhpcy5VLnRyYW5zcG9zZSgpKTtyZXR1cm4gdGhpcy5jZW50ZXImJih0aGlzLnNjYWxlJiZlLm11bFJvd1ZlY3Rvcih0aGlzLnN0ZGV2cyksZS5hZGRSb3dWZWN0b3IodGhpcy5tZWFucykpLGV9Z2V0RXhwbGFpbmVkVmFyaWFuY2UoKXtsZXQgdD0wO2lmKHRoaXMuUylmb3IoY29uc3QgZSBvZiB0aGlzLlMpdCs9ZTtyZXR1cm4gdGhpcy5TP3RoaXMuUy5tYXAoKGU9PmUvdCkpOltdfWdldEN1bXVsYXRpdmVWYXJpYW5jZSgpe2xldCB0PXRoaXMuZ2V0RXhwbGFpbmVkVmFyaWFuY2UoKTtmb3IobGV0IGU9MTtlPHQubGVuZ3RoO2UrKyl0W2VdKz10W2UtMV07cmV0dXJuIHR9Z2V0RWlnZW52ZWN0b3JzKCl7cmV0dXJuIHRoaXMuVX1nZXRFaWdlbnZhbHVlcygpe3JldHVybiB0aGlzLlN9Z2V0U3RhbmRhcmREZXZpYXRpb25zKCl7cmV0dXJuIHRoaXMuUy5tYXAoKHQ9Pk1hdGguc3FydCh0KSkpfWdldExvYWRpbmdzKCl7cmV0dXJuIHRoaXMuVS50cmFuc3Bvc2UoKX10b0pTT04oKXtyZXR1cm57bmFtZToiUENBIixjZW50ZXI6dGhpcy5jZW50ZXIsc2NhbGU6dGhpcy5zY2FsZSxtZWFuczp0aGlzLm1lYW5zLHN0ZGV2czp0aGlzLnN0ZGV2cyxVOnRoaXMuVSxTOnRoaXMuUyxleGNsdWRlZEZlYXR1cmVzOnRoaXMuZXhjbHVkZWRGZWF0dXJlc319X2FkanVzdCh0LGUpe2lmKHRoaXMuY2VudGVyKXtjb25zdCByPXQubWVhbigiY29sdW1uIiksbj10aGlzLnNjYWxlP3Quc3RhbmRhcmREZXZpYXRpb24oImNvbHVtbiIse21lYW46cn0pOm51bGw7aWYodGhpcy5tZWFucz1yLHQuc3ViUm93VmVjdG9yKHIpLHRoaXMuc2NhbGUpe2ZvcihsZXQgcj0wO3I8bi5sZW5ndGg7cisrKWlmKDA9PT1uW3JdKXtpZighZSl0aHJvdyBuZXcgUmFuZ2VFcnJvcihgQ2Fubm90IHNjYWxlIHRoZSBkYXRhc2V0IChzdGFuZGFyZCBkZXZpYXRpb24gaXMgemVybyBhdCBpbmRleCAke3J9YCk7dC5yZW1vdmVDb2x1bW4ociksbi5zcGxpY2UociwxKSx0aGlzLmV4Y2x1ZGVkRmVhdHVyZXMucHVzaChyKSxyLS19dGhpcy5zdGRldnM9bix0LmRpdlJvd1ZlY3RvcihuKX19fV9jb21wdXRlRnJvbUNvdmFyaWFuY2VNYXRyaXgodCl7Y29uc3QgZT1uZXcgWW4odCx7YXNzdW1lU3ltbWV0cmljOiEwfSk7dGhpcy5VPWUuZWlnZW52ZWN0b3JNYXRyaXgsdGhpcy5VLmZsaXBSb3dzKCksdGhpcy5TPWUucmVhbEVpZ2VudmFsdWVzLHRoaXMuUy5yZXZlcnNlKCl9X2NvbXB1dGVXaXRoTklQQUxTKHQsZSl7dGhpcy5VPW5ldyBVbihlLHQuY29sdW1ucyksdGhpcy5TPVtdO2xldCByPXQ7Zm9yKGxldCB0PTA7dDxlO3QrKyl7bGV0IGU9bmV3IEpuKHIpO3RoaXMuVS5zZXRSb3codCxlLncudHJhbnNwb3NlKCkpLHRoaXMuUy5wdXNoKE1hdGgucG93KGUucy5nZXQoMCwwKSwyKSkscj1lLnhSZXNpZHVhbH10aGlzLlU9dGhpcy5VLnRyYW5zcG9zZSgpfX07ZnVuY3Rpb24gSG4odCxlPXt9KXtpZighTnIodCkpdGhyb3cgbmV3IEVycm9yKCJkYXRhIGlzIG5vdCBlZmYuIGFycmF5Iik7bGV0IHI9dmUoZSwic2NhbGUiKTtZcihyKXx8KHI9ITApO2xldCBuPXZlKGUsIm5Db21wTklQQUxTIik7SnIobil8fChuPTIpLG49eG4obik7bGV0IG89U3IodmUodCwwLFtdKSk7aWYoMD09PW8pdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGRpbWVuc2lvbiBvZiBkYXRhIik7aWYobj5vKXRocm93IG5ldyBFcnJvcihgbkNvbXBOSVBBTFNbJHtufV0gaXMgbW9yZSB0aGFuIHRoZSBkaW1lbnNpb25bJHtvfV0gb2YgZGF0YWApO3JldHVybiBuZXcgWm4odCx7bWV0aG9kOiJOSVBBTFMiLHNjYWxlOnIsbkNvbXBOSVBBTFM6bn0pLnByZWRpY3QodCkudG9KU09OKCl9dmFyIFFuPXt9LHRvPXtnZXQgZXhwb3J0cygpe3JldHVybiBRbn0sc2V0IGV4cG9ydHModCl7UW49dH19O3ZhciBlbz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj0tMSxuPW51bGw9PXQ/MDp0Lmxlbmd0aDsrK3I8biYmITEhPT1lKHRbcl0scix0KTspO3JldHVybiB0fTt2YXIgcm89ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUscixuKXtmb3IodmFyIG89LTEscz1PYmplY3QoZSksaT1uKGUpLHU9aS5sZW5ndGg7dS0tOyl7dmFyIGE9aVt0P3U6KytvXTtpZighMT09PXIoc1thXSxhLHMpKWJyZWFrfXJldHVybiBlfX0sbm89cm8oKTt2YXIgb289ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9LTEsbj1BcnJheSh0KTsrK3I8dDspbltyXT1lKHIpO3JldHVybiBufSxzbz1iLGlvPXk7dmFyIHVvPWZ1bmN0aW9uKHQpe3JldHVybiBpbyh0KSYmIltvYmplY3QgQXJndW1lbnRzXSI9PXNvKHQpfSxhbz15LGxvPU9iamVjdC5wcm90b3R5cGUsaG89bG8uaGFzT3duUHJvcGVydHksY289bG8ucHJvcGVydHlJc0VudW1lcmFibGUsZm89dW8oZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzfSgpKT91bzpmdW5jdGlvbih0KXtyZXR1cm4gYW8odCkmJmhvLmNhbGwodCwiY2FsbGVlIikmJiFjby5jYWxsKHQsImNhbGxlZSIpfSxtbz17fTt2YXIgZ289ZnVuY3Rpb24oKXtyZXR1cm4hMX07IWZ1bmN0aW9uKHQsZSl7dmFyIHI9aSxuPWdvLG89ZSYmIWUubm9kZVR5cGUmJmUscz1vJiZ0JiYhdC5ub2RlVHlwZSYmdCx1PXMmJnMuZXhwb3J0cz09PW8/ci5CdWZmZXI6dm9pZCAwLGE9KHU/dS5pc0J1ZmZlcjp2b2lkIDApfHxuO3QuZXhwb3J0cz1hfSh7Z2V0IGV4cG9ydHMoKXtyZXR1cm4gbW99LHNldCBleHBvcnRzKHQpe21vPXR9fSxtbyk7dmFyIHBvPS9eKD86MHxbMS05XVxkKikkLzt2YXIgd289ZnVuY3Rpb24odCxlKXt2YXIgcj10eXBlb2YgdDtyZXR1cm4hIShlPW51bGw9PWU/OTAwNzE5OTI1NDc0MDk5MTplKSYmKCJudW1iZXIiPT1yfHwic3ltYm9sIiE9ciYmcG8udGVzdCh0KSkmJnQ+LTEmJnQlMT09MCYmdDxlfSxibz1iLHlvPVllLHZvPXksTW89e307TW9bIltvYmplY3QgRmxvYXQzMkFycmF5XSJdPU1vWyJbb2JqZWN0IEZsb2F0NjRBcnJheV0iXT1Nb1siW29iamVjdCBJbnQ4QXJyYXldIl09TW9bIltvYmplY3QgSW50MTZBcnJheV0iXT1Nb1siW29iamVjdCBJbnQzMkFycmF5XSJdPU1vWyJbb2JqZWN0IFVpbnQ4QXJyYXldIl09TW9bIltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIl09TW9bIltvYmplY3QgVWludDE2QXJyYXldIl09TW9bIltvYmplY3QgVWludDMyQXJyYXldIl09ITAsTW9bIltvYmplY3QgQXJndW1lbnRzXSJdPU1vWyJbb2JqZWN0IEFycmF5XSJdPU1vWyJbb2JqZWN0IEFycmF5QnVmZmVyXSJdPU1vWyJbb2JqZWN0IEJvb2xlYW5dIl09TW9bIltvYmplY3QgRGF0YVZpZXddIl09TW9bIltvYmplY3QgRGF0ZV0iXT1Nb1siW29iamVjdCBFcnJvcl0iXT1Nb1siW29iamVjdCBGdW5jdGlvbl0iXT1Nb1siW29iamVjdCBNYXBdIl09TW9bIltvYmplY3QgTnVtYmVyXSJdPU1vWyJbb2JqZWN0IE9iamVjdF0iXT1Nb1siW29iamVjdCBSZWdFeHBdIl09TW9bIltvYmplY3QgU2V0XSJdPU1vWyJbb2JqZWN0IFN0cmluZ10iXT1Nb1siW29iamVjdCBXZWFrTWFwXSJdPSExO3ZhciBqbz1mdW5jdGlvbih0KXtyZXR1cm4gdm8odCkmJnlvKHQubGVuZ3RoKSYmISFNb1tibyh0KV19O3ZhciB4bz1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQoZSl9fSxfbz17fTshZnVuY3Rpb24odCxlKXt2YXIgcj1uLG89ZSYmIWUubm9kZVR5cGUmJmUscz1vJiZ0JiYhdC5ub2RlVHlwZSYmdCxpPXMmJnMuZXhwb3J0cz09PW8mJnIucHJvY2Vzcyx1PWZ1bmN0aW9uKCl7dHJ5e3ZhciB0PXMmJnMucmVxdWlyZSYmcy5yZXF1aXJlKCJ1dGlsIikudHlwZXM7cmV0dXJuIHR8fGkmJmkuYmluZGluZyYmaS5iaW5kaW5nKCJ1dGlsIil9Y2F0Y2godCl7fX0oKTt0LmV4cG9ydHM9dX0oe2dldCBleHBvcnRzKCl7cmV0dXJuIF9vfSxzZXQgZXhwb3J0cyh0KXtfbz10fX0sX28pO3ZhciBFbz1qbyxTbz14byxPbz1fbyYmX28uaXNUeXBlZEFycmF5LEFvPU9vP1NvKE9vKTpFbyxDbz1vbyxSbz1mbyxJbz1yLE5vPW1vLGtvPXdvLEZvPUFvLFBvPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dmFyIFRvPWZ1bmN0aW9uKHQsZSl7dmFyIHI9SW8odCksbj0hciYmUm8odCksbz0hciYmIW4mJk5vKHQpLHM9IXImJiFuJiYhbyYmRm8odCksaT1yfHxufHxvfHxzLHU9aT9Dbyh0Lmxlbmd0aCxTdHJpbmcpOltdLGE9dS5sZW5ndGg7Zm9yKHZhciBsIGluIHQpIWUmJiFQby5jYWxsKHQsbCl8fGkmJigibGVuZ3RoIj09bHx8byYmKCJvZmZzZXQiPT1sfHwicGFyZW50Ij09bCl8fHMmJigiYnVmZmVyIj09bHx8ImJ5dGVMZW5ndGgiPT1sfHwiYnl0ZU9mZnNldCI9PWwpfHxrbyhsLGEpKXx8dS5wdXNoKGwpO3JldHVybiB1fSx6bz1BZSxWbz1aZTt2YXIgJG89ZnVuY3Rpb24odCl7cmV0dXJuIFZvKHQpP1RvKHQpOnpvKHQpfSxxbz1ubyxEbz0kbzt2YXIgVW89WmU7dmFyIExvPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKHIsbil7aWYobnVsbD09cilyZXR1cm4gcjtpZighVW8ocikpcmV0dXJuIHQocixuKTtmb3IodmFyIG89ci5sZW5ndGgscz1lP286LTEsaT1PYmplY3Qocik7KGU/cy0tOisrczxvKSYmITEhPT1uKGlbc10scyxpKTspO3JldHVybiByfX0sQm89TG8oKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQmJnFvKHQsZSxEbyl9KSk7dmFyIEdvPWZ1bmN0aW9uKHQpe3JldHVybiB0fSxXbz1Hbzt2YXIgS289ZW8sWW89Qm8sWG89ZnVuY3Rpb24odCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpXb30sSm89cjt2YXIgWm89ZnVuY3Rpb24odCxlKXtyZXR1cm4oSm8odCk/S286WW8pKHQsWG8oZSkpfTt0by5leHBvcnRzPVpvO3ZhciBIbz1lKFFuKSxRbz1DdDt2YXIgdHM9Q3QsZXM9UnQscnM9S3Q7dmFyIG5zPUN0LG9zPWZ1bmN0aW9uKCl7dGhpcy5fX2RhdGFfXz1uZXcgUW8sdGhpcy5zaXplPTB9LHNzPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX19kYXRhX18scj1lLmRlbGV0ZSh0KTtyZXR1cm4gdGhpcy5zaXplPWUuc2l6ZSxyfSxpcz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5nZXQodCl9LHVzPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLmhhcyh0KX0sYXM9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLl9fZGF0YV9fO2lmKHIgaW5zdGFuY2VvZiB0cyl7dmFyIG49ci5fX2RhdGFfXztpZighZXN8fG4ubGVuZ3RoPDE5OSlyZXR1cm4gbi5wdXNoKFt0LGVdKSx0aGlzLnNpemU9KytyLnNpemUsdGhpcztyPXRoaXMuX19kYXRhX189bmV3IHJzKG4pfXJldHVybiByLnNldCh0LGUpLHRoaXMuc2l6ZT1yLnNpemUsdGhpc307ZnVuY3Rpb24gbHModCl7dmFyIGU9dGhpcy5fX2RhdGFfXz1uZXcgbnModCk7dGhpcy5zaXplPWUuc2l6ZX1scy5wcm90b3R5cGUuY2xlYXI9b3MsbHMucHJvdG90eXBlLmRlbGV0ZT1zcyxscy5wcm90b3R5cGUuZ2V0PWlzLGxzLnByb3RvdHlwZS5oYXM9dXMsbHMucHJvdG90eXBlLnNldD1hczt2YXIgaHM9bHM7dmFyIGNzPUt0LGZzPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLnNldCh0LCJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIiksdGhpc30sbXM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKHQpfTtmdW5jdGlvbiBncyh0KXt2YXIgZT0tMSxyPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5fX2RhdGFfXz1uZXcgY3M7KytlPHI7KXRoaXMuYWRkKHRbZV0pfWdzLnByb3RvdHlwZS5hZGQ9Z3MucHJvdG90eXBlLnB1c2g9ZnMsZ3MucHJvdG90eXBlLmhhcz1tczt2YXIgcHM9Z3Msd3M9ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9LTEsbj1udWxsPT10PzA6dC5sZW5ndGg7KytyPG47KWlmKGUodFtyXSxyLHQpKXJldHVybiEwO3JldHVybiExfSxkcz1mdW5jdGlvbih0LGUpe3JldHVybiB0LmhhcyhlKX07dmFyIGJzPWZ1bmN0aW9uKHQsZSxyLG4sbyxzKXt2YXIgaT0xJnIsdT10Lmxlbmd0aCxhPWUubGVuZ3RoO2lmKHUhPWEmJiEoaSYmYT51KSlyZXR1cm4hMTt2YXIgbD1zLmdldCh0KSxoPXMuZ2V0KGUpO2lmKGwmJmgpcmV0dXJuIGw9PWUmJmg9PXQ7dmFyIGM9LTEsZj0hMCxtPTImcj9uZXcgcHM6dm9pZCAwO2ZvcihzLnNldCh0LGUpLHMuc2V0KGUsdCk7KytjPHU7KXt2YXIgZz10W2NdLHA9ZVtjXTtpZihuKXZhciB3PWk/bihwLGcsYyxlLHQscyk6bihnLHAsYyx0LGUscyk7aWYodm9pZCAwIT09dyl7aWYodyljb250aW51ZTtmPSExO2JyZWFrfWlmKG0pe2lmKCF3cyhlLChmdW5jdGlvbih0LGUpe2lmKCFkcyhtLGUpJiYoZz09PXR8fG8oZyx0LHIsbixzKSkpcmV0dXJuIG0ucHVzaChlKX0pKSl7Zj0hMTticmVha319ZWxzZSBpZihnIT09cCYmIW8oZyxwLHIsbixzKSl7Zj0hMTticmVha319cmV0dXJuIHMuZGVsZXRlKHQpLHMuZGVsZXRlKGUpLGZ9O3ZhciB5cz1mdW5jdGlvbih0KXt2YXIgZT0tMSxyPUFycmF5KHQuc2l6ZSk7cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCxuKXtyWysrZV09W24sdF19KSkscn07dmFyIHZzPWkuVWludDhBcnJheSxNcz1wdCxqcz1icyx4cz15cyxfcz1mdW5jdGlvbih0KXt2YXIgZT0tMSxyPUFycmF5KHQuc2l6ZSk7cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCl7clsrK2VdPXR9KSkscn0sRXM9dT91LnByb3RvdHlwZTp2b2lkIDAsU3M9RXM/RXMudmFsdWVPZjp2b2lkIDA7dmFyIE9zPWZ1bmN0aW9uKHQsZSxyLG4sbyxzLGkpe3N3aXRjaChyKXtjYXNlIltvYmplY3QgRGF0YVZpZXddIjppZih0LmJ5dGVMZW5ndGghPWUuYnl0ZUxlbmd0aHx8dC5ieXRlT2Zmc2V0IT1lLmJ5dGVPZmZzZXQpcmV0dXJuITE7dD10LmJ1ZmZlcixlPWUuYnVmZmVyO2Nhc2UiW29iamVjdCBBcnJheUJ1ZmZlcl0iOnJldHVybiEodC5ieXRlTGVuZ3RoIT1lLmJ5dGVMZW5ndGh8fCFzKG5ldyB2cyh0KSxuZXcgdnMoZSkpKTtjYXNlIltvYmplY3QgQm9vbGVhbl0iOmNhc2UiW29iamVjdCBEYXRlXSI6Y2FzZSJbb2JqZWN0IE51bWJlcl0iOnJldHVybiBNcygrdCwrZSk7Y2FzZSJbb2JqZWN0IEVycm9yXSI6cmV0dXJuIHQubmFtZT09ZS5uYW1lJiZ0Lm1lc3NhZ2U9PWUubWVzc2FnZTtjYXNlIltvYmplY3QgUmVnRXhwXSI6Y2FzZSJbb2JqZWN0IFN0cmluZ10iOnJldHVybiB0PT1lKyIiO2Nhc2UiW29iamVjdCBNYXBdIjp2YXIgdT14cztjYXNlIltvYmplY3QgU2V0XSI6dmFyIGE9MSZuO2lmKHV8fCh1PV9zKSx0LnNpemUhPWUuc2l6ZSYmIWEpcmV0dXJuITE7dmFyIGw9aS5nZXQodCk7aWYobClyZXR1cm4gbD09ZTtufD0yLGkuc2V0KHQsZSk7dmFyIGg9anModSh0KSx1KGUpLG4sbyxzLGkpO3JldHVybiBpLmRlbGV0ZSh0KSxoO2Nhc2UiW29iamVjdCBTeW1ib2xdIjppZihTcylyZXR1cm4gU3MuY2FsbCh0KT09U3MuY2FsbChlKX1yZXR1cm4hMX07dmFyIEFzPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPS0xLG49ZS5sZW5ndGgsbz10Lmxlbmd0aDsrK3I8bjspdFtvK3JdPWVbcl07cmV0dXJuIHR9LENzPUFzLFJzPXI7dmFyIElzPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1lKHQpO3JldHVybiBScyh0KT9uOkNzKG4scih0KSl9O3ZhciBOcz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj0tMSxuPW51bGw9PXQ/MDp0Lmxlbmd0aCxvPTAscz1bXTsrK3I8bjspe3ZhciBpPXRbcl07ZShpLHIsdCkmJihzW28rK109aSl9cmV0dXJuIHN9LGtzPWZ1bmN0aW9uKCl7cmV0dXJuW119LEZzPU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUsUHM9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyxUcz1Jcyx6cz1Qcz9mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD9bXToodD1PYmplY3QodCksTnMoUHModCksKGZ1bmN0aW9uKGUpe3JldHVybiBGcy5jYWxsKHQsZSl9KSkpfTprcyxWcz0kbzt2YXIgJHM9ZnVuY3Rpb24odCl7cmV0dXJuIFRzKHQsVnMsenMpfSxxcz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3ZhciBEcz1ocyxVcz1icyxMcz1PcyxCcz1mdW5jdGlvbih0LGUscixuLG8scyl7dmFyIGk9MSZyLHU9JHModCksYT11Lmxlbmd0aDtpZihhIT0kcyhlKS5sZW5ndGgmJiFpKXJldHVybiExO2Zvcih2YXIgbD1hO2wtLTspe3ZhciBoPXVbbF07aWYoIShpP2ggaW4gZTpxcy5jYWxsKGUsaCkpKXJldHVybiExfXZhciBjPXMuZ2V0KHQpLGY9cy5nZXQoZSk7aWYoYyYmZilyZXR1cm4gYz09ZSYmZj09dDt2YXIgbT0hMDtzLnNldCh0LGUpLHMuc2V0KGUsdCk7Zm9yKHZhciBnPWk7KytsPGE7KXt2YXIgcD10W2g9dVtsXV0sdz1lW2hdO2lmKG4pdmFyIGQ9aT9uKHcscCxoLGUsdCxzKTpuKHAsdyxoLHQsZSxzKTtpZighKHZvaWQgMD09PWQ/cD09PXd8fG8ocCx3LHIsbixzKTpkKSl7bT0hMTticmVha31nfHwoZz0iY29uc3RydWN0b3IiPT1oKX1pZihtJiYhZyl7dmFyIGI9dC5jb25zdHJ1Y3Rvcix5PWUuY29uc3RydWN0b3I7Yj09eXx8ISgiY29uc3RydWN0b3IiaW4gdCl8fCEoImNvbnN0cnVjdG9yImluIGUpfHwiZnVuY3Rpb24iPT10eXBlb2YgYiYmYiBpbnN0YW5jZW9mIGImJiJmdW5jdGlvbiI9PXR5cGVvZiB5JiZ5IGluc3RhbmNlb2YgeXx8KG09ITEpfXJldHVybiBzLmRlbGV0ZSh0KSxzLmRlbGV0ZShlKSxtfSxHcz1LZSxXcz1yLEtzPW1vLFlzPUFvLFhzPSJbb2JqZWN0IEFyZ3VtZW50c10iLEpzPSJbb2JqZWN0IEFycmF5XSIsWnM9IltvYmplY3QgT2JqZWN0XSIsSHM9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt2YXIgUXM9ZnVuY3Rpb24odCxlLHIsbixvLHMpe3ZhciBpPVdzKHQpLHU9V3MoZSksYT1pP0pzOkdzKHQpLGw9dT9KczpHcyhlKSxoPShhPWE9PVhzP1pzOmEpPT1acyxjPShsPWw9PVhzP1pzOmwpPT1acyxmPWE9PWw7aWYoZiYmS3ModCkpe2lmKCFLcyhlKSlyZXR1cm4hMTtpPSEwLGg9ITF9aWYoZiYmIWgpcmV0dXJuIHN8fChzPW5ldyBEcyksaXx8WXModCk/VXModCxlLHIsbixvLHMpOkxzKHQsZSxhLHIsbixvLHMpO2lmKCEoMSZyKSl7dmFyIG09aCYmSHMuY2FsbCh0LCJfX3dyYXBwZWRfXyIpLGc9YyYmSHMuY2FsbChlLCJfX3dyYXBwZWRfXyIpO2lmKG18fGcpe3ZhciBwPW0/dC52YWx1ZSgpOnQsdz1nP2UudmFsdWUoKTplO3JldHVybiBzfHwocz1uZXcgRHMpLG8ocCx3LHIsbixzKX19cmV0dXJuISFmJiYoc3x8KHM9bmV3IERzKSxCcyh0LGUscixuLG8scykpfSx0aT15O3ZhciBlaT1mdW5jdGlvbiB0KGUscixuLG8scyl7cmV0dXJuIGU9PT1yfHwobnVsbD09ZXx8bnVsbD09cnx8IXRpKGUpJiYhdGkocik/ZSE9ZSYmciE9cjpRcyhlLHIsbixvLHQscykpfSxyaT1ocyxuaT1laTt2YXIgb2k9QTt2YXIgc2k9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PXQmJiFvaSh0KX0saWk9c2ksdWk9JG87dmFyIGFpPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKHIpe3JldHVybiBudWxsIT1yJiYoclt0XT09PWUmJih2b2lkIDAhPT1lfHx0IGluIE9iamVjdChyKSkpfX0sbGk9ZnVuY3Rpb24odCxlLHIsbil7dmFyIG89ci5sZW5ndGgscz1vLGk9IW47aWYobnVsbD09dClyZXR1cm4hcztmb3IodD1PYmplY3QodCk7by0tOyl7dmFyIHU9cltvXTtpZihpJiZ1WzJdP3VbMV0hPT10W3VbMF1dOiEodVswXWluIHQpKXJldHVybiExfWZvcig7KytvPHM7KXt2YXIgYT0odT1yW29dKVswXSxsPXRbYV0saD11WzFdO2lmKGkmJnVbMl0pe2lmKHZvaWQgMD09PWwmJiEoYSBpbiB0KSlyZXR1cm4hMX1lbHNle3ZhciBjPW5ldyByaTtpZihuKXZhciBmPW4obCxoLGEsdCxlLGMpO2lmKCEodm9pZCAwPT09Zj9uaShoLGwsMyxuLGMpOmYpKXJldHVybiExfX1yZXR1cm4hMH0saGk9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXVpKHQpLHI9ZS5sZW5ndGg7ci0tOyl7dmFyIG49ZVtyXSxvPXRbbl07ZVtyXT1bbixvLGlpKG8pXX1yZXR1cm4gZX0sY2k9YWk7dmFyIGZpPW1lLG1pPWZvLGdpPXIscGk9d28sd2k9WWUsZGk9cGU7dmFyIGJpPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGwhPXQmJmUgaW4gT2JqZWN0KHQpfSx5aT1mdW5jdGlvbih0LGUscil7Zm9yKHZhciBuPS0xLG89KGU9ZmkoZSx0KSkubGVuZ3RoLHM9ITE7KytuPG87KXt2YXIgaT1kaShlW25dKTtpZighKHM9bnVsbCE9dCYmcih0LGkpKSlicmVhazt0PXRbaV19cmV0dXJuIHN8fCsrbiE9bz9zOiEhKG89bnVsbD09dD8wOnQubGVuZ3RoKSYmd2kobykmJnBpKGksbykmJihnaSh0KXx8bWkodCkpfTt2YXIgdmk9ZWksTWk9dmUsamk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbCE9dCYmeWkodCxlLGJpKX0seGk9TyxfaT1zaSxFaT1haSxTaT1wZTt2YXIgT2k9YmU7dmFyIEFpPXJyLENpPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gT2koZSx0KX19LFJpPU8sSWk9cGU7dmFyIE5pPWZ1bmN0aW9uKHQpe3ZhciBlPWhpKHQpO3JldHVybiAxPT1lLmxlbmd0aCYmZVswXVsyXT9jaShlWzBdWzBdLGVbMF1bMV0pOmZ1bmN0aW9uKHIpe3JldHVybiByPT09dHx8bGkocix0LGUpfX0sa2k9ZnVuY3Rpb24odCxlKXtyZXR1cm4geGkodCkmJl9pKGUpP0VpKFNpKHQpLGUpOmZ1bmN0aW9uKHIpe3ZhciBuPU1pKHIsdCk7cmV0dXJuIHZvaWQgMD09PW4mJm49PT1lP2ppKHIsdCk6dmkoZSxuLDMpfX0sRmk9R28sUGk9cixUaT1mdW5jdGlvbih0KXtyZXR1cm4gUmkodCk/QWkoSWkodCkpOkNpKHQpfTt2YXIgemk9Qm8sVmk9WmU7dmFyICRpPWVlLHFpPWZ1bmN0aW9uKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6bnVsbD09dD9GaToib2JqZWN0Ij09dHlwZW9mIHQ/UGkodCk/a2kodFswXSx0WzFdKTpOaSh0KTpUaSh0KX0sRGk9ZnVuY3Rpb24odCxlKXt2YXIgcj0tMSxuPVZpKHQpP0FycmF5KHQubGVuZ3RoKTpbXTtyZXR1cm4gemkodCwoZnVuY3Rpb24odCxvLHMpe25bKytyXT1lKHQsbyxzKX0pKSxufSxVaT1yO3ZhciBMaT1mdW5jdGlvbih0LGUpe3JldHVybihVaSh0KT8kaTpEaSkodCxxaShlKSl9LEJpPWVlO3ZhciBHaT1mdW5jdGlvbih0LGUpe3JldHVybiBCaShlLChmdW5jdGlvbihlKXtyZXR1cm4gdFtlXX0pKX0sV2k9JG87dmFyIEtpPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P1tdOkdpKHQsV2kodCkpfTtmdW5jdGlvbiBZaSh0LGUpe2Zvcih2YXIgcj0tMSxuPW51bGw9PXQ/MDp0Lmxlbmd0aDsrK3I8biYmITEhPT1lKHRbcl0scix0KTspO3JldHVybiB0fXZhciBYaSxKaT1mdW5jdGlvbih0LGUscil7Zm9yKHZhciBuPS0xLG89T2JqZWN0KHQpLHM9cih0KSxpPXMubGVuZ3RoO2ktLTspe3ZhciB1PXNbWGk/aTorK25dO2lmKCExPT09ZShvW3VdLHUsbykpYnJlYWt9cmV0dXJuIHR9O2Z1bmN0aW9uIFppKHQpe3JldHVybiBXcih0KSYmIltvYmplY3QgQXJndW1lbnRzXSI9PUdyKHQpfXZhciBIaT1PYmplY3QucHJvdG90eXBlLFFpPUhpLmhhc093blByb3BlcnR5LHR1PUhpLnByb3BlcnR5SXNFbnVtZXJhYmxlLGV1PVppKGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50c30oKSk/Wmk6ZnVuY3Rpb24odCl7cmV0dXJuIFdyKHQpJiZRaS5jYWxsKHQsImNhbGxlZSIpJiYhdHUuY2FsbCh0LCJjYWxsZWUiKX07dmFyIHJ1PSJvYmplY3QiPT10eXBlb2YgZXhwb3J0cyYmZXhwb3J0cyYmIWV4cG9ydHMubm9kZVR5cGUmJmV4cG9ydHMsbnU9cnUmJiJvYmplY3QiPT10eXBlb2YgbW9kdWxlJiZtb2R1bGUmJiFtb2R1bGUubm9kZVR5cGUmJm1vZHVsZSxvdT1udSYmbnUuZXhwb3J0cz09PXJ1P1ByLkJ1ZmZlcjp2b2lkIDAsc3U9KG91P291LmlzQnVmZmVyOnZvaWQgMCl8fGZ1bmN0aW9uKCl7cmV0dXJuITF9LGl1PTkwMDcxOTkyNTQ3NDA5OTEsdXU9L14oPzowfFsxLTldXGQqKSQvO2Z1bmN0aW9uIGF1KHQsZSl7dmFyIHI9dHlwZW9mIHQ7cmV0dXJuISEoZT1udWxsPT1lP2l1OmUpJiYoIm51bWJlciI9PXJ8fCJzeW1ib2wiIT1yJiZ1dS50ZXN0KHQpKSYmdD4tMSYmdCUxPT0wJiZ0PGV9dmFyIGx1PTkwMDcxOTkyNTQ3NDA5OTE7ZnVuY3Rpb24gaHUodCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0JiZ0Pi0xJiZ0JTE9PTAmJnQ8PWx1fXZhciBjdT17fTtjdVsiW29iamVjdCBGbG9hdDMyQXJyYXldIl09Y3VbIltvYmplY3QgRmxvYXQ2NEFycmF5XSJdPWN1WyJbb2JqZWN0IEludDhBcnJheV0iXT1jdVsiW29iamVjdCBJbnQxNkFycmF5XSJdPWN1WyJbb2JqZWN0IEludDMyQXJyYXldIl09Y3VbIltvYmplY3QgVWludDhBcnJheV0iXT1jdVsiW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0iXT1jdVsiW29iamVjdCBVaW50MTZBcnJheV0iXT1jdVsiW29iamVjdCBVaW50MzJBcnJheV0iXT0hMCxjdVsiW29iamVjdCBBcmd1bWVudHNdIl09Y3VbIltvYmplY3QgQXJyYXldIl09Y3VbIltvYmplY3QgQXJyYXlCdWZmZXJdIl09Y3VbIltvYmplY3QgQm9vbGVhbl0iXT1jdVsiW29iamVjdCBEYXRhVmlld10iXT1jdVsiW29iamVjdCBEYXRlXSJdPWN1WyJbb2JqZWN0IEVycm9yXSJdPWN1WyJbb2JqZWN0IEZ1bmN0aW9uXSJdPWN1WyJbb2JqZWN0IE1hcF0iXT1jdVsiW29iamVjdCBOdW1iZXJdIl09Y3VbIltvYmplY3QgT2JqZWN0XSJdPWN1WyJbb2JqZWN0IFJlZ0V4cF0iXT1jdVsiW29iamVjdCBTZXRdIl09Y3VbIltvYmplY3QgU3RyaW5nXSJdPWN1WyJbb2JqZWN0IFdlYWtNYXBdIl09ITE7dmFyIGZ1PSJvYmplY3QiPT10eXBlb2YgZXhwb3J0cyYmZXhwb3J0cyYmIWV4cG9ydHMubm9kZVR5cGUmJmV4cG9ydHMsbXU9ZnUmJiJvYmplY3QiPT10eXBlb2YgbW9kdWxlJiZtb2R1bGUmJiFtb2R1bGUubm9kZVR5cGUmJm1vZHVsZSxndT1tdSYmbXUuZXhwb3J0cz09PWZ1JiZrci5wcm9jZXNzLHB1PWZ1bmN0aW9uKCl7dHJ5e3ZhciB0PW11JiZtdS5yZXF1aXJlJiZtdS5yZXF1aXJlKCJ1dGlsIikudHlwZXM7cmV0dXJuIHR8fGd1JiZndS5iaW5kaW5nJiZndS5iaW5kaW5nKCJ1dGlsIil9Y2F0Y2godCl7fX0oKSx3dT1wdSYmcHUuaXNUeXBlZEFycmF5LGR1PXd1P2Z1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdChlKX19KHd1KTpmdW5jdGlvbih0KXtyZXR1cm4gV3IodCkmJmh1KHQubGVuZ3RoKSYmISFjdVtHcih0KV19LGJ1PWR1LHl1PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gdnUodCxlKXt2YXIgcj1tbih0KSxuPSFyJiZldSh0KSxvPSFyJiYhbiYmc3UodCkscz0hciYmIW4mJiFvJiZidSh0KSxpPXJ8fG58fG98fHMsdT1pP2Z1bmN0aW9uKHQsZSl7Zm9yKHZhciByPS0xLG49QXJyYXkodCk7KytyPHQ7KW5bcl09ZShyKTtyZXR1cm4gbn0odC5sZW5ndGgsU3RyaW5nKTpbXSxhPXUubGVuZ3RoO2Zvcih2YXIgbCBpbiB0KSFlJiYheXUuY2FsbCh0LGwpfHxpJiYoImxlbmd0aCI9PWx8fG8mJigib2Zmc2V0Ij09bHx8InBhcmVudCI9PWwpfHxzJiYoImJ1ZmZlciI9PWx8fCJieXRlTGVuZ3RoIj09bHx8ImJ5dGVPZmZzZXQiPT1sKXx8YXUobCxhKSl8fHUucHVzaChsKTtyZXR1cm4gdX12YXIgTXU9T2JqZWN0LnByb3RvdHlwZTt2YXIganU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZnVuY3Rpb24ocil7cmV0dXJuIHQoZShyKSl9fShPYmplY3Qua2V5cyxPYmplY3QpLHh1PWp1LF91PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gRXUodCl7aWYocj0oZT10KSYmZS5jb25zdHJ1Y3RvcixlIT09KCJmdW5jdGlvbiI9PXR5cGVvZiByJiZyLnByb3RvdHlwZXx8TXUpKXJldHVybiB4dSh0KTt2YXIgZSxyLG49W107Zm9yKHZhciBvIGluIE9iamVjdCh0KSlfdS5jYWxsKHQsbykmJiJjb25zdHJ1Y3RvciIhPW8mJm4ucHVzaChvKTtyZXR1cm4gbn12YXIgU3U9IltvYmplY3QgQXN5bmNGdW5jdGlvbl0iLE91PSJbb2JqZWN0IEZ1bmN0aW9uXSIsQXU9IltvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dIixDdT0iW29iamVjdCBQcm94eV0iO2Z1bmN0aW9uIFJ1KHQpe2lmKCF0bih0KSlyZXR1cm4hMTt2YXIgZT1Hcih0KTtyZXR1cm4gZT09T3V8fGU9PUF1fHxlPT1TdXx8ZT09Q3V9ZnVuY3Rpb24gSXUodCl7cmV0dXJuIG51bGwhPXQmJmh1KHQubGVuZ3RoKSYmIVJ1KHQpfWZ1bmN0aW9uIE51KHQpe3JldHVybiBJdSh0KT92dSh0KTpFdSh0KX12YXIga3U9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZnVuY3Rpb24ocixuKXtpZihudWxsPT1yKXJldHVybiByO2lmKCFJdShyKSlyZXR1cm4gdChyLG4pO2Zvcih2YXIgbz1yLmxlbmd0aCxzPWU/bzotMSxpPU9iamVjdChyKTsoZT9zLS06KytzPG8pJiYhMSE9PW4oaVtzXSxzLGkpOyk7cmV0dXJuIHJ9fSgoZnVuY3Rpb24odCxlKXtyZXR1cm4gdCYmSmkodCxlLE51KX0pKSxGdT1rdTtmdW5jdGlvbiBQdSh0KXtyZXR1cm4gdH1mdW5jdGlvbiBUdSh0LGUpe3ZhciByO3JldHVybihtbih0KT9ZaTpGdSkodCwiZnVuY3Rpb24iPT10eXBlb2Yocj1lKT9yOlB1KX12YXIgenU9L1wufFxbKD86W15bXF1dKnwoWyInXSkoPzooPyFcMSlbXlxcXXxcXC4pKj9cMSlcXS8sVnU9L15cdyokLzt2YXIgJHU9UHJbIl9fY29yZS1qc19zaGFyZWRfXyJdLHF1PWZ1bmN0aW9uKCl7dmFyIHQ9L1teLl0rJC8uZXhlYygkdSYmJHUua2V5cyYmJHUua2V5cy5JRV9QUk9UT3x8IiIpO3JldHVybiB0PyJTeW1ib2woc3JjKV8xLiIrdDoiIn0oKTt2YXIgRHU9RnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nO3ZhciBVdT0vXlxbb2JqZWN0IC4rP0NvbnN0cnVjdG9yXF0kLyxMdT1GdW5jdGlvbi5wcm90b3R5cGUsQnU9T2JqZWN0LnByb3RvdHlwZSxHdT1MdS50b1N0cmluZyxXdT1CdS5oYXNPd25Qcm9wZXJ0eSxLdT1SZWdFeHAoIl4iK0d1LmNhbGwoV3UpLnJlcGxhY2UoL1tcXF4kLiorPygpW1xde318XS9nLCJcXCQmIikucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXCgpfCBmb3IgLis/KD89XFxcXSkvZywiJDEuKj8iKSsiJCIpO2Z1bmN0aW9uIFl1KHQpe3JldHVybiEoIXRuKHQpfHxmdW5jdGlvbih0KXtyZXR1cm4hIXF1JiZxdSBpbiB0fSh0KSkmJihSdSh0KT9LdTpVdSkudGVzdChmdW5jdGlvbih0KXtpZihudWxsIT10KXt0cnl7cmV0dXJuIER1LmNhbGwodCl9Y2F0Y2godCl7fXRyeXtyZXR1cm4gdCsiIn1jYXRjaCh0KXt9fXJldHVybiIifSh0KSl9ZnVuY3Rpb24gWHUodCxlKXt2YXIgcj1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT10P3ZvaWQgMDp0W2VdfSh0LGUpO3JldHVybiBZdShyKT9yOnZvaWQgMH12YXIgSnU9WHUoT2JqZWN0LCJjcmVhdGUiKTt2YXIgWnU9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt2YXIgSHU9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBRdSh0KXt2YXIgZT0tMSxyPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxyOyl7dmFyIG49dFtlXTt0aGlzLnNldChuWzBdLG5bMV0pfX1mdW5jdGlvbiB0YSh0LGUpe2Zvcih2YXIgcixuLG89dC5sZW5ndGg7by0tOylpZigocj10W29dWzBdKT09PShuPWUpfHxyIT1yJiZuIT1uKXJldHVybiBvO3JldHVybi0xfVF1LnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuX19kYXRhX189SnU/SnUobnVsbCk6e30sdGhpcy5zaXplPTB9LFF1LnByb3RvdHlwZS5kZWxldGU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5oYXModCkmJmRlbGV0ZSB0aGlzLl9fZGF0YV9fW3RdO3JldHVybiB0aGlzLnNpemUtPWU/MTowLGV9LFF1LnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXztpZihKdSl7dmFyIHI9ZVt0XTtyZXR1cm4iX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyI9PT1yP3ZvaWQgMDpyfXJldHVybiBadS5jYWxsKGUsdCk/ZVt0XTp2b2lkIDB9LFF1LnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXztyZXR1cm4gSnU/dm9pZCAwIT09ZVt0XTpIdS5jYWxsKGUsdCl9LFF1LnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLl9fZGF0YV9fO3JldHVybiB0aGlzLnNpemUrPXRoaXMuaGFzKHQpPzA6MSxyW3RdPUp1JiZ2b2lkIDA9PT1lPyJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIjplLHRoaXN9O3ZhciBlYT1BcnJheS5wcm90b3R5cGUuc3BsaWNlO2Z1bmN0aW9uIHJhKHQpe3ZhciBlPS0xLHI9bnVsbD09dD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPHI7KXt2YXIgbj10W2VdO3RoaXMuc2V0KG5bMF0sblsxXSl9fXJhLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuX19kYXRhX189W10sdGhpcy5zaXplPTB9LHJhLnByb3RvdHlwZS5kZWxldGU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxyPXRhKGUsdCk7cmV0dXJuIShyPDApJiYocj09ZS5sZW5ndGgtMT9lLnBvcCgpOmVhLmNhbGwoZSxyLDEpLC0tdGhpcy5zaXplLCEwKX0scmEucHJvdG90eXBlLmdldD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fLHI9dGEoZSx0KTtyZXR1cm4gcjwwP3ZvaWQgMDplW3JdWzFdfSxyYS5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKHQpe3JldHVybiB0YSh0aGlzLl9fZGF0YV9fLHQpPi0xfSxyYS5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5fX2RhdGFfXyxuPXRhKHIsdCk7cmV0dXJuIG48MD8oKyt0aGlzLnNpemUsci5wdXNoKFt0LGVdKSk6cltuXVsxXT1lLHRoaXN9O3ZhciBuYT1YdShQciwiTWFwIik7ZnVuY3Rpb24gb2EodCxlKXt2YXIgcixuLG89dC5fX2RhdGFfXztyZXR1cm4oInN0cmluZyI9PShuPXR5cGVvZihyPWUpKXx8Im51bWJlciI9PW58fCJzeW1ib2wiPT1ufHwiYm9vbGVhbiI9PW4/Il9fcHJvdG9fXyIhPT1yOm51bGw9PT1yKT9vWyJzdHJpbmciPT10eXBlb2YgZT8ic3RyaW5nIjoiaGFzaCJdOm8ubWFwfWZ1bmN0aW9uIHNhKHQpe3ZhciBlPS0xLHI9bnVsbD09dD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPHI7KXt2YXIgbj10W2VdO3RoaXMuc2V0KG5bMF0sblsxXSl9fXNhLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuc2l6ZT0wLHRoaXMuX19kYXRhX189e2hhc2g6bmV3IFF1LG1hcDpuZXcobmF8fHJhKSxzdHJpbmc6bmV3IFF1fX0sc2EucHJvdG90eXBlLmRlbGV0ZT1mdW5jdGlvbih0KXt2YXIgZT1vYSh0aGlzLHQpLmRlbGV0ZSh0KTtyZXR1cm4gdGhpcy5zaXplLT1lPzE6MCxlfSxzYS5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiBvYSh0aGlzLHQpLmdldCh0KX0sc2EucHJvdG90eXBlLmhhcz1mdW5jdGlvbih0KXtyZXR1cm4gb2EodGhpcyx0KS5oYXModCl9LHNhLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxlKXt2YXIgcj1vYSh0aGlzLHQpLG49ci5zaXplO3JldHVybiByLnNldCh0LGUpLHRoaXMuc2l6ZSs9ci5zaXplPT1uPzA6MSx0aGlzfTt2YXIgaWE9IkV4cGVjdGVkIGEgZnVuY3Rpb24iO2Z1bmN0aW9uIHVhKHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHR8fG51bGwhPWUmJiJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoaWEpO3ZhciByPWZ1bmN0aW9uKCl7dmFyIG49YXJndW1lbnRzLG89ZT9lLmFwcGx5KHRoaXMsbik6blswXSxzPXIuY2FjaGU7aWYocy5oYXMobykpcmV0dXJuIHMuZ2V0KG8pO3ZhciBpPXQuYXBwbHkodGhpcyxuKTtyZXR1cm4gci5jYWNoZT1zLnNldChvLGkpfHxzLGl9O3JldHVybiByLmNhY2hlPW5ldyh1YS5DYWNoZXx8c2EpLHJ9dWEuQ2FjaGU9c2E7dmFyIGFhPS9bXi5bXF1dK3xcWyg/OigtP1xkKyg/OlwuXGQrKT8pfChbIiddKSgoPzooPyFcMilbXlxcXXxcXC4pKj8pXDIpXF18KD89KD86XC58XFtcXSkoPzpcLnxcW1xdfCQpKS9nLGxhPS9cXChcXCk/L2csaGE9ZnVuY3Rpb24odCl7dmFyIGU9dWEodCwoZnVuY3Rpb24odCl7cmV0dXJuIDUwMD09PXIuc2l6ZSYmci5jbGVhcigpLHR9KSkscj1lLmNhY2hlO3JldHVybiBlfSgoZnVuY3Rpb24odCl7dmFyIGU9W107cmV0dXJuIDQ2PT09dC5jaGFyQ29kZUF0KDApJiZlLnB1c2goIiIpLHQucmVwbGFjZShhYSwoZnVuY3Rpb24odCxyLG4sbyl7ZS5wdXNoKG4/by5yZXBsYWNlKGxhLCIkMSIpOnJ8fHQpfSkpLGV9KSksY2E9aGE7ZnVuY3Rpb24gZmEodCxlKXtyZXR1cm4gbW4odCk/dDpmdW5jdGlvbih0LGUpe2lmKG1uKHQpKXJldHVybiExO3ZhciByPXR5cGVvZiB0O3JldHVybiEoIm51bWJlciIhPXImJiJzeW1ib2wiIT1yJiYiYm9vbGVhbiIhPXImJm51bGwhPXQmJiFybih0KSl8fFZ1LnRlc3QodCl8fCF6dS50ZXN0KHQpfHxudWxsIT1lJiZ0IGluIE9iamVjdChlKX0odCxlKT9bdF06Y2EoYm4odCkpfXZhciBtYT0xLzA7ZnVuY3Rpb24gZ2EodCl7aWYoInN0cmluZyI9PXR5cGVvZiB0fHxybih0KSlyZXR1cm4gdDt2YXIgZT10KyIiO3JldHVybiIwIj09ZSYmMS90PT0tbWE/Ii0wIjplfWZ1bmN0aW9uIHBhKHQsZSxyKXt2YXIgbj1udWxsPT10P3ZvaWQgMDpmdW5jdGlvbih0LGUpe2Zvcih2YXIgcj0wLG49KGU9ZmEoZSx0KSkubGVuZ3RoO251bGwhPXQmJnI8bjspdD10W2dhKGVbcisrXSldO3JldHVybiByJiZyPT1uP3Q6dm9pZCAwfSh0LGUpO3JldHVybiB2b2lkIDA9PT1uP3I6bn1mdW5jdGlvbiB3YSh0LGUpe2lmKCFBcih0KSlyZXR1cm57fTtpZighTnIoZSkpcmV0dXJue307bGV0IHI9e307cmV0dXJuIFR1KGUsKGZ1bmN0aW9uKGUpeyhmdW5jdGlvbih0LGUpe3JldHVybiEhQXIodCkmJiEoIVhyKGUpJiYhSnIoZSkpJiZlIGluIHR9KSh0LGUpJiYocltlXT1wYSh0LGUpKX0pKSxyfXZhciBkYT1BcnJheS5wcm90b3R5cGUuam9pbjt2YXIgYmE9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09dD8iIjpkYS5jYWxsKHQsZSl9LHlhPXt9LHZhPXt9O09iamVjdC5kZWZpbmVQcm9wZXJ0eSh2YSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7Y2xhc3MgTWF7Y29uc3RydWN0b3IodCl7dGhpcy5nZXRDb3N0PSgpPT50aGlzLkVsZW1lbnRzLm1hcCgodD0+dC5EaXN0YW5jZUZyb21NZWRvaWQpKS5yZWR1Y2UoKCh0LGUpPT50K2UpLDApLHRoaXMuZmluZEJlc3RNZWRvaWRJZHg9dD0+dGhpcy5FbGVtZW50cy5tYXAoKGU9PnRoaXMuY2FsY0Nvc3RGb3JHaXZlbkVsZW1lbnRBc01lZG9pZChlLHQpKSkucmVkdWNlKCgodCxlLHIsbik9PmUuQ29zdElmTWFkZU1lZG9pZDxuW3RdLkNvc3RJZk1hZGVNZWRvaWQ/cjp0KSwwKSx0aGlzLmNhbGNDb3N0Rm9yR2l2ZW5FbGVtZW50QXNNZWRvaWQ9KHQsZSk9Pih7Q29zdElmTWFkZU1lZG9pZDpuZXcgTWEoe0VsZW1lbnRzOnRoaXMuRWxlbWVudHMubWFwKChyPT4oe0Rpc3RhbmNlRnJvbU1lZG9pZDplKHIuRWxlbWVudCx0LkVsZW1lbnQpLEVsZW1lbnQ6ci5FbGVtZW50fSkpKSxNZWRvaWQ6dC5FbGVtZW50fSkuZ2V0Q29zdCgpLEVsZW1lbnQ6dH0pLHRoaXMuRWxlbWVudHM9dC5FbGVtZW50cyx0aGlzLk1lZG9pZD10Lk1lZG9pZH19dmEuQ2x1c3Rlcj1NYTt2YXIgamE9e30seGE9e307T2JqZWN0LmRlZmluZVByb3BlcnR5KHhhLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx4YS5kaXN0YW5jZT0odCxlKT0+e2lmKHQubGVuZ3RoIT09ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJ0aGUgaW5wdXRzIG11c3QgaGF2ZSB0aGUgc2FtZSBkaW1lbnNpb24iKTtjb25zdCByPUFycmF5LmZyb20odC5rZXlzKCkpLm1hcCgocj0+TWF0aC5wb3coTWF0aC5hYnModFtyXS1lW3JdKSwyKSkpLnJlZHVjZSgoKHQsZSk9PnQrZSksMCk7cmV0dXJuIE1hdGguc3FydChyKX07dmFyIF9hPXt9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShfYSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksX2Eua0d0RWxlbWVudEFyckxlbmd0aD0iayBtdXN0IGJlIGxlc3MgdGhhbiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBpbnB1dCBhcnJheSIsT2JqZWN0LmRlZmluZVByb3BlcnR5KGphLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtjb25zdCBFYT14YSxTYT1fYSxPYT12YTtjbGFzcyBBYXtjb25zdHJ1Y3Rvcih0LGUscil7dGhpcy5FbGVtZW50cz10LHRoaXMuSz1lLHRoaXMuRGlzdGFuY2VGbj1yLHRoaXMuT3B0aW1pc2F0aW9uQ29tcGxldGVkPSExLHRoaXMuaXRlcmF0ZT0oKT0+e3RoaXMuSXRlcmF0aW9uQ291bnQrKyx0aGlzLkNsdXN0ZXJzfHx0aGlzLmFsbG9jYXRlVG9DbHVzdGVyc0Fyb3VuZEN1cnJlbnRNZWRvaWRzKCk7Y29uc3QgdD10aGlzLk1lZG9pZHMsZT10aGlzLkNsdXN0ZXJzLHI9dGhpcy5jYWxjdWxhdGVDdXJyZW50Q29zdCgpO2xldCBuPXI7Zm9yKGxldCB0PTA7dDx0aGlzLk1lZG9pZHMubGVuZ3RoO3QrKyl7Y29uc3QgZT10PT4wPT09dGhpcy5NZWRvaWRzLmZpbHRlcigoZT0+MD09PXRoaXMuRGlzdGFuY2VGbih0LGUpKSkubGVuZ3RoO2Zvcihjb25zdCByIG9mIHRoaXMuRWxlbWVudHMuZmlsdGVyKGUpKXtjb25zdCBlPXRoaXMuTWVkb2lkcy5zbGljZSgpO2VbdF09cjtjb25zdCBvPW5ldyBBYSh0aGlzLkVsZW1lbnRzLnNsaWNlKCksdGhpcy5LLHRoaXMuRGlzdGFuY2VGbik7by5NZWRvaWRzPWUsby5hbGxvY2F0ZVRvQ2x1c3RlcnNBcm91bmRDdXJyZW50TWVkb2lkcygpO2NvbnN0IHM9by5jYWxjdWxhdGVDdXJyZW50Q29zdCgpO3M8biYmKG49cyx0aGlzLkNsdXN0ZXJzPW8uQ2x1c3RlcnMsdGhpcy5NZWRvaWRzPWUpfX1yZXR1cm4gdGhpcy5jYWxjdWxhdGVDdXJyZW50Q29zdCgpPHJ8fCh0aGlzLkNsdXN0ZXJzPWUsdGhpcy5NZWRvaWRzPXQsdGhpcy5PcHRpbWlzYXRpb25Db21wbGV0ZWQ9ITAsITEpfSx0aGlzLmdldENsdXN0ZXJlZERhdGE9KCk9Pih0aGlzLk9wdGltaXNhdGlvbkNvbXBsZXRlZHx8dGhpcy5ydW5Ub0NvbXBsZXRpb24oKSx0aGlzLkNsdXN0ZXJzLm1hcCgodD0+dC5FbGVtZW50cy5tYXAoKHQ9PnQuRWxlbWVudCkpKSkpLHRoaXMucnVuVG9Db21wbGV0aW9uPSgpPT57Zm9yKDt0aGlzLml0ZXJhdGUoKTspO30sdGhpcy5hbGxvY2F0ZVRvQ2x1c3RlcnNBcm91bmRDdXJyZW50TWVkb2lkcz0oKT0+e3RoaXMuQ2x1c3RlcnM9bmV3IEFycmF5LHRoaXMuTWVkb2lkcy5mb3JFYWNoKCh0PT57dGhpcy5DbHVzdGVycy5wdXNoKG5ldyBPYS5DbHVzdGVyKHtFbGVtZW50czpbXSxNZWRvaWQ6dH0pKX0pKSx0aGlzLkVsZW1lbnRzLmZvckVhY2goKCh0LGUpPT57Y29uc3Qgcj10aGlzLmZpbmREaXN0YW5jZXModGhpcy5DbHVzdGVycy5tYXAoKHQ9PnQuTWVkb2lkKSksdCksbj1yLnJlZHVjZSgoKHQsZSxyLG4pPT5lPG5bdF0/cjp0KSwwKTt0aGlzLkNsdXN0ZXJzW25dLkVsZW1lbnRzLnB1c2goe0Rpc3RhbmNlRnJvbU1lZG9pZDpyW25dLEVsZW1lbnQ6dH0pfSkpfSx0aGlzLmNhbGN1bGF0ZUN1cnJlbnRDb3N0PSgpPT50aGlzLkNsdXN0ZXJzLm1hcCgodD0+dC5nZXRDb3N0KCkpKS5yZWR1Y2UoKCh0LGUpPT50K2UpLDApLHRoaXMuZmluZERpc3RhbmNlcz0odCxlKT0+dC5tYXAoKHQ9PnRoaXMuRGlzdGFuY2VGbih0LGUpKSksdGhpcy5zZWxlY3RJbml0aWFsTWVkb2lkcz0oKT0+e2lmKHRoaXMuSz49dGhpcy5FbGVtZW50cy5sZW5ndGgpdGhyb3cgU2Eua0d0RWxlbWVudEFyckxlbmd0aDtjb25zdCB0PVtdLGU9KHQsZSk9Pntmb3IoY29uc3QgciBvZiBlKWlmKDA9PT10aGlzLkRpc3RhbmNlRm4ocix0KSlyZXR1cm4hMTtyZXR1cm4hMH07bGV0IHI9MDtmb3IoO3I8dGhpcy5FbGVtZW50cy5sZW5ndGgmJnQubGVuZ3RoPHRoaXMuSzspZSh0aGlzLkVsZW1lbnRzW3JdLHQpJiZ0LnB1c2godGhpcy5FbGVtZW50c1tyXSkscisrO3JldHVybiB0fSx0aGlzLkRpc3RhbmNlRm49dGhpcy5EaXN0YW5jZUZufHxFYS5kaXN0YW5jZSx0aGlzLk1lZG9pZHM9dGhpcy5zZWxlY3RJbml0aWFsTWVkb2lkcygpLHRoaXMuSXRlcmF0aW9uQ291bnQ9MH1nZXQgT3B0aW1pc2F0aW9uU3RhcnRlZCgpe3JldHVybiB0aGlzLkl0ZXJhdGlvbkNvdW50PjB9fUFhLmNsdXN0ZXJFbGVtZW50cz0odCxlLHIpPT57QWEuZ2V0SW5zdGFuY2UodCxlLHIpO3JldHVybiBuZXcgQXJyYXl9LEFhLmdldEluc3RhbmNlPSh0LGUscik9Pm5ldyBBYSh0LGUsciksamEuQ2x1c3RlcmVyPUFhLGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7Zm9yKHZhciByIGluIGUpdC5oYXNPd25Qcm9wZXJ0eShyKXx8KHRbcl09ZVtyXSl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGUodmEpLGUoamEpfSh5YSk7dmFyIENhPWUoeWEpO2Z1bmN0aW9uIFJhKHQpe3JldHVybiBSYT0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYic3ltYm9sIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbih0KXtyZXR1cm4gdHlwZW9mIHR9OmZ1bmN0aW9uKHQpe3JldHVybiB0JiYiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZ0LmNvbnN0cnVjdG9yPT09U3ltYm9sJiZ0IT09U3ltYm9sLnByb3RvdHlwZT8ic3ltYm9sIjp0eXBlb2YgdH0sUmEodCl9ZnVuY3Rpb24gSWEodCl7dmFyIGU9ZnVuY3Rpb24odCxlKXtpZigib2JqZWN0IiE9PVJhKHQpfHxudWxsPT09dClyZXR1cm4gdDt2YXIgcj10W1N5bWJvbC50b1ByaW1pdGl2ZV07aWYodm9pZCAwIT09cil7dmFyIG49ci5jYWxsKHQsZXx8ImRlZmF1bHQiKTtpZigib2JqZWN0IiE9PVJhKG4pKXJldHVybiBuO3Rocm93IG5ldyBUeXBlRXJyb3IoIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuIil9cmV0dXJuKCJzdHJpbmciPT09ZT9TdHJpbmc6TnVtYmVyKSh0KX0odCwic3RyaW5nIik7cmV0dXJuInN5bWJvbCI9PT1SYShlKT9lOlN0cmluZyhlKX1mdW5jdGlvbiBOYSh0LGUscil7cmV0dXJuKGU9SWEoZSkpaW4gdD9PYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLHt2YWx1ZTpyLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSk6dFtlXT1yLHR9ZnVuY3Rpb24ga2EodCxlKXtsZXQgcj0wO2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bisrKXIrPSh0W25dLWVbbl0pKih0W25dLWVbbl0pO3JldHVybiByfWNvbnN0IEZhPXtkaXN0YW5jZUZ1bmN0aW9uOmthfTtmdW5jdGlvbiBQYSh0LGUscj1GYSl7Y29uc3Qgbj1yLmRpc3RhbmNlRnVuY3Rpb258fEZhLmRpc3RhbmNlRnVuY3Rpb24sbz1yLnNpbWlsYXJpdHlGdW5jdGlvbnx8RmEuc2ltaWxhcml0eUZ1bmN0aW9uO2xldCBzPS0xO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBvKXtsZXQgcj1OdW1iZXIuTUlOX1ZBTFVFO2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bisrKXtjb25zdCBpPW8oZSx0W25dKTtpPnImJihyPWkscz1uKX19ZWxzZXtpZigiZnVuY3Rpb24iIT10eXBlb2Ygbil0aHJvdyBuZXcgRXJyb3IoIkEgc2ltaWxhcml0eSBvciBkaXN0YW5jZSBmdW5jdGlvbiBpdCdzIHJlcXVpcmVkIik7e2xldCByPU51bWJlci5NQVhfVkFMVUU7Zm9yKGxldCBvPTA7bzx0Lmxlbmd0aDtvKyspe2NvbnN0IGk9bihlLHRbb10pO2k8ciYmKHI9aSxzPW8pfX19cmV0dXJuIHN9ZnVuY3Rpb24gVGEodCxlLHIsbil7Zm9yKGxldCBvPTA7bzx0Lmxlbmd0aDtvKyspcltvXT1QYShlLHRbb10se2Rpc3RhbmNlRnVuY3Rpb246bn0pO3JldHVybiByfWNsYXNzIHphe2NvbnN0cnVjdG9yKHQsZSxyLG4sbyl7dGhpcy5jbHVzdGVycz10LHRoaXMuY2VudHJvaWRzPWUsdGhpcy5jb252ZXJnZWQ9cix0aGlzLml0ZXJhdGlvbnM9bix0aGlzLmRpc3RhbmNlPW99bmVhcmVzdCh0KXtjb25zdCBlPW5ldyBBcnJheSh0Lmxlbmd0aCk7cmV0dXJuIFRhKHQsdGhpcy5jZW50cm9pZHMsZSx0aGlzLmRpc3RhbmNlKX1jb21wdXRlSW5mb3JtYXRpb24odCl7bGV0IGU9dGhpcy5jZW50cm9pZHMubWFwKCh0PT4oe2NlbnRyb2lkOnQsZXJyb3I6MCxzaXplOjB9KSkpO2ZvcihsZXQgcj0wO3I8dC5sZW5ndGg7cisrKWVbdGhpcy5jbHVzdGVyc1tyXV0uZXJyb3IrPXRoaXMuZGlzdGFuY2UodFtyXSx0aGlzLmNlbnRyb2lkc1t0aGlzLmNsdXN0ZXJzW3JdXSksZVt0aGlzLmNsdXN0ZXJzW3JdXS5zaXplKys7Zm9yKGxldCB0PTA7dDx0aGlzLmNlbnRyb2lkcy5sZW5ndGg7dCsrKXtsZXQgcj1lW3RdLmVycm9yO2VbdF0uc2l6ZSYmLTEhPT1yP3IvPWVbdF0uc2l6ZTplW3RdLmVycm9yPS0xfXJldHVybiBlfX1mdW5jdGlvbiBWYSh0LGUpe2NvbnN0IHI9NjU1MzUmKHQ+Pj49MCk7cmV0dXJuKCh0LXIpKihlPj4+PTApPj4+MCkrciplPj4+MH1jbGFzcyAkYXtjb25zdHJ1Y3Rvcih0PURhdGUubm93KCkpe3RoaXMuc3RhdGU9bmV3IFVpbnQzMkFycmF5KDQpLHRoaXMuaW5pdCh0KSx0aGlzLnJhbmRvbT10aGlzLmdldEZsb2F0LmJpbmQodGhpcyl9Z2V0VWludDMyKCl7cmV0dXJuIHRoaXMubmV4dFN0YXRlKCksdGhpcy5zdGF0ZVszXSt0aGlzLnN0YXRlWzJdPj4+MH1nZXRGbG9hdCgpe3JldHVybiA1Ljk2MDQ2NDQ3NzUzOTA2M2UtOCoodGhpcy5nZXRVaW50MzIoKT4+PjgpfWluaXQodCl7aWYoIU51bWJlci5pc0ludGVnZXIodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigic2VlZCBtdXN0IGJlIGFuIGludGVnZXIiKTt0aGlzLnN0YXRlWzBdPXQsdGhpcy5zdGF0ZVsxXT0wLHRoaXMuc3RhdGVbMl09MCx0aGlzLnN0YXRlWzNdPTA7Zm9yKGxldCB0PTE7dDw4O3QrKyl0aGlzLnN0YXRlWzMmdF1ePXQrVmEoMTgxMjQzMzI1Myx0aGlzLnN0YXRlW3QtMSYzXV50aGlzLnN0YXRlW3QtMSYzXT4+PjMwPj4+MCk+Pj4wO3RoaXMucGVyaW9kQ2VydGlmaWNhdGlvbigpO2ZvcihsZXQgdD0wO3Q8ODt0KyspdGhpcy5uZXh0U3RhdGUoKX1wZXJpb2RDZXJ0aWZpY2F0aW9uKCl7MD09PXRoaXMuc3RhdGVbMF0mJjA9PT10aGlzLnN0YXRlWzFdJiYwPT09dGhpcy5zdGF0ZVsyXSYmMD09PXRoaXMuc3RhdGVbM10mJih0aGlzLnN0YXRlWzBdPTg4LHRoaXMuc3RhdGVbMV09ODMsdGhpcy5zdGF0ZVsyXT02NSx0aGlzLnN0YXRlWzNdPTY4KX1uZXh0U3RhdGUoKXtsZXQgdD10aGlzLnN0YXRlWzBdO3RePXQ8PDE1LHRePXQ+Pj4xOCx0Xj10aGlzLnN0YXRlWzNdPDwxMSx0aGlzLnN0YXRlWzBdPXRoaXMuc3RhdGVbMV0sdGhpcy5zdGF0ZVsxXT10aGlzLnN0YXRlWzJdLHRoaXMuc3RhdGVbMl09dGhpcy5zdGF0ZVszXSx0aGlzLnN0YXRlWzNdPXR9fWZ1bmN0aW9uIHFhKHQsZT17fSxyPU1hdGgucmFuZG9tKXtjb25zdHtzaXplOm49MSxyZXBsYWNlOm89ITEscHJvYmFiaWxpdGllczpzfT1lO2xldCBpLHU7aWYoaT0ibnVtYmVyIj09dHlwZW9mIHQ/ZnVuY3Rpb24odCl7Y29uc3QgZT1bXTtmb3IobGV0IHI9MDtyPHQ7cisrKWUucHVzaChyKTtyZXR1cm4gZX0odCk6dC5zbGljZSgpLHMpe2lmKCFvKXRocm93IG5ldyBFcnJvcigiY2hvaWNlIHdpdGggcHJvYmFiaWxpdGllcyBhbmQgbm8gcmVwbGFjZW1lbnQgaXMgbm90IGltcGxlbWVudGVkIik7aWYocy5sZW5ndGghPT1pLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoInRoZSBsZW5ndGggb2YgcHJvYmFiaWxpdGllcyBvcHRpb24gc2hvdWxkIGJlIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgY2hvaWNlcyIpO3U9W3NbMF1dO2ZvcihsZXQgdD0xO3Q8cy5sZW5ndGg7dCsrKXVbdF09dVt0LTFdK3NbdF07aWYoTWF0aC5hYnMoMS11W3UubGVuZ3RoLTFdKT4xZS04KXRocm93IG5ldyBFcnJvcihgcHJvYmFiaWxpdGllcyBzaG91bGQgc3VtIHRvIDEsIGJ1dCBpbnN0ZWFkIHN1bXMgdG8gJHt1W3UubGVuZ3RoLTFdfWApfWlmKCExPT09byYmbj5pLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoInNpemUgb3B0aW9uIGlzIHRvbyBsYXJnZSIpO2NvbnN0IGE9W107Zm9yKGxldCB0PTA7dDxuO3QrKyl7Y29uc3QgdD1EYShpLmxlbmd0aCxyLHUpO2EucHVzaChpW3RdKSxvfHxpLnNwbGljZSh0LDEpfXJldHVybiBhfWZ1bmN0aW9uIERhKHQsZSxyKXtjb25zdCBuPWUoKTtpZihyKXtsZXQgdD0wO2Zvcig7bj5yW3RdOyl0Kys7cmV0dXJuIHR9cmV0dXJuIE1hdGguZmxvb3Iobip0KX1jbGFzcyBVYXtjb25zdHJ1Y3Rvcih0PU1hdGgucmFuZG9tKXtpZigibnVtYmVyIj09dHlwZW9mIHQpe2NvbnN0IGU9bmV3ICRhKHQpO3RoaXMucmFuZG9tR2VuZXJhdG9yPWUucmFuZG9tfWVsc2UgdGhpcy5yYW5kb21HZW5lcmF0b3I9dH1jaG9pY2UodCxlKXtyZXR1cm4gcWEodCxlLHRoaXMucmFuZG9tR2VuZXJhdG9yKX1yYW5kb20oKXtyZXR1cm4gdGhpcy5yYW5kb21HZW5lcmF0b3IoKX1yYW5kSW50KHQsZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPXQsdD0wKSx0K01hdGguZmxvb3IodGhpcy5yYW5kb21HZW5lcmF0b3IoKSooZS10KSl9cmFuZG9tU2FtcGxlKHQpe2NvbnN0IGU9W107Zm9yKGxldCByPTA7cjx0O3IrKyllLnB1c2godGhpcy5yYW5kb20oKSk7cmV0dXJuIGV9fWZ1bmN0aW9uIExhKHQsZSl7dmFyIHI9T2JqZWN0LmtleXModCk7aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIG49T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0KTtlJiYobj1uLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxlKS5lbnVtZXJhYmxlfSkpKSxyLnB1c2guYXBwbHkocixuKX1yZXR1cm4gcn1mdW5jdGlvbiBCYSh0KXtmb3IodmFyIGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXt2YXIgcj1udWxsIT1hcmd1bWVudHNbZV0/YXJndW1lbnRzW2VdOnt9O2UlMj9MYShPYmplY3QociksITApLmZvckVhY2goKGZ1bmN0aW9uKGUpe05hKHQsZSxyW2VdKX0pKTpPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycz9PYmplY3QuZGVmaW5lUHJvcGVydGllcyh0LE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHIpKTpMYShPYmplY3QocikpLmZvckVhY2goKGZ1bmN0aW9uKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihyLGUpKX0pKX1yZXR1cm4gdH1mdW5jdGlvbiBHYSh0LGUpe2NvbnN0IHI9bmV3IFVuKHQucm93cyxlLnJvd3MpO2ZvcihsZXQgbj0wO248dC5yb3dzO24rKylmb3IobGV0IG89MDtvPGUucm93cztvKyspci5zZXQobixvLGthKHQuZ2V0Um93KG4pLGUuZ2V0Um93KG8pKSk7cmV0dXJuIHJ9ZnVuY3Rpb24gV2EodCl7bGV0IGU9W107Zm9yKGxldCByPTA7cjx0O3IrKyllLnB1c2gocik7cmV0dXJuIGV9ZnVuY3Rpb24gS2EodCl7bGV0IGU9W3RbMF1dO2ZvcihsZXQgcj0xO3I8dC5sZW5ndGg7cisrKWVbcl09ZVtyLTFdK3Rbcl07cmV0dXJuIGV9ZnVuY3Rpb24gWWEodCxlKXt2YXIgcj1PYmplY3Qua2V5cyh0KTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgbj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHQpO2UmJihuPW4uZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LGUpLmVudW1lcmFibGV9KSkpLHIucHVzaC5hcHBseShyLG4pfXJldHVybiByfWZ1bmN0aW9uIFhhKHQpe2Zvcih2YXIgZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe3ZhciByPW51bGwhPWFyZ3VtZW50c1tlXT9hcmd1bWVudHNbZV06e307ZSUyP1lhKE9iamVjdChyKSwhMCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7TmEodCxlLHJbZV0pfSkpOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHQsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMocikpOllhKE9iamVjdChyKSkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHIsZSkpfSkpfXJldHVybiB0fWNvbnN0IEphPXttYXhJdGVyYXRpb25zOjEwMCx0b2xlcmFuY2U6MWUtNixpbml0aWFsaXphdGlvbjoia21lYW5zKysiLGRpc3RhbmNlRnVuY3Rpb246a2F9O2Z1bmN0aW9uIFphKHQsZSxyLG4sbyxzKXtsZXQgaT1mdW5jdGlvbih0LGUscixuKXtjb25zdCBvPWVbMF0ubGVuZ3RoO2xldCBzPW5ldyBBcnJheShuKSxpPW5ldyBBcnJheShuKTtmb3IobGV0IHQ9MDt0PG47dCsrKXtzW3RdPW5ldyBBcnJheShvKSxpW3RdPTA7Zm9yKGxldCBlPTA7ZTxvO2UrKylzW3RdW2VdPTB9Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0Kyspe2lbclt0XV0rKztmb3IobGV0IG49MDtuPG87bisrKXNbclt0XV1bbl0rPWVbdF1bbl19Zm9yKGxldCBlPTA7ZTxuO2UrKylmb3IobGV0IHI9MDtyPG87cisrKWlbZV0/c1tlXVtyXS89aVtlXTpzW2VdW3JdPXRbZV1bcl07cmV0dXJuIHN9KHQsZSxyPVRhKGUsdCxyLG8uZGlzdGFuY2VGdW5jdGlvbiksbiksdT1mdW5jdGlvbih0LGUscixuKXtmb3IobGV0IG89MDtvPHQubGVuZ3RoO28rKylpZihyKHRbb10sZVtvXSk+bilyZXR1cm4hMTtyZXR1cm4hMH0oaSx0LG8uZGlzdGFuY2VGdW5jdGlvbixvLnRvbGVyYW5jZSk7cmV0dXJuIG5ldyB6YShyLGksdSxzLG8uZGlzdGFuY2VGdW5jdGlvbil9ZnVuY3Rpb24gSGEodCxlLHIpe2NvbnN0IG49ZnVuY3Rpb24odCl7cmV0dXJuIFhhKFhhKHt9LEphKSx0KX0ocik7IWZ1bmN0aW9uKHQsZSl7aWYoZTw9MHx8ZT50Lmxlbmd0aHx8IU51bWJlci5pc0ludGVnZXIoZSkpdGhyb3cgbmV3IEVycm9yKCJLIHNob3VsZCBiZSBhIHBvc2l0aXZlIGludGVnZXIgc21hbGxlciB0aGFuIHRoZSBudW1iZXIgb2YgcG9pbnRzIil9KHQsZSk7bGV0IG89ZnVuY3Rpb24odCxlLHIpe2xldCBuO2lmKEFycmF5LmlzQXJyYXkoci5pbml0aWFsaXphdGlvbikpe2lmKHIuaW5pdGlhbGl6YXRpb24ubGVuZ3RoIT09ZSl0aHJvdyBuZXcgRXJyb3IoIlRoZSBpbml0aWFsIGNlbnRlcnMgc2hvdWxkIGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFzIEsiKTtuPXIuaW5pdGlhbGl6YXRpb259ZWxzZSBzd2l0Y2goci5pbml0aWFsaXphdGlvbil7Y2FzZSJrbWVhbnMrKyI6bj1mdW5jdGlvbih0LGUscj17fSl7Y29uc3Qgbj1uZXcgVW4odCksbz1uLnJvd3Mscz1uZXcgVWEoci5zZWVkKSxpPVtdLHU9ci5sb2NhbFRyaWFsc3x8MitNYXRoLmZsb29yKE1hdGgubG9nKGUpKSxhPXMucmFuZEludChvKTtpLnB1c2gobi5nZXRSb3coYSkpO2xldCBsPW5ldyBVbigxLG4ucm93cyk7Zm9yKGxldCB0PTA7dDxuLnJvd3M7dCsrKWwuc2V0KDAsdCxrYShuLmdldFJvdyh0KSxpWzBdKSk7bGV0IGg9W0thKGwuZ2V0Um93KDApKV07Y29uc3QgYz0xL2hbMF1bby0xXTtsZXQgZj1Vbi5tdWwobCxjKTtmb3IobGV0IHQ9MTt0PGU7dCsrKXtjb25zdCBlPXMuY2hvaWNlKG8se3JlcGxhY2U6ITAsc2l6ZTp1LHByb2JhYmlsaXRpZXM6Zi5nZXRSb3coMCl9KSxyPUdhKG4uc2VsZWN0aW9uKGUsV2Eobi5jb2x1bW5zKSksbik7bGV0IGE9MS8wLGM9MS8wLG09bDtmb3IobGV0IHQ9MDt0PHU7dCsrKXtjb25zdCBuPVVuLm1pbihsLFtyLmdldFJvdyh0KV0pLG89bi5zdW0oKTtvPGMmJihhPWVbdF0sYz1vLG09bil9aVt0XT1uLmdldFJvdyhhKSxsPW0saD1bS2EobC5nZXRSb3coMCkpXSxmPVVuLm11bChsLDEvaFswXVtvLTFdKX1yZXR1cm4gaX0odCxlLHIpO2JyZWFrO2Nhc2UicmFuZG9tIjpuPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gbmV3IFVhKHIpLmNob2ljZSh0LHtzaXplOmV9KX0odCxlLHIuc2VlZCk7YnJlYWs7Y2FzZSJtb3N0RGlzdGFudCI6bj1mdW5jdGlvbih0LGUscixuKXtjb25zdCBvPW5ldyBVYShuKTtsZXQgcz1uZXcgQXJyYXkoZSk7aWYoc1swXT1NYXRoLmZsb29yKG8ucmFuZG9tKCkqdC5sZW5ndGgpLGU+MSl7bGV0IG49e2Rpc3Q6LTEsaW5kZXg6LTF9O2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7KytlKXJbc1swXV1bZV0+bi5kaXN0JiYobi5kaXN0PXJbc1swXV1bZV0sbi5pbmRleD1lKTtpZihzWzFdPW4uaW5kZXgsZT4yKWZvcihsZXQgbj0yO248ZTsrK24pe2xldCBlPXtkaXN0Oi0xLGluZGV4Oi0xfTtmb3IobGV0IG89MDtvPHQubGVuZ3RoOysrbyl7bGV0IHQ9e2Rpc3Q6TnVtYmVyLk1BWF9WQUxVRSxpbmRleDotMX07Zm9yKGxldCBlPTA7ZTxuOysrZSlyW2VdW29dPHQuZGlzdCYmIXMuaW5jbHVkZXMobykmJih0PXtkaXN0OnJbZV1bb10saW5kZXg6b30pO3QuZGlzdCE9PU51bWJlci5NQVhfVkFMVUUmJnQuZGlzdD5lLmRpc3QmJihlPUJhKHt9LHQpKX1zW25dPWUuaW5kZXh9fXJldHVybiBzLm1hcCgoZT0+dFtlXSkpfSh0LGUsZnVuY3Rpb24odCxlKXtsZXQgcj1uZXcgQXJyYXkodC5sZW5ndGgpO2ZvcihsZXQgbj0wO248dC5sZW5ndGg7KytuKWZvcihsZXQgbz1uO288dC5sZW5ndGg7KytvKXtyW25dfHwocltuXT1uZXcgQXJyYXkodC5sZW5ndGgpKSxyW29dfHwocltvXT1uZXcgQXJyYXkodC5sZW5ndGgpKTtjb25zdCBzPWUodFtuXSx0W29dKTtyW25dW29dPXMscltvXVtuXT1zfXJldHVybiByfSh0LHIuZGlzdGFuY2VGdW5jdGlvbiksci5zZWVkKTticmVhaztkZWZhdWx0OiFmdW5jdGlvbih0LGUpe3Rocm93IG5ldyBFcnJvcihgJHtlfTogIiR7U3RyaW5nKHQpfSJgKX0oci5pbml0aWFsaXphdGlvbiwiVW5rbm93biBpbml0aWFsaXphdGlvbiBtZXRob2QiKX1yZXR1cm4gbn0odCxlLG4pOzA9PT1uLm1heEl0ZXJhdGlvbnMmJihuLm1heEl0ZXJhdGlvbnM9TnVtYmVyLk1BWF9WQUxVRSk7bGV0IHMsaT1uZXcgQXJyYXkodC5sZW5ndGgpLHU9ITEsYT0wO2Zvcig7IXUmJmE8bi5tYXhJdGVyYXRpb25zOylzPVphKG8sdCxpLGUsbiwrK2EpLHU9cy5jb252ZXJnZWQsbz1zLmNlbnRyb2lkcztpZighcyl0aHJvdyBuZXcgRXJyb3IoInVucmVhY2hhYmxlOiBubyBrbWVhbnMgc3RlcCBleGVjdXRlZCIpO3JldHVybiBzfWZ1bmN0aW9uIFFhKHQsZT17fSl7bGV0IHI9dmUoZSwia051bWJlciIpO3I9SnIocik/eG4ocik6MjtsZXQgbixvPXZlKGUsIm1vZGUiKTtpZigiay1tZWRvaWRzIiE9PW8mJiJrLW1lYW5zIiE9PW8mJihvPSJrLW1lZG9pZHMiKSwiay1tZWRvaWRzIj09PW8pbj1mdW5jdGlvbih0LGUpe2xldCByPXt9O2Z1bmN0aW9uIG4odCl7cmV0dXJuIGJhKHQsIjoiKX1Ibyh0LCgodCxlKT0+e2xldCBvPW4odCk7cltvXT1lfSkpO2xldCBvPUNhLkNsdXN0ZXJlci5nZXRJbnN0YW5jZSh0LGUpLmdldENsdXN0ZXJlZERhdGEoKTtyZXR1cm4gbz1MaShvLCh0PT5MaSh0LCh0PT57bGV0IGU9bih0KTtyZXR1cm4gcltlXX0pKSkpLG99KHQscik7ZWxzZXtpZigiay1tZWFucyIhPT1vKXRocm93IG5ldyBFcnJvcihgaW52YWxpZCBtb2RlWyR7b31dYCk7bj1mdW5jdGlvbih0LGUpe2xldCByPUhhKHQsZSksbj17fTtyZXR1cm4gSG8oci5jbHVzdGVycywoKHQsZSk9PntuW3RdfHwoblt0XT1bXSksblt0XS5wdXNoKGUpfSkpLEtpKG4pfSh0LHIpfXJldHVybiBufWZ1bmN0aW9uIHRsKHQsZT17fSl7aWYoIU5yKHQpKXRocm93IG5ldyBFcnJvcigiZGF0YSBpcyBub3QgZWZmLiBhcnJheSIpO2xldCByPXZlKGUsImtOdW1iZXIiKTtKcihyKXx8KHI9Mikscj14bihyKTtsZXQgbj12ZShlLCJuQ29tcE5JUEFMUyIpO0pyKG4pfHwobj0yKSxuPXhuKG4pO2xldCBvPXZlKGUsIm1vZGUiKSxzPSIiLGk9U3IodCksdT0wLGE9MDtpZihIbyh0LCh0PT57IWZ1bmN0aW9uKHQpe2lmKEFyKHQpKXtmb3IobGV0IGUgaW4gdClyZXR1cm4hMDtyZXR1cm4hMX1yZXR1cm4hMX0odCk/TnIodCkmJihhKz0xKTp1Kz0xfSkpLHU9PT1pKXM9Im9iaiI7ZWxzZXtpZihhIT09aSl0aHJvdyBuZXcgRXJyb3IoImRhdGEgaXMgbm90IG9mIHRoZSBzYW1lIHR5cGUiKTtzPSJtYXQifWxldCBsLGg9bnVsbDsib2JqIj09PXM/KGg9ZnVuY3Rpb24odCl7bGV0IGU9e307SG8odCwodD0+e0hvKHQsKCh0LHIpPT57ZVtyXXx8KGVbcl09MCksMD09PWVbcl0mJkpyKHQpJiYoZVtyXT0xKSwxIT09ZVtyXXx8SnIodCl8fChlW3JdPS0xKX0pKX0pKTtsZXQgcj1bXTtyZXR1cm4gSG8oZSwoKHQsZSk9PnsxPT09dCYmci5wdXNoKGUpfSkpLHJ9KHQpLGw9ZnVuY3Rpb24odCxlKXtyZXR1cm4gTGkodCwodD0+e2xldCByPXdhKHQsZSk7cmV0dXJuIEtpKHIpfSkpfSh0LGgpKTpsPXQ7bGV0IGM9SG4obCx7bkNvbXBOSVBBTFM6bn0pLGY9UWEoYyx7a051bWJlcjpyLG1vZGU6b30pO3JldHVybntrZXlzOmgsZ2luZHM6ZixnbWF0OkxpKGYsKHQ9PkxpKHQsKHQ9PmNbdF0pKSkpLGdsdGR0OkxpKGYsKGU9PkxpKGUsKGU9PnRbZV0pKSkpfX1sZXQgV0NsdXN0ZXI9e1BDQTphc3luYyBmdW5jdGlvbih0LGU9e30pe3JldHVybiBIbih0LGUpfSxjbHVzdGVyOmFzeW5jIGZ1bmN0aW9uKHQsZT17fSl7dHJ5e3JldHVybiB0bCh0LGUpfWNhdGNoKHQpe3JldHVybiBQcm9taXNlLnJlamVjdCh0KX19fTsKCmxldCBpbnN0YW5jZSA9IG51bGwKZnVuY3Rpb24gaW5pdChpbnB1dCl7CgogICAgLy9pbml0CiAgICBsZXQgcgogICAgCiAgICAgICAgciA9IFdDbHVzdGVyKC4uLmlucHV0KQogICAgICAgIAoKICAgIC8vb24KICAgIAoKICAgIC8vc2F2ZQogICAgaW5zdGFuY2UgPSByCgp9CgpmdW5jdGlvbiBzZW5kTWVzc2FnZShkYXRhKSB7CiAgICAKICAgICAgICBwYXJlbnRQb3J0LnBvc3RNZXNzYWdlKGRhdGEpCiAgICAgICAgCn0KCmFzeW5jIGZ1bmN0aW9uIHJ1bihkYXRhKSB7CiAgICAvLyBjb25zb2xlLmxvZygnaW5uZXIgd29ya2VyIHJ1bicsZGF0YSkKCiAgICAvL21vZGUKICAgIGxldCBtb2RlID0gZGF0YS5tb2RlCgogICAgLy9jaGVjawogICAgaWYobW9kZSAhPT0gJ2luaXQnICYmIG1vZGUgIT09ICdjYWxsJyl7CiAgICAgICAgcmV0dXJuCiAgICB9CgogICAgLy9pbml0CiAgICBpZihtb2RlID09PSAnaW5pdCcpewogICAgICAgIAogICAgICAgIHRyeXsKCiAgICAgICAgICAgIC8vdHlwZQogICAgICAgICAgICBsZXQgdHlwZSA9IGRhdGEudHlwZQoKICAgICAgICAgICAgLy9pbnB1dAogICAgICAgICAgICBsZXQgaW5wdXQgPSBkYXRhLmlucHV0CiAgICAKICAgICAgICAgICAgLy9pbnN0YW5jZQogICAgICAgICAgICBpZih0eXBlID09PSAnZnVuY3Rpb24nKXsKICAgICAgICAgICAgICAgIGluaXQoLi4uaW5wdXQpCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZih0eXBlID09PSAnb2JqZWN0Jyl7CiAgICAgICAgICAgICAgICBpbnN0YW5jZSA9IFdDbHVzdGVyCiAgICAgICAgICAgIH0KCiAgICAgICAgfQogICAgICAgIGNhdGNoKGVycil7CiAgICAgICAgCiAgICAgICAgICAgIC8vc2VuZE1lc3NhZ2UKICAgICAgICAgICAgbGV0IHJlcyA9IHsKICAgICAgICAgICAgICAgIG1vZGU6ICdlbWl0JywKICAgICAgICAgICAgICAgIGV2TmFtZTogJ2Vycm9yJywKICAgICAgICAgICAgICAgIG1zZzogZXJyLAogICAgICAgICAgICB9CiAgICAgICAgICAgIHNlbmRNZXNzYWdlKHJlcykKCiAgICAgICAgfQogICAgICAgICAgICAKICAgIH0KCiAgICAvL2NoZWNrCiAgICBpZihtb2RlID09PSAnY2FsbCcpewogICAgICAgIGxldCBzdGF0ZSA9ICcnCiAgICAgICAgbGV0IG1zZyA9IG51bGwKCiAgICAgICAgdHJ5ewoKICAgICAgICAgICAgLy9mdW4KICAgICAgICAgICAgbGV0IGZ1biA9IGluc3RhbmNlW2RhdGEuZnVuXQoKICAgICAgICAgICAgLy9pbnB1dAogICAgICAgICAgICBsZXQgaW5wdXQgPSBkYXRhLmlucHV0CgogICAgICAgICAgICAvL2V4ZWMKICAgICAgICAgICAgYXdhaXQgZnVuKC4uLmlucHV0KQogICAgICAgICAgICAgICAgLnRoZW4oKHN1YykgPT4gewogICAgICAgICAgICAgICAgICAgIHN0YXRlPSdzdWNjZXNzJwogICAgICAgICAgICAgICAgICAgIG1zZz1zdWMKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAuY2F0Y2goKGVycikgPT4gewogICAgICAgICAgICAgICAgICAgIHN0YXRlPSdlcnJvcicKICAgICAgICAgICAgICAgICAgICBtc2c9ZXJyCiAgICAgICAgICAgICAgICB9KQoKICAgICAgICB9CiAgICAgICAgY2F0Y2goZXJyKXsKICAgICAgICAgICAgc3RhdGUgPSAnZXJyb3InCiAgICAgICAgICAgIG1zZyA9IGVycgogICAgICAgIH0KICAgICAgICAKICAgICAgICAvL3NlbmRNZXNzYWdlCiAgICAgICAgbGV0IHJlcyA9IHsKICAgICAgICAgICAgbW9kZTogJ3JldHVybicsCiAgICAgICAgICAgIGlkOiBkYXRhLmlkLAogICAgICAgICAgICBmdW46IGRhdGEuZnVuLAogICAgICAgICAgICBzdGF0ZSwKICAgICAgICAgICAgbXNnLAogICAgICAgIH0KICAgICAgICBzZW5kTWVzc2FnZShyZXMpCgogICAgfQoKfQoKZnVuY3Rpb24gcmVjdk1lc3NhZ2UoZGF0YSkgewogICAgLy8gY29uc29sZS5sb2coJ2lubmVyIHdvcmtlciByZWN2OicsIGRhdGEpCgogICAgLy9kYXRhUmVjdgogICAgbGV0IGRhdGFSZWN2ID0gZGF0YQoKICAgIC8vcnVuCiAgICBydW4oZGF0YVJlY3YpCgp9CgoKICAgICAgICBwYXJlbnRQb3J0Lm9uKCdtZXNzYWdlJywgcmVjdk1lc3NhZ2UpCiAgICAgICAgCgo=",Buffer.from(m,"base64").toString("utf8"));var m;function y(){let b=l(),Z=function(l){try{return new d.Worker(l,{eval:!0})}catch(d){m(d)}}(G);if(!Z)return m("invalid worker"),null;function m(d){b.emit("error",d)}return Z.on("message",(function(d){let l=d,Z=l.mode;"emit"!==Z&&"return"!==Z||("emit"===Z&&b.emit(l.evName,l.msg),"return"===Z&&b.emit(l.id,l))})),Z.on("error",m),function(){let d={mode:"init",type:"object",input:[...arguments]};Z.postMessage(d)}([...arguments]),b.PCA=function(){let d=c(),l=X(),G={mode:"call",id:l,fun:"PCA",input:[...arguments]};return Z.postMessage(G),b.once(l,(l=>{"success"===l.state?d.resolve(l.msg):d.reject(l.msg)})),d},b.cluster=function(){let d=c(),l=X(),G={mode:"call",id:l,fun:"cluster",input:[...arguments]};return Z.postMessage(G),b.once(l,(l=>{"success"===l.state?d.resolve(l.msg):d.reject(l.msg)})),d},b.terminate=function(){Z?(Z.terminate(),Z=void 0):m("worker has been terminated")},b}let K={PCA:async function(){let d=[...arguments],l=y();return await l.PCA(...d).finally((()=>{l.terminate()}))},cluster:async function(){let d=[...arguments],l=y();return await l.cluster(...d).finally((()=>{l.terminate()}))}};Z=l();for(let d in K){let l=K[d];Z[d]=l}}(),Z}(d)}({get exports(){return l},set exports(d){l=d}});var b=l,Z={};!function(d,l){d.exports=function(){const d="function"==typeof atob,l="function"==typeof Buffer,b="function"==typeof TextDecoder?new TextDecoder:void 0,Z=(d=>{let l={};return d.forEach(((d,b)=>l[d]=b)),l})(("function"==typeof TextEncoder&&new TextEncoder,Array.prototype.slice.call("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="))),c=/^(?:[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):d=>new Uint8Array(Array.prototype.slice.call(d,0)),m=d=>d.replace(/[^A-Za-z0-9\+\/]/g,""),y=/[\xC0-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF7][\x80-\xBF]{3}/g,K=d=>{switch(d.length){case 4:var l=((7&d.charCodeAt(0))<<18|(63&d.charCodeAt(1))<<12|(63&d.charCodeAt(2))<<6|63&d.charCodeAt(3))-65536;return X(55296+(l>>>10))+X(56320+(1023&l));case 3:return X((15&d.charCodeAt(0))<<12|(63&d.charCodeAt(1))<<6|63&d.charCodeAt(2));default:return X((31&d.charCodeAt(0))<<6|63&d.charCodeAt(1))}},W=d=>d.replace(y,K),p=d=>{if(d=d.replace(/\s+/g,""),!c.test(d))throw new TypeError("malformed base64.");d+="==".slice(2-(3&d.length));let l,b,G,m="";for(let c=0;c<d.length;)l=Z[d.charAt(c++)]<<18|Z[d.charAt(c++)]<<12|(b=Z[d.charAt(c++)])<<6|(G=Z[d.charAt(c++)]),m+=64===b?X(l>>16&255):64===G?X(l>>16&255,l>>8&255):X(l>>16&255,l>>8&255,255&l);return m},I=d?d=>atob(m(d)):l?d=>Buffer.from(d,"base64").toString("binary"):p,V=l?d=>G(Buffer.from(d,"base64")):d=>G(I(d).split("").map((d=>d.charCodeAt(0)))),h=l?d=>Buffer.from(d,"base64").toString("utf8"):b?d=>b.decode(V(d)):d=>W(I(d)),i=d=>m(d.replace(/[-_]/g,(d=>"-"==d?"+":"/"))),u=d=>h(i(d)),H=u;var s={};!function(d){var l=Object.prototype.hasOwnProperty,b="~";function Z(){}function c(d,l,b){this.fn=d,this.context=l,this.once=b||!1}function X(d,l,Z,X,G){if("function"!=typeof Z)throw new TypeError("The listener must be a function");var m=new c(Z,X||d,G),y=b?b+l:l;return d._events[y]?d._events[y].fn?d._events[y]=[d._events[y],m]:d._events[y].push(m):(d._events[y]=m,d._eventsCount++),d}function G(d,l){0==--d._eventsCount?d._events=new Z:delete d._events[l]}function m(){this._events=new Z,this._eventsCount=0}Object.create&&(Z.prototype=Object.create(null),(new Z).__proto__||(b=!1)),m.prototype.eventNames=function(){var d,Z,c=[];if(0===this._eventsCount)return c;for(Z in d=this._events)l.call(d,Z)&&c.push(b?Z.slice(1):Z);return Object.getOwnPropertySymbols?c.concat(Object.getOwnPropertySymbols(d)):c},m.prototype.listeners=function(d){var l=b?b+d:d,Z=this._events[l];if(!Z)return[];if(Z.fn)return[Z.fn];for(var c=0,X=Z.length,G=new Array(X);c<X;c++)G[c]=Z[c].fn;return G},m.prototype.listenerCount=function(d){var l=b?b+d:d,Z=this._events[l];return Z?Z.fn?1:Z.length:0},m.prototype.emit=function(d,l,Z,c,X,G){var m=b?b+d:d;if(!this._events[m])return!1;var y,K,W=this._events[m],p=arguments.length;if(W.fn){switch(W.once&&this.removeListener(d,W.fn,void 0,!0),p){case 1:return W.fn.call(W.context),!0;case 2:return W.fn.call(W.context,l),!0;case 3:return W.fn.call(W.context,l,Z),!0;case 4:return W.fn.call(W.context,l,Z,c),!0;case 5:return W.fn.call(W.context,l,Z,c,X),!0;case 6:return W.fn.call(W.context,l,Z,c,X,G),!0}for(K=1,y=new Array(p-1);K<p;K++)y[K-1]=arguments[K];W.fn.apply(W.context,y)}else{var I,V=W.length;for(K=0;K<V;K++)switch(W[K].once&&this.removeListener(d,W[K].fn,void 0,!0),p){case 1:W[K].fn.call(W[K].context);break;case 2:W[K].fn.call(W[K].context,l);break;case 3:W[K].fn.call(W[K].context,l,Z);break;case 4:W[K].fn.call(W[K].context,l,Z,c);break;default:if(!y)for(I=1,y=new Array(p-1);I<p;I++)y[I-1]=arguments[I];W[K].fn.apply(W[K].context,y)}}return!0},m.prototype.on=function(d,l,b){return X(this,d,l,b,!1)},m.prototype.once=function(d,l,b){return X(this,d,l,b,!0)},m.prototype.removeListener=function(d,l,Z,c){var X=b?b+d:d;if(!this._events[X])return this;if(!l)return G(this,X),this;var m=this._events[X];if(m.fn)m.fn!==l||c&&!m.once||Z&&m.context!==Z||G(this,X);else{for(var y=0,K=[],W=m.length;y<W;y++)(m[y].fn!==l||c&&!m[y].once||Z&&m[y].context!==Z)&&K.push(m[y]);K.length?this._events[X]=1===K.length?K[0]:K:G(this,X)}return this},m.prototype.removeAllListeners=function(d){var l;return d?(l=b?b+d:d,this._events[l]&&G(this,l)):(this._events=new Z,this._eventsCount=0),this},m.prototype.off=m.prototype.removeListener,m.prototype.addListener=m.prototype.on,m.prefixed=b,m.EventEmitter=m,d.exports=m}({get exports(){return s},set exports(d){s=d}});var L=s;let C;return function(){if("browser"!=("undefined"!=typeof window&&void 0!==window.document?"browser":"nodejs"))return null;function d(){return new L}function l(){let d,l,b=new Promise((function(){d=arguments[0],l=arguments[1]}));return b.resolve=d,b.reject=l,b}function b(){let d=arguments.length>0&&void 0!==arguments[0]?arguments[0]:10,l=[],b="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""),Z=b.length;for(let c=0;c<d;c++)l[c]=b[0|Math.random()*Z];return l.join("")}let Z=H("CgoKdmFyIHQ9InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWxUaGlzP2dsb2JhbFRoaXM6InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OiJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsP2dsb2JhbDoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjp7fTtmdW5jdGlvbiBlKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGUmJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCJkZWZhdWx0Iik/dC5kZWZhdWx0OnR9dmFyIHI9QXJyYXkuaXNBcnJheSxuPSJvYmplY3QiPT10eXBlb2YgdCYmdCYmdC5PYmplY3Q9PT1PYmplY3QmJnQsbz1uLHM9Im9iamVjdCI9PXR5cGVvZiBzZWxmJiZzZWxmJiZzZWxmLk9iamVjdD09PU9iamVjdCYmc2VsZixpPW98fHN8fEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCksdT1pLlN5bWJvbCxhPXUsbD1PYmplY3QucHJvdG90eXBlLGg9bC5oYXNPd25Qcm9wZXJ0eSxjPWwudG9TdHJpbmcsZj1hP2EudG9TdHJpbmdUYWc6dm9pZCAwO3ZhciBtPWZ1bmN0aW9uKHQpe3ZhciBlPWguY2FsbCh0LGYpLHI9dFtmXTt0cnl7dFtmXT12b2lkIDA7dmFyIG49ITB9Y2F0Y2godCl7fXZhciBvPWMuY2FsbCh0KTtyZXR1cm4gbiYmKGU/dFtmXT1yOmRlbGV0ZSB0W2ZdKSxvfSxnPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7dmFyIHA9bSx3PWZ1bmN0aW9uKHQpe3JldHVybiBnLmNhbGwodCl9LGQ9dT91LnRvU3RyaW5nVGFnOnZvaWQgMDt2YXIgYj1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD92b2lkIDA9PT10PyJbb2JqZWN0IFVuZGVmaW5lZF0iOiJbb2JqZWN0IE51bGxdIjpkJiZkIGluIE9iamVjdCh0KT9wKHQpOncodCl9O3ZhciB5PWZ1bmN0aW9uKHQpe3JldHVybiBudWxsIT10JiYib2JqZWN0Ij09dHlwZW9mIHR9LHY9YixNPXk7dmFyIGo9ZnVuY3Rpb24odCl7cmV0dXJuInN5bWJvbCI9PXR5cGVvZiB0fHxNKHQpJiYiW29iamVjdCBTeW1ib2xdIj09dih0KX0seD1yLF89aixFPS9cLnxcWyg/OlteW1xdXSp8KFsiJ10pKD86KD8hXDEpW15cXF18XFwuKSo/XDEpXF0vLFM9L15cdyokLzt2YXIgTz1mdW5jdGlvbih0LGUpe2lmKHgodCkpcmV0dXJuITE7dmFyIHI9dHlwZW9mIHQ7cmV0dXJuISgibnVtYmVyIiE9ciYmInN5bWJvbCIhPXImJiJib29sZWFuIiE9ciYmbnVsbCE9dCYmIV8odCkpfHwoUy50ZXN0KHQpfHwhRS50ZXN0KHQpfHxudWxsIT1lJiZ0IGluIE9iamVjdChlKSl9O3ZhciBBPWZ1bmN0aW9uKHQpe3ZhciBlPXR5cGVvZiB0O3JldHVybiBudWxsIT10JiYoIm9iamVjdCI9PWV8fCJmdW5jdGlvbiI9PWUpfSxDPWIsUj1BO3ZhciBJLE49ZnVuY3Rpb24odCl7aWYoIVIodCkpcmV0dXJuITE7dmFyIGU9Qyh0KTtyZXR1cm4iW29iamVjdCBGdW5jdGlvbl0iPT1lfHwiW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0iPT1lfHwiW29iamVjdCBBc3luY0Z1bmN0aW9uXSI9PWV8fCJbb2JqZWN0IFByb3h5XSI9PWV9LGs9aVsiX19jb3JlLWpzX3NoYXJlZF9fIl0sRj0oST0vW14uXSskLy5leGVjKGsmJmsua2V5cyYmay5rZXlzLklFX1BST1RPfHwiIikpPyJTeW1ib2woc3JjKV8xLiIrSToiIjt2YXIgUD1mdW5jdGlvbih0KXtyZXR1cm4hIUYmJkYgaW4gdH0sVD1GdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmc7dmFyIHo9ZnVuY3Rpb24odCl7aWYobnVsbCE9dCl7dHJ5e3JldHVybiBULmNhbGwodCl9Y2F0Y2godCl7fXRyeXtyZXR1cm4gdCsiIn1jYXRjaCh0KXt9fXJldHVybiIifSxWPU4sJD1QLHE9QSxEPXosVT0vXlxbb2JqZWN0IC4rP0NvbnN0cnVjdG9yXF0kLyxMPUZ1bmN0aW9uLnByb3RvdHlwZSxCPU9iamVjdC5wcm90b3R5cGUsRz1MLnRvU3RyaW5nLFc9Qi5oYXNPd25Qcm9wZXJ0eSxLPVJlZ0V4cCgiXiIrRy5jYWxsKFcpLnJlcGxhY2UoL1tcXF4kLiorPygpW1xde318XS9nLCJcXCQmIikucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXCgpfCBmb3IgLis/KD89XFxcXSkvZywiJDEuKj8iKSsiJCIpO3ZhciBZPWZ1bmN0aW9uKHQpe3JldHVybiEoIXEodCl8fCQodCkpJiYoVih0KT9LOlUpLnRlc3QoRCh0KSl9LFg9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09dD92b2lkIDA6dFtlXX07dmFyIEo9ZnVuY3Rpb24odCxlKXt2YXIgcj1YKHQsZSk7cmV0dXJuIFkocik/cjp2b2lkIDB9LFo9SihPYmplY3QsImNyZWF0ZSIpLEg9Wjt2YXIgUT1mdW5jdGlvbigpe3RoaXMuX19kYXRhX189SD9IKG51bGwpOnt9LHRoaXMuc2l6ZT0wfTt2YXIgdHQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5oYXModCkmJmRlbGV0ZSB0aGlzLl9fZGF0YV9fW3RdO3JldHVybiB0aGlzLnNpemUtPWU/MTowLGV9LGV0PVoscnQ9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt2YXIgbnQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXztpZihldCl7dmFyIHI9ZVt0XTtyZXR1cm4iX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyI9PT1yP3ZvaWQgMDpyfXJldHVybiBydC5jYWxsKGUsdCk/ZVt0XTp2b2lkIDB9LG90PVosc3Q9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt2YXIgaXQ9Wjt2YXIgdXQ9USxhdD10dCxsdD1udCxodD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fO3JldHVybiBvdD92b2lkIDAhPT1lW3RdOnN0LmNhbGwoZSx0KX0sY3Q9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLl9fZGF0YV9fO3JldHVybiB0aGlzLnNpemUrPXRoaXMuaGFzKHQpPzA6MSxyW3RdPWl0JiZ2b2lkIDA9PT1lPyJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIjplLHRoaXN9O2Z1bmN0aW9uIGZ0KHQpe3ZhciBlPS0xLHI9bnVsbD09dD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPHI7KXt2YXIgbj10W2VdO3RoaXMuc2V0KG5bMF0sblsxXSl9fWZ0LnByb3RvdHlwZS5jbGVhcj11dCxmdC5wcm90b3R5cGUuZGVsZXRlPWF0LGZ0LnByb3RvdHlwZS5nZXQ9bHQsZnQucHJvdG90eXBlLmhhcz1odCxmdC5wcm90b3R5cGUuc2V0PWN0O3ZhciBtdD1mdDt2YXIgZ3Q9ZnVuY3Rpb24oKXt0aGlzLl9fZGF0YV9fPVtdLHRoaXMuc2l6ZT0wfTt2YXIgcHQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD09PWV8fHQhPXQmJmUhPWV9LHd0PXB0O3ZhciBkdD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj10Lmxlbmd0aDtyLS07KWlmKHd0KHRbcl1bMF0sZSkpcmV0dXJuIHI7cmV0dXJuLTF9LGJ0PWR0LHl0PUFycmF5LnByb3RvdHlwZS5zcGxpY2U7dmFyIHZ0PWR0O3ZhciBNdD1kdDt2YXIganQ9ZHQ7dmFyIHh0PWd0LF90PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX19kYXRhX18scj1idChlLHQpO3JldHVybiEocjwwKSYmKHI9PWUubGVuZ3RoLTE/ZS5wb3AoKTp5dC5jYWxsKGUsciwxKSwtLXRoaXMuc2l6ZSwhMCl9LEV0PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX19kYXRhX18scj12dChlLHQpO3JldHVybiByPDA/dm9pZCAwOmVbcl1bMV19LFN0PWZ1bmN0aW9uKHQpe3JldHVybiBNdCh0aGlzLl9fZGF0YV9fLHQpPi0xfSxPdD1mdW5jdGlvbih0LGUpe3ZhciByPXRoaXMuX19kYXRhX18sbj1qdChyLHQpO3JldHVybiBuPDA/KCsrdGhpcy5zaXplLHIucHVzaChbdCxlXSkpOnJbbl1bMV09ZSx0aGlzfTtmdW5jdGlvbiBBdCh0KXt2YXIgZT0tMSxyPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxyOyl7dmFyIG49dFtlXTt0aGlzLnNldChuWzBdLG5bMV0pfX1BdC5wcm90b3R5cGUuY2xlYXI9eHQsQXQucHJvdG90eXBlLmRlbGV0ZT1fdCxBdC5wcm90b3R5cGUuZ2V0PUV0LEF0LnByb3RvdHlwZS5oYXM9U3QsQXQucHJvdG90eXBlLnNldD1PdDt2YXIgQ3Q9QXQsUnQ9SihpLCJNYXAiKSxJdD1tdCxOdD1DdCxrdD1SdDt2YXIgRnQ9ZnVuY3Rpb24odCl7dmFyIGU9dHlwZW9mIHQ7cmV0dXJuInN0cmluZyI9PWV8fCJudW1iZXIiPT1lfHwic3ltYm9sIj09ZXx8ImJvb2xlYW4iPT1lPyJfX3Byb3RvX18iIT09dDpudWxsPT09dH07dmFyIFB0PWZ1bmN0aW9uKHQsZSl7dmFyIHI9dC5fX2RhdGFfXztyZXR1cm4gRnQoZSk/clsic3RyaW5nIj09dHlwZW9mIGU/InN0cmluZyI6Imhhc2giXTpyLm1hcH0sVHQ9UHQ7dmFyIHp0PVB0O3ZhciBWdD1QdDt2YXIgJHQ9UHQ7dmFyIHF0PWZ1bmN0aW9uKHQsZSl7dmFyIHI9JHQodGhpcyx0KSxuPXIuc2l6ZTtyZXR1cm4gci5zZXQodCxlKSx0aGlzLnNpemUrPXIuc2l6ZT09bj8wOjEsdGhpc30sRHQ9ZnVuY3Rpb24oKXt0aGlzLnNpemU9MCx0aGlzLl9fZGF0YV9fPXtoYXNoOm5ldyBJdCxtYXA6bmV3KGt0fHxOdCksc3RyaW5nOm5ldyBJdH19LFV0PWZ1bmN0aW9uKHQpe3ZhciBlPVR0KHRoaXMsdCkuZGVsZXRlKHQpO3JldHVybiB0aGlzLnNpemUtPWU/MTowLGV9LEx0PWZ1bmN0aW9uKHQpe3JldHVybiB6dCh0aGlzLHQpLmdldCh0KX0sQnQ9ZnVuY3Rpb24odCl7cmV0dXJuIFZ0KHRoaXMsdCkuaGFzKHQpfSxHdD1xdDtmdW5jdGlvbiBXdCh0KXt2YXIgZT0tMSxyPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxyOyl7dmFyIG49dFtlXTt0aGlzLnNldChuWzBdLG5bMV0pfX1XdC5wcm90b3R5cGUuY2xlYXI9RHQsV3QucHJvdG90eXBlLmRlbGV0ZT1VdCxXdC5wcm90b3R5cGUuZ2V0PUx0LFd0LnByb3RvdHlwZS5oYXM9QnQsV3QucHJvdG90eXBlLnNldD1HdDt2YXIgS3Q9V3QsWXQ9S3Q7ZnVuY3Rpb24gWHQodCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdHx8bnVsbCE9ZSYmImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigiRXhwZWN0ZWQgYSBmdW5jdGlvbiIpO3ZhciByPWZ1bmN0aW9uKCl7dmFyIG49YXJndW1lbnRzLG89ZT9lLmFwcGx5KHRoaXMsbik6blswXSxzPXIuY2FjaGU7aWYocy5oYXMobykpcmV0dXJuIHMuZ2V0KG8pO3ZhciBpPXQuYXBwbHkodGhpcyxuKTtyZXR1cm4gci5jYWNoZT1zLnNldChvLGkpfHxzLGl9O3JldHVybiByLmNhY2hlPW5ldyhYdC5DYWNoZXx8WXQpLHJ9WHQuQ2FjaGU9WXQ7dmFyIEp0PVh0O3ZhciBadD1mdW5jdGlvbih0KXt2YXIgZT1KdCh0LChmdW5jdGlvbih0KXtyZXR1cm4gNTAwPT09ci5zaXplJiZyLmNsZWFyKCksdH0pKSxyPWUuY2FjaGU7cmV0dXJuIGV9LEh0PS9bXi5bXF1dK3xcWyg/OigtP1xkKyg/OlwuXGQrKT8pfChbIiddKSgoPzooPyFcMilbXlxcXXxcXC4pKj8pXDIpXF18KD89KD86XC58XFtcXSkoPzpcLnxcW1xdfCQpKS9nLFF0PS9cXChcXCk/L2csdGU9WnQoKGZ1bmN0aW9uKHQpe3ZhciBlPVtdO3JldHVybiA0Nj09PXQuY2hhckNvZGVBdCgwKSYmZS5wdXNoKCIiKSx0LnJlcGxhY2UoSHQsKGZ1bmN0aW9uKHQscixuLG8pe2UucHVzaChuP28ucmVwbGFjZShRdCwiJDEiKTpyfHx0KX0pKSxlfSkpO3ZhciBlZT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj0tMSxuPW51bGw9PXQ/MDp0Lmxlbmd0aCxvPUFycmF5KG4pOysrcjxuOylvW3JdPWUodFtyXSxyLHQpO3JldHVybiBvfSxyZT1lZSxuZT1yLG9lPWosc2U9dT91LnByb3RvdHlwZTp2b2lkIDAsaWU9c2U/c2UudG9TdHJpbmc6dm9pZCAwO3ZhciB1ZT1mdW5jdGlvbiB0KGUpe2lmKCJzdHJpbmciPT10eXBlb2YgZSlyZXR1cm4gZTtpZihuZShlKSlyZXR1cm4gcmUoZSx0KSsiIjtpZihvZShlKSlyZXR1cm4gaWU/aWUuY2FsbChlKToiIjt2YXIgcj1lKyIiO3JldHVybiIwIj09ciYmMS9lPT0tSW5maW5pdHk/Ii0wIjpyfSxhZT11ZTt2YXIgbGU9cixoZT1PLGNlPXRlLGZlPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10PyIiOmFlKHQpfTt2YXIgbWU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbGUodCk/dDpoZSh0LGUpP1t0XTpjZShmZSh0KSl9LGdlPWo7dmFyIHBlPWZ1bmN0aW9uKHQpe2lmKCJzdHJpbmciPT10eXBlb2YgdHx8Z2UodCkpcmV0dXJuIHQ7dmFyIGU9dCsiIjtyZXR1cm4iMCI9PWUmJjEvdD09LUluZmluaXR5PyItMCI6ZX0sd2U9bWUsZGU9cGU7dmFyIGJlPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPTAsbj0oZT13ZShlLHQpKS5sZW5ndGg7bnVsbCE9dCYmcjxuOyl0PXRbZGUoZVtyKytdKV07cmV0dXJuIHImJnI9PW4/dDp2b2lkIDB9LHllPWJlO3ZhciB2ZT1mdW5jdGlvbih0LGUscil7dmFyIG49bnVsbD09dD92b2lkIDA6eWUodCxlKTtyZXR1cm4gdm9pZCAwPT09bj9yOm59LE1lPU9iamVjdC5wcm90b3R5cGU7dmFyIGplPWZ1bmN0aW9uKHQpe3ZhciBlPXQmJnQuY29uc3RydWN0b3I7cmV0dXJuIHQ9PT0oImZ1bmN0aW9uIj09dHlwZW9mIGUmJmUucHJvdG90eXBlfHxNZSl9O3ZhciB4ZT1mdW5jdGlvbih0LGUpe3JldHVybiBmdW5jdGlvbihyKXtyZXR1cm4gdChlKHIpKX19LF9lPXhlKE9iamVjdC5rZXlzLE9iamVjdCksRWU9amUsU2U9X2UsT2U9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt2YXIgQWU9ZnVuY3Rpb24odCl7aWYoIUVlKHQpKXJldHVybiBTZSh0KTt2YXIgZT1bXTtmb3IodmFyIHIgaW4gT2JqZWN0KHQpKU9lLmNhbGwodCxyKSYmImNvbnN0cnVjdG9yIiE9ciYmZS5wdXNoKHIpO3JldHVybiBlfSxDZT1KKGksIkRhdGFWaWV3IiksUmU9UnQsSWU9SihpLCJQcm9taXNlIiksTmU9SihpLCJTZXQiKSxrZT1KKGksIldlYWtNYXAiKSxGZT1iLFBlPXosVGU9IltvYmplY3QgTWFwXSIsemU9IltvYmplY3QgUHJvbWlzZV0iLFZlPSJbb2JqZWN0IFNldF0iLCRlPSJbb2JqZWN0IFdlYWtNYXBdIixxZT0iW29iamVjdCBEYXRhVmlld10iLERlPVBlKENlKSxVZT1QZShSZSksTGU9UGUoSWUpLEJlPVBlKE5lKSxHZT1QZShrZSksV2U9RmU7KENlJiZXZShuZXcgQ2UobmV3IEFycmF5QnVmZmVyKDEpKSkhPXFlfHxSZSYmV2UobmV3IFJlKSE9VGV8fEllJiZXZShJZS5yZXNvbHZlKCkpIT16ZXx8TmUmJldlKG5ldyBOZSkhPVZlfHxrZSYmV2UobmV3IGtlKSE9JGUpJiYoV2U9ZnVuY3Rpb24odCl7dmFyIGU9RmUodCkscj0iW29iamVjdCBPYmplY3RdIj09ZT90LmNvbnN0cnVjdG9yOnZvaWQgMCxuPXI/UGUocik6IiI7aWYobilzd2l0Y2gobil7Y2FzZSBEZTpyZXR1cm4gcWU7Y2FzZSBVZTpyZXR1cm4gVGU7Y2FzZSBMZTpyZXR1cm4gemU7Y2FzZSBCZTpyZXR1cm4gVmU7Y2FzZSBHZTpyZXR1cm4gJGV9cmV0dXJuIGV9KTt2YXIgS2U9V2U7dmFyIFllPWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdCYmdD4tMSYmdCUxPT0wJiZ0PD05MDA3MTk5MjU0NzQwOTkxfSxYZT1OLEplPVllO3ZhciBaZT1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dCYmSmUodC5sZW5ndGgpJiYhWGUodCl9LEhlPWIsUWU9cix0cj15O3ZhciBlcj1mdW5jdGlvbih0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHR8fCFRZSh0KSYmdHIodCkmJiJbb2JqZWN0IFN0cmluZ10iPT1IZSh0KX07dmFyIHJyPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZT92b2lkIDA6ZVt0XX19LG5yPXJyKCJsZW5ndGgiKSxvcj1SZWdFeHAoIltcXHUyMDBkXFx1ZDgwMC1cXHVkZmZmXFx1MDMwMC1cXHUwMzZmXFx1ZmUyMC1cXHVmZTJmXFx1MjBkMC1cXHUyMGZmXFx1ZmUwZVxcdWZlMGZdIik7dmFyIHNyPWZ1bmN0aW9uKHQpe3JldHVybiBvci50ZXN0KHQpfSxpcj0iXFx1ZDgwMC1cXHVkZmZmIix1cj0iWyIraXIrIl0iLGFyPSJbXFx1MDMwMC1cXHUwMzZmXFx1ZmUyMC1cXHVmZTJmXFx1MjBkMC1cXHUyMGZmXSIsbHI9IlxcdWQ4M2NbXFx1ZGZmYi1cXHVkZmZmXSIsaHI9IlteIitpcisiXSIsY3I9Iig/OlxcdWQ4M2NbXFx1ZGRlNi1cXHVkZGZmXSl7Mn0iLGZyPSJbXFx1ZDgwMC1cXHVkYmZmXVtcXHVkYzAwLVxcdWRmZmZdIixtcj0iKD86IithcisifCIrbHIrIikiKyI/Iixncj0iW1xcdWZlMGVcXHVmZTBmXT8iLHByPWdyK21yKygiKD86XFx1MjAwZCg/OiIrW2hyLGNyLGZyXS5qb2luKCJ8IikrIikiK2dyK21yKyIpKiIpLHdyPSIoPzoiK1tocithcisiPyIsYXIsY3IsZnIsdXJdLmpvaW4oInwiKSsiKSIsZHI9UmVnRXhwKGxyKyIoPz0iK2xyKyIpfCIrd3IrcHIsImciKTt2YXIgYnI9bnIseXI9c3IsdnI9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPWRyLmxhc3RJbmRleD0wO2RyLnRlc3QodCk7KSsrZTtyZXR1cm4gZX07dmFyIE1yPUFlLGpyPUtlLHhyPVplLF9yPWVyLEVyPWZ1bmN0aW9uKHQpe3JldHVybiB5cih0KT92cih0KTpicih0KX07dmFyIFNyPWZ1bmN0aW9uKHQpe2lmKG51bGw9PXQpcmV0dXJuIDA7aWYoeHIodCkpcmV0dXJuIF9yKHQpP0VyKHQpOnQubGVuZ3RoO3ZhciBlPWpyKHQpO3JldHVybiJbb2JqZWN0IE1hcF0iPT1lfHwiW29iamVjdCBTZXRdIj09ZT90LnNpemU6TXIodCkubGVuZ3RofTtmdW5jdGlvbiBPcih0KXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWZ1bmN0aW9uIEFyKHQpe3JldHVybiJbb2JqZWN0IE9iamVjdF0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWZ1bmN0aW9uIENyKHQpe3JldHVybiJbb2JqZWN0IFN0cmluZ10iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWZ1bmN0aW9uIFJyKHQpe3JldHVybiB0IT10fWZ1bmN0aW9uIElyKHQpe3JldHVybiEhZnVuY3Rpb24odCl7cmV0dXJuIltvYmplY3QgVW5kZWZpbmVkXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9KHQpfHwoISFmdW5jdGlvbih0KXtyZXR1cm4iW29iamVjdCBOdWxsXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9KHQpfHwoISFmdW5jdGlvbih0KXtpZihBcih0KSl7Zm9yKGxldCBlIGluIHQpcmV0dXJuITE7cmV0dXJuITB9cmV0dXJuITF9KHQpfHwoISFmdW5jdGlvbih0KXtyZXR1cm4hKCFDcih0KXx8IiIhPT10KX0odCl8fCghIWZ1bmN0aW9uKHQpe3JldHVybiEhT3IodCkmJjA9PT10Lmxlbmd0aH0odCl8fCEhUnIodCkpKSkpfWZ1bmN0aW9uIE5yKHQpe3JldHVybiEhT3IodCkmJigwIT09dC5sZW5ndGgmJigxIT09dC5sZW5ndGh8fCFJcih0WzBdKSkpfXZhciBrcj0ib2JqZWN0Ij09dHlwZW9mIGdsb2JhbCYmZ2xvYmFsJiZnbG9iYWwuT2JqZWN0PT09T2JqZWN0JiZnbG9iYWwsRnI9Im9iamVjdCI9PXR5cGVvZiBzZWxmJiZzZWxmJiZzZWxmLk9iamVjdD09PU9iamVjdCYmc2VsZixQcj1rcnx8RnJ8fEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCksVHI9UHIuU3ltYm9sLHpyPU9iamVjdC5wcm90b3R5cGUsVnI9enIuaGFzT3duUHJvcGVydHksJHI9enIudG9TdHJpbmcscXI9VHI/VHIudG9TdHJpbmdUYWc6dm9pZCAwO3ZhciBEcj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO3ZhciBVcj0iW29iamVjdCBOdWxsXSIsTHI9IltvYmplY3QgVW5kZWZpbmVkXSIsQnI9VHI/VHIudG9TdHJpbmdUYWc6dm9pZCAwO2Z1bmN0aW9uIEdyKHQpe3JldHVybiBudWxsPT10P3ZvaWQgMD09PXQ/THI6VXI6QnImJkJyIGluIE9iamVjdCh0KT9mdW5jdGlvbih0KXt2YXIgZT1Wci5jYWxsKHQscXIpLHI9dFtxcl07dHJ5e3RbcXJdPXZvaWQgMDt2YXIgbj0hMH1jYXRjaCh0KXt9dmFyIG89JHIuY2FsbCh0KTtyZXR1cm4gbiYmKGU/dFtxcl09cjpkZWxldGUgdFtxcl0pLG99KHQpOmZ1bmN0aW9uKHQpe3JldHVybiBEci5jYWxsKHQpfSh0KX1mdW5jdGlvbiBXcih0KXtyZXR1cm4gbnVsbCE9dCYmIm9iamVjdCI9PXR5cGVvZiB0fXZhciBLcj0iW29iamVjdCBCb29sZWFuXSI7ZnVuY3Rpb24gWXIodCl7cmV0dXJuITA9PT0oZT10KXx8ITE9PT1lfHxXcihlKSYmR3IoZSk9PUtyO3ZhciBlfWZ1bmN0aW9uIFhyKHQpe3JldHVybiEoIUNyKHQpfHwiIj09PXQpfWZ1bmN0aW9uIEpyKHQpe2xldCBlPSExO2lmKFhyKHQpKWU9IWlzTmFOKE51bWJlcih0KSk7ZWxzZSBpZihmdW5jdGlvbih0KXtyZXR1cm4iW29iamVjdCBOdW1iZXJdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX0odCkpe2lmKFJyKHQpKXJldHVybiExO2U9ITB9cmV0dXJuIGV9dmFyIFpyPS9ccy87dmFyIEhyPS9eXHMrLztmdW5jdGlvbiBRcih0KXtyZXR1cm4gdD90LnNsaWNlKDAsZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQubGVuZ3RoO2UtLSYmWnIudGVzdCh0LmNoYXJBdChlKSk7KTtyZXR1cm4gZX0odCkrMSkucmVwbGFjZShIciwiIik6dH1mdW5jdGlvbiB0bih0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4gbnVsbCE9dCYmKCJvYmplY3QiPT1lfHwiZnVuY3Rpb24iPT1lKX12YXIgZW49IltvYmplY3QgU3ltYm9sXSI7ZnVuY3Rpb24gcm4odCl7cmV0dXJuInN5bWJvbCI9PXR5cGVvZiB0fHxXcih0KSYmR3IodCk9PWVufXZhciBubj1OYU4sb249L15bLStdMHhbMC05YS1mXSskL2ksc249L14wYlswMV0rJC9pLHVuPS9eMG9bMC03XSskL2ksYW49cGFyc2VJbnQ7ZnVuY3Rpb24gbG4odCl7aWYoIm51bWJlciI9PXR5cGVvZiB0KXJldHVybiB0O2lmKHJuKHQpKXJldHVybiBubjtpZih0bih0KSl7dmFyIGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQudmFsdWVPZj90LnZhbHVlT2YoKTp0O3Q9dG4oZSk/ZSsiIjplfWlmKCJzdHJpbmciIT10eXBlb2YgdClyZXR1cm4gMD09PXQ/dDordDt0PVFyKHQpO3ZhciByPXNuLnRlc3QodCk7cmV0dXJuIHJ8fHVuLnRlc3QodCk/YW4odC5zbGljZSgyKSxyPzI6OCk6b24udGVzdCh0KT9ubjordH12YXIgaG49MS8wLGNuPTE3OTc2OTMxMzQ4NjIzMTU3ZTI5MjtmdW5jdGlvbiBmbih0KXtyZXR1cm4gdD8odD1sbih0KSk9PT1obnx8dD09PS1obj8odDwwPy0xOjEpKmNuOnQ9PXQ/dDowOjA9PT10P3Q6MH12YXIgbW49QXJyYXkuaXNBcnJheSxnbj0xLzAscG49VHI/VHIucHJvdG90eXBlOnZvaWQgMCx3bj1wbj9wbi50b1N0cmluZzp2b2lkIDA7ZnVuY3Rpb24gZG4odCl7aWYoInN0cmluZyI9PXR5cGVvZiB0KXJldHVybiB0O2lmKG1uKHQpKXJldHVybiBmdW5jdGlvbih0LGUpe2Zvcih2YXIgcj0tMSxuPW51bGw9PXQ/MDp0Lmxlbmd0aCxvPUFycmF5KG4pOysrcjxuOylvW3JdPWUodFtyXSxyLHQpO3JldHVybiBvfSh0LGRuKSsiIjtpZihybih0KSlyZXR1cm4gd24/d24uY2FsbCh0KToiIjt2YXIgZT10KyIiO3JldHVybiIwIj09ZSYmMS90PT0tZ24/Ii0wIjplfWZ1bmN0aW9uIGJuKHQpe3JldHVybiBudWxsPT10PyIiOmRuKHQpfXZhciB5bj1Qci5pc0Zpbml0ZSx2bj1NYXRoLm1pbjt2YXIgTW4sam49KE1uPU1hdGhbInJvdW5kIl0sZnVuY3Rpb24odCxlKXtpZih0PWxuKHQpLGU9bnVsbD09ZT8wOnZuKGZ1bmN0aW9uKHQpe3ZhciBlPWZuKHQpLHI9ZSUxO3JldHVybiBlPT1lP3I/ZS1yOmU6MH0oZSksMjkyKSxlJiZ5bih0KSl7dmFyIHI9KGJuKHQpKyJlIikuc3BsaXQoImUiKTtyZXR1cm4rKChyPShibihNbihyWzBdKyJlIisoK3JbMV0rZSkpKSsiZSIpLnNwbGl0KCJlIikpWzBdKyJlIisoK3JbMV0tZSkpfXJldHVybiBNbih0KX0pO2Z1bmN0aW9uIHhuKHQpe2lmKCFKcih0KSlyZXR1cm4gMDt0PWZ1bmN0aW9uKHQpe3JldHVybiBKcih0KT9mbih0KTowfSh0KTtsZXQgZT1qbih0KTtyZXR1cm4iMCI9PT1TdHJpbmcoZSk/MDplfWNvbnN0IF9uPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7ZnVuY3Rpb24gRW4odCl7cmV0dXJuIF9uLmNhbGwodCkuZW5kc1dpdGgoIkFycmF5XSIpfWZ1bmN0aW9uIFNuKHQpe3ZhciBlLHI9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9O2lmKCFFbih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJpbnB1dCBtdXN0IGJlIGFuIGFycmF5Iik7aWYoMD09PXQubGVuZ3RoKXRocm93IG5ldyBUeXBlRXJyb3IoImlucHV0IG11c3Qgbm90IGJlIGVtcHR5Iik7aWYodm9pZCAwIT09ci5vdXRwdXQpe2lmKCFFbihyLm91dHB1dCkpdGhyb3cgbmV3IFR5cGVFcnJvcigib3V0cHV0IG9wdGlvbiBtdXN0IGJlIGFuIGFycmF5IGlmIHNwZWNpZmllZCIpO2U9ci5vdXRwdXR9ZWxzZSBlPW5ldyBBcnJheSh0Lmxlbmd0aCk7dmFyIG49ZnVuY3Rpb24odCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9O2lmKCFFbih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJpbnB1dCBtdXN0IGJlIGFuIGFycmF5Iik7aWYoMD09PXQubGVuZ3RoKXRocm93IG5ldyBUeXBlRXJyb3IoImlucHV0IG11c3Qgbm90IGJlIGVtcHR5Iik7dmFyIHI9ZS5mcm9tSW5kZXgsbj12b2lkIDA9PT1yPzA6cixvPWUudG9JbmRleCxzPXZvaWQgMD09PW8/dC5sZW5ndGg6bztpZihuPDB8fG4+PXQubGVuZ3RofHwhTnVtYmVyLmlzSW50ZWdlcihuKSl0aHJvdyBuZXcgRXJyb3IoImZyb21JbmRleCBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciBzbWFsbGVyIHRoYW4gbGVuZ3RoIik7aWYoczw9bnx8cz50Lmxlbmd0aHx8IU51bWJlci5pc0ludGVnZXIocykpdGhyb3cgbmV3IEVycm9yKCJ0b0luZGV4IG11c3QgYmUgYW4gaW50ZWdlciBncmVhdGVyIHRoYW4gZnJvbUluZGV4IGFuZCBhdCBtb3N0IGVxdWFsIHRvIGxlbmd0aCIpO2Zvcih2YXIgaT10W25dLHU9bisxO3U8czt1KyspdFt1XTxpJiYoaT10W3VdKTtyZXR1cm4gaX0odCksbz1mdW5jdGlvbih0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e307aWYoIUVuKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoImlucHV0IG11c3QgYmUgYW4gYXJyYXkiKTtpZigwPT09dC5sZW5ndGgpdGhyb3cgbmV3IFR5cGVFcnJvcigiaW5wdXQgbXVzdCBub3QgYmUgZW1wdHkiKTt2YXIgcj1lLmZyb21JbmRleCxuPXZvaWQgMD09PXI/MDpyLG89ZS50b0luZGV4LHM9dm9pZCAwPT09bz90Lmxlbmd0aDpvO2lmKG48MHx8bj49dC5sZW5ndGh8fCFOdW1iZXIuaXNJbnRlZ2VyKG4pKXRocm93IG5ldyBFcnJvcigiZnJvbUluZGV4IG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIHNtYWxsZXIgdGhhbiBsZW5ndGgiKTtpZihzPD1ufHxzPnQubGVuZ3RofHwhTnVtYmVyLmlzSW50ZWdlcihzKSl0aHJvdyBuZXcgRXJyb3IoInRvSW5kZXggbXVzdCBiZSBhbiBpbnRlZ2VyIGdyZWF0ZXIgdGhhbiBmcm9tSW5kZXggYW5kIGF0IG1vc3QgZXF1YWwgdG8gbGVuZ3RoIik7Zm9yKHZhciBpPXRbbl0sdT1uKzE7dTxzO3UrKyl0W3VdPmkmJihpPXRbdV0pO3JldHVybiBpfSh0KTtpZihuPT09byl0aHJvdyBuZXcgUmFuZ2VFcnJvcigibWluaW11bSBhbmQgbWF4aW11bSBpbnB1dCB2YWx1ZXMgYXJlIGVxdWFsLiBDYW5ub3QgcmVzY2FsZSBhIGNvbnN0YW50IGFycmF5Iik7dmFyIHM9ci5taW4saT12b2lkIDA9PT1zP3IuYXV0b01pbk1heD9uOjA6cyx1PXIubWF4LGE9dm9pZCAwPT09dT9yLmF1dG9NaW5NYXg/bzoxOnU7aWYoaT49YSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigibWluIG9wdGlvbiBtdXN0IGJlIHNtYWxsZXIgdGhhbiBtYXggb3B0aW9uIik7Zm9yKHZhciBsPShhLWkpLyhvLW4pLGg9MDtoPHQubGVuZ3RoO2grKyllW2hdPSh0W2hdLW4pKmwraTtyZXR1cm4gZX1jb25zdCBPbj0iICIucmVwZWF0KDIpLEFuPSIgIi5yZXBlYXQoNCk7ZnVuY3Rpb24gQ24odCxlPXt9KXtjb25zdHttYXhSb3dzOnI9MTUsbWF4Q29sdW1uczpuPTEwLG1heE51bVNpemU6bz04LHBhZE1pbnVzOnM9ImF1dG8ifT1lO3JldHVybmAke3QuY29uc3RydWN0b3IubmFtZX0ge1xuJHtPbn1bXG4ke0FufSR7ZnVuY3Rpb24odCxlLHIsbixvKXtjb25zdHtyb3dzOnMsY29sdW1uczppfT10LHU9TWF0aC5taW4ocyxlKSxhPU1hdGgubWluKGksciksbD1bXTtpZigiYXV0byI9PT1vKXtvPSExO3Q6Zm9yKGxldCBlPTA7ZTx1O2UrKylmb3IobGV0IHI9MDtyPGE7cisrKWlmKHQuZ2V0KGUscik8MCl7bz0hMDticmVhayB0fX1mb3IobGV0IGU9MDtlPHU7ZSsrKXtsZXQgcj1bXTtmb3IobGV0IHM9MDtzPGE7cysrKXIucHVzaChSbih0LmdldChlLHMpLG4sbykpO2wucHVzaChgJHtyLmpvaW4oIiAiKX1gKX1hIT09aSYmKGxbbC5sZW5ndGgtMV0rPWAgLi4uICR7aS1yfSBtb3JlIGNvbHVtbnNgKTt1IT09cyYmbC5wdXNoKGAuLi4gJHtzLWV9IG1vcmUgcm93c2ApO3JldHVybiBsLmpvaW4oYFxuJHtBbn1gKX0odCxyLG4sbyxzKX1cbiR7T259XVxuJHtPbn1yb3dzOiAke3Qucm93c31cbiR7T259Y29sdW1uczogJHt0LmNvbHVtbnN9XG59YH1mdW5jdGlvbiBSbih0LGUscil7cmV0dXJuKHQ+PTAmJnI/YCAke0luKHQsZS0xKX1gOkluKHQsZSkpLnBhZEVuZChlKX1mdW5jdGlvbiBJbih0LGUpe2xldCByPXQudG9TdHJpbmcoKTtpZihyLmxlbmd0aDw9ZSlyZXR1cm4gcjtsZXQgbj10LnRvRml4ZWQoZSk7aWYobi5sZW5ndGg+ZSYmKG49dC50b0ZpeGVkKE1hdGgubWF4KDAsZS0obi5sZW5ndGgtZSkpKSksbi5sZW5ndGg8PWUmJiFuLnN0YXJ0c1dpdGgoIjAuMDAwIikmJiFuLnN0YXJ0c1dpdGgoIi0wLjAwMCIpKXJldHVybiBuO2xldCBvPXQudG9FeHBvbmVudGlhbChlKTtyZXR1cm4gby5sZW5ndGg+ZSYmKG89dC50b0V4cG9uZW50aWFsKE1hdGgubWF4KDAsZS0oby5sZW5ndGgtZSkpKSksby5zbGljZSgwKX1mdW5jdGlvbiBObih0LGUscil7bGV0IG49cj90LnJvd3M6dC5yb3dzLTE7aWYoZTwwfHxlPm4pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIlJvdyBpbmRleCBvdXQgb2YgcmFuZ2UiKX1mdW5jdGlvbiBrbih0LGUscil7bGV0IG49cj90LmNvbHVtbnM6dC5jb2x1bW5zLTE7aWYoZTwwfHxlPm4pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkNvbHVtbiBpbmRleCBvdXQgb2YgcmFuZ2UiKX1mdW5jdGlvbiBGbih0LGUpe2lmKGUudG8xREFycmF5JiYoZT1lLnRvMURBcnJheSgpKSxlLmxlbmd0aCE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigidmVjdG9yIHNpemUgbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIGNvbHVtbnMiKTtyZXR1cm4gZX1mdW5jdGlvbiBQbih0LGUpe2lmKGUudG8xREFycmF5JiYoZT1lLnRvMURBcnJheSgpKSxlLmxlbmd0aCE9PXQucm93cyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigidmVjdG9yIHNpemUgbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIHJvd3MiKTtyZXR1cm4gZX1mdW5jdGlvbiBUbih0LGUscixuLG8pe2lmKDUhPT1hcmd1bWVudHMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJleHBlY3RlZCA0IGFyZ3VtZW50cyIpO2lmKFZuKCJzdGFydFJvdyIsZSksVm4oImVuZFJvdyIsciksVm4oInN0YXJ0Q29sdW1uIixuKSxWbigiZW5kQ29sdW1uIixvKSxlPnJ8fG4+b3x8ZTwwfHxlPj10LnJvd3N8fHI8MHx8cj49dC5yb3dzfHxuPDB8fG4+PXQuY29sdW1uc3x8bzwwfHxvPj10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIlN1Ym1hdHJpeCBpbmRpY2VzIGFyZSBvdXQgb2YgcmFuZ2UiKX1mdW5jdGlvbiB6bih0LGU9MCl7bGV0IHI9W107Zm9yKGxldCBuPTA7bjx0O24rKylyLnB1c2goZSk7cmV0dXJuIHJ9ZnVuY3Rpb24gVm4odCxlKXtpZigibnVtYmVyIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcihgJHt0fSBtdXN0IGJlIGEgbnVtYmVyYCl9ZnVuY3Rpb24gJG4odCl7aWYodC5pc0VtcHR5KCkpdGhyb3cgbmV3IEVycm9yKCJFbXB0eSBtYXRyaXggaGFzIG5vIGVsZW1lbnRzIHRvIGluZGV4Iil9Y2xhc3MgcW57c3RhdGljIGZyb20xREFycmF5KHQsZSxyKXtpZih0KmUhPT1yLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiZGF0YSBsZW5ndGggZG9lcyBub3QgbWF0Y2ggZ2l2ZW4gZGltZW5zaW9ucyIpO2xldCBuPW5ldyBVbih0LGUpO2ZvcihsZXQgbz0wO288dDtvKyspZm9yKGxldCB0PTA7dDxlO3QrKyluLnNldChvLHQscltvKmUrdF0pO3JldHVybiBufXN0YXRpYyByb3dWZWN0b3IodCl7bGV0IGU9bmV3IFVuKDEsdC5sZW5ndGgpO2ZvcihsZXQgcj0wO3I8dC5sZW5ndGg7cisrKWUuc2V0KDAscix0W3JdKTtyZXR1cm4gZX1zdGF0aWMgY29sdW1uVmVjdG9yKHQpe2xldCBlPW5ldyBVbih0Lmxlbmd0aCwxKTtmb3IobGV0IHI9MDtyPHQubGVuZ3RoO3IrKyllLnNldChyLDAsdFtyXSk7cmV0dXJuIGV9c3RhdGljIHplcm9zKHQsZSl7cmV0dXJuIG5ldyBVbih0LGUpfXN0YXRpYyBvbmVzKHQsZSl7cmV0dXJuIG5ldyBVbih0LGUpLmZpbGwoMSl9c3RhdGljIHJhbmQodCxlLHI9e30pe2lmKCJvYmplY3QiIT10eXBlb2Ygcil0aHJvdyBuZXcgVHlwZUVycm9yKCJvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0Iik7Y29uc3R7cmFuZG9tOm49TWF0aC5yYW5kb219PXI7bGV0IG89bmV3IFVuKHQsZSk7Zm9yKGxldCByPTA7cjx0O3IrKylmb3IobGV0IHQ9MDt0PGU7dCsrKW8uc2V0KHIsdCxuKCkpO3JldHVybiBvfXN0YXRpYyByYW5kSW50KHQsZSxyPXt9KXtpZigib2JqZWN0IiE9dHlwZW9mIHIpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIpO2NvbnN0e21pbjpuPTAsbWF4Om89MWUzLHJhbmRvbTpzPU1hdGgucmFuZG9tfT1yO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKG4pKXRocm93IG5ldyBUeXBlRXJyb3IoIm1pbiBtdXN0IGJlIGFuIGludGVnZXIiKTtpZighTnVtYmVyLmlzSW50ZWdlcihvKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJtYXggbXVzdCBiZSBhbiBpbnRlZ2VyIik7aWYobj49byl0aHJvdyBuZXcgUmFuZ2VFcnJvcigibWluIG11c3QgYmUgc21hbGxlciB0aGFuIG1heCIpO2xldCBpPW8tbix1PW5ldyBVbih0LGUpO2ZvcihsZXQgcj0wO3I8dDtyKyspZm9yKGxldCB0PTA7dDxlO3QrKyl7bGV0IGU9bitNYXRoLnJvdW5kKHMoKSppKTt1LnNldChyLHQsZSl9cmV0dXJuIHV9c3RhdGljIGV5ZSh0LGUscil7dm9pZCAwPT09ZSYmKGU9dCksdm9pZCAwPT09ciYmKHI9MSk7bGV0IG49TWF0aC5taW4odCxlKSxvPXRoaXMuemVyb3ModCxlKTtmb3IobGV0IHQ9MDt0PG47dCsrKW8uc2V0KHQsdCxyKTtyZXR1cm4gb31zdGF0aWMgZGlhZyh0LGUscil7bGV0IG49dC5sZW5ndGg7dm9pZCAwPT09ZSYmKGU9biksdm9pZCAwPT09ciYmKHI9ZSk7bGV0IG89TWF0aC5taW4obixlLHIpLHM9dGhpcy56ZXJvcyhlLHIpO2ZvcihsZXQgZT0wO2U8bztlKyspcy5zZXQoZSxlLHRbZV0pO3JldHVybiBzfXN0YXRpYyBtaW4odCxlKXt0PXRoaXMuY2hlY2tNYXRyaXgodCksZT10aGlzLmNoZWNrTWF0cml4KGUpO2xldCByPXQucm93cyxuPXQuY29sdW1ucyxvPW5ldyBVbihyLG4pO2ZvcihsZXQgcz0wO3M8cjtzKyspZm9yKGxldCByPTA7cjxuO3IrKylvLnNldChzLHIsTWF0aC5taW4odC5nZXQocyxyKSxlLmdldChzLHIpKSk7cmV0dXJuIG99c3RhdGljIG1heCh0LGUpe3Q9dGhpcy5jaGVja01hdHJpeCh0KSxlPXRoaXMuY2hlY2tNYXRyaXgoZSk7bGV0IHI9dC5yb3dzLG49dC5jb2x1bW5zLG89bmV3IHRoaXMocixuKTtmb3IobGV0IHM9MDtzPHI7cysrKWZvcihsZXQgcj0wO3I8bjtyKyspby5zZXQocyxyLE1hdGgubWF4KHQuZ2V0KHMsciksZS5nZXQocyxyKSkpO3JldHVybiBvfXN0YXRpYyBjaGVja01hdHJpeCh0KXtyZXR1cm4gcW4uaXNNYXRyaXgodCk/dDpuZXcgVW4odCl9c3RhdGljIGlzTWF0cml4KHQpe3JldHVybiBudWxsIT10JiYiTWF0cml4Ij09PXQua2xhc3N9Z2V0IHNpemUoKXtyZXR1cm4gdGhpcy5yb3dzKnRoaXMuY29sdW1uc31hcHBseSh0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCJjYWxsYmFjayBtdXN0IGJlIGEgZnVuY3Rpb24iKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXQuY2FsbCh0aGlzLGUscik7cmV0dXJuIHRoaXN9dG8xREFycmF5KCl7bGV0IHQ9W107Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0LnB1c2godGhpcy5nZXQoZSxyKSk7cmV0dXJuIHR9dG8yREFycmF5KCl7bGV0IHQ9W107Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKXt0LnB1c2goW10pO2ZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0W2VdLnB1c2godGhpcy5nZXQoZSxyKSl9cmV0dXJuIHR9dG9KU09OKCl7cmV0dXJuIHRoaXMudG8yREFycmF5KCl9aXNSb3dWZWN0b3IoKXtyZXR1cm4gMT09PXRoaXMucm93c31pc0NvbHVtblZlY3Rvcigpe3JldHVybiAxPT09dGhpcy5jb2x1bW5zfWlzVmVjdG9yKCl7cmV0dXJuIDE9PT10aGlzLnJvd3N8fDE9PT10aGlzLmNvbHVtbnN9aXNTcXVhcmUoKXtyZXR1cm4gdGhpcy5yb3dzPT09dGhpcy5jb2x1bW5zfWlzRW1wdHkoKXtyZXR1cm4gMD09PXRoaXMucm93c3x8MD09PXRoaXMuY29sdW1uc31pc1N5bW1ldHJpYygpe2lmKHRoaXMuaXNTcXVhcmUoKSl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8PXQ7ZSsrKWlmKHRoaXMuZ2V0KHQsZSkhPT10aGlzLmdldChlLHQpKXJldHVybiExO3JldHVybiEwfXJldHVybiExfWlzRWNoZWxvbkZvcm0oKXtsZXQgdD0wLGU9MCxyPS0xLG49ITAsbz0hMTtmb3IoO3Q8dGhpcy5yb3dzJiZuOyl7Zm9yKGU9MCxvPSExO2U8dGhpcy5jb2x1bW5zJiYhMT09PW87KTA9PT10aGlzLmdldCh0LGUpP2UrKzoxPT09dGhpcy5nZXQodCxlKSYmZT5yPyhvPSEwLHI9ZSk6KG49ITEsbz0hMCk7dCsrfXJldHVybiBufWlzUmVkdWNlZEVjaGVsb25Gb3JtKCl7bGV0IHQ9MCxlPTAscj0tMSxuPSEwLG89ITE7Zm9yKDt0PHRoaXMucm93cyYmbjspe2ZvcihlPTAsbz0hMTtlPHRoaXMuY29sdW1ucyYmITE9PT1vOykwPT09dGhpcy5nZXQodCxlKT9lKys6MT09PXRoaXMuZ2V0KHQsZSkmJmU+cj8obz0hMCxyPWUpOihuPSExLG89ITApO2ZvcihsZXQgcj1lKzE7cjx0aGlzLnJvd3M7cisrKTAhPT10aGlzLmdldCh0LHIpJiYobj0hMSk7dCsrfXJldHVybiBufWVjaGVsb25Gb3JtKCl7bGV0IHQ9dGhpcy5jbG9uZSgpLGU9MCxyPTA7Zm9yKDtlPHQucm93cyYmcjx0LmNvbHVtbnM7KXtsZXQgbj1lO2ZvcihsZXQgbz1lO288dC5yb3dzO28rKyl0LmdldChvLHIpPnQuZ2V0KG4scikmJihuPW8pO2lmKDA9PT10LmdldChuLHIpKXIrKztlbHNle3Quc3dhcFJvd3MoZSxuKTtsZXQgbz10LmdldChlLHIpO2ZvcihsZXQgbj1yO248dC5jb2x1bW5zO24rKyl0LnNldChlLG4sdC5nZXQoZSxuKS9vKTtmb3IobGV0IG49ZSsxO248dC5yb3dzO24rKyl7bGV0IG89dC5nZXQobixyKS90LmdldChlLHIpO3Quc2V0KG4sciwwKTtmb3IobGV0IHM9cisxO3M8dC5jb2x1bW5zO3MrKyl0LnNldChuLHMsdC5nZXQobixzKS10LmdldChlLHMpKm8pfWUrKyxyKyt9fXJldHVybiB0fXJlZHVjZWRFY2hlbG9uRm9ybSgpe2xldCB0PXRoaXMuZWNoZWxvbkZvcm0oKSxlPXQuY29sdW1ucyxyPXQucm93cyxuPXItMTtmb3IoO24+PTA7KWlmKDA9PT10Lm1heFJvdyhuKSluLS07ZWxzZXtsZXQgbz0wLHM9ITE7Zm9yKDtvPHImJiExPT09czspMT09PXQuZ2V0KG4sbyk/cz0hMDpvKys7Zm9yKGxldCByPTA7cjxuO3IrKyl7bGV0IHM9dC5nZXQocixvKTtmb3IobGV0IGk9bztpPGU7aSsrKXtsZXQgZT10LmdldChyLGkpLXMqdC5nZXQobixpKTt0LnNldChyLGksZSl9fW4tLX1yZXR1cm4gdH1zZXQoKXt0aHJvdyBuZXcgRXJyb3IoInNldCBtZXRob2QgaXMgdW5pbXBsZW1lbnRlZCIpfWdldCgpe3Rocm93IG5ldyBFcnJvcigiZ2V0IG1ldGhvZCBpcyB1bmltcGxlbWVudGVkIil9cmVwZWF0KHQ9e30pe2lmKCJvYmplY3QiIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCJvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0Iik7Y29uc3R7cm93czplPTEsY29sdW1uczpyPTF9PXQ7aWYoIU51bWJlci5pc0ludGVnZXIoZSl8fGU8PTApdGhyb3cgbmV3IFR5cGVFcnJvcigicm93cyBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciIpO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKHIpfHxyPD0wKXRocm93IG5ldyBUeXBlRXJyb3IoImNvbHVtbnMgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIiKTtsZXQgbj1uZXcgVW4odGhpcy5yb3dzKmUsdGhpcy5jb2x1bW5zKnIpO2ZvcihsZXQgdD0wO3Q8ZTt0KyspZm9yKGxldCBlPTA7ZTxyO2UrKyluLnNldFN1Yk1hdHJpeCh0aGlzLHRoaXMucm93cyp0LHRoaXMuY29sdW1ucyplKTtyZXR1cm4gbn1maWxsKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHQpO3JldHVybiB0aGlzfW5lZygpe3JldHVybiB0aGlzLm11bFMoLTEpfWdldFJvdyh0KXtObih0aGlzLHQpO2xldCBlPVtdO2ZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyllLnB1c2godGhpcy5nZXQodCxyKSk7cmV0dXJuIGV9Z2V0Um93VmVjdG9yKHQpe3JldHVybiBVbi5yb3dWZWN0b3IodGhpcy5nZXRSb3codCkpfXNldFJvdyh0LGUpe05uKHRoaXMsdCksZT1Gbih0aGlzLGUpO2ZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldCh0LHIsZVtyXSk7cmV0dXJuIHRoaXN9c3dhcFJvd3ModCxlKXtObih0aGlzLHQpLE5uKHRoaXMsZSk7Zm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXtsZXQgbj10aGlzLmdldCh0LHIpO3RoaXMuc2V0KHQscix0aGlzLmdldChlLHIpKSx0aGlzLnNldChlLHIsbil9cmV0dXJuIHRoaXN9Z2V0Q29sdW1uKHQpe2tuKHRoaXMsdCk7bGV0IGU9W107Zm9yKGxldCByPTA7cjx0aGlzLnJvd3M7cisrKWUucHVzaCh0aGlzLmdldChyLHQpKTtyZXR1cm4gZX1nZXRDb2x1bW5WZWN0b3IodCl7cmV0dXJuIFVuLmNvbHVtblZlY3Rvcih0aGlzLmdldENvbHVtbih0KSl9c2V0Q29sdW1uKHQsZSl7a24odGhpcyx0KSxlPVBuKHRoaXMsZSk7Zm9yKGxldCByPTA7cjx0aGlzLnJvd3M7cisrKXRoaXMuc2V0KHIsdCxlW3JdKTtyZXR1cm4gdGhpc31zd2FwQ29sdW1ucyh0LGUpe2tuKHRoaXMsdCksa24odGhpcyxlKTtmb3IobGV0IHI9MDtyPHRoaXMucm93cztyKyspe2xldCBuPXRoaXMuZ2V0KHIsdCk7dGhpcy5zZXQocix0LHRoaXMuZ2V0KHIsZSkpLHRoaXMuc2V0KHIsZSxuKX1yZXR1cm4gdGhpc31hZGRSb3dWZWN0b3IodCl7dD1Gbih0aGlzLHQpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikrdFtyXSk7cmV0dXJuIHRoaXN9c3ViUm93VmVjdG9yKHQpe3Q9Rm4odGhpcyx0KTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpLXRbcl0pO3JldHVybiB0aGlzfW11bFJvd1ZlY3Rvcih0KXt0PUZuKHRoaXMsdCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKSp0W3JdKTtyZXR1cm4gdGhpc31kaXZSb3dWZWN0b3IodCl7dD1Gbih0aGlzLHQpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikvdFtyXSk7cmV0dXJuIHRoaXN9YWRkQ29sdW1uVmVjdG9yKHQpe3Q9UG4odGhpcyx0KTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpK3RbZV0pO3JldHVybiB0aGlzfXN1YkNvbHVtblZlY3Rvcih0KXt0PVBuKHRoaXMsdCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKS10W2VdKTtyZXR1cm4gdGhpc31tdWxDb2x1bW5WZWN0b3IodCl7dD1Qbih0aGlzLHQpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikqdFtlXSk7cmV0dXJuIHRoaXN9ZGl2Q29sdW1uVmVjdG9yKHQpe3Q9UG4odGhpcyx0KTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpL3RbZV0pO3JldHVybiB0aGlzfW11bFJvdyh0LGUpe05uKHRoaXMsdCk7Zm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KHQscix0aGlzLmdldCh0LHIpKmUpO3JldHVybiB0aGlzfW11bENvbHVtbih0LGUpe2tuKHRoaXMsdCk7Zm9yKGxldCByPTA7cjx0aGlzLnJvd3M7cisrKXRoaXMuc2V0KHIsdCx0aGlzLmdldChyLHQpKmUpO3JldHVybiB0aGlzfW1heCh0KXtpZih0aGlzLmlzRW1wdHkoKSlyZXR1cm4gTmFOO3N3aXRjaCh0KXtjYXNlInJvdyI6e2NvbnN0IHQ9bmV3IEFycmF5KHRoaXMucm93cykuZmlsbChOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5nZXQoZSxyKT50W2VdJiYodFtlXT10aGlzLmdldChlLHIpKTtyZXR1cm4gdH1jYXNlImNvbHVtbiI6e2NvbnN0IHQ9bmV3IEFycmF5KHRoaXMuY29sdW1ucykuZmlsbChOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5nZXQoZSxyKT50W3JdJiYodFtyXT10aGlzLmdldChlLHIpKTtyZXR1cm4gdH1jYXNlIHZvaWQgMDp7bGV0IHQ9dGhpcy5nZXQoMCwwKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuZ2V0KGUscik+dCYmKHQ9dGhpcy5nZXQoZSxyKSk7cmV0dXJuIHR9ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgb3B0aW9uOiAke3R9YCl9fW1heEluZGV4KCl7JG4odGhpcyk7bGV0IHQ9dGhpcy5nZXQoMCwwKSxlPVswLDBdO2ZvcihsZXQgcj0wO3I8dGhpcy5yb3dzO3IrKylmb3IobGV0IG49MDtuPHRoaXMuY29sdW1ucztuKyspdGhpcy5nZXQocixuKT50JiYodD10aGlzLmdldChyLG4pLGVbMF09cixlWzFdPW4pO3JldHVybiBlfW1pbih0KXtpZih0aGlzLmlzRW1wdHkoKSlyZXR1cm4gTmFOO3N3aXRjaCh0KXtjYXNlInJvdyI6e2NvbnN0IHQ9bmV3IEFycmF5KHRoaXMucm93cykuZmlsbChOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5nZXQoZSxyKTx0W2VdJiYodFtlXT10aGlzLmdldChlLHIpKTtyZXR1cm4gdH1jYXNlImNvbHVtbiI6e2NvbnN0IHQ9bmV3IEFycmF5KHRoaXMuY29sdW1ucykuZmlsbChOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5nZXQoZSxyKTx0W3JdJiYodFtyXT10aGlzLmdldChlLHIpKTtyZXR1cm4gdH1jYXNlIHZvaWQgMDp7bGV0IHQ9dGhpcy5nZXQoMCwwKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuZ2V0KGUscik8dCYmKHQ9dGhpcy5nZXQoZSxyKSk7cmV0dXJuIHR9ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgb3B0aW9uOiAke3R9YCl9fW1pbkluZGV4KCl7JG4odGhpcyk7bGV0IHQ9dGhpcy5nZXQoMCwwKSxlPVswLDBdO2ZvcihsZXQgcj0wO3I8dGhpcy5yb3dzO3IrKylmb3IobGV0IG49MDtuPHRoaXMuY29sdW1ucztuKyspdGhpcy5nZXQocixuKTx0JiYodD10aGlzLmdldChyLG4pLGVbMF09cixlWzFdPW4pO3JldHVybiBlfW1heFJvdyh0KXtpZihObih0aGlzLHQpLHRoaXMuaXNFbXB0eSgpKXJldHVybiBOYU47bGV0IGU9dGhpcy5nZXQodCwwKTtmb3IobGV0IHI9MTtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5nZXQodCxyKT5lJiYoZT10aGlzLmdldCh0LHIpKTtyZXR1cm4gZX1tYXhSb3dJbmRleCh0KXtObih0aGlzLHQpLCRuKHRoaXMpO2xldCBlPXRoaXMuZ2V0KHQsMCkscj1bdCwwXTtmb3IobGV0IG49MTtuPHRoaXMuY29sdW1ucztuKyspdGhpcy5nZXQodCxuKT5lJiYoZT10aGlzLmdldCh0LG4pLHJbMV09bik7cmV0dXJuIHJ9bWluUm93KHQpe2lmKE5uKHRoaXMsdCksdGhpcy5pc0VtcHR5KCkpcmV0dXJuIE5hTjtsZXQgZT10aGlzLmdldCh0LDApO2ZvcihsZXQgcj0xO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLmdldCh0LHIpPGUmJihlPXRoaXMuZ2V0KHQscikpO3JldHVybiBlfW1pblJvd0luZGV4KHQpe05uKHRoaXMsdCksJG4odGhpcyk7bGV0IGU9dGhpcy5nZXQodCwwKSxyPVt0LDBdO2ZvcihsZXQgbj0xO248dGhpcy5jb2x1bW5zO24rKyl0aGlzLmdldCh0LG4pPGUmJihlPXRoaXMuZ2V0KHQsbiksclsxXT1uKTtyZXR1cm4gcn1tYXhDb2x1bW4odCl7aWYoa24odGhpcyx0KSx0aGlzLmlzRW1wdHkoKSlyZXR1cm4gTmFOO2xldCBlPXRoaXMuZ2V0KDAsdCk7Zm9yKGxldCByPTE7cjx0aGlzLnJvd3M7cisrKXRoaXMuZ2V0KHIsdCk+ZSYmKGU9dGhpcy5nZXQocix0KSk7cmV0dXJuIGV9bWF4Q29sdW1uSW5kZXgodCl7a24odGhpcyx0KSwkbih0aGlzKTtsZXQgZT10aGlzLmdldCgwLHQpLHI9WzAsdF07Zm9yKGxldCBuPTE7bjx0aGlzLnJvd3M7bisrKXRoaXMuZ2V0KG4sdCk+ZSYmKGU9dGhpcy5nZXQobix0KSxyWzBdPW4pO3JldHVybiByfW1pbkNvbHVtbih0KXtpZihrbih0aGlzLHQpLHRoaXMuaXNFbXB0eSgpKXJldHVybiBOYU47bGV0IGU9dGhpcy5nZXQoMCx0KTtmb3IobGV0IHI9MTtyPHRoaXMucm93cztyKyspdGhpcy5nZXQocix0KTxlJiYoZT10aGlzLmdldChyLHQpKTtyZXR1cm4gZX1taW5Db2x1bW5JbmRleCh0KXtrbih0aGlzLHQpLCRuKHRoaXMpO2xldCBlPXRoaXMuZ2V0KDAsdCkscj1bMCx0XTtmb3IobGV0IG49MTtuPHRoaXMucm93cztuKyspdGhpcy5nZXQobix0KTxlJiYoZT10aGlzLmdldChuLHQpLHJbMF09bik7cmV0dXJuIHJ9ZGlhZygpe2xldCB0PU1hdGgubWluKHRoaXMucm93cyx0aGlzLmNvbHVtbnMpLGU9W107Zm9yKGxldCByPTA7cjx0O3IrKyllLnB1c2godGhpcy5nZXQocixyKSk7cmV0dXJuIGV9bm9ybSh0PSJmcm9iZW5pdXMiKXtsZXQgZT0wO2lmKCJtYXgiPT09dClyZXR1cm4gdGhpcy5tYXgoKTtpZigiZnJvYmVuaXVzIj09PXQpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspZSs9dGhpcy5nZXQodCxyKSp0aGlzLmdldCh0LHIpO3JldHVybiBNYXRoLnNxcnQoZSl9dGhyb3cgbmV3IFJhbmdlRXJyb3IoYHVua25vd24gbm9ybSB0eXBlOiAke3R9YCl9Y3VtdWxhdGl2ZVN1bSgpe2xldCB0PTA7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0Kz10aGlzLmdldChlLHIpLHRoaXMuc2V0KGUscix0KTtyZXR1cm4gdGhpc31kb3QodCl7cW4uaXNNYXRyaXgodCkmJih0PXQudG8xREFycmF5KCkpO2xldCBlPXRoaXMudG8xREFycmF5KCk7aWYoZS5sZW5ndGghPT10Lmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigidmVjdG9ycyBkbyBub3QgaGF2ZSB0aGUgc2FtZSBzaXplIik7bGV0IHI9MDtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rKylyKz1lW25dKnRbbl07cmV0dXJuIHJ9bW11bCh0KXt0PVVuLmNoZWNrTWF0cml4KHQpO2xldCBlPXRoaXMucm93cyxyPXRoaXMuY29sdW1ucyxuPXQuY29sdW1ucyxvPW5ldyBVbihlLG4pLHM9bmV3IEZsb2F0NjRBcnJheShyKTtmb3IobGV0IGk9MDtpPG47aSsrKXtmb3IobGV0IGU9MDtlPHI7ZSsrKXNbZV09dC5nZXQoZSxpKTtmb3IobGV0IHQ9MDt0PGU7dCsrKXtsZXQgZT0wO2ZvcihsZXQgbj0wO248cjtuKyspZSs9dGhpcy5nZXQodCxuKSpzW25dO28uc2V0KHQsaSxlKX19cmV0dXJuIG99c3RyYXNzZW4yeDIodCl7dD1Vbi5jaGVja01hdHJpeCh0KTtsZXQgZT1uZXcgVW4oMiwyKTtjb25zdCByPXRoaXMuZ2V0KDAsMCksbj10LmdldCgwLDApLG89dGhpcy5nZXQoMCwxKSxzPXQuZ2V0KDAsMSksaT10aGlzLmdldCgxLDApLHU9dC5nZXQoMSwwKSxhPXRoaXMuZ2V0KDEsMSksbD10LmdldCgxLDEpLGg9KHIrYSkqKG4rbCksYz0oaSthKSpuLGY9cioocy1sKSxtPWEqKHUtbiksZz0ocitvKSpsLHA9aCttLWcrKG8tYSkqKHUrbCksdz1mK2csZD1jK20sYj1oLWMrZisoaS1yKSoobitzKTtyZXR1cm4gZS5zZXQoMCwwLHApLGUuc2V0KDAsMSx3KSxlLnNldCgxLDAsZCksZS5zZXQoMSwxLGIpLGV9c3RyYXNzZW4zeDModCl7dD1Vbi5jaGVja01hdHJpeCh0KTtsZXQgZT1uZXcgVW4oMywzKTtjb25zdCByPXRoaXMuZ2V0KDAsMCksbj10aGlzLmdldCgwLDEpLG89dGhpcy5nZXQoMCwyKSxzPXRoaXMuZ2V0KDEsMCksaT10aGlzLmdldCgxLDEpLHU9dGhpcy5nZXQoMSwyKSxhPXRoaXMuZ2V0KDIsMCksbD10aGlzLmdldCgyLDEpLGg9dGhpcy5nZXQoMiwyKSxjPXQuZ2V0KDAsMCksZj10LmdldCgwLDEpLG09dC5nZXQoMCwyKSxnPXQuZ2V0KDEsMCkscD10LmdldCgxLDEpLHc9dC5nZXQoMSwyKSxkPXQuZ2V0KDIsMCksYj10LmdldCgyLDEpLHk9dC5nZXQoMiwyKSx2PShyLXMpKigtZitwKSxNPSgtcitzK2kpKihjLWYrcCksaj0ocytpKSooLWMrZikseD1yKmMsXz0oLXIrYStsKSooYy1tK3cpLEU9KC1yK2EpKihtLXcpLFM9KGErbCkqKC1jK20pLE89KC1vK2wraCkqKHArZC1iKSxBPShvLWgpKihwLWIpLEM9bypkLFI9KGwraCkqKC1kK2IpLEk9KC1vK2krdSkqKHcrZC15KSxOPShvLXUpKih3LXkpLGs9KGkrdSkqKC1kK3kpLEY9eCtDK24qZyxQPShyK24rby1zLWktbC1oKSpwK00rait4K08rQytSLFQ9eCtfK1MrKHIrbitvLWktdS1hLWwpKncrQytJK2ssej12K2kqKC1jK2YrZy1wLXctZCt5KStNK3grQytJK04sVj12K00rait4K3UqYiwkPUMrSStOK2srcyptLHE9eCtfK0UrbCooLWMrbStnLXAtdy1kK2IpK08rQStDLEQ9TytBK0MrUithKmYsVT14K18rRStTK2gqeTtyZXR1cm4gZS5zZXQoMCwwLEYpLGUuc2V0KDAsMSxQKSxlLnNldCgwLDIsVCksZS5zZXQoMSwwLHopLGUuc2V0KDEsMSxWKSxlLnNldCgxLDIsJCksZS5zZXQoMiwwLHEpLGUuc2V0KDIsMSxEKSxlLnNldCgyLDIsVSksZX1tbXVsU3RyYXNzZW4odCl7dD1Vbi5jaGVja01hdHJpeCh0KTtsZXQgZT10aGlzLmNsb25lKCkscj1lLnJvd3Msbj1lLmNvbHVtbnMsbz10LnJvd3Mscz10LmNvbHVtbnM7ZnVuY3Rpb24gaSh0LGUscil7bGV0IG49dC5yb3dzLG89dC5jb2x1bW5zO2lmKG49PT1lJiZvPT09cilyZXR1cm4gdDt7bGV0IG49cW4uemVyb3MoZSxyKTtyZXR1cm4gbj1uLnNldFN1Yk1hdHJpeCh0LDAsMCksbn19biE9PW8mJmNvbnNvbGUud2FybihgTXVsdGlwbHlpbmcgJHtyfSB4ICR7bn0gYW5kICR7b30geCAke3N9IG1hdHJpeDogZGltZW5zaW9ucyBkbyBub3QgbWF0Y2guYCk7bGV0IHU9TWF0aC5tYXgocixvKSxhPU1hdGgubWF4KG4scyk7cmV0dXJuIGU9aShlLHUsYSksZnVuY3Rpb24gdChlLHIsbixvKXtpZihuPD01MTJ8fG88PTUxMilyZXR1cm4gZS5tbXVsKHIpO24lMj09MSYmbyUyPT0xPyhlPWkoZSxuKzEsbysxKSxyPWkocixuKzEsbysxKSk6biUyPT0xPyhlPWkoZSxuKzEsbykscj1pKHIsbisxLG8pKTpvJTI9PTEmJihlPWkoZSxuLG8rMSkscj1pKHIsbixvKzEpKTtsZXQgcz1wYXJzZUludChlLnJvd3MvMiwxMCksdT1wYXJzZUludChlLmNvbHVtbnMvMiwxMCksYT1lLnN1Yk1hdHJpeCgwLHMtMSwwLHUtMSksbD1yLnN1Yk1hdHJpeCgwLHMtMSwwLHUtMSksaD1lLnN1Yk1hdHJpeCgwLHMtMSx1LGUuY29sdW1ucy0xKSxjPXIuc3ViTWF0cml4KDAscy0xLHUsci5jb2x1bW5zLTEpLGY9ZS5zdWJNYXRyaXgocyxlLnJvd3MtMSwwLHUtMSksbT1yLnN1Yk1hdHJpeChzLHIucm93cy0xLDAsdS0xKSxnPWUuc3ViTWF0cml4KHMsZS5yb3dzLTEsdSxlLmNvbHVtbnMtMSkscD1yLnN1Yk1hdHJpeChzLHIucm93cy0xLHUsci5jb2x1bW5zLTEpLHc9dChxbi5hZGQoYSxnKSxxbi5hZGQobCxwKSxzLHUpLGQ9dChxbi5hZGQoZixnKSxsLHMsdSksYj10KGEscW4uc3ViKGMscCkscyx1KSx5PXQoZyxxbi5zdWIobSxsKSxzLHUpLHY9dChxbi5hZGQoYSxoKSxwLHMsdSksTT10KHFuLnN1YihmLGEpLHFuLmFkZChsLGMpLHMsdSksaj10KHFuLnN1YihoLGcpLHFuLmFkZChtLHApLHMsdSkseD1xbi5hZGQodyx5KTt4LnN1Yih2KSx4LmFkZChqKTtsZXQgXz1xbi5hZGQoYix2KSxFPXFuLmFkZChkLHkpLFM9cW4uc3ViKHcsZCk7Uy5hZGQoYiksUy5hZGQoTSk7bGV0IE89cW4uemVyb3MoMip4LnJvd3MsMip4LmNvbHVtbnMpO3JldHVybiBPPU8uc2V0U3ViTWF0cml4KHgsMCwwKSxPPU8uc2V0U3ViTWF0cml4KF8seC5yb3dzLDApLE89Ty5zZXRTdWJNYXRyaXgoRSwwLHguY29sdW1ucyksTz1PLnNldFN1Yk1hdHJpeChTLHgucm93cyx4LmNvbHVtbnMpLE8uc3ViTWF0cml4KDAsbi0xLDAsby0xKX0oZSx0PWkodCx1LGEpLHUsYSl9c2NhbGVSb3dzKHQ9e30pe2lmKCJvYmplY3QiIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCJvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0Iik7Y29uc3R7bWluOmU9MCxtYXg6cj0xfT10O2lmKCFOdW1iZXIuaXNGaW5pdGUoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigibWluIG11c3QgYmUgYSBudW1iZXIiKTtpZighTnVtYmVyLmlzRmluaXRlKHIpKXRocm93IG5ldyBUeXBlRXJyb3IoIm1heCBtdXN0IGJlIGEgbnVtYmVyIik7aWYoZT49cil0aHJvdyBuZXcgUmFuZ2VFcnJvcigibWluIG11c3QgYmUgc21hbGxlciB0aGFuIG1heCIpO2xldCBuPW5ldyBVbih0aGlzLnJvd3MsdGhpcy5jb2x1bW5zKTtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0Kyspe2NvbnN0IG89dGhpcy5nZXRSb3codCk7by5sZW5ndGg+MCYmU24obyx7bWluOmUsbWF4OnIsb3V0cHV0Om99KSxuLnNldFJvdyh0LG8pfXJldHVybiBufXNjYWxlQ29sdW1ucyh0PXt9KXtpZigib2JqZWN0IiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIpO2NvbnN0e21pbjplPTAsbWF4OnI9MX09dDtpZighTnVtYmVyLmlzRmluaXRlKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIm1pbiBtdXN0IGJlIGEgbnVtYmVyIik7aWYoIU51bWJlci5pc0Zpbml0ZShyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJtYXggbXVzdCBiZSBhIG51bWJlciIpO2lmKGU+PXIpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm1pbiBtdXN0IGJlIHNtYWxsZXIgdGhhbiBtYXgiKTtsZXQgbj1uZXcgVW4odGhpcy5yb3dzLHRoaXMuY29sdW1ucyk7Zm9yKGxldCB0PTA7dDx0aGlzLmNvbHVtbnM7dCsrKXtjb25zdCBvPXRoaXMuZ2V0Q29sdW1uKHQpO28ubGVuZ3RoJiZTbihvLHttaW46ZSxtYXg6cixvdXRwdXQ6b30pLG4uc2V0Q29sdW1uKHQsbyl9cmV0dXJuIG59ZmxpcFJvd3MoKXtjb25zdCB0PU1hdGguY2VpbCh0aGlzLmNvbHVtbnMvMik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dDtyKyspe2xldCB0PXRoaXMuZ2V0KGUsciksbj10aGlzLmdldChlLHRoaXMuY29sdW1ucy0xLXIpO3RoaXMuc2V0KGUscixuKSx0aGlzLnNldChlLHRoaXMuY29sdW1ucy0xLXIsdCl9cmV0dXJuIHRoaXN9ZmxpcENvbHVtbnMoKXtjb25zdCB0PU1hdGguY2VpbCh0aGlzLnJvd3MvMik7Zm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKWZvcihsZXQgcj0wO3I8dDtyKyspe2xldCB0PXRoaXMuZ2V0KHIsZSksbj10aGlzLmdldCh0aGlzLnJvd3MtMS1yLGUpO3RoaXMuc2V0KHIsZSxuKSx0aGlzLnNldCh0aGlzLnJvd3MtMS1yLGUsdCl9cmV0dXJuIHRoaXN9a3JvbmVja2VyUHJvZHVjdCh0KXt0PVVuLmNoZWNrTWF0cml4KHQpO2xldCBlPXRoaXMucm93cyxyPXRoaXMuY29sdW1ucyxuPXQucm93cyxvPXQuY29sdW1ucyxzPW5ldyBVbihlKm4scipvKTtmb3IobGV0IGk9MDtpPGU7aSsrKWZvcihsZXQgZT0wO2U8cjtlKyspZm9yKGxldCByPTA7cjxuO3IrKylmb3IobGV0IHU9MDt1PG87dSsrKXMuc2V0KG4qaStyLG8qZSt1LHRoaXMuZ2V0KGksZSkqdC5nZXQocix1KSk7cmV0dXJuIHN9a3JvbmVja2VyU3VtKHQpe2lmKHQ9VW4uY2hlY2tNYXRyaXgodCksIXRoaXMuaXNTcXVhcmUoKXx8IXQuaXNTcXVhcmUoKSl0aHJvdyBuZXcgRXJyb3IoIktyb25lY2tlciBTdW0gbmVlZHMgdHdvIFNxdWFyZSBNYXRyaWNlcyIpO2xldCBlPXRoaXMucm93cyxyPXQucm93cyxuPXRoaXMua3JvbmVja2VyUHJvZHVjdChVbi5leWUocixyKSksbz1Vbi5leWUoZSxlKS5rcm9uZWNrZXJQcm9kdWN0KHQpO3JldHVybiBuLmFkZChvKX10cmFuc3Bvc2UoKXtsZXQgdD1uZXcgVW4odGhpcy5jb2x1bW5zLHRoaXMucm93cyk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0LnNldChyLGUsdGhpcy5nZXQoZSxyKSk7cmV0dXJuIHR9c29ydFJvd3ModD1Ebil7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKXRoaXMuc2V0Um93KGUsdGhpcy5nZXRSb3coZSkuc29ydCh0KSk7cmV0dXJuIHRoaXN9c29ydENvbHVtbnModD1Ebil7Zm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0Q29sdW1uKGUsdGhpcy5nZXRDb2x1bW4oZSkuc29ydCh0KSk7cmV0dXJuIHRoaXN9c3ViTWF0cml4KHQsZSxyLG4pe1RuKHRoaXMsdCxlLHIsbik7bGV0IG89bmV3IFVuKGUtdCsxLG4tcisxKTtmb3IobGV0IHM9dDtzPD1lO3MrKylmb3IobGV0IGU9cjtlPD1uO2UrKylvLnNldChzLXQsZS1yLHRoaXMuZ2V0KHMsZSkpO3JldHVybiBvfXN1Yk1hdHJpeFJvdyh0LGUscil7aWYodm9pZCAwPT09ZSYmKGU9MCksdm9pZCAwPT09ciYmKHI9dGhpcy5jb2x1bW5zLTEpLGU+cnx8ZTwwfHxlPj10aGlzLmNvbHVtbnN8fHI8MHx8cj49dGhpcy5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJBcmd1bWVudCBvdXQgb2YgcmFuZ2UiKTtsZXQgbj1uZXcgVW4odC5sZW5ndGgsci1lKzEpO2ZvcihsZXQgbz0wO288dC5sZW5ndGg7bysrKWZvcihsZXQgcz1lO3M8PXI7cysrKXtpZih0W29dPDB8fHRbb10+PXRoaXMucm93cyl0aHJvdyBuZXcgUmFuZ2VFcnJvcihgUm93IGluZGV4IG91dCBvZiByYW5nZTogJHt0W29dfWApO24uc2V0KG8scy1lLHRoaXMuZ2V0KHRbb10scykpfXJldHVybiBufXN1Yk1hdHJpeENvbHVtbih0LGUscil7aWYodm9pZCAwPT09ZSYmKGU9MCksdm9pZCAwPT09ciYmKHI9dGhpcy5yb3dzLTEpLGU+cnx8ZTwwfHxlPj10aGlzLnJvd3N8fHI8MHx8cj49dGhpcy5yb3dzKXRocm93IG5ldyBSYW5nZUVycm9yKCJBcmd1bWVudCBvdXQgb2YgcmFuZ2UiKTtsZXQgbj1uZXcgVW4oci1lKzEsdC5sZW5ndGgpO2ZvcihsZXQgbz0wO288dC5sZW5ndGg7bysrKWZvcihsZXQgcz1lO3M8PXI7cysrKXtpZih0W29dPDB8fHRbb10+PXRoaXMuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcihgQ29sdW1uIGluZGV4IG91dCBvZiByYW5nZTogJHt0W29dfWApO24uc2V0KHMtZSxvLHRoaXMuZ2V0KHMsdFtvXSkpfXJldHVybiBufXNldFN1Yk1hdHJpeCh0LGUscil7aWYoKHQ9VW4uY2hlY2tNYXRyaXgodCkpLmlzRW1wdHkoKSlyZXR1cm4gdGhpcztUbih0aGlzLGUsZSt0LnJvd3MtMSxyLHIrdC5jb2x1bW5zLTEpO2ZvcihsZXQgbj0wO248dC5yb3dzO24rKylmb3IobGV0IG89MDtvPHQuY29sdW1ucztvKyspdGhpcy5zZXQoZStuLHIrbyx0LmdldChuLG8pKTtyZXR1cm4gdGhpc31zZWxlY3Rpb24odCxlKXshZnVuY3Rpb24odCxlKXtpZighRW4oZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigicm93IGluZGljZXMgbXVzdCBiZSBhbiBhcnJheSIpO2ZvcihsZXQgcj0wO3I8ZS5sZW5ndGg7cisrKWlmKGVbcl08MHx8ZVtyXT49dC5yb3dzKXRocm93IG5ldyBSYW5nZUVycm9yKCJyb3cgaW5kaWNlcyBhcmUgb3V0IG9mIHJhbmdlIil9KHRoaXMsdCksZnVuY3Rpb24odCxlKXtpZighRW4oZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiY29sdW1uIGluZGljZXMgbXVzdCBiZSBhbiBhcnJheSIpO2ZvcihsZXQgcj0wO3I8ZS5sZW5ndGg7cisrKWlmKGVbcl08MHx8ZVtyXT49dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJjb2x1bW4gaW5kaWNlcyBhcmUgb3V0IG9mIHJhbmdlIil9KHRoaXMsZSk7bGV0IHI9bmV3IFVuKHQubGVuZ3RoLGUubGVuZ3RoKTtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKyl7bGV0IG89dFtuXTtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrKyl7bGV0IHM9ZVt0XTtyLnNldChuLHQsdGhpcy5nZXQobyxzKSl9fXJldHVybiByfXRyYWNlKCl7bGV0IHQ9TWF0aC5taW4odGhpcy5yb3dzLHRoaXMuY29sdW1ucyksZT0wO2ZvcihsZXQgcj0wO3I8dDtyKyspZSs9dGhpcy5nZXQocixyKTtyZXR1cm4gZX1jbG9uZSgpe2xldCB0PW5ldyBVbih0aGlzLnJvd3MsdGhpcy5jb2x1bW5zKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXQuc2V0KGUscix0aGlzLmdldChlLHIpKTtyZXR1cm4gdH1zdW0odCl7c3dpdGNoKHQpe2Nhc2Uicm93IjpyZXR1cm4gZnVuY3Rpb24odCl7bGV0IGU9em4odC5yb3dzKTtmb3IobGV0IHI9MDtyPHQucm93czsrK3IpZm9yKGxldCBuPTA7bjx0LmNvbHVtbnM7KytuKWVbcl0rPXQuZ2V0KHIsbik7cmV0dXJuIGV9KHRoaXMpO2Nhc2UiY29sdW1uIjpyZXR1cm4gZnVuY3Rpb24odCl7bGV0IGU9em4odC5jb2x1bW5zKTtmb3IobGV0IHI9MDtyPHQucm93czsrK3IpZm9yKGxldCBuPTA7bjx0LmNvbHVtbnM7KytuKWVbbl0rPXQuZ2V0KHIsbik7cmV0dXJuIGV9KHRoaXMpO2Nhc2Ugdm9pZCAwOnJldHVybiBmdW5jdGlvbih0KXtsZXQgZT0wO2ZvcihsZXQgcj0wO3I8dC5yb3dzO3IrKylmb3IobGV0IG49MDtuPHQuY29sdW1ucztuKyspZSs9dC5nZXQocixuKTtyZXR1cm4gZX0odGhpcyk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgb3B0aW9uOiAke3R9YCl9fXByb2R1Y3QodCl7c3dpdGNoKHQpe2Nhc2Uicm93IjpyZXR1cm4gZnVuY3Rpb24odCl7bGV0IGU9em4odC5yb3dzLDEpO2ZvcihsZXQgcj0wO3I8dC5yb3dzOysrcilmb3IobGV0IG49MDtuPHQuY29sdW1uczsrK24pZVtyXSo9dC5nZXQocixuKTtyZXR1cm4gZX0odGhpcyk7Y2FzZSJjb2x1bW4iOnJldHVybiBmdW5jdGlvbih0KXtsZXQgZT16bih0LmNvbHVtbnMsMSk7Zm9yKGxldCByPTA7cjx0LnJvd3M7KytyKWZvcihsZXQgbj0wO248dC5jb2x1bW5zOysrbillW25dKj10LmdldChyLG4pO3JldHVybiBlfSh0aGlzKTtjYXNlIHZvaWQgMDpyZXR1cm4gZnVuY3Rpb24odCl7bGV0IGU9MTtmb3IobGV0IHI9MDtyPHQucm93cztyKyspZm9yKGxldCBuPTA7bjx0LmNvbHVtbnM7bisrKWUqPXQuZ2V0KHIsbik7cmV0dXJuIGV9KHRoaXMpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG9wdGlvbjogJHt0fWApfX1tZWFuKHQpe2NvbnN0IGU9dGhpcy5zdW0odCk7c3dpdGNoKHQpe2Nhc2Uicm93Ijpmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZVt0XS89dGhpcy5jb2x1bW5zO3JldHVybiBlO2Nhc2UiY29sdW1uIjpmb3IobGV0IHQ9MDt0PHRoaXMuY29sdW1uczt0KyspZVt0XS89dGhpcy5yb3dzO3JldHVybiBlO2Nhc2Ugdm9pZCAwOnJldHVybiBlL3RoaXMuc2l6ZTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgaW52YWxpZCBvcHRpb246ICR7dH1gKX19dmFyaWFuY2UodCxlPXt9KXtpZigib2JqZWN0Ij09dHlwZW9mIHQmJihlPXQsdD12b2lkIDApLCJvYmplY3QiIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0Iik7Y29uc3R7dW5iaWFzZWQ6cj0hMCxtZWFuOm49dGhpcy5tZWFuKHQpfT1lO2lmKCJib29sZWFuIiE9dHlwZW9mIHIpdGhyb3cgbmV3IFR5cGVFcnJvcigidW5iaWFzZWQgbXVzdCBiZSBhIGJvb2xlYW4iKTtzd2l0Y2godCl7Y2FzZSJyb3ciOmlmKCFFbihuKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJtZWFuIG11c3QgYmUgYW4gYXJyYXkiKTtyZXR1cm4gZnVuY3Rpb24odCxlLHIpe2NvbnN0IG49dC5yb3dzLG89dC5jb2x1bW5zLHM9W107Zm9yKGxldCBpPTA7aTxuO2krKyl7bGV0IG49MCx1PTAsYT0wO2ZvcihsZXQgZT0wO2U8bztlKyspYT10LmdldChpLGUpLXJbaV0sbis9YSx1Kz1hKmE7ZT9zLnB1c2goKHUtbipuL28pLyhvLTEpKTpzLnB1c2goKHUtbipuL28pL28pfXJldHVybiBzfSh0aGlzLHIsbik7Y2FzZSJjb2x1bW4iOmlmKCFFbihuKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJtZWFuIG11c3QgYmUgYW4gYXJyYXkiKTtyZXR1cm4gZnVuY3Rpb24odCxlLHIpe2NvbnN0IG49dC5yb3dzLG89dC5jb2x1bW5zLHM9W107Zm9yKGxldCBpPTA7aTxvO2krKyl7bGV0IG89MCx1PTAsYT0wO2ZvcihsZXQgZT0wO2U8bjtlKyspYT10LmdldChlLGkpLXJbaV0sbys9YSx1Kz1hKmE7ZT9zLnB1c2goKHUtbypvL24pLyhuLTEpKTpzLnB1c2goKHUtbypvL24pL24pfXJldHVybiBzfSh0aGlzLHIsbik7Y2FzZSB2b2lkIDA6aWYoIm51bWJlciIhPXR5cGVvZiBuKXRocm93IG5ldyBUeXBlRXJyb3IoIm1lYW4gbXVzdCBiZSBhIG51bWJlciIpO3JldHVybiBmdW5jdGlvbih0LGUscil7Y29uc3Qgbj10LnJvd3Msbz10LmNvbHVtbnMscz1uKm87bGV0IGk9MCx1PTAsYT0wO2ZvcihsZXQgZT0wO2U8bjtlKyspZm9yKGxldCBuPTA7bjxvO24rKylhPXQuZ2V0KGUsbiktcixpKz1hLHUrPWEqYTtyZXR1cm4gZT8odS1pKmkvcykvKHMtMSk6KHUtaSppL3MpL3N9KHRoaXMscixuKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgaW52YWxpZCBvcHRpb246ICR7dH1gKX19c3RhbmRhcmREZXZpYXRpb24odCxlKXsib2JqZWN0Ij09dHlwZW9mIHQmJihlPXQsdD12b2lkIDApO2NvbnN0IHI9dGhpcy52YXJpYW5jZSh0LGUpO2lmKHZvaWQgMD09PXQpcmV0dXJuIE1hdGguc3FydChyKTtmb3IobGV0IHQ9MDt0PHIubGVuZ3RoO3QrKylyW3RdPU1hdGguc3FydChyW3RdKTtyZXR1cm4gcn1jZW50ZXIodCxlPXt9KXtpZigib2JqZWN0Ij09dHlwZW9mIHQmJihlPXQsdD12b2lkIDApLCJvYmplY3QiIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0Iik7Y29uc3R7Y2VudGVyOnI9dGhpcy5tZWFuKHQpfT1lO3N3aXRjaCh0KXtjYXNlInJvdyI6aWYoIUVuKHIpKXRocm93IG5ldyBUeXBlRXJyb3IoImNlbnRlciBtdXN0IGJlIGFuIGFycmF5Iik7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7Zm9yKGxldCByPTA7cjx0LnJvd3M7cisrKWZvcihsZXQgbj0wO248dC5jb2x1bW5zO24rKyl0LnNldChyLG4sdC5nZXQocixuKS1lW3JdKX0odGhpcyxyKSx0aGlzO2Nhc2UiY29sdW1uIjppZighRW4ocikpdGhyb3cgbmV3IFR5cGVFcnJvcigiY2VudGVyIG11c3QgYmUgYW4gYXJyYXkiKTtyZXR1cm4gZnVuY3Rpb24odCxlKXtmb3IobGV0IHI9MDtyPHQucm93cztyKyspZm9yKGxldCBuPTA7bjx0LmNvbHVtbnM7bisrKXQuc2V0KHIsbix0LmdldChyLG4pLWVbbl0pfSh0aGlzLHIpLHRoaXM7Y2FzZSB2b2lkIDA6aWYoIm51bWJlciIhPXR5cGVvZiByKXRocm93IG5ldyBUeXBlRXJyb3IoImNlbnRlciBtdXN0IGJlIGEgbnVtYmVyIik7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7Zm9yKGxldCByPTA7cjx0LnJvd3M7cisrKWZvcihsZXQgbj0wO248dC5jb2x1bW5zO24rKyl0LnNldChyLG4sdC5nZXQocixuKS1lKX0odGhpcyxyKSx0aGlzO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG9wdGlvbjogJHt0fWApfX1zY2FsZSh0LGU9e30pe2lmKCJvYmplY3QiPT10eXBlb2YgdCYmKGU9dCx0PXZvaWQgMCksIm9iamVjdCIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiKTtsZXQgcj1lLnNjYWxlO3N3aXRjaCh0KXtjYXNlInJvdyI6aWYodm9pZCAwPT09cilyPWZ1bmN0aW9uKHQpe2NvbnN0IGU9W107Zm9yKGxldCByPTA7cjx0LnJvd3M7cisrKXtsZXQgbj0wO2ZvcihsZXQgZT0wO2U8dC5jb2x1bW5zO2UrKyluKz1NYXRoLnBvdyh0LmdldChyLGUpLDIpLyh0LmNvbHVtbnMtMSk7ZS5wdXNoKE1hdGguc3FydChuKSl9cmV0dXJuIGV9KHRoaXMpO2Vsc2UgaWYoIUVuKHIpKXRocm93IG5ldyBUeXBlRXJyb3IoInNjYWxlIG11c3QgYmUgYW4gYXJyYXkiKTtyZXR1cm4gZnVuY3Rpb24odCxlKXtmb3IobGV0IHI9MDtyPHQucm93cztyKyspZm9yKGxldCBuPTA7bjx0LmNvbHVtbnM7bisrKXQuc2V0KHIsbix0LmdldChyLG4pL2Vbcl0pfSh0aGlzLHIpLHRoaXM7Y2FzZSJjb2x1bW4iOmlmKHZvaWQgMD09PXIpcj1mdW5jdGlvbih0KXtjb25zdCBlPVtdO2ZvcihsZXQgcj0wO3I8dC5jb2x1bW5zO3IrKyl7bGV0IG49MDtmb3IobGV0IGU9MDtlPHQucm93cztlKyspbis9TWF0aC5wb3codC5nZXQoZSxyKSwyKS8odC5yb3dzLTEpO2UucHVzaChNYXRoLnNxcnQobikpfXJldHVybiBlfSh0aGlzKTtlbHNlIGlmKCFFbihyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJzY2FsZSBtdXN0IGJlIGFuIGFycmF5Iik7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7Zm9yKGxldCByPTA7cjx0LnJvd3M7cisrKWZvcihsZXQgbj0wO248dC5jb2x1bW5zO24rKyl0LnNldChyLG4sdC5nZXQocixuKS9lW25dKX0odGhpcyxyKSx0aGlzO2Nhc2Ugdm9pZCAwOmlmKHZvaWQgMD09PXIpcj1mdW5jdGlvbih0KXtjb25zdCBlPXQuc2l6ZS0xO2xldCByPTA7Zm9yKGxldCBuPTA7bjx0LmNvbHVtbnM7bisrKWZvcihsZXQgbz0wO288dC5yb3dzO28rKylyKz1NYXRoLnBvdyh0LmdldChvLG4pLDIpL2U7cmV0dXJuIE1hdGguc3FydChyKX0odGhpcyk7ZWxzZSBpZigibnVtYmVyIiE9dHlwZW9mIHIpdGhyb3cgbmV3IFR5cGVFcnJvcigic2NhbGUgbXVzdCBiZSBhIG51bWJlciIpO3JldHVybiBmdW5jdGlvbih0LGUpe2ZvcihsZXQgcj0wO3I8dC5yb3dzO3IrKylmb3IobGV0IG49MDtuPHQuY29sdW1ucztuKyspdC5zZXQocixuLHQuZ2V0KHIsbikvZSl9KHRoaXMsciksdGhpcztkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgaW52YWxpZCBvcHRpb246ICR7dH1gKX19dG9TdHJpbmcodCl7cmV0dXJuIENuKHRoaXMsdCl9fWZ1bmN0aW9uIERuKHQsZSl7cmV0dXJuIHQtZX1xbi5wcm90b3R5cGUua2xhc3M9Ik1hdHJpeCIsInVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJihxbi5wcm90b3R5cGVbU3ltYm9sLmZvcigibm9kZWpzLnV0aWwuaW5zcGVjdC5jdXN0b20iKV09ZnVuY3Rpb24oKXtyZXR1cm4gQ24odGhpcyl9KSxxbi5yYW5kb209cW4ucmFuZCxxbi5yYW5kb21JbnQ9cW4ucmFuZEludCxxbi5kaWFnb25hbD1xbi5kaWFnLHFuLnByb3RvdHlwZS5kaWFnb25hbD1xbi5wcm90b3R5cGUuZGlhZyxxbi5pZGVudGl0eT1xbi5leWUscW4ucHJvdG90eXBlLm5lZ2F0ZT1xbi5wcm90b3R5cGUubmVnLHFuLnByb3RvdHlwZS50ZW5zb3JQcm9kdWN0PXFuLnByb3RvdHlwZS5rcm9uZWNrZXJQcm9kdWN0O2NsYXNzIFVuIGV4dGVuZHMgcW57Y29uc3RydWN0b3IodCxlKXtpZihzdXBlcigpLFVuLmlzTWF0cml4KHQpKXJldHVybiB0LmNsb25lKCk7aWYoTnVtYmVyLmlzSW50ZWdlcih0KSYmdD49MCl7aWYodGhpcy5kYXRhPVtdLCEoTnVtYmVyLmlzSW50ZWdlcihlKSYmZT49MCkpdGhyb3cgbmV3IFR5cGVFcnJvcigibkNvbHVtbnMgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIiKTtmb3IobGV0IHI9MDtyPHQ7cisrKXRoaXMuZGF0YS5wdXNoKG5ldyBGbG9hdDY0QXJyYXkoZSkpfWVsc2V7aWYoIUVuKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXIgb3IgYW4gYXJyYXkiKTt7Y29uc3Qgcj10O2lmKCJudW1iZXIiIT10eXBlb2YoZT0odD1yLmxlbmd0aCk/clswXS5sZW5ndGg6MCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiRGF0YSBtdXN0IGJlIGEgMkQgYXJyYXkgd2l0aCBhdCBsZWFzdCBvbmUgZWxlbWVudCIpO3RoaXMuZGF0YT1bXTtmb3IobGV0IG49MDtuPHQ7bisrKXtpZihyW25dLmxlbmd0aCE9PWUpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluY29uc2lzdGVudCBhcnJheSBkaW1lbnNpb25zIik7aWYoIXJbbl0uZXZlcnkoKHQ9PiJudW1iZXIiPT10eXBlb2YgdCkpKXRocm93IG5ldyBUeXBlRXJyb3IoIklucHV0IGRhdGEgY29udGFpbnMgbm9uLW51bWVyaWMgdmFsdWVzIik7dGhpcy5kYXRhLnB1c2goRmxvYXQ2NEFycmF5LmZyb20ocltuXSkpfX19dGhpcy5yb3dzPXQsdGhpcy5jb2x1bW5zPWV9c2V0KHQsZSxyKXtyZXR1cm4gdGhpcy5kYXRhW3RdW2VdPXIsdGhpc31nZXQodCxlKXtyZXR1cm4gdGhpcy5kYXRhW3RdW2VdfXJlbW92ZVJvdyh0KXtyZXR1cm4gTm4odGhpcyx0KSx0aGlzLmRhdGEuc3BsaWNlKHQsMSksdGhpcy5yb3dzLT0xLHRoaXN9YWRkUm93KHQsZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPXQsdD10aGlzLnJvd3MpLE5uKHRoaXMsdCwhMCksZT1GbG9hdDY0QXJyYXkuZnJvbShGbih0aGlzLGUpKSx0aGlzLmRhdGEuc3BsaWNlKHQsMCxlKSx0aGlzLnJvd3MrPTEsdGhpc31yZW1vdmVDb2x1bW4odCl7a24odGhpcyx0KTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspe2NvbnN0IHI9bmV3IEZsb2F0NjRBcnJheSh0aGlzLmNvbHVtbnMtMSk7Zm9yKGxldCBuPTA7bjx0O24rKylyW25dPXRoaXMuZGF0YVtlXVtuXTtmb3IobGV0IG49dCsxO248dGhpcy5jb2x1bW5zO24rKylyW24tMV09dGhpcy5kYXRhW2VdW25dO3RoaXMuZGF0YVtlXT1yfXJldHVybiB0aGlzLmNvbHVtbnMtPTEsdGhpc31hZGRDb2x1bW4odCxlKXt2b2lkIDA9PT1lJiYoZT10LHQ9dGhpcy5jb2x1bW5zKSxrbih0aGlzLHQsITApLGU9UG4odGhpcyxlKTtmb3IobGV0IHI9MDtyPHRoaXMucm93cztyKyspe2NvbnN0IG49bmV3IEZsb2F0NjRBcnJheSh0aGlzLmNvbHVtbnMrMSk7bGV0IG89MDtmb3IoO288dDtvKyspbltvXT10aGlzLmRhdGFbcl1bb107Zm9yKG5bbysrXT1lW3JdO288dGhpcy5jb2x1bW5zKzE7bysrKW5bb109dGhpcy5kYXRhW3JdW28tMV07dGhpcy5kYXRhW3JdPW59cmV0dXJuIHRoaXMuY29sdW1ucys9MSx0aGlzfX0hZnVuY3Rpb24odCxlKXt0LnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3RoaXMuYWRkUyh0KTp0aGlzLmFkZE0odCl9LHQucHJvdG90eXBlLmFkZFM9ZnVuY3Rpb24odCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKSt0KTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUuYWRkTT1mdW5jdGlvbih0KXtpZih0PWUuY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikrdC5nZXQoZSxyKSk7cmV0dXJuIHRoaXN9LHQuYWRkPWZ1bmN0aW9uKHQscil7cmV0dXJuIG5ldyBlKHQpLmFkZChyKX0sdC5wcm90b3R5cGUuc3ViPWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90aGlzLnN1YlModCk6dGhpcy5zdWJNKHQpfSx0LnByb3RvdHlwZS5zdWJTPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUsciktdCk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLnN1Yk09ZnVuY3Rpb24odCl7aWYodD1lLmNoZWNrTWF0cml4KHQpLHRoaXMucm93cyE9PXQucm93c3x8dGhpcy5jb2x1bW5zIT09dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpLXQuZ2V0KGUscikpO3JldHVybiB0aGlzfSx0LnN1Yj1mdW5jdGlvbih0LHIpe3JldHVybiBuZXcgZSh0KS5zdWIocil9LHQucHJvdG90eXBlLnN1YnRyYWN0PXQucHJvdG90eXBlLnN1Yix0LnByb3RvdHlwZS5zdWJ0cmFjdFM9dC5wcm90b3R5cGUuc3ViUyx0LnByb3RvdHlwZS5zdWJ0cmFjdE09dC5wcm90b3R5cGUuc3ViTSx0LnN1YnRyYWN0PXQuc3ViLHQucHJvdG90eXBlLm11bD1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/dGhpcy5tdWxTKHQpOnRoaXMubXVsTSh0KX0sdC5wcm90b3R5cGUubXVsUz1mdW5jdGlvbih0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpKnQpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5tdWxNPWZ1bmN0aW9uKHQpe2lmKHQ9ZS5jaGVja01hdHJpeCh0KSx0aGlzLnJvd3MhPT10LnJvd3N8fHRoaXMuY29sdW1ucyE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKSp0LmdldChlLHIpKTtyZXR1cm4gdGhpc30sdC5tdWw9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbmV3IGUodCkubXVsKHIpfSx0LnByb3RvdHlwZS5tdWx0aXBseT10LnByb3RvdHlwZS5tdWwsdC5wcm90b3R5cGUubXVsdGlwbHlTPXQucHJvdG90eXBlLm11bFMsdC5wcm90b3R5cGUubXVsdGlwbHlNPXQucHJvdG90eXBlLm11bE0sdC5tdWx0aXBseT10Lm11bCx0LnByb3RvdHlwZS5kaXY9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3RoaXMuZGl2Uyh0KTp0aGlzLmRpdk0odCl9LHQucHJvdG90eXBlLmRpdlM9ZnVuY3Rpb24odCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKS90KTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUuZGl2TT1mdW5jdGlvbih0KXtpZih0PWUuY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikvdC5nZXQoZSxyKSk7cmV0dXJuIHRoaXN9LHQuZGl2PWZ1bmN0aW9uKHQscil7cmV0dXJuIG5ldyBlKHQpLmRpdihyKX0sdC5wcm90b3R5cGUuZGl2aWRlPXQucHJvdG90eXBlLmRpdix0LnByb3RvdHlwZS5kaXZpZGVTPXQucHJvdG90eXBlLmRpdlMsdC5wcm90b3R5cGUuZGl2aWRlTT10LnByb3RvdHlwZS5kaXZNLHQuZGl2aWRlPXQuZGl2LHQucHJvdG90eXBlLm1vZD1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/dGhpcy5tb2RTKHQpOnRoaXMubW9kTSh0KX0sdC5wcm90b3R5cGUubW9kUz1mdW5jdGlvbih0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpJXQpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5tb2RNPWZ1bmN0aW9uKHQpe2lmKHQ9ZS5jaGVja01hdHJpeCh0KSx0aGlzLnJvd3MhPT10LnJvd3N8fHRoaXMuY29sdW1ucyE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKSV0LmdldChlLHIpKTtyZXR1cm4gdGhpc30sdC5tb2Q9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbmV3IGUodCkubW9kKHIpfSx0LnByb3RvdHlwZS5tb2R1bHVzPXQucHJvdG90eXBlLm1vZCx0LnByb3RvdHlwZS5tb2R1bHVzUz10LnByb3RvdHlwZS5tb2RTLHQucHJvdG90eXBlLm1vZHVsdXNNPXQucHJvdG90eXBlLm1vZE0sdC5tb2R1bHVzPXQubW9kLHQucHJvdG90eXBlLmFuZD1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/dGhpcy5hbmRTKHQpOnRoaXMuYW5kTSh0KX0sdC5wcm90b3R5cGUuYW5kUz1mdW5jdGlvbih0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpJnQpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5hbmRNPWZ1bmN0aW9uKHQpe2lmKHQ9ZS5jaGVja01hdHJpeCh0KSx0aGlzLnJvd3MhPT10LnJvd3N8fHRoaXMuY29sdW1ucyE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKSZ0LmdldChlLHIpKTtyZXR1cm4gdGhpc30sdC5hbmQ9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbmV3IGUodCkuYW5kKHIpfSx0LnByb3RvdHlwZS5vcj1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/dGhpcy5vclModCk6dGhpcy5vck0odCl9LHQucHJvdG90eXBlLm9yUz1mdW5jdGlvbih0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpfHQpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5vck09ZnVuY3Rpb24odCl7aWYodD1lLmNoZWNrTWF0cml4KHQpLHRoaXMucm93cyE9PXQucm93c3x8dGhpcy5jb2x1bW5zIT09dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpfHQuZ2V0KGUscikpO3JldHVybiB0aGlzfSx0Lm9yPWZ1bmN0aW9uKHQscil7cmV0dXJuIG5ldyBlKHQpLm9yKHIpfSx0LnByb3RvdHlwZS54b3I9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3RoaXMueG9yUyh0KTp0aGlzLnhvck0odCl9LHQucHJvdG90eXBlLnhvclM9ZnVuY3Rpb24odCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKV50KTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUueG9yTT1mdW5jdGlvbih0KXtpZih0PWUuY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUsciledC5nZXQoZSxyKSk7cmV0dXJuIHRoaXN9LHQueG9yPWZ1bmN0aW9uKHQscil7cmV0dXJuIG5ldyBlKHQpLnhvcihyKX0sdC5wcm90b3R5cGUubGVmdFNoaWZ0PWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90aGlzLmxlZnRTaGlmdFModCk6dGhpcy5sZWZ0U2hpZnRNKHQpfSx0LnByb3RvdHlwZS5sZWZ0U2hpZnRTPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscik8PHQpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5sZWZ0U2hpZnRNPWZ1bmN0aW9uKHQpe2lmKHQ9ZS5jaGVja01hdHJpeCh0KSx0aGlzLnJvd3MhPT10LnJvd3N8fHRoaXMuY29sdW1ucyE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKTw8dC5nZXQoZSxyKSk7cmV0dXJuIHRoaXN9LHQubGVmdFNoaWZ0PWZ1bmN0aW9uKHQscil7cmV0dXJuIG5ldyBlKHQpLmxlZnRTaGlmdChyKX0sdC5wcm90b3R5cGUuc2lnblByb3BhZ2F0aW5nUmlnaHRTaGlmdD1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/dGhpcy5zaWduUHJvcGFnYXRpbmdSaWdodFNoaWZ0Uyh0KTp0aGlzLnNpZ25Qcm9wYWdhdGluZ1JpZ2h0U2hpZnRNKHQpfSx0LnByb3RvdHlwZS5zaWduUHJvcGFnYXRpbmdSaWdodFNoaWZ0Uz1mdW5jdGlvbih0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpPj50KTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUuc2lnblByb3BhZ2F0aW5nUmlnaHRTaGlmdE09ZnVuY3Rpb24odCl7aWYodD1lLmNoZWNrTWF0cml4KHQpLHRoaXMucm93cyE9PXQucm93c3x8dGhpcy5jb2x1bW5zIT09dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpPj50LmdldChlLHIpKTtyZXR1cm4gdGhpc30sdC5zaWduUHJvcGFnYXRpbmdSaWdodFNoaWZ0PWZ1bmN0aW9uKHQscil7cmV0dXJuIG5ldyBlKHQpLnNpZ25Qcm9wYWdhdGluZ1JpZ2h0U2hpZnQocil9LHQucHJvdG90eXBlLnJpZ2h0U2hpZnQ9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3RoaXMucmlnaHRTaGlmdFModCk6dGhpcy5yaWdodFNoaWZ0TSh0KX0sdC5wcm90b3R5cGUucmlnaHRTaGlmdFM9ZnVuY3Rpb24odCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKT4+PnQpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5yaWdodFNoaWZ0TT1mdW5jdGlvbih0KXtpZih0PWUuY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscik+Pj50LmdldChlLHIpKTtyZXR1cm4gdGhpc30sdC5yaWdodFNoaWZ0PWZ1bmN0aW9uKHQscil7cmV0dXJuIG5ldyBlKHQpLnJpZ2h0U2hpZnQocil9LHQucHJvdG90eXBlLnplcm9GaWxsUmlnaHRTaGlmdD10LnByb3RvdHlwZS5yaWdodFNoaWZ0LHQucHJvdG90eXBlLnplcm9GaWxsUmlnaHRTaGlmdFM9dC5wcm90b3R5cGUucmlnaHRTaGlmdFMsdC5wcm90b3R5cGUuemVyb0ZpbGxSaWdodFNoaWZ0TT10LnByb3RvdHlwZS5yaWdodFNoaWZ0TSx0Lnplcm9GaWxsUmlnaHRTaGlmdD10LnJpZ2h0U2hpZnQsdC5wcm90b3R5cGUubm90PWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsfnRoaXMuZ2V0KHQsZSkpO3JldHVybiB0aGlzfSx0Lm5vdD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkubm90KCl9LHQucHJvdG90eXBlLmFicz1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguYWJzKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5hYnM9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmFicygpfSx0LnByb3RvdHlwZS5hY29zPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5hY29zKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5hY29zPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5hY29zKCl9LHQucHJvdG90eXBlLmFjb3NoPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5hY29zaCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuYWNvc2g9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmFjb3NoKCl9LHQucHJvdG90eXBlLmFzaW49ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmFzaW4odGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmFzaW49ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmFzaW4oKX0sdC5wcm90b3R5cGUuYXNpbmg9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmFzaW5oKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5hc2luaD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuYXNpbmgoKX0sdC5wcm90b3R5cGUuYXRhbj1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguYXRhbih0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuYXRhbj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuYXRhbigpfSx0LnByb3RvdHlwZS5hdGFuaD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguYXRhbmgodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmF0YW5oPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5hdGFuaCgpfSx0LnByb3RvdHlwZS5jYnJ0PWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5jYnJ0KHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5jYnJ0PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5jYnJ0KCl9LHQucHJvdG90eXBlLmNlaWw9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmNlaWwodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmNlaWw9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmNlaWwoKX0sdC5wcm90b3R5cGUuY2x6MzI9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmNsejMyKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5jbHozMj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuY2x6MzIoKX0sdC5wcm90b3R5cGUuY29zPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5jb3ModGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmNvcz1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuY29zKCl9LHQucHJvdG90eXBlLmNvc2g9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmNvc2godGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmNvc2g9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmNvc2goKX0sdC5wcm90b3R5cGUuZXhwPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5leHAodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmV4cD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuZXhwKCl9LHQucHJvdG90eXBlLmV4cG0xPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5leHBtMSh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuZXhwbTE9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmV4cG0xKCl9LHQucHJvdG90eXBlLmZsb29yPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5mbG9vcih0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuZmxvb3I9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmZsb29yKCl9LHQucHJvdG90eXBlLmZyb3VuZD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguZnJvdW5kKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5mcm91bmQ9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmZyb3VuZCgpfSx0LnByb3RvdHlwZS5sb2c9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmxvZyh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQubG9nPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5sb2coKX0sdC5wcm90b3R5cGUubG9nMXA9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmxvZzFwKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5sb2cxcD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkubG9nMXAoKX0sdC5wcm90b3R5cGUubG9nMTA9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmxvZzEwKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5sb2cxMD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkubG9nMTAoKX0sdC5wcm90b3R5cGUubG9nMj1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGgubG9nMih0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQubG9nMj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkubG9nMigpfSx0LnByb3RvdHlwZS5yb3VuZD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGgucm91bmQodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LnJvdW5kPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5yb3VuZCgpfSx0LnByb3RvdHlwZS5zaWduPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5zaWduKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5zaWduPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5zaWduKCl9LHQucHJvdG90eXBlLnNpbj1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguc2luKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5zaW49ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLnNpbigpfSx0LnByb3RvdHlwZS5zaW5oPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5zaW5oKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5zaW5oPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5zaW5oKCl9LHQucHJvdG90eXBlLnNxcnQ9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLnNxcnQodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LnNxcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLnNxcnQoKX0sdC5wcm90b3R5cGUudGFuPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC50YW4odGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LnRhbj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkudGFuKCl9LHQucHJvdG90eXBlLnRhbmg9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLnRhbmgodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LnRhbmg9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLnRhbmgoKX0sdC5wcm90b3R5cGUudHJ1bmM9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLnRydW5jKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC50cnVuYz1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkudHJ1bmMoKX0sdC5wb3c9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbmV3IGUodCkucG93KHIpfSx0LnByb3RvdHlwZS5wb3c9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3RoaXMucG93Uyh0KTp0aGlzLnBvd00odCl9LHQucHJvdG90eXBlLnBvd1M9ZnVuY3Rpb24odCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsTWF0aC5wb3codGhpcy5nZXQoZSxyKSx0KSk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLnBvd009ZnVuY3Rpb24odCl7aWYodD1lLmNoZWNrTWF0cml4KHQpLHRoaXMucm93cyE9PXQucm93c3x8dGhpcy5jb2x1bW5zIT09dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscixNYXRoLnBvdyh0aGlzLmdldChlLHIpLHQuZ2V0KGUscikpKTtyZXR1cm4gdGhpc319KHFuLFVuKTtjbGFzcyBMbiBleHRlbmRzIHFue2NvbnN0cnVjdG9yKHQsZSxyKXtzdXBlcigpLHRoaXMubWF0cml4PXQsdGhpcy5yb3dzPWUsdGhpcy5jb2x1bW5zPXJ9fWNsYXNzIEJuIGV4dGVuZHMgTG57Y29uc3RydWN0b3IodCl7c3VwZXIodCx0LmNvbHVtbnMsdC5yb3dzKX1zZXQodCxlLHIpe3JldHVybiB0aGlzLm1hdHJpeC5zZXQoZSx0LHIpLHRoaXN9Z2V0KHQsZSl7cmV0dXJuIHRoaXMubWF0cml4LmdldChlLHQpfX1jbGFzcyBHbiBleHRlbmRzIHFue2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy5kYXRhPXQsdGhpcy5yb3dzPXQubGVuZ3RoLHRoaXMuY29sdW1ucz10WzBdLmxlbmd0aH1zZXQodCxlLHIpe3JldHVybiB0aGlzLmRhdGFbdF1bZV09cix0aGlzfWdldCh0LGUpe3JldHVybiB0aGlzLmRhdGFbdF1bZV19fWZ1bmN0aW9uIFduKHQsZSl7bGV0IHI9MDtyZXR1cm4gTWF0aC5hYnModCk+TWF0aC5hYnMoZSk/KHI9ZS90LE1hdGguYWJzKHQpKk1hdGguc3FydCgxK3IqcikpOjAhPT1lPyhyPXQvZSxNYXRoLmFicyhlKSpNYXRoLnNxcnQoMStyKnIpKTowfWNsYXNzIEtue2NvbnN0cnVjdG9yKHQsZT17fSl7aWYoKHQ9R24uY2hlY2tNYXRyaXgodCkpLmlzRW1wdHkoKSl0aHJvdyBuZXcgRXJyb3IoIk1hdHJpeCBtdXN0IGJlIG5vbi1lbXB0eSIpO2xldCByPXQucm93cyxuPXQuY29sdW1ucztjb25zdHtjb21wdXRlTGVmdFNpbmd1bGFyVmVjdG9yczpvPSEwLGNvbXB1dGVSaWdodFNpbmd1bGFyVmVjdG9yczpzPSEwLGF1dG9UcmFuc3Bvc2U6aT0hMX09ZTtsZXQgdSxhPUJvb2xlYW4obyksbD1Cb29sZWFuKHMpLGg9ITE7aWYocjxuKWlmKGkpe3U9dC50cmFuc3Bvc2UoKSxyPXUucm93cyxuPXUuY29sdW1ucyxoPSEwO2xldCBlPWE7YT1sLGw9ZX1lbHNlIHU9dC5jbG9uZSgpLGNvbnNvbGUud2FybigiQ29tcHV0aW5nIFNWRCBvbiBhIG1hdHJpeCB3aXRoIG1vcmUgY29sdW1ucyB0aGFuIHJvd3MuIENvbnNpZGVyIGVuYWJsaW5nIGF1dG9UcmFuc3Bvc2UiKTtlbHNlIHU9dC5jbG9uZSgpO2xldCBjPU1hdGgubWluKHIsbiksZj1NYXRoLm1pbihyKzEsbiksbT1uZXcgRmxvYXQ2NEFycmF5KGYpLGc9bmV3IFVuKHIsYykscD1uZXcgVW4obixuKSx3PW5ldyBGbG9hdDY0QXJyYXkobiksZD1uZXcgRmxvYXQ2NEFycmF5KHIpLGI9bmV3IEZsb2F0NjRBcnJheShmKTtmb3IobGV0IHQ9MDt0PGY7dCsrKWJbdF09dDtsZXQgeT1NYXRoLm1pbihyLTEsbiksdj1NYXRoLm1heCgwLE1hdGgubWluKG4tMixyKSksTT1NYXRoLm1heCh5LHYpO2ZvcihsZXQgdD0wO3Q8TTt0Kyspe2lmKHQ8eSl7bVt0XT0wO2ZvcihsZXQgZT10O2U8cjtlKyspbVt0XT1XbihtW3RdLHUuZ2V0KGUsdCkpO2lmKDAhPT1tW3RdKXt1LmdldCh0LHQpPDAmJihtW3RdPS1tW3RdKTtmb3IobGV0IGU9dDtlPHI7ZSsrKXUuc2V0KGUsdCx1LmdldChlLHQpL21bdF0pO3Uuc2V0KHQsdCx1LmdldCh0LHQpKzEpfW1bdF09LW1bdF19Zm9yKGxldCBlPXQrMTtlPG47ZSsrKXtpZih0PHkmJjAhPT1tW3RdKXtsZXQgbj0wO2ZvcihsZXQgbz10O288cjtvKyspbis9dS5nZXQobyx0KSp1LmdldChvLGUpO249LW4vdS5nZXQodCx0KTtmb3IobGV0IG89dDtvPHI7bysrKXUuc2V0KG8sZSx1LmdldChvLGUpK24qdS5nZXQobyx0KSl9d1tlXT11LmdldCh0LGUpfWlmKGEmJnQ8eSlmb3IobGV0IGU9dDtlPHI7ZSsrKWcuc2V0KGUsdCx1LmdldChlLHQpKTtpZih0PHYpe3dbdF09MDtmb3IobGV0IGU9dCsxO2U8bjtlKyspd1t0XT1Xbih3W3RdLHdbZV0pO2lmKDAhPT13W3RdKXt3W3QrMV08MCYmKHdbdF09MC13W3RdKTtmb3IobGV0IGU9dCsxO2U8bjtlKyspd1tlXS89d1t0XTt3W3QrMV0rPTF9aWYod1t0XT0td1t0XSx0KzE8ciYmMCE9PXdbdF0pe2ZvcihsZXQgZT10KzE7ZTxyO2UrKylkW2VdPTA7Zm9yKGxldCBlPXQrMTtlPHI7ZSsrKWZvcihsZXQgcj10KzE7cjxuO3IrKylkW2VdKz13W3JdKnUuZ2V0KGUscik7Zm9yKGxldCBlPXQrMTtlPG47ZSsrKXtsZXQgbj0td1tlXS93W3QrMV07Zm9yKGxldCBvPXQrMTtvPHI7bysrKXUuc2V0KG8sZSx1LmdldChvLGUpK24qZFtvXSl9fWlmKGwpZm9yKGxldCBlPXQrMTtlPG47ZSsrKXAuc2V0KGUsdCx3W2VdKX19bGV0IGo9TWF0aC5taW4obixyKzEpO2lmKHk8biYmKG1beV09dS5nZXQoeSx5KSkscjxqJiYobVtqLTFdPTApLHYrMTxqJiYod1t2XT11LmdldCh2LGotMSkpLHdbai0xXT0wLGEpe2ZvcihsZXQgdD15O3Q8Yzt0Kyspe2ZvcihsZXQgZT0wO2U8cjtlKyspZy5zZXQoZSx0LDApO2cuc2V0KHQsdCwxKX1mb3IobGV0IHQ9eS0xO3Q+PTA7dC0tKWlmKDAhPT1tW3RdKXtmb3IobGV0IGU9dCsxO2U8YztlKyspe2xldCBuPTA7Zm9yKGxldCBvPXQ7bzxyO28rKyluKz1nLmdldChvLHQpKmcuZ2V0KG8sZSk7bj0tbi9nLmdldCh0LHQpO2ZvcihsZXQgbz10O288cjtvKyspZy5zZXQobyxlLGcuZ2V0KG8sZSkrbipnLmdldChvLHQpKX1mb3IobGV0IGU9dDtlPHI7ZSsrKWcuc2V0KGUsdCwtZy5nZXQoZSx0KSk7Zy5zZXQodCx0LDErZy5nZXQodCx0KSk7Zm9yKGxldCBlPTA7ZTx0LTE7ZSsrKWcuc2V0KGUsdCwwKX1lbHNle2ZvcihsZXQgZT0wO2U8cjtlKyspZy5zZXQoZSx0LDApO2cuc2V0KHQsdCwxKX19aWYobClmb3IobGV0IHQ9bi0xO3Q+PTA7dC0tKXtpZih0PHYmJjAhPT13W3RdKWZvcihsZXQgZT10KzE7ZTxuO2UrKyl7bGV0IHI9MDtmb3IobGV0IG89dCsxO288bjtvKyspcis9cC5nZXQobyx0KSpwLmdldChvLGUpO3I9LXIvcC5nZXQodCsxLHQpO2ZvcihsZXQgbz10KzE7bzxuO28rKylwLnNldChvLGUscC5nZXQobyxlKStyKnAuZ2V0KG8sdCkpfWZvcihsZXQgZT0wO2U8bjtlKyspcC5zZXQoZSx0LDApO3Auc2V0KHQsdCwxKX1sZXQgeD1qLTEsXz1OdW1iZXIuRVBTSUxPTjtmb3IoO2o+MDspe2xldCB0LGU7Zm9yKHQ9ai0yO3Q+PS0xJiYtMSE9PXQ7dC0tKXtjb25zdCBlPU51bWJlci5NSU5fVkFMVUUrXypNYXRoLmFicyhtW3RdK01hdGguYWJzKG1bdCsxXSkpO2lmKE1hdGguYWJzKHdbdF0pPD1lfHxOdW1iZXIuaXNOYU4od1t0XSkpe3dbdF09MDticmVha319aWYodD09PWotMillPTQ7ZWxzZXtsZXQgcjtmb3Iocj1qLTE7cj49dCYmciE9PXQ7ci0tKXtsZXQgZT0ociE9PWo/TWF0aC5hYnMod1tyXSk6MCkrKHIhPT10KzE/TWF0aC5hYnMod1tyLTFdKTowKTtpZihNYXRoLmFicyhtW3JdKTw9XyplKXttW3JdPTA7YnJlYWt9fXI9PT10P2U9MzpyPT09ai0xP2U9MTooZT0yLHQ9cil9c3dpdGNoKHQrKyxlKXtjYXNlIDE6e2xldCBlPXdbai0yXTt3W2otMl09MDtmb3IobGV0IHI9ai0yO3I+PXQ7ci0tKXtsZXQgbz1XbihtW3JdLGUpLHM9bVtyXS9vLGk9ZS9vO2lmKG1bcl09byxyIT09dCYmKGU9LWkqd1tyLTFdLHdbci0xXT1zKndbci0xXSksbClmb3IobGV0IHQ9MDt0PG47dCsrKW89cypwLmdldCh0LHIpK2kqcC5nZXQodCxqLTEpLHAuc2V0KHQsai0xLC1pKnAuZ2V0KHQscikrcypwLmdldCh0LGotMSkpLHAuc2V0KHQscixvKX1icmVha31jYXNlIDI6e2xldCBlPXdbdC0xXTt3W3QtMV09MDtmb3IobGV0IG49dDtuPGo7bisrKXtsZXQgbz1XbihtW25dLGUpLHM9bVtuXS9vLGk9ZS9vO2lmKG1bbl09byxlPS1pKndbbl0sd1tuXT1zKndbbl0sYSlmb3IobGV0IGU9MDtlPHI7ZSsrKW89cypnLmdldChlLG4pK2kqZy5nZXQoZSx0LTEpLGcuc2V0KGUsdC0xLC1pKmcuZ2V0KGUsbikrcypnLmdldChlLHQtMSkpLGcuc2V0KGUsbixvKX1icmVha31jYXNlIDM6e2NvbnN0IGU9TWF0aC5tYXgoTWF0aC5hYnMobVtqLTFdKSxNYXRoLmFicyhtW2otMl0pLE1hdGguYWJzKHdbai0yXSksTWF0aC5hYnMobVt0XSksTWF0aC5hYnMod1t0XSkpLG89bVtqLTFdL2Uscz1tW2otMl0vZSxpPXdbai0yXS9lLHU9bVt0XS9lLGg9d1t0XS9lLGM9KChzK28pKihzLW8pK2kqaSkvMixmPW8qaSoobyppKTtsZXQgZD0wOzA9PT1jJiYwPT09Znx8KGQ9YzwwPzAtTWF0aC5zcXJ0KGMqYytmKTpNYXRoLnNxcnQoYypjK2YpLGQ9Zi8oYytkKSk7bGV0IGI9KHUrbykqKHUtbykrZCx5PXUqaDtmb3IobGV0IGU9dDtlPGotMTtlKyspe2xldCBvPVduKGIseSk7MD09PW8mJihvPU51bWJlci5NSU5fVkFMVUUpO2xldCBzPWIvbyxpPXkvbztpZihlIT09dCYmKHdbZS0xXT1vKSxiPXMqbVtlXStpKndbZV0sd1tlXT1zKndbZV0taSptW2VdLHk9aSptW2UrMV0sbVtlKzFdPXMqbVtlKzFdLGwpZm9yKGxldCB0PTA7dDxuO3QrKylvPXMqcC5nZXQodCxlKStpKnAuZ2V0KHQsZSsxKSxwLnNldCh0LGUrMSwtaSpwLmdldCh0LGUpK3MqcC5nZXQodCxlKzEpKSxwLnNldCh0LGUsbyk7aWYobz1XbihiLHkpLDA9PT1vJiYobz1OdW1iZXIuTUlOX1ZBTFVFKSxzPWIvbyxpPXkvbyxtW2VdPW8sYj1zKndbZV0raSptW2UrMV0sbVtlKzFdPS1pKndbZV0rcyptW2UrMV0seT1pKndbZSsxXSx3W2UrMV09cyp3W2UrMV0sYSYmZTxyLTEpZm9yKGxldCB0PTA7dDxyO3QrKylvPXMqZy5nZXQodCxlKStpKmcuZ2V0KHQsZSsxKSxnLnNldCh0LGUrMSwtaSpnLmdldCh0LGUpK3MqZy5nZXQodCxlKzEpKSxnLnNldCh0LGUsbyl9d1tqLTJdPWI7YnJlYWt9Y2FzZSA0OmlmKG1bdF08PTAmJihtW3RdPW1bdF08MD8tbVt0XTowLGwpKWZvcihsZXQgZT0wO2U8PXg7ZSsrKXAuc2V0KGUsdCwtcC5nZXQoZSx0KSk7Zm9yKDt0PHgmJiEobVt0XT49bVt0KzFdKTspe2xldCBlPW1bdF07aWYobVt0XT1tW3QrMV0sbVt0KzFdPWUsbCYmdDxuLTEpZm9yKGxldCByPTA7cjxuO3IrKyllPXAuZ2V0KHIsdCsxKSxwLnNldChyLHQrMSxwLmdldChyLHQpKSxwLnNldChyLHQsZSk7aWYoYSYmdDxyLTEpZm9yKGxldCBuPTA7bjxyO24rKyllPWcuZ2V0KG4sdCsxKSxnLnNldChuLHQrMSxnLmdldChuLHQpKSxnLnNldChuLHQsZSk7dCsrfWotLX19aWYoaCl7bGV0IHQ9cDtwPWcsZz10fXRoaXMubT1yLHRoaXMubj1uLHRoaXMucz1tLHRoaXMuVT1nLHRoaXMuVj1wfXNvbHZlKHQpe2xldCBlPXQscj10aGlzLnRocmVzaG9sZCxuPXRoaXMucy5sZW5ndGgsbz1Vbi56ZXJvcyhuLG4pO2ZvcihsZXQgdD0wO3Q8bjt0KyspTWF0aC5hYnModGhpcy5zW3RdKTw9cj9vLnNldCh0LHQsMCk6by5zZXQodCx0LDEvdGhpcy5zW3RdKTtsZXQgcz10aGlzLlUsaT10aGlzLnJpZ2h0U2luZ3VsYXJWZWN0b3JzLHU9aS5tbXVsKG8pLGE9aS5yb3dzLGw9cy5yb3dzLGg9VW4uemVyb3MoYSxsKTtmb3IobGV0IHQ9MDt0PGE7dCsrKWZvcihsZXQgZT0wO2U8bDtlKyspe2xldCByPTA7Zm9yKGxldCBvPTA7bzxuO28rKylyKz11LmdldCh0LG8pKnMuZ2V0KGUsbyk7aC5zZXQodCxlLHIpfXJldHVybiBoLm1tdWwoZSl9c29sdmVGb3JEaWFnb25hbCh0KXtyZXR1cm4gdGhpcy5zb2x2ZShVbi5kaWFnKHQpKX1pbnZlcnNlKCl7bGV0IHQ9dGhpcy5WLGU9dGhpcy50aHJlc2hvbGQscj10LnJvd3Msbj10LmNvbHVtbnMsbz1uZXcgVW4ocix0aGlzLnMubGVuZ3RoKTtmb3IobGV0IHM9MDtzPHI7cysrKWZvcihsZXQgcj0wO3I8bjtyKyspTWF0aC5hYnModGhpcy5zW3JdKT5lJiZvLnNldChzLHIsdC5nZXQocyxyKS90aGlzLnNbcl0pO2xldCBzPXRoaXMuVSxpPXMucm93cyx1PXMuY29sdW1ucyxhPW5ldyBVbihyLGkpO2ZvcihsZXQgdD0wO3Q8cjt0KyspZm9yKGxldCBlPTA7ZTxpO2UrKyl7bGV0IHI9MDtmb3IobGV0IG49MDtuPHU7bisrKXIrPW8uZ2V0KHQsbikqcy5nZXQoZSxuKTthLnNldCh0LGUscil9cmV0dXJuIGF9Z2V0IGNvbmRpdGlvbigpe3JldHVybiB0aGlzLnNbMF0vdGhpcy5zW01hdGgubWluKHRoaXMubSx0aGlzLm4pLTFdfWdldCBub3JtMigpe3JldHVybiB0aGlzLnNbMF19Z2V0IHJhbmsoKXtsZXQgdD1NYXRoLm1heCh0aGlzLm0sdGhpcy5uKSp0aGlzLnNbMF0qTnVtYmVyLkVQU0lMT04sZT0wLHI9dGhpcy5zO2ZvcihsZXQgbj0wLG89ci5sZW5ndGg7bjxvO24rKylyW25dPnQmJmUrKztyZXR1cm4gZX1nZXQgZGlhZ29uYWwoKXtyZXR1cm4gQXJyYXkuZnJvbSh0aGlzLnMpfWdldCB0aHJlc2hvbGQoKXtyZXR1cm4gTnVtYmVyLkVQU0lMT04vMipNYXRoLm1heCh0aGlzLm0sdGhpcy5uKSp0aGlzLnNbMF19Z2V0IGxlZnRTaW5ndWxhclZlY3RvcnMoKXtyZXR1cm4gdGhpcy5VfWdldCByaWdodFNpbmd1bGFyVmVjdG9ycygpe3JldHVybiB0aGlzLlZ9Z2V0IGRpYWdvbmFsTWF0cml4KCl7cmV0dXJuIFVuLmRpYWcodGhpcy5zKX19Y2xhc3MgWW57Y29uc3RydWN0b3IodCxlPXt9KXtjb25zdHthc3N1bWVTeW1tZXRyaWM6cj0hMX09ZTtpZighKHQ9R24uY2hlY2tNYXRyaXgodCkpLmlzU3F1YXJlKCkpdGhyb3cgbmV3IEVycm9yKCJNYXRyaXggaXMgbm90IGEgc3F1YXJlIG1hdHJpeCIpO2lmKHQuaXNFbXB0eSgpKXRocm93IG5ldyBFcnJvcigiTWF0cml4IG11c3QgYmUgbm9uLWVtcHR5Iik7bGV0IG4sbyxzPXQuY29sdW1ucyxpPW5ldyBVbihzLHMpLHU9bmV3IEZsb2F0NjRBcnJheShzKSxhPW5ldyBGbG9hdDY0QXJyYXkocyksbD10LGg9ITE7aWYoaD0hIXJ8fHQuaXNTeW1tZXRyaWMoKSxoKXtmb3Iobj0wO248cztuKyspZm9yKG89MDtvPHM7bysrKWkuc2V0KG4sbyxsLmdldChuLG8pKTshZnVuY3Rpb24odCxlLHIsbil7bGV0IG8scyxpLHUsYSxsLGgsYztmb3IoYT0wO2E8dDthKyspclthXT1uLmdldCh0LTEsYSk7Zm9yKHU9dC0xO3U+MDt1LS0pe2ZvcihjPTAsaT0wLGw9MDtsPHU7bCsrKWMrPU1hdGguYWJzKHJbbF0pO2lmKDA9PT1jKWZvcihlW3VdPXJbdS0xXSxhPTA7YTx1O2ErKylyW2FdPW4uZ2V0KHUtMSxhKSxuLnNldCh1LGEsMCksbi5zZXQoYSx1LDApO2Vsc2V7Zm9yKGw9MDtsPHU7bCsrKXJbbF0vPWMsaSs9cltsXSpyW2xdO2ZvcihvPXJbdS0xXSxzPU1hdGguc3FydChpKSxvPjAmJihzPS1zKSxlW3VdPWMqcyxpLT1vKnMsclt1LTFdPW8tcyxhPTA7YTx1O2ErKyllW2FdPTA7Zm9yKGE9MDthPHU7YSsrKXtmb3Iobz1yW2FdLG4uc2V0KGEsdSxvKSxzPWVbYV0rbi5nZXQoYSxhKSpvLGw9YSsxO2w8PXUtMTtsKyspcys9bi5nZXQobCxhKSpyW2xdLGVbbF0rPW4uZ2V0KGwsYSkqbztlW2FdPXN9Zm9yKG89MCxhPTA7YTx1O2ErKyllW2FdLz1pLG8rPWVbYV0qclthXTtmb3IoaD1vLyhpK2kpLGE9MDthPHU7YSsrKWVbYV0tPWgqclthXTtmb3IoYT0wO2E8dTthKyspe2ZvcihvPXJbYV0scz1lW2FdLGw9YTtsPD11LTE7bCsrKW4uc2V0KGwsYSxuLmdldChsLGEpLShvKmVbbF0rcypyW2xdKSk7clthXT1uLmdldCh1LTEsYSksbi5zZXQodSxhLDApfX1yW3VdPWl9Zm9yKHU9MDt1PHQtMTt1Kyspe2lmKG4uc2V0KHQtMSx1LG4uZ2V0KHUsdSkpLG4uc2V0KHUsdSwxKSxpPXJbdSsxXSwwIT09aSl7Zm9yKGw9MDtsPD11O2wrKylyW2xdPW4uZ2V0KGwsdSsxKS9pO2ZvcihhPTA7YTw9dTthKyspe2ZvcihzPTAsbD0wO2w8PXU7bCsrKXMrPW4uZ2V0KGwsdSsxKSpuLmdldChsLGEpO2ZvcihsPTA7bDw9dTtsKyspbi5zZXQobCxhLG4uZ2V0KGwsYSktcypyW2xdKX19Zm9yKGw9MDtsPD11O2wrKyluLnNldChsLHUrMSwwKX1mb3IoYT0wO2E8dDthKyspclthXT1uLmdldCh0LTEsYSksbi5zZXQodC0xLGEsMCk7bi5zZXQodC0xLHQtMSwxKSxlWzBdPTB9KHMsYSx1LGkpLGZ1bmN0aW9uKHQsZSxyLG4pe2xldCBvLHMsaSx1LGEsbCxoLGMsZixtLGcscCx3LGQsYix5O2ZvcihpPTE7aTx0O2krKyllW2ktMV09ZVtpXTtlW3QtMV09MDtsZXQgdj0wLE09MCxqPU51bWJlci5FUFNJTE9OO2ZvcihsPTA7bDx0O2wrKyl7Zm9yKE09TWF0aC5tYXgoTSxNYXRoLmFicyhyW2xdKStNYXRoLmFicyhlW2xdKSksaD1sO2g8dCYmIShNYXRoLmFicyhlW2hdKTw9aipNKTspaCsrO2lmKGg+bClkb3tmb3Iobz1yW2xdLGM9KHJbbCsxXS1vKS8oMiplW2xdKSxmPVduKGMsMSksYzwwJiYoZj0tZikscltsXT1lW2xdLyhjK2YpLHJbbCsxXT1lW2xdKihjK2YpLG09cltsKzFdLHM9by1yW2xdLGk9bCsyO2k8dDtpKyspcltpXS09cztmb3Iodis9cyxjPXJbaF0sZz0xLHA9Zyx3PWcsZD1lW2wrMV0sYj0wLHk9MCxpPWgtMTtpPj1sO2ktLSlmb3Iodz1wLHA9Zyx5PWIsbz1nKmVbaV0scz1nKmMsZj1XbihjLGVbaV0pLGVbaSsxXT1iKmYsYj1lW2ldL2YsZz1jL2YsYz1nKnJbaV0tYipvLHJbaSsxXT1zK2IqKGcqbytiKnJbaV0pLGE9MDthPHQ7YSsrKXM9bi5nZXQoYSxpKzEpLG4uc2V0KGEsaSsxLGIqbi5nZXQoYSxpKStnKnMpLG4uc2V0KGEsaSxnKm4uZ2V0KGEsaSktYipzKTtjPS1iKnkqdypkKmVbbF0vbSxlW2xdPWIqYyxyW2xdPWcqY313aGlsZShNYXRoLmFicyhlW2xdKT5qKk0pO3JbbF09cltsXSt2LGVbbF09MH1mb3IoaT0wO2k8dC0xO2krKyl7Zm9yKGE9aSxjPXJbaV0sdT1pKzE7dTx0O3UrKylyW3VdPGMmJihhPXUsYz1yW3VdKTtpZihhIT09aSlmb3IoclthXT1yW2ldLHJbaV09Yyx1PTA7dTx0O3UrKyljPW4uZ2V0KHUsaSksbi5zZXQodSxpLG4uZ2V0KHUsYSkpLG4uc2V0KHUsYSxjKX19KHMsYSx1LGkpfWVsc2V7bGV0IHQ9bmV3IFVuKHMscyksZT1uZXcgRmxvYXQ2NEFycmF5KHMpO2ZvcihvPTA7bzxzO28rKylmb3Iobj0wO248cztuKyspdC5zZXQobixvLGwuZ2V0KG4sbykpOyFmdW5jdGlvbih0LGUscixuKXtsZXQgbyxzLGksdSxhLGwsaCxjPTAsZj10LTE7Zm9yKGw9YysxO2w8PWYtMTtsKyspe2ZvcihoPTAsdT1sO3U8PWY7dSsrKWgrPU1hdGguYWJzKGUuZ2V0KHUsbC0xKSk7aWYoMCE9PWgpe2ZvcihpPTAsdT1mO3U+PWw7dS0tKXJbdV09ZS5nZXQodSxsLTEpL2gsaSs9clt1XSpyW3VdO2ZvcihzPU1hdGguc3FydChpKSxyW2xdPjAmJihzPS1zKSxpLT1yW2xdKnMscltsXT1yW2xdLXMsYT1sO2E8dDthKyspe2ZvcihvPTAsdT1mO3U+PWw7dS0tKW8rPXJbdV0qZS5nZXQodSxhKTtmb3Ioby89aSx1PWw7dTw9Zjt1KyspZS5zZXQodSxhLGUuZ2V0KHUsYSktbypyW3VdKX1mb3IodT0wO3U8PWY7dSsrKXtmb3Iobz0wLGE9ZjthPj1sO2EtLSlvKz1yW2FdKmUuZ2V0KHUsYSk7Zm9yKG8vPWksYT1sO2E8PWY7YSsrKWUuc2V0KHUsYSxlLmdldCh1LGEpLW8qclthXSl9cltsXT1oKnJbbF0sZS5zZXQobCxsLTEsaCpzKX19Zm9yKHU9MDt1PHQ7dSsrKWZvcihhPTA7YTx0O2ErKyluLnNldCh1LGEsdT09PWE/MTowKTtmb3IobD1mLTE7bD49YysxO2wtLSlpZigwIT09ZS5nZXQobCxsLTEpKXtmb3IodT1sKzE7dTw9Zjt1Kyspclt1XT1lLmdldCh1LGwtMSk7Zm9yKGE9bDthPD1mO2ErKyl7Zm9yKHM9MCx1PWw7dTw9Zjt1Kyspcys9clt1XSpuLmdldCh1LGEpO2ZvcihzPXMvcltsXS9lLmdldChsLGwtMSksdT1sO3U8PWY7dSsrKW4uc2V0KHUsYSxuLmdldCh1LGEpK3Mqclt1XSl9fX0ocyx0LGUsaSksZnVuY3Rpb24odCxlLHIsbixvKXtsZXQgcyxpLHUsYSxsLGgsYyxmLG0sZyxwLHcsZCxiLHksdj10LTEsTT0wLGo9dC0xLHg9TnVtYmVyLkVQU0lMT04sXz0wLEU9MCxTPTAsTz0wLEE9MCxDPTAsUj0wLEk9MDtmb3Iocz0wO3M8dDtzKyspZm9yKChzPE18fHM+aikmJihyW3NdPW8uZ2V0KHMscyksZVtzXT0wKSxpPU1hdGgubWF4KHMtMSwwKTtpPHQ7aSsrKUUrPU1hdGguYWJzKG8uZ2V0KHMsaSkpO2Zvcig7dj49TTspe2ZvcihhPXY7YT5NJiYoQz1NYXRoLmFicyhvLmdldChhLTEsYS0xKSkrTWF0aC5hYnMoby5nZXQoYSxhKSksMD09PUMmJihDPUUpLCEoTWF0aC5hYnMoby5nZXQoYSxhLTEpKTx4KkMpKTspYS0tO2lmKGE9PT12KW8uc2V0KHYsdixvLmdldCh2LHYpK18pLHJbdl09by5nZXQodix2KSxlW3ZdPTAsdi0tLEk9MDtlbHNlIGlmKGE9PT12LTEpe2lmKGM9by5nZXQodix2LTEpKm8uZ2V0KHYtMSx2KSxTPShvLmdldCh2LTEsdi0xKS1vLmdldCh2LHYpKS8yLE89UypTK2MsUj1NYXRoLnNxcnQoTWF0aC5hYnMoTykpLG8uc2V0KHYsdixvLmdldCh2LHYpK18pLG8uc2V0KHYtMSx2LTEsby5nZXQodi0xLHYtMSkrXyksZj1vLmdldCh2LHYpLE8+PTApe2ZvcihSPVM+PTA/UytSOlMtUixyW3YtMV09ZitSLHJbdl09clt2LTFdLDAhPT1SJiYoclt2XT1mLWMvUiksZVt2LTFdPTAsZVt2XT0wLGY9by5nZXQodix2LTEpLEM9TWF0aC5hYnMoZikrTWF0aC5hYnMoUiksUz1mL0MsTz1SL0MsQT1NYXRoLnNxcnQoUypTK08qTyksUy89QSxPLz1BLGk9di0xO2k8dDtpKyspUj1vLmdldCh2LTEsaSksby5zZXQodi0xLGksTypSK1Mqby5nZXQodixpKSksby5zZXQodixpLE8qby5nZXQodixpKS1TKlIpO2ZvcihzPTA7czw9djtzKyspUj1vLmdldChzLHYtMSksby5zZXQocyx2LTEsTypSK1Mqby5nZXQocyx2KSksby5zZXQocyx2LE8qby5nZXQocyx2KS1TKlIpO2ZvcihzPU07czw9ajtzKyspUj1uLmdldChzLHYtMSksbi5zZXQocyx2LTEsTypSK1Mqbi5nZXQocyx2KSksbi5zZXQocyx2LE8qbi5nZXQocyx2KS1TKlIpfWVsc2Ugclt2LTFdPWYrUyxyW3ZdPWYrUyxlW3YtMV09UixlW3ZdPS1SO3YtPTIsST0wfWVsc2V7aWYoZj1vLmdldCh2LHYpLG09MCxjPTAsYTx2JiYobT1vLmdldCh2LTEsdi0xKSxjPW8uZ2V0KHYsdi0xKSpvLmdldCh2LTEsdikpLDEwPT09SSl7Zm9yKF8rPWYscz1NO3M8PXY7cysrKW8uc2V0KHMscyxvLmdldChzLHMpLWYpO0M9TWF0aC5hYnMoby5nZXQodix2LTEpKStNYXRoLmFicyhvLmdldCh2LTEsdi0yKSksZj1tPS43NSpDLGM9LS40Mzc1KkMqQ31pZigzMD09PUkmJihDPShtLWYpLzIsQz1DKkMrYyxDPjApKXtmb3IoQz1NYXRoLnNxcnQoQyksbTxmJiYoQz0tQyksQz1mLWMvKChtLWYpLzIrQykscz1NO3M8PXY7cysrKW8uc2V0KHMscyxvLmdldChzLHMpLUMpO18rPUMsZj1tPWM9Ljk2NH1mb3IoSSs9MSxsPXYtMjtsPj1hJiYoUj1vLmdldChsLGwpLEE9Zi1SLEM9bS1SLFM9KEEqQy1jKS9vLmdldChsKzEsbCkrby5nZXQobCxsKzEpLE89by5nZXQobCsxLGwrMSktUi1BLUMsQT1vLmdldChsKzIsbCsxKSxDPU1hdGguYWJzKFMpK01hdGguYWJzKE8pK01hdGguYWJzKEEpLFMvPUMsTy89QyxBLz1DLGwhPT1hKSYmIShNYXRoLmFicyhvLmdldChsLGwtMSkpKihNYXRoLmFicyhPKStNYXRoLmFicyhBKSk8eCooTWF0aC5hYnMoUykqKE1hdGguYWJzKG8uZ2V0KGwtMSxsLTEpKStNYXRoLmFicyhSKStNYXRoLmFicyhvLmdldChsKzEsbCsxKSkpKSk7KWwtLTtmb3Iocz1sKzI7czw9djtzKyspby5zZXQocyxzLTIsMCkscz5sKzImJm8uc2V0KHMscy0zLDApO2Zvcih1PWw7dTw9di0xJiYoYj11IT09di0xLHUhPT1sJiYoUz1vLmdldCh1LHUtMSksTz1vLmdldCh1KzEsdS0xKSxBPWI/by5nZXQodSsyLHUtMSk6MCxmPU1hdGguYWJzKFMpK01hdGguYWJzKE8pK01hdGguYWJzKEEpLDAhPT1mJiYoUy89ZixPLz1mLEEvPWYpKSwwIT09Zik7dSsrKWlmKEM9TWF0aC5zcXJ0KFMqUytPKk8rQSpBKSxTPDAmJihDPS1DKSwwIT09Qyl7Zm9yKHUhPT1sP28uc2V0KHUsdS0xLC1DKmYpOmEhPT1sJiZvLnNldCh1LHUtMSwtby5nZXQodSx1LTEpKSxTKz1DLGY9Uy9DLG09Ty9DLFI9QS9DLE8vPVMsQS89UyxpPXU7aTx0O2krKylTPW8uZ2V0KHUsaSkrTypvLmdldCh1KzEsaSksYiYmKFMrPUEqby5nZXQodSsyLGkpLG8uc2V0KHUrMixpLG8uZ2V0KHUrMixpKS1TKlIpKSxvLnNldCh1LGksby5nZXQodSxpKS1TKmYpLG8uc2V0KHUrMSxpLG8uZ2V0KHUrMSxpKS1TKm0pO2ZvcihzPTA7czw9TWF0aC5taW4odix1KzMpO3MrKylTPWYqby5nZXQocyx1KSttKm8uZ2V0KHMsdSsxKSxiJiYoUys9UipvLmdldChzLHUrMiksby5zZXQocyx1KzIsby5nZXQocyx1KzIpLVMqQSkpLG8uc2V0KHMsdSxvLmdldChzLHUpLVMpLG8uc2V0KHMsdSsxLG8uZ2V0KHMsdSsxKS1TKk8pO2ZvcihzPU07czw9ajtzKyspUz1mKm4uZ2V0KHMsdSkrbSpuLmdldChzLHUrMSksYiYmKFMrPVIqbi5nZXQocyx1KzIpLG4uc2V0KHMsdSsyLG4uZ2V0KHMsdSsyKS1TKkEpKSxuLnNldChzLHUsbi5nZXQocyx1KS1TKSxuLnNldChzLHUrMSxuLmdldChzLHUrMSktUypPKX19fWlmKDA9PT1FKXJldHVybjtmb3Iodj10LTE7dj49MDt2LS0paWYoUz1yW3ZdLE89ZVt2XSwwPT09Tylmb3IoYT12LG8uc2V0KHYsdiwxKSxzPXYtMTtzPj0wO3MtLSl7Zm9yKGM9by5nZXQocyxzKS1TLEE9MCxpPWE7aTw9djtpKyspQSs9by5nZXQocyxpKSpvLmdldChpLHYpO2lmKGVbc108MClSPWMsQz1BO2Vsc2UgaWYoYT1zLDA9PT1lW3NdP28uc2V0KHMsdiwwIT09Yz8tQS9jOi1BLyh4KkUpKTooZj1vLmdldChzLHMrMSksbT1vLmdldChzKzEscyksTz0ocltzXS1TKSoocltzXS1TKStlW3NdKmVbc10saD0oZipDLVIqQSkvTyxvLnNldChzLHYsaCksby5zZXQocysxLHYsTWF0aC5hYnMoZik+TWF0aC5hYnMoUik/KC1BLWMqaCkvZjooLUMtbSpoKS9SKSksaD1NYXRoLmFicyhvLmdldChzLHYpKSx4KmgqaD4xKWZvcihpPXM7aTw9djtpKyspby5zZXQoaSx2LG8uZ2V0KGksdikvaCl9ZWxzZSBpZihPPDApZm9yKGE9di0xLE1hdGguYWJzKG8uZ2V0KHYsdi0xKSk+TWF0aC5hYnMoby5nZXQodi0xLHYpKT8oby5zZXQodi0xLHYtMSxPL28uZ2V0KHYsdi0xKSksby5zZXQodi0xLHYsLShvLmdldCh2LHYpLVMpL28uZ2V0KHYsdi0xKSkpOih5PVhuKDAsLW8uZ2V0KHYtMSx2KSxvLmdldCh2LTEsdi0xKS1TLE8pLG8uc2V0KHYtMSx2LTEseVswXSksby5zZXQodi0xLHYseVsxXSkpLG8uc2V0KHYsdi0xLDApLG8uc2V0KHYsdiwxKSxzPXYtMjtzPj0wO3MtLSl7Zm9yKGc9MCxwPTAsaT1hO2k8PXY7aSsrKWcrPW8uZ2V0KHMsaSkqby5nZXQoaSx2LTEpLHArPW8uZ2V0KHMsaSkqby5nZXQoaSx2KTtpZihjPW8uZ2V0KHMscyktUyxlW3NdPDApUj1jLEE9ZyxDPXA7ZWxzZSBpZihhPXMsMD09PWVbc10/KHk9WG4oLWcsLXAsYyxPKSxvLnNldChzLHYtMSx5WzBdKSxvLnNldChzLHYseVsxXSkpOihmPW8uZ2V0KHMscysxKSxtPW8uZ2V0KHMrMSxzKSx3PShyW3NdLVMpKihyW3NdLVMpK2Vbc10qZVtzXS1PKk8sZD0yKihyW3NdLVMpKk8sMD09PXcmJjA9PT1kJiYodz14KkUqKE1hdGguYWJzKGMpK01hdGguYWJzKE8pK01hdGguYWJzKGYpK01hdGguYWJzKG0pK01hdGguYWJzKFIpKSkseT1YbihmKkEtUipnK08qcCxmKkMtUipwLU8qZyx3LGQpLG8uc2V0KHMsdi0xLHlbMF0pLG8uc2V0KHMsdix5WzFdKSxNYXRoLmFicyhmKT5NYXRoLmFicyhSKStNYXRoLmFicyhPKT8oby5zZXQocysxLHYtMSwoLWctYypvLmdldChzLHYtMSkrTypvLmdldChzLHYpKS9mKSxvLnNldChzKzEsdiwoLXAtYypvLmdldChzLHYpLU8qby5nZXQocyx2LTEpKS9mKSk6KHk9WG4oLUEtbSpvLmdldChzLHYtMSksLUMtbSpvLmdldChzLHYpLFIsTyksby5zZXQocysxLHYtMSx5WzBdKSxvLnNldChzKzEsdix5WzFdKSkpLGg9TWF0aC5tYXgoTWF0aC5hYnMoby5nZXQocyx2LTEpKSxNYXRoLmFicyhvLmdldChzLHYpKSkseCpoKmg+MSlmb3IoaT1zO2k8PXY7aSsrKW8uc2V0KGksdi0xLG8uZ2V0KGksdi0xKS9oKSxvLnNldChpLHYsby5nZXQoaSx2KS9oKX1mb3Iocz0wO3M8dDtzKyspaWYoczxNfHxzPmopZm9yKGk9cztpPHQ7aSsrKW4uc2V0KHMsaSxvLmdldChzLGkpKTtmb3IoaT10LTE7aT49TTtpLS0pZm9yKHM9TTtzPD1qO3MrKyl7Zm9yKFI9MCx1PU07dTw9TWF0aC5taW4oaSxqKTt1KyspUis9bi5nZXQocyx1KSpvLmdldCh1LGkpO24uc2V0KHMsaSxSKX19KHMsYSx1LGksdCl9dGhpcy5uPXMsdGhpcy5lPWEsdGhpcy5kPXUsdGhpcy5WPWl9Z2V0IHJlYWxFaWdlbnZhbHVlcygpe3JldHVybiBBcnJheS5mcm9tKHRoaXMuZCl9Z2V0IGltYWdpbmFyeUVpZ2VudmFsdWVzKCl7cmV0dXJuIEFycmF5LmZyb20odGhpcy5lKX1nZXQgZWlnZW52ZWN0b3JNYXRyaXgoKXtyZXR1cm4gdGhpcy5WfWdldCBkaWFnb25hbE1hdHJpeCgpe2xldCB0LGUscj10aGlzLm4sbj10aGlzLmUsbz10aGlzLmQscz1uZXcgVW4ocixyKTtmb3IodD0wO3Q8cjt0Kyspe2ZvcihlPTA7ZTxyO2UrKylzLnNldCh0LGUsMCk7cy5zZXQodCx0LG9bdF0pLG5bdF0+MD9zLnNldCh0LHQrMSxuW3RdKTpuW3RdPDAmJnMuc2V0KHQsdC0xLG5bdF0pfXJldHVybiBzfX1mdW5jdGlvbiBYbih0LGUscixuKXtsZXQgbyxzO3JldHVybiBNYXRoLmFicyhyKT5NYXRoLmFicyhuKT8obz1uL3Iscz1yK28qbixbKHQrbyplKS9zLChlLW8qdCkvc10pOihvPXIvbixzPW4rbypyLFsobyp0K2UpL3MsKG8qZS10KS9zXSl9Y2xhc3MgSm57Y29uc3RydWN0b3IodCxlPXt9KXt0PUduLmNoZWNrTWF0cml4KHQpO2xldHtZOnJ9PWU7Y29uc3R7c2NhbGVTY29yZXM6bj0hMSxtYXhJdGVyYXRpb25zOm89MWUzLHRlcm1pbmF0aW9uQ3JpdGVyaWE6cz0xZS0xMH09ZTtsZXQgaTtpZihyKXtpZihyPUVuKHIpJiYibnVtYmVyIj09dHlwZW9mIHJbMF0/VW4uY29sdW1uVmVjdG9yKHIpOkduLmNoZWNrTWF0cml4KHIpLHIucm93cyE9PXQucm93cyl0aHJvdyBuZXcgRXJyb3IoIlkgc2hvdWxkIGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIHJvd3MgYXMgWCIpO2k9ci5nZXRDb2x1bW5WZWN0b3IoMCl9ZWxzZSBpPXQuZ2V0Q29sdW1uVmVjdG9yKDApO2xldCB1LGEsbCxoLGM9MTtmb3IobGV0IGU9MDtlPG8mJmM+cztlKyspbD10LnRyYW5zcG9zZSgpLm1tdWwoaSkuZGl2KGkudHJhbnNwb3NlKCkubW11bChpKS5nZXQoMCwwKSksbD1sLmRpdihsLm5vcm0oKSksdT10Lm1tdWwobCkuZGl2KGwudHJhbnNwb3NlKCkubW11bChsKS5nZXQoMCwwKSksZT4wJiYoYz11LmNsb25lKCkuc3ViKGgpLnBvdygyKS5zdW0oKSksaD11LmNsb25lKCkscj8oYT1yLnRyYW5zcG9zZSgpLm1tdWwodSkuZGl2KHUudHJhbnNwb3NlKCkubW11bCh1KS5nZXQoMCwwKSksYT1hLmRpdihhLm5vcm0oKSksaT1yLm1tdWwoYSkuZGl2KGEudHJhbnNwb3NlKCkubW11bChhKS5nZXQoMCwwKSkpOmk9dTtpZihyKXtsZXQgZT10LnRyYW5zcG9zZSgpLm1tdWwodSkuZGl2KHUudHJhbnNwb3NlKCkubW11bCh1KS5nZXQoMCwwKSk7ZT1lLmRpdihlLm5vcm0oKSk7bGV0IG49dC5jbG9uZSgpLnN1Yih1LmNsb25lKCkubW11bChlLnRyYW5zcG9zZSgpKSksbz1pLnRyYW5zcG9zZSgpLm1tdWwodSkuZGl2KHUudHJhbnNwb3NlKCkubW11bCh1KS5nZXQoMCwwKSkscz1yLmNsb25lKCkuc3ViKHUuY2xvbmUoKS5tdWxTKG8uZ2V0KDAsMCkpLm1tdWwoYS50cmFuc3Bvc2UoKSkpO3RoaXMudD11LHRoaXMucD1lLnRyYW5zcG9zZSgpLHRoaXMudz1sLnRyYW5zcG9zZSgpLHRoaXMucT1hLHRoaXMudT1pLHRoaXMucz11LnRyYW5zcG9zZSgpLm1tdWwodSksdGhpcy54UmVzaWR1YWw9bix0aGlzLnlSZXNpZHVhbD1zLHRoaXMuYmV0YXM9b31lbHNlIHRoaXMudz1sLnRyYW5zcG9zZSgpLHRoaXMucz11LnRyYW5zcG9zZSgpLm1tdWwodSkuc3FydCgpLHRoaXMudD1uP3UuY2xvbmUoKS5kaXYodGhpcy5zLmdldCgwLDApKTp1LHRoaXMueFJlc2lkdWFsPXQuc3ViKHUubW11bChsLnRyYW5zcG9zZSgpKSl9fWxldCBabj1jbGFzcyB0e2NvbnN0cnVjdG9yKHQsZT17fSxyKXtpZih0aGlzLlU9bnVsbCx0aGlzLlM9bnVsbCxyKXJldHVybiB0aGlzLmNlbnRlcj1yLmNlbnRlcix0aGlzLnNjYWxlPXIuc2NhbGUsdGhpcy5tZWFucz1yLm1lYW5zLHRoaXMuc3RkZXZzPXIuc3RkZXZzLHRoaXMuVT1Vbi5jaGVja01hdHJpeChyLlUpLHRoaXMuUz1yLlMsdGhpcy5SPXIuUix2b2lkKHRoaXMuZXhjbHVkZWRGZWF0dXJlcz1yLmV4Y2x1ZGVkRmVhdHVyZXN8fFtdKTtsZXQgbjtuPShBcnJheS5pc0FycmF5KHQpLG5ldyBVbih0KSk7Y29uc3R7aXNDb3ZhcmlhbmNlTWF0cml4Om89ITEsbWV0aG9kOnM9IlNWRCIsbkNvbXBOSVBBTFM6aT0yLGNlbnRlcjp1PSEwLHNjYWxlOmE9ITEsaWdub3JlWmVyb1ZhcmlhbmNlOmw9ITF9PWU7aWYodGhpcy5jZW50ZXI9dSx0aGlzLnNjYWxlPWEsdGhpcy5tZWFucz1udWxsLHRoaXMuc3RkZXZzPW51bGwsdGhpcy5leGNsdWRlZEZlYXR1cmVzPVtdLG8pdGhpcy5fY29tcHV0ZUZyb21Db3ZhcmlhbmNlTWF0cml4KG4pO2Vsc2Ugc3dpdGNoKHRoaXMuX2FkanVzdChuLGwpLHMpe2Nhc2UiY292YXJpYW5jZU1hdHJpeCI6e2NvbnN0IHQ9bmV3IEJuKG4pLm1tdWwobikuZGl2KG4ucm93cy0xKTt0aGlzLl9jb21wdXRlRnJvbUNvdmFyaWFuY2VNYXRyaXgodCk7YnJlYWt9Y2FzZSJOSVBBTFMiOnRoaXMuX2NvbXB1dGVXaXRoTklQQUxTKG4saSk7YnJlYWs7Y2FzZSJTVkQiOntjb25zdCB0PW5ldyBLbihuLHtjb21wdXRlTGVmdFNpbmd1bGFyVmVjdG9yczohMSxjb21wdXRlUmlnaHRTaW5ndWxhclZlY3RvcnM6ITAsYXV0b1RyYW5zcG9zZTohMH0pO3RoaXMuVT10LnJpZ2h0U2luZ3VsYXJWZWN0b3JzO2NvbnN0IGU9dC5kaWFnb25hbCxyPVtdO2Zvcihjb25zdCB0IG9mIGUpci5wdXNoKHQqdC8obi5yb3dzLTEpKTt0aGlzLlM9cjticmVha31kZWZhdWx0OnRocm93IG5ldyBFcnJvcihgdW5rbm93biBtZXRob2Q6ICR7c31gKX19c3RhdGljIGxvYWQoZSl7aWYoInN0cmluZyIhPXR5cGVvZiBlLm5hbWUpdGhyb3cgbmV3IFR5cGVFcnJvcigibW9kZWwgbXVzdCBoYXZlIGEgbmFtZSBwcm9wZXJ0eSIpO2lmKCJQQ0EiIT09ZS5uYW1lKXRocm93IG5ldyBSYW5nZUVycm9yKGBpbnZhbGlkIG1vZGVsOiAke2UubmFtZX1gKTtyZXR1cm4gbmV3IHQodm9pZCAwLHZvaWQgMCxlKX1wcmVkaWN0KHQsZT17fSl7Y29uc3R7bkNvbXBvbmVudHM6cj10aGlzLlUuY29sdW1uc309ZTtsZXQgbjtpZihuPShBcnJheS5pc0FycmF5KHQpLG5ldyBVbih0KSksdGhpcy5jZW50ZXImJihuLnN1YlJvd1ZlY3Rvcih0aGlzLm1lYW5zKSx0aGlzLnNjYWxlKSl7Zm9yKGxldCB0IG9mIHRoaXMuZXhjbHVkZWRGZWF0dXJlcyluLnJlbW92ZUNvbHVtbih0KTtuLmRpdlJvd1ZlY3Rvcih0aGlzLnN0ZGV2cyl9bGV0IG89bi5tbXVsKHRoaXMuVSk7cmV0dXJuIG8uc3ViTWF0cml4KDAsby5yb3dzLTEsMCxyLTEpfWludmVydCh0KXtsZXQgZT0odD1Vbi5jaGVja01hdHJpeCh0KSkubW11bCh0aGlzLlUudHJhbnNwb3NlKCkpO3JldHVybiB0aGlzLmNlbnRlciYmKHRoaXMuc2NhbGUmJmUubXVsUm93VmVjdG9yKHRoaXMuc3RkZXZzKSxlLmFkZFJvd1ZlY3Rvcih0aGlzLm1lYW5zKSksZX1nZXRFeHBsYWluZWRWYXJpYW5jZSgpe2xldCB0PTA7aWYodGhpcy5TKWZvcihjb25zdCBlIG9mIHRoaXMuUyl0Kz1lO3JldHVybiB0aGlzLlM/dGhpcy5TLm1hcCgoZT0+ZS90KSk6W119Z2V0Q3VtdWxhdGl2ZVZhcmlhbmNlKCl7bGV0IHQ9dGhpcy5nZXRFeHBsYWluZWRWYXJpYW5jZSgpO2ZvcihsZXQgZT0xO2U8dC5sZW5ndGg7ZSsrKXRbZV0rPXRbZS0xXTtyZXR1cm4gdH1nZXRFaWdlbnZlY3RvcnMoKXtyZXR1cm4gdGhpcy5VfWdldEVpZ2VudmFsdWVzKCl7cmV0dXJuIHRoaXMuU31nZXRTdGFuZGFyZERldmlhdGlvbnMoKXtyZXR1cm4gdGhpcy5TLm1hcCgodD0+TWF0aC5zcXJ0KHQpKSl9Z2V0TG9hZGluZ3MoKXtyZXR1cm4gdGhpcy5VLnRyYW5zcG9zZSgpfXRvSlNPTigpe3JldHVybntuYW1lOiJQQ0EiLGNlbnRlcjp0aGlzLmNlbnRlcixzY2FsZTp0aGlzLnNjYWxlLG1lYW5zOnRoaXMubWVhbnMsc3RkZXZzOnRoaXMuc3RkZXZzLFU6dGhpcy5VLFM6dGhpcy5TLGV4Y2x1ZGVkRmVhdHVyZXM6dGhpcy5leGNsdWRlZEZlYXR1cmVzfX1fYWRqdXN0KHQsZSl7aWYodGhpcy5jZW50ZXIpe2NvbnN0IHI9dC5tZWFuKCJjb2x1bW4iKSxuPXRoaXMuc2NhbGU/dC5zdGFuZGFyZERldmlhdGlvbigiY29sdW1uIix7bWVhbjpyfSk6bnVsbDtpZih0aGlzLm1lYW5zPXIsdC5zdWJSb3dWZWN0b3IociksdGhpcy5zY2FsZSl7Zm9yKGxldCByPTA7cjxuLmxlbmd0aDtyKyspaWYoMD09PW5bcl0pe2lmKCFlKXRocm93IG5ldyBSYW5nZUVycm9yKGBDYW5ub3Qgc2NhbGUgdGhlIGRhdGFzZXQgKHN0YW5kYXJkIGRldmlhdGlvbiBpcyB6ZXJvIGF0IGluZGV4ICR7cn1gKTt0LnJlbW92ZUNvbHVtbihyKSxuLnNwbGljZShyLDEpLHRoaXMuZXhjbHVkZWRGZWF0dXJlcy5wdXNoKHIpLHItLX10aGlzLnN0ZGV2cz1uLHQuZGl2Um93VmVjdG9yKG4pfX19X2NvbXB1dGVGcm9tQ292YXJpYW5jZU1hdHJpeCh0KXtjb25zdCBlPW5ldyBZbih0LHthc3N1bWVTeW1tZXRyaWM6ITB9KTt0aGlzLlU9ZS5laWdlbnZlY3Rvck1hdHJpeCx0aGlzLlUuZmxpcFJvd3MoKSx0aGlzLlM9ZS5yZWFsRWlnZW52YWx1ZXMsdGhpcy5TLnJldmVyc2UoKX1fY29tcHV0ZVdpdGhOSVBBTFModCxlKXt0aGlzLlU9bmV3IFVuKGUsdC5jb2x1bW5zKSx0aGlzLlM9W107bGV0IHI9dDtmb3IobGV0IHQ9MDt0PGU7dCsrKXtsZXQgZT1uZXcgSm4ocik7dGhpcy5VLnNldFJvdyh0LGUudy50cmFuc3Bvc2UoKSksdGhpcy5TLnB1c2goTWF0aC5wb3coZS5zLmdldCgwLDApLDIpKSxyPWUueFJlc2lkdWFsfXRoaXMuVT10aGlzLlUudHJhbnNwb3NlKCl9fTtmdW5jdGlvbiBIbih0LGU9e30pe2lmKCFOcih0KSl0aHJvdyBuZXcgRXJyb3IoImRhdGEgaXMgbm90IGVmZi4gYXJyYXkiKTtsZXQgcj12ZShlLCJzY2FsZSIpO1lyKHIpfHwocj0hMCk7bGV0IG49dmUoZSwibkNvbXBOSVBBTFMiKTtKcihuKXx8KG49Miksbj14bihuKTtsZXQgbz1Tcih2ZSh0LDAsW10pKTtpZigwPT09byl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgZGltZW5zaW9uIG9mIGRhdGEiKTtpZihuPm8pdGhyb3cgbmV3IEVycm9yKGBuQ29tcE5JUEFMU1ske259XSBpcyBtb3JlIHRoYW4gdGhlIGRpbWVuc2lvblske299XSBvZiBkYXRhYCk7cmV0dXJuIG5ldyBabih0LHttZXRob2Q6Ik5JUEFMUyIsc2NhbGU6cixuQ29tcE5JUEFMUzpufSkucHJlZGljdCh0KS50b0pTT04oKX12YXIgUW49e30sdG89e2dldCBleHBvcnRzKCl7cmV0dXJuIFFufSxzZXQgZXhwb3J0cyh0KXtRbj10fX07dmFyIGVvPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPS0xLG49bnVsbD09dD8wOnQubGVuZ3RoOysrcjxuJiYhMSE9PWUodFtyXSxyLHQpOyk7cmV0dXJuIHR9O3ZhciBybz1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSxyLG4pe2Zvcih2YXIgbz0tMSxzPU9iamVjdChlKSxpPW4oZSksdT1pLmxlbmd0aDt1LS07KXt2YXIgYT1pW3Q/dTorK29dO2lmKCExPT09cihzW2FdLGEscykpYnJlYWt9cmV0dXJuIGV9fSxubz1ybygpO3ZhciBvbz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj0tMSxuPUFycmF5KHQpOysrcjx0OyluW3JdPWUocik7cmV0dXJuIG59LHNvPWIsaW89eTt2YXIgdW89ZnVuY3Rpb24odCl7cmV0dXJuIGlvKHQpJiYiW29iamVjdCBBcmd1bWVudHNdIj09c28odCl9LGFvPXksbG89T2JqZWN0LnByb3RvdHlwZSxobz1sby5oYXNPd25Qcm9wZXJ0eSxjbz1sby5wcm9wZXJ0eUlzRW51bWVyYWJsZSxmbz11byhmdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHN9KCkpP3VvOmZ1bmN0aW9uKHQpe3JldHVybiBhbyh0KSYmaG8uY2FsbCh0LCJjYWxsZWUiKSYmIWNvLmNhbGwodCwiY2FsbGVlIil9LG1vPXt9O3ZhciBnbz1mdW5jdGlvbigpe3JldHVybiExfTshZnVuY3Rpb24odCxlKXt2YXIgcj1pLG49Z28sbz1lJiYhZS5ub2RlVHlwZSYmZSxzPW8mJnQmJiF0Lm5vZGVUeXBlJiZ0LHU9cyYmcy5leHBvcnRzPT09bz9yLkJ1ZmZlcjp2b2lkIDAsYT0odT91LmlzQnVmZmVyOnZvaWQgMCl8fG47dC5leHBvcnRzPWF9KHtnZXQgZXhwb3J0cygpe3JldHVybiBtb30sc2V0IGV4cG9ydHModCl7bW89dH19LG1vKTt2YXIgcG89L14oPzowfFsxLTldXGQqKSQvO3ZhciB3bz1mdW5jdGlvbih0LGUpe3ZhciByPXR5cGVvZiB0O3JldHVybiEhKGU9bnVsbD09ZT85MDA3MTk5MjU0NzQwOTkxOmUpJiYoIm51bWJlciI9PXJ8fCJzeW1ib2wiIT1yJiZwby50ZXN0KHQpKSYmdD4tMSYmdCUxPT0wJiZ0PGV9LGJvPWIseW89WWUsdm89eSxNbz17fTtNb1siW29iamVjdCBGbG9hdDMyQXJyYXldIl09TW9bIltvYmplY3QgRmxvYXQ2NEFycmF5XSJdPU1vWyJbb2JqZWN0IEludDhBcnJheV0iXT1Nb1siW29iamVjdCBJbnQxNkFycmF5XSJdPU1vWyJbb2JqZWN0IEludDMyQXJyYXldIl09TW9bIltvYmplY3QgVWludDhBcnJheV0iXT1Nb1siW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0iXT1Nb1siW29iamVjdCBVaW50MTZBcnJheV0iXT1Nb1siW29iamVjdCBVaW50MzJBcnJheV0iXT0hMCxNb1siW29iamVjdCBBcmd1bWVudHNdIl09TW9bIltvYmplY3QgQXJyYXldIl09TW9bIltvYmplY3QgQXJyYXlCdWZmZXJdIl09TW9bIltvYmplY3QgQm9vbGVhbl0iXT1Nb1siW29iamVjdCBEYXRhVmlld10iXT1Nb1siW29iamVjdCBEYXRlXSJdPU1vWyJbb2JqZWN0IEVycm9yXSJdPU1vWyJbb2JqZWN0IEZ1bmN0aW9uXSJdPU1vWyJbb2JqZWN0IE1hcF0iXT1Nb1siW29iamVjdCBOdW1iZXJdIl09TW9bIltvYmplY3QgT2JqZWN0XSJdPU1vWyJbb2JqZWN0IFJlZ0V4cF0iXT1Nb1siW29iamVjdCBTZXRdIl09TW9bIltvYmplY3QgU3RyaW5nXSJdPU1vWyJbb2JqZWN0IFdlYWtNYXBdIl09ITE7dmFyIGpvPWZ1bmN0aW9uKHQpe3JldHVybiB2byh0KSYmeW8odC5sZW5ndGgpJiYhIU1vW2JvKHQpXX07dmFyIHhvPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdChlKX19LF9vPXt9OyFmdW5jdGlvbih0LGUpe3ZhciByPW4sbz1lJiYhZS5ub2RlVHlwZSYmZSxzPW8mJnQmJiF0Lm5vZGVUeXBlJiZ0LGk9cyYmcy5leHBvcnRzPT09byYmci5wcm9jZXNzLHU9ZnVuY3Rpb24oKXt0cnl7dmFyIHQ9cyYmcy5yZXF1aXJlJiZzLnJlcXVpcmUoInV0aWwiKS50eXBlcztyZXR1cm4gdHx8aSYmaS5iaW5kaW5nJiZpLmJpbmRpbmcoInV0aWwiKX1jYXRjaCh0KXt9fSgpO3QuZXhwb3J0cz11fSh7Z2V0IGV4cG9ydHMoKXtyZXR1cm4gX299LHNldCBleHBvcnRzKHQpe19vPXR9fSxfbyk7dmFyIEVvPWpvLFNvPXhvLE9vPV9vJiZfby5pc1R5cGVkQXJyYXksQW89T28/U28oT28pOkVvLENvPW9vLFJvPWZvLElvPXIsTm89bW8sa289d28sRm89QW8sUG89T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt2YXIgVG89ZnVuY3Rpb24odCxlKXt2YXIgcj1Jbyh0KSxuPSFyJiZSbyh0KSxvPSFyJiYhbiYmTm8odCkscz0hciYmIW4mJiFvJiZGbyh0KSxpPXJ8fG58fG98fHMsdT1pP0NvKHQubGVuZ3RoLFN0cmluZyk6W10sYT11Lmxlbmd0aDtmb3IodmFyIGwgaW4gdCkhZSYmIVBvLmNhbGwodCxsKXx8aSYmKCJsZW5ndGgiPT1sfHxvJiYoIm9mZnNldCI9PWx8fCJwYXJlbnQiPT1sKXx8cyYmKCJidWZmZXIiPT1sfHwiYnl0ZUxlbmd0aCI9PWx8fCJieXRlT2Zmc2V0Ij09bCl8fGtvKGwsYSkpfHx1LnB1c2gobCk7cmV0dXJuIHV9LHpvPUFlLFZvPVplO3ZhciAkbz1mdW5jdGlvbih0KXtyZXR1cm4gVm8odCk/VG8odCk6em8odCl9LHFvPW5vLERvPSRvO3ZhciBVbz1aZTt2YXIgTG89ZnVuY3Rpb24odCxlKXtyZXR1cm4gZnVuY3Rpb24ocixuKXtpZihudWxsPT1yKXJldHVybiByO2lmKCFVbyhyKSlyZXR1cm4gdChyLG4pO2Zvcih2YXIgbz1yLmxlbmd0aCxzPWU/bzotMSxpPU9iamVjdChyKTsoZT9zLS06KytzPG8pJiYhMSE9PW4oaVtzXSxzLGkpOyk7cmV0dXJuIHJ9fSxCbz1MbygoZnVuY3Rpb24odCxlKXtyZXR1cm4gdCYmcW8odCxlLERvKX0pKTt2YXIgR289ZnVuY3Rpb24odCl7cmV0dXJuIHR9LFdvPUdvO3ZhciBLbz1lbyxZbz1CbyxYbz1mdW5jdGlvbih0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD90OldvfSxKbz1yO3ZhciBabz1mdW5jdGlvbih0LGUpe3JldHVybihKbyh0KT9LbzpZbykodCxYbyhlKSl9O3RvLmV4cG9ydHM9Wm87dmFyIEhvPWUoUW4pLFFvPUN0O3ZhciB0cz1DdCxlcz1SdCxycz1LdDt2YXIgbnM9Q3Qsb3M9ZnVuY3Rpb24oKXt0aGlzLl9fZGF0YV9fPW5ldyBRbyx0aGlzLnNpemU9MH0sc3M9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxyPWUuZGVsZXRlKHQpO3JldHVybiB0aGlzLnNpemU9ZS5zaXplLHJ9LGlzPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLmdldCh0KX0sdXM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKHQpfSxhcz1mdW5jdGlvbih0LGUpe3ZhciByPXRoaXMuX19kYXRhX187aWYociBpbnN0YW5jZW9mIHRzKXt2YXIgbj1yLl9fZGF0YV9fO2lmKCFlc3x8bi5sZW5ndGg8MTk5KXJldHVybiBuLnB1c2goW3QsZV0pLHRoaXMuc2l6ZT0rK3Iuc2l6ZSx0aGlzO3I9dGhpcy5fX2RhdGFfXz1uZXcgcnMobil9cmV0dXJuIHIuc2V0KHQsZSksdGhpcy5zaXplPXIuc2l6ZSx0aGlzfTtmdW5jdGlvbiBscyh0KXt2YXIgZT10aGlzLl9fZGF0YV9fPW5ldyBucyh0KTt0aGlzLnNpemU9ZS5zaXplfWxzLnByb3RvdHlwZS5jbGVhcj1vcyxscy5wcm90b3R5cGUuZGVsZXRlPXNzLGxzLnByb3RvdHlwZS5nZXQ9aXMsbHMucHJvdG90eXBlLmhhcz11cyxscy5wcm90b3R5cGUuc2V0PWFzO3ZhciBocz1sczt2YXIgY3M9S3QsZnM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX19kYXRhX18uc2V0KHQsIl9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iKSx0aGlzfSxtcz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXModCl9O2Z1bmN0aW9uIGdzKHQpe3ZhciBlPS0xLHI9bnVsbD09dD8wOnQubGVuZ3RoO2Zvcih0aGlzLl9fZGF0YV9fPW5ldyBjczsrK2U8cjspdGhpcy5hZGQodFtlXSl9Z3MucHJvdG90eXBlLmFkZD1ncy5wcm90b3R5cGUucHVzaD1mcyxncy5wcm90b3R5cGUuaGFzPW1zO3ZhciBwcz1ncyx3cz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj0tMSxuPW51bGw9PXQ/MDp0Lmxlbmd0aDsrK3I8bjspaWYoZSh0W3JdLHIsdCkpcmV0dXJuITA7cmV0dXJuITF9LGRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuaGFzKGUpfTt2YXIgYnM9ZnVuY3Rpb24odCxlLHIsbixvLHMpe3ZhciBpPTEmcix1PXQubGVuZ3RoLGE9ZS5sZW5ndGg7aWYodSE9YSYmIShpJiZhPnUpKXJldHVybiExO3ZhciBsPXMuZ2V0KHQpLGg9cy5nZXQoZSk7aWYobCYmaClyZXR1cm4gbD09ZSYmaD09dDt2YXIgYz0tMSxmPSEwLG09MiZyP25ldyBwczp2b2lkIDA7Zm9yKHMuc2V0KHQsZSkscy5zZXQoZSx0KTsrK2M8dTspe3ZhciBnPXRbY10scD1lW2NdO2lmKG4pdmFyIHc9aT9uKHAsZyxjLGUsdCxzKTpuKGcscCxjLHQsZSxzKTtpZih2b2lkIDAhPT13KXtpZih3KWNvbnRpbnVlO2Y9ITE7YnJlYWt9aWYobSl7aWYoIXdzKGUsKGZ1bmN0aW9uKHQsZSl7aWYoIWRzKG0sZSkmJihnPT09dHx8byhnLHQscixuLHMpKSlyZXR1cm4gbS5wdXNoKGUpfSkpKXtmPSExO2JyZWFrfX1lbHNlIGlmKGchPT1wJiYhbyhnLHAscixuLHMpKXtmPSExO2JyZWFrfX1yZXR1cm4gcy5kZWxldGUodCkscy5kZWxldGUoZSksZn07dmFyIHlzPWZ1bmN0aW9uKHQpe3ZhciBlPS0xLHI9QXJyYXkodC5zaXplKTtyZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbih0LG4pe3JbKytlXT1bbix0XX0pKSxyfTt2YXIgdnM9aS5VaW50OEFycmF5LE1zPXB0LGpzPWJzLHhzPXlzLF9zPWZ1bmN0aW9uKHQpe3ZhciBlPS0xLHI9QXJyYXkodC5zaXplKTtyZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbih0KXtyWysrZV09dH0pKSxyfSxFcz11P3UucHJvdG90eXBlOnZvaWQgMCxTcz1Fcz9Fcy52YWx1ZU9mOnZvaWQgMDt2YXIgT3M9ZnVuY3Rpb24odCxlLHIsbixvLHMsaSl7c3dpdGNoKHIpe2Nhc2UiW29iamVjdCBEYXRhVmlld10iOmlmKHQuYnl0ZUxlbmd0aCE9ZS5ieXRlTGVuZ3RofHx0LmJ5dGVPZmZzZXQhPWUuYnl0ZU9mZnNldClyZXR1cm4hMTt0PXQuYnVmZmVyLGU9ZS5idWZmZXI7Y2FzZSJbb2JqZWN0IEFycmF5QnVmZmVyXSI6cmV0dXJuISh0LmJ5dGVMZW5ndGghPWUuYnl0ZUxlbmd0aHx8IXMobmV3IHZzKHQpLG5ldyB2cyhlKSkpO2Nhc2UiW29iamVjdCBCb29sZWFuXSI6Y2FzZSJbb2JqZWN0IERhdGVdIjpjYXNlIltvYmplY3QgTnVtYmVyXSI6cmV0dXJuIE1zKCt0LCtlKTtjYXNlIltvYmplY3QgRXJyb3JdIjpyZXR1cm4gdC5uYW1lPT1lLm5hbWUmJnQubWVzc2FnZT09ZS5tZXNzYWdlO2Nhc2UiW29iamVjdCBSZWdFeHBdIjpjYXNlIltvYmplY3QgU3RyaW5nXSI6cmV0dXJuIHQ9PWUrIiI7Y2FzZSJbb2JqZWN0IE1hcF0iOnZhciB1PXhzO2Nhc2UiW29iamVjdCBTZXRdIjp2YXIgYT0xJm47aWYodXx8KHU9X3MpLHQuc2l6ZSE9ZS5zaXplJiYhYSlyZXR1cm4hMTt2YXIgbD1pLmdldCh0KTtpZihsKXJldHVybiBsPT1lO258PTIsaS5zZXQodCxlKTt2YXIgaD1qcyh1KHQpLHUoZSksbixvLHMsaSk7cmV0dXJuIGkuZGVsZXRlKHQpLGg7Y2FzZSJbb2JqZWN0IFN5bWJvbF0iOmlmKFNzKXJldHVybiBTcy5jYWxsKHQpPT1Tcy5jYWxsKGUpfXJldHVybiExfTt2YXIgQXM9ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9LTEsbj1lLmxlbmd0aCxvPXQubGVuZ3RoOysrcjxuOyl0W28rcl09ZVtyXTtyZXR1cm4gdH0sQ3M9QXMsUnM9cjt2YXIgSXM9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPWUodCk7cmV0dXJuIFJzKHQpP246Q3MobixyKHQpKX07dmFyIE5zPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPS0xLG49bnVsbD09dD8wOnQubGVuZ3RoLG89MCxzPVtdOysrcjxuOyl7dmFyIGk9dFtyXTtlKGkscix0KSYmKHNbbysrXT1pKX1yZXR1cm4gc30sa3M9ZnVuY3Rpb24oKXtyZXR1cm5bXX0sRnM9T2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZSxQcz1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzLFRzPUlzLHpzPVBzP2Z1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P1tdOih0PU9iamVjdCh0KSxOcyhQcyh0KSwoZnVuY3Rpb24oZSl7cmV0dXJuIEZzLmNhbGwodCxlKX0pKSl9OmtzLFZzPSRvO3ZhciAkcz1mdW5jdGlvbih0KXtyZXR1cm4gVHModCxWcyx6cyl9LHFzPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dmFyIERzPWhzLFVzPWJzLExzPU9zLEJzPWZ1bmN0aW9uKHQsZSxyLG4sbyxzKXt2YXIgaT0xJnIsdT0kcyh0KSxhPXUubGVuZ3RoO2lmKGEhPSRzKGUpLmxlbmd0aCYmIWkpcmV0dXJuITE7Zm9yKHZhciBsPWE7bC0tOyl7dmFyIGg9dVtsXTtpZighKGk/aCBpbiBlOnFzLmNhbGwoZSxoKSkpcmV0dXJuITF9dmFyIGM9cy5nZXQodCksZj1zLmdldChlKTtpZihjJiZmKXJldHVybiBjPT1lJiZmPT10O3ZhciBtPSEwO3Muc2V0KHQsZSkscy5zZXQoZSx0KTtmb3IodmFyIGc9aTsrK2w8YTspe3ZhciBwPXRbaD11W2xdXSx3PWVbaF07aWYobil2YXIgZD1pP24odyxwLGgsZSx0LHMpOm4ocCx3LGgsdCxlLHMpO2lmKCEodm9pZCAwPT09ZD9wPT09d3x8byhwLHcscixuLHMpOmQpKXttPSExO2JyZWFrfWd8fChnPSJjb25zdHJ1Y3RvciI9PWgpfWlmKG0mJiFnKXt2YXIgYj10LmNvbnN0cnVjdG9yLHk9ZS5jb25zdHJ1Y3RvcjtiPT15fHwhKCJjb25zdHJ1Y3RvciJpbiB0KXx8ISgiY29uc3RydWN0b3IiaW4gZSl8fCJmdW5jdGlvbiI9PXR5cGVvZiBiJiZiIGluc3RhbmNlb2YgYiYmImZ1bmN0aW9uIj09dHlwZW9mIHkmJnkgaW5zdGFuY2VvZiB5fHwobT0hMSl9cmV0dXJuIHMuZGVsZXRlKHQpLHMuZGVsZXRlKGUpLG19LEdzPUtlLFdzPXIsS3M9bW8sWXM9QW8sWHM9IltvYmplY3QgQXJndW1lbnRzXSIsSnM9IltvYmplY3QgQXJyYXldIixacz0iW29iamVjdCBPYmplY3RdIixIcz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3ZhciBRcz1mdW5jdGlvbih0LGUscixuLG8scyl7dmFyIGk9V3ModCksdT1XcyhlKSxhPWk/SnM6R3ModCksbD11P0pzOkdzKGUpLGg9KGE9YT09WHM/WnM6YSk9PVpzLGM9KGw9bD09WHM/WnM6bCk9PVpzLGY9YT09bDtpZihmJiZLcyh0KSl7aWYoIUtzKGUpKXJldHVybiExO2k9ITAsaD0hMX1pZihmJiYhaClyZXR1cm4gc3x8KHM9bmV3IERzKSxpfHxZcyh0KT9Vcyh0LGUscixuLG8scyk6THModCxlLGEscixuLG8scyk7aWYoISgxJnIpKXt2YXIgbT1oJiZIcy5jYWxsKHQsIl9fd3JhcHBlZF9fIiksZz1jJiZIcy5jYWxsKGUsIl9fd3JhcHBlZF9fIik7aWYobXx8Zyl7dmFyIHA9bT90LnZhbHVlKCk6dCx3PWc/ZS52YWx1ZSgpOmU7cmV0dXJuIHN8fChzPW5ldyBEcyksbyhwLHcscixuLHMpfX1yZXR1cm4hIWYmJihzfHwocz1uZXcgRHMpLEJzKHQsZSxyLG4sbyxzKSl9LHRpPXk7dmFyIGVpPWZ1bmN0aW9uIHQoZSxyLG4sbyxzKXtyZXR1cm4gZT09PXJ8fChudWxsPT1lfHxudWxsPT1yfHwhdGkoZSkmJiF0aShyKT9lIT1lJiZyIT1yOlFzKGUscixuLG8sdCxzKSl9LHJpPWhzLG5pPWVpO3ZhciBvaT1BO3ZhciBzaT1mdW5jdGlvbih0KXtyZXR1cm4gdD09dCYmIW9pKHQpfSxpaT1zaSx1aT0kbzt2YXIgYWk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZnVuY3Rpb24ocil7cmV0dXJuIG51bGwhPXImJihyW3RdPT09ZSYmKHZvaWQgMCE9PWV8fHQgaW4gT2JqZWN0KHIpKSl9fSxsaT1mdW5jdGlvbih0LGUscixuKXt2YXIgbz1yLmxlbmd0aCxzPW8saT0hbjtpZihudWxsPT10KXJldHVybiFzO2Zvcih0PU9iamVjdCh0KTtvLS07KXt2YXIgdT1yW29dO2lmKGkmJnVbMl0/dVsxXSE9PXRbdVswXV06ISh1WzBdaW4gdCkpcmV0dXJuITF9Zm9yKDsrK288czspe3ZhciBhPSh1PXJbb10pWzBdLGw9dFthXSxoPXVbMV07aWYoaSYmdVsyXSl7aWYodm9pZCAwPT09bCYmIShhIGluIHQpKXJldHVybiExfWVsc2V7dmFyIGM9bmV3IHJpO2lmKG4pdmFyIGY9bihsLGgsYSx0LGUsYyk7aWYoISh2b2lkIDA9PT1mP25pKGgsbCwzLG4sYyk6ZikpcmV0dXJuITF9fXJldHVybiEwfSxoaT1mdW5jdGlvbih0KXtmb3IodmFyIGU9dWkodCkscj1lLmxlbmd0aDtyLS07KXt2YXIgbj1lW3JdLG89dFtuXTtlW3JdPVtuLG8saWkobyldfXJldHVybiBlfSxjaT1haTt2YXIgZmk9bWUsbWk9Zm8sZ2k9cixwaT13byx3aT1ZZSxkaT1wZTt2YXIgYmk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbCE9dCYmZSBpbiBPYmplY3QodCl9LHlpPWZ1bmN0aW9uKHQsZSxyKXtmb3IodmFyIG49LTEsbz0oZT1maShlLHQpKS5sZW5ndGgscz0hMTsrK248bzspe3ZhciBpPWRpKGVbbl0pO2lmKCEocz1udWxsIT10JiZyKHQsaSkpKWJyZWFrO3Q9dFtpXX1yZXR1cm4gc3x8KytuIT1vP3M6ISEobz1udWxsPT10PzA6dC5sZW5ndGgpJiZ3aShvKSYmcGkoaSxvKSYmKGdpKHQpfHxtaSh0KSl9O3ZhciB2aT1laSxNaT12ZSxqaT1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsIT10JiZ5aSh0LGUsYmkpfSx4aT1PLF9pPXNpLEVpPWFpLFNpPXBlO3ZhciBPaT1iZTt2YXIgQWk9cnIsQ2k9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBPaShlLHQpfX0sUmk9TyxJaT1wZTt2YXIgTmk9ZnVuY3Rpb24odCl7dmFyIGU9aGkodCk7cmV0dXJuIDE9PWUubGVuZ3RoJiZlWzBdWzJdP2NpKGVbMF1bMF0sZVswXVsxXSk6ZnVuY3Rpb24ocil7cmV0dXJuIHI9PT10fHxsaShyLHQsZSl9fSxraT1mdW5jdGlvbih0LGUpe3JldHVybiB4aSh0KSYmX2koZSk/RWkoU2kodCksZSk6ZnVuY3Rpb24ocil7dmFyIG49TWkocix0KTtyZXR1cm4gdm9pZCAwPT09biYmbj09PWU/amkocix0KTp2aShlLG4sMyl9fSxGaT1HbyxQaT1yLFRpPWZ1bmN0aW9uKHQpe3JldHVybiBSaSh0KT9BaShJaSh0KSk6Q2kodCl9O3ZhciB6aT1CbyxWaT1aZTt2YXIgJGk9ZWUscWk9ZnVuY3Rpb24odCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpudWxsPT10P0ZpOiJvYmplY3QiPT10eXBlb2YgdD9QaSh0KT9raSh0WzBdLHRbMV0pOk5pKHQpOlRpKHQpfSxEaT1mdW5jdGlvbih0LGUpe3ZhciByPS0xLG49VmkodCk/QXJyYXkodC5sZW5ndGgpOltdO3JldHVybiB6aSh0LChmdW5jdGlvbih0LG8scyl7blsrK3JdPWUodCxvLHMpfSkpLG59LFVpPXI7dmFyIExpPWZ1bmN0aW9uKHQsZSl7cmV0dXJuKFVpKHQpPyRpOkRpKSh0LHFpKGUpKX0sQmk9ZWU7dmFyIEdpPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIEJpKGUsKGZ1bmN0aW9uKGUpe3JldHVybiB0W2VdfSkpfSxXaT0kbzt2YXIgS2k9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/W106R2kodCxXaSh0KSl9O2Z1bmN0aW9uIFlpKHQsZSl7Zm9yKHZhciByPS0xLG49bnVsbD09dD8wOnQubGVuZ3RoOysrcjxuJiYhMSE9PWUodFtyXSxyLHQpOyk7cmV0dXJuIHR9dmFyIFhpLEppPWZ1bmN0aW9uKHQsZSxyKXtmb3IodmFyIG49LTEsbz1PYmplY3QodCkscz1yKHQpLGk9cy5sZW5ndGg7aS0tOyl7dmFyIHU9c1tYaT9pOisrbl07aWYoITE9PT1lKG9bdV0sdSxvKSlicmVha31yZXR1cm4gdH07ZnVuY3Rpb24gWmkodCl7cmV0dXJuIFdyKHQpJiYiW29iamVjdCBBcmd1bWVudHNdIj09R3IodCl9dmFyIEhpPU9iamVjdC5wcm90b3R5cGUsUWk9SGkuaGFzT3duUHJvcGVydHksdHU9SGkucHJvcGVydHlJc0VudW1lcmFibGUsZXU9WmkoZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzfSgpKT9aaTpmdW5jdGlvbih0KXtyZXR1cm4gV3IodCkmJlFpLmNhbGwodCwiY2FsbGVlIikmJiF0dS5jYWxsKHQsImNhbGxlZSIpfTt2YXIgcnU9Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiZleHBvcnRzJiYhZXhwb3J0cy5ub2RlVHlwZSYmZXhwb3J0cyxudT1ydSYmIm9iamVjdCI9PXR5cGVvZiBtb2R1bGUmJm1vZHVsZSYmIW1vZHVsZS5ub2RlVHlwZSYmbW9kdWxlLG91PW51JiZudS5leHBvcnRzPT09cnU/UHIuQnVmZmVyOnZvaWQgMCxzdT0ob3U/b3UuaXNCdWZmZXI6dm9pZCAwKXx8ZnVuY3Rpb24oKXtyZXR1cm4hMX0saXU9OTAwNzE5OTI1NDc0MDk5MSx1dT0vXig/OjB8WzEtOV1cZCopJC87ZnVuY3Rpb24gYXUodCxlKXt2YXIgcj10eXBlb2YgdDtyZXR1cm4hIShlPW51bGw9PWU/aXU6ZSkmJigibnVtYmVyIj09cnx8InN5bWJvbCIhPXImJnV1LnRlc3QodCkpJiZ0Pi0xJiZ0JTE9PTAmJnQ8ZX12YXIgbHU9OTAwNzE5OTI1NDc0MDk5MTtmdW5jdGlvbiBodSh0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQmJnQ+LTEmJnQlMT09MCYmdDw9bHV9dmFyIGN1PXt9O2N1WyJbb2JqZWN0IEZsb2F0MzJBcnJheV0iXT1jdVsiW29iamVjdCBGbG9hdDY0QXJyYXldIl09Y3VbIltvYmplY3QgSW50OEFycmF5XSJdPWN1WyJbb2JqZWN0IEludDE2QXJyYXldIl09Y3VbIltvYmplY3QgSW50MzJBcnJheV0iXT1jdVsiW29iamVjdCBVaW50OEFycmF5XSJdPWN1WyJbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XSJdPWN1WyJbb2JqZWN0IFVpbnQxNkFycmF5XSJdPWN1WyJbb2JqZWN0IFVpbnQzMkFycmF5XSJdPSEwLGN1WyJbb2JqZWN0IEFyZ3VtZW50c10iXT1jdVsiW29iamVjdCBBcnJheV0iXT1jdVsiW29iamVjdCBBcnJheUJ1ZmZlcl0iXT1jdVsiW29iamVjdCBCb29sZWFuXSJdPWN1WyJbb2JqZWN0IERhdGFWaWV3XSJdPWN1WyJbb2JqZWN0IERhdGVdIl09Y3VbIltvYmplY3QgRXJyb3JdIl09Y3VbIltvYmplY3QgRnVuY3Rpb25dIl09Y3VbIltvYmplY3QgTWFwXSJdPWN1WyJbb2JqZWN0IE51bWJlcl0iXT1jdVsiW29iamVjdCBPYmplY3RdIl09Y3VbIltvYmplY3QgUmVnRXhwXSJdPWN1WyJbb2JqZWN0IFNldF0iXT1jdVsiW29iamVjdCBTdHJpbmddIl09Y3VbIltvYmplY3QgV2Vha01hcF0iXT0hMTt2YXIgZnU9Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiZleHBvcnRzJiYhZXhwb3J0cy5ub2RlVHlwZSYmZXhwb3J0cyxtdT1mdSYmIm9iamVjdCI9PXR5cGVvZiBtb2R1bGUmJm1vZHVsZSYmIW1vZHVsZS5ub2RlVHlwZSYmbW9kdWxlLGd1PW11JiZtdS5leHBvcnRzPT09ZnUmJmtyLnByb2Nlc3MscHU9ZnVuY3Rpb24oKXt0cnl7dmFyIHQ9bXUmJm11LnJlcXVpcmUmJm11LnJlcXVpcmUoInV0aWwiKS50eXBlcztyZXR1cm4gdHx8Z3UmJmd1LmJpbmRpbmcmJmd1LmJpbmRpbmcoInV0aWwiKX1jYXRjaCh0KXt9fSgpLHd1PXB1JiZwdS5pc1R5cGVkQXJyYXksZHU9d3U/ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0KGUpfX0od3UpOmZ1bmN0aW9uKHQpe3JldHVybiBXcih0KSYmaHUodC5sZW5ndGgpJiYhIWN1W0dyKHQpXX0sYnU9ZHUseXU9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiB2dSh0LGUpe3ZhciByPW1uKHQpLG49IXImJmV1KHQpLG89IXImJiFuJiZzdSh0KSxzPSFyJiYhbiYmIW8mJmJ1KHQpLGk9cnx8bnx8b3x8cyx1PWk/ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9LTEsbj1BcnJheSh0KTsrK3I8dDspbltyXT1lKHIpO3JldHVybiBufSh0Lmxlbmd0aCxTdHJpbmcpOltdLGE9dS5sZW5ndGg7Zm9yKHZhciBsIGluIHQpIWUmJiF5dS5jYWxsKHQsbCl8fGkmJigibGVuZ3RoIj09bHx8byYmKCJvZmZzZXQiPT1sfHwicGFyZW50Ij09bCl8fHMmJigiYnVmZmVyIj09bHx8ImJ5dGVMZW5ndGgiPT1sfHwiYnl0ZU9mZnNldCI9PWwpfHxhdShsLGEpKXx8dS5wdXNoKGwpO3JldHVybiB1fXZhciBNdT1PYmplY3QucHJvdG90eXBlO3ZhciBqdT1mdW5jdGlvbih0LGUpe3JldHVybiBmdW5jdGlvbihyKXtyZXR1cm4gdChlKHIpKX19KE9iamVjdC5rZXlzLE9iamVjdCkseHU9anUsX3U9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBFdSh0KXtpZihyPShlPXQpJiZlLmNvbnN0cnVjdG9yLGUhPT0oImZ1bmN0aW9uIj09dHlwZW9mIHImJnIucHJvdG90eXBlfHxNdSkpcmV0dXJuIHh1KHQpO3ZhciBlLHIsbj1bXTtmb3IodmFyIG8gaW4gT2JqZWN0KHQpKV91LmNhbGwodCxvKSYmImNvbnN0cnVjdG9yIiE9byYmbi5wdXNoKG8pO3JldHVybiBufXZhciBTdT0iW29iamVjdCBBc3luY0Z1bmN0aW9uXSIsT3U9IltvYmplY3QgRnVuY3Rpb25dIixBdT0iW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0iLEN1PSJbb2JqZWN0IFByb3h5XSI7ZnVuY3Rpb24gUnUodCl7aWYoIXRuKHQpKXJldHVybiExO3ZhciBlPUdyKHQpO3JldHVybiBlPT1PdXx8ZT09QXV8fGU9PVN1fHxlPT1DdX1mdW5jdGlvbiBJdSh0KXtyZXR1cm4gbnVsbCE9dCYmaHUodC5sZW5ndGgpJiYhUnUodCl9ZnVuY3Rpb24gTnUodCl7cmV0dXJuIEl1KHQpP3Z1KHQpOkV1KHQpfXZhciBrdT1mdW5jdGlvbih0LGUpe3JldHVybiBmdW5jdGlvbihyLG4pe2lmKG51bGw9PXIpcmV0dXJuIHI7aWYoIUl1KHIpKXJldHVybiB0KHIsbik7Zm9yKHZhciBvPXIubGVuZ3RoLHM9ZT9vOi0xLGk9T2JqZWN0KHIpOyhlP3MtLTorK3M8bykmJiExIT09bihpW3NdLHMsaSk7KTtyZXR1cm4gcn19KChmdW5jdGlvbih0LGUpe3JldHVybiB0JiZKaSh0LGUsTnUpfSkpLEZ1PWt1O2Z1bmN0aW9uIFB1KHQpe3JldHVybiB0fWZ1bmN0aW9uIFR1KHQsZSl7dmFyIHI7cmV0dXJuKG1uKHQpP1lpOkZ1KSh0LCJmdW5jdGlvbiI9PXR5cGVvZihyPWUpP3I6UHUpfXZhciB6dT0vXC58XFsoPzpbXltcXV0qfChbIiddKSg/Oig/IVwxKVteXFxdfFxcLikqP1wxKVxdLyxWdT0vXlx3KiQvO3ZhciAkdT1QclsiX19jb3JlLWpzX3NoYXJlZF9fIl0scXU9ZnVuY3Rpb24oKXt2YXIgdD0vW14uXSskLy5leGVjKCR1JiYkdS5rZXlzJiYkdS5rZXlzLklFX1BST1RPfHwiIik7cmV0dXJuIHQ/IlN5bWJvbChzcmMpXzEuIit0OiIifSgpO3ZhciBEdT1GdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmc7dmFyIFV1PS9eXFtvYmplY3QgLis/Q29uc3RydWN0b3JcXSQvLEx1PUZ1bmN0aW9uLnByb3RvdHlwZSxCdT1PYmplY3QucHJvdG90eXBlLEd1PUx1LnRvU3RyaW5nLFd1PUJ1Lmhhc093blByb3BlcnR5LEt1PVJlZ0V4cCgiXiIrR3UuY2FsbChXdSkucmVwbGFjZSgvW1xcXiQuKis/KClbXF17fXxdL2csIlxcJCYiKS5yZXBsYWNlKC9oYXNPd25Qcm9wZXJ0eXwoZnVuY3Rpb24pLio/KD89XFxcKCl8IGZvciAuKz8oPz1cXFxdKS9nLCIkMS4qPyIpKyIkIik7ZnVuY3Rpb24gWXUodCl7cmV0dXJuISghdG4odCl8fGZ1bmN0aW9uKHQpe3JldHVybiEhcXUmJnF1IGluIHR9KHQpKSYmKFJ1KHQpP0t1OlV1KS50ZXN0KGZ1bmN0aW9uKHQpe2lmKG51bGwhPXQpe3RyeXtyZXR1cm4gRHUuY2FsbCh0KX1jYXRjaCh0KXt9dHJ5e3JldHVybiB0KyIifWNhdGNoKHQpe319cmV0dXJuIiJ9KHQpKX1mdW5jdGlvbiBYdSh0LGUpe3ZhciByPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGw9PXQ/dm9pZCAwOnRbZV19KHQsZSk7cmV0dXJuIFl1KHIpP3I6dm9pZCAwfXZhciBKdT1YdShPYmplY3QsImNyZWF0ZSIpO3ZhciBadT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3ZhciBIdT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIFF1KHQpe3ZhciBlPS0xLHI9bnVsbD09dD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPHI7KXt2YXIgbj10W2VdO3RoaXMuc2V0KG5bMF0sblsxXSl9fWZ1bmN0aW9uIHRhKHQsZSl7Zm9yKHZhciByLG4sbz10Lmxlbmd0aDtvLS07KWlmKChyPXRbb11bMF0pPT09KG49ZSl8fHIhPXImJm4hPW4pcmV0dXJuIG87cmV0dXJuLTF9UXUucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5fX2RhdGFfXz1KdT9KdShudWxsKTp7fSx0aGlzLnNpemU9MH0sUXUucHJvdG90eXBlLmRlbGV0ZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmhhcyh0KSYmZGVsZXRlIHRoaXMuX19kYXRhX19bdF07cmV0dXJuIHRoaXMuc2l6ZS09ZT8xOjAsZX0sUXUucHJvdG90eXBlLmdldD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fO2lmKEp1KXt2YXIgcj1lW3RdO3JldHVybiJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIj09PXI/dm9pZCAwOnJ9cmV0dXJuIFp1LmNhbGwoZSx0KT9lW3RdOnZvaWQgMH0sUXUucHJvdG90eXBlLmhhcz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fO3JldHVybiBKdT92b2lkIDAhPT1lW3RdOkh1LmNhbGwoZSx0KX0sUXUucHJvdG90eXBlLnNldD1mdW5jdGlvbih0LGUpe3ZhciByPXRoaXMuX19kYXRhX187cmV0dXJuIHRoaXMuc2l6ZSs9dGhpcy5oYXModCk/MDoxLHJbdF09SnUmJnZvaWQgMD09PWU/Il9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iOmUsdGhpc307dmFyIGVhPUFycmF5LnByb3RvdHlwZS5zcGxpY2U7ZnVuY3Rpb24gcmEodCl7dmFyIGU9LTEscj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8cjspe3ZhciBuPXRbZV07dGhpcy5zZXQoblswXSxuWzFdKX19cmEucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5fX2RhdGFfXz1bXSx0aGlzLnNpemU9MH0scmEucHJvdG90eXBlLmRlbGV0ZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fLHI9dGEoZSx0KTtyZXR1cm4hKHI8MCkmJihyPT1lLmxlbmd0aC0xP2UucG9wKCk6ZWEuY2FsbChlLHIsMSksLS10aGlzLnNpemUsITApfSxyYS5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX19kYXRhX18scj10YShlLHQpO3JldHVybiByPDA/dm9pZCAwOmVbcl1bMV19LHJhLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24odCl7cmV0dXJuIHRhKHRoaXMuX19kYXRhX18sdCk+LTF9LHJhLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLl9fZGF0YV9fLG49dGEocix0KTtyZXR1cm4gbjwwPygrK3RoaXMuc2l6ZSxyLnB1c2goW3QsZV0pKTpyW25dWzFdPWUsdGhpc307dmFyIG5hPVh1KFByLCJNYXAiKTtmdW5jdGlvbiBvYSh0LGUpe3ZhciByLG4sbz10Ll9fZGF0YV9fO3JldHVybigic3RyaW5nIj09KG49dHlwZW9mKHI9ZSkpfHwibnVtYmVyIj09bnx8InN5bWJvbCI9PW58fCJib29sZWFuIj09bj8iX19wcm90b19fIiE9PXI6bnVsbD09PXIpP29bInN0cmluZyI9PXR5cGVvZiBlPyJzdHJpbmciOiJoYXNoIl06by5tYXB9ZnVuY3Rpb24gc2EodCl7dmFyIGU9LTEscj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8cjspe3ZhciBuPXRbZV07dGhpcy5zZXQoblswXSxuWzFdKX19c2EucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5zaXplPTAsdGhpcy5fX2RhdGFfXz17aGFzaDpuZXcgUXUsbWFwOm5ldyhuYXx8cmEpLHN0cmluZzpuZXcgUXV9fSxzYS5wcm90b3R5cGUuZGVsZXRlPWZ1bmN0aW9uKHQpe3ZhciBlPW9hKHRoaXMsdCkuZGVsZXRlKHQpO3JldHVybiB0aGlzLnNpemUtPWU/MTowLGV9LHNhLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIG9hKHRoaXMsdCkuZ2V0KHQpfSxzYS5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKHQpe3JldHVybiBvYSh0aGlzLHQpLmhhcyh0KX0sc2EucHJvdG90eXBlLnNldD1mdW5jdGlvbih0LGUpe3ZhciByPW9hKHRoaXMsdCksbj1yLnNpemU7cmV0dXJuIHIuc2V0KHQsZSksdGhpcy5zaXplKz1yLnNpemU9PW4/MDoxLHRoaXN9O3ZhciBpYT0iRXhwZWN0ZWQgYSBmdW5jdGlvbiI7ZnVuY3Rpb24gdWEodCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdHx8bnVsbCE9ZSYmImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcihpYSk7dmFyIHI9ZnVuY3Rpb24oKXt2YXIgbj1hcmd1bWVudHMsbz1lP2UuYXBwbHkodGhpcyxuKTpuWzBdLHM9ci5jYWNoZTtpZihzLmhhcyhvKSlyZXR1cm4gcy5nZXQobyk7dmFyIGk9dC5hcHBseSh0aGlzLG4pO3JldHVybiByLmNhY2hlPXMuc2V0KG8saSl8fHMsaX07cmV0dXJuIHIuY2FjaGU9bmV3KHVhLkNhY2hlfHxzYSkscn11YS5DYWNoZT1zYTt2YXIgYWE9L1teLltcXV0rfFxbKD86KC0/XGQrKD86XC5cZCspPyl8KFsiJ10pKCg/Oig/IVwyKVteXFxdfFxcLikqPylcMilcXXwoPz0oPzpcLnxcW1xdKSg/OlwufFxbXF18JCkpL2csbGE9L1xcKFxcKT8vZyxoYT1mdW5jdGlvbih0KXt2YXIgZT11YSh0LChmdW5jdGlvbih0KXtyZXR1cm4gNTAwPT09ci5zaXplJiZyLmNsZWFyKCksdH0pKSxyPWUuY2FjaGU7cmV0dXJuIGV9KChmdW5jdGlvbih0KXt2YXIgZT1bXTtyZXR1cm4gNDY9PT10LmNoYXJDb2RlQXQoMCkmJmUucHVzaCgiIiksdC5yZXBsYWNlKGFhLChmdW5jdGlvbih0LHIsbixvKXtlLnB1c2gobj9vLnJlcGxhY2UobGEsIiQxIik6cnx8dCl9KSksZX0pKSxjYT1oYTtmdW5jdGlvbiBmYSh0LGUpe3JldHVybiBtbih0KT90OmZ1bmN0aW9uKHQsZSl7aWYobW4odCkpcmV0dXJuITE7dmFyIHI9dHlwZW9mIHQ7cmV0dXJuISgibnVtYmVyIiE9ciYmInN5bWJvbCIhPXImJiJib29sZWFuIiE9ciYmbnVsbCE9dCYmIXJuKHQpKXx8VnUudGVzdCh0KXx8IXp1LnRlc3QodCl8fG51bGwhPWUmJnQgaW4gT2JqZWN0KGUpfSh0LGUpP1t0XTpjYShibih0KSl9dmFyIG1hPTEvMDtmdW5jdGlvbiBnYSh0KXtpZigic3RyaW5nIj09dHlwZW9mIHR8fHJuKHQpKXJldHVybiB0O3ZhciBlPXQrIiI7cmV0dXJuIjAiPT1lJiYxL3Q9PS1tYT8iLTAiOmV9ZnVuY3Rpb24gcGEodCxlLHIpe3ZhciBuPW51bGw9PXQ/dm9pZCAwOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPTAsbj0oZT1mYShlLHQpKS5sZW5ndGg7bnVsbCE9dCYmcjxuOyl0PXRbZ2EoZVtyKytdKV07cmV0dXJuIHImJnI9PW4/dDp2b2lkIDB9KHQsZSk7cmV0dXJuIHZvaWQgMD09PW4/cjpufWZ1bmN0aW9uIHdhKHQsZSl7aWYoIUFyKHQpKXJldHVybnt9O2lmKCFOcihlKSlyZXR1cm57fTtsZXQgcj17fTtyZXR1cm4gVHUoZSwoZnVuY3Rpb24oZSl7KGZ1bmN0aW9uKHQsZSl7cmV0dXJuISFBcih0KSYmISghWHIoZSkmJiFKcihlKSkmJmUgaW4gdH0pKHQsZSkmJihyW2VdPXBhKHQsZSkpfSkpLHJ9dmFyIGRhPUFycmF5LnByb3RvdHlwZS5qb2luO3ZhciBiYT1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT10PyIiOmRhLmNhbGwodCxlKX0seWE9e30sdmE9e307T2JqZWN0LmRlZmluZVByb3BlcnR5KHZhLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtjbGFzcyBNYXtjb25zdHJ1Y3Rvcih0KXt0aGlzLmdldENvc3Q9KCk9PnRoaXMuRWxlbWVudHMubWFwKCh0PT50LkRpc3RhbmNlRnJvbU1lZG9pZCkpLnJlZHVjZSgoKHQsZSk9PnQrZSksMCksdGhpcy5maW5kQmVzdE1lZG9pZElkeD10PT50aGlzLkVsZW1lbnRzLm1hcCgoZT0+dGhpcy5jYWxjQ29zdEZvckdpdmVuRWxlbWVudEFzTWVkb2lkKGUsdCkpKS5yZWR1Y2UoKCh0LGUscixuKT0+ZS5Db3N0SWZNYWRlTWVkb2lkPG5bdF0uQ29zdElmTWFkZU1lZG9pZD9yOnQpLDApLHRoaXMuY2FsY0Nvc3RGb3JHaXZlbkVsZW1lbnRBc01lZG9pZD0odCxlKT0+KHtDb3N0SWZNYWRlTWVkb2lkOm5ldyBNYSh7RWxlbWVudHM6dGhpcy5FbGVtZW50cy5tYXAoKHI9Pih7RGlzdGFuY2VGcm9tTWVkb2lkOmUoci5FbGVtZW50LHQuRWxlbWVudCksRWxlbWVudDpyLkVsZW1lbnR9KSkpLE1lZG9pZDp0LkVsZW1lbnR9KS5nZXRDb3N0KCksRWxlbWVudDp0fSksdGhpcy5FbGVtZW50cz10LkVsZW1lbnRzLHRoaXMuTWVkb2lkPXQuTWVkb2lkfX12YS5DbHVzdGVyPU1hO3ZhciBqYT17fSx4YT17fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoeGEsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHhhLmRpc3RhbmNlPSh0LGUpPT57aWYodC5sZW5ndGghPT1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoInRoZSBpbnB1dHMgbXVzdCBoYXZlIHRoZSBzYW1lIGRpbWVuc2lvbiIpO2NvbnN0IHI9QXJyYXkuZnJvbSh0LmtleXMoKSkubWFwKChyPT5NYXRoLnBvdyhNYXRoLmFicyh0W3JdLWVbcl0pLDIpKSkucmVkdWNlKCgodCxlKT0+dCtlKSwwKTtyZXR1cm4gTWF0aC5zcXJ0KHIpfTt2YXIgX2E9e307T2JqZWN0LmRlZmluZVByb3BlcnR5KF9hLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxfYS5rR3RFbGVtZW50QXJyTGVuZ3RoPSJrIG11c3QgYmUgbGVzcyB0aGFuIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGlucHV0IGFycmF5IixPYmplY3QuZGVmaW5lUHJvcGVydHkoamEsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO2NvbnN0IEVhPXhhLFNhPV9hLE9hPXZhO2NsYXNzIEFhe2NvbnN0cnVjdG9yKHQsZSxyKXt0aGlzLkVsZW1lbnRzPXQsdGhpcy5LPWUsdGhpcy5EaXN0YW5jZUZuPXIsdGhpcy5PcHRpbWlzYXRpb25Db21wbGV0ZWQ9ITEsdGhpcy5pdGVyYXRlPSgpPT57dGhpcy5JdGVyYXRpb25Db3VudCsrLHRoaXMuQ2x1c3RlcnN8fHRoaXMuYWxsb2NhdGVUb0NsdXN0ZXJzQXJvdW5kQ3VycmVudE1lZG9pZHMoKTtjb25zdCB0PXRoaXMuTWVkb2lkcyxlPXRoaXMuQ2x1c3RlcnMscj10aGlzLmNhbGN1bGF0ZUN1cnJlbnRDb3N0KCk7bGV0IG49cjtmb3IobGV0IHQ9MDt0PHRoaXMuTWVkb2lkcy5sZW5ndGg7dCsrKXtjb25zdCBlPXQ9PjA9PT10aGlzLk1lZG9pZHMuZmlsdGVyKChlPT4wPT09dGhpcy5EaXN0YW5jZUZuKHQsZSkpKS5sZW5ndGg7Zm9yKGNvbnN0IHIgb2YgdGhpcy5FbGVtZW50cy5maWx0ZXIoZSkpe2NvbnN0IGU9dGhpcy5NZWRvaWRzLnNsaWNlKCk7ZVt0XT1yO2NvbnN0IG89bmV3IEFhKHRoaXMuRWxlbWVudHMuc2xpY2UoKSx0aGlzLkssdGhpcy5EaXN0YW5jZUZuKTtvLk1lZG9pZHM9ZSxvLmFsbG9jYXRlVG9DbHVzdGVyc0Fyb3VuZEN1cnJlbnRNZWRvaWRzKCk7Y29uc3Qgcz1vLmNhbGN1bGF0ZUN1cnJlbnRDb3N0KCk7czxuJiYobj1zLHRoaXMuQ2x1c3RlcnM9by5DbHVzdGVycyx0aGlzLk1lZG9pZHM9ZSl9fXJldHVybiB0aGlzLmNhbGN1bGF0ZUN1cnJlbnRDb3N0KCk8cnx8KHRoaXMuQ2x1c3RlcnM9ZSx0aGlzLk1lZG9pZHM9dCx0aGlzLk9wdGltaXNhdGlvbkNvbXBsZXRlZD0hMCwhMSl9LHRoaXMuZ2V0Q2x1c3RlcmVkRGF0YT0oKT0+KHRoaXMuT3B0aW1pc2F0aW9uQ29tcGxldGVkfHx0aGlzLnJ1blRvQ29tcGxldGlvbigpLHRoaXMuQ2x1c3RlcnMubWFwKCh0PT50LkVsZW1lbnRzLm1hcCgodD0+dC5FbGVtZW50KSkpKSksdGhpcy5ydW5Ub0NvbXBsZXRpb249KCk9Pntmb3IoO3RoaXMuaXRlcmF0ZSgpOyk7fSx0aGlzLmFsbG9jYXRlVG9DbHVzdGVyc0Fyb3VuZEN1cnJlbnRNZWRvaWRzPSgpPT57dGhpcy5DbHVzdGVycz1uZXcgQXJyYXksdGhpcy5NZWRvaWRzLmZvckVhY2goKHQ9Pnt0aGlzLkNsdXN0ZXJzLnB1c2gobmV3IE9hLkNsdXN0ZXIoe0VsZW1lbnRzOltdLE1lZG9pZDp0fSkpfSkpLHRoaXMuRWxlbWVudHMuZm9yRWFjaCgoKHQsZSk9Pntjb25zdCByPXRoaXMuZmluZERpc3RhbmNlcyh0aGlzLkNsdXN0ZXJzLm1hcCgodD0+dC5NZWRvaWQpKSx0KSxuPXIucmVkdWNlKCgodCxlLHIsbik9PmU8blt0XT9yOnQpLDApO3RoaXMuQ2x1c3RlcnNbbl0uRWxlbWVudHMucHVzaCh7RGlzdGFuY2VGcm9tTWVkb2lkOnJbbl0sRWxlbWVudDp0fSl9KSl9LHRoaXMuY2FsY3VsYXRlQ3VycmVudENvc3Q9KCk9PnRoaXMuQ2x1c3RlcnMubWFwKCh0PT50LmdldENvc3QoKSkpLnJlZHVjZSgoKHQsZSk9PnQrZSksMCksdGhpcy5maW5kRGlzdGFuY2VzPSh0LGUpPT50Lm1hcCgodD0+dGhpcy5EaXN0YW5jZUZuKHQsZSkpKSx0aGlzLnNlbGVjdEluaXRpYWxNZWRvaWRzPSgpPT57aWYodGhpcy5LPj10aGlzLkVsZW1lbnRzLmxlbmd0aCl0aHJvdyBTYS5rR3RFbGVtZW50QXJyTGVuZ3RoO2NvbnN0IHQ9W10sZT0odCxlKT0+e2Zvcihjb25zdCByIG9mIGUpaWYoMD09PXRoaXMuRGlzdGFuY2VGbihyLHQpKXJldHVybiExO3JldHVybiEwfTtsZXQgcj0wO2Zvcig7cjx0aGlzLkVsZW1lbnRzLmxlbmd0aCYmdC5sZW5ndGg8dGhpcy5LOyllKHRoaXMuRWxlbWVudHNbcl0sdCkmJnQucHVzaCh0aGlzLkVsZW1lbnRzW3JdKSxyKys7cmV0dXJuIHR9LHRoaXMuRGlzdGFuY2VGbj10aGlzLkRpc3RhbmNlRm58fEVhLmRpc3RhbmNlLHRoaXMuTWVkb2lkcz10aGlzLnNlbGVjdEluaXRpYWxNZWRvaWRzKCksdGhpcy5JdGVyYXRpb25Db3VudD0wfWdldCBPcHRpbWlzYXRpb25TdGFydGVkKCl7cmV0dXJuIHRoaXMuSXRlcmF0aW9uQ291bnQ+MH19QWEuY2x1c3RlckVsZW1lbnRzPSh0LGUscik9PntBYS5nZXRJbnN0YW5jZSh0LGUscik7cmV0dXJuIG5ldyBBcnJheX0sQWEuZ2V0SW5zdGFuY2U9KHQsZSxyKT0+bmV3IEFhKHQsZSxyKSxqYS5DbHVzdGVyZXI9QWEsZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXtmb3IodmFyIHIgaW4gZSl0Lmhhc093blByb3BlcnR5KHIpfHwodFtyXT1lW3JdKX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksZSh2YSksZShqYSl9KHlhKTt2YXIgQ2E9ZSh5YSk7ZnVuY3Rpb24gUmEodCl7cmV0dXJuIFJhPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJiJzeW1ib2wiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKHQpe3JldHVybiB0eXBlb2YgdH06ZnVuY3Rpb24odCl7cmV0dXJuIHQmJiJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJnQuY29uc3RydWN0b3I9PT1TeW1ib2wmJnQhPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiB0fSxSYSh0KX1mdW5jdGlvbiBJYSh0KXt2YXIgZT1mdW5jdGlvbih0LGUpe2lmKCJvYmplY3QiIT09UmEodCl8fG51bGw9PT10KXJldHVybiB0O3ZhciByPXRbU3ltYm9sLnRvUHJpbWl0aXZlXTtpZih2b2lkIDAhPT1yKXt2YXIgbj1yLmNhbGwodCxlfHwiZGVmYXVsdCIpO2lmKCJvYmplY3QiIT09UmEobikpcmV0dXJuIG47dGhyb3cgbmV3IFR5cGVFcnJvcigiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS4iKX1yZXR1cm4oInN0cmluZyI9PT1lP1N0cmluZzpOdW1iZXIpKHQpfSh0LCJzdHJpbmciKTtyZXR1cm4ic3ltYm9sIj09PVJhKGUpP2U6U3RyaW5nKGUpfWZ1bmN0aW9uIE5hKHQsZSxyKXtyZXR1cm4oZT1JYShlKSlpbiB0P09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUse3ZhbHVlOnIsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTp0W2VdPXIsdH1mdW5jdGlvbiBrYSh0LGUpe2xldCByPTA7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspcis9KHRbbl0tZVtuXSkqKHRbbl0tZVtuXSk7cmV0dXJuIHJ9Y29uc3QgRmE9e2Rpc3RhbmNlRnVuY3Rpb246a2F9O2Z1bmN0aW9uIFBhKHQsZSxyPUZhKXtjb25zdCBuPXIuZGlzdGFuY2VGdW5jdGlvbnx8RmEuZGlzdGFuY2VGdW5jdGlvbixvPXIuc2ltaWxhcml0eUZ1bmN0aW9ufHxGYS5zaW1pbGFyaXR5RnVuY3Rpb247bGV0IHM9LTE7aWYoImZ1bmN0aW9uIj09dHlwZW9mIG8pe2xldCByPU51bWJlci5NSU5fVkFMVUU7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspe2NvbnN0IGk9byhlLHRbbl0pO2k+ciYmKHI9aSxzPW4pfX1lbHNle2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBuKXRocm93IG5ldyBFcnJvcigiQSBzaW1pbGFyaXR5IG9yIGRpc3RhbmNlIGZ1bmN0aW9uIGl0J3MgcmVxdWlyZWQiKTt7bGV0IHI9TnVtYmVyLk1BWF9WQUxVRTtmb3IobGV0IG89MDtvPHQubGVuZ3RoO28rKyl7Y29uc3QgaT1uKGUsdFtvXSk7aTxyJiYocj1pLHM9byl9fX1yZXR1cm4gc31mdW5jdGlvbiBUYSh0LGUscixuKXtmb3IobGV0IG89MDtvPHQubGVuZ3RoO28rKylyW29dPVBhKGUsdFtvXSx7ZGlzdGFuY2VGdW5jdGlvbjpufSk7cmV0dXJuIHJ9Y2xhc3MgemF7Y29uc3RydWN0b3IodCxlLHIsbixvKXt0aGlzLmNsdXN0ZXJzPXQsdGhpcy5jZW50cm9pZHM9ZSx0aGlzLmNvbnZlcmdlZD1yLHRoaXMuaXRlcmF0aW9ucz1uLHRoaXMuZGlzdGFuY2U9b31uZWFyZXN0KHQpe2NvbnN0IGU9bmV3IEFycmF5KHQubGVuZ3RoKTtyZXR1cm4gVGEodCx0aGlzLmNlbnRyb2lkcyxlLHRoaXMuZGlzdGFuY2UpfWNvbXB1dGVJbmZvcm1hdGlvbih0KXtsZXQgZT10aGlzLmNlbnRyb2lkcy5tYXAoKHQ9Pih7Y2VudHJvaWQ6dCxlcnJvcjowLHNpemU6MH0pKSk7Zm9yKGxldCByPTA7cjx0Lmxlbmd0aDtyKyspZVt0aGlzLmNsdXN0ZXJzW3JdXS5lcnJvcis9dGhpcy5kaXN0YW5jZSh0W3JdLHRoaXMuY2VudHJvaWRzW3RoaXMuY2x1c3RlcnNbcl1dKSxlW3RoaXMuY2x1c3RlcnNbcl1dLnNpemUrKztmb3IobGV0IHQ9MDt0PHRoaXMuY2VudHJvaWRzLmxlbmd0aDt0Kyspe2xldCByPWVbdF0uZXJyb3I7ZVt0XS5zaXplJiYtMSE9PXI/ci89ZVt0XS5zaXplOmVbdF0uZXJyb3I9LTF9cmV0dXJuIGV9fWZ1bmN0aW9uIFZhKHQsZSl7Y29uc3Qgcj02NTUzNSYodD4+Pj0wKTtyZXR1cm4oKHQtcikqKGU+Pj49MCk+Pj4wKStyKmU+Pj4wfWNsYXNzICRhe2NvbnN0cnVjdG9yKHQ9RGF0ZS5ub3coKSl7dGhpcy5zdGF0ZT1uZXcgVWludDMyQXJyYXkoNCksdGhpcy5pbml0KHQpLHRoaXMucmFuZG9tPXRoaXMuZ2V0RmxvYXQuYmluZCh0aGlzKX1nZXRVaW50MzIoKXtyZXR1cm4gdGhpcy5uZXh0U3RhdGUoKSx0aGlzLnN0YXRlWzNdK3RoaXMuc3RhdGVbMl0+Pj4wfWdldEZsb2F0KCl7cmV0dXJuIDUuOTYwNDY0NDc3NTM5MDYzZS04Kih0aGlzLmdldFVpbnQzMigpPj4+OCl9aW5pdCh0KXtpZighTnVtYmVyLmlzSW50ZWdlcih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJzZWVkIG11c3QgYmUgYW4gaW50ZWdlciIpO3RoaXMuc3RhdGVbMF09dCx0aGlzLnN0YXRlWzFdPTAsdGhpcy5zdGF0ZVsyXT0wLHRoaXMuc3RhdGVbM109MDtmb3IobGV0IHQ9MTt0PDg7dCsrKXRoaXMuc3RhdGVbMyZ0XV49dCtWYSgxODEyNDMzMjUzLHRoaXMuc3RhdGVbdC0xJjNdXnRoaXMuc3RhdGVbdC0xJjNdPj4+MzA+Pj4wKT4+PjA7dGhpcy5wZXJpb2RDZXJ0aWZpY2F0aW9uKCk7Zm9yKGxldCB0PTA7dDw4O3QrKyl0aGlzLm5leHRTdGF0ZSgpfXBlcmlvZENlcnRpZmljYXRpb24oKXswPT09dGhpcy5zdGF0ZVswXSYmMD09PXRoaXMuc3RhdGVbMV0mJjA9PT10aGlzLnN0YXRlWzJdJiYwPT09dGhpcy5zdGF0ZVszXSYmKHRoaXMuc3RhdGVbMF09ODgsdGhpcy5zdGF0ZVsxXT04Myx0aGlzLnN0YXRlWzJdPTY1LHRoaXMuc3RhdGVbM109NjgpfW5leHRTdGF0ZSgpe2xldCB0PXRoaXMuc3RhdGVbMF07dF49dDw8MTUsdF49dD4+PjE4LHRePXRoaXMuc3RhdGVbM108PDExLHRoaXMuc3RhdGVbMF09dGhpcy5zdGF0ZVsxXSx0aGlzLnN0YXRlWzFdPXRoaXMuc3RhdGVbMl0sdGhpcy5zdGF0ZVsyXT10aGlzLnN0YXRlWzNdLHRoaXMuc3RhdGVbM109dH19ZnVuY3Rpb24gcWEodCxlPXt9LHI9TWF0aC5yYW5kb20pe2NvbnN0e3NpemU6bj0xLHJlcGxhY2U6bz0hMSxwcm9iYWJpbGl0aWVzOnN9PWU7bGV0IGksdTtpZihpPSJudW1iZXIiPT10eXBlb2YgdD9mdW5jdGlvbih0KXtjb25zdCBlPVtdO2ZvcihsZXQgcj0wO3I8dDtyKyspZS5wdXNoKHIpO3JldHVybiBlfSh0KTp0LnNsaWNlKCkscyl7aWYoIW8pdGhyb3cgbmV3IEVycm9yKCJjaG9pY2Ugd2l0aCBwcm9iYWJpbGl0aWVzIGFuZCBubyByZXBsYWNlbWVudCBpcyBub3QgaW1wbGVtZW50ZWQiKTtpZihzLmxlbmd0aCE9PWkubGVuZ3RoKXRocm93IG5ldyBFcnJvcigidGhlIGxlbmd0aCBvZiBwcm9iYWJpbGl0aWVzIG9wdGlvbiBzaG91bGQgYmUgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBjaG9pY2VzIik7dT1bc1swXV07Zm9yKGxldCB0PTE7dDxzLmxlbmd0aDt0KyspdVt0XT11W3QtMV0rc1t0XTtpZihNYXRoLmFicygxLXVbdS5sZW5ndGgtMV0pPjFlLTgpdGhyb3cgbmV3IEVycm9yKGBwcm9iYWJpbGl0aWVzIHNob3VsZCBzdW0gdG8gMSwgYnV0IGluc3RlYWQgc3VtcyB0byAke3VbdS5sZW5ndGgtMV19YCl9aWYoITE9PT1vJiZuPmkubGVuZ3RoKXRocm93IG5ldyBFcnJvcigic2l6ZSBvcHRpb24gaXMgdG9vIGxhcmdlIik7Y29uc3QgYT1bXTtmb3IobGV0IHQ9MDt0PG47dCsrKXtjb25zdCB0PURhKGkubGVuZ3RoLHIsdSk7YS5wdXNoKGlbdF0pLG98fGkuc3BsaWNlKHQsMSl9cmV0dXJuIGF9ZnVuY3Rpb24gRGEodCxlLHIpe2NvbnN0IG49ZSgpO2lmKHIpe2xldCB0PTA7Zm9yKDtuPnJbdF07KXQrKztyZXR1cm4gdH1yZXR1cm4gTWF0aC5mbG9vcihuKnQpfWNsYXNzIFVhe2NvbnN0cnVjdG9yKHQ9TWF0aC5yYW5kb20pe2lmKCJudW1iZXIiPT10eXBlb2YgdCl7Y29uc3QgZT1uZXcgJGEodCk7dGhpcy5yYW5kb21HZW5lcmF0b3I9ZS5yYW5kb219ZWxzZSB0aGlzLnJhbmRvbUdlbmVyYXRvcj10fWNob2ljZSh0LGUpe3JldHVybiBxYSh0LGUsdGhpcy5yYW5kb21HZW5lcmF0b3IpfXJhbmRvbSgpe3JldHVybiB0aGlzLnJhbmRvbUdlbmVyYXRvcigpfXJhbmRJbnQodCxlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9dCx0PTApLHQrTWF0aC5mbG9vcih0aGlzLnJhbmRvbUdlbmVyYXRvcigpKihlLXQpKX1yYW5kb21TYW1wbGUodCl7Y29uc3QgZT1bXTtmb3IobGV0IHI9MDtyPHQ7cisrKWUucHVzaCh0aGlzLnJhbmRvbSgpKTtyZXR1cm4gZX19ZnVuY3Rpb24gTGEodCxlKXt2YXIgcj1PYmplY3Qua2V5cyh0KTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgbj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHQpO2UmJihuPW4uZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LGUpLmVudW1lcmFibGV9KSkpLHIucHVzaC5hcHBseShyLG4pfXJldHVybiByfWZ1bmN0aW9uIEJhKHQpe2Zvcih2YXIgZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe3ZhciByPW51bGwhPWFyZ3VtZW50c1tlXT9hcmd1bWVudHNbZV06e307ZSUyP0xhKE9iamVjdChyKSwhMCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7TmEodCxlLHJbZV0pfSkpOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHQsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMocikpOkxhKE9iamVjdChyKSkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHIsZSkpfSkpfXJldHVybiB0fWZ1bmN0aW9uIEdhKHQsZSl7Y29uc3Qgcj1uZXcgVW4odC5yb3dzLGUucm93cyk7Zm9yKGxldCBuPTA7bjx0LnJvd3M7bisrKWZvcihsZXQgbz0wO288ZS5yb3dzO28rKylyLnNldChuLG8sa2EodC5nZXRSb3cobiksZS5nZXRSb3cobykpKTtyZXR1cm4gcn1mdW5jdGlvbiBXYSh0KXtsZXQgZT1bXTtmb3IobGV0IHI9MDtyPHQ7cisrKWUucHVzaChyKTtyZXR1cm4gZX1mdW5jdGlvbiBLYSh0KXtsZXQgZT1bdFswXV07Zm9yKGxldCByPTE7cjx0Lmxlbmd0aDtyKyspZVtyXT1lW3ItMV0rdFtyXTtyZXR1cm4gZX1mdW5jdGlvbiBZYSh0LGUpe3ZhciByPU9iamVjdC5rZXlzKHQpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciBuPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModCk7ZSYmKG49bi5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsZSkuZW51bWVyYWJsZX0pKSksci5wdXNoLmFwcGx5KHIsbil9cmV0dXJuIHJ9ZnVuY3Rpb24gWGEodCl7Zm9yKHZhciBlPTE7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl7dmFyIHI9bnVsbCE9YXJndW1lbnRzW2VdP2FyZ3VtZW50c1tlXTp7fTtlJTI/WWEoT2JqZWN0KHIpLCEwKS5mb3JFYWNoKChmdW5jdGlvbihlKXtOYSh0LGUscltlXSl9KSk6T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM/T2JqZWN0LmRlZmluZVByb3BlcnRpZXModCxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhyKSk6WWEoT2JqZWN0KHIpKS5mb3JFYWNoKChmdW5jdGlvbihlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocixlKSl9KSl9cmV0dXJuIHR9Y29uc3QgSmE9e21heEl0ZXJhdGlvbnM6MTAwLHRvbGVyYW5jZToxZS02LGluaXRpYWxpemF0aW9uOiJrbWVhbnMrKyIsZGlzdGFuY2VGdW5jdGlvbjprYX07ZnVuY3Rpb24gWmEodCxlLHIsbixvLHMpe2xldCBpPWZ1bmN0aW9uKHQsZSxyLG4pe2NvbnN0IG89ZVswXS5sZW5ndGg7bGV0IHM9bmV3IEFycmF5KG4pLGk9bmV3IEFycmF5KG4pO2ZvcihsZXQgdD0wO3Q8bjt0Kyspe3NbdF09bmV3IEFycmF5KG8pLGlbdF09MDtmb3IobGV0IGU9MDtlPG87ZSsrKXNbdF1bZV09MH1mb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrKyl7aVtyW3RdXSsrO2ZvcihsZXQgbj0wO248bztuKyspc1tyW3RdXVtuXSs9ZVt0XVtuXX1mb3IobGV0IGU9MDtlPG47ZSsrKWZvcihsZXQgcj0wO3I8bztyKyspaVtlXT9zW2VdW3JdLz1pW2VdOnNbZV1bcl09dFtlXVtyXTtyZXR1cm4gc30odCxlLHI9VGEoZSx0LHIsby5kaXN0YW5jZUZ1bmN0aW9uKSxuKSx1PWZ1bmN0aW9uKHQsZSxyLG4pe2ZvcihsZXQgbz0wO288dC5sZW5ndGg7bysrKWlmKHIodFtvXSxlW29dKT5uKXJldHVybiExO3JldHVybiEwfShpLHQsby5kaXN0YW5jZUZ1bmN0aW9uLG8udG9sZXJhbmNlKTtyZXR1cm4gbmV3IHphKHIsaSx1LHMsby5kaXN0YW5jZUZ1bmN0aW9uKX1mdW5jdGlvbiBIYSh0LGUscil7Y29uc3Qgbj1mdW5jdGlvbih0KXtyZXR1cm4gWGEoWGEoe30sSmEpLHQpfShyKTshZnVuY3Rpb24odCxlKXtpZihlPD0wfHxlPnQubGVuZ3RofHwhTnVtYmVyLmlzSW50ZWdlcihlKSl0aHJvdyBuZXcgRXJyb3IoIksgc2hvdWxkIGJlIGEgcG9zaXRpdmUgaW50ZWdlciBzbWFsbGVyIHRoYW4gdGhlIG51bWJlciBvZiBwb2ludHMiKX0odCxlKTtsZXQgbz1mdW5jdGlvbih0LGUscil7bGV0IG47aWYoQXJyYXkuaXNBcnJheShyLmluaXRpYWxpemF0aW9uKSl7aWYoci5pbml0aWFsaXphdGlvbi5sZW5ndGghPT1lKXRocm93IG5ldyBFcnJvcigiVGhlIGluaXRpYWwgY2VudGVycyBzaG91bGQgaGF2ZSB0aGUgc2FtZSBsZW5ndGggYXMgSyIpO249ci5pbml0aWFsaXphdGlvbn1lbHNlIHN3aXRjaChyLmluaXRpYWxpemF0aW9uKXtjYXNlImttZWFucysrIjpuPWZ1bmN0aW9uKHQsZSxyPXt9KXtjb25zdCBuPW5ldyBVbih0KSxvPW4ucm93cyxzPW5ldyBVYShyLnNlZWQpLGk9W10sdT1yLmxvY2FsVHJpYWxzfHwyK01hdGguZmxvb3IoTWF0aC5sb2coZSkpLGE9cy5yYW5kSW50KG8pO2kucHVzaChuLmdldFJvdyhhKSk7bGV0IGw9bmV3IFVuKDEsbi5yb3dzKTtmb3IobGV0IHQ9MDt0PG4ucm93czt0KyspbC5zZXQoMCx0LGthKG4uZ2V0Um93KHQpLGlbMF0pKTtsZXQgaD1bS2EobC5nZXRSb3coMCkpXTtjb25zdCBjPTEvaFswXVtvLTFdO2xldCBmPVVuLm11bChsLGMpO2ZvcihsZXQgdD0xO3Q8ZTt0Kyspe2NvbnN0IGU9cy5jaG9pY2Uobyx7cmVwbGFjZTohMCxzaXplOnUscHJvYmFiaWxpdGllczpmLmdldFJvdygwKX0pLHI9R2Eobi5zZWxlY3Rpb24oZSxXYShuLmNvbHVtbnMpKSxuKTtsZXQgYT0xLzAsYz0xLzAsbT1sO2ZvcihsZXQgdD0wO3Q8dTt0Kyspe2NvbnN0IG49VW4ubWluKGwsW3IuZ2V0Um93KHQpXSksbz1uLnN1bSgpO288YyYmKGE9ZVt0XSxjPW8sbT1uKX1pW3RdPW4uZ2V0Um93KGEpLGw9bSxoPVtLYShsLmdldFJvdygwKSldLGY9VW4ubXVsKGwsMS9oWzBdW28tMV0pfXJldHVybiBpfSh0LGUscik7YnJlYWs7Y2FzZSJyYW5kb20iOm49ZnVuY3Rpb24odCxlLHIpe3JldHVybiBuZXcgVWEocikuY2hvaWNlKHQse3NpemU6ZX0pfSh0LGUsci5zZWVkKTticmVhaztjYXNlIm1vc3REaXN0YW50IjpuPWZ1bmN0aW9uKHQsZSxyLG4pe2NvbnN0IG89bmV3IFVhKG4pO2xldCBzPW5ldyBBcnJheShlKTtpZihzWzBdPU1hdGguZmxvb3Ioby5yYW5kb20oKSp0Lmxlbmd0aCksZT4xKXtsZXQgbj17ZGlzdDotMSxpbmRleDotMX07Zm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDsrK2UpcltzWzBdXVtlXT5uLmRpc3QmJihuLmRpc3Q9cltzWzBdXVtlXSxuLmluZGV4PWUpO2lmKHNbMV09bi5pbmRleCxlPjIpZm9yKGxldCBuPTI7bjxlOysrbil7bGV0IGU9e2Rpc3Q6LTEsaW5kZXg6LTF9O2ZvcihsZXQgbz0wO288dC5sZW5ndGg7KytvKXtsZXQgdD17ZGlzdDpOdW1iZXIuTUFYX1ZBTFVFLGluZGV4Oi0xfTtmb3IobGV0IGU9MDtlPG47KytlKXJbZV1bb108dC5kaXN0JiYhcy5pbmNsdWRlcyhvKSYmKHQ9e2Rpc3Q6cltlXVtvXSxpbmRleDpvfSk7dC5kaXN0IT09TnVtYmVyLk1BWF9WQUxVRSYmdC5kaXN0PmUuZGlzdCYmKGU9QmEoe30sdCkpfXNbbl09ZS5pbmRleH19cmV0dXJuIHMubWFwKChlPT50W2VdKSl9KHQsZSxmdW5jdGlvbih0LGUpe2xldCByPW5ldyBBcnJheSh0Lmxlbmd0aCk7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDsrK24pZm9yKGxldCBvPW47bzx0Lmxlbmd0aDsrK28pe3Jbbl18fChyW25dPW5ldyBBcnJheSh0Lmxlbmd0aCkpLHJbb118fChyW29dPW5ldyBBcnJheSh0Lmxlbmd0aCkpO2NvbnN0IHM9ZSh0W25dLHRbb10pO3Jbbl1bb109cyxyW29dW25dPXN9cmV0dXJuIHJ9KHQsci5kaXN0YW5jZUZ1bmN0aW9uKSxyLnNlZWQpO2JyZWFrO2RlZmF1bHQ6IWZ1bmN0aW9uKHQsZSl7dGhyb3cgbmV3IEVycm9yKGAke2V9OiAiJHtTdHJpbmcodCl9ImApfShyLmluaXRpYWxpemF0aW9uLCJVbmtub3duIGluaXRpYWxpemF0aW9uIG1ldGhvZCIpfXJldHVybiBufSh0LGUsbik7MD09PW4ubWF4SXRlcmF0aW9ucyYmKG4ubWF4SXRlcmF0aW9ucz1OdW1iZXIuTUFYX1ZBTFVFKTtsZXQgcyxpPW5ldyBBcnJheSh0Lmxlbmd0aCksdT0hMSxhPTA7Zm9yKDshdSYmYTxuLm1heEl0ZXJhdGlvbnM7KXM9WmEobyx0LGksZSxuLCsrYSksdT1zLmNvbnZlcmdlZCxvPXMuY2VudHJvaWRzO2lmKCFzKXRocm93IG5ldyBFcnJvcigidW5yZWFjaGFibGU6IG5vIGttZWFucyBzdGVwIGV4ZWN1dGVkIik7cmV0dXJuIHN9ZnVuY3Rpb24gUWEodCxlPXt9KXtsZXQgcj12ZShlLCJrTnVtYmVyIik7cj1KcihyKT94bihyKToyO2xldCBuLG89dmUoZSwibW9kZSIpO2lmKCJrLW1lZG9pZHMiIT09byYmImstbWVhbnMiIT09byYmKG89ImstbWVkb2lkcyIpLCJrLW1lZG9pZHMiPT09byluPWZ1bmN0aW9uKHQsZSl7bGV0IHI9e307ZnVuY3Rpb24gbih0KXtyZXR1cm4gYmEodCwiOiIpfUhvKHQsKCh0LGUpPT57bGV0IG89bih0KTtyW29dPWV9KSk7bGV0IG89Q2EuQ2x1c3RlcmVyLmdldEluc3RhbmNlKHQsZSkuZ2V0Q2x1c3RlcmVkRGF0YSgpO3JldHVybiBvPUxpKG8sKHQ9PkxpKHQsKHQ9PntsZXQgZT1uKHQpO3JldHVybiByW2VdfSkpKSksb30odCxyKTtlbHNle2lmKCJrLW1lYW5zIiE9PW8pdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG1vZGVbJHtvfV1gKTtuPWZ1bmN0aW9uKHQsZSl7bGV0IHI9SGEodCxlKSxuPXt9O3JldHVybiBIbyhyLmNsdXN0ZXJzLCgodCxlKT0+e25bdF18fChuW3RdPVtdKSxuW3RdLnB1c2goZSl9KSksS2kobil9KHQscil9cmV0dXJuIG59ZnVuY3Rpb24gdGwodCxlPXt9KXtpZighTnIodCkpdGhyb3cgbmV3IEVycm9yKCJkYXRhIGlzIG5vdCBlZmYuIGFycmF5Iik7bGV0IHI9dmUoZSwia051bWJlciIpO0pyKHIpfHwocj0yKSxyPXhuKHIpO2xldCBuPXZlKGUsIm5Db21wTklQQUxTIik7SnIobil8fChuPTIpLG49eG4obik7bGV0IG89dmUoZSwibW9kZSIpLHM9IiIsaT1Tcih0KSx1PTAsYT0wO2lmKEhvKHQsKHQ9PnshZnVuY3Rpb24odCl7aWYoQXIodCkpe2ZvcihsZXQgZSBpbiB0KXJldHVybiEwO3JldHVybiExfXJldHVybiExfSh0KT9Ocih0KSYmKGErPTEpOnUrPTF9KSksdT09PWkpcz0ib2JqIjtlbHNle2lmKGEhPT1pKXRocm93IG5ldyBFcnJvcigiZGF0YSBpcyBub3Qgb2YgdGhlIHNhbWUgdHlwZSIpO3M9Im1hdCJ9bGV0IGwsaD1udWxsOyJvYmoiPT09cz8oaD1mdW5jdGlvbih0KXtsZXQgZT17fTtIbyh0LCh0PT57SG8odCwoKHQscik9PntlW3JdfHwoZVtyXT0wKSwwPT09ZVtyXSYmSnIodCkmJihlW3JdPTEpLDEhPT1lW3JdfHxKcih0KXx8KGVbcl09LTEpfSkpfSkpO2xldCByPVtdO3JldHVybiBIbyhlLCgodCxlKT0+ezE9PT10JiZyLnB1c2goZSl9KSkscn0odCksbD1mdW5jdGlvbih0LGUpe3JldHVybiBMaSh0LCh0PT57bGV0IHI9d2EodCxlKTtyZXR1cm4gS2kocil9KSl9KHQsaCkpOmw9dDtsZXQgYz1IbihsLHtuQ29tcE5JUEFMUzpufSksZj1RYShjLHtrTnVtYmVyOnIsbW9kZTpvfSk7cmV0dXJue2tleXM6aCxnaW5kczpmLGdtYXQ6TGkoZiwodD0+TGkodCwodD0+Y1t0XSkpKSksZ2x0ZHQ6TGkoZiwoZT0+TGkoZSwoZT0+dFtlXSkpKSl9fWxldCBXQ2x1c3Rlcj17UENBOmFzeW5jIGZ1bmN0aW9uKHQsZT17fSl7cmV0dXJuIEhuKHQsZSl9LGNsdXN0ZXI6YXN5bmMgZnVuY3Rpb24odCxlPXt9KXt0cnl7cmV0dXJuIHRsKHQsZSl9Y2F0Y2godCl7cmV0dXJuIFByb21pc2UucmVqZWN0KHQpfX19OwoKbGV0IGluc3RhbmNlID0gbnVsbApmdW5jdGlvbiBpbml0KGlucHV0KXsKCiAgICAvL2luaXQKICAgIGxldCByCiAgICAKICAgICAgICByID0gV0NsdXN0ZXIoLi4uaW5wdXQpCiAgICAgICAgCgogICAgLy9vbgogICAgCgogICAgLy9zYXZlCiAgICBpbnN0YW5jZSA9IHIKCn0KCmZ1bmN0aW9uIHNlbmRNZXNzYWdlKGRhdGEpIHsKICAgIAogICAgICAgIHNlbGYucG9zdE1lc3NhZ2UoZGF0YSkKICAgICAgICAKfQoKYXN5bmMgZnVuY3Rpb24gcnVuKGRhdGEpIHsKICAgIC8vIGNvbnNvbGUubG9nKCdpbm5lciB3b3JrZXIgcnVuJyxkYXRhKQoKICAgIC8vbW9kZQogICAgbGV0IG1vZGUgPSBkYXRhLm1vZGUKCiAgICAvL2NoZWNrCiAgICBpZihtb2RlICE9PSAnaW5pdCcgJiYgbW9kZSAhPT0gJ2NhbGwnKXsKICAgICAgICByZXR1cm4KICAgIH0KCiAgICAvL2luaXQKICAgIGlmKG1vZGUgPT09ICdpbml0Jyl7CiAgICAgICAgCiAgICAgICAgdHJ5ewoKICAgICAgICAgICAgLy90eXBlCiAgICAgICAgICAgIGxldCB0eXBlID0gZGF0YS50eXBlCgogICAgICAgICAgICAvL2lucHV0CiAgICAgICAgICAgIGxldCBpbnB1dCA9IGRhdGEuaW5wdXQKICAgIAogICAgICAgICAgICAvL2luc3RhbmNlCiAgICAgICAgICAgIGlmKHR5cGUgPT09ICdmdW5jdGlvbicpewogICAgICAgICAgICAgICAgaW5pdCguLi5pbnB1dCkKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmKHR5cGUgPT09ICdvYmplY3QnKXsKICAgICAgICAgICAgICAgIGluc3RhbmNlID0gV0NsdXN0ZXIKICAgICAgICAgICAgfQoKICAgICAgICB9CiAgICAgICAgY2F0Y2goZXJyKXsKICAgICAgICAKICAgICAgICAgICAgLy9zZW5kTWVzc2FnZQogICAgICAgICAgICBsZXQgcmVzID0gewogICAgICAgICAgICAgICAgbW9kZTogJ2VtaXQnLAogICAgICAgICAgICAgICAgZXZOYW1lOiAnZXJyb3InLAogICAgICAgICAgICAgICAgbXNnOiBlcnIsCiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2VuZE1lc3NhZ2UocmVzKQoKICAgICAgICB9CiAgICAgICAgICAgIAogICAgfQoKICAgIC8vY2hlY2sKICAgIGlmKG1vZGUgPT09ICdjYWxsJyl7CiAgICAgICAgbGV0IHN0YXRlID0gJycKICAgICAgICBsZXQgbXNnID0gbnVsbAoKICAgICAgICB0cnl7CgogICAgICAgICAgICAvL2Z1bgogICAgICAgICAgICBsZXQgZnVuID0gaW5zdGFuY2VbZGF0YS5mdW5dCgogICAgICAgICAgICAvL2lucHV0CiAgICAgICAgICAgIGxldCBpbnB1dCA9IGRhdGEuaW5wdXQKCiAgICAgICAgICAgIC8vZXhlYwogICAgICAgICAgICBhd2FpdCBmdW4oLi4uaW5wdXQpCiAgICAgICAgICAgICAgICAudGhlbigoc3VjKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGU9J3N1Y2Nlc3MnCiAgICAgICAgICAgICAgICAgICAgbXNnPXN1YwogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgIC5jYXRjaCgoZXJyKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGU9J2Vycm9yJwogICAgICAgICAgICAgICAgICAgIG1zZz1lcnIKICAgICAgICAgICAgICAgIH0pCgogICAgICAgIH0KICAgICAgICBjYXRjaChlcnIpewogICAgICAgICAgICBzdGF0ZSA9ICdlcnJvcicKICAgICAgICAgICAgbXNnID0gZXJyCiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vc2VuZE1lc3NhZ2UKICAgICAgICBsZXQgcmVzID0gewogICAgICAgICAgICBtb2RlOiAncmV0dXJuJywKICAgICAgICAgICAgaWQ6IGRhdGEuaWQsCiAgICAgICAgICAgIGZ1bjogZGF0YS5mdW4sCiAgICAgICAgICAgIHN0YXRlLAogICAgICAgICAgICBtc2csCiAgICAgICAgfQogICAgICAgIHNlbmRNZXNzYWdlKHJlcykKCiAgICB9Cgp9CgpmdW5jdGlvbiByZWN2TWVzc2FnZShkYXRhKSB7CiAgICAvLyBjb25zb2xlLmxvZygnaW5uZXIgd29ya2VyIHJlY3Y6JywgZGF0YSkKCiAgICAvL2RhdGFSZWN2CiAgICBsZXQgZGF0YVJlY3YgPSBkYXRhCgogICAgLy9ydW4KICAgIHJ1bihkYXRhUmVjdikKCn0KCgogICAgICAgIHNlbGYub25tZXNzYWdlID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgcmVjdk1lc3NhZ2UoZS5kYXRhKQogICAgICAgIH0KICAgICAgICAKCg==");function c(){let c=d(),X=function(d){try{let l=new Blob([d]),b=window.URL||window.webkitURL;return new Worker(b.createObjectURL(l))}catch(d){G(d)}}(Z);if(!X)return G("invalid worker"),null;function G(d){c.emit("error",d)}return X.onmessage=function(d){!function(d){let l=d,b=l.mode;"emit"!==b&&"return"!==b||("emit"===b&&c.emit(l.evName,l.msg),"return"===b&&c.emit(l.id,l))}(d.data)},X.onerror=G,function(){let d={mode:"init",type:"object",input:[...arguments]};X.postMessage(d)}([...arguments]),c.PCA=function(){let d=l(),Z=b(),G={mode:"call",id:Z,fun:"PCA",input:[...arguments]};return X.postMessage(G),c.once(Z,(l=>{"success"===l.state?d.resolve(l.msg):d.reject(l.msg)})),d},c.cluster=function(){let d=l(),Z=b(),G={mode:"call",id:Z,fun:"cluster",input:[...arguments]};return X.postMessage(G),c.once(Z,(l=>{"success"===l.state?d.resolve(l.msg):d.reject(l.msg)})),d},c.terminate=function(){X?(X.terminate(),X=void 0):G("worker has been terminated")},c}let X={PCA:async function(){let d=[...arguments],l=c();return await l.PCA(...d).finally((()=>{l.terminate()}))},cluster:async function(){let d=[...arguments],l=c();return await l.cluster(...d).finally((()=>{l.terminate()}))}};C=d();for(let d in X){let l=X[d];C[d]=l}}(),C}()}({get exports(){return Z},set exports(d){Z=d}});var c=Z;let X;return X="undefined"!=typeof window&&void 0!==window.document?c:b,X}));
1
+ !function(d,l){"object"==typeof exports&&"undefined"!=typeof module?module.exports=l(require("worker_threads")):"function"==typeof define&&define.amd?define(["worker_threads"],l):(d="undefined"!=typeof globalThis?globalThis:d||self)["w-cluster"]=l(d.worker_threads)}(this,(function(d){"use strict";"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;var l={};!function(l,b){l.exports=function(d){var l={};!function(d){var l=Object.prototype.hasOwnProperty,b="~";function Z(){}function c(d,l,b){this.fn=d,this.context=l,this.once=b||!1}function X(d,l,Z,X,G){if("function"!=typeof Z)throw new TypeError("The listener must be a function");var y=new c(Z,X||d,G),m=b?b+l:l;return d._events[m]?d._events[m].fn?d._events[m]=[d._events[m],y]:d._events[m].push(y):(d._events[m]=y,d._eventsCount++),d}function G(d,l){0==--d._eventsCount?d._events=new Z:delete d._events[l]}function y(){this._events=new Z,this._eventsCount=0}Object.create&&(Z.prototype=Object.create(null),(new Z).__proto__||(b=!1)),y.prototype.eventNames=function(){var d,Z,c=[];if(0===this._eventsCount)return c;for(Z in d=this._events)l.call(d,Z)&&c.push(b?Z.slice(1):Z);return Object.getOwnPropertySymbols?c.concat(Object.getOwnPropertySymbols(d)):c},y.prototype.listeners=function(d){var l=b?b+d:d,Z=this._events[l];if(!Z)return[];if(Z.fn)return[Z.fn];for(var c=0,X=Z.length,G=new Array(X);c<X;c++)G[c]=Z[c].fn;return G},y.prototype.listenerCount=function(d){var l=b?b+d:d,Z=this._events[l];return Z?Z.fn?1:Z.length:0},y.prototype.emit=function(d,l,Z,c,X,G){var y=b?b+d:d;if(!this._events[y])return!1;var m,K,p=this._events[y],W=arguments.length;if(p.fn){switch(p.once&&this.removeListener(d,p.fn,void 0,!0),W){case 1:return p.fn.call(p.context),!0;case 2:return p.fn.call(p.context,l),!0;case 3:return p.fn.call(p.context,l,Z),!0;case 4:return p.fn.call(p.context,l,Z,c),!0;case 5:return p.fn.call(p.context,l,Z,c,X),!0;case 6:return p.fn.call(p.context,l,Z,c,X,G),!0}for(K=1,m=new Array(W-1);K<W;K++)m[K-1]=arguments[K];p.fn.apply(p.context,m)}else{var I,V=p.length;for(K=0;K<V;K++)switch(p[K].once&&this.removeListener(d,p[K].fn,void 0,!0),W){case 1:p[K].fn.call(p[K].context);break;case 2:p[K].fn.call(p[K].context,l);break;case 3:p[K].fn.call(p[K].context,l,Z);break;case 4:p[K].fn.call(p[K].context,l,Z,c);break;default:if(!m)for(I=1,m=new Array(W-1);I<W;I++)m[I-1]=arguments[I];p[K].fn.apply(p[K].context,m)}}return!0},y.prototype.on=function(d,l,b){return X(this,d,l,b,!1)},y.prototype.once=function(d,l,b){return X(this,d,l,b,!0)},y.prototype.removeListener=function(d,l,Z,c){var X=b?b+d:d;if(!this._events[X])return this;if(!l)return G(this,X),this;var y=this._events[X];if(y.fn)y.fn!==l||c&&!y.once||Z&&y.context!==Z||G(this,X);else{for(var m=0,K=[],p=y.length;m<p;m++)(y[m].fn!==l||c&&!y[m].once||Z&&y[m].context!==Z)&&K.push(y[m]);K.length?this._events[X]=1===K.length?K[0]:K:G(this,X)}return this},y.prototype.removeAllListeners=function(d){var l;return d?(l=b?b+d:d,this._events[l]&&G(this,l)):(this._events=new Z,this._eventsCount=0),this},y.prototype.off=y.prototype.removeListener,y.prototype.addListener=y.prototype.on,y.prefixed=b,y.EventEmitter=y,d.exports=y}({get exports(){return l},set exports(d){l=d}});var b=l;let Z;return function(){if("nodejs"!=("undefined"!=typeof window&&void 0!==window.document?"browser":"nodejs"))return null;function l(){return new b}function c(){let d,l,b=new Promise((function(){d=arguments[0],l=arguments[1]}));return b.resolve=d,b.reject=l,b}function X(){let d=arguments.length>0&&void 0!==arguments[0]?arguments[0]:10,l=[],b="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""),Z=b.length;for(let c=0;c<d;c++)l[c]=b[0|Math.random()*Z];return l.join("")}let G=(y="CgogICAgICAgIGxldCB7IHBhcmVudFBvcnQgfSA9IHJlcXVpcmUoJ3dvcmtlcl90aHJlYWRzJykKICAgICAgICAKCnZhciB0PUFycmF5LmlzQXJyYXksZT0ib2JqZWN0Ij09dHlwZW9mIGdsb2JhbCYmZ2xvYmFsJiZnbG9iYWwuT2JqZWN0PT09T2JqZWN0JiZnbG9iYWwscj0ib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGYmJnNlbGYuT2JqZWN0PT09T2JqZWN0JiZzZWxmLG89ZXx8cnx8RnVuY3Rpb24oInJldHVybiB0aGlzIikoKSxuPW8uU3ltYm9sLHM9T2JqZWN0LnByb3RvdHlwZSxpPXMuaGFzT3duUHJvcGVydHksdT1zLnRvU3RyaW5nLGg9bj9uLnRvU3RyaW5nVGFnOnZvaWQgMDt2YXIgYT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO3ZhciBsPSJbb2JqZWN0IE51bGxdIixjPSJbb2JqZWN0IFVuZGVmaW5lZF0iLGY9bj9uLnRvU3RyaW5nVGFnOnZvaWQgMDtmdW5jdGlvbiBtKHQpe3JldHVybiBudWxsPT10P3ZvaWQgMD09PXQ/YzpsOmYmJmYgaW4gT2JqZWN0KHQpP2Z1bmN0aW9uKHQpe3ZhciBlPWkuY2FsbCh0LGgpLHI9dFtoXTt0cnl7dFtoXT12b2lkIDA7dmFyIG89ITB9Y2F0Y2godCl7fXZhciBuPXUuY2FsbCh0KTtyZXR1cm4gbyYmKGU/dFtoXT1yOmRlbGV0ZSB0W2hdKSxufSh0KTpmdW5jdGlvbih0KXtyZXR1cm4gYS5jYWxsKHQpfSh0KX1mdW5jdGlvbiBnKHQpe3JldHVybiBudWxsIT10JiYib2JqZWN0Ij09dHlwZW9mIHR9dmFyIHA9IltvYmplY3QgU3ltYm9sXSI7ZnVuY3Rpb24gdyh0KXtyZXR1cm4ic3ltYm9sIj09dHlwZW9mIHR8fGcodCkmJm0odCk9PXB9dmFyIGQ9L1wufFxbKD86W15bXF1dKnwoWyInXSkoPzooPyFcMSlbXlxcXXxcXC4pKj9cMSlcXS8sYj0vXlx3KiQvO2Z1bmN0aW9uIHkoZSxyKXtpZih0KGUpKXJldHVybiExO3ZhciBvPXR5cGVvZiBlO3JldHVybiEoIm51bWJlciIhPW8mJiJzeW1ib2wiIT1vJiYiYm9vbGVhbiIhPW8mJm51bGwhPWUmJiF3KGUpKXx8KGIudGVzdChlKXx8IWQudGVzdChlKXx8bnVsbCE9ciYmZSBpbiBPYmplY3QocikpfWZ1bmN0aW9uIHYodCl7dmFyIGU9dHlwZW9mIHQ7cmV0dXJuIG51bGwhPXQmJigib2JqZWN0Ij09ZXx8ImZ1bmN0aW9uIj09ZSl9dmFyIE09IltvYmplY3QgQXN5bmNGdW5jdGlvbl0iLHg9IltvYmplY3QgRnVuY3Rpb25dIixFPSJbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXSIsUz0iW29iamVjdCBQcm94eV0iO2Z1bmN0aW9uIGoodCl7aWYoIXYodCkpcmV0dXJuITE7dmFyIGU9bSh0KTtyZXR1cm4gZT09eHx8ZT09RXx8ZT09TXx8ZT09U312YXIgXyxBPW9bIl9fY29yZS1qc19zaGFyZWRfXyJdLE89KF89L1teLl0rJC8uZXhlYyhBJiZBLmtleXMmJkEua2V5cy5JRV9QUk9UT3x8IiIpKT8iU3ltYm9sKHNyYylfMS4iK186IiI7dmFyIFI9RnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nO2Z1bmN0aW9uIEModCl7aWYobnVsbCE9dCl7dHJ5e3JldHVybiBSLmNhbGwodCl9Y2F0Y2godCl7fXRyeXtyZXR1cm4gdCsiIn1jYXRjaCh0KXt9fXJldHVybiIifXZhciBJPS9eXFtvYmplY3QgLis/Q29uc3RydWN0b3JcXSQvLE49RnVuY3Rpb24ucHJvdG90eXBlLGs9T2JqZWN0LnByb3RvdHlwZSxGPU4udG9TdHJpbmcsUD1rLmhhc093blByb3BlcnR5LFQ9UmVnRXhwKCJeIitGLmNhbGwoUCkucmVwbGFjZSgvW1xcXiQuKis/KClbXF17fXxdL2csIlxcJCYiKS5yZXBsYWNlKC9oYXNPd25Qcm9wZXJ0eXwoZnVuY3Rpb24pLio/KD89XFxcKCl8IGZvciAuKz8oPz1cXFxdKS9nLCIkMS4qPyIpKyIkIik7ZnVuY3Rpb24geih0KXtyZXR1cm4hKCF2KHQpfHwoZT10LE8mJk8gaW4gZSkpJiYoaih0KT9UOkkpLnRlc3QoQyh0KSk7dmFyIGV9ZnVuY3Rpb24gVih0LGUpe3ZhciByPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGw9PXQ/dm9pZCAwOnRbZV19KHQsZSk7cmV0dXJuIHoocik/cjp2b2lkIDB9dmFyICQ9VihPYmplY3QsImNyZWF0ZSIpO3ZhciBxPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dmFyIEQ9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBVKHQpe3ZhciBlPS0xLHI9bnVsbD09dD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPHI7KXt2YXIgbz10W2VdO3RoaXMuc2V0KG9bMF0sb1sxXSl9fWZ1bmN0aW9uIEwodCxlKXtyZXR1cm4gdD09PWV8fHQhPXQmJmUhPWV9ZnVuY3Rpb24gRyh0LGUpe2Zvcih2YXIgcj10Lmxlbmd0aDtyLS07KWlmKEwodFtyXVswXSxlKSlyZXR1cm4gcjtyZXR1cm4tMX1VLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuX19kYXRhX189JD8kKG51bGwpOnt9LHRoaXMuc2l6ZT0wfSxVLnByb3RvdHlwZS5kZWxldGU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5oYXModCkmJmRlbGV0ZSB0aGlzLl9fZGF0YV9fW3RdO3JldHVybiB0aGlzLnNpemUtPWU/MTowLGV9LFUucHJvdG90eXBlLmdldD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fO2lmKCQpe3ZhciByPWVbdF07cmV0dXJuIl9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iPT09cj92b2lkIDA6cn1yZXR1cm4gcS5jYWxsKGUsdCk/ZVt0XTp2b2lkIDB9LFUucHJvdG90eXBlLmhhcz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fO3JldHVybiAkP3ZvaWQgMCE9PWVbdF06RC5jYWxsKGUsdCl9LFUucHJvdG90eXBlLnNldD1mdW5jdGlvbih0LGUpe3ZhciByPXRoaXMuX19kYXRhX187cmV0dXJuIHRoaXMuc2l6ZSs9dGhpcy5oYXModCk/MDoxLHJbdF09JCYmdm9pZCAwPT09ZT8iX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyI6ZSx0aGlzfTt2YXIgQj1BcnJheS5wcm90b3R5cGUuc3BsaWNlO2Z1bmN0aW9uIFcodCl7dmFyIGU9LTEscj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8cjspe3ZhciBvPXRbZV07dGhpcy5zZXQob1swXSxvWzFdKX19Vy5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLl9fZGF0YV9fPVtdLHRoaXMuc2l6ZT0wfSxXLnByb3RvdHlwZS5kZWxldGU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxyPUcoZSx0KTtyZXR1cm4hKHI8MCkmJihyPT1lLmxlbmd0aC0xP2UucG9wKCk6Qi5jYWxsKGUsciwxKSwtLXRoaXMuc2l6ZSwhMCl9LFcucHJvdG90eXBlLmdldD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fLHI9RyhlLHQpO3JldHVybiByPDA/dm9pZCAwOmVbcl1bMV19LFcucHJvdG90eXBlLmhhcz1mdW5jdGlvbih0KXtyZXR1cm4gRyh0aGlzLl9fZGF0YV9fLHQpPi0xfSxXLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLl9fZGF0YV9fLG89RyhyLHQpO3JldHVybiBvPDA/KCsrdGhpcy5zaXplLHIucHVzaChbdCxlXSkpOnJbb11bMV09ZSx0aGlzfTt2YXIgSz1WKG8sIk1hcCIpO2Z1bmN0aW9uIFkodCxlKXt2YXIgcixvLG49dC5fX2RhdGFfXztyZXR1cm4oInN0cmluZyI9PShvPXR5cGVvZihyPWUpKXx8Im51bWJlciI9PW98fCJzeW1ib2wiPT1vfHwiYm9vbGVhbiI9PW8/Il9fcHJvdG9fXyIhPT1yOm51bGw9PT1yKT9uWyJzdHJpbmciPT10eXBlb2YgZT8ic3RyaW5nIjoiaGFzaCJdOm4ubWFwfWZ1bmN0aW9uIFgodCl7dmFyIGU9LTEscj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8cjspe3ZhciBvPXRbZV07dGhpcy5zZXQob1swXSxvWzFdKX19WC5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLnNpemU9MCx0aGlzLl9fZGF0YV9fPXtoYXNoOm5ldyBVLG1hcDpuZXcoS3x8Vyksc3RyaW5nOm5ldyBVfX0sWC5wcm90b3R5cGUuZGVsZXRlPWZ1bmN0aW9uKHQpe3ZhciBlPVkodGhpcyx0KS5kZWxldGUodCk7cmV0dXJuIHRoaXMuc2l6ZS09ZT8xOjAsZX0sWC5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiBZKHRoaXMsdCkuZ2V0KHQpfSxYLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24odCl7cmV0dXJuIFkodGhpcyx0KS5oYXModCl9LFgucHJvdG90eXBlLnNldD1mdW5jdGlvbih0LGUpe3ZhciByPVkodGhpcyx0KSxvPXIuc2l6ZTtyZXR1cm4gci5zZXQodCxlKSx0aGlzLnNpemUrPXIuc2l6ZT09bz8wOjEsdGhpc307dmFyIEo9IkV4cGVjdGVkIGEgZnVuY3Rpb24iO2Z1bmN0aW9uIFoodCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdHx8bnVsbCE9ZSYmImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcihKKTt2YXIgcj1mdW5jdGlvbigpe3ZhciBvPWFyZ3VtZW50cyxuPWU/ZS5hcHBseSh0aGlzLG8pOm9bMF0scz1yLmNhY2hlO2lmKHMuaGFzKG4pKXJldHVybiBzLmdldChuKTt2YXIgaT10LmFwcGx5KHRoaXMsbyk7cmV0dXJuIHIuY2FjaGU9cy5zZXQobixpKXx8cyxpfTtyZXR1cm4gci5jYWNoZT1uZXcoWi5DYWNoZXx8WCkscn1aLkNhY2hlPVg7dmFyIEgsUSx0dCxldD0vW14uW1xdXSt8XFsoPzooLT9cZCsoPzpcLlxkKyk/KXwoWyInXSkoKD86KD8hXDIpW15cXF18XFwuKSo/KVwyKVxdfCg/PSg/OlwufFxbXF0pKD86XC58XFtcXXwkKSkvZyxydD0vXFwoXFwpPy9nLG90PShIPWZ1bmN0aW9uKHQpe3ZhciBlPVtdO3JldHVybiA0Nj09PXQuY2hhckNvZGVBdCgwKSYmZS5wdXNoKCIiKSx0LnJlcGxhY2UoZXQsKGZ1bmN0aW9uKHQscixvLG4pe2UucHVzaChvP24ucmVwbGFjZShydCwiJDEiKTpyfHx0KX0pKSxlfSxRPVooSCwoZnVuY3Rpb24odCl7cmV0dXJuIDUwMD09PXR0LnNpemUmJnR0LmNsZWFyKCksdH0pKSx0dD1RLmNhY2hlLFEpLG50PW90O2Z1bmN0aW9uIHN0KHQsZSl7Zm9yKHZhciByPS0xLG89bnVsbD09dD8wOnQubGVuZ3RoLG49QXJyYXkobyk7KytyPG87KW5bcl09ZSh0W3JdLHIsdCk7cmV0dXJuIG59dmFyIGl0PTEvMCx1dD1uP24ucHJvdG90eXBlOnZvaWQgMCxodD11dD91dC50b1N0cmluZzp2b2lkIDA7ZnVuY3Rpb24gYXQoZSl7aWYoInN0cmluZyI9PXR5cGVvZiBlKXJldHVybiBlO2lmKHQoZSkpcmV0dXJuIHN0KGUsYXQpKyIiO2lmKHcoZSkpcmV0dXJuIGh0P2h0LmNhbGwoZSk6IiI7dmFyIHI9ZSsiIjtyZXR1cm4iMCI9PXImJjEvZT09LWl0PyItMCI6cn1mdW5jdGlvbiBsdCh0KXtyZXR1cm4gbnVsbD09dD8iIjphdCh0KX1mdW5jdGlvbiBjdChlLHIpe3JldHVybiB0KGUpP2U6eShlLHIpP1tlXTpudChsdChlKSl9dmFyIGZ0PTEvMDtmdW5jdGlvbiBtdCh0KXtpZigic3RyaW5nIj09dHlwZW9mIHR8fHcodCkpcmV0dXJuIHQ7dmFyIGU9dCsiIjtyZXR1cm4iMCI9PWUmJjEvdD09LWZ0PyItMCI6ZX1mdW5jdGlvbiBndCh0LGUpe2Zvcih2YXIgcj0wLG89KGU9Y3QoZSx0KSkubGVuZ3RoO251bGwhPXQmJnI8bzspdD10W210KGVbcisrXSldO3JldHVybiByJiZyPT1vP3Q6dm9pZCAwfWZ1bmN0aW9uIHB0KHQsZSxyKXt2YXIgbz1udWxsPT10P3ZvaWQgMDpndCh0LGUpO3JldHVybiB2b2lkIDA9PT1vP3I6b312YXIgd3Q9T2JqZWN0LnByb3RvdHlwZTt2YXIgZHQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZnVuY3Rpb24ocil7cmV0dXJuIHQoZShyKSl9fShPYmplY3Qua2V5cyxPYmplY3QpLGJ0PWR0LHl0PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gdnQodCl7aWYocj0oZT10KSYmZS5jb25zdHJ1Y3RvcixlIT09KCJmdW5jdGlvbiI9PXR5cGVvZiByJiZyLnByb3RvdHlwZXx8d3QpKXJldHVybiBidCh0KTt2YXIgZSxyLG89W107Zm9yKHZhciBuIGluIE9iamVjdCh0KSl5dC5jYWxsKHQsbikmJiJjb25zdHJ1Y3RvciIhPW4mJm8ucHVzaChuKTtyZXR1cm4gb312YXIgTXQ9VihvLCJEYXRhVmlldyIpLHh0PVYobywiUHJvbWlzZSIpLEV0PVYobywiU2V0IiksU3Q9VihvLCJXZWFrTWFwIiksanQ9IltvYmplY3QgTWFwXSIsX3Q9IltvYmplY3QgUHJvbWlzZV0iLEF0PSJbb2JqZWN0IFNldF0iLE90PSJbb2JqZWN0IFdlYWtNYXBdIixSdD0iW29iamVjdCBEYXRhVmlld10iLEN0PUMoTXQpLEl0PUMoSyksTnQ9Qyh4dCksa3Q9QyhFdCksRnQ9QyhTdCksUHQ9bTsoTXQmJlB0KG5ldyBNdChuZXcgQXJyYXlCdWZmZXIoMSkpKSE9UnR8fEsmJlB0KG5ldyBLKSE9anR8fHh0JiZQdCh4dC5yZXNvbHZlKCkpIT1fdHx8RXQmJlB0KG5ldyBFdCkhPUF0fHxTdCYmUHQobmV3IFN0KSE9T3QpJiYoUHQ9ZnVuY3Rpb24odCl7dmFyIGU9bSh0KSxyPSJbb2JqZWN0IE9iamVjdF0iPT1lP3QuY29uc3RydWN0b3I6dm9pZCAwLG89cj9DKHIpOiIiO2lmKG8pc3dpdGNoKG8pe2Nhc2UgQ3Q6cmV0dXJuIFJ0O2Nhc2UgSXQ6cmV0dXJuIGp0O2Nhc2UgTnQ6cmV0dXJuIF90O2Nhc2Uga3Q6cmV0dXJuIEF0O2Nhc2UgRnQ6cmV0dXJuIE90fXJldHVybiBlfSk7dmFyIFR0PVB0LHp0PTkwMDcxOTkyNTQ3NDA5OTE7ZnVuY3Rpb24gVnQodCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0JiZ0Pi0xJiZ0JTE9PTAmJnQ8PXp0fWZ1bmN0aW9uICR0KHQpe3JldHVybiBudWxsIT10JiZWdCh0Lmxlbmd0aCkmJiFqKHQpfXZhciBxdD0iW29iamVjdCBTdHJpbmddIjtmdW5jdGlvbiBEdCh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/dm9pZCAwOmVbdF19fXZhciBVdD1EdCgibGVuZ3RoIiksTHQ9UmVnRXhwKCJbXFx1MjAwZFxcdWQ4MDAtXFx1ZGZmZlxcdTAzMDAtXFx1MDM2ZlxcdWZlMjAtXFx1ZmUyZlxcdTIwZDAtXFx1MjBmZlxcdWZlMGVcXHVmZTBmXSIpO3ZhciBHdD0iXFx1ZDgwMC1cXHVkZmZmIixCdD0iWyIrR3QrIl0iLFd0PSJbXFx1MDMwMC1cXHUwMzZmXFx1ZmUyMC1cXHVmZTJmXFx1MjBkMC1cXHUyMGZmXSIsS3Q9IlxcdWQ4M2NbXFx1ZGZmYi1cXHVkZmZmXSIsWXQ9IlteIitHdCsiXSIsWHQ9Iig/OlxcdWQ4M2NbXFx1ZGRlNi1cXHVkZGZmXSl7Mn0iLEp0PSJbXFx1ZDgwMC1cXHVkYmZmXVtcXHVkYzAwLVxcdWRmZmZdIixadD0iKD86IitXdCsifCIrS3QrIikiKyI/IixIdD0iW1xcdWZlMGVcXHVmZTBmXT8iLFF0PUh0K1p0KygiKD86XFx1MjAwZCg/OiIrW1l0LFh0LEp0XS5qb2luKCJ8IikrIikiK0h0K1p0KyIpKiIpLHRlPSIoPzoiK1tZdCtXdCsiPyIsV3QsWHQsSnQsQnRdLmpvaW4oInwiKSsiKSIsZWU9UmVnRXhwKEt0KyIoPz0iK0t0KyIpfCIrdGUrUXQsImciKTtmdW5jdGlvbiByZSh0KXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIEx0LnRlc3QodCl9KHQpP2Z1bmN0aW9uKHQpe2Zvcih2YXIgZT1lZS5sYXN0SW5kZXg9MDtlZS50ZXN0KHQpOykrK2U7cmV0dXJuIGV9KHQpOlV0KHQpfXZhciBvZT0iW29iamVjdCBNYXBdIixuZT0iW29iamVjdCBTZXRdIjtmdW5jdGlvbiBzZShlKXtpZihudWxsPT1lKXJldHVybiAwO2lmKCR0KGUpKXJldHVybiJzdHJpbmciPT10eXBlb2Yocj1lKXx8IXQocikmJmcocikmJm0ocik9PXF0P3JlKGUpOmUubGVuZ3RoO3ZhciByLG89VHQoZSk7cmV0dXJuIG89PW9lfHxvPT1uZT9lLnNpemU6dnQoZSkubGVuZ3RofWZ1bmN0aW9uIGllKHQpe3JldHVybiJbb2JqZWN0IEFycmF5XSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9ZnVuY3Rpb24gdWUodCl7cmV0dXJuIltvYmplY3QgT2JqZWN0XSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9ZnVuY3Rpb24gaGUodCl7cmV0dXJuIltvYmplY3QgU3RyaW5nXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9ZnVuY3Rpb24gYWUodCl7cmV0dXJuIHQhPXR9ZnVuY3Rpb24gbGUodCl7cmV0dXJuISFmdW5jdGlvbih0KXtyZXR1cm4iW29iamVjdCBVbmRlZmluZWRdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX0odCl8fCghIWZ1bmN0aW9uKHQpe3JldHVybiJbb2JqZWN0IE51bGxdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX0odCl8fCghIWZ1bmN0aW9uKHQpe2lmKHVlKHQpKXtmb3IobGV0IGUgaW4gdClyZXR1cm4hMTtyZXR1cm4hMH1yZXR1cm4hMX0odCl8fCghIWZ1bmN0aW9uKHQpe3JldHVybiEoIWhlKHQpfHwiIiE9PXQpfSh0KXx8KCEhZnVuY3Rpb24odCl7cmV0dXJuISFpZSh0KSYmMD09PXQubGVuZ3RofSh0KXx8ISFhZSh0KSkpKSl9ZnVuY3Rpb24gY2UodCl7cmV0dXJuISFpZSh0KSYmKDAhPT10Lmxlbmd0aCYmKDEhPT10Lmxlbmd0aHx8IWxlKHRbMF0pKSl9dmFyIGZlPSJbb2JqZWN0IEJvb2xlYW5dIjtmdW5jdGlvbiBtZSh0KXtyZXR1cm4hMD09PShlPXQpfHwhMT09PWV8fGcoZSkmJm0oZSk9PWZlO3ZhciBlfWZ1bmN0aW9uIGdlKHQpe3JldHVybiEoIWhlKHQpfHwiIj09PXQpfWZ1bmN0aW9uIHBlKHQpe2xldCBlPSExO2lmKGdlKHQpKWU9IWlzTmFOKE51bWJlcih0KSk7ZWxzZSBpZihmdW5jdGlvbih0KXtyZXR1cm4iW29iamVjdCBOdW1iZXJdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX0odCkpe2lmKGFlKHQpKXJldHVybiExO2U9ITB9cmV0dXJuIGV9dmFyIHdlPS9ccy87dmFyIGRlPS9eXHMrLztmdW5jdGlvbiBiZSh0KXtyZXR1cm4gdD90LnNsaWNlKDAsZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQubGVuZ3RoO2UtLSYmd2UudGVzdCh0LmNoYXJBdChlKSk7KTtyZXR1cm4gZX0odCkrMSkucmVwbGFjZShkZSwiIik6dH12YXIgeWU9TmFOLHZlPS9eWy0rXTB4WzAtOWEtZl0rJC9pLE1lPS9eMGJbMDFdKyQvaSx4ZT0vXjBvWzAtN10rJC9pLEVlPXBhcnNlSW50O2Z1bmN0aW9uIFNlKHQpe2lmKCJudW1iZXIiPT10eXBlb2YgdClyZXR1cm4gdDtpZih3KHQpKXJldHVybiB5ZTtpZih2KHQpKXt2YXIgZT0iZnVuY3Rpb24iPT10eXBlb2YgdC52YWx1ZU9mP3QudmFsdWVPZigpOnQ7dD12KGUpP2UrIiI6ZX1pZigic3RyaW5nIiE9dHlwZW9mIHQpcmV0dXJuIDA9PT10P3Q6K3Q7dD1iZSh0KTt2YXIgcj1NZS50ZXN0KHQpO3JldHVybiByfHx4ZS50ZXN0KHQpP0VlKHQuc2xpY2UoMikscj8yOjgpOnZlLnRlc3QodCk/eWU6K3R9dmFyIGplPTEvMCxfZT0xNzk3NjkzMTM0ODYyMzE1N2UyOTI7ZnVuY3Rpb24gQWUodCl7cmV0dXJuIHQ/KHQ9U2UodCkpPT09amV8fHQ9PT0tamU/KHQ8MD8tMToxKSpfZTp0PT10P3Q6MDowPT09dD90OjB9dmFyIE9lPW8uaXNGaW5pdGUsUmU9TWF0aC5taW47dmFyIENlPWZ1bmN0aW9uKHQpe3ZhciBlPU1hdGhbdF07cmV0dXJuIGZ1bmN0aW9uKHQscil7aWYodD1TZSh0KSxyPW51bGw9PXI/MDpSZShmdW5jdGlvbih0KXt2YXIgZT1BZSh0KSxyPWUlMTtyZXR1cm4gZT09ZT9yP2UtcjplOjB9KHIpLDI5MiksciYmT2UodCkpe3ZhciBvPShsdCh0KSsiZSIpLnNwbGl0KCJlIik7cmV0dXJuKygobz0obHQoZShvWzBdKyJlIisoK29bMV0rcikpKSsiZSIpLnNwbGl0KCJlIikpWzBdKyJlIisoK29bMV0tcikpfXJldHVybiBlKHQpfX0oInJvdW5kIiksSWU9Q2U7ZnVuY3Rpb24gTmUodCl7aWYoIXBlKHQpKXJldHVybiAwO3Q9ZnVuY3Rpb24odCl7cmV0dXJuIHBlKHQpP0FlKHQpOjB9KHQpO2xldCBlPUllKHQpO3JldHVybiIwIj09PVN0cmluZyhlKT8wOmV9Y29uc3Qga2U9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztmdW5jdGlvbiBGZSh0KXtyZXR1cm4ga2UuY2FsbCh0KS5lbmRzV2l0aCgiQXJyYXldIil9ZnVuY3Rpb24gUGUodCl7dmFyIGUscj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e307aWYoIUZlKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoImlucHV0IG11c3QgYmUgYW4gYXJyYXkiKTtpZigwPT09dC5sZW5ndGgpdGhyb3cgbmV3IFR5cGVFcnJvcigiaW5wdXQgbXVzdCBub3QgYmUgZW1wdHkiKTtpZih2b2lkIDAhPT1yLm91dHB1dCl7aWYoIUZlKHIub3V0cHV0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJvdXRwdXQgb3B0aW9uIG11c3QgYmUgYW4gYXJyYXkgaWYgc3BlY2lmaWVkIik7ZT1yLm91dHB1dH1lbHNlIGU9bmV3IEFycmF5KHQubGVuZ3RoKTt2YXIgbz1mdW5jdGlvbih0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e307aWYoIUZlKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoImlucHV0IG11c3QgYmUgYW4gYXJyYXkiKTtpZigwPT09dC5sZW5ndGgpdGhyb3cgbmV3IFR5cGVFcnJvcigiaW5wdXQgbXVzdCBub3QgYmUgZW1wdHkiKTt2YXIgcj1lLmZyb21JbmRleCxvPXZvaWQgMD09PXI/MDpyLG49ZS50b0luZGV4LHM9dm9pZCAwPT09bj90Lmxlbmd0aDpuO2lmKG88MHx8bz49dC5sZW5ndGh8fCFOdW1iZXIuaXNJbnRlZ2VyKG8pKXRocm93IG5ldyBFcnJvcigiZnJvbUluZGV4IG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIHNtYWxsZXIgdGhhbiBsZW5ndGgiKTtpZihzPD1vfHxzPnQubGVuZ3RofHwhTnVtYmVyLmlzSW50ZWdlcihzKSl0aHJvdyBuZXcgRXJyb3IoInRvSW5kZXggbXVzdCBiZSBhbiBpbnRlZ2VyIGdyZWF0ZXIgdGhhbiBmcm9tSW5kZXggYW5kIGF0IG1vc3QgZXF1YWwgdG8gbGVuZ3RoIik7Zm9yKHZhciBpPXRbb10sdT1vKzE7dTxzO3UrKyl0W3VdPGkmJihpPXRbdV0pO3JldHVybiBpfSh0KSxuPWZ1bmN0aW9uKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fTtpZighRmUodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiaW5wdXQgbXVzdCBiZSBhbiBhcnJheSIpO2lmKDA9PT10Lmxlbmd0aCl0aHJvdyBuZXcgVHlwZUVycm9yKCJpbnB1dCBtdXN0IG5vdCBiZSBlbXB0eSIpO3ZhciByPWUuZnJvbUluZGV4LG89dm9pZCAwPT09cj8wOnIsbj1lLnRvSW5kZXgscz12b2lkIDA9PT1uP3QubGVuZ3RoOm47aWYobzwwfHxvPj10Lmxlbmd0aHx8IU51bWJlci5pc0ludGVnZXIobykpdGhyb3cgbmV3IEVycm9yKCJmcm9tSW5kZXggbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgc21hbGxlciB0aGFuIGxlbmd0aCIpO2lmKHM8PW98fHM+dC5sZW5ndGh8fCFOdW1iZXIuaXNJbnRlZ2VyKHMpKXRocm93IG5ldyBFcnJvcigidG9JbmRleCBtdXN0IGJlIGFuIGludGVnZXIgZ3JlYXRlciB0aGFuIGZyb21JbmRleCBhbmQgYXQgbW9zdCBlcXVhbCB0byBsZW5ndGgiKTtmb3IodmFyIGk9dFtvXSx1PW8rMTt1PHM7dSsrKXRbdV0+aSYmKGk9dFt1XSk7cmV0dXJuIGl9KHQpO2lmKG89PT1uKXRocm93IG5ldyBSYW5nZUVycm9yKCJtaW5pbXVtIGFuZCBtYXhpbXVtIGlucHV0IHZhbHVlcyBhcmUgZXF1YWwuIENhbm5vdCByZXNjYWxlIGEgY29uc3RhbnQgYXJyYXkiKTt2YXIgcz1yLm1pbixpPXZvaWQgMD09PXM/ci5hdXRvTWluTWF4P286MDpzLHU9ci5tYXgsaD12b2lkIDA9PT11P3IuYXV0b01pbk1heD9uOjE6dTtpZihpPj1oKXRocm93IG5ldyBSYW5nZUVycm9yKCJtaW4gb3B0aW9uIG11c3QgYmUgc21hbGxlciB0aGFuIG1heCBvcHRpb24iKTtmb3IodmFyIGE9KGgtaSkvKG4tbyksbD0wO2w8dC5sZW5ndGg7bCsrKWVbbF09KHRbbF0tbykqYStpO3JldHVybiBlfWNvbnN0IFRlPSIgIi5yZXBlYXQoMiksemU9IiAiLnJlcGVhdCg0KTtmdW5jdGlvbiBWZSh0LGU9e30pe2NvbnN0e21heFJvd3M6cj0xNSxtYXhDb2x1bW5zOm89MTAsbWF4TnVtU2l6ZTpuPTgscGFkTWludXM6cz0iYXV0byJ9PWU7cmV0dXJuYCR7dC5jb25zdHJ1Y3Rvci5uYW1lfSB7XG4ke1RlfVtcbiR7emV9JHtmdW5jdGlvbih0LGUscixvLG4pe2NvbnN0e3Jvd3M6cyxjb2x1bW5zOml9PXQsdT1NYXRoLm1pbihzLGUpLGg9TWF0aC5taW4oaSxyKSxhPVtdO2lmKCJhdXRvIj09PW4pe249ITE7dDpmb3IobGV0IGU9MDtlPHU7ZSsrKWZvcihsZXQgcj0wO3I8aDtyKyspaWYodC5nZXQoZSxyKTwwKXtuPSEwO2JyZWFrIHR9fWZvcihsZXQgZT0wO2U8dTtlKyspe2xldCByPVtdO2ZvcihsZXQgcz0wO3M8aDtzKyspci5wdXNoKCRlKHQuZ2V0KGUscyksbyxuKSk7YS5wdXNoKGAke3Iuam9pbigiICIpfWApfWghPT1pJiYoYVthLmxlbmd0aC0xXSs9YCAuLi4gJHtpLXJ9IG1vcmUgY29sdW1uc2ApO3UhPT1zJiZhLnB1c2goYC4uLiAke3MtZX0gbW9yZSByb3dzYCk7cmV0dXJuIGEuam9pbihgXG4ke3plfWApfSh0LHIsbyxuLHMpfVxuJHtUZX1dXG4ke1RlfXJvd3M6ICR7dC5yb3dzfVxuJHtUZX1jb2x1bW5zOiAke3QuY29sdW1uc31cbn1gfWZ1bmN0aW9uICRlKHQsZSxyKXtyZXR1cm4odD49MCYmcj9gICR7cWUodCxlLTEpfWA6cWUodCxlKSkucGFkRW5kKGUpfWZ1bmN0aW9uIHFlKHQsZSl7bGV0IHI9dC50b1N0cmluZygpO2lmKHIubGVuZ3RoPD1lKXJldHVybiByO2xldCBvPXQudG9GaXhlZChlKTtpZihvLmxlbmd0aD5lJiYobz10LnRvRml4ZWQoTWF0aC5tYXgoMCxlLShvLmxlbmd0aC1lKSkpKSxvLmxlbmd0aDw9ZSYmIW8uc3RhcnRzV2l0aCgiMC4wMDAiKSYmIW8uc3RhcnRzV2l0aCgiLTAuMDAwIikpcmV0dXJuIG87bGV0IG49dC50b0V4cG9uZW50aWFsKGUpO3JldHVybiBuLmxlbmd0aD5lJiYobj10LnRvRXhwb25lbnRpYWwoTWF0aC5tYXgoMCxlLShuLmxlbmd0aC1lKSkpKSxuLnNsaWNlKDApfWZ1bmN0aW9uIERlKHQsZSxyKXtsZXQgbz1yP3Qucm93czp0LnJvd3MtMTtpZihlPDB8fGU+byl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiUm93IGluZGV4IG91dCBvZiByYW5nZSIpfWZ1bmN0aW9uIFVlKHQsZSxyKXtsZXQgbz1yP3QuY29sdW1uczp0LmNvbHVtbnMtMTtpZihlPDB8fGU+byl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQ29sdW1uIGluZGV4IG91dCBvZiByYW5nZSIpfWZ1bmN0aW9uIExlKHQsZSl7aWYoZS50bzFEQXJyYXkmJihlPWUudG8xREFycmF5KCkpLGUubGVuZ3RoIT09dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJ2ZWN0b3Igc2l6ZSBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgb2YgY29sdW1ucyIpO3JldHVybiBlfWZ1bmN0aW9uIEdlKHQsZSl7aWYoZS50bzFEQXJyYXkmJihlPWUudG8xREFycmF5KCkpLGUubGVuZ3RoIT09dC5yb3dzKXRocm93IG5ldyBSYW5nZUVycm9yKCJ2ZWN0b3Igc2l6ZSBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgb2Ygcm93cyIpO3JldHVybiBlfWZ1bmN0aW9uIEJlKHQsZSxyLG8sbil7aWYoNSE9PWFyZ3VtZW50cy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoImV4cGVjdGVkIDQgYXJndW1lbnRzIik7aWYoS2UoInN0YXJ0Um93IixlKSxLZSgiZW5kUm93IixyKSxLZSgic3RhcnRDb2x1bW4iLG8pLEtlKCJlbmRDb2x1bW4iLG4pLGU+cnx8bz5ufHxlPDB8fGU+PXQucm93c3x8cjwwfHxyPj10LnJvd3N8fG88MHx8bz49dC5jb2x1bW5zfHxuPDB8fG4+PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiU3VibWF0cml4IGluZGljZXMgYXJlIG91dCBvZiByYW5nZSIpfWZ1bmN0aW9uIFdlKHQsZT0wKXtsZXQgcj1bXTtmb3IobGV0IG89MDtvPHQ7bysrKXIucHVzaChlKTtyZXR1cm4gcn1mdW5jdGlvbiBLZSh0LGUpe2lmKCJudW1iZXIiIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKGAke3R9IG11c3QgYmUgYSBudW1iZXJgKX1mdW5jdGlvbiBZZSh0KXtpZih0LmlzRW1wdHkoKSl0aHJvdyBuZXcgRXJyb3IoIkVtcHR5IG1hdHJpeCBoYXMgbm8gZWxlbWVudHMgdG8gaW5kZXgiKX1jbGFzcyBYZXtzdGF0aWMgZnJvbTFEQXJyYXkodCxlLHIpe2lmKHQqZSE9PXIubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJkYXRhIGxlbmd0aCBkb2VzIG5vdCBtYXRjaCBnaXZlbiBkaW1lbnNpb25zIik7bGV0IG89bmV3IFplKHQsZSk7Zm9yKGxldCBuPTA7bjx0O24rKylmb3IobGV0IHQ9MDt0PGU7dCsrKW8uc2V0KG4sdCxyW24qZSt0XSk7cmV0dXJuIG99c3RhdGljIHJvd1ZlY3Rvcih0KXtsZXQgZT1uZXcgWmUoMSx0Lmxlbmd0aCk7Zm9yKGxldCByPTA7cjx0Lmxlbmd0aDtyKyspZS5zZXQoMCxyLHRbcl0pO3JldHVybiBlfXN0YXRpYyBjb2x1bW5WZWN0b3IodCl7bGV0IGU9bmV3IFplKHQubGVuZ3RoLDEpO2ZvcihsZXQgcj0wO3I8dC5sZW5ndGg7cisrKWUuc2V0KHIsMCx0W3JdKTtyZXR1cm4gZX1zdGF0aWMgemVyb3ModCxlKXtyZXR1cm4gbmV3IFplKHQsZSl9c3RhdGljIG9uZXModCxlKXtyZXR1cm4gbmV3IFplKHQsZSkuZmlsbCgxKX1zdGF0aWMgcmFuZCh0LGUscj17fSl7aWYoIm9iamVjdCIhPXR5cGVvZiByKXRocm93IG5ldyBUeXBlRXJyb3IoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiKTtjb25zdHtyYW5kb206bz1NYXRoLnJhbmRvbX09cjtsZXQgbj1uZXcgWmUodCxlKTtmb3IobGV0IHI9MDtyPHQ7cisrKWZvcihsZXQgdD0wO3Q8ZTt0Kyspbi5zZXQocix0LG8oKSk7cmV0dXJuIG59c3RhdGljIHJhbmRJbnQodCxlLHI9e30pe2lmKCJvYmplY3QiIT10eXBlb2Ygcil0aHJvdyBuZXcgVHlwZUVycm9yKCJvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0Iik7Y29uc3R7bWluOm89MCxtYXg6bj0xZTMscmFuZG9tOnM9TWF0aC5yYW5kb219PXI7aWYoIU51bWJlci5pc0ludGVnZXIobykpdGhyb3cgbmV3IFR5cGVFcnJvcigibWluIG11c3QgYmUgYW4gaW50ZWdlciIpO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKG4pKXRocm93IG5ldyBUeXBlRXJyb3IoIm1heCBtdXN0IGJlIGFuIGludGVnZXIiKTtpZihvPj1uKXRocm93IG5ldyBSYW5nZUVycm9yKCJtaW4gbXVzdCBiZSBzbWFsbGVyIHRoYW4gbWF4Iik7bGV0IGk9bi1vLHU9bmV3IFplKHQsZSk7Zm9yKGxldCByPTA7cjx0O3IrKylmb3IobGV0IHQ9MDt0PGU7dCsrKXtsZXQgZT1vK01hdGgucm91bmQocygpKmkpO3Uuc2V0KHIsdCxlKX1yZXR1cm4gdX1zdGF0aWMgZXllKHQsZSxyKXt2b2lkIDA9PT1lJiYoZT10KSx2b2lkIDA9PT1yJiYocj0xKTtsZXQgbz1NYXRoLm1pbih0LGUpLG49dGhpcy56ZXJvcyh0LGUpO2ZvcihsZXQgdD0wO3Q8bzt0Kyspbi5zZXQodCx0LHIpO3JldHVybiBufXN0YXRpYyBkaWFnKHQsZSxyKXtsZXQgbz10Lmxlbmd0aDt2b2lkIDA9PT1lJiYoZT1vKSx2b2lkIDA9PT1yJiYocj1lKTtsZXQgbj1NYXRoLm1pbihvLGUscikscz10aGlzLnplcm9zKGUscik7Zm9yKGxldCBlPTA7ZTxuO2UrKylzLnNldChlLGUsdFtlXSk7cmV0dXJuIHN9c3RhdGljIG1pbih0LGUpe3Q9dGhpcy5jaGVja01hdHJpeCh0KSxlPXRoaXMuY2hlY2tNYXRyaXgoZSk7bGV0IHI9dC5yb3dzLG89dC5jb2x1bW5zLG49bmV3IFplKHIsbyk7Zm9yKGxldCBzPTA7czxyO3MrKylmb3IobGV0IHI9MDtyPG87cisrKW4uc2V0KHMscixNYXRoLm1pbih0LmdldChzLHIpLGUuZ2V0KHMscikpKTtyZXR1cm4gbn1zdGF0aWMgbWF4KHQsZSl7dD10aGlzLmNoZWNrTWF0cml4KHQpLGU9dGhpcy5jaGVja01hdHJpeChlKTtsZXQgcj10LnJvd3Msbz10LmNvbHVtbnMsbj1uZXcgdGhpcyhyLG8pO2ZvcihsZXQgcz0wO3M8cjtzKyspZm9yKGxldCByPTA7cjxvO3IrKyluLnNldChzLHIsTWF0aC5tYXgodC5nZXQocyxyKSxlLmdldChzLHIpKSk7cmV0dXJuIG59c3RhdGljIGNoZWNrTWF0cml4KHQpe3JldHVybiBYZS5pc01hdHJpeCh0KT90Om5ldyBaZSh0KX1zdGF0aWMgaXNNYXRyaXgodCl7cmV0dXJuIG51bGwhPXQmJiJNYXRyaXgiPT09dC5rbGFzc31nZXQgc2l6ZSgpe3JldHVybiB0aGlzLnJvd3MqdGhpcy5jb2x1bW5zfWFwcGx5KHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoImNhbGxiYWNrIG11c3QgYmUgYSBmdW5jdGlvbiIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdC5jYWxsKHRoaXMsZSxyKTtyZXR1cm4gdGhpc310bzFEQXJyYXkoKXtsZXQgdD1bXTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXQucHVzaCh0aGlzLmdldChlLHIpKTtyZXR1cm4gdH10bzJEQXJyYXkoKXtsZXQgdD1bXTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspe3QucHVzaChbXSk7Zm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRbZV0ucHVzaCh0aGlzLmdldChlLHIpKX1yZXR1cm4gdH10b0pTT04oKXtyZXR1cm4gdGhpcy50bzJEQXJyYXkoKX1pc1Jvd1ZlY3Rvcigpe3JldHVybiAxPT09dGhpcy5yb3dzfWlzQ29sdW1uVmVjdG9yKCl7cmV0dXJuIDE9PT10aGlzLmNvbHVtbnN9aXNWZWN0b3IoKXtyZXR1cm4gMT09PXRoaXMucm93c3x8MT09PXRoaXMuY29sdW1uc31pc1NxdWFyZSgpe3JldHVybiB0aGlzLnJvd3M9PT10aGlzLmNvbHVtbnN9aXNFbXB0eSgpe3JldHVybiAwPT09dGhpcy5yb3dzfHwwPT09dGhpcy5jb2x1bW5zfWlzU3ltbWV0cmljKCl7aWYodGhpcy5pc1NxdWFyZSgpKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTw9dDtlKyspaWYodGhpcy5nZXQodCxlKSE9PXRoaXMuZ2V0KGUsdCkpcmV0dXJuITE7cmV0dXJuITB9cmV0dXJuITF9aXNFY2hlbG9uRm9ybSgpe2xldCB0PTAsZT0wLHI9LTEsbz0hMCxuPSExO2Zvcig7dDx0aGlzLnJvd3MmJm87KXtmb3IoZT0wLG49ITE7ZTx0aGlzLmNvbHVtbnMmJiExPT09bjspMD09PXRoaXMuZ2V0KHQsZSk/ZSsrOjE9PT10aGlzLmdldCh0LGUpJiZlPnI/KG49ITAscj1lKToobz0hMSxuPSEwKTt0Kyt9cmV0dXJuIG99aXNSZWR1Y2VkRWNoZWxvbkZvcm0oKXtsZXQgdD0wLGU9MCxyPS0xLG89ITAsbj0hMTtmb3IoO3Q8dGhpcy5yb3dzJiZvOyl7Zm9yKGU9MCxuPSExO2U8dGhpcy5jb2x1bW5zJiYhMT09PW47KTA9PT10aGlzLmdldCh0LGUpP2UrKzoxPT09dGhpcy5nZXQodCxlKSYmZT5yPyhuPSEwLHI9ZSk6KG89ITEsbj0hMCk7Zm9yKGxldCByPWUrMTtyPHRoaXMucm93cztyKyspMCE9PXRoaXMuZ2V0KHQscikmJihvPSExKTt0Kyt9cmV0dXJuIG99ZWNoZWxvbkZvcm0oKXtsZXQgdD10aGlzLmNsb25lKCksZT0wLHI9MDtmb3IoO2U8dC5yb3dzJiZyPHQuY29sdW1uczspe2xldCBvPWU7Zm9yKGxldCBuPWU7bjx0LnJvd3M7bisrKXQuZ2V0KG4scik+dC5nZXQobyxyKSYmKG89bik7aWYoMD09PXQuZ2V0KG8scikpcisrO2Vsc2V7dC5zd2FwUm93cyhlLG8pO2xldCBuPXQuZ2V0KGUscik7Zm9yKGxldCBvPXI7bzx0LmNvbHVtbnM7bysrKXQuc2V0KGUsbyx0LmdldChlLG8pL24pO2ZvcihsZXQgbz1lKzE7bzx0LnJvd3M7bysrKXtsZXQgbj10LmdldChvLHIpL3QuZ2V0KGUscik7dC5zZXQobyxyLDApO2ZvcihsZXQgcz1yKzE7czx0LmNvbHVtbnM7cysrKXQuc2V0KG8scyx0LmdldChvLHMpLXQuZ2V0KGUscykqbil9ZSsrLHIrK319cmV0dXJuIHR9cmVkdWNlZEVjaGVsb25Gb3JtKCl7bGV0IHQ9dGhpcy5lY2hlbG9uRm9ybSgpLGU9dC5jb2x1bW5zLHI9dC5yb3dzLG89ci0xO2Zvcig7bz49MDspaWYoMD09PXQubWF4Um93KG8pKW8tLTtlbHNle2xldCBuPTAscz0hMTtmb3IoO248ciYmITE9PT1zOykxPT09dC5nZXQobyxuKT9zPSEwOm4rKztmb3IobGV0IHI9MDtyPG87cisrKXtsZXQgcz10LmdldChyLG4pO2ZvcihsZXQgaT1uO2k8ZTtpKyspe2xldCBlPXQuZ2V0KHIsaSktcyp0LmdldChvLGkpO3Quc2V0KHIsaSxlKX19by0tfXJldHVybiB0fXNldCgpe3Rocm93IG5ldyBFcnJvcigic2V0IG1ldGhvZCBpcyB1bmltcGxlbWVudGVkIil9Z2V0KCl7dGhyb3cgbmV3IEVycm9yKCJnZXQgbWV0aG9kIGlzIHVuaW1wbGVtZW50ZWQiKX1yZXBlYXQodD17fSl7aWYoIm9iamVjdCIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiKTtjb25zdHtyb3dzOmU9MSxjb2x1bW5zOnI9MX09dDtpZighTnVtYmVyLmlzSW50ZWdlcihlKXx8ZTw9MCl0aHJvdyBuZXcgVHlwZUVycm9yKCJyb3dzIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIik7aWYoIU51bWJlci5pc0ludGVnZXIocil8fHI8PTApdGhyb3cgbmV3IFR5cGVFcnJvcigiY29sdW1ucyBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciIpO2xldCBvPW5ldyBaZSh0aGlzLnJvd3MqZSx0aGlzLmNvbHVtbnMqcik7Zm9yKGxldCB0PTA7dDxlO3QrKylmb3IobGV0IGU9MDtlPHI7ZSsrKW8uc2V0U3ViTWF0cml4KHRoaXMsdGhpcy5yb3dzKnQsdGhpcy5jb2x1bW5zKmUpO3JldHVybiBvfWZpbGwodCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdCk7cmV0dXJuIHRoaXN9bmVnKCl7cmV0dXJuIHRoaXMubXVsUygtMSl9Z2V0Um93KHQpe0RlKHRoaXMsdCk7bGV0IGU9W107Zm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKWUucHVzaCh0aGlzLmdldCh0LHIpKTtyZXR1cm4gZX1nZXRSb3dWZWN0b3IodCl7cmV0dXJuIFplLnJvd1ZlY3Rvcih0aGlzLmdldFJvdyh0KSl9c2V0Um93KHQsZSl7RGUodGhpcyx0KSxlPUxlKHRoaXMsZSk7Zm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KHQscixlW3JdKTtyZXR1cm4gdGhpc31zd2FwUm93cyh0LGUpe0RlKHRoaXMsdCksRGUodGhpcyxlKTtmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspe2xldCBvPXRoaXMuZ2V0KHQscik7dGhpcy5zZXQodCxyLHRoaXMuZ2V0KGUscikpLHRoaXMuc2V0KGUscixvKX1yZXR1cm4gdGhpc31nZXRDb2x1bW4odCl7VWUodGhpcyx0KTtsZXQgZT1bXTtmb3IobGV0IHI9MDtyPHRoaXMucm93cztyKyspZS5wdXNoKHRoaXMuZ2V0KHIsdCkpO3JldHVybiBlfWdldENvbHVtblZlY3Rvcih0KXtyZXR1cm4gWmUuY29sdW1uVmVjdG9yKHRoaXMuZ2V0Q29sdW1uKHQpKX1zZXRDb2x1bW4odCxlKXtVZSh0aGlzLHQpLGU9R2UodGhpcyxlKTtmb3IobGV0IHI9MDtyPHRoaXMucm93cztyKyspdGhpcy5zZXQocix0LGVbcl0pO3JldHVybiB0aGlzfXN3YXBDb2x1bW5zKHQsZSl7VWUodGhpcyx0KSxVZSh0aGlzLGUpO2ZvcihsZXQgcj0wO3I8dGhpcy5yb3dzO3IrKyl7bGV0IG89dGhpcy5nZXQocix0KTt0aGlzLnNldChyLHQsdGhpcy5nZXQocixlKSksdGhpcy5zZXQocixlLG8pfXJldHVybiB0aGlzfWFkZFJvd1ZlY3Rvcih0KXt0PUxlKHRoaXMsdCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKSt0W3JdKTtyZXR1cm4gdGhpc31zdWJSb3dWZWN0b3IodCl7dD1MZSh0aGlzLHQpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUsciktdFtyXSk7cmV0dXJuIHRoaXN9bXVsUm93VmVjdG9yKHQpe3Q9TGUodGhpcyx0KTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpKnRbcl0pO3JldHVybiB0aGlzfWRpdlJvd1ZlY3Rvcih0KXt0PUxlKHRoaXMsdCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKS90W3JdKTtyZXR1cm4gdGhpc31hZGRDb2x1bW5WZWN0b3IodCl7dD1HZSh0aGlzLHQpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikrdFtlXSk7cmV0dXJuIHRoaXN9c3ViQ29sdW1uVmVjdG9yKHQpe3Q9R2UodGhpcyx0KTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpLXRbZV0pO3JldHVybiB0aGlzfW11bENvbHVtblZlY3Rvcih0KXt0PUdlKHRoaXMsdCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKSp0W2VdKTtyZXR1cm4gdGhpc31kaXZDb2x1bW5WZWN0b3IodCl7dD1HZSh0aGlzLHQpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikvdFtlXSk7cmV0dXJuIHRoaXN9bXVsUm93KHQsZSl7RGUodGhpcyx0KTtmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQodCxyLHRoaXMuZ2V0KHQscikqZSk7cmV0dXJuIHRoaXN9bXVsQ29sdW1uKHQsZSl7VWUodGhpcyx0KTtmb3IobGV0IHI9MDtyPHRoaXMucm93cztyKyspdGhpcy5zZXQocix0LHRoaXMuZ2V0KHIsdCkqZSk7cmV0dXJuIHRoaXN9bWF4KHQpe2lmKHRoaXMuaXNFbXB0eSgpKXJldHVybiBOYU47c3dpdGNoKHQpe2Nhc2Uicm93Ijp7Y29uc3QgdD1uZXcgQXJyYXkodGhpcy5yb3dzKS5maWxsKE51bWJlci5ORUdBVElWRV9JTkZJTklUWSk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLmdldChlLHIpPnRbZV0mJih0W2VdPXRoaXMuZ2V0KGUscikpO3JldHVybiB0fWNhc2UiY29sdW1uIjp7Y29uc3QgdD1uZXcgQXJyYXkodGhpcy5jb2x1bW5zKS5maWxsKE51bWJlci5ORUdBVElWRV9JTkZJTklUWSk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLmdldChlLHIpPnRbcl0mJih0W3JdPXRoaXMuZ2V0KGUscikpO3JldHVybiB0fWNhc2Ugdm9pZCAwOntsZXQgdD10aGlzLmdldCgwLDApO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5nZXQoZSxyKT50JiYodD10aGlzLmdldChlLHIpKTtyZXR1cm4gdH1kZWZhdWx0OnRocm93IG5ldyBFcnJvcihgaW52YWxpZCBvcHRpb246ICR7dH1gKX19bWF4SW5kZXgoKXtZZSh0aGlzKTtsZXQgdD10aGlzLmdldCgwLDApLGU9WzAsMF07Zm9yKGxldCByPTA7cjx0aGlzLnJvd3M7cisrKWZvcihsZXQgbz0wO288dGhpcy5jb2x1bW5zO28rKyl0aGlzLmdldChyLG8pPnQmJih0PXRoaXMuZ2V0KHIsbyksZVswXT1yLGVbMV09byk7cmV0dXJuIGV9bWluKHQpe2lmKHRoaXMuaXNFbXB0eSgpKXJldHVybiBOYU47c3dpdGNoKHQpe2Nhc2Uicm93Ijp7Y29uc3QgdD1uZXcgQXJyYXkodGhpcy5yb3dzKS5maWxsKE51bWJlci5QT1NJVElWRV9JTkZJTklUWSk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLmdldChlLHIpPHRbZV0mJih0W2VdPXRoaXMuZ2V0KGUscikpO3JldHVybiB0fWNhc2UiY29sdW1uIjp7Y29uc3QgdD1uZXcgQXJyYXkodGhpcy5jb2x1bW5zKS5maWxsKE51bWJlci5QT1NJVElWRV9JTkZJTklUWSk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLmdldChlLHIpPHRbcl0mJih0W3JdPXRoaXMuZ2V0KGUscikpO3JldHVybiB0fWNhc2Ugdm9pZCAwOntsZXQgdD10aGlzLmdldCgwLDApO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5nZXQoZSxyKTx0JiYodD10aGlzLmdldChlLHIpKTtyZXR1cm4gdH1kZWZhdWx0OnRocm93IG5ldyBFcnJvcihgaW52YWxpZCBvcHRpb246ICR7dH1gKX19bWluSW5kZXgoKXtZZSh0aGlzKTtsZXQgdD10aGlzLmdldCgwLDApLGU9WzAsMF07Zm9yKGxldCByPTA7cjx0aGlzLnJvd3M7cisrKWZvcihsZXQgbz0wO288dGhpcy5jb2x1bW5zO28rKyl0aGlzLmdldChyLG8pPHQmJih0PXRoaXMuZ2V0KHIsbyksZVswXT1yLGVbMV09byk7cmV0dXJuIGV9bWF4Um93KHQpe2lmKERlKHRoaXMsdCksdGhpcy5pc0VtcHR5KCkpcmV0dXJuIE5hTjtsZXQgZT10aGlzLmdldCh0LDApO2ZvcihsZXQgcj0xO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLmdldCh0LHIpPmUmJihlPXRoaXMuZ2V0KHQscikpO3JldHVybiBlfW1heFJvd0luZGV4KHQpe0RlKHRoaXMsdCksWWUodGhpcyk7bGV0IGU9dGhpcy5nZXQodCwwKSxyPVt0LDBdO2ZvcihsZXQgbz0xO288dGhpcy5jb2x1bW5zO28rKyl0aGlzLmdldCh0LG8pPmUmJihlPXRoaXMuZ2V0KHQsbyksclsxXT1vKTtyZXR1cm4gcn1taW5Sb3codCl7aWYoRGUodGhpcyx0KSx0aGlzLmlzRW1wdHkoKSlyZXR1cm4gTmFOO2xldCBlPXRoaXMuZ2V0KHQsMCk7Zm9yKGxldCByPTE7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuZ2V0KHQscik8ZSYmKGU9dGhpcy5nZXQodCxyKSk7cmV0dXJuIGV9bWluUm93SW5kZXgodCl7RGUodGhpcyx0KSxZZSh0aGlzKTtsZXQgZT10aGlzLmdldCh0LDApLHI9W3QsMF07Zm9yKGxldCBvPTE7bzx0aGlzLmNvbHVtbnM7bysrKXRoaXMuZ2V0KHQsbyk8ZSYmKGU9dGhpcy5nZXQodCxvKSxyWzFdPW8pO3JldHVybiByfW1heENvbHVtbih0KXtpZihVZSh0aGlzLHQpLHRoaXMuaXNFbXB0eSgpKXJldHVybiBOYU47bGV0IGU9dGhpcy5nZXQoMCx0KTtmb3IobGV0IHI9MTtyPHRoaXMucm93cztyKyspdGhpcy5nZXQocix0KT5lJiYoZT10aGlzLmdldChyLHQpKTtyZXR1cm4gZX1tYXhDb2x1bW5JbmRleCh0KXtVZSh0aGlzLHQpLFllKHRoaXMpO2xldCBlPXRoaXMuZ2V0KDAsdCkscj1bMCx0XTtmb3IobGV0IG89MTtvPHRoaXMucm93cztvKyspdGhpcy5nZXQobyx0KT5lJiYoZT10aGlzLmdldChvLHQpLHJbMF09byk7cmV0dXJuIHJ9bWluQ29sdW1uKHQpe2lmKFVlKHRoaXMsdCksdGhpcy5pc0VtcHR5KCkpcmV0dXJuIE5hTjtsZXQgZT10aGlzLmdldCgwLHQpO2ZvcihsZXQgcj0xO3I8dGhpcy5yb3dzO3IrKyl0aGlzLmdldChyLHQpPGUmJihlPXRoaXMuZ2V0KHIsdCkpO3JldHVybiBlfW1pbkNvbHVtbkluZGV4KHQpe1VlKHRoaXMsdCksWWUodGhpcyk7bGV0IGU9dGhpcy5nZXQoMCx0KSxyPVswLHRdO2ZvcihsZXQgbz0xO288dGhpcy5yb3dzO28rKyl0aGlzLmdldChvLHQpPGUmJihlPXRoaXMuZ2V0KG8sdCksclswXT1vKTtyZXR1cm4gcn1kaWFnKCl7bGV0IHQ9TWF0aC5taW4odGhpcy5yb3dzLHRoaXMuY29sdW1ucyksZT1bXTtmb3IobGV0IHI9MDtyPHQ7cisrKWUucHVzaCh0aGlzLmdldChyLHIpKTtyZXR1cm4gZX1ub3JtKHQ9ImZyb2Jlbml1cyIpe2xldCBlPTA7aWYoIm1heCI9PT10KXJldHVybiB0aGlzLm1heCgpO2lmKCJmcm9iZW5pdXMiPT09dCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyllKz10aGlzLmdldCh0LHIpKnRoaXMuZ2V0KHQscik7cmV0dXJuIE1hdGguc3FydChlKX10aHJvdyBuZXcgUmFuZ2VFcnJvcihgdW5rbm93biBub3JtIHR5cGU6ICR7dH1gKX1jdW11bGF0aXZlU3VtKCl7bGV0IHQ9MDtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXQrPXRoaXMuZ2V0KGUsciksdGhpcy5zZXQoZSxyLHQpO3JldHVybiB0aGlzfWRvdCh0KXtYZS5pc01hdHJpeCh0KSYmKHQ9dC50bzFEQXJyYXkoKSk7bGV0IGU9dGhpcy50bzFEQXJyYXkoKTtpZihlLmxlbmd0aCE9PXQubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJ2ZWN0b3JzIGRvIG5vdCBoYXZlIHRoZSBzYW1lIHNpemUiKTtsZXQgcj0wO2ZvcihsZXQgbz0wO288ZS5sZW5ndGg7bysrKXIrPWVbb10qdFtvXTtyZXR1cm4gcn1tbXVsKHQpe3Q9WmUuY2hlY2tNYXRyaXgodCk7bGV0IGU9dGhpcy5yb3dzLHI9dGhpcy5jb2x1bW5zLG89dC5jb2x1bW5zLG49bmV3IFplKGUsbykscz1uZXcgRmxvYXQ2NEFycmF5KHIpO2ZvcihsZXQgaT0wO2k8bztpKyspe2ZvcihsZXQgZT0wO2U8cjtlKyspc1tlXT10LmdldChlLGkpO2ZvcihsZXQgdD0wO3Q8ZTt0Kyspe2xldCBlPTA7Zm9yKGxldCBvPTA7bzxyO28rKyllKz10aGlzLmdldCh0LG8pKnNbb107bi5zZXQodCxpLGUpfX1yZXR1cm4gbn1zdHJhc3NlbjJ4Mih0KXt0PVplLmNoZWNrTWF0cml4KHQpO2xldCBlPW5ldyBaZSgyLDIpO2NvbnN0IHI9dGhpcy5nZXQoMCwwKSxvPXQuZ2V0KDAsMCksbj10aGlzLmdldCgwLDEpLHM9dC5nZXQoMCwxKSxpPXRoaXMuZ2V0KDEsMCksdT10LmdldCgxLDApLGg9dGhpcy5nZXQoMSwxKSxhPXQuZ2V0KDEsMSksbD0ocitoKSoobythKSxjPShpK2gpKm8sZj1yKihzLWEpLG09aCoodS1vKSxnPShyK24pKmEscD1sK20tZysobi1oKSoodSthKSx3PWYrZyxkPWMrbSxiPWwtYytmKyhpLXIpKihvK3MpO3JldHVybiBlLnNldCgwLDAscCksZS5zZXQoMCwxLHcpLGUuc2V0KDEsMCxkKSxlLnNldCgxLDEsYiksZX1zdHJhc3NlbjN4Myh0KXt0PVplLmNoZWNrTWF0cml4KHQpO2xldCBlPW5ldyBaZSgzLDMpO2NvbnN0IHI9dGhpcy5nZXQoMCwwKSxvPXRoaXMuZ2V0KDAsMSksbj10aGlzLmdldCgwLDIpLHM9dGhpcy5nZXQoMSwwKSxpPXRoaXMuZ2V0KDEsMSksdT10aGlzLmdldCgxLDIpLGg9dGhpcy5nZXQoMiwwKSxhPXRoaXMuZ2V0KDIsMSksbD10aGlzLmdldCgyLDIpLGM9dC5nZXQoMCwwKSxmPXQuZ2V0KDAsMSksbT10LmdldCgwLDIpLGc9dC5nZXQoMSwwKSxwPXQuZ2V0KDEsMSksdz10LmdldCgxLDIpLGQ9dC5nZXQoMiwwKSxiPXQuZ2V0KDIsMSkseT10LmdldCgyLDIpLHY9KHItcykqKC1mK3ApLE09KC1yK3MraSkqKGMtZitwKSx4PShzK2kpKigtYytmKSxFPXIqYyxTPSgtcitoK2EpKihjLW0rdyksaj0oLXIraCkqKG0tdyksXz0oaCthKSooLWMrbSksQT0oLW4rYStsKSoocCtkLWIpLE89KG4tbCkqKHAtYiksUj1uKmQsQz0oYStsKSooLWQrYiksST0oLW4raSt1KSoodytkLXkpLE49KG4tdSkqKHcteSksaz0oaSt1KSooLWQreSksRj1FK1IrbypnLFA9KHIrbytuLXMtaS1hLWwpKnArTSt4K0UrQStSK0MsVD1FK1MrXysocitvK24taS11LWgtYSkqdytSK0krayx6PXYraSooLWMrZitnLXAtdy1kK3kpK00rRStSK0krTixWPXYrTSt4K0UrdSpiLCQ9UitJK04raytzKm0scT1FK1MraithKigtYyttK2ctcC13LWQrYikrQStPK1IsRD1BK08rUitDK2gqZixVPUUrUytqK18rbCp5O3JldHVybiBlLnNldCgwLDAsRiksZS5zZXQoMCwxLFApLGUuc2V0KDAsMixUKSxlLnNldCgxLDAseiksZS5zZXQoMSwxLFYpLGUuc2V0KDEsMiwkKSxlLnNldCgyLDAscSksZS5zZXQoMiwxLEQpLGUuc2V0KDIsMixVKSxlfW1tdWxTdHJhc3Nlbih0KXt0PVplLmNoZWNrTWF0cml4KHQpO2xldCBlPXRoaXMuY2xvbmUoKSxyPWUucm93cyxvPWUuY29sdW1ucyxuPXQucm93cyxzPXQuY29sdW1ucztmdW5jdGlvbiBpKHQsZSxyKXtsZXQgbz10LnJvd3Msbj10LmNvbHVtbnM7aWYobz09PWUmJm49PT1yKXJldHVybiB0O3tsZXQgbz1YZS56ZXJvcyhlLHIpO3JldHVybiBvPW8uc2V0U3ViTWF0cml4KHQsMCwwKSxvfX1vIT09biYmY29uc29sZS53YXJuKGBNdWx0aXBseWluZyAke3J9IHggJHtvfSBhbmQgJHtufSB4ICR7c30gbWF0cml4OiBkaW1lbnNpb25zIGRvIG5vdCBtYXRjaC5gKTtsZXQgdT1NYXRoLm1heChyLG4pLGg9TWF0aC5tYXgobyxzKTtyZXR1cm4gZT1pKGUsdSxoKSxmdW5jdGlvbiB0KGUscixvLG4pe2lmKG88PTUxMnx8bjw9NTEyKXJldHVybiBlLm1tdWwocik7byUyPT0xJiZuJTI9PTE/KGU9aShlLG8rMSxuKzEpLHI9aShyLG8rMSxuKzEpKTpvJTI9PTE/KGU9aShlLG8rMSxuKSxyPWkocixvKzEsbikpOm4lMj09MSYmKGU9aShlLG8sbisxKSxyPWkocixvLG4rMSkpO2xldCBzPXBhcnNlSW50KGUucm93cy8yLDEwKSx1PXBhcnNlSW50KGUuY29sdW1ucy8yLDEwKSxoPWUuc3ViTWF0cml4KDAscy0xLDAsdS0xKSxhPXIuc3ViTWF0cml4KDAscy0xLDAsdS0xKSxsPWUuc3ViTWF0cml4KDAscy0xLHUsZS5jb2x1bW5zLTEpLGM9ci5zdWJNYXRyaXgoMCxzLTEsdSxyLmNvbHVtbnMtMSksZj1lLnN1Yk1hdHJpeChzLGUucm93cy0xLDAsdS0xKSxtPXIuc3ViTWF0cml4KHMsci5yb3dzLTEsMCx1LTEpLGc9ZS5zdWJNYXRyaXgocyxlLnJvd3MtMSx1LGUuY29sdW1ucy0xKSxwPXIuc3ViTWF0cml4KHMsci5yb3dzLTEsdSxyLmNvbHVtbnMtMSksdz10KFhlLmFkZChoLGcpLFhlLmFkZChhLHApLHMsdSksZD10KFhlLmFkZChmLGcpLGEscyx1KSxiPXQoaCxYZS5zdWIoYyxwKSxzLHUpLHk9dChnLFhlLnN1YihtLGEpLHMsdSksdj10KFhlLmFkZChoLGwpLHAscyx1KSxNPXQoWGUuc3ViKGYsaCksWGUuYWRkKGEsYykscyx1KSx4PXQoWGUuc3ViKGwsZyksWGUuYWRkKG0scCkscyx1KSxFPVhlLmFkZCh3LHkpO0Uuc3ViKHYpLEUuYWRkKHgpO2xldCBTPVhlLmFkZChiLHYpLGo9WGUuYWRkKGQseSksXz1YZS5zdWIodyxkKTtfLmFkZChiKSxfLmFkZChNKTtsZXQgQT1YZS56ZXJvcygyKkUucm93cywyKkUuY29sdW1ucyk7cmV0dXJuIEE9QS5zZXRTdWJNYXRyaXgoRSwwLDApLEE9QS5zZXRTdWJNYXRyaXgoUyxFLnJvd3MsMCksQT1BLnNldFN1Yk1hdHJpeChqLDAsRS5jb2x1bW5zKSxBPUEuc2V0U3ViTWF0cml4KF8sRS5yb3dzLEUuY29sdW1ucyksQS5zdWJNYXRyaXgoMCxvLTEsMCxuLTEpfShlLHQ9aSh0LHUsaCksdSxoKX1zY2FsZVJvd3ModD17fSl7aWYoIm9iamVjdCIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiKTtjb25zdHttaW46ZT0wLG1heDpyPTF9PXQ7aWYoIU51bWJlci5pc0Zpbml0ZShlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJtaW4gbXVzdCBiZSBhIG51bWJlciIpO2lmKCFOdW1iZXIuaXNGaW5pdGUocikpdGhyb3cgbmV3IFR5cGVFcnJvcigibWF4IG11c3QgYmUgYSBudW1iZXIiKTtpZihlPj1yKXRocm93IG5ldyBSYW5nZUVycm9yKCJtaW4gbXVzdCBiZSBzbWFsbGVyIHRoYW4gbWF4Iik7bGV0IG89bmV3IFplKHRoaXMucm93cyx0aGlzLmNvbHVtbnMpO2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKyl7Y29uc3Qgbj10aGlzLmdldFJvdyh0KTtuLmxlbmd0aD4wJiZQZShuLHttaW46ZSxtYXg6cixvdXRwdXQ6bn0pLG8uc2V0Um93KHQsbil9cmV0dXJuIG99c2NhbGVDb2x1bW5zKHQ9e30pe2lmKCJvYmplY3QiIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCJvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0Iik7Y29uc3R7bWluOmU9MCxtYXg6cj0xfT10O2lmKCFOdW1iZXIuaXNGaW5pdGUoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigibWluIG11c3QgYmUgYSBudW1iZXIiKTtpZighTnVtYmVyLmlzRmluaXRlKHIpKXRocm93IG5ldyBUeXBlRXJyb3IoIm1heCBtdXN0IGJlIGEgbnVtYmVyIik7aWYoZT49cil0aHJvdyBuZXcgUmFuZ2VFcnJvcigibWluIG11c3QgYmUgc21hbGxlciB0aGFuIG1heCIpO2xldCBvPW5ldyBaZSh0aGlzLnJvd3MsdGhpcy5jb2x1bW5zKTtmb3IobGV0IHQ9MDt0PHRoaXMuY29sdW1uczt0Kyspe2NvbnN0IG49dGhpcy5nZXRDb2x1bW4odCk7bi5sZW5ndGgmJlBlKG4se21pbjplLG1heDpyLG91dHB1dDpufSksby5zZXRDb2x1bW4odCxuKX1yZXR1cm4gb31mbGlwUm93cygpe2NvbnN0IHQ9TWF0aC5jZWlsKHRoaXMuY29sdW1ucy8yKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0O3IrKyl7bGV0IHQ9dGhpcy5nZXQoZSxyKSxvPXRoaXMuZ2V0KGUsdGhpcy5jb2x1bW5zLTEtcik7dGhpcy5zZXQoZSxyLG8pLHRoaXMuc2V0KGUsdGhpcy5jb2x1bW5zLTEtcix0KX1yZXR1cm4gdGhpc31mbGlwQ29sdW1ucygpe2NvbnN0IHQ9TWF0aC5jZWlsKHRoaXMucm93cy8yKTtmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspZm9yKGxldCByPTA7cjx0O3IrKyl7bGV0IHQ9dGhpcy5nZXQocixlKSxvPXRoaXMuZ2V0KHRoaXMucm93cy0xLXIsZSk7dGhpcy5zZXQocixlLG8pLHRoaXMuc2V0KHRoaXMucm93cy0xLXIsZSx0KX1yZXR1cm4gdGhpc31rcm9uZWNrZXJQcm9kdWN0KHQpe3Q9WmUuY2hlY2tNYXRyaXgodCk7bGV0IGU9dGhpcy5yb3dzLHI9dGhpcy5jb2x1bW5zLG89dC5yb3dzLG49dC5jb2x1bW5zLHM9bmV3IFplKGUqbyxyKm4pO2ZvcihsZXQgaT0wO2k8ZTtpKyspZm9yKGxldCBlPTA7ZTxyO2UrKylmb3IobGV0IHI9MDtyPG87cisrKWZvcihsZXQgdT0wO3U8bjt1Kyspcy5zZXQobyppK3IsbiplK3UsdGhpcy5nZXQoaSxlKSp0LmdldChyLHUpKTtyZXR1cm4gc31rcm9uZWNrZXJTdW0odCl7aWYodD1aZS5jaGVja01hdHJpeCh0KSwhdGhpcy5pc1NxdWFyZSgpfHwhdC5pc1NxdWFyZSgpKXRocm93IG5ldyBFcnJvcigiS3JvbmVja2VyIFN1bSBuZWVkcyB0d28gU3F1YXJlIE1hdHJpY2VzIik7bGV0IGU9dGhpcy5yb3dzLHI9dC5yb3dzLG89dGhpcy5rcm9uZWNrZXJQcm9kdWN0KFplLmV5ZShyLHIpKSxuPVplLmV5ZShlLGUpLmtyb25lY2tlclByb2R1Y3QodCk7cmV0dXJuIG8uYWRkKG4pfXRyYW5zcG9zZSgpe2xldCB0PW5ldyBaZSh0aGlzLmNvbHVtbnMsdGhpcy5yb3dzKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXQuc2V0KHIsZSx0aGlzLmdldChlLHIpKTtyZXR1cm4gdH1zb3J0Um93cyh0PUplKXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspdGhpcy5zZXRSb3coZSx0aGlzLmdldFJvdyhlKS5zb3J0KHQpKTtyZXR1cm4gdGhpc31zb3J0Q29sdW1ucyh0PUplKXtmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXRDb2x1bW4oZSx0aGlzLmdldENvbHVtbihlKS5zb3J0KHQpKTtyZXR1cm4gdGhpc31zdWJNYXRyaXgodCxlLHIsbyl7QmUodGhpcyx0LGUscixvKTtsZXQgbj1uZXcgWmUoZS10KzEsby1yKzEpO2ZvcihsZXQgcz10O3M8PWU7cysrKWZvcihsZXQgZT1yO2U8PW87ZSsrKW4uc2V0KHMtdCxlLXIsdGhpcy5nZXQocyxlKSk7cmV0dXJuIG59c3ViTWF0cml4Um93KHQsZSxyKXtpZih2b2lkIDA9PT1lJiYoZT0wKSx2b2lkIDA9PT1yJiYocj10aGlzLmNvbHVtbnMtMSksZT5yfHxlPDB8fGU+PXRoaXMuY29sdW1uc3x8cjwwfHxyPj10aGlzLmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkFyZ3VtZW50IG91dCBvZiByYW5nZSIpO2xldCBvPW5ldyBaZSh0Lmxlbmd0aCxyLWUrMSk7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspZm9yKGxldCBzPWU7czw9cjtzKyspe2lmKHRbbl08MHx8dFtuXT49dGhpcy5yb3dzKXRocm93IG5ldyBSYW5nZUVycm9yKGBSb3cgaW5kZXggb3V0IG9mIHJhbmdlOiAke3Rbbl19YCk7by5zZXQobixzLWUsdGhpcy5nZXQodFtuXSxzKSl9cmV0dXJuIG99c3ViTWF0cml4Q29sdW1uKHQsZSxyKXtpZih2b2lkIDA9PT1lJiYoZT0wKSx2b2lkIDA9PT1yJiYocj10aGlzLnJvd3MtMSksZT5yfHxlPDB8fGU+PXRoaXMucm93c3x8cjwwfHxyPj10aGlzLnJvd3MpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkFyZ3VtZW50IG91dCBvZiByYW5nZSIpO2xldCBvPW5ldyBaZShyLWUrMSx0Lmxlbmd0aCk7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspZm9yKGxldCBzPWU7czw9cjtzKyspe2lmKHRbbl08MHx8dFtuXT49dGhpcy5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKGBDb2x1bW4gaW5kZXggb3V0IG9mIHJhbmdlOiAke3Rbbl19YCk7by5zZXQocy1lLG4sdGhpcy5nZXQocyx0W25dKSl9cmV0dXJuIG99c2V0U3ViTWF0cml4KHQsZSxyKXtpZigodD1aZS5jaGVja01hdHJpeCh0KSkuaXNFbXB0eSgpKXJldHVybiB0aGlzO0JlKHRoaXMsZSxlK3Qucm93cy0xLHIscit0LmNvbHVtbnMtMSk7Zm9yKGxldCBvPTA7bzx0LnJvd3M7bysrKWZvcihsZXQgbj0wO248dC5jb2x1bW5zO24rKyl0aGlzLnNldChlK28scituLHQuZ2V0KG8sbikpO3JldHVybiB0aGlzfXNlbGVjdGlvbih0LGUpeyFmdW5jdGlvbih0LGUpe2lmKCFGZShlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJyb3cgaW5kaWNlcyBtdXN0IGJlIGFuIGFycmF5Iik7Zm9yKGxldCByPTA7cjxlLmxlbmd0aDtyKyspaWYoZVtyXTwwfHxlW3JdPj10LnJvd3MpdGhyb3cgbmV3IFJhbmdlRXJyb3IoInJvdyBpbmRpY2VzIGFyZSBvdXQgb2YgcmFuZ2UiKX0odGhpcyx0KSxmdW5jdGlvbih0LGUpe2lmKCFGZShlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJjb2x1bW4gaW5kaWNlcyBtdXN0IGJlIGFuIGFycmF5Iik7Zm9yKGxldCByPTA7cjxlLmxlbmd0aDtyKyspaWYoZVtyXTwwfHxlW3JdPj10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoImNvbHVtbiBpbmRpY2VzIGFyZSBvdXQgb2YgcmFuZ2UiKX0odGhpcyxlKTtsZXQgcj1uZXcgWmUodC5sZW5ndGgsZS5sZW5ndGgpO2ZvcihsZXQgbz0wO288dC5sZW5ndGg7bysrKXtsZXQgbj10W29dO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKXtsZXQgcz1lW3RdO3Iuc2V0KG8sdCx0aGlzLmdldChuLHMpKX19cmV0dXJuIHJ9dHJhY2UoKXtsZXQgdD1NYXRoLm1pbih0aGlzLnJvd3MsdGhpcy5jb2x1bW5zKSxlPTA7Zm9yKGxldCByPTA7cjx0O3IrKyllKz10aGlzLmdldChyLHIpO3JldHVybiBlfWNsb25lKCl7bGV0IHQ9bmV3IFplKHRoaXMucm93cyx0aGlzLmNvbHVtbnMpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdC5zZXQoZSxyLHRoaXMuZ2V0KGUscikpO3JldHVybiB0fXN1bSh0KXtzd2l0Y2godCl7Y2FzZSJyb3ciOnJldHVybiBmdW5jdGlvbih0KXtsZXQgZT1XZSh0LnJvd3MpO2ZvcihsZXQgcj0wO3I8dC5yb3dzOysrcilmb3IobGV0IG89MDtvPHQuY29sdW1uczsrK28pZVtyXSs9dC5nZXQocixvKTtyZXR1cm4gZX0odGhpcyk7Y2FzZSJjb2x1bW4iOnJldHVybiBmdW5jdGlvbih0KXtsZXQgZT1XZSh0LmNvbHVtbnMpO2ZvcihsZXQgcj0wO3I8dC5yb3dzOysrcilmb3IobGV0IG89MDtvPHQuY29sdW1uczsrK28pZVtvXSs9dC5nZXQocixvKTtyZXR1cm4gZX0odGhpcyk7Y2FzZSB2b2lkIDA6cmV0dXJuIGZ1bmN0aW9uKHQpe2xldCBlPTA7Zm9yKGxldCByPTA7cjx0LnJvd3M7cisrKWZvcihsZXQgbz0wO288dC5jb2x1bW5zO28rKyllKz10LmdldChyLG8pO3JldHVybiBlfSh0aGlzKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgaW52YWxpZCBvcHRpb246ICR7dH1gKX19cHJvZHVjdCh0KXtzd2l0Y2godCl7Y2FzZSJyb3ciOnJldHVybiBmdW5jdGlvbih0KXtsZXQgZT1XZSh0LnJvd3MsMSk7Zm9yKGxldCByPTA7cjx0LnJvd3M7KytyKWZvcihsZXQgbz0wO288dC5jb2x1bW5zOysrbyllW3JdKj10LmdldChyLG8pO3JldHVybiBlfSh0aGlzKTtjYXNlImNvbHVtbiI6cmV0dXJuIGZ1bmN0aW9uKHQpe2xldCBlPVdlKHQuY29sdW1ucywxKTtmb3IobGV0IHI9MDtyPHQucm93czsrK3IpZm9yKGxldCBvPTA7bzx0LmNvbHVtbnM7KytvKWVbb10qPXQuZ2V0KHIsbyk7cmV0dXJuIGV9KHRoaXMpO2Nhc2Ugdm9pZCAwOnJldHVybiBmdW5jdGlvbih0KXtsZXQgZT0xO2ZvcihsZXQgcj0wO3I8dC5yb3dzO3IrKylmb3IobGV0IG89MDtvPHQuY29sdW1ucztvKyspZSo9dC5nZXQocixvKTtyZXR1cm4gZX0odGhpcyk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgb3B0aW9uOiAke3R9YCl9fW1lYW4odCl7Y29uc3QgZT10aGlzLnN1bSh0KTtzd2l0Y2godCl7Y2FzZSJyb3ciOmZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKyllW3RdLz10aGlzLmNvbHVtbnM7cmV0dXJuIGU7Y2FzZSJjb2x1bW4iOmZvcihsZXQgdD0wO3Q8dGhpcy5jb2x1bW5zO3QrKyllW3RdLz10aGlzLnJvd3M7cmV0dXJuIGU7Y2FzZSB2b2lkIDA6cmV0dXJuIGUvdGhpcy5zaXplO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG9wdGlvbjogJHt0fWApfX12YXJpYW5jZSh0LGU9e30pe2lmKCJvYmplY3QiPT10eXBlb2YgdCYmKGU9dCx0PXZvaWQgMCksIm9iamVjdCIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiKTtjb25zdHt1bmJpYXNlZDpyPSEwLG1lYW46bz10aGlzLm1lYW4odCl9PWU7aWYoImJvb2xlYW4iIT10eXBlb2Ygcil0aHJvdyBuZXcgVHlwZUVycm9yKCJ1bmJpYXNlZCBtdXN0IGJlIGEgYm9vbGVhbiIpO3N3aXRjaCh0KXtjYXNlInJvdyI6aWYoIUZlKG8pKXRocm93IG5ldyBUeXBlRXJyb3IoIm1lYW4gbXVzdCBiZSBhbiBhcnJheSIpO3JldHVybiBmdW5jdGlvbih0LGUscil7Y29uc3Qgbz10LnJvd3Msbj10LmNvbHVtbnMscz1bXTtmb3IobGV0IGk9MDtpPG87aSsrKXtsZXQgbz0wLHU9MCxoPTA7Zm9yKGxldCBlPTA7ZTxuO2UrKyloPXQuZ2V0KGksZSktcltpXSxvKz1oLHUrPWgqaDtlP3MucHVzaCgodS1vKm8vbikvKG4tMSkpOnMucHVzaCgodS1vKm8vbikvbil9cmV0dXJuIHN9KHRoaXMscixvKTtjYXNlImNvbHVtbiI6aWYoIUZlKG8pKXRocm93IG5ldyBUeXBlRXJyb3IoIm1lYW4gbXVzdCBiZSBhbiBhcnJheSIpO3JldHVybiBmdW5jdGlvbih0LGUscil7Y29uc3Qgbz10LnJvd3Msbj10LmNvbHVtbnMscz1bXTtmb3IobGV0IGk9MDtpPG47aSsrKXtsZXQgbj0wLHU9MCxoPTA7Zm9yKGxldCBlPTA7ZTxvO2UrKyloPXQuZ2V0KGUsaSktcltpXSxuKz1oLHUrPWgqaDtlP3MucHVzaCgodS1uKm4vbykvKG8tMSkpOnMucHVzaCgodS1uKm4vbykvbyl9cmV0dXJuIHN9KHRoaXMscixvKTtjYXNlIHZvaWQgMDppZigibnVtYmVyIiE9dHlwZW9mIG8pdGhyb3cgbmV3IFR5cGVFcnJvcigibWVhbiBtdXN0IGJlIGEgbnVtYmVyIik7cmV0dXJuIGZ1bmN0aW9uKHQsZSxyKXtjb25zdCBvPXQucm93cyxuPXQuY29sdW1ucyxzPW8qbjtsZXQgaT0wLHU9MCxoPTA7Zm9yKGxldCBlPTA7ZTxvO2UrKylmb3IobGV0IG89MDtvPG47bysrKWg9dC5nZXQoZSxvKS1yLGkrPWgsdSs9aCpoO3JldHVybiBlPyh1LWkqaS9zKS8ocy0xKToodS1pKmkvcykvc30odGhpcyxyLG8pO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG9wdGlvbjogJHt0fWApfX1zdGFuZGFyZERldmlhdGlvbih0LGUpeyJvYmplY3QiPT10eXBlb2YgdCYmKGU9dCx0PXZvaWQgMCk7Y29uc3Qgcj10aGlzLnZhcmlhbmNlKHQsZSk7aWYodm9pZCAwPT09dClyZXR1cm4gTWF0aC5zcXJ0KHIpO2ZvcihsZXQgdD0wO3Q8ci5sZW5ndGg7dCsrKXJbdF09TWF0aC5zcXJ0KHJbdF0pO3JldHVybiByfWNlbnRlcih0LGU9e30pe2lmKCJvYmplY3QiPT10eXBlb2YgdCYmKGU9dCx0PXZvaWQgMCksIm9iamVjdCIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiKTtjb25zdHtjZW50ZXI6cj10aGlzLm1lYW4odCl9PWU7c3dpdGNoKHQpe2Nhc2Uicm93IjppZighRmUocikpdGhyb3cgbmV3IFR5cGVFcnJvcigiY2VudGVyIG11c3QgYmUgYW4gYXJyYXkiKTtyZXR1cm4gZnVuY3Rpb24odCxlKXtmb3IobGV0IHI9MDtyPHQucm93cztyKyspZm9yKGxldCBvPTA7bzx0LmNvbHVtbnM7bysrKXQuc2V0KHIsbyx0LmdldChyLG8pLWVbcl0pfSh0aGlzLHIpLHRoaXM7Y2FzZSJjb2x1bW4iOmlmKCFGZShyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJjZW50ZXIgbXVzdCBiZSBhbiBhcnJheSIpO3JldHVybiBmdW5jdGlvbih0LGUpe2ZvcihsZXQgcj0wO3I8dC5yb3dzO3IrKylmb3IobGV0IG89MDtvPHQuY29sdW1ucztvKyspdC5zZXQocixvLHQuZ2V0KHIsbyktZVtvXSl9KHRoaXMsciksdGhpcztjYXNlIHZvaWQgMDppZigibnVtYmVyIiE9dHlwZW9mIHIpdGhyb3cgbmV3IFR5cGVFcnJvcigiY2VudGVyIG11c3QgYmUgYSBudW1iZXIiKTtyZXR1cm4gZnVuY3Rpb24odCxlKXtmb3IobGV0IHI9MDtyPHQucm93cztyKyspZm9yKGxldCBvPTA7bzx0LmNvbHVtbnM7bysrKXQuc2V0KHIsbyx0LmdldChyLG8pLWUpfSh0aGlzLHIpLHRoaXM7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgb3B0aW9uOiAke3R9YCl9fXNjYWxlKHQsZT17fSl7aWYoIm9iamVjdCI9PXR5cGVvZiB0JiYoZT10LHQ9dm9pZCAwKSwib2JqZWN0IiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIpO2xldCByPWUuc2NhbGU7c3dpdGNoKHQpe2Nhc2Uicm93IjppZih2b2lkIDA9PT1yKXI9ZnVuY3Rpb24odCl7Y29uc3QgZT1bXTtmb3IobGV0IHI9MDtyPHQucm93cztyKyspe2xldCBvPTA7Zm9yKGxldCBlPTA7ZTx0LmNvbHVtbnM7ZSsrKW8rPU1hdGgucG93KHQuZ2V0KHIsZSksMikvKHQuY29sdW1ucy0xKTtlLnB1c2goTWF0aC5zcXJ0KG8pKX1yZXR1cm4gZX0odGhpcyk7ZWxzZSBpZighRmUocikpdGhyb3cgbmV3IFR5cGVFcnJvcigic2NhbGUgbXVzdCBiZSBhbiBhcnJheSIpO3JldHVybiBmdW5jdGlvbih0LGUpe2ZvcihsZXQgcj0wO3I8dC5yb3dzO3IrKylmb3IobGV0IG89MDtvPHQuY29sdW1ucztvKyspdC5zZXQocixvLHQuZ2V0KHIsbykvZVtyXSl9KHRoaXMsciksdGhpcztjYXNlImNvbHVtbiI6aWYodm9pZCAwPT09cilyPWZ1bmN0aW9uKHQpe2NvbnN0IGU9W107Zm9yKGxldCByPTA7cjx0LmNvbHVtbnM7cisrKXtsZXQgbz0wO2ZvcihsZXQgZT0wO2U8dC5yb3dzO2UrKylvKz1NYXRoLnBvdyh0LmdldChlLHIpLDIpLyh0LnJvd3MtMSk7ZS5wdXNoKE1hdGguc3FydChvKSl9cmV0dXJuIGV9KHRoaXMpO2Vsc2UgaWYoIUZlKHIpKXRocm93IG5ldyBUeXBlRXJyb3IoInNjYWxlIG11c3QgYmUgYW4gYXJyYXkiKTtyZXR1cm4gZnVuY3Rpb24odCxlKXtmb3IobGV0IHI9MDtyPHQucm93cztyKyspZm9yKGxldCBvPTA7bzx0LmNvbHVtbnM7bysrKXQuc2V0KHIsbyx0LmdldChyLG8pL2Vbb10pfSh0aGlzLHIpLHRoaXM7Y2FzZSB2b2lkIDA6aWYodm9pZCAwPT09cilyPWZ1bmN0aW9uKHQpe2NvbnN0IGU9dC5zaXplLTE7bGV0IHI9MDtmb3IobGV0IG89MDtvPHQuY29sdW1ucztvKyspZm9yKGxldCBuPTA7bjx0LnJvd3M7bisrKXIrPU1hdGgucG93KHQuZ2V0KG4sbyksMikvZTtyZXR1cm4gTWF0aC5zcXJ0KHIpfSh0aGlzKTtlbHNlIGlmKCJudW1iZXIiIT10eXBlb2Ygcil0aHJvdyBuZXcgVHlwZUVycm9yKCJzY2FsZSBtdXN0IGJlIGEgbnVtYmVyIik7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7Zm9yKGxldCByPTA7cjx0LnJvd3M7cisrKWZvcihsZXQgbz0wO288dC5jb2x1bW5zO28rKyl0LnNldChyLG8sdC5nZXQocixvKS9lKX0odGhpcyxyKSx0aGlzO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG9wdGlvbjogJHt0fWApfX10b1N0cmluZyh0KXtyZXR1cm4gVmUodGhpcyx0KX19ZnVuY3Rpb24gSmUodCxlKXtyZXR1cm4gdC1lfVhlLnByb3RvdHlwZS5rbGFzcz0iTWF0cml4IiwidW5kZWZpbmVkIiE9dHlwZW9mIFN5bWJvbCYmKFhlLnByb3RvdHlwZVtTeW1ib2wuZm9yKCJub2RlanMudXRpbC5pbnNwZWN0LmN1c3RvbSIpXT1mdW5jdGlvbigpe3JldHVybiBWZSh0aGlzKX0pLFhlLnJhbmRvbT1YZS5yYW5kLFhlLnJhbmRvbUludD1YZS5yYW5kSW50LFhlLmRpYWdvbmFsPVhlLmRpYWcsWGUucHJvdG90eXBlLmRpYWdvbmFsPVhlLnByb3RvdHlwZS5kaWFnLFhlLmlkZW50aXR5PVhlLmV5ZSxYZS5wcm90b3R5cGUubmVnYXRlPVhlLnByb3RvdHlwZS5uZWcsWGUucHJvdG90eXBlLnRlbnNvclByb2R1Y3Q9WGUucHJvdG90eXBlLmtyb25lY2tlclByb2R1Y3Q7Y2xhc3MgWmUgZXh0ZW5kcyBYZXtjb25zdHJ1Y3Rvcih0LGUpe2lmKHN1cGVyKCksWmUuaXNNYXRyaXgodCkpcmV0dXJuIHQuY2xvbmUoKTtpZihOdW1iZXIuaXNJbnRlZ2VyKHQpJiZ0Pj0wKXtpZih0aGlzLmRhdGE9W10sIShOdW1iZXIuaXNJbnRlZ2VyKGUpJiZlPj0wKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJuQ29sdW1ucyBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciIpO2ZvcihsZXQgcj0wO3I8dDtyKyspdGhpcy5kYXRhLnB1c2gobmV3IEZsb2F0NjRBcnJheShlKSl9ZWxzZXtpZighRmUodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiRmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlciBvciBhbiBhcnJheSIpO3tjb25zdCByPXQ7aWYoIm51bWJlciIhPXR5cGVvZihlPSh0PXIubGVuZ3RoKT9yWzBdLmxlbmd0aDowKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJEYXRhIG11c3QgYmUgYSAyRCBhcnJheSB3aXRoIGF0IGxlYXN0IG9uZSBlbGVtZW50Iik7dGhpcy5kYXRhPVtdO2ZvcihsZXQgbz0wO288dDtvKyspe2lmKHJbb10ubGVuZ3RoIT09ZSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5jb25zaXN0ZW50IGFycmF5IGRpbWVuc2lvbnMiKTtpZighcltvXS5ldmVyeSgodD0+Im51bWJlciI9PXR5cGVvZiB0KSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiSW5wdXQgZGF0YSBjb250YWlucyBub24tbnVtZXJpYyB2YWx1ZXMiKTt0aGlzLmRhdGEucHVzaChGbG9hdDY0QXJyYXkuZnJvbShyW29dKSl9fX10aGlzLnJvd3M9dCx0aGlzLmNvbHVtbnM9ZX1zZXQodCxlLHIpe3JldHVybiB0aGlzLmRhdGFbdF1bZV09cix0aGlzfWdldCh0LGUpe3JldHVybiB0aGlzLmRhdGFbdF1bZV19cmVtb3ZlUm93KHQpe3JldHVybiBEZSh0aGlzLHQpLHRoaXMuZGF0YS5zcGxpY2UodCwxKSx0aGlzLnJvd3MtPTEsdGhpc31hZGRSb3codCxlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9dCx0PXRoaXMucm93cyksRGUodGhpcyx0LCEwKSxlPUZsb2F0NjRBcnJheS5mcm9tKExlKHRoaXMsZSkpLHRoaXMuZGF0YS5zcGxpY2UodCwwLGUpLHRoaXMucm93cys9MSx0aGlzfXJlbW92ZUNvbHVtbih0KXtVZSh0aGlzLHQpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKyl7Y29uc3Qgcj1uZXcgRmxvYXQ2NEFycmF5KHRoaXMuY29sdW1ucy0xKTtmb3IobGV0IG89MDtvPHQ7bysrKXJbb109dGhpcy5kYXRhW2VdW29dO2ZvcihsZXQgbz10KzE7bzx0aGlzLmNvbHVtbnM7bysrKXJbby0xXT10aGlzLmRhdGFbZV1bb107dGhpcy5kYXRhW2VdPXJ9cmV0dXJuIHRoaXMuY29sdW1ucy09MSx0aGlzfWFkZENvbHVtbih0LGUpe3ZvaWQgMD09PWUmJihlPXQsdD10aGlzLmNvbHVtbnMpLFVlKHRoaXMsdCwhMCksZT1HZSh0aGlzLGUpO2ZvcihsZXQgcj0wO3I8dGhpcy5yb3dzO3IrKyl7Y29uc3Qgbz1uZXcgRmxvYXQ2NEFycmF5KHRoaXMuY29sdW1ucysxKTtsZXQgbj0wO2Zvcig7bjx0O24rKylvW25dPXRoaXMuZGF0YVtyXVtuXTtmb3Iob1tuKytdPWVbcl07bjx0aGlzLmNvbHVtbnMrMTtuKyspb1tuXT10aGlzLmRhdGFbcl1bbi0xXTt0aGlzLmRhdGFbcl09b31yZXR1cm4gdGhpcy5jb2x1bW5zKz0xLHRoaXN9fSFmdW5jdGlvbih0LGUpe3QucHJvdG90eXBlLmFkZD1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/dGhpcy5hZGRTKHQpOnRoaXMuYWRkTSh0KX0sdC5wcm90b3R5cGUuYWRkUz1mdW5jdGlvbih0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpK3QpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5hZGRNPWZ1bmN0aW9uKHQpe2lmKHQ9ZS5jaGVja01hdHJpeCh0KSx0aGlzLnJvd3MhPT10LnJvd3N8fHRoaXMuY29sdW1ucyE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKSt0LmdldChlLHIpKTtyZXR1cm4gdGhpc30sdC5hZGQ9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbmV3IGUodCkuYWRkKHIpfSx0LnByb3RvdHlwZS5zdWI9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3RoaXMuc3ViUyh0KTp0aGlzLnN1Yk0odCl9LHQucHJvdG90eXBlLnN1YlM9ZnVuY3Rpb24odCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKS10KTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUuc3ViTT1mdW5jdGlvbih0KXtpZih0PWUuY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUsciktdC5nZXQoZSxyKSk7cmV0dXJuIHRoaXN9LHQuc3ViPWZ1bmN0aW9uKHQscil7cmV0dXJuIG5ldyBlKHQpLnN1YihyKX0sdC5wcm90b3R5cGUuc3VidHJhY3Q9dC5wcm90b3R5cGUuc3ViLHQucHJvdG90eXBlLnN1YnRyYWN0Uz10LnByb3RvdHlwZS5zdWJTLHQucHJvdG90eXBlLnN1YnRyYWN0TT10LnByb3RvdHlwZS5zdWJNLHQuc3VidHJhY3Q9dC5zdWIsdC5wcm90b3R5cGUubXVsPWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90aGlzLm11bFModCk6dGhpcy5tdWxNKHQpfSx0LnByb3RvdHlwZS5tdWxTPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikqdCk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLm11bE09ZnVuY3Rpb24odCl7aWYodD1lLmNoZWNrTWF0cml4KHQpLHRoaXMucm93cyE9PXQucm93c3x8dGhpcy5jb2x1bW5zIT09dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpKnQuZ2V0KGUscikpO3JldHVybiB0aGlzfSx0Lm11bD1mdW5jdGlvbih0LHIpe3JldHVybiBuZXcgZSh0KS5tdWwocil9LHQucHJvdG90eXBlLm11bHRpcGx5PXQucHJvdG90eXBlLm11bCx0LnByb3RvdHlwZS5tdWx0aXBseVM9dC5wcm90b3R5cGUubXVsUyx0LnByb3RvdHlwZS5tdWx0aXBseU09dC5wcm90b3R5cGUubXVsTSx0Lm11bHRpcGx5PXQubXVsLHQucHJvdG90eXBlLmRpdj1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/dGhpcy5kaXZTKHQpOnRoaXMuZGl2TSh0KX0sdC5wcm90b3R5cGUuZGl2Uz1mdW5jdGlvbih0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpL3QpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5kaXZNPWZ1bmN0aW9uKHQpe2lmKHQ9ZS5jaGVja01hdHJpeCh0KSx0aGlzLnJvd3MhPT10LnJvd3N8fHRoaXMuY29sdW1ucyE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKS90LmdldChlLHIpKTtyZXR1cm4gdGhpc30sdC5kaXY9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbmV3IGUodCkuZGl2KHIpfSx0LnByb3RvdHlwZS5kaXZpZGU9dC5wcm90b3R5cGUuZGl2LHQucHJvdG90eXBlLmRpdmlkZVM9dC5wcm90b3R5cGUuZGl2Uyx0LnByb3RvdHlwZS5kaXZpZGVNPXQucHJvdG90eXBlLmRpdk0sdC5kaXZpZGU9dC5kaXYsdC5wcm90b3R5cGUubW9kPWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90aGlzLm1vZFModCk6dGhpcy5tb2RNKHQpfSx0LnByb3RvdHlwZS5tb2RTPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikldCk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLm1vZE09ZnVuY3Rpb24odCl7aWYodD1lLmNoZWNrTWF0cml4KHQpLHRoaXMucm93cyE9PXQucm93c3x8dGhpcy5jb2x1bW5zIT09dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpJXQuZ2V0KGUscikpO3JldHVybiB0aGlzfSx0Lm1vZD1mdW5jdGlvbih0LHIpe3JldHVybiBuZXcgZSh0KS5tb2Qocil9LHQucHJvdG90eXBlLm1vZHVsdXM9dC5wcm90b3R5cGUubW9kLHQucHJvdG90eXBlLm1vZHVsdXNTPXQucHJvdG90eXBlLm1vZFMsdC5wcm90b3R5cGUubW9kdWx1c009dC5wcm90b3R5cGUubW9kTSx0Lm1vZHVsdXM9dC5tb2QsdC5wcm90b3R5cGUuYW5kPWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90aGlzLmFuZFModCk6dGhpcy5hbmRNKHQpfSx0LnByb3RvdHlwZS5hbmRTPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikmdCk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLmFuZE09ZnVuY3Rpb24odCl7aWYodD1lLmNoZWNrTWF0cml4KHQpLHRoaXMucm93cyE9PXQucm93c3x8dGhpcy5jb2x1bW5zIT09dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpJnQuZ2V0KGUscikpO3JldHVybiB0aGlzfSx0LmFuZD1mdW5jdGlvbih0LHIpe3JldHVybiBuZXcgZSh0KS5hbmQocil9LHQucHJvdG90eXBlLm9yPWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90aGlzLm9yUyh0KTp0aGlzLm9yTSh0KX0sdC5wcm90b3R5cGUub3JTPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscil8dCk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLm9yTT1mdW5jdGlvbih0KXtpZih0PWUuY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscil8dC5nZXQoZSxyKSk7cmV0dXJuIHRoaXN9LHQub3I9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbmV3IGUodCkub3Iocil9LHQucHJvdG90eXBlLnhvcj1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/dGhpcy54b3JTKHQpOnRoaXMueG9yTSh0KX0sdC5wcm90b3R5cGUueG9yUz1mdW5jdGlvbih0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpXnQpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS54b3JNPWZ1bmN0aW9uKHQpe2lmKHQ9ZS5jaGVja01hdHJpeCh0KSx0aGlzLnJvd3MhPT10LnJvd3N8fHRoaXMuY29sdW1ucyE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKV50LmdldChlLHIpKTtyZXR1cm4gdGhpc30sdC54b3I9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbmV3IGUodCkueG9yKHIpfSx0LnByb3RvdHlwZS5sZWZ0U2hpZnQ9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3RoaXMubGVmdFNoaWZ0Uyh0KTp0aGlzLmxlZnRTaGlmdE0odCl9LHQucHJvdG90eXBlLmxlZnRTaGlmdFM9ZnVuY3Rpb24odCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKTw8dCk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLmxlZnRTaGlmdE09ZnVuY3Rpb24odCl7aWYodD1lLmNoZWNrTWF0cml4KHQpLHRoaXMucm93cyE9PXQucm93c3x8dGhpcy5jb2x1bW5zIT09dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpPDx0LmdldChlLHIpKTtyZXR1cm4gdGhpc30sdC5sZWZ0U2hpZnQ9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbmV3IGUodCkubGVmdFNoaWZ0KHIpfSx0LnByb3RvdHlwZS5zaWduUHJvcGFnYXRpbmdSaWdodFNoaWZ0PWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90aGlzLnNpZ25Qcm9wYWdhdGluZ1JpZ2h0U2hpZnRTKHQpOnRoaXMuc2lnblByb3BhZ2F0aW5nUmlnaHRTaGlmdE0odCl9LHQucHJvdG90eXBlLnNpZ25Qcm9wYWdhdGluZ1JpZ2h0U2hpZnRTPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscik+PnQpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5zaWduUHJvcGFnYXRpbmdSaWdodFNoaWZ0TT1mdW5jdGlvbih0KXtpZih0PWUuY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscik+PnQuZ2V0KGUscikpO3JldHVybiB0aGlzfSx0LnNpZ25Qcm9wYWdhdGluZ1JpZ2h0U2hpZnQ9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbmV3IGUodCkuc2lnblByb3BhZ2F0aW5nUmlnaHRTaGlmdChyKX0sdC5wcm90b3R5cGUucmlnaHRTaGlmdD1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/dGhpcy5yaWdodFNoaWZ0Uyh0KTp0aGlzLnJpZ2h0U2hpZnRNKHQpfSx0LnByb3RvdHlwZS5yaWdodFNoaWZ0Uz1mdW5jdGlvbih0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpPj4+dCk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLnJpZ2h0U2hpZnRNPWZ1bmN0aW9uKHQpe2lmKHQ9ZS5jaGVja01hdHJpeCh0KSx0aGlzLnJvd3MhPT10LnJvd3N8fHRoaXMuY29sdW1ucyE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKT4+PnQuZ2V0KGUscikpO3JldHVybiB0aGlzfSx0LnJpZ2h0U2hpZnQ9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbmV3IGUodCkucmlnaHRTaGlmdChyKX0sdC5wcm90b3R5cGUuemVyb0ZpbGxSaWdodFNoaWZ0PXQucHJvdG90eXBlLnJpZ2h0U2hpZnQsdC5wcm90b3R5cGUuemVyb0ZpbGxSaWdodFNoaWZ0Uz10LnByb3RvdHlwZS5yaWdodFNoaWZ0Uyx0LnByb3RvdHlwZS56ZXJvRmlsbFJpZ2h0U2hpZnRNPXQucHJvdG90eXBlLnJpZ2h0U2hpZnRNLHQuemVyb0ZpbGxSaWdodFNoaWZ0PXQucmlnaHRTaGlmdCx0LnByb3RvdHlwZS5ub3Q9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSx+dGhpcy5nZXQodCxlKSk7cmV0dXJuIHRoaXN9LHQubm90PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5ub3QoKX0sdC5wcm90b3R5cGUuYWJzPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5hYnModGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmFicz1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuYWJzKCl9LHQucHJvdG90eXBlLmFjb3M9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmFjb3ModGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmFjb3M9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmFjb3MoKX0sdC5wcm90b3R5cGUuYWNvc2g9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmFjb3NoKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5hY29zaD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuYWNvc2goKX0sdC5wcm90b3R5cGUuYXNpbj1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguYXNpbih0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuYXNpbj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuYXNpbigpfSx0LnByb3RvdHlwZS5hc2luaD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguYXNpbmgodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmFzaW5oPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5hc2luaCgpfSx0LnByb3RvdHlwZS5hdGFuPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5hdGFuKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5hdGFuPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5hdGFuKCl9LHQucHJvdG90eXBlLmF0YW5oPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5hdGFuaCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuYXRhbmg9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmF0YW5oKCl9LHQucHJvdG90eXBlLmNicnQ9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmNicnQodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmNicnQ9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmNicnQoKX0sdC5wcm90b3R5cGUuY2VpbD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguY2VpbCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuY2VpbD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuY2VpbCgpfSx0LnByb3RvdHlwZS5jbHozMj1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguY2x6MzIodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmNsejMyPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5jbHozMigpfSx0LnByb3RvdHlwZS5jb3M9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmNvcyh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuY29zPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5jb3MoKX0sdC5wcm90b3R5cGUuY29zaD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguY29zaCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuY29zaD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuY29zaCgpfSx0LnByb3RvdHlwZS5leHA9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmV4cCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuZXhwPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5leHAoKX0sdC5wcm90b3R5cGUuZXhwbTE9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmV4cG0xKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5leHBtMT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuZXhwbTEoKX0sdC5wcm90b3R5cGUuZmxvb3I9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmZsb29yKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5mbG9vcj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuZmxvb3IoKX0sdC5wcm90b3R5cGUuZnJvdW5kPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5mcm91bmQodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmZyb3VuZD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuZnJvdW5kKCl9LHQucHJvdG90eXBlLmxvZz1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGgubG9nKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5sb2c9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmxvZygpfSx0LnByb3RvdHlwZS5sb2cxcD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGgubG9nMXAodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmxvZzFwPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5sb2cxcCgpfSx0LnByb3RvdHlwZS5sb2cxMD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGgubG9nMTAodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmxvZzEwPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5sb2cxMCgpfSx0LnByb3RvdHlwZS5sb2cyPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5sb2cyKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5sb2cyPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5sb2cyKCl9LHQucHJvdG90eXBlLnJvdW5kPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5yb3VuZCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQucm91bmQ9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLnJvdW5kKCl9LHQucHJvdG90eXBlLnNpZ249ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLnNpZ24odGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LnNpZ249ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLnNpZ24oKX0sdC5wcm90b3R5cGUuc2luPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5zaW4odGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LnNpbj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuc2luKCl9LHQucHJvdG90eXBlLnNpbmg9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLnNpbmgodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LnNpbmg9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLnNpbmgoKX0sdC5wcm90b3R5cGUuc3FydD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguc3FydCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuc3FydD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuc3FydCgpfSx0LnByb3RvdHlwZS50YW49ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLnRhbih0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQudGFuPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS50YW4oKX0sdC5wcm90b3R5cGUudGFuaD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGgudGFuaCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQudGFuaD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkudGFuaCgpfSx0LnByb3RvdHlwZS50cnVuYz1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGgudHJ1bmModGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LnRydW5jPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS50cnVuYygpfSx0LnBvdz1mdW5jdGlvbih0LHIpe3JldHVybiBuZXcgZSh0KS5wb3cocil9LHQucHJvdG90eXBlLnBvdz1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/dGhpcy5wb3dTKHQpOnRoaXMucG93TSh0KX0sdC5wcm90b3R5cGUucG93Uz1mdW5jdGlvbih0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscixNYXRoLnBvdyh0aGlzLmdldChlLHIpLHQpKTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUucG93TT1mdW5jdGlvbih0KXtpZih0PWUuY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLE1hdGgucG93KHRoaXMuZ2V0KGUsciksdC5nZXQoZSxyKSkpO3JldHVybiB0aGlzfX0oWGUsWmUpO2NsYXNzIEhlIGV4dGVuZHMgWGV7Y29uc3RydWN0b3IodCxlLHIpe3N1cGVyKCksdGhpcy5tYXRyaXg9dCx0aGlzLnJvd3M9ZSx0aGlzLmNvbHVtbnM9cn19Y2xhc3MgUWUgZXh0ZW5kcyBIZXtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0LHQuY29sdW1ucyx0LnJvd3MpfXNldCh0LGUscil7cmV0dXJuIHRoaXMubWF0cml4LnNldChlLHQsciksdGhpc31nZXQodCxlKXtyZXR1cm4gdGhpcy5tYXRyaXguZ2V0KGUsdCl9fWNsYXNzIHRyIGV4dGVuZHMgWGV7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLmRhdGE9dCx0aGlzLnJvd3M9dC5sZW5ndGgsdGhpcy5jb2x1bW5zPXRbMF0ubGVuZ3RofXNldCh0LGUscil7cmV0dXJuIHRoaXMuZGF0YVt0XVtlXT1yLHRoaXN9Z2V0KHQsZSl7cmV0dXJuIHRoaXMuZGF0YVt0XVtlXX19ZnVuY3Rpb24gZXIodCxlKXtsZXQgcj0wO3JldHVybiBNYXRoLmFicyh0KT5NYXRoLmFicyhlKT8ocj1lL3QsTWF0aC5hYnModCkqTWF0aC5zcXJ0KDErcipyKSk6MCE9PWU/KHI9dC9lLE1hdGguYWJzKGUpKk1hdGguc3FydCgxK3IqcikpOjB9Y2xhc3MgcnJ7Y29uc3RydWN0b3IodCxlPXt9KXtpZigodD10ci5jaGVja01hdHJpeCh0KSkuaXNFbXB0eSgpKXRocm93IG5ldyBFcnJvcigiTWF0cml4IG11c3QgYmUgbm9uLWVtcHR5Iik7bGV0IHI9dC5yb3dzLG89dC5jb2x1bW5zO2NvbnN0e2NvbXB1dGVMZWZ0U2luZ3VsYXJWZWN0b3JzOm49ITAsY29tcHV0ZVJpZ2h0U2luZ3VsYXJWZWN0b3JzOnM9ITAsYXV0b1RyYW5zcG9zZTppPSExfT1lO2xldCB1LGg9Qm9vbGVhbihuKSxhPUJvb2xlYW4ocyksbD0hMTtpZihyPG8paWYoaSl7dT10LnRyYW5zcG9zZSgpLHI9dS5yb3dzLG89dS5jb2x1bW5zLGw9ITA7bGV0IGU9aDtoPWEsYT1lfWVsc2UgdT10LmNsb25lKCksY29uc29sZS53YXJuKCJDb21wdXRpbmcgU1ZEIG9uIGEgbWF0cml4IHdpdGggbW9yZSBjb2x1bW5zIHRoYW4gcm93cy4gQ29uc2lkZXIgZW5hYmxpbmcgYXV0b1RyYW5zcG9zZSIpO2Vsc2UgdT10LmNsb25lKCk7bGV0IGM9TWF0aC5taW4ocixvKSxmPU1hdGgubWluKHIrMSxvKSxtPW5ldyBGbG9hdDY0QXJyYXkoZiksZz1uZXcgWmUocixjKSxwPW5ldyBaZShvLG8pLHc9bmV3IEZsb2F0NjRBcnJheShvKSxkPW5ldyBGbG9hdDY0QXJyYXkociksYj1uZXcgRmxvYXQ2NEFycmF5KGYpO2ZvcihsZXQgdD0wO3Q8Zjt0KyspYlt0XT10O2xldCB5PU1hdGgubWluKHItMSxvKSx2PU1hdGgubWF4KDAsTWF0aC5taW4oby0yLHIpKSxNPU1hdGgubWF4KHksdik7Zm9yKGxldCB0PTA7dDxNO3QrKyl7aWYodDx5KXttW3RdPTA7Zm9yKGxldCBlPXQ7ZTxyO2UrKyltW3RdPWVyKG1bdF0sdS5nZXQoZSx0KSk7aWYoMCE9PW1bdF0pe3UuZ2V0KHQsdCk8MCYmKG1bdF09LW1bdF0pO2ZvcihsZXQgZT10O2U8cjtlKyspdS5zZXQoZSx0LHUuZ2V0KGUsdCkvbVt0XSk7dS5zZXQodCx0LHUuZ2V0KHQsdCkrMSl9bVt0XT0tbVt0XX1mb3IobGV0IGU9dCsxO2U8bztlKyspe2lmKHQ8eSYmMCE9PW1bdF0pe2xldCBvPTA7Zm9yKGxldCBuPXQ7bjxyO24rKylvKz11LmdldChuLHQpKnUuZ2V0KG4sZSk7bz0tby91LmdldCh0LHQpO2ZvcihsZXQgbj10O248cjtuKyspdS5zZXQobixlLHUuZ2V0KG4sZSkrbyp1LmdldChuLHQpKX13W2VdPXUuZ2V0KHQsZSl9aWYoaCYmdDx5KWZvcihsZXQgZT10O2U8cjtlKyspZy5zZXQoZSx0LHUuZ2V0KGUsdCkpO2lmKHQ8dil7d1t0XT0wO2ZvcihsZXQgZT10KzE7ZTxvO2UrKyl3W3RdPWVyKHdbdF0sd1tlXSk7aWYoMCE9PXdbdF0pe3dbdCsxXTwwJiYod1t0XT0wLXdbdF0pO2ZvcihsZXQgZT10KzE7ZTxvO2UrKyl3W2VdLz13W3RdO3dbdCsxXSs9MX1pZih3W3RdPS13W3RdLHQrMTxyJiYwIT09d1t0XSl7Zm9yKGxldCBlPXQrMTtlPHI7ZSsrKWRbZV09MDtmb3IobGV0IGU9dCsxO2U8cjtlKyspZm9yKGxldCByPXQrMTtyPG87cisrKWRbZV0rPXdbcl0qdS5nZXQoZSxyKTtmb3IobGV0IGU9dCsxO2U8bztlKyspe2xldCBvPS13W2VdL3dbdCsxXTtmb3IobGV0IG49dCsxO248cjtuKyspdS5zZXQobixlLHUuZ2V0KG4sZSkrbypkW25dKX19aWYoYSlmb3IobGV0IGU9dCsxO2U8bztlKyspcC5zZXQoZSx0LHdbZV0pfX1sZXQgeD1NYXRoLm1pbihvLHIrMSk7aWYoeTxvJiYobVt5XT11LmdldCh5LHkpKSxyPHgmJihtW3gtMV09MCksdisxPHgmJih3W3ZdPXUuZ2V0KHYseC0xKSksd1t4LTFdPTAsaCl7Zm9yKGxldCB0PXk7dDxjO3QrKyl7Zm9yKGxldCBlPTA7ZTxyO2UrKylnLnNldChlLHQsMCk7Zy5zZXQodCx0LDEpfWZvcihsZXQgdD15LTE7dD49MDt0LS0paWYoMCE9PW1bdF0pe2ZvcihsZXQgZT10KzE7ZTxjO2UrKyl7bGV0IG89MDtmb3IobGV0IG49dDtuPHI7bisrKW8rPWcuZ2V0KG4sdCkqZy5nZXQobixlKTtvPS1vL2cuZ2V0KHQsdCk7Zm9yKGxldCBuPXQ7bjxyO24rKylnLnNldChuLGUsZy5nZXQobixlKStvKmcuZ2V0KG4sdCkpfWZvcihsZXQgZT10O2U8cjtlKyspZy5zZXQoZSx0LC1nLmdldChlLHQpKTtnLnNldCh0LHQsMStnLmdldCh0LHQpKTtmb3IobGV0IGU9MDtlPHQtMTtlKyspZy5zZXQoZSx0LDApfWVsc2V7Zm9yKGxldCBlPTA7ZTxyO2UrKylnLnNldChlLHQsMCk7Zy5zZXQodCx0LDEpfX1pZihhKWZvcihsZXQgdD1vLTE7dD49MDt0LS0pe2lmKHQ8diYmMCE9PXdbdF0pZm9yKGxldCBlPXQrMTtlPG87ZSsrKXtsZXQgcj0wO2ZvcihsZXQgbj10KzE7bjxvO24rKylyKz1wLmdldChuLHQpKnAuZ2V0KG4sZSk7cj0tci9wLmdldCh0KzEsdCk7Zm9yKGxldCBuPXQrMTtuPG87bisrKXAuc2V0KG4sZSxwLmdldChuLGUpK3IqcC5nZXQobix0KSl9Zm9yKGxldCBlPTA7ZTxvO2UrKylwLnNldChlLHQsMCk7cC5zZXQodCx0LDEpfWxldCBFPXgtMSxTPU51bWJlci5FUFNJTE9OO2Zvcig7eD4wOyl7bGV0IHQsZTtmb3IodD14LTI7dD49LTEmJi0xIT09dDt0LS0pe2NvbnN0IGU9TnVtYmVyLk1JTl9WQUxVRStTKk1hdGguYWJzKG1bdF0rTWF0aC5hYnMobVt0KzFdKSk7aWYoTWF0aC5hYnMod1t0XSk8PWV8fE51bWJlci5pc05hTih3W3RdKSl7d1t0XT0wO2JyZWFrfX1pZih0PT09eC0yKWU9NDtlbHNle2xldCByO2ZvcihyPXgtMTtyPj10JiZyIT09dDtyLS0pe2xldCBlPShyIT09eD9NYXRoLmFicyh3W3JdKTowKSsociE9PXQrMT9NYXRoLmFicyh3W3ItMV0pOjApO2lmKE1hdGguYWJzKG1bcl0pPD1TKmUpe21bcl09MDticmVha319cj09PXQ/ZT0zOnI9PT14LTE/ZT0xOihlPTIsdD1yKX1zd2l0Y2godCsrLGUpe2Nhc2UgMTp7bGV0IGU9d1t4LTJdO3dbeC0yXT0wO2ZvcihsZXQgcj14LTI7cj49dDtyLS0pe2xldCBuPWVyKG1bcl0sZSkscz1tW3JdL24saT1lL247aWYobVtyXT1uLHIhPT10JiYoZT0taSp3W3ItMV0sd1tyLTFdPXMqd1tyLTFdKSxhKWZvcihsZXQgdD0wO3Q8bzt0Kyspbj1zKnAuZ2V0KHQscikraSpwLmdldCh0LHgtMSkscC5zZXQodCx4LTEsLWkqcC5nZXQodCxyKStzKnAuZ2V0KHQseC0xKSkscC5zZXQodCxyLG4pfWJyZWFrfWNhc2UgMjp7bGV0IGU9d1t0LTFdO3dbdC0xXT0wO2ZvcihsZXQgbz10O288eDtvKyspe2xldCBuPWVyKG1bb10sZSkscz1tW29dL24saT1lL247aWYobVtvXT1uLGU9LWkqd1tvXSx3W29dPXMqd1tvXSxoKWZvcihsZXQgZT0wO2U8cjtlKyspbj1zKmcuZ2V0KGUsbykraSpnLmdldChlLHQtMSksZy5zZXQoZSx0LTEsLWkqZy5nZXQoZSxvKStzKmcuZ2V0KGUsdC0xKSksZy5zZXQoZSxvLG4pfWJyZWFrfWNhc2UgMzp7Y29uc3QgZT1NYXRoLm1heChNYXRoLmFicyhtW3gtMV0pLE1hdGguYWJzKG1beC0yXSksTWF0aC5hYnMod1t4LTJdKSxNYXRoLmFicyhtW3RdKSxNYXRoLmFicyh3W3RdKSksbj1tW3gtMV0vZSxzPW1beC0yXS9lLGk9d1t4LTJdL2UsdT1tW3RdL2UsbD13W3RdL2UsYz0oKHMrbikqKHMtbikraSppKS8yLGY9bippKihuKmkpO2xldCBkPTA7MD09PWMmJjA9PT1mfHwoZD1jPDA/MC1NYXRoLnNxcnQoYypjK2YpOk1hdGguc3FydChjKmMrZiksZD1mLyhjK2QpKTtsZXQgYj0odStuKSoodS1uKStkLHk9dSpsO2ZvcihsZXQgZT10O2U8eC0xO2UrKyl7bGV0IG49ZXIoYix5KTswPT09biYmKG49TnVtYmVyLk1JTl9WQUxVRSk7bGV0IHM9Yi9uLGk9eS9uO2lmKGUhPT10JiYod1tlLTFdPW4pLGI9cyptW2VdK2kqd1tlXSx3W2VdPXMqd1tlXS1pKm1bZV0seT1pKm1bZSsxXSxtW2UrMV09cyptW2UrMV0sYSlmb3IobGV0IHQ9MDt0PG87dCsrKW49cypwLmdldCh0LGUpK2kqcC5nZXQodCxlKzEpLHAuc2V0KHQsZSsxLC1pKnAuZ2V0KHQsZSkrcypwLmdldCh0LGUrMSkpLHAuc2V0KHQsZSxuKTtpZihuPWVyKGIseSksMD09PW4mJihuPU51bWJlci5NSU5fVkFMVUUpLHM9Yi9uLGk9eS9uLG1bZV09bixiPXMqd1tlXStpKm1bZSsxXSxtW2UrMV09LWkqd1tlXStzKm1bZSsxXSx5PWkqd1tlKzFdLHdbZSsxXT1zKndbZSsxXSxoJiZlPHItMSlmb3IobGV0IHQ9MDt0PHI7dCsrKW49cypnLmdldCh0LGUpK2kqZy5nZXQodCxlKzEpLGcuc2V0KHQsZSsxLC1pKmcuZ2V0KHQsZSkrcypnLmdldCh0LGUrMSkpLGcuc2V0KHQsZSxuKX13W3gtMl09YjticmVha31jYXNlIDQ6aWYobVt0XTw9MCYmKG1bdF09bVt0XTwwPy1tW3RdOjAsYSkpZm9yKGxldCBlPTA7ZTw9RTtlKyspcC5zZXQoZSx0LC1wLmdldChlLHQpKTtmb3IoO3Q8RSYmIShtW3RdPj1tW3QrMV0pOyl7bGV0IGU9bVt0XTtpZihtW3RdPW1bdCsxXSxtW3QrMV09ZSxhJiZ0PG8tMSlmb3IobGV0IHI9MDtyPG87cisrKWU9cC5nZXQocix0KzEpLHAuc2V0KHIsdCsxLHAuZ2V0KHIsdCkpLHAuc2V0KHIsdCxlKTtpZihoJiZ0PHItMSlmb3IobGV0IG89MDtvPHI7bysrKWU9Zy5nZXQobyx0KzEpLGcuc2V0KG8sdCsxLGcuZ2V0KG8sdCkpLGcuc2V0KG8sdCxlKTt0Kyt9eC0tfX1pZihsKXtsZXQgdD1wO3A9ZyxnPXR9dGhpcy5tPXIsdGhpcy5uPW8sdGhpcy5zPW0sdGhpcy5VPWcsdGhpcy5WPXB9c29sdmUodCl7bGV0IGU9dCxyPXRoaXMudGhyZXNob2xkLG89dGhpcy5zLmxlbmd0aCxuPVplLnplcm9zKG8sbyk7Zm9yKGxldCB0PTA7dDxvO3QrKylNYXRoLmFicyh0aGlzLnNbdF0pPD1yP24uc2V0KHQsdCwwKTpuLnNldCh0LHQsMS90aGlzLnNbdF0pO2xldCBzPXRoaXMuVSxpPXRoaXMucmlnaHRTaW5ndWxhclZlY3RvcnMsdT1pLm1tdWwobiksaD1pLnJvd3MsYT1zLnJvd3MsbD1aZS56ZXJvcyhoLGEpO2ZvcihsZXQgdD0wO3Q8aDt0KyspZm9yKGxldCBlPTA7ZTxhO2UrKyl7bGV0IHI9MDtmb3IobGV0IG49MDtuPG87bisrKXIrPXUuZ2V0KHQsbikqcy5nZXQoZSxuKTtsLnNldCh0LGUscil9cmV0dXJuIGwubW11bChlKX1zb2x2ZUZvckRpYWdvbmFsKHQpe3JldHVybiB0aGlzLnNvbHZlKFplLmRpYWcodCkpfWludmVyc2UoKXtsZXQgdD10aGlzLlYsZT10aGlzLnRocmVzaG9sZCxyPXQucm93cyxvPXQuY29sdW1ucyxuPW5ldyBaZShyLHRoaXMucy5sZW5ndGgpO2ZvcihsZXQgcz0wO3M8cjtzKyspZm9yKGxldCByPTA7cjxvO3IrKylNYXRoLmFicyh0aGlzLnNbcl0pPmUmJm4uc2V0KHMscix0LmdldChzLHIpL3RoaXMuc1tyXSk7bGV0IHM9dGhpcy5VLGk9cy5yb3dzLHU9cy5jb2x1bW5zLGg9bmV3IFplKHIsaSk7Zm9yKGxldCB0PTA7dDxyO3QrKylmb3IobGV0IGU9MDtlPGk7ZSsrKXtsZXQgcj0wO2ZvcihsZXQgbz0wO288dTtvKyspcis9bi5nZXQodCxvKSpzLmdldChlLG8pO2guc2V0KHQsZSxyKX1yZXR1cm4gaH1nZXQgY29uZGl0aW9uKCl7cmV0dXJuIHRoaXMuc1swXS90aGlzLnNbTWF0aC5taW4odGhpcy5tLHRoaXMubiktMV19Z2V0IG5vcm0yKCl7cmV0dXJuIHRoaXMuc1swXX1nZXQgcmFuaygpe2xldCB0PU1hdGgubWF4KHRoaXMubSx0aGlzLm4pKnRoaXMuc1swXSpOdW1iZXIuRVBTSUxPTixlPTAscj10aGlzLnM7Zm9yKGxldCBvPTAsbj1yLmxlbmd0aDtvPG47bysrKXJbb10+dCYmZSsrO3JldHVybiBlfWdldCBkaWFnb25hbCgpe3JldHVybiBBcnJheS5mcm9tKHRoaXMucyl9Z2V0IHRocmVzaG9sZCgpe3JldHVybiBOdW1iZXIuRVBTSUxPTi8yKk1hdGgubWF4KHRoaXMubSx0aGlzLm4pKnRoaXMuc1swXX1nZXQgbGVmdFNpbmd1bGFyVmVjdG9ycygpe3JldHVybiB0aGlzLlV9Z2V0IHJpZ2h0U2luZ3VsYXJWZWN0b3JzKCl7cmV0dXJuIHRoaXMuVn1nZXQgZGlhZ29uYWxNYXRyaXgoKXtyZXR1cm4gWmUuZGlhZyh0aGlzLnMpfX1jbGFzcyBvcntjb25zdHJ1Y3Rvcih0LGU9e30pe2NvbnN0e2Fzc3VtZVN5bW1ldHJpYzpyPSExfT1lO2lmKCEodD10ci5jaGVja01hdHJpeCh0KSkuaXNTcXVhcmUoKSl0aHJvdyBuZXcgRXJyb3IoIk1hdHJpeCBpcyBub3QgYSBzcXVhcmUgbWF0cml4Iik7aWYodC5pc0VtcHR5KCkpdGhyb3cgbmV3IEVycm9yKCJNYXRyaXggbXVzdCBiZSBub24tZW1wdHkiKTtsZXQgbyxuLHM9dC5jb2x1bW5zLGk9bmV3IFplKHMscyksdT1uZXcgRmxvYXQ2NEFycmF5KHMpLGg9bmV3IEZsb2F0NjRBcnJheShzKSxhPXQsbD0hMTtpZihsPSEhcnx8dC5pc1N5bW1ldHJpYygpLGwpe2ZvcihvPTA7bzxzO28rKylmb3Iobj0wO248cztuKyspaS5zZXQobyxuLGEuZ2V0KG8sbikpOyFmdW5jdGlvbih0LGUscixvKXtsZXQgbixzLGksdSxoLGEsbCxjO2ZvcihoPTA7aDx0O2grKylyW2hdPW8uZ2V0KHQtMSxoKTtmb3IodT10LTE7dT4wO3UtLSl7Zm9yKGM9MCxpPTAsYT0wO2E8dTthKyspYys9TWF0aC5hYnMoclthXSk7aWYoMD09PWMpZm9yKGVbdV09clt1LTFdLGg9MDtoPHU7aCsrKXJbaF09by5nZXQodS0xLGgpLG8uc2V0KHUsaCwwKSxvLnNldChoLHUsMCk7ZWxzZXtmb3IoYT0wO2E8dTthKyspclthXS89YyxpKz1yW2FdKnJbYV07Zm9yKG49clt1LTFdLHM9TWF0aC5zcXJ0KGkpLG4+MCYmKHM9LXMpLGVbdV09YypzLGktPW4qcyxyW3UtMV09bi1zLGg9MDtoPHU7aCsrKWVbaF09MDtmb3IoaD0wO2g8dTtoKyspe2ZvcihuPXJbaF0sby5zZXQoaCx1LG4pLHM9ZVtoXStvLmdldChoLGgpKm4sYT1oKzE7YTw9dS0xO2ErKylzKz1vLmdldChhLGgpKnJbYV0sZVthXSs9by5nZXQoYSxoKSpuO2VbaF09c31mb3Iobj0wLGg9MDtoPHU7aCsrKWVbaF0vPWksbis9ZVtoXSpyW2hdO2ZvcihsPW4vKGkraSksaD0wO2g8dTtoKyspZVtoXS09bCpyW2hdO2ZvcihoPTA7aDx1O2grKyl7Zm9yKG49cltoXSxzPWVbaF0sYT1oO2E8PXUtMTthKyspby5zZXQoYSxoLG8uZ2V0KGEsaCktKG4qZVthXStzKnJbYV0pKTtyW2hdPW8uZ2V0KHUtMSxoKSxvLnNldCh1LGgsMCl9fXJbdV09aX1mb3IodT0wO3U8dC0xO3UrKyl7aWYoby5zZXQodC0xLHUsby5nZXQodSx1KSksby5zZXQodSx1LDEpLGk9clt1KzFdLDAhPT1pKXtmb3IoYT0wO2E8PXU7YSsrKXJbYV09by5nZXQoYSx1KzEpL2k7Zm9yKGg9MDtoPD11O2grKyl7Zm9yKHM9MCxhPTA7YTw9dTthKyspcys9by5nZXQoYSx1KzEpKm8uZ2V0KGEsaCk7Zm9yKGE9MDthPD11O2ErKylvLnNldChhLGgsby5nZXQoYSxoKS1zKnJbYV0pfX1mb3IoYT0wO2E8PXU7YSsrKW8uc2V0KGEsdSsxLDApfWZvcihoPTA7aDx0O2grKylyW2hdPW8uZ2V0KHQtMSxoKSxvLnNldCh0LTEsaCwwKTtvLnNldCh0LTEsdC0xLDEpLGVbMF09MH0ocyxoLHUsaSksZnVuY3Rpb24odCxlLHIsbyl7bGV0IG4scyxpLHUsaCxhLGwsYyxmLG0sZyxwLHcsZCxiLHk7Zm9yKGk9MTtpPHQ7aSsrKWVbaS0xXT1lW2ldO2VbdC0xXT0wO2xldCB2PTAsTT0wLHg9TnVtYmVyLkVQU0lMT047Zm9yKGE9MDthPHQ7YSsrKXtmb3IoTT1NYXRoLm1heChNLE1hdGguYWJzKHJbYV0pK01hdGguYWJzKGVbYV0pKSxsPWE7bDx0JiYhKE1hdGguYWJzKGVbbF0pPD14Kk0pOylsKys7aWYobD5hKWRve2ZvcihuPXJbYV0sYz0oclthKzFdLW4pLygyKmVbYV0pLGY9ZXIoYywxKSxjPDAmJihmPS1mKSxyW2FdPWVbYV0vKGMrZiksclthKzFdPWVbYV0qKGMrZiksbT1yW2ErMV0scz1uLXJbYV0saT1hKzI7aTx0O2krKylyW2ldLT1zO2Zvcih2Kz1zLGM9cltsXSxnPTEscD1nLHc9ZyxkPWVbYSsxXSxiPTAseT0wLGk9bC0xO2k+PWE7aS0tKWZvcih3PXAscD1nLHk9YixuPWcqZVtpXSxzPWcqYyxmPWVyKGMsZVtpXSksZVtpKzFdPWIqZixiPWVbaV0vZixnPWMvZixjPWcqcltpXS1iKm4scltpKzFdPXMrYiooZypuK2IqcltpXSksaD0wO2g8dDtoKyspcz1vLmdldChoLGkrMSksby5zZXQoaCxpKzEsYipvLmdldChoLGkpK2cqcyksby5zZXQoaCxpLGcqby5nZXQoaCxpKS1iKnMpO2M9LWIqeSp3KmQqZVthXS9tLGVbYV09YipjLHJbYV09ZypjfXdoaWxlKE1hdGguYWJzKGVbYV0pPngqTSk7clthXT1yW2FdK3YsZVthXT0wfWZvcihpPTA7aTx0LTE7aSsrKXtmb3IoaD1pLGM9cltpXSx1PWkrMTt1PHQ7dSsrKXJbdV08YyYmKGg9dSxjPXJbdV0pO2lmKGghPT1pKWZvcihyW2hdPXJbaV0scltpXT1jLHU9MDt1PHQ7dSsrKWM9by5nZXQodSxpKSxvLnNldCh1LGksby5nZXQodSxoKSksby5zZXQodSxoLGMpfX0ocyxoLHUsaSl9ZWxzZXtsZXQgdD1uZXcgWmUocyxzKSxlPW5ldyBGbG9hdDY0QXJyYXkocyk7Zm9yKG49MDtuPHM7bisrKWZvcihvPTA7bzxzO28rKyl0LnNldChvLG4sYS5nZXQobyxuKSk7IWZ1bmN0aW9uKHQsZSxyLG8pe2xldCBuLHMsaSx1LGgsYSxsLGM9MCxmPXQtMTtmb3IoYT1jKzE7YTw9Zi0xO2ErKyl7Zm9yKGw9MCx1PWE7dTw9Zjt1KyspbCs9TWF0aC5hYnMoZS5nZXQodSxhLTEpKTtpZigwIT09bCl7Zm9yKGk9MCx1PWY7dT49YTt1LS0pclt1XT1lLmdldCh1LGEtMSkvbCxpKz1yW3VdKnJbdV07Zm9yKHM9TWF0aC5zcXJ0KGkpLHJbYV0+MCYmKHM9LXMpLGktPXJbYV0qcyxyW2FdPXJbYV0tcyxoPWE7aDx0O2grKyl7Zm9yKG49MCx1PWY7dT49YTt1LS0pbis9clt1XSplLmdldCh1LGgpO2ZvcihuLz1pLHU9YTt1PD1mO3UrKyllLnNldCh1LGgsZS5nZXQodSxoKS1uKnJbdV0pfWZvcih1PTA7dTw9Zjt1Kyspe2ZvcihuPTAsaD1mO2g+PWE7aC0tKW4rPXJbaF0qZS5nZXQodSxoKTtmb3Iobi89aSxoPWE7aDw9ZjtoKyspZS5zZXQodSxoLGUuZ2V0KHUsaCktbipyW2hdKX1yW2FdPWwqclthXSxlLnNldChhLGEtMSxsKnMpfX1mb3IodT0wO3U8dDt1KyspZm9yKGg9MDtoPHQ7aCsrKW8uc2V0KHUsaCx1PT09aD8xOjApO2ZvcihhPWYtMTthPj1jKzE7YS0tKWlmKDAhPT1lLmdldChhLGEtMSkpe2Zvcih1PWErMTt1PD1mO3UrKylyW3VdPWUuZ2V0KHUsYS0xKTtmb3IoaD1hO2g8PWY7aCsrKXtmb3Iocz0wLHU9YTt1PD1mO3UrKylzKz1yW3VdKm8uZ2V0KHUsaCk7Zm9yKHM9cy9yW2FdL2UuZ2V0KGEsYS0xKSx1PWE7dTw9Zjt1Kyspby5zZXQodSxoLG8uZ2V0KHUsaCkrcypyW3VdKX19fShzLHQsZSxpKSxmdW5jdGlvbih0LGUscixvLG4pe2xldCBzLGksdSxoLGEsbCxjLGYsbSxnLHAsdyxkLGIseSx2PXQtMSxNPTAseD10LTEsRT1OdW1iZXIuRVBTSUxPTixTPTAsaj0wLF89MCxBPTAsTz0wLFI9MCxDPTAsST0wO2ZvcihzPTA7czx0O3MrKylmb3IoKHM8TXx8cz54KSYmKHJbc109bi5nZXQocyxzKSxlW3NdPTApLGk9TWF0aC5tYXgocy0xLDApO2k8dDtpKyspais9TWF0aC5hYnMobi5nZXQocyxpKSk7Zm9yKDt2Pj1NOyl7Zm9yKGg9djtoPk0mJihSPU1hdGguYWJzKG4uZ2V0KGgtMSxoLTEpKStNYXRoLmFicyhuLmdldChoLGgpKSwwPT09UiYmKFI9aiksIShNYXRoLmFicyhuLmdldChoLGgtMSkpPEUqUikpOyloLS07aWYoaD09PXYpbi5zZXQodix2LG4uZ2V0KHYsdikrUyksclt2XT1uLmdldCh2LHYpLGVbdl09MCx2LS0sST0wO2Vsc2UgaWYoaD09PXYtMSl7aWYoYz1uLmdldCh2LHYtMSkqbi5nZXQodi0xLHYpLF89KG4uZ2V0KHYtMSx2LTEpLW4uZ2V0KHYsdikpLzIsQT1fKl8rYyxDPU1hdGguc3FydChNYXRoLmFicyhBKSksbi5zZXQodix2LG4uZ2V0KHYsdikrUyksbi5zZXQodi0xLHYtMSxuLmdldCh2LTEsdi0xKStTKSxmPW4uZ2V0KHYsdiksQT49MCl7Zm9yKEM9Xz49MD9fK0M6Xy1DLHJbdi0xXT1mK0Msclt2XT1yW3YtMV0sMCE9PUMmJihyW3ZdPWYtYy9DKSxlW3YtMV09MCxlW3ZdPTAsZj1uLmdldCh2LHYtMSksUj1NYXRoLmFicyhmKStNYXRoLmFicyhDKSxfPWYvUixBPUMvUixPPU1hdGguc3FydChfKl8rQSpBKSxfLz1PLEEvPU8saT12LTE7aTx0O2krKylDPW4uZ2V0KHYtMSxpKSxuLnNldCh2LTEsaSxBKkMrXypuLmdldCh2LGkpKSxuLnNldCh2LGksQSpuLmdldCh2LGkpLV8qQyk7Zm9yKHM9MDtzPD12O3MrKylDPW4uZ2V0KHMsdi0xKSxuLnNldChzLHYtMSxBKkMrXypuLmdldChzLHYpKSxuLnNldChzLHYsQSpuLmdldChzLHYpLV8qQyk7Zm9yKHM9TTtzPD14O3MrKylDPW8uZ2V0KHMsdi0xKSxvLnNldChzLHYtMSxBKkMrXypvLmdldChzLHYpKSxvLnNldChzLHYsQSpvLmdldChzLHYpLV8qQyl9ZWxzZSByW3YtMV09ZitfLHJbdl09ZitfLGVbdi0xXT1DLGVbdl09LUM7di09MixJPTB9ZWxzZXtpZihmPW4uZ2V0KHYsdiksbT0wLGM9MCxoPHYmJihtPW4uZ2V0KHYtMSx2LTEpLGM9bi5nZXQodix2LTEpKm4uZ2V0KHYtMSx2KSksMTA9PT1JKXtmb3IoUys9ZixzPU07czw9djtzKyspbi5zZXQocyxzLG4uZ2V0KHMscyktZik7Uj1NYXRoLmFicyhuLmdldCh2LHYtMSkpK01hdGguYWJzKG4uZ2V0KHYtMSx2LTIpKSxmPW09Ljc1KlIsYz0tLjQzNzUqUipSfWlmKDMwPT09SSYmKFI9KG0tZikvMixSPVIqUitjLFI+MCkpe2ZvcihSPU1hdGguc3FydChSKSxtPGYmJihSPS1SKSxSPWYtYy8oKG0tZikvMitSKSxzPU07czw9djtzKyspbi5zZXQocyxzLG4uZ2V0KHMscyktUik7Uys9UixmPW09Yz0uOTY0fWZvcihJKz0xLGE9di0yO2E+PWgmJihDPW4uZ2V0KGEsYSksTz1mLUMsUj1tLUMsXz0oTypSLWMpL24uZ2V0KGErMSxhKStuLmdldChhLGErMSksQT1uLmdldChhKzEsYSsxKS1DLU8tUixPPW4uZ2V0KGErMixhKzEpLFI9TWF0aC5hYnMoXykrTWF0aC5hYnMoQSkrTWF0aC5hYnMoTyksXy89UixBLz1SLE8vPVIsYSE9PWgpJiYhKE1hdGguYWJzKG4uZ2V0KGEsYS0xKSkqKE1hdGguYWJzKEEpK01hdGguYWJzKE8pKTxFKihNYXRoLmFicyhfKSooTWF0aC5hYnMobi5nZXQoYS0xLGEtMSkpK01hdGguYWJzKEMpK01hdGguYWJzKG4uZ2V0KGErMSxhKzEpKSkpKTspYS0tO2ZvcihzPWErMjtzPD12O3MrKyluLnNldChzLHMtMiwwKSxzPmErMiYmbi5zZXQocyxzLTMsMCk7Zm9yKHU9YTt1PD12LTEmJihiPXUhPT12LTEsdSE9PWEmJihfPW4uZ2V0KHUsdS0xKSxBPW4uZ2V0KHUrMSx1LTEpLE89Yj9uLmdldCh1KzIsdS0xKTowLGY9TWF0aC5hYnMoXykrTWF0aC5hYnMoQSkrTWF0aC5hYnMoTyksMCE9PWYmJihfLz1mLEEvPWYsTy89ZikpLDAhPT1mKTt1KyspaWYoUj1NYXRoLnNxcnQoXypfK0EqQStPKk8pLF88MCYmKFI9LVIpLDAhPT1SKXtmb3IodSE9PWE/bi5zZXQodSx1LTEsLVIqZik6aCE9PWEmJm4uc2V0KHUsdS0xLC1uLmdldCh1LHUtMSkpLF8rPVIsZj1fL1IsbT1BL1IsQz1PL1IsQS89XyxPLz1fLGk9dTtpPHQ7aSsrKV89bi5nZXQodSxpKStBKm4uZ2V0KHUrMSxpKSxiJiYoXys9TypuLmdldCh1KzIsaSksbi5zZXQodSsyLGksbi5nZXQodSsyLGkpLV8qQykpLG4uc2V0KHUsaSxuLmdldCh1LGkpLV8qZiksbi5zZXQodSsxLGksbi5nZXQodSsxLGkpLV8qbSk7Zm9yKHM9MDtzPD1NYXRoLm1pbih2LHUrMyk7cysrKV89ZipuLmdldChzLHUpK20qbi5nZXQocyx1KzEpLGImJihfKz1DKm4uZ2V0KHMsdSsyKSxuLnNldChzLHUrMixuLmdldChzLHUrMiktXypPKSksbi5zZXQocyx1LG4uZ2V0KHMsdSktXyksbi5zZXQocyx1KzEsbi5nZXQocyx1KzEpLV8qQSk7Zm9yKHM9TTtzPD14O3MrKylfPWYqby5nZXQocyx1KSttKm8uZ2V0KHMsdSsxKSxiJiYoXys9QypvLmdldChzLHUrMiksby5zZXQocyx1KzIsby5nZXQocyx1KzIpLV8qTykpLG8uc2V0KHMsdSxvLmdldChzLHUpLV8pLG8uc2V0KHMsdSsxLG8uZ2V0KHMsdSsxKS1fKkEpfX19aWYoMD09PWopcmV0dXJuO2Zvcih2PXQtMTt2Pj0wO3YtLSlpZihfPXJbdl0sQT1lW3ZdLDA9PT1BKWZvcihoPXYsbi5zZXQodix2LDEpLHM9di0xO3M+PTA7cy0tKXtmb3IoYz1uLmdldChzLHMpLV8sTz0wLGk9aDtpPD12O2krKylPKz1uLmdldChzLGkpKm4uZ2V0KGksdik7aWYoZVtzXTwwKUM9YyxSPU87ZWxzZSBpZihoPXMsMD09PWVbc10/bi5zZXQocyx2LDAhPT1jPy1PL2M6LU8vKEUqaikpOihmPW4uZ2V0KHMscysxKSxtPW4uZ2V0KHMrMSxzKSxBPShyW3NdLV8pKihyW3NdLV8pK2Vbc10qZVtzXSxsPShmKlItQypPKS9BLG4uc2V0KHMsdixsKSxuLnNldChzKzEsdixNYXRoLmFicyhmKT5NYXRoLmFicyhDKT8oLU8tYypsKS9mOigtUi1tKmwpL0MpKSxsPU1hdGguYWJzKG4uZ2V0KHMsdikpLEUqbCpsPjEpZm9yKGk9cztpPD12O2krKyluLnNldChpLHYsbi5nZXQoaSx2KS9sKX1lbHNlIGlmKEE8MClmb3IoaD12LTEsTWF0aC5hYnMobi5nZXQodix2LTEpKT5NYXRoLmFicyhuLmdldCh2LTEsdikpPyhuLnNldCh2LTEsdi0xLEEvbi5nZXQodix2LTEpKSxuLnNldCh2LTEsdiwtKG4uZ2V0KHYsdiktXykvbi5nZXQodix2LTEpKSk6KHk9bnIoMCwtbi5nZXQodi0xLHYpLG4uZ2V0KHYtMSx2LTEpLV8sQSksbi5zZXQodi0xLHYtMSx5WzBdKSxuLnNldCh2LTEsdix5WzFdKSksbi5zZXQodix2LTEsMCksbi5zZXQodix2LDEpLHM9di0yO3M+PTA7cy0tKXtmb3IoZz0wLHA9MCxpPWg7aTw9djtpKyspZys9bi5nZXQocyxpKSpuLmdldChpLHYtMSkscCs9bi5nZXQocyxpKSpuLmdldChpLHYpO2lmKGM9bi5nZXQocyxzKS1fLGVbc108MClDPWMsTz1nLFI9cDtlbHNlIGlmKGg9cywwPT09ZVtzXT8oeT1ucigtZywtcCxjLEEpLG4uc2V0KHMsdi0xLHlbMF0pLG4uc2V0KHMsdix5WzFdKSk6KGY9bi5nZXQocyxzKzEpLG09bi5nZXQocysxLHMpLHc9KHJbc10tXykqKHJbc10tXykrZVtzXSplW3NdLUEqQSxkPTIqKHJbc10tXykqQSwwPT09dyYmMD09PWQmJih3PUUqaiooTWF0aC5hYnMoYykrTWF0aC5hYnMoQSkrTWF0aC5hYnMoZikrTWF0aC5hYnMobSkrTWF0aC5hYnMoQykpKSx5PW5yKGYqTy1DKmcrQSpwLGYqUi1DKnAtQSpnLHcsZCksbi5zZXQocyx2LTEseVswXSksbi5zZXQocyx2LHlbMV0pLE1hdGguYWJzKGYpPk1hdGguYWJzKEMpK01hdGguYWJzKEEpPyhuLnNldChzKzEsdi0xLCgtZy1jKm4uZ2V0KHMsdi0xKStBKm4uZ2V0KHMsdikpL2YpLG4uc2V0KHMrMSx2LCgtcC1jKm4uZ2V0KHMsdiktQSpuLmdldChzLHYtMSkpL2YpKTooeT1ucigtTy1tKm4uZ2V0KHMsdi0xKSwtUi1tKm4uZ2V0KHMsdiksQyxBKSxuLnNldChzKzEsdi0xLHlbMF0pLG4uc2V0KHMrMSx2LHlbMV0pKSksbD1NYXRoLm1heChNYXRoLmFicyhuLmdldChzLHYtMSkpLE1hdGguYWJzKG4uZ2V0KHMsdikpKSxFKmwqbD4xKWZvcihpPXM7aTw9djtpKyspbi5zZXQoaSx2LTEsbi5nZXQoaSx2LTEpL2wpLG4uc2V0KGksdixuLmdldChpLHYpL2wpfWZvcihzPTA7czx0O3MrKylpZihzPE18fHM+eClmb3IoaT1zO2k8dDtpKyspby5zZXQocyxpLG4uZ2V0KHMsaSkpO2ZvcihpPXQtMTtpPj1NO2ktLSlmb3Iocz1NO3M8PXg7cysrKXtmb3IoQz0wLHU9TTt1PD1NYXRoLm1pbihpLHgpO3UrKylDKz1vLmdldChzLHUpKm4uZ2V0KHUsaSk7by5zZXQocyxpLEMpfX0ocyxoLHUsaSx0KX10aGlzLm49cyx0aGlzLmU9aCx0aGlzLmQ9dSx0aGlzLlY9aX1nZXQgcmVhbEVpZ2VudmFsdWVzKCl7cmV0dXJuIEFycmF5LmZyb20odGhpcy5kKX1nZXQgaW1hZ2luYXJ5RWlnZW52YWx1ZXMoKXtyZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmUpfWdldCBlaWdlbnZlY3Rvck1hdHJpeCgpe3JldHVybiB0aGlzLlZ9Z2V0IGRpYWdvbmFsTWF0cml4KCl7bGV0IHQsZSxyPXRoaXMubixvPXRoaXMuZSxuPXRoaXMuZCxzPW5ldyBaZShyLHIpO2Zvcih0PTA7dDxyO3QrKyl7Zm9yKGU9MDtlPHI7ZSsrKXMuc2V0KHQsZSwwKTtzLnNldCh0LHQsblt0XSksb1t0XT4wP3Muc2V0KHQsdCsxLG9bdF0pOm9bdF08MCYmcy5zZXQodCx0LTEsb1t0XSl9cmV0dXJuIHN9fWZ1bmN0aW9uIG5yKHQsZSxyLG8pe2xldCBuLHM7cmV0dXJuIE1hdGguYWJzKHIpPk1hdGguYWJzKG8pPyhuPW8vcixzPXIrbipvLFsodCtuKmUpL3MsKGUtbip0KS9zXSk6KG49ci9vLHM9bytuKnIsWyhuKnQrZSkvcywobiplLXQpL3NdKX1jbGFzcyBzcntjb25zdHJ1Y3Rvcih0LGU9e30pe3Q9dHIuY2hlY2tNYXRyaXgodCk7bGV0e1k6cn09ZTtjb25zdHtzY2FsZVNjb3JlczpvPSExLG1heEl0ZXJhdGlvbnM6bj0xZTMsdGVybWluYXRpb25Dcml0ZXJpYTpzPTFlLTEwfT1lO2xldCBpO2lmKHIpe2lmKHI9RmUocikmJiJudW1iZXIiPT10eXBlb2YgclswXT9aZS5jb2x1bW5WZWN0b3Iocik6dHIuY2hlY2tNYXRyaXgociksci5yb3dzIT09dC5yb3dzKXRocm93IG5ldyBFcnJvcigiWSBzaG91bGQgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2Ygcm93cyBhcyBYIik7aT1yLmdldENvbHVtblZlY3RvcigwKX1lbHNlIGk9dC5nZXRDb2x1bW5WZWN0b3IoMCk7bGV0IHUsaCxhLGwsYz0xO2ZvcihsZXQgZT0wO2U8biYmYz5zO2UrKylhPXQudHJhbnNwb3NlKCkubW11bChpKS5kaXYoaS50cmFuc3Bvc2UoKS5tbXVsKGkpLmdldCgwLDApKSxhPWEuZGl2KGEubm9ybSgpKSx1PXQubW11bChhKS5kaXYoYS50cmFuc3Bvc2UoKS5tbXVsKGEpLmdldCgwLDApKSxlPjAmJihjPXUuY2xvbmUoKS5zdWIobCkucG93KDIpLnN1bSgpKSxsPXUuY2xvbmUoKSxyPyhoPXIudHJhbnNwb3NlKCkubW11bCh1KS5kaXYodS50cmFuc3Bvc2UoKS5tbXVsKHUpLmdldCgwLDApKSxoPWguZGl2KGgubm9ybSgpKSxpPXIubW11bChoKS5kaXYoaC50cmFuc3Bvc2UoKS5tbXVsKGgpLmdldCgwLDApKSk6aT11O2lmKHIpe2xldCBlPXQudHJhbnNwb3NlKCkubW11bCh1KS5kaXYodS50cmFuc3Bvc2UoKS5tbXVsKHUpLmdldCgwLDApKTtlPWUuZGl2KGUubm9ybSgpKTtsZXQgbz10LmNsb25lKCkuc3ViKHUuY2xvbmUoKS5tbXVsKGUudHJhbnNwb3NlKCkpKSxuPWkudHJhbnNwb3NlKCkubW11bCh1KS5kaXYodS50cmFuc3Bvc2UoKS5tbXVsKHUpLmdldCgwLDApKSxzPXIuY2xvbmUoKS5zdWIodS5jbG9uZSgpLm11bFMobi5nZXQoMCwwKSkubW11bChoLnRyYW5zcG9zZSgpKSk7dGhpcy50PXUsdGhpcy5wPWUudHJhbnNwb3NlKCksdGhpcy53PWEudHJhbnNwb3NlKCksdGhpcy5xPWgsdGhpcy51PWksdGhpcy5zPXUudHJhbnNwb3NlKCkubW11bCh1KSx0aGlzLnhSZXNpZHVhbD1vLHRoaXMueVJlc2lkdWFsPXMsdGhpcy5iZXRhcz1ufWVsc2UgdGhpcy53PWEudHJhbnNwb3NlKCksdGhpcy5zPXUudHJhbnNwb3NlKCkubW11bCh1KS5zcXJ0KCksdGhpcy50PW8/dS5jbG9uZSgpLmRpdih0aGlzLnMuZ2V0KDAsMCkpOnUsdGhpcy54UmVzaWR1YWw9dC5zdWIodS5tbXVsKGEudHJhbnNwb3NlKCkpKX19bGV0IGlyPWNsYXNzIHR7Y29uc3RydWN0b3IodCxlPXt9LHIpe2lmKHRoaXMuVT1udWxsLHRoaXMuUz1udWxsLHIpcmV0dXJuIHRoaXMuY2VudGVyPXIuY2VudGVyLHRoaXMuc2NhbGU9ci5zY2FsZSx0aGlzLm1lYW5zPXIubWVhbnMsdGhpcy5zdGRldnM9ci5zdGRldnMsdGhpcy5VPVplLmNoZWNrTWF0cml4KHIuVSksdGhpcy5TPXIuUyx0aGlzLlI9ci5SLHZvaWQodGhpcy5leGNsdWRlZEZlYXR1cmVzPXIuZXhjbHVkZWRGZWF0dXJlc3x8W10pO2xldCBvO289KEFycmF5LmlzQXJyYXkodCksbmV3IFplKHQpKTtjb25zdHtpc0NvdmFyaWFuY2VNYXRyaXg6bj0hMSxtZXRob2Q6cz0iU1ZEIixuQ29tcE5JUEFMUzppPTIsY2VudGVyOnU9ITAsc2NhbGU6aD0hMSxpZ25vcmVaZXJvVmFyaWFuY2U6YT0hMX09ZTtpZih0aGlzLmNlbnRlcj11LHRoaXMuc2NhbGU9aCx0aGlzLm1lYW5zPW51bGwsdGhpcy5zdGRldnM9bnVsbCx0aGlzLmV4Y2x1ZGVkRmVhdHVyZXM9W10sbil0aGlzLl9jb21wdXRlRnJvbUNvdmFyaWFuY2VNYXRyaXgobyk7ZWxzZSBzd2l0Y2godGhpcy5fYWRqdXN0KG8sYSkscyl7Y2FzZSJjb3ZhcmlhbmNlTWF0cml4Ijp7Y29uc3QgdD1uZXcgUWUobykubW11bChvKS5kaXYoby5yb3dzLTEpO3RoaXMuX2NvbXB1dGVGcm9tQ292YXJpYW5jZU1hdHJpeCh0KTticmVha31jYXNlIk5JUEFMUyI6dGhpcy5fY29tcHV0ZVdpdGhOSVBBTFMobyxpKTticmVhaztjYXNlIlNWRCI6e2NvbnN0IHQ9bmV3IHJyKG8se2NvbXB1dGVMZWZ0U2luZ3VsYXJWZWN0b3JzOiExLGNvbXB1dGVSaWdodFNpbmd1bGFyVmVjdG9yczohMCxhdXRvVHJhbnNwb3NlOiEwfSk7dGhpcy5VPXQucmlnaHRTaW5ndWxhclZlY3RvcnM7Y29uc3QgZT10LmRpYWdvbmFsLHI9W107Zm9yKGNvbnN0IHQgb2YgZSlyLnB1c2godCp0LyhvLnJvd3MtMSkpO3RoaXMuUz1yO2JyZWFrfWRlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGB1bmtub3duIG1ldGhvZDogJHtzfWApfX1zdGF0aWMgbG9hZChlKXtpZigic3RyaW5nIiE9dHlwZW9mIGUubmFtZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJtb2RlbCBtdXN0IGhhdmUgYSBuYW1lIHByb3BlcnR5Iik7aWYoIlBDQSIhPT1lLm5hbWUpdGhyb3cgbmV3IFJhbmdlRXJyb3IoYGludmFsaWQgbW9kZWw6ICR7ZS5uYW1lfWApO3JldHVybiBuZXcgdCh2b2lkIDAsdm9pZCAwLGUpfXByZWRpY3QodCxlPXt9KXtjb25zdHtuQ29tcG9uZW50czpyPXRoaXMuVS5jb2x1bW5zfT1lO2xldCBvO2lmKG89KEFycmF5LmlzQXJyYXkodCksbmV3IFplKHQpKSx0aGlzLmNlbnRlciYmKG8uc3ViUm93VmVjdG9yKHRoaXMubWVhbnMpLHRoaXMuc2NhbGUpKXtmb3IobGV0IHQgb2YgdGhpcy5leGNsdWRlZEZlYXR1cmVzKW8ucmVtb3ZlQ29sdW1uKHQpO28uZGl2Um93VmVjdG9yKHRoaXMuc3RkZXZzKX1sZXQgbj1vLm1tdWwodGhpcy5VKTtyZXR1cm4gbi5zdWJNYXRyaXgoMCxuLnJvd3MtMSwwLHItMSl9aW52ZXJ0KHQpe2xldCBlPSh0PVplLmNoZWNrTWF0cml4KHQpKS5tbXVsKHRoaXMuVS50cmFuc3Bvc2UoKSk7cmV0dXJuIHRoaXMuY2VudGVyJiYodGhpcy5zY2FsZSYmZS5tdWxSb3dWZWN0b3IodGhpcy5zdGRldnMpLGUuYWRkUm93VmVjdG9yKHRoaXMubWVhbnMpKSxlfWdldEV4cGxhaW5lZFZhcmlhbmNlKCl7bGV0IHQ9MDtpZih0aGlzLlMpZm9yKGNvbnN0IGUgb2YgdGhpcy5TKXQrPWU7cmV0dXJuIHRoaXMuUz90aGlzLlMubWFwKChlPT5lL3QpKTpbXX1nZXRDdW11bGF0aXZlVmFyaWFuY2UoKXtsZXQgdD10aGlzLmdldEV4cGxhaW5lZFZhcmlhbmNlKCk7Zm9yKGxldCBlPTE7ZTx0Lmxlbmd0aDtlKyspdFtlXSs9dFtlLTFdO3JldHVybiB0fWdldEVpZ2VudmVjdG9ycygpe3JldHVybiB0aGlzLlV9Z2V0RWlnZW52YWx1ZXMoKXtyZXR1cm4gdGhpcy5TfWdldFN0YW5kYXJkRGV2aWF0aW9ucygpe3JldHVybiB0aGlzLlMubWFwKCh0PT5NYXRoLnNxcnQodCkpKX1nZXRMb2FkaW5ncygpe3JldHVybiB0aGlzLlUudHJhbnNwb3NlKCl9dG9KU09OKCl7cmV0dXJue25hbWU6IlBDQSIsY2VudGVyOnRoaXMuY2VudGVyLHNjYWxlOnRoaXMuc2NhbGUsbWVhbnM6dGhpcy5tZWFucyxzdGRldnM6dGhpcy5zdGRldnMsVTp0aGlzLlUsUzp0aGlzLlMsZXhjbHVkZWRGZWF0dXJlczp0aGlzLmV4Y2x1ZGVkRmVhdHVyZXN9fV9hZGp1c3QodCxlKXtpZih0aGlzLmNlbnRlcil7Y29uc3Qgcj10Lm1lYW4oImNvbHVtbiIpLG89dGhpcy5zY2FsZT90LnN0YW5kYXJkRGV2aWF0aW9uKCJjb2x1bW4iLHttZWFuOnJ9KTpudWxsO2lmKHRoaXMubWVhbnM9cix0LnN1YlJvd1ZlY3RvcihyKSx0aGlzLnNjYWxlKXtmb3IobGV0IHI9MDtyPG8ubGVuZ3RoO3IrKylpZigwPT09b1tyXSl7aWYoIWUpdGhyb3cgbmV3IFJhbmdlRXJyb3IoYENhbm5vdCBzY2FsZSB0aGUgZGF0YXNldCAoc3RhbmRhcmQgZGV2aWF0aW9uIGlzIHplcm8gYXQgaW5kZXggJHtyfWApO3QucmVtb3ZlQ29sdW1uKHIpLG8uc3BsaWNlKHIsMSksdGhpcy5leGNsdWRlZEZlYXR1cmVzLnB1c2gociksci0tfXRoaXMuc3RkZXZzPW8sdC5kaXZSb3dWZWN0b3Iobyl9fX1fY29tcHV0ZUZyb21Db3ZhcmlhbmNlTWF0cml4KHQpe2NvbnN0IGU9bmV3IG9yKHQse2Fzc3VtZVN5bW1ldHJpYzohMH0pO3RoaXMuVT1lLmVpZ2VudmVjdG9yTWF0cml4LHRoaXMuVS5mbGlwUm93cygpLHRoaXMuUz1lLnJlYWxFaWdlbnZhbHVlcyx0aGlzLlMucmV2ZXJzZSgpfV9jb21wdXRlV2l0aE5JUEFMUyh0LGUpe3RoaXMuVT1uZXcgWmUoZSx0LmNvbHVtbnMpLHRoaXMuUz1bXTtsZXQgcj10O2ZvcihsZXQgdD0wO3Q8ZTt0Kyspe2xldCBlPW5ldyBzcihyKTt0aGlzLlUuc2V0Um93KHQsZS53LnRyYW5zcG9zZSgpKSx0aGlzLlMucHVzaChNYXRoLnBvdyhlLnMuZ2V0KDAsMCksMikpLHI9ZS54UmVzaWR1YWx9dGhpcy5VPXRoaXMuVS50cmFuc3Bvc2UoKX19O2Z1bmN0aW9uIHVyKHQsZT17fSl7aWYoIWNlKHQpKXRocm93IG5ldyBFcnJvcigiZGF0YSBpcyBub3QgZWZmLiBhcnJheSIpO2xldCByPXB0KGUsInNjYWxlIik7bWUocil8fChyPSEwKTtsZXQgbz1wdChlLCJuQ29tcE5JUEFMUyIpO3BlKG8pfHwobz0yKSxvPU5lKG8pO2xldCBuPXNlKHB0KHQsMCxbXSkpO2lmKDA9PT1uKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBkaW1lbnNpb24gb2YgZGF0YSIpO2lmKG8+bil0aHJvdyBuZXcgRXJyb3IoYG5Db21wTklQQUxTWyR7b31dIGlzIG1vcmUgdGhhbiB0aGUgZGltZW5zaW9uWyR7bn1dIG9mIGRhdGFgKTtyZXR1cm4gbmV3IGlyKHQse21ldGhvZDoiTklQQUxTIixzY2FsZTpyLG5Db21wTklQQUxTOm99KS5wcmVkaWN0KHQpLnRvSlNPTigpfWZ1bmN0aW9uIGhyKHQsZSl7Zm9yKHZhciByPS0xLG89bnVsbD09dD8wOnQubGVuZ3RoOysrcjxvJiYhMSE9PWUodFtyXSxyLHQpOyk7cmV0dXJuIHR9dmFyIGFyLGxyPWZ1bmN0aW9uKHQsZSxyKXtmb3IodmFyIG89LTEsbj1PYmplY3QodCkscz1yKHQpLGk9cy5sZW5ndGg7aS0tOyl7dmFyIHU9c1thcj9pOisrb107aWYoITE9PT1lKG5bdV0sdSxuKSlicmVha31yZXR1cm4gdH07ZnVuY3Rpb24gY3IodCl7cmV0dXJuIGcodCkmJiJbb2JqZWN0IEFyZ3VtZW50c10iPT1tKHQpfXZhciBmcj1PYmplY3QucHJvdG90eXBlLG1yPWZyLmhhc093blByb3BlcnR5LGdyPWZyLnByb3BlcnR5SXNFbnVtZXJhYmxlLHByPWNyKGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50c30oKSk/Y3I6ZnVuY3Rpb24odCl7cmV0dXJuIGcodCkmJm1yLmNhbGwodCwiY2FsbGVlIikmJiFnci5jYWxsKHQsImNhbGxlZSIpfTt2YXIgd3I9Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiZleHBvcnRzJiYhZXhwb3J0cy5ub2RlVHlwZSYmZXhwb3J0cyxkcj13ciYmIm9iamVjdCI9PXR5cGVvZiBtb2R1bGUmJm1vZHVsZSYmIW1vZHVsZS5ub2RlVHlwZSYmbW9kdWxlLGJyPWRyJiZkci5leHBvcnRzPT09d3I/by5CdWZmZXI6dm9pZCAwLHlyPShicj9ici5pc0J1ZmZlcjp2b2lkIDApfHxmdW5jdGlvbigpe3JldHVybiExfSx2cj05MDA3MTk5MjU0NzQwOTkxLE1yPS9eKD86MHxbMS05XVxkKikkLztmdW5jdGlvbiB4cih0LGUpe3ZhciByPXR5cGVvZiB0O3JldHVybiEhKGU9bnVsbD09ZT92cjplKSYmKCJudW1iZXIiPT1yfHwic3ltYm9sIiE9ciYmTXIudGVzdCh0KSkmJnQ+LTEmJnQlMT09MCYmdDxlfXZhciBFcj17fTtFclsiW29iamVjdCBGbG9hdDMyQXJyYXldIl09RXJbIltvYmplY3QgRmxvYXQ2NEFycmF5XSJdPUVyWyJbb2JqZWN0IEludDhBcnJheV0iXT1FclsiW29iamVjdCBJbnQxNkFycmF5XSJdPUVyWyJbb2JqZWN0IEludDMyQXJyYXldIl09RXJbIltvYmplY3QgVWludDhBcnJheV0iXT1FclsiW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0iXT1FclsiW29iamVjdCBVaW50MTZBcnJheV0iXT1FclsiW29iamVjdCBVaW50MzJBcnJheV0iXT0hMCxFclsiW29iamVjdCBBcmd1bWVudHNdIl09RXJbIltvYmplY3QgQXJyYXldIl09RXJbIltvYmplY3QgQXJyYXlCdWZmZXJdIl09RXJbIltvYmplY3QgQm9vbGVhbl0iXT1FclsiW29iamVjdCBEYXRhVmlld10iXT1FclsiW29iamVjdCBEYXRlXSJdPUVyWyJbb2JqZWN0IEVycm9yXSJdPUVyWyJbb2JqZWN0IEZ1bmN0aW9uXSJdPUVyWyJbb2JqZWN0IE1hcF0iXT1FclsiW29iamVjdCBOdW1iZXJdIl09RXJbIltvYmplY3QgT2JqZWN0XSJdPUVyWyJbb2JqZWN0IFJlZ0V4cF0iXT1FclsiW29iamVjdCBTZXRdIl09RXJbIltvYmplY3QgU3RyaW5nXSJdPUVyWyJbb2JqZWN0IFdlYWtNYXBdIl09ITE7dmFyIFNyPSJvYmplY3QiPT10eXBlb2YgZXhwb3J0cyYmZXhwb3J0cyYmIWV4cG9ydHMubm9kZVR5cGUmJmV4cG9ydHMsanI9U3ImJiJvYmplY3QiPT10eXBlb2YgbW9kdWxlJiZtb2R1bGUmJiFtb2R1bGUubm9kZVR5cGUmJm1vZHVsZSxfcj1qciYmanIuZXhwb3J0cz09PVNyJiZlLnByb2Nlc3MsQXI9ZnVuY3Rpb24oKXt0cnl7dmFyIHQ9anImJmpyLnJlcXVpcmUmJmpyLnJlcXVpcmUoInV0aWwiKS50eXBlcztyZXR1cm4gdHx8X3ImJl9yLmJpbmRpbmcmJl9yLmJpbmRpbmcoInV0aWwiKX1jYXRjaCh0KXt9fSgpLE9yPUFyJiZBci5pc1R5cGVkQXJyYXksUnI9T3I/ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0KGUpfX0oT3IpOmZ1bmN0aW9uKHQpe3JldHVybiBnKHQpJiZWdCh0Lmxlbmd0aCkmJiEhRXJbbSh0KV19LENyPVJyLElyPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gTnIoZSxyKXt2YXIgbz10KGUpLG49IW8mJnByKGUpLHM9IW8mJiFuJiZ5cihlKSxpPSFvJiYhbiYmIXMmJkNyKGUpLHU9b3x8bnx8c3x8aSxoPXU/ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9LTEsbz1BcnJheSh0KTsrK3I8dDspb1tyXT1lKHIpO3JldHVybiBvfShlLmxlbmd0aCxTdHJpbmcpOltdLGE9aC5sZW5ndGg7Zm9yKHZhciBsIGluIGUpIXImJiFJci5jYWxsKGUsbCl8fHUmJigibGVuZ3RoIj09bHx8cyYmKCJvZmZzZXQiPT1sfHwicGFyZW50Ij09bCl8fGkmJigiYnVmZmVyIj09bHx8ImJ5dGVMZW5ndGgiPT1sfHwiYnl0ZU9mZnNldCI9PWwpfHx4cihsLGEpKXx8aC5wdXNoKGwpO3JldHVybiBofWZ1bmN0aW9uIGtyKHQpe3JldHVybiAkdCh0KT9Ocih0KTp2dCh0KX12YXIgRnI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZnVuY3Rpb24ocixvKXtpZihudWxsPT1yKXJldHVybiByO2lmKCEkdChyKSlyZXR1cm4gdChyLG8pO2Zvcih2YXIgbj1yLmxlbmd0aCxzPWU/bjotMSxpPU9iamVjdChyKTsoZT9zLS06KytzPG4pJiYhMSE9PW8oaVtzXSxzLGkpOyk7cmV0dXJuIHJ9fSgoZnVuY3Rpb24odCxlKXtyZXR1cm4gdCYmbHIodCxlLGtyKX0pKSxQcj1GcjtmdW5jdGlvbiBUcih0KXtyZXR1cm4gdH1mdW5jdGlvbiB6cihlLHIpe3ZhciBvO3JldHVybih0KGUpP2hyOlByKShlLCJmdW5jdGlvbiI9PXR5cGVvZihvPXIpP286VHIpfWZ1bmN0aW9uIFZyKHQpe3ZhciBlPXRoaXMuX19kYXRhX189bmV3IFcodCk7dGhpcy5zaXplPWUuc2l6ZX1Wci5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLl9fZGF0YV9fPW5ldyBXLHRoaXMuc2l6ZT0wfSxWci5wcm90b3R5cGUuZGVsZXRlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX19kYXRhX18scj1lLmRlbGV0ZSh0KTtyZXR1cm4gdGhpcy5zaXplPWUuc2l6ZSxyfSxWci5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLmdldCh0KX0sVnIucHJvdG90eXBlLmhhcz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXModCl9LFZyLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLl9fZGF0YV9fO2lmKHIgaW5zdGFuY2VvZiBXKXt2YXIgbz1yLl9fZGF0YV9fO2lmKCFLfHxvLmxlbmd0aDwxOTkpcmV0dXJuIG8ucHVzaChbdCxlXSksdGhpcy5zaXplPSsrci5zaXplLHRoaXM7cj10aGlzLl9fZGF0YV9fPW5ldyBYKG8pfXJldHVybiByLnNldCh0LGUpLHRoaXMuc2l6ZT1yLnNpemUsdGhpc307ZnVuY3Rpb24gJHIodCl7dmFyIGU9LTEscj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuX19kYXRhX189bmV3IFg7KytlPHI7KXRoaXMuYWRkKHRbZV0pfWZ1bmN0aW9uIHFyKHQsZSl7Zm9yKHZhciByPS0xLG89bnVsbD09dD8wOnQubGVuZ3RoOysrcjxvOylpZihlKHRbcl0scix0KSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBEcih0LGUpe3JldHVybiB0LmhhcyhlKX0kci5wcm90b3R5cGUuYWRkPSRyLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLnNldCh0LCJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIiksdGhpc30sJHIucHJvdG90eXBlLmhhcz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXModCl9O3ZhciBVcj0xLExyPTI7ZnVuY3Rpb24gR3IodCxlLHIsbyxuLHMpe3ZhciBpPXImVXIsdT10Lmxlbmd0aCxoPWUubGVuZ3RoO2lmKHUhPWgmJiEoaSYmaD51KSlyZXR1cm4hMTt2YXIgYT1zLmdldCh0KSxsPXMuZ2V0KGUpO2lmKGEmJmwpcmV0dXJuIGE9PWUmJmw9PXQ7dmFyIGM9LTEsZj0hMCxtPXImTHI/bmV3ICRyOnZvaWQgMDtmb3Iocy5zZXQodCxlKSxzLnNldChlLHQpOysrYzx1Oyl7dmFyIGc9dFtjXSxwPWVbY107aWYobyl2YXIgdz1pP28ocCxnLGMsZSx0LHMpOm8oZyxwLGMsdCxlLHMpO2lmKHZvaWQgMCE9PXcpe2lmKHcpY29udGludWU7Zj0hMTticmVha31pZihtKXtpZighcXIoZSwoZnVuY3Rpb24odCxlKXtpZighRHIobSxlKSYmKGc9PT10fHxuKGcsdCxyLG8scykpKXJldHVybiBtLnB1c2goZSl9KSkpe2Y9ITE7YnJlYWt9fWVsc2UgaWYoZyE9PXAmJiFuKGcscCxyLG8scykpe2Y9ITE7YnJlYWt9fXJldHVybiBzLmRlbGV0ZSh0KSxzLmRlbGV0ZShlKSxmfXZhciBCcj1vLlVpbnQ4QXJyYXk7ZnVuY3Rpb24gV3IodCl7dmFyIGU9LTEscj1BcnJheSh0LnNpemUpO3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQsbyl7clsrK2VdPVtvLHRdfSkpLHJ9ZnVuY3Rpb24gS3IodCl7dmFyIGU9LTEscj1BcnJheSh0LnNpemUpO3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3JbKytlXT10fSkpLHJ9dmFyIFlyPTEsWHI9MixKcj0iW29iamVjdCBCb29sZWFuXSIsWnI9IltvYmplY3QgRGF0ZV0iLEhyPSJbb2JqZWN0IEVycm9yXSIsUXI9IltvYmplY3QgTWFwXSIsdG89IltvYmplY3QgTnVtYmVyXSIsZW89IltvYmplY3QgUmVnRXhwXSIscm89IltvYmplY3QgU2V0XSIsb289IltvYmplY3QgU3RyaW5nXSIsbm89IltvYmplY3QgU3ltYm9sXSIsc289IltvYmplY3QgQXJyYXlCdWZmZXJdIixpbz0iW29iamVjdCBEYXRhVmlld10iLHVvPW4/bi5wcm90b3R5cGU6dm9pZCAwLGhvPXVvP3VvLnZhbHVlT2Y6dm9pZCAwO3ZhciBhbz1PYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLGxvPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsY289bG8/ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/W106KHQ9T2JqZWN0KHQpLGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPS0xLG89bnVsbD09dD8wOnQubGVuZ3RoLG49MCxzPVtdOysrcjxvOyl7dmFyIGk9dFtyXTtlKGkscix0KSYmKHNbbisrXT1pKX1yZXR1cm4gc30obG8odCksKGZ1bmN0aW9uKGUpe3JldHVybiBhby5jYWxsKHQsZSl9KSkpfTpmdW5jdGlvbigpe3JldHVybltdfSxmbz1jbztmdW5jdGlvbiBtbyhlKXtyZXR1cm4gZnVuY3Rpb24oZSxyLG8pe3ZhciBuPXIoZSk7cmV0dXJuIHQoZSk/bjpmdW5jdGlvbih0LGUpe2Zvcih2YXIgcj0tMSxvPWUubGVuZ3RoLG49dC5sZW5ndGg7KytyPG87KXRbbityXT1lW3JdO3JldHVybiB0fShuLG8oZSkpfShlLGtyLGZvKX12YXIgZ289MSxwbz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3ZhciB3bz0xLGJvPSJbb2JqZWN0IEFyZ3VtZW50c10iLHlvPSJbb2JqZWN0IEFycmF5XSIsdm89IltvYmplY3QgT2JqZWN0XSIsTW89T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiB4byhlLHIsbyxuLHMsaSl7dmFyIHU9dChlKSxoPXQociksYT11P3lvOlR0KGUpLGw9aD95bzpUdChyKSxjPShhPWE9PWJvP3ZvOmEpPT12byxmPShsPWw9PWJvP3ZvOmwpPT12byxtPWE9PWw7aWYobSYmeXIoZSkpe2lmKCF5cihyKSlyZXR1cm4hMTt1PSEwLGM9ITF9aWYobSYmIWMpcmV0dXJuIGl8fChpPW5ldyBWciksdXx8Q3IoZSk/R3IoZSxyLG8sbixzLGkpOmZ1bmN0aW9uKHQsZSxyLG8sbixzLGkpe3N3aXRjaChyKXtjYXNlIGlvOmlmKHQuYnl0ZUxlbmd0aCE9ZS5ieXRlTGVuZ3RofHx0LmJ5dGVPZmZzZXQhPWUuYnl0ZU9mZnNldClyZXR1cm4hMTt0PXQuYnVmZmVyLGU9ZS5idWZmZXI7Y2FzZSBzbzpyZXR1cm4hKHQuYnl0ZUxlbmd0aCE9ZS5ieXRlTGVuZ3RofHwhcyhuZXcgQnIodCksbmV3IEJyKGUpKSk7Y2FzZSBKcjpjYXNlIFpyOmNhc2UgdG86cmV0dXJuIEwoK3QsK2UpO2Nhc2UgSHI6cmV0dXJuIHQubmFtZT09ZS5uYW1lJiZ0Lm1lc3NhZ2U9PWUubWVzc2FnZTtjYXNlIGVvOmNhc2Ugb286cmV0dXJuIHQ9PWUrIiI7Y2FzZSBRcjp2YXIgdT1XcjtjYXNlIHJvOnZhciBoPW8mWXI7aWYodXx8KHU9S3IpLHQuc2l6ZSE9ZS5zaXplJiYhaClyZXR1cm4hMTt2YXIgYT1pLmdldCh0KTtpZihhKXJldHVybiBhPT1lO298PVhyLGkuc2V0KHQsZSk7dmFyIGw9R3IodSh0KSx1KGUpLG8sbixzLGkpO3JldHVybiBpLmRlbGV0ZSh0KSxsO2Nhc2Ugbm86aWYoaG8pcmV0dXJuIGhvLmNhbGwodCk9PWhvLmNhbGwoZSl9cmV0dXJuITF9KGUscixhLG8sbixzLGkpO2lmKCEobyZ3bykpe3ZhciBnPWMmJk1vLmNhbGwoZSwiX193cmFwcGVkX18iKSxwPWYmJk1vLmNhbGwociwiX193cmFwcGVkX18iKTtpZihnfHxwKXt2YXIgdz1nP2UudmFsdWUoKTplLGQ9cD9yLnZhbHVlKCk6cjtyZXR1cm4gaXx8KGk9bmV3IFZyKSxzKHcsZCxvLG4saSl9fXJldHVybiEhbSYmKGl8fChpPW5ldyBWciksZnVuY3Rpb24odCxlLHIsbyxuLHMpe3ZhciBpPXImZ28sdT1tbyh0KSxoPXUubGVuZ3RoO2lmKGghPW1vKGUpLmxlbmd0aCYmIWkpcmV0dXJuITE7Zm9yKHZhciBhPWg7YS0tOyl7dmFyIGw9dVthXTtpZighKGk/bCBpbiBlOnBvLmNhbGwoZSxsKSkpcmV0dXJuITF9dmFyIGM9cy5nZXQodCksZj1zLmdldChlKTtpZihjJiZmKXJldHVybiBjPT1lJiZmPT10O3ZhciBtPSEwO3Muc2V0KHQsZSkscy5zZXQoZSx0KTtmb3IodmFyIGc9aTsrK2E8aDspe3ZhciBwPXRbbD11W2FdXSx3PWVbbF07aWYobyl2YXIgZD1pP28odyxwLGwsZSx0LHMpOm8ocCx3LGwsdCxlLHMpO2lmKCEodm9pZCAwPT09ZD9wPT09d3x8bihwLHcscixvLHMpOmQpKXttPSExO2JyZWFrfWd8fChnPSJjb25zdHJ1Y3RvciI9PWwpfWlmKG0mJiFnKXt2YXIgYj10LmNvbnN0cnVjdG9yLHk9ZS5jb25zdHJ1Y3RvcjtiPT15fHwhKCJjb25zdHJ1Y3RvciJpbiB0KXx8ISgiY29uc3RydWN0b3IiaW4gZSl8fCJmdW5jdGlvbiI9PXR5cGVvZiBiJiZiIGluc3RhbmNlb2YgYiYmImZ1bmN0aW9uIj09dHlwZW9mIHkmJnkgaW5zdGFuY2VvZiB5fHwobT0hMSl9cmV0dXJuIHMuZGVsZXRlKHQpLHMuZGVsZXRlKGUpLG19KGUscixvLG4scyxpKSl9ZnVuY3Rpb24gRW8odCxlLHIsbyxuKXtyZXR1cm4gdD09PWV8fChudWxsPT10fHxudWxsPT1lfHwhZyh0KSYmIWcoZSk/dCE9dCYmZSE9ZTp4byh0LGUscixvLEVvLG4pKX12YXIgU289MSxqbz0yO2Z1bmN0aW9uIF9vKHQpe3JldHVybiB0PT10JiYhdih0KX1mdW5jdGlvbiBBbyh0LGUpe3JldHVybiBmdW5jdGlvbihyKXtyZXR1cm4gbnVsbCE9ciYmKHJbdF09PT1lJiYodm9pZCAwIT09ZXx8dCBpbiBPYmplY3QocikpKX19ZnVuY3Rpb24gT28odCl7dmFyIGU9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPWtyKHQpLHI9ZS5sZW5ndGg7ci0tOyl7dmFyIG89ZVtyXSxuPXRbb107ZVtyXT1bbyxuLF9vKG4pXX1yZXR1cm4gZX0odCk7cmV0dXJuIDE9PWUubGVuZ3RoJiZlWzBdWzJdP0FvKGVbMF1bMF0sZVswXVsxXSk6ZnVuY3Rpb24ocil7cmV0dXJuIHI9PT10fHxmdW5jdGlvbih0LGUscixvKXt2YXIgbj1yLmxlbmd0aCxzPW4saT0hbztpZihudWxsPT10KXJldHVybiFzO2Zvcih0PU9iamVjdCh0KTtuLS07KXt2YXIgdT1yW25dO2lmKGkmJnVbMl0/dVsxXSE9PXRbdVswXV06ISh1WzBdaW4gdCkpcmV0dXJuITF9Zm9yKDsrK248czspe3ZhciBoPSh1PXJbbl0pWzBdLGE9dFtoXSxsPXVbMV07aWYoaSYmdVsyXSl7aWYodm9pZCAwPT09YSYmIShoIGluIHQpKXJldHVybiExfWVsc2V7dmFyIGM9bmV3IFZyO2lmKG8pdmFyIGY9byhhLGwsaCx0LGUsYyk7aWYoISh2b2lkIDA9PT1mP0VvKGwsYSxTb3xqbyxvLGMpOmYpKXJldHVybiExfX1yZXR1cm4hMH0ocix0LGUpfX1mdW5jdGlvbiBSbyh0LGUpe3JldHVybiBudWxsIT10JiZlIGluIE9iamVjdCh0KX1mdW5jdGlvbiBDbyhlLHIpe3JldHVybiBudWxsIT1lJiZmdW5jdGlvbihlLHIsbyl7Zm9yKHZhciBuPS0xLHM9KHI9Y3QocixlKSkubGVuZ3RoLGk9ITE7KytuPHM7KXt2YXIgdT1tdChyW25dKTtpZighKGk9bnVsbCE9ZSYmbyhlLHUpKSlicmVhaztlPWVbdV19cmV0dXJuIGl8fCsrbiE9cz9pOiEhKHM9bnVsbD09ZT8wOmUubGVuZ3RoKSYmVnQocykmJnhyKHUscykmJih0KGUpfHxwcihlKSl9KGUscixSbyl9dmFyIElvPTEsTm89MjtmdW5jdGlvbiBrbyh0KXtyZXR1cm4geSh0KT9EdChtdCh0KSk6ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBndChlLHQpfX0odCl9ZnVuY3Rpb24gRm8oZSl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpudWxsPT1lP1RyOiJvYmplY3QiPT10eXBlb2YgZT90KGUpPyhyPWVbMF0sbz1lWzFdLHkocikmJl9vKG8pP0FvKG10KHIpLG8pOmZ1bmN0aW9uKHQpe3ZhciBlPXB0KHQscik7cmV0dXJuIHZvaWQgMD09PWUmJmU9PT1vP0NvKHQscik6RW8obyxlLElvfE5vKX0pOk9vKGUpOmtvKGUpO3ZhciByLG99ZnVuY3Rpb24gUG8odCxlKXt2YXIgcj0tMSxvPSR0KHQpP0FycmF5KHQubGVuZ3RoKTpbXTtyZXR1cm4gUHIodCwoZnVuY3Rpb24odCxuLHMpe29bKytyXT1lKHQsbixzKX0pKSxvfWZ1bmN0aW9uIFRvKGUscil7cmV0dXJuKHQoZSk/c3Q6UG8pKGUsRm8ocikpfWZ1bmN0aW9uIHpvKHQpe3JldHVybiBudWxsPT10P1tdOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHN0KGUsKGZ1bmN0aW9uKGUpe3JldHVybiB0W2VdfSkpfSh0LGtyKHQpKX1mdW5jdGlvbiBWbyh0LGUpe2lmKCF1ZSh0KSlyZXR1cm57fTtpZighY2UoZSkpcmV0dXJue307bGV0IHI9e307cmV0dXJuIHpyKGUsKGZ1bmN0aW9uKGUpeyhmdW5jdGlvbih0LGUpe3JldHVybiEhdWUodCkmJiEoIWdlKGUpJiYhcGUoZSkpJiZlIGluIHR9KSh0LGUpJiYocltlXT1wdCh0LGUpKX0pKSxyfXZhciAkbz1BcnJheS5wcm90b3R5cGUuam9pbjtmdW5jdGlvbiBxbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwiZGVmYXVsdCIpP3QuZGVmYXVsdDp0fXZhciBEbz17fSxVbz17fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoVW8sIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO2NsYXNzIExve2NvbnN0cnVjdG9yKHQpe3RoaXMuZ2V0Q29zdD0oKT0+dGhpcy5FbGVtZW50cy5tYXAoKHQ9PnQuRGlzdGFuY2VGcm9tTWVkb2lkKSkucmVkdWNlKCgodCxlKT0+dCtlKSwwKSx0aGlzLmZpbmRCZXN0TWVkb2lkSWR4PXQ9PnRoaXMuRWxlbWVudHMubWFwKChlPT50aGlzLmNhbGNDb3N0Rm9yR2l2ZW5FbGVtZW50QXNNZWRvaWQoZSx0KSkpLnJlZHVjZSgoKHQsZSxyLG8pPT5lLkNvc3RJZk1hZGVNZWRvaWQ8b1t0XS5Db3N0SWZNYWRlTWVkb2lkP3I6dCksMCksdGhpcy5jYWxjQ29zdEZvckdpdmVuRWxlbWVudEFzTWVkb2lkPSh0LGUpPT4oe0Nvc3RJZk1hZGVNZWRvaWQ6bmV3IExvKHtFbGVtZW50czp0aGlzLkVsZW1lbnRzLm1hcCgocj0+KHtEaXN0YW5jZUZyb21NZWRvaWQ6ZShyLkVsZW1lbnQsdC5FbGVtZW50KSxFbGVtZW50OnIuRWxlbWVudH0pKSksTWVkb2lkOnQuRWxlbWVudH0pLmdldENvc3QoKSxFbGVtZW50OnR9KSx0aGlzLkVsZW1lbnRzPXQuRWxlbWVudHMsdGhpcy5NZWRvaWQ9dC5NZWRvaWR9fVVvLkNsdXN0ZXI9TG87dmFyIEdvPXt9LEJvPXt9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShCbywiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksQm8uZGlzdGFuY2U9KHQsZSk9PntpZih0Lmxlbmd0aCE9PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigidGhlIGlucHV0cyBtdXN0IGhhdmUgdGhlIHNhbWUgZGltZW5zaW9uIik7Y29uc3Qgcj1BcnJheS5mcm9tKHQua2V5cygpKS5tYXAoKHI9Pk1hdGgucG93KE1hdGguYWJzKHRbcl0tZVtyXSksMikpKS5yZWR1Y2UoKCh0LGUpPT50K2UpLDApO3JldHVybiBNYXRoLnNxcnQocil9O3ZhciBXbz17fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoV28sIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLFdvLmtHdEVsZW1lbnRBcnJMZW5ndGg9ImsgbXVzdCBiZSBsZXNzIHRoYW4gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgaW5wdXQgYXJyYXkiLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShHbywiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7Y29uc3QgS289Qm8sWW89V28sWG89VW87Y2xhc3MgSm97Y29uc3RydWN0b3IodCxlLHIpe3RoaXMuRWxlbWVudHM9dCx0aGlzLks9ZSx0aGlzLkRpc3RhbmNlRm49cix0aGlzLk9wdGltaXNhdGlvbkNvbXBsZXRlZD0hMSx0aGlzLml0ZXJhdGU9KCk9Pnt0aGlzLkl0ZXJhdGlvbkNvdW50KyssdGhpcy5DbHVzdGVyc3x8dGhpcy5hbGxvY2F0ZVRvQ2x1c3RlcnNBcm91bmRDdXJyZW50TWVkb2lkcygpO2NvbnN0IHQ9dGhpcy5NZWRvaWRzLGU9dGhpcy5DbHVzdGVycyxyPXRoaXMuY2FsY3VsYXRlQ3VycmVudENvc3QoKTtsZXQgbz1yO2ZvcihsZXQgdD0wO3Q8dGhpcy5NZWRvaWRzLmxlbmd0aDt0Kyspe2NvbnN0IGU9dD0+MD09PXRoaXMuTWVkb2lkcy5maWx0ZXIoKGU9PjA9PT10aGlzLkRpc3RhbmNlRm4odCxlKSkpLmxlbmd0aDtmb3IoY29uc3QgciBvZiB0aGlzLkVsZW1lbnRzLmZpbHRlcihlKSl7Y29uc3QgZT10aGlzLk1lZG9pZHMuc2xpY2UoKTtlW3RdPXI7Y29uc3Qgbj1uZXcgSm8odGhpcy5FbGVtZW50cy5zbGljZSgpLHRoaXMuSyx0aGlzLkRpc3RhbmNlRm4pO24uTWVkb2lkcz1lLG4uYWxsb2NhdGVUb0NsdXN0ZXJzQXJvdW5kQ3VycmVudE1lZG9pZHMoKTtjb25zdCBzPW4uY2FsY3VsYXRlQ3VycmVudENvc3QoKTtzPG8mJihvPXMsdGhpcy5DbHVzdGVycz1uLkNsdXN0ZXJzLHRoaXMuTWVkb2lkcz1lKX19cmV0dXJuIHRoaXMuY2FsY3VsYXRlQ3VycmVudENvc3QoKTxyfHwodGhpcy5DbHVzdGVycz1lLHRoaXMuTWVkb2lkcz10LHRoaXMuT3B0aW1pc2F0aW9uQ29tcGxldGVkPSEwLCExKX0sdGhpcy5nZXRDbHVzdGVyZWREYXRhPSgpPT4odGhpcy5PcHRpbWlzYXRpb25Db21wbGV0ZWR8fHRoaXMucnVuVG9Db21wbGV0aW9uKCksdGhpcy5DbHVzdGVycy5tYXAoKHQ9PnQuRWxlbWVudHMubWFwKCh0PT50LkVsZW1lbnQpKSkpKSx0aGlzLnJ1blRvQ29tcGxldGlvbj0oKT0+e2Zvcig7dGhpcy5pdGVyYXRlKCk7KTt9LHRoaXMuYWxsb2NhdGVUb0NsdXN0ZXJzQXJvdW5kQ3VycmVudE1lZG9pZHM9KCk9Pnt0aGlzLkNsdXN0ZXJzPW5ldyBBcnJheSx0aGlzLk1lZG9pZHMuZm9yRWFjaCgodD0+e3RoaXMuQ2x1c3RlcnMucHVzaChuZXcgWG8uQ2x1c3Rlcih7RWxlbWVudHM6W10sTWVkb2lkOnR9KSl9KSksdGhpcy5FbGVtZW50cy5mb3JFYWNoKCgodCxlKT0+e2NvbnN0IHI9dGhpcy5maW5kRGlzdGFuY2VzKHRoaXMuQ2x1c3RlcnMubWFwKCh0PT50Lk1lZG9pZCkpLHQpLG89ci5yZWR1Y2UoKCh0LGUscixvKT0+ZTxvW3RdP3I6dCksMCk7dGhpcy5DbHVzdGVyc1tvXS5FbGVtZW50cy5wdXNoKHtEaXN0YW5jZUZyb21NZWRvaWQ6cltvXSxFbGVtZW50OnR9KX0pKX0sdGhpcy5jYWxjdWxhdGVDdXJyZW50Q29zdD0oKT0+dGhpcy5DbHVzdGVycy5tYXAoKHQ9PnQuZ2V0Q29zdCgpKSkucmVkdWNlKCgodCxlKT0+dCtlKSwwKSx0aGlzLmZpbmREaXN0YW5jZXM9KHQsZSk9PnQubWFwKCh0PT50aGlzLkRpc3RhbmNlRm4odCxlKSkpLHRoaXMuc2VsZWN0SW5pdGlhbE1lZG9pZHM9KCk9PntpZih0aGlzLks+PXRoaXMuRWxlbWVudHMubGVuZ3RoKXRocm93IFlvLmtHdEVsZW1lbnRBcnJMZW5ndGg7Y29uc3QgdD1bXSxlPSh0LGUpPT57Zm9yKGNvbnN0IHIgb2YgZSlpZigwPT09dGhpcy5EaXN0YW5jZUZuKHIsdCkpcmV0dXJuITE7cmV0dXJuITB9O2xldCByPTA7Zm9yKDtyPHRoaXMuRWxlbWVudHMubGVuZ3RoJiZ0Lmxlbmd0aDx0aGlzLks7KWUodGhpcy5FbGVtZW50c1tyXSx0KSYmdC5wdXNoKHRoaXMuRWxlbWVudHNbcl0pLHIrKztyZXR1cm4gdH0sdGhpcy5EaXN0YW5jZUZuPXRoaXMuRGlzdGFuY2VGbnx8S28uZGlzdGFuY2UsdGhpcy5NZWRvaWRzPXRoaXMuc2VsZWN0SW5pdGlhbE1lZG9pZHMoKSx0aGlzLkl0ZXJhdGlvbkNvdW50PTB9Z2V0IE9wdGltaXNhdGlvblN0YXJ0ZWQoKXtyZXR1cm4gdGhpcy5JdGVyYXRpb25Db3VudD4wfX1Kby5jbHVzdGVyRWxlbWVudHM9KHQsZSxyKT0+e0pvLmdldEluc3RhbmNlKHQsZSxyKTtyZXR1cm4gbmV3IEFycmF5fSxKby5nZXRJbnN0YW5jZT0odCxlLHIpPT5uZXcgSm8odCxlLHIpLEdvLkNsdXN0ZXJlcj1KbyxmdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe2Zvcih2YXIgciBpbiBlKXQuaGFzT3duUHJvcGVydHkocil8fCh0W3JdPWVbcl0pfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxlKFVvKSxlKEdvKX0oRG8pO3ZhciBabz1xbyhEbyk7ZnVuY3Rpb24gSG8odCl7cmV0dXJuIEhvPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJiJzeW1ib2wiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKHQpe3JldHVybiB0eXBlb2YgdH06ZnVuY3Rpb24odCl7cmV0dXJuIHQmJiJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJnQuY29uc3RydWN0b3I9PT1TeW1ib2wmJnQhPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiB0fSxIbyh0KX1mdW5jdGlvbiBRbyh0KXt2YXIgZT1mdW5jdGlvbih0LGUpe2lmKCJvYmplY3QiIT09SG8odCl8fG51bGw9PT10KXJldHVybiB0O3ZhciByPXRbU3ltYm9sLnRvUHJpbWl0aXZlXTtpZih2b2lkIDAhPT1yKXt2YXIgbz1yLmNhbGwodCxlfHwiZGVmYXVsdCIpO2lmKCJvYmplY3QiIT09SG8obykpcmV0dXJuIG87dGhyb3cgbmV3IFR5cGVFcnJvcigiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS4iKX1yZXR1cm4oInN0cmluZyI9PT1lP1N0cmluZzpOdW1iZXIpKHQpfSh0LCJzdHJpbmciKTtyZXR1cm4ic3ltYm9sIj09PUhvKGUpP2U6U3RyaW5nKGUpfWZ1bmN0aW9uIHRuKHQsZSxyKXtyZXR1cm4oZT1RbyhlKSlpbiB0P09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUse3ZhbHVlOnIsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTp0W2VdPXIsdH1mdW5jdGlvbiBlbih0LGUpe2xldCByPTA7Zm9yKGxldCBvPTA7bzx0Lmxlbmd0aDtvKyspcis9KHRbb10tZVtvXSkqKHRbb10tZVtvXSk7cmV0dXJuIHJ9Y29uc3Qgcm49e2Rpc3RhbmNlRnVuY3Rpb246ZW59O2Z1bmN0aW9uIG9uKHQsZSxyPXJuKXtjb25zdCBvPXIuZGlzdGFuY2VGdW5jdGlvbnx8cm4uZGlzdGFuY2VGdW5jdGlvbixuPXIuc2ltaWxhcml0eUZ1bmN0aW9ufHxybi5zaW1pbGFyaXR5RnVuY3Rpb247bGV0IHM9LTE7aWYoImZ1bmN0aW9uIj09dHlwZW9mIG4pe2xldCByPU51bWJlci5NSU5fVkFMVUU7Zm9yKGxldCBvPTA7bzx0Lmxlbmd0aDtvKyspe2NvbnN0IGk9bihlLHRbb10pO2k+ciYmKHI9aSxzPW8pfX1lbHNle2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBvKXRocm93IG5ldyBFcnJvcigiQSBzaW1pbGFyaXR5IG9yIGRpc3RhbmNlIGZ1bmN0aW9uIGl0J3MgcmVxdWlyZWQiKTt7bGV0IHI9TnVtYmVyLk1BWF9WQUxVRTtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKyl7Y29uc3QgaT1vKGUsdFtuXSk7aTxyJiYocj1pLHM9bil9fX1yZXR1cm4gc31mdW5jdGlvbiBubih0LGUscixvKXtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKylyW25dPW9uKGUsdFtuXSx7ZGlzdGFuY2VGdW5jdGlvbjpvfSk7cmV0dXJuIHJ9Y2xhc3Mgc257Y29uc3RydWN0b3IodCxlLHIsbyxuKXt0aGlzLmNsdXN0ZXJzPXQsdGhpcy5jZW50cm9pZHM9ZSx0aGlzLmNvbnZlcmdlZD1yLHRoaXMuaXRlcmF0aW9ucz1vLHRoaXMuZGlzdGFuY2U9bn1uZWFyZXN0KHQpe2NvbnN0IGU9bmV3IEFycmF5KHQubGVuZ3RoKTtyZXR1cm4gbm4odCx0aGlzLmNlbnRyb2lkcyxlLHRoaXMuZGlzdGFuY2UpfWNvbXB1dGVJbmZvcm1hdGlvbih0KXtsZXQgZT10aGlzLmNlbnRyb2lkcy5tYXAoKHQ9Pih7Y2VudHJvaWQ6dCxlcnJvcjowLHNpemU6MH0pKSk7Zm9yKGxldCByPTA7cjx0Lmxlbmd0aDtyKyspZVt0aGlzLmNsdXN0ZXJzW3JdXS5lcnJvcis9dGhpcy5kaXN0YW5jZSh0W3JdLHRoaXMuY2VudHJvaWRzW3RoaXMuY2x1c3RlcnNbcl1dKSxlW3RoaXMuY2x1c3RlcnNbcl1dLnNpemUrKztmb3IobGV0IHQ9MDt0PHRoaXMuY2VudHJvaWRzLmxlbmd0aDt0Kyspe2xldCByPWVbdF0uZXJyb3I7ZVt0XS5zaXplJiYtMSE9PXI/ci89ZVt0XS5zaXplOmVbdF0uZXJyb3I9LTF9cmV0dXJuIGV9fWZ1bmN0aW9uIHVuKHQsZSl7Y29uc3Qgcj02NTUzNSYodD4+Pj0wKTtyZXR1cm4oKHQtcikqKGU+Pj49MCk+Pj4wKStyKmU+Pj4wfWNsYXNzIGhue2NvbnN0cnVjdG9yKHQ9RGF0ZS5ub3coKSl7dGhpcy5zdGF0ZT1uZXcgVWludDMyQXJyYXkoNCksdGhpcy5pbml0KHQpLHRoaXMucmFuZG9tPXRoaXMuZ2V0RmxvYXQuYmluZCh0aGlzKX1nZXRVaW50MzIoKXtyZXR1cm4gdGhpcy5uZXh0U3RhdGUoKSx0aGlzLnN0YXRlWzNdK3RoaXMuc3RhdGVbMl0+Pj4wfWdldEZsb2F0KCl7cmV0dXJuIDUuOTYwNDY0NDc3NTM5MDYzZS04Kih0aGlzLmdldFVpbnQzMigpPj4+OCl9aW5pdCh0KXtpZighTnVtYmVyLmlzSW50ZWdlcih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJzZWVkIG11c3QgYmUgYW4gaW50ZWdlciIpO3RoaXMuc3RhdGVbMF09dCx0aGlzLnN0YXRlWzFdPTAsdGhpcy5zdGF0ZVsyXT0wLHRoaXMuc3RhdGVbM109MDtmb3IobGV0IHQ9MTt0PDg7dCsrKXRoaXMuc3RhdGVbMyZ0XV49dCt1bigxODEyNDMzMjUzLHRoaXMuc3RhdGVbdC0xJjNdXnRoaXMuc3RhdGVbdC0xJjNdPj4+MzA+Pj4wKT4+PjA7dGhpcy5wZXJpb2RDZXJ0aWZpY2F0aW9uKCk7Zm9yKGxldCB0PTA7dDw4O3QrKyl0aGlzLm5leHRTdGF0ZSgpfXBlcmlvZENlcnRpZmljYXRpb24oKXswPT09dGhpcy5zdGF0ZVswXSYmMD09PXRoaXMuc3RhdGVbMV0mJjA9PT10aGlzLnN0YXRlWzJdJiYwPT09dGhpcy5zdGF0ZVszXSYmKHRoaXMuc3RhdGVbMF09ODgsdGhpcy5zdGF0ZVsxXT04Myx0aGlzLnN0YXRlWzJdPTY1LHRoaXMuc3RhdGVbM109NjgpfW5leHRTdGF0ZSgpe2xldCB0PXRoaXMuc3RhdGVbMF07dF49dDw8MTUsdF49dD4+PjE4LHRePXRoaXMuc3RhdGVbM108PDExLHRoaXMuc3RhdGVbMF09dGhpcy5zdGF0ZVsxXSx0aGlzLnN0YXRlWzFdPXRoaXMuc3RhdGVbMl0sdGhpcy5zdGF0ZVsyXT10aGlzLnN0YXRlWzNdLHRoaXMuc3RhdGVbM109dH19ZnVuY3Rpb24gYW4odCxlPXt9LHI9TWF0aC5yYW5kb20pe2NvbnN0e3NpemU6bz0xLHJlcGxhY2U6bj0hMSxwcm9iYWJpbGl0aWVzOnN9PWU7bGV0IGksdTtpZihpPSJudW1iZXIiPT10eXBlb2YgdD9mdW5jdGlvbih0KXtjb25zdCBlPVtdO2ZvcihsZXQgcj0wO3I8dDtyKyspZS5wdXNoKHIpO3JldHVybiBlfSh0KTp0LnNsaWNlKCkscyl7aWYoIW4pdGhyb3cgbmV3IEVycm9yKCJjaG9pY2Ugd2l0aCBwcm9iYWJpbGl0aWVzIGFuZCBubyByZXBsYWNlbWVudCBpcyBub3QgaW1wbGVtZW50ZWQiKTtpZihzLmxlbmd0aCE9PWkubGVuZ3RoKXRocm93IG5ldyBFcnJvcigidGhlIGxlbmd0aCBvZiBwcm9iYWJpbGl0aWVzIG9wdGlvbiBzaG91bGQgYmUgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBjaG9pY2VzIik7dT1bc1swXV07Zm9yKGxldCB0PTE7dDxzLmxlbmd0aDt0KyspdVt0XT11W3QtMV0rc1t0XTtpZihNYXRoLmFicygxLXVbdS5sZW5ndGgtMV0pPjFlLTgpdGhyb3cgbmV3IEVycm9yKGBwcm9iYWJpbGl0aWVzIHNob3VsZCBzdW0gdG8gMSwgYnV0IGluc3RlYWQgc3VtcyB0byAke3VbdS5sZW5ndGgtMV19YCl9aWYoITE9PT1uJiZvPmkubGVuZ3RoKXRocm93IG5ldyBFcnJvcigic2l6ZSBvcHRpb24gaXMgdG9vIGxhcmdlIik7Y29uc3QgaD1bXTtmb3IobGV0IHQ9MDt0PG87dCsrKXtjb25zdCB0PWxuKGkubGVuZ3RoLHIsdSk7aC5wdXNoKGlbdF0pLG58fGkuc3BsaWNlKHQsMSl9cmV0dXJuIGh9ZnVuY3Rpb24gbG4odCxlLHIpe2NvbnN0IG89ZSgpO2lmKHIpe2xldCB0PTA7Zm9yKDtvPnJbdF07KXQrKztyZXR1cm4gdH1yZXR1cm4gTWF0aC5mbG9vcihvKnQpfWNsYXNzIGNue2NvbnN0cnVjdG9yKHQ9TWF0aC5yYW5kb20pe2lmKCJudW1iZXIiPT10eXBlb2YgdCl7Y29uc3QgZT1uZXcgaG4odCk7dGhpcy5yYW5kb21HZW5lcmF0b3I9ZS5yYW5kb219ZWxzZSB0aGlzLnJhbmRvbUdlbmVyYXRvcj10fWNob2ljZSh0LGUpe3JldHVybiBhbih0LGUsdGhpcy5yYW5kb21HZW5lcmF0b3IpfXJhbmRvbSgpe3JldHVybiB0aGlzLnJhbmRvbUdlbmVyYXRvcigpfXJhbmRJbnQodCxlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9dCx0PTApLHQrTWF0aC5mbG9vcih0aGlzLnJhbmRvbUdlbmVyYXRvcigpKihlLXQpKX1yYW5kb21TYW1wbGUodCl7Y29uc3QgZT1bXTtmb3IobGV0IHI9MDtyPHQ7cisrKWUucHVzaCh0aGlzLnJhbmRvbSgpKTtyZXR1cm4gZX19ZnVuY3Rpb24gZm4odCxlKXt2YXIgcj1PYmplY3Qua2V5cyh0KTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgbz1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHQpO2UmJihvPW8uZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LGUpLmVudW1lcmFibGV9KSkpLHIucHVzaC5hcHBseShyLG8pfXJldHVybiByfWZ1bmN0aW9uIG1uKHQpe2Zvcih2YXIgZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe3ZhciByPW51bGwhPWFyZ3VtZW50c1tlXT9hcmd1bWVudHNbZV06e307ZSUyP2ZuKE9iamVjdChyKSwhMCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dG4odCxlLHJbZV0pfSkpOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHQsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMocikpOmZuKE9iamVjdChyKSkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHIsZSkpfSkpfXJldHVybiB0fWZ1bmN0aW9uIGduKHQsZSl7Y29uc3Qgcj1uZXcgWmUodC5yb3dzLGUucm93cyk7Zm9yKGxldCBvPTA7bzx0LnJvd3M7bysrKWZvcihsZXQgbj0wO248ZS5yb3dzO24rKylyLnNldChvLG4sZW4odC5nZXRSb3cobyksZS5nZXRSb3cobikpKTtyZXR1cm4gcn1mdW5jdGlvbiBwbih0KXtsZXQgZT1bXTtmb3IobGV0IHI9MDtyPHQ7cisrKWUucHVzaChyKTtyZXR1cm4gZX1mdW5jdGlvbiB3bih0KXtsZXQgZT1bdFswXV07Zm9yKGxldCByPTE7cjx0Lmxlbmd0aDtyKyspZVtyXT1lW3ItMV0rdFtyXTtyZXR1cm4gZX1mdW5jdGlvbiBkbih0LGUpe3ZhciByPU9iamVjdC5rZXlzKHQpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciBvPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModCk7ZSYmKG89by5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsZSkuZW51bWVyYWJsZX0pKSksci5wdXNoLmFwcGx5KHIsbyl9cmV0dXJuIHJ9ZnVuY3Rpb24gYm4odCl7Zm9yKHZhciBlPTE7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl7dmFyIHI9bnVsbCE9YXJndW1lbnRzW2VdP2FyZ3VtZW50c1tlXTp7fTtlJTI/ZG4oT2JqZWN0KHIpLCEwKS5mb3JFYWNoKChmdW5jdGlvbihlKXt0bih0LGUscltlXSl9KSk6T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM/T2JqZWN0LmRlZmluZVByb3BlcnRpZXModCxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhyKSk6ZG4oT2JqZWN0KHIpKS5mb3JFYWNoKChmdW5jdGlvbihlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocixlKSl9KSl9cmV0dXJuIHR9Y29uc3QgeW49e21heEl0ZXJhdGlvbnM6MTAwLHRvbGVyYW5jZToxZS02LGluaXRpYWxpemF0aW9uOiJrbWVhbnMrKyIsZGlzdGFuY2VGdW5jdGlvbjplbn07ZnVuY3Rpb24gdm4odCxlLHIsbyxuLHMpe2xldCBpPWZ1bmN0aW9uKHQsZSxyLG8pe2NvbnN0IG49ZVswXS5sZW5ndGg7bGV0IHM9bmV3IEFycmF5KG8pLGk9bmV3IEFycmF5KG8pO2ZvcihsZXQgdD0wO3Q8bzt0Kyspe3NbdF09bmV3IEFycmF5KG4pLGlbdF09MDtmb3IobGV0IGU9MDtlPG47ZSsrKXNbdF1bZV09MH1mb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrKyl7aVtyW3RdXSsrO2ZvcihsZXQgbz0wO288bjtvKyspc1tyW3RdXVtvXSs9ZVt0XVtvXX1mb3IobGV0IGU9MDtlPG87ZSsrKWZvcihsZXQgcj0wO3I8bjtyKyspaVtlXT9zW2VdW3JdLz1pW2VdOnNbZV1bcl09dFtlXVtyXTtyZXR1cm4gc30odCxlLHI9bm4oZSx0LHIsbi5kaXN0YW5jZUZ1bmN0aW9uKSxvKSx1PWZ1bmN0aW9uKHQsZSxyLG8pe2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bisrKWlmKHIodFtuXSxlW25dKT5vKXJldHVybiExO3JldHVybiEwfShpLHQsbi5kaXN0YW5jZUZ1bmN0aW9uLG4udG9sZXJhbmNlKTtyZXR1cm4gbmV3IHNuKHIsaSx1LHMsbi5kaXN0YW5jZUZ1bmN0aW9uKX1mdW5jdGlvbiBNbih0LGUscil7Y29uc3Qgbz1mdW5jdGlvbih0KXtyZXR1cm4gYm4oYm4oe30seW4pLHQpfShyKTshZnVuY3Rpb24odCxlKXtpZihlPD0wfHxlPnQubGVuZ3RofHwhTnVtYmVyLmlzSW50ZWdlcihlKSl0aHJvdyBuZXcgRXJyb3IoIksgc2hvdWxkIGJlIGEgcG9zaXRpdmUgaW50ZWdlciBzbWFsbGVyIHRoYW4gdGhlIG51bWJlciBvZiBwb2ludHMiKX0odCxlKTtsZXQgbj1mdW5jdGlvbih0LGUscil7bGV0IG87aWYoQXJyYXkuaXNBcnJheShyLmluaXRpYWxpemF0aW9uKSl7aWYoci5pbml0aWFsaXphdGlvbi5sZW5ndGghPT1lKXRocm93IG5ldyBFcnJvcigiVGhlIGluaXRpYWwgY2VudGVycyBzaG91bGQgaGF2ZSB0aGUgc2FtZSBsZW5ndGggYXMgSyIpO289ci5pbml0aWFsaXphdGlvbn1lbHNlIHN3aXRjaChyLmluaXRpYWxpemF0aW9uKXtjYXNlImttZWFucysrIjpvPWZ1bmN0aW9uKHQsZSxyPXt9KXtjb25zdCBvPW5ldyBaZSh0KSxuPW8ucm93cyxzPW5ldyBjbihyLnNlZWQpLGk9W10sdT1yLmxvY2FsVHJpYWxzfHwyK01hdGguZmxvb3IoTWF0aC5sb2coZSkpLGg9cy5yYW5kSW50KG4pO2kucHVzaChvLmdldFJvdyhoKSk7bGV0IGE9bmV3IFplKDEsby5yb3dzKTtmb3IobGV0IHQ9MDt0PG8ucm93czt0KyspYS5zZXQoMCx0LGVuKG8uZ2V0Um93KHQpLGlbMF0pKTtsZXQgbD1bd24oYS5nZXRSb3coMCkpXTtjb25zdCBjPTEvbFswXVtuLTFdO2xldCBmPVplLm11bChhLGMpO2ZvcihsZXQgdD0xO3Q8ZTt0Kyspe2NvbnN0IGU9cy5jaG9pY2Uobix7cmVwbGFjZTohMCxzaXplOnUscHJvYmFiaWxpdGllczpmLmdldFJvdygwKX0pLHI9Z24oby5zZWxlY3Rpb24oZSxwbihvLmNvbHVtbnMpKSxvKTtsZXQgaD0xLzAsYz0xLzAsbT1hO2ZvcihsZXQgdD0wO3Q8dTt0Kyspe2NvbnN0IG89WmUubWluKGEsW3IuZ2V0Um93KHQpXSksbj1vLnN1bSgpO248YyYmKGg9ZVt0XSxjPW4sbT1vKX1pW3RdPW8uZ2V0Um93KGgpLGE9bSxsPVt3bihhLmdldFJvdygwKSldLGY9WmUubXVsKGEsMS9sWzBdW24tMV0pfXJldHVybiBpfSh0LGUscik7YnJlYWs7Y2FzZSJyYW5kb20iOm89ZnVuY3Rpb24odCxlLHIpe3JldHVybiBuZXcgY24ocikuY2hvaWNlKHQse3NpemU6ZX0pfSh0LGUsci5zZWVkKTticmVhaztjYXNlIm1vc3REaXN0YW50IjpvPWZ1bmN0aW9uKHQsZSxyLG8pe2NvbnN0IG49bmV3IGNuKG8pO2xldCBzPW5ldyBBcnJheShlKTtpZihzWzBdPU1hdGguZmxvb3Iobi5yYW5kb20oKSp0Lmxlbmd0aCksZT4xKXtsZXQgbz17ZGlzdDotMSxpbmRleDotMX07Zm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDsrK2UpcltzWzBdXVtlXT5vLmRpc3QmJihvLmRpc3Q9cltzWzBdXVtlXSxvLmluZGV4PWUpO2lmKHNbMV09by5pbmRleCxlPjIpZm9yKGxldCBvPTI7bzxlOysrbyl7bGV0IGU9e2Rpc3Q6LTEsaW5kZXg6LTF9O2ZvcihsZXQgbj0wO248dC5sZW5ndGg7KytuKXtsZXQgdD17ZGlzdDpOdW1iZXIuTUFYX1ZBTFVFLGluZGV4Oi0xfTtmb3IobGV0IGU9MDtlPG87KytlKXJbZV1bbl08dC5kaXN0JiYhcy5pbmNsdWRlcyhuKSYmKHQ9e2Rpc3Q6cltlXVtuXSxpbmRleDpufSk7dC5kaXN0IT09TnVtYmVyLk1BWF9WQUxVRSYmdC5kaXN0PmUuZGlzdCYmKGU9bW4oe30sdCkpfXNbb109ZS5pbmRleH19cmV0dXJuIHMubWFwKChlPT50W2VdKSl9KHQsZSxmdW5jdGlvbih0LGUpe2xldCByPW5ldyBBcnJheSh0Lmxlbmd0aCk7Zm9yKGxldCBvPTA7bzx0Lmxlbmd0aDsrK28pZm9yKGxldCBuPW87bjx0Lmxlbmd0aDsrK24pe3Jbb118fChyW29dPW5ldyBBcnJheSh0Lmxlbmd0aCkpLHJbbl18fChyW25dPW5ldyBBcnJheSh0Lmxlbmd0aCkpO2NvbnN0IHM9ZSh0W29dLHRbbl0pO3Jbb11bbl09cyxyW25dW29dPXN9cmV0dXJuIHJ9KHQsci5kaXN0YW5jZUZ1bmN0aW9uKSxyLnNlZWQpO2JyZWFrO2RlZmF1bHQ6IWZ1bmN0aW9uKHQsZSl7dGhyb3cgbmV3IEVycm9yKGAke2V9OiAiJHtTdHJpbmcodCl9ImApfShyLmluaXRpYWxpemF0aW9uLCJVbmtub3duIGluaXRpYWxpemF0aW9uIG1ldGhvZCIpfXJldHVybiBvfSh0LGUsbyk7MD09PW8ubWF4SXRlcmF0aW9ucyYmKG8ubWF4SXRlcmF0aW9ucz1OdW1iZXIuTUFYX1ZBTFVFKTtsZXQgcyxpPW5ldyBBcnJheSh0Lmxlbmd0aCksdT0hMSxoPTA7Zm9yKDshdSYmaDxvLm1heEl0ZXJhdGlvbnM7KXM9dm4obix0LGksZSxvLCsraCksdT1zLmNvbnZlcmdlZCxuPXMuY2VudHJvaWRzO2lmKCFzKXRocm93IG5ldyBFcnJvcigidW5yZWFjaGFibGU6IG5vIGttZWFucyBzdGVwIGV4ZWN1dGVkIik7cmV0dXJuIHN9ZnVuY3Rpb24geG4odCxlKXtsZXQgcj17fTtmdW5jdGlvbiBvKHQpe3ZhciBlLHI7cmV0dXJuIHI9IjoiLG51bGw9PShlPXQpPyIiOiRvLmNhbGwoZSxyKX16cih0LCgodCxlKT0+e2xldCBuPW8odCk7cltuXT1lfSkpO2xldCBuPVpvLkNsdXN0ZXJlci5nZXRJbnN0YW5jZSh0LGUpLmdldENsdXN0ZXJlZERhdGEoKTtyZXR1cm4gbj1UbyhuLCh0PT5Ubyh0LCh0PT57bGV0IGU9byh0KTtyZXR1cm4gcltlXX0pKSkpLG59ZnVuY3Rpb24gRW4odCxlPXt9KXtsZXQgcj1wdChlLCJrTnVtYmVyIik7cj1wZShyKT9OZShyKToyO2xldCBvLG49cHQoZSwibW9kZSIpO2lmKCJrLW1lZG9pZHMiIT09biYmImstbWVhbnMiIT09biYmKG49ImstbWVkb2lkcyIpLCJrLW1lZG9pZHMiPT09bilvPXhuKHQscik7ZWxzZXtpZigiay1tZWFucyIhPT1uKXRocm93IG5ldyBFcnJvcihgaW52YWxpZCBtb2RlWyR7bn1dYCk7bz1mdW5jdGlvbih0LGUpe2xldCByPU1uKHQsZSksbz17fTtyZXR1cm4genIoci5jbHVzdGVycywoKHQsZSk9PntvW3RdfHwob1t0XT1bXSksb1t0XS5wdXNoKGUpfSkpLHpvKG8pfSh0LHIpfXJldHVybiBvfWZ1bmN0aW9uIFNuKHQsZT17fSl7aWYoIWNlKHQpKXRocm93IG5ldyBFcnJvcigiZGF0YSBpcyBub3QgZWZmLiBhcnJheSIpO2xldCByPXB0KGUsImtOdW1iZXIiKTtwZShyKXx8KHI9Mikscj1OZShyKTtsZXQgbz1wdChlLCJuQ29tcE5JUEFMUyIpO3BlKG8pfHwobz0yKSxvPU5lKG8pO2xldCBuPXB0KGUsIm1vZGUiKSxzPSIiLGk9c2UodCksdT0wLGg9MDtpZih6cih0LCh0PT57IWZ1bmN0aW9uKHQpe2lmKHVlKHQpKXtmb3IobGV0IGUgaW4gdClyZXR1cm4hMDtyZXR1cm4hMX1yZXR1cm4hMX0odCk/Y2UodCkmJihoKz0xKTp1Kz0xfSkpLHU9PT1pKXM9Im9iaiI7ZWxzZXtpZihoIT09aSl0aHJvdyBuZXcgRXJyb3IoImRhdGEgaXMgbm90IG9mIHRoZSBzYW1lIHR5cGUiKTtzPSJtYXQifWxldCBhLGw9bnVsbDsib2JqIj09PXM/KGw9ZnVuY3Rpb24odCl7bGV0IGU9e307enIodCwodD0+e3pyKHQsKCh0LHIpPT57ZVtyXXx8KGVbcl09MCksMD09PWVbcl0mJnBlKHQpJiYoZVtyXT0xKSwxIT09ZVtyXXx8cGUodCl8fChlW3JdPS0xKX0pKX0pKTtsZXQgcj1bXTtyZXR1cm4genIoZSwoKHQsZSk9PnsxPT09dCYmci5wdXNoKGUpfSkpLHJ9KHQpLGE9ZnVuY3Rpb24odCxlKXtyZXR1cm4gVG8odCwodD0+em8oVm8odCxlKSkpKX0odCxsKSk6YT10O2xldCBjPXVyKGEse25Db21wTklQQUxTOm99KSxmPUVuKGMse2tOdW1iZXI6cixtb2RlOm59KTtyZXR1cm57a2V5czpsLGdpbmRzOmYsZ21hdDpUbyhmLCh0PT5Ubyh0LCh0PT5jW3RdKSkpKSxnbHRkdDpUbyhmLChlPT5UbyhlLChlPT50W2VdKSkpKX19bGV0IFdDbHVzdGVyPXtQQ0E6YXN5bmMgZnVuY3Rpb24odCxlPXt9KXtyZXR1cm4gdXIodCxlKX0sY2x1c3Rlcjphc3luYyBmdW5jdGlvbih0LGU9e30pe3RyeXtyZXR1cm4gU24odCxlKX1jYXRjaCh0KXtyZXR1cm4gUHJvbWlzZS5yZWplY3QodCl9fX07CgpsZXQgaW5zdGFuY2UgPSBudWxsCmZ1bmN0aW9uIGluaXQoaW5wdXQpewoKICAgIC8vaW5pdAogICAgbGV0IHIKICAgIAogICAgICAgIHIgPSBXQ2x1c3RlciguLi5pbnB1dCkKICAgICAgICAKCiAgICAvL29uCiAgICAKCiAgICAvL3NhdmUKICAgIGluc3RhbmNlID0gcgoKfQoKZnVuY3Rpb24gc2VuZE1lc3NhZ2UoZGF0YSkgewogICAgCiAgICAgICAgcGFyZW50UG9ydC5wb3N0TWVzc2FnZShkYXRhKQogICAgICAgIAp9Cgphc3luYyBmdW5jdGlvbiBydW4oZGF0YSkgewogICAgLy8gY29uc29sZS5sb2coJ2lubmVyIHdvcmtlciBydW4nLGRhdGEpCgogICAgLy9tb2RlCiAgICBsZXQgbW9kZSA9IGRhdGEubW9kZQoKICAgIC8vY2hlY2sKICAgIGlmKG1vZGUgIT09ICdpbml0JyAmJiBtb2RlICE9PSAnY2FsbCcpewogICAgICAgIHJldHVybgogICAgfQoKICAgIC8vaW5pdAogICAgaWYobW9kZSA9PT0gJ2luaXQnKXsKICAgICAgICAKICAgICAgICB0cnl7CgogICAgICAgICAgICAvL3R5cGUKICAgICAgICAgICAgbGV0IHR5cGUgPSBkYXRhLnR5cGUKCiAgICAgICAgICAgIC8vaW5wdXQKICAgICAgICAgICAgbGV0IGlucHV0ID0gZGF0YS5pbnB1dAogICAgCiAgICAgICAgICAgIC8vaW5zdGFuY2UKICAgICAgICAgICAgaWYodHlwZSA9PT0gJ2Z1bmN0aW9uJyl7CiAgICAgICAgICAgICAgICBpbml0KC4uLmlucHV0KQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYodHlwZSA9PT0gJ29iamVjdCcpewogICAgICAgICAgICAgICAgaW5zdGFuY2UgPSBXQ2x1c3RlcgogICAgICAgICAgICB9CgogICAgICAgIH0KICAgICAgICBjYXRjaChlcnIpewogICAgICAgIAogICAgICAgICAgICAvL3NlbmRNZXNzYWdlCiAgICAgICAgICAgIGxldCByZXMgPSB7CiAgICAgICAgICAgICAgICBtb2RlOiAnZW1pdCcsCiAgICAgICAgICAgICAgICBldk5hbWU6ICdlcnJvcicsCiAgICAgICAgICAgICAgICBtc2c6IGVyciwKICAgICAgICAgICAgfQogICAgICAgICAgICBzZW5kTWVzc2FnZShyZXMpCgogICAgICAgIH0KICAgICAgICAgICAgCiAgICB9CgogICAgLy9jaGVjawogICAgaWYobW9kZSA9PT0gJ2NhbGwnKXsKICAgICAgICBsZXQgc3RhdGUgPSAnJwogICAgICAgIGxldCBtc2cgPSBudWxsCgogICAgICAgIHRyeXsKCiAgICAgICAgICAgIC8vZnVuCiAgICAgICAgICAgIGxldCBmdW4gPSBpbnN0YW5jZVtkYXRhLmZ1bl0KCiAgICAgICAgICAgIC8vaW5wdXQKICAgICAgICAgICAgbGV0IGlucHV0ID0gZGF0YS5pbnB1dAoKICAgICAgICAgICAgLy9leGVjCiAgICAgICAgICAgIGF3YWl0IGZ1biguLi5pbnB1dCkKICAgICAgICAgICAgICAgIC50aGVuKChzdWMpID0+IHsKICAgICAgICAgICAgICAgICAgICBzdGF0ZT0nc3VjY2VzcycKICAgICAgICAgICAgICAgICAgICBtc2c9c3VjCiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgLmNhdGNoKChlcnIpID0+IHsKICAgICAgICAgICAgICAgICAgICBzdGF0ZT0nZXJyb3InCiAgICAgICAgICAgICAgICAgICAgbXNnPWVycgogICAgICAgICAgICAgICAgfSkKCiAgICAgICAgfQogICAgICAgIGNhdGNoKGVycil7CiAgICAgICAgICAgIHN0YXRlID0gJ2Vycm9yJwogICAgICAgICAgICBtc2cgPSBlcnIKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLy9zZW5kTWVzc2FnZQogICAgICAgIGxldCByZXMgPSB7CiAgICAgICAgICAgIG1vZGU6ICdyZXR1cm4nLAogICAgICAgICAgICBpZDogZGF0YS5pZCwKICAgICAgICAgICAgZnVuOiBkYXRhLmZ1biwKICAgICAgICAgICAgc3RhdGUsCiAgICAgICAgICAgIG1zZywKICAgICAgICB9CiAgICAgICAgc2VuZE1lc3NhZ2UocmVzKQoKICAgIH0KCn0KCmZ1bmN0aW9uIHJlY3ZNZXNzYWdlKGRhdGEpIHsKICAgIC8vIGNvbnNvbGUubG9nKCdpbm5lciB3b3JrZXIgcmVjdjonLCBkYXRhKQoKICAgIC8vZGF0YVJlY3YKICAgIGxldCBkYXRhUmVjdiA9IGRhdGEKCiAgICAvL3J1bgogICAgcnVuKGRhdGFSZWN2KQoKfQoKCiAgICAgICAgcGFyZW50UG9ydC5vbignbWVzc2FnZScsIHJlY3ZNZXNzYWdlKQogICAgICAgIAoK",Buffer.from(y,"base64").toString("utf8"));var y;function m(){let b=l(),Z=function(l){try{return new d.Worker(l,{eval:!0})}catch(d){y(d)}}(G);if(!Z)return y("invalid worker"),null;function y(d){b.emit("error",d)}return Z.on("message",(function(d){let l=d,Z=l.mode;"emit"!==Z&&"return"!==Z||("emit"===Z&&b.emit(l.evName,l.msg),"return"===Z&&b.emit(l.id,l))})),Z.on("error",y),function(){let d={mode:"init",type:"object",input:[...arguments]};Z.postMessage(d)}([...arguments]),b.PCA=function(){let d=c(),l=X(),G={mode:"call",id:l,fun:"PCA",input:[...arguments]};return Z.postMessage(G),b.once(l,(l=>{"success"===l.state?d.resolve(l.msg):d.reject(l.msg)})),d},b.cluster=function(){let d=c(),l=X(),G={mode:"call",id:l,fun:"cluster",input:[...arguments]};return Z.postMessage(G),b.once(l,(l=>{"success"===l.state?d.resolve(l.msg):d.reject(l.msg)})),d},b.terminate=function(){Z?(Z.terminate(),Z=void 0):y("worker has been terminated")},b}let K={PCA:async function(){let d=[...arguments],l=m();return await l.PCA(...d).finally((()=>{l.terminate()}))},cluster:async function(){let d=[...arguments],l=m();return await l.cluster(...d).finally((()=>{l.terminate()}))}};Z=l();for(let d in K){let l=K[d];Z[d]=l}}(),Z}(d)}({get exports(){return l},set exports(d){l=d}});var b=l,Z={};!function(d,l){d.exports=function(){const d="function"==typeof atob,l="function"==typeof Buffer,b="function"==typeof TextDecoder?new TextDecoder:void 0,Z=(d=>{let l={};return d.forEach(((d,b)=>l[d]=b)),l})(("function"==typeof TextEncoder&&new TextEncoder,Array.prototype.slice.call("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="))),c=/^(?:[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):d=>new Uint8Array(Array.prototype.slice.call(d,0)),y=d=>d.replace(/[^A-Za-z0-9\+\/]/g,""),m=/[\xC0-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF7][\x80-\xBF]{3}/g,K=d=>{switch(d.length){case 4:var l=((7&d.charCodeAt(0))<<18|(63&d.charCodeAt(1))<<12|(63&d.charCodeAt(2))<<6|63&d.charCodeAt(3))-65536;return X(55296+(l>>>10))+X(56320+(1023&l));case 3:return X((15&d.charCodeAt(0))<<12|(63&d.charCodeAt(1))<<6|63&d.charCodeAt(2));default:return X((31&d.charCodeAt(0))<<6|63&d.charCodeAt(1))}},p=d=>d.replace(m,K),W=d=>{if(d=d.replace(/\s+/g,""),!c.test(d))throw new TypeError("malformed base64.");d+="==".slice(2-(3&d.length));let l,b,G,y="";for(let c=0;c<d.length;)l=Z[d.charAt(c++)]<<18|Z[d.charAt(c++)]<<12|(b=Z[d.charAt(c++)])<<6|(G=Z[d.charAt(c++)]),y+=64===b?X(l>>16&255):64===G?X(l>>16&255,l>>8&255):X(l>>16&255,l>>8&255,255&l);return y},I=d?d=>atob(y(d)):l?d=>Buffer.from(d,"base64").toString("binary"):W,V=l?d=>G(Buffer.from(d,"base64")):d=>G(I(d).split("").map((d=>d.charCodeAt(0)))),h=l?d=>Buffer.from(d,"base64").toString("utf8"):b?d=>b.decode(V(d)):d=>p(I(d)),u=d=>y(d.replace(/[-_]/g,(d=>"-"==d?"+":"/"))),i=d=>h(u(d)),H=i;var o={};!function(d){var l=Object.prototype.hasOwnProperty,b="~";function Z(){}function c(d,l,b){this.fn=d,this.context=l,this.once=b||!1}function X(d,l,Z,X,G){if("function"!=typeof Z)throw new TypeError("The listener must be a function");var y=new c(Z,X||d,G),m=b?b+l:l;return d._events[m]?d._events[m].fn?d._events[m]=[d._events[m],y]:d._events[m].push(y):(d._events[m]=y,d._eventsCount++),d}function G(d,l){0==--d._eventsCount?d._events=new Z:delete d._events[l]}function y(){this._events=new Z,this._eventsCount=0}Object.create&&(Z.prototype=Object.create(null),(new Z).__proto__||(b=!1)),y.prototype.eventNames=function(){var d,Z,c=[];if(0===this._eventsCount)return c;for(Z in d=this._events)l.call(d,Z)&&c.push(b?Z.slice(1):Z);return Object.getOwnPropertySymbols?c.concat(Object.getOwnPropertySymbols(d)):c},y.prototype.listeners=function(d){var l=b?b+d:d,Z=this._events[l];if(!Z)return[];if(Z.fn)return[Z.fn];for(var c=0,X=Z.length,G=new Array(X);c<X;c++)G[c]=Z[c].fn;return G},y.prototype.listenerCount=function(d){var l=b?b+d:d,Z=this._events[l];return Z?Z.fn?1:Z.length:0},y.prototype.emit=function(d,l,Z,c,X,G){var y=b?b+d:d;if(!this._events[y])return!1;var m,K,p=this._events[y],W=arguments.length;if(p.fn){switch(p.once&&this.removeListener(d,p.fn,void 0,!0),W){case 1:return p.fn.call(p.context),!0;case 2:return p.fn.call(p.context,l),!0;case 3:return p.fn.call(p.context,l,Z),!0;case 4:return p.fn.call(p.context,l,Z,c),!0;case 5:return p.fn.call(p.context,l,Z,c,X),!0;case 6:return p.fn.call(p.context,l,Z,c,X,G),!0}for(K=1,m=new Array(W-1);K<W;K++)m[K-1]=arguments[K];p.fn.apply(p.context,m)}else{var I,V=p.length;for(K=0;K<V;K++)switch(p[K].once&&this.removeListener(d,p[K].fn,void 0,!0),W){case 1:p[K].fn.call(p[K].context);break;case 2:p[K].fn.call(p[K].context,l);break;case 3:p[K].fn.call(p[K].context,l,Z);break;case 4:p[K].fn.call(p[K].context,l,Z,c);break;default:if(!m)for(I=1,m=new Array(W-1);I<W;I++)m[I-1]=arguments[I];p[K].fn.apply(p[K].context,m)}}return!0},y.prototype.on=function(d,l,b){return X(this,d,l,b,!1)},y.prototype.once=function(d,l,b){return X(this,d,l,b,!0)},y.prototype.removeListener=function(d,l,Z,c){var X=b?b+d:d;if(!this._events[X])return this;if(!l)return G(this,X),this;var y=this._events[X];if(y.fn)y.fn!==l||c&&!y.once||Z&&y.context!==Z||G(this,X);else{for(var m=0,K=[],p=y.length;m<p;m++)(y[m].fn!==l||c&&!y[m].once||Z&&y[m].context!==Z)&&K.push(y[m]);K.length?this._events[X]=1===K.length?K[0]:K:G(this,X)}return this},y.prototype.removeAllListeners=function(d){var l;return d?(l=b?b+d:d,this._events[l]&&G(this,l)):(this._events=new Z,this._eventsCount=0),this},y.prototype.off=y.prototype.removeListener,y.prototype.addListener=y.prototype.on,y.prefixed=b,y.EventEmitter=y,d.exports=y}({get exports(){return o},set exports(d){o=d}});var C=o;let s;return function(){if("browser"!=("undefined"!=typeof window&&void 0!==window.document?"browser":"nodejs"))return null;function d(){return new C}function l(){let d,l,b=new Promise((function(){d=arguments[0],l=arguments[1]}));return b.resolve=d,b.reject=l,b}function b(){let d=arguments.length>0&&void 0!==arguments[0]?arguments[0]:10,l=[],b="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""),Z=b.length;for(let c=0;c<d;c++)l[c]=b[0|Math.random()*Z];return l.join("")}let Z=H("CgoKdmFyIHQ9QXJyYXkuaXNBcnJheSxlPSJvYmplY3QiPT10eXBlb2YgZ2xvYmFsJiZnbG9iYWwmJmdsb2JhbC5PYmplY3Q9PT1PYmplY3QmJmdsb2JhbCxyPSJvYmplY3QiPT10eXBlb2Ygc2VsZiYmc2VsZiYmc2VsZi5PYmplY3Q9PT1PYmplY3QmJnNlbGYsbz1lfHxyfHxGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpLG49by5TeW1ib2wscz1PYmplY3QucHJvdG90eXBlLGk9cy5oYXNPd25Qcm9wZXJ0eSx1PXMudG9TdHJpbmcsaD1uP24udG9TdHJpbmdUYWc6dm9pZCAwO3ZhciBhPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7dmFyIGw9IltvYmplY3QgTnVsbF0iLGM9IltvYmplY3QgVW5kZWZpbmVkXSIsZj1uP24udG9TdHJpbmdUYWc6dm9pZCAwO2Z1bmN0aW9uIG0odCl7cmV0dXJuIG51bGw9PXQ/dm9pZCAwPT09dD9jOmw6ZiYmZiBpbiBPYmplY3QodCk/ZnVuY3Rpb24odCl7dmFyIGU9aS5jYWxsKHQsaCkscj10W2hdO3RyeXt0W2hdPXZvaWQgMDt2YXIgbz0hMH1jYXRjaCh0KXt9dmFyIG49dS5jYWxsKHQpO3JldHVybiBvJiYoZT90W2hdPXI6ZGVsZXRlIHRbaF0pLG59KHQpOmZ1bmN0aW9uKHQpe3JldHVybiBhLmNhbGwodCl9KHQpfWZ1bmN0aW9uIGcodCl7cmV0dXJuIG51bGwhPXQmJiJvYmplY3QiPT10eXBlb2YgdH12YXIgcD0iW29iamVjdCBTeW1ib2xdIjtmdW5jdGlvbiB3KHQpe3JldHVybiJzeW1ib2wiPT10eXBlb2YgdHx8Zyh0KSYmbSh0KT09cH12YXIgZD0vXC58XFsoPzpbXltcXV0qfChbIiddKSg/Oig/IVwxKVteXFxdfFxcLikqP1wxKVxdLyxiPS9eXHcqJC87ZnVuY3Rpb24geShlLHIpe2lmKHQoZSkpcmV0dXJuITE7dmFyIG89dHlwZW9mIGU7cmV0dXJuISgibnVtYmVyIiE9byYmInN5bWJvbCIhPW8mJiJib29sZWFuIiE9byYmbnVsbCE9ZSYmIXcoZSkpfHwoYi50ZXN0KGUpfHwhZC50ZXN0KGUpfHxudWxsIT1yJiZlIGluIE9iamVjdChyKSl9ZnVuY3Rpb24gdih0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4gbnVsbCE9dCYmKCJvYmplY3QiPT1lfHwiZnVuY3Rpb24iPT1lKX12YXIgTT0iW29iamVjdCBBc3luY0Z1bmN0aW9uXSIseD0iW29iamVjdCBGdW5jdGlvbl0iLEU9IltvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dIixTPSJbb2JqZWN0IFByb3h5XSI7ZnVuY3Rpb24gaih0KXtpZighdih0KSlyZXR1cm4hMTt2YXIgZT1tKHQpO3JldHVybiBlPT14fHxlPT1FfHxlPT1NfHxlPT1TfXZhciBfLEE9b1siX19jb3JlLWpzX3NoYXJlZF9fIl0sTz0oXz0vW14uXSskLy5leGVjKEEmJkEua2V5cyYmQS5rZXlzLklFX1BST1RPfHwiIikpPyJTeW1ib2woc3JjKV8xLiIrXzoiIjt2YXIgUj1GdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmc7ZnVuY3Rpb24gQyh0KXtpZihudWxsIT10KXt0cnl7cmV0dXJuIFIuY2FsbCh0KX1jYXRjaCh0KXt9dHJ5e3JldHVybiB0KyIifWNhdGNoKHQpe319cmV0dXJuIiJ9dmFyIEk9L15cW29iamVjdCAuKz9Db25zdHJ1Y3RvclxdJC8sTj1GdW5jdGlvbi5wcm90b3R5cGUsaz1PYmplY3QucHJvdG90eXBlLEY9Ti50b1N0cmluZyxQPWsuaGFzT3duUHJvcGVydHksVD1SZWdFeHAoIl4iK0YuY2FsbChQKS5yZXBsYWNlKC9bXFxeJC4qKz8oKVtcXXt9fF0vZywiXFwkJiIpLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFwoKXwgZm9yIC4rPyg/PVxcXF0pL2csIiQxLio/IikrIiQiKTtmdW5jdGlvbiB6KHQpe3JldHVybiEoIXYodCl8fChlPXQsTyYmTyBpbiBlKSkmJihqKHQpP1Q6SSkudGVzdChDKHQpKTt2YXIgZX1mdW5jdGlvbiBWKHQsZSl7dmFyIHI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09dD92b2lkIDA6dFtlXX0odCxlKTtyZXR1cm4geihyKT9yOnZvaWQgMH12YXIgJD1WKE9iamVjdCwiY3JlYXRlIik7dmFyIHE9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt2YXIgRD1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIFUodCl7dmFyIGU9LTEscj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8cjspe3ZhciBvPXRbZV07dGhpcy5zZXQob1swXSxvWzFdKX19ZnVuY3Rpb24gTCh0LGUpe3JldHVybiB0PT09ZXx8dCE9dCYmZSE9ZX1mdW5jdGlvbiBHKHQsZSl7Zm9yKHZhciByPXQubGVuZ3RoO3ItLTspaWYoTCh0W3JdWzBdLGUpKXJldHVybiByO3JldHVybi0xfVUucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5fX2RhdGFfXz0kPyQobnVsbCk6e30sdGhpcy5zaXplPTB9LFUucHJvdG90eXBlLmRlbGV0ZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmhhcyh0KSYmZGVsZXRlIHRoaXMuX19kYXRhX19bdF07cmV0dXJuIHRoaXMuc2l6ZS09ZT8xOjAsZX0sVS5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX19kYXRhX187aWYoJCl7dmFyIHI9ZVt0XTtyZXR1cm4iX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyI9PT1yP3ZvaWQgMDpyfXJldHVybiBxLmNhbGwoZSx0KT9lW3RdOnZvaWQgMH0sVS5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX19kYXRhX187cmV0dXJuICQ/dm9pZCAwIT09ZVt0XTpELmNhbGwoZSx0KX0sVS5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5fX2RhdGFfXztyZXR1cm4gdGhpcy5zaXplKz10aGlzLmhhcyh0KT8wOjEsclt0XT0kJiZ2b2lkIDA9PT1lPyJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIjplLHRoaXN9O3ZhciBCPUFycmF5LnByb3RvdHlwZS5zcGxpY2U7ZnVuY3Rpb24gVyh0KXt2YXIgZT0tMSxyPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxyOyl7dmFyIG89dFtlXTt0aGlzLnNldChvWzBdLG9bMV0pfX1XLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuX19kYXRhX189W10sdGhpcy5zaXplPTB9LFcucHJvdG90eXBlLmRlbGV0ZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fLHI9RyhlLHQpO3JldHVybiEocjwwKSYmKHI9PWUubGVuZ3RoLTE/ZS5wb3AoKTpCLmNhbGwoZSxyLDEpLC0tdGhpcy5zaXplLCEwKX0sVy5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX19kYXRhX18scj1HKGUsdCk7cmV0dXJuIHI8MD92b2lkIDA6ZVtyXVsxXX0sVy5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKHQpe3JldHVybiBHKHRoaXMuX19kYXRhX18sdCk+LTF9LFcucHJvdG90eXBlLnNldD1mdW5jdGlvbih0LGUpe3ZhciByPXRoaXMuX19kYXRhX18sbz1HKHIsdCk7cmV0dXJuIG88MD8oKyt0aGlzLnNpemUsci5wdXNoKFt0LGVdKSk6cltvXVsxXT1lLHRoaXN9O3ZhciBLPVYobywiTWFwIik7ZnVuY3Rpb24gWSh0LGUpe3ZhciByLG8sbj10Ll9fZGF0YV9fO3JldHVybigic3RyaW5nIj09KG89dHlwZW9mKHI9ZSkpfHwibnVtYmVyIj09b3x8InN5bWJvbCI9PW98fCJib29sZWFuIj09bz8iX19wcm90b19fIiE9PXI6bnVsbD09PXIpP25bInN0cmluZyI9PXR5cGVvZiBlPyJzdHJpbmciOiJoYXNoIl06bi5tYXB9ZnVuY3Rpb24gWCh0KXt2YXIgZT0tMSxyPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxyOyl7dmFyIG89dFtlXTt0aGlzLnNldChvWzBdLG9bMV0pfX1YLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuc2l6ZT0wLHRoaXMuX19kYXRhX189e2hhc2g6bmV3IFUsbWFwOm5ldyhLfHxXKSxzdHJpbmc6bmV3IFV9fSxYLnByb3RvdHlwZS5kZWxldGU9ZnVuY3Rpb24odCl7dmFyIGU9WSh0aGlzLHQpLmRlbGV0ZSh0KTtyZXR1cm4gdGhpcy5zaXplLT1lPzE6MCxlfSxYLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIFkodGhpcyx0KS5nZXQodCl9LFgucHJvdG90eXBlLmhhcz1mdW5jdGlvbih0KXtyZXR1cm4gWSh0aGlzLHQpLmhhcyh0KX0sWC5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQsZSl7dmFyIHI9WSh0aGlzLHQpLG89ci5zaXplO3JldHVybiByLnNldCh0LGUpLHRoaXMuc2l6ZSs9ci5zaXplPT1vPzA6MSx0aGlzfTt2YXIgSj0iRXhwZWN0ZWQgYSBmdW5jdGlvbiI7ZnVuY3Rpb24gWih0LGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0fHxudWxsIT1lJiYiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKEopO3ZhciByPWZ1bmN0aW9uKCl7dmFyIG89YXJndW1lbnRzLG49ZT9lLmFwcGx5KHRoaXMsbyk6b1swXSxzPXIuY2FjaGU7aWYocy5oYXMobikpcmV0dXJuIHMuZ2V0KG4pO3ZhciBpPXQuYXBwbHkodGhpcyxvKTtyZXR1cm4gci5jYWNoZT1zLnNldChuLGkpfHxzLGl9O3JldHVybiByLmNhY2hlPW5ldyhaLkNhY2hlfHxYKSxyfVouQ2FjaGU9WDt2YXIgSCxRLHR0LGV0PS9bXi5bXF1dK3xcWyg/OigtP1xkKyg/OlwuXGQrKT8pfChbIiddKSgoPzooPyFcMilbXlxcXXxcXC4pKj8pXDIpXF18KD89KD86XC58XFtcXSkoPzpcLnxcW1xdfCQpKS9nLHJ0PS9cXChcXCk/L2csb3Q9KEg9ZnVuY3Rpb24odCl7dmFyIGU9W107cmV0dXJuIDQ2PT09dC5jaGFyQ29kZUF0KDApJiZlLnB1c2goIiIpLHQucmVwbGFjZShldCwoZnVuY3Rpb24odCxyLG8sbil7ZS5wdXNoKG8/bi5yZXBsYWNlKHJ0LCIkMSIpOnJ8fHQpfSkpLGV9LFE9WihILChmdW5jdGlvbih0KXtyZXR1cm4gNTAwPT09dHQuc2l6ZSYmdHQuY2xlYXIoKSx0fSkpLHR0PVEuY2FjaGUsUSksbnQ9b3Q7ZnVuY3Rpb24gc3QodCxlKXtmb3IodmFyIHI9LTEsbz1udWxsPT10PzA6dC5sZW5ndGgsbj1BcnJheShvKTsrK3I8bzspbltyXT1lKHRbcl0scix0KTtyZXR1cm4gbn12YXIgaXQ9MS8wLHV0PW4/bi5wcm90b3R5cGU6dm9pZCAwLGh0PXV0P3V0LnRvU3RyaW5nOnZvaWQgMDtmdW5jdGlvbiBhdChlKXtpZigic3RyaW5nIj09dHlwZW9mIGUpcmV0dXJuIGU7aWYodChlKSlyZXR1cm4gc3QoZSxhdCkrIiI7aWYodyhlKSlyZXR1cm4gaHQ/aHQuY2FsbChlKToiIjt2YXIgcj1lKyIiO3JldHVybiIwIj09ciYmMS9lPT0taXQ/Ii0wIjpyfWZ1bmN0aW9uIGx0KHQpe3JldHVybiBudWxsPT10PyIiOmF0KHQpfWZ1bmN0aW9uIGN0KGUscil7cmV0dXJuIHQoZSk/ZTp5KGUscik/W2VdOm50KGx0KGUpKX12YXIgZnQ9MS8wO2Z1bmN0aW9uIG10KHQpe2lmKCJzdHJpbmciPT10eXBlb2YgdHx8dyh0KSlyZXR1cm4gdDt2YXIgZT10KyIiO3JldHVybiIwIj09ZSYmMS90PT0tZnQ/Ii0wIjplfWZ1bmN0aW9uIGd0KHQsZSl7Zm9yKHZhciByPTAsbz0oZT1jdChlLHQpKS5sZW5ndGg7bnVsbCE9dCYmcjxvOyl0PXRbbXQoZVtyKytdKV07cmV0dXJuIHImJnI9PW8/dDp2b2lkIDB9ZnVuY3Rpb24gcHQodCxlLHIpe3ZhciBvPW51bGw9PXQ/dm9pZCAwOmd0KHQsZSk7cmV0dXJuIHZvaWQgMD09PW8/cjpvfXZhciB3dD1PYmplY3QucHJvdG90eXBlO3ZhciBkdD1mdW5jdGlvbih0LGUpe3JldHVybiBmdW5jdGlvbihyKXtyZXR1cm4gdChlKHIpKX19KE9iamVjdC5rZXlzLE9iamVjdCksYnQ9ZHQseXQ9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiB2dCh0KXtpZihyPShlPXQpJiZlLmNvbnN0cnVjdG9yLGUhPT0oImZ1bmN0aW9uIj09dHlwZW9mIHImJnIucHJvdG90eXBlfHx3dCkpcmV0dXJuIGJ0KHQpO3ZhciBlLHIsbz1bXTtmb3IodmFyIG4gaW4gT2JqZWN0KHQpKXl0LmNhbGwodCxuKSYmImNvbnN0cnVjdG9yIiE9biYmby5wdXNoKG4pO3JldHVybiBvfXZhciBNdD1WKG8sIkRhdGFWaWV3IikseHQ9VihvLCJQcm9taXNlIiksRXQ9VihvLCJTZXQiKSxTdD1WKG8sIldlYWtNYXAiKSxqdD0iW29iamVjdCBNYXBdIixfdD0iW29iamVjdCBQcm9taXNlXSIsQXQ9IltvYmplY3QgU2V0XSIsT3Q9IltvYmplY3QgV2Vha01hcF0iLFJ0PSJbb2JqZWN0IERhdGFWaWV3XSIsQ3Q9QyhNdCksSXQ9QyhLKSxOdD1DKHh0KSxrdD1DKEV0KSxGdD1DKFN0KSxQdD1tOyhNdCYmUHQobmV3IE10KG5ldyBBcnJheUJ1ZmZlcigxKSkpIT1SdHx8SyYmUHQobmV3IEspIT1qdHx8eHQmJlB0KHh0LnJlc29sdmUoKSkhPV90fHxFdCYmUHQobmV3IEV0KSE9QXR8fFN0JiZQdChuZXcgU3QpIT1PdCkmJihQdD1mdW5jdGlvbih0KXt2YXIgZT1tKHQpLHI9IltvYmplY3QgT2JqZWN0XSI9PWU/dC5jb25zdHJ1Y3Rvcjp2b2lkIDAsbz1yP0Mocik6IiI7aWYobylzd2l0Y2gobyl7Y2FzZSBDdDpyZXR1cm4gUnQ7Y2FzZSBJdDpyZXR1cm4ganQ7Y2FzZSBOdDpyZXR1cm4gX3Q7Y2FzZSBrdDpyZXR1cm4gQXQ7Y2FzZSBGdDpyZXR1cm4gT3R9cmV0dXJuIGV9KTt2YXIgVHQ9UHQsenQ9OTAwNzE5OTI1NDc0MDk5MTtmdW5jdGlvbiBWdCh0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQmJnQ+LTEmJnQlMT09MCYmdDw9enR9ZnVuY3Rpb24gJHQodCl7cmV0dXJuIG51bGwhPXQmJlZ0KHQubGVuZ3RoKSYmIWoodCl9dmFyIHF0PSJbb2JqZWN0IFN0cmluZ10iO2Z1bmN0aW9uIER0KHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZT92b2lkIDA6ZVt0XX19dmFyIFV0PUR0KCJsZW5ndGgiKSxMdD1SZWdFeHAoIltcXHUyMDBkXFx1ZDgwMC1cXHVkZmZmXFx1MDMwMC1cXHUwMzZmXFx1ZmUyMC1cXHVmZTJmXFx1MjBkMC1cXHUyMGZmXFx1ZmUwZVxcdWZlMGZdIik7dmFyIEd0PSJcXHVkODAwLVxcdWRmZmYiLEJ0PSJbIitHdCsiXSIsV3Q9IltcXHUwMzAwLVxcdTAzNmZcXHVmZTIwLVxcdWZlMmZcXHUyMGQwLVxcdTIwZmZdIixLdD0iXFx1ZDgzY1tcXHVkZmZiLVxcdWRmZmZdIixZdD0iW14iK0d0KyJdIixYdD0iKD86XFx1ZDgzY1tcXHVkZGU2LVxcdWRkZmZdKXsyfSIsSnQ9IltcXHVkODAwLVxcdWRiZmZdW1xcdWRjMDAtXFx1ZGZmZl0iLFp0PSIoPzoiK1d0KyJ8IitLdCsiKSIrIj8iLEh0PSJbXFx1ZmUwZVxcdWZlMGZdPyIsUXQ9SHQrWnQrKCIoPzpcXHUyMDBkKD86IitbWXQsWHQsSnRdLmpvaW4oInwiKSsiKSIrSHQrWnQrIikqIiksdGU9Iig/OiIrW1l0K1d0KyI/IixXdCxYdCxKdCxCdF0uam9pbigifCIpKyIpIixlZT1SZWdFeHAoS3QrIig/PSIrS3QrIil8Iit0ZStRdCwiZyIpO2Z1bmN0aW9uIHJlKHQpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gTHQudGVzdCh0KX0odCk/ZnVuY3Rpb24odCl7Zm9yKHZhciBlPWVlLmxhc3RJbmRleD0wO2VlLnRlc3QodCk7KSsrZTtyZXR1cm4gZX0odCk6VXQodCl9dmFyIG9lPSJbb2JqZWN0IE1hcF0iLG5lPSJbb2JqZWN0IFNldF0iO2Z1bmN0aW9uIHNlKGUpe2lmKG51bGw9PWUpcmV0dXJuIDA7aWYoJHQoZSkpcmV0dXJuInN0cmluZyI9PXR5cGVvZihyPWUpfHwhdChyKSYmZyhyKSYmbShyKT09cXQ/cmUoZSk6ZS5sZW5ndGg7dmFyIHIsbz1UdChlKTtyZXR1cm4gbz09b2V8fG89PW5lP2Uuc2l6ZTp2dChlKS5sZW5ndGh9ZnVuY3Rpb24gaWUodCl7cmV0dXJuIltvYmplY3QgQXJyYXldIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiB1ZSh0KXtyZXR1cm4iW29iamVjdCBPYmplY3RdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiBoZSh0KXtyZXR1cm4iW29iamVjdCBTdHJpbmddIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiBhZSh0KXtyZXR1cm4gdCE9dH1mdW5jdGlvbiBsZSh0KXtyZXR1cm4hIWZ1bmN0aW9uKHQpe3JldHVybiJbb2JqZWN0IFVuZGVmaW5lZF0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfSh0KXx8KCEhZnVuY3Rpb24odCl7cmV0dXJuIltvYmplY3QgTnVsbF0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfSh0KXx8KCEhZnVuY3Rpb24odCl7aWYodWUodCkpe2ZvcihsZXQgZSBpbiB0KXJldHVybiExO3JldHVybiEwfXJldHVybiExfSh0KXx8KCEhZnVuY3Rpb24odCl7cmV0dXJuISghaGUodCl8fCIiIT09dCl9KHQpfHwoISFmdW5jdGlvbih0KXtyZXR1cm4hIWllKHQpJiYwPT09dC5sZW5ndGh9KHQpfHwhIWFlKHQpKSkpKX1mdW5jdGlvbiBjZSh0KXtyZXR1cm4hIWllKHQpJiYoMCE9PXQubGVuZ3RoJiYoMSE9PXQubGVuZ3RofHwhbGUodFswXSkpKX12YXIgZmU9IltvYmplY3QgQm9vbGVhbl0iO2Z1bmN0aW9uIG1lKHQpe3JldHVybiEwPT09KGU9dCl8fCExPT09ZXx8ZyhlKSYmbShlKT09ZmU7dmFyIGV9ZnVuY3Rpb24gZ2UodCl7cmV0dXJuISghaGUodCl8fCIiPT09dCl9ZnVuY3Rpb24gcGUodCl7bGV0IGU9ITE7aWYoZ2UodCkpZT0haXNOYU4oTnVtYmVyKHQpKTtlbHNlIGlmKGZ1bmN0aW9uKHQpe3JldHVybiJbb2JqZWN0IE51bWJlcl0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfSh0KSl7aWYoYWUodCkpcmV0dXJuITE7ZT0hMH1yZXR1cm4gZX12YXIgd2U9L1xzLzt2YXIgZGU9L15ccysvO2Z1bmN0aW9uIGJlKHQpe3JldHVybiB0P3Quc2xpY2UoMCxmdW5jdGlvbih0KXtmb3IodmFyIGU9dC5sZW5ndGg7ZS0tJiZ3ZS50ZXN0KHQuY2hhckF0KGUpKTspO3JldHVybiBlfSh0KSsxKS5yZXBsYWNlKGRlLCIiKTp0fXZhciB5ZT1OYU4sdmU9L15bLStdMHhbMC05YS1mXSskL2ksTWU9L14wYlswMV0rJC9pLHhlPS9eMG9bMC03XSskL2ksRWU9cGFyc2VJbnQ7ZnVuY3Rpb24gU2UodCl7aWYoIm51bWJlciI9PXR5cGVvZiB0KXJldHVybiB0O2lmKHcodCkpcmV0dXJuIHllO2lmKHYodCkpe3ZhciBlPSJmdW5jdGlvbiI9PXR5cGVvZiB0LnZhbHVlT2Y/dC52YWx1ZU9mKCk6dDt0PXYoZSk/ZSsiIjplfWlmKCJzdHJpbmciIT10eXBlb2YgdClyZXR1cm4gMD09PXQ/dDordDt0PWJlKHQpO3ZhciByPU1lLnRlc3QodCk7cmV0dXJuIHJ8fHhlLnRlc3QodCk/RWUodC5zbGljZSgyKSxyPzI6OCk6dmUudGVzdCh0KT95ZTordH12YXIgamU9MS8wLF9lPTE3OTc2OTMxMzQ4NjIzMTU3ZTI5MjtmdW5jdGlvbiBBZSh0KXtyZXR1cm4gdD8odD1TZSh0KSk9PT1qZXx8dD09PS1qZT8odDwwPy0xOjEpKl9lOnQ9PXQ/dDowOjA9PT10P3Q6MH12YXIgT2U9by5pc0Zpbml0ZSxSZT1NYXRoLm1pbjt2YXIgQ2U9ZnVuY3Rpb24odCl7dmFyIGU9TWF0aFt0XTtyZXR1cm4gZnVuY3Rpb24odCxyKXtpZih0PVNlKHQpLHI9bnVsbD09cj8wOlJlKGZ1bmN0aW9uKHQpe3ZhciBlPUFlKHQpLHI9ZSUxO3JldHVybiBlPT1lP3I/ZS1yOmU6MH0ociksMjkyKSxyJiZPZSh0KSl7dmFyIG89KGx0KHQpKyJlIikuc3BsaXQoImUiKTtyZXR1cm4rKChvPShsdChlKG9bMF0rImUiKygrb1sxXStyKSkpKyJlIikuc3BsaXQoImUiKSlbMF0rImUiKygrb1sxXS1yKSl9cmV0dXJuIGUodCl9fSgicm91bmQiKSxJZT1DZTtmdW5jdGlvbiBOZSh0KXtpZighcGUodCkpcmV0dXJuIDA7dD1mdW5jdGlvbih0KXtyZXR1cm4gcGUodCk/QWUodCk6MH0odCk7bGV0IGU9SWUodCk7cmV0dXJuIjAiPT09U3RyaW5nKGUpPzA6ZX1jb25zdCBrZT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO2Z1bmN0aW9uIEZlKHQpe3JldHVybiBrZS5jYWxsKHQpLmVuZHNXaXRoKCJBcnJheV0iKX1mdW5jdGlvbiBQZSh0KXt2YXIgZSxyPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fTtpZighRmUodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiaW5wdXQgbXVzdCBiZSBhbiBhcnJheSIpO2lmKDA9PT10Lmxlbmd0aCl0aHJvdyBuZXcgVHlwZUVycm9yKCJpbnB1dCBtdXN0IG5vdCBiZSBlbXB0eSIpO2lmKHZvaWQgMCE9PXIub3V0cHV0KXtpZighRmUoci5vdXRwdXQpKXRocm93IG5ldyBUeXBlRXJyb3IoIm91dHB1dCBvcHRpb24gbXVzdCBiZSBhbiBhcnJheSBpZiBzcGVjaWZpZWQiKTtlPXIub3V0cHV0fWVsc2UgZT1uZXcgQXJyYXkodC5sZW5ndGgpO3ZhciBvPWZ1bmN0aW9uKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fTtpZighRmUodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiaW5wdXQgbXVzdCBiZSBhbiBhcnJheSIpO2lmKDA9PT10Lmxlbmd0aCl0aHJvdyBuZXcgVHlwZUVycm9yKCJpbnB1dCBtdXN0IG5vdCBiZSBlbXB0eSIpO3ZhciByPWUuZnJvbUluZGV4LG89dm9pZCAwPT09cj8wOnIsbj1lLnRvSW5kZXgscz12b2lkIDA9PT1uP3QubGVuZ3RoOm47aWYobzwwfHxvPj10Lmxlbmd0aHx8IU51bWJlci5pc0ludGVnZXIobykpdGhyb3cgbmV3IEVycm9yKCJmcm9tSW5kZXggbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgc21hbGxlciB0aGFuIGxlbmd0aCIpO2lmKHM8PW98fHM+dC5sZW5ndGh8fCFOdW1iZXIuaXNJbnRlZ2VyKHMpKXRocm93IG5ldyBFcnJvcigidG9JbmRleCBtdXN0IGJlIGFuIGludGVnZXIgZ3JlYXRlciB0aGFuIGZyb21JbmRleCBhbmQgYXQgbW9zdCBlcXVhbCB0byBsZW5ndGgiKTtmb3IodmFyIGk9dFtvXSx1PW8rMTt1PHM7dSsrKXRbdV08aSYmKGk9dFt1XSk7cmV0dXJuIGl9KHQpLG49ZnVuY3Rpb24odCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9O2lmKCFGZSh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJpbnB1dCBtdXN0IGJlIGFuIGFycmF5Iik7aWYoMD09PXQubGVuZ3RoKXRocm93IG5ldyBUeXBlRXJyb3IoImlucHV0IG11c3Qgbm90IGJlIGVtcHR5Iik7dmFyIHI9ZS5mcm9tSW5kZXgsbz12b2lkIDA9PT1yPzA6cixuPWUudG9JbmRleCxzPXZvaWQgMD09PW4/dC5sZW5ndGg6bjtpZihvPDB8fG8+PXQubGVuZ3RofHwhTnVtYmVyLmlzSW50ZWdlcihvKSl0aHJvdyBuZXcgRXJyb3IoImZyb21JbmRleCBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciBzbWFsbGVyIHRoYW4gbGVuZ3RoIik7aWYoczw9b3x8cz50Lmxlbmd0aHx8IU51bWJlci5pc0ludGVnZXIocykpdGhyb3cgbmV3IEVycm9yKCJ0b0luZGV4IG11c3QgYmUgYW4gaW50ZWdlciBncmVhdGVyIHRoYW4gZnJvbUluZGV4IGFuZCBhdCBtb3N0IGVxdWFsIHRvIGxlbmd0aCIpO2Zvcih2YXIgaT10W29dLHU9bysxO3U8czt1KyspdFt1XT5pJiYoaT10W3VdKTtyZXR1cm4gaX0odCk7aWYobz09PW4pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm1pbmltdW0gYW5kIG1heGltdW0gaW5wdXQgdmFsdWVzIGFyZSBlcXVhbC4gQ2Fubm90IHJlc2NhbGUgYSBjb25zdGFudCBhcnJheSIpO3ZhciBzPXIubWluLGk9dm9pZCAwPT09cz9yLmF1dG9NaW5NYXg/bzowOnMsdT1yLm1heCxoPXZvaWQgMD09PXU/ci5hdXRvTWluTWF4P246MTp1O2lmKGk+PWgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm1pbiBvcHRpb24gbXVzdCBiZSBzbWFsbGVyIHRoYW4gbWF4IG9wdGlvbiIpO2Zvcih2YXIgYT0oaC1pKS8obi1vKSxsPTA7bDx0Lmxlbmd0aDtsKyspZVtsXT0odFtsXS1vKSphK2k7cmV0dXJuIGV9Y29uc3QgVGU9IiAiLnJlcGVhdCgyKSx6ZT0iICIucmVwZWF0KDQpO2Z1bmN0aW9uIFZlKHQsZT17fSl7Y29uc3R7bWF4Um93czpyPTE1LG1heENvbHVtbnM6bz0xMCxtYXhOdW1TaXplOm49OCxwYWRNaW51czpzPSJhdXRvIn09ZTtyZXR1cm5gJHt0LmNvbnN0cnVjdG9yLm5hbWV9IHtcbiR7VGV9W1xuJHt6ZX0ke2Z1bmN0aW9uKHQsZSxyLG8sbil7Y29uc3R7cm93czpzLGNvbHVtbnM6aX09dCx1PU1hdGgubWluKHMsZSksaD1NYXRoLm1pbihpLHIpLGE9W107aWYoImF1dG8iPT09bil7bj0hMTt0OmZvcihsZXQgZT0wO2U8dTtlKyspZm9yKGxldCByPTA7cjxoO3IrKylpZih0LmdldChlLHIpPDApe249ITA7YnJlYWsgdH19Zm9yKGxldCBlPTA7ZTx1O2UrKyl7bGV0IHI9W107Zm9yKGxldCBzPTA7czxoO3MrKylyLnB1c2goJGUodC5nZXQoZSxzKSxvLG4pKTthLnB1c2goYCR7ci5qb2luKCIgIil9YCl9aCE9PWkmJihhW2EubGVuZ3RoLTFdKz1gIC4uLiAke2ktcn0gbW9yZSBjb2x1bW5zYCk7dSE9PXMmJmEucHVzaChgLi4uICR7cy1lfSBtb3JlIHJvd3NgKTtyZXR1cm4gYS5qb2luKGBcbiR7emV9YCl9KHQscixvLG4scyl9XG4ke1RlfV1cbiR7VGV9cm93czogJHt0LnJvd3N9XG4ke1RlfWNvbHVtbnM6ICR7dC5jb2x1bW5zfVxufWB9ZnVuY3Rpb24gJGUodCxlLHIpe3JldHVybih0Pj0wJiZyP2AgJHtxZSh0LGUtMSl9YDpxZSh0LGUpKS5wYWRFbmQoZSl9ZnVuY3Rpb24gcWUodCxlKXtsZXQgcj10LnRvU3RyaW5nKCk7aWYoci5sZW5ndGg8PWUpcmV0dXJuIHI7bGV0IG89dC50b0ZpeGVkKGUpO2lmKG8ubGVuZ3RoPmUmJihvPXQudG9GaXhlZChNYXRoLm1heCgwLGUtKG8ubGVuZ3RoLWUpKSkpLG8ubGVuZ3RoPD1lJiYhby5zdGFydHNXaXRoKCIwLjAwMCIpJiYhby5zdGFydHNXaXRoKCItMC4wMDAiKSlyZXR1cm4gbztsZXQgbj10LnRvRXhwb25lbnRpYWwoZSk7cmV0dXJuIG4ubGVuZ3RoPmUmJihuPXQudG9FeHBvbmVudGlhbChNYXRoLm1heCgwLGUtKG4ubGVuZ3RoLWUpKSkpLG4uc2xpY2UoMCl9ZnVuY3Rpb24gRGUodCxlLHIpe2xldCBvPXI/dC5yb3dzOnQucm93cy0xO2lmKGU8MHx8ZT5vKXRocm93IG5ldyBSYW5nZUVycm9yKCJSb3cgaW5kZXggb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gVWUodCxlLHIpe2xldCBvPXI/dC5jb2x1bW5zOnQuY29sdW1ucy0xO2lmKGU8MHx8ZT5vKXRocm93IG5ldyBSYW5nZUVycm9yKCJDb2x1bW4gaW5kZXggb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gTGUodCxlKXtpZihlLnRvMURBcnJheSYmKGU9ZS50bzFEQXJyYXkoKSksZS5sZW5ndGghPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoInZlY3RvciBzaXplIG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiBjb2x1bW5zIik7cmV0dXJuIGV9ZnVuY3Rpb24gR2UodCxlKXtpZihlLnRvMURBcnJheSYmKGU9ZS50bzFEQXJyYXkoKSksZS5sZW5ndGghPT10LnJvd3MpdGhyb3cgbmV3IFJhbmdlRXJyb3IoInZlY3RvciBzaXplIG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiByb3dzIik7cmV0dXJuIGV9ZnVuY3Rpb24gQmUodCxlLHIsbyxuKXtpZig1IT09YXJndW1lbnRzLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiZXhwZWN0ZWQgNCBhcmd1bWVudHMiKTtpZihLZSgic3RhcnRSb3ciLGUpLEtlKCJlbmRSb3ciLHIpLEtlKCJzdGFydENvbHVtbiIsbyksS2UoImVuZENvbHVtbiIsbiksZT5yfHxvPm58fGU8MHx8ZT49dC5yb3dzfHxyPDB8fHI+PXQucm93c3x8bzwwfHxvPj10LmNvbHVtbnN8fG48MHx8bj49dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJTdWJtYXRyaXggaW5kaWNlcyBhcmUgb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gV2UodCxlPTApe2xldCByPVtdO2ZvcihsZXQgbz0wO288dDtvKyspci5wdXNoKGUpO3JldHVybiByfWZ1bmN0aW9uIEtlKHQsZSl7aWYoIm51bWJlciIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoYCR7dH0gbXVzdCBiZSBhIG51bWJlcmApfWZ1bmN0aW9uIFllKHQpe2lmKHQuaXNFbXB0eSgpKXRocm93IG5ldyBFcnJvcigiRW1wdHkgbWF0cml4IGhhcyBubyBlbGVtZW50cyB0byBpbmRleCIpfWNsYXNzIFhle3N0YXRpYyBmcm9tMURBcnJheSh0LGUscil7aWYodCplIT09ci5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoImRhdGEgbGVuZ3RoIGRvZXMgbm90IG1hdGNoIGdpdmVuIGRpbWVuc2lvbnMiKTtsZXQgbz1uZXcgWmUodCxlKTtmb3IobGV0IG49MDtuPHQ7bisrKWZvcihsZXQgdD0wO3Q8ZTt0Kyspby5zZXQobix0LHJbbiplK3RdKTtyZXR1cm4gb31zdGF0aWMgcm93VmVjdG9yKHQpe2xldCBlPW5ldyBaZSgxLHQubGVuZ3RoKTtmb3IobGV0IHI9MDtyPHQubGVuZ3RoO3IrKyllLnNldCgwLHIsdFtyXSk7cmV0dXJuIGV9c3RhdGljIGNvbHVtblZlY3Rvcih0KXtsZXQgZT1uZXcgWmUodC5sZW5ndGgsMSk7Zm9yKGxldCByPTA7cjx0Lmxlbmd0aDtyKyspZS5zZXQociwwLHRbcl0pO3JldHVybiBlfXN0YXRpYyB6ZXJvcyh0LGUpe3JldHVybiBuZXcgWmUodCxlKX1zdGF0aWMgb25lcyh0LGUpe3JldHVybiBuZXcgWmUodCxlKS5maWxsKDEpfXN0YXRpYyByYW5kKHQsZSxyPXt9KXtpZigib2JqZWN0IiE9dHlwZW9mIHIpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIpO2NvbnN0e3JhbmRvbTpvPU1hdGgucmFuZG9tfT1yO2xldCBuPW5ldyBaZSh0LGUpO2ZvcihsZXQgcj0wO3I8dDtyKyspZm9yKGxldCB0PTA7dDxlO3QrKyluLnNldChyLHQsbygpKTtyZXR1cm4gbn1zdGF0aWMgcmFuZEludCh0LGUscj17fSl7aWYoIm9iamVjdCIhPXR5cGVvZiByKXRocm93IG5ldyBUeXBlRXJyb3IoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiKTtjb25zdHttaW46bz0wLG1heDpuPTFlMyxyYW5kb206cz1NYXRoLnJhbmRvbX09cjtpZighTnVtYmVyLmlzSW50ZWdlcihvKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJtaW4gbXVzdCBiZSBhbiBpbnRlZ2VyIik7aWYoIU51bWJlci5pc0ludGVnZXIobikpdGhyb3cgbmV3IFR5cGVFcnJvcigibWF4IG11c3QgYmUgYW4gaW50ZWdlciIpO2lmKG8+PW4pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm1pbiBtdXN0IGJlIHNtYWxsZXIgdGhhbiBtYXgiKTtsZXQgaT1uLW8sdT1uZXcgWmUodCxlKTtmb3IobGV0IHI9MDtyPHQ7cisrKWZvcihsZXQgdD0wO3Q8ZTt0Kyspe2xldCBlPW8rTWF0aC5yb3VuZChzKCkqaSk7dS5zZXQocix0LGUpfXJldHVybiB1fXN0YXRpYyBleWUodCxlLHIpe3ZvaWQgMD09PWUmJihlPXQpLHZvaWQgMD09PXImJihyPTEpO2xldCBvPU1hdGgubWluKHQsZSksbj10aGlzLnplcm9zKHQsZSk7Zm9yKGxldCB0PTA7dDxvO3QrKyluLnNldCh0LHQscik7cmV0dXJuIG59c3RhdGljIGRpYWcodCxlLHIpe2xldCBvPXQubGVuZ3RoO3ZvaWQgMD09PWUmJihlPW8pLHZvaWQgMD09PXImJihyPWUpO2xldCBuPU1hdGgubWluKG8sZSxyKSxzPXRoaXMuemVyb3MoZSxyKTtmb3IobGV0IGU9MDtlPG47ZSsrKXMuc2V0KGUsZSx0W2VdKTtyZXR1cm4gc31zdGF0aWMgbWluKHQsZSl7dD10aGlzLmNoZWNrTWF0cml4KHQpLGU9dGhpcy5jaGVja01hdHJpeChlKTtsZXQgcj10LnJvd3Msbz10LmNvbHVtbnMsbj1uZXcgWmUocixvKTtmb3IobGV0IHM9MDtzPHI7cysrKWZvcihsZXQgcj0wO3I8bztyKyspbi5zZXQocyxyLE1hdGgubWluKHQuZ2V0KHMsciksZS5nZXQocyxyKSkpO3JldHVybiBufXN0YXRpYyBtYXgodCxlKXt0PXRoaXMuY2hlY2tNYXRyaXgodCksZT10aGlzLmNoZWNrTWF0cml4KGUpO2xldCByPXQucm93cyxvPXQuY29sdW1ucyxuPW5ldyB0aGlzKHIsbyk7Zm9yKGxldCBzPTA7czxyO3MrKylmb3IobGV0IHI9MDtyPG87cisrKW4uc2V0KHMscixNYXRoLm1heCh0LmdldChzLHIpLGUuZ2V0KHMscikpKTtyZXR1cm4gbn1zdGF0aWMgY2hlY2tNYXRyaXgodCl7cmV0dXJuIFhlLmlzTWF0cml4KHQpP3Q6bmV3IFplKHQpfXN0YXRpYyBpc01hdHJpeCh0KXtyZXR1cm4gbnVsbCE9dCYmIk1hdHJpeCI9PT10LmtsYXNzfWdldCBzaXplKCl7cmV0dXJuIHRoaXMucm93cyp0aGlzLmNvbHVtbnN9YXBwbHkodCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiY2FsbGJhY2sgbXVzdCBiZSBhIGZ1bmN0aW9uIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0LmNhbGwodGhpcyxlLHIpO3JldHVybiB0aGlzfXRvMURBcnJheSgpe2xldCB0PVtdO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdC5wdXNoKHRoaXMuZ2V0KGUscikpO3JldHVybiB0fXRvMkRBcnJheSgpe2xldCB0PVtdO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKyl7dC5wdXNoKFtdKTtmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdFtlXS5wdXNoKHRoaXMuZ2V0KGUscikpfXJldHVybiB0fXRvSlNPTigpe3JldHVybiB0aGlzLnRvMkRBcnJheSgpfWlzUm93VmVjdG9yKCl7cmV0dXJuIDE9PT10aGlzLnJvd3N9aXNDb2x1bW5WZWN0b3IoKXtyZXR1cm4gMT09PXRoaXMuY29sdW1uc31pc1ZlY3Rvcigpe3JldHVybiAxPT09dGhpcy5yb3dzfHwxPT09dGhpcy5jb2x1bW5zfWlzU3F1YXJlKCl7cmV0dXJuIHRoaXMucm93cz09PXRoaXMuY29sdW1uc31pc0VtcHR5KCl7cmV0dXJuIDA9PT10aGlzLnJvd3N8fDA9PT10aGlzLmNvbHVtbnN9aXNTeW1tZXRyaWMoKXtpZih0aGlzLmlzU3F1YXJlKCkpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPD10O2UrKylpZih0aGlzLmdldCh0LGUpIT09dGhpcy5nZXQoZSx0KSlyZXR1cm4hMTtyZXR1cm4hMH1yZXR1cm4hMX1pc0VjaGVsb25Gb3JtKCl7bGV0IHQ9MCxlPTAscj0tMSxvPSEwLG49ITE7Zm9yKDt0PHRoaXMucm93cyYmbzspe2ZvcihlPTAsbj0hMTtlPHRoaXMuY29sdW1ucyYmITE9PT1uOykwPT09dGhpcy5nZXQodCxlKT9lKys6MT09PXRoaXMuZ2V0KHQsZSkmJmU+cj8obj0hMCxyPWUpOihvPSExLG49ITApO3QrK31yZXR1cm4gb31pc1JlZHVjZWRFY2hlbG9uRm9ybSgpe2xldCB0PTAsZT0wLHI9LTEsbz0hMCxuPSExO2Zvcig7dDx0aGlzLnJvd3MmJm87KXtmb3IoZT0wLG49ITE7ZTx0aGlzLmNvbHVtbnMmJiExPT09bjspMD09PXRoaXMuZ2V0KHQsZSk/ZSsrOjE9PT10aGlzLmdldCh0LGUpJiZlPnI/KG49ITAscj1lKToobz0hMSxuPSEwKTtmb3IobGV0IHI9ZSsxO3I8dGhpcy5yb3dzO3IrKykwIT09dGhpcy5nZXQodCxyKSYmKG89ITEpO3QrK31yZXR1cm4gb31lY2hlbG9uRm9ybSgpe2xldCB0PXRoaXMuY2xvbmUoKSxlPTAscj0wO2Zvcig7ZTx0LnJvd3MmJnI8dC5jb2x1bW5zOyl7bGV0IG89ZTtmb3IobGV0IG49ZTtuPHQucm93cztuKyspdC5nZXQobixyKT50LmdldChvLHIpJiYobz1uKTtpZigwPT09dC5nZXQobyxyKSlyKys7ZWxzZXt0LnN3YXBSb3dzKGUsbyk7bGV0IG49dC5nZXQoZSxyKTtmb3IobGV0IG89cjtvPHQuY29sdW1ucztvKyspdC5zZXQoZSxvLHQuZ2V0KGUsbykvbik7Zm9yKGxldCBvPWUrMTtvPHQucm93cztvKyspe2xldCBuPXQuZ2V0KG8scikvdC5nZXQoZSxyKTt0LnNldChvLHIsMCk7Zm9yKGxldCBzPXIrMTtzPHQuY29sdW1ucztzKyspdC5zZXQobyxzLHQuZ2V0KG8scyktdC5nZXQoZSxzKSpuKX1lKysscisrfX1yZXR1cm4gdH1yZWR1Y2VkRWNoZWxvbkZvcm0oKXtsZXQgdD10aGlzLmVjaGVsb25Gb3JtKCksZT10LmNvbHVtbnMscj10LnJvd3Msbz1yLTE7Zm9yKDtvPj0wOylpZigwPT09dC5tYXhSb3cobykpby0tO2Vsc2V7bGV0IG49MCxzPSExO2Zvcig7bjxyJiYhMT09PXM7KTE9PT10LmdldChvLG4pP3M9ITA6bisrO2ZvcihsZXQgcj0wO3I8bztyKyspe2xldCBzPXQuZ2V0KHIsbik7Zm9yKGxldCBpPW47aTxlO2krKyl7bGV0IGU9dC5nZXQocixpKS1zKnQuZ2V0KG8saSk7dC5zZXQocixpLGUpfX1vLS19cmV0dXJuIHR9c2V0KCl7dGhyb3cgbmV3IEVycm9yKCJzZXQgbWV0aG9kIGlzIHVuaW1wbGVtZW50ZWQiKX1nZXQoKXt0aHJvdyBuZXcgRXJyb3IoImdldCBtZXRob2QgaXMgdW5pbXBsZW1lbnRlZCIpfXJlcGVhdCh0PXt9KXtpZigib2JqZWN0IiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIpO2NvbnN0e3Jvd3M6ZT0xLGNvbHVtbnM6cj0xfT10O2lmKCFOdW1iZXIuaXNJbnRlZ2VyKGUpfHxlPD0wKXRocm93IG5ldyBUeXBlRXJyb3IoInJvd3MgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIiKTtpZighTnVtYmVyLmlzSW50ZWdlcihyKXx8cjw9MCl0aHJvdyBuZXcgVHlwZUVycm9yKCJjb2x1bW5zIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIik7bGV0IG89bmV3IFplKHRoaXMucm93cyplLHRoaXMuY29sdW1ucypyKTtmb3IobGV0IHQ9MDt0PGU7dCsrKWZvcihsZXQgZT0wO2U8cjtlKyspby5zZXRTdWJNYXRyaXgodGhpcyx0aGlzLnJvd3MqdCx0aGlzLmNvbHVtbnMqZSk7cmV0dXJuIG99ZmlsbCh0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0KTtyZXR1cm4gdGhpc31uZWcoKXtyZXR1cm4gdGhpcy5tdWxTKC0xKX1nZXRSb3codCl7RGUodGhpcyx0KTtsZXQgZT1bXTtmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspZS5wdXNoKHRoaXMuZ2V0KHQscikpO3JldHVybiBlfWdldFJvd1ZlY3Rvcih0KXtyZXR1cm4gWmUucm93VmVjdG9yKHRoaXMuZ2V0Um93KHQpKX1zZXRSb3codCxlKXtEZSh0aGlzLHQpLGU9TGUodGhpcyxlKTtmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQodCxyLGVbcl0pO3JldHVybiB0aGlzfXN3YXBSb3dzKHQsZSl7RGUodGhpcyx0KSxEZSh0aGlzLGUpO2ZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl7bGV0IG89dGhpcy5nZXQodCxyKTt0aGlzLnNldCh0LHIsdGhpcy5nZXQoZSxyKSksdGhpcy5zZXQoZSxyLG8pfXJldHVybiB0aGlzfWdldENvbHVtbih0KXtVZSh0aGlzLHQpO2xldCBlPVtdO2ZvcihsZXQgcj0wO3I8dGhpcy5yb3dzO3IrKyllLnB1c2godGhpcy5nZXQocix0KSk7cmV0dXJuIGV9Z2V0Q29sdW1uVmVjdG9yKHQpe3JldHVybiBaZS5jb2x1bW5WZWN0b3IodGhpcy5nZXRDb2x1bW4odCkpfXNldENvbHVtbih0LGUpe1VlKHRoaXMsdCksZT1HZSh0aGlzLGUpO2ZvcihsZXQgcj0wO3I8dGhpcy5yb3dzO3IrKyl0aGlzLnNldChyLHQsZVtyXSk7cmV0dXJuIHRoaXN9c3dhcENvbHVtbnModCxlKXtVZSh0aGlzLHQpLFVlKHRoaXMsZSk7Zm9yKGxldCByPTA7cjx0aGlzLnJvd3M7cisrKXtsZXQgbz10aGlzLmdldChyLHQpO3RoaXMuc2V0KHIsdCx0aGlzLmdldChyLGUpKSx0aGlzLnNldChyLGUsbyl9cmV0dXJuIHRoaXN9YWRkUm93VmVjdG9yKHQpe3Q9TGUodGhpcyx0KTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpK3Rbcl0pO3JldHVybiB0aGlzfXN1YlJvd1ZlY3Rvcih0KXt0PUxlKHRoaXMsdCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKS10W3JdKTtyZXR1cm4gdGhpc31tdWxSb3dWZWN0b3IodCl7dD1MZSh0aGlzLHQpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikqdFtyXSk7cmV0dXJuIHRoaXN9ZGl2Um93VmVjdG9yKHQpe3Q9TGUodGhpcyx0KTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpL3Rbcl0pO3JldHVybiB0aGlzfWFkZENvbHVtblZlY3Rvcih0KXt0PUdlKHRoaXMsdCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKSt0W2VdKTtyZXR1cm4gdGhpc31zdWJDb2x1bW5WZWN0b3IodCl7dD1HZSh0aGlzLHQpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUsciktdFtlXSk7cmV0dXJuIHRoaXN9bXVsQ29sdW1uVmVjdG9yKHQpe3Q9R2UodGhpcyx0KTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpKnRbZV0pO3JldHVybiB0aGlzfWRpdkNvbHVtblZlY3Rvcih0KXt0PUdlKHRoaXMsdCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKS90W2VdKTtyZXR1cm4gdGhpc31tdWxSb3codCxlKXtEZSh0aGlzLHQpO2ZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldCh0LHIsdGhpcy5nZXQodCxyKSplKTtyZXR1cm4gdGhpc31tdWxDb2x1bW4odCxlKXtVZSh0aGlzLHQpO2ZvcihsZXQgcj0wO3I8dGhpcy5yb3dzO3IrKyl0aGlzLnNldChyLHQsdGhpcy5nZXQocix0KSplKTtyZXR1cm4gdGhpc31tYXgodCl7aWYodGhpcy5pc0VtcHR5KCkpcmV0dXJuIE5hTjtzd2l0Y2godCl7Y2FzZSJyb3ciOntjb25zdCB0PW5ldyBBcnJheSh0aGlzLnJvd3MpLmZpbGwoTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuZ2V0KGUscik+dFtlXSYmKHRbZV09dGhpcy5nZXQoZSxyKSk7cmV0dXJuIHR9Y2FzZSJjb2x1bW4iOntjb25zdCB0PW5ldyBBcnJheSh0aGlzLmNvbHVtbnMpLmZpbGwoTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuZ2V0KGUscik+dFtyXSYmKHRbcl09dGhpcy5nZXQoZSxyKSk7cmV0dXJuIHR9Y2FzZSB2b2lkIDA6e2xldCB0PXRoaXMuZ2V0KDAsMCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLmdldChlLHIpPnQmJih0PXRoaXMuZ2V0KGUscikpO3JldHVybiB0fWRlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG9wdGlvbjogJHt0fWApfX1tYXhJbmRleCgpe1llKHRoaXMpO2xldCB0PXRoaXMuZ2V0KDAsMCksZT1bMCwwXTtmb3IobGV0IHI9MDtyPHRoaXMucm93cztyKyspZm9yKGxldCBvPTA7bzx0aGlzLmNvbHVtbnM7bysrKXRoaXMuZ2V0KHIsbyk+dCYmKHQ9dGhpcy5nZXQocixvKSxlWzBdPXIsZVsxXT1vKTtyZXR1cm4gZX1taW4odCl7aWYodGhpcy5pc0VtcHR5KCkpcmV0dXJuIE5hTjtzd2l0Y2godCl7Y2FzZSJyb3ciOntjb25zdCB0PW5ldyBBcnJheSh0aGlzLnJvd3MpLmZpbGwoTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuZ2V0KGUscik8dFtlXSYmKHRbZV09dGhpcy5nZXQoZSxyKSk7cmV0dXJuIHR9Y2FzZSJjb2x1bW4iOntjb25zdCB0PW5ldyBBcnJheSh0aGlzLmNvbHVtbnMpLmZpbGwoTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuZ2V0KGUscik8dFtyXSYmKHRbcl09dGhpcy5nZXQoZSxyKSk7cmV0dXJuIHR9Y2FzZSB2b2lkIDA6e2xldCB0PXRoaXMuZ2V0KDAsMCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLmdldChlLHIpPHQmJih0PXRoaXMuZ2V0KGUscikpO3JldHVybiB0fWRlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG9wdGlvbjogJHt0fWApfX1taW5JbmRleCgpe1llKHRoaXMpO2xldCB0PXRoaXMuZ2V0KDAsMCksZT1bMCwwXTtmb3IobGV0IHI9MDtyPHRoaXMucm93cztyKyspZm9yKGxldCBvPTA7bzx0aGlzLmNvbHVtbnM7bysrKXRoaXMuZ2V0KHIsbyk8dCYmKHQ9dGhpcy5nZXQocixvKSxlWzBdPXIsZVsxXT1vKTtyZXR1cm4gZX1tYXhSb3codCl7aWYoRGUodGhpcyx0KSx0aGlzLmlzRW1wdHkoKSlyZXR1cm4gTmFOO2xldCBlPXRoaXMuZ2V0KHQsMCk7Zm9yKGxldCByPTE7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuZ2V0KHQscik+ZSYmKGU9dGhpcy5nZXQodCxyKSk7cmV0dXJuIGV9bWF4Um93SW5kZXgodCl7RGUodGhpcyx0KSxZZSh0aGlzKTtsZXQgZT10aGlzLmdldCh0LDApLHI9W3QsMF07Zm9yKGxldCBvPTE7bzx0aGlzLmNvbHVtbnM7bysrKXRoaXMuZ2V0KHQsbyk+ZSYmKGU9dGhpcy5nZXQodCxvKSxyWzFdPW8pO3JldHVybiByfW1pblJvdyh0KXtpZihEZSh0aGlzLHQpLHRoaXMuaXNFbXB0eSgpKXJldHVybiBOYU47bGV0IGU9dGhpcy5nZXQodCwwKTtmb3IobGV0IHI9MTtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5nZXQodCxyKTxlJiYoZT10aGlzLmdldCh0LHIpKTtyZXR1cm4gZX1taW5Sb3dJbmRleCh0KXtEZSh0aGlzLHQpLFllKHRoaXMpO2xldCBlPXRoaXMuZ2V0KHQsMCkscj1bdCwwXTtmb3IobGV0IG89MTtvPHRoaXMuY29sdW1ucztvKyspdGhpcy5nZXQodCxvKTxlJiYoZT10aGlzLmdldCh0LG8pLHJbMV09byk7cmV0dXJuIHJ9bWF4Q29sdW1uKHQpe2lmKFVlKHRoaXMsdCksdGhpcy5pc0VtcHR5KCkpcmV0dXJuIE5hTjtsZXQgZT10aGlzLmdldCgwLHQpO2ZvcihsZXQgcj0xO3I8dGhpcy5yb3dzO3IrKyl0aGlzLmdldChyLHQpPmUmJihlPXRoaXMuZ2V0KHIsdCkpO3JldHVybiBlfW1heENvbHVtbkluZGV4KHQpe1VlKHRoaXMsdCksWWUodGhpcyk7bGV0IGU9dGhpcy5nZXQoMCx0KSxyPVswLHRdO2ZvcihsZXQgbz0xO288dGhpcy5yb3dzO28rKyl0aGlzLmdldChvLHQpPmUmJihlPXRoaXMuZ2V0KG8sdCksclswXT1vKTtyZXR1cm4gcn1taW5Db2x1bW4odCl7aWYoVWUodGhpcyx0KSx0aGlzLmlzRW1wdHkoKSlyZXR1cm4gTmFOO2xldCBlPXRoaXMuZ2V0KDAsdCk7Zm9yKGxldCByPTE7cjx0aGlzLnJvd3M7cisrKXRoaXMuZ2V0KHIsdCk8ZSYmKGU9dGhpcy5nZXQocix0KSk7cmV0dXJuIGV9bWluQ29sdW1uSW5kZXgodCl7VWUodGhpcyx0KSxZZSh0aGlzKTtsZXQgZT10aGlzLmdldCgwLHQpLHI9WzAsdF07Zm9yKGxldCBvPTE7bzx0aGlzLnJvd3M7bysrKXRoaXMuZ2V0KG8sdCk8ZSYmKGU9dGhpcy5nZXQobyx0KSxyWzBdPW8pO3JldHVybiByfWRpYWcoKXtsZXQgdD1NYXRoLm1pbih0aGlzLnJvd3MsdGhpcy5jb2x1bW5zKSxlPVtdO2ZvcihsZXQgcj0wO3I8dDtyKyspZS5wdXNoKHRoaXMuZ2V0KHIscikpO3JldHVybiBlfW5vcm0odD0iZnJvYmVuaXVzIil7bGV0IGU9MDtpZigibWF4Ij09PXQpcmV0dXJuIHRoaXMubWF4KCk7aWYoImZyb2Jlbml1cyI9PT10KXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKWUrPXRoaXMuZ2V0KHQscikqdGhpcy5nZXQodCxyKTtyZXR1cm4gTWF0aC5zcXJ0KGUpfXRocm93IG5ldyBSYW5nZUVycm9yKGB1bmtub3duIG5vcm0gdHlwZTogJHt0fWApfWN1bXVsYXRpdmVTdW0oKXtsZXQgdD0wO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdCs9dGhpcy5nZXQoZSxyKSx0aGlzLnNldChlLHIsdCk7cmV0dXJuIHRoaXN9ZG90KHQpe1hlLmlzTWF0cml4KHQpJiYodD10LnRvMURBcnJheSgpKTtsZXQgZT10aGlzLnRvMURBcnJheSgpO2lmKGUubGVuZ3RoIT09dC5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoInZlY3RvcnMgZG8gbm90IGhhdmUgdGhlIHNhbWUgc2l6ZSIpO2xldCByPTA7Zm9yKGxldCBvPTA7bzxlLmxlbmd0aDtvKyspcis9ZVtvXSp0W29dO3JldHVybiByfW1tdWwodCl7dD1aZS5jaGVja01hdHJpeCh0KTtsZXQgZT10aGlzLnJvd3Mscj10aGlzLmNvbHVtbnMsbz10LmNvbHVtbnMsbj1uZXcgWmUoZSxvKSxzPW5ldyBGbG9hdDY0QXJyYXkocik7Zm9yKGxldCBpPTA7aTxvO2krKyl7Zm9yKGxldCBlPTA7ZTxyO2UrKylzW2VdPXQuZ2V0KGUsaSk7Zm9yKGxldCB0PTA7dDxlO3QrKyl7bGV0IGU9MDtmb3IobGV0IG89MDtvPHI7bysrKWUrPXRoaXMuZ2V0KHQsbykqc1tvXTtuLnNldCh0LGksZSl9fXJldHVybiBufXN0cmFzc2VuMngyKHQpe3Q9WmUuY2hlY2tNYXRyaXgodCk7bGV0IGU9bmV3IFplKDIsMik7Y29uc3Qgcj10aGlzLmdldCgwLDApLG89dC5nZXQoMCwwKSxuPXRoaXMuZ2V0KDAsMSkscz10LmdldCgwLDEpLGk9dGhpcy5nZXQoMSwwKSx1PXQuZ2V0KDEsMCksaD10aGlzLmdldCgxLDEpLGE9dC5nZXQoMSwxKSxsPShyK2gpKihvK2EpLGM9KGkraCkqbyxmPXIqKHMtYSksbT1oKih1LW8pLGc9KHIrbikqYSxwPWwrbS1nKyhuLWgpKih1K2EpLHc9ZitnLGQ9YyttLGI9bC1jK2YrKGktcikqKG8rcyk7cmV0dXJuIGUuc2V0KDAsMCxwKSxlLnNldCgwLDEsdyksZS5zZXQoMSwwLGQpLGUuc2V0KDEsMSxiKSxlfXN0cmFzc2VuM3gzKHQpe3Q9WmUuY2hlY2tNYXRyaXgodCk7bGV0IGU9bmV3IFplKDMsMyk7Y29uc3Qgcj10aGlzLmdldCgwLDApLG89dGhpcy5nZXQoMCwxKSxuPXRoaXMuZ2V0KDAsMikscz10aGlzLmdldCgxLDApLGk9dGhpcy5nZXQoMSwxKSx1PXRoaXMuZ2V0KDEsMiksaD10aGlzLmdldCgyLDApLGE9dGhpcy5nZXQoMiwxKSxsPXRoaXMuZ2V0KDIsMiksYz10LmdldCgwLDApLGY9dC5nZXQoMCwxKSxtPXQuZ2V0KDAsMiksZz10LmdldCgxLDApLHA9dC5nZXQoMSwxKSx3PXQuZ2V0KDEsMiksZD10LmdldCgyLDApLGI9dC5nZXQoMiwxKSx5PXQuZ2V0KDIsMiksdj0oci1zKSooLWYrcCksTT0oLXIrcytpKSooYy1mK3ApLHg9KHMraSkqKC1jK2YpLEU9cipjLFM9KC1yK2grYSkqKGMtbSt3KSxqPSgtcitoKSoobS13KSxfPShoK2EpKigtYyttKSxBPSgtbithK2wpKihwK2QtYiksTz0obi1sKSoocC1iKSxSPW4qZCxDPShhK2wpKigtZCtiKSxJPSgtbitpK3UpKih3K2QteSksTj0obi11KSoody15KSxrPShpK3UpKigtZCt5KSxGPUUrUitvKmcsUD0ocitvK24tcy1pLWEtbCkqcCtNK3grRStBK1IrQyxUPUUrUytfKyhyK28rbi1pLXUtaC1hKSp3K1IrSStrLHo9ditpKigtYytmK2ctcC13LWQreSkrTStFK1IrSStOLFY9ditNK3grRSt1KmIsJD1SK0krTitrK3MqbSxxPUUrUytqK2EqKC1jK20rZy1wLXctZCtiKStBK08rUixEPUErTytSK0MraCpmLFU9RStTK2orXytsKnk7cmV0dXJuIGUuc2V0KDAsMCxGKSxlLnNldCgwLDEsUCksZS5zZXQoMCwyLFQpLGUuc2V0KDEsMCx6KSxlLnNldCgxLDEsViksZS5zZXQoMSwyLCQpLGUuc2V0KDIsMCxxKSxlLnNldCgyLDEsRCksZS5zZXQoMiwyLFUpLGV9bW11bFN0cmFzc2VuKHQpe3Q9WmUuY2hlY2tNYXRyaXgodCk7bGV0IGU9dGhpcy5jbG9uZSgpLHI9ZS5yb3dzLG89ZS5jb2x1bW5zLG49dC5yb3dzLHM9dC5jb2x1bW5zO2Z1bmN0aW9uIGkodCxlLHIpe2xldCBvPXQucm93cyxuPXQuY29sdW1ucztpZihvPT09ZSYmbj09PXIpcmV0dXJuIHQ7e2xldCBvPVhlLnplcm9zKGUscik7cmV0dXJuIG89by5zZXRTdWJNYXRyaXgodCwwLDApLG99fW8hPT1uJiZjb25zb2xlLndhcm4oYE11bHRpcGx5aW5nICR7cn0geCAke299IGFuZCAke259IHggJHtzfSBtYXRyaXg6IGRpbWVuc2lvbnMgZG8gbm90IG1hdGNoLmApO2xldCB1PU1hdGgubWF4KHIsbiksaD1NYXRoLm1heChvLHMpO3JldHVybiBlPWkoZSx1LGgpLGZ1bmN0aW9uIHQoZSxyLG8sbil7aWYobzw9NTEyfHxuPD01MTIpcmV0dXJuIGUubW11bChyKTtvJTI9PTEmJm4lMj09MT8oZT1pKGUsbysxLG4rMSkscj1pKHIsbysxLG4rMSkpOm8lMj09MT8oZT1pKGUsbysxLG4pLHI9aShyLG8rMSxuKSk6biUyPT0xJiYoZT1pKGUsbyxuKzEpLHI9aShyLG8sbisxKSk7bGV0IHM9cGFyc2VJbnQoZS5yb3dzLzIsMTApLHU9cGFyc2VJbnQoZS5jb2x1bW5zLzIsMTApLGg9ZS5zdWJNYXRyaXgoMCxzLTEsMCx1LTEpLGE9ci5zdWJNYXRyaXgoMCxzLTEsMCx1LTEpLGw9ZS5zdWJNYXRyaXgoMCxzLTEsdSxlLmNvbHVtbnMtMSksYz1yLnN1Yk1hdHJpeCgwLHMtMSx1LHIuY29sdW1ucy0xKSxmPWUuc3ViTWF0cml4KHMsZS5yb3dzLTEsMCx1LTEpLG09ci5zdWJNYXRyaXgocyxyLnJvd3MtMSwwLHUtMSksZz1lLnN1Yk1hdHJpeChzLGUucm93cy0xLHUsZS5jb2x1bW5zLTEpLHA9ci5zdWJNYXRyaXgocyxyLnJvd3MtMSx1LHIuY29sdW1ucy0xKSx3PXQoWGUuYWRkKGgsZyksWGUuYWRkKGEscCkscyx1KSxkPXQoWGUuYWRkKGYsZyksYSxzLHUpLGI9dChoLFhlLnN1YihjLHApLHMsdSkseT10KGcsWGUuc3ViKG0sYSkscyx1KSx2PXQoWGUuYWRkKGgsbCkscCxzLHUpLE09dChYZS5zdWIoZixoKSxYZS5hZGQoYSxjKSxzLHUpLHg9dChYZS5zdWIobCxnKSxYZS5hZGQobSxwKSxzLHUpLEU9WGUuYWRkKHcseSk7RS5zdWIodiksRS5hZGQoeCk7bGV0IFM9WGUuYWRkKGIsdiksaj1YZS5hZGQoZCx5KSxfPVhlLnN1Yih3LGQpO18uYWRkKGIpLF8uYWRkKE0pO2xldCBBPVhlLnplcm9zKDIqRS5yb3dzLDIqRS5jb2x1bW5zKTtyZXR1cm4gQT1BLnNldFN1Yk1hdHJpeChFLDAsMCksQT1BLnNldFN1Yk1hdHJpeChTLEUucm93cywwKSxBPUEuc2V0U3ViTWF0cml4KGosMCxFLmNvbHVtbnMpLEE9QS5zZXRTdWJNYXRyaXgoXyxFLnJvd3MsRS5jb2x1bW5zKSxBLnN1Yk1hdHJpeCgwLG8tMSwwLG4tMSl9KGUsdD1pKHQsdSxoKSx1LGgpfXNjYWxlUm93cyh0PXt9KXtpZigib2JqZWN0IiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIpO2NvbnN0e21pbjplPTAsbWF4OnI9MX09dDtpZighTnVtYmVyLmlzRmluaXRlKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIm1pbiBtdXN0IGJlIGEgbnVtYmVyIik7aWYoIU51bWJlci5pc0Zpbml0ZShyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJtYXggbXVzdCBiZSBhIG51bWJlciIpO2lmKGU+PXIpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm1pbiBtdXN0IGJlIHNtYWxsZXIgdGhhbiBtYXgiKTtsZXQgbz1uZXcgWmUodGhpcy5yb3dzLHRoaXMuY29sdW1ucyk7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKXtjb25zdCBuPXRoaXMuZ2V0Um93KHQpO24ubGVuZ3RoPjAmJlBlKG4se21pbjplLG1heDpyLG91dHB1dDpufSksby5zZXRSb3codCxuKX1yZXR1cm4gb31zY2FsZUNvbHVtbnModD17fSl7aWYoIm9iamVjdCIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiKTtjb25zdHttaW46ZT0wLG1heDpyPTF9PXQ7aWYoIU51bWJlci5pc0Zpbml0ZShlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJtaW4gbXVzdCBiZSBhIG51bWJlciIpO2lmKCFOdW1iZXIuaXNGaW5pdGUocikpdGhyb3cgbmV3IFR5cGVFcnJvcigibWF4IG11c3QgYmUgYSBudW1iZXIiKTtpZihlPj1yKXRocm93IG5ldyBSYW5nZUVycm9yKCJtaW4gbXVzdCBiZSBzbWFsbGVyIHRoYW4gbWF4Iik7bGV0IG89bmV3IFplKHRoaXMucm93cyx0aGlzLmNvbHVtbnMpO2ZvcihsZXQgdD0wO3Q8dGhpcy5jb2x1bW5zO3QrKyl7Y29uc3Qgbj10aGlzLmdldENvbHVtbih0KTtuLmxlbmd0aCYmUGUobix7bWluOmUsbWF4OnIsb3V0cHV0Om59KSxvLnNldENvbHVtbih0LG4pfXJldHVybiBvfWZsaXBSb3dzKCl7Y29uc3QgdD1NYXRoLmNlaWwodGhpcy5jb2x1bW5zLzIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHQ7cisrKXtsZXQgdD10aGlzLmdldChlLHIpLG89dGhpcy5nZXQoZSx0aGlzLmNvbHVtbnMtMS1yKTt0aGlzLnNldChlLHIsbyksdGhpcy5zZXQoZSx0aGlzLmNvbHVtbnMtMS1yLHQpfXJldHVybiB0aGlzfWZsaXBDb2x1bW5zKCl7Y29uc3QgdD1NYXRoLmNlaWwodGhpcy5yb3dzLzIpO2ZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKylmb3IobGV0IHI9MDtyPHQ7cisrKXtsZXQgdD10aGlzLmdldChyLGUpLG89dGhpcy5nZXQodGhpcy5yb3dzLTEtcixlKTt0aGlzLnNldChyLGUsbyksdGhpcy5zZXQodGhpcy5yb3dzLTEtcixlLHQpfXJldHVybiB0aGlzfWtyb25lY2tlclByb2R1Y3QodCl7dD1aZS5jaGVja01hdHJpeCh0KTtsZXQgZT10aGlzLnJvd3Mscj10aGlzLmNvbHVtbnMsbz10LnJvd3Msbj10LmNvbHVtbnMscz1uZXcgWmUoZSpvLHIqbik7Zm9yKGxldCBpPTA7aTxlO2krKylmb3IobGV0IGU9MDtlPHI7ZSsrKWZvcihsZXQgcj0wO3I8bztyKyspZm9yKGxldCB1PTA7dTxuO3UrKylzLnNldChvKmkrcixuKmUrdSx0aGlzLmdldChpLGUpKnQuZ2V0KHIsdSkpO3JldHVybiBzfWtyb25lY2tlclN1bSh0KXtpZih0PVplLmNoZWNrTWF0cml4KHQpLCF0aGlzLmlzU3F1YXJlKCl8fCF0LmlzU3F1YXJlKCkpdGhyb3cgbmV3IEVycm9yKCJLcm9uZWNrZXIgU3VtIG5lZWRzIHR3byBTcXVhcmUgTWF0cmljZXMiKTtsZXQgZT10aGlzLnJvd3Mscj10LnJvd3Msbz10aGlzLmtyb25lY2tlclByb2R1Y3QoWmUuZXllKHIscikpLG49WmUuZXllKGUsZSkua3JvbmVja2VyUHJvZHVjdCh0KTtyZXR1cm4gby5hZGQobil9dHJhbnNwb3NlKCl7bGV0IHQ9bmV3IFplKHRoaXMuY29sdW1ucyx0aGlzLnJvd3MpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdC5zZXQocixlLHRoaXMuZ2V0KGUscikpO3JldHVybiB0fXNvcnRSb3dzKHQ9SmUpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKyl0aGlzLnNldFJvdyhlLHRoaXMuZ2V0Um93KGUpLnNvcnQodCkpO3JldHVybiB0aGlzfXNvcnRDb2x1bW5zKHQ9SmUpe2ZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldENvbHVtbihlLHRoaXMuZ2V0Q29sdW1uKGUpLnNvcnQodCkpO3JldHVybiB0aGlzfXN1Yk1hdHJpeCh0LGUscixvKXtCZSh0aGlzLHQsZSxyLG8pO2xldCBuPW5ldyBaZShlLXQrMSxvLXIrMSk7Zm9yKGxldCBzPXQ7czw9ZTtzKyspZm9yKGxldCBlPXI7ZTw9bztlKyspbi5zZXQocy10LGUtcix0aGlzLmdldChzLGUpKTtyZXR1cm4gbn1zdWJNYXRyaXhSb3codCxlLHIpe2lmKHZvaWQgMD09PWUmJihlPTApLHZvaWQgMD09PXImJihyPXRoaXMuY29sdW1ucy0xKSxlPnJ8fGU8MHx8ZT49dGhpcy5jb2x1bW5zfHxyPDB8fHI+PXRoaXMuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQXJndW1lbnQgb3V0IG9mIHJhbmdlIik7bGV0IG89bmV3IFplKHQubGVuZ3RoLHItZSsxKTtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKylmb3IobGV0IHM9ZTtzPD1yO3MrKyl7aWYodFtuXTwwfHx0W25dPj10aGlzLnJvd3MpdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFJvdyBpbmRleCBvdXQgb2YgcmFuZ2U6ICR7dFtuXX1gKTtvLnNldChuLHMtZSx0aGlzLmdldCh0W25dLHMpKX1yZXR1cm4gb31zdWJNYXRyaXhDb2x1bW4odCxlLHIpe2lmKHZvaWQgMD09PWUmJihlPTApLHZvaWQgMD09PXImJihyPXRoaXMucm93cy0xKSxlPnJ8fGU8MHx8ZT49dGhpcy5yb3dzfHxyPDB8fHI+PXRoaXMucm93cyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQXJndW1lbnQgb3V0IG9mIHJhbmdlIik7bGV0IG89bmV3IFplKHItZSsxLHQubGVuZ3RoKTtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKylmb3IobGV0IHM9ZTtzPD1yO3MrKyl7aWYodFtuXTwwfHx0W25dPj10aGlzLmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoYENvbHVtbiBpbmRleCBvdXQgb2YgcmFuZ2U6ICR7dFtuXX1gKTtvLnNldChzLWUsbix0aGlzLmdldChzLHRbbl0pKX1yZXR1cm4gb31zZXRTdWJNYXRyaXgodCxlLHIpe2lmKCh0PVplLmNoZWNrTWF0cml4KHQpKS5pc0VtcHR5KCkpcmV0dXJuIHRoaXM7QmUodGhpcyxlLGUrdC5yb3dzLTEscixyK3QuY29sdW1ucy0xKTtmb3IobGV0IG89MDtvPHQucm93cztvKyspZm9yKGxldCBuPTA7bjx0LmNvbHVtbnM7bisrKXRoaXMuc2V0KGUrbyxyK24sdC5nZXQobyxuKSk7cmV0dXJuIHRoaXN9c2VsZWN0aW9uKHQsZSl7IWZ1bmN0aW9uKHQsZSl7aWYoIUZlKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoInJvdyBpbmRpY2VzIG11c3QgYmUgYW4gYXJyYXkiKTtmb3IobGV0IHI9MDtyPGUubGVuZ3RoO3IrKylpZihlW3JdPDB8fGVbcl0+PXQucm93cyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigicm93IGluZGljZXMgYXJlIG91dCBvZiByYW5nZSIpfSh0aGlzLHQpLGZ1bmN0aW9uKHQsZSl7aWYoIUZlKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoImNvbHVtbiBpbmRpY2VzIG11c3QgYmUgYW4gYXJyYXkiKTtmb3IobGV0IHI9MDtyPGUubGVuZ3RoO3IrKylpZihlW3JdPDB8fGVbcl0+PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiY29sdW1uIGluZGljZXMgYXJlIG91dCBvZiByYW5nZSIpfSh0aGlzLGUpO2xldCByPW5ldyBaZSh0Lmxlbmd0aCxlLmxlbmd0aCk7Zm9yKGxldCBvPTA7bzx0Lmxlbmd0aDtvKyspe2xldCBuPXRbb107Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0Kyspe2xldCBzPWVbdF07ci5zZXQobyx0LHRoaXMuZ2V0KG4scykpfX1yZXR1cm4gcn10cmFjZSgpe2xldCB0PU1hdGgubWluKHRoaXMucm93cyx0aGlzLmNvbHVtbnMpLGU9MDtmb3IobGV0IHI9MDtyPHQ7cisrKWUrPXRoaXMuZ2V0KHIscik7cmV0dXJuIGV9Y2xvbmUoKXtsZXQgdD1uZXcgWmUodGhpcy5yb3dzLHRoaXMuY29sdW1ucyk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0LnNldChlLHIsdGhpcy5nZXQoZSxyKSk7cmV0dXJuIHR9c3VtKHQpe3N3aXRjaCh0KXtjYXNlInJvdyI6cmV0dXJuIGZ1bmN0aW9uKHQpe2xldCBlPVdlKHQucm93cyk7Zm9yKGxldCByPTA7cjx0LnJvd3M7KytyKWZvcihsZXQgbz0wO288dC5jb2x1bW5zOysrbyllW3JdKz10LmdldChyLG8pO3JldHVybiBlfSh0aGlzKTtjYXNlImNvbHVtbiI6cmV0dXJuIGZ1bmN0aW9uKHQpe2xldCBlPVdlKHQuY29sdW1ucyk7Zm9yKGxldCByPTA7cjx0LnJvd3M7KytyKWZvcihsZXQgbz0wO288dC5jb2x1bW5zOysrbyllW29dKz10LmdldChyLG8pO3JldHVybiBlfSh0aGlzKTtjYXNlIHZvaWQgMDpyZXR1cm4gZnVuY3Rpb24odCl7bGV0IGU9MDtmb3IobGV0IHI9MDtyPHQucm93cztyKyspZm9yKGxldCBvPTA7bzx0LmNvbHVtbnM7bysrKWUrPXQuZ2V0KHIsbyk7cmV0dXJuIGV9KHRoaXMpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG9wdGlvbjogJHt0fWApfX1wcm9kdWN0KHQpe3N3aXRjaCh0KXtjYXNlInJvdyI6cmV0dXJuIGZ1bmN0aW9uKHQpe2xldCBlPVdlKHQucm93cywxKTtmb3IobGV0IHI9MDtyPHQucm93czsrK3IpZm9yKGxldCBvPTA7bzx0LmNvbHVtbnM7KytvKWVbcl0qPXQuZ2V0KHIsbyk7cmV0dXJuIGV9KHRoaXMpO2Nhc2UiY29sdW1uIjpyZXR1cm4gZnVuY3Rpb24odCl7bGV0IGU9V2UodC5jb2x1bW5zLDEpO2ZvcihsZXQgcj0wO3I8dC5yb3dzOysrcilmb3IobGV0IG89MDtvPHQuY29sdW1uczsrK28pZVtvXSo9dC5nZXQocixvKTtyZXR1cm4gZX0odGhpcyk7Y2FzZSB2b2lkIDA6cmV0dXJuIGZ1bmN0aW9uKHQpe2xldCBlPTE7Zm9yKGxldCByPTA7cjx0LnJvd3M7cisrKWZvcihsZXQgbz0wO288dC5jb2x1bW5zO28rKyllKj10LmdldChyLG8pO3JldHVybiBlfSh0aGlzKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgaW52YWxpZCBvcHRpb246ICR7dH1gKX19bWVhbih0KXtjb25zdCBlPXRoaXMuc3VtKHQpO3N3aXRjaCh0KXtjYXNlInJvdyI6Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWVbdF0vPXRoaXMuY29sdW1ucztyZXR1cm4gZTtjYXNlImNvbHVtbiI6Zm9yKGxldCB0PTA7dDx0aGlzLmNvbHVtbnM7dCsrKWVbdF0vPXRoaXMucm93cztyZXR1cm4gZTtjYXNlIHZvaWQgMDpyZXR1cm4gZS90aGlzLnNpemU7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgb3B0aW9uOiAke3R9YCl9fXZhcmlhbmNlKHQsZT17fSl7aWYoIm9iamVjdCI9PXR5cGVvZiB0JiYoZT10LHQ9dm9pZCAwKSwib2JqZWN0IiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIpO2NvbnN0e3VuYmlhc2VkOnI9ITAsbWVhbjpvPXRoaXMubWVhbih0KX09ZTtpZigiYm9vbGVhbiIhPXR5cGVvZiByKXRocm93IG5ldyBUeXBlRXJyb3IoInVuYmlhc2VkIG11c3QgYmUgYSBib29sZWFuIik7c3dpdGNoKHQpe2Nhc2Uicm93IjppZighRmUobykpdGhyb3cgbmV3IFR5cGVFcnJvcigibWVhbiBtdXN0IGJlIGFuIGFycmF5Iik7cmV0dXJuIGZ1bmN0aW9uKHQsZSxyKXtjb25zdCBvPXQucm93cyxuPXQuY29sdW1ucyxzPVtdO2ZvcihsZXQgaT0wO2k8bztpKyspe2xldCBvPTAsdT0wLGg9MDtmb3IobGV0IGU9MDtlPG47ZSsrKWg9dC5nZXQoaSxlKS1yW2ldLG8rPWgsdSs9aCpoO2U/cy5wdXNoKCh1LW8qby9uKS8obi0xKSk6cy5wdXNoKCh1LW8qby9uKS9uKX1yZXR1cm4gc30odGhpcyxyLG8pO2Nhc2UiY29sdW1uIjppZighRmUobykpdGhyb3cgbmV3IFR5cGVFcnJvcigibWVhbiBtdXN0IGJlIGFuIGFycmF5Iik7cmV0dXJuIGZ1bmN0aW9uKHQsZSxyKXtjb25zdCBvPXQucm93cyxuPXQuY29sdW1ucyxzPVtdO2ZvcihsZXQgaT0wO2k8bjtpKyspe2xldCBuPTAsdT0wLGg9MDtmb3IobGV0IGU9MDtlPG87ZSsrKWg9dC5nZXQoZSxpKS1yW2ldLG4rPWgsdSs9aCpoO2U/cy5wdXNoKCh1LW4qbi9vKS8oby0xKSk6cy5wdXNoKCh1LW4qbi9vKS9vKX1yZXR1cm4gc30odGhpcyxyLG8pO2Nhc2Ugdm9pZCAwOmlmKCJudW1iZXIiIT10eXBlb2Ygbyl0aHJvdyBuZXcgVHlwZUVycm9yKCJtZWFuIG11c3QgYmUgYSBudW1iZXIiKTtyZXR1cm4gZnVuY3Rpb24odCxlLHIpe2NvbnN0IG89dC5yb3dzLG49dC5jb2x1bW5zLHM9bypuO2xldCBpPTAsdT0wLGg9MDtmb3IobGV0IGU9MDtlPG87ZSsrKWZvcihsZXQgbz0wO288bjtvKyspaD10LmdldChlLG8pLXIsaSs9aCx1Kz1oKmg7cmV0dXJuIGU/KHUtaSppL3MpLyhzLTEpOih1LWkqaS9zKS9zfSh0aGlzLHIsbyk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgb3B0aW9uOiAke3R9YCl9fXN0YW5kYXJkRGV2aWF0aW9uKHQsZSl7Im9iamVjdCI9PXR5cGVvZiB0JiYoZT10LHQ9dm9pZCAwKTtjb25zdCByPXRoaXMudmFyaWFuY2UodCxlKTtpZih2b2lkIDA9PT10KXJldHVybiBNYXRoLnNxcnQocik7Zm9yKGxldCB0PTA7dDxyLmxlbmd0aDt0Kyspclt0XT1NYXRoLnNxcnQoclt0XSk7cmV0dXJuIHJ9Y2VudGVyKHQsZT17fSl7aWYoIm9iamVjdCI9PXR5cGVvZiB0JiYoZT10LHQ9dm9pZCAwKSwib2JqZWN0IiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIpO2NvbnN0e2NlbnRlcjpyPXRoaXMubWVhbih0KX09ZTtzd2l0Y2godCl7Y2FzZSJyb3ciOmlmKCFGZShyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJjZW50ZXIgbXVzdCBiZSBhbiBhcnJheSIpO3JldHVybiBmdW5jdGlvbih0LGUpe2ZvcihsZXQgcj0wO3I8dC5yb3dzO3IrKylmb3IobGV0IG89MDtvPHQuY29sdW1ucztvKyspdC5zZXQocixvLHQuZ2V0KHIsbyktZVtyXSl9KHRoaXMsciksdGhpcztjYXNlImNvbHVtbiI6aWYoIUZlKHIpKXRocm93IG5ldyBUeXBlRXJyb3IoImNlbnRlciBtdXN0IGJlIGFuIGFycmF5Iik7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7Zm9yKGxldCByPTA7cjx0LnJvd3M7cisrKWZvcihsZXQgbz0wO288dC5jb2x1bW5zO28rKyl0LnNldChyLG8sdC5nZXQocixvKS1lW29dKX0odGhpcyxyKSx0aGlzO2Nhc2Ugdm9pZCAwOmlmKCJudW1iZXIiIT10eXBlb2Ygcil0aHJvdyBuZXcgVHlwZUVycm9yKCJjZW50ZXIgbXVzdCBiZSBhIG51bWJlciIpO3JldHVybiBmdW5jdGlvbih0LGUpe2ZvcihsZXQgcj0wO3I8dC5yb3dzO3IrKylmb3IobGV0IG89MDtvPHQuY29sdW1ucztvKyspdC5zZXQocixvLHQuZ2V0KHIsbyktZSl9KHRoaXMsciksdGhpcztkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgaW52YWxpZCBvcHRpb246ICR7dH1gKX19c2NhbGUodCxlPXt9KXtpZigib2JqZWN0Ij09dHlwZW9mIHQmJihlPXQsdD12b2lkIDApLCJvYmplY3QiIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0Iik7bGV0IHI9ZS5zY2FsZTtzd2l0Y2godCl7Y2FzZSJyb3ciOmlmKHZvaWQgMD09PXIpcj1mdW5jdGlvbih0KXtjb25zdCBlPVtdO2ZvcihsZXQgcj0wO3I8dC5yb3dzO3IrKyl7bGV0IG89MDtmb3IobGV0IGU9MDtlPHQuY29sdW1ucztlKyspbys9TWF0aC5wb3codC5nZXQocixlKSwyKS8odC5jb2x1bW5zLTEpO2UucHVzaChNYXRoLnNxcnQobykpfXJldHVybiBlfSh0aGlzKTtlbHNlIGlmKCFGZShyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJzY2FsZSBtdXN0IGJlIGFuIGFycmF5Iik7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7Zm9yKGxldCByPTA7cjx0LnJvd3M7cisrKWZvcihsZXQgbz0wO288dC5jb2x1bW5zO28rKyl0LnNldChyLG8sdC5nZXQocixvKS9lW3JdKX0odGhpcyxyKSx0aGlzO2Nhc2UiY29sdW1uIjppZih2b2lkIDA9PT1yKXI9ZnVuY3Rpb24odCl7Y29uc3QgZT1bXTtmb3IobGV0IHI9MDtyPHQuY29sdW1ucztyKyspe2xldCBvPTA7Zm9yKGxldCBlPTA7ZTx0LnJvd3M7ZSsrKW8rPU1hdGgucG93KHQuZ2V0KGUsciksMikvKHQucm93cy0xKTtlLnB1c2goTWF0aC5zcXJ0KG8pKX1yZXR1cm4gZX0odGhpcyk7ZWxzZSBpZighRmUocikpdGhyb3cgbmV3IFR5cGVFcnJvcigic2NhbGUgbXVzdCBiZSBhbiBhcnJheSIpO3JldHVybiBmdW5jdGlvbih0LGUpe2ZvcihsZXQgcj0wO3I8dC5yb3dzO3IrKylmb3IobGV0IG89MDtvPHQuY29sdW1ucztvKyspdC5zZXQocixvLHQuZ2V0KHIsbykvZVtvXSl9KHRoaXMsciksdGhpcztjYXNlIHZvaWQgMDppZih2b2lkIDA9PT1yKXI9ZnVuY3Rpb24odCl7Y29uc3QgZT10LnNpemUtMTtsZXQgcj0wO2ZvcihsZXQgbz0wO288dC5jb2x1bW5zO28rKylmb3IobGV0IG49MDtuPHQucm93cztuKyspcis9TWF0aC5wb3codC5nZXQobixvKSwyKS9lO3JldHVybiBNYXRoLnNxcnQocil9KHRoaXMpO2Vsc2UgaWYoIm51bWJlciIhPXR5cGVvZiByKXRocm93IG5ldyBUeXBlRXJyb3IoInNjYWxlIG11c3QgYmUgYSBudW1iZXIiKTtyZXR1cm4gZnVuY3Rpb24odCxlKXtmb3IobGV0IHI9MDtyPHQucm93cztyKyspZm9yKGxldCBvPTA7bzx0LmNvbHVtbnM7bysrKXQuc2V0KHIsbyx0LmdldChyLG8pL2UpfSh0aGlzLHIpLHRoaXM7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgb3B0aW9uOiAke3R9YCl9fXRvU3RyaW5nKHQpe3JldHVybiBWZSh0aGlzLHQpfX1mdW5jdGlvbiBKZSh0LGUpe3JldHVybiB0LWV9WGUucHJvdG90eXBlLmtsYXNzPSJNYXRyaXgiLCJ1bmRlZmluZWQiIT10eXBlb2YgU3ltYm9sJiYoWGUucHJvdG90eXBlW1N5bWJvbC5mb3IoIm5vZGVqcy51dGlsLmluc3BlY3QuY3VzdG9tIildPWZ1bmN0aW9uKCl7cmV0dXJuIFZlKHRoaXMpfSksWGUucmFuZG9tPVhlLnJhbmQsWGUucmFuZG9tSW50PVhlLnJhbmRJbnQsWGUuZGlhZ29uYWw9WGUuZGlhZyxYZS5wcm90b3R5cGUuZGlhZ29uYWw9WGUucHJvdG90eXBlLmRpYWcsWGUuaWRlbnRpdHk9WGUuZXllLFhlLnByb3RvdHlwZS5uZWdhdGU9WGUucHJvdG90eXBlLm5lZyxYZS5wcm90b3R5cGUudGVuc29yUHJvZHVjdD1YZS5wcm90b3R5cGUua3JvbmVja2VyUHJvZHVjdDtjbGFzcyBaZSBleHRlbmRzIFhle2NvbnN0cnVjdG9yKHQsZSl7aWYoc3VwZXIoKSxaZS5pc01hdHJpeCh0KSlyZXR1cm4gdC5jbG9uZSgpO2lmKE51bWJlci5pc0ludGVnZXIodCkmJnQ+PTApe2lmKHRoaXMuZGF0YT1bXSwhKE51bWJlci5pc0ludGVnZXIoZSkmJmU+PTApKXRocm93IG5ldyBUeXBlRXJyb3IoIm5Db2x1bW5zIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIik7Zm9yKGxldCByPTA7cjx0O3IrKyl0aGlzLmRhdGEucHVzaChuZXcgRmxvYXQ2NEFycmF5KGUpKX1lbHNle2lmKCFGZSh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJGaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyIG9yIGFuIGFycmF5Iik7e2NvbnN0IHI9dDtpZigibnVtYmVyIiE9dHlwZW9mKGU9KHQ9ci5sZW5ndGgpP3JbMF0ubGVuZ3RoOjApKXRocm93IG5ldyBUeXBlRXJyb3IoIkRhdGEgbXVzdCBiZSBhIDJEIGFycmF5IHdpdGggYXQgbGVhc3Qgb25lIGVsZW1lbnQiKTt0aGlzLmRhdGE9W107Zm9yKGxldCBvPTA7bzx0O28rKyl7aWYocltvXS5sZW5ndGghPT1lKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmNvbnNpc3RlbnQgYXJyYXkgZGltZW5zaW9ucyIpO2lmKCFyW29dLmV2ZXJ5KCh0PT4ibnVtYmVyIj09dHlwZW9mIHQpKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnB1dCBkYXRhIGNvbnRhaW5zIG5vbi1udW1lcmljIHZhbHVlcyIpO3RoaXMuZGF0YS5wdXNoKEZsb2F0NjRBcnJheS5mcm9tKHJbb10pKX19fXRoaXMucm93cz10LHRoaXMuY29sdW1ucz1lfXNldCh0LGUscil7cmV0dXJuIHRoaXMuZGF0YVt0XVtlXT1yLHRoaXN9Z2V0KHQsZSl7cmV0dXJuIHRoaXMuZGF0YVt0XVtlXX1yZW1vdmVSb3codCl7cmV0dXJuIERlKHRoaXMsdCksdGhpcy5kYXRhLnNwbGljZSh0LDEpLHRoaXMucm93cy09MSx0aGlzfWFkZFJvdyh0LGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT10LHQ9dGhpcy5yb3dzKSxEZSh0aGlzLHQsITApLGU9RmxvYXQ2NEFycmF5LmZyb20oTGUodGhpcyxlKSksdGhpcy5kYXRhLnNwbGljZSh0LDAsZSksdGhpcy5yb3dzKz0xLHRoaXN9cmVtb3ZlQ29sdW1uKHQpe1VlKHRoaXMsdCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKXtjb25zdCByPW5ldyBGbG9hdDY0QXJyYXkodGhpcy5jb2x1bW5zLTEpO2ZvcihsZXQgbz0wO288dDtvKyspcltvXT10aGlzLmRhdGFbZV1bb107Zm9yKGxldCBvPXQrMTtvPHRoaXMuY29sdW1ucztvKyspcltvLTFdPXRoaXMuZGF0YVtlXVtvXTt0aGlzLmRhdGFbZV09cn1yZXR1cm4gdGhpcy5jb2x1bW5zLT0xLHRoaXN9YWRkQ29sdW1uKHQsZSl7dm9pZCAwPT09ZSYmKGU9dCx0PXRoaXMuY29sdW1ucyksVWUodGhpcyx0LCEwKSxlPUdlKHRoaXMsZSk7Zm9yKGxldCByPTA7cjx0aGlzLnJvd3M7cisrKXtjb25zdCBvPW5ldyBGbG9hdDY0QXJyYXkodGhpcy5jb2x1bW5zKzEpO2xldCBuPTA7Zm9yKDtuPHQ7bisrKW9bbl09dGhpcy5kYXRhW3JdW25dO2ZvcihvW24rK109ZVtyXTtuPHRoaXMuY29sdW1ucysxO24rKylvW25dPXRoaXMuZGF0YVtyXVtuLTFdO3RoaXMuZGF0YVtyXT1vfXJldHVybiB0aGlzLmNvbHVtbnMrPTEsdGhpc319IWZ1bmN0aW9uKHQsZSl7dC5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90aGlzLmFkZFModCk6dGhpcy5hZGRNKHQpfSx0LnByb3RvdHlwZS5hZGRTPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikrdCk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLmFkZE09ZnVuY3Rpb24odCl7aWYodD1lLmNoZWNrTWF0cml4KHQpLHRoaXMucm93cyE9PXQucm93c3x8dGhpcy5jb2x1bW5zIT09dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpK3QuZ2V0KGUscikpO3JldHVybiB0aGlzfSx0LmFkZD1mdW5jdGlvbih0LHIpe3JldHVybiBuZXcgZSh0KS5hZGQocil9LHQucHJvdG90eXBlLnN1Yj1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/dGhpcy5zdWJTKHQpOnRoaXMuc3ViTSh0KX0sdC5wcm90b3R5cGUuc3ViUz1mdW5jdGlvbih0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpLXQpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5zdWJNPWZ1bmN0aW9uKHQpe2lmKHQ9ZS5jaGVja01hdHJpeCh0KSx0aGlzLnJvd3MhPT10LnJvd3N8fHRoaXMuY29sdW1ucyE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKS10LmdldChlLHIpKTtyZXR1cm4gdGhpc30sdC5zdWI9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbmV3IGUodCkuc3ViKHIpfSx0LnByb3RvdHlwZS5zdWJ0cmFjdD10LnByb3RvdHlwZS5zdWIsdC5wcm90b3R5cGUuc3VidHJhY3RTPXQucHJvdG90eXBlLnN1YlMsdC5wcm90b3R5cGUuc3VidHJhY3RNPXQucHJvdG90eXBlLnN1Yk0sdC5zdWJ0cmFjdD10LnN1Yix0LnByb3RvdHlwZS5tdWw9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3RoaXMubXVsUyh0KTp0aGlzLm11bE0odCl9LHQucHJvdG90eXBlLm11bFM9ZnVuY3Rpb24odCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKSp0KTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUubXVsTT1mdW5jdGlvbih0KXtpZih0PWUuY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikqdC5nZXQoZSxyKSk7cmV0dXJuIHRoaXN9LHQubXVsPWZ1bmN0aW9uKHQscil7cmV0dXJuIG5ldyBlKHQpLm11bChyKX0sdC5wcm90b3R5cGUubXVsdGlwbHk9dC5wcm90b3R5cGUubXVsLHQucHJvdG90eXBlLm11bHRpcGx5Uz10LnByb3RvdHlwZS5tdWxTLHQucHJvdG90eXBlLm11bHRpcGx5TT10LnByb3RvdHlwZS5tdWxNLHQubXVsdGlwbHk9dC5tdWwsdC5wcm90b3R5cGUuZGl2PWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90aGlzLmRpdlModCk6dGhpcy5kaXZNKHQpfSx0LnByb3RvdHlwZS5kaXZTPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikvdCk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLmRpdk09ZnVuY3Rpb24odCl7aWYodD1lLmNoZWNrTWF0cml4KHQpLHRoaXMucm93cyE9PXQucm93c3x8dGhpcy5jb2x1bW5zIT09dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpL3QuZ2V0KGUscikpO3JldHVybiB0aGlzfSx0LmRpdj1mdW5jdGlvbih0LHIpe3JldHVybiBuZXcgZSh0KS5kaXYocil9LHQucHJvdG90eXBlLmRpdmlkZT10LnByb3RvdHlwZS5kaXYsdC5wcm90b3R5cGUuZGl2aWRlUz10LnByb3RvdHlwZS5kaXZTLHQucHJvdG90eXBlLmRpdmlkZU09dC5wcm90b3R5cGUuZGl2TSx0LmRpdmlkZT10LmRpdix0LnByb3RvdHlwZS5tb2Q9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3RoaXMubW9kUyh0KTp0aGlzLm1vZE0odCl9LHQucHJvdG90eXBlLm1vZFM9ZnVuY3Rpb24odCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKSV0KTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUubW9kTT1mdW5jdGlvbih0KXtpZih0PWUuY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikldC5nZXQoZSxyKSk7cmV0dXJuIHRoaXN9LHQubW9kPWZ1bmN0aW9uKHQscil7cmV0dXJuIG5ldyBlKHQpLm1vZChyKX0sdC5wcm90b3R5cGUubW9kdWx1cz10LnByb3RvdHlwZS5tb2QsdC5wcm90b3R5cGUubW9kdWx1c1M9dC5wcm90b3R5cGUubW9kUyx0LnByb3RvdHlwZS5tb2R1bHVzTT10LnByb3RvdHlwZS5tb2RNLHQubW9kdWx1cz10Lm1vZCx0LnByb3RvdHlwZS5hbmQ9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3RoaXMuYW5kUyh0KTp0aGlzLmFuZE0odCl9LHQucHJvdG90eXBlLmFuZFM9ZnVuY3Rpb24odCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKSZ0KTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUuYW5kTT1mdW5jdGlvbih0KXtpZih0PWUuY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikmdC5nZXQoZSxyKSk7cmV0dXJuIHRoaXN9LHQuYW5kPWZ1bmN0aW9uKHQscil7cmV0dXJuIG5ldyBlKHQpLmFuZChyKX0sdC5wcm90b3R5cGUub3I9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3RoaXMub3JTKHQpOnRoaXMub3JNKHQpfSx0LnByb3RvdHlwZS5vclM9ZnVuY3Rpb24odCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKXx0KTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUub3JNPWZ1bmN0aW9uKHQpe2lmKHQ9ZS5jaGVja01hdHJpeCh0KSx0aGlzLnJvd3MhPT10LnJvd3N8fHRoaXMuY29sdW1ucyE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKXx0LmdldChlLHIpKTtyZXR1cm4gdGhpc30sdC5vcj1mdW5jdGlvbih0LHIpe3JldHVybiBuZXcgZSh0KS5vcihyKX0sdC5wcm90b3R5cGUueG9yPWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90aGlzLnhvclModCk6dGhpcy54b3JNKHQpfSx0LnByb3RvdHlwZS54b3JTPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUsciledCk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLnhvck09ZnVuY3Rpb24odCl7aWYodD1lLmNoZWNrTWF0cml4KHQpLHRoaXMucm93cyE9PXQucm93c3x8dGhpcy5jb2x1bW5zIT09dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpXnQuZ2V0KGUscikpO3JldHVybiB0aGlzfSx0Lnhvcj1mdW5jdGlvbih0LHIpe3JldHVybiBuZXcgZSh0KS54b3Iocil9LHQucHJvdG90eXBlLmxlZnRTaGlmdD1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/dGhpcy5sZWZ0U2hpZnRTKHQpOnRoaXMubGVmdFNoaWZ0TSh0KX0sdC5wcm90b3R5cGUubGVmdFNoaWZ0Uz1mdW5jdGlvbih0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpPDx0KTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUubGVmdFNoaWZ0TT1mdW5jdGlvbih0KXtpZih0PWUuY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscik8PHQuZ2V0KGUscikpO3JldHVybiB0aGlzfSx0LmxlZnRTaGlmdD1mdW5jdGlvbih0LHIpe3JldHVybiBuZXcgZSh0KS5sZWZ0U2hpZnQocil9LHQucHJvdG90eXBlLnNpZ25Qcm9wYWdhdGluZ1JpZ2h0U2hpZnQ9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3RoaXMuc2lnblByb3BhZ2F0aW5nUmlnaHRTaGlmdFModCk6dGhpcy5zaWduUHJvcGFnYXRpbmdSaWdodFNoaWZ0TSh0KX0sdC5wcm90b3R5cGUuc2lnblByb3BhZ2F0aW5nUmlnaHRTaGlmdFM9ZnVuY3Rpb24odCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKT4+dCk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLnNpZ25Qcm9wYWdhdGluZ1JpZ2h0U2hpZnRNPWZ1bmN0aW9uKHQpe2lmKHQ9ZS5jaGVja01hdHJpeCh0KSx0aGlzLnJvd3MhPT10LnJvd3N8fHRoaXMuY29sdW1ucyE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKT4+dC5nZXQoZSxyKSk7cmV0dXJuIHRoaXN9LHQuc2lnblByb3BhZ2F0aW5nUmlnaHRTaGlmdD1mdW5jdGlvbih0LHIpe3JldHVybiBuZXcgZSh0KS5zaWduUHJvcGFnYXRpbmdSaWdodFNoaWZ0KHIpfSx0LnByb3RvdHlwZS5yaWdodFNoaWZ0PWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90aGlzLnJpZ2h0U2hpZnRTKHQpOnRoaXMucmlnaHRTaGlmdE0odCl9LHQucHJvdG90eXBlLnJpZ2h0U2hpZnRTPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscik+Pj50KTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUucmlnaHRTaGlmdE09ZnVuY3Rpb24odCl7aWYodD1lLmNoZWNrTWF0cml4KHQpLHRoaXMucm93cyE9PXQucm93c3x8dGhpcy5jb2x1bW5zIT09dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpPj4+dC5nZXQoZSxyKSk7cmV0dXJuIHRoaXN9LHQucmlnaHRTaGlmdD1mdW5jdGlvbih0LHIpe3JldHVybiBuZXcgZSh0KS5yaWdodFNoaWZ0KHIpfSx0LnByb3RvdHlwZS56ZXJvRmlsbFJpZ2h0U2hpZnQ9dC5wcm90b3R5cGUucmlnaHRTaGlmdCx0LnByb3RvdHlwZS56ZXJvRmlsbFJpZ2h0U2hpZnRTPXQucHJvdG90eXBlLnJpZ2h0U2hpZnRTLHQucHJvdG90eXBlLnplcm9GaWxsUmlnaHRTaGlmdE09dC5wcm90b3R5cGUucmlnaHRTaGlmdE0sdC56ZXJvRmlsbFJpZ2h0U2hpZnQ9dC5yaWdodFNoaWZ0LHQucHJvdG90eXBlLm5vdD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLH50aGlzLmdldCh0LGUpKTtyZXR1cm4gdGhpc30sdC5ub3Q9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLm5vdCgpfSx0LnByb3RvdHlwZS5hYnM9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmFicyh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuYWJzPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5hYnMoKX0sdC5wcm90b3R5cGUuYWNvcz1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguYWNvcyh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuYWNvcz1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuYWNvcygpfSx0LnByb3RvdHlwZS5hY29zaD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguYWNvc2godGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmFjb3NoPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5hY29zaCgpfSx0LnByb3RvdHlwZS5hc2luPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5hc2luKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5hc2luPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5hc2luKCl9LHQucHJvdG90eXBlLmFzaW5oPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5hc2luaCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuYXNpbmg9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmFzaW5oKCl9LHQucHJvdG90eXBlLmF0YW49ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmF0YW4odGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmF0YW49ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmF0YW4oKX0sdC5wcm90b3R5cGUuYXRhbmg9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmF0YW5oKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5hdGFuaD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuYXRhbmgoKX0sdC5wcm90b3R5cGUuY2JydD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguY2JydCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuY2JydD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuY2JydCgpfSx0LnByb3RvdHlwZS5jZWlsPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5jZWlsKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5jZWlsPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5jZWlsKCl9LHQucHJvdG90eXBlLmNsejMyPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5jbHozMih0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuY2x6MzI9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmNsejMyKCl9LHQucHJvdG90eXBlLmNvcz1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguY29zKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5jb3M9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmNvcygpfSx0LnByb3RvdHlwZS5jb3NoPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5jb3NoKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5jb3NoPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5jb3NoKCl9LHQucHJvdG90eXBlLmV4cD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguZXhwKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5leHA9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmV4cCgpfSx0LnByb3RvdHlwZS5leHBtMT1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguZXhwbTEodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmV4cG0xPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5leHBtMSgpfSx0LnByb3RvdHlwZS5mbG9vcj1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguZmxvb3IodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmZsb29yPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5mbG9vcigpfSx0LnByb3RvdHlwZS5mcm91bmQ9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmZyb3VuZCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuZnJvdW5kPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5mcm91bmQoKX0sdC5wcm90b3R5cGUubG9nPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5sb2codGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmxvZz1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkubG9nKCl9LHQucHJvdG90eXBlLmxvZzFwPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5sb2cxcCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQubG9nMXA9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmxvZzFwKCl9LHQucHJvdG90eXBlLmxvZzEwPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5sb2cxMCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQubG9nMTA9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmxvZzEwKCl9LHQucHJvdG90eXBlLmxvZzI9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmxvZzIodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmxvZzI9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmxvZzIoKX0sdC5wcm90b3R5cGUucm91bmQ9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLnJvdW5kKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5yb3VuZD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkucm91bmQoKX0sdC5wcm90b3R5cGUuc2lnbj1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguc2lnbih0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuc2lnbj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuc2lnbigpfSx0LnByb3RvdHlwZS5zaW49ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLnNpbih0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuc2luPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5zaW4oKX0sdC5wcm90b3R5cGUuc2luaD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguc2luaCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuc2luaD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuc2luaCgpfSx0LnByb3RvdHlwZS5zcXJ0PWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5zcXJ0KHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5zcXJ0PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5zcXJ0KCl9LHQucHJvdG90eXBlLnRhbj1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGgudGFuKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC50YW49ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLnRhbigpfSx0LnByb3RvdHlwZS50YW5oPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC50YW5oKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC50YW5oPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS50YW5oKCl9LHQucHJvdG90eXBlLnRydW5jPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC50cnVuYyh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQudHJ1bmM9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLnRydW5jKCl9LHQucG93PWZ1bmN0aW9uKHQscil7cmV0dXJuIG5ldyBlKHQpLnBvdyhyKX0sdC5wcm90b3R5cGUucG93PWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90aGlzLnBvd1ModCk6dGhpcy5wb3dNKHQpfSx0LnByb3RvdHlwZS5wb3dTPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLE1hdGgucG93KHRoaXMuZ2V0KGUsciksdCkpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5wb3dNPWZ1bmN0aW9uKHQpe2lmKHQ9ZS5jaGVja01hdHJpeCh0KSx0aGlzLnJvd3MhPT10LnJvd3N8fHRoaXMuY29sdW1ucyE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsTWF0aC5wb3codGhpcy5nZXQoZSxyKSx0LmdldChlLHIpKSk7cmV0dXJuIHRoaXN9fShYZSxaZSk7Y2xhc3MgSGUgZXh0ZW5kcyBYZXtjb25zdHJ1Y3Rvcih0LGUscil7c3VwZXIoKSx0aGlzLm1hdHJpeD10LHRoaXMucm93cz1lLHRoaXMuY29sdW1ucz1yfX1jbGFzcyBRZSBleHRlbmRzIEhle2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQsdC5jb2x1bW5zLHQucm93cyl9c2V0KHQsZSxyKXtyZXR1cm4gdGhpcy5tYXRyaXguc2V0KGUsdCxyKSx0aGlzfWdldCh0LGUpe3JldHVybiB0aGlzLm1hdHJpeC5nZXQoZSx0KX19Y2xhc3MgdHIgZXh0ZW5kcyBYZXtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMuZGF0YT10LHRoaXMucm93cz10Lmxlbmd0aCx0aGlzLmNvbHVtbnM9dFswXS5sZW5ndGh9c2V0KHQsZSxyKXtyZXR1cm4gdGhpcy5kYXRhW3RdW2VdPXIsdGhpc31nZXQodCxlKXtyZXR1cm4gdGhpcy5kYXRhW3RdW2VdfX1mdW5jdGlvbiBlcih0LGUpe2xldCByPTA7cmV0dXJuIE1hdGguYWJzKHQpPk1hdGguYWJzKGUpPyhyPWUvdCxNYXRoLmFicyh0KSpNYXRoLnNxcnQoMStyKnIpKTowIT09ZT8ocj10L2UsTWF0aC5hYnMoZSkqTWF0aC5zcXJ0KDErcipyKSk6MH1jbGFzcyBycntjb25zdHJ1Y3Rvcih0LGU9e30pe2lmKCh0PXRyLmNoZWNrTWF0cml4KHQpKS5pc0VtcHR5KCkpdGhyb3cgbmV3IEVycm9yKCJNYXRyaXggbXVzdCBiZSBub24tZW1wdHkiKTtsZXQgcj10LnJvd3Msbz10LmNvbHVtbnM7Y29uc3R7Y29tcHV0ZUxlZnRTaW5ndWxhclZlY3RvcnM6bj0hMCxjb21wdXRlUmlnaHRTaW5ndWxhclZlY3RvcnM6cz0hMCxhdXRvVHJhbnNwb3NlOmk9ITF9PWU7bGV0IHUsaD1Cb29sZWFuKG4pLGE9Qm9vbGVhbihzKSxsPSExO2lmKHI8bylpZihpKXt1PXQudHJhbnNwb3NlKCkscj11LnJvd3Msbz11LmNvbHVtbnMsbD0hMDtsZXQgZT1oO2g9YSxhPWV9ZWxzZSB1PXQuY2xvbmUoKSxjb25zb2xlLndhcm4oIkNvbXB1dGluZyBTVkQgb24gYSBtYXRyaXggd2l0aCBtb3JlIGNvbHVtbnMgdGhhbiByb3dzLiBDb25zaWRlciBlbmFibGluZyBhdXRvVHJhbnNwb3NlIik7ZWxzZSB1PXQuY2xvbmUoKTtsZXQgYz1NYXRoLm1pbihyLG8pLGY9TWF0aC5taW4ocisxLG8pLG09bmV3IEZsb2F0NjRBcnJheShmKSxnPW5ldyBaZShyLGMpLHA9bmV3IFplKG8sbyksdz1uZXcgRmxvYXQ2NEFycmF5KG8pLGQ9bmV3IEZsb2F0NjRBcnJheShyKSxiPW5ldyBGbG9hdDY0QXJyYXkoZik7Zm9yKGxldCB0PTA7dDxmO3QrKyliW3RdPXQ7bGV0IHk9TWF0aC5taW4oci0xLG8pLHY9TWF0aC5tYXgoMCxNYXRoLm1pbihvLTIscikpLE09TWF0aC5tYXgoeSx2KTtmb3IobGV0IHQ9MDt0PE07dCsrKXtpZih0PHkpe21bdF09MDtmb3IobGV0IGU9dDtlPHI7ZSsrKW1bdF09ZXIobVt0XSx1LmdldChlLHQpKTtpZigwIT09bVt0XSl7dS5nZXQodCx0KTwwJiYobVt0XT0tbVt0XSk7Zm9yKGxldCBlPXQ7ZTxyO2UrKyl1LnNldChlLHQsdS5nZXQoZSx0KS9tW3RdKTt1LnNldCh0LHQsdS5nZXQodCx0KSsxKX1tW3RdPS1tW3RdfWZvcihsZXQgZT10KzE7ZTxvO2UrKyl7aWYodDx5JiYwIT09bVt0XSl7bGV0IG89MDtmb3IobGV0IG49dDtuPHI7bisrKW8rPXUuZ2V0KG4sdCkqdS5nZXQobixlKTtvPS1vL3UuZ2V0KHQsdCk7Zm9yKGxldCBuPXQ7bjxyO24rKyl1LnNldChuLGUsdS5nZXQobixlKStvKnUuZ2V0KG4sdCkpfXdbZV09dS5nZXQodCxlKX1pZihoJiZ0PHkpZm9yKGxldCBlPXQ7ZTxyO2UrKylnLnNldChlLHQsdS5nZXQoZSx0KSk7aWYodDx2KXt3W3RdPTA7Zm9yKGxldCBlPXQrMTtlPG87ZSsrKXdbdF09ZXIod1t0XSx3W2VdKTtpZigwIT09d1t0XSl7d1t0KzFdPDAmJih3W3RdPTAtd1t0XSk7Zm9yKGxldCBlPXQrMTtlPG87ZSsrKXdbZV0vPXdbdF07d1t0KzFdKz0xfWlmKHdbdF09LXdbdF0sdCsxPHImJjAhPT13W3RdKXtmb3IobGV0IGU9dCsxO2U8cjtlKyspZFtlXT0wO2ZvcihsZXQgZT10KzE7ZTxyO2UrKylmb3IobGV0IHI9dCsxO3I8bztyKyspZFtlXSs9d1tyXSp1LmdldChlLHIpO2ZvcihsZXQgZT10KzE7ZTxvO2UrKyl7bGV0IG89LXdbZV0vd1t0KzFdO2ZvcihsZXQgbj10KzE7bjxyO24rKyl1LnNldChuLGUsdS5nZXQobixlKStvKmRbbl0pfX1pZihhKWZvcihsZXQgZT10KzE7ZTxvO2UrKylwLnNldChlLHQsd1tlXSl9fWxldCB4PU1hdGgubWluKG8scisxKTtpZih5PG8mJihtW3ldPXUuZ2V0KHkseSkpLHI8eCYmKG1beC0xXT0wKSx2KzE8eCYmKHdbdl09dS5nZXQodix4LTEpKSx3W3gtMV09MCxoKXtmb3IobGV0IHQ9eTt0PGM7dCsrKXtmb3IobGV0IGU9MDtlPHI7ZSsrKWcuc2V0KGUsdCwwKTtnLnNldCh0LHQsMSl9Zm9yKGxldCB0PXktMTt0Pj0wO3QtLSlpZigwIT09bVt0XSl7Zm9yKGxldCBlPXQrMTtlPGM7ZSsrKXtsZXQgbz0wO2ZvcihsZXQgbj10O248cjtuKyspbys9Zy5nZXQobix0KSpnLmdldChuLGUpO289LW8vZy5nZXQodCx0KTtmb3IobGV0IG49dDtuPHI7bisrKWcuc2V0KG4sZSxnLmdldChuLGUpK28qZy5nZXQobix0KSl9Zm9yKGxldCBlPXQ7ZTxyO2UrKylnLnNldChlLHQsLWcuZ2V0KGUsdCkpO2cuc2V0KHQsdCwxK2cuZ2V0KHQsdCkpO2ZvcihsZXQgZT0wO2U8dC0xO2UrKylnLnNldChlLHQsMCl9ZWxzZXtmb3IobGV0IGU9MDtlPHI7ZSsrKWcuc2V0KGUsdCwwKTtnLnNldCh0LHQsMSl9fWlmKGEpZm9yKGxldCB0PW8tMTt0Pj0wO3QtLSl7aWYodDx2JiYwIT09d1t0XSlmb3IobGV0IGU9dCsxO2U8bztlKyspe2xldCByPTA7Zm9yKGxldCBuPXQrMTtuPG87bisrKXIrPXAuZ2V0KG4sdCkqcC5nZXQobixlKTtyPS1yL3AuZ2V0KHQrMSx0KTtmb3IobGV0IG49dCsxO248bztuKyspcC5zZXQobixlLHAuZ2V0KG4sZSkrcipwLmdldChuLHQpKX1mb3IobGV0IGU9MDtlPG87ZSsrKXAuc2V0KGUsdCwwKTtwLnNldCh0LHQsMSl9bGV0IEU9eC0xLFM9TnVtYmVyLkVQU0lMT047Zm9yKDt4PjA7KXtsZXQgdCxlO2Zvcih0PXgtMjt0Pj0tMSYmLTEhPT10O3QtLSl7Y29uc3QgZT1OdW1iZXIuTUlOX1ZBTFVFK1MqTWF0aC5hYnMobVt0XStNYXRoLmFicyhtW3QrMV0pKTtpZihNYXRoLmFicyh3W3RdKTw9ZXx8TnVtYmVyLmlzTmFOKHdbdF0pKXt3W3RdPTA7YnJlYWt9fWlmKHQ9PT14LTIpZT00O2Vsc2V7bGV0IHI7Zm9yKHI9eC0xO3I+PXQmJnIhPT10O3ItLSl7bGV0IGU9KHIhPT14P01hdGguYWJzKHdbcl0pOjApKyhyIT09dCsxP01hdGguYWJzKHdbci0xXSk6MCk7aWYoTWF0aC5hYnMobVtyXSk8PVMqZSl7bVtyXT0wO2JyZWFrfX1yPT09dD9lPTM6cj09PXgtMT9lPTE6KGU9Mix0PXIpfXN3aXRjaCh0KyssZSl7Y2FzZSAxOntsZXQgZT13W3gtMl07d1t4LTJdPTA7Zm9yKGxldCByPXgtMjtyPj10O3ItLSl7bGV0IG49ZXIobVtyXSxlKSxzPW1bcl0vbixpPWUvbjtpZihtW3JdPW4sciE9PXQmJihlPS1pKndbci0xXSx3W3ItMV09cyp3W3ItMV0pLGEpZm9yKGxldCB0PTA7dDxvO3QrKyluPXMqcC5nZXQodCxyKStpKnAuZ2V0KHQseC0xKSxwLnNldCh0LHgtMSwtaSpwLmdldCh0LHIpK3MqcC5nZXQodCx4LTEpKSxwLnNldCh0LHIsbil9YnJlYWt9Y2FzZSAyOntsZXQgZT13W3QtMV07d1t0LTFdPTA7Zm9yKGxldCBvPXQ7bzx4O28rKyl7bGV0IG49ZXIobVtvXSxlKSxzPW1bb10vbixpPWUvbjtpZihtW29dPW4sZT0taSp3W29dLHdbb109cyp3W29dLGgpZm9yKGxldCBlPTA7ZTxyO2UrKyluPXMqZy5nZXQoZSxvKStpKmcuZ2V0KGUsdC0xKSxnLnNldChlLHQtMSwtaSpnLmdldChlLG8pK3MqZy5nZXQoZSx0LTEpKSxnLnNldChlLG8sbil9YnJlYWt9Y2FzZSAzOntjb25zdCBlPU1hdGgubWF4KE1hdGguYWJzKG1beC0xXSksTWF0aC5hYnMobVt4LTJdKSxNYXRoLmFicyh3W3gtMl0pLE1hdGguYWJzKG1bdF0pLE1hdGguYWJzKHdbdF0pKSxuPW1beC0xXS9lLHM9bVt4LTJdL2UsaT13W3gtMl0vZSx1PW1bdF0vZSxsPXdbdF0vZSxjPSgocytuKSoocy1uKStpKmkpLzIsZj1uKmkqKG4qaSk7bGV0IGQ9MDswPT09YyYmMD09PWZ8fChkPWM8MD8wLU1hdGguc3FydChjKmMrZik6TWF0aC5zcXJ0KGMqYytmKSxkPWYvKGMrZCkpO2xldCBiPSh1K24pKih1LW4pK2QseT11Kmw7Zm9yKGxldCBlPXQ7ZTx4LTE7ZSsrKXtsZXQgbj1lcihiLHkpOzA9PT1uJiYobj1OdW1iZXIuTUlOX1ZBTFVFKTtsZXQgcz1iL24saT15L247aWYoZSE9PXQmJih3W2UtMV09biksYj1zKm1bZV0raSp3W2VdLHdbZV09cyp3W2VdLWkqbVtlXSx5PWkqbVtlKzFdLG1bZSsxXT1zKm1bZSsxXSxhKWZvcihsZXQgdD0wO3Q8bzt0Kyspbj1zKnAuZ2V0KHQsZSkraSpwLmdldCh0LGUrMSkscC5zZXQodCxlKzEsLWkqcC5nZXQodCxlKStzKnAuZ2V0KHQsZSsxKSkscC5zZXQodCxlLG4pO2lmKG49ZXIoYix5KSwwPT09biYmKG49TnVtYmVyLk1JTl9WQUxVRSkscz1iL24saT15L24sbVtlXT1uLGI9cyp3W2VdK2kqbVtlKzFdLG1bZSsxXT0taSp3W2VdK3MqbVtlKzFdLHk9aSp3W2UrMV0sd1tlKzFdPXMqd1tlKzFdLGgmJmU8ci0xKWZvcihsZXQgdD0wO3Q8cjt0Kyspbj1zKmcuZ2V0KHQsZSkraSpnLmdldCh0LGUrMSksZy5zZXQodCxlKzEsLWkqZy5nZXQodCxlKStzKmcuZ2V0KHQsZSsxKSksZy5zZXQodCxlLG4pfXdbeC0yXT1iO2JyZWFrfWNhc2UgNDppZihtW3RdPD0wJiYobVt0XT1tW3RdPDA/LW1bdF06MCxhKSlmb3IobGV0IGU9MDtlPD1FO2UrKylwLnNldChlLHQsLXAuZ2V0KGUsdCkpO2Zvcig7dDxFJiYhKG1bdF0+PW1bdCsxXSk7KXtsZXQgZT1tW3RdO2lmKG1bdF09bVt0KzFdLG1bdCsxXT1lLGEmJnQ8by0xKWZvcihsZXQgcj0wO3I8bztyKyspZT1wLmdldChyLHQrMSkscC5zZXQocix0KzEscC5nZXQocix0KSkscC5zZXQocix0LGUpO2lmKGgmJnQ8ci0xKWZvcihsZXQgbz0wO288cjtvKyspZT1nLmdldChvLHQrMSksZy5zZXQobyx0KzEsZy5nZXQobyx0KSksZy5zZXQobyx0LGUpO3QrK314LS19fWlmKGwpe2xldCB0PXA7cD1nLGc9dH10aGlzLm09cix0aGlzLm49byx0aGlzLnM9bSx0aGlzLlU9Zyx0aGlzLlY9cH1zb2x2ZSh0KXtsZXQgZT10LHI9dGhpcy50aHJlc2hvbGQsbz10aGlzLnMubGVuZ3RoLG49WmUuemVyb3MobyxvKTtmb3IobGV0IHQ9MDt0PG87dCsrKU1hdGguYWJzKHRoaXMuc1t0XSk8PXI/bi5zZXQodCx0LDApOm4uc2V0KHQsdCwxL3RoaXMuc1t0XSk7bGV0IHM9dGhpcy5VLGk9dGhpcy5yaWdodFNpbmd1bGFyVmVjdG9ycyx1PWkubW11bChuKSxoPWkucm93cyxhPXMucm93cyxsPVplLnplcm9zKGgsYSk7Zm9yKGxldCB0PTA7dDxoO3QrKylmb3IobGV0IGU9MDtlPGE7ZSsrKXtsZXQgcj0wO2ZvcihsZXQgbj0wO248bztuKyspcis9dS5nZXQodCxuKSpzLmdldChlLG4pO2wuc2V0KHQsZSxyKX1yZXR1cm4gbC5tbXVsKGUpfXNvbHZlRm9yRGlhZ29uYWwodCl7cmV0dXJuIHRoaXMuc29sdmUoWmUuZGlhZyh0KSl9aW52ZXJzZSgpe2xldCB0PXRoaXMuVixlPXRoaXMudGhyZXNob2xkLHI9dC5yb3dzLG89dC5jb2x1bW5zLG49bmV3IFplKHIsdGhpcy5zLmxlbmd0aCk7Zm9yKGxldCBzPTA7czxyO3MrKylmb3IobGV0IHI9MDtyPG87cisrKU1hdGguYWJzKHRoaXMuc1tyXSk+ZSYmbi5zZXQocyxyLHQuZ2V0KHMscikvdGhpcy5zW3JdKTtsZXQgcz10aGlzLlUsaT1zLnJvd3MsdT1zLmNvbHVtbnMsaD1uZXcgWmUocixpKTtmb3IobGV0IHQ9MDt0PHI7dCsrKWZvcihsZXQgZT0wO2U8aTtlKyspe2xldCByPTA7Zm9yKGxldCBvPTA7bzx1O28rKylyKz1uLmdldCh0LG8pKnMuZ2V0KGUsbyk7aC5zZXQodCxlLHIpfXJldHVybiBofWdldCBjb25kaXRpb24oKXtyZXR1cm4gdGhpcy5zWzBdL3RoaXMuc1tNYXRoLm1pbih0aGlzLm0sdGhpcy5uKS0xXX1nZXQgbm9ybTIoKXtyZXR1cm4gdGhpcy5zWzBdfWdldCByYW5rKCl7bGV0IHQ9TWF0aC5tYXgodGhpcy5tLHRoaXMubikqdGhpcy5zWzBdKk51bWJlci5FUFNJTE9OLGU9MCxyPXRoaXMucztmb3IobGV0IG89MCxuPXIubGVuZ3RoO288bjtvKyspcltvXT50JiZlKys7cmV0dXJuIGV9Z2V0IGRpYWdvbmFsKCl7cmV0dXJuIEFycmF5LmZyb20odGhpcy5zKX1nZXQgdGhyZXNob2xkKCl7cmV0dXJuIE51bWJlci5FUFNJTE9OLzIqTWF0aC5tYXgodGhpcy5tLHRoaXMubikqdGhpcy5zWzBdfWdldCBsZWZ0U2luZ3VsYXJWZWN0b3JzKCl7cmV0dXJuIHRoaXMuVX1nZXQgcmlnaHRTaW5ndWxhclZlY3RvcnMoKXtyZXR1cm4gdGhpcy5WfWdldCBkaWFnb25hbE1hdHJpeCgpe3JldHVybiBaZS5kaWFnKHRoaXMucyl9fWNsYXNzIG9ye2NvbnN0cnVjdG9yKHQsZT17fSl7Y29uc3R7YXNzdW1lU3ltbWV0cmljOnI9ITF9PWU7aWYoISh0PXRyLmNoZWNrTWF0cml4KHQpKS5pc1NxdWFyZSgpKXRocm93IG5ldyBFcnJvcigiTWF0cml4IGlzIG5vdCBhIHNxdWFyZSBtYXRyaXgiKTtpZih0LmlzRW1wdHkoKSl0aHJvdyBuZXcgRXJyb3IoIk1hdHJpeCBtdXN0IGJlIG5vbi1lbXB0eSIpO2xldCBvLG4scz10LmNvbHVtbnMsaT1uZXcgWmUocyxzKSx1PW5ldyBGbG9hdDY0QXJyYXkocyksaD1uZXcgRmxvYXQ2NEFycmF5KHMpLGE9dCxsPSExO2lmKGw9ISFyfHx0LmlzU3ltbWV0cmljKCksbCl7Zm9yKG89MDtvPHM7bysrKWZvcihuPTA7bjxzO24rKylpLnNldChvLG4sYS5nZXQobyxuKSk7IWZ1bmN0aW9uKHQsZSxyLG8pe2xldCBuLHMsaSx1LGgsYSxsLGM7Zm9yKGg9MDtoPHQ7aCsrKXJbaF09by5nZXQodC0xLGgpO2Zvcih1PXQtMTt1PjA7dS0tKXtmb3IoYz0wLGk9MCxhPTA7YTx1O2ErKyljKz1NYXRoLmFicyhyW2FdKTtpZigwPT09Yylmb3IoZVt1XT1yW3UtMV0saD0wO2g8dTtoKyspcltoXT1vLmdldCh1LTEsaCksby5zZXQodSxoLDApLG8uc2V0KGgsdSwwKTtlbHNle2ZvcihhPTA7YTx1O2ErKylyW2FdLz1jLGkrPXJbYV0qclthXTtmb3Iobj1yW3UtMV0scz1NYXRoLnNxcnQoaSksbj4wJiYocz0tcyksZVt1XT1jKnMsaS09bipzLHJbdS0xXT1uLXMsaD0wO2g8dTtoKyspZVtoXT0wO2ZvcihoPTA7aDx1O2grKyl7Zm9yKG49cltoXSxvLnNldChoLHUsbikscz1lW2hdK28uZ2V0KGgsaCkqbixhPWgrMTthPD11LTE7YSsrKXMrPW8uZ2V0KGEsaCkqclthXSxlW2FdKz1vLmdldChhLGgpKm47ZVtoXT1zfWZvcihuPTAsaD0wO2g8dTtoKyspZVtoXS89aSxuKz1lW2hdKnJbaF07Zm9yKGw9bi8oaStpKSxoPTA7aDx1O2grKyllW2hdLT1sKnJbaF07Zm9yKGg9MDtoPHU7aCsrKXtmb3Iobj1yW2hdLHM9ZVtoXSxhPWg7YTw9dS0xO2ErKylvLnNldChhLGgsby5nZXQoYSxoKS0obiplW2FdK3MqclthXSkpO3JbaF09by5nZXQodS0xLGgpLG8uc2V0KHUsaCwwKX19clt1XT1pfWZvcih1PTA7dTx0LTE7dSsrKXtpZihvLnNldCh0LTEsdSxvLmdldCh1LHUpKSxvLnNldCh1LHUsMSksaT1yW3UrMV0sMCE9PWkpe2ZvcihhPTA7YTw9dTthKyspclthXT1vLmdldChhLHUrMSkvaTtmb3IoaD0wO2g8PXU7aCsrKXtmb3Iocz0wLGE9MDthPD11O2ErKylzKz1vLmdldChhLHUrMSkqby5nZXQoYSxoKTtmb3IoYT0wO2E8PXU7YSsrKW8uc2V0KGEsaCxvLmdldChhLGgpLXMqclthXSl9fWZvcihhPTA7YTw9dTthKyspby5zZXQoYSx1KzEsMCl9Zm9yKGg9MDtoPHQ7aCsrKXJbaF09by5nZXQodC0xLGgpLG8uc2V0KHQtMSxoLDApO28uc2V0KHQtMSx0LTEsMSksZVswXT0wfShzLGgsdSxpKSxmdW5jdGlvbih0LGUscixvKXtsZXQgbixzLGksdSxoLGEsbCxjLGYsbSxnLHAsdyxkLGIseTtmb3IoaT0xO2k8dDtpKyspZVtpLTFdPWVbaV07ZVt0LTFdPTA7bGV0IHY9MCxNPTAseD1OdW1iZXIuRVBTSUxPTjtmb3IoYT0wO2E8dDthKyspe2ZvcihNPU1hdGgubWF4KE0sTWF0aC5hYnMoclthXSkrTWF0aC5hYnMoZVthXSkpLGw9YTtsPHQmJiEoTWF0aC5hYnMoZVtsXSk8PXgqTSk7KWwrKztpZihsPmEpZG97Zm9yKG49clthXSxjPShyW2ErMV0tbikvKDIqZVthXSksZj1lcihjLDEpLGM8MCYmKGY9LWYpLHJbYV09ZVthXS8oYytmKSxyW2ErMV09ZVthXSooYytmKSxtPXJbYSsxXSxzPW4tclthXSxpPWErMjtpPHQ7aSsrKXJbaV0tPXM7Zm9yKHYrPXMsYz1yW2xdLGc9MSxwPWcsdz1nLGQ9ZVthKzFdLGI9MCx5PTAsaT1sLTE7aT49YTtpLS0pZm9yKHc9cCxwPWcseT1iLG49ZyplW2ldLHM9ZypjLGY9ZXIoYyxlW2ldKSxlW2krMV09YipmLGI9ZVtpXS9mLGc9Yy9mLGM9ZypyW2ldLWIqbixyW2krMV09cytiKihnKm4rYipyW2ldKSxoPTA7aDx0O2grKylzPW8uZ2V0KGgsaSsxKSxvLnNldChoLGkrMSxiKm8uZ2V0KGgsaSkrZypzKSxvLnNldChoLGksZypvLmdldChoLGkpLWIqcyk7Yz0tYip5KncqZCplW2FdL20sZVthXT1iKmMsclthXT1nKmN9d2hpbGUoTWF0aC5hYnMoZVthXSk+eCpNKTtyW2FdPXJbYV0rdixlW2FdPTB9Zm9yKGk9MDtpPHQtMTtpKyspe2ZvcihoPWksYz1yW2ldLHU9aSsxO3U8dDt1Kyspclt1XTxjJiYoaD11LGM9clt1XSk7aWYoaCE9PWkpZm9yKHJbaF09cltpXSxyW2ldPWMsdT0wO3U8dDt1KyspYz1vLmdldCh1LGkpLG8uc2V0KHUsaSxvLmdldCh1LGgpKSxvLnNldCh1LGgsYyl9fShzLGgsdSxpKX1lbHNle2xldCB0PW5ldyBaZShzLHMpLGU9bmV3IEZsb2F0NjRBcnJheShzKTtmb3Iobj0wO248cztuKyspZm9yKG89MDtvPHM7bysrKXQuc2V0KG8sbixhLmdldChvLG4pKTshZnVuY3Rpb24odCxlLHIsbyl7bGV0IG4scyxpLHUsaCxhLGwsYz0wLGY9dC0xO2ZvcihhPWMrMTthPD1mLTE7YSsrKXtmb3IobD0wLHU9YTt1PD1mO3UrKylsKz1NYXRoLmFicyhlLmdldCh1LGEtMSkpO2lmKDAhPT1sKXtmb3IoaT0wLHU9Zjt1Pj1hO3UtLSlyW3VdPWUuZ2V0KHUsYS0xKS9sLGkrPXJbdV0qclt1XTtmb3Iocz1NYXRoLnNxcnQoaSksclthXT4wJiYocz0tcyksaS09clthXSpzLHJbYV09clthXS1zLGg9YTtoPHQ7aCsrKXtmb3Iobj0wLHU9Zjt1Pj1hO3UtLSluKz1yW3VdKmUuZ2V0KHUsaCk7Zm9yKG4vPWksdT1hO3U8PWY7dSsrKWUuc2V0KHUsaCxlLmdldCh1LGgpLW4qclt1XSl9Zm9yKHU9MDt1PD1mO3UrKyl7Zm9yKG49MCxoPWY7aD49YTtoLS0pbis9cltoXSplLmdldCh1LGgpO2ZvcihuLz1pLGg9YTtoPD1mO2grKyllLnNldCh1LGgsZS5nZXQodSxoKS1uKnJbaF0pfXJbYV09bCpyW2FdLGUuc2V0KGEsYS0xLGwqcyl9fWZvcih1PTA7dTx0O3UrKylmb3IoaD0wO2g8dDtoKyspby5zZXQodSxoLHU9PT1oPzE6MCk7Zm9yKGE9Zi0xO2E+PWMrMTthLS0paWYoMCE9PWUuZ2V0KGEsYS0xKSl7Zm9yKHU9YSsxO3U8PWY7dSsrKXJbdV09ZS5nZXQodSxhLTEpO2ZvcihoPWE7aDw9ZjtoKyspe2ZvcihzPTAsdT1hO3U8PWY7dSsrKXMrPXJbdV0qby5nZXQodSxoKTtmb3Iocz1zL3JbYV0vZS5nZXQoYSxhLTEpLHU9YTt1PD1mO3UrKylvLnNldCh1LGgsby5nZXQodSxoKStzKnJbdV0pfX19KHMsdCxlLGkpLGZ1bmN0aW9uKHQsZSxyLG8sbil7bGV0IHMsaSx1LGgsYSxsLGMsZixtLGcscCx3LGQsYix5LHY9dC0xLE09MCx4PXQtMSxFPU51bWJlci5FUFNJTE9OLFM9MCxqPTAsXz0wLEE9MCxPPTAsUj0wLEM9MCxJPTA7Zm9yKHM9MDtzPHQ7cysrKWZvcigoczxNfHxzPngpJiYocltzXT1uLmdldChzLHMpLGVbc109MCksaT1NYXRoLm1heChzLTEsMCk7aTx0O2krKylqKz1NYXRoLmFicyhuLmdldChzLGkpKTtmb3IoO3Y+PU07KXtmb3IoaD12O2g+TSYmKFI9TWF0aC5hYnMobi5nZXQoaC0xLGgtMSkpK01hdGguYWJzKG4uZ2V0KGgsaCkpLDA9PT1SJiYoUj1qKSwhKE1hdGguYWJzKG4uZ2V0KGgsaC0xKSk8RSpSKSk7KWgtLTtpZihoPT09diluLnNldCh2LHYsbi5nZXQodix2KStTKSxyW3ZdPW4uZ2V0KHYsdiksZVt2XT0wLHYtLSxJPTA7ZWxzZSBpZihoPT09di0xKXtpZihjPW4uZ2V0KHYsdi0xKSpuLmdldCh2LTEsdiksXz0obi5nZXQodi0xLHYtMSktbi5nZXQodix2KSkvMixBPV8qXytjLEM9TWF0aC5zcXJ0KE1hdGguYWJzKEEpKSxuLnNldCh2LHYsbi5nZXQodix2KStTKSxuLnNldCh2LTEsdi0xLG4uZ2V0KHYtMSx2LTEpK1MpLGY9bi5nZXQodix2KSxBPj0wKXtmb3IoQz1fPj0wP18rQzpfLUMsclt2LTFdPWYrQyxyW3ZdPXJbdi0xXSwwIT09QyYmKHJbdl09Zi1jL0MpLGVbdi0xXT0wLGVbdl09MCxmPW4uZ2V0KHYsdi0xKSxSPU1hdGguYWJzKGYpK01hdGguYWJzKEMpLF89Zi9SLEE9Qy9SLE89TWF0aC5zcXJ0KF8qXytBKkEpLF8vPU8sQS89TyxpPXYtMTtpPHQ7aSsrKUM9bi5nZXQodi0xLGkpLG4uc2V0KHYtMSxpLEEqQytfKm4uZ2V0KHYsaSkpLG4uc2V0KHYsaSxBKm4uZ2V0KHYsaSktXypDKTtmb3Iocz0wO3M8PXY7cysrKUM9bi5nZXQocyx2LTEpLG4uc2V0KHMsdi0xLEEqQytfKm4uZ2V0KHMsdikpLG4uc2V0KHMsdixBKm4uZ2V0KHMsdiktXypDKTtmb3Iocz1NO3M8PXg7cysrKUM9by5nZXQocyx2LTEpLG8uc2V0KHMsdi0xLEEqQytfKm8uZ2V0KHMsdikpLG8uc2V0KHMsdixBKm8uZ2V0KHMsdiktXypDKX1lbHNlIHJbdi0xXT1mK18sclt2XT1mK18sZVt2LTFdPUMsZVt2XT0tQzt2LT0yLEk9MH1lbHNle2lmKGY9bi5nZXQodix2KSxtPTAsYz0wLGg8diYmKG09bi5nZXQodi0xLHYtMSksYz1uLmdldCh2LHYtMSkqbi5nZXQodi0xLHYpKSwxMD09PUkpe2ZvcihTKz1mLHM9TTtzPD12O3MrKyluLnNldChzLHMsbi5nZXQocyxzKS1mKTtSPU1hdGguYWJzKG4uZ2V0KHYsdi0xKSkrTWF0aC5hYnMobi5nZXQodi0xLHYtMikpLGY9bT0uNzUqUixjPS0uNDM3NSpSKlJ9aWYoMzA9PT1JJiYoUj0obS1mKS8yLFI9UipSK2MsUj4wKSl7Zm9yKFI9TWF0aC5zcXJ0KFIpLG08ZiYmKFI9LVIpLFI9Zi1jLygobS1mKS8yK1IpLHM9TTtzPD12O3MrKyluLnNldChzLHMsbi5nZXQocyxzKS1SKTtTKz1SLGY9bT1jPS45NjR9Zm9yKEkrPTEsYT12LTI7YT49aCYmKEM9bi5nZXQoYSxhKSxPPWYtQyxSPW0tQyxfPShPKlItYykvbi5nZXQoYSsxLGEpK24uZ2V0KGEsYSsxKSxBPW4uZ2V0KGErMSxhKzEpLUMtTy1SLE89bi5nZXQoYSsyLGErMSksUj1NYXRoLmFicyhfKStNYXRoLmFicyhBKStNYXRoLmFicyhPKSxfLz1SLEEvPVIsTy89UixhIT09aCkmJiEoTWF0aC5hYnMobi5nZXQoYSxhLTEpKSooTWF0aC5hYnMoQSkrTWF0aC5hYnMoTykpPEUqKE1hdGguYWJzKF8pKihNYXRoLmFicyhuLmdldChhLTEsYS0xKSkrTWF0aC5hYnMoQykrTWF0aC5hYnMobi5nZXQoYSsxLGErMSkpKSkpOylhLS07Zm9yKHM9YSsyO3M8PXY7cysrKW4uc2V0KHMscy0yLDApLHM+YSsyJiZuLnNldChzLHMtMywwKTtmb3IodT1hO3U8PXYtMSYmKGI9dSE9PXYtMSx1IT09YSYmKF89bi5nZXQodSx1LTEpLEE9bi5nZXQodSsxLHUtMSksTz1iP24uZ2V0KHUrMix1LTEpOjAsZj1NYXRoLmFicyhfKStNYXRoLmFicyhBKStNYXRoLmFicyhPKSwwIT09ZiYmKF8vPWYsQS89ZixPLz1mKSksMCE9PWYpO3UrKylpZihSPU1hdGguc3FydChfKl8rQSpBK08qTyksXzwwJiYoUj0tUiksMCE9PVIpe2Zvcih1IT09YT9uLnNldCh1LHUtMSwtUipmKTpoIT09YSYmbi5zZXQodSx1LTEsLW4uZ2V0KHUsdS0xKSksXys9UixmPV8vUixtPUEvUixDPU8vUixBLz1fLE8vPV8saT11O2k8dDtpKyspXz1uLmdldCh1LGkpK0Eqbi5nZXQodSsxLGkpLGImJihfKz1PKm4uZ2V0KHUrMixpKSxuLnNldCh1KzIsaSxuLmdldCh1KzIsaSktXypDKSksbi5zZXQodSxpLG4uZ2V0KHUsaSktXypmKSxuLnNldCh1KzEsaSxuLmdldCh1KzEsaSktXyptKTtmb3Iocz0wO3M8PU1hdGgubWluKHYsdSszKTtzKyspXz1mKm4uZ2V0KHMsdSkrbSpuLmdldChzLHUrMSksYiYmKF8rPUMqbi5nZXQocyx1KzIpLG4uc2V0KHMsdSsyLG4uZ2V0KHMsdSsyKS1fKk8pKSxuLnNldChzLHUsbi5nZXQocyx1KS1fKSxuLnNldChzLHUrMSxuLmdldChzLHUrMSktXypBKTtmb3Iocz1NO3M8PXg7cysrKV89ZipvLmdldChzLHUpK20qby5nZXQocyx1KzEpLGImJihfKz1DKm8uZ2V0KHMsdSsyKSxvLnNldChzLHUrMixvLmdldChzLHUrMiktXypPKSksby5zZXQocyx1LG8uZ2V0KHMsdSktXyksby5zZXQocyx1KzEsby5nZXQocyx1KzEpLV8qQSl9fX1pZigwPT09ailyZXR1cm47Zm9yKHY9dC0xO3Y+PTA7di0tKWlmKF89clt2XSxBPWVbdl0sMD09PUEpZm9yKGg9dixuLnNldCh2LHYsMSkscz12LTE7cz49MDtzLS0pe2ZvcihjPW4uZ2V0KHMscyktXyxPPTAsaT1oO2k8PXY7aSsrKU8rPW4uZ2V0KHMsaSkqbi5nZXQoaSx2KTtpZihlW3NdPDApQz1jLFI9TztlbHNlIGlmKGg9cywwPT09ZVtzXT9uLnNldChzLHYsMCE9PWM/LU8vYzotTy8oRSpqKSk6KGY9bi5nZXQocyxzKzEpLG09bi5nZXQocysxLHMpLEE9KHJbc10tXykqKHJbc10tXykrZVtzXSplW3NdLGw9KGYqUi1DKk8pL0Esbi5zZXQocyx2LGwpLG4uc2V0KHMrMSx2LE1hdGguYWJzKGYpPk1hdGguYWJzKEMpPygtTy1jKmwpL2Y6KC1SLW0qbCkvQykpLGw9TWF0aC5hYnMobi5nZXQocyx2KSksRSpsKmw+MSlmb3IoaT1zO2k8PXY7aSsrKW4uc2V0KGksdixuLmdldChpLHYpL2wpfWVsc2UgaWYoQTwwKWZvcihoPXYtMSxNYXRoLmFicyhuLmdldCh2LHYtMSkpPk1hdGguYWJzKG4uZ2V0KHYtMSx2KSk/KG4uc2V0KHYtMSx2LTEsQS9uLmdldCh2LHYtMSkpLG4uc2V0KHYtMSx2LC0obi5nZXQodix2KS1fKS9uLmdldCh2LHYtMSkpKTooeT1ucigwLC1uLmdldCh2LTEsdiksbi5nZXQodi0xLHYtMSktXyxBKSxuLnNldCh2LTEsdi0xLHlbMF0pLG4uc2V0KHYtMSx2LHlbMV0pKSxuLnNldCh2LHYtMSwwKSxuLnNldCh2LHYsMSkscz12LTI7cz49MDtzLS0pe2ZvcihnPTAscD0wLGk9aDtpPD12O2krKylnKz1uLmdldChzLGkpKm4uZ2V0KGksdi0xKSxwKz1uLmdldChzLGkpKm4uZ2V0KGksdik7aWYoYz1uLmdldChzLHMpLV8sZVtzXTwwKUM9YyxPPWcsUj1wO2Vsc2UgaWYoaD1zLDA9PT1lW3NdPyh5PW5yKC1nLC1wLGMsQSksbi5zZXQocyx2LTEseVswXSksbi5zZXQocyx2LHlbMV0pKTooZj1uLmdldChzLHMrMSksbT1uLmdldChzKzEscyksdz0ocltzXS1fKSoocltzXS1fKStlW3NdKmVbc10tQSpBLGQ9MioocltzXS1fKSpBLDA9PT13JiYwPT09ZCYmKHc9RSpqKihNYXRoLmFicyhjKStNYXRoLmFicyhBKStNYXRoLmFicyhmKStNYXRoLmFicyhtKStNYXRoLmFicyhDKSkpLHk9bnIoZipPLUMqZytBKnAsZipSLUMqcC1BKmcsdyxkKSxuLnNldChzLHYtMSx5WzBdKSxuLnNldChzLHYseVsxXSksTWF0aC5hYnMoZik+TWF0aC5hYnMoQykrTWF0aC5hYnMoQSk/KG4uc2V0KHMrMSx2LTEsKC1nLWMqbi5nZXQocyx2LTEpK0Eqbi5nZXQocyx2KSkvZiksbi5zZXQocysxLHYsKC1wLWMqbi5nZXQocyx2KS1BKm4uZ2V0KHMsdi0xKSkvZikpOih5PW5yKC1PLW0qbi5nZXQocyx2LTEpLC1SLW0qbi5nZXQocyx2KSxDLEEpLG4uc2V0KHMrMSx2LTEseVswXSksbi5zZXQocysxLHYseVsxXSkpKSxsPU1hdGgubWF4KE1hdGguYWJzKG4uZ2V0KHMsdi0xKSksTWF0aC5hYnMobi5nZXQocyx2KSkpLEUqbCpsPjEpZm9yKGk9cztpPD12O2krKyluLnNldChpLHYtMSxuLmdldChpLHYtMSkvbCksbi5zZXQoaSx2LG4uZ2V0KGksdikvbCl9Zm9yKHM9MDtzPHQ7cysrKWlmKHM8TXx8cz54KWZvcihpPXM7aTx0O2krKylvLnNldChzLGksbi5nZXQocyxpKSk7Zm9yKGk9dC0xO2k+PU07aS0tKWZvcihzPU07czw9eDtzKyspe2ZvcihDPTAsdT1NO3U8PU1hdGgubWluKGkseCk7dSsrKUMrPW8uZ2V0KHMsdSkqbi5nZXQodSxpKTtvLnNldChzLGksQyl9fShzLGgsdSxpLHQpfXRoaXMubj1zLHRoaXMuZT1oLHRoaXMuZD11LHRoaXMuVj1pfWdldCByZWFsRWlnZW52YWx1ZXMoKXtyZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmQpfWdldCBpbWFnaW5hcnlFaWdlbnZhbHVlcygpe3JldHVybiBBcnJheS5mcm9tKHRoaXMuZSl9Z2V0IGVpZ2VudmVjdG9yTWF0cml4KCl7cmV0dXJuIHRoaXMuVn1nZXQgZGlhZ29uYWxNYXRyaXgoKXtsZXQgdCxlLHI9dGhpcy5uLG89dGhpcy5lLG49dGhpcy5kLHM9bmV3IFplKHIscik7Zm9yKHQ9MDt0PHI7dCsrKXtmb3IoZT0wO2U8cjtlKyspcy5zZXQodCxlLDApO3Muc2V0KHQsdCxuW3RdKSxvW3RdPjA/cy5zZXQodCx0KzEsb1t0XSk6b1t0XTwwJiZzLnNldCh0LHQtMSxvW3RdKX1yZXR1cm4gc319ZnVuY3Rpb24gbnIodCxlLHIsbyl7bGV0IG4scztyZXR1cm4gTWF0aC5hYnMocik+TWF0aC5hYnMobyk/KG49by9yLHM9cituKm8sWyh0K24qZSkvcywoZS1uKnQpL3NdKToobj1yL28scz1vK24qcixbKG4qdCtlKS9zLChuKmUtdCkvc10pfWNsYXNzIHNye2NvbnN0cnVjdG9yKHQsZT17fSl7dD10ci5jaGVja01hdHJpeCh0KTtsZXR7WTpyfT1lO2NvbnN0e3NjYWxlU2NvcmVzOm89ITEsbWF4SXRlcmF0aW9uczpuPTFlMyx0ZXJtaW5hdGlvbkNyaXRlcmlhOnM9MWUtMTB9PWU7bGV0IGk7aWYocil7aWYocj1GZShyKSYmIm51bWJlciI9PXR5cGVvZiByWzBdP1plLmNvbHVtblZlY3RvcihyKTp0ci5jaGVja01hdHJpeChyKSxyLnJvd3MhPT10LnJvd3MpdGhyb3cgbmV3IEVycm9yKCJZIHNob3VsZCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiByb3dzIGFzIFgiKTtpPXIuZ2V0Q29sdW1uVmVjdG9yKDApfWVsc2UgaT10LmdldENvbHVtblZlY3RvcigwKTtsZXQgdSxoLGEsbCxjPTE7Zm9yKGxldCBlPTA7ZTxuJiZjPnM7ZSsrKWE9dC50cmFuc3Bvc2UoKS5tbXVsKGkpLmRpdihpLnRyYW5zcG9zZSgpLm1tdWwoaSkuZ2V0KDAsMCkpLGE9YS5kaXYoYS5ub3JtKCkpLHU9dC5tbXVsKGEpLmRpdihhLnRyYW5zcG9zZSgpLm1tdWwoYSkuZ2V0KDAsMCkpLGU+MCYmKGM9dS5jbG9uZSgpLnN1YihsKS5wb3coMikuc3VtKCkpLGw9dS5jbG9uZSgpLHI/KGg9ci50cmFuc3Bvc2UoKS5tbXVsKHUpLmRpdih1LnRyYW5zcG9zZSgpLm1tdWwodSkuZ2V0KDAsMCkpLGg9aC5kaXYoaC5ub3JtKCkpLGk9ci5tbXVsKGgpLmRpdihoLnRyYW5zcG9zZSgpLm1tdWwoaCkuZ2V0KDAsMCkpKTppPXU7aWYocil7bGV0IGU9dC50cmFuc3Bvc2UoKS5tbXVsKHUpLmRpdih1LnRyYW5zcG9zZSgpLm1tdWwodSkuZ2V0KDAsMCkpO2U9ZS5kaXYoZS5ub3JtKCkpO2xldCBvPXQuY2xvbmUoKS5zdWIodS5jbG9uZSgpLm1tdWwoZS50cmFuc3Bvc2UoKSkpLG49aS50cmFuc3Bvc2UoKS5tbXVsKHUpLmRpdih1LnRyYW5zcG9zZSgpLm1tdWwodSkuZ2V0KDAsMCkpLHM9ci5jbG9uZSgpLnN1Yih1LmNsb25lKCkubXVsUyhuLmdldCgwLDApKS5tbXVsKGgudHJhbnNwb3NlKCkpKTt0aGlzLnQ9dSx0aGlzLnA9ZS50cmFuc3Bvc2UoKSx0aGlzLnc9YS50cmFuc3Bvc2UoKSx0aGlzLnE9aCx0aGlzLnU9aSx0aGlzLnM9dS50cmFuc3Bvc2UoKS5tbXVsKHUpLHRoaXMueFJlc2lkdWFsPW8sdGhpcy55UmVzaWR1YWw9cyx0aGlzLmJldGFzPW59ZWxzZSB0aGlzLnc9YS50cmFuc3Bvc2UoKSx0aGlzLnM9dS50cmFuc3Bvc2UoKS5tbXVsKHUpLnNxcnQoKSx0aGlzLnQ9bz91LmNsb25lKCkuZGl2KHRoaXMucy5nZXQoMCwwKSk6dSx0aGlzLnhSZXNpZHVhbD10LnN1Yih1Lm1tdWwoYS50cmFuc3Bvc2UoKSkpfX1sZXQgaXI9Y2xhc3MgdHtjb25zdHJ1Y3Rvcih0LGU9e30scil7aWYodGhpcy5VPW51bGwsdGhpcy5TPW51bGwscilyZXR1cm4gdGhpcy5jZW50ZXI9ci5jZW50ZXIsdGhpcy5zY2FsZT1yLnNjYWxlLHRoaXMubWVhbnM9ci5tZWFucyx0aGlzLnN0ZGV2cz1yLnN0ZGV2cyx0aGlzLlU9WmUuY2hlY2tNYXRyaXgoci5VKSx0aGlzLlM9ci5TLHRoaXMuUj1yLlIsdm9pZCh0aGlzLmV4Y2x1ZGVkRmVhdHVyZXM9ci5leGNsdWRlZEZlYXR1cmVzfHxbXSk7bGV0IG87bz0oQXJyYXkuaXNBcnJheSh0KSxuZXcgWmUodCkpO2NvbnN0e2lzQ292YXJpYW5jZU1hdHJpeDpuPSExLG1ldGhvZDpzPSJTVkQiLG5Db21wTklQQUxTOmk9MixjZW50ZXI6dT0hMCxzY2FsZTpoPSExLGlnbm9yZVplcm9WYXJpYW5jZTphPSExfT1lO2lmKHRoaXMuY2VudGVyPXUsdGhpcy5zY2FsZT1oLHRoaXMubWVhbnM9bnVsbCx0aGlzLnN0ZGV2cz1udWxsLHRoaXMuZXhjbHVkZWRGZWF0dXJlcz1bXSxuKXRoaXMuX2NvbXB1dGVGcm9tQ292YXJpYW5jZU1hdHJpeChvKTtlbHNlIHN3aXRjaCh0aGlzLl9hZGp1c3QobyxhKSxzKXtjYXNlImNvdmFyaWFuY2VNYXRyaXgiOntjb25zdCB0PW5ldyBRZShvKS5tbXVsKG8pLmRpdihvLnJvd3MtMSk7dGhpcy5fY29tcHV0ZUZyb21Db3ZhcmlhbmNlTWF0cml4KHQpO2JyZWFrfWNhc2UiTklQQUxTIjp0aGlzLl9jb21wdXRlV2l0aE5JUEFMUyhvLGkpO2JyZWFrO2Nhc2UiU1ZEIjp7Y29uc3QgdD1uZXcgcnIobyx7Y29tcHV0ZUxlZnRTaW5ndWxhclZlY3RvcnM6ITEsY29tcHV0ZVJpZ2h0U2luZ3VsYXJWZWN0b3JzOiEwLGF1dG9UcmFuc3Bvc2U6ITB9KTt0aGlzLlU9dC5yaWdodFNpbmd1bGFyVmVjdG9ycztjb25zdCBlPXQuZGlhZ29uYWwscj1bXTtmb3IoY29uc3QgdCBvZiBlKXIucHVzaCh0KnQvKG8ucm93cy0xKSk7dGhpcy5TPXI7YnJlYWt9ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYHVua25vd24gbWV0aG9kOiAke3N9YCl9fXN0YXRpYyBsb2FkKGUpe2lmKCJzdHJpbmciIT10eXBlb2YgZS5uYW1lKXRocm93IG5ldyBUeXBlRXJyb3IoIm1vZGVsIG11c3QgaGF2ZSBhIG5hbWUgcHJvcGVydHkiKTtpZigiUENBIiE9PWUubmFtZSl0aHJvdyBuZXcgUmFuZ2VFcnJvcihgaW52YWxpZCBtb2RlbDogJHtlLm5hbWV9YCk7cmV0dXJuIG5ldyB0KHZvaWQgMCx2b2lkIDAsZSl9cHJlZGljdCh0LGU9e30pe2NvbnN0e25Db21wb25lbnRzOnI9dGhpcy5VLmNvbHVtbnN9PWU7bGV0IG87aWYobz0oQXJyYXkuaXNBcnJheSh0KSxuZXcgWmUodCkpLHRoaXMuY2VudGVyJiYoby5zdWJSb3dWZWN0b3IodGhpcy5tZWFucyksdGhpcy5zY2FsZSkpe2ZvcihsZXQgdCBvZiB0aGlzLmV4Y2x1ZGVkRmVhdHVyZXMpby5yZW1vdmVDb2x1bW4odCk7by5kaXZSb3dWZWN0b3IodGhpcy5zdGRldnMpfWxldCBuPW8ubW11bCh0aGlzLlUpO3JldHVybiBuLnN1Yk1hdHJpeCgwLG4ucm93cy0xLDAsci0xKX1pbnZlcnQodCl7bGV0IGU9KHQ9WmUuY2hlY2tNYXRyaXgodCkpLm1tdWwodGhpcy5VLnRyYW5zcG9zZSgpKTtyZXR1cm4gdGhpcy5jZW50ZXImJih0aGlzLnNjYWxlJiZlLm11bFJvd1ZlY3Rvcih0aGlzLnN0ZGV2cyksZS5hZGRSb3dWZWN0b3IodGhpcy5tZWFucykpLGV9Z2V0RXhwbGFpbmVkVmFyaWFuY2UoKXtsZXQgdD0wO2lmKHRoaXMuUylmb3IoY29uc3QgZSBvZiB0aGlzLlMpdCs9ZTtyZXR1cm4gdGhpcy5TP3RoaXMuUy5tYXAoKGU9PmUvdCkpOltdfWdldEN1bXVsYXRpdmVWYXJpYW5jZSgpe2xldCB0PXRoaXMuZ2V0RXhwbGFpbmVkVmFyaWFuY2UoKTtmb3IobGV0IGU9MTtlPHQubGVuZ3RoO2UrKyl0W2VdKz10W2UtMV07cmV0dXJuIHR9Z2V0RWlnZW52ZWN0b3JzKCl7cmV0dXJuIHRoaXMuVX1nZXRFaWdlbnZhbHVlcygpe3JldHVybiB0aGlzLlN9Z2V0U3RhbmRhcmREZXZpYXRpb25zKCl7cmV0dXJuIHRoaXMuUy5tYXAoKHQ9Pk1hdGguc3FydCh0KSkpfWdldExvYWRpbmdzKCl7cmV0dXJuIHRoaXMuVS50cmFuc3Bvc2UoKX10b0pTT04oKXtyZXR1cm57bmFtZToiUENBIixjZW50ZXI6dGhpcy5jZW50ZXIsc2NhbGU6dGhpcy5zY2FsZSxtZWFuczp0aGlzLm1lYW5zLHN0ZGV2czp0aGlzLnN0ZGV2cyxVOnRoaXMuVSxTOnRoaXMuUyxleGNsdWRlZEZlYXR1cmVzOnRoaXMuZXhjbHVkZWRGZWF0dXJlc319X2FkanVzdCh0LGUpe2lmKHRoaXMuY2VudGVyKXtjb25zdCByPXQubWVhbigiY29sdW1uIiksbz10aGlzLnNjYWxlP3Quc3RhbmRhcmREZXZpYXRpb24oImNvbHVtbiIse21lYW46cn0pOm51bGw7aWYodGhpcy5tZWFucz1yLHQuc3ViUm93VmVjdG9yKHIpLHRoaXMuc2NhbGUpe2ZvcihsZXQgcj0wO3I8by5sZW5ndGg7cisrKWlmKDA9PT1vW3JdKXtpZighZSl0aHJvdyBuZXcgUmFuZ2VFcnJvcihgQ2Fubm90IHNjYWxlIHRoZSBkYXRhc2V0IChzdGFuZGFyZCBkZXZpYXRpb24gaXMgemVybyBhdCBpbmRleCAke3J9YCk7dC5yZW1vdmVDb2x1bW4ociksby5zcGxpY2UociwxKSx0aGlzLmV4Y2x1ZGVkRmVhdHVyZXMucHVzaChyKSxyLS19dGhpcy5zdGRldnM9byx0LmRpdlJvd1ZlY3RvcihvKX19fV9jb21wdXRlRnJvbUNvdmFyaWFuY2VNYXRyaXgodCl7Y29uc3QgZT1uZXcgb3IodCx7YXNzdW1lU3ltbWV0cmljOiEwfSk7dGhpcy5VPWUuZWlnZW52ZWN0b3JNYXRyaXgsdGhpcy5VLmZsaXBSb3dzKCksdGhpcy5TPWUucmVhbEVpZ2VudmFsdWVzLHRoaXMuUy5yZXZlcnNlKCl9X2NvbXB1dGVXaXRoTklQQUxTKHQsZSl7dGhpcy5VPW5ldyBaZShlLHQuY29sdW1ucyksdGhpcy5TPVtdO2xldCByPXQ7Zm9yKGxldCB0PTA7dDxlO3QrKyl7bGV0IGU9bmV3IHNyKHIpO3RoaXMuVS5zZXRSb3codCxlLncudHJhbnNwb3NlKCkpLHRoaXMuUy5wdXNoKE1hdGgucG93KGUucy5nZXQoMCwwKSwyKSkscj1lLnhSZXNpZHVhbH10aGlzLlU9dGhpcy5VLnRyYW5zcG9zZSgpfX07ZnVuY3Rpb24gdXIodCxlPXt9KXtpZighY2UodCkpdGhyb3cgbmV3IEVycm9yKCJkYXRhIGlzIG5vdCBlZmYuIGFycmF5Iik7bGV0IHI9cHQoZSwic2NhbGUiKTttZShyKXx8KHI9ITApO2xldCBvPXB0KGUsIm5Db21wTklQQUxTIik7cGUobyl8fChvPTIpLG89TmUobyk7bGV0IG49c2UocHQodCwwLFtdKSk7aWYoMD09PW4pdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGRpbWVuc2lvbiBvZiBkYXRhIik7aWYobz5uKXRocm93IG5ldyBFcnJvcihgbkNvbXBOSVBBTFNbJHtvfV0gaXMgbW9yZSB0aGFuIHRoZSBkaW1lbnNpb25bJHtufV0gb2YgZGF0YWApO3JldHVybiBuZXcgaXIodCx7bWV0aG9kOiJOSVBBTFMiLHNjYWxlOnIsbkNvbXBOSVBBTFM6b30pLnByZWRpY3QodCkudG9KU09OKCl9ZnVuY3Rpb24gaHIodCxlKXtmb3IodmFyIHI9LTEsbz1udWxsPT10PzA6dC5sZW5ndGg7KytyPG8mJiExIT09ZSh0W3JdLHIsdCk7KTtyZXR1cm4gdH12YXIgYXIsbHI9ZnVuY3Rpb24odCxlLHIpe2Zvcih2YXIgbz0tMSxuPU9iamVjdCh0KSxzPXIodCksaT1zLmxlbmd0aDtpLS07KXt2YXIgdT1zW2FyP2k6KytvXTtpZighMT09PWUoblt1XSx1LG4pKWJyZWFrfXJldHVybiB0fTtmdW5jdGlvbiBjcih0KXtyZXR1cm4gZyh0KSYmIltvYmplY3QgQXJndW1lbnRzXSI9PW0odCl9dmFyIGZyPU9iamVjdC5wcm90b3R5cGUsbXI9ZnIuaGFzT3duUHJvcGVydHksZ3I9ZnIucHJvcGVydHlJc0VudW1lcmFibGUscHI9Y3IoZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzfSgpKT9jcjpmdW5jdGlvbih0KXtyZXR1cm4gZyh0KSYmbXIuY2FsbCh0LCJjYWxsZWUiKSYmIWdyLmNhbGwodCwiY2FsbGVlIil9O3ZhciB3cj0ib2JqZWN0Ij09dHlwZW9mIGV4cG9ydHMmJmV4cG9ydHMmJiFleHBvcnRzLm5vZGVUeXBlJiZleHBvcnRzLGRyPXdyJiYib2JqZWN0Ij09dHlwZW9mIG1vZHVsZSYmbW9kdWxlJiYhbW9kdWxlLm5vZGVUeXBlJiZtb2R1bGUsYnI9ZHImJmRyLmV4cG9ydHM9PT13cj9vLkJ1ZmZlcjp2b2lkIDAseXI9KGJyP2JyLmlzQnVmZmVyOnZvaWQgMCl8fGZ1bmN0aW9uKCl7cmV0dXJuITF9LHZyPTkwMDcxOTkyNTQ3NDA5OTEsTXI9L14oPzowfFsxLTldXGQqKSQvO2Z1bmN0aW9uIHhyKHQsZSl7dmFyIHI9dHlwZW9mIHQ7cmV0dXJuISEoZT1udWxsPT1lP3ZyOmUpJiYoIm51bWJlciI9PXJ8fCJzeW1ib2wiIT1yJiZNci50ZXN0KHQpKSYmdD4tMSYmdCUxPT0wJiZ0PGV9dmFyIEVyPXt9O0VyWyJbb2JqZWN0IEZsb2F0MzJBcnJheV0iXT1FclsiW29iamVjdCBGbG9hdDY0QXJyYXldIl09RXJbIltvYmplY3QgSW50OEFycmF5XSJdPUVyWyJbb2JqZWN0IEludDE2QXJyYXldIl09RXJbIltvYmplY3QgSW50MzJBcnJheV0iXT1FclsiW29iamVjdCBVaW50OEFycmF5XSJdPUVyWyJbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XSJdPUVyWyJbb2JqZWN0IFVpbnQxNkFycmF5XSJdPUVyWyJbb2JqZWN0IFVpbnQzMkFycmF5XSJdPSEwLEVyWyJbb2JqZWN0IEFyZ3VtZW50c10iXT1FclsiW29iamVjdCBBcnJheV0iXT1FclsiW29iamVjdCBBcnJheUJ1ZmZlcl0iXT1FclsiW29iamVjdCBCb29sZWFuXSJdPUVyWyJbb2JqZWN0IERhdGFWaWV3XSJdPUVyWyJbb2JqZWN0IERhdGVdIl09RXJbIltvYmplY3QgRXJyb3JdIl09RXJbIltvYmplY3QgRnVuY3Rpb25dIl09RXJbIltvYmplY3QgTWFwXSJdPUVyWyJbb2JqZWN0IE51bWJlcl0iXT1FclsiW29iamVjdCBPYmplY3RdIl09RXJbIltvYmplY3QgUmVnRXhwXSJdPUVyWyJbb2JqZWN0IFNldF0iXT1FclsiW29iamVjdCBTdHJpbmddIl09RXJbIltvYmplY3QgV2Vha01hcF0iXT0hMTt2YXIgU3I9Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiZleHBvcnRzJiYhZXhwb3J0cy5ub2RlVHlwZSYmZXhwb3J0cyxqcj1TciYmIm9iamVjdCI9PXR5cGVvZiBtb2R1bGUmJm1vZHVsZSYmIW1vZHVsZS5ub2RlVHlwZSYmbW9kdWxlLF9yPWpyJiZqci5leHBvcnRzPT09U3ImJmUucHJvY2VzcyxBcj1mdW5jdGlvbigpe3RyeXt2YXIgdD1qciYmanIucmVxdWlyZSYmanIucmVxdWlyZSgidXRpbCIpLnR5cGVzO3JldHVybiB0fHxfciYmX3IuYmluZGluZyYmX3IuYmluZGluZygidXRpbCIpfWNhdGNoKHQpe319KCksT3I9QXImJkFyLmlzVHlwZWRBcnJheSxScj1Pcj9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQoZSl9fShPcik6ZnVuY3Rpb24odCl7cmV0dXJuIGcodCkmJlZ0KHQubGVuZ3RoKSYmISFFclttKHQpXX0sQ3I9UnIsSXI9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBOcihlLHIpe3ZhciBvPXQoZSksbj0hbyYmcHIoZSkscz0hbyYmIW4mJnlyKGUpLGk9IW8mJiFuJiYhcyYmQ3IoZSksdT1vfHxufHxzfHxpLGg9dT9mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj0tMSxvPUFycmF5KHQpOysrcjx0OylvW3JdPWUocik7cmV0dXJuIG99KGUubGVuZ3RoLFN0cmluZyk6W10sYT1oLmxlbmd0aDtmb3IodmFyIGwgaW4gZSkhciYmIUlyLmNhbGwoZSxsKXx8dSYmKCJsZW5ndGgiPT1sfHxzJiYoIm9mZnNldCI9PWx8fCJwYXJlbnQiPT1sKXx8aSYmKCJidWZmZXIiPT1sfHwiYnl0ZUxlbmd0aCI9PWx8fCJieXRlT2Zmc2V0Ij09bCl8fHhyKGwsYSkpfHxoLnB1c2gobCk7cmV0dXJuIGh9ZnVuY3Rpb24ga3IodCl7cmV0dXJuICR0KHQpP05yKHQpOnZ0KHQpfXZhciBGcj1mdW5jdGlvbih0LGUpe3JldHVybiBmdW5jdGlvbihyLG8pe2lmKG51bGw9PXIpcmV0dXJuIHI7aWYoISR0KHIpKXJldHVybiB0KHIsbyk7Zm9yKHZhciBuPXIubGVuZ3RoLHM9ZT9uOi0xLGk9T2JqZWN0KHIpOyhlP3MtLTorK3M8bikmJiExIT09byhpW3NdLHMsaSk7KTtyZXR1cm4gcn19KChmdW5jdGlvbih0LGUpe3JldHVybiB0JiZscih0LGUsa3IpfSkpLFByPUZyO2Z1bmN0aW9uIFRyKHQpe3JldHVybiB0fWZ1bmN0aW9uIHpyKGUscil7dmFyIG87cmV0dXJuKHQoZSk/aHI6UHIpKGUsImZ1bmN0aW9uIj09dHlwZW9mKG89cik/bzpUcil9ZnVuY3Rpb24gVnIodCl7dmFyIGU9dGhpcy5fX2RhdGFfXz1uZXcgVyh0KTt0aGlzLnNpemU9ZS5zaXplfVZyLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuX19kYXRhX189bmV3IFcsdGhpcy5zaXplPTB9LFZyLnByb3RvdHlwZS5kZWxldGU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxyPWUuZGVsZXRlKHQpO3JldHVybiB0aGlzLnNpemU9ZS5zaXplLHJ9LFZyLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX19kYXRhX18uZ2V0KHQpfSxWci5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLmhhcyh0KX0sVnIucHJvdG90eXBlLnNldD1mdW5jdGlvbih0LGUpe3ZhciByPXRoaXMuX19kYXRhX187aWYociBpbnN0YW5jZW9mIFcpe3ZhciBvPXIuX19kYXRhX187aWYoIUt8fG8ubGVuZ3RoPDE5OSlyZXR1cm4gby5wdXNoKFt0LGVdKSx0aGlzLnNpemU9KytyLnNpemUsdGhpcztyPXRoaXMuX19kYXRhX189bmV3IFgobyl9cmV0dXJuIHIuc2V0KHQsZSksdGhpcy5zaXplPXIuc2l6ZSx0aGlzfTtmdW5jdGlvbiAkcih0KXt2YXIgZT0tMSxyPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5fX2RhdGFfXz1uZXcgWDsrK2U8cjspdGhpcy5hZGQodFtlXSl9ZnVuY3Rpb24gcXIodCxlKXtmb3IodmFyIHI9LTEsbz1udWxsPT10PzA6dC5sZW5ndGg7KytyPG87KWlmKGUodFtyXSxyLHQpKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIERyKHQsZSl7cmV0dXJuIHQuaGFzKGUpfSRyLnByb3RvdHlwZS5hZGQ9JHIucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX19kYXRhX18uc2V0KHQsIl9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iKSx0aGlzfSwkci5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLmhhcyh0KX07dmFyIFVyPTEsTHI9MjtmdW5jdGlvbiBHcih0LGUscixvLG4scyl7dmFyIGk9ciZVcix1PXQubGVuZ3RoLGg9ZS5sZW5ndGg7aWYodSE9aCYmIShpJiZoPnUpKXJldHVybiExO3ZhciBhPXMuZ2V0KHQpLGw9cy5nZXQoZSk7aWYoYSYmbClyZXR1cm4gYT09ZSYmbD09dDt2YXIgYz0tMSxmPSEwLG09ciZMcj9uZXcgJHI6dm9pZCAwO2ZvcihzLnNldCh0LGUpLHMuc2V0KGUsdCk7KytjPHU7KXt2YXIgZz10W2NdLHA9ZVtjXTtpZihvKXZhciB3PWk/byhwLGcsYyxlLHQscyk6byhnLHAsYyx0LGUscyk7aWYodm9pZCAwIT09dyl7aWYodyljb250aW51ZTtmPSExO2JyZWFrfWlmKG0pe2lmKCFxcihlLChmdW5jdGlvbih0LGUpe2lmKCFEcihtLGUpJiYoZz09PXR8fG4oZyx0LHIsbyxzKSkpcmV0dXJuIG0ucHVzaChlKX0pKSl7Zj0hMTticmVha319ZWxzZSBpZihnIT09cCYmIW4oZyxwLHIsbyxzKSl7Zj0hMTticmVha319cmV0dXJuIHMuZGVsZXRlKHQpLHMuZGVsZXRlKGUpLGZ9dmFyIEJyPW8uVWludDhBcnJheTtmdW5jdGlvbiBXcih0KXt2YXIgZT0tMSxyPUFycmF5KHQuc2l6ZSk7cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCxvKXtyWysrZV09W28sdF19KSkscn1mdW5jdGlvbiBLcih0KXt2YXIgZT0tMSxyPUFycmF5KHQuc2l6ZSk7cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCl7clsrK2VdPXR9KSkscn12YXIgWXI9MSxYcj0yLEpyPSJbb2JqZWN0IEJvb2xlYW5dIixacj0iW29iamVjdCBEYXRlXSIsSHI9IltvYmplY3QgRXJyb3JdIixRcj0iW29iamVjdCBNYXBdIix0bz0iW29iamVjdCBOdW1iZXJdIixlbz0iW29iamVjdCBSZWdFeHBdIixybz0iW29iamVjdCBTZXRdIixvbz0iW29iamVjdCBTdHJpbmddIixubz0iW29iamVjdCBTeW1ib2xdIixzbz0iW29iamVjdCBBcnJheUJ1ZmZlcl0iLGlvPSJbb2JqZWN0IERhdGFWaWV3XSIsdW89bj9uLnByb3RvdHlwZTp2b2lkIDAsaG89dW8/dW8udmFsdWVPZjp2b2lkIDA7dmFyIGFvPU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUsbG89T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyxjbz1sbz9mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD9bXToodD1PYmplY3QodCksZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9LTEsbz1udWxsPT10PzA6dC5sZW5ndGgsbj0wLHM9W107KytyPG87KXt2YXIgaT10W3JdO2UoaSxyLHQpJiYoc1tuKytdPWkpfXJldHVybiBzfShsbyh0KSwoZnVuY3Rpb24oZSl7cmV0dXJuIGFvLmNhbGwodCxlKX0pKSl9OmZ1bmN0aW9uKCl7cmV0dXJuW119LGZvPWNvO2Z1bmN0aW9uIG1vKGUpe3JldHVybiBmdW5jdGlvbihlLHIsbyl7dmFyIG49cihlKTtyZXR1cm4gdChlKT9uOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPS0xLG89ZS5sZW5ndGgsbj10Lmxlbmd0aDsrK3I8bzspdFtuK3JdPWVbcl07cmV0dXJuIHR9KG4sbyhlKSl9KGUsa3IsZm8pfXZhciBnbz0xLHBvPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dmFyIHdvPTEsYm89IltvYmplY3QgQXJndW1lbnRzXSIseW89IltvYmplY3QgQXJyYXldIix2bz0iW29iamVjdCBPYmplY3RdIixNbz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIHhvKGUscixvLG4scyxpKXt2YXIgdT10KGUpLGg9dChyKSxhPXU/eW86VHQoZSksbD1oP3lvOlR0KHIpLGM9KGE9YT09Ym8/dm86YSk9PXZvLGY9KGw9bD09Ym8/dm86bCk9PXZvLG09YT09bDtpZihtJiZ5cihlKSl7aWYoIXlyKHIpKXJldHVybiExO3U9ITAsYz0hMX1pZihtJiYhYylyZXR1cm4gaXx8KGk9bmV3IFZyKSx1fHxDcihlKT9HcihlLHIsbyxuLHMsaSk6ZnVuY3Rpb24odCxlLHIsbyxuLHMsaSl7c3dpdGNoKHIpe2Nhc2UgaW86aWYodC5ieXRlTGVuZ3RoIT1lLmJ5dGVMZW5ndGh8fHQuYnl0ZU9mZnNldCE9ZS5ieXRlT2Zmc2V0KXJldHVybiExO3Q9dC5idWZmZXIsZT1lLmJ1ZmZlcjtjYXNlIHNvOnJldHVybiEodC5ieXRlTGVuZ3RoIT1lLmJ5dGVMZW5ndGh8fCFzKG5ldyBCcih0KSxuZXcgQnIoZSkpKTtjYXNlIEpyOmNhc2UgWnI6Y2FzZSB0bzpyZXR1cm4gTCgrdCwrZSk7Y2FzZSBIcjpyZXR1cm4gdC5uYW1lPT1lLm5hbWUmJnQubWVzc2FnZT09ZS5tZXNzYWdlO2Nhc2UgZW86Y2FzZSBvbzpyZXR1cm4gdD09ZSsiIjtjYXNlIFFyOnZhciB1PVdyO2Nhc2Ugcm86dmFyIGg9byZZcjtpZih1fHwodT1LciksdC5zaXplIT1lLnNpemUmJiFoKXJldHVybiExO3ZhciBhPWkuZ2V0KHQpO2lmKGEpcmV0dXJuIGE9PWU7b3w9WHIsaS5zZXQodCxlKTt2YXIgbD1Hcih1KHQpLHUoZSksbyxuLHMsaSk7cmV0dXJuIGkuZGVsZXRlKHQpLGw7Y2FzZSBubzppZihobylyZXR1cm4gaG8uY2FsbCh0KT09aG8uY2FsbChlKX1yZXR1cm4hMX0oZSxyLGEsbyxuLHMsaSk7aWYoIShvJndvKSl7dmFyIGc9YyYmTW8uY2FsbChlLCJfX3dyYXBwZWRfXyIpLHA9ZiYmTW8uY2FsbChyLCJfX3dyYXBwZWRfXyIpO2lmKGd8fHApe3ZhciB3PWc/ZS52YWx1ZSgpOmUsZD1wP3IudmFsdWUoKTpyO3JldHVybiBpfHwoaT1uZXcgVnIpLHModyxkLG8sbixpKX19cmV0dXJuISFtJiYoaXx8KGk9bmV3IFZyKSxmdW5jdGlvbih0LGUscixvLG4scyl7dmFyIGk9ciZnbyx1PW1vKHQpLGg9dS5sZW5ndGg7aWYoaCE9bW8oZSkubGVuZ3RoJiYhaSlyZXR1cm4hMTtmb3IodmFyIGE9aDthLS07KXt2YXIgbD11W2FdO2lmKCEoaT9sIGluIGU6cG8uY2FsbChlLGwpKSlyZXR1cm4hMX12YXIgYz1zLmdldCh0KSxmPXMuZ2V0KGUpO2lmKGMmJmYpcmV0dXJuIGM9PWUmJmY9PXQ7dmFyIG09ITA7cy5zZXQodCxlKSxzLnNldChlLHQpO2Zvcih2YXIgZz1pOysrYTxoOyl7dmFyIHA9dFtsPXVbYV1dLHc9ZVtsXTtpZihvKXZhciBkPWk/byh3LHAsbCxlLHQscyk6byhwLHcsbCx0LGUscyk7aWYoISh2b2lkIDA9PT1kP3A9PT13fHxuKHAsdyxyLG8scyk6ZCkpe209ITE7YnJlYWt9Z3x8KGc9ImNvbnN0cnVjdG9yIj09bCl9aWYobSYmIWcpe3ZhciBiPXQuY29uc3RydWN0b3IseT1lLmNvbnN0cnVjdG9yO2I9PXl8fCEoImNvbnN0cnVjdG9yImluIHQpfHwhKCJjb25zdHJ1Y3RvciJpbiBlKXx8ImZ1bmN0aW9uIj09dHlwZW9mIGImJmIgaW5zdGFuY2VvZiBiJiYiZnVuY3Rpb24iPT10eXBlb2YgeSYmeSBpbnN0YW5jZW9mIHl8fChtPSExKX1yZXR1cm4gcy5kZWxldGUodCkscy5kZWxldGUoZSksbX0oZSxyLG8sbixzLGkpKX1mdW5jdGlvbiBFbyh0LGUscixvLG4pe3JldHVybiB0PT09ZXx8KG51bGw9PXR8fG51bGw9PWV8fCFnKHQpJiYhZyhlKT90IT10JiZlIT1lOnhvKHQsZSxyLG8sRW8sbikpfXZhciBTbz0xLGpvPTI7ZnVuY3Rpb24gX28odCl7cmV0dXJuIHQ9PXQmJiF2KHQpfWZ1bmN0aW9uIEFvKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKHIpe3JldHVybiBudWxsIT1yJiYoclt0XT09PWUmJih2b2lkIDAhPT1lfHx0IGluIE9iamVjdChyKSkpfX1mdW5jdGlvbiBPbyh0KXt2YXIgZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9a3IodCkscj1lLmxlbmd0aDtyLS07KXt2YXIgbz1lW3JdLG49dFtvXTtlW3JdPVtvLG4sX28obildfXJldHVybiBlfSh0KTtyZXR1cm4gMT09ZS5sZW5ndGgmJmVbMF1bMl0/QW8oZVswXVswXSxlWzBdWzFdKTpmdW5jdGlvbihyKXtyZXR1cm4gcj09PXR8fGZ1bmN0aW9uKHQsZSxyLG8pe3ZhciBuPXIubGVuZ3RoLHM9bixpPSFvO2lmKG51bGw9PXQpcmV0dXJuIXM7Zm9yKHQ9T2JqZWN0KHQpO24tLTspe3ZhciB1PXJbbl07aWYoaSYmdVsyXT91WzFdIT09dFt1WzBdXTohKHVbMF1pbiB0KSlyZXR1cm4hMX1mb3IoOysrbjxzOyl7dmFyIGg9KHU9cltuXSlbMF0sYT10W2hdLGw9dVsxXTtpZihpJiZ1WzJdKXtpZih2b2lkIDA9PT1hJiYhKGggaW4gdCkpcmV0dXJuITF9ZWxzZXt2YXIgYz1uZXcgVnI7aWYobyl2YXIgZj1vKGEsbCxoLHQsZSxjKTtpZighKHZvaWQgMD09PWY/RW8obCxhLFNvfGpvLG8sYyk6ZikpcmV0dXJuITF9fXJldHVybiEwfShyLHQsZSl9fWZ1bmN0aW9uIFJvKHQsZSl7cmV0dXJuIG51bGwhPXQmJmUgaW4gT2JqZWN0KHQpfWZ1bmN0aW9uIENvKGUscil7cmV0dXJuIG51bGwhPWUmJmZ1bmN0aW9uKGUscixvKXtmb3IodmFyIG49LTEscz0ocj1jdChyLGUpKS5sZW5ndGgsaT0hMTsrK248czspe3ZhciB1PW10KHJbbl0pO2lmKCEoaT1udWxsIT1lJiZvKGUsdSkpKWJyZWFrO2U9ZVt1XX1yZXR1cm4gaXx8KytuIT1zP2k6ISEocz1udWxsPT1lPzA6ZS5sZW5ndGgpJiZWdChzKSYmeHIodSxzKSYmKHQoZSl8fHByKGUpKX0oZSxyLFJvKX12YXIgSW89MSxObz0yO2Z1bmN0aW9uIGtvKHQpe3JldHVybiB5KHQpP0R0KG10KHQpKTpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIGd0KGUsdCl9fSh0KX1mdW5jdGlvbiBGbyhlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZT9lOm51bGw9PWU/VHI6Im9iamVjdCI9PXR5cGVvZiBlP3QoZSk/KHI9ZVswXSxvPWVbMV0seShyKSYmX28obyk/QW8obXQociksbyk6ZnVuY3Rpb24odCl7dmFyIGU9cHQodCxyKTtyZXR1cm4gdm9pZCAwPT09ZSYmZT09PW8/Q28odCxyKTpFbyhvLGUsSW98Tm8pfSk6T28oZSk6a28oZSk7dmFyIHIsb31mdW5jdGlvbiBQbyh0LGUpe3ZhciByPS0xLG89JHQodCk/QXJyYXkodC5sZW5ndGgpOltdO3JldHVybiBQcih0LChmdW5jdGlvbih0LG4scyl7b1srK3JdPWUodCxuLHMpfSkpLG99ZnVuY3Rpb24gVG8oZSxyKXtyZXR1cm4odChlKT9zdDpQbykoZSxGbyhyKSl9ZnVuY3Rpb24gem8odCl7cmV0dXJuIG51bGw9PXQ/W106ZnVuY3Rpb24odCxlKXtyZXR1cm4gc3QoZSwoZnVuY3Rpb24oZSl7cmV0dXJuIHRbZV19KSl9KHQsa3IodCkpfWZ1bmN0aW9uIFZvKHQsZSl7aWYoIXVlKHQpKXJldHVybnt9O2lmKCFjZShlKSlyZXR1cm57fTtsZXQgcj17fTtyZXR1cm4genIoZSwoZnVuY3Rpb24oZSl7KGZ1bmN0aW9uKHQsZSl7cmV0dXJuISF1ZSh0KSYmISghZ2UoZSkmJiFwZShlKSkmJmUgaW4gdH0pKHQsZSkmJihyW2VdPXB0KHQsZSkpfSkpLHJ9dmFyICRvPUFycmF5LnByb3RvdHlwZS5qb2luO2Z1bmN0aW9uIHFvKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGUmJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCJkZWZhdWx0Iik/dC5kZWZhdWx0OnR9dmFyIERvPXt9LFVvPXt9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShVbywiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7Y2xhc3MgTG97Y29uc3RydWN0b3IodCl7dGhpcy5nZXRDb3N0PSgpPT50aGlzLkVsZW1lbnRzLm1hcCgodD0+dC5EaXN0YW5jZUZyb21NZWRvaWQpKS5yZWR1Y2UoKCh0LGUpPT50K2UpLDApLHRoaXMuZmluZEJlc3RNZWRvaWRJZHg9dD0+dGhpcy5FbGVtZW50cy5tYXAoKGU9PnRoaXMuY2FsY0Nvc3RGb3JHaXZlbkVsZW1lbnRBc01lZG9pZChlLHQpKSkucmVkdWNlKCgodCxlLHIsbyk9PmUuQ29zdElmTWFkZU1lZG9pZDxvW3RdLkNvc3RJZk1hZGVNZWRvaWQ/cjp0KSwwKSx0aGlzLmNhbGNDb3N0Rm9yR2l2ZW5FbGVtZW50QXNNZWRvaWQ9KHQsZSk9Pih7Q29zdElmTWFkZU1lZG9pZDpuZXcgTG8oe0VsZW1lbnRzOnRoaXMuRWxlbWVudHMubWFwKChyPT4oe0Rpc3RhbmNlRnJvbU1lZG9pZDplKHIuRWxlbWVudCx0LkVsZW1lbnQpLEVsZW1lbnQ6ci5FbGVtZW50fSkpKSxNZWRvaWQ6dC5FbGVtZW50fSkuZ2V0Q29zdCgpLEVsZW1lbnQ6dH0pLHRoaXMuRWxlbWVudHM9dC5FbGVtZW50cyx0aGlzLk1lZG9pZD10Lk1lZG9pZH19VW8uQ2x1c3Rlcj1Mbzt2YXIgR289e30sQm89e307T2JqZWN0LmRlZmluZVByb3BlcnR5KEJvLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxCby5kaXN0YW5jZT0odCxlKT0+e2lmKHQubGVuZ3RoIT09ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJ0aGUgaW5wdXRzIG11c3QgaGF2ZSB0aGUgc2FtZSBkaW1lbnNpb24iKTtjb25zdCByPUFycmF5LmZyb20odC5rZXlzKCkpLm1hcCgocj0+TWF0aC5wb3coTWF0aC5hYnModFtyXS1lW3JdKSwyKSkpLnJlZHVjZSgoKHQsZSk9PnQrZSksMCk7cmV0dXJuIE1hdGguc3FydChyKX07dmFyIFdvPXt9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShXbywiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksV28ua0d0RWxlbWVudEFyckxlbmd0aD0iayBtdXN0IGJlIGxlc3MgdGhhbiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBpbnB1dCBhcnJheSIsT2JqZWN0LmRlZmluZVByb3BlcnR5KEdvLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtjb25zdCBLbz1CbyxZbz1XbyxYbz1VbztjbGFzcyBKb3tjb25zdHJ1Y3Rvcih0LGUscil7dGhpcy5FbGVtZW50cz10LHRoaXMuSz1lLHRoaXMuRGlzdGFuY2VGbj1yLHRoaXMuT3B0aW1pc2F0aW9uQ29tcGxldGVkPSExLHRoaXMuaXRlcmF0ZT0oKT0+e3RoaXMuSXRlcmF0aW9uQ291bnQrKyx0aGlzLkNsdXN0ZXJzfHx0aGlzLmFsbG9jYXRlVG9DbHVzdGVyc0Fyb3VuZEN1cnJlbnRNZWRvaWRzKCk7Y29uc3QgdD10aGlzLk1lZG9pZHMsZT10aGlzLkNsdXN0ZXJzLHI9dGhpcy5jYWxjdWxhdGVDdXJyZW50Q29zdCgpO2xldCBvPXI7Zm9yKGxldCB0PTA7dDx0aGlzLk1lZG9pZHMubGVuZ3RoO3QrKyl7Y29uc3QgZT10PT4wPT09dGhpcy5NZWRvaWRzLmZpbHRlcigoZT0+MD09PXRoaXMuRGlzdGFuY2VGbih0LGUpKSkubGVuZ3RoO2Zvcihjb25zdCByIG9mIHRoaXMuRWxlbWVudHMuZmlsdGVyKGUpKXtjb25zdCBlPXRoaXMuTWVkb2lkcy5zbGljZSgpO2VbdF09cjtjb25zdCBuPW5ldyBKbyh0aGlzLkVsZW1lbnRzLnNsaWNlKCksdGhpcy5LLHRoaXMuRGlzdGFuY2VGbik7bi5NZWRvaWRzPWUsbi5hbGxvY2F0ZVRvQ2x1c3RlcnNBcm91bmRDdXJyZW50TWVkb2lkcygpO2NvbnN0IHM9bi5jYWxjdWxhdGVDdXJyZW50Q29zdCgpO3M8byYmKG89cyx0aGlzLkNsdXN0ZXJzPW4uQ2x1c3RlcnMsdGhpcy5NZWRvaWRzPWUpfX1yZXR1cm4gdGhpcy5jYWxjdWxhdGVDdXJyZW50Q29zdCgpPHJ8fCh0aGlzLkNsdXN0ZXJzPWUsdGhpcy5NZWRvaWRzPXQsdGhpcy5PcHRpbWlzYXRpb25Db21wbGV0ZWQ9ITAsITEpfSx0aGlzLmdldENsdXN0ZXJlZERhdGE9KCk9Pih0aGlzLk9wdGltaXNhdGlvbkNvbXBsZXRlZHx8dGhpcy5ydW5Ub0NvbXBsZXRpb24oKSx0aGlzLkNsdXN0ZXJzLm1hcCgodD0+dC5FbGVtZW50cy5tYXAoKHQ9PnQuRWxlbWVudCkpKSkpLHRoaXMucnVuVG9Db21wbGV0aW9uPSgpPT57Zm9yKDt0aGlzLml0ZXJhdGUoKTspO30sdGhpcy5hbGxvY2F0ZVRvQ2x1c3RlcnNBcm91bmRDdXJyZW50TWVkb2lkcz0oKT0+e3RoaXMuQ2x1c3RlcnM9bmV3IEFycmF5LHRoaXMuTWVkb2lkcy5mb3JFYWNoKCh0PT57dGhpcy5DbHVzdGVycy5wdXNoKG5ldyBYby5DbHVzdGVyKHtFbGVtZW50czpbXSxNZWRvaWQ6dH0pKX0pKSx0aGlzLkVsZW1lbnRzLmZvckVhY2goKCh0LGUpPT57Y29uc3Qgcj10aGlzLmZpbmREaXN0YW5jZXModGhpcy5DbHVzdGVycy5tYXAoKHQ9PnQuTWVkb2lkKSksdCksbz1yLnJlZHVjZSgoKHQsZSxyLG8pPT5lPG9bdF0/cjp0KSwwKTt0aGlzLkNsdXN0ZXJzW29dLkVsZW1lbnRzLnB1c2goe0Rpc3RhbmNlRnJvbU1lZG9pZDpyW29dLEVsZW1lbnQ6dH0pfSkpfSx0aGlzLmNhbGN1bGF0ZUN1cnJlbnRDb3N0PSgpPT50aGlzLkNsdXN0ZXJzLm1hcCgodD0+dC5nZXRDb3N0KCkpKS5yZWR1Y2UoKCh0LGUpPT50K2UpLDApLHRoaXMuZmluZERpc3RhbmNlcz0odCxlKT0+dC5tYXAoKHQ9PnRoaXMuRGlzdGFuY2VGbih0LGUpKSksdGhpcy5zZWxlY3RJbml0aWFsTWVkb2lkcz0oKT0+e2lmKHRoaXMuSz49dGhpcy5FbGVtZW50cy5sZW5ndGgpdGhyb3cgWW8ua0d0RWxlbWVudEFyckxlbmd0aDtjb25zdCB0PVtdLGU9KHQsZSk9Pntmb3IoY29uc3QgciBvZiBlKWlmKDA9PT10aGlzLkRpc3RhbmNlRm4ocix0KSlyZXR1cm4hMTtyZXR1cm4hMH07bGV0IHI9MDtmb3IoO3I8dGhpcy5FbGVtZW50cy5sZW5ndGgmJnQubGVuZ3RoPHRoaXMuSzspZSh0aGlzLkVsZW1lbnRzW3JdLHQpJiZ0LnB1c2godGhpcy5FbGVtZW50c1tyXSkscisrO3JldHVybiB0fSx0aGlzLkRpc3RhbmNlRm49dGhpcy5EaXN0YW5jZUZufHxLby5kaXN0YW5jZSx0aGlzLk1lZG9pZHM9dGhpcy5zZWxlY3RJbml0aWFsTWVkb2lkcygpLHRoaXMuSXRlcmF0aW9uQ291bnQ9MH1nZXQgT3B0aW1pc2F0aW9uU3RhcnRlZCgpe3JldHVybiB0aGlzLkl0ZXJhdGlvbkNvdW50PjB9fUpvLmNsdXN0ZXJFbGVtZW50cz0odCxlLHIpPT57Sm8uZ2V0SW5zdGFuY2UodCxlLHIpO3JldHVybiBuZXcgQXJyYXl9LEpvLmdldEluc3RhbmNlPSh0LGUscik9Pm5ldyBKbyh0LGUsciksR28uQ2x1c3RlcmVyPUpvLGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7Zm9yKHZhciByIGluIGUpdC5oYXNPd25Qcm9wZXJ0eShyKXx8KHRbcl09ZVtyXSl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGUoVW8pLGUoR28pfShEbyk7dmFyIFpvPXFvKERvKTtmdW5jdGlvbiBIbyh0KXtyZXR1cm4gSG89ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIHR9LEhvKHQpfWZ1bmN0aW9uIFFvKHQpe3ZhciBlPWZ1bmN0aW9uKHQsZSl7aWYoIm9iamVjdCIhPT1Ibyh0KXx8bnVsbD09PXQpcmV0dXJuIHQ7dmFyIHI9dFtTeW1ib2wudG9QcmltaXRpdmVdO2lmKHZvaWQgMCE9PXIpe3ZhciBvPXIuY2FsbCh0LGV8fCJkZWZhdWx0Iik7aWYoIm9iamVjdCIhPT1IbyhvKSlyZXR1cm4gbzt0aHJvdyBuZXcgVHlwZUVycm9yKCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLiIpfXJldHVybigic3RyaW5nIj09PWU/U3RyaW5nOk51bWJlcikodCl9KHQsInN0cmluZyIpO3JldHVybiJzeW1ib2wiPT09SG8oZSk/ZTpTdHJpbmcoZSl9ZnVuY3Rpb24gdG4odCxlLHIpe3JldHVybihlPVFvKGUpKWluIHQ/T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7dmFsdWU6cixlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOnRbZV09cix0fWZ1bmN0aW9uIGVuKHQsZSl7bGV0IHI9MDtmb3IobGV0IG89MDtvPHQubGVuZ3RoO28rKylyKz0odFtvXS1lW29dKSoodFtvXS1lW29dKTtyZXR1cm4gcn1jb25zdCBybj17ZGlzdGFuY2VGdW5jdGlvbjplbn07ZnVuY3Rpb24gb24odCxlLHI9cm4pe2NvbnN0IG89ci5kaXN0YW5jZUZ1bmN0aW9ufHxybi5kaXN0YW5jZUZ1bmN0aW9uLG49ci5zaW1pbGFyaXR5RnVuY3Rpb258fHJuLnNpbWlsYXJpdHlGdW5jdGlvbjtsZXQgcz0tMTtpZigiZnVuY3Rpb24iPT10eXBlb2Ygbil7bGV0IHI9TnVtYmVyLk1JTl9WQUxVRTtmb3IobGV0IG89MDtvPHQubGVuZ3RoO28rKyl7Y29uc3QgaT1uKGUsdFtvXSk7aT5yJiYocj1pLHM9byl9fWVsc2V7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIG8pdGhyb3cgbmV3IEVycm9yKCJBIHNpbWlsYXJpdHkgb3IgZGlzdGFuY2UgZnVuY3Rpb24gaXQncyByZXF1aXJlZCIpO3tsZXQgcj1OdW1iZXIuTUFYX1ZBTFVFO2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bisrKXtjb25zdCBpPW8oZSx0W25dKTtpPHImJihyPWkscz1uKX19fXJldHVybiBzfWZ1bmN0aW9uIG5uKHQsZSxyLG8pe2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bisrKXJbbl09b24oZSx0W25dLHtkaXN0YW5jZUZ1bmN0aW9uOm99KTtyZXR1cm4gcn1jbGFzcyBzbntjb25zdHJ1Y3Rvcih0LGUscixvLG4pe3RoaXMuY2x1c3RlcnM9dCx0aGlzLmNlbnRyb2lkcz1lLHRoaXMuY29udmVyZ2VkPXIsdGhpcy5pdGVyYXRpb25zPW8sdGhpcy5kaXN0YW5jZT1ufW5lYXJlc3QodCl7Y29uc3QgZT1uZXcgQXJyYXkodC5sZW5ndGgpO3JldHVybiBubih0LHRoaXMuY2VudHJvaWRzLGUsdGhpcy5kaXN0YW5jZSl9Y29tcHV0ZUluZm9ybWF0aW9uKHQpe2xldCBlPXRoaXMuY2VudHJvaWRzLm1hcCgodD0+KHtjZW50cm9pZDp0LGVycm9yOjAsc2l6ZTowfSkpKTtmb3IobGV0IHI9MDtyPHQubGVuZ3RoO3IrKyllW3RoaXMuY2x1c3RlcnNbcl1dLmVycm9yKz10aGlzLmRpc3RhbmNlKHRbcl0sdGhpcy5jZW50cm9pZHNbdGhpcy5jbHVzdGVyc1tyXV0pLGVbdGhpcy5jbHVzdGVyc1tyXV0uc2l6ZSsrO2ZvcihsZXQgdD0wO3Q8dGhpcy5jZW50cm9pZHMubGVuZ3RoO3QrKyl7bGV0IHI9ZVt0XS5lcnJvcjtlW3RdLnNpemUmJi0xIT09cj9yLz1lW3RdLnNpemU6ZVt0XS5lcnJvcj0tMX1yZXR1cm4gZX19ZnVuY3Rpb24gdW4odCxlKXtjb25zdCByPTY1NTM1Jih0Pj4+PTApO3JldHVybigodC1yKSooZT4+Pj0wKT4+PjApK3IqZT4+PjB9Y2xhc3MgaG57Y29uc3RydWN0b3IodD1EYXRlLm5vdygpKXt0aGlzLnN0YXRlPW5ldyBVaW50MzJBcnJheSg0KSx0aGlzLmluaXQodCksdGhpcy5yYW5kb209dGhpcy5nZXRGbG9hdC5iaW5kKHRoaXMpfWdldFVpbnQzMigpe3JldHVybiB0aGlzLm5leHRTdGF0ZSgpLHRoaXMuc3RhdGVbM10rdGhpcy5zdGF0ZVsyXT4+PjB9Z2V0RmxvYXQoKXtyZXR1cm4gNS45NjA0NjQ0Nzc1MzkwNjNlLTgqKHRoaXMuZ2V0VWludDMyKCk+Pj44KX1pbml0KHQpe2lmKCFOdW1iZXIuaXNJbnRlZ2VyKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoInNlZWQgbXVzdCBiZSBhbiBpbnRlZ2VyIik7dGhpcy5zdGF0ZVswXT10LHRoaXMuc3RhdGVbMV09MCx0aGlzLnN0YXRlWzJdPTAsdGhpcy5zdGF0ZVszXT0wO2ZvcihsZXQgdD0xO3Q8ODt0KyspdGhpcy5zdGF0ZVszJnRdXj10K3VuKDE4MTI0MzMyNTMsdGhpcy5zdGF0ZVt0LTEmM11edGhpcy5zdGF0ZVt0LTEmM10+Pj4zMD4+PjApPj4+MDt0aGlzLnBlcmlvZENlcnRpZmljYXRpb24oKTtmb3IobGV0IHQ9MDt0PDg7dCsrKXRoaXMubmV4dFN0YXRlKCl9cGVyaW9kQ2VydGlmaWNhdGlvbigpezA9PT10aGlzLnN0YXRlWzBdJiYwPT09dGhpcy5zdGF0ZVsxXSYmMD09PXRoaXMuc3RhdGVbMl0mJjA9PT10aGlzLnN0YXRlWzNdJiYodGhpcy5zdGF0ZVswXT04OCx0aGlzLnN0YXRlWzFdPTgzLHRoaXMuc3RhdGVbMl09NjUsdGhpcy5zdGF0ZVszXT02OCl9bmV4dFN0YXRlKCl7bGV0IHQ9dGhpcy5zdGF0ZVswXTt0Xj10PDwxNSx0Xj10Pj4+MTgsdF49dGhpcy5zdGF0ZVszXTw8MTEsdGhpcy5zdGF0ZVswXT10aGlzLnN0YXRlWzFdLHRoaXMuc3RhdGVbMV09dGhpcy5zdGF0ZVsyXSx0aGlzLnN0YXRlWzJdPXRoaXMuc3RhdGVbM10sdGhpcy5zdGF0ZVszXT10fX1mdW5jdGlvbiBhbih0LGU9e30scj1NYXRoLnJhbmRvbSl7Y29uc3R7c2l6ZTpvPTEscmVwbGFjZTpuPSExLHByb2JhYmlsaXRpZXM6c309ZTtsZXQgaSx1O2lmKGk9Im51bWJlciI9PXR5cGVvZiB0P2Z1bmN0aW9uKHQpe2NvbnN0IGU9W107Zm9yKGxldCByPTA7cjx0O3IrKyllLnB1c2gocik7cmV0dXJuIGV9KHQpOnQuc2xpY2UoKSxzKXtpZighbil0aHJvdyBuZXcgRXJyb3IoImNob2ljZSB3aXRoIHByb2JhYmlsaXRpZXMgYW5kIG5vIHJlcGxhY2VtZW50IGlzIG5vdCBpbXBsZW1lbnRlZCIpO2lmKHMubGVuZ3RoIT09aS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJ0aGUgbGVuZ3RoIG9mIHByb2JhYmlsaXRpZXMgb3B0aW9uIHNob3VsZCBiZSBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIGNob2ljZXMiKTt1PVtzWzBdXTtmb3IobGV0IHQ9MTt0PHMubGVuZ3RoO3QrKyl1W3RdPXVbdC0xXStzW3RdO2lmKE1hdGguYWJzKDEtdVt1Lmxlbmd0aC0xXSk+MWUtOCl0aHJvdyBuZXcgRXJyb3IoYHByb2JhYmlsaXRpZXMgc2hvdWxkIHN1bSB0byAxLCBidXQgaW5zdGVhZCBzdW1zIHRvICR7dVt1Lmxlbmd0aC0xXX1gKX1pZighMT09PW4mJm8+aS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJzaXplIG9wdGlvbiBpcyB0b28gbGFyZ2UiKTtjb25zdCBoPVtdO2ZvcihsZXQgdD0wO3Q8bzt0Kyspe2NvbnN0IHQ9bG4oaS5sZW5ndGgscix1KTtoLnB1c2goaVt0XSksbnx8aS5zcGxpY2UodCwxKX1yZXR1cm4gaH1mdW5jdGlvbiBsbih0LGUscil7Y29uc3Qgbz1lKCk7aWYocil7bGV0IHQ9MDtmb3IoO28+clt0XTspdCsrO3JldHVybiB0fXJldHVybiBNYXRoLmZsb29yKG8qdCl9Y2xhc3MgY257Y29uc3RydWN0b3IodD1NYXRoLnJhbmRvbSl7aWYoIm51bWJlciI9PXR5cGVvZiB0KXtjb25zdCBlPW5ldyBobih0KTt0aGlzLnJhbmRvbUdlbmVyYXRvcj1lLnJhbmRvbX1lbHNlIHRoaXMucmFuZG9tR2VuZXJhdG9yPXR9Y2hvaWNlKHQsZSl7cmV0dXJuIGFuKHQsZSx0aGlzLnJhbmRvbUdlbmVyYXRvcil9cmFuZG9tKCl7cmV0dXJuIHRoaXMucmFuZG9tR2VuZXJhdG9yKCl9cmFuZEludCh0LGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT10LHQ9MCksdCtNYXRoLmZsb29yKHRoaXMucmFuZG9tR2VuZXJhdG9yKCkqKGUtdCkpfXJhbmRvbVNhbXBsZSh0KXtjb25zdCBlPVtdO2ZvcihsZXQgcj0wO3I8dDtyKyspZS5wdXNoKHRoaXMucmFuZG9tKCkpO3JldHVybiBlfX1mdW5jdGlvbiBmbih0LGUpe3ZhciByPU9iamVjdC5rZXlzKHQpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciBvPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModCk7ZSYmKG89by5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsZSkuZW51bWVyYWJsZX0pKSksci5wdXNoLmFwcGx5KHIsbyl9cmV0dXJuIHJ9ZnVuY3Rpb24gbW4odCl7Zm9yKHZhciBlPTE7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl7dmFyIHI9bnVsbCE9YXJndW1lbnRzW2VdP2FyZ3VtZW50c1tlXTp7fTtlJTI/Zm4oT2JqZWN0KHIpLCEwKS5mb3JFYWNoKChmdW5jdGlvbihlKXt0bih0LGUscltlXSl9KSk6T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM/T2JqZWN0LmRlZmluZVByb3BlcnRpZXModCxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhyKSk6Zm4oT2JqZWN0KHIpKS5mb3JFYWNoKChmdW5jdGlvbihlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocixlKSl9KSl9cmV0dXJuIHR9ZnVuY3Rpb24gZ24odCxlKXtjb25zdCByPW5ldyBaZSh0LnJvd3MsZS5yb3dzKTtmb3IobGV0IG89MDtvPHQucm93cztvKyspZm9yKGxldCBuPTA7bjxlLnJvd3M7bisrKXIuc2V0KG8sbixlbih0LmdldFJvdyhvKSxlLmdldFJvdyhuKSkpO3JldHVybiByfWZ1bmN0aW9uIHBuKHQpe2xldCBlPVtdO2ZvcihsZXQgcj0wO3I8dDtyKyspZS5wdXNoKHIpO3JldHVybiBlfWZ1bmN0aW9uIHduKHQpe2xldCBlPVt0WzBdXTtmb3IobGV0IHI9MTtyPHQubGVuZ3RoO3IrKyllW3JdPWVbci0xXSt0W3JdO3JldHVybiBlfWZ1bmN0aW9uIGRuKHQsZSl7dmFyIHI9T2JqZWN0LmtleXModCk7aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIG89T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0KTtlJiYobz1vLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxlKS5lbnVtZXJhYmxlfSkpKSxyLnB1c2guYXBwbHkocixvKX1yZXR1cm4gcn1mdW5jdGlvbiBibih0KXtmb3IodmFyIGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXt2YXIgcj1udWxsIT1hcmd1bWVudHNbZV0/YXJndW1lbnRzW2VdOnt9O2UlMj9kbihPYmplY3QociksITApLmZvckVhY2goKGZ1bmN0aW9uKGUpe3RuKHQsZSxyW2VdKX0pKTpPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycz9PYmplY3QuZGVmaW5lUHJvcGVydGllcyh0LE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHIpKTpkbihPYmplY3QocikpLmZvckVhY2goKGZ1bmN0aW9uKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihyLGUpKX0pKX1yZXR1cm4gdH1jb25zdCB5bj17bWF4SXRlcmF0aW9uczoxMDAsdG9sZXJhbmNlOjFlLTYsaW5pdGlhbGl6YXRpb246ImttZWFucysrIixkaXN0YW5jZUZ1bmN0aW9uOmVufTtmdW5jdGlvbiB2bih0LGUscixvLG4scyl7bGV0IGk9ZnVuY3Rpb24odCxlLHIsbyl7Y29uc3Qgbj1lWzBdLmxlbmd0aDtsZXQgcz1uZXcgQXJyYXkobyksaT1uZXcgQXJyYXkobyk7Zm9yKGxldCB0PTA7dDxvO3QrKyl7c1t0XT1uZXcgQXJyYXkobiksaVt0XT0wO2ZvcihsZXQgZT0wO2U8bjtlKyspc1t0XVtlXT0wfWZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKXtpW3JbdF1dKys7Zm9yKGxldCBvPTA7bzxuO28rKylzW3JbdF1dW29dKz1lW3RdW29dfWZvcihsZXQgZT0wO2U8bztlKyspZm9yKGxldCByPTA7cjxuO3IrKylpW2VdP3NbZV1bcl0vPWlbZV06c1tlXVtyXT10W2VdW3JdO3JldHVybiBzfSh0LGUscj1ubihlLHQscixuLmRpc3RhbmNlRnVuY3Rpb24pLG8pLHU9ZnVuY3Rpb24odCxlLHIsbyl7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspaWYocih0W25dLGVbbl0pPm8pcmV0dXJuITE7cmV0dXJuITB9KGksdCxuLmRpc3RhbmNlRnVuY3Rpb24sbi50b2xlcmFuY2UpO3JldHVybiBuZXcgc24ocixpLHUscyxuLmRpc3RhbmNlRnVuY3Rpb24pfWZ1bmN0aW9uIE1uKHQsZSxyKXtjb25zdCBvPWZ1bmN0aW9uKHQpe3JldHVybiBibihibih7fSx5biksdCl9KHIpOyFmdW5jdGlvbih0LGUpe2lmKGU8PTB8fGU+dC5sZW5ndGh8fCFOdW1iZXIuaXNJbnRlZ2VyKGUpKXRocm93IG5ldyBFcnJvcigiSyBzaG91bGQgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIHNtYWxsZXIgdGhhbiB0aGUgbnVtYmVyIG9mIHBvaW50cyIpfSh0LGUpO2xldCBuPWZ1bmN0aW9uKHQsZSxyKXtsZXQgbztpZihBcnJheS5pc0FycmF5KHIuaW5pdGlhbGl6YXRpb24pKXtpZihyLmluaXRpYWxpemF0aW9uLmxlbmd0aCE9PWUpdGhyb3cgbmV3IEVycm9yKCJUaGUgaW5pdGlhbCBjZW50ZXJzIHNob3VsZCBoYXZlIHRoZSBzYW1lIGxlbmd0aCBhcyBLIik7bz1yLmluaXRpYWxpemF0aW9ufWVsc2Ugc3dpdGNoKHIuaW5pdGlhbGl6YXRpb24pe2Nhc2Uia21lYW5zKysiOm89ZnVuY3Rpb24odCxlLHI9e30pe2NvbnN0IG89bmV3IFplKHQpLG49by5yb3dzLHM9bmV3IGNuKHIuc2VlZCksaT1bXSx1PXIubG9jYWxUcmlhbHN8fDIrTWF0aC5mbG9vcihNYXRoLmxvZyhlKSksaD1zLnJhbmRJbnQobik7aS5wdXNoKG8uZ2V0Um93KGgpKTtsZXQgYT1uZXcgWmUoMSxvLnJvd3MpO2ZvcihsZXQgdD0wO3Q8by5yb3dzO3QrKylhLnNldCgwLHQsZW4oby5nZXRSb3codCksaVswXSkpO2xldCBsPVt3bihhLmdldFJvdygwKSldO2NvbnN0IGM9MS9sWzBdW24tMV07bGV0IGY9WmUubXVsKGEsYyk7Zm9yKGxldCB0PTE7dDxlO3QrKyl7Y29uc3QgZT1zLmNob2ljZShuLHtyZXBsYWNlOiEwLHNpemU6dSxwcm9iYWJpbGl0aWVzOmYuZ2V0Um93KDApfSkscj1nbihvLnNlbGVjdGlvbihlLHBuKG8uY29sdW1ucykpLG8pO2xldCBoPTEvMCxjPTEvMCxtPWE7Zm9yKGxldCB0PTA7dDx1O3QrKyl7Y29uc3Qgbz1aZS5taW4oYSxbci5nZXRSb3codCldKSxuPW8uc3VtKCk7bjxjJiYoaD1lW3RdLGM9bixtPW8pfWlbdF09by5nZXRSb3coaCksYT1tLGw9W3duKGEuZ2V0Um93KDApKV0sZj1aZS5tdWwoYSwxL2xbMF1bbi0xXSl9cmV0dXJuIGl9KHQsZSxyKTticmVhaztjYXNlInJhbmRvbSI6bz1mdW5jdGlvbih0LGUscil7cmV0dXJuIG5ldyBjbihyKS5jaG9pY2UodCx7c2l6ZTplfSl9KHQsZSxyLnNlZWQpO2JyZWFrO2Nhc2UibW9zdERpc3RhbnQiOm89ZnVuY3Rpb24odCxlLHIsbyl7Y29uc3Qgbj1uZXcgY24obyk7bGV0IHM9bmV3IEFycmF5KGUpO2lmKHNbMF09TWF0aC5mbG9vcihuLnJhbmRvbSgpKnQubGVuZ3RoKSxlPjEpe2xldCBvPXtkaXN0Oi0xLGluZGV4Oi0xfTtmb3IobGV0IGU9MDtlPHQubGVuZ3RoOysrZSlyW3NbMF1dW2VdPm8uZGlzdCYmKG8uZGlzdD1yW3NbMF1dW2VdLG8uaW5kZXg9ZSk7aWYoc1sxXT1vLmluZGV4LGU+Milmb3IobGV0IG89MjtvPGU7KytvKXtsZXQgZT17ZGlzdDotMSxpbmRleDotMX07Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDsrK24pe2xldCB0PXtkaXN0Ok51bWJlci5NQVhfVkFMVUUsaW5kZXg6LTF9O2ZvcihsZXQgZT0wO2U8bzsrK2UpcltlXVtuXTx0LmRpc3QmJiFzLmluY2x1ZGVzKG4pJiYodD17ZGlzdDpyW2VdW25dLGluZGV4Om59KTt0LmRpc3QhPT1OdW1iZXIuTUFYX1ZBTFVFJiZ0LmRpc3Q+ZS5kaXN0JiYoZT1tbih7fSx0KSl9c1tvXT1lLmluZGV4fX1yZXR1cm4gcy5tYXAoKGU9PnRbZV0pKX0odCxlLGZ1bmN0aW9uKHQsZSl7bGV0IHI9bmV3IEFycmF5KHQubGVuZ3RoKTtmb3IobGV0IG89MDtvPHQubGVuZ3RoOysrbylmb3IobGV0IG49bztuPHQubGVuZ3RoOysrbil7cltvXXx8KHJbb109bmV3IEFycmF5KHQubGVuZ3RoKSkscltuXXx8KHJbbl09bmV3IEFycmF5KHQubGVuZ3RoKSk7Y29uc3Qgcz1lKHRbb10sdFtuXSk7cltvXVtuXT1zLHJbbl1bb109c31yZXR1cm4gcn0odCxyLmRpc3RhbmNlRnVuY3Rpb24pLHIuc2VlZCk7YnJlYWs7ZGVmYXVsdDohZnVuY3Rpb24odCxlKXt0aHJvdyBuZXcgRXJyb3IoYCR7ZX06ICIke1N0cmluZyh0KX0iYCl9KHIuaW5pdGlhbGl6YXRpb24sIlVua25vd24gaW5pdGlhbGl6YXRpb24gbWV0aG9kIil9cmV0dXJuIG99KHQsZSxvKTswPT09by5tYXhJdGVyYXRpb25zJiYoby5tYXhJdGVyYXRpb25zPU51bWJlci5NQVhfVkFMVUUpO2xldCBzLGk9bmV3IEFycmF5KHQubGVuZ3RoKSx1PSExLGg9MDtmb3IoOyF1JiZoPG8ubWF4SXRlcmF0aW9uczspcz12bihuLHQsaSxlLG8sKytoKSx1PXMuY29udmVyZ2VkLG49cy5jZW50cm9pZHM7aWYoIXMpdGhyb3cgbmV3IEVycm9yKCJ1bnJlYWNoYWJsZTogbm8ga21lYW5zIHN0ZXAgZXhlY3V0ZWQiKTtyZXR1cm4gc31mdW5jdGlvbiB4bih0LGUpe2xldCByPXt9O2Z1bmN0aW9uIG8odCl7dmFyIGUscjtyZXR1cm4gcj0iOiIsbnVsbD09KGU9dCk/IiI6JG8uY2FsbChlLHIpfXpyKHQsKCh0LGUpPT57bGV0IG49byh0KTtyW25dPWV9KSk7bGV0IG49Wm8uQ2x1c3RlcmVyLmdldEluc3RhbmNlKHQsZSkuZ2V0Q2x1c3RlcmVkRGF0YSgpO3JldHVybiBuPVRvKG4sKHQ9PlRvKHQsKHQ9PntsZXQgZT1vKHQpO3JldHVybiByW2VdfSkpKSksbn1mdW5jdGlvbiBFbih0LGU9e30pe2xldCByPXB0KGUsImtOdW1iZXIiKTtyPXBlKHIpP05lKHIpOjI7bGV0IG8sbj1wdChlLCJtb2RlIik7aWYoImstbWVkb2lkcyIhPT1uJiYiay1tZWFucyIhPT1uJiYobj0iay1tZWRvaWRzIiksImstbWVkb2lkcyI9PT1uKW89eG4odCxyKTtlbHNle2lmKCJrLW1lYW5zIiE9PW4pdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG1vZGVbJHtufV1gKTtvPWZ1bmN0aW9uKHQsZSl7bGV0IHI9TW4odCxlKSxvPXt9O3JldHVybiB6cihyLmNsdXN0ZXJzLCgodCxlKT0+e29bdF18fChvW3RdPVtdKSxvW3RdLnB1c2goZSl9KSksem8obyl9KHQscil9cmV0dXJuIG99ZnVuY3Rpb24gU24odCxlPXt9KXtpZighY2UodCkpdGhyb3cgbmV3IEVycm9yKCJkYXRhIGlzIG5vdCBlZmYuIGFycmF5Iik7bGV0IHI9cHQoZSwia051bWJlciIpO3BlKHIpfHwocj0yKSxyPU5lKHIpO2xldCBvPXB0KGUsIm5Db21wTklQQUxTIik7cGUobyl8fChvPTIpLG89TmUobyk7bGV0IG49cHQoZSwibW9kZSIpLHM9IiIsaT1zZSh0KSx1PTAsaD0wO2lmKHpyKHQsKHQ9PnshZnVuY3Rpb24odCl7aWYodWUodCkpe2ZvcihsZXQgZSBpbiB0KXJldHVybiEwO3JldHVybiExfXJldHVybiExfSh0KT9jZSh0KSYmKGgrPTEpOnUrPTF9KSksdT09PWkpcz0ib2JqIjtlbHNle2lmKGghPT1pKXRocm93IG5ldyBFcnJvcigiZGF0YSBpcyBub3Qgb2YgdGhlIHNhbWUgdHlwZSIpO3M9Im1hdCJ9bGV0IGEsbD1udWxsOyJvYmoiPT09cz8obD1mdW5jdGlvbih0KXtsZXQgZT17fTt6cih0LCh0PT57enIodCwoKHQscik9PntlW3JdfHwoZVtyXT0wKSwwPT09ZVtyXSYmcGUodCkmJihlW3JdPTEpLDEhPT1lW3JdfHxwZSh0KXx8KGVbcl09LTEpfSkpfSkpO2xldCByPVtdO3JldHVybiB6cihlLCgodCxlKT0+ezE9PT10JiZyLnB1c2goZSl9KSkscn0odCksYT1mdW5jdGlvbih0LGUpe3JldHVybiBUbyh0LCh0PT56byhWbyh0LGUpKSkpfSh0LGwpKTphPXQ7bGV0IGM9dXIoYSx7bkNvbXBOSVBBTFM6b30pLGY9RW4oYyx7a051bWJlcjpyLG1vZGU6bn0pO3JldHVybntrZXlzOmwsZ2luZHM6ZixnbWF0OlRvKGYsKHQ9PlRvKHQsKHQ9PmNbdF0pKSkpLGdsdGR0OlRvKGYsKGU9PlRvKGUsKGU9PnRbZV0pKSkpfX1sZXQgV0NsdXN0ZXI9e1BDQTphc3luYyBmdW5jdGlvbih0LGU9e30pe3JldHVybiB1cih0LGUpfSxjbHVzdGVyOmFzeW5jIGZ1bmN0aW9uKHQsZT17fSl7dHJ5e3JldHVybiBTbih0LGUpfWNhdGNoKHQpe3JldHVybiBQcm9taXNlLnJlamVjdCh0KX19fTsKCmxldCBpbnN0YW5jZSA9IG51bGwKZnVuY3Rpb24gaW5pdChpbnB1dCl7CgogICAgLy9pbml0CiAgICBsZXQgcgogICAgCiAgICAgICAgciA9IFdDbHVzdGVyKC4uLmlucHV0KQogICAgICAgIAoKICAgIC8vb24KICAgIAoKICAgIC8vc2F2ZQogICAgaW5zdGFuY2UgPSByCgp9CgpmdW5jdGlvbiBzZW5kTWVzc2FnZShkYXRhKSB7CiAgICAKICAgICAgICBzZWxmLnBvc3RNZXNzYWdlKGRhdGEpCiAgICAgICAgCn0KCmFzeW5jIGZ1bmN0aW9uIHJ1bihkYXRhKSB7CiAgICAvLyBjb25zb2xlLmxvZygnaW5uZXIgd29ya2VyIHJ1bicsZGF0YSkKCiAgICAvL21vZGUKICAgIGxldCBtb2RlID0gZGF0YS5tb2RlCgogICAgLy9jaGVjawogICAgaWYobW9kZSAhPT0gJ2luaXQnICYmIG1vZGUgIT09ICdjYWxsJyl7CiAgICAgICAgcmV0dXJuCiAgICB9CgogICAgLy9pbml0CiAgICBpZihtb2RlID09PSAnaW5pdCcpewogICAgICAgIAogICAgICAgIHRyeXsKCiAgICAgICAgICAgIC8vdHlwZQogICAgICAgICAgICBsZXQgdHlwZSA9IGRhdGEudHlwZQoKICAgICAgICAgICAgLy9pbnB1dAogICAgICAgICAgICBsZXQgaW5wdXQgPSBkYXRhLmlucHV0CiAgICAKICAgICAgICAgICAgLy9pbnN0YW5jZQogICAgICAgICAgICBpZih0eXBlID09PSAnZnVuY3Rpb24nKXsKICAgICAgICAgICAgICAgIGluaXQoLi4uaW5wdXQpCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZih0eXBlID09PSAnb2JqZWN0Jyl7CiAgICAgICAgICAgICAgICBpbnN0YW5jZSA9IFdDbHVzdGVyCiAgICAgICAgICAgIH0KCiAgICAgICAgfQogICAgICAgIGNhdGNoKGVycil7CiAgICAgICAgCiAgICAgICAgICAgIC8vc2VuZE1lc3NhZ2UKICAgICAgICAgICAgbGV0IHJlcyA9IHsKICAgICAgICAgICAgICAgIG1vZGU6ICdlbWl0JywKICAgICAgICAgICAgICAgIGV2TmFtZTogJ2Vycm9yJywKICAgICAgICAgICAgICAgIG1zZzogZXJyLAogICAgICAgICAgICB9CiAgICAgICAgICAgIHNlbmRNZXNzYWdlKHJlcykKCiAgICAgICAgfQogICAgICAgICAgICAKICAgIH0KCiAgICAvL2NoZWNrCiAgICBpZihtb2RlID09PSAnY2FsbCcpewogICAgICAgIGxldCBzdGF0ZSA9ICcnCiAgICAgICAgbGV0IG1zZyA9IG51bGwKCiAgICAgICAgdHJ5ewoKICAgICAgICAgICAgLy9mdW4KICAgICAgICAgICAgbGV0IGZ1biA9IGluc3RhbmNlW2RhdGEuZnVuXQoKICAgICAgICAgICAgLy9pbnB1dAogICAgICAgICAgICBsZXQgaW5wdXQgPSBkYXRhLmlucHV0CgogICAgICAgICAgICAvL2V4ZWMKICAgICAgICAgICAgYXdhaXQgZnVuKC4uLmlucHV0KQogICAgICAgICAgICAgICAgLnRoZW4oKHN1YykgPT4gewogICAgICAgICAgICAgICAgICAgIHN0YXRlPSdzdWNjZXNzJwogICAgICAgICAgICAgICAgICAgIG1zZz1zdWMKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAuY2F0Y2goKGVycikgPT4gewogICAgICAgICAgICAgICAgICAgIHN0YXRlPSdlcnJvcicKICAgICAgICAgICAgICAgICAgICBtc2c9ZXJyCiAgICAgICAgICAgICAgICB9KQoKICAgICAgICB9CiAgICAgICAgY2F0Y2goZXJyKXsKICAgICAgICAgICAgc3RhdGUgPSAnZXJyb3InCiAgICAgICAgICAgIG1zZyA9IGVycgogICAgICAgIH0KICAgICAgICAKICAgICAgICAvL3NlbmRNZXNzYWdlCiAgICAgICAgbGV0IHJlcyA9IHsKICAgICAgICAgICAgbW9kZTogJ3JldHVybicsCiAgICAgICAgICAgIGlkOiBkYXRhLmlkLAogICAgICAgICAgICBmdW46IGRhdGEuZnVuLAogICAgICAgICAgICBzdGF0ZSwKICAgICAgICAgICAgbXNnLAogICAgICAgIH0KICAgICAgICBzZW5kTWVzc2FnZShyZXMpCgogICAgfQoKfQoKZnVuY3Rpb24gcmVjdk1lc3NhZ2UoZGF0YSkgewogICAgLy8gY29uc29sZS5sb2coJ2lubmVyIHdvcmtlciByZWN2OicsIGRhdGEpCgogICAgLy9kYXRhUmVjdgogICAgbGV0IGRhdGFSZWN2ID0gZGF0YQoKICAgIC8vcnVuCiAgICBydW4oZGF0YVJlY3YpCgp9CgoKICAgICAgICBzZWxmLm9ubWVzc2FnZSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIHJlY3ZNZXNzYWdlKGUuZGF0YSkKICAgICAgICB9CiAgICAgICAgCgo=");function c(){let c=d(),X=function(d){try{let l=new Blob([d]),b=window.URL||window.webkitURL;return new Worker(b.createObjectURL(l))}catch(d){G(d)}}(Z);if(!X)return G("invalid worker"),null;function G(d){c.emit("error",d)}return X.onmessage=function(d){!function(d){let l=d,b=l.mode;"emit"!==b&&"return"!==b||("emit"===b&&c.emit(l.evName,l.msg),"return"===b&&c.emit(l.id,l))}(d.data)},X.onerror=G,function(){let d={mode:"init",type:"object",input:[...arguments]};X.postMessage(d)}([...arguments]),c.PCA=function(){let d=l(),Z=b(),G={mode:"call",id:Z,fun:"PCA",input:[...arguments]};return X.postMessage(G),c.once(Z,(l=>{"success"===l.state?d.resolve(l.msg):d.reject(l.msg)})),d},c.cluster=function(){let d=l(),Z=b(),G={mode:"call",id:Z,fun:"cluster",input:[...arguments]};return X.postMessage(G),c.once(Z,(l=>{"success"===l.state?d.resolve(l.msg):d.reject(l.msg)})),d},c.terminate=function(){X?(X.terminate(),X=void 0):G("worker has been terminated")},c}let X={PCA:async function(){let d=[...arguments],l=c();return await l.PCA(...d).finally((()=>{l.terminate()}))},cluster:async function(){let d=[...arguments],l=c();return await l.cluster(...d).finally((()=>{l.terminate()}))}};s=d();for(let d in X){let l=X[d];s[d]=l}}(),s}()}({get exports(){return Z},set exports(d){Z=d}});var c=Z;let X;return X="undefined"!=typeof window&&void 0!==window.document?c:b,X}));