w-json-stream 1.0.35 → 1.0.37

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -455,10 +455,10 @@ Add script for w-json-stream.
455
455
  ```alias
456
456
 
457
457
  <!-- for basic -->
458
- <script src="https://cdn.jsdelivr.net/npm/w-json-stream@1.0.35/dist/w-json-stream.umd.js"></script>
458
+ <script src="https://cdn.jsdelivr.net/npm/w-json-stream@1.0.37/dist/w-json-stream.umd.js"></script>
459
459
 
460
460
  <!-- for web workers -->
461
- <script src="https://cdn.jsdelivr.net/npm/w-json-stream@1.0.35/dist/w-json-stream.wk.umd.js"></script>
461
+ <script src="https://cdn.jsdelivr.net/npm/w-json-stream@1.0.37/dist/w-json-stream.wk.umd.js"></script>
462
462
 
463
463
  ```
464
464
 
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * into-stream v1.0.35
2
+ * into-stream v1.0.37
3
3
  * (c) 2018-2021 yuda-lyu(semisphere)
4
4
  * Released under the MIT License.
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * json-stream-stringify v1.0.35
2
+ * json-stream-stringify v1.0.37
3
3
  * (c) 2018-2021 yuda-lyu(semisphere)
4
4
  * Released under the MIT License.
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * through v1.0.35
2
+ * through v1.0.37
3
3
  * (c) 2018-2021 yuda-lyu(semisphere)
4
4
  * Released under the MIT License.
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * w-json-stream v1.0.35
2
+ * w-json-stream v1.0.37
3
3
  * (c) 2018-2021 yuda-lyu(semisphere)
4
4
  * Released under the MIT License.
5
5
  */
@@ -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,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}));
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],i=arguments.length;if(p.fn){switch(p.once&&this.removeListener(l,p.fn,void 0,!0),i){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(i-1);I<i;I++)W[I-1]=arguments[I];p.fn.apply(p.context,W)}else{var u,y=p.length;for(I=0;I<y;I++)switch(p[I].once&&this.removeListener(l,p[I].fn,void 0,!0),i){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(u=1,W=new Array(i-1);u<i;u++)W[u-1]=arguments[u];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/Ii0wIjplfWZ1bmN0aW9uIFBlKHQsZSxyKXt2YXIgaT1udWxsPT10P3ZvaWQgMDpmdW5jdGlvbih0LGUpe2Zvcih2YXIgcj0wLGk9KGU9Q2UoZSx0KSkubGVuZ3RoO251bGwhPXQmJnI8aTspdD10W0ZlKGVbcisrXSldO3JldHVybiByJiZyPT1pP3Q6dm9pZCAwfSh0LGUpO3JldHVybiB2b2lkIDA9PT1pP3I6aX12YXIgTmU9IltvYmplY3QgTnVtYmVyXSI7ZnVuY3Rpb24gSWUodCl7cmV0dXJuIltvYmplY3QgU3RyaW5nXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9ZnVuY3Rpb24geGUodCl7cmV0dXJuISghSWUodCl8fCIiPT09dCl9ZnVuY3Rpb24gcWUodCl7cmV0dXJuIltvYmplY3QgQXJyYXldIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiBMZSh0KXtyZXR1cm4iW29iamVjdCBVbmRlZmluZWRdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiAkZSh0KXtyZXR1cm4iW29iamVjdCBPYmplY3RdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiBVZSh0KXtyZXR1cm4hKCFJZSh0KXx8IiIhPT10KX1mdW5jdGlvbiBNZSh0KXtyZXR1cm4hIUxlKHQpfHwoISFmdW5jdGlvbih0KXtyZXR1cm4iW29iamVjdCBOdWxsXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9KHQpfHwoISFmdW5jdGlvbih0KXtpZigkZSh0KSl7Zm9yKGxldCBlIGluIHQpcmV0dXJuITE7cmV0dXJuITB9cmV0dXJuITF9KHQpfHwoISFVZSh0KXx8KCEhZnVuY3Rpb24odCl7cmV0dXJuISFxZSh0KSYmMD09PXQubGVuZ3RofSh0KXx8ISFmdW5jdGlvbih0KXtyZXR1cm4gdCE9dH0odCkpKSkpfWZ1bmN0aW9uIHplKCl7bGV0IHQsZSxyPW5ldyBQcm9taXNlKChmdW5jdGlvbigpe3Q9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdfSkpO3JldHVybiByLnJlc29sdmU9dCxyLnJlamVjdD1lLHJ9bGV0IFdKc29uU3RyZWFtPXtwYXJzZTphc3luYyBmdW5jdGlvbih0KXtpZigheGUodCkpcmV0dXJue307bGV0IGU9e307dHJ5e2U9SlNPTi5wYXJzZSh0KX1jYXRjaCh0KXtlPXt9fXJldHVybiBlfSxwYXJzZUJ5U3RyZWFtOmZ1bmN0aW9uKHQpe2xldCBlPXt9O2lmKCJudWxsIj09PXQpcmV0dXJuIG51bGw7aWYoIiI9PT10KXJldHVybnt9O2xldCByPSJfX3N5c3RlbV9fIixpPWB7IiR7cn0iOiR7dH19YCxuPXplKCkscz1nKGkpLG89Y3QucGFyc2UoIiQqIik7cmV0dXJuIG8ub24oImRhdGEiLChmdW5jdGlvbih0KXtlW3Qua2V5XT10LnZhbHVlfSkpLG8ub24oImVuZCIsKGZ1bmN0aW9uKCl7bGV0IHQ9UGUoZSxyKTtuLnJlc29sdmUodCl9KSksby5vbigiZXJyb3IiLChmdW5jdGlvbih0KXtuLnJlamVjdCh0KX0pKSxzLnBpcGUobyksbn0sY3JlYXRlUGFyc2VTdHJlYW06ZnVuY3Rpb24odCl7dmFyIGU7cmV0dXJuIXhlKHQpJiYoIXFlKGU9dCl8fDA9PT1lLmxlbmd0aHx8MT09PWUubGVuZ3RoJiZNZShlWzBdKSkmJih0PSIkKiIpLGN0LnBhcnNlKHQpfSxzdHJpbmdpZnk6YXN5bmMgZnVuY3Rpb24odCl7aWYoTGUodCkpcmV0dXJuIiI7bGV0IGU9IiI7dHJ5e2U9SlNPTi5zdHJpbmdpZnkodCl9Y2F0Y2godCl7ZT0iIn1yZXR1cm4gZX0sc3RyaW5naWZ5QnlTdHJlYW06ZnVuY3Rpb24odCl7bGV0IGU9IiI7aWYoTGUodCkpcmV0dXJuIiI7aWYobnVsbD09PXQpcmV0dXJuIm51bGwiO2lmKFVlKHQpKXJldHVybiciIic7aWYoIm51bWJlciI9PXR5cGVvZihyPXQpfHwkdChyKSYmTHQocik9PU5lKXJldHVybmAke3R9YDt2YXIgcjtpZihJZSh0KSlyZXR1cm5gIiR7dH0iYDtsZXQgaT16ZSgpLG49bmV3IGp0KHQsbnVsbCxudWxsLCExKTtyZXR1cm4gbi5vbigiZGF0YSIsKGZ1bmN0aW9uKHQpe2UrPXR9KSksbi5vbigiZW5kIiwoZnVuY3Rpb24oKXtpLnJlc29sdmUoZSl9KSksbi5vbigiZXJyb3IiLChmdW5jdGlvbih0KXtpLnJlamVjdCh0KX0pKSxpfSxjcmVhdGVTdHJpbmdpZnlTdHJlYW06ZnVuY3Rpb24odCl7aWYoISRlKHQpJiYhcWUodCkpdGhyb3cgbmV3IEVycm9yKCJkYXRhIGlzIG5vdCBvYmplY3Qgb3IgYXJyYXkiKTtyZXR1cm4gbmV3IGp0KHQsbnVsbCxudWxsLCExKX19OwoKbGV0IGluc3RhbmNlID0gbnVsbApmdW5jdGlvbiBpbml0KGlucHV0KXsKCiAgICAvL2luaXQKICAgIGxldCByCiAgICAKICAgICAgICByID0gV0pzb25TdHJlYW0oLi4uaW5wdXQpCiAgICAgICAgCgogICAgLy9vbgogICAgCgogICAgLy9zYXZlCiAgICBpbnN0YW5jZSA9IHIKCn0KCmZ1bmN0aW9uIHNlbmRNZXNzYWdlKGRhdGEpIHsKICAgIAogICAgICAgIHBhcmVudFBvcnQucG9zdE1lc3NhZ2UoZGF0YSkKICAgICAgICAKfQoKYXN5bmMgZnVuY3Rpb24gcnVuKGRhdGEpIHsKICAgIC8vIGNvbnNvbGUubG9nKCdpbm5lciB3b3JrZXIgcnVuJyxkYXRhKQoKICAgIC8vbW9kZQogICAgbGV0IG1vZGUgPSBkYXRhLm1vZGUKCiAgICAvL2NoZWNrCiAgICBpZihtb2RlICE9PSAnaW5pdCcgJiYgbW9kZSAhPT0gJ2NhbGwnKXsKICAgICAgICByZXR1cm4KICAgIH0KCiAgICAvL2luaXQKICAgIGlmKG1vZGUgPT09ICdpbml0Jyl7CiAgICAgICAgCiAgICAgICAgdHJ5ewoKICAgICAgICAgICAgLy90eXBlCiAgICAgICAgICAgIGxldCB0eXBlID0gZGF0YS50eXBlCgogICAgICAgICAgICAvL2lucHV0CiAgICAgICAgICAgIGxldCBpbnB1dCA9IGRhdGEuaW5wdXQKICAgIAogICAgICAgICAgICAvL2luc3RhbmNlCiAgICAgICAgICAgIGlmKHR5cGUgPT09ICdmdW5jdGlvbicpewogICAgICAgICAgICAgICAgaW5pdCguLi5pbnB1dCkKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmKHR5cGUgPT09ICdvYmplY3QnKXsKICAgICAgICAgICAgICAgIGluc3RhbmNlID0gV0pzb25TdHJlYW0KICAgICAgICAgICAgfQoKICAgICAgICB9CiAgICAgICAgY2F0Y2goZXJyKXsKICAgICAgICAKICAgICAgICAgICAgLy9zZW5kTWVzc2FnZQogICAgICAgICAgICBsZXQgcmVzID0gewogICAgICAgICAgICAgICAgbW9kZTogJ2VtaXQnLAogICAgICAgICAgICAgICAgZXZOYW1lOiAnZXJyb3InLAogICAgICAgICAgICAgICAgbXNnOiBlcnIsCiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2VuZE1lc3NhZ2UocmVzKQoKICAgICAgICB9CiAgICAgICAgICAgIAogICAgfQoKICAgIC8vY2hlY2sKICAgIGlmKG1vZGUgPT09ICdjYWxsJyl7CiAgICAgICAgbGV0IHN0YXRlID0gJycKICAgICAgICBsZXQgbXNnID0gbnVsbAoKICAgICAgICB0cnl7CgogICAgICAgICAgICAvL2Z1bgogICAgICAgICAgICBsZXQgZnVuID0gaW5zdGFuY2VbZGF0YS5mdW5dCgogICAgICAgICAgICAvL2lucHV0CiAgICAgICAgICAgIGxldCBpbnB1dCA9IGRhdGEuaW5wdXQKCiAgICAgICAgICAgIC8vZXhlYwogICAgICAgICAgICBhd2FpdCBmdW4oLi4uaW5wdXQpCiAgICAgICAgICAgICAgICAudGhlbigoc3VjKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGU9J3N1Y2Nlc3MnCiAgICAgICAgICAgICAgICAgICAgbXNnPXN1YwogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgIC5jYXRjaCgoZXJyKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGU9J2Vycm9yJwogICAgICAgICAgICAgICAgICAgIG1zZz1lcnIKICAgICAgICAgICAgICAgIH0pCgogICAgICAgIH0KICAgICAgICBjYXRjaChlcnIpewogICAgICAgICAgICBzdGF0ZSA9ICdlcnJvcicKICAgICAgICAgICAgbXNnID0gZXJyCiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vc2VuZE1lc3NhZ2UKICAgICAgICBsZXQgcmVzID0gewogICAgICAgICAgICBtb2RlOiAncmV0dXJuJywKICAgICAgICAgICAgaWQ6IGRhdGEuaWQsCiAgICAgICAgICAgIGZ1bjogZGF0YS5mdW4sCiAgICAgICAgICAgIHN0YXRlLAogICAgICAgICAgICBtc2csCiAgICAgICAgfQogICAgICAgIHNlbmRNZXNzYWdlKHJlcykKCiAgICB9Cgp9CgpmdW5jdGlvbiByZWN2TWVzc2FnZShkYXRhKSB7CiAgICAvLyBjb25zb2xlLmxvZygnaW5uZXIgd29ya2VyIHJlY3Y6JywgZGF0YSkKCiAgICAvL2RhdGFSZWN2CiAgICBsZXQgZGF0YVJlY3YgPSBkYXRhCgogICAgLy9ydW4KICAgIHJ1bihkYXRhUmVjdikKCn0KCgogICAgICAgIHBhcmVudFBvcnQub24oJ21lc3NhZ2UnLCByZWN2TWVzc2FnZSkKICAgICAgICAKCnRyeXsKCiAgICAvL+WDheS7pXVuY2F1Z2h0RXhjZXB0aW9uTW9uaXRvcuiomOmMhCwg5LiN5Y+v6Ki75YaKdW5jYXVnaHRFeGNlcHRpb27oiId1bmhhbmRsZWRSZWplY3Rpb27nm6Pogb06CiAgICAvL+aWvHdvcmtlcuWFp+iou+WGiuatpOS6jOebo+iBveacg+mYu+atok5vZGXpoJDoqK3nmoR3b3JrZXLntYLmraLooYzngrosIOS9v3dvcmtlcuW0qea9sOW+jOS7jeWtmOa0u+epuui9iSwKICAgIC8v5aSW5bGk5pS25LiN5YiwZXJyb3IvZXhpdOS6i+S7tiwgcGVuZGluZyBwcm9taXNl5rC45LmF5oe4572uLCDkuJTlrZjmtLvmrq3lsY13b3JrZXLmnIPku6Tlrr/kuLvnqIvluo/nhKHms5XpgIDlh7o7CiAgICAvL+enu+mZpOW+jHdvcmtlcuS+nemgkOioreihjOeCuuatu+S6oSwgZXJyb3Lkuovku7blgrPoh7PlpJblsaQsIOeUseWkluWxpOaVtOaJuXJlamVjdCBwZW5kaW5nCiAgICAvLyBwcm9jZXNzLm9uKCd1bmhhbmRsZWRSZWplY3Rpb24nLCAoZXJyKSA9PiB7CiAgICAvLyAgICAgY29uc29sZS5sb2coJ2lubmVyOnVuaGFuZGxlZFJlamVjdGlvbicsIGVycikKICAgIC8vIH0pCiAgICAvLyBwcm9jZXNzLm9uKCd1bmNhdWdodEV4Y2VwdGlvbicsIChlcnIpID0+IHsKICAgIC8vICAgICBjb25zb2xlLmxvZygnaW5uZXI6dW5jYXVnaHRFeGNlcHRpb24nLCBlcnIpCiAgICAvLyB9KQogICAgcHJvY2Vzcy5vbigndW5jYXVnaHRFeGNlcHRpb25Nb25pdG9yJywgKGVycikgPT4gewogICAgICAgIGNvbnNvbGUubG9nKCdpbm5lcjp1bmNhdWdodEV4Y2VwdGlvbk1vbml0b3InLCBlcnIpCiAgICB9KQoKfQpjYXRjaChlcnIpe30KCg==",Buffer.from(X,"base64").toString("utf8"));var X;function W(){let d=Z(),m={},X=!1,W=!1;function I(l){for(let Z in m){let c=m[Z];delete m[Z],d.removeAllListeners(Z),c.reject(l)}d.emit("error",l)}function p(l){X||(X=!0,I(l))}let i=function(Z){try{return new l.Worker(Z,{eval:!0})}catch(l){p(l)}}(b);return i?(i.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))})),i.on("error",p),i.on("exit",(l=>{W||p("worker exit, code["+l+"]")})),function(){let l={mode:"init",type:"object",input:[...arguments]};i.postMessage(l)}([...arguments]),d.stringify=function(){let l=c();if(X)return l.reject("worker is dead"),l;let Z=G();m[Z]=l;let b={mode:"call",id:Z,fun:"stringify",input:[...arguments]};return i.postMessage(b),d.once(Z,(d=>{delete m[Z],"success"===d.state?l.resolve(d.msg):l.reject(d.msg)})),l},d.parse=function(){let l=c();if(X)return l.reject("worker is dead"),l;let Z=G();m[Z]=l;let b={mode:"call",id:Z,fun:"parse",input:[...arguments]};return i.postMessage(b),d.once(Z,(d=>{delete m[Z],"success"===d.state?l.resolve(d.msg):l.reject(d.msg)})),l},d.terminate=function(){i?(W=!0,i.terminate(),i=void 0):I("worker has been terminated")},d):(p("invalid worker"),null)}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("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("")},i="function"==typeof atob?l=>atob(b(l)):p,u="function"==typeof Uint8Array.fromBase64?l=>Uint8Array.fromBase64(l):l=>G(i(l).split("").map((l=>l.charCodeAt(0)))),y=l?Z=>l.decode(u(Z)):l=>I(i(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],i=arguments.length;if(p.fn){switch(p.once&&this.removeListener(l,p.fn,void 0,!0),i){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(i-1);I<i;I++)W[I-1]=arguments[I];p.fn.apply(p.context,W)}else{var u,y=p.length;for(I=0;I<y;I++)switch(p[I].once&&this.removeListener(l,p[I].fn,void 0,!0),i){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(u=1,W=new Array(i-1);u<i;u++)W[u-1]=arguments[u];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 C;!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/cjpufXZhciBqaT0iW29iamVjdCBOdW1iZXJdIjtmdW5jdGlvbiBMaSh0KXtyZXR1cm4iW29iamVjdCBTdHJpbmddIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiBDaSh0KXtyZXR1cm4hKCFMaSh0KXx8IiI9PT10KX1mdW5jdGlvbiBQaSh0KXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWZ1bmN0aW9uIE1pKHQpe3JldHVybiJbb2JqZWN0IFVuZGVmaW5lZF0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWZ1bmN0aW9uIEJpKHQpe3JldHVybiJbb2JqZWN0IE9iamVjdF0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWZ1bmN0aW9uIHhpKHQpe3JldHVybiEoIUxpKHQpfHwiIiE9PXQpfWZ1bmN0aW9uIFVpKHQpe3JldHVybiEhTWkodCl8fCghIWZ1bmN0aW9uKHQpe3JldHVybiJbb2JqZWN0IE51bGxdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX0odCl8fCghIWZ1bmN0aW9uKHQpe2lmKEJpKHQpKXtmb3IobGV0IGUgaW4gdClyZXR1cm4hMTtyZXR1cm4hMH1yZXR1cm4hMX0odCl8fCghIXhpKHQpfHwoISFmdW5jdGlvbih0KXtyZXR1cm4hIVBpKHQpJiYwPT09dC5sZW5ndGh9KHQpfHwhIWZ1bmN0aW9uKHQpe3JldHVybiB0IT10fSh0KSkpKSl9ZnVuY3Rpb24gSWkoKXtsZXQgdCxlLHI9bmV3IFByb21pc2UoKGZ1bmN0aW9uKCl7dD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV19KSk7cmV0dXJuIHIucmVzb2x2ZT10LHIucmVqZWN0PWUscn1sZXQgV0pzb25TdHJlYW09e3BhcnNlOmFzeW5jIGZ1bmN0aW9uKHQpe2lmKCFDaSh0KSlyZXR1cm57fTtsZXQgZT17fTt0cnl7ZT1KU09OLnBhcnNlKHQpfWNhdGNoKHQpe2U9e319cmV0dXJuIGV9LHBhcnNlQnlTdHJlYW06ZnVuY3Rpb24odCl7bGV0IGU9e307aWYoIm51bGwiPT09dClyZXR1cm4gbnVsbDtpZigiIj09PXQpcmV0dXJue307bGV0IHI9Il9fc3lzdGVtX18iLG49YHsiJHtyfSI6JHt0fX1gLGk9SWkoKSxvPWZyKG4pLHM9c24ucGFyc2UoIiQqIik7cmV0dXJuIHMub24oImRhdGEiLChmdW5jdGlvbih0KXtlW3Qua2V5XT10LnZhbHVlfSkpLHMub24oImVuZCIsKGZ1bmN0aW9uKCl7bGV0IHQ9VGkoZSxyKTtpLnJlc29sdmUodCl9KSkscy5vbigiZXJyb3IiLChmdW5jdGlvbih0KXtpLnJlamVjdCh0KX0pKSxvLnBpcGUocyksaX0sY3JlYXRlUGFyc2VTdHJlYW06ZnVuY3Rpb24odCl7cmV0dXJuIENpKHQpfHxmdW5jdGlvbih0KXtyZXR1cm4hKCFQaSh0KXx8MD09PXQubGVuZ3RofHwxPT09dC5sZW5ndGgmJlVpKHRbMF0pKX0odCl8fCh0PSIkKiIpLHNuLnBhcnNlKHQpfSxzdHJpbmdpZnk6YXN5bmMgZnVuY3Rpb24odCl7aWYoTWkodCkpcmV0dXJuIiI7bGV0IGU9IiI7dHJ5e2U9SlNPTi5zdHJpbmdpZnkodCl9Y2F0Y2godCl7ZT0iIn1yZXR1cm4gZX0sc3RyaW5naWZ5QnlTdHJlYW06ZnVuY3Rpb24odCl7bGV0IGU9IiI7aWYoTWkodCkpcmV0dXJuIiI7aWYobnVsbD09PXQpcmV0dXJuIm51bGwiO2lmKHhpKHQpKXJldHVybiciIic7aWYoIm51bWJlciI9PXR5cGVvZihyPXQpfHxCbihyKSYmTW4ocik9PWppKXJldHVybmAke3R9YDt2YXIgcjtpZihMaSh0KSlyZXR1cm5gIiR7dH0iYDtsZXQgbj1JaSgpLGk9bmV3IG1uKHQsbnVsbCxudWxsLCExKTtyZXR1cm4gaS5vbigiZGF0YSIsKGZ1bmN0aW9uKHQpe2UrPXR9KSksaS5vbigiZW5kIiwoZnVuY3Rpb24oKXtuLnJlc29sdmUoZSl9KSksaS5vbigiZXJyb3IiLChmdW5jdGlvbih0KXtuLnJlamVjdCh0KX0pKSxufSxjcmVhdGVTdHJpbmdpZnlTdHJlYW06ZnVuY3Rpb24odCl7aWYoIUJpKHQpJiYhUGkodCkpdGhyb3cgbmV3IEVycm9yKCJkYXRhIGlzIG5vdCBvYmplY3Qgb3IgYXJyYXkiKTtyZXR1cm4gbmV3IG1uKHQsbnVsbCxudWxsLCExKX19OwoKbGV0IGluc3RhbmNlID0gbnVsbApmdW5jdGlvbiBpbml0KGlucHV0KXsKCiAgICAvL2luaXQKICAgIGxldCByCiAgICAKICAgICAgICByID0gV0pzb25TdHJlYW0oLi4uaW5wdXQpCiAgICAgICAgCgogICAgLy9vbgogICAgCgogICAgLy9zYXZlCiAgICBpbnN0YW5jZSA9IHIKCn0KCmZ1bmN0aW9uIHNlbmRNZXNzYWdlKGRhdGEpIHsKICAgIAogICAgICAgIHNlbGYucG9zdE1lc3NhZ2UoZGF0YSkKICAgICAgICAKfQoKYXN5bmMgZnVuY3Rpb24gcnVuKGRhdGEpIHsKICAgIC8vIGNvbnNvbGUubG9nKCdpbm5lciB3b3JrZXIgcnVuJyxkYXRhKQoKICAgIC8vbW9kZQogICAgbGV0IG1vZGUgPSBkYXRhLm1vZGUKCiAgICAvL2NoZWNrCiAgICBpZihtb2RlICE9PSAnaW5pdCcgJiYgbW9kZSAhPT0gJ2NhbGwnKXsKICAgICAgICByZXR1cm4KICAgIH0KCiAgICAvL2luaXQKICAgIGlmKG1vZGUgPT09ICdpbml0Jyl7CiAgICAgICAgCiAgICAgICAgdHJ5ewoKICAgICAgICAgICAgLy90eXBlCiAgICAgICAgICAgIGxldCB0eXBlID0gZGF0YS50eXBlCgogICAgICAgICAgICAvL2lucHV0CiAgICAgICAgICAgIGxldCBpbnB1dCA9IGRhdGEuaW5wdXQKICAgIAogICAgICAgICAgICAvL2luc3RhbmNlCiAgICAgICAgICAgIGlmKHR5cGUgPT09ICdmdW5jdGlvbicpewogICAgICAgICAgICAgICAgaW5pdCguLi5pbnB1dCkKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmKHR5cGUgPT09ICdvYmplY3QnKXsKICAgICAgICAgICAgICAgIGluc3RhbmNlID0gV0pzb25TdHJlYW0KICAgICAgICAgICAgfQoKICAgICAgICB9CiAgICAgICAgY2F0Y2goZXJyKXsKICAgICAgICAKICAgICAgICAgICAgLy9zZW5kTWVzc2FnZQogICAgICAgICAgICBsZXQgcmVzID0gewogICAgICAgICAgICAgICAgbW9kZTogJ2VtaXQnLAogICAgICAgICAgICAgICAgZXZOYW1lOiAnZXJyb3InLAogICAgICAgICAgICAgICAgbXNnOiBlcnIsCiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2VuZE1lc3NhZ2UocmVzKQoKICAgICAgICB9CiAgICAgICAgICAgIAogICAgfQoKICAgIC8vY2hlY2sKICAgIGlmKG1vZGUgPT09ICdjYWxsJyl7CiAgICAgICAgbGV0IHN0YXRlID0gJycKICAgICAgICBsZXQgbXNnID0gbnVsbAoKICAgICAgICB0cnl7CgogICAgICAgICAgICAvL2Z1bgogICAgICAgICAgICBsZXQgZnVuID0gaW5zdGFuY2VbZGF0YS5mdW5dCgogICAgICAgICAgICAvL2lucHV0CiAgICAgICAgICAgIGxldCBpbnB1dCA9IGRhdGEuaW5wdXQKCiAgICAgICAgICAgIC8vZXhlYwogICAgICAgICAgICBhd2FpdCBmdW4oLi4uaW5wdXQpCiAgICAgICAgICAgICAgICAudGhlbigoc3VjKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGU9J3N1Y2Nlc3MnCiAgICAgICAgICAgICAgICAgICAgbXNnPXN1YwogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgIC5jYXRjaCgoZXJyKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGU9J2Vycm9yJwogICAgICAgICAgICAgICAgICAgIG1zZz1lcnIKICAgICAgICAgICAgICAgIH0pCgogICAgICAgIH0KICAgICAgICBjYXRjaChlcnIpewogICAgICAgICAgICBzdGF0ZSA9ICdlcnJvcicKICAgICAgICAgICAgbXNnID0gZXJyCiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vc2VuZE1lc3NhZ2UKICAgICAgICBsZXQgcmVzID0gewogICAgICAgICAgICBtb2RlOiAncmV0dXJuJywKICAgICAgICAgICAgaWQ6IGRhdGEuaWQsCiAgICAgICAgICAgIGZ1bjogZGF0YS5mdW4sCiAgICAgICAgICAgIHN0YXRlLAogICAgICAgICAgICBtc2csCiAgICAgICAgfQogICAgICAgIHNlbmRNZXNzYWdlKHJlcykKCiAgICB9Cgp9CgpmdW5jdGlvbiByZWN2TWVzc2FnZShkYXRhKSB7CiAgICAvLyBjb25zb2xlLmxvZygnaW5uZXIgd29ya2VyIHJlY3Y6JywgZGF0YSkKCiAgICAvL2RhdGFSZWN2CiAgICBsZXQgZGF0YVJlY3YgPSBkYXRhCgogICAgLy9ydW4KICAgIHJ1bihkYXRhUmVjdikKCn0KCgogICAgICAgIHNlbGYub25tZXNzYWdlID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgcmVjdk1lc3NhZ2UoZS5kYXRhKQogICAgICAgIH0KICAgICAgICAKCnRyeXsKCiAgICAvL+WDheS7pXVuY2F1Z2h0RXhjZXB0aW9uTW9uaXRvcuiomOmMhCwg5LiN5Y+v6Ki75YaKdW5jYXVnaHRFeGNlcHRpb27oiId1bmhhbmRsZWRSZWplY3Rpb27nm6Pogb06CiAgICAvL+aWvHdvcmtlcuWFp+iou+WGiuatpOS6jOebo+iBveacg+mYu+atok5vZGXpoJDoqK3nmoR3b3JrZXLntYLmraLooYzngrosIOS9v3dvcmtlcuW0qea9sOW+jOS7jeWtmOa0u+epuui9iSwKICAgIC8v5aSW5bGk5pS25LiN5YiwZXJyb3IvZXhpdOS6i+S7tiwgcGVuZGluZyBwcm9taXNl5rC45LmF5oe4572uLCDkuJTlrZjmtLvmrq3lsY13b3JrZXLmnIPku6Tlrr/kuLvnqIvluo/nhKHms5XpgIDlh7o7CiAgICAvL+enu+mZpOW+jHdvcmtlcuS+nemgkOioreihjOeCuuatu+S6oSwgZXJyb3Lkuovku7blgrPoh7PlpJblsaQsIOeUseWkluWxpOaVtOaJuXJlamVjdCBwZW5kaW5nCiAgICAvLyBwcm9jZXNzLm9uKCd1bmhhbmRsZWRSZWplY3Rpb24nLCAoZXJyKSA9PiB7CiAgICAvLyAgICAgY29uc29sZS5sb2coJ2lubmVyOnVuaGFuZGxlZFJlamVjdGlvbicsIGVycikKICAgIC8vIH0pCiAgICAvLyBwcm9jZXNzLm9uKCd1bmNhdWdodEV4Y2VwdGlvbicsIChlcnIpID0+IHsKICAgIC8vICAgICBjb25zb2xlLmxvZygnaW5uZXI6dW5jYXVnaHRFeGNlcHRpb24nLCBlcnIpCiAgICAvLyB9KQogICAgcHJvY2Vzcy5vbigndW5jYXVnaHRFeGNlcHRpb25Nb25pdG9yJywgKGVycikgPT4gewogICAgICAgIGNvbnNvbGUubG9nKCdpbm5lcjp1bmNhdWdodEV4Y2VwdGlvbk1vbml0b3InLCBlcnIpCiAgICB9KQoKfQpjYXRjaChlcnIpe30KCg==");function c(){let c=l(),G={},b=!1;function X(l){for(let Z in G){let d=G[Z];delete G[Z],c.removeAllListeners(Z),d.reject(l)}c.emit("error",l)}function W(l){b||(b=!0,X(l))}let I=function(l){try{let Z=new Blob([l]),d=window.URL||window.webkitURL;return new Worker(d.createObjectURL(Z))}catch(l){W(l)}}(m);return I?(I.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)},I.onerror=W,I.onmessageerror=function(l){X(l.data)},function(){let l={mode:"init",type:"object",input:[...arguments]};I.postMessage(l)}([...arguments]),c.stringify=function(){let l=Z();if(b)return l.reject("worker is dead"),l;let m=d();G[m]=l;let X={mode:"call",id:m,fun:"stringify",input:[...arguments]};return I.postMessage(X),c.once(m,(Z=>{delete G[m],"success"===Z.state?l.resolve(Z.msg):l.reject(Z.msg)})),l},c.parse=function(){let l=Z();if(b)return l.reject("worker is dead"),l;let m=d();G[m]=l;let X={mode:"call",id:m,fun:"parse",input:[...arguments]};return I.postMessage(X),c.once(m,(Z=>{delete G[m],"success"===Z.state?l.resolve(Z.msg):l.reject(Z.msg)})),l},c.terminate=function(){I?(I.terminate(),I=void 0):X("worker has been terminated")},c):(W("invalid worker"),null)}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()}))}};C=l();for(let l in G){let Z=G[l];C[l]=Z}}();try{process.on("uncaughtExceptionMonitor",(l=>{console.log("outer:uncaughtExceptionMonitor",l)}))}catch(l){}return C}()}({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}));
@@ -287,7 +287,7 @@ export default WJsonStream
287
287
  <br class="clear">
288
288
 
289
289
  <footer>
290
- Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Wed Sep 02 2026 18:10:46 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
290
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Sun Sep 13 2026 12:47:43 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
291
291
  </footer>
292
292
 
293
293
  <script>prettyPrint();</script>
@@ -10,8 +10,8 @@
10
10
 
11
11
  <script src="https://cdn.jsdelivr.net/npm/wsemi/dist/wsemi.umd.js"></script>
12
12
 
13
- <script _src="https://cdn.jsdelivr.net/npm/w-json-stream@1.0.35/dist/w-json-stream.umd.js"></script>
14
- <script msg="封裝woker無法使用createStringifyStream回傳為stream對象" src="https://cdn.jsdelivr.net/npm/w-json-stream@1.0.35/dist/w-json-stream.wk.umd.js"></script>
13
+ <script _src="https://cdn.jsdelivr.net/npm/w-json-stream@1.0.37/dist/w-json-stream.umd.js"></script>
14
+ <script msg="封裝woker無法使用createStringifyStream回傳為stream對象" src="https://cdn.jsdelivr.net/npm/w-json-stream@1.0.37/dist/w-json-stream.wk.umd.js"></script>
15
15
 
16
16
  <script>
17
17
  console.log('WebWorkers(from blob) does not support IE11')
@@ -10,8 +10,8 @@
10
10
 
11
11
  <script src="https://cdn.jsdelivr.net/npm/wsemi/dist/wsemi.umd.js"></script>
12
12
 
13
- <script src="https://cdn.jsdelivr.net/npm/w-json-stream@1.0.35/dist/w-json-stream.umd.js"></script>
14
- <script msg="封裝woker無法使用createStringifyStream回傳為stream對象" _src="https://cdn.jsdelivr.net/npm/w-json-stream@1.0.35/dist/w-json-stream.wk.umd.js"></script>
13
+ <script src="https://cdn.jsdelivr.net/npm/w-json-stream@1.0.37/dist/w-json-stream.umd.js"></script>
14
+ <script msg="封裝woker無法使用createStringifyStream回傳為stream對象" _src="https://cdn.jsdelivr.net/npm/w-json-stream@1.0.37/dist/w-json-stream.wk.umd.js"></script>
15
15
 
16
16
  <script>
17
17
 
@@ -10,8 +10,8 @@
10
10
 
11
11
  <script src="https://cdn.jsdelivr.net/npm/wsemi/dist/wsemi.umd.js"></script>
12
12
 
13
- <script src="https://cdn.jsdelivr.net/npm/w-json-stream@1.0.35/dist/w-json-stream.umd.js"></script>
14
- <script msg="封裝woker無法使用createStringifyStream回傳為stream對象" _src="https://cdn.jsdelivr.net/npm/w-json-stream@1.0.35/dist/w-json-stream.wk.umd.js"></script>
13
+ <script src="https://cdn.jsdelivr.net/npm/w-json-stream@1.0.37/dist/w-json-stream.umd.js"></script>
14
+ <script msg="封裝woker無法使用createStringifyStream回傳為stream對象" _src="https://cdn.jsdelivr.net/npm/w-json-stream@1.0.37/dist/w-json-stream.wk.umd.js"></script>
15
15
 
16
16
  <script>
17
17
 
@@ -10,8 +10,8 @@
10
10
 
11
11
  <script src="https://cdn.jsdelivr.net/npm/wsemi/dist/wsemi.umd.js"></script>
12
12
 
13
- <script src="https://cdn.jsdelivr.net/npm/w-json-stream@1.0.35/dist/w-json-stream.umd.js"></script>
14
- <script msg="封裝woker無法使用createStringifyStream回傳為stream對象" _src="https://cdn.jsdelivr.net/npm/w-json-stream@1.0.35/dist/w-json-stream.wk.umd.js"></script>
13
+ <script src="https://cdn.jsdelivr.net/npm/w-json-stream@1.0.37/dist/w-json-stream.umd.js"></script>
14
+ <script msg="封裝woker無法使用createStringifyStream回傳為stream對象" _src="https://cdn.jsdelivr.net/npm/w-json-stream@1.0.37/dist/w-json-stream.wk.umd.js"></script>
15
15
 
16
16
  <script>
17
17
 
@@ -10,8 +10,8 @@
10
10
 
11
11
  <script src="https://cdn.jsdelivr.net/npm/wsemi/dist/wsemi.umd.js"></script>
12
12
 
13
- <script src="https://cdn.jsdelivr.net/npm/w-json-stream@1.0.35/dist/w-json-stream.umd.js"></script>
14
- <script msg="封裝woker無法使用createStringifyStream回傳為stream對象" _src="https://cdn.jsdelivr.net/npm/w-json-stream@1.0.35/dist/w-json-stream.wk.umd.js"></script>
13
+ <script src="https://cdn.jsdelivr.net/npm/w-json-stream@1.0.37/dist/w-json-stream.umd.js"></script>
14
+ <script msg="封裝woker無法使用createStringifyStream回傳為stream對象" _src="https://cdn.jsdelivr.net/npm/w-json-stream@1.0.37/dist/w-json-stream.wk.umd.js"></script>
15
15
 
16
16
  <script>
17
17
  console.log('ReadableStream does not support IE11')
@@ -12,9 +12,9 @@
12
12
 
13
13
  <script src="https://cdn.jsdelivr.net/npm/wsemi/dist/wsemi.umd.js"></script>
14
14
 
15
- <script src="https://cdn.jsdelivr.net/npm/w-json-stream@1.0.35/dist/into-stream.umd.js"></script>
16
- <script src="https://cdn.jsdelivr.net/npm/w-json-stream@1.0.35/dist/w-json-stream.umd.js"></script>
17
- <script msg="封裝woker無法使用createStringifyStream回傳為stream對象" _src="https://cdn.jsdelivr.net/npm/w-json-stream@1.0.35/dist/w-json-stream.wk.umd.js"></script>
15
+ <script src="https://cdn.jsdelivr.net/npm/w-json-stream@1.0.37/dist/into-stream.umd.js"></script>
16
+ <script src="https://cdn.jsdelivr.net/npm/w-json-stream@1.0.37/dist/w-json-stream.umd.js"></script>
17
+ <script msg="封裝woker無法使用createStringifyStream回傳為stream對象" _src="https://cdn.jsdelivr.net/npm/w-json-stream@1.0.37/dist/w-json-stream.wk.umd.js"></script>
18
18
 
19
19
  <script>
20
20
  console.log('ReadableStream does not support IE11')
@@ -10,8 +10,8 @@
10
10
 
11
11
  <script src="https://cdn.jsdelivr.net/npm/wsemi/dist/wsemi.umd.js"></script>
12
12
 
13
- <script src="https://cdn.jsdelivr.net/npm/w-json-stream@1.0.35/dist/w-json-stream.umd.js"></script>
14
- <script msg="封裝woker無法使用createStringifyStream回傳為stream對象" _src="https://cdn.jsdelivr.net/npm/w-json-stream@1.0.35/dist/w-json-stream.wk.umd.js"></script>
13
+ <script src="https://cdn.jsdelivr.net/npm/w-json-stream@1.0.37/dist/w-json-stream.umd.js"></script>
14
+ <script msg="封裝woker無法使用createStringifyStream回傳為stream對象" _src="https://cdn.jsdelivr.net/npm/w-json-stream@1.0.37/dist/w-json-stream.wk.umd.js"></script>
15
15
 
16
16
  <script>
17
17
  console.log('WritableStream does not support IE11 and Firefox')
package/docs/global.html CHANGED
@@ -1196,7 +1196,7 @@
1196
1196
  <br class="clear">
1197
1197
 
1198
1198
  <footer>
1199
- Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Wed Sep 02 2026 18:10:46 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
1199
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Sun Sep 13 2026 12:47:43 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
1200
1200
  </footer>
1201
1201
 
1202
1202
  <script>prettyPrint();</script>
package/docs/index.html CHANGED
@@ -71,7 +71,7 @@
71
71
  <br class="clear">
72
72
 
73
73
  <footer>
74
- Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Wed Sep 02 2026 18:10:46 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
74
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Sun Sep 13 2026 12:47:43 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
75
75
  </footer>
76
76
 
77
77
  <script>prettyPrint();</script>
package/package.json CHANGED
@@ -1,16 +1,16 @@
1
1
  {
2
2
  "name": "w-json-stream",
3
- "version": "1.0.35",
3
+ "version": "1.0.37",
4
4
  "main": "dist/w-json-stream.umd.js",
5
5
  "dependencies": {
6
6
  "jsonparse": "^1.3.1",
7
- "wsemi": "^1.8.84"
7
+ "wsemi": "^1.8.92"
8
8
  },
9
9
  "devDependencies": {
10
- "w-package-tools": "^1.1.15"
10
+ "w-package-tools": "^1.1.16"
11
11
  },
12
12
  "scripts": {
13
- "test": "mocha --parallel --timeout 60000",
13
+ "test": "mocha --parallel \"test/*.test.mjs\" --timeout 180000",
14
14
  "deploy": "gh-pages -d docs"
15
15
  },
16
16
  "repository": {