w-json-stream 1.0.21 → 1.0.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/ci-test.yml +3 -3
- package/LICENSE +8 -0
- package/README.md +21 -9
- package/babel.config.js +4 -3
- package/dist/into-stream.umd.js +1 -1
- package/dist/json-stream-stringify.umd.js +1 -1
- package/dist/through.umd.js +1 -1
- package/dist/w-json-stream.umd.js +1 -1
- package/dist/w-json-stream.umd.js.map +1 -1
- package/dist/w-json-stream.wk.umd.js +1 -1
- package/docs/WJsonStream.mjs.html +1 -1
- package/docs/examples/ex-large-webworker.html +2 -2
- package/docs/examples/ex-large.html +2 -2
- package/docs/examples/ex-small-stream.html +2 -2
- package/docs/examples/ex-small.html +2 -2
- package/docs/examples/ex-stream-createParseStream.html +3 -3
- package/docs/examples/ex-stream-createParseStreamWithFilter.html +4 -4
- package/docs/examples/ex-stream-createStringifyStream.html +2 -2
- package/docs/global.html +1 -1
- package/docs/index.html +1 -1
- package/examples/ex-stream-createParseStream.html +1 -1
- package/examples/ex-stream-createParseStreamWithFilter.html +1 -1
- package/g-large.mjs +3 -3
- package/g-small-stream.mjs +1 -1
- package/g-small.mjs +1 -1
- package/g-stream.mjs +2 -2
- package/package.json +4 -4
- package/script.txt +5 -5
- package/src/JSONStream.mjs +2 -2
- package/src/intoStream.mjs +1 -1
- package/test/createStringifyStream.test.mjs +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
!function(l,Z){"object"==typeof exports&&"undefined"!=typeof module?module.exports=Z(require("worker_threads")):"function"==typeof define&&define.amd?define(["worker_threads"],Z):(l="undefined"!=typeof globalThis?globalThis:l||self)["w-json-stream"]=Z(l.worker_threads)}(this,(function(l){"use strict";"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;var Z={};!function(Z,d){Z.exports=function(l){var Z={};!function(l){var Z=Object.prototype.hasOwnProperty,d="~";function m(){}function c(l,Z,d){this.fn=l,this.context=Z,this.once=d||!1}function G(l,Z,m,G,b){if("function"!=typeof m)throw new TypeError("The listener must be a function");var X=new c(m,G||l,b),W=d?d+Z:Z;return l._events[W]?l._events[W].fn?l._events[W]=[l._events[W],X]:l._events[W].push(X):(l._events[W]=X,l._eventsCount++),l}function b(l,Z){0==--l._eventsCount?l._events=new m:delete l._events[Z]}function X(){this._events=new m,this._eventsCount=0}Object.create&&(m.prototype=Object.create(null),(new m).__proto__||(d=!1)),X.prototype.eventNames=function(){var l,m,c=[];if(0===this._eventsCount)return c;for(m in l=this._events)Z.call(l,m)&&c.push(d?m.slice(1):m);return Object.getOwnPropertySymbols?c.concat(Object.getOwnPropertySymbols(l)):c},X.prototype.listeners=function(l){var Z=d?d+l:l,m=this._events[Z];if(!m)return[];if(m.fn)return[m.fn];for(var c=0,G=m.length,b=new Array(G);c<G;c++)b[c]=m[c].fn;return b},X.prototype.listenerCount=function(l){var Z=d?d+l:l,m=this._events[Z];return m?m.fn?1:m.length:0},X.prototype.emit=function(l,Z,m,c,G,b){var X=d?d+l:l;if(!this._events[X])return!1;var W,y,I=this._events[X],i=arguments.length;if(I.fn){switch(I.once&&this.removeListener(l,I.fn,void 0,!0),i){case 1:return I.fn.call(I.context),!0;case 2:return I.fn.call(I.context,Z),!0;case 3:return I.fn.call(I.context,Z,m),!0;case 4:return I.fn.call(I.context,Z,m,c),!0;case 5:return I.fn.call(I.context,Z,m,c,G),!0;case 6:return I.fn.call(I.context,Z,m,c,G,b),!0}for(y=1,W=new Array(i-1);y<i;y++)W[y-1]=arguments[y];I.fn.apply(I.context,W)}else{var p,u=I.length;for(y=0;y<u;y++)switch(I[y].once&&this.removeListener(l,I[y].fn,void 0,!0),i){case 1:I[y].fn.call(I[y].context);break;case 2:I[y].fn.call(I[y].context,Z);break;case 3:I[y].fn.call(I[y].context,Z,m);break;case 4:I[y].fn.call(I[y].context,Z,m,c);break;default:if(!W)for(p=1,W=new Array(i-1);p<i;p++)W[p-1]=arguments[p];I[y].fn.apply(I[y].context,W)}}return!0},X.prototype.on=function(l,Z,d){return G(this,l,Z,d,!1)},X.prototype.once=function(l,Z,d){return G(this,l,Z,d,!0)},X.prototype.removeListener=function(l,Z,m,c){var G=d?d+l:l;if(!this._events[G])return this;if(!Z)return b(this,G),this;var X=this._events[G];if(X.fn)X.fn!==Z||c&&!X.once||m&&X.context!==m||b(this,G);else{for(var W=0,y=[],I=X.length;W<I;W++)(X[W].fn!==Z||c&&!X[W].once||m&&X[W].context!==m)&&y.push(X[W]);y.length?this._events[G]=1===y.length?y[0]:y:b(this,G)}return this},X.prototype.removeAllListeners=function(l){var Z;return l?(Z=d?d+l:l,this._events[Z]&&b(this,Z)):(this._events=new m,this._eventsCount=0),this},X.prototype.off=X.prototype.removeListener,X.prototype.addListener=X.prototype.on,X.prefixed=d,X.EventEmitter=X,l.exports=X}({get exports(){return Z},set exports(l){Z=l}});var d=Z;let m;return function(){if("nodejs"!=("undefined"!=typeof window&&void 0!==window.document?"browser":"nodejs"))return null;function Z(){return new d}function c(){let l,Z,d=new Promise((function(){l=arguments[0],Z=arguments[1]}));return d.resolve=l,d.reject=Z,d}function G(){let l=arguments.length>0&&void 0!==arguments[0]?arguments[0]:10,Z=[],d="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""),m=d.length;for(let c=0;c<l;c++)Z[c]=d[0|Math.random()*m];return Z.join("")}let b=(X="CgogICAgICAgIGxldCB7IHBhcmVudFBvcnQgfSA9IHJlcXVpcmUoJ3dvcmtlcl90aHJlYWRzJykKICAgICAgICAKCmZ1bmN0aW9uIHQoKXt9ZnVuY3Rpb24gZSgpe2UuaW5pdC5jYWxsKHRoaXMpfWZ1bmN0aW9uIHIodCl7cmV0dXJuIHZvaWQgMD09PXQuX21heExpc3RlbmVycz9lLmRlZmF1bHRNYXhMaXN0ZW5lcnM6dC5fbWF4TGlzdGVuZXJzfWZ1bmN0aW9uIG4oZSxuLGksbyl7dmFyIHMsYSx1LGg7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGkpdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3RlbmVyIiBhcmd1bWVudCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtpZigoYT1lLl9ldmVudHMpPyhhLm5ld0xpc3RlbmVyJiYoZS5lbWl0KCJuZXdMaXN0ZW5lciIsbixpLmxpc3RlbmVyP2kubGlzdGVuZXI6aSksYT1lLl9ldmVudHMpLHU9YVtuXSk6KGE9ZS5fZXZlbnRzPW5ldyB0LGUuX2V2ZW50c0NvdW50PTApLHUpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB1P3U9YVtuXT1vP1tpLHVdOlt1LGldOm8/dS51bnNoaWZ0KGkpOnUucHVzaChpKSwhdS53YXJuZWQmJihzPXIoZSkpJiZzPjAmJnUubGVuZ3RoPnMpe3Uud2FybmVkPSEwO3ZhciBmPW5ldyBFcnJvcigiUG9zc2libGUgRXZlbnRFbWl0dGVyIG1lbW9yeSBsZWFrIGRldGVjdGVkLiAiK3UubGVuZ3RoKyIgIituKyIgbGlzdGVuZXJzIGFkZGVkLiBVc2UgZW1pdHRlci5zZXRNYXhMaXN0ZW5lcnMoKSB0byBpbmNyZWFzZSBsaW1pdCIpO2YubmFtZT0iTWF4TGlzdGVuZXJzRXhjZWVkZWRXYXJuaW5nIixmLmVtaXR0ZXI9ZSxmLnR5cGU9bixmLmNvdW50PXUubGVuZ3RoLGg9ZiwiZnVuY3Rpb24iPT10eXBlb2YgY29uc29sZS53YXJuP2NvbnNvbGUud2FybihoKTpjb25zb2xlLmxvZyhoKX19ZWxzZSB1PWFbbl09aSwrK2UuX2V2ZW50c0NvdW50O3JldHVybiBlfWZ1bmN0aW9uIGkodCxlLHIpe3ZhciBuPSExO2Z1bmN0aW9uIGkoKXt0LnJlbW92ZUxpc3RlbmVyKGUsaSksbnx8KG49ITAsci5hcHBseSh0LGFyZ3VtZW50cykpfXJldHVybiBpLmxpc3RlbmVyPXIsaX1mdW5jdGlvbiBvKHQpe3ZhciBlPXRoaXMuX2V2ZW50cztpZihlKXt2YXIgcj1lW3RdO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiByKXJldHVybiAxO2lmKHIpcmV0dXJuIHIubGVuZ3RofXJldHVybiAwfWZ1bmN0aW9uIHModCxlKXtmb3IodmFyIHI9bmV3IEFycmF5KGUpO2UtLTspcltlXT10W2VdO3JldHVybiByfXQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobnVsbCksZS5FdmVudEVtaXR0ZXI9ZSxlLnVzaW5nRG9tYWlucz0hMSxlLnByb3RvdHlwZS5kb21haW49dm9pZCAwLGUucHJvdG90eXBlLl9ldmVudHM9dm9pZCAwLGUucHJvdG90eXBlLl9tYXhMaXN0ZW5lcnM9dm9pZCAwLGUuZGVmYXVsdE1heExpc3RlbmVycz0xMCxlLmluaXQ9ZnVuY3Rpb24oKXt0aGlzLmRvbWFpbj1udWxsLGUudXNpbmdEb21haW5zJiZ1bmRlZmluZWQuYWN0aXZlLHRoaXMuX2V2ZW50cyYmdGhpcy5fZXZlbnRzIT09T2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpLl9ldmVudHN8fCh0aGlzLl9ldmVudHM9bmV3IHQsdGhpcy5fZXZlbnRzQ291bnQ9MCksdGhpcy5fbWF4TGlzdGVuZXJzPXRoaXMuX21heExpc3RlbmVyc3x8dm9pZCAwfSxlLnByb3RvdHlwZS5zZXRNYXhMaXN0ZW5lcnM9ZnVuY3Rpb24odCl7aWYoIm51bWJlciIhPXR5cGVvZiB0fHx0PDB8fGlzTmFOKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJuIiBhcmd1bWVudCBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyJyk7cmV0dXJuIHRoaXMuX21heExpc3RlbmVycz10LHRoaXN9LGUucHJvdG90eXBlLmdldE1heExpc3RlbmVycz1mdW5jdGlvbigpe3JldHVybiByKHRoaXMpfSxlLnByb3RvdHlwZS5lbWl0PWZ1bmN0aW9uKHQpe3ZhciBlLHIsbixpLG8sYSx1LGg9ImVycm9yIj09PXQ7aWYoYT10aGlzLl9ldmVudHMpaD1oJiZudWxsPT1hLmVycm9yO2Vsc2UgaWYoIWgpcmV0dXJuITE7aWYodT10aGlzLmRvbWFpbixoKXtpZihlPWFyZ3VtZW50c1sxXSwhdSl7aWYoZSBpbnN0YW5jZW9mIEVycm9yKXRocm93IGU7dmFyIGY9bmV3IEVycm9yKCdVbmNhdWdodCwgdW5zcGVjaWZpZWQgImVycm9yIiBldmVudC4gKCcrZSsiKSIpO3Rocm93IGYuY29udGV4dD1lLGZ9cmV0dXJuIGV8fChlPW5ldyBFcnJvcignVW5jYXVnaHQsIHVuc3BlY2lmaWVkICJlcnJvciIgZXZlbnQnKSksZS5kb21haW5FbWl0dGVyPXRoaXMsZS5kb21haW49dSxlLmRvbWFpblRocm93bj0hMSx1LmVtaXQoImVycm9yIixlKSwhMX1pZighKHI9YVt0XSkpcmV0dXJuITE7dmFyIGM9ImZ1bmN0aW9uIj09dHlwZW9mIHI7c3dpdGNoKG49YXJndW1lbnRzLmxlbmd0aCl7Y2FzZSAxOiFmdW5jdGlvbih0LGUscil7aWYoZSl0LmNhbGwocik7ZWxzZSBmb3IodmFyIG49dC5sZW5ndGgsaT1zKHQsbiksbz0wO288bjsrK28paVtvXS5jYWxsKHIpfShyLGMsdGhpcyk7YnJlYWs7Y2FzZSAyOiFmdW5jdGlvbih0LGUscixuKXtpZihlKXQuY2FsbChyLG4pO2Vsc2UgZm9yKHZhciBpPXQubGVuZ3RoLG89cyh0LGkpLGE9MDthPGk7KythKW9bYV0uY2FsbChyLG4pfShyLGMsdGhpcyxhcmd1bWVudHNbMV0pO2JyZWFrO2Nhc2UgMzohZnVuY3Rpb24odCxlLHIsbixpKXtpZihlKXQuY2FsbChyLG4saSk7ZWxzZSBmb3IodmFyIG89dC5sZW5ndGgsYT1zKHQsbyksdT0wO3U8bzsrK3UpYVt1XS5jYWxsKHIsbixpKX0ocixjLHRoaXMsYXJndW1lbnRzWzFdLGFyZ3VtZW50c1syXSk7YnJlYWs7Y2FzZSA0OiFmdW5jdGlvbih0LGUscixuLGksbyl7aWYoZSl0LmNhbGwocixuLGksbyk7ZWxzZSBmb3IodmFyIGE9dC5sZW5ndGgsdT1zKHQsYSksaD0wO2g8YTsrK2gpdVtoXS5jYWxsKHIsbixpLG8pfShyLGMsdGhpcyxhcmd1bWVudHNbMV0sYXJndW1lbnRzWzJdLGFyZ3VtZW50c1szXSk7YnJlYWs7ZGVmYXVsdDpmb3IoaT1uZXcgQXJyYXkobi0xKSxvPTE7bzxuO28rKylpW28tMV09YXJndW1lbnRzW29dOyFmdW5jdGlvbih0LGUscixuKXtpZihlKXQuYXBwbHkocixuKTtlbHNlIGZvcih2YXIgaT10Lmxlbmd0aCxvPXModCxpKSxhPTA7YTxpOysrYSlvW2FdLmFwcGx5KHIsbil9KHIsYyx0aGlzLGkpfXJldHVybiEwfSxlLnByb3RvdHlwZS5hZGRMaXN0ZW5lcj1mdW5jdGlvbih0LGUpe3JldHVybiBuKHRoaXMsdCxlLCExKX0sZS5wcm90b3R5cGUub249ZS5wcm90b3R5cGUuYWRkTGlzdGVuZXIsZS5wcm90b3R5cGUucHJlcGVuZExpc3RlbmVyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4odGhpcyx0LGUsITApfSxlLnByb3RvdHlwZS5vbmNlPWZ1bmN0aW9uKHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3RlbmVyIiBhcmd1bWVudCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtyZXR1cm4gdGhpcy5vbih0LGkodGhpcyx0LGUpKSx0aGlzfSxlLnByb3RvdHlwZS5wcmVwZW5kT25jZUxpc3RlbmVyPWZ1bmN0aW9uKHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3RlbmVyIiBhcmd1bWVudCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtyZXR1cm4gdGhpcy5wcmVwZW5kTGlzdGVuZXIodCxpKHRoaXMsdCxlKSksdGhpc30sZS5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXI9ZnVuY3Rpb24oZSxyKXt2YXIgbixpLG8scyxhO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiByKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0ZW5lciIgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7aWYoIShpPXRoaXMuX2V2ZW50cykpcmV0dXJuIHRoaXM7aWYoIShuPWlbZV0pKXJldHVybiB0aGlzO2lmKG49PT1yfHxuLmxpc3RlbmVyJiZuLmxpc3RlbmVyPT09cikwPT0tLXRoaXMuX2V2ZW50c0NvdW50P3RoaXMuX2V2ZW50cz1uZXcgdDooZGVsZXRlIGlbZV0saS5yZW1vdmVMaXN0ZW5lciYmdGhpcy5lbWl0KCJyZW1vdmVMaXN0ZW5lciIsZSxuLmxpc3RlbmVyfHxyKSk7ZWxzZSBpZigiZnVuY3Rpb24iIT10eXBlb2Ygbil7Zm9yKG89LTEscz1uLmxlbmd0aDtzLS0gPjA7KWlmKG5bc109PT1yfHxuW3NdLmxpc3RlbmVyJiZuW3NdLmxpc3RlbmVyPT09cil7YT1uW3NdLmxpc3RlbmVyLG89czticmVha31pZihvPDApcmV0dXJuIHRoaXM7aWYoMT09PW4ubGVuZ3RoKXtpZihuWzBdPXZvaWQgMCwwPT0tLXRoaXMuX2V2ZW50c0NvdW50KXJldHVybiB0aGlzLl9ldmVudHM9bmV3IHQsdGhpcztkZWxldGUgaVtlXX1lbHNlIWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPWUsbj1yKzEsaT10Lmxlbmd0aDtuPGk7cis9MSxuKz0xKXRbcl09dFtuXTt0LnBvcCgpfShuLG8pO2kucmVtb3ZlTGlzdGVuZXImJnRoaXMuZW1pdCgicmVtb3ZlTGlzdGVuZXIiLGUsYXx8cil9cmV0dXJuIHRoaXN9LGUucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycz1mdW5jdGlvbihlKXt2YXIgcixuO2lmKCEobj10aGlzLl9ldmVudHMpKXJldHVybiB0aGlzO2lmKCFuLnJlbW92ZUxpc3RlbmVyKXJldHVybiAwPT09YXJndW1lbnRzLmxlbmd0aD8odGhpcy5fZXZlbnRzPW5ldyB0LHRoaXMuX2V2ZW50c0NvdW50PTApOm5bZV0mJigwPT0tLXRoaXMuX2V2ZW50c0NvdW50P3RoaXMuX2V2ZW50cz1uZXcgdDpkZWxldGUgbltlXSksdGhpcztpZigwPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKHZhciBpLG89T2JqZWN0LmtleXMobikscz0wO3M8by5sZW5ndGg7KytzKSJyZW1vdmVMaXN0ZW5lciIhPT0oaT1vW3NdKSYmdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoaSk7cmV0dXJuIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCJyZW1vdmVMaXN0ZW5lciIpLHRoaXMuX2V2ZW50cz1uZXcgdCx0aGlzLl9ldmVudHNDb3VudD0wLHRoaXN9aWYoImZ1bmN0aW9uIj09dHlwZW9mKHI9bltlXSkpdGhpcy5yZW1vdmVMaXN0ZW5lcihlLHIpO2Vsc2UgaWYocilkb3t0aGlzLnJlbW92ZUxpc3RlbmVyKGUscltyLmxlbmd0aC0xXSl9d2hpbGUoclswXSk7cmV0dXJuIHRoaXN9LGUucHJvdG90eXBlLmxpc3RlbmVycz1mdW5jdGlvbih0KXt2YXIgZSxyPXRoaXMuX2V2ZW50cztyZXR1cm4gciYmKGU9clt0XSk/ImZ1bmN0aW9uIj09dHlwZW9mIGU/W2UubGlzdGVuZXJ8fGVdOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgQXJyYXkodC5sZW5ndGgpLHI9MDtyPGUubGVuZ3RoOysrcillW3JdPXRbcl0ubGlzdGVuZXJ8fHRbcl07cmV0dXJuIGV9KGUpOltdfSxlLmxpc3RlbmVyQ291bnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdC5saXN0ZW5lckNvdW50P3QubGlzdGVuZXJDb3VudChlKTpvLmNhbGwodCxlKX0sZS5wcm90b3R5cGUubGlzdGVuZXJDb3VudD1vLGUucHJvdG90eXBlLmV2ZW50TmFtZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZXZlbnRzQ291bnQ+MD9SZWZsZWN0Lm93bktleXModGhpcy5fZXZlbnRzKTpbXX07dmFyIGE9InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWw/Z2xvYmFsOiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZj9zZWxmOiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzp7fSx1PVtdLGg9W10sZj0idW5kZWZpbmVkIiE9dHlwZW9mIFVpbnQ4QXJyYXk/VWludDhBcnJheTpBcnJheSxjPSExO2Z1bmN0aW9uIGwoKXtjPSEwO2Zvcih2YXIgdD0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyIsZT0wLHI9dC5sZW5ndGg7ZTxyOysrZSl1W2VdPXRbZV0saFt0LmNoYXJDb2RlQXQoZSldPWU7aFsiLSIuY2hhckNvZGVBdCgwKV09NjIsaFsiXyIuY2hhckNvZGVBdCgwKV09NjN9ZnVuY3Rpb24gcCh0LGUscil7Zm9yKHZhciBuLGksbz1bXSxzPWU7czxyO3MrPTMpbj0odFtzXTw8MTYpKyh0W3MrMV08PDgpK3RbcysyXSxvLnB1c2godVsoaT1uKT4+MTgmNjNdK3VbaT4+MTImNjNdK3VbaT4+NiY2M10rdVs2MyZpXSk7cmV0dXJuIG8uam9pbigiIil9ZnVuY3Rpb24gZCh0KXt2YXIgZTtjfHxsKCk7Zm9yKHZhciByPXQubGVuZ3RoLG49ciUzLGk9IiIsbz1bXSxzPTE2MzgzLGE9MCxoPXItbjthPGg7YSs9cylvLnB1c2gocCh0LGEsYStzPmg/aDphK3MpKTtyZXR1cm4gMT09PW4/KGU9dFtyLTFdLGkrPXVbZT4+Ml0saSs9dVtlPDw0JjYzXSxpKz0iPT0iKToyPT09biYmKGU9KHRbci0yXTw8OCkrdFtyLTFdLGkrPXVbZT4+MTBdLGkrPXVbZT4+NCY2M10saSs9dVtlPDwyJjYzXSxpKz0iPSIpLG8ucHVzaChpKSxvLmpvaW4oIiIpfWZ1bmN0aW9uIGcodCxlLHIsbixpKXt2YXIgbyxzLGE9OCppLW4tMSx1PSgxPDxhKS0xLGg9dT4+MSxmPS03LGM9cj9pLTE6MCxsPXI/LTE6MSxwPXRbZStjXTtmb3IoYys9bCxvPXAmKDE8PC1mKS0xLHA+Pj0tZixmKz1hO2Y+MDtvPTI1NipvK3RbZStjXSxjKz1sLGYtPTgpO2ZvcihzPW8mKDE8PC1mKS0xLG8+Pj0tZixmKz1uO2Y+MDtzPTI1NipzK3RbZStjXSxjKz1sLGYtPTgpO2lmKDA9PT1vKW89MS1oO2Vsc2V7aWYobz09PXUpcmV0dXJuIHM/TmFOOjEvMCoocD8tMToxKTtzKz1NYXRoLnBvdygyLG4pLG8tPWh9cmV0dXJuKHA/LTE6MSkqcypNYXRoLnBvdygyLG8tbil9ZnVuY3Rpb24geSh0LGUscixuLGksbyl7dmFyIHMsYSx1LGg9OCpvLWktMSxmPSgxPDxoKS0xLGM9Zj4+MSxsPTIzPT09aT9NYXRoLnBvdygyLC0yNCktTWF0aC5wb3coMiwtNzcpOjAscD1uPzA6by0xLGQ9bj8xOi0xLGc9ZTwwfHwwPT09ZSYmMS9lPDA/MTowO2ZvcihlPU1hdGguYWJzKGUpLGlzTmFOKGUpfHxlPT09MS8wPyhhPWlzTmFOKGUpPzE6MCxzPWYpOihzPU1hdGguZmxvb3IoTWF0aC5sb2coZSkvTWF0aC5MTjIpLGUqKHU9TWF0aC5wb3coMiwtcykpPDEmJihzLS0sdSo9MiksKGUrPXMrYz49MT9sL3U6bCpNYXRoLnBvdygyLDEtYykpKnU+PTImJihzKyssdS89MikscytjPj1mPyhhPTAscz1mKTpzK2M+PTE/KGE9KGUqdS0xKSpNYXRoLnBvdygyLGkpLHMrPWMpOihhPWUqTWF0aC5wb3coMixjLTEpKk1hdGgucG93KDIsaSkscz0wKSk7aT49ODt0W3IrcF09MjU1JmEscCs9ZCxhLz0yNTYsaS09OCk7Zm9yKHM9czw8aXxhLGgrPWk7aD4wO3RbcitwXT0yNTUmcyxwKz1kLHMvPTI1NixoLT04KTt0W3IrcC1kXXw9MTI4Kmd9dmFyIHY9e30udG9TdHJpbmcsYj1BcnJheS5pc0FycmF5fHxmdW5jdGlvbih0KXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT12LmNhbGwodCl9O2Z1bmN0aW9uIG0oKXtyZXR1cm4gXy5UWVBFRF9BUlJBWV9TVVBQT1JUPzIxNDc0ODM2NDc6MTA3Mzc0MTgyM31mdW5jdGlvbiB3KHQsZSl7aWYobSgpPGUpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkludmFsaWQgdHlwZWQgYXJyYXkgbGVuZ3RoIik7cmV0dXJuIF8uVFlQRURfQVJSQVlfU1VQUE9SVD8odD1uZXcgVWludDhBcnJheShlKSkuX19wcm90b19fPV8ucHJvdG90eXBlOihudWxsPT09dCYmKHQ9bmV3IF8oZSkpLHQubGVuZ3RoPWUpLHR9ZnVuY3Rpb24gXyh0LGUscil7aWYoIShfLlRZUEVEX0FSUkFZX1NVUFBPUlR8fHRoaXMgaW5zdGFuY2VvZiBfKSlyZXR1cm4gbmV3IF8odCxlLHIpO2lmKCJudW1iZXIiPT10eXBlb2YgdCl7aWYoInN0cmluZyI9PXR5cGVvZiBlKXRocm93IG5ldyBFcnJvcigiSWYgZW5jb2RpbmcgaXMgc3BlY2lmaWVkIHRoZW4gdGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmciKTtyZXR1cm4gayh0aGlzLHQpfXJldHVybiBTKHRoaXMsdCxlLHIpfWZ1bmN0aW9uIFModCxlLHIsbil7aWYoIm51bWJlciI9PXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoJyJ2YWx1ZSIgYXJndW1lbnQgbXVzdCBub3QgYmUgYSBudW1iZXInKTtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiZlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXI/ZnVuY3Rpb24odCxlLHIsbil7aWYoZS5ieXRlTGVuZ3RoLHI8MHx8ZS5ieXRlTGVuZ3RoPHIpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIidvZmZzZXQnIGlzIG91dCBvZiBib3VuZHMiKTtpZihlLmJ5dGVMZW5ndGg8cisobnx8MCkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIidsZW5ndGgnIGlzIG91dCBvZiBib3VuZHMiKTtlPXZvaWQgMD09PXImJnZvaWQgMD09PW4/bmV3IFVpbnQ4QXJyYXkoZSk6dm9pZCAwPT09bj9uZXcgVWludDhBcnJheShlLHIpOm5ldyBVaW50OEFycmF5KGUscixuKTtfLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHQ9ZSkuX19wcm90b19fPV8ucHJvdG90eXBlOnQ9Uih0LGUpO3JldHVybiB0fSh0LGUscixuKToic3RyaW5nIj09dHlwZW9mIGU/ZnVuY3Rpb24odCxlLHIpeyJzdHJpbmciPT10eXBlb2YgciYmIiIhPT1yfHwocj0idXRmOCIpO2lmKCFfLmlzRW5jb2RpbmcocikpdGhyb3cgbmV3IFR5cGVFcnJvcignImVuY29kaW5nIiBtdXN0IGJlIGEgdmFsaWQgc3RyaW5nIGVuY29kaW5nJyk7dmFyIG49MHxUKGUscik7dD13KHQsbik7dmFyIGk9dC53cml0ZShlLHIpO2khPT1uJiYodD10LnNsaWNlKDAsaSkpO3JldHVybiB0fSh0LGUscik6ZnVuY3Rpb24odCxlKXtpZihPKGUpKXt2YXIgcj0wfEEoZS5sZW5ndGgpO3JldHVybiAwPT09KHQ9dyh0LHIpKS5sZW5ndGh8fGUuY29weSh0LDAsMCxyKSx0fWlmKGUpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJmUuYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXJ8fCJsZW5ndGgiaW4gZSlyZXR1cm4ibnVtYmVyIiE9dHlwZW9mIGUubGVuZ3RofHwobj1lLmxlbmd0aCkhPW4/dyh0LDApOlIodCxlKTtpZigiQnVmZmVyIj09PWUudHlwZSYmYihlLmRhdGEpKXJldHVybiBSKHQsZS5kYXRhKX12YXIgbjt0aHJvdyBuZXcgVHlwZUVycm9yKCJGaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgb3IgYXJyYXktbGlrZSBvYmplY3QuIil9KHQsZSl9ZnVuY3Rpb24gRSh0KXtpZigibnVtYmVyIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcignInNpemUiIGFyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKTtpZih0PDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoJyJzaXplIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBuZWdhdGl2ZScpfWZ1bmN0aW9uIGsodCxlKXtpZihFKGUpLHQ9dyh0LGU8MD8wOjB8QShlKSksIV8uVFlQRURfQVJSQVlfU1VQUE9SVClmb3IodmFyIHI9MDtyPGU7KytyKXRbcl09MDtyZXR1cm4gdH1mdW5jdGlvbiBSKHQsZSl7dmFyIHI9ZS5sZW5ndGg8MD8wOjB8QShlLmxlbmd0aCk7dD13KHQscik7Zm9yKHZhciBuPTA7bjxyO24rPTEpdFtuXT0yNTUmZVtuXTtyZXR1cm4gdH1mdW5jdGlvbiBBKHQpe2lmKHQ+PW0oKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQXR0ZW1wdCB0byBhbGxvY2F0ZSBCdWZmZXIgbGFyZ2VyIHRoYW4gbWF4aW11bSBzaXplOiAweCIrbSgpLnRvU3RyaW5nKDE2KSsiIGJ5dGVzIik7cmV0dXJuIDB8dH1mdW5jdGlvbiBPKHQpe3JldHVybiEobnVsbD09dHx8IXQuX2lzQnVmZmVyKX1mdW5jdGlvbiBUKHQsZSl7aWYoTyh0KSlyZXR1cm4gdC5sZW5ndGg7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmImZ1bmN0aW9uIj09dHlwZW9mIEFycmF5QnVmZmVyLmlzVmlldyYmKEFycmF5QnVmZmVyLmlzVmlldyh0KXx8dCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSlyZXR1cm4gdC5ieXRlTGVuZ3RoOyJzdHJpbmciIT10eXBlb2YgdCYmKHQ9IiIrdCk7dmFyIHI9dC5sZW5ndGg7aWYoMD09PXIpcmV0dXJuIDA7Zm9yKHZhciBuPSExOzspc3dpdGNoKGUpe2Nhc2UiYXNjaWkiOmNhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIHI7Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpjYXNlIHZvaWQgMDpyZXR1cm4gZXQodCkubGVuZ3RoO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gMipyO2Nhc2UiaGV4IjpyZXR1cm4gcj4+PjE7Y2FzZSJiYXNlNjQiOnJldHVybiBydCh0KS5sZW5ndGg7ZGVmYXVsdDppZihuKXJldHVybiBldCh0KS5sZW5ndGg7ZT0oIiIrZSkudG9Mb3dlckNhc2UoKSxuPSEwfX1mdW5jdGlvbiBqKHQsZSxyKXt2YXIgbj0hMTtpZigodm9pZCAwPT09ZXx8ZTwwKSYmKGU9MCksZT50aGlzLmxlbmd0aClyZXR1cm4iIjtpZigodm9pZCAwPT09cnx8cj50aGlzLmxlbmd0aCkmJihyPXRoaXMubGVuZ3RoKSxyPD0wKXJldHVybiIiO2lmKChyPj4+PTApPD0oZT4+Pj0wKSlyZXR1cm4iIjtmb3IodHx8KHQ9InV0ZjgiKTs7KXN3aXRjaCh0KXtjYXNlImhleCI6cmV0dXJuIFcodGhpcyxlLHIpO2Nhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6cmV0dXJuIEYodGhpcyxlLHIpO2Nhc2UiYXNjaWkiOnJldHVybiBxKHRoaXMsZSxyKTtjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOnJldHVybiBZKHRoaXMsZSxyKTtjYXNlImJhc2U2NCI6cmV0dXJuIE4odGhpcyxlLHIpO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gJCh0aGlzLGUscik7ZGVmYXVsdDppZihuKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrdCk7dD0odCsiIikudG9Mb3dlckNhc2UoKSxuPSEwfX1mdW5jdGlvbiBMKHQsZSxyKXt2YXIgbj10W2VdO3RbZV09dFtyXSx0W3JdPW59ZnVuY3Rpb24gQyh0LGUscixuLGkpe2lmKDA9PT10Lmxlbmd0aClyZXR1cm4tMTtpZigic3RyaW5nIj09dHlwZW9mIHI/KG49cixyPTApOnI+MjE0NzQ4MzY0Nz9yPTIxNDc0ODM2NDc6cjwtMjE0NzQ4MzY0OCYmKHI9LTIxNDc0ODM2NDgpLHI9K3IsaXNOYU4ocikmJihyPWk/MDp0Lmxlbmd0aC0xKSxyPDAmJihyPXQubGVuZ3RoK3IpLHI+PXQubGVuZ3RoKXtpZihpKXJldHVybi0xO3I9dC5sZW5ndGgtMX1lbHNlIGlmKHI8MCl7aWYoIWkpcmV0dXJuLTE7cj0wfWlmKCJzdHJpbmciPT10eXBlb2YgZSYmKGU9Xy5mcm9tKGUsbikpLE8oZSkpcmV0dXJuIDA9PT1lLmxlbmd0aD8tMTpQKHQsZSxyLG4saSk7aWYoIm51bWJlciI9PXR5cGVvZiBlKXJldHVybiBlJj0yNTUsXy5UWVBFRF9BUlJBWV9TVVBQT1JUJiYiZnVuY3Rpb24iPT10eXBlb2YgVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZj9pP1VpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbCh0LGUscik6VWludDhBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YuY2FsbCh0LGUscik6UCh0LFtlXSxyLG4saSk7dGhyb3cgbmV3IFR5cGVFcnJvcigidmFsIG11c3QgYmUgc3RyaW5nLCBudW1iZXIgb3IgQnVmZmVyIil9ZnVuY3Rpb24gUCh0LGUscixuLGkpe3ZhciBvLHM9MSxhPXQubGVuZ3RoLHU9ZS5sZW5ndGg7aWYodm9pZCAwIT09biYmKCJ1Y3MyIj09PShuPVN0cmluZyhuKS50b0xvd2VyQ2FzZSgpKXx8InVjcy0yIj09PW58fCJ1dGYxNmxlIj09PW58fCJ1dGYtMTZsZSI9PT1uKSl7aWYodC5sZW5ndGg8Mnx8ZS5sZW5ndGg8MilyZXR1cm4tMTtzPTIsYS89Mix1Lz0yLHIvPTJ9ZnVuY3Rpb24gaCh0LGUpe3JldHVybiAxPT09cz90W2VdOnQucmVhZFVJbnQxNkJFKGUqcyl9aWYoaSl7dmFyIGY9LTE7Zm9yKG89cjtvPGE7bysrKWlmKGgodCxvKT09PWgoZSwtMT09PWY/MDpvLWYpKXtpZigtMT09PWYmJihmPW8pLG8tZisxPT09dSlyZXR1cm4gZipzfWVsc2UtMSE9PWYmJihvLT1vLWYpLGY9LTF9ZWxzZSBmb3Iocit1PmEmJihyPWEtdSksbz1yO28+PTA7by0tKXtmb3IodmFyIGM9ITAsbD0wO2w8dTtsKyspaWYoaCh0LG8rbCkhPT1oKGUsbCkpe2M9ITE7YnJlYWt9aWYoYylyZXR1cm4gb31yZXR1cm4tMX1mdW5jdGlvbiBNKHQsZSxyLG4pe3I9TnVtYmVyKHIpfHwwO3ZhciBpPXQubGVuZ3RoLXI7bj8obj1OdW1iZXIobikpPmkmJihuPWkpOm49aTt2YXIgbz1lLmxlbmd0aDtpZihvJTIhPTApdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBoZXggc3RyaW5nIik7bj5vLzImJihuPW8vMik7Zm9yKHZhciBzPTA7czxuOysrcyl7dmFyIGE9cGFyc2VJbnQoZS5zdWJzdHIoMipzLDIpLDE2KTtpZihpc05hTihhKSlyZXR1cm4gczt0W3Irc109YX1yZXR1cm4gc31mdW5jdGlvbiBCKHQsZSxyLG4pe3JldHVybiBudChldChlLHQubGVuZ3RoLXIpLHQscixuKX1mdW5jdGlvbiB4KHQsZSxyLG4pe3JldHVybiBudChmdW5jdGlvbih0KXtmb3IodmFyIGU9W10scj0wO3I8dC5sZW5ndGg7KytyKWUucHVzaCgyNTUmdC5jaGFyQ29kZUF0KHIpKTtyZXR1cm4gZX0oZSksdCxyLG4pfWZ1bmN0aW9uIFUodCxlLHIsbil7cmV0dXJuIHgodCxlLHIsbil9ZnVuY3Rpb24gSSh0LGUscixuKXtyZXR1cm4gbnQocnQoZSksdCxyLG4pfWZ1bmN0aW9uIEQodCxlLHIsbil7cmV0dXJuIG50KGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByLG4saSxvPVtdLHM9MDtzPHQubGVuZ3RoJiYhKChlLT0yKTwwKTsrK3Mpbj0ocj10LmNoYXJDb2RlQXQocykpPj44LGk9ciUyNTYsby5wdXNoKGkpLG8ucHVzaChuKTtyZXR1cm4gb30oZSx0Lmxlbmd0aC1yKSx0LHIsbil9ZnVuY3Rpb24gTih0LGUscil7cmV0dXJuIDA9PT1lJiZyPT09dC5sZW5ndGg/ZCh0KTpkKHQuc2xpY2UoZSxyKSl9ZnVuY3Rpb24gRih0LGUscil7cj1NYXRoLm1pbih0Lmxlbmd0aCxyKTtmb3IodmFyIG49W10saT1lO2k8cjspe3ZhciBvLHMsYSx1LGg9dFtpXSxmPW51bGwsYz1oPjIzOT80Omg+MjIzPzM6aD4xOTE/MjoxO2lmKGkrYzw9cilzd2l0Y2goYyl7Y2FzZSAxOmg8MTI4JiYoZj1oKTticmVhaztjYXNlIDI6MTI4PT0oMTkyJihvPXRbaSsxXSkpJiYodT0oMzEmaCk8PDZ8NjMmbyk+MTI3JiYoZj11KTticmVhaztjYXNlIDM6bz10W2krMV0scz10W2krMl0sMTI4PT0oMTkyJm8pJiYxMjg9PSgxOTImcykmJih1PSgxNSZoKTw8MTJ8KDYzJm8pPDw2fDYzJnMpPjIwNDcmJih1PDU1Mjk2fHx1PjU3MzQzKSYmKGY9dSk7YnJlYWs7Y2FzZSA0Om89dFtpKzFdLHM9dFtpKzJdLGE9dFtpKzNdLDEyOD09KDE5MiZvKSYmMTI4PT0oMTkyJnMpJiYxMjg9PSgxOTImYSkmJih1PSgxNSZoKTw8MTh8KDYzJm8pPDwxMnwoNjMmcyk8PDZ8NjMmYSk+NjU1MzUmJnU8MTExNDExMiYmKGY9dSl9bnVsbD09PWY/KGY9NjU1MzMsYz0xKTpmPjY1NTM1JiYoZi09NjU1MzYsbi5wdXNoKGY+Pj4xMCYxMDIzfDU1Mjk2KSxmPTU2MzIwfDEwMjMmZiksbi5wdXNoKGYpLGkrPWN9cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBlPXQubGVuZ3RoO2lmKGU8PXopcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLHQpO3ZhciByPSIiLG49MDtmb3IoO248ZTspcis9U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsdC5zbGljZShuLG4rPXopKTtyZXR1cm4gcn0obil9Xy5UWVBFRF9BUlJBWV9TVVBQT1JUPXZvaWQgMD09PWEuVFlQRURfQVJSQVlfU1VQUE9SVHx8YS5UWVBFRF9BUlJBWV9TVVBQT1JULG0oKSxfLnBvb2xTaXplPTgxOTIsXy5fYXVnbWVudD1mdW5jdGlvbih0KXtyZXR1cm4gdC5fX3Byb3RvX189Xy5wcm90b3R5cGUsdH0sXy5mcm9tPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gUyhudWxsLHQsZSxyKX0sXy5UWVBFRF9BUlJBWV9TVVBQT1JUJiYoXy5wcm90b3R5cGUuX19wcm90b19fPVVpbnQ4QXJyYXkucHJvdG90eXBlLF8uX19wcm90b19fPVVpbnQ4QXJyYXkpLF8uYWxsb2M9ZnVuY3Rpb24odCxlLHIpe3JldHVybiBmdW5jdGlvbih0LGUscixuKXtyZXR1cm4gRShlKSxlPD0wP3codCxlKTp2b2lkIDAhPT1yPyJzdHJpbmciPT10eXBlb2Ygbj93KHQsZSkuZmlsbChyLG4pOncodCxlKS5maWxsKHIpOncodCxlKX0obnVsbCx0LGUscil9LF8uYWxsb2NVbnNhZmU9ZnVuY3Rpb24odCl7cmV0dXJuIGsobnVsbCx0KX0sXy5hbGxvY1Vuc2FmZVNsb3c9ZnVuY3Rpb24odCl7cmV0dXJuIGsobnVsbCx0KX0sXy5pc0J1ZmZlcj1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dCYmKCEhdC5faXNCdWZmZXJ8fGl0KHQpfHxmdW5jdGlvbih0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdC5yZWFkRmxvYXRMRSYmImZ1bmN0aW9uIj09dHlwZW9mIHQuc2xpY2UmJml0KHQuc2xpY2UoMCwwKSl9KHQpKX0sXy5jb21wYXJlPWZ1bmN0aW9uKHQsZSl7aWYoIU8odCl8fCFPKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50cyBtdXN0IGJlIEJ1ZmZlcnMiKTtpZih0PT09ZSlyZXR1cm4gMDtmb3IodmFyIHI9dC5sZW5ndGgsbj1lLmxlbmd0aCxpPTAsbz1NYXRoLm1pbihyLG4pO2k8bzsrK2kpaWYodFtpXSE9PWVbaV0pe3I9dFtpXSxuPWVbaV07YnJlYWt9cmV0dXJuIHI8bj8tMTpuPHI/MTowfSxfLmlzRW5jb2Rpbmc9ZnVuY3Rpb24odCl7c3dpdGNoKFN0cmluZyh0KS50b0xvd2VyQ2FzZSgpKXtjYXNlImhleCI6Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpjYXNlImFzY2lpIjpjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOmNhc2UiYmFzZTY0IjpjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX19LF8uY29uY2F0PWZ1bmN0aW9uKHQsZSl7aWYoIWIodCkpdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3QiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpO2lmKDA9PT10Lmxlbmd0aClyZXR1cm4gXy5hbGxvYygwKTt2YXIgcjtpZih2b2lkIDA9PT1lKWZvcihlPTAscj0wO3I8dC5sZW5ndGg7KytyKWUrPXRbcl0ubGVuZ3RoO3ZhciBuPV8uYWxsb2NVbnNhZmUoZSksaT0wO2ZvcihyPTA7cjx0Lmxlbmd0aDsrK3Ipe3ZhciBvPXRbcl07aWYoIU8obykpdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3QiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpO28uY29weShuLGkpLGkrPW8ubGVuZ3RofXJldHVybiBufSxfLmJ5dGVMZW5ndGg9VCxfLnByb3RvdHlwZS5faXNCdWZmZXI9ITAsXy5wcm90b3R5cGUuc3dhcDE2PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5sZW5ndGg7aWYodCUyIT0wKXRocm93IG5ldyBSYW5nZUVycm9yKCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYtYml0cyIpO2Zvcih2YXIgZT0wO2U8dDtlKz0yKUwodGhpcyxlLGUrMSk7cmV0dXJuIHRoaXN9LF8ucHJvdG90eXBlLnN3YXAzMj1mdW5jdGlvbigpe3ZhciB0PXRoaXMubGVuZ3RoO2lmKHQlNCE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyLWJpdHMiKTtmb3IodmFyIGU9MDtlPHQ7ZSs9NClMKHRoaXMsZSxlKzMpLEwodGhpcyxlKzEsZSsyKTtyZXR1cm4gdGhpc30sXy5wcm90b3R5cGUuc3dhcDY0PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5sZW5ndGg7aWYodCU4IT0wKXRocm93IG5ldyBSYW5nZUVycm9yKCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNjQtYml0cyIpO2Zvcih2YXIgZT0wO2U8dDtlKz04KUwodGhpcyxlLGUrNyksTCh0aGlzLGUrMSxlKzYpLEwodGhpcyxlKzIsZSs1KSxMKHRoaXMsZSszLGUrNCk7cmV0dXJuIHRoaXN9LF8ucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIHQ9MHx0aGlzLmxlbmd0aDtyZXR1cm4gMD09PXQ/IiI6MD09PWFyZ3VtZW50cy5sZW5ndGg/Rih0aGlzLDAsdCk6ai5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LF8ucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbih0KXtpZighTyh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIik7cmV0dXJuIHRoaXM9PT10fHwwPT09Xy5jb21wYXJlKHRoaXMsdCl9LF8ucHJvdG90eXBlLmluc3BlY3Q9ZnVuY3Rpb24oKXt2YXIgdD0iIjtyZXR1cm4gdGhpcy5sZW5ndGg+MCYmKHQ9dGhpcy50b1N0cmluZygiaGV4IiwwLDUwKS5tYXRjaCgvLnsyfS9nKS5qb2luKCIgIiksdGhpcy5sZW5ndGg+NTAmJih0Kz0iIC4uLiAiKSksIjxCdWZmZXIgIit0KyI+In0sXy5wcm90b3R5cGUuY29tcGFyZT1mdW5jdGlvbih0LGUscixuLGkpe2lmKCFPKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIiKTtpZih2b2lkIDA9PT1lJiYoZT0wKSx2b2lkIDA9PT1yJiYocj10P3QubGVuZ3RoOjApLHZvaWQgMD09PW4mJihuPTApLHZvaWQgMD09PWkmJihpPXRoaXMubGVuZ3RoKSxlPDB8fHI+dC5sZW5ndGh8fG48MHx8aT50aGlzLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigib3V0IG9mIHJhbmdlIGluZGV4Iik7aWYobj49aSYmZT49cilyZXR1cm4gMDtpZihuPj1pKXJldHVybi0xO2lmKGU+PXIpcmV0dXJuIDE7aWYodGhpcz09PXQpcmV0dXJuIDA7Zm9yKHZhciBvPShpPj4+PTApLShuPj4+PTApLHM9KHI+Pj49MCktKGU+Pj49MCksYT1NYXRoLm1pbihvLHMpLHU9dGhpcy5zbGljZShuLGkpLGg9dC5zbGljZShlLHIpLGY9MDtmPGE7KytmKWlmKHVbZl0hPT1oW2ZdKXtvPXVbZl0scz1oW2ZdO2JyZWFrfXJldHVybiBvPHM/LTE6czxvPzE6MH0sXy5wcm90b3R5cGUuaW5jbHVkZXM9ZnVuY3Rpb24odCxlLHIpe3JldHVybi0xIT09dGhpcy5pbmRleE9mKHQsZSxyKX0sXy5wcm90b3R5cGUuaW5kZXhPZj1mdW5jdGlvbih0LGUscil7cmV0dXJuIEModGhpcyx0LGUsciwhMCl9LF8ucHJvdG90eXBlLmxhc3RJbmRleE9mPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gQyh0aGlzLHQsZSxyLCExKX0sXy5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24odCxlLHIsbil7aWYodm9pZCAwPT09ZSluPSJ1dGY4IixyPXRoaXMubGVuZ3RoLGU9MDtlbHNlIGlmKHZvaWQgMD09PXImJiJzdHJpbmciPT10eXBlb2YgZSluPWUscj10aGlzLmxlbmd0aCxlPTA7ZWxzZXtpZighaXNGaW5pdGUoZSkpdGhyb3cgbmV3IEVycm9yKCJCdWZmZXIud3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0WywgbGVuZ3RoXSkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCIpO2V8PTAsaXNGaW5pdGUocik/KHJ8PTAsdm9pZCAwPT09biYmKG49InV0ZjgiKSk6KG49cixyPXZvaWQgMCl9dmFyIGk9dGhpcy5sZW5ndGgtZTtpZigodm9pZCAwPT09cnx8cj5pKSYmKHI9aSksdC5sZW5ndGg+MCYmKHI8MHx8ZTwwKXx8ZT50aGlzLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQXR0ZW1wdCB0byB3cml0ZSBvdXRzaWRlIGJ1ZmZlciBib3VuZHMiKTtufHwobj0idXRmOCIpO2Zvcih2YXIgbz0hMTs7KXN3aXRjaChuKXtjYXNlImhleCI6cmV0dXJuIE0odGhpcyx0LGUscik7Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpyZXR1cm4gQih0aGlzLHQsZSxyKTtjYXNlImFzY2lpIjpyZXR1cm4geCh0aGlzLHQsZSxyKTtjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOnJldHVybiBVKHRoaXMsdCxlLHIpO2Nhc2UiYmFzZTY0IjpyZXR1cm4gSSh0aGlzLHQsZSxyKTtjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuIEQodGhpcyx0LGUscik7ZGVmYXVsdDppZihvKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrbik7bj0oIiIrbikudG9Mb3dlckNhc2UoKSxvPSEwfX0sXy5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6IkJ1ZmZlciIsZGF0YTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLl9hcnJ8fHRoaXMsMCl9fTt2YXIgej00MDk2O2Z1bmN0aW9uIHEodCxlLHIpe3ZhciBuPSIiO3I9TWF0aC5taW4odC5sZW5ndGgscik7Zm9yKHZhciBpPWU7aTxyOysraSluKz1TdHJpbmcuZnJvbUNoYXJDb2RlKDEyNyZ0W2ldKTtyZXR1cm4gbn1mdW5jdGlvbiBZKHQsZSxyKXt2YXIgbj0iIjtyPU1hdGgubWluKHQubGVuZ3RoLHIpO2Zvcih2YXIgaT1lO2k8cjsrK2kpbis9U3RyaW5nLmZyb21DaGFyQ29kZSh0W2ldKTtyZXR1cm4gbn1mdW5jdGlvbiBXKHQsZSxyKXt2YXIgbj10Lmxlbmd0aDsoIWV8fGU8MCkmJihlPTApLCghcnx8cjwwfHxyPm4pJiYocj1uKTtmb3IodmFyIGk9IiIsbz1lO288cjsrK28paSs9dHQodFtvXSk7cmV0dXJuIGl9ZnVuY3Rpb24gJCh0LGUscil7Zm9yKHZhciBuPXQuc2xpY2UoZSxyKSxpPSIiLG89MDtvPG4ubGVuZ3RoO28rPTIpaSs9U3RyaW5nLmZyb21DaGFyQ29kZShuW29dKzI1NipuW28rMV0pO3JldHVybiBpfWZ1bmN0aW9uIEcodCxlLHIpe2lmKHQlMSE9MHx8dDwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJvZmZzZXQgaXMgbm90IHVpbnQiKTtpZih0K2U+cil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiVHJ5aW5nIHRvIGFjY2VzcyBiZXlvbmQgYnVmZmVyIGxlbmd0aCIpfWZ1bmN0aW9uIEoodCxlLHIsbixpLG8pe2lmKCFPKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJidWZmZXIiIGFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIgaW5zdGFuY2UnKTtpZihlPml8fGU8byl0aHJvdyBuZXcgUmFuZ2VFcnJvcignInZhbHVlIiBhcmd1bWVudCBpcyBvdXQgb2YgYm91bmRzJyk7aWYocituPnQubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKX1mdW5jdGlvbiBIKHQsZSxyLG4pe2U8MCYmKGU9NjU1MzUrZSsxKTtmb3IodmFyIGk9MCxvPU1hdGgubWluKHQubGVuZ3RoLXIsMik7aTxvOysraSl0W3IraV09KGUmMjU1PDw4KihuP2k6MS1pKSk+Pj44KihuP2k6MS1pKX1mdW5jdGlvbiBWKHQsZSxyLG4pe2U8MCYmKGU9NDI5NDk2NzI5NStlKzEpO2Zvcih2YXIgaT0wLG89TWF0aC5taW4odC5sZW5ndGgtciw0KTtpPG87KytpKXRbcitpXT1lPj4+OCoobj9pOjMtaSkmMjU1fWZ1bmN0aW9uIEsodCxlLHIsbixpLG8pe2lmKHIrbj50Lmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIik7aWYocjwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKX1mdW5jdGlvbiBaKHQsZSxyLG4saSl7cmV0dXJuIGl8fEsodCwwLHIsNCkseSh0LGUscixuLDIzLDQpLHIrNH1mdW5jdGlvbiBRKHQsZSxyLG4saSl7cmV0dXJuIGl8fEsodCwwLHIsOCkseSh0LGUscixuLDUyLDgpLHIrOH1fLnByb3RvdHlwZS5zbGljZT1mdW5jdGlvbih0LGUpe3ZhciByLG49dGhpcy5sZW5ndGg7aWYoKHQ9fn50KTwwPyh0Kz1uKTwwJiYodD0wKTp0Pm4mJih0PW4pLChlPXZvaWQgMD09PWU/bjp+fmUpPDA/KGUrPW4pPDAmJihlPTApOmU+biYmKGU9biksZTx0JiYoZT10KSxfLlRZUEVEX0FSUkFZX1NVUFBPUlQpKHI9dGhpcy5zdWJhcnJheSh0LGUpKS5fX3Byb3RvX189Xy5wcm90b3R5cGU7ZWxzZXt2YXIgaT1lLXQ7cj1uZXcgXyhpLHZvaWQgMCk7Zm9yKHZhciBvPTA7bzxpOysrbylyW29dPXRoaXNbbyt0XX1yZXR1cm4gcn0sXy5wcm90b3R5cGUucmVhZFVJbnRMRT1mdW5jdGlvbih0LGUscil7dHw9MCxlfD0wLHJ8fEcodCxlLHRoaXMubGVuZ3RoKTtmb3IodmFyIG49dGhpc1t0XSxpPTEsbz0wOysrbzxlJiYoaSo9MjU2KTspbis9dGhpc1t0K29dKmk7cmV0dXJuIG59LF8ucHJvdG90eXBlLnJlYWRVSW50QkU9ZnVuY3Rpb24odCxlLHIpe3R8PTAsZXw9MCxyfHxHKHQsZSx0aGlzLmxlbmd0aCk7Zm9yKHZhciBuPXRoaXNbdCstLWVdLGk9MTtlPjAmJihpKj0yNTYpOyluKz10aGlzW3QrLS1lXSppO3JldHVybiBufSxfLnByb3RvdHlwZS5yZWFkVUludDg9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Ryh0LDEsdGhpcy5sZW5ndGgpLHRoaXNbdF19LF8ucHJvdG90eXBlLnJlYWRVSW50MTZMRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxHKHQsMix0aGlzLmxlbmd0aCksdGhpc1t0XXx0aGlzW3QrMV08PDh9LF8ucHJvdG90eXBlLnJlYWRVSW50MTZCRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxHKHQsMix0aGlzLmxlbmd0aCksdGhpc1t0XTw8OHx0aGlzW3QrMV19LF8ucHJvdG90eXBlLnJlYWRVSW50MzJMRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxHKHQsNCx0aGlzLmxlbmd0aCksKHRoaXNbdF18dGhpc1t0KzFdPDw4fHRoaXNbdCsyXTw8MTYpKzE2Nzc3MjE2KnRoaXNbdCszXX0sXy5wcm90b3R5cGUucmVhZFVJbnQzMkJFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fEcodCw0LHRoaXMubGVuZ3RoKSwxNjc3NzIxNip0aGlzW3RdKyh0aGlzW3QrMV08PDE2fHRoaXNbdCsyXTw8OHx0aGlzW3QrM10pfSxfLnByb3RvdHlwZS5yZWFkSW50TEU9ZnVuY3Rpb24odCxlLHIpe3R8PTAsZXw9MCxyfHxHKHQsZSx0aGlzLmxlbmd0aCk7Zm9yKHZhciBuPXRoaXNbdF0saT0xLG89MDsrK288ZSYmKGkqPTI1Nik7KW4rPXRoaXNbdCtvXSppO3JldHVybiBuPj0oaSo9MTI4KSYmKG4tPU1hdGgucG93KDIsOCplKSksbn0sXy5wcm90b3R5cGUucmVhZEludEJFPWZ1bmN0aW9uKHQsZSxyKXt0fD0wLGV8PTAscnx8Ryh0LGUsdGhpcy5sZW5ndGgpO2Zvcih2YXIgbj1lLGk9MSxvPXRoaXNbdCstLW5dO24+MCYmKGkqPTI1Nik7KW8rPXRoaXNbdCstLW5dKmk7cmV0dXJuIG8+PShpKj0xMjgpJiYoby09TWF0aC5wb3coMiw4KmUpKSxvfSxfLnByb3RvdHlwZS5yZWFkSW50OD1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxHKHQsMSx0aGlzLmxlbmd0aCksMTI4JnRoaXNbdF0/LTEqKDI1NS10aGlzW3RdKzEpOnRoaXNbdF19LF8ucHJvdG90eXBlLnJlYWRJbnQxNkxFPWZ1bmN0aW9uKHQsZSl7ZXx8Ryh0LDIsdGhpcy5sZW5ndGgpO3ZhciByPXRoaXNbdF18dGhpc1t0KzFdPDw4O3JldHVybiAzMjc2OCZyPzQyOTQ5MDE3NjB8cjpyfSxfLnByb3RvdHlwZS5yZWFkSW50MTZCRT1mdW5jdGlvbih0LGUpe2V8fEcodCwyLHRoaXMubGVuZ3RoKTt2YXIgcj10aGlzW3QrMV18dGhpc1t0XTw8ODtyZXR1cm4gMzI3Njgmcj80Mjk0OTAxNzYwfHI6cn0sXy5wcm90b3R5cGUucmVhZEludDMyTEU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Ryh0LDQsdGhpcy5sZW5ndGgpLHRoaXNbdF18dGhpc1t0KzFdPDw4fHRoaXNbdCsyXTw8MTZ8dGhpc1t0KzNdPDwyNH0sXy5wcm90b3R5cGUucmVhZEludDMyQkU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Ryh0LDQsdGhpcy5sZW5ndGgpLHRoaXNbdF08PDI0fHRoaXNbdCsxXTw8MTZ8dGhpc1t0KzJdPDw4fHRoaXNbdCszXX0sXy5wcm90b3R5cGUucmVhZEZsb2F0TEU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Ryh0LDQsdGhpcy5sZW5ndGgpLGcodGhpcyx0LCEwLDIzLDQpfSxfLnByb3RvdHlwZS5yZWFkRmxvYXRCRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxHKHQsNCx0aGlzLmxlbmd0aCksZyh0aGlzLHQsITEsMjMsNCl9LF8ucHJvdG90eXBlLnJlYWREb3VibGVMRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxHKHQsOCx0aGlzLmxlbmd0aCksZyh0aGlzLHQsITAsNTIsOCl9LF8ucHJvdG90eXBlLnJlYWREb3VibGVCRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxHKHQsOCx0aGlzLmxlbmd0aCksZyh0aGlzLHQsITEsNTIsOCl9LF8ucHJvdG90eXBlLndyaXRlVUludExFPWZ1bmN0aW9uKHQsZSxyLG4peyh0PSt0LGV8PTAscnw9MCxuKXx8Sih0aGlzLHQsZSxyLE1hdGgucG93KDIsOCpyKS0xLDApO3ZhciBpPTEsbz0wO2Zvcih0aGlzW2VdPTI1NSZ0OysrbzxyJiYoaSo9MjU2KTspdGhpc1tlK29dPXQvaSYyNTU7cmV0dXJuIGUrcn0sXy5wcm90b3R5cGUud3JpdGVVSW50QkU9ZnVuY3Rpb24odCxlLHIsbil7KHQ9K3QsZXw9MCxyfD0wLG4pfHxKKHRoaXMsdCxlLHIsTWF0aC5wb3coMiw4KnIpLTEsMCk7dmFyIGk9ci0xLG89MTtmb3IodGhpc1tlK2ldPTI1NSZ0Oy0taT49MCYmKG8qPTI1Nik7KXRoaXNbZStpXT10L28mMjU1O3JldHVybiBlK3J9LF8ucHJvdG90eXBlLndyaXRlVUludDg9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0PSt0LGV8PTAscnx8Sih0aGlzLHQsZSwxLDI1NSwwKSxfLlRZUEVEX0FSUkFZX1NVUFBPUlR8fCh0PU1hdGguZmxvb3IodCkpLHRoaXNbZV09MjU1JnQsZSsxfSxfLnByb3RvdHlwZS53cml0ZVVJbnQxNkxFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD0rdCxlfD0wLHJ8fEoodGhpcyx0LGUsMiw2NTUzNSwwKSxfLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZV09MjU1JnQsdGhpc1tlKzFdPXQ+Pj44KTpIKHRoaXMsdCxlLCEwKSxlKzJ9LF8ucHJvdG90eXBlLndyaXRlVUludDE2QkU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0PSt0LGV8PTAscnx8Sih0aGlzLHQsZSwyLDY1NTM1LDApLF8uVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT10Pj4+OCx0aGlzW2UrMV09MjU1JnQpOkgodGhpcyx0LGUsITEpLGUrMn0sXy5wcm90b3R5cGUud3JpdGVVSW50MzJMRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9K3QsZXw9MCxyfHxKKHRoaXMsdCxlLDQsNDI5NDk2NzI5NSwwKSxfLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZSszXT10Pj4+MjQsdGhpc1tlKzJdPXQ+Pj4xNix0aGlzW2UrMV09dD4+PjgsdGhpc1tlXT0yNTUmdCk6Vih0aGlzLHQsZSwhMCksZSs0fSxfLnByb3RvdHlwZS53cml0ZVVJbnQzMkJFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD0rdCxlfD0wLHJ8fEoodGhpcyx0LGUsNCw0Mjk0OTY3Mjk1LDApLF8uVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT10Pj4+MjQsdGhpc1tlKzFdPXQ+Pj4xNix0aGlzW2UrMl09dD4+PjgsdGhpc1tlKzNdPTI1NSZ0KTpWKHRoaXMsdCxlLCExKSxlKzR9LF8ucHJvdG90eXBlLndyaXRlSW50TEU9ZnVuY3Rpb24odCxlLHIsbil7aWYodD0rdCxlfD0wLCFuKXt2YXIgaT1NYXRoLnBvdygyLDgqci0xKTtKKHRoaXMsdCxlLHIsaS0xLC1pKX12YXIgbz0wLHM9MSxhPTA7Zm9yKHRoaXNbZV09MjU1JnQ7KytvPHImJihzKj0yNTYpOyl0PDAmJjA9PT1hJiYwIT09dGhpc1tlK28tMV0mJihhPTEpLHRoaXNbZStvXT0odC9zPj4wKS1hJjI1NTtyZXR1cm4gZStyfSxfLnByb3RvdHlwZS53cml0ZUludEJFPWZ1bmN0aW9uKHQsZSxyLG4pe2lmKHQ9K3QsZXw9MCwhbil7dmFyIGk9TWF0aC5wb3coMiw4KnItMSk7Sih0aGlzLHQsZSxyLGktMSwtaSl9dmFyIG89ci0xLHM9MSxhPTA7Zm9yKHRoaXNbZStvXT0yNTUmdDstLW8+PTAmJihzKj0yNTYpOyl0PDAmJjA9PT1hJiYwIT09dGhpc1tlK28rMV0mJihhPTEpLHRoaXNbZStvXT0odC9zPj4wKS1hJjI1NTtyZXR1cm4gZStyfSxfLnByb3RvdHlwZS53cml0ZUludDg9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0PSt0LGV8PTAscnx8Sih0aGlzLHQsZSwxLDEyNywtMTI4KSxfLlRZUEVEX0FSUkFZX1NVUFBPUlR8fCh0PU1hdGguZmxvb3IodCkpLHQ8MCYmKHQ9MjU1K3QrMSksdGhpc1tlXT0yNTUmdCxlKzF9LF8ucHJvdG90eXBlLndyaXRlSW50MTZMRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9K3QsZXw9MCxyfHxKKHRoaXMsdCxlLDIsMzI3NjcsLTMyNzY4KSxfLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZV09MjU1JnQsdGhpc1tlKzFdPXQ+Pj44KTpIKHRoaXMsdCxlLCEwKSxlKzJ9LF8ucHJvdG90eXBlLndyaXRlSW50MTZCRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9K3QsZXw9MCxyfHxKKHRoaXMsdCxlLDIsMzI3NjcsLTMyNzY4KSxfLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZV09dD4+PjgsdGhpc1tlKzFdPTI1NSZ0KTpIKHRoaXMsdCxlLCExKSxlKzJ9LF8ucHJvdG90eXBlLndyaXRlSW50MzJMRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9K3QsZXw9MCxyfHxKKHRoaXMsdCxlLDQsMjE0NzQ4MzY0NywtMjE0NzQ4MzY0OCksXy5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPTI1NSZ0LHRoaXNbZSsxXT10Pj4+OCx0aGlzW2UrMl09dD4+PjE2LHRoaXNbZSszXT10Pj4+MjQpOlYodGhpcyx0LGUsITApLGUrNH0sXy5wcm90b3R5cGUud3JpdGVJbnQzMkJFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD0rdCxlfD0wLHJ8fEoodGhpcyx0LGUsNCwyMTQ3NDgzNjQ3LC0yMTQ3NDgzNjQ4KSx0PDAmJih0PTQyOTQ5NjcyOTUrdCsxKSxfLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZV09dD4+PjI0LHRoaXNbZSsxXT10Pj4+MTYsdGhpc1tlKzJdPXQ+Pj44LHRoaXNbZSszXT0yNTUmdCk6Vih0aGlzLHQsZSwhMSksZSs0fSxfLnByb3RvdHlwZS53cml0ZUZsb2F0TEU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiBaKHRoaXMsdCxlLCEwLHIpfSxfLnByb3RvdHlwZS53cml0ZUZsb2F0QkU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiBaKHRoaXMsdCxlLCExLHIpfSxfLnByb3RvdHlwZS53cml0ZURvdWJsZUxFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gUSh0aGlzLHQsZSwhMCxyKX0sXy5wcm90b3R5cGUud3JpdGVEb3VibGVCRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIFEodGhpcyx0LGUsITEscil9LF8ucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24odCxlLHIsbil7aWYocnx8KHI9MCksbnx8MD09PW58fChuPXRoaXMubGVuZ3RoKSxlPj10Lmxlbmd0aCYmKGU9dC5sZW5ndGgpLGV8fChlPTApLG4+MCYmbjxyJiYobj1yKSxuPT09cilyZXR1cm4gMDtpZigwPT09dC5sZW5ndGh8fDA9PT10aGlzLmxlbmd0aClyZXR1cm4gMDtpZihlPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoInRhcmdldFN0YXJ0IG91dCBvZiBib3VuZHMiKTtpZihyPDB8fHI+PXRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJzb3VyY2VTdGFydCBvdXQgb2YgYm91bmRzIik7aWYobjwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJzb3VyY2VFbmQgb3V0IG9mIGJvdW5kcyIpO24+dGhpcy5sZW5ndGgmJihuPXRoaXMubGVuZ3RoKSx0Lmxlbmd0aC1lPG4tciYmKG49dC5sZW5ndGgtZStyKTt2YXIgaSxvPW4tcjtpZih0aGlzPT09dCYmcjxlJiZlPG4pZm9yKGk9by0xO2k+PTA7LS1pKXRbaStlXT10aGlzW2krcl07ZWxzZSBpZihvPDFlM3x8IV8uVFlQRURfQVJSQVlfU1VQUE9SVClmb3IoaT0wO2k8bzsrK2kpdFtpK2VdPXRoaXNbaStyXTtlbHNlIFVpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKHQsdGhpcy5zdWJhcnJheShyLHIrbyksZSk7cmV0dXJuIG99LF8ucHJvdG90eXBlLmZpbGw9ZnVuY3Rpb24odCxlLHIsbil7aWYoInN0cmluZyI9PXR5cGVvZiB0KXtpZigic3RyaW5nIj09dHlwZW9mIGU/KG49ZSxlPTAscj10aGlzLmxlbmd0aCk6InN0cmluZyI9PXR5cGVvZiByJiYobj1yLHI9dGhpcy5sZW5ndGgpLDE9PT10Lmxlbmd0aCl7dmFyIGk9dC5jaGFyQ29kZUF0KDApO2k8MjU2JiYodD1pKX1pZih2b2lkIDAhPT1uJiYic3RyaW5nIiE9dHlwZW9mIG4pdGhyb3cgbmV3IFR5cGVFcnJvcigiZW5jb2RpbmcgbXVzdCBiZSBhIHN0cmluZyIpO2lmKCJzdHJpbmciPT10eXBlb2YgbiYmIV8uaXNFbmNvZGluZyhuKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK24pfWVsc2UibnVtYmVyIj09dHlwZW9mIHQmJih0Jj0yNTUpO2lmKGU8MHx8dGhpcy5sZW5ndGg8ZXx8dGhpcy5sZW5ndGg8cil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiT3V0IG9mIHJhbmdlIGluZGV4Iik7aWYocjw9ZSlyZXR1cm4gdGhpczt2YXIgbztpZihlPj4+PTAscj12b2lkIDA9PT1yP3RoaXMubGVuZ3RoOnI+Pj4wLHR8fCh0PTApLCJudW1iZXIiPT10eXBlb2YgdClmb3Iobz1lO288cjsrK28pdGhpc1tvXT10O2Vsc2V7dmFyIHM9Tyh0KT90OmV0KG5ldyBfKHQsbikudG9TdHJpbmcoKSksYT1zLmxlbmd0aDtmb3Iobz0wO288ci1lOysrbyl0aGlzW28rZV09c1tvJWFdfXJldHVybiB0aGlzfTt2YXIgWD0vW14rXC8wLTlBLVphLXotX10vZztmdW5jdGlvbiB0dCh0KXtyZXR1cm4gdDwxNj8iMCIrdC50b1N0cmluZygxNik6dC50b1N0cmluZygxNil9ZnVuY3Rpb24gZXQodCxlKXt2YXIgcjtlPWV8fDEvMDtmb3IodmFyIG49dC5sZW5ndGgsaT1udWxsLG89W10scz0wO3M8bjsrK3Mpe2lmKChyPXQuY2hhckNvZGVBdChzKSk+NTUyOTUmJnI8NTczNDQpe2lmKCFpKXtpZihyPjU2MzE5KXsoZS09Myk+LTEmJm8ucHVzaCgyMzksMTkxLDE4OSk7Y29udGludWV9aWYocysxPT09bil7KGUtPTMpPi0xJiZvLnB1c2goMjM5LDE5MSwxODkpO2NvbnRpbnVlfWk9cjtjb250aW51ZX1pZihyPDU2MzIwKXsoZS09Myk+LTEmJm8ucHVzaCgyMzksMTkxLDE4OSksaT1yO2NvbnRpbnVlfXI9NjU1MzYrKGktNTUyOTY8PDEwfHItNTYzMjApfWVsc2UgaSYmKGUtPTMpPi0xJiZvLnB1c2goMjM5LDE5MSwxODkpO2lmKGk9bnVsbCxyPDEyOCl7aWYoKGUtPTEpPDApYnJlYWs7by5wdXNoKHIpfWVsc2UgaWYocjwyMDQ4KXtpZigoZS09Mik8MClicmVhaztvLnB1c2gocj4+NnwxOTIsNjMmcnwxMjgpfWVsc2UgaWYocjw2NTUzNil7aWYoKGUtPTMpPDApYnJlYWs7by5wdXNoKHI+PjEyfDIyNCxyPj42JjYzfDEyOCw2MyZyfDEyOCl9ZWxzZXtpZighKHI8MTExNDExMikpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGNvZGUgcG9pbnQiKTtpZigoZS09NCk8MClicmVhaztvLnB1c2gocj4+MTh8MjQwLHI+PjEyJjYzfDEyOCxyPj42JjYzfDEyOCw2MyZyfDEyOCl9fXJldHVybiBvfWZ1bmN0aW9uIHJ0KHQpe3JldHVybiBmdW5jdGlvbih0KXt2YXIgZSxyLG4saSxvLHM7Y3x8bCgpO3ZhciBhPXQubGVuZ3RoO2lmKGElND4wKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCIpO289Ij0iPT09dFthLTJdPzI6Ij0iPT09dFthLTFdPzE6MCxzPW5ldyBmKDMqYS80LW8pLG49bz4wP2EtNDphO3ZhciB1PTA7Zm9yKGU9MCxyPTA7ZTxuO2UrPTQscis9MylpPWhbdC5jaGFyQ29kZUF0KGUpXTw8MTh8aFt0LmNoYXJDb2RlQXQoZSsxKV08PDEyfGhbdC5jaGFyQ29kZUF0KGUrMildPDw2fGhbdC5jaGFyQ29kZUF0KGUrMyldLHNbdSsrXT1pPj4xNiYyNTUsc1t1KytdPWk+PjgmMjU1LHNbdSsrXT0yNTUmaTtyZXR1cm4gMj09PW8/KGk9aFt0LmNoYXJDb2RlQXQoZSldPDwyfGhbdC5jaGFyQ29kZUF0KGUrMSldPj40LHNbdSsrXT0yNTUmaSk6MT09PW8mJihpPWhbdC5jaGFyQ29kZUF0KGUpXTw8MTB8aFt0LmNoYXJDb2RlQXQoZSsxKV08PDR8aFt0LmNoYXJDb2RlQXQoZSsyKV0+PjIsc1t1KytdPWk+PjgmMjU1LHNbdSsrXT0yNTUmaSksc30oZnVuY3Rpb24odCl7aWYoKHQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQudHJpbT90LnRyaW0oKTp0LnJlcGxhY2UoL15ccyt8XHMrJC9nLCIiKX0odCkucmVwbGFjZShYLCIiKSkubGVuZ3RoPDIpcmV0dXJuIiI7Zm9yKDt0Lmxlbmd0aCU0IT0wOyl0Kz0iPSI7cmV0dXJuIHR9KHQpKX1mdW5jdGlvbiBudCh0LGUscixuKXtmb3IodmFyIGk9MDtpPG4mJiEoaStyPj1lLmxlbmd0aHx8aT49dC5sZW5ndGgpOysraSllW2krcl09dFtpXTtyZXR1cm4gaX1mdW5jdGlvbiBpdCh0KXtyZXR1cm4hIXQuY29uc3RydWN0b3ImJiJmdW5jdGlvbiI9PXR5cGVvZiB0LmNvbnN0cnVjdG9yLmlzQnVmZmVyJiZ0LmNvbnN0cnVjdG9yLmlzQnVmZmVyKHQpfWZ1bmN0aW9uIG90KCl7dGhyb3cgbmV3IEVycm9yKCJzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkIil9ZnVuY3Rpb24gc3QoKXt0aHJvdyBuZXcgRXJyb3IoImNsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCIpfXZhciBhdD1vdCx1dD1zdDtmdW5jdGlvbiBodCh0KXtpZihhdD09PXNldFRpbWVvdXQpcmV0dXJuIHNldFRpbWVvdXQodCwwKTtpZigoYXQ9PT1vdHx8IWF0KSYmc2V0VGltZW91dClyZXR1cm4gYXQ9c2V0VGltZW91dCxzZXRUaW1lb3V0KHQsMCk7dHJ5e3JldHVybiBhdCh0LDApfWNhdGNoKGUpe3RyeXtyZXR1cm4gYXQuY2FsbChudWxsLHQsMCl9Y2F0Y2goZSl7cmV0dXJuIGF0LmNhbGwodGhpcyx0LDApfX19ImZ1bmN0aW9uIj09dHlwZW9mIGEuc2V0VGltZW91dCYmKGF0PXNldFRpbWVvdXQpLCJmdW5jdGlvbiI9PXR5cGVvZiBhLmNsZWFyVGltZW91dCYmKHV0PWNsZWFyVGltZW91dCk7dmFyIGZ0LGN0PVtdLGx0PSExLHB0PS0xO2Z1bmN0aW9uIGR0KCl7bHQmJmZ0JiYobHQ9ITEsZnQubGVuZ3RoP2N0PWZ0LmNvbmNhdChjdCk6cHQ9LTEsY3QubGVuZ3RoJiZndCgpKX1mdW5jdGlvbiBndCgpe2lmKCFsdCl7dmFyIHQ9aHQoZHQpO2x0PSEwO2Zvcih2YXIgZT1jdC5sZW5ndGg7ZTspe2ZvcihmdD1jdCxjdD1bXTsrK3B0PGU7KWZ0JiZmdFtwdF0ucnVuKCk7cHQ9LTEsZT1jdC5sZW5ndGh9ZnQ9bnVsbCxsdD0hMSxmdW5jdGlvbih0KXtpZih1dD09PWNsZWFyVGltZW91dClyZXR1cm4gY2xlYXJUaW1lb3V0KHQpO2lmKCh1dD09PXN0fHwhdXQpJiZjbGVhclRpbWVvdXQpcmV0dXJuIHV0PWNsZWFyVGltZW91dCxjbGVhclRpbWVvdXQodCk7dHJ5e3JldHVybiB1dCh0KX1jYXRjaChlKXt0cnl7cmV0dXJuIHV0LmNhbGwobnVsbCx0KX1jYXRjaChlKXtyZXR1cm4gdXQuY2FsbCh0aGlzLHQpfX19KHQpfX1mdW5jdGlvbiB5dCh0KXt2YXIgZT1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aC0xKTtpZihhcmd1bWVudHMubGVuZ3RoPjEpZm9yKHZhciByPTE7cjxhcmd1bWVudHMubGVuZ3RoO3IrKyllW3ItMV09YXJndW1lbnRzW3JdO2N0LnB1c2gobmV3IHZ0KHQsZSkpLDEhPT1jdC5sZW5ndGh8fGx0fHxodChndCl9ZnVuY3Rpb24gdnQodCxlKXt0aGlzLmZ1bj10LHRoaXMuYXJyYXk9ZX12dC5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKCl7dGhpcy5mdW4uYXBwbHkobnVsbCx0aGlzLmFycmF5KX07ZnVuY3Rpb24gYnQoKXt9dmFyIG10PWJ0LHd0PWJ0LF90PWJ0LFN0PWJ0LEV0PWJ0LGt0PWJ0LFJ0PWJ0O3ZhciBBdD1hLnBlcmZvcm1hbmNlfHx7fSxPdD1BdC5ub3d8fEF0Lm1vek5vd3x8QXQubXNOb3d8fEF0Lm9Ob3d8fEF0LndlYmtpdE5vd3x8ZnVuY3Rpb24oKXtyZXR1cm4obmV3IERhdGUpLmdldFRpbWUoKX07dmFyIFR0PW5ldyBEYXRlO3ZhciBqdCxMdD17bmV4dFRpY2s6eXQsdGl0bGU6ImJyb3dzZXIiLGJyb3dzZXI6ITAsZW52Ont9LGFyZ3Y6W10sdmVyc2lvbjoiIix2ZXJzaW9uczp7fSxvbjptdCxhZGRMaXN0ZW5lcjp3dCxvbmNlOl90LG9mZjpTdCxyZW1vdmVMaXN0ZW5lcjpFdCxyZW1vdmVBbGxMaXN0ZW5lcnM6a3QsZW1pdDpSdCxiaW5kaW5nOmZ1bmN0aW9uKHQpe3Rocm93IG5ldyBFcnJvcigicHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQiKX0sY3dkOmZ1bmN0aW9uKCl7cmV0dXJuIi8ifSxjaGRpcjpmdW5jdGlvbih0KXt0aHJvdyBuZXcgRXJyb3IoInByb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCIpfSx1bWFzazpmdW5jdGlvbigpe3JldHVybiAwfSxocnRpbWU6ZnVuY3Rpb24odCl7dmFyIGU9LjAwMSpPdC5jYWxsKEF0KSxyPU1hdGguZmxvb3IoZSksbj1NYXRoLmZsb29yKGUlMSoxZTkpO3JldHVybiB0JiYoci09dFswXSwobi09dFsxXSk8MCYmKHItLSxuKz0xZTkpKSxbcixuXX0scGxhdGZvcm06ImJyb3dzZXIiLHJlbGVhc2U6e30sY29uZmlnOnt9LHVwdGltZTpmdW5jdGlvbigpe3JldHVybihuZXcgRGF0ZS1UdCkvMWUzfX07anQ9ImZ1bmN0aW9uIj09dHlwZW9mIE9iamVjdC5jcmVhdGU/ZnVuY3Rpb24odCxlKXt0LnN1cGVyXz1lLHQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZS5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTp0LGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pfTpmdW5jdGlvbih0LGUpe3Quc3VwZXJfPWU7dmFyIHI9ZnVuY3Rpb24oKXt9O3IucHJvdG90eXBlPWUucHJvdG90eXBlLHQucHJvdG90eXBlPW5ldyByLHQucHJvdG90eXBlLmNvbnN0cnVjdG9yPXR9O3ZhciBDdD1qdCxQdD0vJVtzZGolXS9nO2Z1bmN0aW9uIE10KHQpe2lmKCEkdCh0KSl7Zm9yKHZhciBlPVtdLHI9MDtyPGFyZ3VtZW50cy5sZW5ndGg7cisrKWUucHVzaChJdChhcmd1bWVudHNbcl0pKTtyZXR1cm4gZS5qb2luKCIgIil9cj0xO2Zvcih2YXIgbj1hcmd1bWVudHMsaT1uLmxlbmd0aCxvPVN0cmluZyh0KS5yZXBsYWNlKFB0LChmdW5jdGlvbih0KXtpZigiJSUiPT09dClyZXR1cm4iJSI7aWYocj49aSlyZXR1cm4gdDtzd2l0Y2godCl7Y2FzZSIlcyI6cmV0dXJuIFN0cmluZyhuW3IrK10pO2Nhc2UiJWQiOnJldHVybiBOdW1iZXIobltyKytdKTtjYXNlIiVqIjp0cnl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KG5bcisrXSl9Y2F0Y2godCl7cmV0dXJuIltDaXJjdWxhcl0ifWRlZmF1bHQ6cmV0dXJuIHR9fSkpLHM9bltyXTtyPGk7cz1uWysrcl0pV3Qocyl8fCFIdChzKT9vKz0iICIrczpvKz0iICIrSXQocyk7cmV0dXJuIG99ZnVuY3Rpb24gQnQodCxlKXtpZihHdChhLnByb2Nlc3MpKXJldHVybiBmdW5jdGlvbigpe3JldHVybiBCdCh0LGUpLmFwcGx5KHRoaXMsYXJndW1lbnRzKX07aWYoITA9PT1MdC5ub0RlcHJlY2F0aW9uKXJldHVybiB0O3ZhciByPSExO3JldHVybiBmdW5jdGlvbigpe2lmKCFyKXtpZihMdC50aHJvd0RlcHJlY2F0aW9uKXRocm93IG5ldyBFcnJvcihlKTtMdC50cmFjZURlcHJlY2F0aW9uP2NvbnNvbGUudHJhY2UoZSk6Y29uc29sZS5lcnJvcihlKSxyPSEwfXJldHVybiB0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX19dmFyIHh0LFV0PXt9O2Z1bmN0aW9uIEl0KHQsZSl7dmFyIHI9e3NlZW46W10sc3R5bGl6ZTpOdH07cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+PTMmJihyLmRlcHRoPWFyZ3VtZW50c1syXSksYXJndW1lbnRzLmxlbmd0aD49NCYmKHIuY29sb3JzPWFyZ3VtZW50c1szXSksWXQoZSk/ci5zaG93SGlkZGVuPWU6ZSYmZnVuY3Rpb24odCxlKXtpZighZXx8IUh0KGUpKXJldHVybiB0O3ZhciByPU9iamVjdC5rZXlzKGUpLG49ci5sZW5ndGg7Zm9yKDtuLS07KXRbcltuXV09ZVtyW25dXX0ocixlKSxHdChyLnNob3dIaWRkZW4pJiYoci5zaG93SGlkZGVuPSExKSxHdChyLmRlcHRoKSYmKHIuZGVwdGg9MiksR3Qoci5jb2xvcnMpJiYoci5jb2xvcnM9ITEpLEd0KHIuY3VzdG9tSW5zcGVjdCkmJihyLmN1c3RvbUluc3BlY3Q9ITApLHIuY29sb3JzJiYoci5zdHlsaXplPUR0KSxGdChyLHQsci5kZXB0aCl9ZnVuY3Rpb24gRHQodCxlKXt2YXIgcj1JdC5zdHlsZXNbZV07cmV0dXJuIHI/IhtbIitJdC5jb2xvcnNbcl1bMF0rIm0iK3QrIhtbIitJdC5jb2xvcnNbcl1bMV0rIm0iOnR9ZnVuY3Rpb24gTnQodCxlKXtyZXR1cm4gdH1mdW5jdGlvbiBGdCh0LGUscil7aWYodC5jdXN0b21JbnNwZWN0JiZlJiZadChlLmluc3BlY3QpJiZlLmluc3BlY3QhPT1JdCYmKCFlLmNvbnN0cnVjdG9yfHxlLmNvbnN0cnVjdG9yLnByb3RvdHlwZSE9PWUpKXt2YXIgbj1lLmluc3BlY3Qocix0KTtyZXR1cm4gJHQobil8fChuPUZ0KHQsbixyKSksbn12YXIgaT1mdW5jdGlvbih0LGUpe2lmKEd0KGUpKXJldHVybiB0LnN0eWxpemUoInVuZGVmaW5lZCIsInVuZGVmaW5lZCIpO2lmKCR0KGUpKXt2YXIgcj0iJyIrSlNPTi5zdHJpbmdpZnkoZSkucmVwbGFjZSgvXiJ8IiQvZywiIikucmVwbGFjZSgvJy9nLCJcXCciKS5yZXBsYWNlKC9cXCIvZywnIicpKyInIjtyZXR1cm4gdC5zdHlsaXplKHIsInN0cmluZyIpfWlmKG49ZSwibnVtYmVyIj09dHlwZW9mIG4pcmV0dXJuIHQuc3R5bGl6ZSgiIitlLCJudW1iZXIiKTt2YXIgbjtpZihZdChlKSlyZXR1cm4gdC5zdHlsaXplKCIiK2UsImJvb2xlYW4iKTtpZihXdChlKSlyZXR1cm4gdC5zdHlsaXplKCJudWxsIiwibnVsbCIpfSh0LGUpO2lmKGkpcmV0dXJuIGk7dmFyIG89T2JqZWN0LmtleXMoZSkscz1mdW5jdGlvbih0KXt2YXIgZT17fTtyZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbih0LHIpe2VbdF09ITB9KSksZX0obyk7aWYodC5zaG93SGlkZGVuJiYobz1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhlKSksS3QoZSkmJihvLmluZGV4T2YoIm1lc3NhZ2UiKT49MHx8by5pbmRleE9mKCJkZXNjcmlwdGlvbiIpPj0wKSlyZXR1cm4genQoZSk7aWYoMD09PW8ubGVuZ3RoKXtpZihadChlKSl7dmFyIGE9ZS5uYW1lPyI6ICIrZS5uYW1lOiIiO3JldHVybiB0LnN0eWxpemUoIltGdW5jdGlvbiIrYSsiXSIsInNwZWNpYWwiKX1pZihKdChlKSlyZXR1cm4gdC5zdHlsaXplKFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKSwicmVnZXhwIik7aWYoVnQoZSkpcmV0dXJuIHQuc3R5bGl6ZShEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpLCJkYXRlIik7aWYoS3QoZSkpcmV0dXJuIHp0KGUpfXZhciB1LGgsZj0iIixjPSExLGw9WyJ7IiwifSJdOyh1PWUsQXJyYXkuaXNBcnJheSh1KSYmKGM9ITAsbD1bIlsiLCJdIl0pLFp0KGUpKSYmKGY9IiBbRnVuY3Rpb24iKyhlLm5hbWU/IjogIitlLm5hbWU6IiIpKyJdIik7cmV0dXJuIEp0KGUpJiYoZj0iICIrUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpKSxWdChlKSYmKGY9IiAiK0RhdGUucHJvdG90eXBlLnRvVVRDU3RyaW5nLmNhbGwoZSkpLEt0KGUpJiYoZj0iICIrenQoZSkpLDAhPT1vLmxlbmd0aHx8YyYmMCE9ZS5sZW5ndGg/cjwwP0p0KGUpP3Quc3R5bGl6ZShSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSksInJlZ2V4cCIpOnQuc3R5bGl6ZSgiW09iamVjdF0iLCJzcGVjaWFsIik6KHQuc2Vlbi5wdXNoKGUpLGg9Yz9mdW5jdGlvbih0LGUscixuLGkpe2Zvcih2YXIgbz1bXSxzPTAsYT1lLmxlbmd0aDtzPGE7KytzKVh0KGUsU3RyaW5nKHMpKT9vLnB1c2gocXQodCxlLHIsbixTdHJpbmcocyksITApKTpvLnB1c2goIiIpO3JldHVybiBpLmZvckVhY2goKGZ1bmN0aW9uKGkpe2kubWF0Y2goL15cZCskLyl8fG8ucHVzaChxdCh0LGUscixuLGksITApKX0pKSxvfSh0LGUscixzLG8pOm8ubWFwKChmdW5jdGlvbihuKXtyZXR1cm4gcXQodCxlLHIscyxuLGMpfSkpLHQuc2Vlbi5wb3AoKSxmdW5jdGlvbih0LGUscil7dmFyIG49dC5yZWR1Y2UoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUuaW5kZXhPZigiXG4iKSx0K2UucmVwbGFjZSgvXHUwMDFiXFtcZFxkP20vZywiIikubGVuZ3RoKzF9KSwwKTtpZihuPjYwKXJldHVybiByWzBdKygiIj09PWU/IiI6ZSsiXG4gIikrIiAiK3Quam9pbigiLFxuICAiKSsiICIrclsxXTtyZXR1cm4gclswXStlKyIgIit0LmpvaW4oIiwgIikrIiAiK3JbMV19KGgsZixsKSk6bFswXStmK2xbMV19ZnVuY3Rpb24genQodCl7cmV0dXJuIlsiK0Vycm9yLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpKyJdIn1mdW5jdGlvbiBxdCh0LGUscixuLGksbyl7dmFyIHMsYSx1O2lmKCh1PU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSxpKXx8e3ZhbHVlOmVbaV19KS5nZXQ/YT11LnNldD90LnN0eWxpemUoIltHZXR0ZXIvU2V0dGVyXSIsInNwZWNpYWwiKTp0LnN0eWxpemUoIltHZXR0ZXJdIiwic3BlY2lhbCIpOnUuc2V0JiYoYT10LnN0eWxpemUoIltTZXR0ZXJdIiwic3BlY2lhbCIpKSxYdChuLGkpfHwocz0iWyIraSsiXSIpLGF8fCh0LnNlZW4uaW5kZXhPZih1LnZhbHVlKTwwPyhhPVd0KHIpP0Z0KHQsdS52YWx1ZSxudWxsKTpGdCh0LHUudmFsdWUsci0xKSkuaW5kZXhPZigiXG4iKT4tMSYmKGE9bz9hLnNwbGl0KCJcbiIpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIiAgIit0fSkpLmpvaW4oIlxuIikuc3Vic3RyKDIpOiJcbiIrYS5zcGxpdCgiXG4iKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiIgICAiK3R9KSkuam9pbigiXG4iKSk6YT10LnN0eWxpemUoIltDaXJjdWxhcl0iLCJzcGVjaWFsIikpLEd0KHMpKXtpZihvJiZpLm1hdGNoKC9eXGQrJC8pKXJldHVybiBhOyhzPUpTT04uc3RyaW5naWZ5KCIiK2kpKS5tYXRjaCgvXiIoW2EtekEtWl9dW2EtekEtWl8wLTldKikiJC8pPyhzPXMuc3Vic3RyKDEscy5sZW5ndGgtMikscz10LnN0eWxpemUocywibmFtZSIpKToocz1zLnJlcGxhY2UoLycvZywiXFwnIikucmVwbGFjZSgvXFwiL2csJyInKS5yZXBsYWNlKC8oXiJ8IiQpL2csIiciKSxzPXQuc3R5bGl6ZShzLCJzdHJpbmciKSl9cmV0dXJuIHMrIjogIithfWZ1bmN0aW9uIFl0KHQpe3JldHVybiJib29sZWFuIj09dHlwZW9mIHR9ZnVuY3Rpb24gV3QodCl7cmV0dXJuIG51bGw9PT10fWZ1bmN0aW9uICR0KHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdH1mdW5jdGlvbiBHdCh0KXtyZXR1cm4gdm9pZCAwPT09dH1mdW5jdGlvbiBKdCh0KXtyZXR1cm4gSHQodCkmJiJbb2JqZWN0IFJlZ0V4cF0iPT09UXQodCl9ZnVuY3Rpb24gSHQodCl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiB0JiZudWxsIT09dH1mdW5jdGlvbiBWdCh0KXtyZXR1cm4gSHQodCkmJiJbb2JqZWN0IERhdGVdIj09PVF0KHQpfWZ1bmN0aW9uIEt0KHQpe3JldHVybiBIdCh0KSYmKCJbb2JqZWN0IEVycm9yXSI9PT1RdCh0KXx8dCBpbnN0YW5jZW9mIEVycm9yKX1mdW5jdGlvbiBadCh0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdH1mdW5jdGlvbiBRdCh0KXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWZ1bmN0aW9uIFh0KHQsZSl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpfWZ1bmN0aW9uIHRlKCl7dGhpcy5oZWFkPW51bGwsdGhpcy50YWlsPW51bGwsdGhpcy5sZW5ndGg9MH1JdC5jb2xvcnM9e2JvbGQ6WzEsMjJdLGl0YWxpYzpbMywyM10sdW5kZXJsaW5lOls0LDI0XSxpbnZlcnNlOls3LDI3XSx3aGl0ZTpbMzcsMzldLGdyZXk6WzkwLDM5XSxibGFjazpbMzAsMzldLGJsdWU6WzM0LDM5XSxjeWFuOlszNiwzOV0sZ3JlZW46WzMyLDM5XSxtYWdlbnRhOlszNSwzOV0scmVkOlszMSwzOV0seWVsbG93OlszMywzOV19LEl0LnN0eWxlcz17c3BlY2lhbDoiY3lhbiIsbnVtYmVyOiJ5ZWxsb3ciLGJvb2xlYW46InllbGxvdyIsdW5kZWZpbmVkOiJncmV5IixudWxsOiJib2xkIixzdHJpbmc6ImdyZWVuIixkYXRlOiJtYWdlbnRhIixyZWdleHA6InJlZCJ9LHRlLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKHQpe3ZhciBlPXtkYXRhOnQsbmV4dDpudWxsfTt0aGlzLmxlbmd0aD4wP3RoaXMudGFpbC5uZXh0PWU6dGhpcy5oZWFkPWUsdGhpcy50YWlsPWUsKyt0aGlzLmxlbmd0aH0sdGUucHJvdG90eXBlLnVuc2hpZnQ9ZnVuY3Rpb24odCl7dmFyIGU9e2RhdGE6dCxuZXh0OnRoaXMuaGVhZH07MD09PXRoaXMubGVuZ3RoJiYodGhpcy50YWlsPWUpLHRoaXMuaGVhZD1lLCsrdGhpcy5sZW5ndGh9LHRlLnByb3RvdHlwZS5zaGlmdD1mdW5jdGlvbigpe2lmKDAhPT10aGlzLmxlbmd0aCl7dmFyIHQ9dGhpcy5oZWFkLmRhdGE7cmV0dXJuIDE9PT10aGlzLmxlbmd0aD90aGlzLmhlYWQ9dGhpcy50YWlsPW51bGw6dGhpcy5oZWFkPXRoaXMuaGVhZC5uZXh0LC0tdGhpcy5sZW5ndGgsdH19LHRlLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuaGVhZD10aGlzLnRhaWw9bnVsbCx0aGlzLmxlbmd0aD0wfSx0ZS5wcm90b3R5cGUuam9pbj1mdW5jdGlvbih0KXtpZigwPT09dGhpcy5sZW5ndGgpcmV0dXJuIiI7Zm9yKHZhciBlPXRoaXMuaGVhZCxyPSIiK2UuZGF0YTtlPWUubmV4dDspcis9dCtlLmRhdGE7cmV0dXJuIHJ9LHRlLnByb3RvdHlwZS5jb25jYXQ9ZnVuY3Rpb24odCl7aWYoMD09PXRoaXMubGVuZ3RoKXJldHVybiBfLmFsbG9jKDApO2lmKDE9PT10aGlzLmxlbmd0aClyZXR1cm4gdGhpcy5oZWFkLmRhdGE7Zm9yKHZhciBlPV8uYWxsb2NVbnNhZmUodD4+PjApLHI9dGhpcy5oZWFkLG49MDtyOylyLmRhdGEuY29weShlLG4pLG4rPXIuZGF0YS5sZW5ndGgscj1yLm5leHQ7cmV0dXJuIGV9O3ZhciBlZT1fLmlzRW5jb2Rpbmd8fGZ1bmN0aW9uKHQpe3N3aXRjaCh0JiZ0LnRvTG93ZXJDYXNlKCkpe2Nhc2UiaGV4IjpjYXNlInV0ZjgiOmNhc2UidXRmLTgiOmNhc2UiYXNjaWkiOmNhc2UiYmluYXJ5IjpjYXNlImJhc2U2NCI6Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOmNhc2UicmF3IjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX07ZnVuY3Rpb24gcmUodCl7c3dpdGNoKHRoaXMuZW5jb2Rpbmc9KHR8fCJ1dGY4IikudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bLV9dLywiIiksZnVuY3Rpb24odCl7aWYodCYmIWVlKHQpKXRocm93IG5ldyBFcnJvcigiVW5rbm93biBlbmNvZGluZzogIit0KX0odCksdGhpcy5lbmNvZGluZyl7Y2FzZSJ1dGY4Ijp0aGlzLnN1cnJvZ2F0ZVNpemU9MzticmVhaztjYXNlInVjczIiOmNhc2UidXRmMTZsZSI6dGhpcy5zdXJyb2dhdGVTaXplPTIsdGhpcy5kZXRlY3RJbmNvbXBsZXRlQ2hhcj1pZTticmVhaztjYXNlImJhc2U2NCI6dGhpcy5zdXJyb2dhdGVTaXplPTMsdGhpcy5kZXRlY3RJbmNvbXBsZXRlQ2hhcj1vZTticmVhaztkZWZhdWx0OnJldHVybiB2b2lkKHRoaXMud3JpdGU9bmUpfXRoaXMuY2hhckJ1ZmZlcj1uZXcgXyg2KSx0aGlzLmNoYXJSZWNlaXZlZD0wLHRoaXMuY2hhckxlbmd0aD0wfWZ1bmN0aW9uIG5lKHQpe3JldHVybiB0LnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcpfWZ1bmN0aW9uIGllKHQpe3RoaXMuY2hhclJlY2VpdmVkPXQubGVuZ3RoJTIsdGhpcy5jaGFyTGVuZ3RoPXRoaXMuY2hhclJlY2VpdmVkPzI6MH1mdW5jdGlvbiBvZSh0KXt0aGlzLmNoYXJSZWNlaXZlZD10Lmxlbmd0aCUzLHRoaXMuY2hhckxlbmd0aD10aGlzLmNoYXJSZWNlaXZlZD8zOjB9cmUucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0iIjt0aGlzLmNoYXJMZW5ndGg7KXt2YXIgcj10Lmxlbmd0aD49dGhpcy5jaGFyTGVuZ3RoLXRoaXMuY2hhclJlY2VpdmVkP3RoaXMuY2hhckxlbmd0aC10aGlzLmNoYXJSZWNlaXZlZDp0Lmxlbmd0aDtpZih0LmNvcHkodGhpcy5jaGFyQnVmZmVyLHRoaXMuY2hhclJlY2VpdmVkLDAsciksdGhpcy5jaGFyUmVjZWl2ZWQrPXIsdGhpcy5jaGFyUmVjZWl2ZWQ8dGhpcy5jaGFyTGVuZ3RoKXJldHVybiIiO2lmKHQ9dC5zbGljZShyLHQubGVuZ3RoKSwhKChpPShlPXRoaXMuY2hhckJ1ZmZlci5zbGljZSgwLHRoaXMuY2hhckxlbmd0aCkudG9TdHJpbmcodGhpcy5lbmNvZGluZykpLmNoYXJDb2RlQXQoZS5sZW5ndGgtMSkpPj01NTI5NiYmaTw9NTYzMTkpKXtpZih0aGlzLmNoYXJSZWNlaXZlZD10aGlzLmNoYXJMZW5ndGg9MCwwPT09dC5sZW5ndGgpcmV0dXJuIGU7YnJlYWt9dGhpcy5jaGFyTGVuZ3RoKz10aGlzLnN1cnJvZ2F0ZVNpemUsZT0iIn10aGlzLmRldGVjdEluY29tcGxldGVDaGFyKHQpO3ZhciBuPXQubGVuZ3RoO3RoaXMuY2hhckxlbmd0aCYmKHQuY29weSh0aGlzLmNoYXJCdWZmZXIsMCx0Lmxlbmd0aC10aGlzLmNoYXJSZWNlaXZlZCxuKSxuLT10aGlzLmNoYXJSZWNlaXZlZCk7dmFyIGk7bj0oZSs9dC50b1N0cmluZyh0aGlzLmVuY29kaW5nLDAsbikpLmxlbmd0aC0xO2lmKChpPWUuY2hhckNvZGVBdChuKSk+PTU1Mjk2JiZpPD01NjMxOSl7dmFyIG89dGhpcy5zdXJyb2dhdGVTaXplO3JldHVybiB0aGlzLmNoYXJMZW5ndGgrPW8sdGhpcy5jaGFyUmVjZWl2ZWQrPW8sdGhpcy5jaGFyQnVmZmVyLmNvcHkodGhpcy5jaGFyQnVmZmVyLG8sMCxvKSx0LmNvcHkodGhpcy5jaGFyQnVmZmVyLDAsMCxvKSxlLnN1YnN0cmluZygwLG4pfXJldHVybiBlfSxyZS5wcm90b3R5cGUuZGV0ZWN0SW5jb21wbGV0ZUNoYXI9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQubGVuZ3RoPj0zPzM6dC5sZW5ndGg7ZT4wO2UtLSl7dmFyIHI9dFt0Lmxlbmd0aC1lXTtpZigxPT1lJiZyPj41PT02KXt0aGlzLmNoYXJMZW5ndGg9MjticmVha31pZihlPD0yJiZyPj40PT0xNCl7dGhpcy5jaGFyTGVuZ3RoPTM7YnJlYWt9aWYoZTw9MyYmcj4+Mz09MzApe3RoaXMuY2hhckxlbmd0aD00O2JyZWFrfX10aGlzLmNoYXJSZWNlaXZlZD1lfSxyZS5wcm90b3R5cGUuZW5kPWZ1bmN0aW9uKHQpe3ZhciBlPSIiO2lmKHQmJnQubGVuZ3RoJiYoZT10aGlzLndyaXRlKHQpKSx0aGlzLmNoYXJSZWNlaXZlZCl7dmFyIHI9dGhpcy5jaGFyUmVjZWl2ZWQsbj10aGlzLmNoYXJCdWZmZXIsaT10aGlzLmVuY29kaW5nO2UrPW4uc2xpY2UoMCxyKS50b1N0cmluZyhpKX1yZXR1cm4gZX0sdWUuUmVhZGFibGVTdGF0ZT1hZTt2YXIgc2U9ZnVuY3Rpb24odCl7aWYoR3QoeHQpJiYoeHQ9THQuZW52Lk5PREVfREVCVUd8fCIiKSx0PXQudG9VcHBlckNhc2UoKSwhVXRbdF0paWYobmV3IFJlZ0V4cCgiXFxiIit0KyJcXGIiLCJpIikudGVzdCh4dCkpe1V0W3RdPWZ1bmN0aW9uKCl7dmFyIGU9TXQuYXBwbHkobnVsbCxhcmd1bWVudHMpO2NvbnNvbGUuZXJyb3IoIiVzICVkOiAlcyIsdCwwLGUpfX1lbHNlIFV0W3RdPWZ1bmN0aW9uKCl7fTtyZXR1cm4gVXRbdF19KCJzdHJlYW0iKTtmdW5jdGlvbiBhZSh0LGUpe3Q9dHx8e30sdGhpcy5vYmplY3RNb2RlPSEhdC5vYmplY3RNb2RlLGUgaW5zdGFuY2VvZiBVZSYmKHRoaXMub2JqZWN0TW9kZT10aGlzLm9iamVjdE1vZGV8fCEhdC5yZWFkYWJsZU9iamVjdE1vZGUpO3ZhciByPXQuaGlnaFdhdGVyTWFyayxuPXRoaXMub2JqZWN0TW9kZT8xNjoxNjM4NDt0aGlzLmhpZ2hXYXRlck1hcms9cnx8MD09PXI/cjpuLHRoaXMuaGlnaFdhdGVyTWFyaz1+fnRoaXMuaGlnaFdhdGVyTWFyayx0aGlzLmJ1ZmZlcj1uZXcgdGUsdGhpcy5sZW5ndGg9MCx0aGlzLnBpcGVzPW51bGwsdGhpcy5waXBlc0NvdW50PTAsdGhpcy5mbG93aW5nPW51bGwsdGhpcy5lbmRlZD0hMSx0aGlzLmVuZEVtaXR0ZWQ9ITEsdGhpcy5yZWFkaW5nPSExLHRoaXMuc3luYz0hMCx0aGlzLm5lZWRSZWFkYWJsZT0hMSx0aGlzLmVtaXR0ZWRSZWFkYWJsZT0hMSx0aGlzLnJlYWRhYmxlTGlzdGVuaW5nPSExLHRoaXMucmVzdW1lU2NoZWR1bGVkPSExLHRoaXMuZGVmYXVsdEVuY29kaW5nPXQuZGVmYXVsdEVuY29kaW5nfHwidXRmOCIsdGhpcy5yYW5PdXQ9ITEsdGhpcy5hd2FpdERyYWluPTAsdGhpcy5yZWFkaW5nTW9yZT0hMSx0aGlzLmRlY29kZXI9bnVsbCx0aGlzLmVuY29kaW5nPW51bGwsdC5lbmNvZGluZyYmKHRoaXMuZGVjb2Rlcj1uZXcgcmUodC5lbmNvZGluZyksdGhpcy5lbmNvZGluZz10LmVuY29kaW5nKX1mdW5jdGlvbiB1ZSh0KXtpZighKHRoaXMgaW5zdGFuY2VvZiB1ZSkpcmV0dXJuIG5ldyB1ZSh0KTt0aGlzLl9yZWFkYWJsZVN0YXRlPW5ldyBhZSh0LHRoaXMpLHRoaXMucmVhZGFibGU9ITAsdCYmImZ1bmN0aW9uIj09dHlwZW9mIHQucmVhZCYmKHRoaXMuX3JlYWQ9dC5yZWFkKSxlLmNhbGwodGhpcyl9ZnVuY3Rpb24gaGUodCxlLHIsbixpKXt2YXIgbz1mdW5jdGlvbih0LGUpe3ZhciByPW51bGw7Xy5pc0J1ZmZlcihlKXx8InN0cmluZyI9PXR5cGVvZiBlfHxudWxsPT1lfHx0Lm9iamVjdE1vZGV8fChyPW5ldyBUeXBlRXJyb3IoIkludmFsaWQgbm9uLXN0cmluZy9idWZmZXIgY2h1bmsiKSk7cmV0dXJuIHJ9KGUscik7aWYobyl0LmVtaXQoImVycm9yIixvKTtlbHNlIGlmKG51bGw9PT1yKWUucmVhZGluZz0hMSxmdW5jdGlvbih0LGUpe2lmKGUuZW5kZWQpcmV0dXJuO2lmKGUuZGVjb2Rlcil7dmFyIHI9ZS5kZWNvZGVyLmVuZCgpO3ImJnIubGVuZ3RoJiYoZS5idWZmZXIucHVzaChyKSxlLmxlbmd0aCs9ZS5vYmplY3RNb2RlPzE6ci5sZW5ndGgpfWUuZW5kZWQ9ITAsbGUodCl9KHQsZSk7ZWxzZSBpZihlLm9iamVjdE1vZGV8fHImJnIubGVuZ3RoPjApaWYoZS5lbmRlZCYmIWkpe3ZhciBzPW5ldyBFcnJvcigic3RyZWFtLnB1c2goKSBhZnRlciBFT0YiKTt0LmVtaXQoImVycm9yIixzKX1lbHNlIGlmKGUuZW5kRW1pdHRlZCYmaSl7dmFyIGE9bmV3IEVycm9yKCJzdHJlYW0udW5zaGlmdCgpIGFmdGVyIGVuZCBldmVudCIpO3QuZW1pdCgiZXJyb3IiLGEpfWVsc2V7dmFyIHU7IWUuZGVjb2Rlcnx8aXx8bnx8KHI9ZS5kZWNvZGVyLndyaXRlKHIpLHU9IWUub2JqZWN0TW9kZSYmMD09PXIubGVuZ3RoKSxpfHwoZS5yZWFkaW5nPSExKSx1fHwoZS5mbG93aW5nJiYwPT09ZS5sZW5ndGgmJiFlLnN5bmM/KHQuZW1pdCgiZGF0YSIsciksdC5yZWFkKDApKTooZS5sZW5ndGgrPWUub2JqZWN0TW9kZT8xOnIubGVuZ3RoLGk/ZS5idWZmZXIudW5zaGlmdChyKTplLmJ1ZmZlci5wdXNoKHIpLGUubmVlZFJlYWRhYmxlJiZsZSh0KSkpLGZ1bmN0aW9uKHQsZSl7ZS5yZWFkaW5nTW9yZXx8KGUucmVhZGluZ01vcmU9ITAseXQoZGUsdCxlKSl9KHQsZSl9ZWxzZSBpfHwoZS5yZWFkaW5nPSExKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIXQuZW5kZWQmJih0Lm5lZWRSZWFkYWJsZXx8dC5sZW5ndGg8dC5oaWdoV2F0ZXJNYXJrfHwwPT09dC5sZW5ndGgpfShlKX1DdCh1ZSxlKSx1ZS5wcm90b3R5cGUucHVzaD1mdW5jdGlvbih0LGUpe3ZhciByPXRoaXMuX3JlYWRhYmxlU3RhdGU7cmV0dXJuIHIub2JqZWN0TW9kZXx8InN0cmluZyIhPXR5cGVvZiB0fHwoZT1lfHxyLmRlZmF1bHRFbmNvZGluZykhPT1yLmVuY29kaW5nJiYodD1fLmZyb20odCxlKSxlPSIiKSxoZSh0aGlzLHIsdCxlLCExKX0sdWUucHJvdG90eXBlLnVuc2hpZnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGhlKHRoaXMsdGhpcy5fcmVhZGFibGVTdGF0ZSx0LCIiLCEwKX0sdWUucHJvdG90eXBlLmlzUGF1c2VkPWZ1bmN0aW9uKCl7cmV0dXJuITE9PT10aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmd9LHVlLnByb3RvdHlwZS5zZXRFbmNvZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5kZWNvZGVyPW5ldyByZSh0KSx0aGlzLl9yZWFkYWJsZVN0YXRlLmVuY29kaW5nPXQsdGhpc307dmFyIGZlPTgzODg2MDg7ZnVuY3Rpb24gY2UodCxlKXtyZXR1cm4gdDw9MHx8MD09PWUubGVuZ3RoJiZlLmVuZGVkPzA6ZS5vYmplY3RNb2RlPzE6dCE9dD9lLmZsb3dpbmcmJmUubGVuZ3RoP2UuYnVmZmVyLmhlYWQuZGF0YS5sZW5ndGg6ZS5sZW5ndGg6KHQ+ZS5oaWdoV2F0ZXJNYXJrJiYoZS5oaWdoV2F0ZXJNYXJrPWZ1bmN0aW9uKHQpe3JldHVybiB0Pj1mZT90PWZlOih0LS0sdHw9dD4+PjEsdHw9dD4+PjIsdHw9dD4+PjQsdHw9dD4+PjgsdHw9dD4+PjE2LHQrKyksdH0odCkpLHQ8PWUubGVuZ3RoP3Q6ZS5lbmRlZD9lLmxlbmd0aDooZS5uZWVkUmVhZGFibGU9ITAsMCkpfWZ1bmN0aW9uIGxlKHQpe3ZhciBlPXQuX3JlYWRhYmxlU3RhdGU7ZS5uZWVkUmVhZGFibGU9ITEsZS5lbWl0dGVkUmVhZGFibGV8fChzZSgiZW1pdFJlYWRhYmxlIixlLmZsb3dpbmcpLGUuZW1pdHRlZFJlYWRhYmxlPSEwLGUuc3luYz95dChwZSx0KTpwZSh0KSl9ZnVuY3Rpb24gcGUodCl7c2UoImVtaXQgcmVhZGFibGUiKSx0LmVtaXQoInJlYWRhYmxlIiksdmUodCl9ZnVuY3Rpb24gZGUodCxlKXtmb3IodmFyIHI9ZS5sZW5ndGg7IWUucmVhZGluZyYmIWUuZmxvd2luZyYmIWUuZW5kZWQmJmUubGVuZ3RoPGUuaGlnaFdhdGVyTWFyayYmKHNlKCJtYXliZVJlYWRNb3JlIHJlYWQgMCIpLHQucmVhZCgwKSxyIT09ZS5sZW5ndGgpOylyPWUubGVuZ3RoO2UucmVhZGluZ01vcmU9ITF9ZnVuY3Rpb24gZ2UodCl7c2UoInJlYWRhYmxlIG5leHR0aWNrIHJlYWQgMCIpLHQucmVhZCgwKX1mdW5jdGlvbiB5ZSh0LGUpe2UucmVhZGluZ3x8KHNlKCJyZXN1bWUgcmVhZCAwIiksdC5yZWFkKDApKSxlLnJlc3VtZVNjaGVkdWxlZD0hMSxlLmF3YWl0RHJhaW49MCx0LmVtaXQoInJlc3VtZSIpLHZlKHQpLGUuZmxvd2luZyYmIWUucmVhZGluZyYmdC5yZWFkKDApfWZ1bmN0aW9uIHZlKHQpe3ZhciBlPXQuX3JlYWRhYmxlU3RhdGU7Zm9yKHNlKCJmbG93IixlLmZsb3dpbmcpO2UuZmxvd2luZyYmbnVsbCE9PXQucmVhZCgpOyk7fWZ1bmN0aW9uIGJlKHQsZSl7cmV0dXJuIDA9PT1lLmxlbmd0aD9udWxsOihlLm9iamVjdE1vZGU/cj1lLmJ1ZmZlci5zaGlmdCgpOiF0fHx0Pj1lLmxlbmd0aD8ocj1lLmRlY29kZXI/ZS5idWZmZXIuam9pbigiIik6MT09PWUuYnVmZmVyLmxlbmd0aD9lLmJ1ZmZlci5oZWFkLmRhdGE6ZS5idWZmZXIuY29uY2F0KGUubGVuZ3RoKSxlLmJ1ZmZlci5jbGVhcigpKTpyPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbjt0PGUuaGVhZC5kYXRhLmxlbmd0aD8obj1lLmhlYWQuZGF0YS5zbGljZSgwLHQpLGUuaGVhZC5kYXRhPWUuaGVhZC5kYXRhLnNsaWNlKHQpKTpuPXQ9PT1lLmhlYWQuZGF0YS5sZW5ndGg/ZS5zaGlmdCgpOnI/ZnVuY3Rpb24odCxlKXt2YXIgcj1lLmhlYWQsbj0xLGk9ci5kYXRhO3QtPWkubGVuZ3RoO2Zvcig7cj1yLm5leHQ7KXt2YXIgbz1yLmRhdGEscz10Pm8ubGVuZ3RoP28ubGVuZ3RoOnQ7aWYocz09PW8ubGVuZ3RoP2krPW86aSs9by5zbGljZSgwLHQpLDA9PT0odC09cykpe3M9PT1vLmxlbmd0aD8oKytuLHIubmV4dD9lLmhlYWQ9ci5uZXh0OmUuaGVhZD1lLnRhaWw9bnVsbCk6KGUuaGVhZD1yLHIuZGF0YT1vLnNsaWNlKHMpKTticmVha30rK259cmV0dXJuIGUubGVuZ3RoLT1uLGl9KHQsZSk6ZnVuY3Rpb24odCxlKXt2YXIgcj1fLmFsbG9jVW5zYWZlKHQpLG49ZS5oZWFkLGk9MTtuLmRhdGEuY29weShyKSx0LT1uLmRhdGEubGVuZ3RoO2Zvcig7bj1uLm5leHQ7KXt2YXIgbz1uLmRhdGEscz10Pm8ubGVuZ3RoP28ubGVuZ3RoOnQ7aWYoby5jb3B5KHIsci5sZW5ndGgtdCwwLHMpLDA9PT0odC09cykpe3M9PT1vLmxlbmd0aD8oKytpLG4ubmV4dD9lLmhlYWQ9bi5uZXh0OmUuaGVhZD1lLnRhaWw9bnVsbCk6KGUuaGVhZD1uLG4uZGF0YT1vLnNsaWNlKHMpKTticmVha30rK2l9cmV0dXJuIGUubGVuZ3RoLT1pLHJ9KHQsZSk7cmV0dXJuIG59KHQsZS5idWZmZXIsZS5kZWNvZGVyKSxyKTt2YXIgcn1mdW5jdGlvbiBtZSh0KXt2YXIgZT10Ll9yZWFkYWJsZVN0YXRlO2lmKGUubGVuZ3RoPjApdGhyb3cgbmV3IEVycm9yKCciZW5kUmVhZGFibGUoKSIgY2FsbGVkIG9uIG5vbi1lbXB0eSBzdHJlYW0nKTtlLmVuZEVtaXR0ZWR8fChlLmVuZGVkPSEwLHl0KHdlLGUsdCkpfWZ1bmN0aW9uIHdlKHQsZSl7dC5lbmRFbWl0dGVkfHwwIT09dC5sZW5ndGh8fCh0LmVuZEVtaXR0ZWQ9ITAsZS5yZWFkYWJsZT0hMSxlLmVtaXQoImVuZCIpKX1mdW5jdGlvbiBfZSh0LGUpe2Zvcih2YXIgcj0wLG49dC5sZW5ndGg7cjxuO3IrKylpZih0W3JdPT09ZSlyZXR1cm4gcjtyZXR1cm4tMX1mdW5jdGlvbiBTZSgpe31mdW5jdGlvbiBFZSh0LGUscil7dGhpcy5jaHVuaz10LHRoaXMuZW5jb2Rpbmc9ZSx0aGlzLmNhbGxiYWNrPXIsdGhpcy5uZXh0PW51bGx9ZnVuY3Rpb24ga2UodCxlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiYnVmZmVyIix7Z2V0OkJ0KChmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldEJ1ZmZlcigpfSksIl93cml0YWJsZVN0YXRlLmJ1ZmZlciBpcyBkZXByZWNhdGVkLiBVc2UgX3dyaXRhYmxlU3RhdGUuZ2V0QnVmZmVyIGluc3RlYWQuIil9KSx0PXR8fHt9LHRoaXMub2JqZWN0TW9kZT0hIXQub2JqZWN0TW9kZSxlIGluc3RhbmNlb2YgVWUmJih0aGlzLm9iamVjdE1vZGU9dGhpcy5vYmplY3RNb2RlfHwhIXQud3JpdGFibGVPYmplY3RNb2RlKTt2YXIgcj10LmhpZ2hXYXRlck1hcmssbj10aGlzLm9iamVjdE1vZGU/MTY6MTYzODQ7dGhpcy5oaWdoV2F0ZXJNYXJrPXJ8fDA9PT1yP3I6bix0aGlzLmhpZ2hXYXRlck1hcms9fn50aGlzLmhpZ2hXYXRlck1hcmssdGhpcy5uZWVkRHJhaW49ITEsdGhpcy5lbmRpbmc9ITEsdGhpcy5lbmRlZD0hMSx0aGlzLmZpbmlzaGVkPSExO3ZhciBpPSExPT09dC5kZWNvZGVTdHJpbmdzO3RoaXMuZGVjb2RlU3RyaW5ncz0haSx0aGlzLmRlZmF1bHRFbmNvZGluZz10LmRlZmF1bHRFbmNvZGluZ3x8InV0ZjgiLHRoaXMubGVuZ3RoPTAsdGhpcy53cml0aW5nPSExLHRoaXMuY29ya2VkPTAsdGhpcy5zeW5jPSEwLHRoaXMuYnVmZmVyUHJvY2Vzc2luZz0hMSx0aGlzLm9ud3JpdGU9ZnVuY3Rpb24odCl7IWZ1bmN0aW9uKHQsZSl7dmFyIHI9dC5fd3JpdGFibGVTdGF0ZSxuPXIuc3luYyxpPXIud3JpdGVjYjtpZihmdW5jdGlvbih0KXt0LndyaXRpbmc9ITEsdC53cml0ZWNiPW51bGwsdC5sZW5ndGgtPXQud3JpdGVsZW4sdC53cml0ZWxlbj0wfShyKSxlKSFmdW5jdGlvbih0LGUscixuLGkpey0tZS5wZW5kaW5nY2Iscj95dChpLG4pOmkobik7dC5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQ9ITAsdC5lbWl0KCJlcnJvciIsbil9KHQscixuLGUsaSk7ZWxzZXt2YXIgbz1qZShyKTtvfHxyLmNvcmtlZHx8ci5idWZmZXJQcm9jZXNzaW5nfHwhci5idWZmZXJlZFJlcXVlc3R8fFRlKHQsciksbj95dChPZSx0LHIsbyxpKTpPZSh0LHIsbyxpKX19KGUsdCl9LHRoaXMud3JpdGVjYj1udWxsLHRoaXMud3JpdGVsZW49MCx0aGlzLmJ1ZmZlcmVkUmVxdWVzdD1udWxsLHRoaXMubGFzdEJ1ZmZlcmVkUmVxdWVzdD1udWxsLHRoaXMucGVuZGluZ2NiPTAsdGhpcy5wcmVmaW5pc2hlZD0hMSx0aGlzLmVycm9yRW1pdHRlZD0hMSx0aGlzLmJ1ZmZlcmVkUmVxdWVzdENvdW50PTAsdGhpcy5jb3JrZWRSZXF1ZXN0c0ZyZWU9bmV3IFBlKHRoaXMpfWZ1bmN0aW9uIFJlKHQpe2lmKCEodGhpcyBpbnN0YW5jZW9mIFJlfHx0aGlzIGluc3RhbmNlb2YgVWUpKXJldHVybiBuZXcgUmUodCk7dGhpcy5fd3JpdGFibGVTdGF0ZT1uZXcga2UodCx0aGlzKSx0aGlzLndyaXRhYmxlPSEwLHQmJigiZnVuY3Rpb24iPT10eXBlb2YgdC53cml0ZSYmKHRoaXMuX3dyaXRlPXQud3JpdGUpLCJmdW5jdGlvbiI9PXR5cGVvZiB0LndyaXRldiYmKHRoaXMuX3dyaXRldj10LndyaXRldikpLGUuY2FsbCh0aGlzKX1mdW5jdGlvbiBBZSh0LGUscixuLGksbyxzKXtlLndyaXRlbGVuPW4sZS53cml0ZWNiPXMsZS53cml0aW5nPSEwLGUuc3luYz0hMCxyP3QuX3dyaXRldihpLGUub253cml0ZSk6dC5fd3JpdGUoaSxvLGUub253cml0ZSksZS5zeW5jPSExfWZ1bmN0aW9uIE9lKHQsZSxyLG4pe3J8fGZ1bmN0aW9uKHQsZSl7MD09PWUubGVuZ3RoJiZlLm5lZWREcmFpbiYmKGUubmVlZERyYWluPSExLHQuZW1pdCgiZHJhaW4iKSl9KHQsZSksZS5wZW5kaW5nY2ItLSxuKCksQ2UodCxlKX1mdW5jdGlvbiBUZSh0LGUpe2UuYnVmZmVyUHJvY2Vzc2luZz0hMDt2YXIgcj1lLmJ1ZmZlcmVkUmVxdWVzdDtpZih0Ll93cml0ZXYmJnImJnIubmV4dCl7dmFyIG49ZS5idWZmZXJlZFJlcXVlc3RDb3VudCxpPW5ldyBBcnJheShuKSxvPWUuY29ya2VkUmVxdWVzdHNGcmVlO28uZW50cnk9cjtmb3IodmFyIHM9MDtyOylpW3NdPXIscj1yLm5leHQscys9MTtBZSh0LGUsITAsZS5sZW5ndGgsaSwiIixvLmZpbmlzaCksZS5wZW5kaW5nY2IrKyxlLmxhc3RCdWZmZXJlZFJlcXVlc3Q9bnVsbCxvLm5leHQ/KGUuY29ya2VkUmVxdWVzdHNGcmVlPW8ubmV4dCxvLm5leHQ9bnVsbCk6ZS5jb3JrZWRSZXF1ZXN0c0ZyZWU9bmV3IFBlKGUpfWVsc2V7Zm9yKDtyOyl7dmFyIGE9ci5jaHVuayx1PXIuZW5jb2RpbmcsaD1yLmNhbGxiYWNrO2lmKEFlKHQsZSwhMSxlLm9iamVjdE1vZGU/MTphLmxlbmd0aCxhLHUsaCkscj1yLm5leHQsZS53cml0aW5nKWJyZWFrfW51bGw9PT1yJiYoZS5sYXN0QnVmZmVyZWRSZXF1ZXN0PW51bGwpfWUuYnVmZmVyZWRSZXF1ZXN0Q291bnQ9MCxlLmJ1ZmZlcmVkUmVxdWVzdD1yLGUuYnVmZmVyUHJvY2Vzc2luZz0hMX1mdW5jdGlvbiBqZSh0KXtyZXR1cm4gdC5lbmRpbmcmJjA9PT10Lmxlbmd0aCYmbnVsbD09PXQuYnVmZmVyZWRSZXF1ZXN0JiYhdC5maW5pc2hlZCYmIXQud3JpdGluZ31mdW5jdGlvbiBMZSh0LGUpe2UucHJlZmluaXNoZWR8fChlLnByZWZpbmlzaGVkPSEwLHQuZW1pdCgicHJlZmluaXNoIikpfWZ1bmN0aW9uIENlKHQsZSl7dmFyIHI9amUoZSk7cmV0dXJuIHImJigwPT09ZS5wZW5kaW5nY2I/KExlKHQsZSksZS5maW5pc2hlZD0hMCx0LmVtaXQoImZpbmlzaCIpKTpMZSh0LGUpKSxyfWZ1bmN0aW9uIFBlKHQpe3ZhciBlPXRoaXM7dGhpcy5uZXh0PW51bGwsdGhpcy5lbnRyeT1udWxsLHRoaXMuZmluaXNoPWZ1bmN0aW9uKHIpe3ZhciBuPWUuZW50cnk7Zm9yKGUuZW50cnk9bnVsbDtuOyl7dmFyIGk9bi5jYWxsYmFjazt0LnBlbmRpbmdjYi0tLGkociksbj1uLm5leHR9dC5jb3JrZWRSZXF1ZXN0c0ZyZWU/dC5jb3JrZWRSZXF1ZXN0c0ZyZWUubmV4dD1lOnQuY29ya2VkUmVxdWVzdHNGcmVlPWV9fXVlLnByb3RvdHlwZS5yZWFkPWZ1bmN0aW9uKHQpe3NlKCJyZWFkIix0KSx0PXBhcnNlSW50KHQsMTApO3ZhciBlPXRoaXMuX3JlYWRhYmxlU3RhdGUscj10O2lmKDAhPT10JiYoZS5lbWl0dGVkUmVhZGFibGU9ITEpLDA9PT10JiZlLm5lZWRSZWFkYWJsZSYmKGUubGVuZ3RoPj1lLmhpZ2hXYXRlck1hcmt8fGUuZW5kZWQpKXJldHVybiBzZSgicmVhZDogZW1pdFJlYWRhYmxlIixlLmxlbmd0aCxlLmVuZGVkKSwwPT09ZS5sZW5ndGgmJmUuZW5kZWQ/bWUodGhpcyk6bGUodGhpcyksbnVsbDtpZigwPT09KHQ9Y2UodCxlKSkmJmUuZW5kZWQpcmV0dXJuIDA9PT1lLmxlbmd0aCYmbWUodGhpcyksbnVsbDt2YXIgbixpPWUubmVlZFJlYWRhYmxlO3JldHVybiBzZSgibmVlZCByZWFkYWJsZSIsaSksKDA9PT1lLmxlbmd0aHx8ZS5sZW5ndGgtdDxlLmhpZ2hXYXRlck1hcmspJiZzZSgibGVuZ3RoIGxlc3MgdGhhbiB3YXRlcm1hcmsiLGk9ITApLGUuZW5kZWR8fGUucmVhZGluZz9zZSgicmVhZGluZyBvciBlbmRlZCIsaT0hMSk6aSYmKHNlKCJkbyByZWFkIiksZS5yZWFkaW5nPSEwLGUuc3luYz0hMCwwPT09ZS5sZW5ndGgmJihlLm5lZWRSZWFkYWJsZT0hMCksdGhpcy5fcmVhZChlLmhpZ2hXYXRlck1hcmspLGUuc3luYz0hMSxlLnJlYWRpbmd8fCh0PWNlKHIsZSkpKSxudWxsPT09KG49dD4wP2JlKHQsZSk6bnVsbCk/KGUubmVlZFJlYWRhYmxlPSEwLHQ9MCk6ZS5sZW5ndGgtPXQsMD09PWUubGVuZ3RoJiYoZS5lbmRlZHx8KGUubmVlZFJlYWRhYmxlPSEwKSxyIT09dCYmZS5lbmRlZCYmbWUodGhpcykpLG51bGwhPT1uJiZ0aGlzLmVtaXQoImRhdGEiLG4pLG59LHVlLnByb3RvdHlwZS5fcmVhZD1mdW5jdGlvbih0KXt0aGlzLmVtaXQoImVycm9yIixuZXcgRXJyb3IoIm5vdCBpbXBsZW1lbnRlZCIpKX0sdWUucHJvdG90eXBlLnBpcGU9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLG49dGhpcy5fcmVhZGFibGVTdGF0ZTtzd2l0Y2gobi5waXBlc0NvdW50KXtjYXNlIDA6bi5waXBlcz10O2JyZWFrO2Nhc2UgMTpuLnBpcGVzPVtuLnBpcGVzLHRdO2JyZWFrO2RlZmF1bHQ6bi5waXBlcy5wdXNoKHQpfW4ucGlwZXNDb3VudCs9MSxzZSgicGlwZSBjb3VudD0lZCBvcHRzPSVqIixuLnBpcGVzQ291bnQsZSk7dmFyIGk9IWV8fCExIT09ZS5lbmQ/czpoO2Z1bmN0aW9uIG8odCl7c2UoIm9udW5waXBlIiksdD09PXImJmgoKX1mdW5jdGlvbiBzKCl7c2UoIm9uZW5kIiksdC5lbmQoKX1uLmVuZEVtaXR0ZWQ/eXQoaSk6ci5vbmNlKCJlbmQiLGkpLHQub24oInVucGlwZSIsbyk7dmFyIGE9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9dC5fcmVhZGFibGVTdGF0ZTtzZSgicGlwZU9uRHJhaW4iLGUuYXdhaXREcmFpbiksZS5hd2FpdERyYWluJiZlLmF3YWl0RHJhaW4tLSwwPT09ZS5hd2FpdERyYWluJiZ0Lmxpc3RlbmVycygiZGF0YSIpLmxlbmd0aCYmKGUuZmxvd2luZz0hMCx2ZSh0KSl9fShyKTt0Lm9uKCJkcmFpbiIsYSk7dmFyIHU9ITE7ZnVuY3Rpb24gaCgpe3NlKCJjbGVhbnVwIiksdC5yZW1vdmVMaXN0ZW5lcigiY2xvc2UiLHApLHQucmVtb3ZlTGlzdGVuZXIoImZpbmlzaCIsZCksdC5yZW1vdmVMaXN0ZW5lcigiZHJhaW4iLGEpLHQucmVtb3ZlTGlzdGVuZXIoImVycm9yIixsKSx0LnJlbW92ZUxpc3RlbmVyKCJ1bnBpcGUiLG8pLHIucmVtb3ZlTGlzdGVuZXIoImVuZCIscyksci5yZW1vdmVMaXN0ZW5lcigiZW5kIixoKSxyLnJlbW92ZUxpc3RlbmVyKCJkYXRhIixjKSx1PSEwLCFuLmF3YWl0RHJhaW58fHQuX3dyaXRhYmxlU3RhdGUmJiF0Ll93cml0YWJsZVN0YXRlLm5lZWREcmFpbnx8YSgpfXZhciBmPSExO2Z1bmN0aW9uIGMoZSl7c2UoIm9uZGF0YSIpLGY9ITEsITEhPT10LndyaXRlKGUpfHxmfHwoKDE9PT1uLnBpcGVzQ291bnQmJm4ucGlwZXM9PT10fHxuLnBpcGVzQ291bnQ+MSYmLTEhPT1fZShuLnBpcGVzLHQpKSYmIXUmJihzZSgiZmFsc2Ugd3JpdGUgcmVzcG9uc2UsIHBhdXNlIixyLl9yZWFkYWJsZVN0YXRlLmF3YWl0RHJhaW4pLHIuX3JlYWRhYmxlU3RhdGUuYXdhaXREcmFpbisrLGY9ITApLHIucGF1c2UoKSl9ZnVuY3Rpb24gbChlKXt2YXIgcjtzZSgib25lcnJvciIsZSksZygpLHQucmVtb3ZlTGlzdGVuZXIoImVycm9yIixsKSwwPT09KHI9ImVycm9yIix0Lmxpc3RlbmVycyhyKS5sZW5ndGgpJiZ0LmVtaXQoImVycm9yIixlKX1mdW5jdGlvbiBwKCl7dC5yZW1vdmVMaXN0ZW5lcigiZmluaXNoIixkKSxnKCl9ZnVuY3Rpb24gZCgpe3NlKCJvbmZpbmlzaCIpLHQucmVtb3ZlTGlzdGVuZXIoImNsb3NlIixwKSxnKCl9ZnVuY3Rpb24gZygpe3NlKCJ1bnBpcGUiKSxyLnVucGlwZSh0KX1yZXR1cm4gci5vbigiZGF0YSIsYyksZnVuY3Rpb24odCxlLHIpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB0LnByZXBlbmRMaXN0ZW5lcilyZXR1cm4gdC5wcmVwZW5kTGlzdGVuZXIoZSxyKTt0Ll9ldmVudHMmJnQuX2V2ZW50c1tlXT9BcnJheS5pc0FycmF5KHQuX2V2ZW50c1tlXSk/dC5fZXZlbnRzW2VdLnVuc2hpZnQocik6dC5fZXZlbnRzW2VdPVtyLHQuX2V2ZW50c1tlXV06dC5vbihlLHIpfSh0LCJlcnJvciIsbCksdC5vbmNlKCJjbG9zZSIscCksdC5vbmNlKCJmaW5pc2giLGQpLHQuZW1pdCgicGlwZSIsciksbi5mbG93aW5nfHwoc2UoInBpcGUgcmVzdW1lIiksci5yZXN1bWUoKSksdH0sdWUucHJvdG90eXBlLnVucGlwZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9yZWFkYWJsZVN0YXRlO2lmKDA9PT1lLnBpcGVzQ291bnQpcmV0dXJuIHRoaXM7aWYoMT09PWUucGlwZXNDb3VudClyZXR1cm4gdCYmdCE9PWUucGlwZXN8fCh0fHwodD1lLnBpcGVzKSxlLnBpcGVzPW51bGwsZS5waXBlc0NvdW50PTAsZS5mbG93aW5nPSExLHQmJnQuZW1pdCgidW5waXBlIix0aGlzKSksdGhpcztpZighdCl7dmFyIHI9ZS5waXBlcyxuPWUucGlwZXNDb3VudDtlLnBpcGVzPW51bGwsZS5waXBlc0NvdW50PTAsZS5mbG93aW5nPSExO2Zvcih2YXIgaT0wO2k8bjtpKyspcltpXS5lbWl0KCJ1bnBpcGUiLHRoaXMpO3JldHVybiB0aGlzfXZhciBvPV9lKGUucGlwZXMsdCk7cmV0dXJuLTE9PT1vfHwoZS5waXBlcy5zcGxpY2UobywxKSxlLnBpcGVzQ291bnQtPTEsMT09PWUucGlwZXNDb3VudCYmKGUucGlwZXM9ZS5waXBlc1swXSksdC5lbWl0KCJ1bnBpcGUiLHRoaXMpKSx0aGlzfSx1ZS5wcm90b3R5cGUub249ZnVuY3Rpb24odCxyKXt2YXIgbj1lLnByb3RvdHlwZS5vbi5jYWxsKHRoaXMsdCxyKTtpZigiZGF0YSI9PT10KSExIT09dGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nJiZ0aGlzLnJlc3VtZSgpO2Vsc2UgaWYoInJlYWRhYmxlIj09PXQpe3ZhciBpPXRoaXMuX3JlYWRhYmxlU3RhdGU7aS5lbmRFbWl0dGVkfHxpLnJlYWRhYmxlTGlzdGVuaW5nfHwoaS5yZWFkYWJsZUxpc3RlbmluZz1pLm5lZWRSZWFkYWJsZT0hMCxpLmVtaXR0ZWRSZWFkYWJsZT0hMSxpLnJlYWRpbmc/aS5sZW5ndGgmJmxlKHRoaXMpOnl0KGdlLHRoaXMpKX1yZXR1cm4gbn0sdWUucHJvdG90eXBlLmFkZExpc3RlbmVyPXVlLnByb3RvdHlwZS5vbix1ZS5wcm90b3R5cGUucmVzdW1lPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fcmVhZGFibGVTdGF0ZTtyZXR1cm4gdC5mbG93aW5nfHwoc2UoInJlc3VtZSIpLHQuZmxvd2luZz0hMCxmdW5jdGlvbih0LGUpe2UucmVzdW1lU2NoZWR1bGVkfHwoZS5yZXN1bWVTY2hlZHVsZWQ9ITAseXQoeWUsdCxlKSl9KHRoaXMsdCkpLHRoaXN9LHVlLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbigpe3JldHVybiBzZSgiY2FsbCBwYXVzZSBmbG93aW5nPSVqIix0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcpLCExIT09dGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nJiYoc2UoInBhdXNlIiksdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nPSExLHRoaXMuZW1pdCgicGF1c2UiKSksdGhpc30sdWUucHJvdG90eXBlLndyYXA9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fcmVhZGFibGVTdGF0ZSxyPSExLG49dGhpcztmb3IodmFyIGkgaW4gdC5vbigiZW5kIiwoZnVuY3Rpb24oKXtpZihzZSgid3JhcHBlZCBlbmQiKSxlLmRlY29kZXImJiFlLmVuZGVkKXt2YXIgdD1lLmRlY29kZXIuZW5kKCk7dCYmdC5sZW5ndGgmJm4ucHVzaCh0KX1uLnB1c2gobnVsbCl9KSksdC5vbigiZGF0YSIsKGZ1bmN0aW9uKGkpeyhzZSgid3JhcHBlZCBkYXRhIiksZS5kZWNvZGVyJiYoaT1lLmRlY29kZXIud3JpdGUoaSkpLGUub2JqZWN0TW9kZSYmbnVsbD09aSl8fChlLm9iamVjdE1vZGV8fGkmJmkubGVuZ3RoKSYmKG4ucHVzaChpKXx8KHI9ITAsdC5wYXVzZSgpKSl9KSksdCl2b2lkIDA9PT10aGlzW2ldJiYiZnVuY3Rpb24iPT10eXBlb2YgdFtpXSYmKHRoaXNbaV09ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHRbZV0uYXBwbHkodCxhcmd1bWVudHMpfX0oaSkpO3JldHVybiBmdW5jdGlvbih0LGUpe2Zvcih2YXIgcj0wLG49dC5sZW5ndGg7cjxuO3IrKyllKHRbcl0scil9KFsiZXJyb3IiLCJjbG9zZSIsImRlc3Ryb3kiLCJwYXVzZSIsInJlc3VtZSJdLChmdW5jdGlvbihlKXt0Lm9uKGUsbi5lbWl0LmJpbmQobixlKSl9KSksbi5fcmVhZD1mdW5jdGlvbihlKXtzZSgid3JhcHBlZCBfcmVhZCIsZSksciYmKHI9ITEsdC5yZXN1bWUoKSl9LG59LHVlLl9mcm9tTGlzdD1iZSxSZS5Xcml0YWJsZVN0YXRlPWtlLEN0KFJlLGUpLGtlLnByb3RvdHlwZS5nZXRCdWZmZXI9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5idWZmZXJlZFJlcXVlc3QsZT1bXTt0OyllLnB1c2godCksdD10Lm5leHQ7cmV0dXJuIGV9LFJlLnByb3RvdHlwZS5waXBlPWZ1bmN0aW9uKCl7dGhpcy5lbWl0KCJlcnJvciIsbmV3IEVycm9yKCJDYW5ub3QgcGlwZSwgbm90IHJlYWRhYmxlIikpfSxSZS5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPXRoaXMuX3dyaXRhYmxlU3RhdGUsaT0hMTtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZSYmKHI9ZSxlPW51bGwpLF8uaXNCdWZmZXIodCk/ZT0iYnVmZmVyIjplfHwoZT1uLmRlZmF1bHRFbmNvZGluZyksImZ1bmN0aW9uIiE9dHlwZW9mIHImJihyPVNlKSxuLmVuZGVkP2Z1bmN0aW9uKHQsZSl7dmFyIHI9bmV3IEVycm9yKCJ3cml0ZSBhZnRlciBlbmQiKTt0LmVtaXQoImVycm9yIixyKSx5dChlLHIpfSh0aGlzLHIpOmZ1bmN0aW9uKHQsZSxyLG4pe3ZhciBpPSEwLG89ITE7cmV0dXJuIG51bGw9PT1yP289bmV3IFR5cGVFcnJvcigiTWF5IG5vdCB3cml0ZSBudWxsIHZhbHVlcyB0byBzdHJlYW0iKTpfLmlzQnVmZmVyKHIpfHwic3RyaW5nIj09dHlwZW9mIHJ8fHZvaWQgMD09PXJ8fGUub2JqZWN0TW9kZXx8KG89bmV3IFR5cGVFcnJvcigiSW52YWxpZCBub24tc3RyaW5nL2J1ZmZlciBjaHVuayIpKSxvJiYodC5lbWl0KCJlcnJvciIsbykseXQobixvKSxpPSExKSxpfSh0aGlzLG4sdCxyKSYmKG4ucGVuZGluZ2NiKyssaT1mdW5jdGlvbih0LGUscixuLGkpe3I9ZnVuY3Rpb24odCxlLHIpe3Qub2JqZWN0TW9kZXx8ITE9PT10LmRlY29kZVN0cmluZ3N8fCJzdHJpbmciIT10eXBlb2YgZXx8KGU9Xy5mcm9tKGUscikpO3JldHVybiBlfShlLHIsbiksXy5pc0J1ZmZlcihyKSYmKG49ImJ1ZmZlciIpO3ZhciBvPWUub2JqZWN0TW9kZT8xOnIubGVuZ3RoO2UubGVuZ3RoKz1vO3ZhciBzPWUubGVuZ3RoPGUuaGlnaFdhdGVyTWFyaztzfHwoZS5uZWVkRHJhaW49ITApO2lmKGUud3JpdGluZ3x8ZS5jb3JrZWQpe3ZhciBhPWUubGFzdEJ1ZmZlcmVkUmVxdWVzdDtlLmxhc3RCdWZmZXJlZFJlcXVlc3Q9bmV3IEVlKHIsbixpKSxhP2EubmV4dD1lLmxhc3RCdWZmZXJlZFJlcXVlc3Q6ZS5idWZmZXJlZFJlcXVlc3Q9ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0LGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQrPTF9ZWxzZSBBZSh0LGUsITEsbyxyLG4saSk7cmV0dXJuIHN9KHRoaXMsbix0LGUscikpLGl9LFJlLnByb3RvdHlwZS5jb3JrPWZ1bmN0aW9uKCl7dGhpcy5fd3JpdGFibGVTdGF0ZS5jb3JrZWQrK30sUmUucHJvdG90eXBlLnVuY29yaz1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX3dyaXRhYmxlU3RhdGU7dC5jb3JrZWQmJih0LmNvcmtlZC0tLHQud3JpdGluZ3x8dC5jb3JrZWR8fHQuZmluaXNoZWR8fHQuYnVmZmVyUHJvY2Vzc2luZ3x8IXQuYnVmZmVyZWRSZXF1ZXN0fHxUZSh0aGlzLHQpKX0sUmUucHJvdG90eXBlLnNldERlZmF1bHRFbmNvZGluZz1mdW5jdGlvbih0KXtpZigic3RyaW5nIj09dHlwZW9mIHQmJih0PXQudG9Mb3dlckNhc2UoKSksIShbImhleCIsInV0ZjgiLCJ1dGYtOCIsImFzY2lpIiwiYmluYXJ5IiwiYmFzZTY0IiwidWNzMiIsInVjcy0yIiwidXRmMTZsZSIsInV0Zi0xNmxlIiwicmF3Il0uaW5kZXhPZigodCsiIikudG9Mb3dlckNhc2UoKSk+LTEpKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrdCk7cmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVmYXVsdEVuY29kaW5nPXQsdGhpc30sUmUucHJvdG90eXBlLl93cml0ZT1mdW5jdGlvbih0LGUscil7cihuZXcgRXJyb3IoIm5vdCBpbXBsZW1lbnRlZCIpKX0sUmUucHJvdG90eXBlLl93cml0ZXY9bnVsbCxSZS5wcm90b3R5cGUuZW5kPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj10aGlzLl93cml0YWJsZVN0YXRlOyJmdW5jdGlvbiI9PXR5cGVvZiB0PyhyPXQsdD1udWxsLGU9bnVsbCk6ImZ1bmN0aW9uIj09dHlwZW9mIGUmJihyPWUsZT1udWxsKSxudWxsIT10JiZ0aGlzLndyaXRlKHQsZSksbi5jb3JrZWQmJihuLmNvcmtlZD0xLHRoaXMudW5jb3JrKCkpLG4uZW5kaW5nfHxuLmZpbmlzaGVkfHxmdW5jdGlvbih0LGUscil7ZS5lbmRpbmc9ITAsQ2UodCxlKSxyJiYoZS5maW5pc2hlZD95dChyKTp0Lm9uY2UoImZpbmlzaCIscikpO2UuZW5kZWQ9ITAsdC53cml0YWJsZT0hMX0odGhpcyxuLHIpfSxDdChVZSx1ZSk7Zm9yKHZhciBNZT1PYmplY3Qua2V5cyhSZS5wcm90b3R5cGUpLEJlPTA7QmU8TWUubGVuZ3RoO0JlKyspe3ZhciB4ZT1NZVtCZV07VWUucHJvdG90eXBlW3hlXXx8KFVlLnByb3RvdHlwZVt4ZV09UmUucHJvdG90eXBlW3hlXSl9ZnVuY3Rpb24gVWUodCl7aWYoISh0aGlzIGluc3RhbmNlb2YgVWUpKXJldHVybiBuZXcgVWUodCk7dWUuY2FsbCh0aGlzLHQpLFJlLmNhbGwodGhpcyx0KSx0JiYhMT09PXQucmVhZGFibGUmJih0aGlzLnJlYWRhYmxlPSExKSx0JiYhMT09PXQud3JpdGFibGUmJih0aGlzLndyaXRhYmxlPSExKSx0aGlzLmFsbG93SGFsZk9wZW49ITAsdCYmITE9PT10LmFsbG93SGFsZk9wZW4mJih0aGlzLmFsbG93SGFsZk9wZW49ITEpLHRoaXMub25jZSgiZW5kIixJZSl9ZnVuY3Rpb24gSWUoKXt0aGlzLmFsbG93SGFsZk9wZW58fHRoaXMuX3dyaXRhYmxlU3RhdGUuZW5kZWR8fHl0KERlLHRoaXMpfWZ1bmN0aW9uIERlKHQpe3QuZW5kKCl9ZnVuY3Rpb24gTmUodCl7dGhpcy5hZnRlclRyYW5zZm9ybT1mdW5jdGlvbihlLHIpe3JldHVybiBmdW5jdGlvbih0LGUscil7dmFyIG49dC5fdHJhbnNmb3JtU3RhdGU7bi50cmFuc2Zvcm1pbmc9ITE7dmFyIGk9bi53cml0ZWNiO2lmKCFpKXJldHVybiB0LmVtaXQoImVycm9yIixuZXcgRXJyb3IoIm5vIHdyaXRlY2IgaW4gVHJhbnNmb3JtIGNsYXNzIikpO24ud3JpdGVjaHVuaz1udWxsLG4ud3JpdGVjYj1udWxsLG51bGwhPXImJnQucHVzaChyKTtpKGUpO3ZhciBvPXQuX3JlYWRhYmxlU3RhdGU7by5yZWFkaW5nPSExLChvLm5lZWRSZWFkYWJsZXx8by5sZW5ndGg8by5oaWdoV2F0ZXJNYXJrKSYmdC5fcmVhZChvLmhpZ2hXYXRlck1hcmspfSh0LGUscil9LHRoaXMubmVlZFRyYW5zZm9ybT0hMSx0aGlzLnRyYW5zZm9ybWluZz0hMSx0aGlzLndyaXRlY2I9bnVsbCx0aGlzLndyaXRlY2h1bms9bnVsbCx0aGlzLndyaXRlZW5jb2Rpbmc9bnVsbH1mdW5jdGlvbiBGZSh0KXtpZighKHRoaXMgaW5zdGFuY2VvZiBGZSkpcmV0dXJuIG5ldyBGZSh0KTtVZS5jYWxsKHRoaXMsdCksdGhpcy5fdHJhbnNmb3JtU3RhdGU9bmV3IE5lKHRoaXMpO3ZhciBlPXRoaXM7dGhpcy5fcmVhZGFibGVTdGF0ZS5uZWVkUmVhZGFibGU9ITAsdGhpcy5fcmVhZGFibGVTdGF0ZS5zeW5jPSExLHQmJigiZnVuY3Rpb24iPT10eXBlb2YgdC50cmFuc2Zvcm0mJih0aGlzLl90cmFuc2Zvcm09dC50cmFuc2Zvcm0pLCJmdW5jdGlvbiI9PXR5cGVvZiB0LmZsdXNoJiYodGhpcy5fZmx1c2g9dC5mbHVzaCkpLHRoaXMub25jZSgicHJlZmluaXNoIiwoZnVuY3Rpb24oKXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5fZmx1c2g/dGhpcy5fZmx1c2goKGZ1bmN0aW9uKHQpe3plKGUsdCl9KSk6emUoZSl9KSl9ZnVuY3Rpb24gemUodCxlKXtpZihlKXJldHVybiB0LmVtaXQoImVycm9yIixlKTt2YXIgcj10Ll93cml0YWJsZVN0YXRlLG49dC5fdHJhbnNmb3JtU3RhdGU7aWYoci5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJDYWxsaW5nIHRyYW5zZm9ybSBkb25lIHdoZW4gd3MubGVuZ3RoICE9IDAiKTtpZihuLnRyYW5zZm9ybWluZyl0aHJvdyBuZXcgRXJyb3IoIkNhbGxpbmcgdHJhbnNmb3JtIGRvbmUgd2hlbiBzdGlsbCB0cmFuc2Zvcm1pbmciKTtyZXR1cm4gdC5wdXNoKG51bGwpfWZ1bmN0aW9uIHFlKHQpe2lmKCEodGhpcyBpbnN0YW5jZW9mIHFlKSlyZXR1cm4gbmV3IHFlKHQpO0ZlLmNhbGwodGhpcyx0KX1mdW5jdGlvbiBZZSgpe2UuY2FsbCh0aGlzKX1DdChGZSxVZSksRmUucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fdHJhbnNmb3JtU3RhdGUubmVlZFRyYW5zZm9ybT0hMSxVZS5wcm90b3R5cGUucHVzaC5jYWxsKHRoaXMsdCxlKX0sRmUucHJvdG90eXBlLl90cmFuc2Zvcm09ZnVuY3Rpb24odCxlLHIpe3Rocm93IG5ldyBFcnJvcigiTm90IGltcGxlbWVudGVkIil9LEZlLnByb3RvdHlwZS5fd3JpdGU9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPXRoaXMuX3RyYW5zZm9ybVN0YXRlO2lmKG4ud3JpdGVjYj1yLG4ud3JpdGVjaHVuaz10LG4ud3JpdGVlbmNvZGluZz1lLCFuLnRyYW5zZm9ybWluZyl7dmFyIGk9dGhpcy5fcmVhZGFibGVTdGF0ZTsobi5uZWVkVHJhbnNmb3JtfHxpLm5lZWRSZWFkYWJsZXx8aS5sZW5ndGg8aS5oaWdoV2F0ZXJNYXJrKSYmdGhpcy5fcmVhZChpLmhpZ2hXYXRlck1hcmspfX0sRmUucHJvdG90eXBlLl9yZWFkPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3RyYW5zZm9ybVN0YXRlO251bGwhPT1lLndyaXRlY2h1bmsmJmUud3JpdGVjYiYmIWUudHJhbnNmb3JtaW5nPyhlLnRyYW5zZm9ybWluZz0hMCx0aGlzLl90cmFuc2Zvcm0oZS53cml0ZWNodW5rLGUud3JpdGVlbmNvZGluZyxlLmFmdGVyVHJhbnNmb3JtKSk6ZS5uZWVkVHJhbnNmb3JtPSEwfSxDdChxZSxGZSkscWUucHJvdG90eXBlLl90cmFuc2Zvcm09ZnVuY3Rpb24odCxlLHIpe3IobnVsbCx0KX0sQ3QoWWUsZSksWWUuUmVhZGFibGU9dWUsWWUuV3JpdGFibGU9UmUsWWUuRHVwbGV4PVVlLFllLlRyYW5zZm9ybT1GZSxZZS5QYXNzVGhyb3VnaD1xZSxZZS5TdHJlYW09WWUsWWUucHJvdG90eXBlLnBpcGU9ZnVuY3Rpb24odCxyKXt2YXIgbj10aGlzO2Z1bmN0aW9uIGkoZSl7dC53cml0YWJsZSYmITE9PT10LndyaXRlKGUpJiZuLnBhdXNlJiZuLnBhdXNlKCl9ZnVuY3Rpb24gbygpe24ucmVhZGFibGUmJm4ucmVzdW1lJiZuLnJlc3VtZSgpfW4ub24oImRhdGEiLGkpLHQub24oImRyYWluIixvKSx0Ll9pc1N0ZGlvfHxyJiYhMT09PXIuZW5kfHwobi5vbigiZW5kIixhKSxuLm9uKCJjbG9zZSIsdSkpO3ZhciBzPSExO2Z1bmN0aW9uIGEoKXtzfHwocz0hMCx0LmVuZCgpKX1mdW5jdGlvbiB1KCl7c3x8KHM9ITAsImZ1bmN0aW9uIj09dHlwZW9mIHQuZGVzdHJveSYmdC5kZXN0cm95KCkpfWZ1bmN0aW9uIGgodCl7aWYoZigpLDA9PT1lLmxpc3RlbmVyQ291bnQodGhpcywiZXJyb3IiKSl0aHJvdyB0fWZ1bmN0aW9uIGYoKXtuLnJlbW92ZUxpc3RlbmVyKCJkYXRhIixpKSx0LnJlbW92ZUxpc3RlbmVyKCJkcmFpbiIsbyksbi5yZW1vdmVMaXN0ZW5lcigiZW5kIixhKSxuLnJlbW92ZUxpc3RlbmVyKCJjbG9zZSIsdSksbi5yZW1vdmVMaXN0ZW5lcigiZXJyb3IiLGgpLHQucmVtb3ZlTGlzdGVuZXIoImVycm9yIixoKSxuLnJlbW92ZUxpc3RlbmVyKCJlbmQiLGYpLG4ucmVtb3ZlTGlzdGVuZXIoImNsb3NlIixmKSx0LnJlbW92ZUxpc3RlbmVyKCJjbG9zZSIsZil9cmV0dXJuIG4ub24oImVycm9yIixoKSx0Lm9uKCJlcnJvciIsaCksbi5vbigiZW5kIixmKSxuLm9uKCJjbG9zZSIsZiksdC5vbigiY2xvc2UiLGYpLHQuZW1pdCgicGlwZSIsbiksdH07dmFyIFdlPXt9LCRlPXtnZXQgZXhwb3J0cygpe3JldHVybiBXZX0sc2V0IGV4cG9ydHModCl7V2U9dH19OyJmdW5jdGlvbiI9PXR5cGVvZiBPYmplY3QuY3JlYXRlPyRlLmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtlJiYodC5zdXBlcl89ZSx0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSl9OiRlLmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtpZihlKXt0LnN1cGVyXz1lO3ZhciByPWZ1bmN0aW9uKCl7fTtyLnByb3RvdHlwZT1lLnByb3RvdHlwZSx0LnByb3RvdHlwZT1uZXcgcix0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj10fX07bGV0IEdlPUhlKCk7ZnVuY3Rpb24gSmUodCxlKXsoIm9iamVjdCIhPXR5cGVvZiB0fHxBcnJheS5pc0FycmF5KHQpKSYmKGU9dCx0PXt9KTtsZXQgcj1uZXcgR2UodCk7dmFyIG47cmV0dXJuIHIuX2Zyb209QXJyYXkuaXNBcnJheShlKT8obj0obj1lKS5zbGljZSgpLGZ1bmN0aW9uKHQsZSl7bGV0IHI9bnVsbCxpPW4ubGVuZ3RoP24uc2hpZnQoKTpudWxsO2kgaW5zdGFuY2VvZiBFcnJvciYmKHI9aSxpPW51bGwpLGUocixpKX0pOmV8fFZlLHJ9ZnVuY3Rpb24gSGUodCxlKXtmdW5jdGlvbiByKGUpe2lmKCEodGhpcyBpbnN0YW5jZW9mIHIpKXJldHVybiBuZXcgcihlKTt0aGlzLl9yZWFkaW5nPSExLHRoaXMuX2NhbGxiYWNrPWZ1bmN0aW9uKHQsZSl7aWYobi5kZXN0cm95ZWQpcmV0dXJuO2lmKHQpcmV0dXJuIG4uZGVzdHJveSh0KTtpZihudWxsPT09ZSlyZXR1cm4gbi5wdXNoKG51bGwpO24uX3JlYWRpbmc9ITEsbi5wdXNoKGUpJiZuLl9yZWFkKGkpfSx0aGlzLmRlc3Ryb3llZD0hMSx1ZS5jYWxsKHRoaXMsZXx8dCk7bGV0IG49dGhpcyxpPXRoaXMuX3JlYWRhYmxlU3RhdGUuaGlnaFdhdGVyTWFya31yZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdCYmKGU9dCx0PXt9KSx0PUtlKHQpLFdlKHIsdWUpLHIucHJvdG90eXBlLl9mcm9tPWV8fFZlLHIucHJvdG90eXBlLl9yZWFkPWZ1bmN0aW9uKHQpe3RoaXMuX3JlYWRpbmd8fHRoaXMuZGVzdHJveWVkfHwodGhpcy5fcmVhZGluZz0hMCx0aGlzLl9mcm9tKHQsdGhpcy5fY2FsbGJhY2spKX0sci5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbih0KXtpZih0aGlzLmRlc3Ryb3llZClyZXR1cm47dGhpcy5kZXN0cm95ZWQ9ITA7bGV0IGU9dGhpcztwcm9jZXNzLm5leHRUaWNrKChmdW5jdGlvbigpe3QmJmUuZW1pdCgiZXJyb3IiLHQpLGUuZW1pdCgiY2xvc2UiKX0pKX0scn1mdW5jdGlvbiBWZSgpe31mdW5jdGlvbiBLZSh0KXtyZXR1cm4gdD10fHx7fX1KZS5jdG9yPUhlLEplLm9iaj1mdW5jdGlvbih0LGUpe3JldHVybigiZnVuY3Rpb24iPT10eXBlb2YgdHx8QXJyYXkuaXNBcnJheSh0KSkmJihlPXQsdD17fSksKHQ9S2UodCkpLm9iamVjdE1vZGU9ITAsdC5oaWdoV2F0ZXJNYXJrPTE2LEplKHQsZSl9O3ZhciBaZSxRZT0xLFhlPXt9LHRyPSExLGVyPWEuZG9jdW1lbnQ7ZnVuY3Rpb24gcnIodCl7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PW5ldyBGdW5jdGlvbigiIit0KSk7Zm9yKHZhciBlPW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoLTEpLHI9MDtyPGUubGVuZ3RoO3IrKyllW3JdPWFyZ3VtZW50c1tyKzFdO3ZhciBuPXtjYWxsYmFjazp0LGFyZ3M6ZX07cmV0dXJuIFhlW1FlXT1uLFplKFFlKSxRZSsrfWZ1bmN0aW9uIG5yKHQpe2lmKHRyKXNldFRpbWVvdXQobnIsMCx0KTtlbHNle3ZhciBlPVhlW3RdO2lmKGUpe3RyPSEwO3RyeXshZnVuY3Rpb24odCl7dmFyIGU9dC5jYWxsYmFjayxyPXQuYXJncztzd2l0Y2goci5sZW5ndGgpe2Nhc2UgMDplKCk7YnJlYWs7Y2FzZSAxOmUoclswXSk7YnJlYWs7Y2FzZSAyOmUoclswXSxyWzFdKTticmVhaztjYXNlIDM6ZShyWzBdLHJbMV0sclsyXSk7YnJlYWs7ZGVmYXVsdDplLmFwcGx5KHZvaWQgMCxyKX19KGUpfWZpbmFsbHl7IWZ1bmN0aW9uKHQpe2RlbGV0ZSBYZVt0XX0odCksdHI9ITF9fX19dmFyIGlyLG9yLHNyLGFyLHVyPU9iamVjdC5nZXRQcm90b3R5cGVPZiYmT2JqZWN0LmdldFByb3RvdHlwZU9mKGEpO2Z1bmN0aW9uIGhyKHQpe2xldCBlLHI9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpO2lmKGU9IltvYmplY3QgUHJvbWlzZV0iPT09cixlKXJldHVybiEwO2lmKCJbb2JqZWN0IEZ1bmN0aW9uXSIhPT1yKXJldHVybiExO3RyeXtlPSJmdW5jdGlvbiIhPXR5cGVvZiB0LnN1YnNjcmliZSYmImZ1bmN0aW9uIj09dHlwZW9mIHQudGhlbn1jYXRjaCh0KXt9cmV0dXJuIGV9ZnVuY3Rpb24gZnIodCl7bGV0IGUscixuO2Z1bmN0aW9uIGkoaSl7KCh0PWkpaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcnx8QXJyYXlCdWZmZXIuaXNWaWV3KHQpJiYhXy5pc0J1ZmZlcih0KSkmJih0PV8uZnJvbSh0KSksZT1ocih0KT90Om51bGw7Y29uc3Qgbz0hZSYmdFtTeW1ib2wuaXRlcmF0b3JdJiYic3RyaW5nIiE9dHlwZW9mIHQmJiFfLmlzQnVmZmVyKHQpO3I9bz90W1N5bWJvbC5pdGVyYXRvcl0oKTpudWxsO2NvbnN0IHM9IWUmJnRbU3ltYm9sLmFzeW5jSXRlcmF0b3JdO249cz90W1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpOm51bGx9cmV0dXJuIEFycmF5LmlzQXJyYXkodCkmJih0PXQuc2xpY2UoKSksaSh0KSxKZSgoZnVuY3Rpb24gbyhzLGEpe2lmKGUpcmV0dXJuIHZvaWQoYXN5bmMoKT0+e3RyeXthd2FpdCBpKGF3YWl0IGUpLG8uY2FsbCh0aGlzLHMsYSl9Y2F0Y2godCl7YSh0KX19KSgpO2lmKHIpe2NvbnN0IHQ9ci5uZXh0KCk7cmV0dXJuIHZvaWQgcnIoYSxudWxsLHQuZG9uZT9udWxsOnQudmFsdWUpfWlmKG4pcmV0dXJuIHZvaWQoYXN5bmMoKT0+e3RyeXtjb25zdCB0PWF3YWl0IG4ubmV4dCgpO3JyKGEsbnVsbCx0LmRvbmU/bnVsbDp0LnZhbHVlKX1jYXRjaCh0KXtycihhLHQpfX0pKCk7aWYoMD09PXQubGVuZ3RoKXJldHVybiB2b2lkIHJyKGEsbnVsbCxudWxsKTtjb25zdCB1PXQuc2xpY2UoMCxzKTt0PXQuc2xpY2UocykscnIoYSxudWxsLHUpfSkpfXVyPXVyJiZ1ci5zZXRUaW1lb3V0P3VyOmEsIltvYmplY3QgcHJvY2Vzc10iPT09e30udG9TdHJpbmcuY2FsbChhLnByb2Nlc3MpP1plPWZ1bmN0aW9uKHQpe0x0Lm5leHRUaWNrKChmdW5jdGlvbigpe25yKHQpfSkpfTohZnVuY3Rpb24oKXtpZihhLnBvc3RNZXNzYWdlJiYhYS5pbXBvcnRTY3JpcHRzKXt2YXIgdD0hMCxlPWEub25tZXNzYWdlO3JldHVybiBhLm9ubWVzc2FnZT1mdW5jdGlvbigpe3Q9ITF9LGEucG9zdE1lc3NhZ2UoIiIsIioiKSxhLm9ubWVzc2FnZT1lLHR9fSgpP2EuTWVzc2FnZUNoYW5uZWw/KChvcj1uZXcgTWVzc2FnZUNoYW5uZWwpLnBvcnQxLm9ubWVzc2FnZT1mdW5jdGlvbih0KXtucih0LmRhdGEpfSxaZT1mdW5jdGlvbih0KXtvci5wb3J0Mi5wb3N0TWVzc2FnZSh0KX0pOmVyJiYib25yZWFkeXN0YXRlY2hhbmdlImluIGVyLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpPyhpcj1lci5kb2N1bWVudEVsZW1lbnQsWmU9ZnVuY3Rpb24odCl7dmFyIGU9ZXIuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZS5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXtucih0KSxlLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLGlyLnJlbW92ZUNoaWxkKGUpLGU9bnVsbH0saXIuYXBwZW5kQ2hpbGQoZSl9KTpaZT1mdW5jdGlvbih0KXtzZXRUaW1lb3V0KG5yLDAsdCl9Oihzcj0ic2V0SW1tZWRpYXRlJCIrTWF0aC5yYW5kb20oKSsiJCIsYXI9ZnVuY3Rpb24odCl7dC5zb3VyY2U9PT1hJiYic3RyaW5nIj09dHlwZW9mIHQuZGF0YSYmMD09PXQuZGF0YS5pbmRleE9mKHNyKSYmbnIoK3QuZGF0YS5zbGljZShzci5sZW5ndGgpKX0sYS5hZGRFdmVudExpc3RlbmVyP2EuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsYXIsITEpOmEuYXR0YWNoRXZlbnQoIm9ubWVzc2FnZSIsYXIpLFplPWZ1bmN0aW9uKHQpe2EucG9zdE1lc3NhZ2Uoc3IrdCwiKiIpfSksZnIub2JqZWN0PXQ9PntsZXQgZSxyLG47ZnVuY3Rpb24gaShpKXtlPWhyKHQ9aSk/dDpudWxsLHI9IWUmJnRbU3ltYm9sLml0ZXJhdG9yXT90W1N5bWJvbC5pdGVyYXRvcl0oKTpudWxsLG49IWUmJnRbU3ltYm9sLmFzeW5jSXRlcmF0b3JdP3RbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk6bnVsbH1yZXR1cm4gQXJyYXkuaXNBcnJheSh0KSYmKHQ9dC5zbGljZSgpKSxpKHQpLEplLm9iaigoZnVuY3Rpb24gbyhzLGEpe2lmKGUpKGFzeW5jKCk9Pnt0cnl7YXdhaXQgaShhd2FpdCBlKSxvLmNhbGwodGhpcyxzLGEpfWNhdGNoKHQpe2EodCl9fSkoKTtlbHNlIGlmKHIpe2NvbnN0IHQ9ci5uZXh0KCk7cnIoYSxudWxsLHQuZG9uZT9udWxsOnQudmFsdWUpfWVsc2Ugbj8oYXN5bmMoKT0+e3RyeXtjb25zdCB0PWF3YWl0IG4ubmV4dCgpO3JyKGEsbnVsbCx0LmRvbmU/bnVsbDp0LnZhbHVlKX1jYXRjaCh0KXtycihhLHQpfX0pKCk6KHRoaXMucHVzaCh0KSxycihhLG51bGwsbnVsbCkpfSkpfTt2YXIgY3I9e30sbHI9Y3IuTEVGVF9CUkFDRT0xLHByPWNyLlJJR0hUX0JSQUNFPTIsZHI9Y3IuTEVGVF9CUkFDS0VUPTMsZ3I9Y3IuUklHSFRfQlJBQ0tFVD00LHlyPWNyLkNPTE9OPTUsdnI9Y3IuQ09NTUE9Nixicj1jci5UUlVFPTcsbXI9Y3IuRkFMU0U9OCx3cj1jci5OVUxMPTksX3I9Y3IuU1RSSU5HPTEwLFNyPWNyLk5VTUJFUj0xMSxFcj1jci5TVEFSVD0xNyxrcj1jci5TVE9QPTE4LFJyPWNyLlRSVUUxPTMzLEFyPWNyLlRSVUUyPTM0LE9yPWNyLlRSVUUzPTM1LFRyPWNyLkZBTFNFMT00OSxqcj1jci5GQUxTRTI9NTAsTHI9Y3IuRkFMU0UzPTUxLENyPWNyLkZBTFNFND01MixQcj1jci5OVUxMMT02NSxNcj1jci5OVUxMMj02NixCcj1jci5OVUxMMz02Nyx4cj1jci5OVU1CRVIxPTgxLFVyPWNyLk5VTUJFUjM9ODMsSXI9Y3IuU1RSSU5HMT05NyxEcj1jci5TVFJJTkcyPTk4LE5yPWNyLlNUUklORzM9OTksRnI9Y3IuU1RSSU5HND0xMDAsenI9Y3IuU1RSSU5HNT0xMDEscXI9Y3IuU1RSSU5HNj0xMDIsWXI9Y3IuVkFMVUU9MTEzLFdyPWNyLktFWT0xMTQsJHI9Y3IuT0JKRUNUPTEyOSxHcj1jci5BUlJBWT0xMzAsSnI9IlxcIi5jaGFyQ29kZUF0KDApLEhyPSIvIi5jaGFyQ29kZUF0KDApLFZyPSJcYiIuY2hhckNvZGVBdCgwKSxLcj0iXGYiLmNoYXJDb2RlQXQoMCksWnI9IlxuIi5jaGFyQ29kZUF0KDApLFFyPSJcciIuY2hhckNvZGVBdCgwKSxYcj0iXHQiLmNoYXJDb2RlQXQoMCksdG49NjU1MzY7ZnVuY3Rpb24gZW4oKXt0aGlzLnRTdGF0ZT1Fcix0aGlzLnZhbHVlPXZvaWQgMCx0aGlzLnN0cmluZz12b2lkIDAsdGhpcy5zdHJpbmdCdWZmZXI9Xy5hbGxvYz9fLmFsbG9jKHRuKTpuZXcgXyh0biksdGhpcy5zdHJpbmdCdWZmZXJPZmZzZXQ9MCx0aGlzLnVuaWNvZGU9dm9pZCAwLHRoaXMuaGlnaFN1cnJvZ2F0ZT12b2lkIDAsdGhpcy5rZXk9dm9pZCAwLHRoaXMubW9kZT12b2lkIDAsdGhpcy5zdGFjaz1bXSx0aGlzLnN0YXRlPVlyLHRoaXMuYnl0ZXNfcmVtYWluaW5nPTAsdGhpcy5ieXRlc19pbl9zZXF1ZW5jZT0wLHRoaXMudGVtcF9idWZmcz17MjpuZXcgXygyKSwzOm5ldyBfKDMpLDQ6bmV3IF8oNCl9LHRoaXMub2Zmc2V0PS0xfWVuLnRva25hbT1mdW5jdGlvbih0KXtmb3IodmFyIGU9T2JqZWN0LmtleXMoY3IpLHI9MCxuPWUubGVuZ3RoO3I8bjtyKyspe3ZhciBpPWVbcl07aWYoY3JbaV09PT10KXJldHVybiBpfXJldHVybiB0JiYiMHgiK3QudG9TdHJpbmcoMTYpfTt2YXIgcm49ZW4ucHJvdG90eXBlO3JuLm9uRXJyb3I9ZnVuY3Rpb24odCl7dGhyb3cgdH0scm4uY2hhckVycm9yPWZ1bmN0aW9uKHQsZSl7dGhpcy50U3RhdGU9a3IsdGhpcy5vbkVycm9yKG5ldyBFcnJvcigiVW5leHBlY3RlZCAiK0pTT04uc3RyaW5naWZ5KFN0cmluZy5mcm9tQ2hhckNvZGUodFtlXSkpKyIgYXQgcG9zaXRpb24gIitlKyIgaW4gc3RhdGUgIitlbi50b2tuYW0odGhpcy50U3RhdGUpKSl9LHJuLmFwcGVuZFN0cmluZ0NoYXI9ZnVuY3Rpb24odCl7dGhpcy5zdHJpbmdCdWZmZXJPZmZzZXQ+PXRuJiYodGhpcy5zdHJpbmcrPXRoaXMuc3RyaW5nQnVmZmVyLnRvU3RyaW5nKCJ1dGY4IiksdGhpcy5zdHJpbmdCdWZmZXJPZmZzZXQ9MCksdGhpcy5zdHJpbmdCdWZmZXJbdGhpcy5zdHJpbmdCdWZmZXJPZmZzZXQrK109dH0scm4uYXBwZW5kU3RyaW5nQnVmPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj10Lmxlbmd0aDsibnVtYmVyIj09dHlwZW9mIGUmJihuPSJudW1iZXIiPT10eXBlb2Ygcj9yPDA/dC5sZW5ndGgtZStyOnItZTp0Lmxlbmd0aC1lKSxuPDAmJihuPTApLHRoaXMuc3RyaW5nQnVmZmVyT2Zmc2V0K24+dG4mJih0aGlzLnN0cmluZys9dGhpcy5zdHJpbmdCdWZmZXIudG9TdHJpbmcoInV0ZjgiLDAsdGhpcy5zdHJpbmdCdWZmZXJPZmZzZXQpLHRoaXMuc3RyaW5nQnVmZmVyT2Zmc2V0PTApLHQuY29weSh0aGlzLnN0cmluZ0J1ZmZlcix0aGlzLnN0cmluZ0J1ZmZlck9mZnNldCxlLHIpLHRoaXMuc3RyaW5nQnVmZmVyT2Zmc2V0Kz1ufSxybi53cml0ZT1mdW5jdGlvbih0KXt2YXIgZTsic3RyaW5nIj09dHlwZW9mIHQmJih0PW5ldyBfKHQpKTtmb3IodmFyIHI9MCxuPXQubGVuZ3RoO3I8bjtyKyspaWYodGhpcy50U3RhdGU9PT1Fcil7aWYoZT10W3JdLHRoaXMub2Zmc2V0KyssMTIzPT09ZSl0aGlzLm9uVG9rZW4obHIsInsiKTtlbHNlIGlmKDEyNT09PWUpdGhpcy5vblRva2VuKHByLCJ9Iik7ZWxzZSBpZig5MT09PWUpdGhpcy5vblRva2VuKGRyLCJbIik7ZWxzZSBpZig5Mz09PWUpdGhpcy5vblRva2VuKGdyLCJdIik7ZWxzZSBpZig1OD09PWUpdGhpcy5vblRva2VuKHlyLCI6Iik7ZWxzZSBpZig0ND09PWUpdGhpcy5vblRva2VuKHZyLCIsIik7ZWxzZSBpZigxMTY9PT1lKXRoaXMudFN0YXRlPVJyO2Vsc2UgaWYoMTAyPT09ZSl0aGlzLnRTdGF0ZT1UcjtlbHNlIGlmKDExMD09PWUpdGhpcy50U3RhdGU9UHI7ZWxzZSBpZigzND09PWUpdGhpcy5zdHJpbmc9IiIsdGhpcy5zdHJpbmdCdWZmZXJPZmZzZXQ9MCx0aGlzLnRTdGF0ZT1JcjtlbHNlIGlmKDQ1PT09ZSl0aGlzLnN0cmluZz0iLSIsdGhpcy50U3RhdGU9eHI7ZWxzZSBpZihlPj00OCYmZTw2NCl0aGlzLnN0cmluZz1TdHJpbmcuZnJvbUNoYXJDb2RlKGUpLHRoaXMudFN0YXRlPVVyO2Vsc2UgaWYoMzIhPT1lJiY5IT09ZSYmMTAhPT1lJiYxMyE9PWUpcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscil9ZWxzZSBpZih0aGlzLnRTdGF0ZT09PUlyKWlmKGU9dFtyXSx0aGlzLmJ5dGVzX3JlbWFpbmluZz4wKXtmb3IodmFyIGk9MDtpPHRoaXMuYnl0ZXNfcmVtYWluaW5nO2krKyl0aGlzLnRlbXBfYnVmZnNbdGhpcy5ieXRlc19pbl9zZXF1ZW5jZV1bdGhpcy5ieXRlc19pbl9zZXF1ZW5jZS10aGlzLmJ5dGVzX3JlbWFpbmluZytpXT10W2ldO3RoaXMuYXBwZW5kU3RyaW5nQnVmKHRoaXMudGVtcF9idWZmc1t0aGlzLmJ5dGVzX2luX3NlcXVlbmNlXSksdGhpcy5ieXRlc19pbl9zZXF1ZW5jZT10aGlzLmJ5dGVzX3JlbWFpbmluZz0wLHI9citpLTF9ZWxzZSBpZigwPT09dGhpcy5ieXRlc19yZW1haW5pbmcmJmU+PTEyOCl7aWYoZTw9MTkzfHxlPjI0NClyZXR1cm4gdGhpcy5vbkVycm9yKG5ldyBFcnJvcigiSW52YWxpZCBVVEYtOCBjaGFyYWN0ZXIgYXQgcG9zaXRpb24gIityKyIgaW4gc3RhdGUgIitlbi50b2tuYW0odGhpcy50U3RhdGUpKSk7aWYoZT49MTk0JiZlPD0yMjMmJih0aGlzLmJ5dGVzX2luX3NlcXVlbmNlPTIpLGU+PTIyNCYmZTw9MjM5JiYodGhpcy5ieXRlc19pbl9zZXF1ZW5jZT0zKSxlPj0yNDAmJmU8PTI0NCYmKHRoaXMuYnl0ZXNfaW5fc2VxdWVuY2U9NCksdGhpcy5ieXRlc19pbl9zZXF1ZW5jZStyPnQubGVuZ3RoKXtmb3IodmFyIG89MDtvPD10Lmxlbmd0aC0xLXI7bysrKXRoaXMudGVtcF9idWZmc1t0aGlzLmJ5dGVzX2luX3NlcXVlbmNlXVtvXT10W3Irb107dGhpcy5ieXRlc19yZW1haW5pbmc9cit0aGlzLmJ5dGVzX2luX3NlcXVlbmNlLXQubGVuZ3RoLHI9dC5sZW5ndGgtMX1lbHNlIHRoaXMuYXBwZW5kU3RyaW5nQnVmKHQscixyK3RoaXMuYnl0ZXNfaW5fc2VxdWVuY2UpLHI9cit0aGlzLmJ5dGVzX2luX3NlcXVlbmNlLTF9ZWxzZSBpZigzND09PWUpdGhpcy50U3RhdGU9RXIsdGhpcy5zdHJpbmcrPXRoaXMuc3RyaW5nQnVmZmVyLnRvU3RyaW5nKCJ1dGY4IiwwLHRoaXMuc3RyaW5nQnVmZmVyT2Zmc2V0KSx0aGlzLnN0cmluZ0J1ZmZlck9mZnNldD0wLHRoaXMub25Ub2tlbihfcix0aGlzLnN0cmluZyksdGhpcy5vZmZzZXQrPV8uYnl0ZUxlbmd0aCh0aGlzLnN0cmluZywidXRmOCIpKzEsdGhpcy5zdHJpbmc9dm9pZCAwO2Vsc2UgaWYoOTI9PT1lKXRoaXMudFN0YXRlPURyO2Vsc2V7aWYoIShlPj0zMikpcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7dGhpcy5hcHBlbmRTdHJpbmdDaGFyKGUpfWVsc2UgaWYodGhpcy50U3RhdGU9PT1EcilpZigzND09PShlPXRbcl0pKXRoaXMuYXBwZW5kU3RyaW5nQ2hhcihlKSx0aGlzLnRTdGF0ZT1JcjtlbHNlIGlmKDkyPT09ZSl0aGlzLmFwcGVuZFN0cmluZ0NoYXIoSnIpLHRoaXMudFN0YXRlPUlyO2Vsc2UgaWYoNDc9PT1lKXRoaXMuYXBwZW5kU3RyaW5nQ2hhcihIciksdGhpcy50U3RhdGU9SXI7ZWxzZSBpZig5OD09PWUpdGhpcy5hcHBlbmRTdHJpbmdDaGFyKFZyKSx0aGlzLnRTdGF0ZT1JcjtlbHNlIGlmKDEwMj09PWUpdGhpcy5hcHBlbmRTdHJpbmdDaGFyKEtyKSx0aGlzLnRTdGF0ZT1JcjtlbHNlIGlmKDExMD09PWUpdGhpcy5hcHBlbmRTdHJpbmdDaGFyKFpyKSx0aGlzLnRTdGF0ZT1JcjtlbHNlIGlmKDExND09PWUpdGhpcy5hcHBlbmRTdHJpbmdDaGFyKFFyKSx0aGlzLnRTdGF0ZT1JcjtlbHNlIGlmKDExNj09PWUpdGhpcy5hcHBlbmRTdHJpbmdDaGFyKFhyKSx0aGlzLnRTdGF0ZT1JcjtlbHNle2lmKDExNyE9PWUpcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7dGhpcy51bmljb2RlPSIiLHRoaXMudFN0YXRlPU5yfWVsc2UgaWYodGhpcy50U3RhdGU9PT1Ocnx8dGhpcy50U3RhdGU9PT1Gcnx8dGhpcy50U3RhdGU9PT16cnx8dGhpcy50U3RhdGU9PT1xcil7aWYoISgoZT10W3JdKT49NDgmJmU8NjR8fGU+NjQmJmU8PTcwfHxlPjk2JiZlPD0xMDIpKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO2lmKHRoaXMudW5pY29kZSs9U3RyaW5nLmZyb21DaGFyQ29kZShlKSx0aGlzLnRTdGF0ZSsrPT09cXIpe3ZhciBzPXBhcnNlSW50KHRoaXMudW5pY29kZSwxNik7dGhpcy51bmljb2RlPXZvaWQgMCx2b2lkIDAhPT10aGlzLmhpZ2hTdXJyb2dhdGUmJnM+PTU2MzIwJiZzPDU3MzQ0Pyh0aGlzLmFwcGVuZFN0cmluZ0J1ZihuZXcgXyhTdHJpbmcuZnJvbUNoYXJDb2RlKHRoaXMuaGlnaFN1cnJvZ2F0ZSxzKSkpLHRoaXMuaGlnaFN1cnJvZ2F0ZT12b2lkIDApOnZvaWQgMD09PXRoaXMuaGlnaFN1cnJvZ2F0ZSYmcz49NTUyOTYmJnM8NTYzMjA/dGhpcy5oaWdoU3Vycm9nYXRlPXM6KHZvaWQgMCE9PXRoaXMuaGlnaFN1cnJvZ2F0ZSYmKHRoaXMuYXBwZW5kU3RyaW5nQnVmKG5ldyBfKFN0cmluZy5mcm9tQ2hhckNvZGUodGhpcy5oaWdoU3Vycm9nYXRlKSkpLHRoaXMuaGlnaFN1cnJvZ2F0ZT12b2lkIDApLHRoaXMuYXBwZW5kU3RyaW5nQnVmKG5ldyBfKFN0cmluZy5mcm9tQ2hhckNvZGUocykpKSksdGhpcy50U3RhdGU9SXJ9fWVsc2UgaWYodGhpcy50U3RhdGU9PT14cnx8dGhpcy50U3RhdGU9PT1Vcilzd2l0Y2goZT10W3JdKXtjYXNlIDQ4OmNhc2UgNDk6Y2FzZSA1MDpjYXNlIDUxOmNhc2UgNTI6Y2FzZSA1MzpjYXNlIDU0OmNhc2UgNTU6Y2FzZSA1NjpjYXNlIDU3OmNhc2UgNDY6Y2FzZSAxMDE6Y2FzZSA2OTpjYXNlIDQzOmNhc2UgNDU6dGhpcy5zdHJpbmcrPVN0cmluZy5mcm9tQ2hhckNvZGUoZSksdGhpcy50U3RhdGU9VXI7YnJlYWs7ZGVmYXVsdDp0aGlzLnRTdGF0ZT1Fcjt2YXIgYT1OdW1iZXIodGhpcy5zdHJpbmcpO2lmKGlzTmFOKGEpKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMuc3RyaW5nLm1hdGNoKC9bMC05XSsvKT09dGhpcy5zdHJpbmcmJmEudG9TdHJpbmcoKSE9dGhpcy5zdHJpbmc/dGhpcy5vblRva2VuKF9yLHRoaXMuc3RyaW5nKTp0aGlzLm9uVG9rZW4oU3IsYSksdGhpcy5vZmZzZXQrPXRoaXMuc3RyaW5nLmxlbmd0aC0xLHRoaXMuc3RyaW5nPXZvaWQgMCxyLS19ZWxzZSBpZih0aGlzLnRTdGF0ZT09PVJyKXtpZigxMTQhPT10W3JdKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMudFN0YXRlPUFyfWVsc2UgaWYodGhpcy50U3RhdGU9PT1Bcil7aWYoMTE3IT09dFtyXSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLnRTdGF0ZT1Pcn1lbHNlIGlmKHRoaXMudFN0YXRlPT09T3Ipe2lmKDEwMSE9PXRbcl0pcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7dGhpcy50U3RhdGU9RXIsdGhpcy5vblRva2VuKGJyLCEwKSx0aGlzLm9mZnNldCs9M31lbHNlIGlmKHRoaXMudFN0YXRlPT09VHIpe2lmKDk3IT09dFtyXSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLnRTdGF0ZT1qcn1lbHNlIGlmKHRoaXMudFN0YXRlPT09anIpe2lmKDEwOCE9PXRbcl0pcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7dGhpcy50U3RhdGU9THJ9ZWxzZSBpZih0aGlzLnRTdGF0ZT09PUxyKXtpZigxMTUhPT10W3JdKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMudFN0YXRlPUNyfWVsc2UgaWYodGhpcy50U3RhdGU9PT1Dcil7aWYoMTAxIT09dFtyXSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLnRTdGF0ZT1Fcix0aGlzLm9uVG9rZW4obXIsITEpLHRoaXMub2Zmc2V0Kz00fWVsc2UgaWYodGhpcy50U3RhdGU9PT1Qcil7aWYoMTE3IT09dFtyXSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLnRTdGF0ZT1Ncn1lbHNlIGlmKHRoaXMudFN0YXRlPT09TXIpe2lmKDEwOCE9PXRbcl0pcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7dGhpcy50U3RhdGU9QnJ9ZWxzZSBpZih0aGlzLnRTdGF0ZT09PUJyKXtpZigxMDghPT10W3JdKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMudFN0YXRlPUVyLHRoaXMub25Ub2tlbih3cixudWxsKSx0aGlzLm9mZnNldCs9M319LHJuLm9uVG9rZW49ZnVuY3Rpb24odCxlKXt9LHJuLnBhcnNlRXJyb3I9ZnVuY3Rpb24odCxlKXt0aGlzLnRTdGF0ZT1rcix0aGlzLm9uRXJyb3IobmV3IEVycm9yKCJVbmV4cGVjdGVkICIrZW4udG9rbmFtKHQpKyhlPyIoIitKU09OLnN0cmluZ2lmeShlKSsiKSI6IiIpKyIgaW4gc3RhdGUgIitlbi50b2tuYW0odGhpcy5zdGF0ZSkpKX0scm4ucHVzaD1mdW5jdGlvbigpe3RoaXMuc3RhY2sucHVzaCh7dmFsdWU6dGhpcy52YWx1ZSxrZXk6dGhpcy5rZXksbW9kZTp0aGlzLm1vZGV9KX0scm4ucG9wPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy52YWx1ZSxlPXRoaXMuc3RhY2sucG9wKCk7dGhpcy52YWx1ZT1lLnZhbHVlLHRoaXMua2V5PWUua2V5LHRoaXMubW9kZT1lLm1vZGUsdGhpcy5lbWl0KHQpLHRoaXMubW9kZXx8KHRoaXMuc3RhdGU9WXIpfSxybi5lbWl0PWZ1bmN0aW9uKHQpe3RoaXMubW9kZSYmKHRoaXMuc3RhdGU9dnIpLHRoaXMub25WYWx1ZSh0KX0scm4ub25WYWx1ZT1mdW5jdGlvbih0KXt9LHJuLm9uVG9rZW49ZnVuY3Rpb24odCxlKXtpZih0aGlzLnN0YXRlPT09WXIpaWYodD09PV9yfHx0PT09U3J8fHQ9PT1icnx8dD09PW1yfHx0PT09d3IpdGhpcy52YWx1ZSYmKHRoaXMudmFsdWVbdGhpcy5rZXldPWUpLHRoaXMuZW1pdChlKTtlbHNlIGlmKHQ9PT1scil0aGlzLnB1c2goKSx0aGlzLnZhbHVlP3RoaXMudmFsdWU9dGhpcy52YWx1ZVt0aGlzLmtleV09e306dGhpcy52YWx1ZT17fSx0aGlzLmtleT12b2lkIDAsdGhpcy5zdGF0ZT1Xcix0aGlzLm1vZGU9JHI7ZWxzZSBpZih0PT09ZHIpdGhpcy5wdXNoKCksdGhpcy52YWx1ZT90aGlzLnZhbHVlPXRoaXMudmFsdWVbdGhpcy5rZXldPVtdOnRoaXMudmFsdWU9W10sdGhpcy5rZXk9MCx0aGlzLm1vZGU9R3IsdGhpcy5zdGF0ZT1ZcjtlbHNlIGlmKHQ9PT1wcil7aWYodGhpcy5tb2RlIT09JHIpcmV0dXJuIHRoaXMucGFyc2VFcnJvcih0LGUpO3RoaXMucG9wKCl9ZWxzZXtpZih0IT09Z3IpcmV0dXJuIHRoaXMucGFyc2VFcnJvcih0LGUpO2lmKHRoaXMubW9kZSE9PUdyKXJldHVybiB0aGlzLnBhcnNlRXJyb3IodCxlKTt0aGlzLnBvcCgpfWVsc2UgaWYodGhpcy5zdGF0ZT09PVdyKWlmKHQ9PT1fcil0aGlzLmtleT1lLHRoaXMuc3RhdGU9eXI7ZWxzZXtpZih0IT09cHIpcmV0dXJuIHRoaXMucGFyc2VFcnJvcih0LGUpO3RoaXMucG9wKCl9ZWxzZSBpZih0aGlzLnN0YXRlPT09eXIpe2lmKHQhPT15cilyZXR1cm4gdGhpcy5wYXJzZUVycm9yKHQsZSk7dGhpcy5zdGF0ZT1Zcn1lbHNle2lmKHRoaXMuc3RhdGUhPT12cilyZXR1cm4gdGhpcy5wYXJzZUVycm9yKHQsZSk7aWYodD09PXZyKXRoaXMubW9kZT09PUdyPyh0aGlzLmtleSsrLHRoaXMuc3RhdGU9WXIpOnRoaXMubW9kZT09PSRyJiYodGhpcy5zdGF0ZT1Xcik7ZWxzZXtpZighKHQ9PT1nciYmdGhpcy5tb2RlPT09R3J8fHQ9PT1wciYmdGhpcy5tb2RlPT09JHIpKXJldHVybiB0aGlzLnBhcnNlRXJyb3IodCxlKTt0aGlzLnBvcCgpfX19LGVuLkM9Y3I7dmFyIG5uPWVuO2Z1bmN0aW9uIG9uKHQsZSxyKXt0PXR8fGZ1bmN0aW9uKHQpe3RoaXMucXVldWUodCl9LGU9ZXx8ZnVuY3Rpb24oKXt0aGlzLnF1ZXVlKG51bGwpfTtsZXQgbj0hMSxpPSExLG89W10scz0hMSxhPW5ldyBZZTtmdW5jdGlvbiB1KCl7Zm9yKDtvLmxlbmd0aCYmIWEucGF1c2VkOyl7bGV0IHQ9by5zaGlmdCgpO2lmKG51bGw9PT10KXJldHVybiBhLmVtaXQoImVuZCIpO2EuZW1pdCgiZGF0YSIsdCl9fXJldHVybiBhLnJlYWRhYmxlPWEud3JpdGFibGU9ITAsYS5wYXVzZWQ9ITEsYS5hdXRvRGVzdHJveT0hKHImJiExPT09ci5hdXRvRGVzdHJveSksYS53cml0ZT1mdW5jdGlvbihlKXtyZXR1cm4gdC5jYWxsKHRoaXMsZSksIWEucGF1c2VkfSxhLnF1ZXVlPWEucHVzaD1mdW5jdGlvbih0KXtyZXR1cm4gc3x8KG51bGw9PT10JiYocz0hMCksby5wdXNoKHQpLHUoKSksYX0sYS5vbigiZW5kIiwoZnVuY3Rpb24oKXthLnJlYWRhYmxlPSExLCFhLndyaXRhYmxlJiZhLmF1dG9EZXN0cm95JiZMdC5uZXh0VGljaygoZnVuY3Rpb24oKXthLmRlc3Ryb3koKX0pKX0pKSxhLmVuZD1mdW5jdGlvbih0KXtpZighbilyZXR1cm4gbj0hMCxhcmd1bWVudHMubGVuZ3RoJiZhLndyaXRlKHQpLGEud3JpdGFibGU9ITEsZS5jYWxsKGEpLCFhLnJlYWRhYmxlJiZhLmF1dG9EZXN0cm95JiZhLmRlc3Ryb3koKSxhfSxhLmRlc3Ryb3k9ZnVuY3Rpb24oKXtpZighaSlyZXR1cm4gaT0hMCxuPSEwLG8ubGVuZ3RoPTAsYS53cml0YWJsZT1hLnJlYWRhYmxlPSExLGEuZW1pdCgiY2xvc2UiKSxhfSxhLnBhdXNlPWZ1bmN0aW9uKCl7aWYoIWEucGF1c2VkKXJldHVybiBhLnBhdXNlZD0hMCxhfSxhLnJlc3VtZT1mdW5jdGlvbigpe3JldHVybiBhLnBhdXNlZCYmKGEucGF1c2VkPSExLGEuZW1pdCgicmVzdW1lIikpLHUoKSxhLnBhdXNlZHx8YS5lbWl0KCJkcmFpbiIpLGF9LGF9b24udGhyb3VnaD1vbjtsZXQgc249e3BhcnNlOmZ1bmN0aW9uKHQsZSl7bGV0IHIsbjtmdW5jdGlvbiBpKHQsZSl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0P2U9PT10OnQmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LmV4ZWM/dC5leGVjKGUpOiJib29sZWFuIj09dHlwZW9mIHR8fCJvYmplY3QiPT10eXBlb2YgdD90OiJmdW5jdGlvbiI9PXR5cGVvZiB0JiZ0KGUpfWxldCBvPW5ldyBubixzPW9uKChmdW5jdGlvbih0KXsic3RyaW5nIj09dHlwZW9mIHQmJih0PV8uZnJvbSh0KSksby53cml0ZSh0KX0pLChmdW5jdGlvbih0KXt0JiZzLndyaXRlKHQpLHImJnMuZW1pdCgiaGVhZGVyIixyKSxuJiZzLmVtaXQoImZvb3RlciIsbikscy5xdWV1ZShudWxsKX0pKTtmdW5jdGlvbiBhKHQsZSl7ITEhPT1yJiYocj1yfHx7fSxyW3RdPWUpLCExIT09biYmITE9PT1yJiYobj1ufHx7fSxuW3RdPWUpfXJldHVybiJzdHJpbmciPT10eXBlb2YgdCYmKHQ9dC5zcGxpdCgiLiIpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIiQqIj09PXQ/e2VtaXRLZXk6ITB9OiIqIj09PXR8fCgiIj09PXQ/e3JlY3Vyc2U6ITB9OnQpfSkpKSx0JiZ0Lmxlbmd0aHx8KHQ9bnVsbCksby5vblZhbHVlPWZ1bmN0aW9uKG4pe2lmKHRoaXMucm9vdHx8KHMucm9vdD1uKSwhdClyZXR1cm47bGV0IG89MCx1PTAsaD0hMSxmPSExO2Zvcig7bzx0Lmxlbmd0aDspe2xldCBlLHI9dFtvXTtpZih1KyssciYmIXIucmVjdXJzZSl7aWYoZT11PT09dGhpcy5zdGFjay5sZW5ndGg/dGhpczp0aGlzLnN0YWNrW3VdLCFlKXJldHVybjtpZighaShyLGUua2V5KSlyZXR1cm4gdm9pZCBhKGUua2V5LG4pO2g9ISFyLmVtaXRLZXksZj0hIXIuZW1pdFBhdGgsbysrfWVsc2V7bysrO2xldCByPXRbb107aWYoIXIpcmV0dXJuO2Zvcig7Oyl7aWYoZT11PT09dGhpcy5zdGFjay5sZW5ndGg/dGhpczp0aGlzLnN0YWNrW3VdLCFlKXJldHVybjtpZihpKHIsZS5rZXkpKXtvKyssT2JqZWN0LmlzRnJvemVuKHRoaXMuc3RhY2tbdV0pfHwodGhpcy5zdGFja1t1XS52YWx1ZT1udWxsKTticmVha31hKGUua2V5LG4pLHUrK319fWlmKHImJihzLmVtaXQoImhlYWRlciIscikscj0hMSksdSE9PXRoaXMuc3RhY2subGVuZ3RoKXJldHVybjtsZXQgYz10aGlzLnN0YWNrLnNsaWNlKDEpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQua2V5fSkpLmNvbmNhdChbdGhpcy5rZXldKSxsPW47bnVsbCE9bCYmbnVsbCE9KGw9ZT9lKGwsYyk6bCkmJigoaHx8ZikmJihsPXt2YWx1ZTpsfSxoJiYobC5rZXk9dGhpcy5rZXkpLGYmJihsLnBhdGg9YykpLHMucXVldWUobCkpLHRoaXMudmFsdWUmJmRlbGV0ZSB0aGlzLnZhbHVlW3RoaXMua2V5XTtmb3IobGV0IHQgaW4gdGhpcy5zdGFjaylPYmplY3QuaXNGcm96ZW4odGhpcy5zdGFja1t0XSl8fCh0aGlzLnN0YWNrW3RdLnZhbHVlPW51bGwpfSxvLl9vblRva2VuPW8ub25Ub2tlbixvLm9uVG9rZW49ZnVuY3Rpb24oZSxyKXtvLl9vblRva2VuKGUsciksMD09PXRoaXMuc3RhY2subGVuZ3RoJiZzLnJvb3QmJih0fHxzLnF1ZXVlKHMucm9vdCkscy5yb290PW51bGwpfSxvLm9uRXJyb3I9ZnVuY3Rpb24odCl7dC5tZXNzYWdlLmluZGV4T2YoImF0IHBvc2l0aW9uIik+LTEmJih0Lm1lc3NhZ2U9IkludmFsaWQgSlNPTiAoIit0Lm1lc3NhZ2UrIikiKSxzLmVtaXQoImVycm9yIix0KX0sc319LGFuPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGFuPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbih0LGUpe3QuX19wcm90b19fPWV9fHxmdW5jdGlvbih0LGUpe2ZvcihsZXQgciBpbiBlKWUuaGFzT3duUHJvcGVydHkocikmJih0W3JdPWVbcl0pfSxhbih0LGUpfTtsZXQgdW4saG49L1tcXCJcdTAwMDAtXHUwMDFmXHUwMDdmLVx1MDA5Zlx1MDBhZFx1MDYwMC1cdTA2MDRcdTA3MGZcdTE3YjRcdTE3YjVcdTIwMGMtXHUyMDBmXHUyMDI4LVx1MjAyZlx1MjA2MC1cdTIwNmZcdWZlZmZcdWZmZjAtXHVmZmZmXS9nLGZuPXsiXGIiOiJcXGIiLCJcdCI6IlxcdCIsIlxuIjoiXFxuIiwiXGYiOiJcXGYiLCJcciI6IlxcciIsJyInOidcXCInLCJcXCI6IlxcXFwifTtmdW5jdGlvbiBjbih0KXtyZXR1cm4gdD8iZnVuY3Rpb24iPT10eXBlb2YgdC50aGVuP3VuLlByb21pc2U6ZnVuY3Rpb24odCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQucmVhZCYmImZ1bmN0aW9uIj09dHlwZW9mIHQucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHQucGlwZSYmImZ1bmN0aW9uIj09dHlwZW9mIHQub25jZSYmImZ1bmN0aW9uIj09dHlwZW9mIHQucmVtb3ZlTGlzdGVuZXJ9KHQpP3QuX3JlYWRhYmxlU3RhdGUub2JqZWN0TW9kZT91bi5SZWFkYWJsZU9iamVjdDp1bi5SZWFkYWJsZVN0cmluZzpBcnJheS5pc0FycmF5KHQpP3VuLkFycmF5OiJvYmplY3QiPT10eXBlb2YgdHx8dCBpbnN0YW5jZW9mIE9iamVjdD91bi5PYmplY3Q6dW4uUHJpbWl0aXZlOnVuLlByaW1pdGl2ZX0hZnVuY3Rpb24odCl7dFt0LkFycmF5PTBdPSJBcnJheSIsdFt0Lk9iamVjdD0xXT0iT2JqZWN0Iix0W3QuUmVhZGFibGVTdHJpbmc9Ml09IlJlYWRhYmxlU3RyaW5nIix0W3QuUmVhZGFibGVPYmplY3Q9M109IlJlYWRhYmxlT2JqZWN0Iix0W3QuUHJpbWl0aXZlPTRdPSJQcmltaXRpdmUiLHRbdC5Qcm9taXNlPTVdPSJQcm9taXNlIn0odW58fCh1bj17fSkpO2xldCBsbj1bXTtsblt1bi5BcnJheV09IlsiLGxuW3VuLk9iamVjdF09InsiLGxuW3VuLlJlYWRhYmxlU3RyaW5nXT0nIicsbG5bdW4uUmVhZGFibGVPYmplY3RdPSJbIjtsZXQgcG49W107cG5bdW4uQXJyYXldPSJdIixwblt1bi5PYmplY3RdPSJ9Iixwblt1bi5SZWFkYWJsZVN0cmluZ109JyInLHBuW3VuLlJlYWRhYmxlT2JqZWN0XT0iXSI7bGV0IGRuPVtdO2ZvcihsZXQgdD0wLGU9T2JqZWN0LmVudHJpZXModW4pO3Q8ZS5sZW5ndGg7dCsrKXtsZXQgcj1lW3RdLG49clswXSxpPXJbMV07Im51bWJlciI9PXR5cGVvZiBpJiYoZG5baV09InByb2Nlc3MiK24pfWZ1bmN0aW9uIGduKHQpe3JldHVybiB0LnJlcGxhY2UoaG4sKGZ1bmN0aW9uKHQpe2xldCBlPWZuW3RdO3JldHVybiJzdHJpbmciPT10eXBlb2YgZT9lOiJcXHUiK3QuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikucGFkU3RhcnQoNCwiMCIpfSkpfWZ1bmN0aW9uIHluKHQpe3JldHVybiciJytnbih0KSsnIid9ZnVuY3Rpb24gdm4odCxlKXtsZXQgcj10LnJlYWQoZSk7cmV0dXJuIG51bGw9PT1yP25ldyBQcm9taXNlKChmdW5jdGlvbihlLHIpe2xldCBuPWZ1bmN0aW9uKCl7cmV0dXJuIGUobnVsbCl9O3Qub25jZSgiZW5kIixuKSx0Lm9uY2UoImVycm9yIixyKSx0Lm9uY2UoInJlYWRhYmxlIiwoZnVuY3Rpb24oKXt0LnJlbW92ZUxpc3RlbmVyKCJlbmQiLG4pLHQucmVtb3ZlTGlzdGVuZXIoImVycm9yIixyKSxlKHQucmVhZCgpKX0pKX0pKTpQcm9taXNlLnJlc29sdmUocil9ZnVuY3Rpb24gYm4odCl7cmV0dXJuIHQudGhlbigoZnVuY3Rpb24odCl7cmV0dXJuIGNuKHQpPT09dW4uUHJvbWlzZT9ibih0KTp0fSkpfWxldCBtbj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUscixuLGkpe3ZvaWQgMD09PWkmJihpPSExKTtsZXQgbz10LmNhbGwodGhpcyl8fHRoaXM7by5jeWNsZT1pLG8uc3RhY2s9W10sby5kZXB0aD0wLG8ucHVzaENhbGxlZD0hMSxvLmVuZD0hMSxvLmlzUmVhZGluZz0hMSxvLnJlYWRNb3JlPSExO2xldCBzPXR5cGVvZiBuO3JldHVybiJzdHJpbmciIT09cyYmIm51bWJlciIhPT1zfHwoby5nYXA9TnVtYmVyLmlzRmluaXRlKG4pPyIgIi5yZXBlYXQobik6biksT2JqZWN0LmFzc2lnbihvLHt2aXNpdGVkOmk/bmV3IFdlYWtNYXA6bmV3IFdlYWtTZXQscmVwbGFjZXJGdW5jdGlvbjpyIGluc3RhbmNlb2YgRnVuY3Rpb24mJnIscmVwbGFjZXJBcnJheTpBcnJheS5pc0FycmF5KHIpJiZyfSksciBpbnN0YW5jZW9mIEZ1bmN0aW9uJiYoby5yZXBsYWNlckZ1bmN0aW9uPXIpLEFycmF5LmlzQXJyYXkocikmJihvLnJlcGxhY2VyQXJyYXk9ciksby5hZGRUb1N0YWNrKGUpLG99cmV0dXJuIGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gcigpe3RoaXMuY29uc3RydWN0b3I9dH1hbih0LGUpLHQucHJvdG90eXBlPW51bGw9PT1lP09iamVjdC5jcmVhdGUoZSk6KHIucHJvdG90eXBlPWUucHJvdG90eXBlLG5ldyByKX0oZSx0KSxlLnByb3RvdHlwZS5jeWNsZXI9ZnVuY3Rpb24odCxlKXtsZXQgcj10aGlzLnZpc2l0ZWQuZ2V0KGUpO2lmKHIpcmV0dXJueyRyZWY6cn07bGV0IG49dGhpcy5wYXRoKCk7cmV0dXJuIHZvaWQgMCE9PXQmJm4ucHVzaCh0KSxuPW4ubWFwKChmdW5jdGlvbih0KXtyZXR1cm4iWyIrKE51bWJlci5pc0ludGVnZXIodCk/dDp5bih0KSkrIl0ifSkpLHRoaXMudmlzaXRlZC5zZXQoZSxuLmxlbmd0aD8iJCIrbi5qb2luKCIiKToiJCIpLGV9LGUucHJvdG90eXBlLmFkZFRvU3RhY2s9ZnVuY3Rpb24odCxlLHIsbil7bGV0IGksbyxzPXRoaXMsYT10O3RoaXMucmVwbGFjZXJGdW5jdGlvbiYmKGE9dGhpcy5yZXBsYWNlckZ1bmN0aW9uKGV8fHIsYSx0aGlzKSksYSYmYS50b0pTT04gaW5zdGFuY2VvZiBGdW5jdGlvbiYmKGE9YS50b0pTT04oKSksKGEgaW5zdGFuY2VvZiBGdW5jdGlvbnx8InN5bWJvbCI9PXR5cGVvZiB0KSYmKGE9dm9pZCAwKSx2b2lkIDAhPT1lJiZ0aGlzLnJlcGxhY2VyQXJyYXkmJih0aGlzLnJlcGxhY2VyQXJyYXkuaW5jbHVkZXMoZSl8fChhPXZvaWQgMCkpO2xldCB1PWNuKGEpO2lmKChuJiZuLnR5cGU9PT11bi5BcnJheXx8dm9pZCAwIT09YSkmJnUhPT11bi5Qcm9taXNlJiYobiYmIW4uZmlyc3QmJnRoaXMuX3B1c2goIiwiKSxuJiYobi5maXJzdD0hMSkpLHZvaWQgMCE9PWEmJnUhPT11bi5Qcm9taXNlJiZlJiYodGhpcy5nYXA/dGhpcy5fcHVzaCgiXG4iK3RoaXMuZ2FwLnJlcGVhdCh0aGlzLmRlcHRoKSsnIicrZ24oZSkrJyI6ICcpOnRoaXMuX3B1c2goJyInK2duKGUpKyciOicpKSx1IT09dW4uUHJpbWl0aXZlKWlmKHRoaXMuY3ljbGUpYT10aGlzLmN5Y2xlcihlfHxyLGEpLHU9Y24oYSk7ZWxzZXtpZih0aGlzLnZpc2l0ZWQuaGFzKGEpKXRocm93IE9iamVjdC5hc3NpZ24obmV3IEVycm9yKCJDb252ZXJ0aW5nIGNpcmN1bGFyIHN0cnVjdHVyZSB0byBKU09OIikse3JlYWxWYWx1ZTphLGtleTplfHxyfSk7dGhpcy52aXNpdGVkLmFkZChhKX0hZSYmcj4tMSYmdGhpcy5kZXB0aCYmdGhpcy5nYXAmJnRoaXMuX3B1c2goIlxuIit0aGlzLmdhcC5yZXBlYXQodGhpcy5kZXB0aCkpO2xldCBoPWxuW3VdO2gmJnRoaXMuX3B1c2goaCk7bGV0IGY9e2tleTplLGluZGV4OnIsdHlwZTp1LHBhcmVudDpuLHZhbHVlOmEsZmlyc3Q6ITB9O3JldHVybiB1PT09dW4uT2JqZWN0Pyh0aGlzLmRlcHRoKz0xLGYudW5yZWFkPU9iamVjdC5rZXlzKGEpLGYuaXNFbXB0eT0hZi51bnJlYWQubGVuZ3RoKTp1PT09dW4uQXJyYXk/KHRoaXMuZGVwdGgrPTEsZi51bnJlYWQ9YS5sZW5ndGgsZi5hcnJheUxlbmd0aD1mLnVucmVhZCxmLmlzRW1wdHk9IWYudW5yZWFkKTp1IT09dW4uUmVhZGFibGVTdHJpbmcmJnUhPT11bi5SZWFkYWJsZU9iamVjdHx8KHRoaXMuZGVwdGgrPTEsYS5yZWFkYWJsZUVuZGVkfHwobnVsbD09PShpPWEuX3JlYWRhYmxlU3RhdGUpfHx2b2lkIDA9PT1pP3ZvaWQgMDppLmVuZEVtaXR0ZWQpP3RoaXMuZW1pdCgiZXJyb3IiLG5ldyBFcnJvcigiUmVhZGFibGUgU3RyZWFtIGhhcyBlbmRlZCBiZWZvcmUgaXQgd2FzIHNlcmlhbGl6ZWQuIEFsbCBzdHJlYW0gZGF0YSBoYXZlIGJlZW4gbG9zdCIpLGEsZXx8cik6KGEucmVhZGFibGVGbG93aW5nfHwobnVsbD09PShvPWEuX3JlYWRhYmxlU3RhdGUpfHx2b2lkIDA9PT1vP3ZvaWQgMDpvLmZsb3dpbmcpKSYmKGEucGF1c2UoKSx0aGlzLmVtaXQoImVycm9yIixuZXcgRXJyb3IoIlJlYWRhYmxlIFN0cmVhbSBpcyBpbiBmbG93aW5nIG1vZGUsIGRhdGEgbWF5IGhhdmUgYmVlbiBsb3N0LiBUcnlpbmcgdG8gcGF1c2Ugc3RyZWFtLiIpLGEsZXx8cikpLGYucmVhZENvdW50PTAsYS5vbmNlKCJlbmQiLChmdW5jdGlvbigpe2YuZW5kPSEwLHMuX19yZWFkKCl9KSksYS5vbmNlKCJlcnJvciIsKGZ1bmN0aW9uKHQpe3MuZXJyb3I9ITAscy5lbWl0KCJlcnJvciIsdCl9KSkpLHRoaXMuc3RhY2sudW5zaGlmdChmKSxmfSxlLnByb3RvdHlwZS5yZW1vdmVGcm9tU3RhY2s9ZnVuY3Rpb24odCl7bGV0IGU9dC50eXBlLHI9ZT09PXVuLk9iamVjdHx8ZT09PXVuLkFycmF5fHxlPT09dW4uUmVhZGFibGVTdHJpbmd8fGU9PT11bi5SZWFkYWJsZU9iamVjdDtlIT09dW4uUHJpbWl0aXZlJiYodGhpcy5jeWNsZXx8dGhpcy52aXNpdGVkLmRlbGV0ZSh0LnZhbHVlKSxyJiYodGhpcy5kZXB0aC09MSkpO2xldCBuPXBuW2VdO3ImJiF0LmlzRW1wdHkmJnRoaXMuZ2FwJiZ0aGlzLl9wdXNoKCJcbiIrdGhpcy5nYXAucmVwZWF0KHRoaXMuZGVwdGgpKSxuJiZ0aGlzLl9wdXNoKG4pO2xldCBpPXRoaXMuc3RhY2suaW5kZXhPZih0KTt0aGlzLnN0YWNrLnNwbGljZShpLDEpfSxlLnByb3RvdHlwZS5fcHVzaD1mdW5jdGlvbih0KXt0aGlzLnB1c2hDYWxsZWQ9ITAsdGhpcy5wdXNoKHQpfSxlLnByb3RvdHlwZS5wcm9jZXNzUmVhZGFibGVPYmplY3Q9ZnVuY3Rpb24odCxlKXtsZXQgcj10aGlzO2lmKCF0LmVuZClyZXR1cm4gdm4odC52YWx1ZSxlKS50aGVuKChmdW5jdGlvbihlKXtudWxsIT09ZSYmKHQuZmlyc3R8fHIuX3B1c2goIiwiKSx0LmZpcnN0PSExLHIuYWRkVG9TdGFjayhlLHZvaWQgMCx0LnJlYWRDb3VudCksdC5yZWFkQ291bnQrPTEpfSkpO3RoaXMucmVtb3ZlRnJvbVN0YWNrKHQpfSxlLnByb3RvdHlwZS5wcm9jZXNzT2JqZWN0PWZ1bmN0aW9uKHQpe2lmKCF0LnVucmVhZC5sZW5ndGgpcmV0dXJuIHZvaWQgdGhpcy5yZW1vdmVGcm9tU3RhY2sodCk7bGV0IGU9dC51bnJlYWQuc2hpZnQoKSxyPXQudmFsdWVbZV07dGhpcy5hZGRUb1N0YWNrKHIsZSx2b2lkIDAsdCl9LGUucHJvdG90eXBlLnByb2Nlc3NBcnJheT1mdW5jdGlvbih0KXtsZXQgZT10LnVucmVhZDtpZighZSlyZXR1cm4gdm9pZCB0aGlzLnJlbW92ZUZyb21TdGFjayh0KTtsZXQgcj10LmFycmF5TGVuZ3RoLWUsbj10LnZhbHVlW3JdO3QudW5yZWFkLT0xLHRoaXMuYWRkVG9TdGFjayhuLHZvaWQgMCxyLHQpfSxlLnByb3RvdHlwZS5wcm9jZXNzUHJpbWl0aXZlPWZ1bmN0aW9uKHQpe2lmKHZvaWQgMCE9PXQudmFsdWUpe2xldCBlLHI9dHlwZW9mIHQudmFsdWU7c3dpdGNoKHIpe2Nhc2Uic3RyaW5nIjplPXluKHQudmFsdWUpO2JyZWFrO2Nhc2UibnVtYmVyIjplPU51bWJlci5pc0Zpbml0ZSh0LnZhbHVlKT9TdHJpbmcodC52YWx1ZSk6Im51bGwiO2JyZWFrO2Nhc2UiYm9vbGVhbiI6ZT1TdHJpbmcodC52YWx1ZSk7YnJlYWs7Y2FzZSJvYmplY3QiOnQudmFsdWV8fChlPSJudWxsIik7YnJlYWs7ZGVmYXVsdDp0aHJvdyBPYmplY3QuYXNzaWduKG5ldyBFcnJvcignVW5rbm93biB0eXBlICInK3IrJyIuIFBsZWFzZSBmaWxlIGFuIGlzc3VlIScpLHt2YWx1ZTp0LnZhbHVlfSl9dGhpcy5fcHVzaChlKX1lbHNlIXRoaXMuc3RhY2tbMV18fHRoaXMuc3RhY2tbMV0udHlwZSE9PXVuLkFycmF5JiZ0aGlzLnN0YWNrWzFdLnR5cGUhPT11bi5SZWFkYWJsZU9iamVjdD90LmFkZFNlcGFyYXRvckFmdGVyRW5kPSExOnRoaXMuX3B1c2goIm51bGwiKTt0aGlzLnJlbW92ZUZyb21TdGFjayh0KX0sZS5wcm90b3R5cGUucHJvY2Vzc1JlYWRhYmxlU3RyaW5nPWZ1bmN0aW9uKHQsZSl7bGV0IHI9dGhpcztpZighdC5lbmQpcmV0dXJuIHZuKHQudmFsdWUsZSkudGhlbigoZnVuY3Rpb24odCl7dCYmci5fcHVzaChnbih0LnRvU3RyaW5nKCkpKX0pKTt0aGlzLnJlbW92ZUZyb21TdGFjayh0KX0sZS5wcm90b3R5cGUucHJvY2Vzc1Byb21pc2U9ZnVuY3Rpb24odCl7bGV0IGU9dGhpcztyZXR1cm4gYm4odC52YWx1ZSkudGhlbigoZnVuY3Rpb24ocil7ZS5yZW1vdmVGcm9tU3RhY2sodCksZS5hZGRUb1N0YWNrKHIsdC5rZXksdC5pbmRleCx0LnBhcmVudCl9KSl9LGUucHJvdG90eXBlLnByb2Nlc3NTdGFja1RvcEl0ZW09ZnVuY3Rpb24odCl7bGV0IGUscj10aGlzLG49dGhpcy5zdGFja1swXTtpZighbnx8dGhpcy5lcnJvcilyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7dHJ5e2U9dGhpc1tkbltuLnR5cGVdXShuLHQpfWNhdGNoKHQpe3JldHVybiBQcm9taXNlLnJlamVjdCh0KX1yZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGUpLnRoZW4oKGZ1bmN0aW9uKCl7MD09PXIuc3RhY2subGVuZ3RoJiYoci5lbmQ9ITAsci5fcHVzaChudWxsKSl9KSl9LGUucHJvdG90eXBlLl9fcmVhZD1mdW5jdGlvbih0KXtsZXQgZT10aGlzO2lmKCF0aGlzLmlzUmVhZGluZyYmIXRoaXMuZXJyb3IpcmV0dXJuIHRoaXMuaXNSZWFkaW5nPSEwLHRoaXMucmVhZE1vcmU9ITEsdGhpcy5wcm9jZXNzU3RhY2tUb3BJdGVtKHQpLnRoZW4oKGZ1bmN0aW9uKCl7IWUuZW5kJiYhZS5lcnJvciYmKGUucmVhZE1vcmV8fCFlLnB1c2hDYWxsZWQpP3JyKChmdW5jdGlvbigpe2UuaXNSZWFkaW5nPSExLGUuX19yZWFkKCl9KSk6ZS5pc1JlYWRpbmc9ITF9KSkuY2F0Y2goKGZ1bmN0aW9uKHQpe2UuZXJyb3I9ITAsZS5lbWl0KCJlcnJvciIsdCl9KSk7dGhpcy5yZWFkTW9yZT0hMH0sZS5wcm90b3R5cGUuX3JlYWQ9ZnVuY3Rpb24odCl7dGhpcy5wdXNoQ2FsbGVkPSExLHRoaXMuX19yZWFkKHQpfSxlLnByb3RvdHlwZS5wYXRoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhY2subWFwKChmdW5jdGlvbih0KXtsZXQgZT10LmtleSxyPXQuaW5kZXg7cmV0dXJuIGV8fHJ9KSkuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gdHx8dD4tMX0pKS5yZXZlcnNlKCl9LGV9KHVlKTt2YXIgd249QXJyYXkuaXNBcnJheSxfbj0ib2JqZWN0Ij09dHlwZW9mIGEmJmEmJmEuT2JqZWN0PT09T2JqZWN0JiZhLFNuPSJvYmplY3QiPT10eXBlb2Ygc2VsZiYmc2VsZiYmc2VsZi5PYmplY3Q9PT1PYmplY3QmJnNlbGYsRW49X258fFNufHxGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpLGtuPUVuLlN5bWJvbCxSbj1PYmplY3QucHJvdG90eXBlLEFuPVJuLmhhc093blByb3BlcnR5LE9uPVJuLnRvU3RyaW5nLFRuPWtuP2tuLnRvU3RyaW5nVGFnOnZvaWQgMDt2YXIgam49T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZzt2YXIgTG49IltvYmplY3QgTnVsbF0iLENuPSJbb2JqZWN0IFVuZGVmaW5lZF0iLFBuPWtuP2tuLnRvU3RyaW5nVGFnOnZvaWQgMDtmdW5jdGlvbiBNbih0KXtyZXR1cm4gbnVsbD09dD92b2lkIDA9PT10P0NuOkxuOlBuJiZQbiBpbiBPYmplY3QodCk/ZnVuY3Rpb24odCl7dmFyIGU9QW4uY2FsbCh0LFRuKSxyPXRbVG5dO3RyeXt0W1RuXT12b2lkIDA7dmFyIG49ITB9Y2F0Y2godCl7fXZhciBpPU9uLmNhbGwodCk7cmV0dXJuIG4mJihlP3RbVG5dPXI6ZGVsZXRlIHRbVG5dKSxpfSh0KTpmdW5jdGlvbih0KXtyZXR1cm4gam4uY2FsbCh0KX0odCl9ZnVuY3Rpb24gQm4odCl7cmV0dXJuIG51bGwhPXQmJiJvYmplY3QiPT10eXBlb2YgdH12YXIgeG49IltvYmplY3QgU3ltYm9sXSI7ZnVuY3Rpb24gVW4odCl7cmV0dXJuInN5bWJvbCI9PXR5cGVvZiB0fHxCbih0KSYmTW4odCk9PXhufXZhciBJbj0vXC58XFsoPzpbXltcXV0qfChbIiddKSg/Oig/IVwxKVteXFxdfFxcLikqP1wxKVxdLyxEbj0vXlx3KiQvO2Z1bmN0aW9uIE5uKHQpe3ZhciBlPXR5cGVvZiB0O3JldHVybiBudWxsIT10JiYoIm9iamVjdCI9PWV8fCJmdW5jdGlvbiI9PWUpfXZhciBGbj0iW29iamVjdCBBc3luY0Z1bmN0aW9uXSIsem49IltvYmplY3QgRnVuY3Rpb25dIixxbj0iW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0iLFluPSJbb2JqZWN0IFByb3h5XSI7dmFyIFduLCRuPUVuWyJfX2NvcmUtanNfc2hhcmVkX18iXSxHbj0oV249L1teLl0rJC8uZXhlYygkbiYmJG4ua2V5cyYmJG4ua2V5cy5JRV9QUk9UT3x8IiIpKT8iU3ltYm9sKHNyYylfMS4iK1duOiIiO3ZhciBKbj1GdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmc7dmFyIEhuPS9eXFtvYmplY3QgLis/Q29uc3RydWN0b3JcXSQvLFZuPUZ1bmN0aW9uLnByb3RvdHlwZSxLbj1PYmplY3QucHJvdG90eXBlLFpuPVZuLnRvU3RyaW5nLFFuPUtuLmhhc093blByb3BlcnR5LFhuPVJlZ0V4cCgiXiIrWm4uY2FsbChRbikucmVwbGFjZSgvW1xcXiQuKis/KClbXF17fXxdL2csIlxcJCYiKS5yZXBsYWNlKC9oYXNPd25Qcm9wZXJ0eXwoZnVuY3Rpb24pLio/KD89XFxcKCl8IGZvciAuKz8oPz1cXFxdKS9nLCIkMS4qPyIpKyIkIik7ZnVuY3Rpb24gdGkodCl7aWYoIU5uKHQpfHwoZT10LEduJiZHbiBpbiBlKSlyZXR1cm4hMTt2YXIgZSxyPWZ1bmN0aW9uKHQpe2lmKCFObih0KSlyZXR1cm4hMTt2YXIgZT1Nbih0KTtyZXR1cm4gZT09em58fGU9PXFufHxlPT1Gbnx8ZT09WW59KHQpP1huOkhuO3JldHVybiByLnRlc3QoZnVuY3Rpb24odCl7aWYobnVsbCE9dCl7dHJ5e3JldHVybiBKbi5jYWxsKHQpfWNhdGNoKHQpe310cnl7cmV0dXJuIHQrIiJ9Y2F0Y2godCl7fX1yZXR1cm4iIn0odCkpfWZ1bmN0aW9uIGVpKHQsZSl7dmFyIHI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09dD92b2lkIDA6dFtlXX0odCxlKTtyZXR1cm4gdGkocik/cjp2b2lkIDB9dmFyIHJpPWVpKE9iamVjdCwiY3JlYXRlIik7dmFyIG5pPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dmFyIGlpPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gb2kodCl7dmFyIGU9LTEscj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8cjspe3ZhciBuPXRbZV07dGhpcy5zZXQoblswXSxuWzFdKX19ZnVuY3Rpb24gc2kodCxlKXtmb3IodmFyIHIsbixpPXQubGVuZ3RoO2ktLTspaWYoKHI9dFtpXVswXSk9PT0obj1lKXx8ciE9ciYmbiE9bilyZXR1cm4gaTtyZXR1cm4tMX1vaS5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLl9fZGF0YV9fPXJpP3JpKG51bGwpOnt9LHRoaXMuc2l6ZT0wfSxvaS5wcm90b3R5cGUuZGVsZXRlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuaGFzKHQpJiZkZWxldGUgdGhpcy5fX2RhdGFfX1t0XTtyZXR1cm4gdGhpcy5zaXplLT1lPzE6MCxlfSxvaS5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX19kYXRhX187aWYocmkpe3ZhciByPWVbdF07cmV0dXJuIl9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iPT09cj92b2lkIDA6cn1yZXR1cm4gbmkuY2FsbChlLHQpP2VbdF06dm9pZCAwfSxvaS5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX19kYXRhX187cmV0dXJuIHJpP3ZvaWQgMCE9PWVbdF06aWkuY2FsbChlLHQpfSxvaS5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5fX2RhdGFfXztyZXR1cm4gdGhpcy5zaXplKz10aGlzLmhhcyh0KT8wOjEsclt0XT1yaSYmdm9pZCAwPT09ZT8iX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyI6ZSx0aGlzfTt2YXIgYWk9QXJyYXkucHJvdG90eXBlLnNwbGljZTtmdW5jdGlvbiB1aSh0KXt2YXIgZT0tMSxyPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxyOyl7dmFyIG49dFtlXTt0aGlzLnNldChuWzBdLG5bMV0pfX11aS5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLl9fZGF0YV9fPVtdLHRoaXMuc2l6ZT0wfSx1aS5wcm90b3R5cGUuZGVsZXRlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX19kYXRhX18scj1zaShlLHQpO3JldHVybiEocjwwKSYmKHI9PWUubGVuZ3RoLTE/ZS5wb3AoKTphaS5jYWxsKGUsciwxKSwtLXRoaXMuc2l6ZSwhMCl9LHVpLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxyPXNpKGUsdCk7cmV0dXJuIHI8MD92b2lkIDA6ZVtyXVsxXX0sdWkucHJvdG90eXBlLmhhcz1mdW5jdGlvbih0KXtyZXR1cm4gc2kodGhpcy5fX2RhdGFfXyx0KT4tMX0sdWkucHJvdG90eXBlLnNldD1mdW5jdGlvbih0LGUpe3ZhciByPXRoaXMuX19kYXRhX18sbj1zaShyLHQpO3JldHVybiBuPDA/KCsrdGhpcy5zaXplLHIucHVzaChbdCxlXSkpOnJbbl1bMV09ZSx0aGlzfTt2YXIgaGk9ZWkoRW4sIk1hcCIpO2Z1bmN0aW9uIGZpKHQsZSl7dmFyIHIsbixpPXQuX19kYXRhX187cmV0dXJuKCJzdHJpbmciPT0obj10eXBlb2Yocj1lKSl8fCJudW1iZXIiPT1ufHwic3ltYm9sIj09bnx8ImJvb2xlYW4iPT1uPyJfX3Byb3RvX18iIT09cjpudWxsPT09cik/aVsic3RyaW5nIj09dHlwZW9mIGU/InN0cmluZyI6Imhhc2giXTppLm1hcH1mdW5jdGlvbiBjaSh0KXt2YXIgZT0tMSxyPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxyOyl7dmFyIG49dFtlXTt0aGlzLnNldChuWzBdLG5bMV0pfX1jaS5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLnNpemU9MCx0aGlzLl9fZGF0YV9fPXtoYXNoOm5ldyBvaSxtYXA6bmV3KGhpfHx1aSksc3RyaW5nOm5ldyBvaX19LGNpLnByb3RvdHlwZS5kZWxldGU9ZnVuY3Rpb24odCl7dmFyIGU9ZmkodGhpcyx0KS5kZWxldGUodCk7cmV0dXJuIHRoaXMuc2l6ZS09ZT8xOjAsZX0sY2kucHJvdG90eXBlLmdldD1mdW5jdGlvbih0KXtyZXR1cm4gZmkodGhpcyx0KS5nZXQodCl9LGNpLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24odCl7cmV0dXJuIGZpKHRoaXMsdCkuaGFzKHQpfSxjaS5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQsZSl7dmFyIHI9ZmkodGhpcyx0KSxuPXIuc2l6ZTtyZXR1cm4gci5zZXQodCxlKSx0aGlzLnNpemUrPXIuc2l6ZT09bj8wOjEsdGhpc307dmFyIGxpPSJFeHBlY3RlZCBhIGZ1bmN0aW9uIjtmdW5jdGlvbiBwaSh0LGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0fHxudWxsIT1lJiYiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKGxpKTt2YXIgcj1mdW5jdGlvbigpe3ZhciBuPWFyZ3VtZW50cyxpPWU/ZS5hcHBseSh0aGlzLG4pOm5bMF0sbz1yLmNhY2hlO2lmKG8uaGFzKGkpKXJldHVybiBvLmdldChpKTt2YXIgcz10LmFwcGx5KHRoaXMsbik7cmV0dXJuIHIuY2FjaGU9by5zZXQoaSxzKXx8byxzfTtyZXR1cm4gci5jYWNoZT1uZXcocGkuQ2FjaGV8fGNpKSxyfXBpLkNhY2hlPWNpO3ZhciBkaSxnaSx5aSx2aT0vW14uW1xdXSt8XFsoPzooLT9cZCsoPzpcLlxkKyk/KXwoWyInXSkoKD86KD8hXDIpW15cXF18XFwuKSo/KVwyKVxdfCg/PSg/OlwufFxbXF0pKD86XC58XFtcXXwkKSkvZyxiaT0vXFwoXFwpPy9nLG1pPShkaT1mdW5jdGlvbih0KXt2YXIgZT1bXTtyZXR1cm4gNDY9PT10LmNoYXJDb2RlQXQoMCkmJmUucHVzaCgiIiksdC5yZXBsYWNlKHZpLChmdW5jdGlvbih0LHIsbixpKXtlLnB1c2gobj9pLnJlcGxhY2UoYmksIiQxIik6cnx8dCl9KSksZX0sZ2k9cGkoZGksKGZ1bmN0aW9uKHQpe3JldHVybiA1MDA9PT15aS5zaXplJiZ5aS5jbGVhcigpLHR9KSkseWk9Z2kuY2FjaGUsZ2kpLHdpPW1pO3ZhciBfaT0xLzAsU2k9a24/a24ucHJvdG90eXBlOnZvaWQgMCxFaT1TaT9TaS50b1N0cmluZzp2b2lkIDA7ZnVuY3Rpb24ga2kodCl7aWYoInN0cmluZyI9PXR5cGVvZiB0KXJldHVybiB0O2lmKHduKHQpKXJldHVybiBmdW5jdGlvbih0LGUpe2Zvcih2YXIgcj0tMSxuPW51bGw9PXQ/MDp0Lmxlbmd0aCxpPUFycmF5KG4pOysrcjxuOylpW3JdPWUodFtyXSxyLHQpO3JldHVybiBpfSh0LGtpKSsiIjtpZihVbih0KSlyZXR1cm4gRWk/RWkuY2FsbCh0KToiIjt2YXIgZT10KyIiO3JldHVybiIwIj09ZSYmMS90PT0tX2k/Ii0wIjplfWZ1bmN0aW9uIFJpKHQsZSl7cmV0dXJuIHduKHQpP3Q6ZnVuY3Rpb24odCxlKXtpZih3bih0KSlyZXR1cm4hMTt2YXIgcj10eXBlb2YgdDtyZXR1cm4hKCJudW1iZXIiIT1yJiYic3ltYm9sIiE9ciYmImJvb2xlYW4iIT1yJiZudWxsIT10JiYhVW4odCkpfHxEbi50ZXN0KHQpfHwhSW4udGVzdCh0KXx8bnVsbCE9ZSYmdCBpbiBPYmplY3QoZSl9KHQsZSk/W3RdOndpKGZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10PyIiOmtpKHQpfSh0KSl9dmFyIEFpPTEvMDtmdW5jdGlvbiBPaSh0KXtpZigic3RyaW5nIj09dHlwZW9mIHR8fFVuKHQpKXJldHVybiB0O3ZhciBlPXQrIiI7cmV0dXJuIjAiPT1lJiYxL3Q9PS1BaT8iLTAiOmV9ZnVuY3Rpb24gVGkodCxlLHIpe3ZhciBuPW51bGw9PXQ/dm9pZCAwOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPTAsbj0oZT1SaShlLHQpKS5sZW5ndGg7bnVsbCE9dCYmcjxuOyl0PXRbT2koZVtyKytdKV07cmV0dXJuIHImJnI9PW4/dDp2b2lkIDB9KHQsZSk7cmV0dXJuIHZvaWQgMD09PW4/cjpufXZhciBqaT0iW29iamVjdCBOdW1iZXJdIjtmdW5jdGlvbiBMaSh0KXtyZXR1cm4iW29iamVjdCBTdHJpbmddIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiBDaSh0KXtyZXR1cm4hKCFMaSh0KXx8IiI9PT10KX1mdW5jdGlvbiBQaSh0KXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWZ1bmN0aW9uIE1pKHQpe3JldHVybiJbb2JqZWN0IFVuZGVmaW5lZF0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWZ1bmN0aW9uIEJpKHQpe3JldHVybiJbb2JqZWN0IE9iamVjdF0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWZ1bmN0aW9uIHhpKHQpe3JldHVybiEoIUxpKHQpfHwiIiE9PXQpfWZ1bmN0aW9uIFVpKHQpe3JldHVybiEhTWkodCl8fCghIWZ1bmN0aW9uKHQpe3JldHVybiJbb2JqZWN0IE51bGxdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX0odCl8fCghIWZ1bmN0aW9uKHQpe2lmKEJpKHQpKXtmb3IobGV0IGUgaW4gdClyZXR1cm4hMTtyZXR1cm4hMH1yZXR1cm4hMX0odCl8fCghIXhpKHQpfHwoISFmdW5jdGlvbih0KXtyZXR1cm4hIVBpKHQpJiYwPT09dC5sZW5ndGh9KHQpfHwhIWZ1bmN0aW9uKHQpe3JldHVybiB0IT10fSh0KSkpKSl9ZnVuY3Rpb24gSWkoKXtsZXQgdCxlLHI9bmV3IFByb21pc2UoKGZ1bmN0aW9uKCl7dD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV19KSk7cmV0dXJuIHIucmVzb2x2ZT10LHIucmVqZWN0PWUscn1sZXQgV0pzb25TdHJlYW09e3BhcnNlOmFzeW5jIGZ1bmN0aW9uKHQpe2lmKCFDaSh0KSlyZXR1cm57fTtsZXQgZT17fTt0cnl7ZT1KU09OLnBhcnNlKHQpfWNhdGNoKHQpe2U9e319cmV0dXJuIGV9LHBhcnNlQnlTdHJlYW06ZnVuY3Rpb24odCl7bGV0IGU9e307aWYoIm51bGwiPT09dClyZXR1cm4gbnVsbDtpZigiIj09PXQpcmV0dXJue307bGV0IHI9Il9fc3lzdGVtX18iLG49YHsiJHtyfSI6JHt0fX1gLGk9SWkoKSxvPWZyKG4pLHM9c24ucGFyc2UoIiQqIik7cmV0dXJuIHMub24oImRhdGEiLChmdW5jdGlvbih0KXtlW3Qua2V5XT10LnZhbHVlfSkpLHMub24oImVuZCIsKGZ1bmN0aW9uKCl7bGV0IHQ9VGkoZSxyKTtpLnJlc29sdmUodCl9KSkscy5vbigiZXJyb3IiLChmdW5jdGlvbih0KXtpLnJlamVjdCh0KX0pKSxvLnBpcGUocyksaX0sY3JlYXRlUGFyc2VTdHJlYW06ZnVuY3Rpb24odCl7cmV0dXJuIENpKHQpfHxmdW5jdGlvbih0KXtyZXR1cm4hKCFQaSh0KXx8MD09PXQubGVuZ3RofHwxPT09dC5sZW5ndGgmJlVpKHRbMF0pKX0odCl8fCh0PSIkKiIpLHNuLnBhcnNlKHQpfSxzdHJpbmdpZnk6YXN5bmMgZnVuY3Rpb24odCl7aWYoTWkodCkpcmV0dXJuIiI7bGV0IGU9IiI7dHJ5e2U9SlNPTi5zdHJpbmdpZnkodCl9Y2F0Y2godCl7ZT0iIn1yZXR1cm4gZX0sc3RyaW5naWZ5QnlTdHJlYW06ZnVuY3Rpb24odCl7bGV0IGU9IiI7aWYoTWkodCkpcmV0dXJuIiI7aWYobnVsbD09PXQpcmV0dXJuIm51bGwiO2lmKHhpKHQpKXJldHVybiciIic7aWYoIm51bWJlciI9PXR5cGVvZihyPXQpfHxCbihyKSYmTW4ocik9PWppKXJldHVybmAke3R9YDt2YXIgcjtpZihMaSh0KSlyZXR1cm5gIiR7dH0iYDtsZXQgbj1JaSgpLGk9bmV3IG1uKHQsbnVsbCxudWxsLCExKTtyZXR1cm4gaS5vbigiZGF0YSIsKGZ1bmN0aW9uKHQpe2UrPXR9KSksaS5vbigiZW5kIiwoZnVuY3Rpb24oKXtuLnJlc29sdmUoZSl9KSksaS5vbigiZXJyb3IiLChmdW5jdGlvbih0KXtuLnJlamVjdCh0KX0pKSxufSxjcmVhdGVTdHJpbmdpZnlTdHJlYW06ZnVuY3Rpb24odCl7aWYoIUJpKHQpJiYhUGkodCkpdGhyb3cgbmV3IEVycm9yKCJkYXRhIGlzIG5vdCBvYmplY3Qgb3IgYXJyYXkiKTtyZXR1cm4gbmV3IG1uKHQsbnVsbCxudWxsLCExKX19OwoKbGV0IGluc3RhbmNlID0gbnVsbApmdW5jdGlvbiBpbml0KGlucHV0KXsKCiAgICAvL2luaXQKICAgIGxldCByCiAgICAKICAgICAgICByID0gV0pzb25TdHJlYW0oLi4uaW5wdXQpCiAgICAgICAgCgogICAgLy9vbgogICAgCgogICAgLy9zYXZlCiAgICBpbnN0YW5jZSA9IHIKCn0KCmZ1bmN0aW9uIHNlbmRNZXNzYWdlKGRhdGEpIHsKICAgIAogICAgICAgIHBhcmVudFBvcnQucG9zdE1lc3NhZ2UoZGF0YSkKICAgICAgICAKfQoKYXN5bmMgZnVuY3Rpb24gcnVuKGRhdGEpIHsKICAgIC8vIGNvbnNvbGUubG9nKCdpbm5lciB3b3JrZXIgcnVuJyxkYXRhKQoKICAgIC8vbW9kZQogICAgbGV0IG1vZGUgPSBkYXRhLm1vZGUKCiAgICAvL2NoZWNrCiAgICBpZihtb2RlICE9PSAnaW5pdCcgJiYgbW9kZSAhPT0gJ2NhbGwnKXsKICAgICAgICByZXR1cm4KICAgIH0KCiAgICAvL2luaXQKICAgIGlmKG1vZGUgPT09ICdpbml0Jyl7CiAgICAgICAgCiAgICAgICAgdHJ5ewoKICAgICAgICAgICAgLy90eXBlCiAgICAgICAgICAgIGxldCB0eXBlID0gZGF0YS50eXBlCgogICAgICAgICAgICAvL2lucHV0CiAgICAgICAgICAgIGxldCBpbnB1dCA9IGRhdGEuaW5wdXQKICAgIAogICAgICAgICAgICAvL2luc3RhbmNlCiAgICAgICAgICAgIGlmKHR5cGUgPT09ICdmdW5jdGlvbicpewogICAgICAgICAgICAgICAgaW5pdCguLi5pbnB1dCkKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmKHR5cGUgPT09ICdvYmplY3QnKXsKICAgICAgICAgICAgICAgIGluc3RhbmNlID0gV0pzb25TdHJlYW0KICAgICAgICAgICAgfQoKICAgICAgICB9CiAgICAgICAgY2F0Y2goZXJyKXsKICAgICAgICAKICAgICAgICAgICAgLy9zZW5kTWVzc2FnZQogICAgICAgICAgICBsZXQgcmVzID0gewogICAgICAgICAgICAgICAgbW9kZTogJ2VtaXQnLAogICAgICAgICAgICAgICAgZXZOYW1lOiAnZXJyb3InLAogICAgICAgICAgICAgICAgbXNnOiBlcnIsCiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2VuZE1lc3NhZ2UocmVzKQoKICAgICAgICB9CiAgICAgICAgICAgIAogICAgfQoKICAgIC8vY2hlY2sKICAgIGlmKG1vZGUgPT09ICdjYWxsJyl7CiAgICAgICAgbGV0IHN0YXRlID0gJycKICAgICAgICBsZXQgbXNnID0gbnVsbAoKICAgICAgICB0cnl7CgogICAgICAgICAgICAvL2Z1bgogICAgICAgICAgICBsZXQgZnVuID0gaW5zdGFuY2VbZGF0YS5mdW5dCgogICAgICAgICAgICAvL2lucHV0CiAgICAgICAgICAgIGxldCBpbnB1dCA9IGRhdGEuaW5wdXQKCiAgICAgICAgICAgIC8vZXhlYwogICAgICAgICAgICBhd2FpdCBmdW4oLi4uaW5wdXQpCiAgICAgICAgICAgICAgICAudGhlbigoc3VjKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGU9J3N1Y2Nlc3MnCiAgICAgICAgICAgICAgICAgICAgbXNnPXN1YwogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgIC5jYXRjaCgoZXJyKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGU9J2Vycm9yJwogICAgICAgICAgICAgICAgICAgIG1zZz1lcnIKICAgICAgICAgICAgICAgIH0pCgogICAgICAgIH0KICAgICAgICBjYXRjaChlcnIpewogICAgICAgICAgICBzdGF0ZSA9ICdlcnJvcicKICAgICAgICAgICAgbXNnID0gZXJyCiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vc2VuZE1lc3NhZ2UKICAgICAgICBsZXQgcmVzID0gewogICAgICAgICAgICBtb2RlOiAncmV0dXJuJywKICAgICAgICAgICAgaWQ6IGRhdGEuaWQsCiAgICAgICAgICAgIGZ1bjogZGF0YS5mdW4sCiAgICAgICAgICAgIHN0YXRlLAogICAgICAgICAgICBtc2csCiAgICAgICAgfQogICAgICAgIHNlbmRNZXNzYWdlKHJlcykKCiAgICB9Cgp9CgpmdW5jdGlvbiByZWN2TWVzc2FnZShkYXRhKSB7CiAgICAvLyBjb25zb2xlLmxvZygnaW5uZXIgd29ya2VyIHJlY3Y6JywgZGF0YSkKCiAgICAvL2RhdGFSZWN2CiAgICBsZXQgZGF0YVJlY3YgPSBkYXRhCgogICAgLy9ydW4KICAgIHJ1bihkYXRhUmVjdikKCn0KCgogICAgICAgIHBhcmVudFBvcnQub24oJ21lc3NhZ2UnLCByZWN2TWVzc2FnZSkKICAgICAgICAKCg==",Buffer.from(X,"base64").toString("utf8"));var X;function W(){let d=Z(),m=function(Z){try{return new l.Worker(Z,{eval:!0})}catch(l){X(l)}}(b);if(!m)return X("invalid worker"),null;function X(l){d.emit("error",l)}return m.on("message",(function(l){let Z=l,m=Z.mode;"emit"!==m&&"return"!==m||("emit"===m&&d.emit(Z.evName,Z.msg),"return"===m&&d.emit(Z.id,Z))})),m.on("error",X),function(){let l={mode:"init",type:"object",input:[...arguments]};m.postMessage(l)}([...arguments]),d.stringify=function(){let l=c(),Z=G(),b={mode:"call",id:Z,fun:"stringify",input:[...arguments]};return m.postMessage(b),d.once(Z,(Z=>{"success"===Z.state?l.resolve(Z.msg):l.reject(Z.msg)})),l},d.parse=function(){let l=c(),Z=G(),b={mode:"call",id:Z,fun:"parse",input:[...arguments]};return m.postMessage(b),d.once(Z,(Z=>{"success"===Z.state?l.resolve(Z.msg):l.reject(Z.msg)})),l},d.terminate=function(){m?(m.terminate(),m=void 0):X("worker has been terminated")},d}let y={stringify:async function(){let l=[...arguments],Z=W();return await Z.stringify(...l).finally((()=>{Z.terminate()}))},parse:async function(){let l=[...arguments],Z=W();return await Z.parse(...l).finally((()=>{Z.terminate()}))}};m=Z();for(let l in y){let Z=y[l];m[l]=Z}}(),m}(l)}({get exports(){return Z},set exports(l){Z=l}});var d=Z,m={};!function(l,Z){l.exports=function(){const l="function"==typeof Buffer,Z="function"==typeof TextDecoder?new TextDecoder:void 0,d=(l=>{let Z={};return l.forEach(((l,d)=>Z[l]=d)),Z})(("function"==typeof TextEncoder&&new TextEncoder,Array.prototype.slice.call("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="))),m=/^(?:[A-Za-z\d+\/]{4})*?(?:[A-Za-z\d+\/]{2}(?:==)?|[A-Za-z\d+\/]{3}=?)?$/,c=String.fromCharCode.bind(String),G="function"==typeof Uint8Array.from?Uint8Array.from.bind(Uint8Array):l=>new Uint8Array(Array.prototype.slice.call(l,0)),b=l=>l.replace(/[^A-Za-z0-9\+\/]/g,""),X=/[\xC0-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF7][\x80-\xBF]{3}/g,W=l=>{switch(l.length){case 4:var Z=((7&l.charCodeAt(0))<<18|(63&l.charCodeAt(1))<<12|(63&l.charCodeAt(2))<<6|63&l.charCodeAt(3))-65536;return c(55296+(Z>>>10))+c(56320+(1023&Z));case 3:return c((15&l.charCodeAt(0))<<12|(63&l.charCodeAt(1))<<6|63&l.charCodeAt(2));default:return c((31&l.charCodeAt(0))<<6|63&l.charCodeAt(1))}},y=l=>l.replace(X,W),I=l=>{if(l=l.replace(/\s+/g,""),!m.test(l))throw new TypeError("malformed base64.");l+="==".slice(2-(3&l.length));let Z,G,b,X="";for(let m=0;m<l.length;)Z=d[l.charAt(m++)]<<18|d[l.charAt(m++)]<<12|(G=d[l.charAt(m++)])<<6|(b=d[l.charAt(m++)]),X+=64===G?c(Z>>16&255):64===b?c(Z>>16&255,Z>>8&255):c(Z>>16&255,Z>>8&255,255&Z);return X},i="function"==typeof atob?l=>atob(b(l)):l?l=>Buffer.from(l,"base64").toString("binary"):I,p=l?l=>G(Buffer.from(l,"base64")):l=>G(i(l).split("").map((l=>l.charCodeAt(0)))),u=l?l=>Buffer.from(l,"base64").toString("utf8"):Z?l=>Z.decode(p(l)):l=>y(i(l)),V=l=>b(l.replace(/[-_]/g,(l=>"-"==l?"+":"/"))),h=l=>u(V(l)),K=h;var a={};!function(l){var Z=Object.prototype.hasOwnProperty,d="~";function m(){}function c(l,Z,d){this.fn=l,this.context=Z,this.once=d||!1}function G(l,Z,m,G,b){if("function"!=typeof m)throw new TypeError("The listener must be a function");var X=new c(m,G||l,b),W=d?d+Z:Z;return l._events[W]?l._events[W].fn?l._events[W]=[l._events[W],X]:l._events[W].push(X):(l._events[W]=X,l._eventsCount++),l}function b(l,Z){0==--l._eventsCount?l._events=new m:delete l._events[Z]}function X(){this._events=new m,this._eventsCount=0}Object.create&&(m.prototype=Object.create(null),(new m).__proto__||(d=!1)),X.prototype.eventNames=function(){var l,m,c=[];if(0===this._eventsCount)return c;for(m in l=this._events)Z.call(l,m)&&c.push(d?m.slice(1):m);return Object.getOwnPropertySymbols?c.concat(Object.getOwnPropertySymbols(l)):c},X.prototype.listeners=function(l){var Z=d?d+l:l,m=this._events[Z];if(!m)return[];if(m.fn)return[m.fn];for(var c=0,G=m.length,b=new Array(G);c<G;c++)b[c]=m[c].fn;return b},X.prototype.listenerCount=function(l){var Z=d?d+l:l,m=this._events[Z];return m?m.fn?1:m.length:0},X.prototype.emit=function(l,Z,m,c,G,b){var X=d?d+l:l;if(!this._events[X])return!1;var W,y,I=this._events[X],i=arguments.length;if(I.fn){switch(I.once&&this.removeListener(l,I.fn,void 0,!0),i){case 1:return I.fn.call(I.context),!0;case 2:return I.fn.call(I.context,Z),!0;case 3:return I.fn.call(I.context,Z,m),!0;case 4:return I.fn.call(I.context,Z,m,c),!0;case 5:return I.fn.call(I.context,Z,m,c,G),!0;case 6:return I.fn.call(I.context,Z,m,c,G,b),!0}for(y=1,W=new Array(i-1);y<i;y++)W[y-1]=arguments[y];I.fn.apply(I.context,W)}else{var p,u=I.length;for(y=0;y<u;y++)switch(I[y].once&&this.removeListener(l,I[y].fn,void 0,!0),i){case 1:I[y].fn.call(I[y].context);break;case 2:I[y].fn.call(I[y].context,Z);break;case 3:I[y].fn.call(I[y].context,Z,m);break;case 4:I[y].fn.call(I[y].context,Z,m,c);break;default:if(!W)for(p=1,W=new Array(i-1);p<i;p++)W[p-1]=arguments[p];I[y].fn.apply(I[y].context,W)}}return!0},X.prototype.on=function(l,Z,d){return G(this,l,Z,d,!1)},X.prototype.once=function(l,Z,d){return G(this,l,Z,d,!0)},X.prototype.removeListener=function(l,Z,m,c){var G=d?d+l:l;if(!this._events[G])return this;if(!Z)return b(this,G),this;var X=this._events[G];if(X.fn)X.fn!==Z||c&&!X.once||m&&X.context!==m||b(this,G);else{for(var W=0,y=[],I=X.length;W<I;W++)(X[W].fn!==Z||c&&!X[W].once||m&&X[W].context!==m)&&y.push(X[W]);y.length?this._events[G]=1===y.length?y[0]:y:b(this,G)}return this},X.prototype.removeAllListeners=function(l){var Z;return l?(Z=d?d+l:l,this._events[Z]&&b(this,Z)):(this._events=new m,this._eventsCount=0),this},X.prototype.off=X.prototype.removeListener,X.prototype.addListener=X.prototype.on,X.prefixed=d,X.EventEmitter=X,l.exports=X}({get exports(){return a},set exports(l){a=l}});var Y=a;let R;return function(){if("browser"!=("undefined"!=typeof window&&void 0!==window.document?"browser":"nodejs"))return null;function l(){return new Y}function Z(){let l,Z,d=new Promise((function(){l=arguments[0],Z=arguments[1]}));return d.resolve=l,d.reject=Z,d}function d(){let l=arguments.length>0&&void 0!==arguments[0]?arguments[0]:10,Z=[],d="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""),m=d.length;for(let c=0;c<l;c++)Z[c]=d[0|Math.random()*m];return Z.join("")}let m=K("CgoKZnVuY3Rpb24gdCgpe31mdW5jdGlvbiBlKCl7ZS5pbml0LmNhbGwodGhpcyl9ZnVuY3Rpb24gcih0KXtyZXR1cm4gdm9pZCAwPT09dC5fbWF4TGlzdGVuZXJzP2UuZGVmYXVsdE1heExpc3RlbmVyczp0Ll9tYXhMaXN0ZW5lcnN9ZnVuY3Rpb24gbihlLG4saSxvKXt2YXIgcyxhLHUsaDtpZigiZnVuY3Rpb24iIT10eXBlb2YgaSl0aHJvdyBuZXcgVHlwZUVycm9yKCcibGlzdGVuZXIiIGFyZ3VtZW50IG11c3QgYmUgYSBmdW5jdGlvbicpO2lmKChhPWUuX2V2ZW50cyk/KGEubmV3TGlzdGVuZXImJihlLmVtaXQoIm5ld0xpc3RlbmVyIixuLGkubGlzdGVuZXI/aS5saXN0ZW5lcjppKSxhPWUuX2V2ZW50cyksdT1hW25dKTooYT1lLl9ldmVudHM9bmV3IHQsZS5fZXZlbnRzQ291bnQ9MCksdSl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHU/dT1hW25dPW8/W2ksdV06W3UsaV06bz91LnVuc2hpZnQoaSk6dS5wdXNoKGkpLCF1Lndhcm5lZCYmKHM9cihlKSkmJnM+MCYmdS5sZW5ndGg+cyl7dS53YXJuZWQ9ITA7dmFyIGY9bmV3IEVycm9yKCJQb3NzaWJsZSBFdmVudEVtaXR0ZXIgbWVtb3J5IGxlYWsgZGV0ZWN0ZWQuICIrdS5sZW5ndGgrIiAiK24rIiBsaXN0ZW5lcnMgYWRkZWQuIFVzZSBlbWl0dGVyLnNldE1heExpc3RlbmVycygpIHRvIGluY3JlYXNlIGxpbWl0Iik7Zi5uYW1lPSJNYXhMaXN0ZW5lcnNFeGNlZWRlZFdhcm5pbmciLGYuZW1pdHRlcj1lLGYudHlwZT1uLGYuY291bnQ9dS5sZW5ndGgsaD1mLCJmdW5jdGlvbiI9PXR5cGVvZiBjb25zb2xlLndhcm4/Y29uc29sZS53YXJuKGgpOmNvbnNvbGUubG9nKGgpfX1lbHNlIHU9YVtuXT1pLCsrZS5fZXZlbnRzQ291bnQ7cmV0dXJuIGV9ZnVuY3Rpb24gaSh0LGUscil7dmFyIG49ITE7ZnVuY3Rpb24gaSgpe3QucmVtb3ZlTGlzdGVuZXIoZSxpKSxufHwobj0hMCxyLmFwcGx5KHQsYXJndW1lbnRzKSl9cmV0dXJuIGkubGlzdGVuZXI9cixpfWZ1bmN0aW9uIG8odCl7dmFyIGU9dGhpcy5fZXZlbnRzO2lmKGUpe3ZhciByPWVbdF07aWYoImZ1bmN0aW9uIj09dHlwZW9mIHIpcmV0dXJuIDE7aWYocilyZXR1cm4gci5sZW5ndGh9cmV0dXJuIDB9ZnVuY3Rpb24gcyh0LGUpe2Zvcih2YXIgcj1uZXcgQXJyYXkoZSk7ZS0tOylyW2VdPXRbZV07cmV0dXJuIHJ9dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShudWxsKSxlLkV2ZW50RW1pdHRlcj1lLGUudXNpbmdEb21haW5zPSExLGUucHJvdG90eXBlLmRvbWFpbj12b2lkIDAsZS5wcm90b3R5cGUuX2V2ZW50cz12b2lkIDAsZS5wcm90b3R5cGUuX21heExpc3RlbmVycz12b2lkIDAsZS5kZWZhdWx0TWF4TGlzdGVuZXJzPTEwLGUuaW5pdD1mdW5jdGlvbigpe3RoaXMuZG9tYWluPW51bGwsZS51c2luZ0RvbWFpbnMmJnVuZGVmaW5lZC5hY3RpdmUsdGhpcy5fZXZlbnRzJiZ0aGlzLl9ldmVudHMhPT1PYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykuX2V2ZW50c3x8KHRoaXMuX2V2ZW50cz1uZXcgdCx0aGlzLl9ldmVudHNDb3VudD0wKSx0aGlzLl9tYXhMaXN0ZW5lcnM9dGhpcy5fbWF4TGlzdGVuZXJzfHx2b2lkIDB9LGUucHJvdG90eXBlLnNldE1heExpc3RlbmVycz1mdW5jdGlvbih0KXtpZigibnVtYmVyIiE9dHlwZW9mIHR8fHQ8MHx8aXNOYU4odCkpdGhyb3cgbmV3IFR5cGVFcnJvcignIm4iIGFyZ3VtZW50IG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXInKTtyZXR1cm4gdGhpcy5fbWF4TGlzdGVuZXJzPXQsdGhpc30sZS5wcm90b3R5cGUuZ2V0TWF4TGlzdGVuZXJzPWZ1bmN0aW9uKCl7cmV0dXJuIHIodGhpcyl9LGUucHJvdG90eXBlLmVtaXQ9ZnVuY3Rpb24odCl7dmFyIGUscixuLGksbyxhLHUsaD0iZXJyb3IiPT09dDtpZihhPXRoaXMuX2V2ZW50cyloPWgmJm51bGw9PWEuZXJyb3I7ZWxzZSBpZighaClyZXR1cm4hMTtpZih1PXRoaXMuZG9tYWluLGgpe2lmKGU9YXJndW1lbnRzWzFdLCF1KXtpZihlIGluc3RhbmNlb2YgRXJyb3IpdGhyb3cgZTt2YXIgZj1uZXcgRXJyb3IoJ1VuY2F1Z2h0LCB1bnNwZWNpZmllZCAiZXJyb3IiIGV2ZW50LiAoJytlKyIpIik7dGhyb3cgZi5jb250ZXh0PWUsZn1yZXR1cm4gZXx8KGU9bmV3IEVycm9yKCdVbmNhdWdodCwgdW5zcGVjaWZpZWQgImVycm9yIiBldmVudCcpKSxlLmRvbWFpbkVtaXR0ZXI9dGhpcyxlLmRvbWFpbj11LGUuZG9tYWluVGhyb3duPSExLHUuZW1pdCgiZXJyb3IiLGUpLCExfWlmKCEocj1hW3RdKSlyZXR1cm4hMTt2YXIgYz0iZnVuY3Rpb24iPT10eXBlb2Ygcjtzd2l0Y2gobj1hcmd1bWVudHMubGVuZ3RoKXtjYXNlIDE6IWZ1bmN0aW9uKHQsZSxyKXtpZihlKXQuY2FsbChyKTtlbHNlIGZvcih2YXIgbj10Lmxlbmd0aCxpPXModCxuKSxvPTA7bzxuOysrbylpW29dLmNhbGwocil9KHIsYyx0aGlzKTticmVhaztjYXNlIDI6IWZ1bmN0aW9uKHQsZSxyLG4pe2lmKGUpdC5jYWxsKHIsbik7ZWxzZSBmb3IodmFyIGk9dC5sZW5ndGgsbz1zKHQsaSksYT0wO2E8aTsrK2Epb1thXS5jYWxsKHIsbil9KHIsYyx0aGlzLGFyZ3VtZW50c1sxXSk7YnJlYWs7Y2FzZSAzOiFmdW5jdGlvbih0LGUscixuLGkpe2lmKGUpdC5jYWxsKHIsbixpKTtlbHNlIGZvcih2YXIgbz10Lmxlbmd0aCxhPXModCxvKSx1PTA7dTxvOysrdSlhW3VdLmNhbGwocixuLGkpfShyLGMsdGhpcyxhcmd1bWVudHNbMV0sYXJndW1lbnRzWzJdKTticmVhaztjYXNlIDQ6IWZ1bmN0aW9uKHQsZSxyLG4saSxvKXtpZihlKXQuY2FsbChyLG4saSxvKTtlbHNlIGZvcih2YXIgYT10Lmxlbmd0aCx1PXModCxhKSxoPTA7aDxhOysraCl1W2hdLmNhbGwocixuLGksbyl9KHIsYyx0aGlzLGFyZ3VtZW50c1sxXSxhcmd1bWVudHNbMl0sYXJndW1lbnRzWzNdKTticmVhaztkZWZhdWx0OmZvcihpPW5ldyBBcnJheShuLTEpLG89MTtvPG47bysrKWlbby0xXT1hcmd1bWVudHNbb107IWZ1bmN0aW9uKHQsZSxyLG4pe2lmKGUpdC5hcHBseShyLG4pO2Vsc2UgZm9yKHZhciBpPXQubGVuZ3RoLG89cyh0LGkpLGE9MDthPGk7KythKW9bYV0uYXBwbHkocixuKX0ocixjLHRoaXMsaSl9cmV0dXJuITB9LGUucHJvdG90eXBlLmFkZExpc3RlbmVyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4odGhpcyx0LGUsITEpfSxlLnByb3RvdHlwZS5vbj1lLnByb3RvdHlwZS5hZGRMaXN0ZW5lcixlLnByb3RvdHlwZS5wcmVwZW5kTGlzdGVuZXI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbih0aGlzLHQsZSwhMCl9LGUucHJvdG90eXBlLm9uY2U9ZnVuY3Rpb24odCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCcibGlzdGVuZXIiIGFyZ3VtZW50IG11c3QgYmUgYSBmdW5jdGlvbicpO3JldHVybiB0aGlzLm9uKHQsaSh0aGlzLHQsZSkpLHRoaXN9LGUucHJvdG90eXBlLnByZXBlbmRPbmNlTGlzdGVuZXI9ZnVuY3Rpb24odCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCcibGlzdGVuZXIiIGFyZ3VtZW50IG11c3QgYmUgYSBmdW5jdGlvbicpO3JldHVybiB0aGlzLnByZXBlbmRMaXN0ZW5lcih0LGkodGhpcyx0LGUpKSx0aGlzfSxlLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lcj1mdW5jdGlvbihlLHIpe3ZhciBuLGksbyxzLGE7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHIpdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3RlbmVyIiBhcmd1bWVudCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtpZighKGk9dGhpcy5fZXZlbnRzKSlyZXR1cm4gdGhpcztpZighKG49aVtlXSkpcmV0dXJuIHRoaXM7aWYobj09PXJ8fG4ubGlzdGVuZXImJm4ubGlzdGVuZXI9PT1yKTA9PS0tdGhpcy5fZXZlbnRzQ291bnQ/dGhpcy5fZXZlbnRzPW5ldyB0OihkZWxldGUgaVtlXSxpLnJlbW92ZUxpc3RlbmVyJiZ0aGlzLmVtaXQoInJlbW92ZUxpc3RlbmVyIixlLG4ubGlzdGVuZXJ8fHIpKTtlbHNlIGlmKCJmdW5jdGlvbiIhPXR5cGVvZiBuKXtmb3Iobz0tMSxzPW4ubGVuZ3RoO3MtLSA+MDspaWYobltzXT09PXJ8fG5bc10ubGlzdGVuZXImJm5bc10ubGlzdGVuZXI9PT1yKXthPW5bc10ubGlzdGVuZXIsbz1zO2JyZWFrfWlmKG88MClyZXR1cm4gdGhpcztpZigxPT09bi5sZW5ndGgpe2lmKG5bMF09dm9pZCAwLDA9PS0tdGhpcy5fZXZlbnRzQ291bnQpcmV0dXJuIHRoaXMuX2V2ZW50cz1uZXcgdCx0aGlzO2RlbGV0ZSBpW2VdfWVsc2UhZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9ZSxuPXIrMSxpPXQubGVuZ3RoO248aTtyKz0xLG4rPTEpdFtyXT10W25dO3QucG9wKCl9KG4sbyk7aS5yZW1vdmVMaXN0ZW5lciYmdGhpcy5lbWl0KCJyZW1vdmVMaXN0ZW5lciIsZSxhfHxyKX1yZXR1cm4gdGhpc30sZS5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzPWZ1bmN0aW9uKGUpe3ZhciByLG47aWYoIShuPXRoaXMuX2V2ZW50cykpcmV0dXJuIHRoaXM7aWYoIW4ucmVtb3ZlTGlzdGVuZXIpcmV0dXJuIDA9PT1hcmd1bWVudHMubGVuZ3RoPyh0aGlzLl9ldmVudHM9bmV3IHQsdGhpcy5fZXZlbnRzQ291bnQ9MCk6bltlXSYmKDA9PS0tdGhpcy5fZXZlbnRzQ291bnQ/dGhpcy5fZXZlbnRzPW5ldyB0OmRlbGV0ZSBuW2VdKSx0aGlzO2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXtmb3IodmFyIGksbz1PYmplY3Qua2V5cyhuKSxzPTA7czxvLmxlbmd0aDsrK3MpInJlbW92ZUxpc3RlbmVyIiE9PShpPW9bc10pJiZ0aGlzLnJlbW92ZUFsbExpc3RlbmVycyhpKTtyZXR1cm4gdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoInJlbW92ZUxpc3RlbmVyIiksdGhpcy5fZXZlbnRzPW5ldyB0LHRoaXMuX2V2ZW50c0NvdW50PTAsdGhpc31pZigiZnVuY3Rpb24iPT10eXBlb2Yocj1uW2VdKSl0aGlzLnJlbW92ZUxpc3RlbmVyKGUscik7ZWxzZSBpZihyKWRve3RoaXMucmVtb3ZlTGlzdGVuZXIoZSxyW3IubGVuZ3RoLTFdKX13aGlsZShyWzBdKTtyZXR1cm4gdGhpc30sZS5wcm90b3R5cGUubGlzdGVuZXJzPWZ1bmN0aW9uKHQpe3ZhciBlLHI9dGhpcy5fZXZlbnRzO3JldHVybiByJiYoZT1yW3RdKT8iZnVuY3Rpb24iPT10eXBlb2YgZT9bZS5saXN0ZW5lcnx8ZV06ZnVuY3Rpb24odCl7Zm9yKHZhciBlPW5ldyBBcnJheSh0Lmxlbmd0aCkscj0wO3I8ZS5sZW5ndGg7KytyKWVbcl09dFtyXS5saXN0ZW5lcnx8dFtyXTtyZXR1cm4gZX0oZSk6W119LGUubGlzdGVuZXJDb3VudD1mdW5jdGlvbih0LGUpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0Lmxpc3RlbmVyQ291bnQ/dC5saXN0ZW5lckNvdW50KGUpOm8uY2FsbCh0LGUpfSxlLnByb3RvdHlwZS5saXN0ZW5lckNvdW50PW8sZS5wcm90b3R5cGUuZXZlbnROYW1lcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9ldmVudHNDb3VudD4wP1JlZmxlY3Qub3duS2V5cyh0aGlzLl9ldmVudHMpOltdfTt2YXIgYT0idW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbD9nbG9iYWw6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmP3NlbGY6InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93Ont9LHU9W10saD1bXSxmPSJ1bmRlZmluZWQiIT10eXBlb2YgVWludDhBcnJheT9VaW50OEFycmF5OkFycmF5LGM9ITE7ZnVuY3Rpb24gbCgpe2M9ITA7Zm9yKHZhciB0PSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIixlPTAscj10Lmxlbmd0aDtlPHI7KytlKXVbZV09dFtlXSxoW3QuY2hhckNvZGVBdChlKV09ZTtoWyItIi5jaGFyQ29kZUF0KDApXT02MixoWyJfIi5jaGFyQ29kZUF0KDApXT02M31mdW5jdGlvbiBwKHQsZSxyKXtmb3IodmFyIG4saSxvPVtdLHM9ZTtzPHI7cys9MyluPSh0W3NdPDwxNikrKHRbcysxXTw8OCkrdFtzKzJdLG8ucHVzaCh1WyhpPW4pPj4xOCY2M10rdVtpPj4xMiY2M10rdVtpPj42JjYzXSt1WzYzJmldKTtyZXR1cm4gby5qb2luKCIiKX1mdW5jdGlvbiBkKHQpe3ZhciBlO2N8fGwoKTtmb3IodmFyIHI9dC5sZW5ndGgsbj1yJTMsaT0iIixvPVtdLHM9MTYzODMsYT0wLGg9ci1uO2E8aDthKz1zKW8ucHVzaChwKHQsYSxhK3M+aD9oOmErcykpO3JldHVybiAxPT09bj8oZT10W3ItMV0saSs9dVtlPj4yXSxpKz11W2U8PDQmNjNdLGkrPSI9PSIpOjI9PT1uJiYoZT0odFtyLTJdPDw4KSt0W3ItMV0saSs9dVtlPj4xMF0saSs9dVtlPj40JjYzXSxpKz11W2U8PDImNjNdLGkrPSI9Iiksby5wdXNoKGkpLG8uam9pbigiIil9ZnVuY3Rpb24gZyh0LGUscixuLGkpe3ZhciBvLHMsYT04Kmktbi0xLHU9KDE8PGEpLTEsaD11Pj4xLGY9LTcsYz1yP2ktMTowLGw9cj8tMToxLHA9dFtlK2NdO2ZvcihjKz1sLG89cCYoMTw8LWYpLTEscD4+PS1mLGYrPWE7Zj4wO289MjU2Km8rdFtlK2NdLGMrPWwsZi09OCk7Zm9yKHM9byYoMTw8LWYpLTEsbz4+PS1mLGYrPW47Zj4wO3M9MjU2KnMrdFtlK2NdLGMrPWwsZi09OCk7aWYoMD09PW8pbz0xLWg7ZWxzZXtpZihvPT09dSlyZXR1cm4gcz9OYU46MS8wKihwPy0xOjEpO3MrPU1hdGgucG93KDIsbiksby09aH1yZXR1cm4ocD8tMToxKSpzKk1hdGgucG93KDIsby1uKX1mdW5jdGlvbiB5KHQsZSxyLG4saSxvKXt2YXIgcyxhLHUsaD04Km8taS0xLGY9KDE8PGgpLTEsYz1mPj4xLGw9MjM9PT1pP01hdGgucG93KDIsLTI0KS1NYXRoLnBvdygyLC03Nyk6MCxwPW4/MDpvLTEsZD1uPzE6LTEsZz1lPDB8fDA9PT1lJiYxL2U8MD8xOjA7Zm9yKGU9TWF0aC5hYnMoZSksaXNOYU4oZSl8fGU9PT0xLzA/KGE9aXNOYU4oZSk/MTowLHM9Zik6KHM9TWF0aC5mbG9vcihNYXRoLmxvZyhlKS9NYXRoLkxOMiksZSoodT1NYXRoLnBvdygyLC1zKSk8MSYmKHMtLSx1Kj0yKSwoZSs9cytjPj0xP2wvdTpsKk1hdGgucG93KDIsMS1jKSkqdT49MiYmKHMrKyx1Lz0yKSxzK2M+PWY/KGE9MCxzPWYpOnMrYz49MT8oYT0oZSp1LTEpKk1hdGgucG93KDIsaSkscys9Yyk6KGE9ZSpNYXRoLnBvdygyLGMtMSkqTWF0aC5wb3coMixpKSxzPTApKTtpPj04O3RbcitwXT0yNTUmYSxwKz1kLGEvPTI1NixpLT04KTtmb3Iocz1zPDxpfGEsaCs9aTtoPjA7dFtyK3BdPTI1NSZzLHArPWQscy89MjU2LGgtPTgpO3RbcitwLWRdfD0xMjgqZ312YXIgdj17fS50b1N0cmluZyxiPUFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKHQpe3JldHVybiJbb2JqZWN0IEFycmF5XSI9PXYuY2FsbCh0KX07ZnVuY3Rpb24gbSgpe3JldHVybiBfLlRZUEVEX0FSUkFZX1NVUFBPUlQ/MjE0NzQ4MzY0NzoxMDczNzQxODIzfWZ1bmN0aW9uIHcodCxlKXtpZihtKCk8ZSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW52YWxpZCB0eXBlZCBhcnJheSBsZW5ndGgiKTtyZXR1cm4gXy5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0PW5ldyBVaW50OEFycmF5KGUpKS5fX3Byb3RvX189Xy5wcm90b3R5cGU6KG51bGw9PT10JiYodD1uZXcgXyhlKSksdC5sZW5ndGg9ZSksdH1mdW5jdGlvbiBfKHQsZSxyKXtpZighKF8uVFlQRURfQVJSQVlfU1VQUE9SVHx8dGhpcyBpbnN0YW5jZW9mIF8pKXJldHVybiBuZXcgXyh0LGUscik7aWYoIm51bWJlciI9PXR5cGVvZiB0KXtpZigic3RyaW5nIj09dHlwZW9mIGUpdGhyb3cgbmV3IEVycm9yKCJJZiBlbmNvZGluZyBpcyBzcGVjaWZpZWQgdGhlbiB0aGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZyIpO3JldHVybiBrKHRoaXMsdCl9cmV0dXJuIFModGhpcyx0LGUscil9ZnVuY3Rpb24gUyh0LGUscixuKXtpZigibnVtYmVyIj09dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcignInZhbHVlIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBhIG51bWJlcicpO3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJmUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcj9mdW5jdGlvbih0LGUscixuKXtpZihlLmJ5dGVMZW5ndGgscjwwfHxlLmJ5dGVMZW5ndGg8cil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiJ29mZnNldCcgaXMgb3V0IG9mIGJvdW5kcyIpO2lmKGUuYnl0ZUxlbmd0aDxyKyhufHwwKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiJ2xlbmd0aCcgaXMgb3V0IG9mIGJvdW5kcyIpO2U9dm9pZCAwPT09ciYmdm9pZCAwPT09bj9uZXcgVWludDhBcnJheShlKTp2b2lkIDA9PT1uP25ldyBVaW50OEFycmF5KGUscik6bmV3IFVpbnQ4QXJyYXkoZSxyLG4pO18uVFlQRURfQVJSQVlfU1VQUE9SVD8odD1lKS5fX3Byb3RvX189Xy5wcm90b3R5cGU6dD1SKHQsZSk7cmV0dXJuIHR9KHQsZSxyLG4pOiJzdHJpbmciPT10eXBlb2YgZT9mdW5jdGlvbih0LGUscil7InN0cmluZyI9PXR5cGVvZiByJiYiIiE9PXJ8fChyPSJ1dGY4Iik7aWYoIV8uaXNFbmNvZGluZyhyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCciZW5jb2RpbmciIG11c3QgYmUgYSB2YWxpZCBzdHJpbmcgZW5jb2RpbmcnKTt2YXIgbj0wfFQoZSxyKTt0PXcodCxuKTt2YXIgaT10LndyaXRlKGUscik7aSE9PW4mJih0PXQuc2xpY2UoMCxpKSk7cmV0dXJuIHR9KHQsZSxyKTpmdW5jdGlvbih0LGUpe2lmKE8oZSkpe3ZhciByPTB8QShlLmxlbmd0aCk7cmV0dXJuIDA9PT0odD13KHQscikpLmxlbmd0aHx8ZS5jb3B5KHQsMCwwLHIpLHR9aWYoZSl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmZS5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcnx8Imxlbmd0aCJpbiBlKXJldHVybiJudW1iZXIiIT10eXBlb2YgZS5sZW5ndGh8fChuPWUubGVuZ3RoKSE9bj93KHQsMCk6Uih0LGUpO2lmKCJCdWZmZXIiPT09ZS50eXBlJiZiKGUuZGF0YSkpcmV0dXJuIFIodCxlLmRhdGEpfXZhciBuO3Rocm93IG5ldyBUeXBlRXJyb3IoIkZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcsIEJ1ZmZlciwgQXJyYXlCdWZmZXIsIEFycmF5LCBvciBhcnJheS1saWtlIG9iamVjdC4iKX0odCxlKX1mdW5jdGlvbiBFKHQpe2lmKCJudW1iZXIiIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCcic2l6ZSIgYXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpO2lmKHQ8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcignInNpemUiIGFyZ3VtZW50IG11c3Qgbm90IGJlIG5lZ2F0aXZlJyl9ZnVuY3Rpb24gayh0LGUpe2lmKEUoZSksdD13KHQsZTwwPzA6MHxBKGUpKSwhXy5UWVBFRF9BUlJBWV9TVVBQT1JUKWZvcih2YXIgcj0wO3I8ZTsrK3IpdFtyXT0wO3JldHVybiB0fWZ1bmN0aW9uIFIodCxlKXt2YXIgcj1lLmxlbmd0aDwwPzA6MHxBKGUubGVuZ3RoKTt0PXcodCxyKTtmb3IodmFyIG49MDtuPHI7bis9MSl0W25dPTI1NSZlW25dO3JldHVybiB0fWZ1bmN0aW9uIEEodCl7aWYodD49bSgpKXRocm93IG5ldyBSYW5nZUVycm9yKCJBdHRlbXB0IHRvIGFsbG9jYXRlIEJ1ZmZlciBsYXJnZXIgdGhhbiBtYXhpbXVtIHNpemU6IDB4IittKCkudG9TdHJpbmcoMTYpKyIgYnl0ZXMiKTtyZXR1cm4gMHx0fWZ1bmN0aW9uIE8odCl7cmV0dXJuIShudWxsPT10fHwhdC5faXNCdWZmZXIpfWZ1bmN0aW9uIFQodCxlKXtpZihPKHQpKXJldHVybiB0Lmxlbmd0aDtpZigidW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiYiZnVuY3Rpb24iPT10eXBlb2YgQXJyYXlCdWZmZXIuaXNWaWV3JiYoQXJyYXlCdWZmZXIuaXNWaWV3KHQpfHx0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpKXJldHVybiB0LmJ5dGVMZW5ndGg7InN0cmluZyIhPXR5cGVvZiB0JiYodD0iIit0KTt2YXIgcj10Lmxlbmd0aDtpZigwPT09cilyZXR1cm4gMDtmb3IodmFyIG49ITE7Oylzd2l0Y2goZSl7Y2FzZSJhc2NpaSI6Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpyZXR1cm4gcjtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOmNhc2Ugdm9pZCAwOnJldHVybiBldCh0KS5sZW5ndGg7Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiAyKnI7Y2FzZSJoZXgiOnJldHVybiByPj4+MTtjYXNlImJhc2U2NCI6cmV0dXJuIHJ0KHQpLmxlbmd0aDtkZWZhdWx0OmlmKG4pcmV0dXJuIGV0KHQpLmxlbmd0aDtlPSgiIitlKS50b0xvd2VyQ2FzZSgpLG49ITB9fWZ1bmN0aW9uIGoodCxlLHIpe3ZhciBuPSExO2lmKCh2b2lkIDA9PT1lfHxlPDApJiYoZT0wKSxlPnRoaXMubGVuZ3RoKXJldHVybiIiO2lmKCh2b2lkIDA9PT1yfHxyPnRoaXMubGVuZ3RoKSYmKHI9dGhpcy5sZW5ndGgpLHI8PTApcmV0dXJuIiI7aWYoKHI+Pj49MCk8PShlPj4+PTApKXJldHVybiIiO2Zvcih0fHwodD0idXRmOCIpOzspc3dpdGNoKHQpe2Nhc2UiaGV4IjpyZXR1cm4gVyh0aGlzLGUscik7Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpyZXR1cm4gRih0aGlzLGUscik7Y2FzZSJhc2NpaSI6cmV0dXJuIHEodGhpcyxlLHIpO2Nhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIFkodGhpcyxlLHIpO2Nhc2UiYmFzZTY0IjpyZXR1cm4gTih0aGlzLGUscik7Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiAkKHRoaXMsZSxyKTtkZWZhdWx0OmlmKG4pdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIit0KTt0PSh0KyIiKS50b0xvd2VyQ2FzZSgpLG49ITB9fWZ1bmN0aW9uIEwodCxlLHIpe3ZhciBuPXRbZV07dFtlXT10W3JdLHRbcl09bn1mdW5jdGlvbiBDKHQsZSxyLG4saSl7aWYoMD09PXQubGVuZ3RoKXJldHVybi0xO2lmKCJzdHJpbmciPT10eXBlb2Ygcj8obj1yLHI9MCk6cj4yMTQ3NDgzNjQ3P3I9MjE0NzQ4MzY0NzpyPC0yMTQ3NDgzNjQ4JiYocj0tMjE0NzQ4MzY0OCkscj0rcixpc05hTihyKSYmKHI9aT8wOnQubGVuZ3RoLTEpLHI8MCYmKHI9dC5sZW5ndGgrcikscj49dC5sZW5ndGgpe2lmKGkpcmV0dXJuLTE7cj10Lmxlbmd0aC0xfWVsc2UgaWYocjwwKXtpZighaSlyZXR1cm4tMTtyPTB9aWYoInN0cmluZyI9PXR5cGVvZiBlJiYoZT1fLmZyb20oZSxuKSksTyhlKSlyZXR1cm4gMD09PWUubGVuZ3RoPy0xOlAodCxlLHIsbixpKTtpZigibnVtYmVyIj09dHlwZW9mIGUpcmV0dXJuIGUmPTI1NSxfLlRZUEVEX0FSUkFZX1NVUFBPUlQmJiJmdW5jdGlvbiI9PXR5cGVvZiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mP2k/VWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKHQsZSxyKTpVaW50OEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZi5jYWxsKHQsZSxyKTpQKHQsW2VdLHIsbixpKTt0aHJvdyBuZXcgVHlwZUVycm9yKCJ2YWwgbXVzdCBiZSBzdHJpbmcsIG51bWJlciBvciBCdWZmZXIiKX1mdW5jdGlvbiBQKHQsZSxyLG4saSl7dmFyIG8scz0xLGE9dC5sZW5ndGgsdT1lLmxlbmd0aDtpZih2b2lkIDAhPT1uJiYoInVjczIiPT09KG49U3RyaW5nKG4pLnRvTG93ZXJDYXNlKCkpfHwidWNzLTIiPT09bnx8InV0ZjE2bGUiPT09bnx8InV0Zi0xNmxlIj09PW4pKXtpZih0Lmxlbmd0aDwyfHxlLmxlbmd0aDwyKXJldHVybi0xO3M9MixhLz0yLHUvPTIsci89Mn1mdW5jdGlvbiBoKHQsZSl7cmV0dXJuIDE9PT1zP3RbZV06dC5yZWFkVUludDE2QkUoZSpzKX1pZihpKXt2YXIgZj0tMTtmb3Iobz1yO288YTtvKyspaWYoaCh0LG8pPT09aChlLC0xPT09Zj8wOm8tZikpe2lmKC0xPT09ZiYmKGY9byksby1mKzE9PT11KXJldHVybiBmKnN9ZWxzZS0xIT09ZiYmKG8tPW8tZiksZj0tMX1lbHNlIGZvcihyK3U+YSYmKHI9YS11KSxvPXI7bz49MDtvLS0pe2Zvcih2YXIgYz0hMCxsPTA7bDx1O2wrKylpZihoKHQsbytsKSE9PWgoZSxsKSl7Yz0hMTticmVha31pZihjKXJldHVybiBvfXJldHVybi0xfWZ1bmN0aW9uIE0odCxlLHIsbil7cj1OdW1iZXIocil8fDA7dmFyIGk9dC5sZW5ndGgtcjtuPyhuPU51bWJlcihuKSk+aSYmKG49aSk6bj1pO3ZhciBvPWUubGVuZ3RoO2lmKG8lMiE9MCl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGhleCBzdHJpbmciKTtuPm8vMiYmKG49by8yKTtmb3IodmFyIHM9MDtzPG47KytzKXt2YXIgYT1wYXJzZUludChlLnN1YnN0cigyKnMsMiksMTYpO2lmKGlzTmFOKGEpKXJldHVybiBzO3RbcitzXT1hfXJldHVybiBzfWZ1bmN0aW9uIEIodCxlLHIsbil7cmV0dXJuIG50KGV0KGUsdC5sZW5ndGgtciksdCxyLG4pfWZ1bmN0aW9uIHgodCxlLHIsbil7cmV0dXJuIG50KGZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1bXSxyPTA7cjx0Lmxlbmd0aDsrK3IpZS5wdXNoKDI1NSZ0LmNoYXJDb2RlQXQocikpO3JldHVybiBlfShlKSx0LHIsbil9ZnVuY3Rpb24gVSh0LGUscixuKXtyZXR1cm4geCh0LGUscixuKX1mdW5jdGlvbiBJKHQsZSxyLG4pe3JldHVybiBudChydChlKSx0LHIsbil9ZnVuY3Rpb24gRCh0LGUscixuKXtyZXR1cm4gbnQoZnVuY3Rpb24odCxlKXtmb3IodmFyIHIsbixpLG89W10scz0wO3M8dC5sZW5ndGgmJiEoKGUtPTIpPDApOysrcyluPShyPXQuY2hhckNvZGVBdChzKSk+PjgsaT1yJTI1NixvLnB1c2goaSksby5wdXNoKG4pO3JldHVybiBvfShlLHQubGVuZ3RoLXIpLHQscixuKX1mdW5jdGlvbiBOKHQsZSxyKXtyZXR1cm4gMD09PWUmJnI9PT10Lmxlbmd0aD9kKHQpOmQodC5zbGljZShlLHIpKX1mdW5jdGlvbiBGKHQsZSxyKXtyPU1hdGgubWluKHQubGVuZ3RoLHIpO2Zvcih2YXIgbj1bXSxpPWU7aTxyOyl7dmFyIG8scyxhLHUsaD10W2ldLGY9bnVsbCxjPWg+MjM5PzQ6aD4yMjM/MzpoPjE5MT8yOjE7aWYoaStjPD1yKXN3aXRjaChjKXtjYXNlIDE6aDwxMjgmJihmPWgpO2JyZWFrO2Nhc2UgMjoxMjg9PSgxOTImKG89dFtpKzFdKSkmJih1PSgzMSZoKTw8Nnw2MyZvKT4xMjcmJihmPXUpO2JyZWFrO2Nhc2UgMzpvPXRbaSsxXSxzPXRbaSsyXSwxMjg9PSgxOTImbykmJjEyOD09KDE5MiZzKSYmKHU9KDE1JmgpPDwxMnwoNjMmbyk8PDZ8NjMmcyk+MjA0NyYmKHU8NTUyOTZ8fHU+NTczNDMpJiYoZj11KTticmVhaztjYXNlIDQ6bz10W2krMV0scz10W2krMl0sYT10W2krM10sMTI4PT0oMTkyJm8pJiYxMjg9PSgxOTImcykmJjEyOD09KDE5MiZhKSYmKHU9KDE1JmgpPDwxOHwoNjMmbyk8PDEyfCg2MyZzKTw8Nnw2MyZhKT42NTUzNSYmdTwxMTE0MTEyJiYoZj11KX1udWxsPT09Zj8oZj02NTUzMyxjPTEpOmY+NjU1MzUmJihmLT02NTUzNixuLnB1c2goZj4+PjEwJjEwMjN8NTUyOTYpLGY9NTYzMjB8MTAyMyZmKSxuLnB1c2goZiksaSs9Y31yZXR1cm4gZnVuY3Rpb24odCl7dmFyIGU9dC5sZW5ndGg7aWYoZTw9eilyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsdCk7dmFyIHI9IiIsbj0wO2Zvcig7bjxlOylyKz1TdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyx0LnNsaWNlKG4sbis9eikpO3JldHVybiByfShuKX1fLlRZUEVEX0FSUkFZX1NVUFBPUlQ9dm9pZCAwPT09YS5UWVBFRF9BUlJBWV9TVVBQT1JUfHxhLlRZUEVEX0FSUkFZX1NVUFBPUlQsbSgpLF8ucG9vbFNpemU9ODE5MixfLl9hdWdtZW50PWZ1bmN0aW9uKHQpe3JldHVybiB0Ll9fcHJvdG9fXz1fLnByb3RvdHlwZSx0fSxfLmZyb209ZnVuY3Rpb24odCxlLHIpe3JldHVybiBTKG51bGwsdCxlLHIpfSxfLlRZUEVEX0FSUkFZX1NVUFBPUlQmJihfLnByb3RvdHlwZS5fX3Byb3RvX189VWludDhBcnJheS5wcm90b3R5cGUsXy5fX3Byb3RvX189VWludDhBcnJheSksXy5hbGxvYz1mdW5jdGlvbih0LGUscil7cmV0dXJuIGZ1bmN0aW9uKHQsZSxyLG4pe3JldHVybiBFKGUpLGU8PTA/dyh0LGUpOnZvaWQgMCE9PXI/InN0cmluZyI9PXR5cGVvZiBuP3codCxlKS5maWxsKHIsbik6dyh0LGUpLmZpbGwocik6dyh0LGUpfShudWxsLHQsZSxyKX0sXy5hbGxvY1Vuc2FmZT1mdW5jdGlvbih0KXtyZXR1cm4gayhudWxsLHQpfSxfLmFsbG9jVW5zYWZlU2xvdz1mdW5jdGlvbih0KXtyZXR1cm4gayhudWxsLHQpfSxfLmlzQnVmZmVyPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsIT10JiYoISF0Ll9pc0J1ZmZlcnx8aXQodCl8fGZ1bmN0aW9uKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0LnJlYWRGbG9hdExFJiYiZnVuY3Rpb24iPT10eXBlb2YgdC5zbGljZSYmaXQodC5zbGljZSgwLDApKX0odCkpfSxfLmNvbXBhcmU9ZnVuY3Rpb24odCxlKXtpZighTyh0KXx8IU8oZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnRzIG11c3QgYmUgQnVmZmVycyIpO2lmKHQ9PT1lKXJldHVybiAwO2Zvcih2YXIgcj10Lmxlbmd0aCxuPWUubGVuZ3RoLGk9MCxvPU1hdGgubWluKHIsbik7aTxvOysraSlpZih0W2ldIT09ZVtpXSl7cj10W2ldLG49ZVtpXTticmVha31yZXR1cm4gcjxuPy0xOm48cj8xOjB9LF8uaXNFbmNvZGluZz1mdW5jdGlvbih0KXtzd2l0Y2goU3RyaW5nKHQpLnRvTG93ZXJDYXNlKCkpe2Nhc2UiaGV4IjpjYXNlInV0ZjgiOmNhc2UidXRmLTgiOmNhc2UiYXNjaWkiOmNhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6Y2FzZSJiYXNlNjQiOmNhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX0sXy5jb25jYXQ9ZnVuY3Rpb24odCxlKXtpZighYih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCcibGlzdCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJyk7aWYoMD09PXQubGVuZ3RoKXJldHVybiBfLmFsbG9jKDApO3ZhciByO2lmKHZvaWQgMD09PWUpZm9yKGU9MCxyPTA7cjx0Lmxlbmd0aDsrK3IpZSs9dFtyXS5sZW5ndGg7dmFyIG49Xy5hbGxvY1Vuc2FmZShlKSxpPTA7Zm9yKHI9MDtyPHQubGVuZ3RoOysrcil7dmFyIG89dFtyXTtpZighTyhvKSl0aHJvdyBuZXcgVHlwZUVycm9yKCcibGlzdCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJyk7by5jb3B5KG4saSksaSs9by5sZW5ndGh9cmV0dXJuIG59LF8uYnl0ZUxlbmd0aD1ULF8ucHJvdG90eXBlLl9pc0J1ZmZlcj0hMCxfLnByb3RvdHlwZS5zd2FwMTY9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmxlbmd0aDtpZih0JTIhPTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi1iaXRzIik7Zm9yKHZhciBlPTA7ZTx0O2UrPTIpTCh0aGlzLGUsZSsxKTtyZXR1cm4gdGhpc30sXy5wcm90b3R5cGUuc3dhcDMyPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5sZW5ndGg7aWYodCU0IT0wKXRocm93IG5ldyBSYW5nZUVycm9yKCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMzItYml0cyIpO2Zvcih2YXIgZT0wO2U8dDtlKz00KUwodGhpcyxlLGUrMyksTCh0aGlzLGUrMSxlKzIpO3JldHVybiB0aGlzfSxfLnByb3RvdHlwZS5zd2FwNjQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmxlbmd0aDtpZih0JTghPTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA2NC1iaXRzIik7Zm9yKHZhciBlPTA7ZTx0O2UrPTgpTCh0aGlzLGUsZSs3KSxMKHRoaXMsZSsxLGUrNiksTCh0aGlzLGUrMixlKzUpLEwodGhpcyxlKzMsZSs0KTtyZXR1cm4gdGhpc30sXy5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXt2YXIgdD0wfHRoaXMubGVuZ3RoO3JldHVybiAwPT09dD8iIjowPT09YXJndW1lbnRzLmxlbmd0aD9GKHRoaXMsMCx0KTpqLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sXy5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKHQpe2lmKCFPKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIiKTtyZXR1cm4gdGhpcz09PXR8fDA9PT1fLmNvbXBhcmUodGhpcyx0KX0sXy5wcm90b3R5cGUuaW5zcGVjdD1mdW5jdGlvbigpe3ZhciB0PSIiO3JldHVybiB0aGlzLmxlbmd0aD4wJiYodD10aGlzLnRvU3RyaW5nKCJoZXgiLDAsNTApLm1hdGNoKC8uezJ9L2cpLmpvaW4oIiAiKSx0aGlzLmxlbmd0aD41MCYmKHQrPSIgLi4uICIpKSwiPEJ1ZmZlciAiK3QrIj4ifSxfLnByb3RvdHlwZS5jb21wYXJlPWZ1bmN0aW9uKHQsZSxyLG4saSl7aWYoIU8odCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciIpO2lmKHZvaWQgMD09PWUmJihlPTApLHZvaWQgMD09PXImJihyPXQ/dC5sZW5ndGg6MCksdm9pZCAwPT09biYmKG49MCksdm9pZCAwPT09aSYmKGk9dGhpcy5sZW5ndGgpLGU8MHx8cj50Lmxlbmd0aHx8bjwwfHxpPnRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJvdXQgb2YgcmFuZ2UgaW5kZXgiKTtpZihuPj1pJiZlPj1yKXJldHVybiAwO2lmKG4+PWkpcmV0dXJuLTE7aWYoZT49cilyZXR1cm4gMTtpZih0aGlzPT09dClyZXR1cm4gMDtmb3IodmFyIG89KGk+Pj49MCktKG4+Pj49MCkscz0ocj4+Pj0wKS0oZT4+Pj0wKSxhPU1hdGgubWluKG8scyksdT10aGlzLnNsaWNlKG4saSksaD10LnNsaWNlKGUsciksZj0wO2Y8YTsrK2YpaWYodVtmXSE9PWhbZl0pe289dVtmXSxzPWhbZl07YnJlYWt9cmV0dXJuIG88cz8tMTpzPG8/MTowfSxfLnByb3RvdHlwZS5pbmNsdWRlcz1mdW5jdGlvbih0LGUscil7cmV0dXJuLTEhPT10aGlzLmluZGV4T2YodCxlLHIpfSxfLnByb3RvdHlwZS5pbmRleE9mPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gQyh0aGlzLHQsZSxyLCEwKX0sXy5wcm90b3R5cGUubGFzdEluZGV4T2Y9ZnVuY3Rpb24odCxlLHIpe3JldHVybiBDKHRoaXMsdCxlLHIsITEpfSxfLnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbih0LGUscixuKXtpZih2b2lkIDA9PT1lKW49InV0ZjgiLHI9dGhpcy5sZW5ndGgsZT0wO2Vsc2UgaWYodm9pZCAwPT09ciYmInN0cmluZyI9PXR5cGVvZiBlKW49ZSxyPXRoaXMubGVuZ3RoLGU9MDtlbHNle2lmKCFpc0Zpbml0ZShlKSl0aHJvdyBuZXcgRXJyb3IoIkJ1ZmZlci53cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXRbLCBsZW5ndGhdKSBpcyBubyBsb25nZXIgc3VwcG9ydGVkIik7ZXw9MCxpc0Zpbml0ZShyKT8ocnw9MCx2b2lkIDA9PT1uJiYobj0idXRmOCIpKToobj1yLHI9dm9pZCAwKX12YXIgaT10aGlzLmxlbmd0aC1lO2lmKCh2b2lkIDA9PT1yfHxyPmkpJiYocj1pKSx0Lmxlbmd0aD4wJiYocjwwfHxlPDApfHxlPnRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJBdHRlbXB0IHRvIHdyaXRlIG91dHNpZGUgYnVmZmVyIGJvdW5kcyIpO258fChuPSJ1dGY4Iik7Zm9yKHZhciBvPSExOzspc3dpdGNoKG4pe2Nhc2UiaGV4IjpyZXR1cm4gTSh0aGlzLHQsZSxyKTtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOnJldHVybiBCKHRoaXMsdCxlLHIpO2Nhc2UiYXNjaWkiOnJldHVybiB4KHRoaXMsdCxlLHIpO2Nhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIFUodGhpcyx0LGUscik7Y2FzZSJiYXNlNjQiOnJldHVybiBJKHRoaXMsdCxlLHIpO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gRCh0aGlzLHQsZSxyKTtkZWZhdWx0OmlmKG8pdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIituKTtuPSgiIituKS50b0xvd2VyQ2FzZSgpLG89ITB9fSxfLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm57dHlwZToiQnVmZmVyIixkYXRhOkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX2Fycnx8dGhpcywwKX19O3ZhciB6PTQwOTY7ZnVuY3Rpb24gcSh0LGUscil7dmFyIG49IiI7cj1NYXRoLm1pbih0Lmxlbmd0aCxyKTtmb3IodmFyIGk9ZTtpPHI7KytpKW4rPVN0cmluZy5mcm9tQ2hhckNvZGUoMTI3JnRbaV0pO3JldHVybiBufWZ1bmN0aW9uIFkodCxlLHIpe3ZhciBuPSIiO3I9TWF0aC5taW4odC5sZW5ndGgscik7Zm9yKHZhciBpPWU7aTxyOysraSluKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHRbaV0pO3JldHVybiBufWZ1bmN0aW9uIFcodCxlLHIpe3ZhciBuPXQubGVuZ3RoOyghZXx8ZTwwKSYmKGU9MCksKCFyfHxyPDB8fHI+bikmJihyPW4pO2Zvcih2YXIgaT0iIixvPWU7bzxyOysrbylpKz10dCh0W29dKTtyZXR1cm4gaX1mdW5jdGlvbiAkKHQsZSxyKXtmb3IodmFyIG49dC5zbGljZShlLHIpLGk9IiIsbz0wO288bi5sZW5ndGg7bys9MilpKz1TdHJpbmcuZnJvbUNoYXJDb2RlKG5bb10rMjU2Km5bbysxXSk7cmV0dXJuIGl9ZnVuY3Rpb24gRyh0LGUscil7aWYodCUxIT0wfHx0PDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm9mZnNldCBpcyBub3QgdWludCIpO2lmKHQrZT5yKXRocm93IG5ldyBSYW5nZUVycm9yKCJUcnlpbmcgdG8gYWNjZXNzIGJleW9uZCBidWZmZXIgbGVuZ3RoIil9ZnVuY3Rpb24gSih0LGUscixuLGksbyl7aWYoIU8odCkpdGhyb3cgbmV3IFR5cGVFcnJvcignImJ1ZmZlciIgYXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciBpbnN0YW5jZScpO2lmKGU+aXx8ZTxvKXRocm93IG5ldyBSYW5nZUVycm9yKCcidmFsdWUiIGFyZ3VtZW50IGlzIG91dCBvZiBib3VuZHMnKTtpZihyK24+dC5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpfWZ1bmN0aW9uIEgodCxlLHIsbil7ZTwwJiYoZT02NTUzNStlKzEpO2Zvcih2YXIgaT0wLG89TWF0aC5taW4odC5sZW5ndGgtciwyKTtpPG87KytpKXRbcitpXT0oZSYyNTU8PDgqKG4/aToxLWkpKT4+PjgqKG4/aToxLWkpfWZ1bmN0aW9uIFYodCxlLHIsbil7ZTwwJiYoZT00Mjk0OTY3Mjk1K2UrMSk7Zm9yKHZhciBpPTAsbz1NYXRoLm1pbih0Lmxlbmd0aC1yLDQpO2k8bzsrK2kpdFtyK2ldPWU+Pj44KihuP2k6My1pKSYyNTV9ZnVuY3Rpb24gSyh0LGUscixuLGksbyl7aWYocituPnQubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKTtpZihyPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpfWZ1bmN0aW9uIFoodCxlLHIsbixpKXtyZXR1cm4gaXx8Syh0LDAsciw0KSx5KHQsZSxyLG4sMjMsNCkscis0fWZ1bmN0aW9uIFEodCxlLHIsbixpKXtyZXR1cm4gaXx8Syh0LDAsciw4KSx5KHQsZSxyLG4sNTIsOCkscis4fV8ucHJvdG90eXBlLnNsaWNlPWZ1bmN0aW9uKHQsZSl7dmFyIHIsbj10aGlzLmxlbmd0aDtpZigodD1+fnQpPDA/KHQrPW4pPDAmJih0PTApOnQ+biYmKHQ9biksKGU9dm9pZCAwPT09ZT9uOn5+ZSk8MD8oZSs9bik8MCYmKGU9MCk6ZT5uJiYoZT1uKSxlPHQmJihlPXQpLF8uVFlQRURfQVJSQVlfU1VQUE9SVCkocj10aGlzLnN1YmFycmF5KHQsZSkpLl9fcHJvdG9fXz1fLnByb3RvdHlwZTtlbHNle3ZhciBpPWUtdDtyPW5ldyBfKGksdm9pZCAwKTtmb3IodmFyIG89MDtvPGk7KytvKXJbb109dGhpc1tvK3RdfXJldHVybiByfSxfLnByb3RvdHlwZS5yZWFkVUludExFPWZ1bmN0aW9uKHQsZSxyKXt0fD0wLGV8PTAscnx8Ryh0LGUsdGhpcy5sZW5ndGgpO2Zvcih2YXIgbj10aGlzW3RdLGk9MSxvPTA7KytvPGUmJihpKj0yNTYpOyluKz10aGlzW3Qrb10qaTtyZXR1cm4gbn0sXy5wcm90b3R5cGUucmVhZFVJbnRCRT1mdW5jdGlvbih0LGUscil7dHw9MCxlfD0wLHJ8fEcodCxlLHRoaXMubGVuZ3RoKTtmb3IodmFyIG49dGhpc1t0Ky0tZV0saT0xO2U+MCYmKGkqPTI1Nik7KW4rPXRoaXNbdCstLWVdKmk7cmV0dXJuIG59LF8ucHJvdG90eXBlLnJlYWRVSW50OD1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxHKHQsMSx0aGlzLmxlbmd0aCksdGhpc1t0XX0sXy5wcm90b3R5cGUucmVhZFVJbnQxNkxFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fEcodCwyLHRoaXMubGVuZ3RoKSx0aGlzW3RdfHRoaXNbdCsxXTw8OH0sXy5wcm90b3R5cGUucmVhZFVJbnQxNkJFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fEcodCwyLHRoaXMubGVuZ3RoKSx0aGlzW3RdPDw4fHRoaXNbdCsxXX0sXy5wcm90b3R5cGUucmVhZFVJbnQzMkxFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fEcodCw0LHRoaXMubGVuZ3RoKSwodGhpc1t0XXx0aGlzW3QrMV08PDh8dGhpc1t0KzJdPDwxNikrMTY3NzcyMTYqdGhpc1t0KzNdfSxfLnByb3RvdHlwZS5yZWFkVUludDMyQkU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Ryh0LDQsdGhpcy5sZW5ndGgpLDE2Nzc3MjE2KnRoaXNbdF0rKHRoaXNbdCsxXTw8MTZ8dGhpc1t0KzJdPDw4fHRoaXNbdCszXSl9LF8ucHJvdG90eXBlLnJlYWRJbnRMRT1mdW5jdGlvbih0LGUscil7dHw9MCxlfD0wLHJ8fEcodCxlLHRoaXMubGVuZ3RoKTtmb3IodmFyIG49dGhpc1t0XSxpPTEsbz0wOysrbzxlJiYoaSo9MjU2KTspbis9dGhpc1t0K29dKmk7cmV0dXJuIG4+PShpKj0xMjgpJiYobi09TWF0aC5wb3coMiw4KmUpKSxufSxfLnByb3RvdHlwZS5yZWFkSW50QkU9ZnVuY3Rpb24odCxlLHIpe3R8PTAsZXw9MCxyfHxHKHQsZSx0aGlzLmxlbmd0aCk7Zm9yKHZhciBuPWUsaT0xLG89dGhpc1t0Ky0tbl07bj4wJiYoaSo9MjU2KTspbys9dGhpc1t0Ky0tbl0qaTtyZXR1cm4gbz49KGkqPTEyOCkmJihvLT1NYXRoLnBvdygyLDgqZSkpLG99LF8ucHJvdG90eXBlLnJlYWRJbnQ4PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fEcodCwxLHRoaXMubGVuZ3RoKSwxMjgmdGhpc1t0XT8tMSooMjU1LXRoaXNbdF0rMSk6dGhpc1t0XX0sXy5wcm90b3R5cGUucmVhZEludDE2TEU9ZnVuY3Rpb24odCxlKXtlfHxHKHQsMix0aGlzLmxlbmd0aCk7dmFyIHI9dGhpc1t0XXx0aGlzW3QrMV08PDg7cmV0dXJuIDMyNzY4JnI/NDI5NDkwMTc2MHxyOnJ9LF8ucHJvdG90eXBlLnJlYWRJbnQxNkJFPWZ1bmN0aW9uKHQsZSl7ZXx8Ryh0LDIsdGhpcy5sZW5ndGgpO3ZhciByPXRoaXNbdCsxXXx0aGlzW3RdPDw4O3JldHVybiAzMjc2OCZyPzQyOTQ5MDE3NjB8cjpyfSxfLnByb3RvdHlwZS5yZWFkSW50MzJMRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxHKHQsNCx0aGlzLmxlbmd0aCksdGhpc1t0XXx0aGlzW3QrMV08PDh8dGhpc1t0KzJdPDwxNnx0aGlzW3QrM108PDI0fSxfLnByb3RvdHlwZS5yZWFkSW50MzJCRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxHKHQsNCx0aGlzLmxlbmd0aCksdGhpc1t0XTw8MjR8dGhpc1t0KzFdPDwxNnx0aGlzW3QrMl08PDh8dGhpc1t0KzNdfSxfLnByb3RvdHlwZS5yZWFkRmxvYXRMRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxHKHQsNCx0aGlzLmxlbmd0aCksZyh0aGlzLHQsITAsMjMsNCl9LF8ucHJvdG90eXBlLnJlYWRGbG9hdEJFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fEcodCw0LHRoaXMubGVuZ3RoKSxnKHRoaXMsdCwhMSwyMyw0KX0sXy5wcm90b3R5cGUucmVhZERvdWJsZUxFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fEcodCw4LHRoaXMubGVuZ3RoKSxnKHRoaXMsdCwhMCw1Miw4KX0sXy5wcm90b3R5cGUucmVhZERvdWJsZUJFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fEcodCw4LHRoaXMubGVuZ3RoKSxnKHRoaXMsdCwhMSw1Miw4KX0sXy5wcm90b3R5cGUud3JpdGVVSW50TEU9ZnVuY3Rpb24odCxlLHIsbil7KHQ9K3QsZXw9MCxyfD0wLG4pfHxKKHRoaXMsdCxlLHIsTWF0aC5wb3coMiw4KnIpLTEsMCk7dmFyIGk9MSxvPTA7Zm9yKHRoaXNbZV09MjU1JnQ7KytvPHImJihpKj0yNTYpOyl0aGlzW2Urb109dC9pJjI1NTtyZXR1cm4gZStyfSxfLnByb3RvdHlwZS53cml0ZVVJbnRCRT1mdW5jdGlvbih0LGUscixuKXsodD0rdCxlfD0wLHJ8PTAsbil8fEoodGhpcyx0LGUscixNYXRoLnBvdygyLDgqciktMSwwKTt2YXIgaT1yLTEsbz0xO2Zvcih0aGlzW2UraV09MjU1JnQ7LS1pPj0wJiYobyo9MjU2KTspdGhpc1tlK2ldPXQvbyYyNTU7cmV0dXJuIGUrcn0sXy5wcm90b3R5cGUud3JpdGVVSW50OD1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9K3QsZXw9MCxyfHxKKHRoaXMsdCxlLDEsMjU1LDApLF8uVFlQRURfQVJSQVlfU1VQUE9SVHx8KHQ9TWF0aC5mbG9vcih0KSksdGhpc1tlXT0yNTUmdCxlKzF9LF8ucHJvdG90eXBlLndyaXRlVUludDE2TEU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0PSt0LGV8PTAscnx8Sih0aGlzLHQsZSwyLDY1NTM1LDApLF8uVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT0yNTUmdCx0aGlzW2UrMV09dD4+PjgpOkgodGhpcyx0LGUsITApLGUrMn0sXy5wcm90b3R5cGUud3JpdGVVSW50MTZCRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9K3QsZXw9MCxyfHxKKHRoaXMsdCxlLDIsNjU1MzUsMCksXy5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPXQ+Pj44LHRoaXNbZSsxXT0yNTUmdCk6SCh0aGlzLHQsZSwhMSksZSsyfSxfLnByb3RvdHlwZS53cml0ZVVJbnQzMkxFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD0rdCxlfD0wLHJ8fEoodGhpcyx0LGUsNCw0Mjk0OTY3Mjk1LDApLF8uVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlKzNdPXQ+Pj4yNCx0aGlzW2UrMl09dD4+PjE2LHRoaXNbZSsxXT10Pj4+OCx0aGlzW2VdPTI1NSZ0KTpWKHRoaXMsdCxlLCEwKSxlKzR9LF8ucHJvdG90eXBlLndyaXRlVUludDMyQkU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0PSt0LGV8PTAscnx8Sih0aGlzLHQsZSw0LDQyOTQ5NjcyOTUsMCksXy5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPXQ+Pj4yNCx0aGlzW2UrMV09dD4+PjE2LHRoaXNbZSsyXT10Pj4+OCx0aGlzW2UrM109MjU1JnQpOlYodGhpcyx0LGUsITEpLGUrNH0sXy5wcm90b3R5cGUud3JpdGVJbnRMRT1mdW5jdGlvbih0LGUscixuKXtpZih0PSt0LGV8PTAsIW4pe3ZhciBpPU1hdGgucG93KDIsOCpyLTEpO0oodGhpcyx0LGUscixpLTEsLWkpfXZhciBvPTAscz0xLGE9MDtmb3IodGhpc1tlXT0yNTUmdDsrK288ciYmKHMqPTI1Nik7KXQ8MCYmMD09PWEmJjAhPT10aGlzW2Urby0xXSYmKGE9MSksdGhpc1tlK29dPSh0L3M+PjApLWEmMjU1O3JldHVybiBlK3J9LF8ucHJvdG90eXBlLndyaXRlSW50QkU9ZnVuY3Rpb24odCxlLHIsbil7aWYodD0rdCxlfD0wLCFuKXt2YXIgaT1NYXRoLnBvdygyLDgqci0xKTtKKHRoaXMsdCxlLHIsaS0xLC1pKX12YXIgbz1yLTEscz0xLGE9MDtmb3IodGhpc1tlK29dPTI1NSZ0Oy0tbz49MCYmKHMqPTI1Nik7KXQ8MCYmMD09PWEmJjAhPT10aGlzW2UrbysxXSYmKGE9MSksdGhpc1tlK29dPSh0L3M+PjApLWEmMjU1O3JldHVybiBlK3J9LF8ucHJvdG90eXBlLndyaXRlSW50OD1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9K3QsZXw9MCxyfHxKKHRoaXMsdCxlLDEsMTI3LC0xMjgpLF8uVFlQRURfQVJSQVlfU1VQUE9SVHx8KHQ9TWF0aC5mbG9vcih0KSksdDwwJiYodD0yNTUrdCsxKSx0aGlzW2VdPTI1NSZ0LGUrMX0sXy5wcm90b3R5cGUud3JpdGVJbnQxNkxFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD0rdCxlfD0wLHJ8fEoodGhpcyx0LGUsMiwzMjc2NywtMzI3NjgpLF8uVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT0yNTUmdCx0aGlzW2UrMV09dD4+PjgpOkgodGhpcyx0LGUsITApLGUrMn0sXy5wcm90b3R5cGUud3JpdGVJbnQxNkJFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD0rdCxlfD0wLHJ8fEoodGhpcyx0LGUsMiwzMjc2NywtMzI3NjgpLF8uVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT10Pj4+OCx0aGlzW2UrMV09MjU1JnQpOkgodGhpcyx0LGUsITEpLGUrMn0sXy5wcm90b3R5cGUud3JpdGVJbnQzMkxFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD0rdCxlfD0wLHJ8fEoodGhpcyx0LGUsNCwyMTQ3NDgzNjQ3LC0yMTQ3NDgzNjQ4KSxfLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZV09MjU1JnQsdGhpc1tlKzFdPXQ+Pj44LHRoaXNbZSsyXT10Pj4+MTYsdGhpc1tlKzNdPXQ+Pj4yNCk6Vih0aGlzLHQsZSwhMCksZSs0fSxfLnByb3RvdHlwZS53cml0ZUludDMyQkU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0PSt0LGV8PTAscnx8Sih0aGlzLHQsZSw0LDIxNDc0ODM2NDcsLTIxNDc0ODM2NDgpLHQ8MCYmKHQ9NDI5NDk2NzI5NSt0KzEpLF8uVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT10Pj4+MjQsdGhpc1tlKzFdPXQ+Pj4xNix0aGlzW2UrMl09dD4+PjgsdGhpc1tlKzNdPTI1NSZ0KTpWKHRoaXMsdCxlLCExKSxlKzR9LF8ucHJvdG90eXBlLndyaXRlRmxvYXRMRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIFoodGhpcyx0LGUsITAscil9LF8ucHJvdG90eXBlLndyaXRlRmxvYXRCRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIFoodGhpcyx0LGUsITEscil9LF8ucHJvdG90eXBlLndyaXRlRG91YmxlTEU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiBRKHRoaXMsdCxlLCEwLHIpfSxfLnByb3RvdHlwZS53cml0ZURvdWJsZUJFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gUSh0aGlzLHQsZSwhMSxyKX0sXy5wcm90b3R5cGUuY29weT1mdW5jdGlvbih0LGUscixuKXtpZihyfHwocj0wKSxufHwwPT09bnx8KG49dGhpcy5sZW5ndGgpLGU+PXQubGVuZ3RoJiYoZT10Lmxlbmd0aCksZXx8KGU9MCksbj4wJiZuPHImJihuPXIpLG49PT1yKXJldHVybiAwO2lmKDA9PT10Lmxlbmd0aHx8MD09PXRoaXMubGVuZ3RoKXJldHVybiAwO2lmKGU8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigidGFyZ2V0U3RhcnQgb3V0IG9mIGJvdW5kcyIpO2lmKHI8MHx8cj49dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoInNvdXJjZVN0YXJ0IG91dCBvZiBib3VuZHMiKTtpZihuPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoInNvdXJjZUVuZCBvdXQgb2YgYm91bmRzIik7bj50aGlzLmxlbmd0aCYmKG49dGhpcy5sZW5ndGgpLHQubGVuZ3RoLWU8bi1yJiYobj10Lmxlbmd0aC1lK3IpO3ZhciBpLG89bi1yO2lmKHRoaXM9PT10JiZyPGUmJmU8bilmb3IoaT1vLTE7aT49MDstLWkpdFtpK2VdPXRoaXNbaStyXTtlbHNlIGlmKG88MWUzfHwhXy5UWVBFRF9BUlJBWV9TVVBQT1JUKWZvcihpPTA7aTxvOysraSl0W2krZV09dGhpc1tpK3JdO2Vsc2UgVWludDhBcnJheS5wcm90b3R5cGUuc2V0LmNhbGwodCx0aGlzLnN1YmFycmF5KHIscitvKSxlKTtyZXR1cm4gb30sXy5wcm90b3R5cGUuZmlsbD1mdW5jdGlvbih0LGUscixuKXtpZigic3RyaW5nIj09dHlwZW9mIHQpe2lmKCJzdHJpbmciPT10eXBlb2YgZT8obj1lLGU9MCxyPXRoaXMubGVuZ3RoKToic3RyaW5nIj09dHlwZW9mIHImJihuPXIscj10aGlzLmxlbmd0aCksMT09PXQubGVuZ3RoKXt2YXIgaT10LmNoYXJDb2RlQXQoMCk7aTwyNTYmJih0PWkpfWlmKHZvaWQgMCE9PW4mJiJzdHJpbmciIT10eXBlb2Ygbil0aHJvdyBuZXcgVHlwZUVycm9yKCJlbmNvZGluZyBtdXN0IGJlIGEgc3RyaW5nIik7aWYoInN0cmluZyI9PXR5cGVvZiBuJiYhXy5pc0VuY29kaW5nKG4pKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrbil9ZWxzZSJudW1iZXIiPT10eXBlb2YgdCYmKHQmPTI1NSk7aWYoZTwwfHx0aGlzLmxlbmd0aDxlfHx0aGlzLmxlbmd0aDxyKXRocm93IG5ldyBSYW5nZUVycm9yKCJPdXQgb2YgcmFuZ2UgaW5kZXgiKTtpZihyPD1lKXJldHVybiB0aGlzO3ZhciBvO2lmKGU+Pj49MCxyPXZvaWQgMD09PXI/dGhpcy5sZW5ndGg6cj4+PjAsdHx8KHQ9MCksIm51bWJlciI9PXR5cGVvZiB0KWZvcihvPWU7bzxyOysrbyl0aGlzW29dPXQ7ZWxzZXt2YXIgcz1PKHQpP3Q6ZXQobmV3IF8odCxuKS50b1N0cmluZygpKSxhPXMubGVuZ3RoO2ZvcihvPTA7bzxyLWU7KytvKXRoaXNbbytlXT1zW28lYV19cmV0dXJuIHRoaXN9O3ZhciBYPS9bXitcLzAtOUEtWmEtei1fXS9nO2Z1bmN0aW9uIHR0KHQpe3JldHVybiB0PDE2PyIwIit0LnRvU3RyaW5nKDE2KTp0LnRvU3RyaW5nKDE2KX1mdW5jdGlvbiBldCh0LGUpe3ZhciByO2U9ZXx8MS8wO2Zvcih2YXIgbj10Lmxlbmd0aCxpPW51bGwsbz1bXSxzPTA7czxuOysrcyl7aWYoKHI9dC5jaGFyQ29kZUF0KHMpKT41NTI5NSYmcjw1NzM0NCl7aWYoIWkpe2lmKHI+NTYzMTkpeyhlLT0zKT4tMSYmby5wdXNoKDIzOSwxOTEsMTg5KTtjb250aW51ZX1pZihzKzE9PT1uKXsoZS09Myk+LTEmJm8ucHVzaCgyMzksMTkxLDE4OSk7Y29udGludWV9aT1yO2NvbnRpbnVlfWlmKHI8NTYzMjApeyhlLT0zKT4tMSYmby5wdXNoKDIzOSwxOTEsMTg5KSxpPXI7Y29udGludWV9cj02NTUzNisoaS01NTI5Njw8MTB8ci01NjMyMCl9ZWxzZSBpJiYoZS09Myk+LTEmJm8ucHVzaCgyMzksMTkxLDE4OSk7aWYoaT1udWxsLHI8MTI4KXtpZigoZS09MSk8MClicmVhaztvLnB1c2gocil9ZWxzZSBpZihyPDIwNDgpe2lmKChlLT0yKTwwKWJyZWFrO28ucHVzaChyPj42fDE5Miw2MyZyfDEyOCl9ZWxzZSBpZihyPDY1NTM2KXtpZigoZS09Myk8MClicmVhaztvLnB1c2gocj4+MTJ8MjI0LHI+PjYmNjN8MTI4LDYzJnJ8MTI4KX1lbHNle2lmKCEocjwxMTE0MTEyKSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgY29kZSBwb2ludCIpO2lmKChlLT00KTwwKWJyZWFrO28ucHVzaChyPj4xOHwyNDAscj4+MTImNjN8MTI4LHI+PjYmNjN8MTI4LDYzJnJ8MTI4KX19cmV0dXJuIG99ZnVuY3Rpb24gcnQodCl7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBlLHIsbixpLG8scztjfHxsKCk7dmFyIGE9dC5sZW5ndGg7aWYoYSU0PjApdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIHN0cmluZy4gTGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0Iik7bz0iPSI9PT10W2EtMl0/MjoiPSI9PT10W2EtMV0/MTowLHM9bmV3IGYoMyphLzQtbyksbj1vPjA/YS00OmE7dmFyIHU9MDtmb3IoZT0wLHI9MDtlPG47ZSs9NCxyKz0zKWk9aFt0LmNoYXJDb2RlQXQoZSldPDwxOHxoW3QuY2hhckNvZGVBdChlKzEpXTw8MTJ8aFt0LmNoYXJDb2RlQXQoZSsyKV08PDZ8aFt0LmNoYXJDb2RlQXQoZSszKV0sc1t1KytdPWk+PjE2JjI1NSxzW3UrK109aT4+OCYyNTUsc1t1KytdPTI1NSZpO3JldHVybiAyPT09bz8oaT1oW3QuY2hhckNvZGVBdChlKV08PDJ8aFt0LmNoYXJDb2RlQXQoZSsxKV0+PjQsc1t1KytdPTI1NSZpKToxPT09byYmKGk9aFt0LmNoYXJDb2RlQXQoZSldPDwxMHxoW3QuY2hhckNvZGVBdChlKzEpXTw8NHxoW3QuY2hhckNvZGVBdChlKzIpXT4+MixzW3UrK109aT4+OCYyNTUsc1t1KytdPTI1NSZpKSxzfShmdW5jdGlvbih0KXtpZigodD1mdW5jdGlvbih0KXtyZXR1cm4gdC50cmltP3QudHJpbSgpOnQucmVwbGFjZSgvXlxzK3xccyskL2csIiIpfSh0KS5yZXBsYWNlKFgsIiIpKS5sZW5ndGg8MilyZXR1cm4iIjtmb3IoO3QubGVuZ3RoJTQhPTA7KXQrPSI9IjtyZXR1cm4gdH0odCkpfWZ1bmN0aW9uIG50KHQsZSxyLG4pe2Zvcih2YXIgaT0wO2k8biYmIShpK3I+PWUubGVuZ3RofHxpPj10Lmxlbmd0aCk7KytpKWVbaStyXT10W2ldO3JldHVybiBpfWZ1bmN0aW9uIGl0KHQpe3JldHVybiEhdC5jb25zdHJ1Y3RvciYmImZ1bmN0aW9uIj09dHlwZW9mIHQuY29uc3RydWN0b3IuaXNCdWZmZXImJnQuY29uc3RydWN0b3IuaXNCdWZmZXIodCl9ZnVuY3Rpb24gb3QoKXt0aHJvdyBuZXcgRXJyb3IoInNldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQiKX1mdW5jdGlvbiBzdCgpe3Rocm93IG5ldyBFcnJvcigiY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkIil9dmFyIGF0PW90LHV0PXN0O2Z1bmN0aW9uIGh0KHQpe2lmKGF0PT09c2V0VGltZW91dClyZXR1cm4gc2V0VGltZW91dCh0LDApO2lmKChhdD09PW90fHwhYXQpJiZzZXRUaW1lb3V0KXJldHVybiBhdD1zZXRUaW1lb3V0LHNldFRpbWVvdXQodCwwKTt0cnl7cmV0dXJuIGF0KHQsMCl9Y2F0Y2goZSl7dHJ5e3JldHVybiBhdC5jYWxsKG51bGwsdCwwKX1jYXRjaChlKXtyZXR1cm4gYXQuY2FsbCh0aGlzLHQsMCl9fX0iZnVuY3Rpb24iPT10eXBlb2YgYS5zZXRUaW1lb3V0JiYoYXQ9c2V0VGltZW91dCksImZ1bmN0aW9uIj09dHlwZW9mIGEuY2xlYXJUaW1lb3V0JiYodXQ9Y2xlYXJUaW1lb3V0KTt2YXIgZnQsY3Q9W10sbHQ9ITEscHQ9LTE7ZnVuY3Rpb24gZHQoKXtsdCYmZnQmJihsdD0hMSxmdC5sZW5ndGg/Y3Q9ZnQuY29uY2F0KGN0KTpwdD0tMSxjdC5sZW5ndGgmJmd0KCkpfWZ1bmN0aW9uIGd0KCl7aWYoIWx0KXt2YXIgdD1odChkdCk7bHQ9ITA7Zm9yKHZhciBlPWN0Lmxlbmd0aDtlOyl7Zm9yKGZ0PWN0LGN0PVtdOysrcHQ8ZTspZnQmJmZ0W3B0XS5ydW4oKTtwdD0tMSxlPWN0Lmxlbmd0aH1mdD1udWxsLGx0PSExLGZ1bmN0aW9uKHQpe2lmKHV0PT09Y2xlYXJUaW1lb3V0KXJldHVybiBjbGVhclRpbWVvdXQodCk7aWYoKHV0PT09c3R8fCF1dCkmJmNsZWFyVGltZW91dClyZXR1cm4gdXQ9Y2xlYXJUaW1lb3V0LGNsZWFyVGltZW91dCh0KTt0cnl7cmV0dXJuIHV0KHQpfWNhdGNoKGUpe3RyeXtyZXR1cm4gdXQuY2FsbChudWxsLHQpfWNhdGNoKGUpe3JldHVybiB1dC5jYWxsKHRoaXMsdCl9fX0odCl9fWZ1bmN0aW9uIHl0KHQpe3ZhciBlPW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoLTEpO2lmKGFyZ3VtZW50cy5sZW5ndGg+MSlmb3IodmFyIHI9MTtyPGFyZ3VtZW50cy5sZW5ndGg7cisrKWVbci0xXT1hcmd1bWVudHNbcl07Y3QucHVzaChuZXcgdnQodCxlKSksMSE9PWN0Lmxlbmd0aHx8bHR8fGh0KGd0KX1mdW5jdGlvbiB2dCh0LGUpe3RoaXMuZnVuPXQsdGhpcy5hcnJheT1lfXZ0LnByb3RvdHlwZS5ydW49ZnVuY3Rpb24oKXt0aGlzLmZ1bi5hcHBseShudWxsLHRoaXMuYXJyYXkpfTtmdW5jdGlvbiBidCgpe312YXIgbXQ9YnQsd3Q9YnQsX3Q9YnQsU3Q9YnQsRXQ9YnQsa3Q9YnQsUnQ9YnQ7dmFyIEF0PWEucGVyZm9ybWFuY2V8fHt9LE90PUF0Lm5vd3x8QXQubW96Tm93fHxBdC5tc05vd3x8QXQub05vd3x8QXQud2Via2l0Tm93fHxmdW5jdGlvbigpe3JldHVybihuZXcgRGF0ZSkuZ2V0VGltZSgpfTt2YXIgVHQ9bmV3IERhdGU7dmFyIGp0LEx0PXtuZXh0VGljazp5dCx0aXRsZToiYnJvd3NlciIsYnJvd3NlcjohMCxlbnY6e30sYXJndjpbXSx2ZXJzaW9uOiIiLHZlcnNpb25zOnt9LG9uOm10LGFkZExpc3RlbmVyOnd0LG9uY2U6X3Qsb2ZmOlN0LHJlbW92ZUxpc3RlbmVyOkV0LHJlbW92ZUFsbExpc3RlbmVyczprdCxlbWl0OlJ0LGJpbmRpbmc6ZnVuY3Rpb24odCl7dGhyb3cgbmV3IEVycm9yKCJwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCIpfSxjd2Q6ZnVuY3Rpb24oKXtyZXR1cm4iLyJ9LGNoZGlyOmZ1bmN0aW9uKHQpe3Rocm93IG5ldyBFcnJvcigicHJvY2Vzcy5jaGRpciBpcyBub3Qgc3VwcG9ydGVkIil9LHVtYXNrOmZ1bmN0aW9uKCl7cmV0dXJuIDB9LGhydGltZTpmdW5jdGlvbih0KXt2YXIgZT0uMDAxKk90LmNhbGwoQXQpLHI9TWF0aC5mbG9vcihlKSxuPU1hdGguZmxvb3IoZSUxKjFlOSk7cmV0dXJuIHQmJihyLT10WzBdLChuLT10WzFdKTwwJiYoci0tLG4rPTFlOSkpLFtyLG5dfSxwbGF0Zm9ybToiYnJvd3NlciIscmVsZWFzZTp7fSxjb25maWc6e30sdXB0aW1lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyBEYXRlLVR0KS8xZTN9fTtqdD0iZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LmNyZWF0ZT9mdW5jdGlvbih0LGUpe3Quc3VwZXJfPWUsdC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSl9OmZ1bmN0aW9uKHQsZSl7dC5zdXBlcl89ZTt2YXIgcj1mdW5jdGlvbigpe307ci5wcm90b3R5cGU9ZS5wcm90b3R5cGUsdC5wcm90b3R5cGU9bmV3IHIsdC5wcm90b3R5cGUuY29uc3RydWN0b3I9dH07dmFyIEN0PWp0LFB0PS8lW3NkaiVdL2c7ZnVuY3Rpb24gTXQodCl7aWYoISR0KHQpKXtmb3IodmFyIGU9W10scj0wO3I8YXJndW1lbnRzLmxlbmd0aDtyKyspZS5wdXNoKEl0KGFyZ3VtZW50c1tyXSkpO3JldHVybiBlLmpvaW4oIiAiKX1yPTE7Zm9yKHZhciBuPWFyZ3VtZW50cyxpPW4ubGVuZ3RoLG89U3RyaW5nKHQpLnJlcGxhY2UoUHQsKGZ1bmN0aW9uKHQpe2lmKCIlJSI9PT10KXJldHVybiIlIjtpZihyPj1pKXJldHVybiB0O3N3aXRjaCh0KXtjYXNlIiVzIjpyZXR1cm4gU3RyaW5nKG5bcisrXSk7Y2FzZSIlZCI6cmV0dXJuIE51bWJlcihuW3IrK10pO2Nhc2UiJWoiOnRyeXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkobltyKytdKX1jYXRjaCh0KXtyZXR1cm4iW0NpcmN1bGFyXSJ9ZGVmYXVsdDpyZXR1cm4gdH19KSkscz1uW3JdO3I8aTtzPW5bKytyXSlXdChzKXx8IUh0KHMpP28rPSIgIitzOm8rPSIgIitJdChzKTtyZXR1cm4gb31mdW5jdGlvbiBCdCh0LGUpe2lmKEd0KGEucHJvY2VzcykpcmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIEJ0KHQsZSkuYXBwbHkodGhpcyxhcmd1bWVudHMpfTtpZighMD09PUx0Lm5vRGVwcmVjYXRpb24pcmV0dXJuIHQ7dmFyIHI9ITE7cmV0dXJuIGZ1bmN0aW9uKCl7aWYoIXIpe2lmKEx0LnRocm93RGVwcmVjYXRpb24pdGhyb3cgbmV3IEVycm9yKGUpO0x0LnRyYWNlRGVwcmVjYXRpb24/Y29uc29sZS50cmFjZShlKTpjb25zb2xlLmVycm9yKGUpLHI9ITB9cmV0dXJuIHQuYXBwbHkodGhpcyxhcmd1bWVudHMpfX12YXIgeHQsVXQ9e307ZnVuY3Rpb24gSXQodCxlKXt2YXIgcj17c2VlbjpbXSxzdHlsaXplOk50fTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD49MyYmKHIuZGVwdGg9YXJndW1lbnRzWzJdKSxhcmd1bWVudHMubGVuZ3RoPj00JiYoci5jb2xvcnM9YXJndW1lbnRzWzNdKSxZdChlKT9yLnNob3dIaWRkZW49ZTplJiZmdW5jdGlvbih0LGUpe2lmKCFlfHwhSHQoZSkpcmV0dXJuIHQ7dmFyIHI9T2JqZWN0LmtleXMoZSksbj1yLmxlbmd0aDtmb3IoO24tLTspdFtyW25dXT1lW3Jbbl1dfShyLGUpLEd0KHIuc2hvd0hpZGRlbikmJihyLnNob3dIaWRkZW49ITEpLEd0KHIuZGVwdGgpJiYoci5kZXB0aD0yKSxHdChyLmNvbG9ycykmJihyLmNvbG9ycz0hMSksR3Qoci5jdXN0b21JbnNwZWN0KSYmKHIuY3VzdG9tSW5zcGVjdD0hMCksci5jb2xvcnMmJihyLnN0eWxpemU9RHQpLEZ0KHIsdCxyLmRlcHRoKX1mdW5jdGlvbiBEdCh0LGUpe3ZhciByPUl0LnN0eWxlc1tlXTtyZXR1cm4gcj8iG1siK0l0LmNvbG9yc1tyXVswXSsibSIrdCsiG1siK0l0LmNvbG9yc1tyXVsxXSsibSI6dH1mdW5jdGlvbiBOdCh0LGUpe3JldHVybiB0fWZ1bmN0aW9uIEZ0KHQsZSxyKXtpZih0LmN1c3RvbUluc3BlY3QmJmUmJlp0KGUuaW5zcGVjdCkmJmUuaW5zcGVjdCE9PUl0JiYoIWUuY29uc3RydWN0b3J8fGUuY29uc3RydWN0b3IucHJvdG90eXBlIT09ZSkpe3ZhciBuPWUuaW5zcGVjdChyLHQpO3JldHVybiAkdChuKXx8KG49RnQodCxuLHIpKSxufXZhciBpPWZ1bmN0aW9uKHQsZSl7aWYoR3QoZSkpcmV0dXJuIHQuc3R5bGl6ZSgidW5kZWZpbmVkIiwidW5kZWZpbmVkIik7aWYoJHQoZSkpe3ZhciByPSInIitKU09OLnN0cmluZ2lmeShlKS5yZXBsYWNlKC9eInwiJC9nLCIiKS5yZXBsYWNlKC8nL2csIlxcJyIpLnJlcGxhY2UoL1xcIi9nLCciJykrIiciO3JldHVybiB0LnN0eWxpemUociwic3RyaW5nIil9aWYobj1lLCJudW1iZXIiPT10eXBlb2YgbilyZXR1cm4gdC5zdHlsaXplKCIiK2UsIm51bWJlciIpO3ZhciBuO2lmKFl0KGUpKXJldHVybiB0LnN0eWxpemUoIiIrZSwiYm9vbGVhbiIpO2lmKFd0KGUpKXJldHVybiB0LnN0eWxpemUoIm51bGwiLCJudWxsIil9KHQsZSk7aWYoaSlyZXR1cm4gaTt2YXIgbz1PYmplY3Qua2V5cyhlKSxzPWZ1bmN0aW9uKHQpe3ZhciBlPXt9O3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQscil7ZVt0XT0hMH0pKSxlfShvKTtpZih0LnNob3dIaWRkZW4mJihvPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGUpKSxLdChlKSYmKG8uaW5kZXhPZigibWVzc2FnZSIpPj0wfHxvLmluZGV4T2YoImRlc2NyaXB0aW9uIik+PTApKXJldHVybiB6dChlKTtpZigwPT09by5sZW5ndGgpe2lmKFp0KGUpKXt2YXIgYT1lLm5hbWU/IjogIitlLm5hbWU6IiI7cmV0dXJuIHQuc3R5bGl6ZSgiW0Z1bmN0aW9uIithKyJdIiwic3BlY2lhbCIpfWlmKEp0KGUpKXJldHVybiB0LnN0eWxpemUoUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpLCJyZWdleHAiKTtpZihWdChlKSlyZXR1cm4gdC5zdHlsaXplKERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSksImRhdGUiKTtpZihLdChlKSlyZXR1cm4genQoZSl9dmFyIHUsaCxmPSIiLGM9ITEsbD1bInsiLCJ9Il07KHU9ZSxBcnJheS5pc0FycmF5KHUpJiYoYz0hMCxsPVsiWyIsIl0iXSksWnQoZSkpJiYoZj0iIFtGdW5jdGlvbiIrKGUubmFtZT8iOiAiK2UubmFtZToiIikrIl0iKTtyZXR1cm4gSnQoZSkmJihmPSIgIitSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSkpLFZ0KGUpJiYoZj0iICIrRGF0ZS5wcm90b3R5cGUudG9VVENTdHJpbmcuY2FsbChlKSksS3QoZSkmJihmPSIgIit6dChlKSksMCE9PW8ubGVuZ3RofHxjJiYwIT1lLmxlbmd0aD9yPDA/SnQoZSk/dC5zdHlsaXplKFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKSwicmVnZXhwIik6dC5zdHlsaXplKCJbT2JqZWN0XSIsInNwZWNpYWwiKToodC5zZWVuLnB1c2goZSksaD1jP2Z1bmN0aW9uKHQsZSxyLG4saSl7Zm9yKHZhciBvPVtdLHM9MCxhPWUubGVuZ3RoO3M8YTsrK3MpWHQoZSxTdHJpbmcocykpP28ucHVzaChxdCh0LGUscixuLFN0cmluZyhzKSwhMCkpOm8ucHVzaCgiIik7cmV0dXJuIGkuZm9yRWFjaCgoZnVuY3Rpb24oaSl7aS5tYXRjaCgvXlxkKyQvKXx8by5wdXNoKHF0KHQsZSxyLG4saSwhMCkpfSkpLG99KHQsZSxyLHMsbyk6by5tYXAoKGZ1bmN0aW9uKG4pe3JldHVybiBxdCh0LGUscixzLG4sYyl9KSksdC5zZWVuLnBvcCgpLGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj10LnJlZHVjZSgoZnVuY3Rpb24odCxlKXtyZXR1cm4gZS5pbmRleE9mKCJcbiIpLHQrZS5yZXBsYWNlKC9cdTAwMWJcW1xkXGQ/bS9nLCIiKS5sZW5ndGgrMX0pLDApO2lmKG4+NjApcmV0dXJuIHJbMF0rKCIiPT09ZT8iIjplKyJcbiAiKSsiICIrdC5qb2luKCIsXG4gICIpKyIgIityWzFdO3JldHVybiByWzBdK2UrIiAiK3Quam9pbigiLCAiKSsiICIrclsxXX0oaCxmLGwpKTpsWzBdK2YrbFsxXX1mdW5jdGlvbiB6dCh0KXtyZXR1cm4iWyIrRXJyb3IucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCkrIl0ifWZ1bmN0aW9uIHF0KHQsZSxyLG4saSxvKXt2YXIgcyxhLHU7aWYoKHU9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLGkpfHx7dmFsdWU6ZVtpXX0pLmdldD9hPXUuc2V0P3Quc3R5bGl6ZSgiW0dldHRlci9TZXR0ZXJdIiwic3BlY2lhbCIpOnQuc3R5bGl6ZSgiW0dldHRlcl0iLCJzcGVjaWFsIik6dS5zZXQmJihhPXQuc3R5bGl6ZSgiW1NldHRlcl0iLCJzcGVjaWFsIikpLFh0KG4saSl8fChzPSJbIitpKyJdIiksYXx8KHQuc2Vlbi5pbmRleE9mKHUudmFsdWUpPDA/KGE9V3Qocik/RnQodCx1LnZhbHVlLG51bGwpOkZ0KHQsdS52YWx1ZSxyLTEpKS5pbmRleE9mKCJcbiIpPi0xJiYoYT1vP2Euc3BsaXQoIlxuIikubWFwKChmdW5jdGlvbih0KXtyZXR1cm4iICAiK3R9KSkuam9pbigiXG4iKS5zdWJzdHIoMik6IlxuIithLnNwbGl0KCJcbiIpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIiAgICIrdH0pKS5qb2luKCJcbiIpKTphPXQuc3R5bGl6ZSgiW0NpcmN1bGFyXSIsInNwZWNpYWwiKSksR3Qocykpe2lmKG8mJmkubWF0Y2goL15cZCskLykpcmV0dXJuIGE7KHM9SlNPTi5zdHJpbmdpZnkoIiIraSkpLm1hdGNoKC9eIihbYS16QS1aX11bYS16QS1aXzAtOV0qKSIkLyk/KHM9cy5zdWJzdHIoMSxzLmxlbmd0aC0yKSxzPXQuc3R5bGl6ZShzLCJuYW1lIikpOihzPXMucmVwbGFjZSgvJy9nLCJcXCciKS5yZXBsYWNlKC9cXCIvZywnIicpLnJlcGxhY2UoLyheInwiJCkvZywiJyIpLHM9dC5zdHlsaXplKHMsInN0cmluZyIpKX1yZXR1cm4gcysiOiAiK2F9ZnVuY3Rpb24gWXQodCl7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgdH1mdW5jdGlvbiBXdCh0KXtyZXR1cm4gbnVsbD09PXR9ZnVuY3Rpb24gJHQodCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0fWZ1bmN0aW9uIEd0KHQpe3JldHVybiB2b2lkIDA9PT10fWZ1bmN0aW9uIEp0KHQpe3JldHVybiBIdCh0KSYmIltvYmplY3QgUmVnRXhwXSI9PT1RdCh0KX1mdW5jdGlvbiBIdCh0KXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHQmJm51bGwhPT10fWZ1bmN0aW9uIFZ0KHQpe3JldHVybiBIdCh0KSYmIltvYmplY3QgRGF0ZV0iPT09UXQodCl9ZnVuY3Rpb24gS3QodCl7cmV0dXJuIEh0KHQpJiYoIltvYmplY3QgRXJyb3JdIj09PVF0KHQpfHx0IGluc3RhbmNlb2YgRXJyb3IpfWZ1bmN0aW9uIFp0KHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0fWZ1bmN0aW9uIFF0KHQpe3JldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9ZnVuY3Rpb24gWHQodCxlKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsZSl9ZnVuY3Rpb24gdGUoKXt0aGlzLmhlYWQ9bnVsbCx0aGlzLnRhaWw9bnVsbCx0aGlzLmxlbmd0aD0wfUl0LmNvbG9ycz17Ym9sZDpbMSwyMl0saXRhbGljOlszLDIzXSx1bmRlcmxpbmU6WzQsMjRdLGludmVyc2U6WzcsMjddLHdoaXRlOlszNywzOV0sZ3JleTpbOTAsMzldLGJsYWNrOlszMCwzOV0sYmx1ZTpbMzQsMzldLGN5YW46WzM2LDM5XSxncmVlbjpbMzIsMzldLG1hZ2VudGE6WzM1LDM5XSxyZWQ6WzMxLDM5XSx5ZWxsb3c6WzMzLDM5XX0sSXQuc3R5bGVzPXtzcGVjaWFsOiJjeWFuIixudW1iZXI6InllbGxvdyIsYm9vbGVhbjoieWVsbG93Iix1bmRlZmluZWQ6ImdyZXkiLG51bGw6ImJvbGQiLHN0cmluZzoiZ3JlZW4iLGRhdGU6Im1hZ2VudGEiLHJlZ2V4cDoicmVkIn0sdGUucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24odCl7dmFyIGU9e2RhdGE6dCxuZXh0Om51bGx9O3RoaXMubGVuZ3RoPjA/dGhpcy50YWlsLm5leHQ9ZTp0aGlzLmhlYWQ9ZSx0aGlzLnRhaWw9ZSwrK3RoaXMubGVuZ3RofSx0ZS5wcm90b3R5cGUudW5zaGlmdD1mdW5jdGlvbih0KXt2YXIgZT17ZGF0YTp0LG5leHQ6dGhpcy5oZWFkfTswPT09dGhpcy5sZW5ndGgmJih0aGlzLnRhaWw9ZSksdGhpcy5oZWFkPWUsKyt0aGlzLmxlbmd0aH0sdGUucHJvdG90eXBlLnNoaWZ0PWZ1bmN0aW9uKCl7aWYoMCE9PXRoaXMubGVuZ3RoKXt2YXIgdD10aGlzLmhlYWQuZGF0YTtyZXR1cm4gMT09PXRoaXMubGVuZ3RoP3RoaXMuaGVhZD10aGlzLnRhaWw9bnVsbDp0aGlzLmhlYWQ9dGhpcy5oZWFkLm5leHQsLS10aGlzLmxlbmd0aCx0fX0sdGUucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5oZWFkPXRoaXMudGFpbD1udWxsLHRoaXMubGVuZ3RoPTB9LHRlLnByb3RvdHlwZS5qb2luPWZ1bmN0aW9uKHQpe2lmKDA9PT10aGlzLmxlbmd0aClyZXR1cm4iIjtmb3IodmFyIGU9dGhpcy5oZWFkLHI9IiIrZS5kYXRhO2U9ZS5uZXh0OylyKz10K2UuZGF0YTtyZXR1cm4gcn0sdGUucHJvdG90eXBlLmNvbmNhdD1mdW5jdGlvbih0KXtpZigwPT09dGhpcy5sZW5ndGgpcmV0dXJuIF8uYWxsb2MoMCk7aWYoMT09PXRoaXMubGVuZ3RoKXJldHVybiB0aGlzLmhlYWQuZGF0YTtmb3IodmFyIGU9Xy5hbGxvY1Vuc2FmZSh0Pj4+MCkscj10aGlzLmhlYWQsbj0wO3I7KXIuZGF0YS5jb3B5KGUsbiksbis9ci5kYXRhLmxlbmd0aCxyPXIubmV4dDtyZXR1cm4gZX07dmFyIGVlPV8uaXNFbmNvZGluZ3x8ZnVuY3Rpb24odCl7c3dpdGNoKHQmJnQudG9Mb3dlckNhc2UoKSl7Y2FzZSJoZXgiOmNhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6Y2FzZSJhc2NpaSI6Y2FzZSJiaW5hcnkiOmNhc2UiYmFzZTY0IjpjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6Y2FzZSJyYXciOnJldHVybiEwO2RlZmF1bHQ6cmV0dXJuITF9fTtmdW5jdGlvbiByZSh0KXtzd2l0Y2godGhpcy5lbmNvZGluZz0odHx8InV0ZjgiKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1stX10vLCIiKSxmdW5jdGlvbih0KXtpZih0JiYhZWUodCkpdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK3QpfSh0KSx0aGlzLmVuY29kaW5nKXtjYXNlInV0ZjgiOnRoaXMuc3Vycm9nYXRlU2l6ZT0zO2JyZWFrO2Nhc2UidWNzMiI6Y2FzZSJ1dGYxNmxlIjp0aGlzLnN1cnJvZ2F0ZVNpemU9Mix0aGlzLmRldGVjdEluY29tcGxldGVDaGFyPWllO2JyZWFrO2Nhc2UiYmFzZTY0Ijp0aGlzLnN1cnJvZ2F0ZVNpemU9Myx0aGlzLmRldGVjdEluY29tcGxldGVDaGFyPW9lO2JyZWFrO2RlZmF1bHQ6cmV0dXJuIHZvaWQodGhpcy53cml0ZT1uZSl9dGhpcy5jaGFyQnVmZmVyPW5ldyBfKDYpLHRoaXMuY2hhclJlY2VpdmVkPTAsdGhpcy5jaGFyTGVuZ3RoPTB9ZnVuY3Rpb24gbmUodCl7cmV0dXJuIHQudG9TdHJpbmcodGhpcy5lbmNvZGluZyl9ZnVuY3Rpb24gaWUodCl7dGhpcy5jaGFyUmVjZWl2ZWQ9dC5sZW5ndGglMix0aGlzLmNoYXJMZW5ndGg9dGhpcy5jaGFyUmVjZWl2ZWQ/MjowfWZ1bmN0aW9uIG9lKHQpe3RoaXMuY2hhclJlY2VpdmVkPXQubGVuZ3RoJTMsdGhpcy5jaGFyTGVuZ3RoPXRoaXMuY2hhclJlY2VpdmVkPzM6MH1yZS5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPSIiO3RoaXMuY2hhckxlbmd0aDspe3ZhciByPXQubGVuZ3RoPj10aGlzLmNoYXJMZW5ndGgtdGhpcy5jaGFyUmVjZWl2ZWQ/dGhpcy5jaGFyTGVuZ3RoLXRoaXMuY2hhclJlY2VpdmVkOnQubGVuZ3RoO2lmKHQuY29weSh0aGlzLmNoYXJCdWZmZXIsdGhpcy5jaGFyUmVjZWl2ZWQsMCxyKSx0aGlzLmNoYXJSZWNlaXZlZCs9cix0aGlzLmNoYXJSZWNlaXZlZDx0aGlzLmNoYXJMZW5ndGgpcmV0dXJuIiI7aWYodD10LnNsaWNlKHIsdC5sZW5ndGgpLCEoKGk9KGU9dGhpcy5jaGFyQnVmZmVyLnNsaWNlKDAsdGhpcy5jaGFyTGVuZ3RoKS50b1N0cmluZyh0aGlzLmVuY29kaW5nKSkuY2hhckNvZGVBdChlLmxlbmd0aC0xKSk+PTU1Mjk2JiZpPD01NjMxOSkpe2lmKHRoaXMuY2hhclJlY2VpdmVkPXRoaXMuY2hhckxlbmd0aD0wLDA9PT10Lmxlbmd0aClyZXR1cm4gZTticmVha310aGlzLmNoYXJMZW5ndGgrPXRoaXMuc3Vycm9nYXRlU2l6ZSxlPSIifXRoaXMuZGV0ZWN0SW5jb21wbGV0ZUNoYXIodCk7dmFyIG49dC5sZW5ndGg7dGhpcy5jaGFyTGVuZ3RoJiYodC5jb3B5KHRoaXMuY2hhckJ1ZmZlciwwLHQubGVuZ3RoLXRoaXMuY2hhclJlY2VpdmVkLG4pLG4tPXRoaXMuY2hhclJlY2VpdmVkKTt2YXIgaTtuPShlKz10LnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcsMCxuKSkubGVuZ3RoLTE7aWYoKGk9ZS5jaGFyQ29kZUF0KG4pKT49NTUyOTYmJmk8PTU2MzE5KXt2YXIgbz10aGlzLnN1cnJvZ2F0ZVNpemU7cmV0dXJuIHRoaXMuY2hhckxlbmd0aCs9byx0aGlzLmNoYXJSZWNlaXZlZCs9byx0aGlzLmNoYXJCdWZmZXIuY29weSh0aGlzLmNoYXJCdWZmZXIsbywwLG8pLHQuY29weSh0aGlzLmNoYXJCdWZmZXIsMCwwLG8pLGUuc3Vic3RyaW5nKDAsbil9cmV0dXJuIGV9LHJlLnByb3RvdHlwZS5kZXRlY3RJbmNvbXBsZXRlQ2hhcj1mdW5jdGlvbih0KXtmb3IodmFyIGU9dC5sZW5ndGg+PTM/Mzp0Lmxlbmd0aDtlPjA7ZS0tKXt2YXIgcj10W3QubGVuZ3RoLWVdO2lmKDE9PWUmJnI+PjU9PTYpe3RoaXMuY2hhckxlbmd0aD0yO2JyZWFrfWlmKGU8PTImJnI+PjQ9PTE0KXt0aGlzLmNoYXJMZW5ndGg9MzticmVha31pZihlPD0zJiZyPj4zPT0zMCl7dGhpcy5jaGFyTGVuZ3RoPTQ7YnJlYWt9fXRoaXMuY2hhclJlY2VpdmVkPWV9LHJlLnByb3RvdHlwZS5lbmQ9ZnVuY3Rpb24odCl7dmFyIGU9IiI7aWYodCYmdC5sZW5ndGgmJihlPXRoaXMud3JpdGUodCkpLHRoaXMuY2hhclJlY2VpdmVkKXt2YXIgcj10aGlzLmNoYXJSZWNlaXZlZCxuPXRoaXMuY2hhckJ1ZmZlcixpPXRoaXMuZW5jb2Rpbmc7ZSs9bi5zbGljZSgwLHIpLnRvU3RyaW5nKGkpfXJldHVybiBlfSx1ZS5SZWFkYWJsZVN0YXRlPWFlO3ZhciBzZT1mdW5jdGlvbih0KXtpZihHdCh4dCkmJih4dD1MdC5lbnYuTk9ERV9ERUJVR3x8IiIpLHQ9dC50b1VwcGVyQ2FzZSgpLCFVdFt0XSlpZihuZXcgUmVnRXhwKCJcXGIiK3QrIlxcYiIsImkiKS50ZXN0KHh0KSl7VXRbdF09ZnVuY3Rpb24oKXt2YXIgZT1NdC5hcHBseShudWxsLGFyZ3VtZW50cyk7Y29uc29sZS5lcnJvcigiJXMgJWQ6ICVzIix0LDAsZSl9fWVsc2UgVXRbdF09ZnVuY3Rpb24oKXt9O3JldHVybiBVdFt0XX0oInN0cmVhbSIpO2Z1bmN0aW9uIGFlKHQsZSl7dD10fHx7fSx0aGlzLm9iamVjdE1vZGU9ISF0Lm9iamVjdE1vZGUsZSBpbnN0YW5jZW9mIFVlJiYodGhpcy5vYmplY3RNb2RlPXRoaXMub2JqZWN0TW9kZXx8ISF0LnJlYWRhYmxlT2JqZWN0TW9kZSk7dmFyIHI9dC5oaWdoV2F0ZXJNYXJrLG49dGhpcy5vYmplY3RNb2RlPzE2OjE2Mzg0O3RoaXMuaGlnaFdhdGVyTWFyaz1yfHwwPT09cj9yOm4sdGhpcy5oaWdoV2F0ZXJNYXJrPX5+dGhpcy5oaWdoV2F0ZXJNYXJrLHRoaXMuYnVmZmVyPW5ldyB0ZSx0aGlzLmxlbmd0aD0wLHRoaXMucGlwZXM9bnVsbCx0aGlzLnBpcGVzQ291bnQ9MCx0aGlzLmZsb3dpbmc9bnVsbCx0aGlzLmVuZGVkPSExLHRoaXMuZW5kRW1pdHRlZD0hMSx0aGlzLnJlYWRpbmc9ITEsdGhpcy5zeW5jPSEwLHRoaXMubmVlZFJlYWRhYmxlPSExLHRoaXMuZW1pdHRlZFJlYWRhYmxlPSExLHRoaXMucmVhZGFibGVMaXN0ZW5pbmc9ITEsdGhpcy5yZXN1bWVTY2hlZHVsZWQ9ITEsdGhpcy5kZWZhdWx0RW5jb2Rpbmc9dC5kZWZhdWx0RW5jb2Rpbmd8fCJ1dGY4Iix0aGlzLnJhbk91dD0hMSx0aGlzLmF3YWl0RHJhaW49MCx0aGlzLnJlYWRpbmdNb3JlPSExLHRoaXMuZGVjb2Rlcj1udWxsLHRoaXMuZW5jb2Rpbmc9bnVsbCx0LmVuY29kaW5nJiYodGhpcy5kZWNvZGVyPW5ldyByZSh0LmVuY29kaW5nKSx0aGlzLmVuY29kaW5nPXQuZW5jb2RpbmcpfWZ1bmN0aW9uIHVlKHQpe2lmKCEodGhpcyBpbnN0YW5jZW9mIHVlKSlyZXR1cm4gbmV3IHVlKHQpO3RoaXMuX3JlYWRhYmxlU3RhdGU9bmV3IGFlKHQsdGhpcyksdGhpcy5yZWFkYWJsZT0hMCx0JiYiZnVuY3Rpb24iPT10eXBlb2YgdC5yZWFkJiYodGhpcy5fcmVhZD10LnJlYWQpLGUuY2FsbCh0aGlzKX1mdW5jdGlvbiBoZSh0LGUscixuLGkpe3ZhciBvPWZ1bmN0aW9uKHQsZSl7dmFyIHI9bnVsbDtfLmlzQnVmZmVyKGUpfHwic3RyaW5nIj09dHlwZW9mIGV8fG51bGw9PWV8fHQub2JqZWN0TW9kZXx8KHI9bmV3IFR5cGVFcnJvcigiSW52YWxpZCBub24tc3RyaW5nL2J1ZmZlciBjaHVuayIpKTtyZXR1cm4gcn0oZSxyKTtpZihvKXQuZW1pdCgiZXJyb3IiLG8pO2Vsc2UgaWYobnVsbD09PXIpZS5yZWFkaW5nPSExLGZ1bmN0aW9uKHQsZSl7aWYoZS5lbmRlZClyZXR1cm47aWYoZS5kZWNvZGVyKXt2YXIgcj1lLmRlY29kZXIuZW5kKCk7ciYmci5sZW5ndGgmJihlLmJ1ZmZlci5wdXNoKHIpLGUubGVuZ3RoKz1lLm9iamVjdE1vZGU/MTpyLmxlbmd0aCl9ZS5lbmRlZD0hMCxsZSh0KX0odCxlKTtlbHNlIGlmKGUub2JqZWN0TW9kZXx8ciYmci5sZW5ndGg+MClpZihlLmVuZGVkJiYhaSl7dmFyIHM9bmV3IEVycm9yKCJzdHJlYW0ucHVzaCgpIGFmdGVyIEVPRiIpO3QuZW1pdCgiZXJyb3IiLHMpfWVsc2UgaWYoZS5lbmRFbWl0dGVkJiZpKXt2YXIgYT1uZXcgRXJyb3IoInN0cmVhbS51bnNoaWZ0KCkgYWZ0ZXIgZW5kIGV2ZW50Iik7dC5lbWl0KCJlcnJvciIsYSl9ZWxzZXt2YXIgdTshZS5kZWNvZGVyfHxpfHxufHwocj1lLmRlY29kZXIud3JpdGUociksdT0hZS5vYmplY3RNb2RlJiYwPT09ci5sZW5ndGgpLGl8fChlLnJlYWRpbmc9ITEpLHV8fChlLmZsb3dpbmcmJjA9PT1lLmxlbmd0aCYmIWUuc3luYz8odC5lbWl0KCJkYXRhIixyKSx0LnJlYWQoMCkpOihlLmxlbmd0aCs9ZS5vYmplY3RNb2RlPzE6ci5sZW5ndGgsaT9lLmJ1ZmZlci51bnNoaWZ0KHIpOmUuYnVmZmVyLnB1c2gociksZS5uZWVkUmVhZGFibGUmJmxlKHQpKSksZnVuY3Rpb24odCxlKXtlLnJlYWRpbmdNb3JlfHwoZS5yZWFkaW5nTW9yZT0hMCx5dChkZSx0LGUpKX0odCxlKX1lbHNlIGl8fChlLnJlYWRpbmc9ITEpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4hdC5lbmRlZCYmKHQubmVlZFJlYWRhYmxlfHx0Lmxlbmd0aDx0LmhpZ2hXYXRlck1hcmt8fDA9PT10Lmxlbmd0aCl9KGUpfUN0KHVlLGUpLHVlLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5fcmVhZGFibGVTdGF0ZTtyZXR1cm4gci5vYmplY3RNb2RlfHwic3RyaW5nIiE9dHlwZW9mIHR8fChlPWV8fHIuZGVmYXVsdEVuY29kaW5nKSE9PXIuZW5jb2RpbmcmJih0PV8uZnJvbSh0LGUpLGU9IiIpLGhlKHRoaXMscix0LGUsITEpfSx1ZS5wcm90b3R5cGUudW5zaGlmdD1mdW5jdGlvbih0KXtyZXR1cm4gaGUodGhpcyx0aGlzLl9yZWFkYWJsZVN0YXRlLHQsIiIsITApfSx1ZS5wcm90b3R5cGUuaXNQYXVzZWQ9ZnVuY3Rpb24oKXtyZXR1cm4hMT09PXRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZ30sdWUucHJvdG90eXBlLnNldEVuY29kaW5nPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlY29kZXI9bmV3IHJlKHQpLHRoaXMuX3JlYWRhYmxlU3RhdGUuZW5jb2Rpbmc9dCx0aGlzfTt2YXIgZmU9ODM4ODYwODtmdW5jdGlvbiBjZSh0LGUpe3JldHVybiB0PD0wfHwwPT09ZS5sZW5ndGgmJmUuZW5kZWQ/MDplLm9iamVjdE1vZGU/MTp0IT10P2UuZmxvd2luZyYmZS5sZW5ndGg/ZS5idWZmZXIuaGVhZC5kYXRhLmxlbmd0aDplLmxlbmd0aDoodD5lLmhpZ2hXYXRlck1hcmsmJihlLmhpZ2hXYXRlck1hcms9ZnVuY3Rpb24odCl7cmV0dXJuIHQ+PWZlP3Q9ZmU6KHQtLSx0fD10Pj4+MSx0fD10Pj4+Mix0fD10Pj4+NCx0fD10Pj4+OCx0fD10Pj4+MTYsdCsrKSx0fSh0KSksdDw9ZS5sZW5ndGg/dDplLmVuZGVkP2UubGVuZ3RoOihlLm5lZWRSZWFkYWJsZT0hMCwwKSl9ZnVuY3Rpb24gbGUodCl7dmFyIGU9dC5fcmVhZGFibGVTdGF0ZTtlLm5lZWRSZWFkYWJsZT0hMSxlLmVtaXR0ZWRSZWFkYWJsZXx8KHNlKCJlbWl0UmVhZGFibGUiLGUuZmxvd2luZyksZS5lbWl0dGVkUmVhZGFibGU9ITAsZS5zeW5jP3l0KHBlLHQpOnBlKHQpKX1mdW5jdGlvbiBwZSh0KXtzZSgiZW1pdCByZWFkYWJsZSIpLHQuZW1pdCgicmVhZGFibGUiKSx2ZSh0KX1mdW5jdGlvbiBkZSh0LGUpe2Zvcih2YXIgcj1lLmxlbmd0aDshZS5yZWFkaW5nJiYhZS5mbG93aW5nJiYhZS5lbmRlZCYmZS5sZW5ndGg8ZS5oaWdoV2F0ZXJNYXJrJiYoc2UoIm1heWJlUmVhZE1vcmUgcmVhZCAwIiksdC5yZWFkKDApLHIhPT1lLmxlbmd0aCk7KXI9ZS5sZW5ndGg7ZS5yZWFkaW5nTW9yZT0hMX1mdW5jdGlvbiBnZSh0KXtzZSgicmVhZGFibGUgbmV4dHRpY2sgcmVhZCAwIiksdC5yZWFkKDApfWZ1bmN0aW9uIHllKHQsZSl7ZS5yZWFkaW5nfHwoc2UoInJlc3VtZSByZWFkIDAiKSx0LnJlYWQoMCkpLGUucmVzdW1lU2NoZWR1bGVkPSExLGUuYXdhaXREcmFpbj0wLHQuZW1pdCgicmVzdW1lIiksdmUodCksZS5mbG93aW5nJiYhZS5yZWFkaW5nJiZ0LnJlYWQoMCl9ZnVuY3Rpb24gdmUodCl7dmFyIGU9dC5fcmVhZGFibGVTdGF0ZTtmb3Ioc2UoImZsb3ciLGUuZmxvd2luZyk7ZS5mbG93aW5nJiZudWxsIT09dC5yZWFkKCk7KTt9ZnVuY3Rpb24gYmUodCxlKXtyZXR1cm4gMD09PWUubGVuZ3RoP251bGw6KGUub2JqZWN0TW9kZT9yPWUuYnVmZmVyLnNoaWZ0KCk6IXR8fHQ+PWUubGVuZ3RoPyhyPWUuZGVjb2Rlcj9lLmJ1ZmZlci5qb2luKCIiKToxPT09ZS5idWZmZXIubGVuZ3RoP2UuYnVmZmVyLmhlYWQuZGF0YTplLmJ1ZmZlci5jb25jYXQoZS5sZW5ndGgpLGUuYnVmZmVyLmNsZWFyKCkpOnI9ZnVuY3Rpb24odCxlLHIpe3ZhciBuO3Q8ZS5oZWFkLmRhdGEubGVuZ3RoPyhuPWUuaGVhZC5kYXRhLnNsaWNlKDAsdCksZS5oZWFkLmRhdGE9ZS5oZWFkLmRhdGEuc2xpY2UodCkpOm49dD09PWUuaGVhZC5kYXRhLmxlbmd0aD9lLnNoaWZ0KCk6cj9mdW5jdGlvbih0LGUpe3ZhciByPWUuaGVhZCxuPTEsaT1yLmRhdGE7dC09aS5sZW5ndGg7Zm9yKDtyPXIubmV4dDspe3ZhciBvPXIuZGF0YSxzPXQ+by5sZW5ndGg/by5sZW5ndGg6dDtpZihzPT09by5sZW5ndGg/aSs9bzppKz1vLnNsaWNlKDAsdCksMD09PSh0LT1zKSl7cz09PW8ubGVuZ3RoPygrK24sci5uZXh0P2UuaGVhZD1yLm5leHQ6ZS5oZWFkPWUudGFpbD1udWxsKTooZS5oZWFkPXIsci5kYXRhPW8uc2xpY2UocykpO2JyZWFrfSsrbn1yZXR1cm4gZS5sZW5ndGgtPW4saX0odCxlKTpmdW5jdGlvbih0LGUpe3ZhciByPV8uYWxsb2NVbnNhZmUodCksbj1lLmhlYWQsaT0xO24uZGF0YS5jb3B5KHIpLHQtPW4uZGF0YS5sZW5ndGg7Zm9yKDtuPW4ubmV4dDspe3ZhciBvPW4uZGF0YSxzPXQ+by5sZW5ndGg/by5sZW5ndGg6dDtpZihvLmNvcHkocixyLmxlbmd0aC10LDAscyksMD09PSh0LT1zKSl7cz09PW8ubGVuZ3RoPygrK2ksbi5uZXh0P2UuaGVhZD1uLm5leHQ6ZS5oZWFkPWUudGFpbD1udWxsKTooZS5oZWFkPW4sbi5kYXRhPW8uc2xpY2UocykpO2JyZWFrfSsraX1yZXR1cm4gZS5sZW5ndGgtPWkscn0odCxlKTtyZXR1cm4gbn0odCxlLmJ1ZmZlcixlLmRlY29kZXIpLHIpO3ZhciByfWZ1bmN0aW9uIG1lKHQpe3ZhciBlPXQuX3JlYWRhYmxlU3RhdGU7aWYoZS5sZW5ndGg+MCl0aHJvdyBuZXcgRXJyb3IoJyJlbmRSZWFkYWJsZSgpIiBjYWxsZWQgb24gbm9uLWVtcHR5IHN0cmVhbScpO2UuZW5kRW1pdHRlZHx8KGUuZW5kZWQ9ITAseXQod2UsZSx0KSl9ZnVuY3Rpb24gd2UodCxlKXt0LmVuZEVtaXR0ZWR8fDAhPT10Lmxlbmd0aHx8KHQuZW5kRW1pdHRlZD0hMCxlLnJlYWRhYmxlPSExLGUuZW1pdCgiZW5kIikpfWZ1bmN0aW9uIF9lKHQsZSl7Zm9yKHZhciByPTAsbj10Lmxlbmd0aDtyPG47cisrKWlmKHRbcl09PT1lKXJldHVybiByO3JldHVybi0xfWZ1bmN0aW9uIFNlKCl7fWZ1bmN0aW9uIEVlKHQsZSxyKXt0aGlzLmNodW5rPXQsdGhpcy5lbmNvZGluZz1lLHRoaXMuY2FsbGJhY2s9cix0aGlzLm5leHQ9bnVsbH1mdW5jdGlvbiBrZSh0LGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJidWZmZXIiLHtnZXQ6QnQoKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0QnVmZmVyKCl9KSwiX3dyaXRhYmxlU3RhdGUuYnVmZmVyIGlzIGRlcHJlY2F0ZWQuIFVzZSBfd3JpdGFibGVTdGF0ZS5nZXRCdWZmZXIgaW5zdGVhZC4iKX0pLHQ9dHx8e30sdGhpcy5vYmplY3RNb2RlPSEhdC5vYmplY3RNb2RlLGUgaW5zdGFuY2VvZiBVZSYmKHRoaXMub2JqZWN0TW9kZT10aGlzLm9iamVjdE1vZGV8fCEhdC53cml0YWJsZU9iamVjdE1vZGUpO3ZhciByPXQuaGlnaFdhdGVyTWFyayxuPXRoaXMub2JqZWN0TW9kZT8xNjoxNjM4NDt0aGlzLmhpZ2hXYXRlck1hcms9cnx8MD09PXI/cjpuLHRoaXMuaGlnaFdhdGVyTWFyaz1+fnRoaXMuaGlnaFdhdGVyTWFyayx0aGlzLm5lZWREcmFpbj0hMSx0aGlzLmVuZGluZz0hMSx0aGlzLmVuZGVkPSExLHRoaXMuZmluaXNoZWQ9ITE7dmFyIGk9ITE9PT10LmRlY29kZVN0cmluZ3M7dGhpcy5kZWNvZGVTdHJpbmdzPSFpLHRoaXMuZGVmYXVsdEVuY29kaW5nPXQuZGVmYXVsdEVuY29kaW5nfHwidXRmOCIsdGhpcy5sZW5ndGg9MCx0aGlzLndyaXRpbmc9ITEsdGhpcy5jb3JrZWQ9MCx0aGlzLnN5bmM9ITAsdGhpcy5idWZmZXJQcm9jZXNzaW5nPSExLHRoaXMub253cml0ZT1mdW5jdGlvbih0KXshZnVuY3Rpb24odCxlKXt2YXIgcj10Ll93cml0YWJsZVN0YXRlLG49ci5zeW5jLGk9ci53cml0ZWNiO2lmKGZ1bmN0aW9uKHQpe3Qud3JpdGluZz0hMSx0LndyaXRlY2I9bnVsbCx0Lmxlbmd0aC09dC53cml0ZWxlbix0LndyaXRlbGVuPTB9KHIpLGUpIWZ1bmN0aW9uKHQsZSxyLG4saSl7LS1lLnBlbmRpbmdjYixyP3l0KGksbik6aShuKTt0Ll93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZD0hMCx0LmVtaXQoImVycm9yIixuKX0odCxyLG4sZSxpKTtlbHNle3ZhciBvPWplKHIpO298fHIuY29ya2VkfHxyLmJ1ZmZlclByb2Nlc3Npbmd8fCFyLmJ1ZmZlcmVkUmVxdWVzdHx8VGUodCxyKSxuP3l0KE9lLHQscixvLGkpOk9lKHQscixvLGkpfX0oZSx0KX0sdGhpcy53cml0ZWNiPW51bGwsdGhpcy53cml0ZWxlbj0wLHRoaXMuYnVmZmVyZWRSZXF1ZXN0PW51bGwsdGhpcy5sYXN0QnVmZmVyZWRSZXF1ZXN0PW51bGwsdGhpcy5wZW5kaW5nY2I9MCx0aGlzLnByZWZpbmlzaGVkPSExLHRoaXMuZXJyb3JFbWl0dGVkPSExLHRoaXMuYnVmZmVyZWRSZXF1ZXN0Q291bnQ9MCx0aGlzLmNvcmtlZFJlcXVlc3RzRnJlZT1uZXcgUGUodGhpcyl9ZnVuY3Rpb24gUmUodCl7aWYoISh0aGlzIGluc3RhbmNlb2YgUmV8fHRoaXMgaW5zdGFuY2VvZiBVZSkpcmV0dXJuIG5ldyBSZSh0KTt0aGlzLl93cml0YWJsZVN0YXRlPW5ldyBrZSh0LHRoaXMpLHRoaXMud3JpdGFibGU9ITAsdCYmKCJmdW5jdGlvbiI9PXR5cGVvZiB0LndyaXRlJiYodGhpcy5fd3JpdGU9dC53cml0ZSksImZ1bmN0aW9uIj09dHlwZW9mIHQud3JpdGV2JiYodGhpcy5fd3JpdGV2PXQud3JpdGV2KSksZS5jYWxsKHRoaXMpfWZ1bmN0aW9uIEFlKHQsZSxyLG4saSxvLHMpe2Uud3JpdGVsZW49bixlLndyaXRlY2I9cyxlLndyaXRpbmc9ITAsZS5zeW5jPSEwLHI/dC5fd3JpdGV2KGksZS5vbndyaXRlKTp0Ll93cml0ZShpLG8sZS5vbndyaXRlKSxlLnN5bmM9ITF9ZnVuY3Rpb24gT2UodCxlLHIsbil7cnx8ZnVuY3Rpb24odCxlKXswPT09ZS5sZW5ndGgmJmUubmVlZERyYWluJiYoZS5uZWVkRHJhaW49ITEsdC5lbWl0KCJkcmFpbiIpKX0odCxlKSxlLnBlbmRpbmdjYi0tLG4oKSxDZSh0LGUpfWZ1bmN0aW9uIFRlKHQsZSl7ZS5idWZmZXJQcm9jZXNzaW5nPSEwO3ZhciByPWUuYnVmZmVyZWRSZXF1ZXN0O2lmKHQuX3dyaXRldiYmciYmci5uZXh0KXt2YXIgbj1lLmJ1ZmZlcmVkUmVxdWVzdENvdW50LGk9bmV3IEFycmF5KG4pLG89ZS5jb3JrZWRSZXF1ZXN0c0ZyZWU7by5lbnRyeT1yO2Zvcih2YXIgcz0wO3I7KWlbc109cixyPXIubmV4dCxzKz0xO0FlKHQsZSwhMCxlLmxlbmd0aCxpLCIiLG8uZmluaXNoKSxlLnBlbmRpbmdjYisrLGUubGFzdEJ1ZmZlcmVkUmVxdWVzdD1udWxsLG8ubmV4dD8oZS5jb3JrZWRSZXF1ZXN0c0ZyZWU9by5uZXh0LG8ubmV4dD1udWxsKTplLmNvcmtlZFJlcXVlc3RzRnJlZT1uZXcgUGUoZSl9ZWxzZXtmb3IoO3I7KXt2YXIgYT1yLmNodW5rLHU9ci5lbmNvZGluZyxoPXIuY2FsbGJhY2s7aWYoQWUodCxlLCExLGUub2JqZWN0TW9kZT8xOmEubGVuZ3RoLGEsdSxoKSxyPXIubmV4dCxlLndyaXRpbmcpYnJlYWt9bnVsbD09PXImJihlLmxhc3RCdWZmZXJlZFJlcXVlc3Q9bnVsbCl9ZS5idWZmZXJlZFJlcXVlc3RDb3VudD0wLGUuYnVmZmVyZWRSZXF1ZXN0PXIsZS5idWZmZXJQcm9jZXNzaW5nPSExfWZ1bmN0aW9uIGplKHQpe3JldHVybiB0LmVuZGluZyYmMD09PXQubGVuZ3RoJiZudWxsPT09dC5idWZmZXJlZFJlcXVlc3QmJiF0LmZpbmlzaGVkJiYhdC53cml0aW5nfWZ1bmN0aW9uIExlKHQsZSl7ZS5wcmVmaW5pc2hlZHx8KGUucHJlZmluaXNoZWQ9ITAsdC5lbWl0KCJwcmVmaW5pc2giKSl9ZnVuY3Rpb24gQ2UodCxlKXt2YXIgcj1qZShlKTtyZXR1cm4gciYmKDA9PT1lLnBlbmRpbmdjYj8oTGUodCxlKSxlLmZpbmlzaGVkPSEwLHQuZW1pdCgiZmluaXNoIikpOkxlKHQsZSkpLHJ9ZnVuY3Rpb24gUGUodCl7dmFyIGU9dGhpczt0aGlzLm5leHQ9bnVsbCx0aGlzLmVudHJ5PW51bGwsdGhpcy5maW5pc2g9ZnVuY3Rpb24ocil7dmFyIG49ZS5lbnRyeTtmb3IoZS5lbnRyeT1udWxsO247KXt2YXIgaT1uLmNhbGxiYWNrO3QucGVuZGluZ2NiLS0saShyKSxuPW4ubmV4dH10LmNvcmtlZFJlcXVlc3RzRnJlZT90LmNvcmtlZFJlcXVlc3RzRnJlZS5uZXh0PWU6dC5jb3JrZWRSZXF1ZXN0c0ZyZWU9ZX19dWUucHJvdG90eXBlLnJlYWQ9ZnVuY3Rpb24odCl7c2UoInJlYWQiLHQpLHQ9cGFyc2VJbnQodCwxMCk7dmFyIGU9dGhpcy5fcmVhZGFibGVTdGF0ZSxyPXQ7aWYoMCE9PXQmJihlLmVtaXR0ZWRSZWFkYWJsZT0hMSksMD09PXQmJmUubmVlZFJlYWRhYmxlJiYoZS5sZW5ndGg+PWUuaGlnaFdhdGVyTWFya3x8ZS5lbmRlZCkpcmV0dXJuIHNlKCJyZWFkOiBlbWl0UmVhZGFibGUiLGUubGVuZ3RoLGUuZW5kZWQpLDA9PT1lLmxlbmd0aCYmZS5lbmRlZD9tZSh0aGlzKTpsZSh0aGlzKSxudWxsO2lmKDA9PT0odD1jZSh0LGUpKSYmZS5lbmRlZClyZXR1cm4gMD09PWUubGVuZ3RoJiZtZSh0aGlzKSxudWxsO3ZhciBuLGk9ZS5uZWVkUmVhZGFibGU7cmV0dXJuIHNlKCJuZWVkIHJlYWRhYmxlIixpKSwoMD09PWUubGVuZ3RofHxlLmxlbmd0aC10PGUuaGlnaFdhdGVyTWFyaykmJnNlKCJsZW5ndGggbGVzcyB0aGFuIHdhdGVybWFyayIsaT0hMCksZS5lbmRlZHx8ZS5yZWFkaW5nP3NlKCJyZWFkaW5nIG9yIGVuZGVkIixpPSExKTppJiYoc2UoImRvIHJlYWQiKSxlLnJlYWRpbmc9ITAsZS5zeW5jPSEwLDA9PT1lLmxlbmd0aCYmKGUubmVlZFJlYWRhYmxlPSEwKSx0aGlzLl9yZWFkKGUuaGlnaFdhdGVyTWFyayksZS5zeW5jPSExLGUucmVhZGluZ3x8KHQ9Y2UocixlKSkpLG51bGw9PT0obj10PjA/YmUodCxlKTpudWxsKT8oZS5uZWVkUmVhZGFibGU9ITAsdD0wKTplLmxlbmd0aC09dCwwPT09ZS5sZW5ndGgmJihlLmVuZGVkfHwoZS5uZWVkUmVhZGFibGU9ITApLHIhPT10JiZlLmVuZGVkJiZtZSh0aGlzKSksbnVsbCE9PW4mJnRoaXMuZW1pdCgiZGF0YSIsbiksbn0sdWUucHJvdG90eXBlLl9yZWFkPWZ1bmN0aW9uKHQpe3RoaXMuZW1pdCgiZXJyb3IiLG5ldyBFcnJvcigibm90IGltcGxlbWVudGVkIikpfSx1ZS5wcm90b3R5cGUucGlwZT1mdW5jdGlvbih0LGUpe3ZhciByPXRoaXMsbj10aGlzLl9yZWFkYWJsZVN0YXRlO3N3aXRjaChuLnBpcGVzQ291bnQpe2Nhc2UgMDpuLnBpcGVzPXQ7YnJlYWs7Y2FzZSAxOm4ucGlwZXM9W24ucGlwZXMsdF07YnJlYWs7ZGVmYXVsdDpuLnBpcGVzLnB1c2godCl9bi5waXBlc0NvdW50Kz0xLHNlKCJwaXBlIGNvdW50PSVkIG9wdHM9JWoiLG4ucGlwZXNDb3VudCxlKTt2YXIgaT0hZXx8ITEhPT1lLmVuZD9zOmg7ZnVuY3Rpb24gbyh0KXtzZSgib251bnBpcGUiKSx0PT09ciYmaCgpfWZ1bmN0aW9uIHMoKXtzZSgib25lbmQiKSx0LmVuZCgpfW4uZW5kRW1pdHRlZD95dChpKTpyLm9uY2UoImVuZCIsaSksdC5vbigidW5waXBlIixvKTt2YXIgYT1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT10Ll9yZWFkYWJsZVN0YXRlO3NlKCJwaXBlT25EcmFpbiIsZS5hd2FpdERyYWluKSxlLmF3YWl0RHJhaW4mJmUuYXdhaXREcmFpbi0tLDA9PT1lLmF3YWl0RHJhaW4mJnQubGlzdGVuZXJzKCJkYXRhIikubGVuZ3RoJiYoZS5mbG93aW5nPSEwLHZlKHQpKX19KHIpO3Qub24oImRyYWluIixhKTt2YXIgdT0hMTtmdW5jdGlvbiBoKCl7c2UoImNsZWFudXAiKSx0LnJlbW92ZUxpc3RlbmVyKCJjbG9zZSIscCksdC5yZW1vdmVMaXN0ZW5lcigiZmluaXNoIixkKSx0LnJlbW92ZUxpc3RlbmVyKCJkcmFpbiIsYSksdC5yZW1vdmVMaXN0ZW5lcigiZXJyb3IiLGwpLHQucmVtb3ZlTGlzdGVuZXIoInVucGlwZSIsbyksci5yZW1vdmVMaXN0ZW5lcigiZW5kIixzKSxyLnJlbW92ZUxpc3RlbmVyKCJlbmQiLGgpLHIucmVtb3ZlTGlzdGVuZXIoImRhdGEiLGMpLHU9ITAsIW4uYXdhaXREcmFpbnx8dC5fd3JpdGFibGVTdGF0ZSYmIXQuX3dyaXRhYmxlU3RhdGUubmVlZERyYWlufHxhKCl9dmFyIGY9ITE7ZnVuY3Rpb24gYyhlKXtzZSgib25kYXRhIiksZj0hMSwhMSE9PXQud3JpdGUoZSl8fGZ8fCgoMT09PW4ucGlwZXNDb3VudCYmbi5waXBlcz09PXR8fG4ucGlwZXNDb3VudD4xJiYtMSE9PV9lKG4ucGlwZXMsdCkpJiYhdSYmKHNlKCJmYWxzZSB3cml0ZSByZXNwb25zZSwgcGF1c2UiLHIuX3JlYWRhYmxlU3RhdGUuYXdhaXREcmFpbiksci5fcmVhZGFibGVTdGF0ZS5hd2FpdERyYWluKyssZj0hMCksci5wYXVzZSgpKX1mdW5jdGlvbiBsKGUpe3ZhciByO3NlKCJvbmVycm9yIixlKSxnKCksdC5yZW1vdmVMaXN0ZW5lcigiZXJyb3IiLGwpLDA9PT0ocj0iZXJyb3IiLHQubGlzdGVuZXJzKHIpLmxlbmd0aCkmJnQuZW1pdCgiZXJyb3IiLGUpfWZ1bmN0aW9uIHAoKXt0LnJlbW92ZUxpc3RlbmVyKCJmaW5pc2giLGQpLGcoKX1mdW5jdGlvbiBkKCl7c2UoIm9uZmluaXNoIiksdC5yZW1vdmVMaXN0ZW5lcigiY2xvc2UiLHApLGcoKX1mdW5jdGlvbiBnKCl7c2UoInVucGlwZSIpLHIudW5waXBlKHQpfXJldHVybiByLm9uKCJkYXRhIixjKSxmdW5jdGlvbih0LGUscil7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHQucHJlcGVuZExpc3RlbmVyKXJldHVybiB0LnByZXBlbmRMaXN0ZW5lcihlLHIpO3QuX2V2ZW50cyYmdC5fZXZlbnRzW2VdP0FycmF5LmlzQXJyYXkodC5fZXZlbnRzW2VdKT90Ll9ldmVudHNbZV0udW5zaGlmdChyKTp0Ll9ldmVudHNbZV09W3IsdC5fZXZlbnRzW2VdXTp0Lm9uKGUscil9KHQsImVycm9yIixsKSx0Lm9uY2UoImNsb3NlIixwKSx0Lm9uY2UoImZpbmlzaCIsZCksdC5lbWl0KCJwaXBlIixyKSxuLmZsb3dpbmd8fChzZSgicGlwZSByZXN1bWUiKSxyLnJlc3VtZSgpKSx0fSx1ZS5wcm90b3R5cGUudW5waXBlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3JlYWRhYmxlU3RhdGU7aWYoMD09PWUucGlwZXNDb3VudClyZXR1cm4gdGhpcztpZigxPT09ZS5waXBlc0NvdW50KXJldHVybiB0JiZ0IT09ZS5waXBlc3x8KHR8fCh0PWUucGlwZXMpLGUucGlwZXM9bnVsbCxlLnBpcGVzQ291bnQ9MCxlLmZsb3dpbmc9ITEsdCYmdC5lbWl0KCJ1bnBpcGUiLHRoaXMpKSx0aGlzO2lmKCF0KXt2YXIgcj1lLnBpcGVzLG49ZS5waXBlc0NvdW50O2UucGlwZXM9bnVsbCxlLnBpcGVzQ291bnQ9MCxlLmZsb3dpbmc9ITE7Zm9yKHZhciBpPTA7aTxuO2krKylyW2ldLmVtaXQoInVucGlwZSIsdGhpcyk7cmV0dXJuIHRoaXN9dmFyIG89X2UoZS5waXBlcyx0KTtyZXR1cm4tMT09PW98fChlLnBpcGVzLnNwbGljZShvLDEpLGUucGlwZXNDb3VudC09MSwxPT09ZS5waXBlc0NvdW50JiYoZS5waXBlcz1lLnBpcGVzWzBdKSx0LmVtaXQoInVucGlwZSIsdGhpcykpLHRoaXN9LHVlLnByb3RvdHlwZS5vbj1mdW5jdGlvbih0LHIpe3ZhciBuPWUucHJvdG90eXBlLm9uLmNhbGwodGhpcyx0LHIpO2lmKCJkYXRhIj09PXQpITEhPT10aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcmJnRoaXMucmVzdW1lKCk7ZWxzZSBpZigicmVhZGFibGUiPT09dCl7dmFyIGk9dGhpcy5fcmVhZGFibGVTdGF0ZTtpLmVuZEVtaXR0ZWR8fGkucmVhZGFibGVMaXN0ZW5pbmd8fChpLnJlYWRhYmxlTGlzdGVuaW5nPWkubmVlZFJlYWRhYmxlPSEwLGkuZW1pdHRlZFJlYWRhYmxlPSExLGkucmVhZGluZz9pLmxlbmd0aCYmbGUodGhpcyk6eXQoZ2UsdGhpcykpfXJldHVybiBufSx1ZS5wcm90b3R5cGUuYWRkTGlzdGVuZXI9dWUucHJvdG90eXBlLm9uLHVlLnByb3RvdHlwZS5yZXN1bWU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9yZWFkYWJsZVN0YXRlO3JldHVybiB0LmZsb3dpbmd8fChzZSgicmVzdW1lIiksdC5mbG93aW5nPSEwLGZ1bmN0aW9uKHQsZSl7ZS5yZXN1bWVTY2hlZHVsZWR8fChlLnJlc3VtZVNjaGVkdWxlZD0hMCx5dCh5ZSx0LGUpKX0odGhpcyx0KSksdGhpc30sdWUucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKCl7cmV0dXJuIHNlKCJjYWxsIHBhdXNlIGZsb3dpbmc9JWoiLHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyksITEhPT10aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcmJihzZSgicGF1c2UiKSx0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmc9ITEsdGhpcy5lbWl0KCJwYXVzZSIpKSx0aGlzfSx1ZS5wcm90b3R5cGUud3JhcD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9yZWFkYWJsZVN0YXRlLHI9ITEsbj10aGlzO2Zvcih2YXIgaSBpbiB0Lm9uKCJlbmQiLChmdW5jdGlvbigpe2lmKHNlKCJ3cmFwcGVkIGVuZCIpLGUuZGVjb2RlciYmIWUuZW5kZWQpe3ZhciB0PWUuZGVjb2Rlci5lbmQoKTt0JiZ0Lmxlbmd0aCYmbi5wdXNoKHQpfW4ucHVzaChudWxsKX0pKSx0Lm9uKCJkYXRhIiwoZnVuY3Rpb24oaSl7KHNlKCJ3cmFwcGVkIGRhdGEiKSxlLmRlY29kZXImJihpPWUuZGVjb2Rlci53cml0ZShpKSksZS5vYmplY3RNb2RlJiZudWxsPT1pKXx8KGUub2JqZWN0TW9kZXx8aSYmaS5sZW5ndGgpJiYobi5wdXNoKGkpfHwocj0hMCx0LnBhdXNlKCkpKX0pKSx0KXZvaWQgMD09PXRoaXNbaV0mJiJmdW5jdGlvbiI9PXR5cGVvZiB0W2ldJiYodGhpc1tpXT1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdFtlXS5hcHBseSh0LGFyZ3VtZW50cyl9fShpKSk7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPTAsbj10Lmxlbmd0aDtyPG47cisrKWUodFtyXSxyKX0oWyJlcnJvciIsImNsb3NlIiwiZGVzdHJveSIsInBhdXNlIiwicmVzdW1lIl0sKGZ1bmN0aW9uKGUpe3Qub24oZSxuLmVtaXQuYmluZChuLGUpKX0pKSxuLl9yZWFkPWZ1bmN0aW9uKGUpe3NlKCJ3cmFwcGVkIF9yZWFkIixlKSxyJiYocj0hMSx0LnJlc3VtZSgpKX0sbn0sdWUuX2Zyb21MaXN0PWJlLFJlLldyaXRhYmxlU3RhdGU9a2UsQ3QoUmUsZSksa2UucHJvdG90eXBlLmdldEJ1ZmZlcj1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLmJ1ZmZlcmVkUmVxdWVzdCxlPVtdO3Q7KWUucHVzaCh0KSx0PXQubmV4dDtyZXR1cm4gZX0sUmUucHJvdG90eXBlLnBpcGU9ZnVuY3Rpb24oKXt0aGlzLmVtaXQoImVycm9yIixuZXcgRXJyb3IoIkNhbm5vdCBwaXBlLCBub3QgcmVhZGFibGUiKSl9LFJlLnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbih0LGUscil7dmFyIG49dGhpcy5fd3JpdGFibGVTdGF0ZSxpPSExO3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBlJiYocj1lLGU9bnVsbCksXy5pc0J1ZmZlcih0KT9lPSJidWZmZXIiOmV8fChlPW4uZGVmYXVsdEVuY29kaW5nKSwiZnVuY3Rpb24iIT10eXBlb2YgciYmKHI9U2UpLG4uZW5kZWQ/ZnVuY3Rpb24odCxlKXt2YXIgcj1uZXcgRXJyb3IoIndyaXRlIGFmdGVyIGVuZCIpO3QuZW1pdCgiZXJyb3IiLHIpLHl0KGUscil9KHRoaXMscik6ZnVuY3Rpb24odCxlLHIsbil7dmFyIGk9ITAsbz0hMTtyZXR1cm4gbnVsbD09PXI/bz1uZXcgVHlwZUVycm9yKCJNYXkgbm90IHdyaXRlIG51bGwgdmFsdWVzIHRvIHN0cmVhbSIpOl8uaXNCdWZmZXIocil8fCJzdHJpbmciPT10eXBlb2Ygcnx8dm9pZCAwPT09cnx8ZS5vYmplY3RNb2RlfHwobz1uZXcgVHlwZUVycm9yKCJJbnZhbGlkIG5vbi1zdHJpbmcvYnVmZmVyIGNodW5rIikpLG8mJih0LmVtaXQoImVycm9yIixvKSx5dChuLG8pLGk9ITEpLGl9KHRoaXMsbix0LHIpJiYobi5wZW5kaW5nY2IrKyxpPWZ1bmN0aW9uKHQsZSxyLG4saSl7cj1mdW5jdGlvbih0LGUscil7dC5vYmplY3RNb2RlfHwhMT09PXQuZGVjb2RlU3RyaW5nc3x8InN0cmluZyIhPXR5cGVvZiBlfHwoZT1fLmZyb20oZSxyKSk7cmV0dXJuIGV9KGUscixuKSxfLmlzQnVmZmVyKHIpJiYobj0iYnVmZmVyIik7dmFyIG89ZS5vYmplY3RNb2RlPzE6ci5sZW5ndGg7ZS5sZW5ndGgrPW87dmFyIHM9ZS5sZW5ndGg8ZS5oaWdoV2F0ZXJNYXJrO3N8fChlLm5lZWREcmFpbj0hMCk7aWYoZS53cml0aW5nfHxlLmNvcmtlZCl7dmFyIGE9ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0O2UubGFzdEJ1ZmZlcmVkUmVxdWVzdD1uZXcgRWUocixuLGkpLGE/YS5uZXh0PWUubGFzdEJ1ZmZlcmVkUmVxdWVzdDplLmJ1ZmZlcmVkUmVxdWVzdD1lLmxhc3RCdWZmZXJlZFJlcXVlc3QsZS5idWZmZXJlZFJlcXVlc3RDb3VudCs9MX1lbHNlIEFlKHQsZSwhMSxvLHIsbixpKTtyZXR1cm4gc30odGhpcyxuLHQsZSxyKSksaX0sUmUucHJvdG90eXBlLmNvcms9ZnVuY3Rpb24oKXt0aGlzLl93cml0YWJsZVN0YXRlLmNvcmtlZCsrfSxSZS5wcm90b3R5cGUudW5jb3JrPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fd3JpdGFibGVTdGF0ZTt0LmNvcmtlZCYmKHQuY29ya2VkLS0sdC53cml0aW5nfHx0LmNvcmtlZHx8dC5maW5pc2hlZHx8dC5idWZmZXJQcm9jZXNzaW5nfHwhdC5idWZmZXJlZFJlcXVlc3R8fFRlKHRoaXMsdCkpfSxSZS5wcm90b3R5cGUuc2V0RGVmYXVsdEVuY29kaW5nPWZ1bmN0aW9uKHQpe2lmKCJzdHJpbmciPT10eXBlb2YgdCYmKHQ9dC50b0xvd2VyQ2FzZSgpKSwhKFsiaGV4IiwidXRmOCIsInV0Zi04IiwiYXNjaWkiLCJiaW5hcnkiLCJiYXNlNjQiLCJ1Y3MyIiwidWNzLTIiLCJ1dGYxNmxlIiwidXRmLTE2bGUiLCJyYXciXS5pbmRleE9mKCh0KyIiKS50b0xvd2VyQ2FzZSgpKT4tMSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIit0KTtyZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZS5kZWZhdWx0RW5jb2Rpbmc9dCx0aGlzfSxSZS5wcm90b3R5cGUuX3dyaXRlPWZ1bmN0aW9uKHQsZSxyKXtyKG5ldyBFcnJvcigibm90IGltcGxlbWVudGVkIikpfSxSZS5wcm90b3R5cGUuX3dyaXRldj1udWxsLFJlLnByb3RvdHlwZS5lbmQ9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPXRoaXMuX3dyaXRhYmxlU3RhdGU7ImZ1bmN0aW9uIj09dHlwZW9mIHQ/KHI9dCx0PW51bGwsZT1udWxsKToiZnVuY3Rpb24iPT10eXBlb2YgZSYmKHI9ZSxlPW51bGwpLG51bGwhPXQmJnRoaXMud3JpdGUodCxlKSxuLmNvcmtlZCYmKG4uY29ya2VkPTEsdGhpcy51bmNvcmsoKSksbi5lbmRpbmd8fG4uZmluaXNoZWR8fGZ1bmN0aW9uKHQsZSxyKXtlLmVuZGluZz0hMCxDZSh0LGUpLHImJihlLmZpbmlzaGVkP3l0KHIpOnQub25jZSgiZmluaXNoIixyKSk7ZS5lbmRlZD0hMCx0LndyaXRhYmxlPSExfSh0aGlzLG4scil9LEN0KFVlLHVlKTtmb3IodmFyIE1lPU9iamVjdC5rZXlzKFJlLnByb3RvdHlwZSksQmU9MDtCZTxNZS5sZW5ndGg7QmUrKyl7dmFyIHhlPU1lW0JlXTtVZS5wcm90b3R5cGVbeGVdfHwoVWUucHJvdG90eXBlW3hlXT1SZS5wcm90b3R5cGVbeGVdKX1mdW5jdGlvbiBVZSh0KXtpZighKHRoaXMgaW5zdGFuY2VvZiBVZSkpcmV0dXJuIG5ldyBVZSh0KTt1ZS5jYWxsKHRoaXMsdCksUmUuY2FsbCh0aGlzLHQpLHQmJiExPT09dC5yZWFkYWJsZSYmKHRoaXMucmVhZGFibGU9ITEpLHQmJiExPT09dC53cml0YWJsZSYmKHRoaXMud3JpdGFibGU9ITEpLHRoaXMuYWxsb3dIYWxmT3Blbj0hMCx0JiYhMT09PXQuYWxsb3dIYWxmT3BlbiYmKHRoaXMuYWxsb3dIYWxmT3Blbj0hMSksdGhpcy5vbmNlKCJlbmQiLEllKX1mdW5jdGlvbiBJZSgpe3RoaXMuYWxsb3dIYWxmT3Blbnx8dGhpcy5fd3JpdGFibGVTdGF0ZS5lbmRlZHx8eXQoRGUsdGhpcyl9ZnVuY3Rpb24gRGUodCl7dC5lbmQoKX1mdW5jdGlvbiBOZSh0KXt0aGlzLmFmdGVyVHJhbnNmb3JtPWZ1bmN0aW9uKGUscil7cmV0dXJuIGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj10Ll90cmFuc2Zvcm1TdGF0ZTtuLnRyYW5zZm9ybWluZz0hMTt2YXIgaT1uLndyaXRlY2I7aWYoIWkpcmV0dXJuIHQuZW1pdCgiZXJyb3IiLG5ldyBFcnJvcigibm8gd3JpdGVjYiBpbiBUcmFuc2Zvcm0gY2xhc3MiKSk7bi53cml0ZWNodW5rPW51bGwsbi53cml0ZWNiPW51bGwsbnVsbCE9ciYmdC5wdXNoKHIpO2koZSk7dmFyIG89dC5fcmVhZGFibGVTdGF0ZTtvLnJlYWRpbmc9ITEsKG8ubmVlZFJlYWRhYmxlfHxvLmxlbmd0aDxvLmhpZ2hXYXRlck1hcmspJiZ0Ll9yZWFkKG8uaGlnaFdhdGVyTWFyayl9KHQsZSxyKX0sdGhpcy5uZWVkVHJhbnNmb3JtPSExLHRoaXMudHJhbnNmb3JtaW5nPSExLHRoaXMud3JpdGVjYj1udWxsLHRoaXMud3JpdGVjaHVuaz1udWxsLHRoaXMud3JpdGVlbmNvZGluZz1udWxsfWZ1bmN0aW9uIEZlKHQpe2lmKCEodGhpcyBpbnN0YW5jZW9mIEZlKSlyZXR1cm4gbmV3IEZlKHQpO1VlLmNhbGwodGhpcyx0KSx0aGlzLl90cmFuc2Zvcm1TdGF0ZT1uZXcgTmUodGhpcyk7dmFyIGU9dGhpczt0aGlzLl9yZWFkYWJsZVN0YXRlLm5lZWRSZWFkYWJsZT0hMCx0aGlzLl9yZWFkYWJsZVN0YXRlLnN5bmM9ITEsdCYmKCJmdW5jdGlvbiI9PXR5cGVvZiB0LnRyYW5zZm9ybSYmKHRoaXMuX3RyYW5zZm9ybT10LnRyYW5zZm9ybSksImZ1bmN0aW9uIj09dHlwZW9mIHQuZmx1c2gmJih0aGlzLl9mbHVzaD10LmZsdXNoKSksdGhpcy5vbmNlKCJwcmVmaW5pc2giLChmdW5jdGlvbigpeyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLl9mbHVzaD90aGlzLl9mbHVzaCgoZnVuY3Rpb24odCl7emUoZSx0KX0pKTp6ZShlKX0pKX1mdW5jdGlvbiB6ZSh0LGUpe2lmKGUpcmV0dXJuIHQuZW1pdCgiZXJyb3IiLGUpO3ZhciByPXQuX3dyaXRhYmxlU3RhdGUsbj10Ll90cmFuc2Zvcm1TdGF0ZTtpZihyLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIkNhbGxpbmcgdHJhbnNmb3JtIGRvbmUgd2hlbiB3cy5sZW5ndGggIT0gMCIpO2lmKG4udHJhbnNmb3JtaW5nKXRocm93IG5ldyBFcnJvcigiQ2FsbGluZyB0cmFuc2Zvcm0gZG9uZSB3aGVuIHN0aWxsIHRyYW5zZm9ybWluZyIpO3JldHVybiB0LnB1c2gobnVsbCl9ZnVuY3Rpb24gcWUodCl7aWYoISh0aGlzIGluc3RhbmNlb2YgcWUpKXJldHVybiBuZXcgcWUodCk7RmUuY2FsbCh0aGlzLHQpfWZ1bmN0aW9uIFllKCl7ZS5jYWxsKHRoaXMpfUN0KEZlLFVlKSxGZS5wcm90b3R5cGUucHVzaD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl90cmFuc2Zvcm1TdGF0ZS5uZWVkVHJhbnNmb3JtPSExLFVlLnByb3RvdHlwZS5wdXNoLmNhbGwodGhpcyx0LGUpfSxGZS5wcm90b3R5cGUuX3RyYW5zZm9ybT1mdW5jdGlvbih0LGUscil7dGhyb3cgbmV3IEVycm9yKCJOb3QgaW1wbGVtZW50ZWQiKX0sRmUucHJvdG90eXBlLl93cml0ZT1mdW5jdGlvbih0LGUscil7dmFyIG49dGhpcy5fdHJhbnNmb3JtU3RhdGU7aWYobi53cml0ZWNiPXIsbi53cml0ZWNodW5rPXQsbi53cml0ZWVuY29kaW5nPWUsIW4udHJhbnNmb3JtaW5nKXt2YXIgaT10aGlzLl9yZWFkYWJsZVN0YXRlOyhuLm5lZWRUcmFuc2Zvcm18fGkubmVlZFJlYWRhYmxlfHxpLmxlbmd0aDxpLmhpZ2hXYXRlck1hcmspJiZ0aGlzLl9yZWFkKGkuaGlnaFdhdGVyTWFyayl9fSxGZS5wcm90b3R5cGUuX3JlYWQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fdHJhbnNmb3JtU3RhdGU7bnVsbCE9PWUud3JpdGVjaHVuayYmZS53cml0ZWNiJiYhZS50cmFuc2Zvcm1pbmc/KGUudHJhbnNmb3JtaW5nPSEwLHRoaXMuX3RyYW5zZm9ybShlLndyaXRlY2h1bmssZS53cml0ZWVuY29kaW5nLGUuYWZ0ZXJUcmFuc2Zvcm0pKTplLm5lZWRUcmFuc2Zvcm09ITB9LEN0KHFlLEZlKSxxZS5wcm90b3R5cGUuX3RyYW5zZm9ybT1mdW5jdGlvbih0LGUscil7cihudWxsLHQpfSxDdChZZSxlKSxZZS5SZWFkYWJsZT11ZSxZZS5Xcml0YWJsZT1SZSxZZS5EdXBsZXg9VWUsWWUuVHJhbnNmb3JtPUZlLFllLlBhc3NUaHJvdWdoPXFlLFllLlN0cmVhbT1ZZSxZZS5wcm90b3R5cGUucGlwZT1mdW5jdGlvbih0LHIpe3ZhciBuPXRoaXM7ZnVuY3Rpb24gaShlKXt0LndyaXRhYmxlJiYhMT09PXQud3JpdGUoZSkmJm4ucGF1c2UmJm4ucGF1c2UoKX1mdW5jdGlvbiBvKCl7bi5yZWFkYWJsZSYmbi5yZXN1bWUmJm4ucmVzdW1lKCl9bi5vbigiZGF0YSIsaSksdC5vbigiZHJhaW4iLG8pLHQuX2lzU3RkaW98fHImJiExPT09ci5lbmR8fChuLm9uKCJlbmQiLGEpLG4ub24oImNsb3NlIix1KSk7dmFyIHM9ITE7ZnVuY3Rpb24gYSgpe3N8fChzPSEwLHQuZW5kKCkpfWZ1bmN0aW9uIHUoKXtzfHwocz0hMCwiZnVuY3Rpb24iPT10eXBlb2YgdC5kZXN0cm95JiZ0LmRlc3Ryb3koKSl9ZnVuY3Rpb24gaCh0KXtpZihmKCksMD09PWUubGlzdGVuZXJDb3VudCh0aGlzLCJlcnJvciIpKXRocm93IHR9ZnVuY3Rpb24gZigpe24ucmVtb3ZlTGlzdGVuZXIoImRhdGEiLGkpLHQucmVtb3ZlTGlzdGVuZXIoImRyYWluIixvKSxuLnJlbW92ZUxpc3RlbmVyKCJlbmQiLGEpLG4ucmVtb3ZlTGlzdGVuZXIoImNsb3NlIix1KSxuLnJlbW92ZUxpc3RlbmVyKCJlcnJvciIsaCksdC5yZW1vdmVMaXN0ZW5lcigiZXJyb3IiLGgpLG4ucmVtb3ZlTGlzdGVuZXIoImVuZCIsZiksbi5yZW1vdmVMaXN0ZW5lcigiY2xvc2UiLGYpLHQucmVtb3ZlTGlzdGVuZXIoImNsb3NlIixmKX1yZXR1cm4gbi5vbigiZXJyb3IiLGgpLHQub24oImVycm9yIixoKSxuLm9uKCJlbmQiLGYpLG4ub24oImNsb3NlIixmKSx0Lm9uKCJjbG9zZSIsZiksdC5lbWl0KCJwaXBlIixuKSx0fTt2YXIgV2U9e30sJGU9e2dldCBleHBvcnRzKCl7cmV0dXJuIFdlfSxzZXQgZXhwb3J0cyh0KXtXZT10fX07ImZ1bmN0aW9uIj09dHlwZW9mIE9iamVjdC5jcmVhdGU/JGUuZXhwb3J0cz1mdW5jdGlvbih0LGUpe2UmJih0LnN1cGVyXz1lLHQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZS5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTp0LGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pKX06JGUuZXhwb3J0cz1mdW5jdGlvbih0LGUpe2lmKGUpe3Quc3VwZXJfPWU7dmFyIHI9ZnVuY3Rpb24oKXt9O3IucHJvdG90eXBlPWUucHJvdG90eXBlLHQucHJvdG90eXBlPW5ldyByLHQucHJvdG90eXBlLmNvbnN0cnVjdG9yPXR9fTtsZXQgR2U9SGUoKTtmdW5jdGlvbiBKZSh0LGUpeygib2JqZWN0IiE9dHlwZW9mIHR8fEFycmF5LmlzQXJyYXkodCkpJiYoZT10LHQ9e30pO2xldCByPW5ldyBHZSh0KTt2YXIgbjtyZXR1cm4gci5fZnJvbT1BcnJheS5pc0FycmF5KGUpPyhuPShuPWUpLnNsaWNlKCksZnVuY3Rpb24odCxlKXtsZXQgcj1udWxsLGk9bi5sZW5ndGg/bi5zaGlmdCgpOm51bGw7aSBpbnN0YW5jZW9mIEVycm9yJiYocj1pLGk9bnVsbCksZShyLGkpfSk6ZXx8VmUscn1mdW5jdGlvbiBIZSh0LGUpe2Z1bmN0aW9uIHIoZSl7aWYoISh0aGlzIGluc3RhbmNlb2YgcikpcmV0dXJuIG5ldyByKGUpO3RoaXMuX3JlYWRpbmc9ITEsdGhpcy5fY2FsbGJhY2s9ZnVuY3Rpb24odCxlKXtpZihuLmRlc3Ryb3llZClyZXR1cm47aWYodClyZXR1cm4gbi5kZXN0cm95KHQpO2lmKG51bGw9PT1lKXJldHVybiBuLnB1c2gobnVsbCk7bi5fcmVhZGluZz0hMSxuLnB1c2goZSkmJm4uX3JlYWQoaSl9LHRoaXMuZGVzdHJveWVkPSExLHVlLmNhbGwodGhpcyxlfHx0KTtsZXQgbj10aGlzLGk9dGhpcy5fcmVhZGFibGVTdGF0ZS5oaWdoV2F0ZXJNYXJrfXJldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0JiYoZT10LHQ9e30pLHQ9S2UodCksV2Uocix1ZSksci5wcm90b3R5cGUuX2Zyb209ZXx8VmUsci5wcm90b3R5cGUuX3JlYWQ9ZnVuY3Rpb24odCl7dGhpcy5fcmVhZGluZ3x8dGhpcy5kZXN0cm95ZWR8fCh0aGlzLl9yZWFkaW5nPSEwLHRoaXMuX2Zyb20odCx0aGlzLl9jYWxsYmFjaykpfSxyLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKHQpe2lmKHRoaXMuZGVzdHJveWVkKXJldHVybjt0aGlzLmRlc3Ryb3llZD0hMDtsZXQgZT10aGlzO3Byb2Nlc3MubmV4dFRpY2soKGZ1bmN0aW9uKCl7dCYmZS5lbWl0KCJlcnJvciIsdCksZS5lbWl0KCJjbG9zZSIpfSkpfSxyfWZ1bmN0aW9uIFZlKCl7fWZ1bmN0aW9uIEtlKHQpe3JldHVybiB0PXR8fHt9fUplLmN0b3I9SGUsSmUub2JqPWZ1bmN0aW9uKHQsZSl7cmV0dXJuKCJmdW5jdGlvbiI9PXR5cGVvZiB0fHxBcnJheS5pc0FycmF5KHQpKSYmKGU9dCx0PXt9KSwodD1LZSh0KSkub2JqZWN0TW9kZT0hMCx0LmhpZ2hXYXRlck1hcms9MTYsSmUodCxlKX07dmFyIFplLFFlPTEsWGU9e30sdHI9ITEsZXI9YS5kb2N1bWVudDtmdW5jdGlvbiBycih0KXsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9bmV3IEZ1bmN0aW9uKCIiK3QpKTtmb3IodmFyIGU9bmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgtMSkscj0wO3I8ZS5sZW5ndGg7cisrKWVbcl09YXJndW1lbnRzW3IrMV07dmFyIG49e2NhbGxiYWNrOnQsYXJnczplfTtyZXR1cm4gWGVbUWVdPW4sWmUoUWUpLFFlKyt9ZnVuY3Rpb24gbnIodCl7aWYodHIpc2V0VGltZW91dChuciwwLHQpO2Vsc2V7dmFyIGU9WGVbdF07aWYoZSl7dHI9ITA7dHJ5eyFmdW5jdGlvbih0KXt2YXIgZT10LmNhbGxiYWNrLHI9dC5hcmdzO3N3aXRjaChyLmxlbmd0aCl7Y2FzZSAwOmUoKTticmVhaztjYXNlIDE6ZShyWzBdKTticmVhaztjYXNlIDI6ZShyWzBdLHJbMV0pO2JyZWFrO2Nhc2UgMzplKHJbMF0sclsxXSxyWzJdKTticmVhaztkZWZhdWx0OmUuYXBwbHkodm9pZCAwLHIpfX0oZSl9ZmluYWxseXshZnVuY3Rpb24odCl7ZGVsZXRlIFhlW3RdfSh0KSx0cj0hMX19fX12YXIgaXIsb3Isc3IsYXIsdXI9T2JqZWN0LmdldFByb3RvdHlwZU9mJiZPYmplY3QuZ2V0UHJvdG90eXBlT2YoYSk7ZnVuY3Rpb24gaHIodCl7bGV0IGUscj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCk7aWYoZT0iW29iamVjdCBQcm9taXNlXSI9PT1yLGUpcmV0dXJuITA7aWYoIltvYmplY3QgRnVuY3Rpb25dIiE9PXIpcmV0dXJuITE7dHJ5e2U9ImZ1bmN0aW9uIiE9dHlwZW9mIHQuc3Vic2NyaWJlJiYiZnVuY3Rpb24iPT10eXBlb2YgdC50aGVufWNhdGNoKHQpe31yZXR1cm4gZX1mdW5jdGlvbiBmcih0KXtsZXQgZSxyLG47ZnVuY3Rpb24gaShpKXsoKHQ9aSlpbnN0YW5jZW9mIEFycmF5QnVmZmVyfHxBcnJheUJ1ZmZlci5pc1ZpZXcodCkmJiFfLmlzQnVmZmVyKHQpKSYmKHQ9Xy5mcm9tKHQpKSxlPWhyKHQpP3Q6bnVsbDtjb25zdCBvPSFlJiZ0W1N5bWJvbC5pdGVyYXRvcl0mJiJzdHJpbmciIT10eXBlb2YgdCYmIV8uaXNCdWZmZXIodCk7cj1vP3RbU3ltYm9sLml0ZXJhdG9yXSgpOm51bGw7Y29uc3Qgcz0hZSYmdFtTeW1ib2wuYXN5bmNJdGVyYXRvcl07bj1zP3RbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk6bnVsbH1yZXR1cm4gQXJyYXkuaXNBcnJheSh0KSYmKHQ9dC5zbGljZSgpKSxpKHQpLEplKChmdW5jdGlvbiBvKHMsYSl7aWYoZSlyZXR1cm4gdm9pZChhc3luYygpPT57dHJ5e2F3YWl0IGkoYXdhaXQgZSksby5jYWxsKHRoaXMscyxhKX1jYXRjaCh0KXthKHQpfX0pKCk7aWYocil7Y29uc3QgdD1yLm5leHQoKTtyZXR1cm4gdm9pZCBycihhLG51bGwsdC5kb25lP251bGw6dC52YWx1ZSl9aWYobilyZXR1cm4gdm9pZChhc3luYygpPT57dHJ5e2NvbnN0IHQ9YXdhaXQgbi5uZXh0KCk7cnIoYSxudWxsLHQuZG9uZT9udWxsOnQudmFsdWUpfWNhdGNoKHQpe3JyKGEsdCl9fSkoKTtpZigwPT09dC5sZW5ndGgpcmV0dXJuIHZvaWQgcnIoYSxudWxsLG51bGwpO2NvbnN0IHU9dC5zbGljZSgwLHMpO3Q9dC5zbGljZShzKSxycihhLG51bGwsdSl9KSl9dXI9dXImJnVyLnNldFRpbWVvdXQ/dXI6YSwiW29iamVjdCBwcm9jZXNzXSI9PT17fS50b1N0cmluZy5jYWxsKGEucHJvY2Vzcyk/WmU9ZnVuY3Rpb24odCl7THQubmV4dFRpY2soKGZ1bmN0aW9uKCl7bnIodCl9KSl9OiFmdW5jdGlvbigpe2lmKGEucG9zdE1lc3NhZ2UmJiFhLmltcG9ydFNjcmlwdHMpe3ZhciB0PSEwLGU9YS5vbm1lc3NhZ2U7cmV0dXJuIGEub25tZXNzYWdlPWZ1bmN0aW9uKCl7dD0hMX0sYS5wb3N0TWVzc2FnZSgiIiwiKiIpLGEub25tZXNzYWdlPWUsdH19KCk/YS5NZXNzYWdlQ2hhbm5lbD8oKG9yPW5ldyBNZXNzYWdlQ2hhbm5lbCkucG9ydDEub25tZXNzYWdlPWZ1bmN0aW9uKHQpe25yKHQuZGF0YSl9LFplPWZ1bmN0aW9uKHQpe29yLnBvcnQyLnBvc3RNZXNzYWdlKHQpfSk6ZXImJiJvbnJlYWR5c3RhdGVjaGFuZ2UiaW4gZXIuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik/KGlyPWVyLmRvY3VtZW50RWxlbWVudCxaZT1mdW5jdGlvbih0KXt2YXIgZT1lci5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtlLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe25yKHQpLGUub25yZWFkeXN0YXRlY2hhbmdlPW51bGwsaXIucmVtb3ZlQ2hpbGQoZSksZT1udWxsfSxpci5hcHBlbmRDaGlsZChlKX0pOlplPWZ1bmN0aW9uKHQpe3NldFRpbWVvdXQobnIsMCx0KX06KHNyPSJzZXRJbW1lZGlhdGUkIitNYXRoLnJhbmRvbSgpKyIkIixhcj1mdW5jdGlvbih0KXt0LnNvdXJjZT09PWEmJiJzdHJpbmciPT10eXBlb2YgdC5kYXRhJiYwPT09dC5kYXRhLmluZGV4T2Yoc3IpJiZucigrdC5kYXRhLnNsaWNlKHNyLmxlbmd0aCkpfSxhLmFkZEV2ZW50TGlzdGVuZXI/YS5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixhciwhMSk6YS5hdHRhY2hFdmVudCgib25tZXNzYWdlIixhciksWmU9ZnVuY3Rpb24odCl7YS5wb3N0TWVzc2FnZShzcit0LCIqIil9KSxmci5vYmplY3Q9dD0+e2xldCBlLHIsbjtmdW5jdGlvbiBpKGkpe2U9aHIodD1pKT90Om51bGwscj0hZSYmdFtTeW1ib2wuaXRlcmF0b3JdP3RbU3ltYm9sLml0ZXJhdG9yXSgpOm51bGwsbj0hZSYmdFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0/dFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTpudWxsfXJldHVybiBBcnJheS5pc0FycmF5KHQpJiYodD10LnNsaWNlKCkpLGkodCksSmUub2JqKChmdW5jdGlvbiBvKHMsYSl7aWYoZSkoYXN5bmMoKT0+e3RyeXthd2FpdCBpKGF3YWl0IGUpLG8uY2FsbCh0aGlzLHMsYSl9Y2F0Y2godCl7YSh0KX19KSgpO2Vsc2UgaWYocil7Y29uc3QgdD1yLm5leHQoKTtycihhLG51bGwsdC5kb25lP251bGw6dC52YWx1ZSl9ZWxzZSBuPyhhc3luYygpPT57dHJ5e2NvbnN0IHQ9YXdhaXQgbi5uZXh0KCk7cnIoYSxudWxsLHQuZG9uZT9udWxsOnQudmFsdWUpfWNhdGNoKHQpe3JyKGEsdCl9fSkoKToodGhpcy5wdXNoKHQpLHJyKGEsbnVsbCxudWxsKSl9KSl9O3ZhciBjcj17fSxscj1jci5MRUZUX0JSQUNFPTEscHI9Y3IuUklHSFRfQlJBQ0U9Mixkcj1jci5MRUZUX0JSQUNLRVQ9Myxncj1jci5SSUdIVF9CUkFDS0VUPTQseXI9Y3IuQ09MT049NSx2cj1jci5DT01NQT02LGJyPWNyLlRSVUU9Nyxtcj1jci5GQUxTRT04LHdyPWNyLk5VTEw9OSxfcj1jci5TVFJJTkc9MTAsU3I9Y3IuTlVNQkVSPTExLEVyPWNyLlNUQVJUPTE3LGtyPWNyLlNUT1A9MTgsUnI9Y3IuVFJVRTE9MzMsQXI9Y3IuVFJVRTI9MzQsT3I9Y3IuVFJVRTM9MzUsVHI9Y3IuRkFMU0UxPTQ5LGpyPWNyLkZBTFNFMj01MCxMcj1jci5GQUxTRTM9NTEsQ3I9Y3IuRkFMU0U0PTUyLFByPWNyLk5VTEwxPTY1LE1yPWNyLk5VTEwyPTY2LEJyPWNyLk5VTEwzPTY3LHhyPWNyLk5VTUJFUjE9ODEsVXI9Y3IuTlVNQkVSMz04MyxJcj1jci5TVFJJTkcxPTk3LERyPWNyLlNUUklORzI9OTgsTnI9Y3IuU1RSSU5HMz05OSxGcj1jci5TVFJJTkc0PTEwMCx6cj1jci5TVFJJTkc1PTEwMSxxcj1jci5TVFJJTkc2PTEwMixZcj1jci5WQUxVRT0xMTMsV3I9Y3IuS0VZPTExNCwkcj1jci5PQkpFQ1Q9MTI5LEdyPWNyLkFSUkFZPTEzMCxKcj0iXFwiLmNoYXJDb2RlQXQoMCksSHI9Ii8iLmNoYXJDb2RlQXQoMCksVnI9IlxiIi5jaGFyQ29kZUF0KDApLEtyPSJcZiIuY2hhckNvZGVBdCgwKSxacj0iXG4iLmNoYXJDb2RlQXQoMCksUXI9IlxyIi5jaGFyQ29kZUF0KDApLFhyPSJcdCIuY2hhckNvZGVBdCgwKSx0bj02NTUzNjtmdW5jdGlvbiBlbigpe3RoaXMudFN0YXRlPUVyLHRoaXMudmFsdWU9dm9pZCAwLHRoaXMuc3RyaW5nPXZvaWQgMCx0aGlzLnN0cmluZ0J1ZmZlcj1fLmFsbG9jP18uYWxsb2ModG4pOm5ldyBfKHRuKSx0aGlzLnN0cmluZ0J1ZmZlck9mZnNldD0wLHRoaXMudW5pY29kZT12b2lkIDAsdGhpcy5oaWdoU3Vycm9nYXRlPXZvaWQgMCx0aGlzLmtleT12b2lkIDAsdGhpcy5tb2RlPXZvaWQgMCx0aGlzLnN0YWNrPVtdLHRoaXMuc3RhdGU9WXIsdGhpcy5ieXRlc19yZW1haW5pbmc9MCx0aGlzLmJ5dGVzX2luX3NlcXVlbmNlPTAsdGhpcy50ZW1wX2J1ZmZzPXsyOm5ldyBfKDIpLDM6bmV3IF8oMyksNDpuZXcgXyg0KX0sdGhpcy5vZmZzZXQ9LTF9ZW4udG9rbmFtPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1PYmplY3Qua2V5cyhjcikscj0wLG49ZS5sZW5ndGg7cjxuO3IrKyl7dmFyIGk9ZVtyXTtpZihjcltpXT09PXQpcmV0dXJuIGl9cmV0dXJuIHQmJiIweCIrdC50b1N0cmluZygxNil9O3ZhciBybj1lbi5wcm90b3R5cGU7cm4ub25FcnJvcj1mdW5jdGlvbih0KXt0aHJvdyB0fSxybi5jaGFyRXJyb3I9ZnVuY3Rpb24odCxlKXt0aGlzLnRTdGF0ZT1rcix0aGlzLm9uRXJyb3IobmV3IEVycm9yKCJVbmV4cGVjdGVkICIrSlNPTi5zdHJpbmdpZnkoU3RyaW5nLmZyb21DaGFyQ29kZSh0W2VdKSkrIiBhdCBwb3NpdGlvbiAiK2UrIiBpbiBzdGF0ZSAiK2VuLnRva25hbSh0aGlzLnRTdGF0ZSkpKX0scm4uYXBwZW5kU3RyaW5nQ2hhcj1mdW5jdGlvbih0KXt0aGlzLnN0cmluZ0J1ZmZlck9mZnNldD49dG4mJih0aGlzLnN0cmluZys9dGhpcy5zdHJpbmdCdWZmZXIudG9TdHJpbmcoInV0ZjgiKSx0aGlzLnN0cmluZ0J1ZmZlck9mZnNldD0wKSx0aGlzLnN0cmluZ0J1ZmZlclt0aGlzLnN0cmluZ0J1ZmZlck9mZnNldCsrXT10fSxybi5hcHBlbmRTdHJpbmdCdWY9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPXQubGVuZ3RoOyJudW1iZXIiPT10eXBlb2YgZSYmKG49Im51bWJlciI9PXR5cGVvZiByP3I8MD90Lmxlbmd0aC1lK3I6ci1lOnQubGVuZ3RoLWUpLG48MCYmKG49MCksdGhpcy5zdHJpbmdCdWZmZXJPZmZzZXQrbj50biYmKHRoaXMuc3RyaW5nKz10aGlzLnN0cmluZ0J1ZmZlci50b1N0cmluZygidXRmOCIsMCx0aGlzLnN0cmluZ0J1ZmZlck9mZnNldCksdGhpcy5zdHJpbmdCdWZmZXJPZmZzZXQ9MCksdC5jb3B5KHRoaXMuc3RyaW5nQnVmZmVyLHRoaXMuc3RyaW5nQnVmZmVyT2Zmc2V0LGUsciksdGhpcy5zdHJpbmdCdWZmZXJPZmZzZXQrPW59LHJuLndyaXRlPWZ1bmN0aW9uKHQpe3ZhciBlOyJzdHJpbmciPT10eXBlb2YgdCYmKHQ9bmV3IF8odCkpO2Zvcih2YXIgcj0wLG49dC5sZW5ndGg7cjxuO3IrKylpZih0aGlzLnRTdGF0ZT09PUVyKXtpZihlPXRbcl0sdGhpcy5vZmZzZXQrKywxMjM9PT1lKXRoaXMub25Ub2tlbihsciwieyIpO2Vsc2UgaWYoMTI1PT09ZSl0aGlzLm9uVG9rZW4ocHIsIn0iKTtlbHNlIGlmKDkxPT09ZSl0aGlzLm9uVG9rZW4oZHIsIlsiKTtlbHNlIGlmKDkzPT09ZSl0aGlzLm9uVG9rZW4oZ3IsIl0iKTtlbHNlIGlmKDU4PT09ZSl0aGlzLm9uVG9rZW4oeXIsIjoiKTtlbHNlIGlmKDQ0PT09ZSl0aGlzLm9uVG9rZW4odnIsIiwiKTtlbHNlIGlmKDExNj09PWUpdGhpcy50U3RhdGU9UnI7ZWxzZSBpZigxMDI9PT1lKXRoaXMudFN0YXRlPVRyO2Vsc2UgaWYoMTEwPT09ZSl0aGlzLnRTdGF0ZT1QcjtlbHNlIGlmKDM0PT09ZSl0aGlzLnN0cmluZz0iIix0aGlzLnN0cmluZ0J1ZmZlck9mZnNldD0wLHRoaXMudFN0YXRlPUlyO2Vsc2UgaWYoNDU9PT1lKXRoaXMuc3RyaW5nPSItIix0aGlzLnRTdGF0ZT14cjtlbHNlIGlmKGU+PTQ4JiZlPDY0KXRoaXMuc3RyaW5nPVN0cmluZy5mcm9tQ2hhckNvZGUoZSksdGhpcy50U3RhdGU9VXI7ZWxzZSBpZigzMiE9PWUmJjkhPT1lJiYxMCE9PWUmJjEzIT09ZSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKX1lbHNlIGlmKHRoaXMudFN0YXRlPT09SXIpaWYoZT10W3JdLHRoaXMuYnl0ZXNfcmVtYWluaW5nPjApe2Zvcih2YXIgaT0wO2k8dGhpcy5ieXRlc19yZW1haW5pbmc7aSsrKXRoaXMudGVtcF9idWZmc1t0aGlzLmJ5dGVzX2luX3NlcXVlbmNlXVt0aGlzLmJ5dGVzX2luX3NlcXVlbmNlLXRoaXMuYnl0ZXNfcmVtYWluaW5nK2ldPXRbaV07dGhpcy5hcHBlbmRTdHJpbmdCdWYodGhpcy50ZW1wX2J1ZmZzW3RoaXMuYnl0ZXNfaW5fc2VxdWVuY2VdKSx0aGlzLmJ5dGVzX2luX3NlcXVlbmNlPXRoaXMuYnl0ZXNfcmVtYWluaW5nPTAscj1yK2ktMX1lbHNlIGlmKDA9PT10aGlzLmJ5dGVzX3JlbWFpbmluZyYmZT49MTI4KXtpZihlPD0xOTN8fGU+MjQ0KXJldHVybiB0aGlzLm9uRXJyb3IobmV3IEVycm9yKCJJbnZhbGlkIFVURi04IGNoYXJhY3RlciBhdCBwb3NpdGlvbiAiK3IrIiBpbiBzdGF0ZSAiK2VuLnRva25hbSh0aGlzLnRTdGF0ZSkpKTtpZihlPj0xOTQmJmU8PTIyMyYmKHRoaXMuYnl0ZXNfaW5fc2VxdWVuY2U9MiksZT49MjI0JiZlPD0yMzkmJih0aGlzLmJ5dGVzX2luX3NlcXVlbmNlPTMpLGU+PTI0MCYmZTw9MjQ0JiYodGhpcy5ieXRlc19pbl9zZXF1ZW5jZT00KSx0aGlzLmJ5dGVzX2luX3NlcXVlbmNlK3I+dC5sZW5ndGgpe2Zvcih2YXIgbz0wO288PXQubGVuZ3RoLTEtcjtvKyspdGhpcy50ZW1wX2J1ZmZzW3RoaXMuYnl0ZXNfaW5fc2VxdWVuY2VdW29dPXRbcitvXTt0aGlzLmJ5dGVzX3JlbWFpbmluZz1yK3RoaXMuYnl0ZXNfaW5fc2VxdWVuY2UtdC5sZW5ndGgscj10Lmxlbmd0aC0xfWVsc2UgdGhpcy5hcHBlbmRTdHJpbmdCdWYodCxyLHIrdGhpcy5ieXRlc19pbl9zZXF1ZW5jZSkscj1yK3RoaXMuYnl0ZXNfaW5fc2VxdWVuY2UtMX1lbHNlIGlmKDM0PT09ZSl0aGlzLnRTdGF0ZT1Fcix0aGlzLnN0cmluZys9dGhpcy5zdHJpbmdCdWZmZXIudG9TdHJpbmcoInV0ZjgiLDAsdGhpcy5zdHJpbmdCdWZmZXJPZmZzZXQpLHRoaXMuc3RyaW5nQnVmZmVyT2Zmc2V0PTAsdGhpcy5vblRva2VuKF9yLHRoaXMuc3RyaW5nKSx0aGlzLm9mZnNldCs9Xy5ieXRlTGVuZ3RoKHRoaXMuc3RyaW5nLCJ1dGY4IikrMSx0aGlzLnN0cmluZz12b2lkIDA7ZWxzZSBpZig5Mj09PWUpdGhpcy50U3RhdGU9RHI7ZWxzZXtpZighKGU+PTMyKSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLmFwcGVuZFN0cmluZ0NoYXIoZSl9ZWxzZSBpZih0aGlzLnRTdGF0ZT09PURyKWlmKDM0PT09KGU9dFtyXSkpdGhpcy5hcHBlbmRTdHJpbmdDaGFyKGUpLHRoaXMudFN0YXRlPUlyO2Vsc2UgaWYoOTI9PT1lKXRoaXMuYXBwZW5kU3RyaW5nQ2hhcihKciksdGhpcy50U3RhdGU9SXI7ZWxzZSBpZig0Nz09PWUpdGhpcy5hcHBlbmRTdHJpbmdDaGFyKEhyKSx0aGlzLnRTdGF0ZT1JcjtlbHNlIGlmKDk4PT09ZSl0aGlzLmFwcGVuZFN0cmluZ0NoYXIoVnIpLHRoaXMudFN0YXRlPUlyO2Vsc2UgaWYoMTAyPT09ZSl0aGlzLmFwcGVuZFN0cmluZ0NoYXIoS3IpLHRoaXMudFN0YXRlPUlyO2Vsc2UgaWYoMTEwPT09ZSl0aGlzLmFwcGVuZFN0cmluZ0NoYXIoWnIpLHRoaXMudFN0YXRlPUlyO2Vsc2UgaWYoMTE0PT09ZSl0aGlzLmFwcGVuZFN0cmluZ0NoYXIoUXIpLHRoaXMudFN0YXRlPUlyO2Vsc2UgaWYoMTE2PT09ZSl0aGlzLmFwcGVuZFN0cmluZ0NoYXIoWHIpLHRoaXMudFN0YXRlPUlyO2Vsc2V7aWYoMTE3IT09ZSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLnVuaWNvZGU9IiIsdGhpcy50U3RhdGU9TnJ9ZWxzZSBpZih0aGlzLnRTdGF0ZT09PU5yfHx0aGlzLnRTdGF0ZT09PUZyfHx0aGlzLnRTdGF0ZT09PXpyfHx0aGlzLnRTdGF0ZT09PXFyKXtpZighKChlPXRbcl0pPj00OCYmZTw2NHx8ZT42NCYmZTw9NzB8fGU+OTYmJmU8PTEwMikpcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7aWYodGhpcy51bmljb2RlKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGUpLHRoaXMudFN0YXRlKys9PT1xcil7dmFyIHM9cGFyc2VJbnQodGhpcy51bmljb2RlLDE2KTt0aGlzLnVuaWNvZGU9dm9pZCAwLHZvaWQgMCE9PXRoaXMuaGlnaFN1cnJvZ2F0ZSYmcz49NTYzMjAmJnM8NTczNDQ/KHRoaXMuYXBwZW5kU3RyaW5nQnVmKG5ldyBfKFN0cmluZy5mcm9tQ2hhckNvZGUodGhpcy5oaWdoU3Vycm9nYXRlLHMpKSksdGhpcy5oaWdoU3Vycm9nYXRlPXZvaWQgMCk6dm9pZCAwPT09dGhpcy5oaWdoU3Vycm9nYXRlJiZzPj01NTI5NiYmczw1NjMyMD90aGlzLmhpZ2hTdXJyb2dhdGU9czoodm9pZCAwIT09dGhpcy5oaWdoU3Vycm9nYXRlJiYodGhpcy5hcHBlbmRTdHJpbmdCdWYobmV3IF8oU3RyaW5nLmZyb21DaGFyQ29kZSh0aGlzLmhpZ2hTdXJyb2dhdGUpKSksdGhpcy5oaWdoU3Vycm9nYXRlPXZvaWQgMCksdGhpcy5hcHBlbmRTdHJpbmdCdWYobmV3IF8oU3RyaW5nLmZyb21DaGFyQ29kZShzKSkpKSx0aGlzLnRTdGF0ZT1Jcn19ZWxzZSBpZih0aGlzLnRTdGF0ZT09PXhyfHx0aGlzLnRTdGF0ZT09PVVyKXN3aXRjaChlPXRbcl0pe2Nhc2UgNDg6Y2FzZSA0OTpjYXNlIDUwOmNhc2UgNTE6Y2FzZSA1MjpjYXNlIDUzOmNhc2UgNTQ6Y2FzZSA1NTpjYXNlIDU2OmNhc2UgNTc6Y2FzZSA0NjpjYXNlIDEwMTpjYXNlIDY5OmNhc2UgNDM6Y2FzZSA0NTp0aGlzLnN0cmluZys9U3RyaW5nLmZyb21DaGFyQ29kZShlKSx0aGlzLnRTdGF0ZT1VcjticmVhaztkZWZhdWx0OnRoaXMudFN0YXRlPUVyO3ZhciBhPU51bWJlcih0aGlzLnN0cmluZyk7aWYoaXNOYU4oYSkpcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7dGhpcy5zdHJpbmcubWF0Y2goL1swLTldKy8pPT10aGlzLnN0cmluZyYmYS50b1N0cmluZygpIT10aGlzLnN0cmluZz90aGlzLm9uVG9rZW4oX3IsdGhpcy5zdHJpbmcpOnRoaXMub25Ub2tlbihTcixhKSx0aGlzLm9mZnNldCs9dGhpcy5zdHJpbmcubGVuZ3RoLTEsdGhpcy5zdHJpbmc9dm9pZCAwLHItLX1lbHNlIGlmKHRoaXMudFN0YXRlPT09UnIpe2lmKDExNCE9PXRbcl0pcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7dGhpcy50U3RhdGU9QXJ9ZWxzZSBpZih0aGlzLnRTdGF0ZT09PUFyKXtpZigxMTchPT10W3JdKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMudFN0YXRlPU9yfWVsc2UgaWYodGhpcy50U3RhdGU9PT1Pcil7aWYoMTAxIT09dFtyXSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLnRTdGF0ZT1Fcix0aGlzLm9uVG9rZW4oYnIsITApLHRoaXMub2Zmc2V0Kz0zfWVsc2UgaWYodGhpcy50U3RhdGU9PT1Ucil7aWYoOTchPT10W3JdKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMudFN0YXRlPWpyfWVsc2UgaWYodGhpcy50U3RhdGU9PT1qcil7aWYoMTA4IT09dFtyXSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLnRTdGF0ZT1Mcn1lbHNlIGlmKHRoaXMudFN0YXRlPT09THIpe2lmKDExNSE9PXRbcl0pcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7dGhpcy50U3RhdGU9Q3J9ZWxzZSBpZih0aGlzLnRTdGF0ZT09PUNyKXtpZigxMDEhPT10W3JdKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMudFN0YXRlPUVyLHRoaXMub25Ub2tlbihtciwhMSksdGhpcy5vZmZzZXQrPTR9ZWxzZSBpZih0aGlzLnRTdGF0ZT09PVByKXtpZigxMTchPT10W3JdKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMudFN0YXRlPU1yfWVsc2UgaWYodGhpcy50U3RhdGU9PT1Ncil7aWYoMTA4IT09dFtyXSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLnRTdGF0ZT1Ccn1lbHNlIGlmKHRoaXMudFN0YXRlPT09QnIpe2lmKDEwOCE9PXRbcl0pcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7dGhpcy50U3RhdGU9RXIsdGhpcy5vblRva2VuKHdyLG51bGwpLHRoaXMub2Zmc2V0Kz0zfX0scm4ub25Ub2tlbj1mdW5jdGlvbih0LGUpe30scm4ucGFyc2VFcnJvcj1mdW5jdGlvbih0LGUpe3RoaXMudFN0YXRlPWtyLHRoaXMub25FcnJvcihuZXcgRXJyb3IoIlVuZXhwZWN0ZWQgIitlbi50b2tuYW0odCkrKGU/IigiK0pTT04uc3RyaW5naWZ5KGUpKyIpIjoiIikrIiBpbiBzdGF0ZSAiK2VuLnRva25hbSh0aGlzLnN0YXRlKSkpfSxybi5wdXNoPWZ1bmN0aW9uKCl7dGhpcy5zdGFjay5wdXNoKHt2YWx1ZTp0aGlzLnZhbHVlLGtleTp0aGlzLmtleSxtb2RlOnRoaXMubW9kZX0pfSxybi5wb3A9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnZhbHVlLGU9dGhpcy5zdGFjay5wb3AoKTt0aGlzLnZhbHVlPWUudmFsdWUsdGhpcy5rZXk9ZS5rZXksdGhpcy5tb2RlPWUubW9kZSx0aGlzLmVtaXQodCksdGhpcy5tb2RlfHwodGhpcy5zdGF0ZT1Zcil9LHJuLmVtaXQ9ZnVuY3Rpb24odCl7dGhpcy5tb2RlJiYodGhpcy5zdGF0ZT12ciksdGhpcy5vblZhbHVlKHQpfSxybi5vblZhbHVlPWZ1bmN0aW9uKHQpe30scm4ub25Ub2tlbj1mdW5jdGlvbih0LGUpe2lmKHRoaXMuc3RhdGU9PT1ZcilpZih0PT09X3J8fHQ9PT1Tcnx8dD09PWJyfHx0PT09bXJ8fHQ9PT13cil0aGlzLnZhbHVlJiYodGhpcy52YWx1ZVt0aGlzLmtleV09ZSksdGhpcy5lbWl0KGUpO2Vsc2UgaWYodD09PWxyKXRoaXMucHVzaCgpLHRoaXMudmFsdWU/dGhpcy52YWx1ZT10aGlzLnZhbHVlW3RoaXMua2V5XT17fTp0aGlzLnZhbHVlPXt9LHRoaXMua2V5PXZvaWQgMCx0aGlzLnN0YXRlPVdyLHRoaXMubW9kZT0kcjtlbHNlIGlmKHQ9PT1kcil0aGlzLnB1c2goKSx0aGlzLnZhbHVlP3RoaXMudmFsdWU9dGhpcy52YWx1ZVt0aGlzLmtleV09W106dGhpcy52YWx1ZT1bXSx0aGlzLmtleT0wLHRoaXMubW9kZT1Hcix0aGlzLnN0YXRlPVlyO2Vsc2UgaWYodD09PXByKXtpZih0aGlzLm1vZGUhPT0kcilyZXR1cm4gdGhpcy5wYXJzZUVycm9yKHQsZSk7dGhpcy5wb3AoKX1lbHNle2lmKHQhPT1ncilyZXR1cm4gdGhpcy5wYXJzZUVycm9yKHQsZSk7aWYodGhpcy5tb2RlIT09R3IpcmV0dXJuIHRoaXMucGFyc2VFcnJvcih0LGUpO3RoaXMucG9wKCl9ZWxzZSBpZih0aGlzLnN0YXRlPT09V3IpaWYodD09PV9yKXRoaXMua2V5PWUsdGhpcy5zdGF0ZT15cjtlbHNle2lmKHQhPT1wcilyZXR1cm4gdGhpcy5wYXJzZUVycm9yKHQsZSk7dGhpcy5wb3AoKX1lbHNlIGlmKHRoaXMuc3RhdGU9PT15cil7aWYodCE9PXlyKXJldHVybiB0aGlzLnBhcnNlRXJyb3IodCxlKTt0aGlzLnN0YXRlPVlyfWVsc2V7aWYodGhpcy5zdGF0ZSE9PXZyKXJldHVybiB0aGlzLnBhcnNlRXJyb3IodCxlKTtpZih0PT09dnIpdGhpcy5tb2RlPT09R3I/KHRoaXMua2V5KyssdGhpcy5zdGF0ZT1Zcik6dGhpcy5tb2RlPT09JHImJih0aGlzLnN0YXRlPVdyKTtlbHNle2lmKCEodD09PWdyJiZ0aGlzLm1vZGU9PT1Hcnx8dD09PXByJiZ0aGlzLm1vZGU9PT0kcikpcmV0dXJuIHRoaXMucGFyc2VFcnJvcih0LGUpO3RoaXMucG9wKCl9fX0sZW4uQz1jcjt2YXIgbm49ZW47ZnVuY3Rpb24gb24odCxlLHIpe3Q9dHx8ZnVuY3Rpb24odCl7dGhpcy5xdWV1ZSh0KX0sZT1lfHxmdW5jdGlvbigpe3RoaXMucXVldWUobnVsbCl9O2xldCBuPSExLGk9ITEsbz1bXSxzPSExLGE9bmV3IFllO2Z1bmN0aW9uIHUoKXtmb3IoO28ubGVuZ3RoJiYhYS5wYXVzZWQ7KXtsZXQgdD1vLnNoaWZ0KCk7aWYobnVsbD09PXQpcmV0dXJuIGEuZW1pdCgiZW5kIik7YS5lbWl0KCJkYXRhIix0KX19cmV0dXJuIGEucmVhZGFibGU9YS53cml0YWJsZT0hMCxhLnBhdXNlZD0hMSxhLmF1dG9EZXN0cm95PSEociYmITE9PT1yLmF1dG9EZXN0cm95KSxhLndyaXRlPWZ1bmN0aW9uKGUpe3JldHVybiB0LmNhbGwodGhpcyxlKSwhYS5wYXVzZWR9LGEucXVldWU9YS5wdXNoPWZ1bmN0aW9uKHQpe3JldHVybiBzfHwobnVsbD09PXQmJihzPSEwKSxvLnB1c2godCksdSgpKSxhfSxhLm9uKCJlbmQiLChmdW5jdGlvbigpe2EucmVhZGFibGU9ITEsIWEud3JpdGFibGUmJmEuYXV0b0Rlc3Ryb3kmJkx0Lm5leHRUaWNrKChmdW5jdGlvbigpe2EuZGVzdHJveSgpfSkpfSkpLGEuZW5kPWZ1bmN0aW9uKHQpe2lmKCFuKXJldHVybiBuPSEwLGFyZ3VtZW50cy5sZW5ndGgmJmEud3JpdGUodCksYS53cml0YWJsZT0hMSxlLmNhbGwoYSksIWEucmVhZGFibGUmJmEuYXV0b0Rlc3Ryb3kmJmEuZGVzdHJveSgpLGF9LGEuZGVzdHJveT1mdW5jdGlvbigpe2lmKCFpKXJldHVybiBpPSEwLG49ITAsby5sZW5ndGg9MCxhLndyaXRhYmxlPWEucmVhZGFibGU9ITEsYS5lbWl0KCJjbG9zZSIpLGF9LGEucGF1c2U9ZnVuY3Rpb24oKXtpZighYS5wYXVzZWQpcmV0dXJuIGEucGF1c2VkPSEwLGF9LGEucmVzdW1lPWZ1bmN0aW9uKCl7cmV0dXJuIGEucGF1c2VkJiYoYS5wYXVzZWQ9ITEsYS5lbWl0KCJyZXN1bWUiKSksdSgpLGEucGF1c2VkfHxhLmVtaXQoImRyYWluIiksYX0sYX1vbi50aHJvdWdoPW9uO2xldCBzbj17cGFyc2U6ZnVuY3Rpb24odCxlKXtsZXQgcixuO2Z1bmN0aW9uIGkodCxlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ/ZT09PXQ6dCYmImZ1bmN0aW9uIj09dHlwZW9mIHQuZXhlYz90LmV4ZWMoZSk6ImJvb2xlYW4iPT10eXBlb2YgdHx8Im9iamVjdCI9PXR5cGVvZiB0P3Q6ImZ1bmN0aW9uIj09dHlwZW9mIHQmJnQoZSl9bGV0IG89bmV3IG5uLHM9b24oKGZ1bmN0aW9uKHQpeyJzdHJpbmciPT10eXBlb2YgdCYmKHQ9Xy5mcm9tKHQpKSxvLndyaXRlKHQpfSksKGZ1bmN0aW9uKHQpe3QmJnMud3JpdGUodCksciYmcy5lbWl0KCJoZWFkZXIiLHIpLG4mJnMuZW1pdCgiZm9vdGVyIixuKSxzLnF1ZXVlKG51bGwpfSkpO2Z1bmN0aW9uIGEodCxlKXshMSE9PXImJihyPXJ8fHt9LHJbdF09ZSksITEhPT1uJiYhMT09PXImJihuPW58fHt9LG5bdF09ZSl9cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0JiYodD10LnNwbGl0KCIuIikubWFwKChmdW5jdGlvbih0KXtyZXR1cm4iJCoiPT09dD97ZW1pdEtleTohMH06IioiPT09dHx8KCIiPT09dD97cmVjdXJzZTohMH06dCl9KSkpLHQmJnQubGVuZ3RofHwodD1udWxsKSxvLm9uVmFsdWU9ZnVuY3Rpb24obil7aWYodGhpcy5yb290fHwocy5yb290PW4pLCF0KXJldHVybjtsZXQgbz0wLHU9MCxoPSExLGY9ITE7Zm9yKDtvPHQubGVuZ3RoOyl7bGV0IGUscj10W29dO2lmKHUrKyxyJiYhci5yZWN1cnNlKXtpZihlPXU9PT10aGlzLnN0YWNrLmxlbmd0aD90aGlzOnRoaXMuc3RhY2tbdV0sIWUpcmV0dXJuO2lmKCFpKHIsZS5rZXkpKXJldHVybiB2b2lkIGEoZS5rZXksbik7aD0hIXIuZW1pdEtleSxmPSEhci5lbWl0UGF0aCxvKyt9ZWxzZXtvKys7bGV0IHI9dFtvXTtpZighcilyZXR1cm47Zm9yKDs7KXtpZihlPXU9PT10aGlzLnN0YWNrLmxlbmd0aD90aGlzOnRoaXMuc3RhY2tbdV0sIWUpcmV0dXJuO2lmKGkocixlLmtleSkpe28rKyxPYmplY3QuaXNGcm96ZW4odGhpcy5zdGFja1t1XSl8fCh0aGlzLnN0YWNrW3VdLnZhbHVlPW51bGwpO2JyZWFrfWEoZS5rZXksbiksdSsrfX19aWYociYmKHMuZW1pdCgiaGVhZGVyIixyKSxyPSExKSx1IT09dGhpcy5zdGFjay5sZW5ndGgpcmV0dXJuO2xldCBjPXRoaXMuc3RhY2suc2xpY2UoMSkubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdC5rZXl9KSkuY29uY2F0KFt0aGlzLmtleV0pLGw9bjtudWxsIT1sJiZudWxsIT0obD1lP2UobCxjKTpsKSYmKChofHxmKSYmKGw9e3ZhbHVlOmx9LGgmJihsLmtleT10aGlzLmtleSksZiYmKGwucGF0aD1jKSkscy5xdWV1ZShsKSksdGhpcy52YWx1ZSYmZGVsZXRlIHRoaXMudmFsdWVbdGhpcy5rZXldO2ZvcihsZXQgdCBpbiB0aGlzLnN0YWNrKU9iamVjdC5pc0Zyb3plbih0aGlzLnN0YWNrW3RdKXx8KHRoaXMuc3RhY2tbdF0udmFsdWU9bnVsbCl9LG8uX29uVG9rZW49by5vblRva2VuLG8ub25Ub2tlbj1mdW5jdGlvbihlLHIpe28uX29uVG9rZW4oZSxyKSwwPT09dGhpcy5zdGFjay5sZW5ndGgmJnMucm9vdCYmKHR8fHMucXVldWUocy5yb290KSxzLnJvb3Q9bnVsbCl9LG8ub25FcnJvcj1mdW5jdGlvbih0KXt0Lm1lc3NhZ2UuaW5kZXhPZigiYXQgcG9zaXRpb24iKT4tMSYmKHQubWVzc2FnZT0iSW52YWxpZCBKU09OICgiK3QubWVzc2FnZSsiKSIpLHMuZW1pdCgiZXJyb3IiLHQpfSxzfX0sYW49ZnVuY3Rpb24odCxlKXtyZXR1cm4gYW49T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKHQsZSl7dC5fX3Byb3RvX189ZX18fGZ1bmN0aW9uKHQsZSl7Zm9yKGxldCByIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShyKSYmKHRbcl09ZVtyXSl9LGFuKHQsZSl9O2xldCB1bixobj0vW1xcIlx1MDAwMC1cdTAwMWZcdTAwN2YtXHUwMDlmXHUwMGFkXHUwNjAwLVx1MDYwNFx1MDcwZlx1MTdiNFx1MTdiNVx1MjAwYy1cdTIwMGZcdTIwMjgtXHUyMDJmXHUyMDYwLVx1MjA2Zlx1ZmVmZlx1ZmZmMC1cdWZmZmZdL2csZm49eyJcYiI6IlxcYiIsIlx0IjoiXFx0IiwiXG4iOiJcXG4iLCJcZiI6IlxcZiIsIlxyIjoiXFxyIiwnIic6J1xcIicsIlxcIjoiXFxcXCJ9O2Z1bmN0aW9uIGNuKHQpe3JldHVybiB0PyJmdW5jdGlvbiI9PXR5cGVvZiB0LnRoZW4/dW4uUHJvbWlzZTpmdW5jdGlvbih0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdC5yZWFkJiYiZnVuY3Rpb24iPT10eXBlb2YgdC5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHQucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdC5waXBlJiYiZnVuY3Rpb24iPT10eXBlb2YgdC5vbmNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdC5yZW1vdmVMaXN0ZW5lcn0odCk/dC5fcmVhZGFibGVTdGF0ZS5vYmplY3RNb2RlP3VuLlJlYWRhYmxlT2JqZWN0OnVuLlJlYWRhYmxlU3RyaW5nOkFycmF5LmlzQXJyYXkodCk/dW4uQXJyYXk6Im9iamVjdCI9PXR5cGVvZiB0fHx0IGluc3RhbmNlb2YgT2JqZWN0P3VuLk9iamVjdDp1bi5QcmltaXRpdmU6dW4uUHJpbWl0aXZlfSFmdW5jdGlvbih0KXt0W3QuQXJyYXk9MF09IkFycmF5Iix0W3QuT2JqZWN0PTFdPSJPYmplY3QiLHRbdC5SZWFkYWJsZVN0cmluZz0yXT0iUmVhZGFibGVTdHJpbmciLHRbdC5SZWFkYWJsZU9iamVjdD0zXT0iUmVhZGFibGVPYmplY3QiLHRbdC5QcmltaXRpdmU9NF09IlByaW1pdGl2ZSIsdFt0LlByb21pc2U9NV09IlByb21pc2UifSh1bnx8KHVuPXt9KSk7bGV0IGxuPVtdO2xuW3VuLkFycmF5XT0iWyIsbG5bdW4uT2JqZWN0XT0ieyIsbG5bdW4uUmVhZGFibGVTdHJpbmddPSciJyxsblt1bi5SZWFkYWJsZU9iamVjdF09IlsiO2xldCBwbj1bXTtwblt1bi5BcnJheV09Il0iLHBuW3VuLk9iamVjdF09In0iLHBuW3VuLlJlYWRhYmxlU3RyaW5nXT0nIicscG5bdW4uUmVhZGFibGVPYmplY3RdPSJdIjtsZXQgZG49W107Zm9yKGxldCB0PTAsZT1PYmplY3QuZW50cmllcyh1bik7dDxlLmxlbmd0aDt0Kyspe2xldCByPWVbdF0sbj1yWzBdLGk9clsxXTsibnVtYmVyIj09dHlwZW9mIGkmJihkbltpXT0icHJvY2VzcyIrbil9ZnVuY3Rpb24gZ24odCl7cmV0dXJuIHQucmVwbGFjZShobiwoZnVuY3Rpb24odCl7bGV0IGU9Zm5bdF07cmV0dXJuInN0cmluZyI9PXR5cGVvZiBlP2U6IlxcdSIrdC5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KS5wYWRTdGFydCg0LCIwIil9KSl9ZnVuY3Rpb24geW4odCl7cmV0dXJuJyInK2duKHQpKyciJ31mdW5jdGlvbiB2bih0LGUpe2xldCByPXQucmVhZChlKTtyZXR1cm4gbnVsbD09PXI/bmV3IFByb21pc2UoKGZ1bmN0aW9uKGUscil7bGV0IG49ZnVuY3Rpb24oKXtyZXR1cm4gZShudWxsKX07dC5vbmNlKCJlbmQiLG4pLHQub25jZSgiZXJyb3IiLHIpLHQub25jZSgicmVhZGFibGUiLChmdW5jdGlvbigpe3QucmVtb3ZlTGlzdGVuZXIoImVuZCIsbiksdC5yZW1vdmVMaXN0ZW5lcigiZXJyb3IiLHIpLGUodC5yZWFkKCkpfSkpfSkpOlByb21pc2UucmVzb2x2ZShyKX1mdW5jdGlvbiBibih0KXtyZXR1cm4gdC50aGVuKChmdW5jdGlvbih0KXtyZXR1cm4gY24odCk9PT11bi5Qcm9taXNlP2JuKHQpOnR9KSl9bGV0IG1uPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxyLG4saSl7dm9pZCAwPT09aSYmKGk9ITEpO2xldCBvPXQuY2FsbCh0aGlzKXx8dGhpcztvLmN5Y2xlPWksby5zdGFjaz1bXSxvLmRlcHRoPTAsby5wdXNoQ2FsbGVkPSExLG8uZW5kPSExLG8uaXNSZWFkaW5nPSExLG8ucmVhZE1vcmU9ITE7bGV0IHM9dHlwZW9mIG47cmV0dXJuInN0cmluZyIhPT1zJiYibnVtYmVyIiE9PXN8fChvLmdhcD1OdW1iZXIuaXNGaW5pdGUobik/IiAiLnJlcGVhdChuKTpuKSxPYmplY3QuYXNzaWduKG8se3Zpc2l0ZWQ6aT9uZXcgV2Vha01hcDpuZXcgV2Vha1NldCxyZXBsYWNlckZ1bmN0aW9uOnIgaW5zdGFuY2VvZiBGdW5jdGlvbiYmcixyZXBsYWNlckFycmF5OkFycmF5LmlzQXJyYXkocikmJnJ9KSxyIGluc3RhbmNlb2YgRnVuY3Rpb24mJihvLnJlcGxhY2VyRnVuY3Rpb249ciksQXJyYXkuaXNBcnJheShyKSYmKG8ucmVwbGFjZXJBcnJheT1yKSxvLmFkZFRvU3RhY2soZSksb31yZXR1cm4gZnVuY3Rpb24odCxlKXtmdW5jdGlvbiByKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fWFuKHQsZSksdC5wcm90b3R5cGU9bnVsbD09PWU/T2JqZWN0LmNyZWF0ZShlKTooci5wcm90b3R5cGU9ZS5wcm90b3R5cGUsbmV3IHIpfShlLHQpLGUucHJvdG90eXBlLmN5Y2xlcj1mdW5jdGlvbih0LGUpe2xldCByPXRoaXMudmlzaXRlZC5nZXQoZSk7aWYocilyZXR1cm57JHJlZjpyfTtsZXQgbj10aGlzLnBhdGgoKTtyZXR1cm4gdm9pZCAwIT09dCYmbi5wdXNoKHQpLG49bi5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiJbIisoTnVtYmVyLmlzSW50ZWdlcih0KT90OnluKHQpKSsiXSJ9KSksdGhpcy52aXNpdGVkLnNldChlLG4ubGVuZ3RoPyIkIituLmpvaW4oIiIpOiIkIiksZX0sZS5wcm90b3R5cGUuYWRkVG9TdGFjaz1mdW5jdGlvbih0LGUscixuKXtsZXQgaSxvLHM9dGhpcyxhPXQ7dGhpcy5yZXBsYWNlckZ1bmN0aW9uJiYoYT10aGlzLnJlcGxhY2VyRnVuY3Rpb24oZXx8cixhLHRoaXMpKSxhJiZhLnRvSlNPTiBpbnN0YW5jZW9mIEZ1bmN0aW9uJiYoYT1hLnRvSlNPTigpKSwoYSBpbnN0YW5jZW9mIEZ1bmN0aW9ufHwic3ltYm9sIj09dHlwZW9mIHQpJiYoYT12b2lkIDApLHZvaWQgMCE9PWUmJnRoaXMucmVwbGFjZXJBcnJheSYmKHRoaXMucmVwbGFjZXJBcnJheS5pbmNsdWRlcyhlKXx8KGE9dm9pZCAwKSk7bGV0IHU9Y24oYSk7aWYoKG4mJm4udHlwZT09PXVuLkFycmF5fHx2b2lkIDAhPT1hKSYmdSE9PXVuLlByb21pc2UmJihuJiYhbi5maXJzdCYmdGhpcy5fcHVzaCgiLCIpLG4mJihuLmZpcnN0PSExKSksdm9pZCAwIT09YSYmdSE9PXVuLlByb21pc2UmJmUmJih0aGlzLmdhcD90aGlzLl9wdXNoKCJcbiIrdGhpcy5nYXAucmVwZWF0KHRoaXMuZGVwdGgpKyciJytnbihlKSsnIjogJyk6dGhpcy5fcHVzaCgnIicrZ24oZSkrJyI6JykpLHUhPT11bi5QcmltaXRpdmUpaWYodGhpcy5jeWNsZSlhPXRoaXMuY3ljbGVyKGV8fHIsYSksdT1jbihhKTtlbHNle2lmKHRoaXMudmlzaXRlZC5oYXMoYSkpdGhyb3cgT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IoIkNvbnZlcnRpbmcgY2lyY3VsYXIgc3RydWN0dXJlIHRvIEpTT04iKSx7cmVhbFZhbHVlOmEsa2V5OmV8fHJ9KTt0aGlzLnZpc2l0ZWQuYWRkKGEpfSFlJiZyPi0xJiZ0aGlzLmRlcHRoJiZ0aGlzLmdhcCYmdGhpcy5fcHVzaCgiXG4iK3RoaXMuZ2FwLnJlcGVhdCh0aGlzLmRlcHRoKSk7bGV0IGg9bG5bdV07aCYmdGhpcy5fcHVzaChoKTtsZXQgZj17a2V5OmUsaW5kZXg6cix0eXBlOnUscGFyZW50Om4sdmFsdWU6YSxmaXJzdDohMH07cmV0dXJuIHU9PT11bi5PYmplY3Q/KHRoaXMuZGVwdGgrPTEsZi51bnJlYWQ9T2JqZWN0LmtleXMoYSksZi5pc0VtcHR5PSFmLnVucmVhZC5sZW5ndGgpOnU9PT11bi5BcnJheT8odGhpcy5kZXB0aCs9MSxmLnVucmVhZD1hLmxlbmd0aCxmLmFycmF5TGVuZ3RoPWYudW5yZWFkLGYuaXNFbXB0eT0hZi51bnJlYWQpOnUhPT11bi5SZWFkYWJsZVN0cmluZyYmdSE9PXVuLlJlYWRhYmxlT2JqZWN0fHwodGhpcy5kZXB0aCs9MSxhLnJlYWRhYmxlRW5kZWR8fChudWxsPT09KGk9YS5fcmVhZGFibGVTdGF0ZSl8fHZvaWQgMD09PWk/dm9pZCAwOmkuZW5kRW1pdHRlZCk/dGhpcy5lbWl0KCJlcnJvciIsbmV3IEVycm9yKCJSZWFkYWJsZSBTdHJlYW0gaGFzIGVuZGVkIGJlZm9yZSBpdCB3YXMgc2VyaWFsaXplZC4gQWxsIHN0cmVhbSBkYXRhIGhhdmUgYmVlbiBsb3N0IiksYSxlfHxyKTooYS5yZWFkYWJsZUZsb3dpbmd8fChudWxsPT09KG89YS5fcmVhZGFibGVTdGF0ZSl8fHZvaWQgMD09PW8/dm9pZCAwOm8uZmxvd2luZykpJiYoYS5wYXVzZSgpLHRoaXMuZW1pdCgiZXJyb3IiLG5ldyBFcnJvcigiUmVhZGFibGUgU3RyZWFtIGlzIGluIGZsb3dpbmcgbW9kZSwgZGF0YSBtYXkgaGF2ZSBiZWVuIGxvc3QuIFRyeWluZyB0byBwYXVzZSBzdHJlYW0uIiksYSxlfHxyKSksZi5yZWFkQ291bnQ9MCxhLm9uY2UoImVuZCIsKGZ1bmN0aW9uKCl7Zi5lbmQ9ITAscy5fX3JlYWQoKX0pKSxhLm9uY2UoImVycm9yIiwoZnVuY3Rpb24odCl7cy5lcnJvcj0hMCxzLmVtaXQoImVycm9yIix0KX0pKSksdGhpcy5zdGFjay51bnNoaWZ0KGYpLGZ9LGUucHJvdG90eXBlLnJlbW92ZUZyb21TdGFjaz1mdW5jdGlvbih0KXtsZXQgZT10LnR5cGUscj1lPT09dW4uT2JqZWN0fHxlPT09dW4uQXJyYXl8fGU9PT11bi5SZWFkYWJsZVN0cmluZ3x8ZT09PXVuLlJlYWRhYmxlT2JqZWN0O2UhPT11bi5QcmltaXRpdmUmJih0aGlzLmN5Y2xlfHx0aGlzLnZpc2l0ZWQuZGVsZXRlKHQudmFsdWUpLHImJih0aGlzLmRlcHRoLT0xKSk7bGV0IG49cG5bZV07ciYmIXQuaXNFbXB0eSYmdGhpcy5nYXAmJnRoaXMuX3B1c2goIlxuIit0aGlzLmdhcC5yZXBlYXQodGhpcy5kZXB0aCkpLG4mJnRoaXMuX3B1c2gobik7bGV0IGk9dGhpcy5zdGFjay5pbmRleE9mKHQpO3RoaXMuc3RhY2suc3BsaWNlKGksMSl9LGUucHJvdG90eXBlLl9wdXNoPWZ1bmN0aW9uKHQpe3RoaXMucHVzaENhbGxlZD0hMCx0aGlzLnB1c2godCl9LGUucHJvdG90eXBlLnByb2Nlc3NSZWFkYWJsZU9iamVjdD1mdW5jdGlvbih0LGUpe2xldCByPXRoaXM7aWYoIXQuZW5kKXJldHVybiB2bih0LnZhbHVlLGUpLnRoZW4oKGZ1bmN0aW9uKGUpe251bGwhPT1lJiYodC5maXJzdHx8ci5fcHVzaCgiLCIpLHQuZmlyc3Q9ITEsci5hZGRUb1N0YWNrKGUsdm9pZCAwLHQucmVhZENvdW50KSx0LnJlYWRDb3VudCs9MSl9KSk7dGhpcy5yZW1vdmVGcm9tU3RhY2sodCl9LGUucHJvdG90eXBlLnByb2Nlc3NPYmplY3Q9ZnVuY3Rpb24odCl7aWYoIXQudW5yZWFkLmxlbmd0aClyZXR1cm4gdm9pZCB0aGlzLnJlbW92ZUZyb21TdGFjayh0KTtsZXQgZT10LnVucmVhZC5zaGlmdCgpLHI9dC52YWx1ZVtlXTt0aGlzLmFkZFRvU3RhY2socixlLHZvaWQgMCx0KX0sZS5wcm90b3R5cGUucHJvY2Vzc0FycmF5PWZ1bmN0aW9uKHQpe2xldCBlPXQudW5yZWFkO2lmKCFlKXJldHVybiB2b2lkIHRoaXMucmVtb3ZlRnJvbVN0YWNrKHQpO2xldCByPXQuYXJyYXlMZW5ndGgtZSxuPXQudmFsdWVbcl07dC51bnJlYWQtPTEsdGhpcy5hZGRUb1N0YWNrKG4sdm9pZCAwLHIsdCl9LGUucHJvdG90eXBlLnByb2Nlc3NQcmltaXRpdmU9ZnVuY3Rpb24odCl7aWYodm9pZCAwIT09dC52YWx1ZSl7bGV0IGUscj10eXBlb2YgdC52YWx1ZTtzd2l0Y2gocil7Y2FzZSJzdHJpbmciOmU9eW4odC52YWx1ZSk7YnJlYWs7Y2FzZSJudW1iZXIiOmU9TnVtYmVyLmlzRmluaXRlKHQudmFsdWUpP1N0cmluZyh0LnZhbHVlKToibnVsbCI7YnJlYWs7Y2FzZSJib29sZWFuIjplPVN0cmluZyh0LnZhbHVlKTticmVhaztjYXNlIm9iamVjdCI6dC52YWx1ZXx8KGU9Im51bGwiKTticmVhaztkZWZhdWx0OnRocm93IE9iamVjdC5hc3NpZ24obmV3IEVycm9yKCdVbmtub3duIHR5cGUgIicrcisnIi4gUGxlYXNlIGZpbGUgYW4gaXNzdWUhJykse3ZhbHVlOnQudmFsdWV9KX10aGlzLl9wdXNoKGUpfWVsc2UhdGhpcy5zdGFja1sxXXx8dGhpcy5zdGFja1sxXS50eXBlIT09dW4uQXJyYXkmJnRoaXMuc3RhY2tbMV0udHlwZSE9PXVuLlJlYWRhYmxlT2JqZWN0P3QuYWRkU2VwYXJhdG9yQWZ0ZXJFbmQ9ITE6dGhpcy5fcHVzaCgibnVsbCIpO3RoaXMucmVtb3ZlRnJvbVN0YWNrKHQpfSxlLnByb3RvdHlwZS5wcm9jZXNzUmVhZGFibGVTdHJpbmc9ZnVuY3Rpb24odCxlKXtsZXQgcj10aGlzO2lmKCF0LmVuZClyZXR1cm4gdm4odC52YWx1ZSxlKS50aGVuKChmdW5jdGlvbih0KXt0JiZyLl9wdXNoKGduKHQudG9TdHJpbmcoKSkpfSkpO3RoaXMucmVtb3ZlRnJvbVN0YWNrKHQpfSxlLnByb3RvdHlwZS5wcm9jZXNzUHJvbWlzZT1mdW5jdGlvbih0KXtsZXQgZT10aGlzO3JldHVybiBibih0LnZhbHVlKS50aGVuKChmdW5jdGlvbihyKXtlLnJlbW92ZUZyb21TdGFjayh0KSxlLmFkZFRvU3RhY2socix0LmtleSx0LmluZGV4LHQucGFyZW50KX0pKX0sZS5wcm90b3R5cGUucHJvY2Vzc1N0YWNrVG9wSXRlbT1mdW5jdGlvbih0KXtsZXQgZSxyPXRoaXMsbj10aGlzLnN0YWNrWzBdO2lmKCFufHx0aGlzLmVycm9yKXJldHVybiBQcm9taXNlLnJlc29sdmUoKTt0cnl7ZT10aGlzW2RuW24udHlwZV1dKG4sdCl9Y2F0Y2godCl7cmV0dXJuIFByb21pc2UucmVqZWN0KHQpfXJldHVybiBQcm9taXNlLnJlc29sdmUoZSkudGhlbigoZnVuY3Rpb24oKXswPT09ci5zdGFjay5sZW5ndGgmJihyLmVuZD0hMCxyLl9wdXNoKG51bGwpKX0pKX0sZS5wcm90b3R5cGUuX19yZWFkPWZ1bmN0aW9uKHQpe2xldCBlPXRoaXM7aWYoIXRoaXMuaXNSZWFkaW5nJiYhdGhpcy5lcnJvcilyZXR1cm4gdGhpcy5pc1JlYWRpbmc9ITAsdGhpcy5yZWFkTW9yZT0hMSx0aGlzLnByb2Nlc3NTdGFja1RvcEl0ZW0odCkudGhlbigoZnVuY3Rpb24oKXshZS5lbmQmJiFlLmVycm9yJiYoZS5yZWFkTW9yZXx8IWUucHVzaENhbGxlZCk/cnIoKGZ1bmN0aW9uKCl7ZS5pc1JlYWRpbmc9ITEsZS5fX3JlYWQoKX0pKTplLmlzUmVhZGluZz0hMX0pKS5jYXRjaCgoZnVuY3Rpb24odCl7ZS5lcnJvcj0hMCxlLmVtaXQoImVycm9yIix0KX0pKTt0aGlzLnJlYWRNb3JlPSEwfSxlLnByb3RvdHlwZS5fcmVhZD1mdW5jdGlvbih0KXt0aGlzLnB1c2hDYWxsZWQ9ITEsdGhpcy5fX3JlYWQodCl9LGUucHJvdG90eXBlLnBhdGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGFjay5tYXAoKGZ1bmN0aW9uKHQpe2xldCBlPXQua2V5LHI9dC5pbmRleDtyZXR1cm4gZXx8cn0pKS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiB0fHx0Pi0xfSkpLnJldmVyc2UoKX0sZX0odWUpO3ZhciB3bj1BcnJheS5pc0FycmF5LF9uPSJvYmplY3QiPT10eXBlb2YgYSYmYSYmYS5PYmplY3Q9PT1PYmplY3QmJmEsU249Im9iamVjdCI9PXR5cGVvZiBzZWxmJiZzZWxmJiZzZWxmLk9iamVjdD09PU9iamVjdCYmc2VsZixFbj1fbnx8U258fEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCksa249RW4uU3ltYm9sLFJuPU9iamVjdC5wcm90b3R5cGUsQW49Um4uaGFzT3duUHJvcGVydHksT249Um4udG9TdHJpbmcsVG49a24/a24udG9TdHJpbmdUYWc6dm9pZCAwO3ZhciBqbj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO3ZhciBMbj0iW29iamVjdCBOdWxsXSIsQ249IltvYmplY3QgVW5kZWZpbmVkXSIsUG49a24/a24udG9TdHJpbmdUYWc6dm9pZCAwO2Z1bmN0aW9uIE1uKHQpe3JldHVybiBudWxsPT10P3ZvaWQgMD09PXQ/Q246TG46UG4mJlBuIGluIE9iamVjdCh0KT9mdW5jdGlvbih0KXt2YXIgZT1Bbi5jYWxsKHQsVG4pLHI9dFtUbl07dHJ5e3RbVG5dPXZvaWQgMDt2YXIgbj0hMH1jYXRjaCh0KXt9dmFyIGk9T24uY2FsbCh0KTtyZXR1cm4gbiYmKGU/dFtUbl09cjpkZWxldGUgdFtUbl0pLGl9KHQpOmZ1bmN0aW9uKHQpe3JldHVybiBqbi5jYWxsKHQpfSh0KX1mdW5jdGlvbiBCbih0KXtyZXR1cm4gbnVsbCE9dCYmIm9iamVjdCI9PXR5cGVvZiB0fXZhciB4bj0iW29iamVjdCBTeW1ib2xdIjtmdW5jdGlvbiBVbih0KXtyZXR1cm4ic3ltYm9sIj09dHlwZW9mIHR8fEJuKHQpJiZNbih0KT09eG59dmFyIEluPS9cLnxcWyg/OlteW1xdXSp8KFsiJ10pKD86KD8hXDEpW15cXF18XFwuKSo/XDEpXF0vLERuPS9eXHcqJC87ZnVuY3Rpb24gTm4odCl7dmFyIGU9dHlwZW9mIHQ7cmV0dXJuIG51bGwhPXQmJigib2JqZWN0Ij09ZXx8ImZ1bmN0aW9uIj09ZSl9dmFyIEZuPSJbb2JqZWN0IEFzeW5jRnVuY3Rpb25dIix6bj0iW29iamVjdCBGdW5jdGlvbl0iLHFuPSJbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXSIsWW49IltvYmplY3QgUHJveHldIjt2YXIgV24sJG49RW5bIl9fY29yZS1qc19zaGFyZWRfXyJdLEduPShXbj0vW14uXSskLy5leGVjKCRuJiYkbi5rZXlzJiYkbi5rZXlzLklFX1BST1RPfHwiIikpPyJTeW1ib2woc3JjKV8xLiIrV246IiI7dmFyIEpuPUZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZzt2YXIgSG49L15cW29iamVjdCAuKz9Db25zdHJ1Y3RvclxdJC8sVm49RnVuY3Rpb24ucHJvdG90eXBlLEtuPU9iamVjdC5wcm90b3R5cGUsWm49Vm4udG9TdHJpbmcsUW49S24uaGFzT3duUHJvcGVydHksWG49UmVnRXhwKCJeIitabi5jYWxsKFFuKS5yZXBsYWNlKC9bXFxeJC4qKz8oKVtcXXt9fF0vZywiXFwkJiIpLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFwoKXwgZm9yIC4rPyg/PVxcXF0pL2csIiQxLio/IikrIiQiKTtmdW5jdGlvbiB0aSh0KXtpZighTm4odCl8fChlPXQsR24mJkduIGluIGUpKXJldHVybiExO3ZhciBlLHI9ZnVuY3Rpb24odCl7aWYoIU5uKHQpKXJldHVybiExO3ZhciBlPU1uKHQpO3JldHVybiBlPT16bnx8ZT09cW58fGU9PUZufHxlPT1Zbn0odCk/WG46SG47cmV0dXJuIHIudGVzdChmdW5jdGlvbih0KXtpZihudWxsIT10KXt0cnl7cmV0dXJuIEpuLmNhbGwodCl9Y2F0Y2godCl7fXRyeXtyZXR1cm4gdCsiIn1jYXRjaCh0KXt9fXJldHVybiIifSh0KSl9ZnVuY3Rpb24gZWkodCxlKXt2YXIgcj1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT10P3ZvaWQgMDp0W2VdfSh0LGUpO3JldHVybiB0aShyKT9yOnZvaWQgMH12YXIgcmk9ZWkoT2JqZWN0LCJjcmVhdGUiKTt2YXIgbmk9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt2YXIgaWk9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBvaSh0KXt2YXIgZT0tMSxyPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxyOyl7dmFyIG49dFtlXTt0aGlzLnNldChuWzBdLG5bMV0pfX1mdW5jdGlvbiBzaSh0LGUpe2Zvcih2YXIgcixuLGk9dC5sZW5ndGg7aS0tOylpZigocj10W2ldWzBdKT09PShuPWUpfHxyIT1yJiZuIT1uKXJldHVybiBpO3JldHVybi0xfW9pLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuX19kYXRhX189cmk/cmkobnVsbCk6e30sdGhpcy5zaXplPTB9LG9pLnByb3RvdHlwZS5kZWxldGU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5oYXModCkmJmRlbGV0ZSB0aGlzLl9fZGF0YV9fW3RdO3JldHVybiB0aGlzLnNpemUtPWU/MTowLGV9LG9pLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXztpZihyaSl7dmFyIHI9ZVt0XTtyZXR1cm4iX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyI9PT1yP3ZvaWQgMDpyfXJldHVybiBuaS5jYWxsKGUsdCk/ZVt0XTp2b2lkIDB9LG9pLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXztyZXR1cm4gcmk/dm9pZCAwIT09ZVt0XTppaS5jYWxsKGUsdCl9LG9pLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLl9fZGF0YV9fO3JldHVybiB0aGlzLnNpemUrPXRoaXMuaGFzKHQpPzA6MSxyW3RdPXJpJiZ2b2lkIDA9PT1lPyJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIjplLHRoaXN9O3ZhciBhaT1BcnJheS5wcm90b3R5cGUuc3BsaWNlO2Z1bmN0aW9uIHVpKHQpe3ZhciBlPS0xLHI9bnVsbD09dD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPHI7KXt2YXIgbj10W2VdO3RoaXMuc2V0KG5bMF0sblsxXSl9fXVpLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuX19kYXRhX189W10sdGhpcy5zaXplPTB9LHVpLnByb3RvdHlwZS5kZWxldGU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxyPXNpKGUsdCk7cmV0dXJuIShyPDApJiYocj09ZS5sZW5ndGgtMT9lLnBvcCgpOmFpLmNhbGwoZSxyLDEpLC0tdGhpcy5zaXplLCEwKX0sdWkucHJvdG90eXBlLmdldD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fLHI9c2koZSx0KTtyZXR1cm4gcjwwP3ZvaWQgMDplW3JdWzFdfSx1aS5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKHQpe3JldHVybiBzaSh0aGlzLl9fZGF0YV9fLHQpPi0xfSx1aS5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5fX2RhdGFfXyxuPXNpKHIsdCk7cmV0dXJuIG48MD8oKyt0aGlzLnNpemUsci5wdXNoKFt0LGVdKSk6cltuXVsxXT1lLHRoaXN9O3ZhciBoaT1laShFbiwiTWFwIik7ZnVuY3Rpb24gZmkodCxlKXt2YXIgcixuLGk9dC5fX2RhdGFfXztyZXR1cm4oInN0cmluZyI9PShuPXR5cGVvZihyPWUpKXx8Im51bWJlciI9PW58fCJzeW1ib2wiPT1ufHwiYm9vbGVhbiI9PW4/Il9fcHJvdG9fXyIhPT1yOm51bGw9PT1yKT9pWyJzdHJpbmciPT10eXBlb2YgZT8ic3RyaW5nIjoiaGFzaCJdOmkubWFwfWZ1bmN0aW9uIGNpKHQpe3ZhciBlPS0xLHI9bnVsbD09dD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPHI7KXt2YXIgbj10W2VdO3RoaXMuc2V0KG5bMF0sblsxXSl9fWNpLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuc2l6ZT0wLHRoaXMuX19kYXRhX189e2hhc2g6bmV3IG9pLG1hcDpuZXcoaGl8fHVpKSxzdHJpbmc6bmV3IG9pfX0sY2kucHJvdG90eXBlLmRlbGV0ZT1mdW5jdGlvbih0KXt2YXIgZT1maSh0aGlzLHQpLmRlbGV0ZSh0KTtyZXR1cm4gdGhpcy5zaXplLT1lPzE6MCxlfSxjaS5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiBmaSh0aGlzLHQpLmdldCh0KX0sY2kucHJvdG90eXBlLmhhcz1mdW5jdGlvbih0KXtyZXR1cm4gZmkodGhpcyx0KS5oYXModCl9LGNpLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxlKXt2YXIgcj1maSh0aGlzLHQpLG49ci5zaXplO3JldHVybiByLnNldCh0LGUpLHRoaXMuc2l6ZSs9ci5zaXplPT1uPzA6MSx0aGlzfTt2YXIgbGk9IkV4cGVjdGVkIGEgZnVuY3Rpb24iO2Z1bmN0aW9uIHBpKHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHR8fG51bGwhPWUmJiJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IobGkpO3ZhciByPWZ1bmN0aW9uKCl7dmFyIG49YXJndW1lbnRzLGk9ZT9lLmFwcGx5KHRoaXMsbik6blswXSxvPXIuY2FjaGU7aWYoby5oYXMoaSkpcmV0dXJuIG8uZ2V0KGkpO3ZhciBzPXQuYXBwbHkodGhpcyxuKTtyZXR1cm4gci5jYWNoZT1vLnNldChpLHMpfHxvLHN9O3JldHVybiByLmNhY2hlPW5ldyhwaS5DYWNoZXx8Y2kpLHJ9cGkuQ2FjaGU9Y2k7dmFyIGRpLGdpLHlpLHZpPS9bXi5bXF1dK3xcWyg/OigtP1xkKyg/OlwuXGQrKT8pfChbIiddKSgoPzooPyFcMilbXlxcXXxcXC4pKj8pXDIpXF18KD89KD86XC58XFtcXSkoPzpcLnxcW1xdfCQpKS9nLGJpPS9cXChcXCk/L2csbWk9KGRpPWZ1bmN0aW9uKHQpe3ZhciBlPVtdO3JldHVybiA0Nj09PXQuY2hhckNvZGVBdCgwKSYmZS5wdXNoKCIiKSx0LnJlcGxhY2UodmksKGZ1bmN0aW9uKHQscixuLGkpe2UucHVzaChuP2kucmVwbGFjZShiaSwiJDEiKTpyfHx0KX0pKSxlfSxnaT1waShkaSwoZnVuY3Rpb24odCl7cmV0dXJuIDUwMD09PXlpLnNpemUmJnlpLmNsZWFyKCksdH0pKSx5aT1naS5jYWNoZSxnaSksd2k9bWk7dmFyIF9pPTEvMCxTaT1rbj9rbi5wcm90b3R5cGU6dm9pZCAwLEVpPVNpP1NpLnRvU3RyaW5nOnZvaWQgMDtmdW5jdGlvbiBraSh0KXtpZigic3RyaW5nIj09dHlwZW9mIHQpcmV0dXJuIHQ7aWYod24odCkpcmV0dXJuIGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPS0xLG49bnVsbD09dD8wOnQubGVuZ3RoLGk9QXJyYXkobik7KytyPG47KWlbcl09ZSh0W3JdLHIsdCk7cmV0dXJuIGl9KHQsa2kpKyIiO2lmKFVuKHQpKXJldHVybiBFaT9FaS5jYWxsKHQpOiIiO3ZhciBlPXQrIiI7cmV0dXJuIjAiPT1lJiYxL3Q9PS1faT8iLTAiOmV9ZnVuY3Rpb24gUmkodCxlKXtyZXR1cm4gd24odCk/dDpmdW5jdGlvbih0LGUpe2lmKHduKHQpKXJldHVybiExO3ZhciByPXR5cGVvZiB0O3JldHVybiEoIm51bWJlciIhPXImJiJzeW1ib2wiIT1yJiYiYm9vbGVhbiIhPXImJm51bGwhPXQmJiFVbih0KSl8fERuLnRlc3QodCl8fCFJbi50ZXN0KHQpfHxudWxsIT1lJiZ0IGluIE9iamVjdChlKX0odCxlKT9bdF06d2koZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/IiI6a2kodCl9KHQpKX12YXIgQWk9MS8wO2Z1bmN0aW9uIE9pKHQpe2lmKCJzdHJpbmciPT10eXBlb2YgdHx8VW4odCkpcmV0dXJuIHQ7dmFyIGU9dCsiIjtyZXR1cm4iMCI9PWUmJjEvdD09LUFpPyItMCI6ZX1mdW5jdGlvbiBUaSh0LGUscil7dmFyIG49bnVsbD09dD92b2lkIDA6ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9MCxuPShlPVJpKGUsdCkpLmxlbmd0aDtudWxsIT10JiZyPG47KXQ9dFtPaShlW3IrK10pXTtyZXR1cm4gciYmcj09bj90OnZvaWQgMH0odCxlKTtyZXR1cm4gdm9pZCAwPT09bj9yOm59dmFyIGppPSJbb2JqZWN0IE51bWJlcl0iO2Z1bmN0aW9uIExpKHQpe3JldHVybiJbb2JqZWN0IFN0cmluZ10iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWZ1bmN0aW9uIENpKHQpe3JldHVybiEoIUxpKHQpfHwiIj09PXQpfWZ1bmN0aW9uIFBpKHQpe3JldHVybiJbb2JqZWN0IEFycmF5XSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9ZnVuY3Rpb24gTWkodCl7cmV0dXJuIltvYmplY3QgVW5kZWZpbmVkXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9ZnVuY3Rpb24gQmkodCl7cmV0dXJuIltvYmplY3QgT2JqZWN0XSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9ZnVuY3Rpb24geGkodCl7cmV0dXJuISghTGkodCl8fCIiIT09dCl9ZnVuY3Rpb24gVWkodCl7cmV0dXJuISFNaSh0KXx8KCEhZnVuY3Rpb24odCl7cmV0dXJuIltvYmplY3QgTnVsbF0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfSh0KXx8KCEhZnVuY3Rpb24odCl7aWYoQmkodCkpe2ZvcihsZXQgZSBpbiB0KXJldHVybiExO3JldHVybiEwfXJldHVybiExfSh0KXx8KCEheGkodCl8fCghIWZ1bmN0aW9uKHQpe3JldHVybiEhUGkodCkmJjA9PT10Lmxlbmd0aH0odCl8fCEhZnVuY3Rpb24odCl7cmV0dXJuIHQhPXR9KHQpKSkpKX1mdW5jdGlvbiBJaSgpe2xldCB0LGUscj1uZXcgUHJvbWlzZSgoZnVuY3Rpb24oKXt0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXX0pKTtyZXR1cm4gci5yZXNvbHZlPXQsci5yZWplY3Q9ZSxyfWxldCBXSnNvblN0cmVhbT17cGFyc2U6YXN5bmMgZnVuY3Rpb24odCl7aWYoIUNpKHQpKXJldHVybnt9O2xldCBlPXt9O3RyeXtlPUpTT04ucGFyc2UodCl9Y2F0Y2godCl7ZT17fX1yZXR1cm4gZX0scGFyc2VCeVN0cmVhbTpmdW5jdGlvbih0KXtsZXQgZT17fTtpZigibnVsbCI9PT10KXJldHVybiBudWxsO2lmKCIiPT09dClyZXR1cm57fTtsZXQgcj0iX19zeXN0ZW1fXyIsbj1geyIke3J9Ijoke3R9fWAsaT1JaSgpLG89ZnIobikscz1zbi5wYXJzZSgiJCoiKTtyZXR1cm4gcy5vbigiZGF0YSIsKGZ1bmN0aW9uKHQpe2VbdC5rZXldPXQudmFsdWV9KSkscy5vbigiZW5kIiwoZnVuY3Rpb24oKXtsZXQgdD1UaShlLHIpO2kucmVzb2x2ZSh0KX0pKSxzLm9uKCJlcnJvciIsKGZ1bmN0aW9uKHQpe2kucmVqZWN0KHQpfSkpLG8ucGlwZShzKSxpfSxjcmVhdGVQYXJzZVN0cmVhbTpmdW5jdGlvbih0KXtyZXR1cm4gQ2kodCl8fGZ1bmN0aW9uKHQpe3JldHVybiEoIVBpKHQpfHwwPT09dC5sZW5ndGh8fDE9PT10Lmxlbmd0aCYmVWkodFswXSkpfSh0KXx8KHQ9IiQqIiksc24ucGFyc2UodCl9LHN0cmluZ2lmeTphc3luYyBmdW5jdGlvbih0KXtpZihNaSh0KSlyZXR1cm4iIjtsZXQgZT0iIjt0cnl7ZT1KU09OLnN0cmluZ2lmeSh0KX1jYXRjaCh0KXtlPSIifXJldHVybiBlfSxzdHJpbmdpZnlCeVN0cmVhbTpmdW5jdGlvbih0KXtsZXQgZT0iIjtpZihNaSh0KSlyZXR1cm4iIjtpZihudWxsPT09dClyZXR1cm4ibnVsbCI7aWYoeGkodCkpcmV0dXJuJyIiJztpZigibnVtYmVyIj09dHlwZW9mKHI9dCl8fEJuKHIpJiZNbihyKT09amkpcmV0dXJuYCR7dH1gO3ZhciByO2lmKExpKHQpKXJldHVybmAiJHt0fSJgO2xldCBuPUlpKCksaT1uZXcgbW4odCxudWxsLG51bGwsITEpO3JldHVybiBpLm9uKCJkYXRhIiwoZnVuY3Rpb24odCl7ZSs9dH0pKSxpLm9uKCJlbmQiLChmdW5jdGlvbigpe24ucmVzb2x2ZShlKX0pKSxpLm9uKCJlcnJvciIsKGZ1bmN0aW9uKHQpe24ucmVqZWN0KHQpfSkpLG59LGNyZWF0ZVN0cmluZ2lmeVN0cmVhbTpmdW5jdGlvbih0KXtpZighQmkodCkmJiFQaSh0KSl0aHJvdyBuZXcgRXJyb3IoImRhdGEgaXMgbm90IG9iamVjdCBvciBhcnJheSIpO3JldHVybiBuZXcgbW4odCxudWxsLG51bGwsITEpfX07CgpsZXQgaW5zdGFuY2UgPSBudWxsCmZ1bmN0aW9uIGluaXQoaW5wdXQpewoKICAgIC8vaW5pdAogICAgbGV0IHIKICAgIAogICAgICAgIHIgPSBXSnNvblN0cmVhbSguLi5pbnB1dCkKICAgICAgICAKCiAgICAvL29uCiAgICAKCiAgICAvL3NhdmUKICAgIGluc3RhbmNlID0gcgoKfQoKZnVuY3Rpb24gc2VuZE1lc3NhZ2UoZGF0YSkgewogICAgCiAgICAgICAgc2VsZi5wb3N0TWVzc2FnZShkYXRhKQogICAgICAgIAp9Cgphc3luYyBmdW5jdGlvbiBydW4oZGF0YSkgewogICAgLy8gY29uc29sZS5sb2coJ2lubmVyIHdvcmtlciBydW4nLGRhdGEpCgogICAgLy9tb2RlCiAgICBsZXQgbW9kZSA9IGRhdGEubW9kZQoKICAgIC8vY2hlY2sKICAgIGlmKG1vZGUgIT09ICdpbml0JyAmJiBtb2RlICE9PSAnY2FsbCcpewogICAgICAgIHJldHVybgogICAgfQoKICAgIC8vaW5pdAogICAgaWYobW9kZSA9PT0gJ2luaXQnKXsKICAgICAgICAKICAgICAgICB0cnl7CgogICAgICAgICAgICAvL3R5cGUKICAgICAgICAgICAgbGV0IHR5cGUgPSBkYXRhLnR5cGUKCiAgICAgICAgICAgIC8vaW5wdXQKICAgICAgICAgICAgbGV0IGlucHV0ID0gZGF0YS5pbnB1dAogICAgCiAgICAgICAgICAgIC8vaW5zdGFuY2UKICAgICAgICAgICAgaWYodHlwZSA9PT0gJ2Z1bmN0aW9uJyl7CiAgICAgICAgICAgICAgICBpbml0KC4uLmlucHV0KQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYodHlwZSA9PT0gJ29iamVjdCcpewogICAgICAgICAgICAgICAgaW5zdGFuY2UgPSBXSnNvblN0cmVhbQogICAgICAgICAgICB9CgogICAgICAgIH0KICAgICAgICBjYXRjaChlcnIpewogICAgICAgIAogICAgICAgICAgICAvL3NlbmRNZXNzYWdlCiAgICAgICAgICAgIGxldCByZXMgPSB7CiAgICAgICAgICAgICAgICBtb2RlOiAnZW1pdCcsCiAgICAgICAgICAgICAgICBldk5hbWU6ICdlcnJvcicsCiAgICAgICAgICAgICAgICBtc2c6IGVyciwKICAgICAgICAgICAgfQogICAgICAgICAgICBzZW5kTWVzc2FnZShyZXMpCgogICAgICAgIH0KICAgICAgICAgICAgCiAgICB9CgogICAgLy9jaGVjawogICAgaWYobW9kZSA9PT0gJ2NhbGwnKXsKICAgICAgICBsZXQgc3RhdGUgPSAnJwogICAgICAgIGxldCBtc2cgPSBudWxsCgogICAgICAgIHRyeXsKCiAgICAgICAgICAgIC8vZnVuCiAgICAgICAgICAgIGxldCBmdW4gPSBpbnN0YW5jZVtkYXRhLmZ1bl0KCiAgICAgICAgICAgIC8vaW5wdXQKICAgICAgICAgICAgbGV0IGlucHV0ID0gZGF0YS5pbnB1dAoKICAgICAgICAgICAgLy9leGVjCiAgICAgICAgICAgIGF3YWl0IGZ1biguLi5pbnB1dCkKICAgICAgICAgICAgICAgIC50aGVuKChzdWMpID0+IHsKICAgICAgICAgICAgICAgICAgICBzdGF0ZT0nc3VjY2VzcycKICAgICAgICAgICAgICAgICAgICBtc2c9c3VjCiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgLmNhdGNoKChlcnIpID0+IHsKICAgICAgICAgICAgICAgICAgICBzdGF0ZT0nZXJyb3InCiAgICAgICAgICAgICAgICAgICAgbXNnPWVycgogICAgICAgICAgICAgICAgfSkKCiAgICAgICAgfQogICAgICAgIGNhdGNoKGVycil7CiAgICAgICAgICAgIHN0YXRlID0gJ2Vycm9yJwogICAgICAgICAgICBtc2cgPSBlcnIKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLy9zZW5kTWVzc2FnZQogICAgICAgIGxldCByZXMgPSB7CiAgICAgICAgICAgIG1vZGU6ICdyZXR1cm4nLAogICAgICAgICAgICBpZDogZGF0YS5pZCwKICAgICAgICAgICAgZnVuOiBkYXRhLmZ1biwKICAgICAgICAgICAgc3RhdGUsCiAgICAgICAgICAgIG1zZywKICAgICAgICB9CiAgICAgICAgc2VuZE1lc3NhZ2UocmVzKQoKICAgIH0KCn0KCmZ1bmN0aW9uIHJlY3ZNZXNzYWdlKGRhdGEpIHsKICAgIC8vIGNvbnNvbGUubG9nKCdpbm5lciB3b3JrZXIgcmVjdjonLCBkYXRhKQoKICAgIC8vZGF0YVJlY3YKICAgIGxldCBkYXRhUmVjdiA9IGRhdGEKCiAgICAvL3J1bgogICAgcnVuKGRhdGFSZWN2KQoKfQoKCiAgICAgICAgc2VsZi5vbm1lc3NhZ2UgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICByZWN2TWVzc2FnZShlLmRhdGEpCiAgICAgICAgfQogICAgICAgIAoK");function c(){let c=l(),G=function(l){try{let Z=new Blob([l]),d=window.URL||window.webkitURL;return new Worker(d.createObjectURL(Z))}catch(l){b(l)}}(m);if(!G)return b("invalid worker"),null;function b(l){c.emit("error",l)}return G.onmessage=function(l){!function(l){let Z=l,d=Z.mode;"emit"!==d&&"return"!==d||("emit"===d&&c.emit(Z.evName,Z.msg),"return"===d&&c.emit(Z.id,Z))}(l.data)},G.onerror=b,function(){let l={mode:"init",type:"object",input:[...arguments]};G.postMessage(l)}([...arguments]),c.stringify=function(){let l=Z(),m=d(),b={mode:"call",id:m,fun:"stringify",input:[...arguments]};return G.postMessage(b),c.once(m,(Z=>{"success"===Z.state?l.resolve(Z.msg):l.reject(Z.msg)})),l},c.parse=function(){let l=Z(),m=d(),b={mode:"call",id:m,fun:"parse",input:[...arguments]};return G.postMessage(b),c.once(m,(Z=>{"success"===Z.state?l.resolve(Z.msg):l.reject(Z.msg)})),l},c.terminate=function(){G?(G.terminate(),G=void 0):b("worker has been terminated")},c}let G={stringify:async function(){let l=[...arguments],Z=c();return await Z.stringify(...l).finally((()=>{Z.terminate()}))},parse:async function(){let l=[...arguments],Z=c();return await Z.parse(...l).finally((()=>{Z.terminate()}))}};R=l();for(let l in G){let Z=G[l];R[l]=Z}}(),R}()}({get exports(){return m},set exports(l){m=l}});var c=m;let G;return G="undefined"!=typeof window&&void 0!==window.document?c:d,G}));
|
|
1
|
+
!function(l,Z){"object"==typeof exports&&"undefined"!=typeof module?module.exports=Z(require("worker_threads")):"function"==typeof define&&define.amd?define(["worker_threads"],Z):(l="undefined"!=typeof globalThis?globalThis:l||self)["w-json-stream"]=Z(l.worker_threads)}(this,(function(l){"use strict";"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;var Z={};!function(Z,d){Z.exports=function(l){var Z={};!function(l){var Z=Object.prototype.hasOwnProperty,d="~";function m(){}function c(l,Z,d){this.fn=l,this.context=Z,this.once=d||!1}function G(l,Z,m,G,b){if("function"!=typeof m)throw new TypeError("The listener must be a function");var X=new c(m,G||l,b),W=d?d+Z:Z;return l._events[W]?l._events[W].fn?l._events[W]=[l._events[W],X]:l._events[W].push(X):(l._events[W]=X,l._eventsCount++),l}function b(l,Z){0==--l._eventsCount?l._events=new m:delete l._events[Z]}function X(){this._events=new m,this._eventsCount=0}Object.create&&(m.prototype=Object.create(null),(new m).__proto__||(d=!1)),X.prototype.eventNames=function(){var l,m,c=[];if(0===this._eventsCount)return c;for(m in l=this._events)Z.call(l,m)&&c.push(d?m.slice(1):m);return Object.getOwnPropertySymbols?c.concat(Object.getOwnPropertySymbols(l)):c},X.prototype.listeners=function(l){var Z=d?d+l:l,m=this._events[Z];if(!m)return[];if(m.fn)return[m.fn];for(var c=0,G=m.length,b=new Array(G);c<G;c++)b[c]=m[c].fn;return b},X.prototype.listenerCount=function(l){var Z=d?d+l:l,m=this._events[Z];return m?m.fn?1:m.length:0},X.prototype.emit=function(l,Z,m,c,G,b){var X=d?d+l:l;if(!this._events[X])return!1;var W,I,p=this._events[X],u=arguments.length;if(p.fn){switch(p.once&&this.removeListener(l,p.fn,void 0,!0),u){case 1:return p.fn.call(p.context),!0;case 2:return p.fn.call(p.context,Z),!0;case 3:return p.fn.call(p.context,Z,m),!0;case 4:return p.fn.call(p.context,Z,m,c),!0;case 5:return p.fn.call(p.context,Z,m,c,G),!0;case 6:return p.fn.call(p.context,Z,m,c,G,b),!0}for(I=1,W=new Array(u-1);I<u;I++)W[I-1]=arguments[I];p.fn.apply(p.context,W)}else{var i,y=p.length;for(I=0;I<y;I++)switch(p[I].once&&this.removeListener(l,p[I].fn,void 0,!0),u){case 1:p[I].fn.call(p[I].context);break;case 2:p[I].fn.call(p[I].context,Z);break;case 3:p[I].fn.call(p[I].context,Z,m);break;case 4:p[I].fn.call(p[I].context,Z,m,c);break;default:if(!W)for(i=1,W=new Array(u-1);i<u;i++)W[i-1]=arguments[i];p[I].fn.apply(p[I].context,W)}}return!0},X.prototype.on=function(l,Z,d){return G(this,l,Z,d,!1)},X.prototype.once=function(l,Z,d){return G(this,l,Z,d,!0)},X.prototype.removeListener=function(l,Z,m,c){var G=d?d+l:l;if(!this._events[G])return this;if(!Z)return b(this,G),this;var X=this._events[G];if(X.fn)X.fn!==Z||c&&!X.once||m&&X.context!==m||b(this,G);else{for(var W=0,I=[],p=X.length;W<p;W++)(X[W].fn!==Z||c&&!X[W].once||m&&X[W].context!==m)&&I.push(X[W]);I.length?this._events[G]=1===I.length?I[0]:I:b(this,G)}return this},X.prototype.removeAllListeners=function(l){var Z;return l?(Z=d?d+l:l,this._events[Z]&&b(this,Z)):(this._events=new m,this._eventsCount=0),this},X.prototype.off=X.prototype.removeListener,X.prototype.addListener=X.prototype.on,X.prefixed=d,X.EventEmitter=X,l.exports=X}({get exports(){return Z},set exports(l){Z=l}});var d=Z;let m;!function(){if("nodejs"!=("undefined"!=typeof window&&void 0!==window.document?"browser":"nodejs"))return null;function Z(){return new d}function c(){let l,Z,d=new Promise((function(){l=arguments[0],Z=arguments[1]}));return d.resolve=l,d.reject=Z,d}function G(){let l=arguments.length>0&&void 0!==arguments[0]?arguments[0]:10,Z=[],d="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""),m=d.length;for(let c=0;c<l;c++)Z[c]=d[0|Math.random()*m];return Z.join("")}let b=(X="CgogICAgICAgIC8vaW1wb3J0IHsgcGFyZW50UG9ydCB9IGZyb20gJ3dvcmtlcl90aHJlYWRzJwogICAgICAgIGxldCB7IHBhcmVudFBvcnQgfSA9IHJlcXVpcmUoJ3dvcmtlcl90aHJlYWRzJykgLy/lm6BwYWNrYWdlLmpzb27kuI3ntaZ0eXBlPW1vZHVsZeaVheeEoeazleaUr+aPtGVzNiBpbXBvcnQsIOW+l+S9v+eUqHJlcXVpcmUKICAgICAgICAvL+iLpeimgeaWvG5vZGVqcyB3b3JrZXLlhafkvb/nlKjnhKHms5XovYnora/nmoTljp/nlJ/lpZfku7bkvovlpoJmcywg6YG/5YWN5L2/55So6aCC5bGkaW1wb3J05Yqg6LyJ5L2/55SoLCDlm6DnhKHms5XovYnora/mnIPnm7TmjqXkv53nlZkKICAgICAgICAvL+S4puWboGltcG9ydOS9jeaWvHdvcmtlcuWkluWxpOmZkOWumueCunJlcXVpcmXljYAocGFja2FnZS5qc29u5LiN57WmdHlwZT1tb2R1bGUpLCDmlYXlh7rnj77pjK/oqqTnhKHms5XovYnora8KICAgICAgICAKCiJ1c2Ugc3RyaWN0Ijt2YXIgdD1yZXF1aXJlKCJzdHJlYW0iKSxlPXJlcXVpcmUoImJ1ZmZlciIpLHI9cmVxdWlyZSgidGltZXJzIiksaT1yZXF1aXJlKCJwcm9jZXNzIik7ZnVuY3Rpb24gbih0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwiZGVmYXVsdCIpP3QuZGVmYXVsdDp0fXZhciBzLG89e30sYT17fSx1PXtnZXQgZXhwb3J0cygpe3JldHVybiBhfSxzZXQgZXhwb3J0cyh0KXthPXR9fTshZnVuY3Rpb24odCl7dHJ5e3ZhciBlPXJlcXVpcmUoInV0aWwiKTtpZigiZnVuY3Rpb24iIT10eXBlb2YgZS5pbmhlcml0cyl0aHJvdyIiO3QuZXhwb3J0cz1lLmluaGVyaXRzfWNhdGNoKGUpe3QuZXhwb3J0cz0oc3x8KHM9MSwiZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LmNyZWF0ZT91LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtlJiYodC5zdXBlcl89ZSx0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSl9OnUuZXhwb3J0cz1mdW5jdGlvbih0LGUpe2lmKGUpe3Quc3VwZXJfPWU7dmFyIHI9ZnVuY3Rpb24oKXt9O3IucHJvdG90eXBlPWUucHJvdG90eXBlLHQucHJvdG90eXBlPW5ldyByLHQucHJvdG90eXBlLmNvbnN0cnVjdG9yPXR9fSksYSl9fSh7Z2V0IGV4cG9ydHMoKXtyZXR1cm4gb30sc2V0IGV4cG9ydHModCl7bz10fX0pO3ZhciBoPW4obyk7bGV0IGY9bCgpO2Z1bmN0aW9uIGModCxlKXsoIm9iamVjdCIhPXR5cGVvZiB0fHxBcnJheS5pc0FycmF5KHQpKSYmKGU9dCx0PXt9KTtsZXQgcj1uZXcgZih0KTt2YXIgaTtyZXR1cm4gci5fZnJvbT1BcnJheS5pc0FycmF5KGUpPyhpPShpPWUpLnNsaWNlKCksZnVuY3Rpb24odCxlKXtsZXQgcj1udWxsLG49aS5sZW5ndGg/aS5zaGlmdCgpOm51bGw7biBpbnN0YW5jZW9mIEVycm9yJiYocj1uLG49bnVsbCksZShyLG4pfSk6ZXx8cCxyfWZ1bmN0aW9uIGwoZSxyKXtmdW5jdGlvbiBpKHIpe2lmKCEodGhpcyBpbnN0YW5jZW9mIGkpKXJldHVybiBuZXcgaShyKTt0aGlzLl9yZWFkaW5nPSExLHRoaXMuX2NhbGxiYWNrPWZ1bmN0aW9uKHQsZSl7aWYobi5kZXN0cm95ZWQpcmV0dXJuO2lmKHQpcmV0dXJuIG4uZGVzdHJveSh0KTtpZihudWxsPT09ZSlyZXR1cm4gbi5wdXNoKG51bGwpO24uX3JlYWRpbmc9ITEsbi5wdXNoKGUpJiZuLl9yZWFkKHMpfSx0aGlzLmRlc3Ryb3llZD0hMSx0LlJlYWRhYmxlLmNhbGwodGhpcyxyfHxlKTtsZXQgbj10aGlzLHM9dGhpcy5fcmVhZGFibGVTdGF0ZS5oaWdoV2F0ZXJNYXJrfXJldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBlJiYocj1lLGU9e30pLGU9ZChlKSxoKGksdC5SZWFkYWJsZSksaS5wcm90b3R5cGUuX2Zyb209cnx8cCxpLnByb3RvdHlwZS5fcmVhZD1mdW5jdGlvbih0KXt0aGlzLl9yZWFkaW5nfHx0aGlzLmRlc3Ryb3llZHx8KHRoaXMuX3JlYWRpbmc9ITAsdGhpcy5fZnJvbSh0LHRoaXMuX2NhbGxiYWNrKSl9LGkucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24odCl7aWYodGhpcy5kZXN0cm95ZWQpcmV0dXJuO3RoaXMuZGVzdHJveWVkPSEwO2xldCBlPXRoaXM7cHJvY2Vzcy5uZXh0VGljaygoZnVuY3Rpb24oKXt0JiZlLmVtaXQoImVycm9yIix0KSxlLmVtaXQoImNsb3NlIil9KSl9LGl9ZnVuY3Rpb24gcCgpe31mdW5jdGlvbiBkKHQpe3JldHVybiB0PXR8fHt9fWZ1bmN0aW9uIHkodCl7bGV0IGUscj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCk7aWYoZT0iW29iamVjdCBQcm9taXNlXSI9PT1yLGUpcmV0dXJuITA7aWYoIltvYmplY3QgRnVuY3Rpb25dIiE9PXIpcmV0dXJuITE7dHJ5e2U9ImZ1bmN0aW9uIiE9dHlwZW9mIHQuc3Vic2NyaWJlJiYiZnVuY3Rpb24iPT10eXBlb2YgdC50aGVufWNhdGNoKHQpe31yZXR1cm4gZX1mdW5jdGlvbiBnKHQpe2xldCBpLG4scztmdW5jdGlvbiBvKHIpeygodD1yKWluc3RhbmNlb2YgQXJyYXlCdWZmZXJ8fEFycmF5QnVmZmVyLmlzVmlldyh0KSYmIWUuQnVmZmVyLmlzQnVmZmVyKHQpKSYmKHQ9ZS5CdWZmZXIuZnJvbSh0KSksaT15KHQpP3Q6bnVsbDtjb25zdCBvPSFpJiZ0W1N5bWJvbC5pdGVyYXRvcl0mJiJzdHJpbmciIT10eXBlb2YgdCYmIWUuQnVmZmVyLmlzQnVmZmVyKHQpO249bz90W1N5bWJvbC5pdGVyYXRvcl0oKTpudWxsO2NvbnN0IGE9IWkmJnRbU3ltYm9sLmFzeW5jSXRlcmF0b3JdO3M9YT90W1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpOm51bGx9cmV0dXJuIEFycmF5LmlzQXJyYXkodCkmJih0PXQuc2xpY2UoKSksbyh0KSxjKChmdW5jdGlvbiBlKGEsdSl7aWYoaSlyZXR1cm4gdm9pZChhc3luYygpPT57dHJ5e2F3YWl0IG8oYXdhaXQgaSksZS5jYWxsKHRoaXMsYSx1KX1jYXRjaCh0KXt1KHQpfX0pKCk7aWYobil7Y29uc3QgdD1uLm5leHQoKTtyZXR1cm4gdm9pZCByLnNldEltbWVkaWF0ZSh1LG51bGwsdC5kb25lP251bGw6dC52YWx1ZSl9aWYocylyZXR1cm4gdm9pZChhc3luYygpPT57dHJ5e2NvbnN0IHQ9YXdhaXQgcy5uZXh0KCk7ci5zZXRJbW1lZGlhdGUodSxudWxsLHQuZG9uZT9udWxsOnQudmFsdWUpfWNhdGNoKHQpe3Iuc2V0SW1tZWRpYXRlKHUsdCl9fSkoKTtpZigwPT09dC5sZW5ndGgpcmV0dXJuIHZvaWQgci5zZXRJbW1lZGlhdGUodSxudWxsLG51bGwpO2NvbnN0IGg9dC5zbGljZSgwLGEpO3Q9dC5zbGljZShhKSxyLnNldEltbWVkaWF0ZSh1LG51bGwsaCl9KSl9Yy5jdG9yPWwsYy5vYmo9ZnVuY3Rpb24odCxlKXtyZXR1cm4oImZ1bmN0aW9uIj09dHlwZW9mIHR8fEFycmF5LmlzQXJyYXkodCkpJiYoZT10LHQ9e30pLCh0PWQodCkpLm9iamVjdE1vZGU9ITAsdC5oaWdoV2F0ZXJNYXJrPTE2LGModCxlKX0sZy5vYmplY3Q9dD0+e2xldCBlLGksbjtmdW5jdGlvbiBzKHIpe2U9eSh0PXIpP3Q6bnVsbCxpPSFlJiZ0W1N5bWJvbC5pdGVyYXRvcl0/dFtTeW1ib2wuaXRlcmF0b3JdKCk6bnVsbCxuPSFlJiZ0W1N5bWJvbC5hc3luY0l0ZXJhdG9yXT90W1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpOm51bGx9cmV0dXJuIEFycmF5LmlzQXJyYXkodCkmJih0PXQuc2xpY2UoKSkscyh0KSxjLm9iaigoZnVuY3Rpb24gbyhhLHUpe2lmKGUpKGFzeW5jKCk9Pnt0cnl7YXdhaXQgcyhhd2FpdCBlKSxvLmNhbGwodGhpcyxhLHUpfWNhdGNoKHQpe3UodCl9fSkoKTtlbHNlIGlmKGkpe2NvbnN0IHQ9aS5uZXh0KCk7ci5zZXRJbW1lZGlhdGUodSxudWxsLHQuZG9uZT9udWxsOnQudmFsdWUpfWVsc2Ugbj8oYXN5bmMoKT0+e3RyeXtjb25zdCB0PWF3YWl0IG4ubmV4dCgpO3Iuc2V0SW1tZWRpYXRlKHUsbnVsbCx0LmRvbmU/bnVsbDp0LnZhbHVlKX1jYXRjaCh0KXtyLnNldEltbWVkaWF0ZSh1LHQpfX0pKCk6KHRoaXMucHVzaCh0KSxyLnNldEltbWVkaWF0ZSh1LG51bGwsbnVsbCkpfSkpfTt2YXIgdj17fSxiPXYuTEVGVF9CUkFDRT0xLG09di5SSUdIVF9CUkFDRT0yLFM9di5MRUZUX0JSQUNLRVQ9MyxfPXYuUklHSFRfQlJBQ0tFVD00LGs9di5DT0xPTj01LE89di5DT01NQT02LGo9di5UUlVFPTcsdz12LkZBTFNFPTgsRT12Lk5VTEw9OSxBPXYuU1RSSU5HPTEwLFQ9di5OVU1CRVI9MTEsQj12LlNUQVJUPTE3LEM9di5TVE9QPTE4LFI9di5UUlVFMT0zMyxGPXYuVFJVRTI9MzQsUD12LlRSVUUzPTM1LE49di5GQUxTRTE9NDksST12LkZBTFNFMj01MCx4PXYuRkFMU0UzPTUxLHE9di5GQUxTRTQ9NTIsTD12Lk5VTEwxPTY1LCQ9di5OVUxMMj02NixVPXYuTlVMTDM9NjcsTT12Lk5VTUJFUjE9ODEsej12Lk5VTUJFUjM9ODMsRz12LlNUUklORzE9OTcsSj12LlNUUklORzI9OTgsVj12LlNUUklORzM9OTksSz12LlNUUklORzQ9MTAwLEQ9di5TVFJJTkc1PTEwMSxXPXYuU1RSSU5HNj0xMDIsSD12LlZBTFVFPTExMyxZPXYuS0VZPTExNCxRPXYuT0JKRUNUPTEyOSxYPXYuQVJSQVk9MTMwLFo9IlxcIi5jaGFyQ29kZUF0KDApLHR0PSIvIi5jaGFyQ29kZUF0KDApLGV0PSJcYiIuY2hhckNvZGVBdCgwKSxydD0iXGYiLmNoYXJDb2RlQXQoMCksaXQ9IlxuIi5jaGFyQ29kZUF0KDApLG50PSJcciIuY2hhckNvZGVBdCgwKSxzdD0iXHQiLmNoYXJDb2RlQXQoMCksb3Q9NjU1MzY7ZnVuY3Rpb24gYXQoKXt0aGlzLnRTdGF0ZT1CLHRoaXMudmFsdWU9dm9pZCAwLHRoaXMuc3RyaW5nPXZvaWQgMCx0aGlzLnN0cmluZ0J1ZmZlcj1CdWZmZXIuYWxsb2M/QnVmZmVyLmFsbG9jKG90KTpuZXcgQnVmZmVyKG90KSx0aGlzLnN0cmluZ0J1ZmZlck9mZnNldD0wLHRoaXMudW5pY29kZT12b2lkIDAsdGhpcy5oaWdoU3Vycm9nYXRlPXZvaWQgMCx0aGlzLmtleT12b2lkIDAsdGhpcy5tb2RlPXZvaWQgMCx0aGlzLnN0YWNrPVtdLHRoaXMuc3RhdGU9SCx0aGlzLmJ5dGVzX3JlbWFpbmluZz0wLHRoaXMuYnl0ZXNfaW5fc2VxdWVuY2U9MCx0aGlzLnRlbXBfYnVmZnM9ezI6bmV3IEJ1ZmZlcigyKSwzOm5ldyBCdWZmZXIoMyksNDpuZXcgQnVmZmVyKDQpfSx0aGlzLm9mZnNldD0tMX1hdC50b2tuYW09ZnVuY3Rpb24odCl7Zm9yKHZhciBlPU9iamVjdC5rZXlzKHYpLHI9MCxpPWUubGVuZ3RoO3I8aTtyKyspe3ZhciBuPWVbcl07aWYodltuXT09PXQpcmV0dXJuIG59cmV0dXJuIHQmJiIweCIrdC50b1N0cmluZygxNil9O3ZhciB1dD1hdC5wcm90b3R5cGU7dXQub25FcnJvcj1mdW5jdGlvbih0KXt0aHJvdyB0fSx1dC5jaGFyRXJyb3I9ZnVuY3Rpb24odCxlKXt0aGlzLnRTdGF0ZT1DLHRoaXMub25FcnJvcihuZXcgRXJyb3IoIlVuZXhwZWN0ZWQgIitKU09OLnN0cmluZ2lmeShTdHJpbmcuZnJvbUNoYXJDb2RlKHRbZV0pKSsiIGF0IHBvc2l0aW9uICIrZSsiIGluIHN0YXRlICIrYXQudG9rbmFtKHRoaXMudFN0YXRlKSkpfSx1dC5hcHBlbmRTdHJpbmdDaGFyPWZ1bmN0aW9uKHQpe3RoaXMuc3RyaW5nQnVmZmVyT2Zmc2V0Pj1vdCYmKHRoaXMuc3RyaW5nKz10aGlzLnN0cmluZ0J1ZmZlci50b1N0cmluZygidXRmOCIpLHRoaXMuc3RyaW5nQnVmZmVyT2Zmc2V0PTApLHRoaXMuc3RyaW5nQnVmZmVyW3RoaXMuc3RyaW5nQnVmZmVyT2Zmc2V0KytdPXR9LHV0LmFwcGVuZFN0cmluZ0J1Zj1mdW5jdGlvbih0LGUscil7dmFyIGk9dC5sZW5ndGg7Im51bWJlciI9PXR5cGVvZiBlJiYoaT0ibnVtYmVyIj09dHlwZW9mIHI/cjwwP3QubGVuZ3RoLWUrcjpyLWU6dC5sZW5ndGgtZSksaTwwJiYoaT0wKSx0aGlzLnN0cmluZ0J1ZmZlck9mZnNldCtpPm90JiYodGhpcy5zdHJpbmcrPXRoaXMuc3RyaW5nQnVmZmVyLnRvU3RyaW5nKCJ1dGY4IiwwLHRoaXMuc3RyaW5nQnVmZmVyT2Zmc2V0KSx0aGlzLnN0cmluZ0J1ZmZlck9mZnNldD0wKSx0LmNvcHkodGhpcy5zdHJpbmdCdWZmZXIsdGhpcy5zdHJpbmdCdWZmZXJPZmZzZXQsZSxyKSx0aGlzLnN0cmluZ0J1ZmZlck9mZnNldCs9aX0sdXQud3JpdGU9ZnVuY3Rpb24odCl7dmFyIGU7InN0cmluZyI9PXR5cGVvZiB0JiYodD1uZXcgQnVmZmVyKHQpKTtmb3IodmFyIHI9MCxpPXQubGVuZ3RoO3I8aTtyKyspaWYodGhpcy50U3RhdGU9PT1CKXtpZihlPXRbcl0sdGhpcy5vZmZzZXQrKywxMjM9PT1lKXRoaXMub25Ub2tlbihiLCJ7Iik7ZWxzZSBpZigxMjU9PT1lKXRoaXMub25Ub2tlbihtLCJ9Iik7ZWxzZSBpZig5MT09PWUpdGhpcy5vblRva2VuKFMsIlsiKTtlbHNlIGlmKDkzPT09ZSl0aGlzLm9uVG9rZW4oXywiXSIpO2Vsc2UgaWYoNTg9PT1lKXRoaXMub25Ub2tlbihrLCI6Iik7ZWxzZSBpZig0ND09PWUpdGhpcy5vblRva2VuKE8sIiwiKTtlbHNlIGlmKDExNj09PWUpdGhpcy50U3RhdGU9UjtlbHNlIGlmKDEwMj09PWUpdGhpcy50U3RhdGU9TjtlbHNlIGlmKDExMD09PWUpdGhpcy50U3RhdGU9TDtlbHNlIGlmKDM0PT09ZSl0aGlzLnN0cmluZz0iIix0aGlzLnN0cmluZ0J1ZmZlck9mZnNldD0wLHRoaXMudFN0YXRlPUc7ZWxzZSBpZig0NT09PWUpdGhpcy5zdHJpbmc9Ii0iLHRoaXMudFN0YXRlPU07ZWxzZSBpZihlPj00OCYmZTw2NCl0aGlzLnN0cmluZz1TdHJpbmcuZnJvbUNoYXJDb2RlKGUpLHRoaXMudFN0YXRlPXo7ZWxzZSBpZigzMiE9PWUmJjkhPT1lJiYxMCE9PWUmJjEzIT09ZSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKX1lbHNlIGlmKHRoaXMudFN0YXRlPT09RylpZihlPXRbcl0sdGhpcy5ieXRlc19yZW1haW5pbmc+MCl7Zm9yKHZhciBuPTA7bjx0aGlzLmJ5dGVzX3JlbWFpbmluZztuKyspdGhpcy50ZW1wX2J1ZmZzW3RoaXMuYnl0ZXNfaW5fc2VxdWVuY2VdW3RoaXMuYnl0ZXNfaW5fc2VxdWVuY2UtdGhpcy5ieXRlc19yZW1haW5pbmcrbl09dFtuXTt0aGlzLmFwcGVuZFN0cmluZ0J1Zih0aGlzLnRlbXBfYnVmZnNbdGhpcy5ieXRlc19pbl9zZXF1ZW5jZV0pLHRoaXMuYnl0ZXNfaW5fc2VxdWVuY2U9dGhpcy5ieXRlc19yZW1haW5pbmc9MCxyPXIrbi0xfWVsc2UgaWYoMD09PXRoaXMuYnl0ZXNfcmVtYWluaW5nJiZlPj0xMjgpe2lmKGU8PTE5M3x8ZT4yNDQpcmV0dXJuIHRoaXMub25FcnJvcihuZXcgRXJyb3IoIkludmFsaWQgVVRGLTggY2hhcmFjdGVyIGF0IHBvc2l0aW9uICIrcisiIGluIHN0YXRlICIrYXQudG9rbmFtKHRoaXMudFN0YXRlKSkpO2lmKGU+PTE5NCYmZTw9MjIzJiYodGhpcy5ieXRlc19pbl9zZXF1ZW5jZT0yKSxlPj0yMjQmJmU8PTIzOSYmKHRoaXMuYnl0ZXNfaW5fc2VxdWVuY2U9MyksZT49MjQwJiZlPD0yNDQmJih0aGlzLmJ5dGVzX2luX3NlcXVlbmNlPTQpLHRoaXMuYnl0ZXNfaW5fc2VxdWVuY2Urcj50Lmxlbmd0aCl7Zm9yKHZhciBzPTA7czw9dC5sZW5ndGgtMS1yO3MrKyl0aGlzLnRlbXBfYnVmZnNbdGhpcy5ieXRlc19pbl9zZXF1ZW5jZV1bc109dFtyK3NdO3RoaXMuYnl0ZXNfcmVtYWluaW5nPXIrdGhpcy5ieXRlc19pbl9zZXF1ZW5jZS10Lmxlbmd0aCxyPXQubGVuZ3RoLTF9ZWxzZSB0aGlzLmFwcGVuZFN0cmluZ0J1Zih0LHIscit0aGlzLmJ5dGVzX2luX3NlcXVlbmNlKSxyPXIrdGhpcy5ieXRlc19pbl9zZXF1ZW5jZS0xfWVsc2UgaWYoMzQ9PT1lKXRoaXMudFN0YXRlPUIsdGhpcy5zdHJpbmcrPXRoaXMuc3RyaW5nQnVmZmVyLnRvU3RyaW5nKCJ1dGY4IiwwLHRoaXMuc3RyaW5nQnVmZmVyT2Zmc2V0KSx0aGlzLnN0cmluZ0J1ZmZlck9mZnNldD0wLHRoaXMub25Ub2tlbihBLHRoaXMuc3RyaW5nKSx0aGlzLm9mZnNldCs9QnVmZmVyLmJ5dGVMZW5ndGgodGhpcy5zdHJpbmcsInV0ZjgiKSsxLHRoaXMuc3RyaW5nPXZvaWQgMDtlbHNlIGlmKDkyPT09ZSl0aGlzLnRTdGF0ZT1KO2Vsc2V7aWYoIShlPj0zMikpcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7dGhpcy5hcHBlbmRTdHJpbmdDaGFyKGUpfWVsc2UgaWYodGhpcy50U3RhdGU9PT1KKWlmKDM0PT09KGU9dFtyXSkpdGhpcy5hcHBlbmRTdHJpbmdDaGFyKGUpLHRoaXMudFN0YXRlPUc7ZWxzZSBpZig5Mj09PWUpdGhpcy5hcHBlbmRTdHJpbmdDaGFyKFopLHRoaXMudFN0YXRlPUc7ZWxzZSBpZig0Nz09PWUpdGhpcy5hcHBlbmRTdHJpbmdDaGFyKHR0KSx0aGlzLnRTdGF0ZT1HO2Vsc2UgaWYoOTg9PT1lKXRoaXMuYXBwZW5kU3RyaW5nQ2hhcihldCksdGhpcy50U3RhdGU9RztlbHNlIGlmKDEwMj09PWUpdGhpcy5hcHBlbmRTdHJpbmdDaGFyKHJ0KSx0aGlzLnRTdGF0ZT1HO2Vsc2UgaWYoMTEwPT09ZSl0aGlzLmFwcGVuZFN0cmluZ0NoYXIoaXQpLHRoaXMudFN0YXRlPUc7ZWxzZSBpZigxMTQ9PT1lKXRoaXMuYXBwZW5kU3RyaW5nQ2hhcihudCksdGhpcy50U3RhdGU9RztlbHNlIGlmKDExNj09PWUpdGhpcy5hcHBlbmRTdHJpbmdDaGFyKHN0KSx0aGlzLnRTdGF0ZT1HO2Vsc2V7aWYoMTE3IT09ZSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLnVuaWNvZGU9IiIsdGhpcy50U3RhdGU9Vn1lbHNlIGlmKHRoaXMudFN0YXRlPT09Vnx8dGhpcy50U3RhdGU9PT1LfHx0aGlzLnRTdGF0ZT09PUR8fHRoaXMudFN0YXRlPT09Vyl7aWYoISgoZT10W3JdKT49NDgmJmU8NjR8fGU+NjQmJmU8PTcwfHxlPjk2JiZlPD0xMDIpKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO2lmKHRoaXMudW5pY29kZSs9U3RyaW5nLmZyb21DaGFyQ29kZShlKSx0aGlzLnRTdGF0ZSsrPT09Vyl7dmFyIG89cGFyc2VJbnQodGhpcy51bmljb2RlLDE2KTt0aGlzLnVuaWNvZGU9dm9pZCAwLHZvaWQgMCE9PXRoaXMuaGlnaFN1cnJvZ2F0ZSYmbz49NTYzMjAmJm88NTczNDQ/KHRoaXMuYXBwZW5kU3RyaW5nQnVmKG5ldyBCdWZmZXIoU3RyaW5nLmZyb21DaGFyQ29kZSh0aGlzLmhpZ2hTdXJyb2dhdGUsbykpKSx0aGlzLmhpZ2hTdXJyb2dhdGU9dm9pZCAwKTp2b2lkIDA9PT10aGlzLmhpZ2hTdXJyb2dhdGUmJm8+PTU1Mjk2JiZvPDU2MzIwP3RoaXMuaGlnaFN1cnJvZ2F0ZT1vOih2b2lkIDAhPT10aGlzLmhpZ2hTdXJyb2dhdGUmJih0aGlzLmFwcGVuZFN0cmluZ0J1ZihuZXcgQnVmZmVyKFN0cmluZy5mcm9tQ2hhckNvZGUodGhpcy5oaWdoU3Vycm9nYXRlKSkpLHRoaXMuaGlnaFN1cnJvZ2F0ZT12b2lkIDApLHRoaXMuYXBwZW5kU3RyaW5nQnVmKG5ldyBCdWZmZXIoU3RyaW5nLmZyb21DaGFyQ29kZShvKSkpKSx0aGlzLnRTdGF0ZT1HfX1lbHNlIGlmKHRoaXMudFN0YXRlPT09TXx8dGhpcy50U3RhdGU9PT16KXN3aXRjaChlPXRbcl0pe2Nhc2UgNDg6Y2FzZSA0OTpjYXNlIDUwOmNhc2UgNTE6Y2FzZSA1MjpjYXNlIDUzOmNhc2UgNTQ6Y2FzZSA1NTpjYXNlIDU2OmNhc2UgNTc6Y2FzZSA0NjpjYXNlIDEwMTpjYXNlIDY5OmNhc2UgNDM6Y2FzZSA0NTp0aGlzLnN0cmluZys9U3RyaW5nLmZyb21DaGFyQ29kZShlKSx0aGlzLnRTdGF0ZT16O2JyZWFrO2RlZmF1bHQ6dGhpcy50U3RhdGU9Qjt2YXIgYT1OdW1iZXIodGhpcy5zdHJpbmcpO2lmKGlzTmFOKGEpKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMuc3RyaW5nLm1hdGNoKC9bMC05XSsvKT09dGhpcy5zdHJpbmcmJmEudG9TdHJpbmcoKSE9dGhpcy5zdHJpbmc/dGhpcy5vblRva2VuKEEsdGhpcy5zdHJpbmcpOnRoaXMub25Ub2tlbihULGEpLHRoaXMub2Zmc2V0Kz10aGlzLnN0cmluZy5sZW5ndGgtMSx0aGlzLnN0cmluZz12b2lkIDAsci0tfWVsc2UgaWYodGhpcy50U3RhdGU9PT1SKXtpZigxMTQhPT10W3JdKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMudFN0YXRlPUZ9ZWxzZSBpZih0aGlzLnRTdGF0ZT09PUYpe2lmKDExNyE9PXRbcl0pcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7dGhpcy50U3RhdGU9UH1lbHNlIGlmKHRoaXMudFN0YXRlPT09UCl7aWYoMTAxIT09dFtyXSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLnRTdGF0ZT1CLHRoaXMub25Ub2tlbihqLCEwKSx0aGlzLm9mZnNldCs9M31lbHNlIGlmKHRoaXMudFN0YXRlPT09Til7aWYoOTchPT10W3JdKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMudFN0YXRlPUl9ZWxzZSBpZih0aGlzLnRTdGF0ZT09PUkpe2lmKDEwOCE9PXRbcl0pcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7dGhpcy50U3RhdGU9eH1lbHNlIGlmKHRoaXMudFN0YXRlPT09eCl7aWYoMTE1IT09dFtyXSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLnRTdGF0ZT1xfWVsc2UgaWYodGhpcy50U3RhdGU9PT1xKXtpZigxMDEhPT10W3JdKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMudFN0YXRlPUIsdGhpcy5vblRva2VuKHcsITEpLHRoaXMub2Zmc2V0Kz00fWVsc2UgaWYodGhpcy50U3RhdGU9PT1MKXtpZigxMTchPT10W3JdKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMudFN0YXRlPSR9ZWxzZSBpZih0aGlzLnRTdGF0ZT09PSQpe2lmKDEwOCE9PXRbcl0pcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7dGhpcy50U3RhdGU9VX1lbHNlIGlmKHRoaXMudFN0YXRlPT09VSl7aWYoMTA4IT09dFtyXSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLnRTdGF0ZT1CLHRoaXMub25Ub2tlbihFLG51bGwpLHRoaXMub2Zmc2V0Kz0zfX0sdXQub25Ub2tlbj1mdW5jdGlvbih0LGUpe30sdXQucGFyc2VFcnJvcj1mdW5jdGlvbih0LGUpe3RoaXMudFN0YXRlPUMsdGhpcy5vbkVycm9yKG5ldyBFcnJvcigiVW5leHBlY3RlZCAiK2F0LnRva25hbSh0KSsoZT8iKCIrSlNPTi5zdHJpbmdpZnkoZSkrIikiOiIiKSsiIGluIHN0YXRlICIrYXQudG9rbmFtKHRoaXMuc3RhdGUpKSl9LHV0LnB1c2g9ZnVuY3Rpb24oKXt0aGlzLnN0YWNrLnB1c2goe3ZhbHVlOnRoaXMudmFsdWUsa2V5OnRoaXMua2V5LG1vZGU6dGhpcy5tb2RlfSl9LHV0LnBvcD1mdW5jdGlvbigpe3ZhciB0PXRoaXMudmFsdWUsZT10aGlzLnN0YWNrLnBvcCgpO3RoaXMudmFsdWU9ZS52YWx1ZSx0aGlzLmtleT1lLmtleSx0aGlzLm1vZGU9ZS5tb2RlLHRoaXMuZW1pdCh0KSx0aGlzLm1vZGV8fCh0aGlzLnN0YXRlPUgpfSx1dC5lbWl0PWZ1bmN0aW9uKHQpe3RoaXMubW9kZSYmKHRoaXMuc3RhdGU9TyksdGhpcy5vblZhbHVlKHQpfSx1dC5vblZhbHVlPWZ1bmN0aW9uKHQpe30sdXQub25Ub2tlbj1mdW5jdGlvbih0LGUpe2lmKHRoaXMuc3RhdGU9PT1IKWlmKHQ9PT1BfHx0PT09VHx8dD09PWp8fHQ9PT13fHx0PT09RSl0aGlzLnZhbHVlJiYodGhpcy52YWx1ZVt0aGlzLmtleV09ZSksdGhpcy5lbWl0KGUpO2Vsc2UgaWYodD09PWIpdGhpcy5wdXNoKCksdGhpcy52YWx1ZT90aGlzLnZhbHVlPXRoaXMudmFsdWVbdGhpcy5rZXldPXt9OnRoaXMudmFsdWU9e30sdGhpcy5rZXk9dm9pZCAwLHRoaXMuc3RhdGU9WSx0aGlzLm1vZGU9UTtlbHNlIGlmKHQ9PT1TKXRoaXMucHVzaCgpLHRoaXMudmFsdWU/dGhpcy52YWx1ZT10aGlzLnZhbHVlW3RoaXMua2V5XT1bXTp0aGlzLnZhbHVlPVtdLHRoaXMua2V5PTAsdGhpcy5tb2RlPVgsdGhpcy5zdGF0ZT1IO2Vsc2UgaWYodD09PW0pe2lmKHRoaXMubW9kZSE9PVEpcmV0dXJuIHRoaXMucGFyc2VFcnJvcih0LGUpO3RoaXMucG9wKCl9ZWxzZXtpZih0IT09XylyZXR1cm4gdGhpcy5wYXJzZUVycm9yKHQsZSk7aWYodGhpcy5tb2RlIT09WClyZXR1cm4gdGhpcy5wYXJzZUVycm9yKHQsZSk7dGhpcy5wb3AoKX1lbHNlIGlmKHRoaXMuc3RhdGU9PT1ZKWlmKHQ9PT1BKXRoaXMua2V5PWUsdGhpcy5zdGF0ZT1rO2Vsc2V7aWYodCE9PW0pcmV0dXJuIHRoaXMucGFyc2VFcnJvcih0LGUpO3RoaXMucG9wKCl9ZWxzZSBpZih0aGlzLnN0YXRlPT09ayl7aWYodCE9PWspcmV0dXJuIHRoaXMucGFyc2VFcnJvcih0LGUpO3RoaXMuc3RhdGU9SH1lbHNle2lmKHRoaXMuc3RhdGUhPT1PKXJldHVybiB0aGlzLnBhcnNlRXJyb3IodCxlKTtpZih0PT09Tyl0aGlzLm1vZGU9PT1YPyh0aGlzLmtleSsrLHRoaXMuc3RhdGU9SCk6dGhpcy5tb2RlPT09USYmKHRoaXMuc3RhdGU9WSk7ZWxzZXtpZighKHQ9PT1fJiZ0aGlzLm1vZGU9PT1YfHx0PT09bSYmdGhpcy5tb2RlPT09USkpcmV0dXJuIHRoaXMucGFyc2VFcnJvcih0LGUpO3RoaXMucG9wKCl9fX0sYXQuQz12O3ZhciBodD1hdDtmdW5jdGlvbiBmdChlLHIsbil7ZT1lfHxmdW5jdGlvbih0KXt0aGlzLnF1ZXVlKHQpfSxyPXJ8fGZ1bmN0aW9uKCl7dGhpcy5xdWV1ZShudWxsKX07bGV0IHM9ITEsbz0hMSxhPVtdLHU9ITEsaD1uZXcgdDtmdW5jdGlvbiBmKCl7Zm9yKDthLmxlbmd0aCYmIWgucGF1c2VkOyl7bGV0IHQ9YS5zaGlmdCgpO2lmKG51bGw9PT10KXJldHVybiBoLmVtaXQoImVuZCIpO2guZW1pdCgiZGF0YSIsdCl9fXJldHVybiBoLnJlYWRhYmxlPWgud3JpdGFibGU9ITAsaC5wYXVzZWQ9ITEsaC5hdXRvRGVzdHJveT0hKG4mJiExPT09bi5hdXRvRGVzdHJveSksaC53cml0ZT1mdW5jdGlvbih0KXtyZXR1cm4gZS5jYWxsKHRoaXMsdCksIWgucGF1c2VkfSxoLnF1ZXVlPWgucHVzaD1mdW5jdGlvbih0KXtyZXR1cm4gdXx8KG51bGw9PT10JiYodT0hMCksYS5wdXNoKHQpLGYoKSksaH0saC5vbigiZW5kIiwoZnVuY3Rpb24oKXtoLnJlYWRhYmxlPSExLCFoLndyaXRhYmxlJiZoLmF1dG9EZXN0cm95JiZpLm5leHRUaWNrKChmdW5jdGlvbigpe2guZGVzdHJveSgpfSkpfSkpLGguZW5kPWZ1bmN0aW9uKHQpe2lmKCFzKXJldHVybiBzPSEwLGFyZ3VtZW50cy5sZW5ndGgmJmgud3JpdGUodCksaC53cml0YWJsZT0hMSxyLmNhbGwoaCksIWgucmVhZGFibGUmJmguYXV0b0Rlc3Ryb3kmJmguZGVzdHJveSgpLGh9LGguZGVzdHJveT1mdW5jdGlvbigpe2lmKCFvKXJldHVybiBvPSEwLHM9ITAsYS5sZW5ndGg9MCxoLndyaXRhYmxlPWgucmVhZGFibGU9ITEsaC5lbWl0KCJjbG9zZSIpLGh9LGgucGF1c2U9ZnVuY3Rpb24oKXtpZighaC5wYXVzZWQpcmV0dXJuIGgucGF1c2VkPSEwLGh9LGgucmVzdW1lPWZ1bmN0aW9uKCl7cmV0dXJuIGgucGF1c2VkJiYoaC5wYXVzZWQ9ITEsaC5lbWl0KCJyZXN1bWUiKSksZigpLGgucGF1c2VkfHxoLmVtaXQoImRyYWluIiksaH0saH1mdC50aHJvdWdoPWZ0O2xldCBjdD17cGFyc2U6ZnVuY3Rpb24odCxyKXtsZXQgaSxuO2Z1bmN0aW9uIHModCxlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ/ZT09PXQ6dCYmImZ1bmN0aW9uIj09dHlwZW9mIHQuZXhlYz90LmV4ZWMoZSk6ImJvb2xlYW4iPT10eXBlb2YgdHx8Im9iamVjdCI9PXR5cGVvZiB0P3Q6ImZ1bmN0aW9uIj09dHlwZW9mIHQmJnQoZSl9bGV0IG89bmV3IGh0LGE9ZnQoKGZ1bmN0aW9uKHQpeyJzdHJpbmciPT10eXBlb2YgdCYmKHQ9ZS5CdWZmZXIuZnJvbSh0KSksby53cml0ZSh0KX0pLChmdW5jdGlvbih0KXt0JiZhLndyaXRlKHQpLGkmJmEuZW1pdCgiaGVhZGVyIixpKSxuJiZhLmVtaXQoImZvb3RlciIsbiksYS5xdWV1ZShudWxsKX0pKTtmdW5jdGlvbiB1KHQsZSl7ITEhPT1pJiYoaT1pfHx7fSxpW3RdPWUpLCExIT09biYmITE9PT1pJiYobj1ufHx7fSxuW3RdPWUpfXJldHVybiJzdHJpbmciPT10eXBlb2YgdCYmKHQ9dC5zcGxpdCgiLiIpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIiQqIj09PXQ/e2VtaXRLZXk6ITB9OiIqIj09PXR8fCgiIj09PXQ/e3JlY3Vyc2U6ITB9OnQpfSkpKSx0JiZ0Lmxlbmd0aHx8KHQ9bnVsbCksby5vblZhbHVlPWZ1bmN0aW9uKGUpe2lmKHRoaXMucm9vdHx8KGEucm9vdD1lKSwhdClyZXR1cm47bGV0IG49MCxvPTAsaD0hMSxmPSExO2Zvcig7bjx0Lmxlbmd0aDspe2xldCByLGk9dFtuXTtpZihvKyssaSYmIWkucmVjdXJzZSl7aWYocj1vPT09dGhpcy5zdGFjay5sZW5ndGg/dGhpczp0aGlzLnN0YWNrW29dLCFyKXJldHVybjtpZighcyhpLHIua2V5KSlyZXR1cm4gdm9pZCB1KHIua2V5LGUpO2g9ISFpLmVtaXRLZXksZj0hIWkuZW1pdFBhdGgsbisrfWVsc2V7bisrO2xldCBpPXRbbl07aWYoIWkpcmV0dXJuO2Zvcig7Oyl7aWYocj1vPT09dGhpcy5zdGFjay5sZW5ndGg/dGhpczp0aGlzLnN0YWNrW29dLCFyKXJldHVybjtpZihzKGksci5rZXkpKXtuKyssT2JqZWN0LmlzRnJvemVuKHRoaXMuc3RhY2tbb10pfHwodGhpcy5zdGFja1tvXS52YWx1ZT1udWxsKTticmVha311KHIua2V5LGUpLG8rK319fWlmKGkmJihhLmVtaXQoImhlYWRlciIsaSksaT0hMSksbyE9PXRoaXMuc3RhY2subGVuZ3RoKXJldHVybjtsZXQgYz10aGlzLnN0YWNrLnNsaWNlKDEpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQua2V5fSkpLmNvbmNhdChbdGhpcy5rZXldKSxsPWU7bnVsbCE9bCYmbnVsbCE9KGw9cj9yKGwsYyk6bCkmJigoaHx8ZikmJihsPXt2YWx1ZTpsfSxoJiYobC5rZXk9dGhpcy5rZXkpLGYmJihsLnBhdGg9YykpLGEucXVldWUobCkpLHRoaXMudmFsdWUmJmRlbGV0ZSB0aGlzLnZhbHVlW3RoaXMua2V5XTtmb3IobGV0IHQgaW4gdGhpcy5zdGFjaylPYmplY3QuaXNGcm96ZW4odGhpcy5zdGFja1t0XSl8fCh0aGlzLnN0YWNrW3RdLnZhbHVlPW51bGwpfSxvLl9vblRva2VuPW8ub25Ub2tlbixvLm9uVG9rZW49ZnVuY3Rpb24oZSxyKXtvLl9vblRva2VuKGUsciksMD09PXRoaXMuc3RhY2subGVuZ3RoJiZhLnJvb3QmJih0fHxhLnF1ZXVlKGEucm9vdCksYS5yb290PW51bGwpfSxvLm9uRXJyb3I9ZnVuY3Rpb24odCl7dC5tZXNzYWdlLmluZGV4T2YoImF0IHBvc2l0aW9uIik+LTEmJih0Lm1lc3NhZ2U9IkludmFsaWQgSlNPTiAoIit0Lm1lc3NhZ2UrIikiKSxhLmVtaXQoImVycm9yIix0KX0sYX19LGx0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGx0PU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbih0LGUpe3QuX19wcm90b19fPWV9fHxmdW5jdGlvbih0LGUpe2ZvcihsZXQgciBpbiBlKWUuaGFzT3duUHJvcGVydHkocikmJih0W3JdPWVbcl0pfSxsdCh0LGUpfTtsZXQgcHQsZHQ9L1tcXCJcdTAwMDAtXHUwMDFmXHUwMDdmLVx1MDA5Zlx1MDBhZFx1MDYwMC1cdTA2MDRcdTA3MGZcdTE3YjRcdTE3YjVcdTIwMGMtXHUyMDBmXHUyMDI4LVx1MjAyZlx1MjA2MC1cdTIwNmZcdWZlZmZcdWZmZjAtXHVmZmZmXS9nLHl0PXsiXGIiOiJcXGIiLCJcdCI6IlxcdCIsIlxuIjoiXFxuIiwiXGYiOiJcXGYiLCJcciI6IlxcciIsJyInOidcXCInLCJcXCI6IlxcXFwifTtmdW5jdGlvbiBndCh0KXtyZXR1cm4gdD8iZnVuY3Rpb24iPT10eXBlb2YgdC50aGVuP3B0LlByb21pc2U6ZnVuY3Rpb24odCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQucmVhZCYmImZ1bmN0aW9uIj09dHlwZW9mIHQucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHQucGlwZSYmImZ1bmN0aW9uIj09dHlwZW9mIHQub25jZSYmImZ1bmN0aW9uIj09dHlwZW9mIHQucmVtb3ZlTGlzdGVuZXJ9KHQpP3QuX3JlYWRhYmxlU3RhdGUub2JqZWN0TW9kZT9wdC5SZWFkYWJsZU9iamVjdDpwdC5SZWFkYWJsZVN0cmluZzpBcnJheS5pc0FycmF5KHQpP3B0LkFycmF5OiJvYmplY3QiPT10eXBlb2YgdHx8dCBpbnN0YW5jZW9mIE9iamVjdD9wdC5PYmplY3Q6cHQuUHJpbWl0aXZlOnB0LlByaW1pdGl2ZX0hZnVuY3Rpb24odCl7dFt0LkFycmF5PTBdPSJBcnJheSIsdFt0Lk9iamVjdD0xXT0iT2JqZWN0Iix0W3QuUmVhZGFibGVTdHJpbmc9Ml09IlJlYWRhYmxlU3RyaW5nIix0W3QuUmVhZGFibGVPYmplY3Q9M109IlJlYWRhYmxlT2JqZWN0Iix0W3QuUHJpbWl0aXZlPTRdPSJQcmltaXRpdmUiLHRbdC5Qcm9taXNlPTVdPSJQcm9taXNlIn0ocHR8fChwdD17fSkpO2xldCB2dD1bXTt2dFtwdC5BcnJheV09IlsiLHZ0W3B0Lk9iamVjdF09InsiLHZ0W3B0LlJlYWRhYmxlU3RyaW5nXT0nIicsdnRbcHQuUmVhZGFibGVPYmplY3RdPSJbIjtsZXQgYnQ9W107YnRbcHQuQXJyYXldPSJdIixidFtwdC5PYmplY3RdPSJ9IixidFtwdC5SZWFkYWJsZVN0cmluZ109JyInLGJ0W3B0LlJlYWRhYmxlT2JqZWN0XT0iXSI7bGV0IG10PVtdO2ZvcihsZXQgdD0wLGU9T2JqZWN0LmVudHJpZXMocHQpO3Q8ZS5sZW5ndGg7dCsrKXtsZXQgcj1lW3RdLGk9clswXSxuPXJbMV07Im51bWJlciI9PXR5cGVvZiBuJiYobXRbbl09InByb2Nlc3MiK2kpfWZ1bmN0aW9uIFN0KHQpe3JldHVybiB0LnJlcGxhY2UoZHQsKGZ1bmN0aW9uKHQpe2xldCBlPXl0W3RdO3JldHVybiJzdHJpbmciPT10eXBlb2YgZT9lOiJcXHUiK3QuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikucGFkU3RhcnQoNCwiMCIpfSkpfWZ1bmN0aW9uIF90KHQpe3JldHVybiciJytTdCh0KSsnIid9ZnVuY3Rpb24ga3QodCxlKXtsZXQgcj10LnJlYWQoZSk7cmV0dXJuIG51bGw9PT1yP25ldyBQcm9taXNlKChmdW5jdGlvbihlLHIpe2xldCBpPWZ1bmN0aW9uKCl7cmV0dXJuIGUobnVsbCl9O3Qub25jZSgiZW5kIixpKSx0Lm9uY2UoImVycm9yIixyKSx0Lm9uY2UoInJlYWRhYmxlIiwoZnVuY3Rpb24oKXt0LnJlbW92ZUxpc3RlbmVyKCJlbmQiLGkpLHQucmVtb3ZlTGlzdGVuZXIoImVycm9yIixyKSxlKHQucmVhZCgpKX0pKX0pKTpQcm9taXNlLnJlc29sdmUocil9ZnVuY3Rpb24gT3QodCl7cmV0dXJuIHQudGhlbigoZnVuY3Rpb24odCl7cmV0dXJuIGd0KHQpPT09cHQuUHJvbWlzZT9PdCh0KTp0fSkpfWxldCBqdD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUscixpLG4pe3ZvaWQgMD09PW4mJihuPSExKTtsZXQgcz10LmNhbGwodGhpcyl8fHRoaXM7cy5jeWNsZT1uLHMuc3RhY2s9W10scy5kZXB0aD0wLHMucHVzaENhbGxlZD0hMSxzLmVuZD0hMSxzLmlzUmVhZGluZz0hMSxzLnJlYWRNb3JlPSExO2xldCBvPXR5cGVvZiBpO3JldHVybiJzdHJpbmciIT09byYmIm51bWJlciIhPT1vfHwocy5nYXA9TnVtYmVyLmlzRmluaXRlKGkpPyIgIi5yZXBlYXQoaSk6aSksT2JqZWN0LmFzc2lnbihzLHt2aXNpdGVkOm4/bmV3IFdlYWtNYXA6bmV3IFdlYWtTZXQscmVwbGFjZXJGdW5jdGlvbjpyIGluc3RhbmNlb2YgRnVuY3Rpb24mJnIscmVwbGFjZXJBcnJheTpBcnJheS5pc0FycmF5KHIpJiZyfSksciBpbnN0YW5jZW9mIEZ1bmN0aW9uJiYocy5yZXBsYWNlckZ1bmN0aW9uPXIpLEFycmF5LmlzQXJyYXkocikmJihzLnJlcGxhY2VyQXJyYXk9cikscy5hZGRUb1N0YWNrKGUpLHN9cmV0dXJuIGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gcigpe3RoaXMuY29uc3RydWN0b3I9dH1sdCh0LGUpLHQucHJvdG90eXBlPW51bGw9PT1lP09iamVjdC5jcmVhdGUoZSk6KHIucHJvdG90eXBlPWUucHJvdG90eXBlLG5ldyByKX0oZSx0KSxlLnByb3RvdHlwZS5jeWNsZXI9ZnVuY3Rpb24odCxlKXtsZXQgcj10aGlzLnZpc2l0ZWQuZ2V0KGUpO2lmKHIpcmV0dXJueyRyZWY6cn07bGV0IGk9dGhpcy5wYXRoKCk7cmV0dXJuIHZvaWQgMCE9PXQmJmkucHVzaCh0KSxpPWkubWFwKChmdW5jdGlvbih0KXtyZXR1cm4iWyIrKE51bWJlci5pc0ludGVnZXIodCk/dDpfdCh0KSkrIl0ifSkpLHRoaXMudmlzaXRlZC5zZXQoZSxpLmxlbmd0aD8iJCIraS5qb2luKCIiKToiJCIpLGV9LGUucHJvdG90eXBlLmFkZFRvU3RhY2s9ZnVuY3Rpb24odCxlLHIsaSl7bGV0IG4scyxvPXRoaXMsYT10O3RoaXMucmVwbGFjZXJGdW5jdGlvbiYmKGE9dGhpcy5yZXBsYWNlckZ1bmN0aW9uKGV8fHIsYSx0aGlzKSksYSYmYS50b0pTT04gaW5zdGFuY2VvZiBGdW5jdGlvbiYmKGE9YS50b0pTT04oKSksKGEgaW5zdGFuY2VvZiBGdW5jdGlvbnx8InN5bWJvbCI9PXR5cGVvZiB0KSYmKGE9dm9pZCAwKSx2b2lkIDAhPT1lJiZ0aGlzLnJlcGxhY2VyQXJyYXkmJih0aGlzLnJlcGxhY2VyQXJyYXkuaW5jbHVkZXMoZSl8fChhPXZvaWQgMCkpO2xldCB1PWd0KGEpO2lmKChpJiZpLnR5cGU9PT1wdC5BcnJheXx8dm9pZCAwIT09YSkmJnUhPT1wdC5Qcm9taXNlJiYoaSYmIWkuZmlyc3QmJnRoaXMuX3B1c2goIiwiKSxpJiYoaS5maXJzdD0hMSkpLHZvaWQgMCE9PWEmJnUhPT1wdC5Qcm9taXNlJiZlJiYodGhpcy5nYXA/dGhpcy5fcHVzaCgiXG4iK3RoaXMuZ2FwLnJlcGVhdCh0aGlzLmRlcHRoKSsnIicrU3QoZSkrJyI6ICcpOnRoaXMuX3B1c2goJyInK1N0KGUpKyciOicpKSx1IT09cHQuUHJpbWl0aXZlKWlmKHRoaXMuY3ljbGUpYT10aGlzLmN5Y2xlcihlfHxyLGEpLHU9Z3QoYSk7ZWxzZXtpZih0aGlzLnZpc2l0ZWQuaGFzKGEpKXRocm93IE9iamVjdC5hc3NpZ24obmV3IEVycm9yKCJDb252ZXJ0aW5nIGNpcmN1bGFyIHN0cnVjdHVyZSB0byBKU09OIikse3JlYWxWYWx1ZTphLGtleTplfHxyfSk7dGhpcy52aXNpdGVkLmFkZChhKX0hZSYmcj4tMSYmdGhpcy5kZXB0aCYmdGhpcy5nYXAmJnRoaXMuX3B1c2goIlxuIit0aGlzLmdhcC5yZXBlYXQodGhpcy5kZXB0aCkpO2xldCBoPXZ0W3VdO2gmJnRoaXMuX3B1c2goaCk7bGV0IGY9e2tleTplLGluZGV4OnIsdHlwZTp1LHBhcmVudDppLHZhbHVlOmEsZmlyc3Q6ITB9O3JldHVybiB1PT09cHQuT2JqZWN0Pyh0aGlzLmRlcHRoKz0xLGYudW5yZWFkPU9iamVjdC5rZXlzKGEpLGYuaXNFbXB0eT0hZi51bnJlYWQubGVuZ3RoKTp1PT09cHQuQXJyYXk/KHRoaXMuZGVwdGgrPTEsZi51bnJlYWQ9YS5sZW5ndGgsZi5hcnJheUxlbmd0aD1mLnVucmVhZCxmLmlzRW1wdHk9IWYudW5yZWFkKTp1IT09cHQuUmVhZGFibGVTdHJpbmcmJnUhPT1wdC5SZWFkYWJsZU9iamVjdHx8KHRoaXMuZGVwdGgrPTEsYS5yZWFkYWJsZUVuZGVkfHwobnVsbD09PShuPWEuX3JlYWRhYmxlU3RhdGUpfHx2b2lkIDA9PT1uP3ZvaWQgMDpuLmVuZEVtaXR0ZWQpP3RoaXMuZW1pdCgiZXJyb3IiLG5ldyBFcnJvcigiUmVhZGFibGUgU3RyZWFtIGhhcyBlbmRlZCBiZWZvcmUgaXQgd2FzIHNlcmlhbGl6ZWQuIEFsbCBzdHJlYW0gZGF0YSBoYXZlIGJlZW4gbG9zdCIpLGEsZXx8cik6KGEucmVhZGFibGVGbG93aW5nfHwobnVsbD09PShzPWEuX3JlYWRhYmxlU3RhdGUpfHx2b2lkIDA9PT1zP3ZvaWQgMDpzLmZsb3dpbmcpKSYmKGEucGF1c2UoKSx0aGlzLmVtaXQoImVycm9yIixuZXcgRXJyb3IoIlJlYWRhYmxlIFN0cmVhbSBpcyBpbiBmbG93aW5nIG1vZGUsIGRhdGEgbWF5IGhhdmUgYmVlbiBsb3N0LiBUcnlpbmcgdG8gcGF1c2Ugc3RyZWFtLiIpLGEsZXx8cikpLGYucmVhZENvdW50PTAsYS5vbmNlKCJlbmQiLChmdW5jdGlvbigpe2YuZW5kPSEwLG8uX19yZWFkKCl9KSksYS5vbmNlKCJlcnJvciIsKGZ1bmN0aW9uKHQpe28uZXJyb3I9ITAsby5lbWl0KCJlcnJvciIsdCl9KSkpLHRoaXMuc3RhY2sudW5zaGlmdChmKSxmfSxlLnByb3RvdHlwZS5yZW1vdmVGcm9tU3RhY2s9ZnVuY3Rpb24odCl7bGV0IGU9dC50eXBlLHI9ZT09PXB0Lk9iamVjdHx8ZT09PXB0LkFycmF5fHxlPT09cHQuUmVhZGFibGVTdHJpbmd8fGU9PT1wdC5SZWFkYWJsZU9iamVjdDtlIT09cHQuUHJpbWl0aXZlJiYodGhpcy5jeWNsZXx8dGhpcy52aXNpdGVkLmRlbGV0ZSh0LnZhbHVlKSxyJiYodGhpcy5kZXB0aC09MSkpO2xldCBpPWJ0W2VdO3ImJiF0LmlzRW1wdHkmJnRoaXMuZ2FwJiZ0aGlzLl9wdXNoKCJcbiIrdGhpcy5nYXAucmVwZWF0KHRoaXMuZGVwdGgpKSxpJiZ0aGlzLl9wdXNoKGkpO2xldCBuPXRoaXMuc3RhY2suaW5kZXhPZih0KTt0aGlzLnN0YWNrLnNwbGljZShuLDEpfSxlLnByb3RvdHlwZS5fcHVzaD1mdW5jdGlvbih0KXt0aGlzLnB1c2hDYWxsZWQ9ITAsdGhpcy5wdXNoKHQpfSxlLnByb3RvdHlwZS5wcm9jZXNzUmVhZGFibGVPYmplY3Q9ZnVuY3Rpb24odCxlKXtsZXQgcj10aGlzO2lmKCF0LmVuZClyZXR1cm4ga3QodC52YWx1ZSxlKS50aGVuKChmdW5jdGlvbihlKXtudWxsIT09ZSYmKHQuZmlyc3R8fHIuX3B1c2goIiwiKSx0LmZpcnN0PSExLHIuYWRkVG9TdGFjayhlLHZvaWQgMCx0LnJlYWRDb3VudCksdC5yZWFkQ291bnQrPTEpfSkpO3RoaXMucmVtb3ZlRnJvbVN0YWNrKHQpfSxlLnByb3RvdHlwZS5wcm9jZXNzT2JqZWN0PWZ1bmN0aW9uKHQpe2lmKCF0LnVucmVhZC5sZW5ndGgpcmV0dXJuIHZvaWQgdGhpcy5yZW1vdmVGcm9tU3RhY2sodCk7bGV0IGU9dC51bnJlYWQuc2hpZnQoKSxyPXQudmFsdWVbZV07dGhpcy5hZGRUb1N0YWNrKHIsZSx2b2lkIDAsdCl9LGUucHJvdG90eXBlLnByb2Nlc3NBcnJheT1mdW5jdGlvbih0KXtsZXQgZT10LnVucmVhZDtpZighZSlyZXR1cm4gdm9pZCB0aGlzLnJlbW92ZUZyb21TdGFjayh0KTtsZXQgcj10LmFycmF5TGVuZ3RoLWUsaT10LnZhbHVlW3JdO3QudW5yZWFkLT0xLHRoaXMuYWRkVG9TdGFjayhpLHZvaWQgMCxyLHQpfSxlLnByb3RvdHlwZS5wcm9jZXNzUHJpbWl0aXZlPWZ1bmN0aW9uKHQpe2lmKHZvaWQgMCE9PXQudmFsdWUpe2xldCBlLHI9dHlwZW9mIHQudmFsdWU7c3dpdGNoKHIpe2Nhc2Uic3RyaW5nIjplPV90KHQudmFsdWUpO2JyZWFrO2Nhc2UibnVtYmVyIjplPU51bWJlci5pc0Zpbml0ZSh0LnZhbHVlKT9TdHJpbmcodC52YWx1ZSk6Im51bGwiO2JyZWFrO2Nhc2UiYm9vbGVhbiI6ZT1TdHJpbmcodC52YWx1ZSk7YnJlYWs7Y2FzZSJvYmplY3QiOnQudmFsdWV8fChlPSJudWxsIik7YnJlYWs7ZGVmYXVsdDp0aHJvdyBPYmplY3QuYXNzaWduKG5ldyBFcnJvcignVW5rbm93biB0eXBlICInK3IrJyIuIFBsZWFzZSBmaWxlIGFuIGlzc3VlIScpLHt2YWx1ZTp0LnZhbHVlfSl9dGhpcy5fcHVzaChlKX1lbHNlIXRoaXMuc3RhY2tbMV18fHRoaXMuc3RhY2tbMV0udHlwZSE9PXB0LkFycmF5JiZ0aGlzLnN0YWNrWzFdLnR5cGUhPT1wdC5SZWFkYWJsZU9iamVjdD90LmFkZFNlcGFyYXRvckFmdGVyRW5kPSExOnRoaXMuX3B1c2goIm51bGwiKTt0aGlzLnJlbW92ZUZyb21TdGFjayh0KX0sZS5wcm90b3R5cGUucHJvY2Vzc1JlYWRhYmxlU3RyaW5nPWZ1bmN0aW9uKHQsZSl7bGV0IHI9dGhpcztpZighdC5lbmQpcmV0dXJuIGt0KHQudmFsdWUsZSkudGhlbigoZnVuY3Rpb24odCl7dCYmci5fcHVzaChTdCh0LnRvU3RyaW5nKCkpKX0pKTt0aGlzLnJlbW92ZUZyb21TdGFjayh0KX0sZS5wcm90b3R5cGUucHJvY2Vzc1Byb21pc2U9ZnVuY3Rpb24odCl7bGV0IGU9dGhpcztyZXR1cm4gT3QodC52YWx1ZSkudGhlbigoZnVuY3Rpb24ocil7ZS5yZW1vdmVGcm9tU3RhY2sodCksZS5hZGRUb1N0YWNrKHIsdC5rZXksdC5pbmRleCx0LnBhcmVudCl9KSl9LGUucHJvdG90eXBlLnByb2Nlc3NTdGFja1RvcEl0ZW09ZnVuY3Rpb24odCl7bGV0IGUscj10aGlzLGk9dGhpcy5zdGFja1swXTtpZighaXx8dGhpcy5lcnJvcilyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7dHJ5e2U9dGhpc1ttdFtpLnR5cGVdXShpLHQpfWNhdGNoKHQpe3JldHVybiBQcm9taXNlLnJlamVjdCh0KX1yZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGUpLnRoZW4oKGZ1bmN0aW9uKCl7MD09PXIuc3RhY2subGVuZ3RoJiYoci5lbmQ9ITAsci5fcHVzaChudWxsKSl9KSl9LGUucHJvdG90eXBlLl9fcmVhZD1mdW5jdGlvbih0KXtsZXQgZT10aGlzO2lmKCF0aGlzLmlzUmVhZGluZyYmIXRoaXMuZXJyb3IpcmV0dXJuIHRoaXMuaXNSZWFkaW5nPSEwLHRoaXMucmVhZE1vcmU9ITEsdGhpcy5wcm9jZXNzU3RhY2tUb3BJdGVtKHQpLnRoZW4oKGZ1bmN0aW9uKCl7IWUuZW5kJiYhZS5lcnJvciYmKGUucmVhZE1vcmV8fCFlLnB1c2hDYWxsZWQpP3Iuc2V0SW1tZWRpYXRlKChmdW5jdGlvbigpe2UuaXNSZWFkaW5nPSExLGUuX19yZWFkKCl9KSk6ZS5pc1JlYWRpbmc9ITF9KSkuY2F0Y2goKGZ1bmN0aW9uKHQpe2UuZXJyb3I9ITAsZS5lbWl0KCJlcnJvciIsdCl9KSk7dGhpcy5yZWFkTW9yZT0hMH0sZS5wcm90b3R5cGUuX3JlYWQ9ZnVuY3Rpb24odCl7dGhpcy5wdXNoQ2FsbGVkPSExLHRoaXMuX19yZWFkKHQpfSxlLnByb3RvdHlwZS5wYXRoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhY2subWFwKChmdW5jdGlvbih0KXtsZXQgZT10LmtleSxyPXQuaW5kZXg7cmV0dXJuIGV8fHJ9KSkuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gdHx8dD4tMX0pKS5yZXZlcnNlKCl9LGV9KHQuUmVhZGFibGUpO3ZhciB3dD1BcnJheS5pc0FycmF5LEV0PSJvYmplY3QiPT10eXBlb2YgZ2xvYmFsJiZnbG9iYWwmJmdsb2JhbC5PYmplY3Q9PT1PYmplY3QmJmdsb2JhbCxBdD0ib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGYmJnNlbGYuT2JqZWN0PT09T2JqZWN0JiZzZWxmLFR0PUV0fHxBdHx8RnVuY3Rpb24oInJldHVybiB0aGlzIikoKSxCdD1UdC5TeW1ib2wsQ3Q9T2JqZWN0LnByb3RvdHlwZSxSdD1DdC5oYXNPd25Qcm9wZXJ0eSxGdD1DdC50b1N0cmluZyxQdD1CdD9CdC50b1N0cmluZ1RhZzp2b2lkIDA7dmFyIE50PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7dmFyIEl0PSJbb2JqZWN0IE51bGxdIix4dD0iW29iamVjdCBVbmRlZmluZWRdIixxdD1CdD9CdC50b1N0cmluZ1RhZzp2b2lkIDA7ZnVuY3Rpb24gTHQodCl7cmV0dXJuIG51bGw9PXQ/dm9pZCAwPT09dD94dDpJdDpxdCYmcXQgaW4gT2JqZWN0KHQpP2Z1bmN0aW9uKHQpe3ZhciBlPVJ0LmNhbGwodCxQdCkscj10W1B0XTt0cnl7dFtQdF09dm9pZCAwO3ZhciBpPSEwfWNhdGNoKHQpe312YXIgbj1GdC5jYWxsKHQpO3JldHVybiBpJiYoZT90W1B0XT1yOmRlbGV0ZSB0W1B0XSksbn0odCk6ZnVuY3Rpb24odCl7cmV0dXJuIE50LmNhbGwodCl9KHQpfWZ1bmN0aW9uICR0KHQpe3JldHVybiBudWxsIT10JiYib2JqZWN0Ij09dHlwZW9mIHR9dmFyIFV0PSJbb2JqZWN0IFN5bWJvbF0iO2Z1bmN0aW9uIE10KHQpe3JldHVybiJzeW1ib2wiPT10eXBlb2YgdHx8JHQodCkmJkx0KHQpPT1VdH12YXIgenQ9L1wufFxbKD86W15bXF1dKnwoWyInXSkoPzooPyFcMSlbXlxcXXxcXC4pKj9cMSlcXS8sR3Q9L15cdyokLztmdW5jdGlvbiBKdCh0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4gbnVsbCE9dCYmKCJvYmplY3QiPT1lfHwiZnVuY3Rpb24iPT1lKX12YXIgVnQ9IltvYmplY3QgQXN5bmNGdW5jdGlvbl0iLEt0PSJbb2JqZWN0IEZ1bmN0aW9uXSIsRHQ9IltvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dIixXdD0iW29iamVjdCBQcm94eV0iO3ZhciBIdCxZdD1UdFsiX19jb3JlLWpzX3NoYXJlZF9fIl0sUXQ9KEh0PS9bXi5dKyQvLmV4ZWMoWXQmJll0LmtleXMmJll0LmtleXMuSUVfUFJPVE98fCIiKSk/IlN5bWJvbChzcmMpXzEuIitIdDoiIjt2YXIgWHQ9RnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nO3ZhciBadD0vXlxbb2JqZWN0IC4rP0NvbnN0cnVjdG9yXF0kLyx0ZT1GdW5jdGlvbi5wcm90b3R5cGUsZWU9T2JqZWN0LnByb3RvdHlwZSxyZT10ZS50b1N0cmluZyxpZT1lZS5oYXNPd25Qcm9wZXJ0eSxuZT1SZWdFeHAoIl4iK3JlLmNhbGwoaWUpLnJlcGxhY2UoL1tcXF4kLiorPygpW1xde318XS9nLCJcXCQmIikucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXCgpfCBmb3IgLis/KD89XFxcXSkvZywiJDEuKj8iKSsiJCIpO2Z1bmN0aW9uIHNlKHQpe2lmKCFKdCh0KXx8KGU9dCxRdCYmUXQgaW4gZSkpcmV0dXJuITE7dmFyIGUscj1mdW5jdGlvbih0KXtpZighSnQodCkpcmV0dXJuITE7dmFyIGU9THQodCk7cmV0dXJuIGU9PUt0fHxlPT1EdHx8ZT09VnR8fGU9PVd0fSh0KT9uZTpadDtyZXR1cm4gci50ZXN0KGZ1bmN0aW9uKHQpe2lmKG51bGwhPXQpe3RyeXtyZXR1cm4gWHQuY2FsbCh0KX1jYXRjaCh0KXt9dHJ5e3JldHVybiB0KyIifWNhdGNoKHQpe319cmV0dXJuIiJ9KHQpKX1mdW5jdGlvbiBvZSh0LGUpe3ZhciByPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGw9PXQ/dm9pZCAwOnRbZV19KHQsZSk7cmV0dXJuIHNlKHIpP3I6dm9pZCAwfXZhciBhZT1vZShPYmplY3QsImNyZWF0ZSIpO3ZhciB1ZT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3ZhciBoZT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIGZlKHQpe3ZhciBlPS0xLHI9bnVsbD09dD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPHI7KXt2YXIgaT10W2VdO3RoaXMuc2V0KGlbMF0saVsxXSl9fWZ1bmN0aW9uIGNlKHQsZSl7Zm9yKHZhciByLGksbj10Lmxlbmd0aDtuLS07KWlmKChyPXRbbl1bMF0pPT09KGk9ZSl8fHIhPXImJmkhPWkpcmV0dXJuIG47cmV0dXJuLTF9ZmUucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5fX2RhdGFfXz1hZT9hZShudWxsKTp7fSx0aGlzLnNpemU9MH0sZmUucHJvdG90eXBlLmRlbGV0ZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmhhcyh0KSYmZGVsZXRlIHRoaXMuX19kYXRhX19bdF07cmV0dXJuIHRoaXMuc2l6ZS09ZT8xOjAsZX0sZmUucHJvdG90eXBlLmdldD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fO2lmKGFlKXt2YXIgcj1lW3RdO3JldHVybiJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIj09PXI/dm9pZCAwOnJ9cmV0dXJuIHVlLmNhbGwoZSx0KT9lW3RdOnZvaWQgMH0sZmUucHJvdG90eXBlLmhhcz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fO3JldHVybiBhZT92b2lkIDAhPT1lW3RdOmhlLmNhbGwoZSx0KX0sZmUucHJvdG90eXBlLnNldD1mdW5jdGlvbih0LGUpe3ZhciByPXRoaXMuX19kYXRhX187cmV0dXJuIHRoaXMuc2l6ZSs9dGhpcy5oYXModCk/MDoxLHJbdF09YWUmJnZvaWQgMD09PWU/Il9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iOmUsdGhpc307dmFyIGxlPUFycmF5LnByb3RvdHlwZS5zcGxpY2U7ZnVuY3Rpb24gcGUodCl7dmFyIGU9LTEscj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8cjspe3ZhciBpPXRbZV07dGhpcy5zZXQoaVswXSxpWzFdKX19cGUucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5fX2RhdGFfXz1bXSx0aGlzLnNpemU9MH0scGUucHJvdG90eXBlLmRlbGV0ZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fLHI9Y2UoZSx0KTtyZXR1cm4hKHI8MCkmJihyPT1lLmxlbmd0aC0xP2UucG9wKCk6bGUuY2FsbChlLHIsMSksLS10aGlzLnNpemUsITApfSxwZS5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX19kYXRhX18scj1jZShlLHQpO3JldHVybiByPDA/dm9pZCAwOmVbcl1bMV19LHBlLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24odCl7cmV0dXJuIGNlKHRoaXMuX19kYXRhX18sdCk+LTF9LHBlLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLl9fZGF0YV9fLGk9Y2Uocix0KTtyZXR1cm4gaTwwPygrK3RoaXMuc2l6ZSxyLnB1c2goW3QsZV0pKTpyW2ldWzFdPWUsdGhpc307dmFyIGRlPW9lKFR0LCJNYXAiKTtmdW5jdGlvbiB5ZSh0LGUpe3ZhciByLGksbj10Ll9fZGF0YV9fO3JldHVybigic3RyaW5nIj09KGk9dHlwZW9mKHI9ZSkpfHwibnVtYmVyIj09aXx8InN5bWJvbCI9PWl8fCJib29sZWFuIj09aT8iX19wcm90b19fIiE9PXI6bnVsbD09PXIpP25bInN0cmluZyI9PXR5cGVvZiBlPyJzdHJpbmciOiJoYXNoIl06bi5tYXB9ZnVuY3Rpb24gZ2UodCl7dmFyIGU9LTEscj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8cjspe3ZhciBpPXRbZV07dGhpcy5zZXQoaVswXSxpWzFdKX19Z2UucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5zaXplPTAsdGhpcy5fX2RhdGFfXz17aGFzaDpuZXcgZmUsbWFwOm5ldyhkZXx8cGUpLHN0cmluZzpuZXcgZmV9fSxnZS5wcm90b3R5cGUuZGVsZXRlPWZ1bmN0aW9uKHQpe3ZhciBlPXllKHRoaXMsdCkuZGVsZXRlKHQpO3JldHVybiB0aGlzLnNpemUtPWU/MTowLGV9LGdlLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHllKHRoaXMsdCkuZ2V0KHQpfSxnZS5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKHQpe3JldHVybiB5ZSh0aGlzLHQpLmhhcyh0KX0sZ2UucHJvdG90eXBlLnNldD1mdW5jdGlvbih0LGUpe3ZhciByPXllKHRoaXMsdCksaT1yLnNpemU7cmV0dXJuIHIuc2V0KHQsZSksdGhpcy5zaXplKz1yLnNpemU9PWk/MDoxLHRoaXN9O3ZhciB2ZT0iRXhwZWN0ZWQgYSBmdW5jdGlvbiI7ZnVuY3Rpb24gYmUodCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdHx8bnVsbCE9ZSYmImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcih2ZSk7dmFyIHI9ZnVuY3Rpb24oKXt2YXIgaT1hcmd1bWVudHMsbj1lP2UuYXBwbHkodGhpcyxpKTppWzBdLHM9ci5jYWNoZTtpZihzLmhhcyhuKSlyZXR1cm4gcy5nZXQobik7dmFyIG89dC5hcHBseSh0aGlzLGkpO3JldHVybiByLmNhY2hlPXMuc2V0KG4sbyl8fHMsb307cmV0dXJuIHIuY2FjaGU9bmV3KGJlLkNhY2hlfHxnZSkscn1iZS5DYWNoZT1nZTt2YXIgbWUsU2UsX2Usa2U9L1teLltcXV0rfFxbKD86KC0/XGQrKD86XC5cZCspPyl8KFsiJ10pKCg/Oig/IVwyKVteXFxdfFxcLikqPylcMilcXXwoPz0oPzpcLnxcW1xdKSg/OlwufFxbXF18JCkpL2csT2U9L1xcKFxcKT8vZyxqZT0obWU9ZnVuY3Rpb24odCl7dmFyIGU9W107cmV0dXJuIDQ2PT09dC5jaGFyQ29kZUF0KDApJiZlLnB1c2goIiIpLHQucmVwbGFjZShrZSwoZnVuY3Rpb24odCxyLGksbil7ZS5wdXNoKGk/bi5yZXBsYWNlKE9lLCIkMSIpOnJ8fHQpfSkpLGV9LFNlPWJlKG1lLChmdW5jdGlvbih0KXtyZXR1cm4gNTAwPT09X2Uuc2l6ZSYmX2UuY2xlYXIoKSx0fSkpLF9lPVNlLmNhY2hlLFNlKSx3ZT1qZTt2YXIgRWU9MS8wLEFlPUJ0P0J0LnByb3RvdHlwZTp2b2lkIDAsVGU9QWU/QWUudG9TdHJpbmc6dm9pZCAwO2Z1bmN0aW9uIEJlKHQpe2lmKCJzdHJpbmciPT10eXBlb2YgdClyZXR1cm4gdDtpZih3dCh0KSlyZXR1cm4gZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9LTEsaT1udWxsPT10PzA6dC5sZW5ndGgsbj1BcnJheShpKTsrK3I8aTspbltyXT1lKHRbcl0scix0KTtyZXR1cm4gbn0odCxCZSkrIiI7aWYoTXQodCkpcmV0dXJuIFRlP1RlLmNhbGwodCk6IiI7dmFyIGU9dCsiIjtyZXR1cm4iMCI9PWUmJjEvdD09LUVlPyItMCI6ZX1mdW5jdGlvbiBDZSh0LGUpe3JldHVybiB3dCh0KT90OmZ1bmN0aW9uKHQsZSl7aWYod3QodCkpcmV0dXJuITE7dmFyIHI9dHlwZW9mIHQ7cmV0dXJuISgibnVtYmVyIiE9ciYmInN5bWJvbCIhPXImJiJib29sZWFuIiE9ciYmbnVsbCE9dCYmIU10KHQpKXx8R3QudGVzdCh0KXx8IXp0LnRlc3QodCl8fG51bGwhPWUmJnQgaW4gT2JqZWN0KGUpfSh0LGUpP1t0XTp3ZShmdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD8iIjpCZSh0KX0odCkpfXZhciBSZT0xLzA7ZnVuY3Rpb24gRmUodCl7aWYoInN0cmluZyI9PXR5cGVvZiB0fHxNdCh0KSlyZXR1cm4gdDt2YXIgZT10KyIiO3JldHVybiIwIj09ZSYmMS90PT0tUmU/Ii0wIjplfWZ1bmN0aW9uIFBlKHQsZSxyKXt2YXIgaT1udWxsPT10P3ZvaWQgMDpmdW5jdGlvbih0LGUpe2Zvcih2YXIgcj0wLGk9KGU9Q2UoZSx0KSkubGVuZ3RoO251bGwhPXQmJnI8aTspdD10W0ZlKGVbcisrXSldO3JldHVybiByJiZyPT1pP3Q6dm9pZCAwfSh0LGUpO3JldHVybiB2b2lkIDA9PT1pP3I6aX12YXIgTmU9IltvYmplY3QgTnVtYmVyXSI7ZnVuY3Rpb24gSWUodCl7cmV0dXJuIltvYmplY3QgU3RyaW5nXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9ZnVuY3Rpb24geGUodCl7cmV0dXJuISghSWUodCl8fCIiPT09dCl9ZnVuY3Rpb24gcWUodCl7cmV0dXJuIltvYmplY3QgQXJyYXldIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiBMZSh0KXtyZXR1cm4iW29iamVjdCBVbmRlZmluZWRdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiAkZSh0KXtyZXR1cm4iW29iamVjdCBPYmplY3RdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiBVZSh0KXtyZXR1cm4hKCFJZSh0KXx8IiIhPT10KX1mdW5jdGlvbiBNZSh0KXtyZXR1cm4hIUxlKHQpfHwoISFmdW5jdGlvbih0KXtyZXR1cm4iW29iamVjdCBOdWxsXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9KHQpfHwoISFmdW5jdGlvbih0KXtpZigkZSh0KSl7Zm9yKGxldCBlIGluIHQpcmV0dXJuITE7cmV0dXJuITB9cmV0dXJuITF9KHQpfHwoISFVZSh0KXx8KCEhZnVuY3Rpb24odCl7cmV0dXJuISFxZSh0KSYmMD09PXQubGVuZ3RofSh0KXx8ISFmdW5jdGlvbih0KXtyZXR1cm4gdCE9dH0odCkpKSkpfWZ1bmN0aW9uIHplKCl7bGV0IHQsZSxyPW5ldyBQcm9taXNlKChmdW5jdGlvbigpe3Q9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdfSkpO3JldHVybiByLnJlc29sdmU9dCxyLnJlamVjdD1lLHJ9bGV0IFdKc29uU3RyZWFtPXtwYXJzZTphc3luYyBmdW5jdGlvbih0KXtpZigheGUodCkpcmV0dXJue307bGV0IGU9e307dHJ5e2U9SlNPTi5wYXJzZSh0KX1jYXRjaCh0KXtlPXt9fXJldHVybiBlfSxwYXJzZUJ5U3RyZWFtOmZ1bmN0aW9uKHQpe2xldCBlPXt9O2lmKCJudWxsIj09PXQpcmV0dXJuIG51bGw7aWYoIiI9PT10KXJldHVybnt9O2xldCByPSJfX3N5c3RlbV9fIixpPWB7IiR7cn0iOiR7dH19YCxuPXplKCkscz1nKGkpLG89Y3QucGFyc2UoIiQqIik7cmV0dXJuIG8ub24oImRhdGEiLChmdW5jdGlvbih0KXtlW3Qua2V5XT10LnZhbHVlfSkpLG8ub24oImVuZCIsKGZ1bmN0aW9uKCl7bGV0IHQ9UGUoZSxyKTtuLnJlc29sdmUodCl9KSksby5vbigiZXJyb3IiLChmdW5jdGlvbih0KXtuLnJlamVjdCh0KX0pKSxzLnBpcGUobyksbn0sY3JlYXRlUGFyc2VTdHJlYW06ZnVuY3Rpb24odCl7dmFyIGU7cmV0dXJuIXhlKHQpJiYoIXFlKGU9dCl8fDA9PT1lLmxlbmd0aHx8MT09PWUubGVuZ3RoJiZNZShlWzBdKSkmJih0PSIkKiIpLGN0LnBhcnNlKHQpfSxzdHJpbmdpZnk6YXN5bmMgZnVuY3Rpb24odCl7aWYoTGUodCkpcmV0dXJuIiI7bGV0IGU9IiI7dHJ5e2U9SlNPTi5zdHJpbmdpZnkodCl9Y2F0Y2godCl7ZT0iIn1yZXR1cm4gZX0sc3RyaW5naWZ5QnlTdHJlYW06ZnVuY3Rpb24odCl7bGV0IGU9IiI7aWYoTGUodCkpcmV0dXJuIiI7aWYobnVsbD09PXQpcmV0dXJuIm51bGwiO2lmKFVlKHQpKXJldHVybiciIic7aWYoIm51bWJlciI9PXR5cGVvZihyPXQpfHwkdChyKSYmTHQocik9PU5lKXJldHVybmAke3R9YDt2YXIgcjtpZihJZSh0KSlyZXR1cm5gIiR7dH0iYDtsZXQgaT16ZSgpLG49bmV3IGp0KHQsbnVsbCxudWxsLCExKTtyZXR1cm4gbi5vbigiZGF0YSIsKGZ1bmN0aW9uKHQpe2UrPXR9KSksbi5vbigiZW5kIiwoZnVuY3Rpb24oKXtpLnJlc29sdmUoZSl9KSksbi5vbigiZXJyb3IiLChmdW5jdGlvbih0KXtpLnJlamVjdCh0KX0pKSxpfSxjcmVhdGVTdHJpbmdpZnlTdHJlYW06ZnVuY3Rpb24odCl7aWYoISRlKHQpJiYhcWUodCkpdGhyb3cgbmV3IEVycm9yKCJkYXRhIGlzIG5vdCBvYmplY3Qgb3IgYXJyYXkiKTtyZXR1cm4gbmV3IGp0KHQsbnVsbCxudWxsLCExKX19OwoKbGV0IGluc3RhbmNlID0gbnVsbApmdW5jdGlvbiBpbml0KGlucHV0KXsKCiAgICAvL2luaXQKICAgIGxldCByCiAgICAKICAgICAgICByID0gV0pzb25TdHJlYW0oLi4uaW5wdXQpCiAgICAgICAgCgogICAgLy9vbgogICAgCgogICAgLy9zYXZlCiAgICBpbnN0YW5jZSA9IHIKCn0KCmZ1bmN0aW9uIHNlbmRNZXNzYWdlKGRhdGEpIHsKICAgIAogICAgICAgIHBhcmVudFBvcnQucG9zdE1lc3NhZ2UoZGF0YSkKICAgICAgICAKfQoKYXN5bmMgZnVuY3Rpb24gcnVuKGRhdGEpIHsKICAgIC8vIGNvbnNvbGUubG9nKCdpbm5lciB3b3JrZXIgcnVuJyxkYXRhKQoKICAgIC8vbW9kZQogICAgbGV0IG1vZGUgPSBkYXRhLm1vZGUKCiAgICAvL2NoZWNrCiAgICBpZihtb2RlICE9PSAnaW5pdCcgJiYgbW9kZSAhPT0gJ2NhbGwnKXsKICAgICAgICByZXR1cm4KICAgIH0KCiAgICAvL2luaXQKICAgIGlmKG1vZGUgPT09ICdpbml0Jyl7CiAgICAgICAgCiAgICAgICAgdHJ5ewoKICAgICAgICAgICAgLy90eXBlCiAgICAgICAgICAgIGxldCB0eXBlID0gZGF0YS50eXBlCgogICAgICAgICAgICAvL2lucHV0CiAgICAgICAgICAgIGxldCBpbnB1dCA9IGRhdGEuaW5wdXQKICAgIAogICAgICAgICAgICAvL2luc3RhbmNlCiAgICAgICAgICAgIGlmKHR5cGUgPT09ICdmdW5jdGlvbicpewogICAgICAgICAgICAgICAgaW5pdCguLi5pbnB1dCkKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmKHR5cGUgPT09ICdvYmplY3QnKXsKICAgICAgICAgICAgICAgIGluc3RhbmNlID0gV0pzb25TdHJlYW0KICAgICAgICAgICAgfQoKICAgICAgICB9CiAgICAgICAgY2F0Y2goZXJyKXsKICAgICAgICAKICAgICAgICAgICAgLy9zZW5kTWVzc2FnZQogICAgICAgICAgICBsZXQgcmVzID0gewogICAgICAgICAgICAgICAgbW9kZTogJ2VtaXQnLAogICAgICAgICAgICAgICAgZXZOYW1lOiAnZXJyb3InLAogICAgICAgICAgICAgICAgbXNnOiBlcnIsCiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2VuZE1lc3NhZ2UocmVzKQoKICAgICAgICB9CiAgICAgICAgICAgIAogICAgfQoKICAgIC8vY2hlY2sKICAgIGlmKG1vZGUgPT09ICdjYWxsJyl7CiAgICAgICAgbGV0IHN0YXRlID0gJycKICAgICAgICBsZXQgbXNnID0gbnVsbAoKICAgICAgICB0cnl7CgogICAgICAgICAgICAvL2Z1bgogICAgICAgICAgICBsZXQgZnVuID0gaW5zdGFuY2VbZGF0YS5mdW5dCgogICAgICAgICAgICAvL2lucHV0CiAgICAgICAgICAgIGxldCBpbnB1dCA9IGRhdGEuaW5wdXQKCiAgICAgICAgICAgIC8vZXhlYwogICAgICAgICAgICBhd2FpdCBmdW4oLi4uaW5wdXQpCiAgICAgICAgICAgICAgICAudGhlbigoc3VjKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGU9J3N1Y2Nlc3MnCiAgICAgICAgICAgICAgICAgICAgbXNnPXN1YwogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgIC5jYXRjaCgoZXJyKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGU9J2Vycm9yJwogICAgICAgICAgICAgICAgICAgIG1zZz1lcnIKICAgICAgICAgICAgICAgIH0pCgogICAgICAgIH0KICAgICAgICBjYXRjaChlcnIpewogICAgICAgICAgICBzdGF0ZSA9ICdlcnJvcicKICAgICAgICAgICAgbXNnID0gZXJyCiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vc2VuZE1lc3NhZ2UKICAgICAgICBsZXQgcmVzID0gewogICAgICAgICAgICBtb2RlOiAncmV0dXJuJywKICAgICAgICAgICAgaWQ6IGRhdGEuaWQsCiAgICAgICAgICAgIGZ1bjogZGF0YS5mdW4sCiAgICAgICAgICAgIHN0YXRlLAogICAgICAgICAgICBtc2csCiAgICAgICAgfQogICAgICAgIHNlbmRNZXNzYWdlKHJlcykKCiAgICB9Cgp9CgpmdW5jdGlvbiByZWN2TWVzc2FnZShkYXRhKSB7CiAgICAvLyBjb25zb2xlLmxvZygnaW5uZXIgd29ya2VyIHJlY3Y6JywgZGF0YSkKCiAgICAvL2RhdGFSZWN2CiAgICBsZXQgZGF0YVJlY3YgPSBkYXRhCgogICAgLy9ydW4KICAgIHJ1bihkYXRhUmVjdikKCn0KCgogICAgICAgIHBhcmVudFBvcnQub24oJ21lc3NhZ2UnLCByZWN2TWVzc2FnZSkKICAgICAgICAKCnRyeXsKICAgIHByb2Nlc3Mub24oJ3VuaGFuZGxlZFJlamVjdGlvbicsIChlcnIpID0+IHsKICAgICAgICBjb25zb2xlLmxvZygnaW5uZXI6dW5oYW5kbGVkUmVqZWN0aW9uJywgZXJyKQogICAgfSkKICAgIHByb2Nlc3Mub24oJ3VuY2F1Z2h0RXhjZXB0aW9uJywgKGVycikgPT4gewogICAgICAgIGNvbnNvbGUubG9nKCdpbm5lcjp1bmNhdWdodEV4Y2VwdGlvbicsIGVycikKICAgIH0pCiAgICBwcm9jZXNzLm9uKCd1bmNhdWdodEV4Y2VwdGlvbk1vbml0b3InLCAoZXJyKSA9PiB7CiAgICAgICAgY29uc29sZS5sb2coJ2lubmVyOnVuY2F1Z2h0RXhjZXB0aW9uTW9uaXRvcicsIGVycikKICAgIH0pCn0KY2F0Y2goZXJyKXt9Cgo=",Buffer.from(X,"base64").toString("utf8"));var X;function W(){let d=Z(),m=function(Z){try{return new l.Worker(Z,{eval:!0})}catch(l){X(l)}}(b);if(!m)return X("invalid worker"),null;function X(l){d.emit("error",l)}return m.on("message",(function(l){let Z=l,m=Z.mode;"emit"!==m&&"return"!==m||("emit"===m&&d.emit(Z.evName,Z.msg),"return"===m&&d.emit(Z.id,Z))})),m.on("error",X),m.on("exit",(l=>{1!==l&&X("exit code["+l+"] !== 1")})),function(){let l={mode:"init",type:"object",input:[...arguments]};m.postMessage(l)}([...arguments]),d.stringify=function(){let l=c(),Z=G(),b={mode:"call",id:Z,fun:"stringify",input:[...arguments]};return m.postMessage(b),d.once(Z,(Z=>{"success"===Z.state?l.resolve(Z.msg):l.reject(Z.msg)})),l},d.parse=function(){let l=c(),Z=G(),b={mode:"call",id:Z,fun:"parse",input:[...arguments]};return m.postMessage(b),d.once(Z,(Z=>{"success"===Z.state?l.resolve(Z.msg):l.reject(Z.msg)})),l},d.terminate=function(){m?(m.terminate(),m=void 0):X("worker has been terminated")},d}let I={stringify:async function(){let l=[...arguments],Z=W();return await Z.stringify(...l).finally((()=>{Z.terminate()}))},parse:async function(){let l=[...arguments],Z=W();return await Z.parse(...l).finally((()=>{Z.terminate()}))}};m=Z();for(let l in I){let Z=I[l];m[l]=Z}}();try{process.on("unhandledRejection",(l=>{console.log("outer:unhandledRejection",l)})),process.on("uncaughtException",(l=>{console.log("outer:uncaughtException",l)})),process.on("uncaughtExceptionMonitor",(l=>{console.log("outer:uncaughtExceptionMonitor",l)}))}catch(l){}return m}(l)}({get exports(){return Z},set exports(l){Z=l}});var d=Z,m={};!function(l,Z){l.exports=function(){const l="function"==typeof TextDecoder?new TextDecoder("utf-8",{ignoreBOM:!0}):void 0,Z=("function"==typeof TextEncoder&&new TextEncoder,Array.prototype.slice.call("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=")),d=(l=>{let Z={};return l.forEach(((l,d)=>Z[l]=d)),Z})(Z),m=/^(?:[A-Za-z\d+\/]{4})*?(?:[A-Za-z\d+\/]{2}(?:==)?|[A-Za-z\d+\/]{3}=?)?$/,c=String.fromCharCode.bind(String),G="function"==typeof Uint8Array.from?Uint8Array.from.bind(Uint8Array):l=>new Uint8Array(Array.prototype.slice.call(l,0)),b=l=>l.replace(/[^A-Za-z0-9\+\/]/g,""),X=/[\xC0-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF7][\x80-\xBF]{3}/g,W=l=>{switch(l.length){case 4:var Z=((7&l.charCodeAt(0))<<18|(63&l.charCodeAt(1))<<12|(63&l.charCodeAt(2))<<6|63&l.charCodeAt(3))-65536;return c(55296+(Z>>>10))+c(56320+(1023&Z));case 3:return c((15&l.charCodeAt(0))<<12|(63&l.charCodeAt(1))<<6|63&l.charCodeAt(2));default:return c((31&l.charCodeAt(0))<<6|63&l.charCodeAt(1))}},I=l=>l.replace(X,W),p=l=>{if(l=l.replace(/\s+/g,""),!m.test(l))throw new TypeError("malformed base64.");let Z,G,b;l+="==".slice(2-(3&l.length));let X=[];for(let m=0;m<l.length;)Z=d[l.charAt(m++)]<<18|d[l.charAt(m++)]<<12|(G=d[l.charAt(m++)])<<6|(b=d[l.charAt(m++)]),64===G?X.push(c(Z>>16&255)):64===b?X.push(c(Z>>16&255,Z>>8&255)):X.push(c(Z>>16&255,Z>>8&255,255&Z));return X.join("")},u="function"==typeof atob?l=>atob(b(l)):p,i="function"==typeof Uint8Array.fromBase64?l=>Uint8Array.fromBase64(l):l=>G(u(l).split("").map((l=>l.charCodeAt(0)))),y=l?Z=>l.decode(i(Z)):l=>I(u(l)),V=l=>b(l.replace(/[-_]/g,(l=>"-"==l?"+":"/"))),h=l=>y(V(l)),a=h;var K={};!function(l){var Z=Object.prototype.hasOwnProperty,d="~";function m(){}function c(l,Z,d){this.fn=l,this.context=Z,this.once=d||!1}function G(l,Z,m,G,b){if("function"!=typeof m)throw new TypeError("The listener must be a function");var X=new c(m,G||l,b),W=d?d+Z:Z;return l._events[W]?l._events[W].fn?l._events[W]=[l._events[W],X]:l._events[W].push(X):(l._events[W]=X,l._eventsCount++),l}function b(l,Z){0==--l._eventsCount?l._events=new m:delete l._events[Z]}function X(){this._events=new m,this._eventsCount=0}Object.create&&(m.prototype=Object.create(null),(new m).__proto__||(d=!1)),X.prototype.eventNames=function(){var l,m,c=[];if(0===this._eventsCount)return c;for(m in l=this._events)Z.call(l,m)&&c.push(d?m.slice(1):m);return Object.getOwnPropertySymbols?c.concat(Object.getOwnPropertySymbols(l)):c},X.prototype.listeners=function(l){var Z=d?d+l:l,m=this._events[Z];if(!m)return[];if(m.fn)return[m.fn];for(var c=0,G=m.length,b=new Array(G);c<G;c++)b[c]=m[c].fn;return b},X.prototype.listenerCount=function(l){var Z=d?d+l:l,m=this._events[Z];return m?m.fn?1:m.length:0},X.prototype.emit=function(l,Z,m,c,G,b){var X=d?d+l:l;if(!this._events[X])return!1;var W,I,p=this._events[X],u=arguments.length;if(p.fn){switch(p.once&&this.removeListener(l,p.fn,void 0,!0),u){case 1:return p.fn.call(p.context),!0;case 2:return p.fn.call(p.context,Z),!0;case 3:return p.fn.call(p.context,Z,m),!0;case 4:return p.fn.call(p.context,Z,m,c),!0;case 5:return p.fn.call(p.context,Z,m,c,G),!0;case 6:return p.fn.call(p.context,Z,m,c,G,b),!0}for(I=1,W=new Array(u-1);I<u;I++)W[I-1]=arguments[I];p.fn.apply(p.context,W)}else{var i,y=p.length;for(I=0;I<y;I++)switch(p[I].once&&this.removeListener(l,p[I].fn,void 0,!0),u){case 1:p[I].fn.call(p[I].context);break;case 2:p[I].fn.call(p[I].context,Z);break;case 3:p[I].fn.call(p[I].context,Z,m);break;case 4:p[I].fn.call(p[I].context,Z,m,c);break;default:if(!W)for(i=1,W=new Array(u-1);i<u;i++)W[i-1]=arguments[i];p[I].fn.apply(p[I].context,W)}}return!0},X.prototype.on=function(l,Z,d){return G(this,l,Z,d,!1)},X.prototype.once=function(l,Z,d){return G(this,l,Z,d,!0)},X.prototype.removeListener=function(l,Z,m,c){var G=d?d+l:l;if(!this._events[G])return this;if(!Z)return b(this,G),this;var X=this._events[G];if(X.fn)X.fn!==Z||c&&!X.once||m&&X.context!==m||b(this,G);else{for(var W=0,I=[],p=X.length;W<p;W++)(X[W].fn!==Z||c&&!X[W].once||m&&X[W].context!==m)&&I.push(X[W]);I.length?this._events[G]=1===I.length?I[0]:I:b(this,G)}return this},X.prototype.removeAllListeners=function(l){var Z;return l?(Z=d?d+l:l,this._events[Z]&&b(this,Z)):(this._events=new m,this._eventsCount=0),this},X.prototype.off=X.prototype.removeListener,X.prototype.addListener=X.prototype.on,X.prefixed=d,X.EventEmitter=X,l.exports=X}({get exports(){return K},set exports(l){K=l}});var Y=K;let R;!function(){if("browser"!=("undefined"!=typeof window&&void 0!==window.document?"browser":"nodejs"))return null;function l(){return new Y}function Z(){let l,Z,d=new Promise((function(){l=arguments[0],Z=arguments[1]}));return d.resolve=l,d.reject=Z,d}function d(){let l=arguments.length>0&&void 0!==arguments[0]?arguments[0]:10,Z=[],d="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""),m=d.length;for(let c=0;c<l;c++)Z[c]=d[0|Math.random()*m];return Z.join("")}let m=a("CgoKInVzZSBzdHJpY3QiO2Z1bmN0aW9uIHQoKXt9ZnVuY3Rpb24gZSgpe2UuaW5pdC5jYWxsKHRoaXMpfWZ1bmN0aW9uIHIodCl7cmV0dXJuIHZvaWQgMD09PXQuX21heExpc3RlbmVycz9lLmRlZmF1bHRNYXhMaXN0ZW5lcnM6dC5fbWF4TGlzdGVuZXJzfWZ1bmN0aW9uIG4oZSxuLGksbyl7dmFyIHMsYSx1LGg7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGkpdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3RlbmVyIiBhcmd1bWVudCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtpZigoYT1lLl9ldmVudHMpPyhhLm5ld0xpc3RlbmVyJiYoZS5lbWl0KCJuZXdMaXN0ZW5lciIsbixpLmxpc3RlbmVyP2kubGlzdGVuZXI6aSksYT1lLl9ldmVudHMpLHU9YVtuXSk6KGE9ZS5fZXZlbnRzPW5ldyB0LGUuX2V2ZW50c0NvdW50PTApLHUpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB1P3U9YVtuXT1vP1tpLHVdOlt1LGldOm8/dS51bnNoaWZ0KGkpOnUucHVzaChpKSwhdS53YXJuZWQmJihzPXIoZSkpJiZzPjAmJnUubGVuZ3RoPnMpe3Uud2FybmVkPSEwO3ZhciBmPW5ldyBFcnJvcigiUG9zc2libGUgRXZlbnRFbWl0dGVyIG1lbW9yeSBsZWFrIGRldGVjdGVkLiAiK3UubGVuZ3RoKyIgIituKyIgbGlzdGVuZXJzIGFkZGVkLiBVc2UgZW1pdHRlci5zZXRNYXhMaXN0ZW5lcnMoKSB0byBpbmNyZWFzZSBsaW1pdCIpO2YubmFtZT0iTWF4TGlzdGVuZXJzRXhjZWVkZWRXYXJuaW5nIixmLmVtaXR0ZXI9ZSxmLnR5cGU9bixmLmNvdW50PXUubGVuZ3RoLGg9ZiwiZnVuY3Rpb24iPT10eXBlb2YgY29uc29sZS53YXJuP2NvbnNvbGUud2FybihoKTpjb25zb2xlLmxvZyhoKX19ZWxzZSB1PWFbbl09aSwrK2UuX2V2ZW50c0NvdW50O3JldHVybiBlfWZ1bmN0aW9uIGkodCxlLHIpe3ZhciBuPSExO2Z1bmN0aW9uIGkoKXt0LnJlbW92ZUxpc3RlbmVyKGUsaSksbnx8KG49ITAsci5hcHBseSh0LGFyZ3VtZW50cykpfXJldHVybiBpLmxpc3RlbmVyPXIsaX1mdW5jdGlvbiBvKHQpe3ZhciBlPXRoaXMuX2V2ZW50cztpZihlKXt2YXIgcj1lW3RdO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiByKXJldHVybiAxO2lmKHIpcmV0dXJuIHIubGVuZ3RofXJldHVybiAwfWZ1bmN0aW9uIHModCxlKXtmb3IodmFyIHI9bmV3IEFycmF5KGUpO2UtLTspcltlXT10W2VdO3JldHVybiByfXQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobnVsbCksZS5FdmVudEVtaXR0ZXI9ZSxlLnVzaW5nRG9tYWlucz0hMSxlLnByb3RvdHlwZS5kb21haW49dm9pZCAwLGUucHJvdG90eXBlLl9ldmVudHM9dm9pZCAwLGUucHJvdG90eXBlLl9tYXhMaXN0ZW5lcnM9dm9pZCAwLGUuZGVmYXVsdE1heExpc3RlbmVycz0xMCxlLmluaXQ9ZnVuY3Rpb24oKXt0aGlzLmRvbWFpbj1udWxsLGUudXNpbmdEb21haW5zJiZ1bmRlZmluZWQuYWN0aXZlLHRoaXMuX2V2ZW50cyYmdGhpcy5fZXZlbnRzIT09T2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpLl9ldmVudHN8fCh0aGlzLl9ldmVudHM9bmV3IHQsdGhpcy5fZXZlbnRzQ291bnQ9MCksdGhpcy5fbWF4TGlzdGVuZXJzPXRoaXMuX21heExpc3RlbmVyc3x8dm9pZCAwfSxlLnByb3RvdHlwZS5zZXRNYXhMaXN0ZW5lcnM9ZnVuY3Rpb24odCl7aWYoIm51bWJlciIhPXR5cGVvZiB0fHx0PDB8fGlzTmFOKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJuIiBhcmd1bWVudCBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyJyk7cmV0dXJuIHRoaXMuX21heExpc3RlbmVycz10LHRoaXN9LGUucHJvdG90eXBlLmdldE1heExpc3RlbmVycz1mdW5jdGlvbigpe3JldHVybiByKHRoaXMpfSxlLnByb3RvdHlwZS5lbWl0PWZ1bmN0aW9uKHQpe3ZhciBlLHIsbixpLG8sYSx1LGg9ImVycm9yIj09PXQ7aWYoYT10aGlzLl9ldmVudHMpaD1oJiZudWxsPT1hLmVycm9yO2Vsc2UgaWYoIWgpcmV0dXJuITE7aWYodT10aGlzLmRvbWFpbixoKXtpZihlPWFyZ3VtZW50c1sxXSwhdSl7aWYoZSBpbnN0YW5jZW9mIEVycm9yKXRocm93IGU7dmFyIGY9bmV3IEVycm9yKCdVbmNhdWdodCwgdW5zcGVjaWZpZWQgImVycm9yIiBldmVudC4gKCcrZSsiKSIpO3Rocm93IGYuY29udGV4dD1lLGZ9cmV0dXJuIGV8fChlPW5ldyBFcnJvcignVW5jYXVnaHQsIHVuc3BlY2lmaWVkICJlcnJvciIgZXZlbnQnKSksZS5kb21haW5FbWl0dGVyPXRoaXMsZS5kb21haW49dSxlLmRvbWFpblRocm93bj0hMSx1LmVtaXQoImVycm9yIixlKSwhMX1pZighKHI9YVt0XSkpcmV0dXJuITE7dmFyIGM9ImZ1bmN0aW9uIj09dHlwZW9mIHI7c3dpdGNoKG49YXJndW1lbnRzLmxlbmd0aCl7Y2FzZSAxOiFmdW5jdGlvbih0LGUscil7aWYoZSl0LmNhbGwocik7ZWxzZSBmb3IodmFyIG49dC5sZW5ndGgsaT1zKHQsbiksbz0wO288bjsrK28paVtvXS5jYWxsKHIpfShyLGMsdGhpcyk7YnJlYWs7Y2FzZSAyOiFmdW5jdGlvbih0LGUscixuKXtpZihlKXQuY2FsbChyLG4pO2Vsc2UgZm9yKHZhciBpPXQubGVuZ3RoLG89cyh0LGkpLGE9MDthPGk7KythKW9bYV0uY2FsbChyLG4pfShyLGMsdGhpcyxhcmd1bWVudHNbMV0pO2JyZWFrO2Nhc2UgMzohZnVuY3Rpb24odCxlLHIsbixpKXtpZihlKXQuY2FsbChyLG4saSk7ZWxzZSBmb3IodmFyIG89dC5sZW5ndGgsYT1zKHQsbyksdT0wO3U8bzsrK3UpYVt1XS5jYWxsKHIsbixpKX0ocixjLHRoaXMsYXJndW1lbnRzWzFdLGFyZ3VtZW50c1syXSk7YnJlYWs7Y2FzZSA0OiFmdW5jdGlvbih0LGUscixuLGksbyl7aWYoZSl0LmNhbGwocixuLGksbyk7ZWxzZSBmb3IodmFyIGE9dC5sZW5ndGgsdT1zKHQsYSksaD0wO2g8YTsrK2gpdVtoXS5jYWxsKHIsbixpLG8pfShyLGMsdGhpcyxhcmd1bWVudHNbMV0sYXJndW1lbnRzWzJdLGFyZ3VtZW50c1szXSk7YnJlYWs7ZGVmYXVsdDpmb3IoaT1uZXcgQXJyYXkobi0xKSxvPTE7bzxuO28rKylpW28tMV09YXJndW1lbnRzW29dOyFmdW5jdGlvbih0LGUscixuKXtpZihlKXQuYXBwbHkocixuKTtlbHNlIGZvcih2YXIgaT10Lmxlbmd0aCxvPXModCxpKSxhPTA7YTxpOysrYSlvW2FdLmFwcGx5KHIsbil9KHIsYyx0aGlzLGkpfXJldHVybiEwfSxlLnByb3RvdHlwZS5hZGRMaXN0ZW5lcj1mdW5jdGlvbih0LGUpe3JldHVybiBuKHRoaXMsdCxlLCExKX0sZS5wcm90b3R5cGUub249ZS5wcm90b3R5cGUuYWRkTGlzdGVuZXIsZS5wcm90b3R5cGUucHJlcGVuZExpc3RlbmVyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4odGhpcyx0LGUsITApfSxlLnByb3RvdHlwZS5vbmNlPWZ1bmN0aW9uKHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3RlbmVyIiBhcmd1bWVudCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtyZXR1cm4gdGhpcy5vbih0LGkodGhpcyx0LGUpKSx0aGlzfSxlLnByb3RvdHlwZS5wcmVwZW5kT25jZUxpc3RlbmVyPWZ1bmN0aW9uKHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3RlbmVyIiBhcmd1bWVudCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtyZXR1cm4gdGhpcy5wcmVwZW5kTGlzdGVuZXIodCxpKHRoaXMsdCxlKSksdGhpc30sZS5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXI9ZnVuY3Rpb24oZSxyKXt2YXIgbixpLG8scyxhO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiByKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0ZW5lciIgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7aWYoIShpPXRoaXMuX2V2ZW50cykpcmV0dXJuIHRoaXM7aWYoIShuPWlbZV0pKXJldHVybiB0aGlzO2lmKG49PT1yfHxuLmxpc3RlbmVyJiZuLmxpc3RlbmVyPT09cikwPT0tLXRoaXMuX2V2ZW50c0NvdW50P3RoaXMuX2V2ZW50cz1uZXcgdDooZGVsZXRlIGlbZV0saS5yZW1vdmVMaXN0ZW5lciYmdGhpcy5lbWl0KCJyZW1vdmVMaXN0ZW5lciIsZSxuLmxpc3RlbmVyfHxyKSk7ZWxzZSBpZigiZnVuY3Rpb24iIT10eXBlb2Ygbil7Zm9yKG89LTEscz1uLmxlbmd0aDtzLS0gPjA7KWlmKG5bc109PT1yfHxuW3NdLmxpc3RlbmVyJiZuW3NdLmxpc3RlbmVyPT09cil7YT1uW3NdLmxpc3RlbmVyLG89czticmVha31pZihvPDApcmV0dXJuIHRoaXM7aWYoMT09PW4ubGVuZ3RoKXtpZihuWzBdPXZvaWQgMCwwPT0tLXRoaXMuX2V2ZW50c0NvdW50KXJldHVybiB0aGlzLl9ldmVudHM9bmV3IHQsdGhpcztkZWxldGUgaVtlXX1lbHNlIWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPWUsbj1yKzEsaT10Lmxlbmd0aDtuPGk7cis9MSxuKz0xKXRbcl09dFtuXTt0LnBvcCgpfShuLG8pO2kucmVtb3ZlTGlzdGVuZXImJnRoaXMuZW1pdCgicmVtb3ZlTGlzdGVuZXIiLGUsYXx8cil9cmV0dXJuIHRoaXN9LGUucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycz1mdW5jdGlvbihlKXt2YXIgcixuO2lmKCEobj10aGlzLl9ldmVudHMpKXJldHVybiB0aGlzO2lmKCFuLnJlbW92ZUxpc3RlbmVyKXJldHVybiAwPT09YXJndW1lbnRzLmxlbmd0aD8odGhpcy5fZXZlbnRzPW5ldyB0LHRoaXMuX2V2ZW50c0NvdW50PTApOm5bZV0mJigwPT0tLXRoaXMuX2V2ZW50c0NvdW50P3RoaXMuX2V2ZW50cz1uZXcgdDpkZWxldGUgbltlXSksdGhpcztpZigwPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKHZhciBpLG89T2JqZWN0LmtleXMobikscz0wO3M8by5sZW5ndGg7KytzKSJyZW1vdmVMaXN0ZW5lciIhPT0oaT1vW3NdKSYmdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoaSk7cmV0dXJuIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCJyZW1vdmVMaXN0ZW5lciIpLHRoaXMuX2V2ZW50cz1uZXcgdCx0aGlzLl9ldmVudHNDb3VudD0wLHRoaXN9aWYoImZ1bmN0aW9uIj09dHlwZW9mKHI9bltlXSkpdGhpcy5yZW1vdmVMaXN0ZW5lcihlLHIpO2Vsc2UgaWYocilkb3t0aGlzLnJlbW92ZUxpc3RlbmVyKGUscltyLmxlbmd0aC0xXSl9d2hpbGUoclswXSk7cmV0dXJuIHRoaXN9LGUucHJvdG90eXBlLmxpc3RlbmVycz1mdW5jdGlvbih0KXt2YXIgZSxyPXRoaXMuX2V2ZW50cztyZXR1cm4gciYmKGU9clt0XSk/ImZ1bmN0aW9uIj09dHlwZW9mIGU/W2UubGlzdGVuZXJ8fGVdOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgQXJyYXkodC5sZW5ndGgpLHI9MDtyPGUubGVuZ3RoOysrcillW3JdPXRbcl0ubGlzdGVuZXJ8fHRbcl07cmV0dXJuIGV9KGUpOltdfSxlLmxpc3RlbmVyQ291bnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdC5saXN0ZW5lckNvdW50P3QubGlzdGVuZXJDb3VudChlKTpvLmNhbGwodCxlKX0sZS5wcm90b3R5cGUubGlzdGVuZXJDb3VudD1vLGUucHJvdG90eXBlLmV2ZW50TmFtZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZXZlbnRzQ291bnQ+MD9SZWZsZWN0Lm93bktleXModGhpcy5fZXZlbnRzKTpbXX07dmFyIGE9InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWw/Z2xvYmFsOiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZj9zZWxmOiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzp7fSx1PVtdLGg9W10sZj0idW5kZWZpbmVkIiE9dHlwZW9mIFVpbnQ4QXJyYXk/VWludDhBcnJheTpBcnJheSxjPSExO2Z1bmN0aW9uIGwoKXtjPSEwO2Zvcih2YXIgdD0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyIsZT0wLHI9dC5sZW5ndGg7ZTxyOysrZSl1W2VdPXRbZV0saFt0LmNoYXJDb2RlQXQoZSldPWU7aFsiLSIuY2hhckNvZGVBdCgwKV09NjIsaFsiXyIuY2hhckNvZGVBdCgwKV09NjN9ZnVuY3Rpb24gcCh0LGUscil7Zm9yKHZhciBuLGksbz1bXSxzPWU7czxyO3MrPTMpbj0odFtzXTw8MTYpKyh0W3MrMV08PDgpK3RbcysyXSxvLnB1c2godVsoaT1uKT4+MTgmNjNdK3VbaT4+MTImNjNdK3VbaT4+NiY2M10rdVs2MyZpXSk7cmV0dXJuIG8uam9pbigiIil9ZnVuY3Rpb24gZCh0KXt2YXIgZTtjfHxsKCk7Zm9yKHZhciByPXQubGVuZ3RoLG49ciUzLGk9IiIsbz1bXSxzPTE2MzgzLGE9MCxoPXItbjthPGg7YSs9cylvLnB1c2gocCh0LGEsYStzPmg/aDphK3MpKTtyZXR1cm4gMT09PW4/KGU9dFtyLTFdLGkrPXVbZT4+Ml0saSs9dVtlPDw0JjYzXSxpKz0iPT0iKToyPT09biYmKGU9KHRbci0yXTw8OCkrdFtyLTFdLGkrPXVbZT4+MTBdLGkrPXVbZT4+NCY2M10saSs9dVtlPDwyJjYzXSxpKz0iPSIpLG8ucHVzaChpKSxvLmpvaW4oIiIpfWZ1bmN0aW9uIGcodCxlLHIsbixpKXt2YXIgbyxzLGE9OCppLW4tMSx1PSgxPDxhKS0xLGg9dT4+MSxmPS03LGM9cj9pLTE6MCxsPXI/LTE6MSxwPXRbZStjXTtmb3IoYys9bCxvPXAmKDE8PC1mKS0xLHA+Pj0tZixmKz1hO2Y+MDtvPTI1NipvK3RbZStjXSxjKz1sLGYtPTgpO2ZvcihzPW8mKDE8PC1mKS0xLG8+Pj0tZixmKz1uO2Y+MDtzPTI1NipzK3RbZStjXSxjKz1sLGYtPTgpO2lmKDA9PT1vKW89MS1oO2Vsc2V7aWYobz09PXUpcmV0dXJuIHM/TmFOOjEvMCoocD8tMToxKTtzKz1NYXRoLnBvdygyLG4pLG8tPWh9cmV0dXJuKHA/LTE6MSkqcypNYXRoLnBvdygyLG8tbil9ZnVuY3Rpb24geSh0LGUscixuLGksbyl7dmFyIHMsYSx1LGg9OCpvLWktMSxmPSgxPDxoKS0xLGM9Zj4+MSxsPTIzPT09aT9NYXRoLnBvdygyLC0yNCktTWF0aC5wb3coMiwtNzcpOjAscD1uPzA6by0xLGQ9bj8xOi0xLGc9ZTwwfHwwPT09ZSYmMS9lPDA/MTowO2ZvcihlPU1hdGguYWJzKGUpLGlzTmFOKGUpfHxlPT09MS8wPyhhPWlzTmFOKGUpPzE6MCxzPWYpOihzPU1hdGguZmxvb3IoTWF0aC5sb2coZSkvTWF0aC5MTjIpLGUqKHU9TWF0aC5wb3coMiwtcykpPDEmJihzLS0sdSo9MiksKGUrPXMrYz49MT9sL3U6bCpNYXRoLnBvdygyLDEtYykpKnU+PTImJihzKyssdS89MikscytjPj1mPyhhPTAscz1mKTpzK2M+PTE/KGE9KGUqdS0xKSpNYXRoLnBvdygyLGkpLHMrPWMpOihhPWUqTWF0aC5wb3coMixjLTEpKk1hdGgucG93KDIsaSkscz0wKSk7aT49ODt0W3IrcF09MjU1JmEscCs9ZCxhLz0yNTYsaS09OCk7Zm9yKHM9czw8aXxhLGgrPWk7aD4wO3RbcitwXT0yNTUmcyxwKz1kLHMvPTI1NixoLT04KTt0W3IrcC1kXXw9MTI4Kmd9dmFyIHY9e30udG9TdHJpbmcsYj1BcnJheS5pc0FycmF5fHxmdW5jdGlvbih0KXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT12LmNhbGwodCl9O2Z1bmN0aW9uIG0oKXtyZXR1cm4gXy5UWVBFRF9BUlJBWV9TVVBQT1JUPzIxNDc0ODM2NDc6MTA3Mzc0MTgyM31mdW5jdGlvbiB3KHQsZSl7aWYobSgpPGUpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkludmFsaWQgdHlwZWQgYXJyYXkgbGVuZ3RoIik7cmV0dXJuIF8uVFlQRURfQVJSQVlfU1VQUE9SVD8odD1uZXcgVWludDhBcnJheShlKSkuX19wcm90b19fPV8ucHJvdG90eXBlOihudWxsPT09dCYmKHQ9bmV3IF8oZSkpLHQubGVuZ3RoPWUpLHR9ZnVuY3Rpb24gXyh0LGUscil7aWYoIShfLlRZUEVEX0FSUkFZX1NVUFBPUlR8fHRoaXMgaW5zdGFuY2VvZiBfKSlyZXR1cm4gbmV3IF8odCxlLHIpO2lmKCJudW1iZXIiPT10eXBlb2YgdCl7aWYoInN0cmluZyI9PXR5cGVvZiBlKXRocm93IG5ldyBFcnJvcigiSWYgZW5jb2RpbmcgaXMgc3BlY2lmaWVkIHRoZW4gdGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmciKTtyZXR1cm4gayh0aGlzLHQpfXJldHVybiBTKHRoaXMsdCxlLHIpfWZ1bmN0aW9uIFModCxlLHIsbil7aWYoIm51bWJlciI9PXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoJyJ2YWx1ZSIgYXJndW1lbnQgbXVzdCBub3QgYmUgYSBudW1iZXInKTtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiZlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXI/ZnVuY3Rpb24odCxlLHIsbil7aWYoZS5ieXRlTGVuZ3RoLHI8MHx8ZS5ieXRlTGVuZ3RoPHIpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIidvZmZzZXQnIGlzIG91dCBvZiBib3VuZHMiKTtpZihlLmJ5dGVMZW5ndGg8cisobnx8MCkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIidsZW5ndGgnIGlzIG91dCBvZiBib3VuZHMiKTtlPXZvaWQgMD09PXImJnZvaWQgMD09PW4/bmV3IFVpbnQ4QXJyYXkoZSk6dm9pZCAwPT09bj9uZXcgVWludDhBcnJheShlLHIpOm5ldyBVaW50OEFycmF5KGUscixuKTtfLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHQ9ZSkuX19wcm90b19fPV8ucHJvdG90eXBlOnQ9Uih0LGUpO3JldHVybiB0fSh0LGUscixuKToic3RyaW5nIj09dHlwZW9mIGU/ZnVuY3Rpb24odCxlLHIpeyJzdHJpbmciPT10eXBlb2YgciYmIiIhPT1yfHwocj0idXRmOCIpO2lmKCFfLmlzRW5jb2RpbmcocikpdGhyb3cgbmV3IFR5cGVFcnJvcignImVuY29kaW5nIiBtdXN0IGJlIGEgdmFsaWQgc3RyaW5nIGVuY29kaW5nJyk7dmFyIG49MHxUKGUscik7dD13KHQsbik7dmFyIGk9dC53cml0ZShlLHIpO2khPT1uJiYodD10LnNsaWNlKDAsaSkpO3JldHVybiB0fSh0LGUscik6ZnVuY3Rpb24odCxlKXtpZihPKGUpKXt2YXIgcj0wfEEoZS5sZW5ndGgpO3JldHVybiAwPT09KHQ9dyh0LHIpKS5sZW5ndGh8fGUuY29weSh0LDAsMCxyKSx0fWlmKGUpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJmUuYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXJ8fCJsZW5ndGgiaW4gZSlyZXR1cm4ibnVtYmVyIiE9dHlwZW9mIGUubGVuZ3RofHwobj1lLmxlbmd0aCkhPW4/dyh0LDApOlIodCxlKTtpZigiQnVmZmVyIj09PWUudHlwZSYmYihlLmRhdGEpKXJldHVybiBSKHQsZS5kYXRhKX12YXIgbjt0aHJvdyBuZXcgVHlwZUVycm9yKCJGaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgb3IgYXJyYXktbGlrZSBvYmplY3QuIil9KHQsZSl9ZnVuY3Rpb24gRSh0KXtpZigibnVtYmVyIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcignInNpemUiIGFyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKTtpZih0PDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoJyJzaXplIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBuZWdhdGl2ZScpfWZ1bmN0aW9uIGsodCxlKXtpZihFKGUpLHQ9dyh0LGU8MD8wOjB8QShlKSksIV8uVFlQRURfQVJSQVlfU1VQUE9SVClmb3IodmFyIHI9MDtyPGU7KytyKXRbcl09MDtyZXR1cm4gdH1mdW5jdGlvbiBSKHQsZSl7dmFyIHI9ZS5sZW5ndGg8MD8wOjB8QShlLmxlbmd0aCk7dD13KHQscik7Zm9yKHZhciBuPTA7bjxyO24rPTEpdFtuXT0yNTUmZVtuXTtyZXR1cm4gdH1mdW5jdGlvbiBBKHQpe2lmKHQ+PW0oKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQXR0ZW1wdCB0byBhbGxvY2F0ZSBCdWZmZXIgbGFyZ2VyIHRoYW4gbWF4aW11bSBzaXplOiAweCIrbSgpLnRvU3RyaW5nKDE2KSsiIGJ5dGVzIik7cmV0dXJuIDB8dH1mdW5jdGlvbiBPKHQpe3JldHVybiEobnVsbD09dHx8IXQuX2lzQnVmZmVyKX1mdW5jdGlvbiBUKHQsZSl7aWYoTyh0KSlyZXR1cm4gdC5sZW5ndGg7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmImZ1bmN0aW9uIj09dHlwZW9mIEFycmF5QnVmZmVyLmlzVmlldyYmKEFycmF5QnVmZmVyLmlzVmlldyh0KXx8dCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSlyZXR1cm4gdC5ieXRlTGVuZ3RoOyJzdHJpbmciIT10eXBlb2YgdCYmKHQ9IiIrdCk7dmFyIHI9dC5sZW5ndGg7aWYoMD09PXIpcmV0dXJuIDA7Zm9yKHZhciBuPSExOzspc3dpdGNoKGUpe2Nhc2UiYXNjaWkiOmNhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIHI7Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpjYXNlIHZvaWQgMDpyZXR1cm4gZXQodCkubGVuZ3RoO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gMipyO2Nhc2UiaGV4IjpyZXR1cm4gcj4+PjE7Y2FzZSJiYXNlNjQiOnJldHVybiBydCh0KS5sZW5ndGg7ZGVmYXVsdDppZihuKXJldHVybiBldCh0KS5sZW5ndGg7ZT0oIiIrZSkudG9Mb3dlckNhc2UoKSxuPSEwfX1mdW5jdGlvbiBqKHQsZSxyKXt2YXIgbj0hMTtpZigodm9pZCAwPT09ZXx8ZTwwKSYmKGU9MCksZT50aGlzLmxlbmd0aClyZXR1cm4iIjtpZigodm9pZCAwPT09cnx8cj50aGlzLmxlbmd0aCkmJihyPXRoaXMubGVuZ3RoKSxyPD0wKXJldHVybiIiO2lmKChyPj4+PTApPD0oZT4+Pj0wKSlyZXR1cm4iIjtmb3IodHx8KHQ9InV0ZjgiKTs7KXN3aXRjaCh0KXtjYXNlImhleCI6cmV0dXJuIFcodGhpcyxlLHIpO2Nhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6cmV0dXJuIEYodGhpcyxlLHIpO2Nhc2UiYXNjaWkiOnJldHVybiBxKHRoaXMsZSxyKTtjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOnJldHVybiBZKHRoaXMsZSxyKTtjYXNlImJhc2U2NCI6cmV0dXJuIE4odGhpcyxlLHIpO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gJCh0aGlzLGUscik7ZGVmYXVsdDppZihuKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrdCk7dD0odCsiIikudG9Mb3dlckNhc2UoKSxuPSEwfX1mdW5jdGlvbiBMKHQsZSxyKXt2YXIgbj10W2VdO3RbZV09dFtyXSx0W3JdPW59ZnVuY3Rpb24gQyh0LGUscixuLGkpe2lmKDA9PT10Lmxlbmd0aClyZXR1cm4tMTtpZigic3RyaW5nIj09dHlwZW9mIHI/KG49cixyPTApOnI+MjE0NzQ4MzY0Nz9yPTIxNDc0ODM2NDc6cjwtMjE0NzQ4MzY0OCYmKHI9LTIxNDc0ODM2NDgpLHI9K3IsaXNOYU4ocikmJihyPWk/MDp0Lmxlbmd0aC0xKSxyPDAmJihyPXQubGVuZ3RoK3IpLHI+PXQubGVuZ3RoKXtpZihpKXJldHVybi0xO3I9dC5sZW5ndGgtMX1lbHNlIGlmKHI8MCl7aWYoIWkpcmV0dXJuLTE7cj0wfWlmKCJzdHJpbmciPT10eXBlb2YgZSYmKGU9Xy5mcm9tKGUsbikpLE8oZSkpcmV0dXJuIDA9PT1lLmxlbmd0aD8tMTpQKHQsZSxyLG4saSk7aWYoIm51bWJlciI9PXR5cGVvZiBlKXJldHVybiBlJj0yNTUsXy5UWVBFRF9BUlJBWV9TVVBQT1JUJiYiZnVuY3Rpb24iPT10eXBlb2YgVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZj9pP1VpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbCh0LGUscik6VWludDhBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YuY2FsbCh0LGUscik6UCh0LFtlXSxyLG4saSk7dGhyb3cgbmV3IFR5cGVFcnJvcigidmFsIG11c3QgYmUgc3RyaW5nLCBudW1iZXIgb3IgQnVmZmVyIil9ZnVuY3Rpb24gUCh0LGUscixuLGkpe3ZhciBvLHM9MSxhPXQubGVuZ3RoLHU9ZS5sZW5ndGg7aWYodm9pZCAwIT09biYmKCJ1Y3MyIj09PShuPVN0cmluZyhuKS50b0xvd2VyQ2FzZSgpKXx8InVjcy0yIj09PW58fCJ1dGYxNmxlIj09PW58fCJ1dGYtMTZsZSI9PT1uKSl7aWYodC5sZW5ndGg8Mnx8ZS5sZW5ndGg8MilyZXR1cm4tMTtzPTIsYS89Mix1Lz0yLHIvPTJ9ZnVuY3Rpb24gaCh0LGUpe3JldHVybiAxPT09cz90W2VdOnQucmVhZFVJbnQxNkJFKGUqcyl9aWYoaSl7dmFyIGY9LTE7Zm9yKG89cjtvPGE7bysrKWlmKGgodCxvKT09PWgoZSwtMT09PWY/MDpvLWYpKXtpZigtMT09PWYmJihmPW8pLG8tZisxPT09dSlyZXR1cm4gZipzfWVsc2UtMSE9PWYmJihvLT1vLWYpLGY9LTF9ZWxzZSBmb3Iocit1PmEmJihyPWEtdSksbz1yO28+PTA7by0tKXtmb3IodmFyIGM9ITAsbD0wO2w8dTtsKyspaWYoaCh0LG8rbCkhPT1oKGUsbCkpe2M9ITE7YnJlYWt9aWYoYylyZXR1cm4gb31yZXR1cm4tMX1mdW5jdGlvbiBNKHQsZSxyLG4pe3I9TnVtYmVyKHIpfHwwO3ZhciBpPXQubGVuZ3RoLXI7bj8obj1OdW1iZXIobikpPmkmJihuPWkpOm49aTt2YXIgbz1lLmxlbmd0aDtpZihvJTIhPTApdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBoZXggc3RyaW5nIik7bj5vLzImJihuPW8vMik7Zm9yKHZhciBzPTA7czxuOysrcyl7dmFyIGE9cGFyc2VJbnQoZS5zdWJzdHIoMipzLDIpLDE2KTtpZihpc05hTihhKSlyZXR1cm4gczt0W3Irc109YX1yZXR1cm4gc31mdW5jdGlvbiBCKHQsZSxyLG4pe3JldHVybiBudChldChlLHQubGVuZ3RoLXIpLHQscixuKX1mdW5jdGlvbiB4KHQsZSxyLG4pe3JldHVybiBudChmdW5jdGlvbih0KXtmb3IodmFyIGU9W10scj0wO3I8dC5sZW5ndGg7KytyKWUucHVzaCgyNTUmdC5jaGFyQ29kZUF0KHIpKTtyZXR1cm4gZX0oZSksdCxyLG4pfWZ1bmN0aW9uIFUodCxlLHIsbil7cmV0dXJuIHgodCxlLHIsbil9ZnVuY3Rpb24gSSh0LGUscixuKXtyZXR1cm4gbnQocnQoZSksdCxyLG4pfWZ1bmN0aW9uIEQodCxlLHIsbil7cmV0dXJuIG50KGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByLG4saSxvPVtdLHM9MDtzPHQubGVuZ3RoJiYhKChlLT0yKTwwKTsrK3Mpbj0ocj10LmNoYXJDb2RlQXQocykpPj44LGk9ciUyNTYsby5wdXNoKGkpLG8ucHVzaChuKTtyZXR1cm4gb30oZSx0Lmxlbmd0aC1yKSx0LHIsbil9ZnVuY3Rpb24gTih0LGUscil7cmV0dXJuIDA9PT1lJiZyPT09dC5sZW5ndGg/ZCh0KTpkKHQuc2xpY2UoZSxyKSl9ZnVuY3Rpb24gRih0LGUscil7cj1NYXRoLm1pbih0Lmxlbmd0aCxyKTtmb3IodmFyIG49W10saT1lO2k8cjspe3ZhciBvLHMsYSx1LGg9dFtpXSxmPW51bGwsYz1oPjIzOT80Omg+MjIzPzM6aD4xOTE/MjoxO2lmKGkrYzw9cilzd2l0Y2goYyl7Y2FzZSAxOmg8MTI4JiYoZj1oKTticmVhaztjYXNlIDI6MTI4PT0oMTkyJihvPXRbaSsxXSkpJiYodT0oMzEmaCk8PDZ8NjMmbyk+MTI3JiYoZj11KTticmVhaztjYXNlIDM6bz10W2krMV0scz10W2krMl0sMTI4PT0oMTkyJm8pJiYxMjg9PSgxOTImcykmJih1PSgxNSZoKTw8MTJ8KDYzJm8pPDw2fDYzJnMpPjIwNDcmJih1PDU1Mjk2fHx1PjU3MzQzKSYmKGY9dSk7YnJlYWs7Y2FzZSA0Om89dFtpKzFdLHM9dFtpKzJdLGE9dFtpKzNdLDEyOD09KDE5MiZvKSYmMTI4PT0oMTkyJnMpJiYxMjg9PSgxOTImYSkmJih1PSgxNSZoKTw8MTh8KDYzJm8pPDwxMnwoNjMmcyk8PDZ8NjMmYSk+NjU1MzUmJnU8MTExNDExMiYmKGY9dSl9bnVsbD09PWY/KGY9NjU1MzMsYz0xKTpmPjY1NTM1JiYoZi09NjU1MzYsbi5wdXNoKGY+Pj4xMCYxMDIzfDU1Mjk2KSxmPTU2MzIwfDEwMjMmZiksbi5wdXNoKGYpLGkrPWN9cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBlPXQubGVuZ3RoO2lmKGU8PXopcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLHQpO3ZhciByPSIiLG49MDtmb3IoO248ZTspcis9U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsdC5zbGljZShuLG4rPXopKTtyZXR1cm4gcn0obil9Xy5UWVBFRF9BUlJBWV9TVVBQT1JUPXZvaWQgMD09PWEuVFlQRURfQVJSQVlfU1VQUE9SVHx8YS5UWVBFRF9BUlJBWV9TVVBQT1JULG0oKSxfLnBvb2xTaXplPTgxOTIsXy5fYXVnbWVudD1mdW5jdGlvbih0KXtyZXR1cm4gdC5fX3Byb3RvX189Xy5wcm90b3R5cGUsdH0sXy5mcm9tPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gUyhudWxsLHQsZSxyKX0sXy5UWVBFRF9BUlJBWV9TVVBQT1JUJiYoXy5wcm90b3R5cGUuX19wcm90b19fPVVpbnQ4QXJyYXkucHJvdG90eXBlLF8uX19wcm90b19fPVVpbnQ4QXJyYXkpLF8uYWxsb2M9ZnVuY3Rpb24odCxlLHIpe3JldHVybiBmdW5jdGlvbih0LGUscixuKXtyZXR1cm4gRShlKSxlPD0wP3codCxlKTp2b2lkIDAhPT1yPyJzdHJpbmciPT10eXBlb2Ygbj93KHQsZSkuZmlsbChyLG4pOncodCxlKS5maWxsKHIpOncodCxlKX0obnVsbCx0LGUscil9LF8uYWxsb2NVbnNhZmU9ZnVuY3Rpb24odCl7cmV0dXJuIGsobnVsbCx0KX0sXy5hbGxvY1Vuc2FmZVNsb3c9ZnVuY3Rpb24odCl7cmV0dXJuIGsobnVsbCx0KX0sXy5pc0J1ZmZlcj1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dCYmKCEhdC5faXNCdWZmZXJ8fGl0KHQpfHxmdW5jdGlvbih0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdC5yZWFkRmxvYXRMRSYmImZ1bmN0aW9uIj09dHlwZW9mIHQuc2xpY2UmJml0KHQuc2xpY2UoMCwwKSl9KHQpKX0sXy5jb21wYXJlPWZ1bmN0aW9uKHQsZSl7aWYoIU8odCl8fCFPKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50cyBtdXN0IGJlIEJ1ZmZlcnMiKTtpZih0PT09ZSlyZXR1cm4gMDtmb3IodmFyIHI9dC5sZW5ndGgsbj1lLmxlbmd0aCxpPTAsbz1NYXRoLm1pbihyLG4pO2k8bzsrK2kpaWYodFtpXSE9PWVbaV0pe3I9dFtpXSxuPWVbaV07YnJlYWt9cmV0dXJuIHI8bj8tMTpuPHI/MTowfSxfLmlzRW5jb2Rpbmc9ZnVuY3Rpb24odCl7c3dpdGNoKFN0cmluZyh0KS50b0xvd2VyQ2FzZSgpKXtjYXNlImhleCI6Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpjYXNlImFzY2lpIjpjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOmNhc2UiYmFzZTY0IjpjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX19LF8uY29uY2F0PWZ1bmN0aW9uKHQsZSl7aWYoIWIodCkpdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3QiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpO2lmKDA9PT10Lmxlbmd0aClyZXR1cm4gXy5hbGxvYygwKTt2YXIgcjtpZih2b2lkIDA9PT1lKWZvcihlPTAscj0wO3I8dC5sZW5ndGg7KytyKWUrPXRbcl0ubGVuZ3RoO3ZhciBuPV8uYWxsb2NVbnNhZmUoZSksaT0wO2ZvcihyPTA7cjx0Lmxlbmd0aDsrK3Ipe3ZhciBvPXRbcl07aWYoIU8obykpdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3QiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpO28uY29weShuLGkpLGkrPW8ubGVuZ3RofXJldHVybiBufSxfLmJ5dGVMZW5ndGg9VCxfLnByb3RvdHlwZS5faXNCdWZmZXI9ITAsXy5wcm90b3R5cGUuc3dhcDE2PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5sZW5ndGg7aWYodCUyIT0wKXRocm93IG5ldyBSYW5nZUVycm9yKCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYtYml0cyIpO2Zvcih2YXIgZT0wO2U8dDtlKz0yKUwodGhpcyxlLGUrMSk7cmV0dXJuIHRoaXN9LF8ucHJvdG90eXBlLnN3YXAzMj1mdW5jdGlvbigpe3ZhciB0PXRoaXMubGVuZ3RoO2lmKHQlNCE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyLWJpdHMiKTtmb3IodmFyIGU9MDtlPHQ7ZSs9NClMKHRoaXMsZSxlKzMpLEwodGhpcyxlKzEsZSsyKTtyZXR1cm4gdGhpc30sXy5wcm90b3R5cGUuc3dhcDY0PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5sZW5ndGg7aWYodCU4IT0wKXRocm93IG5ldyBSYW5nZUVycm9yKCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNjQtYml0cyIpO2Zvcih2YXIgZT0wO2U8dDtlKz04KUwodGhpcyxlLGUrNyksTCh0aGlzLGUrMSxlKzYpLEwodGhpcyxlKzIsZSs1KSxMKHRoaXMsZSszLGUrNCk7cmV0dXJuIHRoaXN9LF8ucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIHQ9MHx0aGlzLmxlbmd0aDtyZXR1cm4gMD09PXQ/IiI6MD09PWFyZ3VtZW50cy5sZW5ndGg/Rih0aGlzLDAsdCk6ai5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LF8ucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbih0KXtpZighTyh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIik7cmV0dXJuIHRoaXM9PT10fHwwPT09Xy5jb21wYXJlKHRoaXMsdCl9LF8ucHJvdG90eXBlLmluc3BlY3Q9ZnVuY3Rpb24oKXt2YXIgdD0iIjtyZXR1cm4gdGhpcy5sZW5ndGg+MCYmKHQ9dGhpcy50b1N0cmluZygiaGV4IiwwLDUwKS5tYXRjaCgvLnsyfS9nKS5qb2luKCIgIiksdGhpcy5sZW5ndGg+NTAmJih0Kz0iIC4uLiAiKSksIjxCdWZmZXIgIit0KyI+In0sXy5wcm90b3R5cGUuY29tcGFyZT1mdW5jdGlvbih0LGUscixuLGkpe2lmKCFPKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIiKTtpZih2b2lkIDA9PT1lJiYoZT0wKSx2b2lkIDA9PT1yJiYocj10P3QubGVuZ3RoOjApLHZvaWQgMD09PW4mJihuPTApLHZvaWQgMD09PWkmJihpPXRoaXMubGVuZ3RoKSxlPDB8fHI+dC5sZW5ndGh8fG48MHx8aT50aGlzLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigib3V0IG9mIHJhbmdlIGluZGV4Iik7aWYobj49aSYmZT49cilyZXR1cm4gMDtpZihuPj1pKXJldHVybi0xO2lmKGU+PXIpcmV0dXJuIDE7aWYodGhpcz09PXQpcmV0dXJuIDA7Zm9yKHZhciBvPShpPj4+PTApLShuPj4+PTApLHM9KHI+Pj49MCktKGU+Pj49MCksYT1NYXRoLm1pbihvLHMpLHU9dGhpcy5zbGljZShuLGkpLGg9dC5zbGljZShlLHIpLGY9MDtmPGE7KytmKWlmKHVbZl0hPT1oW2ZdKXtvPXVbZl0scz1oW2ZdO2JyZWFrfXJldHVybiBvPHM/LTE6czxvPzE6MH0sXy5wcm90b3R5cGUuaW5jbHVkZXM9ZnVuY3Rpb24odCxlLHIpe3JldHVybi0xIT09dGhpcy5pbmRleE9mKHQsZSxyKX0sXy5wcm90b3R5cGUuaW5kZXhPZj1mdW5jdGlvbih0LGUscil7cmV0dXJuIEModGhpcyx0LGUsciwhMCl9LF8ucHJvdG90eXBlLmxhc3RJbmRleE9mPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gQyh0aGlzLHQsZSxyLCExKX0sXy5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24odCxlLHIsbil7aWYodm9pZCAwPT09ZSluPSJ1dGY4IixyPXRoaXMubGVuZ3RoLGU9MDtlbHNlIGlmKHZvaWQgMD09PXImJiJzdHJpbmciPT10eXBlb2YgZSluPWUscj10aGlzLmxlbmd0aCxlPTA7ZWxzZXtpZighaXNGaW5pdGUoZSkpdGhyb3cgbmV3IEVycm9yKCJCdWZmZXIud3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0WywgbGVuZ3RoXSkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCIpO2V8PTAsaXNGaW5pdGUocik/KHJ8PTAsdm9pZCAwPT09biYmKG49InV0ZjgiKSk6KG49cixyPXZvaWQgMCl9dmFyIGk9dGhpcy5sZW5ndGgtZTtpZigodm9pZCAwPT09cnx8cj5pKSYmKHI9aSksdC5sZW5ndGg+MCYmKHI8MHx8ZTwwKXx8ZT50aGlzLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQXR0ZW1wdCB0byB3cml0ZSBvdXRzaWRlIGJ1ZmZlciBib3VuZHMiKTtufHwobj0idXRmOCIpO2Zvcih2YXIgbz0hMTs7KXN3aXRjaChuKXtjYXNlImhleCI6cmV0dXJuIE0odGhpcyx0LGUscik7Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpyZXR1cm4gQih0aGlzLHQsZSxyKTtjYXNlImFzY2lpIjpyZXR1cm4geCh0aGlzLHQsZSxyKTtjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOnJldHVybiBVKHRoaXMsdCxlLHIpO2Nhc2UiYmFzZTY0IjpyZXR1cm4gSSh0aGlzLHQsZSxyKTtjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuIEQodGhpcyx0LGUscik7ZGVmYXVsdDppZihvKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrbik7bj0oIiIrbikudG9Mb3dlckNhc2UoKSxvPSEwfX0sXy5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6IkJ1ZmZlciIsZGF0YTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLl9hcnJ8fHRoaXMsMCl9fTt2YXIgej00MDk2O2Z1bmN0aW9uIHEodCxlLHIpe3ZhciBuPSIiO3I9TWF0aC5taW4odC5sZW5ndGgscik7Zm9yKHZhciBpPWU7aTxyOysraSluKz1TdHJpbmcuZnJvbUNoYXJDb2RlKDEyNyZ0W2ldKTtyZXR1cm4gbn1mdW5jdGlvbiBZKHQsZSxyKXt2YXIgbj0iIjtyPU1hdGgubWluKHQubGVuZ3RoLHIpO2Zvcih2YXIgaT1lO2k8cjsrK2kpbis9U3RyaW5nLmZyb21DaGFyQ29kZSh0W2ldKTtyZXR1cm4gbn1mdW5jdGlvbiBXKHQsZSxyKXt2YXIgbj10Lmxlbmd0aDsoIWV8fGU8MCkmJihlPTApLCghcnx8cjwwfHxyPm4pJiYocj1uKTtmb3IodmFyIGk9IiIsbz1lO288cjsrK28paSs9dHQodFtvXSk7cmV0dXJuIGl9ZnVuY3Rpb24gJCh0LGUscil7Zm9yKHZhciBuPXQuc2xpY2UoZSxyKSxpPSIiLG89MDtvPG4ubGVuZ3RoO28rPTIpaSs9U3RyaW5nLmZyb21DaGFyQ29kZShuW29dKzI1NipuW28rMV0pO3JldHVybiBpfWZ1bmN0aW9uIEcodCxlLHIpe2lmKHQlMSE9MHx8dDwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJvZmZzZXQgaXMgbm90IHVpbnQiKTtpZih0K2U+cil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiVHJ5aW5nIHRvIGFjY2VzcyBiZXlvbmQgYnVmZmVyIGxlbmd0aCIpfWZ1bmN0aW9uIEoodCxlLHIsbixpLG8pe2lmKCFPKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJidWZmZXIiIGFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIgaW5zdGFuY2UnKTtpZihlPml8fGU8byl0aHJvdyBuZXcgUmFuZ2VFcnJvcignInZhbHVlIiBhcmd1bWVudCBpcyBvdXQgb2YgYm91bmRzJyk7aWYocituPnQubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKX1mdW5jdGlvbiBIKHQsZSxyLG4pe2U8MCYmKGU9NjU1MzUrZSsxKTtmb3IodmFyIGk9MCxvPU1hdGgubWluKHQubGVuZ3RoLXIsMik7aTxvOysraSl0W3IraV09KGUmMjU1PDw4KihuP2k6MS1pKSk+Pj44KihuP2k6MS1pKX1mdW5jdGlvbiBWKHQsZSxyLG4pe2U8MCYmKGU9NDI5NDk2NzI5NStlKzEpO2Zvcih2YXIgaT0wLG89TWF0aC5taW4odC5sZW5ndGgtciw0KTtpPG87KytpKXRbcitpXT1lPj4+OCoobj9pOjMtaSkmMjU1fWZ1bmN0aW9uIEsodCxlLHIsbixpLG8pe2lmKHIrbj50Lmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIik7aWYocjwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKX1mdW5jdGlvbiBaKHQsZSxyLG4saSl7cmV0dXJuIGl8fEsodCwwLHIsNCkseSh0LGUscixuLDIzLDQpLHIrNH1mdW5jdGlvbiBRKHQsZSxyLG4saSl7cmV0dXJuIGl8fEsodCwwLHIsOCkseSh0LGUscixuLDUyLDgpLHIrOH1fLnByb3RvdHlwZS5zbGljZT1mdW5jdGlvbih0LGUpe3ZhciByLG49dGhpcy5sZW5ndGg7aWYoKHQ9fn50KTwwPyh0Kz1uKTwwJiYodD0wKTp0Pm4mJih0PW4pLChlPXZvaWQgMD09PWU/bjp+fmUpPDA/KGUrPW4pPDAmJihlPTApOmU+biYmKGU9biksZTx0JiYoZT10KSxfLlRZUEVEX0FSUkFZX1NVUFBPUlQpKHI9dGhpcy5zdWJhcnJheSh0LGUpKS5fX3Byb3RvX189Xy5wcm90b3R5cGU7ZWxzZXt2YXIgaT1lLXQ7cj1uZXcgXyhpLHZvaWQgMCk7Zm9yKHZhciBvPTA7bzxpOysrbylyW29dPXRoaXNbbyt0XX1yZXR1cm4gcn0sXy5wcm90b3R5cGUucmVhZFVJbnRMRT1mdW5jdGlvbih0LGUscil7dHw9MCxlfD0wLHJ8fEcodCxlLHRoaXMubGVuZ3RoKTtmb3IodmFyIG49dGhpc1t0XSxpPTEsbz0wOysrbzxlJiYoaSo9MjU2KTspbis9dGhpc1t0K29dKmk7cmV0dXJuIG59LF8ucHJvdG90eXBlLnJlYWRVSW50QkU9ZnVuY3Rpb24odCxlLHIpe3R8PTAsZXw9MCxyfHxHKHQsZSx0aGlzLmxlbmd0aCk7Zm9yKHZhciBuPXRoaXNbdCstLWVdLGk9MTtlPjAmJihpKj0yNTYpOyluKz10aGlzW3QrLS1lXSppO3JldHVybiBufSxfLnByb3RvdHlwZS5yZWFkVUludDg9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Ryh0LDEsdGhpcy5sZW5ndGgpLHRoaXNbdF19LF8ucHJvdG90eXBlLnJlYWRVSW50MTZMRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxHKHQsMix0aGlzLmxlbmd0aCksdGhpc1t0XXx0aGlzW3QrMV08PDh9LF8ucHJvdG90eXBlLnJlYWRVSW50MTZCRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxHKHQsMix0aGlzLmxlbmd0aCksdGhpc1t0XTw8OHx0aGlzW3QrMV19LF8ucHJvdG90eXBlLnJlYWRVSW50MzJMRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxHKHQsNCx0aGlzLmxlbmd0aCksKHRoaXNbdF18dGhpc1t0KzFdPDw4fHRoaXNbdCsyXTw8MTYpKzE2Nzc3MjE2KnRoaXNbdCszXX0sXy5wcm90b3R5cGUucmVhZFVJbnQzMkJFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fEcodCw0LHRoaXMubGVuZ3RoKSwxNjc3NzIxNip0aGlzW3RdKyh0aGlzW3QrMV08PDE2fHRoaXNbdCsyXTw8OHx0aGlzW3QrM10pfSxfLnByb3RvdHlwZS5yZWFkSW50TEU9ZnVuY3Rpb24odCxlLHIpe3R8PTAsZXw9MCxyfHxHKHQsZSx0aGlzLmxlbmd0aCk7Zm9yKHZhciBuPXRoaXNbdF0saT0xLG89MDsrK288ZSYmKGkqPTI1Nik7KW4rPXRoaXNbdCtvXSppO3JldHVybiBuPj0oaSo9MTI4KSYmKG4tPU1hdGgucG93KDIsOCplKSksbn0sXy5wcm90b3R5cGUucmVhZEludEJFPWZ1bmN0aW9uKHQsZSxyKXt0fD0wLGV8PTAscnx8Ryh0LGUsdGhpcy5sZW5ndGgpO2Zvcih2YXIgbj1lLGk9MSxvPXRoaXNbdCstLW5dO24+MCYmKGkqPTI1Nik7KW8rPXRoaXNbdCstLW5dKmk7cmV0dXJuIG8+PShpKj0xMjgpJiYoby09TWF0aC5wb3coMiw4KmUpKSxvfSxfLnByb3RvdHlwZS5yZWFkSW50OD1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxHKHQsMSx0aGlzLmxlbmd0aCksMTI4JnRoaXNbdF0/LTEqKDI1NS10aGlzW3RdKzEpOnRoaXNbdF19LF8ucHJvdG90eXBlLnJlYWRJbnQxNkxFPWZ1bmN0aW9uKHQsZSl7ZXx8Ryh0LDIsdGhpcy5sZW5ndGgpO3ZhciByPXRoaXNbdF18dGhpc1t0KzFdPDw4O3JldHVybiAzMjc2OCZyPzQyOTQ5MDE3NjB8cjpyfSxfLnByb3RvdHlwZS5yZWFkSW50MTZCRT1mdW5jdGlvbih0LGUpe2V8fEcodCwyLHRoaXMubGVuZ3RoKTt2YXIgcj10aGlzW3QrMV18dGhpc1t0XTw8ODtyZXR1cm4gMzI3Njgmcj80Mjk0OTAxNzYwfHI6cn0sXy5wcm90b3R5cGUucmVhZEludDMyTEU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Ryh0LDQsdGhpcy5sZW5ndGgpLHRoaXNbdF18dGhpc1t0KzFdPDw4fHRoaXNbdCsyXTw8MTZ8dGhpc1t0KzNdPDwyNH0sXy5wcm90b3R5cGUucmVhZEludDMyQkU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Ryh0LDQsdGhpcy5sZW5ndGgpLHRoaXNbdF08PDI0fHRoaXNbdCsxXTw8MTZ8dGhpc1t0KzJdPDw4fHRoaXNbdCszXX0sXy5wcm90b3R5cGUucmVhZEZsb2F0TEU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Ryh0LDQsdGhpcy5sZW5ndGgpLGcodGhpcyx0LCEwLDIzLDQpfSxfLnByb3RvdHlwZS5yZWFkRmxvYXRCRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxHKHQsNCx0aGlzLmxlbmd0aCksZyh0aGlzLHQsITEsMjMsNCl9LF8ucHJvdG90eXBlLnJlYWREb3VibGVMRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxHKHQsOCx0aGlzLmxlbmd0aCksZyh0aGlzLHQsITAsNTIsOCl9LF8ucHJvdG90eXBlLnJlYWREb3VibGVCRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxHKHQsOCx0aGlzLmxlbmd0aCksZyh0aGlzLHQsITEsNTIsOCl9LF8ucHJvdG90eXBlLndyaXRlVUludExFPWZ1bmN0aW9uKHQsZSxyLG4peyh0PSt0LGV8PTAscnw9MCxuKXx8Sih0aGlzLHQsZSxyLE1hdGgucG93KDIsOCpyKS0xLDApO3ZhciBpPTEsbz0wO2Zvcih0aGlzW2VdPTI1NSZ0OysrbzxyJiYoaSo9MjU2KTspdGhpc1tlK29dPXQvaSYyNTU7cmV0dXJuIGUrcn0sXy5wcm90b3R5cGUud3JpdGVVSW50QkU9ZnVuY3Rpb24odCxlLHIsbil7KHQ9K3QsZXw9MCxyfD0wLG4pfHxKKHRoaXMsdCxlLHIsTWF0aC5wb3coMiw4KnIpLTEsMCk7dmFyIGk9ci0xLG89MTtmb3IodGhpc1tlK2ldPTI1NSZ0Oy0taT49MCYmKG8qPTI1Nik7KXRoaXNbZStpXT10L28mMjU1O3JldHVybiBlK3J9LF8ucHJvdG90eXBlLndyaXRlVUludDg9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0PSt0LGV8PTAscnx8Sih0aGlzLHQsZSwxLDI1NSwwKSxfLlRZUEVEX0FSUkFZX1NVUFBPUlR8fCh0PU1hdGguZmxvb3IodCkpLHRoaXNbZV09MjU1JnQsZSsxfSxfLnByb3RvdHlwZS53cml0ZVVJbnQxNkxFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD0rdCxlfD0wLHJ8fEoodGhpcyx0LGUsMiw2NTUzNSwwKSxfLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZV09MjU1JnQsdGhpc1tlKzFdPXQ+Pj44KTpIKHRoaXMsdCxlLCEwKSxlKzJ9LF8ucHJvdG90eXBlLndyaXRlVUludDE2QkU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0PSt0LGV8PTAscnx8Sih0aGlzLHQsZSwyLDY1NTM1LDApLF8uVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT10Pj4+OCx0aGlzW2UrMV09MjU1JnQpOkgodGhpcyx0LGUsITEpLGUrMn0sXy5wcm90b3R5cGUud3JpdGVVSW50MzJMRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9K3QsZXw9MCxyfHxKKHRoaXMsdCxlLDQsNDI5NDk2NzI5NSwwKSxfLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZSszXT10Pj4+MjQsdGhpc1tlKzJdPXQ+Pj4xNix0aGlzW2UrMV09dD4+PjgsdGhpc1tlXT0yNTUmdCk6Vih0aGlzLHQsZSwhMCksZSs0fSxfLnByb3RvdHlwZS53cml0ZVVJbnQzMkJFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD0rdCxlfD0wLHJ8fEoodGhpcyx0LGUsNCw0Mjk0OTY3Mjk1LDApLF8uVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT10Pj4+MjQsdGhpc1tlKzFdPXQ+Pj4xNix0aGlzW2UrMl09dD4+PjgsdGhpc1tlKzNdPTI1NSZ0KTpWKHRoaXMsdCxlLCExKSxlKzR9LF8ucHJvdG90eXBlLndyaXRlSW50TEU9ZnVuY3Rpb24odCxlLHIsbil7aWYodD0rdCxlfD0wLCFuKXt2YXIgaT1NYXRoLnBvdygyLDgqci0xKTtKKHRoaXMsdCxlLHIsaS0xLC1pKX12YXIgbz0wLHM9MSxhPTA7Zm9yKHRoaXNbZV09MjU1JnQ7KytvPHImJihzKj0yNTYpOyl0PDAmJjA9PT1hJiYwIT09dGhpc1tlK28tMV0mJihhPTEpLHRoaXNbZStvXT0odC9zPj4wKS1hJjI1NTtyZXR1cm4gZStyfSxfLnByb3RvdHlwZS53cml0ZUludEJFPWZ1bmN0aW9uKHQsZSxyLG4pe2lmKHQ9K3QsZXw9MCwhbil7dmFyIGk9TWF0aC5wb3coMiw4KnItMSk7Sih0aGlzLHQsZSxyLGktMSwtaSl9dmFyIG89ci0xLHM9MSxhPTA7Zm9yKHRoaXNbZStvXT0yNTUmdDstLW8+PTAmJihzKj0yNTYpOyl0PDAmJjA9PT1hJiYwIT09dGhpc1tlK28rMV0mJihhPTEpLHRoaXNbZStvXT0odC9zPj4wKS1hJjI1NTtyZXR1cm4gZStyfSxfLnByb3RvdHlwZS53cml0ZUludDg9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0PSt0LGV8PTAscnx8Sih0aGlzLHQsZSwxLDEyNywtMTI4KSxfLlRZUEVEX0FSUkFZX1NVUFBPUlR8fCh0PU1hdGguZmxvb3IodCkpLHQ8MCYmKHQ9MjU1K3QrMSksdGhpc1tlXT0yNTUmdCxlKzF9LF8ucHJvdG90eXBlLndyaXRlSW50MTZMRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9K3QsZXw9MCxyfHxKKHRoaXMsdCxlLDIsMzI3NjcsLTMyNzY4KSxfLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZV09MjU1JnQsdGhpc1tlKzFdPXQ+Pj44KTpIKHRoaXMsdCxlLCEwKSxlKzJ9LF8ucHJvdG90eXBlLndyaXRlSW50MTZCRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9K3QsZXw9MCxyfHxKKHRoaXMsdCxlLDIsMzI3NjcsLTMyNzY4KSxfLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZV09dD4+PjgsdGhpc1tlKzFdPTI1NSZ0KTpIKHRoaXMsdCxlLCExKSxlKzJ9LF8ucHJvdG90eXBlLndyaXRlSW50MzJMRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9K3QsZXw9MCxyfHxKKHRoaXMsdCxlLDQsMjE0NzQ4MzY0NywtMjE0NzQ4MzY0OCksXy5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPTI1NSZ0LHRoaXNbZSsxXT10Pj4+OCx0aGlzW2UrMl09dD4+PjE2LHRoaXNbZSszXT10Pj4+MjQpOlYodGhpcyx0LGUsITApLGUrNH0sXy5wcm90b3R5cGUud3JpdGVJbnQzMkJFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD0rdCxlfD0wLHJ8fEoodGhpcyx0LGUsNCwyMTQ3NDgzNjQ3LC0yMTQ3NDgzNjQ4KSx0PDAmJih0PTQyOTQ5NjcyOTUrdCsxKSxfLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZV09dD4+PjI0LHRoaXNbZSsxXT10Pj4+MTYsdGhpc1tlKzJdPXQ+Pj44LHRoaXNbZSszXT0yNTUmdCk6Vih0aGlzLHQsZSwhMSksZSs0fSxfLnByb3RvdHlwZS53cml0ZUZsb2F0TEU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiBaKHRoaXMsdCxlLCEwLHIpfSxfLnByb3RvdHlwZS53cml0ZUZsb2F0QkU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiBaKHRoaXMsdCxlLCExLHIpfSxfLnByb3RvdHlwZS53cml0ZURvdWJsZUxFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gUSh0aGlzLHQsZSwhMCxyKX0sXy5wcm90b3R5cGUud3JpdGVEb3VibGVCRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIFEodGhpcyx0LGUsITEscil9LF8ucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24odCxlLHIsbil7aWYocnx8KHI9MCksbnx8MD09PW58fChuPXRoaXMubGVuZ3RoKSxlPj10Lmxlbmd0aCYmKGU9dC5sZW5ndGgpLGV8fChlPTApLG4+MCYmbjxyJiYobj1yKSxuPT09cilyZXR1cm4gMDtpZigwPT09dC5sZW5ndGh8fDA9PT10aGlzLmxlbmd0aClyZXR1cm4gMDtpZihlPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoInRhcmdldFN0YXJ0IG91dCBvZiBib3VuZHMiKTtpZihyPDB8fHI+PXRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJzb3VyY2VTdGFydCBvdXQgb2YgYm91bmRzIik7aWYobjwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJzb3VyY2VFbmQgb3V0IG9mIGJvdW5kcyIpO24+dGhpcy5sZW5ndGgmJihuPXRoaXMubGVuZ3RoKSx0Lmxlbmd0aC1lPG4tciYmKG49dC5sZW5ndGgtZStyKTt2YXIgaSxvPW4tcjtpZih0aGlzPT09dCYmcjxlJiZlPG4pZm9yKGk9by0xO2k+PTA7LS1pKXRbaStlXT10aGlzW2krcl07ZWxzZSBpZihvPDFlM3x8IV8uVFlQRURfQVJSQVlfU1VQUE9SVClmb3IoaT0wO2k8bzsrK2kpdFtpK2VdPXRoaXNbaStyXTtlbHNlIFVpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKHQsdGhpcy5zdWJhcnJheShyLHIrbyksZSk7cmV0dXJuIG99LF8ucHJvdG90eXBlLmZpbGw9ZnVuY3Rpb24odCxlLHIsbil7aWYoInN0cmluZyI9PXR5cGVvZiB0KXtpZigic3RyaW5nIj09dHlwZW9mIGU/KG49ZSxlPTAscj10aGlzLmxlbmd0aCk6InN0cmluZyI9PXR5cGVvZiByJiYobj1yLHI9dGhpcy5sZW5ndGgpLDE9PT10Lmxlbmd0aCl7dmFyIGk9dC5jaGFyQ29kZUF0KDApO2k8MjU2JiYodD1pKX1pZih2b2lkIDAhPT1uJiYic3RyaW5nIiE9dHlwZW9mIG4pdGhyb3cgbmV3IFR5cGVFcnJvcigiZW5jb2RpbmcgbXVzdCBiZSBhIHN0cmluZyIpO2lmKCJzdHJpbmciPT10eXBlb2YgbiYmIV8uaXNFbmNvZGluZyhuKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK24pfWVsc2UibnVtYmVyIj09dHlwZW9mIHQmJih0Jj0yNTUpO2lmKGU8MHx8dGhpcy5sZW5ndGg8ZXx8dGhpcy5sZW5ndGg8cil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiT3V0IG9mIHJhbmdlIGluZGV4Iik7aWYocjw9ZSlyZXR1cm4gdGhpczt2YXIgbztpZihlPj4+PTAscj12b2lkIDA9PT1yP3RoaXMubGVuZ3RoOnI+Pj4wLHR8fCh0PTApLCJudW1iZXIiPT10eXBlb2YgdClmb3Iobz1lO288cjsrK28pdGhpc1tvXT10O2Vsc2V7dmFyIHM9Tyh0KT90OmV0KG5ldyBfKHQsbikudG9TdHJpbmcoKSksYT1zLmxlbmd0aDtmb3Iobz0wO288ci1lOysrbyl0aGlzW28rZV09c1tvJWFdfXJldHVybiB0aGlzfTt2YXIgWD0vW14rXC8wLTlBLVphLXotX10vZztmdW5jdGlvbiB0dCh0KXtyZXR1cm4gdDwxNj8iMCIrdC50b1N0cmluZygxNik6dC50b1N0cmluZygxNil9ZnVuY3Rpb24gZXQodCxlKXt2YXIgcjtlPWV8fDEvMDtmb3IodmFyIG49dC5sZW5ndGgsaT1udWxsLG89W10scz0wO3M8bjsrK3Mpe2lmKChyPXQuY2hhckNvZGVBdChzKSk+NTUyOTUmJnI8NTczNDQpe2lmKCFpKXtpZihyPjU2MzE5KXsoZS09Myk+LTEmJm8ucHVzaCgyMzksMTkxLDE4OSk7Y29udGludWV9aWYocysxPT09bil7KGUtPTMpPi0xJiZvLnB1c2goMjM5LDE5MSwxODkpO2NvbnRpbnVlfWk9cjtjb250aW51ZX1pZihyPDU2MzIwKXsoZS09Myk+LTEmJm8ucHVzaCgyMzksMTkxLDE4OSksaT1yO2NvbnRpbnVlfXI9NjU1MzYrKGktNTUyOTY8PDEwfHItNTYzMjApfWVsc2UgaSYmKGUtPTMpPi0xJiZvLnB1c2goMjM5LDE5MSwxODkpO2lmKGk9bnVsbCxyPDEyOCl7aWYoKGUtPTEpPDApYnJlYWs7by5wdXNoKHIpfWVsc2UgaWYocjwyMDQ4KXtpZigoZS09Mik8MClicmVhaztvLnB1c2gocj4+NnwxOTIsNjMmcnwxMjgpfWVsc2UgaWYocjw2NTUzNil7aWYoKGUtPTMpPDApYnJlYWs7by5wdXNoKHI+PjEyfDIyNCxyPj42JjYzfDEyOCw2MyZyfDEyOCl9ZWxzZXtpZighKHI8MTExNDExMikpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGNvZGUgcG9pbnQiKTtpZigoZS09NCk8MClicmVhaztvLnB1c2gocj4+MTh8MjQwLHI+PjEyJjYzfDEyOCxyPj42JjYzfDEyOCw2MyZyfDEyOCl9fXJldHVybiBvfWZ1bmN0aW9uIHJ0KHQpe3JldHVybiBmdW5jdGlvbih0KXt2YXIgZSxyLG4saSxvLHM7Y3x8bCgpO3ZhciBhPXQubGVuZ3RoO2lmKGElND4wKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCIpO289Ij0iPT09dFthLTJdPzI6Ij0iPT09dFthLTFdPzE6MCxzPW5ldyBmKDMqYS80LW8pLG49bz4wP2EtNDphO3ZhciB1PTA7Zm9yKGU9MCxyPTA7ZTxuO2UrPTQscis9MylpPWhbdC5jaGFyQ29kZUF0KGUpXTw8MTh8aFt0LmNoYXJDb2RlQXQoZSsxKV08PDEyfGhbdC5jaGFyQ29kZUF0KGUrMildPDw2fGhbdC5jaGFyQ29kZUF0KGUrMyldLHNbdSsrXT1pPj4xNiYyNTUsc1t1KytdPWk+PjgmMjU1LHNbdSsrXT0yNTUmaTtyZXR1cm4gMj09PW8/KGk9aFt0LmNoYXJDb2RlQXQoZSldPDwyfGhbdC5jaGFyQ29kZUF0KGUrMSldPj40LHNbdSsrXT0yNTUmaSk6MT09PW8mJihpPWhbdC5jaGFyQ29kZUF0KGUpXTw8MTB8aFt0LmNoYXJDb2RlQXQoZSsxKV08PDR8aFt0LmNoYXJDb2RlQXQoZSsyKV0+PjIsc1t1KytdPWk+PjgmMjU1LHNbdSsrXT0yNTUmaSksc30oZnVuY3Rpb24odCl7aWYoKHQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQudHJpbT90LnRyaW0oKTp0LnJlcGxhY2UoL15ccyt8XHMrJC9nLCIiKX0odCkucmVwbGFjZShYLCIiKSkubGVuZ3RoPDIpcmV0dXJuIiI7Zm9yKDt0Lmxlbmd0aCU0IT0wOyl0Kz0iPSI7cmV0dXJuIHR9KHQpKX1mdW5jdGlvbiBudCh0LGUscixuKXtmb3IodmFyIGk9MDtpPG4mJiEoaStyPj1lLmxlbmd0aHx8aT49dC5sZW5ndGgpOysraSllW2krcl09dFtpXTtyZXR1cm4gaX1mdW5jdGlvbiBpdCh0KXtyZXR1cm4hIXQuY29uc3RydWN0b3ImJiJmdW5jdGlvbiI9PXR5cGVvZiB0LmNvbnN0cnVjdG9yLmlzQnVmZmVyJiZ0LmNvbnN0cnVjdG9yLmlzQnVmZmVyKHQpfWZ1bmN0aW9uIG90KCl7dGhyb3cgbmV3IEVycm9yKCJzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkIil9ZnVuY3Rpb24gc3QoKXt0aHJvdyBuZXcgRXJyb3IoImNsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCIpfXZhciBhdD1vdCx1dD1zdDtmdW5jdGlvbiBodCh0KXtpZihhdD09PXNldFRpbWVvdXQpcmV0dXJuIHNldFRpbWVvdXQodCwwKTtpZigoYXQ9PT1vdHx8IWF0KSYmc2V0VGltZW91dClyZXR1cm4gYXQ9c2V0VGltZW91dCxzZXRUaW1lb3V0KHQsMCk7dHJ5e3JldHVybiBhdCh0LDApfWNhdGNoKGUpe3RyeXtyZXR1cm4gYXQuY2FsbChudWxsLHQsMCl9Y2F0Y2goZSl7cmV0dXJuIGF0LmNhbGwodGhpcyx0LDApfX19ImZ1bmN0aW9uIj09dHlwZW9mIGEuc2V0VGltZW91dCYmKGF0PXNldFRpbWVvdXQpLCJmdW5jdGlvbiI9PXR5cGVvZiBhLmNsZWFyVGltZW91dCYmKHV0PWNsZWFyVGltZW91dCk7dmFyIGZ0LGN0PVtdLGx0PSExLHB0PS0xO2Z1bmN0aW9uIGR0KCl7bHQmJmZ0JiYobHQ9ITEsZnQubGVuZ3RoP2N0PWZ0LmNvbmNhdChjdCk6cHQ9LTEsY3QubGVuZ3RoJiZndCgpKX1mdW5jdGlvbiBndCgpe2lmKCFsdCl7dmFyIHQ9aHQoZHQpO2x0PSEwO2Zvcih2YXIgZT1jdC5sZW5ndGg7ZTspe2ZvcihmdD1jdCxjdD1bXTsrK3B0PGU7KWZ0JiZmdFtwdF0ucnVuKCk7cHQ9LTEsZT1jdC5sZW5ndGh9ZnQ9bnVsbCxsdD0hMSxmdW5jdGlvbih0KXtpZih1dD09PWNsZWFyVGltZW91dClyZXR1cm4gY2xlYXJUaW1lb3V0KHQpO2lmKCh1dD09PXN0fHwhdXQpJiZjbGVhclRpbWVvdXQpcmV0dXJuIHV0PWNsZWFyVGltZW91dCxjbGVhclRpbWVvdXQodCk7dHJ5e3JldHVybiB1dCh0KX1jYXRjaChlKXt0cnl7cmV0dXJuIHV0LmNhbGwobnVsbCx0KX1jYXRjaChlKXtyZXR1cm4gdXQuY2FsbCh0aGlzLHQpfX19KHQpfX1mdW5jdGlvbiB5dCh0KXt2YXIgZT1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aC0xKTtpZihhcmd1bWVudHMubGVuZ3RoPjEpZm9yKHZhciByPTE7cjxhcmd1bWVudHMubGVuZ3RoO3IrKyllW3ItMV09YXJndW1lbnRzW3JdO2N0LnB1c2gobmV3IHZ0KHQsZSkpLDEhPT1jdC5sZW5ndGh8fGx0fHxodChndCl9ZnVuY3Rpb24gdnQodCxlKXt0aGlzLmZ1bj10LHRoaXMuYXJyYXk9ZX12dC5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKCl7dGhpcy5mdW4uYXBwbHkobnVsbCx0aGlzLmFycmF5KX07ZnVuY3Rpb24gYnQoKXt9dmFyIG10PWJ0LHd0PWJ0LF90PWJ0LFN0PWJ0LEV0PWJ0LGt0PWJ0LFJ0PWJ0O3ZhciBBdD1hLnBlcmZvcm1hbmNlfHx7fSxPdD1BdC5ub3d8fEF0Lm1vek5vd3x8QXQubXNOb3d8fEF0Lm9Ob3d8fEF0LndlYmtpdE5vd3x8ZnVuY3Rpb24oKXtyZXR1cm4obmV3IERhdGUpLmdldFRpbWUoKX07dmFyIFR0PW5ldyBEYXRlO3ZhciBqdCxMdD17bmV4dFRpY2s6eXQsdGl0bGU6ImJyb3dzZXIiLGJyb3dzZXI6ITAsZW52Ont9LGFyZ3Y6W10sdmVyc2lvbjoiIix2ZXJzaW9uczp7fSxvbjptdCxhZGRMaXN0ZW5lcjp3dCxvbmNlOl90LG9mZjpTdCxyZW1vdmVMaXN0ZW5lcjpFdCxyZW1vdmVBbGxMaXN0ZW5lcnM6a3QsZW1pdDpSdCxiaW5kaW5nOmZ1bmN0aW9uKHQpe3Rocm93IG5ldyBFcnJvcigicHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQiKX0sY3dkOmZ1bmN0aW9uKCl7cmV0dXJuIi8ifSxjaGRpcjpmdW5jdGlvbih0KXt0aHJvdyBuZXcgRXJyb3IoInByb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCIpfSx1bWFzazpmdW5jdGlvbigpe3JldHVybiAwfSxocnRpbWU6ZnVuY3Rpb24odCl7dmFyIGU9LjAwMSpPdC5jYWxsKEF0KSxyPU1hdGguZmxvb3IoZSksbj1NYXRoLmZsb29yKGUlMSoxZTkpO3JldHVybiB0JiYoci09dFswXSwobi09dFsxXSk8MCYmKHItLSxuKz0xZTkpKSxbcixuXX0scGxhdGZvcm06ImJyb3dzZXIiLHJlbGVhc2U6e30sY29uZmlnOnt9LHVwdGltZTpmdW5jdGlvbigpe3JldHVybihuZXcgRGF0ZS1UdCkvMWUzfX07anQ9ImZ1bmN0aW9uIj09dHlwZW9mIE9iamVjdC5jcmVhdGU/ZnVuY3Rpb24odCxlKXt0LnN1cGVyXz1lLHQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZS5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTp0LGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pfTpmdW5jdGlvbih0LGUpe3Quc3VwZXJfPWU7dmFyIHI9ZnVuY3Rpb24oKXt9O3IucHJvdG90eXBlPWUucHJvdG90eXBlLHQucHJvdG90eXBlPW5ldyByLHQucHJvdG90eXBlLmNvbnN0cnVjdG9yPXR9O3ZhciBDdD1qdCxQdD0vJVtzZGolXS9nO2Z1bmN0aW9uIE10KHQpe2lmKCEkdCh0KSl7Zm9yKHZhciBlPVtdLHI9MDtyPGFyZ3VtZW50cy5sZW5ndGg7cisrKWUucHVzaChJdChhcmd1bWVudHNbcl0pKTtyZXR1cm4gZS5qb2luKCIgIil9cj0xO2Zvcih2YXIgbj1hcmd1bWVudHMsaT1uLmxlbmd0aCxvPVN0cmluZyh0KS5yZXBsYWNlKFB0LChmdW5jdGlvbih0KXtpZigiJSUiPT09dClyZXR1cm4iJSI7aWYocj49aSlyZXR1cm4gdDtzd2l0Y2godCl7Y2FzZSIlcyI6cmV0dXJuIFN0cmluZyhuW3IrK10pO2Nhc2UiJWQiOnJldHVybiBOdW1iZXIobltyKytdKTtjYXNlIiVqIjp0cnl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KG5bcisrXSl9Y2F0Y2godCl7cmV0dXJuIltDaXJjdWxhcl0ifWRlZmF1bHQ6cmV0dXJuIHR9fSkpLHM9bltyXTtyPGk7cz1uWysrcl0pV3Qocyl8fCFIdChzKT9vKz0iICIrczpvKz0iICIrSXQocyk7cmV0dXJuIG99ZnVuY3Rpb24gQnQodCxlKXtpZihHdChhLnByb2Nlc3MpKXJldHVybiBmdW5jdGlvbigpe3JldHVybiBCdCh0LGUpLmFwcGx5KHRoaXMsYXJndW1lbnRzKX07aWYoITA9PT1MdC5ub0RlcHJlY2F0aW9uKXJldHVybiB0O3ZhciByPSExO3JldHVybiBmdW5jdGlvbigpe2lmKCFyKXtpZihMdC50aHJvd0RlcHJlY2F0aW9uKXRocm93IG5ldyBFcnJvcihlKTtMdC50cmFjZURlcHJlY2F0aW9uP2NvbnNvbGUudHJhY2UoZSk6Y29uc29sZS5lcnJvcihlKSxyPSEwfXJldHVybiB0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX19dmFyIHh0LFV0PXt9O2Z1bmN0aW9uIEl0KHQsZSl7dmFyIHI9e3NlZW46W10sc3R5bGl6ZTpOdH07cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+PTMmJihyLmRlcHRoPWFyZ3VtZW50c1syXSksYXJndW1lbnRzLmxlbmd0aD49NCYmKHIuY29sb3JzPWFyZ3VtZW50c1szXSksWXQoZSk/ci5zaG93SGlkZGVuPWU6ZSYmZnVuY3Rpb24odCxlKXtpZighZXx8IUh0KGUpKXJldHVybiB0O3ZhciByPU9iamVjdC5rZXlzKGUpLG49ci5sZW5ndGg7Zm9yKDtuLS07KXRbcltuXV09ZVtyW25dXX0ocixlKSxHdChyLnNob3dIaWRkZW4pJiYoci5zaG93SGlkZGVuPSExKSxHdChyLmRlcHRoKSYmKHIuZGVwdGg9MiksR3Qoci5jb2xvcnMpJiYoci5jb2xvcnM9ITEpLEd0KHIuY3VzdG9tSW5zcGVjdCkmJihyLmN1c3RvbUluc3BlY3Q9ITApLHIuY29sb3JzJiYoci5zdHlsaXplPUR0KSxGdChyLHQsci5kZXB0aCl9ZnVuY3Rpb24gRHQodCxlKXt2YXIgcj1JdC5zdHlsZXNbZV07cmV0dXJuIHI/IhtbIitJdC5jb2xvcnNbcl1bMF0rIm0iK3QrIhtbIitJdC5jb2xvcnNbcl1bMV0rIm0iOnR9ZnVuY3Rpb24gTnQodCxlKXtyZXR1cm4gdH1mdW5jdGlvbiBGdCh0LGUscil7aWYodC5jdXN0b21JbnNwZWN0JiZlJiZadChlLmluc3BlY3QpJiZlLmluc3BlY3QhPT1JdCYmKCFlLmNvbnN0cnVjdG9yfHxlLmNvbnN0cnVjdG9yLnByb3RvdHlwZSE9PWUpKXt2YXIgbj1lLmluc3BlY3Qocix0KTtyZXR1cm4gJHQobil8fChuPUZ0KHQsbixyKSksbn12YXIgaT1mdW5jdGlvbih0LGUpe2lmKEd0KGUpKXJldHVybiB0LnN0eWxpemUoInVuZGVmaW5lZCIsInVuZGVmaW5lZCIpO2lmKCR0KGUpKXt2YXIgcj0iJyIrSlNPTi5zdHJpbmdpZnkoZSkucmVwbGFjZSgvXiJ8IiQvZywiIikucmVwbGFjZSgvJy9nLCJcXCciKS5yZXBsYWNlKC9cXCIvZywnIicpKyInIjtyZXR1cm4gdC5zdHlsaXplKHIsInN0cmluZyIpfWlmKG49ZSwibnVtYmVyIj09dHlwZW9mIG4pcmV0dXJuIHQuc3R5bGl6ZSgiIitlLCJudW1iZXIiKTt2YXIgbjtpZihZdChlKSlyZXR1cm4gdC5zdHlsaXplKCIiK2UsImJvb2xlYW4iKTtpZihXdChlKSlyZXR1cm4gdC5zdHlsaXplKCJudWxsIiwibnVsbCIpfSh0LGUpO2lmKGkpcmV0dXJuIGk7dmFyIG89T2JqZWN0LmtleXMoZSkscz1mdW5jdGlvbih0KXt2YXIgZT17fTtyZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbih0LHIpe2VbdF09ITB9KSksZX0obyk7aWYodC5zaG93SGlkZGVuJiYobz1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhlKSksS3QoZSkmJihvLmluZGV4T2YoIm1lc3NhZ2UiKT49MHx8by5pbmRleE9mKCJkZXNjcmlwdGlvbiIpPj0wKSlyZXR1cm4genQoZSk7aWYoMD09PW8ubGVuZ3RoKXtpZihadChlKSl7dmFyIGE9ZS5uYW1lPyI6ICIrZS5uYW1lOiIiO3JldHVybiB0LnN0eWxpemUoIltGdW5jdGlvbiIrYSsiXSIsInNwZWNpYWwiKX1pZihKdChlKSlyZXR1cm4gdC5zdHlsaXplKFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKSwicmVnZXhwIik7aWYoVnQoZSkpcmV0dXJuIHQuc3R5bGl6ZShEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpLCJkYXRlIik7aWYoS3QoZSkpcmV0dXJuIHp0KGUpfXZhciB1LGgsZj0iIixjPSExLGw9WyJ7IiwifSJdOyh1PWUsQXJyYXkuaXNBcnJheSh1KSYmKGM9ITAsbD1bIlsiLCJdIl0pLFp0KGUpKSYmKGY9IiBbRnVuY3Rpb24iKyhlLm5hbWU/IjogIitlLm5hbWU6IiIpKyJdIik7cmV0dXJuIEp0KGUpJiYoZj0iICIrUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpKSxWdChlKSYmKGY9IiAiK0RhdGUucHJvdG90eXBlLnRvVVRDU3RyaW5nLmNhbGwoZSkpLEt0KGUpJiYoZj0iICIrenQoZSkpLDAhPT1vLmxlbmd0aHx8YyYmMCE9ZS5sZW5ndGg/cjwwP0p0KGUpP3Quc3R5bGl6ZShSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSksInJlZ2V4cCIpOnQuc3R5bGl6ZSgiW09iamVjdF0iLCJzcGVjaWFsIik6KHQuc2Vlbi5wdXNoKGUpLGg9Yz9mdW5jdGlvbih0LGUscixuLGkpe2Zvcih2YXIgbz1bXSxzPTAsYT1lLmxlbmd0aDtzPGE7KytzKVh0KGUsU3RyaW5nKHMpKT9vLnB1c2gocXQodCxlLHIsbixTdHJpbmcocyksITApKTpvLnB1c2goIiIpO3JldHVybiBpLmZvckVhY2goKGZ1bmN0aW9uKGkpe2kubWF0Y2goL15cZCskLyl8fG8ucHVzaChxdCh0LGUscixuLGksITApKX0pKSxvfSh0LGUscixzLG8pOm8ubWFwKChmdW5jdGlvbihuKXtyZXR1cm4gcXQodCxlLHIscyxuLGMpfSkpLHQuc2Vlbi5wb3AoKSxmdW5jdGlvbih0LGUscil7dmFyIG49dC5yZWR1Y2UoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUuaW5kZXhPZigiXG4iKSx0K2UucmVwbGFjZSgvXHUwMDFiXFtcZFxkP20vZywiIikubGVuZ3RoKzF9KSwwKTtpZihuPjYwKXJldHVybiByWzBdKygiIj09PWU/IiI6ZSsiXG4gIikrIiAiK3Quam9pbigiLFxuICAiKSsiICIrclsxXTtyZXR1cm4gclswXStlKyIgIit0LmpvaW4oIiwgIikrIiAiK3JbMV19KGgsZixsKSk6bFswXStmK2xbMV19ZnVuY3Rpb24genQodCl7cmV0dXJuIlsiK0Vycm9yLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpKyJdIn1mdW5jdGlvbiBxdCh0LGUscixuLGksbyl7dmFyIHMsYSx1O2lmKCh1PU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSxpKXx8e3ZhbHVlOmVbaV19KS5nZXQ/YT11LnNldD90LnN0eWxpemUoIltHZXR0ZXIvU2V0dGVyXSIsInNwZWNpYWwiKTp0LnN0eWxpemUoIltHZXR0ZXJdIiwic3BlY2lhbCIpOnUuc2V0JiYoYT10LnN0eWxpemUoIltTZXR0ZXJdIiwic3BlY2lhbCIpKSxYdChuLGkpfHwocz0iWyIraSsiXSIpLGF8fCh0LnNlZW4uaW5kZXhPZih1LnZhbHVlKTwwPyhhPVd0KHIpP0Z0KHQsdS52YWx1ZSxudWxsKTpGdCh0LHUudmFsdWUsci0xKSkuaW5kZXhPZigiXG4iKT4tMSYmKGE9bz9hLnNwbGl0KCJcbiIpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIiAgIit0fSkpLmpvaW4oIlxuIikuc3Vic3RyKDIpOiJcbiIrYS5zcGxpdCgiXG4iKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiIgICAiK3R9KSkuam9pbigiXG4iKSk6YT10LnN0eWxpemUoIltDaXJjdWxhcl0iLCJzcGVjaWFsIikpLEd0KHMpKXtpZihvJiZpLm1hdGNoKC9eXGQrJC8pKXJldHVybiBhOyhzPUpTT04uc3RyaW5naWZ5KCIiK2kpKS5tYXRjaCgvXiIoW2EtekEtWl9dW2EtekEtWl8wLTldKikiJC8pPyhzPXMuc3Vic3RyKDEscy5sZW5ndGgtMikscz10LnN0eWxpemUocywibmFtZSIpKToocz1zLnJlcGxhY2UoLycvZywiXFwnIikucmVwbGFjZSgvXFwiL2csJyInKS5yZXBsYWNlKC8oXiJ8IiQpL2csIiciKSxzPXQuc3R5bGl6ZShzLCJzdHJpbmciKSl9cmV0dXJuIHMrIjogIithfWZ1bmN0aW9uIFl0KHQpe3JldHVybiJib29sZWFuIj09dHlwZW9mIHR9ZnVuY3Rpb24gV3QodCl7cmV0dXJuIG51bGw9PT10fWZ1bmN0aW9uICR0KHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdH1mdW5jdGlvbiBHdCh0KXtyZXR1cm4gdm9pZCAwPT09dH1mdW5jdGlvbiBKdCh0KXtyZXR1cm4gSHQodCkmJiJbb2JqZWN0IFJlZ0V4cF0iPT09UXQodCl9ZnVuY3Rpb24gSHQodCl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiB0JiZudWxsIT09dH1mdW5jdGlvbiBWdCh0KXtyZXR1cm4gSHQodCkmJiJbb2JqZWN0IERhdGVdIj09PVF0KHQpfWZ1bmN0aW9uIEt0KHQpe3JldHVybiBIdCh0KSYmKCJbb2JqZWN0IEVycm9yXSI9PT1RdCh0KXx8dCBpbnN0YW5jZW9mIEVycm9yKX1mdW5jdGlvbiBadCh0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdH1mdW5jdGlvbiBRdCh0KXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWZ1bmN0aW9uIFh0KHQsZSl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpfWZ1bmN0aW9uIHRlKCl7dGhpcy5oZWFkPW51bGwsdGhpcy50YWlsPW51bGwsdGhpcy5sZW5ndGg9MH1JdC5jb2xvcnM9e2JvbGQ6WzEsMjJdLGl0YWxpYzpbMywyM10sdW5kZXJsaW5lOls0LDI0XSxpbnZlcnNlOls3LDI3XSx3aGl0ZTpbMzcsMzldLGdyZXk6WzkwLDM5XSxibGFjazpbMzAsMzldLGJsdWU6WzM0LDM5XSxjeWFuOlszNiwzOV0sZ3JlZW46WzMyLDM5XSxtYWdlbnRhOlszNSwzOV0scmVkOlszMSwzOV0seWVsbG93OlszMywzOV19LEl0LnN0eWxlcz17c3BlY2lhbDoiY3lhbiIsbnVtYmVyOiJ5ZWxsb3ciLGJvb2xlYW46InllbGxvdyIsdW5kZWZpbmVkOiJncmV5IixudWxsOiJib2xkIixzdHJpbmc6ImdyZWVuIixkYXRlOiJtYWdlbnRhIixyZWdleHA6InJlZCJ9LHRlLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKHQpe3ZhciBlPXtkYXRhOnQsbmV4dDpudWxsfTt0aGlzLmxlbmd0aD4wP3RoaXMudGFpbC5uZXh0PWU6dGhpcy5oZWFkPWUsdGhpcy50YWlsPWUsKyt0aGlzLmxlbmd0aH0sdGUucHJvdG90eXBlLnVuc2hpZnQ9ZnVuY3Rpb24odCl7dmFyIGU9e2RhdGE6dCxuZXh0OnRoaXMuaGVhZH07MD09PXRoaXMubGVuZ3RoJiYodGhpcy50YWlsPWUpLHRoaXMuaGVhZD1lLCsrdGhpcy5sZW5ndGh9LHRlLnByb3RvdHlwZS5zaGlmdD1mdW5jdGlvbigpe2lmKDAhPT10aGlzLmxlbmd0aCl7dmFyIHQ9dGhpcy5oZWFkLmRhdGE7cmV0dXJuIDE9PT10aGlzLmxlbmd0aD90aGlzLmhlYWQ9dGhpcy50YWlsPW51bGw6dGhpcy5oZWFkPXRoaXMuaGVhZC5uZXh0LC0tdGhpcy5sZW5ndGgsdH19LHRlLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuaGVhZD10aGlzLnRhaWw9bnVsbCx0aGlzLmxlbmd0aD0wfSx0ZS5wcm90b3R5cGUuam9pbj1mdW5jdGlvbih0KXtpZigwPT09dGhpcy5sZW5ndGgpcmV0dXJuIiI7Zm9yKHZhciBlPXRoaXMuaGVhZCxyPSIiK2UuZGF0YTtlPWUubmV4dDspcis9dCtlLmRhdGE7cmV0dXJuIHJ9LHRlLnByb3RvdHlwZS5jb25jYXQ9ZnVuY3Rpb24odCl7aWYoMD09PXRoaXMubGVuZ3RoKXJldHVybiBfLmFsbG9jKDApO2lmKDE9PT10aGlzLmxlbmd0aClyZXR1cm4gdGhpcy5oZWFkLmRhdGE7Zm9yKHZhciBlPV8uYWxsb2NVbnNhZmUodD4+PjApLHI9dGhpcy5oZWFkLG49MDtyOylyLmRhdGEuY29weShlLG4pLG4rPXIuZGF0YS5sZW5ndGgscj1yLm5leHQ7cmV0dXJuIGV9O3ZhciBlZT1fLmlzRW5jb2Rpbmd8fGZ1bmN0aW9uKHQpe3N3aXRjaCh0JiZ0LnRvTG93ZXJDYXNlKCkpe2Nhc2UiaGV4IjpjYXNlInV0ZjgiOmNhc2UidXRmLTgiOmNhc2UiYXNjaWkiOmNhc2UiYmluYXJ5IjpjYXNlImJhc2U2NCI6Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOmNhc2UicmF3IjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX07ZnVuY3Rpb24gcmUodCl7c3dpdGNoKHRoaXMuZW5jb2Rpbmc9KHR8fCJ1dGY4IikudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bLV9dLywiIiksZnVuY3Rpb24odCl7aWYodCYmIWVlKHQpKXRocm93IG5ldyBFcnJvcigiVW5rbm93biBlbmNvZGluZzogIit0KX0odCksdGhpcy5lbmNvZGluZyl7Y2FzZSJ1dGY4Ijp0aGlzLnN1cnJvZ2F0ZVNpemU9MzticmVhaztjYXNlInVjczIiOmNhc2UidXRmMTZsZSI6dGhpcy5zdXJyb2dhdGVTaXplPTIsdGhpcy5kZXRlY3RJbmNvbXBsZXRlQ2hhcj1pZTticmVhaztjYXNlImJhc2U2NCI6dGhpcy5zdXJyb2dhdGVTaXplPTMsdGhpcy5kZXRlY3RJbmNvbXBsZXRlQ2hhcj1vZTticmVhaztkZWZhdWx0OnJldHVybiB2b2lkKHRoaXMud3JpdGU9bmUpfXRoaXMuY2hhckJ1ZmZlcj1uZXcgXyg2KSx0aGlzLmNoYXJSZWNlaXZlZD0wLHRoaXMuY2hhckxlbmd0aD0wfWZ1bmN0aW9uIG5lKHQpe3JldHVybiB0LnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcpfWZ1bmN0aW9uIGllKHQpe3RoaXMuY2hhclJlY2VpdmVkPXQubGVuZ3RoJTIsdGhpcy5jaGFyTGVuZ3RoPXRoaXMuY2hhclJlY2VpdmVkPzI6MH1mdW5jdGlvbiBvZSh0KXt0aGlzLmNoYXJSZWNlaXZlZD10Lmxlbmd0aCUzLHRoaXMuY2hhckxlbmd0aD10aGlzLmNoYXJSZWNlaXZlZD8zOjB9cmUucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0iIjt0aGlzLmNoYXJMZW5ndGg7KXt2YXIgcj10Lmxlbmd0aD49dGhpcy5jaGFyTGVuZ3RoLXRoaXMuY2hhclJlY2VpdmVkP3RoaXMuY2hhckxlbmd0aC10aGlzLmNoYXJSZWNlaXZlZDp0Lmxlbmd0aDtpZih0LmNvcHkodGhpcy5jaGFyQnVmZmVyLHRoaXMuY2hhclJlY2VpdmVkLDAsciksdGhpcy5jaGFyUmVjZWl2ZWQrPXIsdGhpcy5jaGFyUmVjZWl2ZWQ8dGhpcy5jaGFyTGVuZ3RoKXJldHVybiIiO2lmKHQ9dC5zbGljZShyLHQubGVuZ3RoKSwhKChpPShlPXRoaXMuY2hhckJ1ZmZlci5zbGljZSgwLHRoaXMuY2hhckxlbmd0aCkudG9TdHJpbmcodGhpcy5lbmNvZGluZykpLmNoYXJDb2RlQXQoZS5sZW5ndGgtMSkpPj01NTI5NiYmaTw9NTYzMTkpKXtpZih0aGlzLmNoYXJSZWNlaXZlZD10aGlzLmNoYXJMZW5ndGg9MCwwPT09dC5sZW5ndGgpcmV0dXJuIGU7YnJlYWt9dGhpcy5jaGFyTGVuZ3RoKz10aGlzLnN1cnJvZ2F0ZVNpemUsZT0iIn10aGlzLmRldGVjdEluY29tcGxldGVDaGFyKHQpO3ZhciBuPXQubGVuZ3RoO3RoaXMuY2hhckxlbmd0aCYmKHQuY29weSh0aGlzLmNoYXJCdWZmZXIsMCx0Lmxlbmd0aC10aGlzLmNoYXJSZWNlaXZlZCxuKSxuLT10aGlzLmNoYXJSZWNlaXZlZCk7dmFyIGk7bj0oZSs9dC50b1N0cmluZyh0aGlzLmVuY29kaW5nLDAsbikpLmxlbmd0aC0xO2lmKChpPWUuY2hhckNvZGVBdChuKSk+PTU1Mjk2JiZpPD01NjMxOSl7dmFyIG89dGhpcy5zdXJyb2dhdGVTaXplO3JldHVybiB0aGlzLmNoYXJMZW5ndGgrPW8sdGhpcy5jaGFyUmVjZWl2ZWQrPW8sdGhpcy5jaGFyQnVmZmVyLmNvcHkodGhpcy5jaGFyQnVmZmVyLG8sMCxvKSx0LmNvcHkodGhpcy5jaGFyQnVmZmVyLDAsMCxvKSxlLnN1YnN0cmluZygwLG4pfXJldHVybiBlfSxyZS5wcm90b3R5cGUuZGV0ZWN0SW5jb21wbGV0ZUNoYXI9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQubGVuZ3RoPj0zPzM6dC5sZW5ndGg7ZT4wO2UtLSl7dmFyIHI9dFt0Lmxlbmd0aC1lXTtpZigxPT1lJiZyPj41PT02KXt0aGlzLmNoYXJMZW5ndGg9MjticmVha31pZihlPD0yJiZyPj40PT0xNCl7dGhpcy5jaGFyTGVuZ3RoPTM7YnJlYWt9aWYoZTw9MyYmcj4+Mz09MzApe3RoaXMuY2hhckxlbmd0aD00O2JyZWFrfX10aGlzLmNoYXJSZWNlaXZlZD1lfSxyZS5wcm90b3R5cGUuZW5kPWZ1bmN0aW9uKHQpe3ZhciBlPSIiO2lmKHQmJnQubGVuZ3RoJiYoZT10aGlzLndyaXRlKHQpKSx0aGlzLmNoYXJSZWNlaXZlZCl7dmFyIHI9dGhpcy5jaGFyUmVjZWl2ZWQsbj10aGlzLmNoYXJCdWZmZXIsaT10aGlzLmVuY29kaW5nO2UrPW4uc2xpY2UoMCxyKS50b1N0cmluZyhpKX1yZXR1cm4gZX0sdWUuUmVhZGFibGVTdGF0ZT1hZTt2YXIgc2U9ZnVuY3Rpb24odCl7aWYoR3QoeHQpJiYoeHQ9THQuZW52Lk5PREVfREVCVUd8fCIiKSx0PXQudG9VcHBlckNhc2UoKSwhVXRbdF0paWYobmV3IFJlZ0V4cCgiXFxiIit0KyJcXGIiLCJpIikudGVzdCh4dCkpe1V0W3RdPWZ1bmN0aW9uKCl7dmFyIGU9TXQuYXBwbHkobnVsbCxhcmd1bWVudHMpO2NvbnNvbGUuZXJyb3IoIiVzICVkOiAlcyIsdCwwLGUpfX1lbHNlIFV0W3RdPWZ1bmN0aW9uKCl7fTtyZXR1cm4gVXRbdF19KCJzdHJlYW0iKTtmdW5jdGlvbiBhZSh0LGUpe3Q9dHx8e30sdGhpcy5vYmplY3RNb2RlPSEhdC5vYmplY3RNb2RlLGUgaW5zdGFuY2VvZiBVZSYmKHRoaXMub2JqZWN0TW9kZT10aGlzLm9iamVjdE1vZGV8fCEhdC5yZWFkYWJsZU9iamVjdE1vZGUpO3ZhciByPXQuaGlnaFdhdGVyTWFyayxuPXRoaXMub2JqZWN0TW9kZT8xNjoxNjM4NDt0aGlzLmhpZ2hXYXRlck1hcms9cnx8MD09PXI/cjpuLHRoaXMuaGlnaFdhdGVyTWFyaz1+fnRoaXMuaGlnaFdhdGVyTWFyayx0aGlzLmJ1ZmZlcj1uZXcgdGUsdGhpcy5sZW5ndGg9MCx0aGlzLnBpcGVzPW51bGwsdGhpcy5waXBlc0NvdW50PTAsdGhpcy5mbG93aW5nPW51bGwsdGhpcy5lbmRlZD0hMSx0aGlzLmVuZEVtaXR0ZWQ9ITEsdGhpcy5yZWFkaW5nPSExLHRoaXMuc3luYz0hMCx0aGlzLm5lZWRSZWFkYWJsZT0hMSx0aGlzLmVtaXR0ZWRSZWFkYWJsZT0hMSx0aGlzLnJlYWRhYmxlTGlzdGVuaW5nPSExLHRoaXMucmVzdW1lU2NoZWR1bGVkPSExLHRoaXMuZGVmYXVsdEVuY29kaW5nPXQuZGVmYXVsdEVuY29kaW5nfHwidXRmOCIsdGhpcy5yYW5PdXQ9ITEsdGhpcy5hd2FpdERyYWluPTAsdGhpcy5yZWFkaW5nTW9yZT0hMSx0aGlzLmRlY29kZXI9bnVsbCx0aGlzLmVuY29kaW5nPW51bGwsdC5lbmNvZGluZyYmKHRoaXMuZGVjb2Rlcj1uZXcgcmUodC5lbmNvZGluZyksdGhpcy5lbmNvZGluZz10LmVuY29kaW5nKX1mdW5jdGlvbiB1ZSh0KXtpZighKHRoaXMgaW5zdGFuY2VvZiB1ZSkpcmV0dXJuIG5ldyB1ZSh0KTt0aGlzLl9yZWFkYWJsZVN0YXRlPW5ldyBhZSh0LHRoaXMpLHRoaXMucmVhZGFibGU9ITAsdCYmImZ1bmN0aW9uIj09dHlwZW9mIHQucmVhZCYmKHRoaXMuX3JlYWQ9dC5yZWFkKSxlLmNhbGwodGhpcyl9ZnVuY3Rpb24gaGUodCxlLHIsbixpKXt2YXIgbz1mdW5jdGlvbih0LGUpe3ZhciByPW51bGw7Xy5pc0J1ZmZlcihlKXx8InN0cmluZyI9PXR5cGVvZiBlfHxudWxsPT1lfHx0Lm9iamVjdE1vZGV8fChyPW5ldyBUeXBlRXJyb3IoIkludmFsaWQgbm9uLXN0cmluZy9idWZmZXIgY2h1bmsiKSk7cmV0dXJuIHJ9KGUscik7aWYobyl0LmVtaXQoImVycm9yIixvKTtlbHNlIGlmKG51bGw9PT1yKWUucmVhZGluZz0hMSxmdW5jdGlvbih0LGUpe2lmKGUuZW5kZWQpcmV0dXJuO2lmKGUuZGVjb2Rlcil7dmFyIHI9ZS5kZWNvZGVyLmVuZCgpO3ImJnIubGVuZ3RoJiYoZS5idWZmZXIucHVzaChyKSxlLmxlbmd0aCs9ZS5vYmplY3RNb2RlPzE6ci5sZW5ndGgpfWUuZW5kZWQ9ITAsbGUodCl9KHQsZSk7ZWxzZSBpZihlLm9iamVjdE1vZGV8fHImJnIubGVuZ3RoPjApaWYoZS5lbmRlZCYmIWkpe3ZhciBzPW5ldyBFcnJvcigic3RyZWFtLnB1c2goKSBhZnRlciBFT0YiKTt0LmVtaXQoImVycm9yIixzKX1lbHNlIGlmKGUuZW5kRW1pdHRlZCYmaSl7dmFyIGE9bmV3IEVycm9yKCJzdHJlYW0udW5zaGlmdCgpIGFmdGVyIGVuZCBldmVudCIpO3QuZW1pdCgiZXJyb3IiLGEpfWVsc2V7dmFyIHU7IWUuZGVjb2Rlcnx8aXx8bnx8KHI9ZS5kZWNvZGVyLndyaXRlKHIpLHU9IWUub2JqZWN0TW9kZSYmMD09PXIubGVuZ3RoKSxpfHwoZS5yZWFkaW5nPSExKSx1fHwoZS5mbG93aW5nJiYwPT09ZS5sZW5ndGgmJiFlLnN5bmM/KHQuZW1pdCgiZGF0YSIsciksdC5yZWFkKDApKTooZS5sZW5ndGgrPWUub2JqZWN0TW9kZT8xOnIubGVuZ3RoLGk/ZS5idWZmZXIudW5zaGlmdChyKTplLmJ1ZmZlci5wdXNoKHIpLGUubmVlZFJlYWRhYmxlJiZsZSh0KSkpLGZ1bmN0aW9uKHQsZSl7ZS5yZWFkaW5nTW9yZXx8KGUucmVhZGluZ01vcmU9ITAseXQoZGUsdCxlKSl9KHQsZSl9ZWxzZSBpfHwoZS5yZWFkaW5nPSExKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIXQuZW5kZWQmJih0Lm5lZWRSZWFkYWJsZXx8dC5sZW5ndGg8dC5oaWdoV2F0ZXJNYXJrfHwwPT09dC5sZW5ndGgpfShlKX1DdCh1ZSxlKSx1ZS5wcm90b3R5cGUucHVzaD1mdW5jdGlvbih0LGUpe3ZhciByPXRoaXMuX3JlYWRhYmxlU3RhdGU7cmV0dXJuIHIub2JqZWN0TW9kZXx8InN0cmluZyIhPXR5cGVvZiB0fHwoZT1lfHxyLmRlZmF1bHRFbmNvZGluZykhPT1yLmVuY29kaW5nJiYodD1fLmZyb20odCxlKSxlPSIiKSxoZSh0aGlzLHIsdCxlLCExKX0sdWUucHJvdG90eXBlLnVuc2hpZnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGhlKHRoaXMsdGhpcy5fcmVhZGFibGVTdGF0ZSx0LCIiLCEwKX0sdWUucHJvdG90eXBlLmlzUGF1c2VkPWZ1bmN0aW9uKCl7cmV0dXJuITE9PT10aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmd9LHVlLnByb3RvdHlwZS5zZXRFbmNvZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5kZWNvZGVyPW5ldyByZSh0KSx0aGlzLl9yZWFkYWJsZVN0YXRlLmVuY29kaW5nPXQsdGhpc307dmFyIGZlPTgzODg2MDg7ZnVuY3Rpb24gY2UodCxlKXtyZXR1cm4gdDw9MHx8MD09PWUubGVuZ3RoJiZlLmVuZGVkPzA6ZS5vYmplY3RNb2RlPzE6dCE9dD9lLmZsb3dpbmcmJmUubGVuZ3RoP2UuYnVmZmVyLmhlYWQuZGF0YS5sZW5ndGg6ZS5sZW5ndGg6KHQ+ZS5oaWdoV2F0ZXJNYXJrJiYoZS5oaWdoV2F0ZXJNYXJrPWZ1bmN0aW9uKHQpe3JldHVybiB0Pj1mZT90PWZlOih0LS0sdHw9dD4+PjEsdHw9dD4+PjIsdHw9dD4+PjQsdHw9dD4+PjgsdHw9dD4+PjE2LHQrKyksdH0odCkpLHQ8PWUubGVuZ3RoP3Q6ZS5lbmRlZD9lLmxlbmd0aDooZS5uZWVkUmVhZGFibGU9ITAsMCkpfWZ1bmN0aW9uIGxlKHQpe3ZhciBlPXQuX3JlYWRhYmxlU3RhdGU7ZS5uZWVkUmVhZGFibGU9ITEsZS5lbWl0dGVkUmVhZGFibGV8fChzZSgiZW1pdFJlYWRhYmxlIixlLmZsb3dpbmcpLGUuZW1pdHRlZFJlYWRhYmxlPSEwLGUuc3luYz95dChwZSx0KTpwZSh0KSl9ZnVuY3Rpb24gcGUodCl7c2UoImVtaXQgcmVhZGFibGUiKSx0LmVtaXQoInJlYWRhYmxlIiksdmUodCl9ZnVuY3Rpb24gZGUodCxlKXtmb3IodmFyIHI9ZS5sZW5ndGg7IWUucmVhZGluZyYmIWUuZmxvd2luZyYmIWUuZW5kZWQmJmUubGVuZ3RoPGUuaGlnaFdhdGVyTWFyayYmKHNlKCJtYXliZVJlYWRNb3JlIHJlYWQgMCIpLHQucmVhZCgwKSxyIT09ZS5sZW5ndGgpOylyPWUubGVuZ3RoO2UucmVhZGluZ01vcmU9ITF9ZnVuY3Rpb24gZ2UodCl7c2UoInJlYWRhYmxlIG5leHR0aWNrIHJlYWQgMCIpLHQucmVhZCgwKX1mdW5jdGlvbiB5ZSh0LGUpe2UucmVhZGluZ3x8KHNlKCJyZXN1bWUgcmVhZCAwIiksdC5yZWFkKDApKSxlLnJlc3VtZVNjaGVkdWxlZD0hMSxlLmF3YWl0RHJhaW49MCx0LmVtaXQoInJlc3VtZSIpLHZlKHQpLGUuZmxvd2luZyYmIWUucmVhZGluZyYmdC5yZWFkKDApfWZ1bmN0aW9uIHZlKHQpe3ZhciBlPXQuX3JlYWRhYmxlU3RhdGU7Zm9yKHNlKCJmbG93IixlLmZsb3dpbmcpO2UuZmxvd2luZyYmbnVsbCE9PXQucmVhZCgpOyk7fWZ1bmN0aW9uIGJlKHQsZSl7cmV0dXJuIDA9PT1lLmxlbmd0aD9udWxsOihlLm9iamVjdE1vZGU/cj1lLmJ1ZmZlci5zaGlmdCgpOiF0fHx0Pj1lLmxlbmd0aD8ocj1lLmRlY29kZXI/ZS5idWZmZXIuam9pbigiIik6MT09PWUuYnVmZmVyLmxlbmd0aD9lLmJ1ZmZlci5oZWFkLmRhdGE6ZS5idWZmZXIuY29uY2F0KGUubGVuZ3RoKSxlLmJ1ZmZlci5jbGVhcigpKTpyPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbjt0PGUuaGVhZC5kYXRhLmxlbmd0aD8obj1lLmhlYWQuZGF0YS5zbGljZSgwLHQpLGUuaGVhZC5kYXRhPWUuaGVhZC5kYXRhLnNsaWNlKHQpKTpuPXQ9PT1lLmhlYWQuZGF0YS5sZW5ndGg/ZS5zaGlmdCgpOnI/ZnVuY3Rpb24odCxlKXt2YXIgcj1lLmhlYWQsbj0xLGk9ci5kYXRhO3QtPWkubGVuZ3RoO2Zvcig7cj1yLm5leHQ7KXt2YXIgbz1yLmRhdGEscz10Pm8ubGVuZ3RoP28ubGVuZ3RoOnQ7aWYocz09PW8ubGVuZ3RoP2krPW86aSs9by5zbGljZSgwLHQpLDA9PT0odC09cykpe3M9PT1vLmxlbmd0aD8oKytuLHIubmV4dD9lLmhlYWQ9ci5uZXh0OmUuaGVhZD1lLnRhaWw9bnVsbCk6KGUuaGVhZD1yLHIuZGF0YT1vLnNsaWNlKHMpKTticmVha30rK259cmV0dXJuIGUubGVuZ3RoLT1uLGl9KHQsZSk6ZnVuY3Rpb24odCxlKXt2YXIgcj1fLmFsbG9jVW5zYWZlKHQpLG49ZS5oZWFkLGk9MTtuLmRhdGEuY29weShyKSx0LT1uLmRhdGEubGVuZ3RoO2Zvcig7bj1uLm5leHQ7KXt2YXIgbz1uLmRhdGEscz10Pm8ubGVuZ3RoP28ubGVuZ3RoOnQ7aWYoby5jb3B5KHIsci5sZW5ndGgtdCwwLHMpLDA9PT0odC09cykpe3M9PT1vLmxlbmd0aD8oKytpLG4ubmV4dD9lLmhlYWQ9bi5uZXh0OmUuaGVhZD1lLnRhaWw9bnVsbCk6KGUuaGVhZD1uLG4uZGF0YT1vLnNsaWNlKHMpKTticmVha30rK2l9cmV0dXJuIGUubGVuZ3RoLT1pLHJ9KHQsZSk7cmV0dXJuIG59KHQsZS5idWZmZXIsZS5kZWNvZGVyKSxyKTt2YXIgcn1mdW5jdGlvbiBtZSh0KXt2YXIgZT10Ll9yZWFkYWJsZVN0YXRlO2lmKGUubGVuZ3RoPjApdGhyb3cgbmV3IEVycm9yKCciZW5kUmVhZGFibGUoKSIgY2FsbGVkIG9uIG5vbi1lbXB0eSBzdHJlYW0nKTtlLmVuZEVtaXR0ZWR8fChlLmVuZGVkPSEwLHl0KHdlLGUsdCkpfWZ1bmN0aW9uIHdlKHQsZSl7dC5lbmRFbWl0dGVkfHwwIT09dC5sZW5ndGh8fCh0LmVuZEVtaXR0ZWQ9ITAsZS5yZWFkYWJsZT0hMSxlLmVtaXQoImVuZCIpKX1mdW5jdGlvbiBfZSh0LGUpe2Zvcih2YXIgcj0wLG49dC5sZW5ndGg7cjxuO3IrKylpZih0W3JdPT09ZSlyZXR1cm4gcjtyZXR1cm4tMX1mdW5jdGlvbiBTZSgpe31mdW5jdGlvbiBFZSh0LGUscil7dGhpcy5jaHVuaz10LHRoaXMuZW5jb2Rpbmc9ZSx0aGlzLmNhbGxiYWNrPXIsdGhpcy5uZXh0PW51bGx9ZnVuY3Rpb24ga2UodCxlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiYnVmZmVyIix7Z2V0OkJ0KChmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldEJ1ZmZlcigpfSksIl93cml0YWJsZVN0YXRlLmJ1ZmZlciBpcyBkZXByZWNhdGVkLiBVc2UgX3dyaXRhYmxlU3RhdGUuZ2V0QnVmZmVyIGluc3RlYWQuIil9KSx0PXR8fHt9LHRoaXMub2JqZWN0TW9kZT0hIXQub2JqZWN0TW9kZSxlIGluc3RhbmNlb2YgVWUmJih0aGlzLm9iamVjdE1vZGU9dGhpcy5vYmplY3RNb2RlfHwhIXQud3JpdGFibGVPYmplY3RNb2RlKTt2YXIgcj10LmhpZ2hXYXRlck1hcmssbj10aGlzLm9iamVjdE1vZGU/MTY6MTYzODQ7dGhpcy5oaWdoV2F0ZXJNYXJrPXJ8fDA9PT1yP3I6bix0aGlzLmhpZ2hXYXRlck1hcms9fn50aGlzLmhpZ2hXYXRlck1hcmssdGhpcy5uZWVkRHJhaW49ITEsdGhpcy5lbmRpbmc9ITEsdGhpcy5lbmRlZD0hMSx0aGlzLmZpbmlzaGVkPSExO3ZhciBpPSExPT09dC5kZWNvZGVTdHJpbmdzO3RoaXMuZGVjb2RlU3RyaW5ncz0haSx0aGlzLmRlZmF1bHRFbmNvZGluZz10LmRlZmF1bHRFbmNvZGluZ3x8InV0ZjgiLHRoaXMubGVuZ3RoPTAsdGhpcy53cml0aW5nPSExLHRoaXMuY29ya2VkPTAsdGhpcy5zeW5jPSEwLHRoaXMuYnVmZmVyUHJvY2Vzc2luZz0hMSx0aGlzLm9ud3JpdGU9ZnVuY3Rpb24odCl7IWZ1bmN0aW9uKHQsZSl7dmFyIHI9dC5fd3JpdGFibGVTdGF0ZSxuPXIuc3luYyxpPXIud3JpdGVjYjtpZihmdW5jdGlvbih0KXt0LndyaXRpbmc9ITEsdC53cml0ZWNiPW51bGwsdC5sZW5ndGgtPXQud3JpdGVsZW4sdC53cml0ZWxlbj0wfShyKSxlKSFmdW5jdGlvbih0LGUscixuLGkpey0tZS5wZW5kaW5nY2Iscj95dChpLG4pOmkobik7dC5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQ9ITAsdC5lbWl0KCJlcnJvciIsbil9KHQscixuLGUsaSk7ZWxzZXt2YXIgbz1qZShyKTtvfHxyLmNvcmtlZHx8ci5idWZmZXJQcm9jZXNzaW5nfHwhci5idWZmZXJlZFJlcXVlc3R8fFRlKHQsciksbj95dChPZSx0LHIsbyxpKTpPZSh0LHIsbyxpKX19KGUsdCl9LHRoaXMud3JpdGVjYj1udWxsLHRoaXMud3JpdGVsZW49MCx0aGlzLmJ1ZmZlcmVkUmVxdWVzdD1udWxsLHRoaXMubGFzdEJ1ZmZlcmVkUmVxdWVzdD1udWxsLHRoaXMucGVuZGluZ2NiPTAsdGhpcy5wcmVmaW5pc2hlZD0hMSx0aGlzLmVycm9yRW1pdHRlZD0hMSx0aGlzLmJ1ZmZlcmVkUmVxdWVzdENvdW50PTAsdGhpcy5jb3JrZWRSZXF1ZXN0c0ZyZWU9bmV3IFBlKHRoaXMpfWZ1bmN0aW9uIFJlKHQpe2lmKCEodGhpcyBpbnN0YW5jZW9mIFJlfHx0aGlzIGluc3RhbmNlb2YgVWUpKXJldHVybiBuZXcgUmUodCk7dGhpcy5fd3JpdGFibGVTdGF0ZT1uZXcga2UodCx0aGlzKSx0aGlzLndyaXRhYmxlPSEwLHQmJigiZnVuY3Rpb24iPT10eXBlb2YgdC53cml0ZSYmKHRoaXMuX3dyaXRlPXQud3JpdGUpLCJmdW5jdGlvbiI9PXR5cGVvZiB0LndyaXRldiYmKHRoaXMuX3dyaXRldj10LndyaXRldikpLGUuY2FsbCh0aGlzKX1mdW5jdGlvbiBBZSh0LGUscixuLGksbyxzKXtlLndyaXRlbGVuPW4sZS53cml0ZWNiPXMsZS53cml0aW5nPSEwLGUuc3luYz0hMCxyP3QuX3dyaXRldihpLGUub253cml0ZSk6dC5fd3JpdGUoaSxvLGUub253cml0ZSksZS5zeW5jPSExfWZ1bmN0aW9uIE9lKHQsZSxyLG4pe3J8fGZ1bmN0aW9uKHQsZSl7MD09PWUubGVuZ3RoJiZlLm5lZWREcmFpbiYmKGUubmVlZERyYWluPSExLHQuZW1pdCgiZHJhaW4iKSl9KHQsZSksZS5wZW5kaW5nY2ItLSxuKCksQ2UodCxlKX1mdW5jdGlvbiBUZSh0LGUpe2UuYnVmZmVyUHJvY2Vzc2luZz0hMDt2YXIgcj1lLmJ1ZmZlcmVkUmVxdWVzdDtpZih0Ll93cml0ZXYmJnImJnIubmV4dCl7dmFyIG49ZS5idWZmZXJlZFJlcXVlc3RDb3VudCxpPW5ldyBBcnJheShuKSxvPWUuY29ya2VkUmVxdWVzdHNGcmVlO28uZW50cnk9cjtmb3IodmFyIHM9MDtyOylpW3NdPXIscj1yLm5leHQscys9MTtBZSh0LGUsITAsZS5sZW5ndGgsaSwiIixvLmZpbmlzaCksZS5wZW5kaW5nY2IrKyxlLmxhc3RCdWZmZXJlZFJlcXVlc3Q9bnVsbCxvLm5leHQ/KGUuY29ya2VkUmVxdWVzdHNGcmVlPW8ubmV4dCxvLm5leHQ9bnVsbCk6ZS5jb3JrZWRSZXF1ZXN0c0ZyZWU9bmV3IFBlKGUpfWVsc2V7Zm9yKDtyOyl7dmFyIGE9ci5jaHVuayx1PXIuZW5jb2RpbmcsaD1yLmNhbGxiYWNrO2lmKEFlKHQsZSwhMSxlLm9iamVjdE1vZGU/MTphLmxlbmd0aCxhLHUsaCkscj1yLm5leHQsZS53cml0aW5nKWJyZWFrfW51bGw9PT1yJiYoZS5sYXN0QnVmZmVyZWRSZXF1ZXN0PW51bGwpfWUuYnVmZmVyZWRSZXF1ZXN0Q291bnQ9MCxlLmJ1ZmZlcmVkUmVxdWVzdD1yLGUuYnVmZmVyUHJvY2Vzc2luZz0hMX1mdW5jdGlvbiBqZSh0KXtyZXR1cm4gdC5lbmRpbmcmJjA9PT10Lmxlbmd0aCYmbnVsbD09PXQuYnVmZmVyZWRSZXF1ZXN0JiYhdC5maW5pc2hlZCYmIXQud3JpdGluZ31mdW5jdGlvbiBMZSh0LGUpe2UucHJlZmluaXNoZWR8fChlLnByZWZpbmlzaGVkPSEwLHQuZW1pdCgicHJlZmluaXNoIikpfWZ1bmN0aW9uIENlKHQsZSl7dmFyIHI9amUoZSk7cmV0dXJuIHImJigwPT09ZS5wZW5kaW5nY2I/KExlKHQsZSksZS5maW5pc2hlZD0hMCx0LmVtaXQoImZpbmlzaCIpKTpMZSh0LGUpKSxyfWZ1bmN0aW9uIFBlKHQpe3ZhciBlPXRoaXM7dGhpcy5uZXh0PW51bGwsdGhpcy5lbnRyeT1udWxsLHRoaXMuZmluaXNoPWZ1bmN0aW9uKHIpe3ZhciBuPWUuZW50cnk7Zm9yKGUuZW50cnk9bnVsbDtuOyl7dmFyIGk9bi5jYWxsYmFjazt0LnBlbmRpbmdjYi0tLGkociksbj1uLm5leHR9dC5jb3JrZWRSZXF1ZXN0c0ZyZWU/dC5jb3JrZWRSZXF1ZXN0c0ZyZWUubmV4dD1lOnQuY29ya2VkUmVxdWVzdHNGcmVlPWV9fXVlLnByb3RvdHlwZS5yZWFkPWZ1bmN0aW9uKHQpe3NlKCJyZWFkIix0KSx0PXBhcnNlSW50KHQsMTApO3ZhciBlPXRoaXMuX3JlYWRhYmxlU3RhdGUscj10O2lmKDAhPT10JiYoZS5lbWl0dGVkUmVhZGFibGU9ITEpLDA9PT10JiZlLm5lZWRSZWFkYWJsZSYmKGUubGVuZ3RoPj1lLmhpZ2hXYXRlck1hcmt8fGUuZW5kZWQpKXJldHVybiBzZSgicmVhZDogZW1pdFJlYWRhYmxlIixlLmxlbmd0aCxlLmVuZGVkKSwwPT09ZS5sZW5ndGgmJmUuZW5kZWQ/bWUodGhpcyk6bGUodGhpcyksbnVsbDtpZigwPT09KHQ9Y2UodCxlKSkmJmUuZW5kZWQpcmV0dXJuIDA9PT1lLmxlbmd0aCYmbWUodGhpcyksbnVsbDt2YXIgbixpPWUubmVlZFJlYWRhYmxlO3JldHVybiBzZSgibmVlZCByZWFkYWJsZSIsaSksKDA9PT1lLmxlbmd0aHx8ZS5sZW5ndGgtdDxlLmhpZ2hXYXRlck1hcmspJiZzZSgibGVuZ3RoIGxlc3MgdGhhbiB3YXRlcm1hcmsiLGk9ITApLGUuZW5kZWR8fGUucmVhZGluZz9zZSgicmVhZGluZyBvciBlbmRlZCIsaT0hMSk6aSYmKHNlKCJkbyByZWFkIiksZS5yZWFkaW5nPSEwLGUuc3luYz0hMCwwPT09ZS5sZW5ndGgmJihlLm5lZWRSZWFkYWJsZT0hMCksdGhpcy5fcmVhZChlLmhpZ2hXYXRlck1hcmspLGUuc3luYz0hMSxlLnJlYWRpbmd8fCh0PWNlKHIsZSkpKSxudWxsPT09KG49dD4wP2JlKHQsZSk6bnVsbCk/KGUubmVlZFJlYWRhYmxlPSEwLHQ9MCk6ZS5sZW5ndGgtPXQsMD09PWUubGVuZ3RoJiYoZS5lbmRlZHx8KGUubmVlZFJlYWRhYmxlPSEwKSxyIT09dCYmZS5lbmRlZCYmbWUodGhpcykpLG51bGwhPT1uJiZ0aGlzLmVtaXQoImRhdGEiLG4pLG59LHVlLnByb3RvdHlwZS5fcmVhZD1mdW5jdGlvbih0KXt0aGlzLmVtaXQoImVycm9yIixuZXcgRXJyb3IoIm5vdCBpbXBsZW1lbnRlZCIpKX0sdWUucHJvdG90eXBlLnBpcGU9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLG49dGhpcy5fcmVhZGFibGVTdGF0ZTtzd2l0Y2gobi5waXBlc0NvdW50KXtjYXNlIDA6bi5waXBlcz10O2JyZWFrO2Nhc2UgMTpuLnBpcGVzPVtuLnBpcGVzLHRdO2JyZWFrO2RlZmF1bHQ6bi5waXBlcy5wdXNoKHQpfW4ucGlwZXNDb3VudCs9MSxzZSgicGlwZSBjb3VudD0lZCBvcHRzPSVqIixuLnBpcGVzQ291bnQsZSk7dmFyIGk9IWV8fCExIT09ZS5lbmQ/czpoO2Z1bmN0aW9uIG8odCl7c2UoIm9udW5waXBlIiksdD09PXImJmgoKX1mdW5jdGlvbiBzKCl7c2UoIm9uZW5kIiksdC5lbmQoKX1uLmVuZEVtaXR0ZWQ/eXQoaSk6ci5vbmNlKCJlbmQiLGkpLHQub24oInVucGlwZSIsbyk7dmFyIGE9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9dC5fcmVhZGFibGVTdGF0ZTtzZSgicGlwZU9uRHJhaW4iLGUuYXdhaXREcmFpbiksZS5hd2FpdERyYWluJiZlLmF3YWl0RHJhaW4tLSwwPT09ZS5hd2FpdERyYWluJiZ0Lmxpc3RlbmVycygiZGF0YSIpLmxlbmd0aCYmKGUuZmxvd2luZz0hMCx2ZSh0KSl9fShyKTt0Lm9uKCJkcmFpbiIsYSk7dmFyIHU9ITE7ZnVuY3Rpb24gaCgpe3NlKCJjbGVhbnVwIiksdC5yZW1vdmVMaXN0ZW5lcigiY2xvc2UiLHApLHQucmVtb3ZlTGlzdGVuZXIoImZpbmlzaCIsZCksdC5yZW1vdmVMaXN0ZW5lcigiZHJhaW4iLGEpLHQucmVtb3ZlTGlzdGVuZXIoImVycm9yIixsKSx0LnJlbW92ZUxpc3RlbmVyKCJ1bnBpcGUiLG8pLHIucmVtb3ZlTGlzdGVuZXIoImVuZCIscyksci5yZW1vdmVMaXN0ZW5lcigiZW5kIixoKSxyLnJlbW92ZUxpc3RlbmVyKCJkYXRhIixjKSx1PSEwLCFuLmF3YWl0RHJhaW58fHQuX3dyaXRhYmxlU3RhdGUmJiF0Ll93cml0YWJsZVN0YXRlLm5lZWREcmFpbnx8YSgpfXZhciBmPSExO2Z1bmN0aW9uIGMoZSl7c2UoIm9uZGF0YSIpLGY9ITEsITEhPT10LndyaXRlKGUpfHxmfHwoKDE9PT1uLnBpcGVzQ291bnQmJm4ucGlwZXM9PT10fHxuLnBpcGVzQ291bnQ+MSYmLTEhPT1fZShuLnBpcGVzLHQpKSYmIXUmJihzZSgiZmFsc2Ugd3JpdGUgcmVzcG9uc2UsIHBhdXNlIixyLl9yZWFkYWJsZVN0YXRlLmF3YWl0RHJhaW4pLHIuX3JlYWRhYmxlU3RhdGUuYXdhaXREcmFpbisrLGY9ITApLHIucGF1c2UoKSl9ZnVuY3Rpb24gbChlKXt2YXIgcjtzZSgib25lcnJvciIsZSksZygpLHQucmVtb3ZlTGlzdGVuZXIoImVycm9yIixsKSwwPT09KHI9ImVycm9yIix0Lmxpc3RlbmVycyhyKS5sZW5ndGgpJiZ0LmVtaXQoImVycm9yIixlKX1mdW5jdGlvbiBwKCl7dC5yZW1vdmVMaXN0ZW5lcigiZmluaXNoIixkKSxnKCl9ZnVuY3Rpb24gZCgpe3NlKCJvbmZpbmlzaCIpLHQucmVtb3ZlTGlzdGVuZXIoImNsb3NlIixwKSxnKCl9ZnVuY3Rpb24gZygpe3NlKCJ1bnBpcGUiKSxyLnVucGlwZSh0KX1yZXR1cm4gci5vbigiZGF0YSIsYyksZnVuY3Rpb24odCxlLHIpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB0LnByZXBlbmRMaXN0ZW5lcilyZXR1cm4gdC5wcmVwZW5kTGlzdGVuZXIoZSxyKTt0Ll9ldmVudHMmJnQuX2V2ZW50c1tlXT9BcnJheS5pc0FycmF5KHQuX2V2ZW50c1tlXSk/dC5fZXZlbnRzW2VdLnVuc2hpZnQocik6dC5fZXZlbnRzW2VdPVtyLHQuX2V2ZW50c1tlXV06dC5vbihlLHIpfSh0LCJlcnJvciIsbCksdC5vbmNlKCJjbG9zZSIscCksdC5vbmNlKCJmaW5pc2giLGQpLHQuZW1pdCgicGlwZSIsciksbi5mbG93aW5nfHwoc2UoInBpcGUgcmVzdW1lIiksci5yZXN1bWUoKSksdH0sdWUucHJvdG90eXBlLnVucGlwZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9yZWFkYWJsZVN0YXRlO2lmKDA9PT1lLnBpcGVzQ291bnQpcmV0dXJuIHRoaXM7aWYoMT09PWUucGlwZXNDb3VudClyZXR1cm4gdCYmdCE9PWUucGlwZXN8fCh0fHwodD1lLnBpcGVzKSxlLnBpcGVzPW51bGwsZS5waXBlc0NvdW50PTAsZS5mbG93aW5nPSExLHQmJnQuZW1pdCgidW5waXBlIix0aGlzKSksdGhpcztpZighdCl7dmFyIHI9ZS5waXBlcyxuPWUucGlwZXNDb3VudDtlLnBpcGVzPW51bGwsZS5waXBlc0NvdW50PTAsZS5mbG93aW5nPSExO2Zvcih2YXIgaT0wO2k8bjtpKyspcltpXS5lbWl0KCJ1bnBpcGUiLHRoaXMpO3JldHVybiB0aGlzfXZhciBvPV9lKGUucGlwZXMsdCk7cmV0dXJuLTE9PT1vfHwoZS5waXBlcy5zcGxpY2UobywxKSxlLnBpcGVzQ291bnQtPTEsMT09PWUucGlwZXNDb3VudCYmKGUucGlwZXM9ZS5waXBlc1swXSksdC5lbWl0KCJ1bnBpcGUiLHRoaXMpKSx0aGlzfSx1ZS5wcm90b3R5cGUub249ZnVuY3Rpb24odCxyKXt2YXIgbj1lLnByb3RvdHlwZS5vbi5jYWxsKHRoaXMsdCxyKTtpZigiZGF0YSI9PT10KSExIT09dGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nJiZ0aGlzLnJlc3VtZSgpO2Vsc2UgaWYoInJlYWRhYmxlIj09PXQpe3ZhciBpPXRoaXMuX3JlYWRhYmxlU3RhdGU7aS5lbmRFbWl0dGVkfHxpLnJlYWRhYmxlTGlzdGVuaW5nfHwoaS5yZWFkYWJsZUxpc3RlbmluZz1pLm5lZWRSZWFkYWJsZT0hMCxpLmVtaXR0ZWRSZWFkYWJsZT0hMSxpLnJlYWRpbmc/aS5sZW5ndGgmJmxlKHRoaXMpOnl0KGdlLHRoaXMpKX1yZXR1cm4gbn0sdWUucHJvdG90eXBlLmFkZExpc3RlbmVyPXVlLnByb3RvdHlwZS5vbix1ZS5wcm90b3R5cGUucmVzdW1lPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fcmVhZGFibGVTdGF0ZTtyZXR1cm4gdC5mbG93aW5nfHwoc2UoInJlc3VtZSIpLHQuZmxvd2luZz0hMCxmdW5jdGlvbih0LGUpe2UucmVzdW1lU2NoZWR1bGVkfHwoZS5yZXN1bWVTY2hlZHVsZWQ9ITAseXQoeWUsdCxlKSl9KHRoaXMsdCkpLHRoaXN9LHVlLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbigpe3JldHVybiBzZSgiY2FsbCBwYXVzZSBmbG93aW5nPSVqIix0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcpLCExIT09dGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nJiYoc2UoInBhdXNlIiksdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nPSExLHRoaXMuZW1pdCgicGF1c2UiKSksdGhpc30sdWUucHJvdG90eXBlLndyYXA9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fcmVhZGFibGVTdGF0ZSxyPSExLG49dGhpcztmb3IodmFyIGkgaW4gdC5vbigiZW5kIiwoZnVuY3Rpb24oKXtpZihzZSgid3JhcHBlZCBlbmQiKSxlLmRlY29kZXImJiFlLmVuZGVkKXt2YXIgdD1lLmRlY29kZXIuZW5kKCk7dCYmdC5sZW5ndGgmJm4ucHVzaCh0KX1uLnB1c2gobnVsbCl9KSksdC5vbigiZGF0YSIsKGZ1bmN0aW9uKGkpeyhzZSgid3JhcHBlZCBkYXRhIiksZS5kZWNvZGVyJiYoaT1lLmRlY29kZXIud3JpdGUoaSkpLGUub2JqZWN0TW9kZSYmbnVsbD09aSl8fChlLm9iamVjdE1vZGV8fGkmJmkubGVuZ3RoKSYmKG4ucHVzaChpKXx8KHI9ITAsdC5wYXVzZSgpKSl9KSksdCl2b2lkIDA9PT10aGlzW2ldJiYiZnVuY3Rpb24iPT10eXBlb2YgdFtpXSYmKHRoaXNbaV09ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHRbZV0uYXBwbHkodCxhcmd1bWVudHMpfX0oaSkpO3JldHVybiBmdW5jdGlvbih0LGUpe2Zvcih2YXIgcj0wLG49dC5sZW5ndGg7cjxuO3IrKyllKHRbcl0scil9KFsiZXJyb3IiLCJjbG9zZSIsImRlc3Ryb3kiLCJwYXVzZSIsInJlc3VtZSJdLChmdW5jdGlvbihlKXt0Lm9uKGUsbi5lbWl0LmJpbmQobixlKSl9KSksbi5fcmVhZD1mdW5jdGlvbihlKXtzZSgid3JhcHBlZCBfcmVhZCIsZSksciYmKHI9ITEsdC5yZXN1bWUoKSl9LG59LHVlLl9mcm9tTGlzdD1iZSxSZS5Xcml0YWJsZVN0YXRlPWtlLEN0KFJlLGUpLGtlLnByb3RvdHlwZS5nZXRCdWZmZXI9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5idWZmZXJlZFJlcXVlc3QsZT1bXTt0OyllLnB1c2godCksdD10Lm5leHQ7cmV0dXJuIGV9LFJlLnByb3RvdHlwZS5waXBlPWZ1bmN0aW9uKCl7dGhpcy5lbWl0KCJlcnJvciIsbmV3IEVycm9yKCJDYW5ub3QgcGlwZSwgbm90IHJlYWRhYmxlIikpfSxSZS5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPXRoaXMuX3dyaXRhYmxlU3RhdGUsaT0hMTtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZSYmKHI9ZSxlPW51bGwpLF8uaXNCdWZmZXIodCk/ZT0iYnVmZmVyIjplfHwoZT1uLmRlZmF1bHRFbmNvZGluZyksImZ1bmN0aW9uIiE9dHlwZW9mIHImJihyPVNlKSxuLmVuZGVkP2Z1bmN0aW9uKHQsZSl7dmFyIHI9bmV3IEVycm9yKCJ3cml0ZSBhZnRlciBlbmQiKTt0LmVtaXQoImVycm9yIixyKSx5dChlLHIpfSh0aGlzLHIpOmZ1bmN0aW9uKHQsZSxyLG4pe3ZhciBpPSEwLG89ITE7cmV0dXJuIG51bGw9PT1yP289bmV3IFR5cGVFcnJvcigiTWF5IG5vdCB3cml0ZSBudWxsIHZhbHVlcyB0byBzdHJlYW0iKTpfLmlzQnVmZmVyKHIpfHwic3RyaW5nIj09dHlwZW9mIHJ8fHZvaWQgMD09PXJ8fGUub2JqZWN0TW9kZXx8KG89bmV3IFR5cGVFcnJvcigiSW52YWxpZCBub24tc3RyaW5nL2J1ZmZlciBjaHVuayIpKSxvJiYodC5lbWl0KCJlcnJvciIsbykseXQobixvKSxpPSExKSxpfSh0aGlzLG4sdCxyKSYmKG4ucGVuZGluZ2NiKyssaT1mdW5jdGlvbih0LGUscixuLGkpe3I9ZnVuY3Rpb24odCxlLHIpe3Qub2JqZWN0TW9kZXx8ITE9PT10LmRlY29kZVN0cmluZ3N8fCJzdHJpbmciIT10eXBlb2YgZXx8KGU9Xy5mcm9tKGUscikpO3JldHVybiBlfShlLHIsbiksXy5pc0J1ZmZlcihyKSYmKG49ImJ1ZmZlciIpO3ZhciBvPWUub2JqZWN0TW9kZT8xOnIubGVuZ3RoO2UubGVuZ3RoKz1vO3ZhciBzPWUubGVuZ3RoPGUuaGlnaFdhdGVyTWFyaztzfHwoZS5uZWVkRHJhaW49ITApO2lmKGUud3JpdGluZ3x8ZS5jb3JrZWQpe3ZhciBhPWUubGFzdEJ1ZmZlcmVkUmVxdWVzdDtlLmxhc3RCdWZmZXJlZFJlcXVlc3Q9bmV3IEVlKHIsbixpKSxhP2EubmV4dD1lLmxhc3RCdWZmZXJlZFJlcXVlc3Q6ZS5idWZmZXJlZFJlcXVlc3Q9ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0LGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQrPTF9ZWxzZSBBZSh0LGUsITEsbyxyLG4saSk7cmV0dXJuIHN9KHRoaXMsbix0LGUscikpLGl9LFJlLnByb3RvdHlwZS5jb3JrPWZ1bmN0aW9uKCl7dGhpcy5fd3JpdGFibGVTdGF0ZS5jb3JrZWQrK30sUmUucHJvdG90eXBlLnVuY29yaz1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX3dyaXRhYmxlU3RhdGU7dC5jb3JrZWQmJih0LmNvcmtlZC0tLHQud3JpdGluZ3x8dC5jb3JrZWR8fHQuZmluaXNoZWR8fHQuYnVmZmVyUHJvY2Vzc2luZ3x8IXQuYnVmZmVyZWRSZXF1ZXN0fHxUZSh0aGlzLHQpKX0sUmUucHJvdG90eXBlLnNldERlZmF1bHRFbmNvZGluZz1mdW5jdGlvbih0KXtpZigic3RyaW5nIj09dHlwZW9mIHQmJih0PXQudG9Mb3dlckNhc2UoKSksIShbImhleCIsInV0ZjgiLCJ1dGYtOCIsImFzY2lpIiwiYmluYXJ5IiwiYmFzZTY0IiwidWNzMiIsInVjcy0yIiwidXRmMTZsZSIsInV0Zi0xNmxlIiwicmF3Il0uaW5kZXhPZigodCsiIikudG9Mb3dlckNhc2UoKSk+LTEpKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrdCk7cmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVmYXVsdEVuY29kaW5nPXQsdGhpc30sUmUucHJvdG90eXBlLl93cml0ZT1mdW5jdGlvbih0LGUscil7cihuZXcgRXJyb3IoIm5vdCBpbXBsZW1lbnRlZCIpKX0sUmUucHJvdG90eXBlLl93cml0ZXY9bnVsbCxSZS5wcm90b3R5cGUuZW5kPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj10aGlzLl93cml0YWJsZVN0YXRlOyJmdW5jdGlvbiI9PXR5cGVvZiB0PyhyPXQsdD1udWxsLGU9bnVsbCk6ImZ1bmN0aW9uIj09dHlwZW9mIGUmJihyPWUsZT1udWxsKSxudWxsIT10JiZ0aGlzLndyaXRlKHQsZSksbi5jb3JrZWQmJihuLmNvcmtlZD0xLHRoaXMudW5jb3JrKCkpLG4uZW5kaW5nfHxuLmZpbmlzaGVkfHxmdW5jdGlvbih0LGUscil7ZS5lbmRpbmc9ITAsQ2UodCxlKSxyJiYoZS5maW5pc2hlZD95dChyKTp0Lm9uY2UoImZpbmlzaCIscikpO2UuZW5kZWQ9ITAsdC53cml0YWJsZT0hMX0odGhpcyxuLHIpfSxDdChVZSx1ZSk7Zm9yKHZhciBNZT1PYmplY3Qua2V5cyhSZS5wcm90b3R5cGUpLEJlPTA7QmU8TWUubGVuZ3RoO0JlKyspe3ZhciB4ZT1NZVtCZV07VWUucHJvdG90eXBlW3hlXXx8KFVlLnByb3RvdHlwZVt4ZV09UmUucHJvdG90eXBlW3hlXSl9ZnVuY3Rpb24gVWUodCl7aWYoISh0aGlzIGluc3RhbmNlb2YgVWUpKXJldHVybiBuZXcgVWUodCk7dWUuY2FsbCh0aGlzLHQpLFJlLmNhbGwodGhpcyx0KSx0JiYhMT09PXQucmVhZGFibGUmJih0aGlzLnJlYWRhYmxlPSExKSx0JiYhMT09PXQud3JpdGFibGUmJih0aGlzLndyaXRhYmxlPSExKSx0aGlzLmFsbG93SGFsZk9wZW49ITAsdCYmITE9PT10LmFsbG93SGFsZk9wZW4mJih0aGlzLmFsbG93SGFsZk9wZW49ITEpLHRoaXMub25jZSgiZW5kIixJZSl9ZnVuY3Rpb24gSWUoKXt0aGlzLmFsbG93SGFsZk9wZW58fHRoaXMuX3dyaXRhYmxlU3RhdGUuZW5kZWR8fHl0KERlLHRoaXMpfWZ1bmN0aW9uIERlKHQpe3QuZW5kKCl9ZnVuY3Rpb24gTmUodCl7dGhpcy5hZnRlclRyYW5zZm9ybT1mdW5jdGlvbihlLHIpe3JldHVybiBmdW5jdGlvbih0LGUscil7dmFyIG49dC5fdHJhbnNmb3JtU3RhdGU7bi50cmFuc2Zvcm1pbmc9ITE7dmFyIGk9bi53cml0ZWNiO2lmKCFpKXJldHVybiB0LmVtaXQoImVycm9yIixuZXcgRXJyb3IoIm5vIHdyaXRlY2IgaW4gVHJhbnNmb3JtIGNsYXNzIikpO24ud3JpdGVjaHVuaz1udWxsLG4ud3JpdGVjYj1udWxsLG51bGwhPXImJnQucHVzaChyKTtpKGUpO3ZhciBvPXQuX3JlYWRhYmxlU3RhdGU7by5yZWFkaW5nPSExLChvLm5lZWRSZWFkYWJsZXx8by5sZW5ndGg8by5oaWdoV2F0ZXJNYXJrKSYmdC5fcmVhZChvLmhpZ2hXYXRlck1hcmspfSh0LGUscil9LHRoaXMubmVlZFRyYW5zZm9ybT0hMSx0aGlzLnRyYW5zZm9ybWluZz0hMSx0aGlzLndyaXRlY2I9bnVsbCx0aGlzLndyaXRlY2h1bms9bnVsbCx0aGlzLndyaXRlZW5jb2Rpbmc9bnVsbH1mdW5jdGlvbiBGZSh0KXtpZighKHRoaXMgaW5zdGFuY2VvZiBGZSkpcmV0dXJuIG5ldyBGZSh0KTtVZS5jYWxsKHRoaXMsdCksdGhpcy5fdHJhbnNmb3JtU3RhdGU9bmV3IE5lKHRoaXMpO3ZhciBlPXRoaXM7dGhpcy5fcmVhZGFibGVTdGF0ZS5uZWVkUmVhZGFibGU9ITAsdGhpcy5fcmVhZGFibGVTdGF0ZS5zeW5jPSExLHQmJigiZnVuY3Rpb24iPT10eXBlb2YgdC50cmFuc2Zvcm0mJih0aGlzLl90cmFuc2Zvcm09dC50cmFuc2Zvcm0pLCJmdW5jdGlvbiI9PXR5cGVvZiB0LmZsdXNoJiYodGhpcy5fZmx1c2g9dC5mbHVzaCkpLHRoaXMub25jZSgicHJlZmluaXNoIiwoZnVuY3Rpb24oKXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5fZmx1c2g/dGhpcy5fZmx1c2goKGZ1bmN0aW9uKHQpe3plKGUsdCl9KSk6emUoZSl9KSl9ZnVuY3Rpb24gemUodCxlKXtpZihlKXJldHVybiB0LmVtaXQoImVycm9yIixlKTt2YXIgcj10Ll93cml0YWJsZVN0YXRlLG49dC5fdHJhbnNmb3JtU3RhdGU7aWYoci5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJDYWxsaW5nIHRyYW5zZm9ybSBkb25lIHdoZW4gd3MubGVuZ3RoICE9IDAiKTtpZihuLnRyYW5zZm9ybWluZyl0aHJvdyBuZXcgRXJyb3IoIkNhbGxpbmcgdHJhbnNmb3JtIGRvbmUgd2hlbiBzdGlsbCB0cmFuc2Zvcm1pbmciKTtyZXR1cm4gdC5wdXNoKG51bGwpfWZ1bmN0aW9uIHFlKHQpe2lmKCEodGhpcyBpbnN0YW5jZW9mIHFlKSlyZXR1cm4gbmV3IHFlKHQpO0ZlLmNhbGwodGhpcyx0KX1mdW5jdGlvbiBZZSgpe2UuY2FsbCh0aGlzKX1DdChGZSxVZSksRmUucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fdHJhbnNmb3JtU3RhdGUubmVlZFRyYW5zZm9ybT0hMSxVZS5wcm90b3R5cGUucHVzaC5jYWxsKHRoaXMsdCxlKX0sRmUucHJvdG90eXBlLl90cmFuc2Zvcm09ZnVuY3Rpb24odCxlLHIpe3Rocm93IG5ldyBFcnJvcigiTm90IGltcGxlbWVudGVkIil9LEZlLnByb3RvdHlwZS5fd3JpdGU9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPXRoaXMuX3RyYW5zZm9ybVN0YXRlO2lmKG4ud3JpdGVjYj1yLG4ud3JpdGVjaHVuaz10LG4ud3JpdGVlbmNvZGluZz1lLCFuLnRyYW5zZm9ybWluZyl7dmFyIGk9dGhpcy5fcmVhZGFibGVTdGF0ZTsobi5uZWVkVHJhbnNmb3JtfHxpLm5lZWRSZWFkYWJsZXx8aS5sZW5ndGg8aS5oaWdoV2F0ZXJNYXJrKSYmdGhpcy5fcmVhZChpLmhpZ2hXYXRlck1hcmspfX0sRmUucHJvdG90eXBlLl9yZWFkPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3RyYW5zZm9ybVN0YXRlO251bGwhPT1lLndyaXRlY2h1bmsmJmUud3JpdGVjYiYmIWUudHJhbnNmb3JtaW5nPyhlLnRyYW5zZm9ybWluZz0hMCx0aGlzLl90cmFuc2Zvcm0oZS53cml0ZWNodW5rLGUud3JpdGVlbmNvZGluZyxlLmFmdGVyVHJhbnNmb3JtKSk6ZS5uZWVkVHJhbnNmb3JtPSEwfSxDdChxZSxGZSkscWUucHJvdG90eXBlLl90cmFuc2Zvcm09ZnVuY3Rpb24odCxlLHIpe3IobnVsbCx0KX0sQ3QoWWUsZSksWWUuUmVhZGFibGU9dWUsWWUuV3JpdGFibGU9UmUsWWUuRHVwbGV4PVVlLFllLlRyYW5zZm9ybT1GZSxZZS5QYXNzVGhyb3VnaD1xZSxZZS5TdHJlYW09WWUsWWUucHJvdG90eXBlLnBpcGU9ZnVuY3Rpb24odCxyKXt2YXIgbj10aGlzO2Z1bmN0aW9uIGkoZSl7dC53cml0YWJsZSYmITE9PT10LndyaXRlKGUpJiZuLnBhdXNlJiZuLnBhdXNlKCl9ZnVuY3Rpb24gbygpe24ucmVhZGFibGUmJm4ucmVzdW1lJiZuLnJlc3VtZSgpfW4ub24oImRhdGEiLGkpLHQub24oImRyYWluIixvKSx0Ll9pc1N0ZGlvfHxyJiYhMT09PXIuZW5kfHwobi5vbigiZW5kIixhKSxuLm9uKCJjbG9zZSIsdSkpO3ZhciBzPSExO2Z1bmN0aW9uIGEoKXtzfHwocz0hMCx0LmVuZCgpKX1mdW5jdGlvbiB1KCl7c3x8KHM9ITAsImZ1bmN0aW9uIj09dHlwZW9mIHQuZGVzdHJveSYmdC5kZXN0cm95KCkpfWZ1bmN0aW9uIGgodCl7aWYoZigpLDA9PT1lLmxpc3RlbmVyQ291bnQodGhpcywiZXJyb3IiKSl0aHJvdyB0fWZ1bmN0aW9uIGYoKXtuLnJlbW92ZUxpc3RlbmVyKCJkYXRhIixpKSx0LnJlbW92ZUxpc3RlbmVyKCJkcmFpbiIsbyksbi5yZW1vdmVMaXN0ZW5lcigiZW5kIixhKSxuLnJlbW92ZUxpc3RlbmVyKCJjbG9zZSIsdSksbi5yZW1vdmVMaXN0ZW5lcigiZXJyb3IiLGgpLHQucmVtb3ZlTGlzdGVuZXIoImVycm9yIixoKSxuLnJlbW92ZUxpc3RlbmVyKCJlbmQiLGYpLG4ucmVtb3ZlTGlzdGVuZXIoImNsb3NlIixmKSx0LnJlbW92ZUxpc3RlbmVyKCJjbG9zZSIsZil9cmV0dXJuIG4ub24oImVycm9yIixoKSx0Lm9uKCJlcnJvciIsaCksbi5vbigiZW5kIixmKSxuLm9uKCJjbG9zZSIsZiksdC5vbigiY2xvc2UiLGYpLHQuZW1pdCgicGlwZSIsbiksdH07dmFyIFdlPXt9LCRlPXtnZXQgZXhwb3J0cygpe3JldHVybiBXZX0sc2V0IGV4cG9ydHModCl7V2U9dH19OyJmdW5jdGlvbiI9PXR5cGVvZiBPYmplY3QuY3JlYXRlPyRlLmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtlJiYodC5zdXBlcl89ZSx0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSl9OiRlLmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtpZihlKXt0LnN1cGVyXz1lO3ZhciByPWZ1bmN0aW9uKCl7fTtyLnByb3RvdHlwZT1lLnByb3RvdHlwZSx0LnByb3RvdHlwZT1uZXcgcix0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj10fX07bGV0IEdlPUhlKCk7ZnVuY3Rpb24gSmUodCxlKXsoIm9iamVjdCIhPXR5cGVvZiB0fHxBcnJheS5pc0FycmF5KHQpKSYmKGU9dCx0PXt9KTtsZXQgcj1uZXcgR2UodCk7dmFyIG47cmV0dXJuIHIuX2Zyb209QXJyYXkuaXNBcnJheShlKT8obj0obj1lKS5zbGljZSgpLGZ1bmN0aW9uKHQsZSl7bGV0IHI9bnVsbCxpPW4ubGVuZ3RoP24uc2hpZnQoKTpudWxsO2kgaW5zdGFuY2VvZiBFcnJvciYmKHI9aSxpPW51bGwpLGUocixpKX0pOmV8fFZlLHJ9ZnVuY3Rpb24gSGUodCxlKXtmdW5jdGlvbiByKGUpe2lmKCEodGhpcyBpbnN0YW5jZW9mIHIpKXJldHVybiBuZXcgcihlKTt0aGlzLl9yZWFkaW5nPSExLHRoaXMuX2NhbGxiYWNrPWZ1bmN0aW9uKHQsZSl7aWYobi5kZXN0cm95ZWQpcmV0dXJuO2lmKHQpcmV0dXJuIG4uZGVzdHJveSh0KTtpZihudWxsPT09ZSlyZXR1cm4gbi5wdXNoKG51bGwpO24uX3JlYWRpbmc9ITEsbi5wdXNoKGUpJiZuLl9yZWFkKGkpfSx0aGlzLmRlc3Ryb3llZD0hMSx1ZS5jYWxsKHRoaXMsZXx8dCk7bGV0IG49dGhpcyxpPXRoaXMuX3JlYWRhYmxlU3RhdGUuaGlnaFdhdGVyTWFya31yZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdCYmKGU9dCx0PXt9KSx0PUtlKHQpLFdlKHIsdWUpLHIucHJvdG90eXBlLl9mcm9tPWV8fFZlLHIucHJvdG90eXBlLl9yZWFkPWZ1bmN0aW9uKHQpe3RoaXMuX3JlYWRpbmd8fHRoaXMuZGVzdHJveWVkfHwodGhpcy5fcmVhZGluZz0hMCx0aGlzLl9mcm9tKHQsdGhpcy5fY2FsbGJhY2spKX0sci5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbih0KXtpZih0aGlzLmRlc3Ryb3llZClyZXR1cm47dGhpcy5kZXN0cm95ZWQ9ITA7bGV0IGU9dGhpcztwcm9jZXNzLm5leHRUaWNrKChmdW5jdGlvbigpe3QmJmUuZW1pdCgiZXJyb3IiLHQpLGUuZW1pdCgiY2xvc2UiKX0pKX0scn1mdW5jdGlvbiBWZSgpe31mdW5jdGlvbiBLZSh0KXtyZXR1cm4gdD10fHx7fX1KZS5jdG9yPUhlLEplLm9iaj1mdW5jdGlvbih0LGUpe3JldHVybigiZnVuY3Rpb24iPT10eXBlb2YgdHx8QXJyYXkuaXNBcnJheSh0KSkmJihlPXQsdD17fSksKHQ9S2UodCkpLm9iamVjdE1vZGU9ITAsdC5oaWdoV2F0ZXJNYXJrPTE2LEplKHQsZSl9O3ZhciBaZSxRZT0xLFhlPXt9LHRyPSExLGVyPWEuZG9jdW1lbnQ7ZnVuY3Rpb24gcnIodCl7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PW5ldyBGdW5jdGlvbigiIit0KSk7Zm9yKHZhciBlPW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoLTEpLHI9MDtyPGUubGVuZ3RoO3IrKyllW3JdPWFyZ3VtZW50c1tyKzFdO3ZhciBuPXtjYWxsYmFjazp0LGFyZ3M6ZX07cmV0dXJuIFhlW1FlXT1uLFplKFFlKSxRZSsrfWZ1bmN0aW9uIG5yKHQpe2lmKHRyKXNldFRpbWVvdXQobnIsMCx0KTtlbHNle3ZhciBlPVhlW3RdO2lmKGUpe3RyPSEwO3RyeXshZnVuY3Rpb24odCl7dmFyIGU9dC5jYWxsYmFjayxyPXQuYXJncztzd2l0Y2goci5sZW5ndGgpe2Nhc2UgMDplKCk7YnJlYWs7Y2FzZSAxOmUoclswXSk7YnJlYWs7Y2FzZSAyOmUoclswXSxyWzFdKTticmVhaztjYXNlIDM6ZShyWzBdLHJbMV0sclsyXSk7YnJlYWs7ZGVmYXVsdDplLmFwcGx5KHZvaWQgMCxyKX19KGUpfWZpbmFsbHl7IWZ1bmN0aW9uKHQpe2RlbGV0ZSBYZVt0XX0odCksdHI9ITF9fX19dmFyIGlyLG9yLHNyLGFyLHVyPU9iamVjdC5nZXRQcm90b3R5cGVPZiYmT2JqZWN0LmdldFByb3RvdHlwZU9mKGEpO2Z1bmN0aW9uIGhyKHQpe2xldCBlLHI9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpO2lmKGU9IltvYmplY3QgUHJvbWlzZV0iPT09cixlKXJldHVybiEwO2lmKCJbb2JqZWN0IEZ1bmN0aW9uXSIhPT1yKXJldHVybiExO3RyeXtlPSJmdW5jdGlvbiIhPXR5cGVvZiB0LnN1YnNjcmliZSYmImZ1bmN0aW9uIj09dHlwZW9mIHQudGhlbn1jYXRjaCh0KXt9cmV0dXJuIGV9ZnVuY3Rpb24gZnIodCl7bGV0IGUscixuO2Z1bmN0aW9uIGkoaSl7KCh0PWkpaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcnx8QXJyYXlCdWZmZXIuaXNWaWV3KHQpJiYhXy5pc0J1ZmZlcih0KSkmJih0PV8uZnJvbSh0KSksZT1ocih0KT90Om51bGw7Y29uc3Qgbz0hZSYmdFtTeW1ib2wuaXRlcmF0b3JdJiYic3RyaW5nIiE9dHlwZW9mIHQmJiFfLmlzQnVmZmVyKHQpO3I9bz90W1N5bWJvbC5pdGVyYXRvcl0oKTpudWxsO2NvbnN0IHM9IWUmJnRbU3ltYm9sLmFzeW5jSXRlcmF0b3JdO249cz90W1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpOm51bGx9cmV0dXJuIEFycmF5LmlzQXJyYXkodCkmJih0PXQuc2xpY2UoKSksaSh0KSxKZSgoZnVuY3Rpb24gbyhzLGEpe2lmKGUpcmV0dXJuIHZvaWQoYXN5bmMoKT0+e3RyeXthd2FpdCBpKGF3YWl0IGUpLG8uY2FsbCh0aGlzLHMsYSl9Y2F0Y2godCl7YSh0KX19KSgpO2lmKHIpe2NvbnN0IHQ9ci5uZXh0KCk7cmV0dXJuIHZvaWQgcnIoYSxudWxsLHQuZG9uZT9udWxsOnQudmFsdWUpfWlmKG4pcmV0dXJuIHZvaWQoYXN5bmMoKT0+e3RyeXtjb25zdCB0PWF3YWl0IG4ubmV4dCgpO3JyKGEsbnVsbCx0LmRvbmU/bnVsbDp0LnZhbHVlKX1jYXRjaCh0KXtycihhLHQpfX0pKCk7aWYoMD09PXQubGVuZ3RoKXJldHVybiB2b2lkIHJyKGEsbnVsbCxudWxsKTtjb25zdCB1PXQuc2xpY2UoMCxzKTt0PXQuc2xpY2UocykscnIoYSxudWxsLHUpfSkpfXVyPXVyJiZ1ci5zZXRUaW1lb3V0P3VyOmEsIltvYmplY3QgcHJvY2Vzc10iPT09e30udG9TdHJpbmcuY2FsbChhLnByb2Nlc3MpP1plPWZ1bmN0aW9uKHQpe0x0Lm5leHRUaWNrKChmdW5jdGlvbigpe25yKHQpfSkpfTohZnVuY3Rpb24oKXtpZihhLnBvc3RNZXNzYWdlJiYhYS5pbXBvcnRTY3JpcHRzKXt2YXIgdD0hMCxlPWEub25tZXNzYWdlO3JldHVybiBhLm9ubWVzc2FnZT1mdW5jdGlvbigpe3Q9ITF9LGEucG9zdE1lc3NhZ2UoIiIsIioiKSxhLm9ubWVzc2FnZT1lLHR9fSgpP2EuTWVzc2FnZUNoYW5uZWw/KChvcj1uZXcgTWVzc2FnZUNoYW5uZWwpLnBvcnQxLm9ubWVzc2FnZT1mdW5jdGlvbih0KXtucih0LmRhdGEpfSxaZT1mdW5jdGlvbih0KXtvci5wb3J0Mi5wb3N0TWVzc2FnZSh0KX0pOmVyJiYib25yZWFkeXN0YXRlY2hhbmdlImluIGVyLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpPyhpcj1lci5kb2N1bWVudEVsZW1lbnQsWmU9ZnVuY3Rpb24odCl7dmFyIGU9ZXIuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZS5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXtucih0KSxlLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLGlyLnJlbW92ZUNoaWxkKGUpLGU9bnVsbH0saXIuYXBwZW5kQ2hpbGQoZSl9KTpaZT1mdW5jdGlvbih0KXtzZXRUaW1lb3V0KG5yLDAsdCl9Oihzcj0ic2V0SW1tZWRpYXRlJCIrTWF0aC5yYW5kb20oKSsiJCIsYXI9ZnVuY3Rpb24odCl7dC5zb3VyY2U9PT1hJiYic3RyaW5nIj09dHlwZW9mIHQuZGF0YSYmMD09PXQuZGF0YS5pbmRleE9mKHNyKSYmbnIoK3QuZGF0YS5zbGljZShzci5sZW5ndGgpKX0sYS5hZGRFdmVudExpc3RlbmVyP2EuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsYXIsITEpOmEuYXR0YWNoRXZlbnQoIm9ubWVzc2FnZSIsYXIpLFplPWZ1bmN0aW9uKHQpe2EucG9zdE1lc3NhZ2Uoc3IrdCwiKiIpfSksZnIub2JqZWN0PXQ9PntsZXQgZSxyLG47ZnVuY3Rpb24gaShpKXtlPWhyKHQ9aSk/dDpudWxsLHI9IWUmJnRbU3ltYm9sLml0ZXJhdG9yXT90W1N5bWJvbC5pdGVyYXRvcl0oKTpudWxsLG49IWUmJnRbU3ltYm9sLmFzeW5jSXRlcmF0b3JdP3RbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk6bnVsbH1yZXR1cm4gQXJyYXkuaXNBcnJheSh0KSYmKHQ9dC5zbGljZSgpKSxpKHQpLEplLm9iaigoZnVuY3Rpb24gbyhzLGEpe2lmKGUpKGFzeW5jKCk9Pnt0cnl7YXdhaXQgaShhd2FpdCBlKSxvLmNhbGwodGhpcyxzLGEpfWNhdGNoKHQpe2EodCl9fSkoKTtlbHNlIGlmKHIpe2NvbnN0IHQ9ci5uZXh0KCk7cnIoYSxudWxsLHQuZG9uZT9udWxsOnQudmFsdWUpfWVsc2Ugbj8oYXN5bmMoKT0+e3RyeXtjb25zdCB0PWF3YWl0IG4ubmV4dCgpO3JyKGEsbnVsbCx0LmRvbmU/bnVsbDp0LnZhbHVlKX1jYXRjaCh0KXtycihhLHQpfX0pKCk6KHRoaXMucHVzaCh0KSxycihhLG51bGwsbnVsbCkpfSkpfTt2YXIgY3I9e30sbHI9Y3IuTEVGVF9CUkFDRT0xLHByPWNyLlJJR0hUX0JSQUNFPTIsZHI9Y3IuTEVGVF9CUkFDS0VUPTMsZ3I9Y3IuUklHSFRfQlJBQ0tFVD00LHlyPWNyLkNPTE9OPTUsdnI9Y3IuQ09NTUE9Nixicj1jci5UUlVFPTcsbXI9Y3IuRkFMU0U9OCx3cj1jci5OVUxMPTksX3I9Y3IuU1RSSU5HPTEwLFNyPWNyLk5VTUJFUj0xMSxFcj1jci5TVEFSVD0xNyxrcj1jci5TVE9QPTE4LFJyPWNyLlRSVUUxPTMzLEFyPWNyLlRSVUUyPTM0LE9yPWNyLlRSVUUzPTM1LFRyPWNyLkZBTFNFMT00OSxqcj1jci5GQUxTRTI9NTAsTHI9Y3IuRkFMU0UzPTUxLENyPWNyLkZBTFNFND01MixQcj1jci5OVUxMMT02NSxNcj1jci5OVUxMMj02NixCcj1jci5OVUxMMz02Nyx4cj1jci5OVU1CRVIxPTgxLFVyPWNyLk5VTUJFUjM9ODMsSXI9Y3IuU1RSSU5HMT05NyxEcj1jci5TVFJJTkcyPTk4LE5yPWNyLlNUUklORzM9OTksRnI9Y3IuU1RSSU5HND0xMDAsenI9Y3IuU1RSSU5HNT0xMDEscXI9Y3IuU1RSSU5HNj0xMDIsWXI9Y3IuVkFMVUU9MTEzLFdyPWNyLktFWT0xMTQsJHI9Y3IuT0JKRUNUPTEyOSxHcj1jci5BUlJBWT0xMzAsSnI9IlxcIi5jaGFyQ29kZUF0KDApLEhyPSIvIi5jaGFyQ29kZUF0KDApLFZyPSJcYiIuY2hhckNvZGVBdCgwKSxLcj0iXGYiLmNoYXJDb2RlQXQoMCksWnI9IlxuIi5jaGFyQ29kZUF0KDApLFFyPSJcciIuY2hhckNvZGVBdCgwKSxYcj0iXHQiLmNoYXJDb2RlQXQoMCksdG49NjU1MzY7ZnVuY3Rpb24gZW4oKXt0aGlzLnRTdGF0ZT1Fcix0aGlzLnZhbHVlPXZvaWQgMCx0aGlzLnN0cmluZz12b2lkIDAsdGhpcy5zdHJpbmdCdWZmZXI9Xy5hbGxvYz9fLmFsbG9jKHRuKTpuZXcgXyh0biksdGhpcy5zdHJpbmdCdWZmZXJPZmZzZXQ9MCx0aGlzLnVuaWNvZGU9dm9pZCAwLHRoaXMuaGlnaFN1cnJvZ2F0ZT12b2lkIDAsdGhpcy5rZXk9dm9pZCAwLHRoaXMubW9kZT12b2lkIDAsdGhpcy5zdGFjaz1bXSx0aGlzLnN0YXRlPVlyLHRoaXMuYnl0ZXNfcmVtYWluaW5nPTAsdGhpcy5ieXRlc19pbl9zZXF1ZW5jZT0wLHRoaXMudGVtcF9idWZmcz17MjpuZXcgXygyKSwzOm5ldyBfKDMpLDQ6bmV3IF8oNCl9LHRoaXMub2Zmc2V0PS0xfWVuLnRva25hbT1mdW5jdGlvbih0KXtmb3IodmFyIGU9T2JqZWN0LmtleXMoY3IpLHI9MCxuPWUubGVuZ3RoO3I8bjtyKyspe3ZhciBpPWVbcl07aWYoY3JbaV09PT10KXJldHVybiBpfXJldHVybiB0JiYiMHgiK3QudG9TdHJpbmcoMTYpfTt2YXIgcm49ZW4ucHJvdG90eXBlO3JuLm9uRXJyb3I9ZnVuY3Rpb24odCl7dGhyb3cgdH0scm4uY2hhckVycm9yPWZ1bmN0aW9uKHQsZSl7dGhpcy50U3RhdGU9a3IsdGhpcy5vbkVycm9yKG5ldyBFcnJvcigiVW5leHBlY3RlZCAiK0pTT04uc3RyaW5naWZ5KFN0cmluZy5mcm9tQ2hhckNvZGUodFtlXSkpKyIgYXQgcG9zaXRpb24gIitlKyIgaW4gc3RhdGUgIitlbi50b2tuYW0odGhpcy50U3RhdGUpKSl9LHJuLmFwcGVuZFN0cmluZ0NoYXI9ZnVuY3Rpb24odCl7dGhpcy5zdHJpbmdCdWZmZXJPZmZzZXQ+PXRuJiYodGhpcy5zdHJpbmcrPXRoaXMuc3RyaW5nQnVmZmVyLnRvU3RyaW5nKCJ1dGY4IiksdGhpcy5zdHJpbmdCdWZmZXJPZmZzZXQ9MCksdGhpcy5zdHJpbmdCdWZmZXJbdGhpcy5zdHJpbmdCdWZmZXJPZmZzZXQrK109dH0scm4uYXBwZW5kU3RyaW5nQnVmPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj10Lmxlbmd0aDsibnVtYmVyIj09dHlwZW9mIGUmJihuPSJudW1iZXIiPT10eXBlb2Ygcj9yPDA/dC5sZW5ndGgtZStyOnItZTp0Lmxlbmd0aC1lKSxuPDAmJihuPTApLHRoaXMuc3RyaW5nQnVmZmVyT2Zmc2V0K24+dG4mJih0aGlzLnN0cmluZys9dGhpcy5zdHJpbmdCdWZmZXIudG9TdHJpbmcoInV0ZjgiLDAsdGhpcy5zdHJpbmdCdWZmZXJPZmZzZXQpLHRoaXMuc3RyaW5nQnVmZmVyT2Zmc2V0PTApLHQuY29weSh0aGlzLnN0cmluZ0J1ZmZlcix0aGlzLnN0cmluZ0J1ZmZlck9mZnNldCxlLHIpLHRoaXMuc3RyaW5nQnVmZmVyT2Zmc2V0Kz1ufSxybi53cml0ZT1mdW5jdGlvbih0KXt2YXIgZTsic3RyaW5nIj09dHlwZW9mIHQmJih0PW5ldyBfKHQpKTtmb3IodmFyIHI9MCxuPXQubGVuZ3RoO3I8bjtyKyspaWYodGhpcy50U3RhdGU9PT1Fcil7aWYoZT10W3JdLHRoaXMub2Zmc2V0KyssMTIzPT09ZSl0aGlzLm9uVG9rZW4obHIsInsiKTtlbHNlIGlmKDEyNT09PWUpdGhpcy5vblRva2VuKHByLCJ9Iik7ZWxzZSBpZig5MT09PWUpdGhpcy5vblRva2VuKGRyLCJbIik7ZWxzZSBpZig5Mz09PWUpdGhpcy5vblRva2VuKGdyLCJdIik7ZWxzZSBpZig1OD09PWUpdGhpcy5vblRva2VuKHlyLCI6Iik7ZWxzZSBpZig0ND09PWUpdGhpcy5vblRva2VuKHZyLCIsIik7ZWxzZSBpZigxMTY9PT1lKXRoaXMudFN0YXRlPVJyO2Vsc2UgaWYoMTAyPT09ZSl0aGlzLnRTdGF0ZT1UcjtlbHNlIGlmKDExMD09PWUpdGhpcy50U3RhdGU9UHI7ZWxzZSBpZigzND09PWUpdGhpcy5zdHJpbmc9IiIsdGhpcy5zdHJpbmdCdWZmZXJPZmZzZXQ9MCx0aGlzLnRTdGF0ZT1JcjtlbHNlIGlmKDQ1PT09ZSl0aGlzLnN0cmluZz0iLSIsdGhpcy50U3RhdGU9eHI7ZWxzZSBpZihlPj00OCYmZTw2NCl0aGlzLnN0cmluZz1TdHJpbmcuZnJvbUNoYXJDb2RlKGUpLHRoaXMudFN0YXRlPVVyO2Vsc2UgaWYoMzIhPT1lJiY5IT09ZSYmMTAhPT1lJiYxMyE9PWUpcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscil9ZWxzZSBpZih0aGlzLnRTdGF0ZT09PUlyKWlmKGU9dFtyXSx0aGlzLmJ5dGVzX3JlbWFpbmluZz4wKXtmb3IodmFyIGk9MDtpPHRoaXMuYnl0ZXNfcmVtYWluaW5nO2krKyl0aGlzLnRlbXBfYnVmZnNbdGhpcy5ieXRlc19pbl9zZXF1ZW5jZV1bdGhpcy5ieXRlc19pbl9zZXF1ZW5jZS10aGlzLmJ5dGVzX3JlbWFpbmluZytpXT10W2ldO3RoaXMuYXBwZW5kU3RyaW5nQnVmKHRoaXMudGVtcF9idWZmc1t0aGlzLmJ5dGVzX2luX3NlcXVlbmNlXSksdGhpcy5ieXRlc19pbl9zZXF1ZW5jZT10aGlzLmJ5dGVzX3JlbWFpbmluZz0wLHI9citpLTF9ZWxzZSBpZigwPT09dGhpcy5ieXRlc19yZW1haW5pbmcmJmU+PTEyOCl7aWYoZTw9MTkzfHxlPjI0NClyZXR1cm4gdGhpcy5vbkVycm9yKG5ldyBFcnJvcigiSW52YWxpZCBVVEYtOCBjaGFyYWN0ZXIgYXQgcG9zaXRpb24gIityKyIgaW4gc3RhdGUgIitlbi50b2tuYW0odGhpcy50U3RhdGUpKSk7aWYoZT49MTk0JiZlPD0yMjMmJih0aGlzLmJ5dGVzX2luX3NlcXVlbmNlPTIpLGU+PTIyNCYmZTw9MjM5JiYodGhpcy5ieXRlc19pbl9zZXF1ZW5jZT0zKSxlPj0yNDAmJmU8PTI0NCYmKHRoaXMuYnl0ZXNfaW5fc2VxdWVuY2U9NCksdGhpcy5ieXRlc19pbl9zZXF1ZW5jZStyPnQubGVuZ3RoKXtmb3IodmFyIG89MDtvPD10Lmxlbmd0aC0xLXI7bysrKXRoaXMudGVtcF9idWZmc1t0aGlzLmJ5dGVzX2luX3NlcXVlbmNlXVtvXT10W3Irb107dGhpcy5ieXRlc19yZW1haW5pbmc9cit0aGlzLmJ5dGVzX2luX3NlcXVlbmNlLXQubGVuZ3RoLHI9dC5sZW5ndGgtMX1lbHNlIHRoaXMuYXBwZW5kU3RyaW5nQnVmKHQscixyK3RoaXMuYnl0ZXNfaW5fc2VxdWVuY2UpLHI9cit0aGlzLmJ5dGVzX2luX3NlcXVlbmNlLTF9ZWxzZSBpZigzND09PWUpdGhpcy50U3RhdGU9RXIsdGhpcy5zdHJpbmcrPXRoaXMuc3RyaW5nQnVmZmVyLnRvU3RyaW5nKCJ1dGY4IiwwLHRoaXMuc3RyaW5nQnVmZmVyT2Zmc2V0KSx0aGlzLnN0cmluZ0J1ZmZlck9mZnNldD0wLHRoaXMub25Ub2tlbihfcix0aGlzLnN0cmluZyksdGhpcy5vZmZzZXQrPV8uYnl0ZUxlbmd0aCh0aGlzLnN0cmluZywidXRmOCIpKzEsdGhpcy5zdHJpbmc9dm9pZCAwO2Vsc2UgaWYoOTI9PT1lKXRoaXMudFN0YXRlPURyO2Vsc2V7aWYoIShlPj0zMikpcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7dGhpcy5hcHBlbmRTdHJpbmdDaGFyKGUpfWVsc2UgaWYodGhpcy50U3RhdGU9PT1EcilpZigzND09PShlPXRbcl0pKXRoaXMuYXBwZW5kU3RyaW5nQ2hhcihlKSx0aGlzLnRTdGF0ZT1JcjtlbHNlIGlmKDkyPT09ZSl0aGlzLmFwcGVuZFN0cmluZ0NoYXIoSnIpLHRoaXMudFN0YXRlPUlyO2Vsc2UgaWYoNDc9PT1lKXRoaXMuYXBwZW5kU3RyaW5nQ2hhcihIciksdGhpcy50U3RhdGU9SXI7ZWxzZSBpZig5OD09PWUpdGhpcy5hcHBlbmRTdHJpbmdDaGFyKFZyKSx0aGlzLnRTdGF0ZT1JcjtlbHNlIGlmKDEwMj09PWUpdGhpcy5hcHBlbmRTdHJpbmdDaGFyKEtyKSx0aGlzLnRTdGF0ZT1JcjtlbHNlIGlmKDExMD09PWUpdGhpcy5hcHBlbmRTdHJpbmdDaGFyKFpyKSx0aGlzLnRTdGF0ZT1JcjtlbHNlIGlmKDExND09PWUpdGhpcy5hcHBlbmRTdHJpbmdDaGFyKFFyKSx0aGlzLnRTdGF0ZT1JcjtlbHNlIGlmKDExNj09PWUpdGhpcy5hcHBlbmRTdHJpbmdDaGFyKFhyKSx0aGlzLnRTdGF0ZT1JcjtlbHNle2lmKDExNyE9PWUpcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7dGhpcy51bmljb2RlPSIiLHRoaXMudFN0YXRlPU5yfWVsc2UgaWYodGhpcy50U3RhdGU9PT1Ocnx8dGhpcy50U3RhdGU9PT1Gcnx8dGhpcy50U3RhdGU9PT16cnx8dGhpcy50U3RhdGU9PT1xcil7aWYoISgoZT10W3JdKT49NDgmJmU8NjR8fGU+NjQmJmU8PTcwfHxlPjk2JiZlPD0xMDIpKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO2lmKHRoaXMudW5pY29kZSs9U3RyaW5nLmZyb21DaGFyQ29kZShlKSx0aGlzLnRTdGF0ZSsrPT09cXIpe3ZhciBzPXBhcnNlSW50KHRoaXMudW5pY29kZSwxNik7dGhpcy51bmljb2RlPXZvaWQgMCx2b2lkIDAhPT10aGlzLmhpZ2hTdXJyb2dhdGUmJnM+PTU2MzIwJiZzPDU3MzQ0Pyh0aGlzLmFwcGVuZFN0cmluZ0J1ZihuZXcgXyhTdHJpbmcuZnJvbUNoYXJDb2RlKHRoaXMuaGlnaFN1cnJvZ2F0ZSxzKSkpLHRoaXMuaGlnaFN1cnJvZ2F0ZT12b2lkIDApOnZvaWQgMD09PXRoaXMuaGlnaFN1cnJvZ2F0ZSYmcz49NTUyOTYmJnM8NTYzMjA/dGhpcy5oaWdoU3Vycm9nYXRlPXM6KHZvaWQgMCE9PXRoaXMuaGlnaFN1cnJvZ2F0ZSYmKHRoaXMuYXBwZW5kU3RyaW5nQnVmKG5ldyBfKFN0cmluZy5mcm9tQ2hhckNvZGUodGhpcy5oaWdoU3Vycm9nYXRlKSkpLHRoaXMuaGlnaFN1cnJvZ2F0ZT12b2lkIDApLHRoaXMuYXBwZW5kU3RyaW5nQnVmKG5ldyBfKFN0cmluZy5mcm9tQ2hhckNvZGUocykpKSksdGhpcy50U3RhdGU9SXJ9fWVsc2UgaWYodGhpcy50U3RhdGU9PT14cnx8dGhpcy50U3RhdGU9PT1Vcilzd2l0Y2goZT10W3JdKXtjYXNlIDQ4OmNhc2UgNDk6Y2FzZSA1MDpjYXNlIDUxOmNhc2UgNTI6Y2FzZSA1MzpjYXNlIDU0OmNhc2UgNTU6Y2FzZSA1NjpjYXNlIDU3OmNhc2UgNDY6Y2FzZSAxMDE6Y2FzZSA2OTpjYXNlIDQzOmNhc2UgNDU6dGhpcy5zdHJpbmcrPVN0cmluZy5mcm9tQ2hhckNvZGUoZSksdGhpcy50U3RhdGU9VXI7YnJlYWs7ZGVmYXVsdDp0aGlzLnRTdGF0ZT1Fcjt2YXIgYT1OdW1iZXIodGhpcy5zdHJpbmcpO2lmKGlzTmFOKGEpKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMuc3RyaW5nLm1hdGNoKC9bMC05XSsvKT09dGhpcy5zdHJpbmcmJmEudG9TdHJpbmcoKSE9dGhpcy5zdHJpbmc/dGhpcy5vblRva2VuKF9yLHRoaXMuc3RyaW5nKTp0aGlzLm9uVG9rZW4oU3IsYSksdGhpcy5vZmZzZXQrPXRoaXMuc3RyaW5nLmxlbmd0aC0xLHRoaXMuc3RyaW5nPXZvaWQgMCxyLS19ZWxzZSBpZih0aGlzLnRTdGF0ZT09PVJyKXtpZigxMTQhPT10W3JdKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMudFN0YXRlPUFyfWVsc2UgaWYodGhpcy50U3RhdGU9PT1Bcil7aWYoMTE3IT09dFtyXSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLnRTdGF0ZT1Pcn1lbHNlIGlmKHRoaXMudFN0YXRlPT09T3Ipe2lmKDEwMSE9PXRbcl0pcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7dGhpcy50U3RhdGU9RXIsdGhpcy5vblRva2VuKGJyLCEwKSx0aGlzLm9mZnNldCs9M31lbHNlIGlmKHRoaXMudFN0YXRlPT09VHIpe2lmKDk3IT09dFtyXSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLnRTdGF0ZT1qcn1lbHNlIGlmKHRoaXMudFN0YXRlPT09anIpe2lmKDEwOCE9PXRbcl0pcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7dGhpcy50U3RhdGU9THJ9ZWxzZSBpZih0aGlzLnRTdGF0ZT09PUxyKXtpZigxMTUhPT10W3JdKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMudFN0YXRlPUNyfWVsc2UgaWYodGhpcy50U3RhdGU9PT1Dcil7aWYoMTAxIT09dFtyXSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLnRTdGF0ZT1Fcix0aGlzLm9uVG9rZW4obXIsITEpLHRoaXMub2Zmc2V0Kz00fWVsc2UgaWYodGhpcy50U3RhdGU9PT1Qcil7aWYoMTE3IT09dFtyXSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLnRTdGF0ZT1Ncn1lbHNlIGlmKHRoaXMudFN0YXRlPT09TXIpe2lmKDEwOCE9PXRbcl0pcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7dGhpcy50U3RhdGU9QnJ9ZWxzZSBpZih0aGlzLnRTdGF0ZT09PUJyKXtpZigxMDghPT10W3JdKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMudFN0YXRlPUVyLHRoaXMub25Ub2tlbih3cixudWxsKSx0aGlzLm9mZnNldCs9M319LHJuLm9uVG9rZW49ZnVuY3Rpb24odCxlKXt9LHJuLnBhcnNlRXJyb3I9ZnVuY3Rpb24odCxlKXt0aGlzLnRTdGF0ZT1rcix0aGlzLm9uRXJyb3IobmV3IEVycm9yKCJVbmV4cGVjdGVkICIrZW4udG9rbmFtKHQpKyhlPyIoIitKU09OLnN0cmluZ2lmeShlKSsiKSI6IiIpKyIgaW4gc3RhdGUgIitlbi50b2tuYW0odGhpcy5zdGF0ZSkpKX0scm4ucHVzaD1mdW5jdGlvbigpe3RoaXMuc3RhY2sucHVzaCh7dmFsdWU6dGhpcy52YWx1ZSxrZXk6dGhpcy5rZXksbW9kZTp0aGlzLm1vZGV9KX0scm4ucG9wPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy52YWx1ZSxlPXRoaXMuc3RhY2sucG9wKCk7dGhpcy52YWx1ZT1lLnZhbHVlLHRoaXMua2V5PWUua2V5LHRoaXMubW9kZT1lLm1vZGUsdGhpcy5lbWl0KHQpLHRoaXMubW9kZXx8KHRoaXMuc3RhdGU9WXIpfSxybi5lbWl0PWZ1bmN0aW9uKHQpe3RoaXMubW9kZSYmKHRoaXMuc3RhdGU9dnIpLHRoaXMub25WYWx1ZSh0KX0scm4ub25WYWx1ZT1mdW5jdGlvbih0KXt9LHJuLm9uVG9rZW49ZnVuY3Rpb24odCxlKXtpZih0aGlzLnN0YXRlPT09WXIpaWYodD09PV9yfHx0PT09U3J8fHQ9PT1icnx8dD09PW1yfHx0PT09d3IpdGhpcy52YWx1ZSYmKHRoaXMudmFsdWVbdGhpcy5rZXldPWUpLHRoaXMuZW1pdChlKTtlbHNlIGlmKHQ9PT1scil0aGlzLnB1c2goKSx0aGlzLnZhbHVlP3RoaXMudmFsdWU9dGhpcy52YWx1ZVt0aGlzLmtleV09e306dGhpcy52YWx1ZT17fSx0aGlzLmtleT12b2lkIDAsdGhpcy5zdGF0ZT1Xcix0aGlzLm1vZGU9JHI7ZWxzZSBpZih0PT09ZHIpdGhpcy5wdXNoKCksdGhpcy52YWx1ZT90aGlzLnZhbHVlPXRoaXMudmFsdWVbdGhpcy5rZXldPVtdOnRoaXMudmFsdWU9W10sdGhpcy5rZXk9MCx0aGlzLm1vZGU9R3IsdGhpcy5zdGF0ZT1ZcjtlbHNlIGlmKHQ9PT1wcil7aWYodGhpcy5tb2RlIT09JHIpcmV0dXJuIHRoaXMucGFyc2VFcnJvcih0LGUpO3RoaXMucG9wKCl9ZWxzZXtpZih0IT09Z3IpcmV0dXJuIHRoaXMucGFyc2VFcnJvcih0LGUpO2lmKHRoaXMubW9kZSE9PUdyKXJldHVybiB0aGlzLnBhcnNlRXJyb3IodCxlKTt0aGlzLnBvcCgpfWVsc2UgaWYodGhpcy5zdGF0ZT09PVdyKWlmKHQ9PT1fcil0aGlzLmtleT1lLHRoaXMuc3RhdGU9eXI7ZWxzZXtpZih0IT09cHIpcmV0dXJuIHRoaXMucGFyc2VFcnJvcih0LGUpO3RoaXMucG9wKCl9ZWxzZSBpZih0aGlzLnN0YXRlPT09eXIpe2lmKHQhPT15cilyZXR1cm4gdGhpcy5wYXJzZUVycm9yKHQsZSk7dGhpcy5zdGF0ZT1Zcn1lbHNle2lmKHRoaXMuc3RhdGUhPT12cilyZXR1cm4gdGhpcy5wYXJzZUVycm9yKHQsZSk7aWYodD09PXZyKXRoaXMubW9kZT09PUdyPyh0aGlzLmtleSsrLHRoaXMuc3RhdGU9WXIpOnRoaXMubW9kZT09PSRyJiYodGhpcy5zdGF0ZT1Xcik7ZWxzZXtpZighKHQ9PT1nciYmdGhpcy5tb2RlPT09R3J8fHQ9PT1wciYmdGhpcy5tb2RlPT09JHIpKXJldHVybiB0aGlzLnBhcnNlRXJyb3IodCxlKTt0aGlzLnBvcCgpfX19LGVuLkM9Y3I7dmFyIG5uPWVuO2Z1bmN0aW9uIG9uKHQsZSxyKXt0PXR8fGZ1bmN0aW9uKHQpe3RoaXMucXVldWUodCl9LGU9ZXx8ZnVuY3Rpb24oKXt0aGlzLnF1ZXVlKG51bGwpfTtsZXQgbj0hMSxpPSExLG89W10scz0hMSxhPW5ldyBZZTtmdW5jdGlvbiB1KCl7Zm9yKDtvLmxlbmd0aCYmIWEucGF1c2VkOyl7bGV0IHQ9by5zaGlmdCgpO2lmKG51bGw9PT10KXJldHVybiBhLmVtaXQoImVuZCIpO2EuZW1pdCgiZGF0YSIsdCl9fXJldHVybiBhLnJlYWRhYmxlPWEud3JpdGFibGU9ITAsYS5wYXVzZWQ9ITEsYS5hdXRvRGVzdHJveT0hKHImJiExPT09ci5hdXRvRGVzdHJveSksYS53cml0ZT1mdW5jdGlvbihlKXtyZXR1cm4gdC5jYWxsKHRoaXMsZSksIWEucGF1c2VkfSxhLnF1ZXVlPWEucHVzaD1mdW5jdGlvbih0KXtyZXR1cm4gc3x8KG51bGw9PT10JiYocz0hMCksby5wdXNoKHQpLHUoKSksYX0sYS5vbigiZW5kIiwoZnVuY3Rpb24oKXthLnJlYWRhYmxlPSExLCFhLndyaXRhYmxlJiZhLmF1dG9EZXN0cm95JiZMdC5uZXh0VGljaygoZnVuY3Rpb24oKXthLmRlc3Ryb3koKX0pKX0pKSxhLmVuZD1mdW5jdGlvbih0KXtpZighbilyZXR1cm4gbj0hMCxhcmd1bWVudHMubGVuZ3RoJiZhLndyaXRlKHQpLGEud3JpdGFibGU9ITEsZS5jYWxsKGEpLCFhLnJlYWRhYmxlJiZhLmF1dG9EZXN0cm95JiZhLmRlc3Ryb3koKSxhfSxhLmRlc3Ryb3k9ZnVuY3Rpb24oKXtpZighaSlyZXR1cm4gaT0hMCxuPSEwLG8ubGVuZ3RoPTAsYS53cml0YWJsZT1hLnJlYWRhYmxlPSExLGEuZW1pdCgiY2xvc2UiKSxhfSxhLnBhdXNlPWZ1bmN0aW9uKCl7aWYoIWEucGF1c2VkKXJldHVybiBhLnBhdXNlZD0hMCxhfSxhLnJlc3VtZT1mdW5jdGlvbigpe3JldHVybiBhLnBhdXNlZCYmKGEucGF1c2VkPSExLGEuZW1pdCgicmVzdW1lIikpLHUoKSxhLnBhdXNlZHx8YS5lbWl0KCJkcmFpbiIpLGF9LGF9b24udGhyb3VnaD1vbjtsZXQgc249e3BhcnNlOmZ1bmN0aW9uKHQsZSl7bGV0IHIsbjtmdW5jdGlvbiBpKHQsZSl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0P2U9PT10OnQmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LmV4ZWM/dC5leGVjKGUpOiJib29sZWFuIj09dHlwZW9mIHR8fCJvYmplY3QiPT10eXBlb2YgdD90OiJmdW5jdGlvbiI9PXR5cGVvZiB0JiZ0KGUpfWxldCBvPW5ldyBubixzPW9uKChmdW5jdGlvbih0KXsic3RyaW5nIj09dHlwZW9mIHQmJih0PV8uZnJvbSh0KSksby53cml0ZSh0KX0pLChmdW5jdGlvbih0KXt0JiZzLndyaXRlKHQpLHImJnMuZW1pdCgiaGVhZGVyIixyKSxuJiZzLmVtaXQoImZvb3RlciIsbikscy5xdWV1ZShudWxsKX0pKTtmdW5jdGlvbiBhKHQsZSl7ITEhPT1yJiYocj1yfHx7fSxyW3RdPWUpLCExIT09biYmITE9PT1yJiYobj1ufHx7fSxuW3RdPWUpfXJldHVybiJzdHJpbmciPT10eXBlb2YgdCYmKHQ9dC5zcGxpdCgiLiIpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIiQqIj09PXQ/e2VtaXRLZXk6ITB9OiIqIj09PXR8fCgiIj09PXQ/e3JlY3Vyc2U6ITB9OnQpfSkpKSx0JiZ0Lmxlbmd0aHx8KHQ9bnVsbCksby5vblZhbHVlPWZ1bmN0aW9uKG4pe2lmKHRoaXMucm9vdHx8KHMucm9vdD1uKSwhdClyZXR1cm47bGV0IG89MCx1PTAsaD0hMSxmPSExO2Zvcig7bzx0Lmxlbmd0aDspe2xldCBlLHI9dFtvXTtpZih1KyssciYmIXIucmVjdXJzZSl7aWYoZT11PT09dGhpcy5zdGFjay5sZW5ndGg/dGhpczp0aGlzLnN0YWNrW3VdLCFlKXJldHVybjtpZighaShyLGUua2V5KSlyZXR1cm4gdm9pZCBhKGUua2V5LG4pO2g9ISFyLmVtaXRLZXksZj0hIXIuZW1pdFBhdGgsbysrfWVsc2V7bysrO2xldCByPXRbb107aWYoIXIpcmV0dXJuO2Zvcig7Oyl7aWYoZT11PT09dGhpcy5zdGFjay5sZW5ndGg/dGhpczp0aGlzLnN0YWNrW3VdLCFlKXJldHVybjtpZihpKHIsZS5rZXkpKXtvKyssT2JqZWN0LmlzRnJvemVuKHRoaXMuc3RhY2tbdV0pfHwodGhpcy5zdGFja1t1XS52YWx1ZT1udWxsKTticmVha31hKGUua2V5LG4pLHUrK319fWlmKHImJihzLmVtaXQoImhlYWRlciIscikscj0hMSksdSE9PXRoaXMuc3RhY2subGVuZ3RoKXJldHVybjtsZXQgYz10aGlzLnN0YWNrLnNsaWNlKDEpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQua2V5fSkpLmNvbmNhdChbdGhpcy5rZXldKSxsPW47bnVsbCE9bCYmbnVsbCE9KGw9ZT9lKGwsYyk6bCkmJigoaHx8ZikmJihsPXt2YWx1ZTpsfSxoJiYobC5rZXk9dGhpcy5rZXkpLGYmJihsLnBhdGg9YykpLHMucXVldWUobCkpLHRoaXMudmFsdWUmJmRlbGV0ZSB0aGlzLnZhbHVlW3RoaXMua2V5XTtmb3IobGV0IHQgaW4gdGhpcy5zdGFjaylPYmplY3QuaXNGcm96ZW4odGhpcy5zdGFja1t0XSl8fCh0aGlzLnN0YWNrW3RdLnZhbHVlPW51bGwpfSxvLl9vblRva2VuPW8ub25Ub2tlbixvLm9uVG9rZW49ZnVuY3Rpb24oZSxyKXtvLl9vblRva2VuKGUsciksMD09PXRoaXMuc3RhY2subGVuZ3RoJiZzLnJvb3QmJih0fHxzLnF1ZXVlKHMucm9vdCkscy5yb290PW51bGwpfSxvLm9uRXJyb3I9ZnVuY3Rpb24odCl7dC5tZXNzYWdlLmluZGV4T2YoImF0IHBvc2l0aW9uIik+LTEmJih0Lm1lc3NhZ2U9IkludmFsaWQgSlNPTiAoIit0Lm1lc3NhZ2UrIikiKSxzLmVtaXQoImVycm9yIix0KX0sc319LGFuPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGFuPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbih0LGUpe3QuX19wcm90b19fPWV9fHxmdW5jdGlvbih0LGUpe2ZvcihsZXQgciBpbiBlKWUuaGFzT3duUHJvcGVydHkocikmJih0W3JdPWVbcl0pfSxhbih0LGUpfTtsZXQgdW4saG49L1tcXCJcdTAwMDAtXHUwMDFmXHUwMDdmLVx1MDA5Zlx1MDBhZFx1MDYwMC1cdTA2MDRcdTA3MGZcdTE3YjRcdTE3YjVcdTIwMGMtXHUyMDBmXHUyMDI4LVx1MjAyZlx1MjA2MC1cdTIwNmZcdWZlZmZcdWZmZjAtXHVmZmZmXS9nLGZuPXsiXGIiOiJcXGIiLCJcdCI6IlxcdCIsIlxuIjoiXFxuIiwiXGYiOiJcXGYiLCJcciI6IlxcciIsJyInOidcXCInLCJcXCI6IlxcXFwifTtmdW5jdGlvbiBjbih0KXtyZXR1cm4gdD8iZnVuY3Rpb24iPT10eXBlb2YgdC50aGVuP3VuLlByb21pc2U6ZnVuY3Rpb24odCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQucmVhZCYmImZ1bmN0aW9uIj09dHlwZW9mIHQucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHQucGlwZSYmImZ1bmN0aW9uIj09dHlwZW9mIHQub25jZSYmImZ1bmN0aW9uIj09dHlwZW9mIHQucmVtb3ZlTGlzdGVuZXJ9KHQpP3QuX3JlYWRhYmxlU3RhdGUub2JqZWN0TW9kZT91bi5SZWFkYWJsZU9iamVjdDp1bi5SZWFkYWJsZVN0cmluZzpBcnJheS5pc0FycmF5KHQpP3VuLkFycmF5OiJvYmplY3QiPT10eXBlb2YgdHx8dCBpbnN0YW5jZW9mIE9iamVjdD91bi5PYmplY3Q6dW4uUHJpbWl0aXZlOnVuLlByaW1pdGl2ZX0hZnVuY3Rpb24odCl7dFt0LkFycmF5PTBdPSJBcnJheSIsdFt0Lk9iamVjdD0xXT0iT2JqZWN0Iix0W3QuUmVhZGFibGVTdHJpbmc9Ml09IlJlYWRhYmxlU3RyaW5nIix0W3QuUmVhZGFibGVPYmplY3Q9M109IlJlYWRhYmxlT2JqZWN0Iix0W3QuUHJpbWl0aXZlPTRdPSJQcmltaXRpdmUiLHRbdC5Qcm9taXNlPTVdPSJQcm9taXNlIn0odW58fCh1bj17fSkpO2xldCBsbj1bXTtsblt1bi5BcnJheV09IlsiLGxuW3VuLk9iamVjdF09InsiLGxuW3VuLlJlYWRhYmxlU3RyaW5nXT0nIicsbG5bdW4uUmVhZGFibGVPYmplY3RdPSJbIjtsZXQgcG49W107cG5bdW4uQXJyYXldPSJdIixwblt1bi5PYmplY3RdPSJ9Iixwblt1bi5SZWFkYWJsZVN0cmluZ109JyInLHBuW3VuLlJlYWRhYmxlT2JqZWN0XT0iXSI7bGV0IGRuPVtdO2ZvcihsZXQgdD0wLGU9T2JqZWN0LmVudHJpZXModW4pO3Q8ZS5sZW5ndGg7dCsrKXtsZXQgcj1lW3RdLG49clswXSxpPXJbMV07Im51bWJlciI9PXR5cGVvZiBpJiYoZG5baV09InByb2Nlc3MiK24pfWZ1bmN0aW9uIGduKHQpe3JldHVybiB0LnJlcGxhY2UoaG4sKGZ1bmN0aW9uKHQpe2xldCBlPWZuW3RdO3JldHVybiJzdHJpbmciPT10eXBlb2YgZT9lOiJcXHUiK3QuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikucGFkU3RhcnQoNCwiMCIpfSkpfWZ1bmN0aW9uIHluKHQpe3JldHVybiciJytnbih0KSsnIid9ZnVuY3Rpb24gdm4odCxlKXtsZXQgcj10LnJlYWQoZSk7cmV0dXJuIG51bGw9PT1yP25ldyBQcm9taXNlKChmdW5jdGlvbihlLHIpe2xldCBuPWZ1bmN0aW9uKCl7cmV0dXJuIGUobnVsbCl9O3Qub25jZSgiZW5kIixuKSx0Lm9uY2UoImVycm9yIixyKSx0Lm9uY2UoInJlYWRhYmxlIiwoZnVuY3Rpb24oKXt0LnJlbW92ZUxpc3RlbmVyKCJlbmQiLG4pLHQucmVtb3ZlTGlzdGVuZXIoImVycm9yIixyKSxlKHQucmVhZCgpKX0pKX0pKTpQcm9taXNlLnJlc29sdmUocil9ZnVuY3Rpb24gYm4odCl7cmV0dXJuIHQudGhlbigoZnVuY3Rpb24odCl7cmV0dXJuIGNuKHQpPT09dW4uUHJvbWlzZT9ibih0KTp0fSkpfWxldCBtbj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUscixuLGkpe3ZvaWQgMD09PWkmJihpPSExKTtsZXQgbz10LmNhbGwodGhpcyl8fHRoaXM7by5jeWNsZT1pLG8uc3RhY2s9W10sby5kZXB0aD0wLG8ucHVzaENhbGxlZD0hMSxvLmVuZD0hMSxvLmlzUmVhZGluZz0hMSxvLnJlYWRNb3JlPSExO2xldCBzPXR5cGVvZiBuO3JldHVybiJzdHJpbmciIT09cyYmIm51bWJlciIhPT1zfHwoby5nYXA9TnVtYmVyLmlzRmluaXRlKG4pPyIgIi5yZXBlYXQobik6biksT2JqZWN0LmFzc2lnbihvLHt2aXNpdGVkOmk/bmV3IFdlYWtNYXA6bmV3IFdlYWtTZXQscmVwbGFjZXJGdW5jdGlvbjpyIGluc3RhbmNlb2YgRnVuY3Rpb24mJnIscmVwbGFjZXJBcnJheTpBcnJheS5pc0FycmF5KHIpJiZyfSksciBpbnN0YW5jZW9mIEZ1bmN0aW9uJiYoby5yZXBsYWNlckZ1bmN0aW9uPXIpLEFycmF5LmlzQXJyYXkocikmJihvLnJlcGxhY2VyQXJyYXk9ciksby5hZGRUb1N0YWNrKGUpLG99cmV0dXJuIGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gcigpe3RoaXMuY29uc3RydWN0b3I9dH1hbih0LGUpLHQucHJvdG90eXBlPW51bGw9PT1lP09iamVjdC5jcmVhdGUoZSk6KHIucHJvdG90eXBlPWUucHJvdG90eXBlLG5ldyByKX0oZSx0KSxlLnByb3RvdHlwZS5jeWNsZXI9ZnVuY3Rpb24odCxlKXtsZXQgcj10aGlzLnZpc2l0ZWQuZ2V0KGUpO2lmKHIpcmV0dXJueyRyZWY6cn07bGV0IG49dGhpcy5wYXRoKCk7cmV0dXJuIHZvaWQgMCE9PXQmJm4ucHVzaCh0KSxuPW4ubWFwKChmdW5jdGlvbih0KXtyZXR1cm4iWyIrKE51bWJlci5pc0ludGVnZXIodCk/dDp5bih0KSkrIl0ifSkpLHRoaXMudmlzaXRlZC5zZXQoZSxuLmxlbmd0aD8iJCIrbi5qb2luKCIiKToiJCIpLGV9LGUucHJvdG90eXBlLmFkZFRvU3RhY2s9ZnVuY3Rpb24odCxlLHIsbil7bGV0IGksbyxzPXRoaXMsYT10O3RoaXMucmVwbGFjZXJGdW5jdGlvbiYmKGE9dGhpcy5yZXBsYWNlckZ1bmN0aW9uKGV8fHIsYSx0aGlzKSksYSYmYS50b0pTT04gaW5zdGFuY2VvZiBGdW5jdGlvbiYmKGE9YS50b0pTT04oKSksKGEgaW5zdGFuY2VvZiBGdW5jdGlvbnx8InN5bWJvbCI9PXR5cGVvZiB0KSYmKGE9dm9pZCAwKSx2b2lkIDAhPT1lJiZ0aGlzLnJlcGxhY2VyQXJyYXkmJih0aGlzLnJlcGxhY2VyQXJyYXkuaW5jbHVkZXMoZSl8fChhPXZvaWQgMCkpO2xldCB1PWNuKGEpO2lmKChuJiZuLnR5cGU9PT11bi5BcnJheXx8dm9pZCAwIT09YSkmJnUhPT11bi5Qcm9taXNlJiYobiYmIW4uZmlyc3QmJnRoaXMuX3B1c2goIiwiKSxuJiYobi5maXJzdD0hMSkpLHZvaWQgMCE9PWEmJnUhPT11bi5Qcm9taXNlJiZlJiYodGhpcy5nYXA/dGhpcy5fcHVzaCgiXG4iK3RoaXMuZ2FwLnJlcGVhdCh0aGlzLmRlcHRoKSsnIicrZ24oZSkrJyI6ICcpOnRoaXMuX3B1c2goJyInK2duKGUpKyciOicpKSx1IT09dW4uUHJpbWl0aXZlKWlmKHRoaXMuY3ljbGUpYT10aGlzLmN5Y2xlcihlfHxyLGEpLHU9Y24oYSk7ZWxzZXtpZih0aGlzLnZpc2l0ZWQuaGFzKGEpKXRocm93IE9iamVjdC5hc3NpZ24obmV3IEVycm9yKCJDb252ZXJ0aW5nIGNpcmN1bGFyIHN0cnVjdHVyZSB0byBKU09OIikse3JlYWxWYWx1ZTphLGtleTplfHxyfSk7dGhpcy52aXNpdGVkLmFkZChhKX0hZSYmcj4tMSYmdGhpcy5kZXB0aCYmdGhpcy5nYXAmJnRoaXMuX3B1c2goIlxuIit0aGlzLmdhcC5yZXBlYXQodGhpcy5kZXB0aCkpO2xldCBoPWxuW3VdO2gmJnRoaXMuX3B1c2goaCk7bGV0IGY9e2tleTplLGluZGV4OnIsdHlwZTp1LHBhcmVudDpuLHZhbHVlOmEsZmlyc3Q6ITB9O3JldHVybiB1PT09dW4uT2JqZWN0Pyh0aGlzLmRlcHRoKz0xLGYudW5yZWFkPU9iamVjdC5rZXlzKGEpLGYuaXNFbXB0eT0hZi51bnJlYWQubGVuZ3RoKTp1PT09dW4uQXJyYXk/KHRoaXMuZGVwdGgrPTEsZi51bnJlYWQ9YS5sZW5ndGgsZi5hcnJheUxlbmd0aD1mLnVucmVhZCxmLmlzRW1wdHk9IWYudW5yZWFkKTp1IT09dW4uUmVhZGFibGVTdHJpbmcmJnUhPT11bi5SZWFkYWJsZU9iamVjdHx8KHRoaXMuZGVwdGgrPTEsYS5yZWFkYWJsZUVuZGVkfHwobnVsbD09PShpPWEuX3JlYWRhYmxlU3RhdGUpfHx2b2lkIDA9PT1pP3ZvaWQgMDppLmVuZEVtaXR0ZWQpP3RoaXMuZW1pdCgiZXJyb3IiLG5ldyBFcnJvcigiUmVhZGFibGUgU3RyZWFtIGhhcyBlbmRlZCBiZWZvcmUgaXQgd2FzIHNlcmlhbGl6ZWQuIEFsbCBzdHJlYW0gZGF0YSBoYXZlIGJlZW4gbG9zdCIpLGEsZXx8cik6KGEucmVhZGFibGVGbG93aW5nfHwobnVsbD09PShvPWEuX3JlYWRhYmxlU3RhdGUpfHx2b2lkIDA9PT1vP3ZvaWQgMDpvLmZsb3dpbmcpKSYmKGEucGF1c2UoKSx0aGlzLmVtaXQoImVycm9yIixuZXcgRXJyb3IoIlJlYWRhYmxlIFN0cmVhbSBpcyBpbiBmbG93aW5nIG1vZGUsIGRhdGEgbWF5IGhhdmUgYmVlbiBsb3N0LiBUcnlpbmcgdG8gcGF1c2Ugc3RyZWFtLiIpLGEsZXx8cikpLGYucmVhZENvdW50PTAsYS5vbmNlKCJlbmQiLChmdW5jdGlvbigpe2YuZW5kPSEwLHMuX19yZWFkKCl9KSksYS5vbmNlKCJlcnJvciIsKGZ1bmN0aW9uKHQpe3MuZXJyb3I9ITAscy5lbWl0KCJlcnJvciIsdCl9KSkpLHRoaXMuc3RhY2sudW5zaGlmdChmKSxmfSxlLnByb3RvdHlwZS5yZW1vdmVGcm9tU3RhY2s9ZnVuY3Rpb24odCl7bGV0IGU9dC50eXBlLHI9ZT09PXVuLk9iamVjdHx8ZT09PXVuLkFycmF5fHxlPT09dW4uUmVhZGFibGVTdHJpbmd8fGU9PT11bi5SZWFkYWJsZU9iamVjdDtlIT09dW4uUHJpbWl0aXZlJiYodGhpcy5jeWNsZXx8dGhpcy52aXNpdGVkLmRlbGV0ZSh0LnZhbHVlKSxyJiYodGhpcy5kZXB0aC09MSkpO2xldCBuPXBuW2VdO3ImJiF0LmlzRW1wdHkmJnRoaXMuZ2FwJiZ0aGlzLl9wdXNoKCJcbiIrdGhpcy5nYXAucmVwZWF0KHRoaXMuZGVwdGgpKSxuJiZ0aGlzLl9wdXNoKG4pO2xldCBpPXRoaXMuc3RhY2suaW5kZXhPZih0KTt0aGlzLnN0YWNrLnNwbGljZShpLDEpfSxlLnByb3RvdHlwZS5fcHVzaD1mdW5jdGlvbih0KXt0aGlzLnB1c2hDYWxsZWQ9ITAsdGhpcy5wdXNoKHQpfSxlLnByb3RvdHlwZS5wcm9jZXNzUmVhZGFibGVPYmplY3Q9ZnVuY3Rpb24odCxlKXtsZXQgcj10aGlzO2lmKCF0LmVuZClyZXR1cm4gdm4odC52YWx1ZSxlKS50aGVuKChmdW5jdGlvbihlKXtudWxsIT09ZSYmKHQuZmlyc3R8fHIuX3B1c2goIiwiKSx0LmZpcnN0PSExLHIuYWRkVG9TdGFjayhlLHZvaWQgMCx0LnJlYWRDb3VudCksdC5yZWFkQ291bnQrPTEpfSkpO3RoaXMucmVtb3ZlRnJvbVN0YWNrKHQpfSxlLnByb3RvdHlwZS5wcm9jZXNzT2JqZWN0PWZ1bmN0aW9uKHQpe2lmKCF0LnVucmVhZC5sZW5ndGgpcmV0dXJuIHZvaWQgdGhpcy5yZW1vdmVGcm9tU3RhY2sodCk7bGV0IGU9dC51bnJlYWQuc2hpZnQoKSxyPXQudmFsdWVbZV07dGhpcy5hZGRUb1N0YWNrKHIsZSx2b2lkIDAsdCl9LGUucHJvdG90eXBlLnByb2Nlc3NBcnJheT1mdW5jdGlvbih0KXtsZXQgZT10LnVucmVhZDtpZighZSlyZXR1cm4gdm9pZCB0aGlzLnJlbW92ZUZyb21TdGFjayh0KTtsZXQgcj10LmFycmF5TGVuZ3RoLWUsbj10LnZhbHVlW3JdO3QudW5yZWFkLT0xLHRoaXMuYWRkVG9TdGFjayhuLHZvaWQgMCxyLHQpfSxlLnByb3RvdHlwZS5wcm9jZXNzUHJpbWl0aXZlPWZ1bmN0aW9uKHQpe2lmKHZvaWQgMCE9PXQudmFsdWUpe2xldCBlLHI9dHlwZW9mIHQudmFsdWU7c3dpdGNoKHIpe2Nhc2Uic3RyaW5nIjplPXluKHQudmFsdWUpO2JyZWFrO2Nhc2UibnVtYmVyIjplPU51bWJlci5pc0Zpbml0ZSh0LnZhbHVlKT9TdHJpbmcodC52YWx1ZSk6Im51bGwiO2JyZWFrO2Nhc2UiYm9vbGVhbiI6ZT1TdHJpbmcodC52YWx1ZSk7YnJlYWs7Y2FzZSJvYmplY3QiOnQudmFsdWV8fChlPSJudWxsIik7YnJlYWs7ZGVmYXVsdDp0aHJvdyBPYmplY3QuYXNzaWduKG5ldyBFcnJvcignVW5rbm93biB0eXBlICInK3IrJyIuIFBsZWFzZSBmaWxlIGFuIGlzc3VlIScpLHt2YWx1ZTp0LnZhbHVlfSl9dGhpcy5fcHVzaChlKX1lbHNlIXRoaXMuc3RhY2tbMV18fHRoaXMuc3RhY2tbMV0udHlwZSE9PXVuLkFycmF5JiZ0aGlzLnN0YWNrWzFdLnR5cGUhPT11bi5SZWFkYWJsZU9iamVjdD90LmFkZFNlcGFyYXRvckFmdGVyRW5kPSExOnRoaXMuX3B1c2goIm51bGwiKTt0aGlzLnJlbW92ZUZyb21TdGFjayh0KX0sZS5wcm90b3R5cGUucHJvY2Vzc1JlYWRhYmxlU3RyaW5nPWZ1bmN0aW9uKHQsZSl7bGV0IHI9dGhpcztpZighdC5lbmQpcmV0dXJuIHZuKHQudmFsdWUsZSkudGhlbigoZnVuY3Rpb24odCl7dCYmci5fcHVzaChnbih0LnRvU3RyaW5nKCkpKX0pKTt0aGlzLnJlbW92ZUZyb21TdGFjayh0KX0sZS5wcm90b3R5cGUucHJvY2Vzc1Byb21pc2U9ZnVuY3Rpb24odCl7bGV0IGU9dGhpcztyZXR1cm4gYm4odC52YWx1ZSkudGhlbigoZnVuY3Rpb24ocil7ZS5yZW1vdmVGcm9tU3RhY2sodCksZS5hZGRUb1N0YWNrKHIsdC5rZXksdC5pbmRleCx0LnBhcmVudCl9KSl9LGUucHJvdG90eXBlLnByb2Nlc3NTdGFja1RvcEl0ZW09ZnVuY3Rpb24odCl7bGV0IGUscj10aGlzLG49dGhpcy5zdGFja1swXTtpZighbnx8dGhpcy5lcnJvcilyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7dHJ5e2U9dGhpc1tkbltuLnR5cGVdXShuLHQpfWNhdGNoKHQpe3JldHVybiBQcm9taXNlLnJlamVjdCh0KX1yZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGUpLnRoZW4oKGZ1bmN0aW9uKCl7MD09PXIuc3RhY2subGVuZ3RoJiYoci5lbmQ9ITAsci5fcHVzaChudWxsKSl9KSl9LGUucHJvdG90eXBlLl9fcmVhZD1mdW5jdGlvbih0KXtsZXQgZT10aGlzO2lmKCF0aGlzLmlzUmVhZGluZyYmIXRoaXMuZXJyb3IpcmV0dXJuIHRoaXMuaXNSZWFkaW5nPSEwLHRoaXMucmVhZE1vcmU9ITEsdGhpcy5wcm9jZXNzU3RhY2tUb3BJdGVtKHQpLnRoZW4oKGZ1bmN0aW9uKCl7IWUuZW5kJiYhZS5lcnJvciYmKGUucmVhZE1vcmV8fCFlLnB1c2hDYWxsZWQpP3JyKChmdW5jdGlvbigpe2UuaXNSZWFkaW5nPSExLGUuX19yZWFkKCl9KSk6ZS5pc1JlYWRpbmc9ITF9KSkuY2F0Y2goKGZ1bmN0aW9uKHQpe2UuZXJyb3I9ITAsZS5lbWl0KCJlcnJvciIsdCl9KSk7dGhpcy5yZWFkTW9yZT0hMH0sZS5wcm90b3R5cGUuX3JlYWQ9ZnVuY3Rpb24odCl7dGhpcy5wdXNoQ2FsbGVkPSExLHRoaXMuX19yZWFkKHQpfSxlLnByb3RvdHlwZS5wYXRoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhY2subWFwKChmdW5jdGlvbih0KXtsZXQgZT10LmtleSxyPXQuaW5kZXg7cmV0dXJuIGV8fHJ9KSkuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gdHx8dD4tMX0pKS5yZXZlcnNlKCl9LGV9KHVlKTt2YXIgd249QXJyYXkuaXNBcnJheSxfbj0ib2JqZWN0Ij09dHlwZW9mIGEmJmEmJmEuT2JqZWN0PT09T2JqZWN0JiZhLFNuPSJvYmplY3QiPT10eXBlb2Ygc2VsZiYmc2VsZiYmc2VsZi5PYmplY3Q9PT1PYmplY3QmJnNlbGYsRW49X258fFNufHxGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpLGtuPUVuLlN5bWJvbCxSbj1PYmplY3QucHJvdG90eXBlLEFuPVJuLmhhc093blByb3BlcnR5LE9uPVJuLnRvU3RyaW5nLFRuPWtuP2tuLnRvU3RyaW5nVGFnOnZvaWQgMDt2YXIgam49T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZzt2YXIgTG49IltvYmplY3QgTnVsbF0iLENuPSJbb2JqZWN0IFVuZGVmaW5lZF0iLFBuPWtuP2tuLnRvU3RyaW5nVGFnOnZvaWQgMDtmdW5jdGlvbiBNbih0KXtyZXR1cm4gbnVsbD09dD92b2lkIDA9PT10P0NuOkxuOlBuJiZQbiBpbiBPYmplY3QodCk/ZnVuY3Rpb24odCl7dmFyIGU9QW4uY2FsbCh0LFRuKSxyPXRbVG5dO3RyeXt0W1RuXT12b2lkIDA7dmFyIG49ITB9Y2F0Y2godCl7fXZhciBpPU9uLmNhbGwodCk7cmV0dXJuIG4mJihlP3RbVG5dPXI6ZGVsZXRlIHRbVG5dKSxpfSh0KTpmdW5jdGlvbih0KXtyZXR1cm4gam4uY2FsbCh0KX0odCl9ZnVuY3Rpb24gQm4odCl7cmV0dXJuIG51bGwhPXQmJiJvYmplY3QiPT10eXBlb2YgdH12YXIgeG49IltvYmplY3QgU3ltYm9sXSI7ZnVuY3Rpb24gVW4odCl7cmV0dXJuInN5bWJvbCI9PXR5cGVvZiB0fHxCbih0KSYmTW4odCk9PXhufXZhciBJbj0vXC58XFsoPzpbXltcXV0qfChbIiddKSg/Oig/IVwxKVteXFxdfFxcLikqP1wxKVxdLyxEbj0vXlx3KiQvO2Z1bmN0aW9uIE5uKHQpe3ZhciBlPXR5cGVvZiB0O3JldHVybiBudWxsIT10JiYoIm9iamVjdCI9PWV8fCJmdW5jdGlvbiI9PWUpfXZhciBGbj0iW29iamVjdCBBc3luY0Z1bmN0aW9uXSIsem49IltvYmplY3QgRnVuY3Rpb25dIixxbj0iW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0iLFluPSJbb2JqZWN0IFByb3h5XSI7dmFyIFduLCRuPUVuWyJfX2NvcmUtanNfc2hhcmVkX18iXSxHbj0oV249L1teLl0rJC8uZXhlYygkbiYmJG4ua2V5cyYmJG4ua2V5cy5JRV9QUk9UT3x8IiIpKT8iU3ltYm9sKHNyYylfMS4iK1duOiIiO3ZhciBKbj1GdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmc7dmFyIEhuPS9eXFtvYmplY3QgLis/Q29uc3RydWN0b3JcXSQvLFZuPUZ1bmN0aW9uLnByb3RvdHlwZSxLbj1PYmplY3QucHJvdG90eXBlLFpuPVZuLnRvU3RyaW5nLFFuPUtuLmhhc093blByb3BlcnR5LFhuPVJlZ0V4cCgiXiIrWm4uY2FsbChRbikucmVwbGFjZSgvW1xcXiQuKis/KClbXF17fXxdL2csIlxcJCYiKS5yZXBsYWNlKC9oYXNPd25Qcm9wZXJ0eXwoZnVuY3Rpb24pLio/KD89XFxcKCl8IGZvciAuKz8oPz1cXFxdKS9nLCIkMS4qPyIpKyIkIik7ZnVuY3Rpb24gdGkodCl7aWYoIU5uKHQpfHwoZT10LEduJiZHbiBpbiBlKSlyZXR1cm4hMTt2YXIgZSxyPWZ1bmN0aW9uKHQpe2lmKCFObih0KSlyZXR1cm4hMTt2YXIgZT1Nbih0KTtyZXR1cm4gZT09em58fGU9PXFufHxlPT1Gbnx8ZT09WW59KHQpP1huOkhuO3JldHVybiByLnRlc3QoZnVuY3Rpb24odCl7aWYobnVsbCE9dCl7dHJ5e3JldHVybiBKbi5jYWxsKHQpfWNhdGNoKHQpe310cnl7cmV0dXJuIHQrIiJ9Y2F0Y2godCl7fX1yZXR1cm4iIn0odCkpfWZ1bmN0aW9uIGVpKHQsZSl7dmFyIHI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09dD92b2lkIDA6dFtlXX0odCxlKTtyZXR1cm4gdGkocik/cjp2b2lkIDB9dmFyIHJpPWVpKE9iamVjdCwiY3JlYXRlIik7dmFyIG5pPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dmFyIGlpPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gb2kodCl7dmFyIGU9LTEscj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8cjspe3ZhciBuPXRbZV07dGhpcy5zZXQoblswXSxuWzFdKX19ZnVuY3Rpb24gc2kodCxlKXtmb3IodmFyIHIsbixpPXQubGVuZ3RoO2ktLTspaWYoKHI9dFtpXVswXSk9PT0obj1lKXx8ciE9ciYmbiE9bilyZXR1cm4gaTtyZXR1cm4tMX1vaS5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLl9fZGF0YV9fPXJpP3JpKG51bGwpOnt9LHRoaXMuc2l6ZT0wfSxvaS5wcm90b3R5cGUuZGVsZXRlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuaGFzKHQpJiZkZWxldGUgdGhpcy5fX2RhdGFfX1t0XTtyZXR1cm4gdGhpcy5zaXplLT1lPzE6MCxlfSxvaS5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX19kYXRhX187aWYocmkpe3ZhciByPWVbdF07cmV0dXJuIl9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iPT09cj92b2lkIDA6cn1yZXR1cm4gbmkuY2FsbChlLHQpP2VbdF06dm9pZCAwfSxvaS5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX19kYXRhX187cmV0dXJuIHJpP3ZvaWQgMCE9PWVbdF06aWkuY2FsbChlLHQpfSxvaS5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5fX2RhdGFfXztyZXR1cm4gdGhpcy5zaXplKz10aGlzLmhhcyh0KT8wOjEsclt0XT1yaSYmdm9pZCAwPT09ZT8iX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyI6ZSx0aGlzfTt2YXIgYWk9QXJyYXkucHJvdG90eXBlLnNwbGljZTtmdW5jdGlvbiB1aSh0KXt2YXIgZT0tMSxyPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxyOyl7dmFyIG49dFtlXTt0aGlzLnNldChuWzBdLG5bMV0pfX11aS5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLl9fZGF0YV9fPVtdLHRoaXMuc2l6ZT0wfSx1aS5wcm90b3R5cGUuZGVsZXRlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX19kYXRhX18scj1zaShlLHQpO3JldHVybiEocjwwKSYmKHI9PWUubGVuZ3RoLTE/ZS5wb3AoKTphaS5jYWxsKGUsciwxKSwtLXRoaXMuc2l6ZSwhMCl9LHVpLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxyPXNpKGUsdCk7cmV0dXJuIHI8MD92b2lkIDA6ZVtyXVsxXX0sdWkucHJvdG90eXBlLmhhcz1mdW5jdGlvbih0KXtyZXR1cm4gc2kodGhpcy5fX2RhdGFfXyx0KT4tMX0sdWkucHJvdG90eXBlLnNldD1mdW5jdGlvbih0LGUpe3ZhciByPXRoaXMuX19kYXRhX18sbj1zaShyLHQpO3JldHVybiBuPDA/KCsrdGhpcy5zaXplLHIucHVzaChbdCxlXSkpOnJbbl1bMV09ZSx0aGlzfTt2YXIgaGk9ZWkoRW4sIk1hcCIpO2Z1bmN0aW9uIGZpKHQsZSl7dmFyIHIsbixpPXQuX19kYXRhX187cmV0dXJuKCJzdHJpbmciPT0obj10eXBlb2Yocj1lKSl8fCJudW1iZXIiPT1ufHwic3ltYm9sIj09bnx8ImJvb2xlYW4iPT1uPyJfX3Byb3RvX18iIT09cjpudWxsPT09cik/aVsic3RyaW5nIj09dHlwZW9mIGU/InN0cmluZyI6Imhhc2giXTppLm1hcH1mdW5jdGlvbiBjaSh0KXt2YXIgZT0tMSxyPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxyOyl7dmFyIG49dFtlXTt0aGlzLnNldChuWzBdLG5bMV0pfX1jaS5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLnNpemU9MCx0aGlzLl9fZGF0YV9fPXtoYXNoOm5ldyBvaSxtYXA6bmV3KGhpfHx1aSksc3RyaW5nOm5ldyBvaX19LGNpLnByb3RvdHlwZS5kZWxldGU9ZnVuY3Rpb24odCl7dmFyIGU9ZmkodGhpcyx0KS5kZWxldGUodCk7cmV0dXJuIHRoaXMuc2l6ZS09ZT8xOjAsZX0sY2kucHJvdG90eXBlLmdldD1mdW5jdGlvbih0KXtyZXR1cm4gZmkodGhpcyx0KS5nZXQodCl9LGNpLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24odCl7cmV0dXJuIGZpKHRoaXMsdCkuaGFzKHQpfSxjaS5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQsZSl7dmFyIHI9ZmkodGhpcyx0KSxuPXIuc2l6ZTtyZXR1cm4gci5zZXQodCxlKSx0aGlzLnNpemUrPXIuc2l6ZT09bj8wOjEsdGhpc307dmFyIGxpPSJFeHBlY3RlZCBhIGZ1bmN0aW9uIjtmdW5jdGlvbiBwaSh0LGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0fHxudWxsIT1lJiYiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKGxpKTt2YXIgcj1mdW5jdGlvbigpe3ZhciBuPWFyZ3VtZW50cyxpPWU/ZS5hcHBseSh0aGlzLG4pOm5bMF0sbz1yLmNhY2hlO2lmKG8uaGFzKGkpKXJldHVybiBvLmdldChpKTt2YXIgcz10LmFwcGx5KHRoaXMsbik7cmV0dXJuIHIuY2FjaGU9by5zZXQoaSxzKXx8byxzfTtyZXR1cm4gci5jYWNoZT1uZXcocGkuQ2FjaGV8fGNpKSxyfXBpLkNhY2hlPWNpO3ZhciBkaSxnaSx5aSx2aT0vW14uW1xdXSt8XFsoPzooLT9cZCsoPzpcLlxkKyk/KXwoWyInXSkoKD86KD8hXDIpW15cXF18XFwuKSo/KVwyKVxdfCg/PSg/OlwufFxbXF0pKD86XC58XFtcXXwkKSkvZyxiaT0vXFwoXFwpPy9nLG1pPShkaT1mdW5jdGlvbih0KXt2YXIgZT1bXTtyZXR1cm4gNDY9PT10LmNoYXJDb2RlQXQoMCkmJmUucHVzaCgiIiksdC5yZXBsYWNlKHZpLChmdW5jdGlvbih0LHIsbixpKXtlLnB1c2gobj9pLnJlcGxhY2UoYmksIiQxIik6cnx8dCl9KSksZX0sZ2k9cGkoZGksKGZ1bmN0aW9uKHQpe3JldHVybiA1MDA9PT15aS5zaXplJiZ5aS5jbGVhcigpLHR9KSkseWk9Z2kuY2FjaGUsZ2kpLHdpPW1pO3ZhciBfaT0xLzAsU2k9a24/a24ucHJvdG90eXBlOnZvaWQgMCxFaT1TaT9TaS50b1N0cmluZzp2b2lkIDA7ZnVuY3Rpb24ga2kodCl7aWYoInN0cmluZyI9PXR5cGVvZiB0KXJldHVybiB0O2lmKHduKHQpKXJldHVybiBmdW5jdGlvbih0LGUpe2Zvcih2YXIgcj0tMSxuPW51bGw9PXQ/MDp0Lmxlbmd0aCxpPUFycmF5KG4pOysrcjxuOylpW3JdPWUodFtyXSxyLHQpO3JldHVybiBpfSh0LGtpKSsiIjtpZihVbih0KSlyZXR1cm4gRWk/RWkuY2FsbCh0KToiIjt2YXIgZT10KyIiO3JldHVybiIwIj09ZSYmMS90PT0tX2k/Ii0wIjplfWZ1bmN0aW9uIFJpKHQsZSl7cmV0dXJuIHduKHQpP3Q6ZnVuY3Rpb24odCxlKXtpZih3bih0KSlyZXR1cm4hMTt2YXIgcj10eXBlb2YgdDtyZXR1cm4hKCJudW1iZXIiIT1yJiYic3ltYm9sIiE9ciYmImJvb2xlYW4iIT1yJiZudWxsIT10JiYhVW4odCkpfHxEbi50ZXN0KHQpfHwhSW4udGVzdCh0KXx8bnVsbCE9ZSYmdCBpbiBPYmplY3QoZSl9KHQsZSk/W3RdOndpKGZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10PyIiOmtpKHQpfSh0KSl9dmFyIEFpPTEvMDtmdW5jdGlvbiBPaSh0KXtpZigic3RyaW5nIj09dHlwZW9mIHR8fFVuKHQpKXJldHVybiB0O3ZhciBlPXQrIiI7cmV0dXJuIjAiPT1lJiYxL3Q9PS1BaT8iLTAiOmV9ZnVuY3Rpb24gVGkodCxlLHIpe3ZhciBuPW51bGw9PXQ/dm9pZCAwOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPTAsbj0oZT1SaShlLHQpKS5sZW5ndGg7bnVsbCE9dCYmcjxuOyl0PXRbT2koZVtyKytdKV07cmV0dXJuIHImJnI9PW4/dDp2b2lkIDB9KHQsZSk7cmV0dXJuIHZvaWQgMD09PW4/cjpufXZhciBqaT0iW29iamVjdCBOdW1iZXJdIjtmdW5jdGlvbiBMaSh0KXtyZXR1cm4iW29iamVjdCBTdHJpbmddIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiBDaSh0KXtyZXR1cm4hKCFMaSh0KXx8IiI9PT10KX1mdW5jdGlvbiBQaSh0KXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWZ1bmN0aW9uIE1pKHQpe3JldHVybiJbb2JqZWN0IFVuZGVmaW5lZF0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWZ1bmN0aW9uIEJpKHQpe3JldHVybiJbb2JqZWN0IE9iamVjdF0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWZ1bmN0aW9uIHhpKHQpe3JldHVybiEoIUxpKHQpfHwiIiE9PXQpfWZ1bmN0aW9uIFVpKHQpe3JldHVybiEhTWkodCl8fCghIWZ1bmN0aW9uKHQpe3JldHVybiJbb2JqZWN0IE51bGxdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX0odCl8fCghIWZ1bmN0aW9uKHQpe2lmKEJpKHQpKXtmb3IobGV0IGUgaW4gdClyZXR1cm4hMTtyZXR1cm4hMH1yZXR1cm4hMX0odCl8fCghIXhpKHQpfHwoISFmdW5jdGlvbih0KXtyZXR1cm4hIVBpKHQpJiYwPT09dC5sZW5ndGh9KHQpfHwhIWZ1bmN0aW9uKHQpe3JldHVybiB0IT10fSh0KSkpKSl9ZnVuY3Rpb24gSWkoKXtsZXQgdCxlLHI9bmV3IFByb21pc2UoKGZ1bmN0aW9uKCl7dD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV19KSk7cmV0dXJuIHIucmVzb2x2ZT10LHIucmVqZWN0PWUscn1sZXQgV0pzb25TdHJlYW09e3BhcnNlOmFzeW5jIGZ1bmN0aW9uKHQpe2lmKCFDaSh0KSlyZXR1cm57fTtsZXQgZT17fTt0cnl7ZT1KU09OLnBhcnNlKHQpfWNhdGNoKHQpe2U9e319cmV0dXJuIGV9LHBhcnNlQnlTdHJlYW06ZnVuY3Rpb24odCl7bGV0IGU9e307aWYoIm51bGwiPT09dClyZXR1cm4gbnVsbDtpZigiIj09PXQpcmV0dXJue307bGV0IHI9Il9fc3lzdGVtX18iLG49YHsiJHtyfSI6JHt0fX1gLGk9SWkoKSxvPWZyKG4pLHM9c24ucGFyc2UoIiQqIik7cmV0dXJuIHMub24oImRhdGEiLChmdW5jdGlvbih0KXtlW3Qua2V5XT10LnZhbHVlfSkpLHMub24oImVuZCIsKGZ1bmN0aW9uKCl7bGV0IHQ9VGkoZSxyKTtpLnJlc29sdmUodCl9KSkscy5vbigiZXJyb3IiLChmdW5jdGlvbih0KXtpLnJlamVjdCh0KX0pKSxvLnBpcGUocyksaX0sY3JlYXRlUGFyc2VTdHJlYW06ZnVuY3Rpb24odCl7cmV0dXJuIENpKHQpfHxmdW5jdGlvbih0KXtyZXR1cm4hKCFQaSh0KXx8MD09PXQubGVuZ3RofHwxPT09dC5sZW5ndGgmJlVpKHRbMF0pKX0odCl8fCh0PSIkKiIpLHNuLnBhcnNlKHQpfSxzdHJpbmdpZnk6YXN5bmMgZnVuY3Rpb24odCl7aWYoTWkodCkpcmV0dXJuIiI7bGV0IGU9IiI7dHJ5e2U9SlNPTi5zdHJpbmdpZnkodCl9Y2F0Y2godCl7ZT0iIn1yZXR1cm4gZX0sc3RyaW5naWZ5QnlTdHJlYW06ZnVuY3Rpb24odCl7bGV0IGU9IiI7aWYoTWkodCkpcmV0dXJuIiI7aWYobnVsbD09PXQpcmV0dXJuIm51bGwiO2lmKHhpKHQpKXJldHVybiciIic7aWYoIm51bWJlciI9PXR5cGVvZihyPXQpfHxCbihyKSYmTW4ocik9PWppKXJldHVybmAke3R9YDt2YXIgcjtpZihMaSh0KSlyZXR1cm5gIiR7dH0iYDtsZXQgbj1JaSgpLGk9bmV3IG1uKHQsbnVsbCxudWxsLCExKTtyZXR1cm4gaS5vbigiZGF0YSIsKGZ1bmN0aW9uKHQpe2UrPXR9KSksaS5vbigiZW5kIiwoZnVuY3Rpb24oKXtuLnJlc29sdmUoZSl9KSksaS5vbigiZXJyb3IiLChmdW5jdGlvbih0KXtuLnJlamVjdCh0KX0pKSxufSxjcmVhdGVTdHJpbmdpZnlTdHJlYW06ZnVuY3Rpb24odCl7aWYoIUJpKHQpJiYhUGkodCkpdGhyb3cgbmV3IEVycm9yKCJkYXRhIGlzIG5vdCBvYmplY3Qgb3IgYXJyYXkiKTtyZXR1cm4gbmV3IG1uKHQsbnVsbCxudWxsLCExKX19OwoKbGV0IGluc3RhbmNlID0gbnVsbApmdW5jdGlvbiBpbml0KGlucHV0KXsKCiAgICAvL2luaXQKICAgIGxldCByCiAgICAKICAgICAgICByID0gV0pzb25TdHJlYW0oLi4uaW5wdXQpCiAgICAgICAgCgogICAgLy9vbgogICAgCgogICAgLy9zYXZlCiAgICBpbnN0YW5jZSA9IHIKCn0KCmZ1bmN0aW9uIHNlbmRNZXNzYWdlKGRhdGEpIHsKICAgIAogICAgICAgIHNlbGYucG9zdE1lc3NhZ2UoZGF0YSkKICAgICAgICAKfQoKYXN5bmMgZnVuY3Rpb24gcnVuKGRhdGEpIHsKICAgIC8vIGNvbnNvbGUubG9nKCdpbm5lciB3b3JrZXIgcnVuJyxkYXRhKQoKICAgIC8vbW9kZQogICAgbGV0IG1vZGUgPSBkYXRhLm1vZGUKCiAgICAvL2NoZWNrCiAgICBpZihtb2RlICE9PSAnaW5pdCcgJiYgbW9kZSAhPT0gJ2NhbGwnKXsKICAgICAgICByZXR1cm4KICAgIH0KCiAgICAvL2luaXQKICAgIGlmKG1vZGUgPT09ICdpbml0Jyl7CiAgICAgICAgCiAgICAgICAgdHJ5ewoKICAgICAgICAgICAgLy90eXBlCiAgICAgICAgICAgIGxldCB0eXBlID0gZGF0YS50eXBlCgogICAgICAgICAgICAvL2lucHV0CiAgICAgICAgICAgIGxldCBpbnB1dCA9IGRhdGEuaW5wdXQKICAgIAogICAgICAgICAgICAvL2luc3RhbmNlCiAgICAgICAgICAgIGlmKHR5cGUgPT09ICdmdW5jdGlvbicpewogICAgICAgICAgICAgICAgaW5pdCguLi5pbnB1dCkKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmKHR5cGUgPT09ICdvYmplY3QnKXsKICAgICAgICAgICAgICAgIGluc3RhbmNlID0gV0pzb25TdHJlYW0KICAgICAgICAgICAgfQoKICAgICAgICB9CiAgICAgICAgY2F0Y2goZXJyKXsKICAgICAgICAKICAgICAgICAgICAgLy9zZW5kTWVzc2FnZQogICAgICAgICAgICBsZXQgcmVzID0gewogICAgICAgICAgICAgICAgbW9kZTogJ2VtaXQnLAogICAgICAgICAgICAgICAgZXZOYW1lOiAnZXJyb3InLAogICAgICAgICAgICAgICAgbXNnOiBlcnIsCiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2VuZE1lc3NhZ2UocmVzKQoKICAgICAgICB9CiAgICAgICAgICAgIAogICAgfQoKICAgIC8vY2hlY2sKICAgIGlmKG1vZGUgPT09ICdjYWxsJyl7CiAgICAgICAgbGV0IHN0YXRlID0gJycKICAgICAgICBsZXQgbXNnID0gbnVsbAoKICAgICAgICB0cnl7CgogICAgICAgICAgICAvL2Z1bgogICAgICAgICAgICBsZXQgZnVuID0gaW5zdGFuY2VbZGF0YS5mdW5dCgogICAgICAgICAgICAvL2lucHV0CiAgICAgICAgICAgIGxldCBpbnB1dCA9IGRhdGEuaW5wdXQKCiAgICAgICAgICAgIC8vZXhlYwogICAgICAgICAgICBhd2FpdCBmdW4oLi4uaW5wdXQpCiAgICAgICAgICAgICAgICAudGhlbigoc3VjKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGU9J3N1Y2Nlc3MnCiAgICAgICAgICAgICAgICAgICAgbXNnPXN1YwogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgIC5jYXRjaCgoZXJyKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGU9J2Vycm9yJwogICAgICAgICAgICAgICAgICAgIG1zZz1lcnIKICAgICAgICAgICAgICAgIH0pCgogICAgICAgIH0KICAgICAgICBjYXRjaChlcnIpewogICAgICAgICAgICBzdGF0ZSA9ICdlcnJvcicKICAgICAgICAgICAgbXNnID0gZXJyCiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vc2VuZE1lc3NhZ2UKICAgICAgICBsZXQgcmVzID0gewogICAgICAgICAgICBtb2RlOiAncmV0dXJuJywKICAgICAgICAgICAgaWQ6IGRhdGEuaWQsCiAgICAgICAgICAgIGZ1bjogZGF0YS5mdW4sCiAgICAgICAgICAgIHN0YXRlLAogICAgICAgICAgICBtc2csCiAgICAgICAgfQogICAgICAgIHNlbmRNZXNzYWdlKHJlcykKCiAgICB9Cgp9CgpmdW5jdGlvbiByZWN2TWVzc2FnZShkYXRhKSB7CiAgICAvLyBjb25zb2xlLmxvZygnaW5uZXIgd29ya2VyIHJlY3Y6JywgZGF0YSkKCiAgICAvL2RhdGFSZWN2CiAgICBsZXQgZGF0YVJlY3YgPSBkYXRhCgogICAgLy9ydW4KICAgIHJ1bihkYXRhUmVjdikKCn0KCgogICAgICAgIHNlbGYub25tZXNzYWdlID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgcmVjdk1lc3NhZ2UoZS5kYXRhKQogICAgICAgIH0KICAgICAgICAKCnRyeXsKICAgIHByb2Nlc3Mub24oJ3VuaGFuZGxlZFJlamVjdGlvbicsIChlcnIpID0+IHsKICAgICAgICBjb25zb2xlLmxvZygnaW5uZXI6dW5oYW5kbGVkUmVqZWN0aW9uJywgZXJyKQogICAgfSkKICAgIHByb2Nlc3Mub24oJ3VuY2F1Z2h0RXhjZXB0aW9uJywgKGVycikgPT4gewogICAgICAgIGNvbnNvbGUubG9nKCdpbm5lcjp1bmNhdWdodEV4Y2VwdGlvbicsIGVycikKICAgIH0pCiAgICBwcm9jZXNzLm9uKCd1bmNhdWdodEV4Y2VwdGlvbk1vbml0b3InLCAoZXJyKSA9PiB7CiAgICAgICAgY29uc29sZS5sb2coJ2lubmVyOnVuY2F1Z2h0RXhjZXB0aW9uTW9uaXRvcicsIGVycikKICAgIH0pCn0KY2F0Y2goZXJyKXt9Cgo=");function c(){let c=l(),G=function(l){try{let Z=new Blob([l]),d=window.URL||window.webkitURL;return new Worker(d.createObjectURL(Z))}catch(l){b(l)}}(m);if(!G)return b("invalid worker"),null;function b(l){c.emit("error",l)}return G.onmessage=function(l){!function(l){let Z=l,d=Z.mode;"emit"!==d&&"return"!==d||("emit"===d&&c.emit(Z.evName,Z.msg),"return"===d&&c.emit(Z.id,Z))}(l.data)},G.onerror=b,G.onmessageerror=function(l){b(l.data)},function(){let l={mode:"init",type:"object",input:[...arguments]};G.postMessage(l)}([...arguments]),c.stringify=function(){let l=Z(),m=d(),b={mode:"call",id:m,fun:"stringify",input:[...arguments]};return G.postMessage(b),c.once(m,(Z=>{"success"===Z.state?l.resolve(Z.msg):l.reject(Z.msg)})),l},c.parse=function(){let l=Z(),m=d(),b={mode:"call",id:m,fun:"parse",input:[...arguments]};return G.postMessage(b),c.once(m,(Z=>{"success"===Z.state?l.resolve(Z.msg):l.reject(Z.msg)})),l},c.terminate=function(){G?(G.terminate(),G=void 0):b("worker has been terminated")},c}let G={stringify:async function(){let l=[...arguments],Z=c();return await Z.stringify(...l).finally((()=>{Z.terminate()}))},parse:async function(){let l=[...arguments],Z=c();return await Z.parse(...l).finally((()=>{Z.terminate()}))}};R=l();for(let l in G){let Z=G[l];R[l]=Z}}();try{process.on("unhandledRejection",(l=>{console.log("outer:unhandledRejection",l)})),process.on("uncaughtException",(l=>{console.log("outer:uncaughtException",l)})),process.on("uncaughtExceptionMonitor",(l=>{console.log("outer:uncaughtExceptionMonitor",l)}))}catch(l){}return R}()}({get exports(){return m},set exports(l){m=l}});var c=m;let G;return G="undefined"!=typeof window&&void 0!==window.document?c:d,G}));
|