From 9e43c455ad9c30aefd2ccecc80f250236764bd5b Mon Sep 17 00:00:00 2001 From: nearnshaw Date: Wed, 17 Jan 2024 16:54:12 -0300 Subject: [PATCH] screenshot --- bin/game.js | 38318 ++++++++++++++++++++++++++++++++++++++++++++- images/thumb.png | Bin 0 -> 1076180 bytes scene.json | 4 +- 3 files changed, 38254 insertions(+), 68 deletions(-) create mode 100644 images/thumb.png diff --git a/bin/game.js b/bin/game.js index 9c04972..9785417 100644 --- a/bin/game.js +++ b/bin/game.js @@ -1,69 +1,38254 @@ -"use strict";var RT=Object.create;var Iu=Object.defineProperty;var vT=Object.getOwnPropertyDescriptor;var kT=Object.getOwnPropertyNames;var NT=Object.getPrototypeOf,wT=Object.prototype.hasOwnProperty;var Lt=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),AT=(e,t)=>{for(var a in t)Iu(e,a,{get:t[a],enumerable:!0})},mh=(e,t,a,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of kT(t))!wT.call(e,s)&&s!==a&&Iu(e,s,{get:()=>t[s],enumerable:!(n=vT(t,s))||n.enumerable});return e};var Ue=(e,t,a)=>(a=e!=null?RT(NT(e)):{},mh(t||!e||!e.__esModule?Iu(a,"default",{value:e,enumerable:!0}):a,e)),OT=e=>mh(Iu({},"__esModule",{value:!0}),e);var yh=Lt((Jx,hh)=>{"use strict";hh.exports=CT;function CT(e,t){for(var a=new Array(arguments.length-1),n=0,s=2,i=!0;s{"use strict";var Mu=Th;Mu.length=function(t){var a=t.length;if(!a)return 0;for(var n=0;--a%4>1&&t.charAt(a)==="=";)++n;return Math.ceil(t.length*3)/4-n};var da=new Array(64),Eh=new Array(123);for(Mr=0;Mr<64;)Eh[da[Mr]=Mr<26?Mr+65:Mr<52?Mr+71:Mr<62?Mr-4:Mr-59|43]=Mr++;var Mr;Mu.encode=function(t,a,n){for(var s=null,i=[],f=0,u=0,c;a>2],c=(h&3)<<4,u=1;break;case 1:i[f++]=da[c|h>>4],c=(h&15)<<2,u=2;break;case 2:i[f++]=da[c|h>>6],i[f++]=da[h&63],u=0;break}f>8191&&((s||(s=[])).push(String.fromCharCode.apply(String,i)),f=0)}return u&&(i[f++]=da[c],i[f++]=61,u===1&&(i[f++]=61)),s?(f&&s.push(String.fromCharCode.apply(String,i.slice(0,f))),s.join("")):String.fromCharCode.apply(String,i.slice(0,f))};var gh="invalid encoding";Mu.decode=function(t,a,n){for(var s=n,i=0,f,u=0;u1)break;if((c=Eh[c])===void 0)throw Error(gh);switch(i){case 0:f=c,i=1;break;case 1:a[n++]=f<<2|(c&48)>>4,f=c,i=2;break;case 2:a[n++]=(f&15)<<4|(c&60)>>2,f=c,i=3;break;case 3:a[n++]=(f&3)<<6|c,i=0;break}}if(i===1)throw Error(gh);return n-s};Mu.test=function(t){return/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(t)}});var xh=Lt((Xx,Sh)=>{"use strict";Sh.exports=Pu;function Pu(){this._listeners={}}Pu.prototype.on=function(t,a,n){return(this._listeners[t]||(this._listeners[t]=[])).push({fn:a,ctx:n||this}),this};Pu.prototype.off=function(t,a){if(t===void 0)this._listeners={};else if(a===void 0)this._listeners[t]=[];else for(var n=this._listeners[t],s=0;s{"use strict";wh.exports=bh(bh);function bh(e){return typeof Float32Array<"u"?function(){var t=new Float32Array([-0]),a=new Uint8Array(t.buffer),n=a[3]===128;function s(c,h,E){t[0]=c,h[E]=a[0],h[E+1]=a[1],h[E+2]=a[2],h[E+3]=a[3]}function i(c,h,E){t[0]=c,h[E]=a[3],h[E+1]=a[2],h[E+2]=a[1],h[E+3]=a[0]}e.writeFloatLE=n?s:i,e.writeFloatBE=n?i:s;function f(c,h){return a[0]=c[h],a[1]=c[h+1],a[2]=c[h+2],a[3]=c[h+3],t[0]}function u(c,h){return a[3]=c[h],a[2]=c[h+1],a[1]=c[h+2],a[0]=c[h+3],t[0]}e.readFloatLE=n?f:u,e.readFloatBE=n?u:f}():function(){function t(n,s,i,f){var u=s<0?1:0;if(u&&(s=-s),s===0)n(1/s>0?0:2147483648,i,f);else if(isNaN(s))n(2143289344,i,f);else if(s>34028234663852886e22)n((u<<31|2139095040)>>>0,i,f);else if(s<11754943508222875e-54)n((u<<31|Math.round(s/1401298464324817e-60))>>>0,i,f);else{var c=Math.floor(Math.log(s)/Math.LN2),h=Math.round(s*Math.pow(2,-c)*8388608)&8388607;n((u<<31|c+127<<23|h)>>>0,i,f)}}e.writeFloatLE=t.bind(null,Rh),e.writeFloatBE=t.bind(null,vh);function a(n,s,i){var f=n(s,i),u=(f>>31)*2+1,c=f>>>23&255,h=f&8388607;return c===255?h?NaN:u*(1/0):c===0?u*1401298464324817e-60*h:u*Math.pow(2,c-150)*(h+8388608)}e.readFloatLE=a.bind(null,kh),e.readFloatBE=a.bind(null,Nh)}(),typeof Float64Array<"u"?function(){var t=new Float64Array([-0]),a=new Uint8Array(t.buffer),n=a[7]===128;function s(c,h,E){t[0]=c,h[E]=a[0],h[E+1]=a[1],h[E+2]=a[2],h[E+3]=a[3],h[E+4]=a[4],h[E+5]=a[5],h[E+6]=a[6],h[E+7]=a[7]}function i(c,h,E){t[0]=c,h[E]=a[7],h[E+1]=a[6],h[E+2]=a[5],h[E+3]=a[4],h[E+4]=a[3],h[E+5]=a[2],h[E+6]=a[1],h[E+7]=a[0]}e.writeDoubleLE=n?s:i,e.writeDoubleBE=n?i:s;function f(c,h){return a[0]=c[h],a[1]=c[h+1],a[2]=c[h+2],a[3]=c[h+3],a[4]=c[h+4],a[5]=c[h+5],a[6]=c[h+6],a[7]=c[h+7],t[0]}function u(c,h){return a[7]=c[h],a[6]=c[h+1],a[5]=c[h+2],a[4]=c[h+3],a[3]=c[h+4],a[2]=c[h+5],a[1]=c[h+6],a[0]=c[h+7],t[0]}e.readDoubleLE=n?f:u,e.readDoubleBE=n?u:f}():function(){function t(n,s,i,f,u,c){var h=f<0?1:0;if(h&&(f=-f),f===0)n(0,u,c+s),n(1/f>0?0:2147483648,u,c+i);else if(isNaN(f))n(0,u,c+s),n(2146959360,u,c+i);else if(f>17976931348623157e292)n(0,u,c+s),n((h<<31|2146435072)>>>0,u,c+i);else{var E;if(f<22250738585072014e-324)E=f/5e-324,n(E>>>0,u,c+s),n((h<<31|E/4294967296)>>>0,u,c+i);else{var C=Math.floor(Math.log(f)/Math.LN2);C===1024&&(C=1023),E=f*Math.pow(2,-C),n(E*4503599627370496>>>0,u,c+s),n((h<<31|C+1023<<20|E*1048576&1048575)>>>0,u,c+i)}}}e.writeDoubleLE=t.bind(null,Rh,0,4),e.writeDoubleBE=t.bind(null,vh,4,0);function a(n,s,i,f,u){var c=n(f,u+s),h=n(f,u+i),E=(h>>31)*2+1,C=h>>>20&2047,v=4294967296*(h&1048575)+c;return C===2047?v?NaN:E*(1/0):C===0?E*5e-324*v:E*Math.pow(2,C-1075)*(v+4503599627370496)}e.readDoubleLE=a.bind(null,kh,0,4),e.readDoubleBE=a.bind(null,Nh,4,0)}(),e}function Rh(e,t,a){t[a]=e&255,t[a+1]=e>>>8&255,t[a+2]=e>>>16&255,t[a+3]=e>>>24}function vh(e,t,a){t[a]=e>>>24,t[a+1]=e>>>16&255,t[a+2]=e>>>8&255,t[a+3]=e&255}function kh(e,t){return(e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24)>>>0}function Nh(e,t){return(e[t]<<24|e[t+1]<<16|e[t+2]<<8|e[t+3])>>>0}});var Oh=Lt((exports,module)=>{"use strict";module.exports=inquire;function inquire(moduleName){try{var mod=eval("quire".replace(/^/,"re"))(moduleName);if(mod&&(mod.length||Object.keys(mod).length))return mod}catch(e){}return null}});var Bu=Lt(Ch=>{"use strict";var Jd=Ch;Jd.length=function(t){for(var a=0,n=0,s=0;s191&&c<224?f[u++]=(c&31)<<6|t[a++]&63:c>239&&c<365?(c=((c&7)<<18|(t[a++]&63)<<12|(t[a++]&63)<<6|t[a++]&63)-65536,f[u++]=55296+(c>>10),f[u++]=56320+(c&1023)):f[u++]=(c&15)<<12|(t[a++]&63)<<6|t[a++]&63,u>8191&&((i||(i=[])).push(String.fromCharCode.apply(String,f)),u=0);return i?(u&&i.push(String.fromCharCode.apply(String,f.slice(0,u))),i.join("")):String.fromCharCode.apply(String,f.slice(0,u))};Jd.write=function(t,a,n){for(var s=n,i,f,u=0;u>6|192,a[n++]=i&63|128):(i&64512)===55296&&((f=t.charCodeAt(u+1))&64512)===56320?(i=65536+((i&1023)<<10)+(f&1023),++u,a[n++]=i>>18|240,a[n++]=i>>12&63|128,a[n++]=i>>6&63|128,a[n++]=i&63|128):(a[n++]=i>>12|224,a[n++]=i>>6&63|128,a[n++]=i&63|128);return n-s}});var Mh=Lt((eb,Ih)=>{"use strict";Ih.exports=IT;function IT(e,t,a){var n=a||8192,s=n>>>1,i=null,f=n;return function(c){if(c<1||c>s)return e(c);f+c>n&&(i=e(n),f=0);var h=t.call(i,f,f+=c);return f&7&&(f=(f|7)+1),h}}});var Bh=Lt((tb,Ph)=>{"use strict";Ph.exports=gn;var Zs=ti();function gn(e,t){this.lo=e>>>0,this.hi=t>>>0}var Oi=gn.zero=new gn(0,0);Oi.toNumber=function(){return 0};Oi.zzEncode=Oi.zzDecode=function(){return this};Oi.length=function(){return 1};var MT=gn.zeroHash="\0\0\0\0\0\0\0\0";gn.fromNumber=function(t){if(t===0)return Oi;var a=t<0;a&&(t=-t);var n=t>>>0,s=(t-n)/4294967296>>>0;return a&&(s=~s>>>0,n=~n>>>0,++n>4294967295&&(n=0,++s>4294967295&&(s=0))),new gn(n,s)};gn.from=function(t){if(typeof t=="number")return gn.fromNumber(t);if(Zs.isString(t))if(Zs.Long)t=Zs.Long.fromString(t);else return gn.fromNumber(parseInt(t,10));return t.low||t.high?new gn(t.low>>>0,t.high>>>0):Oi};gn.prototype.toNumber=function(t){if(!t&&this.hi>>>31){var a=~this.lo+1>>>0,n=~this.hi>>>0;return a||(n=n+1>>>0),-(a+n*4294967296)}return this.lo+this.hi*4294967296};gn.prototype.toLong=function(t){return Zs.Long?new Zs.Long(this.lo|0,this.hi|0,!!t):{low:this.lo|0,high:this.hi|0,unsigned:!!t}};var ei=String.prototype.charCodeAt;gn.fromHash=function(t){return t===MT?Oi:new gn((ei.call(t,0)|ei.call(t,1)<<8|ei.call(t,2)<<16|ei.call(t,3)<<24)>>>0,(ei.call(t,4)|ei.call(t,5)<<8|ei.call(t,6)<<16|ei.call(t,7)<<24)>>>0)};gn.prototype.toHash=function(){return String.fromCharCode(this.lo&255,this.lo>>>8&255,this.lo>>>16&255,this.lo>>>24,this.hi&255,this.hi>>>8&255,this.hi>>>16&255,this.hi>>>24)};gn.prototype.zzEncode=function(){var t=this.hi>>31;return this.hi=((this.hi<<1|this.lo>>>31)^t)>>>0,this.lo=(this.lo<<1^t)>>>0,this};gn.prototype.zzDecode=function(){var t=-(this.lo&1);return this.lo=((this.lo>>>1|this.hi<<31)^t)>>>0,this.hi=(this.hi>>>1^t)>>>0,this};gn.prototype.length=function(){var t=this.lo,a=(this.lo>>>28|this.hi<<4)>>>0,n=this.hi>>>24;return n===0?a===0?t<16384?t<128?1:2:t<2097152?3:4:a<16384?a<128?5:6:a<2097152?7:8:n<128?9:10}});var ti=Lt(Kd=>{"use strict";var Ae=Kd;Ae.asPromise=yh();Ae.base64=_h();Ae.EventEmitter=xh();Ae.float=Ah();Ae.inquire=Oh();Ae.utf8=Bu();Ae.pool=Mh();Ae.LongBits=Bh();Ae.isNode=!!(typeof global<"u"&&global&&global.process&&global.process.versions&&global.process.versions.node);Ae.global=Ae.isNode&&global||!1||typeof self<"u"&&self||Kd;Ae.emptyArray=Object.freeze?Object.freeze([]):[];Ae.emptyObject=Object.freeze?Object.freeze({}):{};Ae.isInteger=Number.isInteger||function(t){return typeof t=="number"&&isFinite(t)&&Math.floor(t)===t};Ae.isString=function(t){return typeof t=="string"||t instanceof String};Ae.isObject=function(t){return t&&typeof t=="object"};Ae.isset=Ae.isSet=function(t,a){var n=t[a];return n!=null&&t.hasOwnProperty(a)?typeof n!="object"||(Array.isArray(n)?n.length:Object.keys(n).length)>0:!1};Ae.Buffer=function(){try{var e=Ae.inquire("buffer").Buffer;return e.prototype.utf8Write?e:null}catch{return null}}();Ae._Buffer_from=null;Ae._Buffer_allocUnsafe=null;Ae.newBuffer=function(t){return typeof t=="number"?Ae.Buffer?Ae._Buffer_allocUnsafe(t):new Ae.Array(t):Ae.Buffer?Ae._Buffer_from(t):typeof Uint8Array>"u"?t:new Uint8Array(t)};Ae.Array=typeof Uint8Array<"u"?Uint8Array:Array;Ae.Long=Ae.global.dcodeIO&&Ae.global.dcodeIO.Long||Ae.global.Long||Ae.inquire("long");Ae.key2Re=/^true|false|0|1$/;Ae.key32Re=/^-?(?:0|[1-9][0-9]*)$/;Ae.key64Re=/^(?:[\\x00-\\xff]{8}|-?(?:0|[1-9][0-9]*))$/;Ae.longToHash=function(t){return t?Ae.LongBits.from(t).toHash():Ae.LongBits.zeroHash};Ae.longFromHash=function(t,a){var n=Ae.LongBits.fromHash(t);return Ae.Long?Ae.Long.fromBits(n.lo,n.hi,a):n.toNumber(!!a)};function zh(e,t,a){for(var n=Object.keys(t),s=0;s-1;--i)if(a[s[i]]===1&&this[s[i]]!==void 0&&this[s[i]]!==null)return s[i]}};Ae.oneOfSetter=function(t){return function(a){for(var n=0;n{"use strict";jh.exports=st;var xr=ti(),Xd,zu=xr.LongBits,Lh=xr.base64,Dh=xr.utf8;function $s(e,t,a){this.fn=e,this.len=t,this.next=void 0,this.val=a}function $d(){}function PT(e){this.head=e.head,this.tail=e.tail,this.len=e.len,this.next=e.states}function st(){this.len=0,this.head=new $s($d,0,0),this.tail=this.head,this.states=null}var Fh=function(){return xr.Buffer?function(){return(st.create=function(){return new Xd})()}:function(){return new st}};st.create=Fh();st.alloc=function(t){return new xr.Array(t)};xr.Array!==Array&&(st.alloc=xr.pool(st.alloc,xr.Array.prototype.subarray));st.prototype._push=function(t,a,n){return this.tail=this.tail.next=new $s(t,a,n),this.len+=a,this};function ep(e,t,a){t[a]=e&255}function BT(e,t,a){for(;e>127;)t[a++]=e&127|128,e>>>=7;t[a]=e}function tp(e,t){this.len=e,this.next=void 0,this.val=t}tp.prototype=Object.create($s.prototype);tp.prototype.fn=BT;st.prototype.uint32=function(t){return this.len+=(this.tail=this.tail.next=new tp((t=t>>>0)<128?1:t<16384?2:t<2097152?3:t<268435456?4:5,t)).len,this};st.prototype.int32=function(t){return t<0?this._push(np,10,zu.fromNumber(t)):this.uint32(t)};st.prototype.sint32=function(t){return this.uint32((t<<1^t>>31)>>>0)};function np(e,t,a){for(;e.hi;)t[a++]=e.lo&127|128,e.lo=(e.lo>>>7|e.hi<<25)>>>0,e.hi>>>=7;for(;e.lo>127;)t[a++]=e.lo&127|128,e.lo=e.lo>>>7;t[a++]=e.lo}st.prototype.uint64=function(t){var a=zu.from(t);return this._push(np,a.length(),a)};st.prototype.int64=st.prototype.uint64;st.prototype.sint64=function(t){var a=zu.from(t).zzEncode();return this._push(np,a.length(),a)};st.prototype.bool=function(t){return this._push(ep,1,t?1:0)};function Zd(e,t,a){t[a]=e&255,t[a+1]=e>>>8&255,t[a+2]=e>>>16&255,t[a+3]=e>>>24}st.prototype.fixed32=function(t){return this._push(Zd,4,t>>>0)};st.prototype.sfixed32=st.prototype.fixed32;st.prototype.fixed64=function(t){var a=zu.from(t);return this._push(Zd,4,a.lo)._push(Zd,4,a.hi)};st.prototype.sfixed64=st.prototype.fixed64;st.prototype.float=function(t){return this._push(xr.float.writeFloatLE,4,t)};st.prototype.double=function(t){return this._push(xr.float.writeDoubleLE,8,t)};var zT=xr.Array.prototype.set?function(t,a,n){a.set(t,n)}:function(t,a,n){for(var s=0;s>>0;if(!a)return this._push(ep,1,0);if(xr.isString(t)){var n=st.alloc(a=Lh.length(t));Lh.decode(t,n,0),t=n}return this.uint32(a)._push(zT,a,t)};st.prototype.string=function(t){var a=Dh.length(t);return a?this.uint32(a)._push(Dh.write,a,t):this._push(ep,1,0)};st.prototype.fork=function(){return this.states=new PT(this),this.head=this.tail=new $s($d,0,0),this.len=0,this};st.prototype.reset=function(){return this.states?(this.head=this.states.head,this.tail=this.states.tail,this.len=this.states.len,this.states=this.states.next):(this.head=this.tail=new $s($d,0,0),this.len=0),this};st.prototype.ldelim=function(){var t=this.head,a=this.tail,n=this.len;return this.reset().uint32(n),n&&(this.tail.next=t.next,this.tail=a,this.len+=n),this};st.prototype.finish=function(){for(var t=this.head.next,a=this.constructor.alloc(this.len),n=0;t;)t.fn(t.val,a,n),n+=t.len,t=t.next;return a};st._configure=function(e){Xd=e,st.create=Fh(),Xd._configure()}});var Vh=Lt((ob,Hh)=>{"use strict";Hh.exports=no;var Wh=rp();(no.prototype=Object.create(Wh.prototype)).constructor=no;var ni=ti();function no(){Wh.call(this)}no._configure=function(){no.alloc=ni._Buffer_allocUnsafe,no.writeBytesBuffer=ni.Buffer&&ni.Buffer.prototype instanceof Uint8Array&&ni.Buffer.prototype.set.name==="set"?function(t,a,n){a.set(t,n)}:function(t,a,n){if(t.copy)t.copy(a,n,0,t.length);else for(var s=0;s>>0;return this.uint32(a),a&&this._push(no.writeBytesBuffer,a,t),this};function UT(e,t,a){e.length<40?ni.utf8.write(e,t,a):t.utf8Write?t.utf8Write(e,a):t.write(e,a)}no.prototype.string=function(t){var a=ni.Buffer.byteLength(t);return this.uint32(a),a&&this._push(UT,a,t),this};no._configure()});var ap=Lt((ib,Jh)=>{"use strict";Jh.exports=Xt;var Pr=ti(),ip,qh=Pr.LongBits,LT=Pr.utf8;function Br(e,t){return RangeError("index out of range: "+e.pos+" + "+(t||1)+" > "+e.len)}function Xt(e){this.buf=e,this.pos=0,this.len=e.length}var Gh=typeof Uint8Array<"u"?function(t){if(t instanceof Uint8Array||Array.isArray(t))return new Xt(t);throw Error("illegal buffer")}:function(t){if(Array.isArray(t))return new Xt(t);throw Error("illegal buffer")},Qh=function(){return Pr.Buffer?function(a){return(Xt.create=function(s){return Pr.Buffer.isBuffer(s)?new ip(s):Gh(s)})(a)}:Gh};Xt.create=Qh();Xt.prototype._slice=Pr.Array.prototype.subarray||Pr.Array.prototype.slice;Xt.prototype.uint32=function(){var t=4294967295;return function(){if(t=(this.buf[this.pos]&127)>>>0,this.buf[this.pos++]<128||(t=(t|(this.buf[this.pos]&127)<<7)>>>0,this.buf[this.pos++]<128)||(t=(t|(this.buf[this.pos]&127)<<14)>>>0,this.buf[this.pos++]<128)||(t=(t|(this.buf[this.pos]&127)<<21)>>>0,this.buf[this.pos++]<128)||(t=(t|(this.buf[this.pos]&15)<<28)>>>0,this.buf[this.pos++]<128))return t;if((this.pos+=5)>this.len)throw this.pos=this.len,Br(this,10);return t}}();Xt.prototype.int32=function(){return this.uint32()|0};Xt.prototype.sint32=function(){var t=this.uint32();return t>>>1^-(t&1)|0};function op(){var e=new qh(0,0),t=0;if(this.len-this.pos>4){for(;t<4;++t)if(e.lo=(e.lo|(this.buf[this.pos]&127)<>>0,this.buf[this.pos++]<128)return e;if(e.lo=(e.lo|(this.buf[this.pos]&127)<<28)>>>0,e.hi=(e.hi|(this.buf[this.pos]&127)>>4)>>>0,this.buf[this.pos++]<128)return e;t=0}else{for(;t<3;++t){if(this.pos>=this.len)throw Br(this);if(e.lo=(e.lo|(this.buf[this.pos]&127)<>>0,this.buf[this.pos++]<128)return e}return e.lo=(e.lo|(this.buf[this.pos++]&127)<>>0,e}if(this.len-this.pos>4){for(;t<5;++t)if(e.hi=(e.hi|(this.buf[this.pos]&127)<>>0,this.buf[this.pos++]<128)return e}else for(;t<5;++t){if(this.pos>=this.len)throw Br(this);if(e.hi=(e.hi|(this.buf[this.pos]&127)<>>0,this.buf[this.pos++]<128)return e}throw Error("invalid varint encoding")}Xt.prototype.bool=function(){return this.uint32()!==0};function Uu(e,t){return(e[t-4]|e[t-3]<<8|e[t-2]<<16|e[t-1]<<24)>>>0}Xt.prototype.fixed32=function(){if(this.pos+4>this.len)throw Br(this,4);return Uu(this.buf,this.pos+=4)};Xt.prototype.sfixed32=function(){if(this.pos+4>this.len)throw Br(this,4);return Uu(this.buf,this.pos+=4)|0};function Yh(){if(this.pos+8>this.len)throw Br(this,8);return new qh(Uu(this.buf,this.pos+=4),Uu(this.buf,this.pos+=4))}Xt.prototype.float=function(){if(this.pos+4>this.len)throw Br(this,4);var t=Pr.float.readFloatLE(this.buf,this.pos);return this.pos+=4,t};Xt.prototype.double=function(){if(this.pos+8>this.len)throw Br(this,4);var t=Pr.float.readDoubleLE(this.buf,this.pos);return this.pos+=8,t};Xt.prototype.bytes=function(){var t=this.uint32(),a=this.pos,n=this.pos+t;if(n>this.len)throw Br(this,t);if(this.pos+=t,Array.isArray(this.buf))return this.buf.slice(a,n);if(a===n){var s=Pr.Buffer;return s?s.alloc(0):new this.buf.constructor(0)}return this._slice.call(this.buf,a,n)};Xt.prototype.string=function(){var t=this.bytes();return LT.read(t,0,t.length)};Xt.prototype.skip=function(t){if(typeof t=="number"){if(this.pos+t>this.len)throw Br(this,t);this.pos+=t}else do if(this.pos>=this.len)throw Br(this);while(this.buf[this.pos++]&128);return this};Xt.prototype.skipType=function(e){switch(e){case 0:this.skip();break;case 1:this.skip(8);break;case 2:this.skip(this.uint32());break;case 3:for(;(e=this.uint32()&7)!==4;)this.skipType(e);break;case 5:this.skip(4);break;default:throw Error("invalid wire type "+e+" at offset "+this.pos)}return this};Xt._configure=function(e){ip=e,Xt.create=Qh(),ip._configure();var t=Pr.Long?"toLong":"toNumber";Pr.merge(Xt.prototype,{int64:function(){return op.call(this)[t](!1)},uint64:function(){return op.call(this)[t](!0)},sint64:function(){return op.call(this).zzDecode()[t](!1)},fixed64:function(){return Yh.call(this)[t](!0)},sfixed64:function(){return Yh.call(this)[t](!1)}})}});var $h=Lt((ab,Zh)=>{"use strict";Zh.exports=Ci;var Xh=ap();(Ci.prototype=Object.create(Xh.prototype)).constructor=Ci;var Kh=ti();function Ci(e){Xh.call(this,e)}Ci._configure=function(){Kh.Buffer&&(Ci.prototype._slice=Kh.Buffer.prototype.slice)};Ci.prototype.string=function(){var t=this.uint32();return this.buf.utf8Slice?this.buf.utf8Slice(this.pos,this.pos=Math.min(this.pos+t,this.len)):this.buf.toString("utf-8",this.pos,this.pos=Math.min(this.pos+t,this.len))};Ci._configure()});var ty=Lt((sb,ey)=>{"use strict";ey.exports=ec;var sp=ti();(ec.prototype=Object.create(sp.EventEmitter.prototype)).constructor=ec;function ec(e,t,a){if(typeof e!="function")throw TypeError("rpcImpl must be a function");sp.EventEmitter.call(this),this.rpcImpl=e,this.requestDelimited=!!t,this.responseDelimited=!!a}ec.prototype.rpcCall=function e(t,a,n,s,i){if(!s)throw TypeError("request must be specified");var f=this;if(!i)return sp.asPromise(e,f,t,a,n,s);if(!f.rpcImpl){setTimeout(function(){i(Error("already ended"))},0);return}try{return f.rpcImpl(t,a[f.requestDelimited?"encodeDelimited":"encode"](s).finish(),function(c,h){if(c)return f.emit("error",c,t),i(c);if(h===null){f.end(!0);return}if(!(h instanceof n))try{h=n[f.responseDelimited?"decodeDelimited":"decode"](h)}catch(E){return f.emit("error",E,t),i(E)}return f.emit("data",h,t),i(null,h)})}catch(u){f.emit("error",u,t),setTimeout(function(){i(u)},0);return}};ec.prototype.end=function(t){return this.rpcImpl&&(t||this.rpcImpl(null,null,null),this.rpcImpl=null,this.emit("end").off()),this}});var ry=Lt(ny=>{"use strict";var DT=ny;DT.Service=ty()});var iy=Lt((ub,oy)=>{"use strict";oy.exports={}});var cy=Lt(sy=>{"use strict";var Yn=sy;Yn.build="minimal";Yn.Writer=rp();Yn.BufferWriter=Vh();Yn.Reader=ap();Yn.BufferReader=$h();Yn.util=ti();Yn.rpc=ry();Yn.roots=iy();Yn.configure=ay;function ay(){Yn.util._configure(),Yn.Writer._configure(Yn.BufferWriter),Yn.Reader._configure(Yn.BufferReader)}ay()});var Le=Lt((fb,uy)=>{"use strict";uy.exports=cy()});var RE=Lt(tt=>{"use strict";var Ic=Symbol.for("react.element"),j3=Symbol.for("react.portal"),W3=Symbol.for("react.fragment"),H3=Symbol.for("react.strict_mode"),V3=Symbol.for("react.profiler"),G3=Symbol.for("react.provider"),Y3=Symbol.for("react.context"),q3=Symbol.for("react.forward_ref"),Q3=Symbol.for("react.suspense"),J3=Symbol.for("react.memo"),K3=Symbol.for("react.lazy"),mE=Symbol.iterator;function X3(e){return e===null||typeof e!="object"?null:(e=mE&&e[mE]||e["@@iterator"],typeof e=="function"?e:null)}var gE={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},EE=Object.assign,TE={};function Ts(e,t,a){this.props=e,this.context=t,this.refs=TE,this.updater=a||gE}Ts.prototype.isReactComponent={};Ts.prototype.setState=function(e,t){if(typeof e!="object"&&typeof e!="function"&&e!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")};Ts.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")};function _E(){}_E.prototype=Ts.prototype;function om(e,t,a){this.props=e,this.context=t,this.refs=TE,this.updater=a||gE}var im=om.prototype=new _E;im.constructor=om;EE(im,Ts.prototype);im.isPureReactComponent=!0;var hE=Array.isArray,SE=Object.prototype.hasOwnProperty,am={current:null},xE={key:!0,ref:!0,__self:!0,__source:!0};function bE(e,t,a){var n,s={},i=null,f=null;if(t!=null)for(n in t.ref!==void 0&&(f=t.ref),t.key!==void 0&&(i=""+t.key),t)SE.call(t,n)&&!xE.hasOwnProperty(n)&&(s[n]=t[n]);var u=arguments.length-2;if(u===1)s.children=a;else if(1{"use strict";vE.exports=RE()});var zE=Lt(vt=>{"use strict";function dm(e,t){var a=e.length;e.push(t);e:for(;0>>1,s=e[n];if(0>>1;nNf(u,a))cNf(h,u)?(e[n]=h,e[c]=a,n=c):(e[n]=u,e[f]=a,n=f);else if(cNf(h,a))e[n]=h,e[c]=a,n=c;else break e}}return t}function Nf(e,t){var a=e.sortIndex-t.sortIndex;return a!==0?a:e.id-t.id}typeof performance=="object"&&typeof performance.now=="function"?(NE=performance,vt.unstable_now=function(){return NE.now()}):(um=Date,wE=um.now(),vt.unstable_now=function(){return um.now()-wE});var NE,um,wE,po=[],mi=[],nx=1,kr=null,zn=3,Of=!1,Gi=!1,Pc=!1,CE=typeof setTimeout=="function"?setTimeout:null,IE=typeof clearTimeout=="function"?clearTimeout:null,AE=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function pm(e){for(var t=Wr(mi);t!==null;){if(t.callback===null)Af(mi);else if(t.startTime<=e)Af(mi),t.sortIndex=t.expirationTime,dm(po,t);else break;t=Wr(mi)}}function mm(e){if(Pc=!1,pm(e),!Gi)if(Wr(po)!==null)Gi=!0,ym(hm);else{var t=Wr(mi);t!==null&&gm(mm,t.startTime-e)}}function hm(e,t){Gi=!1,Pc&&(Pc=!1,IE(Bc),Bc=-1),Of=!0;var a=zn;try{for(pm(t),kr=Wr(po);kr!==null&&(!(kr.expirationTime>t)||e&&!BE());){var n=kr.callback;if(typeof n=="function"){kr.callback=null,zn=kr.priorityLevel;var s=n(kr.expirationTime<=t);t=vt.unstable_now(),typeof s=="function"?kr.callback=s:kr===Wr(po)&&Af(po),pm(t)}else Af(po);kr=Wr(po)}if(kr!==null)var i=!0;else{var f=Wr(mi);f!==null&&gm(mm,f.startTime-t),i=!1}return i}finally{kr=null,zn=a,Of=!1}}var Cf=!1,wf=null,Bc=-1,ME=5,PE=-1;function BE(){return!(vt.unstable_now()-PEe||125n?(e.sortIndex=a,dm(mi,e),Wr(po)===null&&e===Wr(mi)&&(Pc?(IE(Bc),Bc=-1):Pc=!0,gm(mm,a-n))):(e.sortIndex=s,dm(po,e),Gi||Of||(Gi=!0,ym(hm))),e};vt.unstable_shouldYield=BE;vt.unstable_wrapCallback=function(e){var t=zn;return function(){var a=zn;zn=t;try{return e.apply(this,arguments)}finally{zn=a}}}});var LE=Lt((BP,UE)=>{"use strict";UE.exports=zE()});var FE=Lt((zP,DE)=>{"use strict";DE.exports=function(t){var a={},n=cm(),s=LE(),i=Object.assign;function f(r){for(var o="https://reactjs.org/docs/error-decoder.html?invariant="+r,l=1;lB||p[T]!==m[B]){var J=` -`+p[T].replace(" at new "," at ");return r.displayName&&J.includes("")&&(J=J.replace("",r.displayName)),J}while(1<=T&&0<=B);break}}}finally{kt=!1,Error.prepareStackTrace=l}return(r=r?r.displayName||r.name:"")?_t(r):""}var Mt=Object.prototype.hasOwnProperty,Oe=[],qt=-1;function Qt(r){return{current:r}}function Xe(r){0>qt||(r.current=Oe[qt],Oe[qt]=null,qt--)}function Je(r,o){qt++,Oe[qt]=r.current,r.current=o}var Jt={},gt=Qt(Jt),bt=Qt(!1),_n=Jt;function kn(r,o){var l=r.type.contextTypes;if(!l)return Jt;var d=r.stateNode;if(d&&d.__reactInternalMemoizedUnmaskedChildContext===o)return d.__reactInternalMemoizedMaskedChildContext;var p={},m;for(m in l)p[m]=o[m];return d&&(r=r.stateNode,r.__reactInternalMemoizedUnmaskedChildContext=o,r.__reactInternalMemoizedMaskedChildContext=p),p}function Pt(r){return r=r.childContextTypes,r!=null}function fr(){Xe(bt),Xe(gt)}function Yr(r,o,l){if(gt.current!==Jt)throw Error(f(168));Je(gt,o),Je(bt,l)}function Bt(r,o,l){var d=r.stateNode;if(o=o.childContextTypes,typeof d.getChildContext!="function")return l;d=d.getChildContext();for(var p in d)if(!(p in o))throw Error(f(108,ne(r)||"Unknown",p));return i({},l,d)}function dr(r){return r=(r=r.stateNode)&&r.__reactInternalMemoizedMergedChildContext||Jt,_n=gt.current,Je(gt,r),Je(bt,bt.current),!0}function qr(r,o,l){var d=r.stateNode;if(!d)throw Error(f(169));l?(r=Bt(r,o,_n),d.__reactInternalMemoizedMergedChildContext=r,Xe(bt),Xe(gt),Je(gt,r)):Xe(bt),Je(bt,l)}var sn=Math.clz32?Math.clz32:So,To=Math.log,_o=Math.LN2;function So(r){return r>>>=0,r===0?32:31-(To(r)/_o|0)|0}var pr=64,Ei=4194304;function Go(r){switch(r&-r){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return r&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return r&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return r}}function Ti(r,o){var l=r.pendingLanes;if(l===0)return 0;var d=0,p=r.suspendedLanes,m=r.pingedLanes,T=l&268435455;if(T!==0){var B=T&~p;B!==0?d=Go(B):(m&=T,m!==0&&(d=Go(m)))}else T=l&~p,T!==0?d=Go(T):m!==0&&(d=Go(m));if(d===0)return 0;if(o!==0&&o!==d&&!(o&p)&&(p=d&-d,m=o&-o,p>=m||p===16&&(m&4194240)!==0))return o;if(d&4&&(d|=l&16),o=r.entangledLanes,o!==0)for(r=r.entanglements,o&=d;0l;l++)o.push(r);return o}function _i(r,o,l){r.pendingLanes|=o,o!==536870912&&(r.suspendedLanes=0,r.pingedLanes=0),r=r.eventTimes,o=31-sn(o),r[o]=l}function Wf(r,o){var l=r.pendingLanes&~o;r.pendingLanes=o,r.suspendedLanes=0,r.pingedLanes=0,r.expiredLanes&=o,r.mutableReadLanes&=o,r.entangledLanes&=o,o=r.entanglements;var d=r.eventTimes;for(r=r.expirationTimes;0>=T,p-=T,bo=1<<32-sn(o)+p|l<ut?(yn=We,We=null):yn=We.sibling;var lt=ge(Y,We,Z[ut],Ee);if(lt===null){We===null&&(We=yn);break}r&&We&<.alternate===null&&o(Y,We),L=m(lt,L,ut),qe===null?Ce=lt:qe.sibling=lt,qe=lt,We=yn}if(ut===Z.length)return l(Y,We),zt&&xi(Y,ut),Ce;if(We===null){for(;utut?(yn=We,We=null):yn=We.sibling;var $o=ge(Y,We,lt.value,Ee);if($o===null){We===null&&(We=yn);break}r&&We&&$o.alternate===null&&o(Y,We),L=m($o,L,ut),qe===null?Ce=$o:qe.sibling=$o,qe=$o,We=yn}if(lt.done)return l(Y,We),zt&&xi(Y,ut),Ce;if(We===null){for(;!lt.done;ut++,lt=Z.next())lt=je(Y,lt.value,Ee),lt!==null&&(L=m(lt,L,ut),qe===null?Ce=lt:qe.sibling=lt,qe=lt);return zt&&xi(Y,ut),Ce}for(We=d(Y,We);!lt.done;ut++,lt=Z.next())lt=Nt(We,Y,ut,lt.value,Ee),lt!==null&&(r&<.alternate!==null&&We.delete(lt.key===null?ut:lt.key),L=m(lt,L,ut),qe===null?Ce=lt:qe.sibling=lt,qe=lt);return r&&We.forEach(function(bT){return o(Y,bT)}),zt&&xi(Y,ut),Ce}function wo(Y,L,Z,Ee){if(typeof Z=="object"&&Z!==null&&Z.type===E&&Z.key===null&&(Z=Z.props.children),typeof Z=="object"&&Z!==null){switch(Z.$$typeof){case c:e:{for(var Ce=Z.key,qe=L;qe!==null;){if(qe.key===Ce){if(Ce=Z.type,Ce===E){if(qe.tag===7){l(Y,qe.sibling),L=p(qe,Z.props.children),L.return=Y,Y=L;break e}}else if(qe.elementType===Ce||typeof Ce=="object"&&Ce!==null&&Ce.$$typeof===P&&$m(Ce)===qe.type){l(Y,qe.sibling),L=p(qe,Z.props),L.ref=Us(Y,qe,Z),L.return=Y,Y=L;break e}l(Y,qe);break}else o(Y,qe);qe=qe.sibling}Z.type===E?(L=Ai(Z.props.children,Y.mode,Ee,Z.key),L.return=Y,Y=L):(Ee=Au(Z.type,Z.key,Z.props,null,Y.mode,Ee),Ee.ref=Us(Y,L,Z),Ee.return=Y,Y=Ee)}return T(Y);case h:e:{for(qe=Z.key;L!==null;){if(L.key===qe)if(L.tag===4&&L.stateNode.containerInfo===Z.containerInfo&&L.stateNode.implementation===Z.implementation){l(Y,L.sibling),L=p(L,Z.children||[]),L.return=Y,Y=L;break e}else{l(Y,L);break}else o(Y,L);L=L.sibling}L=Qd(Z,Y.mode,Ee),L.return=Y,Y=L}return T(Y);case P:return qe=Z._init,wo(Y,L,qe(Z._payload),Ee)}if(fe(Z))return St(Y,L,Z,Ee);if(j(Z))return Gn(Y,L,Z,Ee);ru(Y,Z)}return typeof Z=="string"&&Z!==""||typeof Z=="number"?(Z=""+Z,L!==null&&L.tag===6?(l(Y,L.sibling),L=p(L,Z),L.return=Y,Y=L):(l(Y,L),L=qd(Z,Y.mode,Ee),L.return=Y,Y=L),T(Y)):l(Y,L)}return wo}var ia=e0(!0),t0=e0(!1),Ls={},Er=Qt(Ls),Ds=Qt(Ls),aa=Qt(Ls);function Xr(r){if(r===Ls)throw Error(f(174));return r}function sd(r,o){Je(aa,o),Je(Ds,r),Je(Er,Ls),r=De(o),Xe(Er),Je(Er,r)}function sa(){Xe(Er),Xe(Ds),Xe(aa)}function n0(r){var o=Xr(aa.current),l=Xr(Er.current);o=Fe(l,r.type,o),l!==o&&(Je(Ds,r),Je(Er,o))}function cd(r){Ds.current===r&&(Xe(Er),Xe(Ds))}var jt=Qt(0);function ou(r){for(var o=r;o!==null;){if(o.tag===13){var l=o.memoizedState;if(l!==null&&(l=l.dehydrated,l===null||Gr(l)||Cs(l)))return o}else if(o.tag===19&&o.memoizedProps.revealOrder!==void 0){if(o.flags&128)return o}else if(o.child!==null){o.child.return=o,o=o.child;continue}if(o===r)break;for(;o.sibling===null;){if(o.return===null||o.return===r)return null;o=o.return}o.sibling.return=o.return,o=o.sibling}return null}var ud=[];function ld(){for(var r=0;rl?l:4,r(!0);var d=fd.transition;fd.transition={};try{r(!1),o()}finally{it=l,fd.transition=d}}function _0(){return Tr().memoizedState}function K2(r,o,l){var d=Ko(r);if(l={lane:d,action:l,hasEagerState:!1,eagerState:null,next:null},S0(r))x0(o,l);else if(l=Gm(r,o,l,d),l!==null){var p=On();_r(l,r,d,p),b0(l,o,d)}}function X2(r,o,l){var d=Ko(r),p={lane:d,action:l,hasEagerState:!1,eagerState:null,next:null};if(S0(r))x0(o,p);else{var m=r.alternate;if(r.lanes===0&&(m===null||m.lanes===0)&&(m=o.lastRenderedReducer,m!==null))try{var T=o.lastRenderedState,B=m(T,l);if(p.hasEagerState=!0,p.eagerState=B,wr(B,T)){var J=o.interleaved;J===null?(p.next=p,rd(o)):(p.next=J.next,J.next=p),o.interleaved=p;return}}catch{}finally{}l=Gm(r,o,p,d),l!==null&&(p=On(),_r(l,r,d,p),b0(l,o,d))}}function S0(r){var o=r.alternate;return r===Wt||o!==null&&o===Wt}function x0(r,o){Fs=au=!0;var l=r.pending;l===null?o.next=o:(o.next=l.next,l.next=o),r.pending=o}function b0(r,o,l){if(l&4194240){var d=o.lanes;d&=r.pendingLanes,l|=d,o.lanes=l,Ps(r,l)}}var uu={readContext:gr,useCallback:Nn,useContext:Nn,useEffect:Nn,useImperativeHandle:Nn,useInsertionEffect:Nn,useLayoutEffect:Nn,useMemo:Nn,useReducer:Nn,useRef:Nn,useState:Nn,useDebugValue:Nn,useDeferredValue:Nn,useTransition:Nn,useMutableSource:Nn,useSyncExternalStore:Nn,useId:Nn,unstable_isNewReconciler:!1},Z2={readContext:gr,useCallback:function(r,o){return Zr().memoizedState=[r,o===void 0?null:o],r},useContext:gr,useEffect:d0,useImperativeHandle:function(r,o,l){return l=l!=null?l.concat([r]):null,su(4194308,4,h0.bind(null,o,r),l)},useLayoutEffect:function(r,o){return su(4194308,4,r,o)},useInsertionEffect:function(r,o){return su(4,2,r,o)},useMemo:function(r,o){var l=Zr();return o=o===void 0?null:o,r=r(),l.memoizedState=[r,o],r},useReducer:function(r,o,l){var d=Zr();return o=l!==void 0?l(o):o,d.memoizedState=d.baseState=o,r={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:r,lastRenderedState:o},d.queue=r,r=r.dispatch=K2.bind(null,Wt,r),[d.memoizedState,r]},useRef:function(r){var o=Zr();return r={current:r},o.memoizedState=r},useState:l0,useDebugValue:Ed,useDeferredValue:function(r){return Zr().memoizedState=r},useTransition:function(){var r=l0(!1),o=r[0];return r=J2.bind(null,r[1]),Zr().memoizedState=r,[o,r]},useMutableSource:function(){},useSyncExternalStore:function(r,o,l){var d=Wt,p=Zr();if(zt){if(l===void 0)throw Error(f(407));l=l()}else{if(l=o(),hn===null)throw Error(f(349));Ri&30||i0(d,o,l)}p.memoizedState=l;var m={value:l,getSnapshot:o};return p.queue=m,d0(s0.bind(null,d,m,r),[r]),d.flags|=2048,Hs(9,a0.bind(null,d,m,l,o),void 0,null),l},useId:function(){var r=Zr(),o=hn.identifierPrefix;if(zt){var l=Ro,d=bo;l=(d&~(1<<32-sn(d)-1)).toString(32)+l,o=":"+o+"R"+l,l=js++,0Dd&&(o.flags|=128,d=!0,Ys(p,!1),o.lanes=4194304)}else{if(!d)if(r=ou(m),r!==null){if(o.flags|=128,d=!0,r=r.updateQueue,r!==null&&(o.updateQueue=r,o.flags|=4),Ys(p,!0),p.tail===null&&p.tailMode==="hidden"&&!m.alternate&&!zt)return wn(o),null}else 2*pn()-p.renderingStartTime>Dd&&l!==1073741824&&(o.flags|=128,d=!0,Ys(p,!1),o.lanes=4194304);p.isBackwards?(m.sibling=o.child,o.child=m):(r=p.last,r!==null?r.sibling=m:o.child=m,p.last=m)}return p.tail!==null?(o=p.tail,p.rendering=o,p.tail=o.sibling,p.renderingStartTime=pn(),o.sibling=null,r=jt.current,Je(jt,d?r&1|2:r&1),o):(wn(o),null);case 22:case 23:return Vd(),l=o.memoizedState!==null,r!==null&&r.memoizedState!==null!==l&&(o.flags|=8192),l&&o.mode&1?er&1073741824&&(wn(o),_e&&o.subtreeFlags&6&&(o.flags|=8192)):wn(o),null;case 24:return null;case 25:return null}throw Error(f(156,o.tag))}function aT(r,o){switch(Jf(o),o.tag){case 1:return Pt(o.type)&&fr(),r=o.flags,r&65536?(o.flags=r&-65537|128,o):null;case 3:return sa(),Xe(bt),Xe(gt),ld(),r=o.flags,r&65536&&!(r&128)?(o.flags=r&-65537|128,o):null;case 5:return cd(o),null;case 13:if(Xe(jt),r=o.memoizedState,r!==null&&r.dehydrated!==null){if(o.alternate===null)throw Error(f(340));na()}return r=o.flags,r&65536?(o.flags=r&-65537|128,o):null;case 19:return Xe(jt),null;case 4:return sa(),null;case 10:return td(o.type._context),null;case 22:case 23:return Vd(),null;case 24:return null;default:return null}}var mu=!1,An=!1,sT=typeof WeakSet=="function"?WeakSet:Set,be=null;function ua(r,o){var l=r.ref;if(l!==null)if(typeof l=="function")try{l(null)}catch(d){Ut(r,o,d)}else l.current=null}function Nd(r,o,l){try{l()}catch(d){Ut(r,o,d)}}var W0=!1;function cT(r,o){for(Ge(r.containerInfo),be=o;be!==null;)if(r=be,o=r.child,(r.subtreeFlags&1028)!==0&&o!==null)o.return=r,be=o;else for(;be!==null;){r=be;try{var l=r.alternate;if(r.flags&1024)switch(r.tag){case 0:case 11:case 15:break;case 1:if(l!==null){var d=l.memoizedProps,p=l.memoizedState,m=r.stateNode,T=m.getSnapshotBeforeUpdate(r.elementType===r.type?d:Or(r.type,d),p);m.__reactInternalSnapshotBeforeUpdate=T}break;case 3:_e&&H(r.stateNode.containerInfo);break;case 5:case 6:case 4:case 17:break;default:throw Error(f(163))}}catch(B){Ut(r,r.return,B)}if(o=r.sibling,o!==null){o.return=r.return,be=o;break}be=r.return}return l=W0,W0=!1,l}function qs(r,o,l){var d=o.updateQueue;if(d=d!==null?d.lastEffect:null,d!==null){var p=d=d.next;do{if((p.tag&r)===r){var m=p.destroy;p.destroy=void 0,m!==void 0&&Nd(o,l,m)}p=p.next}while(p!==d)}}function hu(r,o){if(o=o.updateQueue,o=o!==null?o.lastEffect:null,o!==null){var l=o=o.next;do{if((l.tag&r)===r){var d=l.create;l.destroy=d()}l=l.next}while(l!==o)}}function wd(r){var o=r.ref;if(o!==null){var l=r.stateNode;switch(r.tag){case 5:r=we(l);break;default:r=l}typeof o=="function"?o(r):o.current=r}}function H0(r){var o=r.alternate;o!==null&&(r.alternate=null,H0(o)),r.child=null,r.deletions=null,r.sibling=null,r.tag===5&&(o=r.stateNode,o!==null&&ce(o)),r.stateNode=null,r.return=null,r.dependencies=null,r.memoizedProps=null,r.memoizedState=null,r.pendingProps=null,r.stateNode=null,r.updateQueue=null}function V0(r){return r.tag===5||r.tag===3||r.tag===4}function G0(r){e:for(;;){for(;r.sibling===null;){if(r.return===null||V0(r.return))return null;r=r.return}for(r.sibling.return=r.return,r=r.sibling;r.tag!==5&&r.tag!==6&&r.tag!==18;){if(r.flags&2||r.child===null||r.tag===4)continue e;r.child.return=r,r=r.child}if(!(r.flags&2))return r.stateNode}}function Ad(r,o,l){var d=r.tag;if(d===5||d===6)r=r.stateNode,o?Ns(l,r,o):Ki(l,r);else if(d!==4&&(r=r.child,r!==null))for(Ad(r,o,l),r=r.sibling;r!==null;)Ad(r,o,l),r=r.sibling}function Od(r,o,l){var d=r.tag;if(d===5||d===6)r=r.stateNode,o?yi(l,r,o):yo(l,r);else if(d!==4&&(r=r.child,r!==null))for(Od(r,o,l),r=r.sibling;r!==null;)Od(r,o,l),r=r.sibling}var Sn=null,Cr=!1;function eo(r,o,l){for(l=l.child;l!==null;)Cd(r,o,l),l=l.sibling}function Cd(r,o,l){if(Qr&&typeof Qr.onCommitFiberUnmount=="function")try{Qr.onCommitFiberUnmount(Yc,l)}catch{}switch(l.tag){case 5:An||ua(l,o);case 6:if(_e){var d=Sn,p=Cr;Sn=null,eo(r,o,l),Sn=d,Cr=p,Sn!==null&&(Cr?Zi(Sn,l.stateNode):ws(Sn,l.stateNode))}else eo(r,o,l);break;case 18:_e&&Sn!==null&&(Cr?ke(Sn,l.stateNode):le(Sn,l.stateNode));break;case 4:_e?(d=Sn,p=Cr,Sn=l.stateNode.containerInfo,Cr=!0,eo(r,o,l),Sn=d,Cr=p):(ot&&(d=l.stateNode.containerInfo,p=de(d),Ct(d,p)),eo(r,o,l));break;case 0:case 11:case 14:case 15:if(!An&&(d=l.updateQueue,d!==null&&(d=d.lastEffect,d!==null))){p=d=d.next;do{var m=p,T=m.destroy;m=m.tag,T!==void 0&&(m&2||m&4)&&Nd(l,o,T),p=p.next}while(p!==d)}eo(r,o,l);break;case 1:if(!An&&(ua(l,o),d=l.stateNode,typeof d.componentWillUnmount=="function"))try{d.props=l.memoizedProps,d.state=l.memoizedState,d.componentWillUnmount()}catch(B){Ut(l,o,B)}eo(r,o,l);break;case 21:eo(r,o,l);break;case 22:l.mode&1?(An=(d=An)||l.memoizedState!==null,eo(r,o,l),An=d):eo(r,o,l);break;default:eo(r,o,l)}}function Y0(r){var o=r.updateQueue;if(o!==null){r.updateQueue=null;var l=r.stateNode;l===null&&(l=r.stateNode=new sT),o.forEach(function(d){var p=gT.bind(null,r,d);l.has(d)||(l.add(d),d.then(p,p))})}}function Ir(r,o){var l=o.deletions;if(l!==null)for(var d=0;d";case gu:return":has("+(Pd(r)||"")+")";case Eu:return'[role="'+r.value+'"]';case _u:return'"'+r.value+'"';case Tu:return'[data-testname="'+r.value+'"]';default:throw Error(f(365))}}function Z0(r,o){var l=[];r=[r,0];for(var d=0;dp&&(p=T),d&=~m}if(d=p,d=pn()-d,d=(120>d?120:480>d?480:1080>d?1080:1920>d?1920:3e3>d?3e3:4320>d?4320:1960*lT(d/1960))-d,10r?16:r,Jo===null)var d=!1;else{if(r=Jo,Jo=null,vu=0,Ze&6)throw Error(f(331));var p=Ze;for(Ze|=4,be=r.current;be!==null;){var m=be,T=m.child;if(be.flags&16){var B=m.deletions;if(B!==null){for(var J=0;Jpn()-Ld?ki(r,0):Ud|=l),Vn(r,o)}function sh(r,o){o===0&&(r.mode&1?(o=Ei,Ei<<=1,!(Ei&130023424)&&(Ei=4194304)):o=1);var l=On();r=Kr(r,o),r!==null&&(_i(r,o,l),Vn(r,l))}function yT(r){var o=r.memoizedState,l=0;o!==null&&(l=o.retryLane),sh(r,l)}function gT(r,o){var l=0;switch(r.tag){case 13:var d=r.stateNode,p=r.memoizedState;p!==null&&(l=p.retryLane);break;case 19:d=r.stateNode;break;default:throw Error(f(314))}d!==null&&d.delete(o),sh(r,l)}var ch;ch=function(r,o,l){if(r!==null)if(r.memoizedProps!==o.pendingProps||bt.current)Wn=!0;else{if(!(r.lanes&l)&&!(o.flags&128))return Wn=!1,oT(r,o,l);Wn=!!(r.flags&131072)}else Wn=!1,zt&&o.flags&1048576&&Dm(o,Jc,o.index);switch(o.lanes=0,o.tag){case 2:var d=o.type;fu(r,o),r=o.pendingProps;var p=kn(o,gt.current);oa(o,l),p=pd(null,o,d,r,p,l);var m=md();return o.flags|=1,typeof p=="object"&&p!==null&&typeof p.render=="function"&&p.$$typeof===void 0?(o.tag=1,o.memoizedState=null,o.updateQueue=null,Pt(d)?(m=!0,dr(o)):m=!1,o.memoizedState=p.state!==null&&p.state!==void 0?p.state:null,od(o),p.updater=nu,o.stateNode=p,p._reactInternals=o,ad(o,d,r,l),o=xd(null,o,d,!0,m,l)):(o.tag=0,zt&&m&&Qf(o),Dn(null,o,p,l),o=o.child),o;case 16:d=o.elementType;e:{switch(fu(r,o),r=o.pendingProps,p=d._init,d=p(d._payload),o.type=d,p=o.tag=TT(d),r=Or(d,r),p){case 0:o=Sd(null,o,d,r,l);break e;case 1:o=P0(null,o,d,r,l);break e;case 11:o=A0(null,o,d,r,l);break e;case 14:o=O0(null,o,d,Or(d.type,r),l);break e}throw Error(f(306,d,""))}return o;case 0:return d=o.type,p=o.pendingProps,p=o.elementType===d?p:Or(d,p),Sd(r,o,d,p,l);case 1:return d=o.type,p=o.pendingProps,p=o.elementType===d?p:Or(d,p),P0(r,o,d,p,l);case 3:e:{if(B0(o),r===null)throw Error(f(387));d=o.pendingProps,m=o.memoizedState,p=m.element,Ym(r,o),tu(o,d,null,l);var T=o.memoizedState;if(d=T.element,dn&&m.isDehydrated)if(m={element:d,isDehydrated:!1,cache:T.cache,pendingSuspenseBoundaries:T.pendingSuspenseBoundaries,transitions:T.transitions},o.updateQueue.baseState=m,o.memoizedState=m,o.flags&256){p=ca(Error(f(423)),o),o=z0(r,o,d,l,p);break e}else if(d!==p){p=ca(Error(f(424)),o),o=z0(r,o,d,l,p);break e}else for(dn&&(yr=an(o.stateNode.containerInfo),$n=o,zt=!0,Ar=null,zs=!1),l=t0(o,null,d,l),o.child=l;l;)l.flags=l.flags&-3|4096,l=l.sibling;else{if(na(),d===p){o=ko(r,o,l);break e}Dn(r,o,d,l)}o=o.child}return o;case 5:return n0(o),r===null&&Xf(o),d=o.type,p=o.pendingProps,m=r!==null?r.memoizedProps:null,T=p.children,tn(d,p)?T=null:m!==null&&tn(d,m)&&(o.flags|=32),M0(r,o),Dn(r,o,T,l),o.child;case 6:return r===null&&Xf(o),null;case 13:return U0(r,o,l);case 4:return sd(o,o.stateNode.containerInfo),d=o.pendingProps,r===null?o.child=ia(o,null,d,l):Dn(r,o,d,l),o.child;case 11:return d=o.type,p=o.pendingProps,p=o.elementType===d?p:Or(d,p),A0(r,o,d,p,l);case 7:return Dn(r,o,o.pendingProps,l),o.child;case 8:return Dn(r,o,o.pendingProps.children,l),o.child;case 12:return Dn(r,o,o.pendingProps.children,l),o.child;case 10:e:{if(d=o.type._context,p=o.pendingProps,m=o.memoizedProps,T=p.value,Vm(o,d,T),m!==null)if(wr(m.value,T)){if(m.children===p.children&&!bt.current){o=ko(r,o,l);break e}}else for(m=o.child,m!==null&&(m.return=o);m!==null;){var B=m.dependencies;if(B!==null){T=m.child;for(var J=B.firstContext;J!==null;){if(J.context===d){if(m.tag===1){J=vo(-1,l&-l),J.tag=2;var ue=m.updateQueue;if(ue!==null){ue=ue.shared;var Ne=ue.pending;Ne===null?J.next=J:(J.next=Ne.next,Ne.next=J),ue.pending=J}}m.lanes|=l,J=m.alternate,J!==null&&(J.lanes|=l),nd(m.return,l,o),B.lanes|=l;break}J=J.next}}else if(m.tag===10)T=m.type===o.type?null:m.child;else if(m.tag===18){if(T=m.return,T===null)throw Error(f(341));T.lanes|=l,B=T.alternate,B!==null&&(B.lanes|=l),nd(T,l,o),T=m.sibling}else T=m.child;if(T!==null)T.return=m;else for(T=m;T!==null;){if(T===o){T=null;break}if(m=T.sibling,m!==null){m.return=T.return,T=m;break}T=T.return}m=T}Dn(r,o,p.children,l),o=o.child}return o;case 9:return p=o.type,d=o.pendingProps.children,oa(o,l),p=gr(p),d=d(p),o.flags|=1,Dn(r,o,d,l),o.child;case 14:return d=o.type,p=Or(d,o.pendingProps),p=Or(d.type,p),O0(r,o,d,p,l);case 15:return C0(r,o,o.type,o.pendingProps,l);case 17:return d=o.type,p=o.pendingProps,p=o.elementType===d?p:Or(d,p),fu(r,o),o.tag=1,Pt(d)?(r=!0,dr(o)):r=!1,oa(o,l),Xm(o,d,p),ad(o,d,p,l),xd(null,o,d,!0,r,l);case 19:return D0(r,o,l);case 22:return I0(r,o,l)}throw Error(f(156,o.tag))};function uh(r,o){return Bs(r,o)}function ET(r,o,l,d){this.tag=r,this.key=l,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=o,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=d,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Sr(r,o,l,d){return new ET(r,o,l,d)}function Yd(r){return r=r.prototype,!(!r||!r.isReactComponent)}function TT(r){if(typeof r=="function")return Yd(r)?1:0;if(r!=null){if(r=r.$$typeof,r===y)return 11;if(r===N)return 14}return 2}function Zo(r,o){var l=r.alternate;return l===null?(l=Sr(r.tag,o,r.key,r.mode),l.elementType=r.elementType,l.type=r.type,l.stateNode=r.stateNode,l.alternate=r,r.alternate=l):(l.pendingProps=o,l.type=r.type,l.flags=0,l.subtreeFlags=0,l.deletions=null),l.flags=r.flags&14680064,l.childLanes=r.childLanes,l.lanes=r.lanes,l.child=r.child,l.memoizedProps=r.memoizedProps,l.memoizedState=r.memoizedState,l.updateQueue=r.updateQueue,o=r.dependencies,l.dependencies=o===null?null:{lanes:o.lanes,firstContext:o.firstContext},l.sibling=r.sibling,l.index=r.index,l.ref=r.ref,l}function Au(r,o,l,d,p,m){var T=2;if(d=r,typeof r=="function")Yd(r)&&(T=1);else if(typeof r=="string")T=5;else e:switch(r){case E:return Ai(l.children,p,m,o);case C:T=8,p|=8;break;case v:return r=Sr(12,l,o,p|2),r.elementType=v,r.lanes=m,r;case _:return r=Sr(13,l,o,p),r.elementType=_,r.lanes=m,r;case S:return r=Sr(19,l,o,p),r.elementType=S,r.lanes=m,r;case oe:return Ou(l,p,m,o);default:if(typeof r=="object"&&r!==null)switch(r.$$typeof){case W:T=10;break e;case I:T=9;break e;case y:T=11;break e;case N:T=14;break e;case P:T=16,d=null;break e}throw Error(f(130,r==null?r:typeof r,""))}return o=Sr(T,l,o,p),o.elementType=r,o.type=d,o.lanes=m,o}function Ai(r,o,l,d){return r=Sr(7,r,d,o),r.lanes=l,r}function Ou(r,o,l,d){return r=Sr(22,r,d,o),r.elementType=oe,r.lanes=l,r.stateNode={isHidden:!1},r}function qd(r,o,l){return r=Sr(6,r,null,o),r.lanes=l,r}function Qd(r,o,l){return o=Sr(4,r.children!==null?r.children:[],r.key,o),o.lanes=l,o.stateNode={containerInfo:r.containerInfo,pendingChildren:null,implementation:r.implementation},o}function _T(r,o,l,d,p){this.tag=o,this.containerInfo=r,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=U,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=Ms(0),this.expirationTimes=Ms(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Ms(0),this.identifierPrefix=d,this.onRecoverableError=p,dn&&(this.mutableSourceEagerHydrationData=null)}function lh(r,o,l,d,p,m,T,B,J){return r=new _T(r,o,l,B,J),o===1?(o=1,m===!0&&(o|=8)):o=0,m=Sr(3,null,null,o),r.current=m,m.stateNode=r,m.memoizedState={element:d,isDehydrated:l,cache:null,transitions:null,pendingSuspenseBoundaries:null},od(m),r}function fh(r){if(!r)return Jt;r=r._reactInternals;e:{if(ie(r)!==r||r.tag!==1)throw Error(f(170));var o=r;do{switch(o.tag){case 3:o=o.stateNode.context;break e;case 1:if(Pt(o.type)){o=o.stateNode.__reactInternalMemoizedMergedChildContext;break e}}o=o.return}while(o!==null);throw Error(f(171))}if(r.tag===1){var l=r.type;if(Pt(l))return Bt(r,l,o)}return o}function dh(r){var o=r._reactInternals;if(o===void 0)throw typeof r.render=="function"?Error(f(188)):(r=Object.keys(r).join(","),Error(f(268,r)));return r=M(o),r===null?null:r.stateNode}function ph(r,o){if(r=r.memoizedState,r!==null&&r.dehydrated!==null){var l=r.retryLane;r.retryLane=l!==0&&l=ue&&m>=je&&p<=Ne&&T<=ge){r.splice(o,1);break}else if(d!==ue||l.width!==J.width||geT){if(!(m!==je||l.height!==J.height||Nep)){ue>d&&(J.width+=ue-d,J.x=d),Nem&&(J.height+=je-m,J.y=m),gel&&(l=T)),T ")+` - -No matching component was found for: - `)+r.join(" > ")}return null},a.getPublicRootInstance=function(r){if(r=r.current,!r.child)return null;switch(r.child.tag){case 5:return we(r.child.stateNode);default:return r.child.stateNode}},a.injectIntoDevTools=function(r){if(r={bundleType:r.bundleType,version:r.version,rendererPackageName:r.rendererPackageName,rendererConfig:r.rendererConfig,overrideHookState:null,overrideHookStateDeletePath:null,overrideHookStateRenamePath:null,overrideProps:null,overridePropsDeletePath:null,overridePropsRenamePath:null,setErrorHandler:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:u.ReactCurrentDispatcher,findHostInstanceByFiber:ST,findFiberByHostInstance:r.findFiberByHostInstance||xT,findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null,reconcilerVersion:"18.2.0"},typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u")r=!1;else{var o=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(o.isDisabled||!o.supportsFiber)r=!0;else{try{Yc=o.inject(r),Qr=o}catch{}r=!!o.checkDCE}}return r},a.isAlreadyRendering=function(){return!1},a.observeVisibleRects=function(r,o,l,d){if(!et)throw Error(f(363));r=Bd(r,o);var p=Zn(r,l,d).disconnect;return{disconnect:function(){p()}}},a.registerMutableSourceForHydration=function(r,o){var l=o._getVersion;l=l(o._source),r.mutableSourceEagerHydrationData==null?r.mutableSourceEagerHydrationData=[o,l]:r.mutableSourceEagerHydrationData.push(o,l)},a.runWithPriority=function(r,o){var l=it;try{return it=r,o()}finally{it=l}},a.shouldError=function(){return null},a.shouldSuspend=function(){return!1},a.updateContainer=function(r,o,l,d){var p=o.current,m=On(),T=Ko(p);return l=fh(l),o.context===null?o.context=l:o.pendingContext=l,o=vo(m,T),o.payload={element:r},d=d===void 0?null:d,d!==null&&(o.callback=d),r=qo(p,o,T),r!==null&&(_r(r,p,T,m),eu(r,p,T)),T},a}});var WE=Lt((UP,jE)=>{"use strict";jE.exports=FE()});var qx={};AT(qx,{main:()=>Uf,onStart:()=>Yx,onUpdate:()=>Gx,rendererTransport:()=>Df});module.exports=OT(qx);var Ii=Ue(Le());function FT(){return{states:[]}}var pa;(function(e){function t(n,s=Ii.default.Writer.create()){for(let i of n.states)Lu.encode(i,s.uint32(10).fork()).ldelim();return s}e.encode=t;function a(n,s){let i=n instanceof Ii.default.Reader?n:Ii.default.Reader.create(n),f=s===void 0?i.len:i.pos+s,u=FT();for(;i.pos>>3){case 1:if(c!==10)break;u.states.push(Lu.decode(i,i.uint32()));continue}if((c&7)===4||c===0)break;i.skipType(c&7)}return u}e.decode=a})(pa||(pa={}));function jT(){return{clip:"",playing:void 0,weight:void 0,speed:void 0,loop:void 0,shouldReset:void 0}}var Lu;(function(e){function t(n,s=Ii.default.Writer.create()){return n.clip!==""&&s.uint32(18).string(n.clip),n.playing!==void 0&&s.uint32(24).bool(n.playing),n.weight!==void 0&&s.uint32(37).float(n.weight),n.speed!==void 0&&s.uint32(45).float(n.speed),n.loop!==void 0&&s.uint32(48).bool(n.loop),n.shouldReset!==void 0&&s.uint32(56).bool(n.shouldReset),s}e.encode=t;function a(n,s){let i=n instanceof Ii.default.Reader?n:Ii.default.Reader.create(n),f=s===void 0?i.len:i.pos+s,u=jT();for(;i.pos>>3){case 2:if(c!==18)break;u.clip=i.string();continue;case 3:if(c!==24)break;u.playing=i.bool();continue;case 4:if(c!==37)break;u.weight=i.float();continue;case 5:if(c!==45)break;u.speed=i.float();continue;case 6:if(c!==48)break;u.loop=i.bool();continue;case 7:if(c!==56)break;u.shouldReset=i.bool();continue}if((c&7)===4||c===0)break;i.skipType(c&7)}return u}e.decode=a})(Lu||(Lu={}));var ly={COMPONENT_ID:1042,serialize(e,t){let a=pa.encode(e),n=new Uint8Array(a.finish(),0,a.len);t.writeBuffer(n,!1)},deserialize(e){return pa.decode(e.buffer(),e.remainingBytes())},create(){return pa.decode(new Uint8Array)},jsonSchema:{type:"object",properties:{},serializationType:"protocol-buffer",protocolBuffer:"PBAnimator"}};var Du=Ue(Le());function WT(){return{playing:void 0,volume:void 0,loop:void 0,pitch:void 0,audioClipUrl:""}}var ma;(function(e){function t(n,s=Du.default.Writer.create()){return n.playing!==void 0&&s.uint32(8).bool(n.playing),n.volume!==void 0&&s.uint32(21).float(n.volume),n.loop!==void 0&&s.uint32(24).bool(n.loop),n.pitch!==void 0&&s.uint32(37).float(n.pitch),n.audioClipUrl!==""&&s.uint32(42).string(n.audioClipUrl),s}e.encode=t;function a(n,s){let i=n instanceof Du.default.Reader?n:Du.default.Reader.create(n),f=s===void 0?i.len:i.pos+s,u=WT();for(;i.pos>>3){case 1:if(c!==8)break;u.playing=i.bool();continue;case 2:if(c!==21)break;u.volume=i.float();continue;case 3:if(c!==24)break;u.loop=i.bool();continue;case 4:if(c!==37)break;u.pitch=i.float();continue;case 5:if(c!==42)break;u.audioClipUrl=i.string();continue}if((c&7)===4||c===0)break;i.skipType(c&7)}return u}e.decode=a})(ma||(ma={}));var fy={COMPONENT_ID:1020,serialize(e,t){let a=ma.encode(e),n=new Uint8Array(a.finish(),0,a.len);t.writeBuffer(n,!1)},deserialize(e){return ma.decode(e.buffer(),e.remainingBytes())},create(){return ma.decode(new Uint8Array)},jsonSchema:{type:"object",properties:{},serializationType:"protocol-buffer",protocolBuffer:"PBAudioSource"}};var Fu=Ue(Le());function HT(){return{playing:void 0,volume:void 0,url:""}}var ha;(function(e){function t(n,s=Fu.default.Writer.create()){return n.playing!==void 0&&s.uint32(8).bool(n.playing),n.volume!==void 0&&s.uint32(21).float(n.volume),n.url!==""&&s.uint32(26).string(n.url),s}e.encode=t;function a(n,s){let i=n instanceof Fu.default.Reader?n:Fu.default.Reader.create(n),f=s===void 0?i.len:i.pos+s,u=HT();for(;i.pos>>3){case 1:if(c!==8)break;u.playing=i.bool();continue;case 2:if(c!==21)break;u.volume=i.float();continue;case 3:if(c!==26)break;u.url=i.string();continue}if((c&7)===4||c===0)break;i.skipType(c&7)}return u}e.decode=a})(ha||(ha={}));var dy={COMPONENT_ID:1021,serialize(e,t){let a=ha.encode(e),n=new Uint8Array(a.finish(),0,a.len);t.writeBuffer(n,!1)},deserialize(e){return ha.decode(e.buffer(),e.remainingBytes())},create(){return ha.decode(new Uint8Array)},jsonSchema:{type:"object",properties:{},serializationType:"protocol-buffer",protocolBuffer:"PBAudioStream"}};var ju=Ue(Le());var Wu;(function(e){e[e.AAPT_POSITION=0]="AAPT_POSITION",e[e.AAPT_NAME_TAG=1]="AAPT_NAME_TAG",e[e.AAPT_LEFT_HAND=2]="AAPT_LEFT_HAND",e[e.AAPT_RIGHT_HAND=3]="AAPT_RIGHT_HAND"})(Wu||(Wu={}));function VT(){return{avatarId:void 0,anchorPointId:0}}var ya;(function(e){function t(n,s=ju.default.Writer.create()){return n.avatarId!==void 0&&s.uint32(10).string(n.avatarId),n.anchorPointId!==0&&s.uint32(16).int32(n.anchorPointId),s}e.encode=t;function a(n,s){let i=n instanceof ju.default.Reader?n:ju.default.Reader.create(n),f=s===void 0?i.len:i.pos+s,u=VT();for(;i.pos>>3){case 1:if(c!==10)break;u.avatarId=i.string();continue;case 2:if(c!==16)break;u.anchorPointId=i.int32();continue}if((c&7)===4||c===0)break;i.skipType(c&7)}return u}e.decode=a})(ya||(ya={}));var py={COMPONENT_ID:1073,serialize(e,t){let a=ya.encode(e),n=new Uint8Array(a.finish(),0,a.len);t.writeBuffer(n,!1)},deserialize(e){return ya.decode(e.buffer(),e.remainingBytes())},create(){return ya.decode(new Uint8Array)},jsonSchema:{type:"object",properties:{},serializationType:"protocol-buffer",protocolBuffer:"PBAvatarAttach"}};var Hu=Ue(Le());var tr=Ue(Le());function GT(){return{x:0,y:0,z:0}}var my;(function(e){function t(n,s=tr.default.Writer.create()){return n.x!==0&&s.uint32(13).float(n.x),n.y!==0&&s.uint32(21).float(n.y),n.z!==0&&s.uint32(29).float(n.z),s}e.encode=t;function a(n,s){let i=n instanceof tr.default.Reader?n:tr.default.Reader.create(n),f=s===void 0?i.len:i.pos+s,u=GT();for(;i.pos>>3){case 1:if(c!==13)break;u.x=i.float();continue;case 2:if(c!==21)break;u.y=i.float();continue;case 3:if(c!==29)break;u.z=i.float();continue}if((c&7)===4||c===0)break;i.skipType(c&7)}return u}e.decode=a})(my||(my={}));function YT(){return{x:0,y:0,z:0}}var Qe;(function(e){function t(n,s=tr.default.Writer.create()){return n.x!==0&&s.uint32(13).float(n.x),n.y!==0&&s.uint32(21).float(n.y),n.z!==0&&s.uint32(29).float(n.z),s}e.encode=t;function a(n,s){let i=n instanceof tr.default.Reader?n:tr.default.Reader.create(n),f=s===void 0?i.len:i.pos+s,u=YT();for(;i.pos>>3){case 1:if(c!==13)break;u.x=i.float();continue;case 2:if(c!==21)break;u.y=i.float();continue;case 3:if(c!==29)break;u.z=i.float();continue}if((c&7)===4||c===0)break;i.skipType(c&7)}return u}e.decode=a})(Qe||(Qe={}));function qT(){return{x:0,y:0}}var hy;(function(e){function t(n,s=tr.default.Writer.create()){return n.x!==0&&s.uint32(13).float(n.x),n.y!==0&&s.uint32(21).float(n.y),s}e.encode=t;function a(n,s){let i=n instanceof tr.default.Reader?n:tr.default.Reader.create(n),f=s===void 0?i.len:i.pos+s,u=qT();for(;i.pos>>3){case 1:if(c!==13)break;u.x=i.float();continue;case 2:if(c!==21)break;u.y=i.float();continue}if((c&7)===4||c===0)break;i.skipType(c&7)}return u}e.decode=a})(hy||(hy={}));function QT(){return{x:0,y:0,z:0,w:0}}var Mi;(function(e){function t(n,s=tr.default.Writer.create()){return n.x!==0&&s.uint32(13).float(n.x),n.y!==0&&s.uint32(21).float(n.y),n.z!==0&&s.uint32(29).float(n.z),n.w!==0&&s.uint32(37).float(n.w),s}e.encode=t;function a(n,s){let i=n instanceof tr.default.Reader?n:tr.default.Reader.create(n),f=s===void 0?i.len:i.pos+s,u=QT();for(;i.pos>>3){case 1:if(c!==13)break;u.x=i.float();continue;case 2:if(c!==21)break;u.y=i.float();continue;case 3:if(c!==29)break;u.z=i.float();continue;case 4:if(c!==37)break;u.w=i.float();continue}if((c&7)===4||c===0)break;i.skipType(c&7)}return u}e.decode=a})(Mi||(Mi={}));var yy;(function(e){e[e.AMT_HIDE_AVATARS=0]="AMT_HIDE_AVATARS",e[e.AMT_DISABLE_PASSPORTS=1]="AMT_DISABLE_PASSPORTS"})(yy||(yy={}));function JT(){return{area:void 0,excludeIds:[],modifiers:[]}}var ga;(function(e){function t(n,s=Hu.default.Writer.create()){n.area!==void 0&&Qe.encode(n.area,s.uint32(10).fork()).ldelim();for(let i of n.excludeIds)s.uint32(18).string(i);s.uint32(26).fork();for(let i of n.modifiers)s.int32(i);return s.ldelim(),s}e.encode=t;function a(n,s){let i=n instanceof Hu.default.Reader?n:Hu.default.Reader.create(n),f=s===void 0?i.len:i.pos+s,u=JT();for(;i.pos>>3){case 1:if(c!==10)break;u.area=Qe.decode(i,i.uint32());continue;case 2:if(c!==18)break;u.excludeIds.push(i.string());continue;case 3:if(c===24){u.modifiers.push(i.int32());continue}if(c===26){let h=i.uint32()+i.pos;for(;i.pos>>=0,(s=0<=e&&e<256)&&(n=_y[e],n)?n:(a=ft(e,0,!0),s&&(_y[e]=a),a)):(e|=0,(s=-128<=e&&e<128)&&(n=Ty[e],n)?n:(a=ft(e,e<0?-1:0,!1),s&&(Ty[e]=a),a))}Rt.fromInt=Pi;function Rr(e,t){if(isNaN(e))return t?Ao:zr;if(t){if(e<0)return Ao;if(e>=Ry)return Ny}else{if(e<=-xy)return qn;if(e+1>=xy)return ky}return e<0?Rr(-e,t).neg():ft(e%Ta|0,e/Ta|0,t)}Rt.fromNumber=Rr;function ft(e,t,a){return new Rt(e,t,a)}Rt.fromBits=ft;var Vu=Math.pow;function up(e,t,a){if(e.length===0)throw Error("empty string");if(typeof t=="number"?(a=t,t=!1):t=!!t,e==="NaN"||e==="Infinity"||e==="+Infinity"||e==="-Infinity")return t?Ao:zr;if(a=a||10,a<2||360)throw Error("interior hyphen");if(n===0)return up(e.substring(1),t,a).neg();for(var s=Rr(Vu(a,8)),i=zr,f=0;f>>0:this.low};se.toNumber=function(){return this.unsigned?(this.high>>>0)*Ta+(this.low>>>0):this.high*Ta+(this.low>>>0)};se.toString=function(t){if(t=t||10,t<2||36>>0,E=h.toString(t);if(f=c,f.isZero())return E+u;for(;E.length<6;)E="0"+E;u=""+E+u}};se.getHighBits=function(){return this.high};se.getHighBitsUnsigned=function(){return this.high>>>0};se.getLowBits=function(){return this.low};se.getLowBitsUnsigned=function(){return this.low>>>0};se.getNumBitsAbs=function(){if(this.isNegative())return this.eq(qn)?64:this.neg().getNumBitsAbs();for(var t=this.high!=0?this.high:this.low,a=31;a>0&&!(t&1<=0};se.isOdd=function(){return(this.low&1)===1};se.isEven=function(){return(this.low&1)===0};se.equals=function(t){return Cn(t)||(t=Ur(t)),this.unsigned!==t.unsigned&&this.high>>>31===1&&t.high>>>31===1?!1:this.high===t.high&&this.low===t.low};se.eq=se.equals;se.notEquals=function(t){return!this.eq(t)};se.neq=se.notEquals;se.ne=se.notEquals;se.lessThan=function(t){return this.comp(t)<0};se.lt=se.lessThan;se.lessThanOrEqual=function(t){return this.comp(t)<=0};se.lte=se.lessThanOrEqual;se.le=se.lessThanOrEqual;se.greaterThan=function(t){return this.comp(t)>0};se.gt=se.greaterThan;se.greaterThanOrEqual=function(t){return this.comp(t)>=0};se.gte=se.greaterThanOrEqual;se.ge=se.greaterThanOrEqual;se.compare=function(t){if(Cn(t)||(t=Ur(t)),this.eq(t))return 0;var a=this.isNegative(),n=t.isNegative();return a&&!n?-1:!a&&n?1:this.unsigned?t.high>>>0>this.high>>>0||t.high===this.high&&t.low>>>0>this.low>>>0?-1:1:this.sub(t).isNegative()?-1:1};se.comp=se.compare;se.negate=function(){return!this.unsigned&&this.eq(qn)?qn:this.not().add(Ea)};se.neg=se.negate;se.add=function(t){Cn(t)||(t=Ur(t));var a=this.high>>>16,n=this.high&65535,s=this.low>>>16,i=this.low&65535,f=t.high>>>16,u=t.high&65535,c=t.low>>>16,h=t.low&65535,E=0,C=0,v=0,W=0;return W+=i+h,v+=W>>>16,W&=65535,v+=s+c,C+=v>>>16,v&=65535,C+=n+u,E+=C>>>16,C&=65535,E+=a+f,E&=65535,ft(v<<16|W,E<<16|C,this.unsigned)};se.subtract=function(t){return Cn(t)||(t=Ur(t)),this.add(t.neg())};se.sub=se.subtract;se.multiply=function(t){if(this.isZero())return this;if(Cn(t)||(t=Ur(t)),br){var a=br.mul(this.low,this.high,t.low,t.high);return ft(a,br.get_high(),this.unsigned)}if(t.isZero())return this.unsigned?Ao:zr;if(this.eq(qn))return t.isOdd()?qn:zr;if(t.eq(qn))return this.isOdd()?qn:zr;if(this.isNegative())return t.isNegative()?this.neg().mul(t.neg()):this.neg().mul(t).neg();if(t.isNegative())return this.mul(t.neg()).neg();if(this.lt(by)&&t.lt(by))return Rr(this.toNumber()*t.toNumber(),this.unsigned);var n=this.high>>>16,s=this.high&65535,i=this.low>>>16,f=this.low&65535,u=t.high>>>16,c=t.high&65535,h=t.low>>>16,E=t.low&65535,C=0,v=0,W=0,I=0;return I+=f*E,W+=I>>>16,I&=65535,W+=i*E,v+=W>>>16,W&=65535,W+=f*h,v+=W>>>16,W&=65535,v+=s*E,C+=v>>>16,v&=65535,v+=i*h,C+=v>>>16,v&=65535,v+=f*c,C+=v>>>16,v&=65535,C+=n*E+s*h+i*c+f*u,C&=65535,ft(W<<16|I,C<<16|v,this.unsigned)};se.mul=se.multiply;se.divide=function(t){if(Cn(t)||(t=Ur(t)),t.isZero())throw Error("division by zero");if(br){if(!this.unsigned&&this.high===-2147483648&&t.low===-1&&t.high===-1)return this;var a=(this.unsigned?br.div_u:br.div_s)(this.low,this.high,t.low,t.high);return ft(a,br.get_high(),this.unsigned)}if(this.isZero())return this.unsigned?Ao:zr;var n,s,i;if(this.unsigned){if(t.unsigned||(t=t.toUnsigned()),t.gt(this))return Ao;if(t.gt(this.shru(1)))return vy;i=Ao}else{if(this.eq(qn)){if(t.eq(Ea)||t.eq(cp))return qn;if(t.eq(qn))return Ea;var f=this.shr(1);return n=f.div(t).shl(1),n.eq(zr)?t.isNegative()?Ea:cp:(s=this.sub(t.mul(n)),i=n.add(s.div(t)),i)}else if(t.eq(qn))return this.unsigned?Ao:zr;if(this.isNegative())return t.isNegative()?this.neg().div(t.neg()):this.neg().div(t).neg();if(t.isNegative())return this.div(t.neg()).neg();i=zr}for(s=this;s.gte(t);){n=Math.max(1,Math.floor(s.toNumber()/t.toNumber()));for(var u=Math.ceil(Math.log(n)/Math.LN2),c=u<=48?1:Vu(2,u-48),h=Rr(n),E=h.mul(t);E.isNegative()||E.gt(s);)n-=c,h=Rr(n,this.unsigned),E=h.mul(t);h.isZero()&&(h=Ea),i=i.add(h),s=s.sub(E)}return i};se.div=se.divide;se.modulo=function(t){if(Cn(t)||(t=Ur(t)),br){var a=(this.unsigned?br.rem_u:br.rem_s)(this.low,this.high,t.low,t.high);return ft(a,br.get_high(),this.unsigned)}return this.sub(this.div(t).mul(t))};se.mod=se.modulo;se.rem=se.modulo;se.not=function(){return ft(~this.low,~this.high,this.unsigned)};se.countLeadingZeros=function(){return this.high?Math.clz32(this.high):Math.clz32(this.low)+32};se.clz=se.countLeadingZeros;se.countTrailingZeros=function(){return this.low?Ey(this.low):Ey(this.high)+32};se.ctz=se.countTrailingZeros;se.and=function(t){return Cn(t)||(t=Ur(t)),ft(this.low&t.low,this.high&t.high,this.unsigned)};se.or=function(t){return Cn(t)||(t=Ur(t)),ft(this.low|t.low,this.high|t.high,this.unsigned)};se.xor=function(t){return Cn(t)||(t=Ur(t)),ft(this.low^t.low,this.high^t.high,this.unsigned)};se.shiftLeft=function(t){return Cn(t)&&(t=t.toInt()),(t&=63)===0?this:t<32?ft(this.low<>>32-t,this.unsigned):ft(0,this.low<>>t|this.high<<32-t,this.high>>t,this.unsigned):ft(this.high>>t-32,this.high>=0?0:-1,this.unsigned)};se.shr=se.shiftRight;se.shiftRightUnsigned=function(t){return Cn(t)&&(t=t.toInt()),(t&=63)===0?this:t<32?ft(this.low>>>t|this.high<<32-t,this.high>>>t,this.unsigned):t===32?ft(this.high,0,this.unsigned):ft(this.high>>>t-32,0,this.unsigned)};se.shru=se.shiftRightUnsigned;se.shr_u=se.shiftRightUnsigned;se.rotateLeft=function(t){var a;return Cn(t)&&(t=t.toInt()),(t&=63)===0?this:t===32?ft(this.high,this.low,this.unsigned):t<32?(a=32-t,ft(this.low<>>a,this.high<>>a,this.unsigned)):(t-=32,a=32-t,ft(this.high<>>a,this.low<>>a,this.unsigned))};se.rotl=se.rotateLeft;se.rotateRight=function(t){var a;return Cn(t)&&(t=t.toInt()),(t&=63)===0?this:t===32?ft(this.high,this.low,this.unsigned):t<32?(a=32-t,ft(this.high<>>t,this.low<>>t,this.unsigned)):(t-=32,a=32-t,ft(this.low<>>t,this.high<>>t,this.unsigned))};se.rotr=se.rotateRight;se.toSigned=function(){return this.unsigned?ft(this.low,this.high,!1):this};se.toUnsigned=function(){return this.unsigned?this:ft(this.low,this.high,!0)};se.toBytes=function(t){return t?this.toBytesLE():this.toBytesBE()};se.toBytesLE=function(){var t=this.high,a=this.low;return[a&255,a>>>8&255,a>>>16&255,a>>>24,t&255,t>>>8&255,t>>>16&255,t>>>24]};se.toBytesBE=function(){var t=this.high,a=this.low;return[t>>>24,t>>>16&255,t>>>8&255,t&255,a>>>24,a>>>16&255,a>>>8&255,a&255]};Rt.fromBytes=function(t,a,n){return n?Rt.fromBytesLE(t,a):Rt.fromBytesBE(t,a)};Rt.fromBytesLE=function(t,a){return new Rt(t[0]|t[1]<<8|t[2]<<16|t[3]<<24,t[4]|t[5]<<8|t[6]<<16|t[7]<<24,a)};Rt.fromBytesBE=function(t,a){return new Rt(t[4]<<24|t[5]<<16|t[6]<<8|t[7],t[0]<<24|t[1]<<16|t[2]<<8|t[3],a)};var lp=Rt;var zi=Ue(Le());var Bi=Ue(Le());function XT(){return{r:0,g:0,b:0}}var Vt;(function(e){function t(n,s=Bi.default.Writer.create()){return n.r!==0&&s.uint32(13).float(n.r),n.g!==0&&s.uint32(21).float(n.g),n.b!==0&&s.uint32(29).float(n.b),s}e.encode=t;function a(n,s){let i=n instanceof Bi.default.Reader?n:Bi.default.Reader.create(n),f=s===void 0?i.len:i.pos+s,u=XT();for(;i.pos>>3){case 1:if(c!==13)break;u.r=i.float();continue;case 2:if(c!==21)break;u.g=i.float();continue;case 3:if(c!==29)break;u.b=i.float();continue}if((c&7)===4||c===0)break;i.skipType(c&7)}return u}e.decode=a})(Vt||(Vt={}));function ZT(){return{r:0,g:0,b:0,a:0}}var Dt;(function(e){function t(n,s=Bi.default.Writer.create()){return n.r!==0&&s.uint32(13).float(n.r),n.g!==0&&s.uint32(21).float(n.g),n.b!==0&&s.uint32(29).float(n.b),n.a!==0&&s.uint32(37).float(n.a),s}e.encode=t;function a(n,s){let i=n instanceof Bi.default.Reader?n:Bi.default.Reader.create(n),f=s===void 0?i.len:i.pos+s,u=ZT();for(;i.pos>>3){case 1:if(c!==13)break;u.r=i.float();continue;case 2:if(c!==21)break;u.g=i.float();continue;case 3:if(c!==29)break;u.b=i.float();continue;case 4:if(c!==37)break;u.a=i.float();continue}if((c&7)===4||c===0)break;i.skipType(c&7)}return u}e.decode=a})(Dt||(Dt={}));function $T(){return{id:"",name:void 0,bodyShape:void 0,skinColor:void 0,hairColor:void 0,eyeColor:void 0,expressionTriggerId:void 0,expressionTriggerTimestamp:void 0,talking:void 0,wearables:[],emotes:[]}}var _a;(function(e){function t(n,s=zi.default.Writer.create()){n.id!==""&&s.uint32(10).string(n.id),n.name!==void 0&&s.uint32(18).string(n.name),n.bodyShape!==void 0&&s.uint32(26).string(n.bodyShape),n.skinColor!==void 0&&Vt.encode(n.skinColor,s.uint32(34).fork()).ldelim(),n.hairColor!==void 0&&Vt.encode(n.hairColor,s.uint32(42).fork()).ldelim(),n.eyeColor!==void 0&&Vt.encode(n.eyeColor,s.uint32(50).fork()).ldelim(),n.expressionTriggerId!==void 0&&s.uint32(58).string(n.expressionTriggerId),n.expressionTriggerTimestamp!==void 0&&s.uint32(64).int64(n.expressionTriggerTimestamp),n.talking!==void 0&&s.uint32(72).bool(n.talking);for(let i of n.wearables)s.uint32(82).string(i);for(let i of n.emotes)s.uint32(90).string(i);return s}e.encode=t;function a(n,s){let i=n instanceof zi.default.Reader?n:zi.default.Reader.create(n),f=s===void 0?i.len:i.pos+s,u=$T();for(;i.pos>>3){case 1:if(c!==10)break;u.id=i.string();continue;case 2:if(c!==18)break;u.name=i.string();continue;case 3:if(c!==26)break;u.bodyShape=i.string();continue;case 4:if(c!==34)break;u.skinColor=Vt.decode(i,i.uint32());continue;case 5:if(c!==42)break;u.hairColor=Vt.decode(i,i.uint32());continue;case 6:if(c!==50)break;u.eyeColor=Vt.decode(i,i.uint32());continue;case 7:if(c!==58)break;u.expressionTriggerId=i.string();continue;case 8:if(c!==64)break;u.expressionTriggerTimestamp=t_(i.int64());continue;case 9:if(c!==72)break;u.talking=i.bool();continue;case 10:if(c!==82)break;u.wearables.push(i.string());continue;case 11:if(c!==90)break;u.emotes.push(i.string());continue}if((c&7)===4||c===0)break;i.skipType(c&7)}return u}e.decode=a})(_a||(_a={}));var e_=(()=>{if(typeof globalThis<"u")return globalThis;if(typeof self<"u")return self;if(typeof global<"u")return global;throw"Unable to locate global object"})();function t_(e){if(e.gt(Number.MAX_SAFE_INTEGER))throw new e_.Error("Value is larger than Number.MAX_SAFE_INTEGER");return e.toNumber()}zi.default.util.Long!==lp&&(zi.default.util.Long=lp,zi.default.configure());var wy={COMPONENT_ID:1080,serialize(e,t){let a=_a.encode(e),n=new Uint8Array(a.finish(),0,a.len);t.writeBuffer(n,!1)},deserialize(e){return _a.decode(e.buffer(),e.remainingBytes())},create(){return _a.decode(new Uint8Array)},jsonSchema:{type:"object",properties:{},serializationType:"protocol-buffer",protocolBuffer:"PBAvatarShape"}};var Gu=Ue(Le());var Ay;(function(e){e[e.BM_NONE=0]="BM_NONE",e[e.BM_X=1]="BM_X",e[e.BM_Y=2]="BM_Y",e[e.BM_Z=4]="BM_Z",e[e.BM_ALL=7]="BM_ALL"})(Ay||(Ay={}));function n_(){return{billboardMode:void 0}}var Sa;(function(e){function t(n,s=Gu.default.Writer.create()){return n.billboardMode!==void 0&&s.uint32(8).int32(n.billboardMode),s}e.encode=t;function a(n,s){let i=n instanceof Gu.default.Reader?n:Gu.default.Reader.create(n),f=s===void 0?i.len:i.pos+s,u=n_();for(;i.pos>>3){case 1:if(c!==8)break;u.billboardMode=i.int32();continue}if((c&7)===4||c===0)break;i.skipType(c&7)}return u}e.decode=a})(Sa||(Sa={}));var Oy={COMPONENT_ID:1090,serialize(e,t){let a=Sa.encode(e),n=new Uint8Array(a.finish(),0,a.len);t.writeBuffer(n,!1)},deserialize(e){return Sa.decode(e.buffer(),e.remainingBytes())},create(){return Sa.decode(new Uint8Array)},jsonSchema:{type:"object",properties:{},serializationType:"protocol-buffer",protocolBuffer:"PBBillboard"}};var Yu=Ue(Le());function r_(){return{mode:0}}var xa;(function(e){function t(n,s=Yu.default.Writer.create()){return n.mode!==0&&s.uint32(8).int32(n.mode),s}e.encode=t;function a(n,s){let i=n instanceof Yu.default.Reader?n:Yu.default.Reader.create(n),f=s===void 0?i.len:i.pos+s,u=r_();for(;i.pos>>3){case 1:if(c!==8)break;u.mode=i.int32();continue}if((c&7)===4||c===0)break;i.skipType(c&7)}return u}e.decode=a})(xa||(xa={}));var Cy={COMPONENT_ID:1072,serialize(e,t){let a=xa.encode(e),n=new Uint8Array(a.finish(),0,a.len);t.writeBuffer(n,!1)},deserialize(e){return xa.decode(e.buffer(),e.remainingBytes())},create(){return xa.decode(new Uint8Array)},jsonSchema:{type:"object",properties:{},serializationType:"protocol-buffer",protocolBuffer:"PBCameraMode"}};var qu=Ue(Le());function o_(){return{area:void 0,mode:0}}var ba;(function(e){function t(n,s=qu.default.Writer.create()){return n.area!==void 0&&Qe.encode(n.area,s.uint32(10).fork()).ldelim(),n.mode!==0&&s.uint32(16).int32(n.mode),s}e.encode=t;function a(n,s){let i=n instanceof qu.default.Reader?n:qu.default.Reader.create(n),f=s===void 0?i.len:i.pos+s,u=o_();for(;i.pos>>3){case 1:if(c!==10)break;u.area=Qe.decode(i,i.uint32());continue;case 2:if(c!==16)break;u.mode=i.int32();continue}if((c&7)===4||c===0)break;i.skipType(c&7)}return u}e.decode=a})(ba||(ba={}));var Iy={COMPONENT_ID:1071,serialize(e,t){let a=ba.encode(e),n=new Uint8Array(a.finish(),0,a.len);t.writeBuffer(n,!1)},deserialize(e){return ba.decode(e.buffer(),e.remainingBytes())},create(){return ba.decode(new Uint8Array)},jsonSchema:{type:"object",properties:{},serializationType:"protocol-buffer",protocolBuffer:"PBCameraModeArea"}};var Qu=Ue(Le());function i_(){return{frameNumber:0,totalRuntime:0,tickNumber:0}}var Ra;(function(e){function t(n,s=Qu.default.Writer.create()){return n.frameNumber!==0&&s.uint32(8).uint32(n.frameNumber),n.totalRuntime!==0&&s.uint32(21).float(n.totalRuntime),n.tickNumber!==0&&s.uint32(24).uint32(n.tickNumber),s}e.encode=t;function a(n,s){let i=n instanceof Qu.default.Reader?n:Qu.default.Reader.create(n),f=s===void 0?i.len:i.pos+s,u=i_();for(;i.pos>>3){case 1:if(c!==8)break;u.frameNumber=i.uint32();continue;case 2:if(c!==21)break;u.totalRuntime=i.float();continue;case 3:if(c!==24)break;u.tickNumber=i.uint32();continue}if((c&7)===4||c===0)break;i.skipType(c&7)}return u}e.decode=a})(Ra||(Ra={}));var My={COMPONENT_ID:1048,serialize(e,t){let a=Ra.encode(e),n=new Uint8Array(a.finish(),0,a.len);t.writeBuffer(n,!1)},deserialize(e){return Ra.decode(e.buffer(),e.remainingBytes())},create(){return Ra.decode(new Uint8Array)},jsonSchema:{type:"object",properties:{},serializationType:"protocol-buffer",protocolBuffer:"PBEngineInfo"}};var Ju=Ue(Le());function a_(){return{src:"",visibleMeshesCollisionMask:void 0,invisibleMeshesCollisionMask:void 0}}var va;(function(e){function t(n,s=Ju.default.Writer.create()){return n.src!==""&&s.uint32(10).string(n.src),n.visibleMeshesCollisionMask!==void 0&&s.uint32(32).uint32(n.visibleMeshesCollisionMask),n.invisibleMeshesCollisionMask!==void 0&&s.uint32(40).uint32(n.invisibleMeshesCollisionMask),s}e.encode=t;function a(n,s){let i=n instanceof Ju.default.Reader?n:Ju.default.Reader.create(n),f=s===void 0?i.len:i.pos+s,u=a_();for(;i.pos>>3){case 1:if(c!==10)break;u.src=i.string();continue;case 4:if(c!==32)break;u.visibleMeshesCollisionMask=i.uint32();continue;case 5:if(c!==40)break;u.invisibleMeshesCollisionMask=i.uint32();continue}if((c&7)===4||c===0)break;i.skipType(c&7)}return u}e.decode=a})(va||(va={}));var Py={COMPONENT_ID:1041,serialize(e,t){let a=va.encode(e),n=new Uint8Array(a.finish(),0,a.len);t.writeBuffer(n,!1)},deserialize(e){return va.decode(e.buffer(),e.remainingBytes())},create(){return va.decode(new Uint8Array)},jsonSchema:{type:"object",properties:{},serializationType:"protocol-buffer",protocolBuffer:"PBGltfContainer"}};var Ku=Ue(Le());function s_(){return{currentState:0}}var ka;(function(e){function t(n,s=Ku.default.Writer.create()){return n.currentState!==0&&s.uint32(8).int32(n.currentState),s}e.encode=t;function a(n,s){let i=n instanceof Ku.default.Reader?n:Ku.default.Reader.create(n),f=s===void 0?i.len:i.pos+s,u=s_();for(;i.pos>>3){case 1:if(c!==8)break;u.currentState=i.int32();continue}if((c&7)===4||c===0)break;i.skipType(c&7)}return u}e.decode=a})(ka||(ka={}));var By={COMPONENT_ID:1049,serialize(e,t){let a=ka.encode(e),n=new Uint8Array(a.finish(),0,a.len);t.writeBuffer(n,!1)},deserialize(e){return ka.decode(e.buffer(),e.remainingBytes())},create(){return ka.decode(new Uint8Array)},jsonSchema:{type:"object",properties:{},serializationType:"protocol-buffer",protocolBuffer:"PBGltfContainerLoadingState"}};var ro=Ue(Le());var nr=Ue(Le());var zy;(function(e){e[e.TWM_REPEAT=0]="TWM_REPEAT",e[e.TWM_CLAMP=1]="TWM_CLAMP",e[e.TWM_MIRROR=2]="TWM_MIRROR"})(zy||(zy={}));var Uy;(function(e){e[e.TFM_POINT=0]="TFM_POINT",e[e.TFM_BILINEAR=1]="TFM_BILINEAR",e[e.TFM_TRILINEAR=2]="TFM_TRILINEAR"})(Uy||(Uy={}));function c_(){return{src:"",wrapMode:void 0,filterMode:void 0}}var Xu;(function(e){function t(n,s=nr.default.Writer.create()){return n.src!==""&&s.uint32(10).string(n.src),n.wrapMode!==void 0&&s.uint32(16).int32(n.wrapMode),n.filterMode!==void 0&&s.uint32(24).int32(n.filterMode),s}e.encode=t;function a(n,s){let i=n instanceof nr.default.Reader?n:nr.default.Reader.create(n),f=s===void 0?i.len:i.pos+s,u=c_();for(;i.pos>>3){case 1:if(c!==10)break;u.src=i.string();continue;case 2:if(c!==16)break;u.wrapMode=i.int32();continue;case 3:if(c!==24)break;u.filterMode=i.int32();continue}if((c&7)===4||c===0)break;i.skipType(c&7)}return u}e.decode=a})(Xu||(Xu={}));function u_(){return{userId:"",wrapMode:void 0,filterMode:void 0}}var Zu;(function(e){function t(n,s=nr.default.Writer.create()){return n.userId!==""&&s.uint32(10).string(n.userId),n.wrapMode!==void 0&&s.uint32(16).int32(n.wrapMode),n.filterMode!==void 0&&s.uint32(24).int32(n.filterMode),s}e.encode=t;function a(n,s){let i=n instanceof nr.default.Reader?n:nr.default.Reader.create(n),f=s===void 0?i.len:i.pos+s,u=u_();for(;i.pos>>3){case 1:if(c!==10)break;u.userId=i.string();continue;case 2:if(c!==16)break;u.wrapMode=i.int32();continue;case 3:if(c!==24)break;u.filterMode=i.int32();continue}if((c&7)===4||c===0)break;i.skipType(c&7)}return u}e.decode=a})(Zu||(Zu={}));function l_(){return{videoPlayerEntity:0,wrapMode:void 0,filterMode:void 0}}var $u;(function(e){function t(n,s=nr.default.Writer.create()){return n.videoPlayerEntity!==0&&s.uint32(8).uint32(n.videoPlayerEntity),n.wrapMode!==void 0&&s.uint32(16).int32(n.wrapMode),n.filterMode!==void 0&&s.uint32(24).int32(n.filterMode),s}e.encode=t;function a(n,s){let i=n instanceof nr.default.Reader?n:nr.default.Reader.create(n),f=s===void 0?i.len:i.pos+s,u=l_();for(;i.pos>>3){case 1:if(c!==8)break;u.videoPlayerEntity=i.uint32();continue;case 2:if(c!==16)break;u.wrapMode=i.int32();continue;case 3:if(c!==24)break;u.filterMode=i.int32();continue}if((c&7)===4||c===0)break;i.skipType(c&7)}return u}e.decode=a})($u||($u={}));function f_(){return{tex:void 0}}var In;(function(e){function t(n,s=nr.default.Writer.create()){switch(n.tex?.$case){case"texture":Xu.encode(n.tex.texture,s.uint32(10).fork()).ldelim();break;case"avatarTexture":Zu.encode(n.tex.avatarTexture,s.uint32(18).fork()).ldelim();break;case"videoTexture":$u.encode(n.tex.videoTexture,s.uint32(26).fork()).ldelim();break}return s}e.encode=t;function a(n,s){let i=n instanceof nr.default.Reader?n:nr.default.Reader.create(n),f=s===void 0?i.len:i.pos+s,u=f_();for(;i.pos>>3){case 1:if(c!==10)break;u.tex={$case:"texture",texture:Xu.decode(i,i.uint32())};continue;case 2:if(c!==18)break;u.tex={$case:"avatarTexture",avatarTexture:Zu.decode(i,i.uint32())};continue;case 3:if(c!==26)break;u.tex={$case:"videoTexture",videoTexture:$u.decode(i,i.uint32())};continue}if((c&7)===4||c===0)break;i.skipType(c&7)}return u}e.decode=a})(In||(In={}));var Ly;(function(e){e[e.MTM_OPAQUE=0]="MTM_OPAQUE",e[e.MTM_ALPHA_TEST=1]="MTM_ALPHA_TEST",e[e.MTM_ALPHA_BLEND=2]="MTM_ALPHA_BLEND",e[e.MTM_ALPHA_TEST_AND_ALPHA_BLEND=3]="MTM_ALPHA_TEST_AND_ALPHA_BLEND",e[e.MTM_AUTO=4]="MTM_AUTO"})(Ly||(Ly={}));function d_(){return{material:void 0}}var Na;(function(e){function t(n,s=ro.default.Writer.create()){switch(n.material?.$case){case"unlit":el.encode(n.material.unlit,s.uint32(10).fork()).ldelim();break;case"pbr":tl.encode(n.material.pbr,s.uint32(18).fork()).ldelim();break}return s}e.encode=t;function a(n,s){let i=n instanceof ro.default.Reader?n:ro.default.Reader.create(n),f=s===void 0?i.len:i.pos+s,u=d_();for(;i.pos>>3){case 1:if(c!==10)break;u.material={$case:"unlit",unlit:el.decode(i,i.uint32())};continue;case 2:if(c!==18)break;u.material={$case:"pbr",pbr:tl.decode(i,i.uint32())};continue}if((c&7)===4||c===0)break;i.skipType(c&7)}return u}e.decode=a})(Na||(Na={}));function p_(){return{texture:void 0,alphaTest:void 0,castShadows:void 0,diffuseColor:void 0}}var el;(function(e){function t(n,s=ro.default.Writer.create()){return n.texture!==void 0&&In.encode(n.texture,s.uint32(10).fork()).ldelim(),n.alphaTest!==void 0&&s.uint32(21).float(n.alphaTest),n.castShadows!==void 0&&s.uint32(24).bool(n.castShadows),n.diffuseColor!==void 0&&Dt.encode(n.diffuseColor,s.uint32(34).fork()).ldelim(),s}e.encode=t;function a(n,s){let i=n instanceof ro.default.Reader?n:ro.default.Reader.create(n),f=s===void 0?i.len:i.pos+s,u=p_();for(;i.pos>>3){case 1:if(c!==10)break;u.texture=In.decode(i,i.uint32());continue;case 2:if(c!==21)break;u.alphaTest=i.float();continue;case 3:if(c!==24)break;u.castShadows=i.bool();continue;case 4:if(c!==34)break;u.diffuseColor=Dt.decode(i,i.uint32());continue}if((c&7)===4||c===0)break;i.skipType(c&7)}return u}e.decode=a})(el||(el={}));function m_(){return{texture:void 0,alphaTest:void 0,castShadows:void 0,alphaTexture:void 0,emissiveTexture:void 0,bumpTexture:void 0,albedoColor:void 0,emissiveColor:void 0,reflectivityColor:void 0,transparencyMode:void 0,metallic:void 0,roughness:void 0,specularIntensity:void 0,emissiveIntensity:void 0,directIntensity:void 0}}var tl;(function(e){function t(n,s=ro.default.Writer.create()){return n.texture!==void 0&&In.encode(n.texture,s.uint32(10).fork()).ldelim(),n.alphaTest!==void 0&&s.uint32(21).float(n.alphaTest),n.castShadows!==void 0&&s.uint32(24).bool(n.castShadows),n.alphaTexture!==void 0&&In.encode(n.alphaTexture,s.uint32(34).fork()).ldelim(),n.emissiveTexture!==void 0&&In.encode(n.emissiveTexture,s.uint32(42).fork()).ldelim(),n.bumpTexture!==void 0&&In.encode(n.bumpTexture,s.uint32(50).fork()).ldelim(),n.albedoColor!==void 0&&Dt.encode(n.albedoColor,s.uint32(58).fork()).ldelim(),n.emissiveColor!==void 0&&Vt.encode(n.emissiveColor,s.uint32(66).fork()).ldelim(),n.reflectivityColor!==void 0&&Vt.encode(n.reflectivityColor,s.uint32(74).fork()).ldelim(),n.transparencyMode!==void 0&&s.uint32(80).int32(n.transparencyMode),n.metallic!==void 0&&s.uint32(93).float(n.metallic),n.roughness!==void 0&&s.uint32(101).float(n.roughness),n.specularIntensity!==void 0&&s.uint32(117).float(n.specularIntensity),n.emissiveIntensity!==void 0&&s.uint32(125).float(n.emissiveIntensity),n.directIntensity!==void 0&&s.uint32(133).float(n.directIntensity),s}e.encode=t;function a(n,s){let i=n instanceof ro.default.Reader?n:ro.default.Reader.create(n),f=s===void 0?i.len:i.pos+s,u=m_();for(;i.pos>>3){case 1:if(c!==10)break;u.texture=In.decode(i,i.uint32());continue;case 2:if(c!==21)break;u.alphaTest=i.float();continue;case 3:if(c!==24)break;u.castShadows=i.bool();continue;case 4:if(c!==34)break;u.alphaTexture=In.decode(i,i.uint32());continue;case 5:if(c!==42)break;u.emissiveTexture=In.decode(i,i.uint32());continue;case 6:if(c!==50)break;u.bumpTexture=In.decode(i,i.uint32());continue;case 7:if(c!==58)break;u.albedoColor=Dt.decode(i,i.uint32());continue;case 8:if(c!==66)break;u.emissiveColor=Vt.decode(i,i.uint32());continue;case 9:if(c!==74)break;u.reflectivityColor=Vt.decode(i,i.uint32());continue;case 10:if(c!==80)break;u.transparencyMode=i.int32();continue;case 11:if(c!==93)break;u.metallic=i.float();continue;case 12:if(c!==101)break;u.roughness=i.float();continue;case 14:if(c!==117)break;u.specularIntensity=i.float();continue;case 15:if(c!==125)break;u.emissiveIntensity=i.float();continue;case 16:if(c!==133)break;u.directIntensity=i.float();continue}if((c&7)===4||c===0)break;i.skipType(c&7)}return u}e.decode=a})(tl||(tl={}));var Dy={COMPONENT_ID:1017,serialize(e,t){let a=Na.encode(e),n=new Uint8Array(a.finish(),0,a.len);t.writeBuffer(n,!1)},deserialize(e){return Na.decode(e.buffer(),e.remainingBytes())},create(){return Na.decode(new Uint8Array)},jsonSchema:{type:"object",properties:{},serializationType:"protocol-buffer",protocolBuffer:"PBMaterial"}};var Mn=Ue(Le());var tc;(function(e){e[e.CL_NONE=0]="CL_NONE",e[e.CL_POINTER=1]="CL_POINTER",e[e.CL_PHYSICS=2]="CL_PHYSICS",e[e.CL_RESERVED1=4]="CL_RESERVED1",e[e.CL_RESERVED2=8]="CL_RESERVED2",e[e.CL_RESERVED3=16]="CL_RESERVED3",e[e.CL_RESERVED4=32]="CL_RESERVED4",e[e.CL_RESERVED5=64]="CL_RESERVED5",e[e.CL_RESERVED6=128]="CL_RESERVED6",e[e.CL_CUSTOM1=256]="CL_CUSTOM1",e[e.CL_CUSTOM2=512]="CL_CUSTOM2",e[e.CL_CUSTOM3=1024]="CL_CUSTOM3",e[e.CL_CUSTOM4=2048]="CL_CUSTOM4",e[e.CL_CUSTOM5=4096]="CL_CUSTOM5",e[e.CL_CUSTOM6=8192]="CL_CUSTOM6",e[e.CL_CUSTOM7=16384]="CL_CUSTOM7",e[e.CL_CUSTOM8=32768]="CL_CUSTOM8"})(tc||(tc={}));function h_(){return{collisionMask:void 0,mesh:void 0}}var wa;(function(e){function t(n,s=Mn.default.Writer.create()){switch(n.collisionMask!==void 0&&s.uint32(8).uint32(n.collisionMask),n.mesh?.$case){case"box":nl.encode(n.mesh.box,s.uint32(18).fork()).ldelim();break;case"sphere":il.encode(n.mesh.sphere,s.uint32(26).fork()).ldelim();break;case"cylinder":rl.encode(n.mesh.cylinder,s.uint32(34).fork()).ldelim();break;case"plane":ol.encode(n.mesh.plane,s.uint32(42).fork()).ldelim();break}return s}e.encode=t;function a(n,s){let i=n instanceof Mn.default.Reader?n:Mn.default.Reader.create(n),f=s===void 0?i.len:i.pos+s,u=h_();for(;i.pos>>3){case 1:if(c!==8)break;u.collisionMask=i.uint32();continue;case 2:if(c!==18)break;u.mesh={$case:"box",box:nl.decode(i,i.uint32())};continue;case 3:if(c!==26)break;u.mesh={$case:"sphere",sphere:il.decode(i,i.uint32())};continue;case 4:if(c!==34)break;u.mesh={$case:"cylinder",cylinder:rl.decode(i,i.uint32())};continue;case 5:if(c!==42)break;u.mesh={$case:"plane",plane:ol.decode(i,i.uint32())};continue}if((c&7)===4||c===0)break;i.skipType(c&7)}return u}e.decode=a})(wa||(wa={}));function y_(){return{}}var nl;(function(e){function t(n,s=Mn.default.Writer.create()){return s}e.encode=t;function a(n,s){let i=n instanceof Mn.default.Reader?n:Mn.default.Reader.create(n),f=s===void 0?i.len:i.pos+s,u=y_();for(;i.pos>>3){}if((c&7)===4||c===0)break;i.skipType(c&7)}return u}e.decode=a})(nl||(nl={}));function g_(){return{radiusTop:void 0,radiusBottom:void 0}}var rl;(function(e){function t(n,s=Mn.default.Writer.create()){return n.radiusTop!==void 0&&s.uint32(13).float(n.radiusTop),n.radiusBottom!==void 0&&s.uint32(21).float(n.radiusBottom),s}e.encode=t;function a(n,s){let i=n instanceof Mn.default.Reader?n:Mn.default.Reader.create(n),f=s===void 0?i.len:i.pos+s,u=g_();for(;i.pos>>3){case 1:if(c!==13)break;u.radiusTop=i.float();continue;case 2:if(c!==21)break;u.radiusBottom=i.float();continue}if((c&7)===4||c===0)break;i.skipType(c&7)}return u}e.decode=a})(rl||(rl={}));function E_(){return{}}var ol;(function(e){function t(n,s=Mn.default.Writer.create()){return s}e.encode=t;function a(n,s){let i=n instanceof Mn.default.Reader?n:Mn.default.Reader.create(n),f=s===void 0?i.len:i.pos+s,u=E_();for(;i.pos>>3){}if((c&7)===4||c===0)break;i.skipType(c&7)}return u}e.decode=a})(ol||(ol={}));function T_(){return{}}var il;(function(e){function t(n,s=Mn.default.Writer.create()){return s}e.encode=t;function a(n,s){let i=n instanceof Mn.default.Reader?n:Mn.default.Reader.create(n),f=s===void 0?i.len:i.pos+s,u=T_();for(;i.pos>>3){}if((c&7)===4||c===0)break;i.skipType(c&7)}return u}e.decode=a})(il||(il={}));var Fy={COMPONENT_ID:1019,serialize(e,t){let a=wa.encode(e),n=new Uint8Array(a.finish(),0,a.len);t.writeBuffer(n,!1)},deserialize(e){return wa.decode(e.buffer(),e.remainingBytes())},create(){return wa.decode(new Uint8Array)},jsonSchema:{type:"object",properties:{},serializationType:"protocol-buffer",protocolBuffer:"PBMeshCollider"}};var Pn=Ue(Le());function __(){return{mesh:void 0}}var Aa;(function(e){function t(n,s=Pn.default.Writer.create()){switch(n.mesh?.$case){case"box":al.encode(n.mesh.box,s.uint32(10).fork()).ldelim();break;case"sphere":ul.encode(n.mesh.sphere,s.uint32(18).fork()).ldelim();break;case"cylinder":sl.encode(n.mesh.cylinder,s.uint32(26).fork()).ldelim();break;case"plane":cl.encode(n.mesh.plane,s.uint32(34).fork()).ldelim();break}return s}e.encode=t;function a(n,s){let i=n instanceof Pn.default.Reader?n:Pn.default.Reader.create(n),f=s===void 0?i.len:i.pos+s,u=__();for(;i.pos>>3){case 1:if(c!==10)break;u.mesh={$case:"box",box:al.decode(i,i.uint32())};continue;case 2:if(c!==18)break;u.mesh={$case:"sphere",sphere:ul.decode(i,i.uint32())};continue;case 3:if(c!==26)break;u.mesh={$case:"cylinder",cylinder:sl.decode(i,i.uint32())};continue;case 4:if(c!==34)break;u.mesh={$case:"plane",plane:cl.decode(i,i.uint32())};continue}if((c&7)===4||c===0)break;i.skipType(c&7)}return u}e.decode=a})(Aa||(Aa={}));function S_(){return{uvs:[]}}var al;(function(e){function t(n,s=Pn.default.Writer.create()){s.uint32(10).fork();for(let i of n.uvs)s.float(i);return s.ldelim(),s}e.encode=t;function a(n,s){let i=n instanceof Pn.default.Reader?n:Pn.default.Reader.create(n),f=s===void 0?i.len:i.pos+s,u=S_();for(;i.pos>>3){case 1:if(c===13){u.uvs.push(i.float());continue}if(c===10){let h=i.uint32()+i.pos;for(;i.pos>>3){case 1:if(c!==13)break;u.radiusTop=i.float();continue;case 2:if(c!==21)break;u.radiusBottom=i.float();continue}if((c&7)===4||c===0)break;i.skipType(c&7)}return u}e.decode=a})(sl||(sl={}));function b_(){return{uvs:[]}}var cl;(function(e){function t(n,s=Pn.default.Writer.create()){s.uint32(10).fork();for(let i of n.uvs)s.float(i);return s.ldelim(),s}e.encode=t;function a(n,s){let i=n instanceof Pn.default.Reader?n:Pn.default.Reader.create(n),f=s===void 0?i.len:i.pos+s,u=b_();for(;i.pos>>3){case 1:if(c===13){u.uvs.push(i.float());continue}if(c===10){let h=i.uint32()+i.pos;for(;i.pos>>3){}if((c&7)===4||c===0)break;i.skipType(c&7)}return u}e.decode=a})(ul||(ul={}));var jy={COMPONENT_ID:1018,serialize(e,t){let a=Aa.encode(e),n=new Uint8Array(a.finish(),0,a.len);t.writeBuffer(n,!1)},deserialize(e){return Aa.decode(e.buffer(),e.remainingBytes())},create(){return Aa.decode(new Uint8Array)},jsonSchema:{type:"object",properties:{},serializationType:"protocol-buffer",protocolBuffer:"PBMeshRenderer"}};var ll=Ue(Le());var Wy;(function(e){e[e.NFT_CLASSIC=0]="NFT_CLASSIC",e[e.NFT_BAROQUE_ORNAMENT=1]="NFT_BAROQUE_ORNAMENT",e[e.NFT_DIAMOND_ORNAMENT=2]="NFT_DIAMOND_ORNAMENT",e[e.NFT_MINIMAL_WIDE=3]="NFT_MINIMAL_WIDE",e[e.NFT_MINIMAL_GREY=4]="NFT_MINIMAL_GREY",e[e.NFT_BLOCKY=5]="NFT_BLOCKY",e[e.NFT_GOLD_EDGES=6]="NFT_GOLD_EDGES",e[e.NFT_GOLD_CARVED=7]="NFT_GOLD_CARVED",e[e.NFT_GOLD_WIDE=8]="NFT_GOLD_WIDE",e[e.NFT_GOLD_ROUNDED=9]="NFT_GOLD_ROUNDED",e[e.NFT_METAL_MEDIUM=10]="NFT_METAL_MEDIUM",e[e.NFT_METAL_WIDE=11]="NFT_METAL_WIDE",e[e.NFT_METAL_SLIM=12]="NFT_METAL_SLIM",e[e.NFT_METAL_ROUNDED=13]="NFT_METAL_ROUNDED",e[e.NFT_PINS=14]="NFT_PINS",e[e.NFT_MINIMAL_BLACK=15]="NFT_MINIMAL_BLACK",e[e.NFT_MINIMAL_WHITE=16]="NFT_MINIMAL_WHITE",e[e.NFT_TAPE=17]="NFT_TAPE",e[e.NFT_WOOD_SLIM=18]="NFT_WOOD_SLIM",e[e.NFT_WOOD_WIDE=19]="NFT_WOOD_WIDE",e[e.NFT_WOOD_TWIGS=20]="NFT_WOOD_TWIGS",e[e.NFT_CANVAS=21]="NFT_CANVAS",e[e.NFT_NONE=22]="NFT_NONE"})(Wy||(Wy={}));function v_(){return{urn:"",style:void 0,color:void 0}}var Oa;(function(e){function t(n,s=ll.default.Writer.create()){return n.urn!==""&&s.uint32(10).string(n.urn),n.style!==void 0&&s.uint32(16).int32(n.style),n.color!==void 0&&Vt.encode(n.color,s.uint32(26).fork()).ldelim(),s}e.encode=t;function a(n,s){let i=n instanceof ll.default.Reader?n:ll.default.Reader.create(n),f=s===void 0?i.len:i.pos+s,u=v_();for(;i.pos>>3){case 1:if(c!==10)break;u.urn=i.string();continue;case 2:if(c!==16)break;u.style=i.int32();continue;case 3:if(c!==26)break;u.color=Vt.decode(i,i.uint32());continue}if((c&7)===4||c===0)break;i.skipType(c&7)}return u}e.decode=a})(Oa||(Oa={}));var Hy={COMPONENT_ID:1040,serialize(e,t){let a=Oa.encode(e),n=new Uint8Array(a.finish(),0,a.len);t.writeBuffer(n,!1)},deserialize(e){return Oa.decode(e.buffer(),e.remainingBytes())},create(){return Oa.decode(new Uint8Array)},jsonSchema:{type:"object",properties:{},serializationType:"protocol-buffer",protocolBuffer:"PBNftShape"}};var oo=Ue(Le());function k_(){return{pointerEvents:[]}}var Ca;(function(e){function t(n,s=oo.default.Writer.create()){for(let i of n.pointerEvents)dl.encode(i,s.uint32(10).fork()).ldelim();return s}e.encode=t;function a(n,s){let i=n instanceof oo.default.Reader?n:oo.default.Reader.create(n),f=s===void 0?i.len:i.pos+s,u=k_();for(;i.pos>>3){case 1:if(c!==10)break;u.pointerEvents.push(dl.decode(i,i.uint32()));continue}if((c&7)===4||c===0)break;i.skipType(c&7)}return u}e.decode=a})(Ca||(Ca={}));function N_(){return{button:void 0,hoverText:void 0,maxDistance:void 0,showFeedback:void 0}}var fl;(function(e){function t(n,s=oo.default.Writer.create()){return n.button!==void 0&&s.uint32(8).int32(n.button),n.hoverText!==void 0&&s.uint32(18).string(n.hoverText),n.maxDistance!==void 0&&s.uint32(29).float(n.maxDistance),n.showFeedback!==void 0&&s.uint32(32).bool(n.showFeedback),s}e.encode=t;function a(n,s){let i=n instanceof oo.default.Reader?n:oo.default.Reader.create(n),f=s===void 0?i.len:i.pos+s,u=N_();for(;i.pos>>3){case 1:if(c!==8)break;u.button=i.int32();continue;case 2:if(c!==18)break;u.hoverText=i.string();continue;case 3:if(c!==29)break;u.maxDistance=i.float();continue;case 4:if(c!==32)break;u.showFeedback=i.bool();continue}if((c&7)===4||c===0)break;i.skipType(c&7)}return u}e.decode=a})(fl||(fl={}));function w_(){return{eventType:0,eventInfo:void 0}}var dl;(function(e){function t(n,s=oo.default.Writer.create()){return n.eventType!==0&&s.uint32(8).int32(n.eventType),n.eventInfo!==void 0&&fl.encode(n.eventInfo,s.uint32(18).fork()).ldelim(),s}e.encode=t;function a(n,s){let i=n instanceof oo.default.Reader?n:oo.default.Reader.create(n),f=s===void 0?i.len:i.pos+s,u=w_();for(;i.pos>>3){case 1:if(c!==8)break;u.eventType=i.int32();continue;case 2:if(c!==18)break;u.eventInfo=fl.decode(i,i.uint32());continue}if((c&7)===4||c===0)break;i.skipType(c&7)}return u}e.decode=a})(dl||(dl={}));var Vy={COMPONENT_ID:1062,serialize(e,t){let a=Ca.encode(e),n=new Uint8Array(a.finish(),0,a.len);t.writeBuffer(n,!1)},deserialize(e){return Ca.decode(e.buffer(),e.remainingBytes())},create(){return Ca.decode(new Uint8Array)},jsonSchema:{type:"object",properties:{},serializationType:"protocol-buffer",protocolBuffer:"PBPointerEvents"}};var ml=Ue(Le());var pl=Ue(Le());function A_(){return{position:void 0,globalOrigin:void 0,direction:void 0,normalHit:void 0,length:0,meshName:void 0,entityId:void 0}}var ri;(function(e){function t(n,s=pl.default.Writer.create()){return n.position!==void 0&&Qe.encode(n.position,s.uint32(10).fork()).ldelim(),n.globalOrigin!==void 0&&Qe.encode(n.globalOrigin,s.uint32(18).fork()).ldelim(),n.direction!==void 0&&Qe.encode(n.direction,s.uint32(26).fork()).ldelim(),n.normalHit!==void 0&&Qe.encode(n.normalHit,s.uint32(34).fork()).ldelim(),n.length!==0&&s.uint32(45).float(n.length),n.meshName!==void 0&&s.uint32(50).string(n.meshName),n.entityId!==void 0&&s.uint32(56).uint32(n.entityId),s}e.encode=t;function a(n,s){let i=n instanceof pl.default.Reader?n:pl.default.Reader.create(n),f=s===void 0?i.len:i.pos+s,u=A_();for(;i.pos>>3){case 1:if(c!==10)break;u.position=Qe.decode(i,i.uint32());continue;case 2:if(c!==18)break;u.globalOrigin=Qe.decode(i,i.uint32());continue;case 3:if(c!==26)break;u.direction=Qe.decode(i,i.uint32());continue;case 4:if(c!==34)break;u.normalHit=Qe.decode(i,i.uint32());continue;case 5:if(c!==45)break;u.length=i.float();continue;case 6:if(c!==50)break;u.meshName=i.string();continue;case 7:if(c!==56)break;u.entityId=i.uint32();continue}if((c&7)===4||c===0)break;i.skipType(c&7)}return u}e.decode=a})(ri||(ri={}));function O_(){return{button:0,hit:void 0,state:0,timestamp:0,analog:void 0,tickNumber:0}}var Ia;(function(e){function t(n,s=ml.default.Writer.create()){return n.button!==0&&s.uint32(8).int32(n.button),n.hit!==void 0&&ri.encode(n.hit,s.uint32(18).fork()).ldelim(),n.state!==0&&s.uint32(32).int32(n.state),n.timestamp!==0&&s.uint32(40).uint32(n.timestamp),n.analog!==void 0&&s.uint32(53).float(n.analog),n.tickNumber!==0&&s.uint32(56).uint32(n.tickNumber),s}e.encode=t;function a(n,s){let i=n instanceof ml.default.Reader?n:ml.default.Reader.create(n),f=s===void 0?i.len:i.pos+s,u=O_();for(;i.pos>>3){case 1:if(c!==8)break;u.button=i.int32();continue;case 2:if(c!==18)break;u.hit=ri.decode(i,i.uint32());continue;case 4:if(c!==32)break;u.state=i.int32();continue;case 5:if(c!==40)break;u.timestamp=i.uint32();continue;case 6:if(c!==53)break;u.analog=i.float();continue;case 7:if(c!==56)break;u.tickNumber=i.uint32();continue}if((c&7)===4||c===0)break;i.skipType(c&7)}return u}e.decode=a})(Ia||(Ia={}));var Gy={COMPONENT_ID:1063,serialize(e,t){let a=Ia.encode(e),n=new Uint8Array(a.finish(),0,a.len);t.writeBuffer(n,!1)},deserialize(e){return Ia.decode(e.buffer(),e.remainingBytes())},create(){return Ia.decode(new Uint8Array)},jsonSchema:{type:"object",properties:{},serializationType:"protocol-buffer",protocolBuffer:"PBPointerEventsResult"}};var hl=Ue(Le());function C_(){return{isPointerLocked:!1}}var Ma;(function(e){function t(n,s=hl.default.Writer.create()){return n.isPointerLocked===!0&&s.uint32(8).bool(n.isPointerLocked),s}e.encode=t;function a(n,s){let i=n instanceof hl.default.Reader?n:hl.default.Reader.create(n),f=s===void 0?i.len:i.pos+s,u=C_();for(;i.pos>>3){case 1:if(c!==8)break;u.isPointerLocked=i.bool();continue}if((c&7)===4||c===0)break;i.skipType(c&7)}return u}e.decode=a})(Ma||(Ma={}));var Yy={COMPONENT_ID:1074,serialize(e,t){let a=Ma.encode(e),n=new Uint8Array(a.finish(),0,a.len);t.writeBuffer(n,!1)},deserialize(e){return Ma.decode(e.buffer(),e.remainingBytes())},create(){return Ma.decode(new Uint8Array)},jsonSchema:{type:"object",properties:{},serializationType:"protocol-buffer",protocolBuffer:"PBPointerLock"}};var yl=Ue(Le());var qy;(function(e){e[e.RQT_HIT_FIRST=0]="RQT_HIT_FIRST",e[e.RQT_QUERY_ALL=1]="RQT_QUERY_ALL",e[e.RQT_NONE=2]="RQT_NONE"})(qy||(qy={}));function I_(){return{timestamp:void 0,originOffset:void 0,direction:void 0,maxDistance:0,queryType:0,continuous:void 0,collisionMask:void 0}}var Pa;(function(e){function t(n,s=yl.default.Writer.create()){switch(n.timestamp!==void 0&&s.uint32(8).uint32(n.timestamp),n.originOffset!==void 0&&Qe.encode(n.originOffset,s.uint32(18).fork()).ldelim(),n.direction?.$case){case"localDirection":Qe.encode(n.direction.localDirection,s.uint32(50).fork()).ldelim();break;case"globalDirection":Qe.encode(n.direction.globalDirection,s.uint32(26).fork()).ldelim();break;case"globalTarget":Qe.encode(n.direction.globalTarget,s.uint32(58).fork()).ldelim();break;case"targetEntity":s.uint32(80).uint32(n.direction.targetEntity);break}return n.maxDistance!==0&&s.uint32(37).float(n.maxDistance),n.queryType!==0&&s.uint32(40).int32(n.queryType),n.continuous!==void 0&&s.uint32(64).bool(n.continuous),n.collisionMask!==void 0&&s.uint32(72).uint32(n.collisionMask),s}e.encode=t;function a(n,s){let i=n instanceof yl.default.Reader?n:yl.default.Reader.create(n),f=s===void 0?i.len:i.pos+s,u=I_();for(;i.pos>>3){case 1:if(c!==8)break;u.timestamp=i.uint32();continue;case 2:if(c!==18)break;u.originOffset=Qe.decode(i,i.uint32());continue;case 6:if(c!==50)break;u.direction={$case:"localDirection",localDirection:Qe.decode(i,i.uint32())};continue;case 3:if(c!==26)break;u.direction={$case:"globalDirection",globalDirection:Qe.decode(i,i.uint32())};continue;case 7:if(c!==58)break;u.direction={$case:"globalTarget",globalTarget:Qe.decode(i,i.uint32())};continue;case 10:if(c!==80)break;u.direction={$case:"targetEntity",targetEntity:i.uint32()};continue;case 4:if(c!==37)break;u.maxDistance=i.float();continue;case 5:if(c!==40)break;u.queryType=i.int32();continue;case 8:if(c!==64)break;u.continuous=i.bool();continue;case 9:if(c!==72)break;u.collisionMask=i.uint32();continue}if((c&7)===4||c===0)break;i.skipType(c&7)}return u}e.decode=a})(Pa||(Pa={}));var Qy={COMPONENT_ID:1067,serialize(e,t){let a=Pa.encode(e),n=new Uint8Array(a.finish(),0,a.len);t.writeBuffer(n,!1)},deserialize(e){return Pa.decode(e.buffer(),e.remainingBytes())},create(){return Pa.decode(new Uint8Array)},jsonSchema:{type:"object",properties:{},serializationType:"protocol-buffer",protocolBuffer:"PBRaycast"}};var gl=Ue(Le());function M_(){return{timestamp:void 0,globalOrigin:void 0,direction:void 0,hits:[],tickNumber:0}}var Ba;(function(e){function t(n,s=gl.default.Writer.create()){n.timestamp!==void 0&&s.uint32(8).uint32(n.timestamp),n.globalOrigin!==void 0&&Qe.encode(n.globalOrigin,s.uint32(18).fork()).ldelim(),n.direction!==void 0&&Qe.encode(n.direction,s.uint32(26).fork()).ldelim();for(let i of n.hits)ri.encode(i,s.uint32(34).fork()).ldelim();return n.tickNumber!==0&&s.uint32(40).uint32(n.tickNumber),s}e.encode=t;function a(n,s){let i=n instanceof gl.default.Reader?n:gl.default.Reader.create(n),f=s===void 0?i.len:i.pos+s,u=M_();for(;i.pos>>3){case 1:if(c!==8)break;u.timestamp=i.uint32();continue;case 2:if(c!==18)break;u.globalOrigin=Qe.decode(i,i.uint32());continue;case 3:if(c!==26)break;u.direction=Qe.decode(i,i.uint32());continue;case 4:if(c!==34)break;u.hits.push(ri.decode(i,i.uint32()));continue;case 5:if(c!==40)break;u.tickNumber=i.uint32();continue}if((c&7)===4||c===0)break;i.skipType(c&7)}return u}e.decode=a})(Ba||(Ba={}));var Jy={COMPONENT_ID:1068,serialize(e,t){let a=Ba.encode(e),n=new Uint8Array(a.finish(),0,a.len);t.writeBuffer(n,!1)},deserialize(e){return Ba.decode(e.buffer(),e.remainingBytes())},create(){return Ba.decode(new Uint8Array)},jsonSchema:{type:"object",properties:{},serializationType:"protocol-buffer",protocolBuffer:"PBRaycastResult"}};var El=Ue(Le());function P_(){return{text:"",font:void 0,fontSize:void 0,fontAutoSize:void 0,textAlign:void 0,width:void 0,height:void 0,paddingTop:void 0,paddingRight:void 0,paddingBottom:void 0,paddingLeft:void 0,lineSpacing:void 0,lineCount:void 0,textWrapping:void 0,shadowBlur:void 0,shadowOffsetX:void 0,shadowOffsetY:void 0,outlineWidth:void 0,shadowColor:void 0,outlineColor:void 0,textColor:void 0}}var za;(function(e){function t(n,s=El.default.Writer.create()){return n.text!==""&&s.uint32(10).string(n.text),n.font!==void 0&&s.uint32(16).int32(n.font),n.fontSize!==void 0&&s.uint32(29).float(n.fontSize),n.fontAutoSize!==void 0&&s.uint32(32).bool(n.fontAutoSize),n.textAlign!==void 0&&s.uint32(40).int32(n.textAlign),n.width!==void 0&&s.uint32(53).float(n.width),n.height!==void 0&&s.uint32(61).float(n.height),n.paddingTop!==void 0&&s.uint32(69).float(n.paddingTop),n.paddingRight!==void 0&&s.uint32(77).float(n.paddingRight),n.paddingBottom!==void 0&&s.uint32(85).float(n.paddingBottom),n.paddingLeft!==void 0&&s.uint32(93).float(n.paddingLeft),n.lineSpacing!==void 0&&s.uint32(101).float(n.lineSpacing),n.lineCount!==void 0&&s.uint32(104).int32(n.lineCount),n.textWrapping!==void 0&&s.uint32(112).bool(n.textWrapping),n.shadowBlur!==void 0&&s.uint32(125).float(n.shadowBlur),n.shadowOffsetX!==void 0&&s.uint32(133).float(n.shadowOffsetX),n.shadowOffsetY!==void 0&&s.uint32(141).float(n.shadowOffsetY),n.outlineWidth!==void 0&&s.uint32(149).float(n.outlineWidth),n.shadowColor!==void 0&&Vt.encode(n.shadowColor,s.uint32(154).fork()).ldelim(),n.outlineColor!==void 0&&Vt.encode(n.outlineColor,s.uint32(162).fork()).ldelim(),n.textColor!==void 0&&Dt.encode(n.textColor,s.uint32(170).fork()).ldelim(),s}e.encode=t;function a(n,s){let i=n instanceof El.default.Reader?n:El.default.Reader.create(n),f=s===void 0?i.len:i.pos+s,u=P_();for(;i.pos>>3){case 1:if(c!==10)break;u.text=i.string();continue;case 2:if(c!==16)break;u.font=i.int32();continue;case 3:if(c!==29)break;u.fontSize=i.float();continue;case 4:if(c!==32)break;u.fontAutoSize=i.bool();continue;case 5:if(c!==40)break;u.textAlign=i.int32();continue;case 6:if(c!==53)break;u.width=i.float();continue;case 7:if(c!==61)break;u.height=i.float();continue;case 8:if(c!==69)break;u.paddingTop=i.float();continue;case 9:if(c!==77)break;u.paddingRight=i.float();continue;case 10:if(c!==85)break;u.paddingBottom=i.float();continue;case 11:if(c!==93)break;u.paddingLeft=i.float();continue;case 12:if(c!==101)break;u.lineSpacing=i.float();continue;case 13:if(c!==104)break;u.lineCount=i.int32();continue;case 14:if(c!==112)break;u.textWrapping=i.bool();continue;case 15:if(c!==125)break;u.shadowBlur=i.float();continue;case 16:if(c!==133)break;u.shadowOffsetX=i.float();continue;case 17:if(c!==141)break;u.shadowOffsetY=i.float();continue;case 18:if(c!==149)break;u.outlineWidth=i.float();continue;case 19:if(c!==154)break;u.shadowColor=Vt.decode(i,i.uint32());continue;case 20:if(c!==162)break;u.outlineColor=Vt.decode(i,i.uint32());continue;case 21:if(c!==170)break;u.textColor=Dt.decode(i,i.uint32());continue}if((c&7)===4||c===0)break;i.skipType(c&7)}return u}e.decode=a})(za||(za={}));var Ky={COMPONENT_ID:1030,serialize(e,t){let a=za.encode(e),n=new Uint8Array(a.finish(),0,a.len);t.writeBuffer(n,!1)},deserialize(e){return za.decode(e.buffer(),e.remainingBytes())},create(){return za.decode(new Uint8Array)},jsonSchema:{type:"object",properties:{},serializationType:"protocol-buffer",protocolBuffer:"PBTextShape"}};var rr=Ue(Le());var Tl;(function(e){e[e.EF_LINEAR=0]="EF_LINEAR",e[e.EF_EASEINQUAD=1]="EF_EASEINQUAD",e[e.EF_EASEOUTQUAD=2]="EF_EASEOUTQUAD",e[e.EF_EASEQUAD=3]="EF_EASEQUAD",e[e.EF_EASEINSINE=4]="EF_EASEINSINE",e[e.EF_EASEOUTSINE=5]="EF_EASEOUTSINE",e[e.EF_EASESINE=6]="EF_EASESINE",e[e.EF_EASEINEXPO=7]="EF_EASEINEXPO",e[e.EF_EASEOUTEXPO=8]="EF_EASEOUTEXPO",e[e.EF_EASEEXPO=9]="EF_EASEEXPO",e[e.EF_EASEINELASTIC=10]="EF_EASEINELASTIC",e[e.EF_EASEOUTELASTIC=11]="EF_EASEOUTELASTIC",e[e.EF_EASEELASTIC=12]="EF_EASEELASTIC",e[e.EF_EASEINBOUNCE=13]="EF_EASEINBOUNCE",e[e.EF_EASEOUTBOUNCE=14]="EF_EASEOUTBOUNCE",e[e.EF_EASEBOUNCE=15]="EF_EASEBOUNCE",e[e.EF_EASEINCUBIC=16]="EF_EASEINCUBIC",e[e.EF_EASEOUTCUBIC=17]="EF_EASEOUTCUBIC",e[e.EF_EASECUBIC=18]="EF_EASECUBIC",e[e.EF_EASEINQUART=19]="EF_EASEINQUART",e[e.EF_EASEOUTQUART=20]="EF_EASEOUTQUART",e[e.EF_EASEQUART=21]="EF_EASEQUART",e[e.EF_EASEINQUINT=22]="EF_EASEINQUINT",e[e.EF_EASEOUTQUINT=23]="EF_EASEOUTQUINT",e[e.EF_EASEQUINT=24]="EF_EASEQUINT",e[e.EF_EASEINCIRC=25]="EF_EASEINCIRC",e[e.EF_EASEOUTCIRC=26]="EF_EASEOUTCIRC",e[e.EF_EASECIRC=27]="EF_EASECIRC",e[e.EF_EASEINBACK=28]="EF_EASEINBACK",e[e.EF_EASEOUTBACK=29]="EF_EASEOUTBACK",e[e.EF_EASEBACK=30]="EF_EASEBACK"})(Tl||(Tl={}));function B_(){return{duration:0,easingFunction:0,mode:void 0,playing:void 0,currentTime:void 0}}var Oo;(function(e){function t(n,s=rr.default.Writer.create()){switch(n.duration!==0&&s.uint32(13).float(n.duration),n.easingFunction!==0&&s.uint32(16).int32(n.easingFunction),n.mode?.$case){case"move":_l.encode(n.mode.move,s.uint32(26).fork()).ldelim();break;case"rotate":Sl.encode(n.mode.rotate,s.uint32(34).fork()).ldelim();break;case"scale":xl.encode(n.mode.scale,s.uint32(42).fork()).ldelim();break}return n.playing!==void 0&&s.uint32(48).bool(n.playing),n.currentTime!==void 0&&s.uint32(61).float(n.currentTime),s}e.encode=t;function a(n,s){let i=n instanceof rr.default.Reader?n:rr.default.Reader.create(n),f=s===void 0?i.len:i.pos+s,u=B_();for(;i.pos>>3){case 1:if(c!==13)break;u.duration=i.float();continue;case 2:if(c!==16)break;u.easingFunction=i.int32();continue;case 3:if(c!==26)break;u.mode={$case:"move",move:_l.decode(i,i.uint32())};continue;case 4:if(c!==34)break;u.mode={$case:"rotate",rotate:Sl.decode(i,i.uint32())};continue;case 5:if(c!==42)break;u.mode={$case:"scale",scale:xl.decode(i,i.uint32())};continue;case 6:if(c!==48)break;u.playing=i.bool();continue;case 7:if(c!==61)break;u.currentTime=i.float();continue}if((c&7)===4||c===0)break;i.skipType(c&7)}return u}e.decode=a})(Oo||(Oo={}));function z_(){return{start:void 0,end:void 0,faceDirection:void 0}}var _l;(function(e){function t(n,s=rr.default.Writer.create()){return n.start!==void 0&&Qe.encode(n.start,s.uint32(10).fork()).ldelim(),n.end!==void 0&&Qe.encode(n.end,s.uint32(18).fork()).ldelim(),n.faceDirection!==void 0&&s.uint32(24).bool(n.faceDirection),s}e.encode=t;function a(n,s){let i=n instanceof rr.default.Reader?n:rr.default.Reader.create(n),f=s===void 0?i.len:i.pos+s,u=z_();for(;i.pos>>3){case 1:if(c!==10)break;u.start=Qe.decode(i,i.uint32());continue;case 2:if(c!==18)break;u.end=Qe.decode(i,i.uint32());continue;case 3:if(c!==24)break;u.faceDirection=i.bool();continue}if((c&7)===4||c===0)break;i.skipType(c&7)}return u}e.decode=a})(_l||(_l={}));function U_(){return{start:void 0,end:void 0}}var Sl;(function(e){function t(n,s=rr.default.Writer.create()){return n.start!==void 0&&Mi.encode(n.start,s.uint32(10).fork()).ldelim(),n.end!==void 0&&Mi.encode(n.end,s.uint32(18).fork()).ldelim(),s}e.encode=t;function a(n,s){let i=n instanceof rr.default.Reader?n:rr.default.Reader.create(n),f=s===void 0?i.len:i.pos+s,u=U_();for(;i.pos>>3){case 1:if(c!==10)break;u.start=Mi.decode(i,i.uint32());continue;case 2:if(c!==18)break;u.end=Mi.decode(i,i.uint32());continue}if((c&7)===4||c===0)break;i.skipType(c&7)}return u}e.decode=a})(Sl||(Sl={}));function L_(){return{start:void 0,end:void 0}}var xl;(function(e){function t(n,s=rr.default.Writer.create()){return n.start!==void 0&&Qe.encode(n.start,s.uint32(10).fork()).ldelim(),n.end!==void 0&&Qe.encode(n.end,s.uint32(18).fork()).ldelim(),s}e.encode=t;function a(n,s){let i=n instanceof rr.default.Reader?n:rr.default.Reader.create(n),f=s===void 0?i.len:i.pos+s,u=L_();for(;i.pos>>3){case 1:if(c!==10)break;u.start=Qe.decode(i,i.uint32());continue;case 2:if(c!==18)break;u.end=Qe.decode(i,i.uint32());continue}if((c&7)===4||c===0)break;i.skipType(c&7)}return u}e.decode=a})(xl||(xl={}));var Xy={COMPONENT_ID:1102,serialize(e,t){let a=Oo.encode(e),n=new Uint8Array(a.finish(),0,a.len);t.writeBuffer(n,!1)},deserialize(e){return Oo.decode(e.buffer(),e.remainingBytes())},create(){return Oo.decode(new Uint8Array)},jsonSchema:{type:"object",properties:{},serializationType:"protocol-buffer",protocolBuffer:"PBTween"}};var bl=Ue(Le());var Zy;(function(e){e[e.TL_RESTART=0]="TL_RESTART",e[e.TL_YOYO=1]="TL_YOYO"})(Zy||(Zy={}));function D_(){return{sequence:[],loop:void 0}}var Ua;(function(e){function t(n,s=bl.default.Writer.create()){for(let i of n.sequence)Oo.encode(i,s.uint32(10).fork()).ldelim();return n.loop!==void 0&&s.uint32(16).int32(n.loop),s}e.encode=t;function a(n,s){let i=n instanceof bl.default.Reader?n:bl.default.Reader.create(n),f=s===void 0?i.len:i.pos+s,u=D_();for(;i.pos>>3){case 1:if(c!==10)break;u.sequence.push(Oo.decode(i,i.uint32()));continue;case 2:if(c!==16)break;u.loop=i.int32();continue}if((c&7)===4||c===0)break;i.skipType(c&7)}return u}e.decode=a})(Ua||(Ua={}));var $y={COMPONENT_ID:1104,serialize(e,t){let a=Ua.encode(e),n=new Uint8Array(a.finish(),0,a.len);t.writeBuffer(n,!1)},deserialize(e){return Ua.decode(e.buffer(),e.remainingBytes())},create(){return Ua.decode(new Uint8Array)},jsonSchema:{type:"object",properties:{},serializationType:"protocol-buffer",protocolBuffer:"PBTweenSequence"}};var Rl=Ue(Le());var e1;(function(e){e[e.TS_ACTIVE=0]="TS_ACTIVE",e[e.TS_COMPLETED=1]="TS_COMPLETED",e[e.TS_PAUSED=2]="TS_PAUSED"})(e1||(e1={}));function F_(){return{state:0,currentTime:0}}var La;(function(e){function t(n,s=Rl.default.Writer.create()){return n.state!==0&&s.uint32(8).int32(n.state),n.currentTime!==0&&s.uint32(21).float(n.currentTime),s}e.encode=t;function a(n,s){let i=n instanceof Rl.default.Reader?n:Rl.default.Reader.create(n),f=s===void 0?i.len:i.pos+s,u=F_();for(;i.pos>>3){case 1:if(c!==8)break;u.state=i.int32();continue;case 2:if(c!==21)break;u.currentTime=i.float();continue}if((c&7)===4||c===0)break;i.skipType(c&7)}return u}e.decode=a})(La||(La={}));var t1={COMPONENT_ID:1103,serialize(e,t){let a=La.encode(e),n=new Uint8Array(a.finish(),0,a.len);t.writeBuffer(n,!1)},deserialize(e){return La.decode(e.buffer(),e.remainingBytes())},create(){return La.decode(new Uint8Array)},jsonSchema:{type:"object",properties:{},serializationType:"protocol-buffer",protocolBuffer:"PBTweenState"}};var vl=Ue(Le());var Ui=Ue(Le());function j_(){return{top:0,left:0,right:0,bottom:0}}var oi;(function(e){function t(n,s=Ui.default.Writer.create()){return n.top!==0&&s.uint32(13).float(n.top),n.left!==0&&s.uint32(21).float(n.left),n.right!==0&&s.uint32(29).float(n.right),n.bottom!==0&&s.uint32(37).float(n.bottom),s}e.encode=t;function a(n,s){let i=n instanceof Ui.default.Reader?n:Ui.default.Reader.create(n),f=s===void 0?i.len:i.pos+s,u=j_();for(;i.pos>>3){case 1:if(c!==13)break;u.top=i.float();continue;case 2:if(c!==21)break;u.left=i.float();continue;case 3:if(c!==29)break;u.right=i.float();continue;case 4:if(c!==37)break;u.bottom=i.float();continue}if((c&7)===4||c===0)break;i.skipType(c&7)}return u}e.decode=a})(oi||(oi={}));function W_(){return{x:0,y:0,width:0,height:0}}var n1;(function(e){function t(n,s=Ui.default.Writer.create()){return n.x!==0&&s.uint32(13).float(n.x),n.y!==0&&s.uint32(21).float(n.y),n.width!==0&&s.uint32(29).float(n.width),n.height!==0&&s.uint32(37).float(n.height),s}e.encode=t;function a(n,s){let i=n instanceof Ui.default.Reader?n:Ui.default.Reader.create(n),f=s===void 0?i.len:i.pos+s,u=W_();for(;i.pos>>3){case 1:if(c!==13)break;u.x=i.float();continue;case 2:if(c!==21)break;u.y=i.float();continue;case 3:if(c!==29)break;u.width=i.float();continue;case 4:if(c!==37)break;u.height=i.float();continue}if((c&7)===4||c===0)break;i.skipType(c&7)}return u}e.decode=a})(n1||(n1={}));var r1;(function(e){e[e.NINE_SLICES=0]="NINE_SLICES",e[e.CENTER=1]="CENTER",e[e.STRETCH=2]="STRETCH"})(r1||(r1={}));function H_(){return{color:void 0,texture:void 0,textureMode:0,textureSlices:void 0,uvs:[]}}var Da;(function(e){function t(n,s=vl.default.Writer.create()){n.color!==void 0&&Dt.encode(n.color,s.uint32(10).fork()).ldelim(),n.texture!==void 0&&In.encode(n.texture,s.uint32(18).fork()).ldelim(),n.textureMode!==0&&s.uint32(24).int32(n.textureMode),n.textureSlices!==void 0&&oi.encode(n.textureSlices,s.uint32(34).fork()).ldelim(),s.uint32(42).fork();for(let i of n.uvs)s.float(i);return s.ldelim(),s}e.encode=t;function a(n,s){let i=n instanceof vl.default.Reader?n:vl.default.Reader.create(n),f=s===void 0?i.len:i.pos+s,u=H_();for(;i.pos>>3){case 1:if(c!==10)break;u.color=Dt.decode(i,i.uint32());continue;case 2:if(c!==18)break;u.texture=In.decode(i,i.uint32());continue;case 3:if(c!==24)break;u.textureMode=i.int32();continue;case 4:if(c!==34)break;u.textureSlices=oi.decode(i,i.uint32());continue;case 5:if(c===45){u.uvs.push(i.float());continue}if(c===42){let h=i.uint32()+i.pos;for(;i.pos>>3){case 1:if(c!==13)break;u.devicePixelRatio=i.float();continue;case 2:if(c!==16)break;u.width=i.int32();continue;case 3:if(c!==24)break;u.height=i.int32();continue;case 4:if(c!==34)break;u.interactableArea=oi.decode(i,i.uint32());continue}if((c&7)===4||c===0)break;i.skipType(c&7)}return u}e.decode=a})(Fa||(Fa={}));var i1={COMPONENT_ID:1054,serialize(e,t){let a=Fa.encode(e),n=new Uint8Array(a.finish(),0,a.len);t.writeBuffer(n,!1)},deserialize(e){return Fa.decode(e.buffer(),e.remainingBytes())},create(){return Fa.decode(new Uint8Array)},jsonSchema:{type:"object",properties:{},serializationType:"protocol-buffer",protocolBuffer:"PBUiCanvasInformation"}};var Nl=Ue(Le());function G_(){return{acceptEmpty:!1,emptyLabel:void 0,options:[],selectedIndex:void 0,disabled:!1,color:void 0,textAlign:void 0,font:void 0,fontSize:void 0}}var ja;(function(e){function t(n,s=Nl.default.Writer.create()){n.acceptEmpty===!0&&s.uint32(8).bool(n.acceptEmpty),n.emptyLabel!==void 0&&s.uint32(18).string(n.emptyLabel);for(let i of n.options)s.uint32(26).string(i);return n.selectedIndex!==void 0&&s.uint32(32).int32(n.selectedIndex),n.disabled===!0&&s.uint32(40).bool(n.disabled),n.color!==void 0&&Dt.encode(n.color,s.uint32(50).fork()).ldelim(),n.textAlign!==void 0&&s.uint32(80).int32(n.textAlign),n.font!==void 0&&s.uint32(88).int32(n.font),n.fontSize!==void 0&&s.uint32(96).int32(n.fontSize),s}e.encode=t;function a(n,s){let i=n instanceof Nl.default.Reader?n:Nl.default.Reader.create(n),f=s===void 0?i.len:i.pos+s,u=G_();for(;i.pos>>3){case 1:if(c!==8)break;u.acceptEmpty=i.bool();continue;case 2:if(c!==18)break;u.emptyLabel=i.string();continue;case 3:if(c!==26)break;u.options.push(i.string());continue;case 4:if(c!==32)break;u.selectedIndex=i.int32();continue;case 5:if(c!==40)break;u.disabled=i.bool();continue;case 6:if(c!==50)break;u.color=Dt.decode(i,i.uint32());continue;case 10:if(c!==80)break;u.textAlign=i.int32();continue;case 11:if(c!==88)break;u.font=i.int32();continue;case 12:if(c!==96)break;u.fontSize=i.int32();continue}if((c&7)===4||c===0)break;i.skipType(c&7)}return u}e.decode=a})(ja||(ja={}));var a1={COMPONENT_ID:1094,serialize(e,t){let a=ja.encode(e),n=new Uint8Array(a.finish(),0,a.len);t.writeBuffer(n,!1)},deserialize(e){return ja.decode(e.buffer(),e.remainingBytes())},create(){return ja.decode(new Uint8Array)},jsonSchema:{type:"object",properties:{},serializationType:"protocol-buffer",protocolBuffer:"PBUiDropdown"}};var wl=Ue(Le());function Y_(){return{value:0}}var Wa;(function(e){function t(n,s=wl.default.Writer.create()){return n.value!==0&&s.uint32(8).int32(n.value),s}e.encode=t;function a(n,s){let i=n instanceof wl.default.Reader?n:wl.default.Reader.create(n),f=s===void 0?i.len:i.pos+s,u=Y_();for(;i.pos>>3){case 1:if(c!==8)break;u.value=i.int32();continue}if((c&7)===4||c===0)break;i.skipType(c&7)}return u}e.decode=a})(Wa||(Wa={}));var s1={COMPONENT_ID:1096,serialize(e,t){let a=Wa.encode(e),n=new Uint8Array(a.finish(),0,a.len);t.writeBuffer(n,!1)},deserialize(e){return Wa.decode(e.buffer(),e.remainingBytes())},create(){return Wa.decode(new Uint8Array)},jsonSchema:{type:"object",properties:{},serializationType:"protocol-buffer",protocolBuffer:"PBUiDropdownResult"}};var Al=Ue(Le());function q_(){return{placeholder:"",color:void 0,placeholderColor:void 0,disabled:!1,textAlign:void 0,font:void 0,fontSize:void 0,value:void 0}}var Ha;(function(e){function t(n,s=Al.default.Writer.create()){return n.placeholder!==""&&s.uint32(10).string(n.placeholder),n.color!==void 0&&Dt.encode(n.color,s.uint32(18).fork()).ldelim(),n.placeholderColor!==void 0&&Dt.encode(n.placeholderColor,s.uint32(26).fork()).ldelim(),n.disabled===!0&&s.uint32(32).bool(n.disabled),n.textAlign!==void 0&&s.uint32(80).int32(n.textAlign),n.font!==void 0&&s.uint32(88).int32(n.font),n.fontSize!==void 0&&s.uint32(96).int32(n.fontSize),n.value!==void 0&&s.uint32(106).string(n.value),s}e.encode=t;function a(n,s){let i=n instanceof Al.default.Reader?n:Al.default.Reader.create(n),f=s===void 0?i.len:i.pos+s,u=q_();for(;i.pos>>3){case 1:if(c!==10)break;u.placeholder=i.string();continue;case 2:if(c!==18)break;u.color=Dt.decode(i,i.uint32());continue;case 3:if(c!==26)break;u.placeholderColor=Dt.decode(i,i.uint32());continue;case 4:if(c!==32)break;u.disabled=i.bool();continue;case 10:if(c!==80)break;u.textAlign=i.int32();continue;case 11:if(c!==88)break;u.font=i.int32();continue;case 12:if(c!==96)break;u.fontSize=i.int32();continue;case 13:if(c!==106)break;u.value=i.string();continue}if((c&7)===4||c===0)break;i.skipType(c&7)}return u}e.decode=a})(Ha||(Ha={}));var c1={COMPONENT_ID:1093,serialize(e,t){let a=Ha.encode(e),n=new Uint8Array(a.finish(),0,a.len);t.writeBuffer(n,!1)},deserialize(e){return Ha.decode(e.buffer(),e.remainingBytes())},create(){return Ha.decode(new Uint8Array)},jsonSchema:{type:"object",properties:{},serializationType:"protocol-buffer",protocolBuffer:"PBUiInput"}};var Ol=Ue(Le());function Q_(){return{value:"",isSubmit:void 0}}var Va;(function(e){function t(n,s=Ol.default.Writer.create()){return n.value!==""&&s.uint32(10).string(n.value),n.isSubmit!==void 0&&s.uint32(16).bool(n.isSubmit),s}e.encode=t;function a(n,s){let i=n instanceof Ol.default.Reader?n:Ol.default.Reader.create(n),f=s===void 0?i.len:i.pos+s,u=Q_();for(;i.pos>>3){case 1:if(c!==10)break;u.value=i.string();continue;case 2:if(c!==16)break;u.isSubmit=i.bool();continue}if((c&7)===4||c===0)break;i.skipType(c&7)}return u}e.decode=a})(Va||(Va={}));var u1={COMPONENT_ID:1095,serialize(e,t){let a=Va.encode(e),n=new Uint8Array(a.finish(),0,a.len);t.writeBuffer(n,!1)},deserialize(e){return Va.decode(e.buffer(),e.remainingBytes())},create(){return Va.decode(new Uint8Array)},jsonSchema:{type:"object",properties:{},serializationType:"protocol-buffer",protocolBuffer:"PBUiInputResult"}};var Cl=Ue(Le());function J_(){return{value:"",color:void 0,textAlign:void 0,font:void 0,fontSize:void 0}}var Ga;(function(e){function t(n,s=Cl.default.Writer.create()){return n.value!==""&&s.uint32(10).string(n.value),n.color!==void 0&&Dt.encode(n.color,s.uint32(18).fork()).ldelim(),n.textAlign!==void 0&&s.uint32(24).int32(n.textAlign),n.font!==void 0&&s.uint32(32).int32(n.font),n.fontSize!==void 0&&s.uint32(40).int32(n.fontSize),s}e.encode=t;function a(n,s){let i=n instanceof Cl.default.Reader?n:Cl.default.Reader.create(n),f=s===void 0?i.len:i.pos+s,u=J_();for(;i.pos>>3){case 1:if(c!==10)break;u.value=i.string();continue;case 2:if(c!==18)break;u.color=Dt.decode(i,i.uint32());continue;case 3:if(c!==24)break;u.textAlign=i.int32();continue;case 4:if(c!==32)break;u.font=i.int32();continue;case 5:if(c!==40)break;u.fontSize=i.int32();continue}if((c&7)===4||c===0)break;i.skipType(c&7)}return u}e.decode=a})(Ga||(Ga={}));var l1={COMPONENT_ID:1052,serialize(e,t){let a=Ga.encode(e),n=new Uint8Array(a.finish(),0,a.len);t.writeBuffer(n,!1)},deserialize(e){return Ga.decode(e.buffer(),e.remainingBytes())},create(){return Ga.decode(new Uint8Array)},jsonSchema:{type:"object",properties:{},serializationType:"protocol-buffer",protocolBuffer:"PBUiText"}};var Il=Ue(Le());var f1;(function(e){e[e.YGPT_RELATIVE=0]="YGPT_RELATIVE",e[e.YGPT_ABSOLUTE=1]="YGPT_ABSOLUTE"})(f1||(f1={}));var d1;(function(e){e[e.YGA_AUTO=0]="YGA_AUTO",e[e.YGA_FLEX_START=1]="YGA_FLEX_START",e[e.YGA_CENTER=2]="YGA_CENTER",e[e.YGA_FLEX_END=3]="YGA_FLEX_END",e[e.YGA_STRETCH=4]="YGA_STRETCH",e[e.YGA_BASELINE=5]="YGA_BASELINE",e[e.YGA_SPACE_BETWEEN=6]="YGA_SPACE_BETWEEN",e[e.YGA_SPACE_AROUND=7]="YGA_SPACE_AROUND"})(d1||(d1={}));var p1;(function(e){e[e.YGU_UNDEFINED=0]="YGU_UNDEFINED",e[e.YGU_POINT=1]="YGU_POINT",e[e.YGU_PERCENT=2]="YGU_PERCENT",e[e.YGU_AUTO=3]="YGU_AUTO"})(p1||(p1={}));var m1;(function(e){e[e.YGFD_ROW=0]="YGFD_ROW",e[e.YGFD_COLUMN=1]="YGFD_COLUMN",e[e.YGFD_COLUMN_REVERSE=2]="YGFD_COLUMN_REVERSE",e[e.YGFD_ROW_REVERSE=3]="YGFD_ROW_REVERSE"})(m1||(m1={}));var h1;(function(e){e[e.YGW_NO_WRAP=0]="YGW_NO_WRAP",e[e.YGW_WRAP=1]="YGW_WRAP",e[e.YGW_WRAP_REVERSE=2]="YGW_WRAP_REVERSE"})(h1||(h1={}));var y1;(function(e){e[e.YGJ_FLEX_START=0]="YGJ_FLEX_START",e[e.YGJ_CENTER=1]="YGJ_CENTER",e[e.YGJ_FLEX_END=2]="YGJ_FLEX_END",e[e.YGJ_SPACE_BETWEEN=3]="YGJ_SPACE_BETWEEN",e[e.YGJ_SPACE_AROUND=4]="YGJ_SPACE_AROUND",e[e.YGJ_SPACE_EVENLY=5]="YGJ_SPACE_EVENLY"})(y1||(y1={}));var g1;(function(e){e[e.YGO_VISIBLE=0]="YGO_VISIBLE",e[e.YGO_HIDDEN=1]="YGO_HIDDEN",e[e.YGO_SCROLL=2]="YGO_SCROLL"})(g1||(g1={}));var E1;(function(e){e[e.YGD_FLEX=0]="YGD_FLEX",e[e.YGD_NONE=1]="YGD_NONE"})(E1||(E1={}));var T1;(function(e){e[e.YGE_LEFT=0]="YGE_LEFT",e[e.YGE_TOP=1]="YGE_TOP",e[e.YGE_RIGHT=2]="YGE_RIGHT",e[e.YGE_BOTTOM=3]="YGE_BOTTOM",e[e.YGE_START=4]="YGE_START",e[e.YGE_END=5]="YGE_END",e[e.YGE_HORIZONTAL=6]="YGE_HORIZONTAL",e[e.YGE_VERTICAL=7]="YGE_VERTICAL",e[e.YGE_ALL=8]="YGE_ALL"})(T1||(T1={}));var _1;(function(e){e[e.PFM_NONE=0]="PFM_NONE",e[e.PFM_BLOCK=1]="PFM_BLOCK"})(_1||(_1={}));function K_(){return{parent:0,rightOf:0,alignContent:void 0,alignItems:void 0,flexWrap:void 0,flexShrink:void 0,positionType:0,alignSelf:0,flexDirection:0,justifyContent:0,overflow:0,display:0,flexBasisUnit:0,flexBasis:0,flexGrow:0,widthUnit:0,width:0,heightUnit:0,height:0,minWidthUnit:0,minWidth:0,minHeightUnit:0,minHeight:0,maxWidthUnit:0,maxWidth:0,maxHeightUnit:0,maxHeight:0,positionLeftUnit:0,positionLeft:0,positionTopUnit:0,positionTop:0,positionRightUnit:0,positionRight:0,positionBottomUnit:0,positionBottom:0,marginLeftUnit:0,marginLeft:0,marginTopUnit:0,marginTop:0,marginRightUnit:0,marginRight:0,marginBottomUnit:0,marginBottom:0,paddingLeftUnit:0,paddingLeft:0,paddingTopUnit:0,paddingTop:0,paddingRightUnit:0,paddingRight:0,paddingBottomUnit:0,paddingBottom:0,pointerFilter:void 0}}var Ya;(function(e){function t(n,s=Il.default.Writer.create()){return n.parent!==0&&s.uint32(8).int32(n.parent),n.rightOf!==0&&s.uint32(16).int32(n.rightOf),n.alignContent!==void 0&&s.uint32(24).int32(n.alignContent),n.alignItems!==void 0&&s.uint32(32).int32(n.alignItems),n.flexWrap!==void 0&&s.uint32(40).int32(n.flexWrap),n.flexShrink!==void 0&&s.uint32(53).float(n.flexShrink),n.positionType!==0&&s.uint32(56).int32(n.positionType),n.alignSelf!==0&&s.uint32(64).int32(n.alignSelf),n.flexDirection!==0&&s.uint32(72).int32(n.flexDirection),n.justifyContent!==0&&s.uint32(80).int32(n.justifyContent),n.overflow!==0&&s.uint32(88).int32(n.overflow),n.display!==0&&s.uint32(96).int32(n.display),n.flexBasisUnit!==0&&s.uint32(104).int32(n.flexBasisUnit),n.flexBasis!==0&&s.uint32(117).float(n.flexBasis),n.flexGrow!==0&&s.uint32(125).float(n.flexGrow),n.widthUnit!==0&&s.uint32(128).int32(n.widthUnit),n.width!==0&&s.uint32(141).float(n.width),n.heightUnit!==0&&s.uint32(144).int32(n.heightUnit),n.height!==0&&s.uint32(157).float(n.height),n.minWidthUnit!==0&&s.uint32(160).int32(n.minWidthUnit),n.minWidth!==0&&s.uint32(173).float(n.minWidth),n.minHeightUnit!==0&&s.uint32(176).int32(n.minHeightUnit),n.minHeight!==0&&s.uint32(189).float(n.minHeight),n.maxWidthUnit!==0&&s.uint32(192).int32(n.maxWidthUnit),n.maxWidth!==0&&s.uint32(205).float(n.maxWidth),n.maxHeightUnit!==0&&s.uint32(208).int32(n.maxHeightUnit),n.maxHeight!==0&&s.uint32(221).float(n.maxHeight),n.positionLeftUnit!==0&&s.uint32(224).int32(n.positionLeftUnit),n.positionLeft!==0&&s.uint32(237).float(n.positionLeft),n.positionTopUnit!==0&&s.uint32(240).int32(n.positionTopUnit),n.positionTop!==0&&s.uint32(253).float(n.positionTop),n.positionRightUnit!==0&&s.uint32(256).int32(n.positionRightUnit),n.positionRight!==0&&s.uint32(269).float(n.positionRight),n.positionBottomUnit!==0&&s.uint32(272).int32(n.positionBottomUnit),n.positionBottom!==0&&s.uint32(285).float(n.positionBottom),n.marginLeftUnit!==0&&s.uint32(288).int32(n.marginLeftUnit),n.marginLeft!==0&&s.uint32(301).float(n.marginLeft),n.marginTopUnit!==0&&s.uint32(304).int32(n.marginTopUnit),n.marginTop!==0&&s.uint32(317).float(n.marginTop),n.marginRightUnit!==0&&s.uint32(320).int32(n.marginRightUnit),n.marginRight!==0&&s.uint32(333).float(n.marginRight),n.marginBottomUnit!==0&&s.uint32(336).int32(n.marginBottomUnit),n.marginBottom!==0&&s.uint32(349).float(n.marginBottom),n.paddingLeftUnit!==0&&s.uint32(352).int32(n.paddingLeftUnit),n.paddingLeft!==0&&s.uint32(365).float(n.paddingLeft),n.paddingTopUnit!==0&&s.uint32(368).int32(n.paddingTopUnit),n.paddingTop!==0&&s.uint32(381).float(n.paddingTop),n.paddingRightUnit!==0&&s.uint32(384).int32(n.paddingRightUnit),n.paddingRight!==0&&s.uint32(397).float(n.paddingRight),n.paddingBottomUnit!==0&&s.uint32(400).int32(n.paddingBottomUnit),n.paddingBottom!==0&&s.uint32(413).float(n.paddingBottom),n.pointerFilter!==void 0&&s.uint32(416).int32(n.pointerFilter),s}e.encode=t;function a(n,s){let i=n instanceof Il.default.Reader?n:Il.default.Reader.create(n),f=s===void 0?i.len:i.pos+s,u=K_();for(;i.pos>>3){case 1:if(c!==8)break;u.parent=i.int32();continue;case 2:if(c!==16)break;u.rightOf=i.int32();continue;case 3:if(c!==24)break;u.alignContent=i.int32();continue;case 4:if(c!==32)break;u.alignItems=i.int32();continue;case 5:if(c!==40)break;u.flexWrap=i.int32();continue;case 6:if(c!==53)break;u.flexShrink=i.float();continue;case 7:if(c!==56)break;u.positionType=i.int32();continue;case 8:if(c!==64)break;u.alignSelf=i.int32();continue;case 9:if(c!==72)break;u.flexDirection=i.int32();continue;case 10:if(c!==80)break;u.justifyContent=i.int32();continue;case 11:if(c!==88)break;u.overflow=i.int32();continue;case 12:if(c!==96)break;u.display=i.int32();continue;case 13:if(c!==104)break;u.flexBasisUnit=i.int32();continue;case 14:if(c!==117)break;u.flexBasis=i.float();continue;case 15:if(c!==125)break;u.flexGrow=i.float();continue;case 16:if(c!==128)break;u.widthUnit=i.int32();continue;case 17:if(c!==141)break;u.width=i.float();continue;case 18:if(c!==144)break;u.heightUnit=i.int32();continue;case 19:if(c!==157)break;u.height=i.float();continue;case 20:if(c!==160)break;u.minWidthUnit=i.int32();continue;case 21:if(c!==173)break;u.minWidth=i.float();continue;case 22:if(c!==176)break;u.minHeightUnit=i.int32();continue;case 23:if(c!==189)break;u.minHeight=i.float();continue;case 24:if(c!==192)break;u.maxWidthUnit=i.int32();continue;case 25:if(c!==205)break;u.maxWidth=i.float();continue;case 26:if(c!==208)break;u.maxHeightUnit=i.int32();continue;case 27:if(c!==221)break;u.maxHeight=i.float();continue;case 28:if(c!==224)break;u.positionLeftUnit=i.int32();continue;case 29:if(c!==237)break;u.positionLeft=i.float();continue;case 30:if(c!==240)break;u.positionTopUnit=i.int32();continue;case 31:if(c!==253)break;u.positionTop=i.float();continue;case 32:if(c!==256)break;u.positionRightUnit=i.int32();continue;case 33:if(c!==269)break;u.positionRight=i.float();continue;case 34:if(c!==272)break;u.positionBottomUnit=i.int32();continue;case 35:if(c!==285)break;u.positionBottom=i.float();continue;case 36:if(c!==288)break;u.marginLeftUnit=i.int32();continue;case 37:if(c!==301)break;u.marginLeft=i.float();continue;case 38:if(c!==304)break;u.marginTopUnit=i.int32();continue;case 39:if(c!==317)break;u.marginTop=i.float();continue;case 40:if(c!==320)break;u.marginRightUnit=i.int32();continue;case 41:if(c!==333)break;u.marginRight=i.float();continue;case 42:if(c!==336)break;u.marginBottomUnit=i.int32();continue;case 43:if(c!==349)break;u.marginBottom=i.float();continue;case 44:if(c!==352)break;u.paddingLeftUnit=i.int32();continue;case 45:if(c!==365)break;u.paddingLeft=i.float();continue;case 46:if(c!==368)break;u.paddingTopUnit=i.int32();continue;case 47:if(c!==381)break;u.paddingTop=i.float();continue;case 48:if(c!==384)break;u.paddingRightUnit=i.int32();continue;case 49:if(c!==397)break;u.paddingRight=i.float();continue;case 50:if(c!==400)break;u.paddingBottomUnit=i.int32();continue;case 51:if(c!==413)break;u.paddingBottom=i.float();continue;case 52:if(c!==416)break;u.pointerFilter=i.int32();continue}if((c&7)===4||c===0)break;i.skipType(c&7)}return u}e.decode=a})(Ya||(Ya={}));var S1={COMPONENT_ID:1050,serialize(e,t){let a=Ya.encode(e),n=new Uint8Array(a.finish(),0,a.len);t.writeBuffer(n,!1)},deserialize(e){return Ya.decode(e.buffer(),e.remainingBytes())},create(){return Ya.decode(new Uint8Array)},jsonSchema:{type:"object",properties:{},serializationType:"protocol-buffer",protocolBuffer:"PBUiTransform"}};var Ml=Ue(Le());var x1;(function(e){e[e.VS_NONE=0]="VS_NONE",e[e.VS_ERROR=1]="VS_ERROR",e[e.VS_LOADING=2]="VS_LOADING",e[e.VS_READY=3]="VS_READY",e[e.VS_PLAYING=4]="VS_PLAYING",e[e.VS_BUFFERING=5]="VS_BUFFERING",e[e.VS_SEEKING=6]="VS_SEEKING",e[e.VS_PAUSED=7]="VS_PAUSED"})(x1||(x1={}));function X_(){return{timestamp:0,tickNumber:0,currentOffset:0,videoLength:0,state:0}}var qa;(function(e){function t(n,s=Ml.default.Writer.create()){return n.timestamp!==0&&s.uint32(8).uint32(n.timestamp),n.tickNumber!==0&&s.uint32(16).uint32(n.tickNumber),n.currentOffset!==0&&s.uint32(29).float(n.currentOffset),n.videoLength!==0&&s.uint32(37).float(n.videoLength),n.state!==0&&s.uint32(40).int32(n.state),s}e.encode=t;function a(n,s){let i=n instanceof Ml.default.Reader?n:Ml.default.Reader.create(n),f=s===void 0?i.len:i.pos+s,u=X_();for(;i.pos>>3){case 1:if(c!==8)break;u.timestamp=i.uint32();continue;case 2:if(c!==16)break;u.tickNumber=i.uint32();continue;case 3:if(c!==29)break;u.currentOffset=i.float();continue;case 4:if(c!==37)break;u.videoLength=i.float();continue;case 5:if(c!==40)break;u.state=i.int32();continue}if((c&7)===4||c===0)break;i.skipType(c&7)}return u}e.decode=a})(qa||(qa={}));var b1={COMPONENT_ID:1044,serialize(e,t){let a=qa.encode(e),n=new Uint8Array(a.finish(),0,a.len);t.writeBuffer(n,!1)},deserialize(e){return qa.decode(e.buffer(),e.remainingBytes())},create(){return qa.decode(new Uint8Array)},jsonSchema:{type:"object",properties:{},serializationType:"protocol-buffer",protocolBuffer:"PBVideoEvent"}};var Pl=Ue(Le());function Z_(){return{src:"",playing:void 0,position:void 0,volume:void 0,playbackRate:void 0,loop:void 0}}var Qa;(function(e){function t(n,s=Pl.default.Writer.create()){return n.src!==""&&s.uint32(10).string(n.src),n.playing!==void 0&&s.uint32(16).bool(n.playing),n.position!==void 0&&s.uint32(29).float(n.position),n.volume!==void 0&&s.uint32(37).float(n.volume),n.playbackRate!==void 0&&s.uint32(45).float(n.playbackRate),n.loop!==void 0&&s.uint32(48).bool(n.loop),s}e.encode=t;function a(n,s){let i=n instanceof Pl.default.Reader?n:Pl.default.Reader.create(n),f=s===void 0?i.len:i.pos+s,u=Z_();for(;i.pos>>3){case 1:if(c!==10)break;u.src=i.string();continue;case 2:if(c!==16)break;u.playing=i.bool();continue;case 3:if(c!==29)break;u.position=i.float();continue;case 4:if(c!==37)break;u.volume=i.float();continue;case 5:if(c!==45)break;u.playbackRate=i.float();continue;case 6:if(c!==48)break;u.loop=i.bool();continue}if((c&7)===4||c===0)break;i.skipType(c&7)}return u}e.decode=a})(Qa||(Qa={}));var R1={COMPONENT_ID:1043,serialize(e,t){let a=Qa.encode(e),n=new Uint8Array(a.finish(),0,a.len);t.writeBuffer(n,!1)},deserialize(e){return Qa.decode(e.buffer(),e.remainingBytes())},create(){return Qa.decode(new Uint8Array)},jsonSchema:{type:"object",properties:{},serializationType:"protocol-buffer",protocolBuffer:"PBVideoPlayer"}};var Bl=Ue(Le());function $_(){return{visible:void 0}}var Ja;(function(e){function t(n,s=Bl.default.Writer.create()){return n.visible!==void 0&&s.uint32(8).bool(n.visible),s}e.encode=t;function a(n,s){let i=n instanceof Bl.default.Reader?n:Bl.default.Reader.create(n),f=s===void 0?i.len:i.pos+s,u=$_();for(;i.pos>>3){case 1:if(c!==8)break;u.visible=i.bool();continue}if((c&7)===4||c===0)break;i.skipType(c&7)}return u}e.decode=a})(Ja||(Ja={}));var v1={COMPONENT_ID:1081,serialize(e,t){let a=Ja.encode(e),n=new Uint8Array(a.finish(),0,a.len);t.writeBuffer(n,!1)},deserialize(e){return Ja.decode(e.buffer(),e.remainingBytes())},create(){return Ja.decode(new Uint8Array)},jsonSchema:{type:"object",properties:{},serializationType:"protocol-buffer",protocolBuffer:"PBVisibilityComponent"}};var fp=e=>e.defineComponentFromSchema("core::Animator",ly),dp=e=>e.defineComponentFromSchema("core::AudioSource",fy),pp=e=>e.defineComponentFromSchema("core::AudioStream",dy),mp=e=>e.defineComponentFromSchema("core::AvatarAttach",py),k1=e=>e.defineComponentFromSchema("core::AvatarModifierArea",gy),N1=e=>e.defineComponentFromSchema("core::AvatarShape",wy),w1=e=>e.defineComponentFromSchema("core::Billboard",Oy),A1=e=>e.defineComponentFromSchema("core::CameraMode",Cy),hp=e=>e.defineComponentFromSchema("core::CameraModeArea",Iy),yp=e=>e.defineComponentFromSchema("core::EngineInfo",My),gp=e=>e.defineComponentFromSchema("core::GltfContainer",Py),Ep=e=>e.defineComponentFromSchema("core::GltfContainerLoadingState",By),Tp=e=>e.defineComponentFromSchema("core::Material",Dy),_p=e=>e.defineComponentFromSchema("core::MeshCollider",Fy),Sp=e=>e.defineComponentFromSchema("core::MeshRenderer",jy),O1=e=>e.defineComponentFromSchema("core::NftShape",Hy),nc=e=>e.defineComponentFromSchema("core::PointerEvents",Vy),rc=e=>e.defineValueSetComponentFromSchema("core::PointerEventsResult",Gy,{timestampFunction:t=>t.timestamp,maxElements:100}),C1=e=>e.defineComponentFromSchema("core::PointerLock",Yy),xp=e=>e.defineComponentFromSchema("core::Raycast",Qy),bp=e=>e.defineComponentFromSchema("core::RaycastResult",Jy),Rp=e=>e.defineComponentFromSchema("core::TextShape",Ky),vp=e=>e.defineComponentFromSchema("core::Tween",Xy),zl=e=>e.defineComponentFromSchema("core::TweenSequence",$y),Ul=e=>e.defineComponentFromSchema("core::TweenState",t1),oc=e=>e.defineComponentFromSchema("core::UiBackground",o1),I1=e=>e.defineComponentFromSchema("core::UiCanvasInformation",i1),Ll=e=>e.defineComponentFromSchema("core::UiDropdown",a1),Dl=e=>e.defineComponentFromSchema("core::UiDropdownResult",s1),Fl=e=>e.defineComponentFromSchema("core::UiInput",c1),jl=e=>e.defineComponentFromSchema("core::UiInputResult",u1),ic=e=>e.defineComponentFromSchema("core::UiText",l1),ac=e=>e.defineComponentFromSchema("core::UiTransform",S1),kp=e=>e.defineValueSetComponentFromSchema("core::VideoEvent",b1,{timestampFunction:t=>t.timestamp,maxElements:100}),Wl=e=>e.defineComponentFromSchema("core::VideoPlayer",R1),Np=e=>e.defineComponentFromSchema("core::VisibilityComponent",v1),wp={"core::Animator":fp,"core::AudioSource":dp,"core::AudioStream":pp,"core::AvatarAttach":mp,"core::AvatarModifierArea":k1,"core::AvatarShape":N1,"core::Billboard":w1,"core::CameraMode":A1,"core::CameraModeArea":hp,"core::EngineInfo":yp,"core::GltfContainer":gp,"core::GltfContainerLoadingState":Ep,"core::Material":Tp,"core::MeshCollider":_p,"core::MeshRenderer":Sp,"core::NftShape":O1,"core::PointerEvents":nc,"core::PointerEventsResult":rc,"core::PointerLock":C1,"core::Raycast":xp,"core::RaycastResult":bp,"core::TextShape":Rp,"core::Tween":vp,"core::TweenSequence":zl,"core::TweenState":Ul,"core::UiBackground":oc,"core::UiCanvasInformation":I1,"core::UiDropdown":Ll,"core::UiDropdownResult":Dl,"core::UiInput":Fl,"core::UiInputResult":jl,"core::UiText":ic,"core::UiTransform":ac,"core::VideoEvent":kp,"core::VideoPlayer":Wl,"core::VisibilityComponent":Np};function M1(e){let t=fp(e);function a(n,s){let i=t.getMutableOrNull(n);if(!i)return[null,null];let f=i.states.find(u=>u.clip===s);return f?[i,f]:[i,null]}return{...t,getClipOrNull(n,s){let[i,f]=a(n,s);return f},getClip(n,s){let[i,f]=a(n,s);if(!i)throw new Error(`There is no Animator found in the entity ${n}`);if(!f)throw new Error(`The Animator component of ${n} has no the state ${s}`);return f},playSingleAnimation(n,s,i=!0){let[f,u]=a(n,s);if(!f||!u)return!1;for(let c of f.states)c.playing=!1,c.shouldReset=!0;return u.playing=!0,u.shouldReset=i,!0},stopAllAnimations(n,s=!0){let i=t.getMutableOrNull(n);if(!i)return!1;for(let f of i.states)f.playing=!1,f.shouldReset=s;return!0}}}var tS={Common(e){return{tex:{$case:"texture",texture:e}}},Avatar(e){return{tex:{$case:"avatarTexture",avatarTexture:e}}},Video(e){return{tex:{$case:"videoTexture",videoTexture:e}}}};function P1(e){let t=Tp(e);return{...t,Texture:tS,setBasicMaterial(a,n){t.createOrReplace(a,{material:{$case:"unlit",unlit:n}})},setPbrMaterial(a,n){t.createOrReplace(a,{material:{$case:"pbr",pbr:n}})}}}function B1(e){let t=_p(e);function a(n){if(Array.isArray(n))return n.map(s=>s).reduce((s,i)=>s|i,0);if(n)return n}return{...t,setBox(n,s){t.createOrReplace(n,{mesh:{$case:"box",box:{}},collisionMask:a(s)})},setPlane(n,s){t.createOrReplace(n,{mesh:{$case:"plane",plane:{}},collisionMask:a(s)})},setCylinder(n,s,i,f){t.createOrReplace(n,{mesh:{$case:"cylinder",cylinder:{radiusBottom:s,radiusTop:i}},collisionMask:a(f)})},setSphere(n,s){t.createOrReplace(n,{mesh:{$case:"sphere",sphere:{}},collisionMask:a(s)})}}}function z1(e){let t=Sp(e);return{...t,setBox(a,n){t.createOrReplace(a,{mesh:{$case:"box",box:{uvs:n||[]}}})},setPlane(a,n){t.createOrReplace(a,{mesh:{$case:"plane",plane:{uvs:n||[]}}})},setCylinder(a,n,s){t.createOrReplace(a,{mesh:{$case:"cylinder",cylinder:{radiusBottom:n,radiusTop:s}}})},setSphere(a){t.createOrReplace(a,{mesh:{$case:"sphere",sphere:{}}})}}}var nS={Move(e){return{$case:"move",move:e}},Rotate(e){return{$case:"rotate",rotate:e}},Scale(e){return{$case:"scale",scale:e}}};function U1(e){return{...vp(e),Mode:nS}}var Hl=e=>({serialize(t,a){a.writeUint32(t.length);for(let n of t)e.serialize(n,a)},deserialize(t){let a=[],n=t.readUint32();for(let s=0;s2147483647||e[i]<-2147483648)throw new Error("Enum member values must be numbers within the range of -2147483648 to 2147483647.");n++}s++}if(s!==n*2)throw new Error("All enum member values must be of numeric type.")}function oS(e){for(let t in e)if(typeof e[t]!="string")throw new Error("All enum member values must be of string type.")}var iS="enum-int",Gl=(e,t)=>(rS(e),{serialize(a,n){ii.serialize(a,n)},deserialize(a){return ii.deserialize(a)},create(){return t},jsonSchema:{type:"integer",enum:Object.values(e).filter(a=>Number.isInteger(a)),default:t,serializationType:iS,enumObject:e}}),aS="enum-string",Yl=(e,t)=>(oS(e),{serialize(a,n){Vl.serialize(a,n)},deserialize(a){return Vl.deserialize(a)},create(){return t},jsonSchema:{type:"string",enum:Object.values(e),default:t,serializationType:aS,enumObject:e}});var Ka={serialize(e,t){t.writeFloat32(e)},deserialize(e){return e.readFloat32()},create(){return 0},jsonSchema:{type:"number",serializationType:"float32"}},dc={serialize(e,t){t.writeFloat64(e)},deserialize(e){return e.readFloat64()},create(){return 0},jsonSchema:{type:"number",serializationType:"float64"}};var pc={serialize(e,t){t.writeFloat32(e.r),t.writeFloat32(e.g),t.writeFloat32(e.b)},deserialize(e){return{r:e.readFloat32(),g:e.readFloat32(),b:e.readFloat32()}},create(){return{r:0,g:0,b:0}},jsonSchema:{type:"object",properties:{r:{type:"number"},g:{type:"number"},b:{type:"number"}},serializationType:"color3"}};var mc={serialize(e,t){t.writeFloat32(e.r),t.writeFloat32(e.g),t.writeFloat32(e.b),t.writeFloat32(e.a)},deserialize(e){return{r:e.readFloat32(),g:e.readFloat32(),b:e.readFloat32(),a:e.readFloat32()}},create(){return{r:0,g:0,b:0,a:0}},jsonSchema:{type:"object",properties:{r:{type:"number"},g:{type:"number"},b:{type:"number"},a:{type:"number"}},serializationType:"color4"}};var hc={serialize(e,t){t.writeInt32(e)},deserialize(e){return e.readInt32()},create(){return 0},jsonSchema:{type:"integer",serializationType:"entity"}};var yc={serialize(e,t){t.writeFloat32(e.x),t.writeFloat32(e.y),t.writeFloat32(e.z),t.writeFloat32(e.w)},deserialize(e){return{x:e.readFloat32(),y:e.readFloat32(),z:e.readFloat32(),w:e.readFloat32()}},create(){return{x:0,y:0,z:0,w:0}},jsonSchema:{type:"object",properties:{x:{type:"number"},y:{type:"number"},z:{type:"number"},w:{type:"number"}},serializationType:"quaternion"}};var gc={serialize(e,t){t.writeFloat32(e.x),t.writeFloat32(e.y),t.writeFloat32(e.z)},deserialize(e){return{x:e.readFloat32(),y:e.readFloat32(),z:e.readFloat32()}},create(){return{x:0,y:0,z:0}},jsonSchema:{type:"object",properties:{x:{type:"number"},y:{type:"number"},z:{type:"number"},w:{type:"number"}},serializationType:"vector3"}};var ql=(e,t)=>{let a=Object.keys(e).reduce((n,s)=>(n[s]=e[s].jsonSchema,n),{});return{serialize(n,s){for(let i in e)e[i].serialize(n[i],s)},deserialize(n){let s={};for(let i in e)s[i]=e[i].deserialize(n);return s},create(){let n={};for(let s in e)n[s]=e[s].create();return{...n,...t}},extend:n=>{let s={};for(let i in e)s[i]=e[i].create();return{...s,...t,...n}},jsonSchema:{type:"object",properties:a,serializationType:"map"}}};var Ql=e=>({serialize(t,a){t?(a.writeInt8(1),e.serialize(t,a)):a.writeInt8(0)},deserialize(t){if(t.readInt8())return e.deserialize(t)},create(){},jsonSchema:{type:e.jsonSchema.type,serializationType:"optional",optionalJsonSchema:e.jsonSchema}});var Jl=e=>{let t=Object.keys(e),a=t.reduce((s,i,f)=>(s[i]=f,s),{}),n=t.reduce((s,i)=>(s[i]=e[i].jsonSchema,s),{});return{serialize({$case:s,value:i},f){let u=a[s.toString()]+1;f.writeUint8(u),e[s].serialize(i,f)},deserialize(s){let i=t[s.readInt8()-1],f=e[i].deserialize(s);return{$case:i,value:f}},create(){return{}},jsonSchema:{type:"object",properties:n,serializationType:"one-of"}}};var L1=(e,t)=>t.includes(e.serializationType),sS=e=>L1(e,["one-of"]),cS=()=>({type:{type:"object",serializationType:"unknown"},value:void 0}),Kl=e=>L1(e,["array","map"]),Ap=(e,t,a)=>{let n=e[a],s=t[a];if(sS(n)){let i=s;if(!i.$case)return cS();let f=n.properties[i.$case];return Kl(f)&&(t[a]={[i.$case]:i.value}),{type:f,value:i.value}}return{type:n,value:s}};var D1={[sc.jsonSchema.serializationType]:sc,[fc.jsonSchema.serializationType]:fc,[Ka.jsonSchema.serializationType]:Ka,[dc.jsonSchema.serializationType]:dc,[lc.jsonSchema.serializationType]:lc,[uc.jsonSchema.serializationType]:uc,[ii.jsonSchema.serializationType]:ii,[cc.jsonSchema.serializationType]:cc,[gc.jsonSchema.serializationType]:gc,[yc.jsonSchema.serializationType]:yc,[pc.jsonSchema.serializationType]:pc,[mc.jsonSchema.serializationType]:mc,[hc.jsonSchema.serializationType]:hc};function Xa(e){if(D1[e.serializationType])return D1[e.serializationType];if(e.serializationType==="map"){let t=e,a={};for(let n in t.properties)a[n]=Xa(t.properties[n]);return ql(a)}if(e.serializationType==="optional")return Ql(Xa(e.optionalJsonSchema));if(e.serializationType==="array")return Hl(Xa(e.items));if(e.serializationType==="enum-int"){let t=e;return Gl(t.enumObject,t.default)}if(e.serializationType==="enum-string"){let t=e;return Yl(t.enumObject,t.default)}if(e.serializationType==="one-of"){let t=e,a={};for(let n in t.properties)a[n]=Xa(t.properties[n]);return Jl(a)}throw new Error(`${e.serializationType} is not supported as reverse schema generation.`)}function Xl(e,t,a){if(e.serializationType==="map"){let{properties:n}=e,s=t;for(let i in n){let{type:f,value:u}=Ap(n,s,i);if(f.serializationType!=="unknown")if(Kl(f))Xl(f,u,a);else{let c=a(u,f);c.changed&&(s[i]=c.value)}}}else if(e.serializationType==="array"){let{items:n}=e,s=t;for(let i=0,f=s.length;iV1(e),G1=e=>P1(e),Y1=e=>M1(e),q1=e=>z1(e),Q1=e=>B1(e),Zl=e=>U1(e),$l=e=>F1(e),J1=e=>j1(e),Li=e=>W1(e),$a=e=>H1(e);var Op={"core::Transform":1,"core::Animator":1042,"core::AudioSource":1020,"core::AudioStream":1021,"core::AvatarAttach":1073,"core::AvatarBase":1087,"core::AvatarEmoteCommand":1088,"core::AvatarEquippedData":1091,"core::AvatarModifierArea":1070,"core::AvatarShape":1080,"core::Billboard":1090,"core::CameraMode":1072,"core::CameraModeArea":1071,"core::EngineInfo":1048,"core::GltfContainer":1041,"core::GltfContainerLoadingState":1049,"core::Material":1017,"core::MeshCollider":1019,"core::MeshRenderer":1018,"core::NftShape":1040,"core::PlayerIdentityData":1089,"core::PointerEvents":1062,"core::PointerEventsResult":1063,"core::PointerLock":1074,"core::Raycast":1067,"core::RaycastResult":1068,"core::TextShape":1030,"core::Tween":1102,"core::TweenSequence":1104,"core::TweenState":1103,"core::UiBackground":1053,"core::UiCanvasInformation":1054,"core::UiDropdown":1094,"core::UiDropdownResult":1096,"core::UiInput":1093,"core::UiInputResult":1095,"core::UiText":1052,"core::UiTransform":1050,"core::VideoEvent":1044,"core::VideoPlayer":1043,"core::VisibilityComponent":1081};var X1=Ue(Bu());var pS=new Int32Array([0,1996959894,3993919788,2567524794,124634137,1886057615,3915621685,2657392035,249268274,2044508324,3772115230,2547177864,162941995,2125561021,3887607047,2428444049,498536548,1789927666,4089016648,2227061214,450548861,1843258603,4107580753,2211677639,325883990,1684777152,4251122042,2321926636,335633487,1661365465,4195302755,2366115317,997073096,1281953886,3579855332,2724688242,1006888145,1258607687,3524101629,2768942443,901097722,1119000684,3686517206,2898065728,853044451,1172266101,3705015759,2882616665,651767980,1373503546,3369554304,3218104598,565507253,1454621731,3485111705,3099436303,671266974,1594198024,3322730930,2970347812,795835527,1483230225,3244367275,3060149565,1994146192,31158534,2563907772,4023717930,1907459465,112637215,2680153253,3904427059,2013776290,251722036,2517215374,3775830040,2137656763,141376813,2439277719,3865271297,1802195444,476864866,2238001368,4066508878,1812370925,453092731,2181625025,4111451223,1706088902,314042704,2344532202,4240017532,1658658271,366619977,2362670323,4224994405,1303535960,984961486,2747007092,3569037538,1256170817,1037604311,2765210733,3554079995,1131014506,879679996,2909243462,3663771856,1141124467,855842277,2852801631,3708648649,1342533948,654459306,3188396048,3373015174,1466479909,544179635,3110523913,3462522015,1591671054,702138776,2966460450,3352799412,1504918807,783551873,3082640443,3233442989,3988292384,2596254646,62317068,1957810842,3939845945,2647816111,81470997,1943803523,3814918930,2489596804,225274430,2053790376,3826175755,2466906013,167816743,2097651377,4027552580,2265490386,503444072,1762050814,4150417245,2154129355,426522225,1852507879,4275313526,2312317920,282753626,1742555852,4189708143,2394877945,397917763,1622183637,3604390888,2714866558,953729732,1340076626,3518719985,2797360999,1068828381,1219638859,3624741850,2936675148,906185462,1090812512,3747672003,2825379669,829329135,1181335161,3412177804,3160834842,628085408,1382605366,3423369109,3138078467,570562233,1426400815,3317316542,2998733608,733239954,1555261956,3268935591,3050360625,752459403,1541320221,2607071920,3965973030,1969922972,40735498,2617837225,3943577151,1913087877,83908371,2512341634,3803740692,2075208622,213261112,2463272603,3855990285,2094854071,198958881,2262029012,4057260610,1759359992,534414190,2176718541,4139329115,1873836001,414664567,2282248934,4279200368,1711684554,285281116,2405801727,4167216745,1634467795,376229701,2685067896,3608007406,1308918612,956543938,2808555105,3495958263,1231636301,1047427035,2932959818,3654703836,1088359270,936918e3,2847714899,3736837829,1202900863,817233897,3183342108,3401237130,1404277552,615818150,3134207493,3453421203,1423857449,601450431,3009837614,3294710456,1567103746,711928724,3020668471,3272380065,1510334235,755167117]);function mS(e,t){let a=~~t^-1;for(let n=0;n>>8;return a^-1}function K1(e,t=0){return mS(e,t)>>>0}var Cp=2048;function vr(e){if(Op[e])return Op[e];let t=new Uint8Array(128);return X1.write(e,t,0),(K1(t)+Cp&4294967295)>>>0}var Ip=typeof process=="object"&&!1||!1;function Ec(e,t){if(Ip&&e&&typeof e=="object"&&typeof e.then=="function")throw new Error(t);return e}function Z1(){let e=new Map;return{addTo(t,a){if(a<0)return!1;let n=e.get(t);return n!==void 0&&n>=a||e.set(t,a),!0},has(t,a){let n=e.get(t);return n!==void 0&&n>=a},getMap(){return e}}}var Di=65535,hS=4294901760,Uw=Di+1,Mp=Di,es=512,yS=Mp,or;(function(e){function t(n){return[(n&Di)>>>0,((n&hS)>>16&Di)>>>0]}e.fromEntityId=t;function a(n,s){return(n&Di|(s&Di)<<16)>>>0}e.toEntityId=a})(or||(or={}));var Zt;(function(e){e[e.Unknown=0]="Unknown",e[e.UsedEntity=1]="UsedEntity",e[e.Removed=2]="Removed",e[e.Reserved=3]="Reserved"})(Zt||(Zt={}));function $1(){let e=es,t,a,n=new Set,s=[],i=Z1(),f=yS;function u(y,_){f=y,a=_,t=_[0]}function c(y){if(e>Mp-1)throw new Error(`It fails trying to generate an entity out of range ${Mp}.`);if(y&&t>a[1])throw new Error(`Max amount of network entities reached ${a[1]} `);if(!y&&e>=f)throw new Error(`Max amount of local entities reached ${f}`);let _=y?t++:e++,S=i.getMap().has(_)?i.getMap().get(_)+1:0,N=or.toEntityId(_,S);return n.has(N)?c():(n.add(N),N)}function h(y){if(y&&!a)throw new Error("Network entities ranged not initialized. Connect to a CRDT Server");let _=(a&&[...n.values()].filter(N=>{let[P]=or.fromEntityId(N);return P>=a[0]&&P<=a[1]}).length)??0,S=n.size-_;if(!y&&S+es>=e||y&&_+a[0]>=t)return c(y);for(let[N,P]of i.getMap())if(Pa[1])||!y&&N>=f)continue;let oe=or.toEntityId(N,P+1);if(!n.has(oe)&&!s.includes(oe))return n.add(oe),oe}return c(y)}function E(y){return y0){for(let N=0;N<=S-1;N++)n.delete(or.toEntityId(_,N));i.addTo(_,S-1)}return n.add(y),!0}function I(y){let[_,S]=or.fromEntityId(y);if(_=S?Zt.Removed:Zt.Unknown}return{setNetworkEntitiesRange:u,generateEntity:h,removeEntity:E,getExistingEntities(){return new Set(n)},getEntityState:I,releaseRemovedEntities:C,updateRemovedEntity:v,updateUsedEntity:W}}var ts=Ue(Bu()),ht=function(e,t,a,n){if(a==="a"&&!n)throw new TypeError("Private accessor was defined without a getter");if(typeof t=="function"?e!==t||!n:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return a==="m"?n:a==="a"?n.call(e):n?n.value:t.get(e)},dt,Qn,En;function gS(e,t){let a=Math.max(e,t)+1024;return Math.ceil(a/1024)*1024}var ES=10240,Et=class{constructor(t,a,n){dt.add(this),this._buffer=t||new Uint8Array(ES),this.view=new DataView(this._buffer.buffer,this._buffer.byteOffset),this.woffset=n??(t?this._buffer.length:null)??0,this.roffset=a??0}buffer(){return this._buffer}bufferLength(){return this._buffer.length}resetBuffer(){this.roffset=0,this.woffset=0}currentReadOffset(){return this.roffset}currentWriteOffset(){return this.woffset}incrementReadOffset(t){return ht(this,dt,"m",En).call(this,t)}remainingBytes(){return this.woffset-this.roffset}readFloat32(){return this.view.getFloat32(ht(this,dt,"m",En).call(this,4),!0)}readFloat64(){return this.view.getFloat64(ht(this,dt,"m",En).call(this,8),!0)}readInt8(){return this.view.getInt8(ht(this,dt,"m",En).call(this,1))}readInt16(){return this.view.getInt16(ht(this,dt,"m",En).call(this,2),!0)}readInt32(){return this.view.getInt32(ht(this,dt,"m",En).call(this,4),!0)}readInt64(){return this.view.getBigInt64(ht(this,dt,"m",En).call(this,8),!0)}readUint8(){return this.view.getUint8(ht(this,dt,"m",En).call(this,1))}readUint16(){return this.view.getUint16(ht(this,dt,"m",En).call(this,2),!0)}readUint32(){return this.view.getUint32(ht(this,dt,"m",En).call(this,4),!0)}readUint64(){return this.view.getBigUint64(ht(this,dt,"m",En).call(this,8),!0)}readBuffer(){let t=this.view.getUint32(ht(this,dt,"m",En).call(this,4),!0);return this._buffer.subarray(ht(this,dt,"m",En).call(this,t),ht(this,dt,"m",En).call(this,0))}readUtf8String(){let t=this.view.getUint32(ht(this,dt,"m",En).call(this,4),!0);return ts.read(this._buffer,ht(this,dt,"m",En).call(this,t),ht(this,dt,"m",En).call(this,0))}incrementWriteOffset(t){return ht(this,dt,"m",Qn).call(this,t)}toBinary(){return this._buffer.subarray(0,this.woffset)}toCopiedBinary(){return new Uint8Array(this.toBinary())}writeBuffer(t,a=!0){a&&this.writeUint32(t.byteLength);let n=ht(this,dt,"m",Qn).call(this,t.byteLength);this._buffer.set(t,n)}writeUtf8String(t,a=!0){let n=ts.length(t);a&&this.writeUint32(n);let s=ht(this,dt,"m",Qn).call(this,n);ts.write(t,this._buffer,s)}writeFloat32(t){let a=ht(this,dt,"m",Qn).call(this,4);this.view.setFloat32(a,t,!0)}writeFloat64(t){let a=ht(this,dt,"m",Qn).call(this,8);this.view.setFloat64(a,t,!0)}writeInt8(t){let a=ht(this,dt,"m",Qn).call(this,1);this.view.setInt8(a,t)}writeInt16(t){let a=ht(this,dt,"m",Qn).call(this,2);this.view.setInt16(a,t,!0)}writeInt32(t){let a=ht(this,dt,"m",Qn).call(this,4);this.view.setInt32(a,t,!0)}writeInt64(t){let a=ht(this,dt,"m",Qn).call(this,8);this.view.setBigInt64(a,t,!0)}writeUint8(t){let a=ht(this,dt,"m",Qn).call(this,1);this.view.setUint8(a,t)}writeUint16(t){let a=ht(this,dt,"m",Qn).call(this,2);this.view.setUint16(a,t,!0)}writeUint32(t){let a=ht(this,dt,"m",Qn).call(this,4);this.view.setUint32(a,t,!0)}writeUint64(t){let a=ht(this,dt,"m",Qn).call(this,8);this.view.setBigUint64(a,t,!0)}getFloat32(t){return this.view.getFloat32(t,!0)}getFloat64(t){return this.view.getFloat64(t,!0)}getInt8(t){return this.view.getInt8(t)}getInt16(t){return this.view.getInt16(t,!0)}getInt32(t){return this.view.getInt32(t,!0)}getInt64(t){return this.view.getBigInt64(t,!0)}getUint8(t){return this.view.getUint8(t)}getUint16(t){return this.view.getUint16(t,!0)}getUint32(t){return this.view.getUint32(t,!0)}getUint64(t){return this.view.getBigUint64(t,!0)}setFloat32(t,a){this.view.setFloat32(t,a,!0)}setFloat64(t,a){this.view.setFloat64(t,a,!0)}setInt8(t,a){this.view.setInt8(t,a)}setInt16(t,a){this.view.setInt16(t,a,!0)}setInt32(t,a){this.view.setInt32(t,a,!0)}setInt64(t,a){this.view.setBigInt64(t,a,!0)}setUint8(t,a){this.view.setUint8(t,a)}setUint16(t,a){this.view.setUint16(t,a,!0)}setUint32(t,a){this.view.setUint32(t,a,!0)}setUint64(t,a){this.view.setBigUint64(t,a,!0)}};dt=new WeakSet,Qn=function(t){if(this.woffset+t>this._buffer.byteLength){let a=gS(this._buffer.byteLength,this.woffset+t),n=new Uint8Array(a);n.set(this._buffer);let s=this._buffer.byteOffset;this._buffer=n,this.view=new DataView(this._buffer.buffer,s)}return this.woffset+=t,this.woffset-t},En=function(t){if(this.roffset+t>this.woffset)throw new Error("Outside of the bounds of writen data.");return this.roffset+=t,this.roffset-t};var ye;(function(e){e[e.RESERVED=0]="RESERVED",e[e.PUT_COMPONENT=1]="PUT_COMPONENT",e[e.DELETE_COMPONENT=2]="DELETE_COMPONENT",e[e.DELETE_ENTITY=3]="DELETE_ENTITY",e[e.APPEND_VALUE=4]="APPEND_VALUE",e[e.PUT_COMPONENT_NETWORK=5]="PUT_COMPONENT_NETWORK",e[e.DELETE_COMPONENT_NETWORK=6]="DELETE_COMPONENT_NETWORK",e[e.DELETE_ENTITY_NETWORK=7]="DELETE_ENTITY_NETWORK",e[e.MAX_MESSAGE_TYPE=8]="MAX_MESSAGE_TYPE"})(ye||(ye={}));var ln=8,ir;(function(e){e[e.StateUpdatedTimestamp=1]="StateUpdatedTimestamp",e[e.StateOutdatedTimestamp=2]="StateOutdatedTimestamp",e[e.NoChanges=3]="NoChanges",e[e.StateOutdatedData=4]="StateOutdatedData",e[e.StateUpdatedData=5]="StateUpdatedData",e[e.EntityWasDeleted=6]="EntityWasDeleted",e[e.EntityDeleted=7]="EntityDeleted"})(ir||(ir={}));var rn;(function(e){function t(i){let f=i.remainingBytes();if(fve.filter(P))&&(P.type===ye.PUT_COMPONENT?ar.write(P.entityId,P.timestamp,P.componentId,P.data,_):P.type===ye.DELETE_COMPONENT?Io.write(P.entityId,N.componentId,P.timestamp,_):P.type===ye.APPEND_VALUE&&Fi.write(P.entityId,P.timestamp,P.componentId,P.data,_),y.push({...P,messageBuffer:_.buffer().subarray(oe,_.currentWriteOffset())}),t)){let ve=P.type===ye.PUT_COMPONENT||P.type===ye.APPEND_VALUE?N.get(P.entityId):void 0;t(P.entityId,P.type,N,ve)}}for(let N of I){let P=_.currentWriteOffset();ji.write(N,_),y.push({type:ye.DELETE_ENTITY,entityId:N,messageBuffer:_.buffer().subarray(P,_.currentWriteOffset())}),t&&t(N,ye.DELETE_ENTITY)}let S=new Et;for(let N in a){let P=Number(N),oe=a[P],ve=oe.type==="renderer",j=oe.type==="network";S.resetBuffer();let q=new Et;for(let ie of y){if(ie.transportId===P||!oe.filter(ie))continue;let{entityId:K}=E(ie),A="componentId"in ie&&ie.componentId===i.componentId&&i.has(K)&&s.has(K)&&n.has(K);if(ve&&ie.type===ye.PUT_COMPONENT&&A){let M=E(s.get(K)),X=tf(ie,i.get(K),M.entityId),re=q.currentWriteOffset();ar.write(K,ie.timestamp,ie.componentId,X,q),S.writeBuffer(q.buffer().subarray(re,q.currentWriteOffset()),!1);continue}if(ve&&ef(ie)){let M="data"in ie?ie.data:new Uint8Array;if(A){let X=E(s.get(K));M=tf(ie,i.get(K),X.entityId)}eg({...ie,data:M},K,q,S);continue}if(j&&!ef(ie)){let M=n.getOrNull(ie.entityId);if(M){tg(ie,M,q,S);continue}}S.writeBuffer(ie.messageBuffer,!1)}let ne=S.currentWriteOffset()?S.toBinary():new Uint8Array([]);await oe.send(ne)}}function W(I){let y=a.push(I)-1;I.onmessage=c(y)}return{sendMessages:v,receiveMessages:C,addTransport:W}}var rg;(function(e){let t;(function(a){a[a.NETWORKED=0]="NETWORKED",a[a.RENDERER=1]="RENDERER"})(t=e.SynchronizedEntityType||(e.SynchronizedEntityType={}))})(rg||(rg={}));function Tc(e,t){if(e===t)return 0;if(e===null&&t!==null)return-1;if(e!==null&&t===null)return 1;if(e instanceof Uint8Array&&t instanceof Uint8Array){let a=e.byteLength-t.byteLength;if(a!==0)return a>0?1:-1;let n;for(let s=0,i=e.byteLength;s0?1:-1;return 0}if(typeof e=="string"){let a=e.length-t.length;return a!==0?a>0?1:-1:e.localeCompare(t)}return e>t?1:-1}function Pp(e){return Object.freeze({...e})}function _S(e,t){let a=(t.get(e)||0)+1;return t.set(e,a),a}function SS(e,t,a,n){return function(i,f){for(let[u,c]of t)if(!(f&&!f(u)))if(n.has(u)){let h=n.get(u),E=new Et;a.serialize(h,E),ar.write(u,c,e,E.toBinary(),i)}else Io.write(u,e,c,i)}}function xS(e,t,a,n){function s(i){let{entityId:f,timestamp:u}=i,c=t.get(f);if(c===void 0||cu)return ir.StateOutdatedTimestamp;if(i.type===ye.DELETE_COMPONENT&&!n.has(f))return ir.NoChanges;let h=0;if(n.has(f)){let E=new Et;a.serialize(n.get(f),E),h=Tc(E.toBinary(),i.data||null)}else h=Tc(null,i.data);return h===0?ir.NoChanges:h>0?ir.StateOutdatedData:ir.StateUpdatedData}return i=>{if(i.type!==ye.PUT_COMPONENT&&i.type!==ye.PUT_COMPONENT_NETWORK&&i.type!==ye.DELETE_COMPONENT&&i.type!==ye.DELETE_COMPONENT_NETWORK)return[null,n.get(i.entityId)];let f=s(i),u=i.entityId;switch(f){case ir.StateUpdatedData:case ir.StateUpdatedTimestamp:{if(t.set(u,i.timestamp),i.type===ye.PUT_COMPONENT||i.type===ye.PUT_COMPONENT_NETWORK){let c=new Et(i.data);n.set(u,a.deserialize(c))}else n.delete(u);return[null,n.get(u)]}case ir.StateOutdatedTimestamp:case ir.StateOutdatedData:if(n.has(u)){let c=new Et;return a.serialize(n.get(u),c),[{type:ye.PUT_COMPONENT,componentId:e,data:c.toBinary(),entityId:u,timestamp:t.get(u)},n.get(u)]}else return[{type:ye.DELETE_COMPONENT,componentId:e,entityId:u,timestamp:t.get(u)},void 0]}return[null,n.get(u)]}}function bS(e,t,a,n,s){return function*(){for(let i of a){let f=_S(i,t);if(s.has(i)){let u=new Et;n.serialize(s.get(i),u),yield{type:ye.PUT_COMPONENT,componentId:e,entityId:i,data:u.toBinary(),timestamp:f}}else yield{type:ye.DELETE_COMPONENT,componentId:e,entityId:i,timestamp:f}}a.clear()}}function Bp(e,t,a){let n=new Map,s=new Set,i=new Map;return{get componentId(){return t},get componentName(){return e},get componentType(){return 0},schema:a,has(f){return n.has(f)},deleteFrom(f,u=!0){let c=n.get(f);return n.delete(f)&&u&&s.add(f),c||null},entityDeleted(f,u){n.delete(f)&&u&&s.add(f)},getOrNull(f){let u=n.get(f);return u?Pp(u):null},get(f){let u=n.get(f);if(!u)throw new Error(`[getFrom] Component ${e} for entity #${f} not found`);return Pp(u)},create(f,u){if(n.get(f))throw new Error(`[create] Component ${e} for ${f} already exists`);let h=u===void 0?a.create():a.extend?a.extend(u):u;return n.set(f,h),s.add(f),h},createOrReplace(f,u){let c=u===void 0?a.create():a.extend?a.extend(u):u;return n.set(f,c),s.add(f),c},getMutableOrNull(f){let u=n.get(f);return u?(s.add(f),u):null},getOrCreateMutable(f,u){let c=n.get(f);return c?(s.add(f),c):this.create(f,u)},getMutable(f){let u=this.getMutableOrNull(f);if(u===null)throw new Error(`[mutable] Component ${e} for ${f} not found`);return u},*iterator(){for(let[f,u]of n)yield[f,u]},*dirtyIterator(){for(let f of s)yield f},getCrdtUpdates:bS(t,i,s,a,n),updateFromCrdt:xS(t,i,a,n),dumpCrdtStateToBuffer:SS(t,i,a,n)}}function og(){let e=[];function t(){e.sort((s,i)=>i.priority-s.priority)}function a(s,i,f){let u=f??s.name;if(e.find(c=>c.fn===s))throw new Error(`System ${JSON.stringify(u)} already added to the engine`);e.push({fn:s,priority:i,name:u}),t()}function n(s){let i=-1;return typeof s=="string"?i=e.findIndex(f=>f.name===s):i=e.findIndex(f=>f.fn===s),i===-1?!1:(e.splice(i,1),t(),!0)}return{add:a,remove:n,getSystems(){return e}}}var zp=ag(new Set);function ig(){throw new Error("The set is frozen")}function ag(e){return e.add=ig,e.clear=ig,e}function RS(e,t){return e.timestamp>t.timestamp?1:-1}function sg(e,t,a,n){let s=new Map,i=new Set,f=[];function u(C){let v=C.raw.length;return v>1&&C.raw[v-1].timestamp<=C.raw[v-2].timestamp}function c(C){let v=s.get(C);if(v){for(u(v)&&v.raw.sort(RS);v.raw.length>n.maxElements;)v.raw.shift();let W=ag(new Set(v?.raw.map(I=>I.value)));return v.frozenSet=W,W}else return zp}function h(C,v){let W=s.get(C);W||(W={raw:[],frozenSet:zp},s.set(C,W));let I=a.extend?a.extend(v):v,y=n.timestampFunction(I);return Ip&&Object.freeze(I),W.raw.push({value:I,timestamp:y}),{set:c(C),value:I}}return{get componentId(){return t},get componentName(){return e},get componentType(){return 1},schema:a,has(C){return s.has(C)},entityDeleted(C){s.delete(C)},get(C){let v=s.get(C);return v?v.frozenSet:zp},addValue(C,v){let{set:W,value:I}=h(C,v);i.add(C);let y=new Et;return a.serialize(I,y),f.push({componentId:t,data:y.toBinary(),entityId:C,timestamp:0,type:ye.APPEND_VALUE}),W},*iterator(){for(let[C,v]of s)yield[C,v.frozenSet]},*dirtyIterator(){for(let C of i)yield C},getCrdtUpdates(){return i.clear(),f.splice(0,f.length)},updateFromCrdt(C){if(C.type===ye.APPEND_VALUE){let v=new Et(C.data);h(C.entityId,a.deserialize(v))}return[null,void 0]},dumpCrdtStateToBuffer:function(C,v){for(let[W,{raw:I}]of s)if(!(v&&!v(W)))for(let y of I){let _=new Et;a.serialize(y.value,_),Fi.write(W,0,t,_.toBinary(),C)}}}}function*cg(e,t){if(t.has(e)){t.delete(e);for(let[a,n]of t)n.parent===e&&(yield*cg(a,t));yield e}}function vS(e,t,a){let n=new Map(e.getEntitiesWith(a));return cg(t,n)}function ug(e,t){let a=$a(e),n=Li(e);e.removeEntity(t);let s=n.getOrNull(t);if(s)for(let[i,f]of e.getEntitiesWith(a))f.entityId===s.entityId&&f.networkId===s.networkId&&ug(e,i)}function lg(e,t){let a=Co(e);if(Li(e).has(t))return ug(e,t);for(let s of vS(e,t,a))e.removeEntity(s)}var fg=[0,1,2,4,5,6,7,8,9,10,11,12,13],kS=1<<20;function dg(e){let t=rc(e),a={previousFrameMaxTimestamp:0,currentFrameMaxTimestamp:0,buttonState:new Map,thisFrameCommands:[]};function n(y,_,S){let N=t.get(S);for(let P of Array.from(N).reverse())if(P.button===_&&P.state===y)return P}function*s(y,_){let S=t.get(_);for(let N of Array.from(S).reverse())N.button===y&&(yield N)}function i(){let y=a.currentFrameMaxTimestamp;a.previousFrameMaxTimestamp=y,a.thisFrameCommands.length&&(a.thisFrameCommands=[]);for(let[,_]of e.getEntitiesWith(t)){let S=Array.from(_);for(let N=S.length-1;N>=0;N--){let P=S[N];if(P.timestamp>y&&(y=P.timestamp),P.timestamp>a.previousFrameMaxTimestamp&&a.thisFrameCommands.push(P),P.state===0||P.state===1){let oe=a.buttonState.get(P.button);if(!oe||P.timestamp>oe.timestamp)a.buttonState.set(P.button,P);else break}}}a.currentFrameMaxTimestamp=y}e.addSystem(i,kS,"@dcl/ecs#inputSystem");function f(y){return y>a.previousFrameMaxTimestamp&&y<=a.currentFrameMaxTimestamp}function u(y,_){if(y!==3)return c(y,_);for(let S of fg){let N=c(S,_);if(N)return N}return null}function c(y,_){let S=null,N=null;for(let P of s(y,_))if(N){if(!S&&P.state===1){S=P;break}}else if(P.state===0){N=P;continue}return!N||!S?null:S.timestampie.get(q))]}function _(j){let q=$l({defineComponent:v});for(let[ne,ie]of y(q))if(ie.value===j)return ne;return null}function*S(...j){let[q,...ne]=j;for(let[ie]of q.iterator()){let K=!0;for(let A of ne)if(!A.has(ie)){K=!1;break}K&&(yield[ie,...j])}}function N(){return a.getSystems()}function P(){return t.values()}function oe(j){if(n)throw new Error("Engine is already sealed. No components can be removed at this stage");let q=typeof j=="number"?j:vr(j);t.delete(q)}Co({defineComponentFromSchema:E});function ve(){n||(n=!0)}return{addEntity:f,removeEntity:u,removeEntityWithChildren:c,addSystem:s,getSystems:N,removeSystem:i,defineComponent:v,defineComponentFromSchema:E,defineValueSetComponentFromSchema:C,getEntitiesWith:y,getComponent:W,getComponentOrNull:I,getEntityOrNullByName:_,removeComponentDefinition:oe,registerComponentDefinition:h,entityContainer:e,componentsIter:P,seal:ve}}function mg(e){let t=wS(),a=ng(t,e?.onChangeFunction||null);async function n(s){await a.receiveMessages();for(let f of t.getSystems()){let u=f.fn(s);Ec(u,`A system (${f.name||"anonymous"}) returned a thenable. Systems cannot be async functions. Documentation: https://dcl.gg/sdk/sync-systems`)}let i=t.entityContainer.releaseRemovedEntities();await a.sendMessages(i)}return{addEntity:t.addEntity,removeEntity:t.removeEntity,removeEntityWithChildren:t.removeEntityWithChildren,addSystem:t.addSystem,removeSystem:t.removeSystem,defineComponent:t.defineComponent,defineComponentFromSchema:t.defineComponentFromSchema,defineValueSetComponentFromSchema:t.defineValueSetComponentFromSchema,registerComponentDefinition:t.registerComponentDefinition,getEntitiesWith:t.getEntitiesWith,getComponent:t.getComponent,getComponentOrNull:t.getComponentOrNull,removeComponentDefinition:t.removeComponentDefinition,componentsIter:t.componentsIter,seal:t.seal,getEntityOrNullByName:t.getEntityOrNullByName,update:n,RootEntity:0,PlayerEntity:1,CameraEntity:2,getEntityState:t.entityContainer.getEntityState,addTransport:a.addTransport,entityContainer:t.entityContainer}}function AS(e){let t=Array.from(e);return e.length=0,t}function hg(e){let t=[];async function a(s){try{return await s()}catch(i){console.error(i)}}function n(){for(let s of AS(t))a(s).catch(console.error)}return e.addSystem(n),function(s){t.push(s)}}function yg(e,t){let a=nc(e),n;(function(W){W[W.Click=0]="Click",W[W.Down=1]="Down",W[W.Up=2]="Up"})(n||(n={}));let s=(W={})=>({button:3,...W}),i=new Map;function f(W){return i.get(W)||i.set(W,new Map).get(W)}function u(W,I,y){(y.hoverText||y.showFeedback)&&(a.getMutableOrNull(W)||a.create(W)).pointerEvents.push({eventType:I,eventInfo:{button:y.button,showFeedback:y.showFeedback,hoverText:y.hoverText,maxDistance:y.maxDistance}})}function c(W,I,y){let _=a.getMutableOrNull(W);_&&(_.pointerEvents=_.pointerEvents.filter(S=>!(S.eventInfo?.button===y&&S.eventType===I)))}function h(W){return W===n.Up?0:1}function E(W,I){let y=f(W),_=y.get(I);_?.opts.hoverText&&c(W,h(I),_.opts.button),y.delete(I)}e.addSystem(function(){for(let[I,y]of i){if(e.getEntityState(I)===Zt.Removed){i.delete(I);continue}for(let[_,{cb:S,opts:N}]of y){if(_===n.Click){let P=t.getClick(N.button,I);P&&Ec(S(P.up),"Click event returned a thenable. Only synchronous functions are allowed")}if(_===n.Down||_===n.Up){let P=t.getInputCommand(N.button,h(_),I);P&&Ec(S(P),"Event handler returned a thenable. Only synchronous functions are allowed")}}}});let C=(...W)=>{let[I,y,_]=W;if(typeof I=="number")return C({entity:I,opts:_??{}},y);let{entity:S,opts:N}=I,P=s(N);E(S,n.Down),f(S).set(n.Down,{cb:y,opts:P}),u(S,1,P)},v=(...W)=>{let[I,y,_]=W;if(typeof I=="number")return v({entity:I,opts:_??{}},y);let{entity:S,opts:N}=I,P=s(N);E(S,n.Up),f(S).set(n.Up,{cb:y,opts:P}),u(S,0,P)};return{removeOnClick(W){E(W,n.Click)},removeOnPointerDown(W){E(W,n.Down)},removeOnPointerUp(W){E(W,n.Up)},onClick(W,I){let{entity:y}=W,_=s(W.opts);E(y,n.Click),f(y).set(n.Click,{cb:I,opts:_}),u(y,1,_)},onPointerDown:C,onPointerUp:v}}function gg(e){let t=Zl(e),a=Ul(e),n=zl(e),s=new Map;function i(h){let E=a.getOrNull(h),C=t.getOrNull(h),v=s.get(h);return!E||!C?!1:!!((f(h)||E.state===1)&&!v?.completed&&(v?.frames??0)>2)}function f(h){let E=t.getOrNull(h),C=s.get(h)?.tween;if(E&&!C||!E&&C)return!0;let v=new Et;return t.schema.serialize(E,v),Tc(v.toBinary(),C)}let u=[];e.addSystem(()=>{for(let h of u)h();u.length=0;for(let[h,E]of e.getEntitiesWith(t)){if(f(h)){let v=new Et;t.schema.serialize(E,v),s.set(h,{tween:v.toBinary(),frames:0,completed:!1,changed:!0});continue}let C=s.get(h);if(C.frames+=1,C.changed=!1,i(h)){C.frames=0,C.completed=!0;let v=n.getOrNull(h);if(!v)continue;let{sequence:W}=v;if(W&&W.length){let[I,...y]=W;t.createOrReplace(h,I);let _=n.getMutable(h);_.sequence=y,v.loop===0&&_.sequence.push(E)}else v.loop===1?t.createOrReplace(h,c(E)):v.loop===0&&(t.deleteFrom(h),s.delete(h),u.push(()=>{t.createOrReplace(h,E)}))}}},Number.NEGATIVE_INFINITY);function c(h){if(h.mode?.$case==="move"&&h.mode.move)return{...h,mode:{...h.mode,move:{start:h.mode.move.end,end:h.mode.move.start}}};if(h.mode?.$case==="rotate"&&h.mode.rotate)return{...h,mode:{...h.mode,rotate:{start:h.mode.rotate.end,end:h.mode.rotate.start}}};if(h.mode?.$case==="scale"&&h.mode.scale)return{...h,mode:{...h.mode,scale:{start:h.mode.scale.end,end:h.mode.scale.start}}};throw new Error("Invalid tween")}return{tweenCompleted:i}}var G=mg(),os=dg(G),Mo=yg(G,os);var BO=gg(G),Eg=hg(G);var Fn=dp(G),Up=pp(G),_c=mp(G);var Tg=hp(G),Lp=yp(G),$t=gp(G),_g=Ep(G);var ao=nc(G),Sg=rc(G);var sr=Rp(G);var xg=oc(G);var is=ic(G),Dp=ac(G);var as=Wl(G),wt=Np(G);var nf;(function(e){e[e.CT_FIRST_PERSON=0]="CT_FIRST_PERSON",e[e.CT_THIRD_PERSON=1]="CT_THIRD_PERSON",e[e.CT_CINEMATIC=2]="CT_CINEMATIC"})(nf||(nf={}));var Bn;(function(e){e[e.IA_POINTER=0]="IA_POINTER",e[e.IA_PRIMARY=1]="IA_PRIMARY",e[e.IA_SECONDARY=2]="IA_SECONDARY",e[e.IA_ANY=3]="IA_ANY",e[e.IA_FORWARD=4]="IA_FORWARD",e[e.IA_BACKWARD=5]="IA_BACKWARD",e[e.IA_RIGHT=6]="IA_RIGHT",e[e.IA_LEFT=7]="IA_LEFT",e[e.IA_JUMP=8]="IA_JUMP",e[e.IA_WALK=9]="IA_WALK",e[e.IA_ACTION_3=10]="IA_ACTION_3",e[e.IA_ACTION_4=11]="IA_ACTION_4",e[e.IA_ACTION_5=12]="IA_ACTION_5",e[e.IA_ACTION_6=13]="IA_ACTION_6"})(Bn||(Bn={}));var cr;(function(e){e[e.PET_UP=0]="PET_UP",e[e.PET_DOWN=1]="PET_DOWN",e[e.PET_HOVER_ENTER=2]="PET_HOVER_ENTER",e[e.PET_HOVER_LEAVE=3]="PET_HOVER_LEAVE"})(cr||(cr={}));var bg;(function(e){e[e.UNKNOWN=0]="UNKNOWN",e[e.LOADING=1]="LOADING",e[e.NOT_FOUND=2]="NOT_FOUND",e[e.FINISHED_WITH_ERROR=3]="FINISHED_WITH_ERROR",e[e.FINISHED=4]="FINISHED"})(bg||(bg={}));var rf;(function(e){e[e.TAM_TOP_LEFT=0]="TAM_TOP_LEFT",e[e.TAM_TOP_CENTER=1]="TAM_TOP_CENTER",e[e.TAM_TOP_RIGHT=2]="TAM_TOP_RIGHT",e[e.TAM_MIDDLE_LEFT=3]="TAM_MIDDLE_LEFT",e[e.TAM_MIDDLE_CENTER=4]="TAM_MIDDLE_CENTER",e[e.TAM_MIDDLE_RIGHT=5]="TAM_MIDDLE_RIGHT",e[e.TAM_BOTTOM_LEFT=6]="TAM_BOTTOM_LEFT",e[e.TAM_BOTTOM_CENTER=7]="TAM_BOTTOM_CENTER",e[e.TAM_BOTTOM_RIGHT=8]="TAM_BOTTOM_RIGHT"})(rf||(rf={}));var Rg;(function(e){e[e.F_SANS_SERIF=0]="F_SANS_SERIF",e[e.F_SERIF=1]="F_SERIF",e[e.F_MONOSPACE=2]="F_MONOSPACE"})(Rg||(Rg={}));function Fp(e){let t=e.getComponentOrNull("composite::root");return t||e.defineComponent("composite::root",{src:x.String,entities:x.Array(x.Map({src:x.Entity,dest:x.Entity}))})}var OS="/";function CS(e,t=!1){let a="",n=0,s=-1,i=0,f;for(let u=0;u<=e.length;++u){if(u2){let c=a.lastIndexOf("/");if(c!==a.length-1){c===-1?(a="",n=0):(a=a.slice(0,c),n=a.length-1-a.lastIndexOf("/")),s=u,i=0;continue}}else if(a.length===2||a.length===1){a="",n=0,s=u,i=0;continue}}t&&(a.length>0?a+="/..":a="..",n=2)}else a.length>0?a+="/"+e.slice(s+1,u):a=e.slice(s+1,u),n=u-s-1;s=u,i=0}else f===46&&i!==-1?++i:i=-1}return a}function of(...e){let t="",a=!1,n;for(let s=e.length-1;s>=-1&&!a;s--){let i;s>=0?i=e[s]:(n===void 0&&(n=OS),i=n),i.length!==0&&(t=i+"/"+t,a=i.charCodeAt(0)===47)}return t=CS(t,!a),a?t.length>0?"/"+t:"/":t.length>0?t:"."}function vg(e){if(e.length===0)return".";let t=e.charCodeAt(0),a=t===47,n=-1,s=!0;for(let i=e.length-1;i>=1;--i)if(t=e.charCodeAt(i),t===47){if(!s){n=i;break}}else s=!1;return n===-1?a?"/":".":a&&n===1?"//":e.slice(0,n)}function af(e,t){return(e.startsWith(".")?of(t,e):of(e)).substring(1)}var ss;(function(e){e[e.EMM_NONE=0]="EMM_NONE",e[e.EMM_NEXT_AVAILABLE=1]="EMM_NEXT_AVAILABLE",e[e.EMM_DIRECT_MAPPING=2]="EMM_DIRECT_MAPPING"})(ss||(ss={}));function kg(e,t){return t.data?.$case==="json"?t.data.json:e.schema.deserialize(new Et(t.data?.binary))}function MS(e,t){let a=e.getComponentOrNull(t.name);if(a)return a;if(t.name.startsWith("core::")){if(t.name in wp)return wp[t.name](e);throw new Error(`The core component ${t.name} was not found.`)}else{if(t.jsonSchema)return e.defineComponentFromSchema(t.name,x.fromJson(t.jsonSchema));throw new Error(`${t.name} is not defined and there is no schema to define it.`)}}function PS(e,t,a,{entityMapping:n}){let s=a.get(t);if(s)return s;if(n?.type===ss.EMM_DIRECT_MAPPING){let f=n.getCompositeEntity(t);return a.set(t,f),f}let i=n?.type===ss.EMM_NEXT_AVAILABLE?n.getNextAvailableEntity():e.addEntity();if(i===null)throw new Error("There is no more entities to allocate");return a.set(t,i),i}function jp(e,t,a,n){let{rootEntity:s,alreadyRequestedSrc:i,entityMapping:f}=n,u=i||new Set,c=vg(of(t.src)),h=vr("core::Transform"),E=Fp(e),C=new Map,v=_=>PS(e,_,C,n),W=s??v(0);s&&C.set(0,s);let I=t.composite.components.find(_=>_.name===E.componentName);if(I)for(let[_,S]of I.data){let N=kg(E,S),P=af(N.src,c),oe=a.getCompositeOrNull(P),ve=v(_);if(oe){if(u.has(oe.src)||oe.src===t.src)throw new Error(`Composite ${t.src} has a recursive instanciation while try to instance ${oe.src}. Previous instances: ${u.toString()}`);jp(e,oe,a,{rootEntity:ve,alreadyRequestedSrc:new Set(u).add(oe.src),entityMapping:f?.type===ss.EMM_NEXT_AVAILABLE?f:void 0})}}for(let _ of t.composite.components){if(_.name===E.componentName)continue;let S=MS(e,_);for(let[N,P]of _.data){let oe=kg(S,P),ve=v(N),j=S.create(ve,oe);if(S.componentId===h){let q=j;q.parent?q.parent=v(q.parent):q.parent=v(0)}else x.mutateNestedValues(S.schema.jsonSchema,j,(q,ne)=>ne.serializationType==="entity"?{changed:!0,value:v(q)}:{changed:!1})}}let y=E.getMutableOrNull(W)||E.create(W);for(let[_,S]of C)y.entities.push({src:_,dest:S});return y.src=t.src,W}var lr=Ue(Le());var ur=Ue(Le());var Ng;(function(e){e[e.NULL_VALUE=0]="NULL_VALUE"})(Ng||(Ng={}));function BS(e){switch(e){case 0:case"NULL_VALUE":return 0;default:throw new Cg.Error("Unrecognized enum value "+e+" for enum NullValue")}}function zS(e){switch(e){case 0:return"NULL_VALUE";default:throw new Cg.Error("Unrecognized enum value "+e+" for enum NullValue")}}function wg(){return{fields:new Map}}var cs;(function(e){function t(u,c=ur.default.Writer.create()){return u.fields.forEach((h,E)=>{h!==void 0&&sf.encode({key:E,value:h},c.uint32(10).fork()).ldelim()}),c}e.encode=t;function a(u,c){let h=u instanceof ur.default.Reader?u:ur.default.Reader.create(u),E=c===void 0?h.len:h.pos+c,C=wg();for(;h.pos>>3){case 1:if(v!==10)break;let W=sf.decode(h,h.uint32());W.value!==void 0&&C.fields.set(W.key,W.value);continue}if((v&7)===4||v===0)break;h.skipType(v&7)}return C}e.decode=a;function n(u){return{fields:LS(u.fields)?Object.entries(u.fields).reduce((c,[h,E])=>(c.set(h,E),c),new Map):new Map}}e.fromJSON=n;function s(u){let c={};return c.fields={},u.fields&&u.fields.forEach((h,E)=>{c.fields[E]=h}),c}e.toJSON=s;function i(u){let c=wg();return u!==void 0&&Object.keys(u).forEach(h=>{c.fields.set(h,u[h])}),c}e.wrap=i;function f(u){let c={};return[...u.fields.keys()].forEach(h=>{c[h]=u.fields.get(h)}),c}e.unwrap=f})(cs||(cs={}));function US(){return{key:"",value:void 0}}var sf;(function(e){function t(i,f=ur.default.Writer.create()){return i.key!==""&&f.uint32(10).string(i.key),i.value!==void 0&&fn.encode(fn.wrap(i.value),f.uint32(18).fork()).ldelim(),f}e.encode=t;function a(i,f){let u=i instanceof ur.default.Reader?i:ur.default.Reader.create(i),c=f===void 0?u.len:u.pos+f,h=US();for(;u.pos>>3){case 1:if(E!==10)break;h.key=u.string();continue;case 2:if(E!==18)break;h.value=fn.unwrap(fn.decode(u,u.uint32()));continue}if((E&7)===4||E===0)break;u.skipType(E&7)}return h}e.decode=a;function n(i){return{key:si(i.key)?String(i.key):"",value:si(i?.value)?i.value:void 0}}e.fromJSON=n;function s(i){let f={};return i.key!==void 0&&(f.key=i.key),i.value!==void 0&&(f.value=i.value),f}e.toJSON=s})(sf||(sf={}));function Ag(){return{kind:void 0}}var fn;(function(e){function t(u,c=ur.default.Writer.create()){switch(u.kind?.$case){case"nullValue":c.uint32(8).int32(u.kind.nullValue);break;case"numberValue":c.uint32(17).double(u.kind.numberValue);break;case"stringValue":c.uint32(26).string(u.kind.stringValue);break;case"boolValue":c.uint32(32).bool(u.kind.boolValue);break;case"structValue":cs.encode(cs.wrap(u.kind.structValue),c.uint32(42).fork()).ldelim();break;case"listValue":us.encode(us.wrap(u.kind.listValue),c.uint32(50).fork()).ldelim();break}return c}e.encode=t;function a(u,c){let h=u instanceof ur.default.Reader?u:ur.default.Reader.create(u),E=c===void 0?h.len:h.pos+c,C=Ag();for(;h.pos>>3){case 1:if(v!==8)break;C.kind={$case:"nullValue",nullValue:h.int32()};continue;case 2:if(v!==17)break;C.kind={$case:"numberValue",numberValue:h.double()};continue;case 3:if(v!==26)break;C.kind={$case:"stringValue",stringValue:h.string()};continue;case 4:if(v!==32)break;C.kind={$case:"boolValue",boolValue:h.bool()};continue;case 5:if(v!==42)break;C.kind={$case:"structValue",structValue:cs.unwrap(cs.decode(h,h.uint32()))};continue;case 6:if(v!==50)break;C.kind={$case:"listValue",listValue:us.unwrap(us.decode(h,h.uint32()))};continue}if((v&7)===4||v===0)break;h.skipType(v&7)}return C}e.decode=a;function n(u){return{kind:si(u.nullValue)?{$case:"nullValue",nullValue:BS(u.nullValue)}:si(u.numberValue)?{$case:"numberValue",numberValue:Number(u.numberValue)}:si(u.stringValue)?{$case:"stringValue",stringValue:String(u.stringValue)}:si(u.boolValue)?{$case:"boolValue",boolValue:!!u.boolValue}:si(u.structValue)?{$case:"structValue",structValue:u.structValue}:si(u.listValue)?{$case:"listValue",listValue:[...u.listValue]}:void 0}}e.fromJSON=n;function s(u){let c={};return u.kind?.$case==="nullValue"&&(c.nullValue=u.kind?.nullValue!==void 0?zS(u.kind?.nullValue):void 0),u.kind?.$case==="numberValue"&&(c.numberValue=u.kind?.numberValue),u.kind?.$case==="stringValue"&&(c.stringValue=u.kind?.stringValue),u.kind?.$case==="boolValue"&&(c.boolValue=u.kind?.boolValue),u.kind?.$case==="structValue"&&(c.structValue=u.kind?.structValue),u.kind?.$case==="listValue"&&(c.listValue=u.kind?.listValue),c}e.toJSON=s;function i(u){let c=Ag();if(u===null)c.kind={$case:"nullValue",nullValue:0};else if(typeof u=="boolean")c.kind={$case:"boolValue",boolValue:u};else if(typeof u=="number")c.kind={$case:"numberValue",numberValue:u};else if(typeof u=="string")c.kind={$case:"stringValue",stringValue:u};else if(Array.isArray(u))c.kind={$case:"listValue",listValue:u};else if(typeof u=="object")c.kind={$case:"structValue",structValue:u};else if(typeof u<"u")throw new Error("Unsupported any value type: "+typeof u);return c}e.wrap=i;function f(u){return u.kind?.$case==="nullValue"?null:u.kind?.$case==="numberValue"?u.kind?.numberValue:u.kind?.$case==="stringValue"?u.kind?.stringValue:u.kind?.$case==="boolValue"?u.kind?.boolValue:u.kind?.$case==="structValue"?u.kind?.structValue:u.kind?.$case==="listValue"?u.kind?.listValue:void 0}e.unwrap=f})(fn||(fn={}));function Og(){return{values:[]}}var us;(function(e){function t(u,c=ur.default.Writer.create()){for(let h of u.values)fn.encode(fn.wrap(h),c.uint32(10).fork()).ldelim();return c}e.encode=t;function a(u,c){let h=u instanceof ur.default.Reader?u:ur.default.Reader.create(u),E=c===void 0?h.len:h.pos+c,C=Og();for(;h.pos>>3){case 1:if(v!==10)break;C.values.push(fn.unwrap(fn.decode(h,h.uint32())));continue}if((v&7)===4||v===0)break;h.skipType(v&7)}return C}e.decode=a;function n(u){return{values:Array.isArray(u?.values)?[...u.values]:[]}}e.fromJSON=n;function s(u){let c={};return u.values?c.values=u.values.map(h=>h):c.values=[],c}e.toJSON=s;function i(u){let c=Og();return c.values=u??[],c}e.wrap=i;function f(u){return u?.hasOwnProperty("values")&&Array.isArray(u.values)?u.values:u}e.unwrap=f})(us||(us={}));var Cg=(()=>{if(typeof globalThis<"u")return globalThis;if(typeof self<"u")return self;if(typeof global<"u")return global;throw"Unable to locate global object"})();function LS(e){return typeof e=="object"&&e!==null}function si(e){return e!=null}function DS(){return{data:void 0}}var ci;(function(e){function t(i,f=lr.default.Writer.create()){switch(i.data?.$case){case"json":fn.encode(fn.wrap(i.data.json),f.uint32(10).fork()).ldelim();break;case"binary":f.uint32(18).bytes(i.data.binary);break}return f}e.encode=t;function a(i,f){let u=i instanceof lr.default.Reader?i:lr.default.Reader.create(i),c=f===void 0?u.len:u.pos+f,h=DS();for(;u.pos>>3){case 1:if(E!==10)break;h.data={$case:"json",json:fn.unwrap(fn.decode(u,u.uint32()))};continue;case 2:if(E!==18)break;h.data={$case:"binary",binary:u.bytes()};continue}if((E&7)===4||E===0)break;u.skipType(E&7)}return h}e.decode=a;function n(i){return{data:Hi(i.json)?{$case:"json",json:i.json}:Hi(i.binary)?{$case:"binary",binary:HS(i.binary)}:void 0}}e.fromJSON=n;function s(i){let f={};return i.data?.$case==="json"&&(f.json=i.data?.json),i.data?.$case==="binary"&&(f.binary=i.data?.binary!==void 0?VS(i.data?.binary):void 0),f}e.toJSON=s})(ci||(ci={}));function FS(){return{name:"",jsonSchema:void 0,data:new Map}}var ls;(function(e){function t(i,f=lr.default.Writer.create()){return i.name!==""&&f.uint32(10).string(i.name),i.jsonSchema!==void 0&&fn.encode(fn.wrap(i.jsonSchema),f.uint32(18).fork()).ldelim(),i.data.forEach((u,c)=>{cf.encode({key:c,value:u},f.uint32(26).fork()).ldelim()}),f}e.encode=t;function a(i,f){let u=i instanceof lr.default.Reader?i:lr.default.Reader.create(i),c=f===void 0?u.len:u.pos+f,h=FS();for(;u.pos>>3){case 1:if(E!==10)break;h.name=u.string();continue;case 2:if(E!==18)break;h.jsonSchema=fn.unwrap(fn.decode(u,u.uint32()));continue;case 3:if(E!==26)break;let C=cf.decode(u,u.uint32());C.value!==void 0&&h.data.set(C.key,C.value);continue}if((E&7)===4||E===0)break;u.skipType(E&7)}return h}e.decode=a;function n(i){return{name:Hi(i.name)?String(i.name):"",jsonSchema:Hi(i?.jsonSchema)?i.jsonSchema:void 0,data:GS(i.data)?Object.entries(i.data).reduce((f,[u,c])=>(f.set(Number(u),ci.fromJSON(c)),f),new Map):new Map}}e.fromJSON=n;function s(i){let f={};return i.name!==void 0&&(f.name=i.name),i.jsonSchema!==void 0&&(f.jsonSchema=i.jsonSchema),f.data={},i.data&&i.data.forEach((u,c)=>{f.data[c]=ci.toJSON(u)}),f}e.toJSON=s})(ls||(ls={}));function jS(){return{key:0,value:void 0}}var cf;(function(e){function t(i,f=lr.default.Writer.create()){return i.key!==0&&f.uint32(8).int32(i.key),i.value!==void 0&&ci.encode(i.value,f.uint32(18).fork()).ldelim(),f}e.encode=t;function a(i,f){let u=i instanceof lr.default.Reader?i:lr.default.Reader.create(i),c=f===void 0?u.len:u.pos+f,h=jS();for(;u.pos>>3){case 1:if(E!==8)break;h.key=u.int32();continue;case 2:if(E!==18)break;h.value=ci.decode(u,u.uint32());continue}if((E&7)===4||E===0)break;u.skipType(E&7)}return h}e.decode=a;function n(i){return{key:Hi(i.key)?Number(i.key):0,value:Hi(i.value)?ci.fromJSON(i.value):void 0}}e.fromJSON=n;function s(i){let f={};return i.key!==void 0&&(f.key=Math.round(i.key)),i.value!==void 0&&(f.value=i.value?ci.toJSON(i.value):void 0),f}e.toJSON=s})(cf||(cf={}));function WS(){return{version:0,components:[]}}var Wi;(function(e){function t(i,f=lr.default.Writer.create()){i.version!==0&&f.uint32(8).int32(i.version);for(let u of i.components)ls.encode(u,f.uint32(18).fork()).ldelim();return f}e.encode=t;function a(i,f){let u=i instanceof lr.default.Reader?i:lr.default.Reader.create(i),c=f===void 0?u.len:u.pos+f,h=WS();for(;u.pos>>3){case 1:if(E!==8)break;h.version=u.int32();continue;case 2:if(E!==18)break;h.components.push(ls.decode(u,u.uint32()));continue}if((E&7)===4||E===0)break;u.skipType(E&7)}return h}e.decode=a;function n(i){return{version:Hi(i.version)?Number(i.version):0,components:Array.isArray(i?.components)?i.components.map(f=>ls.fromJSON(f)):[]}}e.fromJSON=n;function s(i){let f={};return i.version!==void 0&&(f.version=Math.round(i.version)),i.components?f.components=i.components.map(u=>u?ls.toJSON(u):void 0):f.components=[],f}e.toJSON=s})(Wi||(Wi={}));var fs=(()=>{if(typeof globalThis<"u")return globalThis;if(typeof self<"u")return self;if(typeof global<"u")return global;throw"Unable to locate global object"})();function HS(e){if(fs.Buffer)return Uint8Array.from(fs.Buffer.from(e,"base64"));{let t=fs.atob(e),a=new Uint8Array(t.length);for(let n=0;n{t.push(String.fromCharCode(a))}),fs.btoa(t.join(""))}}function GS(e){return typeof e=="object"&&e!==null}function Hi(e){return e!=null}var ui;(function(e){function t(u){return Wi.fromJSON(u)}e.fromJson=t;function a(u){return Wi.decode(u)}e.fromBinary=a;function n(u){return Wi.toJSON(u)}e.toJson=n;function s(u){return Wi.encode(u).finish()}e.toBinary=s;function i(u,c,h,E={}){jp(u,c,h,E)}e.instance=i;function f(u,c="/"){return af(u,c)}e.resolveAndNormalizePath=f})(ui||(ui={}));var Re=Co(G),mt=Y1(G),Tn=G1(G),so=q1(G),Sc=Q1(G),RC=$l(G),uf=Zl(G),ds=J1(G),ps=Li(G),lf=$a(G);var li=.45454545454545453,fi=2.2,Ig=1e-6,xc=Math.PI/180,bc=360/(Math.PI*2);var Ve;(function(e){e.TwoPi=Math.PI*2;function t(j,q,ne=1401298e-51){let ie=j-q;return-ne<=ie&&ie<=ne}e.withinEpsilon=t;function a(j){let q=j.toString(16);return j<=15?("0"+q).toUpperCase():q.toUpperCase()}e.toHex=a;function n(j){let q=+j;return q===0||isNaN(q)?q:q>0?1:-1}e.sign=n;function s(j,q=0,ne=1){return Math.min(ne,Math.max(q,j))}e.clamp=s;function i(j){return Math.log(j)*Math.LOG2E}e.log2=i;function f(j,q){return j-Math.floor(j/q)*q}e.repeat=f;function u(j,q,ne){return(j-q)/(ne-q)}e.normalize=u;function c(j,q,ne){return j*(ne-q)+q}e.denormalize=c;function h(j,q){let ne=f(q-j,360);return ne>180&&(ne-=360),ne}e.deltaAngle=h;function E(j,q){let ne=f(j,q*2);return q-Math.abs(ne-q)}e.pingPong=E;function C(j,q,ne){let ie=s(ne);return ie=-2*ie*ie*ie+3*ie*ie,q*ie+j*(1-ie)}e.smoothStep=C;function v(j,q,ne){let ie=0;return Math.abs(q-j)<=ne?ie=q:ie=j+n(q-j)*ne,ie}e.moveTowards=v;function W(j,q,ne){let ie=h(j,q),K=0;return-ne180&&(ie-=360),j+ie*s(ne)}e.lerpAngle=y;function _(j,q,ne){let ie=0;return j!==q?ie=s((ne-j)/(q-j)):ie=0,ie}e.inverseLerp=_;function S(j,q,ne,ie,K){let A=K*K,M=K*A,X=2*M-3*A+1,re=-2*M+3*A,fe=M-2*A+K,we=M-A;return j*X+ne*re+q*fe+ie*we}e.hermite=S;function N(j,q){return j===q?j:Math.random()*(q-j)+j}e.randomRange=N;function P(j,q,ne){return(j-q)/(ne-q)}e.rangeToPercent=P;function oe(j,q,ne){return(ne-q)*j+q}e.percentToRange=oe;function ve(j){return j-e.TwoPi*Math.floor((j+Math.PI)/e.TwoPi)}e.normalizeRadians=ve})(Ve||(Ve={}));var D;(function(e){function t(R){let O=Math.abs(R.x),H=Math.abs(R.y);if(O!==H)return!0;let me=Math.abs(R.z);return O!==me}e.isNonUniform=t;function a(R=0,O=0,H=0){return{x:R,y:O,z:H}}e.create=a;function n(R,O){return{x:R.x+O.x,y:R.y+O.y,z:R.z+O.z}}e.add=n;function s(R,O,H){H.x=R.x+O.x,H.y=R.y+O.y,H.z=R.z+O.z}e.addToRef=s;function i(R,O){return{x:R.x-O.x,y:R.y-O.y,z:R.z-O.z}}e.subtract=i;function f(R,O,H){H.x=R.x-O.x,H.y=R.y-O.y,H.z=R.z-O.z}e.subtractToRef=f;function u(R,O,H,me,de){de.x=R.x-O,de.y=R.y-H,de.z=R.z-me}e.subtractFromFloatsToRef=u;function c(R){return{x:-R.x,y:-R.y,z:-R.z}}e.negate=c;function h(R,O){O.x=R.x,O.y=R.y,O.z=R.z}e.copyFrom=h;function E(R,O,H,me){me.x=R,me.y=O,me.z=H}e.copyFromFloats=E;function C(R){return a(R.x,R.y,R.z)}e.clone=C;function v(R,O,H,me){let de=K(R,H)-me,xe=K(O,H)-me;return de/(de-xe)}e.getClipFactor=v;function W(R,O,H){let me=ne(R),de=ne(O),xe=K(me,de),Me=a();return Fe(me,de,Me),K(Me,H)>0?Math.acos(xe):-Math.acos(xe)}e.getAngleBetweenVectors=W;function I(R,O=0){return a(R[O],R[O+1],R[O+2])}e.fromArray=I;function y(R,O){return I(R,O)}e.fromFloatArray=y;function _(R,O,H){H.x=R[O],H.y=R[O+1],H.z=R[O+2]}e.fromArrayToRef=_;function S(R,O,H){return _(R,O,H)}e.fromFloatArrayToRef=S;function N(R){return Math.sqrt(R.x*R.x+R.y*R.y+R.z*R.z)}e.length=N;function P(R){return R.x*R.x+R.y*R.y+R.z*R.z}e.lengthSquared=P;function oe(R,O,H){H.x=R.x*O,H.y=R.y*O,H.z=R.z*O}e.scaleToRef=oe;function ve(R,O){return a(R.x*O,R.y*O,R.z*O)}e.scale=ve;function j(R,O){let H=a(0,0,0);return q(R,O,H),H}e.normalizeFromLength=j;function q(R,O,H){if(O===0||O===1){h(R,H);return}oe(R,1/O,H)}e.normalizeFromLengthToRef=q;function ne(R){return j(R,N(R))}e.normalize=ne;function ie(R,O){q(R,N(R),O)}e.normalizeToRef=ie;function K(R,O){return R.x*O.x+R.y*O.y+R.z*O.z}e.dot=K;function A(R,O){let H=C(R);return M(R,O,H),H}e.applyMatrix4=A;function M(R,O,H){let{x:me,y:de,z:xe}=R,Me=O._m,Ct=1/(Me[3]*me+Me[7]*de+Me[11]*xe+Me[15]);H.x=(Me[0]*me+Me[4]*de+Me[8]*xe+Me[12])*Ct,H.y=(Me[1]*me+Me[5]*de+Me[9]*xe+Me[13])*Ct,H.z=(Me[2]*me+Me[6]*de+Me[10]*xe+Me[14])*Ct}e.applyMatrix4ToRef=M;function X(R,O){let H=a();return re(R,O,H),H}e.rotate=X;function re(R,O,H){let{x:me,y:de,z:xe}=R,{x:Me,y:Ct,z:on,w:It}=O,Nr=It*me+Ct*xe-on*de,Eo=It*de+on*me-Me*xe,Vr=It*xe+Me*de-Ct*me,Gr=-Me*me-Ct*de-on*xe;H.x=Nr*It+Gr*-Me+Eo*-on-Vr*-Ct,H.y=Eo*It+Gr*-Ct+Vr*-Me-Nr*-on,H.z=Vr*It+Gr*-on+Nr*-Ct-Eo*-Me}e.rotateToRef=re;function fe(R,O,H){let me=a(0,0,0);return we(R,O,H,me),me}e.lerp=fe;function we(R,O,H,me){me.x=R.x+(O.x-R.x)*H,me.y=R.y+(O.y-R.y)*H,me.z=R.z+(O.z-R.z)*H}e.lerpToRef=we;function De(R,O){let H=go();return Fe(R,O,H),H}e.cross=De;function Fe(R,O,H){H.x=R.y*O.z-R.z*O.y,H.y=R.z*O.x-R.x*O.z,H.z=R.x*O.y-R.y*O.x}e.crossToRef=Fe;function Ge(R,O){let H=go();return Ye(R,O,H),H}e.transformCoordinates=Ge;function Ye(R,O,H){return rt(R.x,R.y,R.z,O,H)}e.transformCoordinatesToRef=Ye;function rt(R,O,H,me,de){let xe=me._m,Me=R*xe[0]+O*xe[4]+H*xe[8]+xe[12],Ct=R*xe[1]+O*xe[5]+H*xe[9]+xe[13],on=R*xe[2]+O*xe[6]+H*xe[10]+xe[14],It=1/(R*xe[3]+O*xe[7]+H*xe[11]+xe[15]);de.x=Me*It,de.y=Ct*It,de.z=on*It}e.transformCoordinatesFromFloatsToRef=rt;function Ke(R,O){let H=go();return Tt(R,O,H),H}e.transformNormal=Ke;function Tt(R,O,H){He(R.x,R.y,R.z,O,H)}e.transformNormalToRef=Tt;function He(R,O,H,me,de){let xe=me._m;de.x=R*xe[0]+O*xe[4]+H*xe[8],de.y=R*xe[1]+O*xe[5]+H*xe[9],de.z=R*xe[2]+O*xe[6]+H*xe[10]}e.transformNormalFromFloatsToRef=He;function tn(R,O,H,me,de){let xe=de*de,Me=de*xe,Ct=.5*(2*O.x+(-R.x+H.x)*de+(2*R.x-5*O.x+4*H.x-me.x)*xe+(-R.x+3*O.x-3*H.x+me.x)*Me),on=.5*(2*O.y+(-R.y+H.y)*de+(2*R.y-5*O.y+4*H.y-me.y)*xe+(-R.y+3*O.y-3*H.y+me.y)*Me),It=.5*(2*O.z+(-R.z+H.z)*de+(2*R.z-5*O.z+4*H.z-me.z)*xe+(-R.z+3*O.z-3*H.z+me.z)*Me);return a(Ct,on,It)}e.catmullRom=tn;function F(R,O,H){let me=a();return ee(R,O,H,me),me}e.clamp=F;function ee(R,O,H,me){let de=R.x;de=de>H.x?H.x:de,de=deH.y?H.y:xe,xe=xeH.z?H.z:Me,Me=MeR.x?de.x=O:de.x=R.x,H>R.y?de.y=H:de.y=R.y,me>R.z?de.z=me:de.z=R.z}e.maximizeInPlaceFromFloatsToRef=Zn;function yo(R,O,H,me,de){O3)return;let $=b*4;g._m[$+0]=k,g._m[$+1]=w,g._m[$+2]=z,g._m[$+3]=te,$e(g)}e.setRowFromFloats=Nr;function Eo(g,b){let k=i();return Vr(g,b,k),k}e.scale=Eo;function Vr(g,b,k){for(let w=0;w<16;w++)k._m[w]=g._m[w]*b;$e(k)}e.scaleToRef=Vr;function Gr(g,b,k){for(let w=0;w<16;w++)k._m[w]+=g._m[w]*b;$e(k)}e.scaleAndAddToRef=Gr;function Cs(g,b){let k=i();yi(g,k),ce(k,b);let w=b._m;h(w[0],w[1],w[2],0,w[4],w[5],w[6],0,w[8],w[9],w[10],0,0,0,0,1,b)}e.normalMatrixToRef=Cs;function Ff(g){let b=i();return Fc(g,b),b}e.getRotationMatrix=Ff;function Fc(g,b){let k=D.Zero();if(!It(g,k)){b=W();return}let w=g._m,z=1/k.x,te=1/k.y,$=1/k.z;h(w[0]*z,w[1]*z,w[2]*z,0,w[4]*te,w[5]*te,w[6]*te,0,w[8]*$,w[9]*$,w[10]*$,0,0,0,0,1,b)}e.getRotationMatrixToRef=Fc;function $i(g){g._m[2]*=-1,g._m[6]*=-1,g._m[8]*=-1,g._m[9]*=-1,g._m[14]*=-1,$e(g)}e.toggleModelMatrixHandInPlace=$i;function jf(g){g._m[8]*=-1,g._m[9]*=-1,g._m[10]*=-1,g._m[11]*=-1,$e(g)}e.toggleProjectionMatrixHandInPlace=jf;function an(g,b,k=!1,w=!1,z=!0){g.updateFlag=a++,g.isIdentity=b,g.isIdentity3x2=b||w,g._isIdentityDirty=g.isIdentity?!1:k,g._isIdentity3x2Dirty=g.isIdentity3x2?!1:z}})(Lr||(Lr={}));var ze;(function(e){function t(A=0,M=0,X=0,re=1){return{x:A,y:M,z:X,w:re}}e.create=t;function a(A,M){return{x:A.x+M.x,y:A.y+M.y,z:A.z+M.z,w:A.w+M.w}}e.add=a;function n(A,M,X){let re=M*.5,fe=A*.5,we=X*.5,De=Math.cos(re),Fe=Math.cos(fe),Ge=Math.cos(we),Ye=Math.sin(re),rt=Math.sin(fe),Ke=Math.sin(we);return t(Fe*Ye*Ge+rt*De*Ke,rt*De*Ge-Fe*Ye*Ke,Fe*De*Ke-rt*Ye*Ge,Fe*De*Ge+rt*Ye*Ke)}e.fromRotationYawPitchRoll=n;function s(A,M,X){return n(M*xc,A*xc,X*xc)}e.fromEulerDegrees=s;function i(A){return Math.sqrt(f(A))}e.length=i;function f(A){return A.x*A.x+A.y*A.y+A.z*A.z+A.w*A.w}e.lengthSquared=f;function u(A,M){return A.x*M.x+A.y*M.y+A.z*M.z+A.w*M.w}e.dot=u;function c(A,M){let X=u(A,M);return Math.acos(Math.min(Math.abs(X),1))*2*bc}e.angle=c;function h(A,M,X){let re=c(A,M);if(re===0)return M;let fe=Math.min(1,X/re);return S(A,M,fe)}e.rotateTowards=h;function E(A,M={x:0,y:1,z:0}){let X=D.normalize(A),re=D.normalize(D.cross(M,X)),fe=D.cross(X,re),we=re.x,De=re.y,Fe=re.z,Ge=fe.x,Ye=fe.y,rt=fe.z,Ke=X.x,Tt=X.y,He=X.z,tn=we+Ye+He,F=t();if(tn>0){let U=Math.sqrt(tn+1);return F.w=U*.5,U=.5/U,F.x=(rt-Tt)*U,F.y=(Ke-Fe)*U,F.z=(De-Ge)*U,F}if(we>=Ye&&we>=He){let U=Math.sqrt(1+we-Ye-He),Q=.5/U;return F.x=.5*U,F.y=(De+Ge)*Q,F.z=(Fe+Ke)*Q,F.w=(rt-Tt)*Q,F}if(Ye>He){let U=Math.sqrt(1+Ye-we-He),Q=.5/U;return F.x=(Ge+De)*Q,F.y=.5*U,F.z=(Tt+rt)*Q,F.w=(Ke-Fe)*Q,F}let ee=Math.sqrt(1+He-we-Ye),pe=.5/ee;return F.x=(Ke+Fe)*pe,F.y=(Tt+rt)*pe,F.z=.5*ee,F.w=(De-Ge)*pe,F}e.lookRotation=E;function C(A){let M=1/i(A);return t(A.x*M,A.y*M,A.z*M,A.w*M)}e.normalize=C;function v(A,M,X=D.Up()){let re=D.normalize(A),fe=D.normalize(M),we=D.cross(re,fe),De=Math.sqrt(D.lengthSquared(re)*D.lengthSquared(fe))+D.dot(re,fe);return D.lengthSquared(we)<1e-4?Math.abs(De)<1e-4?C(t(X.x,X.y,X.z,0)):W():C(t(we.x,we.y,we.z,De))}e.fromToRotation=v;function W(){return t(0,0,0,1)}e.Identity=W;function I(A){let M=D.create(),X=A.x*A.x+A.y*A.y+A.z*A.z+A.w*A.w,re=A.x*A.w-A.y*A.z;return re>.4995*X?(M.x=Math.PI/2,M.y=2*Math.atan2(A.y,A.x),M.z=0):re<-.4995*X?(M.x=-Math.PI/2,M.y=-2*Math.atan2(A.y,A.x),M.z=0):(M.x=Math.asin(2*(A.w*A.x-A.y*A.z)),M.y=Math.atan2(2*A.w*A.y+2*A.z*A.x,1-2*(A.x*A.x+A.y*A.y)),M.z=Math.atan2(2*A.w*A.z+2*A.x*A.y,1-2*(A.z*A.z+A.x*A.x))),M.x*=bc,M.y*=bc,M.z*=bc,M.x=Ve.repeat(M.x,360),M.y=Ve.repeat(M.y,360),M.z=Ve.repeat(M.z,360),M}e.toEulerAngles=I;function y(A,M,X,re){let fe=M*.5,we=A*.5,De=X*.5,Fe=Math.cos(fe),Ge=Math.cos(we),Ye=Math.cos(De),rt=Math.sin(fe),Ke=Math.sin(we),Tt=Math.sin(De);re.x=Ge*rt*Ye+Ke*Fe*Tt,re.y=Ke*Fe*Ye-Ge*rt*Tt,re.z=Ge*Fe*Tt-Ke*rt*Ye,re.w=Ge*Fe*Ye+Ke*rt*Tt}e.fromRotationYawPitchRollToRef=y;function _(A,M){let X=A._m,re=X[0],fe=X[4],we=X[8],De=X[1],Fe=X[5],Ge=X[9],Ye=X[2],rt=X[6],Ke=X[10],Tt=re+Fe+Ke,He;Tt>0?(He=.5/Math.sqrt(Tt+1),M.w=.25/He,M.x=(rt-Ge)*He,M.y=(we-Ye)*He,M.z=(De-fe)*He):re>Fe&&re>Ke?(He=2*Math.sqrt(1+re-Fe-Ke),M.w=(rt-Ge)/He,M.x=.25*He,M.y=(fe+De)/He,M.z=(we+Ye)/He):Fe>Ke?(He=2*Math.sqrt(1+Fe-re-Ke),M.w=(we-Ye)/He,M.x=(fe+De)/He,M.y=.25*He,M.z=(Ge+rt)/He):(He=2*Math.sqrt(1+Ke-re-Fe),M.w=(De-fe)/He,M.x=(we+Ye)/He,M.y=(Ge+rt)/He,M.z=.25*He)}e.fromRotationMatrixToRef=_;function S(A,M,X){let re=e.Identity();return e.slerpToRef(A,M,X,re),re}e.slerp=S;function N(A,M,X,re){let fe,we,De=A.x*M.x+A.y*M.y+A.z*M.z+A.w*M.w,Fe=!1;if(De<0&&(Fe=!0,De=-De),De>.999999)we=1-X,fe=Fe?-X:X;else{let Ge=Math.acos(De),Ye=1/Math.sin(Ge);we=Math.sin((1-X)*Ge)*Ye,fe=Fe?-Math.sin(X*Ge)*Ye:Math.sin(X*Ge)*Ye}re.x=we*A.x+fe*M.x,re.y=we*A.y+fe*M.y,re.z=we*A.z+fe*M.z,re.w=we*A.w+fe*M.w}e.slerpToRef=N;function P(A,M){let X=t(0,0,0,1);return oe(A,M,X),X}e.multiply=P;function oe(A,M,X){X.x=A.x*M.w+A.y*M.z-A.z*M.y+A.w*M.x,X.y=-A.x*M.z+A.y*M.w+A.z*M.x+A.w*M.y,X.z=A.x*M.y-A.y*M.x+A.z*M.w+A.w*M.z,X.w=-A.x*M.x-A.y*M.y-A.z*M.z+A.w*M.w}e.multiplyToRef=oe;function ve(A,M){if(D.lengthSquared(M)===0)return e.Identity();let X=W(),re=A*xc;re*=.5;let fe=D.normalize(M);return D.scaleToRef(fe,Math.sin(re),fe),X.x=fe.x,X.y=fe.y,X.z=fe.z,X.w=Math.cos(re),C(X)}e.fromAngleAxis=ve;function j(A,M,X){let re=e.create(0,0,0,0);return q(A,M,X,re),re}e.fromAxisToRotationQuaternion=j;function q(A,M,X,re){let fe=Lr.create();Lr.fromXYZAxesToRef(D.normalize(A),D.normalize(M),D.normalize(X),fe),e.fromRotationMatrixToRef(fe,re)}e.fromAxisToRotationQuaternionToRef=q;function ne(){return t(0,0,0,0)}e.Zero=ne;function ie(A,M,X=D.Up()){let re=e.Identity();return K(A,M,X,re),re}e.fromLookAt=ie;function K(A,M,X=D.Up(),re){let fe=Lr.Identity();Lr.lookAtLHToRef(A,M,X,fe),Lr.invertToRef(fe,fe),e.fromRotationMatrixToRef(fe,re)}e.fromLookAtToRef=K})(ze||(ze={}));var ct;(function(e){function t(F=0,ee=0,pe=0,U=1){return{r:F,g:ee,b:pe,a:U}}e.create=t;function a(F){if(F.substring(0,1)!=="#"||F.length!==7&&F.length!==9)return t(0,0,0,1);let ee=parseInt(F.substring(1,3),16),pe=parseInt(F.substring(3,5),16),U=parseInt(F.substring(5,7),16),Q=F.substring(7,9),_e=Q?parseInt(Q,16):255;return e.fromInts(ee,pe,U,_e)}e.fromHexString=a;function n(F,ee,pe){let U=t(0,0,0,0);return e.lerpToRef(F,ee,pe,U),U}e.lerp=n;function s(F,ee,pe,U){U.r=F.r+(ee.r-F.r)*pe,U.g=F.g+(ee.g-F.g)*pe,U.b=F.b+(ee.b-F.b)*pe,U.a=F.a+(ee.a-F.a)*pe}e.lerpToRef=s;function i(){return t(1,0,0,1)}e.Red=i;function f(){return t(0,1,0,1)}e.Green=f;function u(){return t(0,0,1,1)}e.Blue=u;function c(){return t(0,0,0,1)}e.Black=c;function h(){return t(1,1,1,1)}e.White=h;function E(){return t(.5,0,.5,1)}e.Purple=E;function C(){return t(1,0,1,1)}e.Magenta=C;function v(){return t(1,1,0,1)}e.Yellow=v;function W(){return t(.5,.5,.5,1)}e.Gray=W;function I(){return t(0,1,1,1)}e.Teal=I;function y(){return t(0,0,0,0)}e.Clear=y;function _(F,ee=1){return t(F.r,F.g,F.b,ee)}e.fromColor3=_;function S(F,ee=0){return t(F[ee],F[ee+1],F[ee+2],F[ee+3])}e.fromArray=S;function N(F,ee,pe,U){return t(F/255,ee/255,pe/255,U/255)}e.fromInts=N;function P(F,ee){if(F.length===ee*3){let pe=[];for(let U=0;U(s[s.NONE=0]="NONE",s[s.RED=1]="RED",s[s.YELLOW=2]="YELLOW",s[s.GREEN=3]="GREEN",s))(Vi||{}),df=(s=>(s[s.Empty=0]="Empty",s[s.Raw=1]="Raw",s[s.Cooked=2]="Cooked",s[s.Burned=3]="Burned",s))(df||{}),Dr=(h=>(h[h.Noodles=0]="Noodles",h[h.SushiRoll=1]="SushiRoll",h[h.CookedNoodles=2]="CookedNoodles",h[h.SlicedSushi=3]="SlicedSushi",h[h.Trash=4]="Trash",h[h.BeerGlass=5]="BeerGlass",h[h.YellowBeer=6]="YellowBeer",h[h.RedBeer=7]="RedBeer",h[h.GreenBeer=8]="GreenBeer",h))(Dr||{});var YS={1:{name:"Red",model:"assets/models/redTap.glb",position:D.create(.368,0,.31)},2:{name:"Yellow",model:"assets/models/yellowTap.glb",position:D.create(0,0,.31)},3:{name:"Green",model:"assets/models/greenTap.glb",position:D.create(-.368,0,.31)}};function pf(e){return YS[e]}var Wp=G.defineComponent("HighestID",{id:x.Number}),Fr=G.defineComponent("BeerGlass",{filled:x.Boolean,beerType:x.EnumNumber(Vi,0),drinking:x.Boolean}),Rc=G.defineComponent("PickedUp",{avatarId:x.String}),hs=G.defineComponent("TapComponent",{pouringTime:x.Number,pouring:x.Boolean,beerType:x.EnumNumber(Vi,0)}),ys=G.defineComponent("TapBase",{beerType:x.EnumNumber(Vi,0)}),Jn=G.defineComponent("Pot",{state:x.EnumNumber(df,1),hasIngredient:x.Boolean,progressBar:x.Entity,attachedEntity:x.Entity||void 0},{state:0,hasIngredient:!1,attachedEntity:void 0}),Ht=G.defineComponent("GrabableObjectComponent",{type:x.EnumNumber(Dr,0),beingProcessed:x.Boolean,processed:x.Boolean},{type:0}),co=G.defineComponent("Cooking",{active:x.Boolean,time:x.Number,progressBar:x.Entity},{active:!0,time:0}),uo=G.defineComponent("CuttingBoard",{hasRoll:x.Boolean,cutting:x.Boolean,rollChild:x.Entity||void 0,cuts:x.Number,cutTime:x.Number,totalCutTime:x.Number,modelEntity:x.Entity},{hasRoll:!1,cuts:0,rollChild:void 0,cutting:!1,cutTime:.7,totalCutTime:.7}),lo=G.defineComponent("ProgressBar",{visible:x.Boolean,active:x.Boolean,ratio:x.Number,yellowWarning:x.Number,redWarning:x.Number,fullLength:x.Number,movesUp:x.Boolean,color:x.Color4,speed:x.Number,parent:x.Entity},{visible:!0,active:!0,ratio:0,yellowWarning:.5,redWarning:.75,fullLength:1,movesUp:!0,color:ct.Green(),speed:1}),bn=G.defineComponent("CustomerData",{active:x.Boolean,dish:x.EnumNumber(Dr,0),message:x.String,speechBubble:x.Entity,receivedDish:x.Boolean,seatNumber:x.Number,timeBeforeLeaving:x.Number,timeBeforeEntering:x.Number,waitingTimer:x.Number,progressBar:x.Entity},{active:!1,receivedDish:!1,timeBeforeLeaving:30,timeBeforeEntering:10,waitingTimer:30}),en=G.defineComponent("GameData",{active:x.Boolean,playerScore:x.Number,playerMisses:x.Number,customerTimer:x.Number,customerInterval:x.Number},{active:!0,playerScore:0,playerMisses:0,customerTimer:2,customerInterval:10});var Mg=require("~system/UserIdentity");function Po(){return Re.getOrNull(G.PlayerEntity)?.position||D.create()}var vc;Eg(async()=>{let e=await(0,Mg.getUserData)({});e.data&&(vc=e.data?.userId)});function Bo(e,t=!1,a){let n=G.addEntity();return Fn.create(n,{audioClipUrl:e,loop:t,playing:!0}),Re.create(n,{position:a}),n}var Hg=require("~system/CommunicationsController");function Pg(e){let t=e.getComponent(ps.componentId),a=e.getComponent(ds.componentId);return function(n){let s=n.componentId;if([Sg.componentId,_g.componentId].includes(s))return!1;let[i]=or.fromEntityId(n.entityId);if(is.has(u)?s.get(u).networkId?!0:n.get(u).componentIds.includes(f.componentId):!1);let i;for(;i=rn.getHeader(t);)if(i.type===ye.PUT_COMPONENT){let f=ar.read(t),u=s.getOrNull(f.entityId);u?ai.write(u.entityId,f.timestamp,f.componentId,u.networkId,f.data,a):ar.write(f.entityId,f.timestamp,f.componentId,f.data,a)}else t.incrementReadOffset(i.length);return a.toBinary()}var zo;(function(e){e[e.CRDT=1]="CRDT",e[e.REQ_CRDT_STATE=2]="REQ_CRDT_STATE",e[e.RES_CRDT_STATE=3]="RES_CRDT_STATE"})(zo||(zo={}));function zg(e){let t=new Map;return{on:(a,n)=>{t.set(a,n)},emit:(a,n)=>{e(qS(a,n))},__processMessages:a=>{for(let n of a){let s=QS(n);if(!s)continue;let{sender:i,messageType:f,data:u}=s,c=t.get(f);c&&c(u,i)}}}}function qS(e,t){let a=new Uint8Array(t.byteLength+1);return a.set([e]),a.set(t,1),a}function QS(e){try{let t=0,a=new Uint8Array(e),n=new DataView(a.buffer),s=n.getUint8(t);t+=1;let i=JS(e.subarray(1,s+1));t+=s;let f=n.getUint8(t);t+=1;let u=a.subarray(t);return{sender:i,messageType:f,data:u}}catch(t){console.error("Invalid Comms message",t)}}function JS(e){let t=new Et;return t.writeBuffer(e,!0),t.readUtf8String()}var Ug=e=>e.defineComponent("players-scene",{timestamp:x.Number,userId:x.String}),mf=!1;function Vp(){mf=!0}var Hp=!1;function Lg(e,t){t({}).then(({data:a})=>{if(a?.userId){let n=a.userId,s=vr(a.userId);e.networkId=s,e.userId=n}else throw new Error("Couldn't fetch profile data")})}function Dg(e){let t=e.getComponent(Lp.componentId);if(!Hp){let a=t.getOrNull(e.RootEntity);a&&a.tickNumber>2&&(Hp=!0)}return Hp}function Fg(e,t,a){let n=e.getComponent(Lp.componentId);async function s(){if((n.getOrNull(e.RootEntity)?.tickNumber??0)>100){Vp();return}}s()}function jg(e,t){let a=e.getComponent(ps.componentId),n=e.getComponent(lf.componentId),s=e.getComponent(Re.componentId),i=e.getComponent(ds.componentId);function f(v,W,I){if(!t?.networkId)throw new Error("Profile not initialized. Called syncEntity inside the main() function.");let y={entityId:v,networkId:t.networkId};if(I!==void 0){y.networkId=0,y.entityId=I;for(let[_,S]of e.getEntitiesWith(a))if(S.networkId===y.networkId&&S.entityId===y.entityId)throw new Error("syncEntity failed because the id provided is already in use")}a.createOrReplace(v,y),i.createOrReplace(v,{componentIds:W})}function*u(v){let W=a.getOrNull(v);if(W)for(let[I,y]of e.getEntitiesWith(n))y.entityId===W.entityId&&y.networkId===W.networkId&&(yield I)}function c(v){return Array.from(u(v))[0]}function h(v){let W=n.getOrNull(v);if(W){for(let[I,y]of e.getEntitiesWith(a))if(W.networkId===y.networkId&&W.entityId===y.entityId)return I}}function E(v,W){let I=a.getOrNull(W);if(!I)throw new Error("Entity is not sync. Call syncEntity on the parent.");n.createOrReplace(v,I),s.getOrNull(v)?s.getMutable(v):s.create(v)}function C(v){if(!a.getOrNull(v))throw new Error("Entity is not sync");n.deleteFrom(v)}return{syncEntity:f,getChildren:u,getParent:h,parentEntity:E,removeParent:C,getFirstChild:c}}function Wg(e,t,a){Ug(e);let n={};Lg(n,a);let s=jg(e,n),i=[],f=zg(h=>i.push(h));function u(){let h=[...i];return i.length=0,h}let c={filter:Pg(e),send:async h=>{Dg(e)&&h.byteLength&&f.emit(zo.CRDT,h);let E=u(),C=await t({data:E});f.__processMessages(C.data)},type:"network"};return e.addTransport(c),e.addSystem(()=>Fg(e,n,s.syncEntity)),f.emit(zo.REQ_CRDT_STATE,new Uint8Array),f.on(zo.RES_CRDT_STATE,h=>{mf||(Vp(),c.onmessage(h))}),f.on(zo.REQ_CRDT_STATE,()=>{mf&&f.emit(zo.RES_CRDT_STATE,Bg(e))}),f.on(zo.CRDT,h=>{c.onmessage(h)}),{...s,myProfile:n}}var Vg=require("~system/UserIdentity"),{getChildren:kc,syncEntity:pt,parentEntity:Rn,getParent:di,myProfile:r4,removeParent:Gg,getFirstChild:o4}=Wg(G,Hg.sendBinary,Vg.getUserData);function Nc(e){let t=Re.getOrNull(e);if(!t)return D.Zero();let a=t.parent;if(a){let n=Re.get(a).rotation;return D.add(Nc(a),D.rotate(t.position,n))}else return t.position}function wc(e){let t=Re.getOrNull(e);if(!t)return ze.Identity();let a=t.parent;return a?ze.multiply(t.rotation,wc(a)):t.rotation}var At;(function(e){e.LINEAR="linear",e.EASEINQUAD="easeinquad",e.EASEOUTQUAD="easeoutquad",e.EASEQUAD="easequad",e.EASEINSINE="easeinsine",e.EASEOUTSINE="easeoutsine",e.EASESINE="easeinoutsine",e.EASEINEXPO="easeinexpo",e.EASEOUTEXPO="easeoutexpo",e.EASEEXPO="easeinoutexpo",e.EASEINELASTIC="easeinelastic",e.EASEOUTELASTIC="easeoutelastic",e.EASEELASTIC="easeinoutelastic",e.EASEINBOUNCE="easeinbounce",e.EASEOUTEBOUNCE="easeoutbounce",e.EASEBOUNCE="easeinoutbounce"})(At||(At={}));function Gp(e,t){switch(e){case At.LINEAR:return t;case At.EASEINQUAD:return KS(t);case At.EASEOUTQUAD:return XS(t);case At.EASEQUAD:return ZS(t);case At.EASEINSINE:return $S(t);case At.EASEOUTSINE:return e3(t);case At.EASESINE:return t3(t);case At.EASEINEXPO:return n3(t);case At.EASEOUTEXPO:return r3(t);case At.EASEEXPO:return o3(t);case At.EASEINELASTIC:return i3(t);case At.EASEOUTELASTIC:return a3(t);case At.EASEELASTIC:return s3(t);case At.EASEINBOUNCE:return c3(t);case At.EASEOUTEBOUNCE:return u3(t);case At.EASEBOUNCE:return l3(t);default:return t}}function KS(e){return e*e}function XS(e){return e*(2-e)}function ZS(e){return e*e/(2*(e*e-e)+1)}function $S(e){return 1-Math.cos(e*Math.PI/2)}function e3(e){return Math.sin(e*Math.PI/2)}function t3(e){return-(Math.cos(Math.PI*e)-1)/2}function n3(e){return e===0?0:Math.pow(2,10*e-10)}function r3(e){return e===1?1:1-Math.pow(2,-10*e)}function o3(e){return e===0?0:e===1?1:e<.5?Math.pow(2,20*e-10)/2:(2-Math.pow(2,-20*e+10))/2}function i3(e){let t=2*Math.PI/3;return e===0?0:e===1?1:-Math.pow(2,10*e-10)*Math.sin((e*10-10.75)*t)}function a3(e){let t=2*Math.PI/3;return e===0?0:e===1?1:Math.pow(2,-10*e)*Math.sin((e*10-.75)*t)+1}function s3(e){let t=2*Math.PI/4.5;return e===0?0:e===1?1:e<.5?-(Math.pow(2,20*e-10)*Math.sin((20*e-11.125)*t))/2:Math.pow(2,-20*e+10)*Math.sin((20*e-11.125)*t)/2+1}function c3(e){return 1-hf(1-e)}function u3(e){return hf(e)}function l3(e){return e<.5?(1-hf(1-2*e))/2:(1+hf(2*e-1))/2}function hf(e){return e<1/2.75?7.5625*e*e:e<2/2.75?7.5625*(e-=1.5/2.75)*e+.75:e<2.5/2.75?7.5625*(e-=2.25/2.75)*e+.9375:7.5625*(e-=2.625/2.75)*e+.984375}function Yg(e,t,a){let n=new Array,s=1/t,i=0;if(a){let f=e.length;for(let u=0;u=a.x&&e.y<=n.y&&t.y>=a.y&&e.z<=n.z&&t.z>=a.z}function Qg(e,t,a,n){let s=D.distanceSquared(e,a),i=t+n;return st.x&&(s+=(a.x-t.x)*(a.x-t.x)),a.yt.y&&(s+=(a.y-t.y)*(a.y-t.y)),a.zt.z&&(s+=(a.z-t.z)*(a.z-t.z)),s=1&&S.push(N)}for(let N of S){let P=W.get(N);v.deleteFrom(N),W.delete(N),P&&P()}}}function h(v,W){return function(I){v.deleteFrom(I),W.delete(I)}}function E(v,W){return function(I,y,_,S,N=At.LINEAR,P){W.set(I,P),v.createOrReplace(I,{start:y,end:_,speed:S==0?0:1/S,interpolationType:N,normalizedTime:S==0?1:0})}}function C(v){return function(W){if(!v.has(W))throw new Error(`Entity ${W} is not registered with tweens system`);return v.get(W)}}return e.addSystem(c(a,i,function(v,W,I,y){v.position=D.lerp(W,I,y)}),vn.TweenSystemPriority),e.addSystem(c(s,f,function(v,W,I,y){v.rotation=ze.slerp(W,I,y)}),vn.TweenSystemPriority),e.addSystem(c(n,u,function(v,W,I,y){v.scale=D.lerp(W,I,y)}),vn.TweenSystemPriority),{startTranslation:E(a,i),stopTranslation:h(a,i),startRotation:E(s,f),stopRotation:h(s,f),startScaling:E(n,u),stopScaling:h(n,u),getTranslationOnFinishCallback:C(i),getRotationOnFinishCallback:C(f),getScalingOnFinishCallback:C(u)}}var Ac=m3(G);function h3(e){let t=e.defineComponent("dcl.utils.PerpetualRotation",{velocity:x.Quaternion});function a(n){for(let[s,i]of e.getEntitiesWith(t,Re)){let f=ze.slerp(ze.Identity(),i.velocity,n),u=Re.getMutable(s);u.rotation=ze.normalize(ze.multiply(u.rotation,f))}}return e.addSystem(a,vn.PerpetualMotionSystemPriority),{startRotation(n,s){t.createOrReplace(n,{velocity:s})},stopRotation(n){t.deleteFrom(n)}}}var y3=h3(G);function g3(e){let t=e.defineComponent("dcl.utils.FollowPath",{points:x.Array(x.Vector3),faceDirection:x.Boolean,speed:x.Number,normalizedTime:x.Number,currentIndex:x.Number,segmentTimes:x.Array(x.Number),curveSegmentCount:x.Number}),a=new Map,n=new Map;function s(u){a.delete(u),n.delete(u),t.deleteFrom(u)}function i(u){let c=[],h=[];for(let E of a.keys()){if(e.getEntityState(E)==Zt.Removed||!t.has(E)){s(E);continue}let C=Re.getMutable(E),v=t.getMutable(E);for(v.normalizedTime=Ve.clamp(v.normalizedTime+u*v.speed,0,1),v.normalizedTime>=1&&c.push(E);v.normalizedTime>=v.segmentTimes[v.currentIndex]&&v.currentIndex0&&v.currentIndex%v.curveSegmentCount==0){let y=v.currentIndex/v.curveSegmentCount,_=v.points[v.currentIndex],S=v.points[v.currentIndex+v.curveSegmentCount];h.push({entity:E,index:y,coords:_,nextCoords:S})}v.currentIndex+=1}let W=v.segmentTimes[v.currentIndex]-v.segmentTimes[v.currentIndex-1],I=(v.segmentTimes[v.currentIndex]-v.normalizedTime)/W;C.position=D.lerp(v.points[v.currentIndex],v.points[v.currentIndex-1],I)}for(let E of h){let C=n.get(E.entity);C&&C(E.index,E.coords,E.nextCoords)}for(let E of c){let C=a.get(E);s(E),C&&C()}}e.addSystem(i,vn.PathSystemPriority);function f(u,c,h,E,C,v,W){if(c.length<2)throw new Error("At least 2 points are required to form a path.");if(h==0)throw new Error("Path duration must not be zero");if(C){let S=D.equals(c[0],c[c.length-1]);S&&(c.pop(),c.unshift(c.pop())),c=Yg(c,C,S)}else C=1;a.set(u,v),n.set(u,W);let I=0,y=[];for(let S=0;SN;)e.removeEntity(S.pop());for(;S.lengthLo||!Number.isInteger(y))throw new Error(`Bad layerMask: ${y}. Expected a non-negative integer no greater than ${Lo}`);if(_<0||_>Lo||!Number.isInteger(_))throw new Error(`Bad triggeredByMask: ${_}. Expected a non-negative integer no greater than ${Lo}`);f.set(I,[]),i.set(I,new Set),a.set(I,N),n.set(I,P),t.createOrReplace(I,{active:!0,layerMask:y,triggeredByMask:_,areas:v(S),debugColor:oe||ms.Red()})},removeTrigger(I){let y=i.get(I),_=n.get(I);for(let N of f.get(I))e.removeEntity(N);f.delete(I),i.delete(I),a.delete(I),n.delete(I),t.deleteFrom(I);let S=[];for(let[N,P]of i)P.has(I)&&(P.delete(I),S.push(N));if(_)for(let N of y)_(N);for(let N of S){let P=n.get(N);P&&P(I)}},oneTimeTrigger(I,y=pi,_=pi,S,N,P){this.addTrigger(I,y,_,S,function(oe){gf.removeTrigger(I),N&&N(oe)},void 0,P)},enableTrigger(I,y){t.getMutable(I).active=y},isTriggerEnabled(I){return t.get(I).active},getLayerMask(I){return t.get(I).layerMask},setLayerMask(I,y){if(y<0||y>Lo||!Number.isInteger(y))throw new Error(`Bad layerMask: ${y}. Expected a non-negative integer no greater than ${Lo}`);t.getMutable(I).layerMask=y},getTriggeredByMask(I){return t.get(I).triggeredByMask},setTriggeredByMask(I,y){if(y<0||y>Lo||!Number.isInteger(y))throw new Error(`Bad layerMask: ${y}. Expected a non-negative integer no greater than ${Lo}`);t.getMutable(I).triggeredByMask=y},getAreas(I){return t.get(I).areas},setAreas(I,y){t.getMutable(I).areas=v(y)},setOnEnterCallback(I,y){a.set(I,y)},setOnExitCallback(I,y){n.set(I,y)},enableDebugDraw(I){if(s=I,!I)for(let y of f.values()){for(let _ of y)e.removeEntity(_);y.length=0}},isDebugDrawEnabled(){return s}};return W.addTrigger(e.PlayerEntity,qp,pi,[{type:"box",scale:{x:.65,y:1.92,z:.65},position:{x:0,y:.15,z:0}}],void 0,void 0,ms.Green()),W}var gf=T3(G),Es=new Set;Es.add=e=>{debugger;throw new Error("EMPTY_SET is read only")};Es.delete=e=>{throw new Error("EMPTY_SET is read only")};Es.has=e=>!1;var Qp;(function(e){class t{constructor(E,C,v){this.beginSequenceNode=null,this.currentSequenceNode=null,this.running=!1,this.started=!1,this.engine=E,this.systemFn=W=>{this.update(W)},this.engine.addSystem(this.systemFn,vn.ActionSystemPriority),C&&this.startSequence(C),v&&this.setOnFinishCallback(v)}startSequence(E){this.beginSequenceNode=E.beginSequenceNode,this.currentSequenceNode=this.beginSequenceNode,this.running=!0,this.started=!1}destroy(){this.engine.removeSystem(this.systemFn)}setOnFinishCallback(E){this.onFinishCallback=E}isRunning(){return this.running}stop(){this.running=!1}resume(){this.beginSequenceNode!=null&&(this.running=!0)}reset(){this.currentSequenceNode=this.beginSequenceNode,this.running=!0,this.started=!1}getRunningAction(){let E=this.currentSequenceNode;if(this.currentSequenceNode instanceof s)do E=E.currentInnerSequence;while(E instanceof s);return E.action}update(E){if(this.running){if(!this.started){this.currentSequenceNode.onStart(),this.started=!0;return}if(!this.currentSequenceNode.hasFinish()){this.currentSequenceNode.update(E);return}this.currentSequenceNode.onFinish(),this.currentSequenceNode=this.currentSequenceNode.next,this.currentSequenceNode?this.currentSequenceNode.onStart():(this.running=!1,this.onFinishCallback&&this.onFinishCallback())}}}e.SequenceRunner=t;class a{constructor(){this.currentSequenceNode=null,this.beginSequenceNode=null,this.whileNodeStack=[]}then(E){if(this.currentSequenceNode==null)this.currentSequenceNode=new n,this.currentSequenceNode.action=E,this.beginSequenceNode=this.currentSequenceNode;else{let C=new n;C.action=E,this.currentSequenceNode=this.currentSequenceNode.then(C)}return this}if(E){let C=new i(E);return this.currentSequenceNode==null?(this.currentSequenceNode=C,this.beginSequenceNode=C):this.currentSequenceNode=this.currentSequenceNode.then(C),this}else(){let E=this.currentSequenceNode.getSequence();if(E instanceof i){E.closed=!0;let C=new f(E);this.currentSequenceNode=this.currentSequenceNode.then(C)}else throw new Error("IF statement is needed to be called before ELSE statement.");return this}endIf(){let E=this.currentSequenceNode.getSequence();if(E instanceof i||E instanceof f)E.closed=!0;else throw new Error("IF statement is needed to be called before ENDIF statement.");return this}while(E){let C=new u(E);return this.currentSequenceNode==null?(this.currentSequenceNode=C,this.beginSequenceNode=C):this.currentSequenceNode=this.currentSequenceNode.then(C),this.whileNodeStack.push(C),this}endWhile(){let E=this.currentSequenceNode.getSequence();if(E instanceof u)E.closed=!0,this.whileNodeStack.length>0&&this.whileNodeStack.splice(this.whileNodeStack.length-1,1);else throw new Error("WHILE statement is needed to be called before ENDWHILE statement.");return this}breakWhile(){if(this.whileNodeStack.length>0)this.currentSequenceNode=this.currentSequenceNode.then(new c(this.whileNodeStack[this.whileNodeStack.length-1]));else throw new Error("WHILE statement is needed to be called before BREAKWHILE statement.");return this}}e.SequenceBuilder=a;class n{constructor(){this.action=null,this.next=null}then(E){return this.next=E,E}onStart(){this.action&&this.action.onStart()}update(E){this.action&&this.action.update(E)}onFinish(){this.action&&this.action.onFinish()}hasFinish(){return this.action?this.action.hasFinished:!0}getSequence(){return this}}e.SequenceNode=n;class s extends n{constructor(){super(...arguments),this.currentInnerSequence=null,this.startingInnerSequence=null,this.closed=!1}then(E){if(this.currentInnerSequence==null)this.currentInnerSequence=E,this.startingInnerSequence=E;else{if(this.closed)return this.next=E,E;this.currentInnerSequence=this.currentInnerSequence.then(E)}return this}onStart(){this.currentInnerSequence=this.startingInnerSequence,this.currentInnerSequence&&this.currentInnerSequence.onStart()}update(E){this.currentInnerSequence&&(this.currentInnerSequence.hasFinish()?(this.currentInnerSequence.onFinish(),this.currentInnerSequence=this.currentInnerSequence.next,this.currentInnerSequence&&this.currentInnerSequence.onStart()):this.currentInnerSequence.update(E))}onFinish(){this.currentInnerSequence&&this.currentInnerSequence.onFinish()}hasFinish(){return this.currentInnerSequence==null}getSequence(){if(this.currentInnerSequence){let E=this.currentInnerSequence.getSequence();if(E instanceof s&&!E.closed)return E}return this}}class i extends s{constructor(E){super(),this.result=!1,this.condition=E}onStart(){this.result=this.condition(),this.result?super.onStart():this.currentInnerSequence=null}}class f extends s{constructor(E){super(),this.ifSequence=null,this.ifSequence=E}onStart(){this.ifSequence&&!this.ifSequence.result?super.onStart():this.currentInnerSequence=null}}class u extends s{constructor(E){super(),this.breakWhile=!1,this.condition=E}onStart(){this.breakWhile=!1,this.condition()?super.onStart():this.currentInnerSequence=null}update(E){this.currentInnerSequence&&(this.currentInnerSequence.hasFinish()?(this.currentInnerSequence.onFinish(),this.currentInnerSequence=this.currentInnerSequence.next,this.currentInnerSequence==null&&(this.currentInnerSequence=this.startingInnerSequence),this.currentInnerSequence&&this.currentInnerSequence.onStart()):this.currentInnerSequence.update(E))}hasFinish(){return this.breakWhile||!this.condition()}}class c extends n{constructor(E){super(),this.whileNode=E}onStart(){this.whileNode.breakWhile=!0}}})(Qp||(Qp={}));function Kg(e,t){let a=uo.getMutable(e);if(!a.hasRoll||a.cutting)return;let n=a.rollChild,s=Ht.getMutable(n);switch(s.type!=1&&Ef(n),a.cutting=!0,a.cuts+=1,a.cuts){case 1:mt.playSingleAnimation(t,"State1",!1);break;case 2:mt.playSingleAnimation(t,"State2",!1);break;case 3:mt.playSingleAnimation(t,"State3",!1);break;case 4:mt.playSingleAnimation(t,"State4",!1);break;case 5:if(mt.playSingleAnimation(t,"State5",!1),s.type!=1)return;Uo.setTimeout(()=>{s.type=3,$t.getMutable(n).src="assets/models/PlateSushi.glb"},300);break;case 6:mt.playSingleAnimation(t,"State5",!1),Ef(n);break;default:break}Uo.setTimeout(()=>{a.cutting=!1},500)}function Xg(e){let t=ao.getMutable(e).pointerEvents[0];t&&t.eventInfo&&(t.eventInfo.hoverText="Cut")}function Zg(e){let t=ao.getMutable(e).pointerEvents[0];t&&t.eventInfo&&(t.eventInfo.hoverText="Put",t.eventInfo.button=Bn.IA_PRIMARY),mt.stopAllAnimations(e,!0)}function Ef(e){console.log("ruin food");let t=Ht.getMutable(e);t.type=4,$t.getMutable(e).src="assets/models/GarbageFood.glb"}function Tf(e,t,a,n,s,i,f,u){let c=G.addEntity();Re.create(c,{position:D.create(0,t||1,0),scale:D.create(.82,.15,1),rotation:ze.fromEulerDegrees(0,a||0,0)}),so.setPlane(c),pt(c,[Re.componentId,wt.componentId],f),Rn(c,e);let h=G.addEntity();return Re.create(h,{position:D.create(0,0,-.03),scale:D.create(.95,.8,1)}),so.setPlane(h),Tn.setBasicMaterial(h,{diffuseColor:ct.Green()}),lo.create(h,{parent:e,color:ct.Green(),movesUp:n,ratio:n?0:1,redWarning:n?.8:.2,speed:i||1,visible:!s,active:!s}),pt(h,[Re.componentId,Tn.componentId,wt.componentId],u),Rn(h,c),s&&(wt.create(c,{visible:!1}),wt.create(h,{visible:!1})),h}function $g(e){for(let[t]of G.getEntitiesWith(lo)){let a=lo.getMutable(t);if(a.active){a.movesUp?(a.ratio+=e/10*a.speed,a.ratio>a.yellowWarning&&a.color==ct.Green()?Oc(t,ct.Yellow()):a.ratio>a.redWarning&&a.color!=ct.Red()?Oc(t,ct.Red()):a.ratio>a.fullLength&&(a.ratio=1,a.active=!1)):(a.ratio-=e/10*a.speed,a.ratioa.fullLength&&(a.active=!1);let n=Re.getMutable(t),s=Ve.lerp(0,a.fullLength,a.ratio);n.scale.x=s,n.position.x=-a.fullLength/2+s/2}}}function Oc(e,t){let a=lo.getMutable(e);a.color=t;let n=Tn.getMutable(e);Tn.setBasicMaterial(e,{diffuseColor:t})}function Do(e){let t=lo.getMutable(e);t.visible=!1,wt.createOrReplace(e,{visible:!1});let a=di(e);a&&wt.createOrReplace(a,{visible:!1})}function _f(e){let t=di(e),a=lo.getMutable(e);a.active=!0,a.movesUp?a.ratio=0:a.ratio=1,a.color=ct.Green(),a.visible=!0,wt.has(e)&&wt.deleteFrom(e),t&&wt.has(t)&&wt.deleteFrom(t),Oc(e,ct.Green())}var tE=Tn.Texture.Common({src:"assets/textures/bubble.png"}),Sf=Tn.Texture.Common({src:"assets/textures/bubble3.png"});function nE(e,t,a,n,s){let i=28,f=29,u=30;switch(t){case 1:i=28,f=29,u=30;break;case 2:i=31,f=32,u=33;break;case 3:i=34,f=35,u=36;break;case 4:i=37,f=38,u=39;break}let c=G.addEntity();Re.create(c,{position:D.create(-1,0,0),rotation:ze.fromEulerDegrees(0,180,0)});let h=G.addEntity();Re.create(h,{position:D.create(-.6,n?n-.35:.65,0),scale:D.create(1.4,1.6,1),rotation:ze.fromEulerDegrees(0,0,0)}),so.setPlane(h),wt.createOrReplace(h,{visible:!1});let E=G.addEntity();Re.create(E,{position:D.create(-1,n?n-.1:.9,-.03),scale:D.create(.85,.85,.85),rotation:ze.fromEulerDegrees(0,0,0)}),sr.create(E,{text:a,width:1.1,height:1.1,textAlign:rf.TAM_MIDDLE_LEFT,fontSize:1}),wt.createOrReplace(E,{visible:!1});let C=tE,v=ct.Gray();switch(s){case 1:C=Sf,v=ct.Green();break;case 2:C=Sf,v=ct.Red();break}return Tn.setBasicMaterial(h,{diffuseColor:v,texture:C}),pt(c,[],i),Rn(c,e),pt(h,[Tn.componentId,Re.componentId,wt.componentId],f),Rn(h,c),pt(E,[sr.componentId,Re.componentId,wt.componentId],u),Rn(E,c),c}function xf(e,t,a){let n=Array.from(kc(e)),s,i;for(let c of n)wt.deleteFrom(c),sr.has(c)&&(i=c),so.has(c)&&(s=c);if(!s||!i)return;let f=tE,u=ct.Gray();switch(a){case 1:f=Sf,u=ct.Green();break;case 2:f=Sf,u=ct.Red();break}Tn.setBasicMaterial(s,{diffuseColor:u,texture:f}),sr.getMutable(i).text=t}function rE(e){let t=Array.from(kc(e));for(let a of t)wt.createOrReplace(a,{visible:!1})}var S3=[`Me like some -noodles! Me like'em RAW!`,`RAW noodles please, -and hurry!`,`Noodles! A nice -dry brick of RAW ones!`,`Noodles! -NO cooking for me`,"HARD RAW NOODLES"],x3=[`They say you got -the best rolls, -gimme! NO slicing!`,`One roll please. -In ONE piece!`,`A full sushi roll -I can swallow in one gulp!`,"SUSHI. NO CUTTING."],b3=[`I want cooked -noodles, NOW!`,`I... need... my... -hot... noodles...`,`Ramen Noodles, they -better be here soon.`,`Decentraland's best -ramen huh? I'll try some`,`A bowl of noodles, -please`],R3=[`sliced sushi! -onegai shimaaasu!`,"Sushi. Tic Toc.",`Sushi dammit! -What rya waiting for?`,`Been exploring -Decentraland all day, -sushi please`],v3=[`Noodles! Gimme -the stinky ones!`,`Noodles, the burrrrrrrnt - the better!`,`Well-cooked noodles. -Burnt, as you people say.`,`They say you sell - garbage for food, - I'd like some`,`Garbage, don't care - what kind`],k3=[`An empty beer glass. -So it looks like I was -waiting long`,`Just a glass, nothing - in it. -Feeling existential.`,`Empty glass. All I - can afford.`],N3=[`I want a cold regular - beer!`,`I heard you do craft - beer, gimme a yellow!`,`Beer! A nice cold normal - one!`],w3=["I want a RED beer!",`Red beer. Im a -bit of a hipster!`,`Beer red like the -blood of my enemies! -lol`],A3=[`I like weird stuff, -green beer!`,`Green Beer. Dont care -about the taste, want -a cool pic for insagram`,`Beer! A nice cold -green one!`],O3=["Im just here to watch",`I dont want anything. -Just here to make you -feel uncomfortable.`,`Making a documentary, -keep working as if -Im not here`],oE=["Excellent!","Nicely done!","(\u3000\uFF3E\u2207\uFF3E)","It was about time...","Nice job!","Just what I needed!","Yummy!","YES!!!","( \u02D8 \xB3\u02D8)","It's fine"],iE=[`Customer service -SUCKS here!`,`Do you even understand -my language?`,"What a waste of time!","NO! NO! NO!",`Guess who's a -ramen shop critic?`,`I'll never come -back here`,`I'll talk SO bad -about this place`,"\u0449(\xBA\u0414\xBA\u0449)","@#&*#$!","\u0B67\u0F3C\u0CA0\u76CA\u0CA0\u0F3D"],C3=D.create(13.5,.75,10.5),I3=D.create(13.5,.75,11.5),M3=D.create(13.5,.75,12.5),P3=D.create(13.5,.75,13.5),B3=.99;function Cc(e){let t=G.addEntity(),a=D.Zero(),n=52,s=40,i=41;switch(e){case 1:a=C3,n=52,s=40,i=41;break;case 2:a=I3,n=53,s=42,i=43;break;case 3:a=M3,n=54,s=44,i=45;break;case 4:a=P3,n=55,s=46,i=47;break}Re.create(t,{position:a,scale:D.create(.75,.75,.75),rotation:ze.fromEulerDegrees(0,90,0)}),$t.create(t,{src:"assets/models/walkers/BlockDog.glb"}),mt.create(t),mt.playSingleAnimation(t,"Sitting",!1),pt(t,[$t.componentId,Re.componentId,bn.componentId,mt.componentId,wt.componentId],n);let f=Ve.randomRange(2,4),u=Tf(t,1.3,180,!1,!0,.1,s,i),c=nE(t,e,"Placeholder",2.3);bn.create(t,{message:"placeHolder",speechBubble:c,receivedDish:!1,seatNumber:e,timeBeforeLeaving:Ve.randomRange(3,5),waitingTimer:f,progressBar:u}),wt.createOrReplace(t,{visible:!1})}function z3(){let e=[],[t]=G.getEntitiesWith(en),a=t[0];if(!a||!en.has(a)){console.log("NO GAME ENTITY");return}let n=en.getMutable(a),s=0;for(let[f]of G.getEntitiesWith(bn))bn.get(f).active&&bn.get(f).receivedDish==!1&&(s++,e.push(bn.get(f).seatNumber));let i=0;if(!(s>4)){if(n.playerScore>=150)if(!e.includes(1))i=1;else if(!e.includes(2))i=2;else if(!e.includes(3))i=3;else if(!e.includes(4))i=4;else{console.log("FULLY STAFFED TABLES, customer count:",s);return}else if(n.playerScore>=50)if(console.log("CUSTOMER COUNT: ",s,"TAKEN SEATS: ",e),!e.includes(1))i=1;else if(!e.includes(2))i=2;else{console.log("FULLY STAFFED TABLES, customer count:",s);return}else if(s<1)i=1;else{console.log("FULLY STAFFED TABLES, customer count:",s);return}console.log("SUMMONING NEW CUSTOMER, SEAT NUMBER: ",i,"TAKEN SEATS ",e);for(let[f]of G.getEntitiesWith(bn))console.log("ITERATING OVER CUSTOMERS"),bn.get(f).seatNumber==i&&U3(f)}}function aE(e){wt.createOrReplace(e,{visible:!1});let t=bn.getMutable(e);console.log("HIDING CUSTOMER: ",t.seatNumber),t.active=!1,t.receivedDish=!1,t.progressBar&&Do(t.progressBar),rE(t.speechBubble)}function U3(e){let t=bn.getMutable(e);t.active=!0,t.waitingTimer=5,t.timeBeforeLeaving=Ve.randomRange(3,5),t.receivedDish=!1,wt.deleteFrom(e),_f(t.progressBar);let a=Math.floor(Ve.randomRange(0,9));console.log("DISH SELECTED: ",a);let n;switch(a){case 0:n=S3;break;case 1:n=x3;break;case 2:n=b3;break;case 3:n=R3;break;case 4:n=v3;break;case 5:n=k3;break;case 6:n=N3;break;case 7:n=w3;break;case 8:n=A3;break;default:n=O3;break}let s=Math.floor(Ve.randomRange(0,n.length));xf(t.speechBubble,n[s],0),console.log("NEW TEXT: ",n[s]),t.dish=a,t.message=n[s]}function sE(e){for(let[t]of G.getEntitiesWith(bn)){let a=bn.getMutable(t);if(a.active&&a.progressBar&&lo.has(a.progressBar)){let n=lo.getMutable(a.progressBar);if(n.speed>0&&n.ratio<=0){let s=a.dish+1;s==Object.keys(Dr).length&&(s=0),Jp(s,t),Do(a.progressBar)}}a.receivedDish&&a.waitingTimer>0&&(a.waitingTimer-=e,a.waitingTimer<=0&&aE(t))}for(let[t]of G.getEntitiesWith(en)){let a=en.getMutable(t);a.customerTimer-=e,a.customerTimer<=0&&(z3(),a.customerTimer=a.customerInterval,a.customerInterval=a.customerInterval*B3,console.log("NEW CUSTOMER INTERVAL",a.customerInterval))}}function Jp(e,t,a){let n=bn.getMutable(t);if(!n.active||n.receivedDish)return;n.progressBar&&Do(n.progressBar);let[s]=G.getEntitiesWith(en),i=s[0];if(!i||!en.has(i))return;let f=en.getMutable(i);if(n.dish==e){f.playerScore+=10,cE();let u=oE[Math.floor(Ve.randomRange(0,oE.length))];n.message=u,xf(n.speechBubble,u,1)}else{console.log("WRONG DISH: ",e," EXPECTED: ",n.dish),f.playerMisses+=1,uE();let u=iE[Math.floor(Ve.randomRange(0,iE.length))];n.message=u,xf(n.speechBubble,u,2),Bo("sounds/error.mp3",!1,Po()),f.playerMisses<=3&&Uo.setTimeout(()=>{Kp()},1e3)}n.receivedDish=!0,a&&Uo.setTimeout(()=>{Fr.has(a)?(Fr.getMutable(a).filled=!1,Fr.getMutable(a).beerType=0,Ht.getMutable(a).type=5,mt.playSingleAnimation(a,"Blank"),Bo("sounds/swallow.mp3",!1,Po())):G.removeEntity(a)},3e3)}function cE(){let[e]=G.getEntitiesWith(en),t=e[0];if(!t||!en.has(t))return;let a=en.getMutable(t),n=G.getEntityOrNullByName("Score");if(n){let s=sr.getMutable(n);s.text="Score: "+a.playerScore.toString()}}function uE(){let[e]=G.getEntitiesWith(en),t=e[0];if(!t||!en.has(t))return;let a=en.getMutable(t),n=G.getEntityOrNullByName("Misses");if(n){let s=sr.getMutable(n);s.text="Misses: "+a.playerMisses.toString()}}function Kp(){let[e]=G.getEntitiesWith(en),t=e[0];if(!t||!en.has(t))return;let a=en.getMutable(t);a.playerScore=0,a.playerMisses=0,a.customerTimer=2,a.customerInterval=10;let n=G.getEntitiesWith(bn);for(let[s]of n)aE(s);Bo("sounds/error.mp3",!1,Po()),cE(),uE()}var L3=5,D3=10;function Xp(e,t,a,n){pt(e,[co.componentId,Jn.componentId],t);let s=Tf(e,1,270,!0,!0,1,a,n);Jn.create(e,{progressBar:s}),ao.create(e,{pointerEvents:[{eventType:cr.PET_DOWN,eventInfo:{hoverText:"Add",maxDistance:5,button:Bn.IA_PRIMARY}}]})}function lE(e){let t=Jn.getMutable(e);t&&t.hasIngredient&&t.attachedEntity!==void 0&&(console.log("PICKING UP FROM POT"),$p(t.attachedEntity),t.hasIngredient=!1,t.state=1,co.has(e)&&co.deleteFrom(e),Do(t.progressBar))}function Zp(e){co.has(e)&&co.get(e).active||(co.createOrReplace(e),Jn.getMutable(e),_f(Jn.getMutable(e).progressBar))}function fE(e){for(let[t,a,n]of G.getEntitiesWith(co,Jn))if(a.active&&n.hasIngredient){let s=co.getMutable(t);if(s.time+=e,s.time>L3&&n.hasIngredient&&n.state===1){console.log("COOKED!");let i=Jn.getMutable(t);i.state=2;let f=i.attachedEntity;$t.has(f)&&Ht.has(f)&&($t.getMutable(f).src="assets/models/PlateNoodles.glb",Ht.getMutable(f).type=2)}else if(s.time>D3&&n.state===2){console.log("BURNING!!!"),$t.has(t)&&($t.getMutable(t).src="assets/models/CookingPotDirty.glb");let i=Jn.getMutable(t);i.state=3;let f=i.attachedEntity;$t.has(f)&&Ht.has(f)&&($t.getMutable(f).src="assets/models/GarbageFood.glb",Ht.getMutable(f).type=4)}}else a.active&&!n.hasIngredient&&(co.deleteFrom(t),Do(n.progressBar))}function dE(){for(let[e,t]of G.getEntitiesWith(Rc)){let a=os.getInputCommand(Bn.IA_PRIMARY,cr.PET_DOWN);if(a){let n=Array.from(kc(e))[0];if(t.avatarId!==vc||!n)continue;let s=!1,i=a.hit?.position||Po(),f=a.hit?.entityId,u=di(f);if(u&&ys.getOrNull(u))Re.getMutable(n).rotation=ze.Zero(),Re.getMutable(n).position=D.Zero(),console.log("DROPPED ON TAP"),Rn(n,u),s=!0;else if(u&&uo.has(u)){console.log("DROPPED ON CUTTING BOARD");let c=uo.getMutable(u);(!c||!c.hasRoll||!c.modelEntity)&&(Rn(n,u),s=!0,Re.getMutable(n).rotation=ze.Zero(),Re.getMutable(n).position=D.Zero(),c.hasRoll=!0,c.rollChild=n,c.cutting=!1,c.cuts=0,mt.stopAllAnimations(f,!0),Xg(c.modelEntity))}else if(f&&Jn.has(f)){console.log("DROPPED ON POT");let c=Jn.getMutable(f);c&&!c.hasIngredient&&(Rn(n,f),c.hasIngredient=!0,c.attachedEntity=n,c.state=1,s=!0,Ht.get(n).type!==0&&Ef(n))}else{let c=D.subtract(D.Up(),a.hit?.normalHit||D.Zero());console.log("DROPPED ON TABLE ",D.length(c),a.hit?.normalHit),D.length(c)<.05&&(Gg(n),Re.createOrReplace(n,{position:i,parent:void 0}),s=!0,F3(n))}s&&(Rc.deleteFrom(e),Bo("sounds/putDown.mp3",!1,i))}return}for(let[e,t]of G.getEntitiesWith(Ht,Re))if(os.isTriggered(Bn.IA_PRIMARY,cr.PET_DOWN,e)){if(t.beingProcessed)return;$p(e)}}function $p(e){let t=di(e),a=G.addEntity();if(Rc.create(a,{avatarId:vc}),_c.create(a,{avatarId:vc,anchorPointId:Wu.AAPT_RIGHT_HAND}),Re.createOrReplace(e,{position:D.create(0,.225,0),rotation:ze.fromEulerDegrees(180,-90,-60)}),pt(a,[_c.componentId,Re.componentId,Rc.componentId,Ht.componentId]),Rn(e,a),Bo("sounds/pickUp.mp3",!1,Po()),t&&Jn.has(t)){let n=Jn.getMutable(t);n&&n.attachedEntity===e&&(n.hasIngredient=!1,Do(n.progressBar),n.state=0,lE(t))}if(t&&uo.has(t)){let n=uo.getMutable(t);n&&n.rollChild===e&&(n.hasRoll=!1,n.cutting=!1,n.cuts=0,Zg(n.modelEntity))}}function F3(e){let t=Re.get(e),a=null,n=1.5;for(let[s,i,f]of G.getEntitiesWith(bn,Re)){let u=D.length(D.subtract(t.position,f.position));u=2.5){n.pouring=!1,n.pouringTime=0;let s=nm(n.beerType);if(s){let i=Fr.getMutable(s);i.beerType=n.beerType,i.filled=!0;let f=Ht.getMutable(s);f.beingProcessed=!1}}}else if(os.isTriggered(Bn.IA_PRIMARY,cr.PET_DOWN,t)){let n=nm(a.beerType);if(!n)return;let s=Fr.getMutable(n);if(s.filled)return;let i=hs.getMutable(t);i.pouring=!0,i.pouringTime=0,s.beerType=i.beerType;let f=Ht.getMutable(n);switch(f.beingProcessed=!0,i.beerType){case 2:f.type=6;break;case 1:f.type=7;break;case 3:f.type=8;break}f.type}}var f2=require("~system/RestrictedActions");var kE=Ue(cm()),jr;(function(e){e.createElement=kE.default.createElement})(jr||(jr={}));var a2=Ue(WE());var rx={"sans-serif":0,serif:1,monospace:2};function Yi(e){if(e)return{font:rx[e]}}var ox={"top-left":0,"top-center":1,"top-right":2,"middle-left":3,"middle-center":4,"middle-right":5,"bottom-left":6,"bottom-center":7,"bottom-right":8};function qi(e){if(e)return{textAlign:ox[e]}}var ix={"nine-slices":0,center:1,stretch:2};function VE(e){return{textureMode:e?ix[e]:1}}function GE(e){if(e.texture)return{tex:{$case:"texture",texture:HE(e.texture)}};if(e.avatarTexture)return{tex:{$case:"avatarTexture",avatarTexture:HE(e.avatarTexture)}}}function HE(e){return{...e,wrapMode:e.wrapMode?ax[e.wrapMode]:void 0,filterMode:e.filterMode?sx[e.filterMode]:void 0}}var ax={repeat:0,clamp:1,mirror:2},sx={point:0,"bi-linear":1,"tri-linear":2};function Em(e){if(!e||!Object.keys(e).length)return;let t=GE(e);return{...e,...VE(e.textureMode),uvs:e.uvs??[],texture:t}}function YE(e){return`${e[0].toUpperCase()}${e.slice(1,e.length)}`}function cx(e){return typeof e=="string"&&e.endsWith("%")}function ux(e){return typeof e=="string"&&e.endsWith("px")}function qE(e){function t(a,n){return Number(n.slice(0,n.indexOf(a)))}return e==null?[void 0,0]:e==="auto"?[0,3]:typeof e=="number"||typeof e=="string"&&!isNaN(Number(e))?[Number(e),1]:cx(e)?[t("%",e),2]:ux(e)?[t("px",e),1]:[void 0,0]}function Fo(e={},t){if(typeof e=="object"){let u={};for(let c in e){let h=c,E=`${t}${YE(h)}`,C=`${t}${YE(h)}Unit`,[v,W]=qE(e[h]);v!==void 0&&(u[C]=W,u[E]=v)}return u}if(typeof e=="number")return Fo({top:e,left:e,right:e,bottom:e},t);let a=e.split(" ").filter(u=>u!=="");if(a.length===1){let[u]=a;return Fo({top:u,left:u,right:u,bottom:u},t)}if(a.length===2){let[u,c]=a;return Fo({top:u,left:c,right:c,bottom:u},t)}if(a.length===3){let[u,c,h]=a;return Fo({top:u,left:c,right:c,bottom:h},t)}let[n,s,i,f]=a;return Fo({top:n,right:s,bottom:i,left:f},t)}function Qi(e,t){let a=`${t}Unit`,[n,s]=qE(e);return n===void 0?{}:{[t]:n,[a]:s}}function QE(e){return{display:e?lx[e]:0}}var lx={flex:0,none:1};function JE(e){return{justifyContent:e?fx[e]:0}}var fx={center:1,"flex-end":2,"flex-start":0,"space-around":4,"space-between":3,"space-evenly":5};function If(e,t){let a=dx[t];return{[e]:a}}var dx={auto:0,baseline:5,center:2,"flex-end":3,"flex-start":1,stretch:4,"space-between":6,"space-around":7};function KE(e){return{flexDirection:e?px[e]:0}}var px={row:0,column:1,"row-reverse":3,"column-reverse":2};function XE(e){return{flexWrap:mx[e]}}var mx={wrap:1,nowrap:0,"wrap-reverse":2};function ZE(e){return{overflow:e?hx[e]:0}}var hx={visible:0,scroll:2,hidden:1};function $E(e){return{positionType:e?yx[e]:0}}var yx={relative:0,absolute:1};function e2(e){return{pointerFilter:e?gx[e]:0}}var gx={none:0,block:1};var Tm=0,Ex={overflow:0,display:0,justifyContent:0,alignSelf:0,flexDirection:0,positionType:0,parent:Tm,rightOf:0,flexBasis:0,width:0,height:0,minWidth:0,minHeight:0,maxWidth:0,maxHeight:0,flexGrow:0,marginBottom:0,marginBottomUnit:0,marginLeft:0,marginLeftUnit:0,marginRight:0,marginRightUnit:0,marginTop:0,marginTopUnit:0,maxHeightUnit:0,maxWidthUnit:0,minHeightUnit:0,minWidthUnit:0,paddingBottom:0,paddingBottomUnit:0,paddingLeft:0,paddingLeftUnit:0,paddingTopUnit:0,paddingRight:0,paddingRightUnit:0,paddingTop:0,positionBottom:0,positionBottomUnit:0,positionLeft:0,positionLeftUnit:0,positionRight:0,positionRightUnit:0,positionTop:0,positionTopUnit:0,flexBasisUnit:0,widthUnit:0,heightUnit:0,pointerFilter:0};function _m(e={}){let{height:t,minHeight:a,maxHeight:n,width:s,minWidth:i,maxWidth:f,alignItems:u,alignContent:c,flexWrap:h,...E}=e;return{...Ex,...E,...Fo(e.position,"position"),...Fo(e.margin,"margin"),...Fo(e.padding,"padding"),...Qi(e.height,"height"),...Qi(e.minHeight,"minHeight"),...Qi(e.maxHeight,"maxHeight"),...Qi(e.width,"width"),...Qi(e.minWidth,"minWidth"),...Qi(e.maxWidth,"maxWidth"),...QE(e.display),...If("alignSelf",e.alignSelf??"auto"),...JE(e.justifyContent),...KE(e.flexDirection),...ZE(e.overflow),...e2(e.pointerFilter),...$E(e.positionType),...c&&If("alignContent",c),...u&&If("alignItems",u),...h&&XE(h)}}function _s(e){let{uiTransform:t,uiBackground:a,...n}=e,s=_m(t),i=a?{uiBackground:Em(a)}:void 0;return{...n,uiTransform:s,...i}}var Tx={onMouseDown:void 0,onMouseUp:void 0},_x=Object.keys(Tx),zc=e=>_x.includes(e);function Sm(e){let{uiTransform:t,uiBackground:a,onMouseDown:n,onMouseUp:s,...i}=e,f=_s({uiTransform:t,uiBackground:a,onMouseDown:n,onMouseUp:s}),{font:u,textAlign:c,...h}=i,E={...h,...Yi(u),...qi(c)};return jr.createElement("entity",{...f,uiText:E})}function xm(e){let t=e.uiText&&{uiText:{...e.uiText,...Yi(e.uiText.font),...qi(e.uiText.textAlign)}};return jr.createElement("entity",{..._s(e),...t})}function t2(e,t,a){if(t&&!a)return{type:"delete",component:e};if(!a)return;if(!t&&a)return{type:"add",props:a,component:e};if(zc(e)&&!bm(t,a))return{type:"put",component:e,props:a};let n={};for(let s in t){let i=s;bm(t[i],a[i])||(n[i]=a[i])}if(Object.keys(n).length)return{type:"put",props:n,component:e}}var Sx={uiText:void 0,uiBackground:void 0,uiTransform:void 0,onMouseDown:void 0,onMouseUp:void 0,uiInput:void 0,uiDropdown:void 0},n2=Object.keys(Sx);function bm(e,t){if(!e&&!t)return!0;if(!e||!t)return e===t;if(e===t)return!0;if(typeof e!=typeof t)return!1;if(typeof e!="object")return e===t;if(Array.isArray(e)&&Array.isArray(t)&&e.length!==t.length||Object.keys(e).length!==Object.keys(t).length)return!1;if(JSON.stringify(e)===JSON.stringify(t))return!0;for(let a in e)if(!bm(e[a],t[a]))return!1;return!0}var r2=e=>!!e,o2={supportsMutation:!0,supportsPersistence:!1,noTimeout:-1,isPrimaryRenderer:!0,supportsHydration:!1,insertInContainerBefore(e,t,a){},detachDeletedInstance(e){},hideInstance(e){},hideTextInstance(e){},unhideInstance(e,t){},unhideTextInstance(e,t){},clearContainer(e){},getCurrentEventPriority(){return 0},getInstanceFromNode(e){return null},beforeActiveInstanceBlur(){},afterActiveInstanceBlur(){},prepareScopeUpdate(){},getInstanceFromScope(){return null},commitMount(e,t,a,n){},resetTextContent(e){},commitTextUpdate(e,t,a){},prepareForCommit(e){return null},resetAfterCommit(e){},preparePortalMount(e){},createTextInstance(e,t,a,n){return{}},scheduleTimeout(e,t){},cancelTimeout(e){},shouldSetTextContent(e,t){return!1},getRootHostContext(e){return null},getChildHostContext(e,t,a){return null},getPublicInstance(e){return e},finalizeInitialChildren(e,t,a,n,s){return!1}};function i2(e){return{onMouseDown:1,onMouseUp:0}[e]}function s2(e,t){let a=new Set,n=new Map,s=new Map,i=ac(e),f=ic(e),u=oc(e),c=Fl(e),h=jl(e),E=Ll(e),C=Dl(e),v={uiTransform:i.componentId,uiText:f.componentId,uiBackground:u.componentId,uiInput:c.componentId,uiDropdown:E.componentId};function W(K,A){let M=s.get(K)?.get(A);M&&M()}function I(K,A){S(K,A,"uiTransform")}function y(K,A){if(A.type==="delete"||!A.props){s.get(K.entity)?.delete(i2(A.component)),A.component==="onMouseDown"?t.removeOnPointerDown(K.entity):A.component==="onMouseUp"&&t.removeOnPointerUp(K.entity);return}if(A.props){let M=i2(A.component),X=s.get(K.entity)||s.set(K.entity,new Map).get(K.entity),re=X.get(M);if(X.set(M,A.props),re)return;(A.component==="onMouseDown"?t.onPointerDown:t.onPointerUp)(K.entity,()=>W(K.entity,M),{button:0,showFeedback:!0})}}function _(K,A){let M=v[A];e.getComponent(M).deleteFrom(K.entity)}function S(K,A={},M){let X=v[M],re="onChange"in A,fe="onSubmit"in A,we=n.get(K.entity)?.get(X),De=re?A.onChange:we?.onChangeCallback,Fe=fe?A.onSubmit:we?.onSubmitCallback;if((re||fe)&&(ve(K.entity,X,{onChangeCallback:De,onSubmitCallback:Fe}),delete A.onChange,delete A.onSubmit),!Object.keys(A).length)return;let Ge=e.getComponent(X),Ye=Ge.getMutableOrNull(K.entity)||Ge.create(K.entity);for(let rt in A){let Ke=rt;Ye[Ke]=A[Ke]}}function N(K){n.delete(K.entity),e.removeEntity(K.entity);for(let A of K._child)N(A)}function P(K,A){if(!A||!Object.keys(K).length)return;if(K._child.find(X=>X.entity===A.entity)){let X=K._child.find(re=>re.rightOf===A.entity);X&&(X.rightOf=A.rightOf,K._child=K._child.filter(re=>re.entity!==A.entity),K._child.push(A),I(X,{rightOf:X.rightOf})),A.rightOf=K._child[K._child.length-2]?.entity}else A.rightOf=K._child[K._child.length-1]?.entity,K._child.push(A);A.parent=K.entity,I(A,{rightOf:A.rightOf,parent:K.entity})}function oe(K,A){let M=K._child.findIndex(re=>re.entity===A.entity),X=K._child[M+1];X&&(X.rightOf=A.rightOf,I(X,{rightOf:A.rightOf})),K._child.splice(M,1),N(A)}function ve(K,A,M){let X=n.get(K)||n.set(K,new Map).get(K),re=X.get(A),fe=M?.onChangeCallback,we=M?.onSubmitCallback,De=M?.value??re?.value,Fe=M?.isSubmit??re?.isSubmit;X.set(A,{onChangeCallback:fe,onSubmitCallback:we,value:De,isSubmit:Fe})}let j={...o2,createInstance(K,A){let M=e.addEntity();a.add(M);let X={entity:M,_child:[],parent:Tm,rightOf:void 0};for(let re in A){let fe=re;fe==="children"||fe==="key"||(zc(fe)?y(X,{type:"add",props:A[fe],component:fe}):S(X,A[fe],fe))}return X},appendChild:P,appendChildToContainer:P,appendInitialChild:P,removeChild:oe,prepareUpdate(K,A,M,X){return n2.map(re=>t2(re,M[re],X[re])).filter(r2)},commitUpdate(K,A,M,X,re,fe){for(let we of A){if(zc(we.component)){y(K,we);continue}we.type==="delete"?_(K,we.component):we.props&&S(K,we.props,we.component)}},insertBefore(K,A,M){let X=K._child.findIndex(re=>re.entity===M.entity);K._child=[...K._child.slice(0,X),A,...K._child.slice(X)],A.rightOf=M.rightOf,M.rightOf=A.entity,A.parent=K.entity,I(A,{rightOf:A.rightOf,parent:A.parent}),I(M,{rightOf:M.rightOf})},removeChildFromContainer(K,A){N(A)}},q=(0,a2.default)(j),ne=q.createContainer({},0,null,!1,null,"",function(){},null);function ie(K,A){for(let[M,X]of e.getEntitiesWith(A)){let re=n.get(M)?.get(K),fe=!!X.isSubmit;re?.onChangeCallback&&X.value!==re.value&&re.onChangeCallback(X.value),re?.onSubmitCallback&&fe&&!re.isSubmit&&re.onSubmitCallback(X.value),ve(M,K,{onChangeCallback:re?.onChangeCallback,onSubmitCallback:re?.onSubmitCallback,value:X.value,isSubmit:fe})}}return{update:function(K){return n.size&&(ie(c.componentId,h),ie(E.componentId,C)),q.updateContainer(K,ne,null)},getEntities:()=>Array.from(a)}}function c2(e,t){let a=s2(e,t),n;function s(){n&&a.update(n())}return e.addSystem(s,1e5,"@dcl/react-ecs"),{destroy(){e.removeSystem(s);for(let i of a.getEntities())e.removeEntity(i)},setUiRenderer(i){n=i}}}var u2=c2(G,Mo),l2=jr;var Mf=l2;var xx="beer-dispenser",bx=()=>[Rx()];function d2(){u2.setUiRenderer(bx)}function Rx(){let e="https://github.com/decentraland/sdk7-goerli-plaza/tree/main/"+xx;return Mf.createElement(xm,{uiTransform:{flexDirection:"column",alignItems:"center",justifyContent:"space-between",positionType:"absolute",position:{right:"8%",bottom:"3%"}}},Mf.createElement(xm,{uiTransform:{width:"100",height:"100"},uiBackground:{textureMode:"stretch",texture:{src:"images/gh.png"}},onMouseDown:()=>{console.log("OPENING LINK"),(0,f2.openExternalUrl)({url:e})}}),Mf.createElement(Sm,{value:"View code",color:ct.Black(),fontSize:18,textAlign:"middle-center"}))}function p2(e,t,a){let s=Ss(Ot.ACTION_TYPES,e).getOrCreateMutable(e.RootEntity),i={type:t,jsonSchema:JSON.stringify(a?.jsonSchema||x.Map({}).jsonSchema)};s.value=[...s.value.filter(f=>f.type!==i.type),i]}function nt(e){return JSON.parse(e.jsonPayload)}var Ot;(function(e){e.ACTION_TYPES="asset-packs::ActionTypes",e.ACTIONS="asset-packs::Actions",e.COUNTER="asset-packs::Counter",e.TRIGGERS="asset-packs::Triggers",e.STATES="asset-packs::States"})(Ot||(Ot={}));var jo;(function(e){e.MOVE_ITEM="move_item",e.ROTATE_ITEM="rotate_item",e.SCALE_ITEM="scale_item"})(jo||(jo={}));var Uc;(function(e){e.LINEAR="linear",e.EASEINQUAD="easeinquad",e.EASEOUTQUAD="easeoutquad",e.EASEQUAD="easequad",e.EASEINSINE="easeinsine",e.EASEOUTSINE="easeoutsine",e.EASESINE="easeinoutsine",e.EASEINEXPO="easeinexpo",e.EASEOUTEXPO="easeoutexpo",e.EASEEXPO="easeinoutexpo",e.EASEINELASTIC="easeinelastic",e.EASEOUTELASTIC="easeoutelastic",e.EASEELASTIC="easeinoutelastic",e.EASEINBOUNCE="easeinbounce",e.EASEOUTEBOUNCE="easeoutbounce",e.EASEBOUNCE="easeinoutbounce"})(Uc||(Uc={}));var Te;(function(e){e.PLAY_ANIMATION="play_animation",e.STOP_ANIMATION="stop_animation",e.SET_STATE="set_state",e.START_TWEEN="start_tween",e.SET_COUNTER="set_counter",e.INCREMENT_COUNTER="increment_counter",e.DECREASE_COUNTER="decrease_counter",e.PLAY_SOUND="play_sound",e.STOP_SOUND="stop_sound",e.SET_VISIBILITY="set_visibility",e.ATTACH_TO_PLAYER="attach_to_player",e.DETACH_FROM_PLAYER="detach_from_player",e.PLAY_VIDEO_STREAM="play_video_stream",e.STOP_VIDEO_STREAM="stop_video_stream",e.PLAY_AUDIO_STREAM="play_audio_stream",e.STOP_AUDIO_STREAM="stop_audio_stream",e.TELEPORT_PLAYER="teleport_player",e.MOVE_PLAYER="move_player",e.PLAY_DEFAULT_EMOTE="play_default_emote",e.PLAY_CUSTOM_EMOTE="play_custom_emote",e.OPEN_LINK="open_link",e.SHOW_TEXT="show_text",e.HIDE_TEXT="hide_text",e.START_DELAY="start_delay",e.STOP_DELAY="stop_delay",e.START_LOOP="start_loop",e.STOP_LOOP="stop_loop",e.CLONE_ENTITY="clone_entity",e.REMOVE_ENTITY="remove_entity",e.SHOW_IMAGE="show_image",e.HIDE_IMAGE="hide_image"})(Te||(Te={}));var yt;(function(e){e.ON_CLICK="on_click",e.ON_STATE_CHANGE="on_state_change",e.ON_SPAWN="on_spawn",e.ON_TWEEN_END="on_tween_end",e.ON_COUNTER_CHANGE="on_counter_change",e.ON_PLAYER_ENTERS_AREA="on_player_enters_area",e.ON_PLAYER_LEAVES_AREA="on_player_leaves_area",e.ON_DELAY="on_delay",e.ON_LOOP="on_loop",e.ON_CLONE="on_clone",e.ON_CLICK_IMAGE="on_click_image"})(yt||(yt={}));var Un;(function(e){e.WHEN_STATE_IS="when_state_is",e.WHEN_STATE_IS_NOT="when_state_is_not",e.WHEN_COUNTER_EQUALS="when_counter_equals",e.WHEN_COUNTER_IS_GREATER_THAN="when_counter_is_greater_than",e.WHEN_COUNTER_IS_LESS_THAN="when_counter_is_less_than"})(Un||(Un={}));var Wo;(function(e){e.AND="and",e.OR="or"})(Wo||(Wo={}));var xt;(function(e){e[e.TAM_TOP_LEFT=0]="TAM_TOP_LEFT",e[e.TAM_TOP_CENTER=1]="TAM_TOP_CENTER",e[e.TAM_TOP_RIGHT=2]="TAM_TOP_RIGHT",e[e.TAM_MIDDLE_LEFT=3]="TAM_MIDDLE_LEFT",e[e.TAM_MIDDLE_CENTER=4]="TAM_MIDDLE_CENTER",e[e.TAM_MIDDLE_RIGHT=5]="TAM_MIDDLE_RIGHT",e[e.TAM_BOTTOM_LEFT=6]="TAM_BOTTOM_LEFT",e[e.TAM_BOTTOM_CENTER=7]="TAM_BOTTOM_CENTER",e[e.TAM_BOTTOM_RIGHT=8]="TAM_BOTTOM_RIGHT"})(xt||(xt={}));var Ji;(function(e){e[e.F_SANS_SERIF=0]="F_SANS_SERIF",e[e.F_SERIF=1]="F_SERIF",e[e.F_MONOSPACE=2]="F_MONOSPACE"})(Ji||(Ji={}));var Lc;(function(e){e[e.CL_NONE=0]="CL_NONE",e[e.CL_POINTER=1]="CL_POINTER",e[e.CL_PHYSICS=2]="CL_PHYSICS",e[e.CL_RESERVED1=4]="CL_RESERVED1",e[e.CL_RESERVED2=8]="CL_RESERVED2",e[e.CL_RESERVED3=16]="CL_RESERVED3",e[e.CL_RESERVED4=32]="CL_RESERVED4",e[e.CL_RESERVED5=64]="CL_RESERVED5",e[e.CL_RESERVED6=128]="CL_RESERVED6",e[e.CL_CUSTOM1=256]="CL_CUSTOM1",e[e.CL_CUSTOM2=512]="CL_CUSTOM2",e[e.CL_CUSTOM3=1024]="CL_CUSTOM3",e[e.CL_CUSTOM4=2048]="CL_CUSTOM4",e[e.CL_CUSTOM5=4096]="CL_CUSTOM5",e[e.CL_CUSTOM6=8192]="CL_CUSTOM6",e[e.CL_CUSTOM7=16384]="CL_CUSTOM7",e[e.CL_CUSTOM8=32768]="CL_CUSTOM8"})(Lc||(Lc={}));function Rm(e){return{all:e=e||new Map,on:function(t,a){var n=e.get(t);n?n.push(a):e.set(t,[a])},off:function(t,a){var n=e.get(t);n&&(a?n.splice(n.indexOf(a)>>>0,1):e.set(t,[]))},emit:function(t,a){var n=e.get(t);n&&n.slice().map(function(s){s(a)}),(n=e.get("*"))&&n.slice().map(function(s){s(t,a)})}}}var vm=new Map,km=new Map;function Gt(e){return vm.has(e)||vm.set(e,Rm()),vm.get(e)}function xs(e){return km.has(e)||km.set(e,Rm()),km.get(e)}var vx=[Ot.ACTIONS,Ot.STATES,Ot.COUNTER];function kx(e){return e.getComponent(Ot.COUNTER)}function m2(e){let a=kx(e).getOrCreateMutable(e.RootEntity);return++a.value}function h2(e){return vx.includes(e.componentName)}function Pf(e,t){return!!t&&e.value.includes(t)}function Nm(e){return Pf(e,e.currentValue)?e.currentValue:wm(e)}function wm(e){if(Pf(e,e.defaultValue))return e.defaultValue;if(e.value.length>0)return e.value[0]}function y2(e){return!!e.createOrReplace}function g2(e,t,a){let n=t.addEntity(),s=new Map;debugger;for(let i of t.componentsIter())if(i.has(e)){let f=JSON.parse(JSON.stringify(i.get(e)));if(h2(i)){let u=f.id,c=m2(t);s.set(u,c),f={...f,id:c}}y2(i)&&i.createOrReplace(n,f)}if(a.has(n)){let i=a.getMutable(n);for(let f of i.value){for(let u of f.actions)if(u.id){let c=s.get(u.id);c&&(u.id=c)}if(f.conditions){for(let u of f.conditions)if(u.id){let c=s.get(u.id);c&&(u.id=c)}}}}return n}var Nx={[Te.PLAY_ANIMATION]:x.Map({animation:x.String,loop:x.Optional(x.Boolean)}),[Te.STOP_ANIMATION]:x.Map({}),[Te.SET_STATE]:x.Map({state:x.String}),[Te.START_TWEEN]:x.Map({type:x.EnumString(jo,jo.MOVE_ITEM),end:x.Vector3,interpolationType:x.EnumString(Uc,Uc.LINEAR),duration:x.Float,relative:x.Boolean}),[Te.SET_COUNTER]:x.Map({counter:x.Int}),[Te.INCREMENT_COUNTER]:x.Map({}),[Te.DECREASE_COUNTER]:x.Map({}),[Te.PLAY_SOUND]:x.Map({src:x.String,loop:x.Optional(x.Boolean),volume:x.Optional(x.Float)}),[Te.STOP_SOUND]:x.Map({}),[Te.SET_VISIBILITY]:x.Map({visible:x.Boolean,physicsCollider:x.Optional(x.Boolean),collider:x.Optional(x.EnumNumber(Lc,Lc.CL_POINTER))}),[Te.ATTACH_TO_PLAYER]:x.Map({anchorPointId:x.Int}),[Te.DETACH_FROM_PLAYER]:x.Map({}),[Te.PLAY_VIDEO_STREAM]:x.Map({src:x.Optional(x.String),loop:x.Optional(x.Boolean),volume:x.Optional(x.Float),dclCast:x.Optional(x.Boolean)}),[Te.STOP_VIDEO_STREAM]:x.Map({}),[Te.PLAY_AUDIO_STREAM]:x.Map({url:x.String,volume:x.Optional(x.Float)}),[Te.STOP_AUDIO_STREAM]:x.Map({}),[Te.TELEPORT_PLAYER]:x.Map({x:x.Int,y:x.Int}),[Te.MOVE_PLAYER]:x.Map({position:x.Vector3,cameraTarget:x.Optional(x.Vector3)}),[Te.PLAY_DEFAULT_EMOTE]:x.Map({emote:x.String}),[Te.PLAY_CUSTOM_EMOTE]:x.Map({src:x.String,loop:x.Optional(x.Boolean)}),[Te.OPEN_LINK]:x.Map({url:x.String}),[Te.SHOW_TEXT]:x.Map({text:x.String,hideAfterSeconds:x.Float,font:x.EnumNumber(Ji,Ji.F_SANS_SERIF),fontSize:x.Optional(x.Float),textAlign:x.EnumNumber(xt,xt.TAM_MIDDLE_CENTER)}),[Te.HIDE_TEXT]:x.Map({}),[Te.START_DELAY]:x.Map({actions:x.Array(x.String),timeout:x.Float}),[Te.STOP_DELAY]:x.Map({action:x.String}),[Te.START_LOOP]:x.Map({actions:x.Array(x.String),interval:x.Float}),[Te.STOP_LOOP]:x.Map({action:x.String}),[Te.CLONE_ENTITY]:x.Map({position:x.Vector3}),[Te.REMOVE_ENTITY]:x.Map({}),[Te.SHOW_IMAGE]:x.Map({src:x.String,align:x.EnumNumber(xt,xt.TAM_MIDDLE_CENTER),height:x.Float,width:x.Float,hideAfterSeconds:x.Optional(x.Float),text:x.Optional(x.String),fontSize:x.Optional(x.Float)}),[Te.HIDE_IMAGE]:x.Map({imageEntity:x.Optional(x.Int)})};function Ss(e,t){try{return t.getComponent(e)}catch(a){throw console.error(`Error using getComponent with componentName="${e}"`),a}}function Bf(e){return{Actions:Ss(Ot.ACTIONS,e),States:Ss(Ot.STATES,e),Counter:Ss(Ot.COUNTER,e),Triggers:Ss(Ot.TRIGGERS,e)}}function E2(e){let t=e.defineComponent(Ot.ACTION_TYPES,{value:x.Array(x.Map({type:x.String,jsonSchema:x.String}))}),a=e.defineComponent(Ot.ACTIONS,{id:x.Int,value:x.Array(x.Map({name:x.String,type:x.String,jsonPayload:x.String}))}),n=e.defineComponent(Ot.COUNTER,{id:x.Number,value:x.Int}),s=e.defineComponent(Ot.TRIGGERS,{value:x.Array(x.Map({type:x.EnumString(yt,yt.ON_CLICK),conditions:x.Optional(x.Array(x.Map({id:x.Optional(x.Int),type:x.EnumString(Un,Un.WHEN_STATE_IS),value:x.String}))),operation:x.Optional(x.EnumString(Wo,Wo.AND)),actions:x.Array(x.Map({id:x.Optional(x.Int),name:x.Optional(x.String)}))}))}),i=e.defineComponent(Ot.STATES,{id:x.Number,value:x.Array(x.String),defaultValue:x.Optional(x.String),currentValue:x.Optional(x.String)});return{ActionTypes:t,Actions:a,Counter:n,Triggers:s,States:i}}function T2(e,t){let a=Object.values(Te);for(let i of a){let f=i;p2(e,f,Nx[f])}let s=e.getComponent(Ot.COUNTER).getOrCreateMutable(e.RootEntity);s.value=s.value||0,t&&t.VideoPlayer&&t.Material&&Ax(e,{VideoPlayer:t.VideoPlayer,Material:t.Material})}function wx({material:e}){if(e?.$case==="pbr"&&e.pbr.texture?.tex?.$case==="videoTexture")return e.pbr.texture.tex.videoTexture}function Am(e,{Material:t},a){if(!a||!a.material||a.material.$case!=="pbr")return null;t.setPbrMaterial(e,{...a.material.pbr,texture:t.Texture.Video({videoPlayerEntity:e})})}function Ax(e,t){function a(){let{Material:n,VideoPlayer:s}=t;e.removeSystem(a);for(let[i,f]of e.getEntitiesWith(n,s))wx(f)?.videoPlayerEntity===e.RootEntity&&Am(i,t,f)}e.addSystem(a)}function _2(e){switch(e){case Ot.STATES:return[Un.WHEN_STATE_IS,Un.WHEN_STATE_IS_NOT];case Ot.COUNTER:return[Un.WHEN_COUNTER_EQUALS,Un.WHEN_COUNTER_IS_GREATER_THAN,Un.WHEN_COUNTER_IS_LESS_THAN];default:return[]}}var P2=require("~system/UserActionModule"),hi=require("~system/RestrictedActions"),B2=require("~system/CommsApi");var bs=new Map,Rs=new Map;function S2(){return function(n){e(n),t(n)};function e(a){for(let[n,s]of Rs.entries()){let i=Gt(n);for(let f of s)f.timeout===f.interval&&f.callback(),f.timeout-=a,f.timeout<=0&&(f.timeout=f.interval,i.emit(yt.ON_LOOP))}}function t(a){for(let[n,s]of bs.entries()){let i=Gt(n),f=[],u=0;for(let c of s)c.timeout-=a,c.timeout<=0&&(c.callback(),i.emit(yt.ON_DELAY),f.push(u)),u++;for(let c of f)s.splice(c,1)}}}function zf(e,t,a,n){let s=bs.get(e)??[];s.push({timeout:a,action:t,callback:n}),bs.set(e,s)}function x2(e,t){let a=bs.get(e)??[];bs.set(e,a.filter(n=>n.action!==t))}function b2(e){bs.delete(e)}function R2(e,t,a,n){let s=Rs.get(e)??[];s.push({timeout:a,action:t,callback:n,interval:a}),Rs.set(e,s)}function v2(e,t){let a=Rs.get(e)??[];Rs.set(e,a.filter(n=>n.action!==t))}function k2(e){Rs.delete(e)}function Ho(e,t){switch(e){case xt.TAM_TOP_LEFT:return{alignItems:1,justifyContent:0};case xt.TAM_TOP_CENTER:return t?{alignItems:2,justifyContent:0}:{alignItems:1,justifyContent:1};case xt.TAM_TOP_RIGHT:return t?{alignItems:3,justifyContent:0}:{alignItems:1,justifyContent:2};case xt.TAM_MIDDLE_LEFT:return t?{alignItems:1,justifyContent:1}:{alignItems:2,justifyContent:0};case xt.TAM_MIDDLE_CENTER:return{alignItems:2,justifyContent:1};case xt.TAM_MIDDLE_RIGHT:return t?{alignItems:3,justifyContent:1}:{alignItems:2,justifyContent:2};case xt.TAM_BOTTOM_LEFT:return t?{alignItems:1,justifyContent:2}:{alignItems:2,justifyContent:1};case xt.TAM_BOTTOM_CENTER:return t?{alignItems:2,justifyContent:2}:{alignItems:3,justifyContent:1};case xt.TAM_BOTTOM_RIGHT:return{alignItems:3,justifyContent:2}}}function N2(e,t=0){let a=t===1;switch(e){case xt.TAM_TOP_LEFT:return Ho(e,a);case xt.TAM_TOP_CENTER:return Ho(e,a);case xt.TAM_TOP_RIGHT:return Ho(e,a);case xt.TAM_MIDDLE_LEFT:return Ho(e,a);case xt.TAM_MIDDLE_CENTER:return Ho(e,a);case xt.TAM_MIDDLE_RIGHT:return Ho(e,a);case xt.TAM_BOTTOM_LEFT:return Ho(e,a);case xt.TAM_BOTTOM_CENTER:return Ho(e,a);case xt.TAM_BOTTOM_RIGHT:return Ho(e,a);default:throw new Error(`Unsupported AlignMode: ${e}`)}}function Dc(e,t=100,a=100,n=2){let s=Dp.getMutableOrNull(e);return s||(s=Dp.create(e),s.heightUnit=n,s.widthUnit=n,s.height=t,s.width=a,s.maxHeightUnit=n,s.maxWidthUnit=n,s.maxHeight=t,s.maxWidth=a),e===0&&(s.positionType=1),s}function w2(e,t,a=0,n=1){return xg.createOrReplace(e,{textureMode:a,texture:{tex:{$case:"texture",texture:{src:t,wrapMode:n}}},uvs:[]})}function Ox(e,t){let a=` -`,n=0,s="",i="",f=!1,u=t||50;if(!e)return"";if(e.length-1;c--)if(s.substring(c,c+1)==" "){n+=s.substring(0,c).length,s=s.substring(0,c)+a,i+=s,f=!0;break}f||(n+=s.length,s=s+a,i+=s)}else{i+=s;break}return i}function A2(e,t,a=10,n,s=xt.TAM_MIDDLE_CENTER,i=ct.Black()){let f=Math.floor(n/(a/1.7));return is.createOrReplace(e,{value:Ox(t,f),fontSize:a,font:Ji.F_MONOSPACE,textAlign:s,color:i})}var O2=new Set,Om=[],Cm=null;function C2(e){if(Cm)return Cm(e);throw new Error("Cannot call initTriggers while triggersSystem has not been created")}function I2(e,t){let{Actions:a,States:n,Counter:s,Triggers:i}=Bf(e);return Cm=f,function(_){for(;Om.length>0;){let{entity:N,action:P}=Om.shift();xs(N).emit(P.name,nt(P))}let S=e.getEntitiesWith(i);for(let[N]of S)f(N)};function f(y){if(!i.has(y)||O2.has(y))return;let _=i.get(y),S=_.value.reduce((P,oe)=>P.add(oe.type),new Set);for(let P of S)switch(P){case yt.ON_CLICK:{W(y);break}case yt.ON_PLAYER_ENTERS_AREA:case yt.ON_PLAYER_LEAVES_AREA:{I(y);break}}let N=Gt(y);for(let P of _.value)N.on(P.type,()=>{if(c(P)){for(let oe of P.actions)if(u(oe)){let ve=C(oe);if(ve){let j=a.getOrNull(ve);if(j){let q=j.value.find(ne=>ne.name===oe.name);q&&Om.push({entity:ve,action:q})}}}}});N.emit(yt.ON_SPAWN),O2.add(y)}function u(y){let{id:_,name:S}=y;return!!_&&!!S}function c(y){if(y.conditions&&y.conditions.length>0){let _=y.conditions.map(h),S=P=>!!P;switch(y.operation||Wo.AND){case Wo.AND:return _.every(S);case Wo.OR:return _.some(S)}}return!0}function h(y){let _=v(y);if(_)try{switch(y.type){case Un.WHEN_STATE_IS:{let S=n.getOrNull(_);if(S!==null)return Nm(S)===y.value;break}case Un.WHEN_STATE_IS_NOT:{let S=n.getOrNull(_);if(S!==null)return Nm(S)!==y.value;break}case Un.WHEN_COUNTER_EQUALS:{let S=s.getOrNull(_);if(S!==null){let N=Number(y.value);if(!isNaN(N))return S.value===N}break}case Un.WHEN_COUNTER_IS_GREATER_THAN:{let S=s.getOrNull(_);if(S!==null){let N=Number(y.value);if(!isNaN(N))return S.value>N}break}case Un.WHEN_COUNTER_IS_LESS_THAN:{let S=s.getOrNull(_);if(S!==null){let N=Number(y.value);if(!isNaN(N))return S.valueve.id===_);return Array.isArray(P)&&P.length>0?P[0]:null}function C(y){if(y.id){let _=E(Ot.ACTIONS,y.id);if(_)return _}return null}function v(y){let _=Object.values(Ot).map(S=>({componentName:S,conditionTypes:_2(S)})).reduce((S,{componentName:N,conditionTypes:P})=>P.includes(y.type)?N:S,null);if(_&&y.id){let S=E(_,y.id);if(S)return S}return null}function W(y){t.onPointerDown({entity:y,opts:{button:0,hoverText:"Click"}},()=>{Gt(y).emit(yt.ON_CLICK)})}function I(y){let{scale:_}=Re.get(y);gf.addTrigger(y,pi,yf,[{type:"box",scale:_}],()=>{Gt(y).emit(yt.ON_PLAYER_ENTERS_AREA)},()=>{Gt(y).emit(yt.ON_PLAYER_LEAVES_AREA)})}}var M2=new Set,Im=new Map,Mm=new Map,Cx=null;function z2(e,t){let{Animator:a,Transform:n,AudioSource:s,AvatarAttach:i,VisibilityComponent:f,GltfContainer:u}=t,{Actions:c,States:h,Counter:E,Triggers:C}=Bf(e);return Cx=v,function(ae){let ce=e.getEntitiesWith(c);for(let[Se]of ce)v(Se)};function v(V){if(!c.has(V)||M2.has(V))return;let ae=c.get(V),ce=ae.value.reduce((he,et)=>he.add(et.type),new Set);for(let he of ce)switch(he){case Te.PLAY_ANIMATION:{W(V);break}default:break}let Se=xs(V);for(let he of ae.value)Se.on(he.name,()=>{switch(he.type){case Te.PLAY_ANIMATION:{I(V,nt(he));break}case Te.STOP_ANIMATION:{y(V,nt(he));break}case Te.SET_STATE:{_(V,nt(he));break}case Te.START_TWEEN:{S(V,nt(he));break}case Te.SET_COUNTER:{ve(V,nt(he));break}case Te.INCREMENT_COUNTER:{j(V,nt(he));break}case Te.DECREASE_COUNTER:{q(V,nt(he));break}case Te.PLAY_SOUND:{ne(V,nt(he));break}case Te.STOP_SOUND:{ie(V,nt(he));break}case Te.SET_VISIBILITY:{K(V,nt(he));break}case Te.ATTACH_TO_PLAYER:{A(V,nt(he));break}case Te.DETACH_FROM_PLAYER:{M(V,nt(he));break}case Te.PLAY_VIDEO_STREAM:{Ge(V,nt(he));break}case Te.STOP_VIDEO_STREAM:{Ye(V,nt(he));break}case Te.PLAY_AUDIO_STREAM:{rt(V,nt(he));break}case Te.STOP_AUDIO_STREAM:{Ke(V,nt(he));break}case Te.TELEPORT_PLAYER:{X(V,nt(he));break}case Te.MOVE_PLAYER:{re(V,nt(he));break}case Te.PLAY_DEFAULT_EMOTE:{fe(V,nt(he));break}case Te.PLAY_CUSTOM_EMOTE:{we(V,nt(he));break}case Te.OPEN_LINK:{De(V,nt(he));break}case Te.SHOW_TEXT:{Tt(V,nt(he));break}case Te.HIDE_TEXT:{He(V,nt(he));break}case Te.START_DELAY:{F(V,nt(he));break}case Te.STOP_DELAY:{ee(V,nt(he));break}case Te.START_LOOP:{pe(V,nt(he));break}case Te.STOP_LOOP:{U(V,nt(he));break}case Te.CLONE_ENTITY:{Q(V,nt(he));break}case Te.REMOVE_ENTITY:{_e(V,nt(he));break}case Te.SHOW_IMAGE:{dn(V,nt(he));break}case Te.HIDE_IMAGE:{Vo(V,nt(he));break}default:break}});M2.add(V)}function W(V){a.has(V)||(a.create(V,{states:[]}),a.stopAllAnimations(V))}function I(V,ae){let{animation:ce,loop:Se}=ae,he=a.getMutable(V);he.states.some(Yt=>Yt.clip===ce)||(he.states=[...he.states,{clip:ce}]),a.stopAllAnimations(V);let et=a.getClip(V,ce);et.playing=!0,et.loop=Se??!1}function y(V,ae){a.has(V)&&a.stopAllAnimations(V)}function _(V,ae){let ce=h.getMutableOrNull(V);if(ce){let Se=ae.state;Se=Pf(ce,Se)?Se:wm(ce),ce.currentValue=Se,Gt(V).emit(yt.ON_STATE_CHANGE)}}function S(V,ae){if(ae){let ce=Gt(V),Se=()=>ce.emit(yt.ON_TWEEN_END);switch(ae.type){case jo.MOVE_ITEM:{N(V,ae,Se);break}case jo.ROTATE_ITEM:{P(V,ae,Se);break}case jo.SCALE_ITEM:{oe(V,ae,Se);break}default:throw new Error(`Unknown tween type: ${ae.type}`)}}}function N(V,ae,ce){let Se=n.get(V),{duration:he,interpolationType:et,relative:Yt}=ae,$e=D.create(ae.end.x,ae.end.y,ae.end.z),Ln=Yt?D.add(Se.position,$e):$e;Ac.startTranslation(V,Se.position,Ln,he,et,ce)}function P(V,ae,ce){let Se=n.get(V),{duration:he,interpolationType:et,relative:Yt}=ae,$e=ze.fromEulerDegrees(ae.end.x,ae.end.y,ae.end.z),Ln=Yt?ze.multiply(Se.rotation,$e):$e;Ac.startRotation(V,Se.rotation,Ln,he,et,ce)}function oe(V,ae,ce){let Se=n.get(V),{duration:he,interpolationType:et,relative:Yt}=ae,$e=D.create(ae.end.x,ae.end.y,ae.end.z),Ln=Yt?D.add(Se.scale,$e):$e;Ac.startScaling(V,Se.scale,Ln,he,et,ce)}function ve(V,ae){let ce=E.getMutableOrNull(V);ce&&(ce.value=ae.counter,Gt(V).emit(yt.ON_COUNTER_CHANGE))}function j(V,ae){let ce=E.getMutableOrNull(V);ce&&(ce.value+=1,Gt(V).emit(yt.ON_COUNTER_CHANGE))}function q(V,ae){let ce=E.getMutableOrNull(V);ce&&(ce.value-=1,Gt(V).emit(yt.ON_COUNTER_CHANGE))}function ne(V,ae){let{src:ce,loop:Se,volume:he}=ae;s.createOrReplace(V,{audioClipUrl:ce,loop:Se,playing:!0,volume:he??1})}function ie(V,ae){let ce=s.getMutableOrNull(V);ce&&(ce.playing=!1)}function K(V,ae){let{visible:ce,collider:Se}=ae;f.createOrReplace(V,{visible:ce});let he=u.getMutableOrNull(V),et=Sc.getMutableOrNull(V);Se!==void 0&&(he?he.invisibleMeshesCollisionMask=Se:et&&(et.collisionMask=Se))}function A(V,ae){let{anchorPointId:ce}=ae;i.createOrReplace(V,{anchorPointId:ce})}function M(V,ae){i.has(V)&&i.deleteFrom(V)}function X(V,ae){let{x:ce,y:Se}=ae;(0,P2.requestTeleport)({destination:`${ce},${Se}`})}function re(V,ae){let ce={newRelativePosition:ae.position,cameraTarget:ae.cameraTarget};console.log("movePlayerTo",ce),(0,hi.movePlayerTo)(ce)}function fe(V,ae){let{emote:ce}=ae;(0,hi.triggerEmote)({predefinedEmote:ce})}function we(V,ae){let{src:ce,loop:Se}=ae;(0,hi.triggerSceneEmote)({src:ce,loop:Se})}function De(V,ae){let{url:ce}=ae;(0,hi.openExternalUrl)({url:ce})}async function Fe({src:V,dclCast:ae}){if(ae){let{streams:ce}=await(0,B2.getActiveVideoStreams)({});return ce.length>0?ce[0].trackSid:""}return V??""}function Ge(V,ae){let ce=as.getMutableOrNull(V);ce&&ce.src?ce.playing=!0:Fe(ae).then(Se=>{Se&&(as.createOrReplace(V,{src:Se,volume:ae.volume??1,loop:ae.loop??!1,playing:!0}),Am(V,t,Tn.getOrNull(V)))})}function Ye(V,ae){let ce=as.getMutableOrNull(V);ce&&(ce.playing=!1)}function rt(V,ae){let{url:ce,volume:Se}=ae;Up.createOrReplace(V,{url:ce,playing:!0,volume:Se??1})}function Ke(V,ae){let ce=Up.getMutableOrNull(V);ce&&(ce.playing=!1)}function Tt(V,ae){let{text:ce,hideAfterSeconds:Se,font:he,fontSize:et,textAlign:Yt}=ae;Dc(V)&&(is.createOrReplace(V,{value:ce,font:he,fontSize:et,textAlign:Yt}),zf(V,Te.HIDE_TEXT,Se,()=>He(V,{})))}function He(V,ae){is.getOrNull(V)&&is.deleteFrom(V)}function tn(V,ae){return c.getOrNull(V)?.value.find(Se=>Se.name===ae)}function F(V,ae){let{actions:ce,timeout:Se}=ae;for(let he of ce){let et=tn(V,he);et&&zf(V,he,Se,()=>{xs(V).emit(et.name,nt(et))})}}function ee(V,ae){let{action:ce}=ae;x2(V,ce)}function pe(V,ae){let{actions:ce,interval:Se}=ae;for(let he of ce){let et=tn(V,he);et&&R2(V,he,Se,()=>{xs(V).emit(et.name,nt(et))})}}function U(V,ae){let{action:ce}=ae;v2(V,ce)}function Q(V,ae){let{position:ce}=ae,Se=g2(V,e,C);v(Se),C2(Se);let he=n.getOrCreateMutable(Se);he.position=ce,Gt(Se).emit(yt.ON_CLONE)}function _e(V,ae){b2(V),k2(V),e.removeEntity(V)}function ot(V){let ae=`${V.alignItems},${V.justifyContent}`;return Im.has(ae)||Im.set(ae,e.addEntity()),Im.get(ae)}function dn(V,ae){let{src:ce,text:Se,hideAfterSeconds:he,fontSize:et,align:Yt,height:$e,width:Ln}=ae;Dc(e.RootEntity);let Xn=N2(Yt),mo=ot(Xn),ho=Dc(mo);ho.alignItems=Xn.alignItems,ho.justifyContent=Xn.justifyContent,ho.positionType=1;let Zn=e.addEntity(),yo=Dc(Zn,Ln,$e,1);yo.parent=mo,yo.pointerFilter=1,w2(Zn,ce),Se&&A2(Zn,Se,et,Ln),Mo.onPointerDown({entity:Zn,opts:{button:0,hoverText:"Click"}},()=>{Mm.set(V,Zn),Gt(V).emit(yt.ON_CLICK_IMAGE)}),he&&zf(V,Te.HIDE_IMAGE,he,()=>Vo(V,{imageEntity:Zn}))}function Vo(V,ae){let{imageEntity:ce}=ae;if(ce)e.removeEntity(ce);else{let Se=Mm.get(V);Se&&(e.removeEntity(Se),Mm.delete(V))}}}function U2(e,t,a){let n=e,s=t,i=a;try{E2(n),n.addSystem(z2(n,i)),n.addSystem(I2(n,s)),n.addSystem(S2()),T2(n,i)}catch(f){console.error(`Error initializing Asset Packs: ${f.message}`)}}U2(G,Mo,{Animator:mt,AudioSource:Fn,AvatarAttach:_c,Transform:Re,VisibilityComponent:wt,GltfContainer:$t,Material:Tn,VideoPlayer:as});function Uf(){Wp.create(G.RootEntity,{id:1001}),pt(G.RootEntity,[Wp.componentId],1e3);let e=G.addEntity();en.create(e,{}),pt(e,[en.componentId],20);let t=G.addEntity();Re.create(t,{position:D.create(19,2,4),rotation:ze.fromEulerDegrees(0,90,0)}),sr.create(t,{text:`You don't want to know what's -behind the kitchen`,fontSize:3});let a=G.getEntityOrNullByName("ExpenderNoodles"),n=G.getEntityOrNullByName("ExpenderRolls"),s=G.getEntityOrNullByName("Noodle Button"),i=G.getEntityOrNullByName("Roll Button");a&&n&&s&&i&&(Gt(s).on(yt.ON_CLICK,()=>{console.log("BUTTON WAS PRESSED!!");let K=D.add(Re.get(a).position,D.create(0,.7,0));em(0,K,!0)}),Gt(i).on(yt.ON_CLICK,()=>{console.log("BUTTON WAS PRESSED!!");let K=D.add(Re.get(n).position,D.create(0,.7,0));em(1,K,!0)}),pt(s,[mt.componentId,Fn.componentId],25),pt(i,[mt.componentId,Fn.componentId],26));let f=G.getEntityOrNullByName("Pot1"),u=G.getEntityOrNullByName("Pot2"),c=G.getEntityOrNullByName("Pot1 Button"),h=G.getEntityOrNullByName("Pot2 Button");f&&u&&c&&h&&(Xp(f,6,48,49),Xp(u,7,50,51),Gt(c).on(yt.ON_CLICK,()=>{console.log("BUTTON WAS PRESSED!!"),Zp(f)}),Gt(h).on(yt.ON_CLICK,()=>{console.log("BUTTON WAS PRESSED!!"),Zp(u)}),pt(c,[mt.componentId,Fn.componentId],23),pt(h,[mt.componentId,Fn.componentId],24));let E=G.getEntityOrNullByName("Restart_Button");E&&(Gt(E).on(yt.ON_CLICK,()=>{Kp()}),pt(E,[mt.componentId,Fn.componentId],27)),Cc(1),Cc(2),Cc(3),Cc(4);let C=G.addEntity();$t.create(C,{src:"assets/models/beerDispenser.glb"}),Re.create(C,{position:D.create(19.5,1,8.5),rotation:ze.fromEulerDegrees(0,270,0)}),pt(C,[],19),bf(1,C,1),bf(3,C,3),bf(2,C,2),tm(D.create(17.5,1.1,14.5),4),tm(D.create(15.5,1.1,14.5),5);let v=G.getEntityOrNullByName("Beer1"),W=G.getEntityOrNullByName("Beer2"),I=G.getEntityOrNullByName("Beer3"),y=G.getEntityOrNullByName("Beer4"),_=G.getEntityOrNullByName("Beer5"),S=G.getEntityOrNullByName("Beer6"),N=G.getEntityOrNullByName("Beer7"),P=G.getEntityOrNullByName("Beer8"),oe=G.getEntityOrNullByName("Beer9");v&&W&&I&&y&&_&&S&&N&&P&&oe&&(fo(v,10),fo(W,11),fo(I,12),fo(y,13),fo(_,14),fo(S,15),fo(N,16),fo(P,17),fo(oe,18));let ve=G.addEntity();Re.create(ve,{position:D.create(17,2,12)}),Tg.create(ve,{area:D.create(6,2,10),mode:nf.CT_FIRST_PERSON});let j=G.getEntityOrNullByName("Score"),q=G.getEntityOrNullByName("Misses");j&&q&&(pt(j,[sr.componentId],21),pt(q,[sr.componentId],22)),G.addSystem(dE),G.addSystem(pE),G.addSystem(fE),G.addSystem($g),G.addSystem(sE),d2()}var vs=require("~system/EngineApi");function L2(e){async function t(n){let s=await e.crdtSendToRenderer({data:new Uint8Array(n)});if(s&&s.data&&s.data.length&&a.onmessage)for(let i of s.data)a.onmessage(i)}let a={async send(n){try{await t(n)}catch(s){console.error(s);debugger}},filter(n){return n.componentId>Cp?!1:!!n},type:"renderer"};return a}var Pm=class{constructor(t,a=!1,n,s){this.initalize(t,a,n,s)}initalize(t,a=!1,n,s){return this.mask=t,this.skipNextObservers=a,this.target=n,this.currentTarget=s,this}},Bm=class{constructor(t,a,n=null){this.callback=t,this.mask=a,this.scope=n,this.unregisterOnNextCall=!1,this._willBeUnregistered=!1}},Kn=class e{constructor(t){this._observers=new Array,this._onObserverAdded=null,this._eventState=new Pm(0),t&&(this._onObserverAdded=t)}add(t,a=-1,n=!1,s=null,i=!1){if(!t)return null;let f=new Bm(t,a,s);return f.unregisterOnNextCall=i,n?this._observers.unshift(f):this._observers.push(f),this._onObserverAdded&&this._onObserverAdded(f),f}addOnce(t){return this.add(t,void 0,void 0,void 0,!0)}remove(t){return t&&this._observers.indexOf(t)!==-1?(this._deferUnregister(t),!0):!1}removeCallback(t,a){for(let n=0;n{f.skipNextObservers||u._willBeUnregistered||u.mask&a&&(u.scope?i=i.then(c=>(f.lastReturnValue=c,u.callback.apply(u.scope,[t,f]))):i=i.then(c=>(f.lastReturnValue=c,u.callback(t,f))),u.unregisterOnNextCall&&this._deferUnregister(u))}),i.then(()=>t)}notifyObserver(t,a,n=-1){let s=this._eventState;s.mask=n,s.skipNextObservers=!1,t.callback(a,s)}hasObservers(){return this._observers.length>0}clear(){this._observers=new Array,this._onObserverAdded=null}clone(){let t=new e;return t._observers=this._observers.slice(0),t}hasSpecificMask(t=-1){for(let a of this._observers)if(a.mask&t||a.mask===t)return!0;return!1}_deferUnregister(t){t.unregisterOnNextCall=!1,t._willBeUnregistered=!0,Promise.resolve().then.bind(Promise.resolve())(async()=>this._remove(t)).catch(console.error)}_remove(t){if(!t)return!1;let a=this._observers.indexOf(t);return a!==-1?(this._observers.splice(a,1),!0):!1}};var D2=require("~system/EngineApi"),Mx=D2.subscribe;function Hr(e){return()=>{Mx({eventId:e}).catch(console.error)}}var Px=new Kn(Hr("onEnterScene"));var Bx=new Kn(Hr("onLeaveScene"));var zx=new Kn(Hr("sceneStart")),Ux=new Kn(Hr("playerExpression")),Lx=new Kn(Hr("videoEvent")),Dx=new Kn(Hr("profileChanged")),Fx=new Kn(Hr("playerConnected")),jx=new Kn(Hr("playerDisconnected")),Wx=new Kn(Hr("onRealmChanged")),Hx=new Kn(Hr("playerClicked")),Vx=new Kn(Hr("comms"));async function F2(e){let{events:t}=await e({actions:[]});for(let a of t)if(a.generic){let n=JSON.parse(a.generic.eventData);switch(a.generic.eventId){case"onEnterScene":{Px.notifyObservers(n);break}case"onLeaveScene":{Bx.notifyObservers(n);break}case"sceneStart":{zx.notifyObservers(n);break}case"playerExpression":{Ux.notifyObservers(n);break}case"videoEvent":{let s=n;Lx.notifyObservers(s);break}case"profileChanged":{Dx.notifyObservers(n);break}case"playerConnected":{Fx.notifyObservers(n);break}case"playerDisconnected":{jx.notifyObservers(n);break}case"onRealmChanged":{Wx.notifyObservers(n);break}case"playerClicked":{Hx.notifyObservers(n);break}case"comms":{Vx.notifyObservers(n);break}}}}var zm={"assets/scene/main.composite":{version:1,components:[{name:"composite::root",jsonSchema:{type:"object",properties:{src:{type:"string",serializationType:"utf8-string"},entities:{type:"array",items:{type:"object",properties:{src:{type:"integer",serializationType:"entity"},dest:{type:"integer",serializationType:"entity"}},serializationType:"map"},serializationType:"array"}},serializationType:"map"},data:{}},{name:"core::Transform",jsonSchema:{type:"object",properties:{position:{type:"object",properties:{x:{type:"number"},y:{type:"number"},z:{type:"number"}}},scale:{type:"object",properties:{x:{type:"number"},y:{type:"number"},z:{type:"number"}}},rotation:{type:"object",properties:{x:{type:"number"},y:{type:"number"},z:{type:"number"},w:{type:"number"}}},parent:{type:"integer"}},serializationType:"transform"},data:{513:{json:{position:{x:11,y:0,z:11},scale:{x:1,y:1,z:1},rotation:{x:0,y:1,z:0,w:6123234262925839e-32},parent:0}},514:{json:{position:{x:19.462968826293945,y:1.0224852561950684,z:10.496221542358398},scale:{x:.9999999403953552,y:1,z:.9999999403953552},rotation:{x:0,y:-.7071067690849304,z:0,w:.7071067690849304},parent:0}},515:{json:{position:{x:19.35105323791504,y:1.0425816774368286,z:12.364835739135742},scale:{x:.9999999403953552,y:1,z:.9999999403953552},rotation:{x:0,y:-.7071067690849304,z:0,w:.7071067690849304},parent:0}},516:{json:{position:{x:18.510000228881836,y:1.0099999904632568,z:14.539999961853027},scale:{x:1,y:1,z:1},rotation:{x:0,y:.7071067690849304,z:0,w:.7071067690849304},parent:0}},517:{json:{position:{x:16.479999542236328,y:1.0099999904632568,z:14.529999732971191},scale:{x:1,y:1,z:1},rotation:{x:0,y:.7071067690849304,z:0,w:.7071067690849304},parent:0}},518:{json:{position:{x:19.096506118774414,y:.7099999785423279,z:12.5},scale:{x:.9999999403953552,y:.9999999403953552,z:1},rotation:{x:0,y:0,z:.7071067690849304,w:.7071067690849304},parent:0}},519:{json:{position:{x:19.096506118774414,y:.7099999785423279,z:10.548395156860352},scale:{x:.9999998807907104,y:.9999998807907104,z:1},rotation:{x:0,y:0,z:.7071067690849304,w:.7071067690849304},parent:0}},520:{json:{position:{x:18.46963119506836,y:.7099999785423279,z:14.05458927154541},scale:{x:1,y:1,z:1},rotation:{x:-.5,y:-.5,z:.5,w:.5},parent:0}},521:{json:{position:{x:16.46424102783203,y:.7099999785423279,z:14.05458927154541},rotation:{x:-.5,y:-.5,z:.5,w:.5},scale:{x:1,y:1,z:1},parent:0}},522:{json:{position:{x:14.706628799438477,y:1.012992262840271,z:9.178457260131836},scale:{x:1,y:1,z:1},rotation:{x:0,y:.6473962068557739,z:0,w:.7621536254882812},parent:0}},523:{json:{position:{x:14.002402305603027,y:1.012992262840271,z:9.178457260131836},scale:{x:1,y:1,z:1},rotation:{x:0,y:.6473961472511292,z:0,w:.762153685092926},parent:0}},524:{json:{position:{x:19.233787536621094,y:1.012992262840271,z:11.185989379882812},scale:{x:1,y:1,z:1},rotation:{x:0,y:.6473961472511292,z:0,w:.762153685092926},parent:0}},525:{json:{position:{x:19.233787536621094,y:1.012992262840271,z:13.173835754394531},scale:{x:1,y:1,z:1},rotation:{x:0,y:.6473961472511292,z:0,w:.762153685092926},parent:0}},526:{json:{position:{x:18.64331817626953,y:.029041828587651253,z:7.3249101638793945},scale:{x:1,y:1,z:1},rotation:{x:0,y:.6473961472511292,z:0,w:.762153685092926},parent:0}},527:{json:{position:{x:12.185543060302734,y:.07731946557760239,z:1.911895751953125},scale:{x:1,y:1,z:1},rotation:{x:0,y:.6473961472511292,z:0,w:.762153685092926},parent:0}},528:{json:{position:{x:13.326274871826172,y:.07731946557760239,z:11.485663414001465},scale:{x:1,y:1,z:1},rotation:{x:0,y:.17769677937030792,z:0,w:.9840852618217468},parent:0}},529:{json:{position:{x:14.002402305603027,y:1.012992262840271,z:14.68221664428711},scale:{x:1,y:1,z:1},rotation:{x:0,y:.6473961472511292,z:0,w:.762153685092926},parent:0}},530:{json:{position:{x:14.407966613769531,y:1.012992262840271,z:14.085762977600098},scale:{x:1,y:1,z:1},rotation:{x:0,y:.6473961472511292,z:0,w:.762153685092926},parent:0}},531:{json:{position:{x:16.843204498291016,y:2.992232322692871,z:14.752776145935059},rotation:{x:0,y:0,z:0,w:1},scale:{x:1,y:1,z:1},parent:0}},532:{json:{position:{x:16.843204498291016,y:2.4553236961364746,z:14.752776145935059},rotation:{x:0,y:0,z:0,w:1},scale:{x:1,y:1,z:1},parent:0}},534:{json:{position:{x:8,y:-.05000000074505806,z:8},rotation:{x:0,y:0,z:0,w:1},scale:{x:1,y:1,z:1},parent:0}},535:{json:{position:{x:24,y:-.05000000074505806,z:8},rotation:{x:0,y:0,z:0,w:1},scale:{x:1,y:1,z:1},parent:0}},536:{json:{position:{x:24,y:-.05000000074505806,z:24},rotation:{x:0,y:0,z:0,w:1},scale:{x:1,y:1,z:1},parent:0}},537:{json:{position:{x:8,y:-.05000000074505806,z:24},rotation:{x:0,y:0,z:0,w:1},scale:{x:1,y:1,z:1},parent:0}},538:{json:{position:{x:17.479999542236328,y:1.2400000095367432,z:7.019999980926514},rotation:{x:.7071067690849304,y:0,z:0,w:.7071067690849304},scale:{x:.75,y:.75,z:.75},parent:0}},539:{json:{position:{x:17.445201873779297,y:1.742148756980896,z:7.010000228881836},rotation:{x:0,y:1,z:0,w:6123234262925839e-32},scale:{x:1,y:1,z:1},parent:0}},540:{json:{position:{x:12.081329345703125,y:4.309999942779541,z:1.010474443435669},rotation:{x:0,y:1,z:0,w:6123234262925839e-32},scale:{x:1,y:1,z:1},parent:0}},541:{json:{position:{x:.9356998801231384,y:4.95363712310791,z:12.010000228881836},rotation:{x:-.7071067690849304,y:-4329780632585522e-32,z:.7071067690849304,w:4329780632585522e-32},scale:{x:.9999999403953552,y:.9999999403953552,z:.9999999403953552},parent:0}}}},{name:"core::GltfContainer",jsonSchema:{type:"object",properties:{},serializationType:"protocol-buffer",protocolBuffer:"PBGltfContainer"},data:{513:{json:{src:"assets/models/Environment.glb",visibleMeshesCollisionMask:1,invisibleMeshesCollisionMask:2}},514:{json:{src:"assets/models/ExpenderNoodles.glb",visibleMeshesCollisionMask:1,invisibleMeshesCollisionMask:2}},515:{json:{src:"assets/models/ExpenderRolls.glb",visibleMeshesCollisionMask:1,invisibleMeshesCollisionMask:2}},516:{json:{src:"assets/models/CookingPotClean.glb",visibleMeshesCollisionMask:1,invisibleMeshesCollisionMask:2}},517:{json:{src:"assets/models/CookingPotClean.glb",visibleMeshesCollisionMask:1,invisibleMeshesCollisionMask:2}},518:{json:{src:"assets/builder/red_button/red_button.glb",visibleMeshesCollisionMask:1,invisibleMeshesCollisionMask:2}},519:{json:{src:"assets/builder/red_button/red_button.glb",visibleMeshesCollisionMask:1,invisibleMeshesCollisionMask:2}},520:{json:{src:"assets/builder/red_button/red_button.glb",visibleMeshesCollisionMask:1,invisibleMeshesCollisionMask:2}},521:{json:{src:"assets/builder/red_button/red_button.glb",visibleMeshesCollisionMask:1,invisibleMeshesCollisionMask:2}},522:{json:{src:"assets/models/beerGlass.glb",visibleMeshesCollisionMask:1,invisibleMeshesCollisionMask:2}},523:{json:{src:"assets/models/beerGlass.glb",visibleMeshesCollisionMask:1,invisibleMeshesCollisionMask:2}},524:{json:{src:"assets/models/beerGlass.glb",visibleMeshesCollisionMask:1,invisibleMeshesCollisionMask:2}},525:{json:{src:"assets/models/beerGlass.glb",visibleMeshesCollisionMask:1,invisibleMeshesCollisionMask:2}},526:{json:{src:"assets/models/beerGlass.glb",visibleMeshesCollisionMask:1,invisibleMeshesCollisionMask:2}},527:{json:{src:"assets/models/beerGlass.glb",visibleMeshesCollisionMask:1,invisibleMeshesCollisionMask:2}},528:{json:{src:"assets/models/beerGlass.glb",visibleMeshesCollisionMask:1,invisibleMeshesCollisionMask:2}},529:{json:{src:"assets/models/beerGlass.glb",visibleMeshesCollisionMask:1,invisibleMeshesCollisionMask:2}},530:{json:{src:"assets/models/beerGlass.glb",visibleMeshesCollisionMask:1,invisibleMeshesCollisionMask:2}},534:{json:{src:"assets/builder/concrete/FloorBaseConcrete_01/FloorBaseConcrete_01.glb",visibleMeshesCollisionMask:1,invisibleMeshesCollisionMask:2}},535:{json:{src:"assets/builder/concrete/FloorBaseConcrete_01/FloorBaseConcrete_01.glb",visibleMeshesCollisionMask:1,invisibleMeshesCollisionMask:2}},536:{json:{src:"assets/builder/concrete/FloorBaseConcrete_01/FloorBaseConcrete_01.glb",visibleMeshesCollisionMask:1,invisibleMeshesCollisionMask:2}},537:{json:{src:"assets/builder/concrete/FloorBaseConcrete_01/FloorBaseConcrete_01.glb",visibleMeshesCollisionMask:1,invisibleMeshesCollisionMask:2}},538:{json:{src:"assets/builder/red_light_button/red_scifi_button.glb",visibleMeshesCollisionMask:1,invisibleMeshesCollisionMask:2}},540:{json:{src:"assets/builder/arrow_sign/Arrow_Sign.glb",visibleMeshesCollisionMask:1,invisibleMeshesCollisionMask:2}},541:{json:{src:"assets/builder/arrow_sign/Arrow_Sign.glb",visibleMeshesCollisionMask:1,invisibleMeshesCollisionMask:2}}}},{name:"core-schema::Name",jsonSchema:{type:"object",properties:{value:{type:"string",serializationType:"utf8-string"}},serializationType:"map"},data:{513:{json:{value:"Environment.glb"}},514:{json:{value:"ExpenderNoodles"}},515:{json:{value:"ExpenderRolls"}},516:{json:{value:"Pot1"}},517:{json:{value:"Pot2"}},518:{json:{value:"Roll Button"}},519:{json:{value:"Noodle Button"}},520:{json:{value:"Pot1 Button"}},521:{json:{value:"Pot2 Button"}},522:{json:{value:"Beer1"}},523:{json:{value:"Beer2"}},524:{json:{value:"Beer3"}},525:{json:{value:"Beer4"}},526:{json:{value:"Beer5"}},527:{json:{value:"Beer6"}},528:{json:{value:"Beer7"}},529:{json:{value:"Beer8"}},530:{json:{value:"Beer9"}},531:{json:{value:"Score"}},532:{json:{value:"Misses"}},534:{json:{value:"Concrete"}},535:{json:{value:"Concrete"}},536:{json:{value:"Concrete"}},537:{json:{value:"Concrete"}},538:{json:{value:"Restart_Button"}},539:{json:{value:"Text"}},540:{json:{value:"Arrow Sign"}},541:{json:{value:"Arrow Sign"}}}},{name:"core::TextShape",jsonSchema:{type:"object",properties:{},serializationType:"protocol-buffer",protocolBuffer:"PBTextShape"},data:{531:{json:{text:"Score: 0",font:2,fontSize:6,fontAutoSize:!1,textAlign:4,width:100,height:100,paddingTop:0,paddingRight:0,paddingBottom:0,paddingLeft:0,lineSpacing:0,lineCount:1,textWrapping:!1,shadowBlur:0,shadowOffsetX:0,shadowOffsetY:0,outlineWidth:0,shadowColor:{r:1,g:1,b:1},outlineColor:{r:1,g:1,b:1},textColor:{r:1,g:1,b:1,a:1}}},532:{json:{text:"Misses: 0",font:2,fontSize:4,fontAutoSize:!1,textAlign:4,width:100,height:100,paddingTop:0,paddingRight:0,paddingBottom:0,paddingLeft:0,lineSpacing:0,lineCount:1,textWrapping:!1,shadowBlur:0,shadowOffsetX:0,shadowOffsetY:0,outlineWidth:0,shadowColor:{r:1,g:1,b:1},outlineColor:{r:1,g:1,b:1},textColor:{r:1,g:0,b:0,a:1}}},539:{json:{text:"Restart",font:2,fontSize:3,fontAutoSize:!1,textAlign:4,width:100,height:100,paddingTop:0,paddingRight:0,paddingBottom:0,paddingLeft:0,lineSpacing:0,lineCount:1,textWrapping:!1,shadowBlur:0,shadowOffsetX:0,shadowOffsetY:0,outlineWidth:0,shadowColor:{r:1,g:1,b:1},outlineColor:{r:1,g:1,b:1},textColor:{r:1,g:1,b:1,a:1}}}}},{name:"core::Animator",jsonSchema:{type:"object",properties:{},serializationType:"protocol-buffer",protocolBuffer:"PBAnimator"},data:{518:{json:{states:[{clip:"trigger",playing:!1,weight:1,speed:1,loop:!1,shouldReset:!1}]}},519:{json:{states:[{clip:"trigger",playing:!1,weight:1,speed:1,loop:!1,shouldReset:!1}]}},520:{json:{states:[{clip:"trigger",playing:!1,weight:1,speed:1,loop:!1,shouldReset:!1}]}},521:{json:{states:[{clip:"trigger",playing:!1,weight:1,speed:1,loop:!1,shouldReset:!1}]}},522:{json:{states:[{clip:"PourRed",playing:!1,weight:1,speed:1,loop:!1,shouldReset:!1},{clip:"Blank",playing:!0,weight:1,speed:1,loop:!1,shouldReset:!1},{clip:"PourYellow",playing:!1,weight:1,speed:1,loop:!1,shouldReset:!1},{clip:"PourGreen",playing:!1,weight:1,speed:1,loop:!1,shouldReset:!1}]}},523:{json:{states:[{clip:"PourRed",playing:!1,weight:1,speed:1,loop:!1,shouldReset:!1},{clip:"Blank",playing:!0,weight:1,speed:1,loop:!1,shouldReset:!1},{clip:"PourYellow",playing:!1,weight:1,speed:1,loop:!1,shouldReset:!1},{clip:"PourGreen",playing:!1,weight:1,speed:1,loop:!1,shouldReset:!1}]}},524:{json:{states:[{clip:"PourRed",playing:!1,weight:1,speed:1,loop:!1,shouldReset:!1},{clip:"Blank",playing:!0,weight:1,speed:1,loop:!1,shouldReset:!1},{clip:"PourYellow",playing:!1,weight:1,speed:1,loop:!1,shouldReset:!1},{clip:"PourGreen",playing:!1,weight:1,speed:1,loop:!1,shouldReset:!1}]}},525:{json:{states:[{clip:"PourRed",playing:!1,weight:1,speed:1,loop:!1,shouldReset:!1},{clip:"Blank",playing:!0,weight:1,speed:1,loop:!1,shouldReset:!1},{clip:"PourYellow",playing:!1,weight:1,speed:1,loop:!1,shouldReset:!1},{clip:"PourGreen",playing:!1,weight:1,speed:1,loop:!1,shouldReset:!1}]}},526:{json:{states:[{clip:"PourRed",playing:!1,weight:1,speed:1,loop:!1,shouldReset:!1},{clip:"Blank",playing:!0,weight:1,speed:1,loop:!1,shouldReset:!1},{clip:"PourYellow",playing:!1,weight:1,speed:1,loop:!1,shouldReset:!1},{clip:"PourGreen",playing:!1,weight:1,speed:1,loop:!1,shouldReset:!1}]}},527:{json:{states:[{clip:"PourRed",playing:!1,weight:1,speed:1,loop:!1,shouldReset:!1},{clip:"Blank",playing:!0,weight:1,speed:1,loop:!1,shouldReset:!1},{clip:"PourYellow",playing:!1,weight:1,speed:1,loop:!1,shouldReset:!1},{clip:"PourGreen",playing:!1,weight:1,speed:1,loop:!1,shouldReset:!1}]}},528:{json:{states:[{clip:"PourRed",playing:!1,weight:1,speed:1,loop:!1,shouldReset:!1},{clip:"Blank",playing:!0,weight:1,speed:1,loop:!1,shouldReset:!1},{clip:"PourYellow",playing:!1,weight:1,speed:1,loop:!1,shouldReset:!1},{clip:"PourGreen",playing:!1,weight:1,speed:1,loop:!1,shouldReset:!1}]}},529:{json:{states:[{clip:"PourRed",playing:!1,weight:1,speed:1,loop:!1,shouldReset:!1},{clip:"Blank",playing:!0,weight:1,speed:1,loop:!1,shouldReset:!1},{clip:"PourYellow",playing:!1,weight:1,speed:1,loop:!1,shouldReset:!1},{clip:"PourGreen",playing:!1,weight:1,speed:1,loop:!1,shouldReset:!1}]}},530:{json:{states:[{clip:"PourRed",playing:!1,weight:1,speed:1,loop:!1,shouldReset:!1},{clip:"Blank",playing:!0,weight:1,speed:1,loop:!1,shouldReset:!1},{clip:"PourYellow",playing:!1,weight:1,speed:1,loop:!1,shouldReset:!1},{clip:"PourGreen",playing:!1,weight:1,speed:1,loop:!1,shouldReset:!1}]}},538:{json:{states:[{clip:"trigger",playing:!1,weight:1,speed:1,loop:!1,shouldReset:!1}]}}}},{name:"core::PointerEvents",jsonSchema:{type:"object",properties:{},serializationType:"protocol-buffer",protocolBuffer:"PBPointerEvents"},data:{513:{json:{pointerEvents:[{eventType:1,eventInfo:{button:3,hoverText:"Interact",maxDistance:10,showFeedback:!1}}]}},522:{json:{pointerEvents:[{eventType:1,eventInfo:{button:1,hoverText:"Pick Up",maxDistance:5,showFeedback:!0}}]}},523:{json:{pointerEvents:[{eventType:1,eventInfo:{button:1,hoverText:"Pick Up",maxDistance:5,showFeedback:!0}}]}},524:{json:{pointerEvents:[{eventType:1,eventInfo:{button:1,hoverText:"Pick Up",maxDistance:5,showFeedback:!0}}]}},525:{json:{pointerEvents:[{eventType:1,eventInfo:{button:1,hoverText:"Pick Up",maxDistance:5,showFeedback:!0}}]}},526:{json:{pointerEvents:[{eventType:1,eventInfo:{button:1,hoverText:"Pick Up",maxDistance:5,showFeedback:!0}}]}},527:{json:{pointerEvents:[{eventType:1,eventInfo:{button:1,hoverText:"Pick Up",maxDistance:5,showFeedback:!0}}]}},528:{json:{pointerEvents:[{eventType:1,eventInfo:{button:1,hoverText:"Pick Up",maxDistance:5,showFeedback:!0}}]}},529:{json:{pointerEvents:[{eventType:1,eventInfo:{button:1,hoverText:"Pick Up",maxDistance:5,showFeedback:!0}}]}},530:{json:{pointerEvents:[{eventType:1,eventInfo:{button:1,hoverText:"Pick Up",maxDistance:5,showFeedback:!0}}]}},538:{json:{pointerEvents:[{eventType:1,eventInfo:{button:0,hoverText:"Restart",maxDistance:10,showFeedback:!0}}]}}}},{name:"inspector::Selection",jsonSchema:{type:"object",properties:{gizmo:{type:"integer",serializationType:"int32"}},serializationType:"map"},data:{538:{json:{gizmo:0}}}},{name:"inspector::Scene",jsonSchema:{type:"object",properties:{layout:{type:"object",properties:{base:{type:"object",properties:{x:{type:"integer",serializationType:"int32"},y:{type:"integer",serializationType:"int32"}},serializationType:"map"},parcels:{type:"array",items:{type:"object",properties:{x:{type:"integer",serializationType:"int32"},y:{type:"integer",serializationType:"int32"}},serializationType:"map"},serializationType:"array"}},serializationType:"map"}},serializationType:"map"},data:{0:{json:{layout:{base:{x:0,y:0},parcels:[{x:0,y:0},{x:0,y:1},{x:1,y:0},{x:1,y:1}]}}}}},{name:"inspector::Nodes",jsonSchema:{type:"object",properties:{value:{type:"array",items:{type:"object",properties:{entity:{type:"integer",serializationType:"entity"},open:{type:"boolean",serializationType:"optional",optionalJsonSchema:{type:"boolean",serializationType:"boolean"}},children:{type:"array",items:{type:"integer",serializationType:"entity"},serializationType:"array"}},serializationType:"map"},serializationType:"array"}},serializationType:"map"},data:{0:{json:{value:[{entity:512,open:!0,children:[513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540]},{entity:513,children:[]},{entity:514,children:[]},{entity:515,children:[]},{entity:516,children:[]},{entity:517,children:[]},{entity:518,children:[]},{entity:519,children:[]},{entity:520,children:[]},{entity:521,children:[]},{entity:522,children:[]},{entity:523,children:[]},{entity:524,children:[]},{entity:525,children:[]},{entity:526,children:[]},{entity:527,children:[]},{entity:528,children:[]},{entity:529,children:[]},{entity:530,children:[]},{entity:531,children:[]},{entity:532,children:[]},{entity:533,children:[]},{entity:534,children:[]},{entity:535,children:[]},{entity:536,children:[]},{entity:537,children:[]},{entity:538,children:[]},{entity:539,children:[]},{entity:540,children:[]}]}}}},{name:"asset-packs::ActionTypes",jsonSchema:{type:"object",properties:{value:{type:"array",items:{type:"object",properties:{type:{type:"string",serializationType:"utf8-string"},jsonSchema:{type:"string",serializationType:"utf8-string"}},serializationType:"map"},serializationType:"array"}},serializationType:"map"},data:{0:{json:{value:[{type:"play_animation",jsonSchema:'{"type":"object","properties":{"animation":{"type":"string","serializationType":"utf8-string"},"loop":{"type":"boolean","serializationType":"optional","optionalJsonSchema":{"type":"boolean","serializationType":"boolean"}}},"serializationType":"map"}'},{type:"stop_animation",jsonSchema:'{"type":"object","properties":{},"serializationType":"map"}'},{type:"set_state",jsonSchema:'{"type":"object","properties":{"state":{"type":"string","serializationType":"utf8-string"}},"serializationType":"map"}'},{type:"start_tween",jsonSchema:'{"type":"object","properties":{"type":{"type":"string","enum":["move_item","rotate_item","scale_item"],"default":"move_item","serializationType":"enum-string","enumObject":{"MOVE_ITEM":"move_item","ROTATE_ITEM":"rotate_item","SCALE_ITEM":"scale_item"}},"end":{"type":"object","properties":{"x":{"type":"number"},"y":{"type":"number"},"z":{"type":"number"},"w":{"type":"number"}},"serializationType":"vector3"},"interpolationType":{"type":"string","enum":["linear","easeinquad","easeoutquad","easequad","easeinsine","easeoutsine","easeinoutsine","easeinexpo","easeoutexpo","easeinoutexpo","easeinelastic","easeoutelastic","easeinoutelastic","easeinbounce","easeoutbounce","easeinoutbounce"],"default":"linear","serializationType":"enum-string","enumObject":{"LINEAR":"linear","EASEINQUAD":"easeinquad","EASEOUTQUAD":"easeoutquad","EASEQUAD":"easequad","EASEINSINE":"easeinsine","EASEOUTSINE":"easeoutsine","EASESINE":"easeinoutsine","EASEINEXPO":"easeinexpo","EASEOUTEXPO":"easeoutexpo","EASEEXPO":"easeinoutexpo","EASEINELASTIC":"easeinelastic","EASEOUTELASTIC":"easeoutelastic","EASEELASTIC":"easeinoutelastic","EASEINBOUNCE":"easeinbounce","EASEOUTEBOUNCE":"easeoutbounce","EASEBOUNCE":"easeinoutbounce"}},"duration":{"type":"number","serializationType":"float32"},"relative":{"type":"boolean","serializationType":"boolean"}},"serializationType":"map"}'},{type:"set_counter",jsonSchema:'{"type":"object","properties":{"counter":{"type":"integer","serializationType":"int32"}},"serializationType":"map"}'},{type:"increment_counter",jsonSchema:'{"type":"object","properties":{},"serializationType":"map"}'},{type:"decrease_counter",jsonSchema:'{"type":"object","properties":{},"serializationType":"map"}'},{type:"play_sound",jsonSchema:'{"type":"object","properties":{"src":{"type":"string","serializationType":"utf8-string"},"loop":{"type":"boolean","serializationType":"optional","optionalJsonSchema":{"type":"boolean","serializationType":"boolean"}},"volume":{"type":"number","serializationType":"optional","optionalJsonSchema":{"type":"number","serializationType":"float32"}}},"serializationType":"map"}'},{type:"stop_sound",jsonSchema:'{"type":"object","properties":{},"serializationType":"map"}'},{type:"set_visibility",jsonSchema:'{"type":"object","properties":{"visible":{"type":"boolean","serializationType":"boolean"},"physicsCollider":{"type":"boolean","serializationType":"optional","optionalJsonSchema":{"type":"boolean","serializationType":"boolean"}},"collider":{"type":"integer","serializationType":"optional","optionalJsonSchema":{"type":"integer","enum":[0,1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768],"default":1,"serializationType":"enum-int","enumObject":{"0":"CL_NONE","1":"CL_POINTER","2":"CL_PHYSICS","4":"CL_RESERVED1","8":"CL_RESERVED2","16":"CL_RESERVED3","32":"CL_RESERVED4","64":"CL_RESERVED5","128":"CL_RESERVED6","256":"CL_CUSTOM1","512":"CL_CUSTOM2","1024":"CL_CUSTOM3","2048":"CL_CUSTOM4","4096":"CL_CUSTOM5","8192":"CL_CUSTOM6","16384":"CL_CUSTOM7","32768":"CL_CUSTOM8","CL_NONE":0,"CL_POINTER":1,"CL_PHYSICS":2,"CL_RESERVED1":4,"CL_RESERVED2":8,"CL_RESERVED3":16,"CL_RESERVED4":32,"CL_RESERVED5":64,"CL_RESERVED6":128,"CL_CUSTOM1":256,"CL_CUSTOM2":512,"CL_CUSTOM3":1024,"CL_CUSTOM4":2048,"CL_CUSTOM5":4096,"CL_CUSTOM6":8192,"CL_CUSTOM7":16384,"CL_CUSTOM8":32768}}}},"serializationType":"map"}'},{type:"attach_to_player",jsonSchema:'{"type":"object","properties":{"anchorPointId":{"type":"integer","serializationType":"int32"}},"serializationType":"map"}'},{type:"detach_from_player",jsonSchema:'{"type":"object","properties":{},"serializationType":"map"}'},{type:"play_video_stream",jsonSchema:'{"type":"object","properties":{"src":{"type":"string","serializationType":"optional","optionalJsonSchema":{"type":"string","serializationType":"utf8-string"}},"loop":{"type":"boolean","serializationType":"optional","optionalJsonSchema":{"type":"boolean","serializationType":"boolean"}},"volume":{"type":"number","serializationType":"optional","optionalJsonSchema":{"type":"number","serializationType":"float32"}},"dclCast":{"type":"boolean","serializationType":"optional","optionalJsonSchema":{"type":"boolean","serializationType":"boolean"}}},"serializationType":"map"}'},{type:"stop_video_stream",jsonSchema:'{"type":"object","properties":{},"serializationType":"map"}'},{type:"play_audio_stream",jsonSchema:'{"type":"object","properties":{"url":{"type":"string","serializationType":"utf8-string"},"volume":{"type":"number","serializationType":"optional","optionalJsonSchema":{"type":"number","serializationType":"float32"}}},"serializationType":"map"}'},{type:"stop_audio_stream",jsonSchema:'{"type":"object","properties":{},"serializationType":"map"}'},{type:"teleport_player",jsonSchema:'{"type":"object","properties":{"x":{"type":"integer","serializationType":"int32"},"y":{"type":"integer","serializationType":"int32"}},"serializationType":"map"}'},{type:"move_player",jsonSchema:'{"type":"object","properties":{"position":{"type":"object","properties":{"x":{"type":"number"},"y":{"type":"number"},"z":{"type":"number"},"w":{"type":"number"}},"serializationType":"vector3"},"cameraTarget":{"type":"object","serializationType":"optional","optionalJsonSchema":{"type":"object","properties":{"x":{"type":"number"},"y":{"type":"number"},"z":{"type":"number"},"w":{"type":"number"}},"serializationType":"vector3"}}},"serializationType":"map"}'},{type:"play_default_emote",jsonSchema:'{"type":"object","properties":{"emote":{"type":"string","serializationType":"utf8-string"}},"serializationType":"map"}'},{type:"play_custom_emote",jsonSchema:'{"type":"object","properties":{"src":{"type":"string","serializationType":"utf8-string"},"loop":{"type":"boolean","serializationType":"optional","optionalJsonSchema":{"type":"boolean","serializationType":"boolean"}}},"serializationType":"map"}'},{type:"open_link",jsonSchema:'{"type":"object","properties":{"url":{"type":"string","serializationType":"utf8-string"}},"serializationType":"map"}'},{type:"show_text",jsonSchema:'{"type":"object","properties":{"text":{"type":"string","serializationType":"utf8-string"},"hideAfterSeconds":{"type":"number","serializationType":"float32"},"font":{"type":"integer","enum":[0,1,2],"default":0,"serializationType":"enum-int","enumObject":{"0":"F_SANS_SERIF","1":"F_SERIF","2":"F_MONOSPACE","F_SANS_SERIF":0,"F_SERIF":1,"F_MONOSPACE":2}},"fontSize":{"type":"number","serializationType":"optional","optionalJsonSchema":{"type":"number","serializationType":"float32"}},"textAlign":{"type":"integer","enum":[0,1,2,3,4,5,6,7,8],"default":4,"serializationType":"enum-int","enumObject":{"0":"TAM_TOP_LEFT","1":"TAM_TOP_CENTER","2":"TAM_TOP_RIGHT","3":"TAM_MIDDLE_LEFT","4":"TAM_MIDDLE_CENTER","5":"TAM_MIDDLE_RIGHT","6":"TAM_BOTTOM_LEFT","7":"TAM_BOTTOM_CENTER","8":"TAM_BOTTOM_RIGHT","TAM_TOP_LEFT":0,"TAM_TOP_CENTER":1,"TAM_TOP_RIGHT":2,"TAM_MIDDLE_LEFT":3,"TAM_MIDDLE_CENTER":4,"TAM_MIDDLE_RIGHT":5,"TAM_BOTTOM_LEFT":6,"TAM_BOTTOM_CENTER":7,"TAM_BOTTOM_RIGHT":8}}},"serializationType":"map"}'},{type:"hide_text",jsonSchema:'{"type":"object","properties":{},"serializationType":"map"}'},{type:"start_delay",jsonSchema:'{"type":"object","properties":{"actions":{"type":"array","items":{"type":"string","serializationType":"utf8-string"},"serializationType":"array"},"timeout":{"type":"number","serializationType":"float32"}},"serializationType":"map"}'},{type:"stop_delay",jsonSchema:'{"type":"object","properties":{"action":{"type":"string","serializationType":"utf8-string"}},"serializationType":"map"}'},{type:"start_loop",jsonSchema:'{"type":"object","properties":{"actions":{"type":"array","items":{"type":"string","serializationType":"utf8-string"},"serializationType":"array"},"interval":{"type":"number","serializationType":"float32"}},"serializationType":"map"}'},{type:"stop_loop",jsonSchema:'{"type":"object","properties":{"action":{"type":"string","serializationType":"utf8-string"}},"serializationType":"map"}'},{type:"clone_entity",jsonSchema:'{"type":"object","properties":{"position":{"type":"object","properties":{"x":{"type":"number"},"y":{"type":"number"},"z":{"type":"number"},"w":{"type":"number"}},"serializationType":"vector3"}},"serializationType":"map"}'},{type:"remove_entity",jsonSchema:'{"type":"object","properties":{},"serializationType":"map"}'},{type:"show_image",jsonSchema:'{"type":"object","properties":{"src":{"type":"string","serializationType":"utf8-string"},"align":{"type":"integer","enum":[0,1,2,3,4,5,6,7,8],"default":4,"serializationType":"enum-int","enumObject":{"0":"TAM_TOP_LEFT","1":"TAM_TOP_CENTER","2":"TAM_TOP_RIGHT","3":"TAM_MIDDLE_LEFT","4":"TAM_MIDDLE_CENTER","5":"TAM_MIDDLE_RIGHT","6":"TAM_BOTTOM_LEFT","7":"TAM_BOTTOM_CENTER","8":"TAM_BOTTOM_RIGHT","TAM_TOP_LEFT":0,"TAM_TOP_CENTER":1,"TAM_TOP_RIGHT":2,"TAM_MIDDLE_LEFT":3,"TAM_MIDDLE_CENTER":4,"TAM_MIDDLE_RIGHT":5,"TAM_BOTTOM_LEFT":6,"TAM_BOTTOM_CENTER":7,"TAM_BOTTOM_RIGHT":8}},"height":{"type":"number","serializationType":"float32"},"width":{"type":"number","serializationType":"float32"},"hideAfterSeconds":{"type":"number","serializationType":"optional","optionalJsonSchema":{"type":"number","serializationType":"float32"}},"text":{"type":"string","serializationType":"optional","optionalJsonSchema":{"type":"string","serializationType":"utf8-string"}},"fontSize":{"type":"number","serializationType":"optional","optionalJsonSchema":{"type":"number","serializationType":"float32"}}},"serializationType":"map"}'},{type:"hide_image",jsonSchema:'{"type":"object","properties":{"imageEntity":{"type":"integer","serializationType":"optional","optionalJsonSchema":{"type":"integer","serializationType":"int32"}}},"serializationType":"map"}'}]}}}},{name:"asset-packs::Actions",jsonSchema:{type:"object",properties:{id:{type:"integer",serializationType:"int32"},value:{type:"array",items:{type:"object",properties:{name:{type:"string",serializationType:"utf8-string"},type:{type:"string",serializationType:"utf8-string"},jsonPayload:{type:"string",serializationType:"utf8-string"}},serializationType:"map"},serializationType:"array"}},serializationType:"map"},data:{518:{json:{id:1,value:[{name:"Play Activate Animation",type:"play_animation",jsonPayload:'{ "animation": "trigger" }'},{name:"Play Sound",type:"play_sound",jsonPayload:'{"src":"assets/builder/red_button/sound.mp3"}'}]}},519:{json:{id:2,value:[{name:"Play Activate Animation",type:"play_animation",jsonPayload:'{ "animation": "trigger" }'},{name:"Play Sound",type:"play_sound",jsonPayload:'{"src":"assets/builder/red_button/sound.mp3"}'}]}},520:{json:{id:3,value:[{name:"Play Activate Animation",type:"play_animation",jsonPayload:'{ "animation": "trigger" }'},{name:"Play Sound",type:"play_sound",jsonPayload:'{"src":"assets/builder/red_button/sound.mp3"}'}]}},521:{json:{id:4,value:[{name:"Play Activate Animation",type:"play_animation",jsonPayload:'{ "animation": "trigger" }'},{name:"Play Sound",type:"play_sound",jsonPayload:'{"src":"assets/builder/red_button/sound.mp3"}'}]}},538:{json:{id:5,value:[{name:"Play Activate Animation",type:"play_animation",jsonPayload:'{ "animation": "trigger" }'},{name:"Play Sound",type:"play_sound",jsonPayload:'{"src":"assets/builder/red_light_button/sound.mp3"}'}]}}}},{name:"asset-packs::Counter",jsonSchema:{type:"object",properties:{id:{type:"number",serializationType:"float32"},value:{type:"integer",serializationType:"int32"}},serializationType:"map"},data:{0:{json:{id:0,value:5}}}},{name:"asset-packs::Triggers",jsonSchema:{type:"object",properties:{value:{type:"array",items:{type:"object",properties:{type:{type:"string",enum:["on_click","on_state_change","on_spawn","on_tween_end","on_counter_change","on_player_enters_area","on_player_leaves_area","on_delay","on_loop","on_clone","on_click_image"],default:"on_click",serializationType:"enum-string",enumObject:{ON_CLICK:"on_click",ON_STATE_CHANGE:"on_state_change",ON_SPAWN:"on_spawn",ON_TWEEN_END:"on_tween_end",ON_COUNTER_CHANGE:"on_counter_change",ON_PLAYER_ENTERS_AREA:"on_player_enters_area",ON_PLAYER_LEAVES_AREA:"on_player_leaves_area",ON_DELAY:"on_delay",ON_LOOP:"on_loop",ON_CLONE:"on_clone",ON_CLICK_IMAGE:"on_click_image"}},conditions:{type:"array",serializationType:"optional",optionalJsonSchema:{type:"array",items:{type:"object",properties:{id:{type:"integer",serializationType:"optional",optionalJsonSchema:{type:"integer",serializationType:"int32"}},type:{type:"string",enum:["when_state_is","when_state_is_not","when_counter_equals","when_counter_is_greater_than","when_counter_is_less_than"],default:"when_state_is",serializationType:"enum-string",enumObject:{WHEN_STATE_IS:"when_state_is",WHEN_STATE_IS_NOT:"when_state_is_not",WHEN_COUNTER_EQUALS:"when_counter_equals",WHEN_COUNTER_IS_GREATER_THAN:"when_counter_is_greater_than",WHEN_COUNTER_IS_LESS_THAN:"when_counter_is_less_than"}},value:{type:"string",serializationType:"utf8-string"}},serializationType:"map"},serializationType:"array"}},operation:{type:"string",serializationType:"optional",optionalJsonSchema:{type:"string",enum:["and","or"],default:"and",serializationType:"enum-string",enumObject:{AND:"and",OR:"or"}}},actions:{type:"array",items:{type:"object",properties:{id:{type:"integer",serializationType:"optional",optionalJsonSchema:{type:"integer",serializationType:"int32"}},name:{type:"string",serializationType:"optional",optionalJsonSchema:{type:"string",serializationType:"utf8-string"}}},serializationType:"map"},serializationType:"array"}},serializationType:"map"},serializationType:"array"}},serializationType:"map"},data:{518:{json:{value:[{type:"on_click",conditions:[],actions:[{id:1,name:"Play Activate Animation"},{id:1,name:"Play Sound"}]}]}},519:{json:{value:[{type:"on_click",conditions:[],actions:[{id:2,name:"Play Activate Animation"},{id:2,name:"Play Sound"}]}]}},520:{json:{value:[{type:"on_click",conditions:[],actions:[{id:3,name:"Play Activate Animation"},{id:3,name:"Play Sound"}]}]}},521:{json:{value:[{type:"on_click",conditions:[],actions:[{id:4,name:"Play Activate Animation"},{id:4,name:"Play Sound"}]}]}},538:{json:{value:[{type:"on_click",conditions:[],actions:[{id:5,name:"Play Activate Animation"},{id:5,name:"Play Sound"}]}]}}}},{name:"inspector::TransformConfig",jsonSchema:{type:"object",properties:{porportionalScaling:{type:"boolean",serializationType:"optional",optionalJsonSchema:{type:"boolean",serializationType:"boolean"}}},serializationType:"map"},data:{513:{json:{}},514:{json:{}},515:{json:{}},516:{json:{}},517:{json:{}},518:{json:{}},519:{json:{}},520:{json:{}},521:{json:{}},522:{json:{}},523:{json:{}},524:{json:{}},525:{json:{}},526:{json:{}},527:{json:{}},528:{json:{}},529:{json:{}},530:{json:{}},531:{json:{}},532:{json:{}},534:{json:{}},535:{json:{}},536:{json:{}},537:{json:{}},538:{json:{}},539:{json:{}},540:{json:{}},541:{json:{}}}},{name:"cube-id",jsonSchema:{type:"object",properties:{},serializationType:"map"},data:{512:{json:{}}}}]}};var Lf=[],Um={getCompositeOrNull(e,t){let a=zm[e];if(a){try{if(a instanceof Uint8Array){let n=ui.fromBinary(a);Lf.push({src:e,composite:n})}else if(typeof a=="string"){let n=ui.fromJson(JSON.parse(a));Lf.push({src:e,composite:n})}else if(typeof a=="object"){let n=ui.fromJson(a);Lf.push({src:e,composite:n})}}catch(n){console.error(n)}delete zm[e]}return Lf.find(n=>n.src===e)||null}};var Df=L2({crdtSendToRenderer:vs.crdtSendToRenderer});G.addTransport(Df);async function Gx(e){G.seal(),await G.update(e),await F2(vs.sendBatch)}async function Yx(){let e=await(0,vs.crdtGetState)({data:new Uint8Array});if(!e.hasEntities){let t=Um.getCompositeOrNull("main.composite");if(t)try{ui.instance(G,t,Um)}catch(a){console.log("Warning: main.composite couldn't be instanced."),console.error(a)}}if(Df.onmessage&&e&&e.data&&e.data.length)for(let t of e.data)Df.onmessage(t)}if(Uf!==void 0){let e=function(){let t=Uf();t&&typeof t=="object"&&typeof t.then=="function"&&t.catch(console.error),G.removeSystem(e)};G.addSystem(e,1/0)} +"use strict"; +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __commonJS = (cb, mod2) => function __require() { + return mod2 || (0, cb[__getOwnPropNames(cb)[0]])((mod2 = { exports: {} }).exports, mod2), mod2.exports; +}; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod2, isNodeMode, target) => (target = mod2 != null ? __create(__getProtoOf(mod2)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod2 || !mod2.__esModule ? __defProp(target, "default", { value: mod2, enumerable: true }) : target, + mod2 +)); +var __toCommonJS = (mod2) => __copyProps(__defProp({}, "__esModule", { value: true }), mod2); + +// node_modules/@protobufjs/aspromise/index.js +var require_aspromise = __commonJS({ + "node_modules/@protobufjs/aspromise/index.js"(exports2, module2) { + "use strict"; + module2.exports = asPromise; + function asPromise(fn, ctx) { + var params = new Array(arguments.length - 1), offset = 0, index = 2, pending = true; + while (index < arguments.length) + params[offset++] = arguments[index++]; + return new Promise(function executor(resolve2, reject) { + params[offset] = function callback(err) { + if (pending) { + pending = false; + if (err) + reject(err); + else { + var params2 = new Array(arguments.length - 1), offset2 = 0; + while (offset2 < params2.length) + params2[offset2++] = arguments[offset2]; + resolve2.apply(null, params2); + } + } + }; + try { + fn.apply(ctx || null, params); + } catch (err) { + if (pending) { + pending = false; + reject(err); + } + } + }); + } + } +}); + +// node_modules/@protobufjs/base64/index.js +var require_base64 = __commonJS({ + "node_modules/@protobufjs/base64/index.js"(exports2) { + "use strict"; + var base64 = exports2; + base64.length = function length2(string) { + var p = string.length; + if (!p) + return 0; + var n = 0; + while (--p % 4 > 1 && string.charAt(p) === "=") + ++n; + return Math.ceil(string.length * 3) / 4 - n; + }; + var b64 = new Array(64); + var s64 = new Array(123); + for (i = 0; i < 64; ) + s64[b64[i] = i < 26 ? i + 65 : i < 52 ? i + 71 : i < 62 ? i - 4 : i - 59 | 43] = i++; + var i; + base64.encode = function encode(buffer, start, end) { + var parts = null, chunk = []; + var i2 = 0, j = 0, t; + while (start < end) { + var b = buffer[start++]; + switch (j) { + case 0: + chunk[i2++] = b64[b >> 2]; + t = (b & 3) << 4; + j = 1; + break; + case 1: + chunk[i2++] = b64[t | b >> 4]; + t = (b & 15) << 2; + j = 2; + break; + case 2: + chunk[i2++] = b64[t | b >> 6]; + chunk[i2++] = b64[b & 63]; + j = 0; + break; + } + if (i2 > 8191) { + (parts || (parts = [])).push(String.fromCharCode.apply(String, chunk)); + i2 = 0; + } + } + if (j) { + chunk[i2++] = b64[t]; + chunk[i2++] = 61; + if (j === 1) + chunk[i2++] = 61; + } + if (parts) { + if (i2) + parts.push(String.fromCharCode.apply(String, chunk.slice(0, i2))); + return parts.join(""); + } + return String.fromCharCode.apply(String, chunk.slice(0, i2)); + }; + var invalidEncoding = "invalid encoding"; + base64.decode = function decode(string, buffer, offset) { + var start = offset; + var j = 0, t; + for (var i2 = 0; i2 < string.length; ) { + var c = string.charCodeAt(i2++); + if (c === 61 && j > 1) + break; + if ((c = s64[c]) === void 0) + throw Error(invalidEncoding); + switch (j) { + case 0: + t = c; + j = 1; + break; + case 1: + buffer[offset++] = t << 2 | (c & 48) >> 4; + t = c; + j = 2; + break; + case 2: + buffer[offset++] = (t & 15) << 4 | (c & 60) >> 2; + t = c; + j = 3; + break; + case 3: + buffer[offset++] = (t & 3) << 6 | c; + j = 0; + break; + } + } + if (j === 1) + throw Error(invalidEncoding); + return offset - start; + }; + base64.test = function test(string) { + return /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(string); + }; + } +}); + +// node_modules/@protobufjs/eventemitter/index.js +var require_eventemitter = __commonJS({ + "node_modules/@protobufjs/eventemitter/index.js"(exports2, module2) { + "use strict"; + module2.exports = EventEmitter; + function EventEmitter() { + this._listeners = {}; + } + EventEmitter.prototype.on = function on(evt, fn, ctx) { + (this._listeners[evt] || (this._listeners[evt] = [])).push({ + fn, + ctx: ctx || this + }); + return this; + }; + EventEmitter.prototype.off = function off(evt, fn) { + if (evt === void 0) + this._listeners = {}; + else { + if (fn === void 0) + this._listeners[evt] = []; + else { + var listeners2 = this._listeners[evt]; + for (var i = 0; i < listeners2.length; ) + if (listeners2[i].fn === fn) + listeners2.splice(i, 1); + else + ++i; + } + } + return this; + }; + EventEmitter.prototype.emit = function emit(evt) { + var listeners2 = this._listeners[evt]; + if (listeners2) { + var args = [], i = 1; + for (; i < arguments.length; ) + args.push(arguments[i++]); + for (i = 0; i < listeners2.length; ) + listeners2[i].fn.apply(listeners2[i++].ctx, args); + } + return this; + }; + } +}); + +// node_modules/@protobufjs/float/index.js +var require_float = __commonJS({ + "node_modules/@protobufjs/float/index.js"(exports2, module2) { + "use strict"; + module2.exports = factory(factory); + function factory(exports3) { + if (typeof Float32Array !== "undefined") + (function() { + var f32 = new Float32Array([-0]), f8b = new Uint8Array(f32.buffer), le = f8b[3] === 128; + function writeFloat_f32_cpy(val, buf, pos) { + f32[0] = val; + buf[pos] = f8b[0]; + buf[pos + 1] = f8b[1]; + buf[pos + 2] = f8b[2]; + buf[pos + 3] = f8b[3]; + } + function writeFloat_f32_rev(val, buf, pos) { + f32[0] = val; + buf[pos] = f8b[3]; + buf[pos + 1] = f8b[2]; + buf[pos + 2] = f8b[1]; + buf[pos + 3] = f8b[0]; + } + exports3.writeFloatLE = le ? writeFloat_f32_cpy : writeFloat_f32_rev; + exports3.writeFloatBE = le ? writeFloat_f32_rev : writeFloat_f32_cpy; + function readFloat_f32_cpy(buf, pos) { + f8b[0] = buf[pos]; + f8b[1] = buf[pos + 1]; + f8b[2] = buf[pos + 2]; + f8b[3] = buf[pos + 3]; + return f32[0]; + } + function readFloat_f32_rev(buf, pos) { + f8b[3] = buf[pos]; + f8b[2] = buf[pos + 1]; + f8b[1] = buf[pos + 2]; + f8b[0] = buf[pos + 3]; + return f32[0]; + } + exports3.readFloatLE = le ? readFloat_f32_cpy : readFloat_f32_rev; + exports3.readFloatBE = le ? readFloat_f32_rev : readFloat_f32_cpy; + })(); + else + (function() { + function writeFloat_ieee754(writeUint, val, buf, pos) { + var sign = val < 0 ? 1 : 0; + if (sign) + val = -val; + if (val === 0) + writeUint(1 / val > 0 ? ( + /* positive */ + 0 + ) : ( + /* negative 0 */ + 2147483648 + ), buf, pos); + else if (isNaN(val)) + writeUint(2143289344, buf, pos); + else if (val > 34028234663852886e22) + writeUint((sign << 31 | 2139095040) >>> 0, buf, pos); + else if (val < 11754943508222875e-54) + writeUint((sign << 31 | Math.round(val / 1401298464324817e-60)) >>> 0, buf, pos); + else { + var exponent = Math.floor(Math.log(val) / Math.LN2), mantissa = Math.round(val * Math.pow(2, -exponent) * 8388608) & 8388607; + writeUint((sign << 31 | exponent + 127 << 23 | mantissa) >>> 0, buf, pos); + } + } + exports3.writeFloatLE = writeFloat_ieee754.bind(null, writeUintLE); + exports3.writeFloatBE = writeFloat_ieee754.bind(null, writeUintBE); + function readFloat_ieee754(readUint, buf, pos) { + var uint = readUint(buf, pos), sign = (uint >> 31) * 2 + 1, exponent = uint >>> 23 & 255, mantissa = uint & 8388607; + return exponent === 255 ? mantissa ? NaN : sign * Infinity : exponent === 0 ? sign * 1401298464324817e-60 * mantissa : sign * Math.pow(2, exponent - 150) * (mantissa + 8388608); + } + exports3.readFloatLE = readFloat_ieee754.bind(null, readUintLE); + exports3.readFloatBE = readFloat_ieee754.bind(null, readUintBE); + })(); + if (typeof Float64Array !== "undefined") + (function() { + var f64 = new Float64Array([-0]), f8b = new Uint8Array(f64.buffer), le = f8b[7] === 128; + function writeDouble_f64_cpy(val, buf, pos) { + f64[0] = val; + buf[pos] = f8b[0]; + buf[pos + 1] = f8b[1]; + buf[pos + 2] = f8b[2]; + buf[pos + 3] = f8b[3]; + buf[pos + 4] = f8b[4]; + buf[pos + 5] = f8b[5]; + buf[pos + 6] = f8b[6]; + buf[pos + 7] = f8b[7]; + } + function writeDouble_f64_rev(val, buf, pos) { + f64[0] = val; + buf[pos] = f8b[7]; + buf[pos + 1] = f8b[6]; + buf[pos + 2] = f8b[5]; + buf[pos + 3] = f8b[4]; + buf[pos + 4] = f8b[3]; + buf[pos + 5] = f8b[2]; + buf[pos + 6] = f8b[1]; + buf[pos + 7] = f8b[0]; + } + exports3.writeDoubleLE = le ? writeDouble_f64_cpy : writeDouble_f64_rev; + exports3.writeDoubleBE = le ? writeDouble_f64_rev : writeDouble_f64_cpy; + function readDouble_f64_cpy(buf, pos) { + f8b[0] = buf[pos]; + f8b[1] = buf[pos + 1]; + f8b[2] = buf[pos + 2]; + f8b[3] = buf[pos + 3]; + f8b[4] = buf[pos + 4]; + f8b[5] = buf[pos + 5]; + f8b[6] = buf[pos + 6]; + f8b[7] = buf[pos + 7]; + return f64[0]; + } + function readDouble_f64_rev(buf, pos) { + f8b[7] = buf[pos]; + f8b[6] = buf[pos + 1]; + f8b[5] = buf[pos + 2]; + f8b[4] = buf[pos + 3]; + f8b[3] = buf[pos + 4]; + f8b[2] = buf[pos + 5]; + f8b[1] = buf[pos + 6]; + f8b[0] = buf[pos + 7]; + return f64[0]; + } + exports3.readDoubleLE = le ? readDouble_f64_cpy : readDouble_f64_rev; + exports3.readDoubleBE = le ? readDouble_f64_rev : readDouble_f64_cpy; + })(); + else + (function() { + function writeDouble_ieee754(writeUint, off0, off1, val, buf, pos) { + var sign = val < 0 ? 1 : 0; + if (sign) + val = -val; + if (val === 0) { + writeUint(0, buf, pos + off0); + writeUint(1 / val > 0 ? ( + /* positive */ + 0 + ) : ( + /* negative 0 */ + 2147483648 + ), buf, pos + off1); + } else if (isNaN(val)) { + writeUint(0, buf, pos + off0); + writeUint(2146959360, buf, pos + off1); + } else if (val > 17976931348623157e292) { + writeUint(0, buf, pos + off0); + writeUint((sign << 31 | 2146435072) >>> 0, buf, pos + off1); + } else { + var mantissa; + if (val < 22250738585072014e-324) { + mantissa = val / 5e-324; + writeUint(mantissa >>> 0, buf, pos + off0); + writeUint((sign << 31 | mantissa / 4294967296) >>> 0, buf, pos + off1); + } else { + var exponent = Math.floor(Math.log(val) / Math.LN2); + if (exponent === 1024) + exponent = 1023; + mantissa = val * Math.pow(2, -exponent); + writeUint(mantissa * 4503599627370496 >>> 0, buf, pos + off0); + writeUint((sign << 31 | exponent + 1023 << 20 | mantissa * 1048576 & 1048575) >>> 0, buf, pos + off1); + } + } + } + exports3.writeDoubleLE = writeDouble_ieee754.bind(null, writeUintLE, 0, 4); + exports3.writeDoubleBE = writeDouble_ieee754.bind(null, writeUintBE, 4, 0); + function readDouble_ieee754(readUint, off0, off1, buf, pos) { + var lo = readUint(buf, pos + off0), hi = readUint(buf, pos + off1); + var sign = (hi >> 31) * 2 + 1, exponent = hi >>> 20 & 2047, mantissa = 4294967296 * (hi & 1048575) + lo; + return exponent === 2047 ? mantissa ? NaN : sign * Infinity : exponent === 0 ? sign * 5e-324 * mantissa : sign * Math.pow(2, exponent - 1075) * (mantissa + 4503599627370496); + } + exports3.readDoubleLE = readDouble_ieee754.bind(null, readUintLE, 0, 4); + exports3.readDoubleBE = readDouble_ieee754.bind(null, readUintBE, 4, 0); + })(); + return exports3; + } + function writeUintLE(val, buf, pos) { + buf[pos] = val & 255; + buf[pos + 1] = val >>> 8 & 255; + buf[pos + 2] = val >>> 16 & 255; + buf[pos + 3] = val >>> 24; + } + function writeUintBE(val, buf, pos) { + buf[pos] = val >>> 24; + buf[pos + 1] = val >>> 16 & 255; + buf[pos + 2] = val >>> 8 & 255; + buf[pos + 3] = val & 255; + } + function readUintLE(buf, pos) { + return (buf[pos] | buf[pos + 1] << 8 | buf[pos + 2] << 16 | buf[pos + 3] << 24) >>> 0; + } + function readUintBE(buf, pos) { + return (buf[pos] << 24 | buf[pos + 1] << 16 | buf[pos + 2] << 8 | buf[pos + 3]) >>> 0; + } + } +}); + +// node_modules/@protobufjs/inquire/index.js +var require_inquire = __commonJS({ + "node_modules/@protobufjs/inquire/index.js"(exports, module) { + "use strict"; + module.exports = inquire; + function inquire(moduleName) { + try { + var mod = eval("quire".replace(/^/, "re"))(moduleName); + if (mod && (mod.length || Object.keys(mod).length)) + return mod; + } catch (e) { + } + return null; + } + } +}); + +// node_modules/@protobufjs/utf8/index.js +var require_utf8 = __commonJS({ + "node_modules/@protobufjs/utf8/index.js"(exports2) { + "use strict"; + var utf83 = exports2; + utf83.length = function utf8_length(string) { + var len = 0, c = 0; + for (var i = 0; i < string.length; ++i) { + c = string.charCodeAt(i); + if (c < 128) + len += 1; + else if (c < 2048) + len += 2; + else if ((c & 64512) === 55296 && (string.charCodeAt(i + 1) & 64512) === 56320) { + ++i; + len += 4; + } else + len += 3; + } + return len; + }; + utf83.read = function utf8_read(buffer, start, end) { + var len = end - start; + if (len < 1) + return ""; + var parts = null, chunk = [], i = 0, t; + while (start < end) { + t = buffer[start++]; + if (t < 128) + chunk[i++] = t; + else if (t > 191 && t < 224) + chunk[i++] = (t & 31) << 6 | buffer[start++] & 63; + else if (t > 239 && t < 365) { + t = ((t & 7) << 18 | (buffer[start++] & 63) << 12 | (buffer[start++] & 63) << 6 | buffer[start++] & 63) - 65536; + chunk[i++] = 55296 + (t >> 10); + chunk[i++] = 56320 + (t & 1023); + } else + chunk[i++] = (t & 15) << 12 | (buffer[start++] & 63) << 6 | buffer[start++] & 63; + if (i > 8191) { + (parts || (parts = [])).push(String.fromCharCode.apply(String, chunk)); + i = 0; + } + } + if (parts) { + if (i) + parts.push(String.fromCharCode.apply(String, chunk.slice(0, i))); + return parts.join(""); + } + return String.fromCharCode.apply(String, chunk.slice(0, i)); + }; + utf83.write = function utf8_write(string, buffer, offset) { + var start = offset, c1, c2; + for (var i = 0; i < string.length; ++i) { + c1 = string.charCodeAt(i); + if (c1 < 128) { + buffer[offset++] = c1; + } else if (c1 < 2048) { + buffer[offset++] = c1 >> 6 | 192; + buffer[offset++] = c1 & 63 | 128; + } else if ((c1 & 64512) === 55296 && ((c2 = string.charCodeAt(i + 1)) & 64512) === 56320) { + c1 = 65536 + ((c1 & 1023) << 10) + (c2 & 1023); + ++i; + buffer[offset++] = c1 >> 18 | 240; + buffer[offset++] = c1 >> 12 & 63 | 128; + buffer[offset++] = c1 >> 6 & 63 | 128; + buffer[offset++] = c1 & 63 | 128; + } else { + buffer[offset++] = c1 >> 12 | 224; + buffer[offset++] = c1 >> 6 & 63 | 128; + buffer[offset++] = c1 & 63 | 128; + } + } + return offset - start; + }; + } +}); + +// node_modules/@protobufjs/pool/index.js +var require_pool = __commonJS({ + "node_modules/@protobufjs/pool/index.js"(exports2, module2) { + "use strict"; + module2.exports = pool; + function pool(alloc, slice, size) { + var SIZE = size || 8192; + var MAX = SIZE >>> 1; + var slab = null; + var offset = SIZE; + return function pool_alloc(size2) { + if (size2 < 1 || size2 > MAX) + return alloc(size2); + if (offset + size2 > SIZE) { + slab = alloc(SIZE); + offset = 0; + } + var buf = slice.call(slab, offset, offset += size2); + if (offset & 7) + offset = (offset | 7) + 1; + return buf; + }; + } + } +}); + +// node_modules/protobufjs/src/util/longbits.js +var require_longbits = __commonJS({ + "node_modules/protobufjs/src/util/longbits.js"(exports2, module2) { + "use strict"; + module2.exports = LongBits; + var util = require_minimal(); + function LongBits(lo, hi) { + this.lo = lo >>> 0; + this.hi = hi >>> 0; + } + var zero = LongBits.zero = new LongBits(0, 0); + zero.toNumber = function() { + return 0; + }; + zero.zzEncode = zero.zzDecode = function() { + return this; + }; + zero.length = function() { + return 1; + }; + var zeroHash = LongBits.zeroHash = "\0\0\0\0\0\0\0\0"; + LongBits.fromNumber = function fromNumber2(value) { + if (value === 0) + return zero; + var sign = value < 0; + if (sign) + value = -value; + var lo = value >>> 0, hi = (value - lo) / 4294967296 >>> 0; + if (sign) { + hi = ~hi >>> 0; + lo = ~lo >>> 0; + if (++lo > 4294967295) { + lo = 0; + if (++hi > 4294967295) + hi = 0; + } + } + return new LongBits(lo, hi); + }; + LongBits.from = function from(value) { + if (typeof value === "number") + return LongBits.fromNumber(value); + if (util.isString(value)) { + if (util.Long) + value = util.Long.fromString(value); + else + return LongBits.fromNumber(parseInt(value, 10)); + } + return value.low || value.high ? new LongBits(value.low >>> 0, value.high >>> 0) : zero; + }; + LongBits.prototype.toNumber = function toNumber2(unsigned) { + if (!unsigned && this.hi >>> 31) { + var lo = ~this.lo + 1 >>> 0, hi = ~this.hi >>> 0; + if (!lo) + hi = hi + 1 >>> 0; + return -(lo + hi * 4294967296); + } + return this.lo + this.hi * 4294967296; + }; + LongBits.prototype.toLong = function toLong(unsigned) { + return util.Long ? new util.Long(this.lo | 0, this.hi | 0, Boolean(unsigned)) : { low: this.lo | 0, high: this.hi | 0, unsigned: Boolean(unsigned) }; + }; + var charCodeAt = String.prototype.charCodeAt; + LongBits.fromHash = function fromHash(hash) { + if (hash === zeroHash) + return zero; + return new LongBits( + (charCodeAt.call(hash, 0) | charCodeAt.call(hash, 1) << 8 | charCodeAt.call(hash, 2) << 16 | charCodeAt.call(hash, 3) << 24) >>> 0, + (charCodeAt.call(hash, 4) | charCodeAt.call(hash, 5) << 8 | charCodeAt.call(hash, 6) << 16 | charCodeAt.call(hash, 7) << 24) >>> 0 + ); + }; + LongBits.prototype.toHash = function toHash() { + return String.fromCharCode( + this.lo & 255, + this.lo >>> 8 & 255, + this.lo >>> 16 & 255, + this.lo >>> 24, + this.hi & 255, + this.hi >>> 8 & 255, + this.hi >>> 16 & 255, + this.hi >>> 24 + ); + }; + LongBits.prototype.zzEncode = function zzEncode() { + var mask = this.hi >> 31; + this.hi = ((this.hi << 1 | this.lo >>> 31) ^ mask) >>> 0; + this.lo = (this.lo << 1 ^ mask) >>> 0; + return this; + }; + LongBits.prototype.zzDecode = function zzDecode() { + var mask = -(this.lo & 1); + this.lo = ((this.lo >>> 1 | this.hi << 31) ^ mask) >>> 0; + this.hi = (this.hi >>> 1 ^ mask) >>> 0; + return this; + }; + LongBits.prototype.length = function length2() { + var part0 = this.lo, part1 = (this.lo >>> 28 | this.hi << 4) >>> 0, part2 = this.hi >>> 24; + return part2 === 0 ? part1 === 0 ? part0 < 16384 ? part0 < 128 ? 1 : 2 : part0 < 2097152 ? 3 : 4 : part1 < 16384 ? part1 < 128 ? 5 : 6 : part1 < 2097152 ? 7 : 8 : part2 < 128 ? 9 : 10; + }; + } +}); + +// node_modules/protobufjs/src/util/minimal.js +var require_minimal = __commonJS({ + "node_modules/protobufjs/src/util/minimal.js"(exports2) { + "use strict"; + var util = exports2; + util.asPromise = require_aspromise(); + util.base64 = require_base64(); + util.EventEmitter = require_eventemitter(); + util.float = require_float(); + util.inquire = require_inquire(); + util.utf8 = require_utf8(); + util.pool = require_pool(); + util.LongBits = require_longbits(); + util.isNode = Boolean(typeof global !== "undefined" && global && global.process && global.process.versions && global.process.versions.node); + util.global = util.isNode && global || false || typeof self !== "undefined" && self || exports2; + util.emptyArray = Object.freeze ? Object.freeze([]) : ( + /* istanbul ignore next */ + [] + ); + util.emptyObject = Object.freeze ? Object.freeze({}) : ( + /* istanbul ignore next */ + {} + ); + util.isInteger = Number.isInteger || /* istanbul ignore next */ + function isInteger(value) { + return typeof value === "number" && isFinite(value) && Math.floor(value) === value; + }; + util.isString = function isString(value) { + return typeof value === "string" || value instanceof String; + }; + util.isObject = function isObject3(value) { + return value && typeof value === "object"; + }; + util.isset = /** + * Checks if a property on a message is considered to be present. + * @param {Object} obj Plain object or message instance + * @param {string} prop Property name + * @returns {boolean} `true` if considered to be present, otherwise `false` + */ + util.isSet = function isSet3(obj, prop) { + var value = obj[prop]; + if (value != null && obj.hasOwnProperty(prop)) + return typeof value !== "object" || (Array.isArray(value) ? value.length : Object.keys(value).length) > 0; + return false; + }; + util.Buffer = function() { + try { + var Buffer2 = util.inquire("buffer").Buffer; + return Buffer2.prototype.utf8Write ? Buffer2 : ( + /* istanbul ignore next */ + null + ); + } catch (e) { + return null; + } + }(); + util._Buffer_from = null; + util._Buffer_allocUnsafe = null; + util.newBuffer = function newBuffer(sizeOrArray) { + return typeof sizeOrArray === "number" ? util.Buffer ? util._Buffer_allocUnsafe(sizeOrArray) : new util.Array(sizeOrArray) : util.Buffer ? util._Buffer_from(sizeOrArray) : typeof Uint8Array === "undefined" ? sizeOrArray : new Uint8Array(sizeOrArray); + }; + util.Array = typeof Uint8Array !== "undefined" ? Uint8Array : Array; + util.Long = /* istanbul ignore next */ + util.global.dcodeIO && /* istanbul ignore next */ + util.global.dcodeIO.Long || /* istanbul ignore next */ + util.global.Long || util.inquire("long"); + util.key2Re = /^true|false|0|1$/; + util.key32Re = /^-?(?:0|[1-9][0-9]*)$/; + util.key64Re = /^(?:[\\x00-\\xff]{8}|-?(?:0|[1-9][0-9]*))$/; + util.longToHash = function longToHash(value) { + return value ? util.LongBits.from(value).toHash() : util.LongBits.zeroHash; + }; + util.longFromHash = function longFromHash(hash, unsigned) { + var bits = util.LongBits.fromHash(hash); + if (util.Long) + return util.Long.fromBits(bits.lo, bits.hi, unsigned); + return bits.toNumber(Boolean(unsigned)); + }; + function merge(dst, src, ifNotSet) { + for (var keys = Object.keys(src), i = 0; i < keys.length; ++i) + if (dst[keys[i]] === void 0 || !ifNotSet) + dst[keys[i]] = src[keys[i]]; + return dst; + } + util.merge = merge; + util.lcFirst = function lcFirst(str) { + return str.charAt(0).toLowerCase() + str.substring(1); + }; + function newError(name) { + function CustomError(message, properties) { + if (!(this instanceof CustomError)) + return new CustomError(message, properties); + Object.defineProperty(this, "message", { get: function() { + return message; + } }); + if (Error.captureStackTrace) + Error.captureStackTrace(this, CustomError); + else + Object.defineProperty(this, "stack", { value: new Error().stack || "" }); + if (properties) + merge(this, properties); + } + CustomError.prototype = Object.create(Error.prototype, { + constructor: { + value: CustomError, + writable: true, + enumerable: false, + configurable: true + }, + name: { + get: function get() { + return name; + }, + set: void 0, + enumerable: false, + // configurable: false would accurately preserve the behavior of + // the original, but I'm guessing that was not intentional. + // For an actual error subclass, this property would + // be configurable. + configurable: true + }, + toString: { + value: function value() { + return this.name + ": " + this.message; + }, + writable: true, + enumerable: false, + configurable: true + } + }); + return CustomError; + } + util.newError = newError; + util.ProtocolError = newError("ProtocolError"); + util.oneOfGetter = function getOneOf(fieldNames) { + var fieldMap = {}; + for (var i = 0; i < fieldNames.length; ++i) + fieldMap[fieldNames[i]] = 1; + return function() { + for (var keys = Object.keys(this), i2 = keys.length - 1; i2 > -1; --i2) + if (fieldMap[keys[i2]] === 1 && this[keys[i2]] !== void 0 && this[keys[i2]] !== null) + return keys[i2]; + }; + }; + util.oneOfSetter = function setOneOf(fieldNames) { + return function(name) { + for (var i = 0; i < fieldNames.length; ++i) + if (fieldNames[i] !== name) + delete this[fieldNames[i]]; + }; + }; + util.toJSONOptions = { + longs: String, + enums: String, + bytes: String, + json: true + }; + util._configure = function() { + var Buffer2 = util.Buffer; + if (!Buffer2) { + util._Buffer_from = util._Buffer_allocUnsafe = null; + return; + } + util._Buffer_from = Buffer2.from !== Uint8Array.from && Buffer2.from || /* istanbul ignore next */ + function Buffer_from(value, encoding) { + return new Buffer2(value, encoding); + }; + util._Buffer_allocUnsafe = Buffer2.allocUnsafe || /* istanbul ignore next */ + function Buffer_allocUnsafe(size) { + return new Buffer2(size); + }; + }; + } +}); + +// node_modules/protobufjs/src/writer.js +var require_writer = __commonJS({ + "node_modules/protobufjs/src/writer.js"(exports2, module2) { + "use strict"; + module2.exports = Writer; + var util = require_minimal(); + var BufferWriter; + var LongBits = util.LongBits; + var base64 = util.base64; + var utf83 = util.utf8; + function Op(fn, len, val) { + this.fn = fn; + this.len = len; + this.next = void 0; + this.val = val; + } + function noop() { + } + function State(writer) { + this.head = writer.head; + this.tail = writer.tail; + this.len = writer.len; + this.next = writer.states; + } + function Writer() { + this.len = 0; + this.head = new Op(noop, 0, 0); + this.tail = this.head; + this.states = null; + } + var create = function create2() { + return util.Buffer ? function create_buffer_setup() { + return (Writer.create = function create_buffer() { + return new BufferWriter(); + })(); + } : function create_array() { + return new Writer(); + }; + }; + Writer.create = create(); + Writer.alloc = function alloc(size) { + return new util.Array(size); + }; + if (util.Array !== Array) + Writer.alloc = util.pool(Writer.alloc, util.Array.prototype.subarray); + Writer.prototype._push = function push(fn, len, val) { + this.tail = this.tail.next = new Op(fn, len, val); + this.len += len; + return this; + }; + function writeByte(val, buf, pos) { + buf[pos] = val & 255; + } + function writeVarint32(val, buf, pos) { + while (val > 127) { + buf[pos++] = val & 127 | 128; + val >>>= 7; + } + buf[pos] = val; + } + function VarintOp(len, val) { + this.len = len; + this.next = void 0; + this.val = val; + } + VarintOp.prototype = Object.create(Op.prototype); + VarintOp.prototype.fn = writeVarint32; + Writer.prototype.uint32 = function write_uint32(value) { + this.len += (this.tail = this.tail.next = new VarintOp( + (value = value >>> 0) < 128 ? 1 : value < 16384 ? 2 : value < 2097152 ? 3 : value < 268435456 ? 4 : 5, + value + )).len; + return this; + }; + Writer.prototype.int32 = function write_int32(value) { + return value < 0 ? this._push(writeVarint64, 10, LongBits.fromNumber(value)) : this.uint32(value); + }; + Writer.prototype.sint32 = function write_sint32(value) { + return this.uint32((value << 1 ^ value >> 31) >>> 0); + }; + function writeVarint64(val, buf, pos) { + while (val.hi) { + buf[pos++] = val.lo & 127 | 128; + val.lo = (val.lo >>> 7 | val.hi << 25) >>> 0; + val.hi >>>= 7; + } + while (val.lo > 127) { + buf[pos++] = val.lo & 127 | 128; + val.lo = val.lo >>> 7; + } + buf[pos++] = val.lo; + } + Writer.prototype.uint64 = function write_uint64(value) { + var bits = LongBits.from(value); + return this._push(writeVarint64, bits.length(), bits); + }; + Writer.prototype.int64 = Writer.prototype.uint64; + Writer.prototype.sint64 = function write_sint64(value) { + var bits = LongBits.from(value).zzEncode(); + return this._push(writeVarint64, bits.length(), bits); + }; + Writer.prototype.bool = function write_bool(value) { + return this._push(writeByte, 1, value ? 1 : 0); + }; + function writeFixed32(val, buf, pos) { + buf[pos] = val & 255; + buf[pos + 1] = val >>> 8 & 255; + buf[pos + 2] = val >>> 16 & 255; + buf[pos + 3] = val >>> 24; + } + Writer.prototype.fixed32 = function write_fixed32(value) { + return this._push(writeFixed32, 4, value >>> 0); + }; + Writer.prototype.sfixed32 = Writer.prototype.fixed32; + Writer.prototype.fixed64 = function write_fixed64(value) { + var bits = LongBits.from(value); + return this._push(writeFixed32, 4, bits.lo)._push(writeFixed32, 4, bits.hi); + }; + Writer.prototype.sfixed64 = Writer.prototype.fixed64; + Writer.prototype.float = function write_float(value) { + return this._push(util.float.writeFloatLE, 4, value); + }; + Writer.prototype.double = function write_double(value) { + return this._push(util.float.writeDoubleLE, 8, value); + }; + var writeBytes = util.Array.prototype.set ? function writeBytes_set(val, buf, pos) { + buf.set(val, pos); + } : function writeBytes_for(val, buf, pos) { + for (var i = 0; i < val.length; ++i) + buf[pos + i] = val[i]; + }; + Writer.prototype.bytes = function write_bytes(value) { + var len = value.length >>> 0; + if (!len) + return this._push(writeByte, 1, 0); + if (util.isString(value)) { + var buf = Writer.alloc(len = base64.length(value)); + base64.decode(value, buf, 0); + value = buf; + } + return this.uint32(len)._push(writeBytes, len, value); + }; + Writer.prototype.string = function write_string(value) { + var len = utf83.length(value); + return len ? this.uint32(len)._push(utf83.write, len, value) : this._push(writeByte, 1, 0); + }; + Writer.prototype.fork = function fork() { + this.states = new State(this); + this.head = this.tail = new Op(noop, 0, 0); + this.len = 0; + return this; + }; + Writer.prototype.reset = function reset() { + if (this.states) { + this.head = this.states.head; + this.tail = this.states.tail; + this.len = this.states.len; + this.states = this.states.next; + } else { + this.head = this.tail = new Op(noop, 0, 0); + this.len = 0; + } + return this; + }; + Writer.prototype.ldelim = function ldelim() { + var head = this.head, tail = this.tail, len = this.len; + this.reset().uint32(len); + if (len) { + this.tail.next = head.next; + this.tail = tail; + this.len += len; + } + return this; + }; + Writer.prototype.finish = function finish() { + var head = this.head.next, buf = this.constructor.alloc(this.len), pos = 0; + while (head) { + head.fn(head.val, buf, pos); + pos += head.len; + head = head.next; + } + return buf; + }; + Writer._configure = function(BufferWriter_) { + BufferWriter = BufferWriter_; + Writer.create = create(); + BufferWriter._configure(); + }; + } +}); + +// node_modules/protobufjs/src/writer_buffer.js +var require_writer_buffer = __commonJS({ + "node_modules/protobufjs/src/writer_buffer.js"(exports2, module2) { + "use strict"; + module2.exports = BufferWriter; + var Writer = require_writer(); + (BufferWriter.prototype = Object.create(Writer.prototype)).constructor = BufferWriter; + var util = require_minimal(); + function BufferWriter() { + Writer.call(this); + } + BufferWriter._configure = function() { + BufferWriter.alloc = util._Buffer_allocUnsafe; + BufferWriter.writeBytesBuffer = util.Buffer && util.Buffer.prototype instanceof Uint8Array && util.Buffer.prototype.set.name === "set" ? function writeBytesBuffer_set(val, buf, pos) { + buf.set(val, pos); + } : function writeBytesBuffer_copy(val, buf, pos) { + if (val.copy) + val.copy(buf, pos, 0, val.length); + else + for (var i = 0; i < val.length; ) + buf[pos++] = val[i++]; + }; + }; + BufferWriter.prototype.bytes = function write_bytes_buffer(value) { + if (util.isString(value)) + value = util._Buffer_from(value, "base64"); + var len = value.length >>> 0; + this.uint32(len); + if (len) + this._push(BufferWriter.writeBytesBuffer, len, value); + return this; + }; + function writeStringBuffer(val, buf, pos) { + if (val.length < 40) + util.utf8.write(val, buf, pos); + else if (buf.utf8Write) + buf.utf8Write(val, pos); + else + buf.write(val, pos); + } + BufferWriter.prototype.string = function write_string_buffer(value) { + var len = util.Buffer.byteLength(value); + this.uint32(len); + if (len) + this._push(writeStringBuffer, len, value); + return this; + }; + BufferWriter._configure(); + } +}); + +// node_modules/protobufjs/src/reader.js +var require_reader = __commonJS({ + "node_modules/protobufjs/src/reader.js"(exports2, module2) { + "use strict"; + module2.exports = Reader; + var util = require_minimal(); + var BufferReader; + var LongBits = util.LongBits; + var utf83 = util.utf8; + function indexOutOfRange(reader, writeLength) { + return RangeError("index out of range: " + reader.pos + " + " + (writeLength || 1) + " > " + reader.len); + } + function Reader(buffer) { + this.buf = buffer; + this.pos = 0; + this.len = buffer.length; + } + var create_array = typeof Uint8Array !== "undefined" ? function create_typed_array(buffer) { + if (buffer instanceof Uint8Array || Array.isArray(buffer)) + return new Reader(buffer); + throw Error("illegal buffer"); + } : function create_array2(buffer) { + if (Array.isArray(buffer)) + return new Reader(buffer); + throw Error("illegal buffer"); + }; + var create = function create2() { + return util.Buffer ? function create_buffer_setup(buffer) { + return (Reader.create = function create_buffer(buffer2) { + return util.Buffer.isBuffer(buffer2) ? new BufferReader(buffer2) : create_array(buffer2); + })(buffer); + } : create_array; + }; + Reader.create = create(); + Reader.prototype._slice = util.Array.prototype.subarray || /* istanbul ignore next */ + util.Array.prototype.slice; + Reader.prototype.uint32 = function read_uint32_setup() { + var value = 4294967295; + return function read_uint32() { + value = (this.buf[this.pos] & 127) >>> 0; + if (this.buf[this.pos++] < 128) + return value; + value = (value | (this.buf[this.pos] & 127) << 7) >>> 0; + if (this.buf[this.pos++] < 128) + return value; + value = (value | (this.buf[this.pos] & 127) << 14) >>> 0; + if (this.buf[this.pos++] < 128) + return value; + value = (value | (this.buf[this.pos] & 127) << 21) >>> 0; + if (this.buf[this.pos++] < 128) + return value; + value = (value | (this.buf[this.pos] & 15) << 28) >>> 0; + if (this.buf[this.pos++] < 128) + return value; + if ((this.pos += 5) > this.len) { + this.pos = this.len; + throw indexOutOfRange(this, 10); + } + return value; + }; + }(); + Reader.prototype.int32 = function read_int32() { + return this.uint32() | 0; + }; + Reader.prototype.sint32 = function read_sint32() { + var value = this.uint32(); + return value >>> 1 ^ -(value & 1) | 0; + }; + function readLongVarint() { + var bits = new LongBits(0, 0); + var i = 0; + if (this.len - this.pos > 4) { + for (; i < 4; ++i) { + bits.lo = (bits.lo | (this.buf[this.pos] & 127) << i * 7) >>> 0; + if (this.buf[this.pos++] < 128) + return bits; + } + bits.lo = (bits.lo | (this.buf[this.pos] & 127) << 28) >>> 0; + bits.hi = (bits.hi | (this.buf[this.pos] & 127) >> 4) >>> 0; + if (this.buf[this.pos++] < 128) + return bits; + i = 0; + } else { + for (; i < 3; ++i) { + if (this.pos >= this.len) + throw indexOutOfRange(this); + bits.lo = (bits.lo | (this.buf[this.pos] & 127) << i * 7) >>> 0; + if (this.buf[this.pos++] < 128) + return bits; + } + bits.lo = (bits.lo | (this.buf[this.pos++] & 127) << i * 7) >>> 0; + return bits; + } + if (this.len - this.pos > 4) { + for (; i < 5; ++i) { + bits.hi = (bits.hi | (this.buf[this.pos] & 127) << i * 7 + 3) >>> 0; + if (this.buf[this.pos++] < 128) + return bits; + } + } else { + for (; i < 5; ++i) { + if (this.pos >= this.len) + throw indexOutOfRange(this); + bits.hi = (bits.hi | (this.buf[this.pos] & 127) << i * 7 + 3) >>> 0; + if (this.buf[this.pos++] < 128) + return bits; + } + } + throw Error("invalid varint encoding"); + } + Reader.prototype.bool = function read_bool() { + return this.uint32() !== 0; + }; + function readFixed32_end(buf, end) { + return (buf[end - 4] | buf[end - 3] << 8 | buf[end - 2] << 16 | buf[end - 1] << 24) >>> 0; + } + Reader.prototype.fixed32 = function read_fixed32() { + if (this.pos + 4 > this.len) + throw indexOutOfRange(this, 4); + return readFixed32_end(this.buf, this.pos += 4); + }; + Reader.prototype.sfixed32 = function read_sfixed32() { + if (this.pos + 4 > this.len) + throw indexOutOfRange(this, 4); + return readFixed32_end(this.buf, this.pos += 4) | 0; + }; + function readFixed64() { + if (this.pos + 8 > this.len) + throw indexOutOfRange(this, 8); + return new LongBits(readFixed32_end(this.buf, this.pos += 4), readFixed32_end(this.buf, this.pos += 4)); + } + Reader.prototype.float = function read_float() { + if (this.pos + 4 > this.len) + throw indexOutOfRange(this, 4); + var value = util.float.readFloatLE(this.buf, this.pos); + this.pos += 4; + return value; + }; + Reader.prototype.double = function read_double() { + if (this.pos + 8 > this.len) + throw indexOutOfRange(this, 4); + var value = util.float.readDoubleLE(this.buf, this.pos); + this.pos += 8; + return value; + }; + Reader.prototype.bytes = function read_bytes() { + var length2 = this.uint32(), start = this.pos, end = this.pos + length2; + if (end > this.len) + throw indexOutOfRange(this, length2); + this.pos += length2; + if (Array.isArray(this.buf)) + return this.buf.slice(start, end); + if (start === end) { + var nativeBuffer = util.Buffer; + return nativeBuffer ? nativeBuffer.alloc(0) : new this.buf.constructor(0); + } + return this._slice.call(this.buf, start, end); + }; + Reader.prototype.string = function read_string() { + var bytes = this.bytes(); + return utf83.read(bytes, 0, bytes.length); + }; + Reader.prototype.skip = function skip(length2) { + if (typeof length2 === "number") { + if (this.pos + length2 > this.len) + throw indexOutOfRange(this, length2); + this.pos += length2; + } else { + do { + if (this.pos >= this.len) + throw indexOutOfRange(this); + } while (this.buf[this.pos++] & 128); + } + return this; + }; + Reader.prototype.skipType = function(wireType) { + switch (wireType) { + case 0: + this.skip(); + break; + case 1: + this.skip(8); + break; + case 2: + this.skip(this.uint32()); + break; + case 3: + while ((wireType = this.uint32() & 7) !== 4) { + this.skipType(wireType); + } + break; + case 5: + this.skip(4); + break; + default: + throw Error("invalid wire type " + wireType + " at offset " + this.pos); + } + return this; + }; + Reader._configure = function(BufferReader_) { + BufferReader = BufferReader_; + Reader.create = create(); + BufferReader._configure(); + var fn = util.Long ? "toLong" : ( + /* istanbul ignore next */ + "toNumber" + ); + util.merge(Reader.prototype, { + int64: function read_int64() { + return readLongVarint.call(this)[fn](false); + }, + uint64: function read_uint64() { + return readLongVarint.call(this)[fn](true); + }, + sint64: function read_sint64() { + return readLongVarint.call(this).zzDecode()[fn](false); + }, + fixed64: function read_fixed64() { + return readFixed64.call(this)[fn](true); + }, + sfixed64: function read_sfixed64() { + return readFixed64.call(this)[fn](false); + } + }); + }; + } +}); + +// node_modules/protobufjs/src/reader_buffer.js +var require_reader_buffer = __commonJS({ + "node_modules/protobufjs/src/reader_buffer.js"(exports2, module2) { + "use strict"; + module2.exports = BufferReader; + var Reader = require_reader(); + (BufferReader.prototype = Object.create(Reader.prototype)).constructor = BufferReader; + var util = require_minimal(); + function BufferReader(buffer) { + Reader.call(this, buffer); + } + BufferReader._configure = function() { + if (util.Buffer) + BufferReader.prototype._slice = util.Buffer.prototype.slice; + }; + BufferReader.prototype.string = function read_string_buffer() { + var len = this.uint32(); + return this.buf.utf8Slice ? this.buf.utf8Slice(this.pos, this.pos = Math.min(this.pos + len, this.len)) : this.buf.toString("utf-8", this.pos, this.pos = Math.min(this.pos + len, this.len)); + }; + BufferReader._configure(); + } +}); + +// node_modules/protobufjs/src/rpc/service.js +var require_service = __commonJS({ + "node_modules/protobufjs/src/rpc/service.js"(exports2, module2) { + "use strict"; + module2.exports = Service; + var util = require_minimal(); + (Service.prototype = Object.create(util.EventEmitter.prototype)).constructor = Service; + function Service(rpcImpl, requestDelimited, responseDelimited) { + if (typeof rpcImpl !== "function") + throw TypeError("rpcImpl must be a function"); + util.EventEmitter.call(this); + this.rpcImpl = rpcImpl; + this.requestDelimited = Boolean(requestDelimited); + this.responseDelimited = Boolean(responseDelimited); + } + Service.prototype.rpcCall = function rpcCall(method, requestCtor, responseCtor, request, callback) { + if (!request) + throw TypeError("request must be specified"); + var self2 = this; + if (!callback) + return util.asPromise(rpcCall, self2, method, requestCtor, responseCtor, request); + if (!self2.rpcImpl) { + setTimeout(function() { + callback(Error("already ended")); + }, 0); + return void 0; + } + try { + return self2.rpcImpl( + method, + requestCtor[self2.requestDelimited ? "encodeDelimited" : "encode"](request).finish(), + function rpcCallback(err, response) { + if (err) { + self2.emit("error", err, method); + return callback(err); + } + if (response === null) { + self2.end( + /* endedByRPC */ + true + ); + return void 0; + } + if (!(response instanceof responseCtor)) { + try { + response = responseCtor[self2.responseDelimited ? "decodeDelimited" : "decode"](response); + } catch (err2) { + self2.emit("error", err2, method); + return callback(err2); + } + } + self2.emit("data", response, method); + return callback(null, response); + } + ); + } catch (err) { + self2.emit("error", err, method); + setTimeout(function() { + callback(err); + }, 0); + return void 0; + } + }; + Service.prototype.end = function end(endedByRPC) { + if (this.rpcImpl) { + if (!endedByRPC) + this.rpcImpl(null, null, null); + this.rpcImpl = null; + this.emit("end").off(); + } + return this; + }; + } +}); + +// node_modules/protobufjs/src/rpc.js +var require_rpc = __commonJS({ + "node_modules/protobufjs/src/rpc.js"(exports2) { + "use strict"; + var rpc = exports2; + rpc.Service = require_service(); + } +}); + +// node_modules/protobufjs/src/roots.js +var require_roots = __commonJS({ + "node_modules/protobufjs/src/roots.js"(exports2, module2) { + "use strict"; + module2.exports = {}; + } +}); + +// node_modules/protobufjs/src/index-minimal.js +var require_index_minimal = __commonJS({ + "node_modules/protobufjs/src/index-minimal.js"(exports2) { + "use strict"; + var protobuf = exports2; + protobuf.build = "minimal"; + protobuf.Writer = require_writer(); + protobuf.BufferWriter = require_writer_buffer(); + protobuf.Reader = require_reader(); + protobuf.BufferReader = require_reader_buffer(); + protobuf.util = require_minimal(); + protobuf.rpc = require_rpc(); + protobuf.roots = require_roots(); + protobuf.configure = configure; + function configure() { + protobuf.util._configure(); + protobuf.Writer._configure(protobuf.BufferWriter); + protobuf.Reader._configure(protobuf.BufferReader); + } + configure(); + } +}); + +// node_modules/protobufjs/minimal.js +var require_minimal2 = __commonJS({ + "node_modules/protobufjs/minimal.js"(exports2, module2) { + "use strict"; + module2.exports = require_index_minimal(); + } +}); + +// node_modules/react/cjs/react.development.js +var require_react_development = __commonJS({ + "node_modules/react/cjs/react.development.js"(exports2, module2) { + "use strict"; + if (true) { + (function() { + "use strict"; + if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== "undefined" && typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart === "function") { + __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(new Error()); + } + var ReactVersion = "18.2.0"; + var REACT_ELEMENT_TYPE = Symbol.for("react.element"); + var REACT_PORTAL_TYPE = Symbol.for("react.portal"); + var REACT_FRAGMENT_TYPE = Symbol.for("react.fragment"); + var REACT_STRICT_MODE_TYPE = Symbol.for("react.strict_mode"); + var REACT_PROFILER_TYPE = Symbol.for("react.profiler"); + var REACT_PROVIDER_TYPE = Symbol.for("react.provider"); + var REACT_CONTEXT_TYPE = Symbol.for("react.context"); + var REACT_FORWARD_REF_TYPE = Symbol.for("react.forward_ref"); + var REACT_SUSPENSE_TYPE = Symbol.for("react.suspense"); + var REACT_SUSPENSE_LIST_TYPE = Symbol.for("react.suspense_list"); + var REACT_MEMO_TYPE = Symbol.for("react.memo"); + var REACT_LAZY_TYPE = Symbol.for("react.lazy"); + var REACT_OFFSCREEN_TYPE = Symbol.for("react.offscreen"); + var MAYBE_ITERATOR_SYMBOL = Symbol.iterator; + var FAUX_ITERATOR_SYMBOL = "@@iterator"; + function getIteratorFn(maybeIterable) { + if (maybeIterable === null || typeof maybeIterable !== "object") { + return null; + } + var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]; + if (typeof maybeIterator === "function") { + return maybeIterator; + } + return null; + } + var ReactCurrentDispatcher = { + /** + * @internal + * @type {ReactComponent} + */ + current: null + }; + var ReactCurrentBatchConfig = { + transition: null + }; + var ReactCurrentActQueue = { + current: null, + // Used to reproduce behavior of `batchedUpdates` in legacy mode. + isBatchingLegacy: false, + didScheduleLegacyUpdate: false + }; + var ReactCurrentOwner = { + /** + * @internal + * @type {ReactComponent} + */ + current: null + }; + var ReactDebugCurrentFrame = {}; + var currentExtraStackFrame = null; + function setExtraStackFrame(stack) { + { + currentExtraStackFrame = stack; + } + } + { + ReactDebugCurrentFrame.setExtraStackFrame = function(stack) { + { + currentExtraStackFrame = stack; + } + }; + ReactDebugCurrentFrame.getCurrentStack = null; + ReactDebugCurrentFrame.getStackAddendum = function() { + var stack = ""; + if (currentExtraStackFrame) { + stack += currentExtraStackFrame; + } + var impl = ReactDebugCurrentFrame.getCurrentStack; + if (impl) { + stack += impl() || ""; + } + return stack; + }; + } + var enableScopeAPI = false; + var enableCacheElement = false; + var enableTransitionTracing = false; + var enableLegacyHidden = false; + var enableDebugTracing = false; + var ReactSharedInternals = { + ReactCurrentDispatcher, + ReactCurrentBatchConfig, + ReactCurrentOwner + }; + { + ReactSharedInternals.ReactDebugCurrentFrame = ReactDebugCurrentFrame; + ReactSharedInternals.ReactCurrentActQueue = ReactCurrentActQueue; + } + function warn(format) { + { + { + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + printWarning("warn", format, args); + } + } + } + function error(format) { + { + { + for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { + args[_key2 - 1] = arguments[_key2]; + } + printWarning("error", format, args); + } + } + } + function printWarning(level, format, args) { + { + var ReactDebugCurrentFrame2 = ReactSharedInternals.ReactDebugCurrentFrame; + var stack = ReactDebugCurrentFrame2.getStackAddendum(); + if (stack !== "") { + format += "%s"; + args = args.concat([stack]); + } + var argsWithFormat = args.map(function(item) { + return String(item); + }); + argsWithFormat.unshift("Warning: " + format); + Function.prototype.apply.call(console[level], console, argsWithFormat); + } + } + var didWarnStateUpdateForUnmountedComponent = {}; + function warnNoop(publicInstance, callerName) { + { + var _constructor = publicInstance.constructor; + var componentName = _constructor && (_constructor.displayName || _constructor.name) || "ReactClass"; + var warningKey = componentName + "." + callerName; + if (didWarnStateUpdateForUnmountedComponent[warningKey]) { + return; + } + error("Can't call %s on a component that is not yet mounted. This is a no-op, but it might indicate a bug in your application. Instead, assign to `this.state` directly or define a `state = {};` class property with the desired state in the %s component.", callerName, componentName); + didWarnStateUpdateForUnmountedComponent[warningKey] = true; + } + } + var ReactNoopUpdateQueue = { + /** + * Checks whether or not this composite component is mounted. + * @param {ReactClass} publicInstance The instance we want to test. + * @return {boolean} True if mounted, false otherwise. + * @protected + * @final + */ + isMounted: function(publicInstance) { + return false; + }, + /** + * Forces an update. This should only be invoked when it is known with + * certainty that we are **not** in a DOM transaction. + * + * You may want to call this when you know that some deeper aspect of the + * component's state has changed but `setState` was not called. + * + * This will not invoke `shouldComponentUpdate`, but it will invoke + * `componentWillUpdate` and `componentDidUpdate`. + * + * @param {ReactClass} publicInstance The instance that should rerender. + * @param {?function} callback Called after component is updated. + * @param {?string} callerName name of the calling function in the public API. + * @internal + */ + enqueueForceUpdate: function(publicInstance, callback, callerName) { + warnNoop(publicInstance, "forceUpdate"); + }, + /** + * Replaces all of the state. Always use this or `setState` to mutate state. + * You should treat `this.state` as immutable. + * + * There is no guarantee that `this.state` will be immediately updated, so + * accessing `this.state` after calling this method may return the old value. + * + * @param {ReactClass} publicInstance The instance that should rerender. + * @param {object} completeState Next state. + * @param {?function} callback Called after component is updated. + * @param {?string} callerName name of the calling function in the public API. + * @internal + */ + enqueueReplaceState: function(publicInstance, completeState, callback, callerName) { + warnNoop(publicInstance, "replaceState"); + }, + /** + * Sets a subset of the state. This only exists because _pendingState is + * internal. This provides a merging strategy that is not available to deep + * properties which is confusing. TODO: Expose pendingState or don't use it + * during the merge. + * + * @param {ReactClass} publicInstance The instance that should rerender. + * @param {object} partialState Next partial state to be merged with state. + * @param {?function} callback Called after component is updated. + * @param {?string} Name of the calling function in the public API. + * @internal + */ + enqueueSetState: function(publicInstance, partialState, callback, callerName) { + warnNoop(publicInstance, "setState"); + } + }; + var assign = Object.assign; + var emptyObject = {}; + { + Object.freeze(emptyObject); + } + function Component(props, context, updater) { + this.props = props; + this.context = context; + this.refs = emptyObject; + this.updater = updater || ReactNoopUpdateQueue; + } + Component.prototype.isReactComponent = {}; + Component.prototype.setState = function(partialState, callback) { + if (typeof partialState !== "object" && typeof partialState !== "function" && partialState != null) { + throw new Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables."); + } + this.updater.enqueueSetState(this, partialState, callback, "setState"); + }; + Component.prototype.forceUpdate = function(callback) { + this.updater.enqueueForceUpdate(this, callback, "forceUpdate"); + }; + { + var deprecatedAPIs = { + isMounted: ["isMounted", "Instead, make sure to clean up subscriptions and pending requests in componentWillUnmount to prevent memory leaks."], + replaceState: ["replaceState", "Refactor your code to use setState instead (see https://github.com/facebook/react/issues/3236)."] + }; + var defineDeprecationWarning = function(methodName, info) { + Object.defineProperty(Component.prototype, methodName, { + get: function() { + warn("%s(...) is deprecated in plain JavaScript React classes. %s", info[0], info[1]); + return void 0; + } + }); + }; + for (var fnName in deprecatedAPIs) { + if (deprecatedAPIs.hasOwnProperty(fnName)) { + defineDeprecationWarning(fnName, deprecatedAPIs[fnName]); + } + } + } + function ComponentDummy() { + } + ComponentDummy.prototype = Component.prototype; + function PureComponent(props, context, updater) { + this.props = props; + this.context = context; + this.refs = emptyObject; + this.updater = updater || ReactNoopUpdateQueue; + } + var pureComponentPrototype = PureComponent.prototype = new ComponentDummy(); + pureComponentPrototype.constructor = PureComponent; + assign(pureComponentPrototype, Component.prototype); + pureComponentPrototype.isPureReactComponent = true; + function createRef() { + var refObject = { + current: null + }; + { + Object.seal(refObject); + } + return refObject; + } + var isArrayImpl = Array.isArray; + function isArray(a) { + return isArrayImpl(a); + } + function typeName(value) { + { + var hasToStringTag = typeof Symbol === "function" && Symbol.toStringTag; + var type = hasToStringTag && value[Symbol.toStringTag] || value.constructor.name || "Object"; + return type; + } + } + function willCoercionThrow(value) { + { + try { + testStringCoercion(value); + return false; + } catch (e) { + return true; + } + } + } + function testStringCoercion(value) { + return "" + value; + } + function checkKeyStringCoercion(value) { + { + if (willCoercionThrow(value)) { + error("The provided key is an unsupported type %s. This value must be coerced to a string before before using it here.", typeName(value)); + return testStringCoercion(value); + } + } + } + function getWrappedName(outerType, innerType, wrapperName) { + var displayName = outerType.displayName; + if (displayName) { + return displayName; + } + var functionName = innerType.displayName || innerType.name || ""; + return functionName !== "" ? wrapperName + "(" + functionName + ")" : wrapperName; + } + function getContextName(type) { + return type.displayName || "Context"; + } + function getComponentNameFromType(type) { + if (type == null) { + return null; + } + { + if (typeof type.tag === "number") { + error("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."); + } + } + if (typeof type === "function") { + return type.displayName || type.name || null; + } + if (typeof type === "string") { + return type; + } + switch (type) { + case REACT_FRAGMENT_TYPE: + return "Fragment"; + case REACT_PORTAL_TYPE: + return "Portal"; + case REACT_PROFILER_TYPE: + return "Profiler"; + case REACT_STRICT_MODE_TYPE: + return "StrictMode"; + case REACT_SUSPENSE_TYPE: + return "Suspense"; + case REACT_SUSPENSE_LIST_TYPE: + return "SuspenseList"; + } + if (typeof type === "object") { + switch (type.$$typeof) { + case REACT_CONTEXT_TYPE: + var context = type; + return getContextName(context) + ".Consumer"; + case REACT_PROVIDER_TYPE: + var provider = type; + return getContextName(provider._context) + ".Provider"; + case REACT_FORWARD_REF_TYPE: + return getWrappedName(type, type.render, "ForwardRef"); + case REACT_MEMO_TYPE: + var outerName = type.displayName || null; + if (outerName !== null) { + return outerName; + } + return getComponentNameFromType(type.type) || "Memo"; + case REACT_LAZY_TYPE: { + var lazyComponent = type; + var payload = lazyComponent._payload; + var init = lazyComponent._init; + try { + return getComponentNameFromType(init(payload)); + } catch (x) { + return null; + } + } + } + } + return null; + } + var hasOwnProperty = Object.prototype.hasOwnProperty; + var RESERVED_PROPS = { + key: true, + ref: true, + __self: true, + __source: true + }; + var specialPropKeyWarningShown, specialPropRefWarningShown, didWarnAboutStringRefs; + { + didWarnAboutStringRefs = {}; + } + function hasValidRef(config) { + { + if (hasOwnProperty.call(config, "ref")) { + var getter = Object.getOwnPropertyDescriptor(config, "ref").get; + if (getter && getter.isReactWarning) { + return false; + } + } + } + return config.ref !== void 0; + } + function hasValidKey(config) { + { + if (hasOwnProperty.call(config, "key")) { + var getter = Object.getOwnPropertyDescriptor(config, "key").get; + if (getter && getter.isReactWarning) { + return false; + } + } + } + return config.key !== void 0; + } + function defineKeyPropWarningGetter(props, displayName) { + var warnAboutAccessingKey = function() { + { + if (!specialPropKeyWarningShown) { + specialPropKeyWarningShown = true; + error("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://reactjs.org/link/special-props)", displayName); + } + } + }; + warnAboutAccessingKey.isReactWarning = true; + Object.defineProperty(props, "key", { + get: warnAboutAccessingKey, + configurable: true + }); + } + function defineRefPropWarningGetter(props, displayName) { + var warnAboutAccessingRef = function() { + { + if (!specialPropRefWarningShown) { + specialPropRefWarningShown = true; + error("%s: `ref` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://reactjs.org/link/special-props)", displayName); + } + } + }; + warnAboutAccessingRef.isReactWarning = true; + Object.defineProperty(props, "ref", { + get: warnAboutAccessingRef, + configurable: true + }); + } + function warnIfStringRefCannotBeAutoConverted(config) { + { + if (typeof config.ref === "string" && ReactCurrentOwner.current && config.__self && ReactCurrentOwner.current.stateNode !== config.__self) { + var componentName = getComponentNameFromType(ReactCurrentOwner.current.type); + if (!didWarnAboutStringRefs[componentName]) { + error('Component "%s" contains the string ref "%s". Support for string refs will be removed in a future major release. This case cannot be automatically converted to an arrow function. We ask you to manually fix this case by using useRef() or createRef() instead. Learn more about using refs safely here: https://reactjs.org/link/strict-mode-string-ref', componentName, config.ref); + didWarnAboutStringRefs[componentName] = true; + } + } + } + } + var ReactElement = function(type, key, ref, self2, source, owner, props) { + var element = { + // This tag allows us to uniquely identify this as a React Element + $$typeof: REACT_ELEMENT_TYPE, + // Built-in properties that belong on the element + type, + key, + ref, + props, + // Record the component responsible for creating this element. + _owner: owner + }; + { + element._store = {}; + Object.defineProperty(element._store, "validated", { + configurable: false, + enumerable: false, + writable: true, + value: false + }); + Object.defineProperty(element, "_self", { + configurable: false, + enumerable: false, + writable: false, + value: self2 + }); + Object.defineProperty(element, "_source", { + configurable: false, + enumerable: false, + writable: false, + value: source + }); + if (Object.freeze) { + Object.freeze(element.props); + Object.freeze(element); + } + } + return element; + }; + function createElement(type, config, children) { + var propName; + var props = {}; + var key = null; + var ref = null; + var self2 = null; + var source = null; + if (config != null) { + if (hasValidRef(config)) { + ref = config.ref; + { + warnIfStringRefCannotBeAutoConverted(config); + } + } + if (hasValidKey(config)) { + { + checkKeyStringCoercion(config.key); + } + key = "" + config.key; + } + self2 = config.__self === void 0 ? null : config.__self; + source = config.__source === void 0 ? null : config.__source; + for (propName in config) { + if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) { + props[propName] = config[propName]; + } + } + } + var childrenLength = arguments.length - 2; + if (childrenLength === 1) { + props.children = children; + } else if (childrenLength > 1) { + var childArray = Array(childrenLength); + for (var i = 0; i < childrenLength; i++) { + childArray[i] = arguments[i + 2]; + } + { + if (Object.freeze) { + Object.freeze(childArray); + } + } + props.children = childArray; + } + if (type && type.defaultProps) { + var defaultProps = type.defaultProps; + for (propName in defaultProps) { + if (props[propName] === void 0) { + props[propName] = defaultProps[propName]; + } + } + } + { + if (key || ref) { + var displayName = typeof type === "function" ? type.displayName || type.name || "Unknown" : type; + if (key) { + defineKeyPropWarningGetter(props, displayName); + } + if (ref) { + defineRefPropWarningGetter(props, displayName); + } + } + } + return ReactElement(type, key, ref, self2, source, ReactCurrentOwner.current, props); + } + function cloneAndReplaceKey(oldElement, newKey) { + var newElement = ReactElement(oldElement.type, newKey, oldElement.ref, oldElement._self, oldElement._source, oldElement._owner, oldElement.props); + return newElement; + } + function cloneElement(element, config, children) { + if (element === null || element === void 0) { + throw new Error("React.cloneElement(...): The argument must be a React element, but you passed " + element + "."); + } + var propName; + var props = assign({}, element.props); + var key = element.key; + var ref = element.ref; + var self2 = element._self; + var source = element._source; + var owner = element._owner; + if (config != null) { + if (hasValidRef(config)) { + ref = config.ref; + owner = ReactCurrentOwner.current; + } + if (hasValidKey(config)) { + { + checkKeyStringCoercion(config.key); + } + key = "" + config.key; + } + var defaultProps; + if (element.type && element.type.defaultProps) { + defaultProps = element.type.defaultProps; + } + for (propName in config) { + if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) { + if (config[propName] === void 0 && defaultProps !== void 0) { + props[propName] = defaultProps[propName]; + } else { + props[propName] = config[propName]; + } + } + } + } + var childrenLength = arguments.length - 2; + if (childrenLength === 1) { + props.children = children; + } else if (childrenLength > 1) { + var childArray = Array(childrenLength); + for (var i = 0; i < childrenLength; i++) { + childArray[i] = arguments[i + 2]; + } + props.children = childArray; + } + return ReactElement(element.type, key, ref, self2, source, owner, props); + } + function isValidElement(object) { + return typeof object === "object" && object !== null && object.$$typeof === REACT_ELEMENT_TYPE; + } + var SEPARATOR = "."; + var SUBSEPARATOR = ":"; + function escape(key) { + var escapeRegex = /[=:]/g; + var escaperLookup = { + "=": "=0", + ":": "=2" + }; + var escapedString = key.replace(escapeRegex, function(match) { + return escaperLookup[match]; + }); + return "$" + escapedString; + } + var didWarnAboutMaps = false; + var userProvidedKeyEscapeRegex = /\/+/g; + function escapeUserProvidedKey(text) { + return text.replace(userProvidedKeyEscapeRegex, "$&/"); + } + function getElementKey(element, index) { + if (typeof element === "object" && element !== null && element.key != null) { + { + checkKeyStringCoercion(element.key); + } + return escape("" + element.key); + } + return index.toString(36); + } + function mapIntoArray(children, array, escapedPrefix, nameSoFar, callback) { + var type = typeof children; + if (type === "undefined" || type === "boolean") { + children = null; + } + var invokeCallback = false; + if (children === null) { + invokeCallback = true; + } else { + switch (type) { + case "string": + case "number": + invokeCallback = true; + break; + case "object": + switch (children.$$typeof) { + case REACT_ELEMENT_TYPE: + case REACT_PORTAL_TYPE: + invokeCallback = true; + } + } + } + if (invokeCallback) { + var _child = children; + var mappedChild = callback(_child); + var childKey = nameSoFar === "" ? SEPARATOR + getElementKey(_child, 0) : nameSoFar; + if (isArray(mappedChild)) { + var escapedChildKey = ""; + if (childKey != null) { + escapedChildKey = escapeUserProvidedKey(childKey) + "/"; + } + mapIntoArray(mappedChild, array, escapedChildKey, "", function(c) { + return c; + }); + } else if (mappedChild != null) { + if (isValidElement(mappedChild)) { + { + if (mappedChild.key && (!_child || _child.key !== mappedChild.key)) { + checkKeyStringCoercion(mappedChild.key); + } + } + mappedChild = cloneAndReplaceKey( + mappedChild, + // Keep both the (mapped) and old keys if they differ, just as + // traverseAllChildren used to do for objects as children + escapedPrefix + // $FlowFixMe Flow incorrectly thinks React.Portal doesn't have a key + (mappedChild.key && (!_child || _child.key !== mappedChild.key) ? ( + // $FlowFixMe Flow incorrectly thinks existing element's key can be a number + // eslint-disable-next-line react-internal/safe-string-coercion + escapeUserProvidedKey("" + mappedChild.key) + "/" + ) : "") + childKey + ); + } + array.push(mappedChild); + } + return 1; + } + var child; + var nextName; + var subtreeCount = 0; + var nextNamePrefix = nameSoFar === "" ? SEPARATOR : nameSoFar + SUBSEPARATOR; + if (isArray(children)) { + for (var i = 0; i < children.length; i++) { + child = children[i]; + nextName = nextNamePrefix + getElementKey(child, i); + subtreeCount += mapIntoArray(child, array, escapedPrefix, nextName, callback); + } + } else { + var iteratorFn = getIteratorFn(children); + if (typeof iteratorFn === "function") { + var iterableChildren = children; + { + if (iteratorFn === iterableChildren.entries) { + if (!didWarnAboutMaps) { + warn("Using Maps as children is not supported. Use an array of keyed ReactElements instead."); + } + didWarnAboutMaps = true; + } + } + var iterator = iteratorFn.call(iterableChildren); + var step; + var ii = 0; + while (!(step = iterator.next()).done) { + child = step.value; + nextName = nextNamePrefix + getElementKey(child, ii++); + subtreeCount += mapIntoArray(child, array, escapedPrefix, nextName, callback); + } + } else if (type === "object") { + var childrenString = String(children); + throw new Error("Objects are not valid as a React child (found: " + (childrenString === "[object Object]" ? "object with keys {" + Object.keys(children).join(", ") + "}" : childrenString) + "). If you meant to render a collection of children, use an array instead."); + } + } + return subtreeCount; + } + function mapChildren(children, func, context) { + if (children == null) { + return children; + } + var result = []; + var count = 0; + mapIntoArray(children, result, "", "", function(child) { + return func.call(context, child, count++); + }); + return result; + } + function countChildren(children) { + var n = 0; + mapChildren(children, function() { + n++; + }); + return n; + } + function forEachChildren(children, forEachFunc, forEachContext) { + mapChildren(children, function() { + forEachFunc.apply(this, arguments); + }, forEachContext); + } + function toArray(children) { + return mapChildren(children, function(child) { + return child; + }) || []; + } + function onlyChild(children) { + if (!isValidElement(children)) { + throw new Error("React.Children.only expected to receive a single React element child."); + } + return children; + } + function createContext(defaultValue) { + var context = { + $$typeof: REACT_CONTEXT_TYPE, + // As a workaround to support multiple concurrent renderers, we categorize + // some renderers as primary and others as secondary. We only expect + // there to be two concurrent renderers at most: React Native (primary) and + // Fabric (secondary); React DOM (primary) and React ART (secondary). + // Secondary renderers store their context values on separate fields. + _currentValue: defaultValue, + _currentValue2: defaultValue, + // Used to track how many concurrent renderers this context currently + // supports within in a single renderer. Such as parallel server rendering. + _threadCount: 0, + // These are circular + Provider: null, + Consumer: null, + // Add these to use same hidden class in VM as ServerContext + _defaultValue: null, + _globalName: null + }; + context.Provider = { + $$typeof: REACT_PROVIDER_TYPE, + _context: context + }; + var hasWarnedAboutUsingNestedContextConsumers = false; + var hasWarnedAboutUsingConsumerProvider = false; + var hasWarnedAboutDisplayNameOnConsumer = false; + { + var Consumer = { + $$typeof: REACT_CONTEXT_TYPE, + _context: context + }; + Object.defineProperties(Consumer, { + Provider: { + get: function() { + if (!hasWarnedAboutUsingConsumerProvider) { + hasWarnedAboutUsingConsumerProvider = true; + error("Rendering is not supported and will be removed in a future major release. Did you mean to render instead?"); + } + return context.Provider; + }, + set: function(_Provider) { + context.Provider = _Provider; + } + }, + _currentValue: { + get: function() { + return context._currentValue; + }, + set: function(_currentValue) { + context._currentValue = _currentValue; + } + }, + _currentValue2: { + get: function() { + return context._currentValue2; + }, + set: function(_currentValue2) { + context._currentValue2 = _currentValue2; + } + }, + _threadCount: { + get: function() { + return context._threadCount; + }, + set: function(_threadCount) { + context._threadCount = _threadCount; + } + }, + Consumer: { + get: function() { + if (!hasWarnedAboutUsingNestedContextConsumers) { + hasWarnedAboutUsingNestedContextConsumers = true; + error("Rendering is not supported and will be removed in a future major release. Did you mean to render instead?"); + } + return context.Consumer; + } + }, + displayName: { + get: function() { + return context.displayName; + }, + set: function(displayName) { + if (!hasWarnedAboutDisplayNameOnConsumer) { + warn("Setting `displayName` on Context.Consumer has no effect. You should set it directly on the context with Context.displayName = '%s'.", displayName); + hasWarnedAboutDisplayNameOnConsumer = true; + } + } + } + }); + context.Consumer = Consumer; + } + { + context._currentRenderer = null; + context._currentRenderer2 = null; + } + return context; + } + var Uninitialized = -1; + var Pending = 0; + var Resolved = 1; + var Rejected = 2; + function lazyInitializer(payload) { + if (payload._status === Uninitialized) { + var ctor = payload._result; + var thenable = ctor(); + thenable.then(function(moduleObject2) { + if (payload._status === Pending || payload._status === Uninitialized) { + var resolved = payload; + resolved._status = Resolved; + resolved._result = moduleObject2; + } + }, function(error2) { + if (payload._status === Pending || payload._status === Uninitialized) { + var rejected = payload; + rejected._status = Rejected; + rejected._result = error2; + } + }); + if (payload._status === Uninitialized) { + var pending = payload; + pending._status = Pending; + pending._result = thenable; + } + } + if (payload._status === Resolved) { + var moduleObject = payload._result; + { + if (moduleObject === void 0) { + error("lazy: Expected the result of a dynamic import() call. Instead received: %s\n\nYour code should look like: \n const MyComponent = lazy(() => import('./MyComponent'))\n\nDid you accidentally put curly braces around the import?", moduleObject); + } + } + { + if (!("default" in moduleObject)) { + error("lazy: Expected the result of a dynamic import() call. Instead received: %s\n\nYour code should look like: \n const MyComponent = lazy(() => import('./MyComponent'))", moduleObject); + } + } + return moduleObject.default; + } else { + throw payload._result; + } + } + function lazy(ctor) { + var payload = { + // We use these fields to store the result. + _status: Uninitialized, + _result: ctor + }; + var lazyType = { + $$typeof: REACT_LAZY_TYPE, + _payload: payload, + _init: lazyInitializer + }; + { + var defaultProps; + var propTypes; + Object.defineProperties(lazyType, { + defaultProps: { + configurable: true, + get: function() { + return defaultProps; + }, + set: function(newDefaultProps) { + error("React.lazy(...): It is not supported to assign `defaultProps` to a lazy component import. Either specify them where the component is defined, or create a wrapping component around it."); + defaultProps = newDefaultProps; + Object.defineProperty(lazyType, "defaultProps", { + enumerable: true + }); + } + }, + propTypes: { + configurable: true, + get: function() { + return propTypes; + }, + set: function(newPropTypes) { + error("React.lazy(...): It is not supported to assign `propTypes` to a lazy component import. Either specify them where the component is defined, or create a wrapping component around it."); + propTypes = newPropTypes; + Object.defineProperty(lazyType, "propTypes", { + enumerable: true + }); + } + } + }); + } + return lazyType; + } + function forwardRef(render) { + { + if (render != null && render.$$typeof === REACT_MEMO_TYPE) { + error("forwardRef requires a render function but received a `memo` component. Instead of forwardRef(memo(...)), use memo(forwardRef(...))."); + } else if (typeof render !== "function") { + error("forwardRef requires a render function but was given %s.", render === null ? "null" : typeof render); + } else { + if (render.length !== 0 && render.length !== 2) { + error("forwardRef render functions accept exactly two parameters: props and ref. %s", render.length === 1 ? "Did you forget to use the ref parameter?" : "Any additional parameter will be undefined."); + } + } + if (render != null) { + if (render.defaultProps != null || render.propTypes != null) { + error("forwardRef render functions do not support propTypes or defaultProps. Did you accidentally pass a React component?"); + } + } + } + var elementType = { + $$typeof: REACT_FORWARD_REF_TYPE, + render + }; + { + var ownName; + Object.defineProperty(elementType, "displayName", { + enumerable: false, + configurable: true, + get: function() { + return ownName; + }, + set: function(name) { + ownName = name; + if (!render.name && !render.displayName) { + render.displayName = name; + } + } + }); + } + return elementType; + } + var REACT_MODULE_REFERENCE; + { + REACT_MODULE_REFERENCE = Symbol.for("react.module.reference"); + } + function isValidElementType(type) { + if (typeof type === "string" || typeof type === "function") { + return true; + } + if (type === REACT_FRAGMENT_TYPE || type === REACT_PROFILER_TYPE || enableDebugTracing || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || enableLegacyHidden || type === REACT_OFFSCREEN_TYPE || enableScopeAPI || enableCacheElement || enableTransitionTracing) { + return true; + } + if (typeof type === "object" && type !== null) { + if (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || // This needs to include all possible module reference object + // types supported by any Flight configuration anywhere since + // we don't know which Flight build this will end up being used + // with. + type.$$typeof === REACT_MODULE_REFERENCE || type.getModuleId !== void 0) { + return true; + } + } + return false; + } + function memo(type, compare2) { + { + if (!isValidElementType(type)) { + error("memo: The first argument must be a component. Instead received: %s", type === null ? "null" : typeof type); + } + } + var elementType = { + $$typeof: REACT_MEMO_TYPE, + type, + compare: compare2 === void 0 ? null : compare2 + }; + { + var ownName; + Object.defineProperty(elementType, "displayName", { + enumerable: false, + configurable: true, + get: function() { + return ownName; + }, + set: function(name) { + ownName = name; + if (!type.name && !type.displayName) { + type.displayName = name; + } + } + }); + } + return elementType; + } + function resolveDispatcher() { + var dispatcher = ReactCurrentDispatcher.current; + { + if (dispatcher === null) { + error("Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:\n1. You might have mismatching versions of React and the renderer (such as React DOM)\n2. You might be breaking the Rules of Hooks\n3. You might have more than one copy of React in the same app\nSee https://reactjs.org/link/invalid-hook-call for tips about how to debug and fix this problem."); + } + } + return dispatcher; + } + function useContext(Context) { + var dispatcher = resolveDispatcher(); + { + if (Context._context !== void 0) { + var realContext = Context._context; + if (realContext.Consumer === Context) { + error("Calling useContext(Context.Consumer) is not supported, may cause bugs, and will be removed in a future major release. Did you mean to call useContext(Context) instead?"); + } else if (realContext.Provider === Context) { + error("Calling useContext(Context.Provider) is not supported. Did you mean to call useContext(Context) instead?"); + } + } + } + return dispatcher.useContext(Context); + } + function useState(initialState) { + var dispatcher = resolveDispatcher(); + return dispatcher.useState(initialState); + } + function useReducer(reducer, initialArg, init) { + var dispatcher = resolveDispatcher(); + return dispatcher.useReducer(reducer, initialArg, init); + } + function useRef(initialValue) { + var dispatcher = resolveDispatcher(); + return dispatcher.useRef(initialValue); + } + function useEffect(create, deps) { + var dispatcher = resolveDispatcher(); + return dispatcher.useEffect(create, deps); + } + function useInsertionEffect(create, deps) { + var dispatcher = resolveDispatcher(); + return dispatcher.useInsertionEffect(create, deps); + } + function useLayoutEffect(create, deps) { + var dispatcher = resolveDispatcher(); + return dispatcher.useLayoutEffect(create, deps); + } + function useCallback(callback, deps) { + var dispatcher = resolveDispatcher(); + return dispatcher.useCallback(callback, deps); + } + function useMemo(create, deps) { + var dispatcher = resolveDispatcher(); + return dispatcher.useMemo(create, deps); + } + function useImperativeHandle(ref, create, deps) { + var dispatcher = resolveDispatcher(); + return dispatcher.useImperativeHandle(ref, create, deps); + } + function useDebugValue(value, formatterFn) { + { + var dispatcher = resolveDispatcher(); + return dispatcher.useDebugValue(value, formatterFn); + } + } + function useTransition() { + var dispatcher = resolveDispatcher(); + return dispatcher.useTransition(); + } + function useDeferredValue(value) { + var dispatcher = resolveDispatcher(); + return dispatcher.useDeferredValue(value); + } + function useId() { + var dispatcher = resolveDispatcher(); + return dispatcher.useId(); + } + function useSyncExternalStore(subscribe2, getSnapshot, getServerSnapshot) { + var dispatcher = resolveDispatcher(); + return dispatcher.useSyncExternalStore(subscribe2, getSnapshot, getServerSnapshot); + } + var disabledDepth = 0; + var prevLog; + var prevInfo; + var prevWarn; + var prevError; + var prevGroup; + var prevGroupCollapsed; + var prevGroupEnd; + function disabledLog() { + } + disabledLog.__reactDisabledLog = true; + function disableLogs() { + { + if (disabledDepth === 0) { + prevLog = console.log; + prevInfo = console.info; + prevWarn = console.warn; + prevError = console.error; + prevGroup = console.group; + prevGroupCollapsed = console.groupCollapsed; + prevGroupEnd = console.groupEnd; + var props = { + configurable: true, + enumerable: true, + value: disabledLog, + writable: true + }; + Object.defineProperties(console, { + info: props, + log: props, + warn: props, + error: props, + group: props, + groupCollapsed: props, + groupEnd: props + }); + } + disabledDepth++; + } + } + function reenableLogs() { + { + disabledDepth--; + if (disabledDepth === 0) { + var props = { + configurable: true, + enumerable: true, + writable: true + }; + Object.defineProperties(console, { + log: assign({}, props, { + value: prevLog + }), + info: assign({}, props, { + value: prevInfo + }), + warn: assign({}, props, { + value: prevWarn + }), + error: assign({}, props, { + value: prevError + }), + group: assign({}, props, { + value: prevGroup + }), + groupCollapsed: assign({}, props, { + value: prevGroupCollapsed + }), + groupEnd: assign({}, props, { + value: prevGroupEnd + }) + }); + } + if (disabledDepth < 0) { + error("disabledDepth fell below zero. This is a bug in React. Please file an issue."); + } + } + } + var ReactCurrentDispatcher$1 = ReactSharedInternals.ReactCurrentDispatcher; + var prefix; + function describeBuiltInComponentFrame(name, source, ownerFn) { + { + if (prefix === void 0) { + try { + throw Error(); + } catch (x) { + var match = x.stack.trim().match(/\n( *(at )?)/); + prefix = match && match[1] || ""; + } + } + return "\n" + prefix + name; + } + } + var reentry = false; + var componentFrameCache; + { + var PossiblyWeakMap = typeof WeakMap === "function" ? WeakMap : Map; + componentFrameCache = new PossiblyWeakMap(); + } + function describeNativeComponentFrame(fn, construct) { + if (!fn || reentry) { + return ""; + } + { + var frame = componentFrameCache.get(fn); + if (frame !== void 0) { + return frame; + } + } + var control; + reentry = true; + var previousPrepareStackTrace = Error.prepareStackTrace; + Error.prepareStackTrace = void 0; + var previousDispatcher; + { + previousDispatcher = ReactCurrentDispatcher$1.current; + ReactCurrentDispatcher$1.current = null; + disableLogs(); + } + try { + if (construct) { + var Fake = function() { + throw Error(); + }; + Object.defineProperty(Fake.prototype, "props", { + set: function() { + throw Error(); + } + }); + if (typeof Reflect === "object" && Reflect.construct) { + try { + Reflect.construct(Fake, []); + } catch (x) { + control = x; + } + Reflect.construct(fn, [], Fake); + } else { + try { + Fake.call(); + } catch (x) { + control = x; + } + fn.call(Fake.prototype); + } + } else { + try { + throw Error(); + } catch (x) { + control = x; + } + fn(); + } + } catch (sample) { + if (sample && control && typeof sample.stack === "string") { + var sampleLines = sample.stack.split("\n"); + var controlLines = control.stack.split("\n"); + var s = sampleLines.length - 1; + var c = controlLines.length - 1; + while (s >= 1 && c >= 0 && sampleLines[s] !== controlLines[c]) { + c--; + } + for (; s >= 1 && c >= 0; s--, c--) { + if (sampleLines[s] !== controlLines[c]) { + if (s !== 1 || c !== 1) { + do { + s--; + c--; + if (c < 0 || sampleLines[s] !== controlLines[c]) { + var _frame = "\n" + sampleLines[s].replace(" at new ", " at "); + if (fn.displayName && _frame.includes("")) { + _frame = _frame.replace("", fn.displayName); + } + { + if (typeof fn === "function") { + componentFrameCache.set(fn, _frame); + } + } + return _frame; + } + } while (s >= 1 && c >= 0); + } + break; + } + } + } + } finally { + reentry = false; + { + ReactCurrentDispatcher$1.current = previousDispatcher; + reenableLogs(); + } + Error.prepareStackTrace = previousPrepareStackTrace; + } + var name = fn ? fn.displayName || fn.name : ""; + var syntheticFrame = name ? describeBuiltInComponentFrame(name) : ""; + { + if (typeof fn === "function") { + componentFrameCache.set(fn, syntheticFrame); + } + } + return syntheticFrame; + } + function describeFunctionComponentFrame(fn, source, ownerFn) { + { + return describeNativeComponentFrame(fn, false); + } + } + function shouldConstruct(Component2) { + var prototype = Component2.prototype; + return !!(prototype && prototype.isReactComponent); + } + function describeUnknownElementTypeFrameInDEV(type, source, ownerFn) { + if (type == null) { + return ""; + } + if (typeof type === "function") { + { + return describeNativeComponentFrame(type, shouldConstruct(type)); + } + } + if (typeof type === "string") { + return describeBuiltInComponentFrame(type); + } + switch (type) { + case REACT_SUSPENSE_TYPE: + return describeBuiltInComponentFrame("Suspense"); + case REACT_SUSPENSE_LIST_TYPE: + return describeBuiltInComponentFrame("SuspenseList"); + } + if (typeof type === "object") { + switch (type.$$typeof) { + case REACT_FORWARD_REF_TYPE: + return describeFunctionComponentFrame(type.render); + case REACT_MEMO_TYPE: + return describeUnknownElementTypeFrameInDEV(type.type, source, ownerFn); + case REACT_LAZY_TYPE: { + var lazyComponent = type; + var payload = lazyComponent._payload; + var init = lazyComponent._init; + try { + return describeUnknownElementTypeFrameInDEV(init(payload), source, ownerFn); + } catch (x) { + } + } + } + } + return ""; + } + var loggedTypeFailures = {}; + var ReactDebugCurrentFrame$1 = ReactSharedInternals.ReactDebugCurrentFrame; + function setCurrentlyValidatingElement(element) { + { + if (element) { + var owner = element._owner; + var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null); + ReactDebugCurrentFrame$1.setExtraStackFrame(stack); + } else { + ReactDebugCurrentFrame$1.setExtraStackFrame(null); + } + } + } + function checkPropTypes(typeSpecs, values, location, componentName, element) { + { + var has = Function.call.bind(hasOwnProperty); + for (var typeSpecName in typeSpecs) { + if (has(typeSpecs, typeSpecName)) { + var error$1 = void 0; + try { + if (typeof typeSpecs[typeSpecName] !== "function") { + var err = Error((componentName || "React class") + ": " + location + " type `" + typeSpecName + "` is invalid; it must be a function, usually from the `prop-types` package, but received `" + typeof typeSpecs[typeSpecName] + "`.This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`."); + err.name = "Invariant Violation"; + throw err; + } + error$1 = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, "SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"); + } catch (ex) { + error$1 = ex; + } + if (error$1 && !(error$1 instanceof Error)) { + setCurrentlyValidatingElement(element); + error("%s: type specification of %s `%s` is invalid; the type checker function must return `null` or an `Error` but returned a %s. You may have forgotten to pass an argument to the type checker creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and shape all require an argument).", componentName || "React class", location, typeSpecName, typeof error$1); + setCurrentlyValidatingElement(null); + } + if (error$1 instanceof Error && !(error$1.message in loggedTypeFailures)) { + loggedTypeFailures[error$1.message] = true; + setCurrentlyValidatingElement(element); + error("Failed %s type: %s", location, error$1.message); + setCurrentlyValidatingElement(null); + } + } + } + } + } + function setCurrentlyValidatingElement$1(element) { + { + if (element) { + var owner = element._owner; + var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null); + setExtraStackFrame(stack); + } else { + setExtraStackFrame(null); + } + } + } + var propTypesMisspellWarningShown; + { + propTypesMisspellWarningShown = false; + } + function getDeclarationErrorAddendum() { + if (ReactCurrentOwner.current) { + var name = getComponentNameFromType(ReactCurrentOwner.current.type); + if (name) { + return "\n\nCheck the render method of `" + name + "`."; + } + } + return ""; + } + function getSourceInfoErrorAddendum(source) { + if (source !== void 0) { + var fileName = source.fileName.replace(/^.*[\\\/]/, ""); + var lineNumber = source.lineNumber; + return "\n\nCheck your code at " + fileName + ":" + lineNumber + "."; + } + return ""; + } + function getSourceInfoErrorAddendumForProps(elementProps) { + if (elementProps !== null && elementProps !== void 0) { + return getSourceInfoErrorAddendum(elementProps.__source); + } + return ""; + } + var ownerHasKeyUseWarning = {}; + function getCurrentComponentErrorInfo(parentType) { + var info = getDeclarationErrorAddendum(); + if (!info) { + var parentName = typeof parentType === "string" ? parentType : parentType.displayName || parentType.name; + if (parentName) { + info = "\n\nCheck the top-level render call using <" + parentName + ">."; + } + } + return info; + } + function validateExplicitKey(element, parentType) { + if (!element._store || element._store.validated || element.key != null) { + return; + } + element._store.validated = true; + var currentComponentErrorInfo = getCurrentComponentErrorInfo(parentType); + if (ownerHasKeyUseWarning[currentComponentErrorInfo]) { + return; + } + ownerHasKeyUseWarning[currentComponentErrorInfo] = true; + var childOwner = ""; + if (element && element._owner && element._owner !== ReactCurrentOwner.current) { + childOwner = " It was passed a child from " + getComponentNameFromType(element._owner.type) + "."; + } + { + setCurrentlyValidatingElement$1(element); + error('Each child in a list should have a unique "key" prop.%s%s See https://reactjs.org/link/warning-keys for more information.', currentComponentErrorInfo, childOwner); + setCurrentlyValidatingElement$1(null); + } + } + function validateChildKeys(node, parentType) { + if (typeof node !== "object") { + return; + } + if (isArray(node)) { + for (var i = 0; i < node.length; i++) { + var child = node[i]; + if (isValidElement(child)) { + validateExplicitKey(child, parentType); + } + } + } else if (isValidElement(node)) { + if (node._store) { + node._store.validated = true; + } + } else if (node) { + var iteratorFn = getIteratorFn(node); + if (typeof iteratorFn === "function") { + if (iteratorFn !== node.entries) { + var iterator = iteratorFn.call(node); + var step; + while (!(step = iterator.next()).done) { + if (isValidElement(step.value)) { + validateExplicitKey(step.value, parentType); + } + } + } + } + } + } + function validatePropTypes(element) { + { + var type = element.type; + if (type === null || type === void 0 || typeof type === "string") { + return; + } + var propTypes; + if (typeof type === "function") { + propTypes = type.propTypes; + } else if (typeof type === "object" && (type.$$typeof === REACT_FORWARD_REF_TYPE || // Note: Memo only checks outer props here. + // Inner props are checked in the reconciler. + type.$$typeof === REACT_MEMO_TYPE)) { + propTypes = type.propTypes; + } else { + return; + } + if (propTypes) { + var name = getComponentNameFromType(type); + checkPropTypes(propTypes, element.props, "prop", name, element); + } else if (type.PropTypes !== void 0 && !propTypesMisspellWarningShown) { + propTypesMisspellWarningShown = true; + var _name = getComponentNameFromType(type); + error("Component %s declared `PropTypes` instead of `propTypes`. Did you misspell the property assignment?", _name || "Unknown"); + } + if (typeof type.getDefaultProps === "function" && !type.getDefaultProps.isReactClassApproved) { + error("getDefaultProps is only used on classic React.createClass definitions. Use a static property named `defaultProps` instead."); + } + } + } + function validateFragmentProps(fragment) { + { + var keys = Object.keys(fragment.props); + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + if (key !== "children" && key !== "key") { + setCurrentlyValidatingElement$1(fragment); + error("Invalid prop `%s` supplied to `React.Fragment`. React.Fragment can only have `key` and `children` props.", key); + setCurrentlyValidatingElement$1(null); + break; + } + } + if (fragment.ref !== null) { + setCurrentlyValidatingElement$1(fragment); + error("Invalid attribute `ref` supplied to `React.Fragment`."); + setCurrentlyValidatingElement$1(null); + } + } + } + function createElementWithValidation(type, props, children) { + var validType = isValidElementType(type); + if (!validType) { + var info = ""; + if (type === void 0 || typeof type === "object" && type !== null && Object.keys(type).length === 0) { + info += " You likely forgot to export your component from the file it's defined in, or you might have mixed up default and named imports."; + } + var sourceInfo = getSourceInfoErrorAddendumForProps(props); + if (sourceInfo) { + info += sourceInfo; + } else { + info += getDeclarationErrorAddendum(); + } + var typeString; + if (type === null) { + typeString = "null"; + } else if (isArray(type)) { + typeString = "array"; + } else if (type !== void 0 && type.$$typeof === REACT_ELEMENT_TYPE) { + typeString = "<" + (getComponentNameFromType(type.type) || "Unknown") + " />"; + info = " Did you accidentally export a JSX literal instead of a component?"; + } else { + typeString = typeof type; + } + { + error("React.createElement: type is invalid -- expected a string (for built-in components) or a class/function (for composite components) but got: %s.%s", typeString, info); + } + } + var element = createElement.apply(this, arguments); + if (element == null) { + return element; + } + if (validType) { + for (var i = 2; i < arguments.length; i++) { + validateChildKeys(arguments[i], type); + } + } + if (type === REACT_FRAGMENT_TYPE) { + validateFragmentProps(element); + } else { + validatePropTypes(element); + } + return element; + } + var didWarnAboutDeprecatedCreateFactory = false; + function createFactoryWithValidation(type) { + var validatedFactory = createElementWithValidation.bind(null, type); + validatedFactory.type = type; + { + if (!didWarnAboutDeprecatedCreateFactory) { + didWarnAboutDeprecatedCreateFactory = true; + warn("React.createFactory() is deprecated and will be removed in a future major release. Consider using JSX or use React.createElement() directly instead."); + } + Object.defineProperty(validatedFactory, "type", { + enumerable: false, + get: function() { + warn("Factory.type is deprecated. Access the class directly before passing it to createFactory."); + Object.defineProperty(this, "type", { + value: type + }); + return type; + } + }); + } + return validatedFactory; + } + function cloneElementWithValidation(element, props, children) { + var newElement = cloneElement.apply(this, arguments); + for (var i = 2; i < arguments.length; i++) { + validateChildKeys(arguments[i], newElement.type); + } + validatePropTypes(newElement); + return newElement; + } + function startTransition(scope, options) { + var prevTransition = ReactCurrentBatchConfig.transition; + ReactCurrentBatchConfig.transition = {}; + var currentTransition = ReactCurrentBatchConfig.transition; + { + ReactCurrentBatchConfig.transition._updatedFibers = /* @__PURE__ */ new Set(); + } + try { + scope(); + } finally { + ReactCurrentBatchConfig.transition = prevTransition; + { + if (prevTransition === null && currentTransition._updatedFibers) { + var updatedFibersCount = currentTransition._updatedFibers.size; + if (updatedFibersCount > 10) { + warn("Detected a large number of updates inside startTransition. If this is due to a subscription please re-write it to use React provided hooks. Otherwise concurrent mode guarantees are off the table."); + } + currentTransition._updatedFibers.clear(); + } + } + } + } + var didWarnAboutMessageChannel = false; + var enqueueTaskImpl = null; + function enqueueTask(task) { + if (enqueueTaskImpl === null) { + try { + var requireString = ("require" + Math.random()).slice(0, 7); + var nodeRequire = module2 && module2[requireString]; + enqueueTaskImpl = nodeRequire.call(module2, "timers").setImmediate; + } catch (_err) { + enqueueTaskImpl = function(callback) { + { + if (didWarnAboutMessageChannel === false) { + didWarnAboutMessageChannel = true; + if (typeof MessageChannel === "undefined") { + error("This browser does not have a MessageChannel implementation, so enqueuing tasks via await act(async () => ...) will fail. Please file an issue at https://github.com/facebook/react/issues if you encounter this warning."); + } + } + } + var channel = new MessageChannel(); + channel.port1.onmessage = callback; + channel.port2.postMessage(void 0); + }; + } + } + return enqueueTaskImpl(task); + } + var actScopeDepth = 0; + var didWarnNoAwaitAct = false; + function act(callback) { + { + var prevActScopeDepth = actScopeDepth; + actScopeDepth++; + if (ReactCurrentActQueue.current === null) { + ReactCurrentActQueue.current = []; + } + var prevIsBatchingLegacy = ReactCurrentActQueue.isBatchingLegacy; + var result; + try { + ReactCurrentActQueue.isBatchingLegacy = true; + result = callback(); + if (!prevIsBatchingLegacy && ReactCurrentActQueue.didScheduleLegacyUpdate) { + var queue = ReactCurrentActQueue.current; + if (queue !== null) { + ReactCurrentActQueue.didScheduleLegacyUpdate = false; + flushActQueue(queue); + } + } + } catch (error2) { + popActScope(prevActScopeDepth); + throw error2; + } finally { + ReactCurrentActQueue.isBatchingLegacy = prevIsBatchingLegacy; + } + if (result !== null && typeof result === "object" && typeof result.then === "function") { + var thenableResult = result; + var wasAwaited = false; + var thenable = { + then: function(resolve2, reject) { + wasAwaited = true; + thenableResult.then(function(returnValue2) { + popActScope(prevActScopeDepth); + if (actScopeDepth === 0) { + recursivelyFlushAsyncActWork(returnValue2, resolve2, reject); + } else { + resolve2(returnValue2); + } + }, function(error2) { + popActScope(prevActScopeDepth); + reject(error2); + }); + } + }; + { + if (!didWarnNoAwaitAct && typeof Promise !== "undefined") { + Promise.resolve().then(function() { + }).then(function() { + if (!wasAwaited) { + didWarnNoAwaitAct = true; + error("You called act(async () => ...) without await. This could lead to unexpected testing behaviour, interleaving multiple act calls and mixing their scopes. You should - await act(async () => ...);"); + } + }); + } + } + return thenable; + } else { + var returnValue = result; + popActScope(prevActScopeDepth); + if (actScopeDepth === 0) { + var _queue = ReactCurrentActQueue.current; + if (_queue !== null) { + flushActQueue(_queue); + ReactCurrentActQueue.current = null; + } + var _thenable = { + then: function(resolve2, reject) { + if (ReactCurrentActQueue.current === null) { + ReactCurrentActQueue.current = []; + recursivelyFlushAsyncActWork(returnValue, resolve2, reject); + } else { + resolve2(returnValue); + } + } + }; + return _thenable; + } else { + var _thenable2 = { + then: function(resolve2, reject) { + resolve2(returnValue); + } + }; + return _thenable2; + } + } + } + } + function popActScope(prevActScopeDepth) { + { + if (prevActScopeDepth !== actScopeDepth - 1) { + error("You seem to have overlapping act() calls, this is not supported. Be sure to await previous act() calls before making a new one. "); + } + actScopeDepth = prevActScopeDepth; + } + } + function recursivelyFlushAsyncActWork(returnValue, resolve2, reject) { + { + var queue = ReactCurrentActQueue.current; + if (queue !== null) { + try { + flushActQueue(queue); + enqueueTask(function() { + if (queue.length === 0) { + ReactCurrentActQueue.current = null; + resolve2(returnValue); + } else { + recursivelyFlushAsyncActWork(returnValue, resolve2, reject); + } + }); + } catch (error2) { + reject(error2); + } + } else { + resolve2(returnValue); + } + } + } + var isFlushing = false; + function flushActQueue(queue) { + { + if (!isFlushing) { + isFlushing = true; + var i = 0; + try { + for (; i < queue.length; i++) { + var callback = queue[i]; + do { + callback = callback(true); + } while (callback !== null); + } + queue.length = 0; + } catch (error2) { + queue = queue.slice(i + 1); + throw error2; + } finally { + isFlushing = false; + } + } + } + } + var createElement$1 = createElementWithValidation; + var cloneElement$1 = cloneElementWithValidation; + var createFactory = createFactoryWithValidation; + var Children = { + map: mapChildren, + forEach: forEachChildren, + count: countChildren, + toArray, + only: onlyChild + }; + exports2.Children = Children; + exports2.Component = Component; + exports2.Fragment = REACT_FRAGMENT_TYPE; + exports2.Profiler = REACT_PROFILER_TYPE; + exports2.PureComponent = PureComponent; + exports2.StrictMode = REACT_STRICT_MODE_TYPE; + exports2.Suspense = REACT_SUSPENSE_TYPE; + exports2.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = ReactSharedInternals; + exports2.cloneElement = cloneElement$1; + exports2.createContext = createContext; + exports2.createElement = createElement$1; + exports2.createFactory = createFactory; + exports2.createRef = createRef; + exports2.forwardRef = forwardRef; + exports2.isValidElement = isValidElement; + exports2.lazy = lazy; + exports2.memo = memo; + exports2.startTransition = startTransition; + exports2.unstable_act = act; + exports2.useCallback = useCallback; + exports2.useContext = useContext; + exports2.useDebugValue = useDebugValue; + exports2.useDeferredValue = useDeferredValue; + exports2.useEffect = useEffect; + exports2.useId = useId; + exports2.useImperativeHandle = useImperativeHandle; + exports2.useInsertionEffect = useInsertionEffect; + exports2.useLayoutEffect = useLayoutEffect; + exports2.useMemo = useMemo; + exports2.useReducer = useReducer; + exports2.useRef = useRef; + exports2.useState = useState; + exports2.useSyncExternalStore = useSyncExternalStore; + exports2.useTransition = useTransition; + exports2.version = ReactVersion; + if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== "undefined" && typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop === "function") { + __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(new Error()); + } + })(); + } + } +}); + +// node_modules/react/index.js +var require_react = __commonJS({ + "node_modules/react/index.js"(exports2, module2) { + "use strict"; + if (false) { + module2.exports = null; + } else { + module2.exports = require_react_development(); + } + } +}); + +// node_modules/scheduler/cjs/scheduler.development.js +var require_scheduler_development = __commonJS({ + "node_modules/scheduler/cjs/scheduler.development.js"(exports2) { + "use strict"; + if (true) { + (function() { + "use strict"; + if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== "undefined" && typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart === "function") { + __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(new Error()); + } + var enableSchedulerDebugging = false; + var enableProfiling = false; + var frameYieldMs = 5; + function push(heap, node) { + var index = heap.length; + heap.push(node); + siftUp(heap, node, index); + } + function peek(heap) { + return heap.length === 0 ? null : heap[0]; + } + function pop(heap) { + if (heap.length === 0) { + return null; + } + var first = heap[0]; + var last = heap.pop(); + if (last !== first) { + heap[0] = last; + siftDown(heap, last, 0); + } + return first; + } + function siftUp(heap, node, i) { + var index = i; + while (index > 0) { + var parentIndex = index - 1 >>> 1; + var parent = heap[parentIndex]; + if (compare2(parent, node) > 0) { + heap[parentIndex] = node; + heap[index] = parent; + index = parentIndex; + } else { + return; + } + } + } + function siftDown(heap, node, i) { + var index = i; + var length2 = heap.length; + var halfLength = length2 >>> 1; + while (index < halfLength) { + var leftIndex = (index + 1) * 2 - 1; + var left = heap[leftIndex]; + var rightIndex = leftIndex + 1; + var right = heap[rightIndex]; + if (compare2(left, node) < 0) { + if (rightIndex < length2 && compare2(right, left) < 0) { + heap[index] = right; + heap[rightIndex] = node; + index = rightIndex; + } else { + heap[index] = left; + heap[leftIndex] = node; + index = leftIndex; + } + } else if (rightIndex < length2 && compare2(right, node) < 0) { + heap[index] = right; + heap[rightIndex] = node; + index = rightIndex; + } else { + return; + } + } + } + function compare2(a, b) { + var diff = a.sortIndex - b.sortIndex; + return diff !== 0 ? diff : a.id - b.id; + } + var ImmediatePriority = 1; + var UserBlockingPriority = 2; + var NormalPriority = 3; + var LowPriority = 4; + var IdlePriority = 5; + function markTaskErrored(task, ms) { + } + var hasPerformanceNow = typeof performance === "object" && typeof performance.now === "function"; + if (hasPerformanceNow) { + var localPerformance = performance; + exports2.unstable_now = function() { + return localPerformance.now(); + }; + } else { + var localDate = Date; + var initialTime = localDate.now(); + exports2.unstable_now = function() { + return localDate.now() - initialTime; + }; + } + var maxSigned31BitInt = 1073741823; + var IMMEDIATE_PRIORITY_TIMEOUT = -1; + var USER_BLOCKING_PRIORITY_TIMEOUT = 250; + var NORMAL_PRIORITY_TIMEOUT = 5e3; + var LOW_PRIORITY_TIMEOUT = 1e4; + var IDLE_PRIORITY_TIMEOUT = maxSigned31BitInt; + var taskQueue = []; + var timerQueue = []; + var taskIdCounter = 1; + var currentTask = null; + var currentPriorityLevel = NormalPriority; + var isPerformingWork = false; + var isHostCallbackScheduled = false; + var isHostTimeoutScheduled = false; + var localSetTimeout = typeof setTimeout === "function" ? setTimeout : null; + var localClearTimeout = typeof clearTimeout === "function" ? clearTimeout : null; + var localSetImmediate = typeof setImmediate !== "undefined" ? setImmediate : null; + var isInputPending = typeof navigator !== "undefined" && navigator.scheduling !== void 0 && navigator.scheduling.isInputPending !== void 0 ? navigator.scheduling.isInputPending.bind(navigator.scheduling) : null; + function advanceTimers(currentTime) { + var timer = peek(timerQueue); + while (timer !== null) { + if (timer.callback === null) { + pop(timerQueue); + } else if (timer.startTime <= currentTime) { + pop(timerQueue); + timer.sortIndex = timer.expirationTime; + push(taskQueue, timer); + } else { + return; + } + timer = peek(timerQueue); + } + } + function handleTimeout(currentTime) { + isHostTimeoutScheduled = false; + advanceTimers(currentTime); + if (!isHostCallbackScheduled) { + if (peek(taskQueue) !== null) { + isHostCallbackScheduled = true; + requestHostCallback(flushWork); + } else { + var firstTimer = peek(timerQueue); + if (firstTimer !== null) { + requestHostTimeout(handleTimeout, firstTimer.startTime - currentTime); + } + } + } + } + function flushWork(hasTimeRemaining, initialTime2) { + isHostCallbackScheduled = false; + if (isHostTimeoutScheduled) { + isHostTimeoutScheduled = false; + cancelHostTimeout(); + } + isPerformingWork = true; + var previousPriorityLevel = currentPriorityLevel; + try { + if (enableProfiling) { + try { + return workLoop(hasTimeRemaining, initialTime2); + } catch (error) { + if (currentTask !== null) { + var currentTime = exports2.unstable_now(); + markTaskErrored(currentTask, currentTime); + currentTask.isQueued = false; + } + throw error; + } + } else { + return workLoop(hasTimeRemaining, initialTime2); + } + } finally { + currentTask = null; + currentPriorityLevel = previousPriorityLevel; + isPerformingWork = false; + } + } + function workLoop(hasTimeRemaining, initialTime2) { + var currentTime = initialTime2; + advanceTimers(currentTime); + currentTask = peek(taskQueue); + while (currentTask !== null && !enableSchedulerDebugging) { + if (currentTask.expirationTime > currentTime && (!hasTimeRemaining || shouldYieldToHost())) { + break; + } + var callback = currentTask.callback; + if (typeof callback === "function") { + currentTask.callback = null; + currentPriorityLevel = currentTask.priorityLevel; + var didUserCallbackTimeout = currentTask.expirationTime <= currentTime; + var continuationCallback = callback(didUserCallbackTimeout); + currentTime = exports2.unstable_now(); + if (typeof continuationCallback === "function") { + currentTask.callback = continuationCallback; + } else { + if (currentTask === peek(taskQueue)) { + pop(taskQueue); + } + } + advanceTimers(currentTime); + } else { + pop(taskQueue); + } + currentTask = peek(taskQueue); + } + if (currentTask !== null) { + return true; + } else { + var firstTimer = peek(timerQueue); + if (firstTimer !== null) { + requestHostTimeout(handleTimeout, firstTimer.startTime - currentTime); + } + return false; + } + } + function unstable_runWithPriority(priorityLevel, eventHandler) { + switch (priorityLevel) { + case ImmediatePriority: + case UserBlockingPriority: + case NormalPriority: + case LowPriority: + case IdlePriority: + break; + default: + priorityLevel = NormalPriority; + } + var previousPriorityLevel = currentPriorityLevel; + currentPriorityLevel = priorityLevel; + try { + return eventHandler(); + } finally { + currentPriorityLevel = previousPriorityLevel; + } + } + function unstable_next(eventHandler) { + var priorityLevel; + switch (currentPriorityLevel) { + case ImmediatePriority: + case UserBlockingPriority: + case NormalPriority: + priorityLevel = NormalPriority; + break; + default: + priorityLevel = currentPriorityLevel; + break; + } + var previousPriorityLevel = currentPriorityLevel; + currentPriorityLevel = priorityLevel; + try { + return eventHandler(); + } finally { + currentPriorityLevel = previousPriorityLevel; + } + } + function unstable_wrapCallback(callback) { + var parentPriorityLevel = currentPriorityLevel; + return function() { + var previousPriorityLevel = currentPriorityLevel; + currentPriorityLevel = parentPriorityLevel; + try { + return callback.apply(this, arguments); + } finally { + currentPriorityLevel = previousPriorityLevel; + } + }; + } + function unstable_scheduleCallback(priorityLevel, callback, options) { + var currentTime = exports2.unstable_now(); + var startTime2; + if (typeof options === "object" && options !== null) { + var delay = options.delay; + if (typeof delay === "number" && delay > 0) { + startTime2 = currentTime + delay; + } else { + startTime2 = currentTime; + } + } else { + startTime2 = currentTime; + } + var timeout; + switch (priorityLevel) { + case ImmediatePriority: + timeout = IMMEDIATE_PRIORITY_TIMEOUT; + break; + case UserBlockingPriority: + timeout = USER_BLOCKING_PRIORITY_TIMEOUT; + break; + case IdlePriority: + timeout = IDLE_PRIORITY_TIMEOUT; + break; + case LowPriority: + timeout = LOW_PRIORITY_TIMEOUT; + break; + case NormalPriority: + default: + timeout = NORMAL_PRIORITY_TIMEOUT; + break; + } + var expirationTime = startTime2 + timeout; + var newTask = { + id: taskIdCounter++, + callback, + priorityLevel, + startTime: startTime2, + expirationTime, + sortIndex: -1 + }; + if (startTime2 > currentTime) { + newTask.sortIndex = startTime2; + push(timerQueue, newTask); + if (peek(taskQueue) === null && newTask === peek(timerQueue)) { + if (isHostTimeoutScheduled) { + cancelHostTimeout(); + } else { + isHostTimeoutScheduled = true; + } + requestHostTimeout(handleTimeout, startTime2 - currentTime); + } + } else { + newTask.sortIndex = expirationTime; + push(taskQueue, newTask); + if (!isHostCallbackScheduled && !isPerformingWork) { + isHostCallbackScheduled = true; + requestHostCallback(flushWork); + } + } + return newTask; + } + function unstable_pauseExecution() { + } + function unstable_continueExecution() { + if (!isHostCallbackScheduled && !isPerformingWork) { + isHostCallbackScheduled = true; + requestHostCallback(flushWork); + } + } + function unstable_getFirstCallbackNode() { + return peek(taskQueue); + } + function unstable_cancelCallback(task) { + task.callback = null; + } + function unstable_getCurrentPriorityLevel() { + return currentPriorityLevel; + } + var isMessageLoopRunning = false; + var scheduledHostCallback = null; + var taskTimeoutID = -1; + var frameInterval = frameYieldMs; + var startTime = -1; + function shouldYieldToHost() { + var timeElapsed = exports2.unstable_now() - startTime; + if (timeElapsed < frameInterval) { + return false; + } + return true; + } + function requestPaint() { + } + function forceFrameRate(fps) { + if (fps < 0 || fps > 125) { + console["error"]("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"); + return; + } + if (fps > 0) { + frameInterval = Math.floor(1e3 / fps); + } else { + frameInterval = frameYieldMs; + } + } + var performWorkUntilDeadline = function() { + if (scheduledHostCallback !== null) { + var currentTime = exports2.unstable_now(); + startTime = currentTime; + var hasTimeRemaining = true; + var hasMoreWork = true; + try { + hasMoreWork = scheduledHostCallback(hasTimeRemaining, currentTime); + } finally { + if (hasMoreWork) { + schedulePerformWorkUntilDeadline(); + } else { + isMessageLoopRunning = false; + scheduledHostCallback = null; + } + } + } else { + isMessageLoopRunning = false; + } + }; + var schedulePerformWorkUntilDeadline; + if (typeof localSetImmediate === "function") { + schedulePerformWorkUntilDeadline = function() { + localSetImmediate(performWorkUntilDeadline); + }; + } else if (typeof MessageChannel !== "undefined") { + var channel = new MessageChannel(); + var port = channel.port2; + channel.port1.onmessage = performWorkUntilDeadline; + schedulePerformWorkUntilDeadline = function() { + port.postMessage(null); + }; + } else { + schedulePerformWorkUntilDeadline = function() { + localSetTimeout(performWorkUntilDeadline, 0); + }; + } + function requestHostCallback(callback) { + scheduledHostCallback = callback; + if (!isMessageLoopRunning) { + isMessageLoopRunning = true; + schedulePerformWorkUntilDeadline(); + } + } + function requestHostTimeout(callback, ms) { + taskTimeoutID = localSetTimeout(function() { + callback(exports2.unstable_now()); + }, ms); + } + function cancelHostTimeout() { + localClearTimeout(taskTimeoutID); + taskTimeoutID = -1; + } + var unstable_requestPaint = requestPaint; + var unstable_Profiling = null; + exports2.unstable_IdlePriority = IdlePriority; + exports2.unstable_ImmediatePriority = ImmediatePriority; + exports2.unstable_LowPriority = LowPriority; + exports2.unstable_NormalPriority = NormalPriority; + exports2.unstable_Profiling = unstable_Profiling; + exports2.unstable_UserBlockingPriority = UserBlockingPriority; + exports2.unstable_cancelCallback = unstable_cancelCallback; + exports2.unstable_continueExecution = unstable_continueExecution; + exports2.unstable_forceFrameRate = forceFrameRate; + exports2.unstable_getCurrentPriorityLevel = unstable_getCurrentPriorityLevel; + exports2.unstable_getFirstCallbackNode = unstable_getFirstCallbackNode; + exports2.unstable_next = unstable_next; + exports2.unstable_pauseExecution = unstable_pauseExecution; + exports2.unstable_requestPaint = unstable_requestPaint; + exports2.unstable_runWithPriority = unstable_runWithPriority; + exports2.unstable_scheduleCallback = unstable_scheduleCallback; + exports2.unstable_shouldYield = shouldYieldToHost; + exports2.unstable_wrapCallback = unstable_wrapCallback; + if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== "undefined" && typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop === "function") { + __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(new Error()); + } + })(); + } + } +}); + +// node_modules/scheduler/index.js +var require_scheduler = __commonJS({ + "node_modules/scheduler/index.js"(exports2, module2) { + "use strict"; + if (false) { + module2.exports = null; + } else { + module2.exports = require_scheduler_development(); + } + } +}); + +// node_modules/react-reconciler/cjs/react-reconciler.development.js +var require_react_reconciler_development = __commonJS({ + "node_modules/react-reconciler/cjs/react-reconciler.development.js"(exports2, module2) { + "use strict"; + if (true) { + module2.exports = function $$$reconciler($$$hostConfig) { + var exports3 = {}; + "use strict"; + var React2 = require_react(); + var Scheduler = require_scheduler(); + var ReactSharedInternals = React2.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED; + var suppressWarning = false; + function setSuppressWarning(newSuppressWarning) { + { + suppressWarning = newSuppressWarning; + } + } + function warn(format) { + { + if (!suppressWarning) { + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + printWarning("warn", format, args); + } + } + } + function error(format) { + { + if (!suppressWarning) { + for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { + args[_key2 - 1] = arguments[_key2]; + } + printWarning("error", format, args); + } + } + } + function printWarning(level, format, args) { + { + var ReactDebugCurrentFrame2 = ReactSharedInternals.ReactDebugCurrentFrame; + var stack = ReactDebugCurrentFrame2.getStackAddendum(); + if (stack !== "") { + format += "%s"; + args = args.concat([stack]); + } + var argsWithFormat = args.map(function(item) { + return String(item); + }); + argsWithFormat.unshift("Warning: " + format); + Function.prototype.apply.call(console[level], console, argsWithFormat); + } + } + var assign = Object.assign; + function get(key) { + return key._reactInternals; + } + function set(key, value) { + key._reactInternals = value; + } + var enableNewReconciler = false; + var enableLazyContextPropagation = false; + var enableLegacyHidden = false; + var enableSuspenseAvoidThisFallback = false; + var warnAboutStringRefs = false; + var enableSchedulingProfiler = true; + var enableProfilerTimer = true; + var enableProfilerCommitHooks = true; + var FunctionComponent = 0; + var ClassComponent = 1; + var IndeterminateComponent = 2; + var HostRoot = 3; + var HostPortal = 4; + var HostComponent = 5; + var HostText = 6; + var Fragment = 7; + var Mode = 8; + var ContextConsumer = 9; + var ContextProvider = 10; + var ForwardRef = 11; + var Profiler = 12; + var SuspenseComponent = 13; + var MemoComponent = 14; + var SimpleMemoComponent = 15; + var LazyComponent = 16; + var IncompleteClassComponent = 17; + var DehydratedFragment = 18; + var SuspenseListComponent = 19; + var ScopeComponent = 21; + var OffscreenComponent = 22; + var LegacyHiddenComponent = 23; + var CacheComponent = 24; + var TracingMarkerComponent = 25; + var REACT_ELEMENT_TYPE = Symbol.for("react.element"); + var REACT_PORTAL_TYPE = Symbol.for("react.portal"); + var REACT_FRAGMENT_TYPE = Symbol.for("react.fragment"); + var REACT_STRICT_MODE_TYPE = Symbol.for("react.strict_mode"); + var REACT_PROFILER_TYPE = Symbol.for("react.profiler"); + var REACT_PROVIDER_TYPE = Symbol.for("react.provider"); + var REACT_CONTEXT_TYPE = Symbol.for("react.context"); + var REACT_FORWARD_REF_TYPE = Symbol.for("react.forward_ref"); + var REACT_SUSPENSE_TYPE = Symbol.for("react.suspense"); + var REACT_SUSPENSE_LIST_TYPE = Symbol.for("react.suspense_list"); + var REACT_MEMO_TYPE = Symbol.for("react.memo"); + var REACT_LAZY_TYPE = Symbol.for("react.lazy"); + var REACT_SCOPE_TYPE = Symbol.for("react.scope"); + var REACT_DEBUG_TRACING_MODE_TYPE = Symbol.for("react.debug_trace_mode"); + var REACT_OFFSCREEN_TYPE = Symbol.for("react.offscreen"); + var REACT_LEGACY_HIDDEN_TYPE = Symbol.for("react.legacy_hidden"); + var REACT_CACHE_TYPE = Symbol.for("react.cache"); + var REACT_TRACING_MARKER_TYPE = Symbol.for("react.tracing_marker"); + var MAYBE_ITERATOR_SYMBOL = Symbol.iterator; + var FAUX_ITERATOR_SYMBOL = "@@iterator"; + function getIteratorFn(maybeIterable) { + if (maybeIterable === null || typeof maybeIterable !== "object") { + return null; + } + var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]; + if (typeof maybeIterator === "function") { + return maybeIterator; + } + return null; + } + function getWrappedName(outerType, innerType, wrapperName) { + var displayName = outerType.displayName; + if (displayName) { + return displayName; + } + var functionName = innerType.displayName || innerType.name || ""; + return functionName !== "" ? wrapperName + "(" + functionName + ")" : wrapperName; + } + function getContextName(type) { + return type.displayName || "Context"; + } + function getComponentNameFromType(type) { + if (type == null) { + return null; + } + { + if (typeof type.tag === "number") { + error("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."); + } + } + if (typeof type === "function") { + return type.displayName || type.name || null; + } + if (typeof type === "string") { + return type; + } + switch (type) { + case REACT_FRAGMENT_TYPE: + return "Fragment"; + case REACT_PORTAL_TYPE: + return "Portal"; + case REACT_PROFILER_TYPE: + return "Profiler"; + case REACT_STRICT_MODE_TYPE: + return "StrictMode"; + case REACT_SUSPENSE_TYPE: + return "Suspense"; + case REACT_SUSPENSE_LIST_TYPE: + return "SuspenseList"; + } + if (typeof type === "object") { + switch (type.$$typeof) { + case REACT_CONTEXT_TYPE: + var context = type; + return getContextName(context) + ".Consumer"; + case REACT_PROVIDER_TYPE: + var provider = type; + return getContextName(provider._context) + ".Provider"; + case REACT_FORWARD_REF_TYPE: + return getWrappedName(type, type.render, "ForwardRef"); + case REACT_MEMO_TYPE: + var outerName = type.displayName || null; + if (outerName !== null) { + return outerName; + } + return getComponentNameFromType(type.type) || "Memo"; + case REACT_LAZY_TYPE: { + var lazyComponent = type; + var payload = lazyComponent._payload; + var init = lazyComponent._init; + try { + return getComponentNameFromType(init(payload)); + } catch (x) { + return null; + } + } + } + } + return null; + } + function getWrappedName$1(outerType, innerType, wrapperName) { + var functionName = innerType.displayName || innerType.name || ""; + return outerType.displayName || (functionName !== "" ? wrapperName + "(" + functionName + ")" : wrapperName); + } + function getContextName$1(type) { + return type.displayName || "Context"; + } + function getComponentNameFromFiber(fiber) { + var tag = fiber.tag, type = fiber.type; + switch (tag) { + case CacheComponent: + return "Cache"; + case ContextConsumer: + var context = type; + return getContextName$1(context) + ".Consumer"; + case ContextProvider: + var provider = type; + return getContextName$1(provider._context) + ".Provider"; + case DehydratedFragment: + return "DehydratedFragment"; + case ForwardRef: + return getWrappedName$1(type, type.render, "ForwardRef"); + case Fragment: + return "Fragment"; + case HostComponent: + return type; + case HostPortal: + return "Portal"; + case HostRoot: + return "Root"; + case HostText: + return "Text"; + case LazyComponent: + return getComponentNameFromType(type); + case Mode: + if (type === REACT_STRICT_MODE_TYPE) { + return "StrictMode"; + } + return "Mode"; + case OffscreenComponent: + return "Offscreen"; + case Profiler: + return "Profiler"; + case ScopeComponent: + return "Scope"; + case SuspenseComponent: + return "Suspense"; + case SuspenseListComponent: + return "SuspenseList"; + case TracingMarkerComponent: + return "TracingMarker"; + case ClassComponent: + case FunctionComponent: + case IncompleteClassComponent: + case IndeterminateComponent: + case MemoComponent: + case SimpleMemoComponent: + if (typeof type === "function") { + return type.displayName || type.name || null; + } + if (typeof type === "string") { + return type; + } + break; + } + return null; + } + var NoFlags = ( + /* */ + 0 + ); + var PerformedWork = ( + /* */ + 1 + ); + var Placement = ( + /* */ + 2 + ); + var Update = ( + /* */ + 4 + ); + var ChildDeletion = ( + /* */ + 16 + ); + var ContentReset = ( + /* */ + 32 + ); + var Callback = ( + /* */ + 64 + ); + var DidCapture = ( + /* */ + 128 + ); + var ForceClientRender = ( + /* */ + 256 + ); + var Ref = ( + /* */ + 512 + ); + var Snapshot = ( + /* */ + 1024 + ); + var Passive = ( + /* */ + 2048 + ); + var Hydrating = ( + /* */ + 4096 + ); + var Visibility = ( + /* */ + 8192 + ); + var StoreConsistency = ( + /* */ + 16384 + ); + var LifecycleEffectMask = Passive | Update | Callback | Ref | Snapshot | StoreConsistency; + var HostEffectMask = ( + /* */ + 32767 + ); + var Incomplete = ( + /* */ + 32768 + ); + var ShouldCapture = ( + /* */ + 65536 + ); + var ForceUpdateForLegacySuspense = ( + /* */ + 131072 + ); + var Forked = ( + /* */ + 1048576 + ); + var RefStatic = ( + /* */ + 2097152 + ); + var LayoutStatic = ( + /* */ + 4194304 + ); + var PassiveStatic = ( + /* */ + 8388608 + ); + var MountLayoutDev = ( + /* */ + 16777216 + ); + var MountPassiveDev = ( + /* */ + 33554432 + ); + var BeforeMutationMask = ( + // TODO: Remove Update flag from before mutation phase by re-landing Visibility + // flag logic (see #20043) + Update | Snapshot | 0 + ); + var MutationMask = Placement | Update | ChildDeletion | ContentReset | Ref | Hydrating | Visibility; + var LayoutMask = Update | Callback | Ref | Visibility; + var PassiveMask = Passive | ChildDeletion; + var StaticMask = LayoutStatic | PassiveStatic | RefStatic; + var ReactCurrentOwner = ReactSharedInternals.ReactCurrentOwner; + function getNearestMountedFiber(fiber) { + var node = fiber; + var nearestMounted = fiber; + if (!fiber.alternate) { + var nextNode = node; + do { + node = nextNode; + if ((node.flags & (Placement | Hydrating)) !== NoFlags) { + nearestMounted = node.return; + } + nextNode = node.return; + } while (nextNode); + } else { + while (node.return) { + node = node.return; + } + } + if (node.tag === HostRoot) { + return nearestMounted; + } + return null; + } + function isFiberMounted(fiber) { + return getNearestMountedFiber(fiber) === fiber; + } + function isMounted(component) { + { + var owner = ReactCurrentOwner.current; + if (owner !== null && owner.tag === ClassComponent) { + var ownerFiber = owner; + var instance = ownerFiber.stateNode; + if (!instance._warnedAboutRefsInRender) { + error("%s is accessing isMounted inside its render() function. render() should be a pure function of props and state. It should never access something that requires stale data from the previous render, such as refs. Move this logic to componentDidMount and componentDidUpdate instead.", getComponentNameFromFiber(ownerFiber) || "A component"); + } + instance._warnedAboutRefsInRender = true; + } + } + var fiber = get(component); + if (!fiber) { + return false; + } + return getNearestMountedFiber(fiber) === fiber; + } + function assertIsMounted(fiber) { + if (getNearestMountedFiber(fiber) !== fiber) { + throw new Error("Unable to find node on an unmounted component."); + } + } + function findCurrentFiberUsingSlowPath(fiber) { + var alternate = fiber.alternate; + if (!alternate) { + var nearestMounted = getNearestMountedFiber(fiber); + if (nearestMounted === null) { + throw new Error("Unable to find node on an unmounted component."); + } + if (nearestMounted !== fiber) { + return null; + } + return fiber; + } + var a = fiber; + var b = alternate; + while (true) { + var parentA = a.return; + if (parentA === null) { + break; + } + var parentB = parentA.alternate; + if (parentB === null) { + var nextParent = parentA.return; + if (nextParent !== null) { + a = b = nextParent; + continue; + } + break; + } + if (parentA.child === parentB.child) { + var child = parentA.child; + while (child) { + if (child === a) { + assertIsMounted(parentA); + return fiber; + } + if (child === b) { + assertIsMounted(parentA); + return alternate; + } + child = child.sibling; + } + throw new Error("Unable to find node on an unmounted component."); + } + if (a.return !== b.return) { + a = parentA; + b = parentB; + } else { + var didFindChild = false; + var _child = parentA.child; + while (_child) { + if (_child === a) { + didFindChild = true; + a = parentA; + b = parentB; + break; + } + if (_child === b) { + didFindChild = true; + b = parentA; + a = parentB; + break; + } + _child = _child.sibling; + } + if (!didFindChild) { + _child = parentB.child; + while (_child) { + if (_child === a) { + didFindChild = true; + a = parentB; + b = parentA; + break; + } + if (_child === b) { + didFindChild = true; + b = parentB; + a = parentA; + break; + } + _child = _child.sibling; + } + if (!didFindChild) { + throw new Error("Child was not found in either parent set. This indicates a bug in React related to the return pointer. Please file an issue."); + } + } + } + if (a.alternate !== b) { + throw new Error("Return fibers should always be each others' alternates. This error is likely caused by a bug in React. Please file an issue."); + } + } + if (a.tag !== HostRoot) { + throw new Error("Unable to find node on an unmounted component."); + } + if (a.stateNode.current === a) { + return fiber; + } + return alternate; + } + function findCurrentHostFiber(parent) { + var currentParent = findCurrentFiberUsingSlowPath(parent); + return currentParent !== null ? findCurrentHostFiberImpl(currentParent) : null; + } + function findCurrentHostFiberImpl(node) { + if (node.tag === HostComponent || node.tag === HostText) { + return node; + } + var child = node.child; + while (child !== null) { + var match = findCurrentHostFiberImpl(child); + if (match !== null) { + return match; + } + child = child.sibling; + } + return null; + } + function findCurrentHostFiberWithNoPortals(parent) { + var currentParent = findCurrentFiberUsingSlowPath(parent); + return currentParent !== null ? findCurrentHostFiberWithNoPortalsImpl(currentParent) : null; + } + function findCurrentHostFiberWithNoPortalsImpl(node) { + if (node.tag === HostComponent || node.tag === HostText) { + return node; + } + var child = node.child; + while (child !== null) { + if (child.tag !== HostPortal) { + var match = findCurrentHostFiberWithNoPortalsImpl(child); + if (match !== null) { + return match; + } + } + child = child.sibling; + } + return null; + } + var isArrayImpl = Array.isArray; + function isArray(a) { + return isArrayImpl(a); + } + var getPublicInstance = $$$hostConfig.getPublicInstance; + var getRootHostContext = $$$hostConfig.getRootHostContext; + var getChildHostContext = $$$hostConfig.getChildHostContext; + var prepareForCommit = $$$hostConfig.prepareForCommit; + var resetAfterCommit = $$$hostConfig.resetAfterCommit; + var createInstance = $$$hostConfig.createInstance; + var appendInitialChild = $$$hostConfig.appendInitialChild; + var finalizeInitialChildren = $$$hostConfig.finalizeInitialChildren; + var prepareUpdate = $$$hostConfig.prepareUpdate; + var shouldSetTextContent = $$$hostConfig.shouldSetTextContent; + var createTextInstance = $$$hostConfig.createTextInstance; + var scheduleTimeout = $$$hostConfig.scheduleTimeout; + var cancelTimeout = $$$hostConfig.cancelTimeout; + var noTimeout = $$$hostConfig.noTimeout; + var isPrimaryRenderer = $$$hostConfig.isPrimaryRenderer; + var warnsIfNotActing = $$$hostConfig.warnsIfNotActing; + var supportsMutation = $$$hostConfig.supportsMutation; + var supportsPersistence = $$$hostConfig.supportsPersistence; + var supportsHydration = $$$hostConfig.supportsHydration; + var getInstanceFromNode = $$$hostConfig.getInstanceFromNode; + var beforeActiveInstanceBlur = $$$hostConfig.beforeActiveInstanceBlur; + var afterActiveInstanceBlur = $$$hostConfig.afterActiveInstanceBlur; + var preparePortalMount = $$$hostConfig.preparePortalMount; + var prepareScopeUpdate = $$$hostConfig.prepareScopeUpdate; + var getInstanceFromScope = $$$hostConfig.getInstanceFromScope; + var getCurrentEventPriority = $$$hostConfig.getCurrentEventPriority; + var detachDeletedInstance = $$$hostConfig.detachDeletedInstance; + var supportsMicrotasks = $$$hostConfig.supportsMicrotasks; + var scheduleMicrotask = $$$hostConfig.scheduleMicrotask; + var supportsTestSelectors = $$$hostConfig.supportsTestSelectors; + var findFiberRoot = $$$hostConfig.findFiberRoot; + var getBoundingRect = $$$hostConfig.getBoundingRect; + var getTextContent = $$$hostConfig.getTextContent; + var isHiddenSubtree = $$$hostConfig.isHiddenSubtree; + var matchAccessibilityRole = $$$hostConfig.matchAccessibilityRole; + var setFocusIfFocusable = $$$hostConfig.setFocusIfFocusable; + var setupIntersectionObserver = $$$hostConfig.setupIntersectionObserver; + var appendChild = $$$hostConfig.appendChild; + var appendChildToContainer = $$$hostConfig.appendChildToContainer; + var commitTextUpdate = $$$hostConfig.commitTextUpdate; + var commitMount = $$$hostConfig.commitMount; + var commitUpdate = $$$hostConfig.commitUpdate; + var insertBefore = $$$hostConfig.insertBefore; + var insertInContainerBefore = $$$hostConfig.insertInContainerBefore; + var removeChild = $$$hostConfig.removeChild; + var removeChildFromContainer = $$$hostConfig.removeChildFromContainer; + var resetTextContent = $$$hostConfig.resetTextContent; + var hideInstance = $$$hostConfig.hideInstance; + var hideTextInstance = $$$hostConfig.hideTextInstance; + var unhideInstance = $$$hostConfig.unhideInstance; + var unhideTextInstance = $$$hostConfig.unhideTextInstance; + var clearContainer = $$$hostConfig.clearContainer; + var cloneInstance = $$$hostConfig.cloneInstance; + var createContainerChildSet = $$$hostConfig.createContainerChildSet; + var appendChildToContainerChildSet = $$$hostConfig.appendChildToContainerChildSet; + var finalizeContainerChildren = $$$hostConfig.finalizeContainerChildren; + var replaceContainerChildren = $$$hostConfig.replaceContainerChildren; + var cloneHiddenInstance = $$$hostConfig.cloneHiddenInstance; + var cloneHiddenTextInstance = $$$hostConfig.cloneHiddenTextInstance; + var canHydrateInstance = $$$hostConfig.canHydrateInstance; + var canHydrateTextInstance = $$$hostConfig.canHydrateTextInstance; + var canHydrateSuspenseInstance = $$$hostConfig.canHydrateSuspenseInstance; + var isSuspenseInstancePending = $$$hostConfig.isSuspenseInstancePending; + var isSuspenseInstanceFallback = $$$hostConfig.isSuspenseInstanceFallback; + var getSuspenseInstanceFallbackErrorDetails = $$$hostConfig.getSuspenseInstanceFallbackErrorDetails; + var registerSuspenseInstanceRetry = $$$hostConfig.registerSuspenseInstanceRetry; + var getNextHydratableSibling = $$$hostConfig.getNextHydratableSibling; + var getFirstHydratableChild = $$$hostConfig.getFirstHydratableChild; + var getFirstHydratableChildWithinContainer = $$$hostConfig.getFirstHydratableChildWithinContainer; + var getFirstHydratableChildWithinSuspenseInstance = $$$hostConfig.getFirstHydratableChildWithinSuspenseInstance; + var hydrateInstance = $$$hostConfig.hydrateInstance; + var hydrateTextInstance = $$$hostConfig.hydrateTextInstance; + var hydrateSuspenseInstance = $$$hostConfig.hydrateSuspenseInstance; + var getNextHydratableInstanceAfterSuspenseInstance = $$$hostConfig.getNextHydratableInstanceAfterSuspenseInstance; + var commitHydratedContainer = $$$hostConfig.commitHydratedContainer; + var commitHydratedSuspenseInstance = $$$hostConfig.commitHydratedSuspenseInstance; + var clearSuspenseBoundary = $$$hostConfig.clearSuspenseBoundary; + var clearSuspenseBoundaryFromContainer = $$$hostConfig.clearSuspenseBoundaryFromContainer; + var shouldDeleteUnhydratedTailInstances = $$$hostConfig.shouldDeleteUnhydratedTailInstances; + var didNotMatchHydratedContainerTextInstance = $$$hostConfig.didNotMatchHydratedContainerTextInstance; + var didNotMatchHydratedTextInstance = $$$hostConfig.didNotMatchHydratedTextInstance; + var didNotHydrateInstanceWithinContainer = $$$hostConfig.didNotHydrateInstanceWithinContainer; + var didNotHydrateInstanceWithinSuspenseInstance = $$$hostConfig.didNotHydrateInstanceWithinSuspenseInstance; + var didNotHydrateInstance = $$$hostConfig.didNotHydrateInstance; + var didNotFindHydratableInstanceWithinContainer = $$$hostConfig.didNotFindHydratableInstanceWithinContainer; + var didNotFindHydratableTextInstanceWithinContainer = $$$hostConfig.didNotFindHydratableTextInstanceWithinContainer; + var didNotFindHydratableSuspenseInstanceWithinContainer = $$$hostConfig.didNotFindHydratableSuspenseInstanceWithinContainer; + var didNotFindHydratableInstanceWithinSuspenseInstance = $$$hostConfig.didNotFindHydratableInstanceWithinSuspenseInstance; + var didNotFindHydratableTextInstanceWithinSuspenseInstance = $$$hostConfig.didNotFindHydratableTextInstanceWithinSuspenseInstance; + var didNotFindHydratableSuspenseInstanceWithinSuspenseInstance = $$$hostConfig.didNotFindHydratableSuspenseInstanceWithinSuspenseInstance; + var didNotFindHydratableInstance = $$$hostConfig.didNotFindHydratableInstance; + var didNotFindHydratableTextInstance = $$$hostConfig.didNotFindHydratableTextInstance; + var didNotFindHydratableSuspenseInstance = $$$hostConfig.didNotFindHydratableSuspenseInstance; + var errorHydratingContainer = $$$hostConfig.errorHydratingContainer; + var disabledDepth = 0; + var prevLog; + var prevInfo; + var prevWarn; + var prevError; + var prevGroup; + var prevGroupCollapsed; + var prevGroupEnd; + function disabledLog() { + } + disabledLog.__reactDisabledLog = true; + function disableLogs() { + { + if (disabledDepth === 0) { + prevLog = console.log; + prevInfo = console.info; + prevWarn = console.warn; + prevError = console.error; + prevGroup = console.group; + prevGroupCollapsed = console.groupCollapsed; + prevGroupEnd = console.groupEnd; + var props = { + configurable: true, + enumerable: true, + value: disabledLog, + writable: true + }; + Object.defineProperties(console, { + info: props, + log: props, + warn: props, + error: props, + group: props, + groupCollapsed: props, + groupEnd: props + }); + } + disabledDepth++; + } + } + function reenableLogs() { + { + disabledDepth--; + if (disabledDepth === 0) { + var props = { + configurable: true, + enumerable: true, + writable: true + }; + Object.defineProperties(console, { + log: assign({}, props, { + value: prevLog + }), + info: assign({}, props, { + value: prevInfo + }), + warn: assign({}, props, { + value: prevWarn + }), + error: assign({}, props, { + value: prevError + }), + group: assign({}, props, { + value: prevGroup + }), + groupCollapsed: assign({}, props, { + value: prevGroupCollapsed + }), + groupEnd: assign({}, props, { + value: prevGroupEnd + }) + }); + } + if (disabledDepth < 0) { + error("disabledDepth fell below zero. This is a bug in React. Please file an issue."); + } + } + } + var ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher; + var prefix; + function describeBuiltInComponentFrame(name, source, ownerFn) { + { + if (prefix === void 0) { + try { + throw Error(); + } catch (x) { + var match = x.stack.trim().match(/\n( *(at )?)/); + prefix = match && match[1] || ""; + } + } + return "\n" + prefix + name; + } + } + var reentry = false; + var componentFrameCache; + { + var PossiblyWeakMap = typeof WeakMap === "function" ? WeakMap : Map; + componentFrameCache = new PossiblyWeakMap(); + } + function describeNativeComponentFrame(fn, construct) { + if (!fn || reentry) { + return ""; + } + { + var frame = componentFrameCache.get(fn); + if (frame !== void 0) { + return frame; + } + } + var control; + reentry = true; + var previousPrepareStackTrace = Error.prepareStackTrace; + Error.prepareStackTrace = void 0; + var previousDispatcher; + { + previousDispatcher = ReactCurrentDispatcher.current; + ReactCurrentDispatcher.current = null; + disableLogs(); + } + try { + if (construct) { + var Fake = function() { + throw Error(); + }; + Object.defineProperty(Fake.prototype, "props", { + set: function() { + throw Error(); + } + }); + if (typeof Reflect === "object" && Reflect.construct) { + try { + Reflect.construct(Fake, []); + } catch (x) { + control = x; + } + Reflect.construct(fn, [], Fake); + } else { + try { + Fake.call(); + } catch (x) { + control = x; + } + fn.call(Fake.prototype); + } + } else { + try { + throw Error(); + } catch (x) { + control = x; + } + fn(); + } + } catch (sample) { + if (sample && control && typeof sample.stack === "string") { + var sampleLines = sample.stack.split("\n"); + var controlLines = control.stack.split("\n"); + var s = sampleLines.length - 1; + var c = controlLines.length - 1; + while (s >= 1 && c >= 0 && sampleLines[s] !== controlLines[c]) { + c--; + } + for (; s >= 1 && c >= 0; s--, c--) { + if (sampleLines[s] !== controlLines[c]) { + if (s !== 1 || c !== 1) { + do { + s--; + c--; + if (c < 0 || sampleLines[s] !== controlLines[c]) { + var _frame = "\n" + sampleLines[s].replace(" at new ", " at "); + if (fn.displayName && _frame.includes("")) { + _frame = _frame.replace("", fn.displayName); + } + { + if (typeof fn === "function") { + componentFrameCache.set(fn, _frame); + } + } + return _frame; + } + } while (s >= 1 && c >= 0); + } + break; + } + } + } + } finally { + reentry = false; + { + ReactCurrentDispatcher.current = previousDispatcher; + reenableLogs(); + } + Error.prepareStackTrace = previousPrepareStackTrace; + } + var name = fn ? fn.displayName || fn.name : ""; + var syntheticFrame = name ? describeBuiltInComponentFrame(name) : ""; + { + if (typeof fn === "function") { + componentFrameCache.set(fn, syntheticFrame); + } + } + return syntheticFrame; + } + function describeClassComponentFrame(ctor, source, ownerFn) { + { + return describeNativeComponentFrame(ctor, true); + } + } + function describeFunctionComponentFrame(fn, source, ownerFn) { + { + return describeNativeComponentFrame(fn, false); + } + } + function shouldConstruct(Component) { + var prototype = Component.prototype; + return !!(prototype && prototype.isReactComponent); + } + function describeUnknownElementTypeFrameInDEV(type, source, ownerFn) { + if (type == null) { + return ""; + } + if (typeof type === "function") { + { + return describeNativeComponentFrame(type, shouldConstruct(type)); + } + } + if (typeof type === "string") { + return describeBuiltInComponentFrame(type); + } + switch (type) { + case REACT_SUSPENSE_TYPE: + return describeBuiltInComponentFrame("Suspense"); + case REACT_SUSPENSE_LIST_TYPE: + return describeBuiltInComponentFrame("SuspenseList"); + } + if (typeof type === "object") { + switch (type.$$typeof) { + case REACT_FORWARD_REF_TYPE: + return describeFunctionComponentFrame(type.render); + case REACT_MEMO_TYPE: + return describeUnknownElementTypeFrameInDEV(type.type, source, ownerFn); + case REACT_LAZY_TYPE: { + var lazyComponent = type; + var payload = lazyComponent._payload; + var init = lazyComponent._init; + try { + return describeUnknownElementTypeFrameInDEV(init(payload), source, ownerFn); + } catch (x) { + } + } + } + } + return ""; + } + var hasOwnProperty = Object.prototype.hasOwnProperty; + var loggedTypeFailures = {}; + var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame; + function setCurrentlyValidatingElement(element) { + { + if (element) { + var owner = element._owner; + var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null); + ReactDebugCurrentFrame.setExtraStackFrame(stack); + } else { + ReactDebugCurrentFrame.setExtraStackFrame(null); + } + } + } + function checkPropTypes(typeSpecs, values, location, componentName, element) { + { + var has = Function.call.bind(hasOwnProperty); + for (var typeSpecName in typeSpecs) { + if (has(typeSpecs, typeSpecName)) { + var error$1 = void 0; + try { + if (typeof typeSpecs[typeSpecName] !== "function") { + var err = Error((componentName || "React class") + ": " + location + " type `" + typeSpecName + "` is invalid; it must be a function, usually from the `prop-types` package, but received `" + typeof typeSpecs[typeSpecName] + "`.This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`."); + err.name = "Invariant Violation"; + throw err; + } + error$1 = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, "SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"); + } catch (ex) { + error$1 = ex; + } + if (error$1 && !(error$1 instanceof Error)) { + setCurrentlyValidatingElement(element); + error("%s: type specification of %s `%s` is invalid; the type checker function must return `null` or an `Error` but returned a %s. You may have forgotten to pass an argument to the type checker creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and shape all require an argument).", componentName || "React class", location, typeSpecName, typeof error$1); + setCurrentlyValidatingElement(null); + } + if (error$1 instanceof Error && !(error$1.message in loggedTypeFailures)) { + loggedTypeFailures[error$1.message] = true; + setCurrentlyValidatingElement(element); + error("Failed %s type: %s", location, error$1.message); + setCurrentlyValidatingElement(null); + } + } + } + } + } + var valueStack = []; + var fiberStack; + { + fiberStack = []; + } + var index = -1; + function createCursor(defaultValue) { + return { + current: defaultValue + }; + } + function pop(cursor, fiber) { + if (index < 0) { + { + error("Unexpected pop."); + } + return; + } + { + if (fiber !== fiberStack[index]) { + error("Unexpected Fiber popped."); + } + } + cursor.current = valueStack[index]; + valueStack[index] = null; + { + fiberStack[index] = null; + } + index--; + } + function push(cursor, value, fiber) { + index++; + valueStack[index] = cursor.current; + { + fiberStack[index] = fiber; + } + cursor.current = value; + } + var warnedAboutMissingGetChildContext; + { + warnedAboutMissingGetChildContext = {}; + } + var emptyContextObject = {}; + { + Object.freeze(emptyContextObject); + } + var contextStackCursor = createCursor(emptyContextObject); + var didPerformWorkStackCursor = createCursor(false); + var previousContext = emptyContextObject; + function getUnmaskedContext(workInProgress2, Component, didPushOwnContextIfProvider) { + { + if (didPushOwnContextIfProvider && isContextProvider(Component)) { + return previousContext; + } + return contextStackCursor.current; + } + } + function cacheContext(workInProgress2, unmaskedContext, maskedContext) { + { + var instance = workInProgress2.stateNode; + instance.__reactInternalMemoizedUnmaskedChildContext = unmaskedContext; + instance.__reactInternalMemoizedMaskedChildContext = maskedContext; + } + } + function getMaskedContext(workInProgress2, unmaskedContext) { + { + var type = workInProgress2.type; + var contextTypes = type.contextTypes; + if (!contextTypes) { + return emptyContextObject; + } + var instance = workInProgress2.stateNode; + if (instance && instance.__reactInternalMemoizedUnmaskedChildContext === unmaskedContext) { + return instance.__reactInternalMemoizedMaskedChildContext; + } + var context = {}; + for (var key in contextTypes) { + context[key] = unmaskedContext[key]; + } + { + var name = getComponentNameFromFiber(workInProgress2) || "Unknown"; + checkPropTypes(contextTypes, context, "context", name); + } + if (instance) { + cacheContext(workInProgress2, unmaskedContext, context); + } + return context; + } + } + function hasContextChanged() { + { + return didPerformWorkStackCursor.current; + } + } + function isContextProvider(type) { + { + var childContextTypes = type.childContextTypes; + return childContextTypes !== null && childContextTypes !== void 0; + } + } + function popContext(fiber) { + { + pop(didPerformWorkStackCursor, fiber); + pop(contextStackCursor, fiber); + } + } + function popTopLevelContextObject(fiber) { + { + pop(didPerformWorkStackCursor, fiber); + pop(contextStackCursor, fiber); + } + } + function pushTopLevelContextObject(fiber, context, didChange) { + { + if (contextStackCursor.current !== emptyContextObject) { + throw new Error("Unexpected context found on stack. This error is likely caused by a bug in React. Please file an issue."); + } + push(contextStackCursor, context, fiber); + push(didPerformWorkStackCursor, didChange, fiber); + } + } + function processChildContext(fiber, type, parentContext) { + { + var instance = fiber.stateNode; + var childContextTypes = type.childContextTypes; + if (typeof instance.getChildContext !== "function") { + { + var componentName = getComponentNameFromFiber(fiber) || "Unknown"; + if (!warnedAboutMissingGetChildContext[componentName]) { + warnedAboutMissingGetChildContext[componentName] = true; + error("%s.childContextTypes is specified but there is no getChildContext() method on the instance. You can either define getChildContext() on %s or remove childContextTypes from it.", componentName, componentName); + } + } + return parentContext; + } + var childContext = instance.getChildContext(); + for (var contextKey in childContext) { + if (!(contextKey in childContextTypes)) { + throw new Error((getComponentNameFromFiber(fiber) || "Unknown") + '.getChildContext(): key "' + contextKey + '" is not defined in childContextTypes.'); + } + } + { + var name = getComponentNameFromFiber(fiber) || "Unknown"; + checkPropTypes(childContextTypes, childContext, "child context", name); + } + return assign({}, parentContext, childContext); + } + } + function pushContextProvider(workInProgress2) { + { + var instance = workInProgress2.stateNode; + var memoizedMergedChildContext = instance && instance.__reactInternalMemoizedMergedChildContext || emptyContextObject; + previousContext = contextStackCursor.current; + push(contextStackCursor, memoizedMergedChildContext, workInProgress2); + push(didPerformWorkStackCursor, didPerformWorkStackCursor.current, workInProgress2); + return true; + } + } + function invalidateContextProvider(workInProgress2, type, didChange) { + { + var instance = workInProgress2.stateNode; + if (!instance) { + throw new Error("Expected to have an instance by this point. This error is likely caused by a bug in React. Please file an issue."); + } + if (didChange) { + var mergedContext = processChildContext(workInProgress2, type, previousContext); + instance.__reactInternalMemoizedMergedChildContext = mergedContext; + pop(didPerformWorkStackCursor, workInProgress2); + pop(contextStackCursor, workInProgress2); + push(contextStackCursor, mergedContext, workInProgress2); + push(didPerformWorkStackCursor, didChange, workInProgress2); + } else { + pop(didPerformWorkStackCursor, workInProgress2); + push(didPerformWorkStackCursor, didChange, workInProgress2); + } + } + } + function findCurrentUnmaskedContext(fiber) { + { + if (!isFiberMounted(fiber) || fiber.tag !== ClassComponent) { + throw new Error("Expected subtree parent to be a mounted class component. This error is likely caused by a bug in React. Please file an issue."); + } + var node = fiber; + do { + switch (node.tag) { + case HostRoot: + return node.stateNode.context; + case ClassComponent: { + var Component = node.type; + if (isContextProvider(Component)) { + return node.stateNode.__reactInternalMemoizedMergedChildContext; + } + break; + } + } + node = node.return; + } while (node !== null); + throw new Error("Found unexpected detached subtree parent. This error is likely caused by a bug in React. Please file an issue."); + } + } + var LegacyRoot = 0; + var ConcurrentRoot = 1; + var NoMode = ( + /* */ + 0 + ); + var ConcurrentMode = ( + /* */ + 1 + ); + var ProfileMode = ( + /* */ + 2 + ); + var StrictLegacyMode = ( + /* */ + 8 + ); + var StrictEffectsMode = ( + /* */ + 16 + ); + var clz32 = Math.clz32 ? Math.clz32 : clz32Fallback; + var log = Math.log; + var LN2 = Math.LN2; + function clz32Fallback(x) { + var asUint = x >>> 0; + if (asUint === 0) { + return 32; + } + return 31 - (log(asUint) / LN2 | 0) | 0; + } + var TotalLanes = 31; + var NoLanes = ( + /* */ + 0 + ); + var NoLane = ( + /* */ + 0 + ); + var SyncLane = ( + /* */ + 1 + ); + var InputContinuousHydrationLane = ( + /* */ + 2 + ); + var InputContinuousLane = ( + /* */ + 4 + ); + var DefaultHydrationLane = ( + /* */ + 8 + ); + var DefaultLane = ( + /* */ + 16 + ); + var TransitionHydrationLane = ( + /* */ + 32 + ); + var TransitionLanes = ( + /* */ + 4194240 + ); + var TransitionLane1 = ( + /* */ + 64 + ); + var TransitionLane2 = ( + /* */ + 128 + ); + var TransitionLane3 = ( + /* */ + 256 + ); + var TransitionLane4 = ( + /* */ + 512 + ); + var TransitionLane5 = ( + /* */ + 1024 + ); + var TransitionLane6 = ( + /* */ + 2048 + ); + var TransitionLane7 = ( + /* */ + 4096 + ); + var TransitionLane8 = ( + /* */ + 8192 + ); + var TransitionLane9 = ( + /* */ + 16384 + ); + var TransitionLane10 = ( + /* */ + 32768 + ); + var TransitionLane11 = ( + /* */ + 65536 + ); + var TransitionLane12 = ( + /* */ + 131072 + ); + var TransitionLane13 = ( + /* */ + 262144 + ); + var TransitionLane14 = ( + /* */ + 524288 + ); + var TransitionLane15 = ( + /* */ + 1048576 + ); + var TransitionLane16 = ( + /* */ + 2097152 + ); + var RetryLanes = ( + /* */ + 130023424 + ); + var RetryLane1 = ( + /* */ + 4194304 + ); + var RetryLane2 = ( + /* */ + 8388608 + ); + var RetryLane3 = ( + /* */ + 16777216 + ); + var RetryLane4 = ( + /* */ + 33554432 + ); + var RetryLane5 = ( + /* */ + 67108864 + ); + var SomeRetryLane = RetryLane1; + var SelectiveHydrationLane = ( + /* */ + 134217728 + ); + var NonIdleLanes = ( + /* */ + 268435455 + ); + var IdleHydrationLane = ( + /* */ + 268435456 + ); + var IdleLane = ( + /* */ + 536870912 + ); + var OffscreenLane = ( + /* */ + 1073741824 + ); + function getLabelForLane(lane) { + { + if (lane & SyncLane) { + return "Sync"; + } + if (lane & InputContinuousHydrationLane) { + return "InputContinuousHydration"; + } + if (lane & InputContinuousLane) { + return "InputContinuous"; + } + if (lane & DefaultHydrationLane) { + return "DefaultHydration"; + } + if (lane & DefaultLane) { + return "Default"; + } + if (lane & TransitionHydrationLane) { + return "TransitionHydration"; + } + if (lane & TransitionLanes) { + return "Transition"; + } + if (lane & RetryLanes) { + return "Retry"; + } + if (lane & SelectiveHydrationLane) { + return "SelectiveHydration"; + } + if (lane & IdleHydrationLane) { + return "IdleHydration"; + } + if (lane & IdleLane) { + return "Idle"; + } + if (lane & OffscreenLane) { + return "Offscreen"; + } + } + } + var NoTimestamp = -1; + var nextTransitionLane = TransitionLane1; + var nextRetryLane = RetryLane1; + function getHighestPriorityLanes(lanes) { + switch (getHighestPriorityLane(lanes)) { + case SyncLane: + return SyncLane; + case InputContinuousHydrationLane: + return InputContinuousHydrationLane; + case InputContinuousLane: + return InputContinuousLane; + case DefaultHydrationLane: + return DefaultHydrationLane; + case DefaultLane: + return DefaultLane; + case TransitionHydrationLane: + return TransitionHydrationLane; + case TransitionLane1: + case TransitionLane2: + case TransitionLane3: + case TransitionLane4: + case TransitionLane5: + case TransitionLane6: + case TransitionLane7: + case TransitionLane8: + case TransitionLane9: + case TransitionLane10: + case TransitionLane11: + case TransitionLane12: + case TransitionLane13: + case TransitionLane14: + case TransitionLane15: + case TransitionLane16: + return lanes & TransitionLanes; + case RetryLane1: + case RetryLane2: + case RetryLane3: + case RetryLane4: + case RetryLane5: + return lanes & RetryLanes; + case SelectiveHydrationLane: + return SelectiveHydrationLane; + case IdleHydrationLane: + return IdleHydrationLane; + case IdleLane: + return IdleLane; + case OffscreenLane: + return OffscreenLane; + default: + { + error("Should have found matching lanes. This is a bug in React."); + } + return lanes; + } + } + function getNextLanes(root, wipLanes) { + var pendingLanes = root.pendingLanes; + if (pendingLanes === NoLanes) { + return NoLanes; + } + var nextLanes = NoLanes; + var suspendedLanes = root.suspendedLanes; + var pingedLanes = root.pingedLanes; + var nonIdlePendingLanes = pendingLanes & NonIdleLanes; + if (nonIdlePendingLanes !== NoLanes) { + var nonIdleUnblockedLanes = nonIdlePendingLanes & ~suspendedLanes; + if (nonIdleUnblockedLanes !== NoLanes) { + nextLanes = getHighestPriorityLanes(nonIdleUnblockedLanes); + } else { + var nonIdlePingedLanes = nonIdlePendingLanes & pingedLanes; + if (nonIdlePingedLanes !== NoLanes) { + nextLanes = getHighestPriorityLanes(nonIdlePingedLanes); + } + } + } else { + var unblockedLanes = pendingLanes & ~suspendedLanes; + if (unblockedLanes !== NoLanes) { + nextLanes = getHighestPriorityLanes(unblockedLanes); + } else { + if (pingedLanes !== NoLanes) { + nextLanes = getHighestPriorityLanes(pingedLanes); + } + } + } + if (nextLanes === NoLanes) { + return NoLanes; + } + if (wipLanes !== NoLanes && wipLanes !== nextLanes && // If we already suspended with a delay, then interrupting is fine. Don't + // bother waiting until the root is complete. + (wipLanes & suspendedLanes) === NoLanes) { + var nextLane = getHighestPriorityLane(nextLanes); + var wipLane = getHighestPriorityLane(wipLanes); + if ( + // Tests whether the next lane is equal or lower priority than the wip + // one. This works because the bits decrease in priority as you go left. + nextLane >= wipLane || // Default priority updates should not interrupt transition updates. The + // only difference between default updates and transition updates is that + // default updates do not support refresh transitions. + nextLane === DefaultLane && (wipLane & TransitionLanes) !== NoLanes + ) { + return wipLanes; + } + } + if ((nextLanes & InputContinuousLane) !== NoLanes) { + nextLanes |= pendingLanes & DefaultLane; + } + var entangledLanes = root.entangledLanes; + if (entangledLanes !== NoLanes) { + var entanglements = root.entanglements; + var lanes = nextLanes & entangledLanes; + while (lanes > 0) { + var index2 = pickArbitraryLaneIndex(lanes); + var lane = 1 << index2; + nextLanes |= entanglements[index2]; + lanes &= ~lane; + } + } + return nextLanes; + } + function getMostRecentEventTime(root, lanes) { + var eventTimes = root.eventTimes; + var mostRecentEventTime = NoTimestamp; + while (lanes > 0) { + var index2 = pickArbitraryLaneIndex(lanes); + var lane = 1 << index2; + var eventTime = eventTimes[index2]; + if (eventTime > mostRecentEventTime) { + mostRecentEventTime = eventTime; + } + lanes &= ~lane; + } + return mostRecentEventTime; + } + function computeExpirationTime(lane, currentTime) { + switch (lane) { + case SyncLane: + case InputContinuousHydrationLane: + case InputContinuousLane: + return currentTime + 250; + case DefaultHydrationLane: + case DefaultLane: + case TransitionHydrationLane: + case TransitionLane1: + case TransitionLane2: + case TransitionLane3: + case TransitionLane4: + case TransitionLane5: + case TransitionLane6: + case TransitionLane7: + case TransitionLane8: + case TransitionLane9: + case TransitionLane10: + case TransitionLane11: + case TransitionLane12: + case TransitionLane13: + case TransitionLane14: + case TransitionLane15: + case TransitionLane16: + return currentTime + 5e3; + case RetryLane1: + case RetryLane2: + case RetryLane3: + case RetryLane4: + case RetryLane5: + return NoTimestamp; + case SelectiveHydrationLane: + case IdleHydrationLane: + case IdleLane: + case OffscreenLane: + return NoTimestamp; + default: + { + error("Should have found matching lanes. This is a bug in React."); + } + return NoTimestamp; + } + } + function markStarvedLanesAsExpired(root, currentTime) { + var pendingLanes = root.pendingLanes; + var suspendedLanes = root.suspendedLanes; + var pingedLanes = root.pingedLanes; + var expirationTimes = root.expirationTimes; + var lanes = pendingLanes; + while (lanes > 0) { + var index2 = pickArbitraryLaneIndex(lanes); + var lane = 1 << index2; + var expirationTime = expirationTimes[index2]; + if (expirationTime === NoTimestamp) { + if ((lane & suspendedLanes) === NoLanes || (lane & pingedLanes) !== NoLanes) { + expirationTimes[index2] = computeExpirationTime(lane, currentTime); + } + } else if (expirationTime <= currentTime) { + root.expiredLanes |= lane; + } + lanes &= ~lane; + } + } + function getHighestPriorityPendingLanes(root) { + return getHighestPriorityLanes(root.pendingLanes); + } + function getLanesToRetrySynchronouslyOnError(root) { + var everythingButOffscreen = root.pendingLanes & ~OffscreenLane; + if (everythingButOffscreen !== NoLanes) { + return everythingButOffscreen; + } + if (everythingButOffscreen & OffscreenLane) { + return OffscreenLane; + } + return NoLanes; + } + function includesSyncLane(lanes) { + return (lanes & SyncLane) !== NoLanes; + } + function includesNonIdleWork(lanes) { + return (lanes & NonIdleLanes) !== NoLanes; + } + function includesOnlyRetries(lanes) { + return (lanes & RetryLanes) === lanes; + } + function includesOnlyNonUrgentLanes(lanes) { + var UrgentLanes = SyncLane | InputContinuousLane | DefaultLane; + return (lanes & UrgentLanes) === NoLanes; + } + function includesOnlyTransitions(lanes) { + return (lanes & TransitionLanes) === lanes; + } + function includesBlockingLane(root, lanes) { + var SyncDefaultLanes = InputContinuousHydrationLane | InputContinuousLane | DefaultHydrationLane | DefaultLane; + return (lanes & SyncDefaultLanes) !== NoLanes; + } + function includesExpiredLane(root, lanes) { + return (lanes & root.expiredLanes) !== NoLanes; + } + function isTransitionLane(lane) { + return (lane & TransitionLanes) !== NoLanes; + } + function claimNextTransitionLane() { + var lane = nextTransitionLane; + nextTransitionLane <<= 1; + if ((nextTransitionLane & TransitionLanes) === NoLanes) { + nextTransitionLane = TransitionLane1; + } + return lane; + } + function claimNextRetryLane() { + var lane = nextRetryLane; + nextRetryLane <<= 1; + if ((nextRetryLane & RetryLanes) === NoLanes) { + nextRetryLane = RetryLane1; + } + return lane; + } + function getHighestPriorityLane(lanes) { + return lanes & -lanes; + } + function pickArbitraryLane(lanes) { + return getHighestPriorityLane(lanes); + } + function pickArbitraryLaneIndex(lanes) { + return 31 - clz32(lanes); + } + function laneToIndex(lane) { + return pickArbitraryLaneIndex(lane); + } + function includesSomeLane(a, b) { + return (a & b) !== NoLanes; + } + function isSubsetOfLanes(set2, subset) { + return (set2 & subset) === subset; + } + function mergeLanes(a, b) { + return a | b; + } + function removeLanes(set2, subset) { + return set2 & ~subset; + } + function intersectLanes(a, b) { + return a & b; + } + function laneToLanes(lane) { + return lane; + } + function higherPriorityLane(a, b) { + return a !== NoLane && a < b ? a : b; + } + function createLaneMap(initial) { + var laneMap = []; + for (var i = 0; i < TotalLanes; i++) { + laneMap.push(initial); + } + return laneMap; + } + function markRootUpdated(root, updateLane, eventTime) { + root.pendingLanes |= updateLane; + if (updateLane !== IdleLane) { + root.suspendedLanes = NoLanes; + root.pingedLanes = NoLanes; + } + var eventTimes = root.eventTimes; + var index2 = laneToIndex(updateLane); + eventTimes[index2] = eventTime; + } + function markRootSuspended(root, suspendedLanes) { + root.suspendedLanes |= suspendedLanes; + root.pingedLanes &= ~suspendedLanes; + var expirationTimes = root.expirationTimes; + var lanes = suspendedLanes; + while (lanes > 0) { + var index2 = pickArbitraryLaneIndex(lanes); + var lane = 1 << index2; + expirationTimes[index2] = NoTimestamp; + lanes &= ~lane; + } + } + function markRootPinged(root, pingedLanes, eventTime) { + root.pingedLanes |= root.suspendedLanes & pingedLanes; + } + function markRootFinished(root, remainingLanes) { + var noLongerPendingLanes = root.pendingLanes & ~remainingLanes; + root.pendingLanes = remainingLanes; + root.suspendedLanes = NoLanes; + root.pingedLanes = NoLanes; + root.expiredLanes &= remainingLanes; + root.mutableReadLanes &= remainingLanes; + root.entangledLanes &= remainingLanes; + var entanglements = root.entanglements; + var eventTimes = root.eventTimes; + var expirationTimes = root.expirationTimes; + var lanes = noLongerPendingLanes; + while (lanes > 0) { + var index2 = pickArbitraryLaneIndex(lanes); + var lane = 1 << index2; + entanglements[index2] = NoLanes; + eventTimes[index2] = NoTimestamp; + expirationTimes[index2] = NoTimestamp; + lanes &= ~lane; + } + } + function markRootEntangled(root, entangledLanes) { + var rootEntangledLanes = root.entangledLanes |= entangledLanes; + var entanglements = root.entanglements; + var lanes = rootEntangledLanes; + while (lanes) { + var index2 = pickArbitraryLaneIndex(lanes); + var lane = 1 << index2; + if ( + // Is this one of the newly entangled lanes? + lane & entangledLanes | // Is this lane transitively entangled with the newly entangled lanes? + entanglements[index2] & entangledLanes + ) { + entanglements[index2] |= entangledLanes; + } + lanes &= ~lane; + } + } + function getBumpedLaneForHydration(root, renderLanes2) { + var renderLane = getHighestPriorityLane(renderLanes2); + var lane; + switch (renderLane) { + case InputContinuousLane: + lane = InputContinuousHydrationLane; + break; + case DefaultLane: + lane = DefaultHydrationLane; + break; + case TransitionLane1: + case TransitionLane2: + case TransitionLane3: + case TransitionLane4: + case TransitionLane5: + case TransitionLane6: + case TransitionLane7: + case TransitionLane8: + case TransitionLane9: + case TransitionLane10: + case TransitionLane11: + case TransitionLane12: + case TransitionLane13: + case TransitionLane14: + case TransitionLane15: + case TransitionLane16: + case RetryLane1: + case RetryLane2: + case RetryLane3: + case RetryLane4: + case RetryLane5: + lane = TransitionHydrationLane; + break; + case IdleLane: + lane = IdleHydrationLane; + break; + default: + lane = NoLane; + break; + } + if ((lane & (root.suspendedLanes | renderLanes2)) !== NoLane) { + return NoLane; + } + return lane; + } + function addFiberToLanesMap(root, fiber, lanes) { + if (!isDevToolsPresent) { + return; + } + var pendingUpdatersLaneMap = root.pendingUpdatersLaneMap; + while (lanes > 0) { + var index2 = laneToIndex(lanes); + var lane = 1 << index2; + var updaters = pendingUpdatersLaneMap[index2]; + updaters.add(fiber); + lanes &= ~lane; + } + } + function movePendingFibersToMemoized(root, lanes) { + if (!isDevToolsPresent) { + return; + } + var pendingUpdatersLaneMap = root.pendingUpdatersLaneMap; + var memoizedUpdaters = root.memoizedUpdaters; + while (lanes > 0) { + var index2 = laneToIndex(lanes); + var lane = 1 << index2; + var updaters = pendingUpdatersLaneMap[index2]; + if (updaters.size > 0) { + updaters.forEach(function(fiber) { + var alternate = fiber.alternate; + if (alternate === null || !memoizedUpdaters.has(alternate)) { + memoizedUpdaters.add(fiber); + } + }); + updaters.clear(); + } + lanes &= ~lane; + } + } + function getTransitionsForLanes(root, lanes) { + { + return null; + } + } + var DiscreteEventPriority = SyncLane; + var ContinuousEventPriority = InputContinuousLane; + var DefaultEventPriority = DefaultLane; + var IdleEventPriority = IdleLane; + var currentUpdatePriority = NoLane; + function getCurrentUpdatePriority() { + return currentUpdatePriority; + } + function setCurrentUpdatePriority(newPriority) { + currentUpdatePriority = newPriority; + } + function runWithPriority(priority2, fn) { + var previousPriority = currentUpdatePriority; + try { + currentUpdatePriority = priority2; + return fn(); + } finally { + currentUpdatePriority = previousPriority; + } + } + function higherEventPriority(a, b) { + return a !== 0 && a < b ? a : b; + } + function lowerEventPriority(a, b) { + return a === 0 || a > b ? a : b; + } + function isHigherEventPriority(a, b) { + return a !== 0 && a < b; + } + function lanesToEventPriority(lanes) { + var lane = getHighestPriorityLane(lanes); + if (!isHigherEventPriority(DiscreteEventPriority, lane)) { + return DiscreteEventPriority; + } + if (!isHigherEventPriority(ContinuousEventPriority, lane)) { + return ContinuousEventPriority; + } + if (includesNonIdleWork(lane)) { + return DefaultEventPriority; + } + return IdleEventPriority; + } + var scheduleCallback = Scheduler.unstable_scheduleCallback; + var cancelCallback = Scheduler.unstable_cancelCallback; + var shouldYield = Scheduler.unstable_shouldYield; + var requestPaint = Scheduler.unstable_requestPaint; + var now = Scheduler.unstable_now; + var ImmediatePriority = Scheduler.unstable_ImmediatePriority; + var UserBlockingPriority = Scheduler.unstable_UserBlockingPriority; + var NormalPriority = Scheduler.unstable_NormalPriority; + var IdlePriority = Scheduler.unstable_IdlePriority; + var unstable_yieldValue = Scheduler.unstable_yieldValue; + var unstable_setDisableYieldValue = Scheduler.unstable_setDisableYieldValue; + var rendererID = null; + var injectedHook = null; + var injectedProfilingHooks = null; + var hasLoggedError = false; + var isDevToolsPresent = typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== "undefined"; + function injectInternals(internals) { + if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === "undefined") { + return false; + } + var hook = __REACT_DEVTOOLS_GLOBAL_HOOK__; + if (hook.isDisabled) { + return true; + } + if (!hook.supportsFiber) { + { + error("The installed version of React DevTools is too old and will not work with the current version of React. Please update React DevTools. https://reactjs.org/link/react-devtools"); + } + return true; + } + try { + if (enableSchedulingProfiler) { + internals = assign({}, internals, { + getLaneLabelMap, + injectProfilingHooks + }); + } + rendererID = hook.inject(internals); + injectedHook = hook; + } catch (err) { + { + error("React instrumentation encountered an error: %s.", err); + } + } + if (hook.checkDCE) { + return true; + } else { + return false; + } + } + function onScheduleRoot(root, children) { + { + if (injectedHook && typeof injectedHook.onScheduleFiberRoot === "function") { + try { + injectedHook.onScheduleFiberRoot(rendererID, root, children); + } catch (err) { + if (!hasLoggedError) { + hasLoggedError = true; + error("React instrumentation encountered an error: %s", err); + } + } + } + } + } + function onCommitRoot(root, eventPriority) { + if (injectedHook && typeof injectedHook.onCommitFiberRoot === "function") { + try { + var didError = (root.current.flags & DidCapture) === DidCapture; + if (enableProfilerTimer) { + var schedulerPriority; + switch (eventPriority) { + case DiscreteEventPriority: + schedulerPriority = ImmediatePriority; + break; + case ContinuousEventPriority: + schedulerPriority = UserBlockingPriority; + break; + case DefaultEventPriority: + schedulerPriority = NormalPriority; + break; + case IdleEventPriority: + schedulerPriority = IdlePriority; + break; + default: + schedulerPriority = NormalPriority; + break; + } + injectedHook.onCommitFiberRoot(rendererID, root, schedulerPriority, didError); + } else { + injectedHook.onCommitFiberRoot(rendererID, root, void 0, didError); + } + } catch (err) { + { + if (!hasLoggedError) { + hasLoggedError = true; + error("React instrumentation encountered an error: %s", err); + } + } + } + } + } + function onPostCommitRoot(root) { + if (injectedHook && typeof injectedHook.onPostCommitFiberRoot === "function") { + try { + injectedHook.onPostCommitFiberRoot(rendererID, root); + } catch (err) { + { + if (!hasLoggedError) { + hasLoggedError = true; + error("React instrumentation encountered an error: %s", err); + } + } + } + } + } + function onCommitUnmount(fiber) { + if (injectedHook && typeof injectedHook.onCommitFiberUnmount === "function") { + try { + injectedHook.onCommitFiberUnmount(rendererID, fiber); + } catch (err) { + { + if (!hasLoggedError) { + hasLoggedError = true; + error("React instrumentation encountered an error: %s", err); + } + } + } + } + } + function setIsStrictModeForDevtools(newIsStrictMode) { + { + if (typeof unstable_yieldValue === "function") { + unstable_setDisableYieldValue(newIsStrictMode); + setSuppressWarning(newIsStrictMode); + } + if (injectedHook && typeof injectedHook.setStrictMode === "function") { + try { + injectedHook.setStrictMode(rendererID, newIsStrictMode); + } catch (err) { + { + if (!hasLoggedError) { + hasLoggedError = true; + error("React instrumentation encountered an error: %s", err); + } + } + } + } + } + } + function injectProfilingHooks(profilingHooks) { + injectedProfilingHooks = profilingHooks; + } + function getLaneLabelMap() { + { + var map = /* @__PURE__ */ new Map(); + var lane = 1; + for (var index2 = 0; index2 < TotalLanes; index2++) { + var label = getLabelForLane(lane); + map.set(lane, label); + lane *= 2; + } + return map; + } + } + function markCommitStarted(lanes) { + { + if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markCommitStarted === "function") { + injectedProfilingHooks.markCommitStarted(lanes); + } + } + } + function markCommitStopped() { + { + if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markCommitStopped === "function") { + injectedProfilingHooks.markCommitStopped(); + } + } + } + function markComponentRenderStarted(fiber) { + { + if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markComponentRenderStarted === "function") { + injectedProfilingHooks.markComponentRenderStarted(fiber); + } + } + } + function markComponentRenderStopped() { + { + if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markComponentRenderStopped === "function") { + injectedProfilingHooks.markComponentRenderStopped(); + } + } + } + function markComponentPassiveEffectMountStarted(fiber) { + { + if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markComponentPassiveEffectMountStarted === "function") { + injectedProfilingHooks.markComponentPassiveEffectMountStarted(fiber); + } + } + } + function markComponentPassiveEffectMountStopped() { + { + if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markComponentPassiveEffectMountStopped === "function") { + injectedProfilingHooks.markComponentPassiveEffectMountStopped(); + } + } + } + function markComponentPassiveEffectUnmountStarted(fiber) { + { + if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markComponentPassiveEffectUnmountStarted === "function") { + injectedProfilingHooks.markComponentPassiveEffectUnmountStarted(fiber); + } + } + } + function markComponentPassiveEffectUnmountStopped() { + { + if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markComponentPassiveEffectUnmountStopped === "function") { + injectedProfilingHooks.markComponentPassiveEffectUnmountStopped(); + } + } + } + function markComponentLayoutEffectMountStarted(fiber) { + { + if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markComponentLayoutEffectMountStarted === "function") { + injectedProfilingHooks.markComponentLayoutEffectMountStarted(fiber); + } + } + } + function markComponentLayoutEffectMountStopped() { + { + if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markComponentLayoutEffectMountStopped === "function") { + injectedProfilingHooks.markComponentLayoutEffectMountStopped(); + } + } + } + function markComponentLayoutEffectUnmountStarted(fiber) { + { + if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markComponentLayoutEffectUnmountStarted === "function") { + injectedProfilingHooks.markComponentLayoutEffectUnmountStarted(fiber); + } + } + } + function markComponentLayoutEffectUnmountStopped() { + { + if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markComponentLayoutEffectUnmountStopped === "function") { + injectedProfilingHooks.markComponentLayoutEffectUnmountStopped(); + } + } + } + function markComponentErrored(fiber, thrownValue, lanes) { + { + if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markComponentErrored === "function") { + injectedProfilingHooks.markComponentErrored(fiber, thrownValue, lanes); + } + } + } + function markComponentSuspended(fiber, wakeable, lanes) { + { + if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markComponentSuspended === "function") { + injectedProfilingHooks.markComponentSuspended(fiber, wakeable, lanes); + } + } + } + function markLayoutEffectsStarted(lanes) { + { + if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markLayoutEffectsStarted === "function") { + injectedProfilingHooks.markLayoutEffectsStarted(lanes); + } + } + } + function markLayoutEffectsStopped() { + { + if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markLayoutEffectsStopped === "function") { + injectedProfilingHooks.markLayoutEffectsStopped(); + } + } + } + function markPassiveEffectsStarted(lanes) { + { + if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markPassiveEffectsStarted === "function") { + injectedProfilingHooks.markPassiveEffectsStarted(lanes); + } + } + } + function markPassiveEffectsStopped() { + { + if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markPassiveEffectsStopped === "function") { + injectedProfilingHooks.markPassiveEffectsStopped(); + } + } + } + function markRenderStarted(lanes) { + { + if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markRenderStarted === "function") { + injectedProfilingHooks.markRenderStarted(lanes); + } + } + } + function markRenderYielded() { + { + if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markRenderYielded === "function") { + injectedProfilingHooks.markRenderYielded(); + } + } + } + function markRenderStopped() { + { + if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markRenderStopped === "function") { + injectedProfilingHooks.markRenderStopped(); + } + } + } + function markRenderScheduled(lane) { + { + if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markRenderScheduled === "function") { + injectedProfilingHooks.markRenderScheduled(lane); + } + } + } + function markForceUpdateScheduled(fiber, lane) { + { + if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markForceUpdateScheduled === "function") { + injectedProfilingHooks.markForceUpdateScheduled(fiber, lane); + } + } + } + function markStateUpdateScheduled(fiber, lane) { + { + if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markStateUpdateScheduled === "function") { + injectedProfilingHooks.markStateUpdateScheduled(fiber, lane); + } + } + } + function is(x, y) { + return x === y && (x !== 0 || 1 / x === 1 / y) || x !== x && y !== y; + } + var objectIs = typeof Object.is === "function" ? Object.is : is; + var syncQueue = null; + var includesLegacySyncCallbacks = false; + var isFlushingSyncQueue = false; + function scheduleSyncCallback(callback) { + if (syncQueue === null) { + syncQueue = [callback]; + } else { + syncQueue.push(callback); + } + } + function scheduleLegacySyncCallback(callback) { + includesLegacySyncCallbacks = true; + scheduleSyncCallback(callback); + } + function flushSyncCallbacksOnlyInLegacyMode() { + if (includesLegacySyncCallbacks) { + flushSyncCallbacks(); + } + } + function flushSyncCallbacks() { + if (!isFlushingSyncQueue && syncQueue !== null) { + isFlushingSyncQueue = true; + var i = 0; + var previousUpdatePriority = getCurrentUpdatePriority(); + try { + var isSync = true; + var queue = syncQueue; + setCurrentUpdatePriority(DiscreteEventPriority); + for (; i < queue.length; i++) { + var callback = queue[i]; + do { + callback = callback(isSync); + } while (callback !== null); + } + syncQueue = null; + includesLegacySyncCallbacks = false; + } catch (error2) { + if (syncQueue !== null) { + syncQueue = syncQueue.slice(i + 1); + } + scheduleCallback(ImmediatePriority, flushSyncCallbacks); + throw error2; + } finally { + setCurrentUpdatePriority(previousUpdatePriority); + isFlushingSyncQueue = false; + } + } + return null; + } + function isRootDehydrated(root) { + var currentState = root.current.memoizedState; + return currentState.isDehydrated; + } + var forkStack = []; + var forkStackIndex = 0; + var treeForkProvider = null; + var treeForkCount = 0; + var idStack = []; + var idStackIndex = 0; + var treeContextProvider = null; + var treeContextId = 1; + var treeContextOverflow = ""; + function isForkedChild(workInProgress2) { + warnIfNotHydrating(); + return (workInProgress2.flags & Forked) !== NoFlags; + } + function getForksAtLevel(workInProgress2) { + warnIfNotHydrating(); + return treeForkCount; + } + function getTreeId() { + var overflow = treeContextOverflow; + var idWithLeadingBit = treeContextId; + var id = idWithLeadingBit & ~getLeadingBit(idWithLeadingBit); + return id.toString(32) + overflow; + } + function pushTreeFork(workInProgress2, totalChildren) { + warnIfNotHydrating(); + forkStack[forkStackIndex++] = treeForkCount; + forkStack[forkStackIndex++] = treeForkProvider; + treeForkProvider = workInProgress2; + treeForkCount = totalChildren; + } + function pushTreeId(workInProgress2, totalChildren, index2) { + warnIfNotHydrating(); + idStack[idStackIndex++] = treeContextId; + idStack[idStackIndex++] = treeContextOverflow; + idStack[idStackIndex++] = treeContextProvider; + treeContextProvider = workInProgress2; + var baseIdWithLeadingBit = treeContextId; + var baseOverflow = treeContextOverflow; + var baseLength = getBitLength(baseIdWithLeadingBit) - 1; + var baseId = baseIdWithLeadingBit & ~(1 << baseLength); + var slot = index2 + 1; + var length2 = getBitLength(totalChildren) + baseLength; + if (length2 > 30) { + var numberOfOverflowBits = baseLength - baseLength % 5; + var newOverflowBits = (1 << numberOfOverflowBits) - 1; + var newOverflow = (baseId & newOverflowBits).toString(32); + var restOfBaseId = baseId >> numberOfOverflowBits; + var restOfBaseLength = baseLength - numberOfOverflowBits; + var restOfLength = getBitLength(totalChildren) + restOfBaseLength; + var restOfNewBits = slot << restOfBaseLength; + var id = restOfNewBits | restOfBaseId; + var overflow = newOverflow + baseOverflow; + treeContextId = 1 << restOfLength | id; + treeContextOverflow = overflow; + } else { + var newBits = slot << baseLength; + var _id = newBits | baseId; + var _overflow = baseOverflow; + treeContextId = 1 << length2 | _id; + treeContextOverflow = _overflow; + } + } + function pushMaterializedTreeId(workInProgress2) { + warnIfNotHydrating(); + var returnFiber = workInProgress2.return; + if (returnFiber !== null) { + var numberOfForks = 1; + var slotIndex = 0; + pushTreeFork(workInProgress2, numberOfForks); + pushTreeId(workInProgress2, numberOfForks, slotIndex); + } + } + function getBitLength(number) { + return 32 - clz32(number); + } + function getLeadingBit(id) { + return 1 << getBitLength(id) - 1; + } + function popTreeContext(workInProgress2) { + while (workInProgress2 === treeForkProvider) { + treeForkProvider = forkStack[--forkStackIndex]; + forkStack[forkStackIndex] = null; + treeForkCount = forkStack[--forkStackIndex]; + forkStack[forkStackIndex] = null; + } + while (workInProgress2 === treeContextProvider) { + treeContextProvider = idStack[--idStackIndex]; + idStack[idStackIndex] = null; + treeContextOverflow = idStack[--idStackIndex]; + idStack[idStackIndex] = null; + treeContextId = idStack[--idStackIndex]; + idStack[idStackIndex] = null; + } + } + function getSuspendedTreeContext() { + warnIfNotHydrating(); + if (treeContextProvider !== null) { + return { + id: treeContextId, + overflow: treeContextOverflow + }; + } else { + return null; + } + } + function restoreSuspendedTreeContext(workInProgress2, suspendedContext) { + warnIfNotHydrating(); + idStack[idStackIndex++] = treeContextId; + idStack[idStackIndex++] = treeContextOverflow; + idStack[idStackIndex++] = treeContextProvider; + treeContextId = suspendedContext.id; + treeContextOverflow = suspendedContext.overflow; + treeContextProvider = workInProgress2; + } + function warnIfNotHydrating() { + { + if (!getIsHydrating()) { + error("Expected to be hydrating. This is a bug in React. Please file an issue."); + } + } + } + var hydrationParentFiber = null; + var nextHydratableInstance = null; + var isHydrating = false; + var didSuspendOrErrorDEV = false; + var hydrationErrors = null; + function warnIfHydrating() { + { + if (isHydrating) { + error("We should not be hydrating here. This is a bug in React. Please file a bug."); + } + } + } + function markDidThrowWhileHydratingDEV() { + { + didSuspendOrErrorDEV = true; + } + } + function didSuspendOrErrorWhileHydratingDEV() { + { + return didSuspendOrErrorDEV; + } + } + function enterHydrationState(fiber) { + if (!supportsHydration) { + return false; + } + var parentInstance = fiber.stateNode.containerInfo; + nextHydratableInstance = getFirstHydratableChildWithinContainer(parentInstance); + hydrationParentFiber = fiber; + isHydrating = true; + hydrationErrors = null; + didSuspendOrErrorDEV = false; + return true; + } + function reenterHydrationStateFromDehydratedSuspenseInstance(fiber, suspenseInstance, treeContext) { + if (!supportsHydration) { + return false; + } + nextHydratableInstance = getFirstHydratableChildWithinSuspenseInstance(suspenseInstance); + hydrationParentFiber = fiber; + isHydrating = true; + hydrationErrors = null; + didSuspendOrErrorDEV = false; + if (treeContext !== null) { + restoreSuspendedTreeContext(fiber, treeContext); + } + return true; + } + function warnUnhydratedInstance(returnFiber, instance) { + { + switch (returnFiber.tag) { + case HostRoot: { + didNotHydrateInstanceWithinContainer(returnFiber.stateNode.containerInfo, instance); + break; + } + case HostComponent: { + var isConcurrentMode = (returnFiber.mode & ConcurrentMode) !== NoMode; + didNotHydrateInstance( + returnFiber.type, + returnFiber.memoizedProps, + returnFiber.stateNode, + instance, + // TODO: Delete this argument when we remove the legacy root API. + isConcurrentMode + ); + break; + } + case SuspenseComponent: { + var suspenseState = returnFiber.memoizedState; + if (suspenseState.dehydrated !== null) + didNotHydrateInstanceWithinSuspenseInstance(suspenseState.dehydrated, instance); + break; + } + } + } + } + function deleteHydratableInstance(returnFiber, instance) { + warnUnhydratedInstance(returnFiber, instance); + var childToDelete = createFiberFromHostInstanceForDeletion(); + childToDelete.stateNode = instance; + childToDelete.return = returnFiber; + var deletions = returnFiber.deletions; + if (deletions === null) { + returnFiber.deletions = [childToDelete]; + returnFiber.flags |= ChildDeletion; + } else { + deletions.push(childToDelete); + } + } + function warnNonhydratedInstance(returnFiber, fiber) { + { + if (didSuspendOrErrorDEV) { + return; + } + switch (returnFiber.tag) { + case HostRoot: { + var parentContainer = returnFiber.stateNode.containerInfo; + switch (fiber.tag) { + case HostComponent: + var type = fiber.type; + var props = fiber.pendingProps; + didNotFindHydratableInstanceWithinContainer(parentContainer, type, props); + break; + case HostText: + var text = fiber.pendingProps; + didNotFindHydratableTextInstanceWithinContainer(parentContainer, text); + break; + case SuspenseComponent: + didNotFindHydratableSuspenseInstanceWithinContainer(parentContainer); + break; + } + break; + } + case HostComponent: { + var parentType = returnFiber.type; + var parentProps = returnFiber.memoizedProps; + var parentInstance = returnFiber.stateNode; + switch (fiber.tag) { + case HostComponent: { + var _type = fiber.type; + var _props = fiber.pendingProps; + var isConcurrentMode = (returnFiber.mode & ConcurrentMode) !== NoMode; + didNotFindHydratableInstance( + parentType, + parentProps, + parentInstance, + _type, + _props, + // TODO: Delete this argument when we remove the legacy root API. + isConcurrentMode + ); + break; + } + case HostText: { + var _text = fiber.pendingProps; + var _isConcurrentMode = (returnFiber.mode & ConcurrentMode) !== NoMode; + didNotFindHydratableTextInstance( + parentType, + parentProps, + parentInstance, + _text, + // TODO: Delete this argument when we remove the legacy root API. + _isConcurrentMode + ); + break; + } + case SuspenseComponent: { + didNotFindHydratableSuspenseInstance(parentType, parentProps, parentInstance); + break; + } + } + break; + } + case SuspenseComponent: { + var suspenseState = returnFiber.memoizedState; + var _parentInstance = suspenseState.dehydrated; + if (_parentInstance !== null) + switch (fiber.tag) { + case HostComponent: + var _type2 = fiber.type; + var _props2 = fiber.pendingProps; + didNotFindHydratableInstanceWithinSuspenseInstance(_parentInstance, _type2, _props2); + break; + case HostText: + var _text2 = fiber.pendingProps; + didNotFindHydratableTextInstanceWithinSuspenseInstance(_parentInstance, _text2); + break; + case SuspenseComponent: + didNotFindHydratableSuspenseInstanceWithinSuspenseInstance(_parentInstance); + break; + } + break; + } + default: + return; + } + } + } + function insertNonHydratedInstance(returnFiber, fiber) { + fiber.flags = fiber.flags & ~Hydrating | Placement; + warnNonhydratedInstance(returnFiber, fiber); + } + function tryHydrate(fiber, nextInstance) { + switch (fiber.tag) { + case HostComponent: { + var type = fiber.type; + var props = fiber.pendingProps; + var instance = canHydrateInstance(nextInstance, type, props); + if (instance !== null) { + fiber.stateNode = instance; + hydrationParentFiber = fiber; + nextHydratableInstance = getFirstHydratableChild(instance); + return true; + } + return false; + } + case HostText: { + var text = fiber.pendingProps; + var textInstance = canHydrateTextInstance(nextInstance, text); + if (textInstance !== null) { + fiber.stateNode = textInstance; + hydrationParentFiber = fiber; + nextHydratableInstance = null; + return true; + } + return false; + } + case SuspenseComponent: { + var suspenseInstance = canHydrateSuspenseInstance(nextInstance); + if (suspenseInstance !== null) { + var suspenseState = { + dehydrated: suspenseInstance, + treeContext: getSuspendedTreeContext(), + retryLane: OffscreenLane + }; + fiber.memoizedState = suspenseState; + var dehydratedFragment = createFiberFromDehydratedFragment(suspenseInstance); + dehydratedFragment.return = fiber; + fiber.child = dehydratedFragment; + hydrationParentFiber = fiber; + nextHydratableInstance = null; + return true; + } + return false; + } + default: + return false; + } + } + function shouldClientRenderOnMismatch(fiber) { + return (fiber.mode & ConcurrentMode) !== NoMode && (fiber.flags & DidCapture) === NoFlags; + } + function throwOnHydrationMismatch(fiber) { + throw new Error("Hydration failed because the initial UI does not match what was rendered on the server."); + } + function tryToClaimNextHydratableInstance(fiber) { + if (!isHydrating) { + return; + } + var nextInstance = nextHydratableInstance; + if (!nextInstance) { + if (shouldClientRenderOnMismatch(fiber)) { + warnNonhydratedInstance(hydrationParentFiber, fiber); + throwOnHydrationMismatch(); + } + insertNonHydratedInstance(hydrationParentFiber, fiber); + isHydrating = false; + hydrationParentFiber = fiber; + return; + } + var firstAttemptedInstance = nextInstance; + if (!tryHydrate(fiber, nextInstance)) { + if (shouldClientRenderOnMismatch(fiber)) { + warnNonhydratedInstance(hydrationParentFiber, fiber); + throwOnHydrationMismatch(); + } + nextInstance = getNextHydratableSibling(firstAttemptedInstance); + var prevHydrationParentFiber = hydrationParentFiber; + if (!nextInstance || !tryHydrate(fiber, nextInstance)) { + insertNonHydratedInstance(hydrationParentFiber, fiber); + isHydrating = false; + hydrationParentFiber = fiber; + return; + } + deleteHydratableInstance(prevHydrationParentFiber, firstAttemptedInstance); + } + } + function prepareToHydrateHostInstance(fiber, rootContainerInstance, hostContext) { + if (!supportsHydration) { + throw new Error("Expected prepareToHydrateHostInstance() to never be called. This error is likely caused by a bug in React. Please file an issue."); + } + var instance = fiber.stateNode; + var shouldWarnIfMismatchDev = !didSuspendOrErrorDEV; + var updatePayload = hydrateInstance(instance, fiber.type, fiber.memoizedProps, rootContainerInstance, hostContext, fiber, shouldWarnIfMismatchDev); + fiber.updateQueue = updatePayload; + if (updatePayload !== null) { + return true; + } + return false; + } + function prepareToHydrateHostTextInstance(fiber) { + if (!supportsHydration) { + throw new Error("Expected prepareToHydrateHostTextInstance() to never be called. This error is likely caused by a bug in React. Please file an issue."); + } + var textInstance = fiber.stateNode; + var textContent = fiber.memoizedProps; + var shouldWarnIfMismatchDev = !didSuspendOrErrorDEV; + var shouldUpdate = hydrateTextInstance(textInstance, textContent, fiber, shouldWarnIfMismatchDev); + if (shouldUpdate) { + var returnFiber = hydrationParentFiber; + if (returnFiber !== null) { + switch (returnFiber.tag) { + case HostRoot: { + var parentContainer = returnFiber.stateNode.containerInfo; + var isConcurrentMode = (returnFiber.mode & ConcurrentMode) !== NoMode; + didNotMatchHydratedContainerTextInstance( + parentContainer, + textInstance, + textContent, + // TODO: Delete this argument when we remove the legacy root API. + isConcurrentMode + ); + break; + } + case HostComponent: { + var parentType = returnFiber.type; + var parentProps = returnFiber.memoizedProps; + var parentInstance = returnFiber.stateNode; + var _isConcurrentMode2 = (returnFiber.mode & ConcurrentMode) !== NoMode; + didNotMatchHydratedTextInstance( + parentType, + parentProps, + parentInstance, + textInstance, + textContent, + // TODO: Delete this argument when we remove the legacy root API. + _isConcurrentMode2 + ); + break; + } + } + } + } + return shouldUpdate; + } + function prepareToHydrateHostSuspenseInstance(fiber) { + if (!supportsHydration) { + throw new Error("Expected prepareToHydrateHostSuspenseInstance() to never be called. This error is likely caused by a bug in React. Please file an issue."); + } + var suspenseState = fiber.memoizedState; + var suspenseInstance = suspenseState !== null ? suspenseState.dehydrated : null; + if (!suspenseInstance) { + throw new Error("Expected to have a hydrated suspense instance. This error is likely caused by a bug in React. Please file an issue."); + } + hydrateSuspenseInstance(suspenseInstance, fiber); + } + function skipPastDehydratedSuspenseInstance(fiber) { + if (!supportsHydration) { + throw new Error("Expected skipPastDehydratedSuspenseInstance() to never be called. This error is likely caused by a bug in React. Please file an issue."); + } + var suspenseState = fiber.memoizedState; + var suspenseInstance = suspenseState !== null ? suspenseState.dehydrated : null; + if (!suspenseInstance) { + throw new Error("Expected to have a hydrated suspense instance. This error is likely caused by a bug in React. Please file an issue."); + } + return getNextHydratableInstanceAfterSuspenseInstance(suspenseInstance); + } + function popToNextHostParent(fiber) { + var parent = fiber.return; + while (parent !== null && parent.tag !== HostComponent && parent.tag !== HostRoot && parent.tag !== SuspenseComponent) { + parent = parent.return; + } + hydrationParentFiber = parent; + } + function popHydrationState(fiber) { + if (!supportsHydration) { + return false; + } + if (fiber !== hydrationParentFiber) { + return false; + } + if (!isHydrating) { + popToNextHostParent(fiber); + isHydrating = true; + return false; + } + if (fiber.tag !== HostRoot && (fiber.tag !== HostComponent || shouldDeleteUnhydratedTailInstances(fiber.type) && !shouldSetTextContent(fiber.type, fiber.memoizedProps))) { + var nextInstance = nextHydratableInstance; + if (nextInstance) { + if (shouldClientRenderOnMismatch(fiber)) { + warnIfUnhydratedTailNodes(fiber); + throwOnHydrationMismatch(); + } else { + while (nextInstance) { + deleteHydratableInstance(fiber, nextInstance); + nextInstance = getNextHydratableSibling(nextInstance); + } + } + } + } + popToNextHostParent(fiber); + if (fiber.tag === SuspenseComponent) { + nextHydratableInstance = skipPastDehydratedSuspenseInstance(fiber); + } else { + nextHydratableInstance = hydrationParentFiber ? getNextHydratableSibling(fiber.stateNode) : null; + } + return true; + } + function hasUnhydratedTailNodes() { + return isHydrating && nextHydratableInstance !== null; + } + function warnIfUnhydratedTailNodes(fiber) { + var nextInstance = nextHydratableInstance; + while (nextInstance) { + warnUnhydratedInstance(fiber, nextInstance); + nextInstance = getNextHydratableSibling(nextInstance); + } + } + function resetHydrationState() { + if (!supportsHydration) { + return; + } + hydrationParentFiber = null; + nextHydratableInstance = null; + isHydrating = false; + didSuspendOrErrorDEV = false; + } + function upgradeHydrationErrorsToRecoverable() { + if (hydrationErrors !== null) { + queueRecoverableErrors(hydrationErrors); + hydrationErrors = null; + } + } + function getIsHydrating() { + return isHydrating; + } + function queueHydrationError(error2) { + if (hydrationErrors === null) { + hydrationErrors = [error2]; + } else { + hydrationErrors.push(error2); + } + } + var ReactCurrentBatchConfig = ReactSharedInternals.ReactCurrentBatchConfig; + var NoTransition = null; + function requestCurrentTransition() { + return ReactCurrentBatchConfig.transition; + } + function shallowEqual(objA, objB) { + if (objectIs(objA, objB)) { + return true; + } + if (typeof objA !== "object" || objA === null || typeof objB !== "object" || objB === null) { + return false; + } + var keysA = Object.keys(objA); + var keysB = Object.keys(objB); + if (keysA.length !== keysB.length) { + return false; + } + for (var i = 0; i < keysA.length; i++) { + var currentKey = keysA[i]; + if (!hasOwnProperty.call(objB, currentKey) || !objectIs(objA[currentKey], objB[currentKey])) { + return false; + } + } + return true; + } + function describeFiber(fiber) { + var owner = fiber._debugOwner ? fiber._debugOwner.type : null; + var source = fiber._debugSource; + switch (fiber.tag) { + case HostComponent: + return describeBuiltInComponentFrame(fiber.type); + case LazyComponent: + return describeBuiltInComponentFrame("Lazy"); + case SuspenseComponent: + return describeBuiltInComponentFrame("Suspense"); + case SuspenseListComponent: + return describeBuiltInComponentFrame("SuspenseList"); + case FunctionComponent: + case IndeterminateComponent: + case SimpleMemoComponent: + return describeFunctionComponentFrame(fiber.type); + case ForwardRef: + return describeFunctionComponentFrame(fiber.type.render); + case ClassComponent: + return describeClassComponentFrame(fiber.type); + default: + return ""; + } + } + function getStackByFiberInDevAndProd(workInProgress2) { + try { + var info = ""; + var node = workInProgress2; + do { + info += describeFiber(node); + node = node.return; + } while (node); + return info; + } catch (x) { + return "\nError generating stack: " + x.message + "\n" + x.stack; + } + } + var ReactDebugCurrentFrame$1 = ReactSharedInternals.ReactDebugCurrentFrame; + var current = null; + var isRendering = false; + function getCurrentFiberOwnerNameInDevOrNull() { + { + if (current === null) { + return null; + } + var owner = current._debugOwner; + if (owner !== null && typeof owner !== "undefined") { + return getComponentNameFromFiber(owner); + } + } + return null; + } + function getCurrentFiberStackInDev() { + { + if (current === null) { + return ""; + } + return getStackByFiberInDevAndProd(current); + } + } + function resetCurrentFiber() { + { + ReactDebugCurrentFrame$1.getCurrentStack = null; + current = null; + isRendering = false; + } + } + function setCurrentFiber(fiber) { + { + ReactDebugCurrentFrame$1.getCurrentStack = fiber === null ? null : getCurrentFiberStackInDev; + current = fiber; + isRendering = false; + } + } + function getCurrentFiber() { + { + return current; + } + } + function setIsRendering(rendering) { + { + isRendering = rendering; + } + } + var ReactStrictModeWarnings = { + recordUnsafeLifecycleWarnings: function(fiber, instance) { + }, + flushPendingUnsafeLifecycleWarnings: function() { + }, + recordLegacyContextWarning: function(fiber, instance) { + }, + flushLegacyContextWarning: function() { + }, + discardPendingWarnings: function() { + } + }; + { + var findStrictRoot = function(fiber) { + var maybeStrictRoot = null; + var node = fiber; + while (node !== null) { + if (node.mode & StrictLegacyMode) { + maybeStrictRoot = node; + } + node = node.return; + } + return maybeStrictRoot; + }; + var setToSortedString = function(set2) { + var array = []; + set2.forEach(function(value) { + array.push(value); + }); + return array.sort().join(", "); + }; + var pendingComponentWillMountWarnings = []; + var pendingUNSAFE_ComponentWillMountWarnings = []; + var pendingComponentWillReceivePropsWarnings = []; + var pendingUNSAFE_ComponentWillReceivePropsWarnings = []; + var pendingComponentWillUpdateWarnings = []; + var pendingUNSAFE_ComponentWillUpdateWarnings = []; + var didWarnAboutUnsafeLifecycles = /* @__PURE__ */ new Set(); + ReactStrictModeWarnings.recordUnsafeLifecycleWarnings = function(fiber, instance) { + if (didWarnAboutUnsafeLifecycles.has(fiber.type)) { + return; + } + if (typeof instance.componentWillMount === "function" && // Don't warn about react-lifecycles-compat polyfilled components. + instance.componentWillMount.__suppressDeprecationWarning !== true) { + pendingComponentWillMountWarnings.push(fiber); + } + if (fiber.mode & StrictLegacyMode && typeof instance.UNSAFE_componentWillMount === "function") { + pendingUNSAFE_ComponentWillMountWarnings.push(fiber); + } + if (typeof instance.componentWillReceiveProps === "function" && instance.componentWillReceiveProps.__suppressDeprecationWarning !== true) { + pendingComponentWillReceivePropsWarnings.push(fiber); + } + if (fiber.mode & StrictLegacyMode && typeof instance.UNSAFE_componentWillReceiveProps === "function") { + pendingUNSAFE_ComponentWillReceivePropsWarnings.push(fiber); + } + if (typeof instance.componentWillUpdate === "function" && instance.componentWillUpdate.__suppressDeprecationWarning !== true) { + pendingComponentWillUpdateWarnings.push(fiber); + } + if (fiber.mode & StrictLegacyMode && typeof instance.UNSAFE_componentWillUpdate === "function") { + pendingUNSAFE_ComponentWillUpdateWarnings.push(fiber); + } + }; + ReactStrictModeWarnings.flushPendingUnsafeLifecycleWarnings = function() { + var componentWillMountUniqueNames = /* @__PURE__ */ new Set(); + if (pendingComponentWillMountWarnings.length > 0) { + pendingComponentWillMountWarnings.forEach(function(fiber) { + componentWillMountUniqueNames.add(getComponentNameFromFiber(fiber) || "Component"); + didWarnAboutUnsafeLifecycles.add(fiber.type); + }); + pendingComponentWillMountWarnings = []; + } + var UNSAFE_componentWillMountUniqueNames = /* @__PURE__ */ new Set(); + if (pendingUNSAFE_ComponentWillMountWarnings.length > 0) { + pendingUNSAFE_ComponentWillMountWarnings.forEach(function(fiber) { + UNSAFE_componentWillMountUniqueNames.add(getComponentNameFromFiber(fiber) || "Component"); + didWarnAboutUnsafeLifecycles.add(fiber.type); + }); + pendingUNSAFE_ComponentWillMountWarnings = []; + } + var componentWillReceivePropsUniqueNames = /* @__PURE__ */ new Set(); + if (pendingComponentWillReceivePropsWarnings.length > 0) { + pendingComponentWillReceivePropsWarnings.forEach(function(fiber) { + componentWillReceivePropsUniqueNames.add(getComponentNameFromFiber(fiber) || "Component"); + didWarnAboutUnsafeLifecycles.add(fiber.type); + }); + pendingComponentWillReceivePropsWarnings = []; + } + var UNSAFE_componentWillReceivePropsUniqueNames = /* @__PURE__ */ new Set(); + if (pendingUNSAFE_ComponentWillReceivePropsWarnings.length > 0) { + pendingUNSAFE_ComponentWillReceivePropsWarnings.forEach(function(fiber) { + UNSAFE_componentWillReceivePropsUniqueNames.add(getComponentNameFromFiber(fiber) || "Component"); + didWarnAboutUnsafeLifecycles.add(fiber.type); + }); + pendingUNSAFE_ComponentWillReceivePropsWarnings = []; + } + var componentWillUpdateUniqueNames = /* @__PURE__ */ new Set(); + if (pendingComponentWillUpdateWarnings.length > 0) { + pendingComponentWillUpdateWarnings.forEach(function(fiber) { + componentWillUpdateUniqueNames.add(getComponentNameFromFiber(fiber) || "Component"); + didWarnAboutUnsafeLifecycles.add(fiber.type); + }); + pendingComponentWillUpdateWarnings = []; + } + var UNSAFE_componentWillUpdateUniqueNames = /* @__PURE__ */ new Set(); + if (pendingUNSAFE_ComponentWillUpdateWarnings.length > 0) { + pendingUNSAFE_ComponentWillUpdateWarnings.forEach(function(fiber) { + UNSAFE_componentWillUpdateUniqueNames.add(getComponentNameFromFiber(fiber) || "Component"); + didWarnAboutUnsafeLifecycles.add(fiber.type); + }); + pendingUNSAFE_ComponentWillUpdateWarnings = []; + } + if (UNSAFE_componentWillMountUniqueNames.size > 0) { + var sortedNames = setToSortedString(UNSAFE_componentWillMountUniqueNames); + error("Using UNSAFE_componentWillMount in strict mode is not recommended and may indicate bugs in your code. See https://reactjs.org/link/unsafe-component-lifecycles for details.\n\n* Move code with side effects to componentDidMount, and set initial state in the constructor.\n\nPlease update the following components: %s", sortedNames); + } + if (UNSAFE_componentWillReceivePropsUniqueNames.size > 0) { + var _sortedNames = setToSortedString(UNSAFE_componentWillReceivePropsUniqueNames); + error("Using UNSAFE_componentWillReceiveProps in strict mode is not recommended and may indicate bugs in your code. See https://reactjs.org/link/unsafe-component-lifecycles for details.\n\n* Move data fetching code or side effects to componentDidUpdate.\n* If you're updating state whenever props change, refactor your code to use memoization techniques or move it to static getDerivedStateFromProps. Learn more at: https://reactjs.org/link/derived-state\n\nPlease update the following components: %s", _sortedNames); + } + if (UNSAFE_componentWillUpdateUniqueNames.size > 0) { + var _sortedNames2 = setToSortedString(UNSAFE_componentWillUpdateUniqueNames); + error("Using UNSAFE_componentWillUpdate in strict mode is not recommended and may indicate bugs in your code. See https://reactjs.org/link/unsafe-component-lifecycles for details.\n\n* Move data fetching code or side effects to componentDidUpdate.\n\nPlease update the following components: %s", _sortedNames2); + } + if (componentWillMountUniqueNames.size > 0) { + var _sortedNames3 = setToSortedString(componentWillMountUniqueNames); + warn("componentWillMount has been renamed, and is not recommended for use. See https://reactjs.org/link/unsafe-component-lifecycles for details.\n\n* Move code with side effects to componentDidMount, and set initial state in the constructor.\n* Rename componentWillMount to UNSAFE_componentWillMount to suppress this warning in non-strict mode. In React 18.x, only the UNSAFE_ name will work. To rename all deprecated lifecycles to their new names, you can run `npx react-codemod rename-unsafe-lifecycles` in your project source folder.\n\nPlease update the following components: %s", _sortedNames3); + } + if (componentWillReceivePropsUniqueNames.size > 0) { + var _sortedNames4 = setToSortedString(componentWillReceivePropsUniqueNames); + warn("componentWillReceiveProps has been renamed, and is not recommended for use. See https://reactjs.org/link/unsafe-component-lifecycles for details.\n\n* Move data fetching code or side effects to componentDidUpdate.\n* If you're updating state whenever props change, refactor your code to use memoization techniques or move it to static getDerivedStateFromProps. Learn more at: https://reactjs.org/link/derived-state\n* Rename componentWillReceiveProps to UNSAFE_componentWillReceiveProps to suppress this warning in non-strict mode. In React 18.x, only the UNSAFE_ name will work. To rename all deprecated lifecycles to their new names, you can run `npx react-codemod rename-unsafe-lifecycles` in your project source folder.\n\nPlease update the following components: %s", _sortedNames4); + } + if (componentWillUpdateUniqueNames.size > 0) { + var _sortedNames5 = setToSortedString(componentWillUpdateUniqueNames); + warn("componentWillUpdate has been renamed, and is not recommended for use. See https://reactjs.org/link/unsafe-component-lifecycles for details.\n\n* Move data fetching code or side effects to componentDidUpdate.\n* Rename componentWillUpdate to UNSAFE_componentWillUpdate to suppress this warning in non-strict mode. In React 18.x, only the UNSAFE_ name will work. To rename all deprecated lifecycles to their new names, you can run `npx react-codemod rename-unsafe-lifecycles` in your project source folder.\n\nPlease update the following components: %s", _sortedNames5); + } + }; + var pendingLegacyContextWarning = /* @__PURE__ */ new Map(); + var didWarnAboutLegacyContext = /* @__PURE__ */ new Set(); + ReactStrictModeWarnings.recordLegacyContextWarning = function(fiber, instance) { + var strictRoot = findStrictRoot(fiber); + if (strictRoot === null) { + error("Expected to find a StrictMode component in a strict mode tree. This error is likely caused by a bug in React. Please file an issue."); + return; + } + if (didWarnAboutLegacyContext.has(fiber.type)) { + return; + } + var warningsForRoot = pendingLegacyContextWarning.get(strictRoot); + if (fiber.type.contextTypes != null || fiber.type.childContextTypes != null || instance !== null && typeof instance.getChildContext === "function") { + if (warningsForRoot === void 0) { + warningsForRoot = []; + pendingLegacyContextWarning.set(strictRoot, warningsForRoot); + } + warningsForRoot.push(fiber); + } + }; + ReactStrictModeWarnings.flushLegacyContextWarning = function() { + pendingLegacyContextWarning.forEach(function(fiberArray, strictRoot) { + if (fiberArray.length === 0) { + return; + } + var firstFiber = fiberArray[0]; + var uniqueNames = /* @__PURE__ */ new Set(); + fiberArray.forEach(function(fiber) { + uniqueNames.add(getComponentNameFromFiber(fiber) || "Component"); + didWarnAboutLegacyContext.add(fiber.type); + }); + var sortedNames = setToSortedString(uniqueNames); + try { + setCurrentFiber(firstFiber); + error("Legacy context API has been detected within a strict-mode tree.\n\nThe old API will be supported in all 16.x releases, but applications using it should migrate to the new version.\n\nPlease update the following components: %s\n\nLearn more about this warning here: https://reactjs.org/link/legacy-context", sortedNames); + } finally { + resetCurrentFiber(); + } + }); + }; + ReactStrictModeWarnings.discardPendingWarnings = function() { + pendingComponentWillMountWarnings = []; + pendingUNSAFE_ComponentWillMountWarnings = []; + pendingComponentWillReceivePropsWarnings = []; + pendingUNSAFE_ComponentWillReceivePropsWarnings = []; + pendingComponentWillUpdateWarnings = []; + pendingUNSAFE_ComponentWillUpdateWarnings = []; + pendingLegacyContextWarning = /* @__PURE__ */ new Map(); + }; + } + function typeName(value) { + { + var hasToStringTag = typeof Symbol === "function" && Symbol.toStringTag; + var type = hasToStringTag && value[Symbol.toStringTag] || value.constructor.name || "Object"; + return type; + } + } + function willCoercionThrow(value) { + { + try { + testStringCoercion(value); + return false; + } catch (e) { + return true; + } + } + } + function testStringCoercion(value) { + return "" + value; + } + function checkKeyStringCoercion(value) { + { + if (willCoercionThrow(value)) { + error("The provided key is an unsupported type %s. This value must be coerced to a string before before using it here.", typeName(value)); + return testStringCoercion(value); + } + } + } + function checkPropStringCoercion(value, propName) { + { + if (willCoercionThrow(value)) { + error("The provided `%s` prop is an unsupported type %s. This value must be coerced to a string before before using it here.", propName, typeName(value)); + return testStringCoercion(value); + } + } + } + function resolveDefaultProps(Component, baseProps) { + if (Component && Component.defaultProps) { + var props = assign({}, baseProps); + var defaultProps = Component.defaultProps; + for (var propName in defaultProps) { + if (props[propName] === void 0) { + props[propName] = defaultProps[propName]; + } + } + return props; + } + return baseProps; + } + var valueCursor = createCursor(null); + var rendererSigil; + { + rendererSigil = {}; + } + var currentlyRenderingFiber = null; + var lastContextDependency = null; + var lastFullyObservedContext = null; + var isDisallowedContextReadInDEV = false; + function resetContextDependencies() { + currentlyRenderingFiber = null; + lastContextDependency = null; + lastFullyObservedContext = null; + { + isDisallowedContextReadInDEV = false; + } + } + function enterDisallowedContextReadInDEV() { + { + isDisallowedContextReadInDEV = true; + } + } + function exitDisallowedContextReadInDEV() { + { + isDisallowedContextReadInDEV = false; + } + } + function pushProvider(providerFiber, context, nextValue) { + if (isPrimaryRenderer) { + push(valueCursor, context._currentValue, providerFiber); + context._currentValue = nextValue; + { + if (context._currentRenderer !== void 0 && context._currentRenderer !== null && context._currentRenderer !== rendererSigil) { + error("Detected multiple renderers concurrently rendering the same context provider. This is currently unsupported."); + } + context._currentRenderer = rendererSigil; + } + } else { + push(valueCursor, context._currentValue2, providerFiber); + context._currentValue2 = nextValue; + { + if (context._currentRenderer2 !== void 0 && context._currentRenderer2 !== null && context._currentRenderer2 !== rendererSigil) { + error("Detected multiple renderers concurrently rendering the same context provider. This is currently unsupported."); + } + context._currentRenderer2 = rendererSigil; + } + } + } + function popProvider(context, providerFiber) { + var currentValue = valueCursor.current; + pop(valueCursor, providerFiber); + if (isPrimaryRenderer) { + { + context._currentValue = currentValue; + } + } else { + { + context._currentValue2 = currentValue; + } + } + } + function scheduleContextWorkOnParentPath(parent, renderLanes2, propagationRoot) { + var node = parent; + while (node !== null) { + var alternate = node.alternate; + if (!isSubsetOfLanes(node.childLanes, renderLanes2)) { + node.childLanes = mergeLanes(node.childLanes, renderLanes2); + if (alternate !== null) { + alternate.childLanes = mergeLanes(alternate.childLanes, renderLanes2); + } + } else if (alternate !== null && !isSubsetOfLanes(alternate.childLanes, renderLanes2)) { + alternate.childLanes = mergeLanes(alternate.childLanes, renderLanes2); + } + if (node === propagationRoot) { + break; + } + node = node.return; + } + { + if (node !== propagationRoot) { + error("Expected to find the propagation root when scheduling context work. This error is likely caused by a bug in React. Please file an issue."); + } + } + } + function propagateContextChange(workInProgress2, context, renderLanes2) { + { + propagateContextChange_eager(workInProgress2, context, renderLanes2); + } + } + function propagateContextChange_eager(workInProgress2, context, renderLanes2) { + var fiber = workInProgress2.child; + if (fiber !== null) { + fiber.return = workInProgress2; + } + while (fiber !== null) { + var nextFiber = void 0; + var list = fiber.dependencies; + if (list !== null) { + nextFiber = fiber.child; + var dependency = list.firstContext; + while (dependency !== null) { + if (dependency.context === context) { + if (fiber.tag === ClassComponent) { + var lane = pickArbitraryLane(renderLanes2); + var update = createUpdate(NoTimestamp, lane); + update.tag = ForceUpdate; + var updateQueue = fiber.updateQueue; + if (updateQueue === null) + ; + else { + var sharedQueue = updateQueue.shared; + var pending = sharedQueue.pending; + if (pending === null) { + update.next = update; + } else { + update.next = pending.next; + pending.next = update; + } + sharedQueue.pending = update; + } + } + fiber.lanes = mergeLanes(fiber.lanes, renderLanes2); + var alternate = fiber.alternate; + if (alternate !== null) { + alternate.lanes = mergeLanes(alternate.lanes, renderLanes2); + } + scheduleContextWorkOnParentPath(fiber.return, renderLanes2, workInProgress2); + list.lanes = mergeLanes(list.lanes, renderLanes2); + break; + } + dependency = dependency.next; + } + } else if (fiber.tag === ContextProvider) { + nextFiber = fiber.type === workInProgress2.type ? null : fiber.child; + } else if (fiber.tag === DehydratedFragment) { + var parentSuspense = fiber.return; + if (parentSuspense === null) { + throw new Error("We just came from a parent so we must have had a parent. This is a bug in React."); + } + parentSuspense.lanes = mergeLanes(parentSuspense.lanes, renderLanes2); + var _alternate = parentSuspense.alternate; + if (_alternate !== null) { + _alternate.lanes = mergeLanes(_alternate.lanes, renderLanes2); + } + scheduleContextWorkOnParentPath(parentSuspense, renderLanes2, workInProgress2); + nextFiber = fiber.sibling; + } else { + nextFiber = fiber.child; + } + if (nextFiber !== null) { + nextFiber.return = fiber; + } else { + nextFiber = fiber; + while (nextFiber !== null) { + if (nextFiber === workInProgress2) { + nextFiber = null; + break; + } + var sibling = nextFiber.sibling; + if (sibling !== null) { + sibling.return = nextFiber.return; + nextFiber = sibling; + break; + } + nextFiber = nextFiber.return; + } + } + fiber = nextFiber; + } + } + function prepareToReadContext(workInProgress2, renderLanes2) { + currentlyRenderingFiber = workInProgress2; + lastContextDependency = null; + lastFullyObservedContext = null; + var dependencies = workInProgress2.dependencies; + if (dependencies !== null) { + { + var firstContext = dependencies.firstContext; + if (firstContext !== null) { + if (includesSomeLane(dependencies.lanes, renderLanes2)) { + markWorkInProgressReceivedUpdate(); + } + dependencies.firstContext = null; + } + } + } + } + function readContext(context) { + { + if (isDisallowedContextReadInDEV) { + error("Context can only be read while React is rendering. In classes, you can read it in the render method or getDerivedStateFromProps. In function components, you can read it directly in the function body, but not inside Hooks like useReducer() or useMemo()."); + } + } + var value = isPrimaryRenderer ? context._currentValue : context._currentValue2; + if (lastFullyObservedContext === context) + ; + else { + var contextItem = { + context, + memoizedValue: value, + next: null + }; + if (lastContextDependency === null) { + if (currentlyRenderingFiber === null) { + throw new Error("Context can only be read while React is rendering. In classes, you can read it in the render method or getDerivedStateFromProps. In function components, you can read it directly in the function body, but not inside Hooks like useReducer() or useMemo()."); + } + lastContextDependency = contextItem; + currentlyRenderingFiber.dependencies = { + lanes: NoLanes, + firstContext: contextItem + }; + } else { + lastContextDependency = lastContextDependency.next = contextItem; + } + } + return value; + } + var concurrentQueues = null; + function pushConcurrentUpdateQueue(queue) { + if (concurrentQueues === null) { + concurrentQueues = [queue]; + } else { + concurrentQueues.push(queue); + } + } + function finishQueueingConcurrentUpdates() { + if (concurrentQueues !== null) { + for (var i = 0; i < concurrentQueues.length; i++) { + var queue = concurrentQueues[i]; + var lastInterleavedUpdate = queue.interleaved; + if (lastInterleavedUpdate !== null) { + queue.interleaved = null; + var firstInterleavedUpdate = lastInterleavedUpdate.next; + var lastPendingUpdate = queue.pending; + if (lastPendingUpdate !== null) { + var firstPendingUpdate = lastPendingUpdate.next; + lastPendingUpdate.next = firstInterleavedUpdate; + lastInterleavedUpdate.next = firstPendingUpdate; + } + queue.pending = lastInterleavedUpdate; + } + } + concurrentQueues = null; + } + } + function enqueueConcurrentHookUpdate(fiber, queue, update, lane) { + var interleaved = queue.interleaved; + if (interleaved === null) { + update.next = update; + pushConcurrentUpdateQueue(queue); + } else { + update.next = interleaved.next; + interleaved.next = update; + } + queue.interleaved = update; + return markUpdateLaneFromFiberToRoot(fiber, lane); + } + function enqueueConcurrentHookUpdateAndEagerlyBailout(fiber, queue, update, lane) { + var interleaved = queue.interleaved; + if (interleaved === null) { + update.next = update; + pushConcurrentUpdateQueue(queue); + } else { + update.next = interleaved.next; + interleaved.next = update; + } + queue.interleaved = update; + } + function enqueueConcurrentClassUpdate(fiber, queue, update, lane) { + var interleaved = queue.interleaved; + if (interleaved === null) { + update.next = update; + pushConcurrentUpdateQueue(queue); + } else { + update.next = interleaved.next; + interleaved.next = update; + } + queue.interleaved = update; + return markUpdateLaneFromFiberToRoot(fiber, lane); + } + function enqueueConcurrentRenderForLane(fiber, lane) { + return markUpdateLaneFromFiberToRoot(fiber, lane); + } + var unsafe_markUpdateLaneFromFiberToRoot = markUpdateLaneFromFiberToRoot; + function markUpdateLaneFromFiberToRoot(sourceFiber, lane) { + sourceFiber.lanes = mergeLanes(sourceFiber.lanes, lane); + var alternate = sourceFiber.alternate; + if (alternate !== null) { + alternate.lanes = mergeLanes(alternate.lanes, lane); + } + { + if (alternate === null && (sourceFiber.flags & (Placement | Hydrating)) !== NoFlags) { + warnAboutUpdateOnNotYetMountedFiberInDEV(sourceFiber); + } + } + var node = sourceFiber; + var parent = sourceFiber.return; + while (parent !== null) { + parent.childLanes = mergeLanes(parent.childLanes, lane); + alternate = parent.alternate; + if (alternate !== null) { + alternate.childLanes = mergeLanes(alternate.childLanes, lane); + } else { + { + if ((parent.flags & (Placement | Hydrating)) !== NoFlags) { + warnAboutUpdateOnNotYetMountedFiberInDEV(sourceFiber); + } + } + } + node = parent; + parent = parent.return; + } + if (node.tag === HostRoot) { + var root = node.stateNode; + return root; + } else { + return null; + } + } + var UpdateState = 0; + var ReplaceState = 1; + var ForceUpdate = 2; + var CaptureUpdate = 3; + var hasForceUpdate = false; + var didWarnUpdateInsideUpdate; + var currentlyProcessingQueue; + { + didWarnUpdateInsideUpdate = false; + currentlyProcessingQueue = null; + } + function initializeUpdateQueue(fiber) { + var queue = { + baseState: fiber.memoizedState, + firstBaseUpdate: null, + lastBaseUpdate: null, + shared: { + pending: null, + interleaved: null, + lanes: NoLanes + }, + effects: null + }; + fiber.updateQueue = queue; + } + function cloneUpdateQueue(current2, workInProgress2) { + var queue = workInProgress2.updateQueue; + var currentQueue = current2.updateQueue; + if (queue === currentQueue) { + var clone2 = { + baseState: currentQueue.baseState, + firstBaseUpdate: currentQueue.firstBaseUpdate, + lastBaseUpdate: currentQueue.lastBaseUpdate, + shared: currentQueue.shared, + effects: currentQueue.effects + }; + workInProgress2.updateQueue = clone2; + } + } + function createUpdate(eventTime, lane) { + var update = { + eventTime, + lane, + tag: UpdateState, + payload: null, + callback: null, + next: null + }; + return update; + } + function enqueueUpdate(fiber, update, lane) { + var updateQueue = fiber.updateQueue; + if (updateQueue === null) { + return null; + } + var sharedQueue = updateQueue.shared; + { + if (currentlyProcessingQueue === sharedQueue && !didWarnUpdateInsideUpdate) { + error("An update (setState, replaceState, or forceUpdate) was scheduled from inside an update function. Update functions should be pure, with zero side-effects. Consider using componentDidUpdate or a callback."); + didWarnUpdateInsideUpdate = true; + } + } + if (isUnsafeClassRenderPhaseUpdate()) { + var pending = sharedQueue.pending; + if (pending === null) { + update.next = update; + } else { + update.next = pending.next; + pending.next = update; + } + sharedQueue.pending = update; + return unsafe_markUpdateLaneFromFiberToRoot(fiber, lane); + } else { + return enqueueConcurrentClassUpdate(fiber, sharedQueue, update, lane); + } + } + function entangleTransitions(root, fiber, lane) { + var updateQueue = fiber.updateQueue; + if (updateQueue === null) { + return; + } + var sharedQueue = updateQueue.shared; + if (isTransitionLane(lane)) { + var queueLanes = sharedQueue.lanes; + queueLanes = intersectLanes(queueLanes, root.pendingLanes); + var newQueueLanes = mergeLanes(queueLanes, lane); + sharedQueue.lanes = newQueueLanes; + markRootEntangled(root, newQueueLanes); + } + } + function enqueueCapturedUpdate(workInProgress2, capturedUpdate) { + var queue = workInProgress2.updateQueue; + var current2 = workInProgress2.alternate; + if (current2 !== null) { + var currentQueue = current2.updateQueue; + if (queue === currentQueue) { + var newFirst = null; + var newLast = null; + var firstBaseUpdate = queue.firstBaseUpdate; + if (firstBaseUpdate !== null) { + var update = firstBaseUpdate; + do { + var clone2 = { + eventTime: update.eventTime, + lane: update.lane, + tag: update.tag, + payload: update.payload, + callback: update.callback, + next: null + }; + if (newLast === null) { + newFirst = newLast = clone2; + } else { + newLast.next = clone2; + newLast = clone2; + } + update = update.next; + } while (update !== null); + if (newLast === null) { + newFirst = newLast = capturedUpdate; + } else { + newLast.next = capturedUpdate; + newLast = capturedUpdate; + } + } else { + newFirst = newLast = capturedUpdate; + } + queue = { + baseState: currentQueue.baseState, + firstBaseUpdate: newFirst, + lastBaseUpdate: newLast, + shared: currentQueue.shared, + effects: currentQueue.effects + }; + workInProgress2.updateQueue = queue; + return; + } + } + var lastBaseUpdate = queue.lastBaseUpdate; + if (lastBaseUpdate === null) { + queue.firstBaseUpdate = capturedUpdate; + } else { + lastBaseUpdate.next = capturedUpdate; + } + queue.lastBaseUpdate = capturedUpdate; + } + function getStateFromUpdate(workInProgress2, queue, update, prevState, nextProps, instance) { + switch (update.tag) { + case ReplaceState: { + var payload = update.payload; + if (typeof payload === "function") { + { + enterDisallowedContextReadInDEV(); + } + var nextState = payload.call(instance, prevState, nextProps); + { + if (workInProgress2.mode & StrictLegacyMode) { + setIsStrictModeForDevtools(true); + try { + payload.call(instance, prevState, nextProps); + } finally { + setIsStrictModeForDevtools(false); + } + } + exitDisallowedContextReadInDEV(); + } + return nextState; + } + return payload; + } + case CaptureUpdate: { + workInProgress2.flags = workInProgress2.flags & ~ShouldCapture | DidCapture; + } + case UpdateState: { + var _payload = update.payload; + var partialState; + if (typeof _payload === "function") { + { + enterDisallowedContextReadInDEV(); + } + partialState = _payload.call(instance, prevState, nextProps); + { + if (workInProgress2.mode & StrictLegacyMode) { + setIsStrictModeForDevtools(true); + try { + _payload.call(instance, prevState, nextProps); + } finally { + setIsStrictModeForDevtools(false); + } + } + exitDisallowedContextReadInDEV(); + } + } else { + partialState = _payload; + } + if (partialState === null || partialState === void 0) { + return prevState; + } + return assign({}, prevState, partialState); + } + case ForceUpdate: { + hasForceUpdate = true; + return prevState; + } + } + return prevState; + } + function processUpdateQueue(workInProgress2, props, instance, renderLanes2) { + var queue = workInProgress2.updateQueue; + hasForceUpdate = false; + { + currentlyProcessingQueue = queue.shared; + } + var firstBaseUpdate = queue.firstBaseUpdate; + var lastBaseUpdate = queue.lastBaseUpdate; + var pendingQueue = queue.shared.pending; + if (pendingQueue !== null) { + queue.shared.pending = null; + var lastPendingUpdate = pendingQueue; + var firstPendingUpdate = lastPendingUpdate.next; + lastPendingUpdate.next = null; + if (lastBaseUpdate === null) { + firstBaseUpdate = firstPendingUpdate; + } else { + lastBaseUpdate.next = firstPendingUpdate; + } + lastBaseUpdate = lastPendingUpdate; + var current2 = workInProgress2.alternate; + if (current2 !== null) { + var currentQueue = current2.updateQueue; + var currentLastBaseUpdate = currentQueue.lastBaseUpdate; + if (currentLastBaseUpdate !== lastBaseUpdate) { + if (currentLastBaseUpdate === null) { + currentQueue.firstBaseUpdate = firstPendingUpdate; + } else { + currentLastBaseUpdate.next = firstPendingUpdate; + } + currentQueue.lastBaseUpdate = lastPendingUpdate; + } + } + } + if (firstBaseUpdate !== null) { + var newState = queue.baseState; + var newLanes = NoLanes; + var newBaseState = null; + var newFirstBaseUpdate = null; + var newLastBaseUpdate = null; + var update = firstBaseUpdate; + do { + var updateLane = update.lane; + var updateEventTime = update.eventTime; + if (!isSubsetOfLanes(renderLanes2, updateLane)) { + var clone2 = { + eventTime: updateEventTime, + lane: updateLane, + tag: update.tag, + payload: update.payload, + callback: update.callback, + next: null + }; + if (newLastBaseUpdate === null) { + newFirstBaseUpdate = newLastBaseUpdate = clone2; + newBaseState = newState; + } else { + newLastBaseUpdate = newLastBaseUpdate.next = clone2; + } + newLanes = mergeLanes(newLanes, updateLane); + } else { + if (newLastBaseUpdate !== null) { + var _clone = { + eventTime: updateEventTime, + // This update is going to be committed so we never want uncommit + // it. Using NoLane works because 0 is a subset of all bitmasks, so + // this will never be skipped by the check above. + lane: NoLane, + tag: update.tag, + payload: update.payload, + callback: update.callback, + next: null + }; + newLastBaseUpdate = newLastBaseUpdate.next = _clone; + } + newState = getStateFromUpdate(workInProgress2, queue, update, newState, props, instance); + var callback = update.callback; + if (callback !== null && // If the update was already committed, we should not queue its + // callback again. + update.lane !== NoLane) { + workInProgress2.flags |= Callback; + var effects = queue.effects; + if (effects === null) { + queue.effects = [update]; + } else { + effects.push(update); + } + } + } + update = update.next; + if (update === null) { + pendingQueue = queue.shared.pending; + if (pendingQueue === null) { + break; + } else { + var _lastPendingUpdate = pendingQueue; + var _firstPendingUpdate = _lastPendingUpdate.next; + _lastPendingUpdate.next = null; + update = _firstPendingUpdate; + queue.lastBaseUpdate = _lastPendingUpdate; + queue.shared.pending = null; + } + } + } while (true); + if (newLastBaseUpdate === null) { + newBaseState = newState; + } + queue.baseState = newBaseState; + queue.firstBaseUpdate = newFirstBaseUpdate; + queue.lastBaseUpdate = newLastBaseUpdate; + var lastInterleaved = queue.shared.interleaved; + if (lastInterleaved !== null) { + var interleaved = lastInterleaved; + do { + newLanes = mergeLanes(newLanes, interleaved.lane); + interleaved = interleaved.next; + } while (interleaved !== lastInterleaved); + } else if (firstBaseUpdate === null) { + queue.shared.lanes = NoLanes; + } + markSkippedUpdateLanes(newLanes); + workInProgress2.lanes = newLanes; + workInProgress2.memoizedState = newState; + } + { + currentlyProcessingQueue = null; + } + } + function callCallback(callback, context) { + if (typeof callback !== "function") { + throw new Error("Invalid argument passed as callback. Expected a function. Instead " + ("received: " + callback)); + } + callback.call(context); + } + function resetHasForceUpdateBeforeProcessing() { + hasForceUpdate = false; + } + function checkHasForceUpdateAfterProcessing() { + return hasForceUpdate; + } + function commitUpdateQueue(finishedWork, finishedQueue, instance) { + var effects = finishedQueue.effects; + finishedQueue.effects = null; + if (effects !== null) { + for (var i = 0; i < effects.length; i++) { + var effect = effects[i]; + var callback = effect.callback; + if (callback !== null) { + effect.callback = null; + callCallback(callback, instance); + } + } + } + } + var fakeInternalInstance = {}; + var emptyRefsObject = new React2.Component().refs; + var didWarnAboutStateAssignmentForComponent; + var didWarnAboutUninitializedState; + var didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate; + var didWarnAboutLegacyLifecyclesAndDerivedState; + var didWarnAboutUndefinedDerivedState; + var warnOnUndefinedDerivedState; + var warnOnInvalidCallback; + var didWarnAboutDirectlyAssigningPropsToState; + var didWarnAboutContextTypeAndContextTypes; + var didWarnAboutInvalidateContextType; + { + didWarnAboutStateAssignmentForComponent = /* @__PURE__ */ new Set(); + didWarnAboutUninitializedState = /* @__PURE__ */ new Set(); + didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate = /* @__PURE__ */ new Set(); + didWarnAboutLegacyLifecyclesAndDerivedState = /* @__PURE__ */ new Set(); + didWarnAboutDirectlyAssigningPropsToState = /* @__PURE__ */ new Set(); + didWarnAboutUndefinedDerivedState = /* @__PURE__ */ new Set(); + didWarnAboutContextTypeAndContextTypes = /* @__PURE__ */ new Set(); + didWarnAboutInvalidateContextType = /* @__PURE__ */ new Set(); + var didWarnOnInvalidCallback = /* @__PURE__ */ new Set(); + warnOnInvalidCallback = function(callback, callerName) { + if (callback === null || typeof callback === "function") { + return; + } + var key = callerName + "_" + callback; + if (!didWarnOnInvalidCallback.has(key)) { + didWarnOnInvalidCallback.add(key); + error("%s(...): Expected the last optional `callback` argument to be a function. Instead received: %s.", callerName, callback); + } + }; + warnOnUndefinedDerivedState = function(type, partialState) { + if (partialState === void 0) { + var componentName = getComponentNameFromType(type) || "Component"; + if (!didWarnAboutUndefinedDerivedState.has(componentName)) { + didWarnAboutUndefinedDerivedState.add(componentName); + error("%s.getDerivedStateFromProps(): A valid state object (or null) must be returned. You have returned undefined.", componentName); + } + } + }; + Object.defineProperty(fakeInternalInstance, "_processChildContext", { + enumerable: false, + value: function() { + throw new Error("_processChildContext is not available in React 16+. This likely means you have multiple copies of React and are attempting to nest a React 15 tree inside a React 16 tree using unstable_renderSubtreeIntoContainer, which isn't supported. Try to make sure you have only one copy of React (and ideally, switch to ReactDOM.createPortal)."); + } + }); + Object.freeze(fakeInternalInstance); + } + function applyDerivedStateFromProps(workInProgress2, ctor, getDerivedStateFromProps, nextProps) { + var prevState = workInProgress2.memoizedState; + var partialState = getDerivedStateFromProps(nextProps, prevState); + { + if (workInProgress2.mode & StrictLegacyMode) { + setIsStrictModeForDevtools(true); + try { + partialState = getDerivedStateFromProps(nextProps, prevState); + } finally { + setIsStrictModeForDevtools(false); + } + } + warnOnUndefinedDerivedState(ctor, partialState); + } + var memoizedState = partialState === null || partialState === void 0 ? prevState : assign({}, prevState, partialState); + workInProgress2.memoizedState = memoizedState; + if (workInProgress2.lanes === NoLanes) { + var updateQueue = workInProgress2.updateQueue; + updateQueue.baseState = memoizedState; + } + } + var classComponentUpdater = { + isMounted, + enqueueSetState: function(inst, payload, callback) { + var fiber = get(inst); + var eventTime = requestEventTime(); + var lane = requestUpdateLane(fiber); + var update = createUpdate(eventTime, lane); + update.payload = payload; + if (callback !== void 0 && callback !== null) { + { + warnOnInvalidCallback(callback, "setState"); + } + update.callback = callback; + } + var root = enqueueUpdate(fiber, update, lane); + if (root !== null) { + scheduleUpdateOnFiber(root, fiber, lane, eventTime); + entangleTransitions(root, fiber, lane); + } + { + markStateUpdateScheduled(fiber, lane); + } + }, + enqueueReplaceState: function(inst, payload, callback) { + var fiber = get(inst); + var eventTime = requestEventTime(); + var lane = requestUpdateLane(fiber); + var update = createUpdate(eventTime, lane); + update.tag = ReplaceState; + update.payload = payload; + if (callback !== void 0 && callback !== null) { + { + warnOnInvalidCallback(callback, "replaceState"); + } + update.callback = callback; + } + var root = enqueueUpdate(fiber, update, lane); + if (root !== null) { + scheduleUpdateOnFiber(root, fiber, lane, eventTime); + entangleTransitions(root, fiber, lane); + } + { + markStateUpdateScheduled(fiber, lane); + } + }, + enqueueForceUpdate: function(inst, callback) { + var fiber = get(inst); + var eventTime = requestEventTime(); + var lane = requestUpdateLane(fiber); + var update = createUpdate(eventTime, lane); + update.tag = ForceUpdate; + if (callback !== void 0 && callback !== null) { + { + warnOnInvalidCallback(callback, "forceUpdate"); + } + update.callback = callback; + } + var root = enqueueUpdate(fiber, update, lane); + if (root !== null) { + scheduleUpdateOnFiber(root, fiber, lane, eventTime); + entangleTransitions(root, fiber, lane); + } + { + markForceUpdateScheduled(fiber, lane); + } + } + }; + function checkShouldComponentUpdate(workInProgress2, ctor, oldProps, newProps, oldState, newState, nextContext) { + var instance = workInProgress2.stateNode; + if (typeof instance.shouldComponentUpdate === "function") { + var shouldUpdate = instance.shouldComponentUpdate(newProps, newState, nextContext); + { + if (workInProgress2.mode & StrictLegacyMode) { + setIsStrictModeForDevtools(true); + try { + shouldUpdate = instance.shouldComponentUpdate(newProps, newState, nextContext); + } finally { + setIsStrictModeForDevtools(false); + } + } + if (shouldUpdate === void 0) { + error("%s.shouldComponentUpdate(): Returned undefined instead of a boolean value. Make sure to return true or false.", getComponentNameFromType(ctor) || "Component"); + } + } + return shouldUpdate; + } + if (ctor.prototype && ctor.prototype.isPureReactComponent) { + return !shallowEqual(oldProps, newProps) || !shallowEqual(oldState, newState); + } + return true; + } + function checkClassInstance(workInProgress2, ctor, newProps) { + var instance = workInProgress2.stateNode; + { + var name = getComponentNameFromType(ctor) || "Component"; + var renderPresent = instance.render; + if (!renderPresent) { + if (ctor.prototype && typeof ctor.prototype.render === "function") { + error("%s(...): No `render` method found on the returned component instance: did you accidentally return an object from the constructor?", name); + } else { + error("%s(...): No `render` method found on the returned component instance: you may have forgotten to define `render`.", name); + } + } + if (instance.getInitialState && !instance.getInitialState.isReactClassApproved && !instance.state) { + error("getInitialState was defined on %s, a plain JavaScript class. This is only supported for classes created using React.createClass. Did you mean to define a state property instead?", name); + } + if (instance.getDefaultProps && !instance.getDefaultProps.isReactClassApproved) { + error("getDefaultProps was defined on %s, a plain JavaScript class. This is only supported for classes created using React.createClass. Use a static property to define defaultProps instead.", name); + } + if (instance.propTypes) { + error("propTypes was defined as an instance property on %s. Use a static property to define propTypes instead.", name); + } + if (instance.contextType) { + error("contextType was defined as an instance property on %s. Use a static property to define contextType instead.", name); + } + { + if (instance.contextTypes) { + error("contextTypes was defined as an instance property on %s. Use a static property to define contextTypes instead.", name); + } + if (ctor.contextType && ctor.contextTypes && !didWarnAboutContextTypeAndContextTypes.has(ctor)) { + didWarnAboutContextTypeAndContextTypes.add(ctor); + error("%s declares both contextTypes and contextType static properties. The legacy contextTypes property will be ignored.", name); + } + } + if (typeof instance.componentShouldUpdate === "function") { + error("%s has a method called componentShouldUpdate(). Did you mean shouldComponentUpdate()? The name is phrased as a question because the function is expected to return a value.", name); + } + if (ctor.prototype && ctor.prototype.isPureReactComponent && typeof instance.shouldComponentUpdate !== "undefined") { + error("%s has a method called shouldComponentUpdate(). shouldComponentUpdate should not be used when extending React.PureComponent. Please extend React.Component if shouldComponentUpdate is used.", getComponentNameFromType(ctor) || "A pure component"); + } + if (typeof instance.componentDidUnmount === "function") { + error("%s has a method called componentDidUnmount(). But there is no such lifecycle method. Did you mean componentWillUnmount()?", name); + } + if (typeof instance.componentDidReceiveProps === "function") { + error("%s has a method called componentDidReceiveProps(). But there is no such lifecycle method. If you meant to update the state in response to changing props, use componentWillReceiveProps(). If you meant to fetch data or run side-effects or mutations after React has updated the UI, use componentDidUpdate().", name); + } + if (typeof instance.componentWillRecieveProps === "function") { + error("%s has a method called componentWillRecieveProps(). Did you mean componentWillReceiveProps()?", name); + } + if (typeof instance.UNSAFE_componentWillRecieveProps === "function") { + error("%s has a method called UNSAFE_componentWillRecieveProps(). Did you mean UNSAFE_componentWillReceiveProps()?", name); + } + var hasMutatedProps = instance.props !== newProps; + if (instance.props !== void 0 && hasMutatedProps) { + error("%s(...): When calling super() in `%s`, make sure to pass up the same props that your component's constructor was passed.", name, name); + } + if (instance.defaultProps) { + error("Setting defaultProps as an instance property on %s is not supported and will be ignored. Instead, define defaultProps as a static property on %s.", name, name); + } + if (typeof instance.getSnapshotBeforeUpdate === "function" && typeof instance.componentDidUpdate !== "function" && !didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate.has(ctor)) { + didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate.add(ctor); + error("%s: getSnapshotBeforeUpdate() should be used with componentDidUpdate(). This component defines getSnapshotBeforeUpdate() only.", getComponentNameFromType(ctor)); + } + if (typeof instance.getDerivedStateFromProps === "function") { + error("%s: getDerivedStateFromProps() is defined as an instance method and will be ignored. Instead, declare it as a static method.", name); + } + if (typeof instance.getDerivedStateFromError === "function") { + error("%s: getDerivedStateFromError() is defined as an instance method and will be ignored. Instead, declare it as a static method.", name); + } + if (typeof ctor.getSnapshotBeforeUpdate === "function") { + error("%s: getSnapshotBeforeUpdate() is defined as a static method and will be ignored. Instead, declare it as an instance method.", name); + } + var _state = instance.state; + if (_state && (typeof _state !== "object" || isArray(_state))) { + error("%s.state: must be set to an object or null", name); + } + if (typeof instance.getChildContext === "function" && typeof ctor.childContextTypes !== "object") { + error("%s.getChildContext(): childContextTypes must be defined in order to use getChildContext().", name); + } + } + } + function adoptClassInstance(workInProgress2, instance) { + instance.updater = classComponentUpdater; + workInProgress2.stateNode = instance; + set(instance, workInProgress2); + { + instance._reactInternalInstance = fakeInternalInstance; + } + } + function constructClassInstance(workInProgress2, ctor, props) { + var isLegacyContextConsumer = false; + var unmaskedContext = emptyContextObject; + var context = emptyContextObject; + var contextType = ctor.contextType; + { + if ("contextType" in ctor) { + var isValid = ( + // Allow null for conditional declaration + contextType === null || contextType !== void 0 && contextType.$$typeof === REACT_CONTEXT_TYPE && contextType._context === void 0 + ); + if (!isValid && !didWarnAboutInvalidateContextType.has(ctor)) { + didWarnAboutInvalidateContextType.add(ctor); + var addendum = ""; + if (contextType === void 0) { + addendum = " However, it is set to undefined. This can be caused by a typo or by mixing up named and default imports. This can also happen due to a circular dependency, so try moving the createContext() call to a separate file."; + } else if (typeof contextType !== "object") { + addendum = " However, it is set to a " + typeof contextType + "."; + } else if (contextType.$$typeof === REACT_PROVIDER_TYPE) { + addendum = " Did you accidentally pass the Context.Provider instead?"; + } else if (contextType._context !== void 0) { + addendum = " Did you accidentally pass the Context.Consumer instead?"; + } else { + addendum = " However, it is set to an object with keys {" + Object.keys(contextType).join(", ") + "}."; + } + error("%s defines an invalid contextType. contextType should point to the Context object returned by React.createContext().%s", getComponentNameFromType(ctor) || "Component", addendum); + } + } + } + if (typeof contextType === "object" && contextType !== null) { + context = readContext(contextType); + } else { + unmaskedContext = getUnmaskedContext(workInProgress2, ctor, true); + var contextTypes = ctor.contextTypes; + isLegacyContextConsumer = contextTypes !== null && contextTypes !== void 0; + context = isLegacyContextConsumer ? getMaskedContext(workInProgress2, unmaskedContext) : emptyContextObject; + } + var instance = new ctor(props, context); + { + if (workInProgress2.mode & StrictLegacyMode) { + setIsStrictModeForDevtools(true); + try { + instance = new ctor(props, context); + } finally { + setIsStrictModeForDevtools(false); + } + } + } + var state = workInProgress2.memoizedState = instance.state !== null && instance.state !== void 0 ? instance.state : null; + adoptClassInstance(workInProgress2, instance); + { + if (typeof ctor.getDerivedStateFromProps === "function" && state === null) { + var componentName = getComponentNameFromType(ctor) || "Component"; + if (!didWarnAboutUninitializedState.has(componentName)) { + didWarnAboutUninitializedState.add(componentName); + error("`%s` uses `getDerivedStateFromProps` but its initial state is %s. This is not recommended. Instead, define the initial state by assigning an object to `this.state` in the constructor of `%s`. This ensures that `getDerivedStateFromProps` arguments have a consistent shape.", componentName, instance.state === null ? "null" : "undefined", componentName); + } + } + if (typeof ctor.getDerivedStateFromProps === "function" || typeof instance.getSnapshotBeforeUpdate === "function") { + var foundWillMountName = null; + var foundWillReceivePropsName = null; + var foundWillUpdateName = null; + if (typeof instance.componentWillMount === "function" && instance.componentWillMount.__suppressDeprecationWarning !== true) { + foundWillMountName = "componentWillMount"; + } else if (typeof instance.UNSAFE_componentWillMount === "function") { + foundWillMountName = "UNSAFE_componentWillMount"; + } + if (typeof instance.componentWillReceiveProps === "function" && instance.componentWillReceiveProps.__suppressDeprecationWarning !== true) { + foundWillReceivePropsName = "componentWillReceiveProps"; + } else if (typeof instance.UNSAFE_componentWillReceiveProps === "function") { + foundWillReceivePropsName = "UNSAFE_componentWillReceiveProps"; + } + if (typeof instance.componentWillUpdate === "function" && instance.componentWillUpdate.__suppressDeprecationWarning !== true) { + foundWillUpdateName = "componentWillUpdate"; + } else if (typeof instance.UNSAFE_componentWillUpdate === "function") { + foundWillUpdateName = "UNSAFE_componentWillUpdate"; + } + if (foundWillMountName !== null || foundWillReceivePropsName !== null || foundWillUpdateName !== null) { + var _componentName = getComponentNameFromType(ctor) || "Component"; + var newApiName = typeof ctor.getDerivedStateFromProps === "function" ? "getDerivedStateFromProps()" : "getSnapshotBeforeUpdate()"; + if (!didWarnAboutLegacyLifecyclesAndDerivedState.has(_componentName)) { + didWarnAboutLegacyLifecyclesAndDerivedState.add(_componentName); + error("Unsafe legacy lifecycles will not be called for components using new component APIs.\n\n%s uses %s but also contains the following legacy lifecycles:%s%s%s\n\nThe above lifecycles should be removed. Learn more about this warning here:\nhttps://reactjs.org/link/unsafe-component-lifecycles", _componentName, newApiName, foundWillMountName !== null ? "\n " + foundWillMountName : "", foundWillReceivePropsName !== null ? "\n " + foundWillReceivePropsName : "", foundWillUpdateName !== null ? "\n " + foundWillUpdateName : ""); + } + } + } + } + if (isLegacyContextConsumer) { + cacheContext(workInProgress2, unmaskedContext, context); + } + return instance; + } + function callComponentWillMount(workInProgress2, instance) { + var oldState = instance.state; + if (typeof instance.componentWillMount === "function") { + instance.componentWillMount(); + } + if (typeof instance.UNSAFE_componentWillMount === "function") { + instance.UNSAFE_componentWillMount(); + } + if (oldState !== instance.state) { + { + error("%s.componentWillMount(): Assigning directly to this.state is deprecated (except inside a component's constructor). Use setState instead.", getComponentNameFromFiber(workInProgress2) || "Component"); + } + classComponentUpdater.enqueueReplaceState(instance, instance.state, null); + } + } + function callComponentWillReceiveProps(workInProgress2, instance, newProps, nextContext) { + var oldState = instance.state; + if (typeof instance.componentWillReceiveProps === "function") { + instance.componentWillReceiveProps(newProps, nextContext); + } + if (typeof instance.UNSAFE_componentWillReceiveProps === "function") { + instance.UNSAFE_componentWillReceiveProps(newProps, nextContext); + } + if (instance.state !== oldState) { + { + var componentName = getComponentNameFromFiber(workInProgress2) || "Component"; + if (!didWarnAboutStateAssignmentForComponent.has(componentName)) { + didWarnAboutStateAssignmentForComponent.add(componentName); + error("%s.componentWillReceiveProps(): Assigning directly to this.state is deprecated (except inside a component's constructor). Use setState instead.", componentName); + } + } + classComponentUpdater.enqueueReplaceState(instance, instance.state, null); + } + } + function mountClassInstance(workInProgress2, ctor, newProps, renderLanes2) { + { + checkClassInstance(workInProgress2, ctor, newProps); + } + var instance = workInProgress2.stateNode; + instance.props = newProps; + instance.state = workInProgress2.memoizedState; + instance.refs = emptyRefsObject; + initializeUpdateQueue(workInProgress2); + var contextType = ctor.contextType; + if (typeof contextType === "object" && contextType !== null) { + instance.context = readContext(contextType); + } else { + var unmaskedContext = getUnmaskedContext(workInProgress2, ctor, true); + instance.context = getMaskedContext(workInProgress2, unmaskedContext); + } + { + if (instance.state === newProps) { + var componentName = getComponentNameFromType(ctor) || "Component"; + if (!didWarnAboutDirectlyAssigningPropsToState.has(componentName)) { + didWarnAboutDirectlyAssigningPropsToState.add(componentName); + error("%s: It is not recommended to assign props directly to state because updates to props won't be reflected in state. In most cases, it is better to use props directly.", componentName); + } + } + if (workInProgress2.mode & StrictLegacyMode) { + ReactStrictModeWarnings.recordLegacyContextWarning(workInProgress2, instance); + } + { + ReactStrictModeWarnings.recordUnsafeLifecycleWarnings(workInProgress2, instance); + } + } + instance.state = workInProgress2.memoizedState; + var getDerivedStateFromProps = ctor.getDerivedStateFromProps; + if (typeof getDerivedStateFromProps === "function") { + applyDerivedStateFromProps(workInProgress2, ctor, getDerivedStateFromProps, newProps); + instance.state = workInProgress2.memoizedState; + } + if (typeof ctor.getDerivedStateFromProps !== "function" && typeof instance.getSnapshotBeforeUpdate !== "function" && (typeof instance.UNSAFE_componentWillMount === "function" || typeof instance.componentWillMount === "function")) { + callComponentWillMount(workInProgress2, instance); + processUpdateQueue(workInProgress2, newProps, instance, renderLanes2); + instance.state = workInProgress2.memoizedState; + } + if (typeof instance.componentDidMount === "function") { + var fiberFlags = Update; + { + fiberFlags |= LayoutStatic; + } + if ((workInProgress2.mode & StrictEffectsMode) !== NoMode) { + fiberFlags |= MountLayoutDev; + } + workInProgress2.flags |= fiberFlags; + } + } + function resumeMountClassInstance(workInProgress2, ctor, newProps, renderLanes2) { + var instance = workInProgress2.stateNode; + var oldProps = workInProgress2.memoizedProps; + instance.props = oldProps; + var oldContext = instance.context; + var contextType = ctor.contextType; + var nextContext = emptyContextObject; + if (typeof contextType === "object" && contextType !== null) { + nextContext = readContext(contextType); + } else { + var nextLegacyUnmaskedContext = getUnmaskedContext(workInProgress2, ctor, true); + nextContext = getMaskedContext(workInProgress2, nextLegacyUnmaskedContext); + } + var getDerivedStateFromProps = ctor.getDerivedStateFromProps; + var hasNewLifecycles = typeof getDerivedStateFromProps === "function" || typeof instance.getSnapshotBeforeUpdate === "function"; + if (!hasNewLifecycles && (typeof instance.UNSAFE_componentWillReceiveProps === "function" || typeof instance.componentWillReceiveProps === "function")) { + if (oldProps !== newProps || oldContext !== nextContext) { + callComponentWillReceiveProps(workInProgress2, instance, newProps, nextContext); + } + } + resetHasForceUpdateBeforeProcessing(); + var oldState = workInProgress2.memoizedState; + var newState = instance.state = oldState; + processUpdateQueue(workInProgress2, newProps, instance, renderLanes2); + newState = workInProgress2.memoizedState; + if (oldProps === newProps && oldState === newState && !hasContextChanged() && !checkHasForceUpdateAfterProcessing()) { + if (typeof instance.componentDidMount === "function") { + var fiberFlags = Update; + { + fiberFlags |= LayoutStatic; + } + if ((workInProgress2.mode & StrictEffectsMode) !== NoMode) { + fiberFlags |= MountLayoutDev; + } + workInProgress2.flags |= fiberFlags; + } + return false; + } + if (typeof getDerivedStateFromProps === "function") { + applyDerivedStateFromProps(workInProgress2, ctor, getDerivedStateFromProps, newProps); + newState = workInProgress2.memoizedState; + } + var shouldUpdate = checkHasForceUpdateAfterProcessing() || checkShouldComponentUpdate(workInProgress2, ctor, oldProps, newProps, oldState, newState, nextContext); + if (shouldUpdate) { + if (!hasNewLifecycles && (typeof instance.UNSAFE_componentWillMount === "function" || typeof instance.componentWillMount === "function")) { + if (typeof instance.componentWillMount === "function") { + instance.componentWillMount(); + } + if (typeof instance.UNSAFE_componentWillMount === "function") { + instance.UNSAFE_componentWillMount(); + } + } + if (typeof instance.componentDidMount === "function") { + var _fiberFlags = Update; + { + _fiberFlags |= LayoutStatic; + } + if ((workInProgress2.mode & StrictEffectsMode) !== NoMode) { + _fiberFlags |= MountLayoutDev; + } + workInProgress2.flags |= _fiberFlags; + } + } else { + if (typeof instance.componentDidMount === "function") { + var _fiberFlags2 = Update; + { + _fiberFlags2 |= LayoutStatic; + } + if ((workInProgress2.mode & StrictEffectsMode) !== NoMode) { + _fiberFlags2 |= MountLayoutDev; + } + workInProgress2.flags |= _fiberFlags2; + } + workInProgress2.memoizedProps = newProps; + workInProgress2.memoizedState = newState; + } + instance.props = newProps; + instance.state = newState; + instance.context = nextContext; + return shouldUpdate; + } + function updateClassInstance(current2, workInProgress2, ctor, newProps, renderLanes2) { + var instance = workInProgress2.stateNode; + cloneUpdateQueue(current2, workInProgress2); + var unresolvedOldProps = workInProgress2.memoizedProps; + var oldProps = workInProgress2.type === workInProgress2.elementType ? unresolvedOldProps : resolveDefaultProps(workInProgress2.type, unresolvedOldProps); + instance.props = oldProps; + var unresolvedNewProps = workInProgress2.pendingProps; + var oldContext = instance.context; + var contextType = ctor.contextType; + var nextContext = emptyContextObject; + if (typeof contextType === "object" && contextType !== null) { + nextContext = readContext(contextType); + } else { + var nextUnmaskedContext = getUnmaskedContext(workInProgress2, ctor, true); + nextContext = getMaskedContext(workInProgress2, nextUnmaskedContext); + } + var getDerivedStateFromProps = ctor.getDerivedStateFromProps; + var hasNewLifecycles = typeof getDerivedStateFromProps === "function" || typeof instance.getSnapshotBeforeUpdate === "function"; + if (!hasNewLifecycles && (typeof instance.UNSAFE_componentWillReceiveProps === "function" || typeof instance.componentWillReceiveProps === "function")) { + if (unresolvedOldProps !== unresolvedNewProps || oldContext !== nextContext) { + callComponentWillReceiveProps(workInProgress2, instance, newProps, nextContext); + } + } + resetHasForceUpdateBeforeProcessing(); + var oldState = workInProgress2.memoizedState; + var newState = instance.state = oldState; + processUpdateQueue(workInProgress2, newProps, instance, renderLanes2); + newState = workInProgress2.memoizedState; + if (unresolvedOldProps === unresolvedNewProps && oldState === newState && !hasContextChanged() && !checkHasForceUpdateAfterProcessing() && !enableLazyContextPropagation) { + if (typeof instance.componentDidUpdate === "function") { + if (unresolvedOldProps !== current2.memoizedProps || oldState !== current2.memoizedState) { + workInProgress2.flags |= Update; + } + } + if (typeof instance.getSnapshotBeforeUpdate === "function") { + if (unresolvedOldProps !== current2.memoizedProps || oldState !== current2.memoizedState) { + workInProgress2.flags |= Snapshot; + } + } + return false; + } + if (typeof getDerivedStateFromProps === "function") { + applyDerivedStateFromProps(workInProgress2, ctor, getDerivedStateFromProps, newProps); + newState = workInProgress2.memoizedState; + } + var shouldUpdate = checkHasForceUpdateAfterProcessing() || checkShouldComponentUpdate(workInProgress2, ctor, oldProps, newProps, oldState, newState, nextContext) || // TODO: In some cases, we'll end up checking if context has changed twice, + // both before and after `shouldComponentUpdate` has been called. Not ideal, + // but I'm loath to refactor this function. This only happens for memoized + // components so it's not that common. + enableLazyContextPropagation; + if (shouldUpdate) { + if (!hasNewLifecycles && (typeof instance.UNSAFE_componentWillUpdate === "function" || typeof instance.componentWillUpdate === "function")) { + if (typeof instance.componentWillUpdate === "function") { + instance.componentWillUpdate(newProps, newState, nextContext); + } + if (typeof instance.UNSAFE_componentWillUpdate === "function") { + instance.UNSAFE_componentWillUpdate(newProps, newState, nextContext); + } + } + if (typeof instance.componentDidUpdate === "function") { + workInProgress2.flags |= Update; + } + if (typeof instance.getSnapshotBeforeUpdate === "function") { + workInProgress2.flags |= Snapshot; + } + } else { + if (typeof instance.componentDidUpdate === "function") { + if (unresolvedOldProps !== current2.memoizedProps || oldState !== current2.memoizedState) { + workInProgress2.flags |= Update; + } + } + if (typeof instance.getSnapshotBeforeUpdate === "function") { + if (unresolvedOldProps !== current2.memoizedProps || oldState !== current2.memoizedState) { + workInProgress2.flags |= Snapshot; + } + } + workInProgress2.memoizedProps = newProps; + workInProgress2.memoizedState = newState; + } + instance.props = newProps; + instance.state = newState; + instance.context = nextContext; + return shouldUpdate; + } + var didWarnAboutMaps; + var didWarnAboutGenerators; + var didWarnAboutStringRefs; + var ownerHasKeyUseWarning; + var ownerHasFunctionTypeWarning; + var warnForMissingKey = function(child, returnFiber) { + }; + { + didWarnAboutMaps = false; + didWarnAboutGenerators = false; + didWarnAboutStringRefs = {}; + ownerHasKeyUseWarning = {}; + ownerHasFunctionTypeWarning = {}; + warnForMissingKey = function(child, returnFiber) { + if (child === null || typeof child !== "object") { + return; + } + if (!child._store || child._store.validated || child.key != null) { + return; + } + if (typeof child._store !== "object") { + throw new Error("React Component in warnForMissingKey should have a _store. This error is likely caused by a bug in React. Please file an issue."); + } + child._store.validated = true; + var componentName = getComponentNameFromFiber(returnFiber) || "Component"; + if (ownerHasKeyUseWarning[componentName]) { + return; + } + ownerHasKeyUseWarning[componentName] = true; + error('Each child in a list should have a unique "key" prop. See https://reactjs.org/link/warning-keys for more information.'); + }; + } + function coerceRef(returnFiber, current2, element) { + var mixedRef = element.ref; + if (mixedRef !== null && typeof mixedRef !== "function" && typeof mixedRef !== "object") { + { + if ((returnFiber.mode & StrictLegacyMode || warnAboutStringRefs) && // We warn in ReactElement.js if owner and self are equal for string refs + // because these cannot be automatically converted to an arrow function + // using a codemod. Therefore, we don't have to warn about string refs again. + !(element._owner && element._self && element._owner.stateNode !== element._self)) { + var componentName = getComponentNameFromFiber(returnFiber) || "Component"; + if (!didWarnAboutStringRefs[componentName]) { + { + error('A string ref, "%s", has been found within a strict mode tree. String refs are a source of potential bugs and should be avoided. We recommend using useRef() or createRef() instead. Learn more about using refs safely here: https://reactjs.org/link/strict-mode-string-ref', mixedRef); + } + didWarnAboutStringRefs[componentName] = true; + } + } + } + if (element._owner) { + var owner = element._owner; + var inst; + if (owner) { + var ownerFiber = owner; + if (ownerFiber.tag !== ClassComponent) { + throw new Error("Function components cannot have string refs. We recommend using useRef() instead. Learn more about using refs safely here: https://reactjs.org/link/strict-mode-string-ref"); + } + inst = ownerFiber.stateNode; + } + if (!inst) { + throw new Error("Missing owner for string ref " + mixedRef + ". This error is likely caused by a bug in React. Please file an issue."); + } + var resolvedInst = inst; + { + checkPropStringCoercion(mixedRef, "ref"); + } + var stringRef = "" + mixedRef; + if (current2 !== null && current2.ref !== null && typeof current2.ref === "function" && current2.ref._stringRef === stringRef) { + return current2.ref; + } + var ref = function(value) { + var refs = resolvedInst.refs; + if (refs === emptyRefsObject) { + refs = resolvedInst.refs = {}; + } + if (value === null) { + delete refs[stringRef]; + } else { + refs[stringRef] = value; + } + }; + ref._stringRef = stringRef; + return ref; + } else { + if (typeof mixedRef !== "string") { + throw new Error("Expected ref to be a function, a string, an object returned by React.createRef(), or null."); + } + if (!element._owner) { + throw new Error("Element ref was specified as a string (" + mixedRef + ") but no owner was set. This could happen for one of the following reasons:\n1. You may be adding a ref to a function component\n2. You may be adding a ref to a component that was not created inside a component's render method\n3. You have multiple copies of React loaded\nSee https://reactjs.org/link/refs-must-have-owner for more information."); + } + } + } + return mixedRef; + } + function throwOnInvalidObjectType(returnFiber, newChild) { + var childString = Object.prototype.toString.call(newChild); + throw new Error("Objects are not valid as a React child (found: " + (childString === "[object Object]" ? "object with keys {" + Object.keys(newChild).join(", ") + "}" : childString) + "). If you meant to render a collection of children, use an array instead."); + } + function warnOnFunctionType(returnFiber) { + { + var componentName = getComponentNameFromFiber(returnFiber) || "Component"; + if (ownerHasFunctionTypeWarning[componentName]) { + return; + } + ownerHasFunctionTypeWarning[componentName] = true; + error("Functions are not valid as a React child. This may happen if you return a Component instead of from render. Or maybe you meant to call this function rather than return it."); + } + } + function resolveLazy(lazyType) { + var payload = lazyType._payload; + var init = lazyType._init; + return init(payload); + } + function ChildReconciler(shouldTrackSideEffects) { + function deleteChild(returnFiber, childToDelete) { + if (!shouldTrackSideEffects) { + return; + } + var deletions = returnFiber.deletions; + if (deletions === null) { + returnFiber.deletions = [childToDelete]; + returnFiber.flags |= ChildDeletion; + } else { + deletions.push(childToDelete); + } + } + function deleteRemainingChildren(returnFiber, currentFirstChild) { + if (!shouldTrackSideEffects) { + return null; + } + var childToDelete = currentFirstChild; + while (childToDelete !== null) { + deleteChild(returnFiber, childToDelete); + childToDelete = childToDelete.sibling; + } + return null; + } + function mapRemainingChildren(returnFiber, currentFirstChild) { + var existingChildren = /* @__PURE__ */ new Map(); + var existingChild = currentFirstChild; + while (existingChild !== null) { + if (existingChild.key !== null) { + existingChildren.set(existingChild.key, existingChild); + } else { + existingChildren.set(existingChild.index, existingChild); + } + existingChild = existingChild.sibling; + } + return existingChildren; + } + function useFiber(fiber, pendingProps) { + var clone2 = createWorkInProgress(fiber, pendingProps); + clone2.index = 0; + clone2.sibling = null; + return clone2; + } + function placeChild(newFiber, lastPlacedIndex, newIndex) { + newFiber.index = newIndex; + if (!shouldTrackSideEffects) { + newFiber.flags |= Forked; + return lastPlacedIndex; + } + var current2 = newFiber.alternate; + if (current2 !== null) { + var oldIndex = current2.index; + if (oldIndex < lastPlacedIndex) { + newFiber.flags |= Placement; + return lastPlacedIndex; + } else { + return oldIndex; + } + } else { + newFiber.flags |= Placement; + return lastPlacedIndex; + } + } + function placeSingleChild(newFiber) { + if (shouldTrackSideEffects && newFiber.alternate === null) { + newFiber.flags |= Placement; + } + return newFiber; + } + function updateTextNode(returnFiber, current2, textContent, lanes) { + if (current2 === null || current2.tag !== HostText) { + var created = createFiberFromText(textContent, returnFiber.mode, lanes); + created.return = returnFiber; + return created; + } else { + var existing = useFiber(current2, textContent); + existing.return = returnFiber; + return existing; + } + } + function updateElement(returnFiber, current2, element, lanes) { + var elementType = element.type; + if (elementType === REACT_FRAGMENT_TYPE) { + return updateFragment2(returnFiber, current2, element.props.children, lanes, element.key); + } + if (current2 !== null) { + if (current2.elementType === elementType || // Keep this check inline so it only runs on the false path: + isCompatibleFamilyForHotReloading(current2, element) || // Lazy types should reconcile their resolved type. + // We need to do this after the Hot Reloading check above, + // because hot reloading has different semantics than prod because + // it doesn't resuspend. So we can't let the call below suspend. + typeof elementType === "object" && elementType !== null && elementType.$$typeof === REACT_LAZY_TYPE && resolveLazy(elementType) === current2.type) { + var existing = useFiber(current2, element.props); + existing.ref = coerceRef(returnFiber, current2, element); + existing.return = returnFiber; + { + existing._debugSource = element._source; + existing._debugOwner = element._owner; + } + return existing; + } + } + var created = createFiberFromElement(element, returnFiber.mode, lanes); + created.ref = coerceRef(returnFiber, current2, element); + created.return = returnFiber; + return created; + } + function updatePortal(returnFiber, current2, portal, lanes) { + if (current2 === null || current2.tag !== HostPortal || current2.stateNode.containerInfo !== portal.containerInfo || current2.stateNode.implementation !== portal.implementation) { + var created = createFiberFromPortal(portal, returnFiber.mode, lanes); + created.return = returnFiber; + return created; + } else { + var existing = useFiber(current2, portal.children || []); + existing.return = returnFiber; + return existing; + } + } + function updateFragment2(returnFiber, current2, fragment, lanes, key) { + if (current2 === null || current2.tag !== Fragment) { + var created = createFiberFromFragment(fragment, returnFiber.mode, lanes, key); + created.return = returnFiber; + return created; + } else { + var existing = useFiber(current2, fragment); + existing.return = returnFiber; + return existing; + } + } + function createChild(returnFiber, newChild, lanes) { + if (typeof newChild === "string" && newChild !== "" || typeof newChild === "number") { + var created = createFiberFromText("" + newChild, returnFiber.mode, lanes); + created.return = returnFiber; + return created; + } + if (typeof newChild === "object" && newChild !== null) { + switch (newChild.$$typeof) { + case REACT_ELEMENT_TYPE: { + var _created = createFiberFromElement(newChild, returnFiber.mode, lanes); + _created.ref = coerceRef(returnFiber, null, newChild); + _created.return = returnFiber; + return _created; + } + case REACT_PORTAL_TYPE: { + var _created2 = createFiberFromPortal(newChild, returnFiber.mode, lanes); + _created2.return = returnFiber; + return _created2; + } + case REACT_LAZY_TYPE: { + var payload = newChild._payload; + var init = newChild._init; + return createChild(returnFiber, init(payload), lanes); + } + } + if (isArray(newChild) || getIteratorFn(newChild)) { + var _created3 = createFiberFromFragment(newChild, returnFiber.mode, lanes, null); + _created3.return = returnFiber; + return _created3; + } + throwOnInvalidObjectType(returnFiber, newChild); + } + { + if (typeof newChild === "function") { + warnOnFunctionType(returnFiber); + } + } + return null; + } + function updateSlot(returnFiber, oldFiber, newChild, lanes) { + var key = oldFiber !== null ? oldFiber.key : null; + if (typeof newChild === "string" && newChild !== "" || typeof newChild === "number") { + if (key !== null) { + return null; + } + return updateTextNode(returnFiber, oldFiber, "" + newChild, lanes); + } + if (typeof newChild === "object" && newChild !== null) { + switch (newChild.$$typeof) { + case REACT_ELEMENT_TYPE: { + if (newChild.key === key) { + return updateElement(returnFiber, oldFiber, newChild, lanes); + } else { + return null; + } + } + case REACT_PORTAL_TYPE: { + if (newChild.key === key) { + return updatePortal(returnFiber, oldFiber, newChild, lanes); + } else { + return null; + } + } + case REACT_LAZY_TYPE: { + var payload = newChild._payload; + var init = newChild._init; + return updateSlot(returnFiber, oldFiber, init(payload), lanes); + } + } + if (isArray(newChild) || getIteratorFn(newChild)) { + if (key !== null) { + return null; + } + return updateFragment2(returnFiber, oldFiber, newChild, lanes, null); + } + throwOnInvalidObjectType(returnFiber, newChild); + } + { + if (typeof newChild === "function") { + warnOnFunctionType(returnFiber); + } + } + return null; + } + function updateFromMap(existingChildren, returnFiber, newIdx, newChild, lanes) { + if (typeof newChild === "string" && newChild !== "" || typeof newChild === "number") { + var matchedFiber = existingChildren.get(newIdx) || null; + return updateTextNode(returnFiber, matchedFiber, "" + newChild, lanes); + } + if (typeof newChild === "object" && newChild !== null) { + switch (newChild.$$typeof) { + case REACT_ELEMENT_TYPE: { + var _matchedFiber = existingChildren.get(newChild.key === null ? newIdx : newChild.key) || null; + return updateElement(returnFiber, _matchedFiber, newChild, lanes); + } + case REACT_PORTAL_TYPE: { + var _matchedFiber2 = existingChildren.get(newChild.key === null ? newIdx : newChild.key) || null; + return updatePortal(returnFiber, _matchedFiber2, newChild, lanes); + } + case REACT_LAZY_TYPE: + var payload = newChild._payload; + var init = newChild._init; + return updateFromMap(existingChildren, returnFiber, newIdx, init(payload), lanes); + } + if (isArray(newChild) || getIteratorFn(newChild)) { + var _matchedFiber3 = existingChildren.get(newIdx) || null; + return updateFragment2(returnFiber, _matchedFiber3, newChild, lanes, null); + } + throwOnInvalidObjectType(returnFiber, newChild); + } + { + if (typeof newChild === "function") { + warnOnFunctionType(returnFiber); + } + } + return null; + } + function warnOnInvalidKey(child, knownKeys, returnFiber) { + { + if (typeof child !== "object" || child === null) { + return knownKeys; + } + switch (child.$$typeof) { + case REACT_ELEMENT_TYPE: + case REACT_PORTAL_TYPE: + warnForMissingKey(child, returnFiber); + var key = child.key; + if (typeof key !== "string") { + break; + } + if (knownKeys === null) { + knownKeys = /* @__PURE__ */ new Set(); + knownKeys.add(key); + break; + } + if (!knownKeys.has(key)) { + knownKeys.add(key); + break; + } + error("Encountered two children with the same key, `%s`. Keys should be unique so that components maintain their identity across updates. Non-unique keys may cause children to be duplicated and/or omitted \u2014 the behavior is unsupported and could change in a future version.", key); + break; + case REACT_LAZY_TYPE: + var payload = child._payload; + var init = child._init; + warnOnInvalidKey(init(payload), knownKeys, returnFiber); + break; + } + } + return knownKeys; + } + function reconcileChildrenArray(returnFiber, currentFirstChild, newChildren, lanes) { + { + var knownKeys = null; + for (var i = 0; i < newChildren.length; i++) { + var child = newChildren[i]; + knownKeys = warnOnInvalidKey(child, knownKeys, returnFiber); + } + } + var resultingFirstChild = null; + var previousNewFiber = null; + var oldFiber = currentFirstChild; + var lastPlacedIndex = 0; + var newIdx = 0; + var nextOldFiber = null; + for (; oldFiber !== null && newIdx < newChildren.length; newIdx++) { + if (oldFiber.index > newIdx) { + nextOldFiber = oldFiber; + oldFiber = null; + } else { + nextOldFiber = oldFiber.sibling; + } + var newFiber = updateSlot(returnFiber, oldFiber, newChildren[newIdx], lanes); + if (newFiber === null) { + if (oldFiber === null) { + oldFiber = nextOldFiber; + } + break; + } + if (shouldTrackSideEffects) { + if (oldFiber && newFiber.alternate === null) { + deleteChild(returnFiber, oldFiber); + } + } + lastPlacedIndex = placeChild(newFiber, lastPlacedIndex, newIdx); + if (previousNewFiber === null) { + resultingFirstChild = newFiber; + } else { + previousNewFiber.sibling = newFiber; + } + previousNewFiber = newFiber; + oldFiber = nextOldFiber; + } + if (newIdx === newChildren.length) { + deleteRemainingChildren(returnFiber, oldFiber); + if (getIsHydrating()) { + var numberOfForks = newIdx; + pushTreeFork(returnFiber, numberOfForks); + } + return resultingFirstChild; + } + if (oldFiber === null) { + for (; newIdx < newChildren.length; newIdx++) { + var _newFiber = createChild(returnFiber, newChildren[newIdx], lanes); + if (_newFiber === null) { + continue; + } + lastPlacedIndex = placeChild(_newFiber, lastPlacedIndex, newIdx); + if (previousNewFiber === null) { + resultingFirstChild = _newFiber; + } else { + previousNewFiber.sibling = _newFiber; + } + previousNewFiber = _newFiber; + } + if (getIsHydrating()) { + var _numberOfForks = newIdx; + pushTreeFork(returnFiber, _numberOfForks); + } + return resultingFirstChild; + } + var existingChildren = mapRemainingChildren(returnFiber, oldFiber); + for (; newIdx < newChildren.length; newIdx++) { + var _newFiber2 = updateFromMap(existingChildren, returnFiber, newIdx, newChildren[newIdx], lanes); + if (_newFiber2 !== null) { + if (shouldTrackSideEffects) { + if (_newFiber2.alternate !== null) { + existingChildren.delete(_newFiber2.key === null ? newIdx : _newFiber2.key); + } + } + lastPlacedIndex = placeChild(_newFiber2, lastPlacedIndex, newIdx); + if (previousNewFiber === null) { + resultingFirstChild = _newFiber2; + } else { + previousNewFiber.sibling = _newFiber2; + } + previousNewFiber = _newFiber2; + } + } + if (shouldTrackSideEffects) { + existingChildren.forEach(function(child2) { + return deleteChild(returnFiber, child2); + }); + } + if (getIsHydrating()) { + var _numberOfForks2 = newIdx; + pushTreeFork(returnFiber, _numberOfForks2); + } + return resultingFirstChild; + } + function reconcileChildrenIterator(returnFiber, currentFirstChild, newChildrenIterable, lanes) { + var iteratorFn = getIteratorFn(newChildrenIterable); + if (typeof iteratorFn !== "function") { + throw new Error("An object is not an iterable. This error is likely caused by a bug in React. Please file an issue."); + } + { + if (typeof Symbol === "function" && // $FlowFixMe Flow doesn't know about toStringTag + newChildrenIterable[Symbol.toStringTag] === "Generator") { + if (!didWarnAboutGenerators) { + error("Using Generators as children is unsupported and will likely yield unexpected results because enumerating a generator mutates it. You may convert it to an array with `Array.from()` or the `[...spread]` operator before rendering. Keep in mind you might need to polyfill these features for older browsers."); + } + didWarnAboutGenerators = true; + } + if (newChildrenIterable.entries === iteratorFn) { + if (!didWarnAboutMaps) { + error("Using Maps as children is not supported. Use an array of keyed ReactElements instead."); + } + didWarnAboutMaps = true; + } + var _newChildren = iteratorFn.call(newChildrenIterable); + if (_newChildren) { + var knownKeys = null; + var _step = _newChildren.next(); + for (; !_step.done; _step = _newChildren.next()) { + var child = _step.value; + knownKeys = warnOnInvalidKey(child, knownKeys, returnFiber); + } + } + } + var newChildren = iteratorFn.call(newChildrenIterable); + if (newChildren == null) { + throw new Error("An iterable object provided no iterator."); + } + var resultingFirstChild = null; + var previousNewFiber = null; + var oldFiber = currentFirstChild; + var lastPlacedIndex = 0; + var newIdx = 0; + var nextOldFiber = null; + var step = newChildren.next(); + for (; oldFiber !== null && !step.done; newIdx++, step = newChildren.next()) { + if (oldFiber.index > newIdx) { + nextOldFiber = oldFiber; + oldFiber = null; + } else { + nextOldFiber = oldFiber.sibling; + } + var newFiber = updateSlot(returnFiber, oldFiber, step.value, lanes); + if (newFiber === null) { + if (oldFiber === null) { + oldFiber = nextOldFiber; + } + break; + } + if (shouldTrackSideEffects) { + if (oldFiber && newFiber.alternate === null) { + deleteChild(returnFiber, oldFiber); + } + } + lastPlacedIndex = placeChild(newFiber, lastPlacedIndex, newIdx); + if (previousNewFiber === null) { + resultingFirstChild = newFiber; + } else { + previousNewFiber.sibling = newFiber; + } + previousNewFiber = newFiber; + oldFiber = nextOldFiber; + } + if (step.done) { + deleteRemainingChildren(returnFiber, oldFiber); + if (getIsHydrating()) { + var numberOfForks = newIdx; + pushTreeFork(returnFiber, numberOfForks); + } + return resultingFirstChild; + } + if (oldFiber === null) { + for (; !step.done; newIdx++, step = newChildren.next()) { + var _newFiber3 = createChild(returnFiber, step.value, lanes); + if (_newFiber3 === null) { + continue; + } + lastPlacedIndex = placeChild(_newFiber3, lastPlacedIndex, newIdx); + if (previousNewFiber === null) { + resultingFirstChild = _newFiber3; + } else { + previousNewFiber.sibling = _newFiber3; + } + previousNewFiber = _newFiber3; + } + if (getIsHydrating()) { + var _numberOfForks3 = newIdx; + pushTreeFork(returnFiber, _numberOfForks3); + } + return resultingFirstChild; + } + var existingChildren = mapRemainingChildren(returnFiber, oldFiber); + for (; !step.done; newIdx++, step = newChildren.next()) { + var _newFiber4 = updateFromMap(existingChildren, returnFiber, newIdx, step.value, lanes); + if (_newFiber4 !== null) { + if (shouldTrackSideEffects) { + if (_newFiber4.alternate !== null) { + existingChildren.delete(_newFiber4.key === null ? newIdx : _newFiber4.key); + } + } + lastPlacedIndex = placeChild(_newFiber4, lastPlacedIndex, newIdx); + if (previousNewFiber === null) { + resultingFirstChild = _newFiber4; + } else { + previousNewFiber.sibling = _newFiber4; + } + previousNewFiber = _newFiber4; + } + } + if (shouldTrackSideEffects) { + existingChildren.forEach(function(child2) { + return deleteChild(returnFiber, child2); + }); + } + if (getIsHydrating()) { + var _numberOfForks4 = newIdx; + pushTreeFork(returnFiber, _numberOfForks4); + } + return resultingFirstChild; + } + function reconcileSingleTextNode(returnFiber, currentFirstChild, textContent, lanes) { + if (currentFirstChild !== null && currentFirstChild.tag === HostText) { + deleteRemainingChildren(returnFiber, currentFirstChild.sibling); + var existing = useFiber(currentFirstChild, textContent); + existing.return = returnFiber; + return existing; + } + deleteRemainingChildren(returnFiber, currentFirstChild); + var created = createFiberFromText(textContent, returnFiber.mode, lanes); + created.return = returnFiber; + return created; + } + function reconcileSingleElement(returnFiber, currentFirstChild, element, lanes) { + var key = element.key; + var child = currentFirstChild; + while (child !== null) { + if (child.key === key) { + var elementType = element.type; + if (elementType === REACT_FRAGMENT_TYPE) { + if (child.tag === Fragment) { + deleteRemainingChildren(returnFiber, child.sibling); + var existing = useFiber(child, element.props.children); + existing.return = returnFiber; + { + existing._debugSource = element._source; + existing._debugOwner = element._owner; + } + return existing; + } + } else { + if (child.elementType === elementType || // Keep this check inline so it only runs on the false path: + isCompatibleFamilyForHotReloading(child, element) || // Lazy types should reconcile their resolved type. + // We need to do this after the Hot Reloading check above, + // because hot reloading has different semantics than prod because + // it doesn't resuspend. So we can't let the call below suspend. + typeof elementType === "object" && elementType !== null && elementType.$$typeof === REACT_LAZY_TYPE && resolveLazy(elementType) === child.type) { + deleteRemainingChildren(returnFiber, child.sibling); + var _existing = useFiber(child, element.props); + _existing.ref = coerceRef(returnFiber, child, element); + _existing.return = returnFiber; + { + _existing._debugSource = element._source; + _existing._debugOwner = element._owner; + } + return _existing; + } + } + deleteRemainingChildren(returnFiber, child); + break; + } else { + deleteChild(returnFiber, child); + } + child = child.sibling; + } + if (element.type === REACT_FRAGMENT_TYPE) { + var created = createFiberFromFragment(element.props.children, returnFiber.mode, lanes, element.key); + created.return = returnFiber; + return created; + } else { + var _created4 = createFiberFromElement(element, returnFiber.mode, lanes); + _created4.ref = coerceRef(returnFiber, currentFirstChild, element); + _created4.return = returnFiber; + return _created4; + } + } + function reconcileSinglePortal(returnFiber, currentFirstChild, portal, lanes) { + var key = portal.key; + var child = currentFirstChild; + while (child !== null) { + if (child.key === key) { + if (child.tag === HostPortal && child.stateNode.containerInfo === portal.containerInfo && child.stateNode.implementation === portal.implementation) { + deleteRemainingChildren(returnFiber, child.sibling); + var existing = useFiber(child, portal.children || []); + existing.return = returnFiber; + return existing; + } else { + deleteRemainingChildren(returnFiber, child); + break; + } + } else { + deleteChild(returnFiber, child); + } + child = child.sibling; + } + var created = createFiberFromPortal(portal, returnFiber.mode, lanes); + created.return = returnFiber; + return created; + } + function reconcileChildFibers2(returnFiber, currentFirstChild, newChild, lanes) { + var isUnkeyedTopLevelFragment = typeof newChild === "object" && newChild !== null && newChild.type === REACT_FRAGMENT_TYPE && newChild.key === null; + if (isUnkeyedTopLevelFragment) { + newChild = newChild.props.children; + } + if (typeof newChild === "object" && newChild !== null) { + switch (newChild.$$typeof) { + case REACT_ELEMENT_TYPE: + return placeSingleChild(reconcileSingleElement(returnFiber, currentFirstChild, newChild, lanes)); + case REACT_PORTAL_TYPE: + return placeSingleChild(reconcileSinglePortal(returnFiber, currentFirstChild, newChild, lanes)); + case REACT_LAZY_TYPE: + var payload = newChild._payload; + var init = newChild._init; + return reconcileChildFibers2(returnFiber, currentFirstChild, init(payload), lanes); + } + if (isArray(newChild)) { + return reconcileChildrenArray(returnFiber, currentFirstChild, newChild, lanes); + } + if (getIteratorFn(newChild)) { + return reconcileChildrenIterator(returnFiber, currentFirstChild, newChild, lanes); + } + throwOnInvalidObjectType(returnFiber, newChild); + } + if (typeof newChild === "string" && newChild !== "" || typeof newChild === "number") { + return placeSingleChild(reconcileSingleTextNode(returnFiber, currentFirstChild, "" + newChild, lanes)); + } + { + if (typeof newChild === "function") { + warnOnFunctionType(returnFiber); + } + } + return deleteRemainingChildren(returnFiber, currentFirstChild); + } + return reconcileChildFibers2; + } + var reconcileChildFibers = ChildReconciler(true); + var mountChildFibers = ChildReconciler(false); + function cloneChildFibers(current2, workInProgress2) { + if (current2 !== null && workInProgress2.child !== current2.child) { + throw new Error("Resuming work not yet implemented."); + } + if (workInProgress2.child === null) { + return; + } + var currentChild = workInProgress2.child; + var newChild = createWorkInProgress(currentChild, currentChild.pendingProps); + workInProgress2.child = newChild; + newChild.return = workInProgress2; + while (currentChild.sibling !== null) { + currentChild = currentChild.sibling; + newChild = newChild.sibling = createWorkInProgress(currentChild, currentChild.pendingProps); + newChild.return = workInProgress2; + } + newChild.sibling = null; + } + function resetChildFibers(workInProgress2, lanes) { + var child = workInProgress2.child; + while (child !== null) { + resetWorkInProgress(child, lanes); + child = child.sibling; + } + } + var NO_CONTEXT = {}; + var contextStackCursor$1 = createCursor(NO_CONTEXT); + var contextFiberStackCursor = createCursor(NO_CONTEXT); + var rootInstanceStackCursor = createCursor(NO_CONTEXT); + function requiredContext(c) { + if (c === NO_CONTEXT) { + throw new Error("Expected host context to exist. This error is likely caused by a bug in React. Please file an issue."); + } + return c; + } + function getRootHostContainer() { + var rootInstance = requiredContext(rootInstanceStackCursor.current); + return rootInstance; + } + function pushHostContainer(fiber, nextRootInstance) { + push(rootInstanceStackCursor, nextRootInstance, fiber); + push(contextFiberStackCursor, fiber, fiber); + push(contextStackCursor$1, NO_CONTEXT, fiber); + var nextRootContext = getRootHostContext(nextRootInstance); + pop(contextStackCursor$1, fiber); + push(contextStackCursor$1, nextRootContext, fiber); + } + function popHostContainer(fiber) { + pop(contextStackCursor$1, fiber); + pop(contextFiberStackCursor, fiber); + pop(rootInstanceStackCursor, fiber); + } + function getHostContext() { + var context = requiredContext(contextStackCursor$1.current); + return context; + } + function pushHostContext(fiber) { + var rootInstance = requiredContext(rootInstanceStackCursor.current); + var context = requiredContext(contextStackCursor$1.current); + var nextContext = getChildHostContext(context, fiber.type, rootInstance); + if (context === nextContext) { + return; + } + push(contextFiberStackCursor, fiber, fiber); + push(contextStackCursor$1, nextContext, fiber); + } + function popHostContext(fiber) { + if (contextFiberStackCursor.current !== fiber) { + return; + } + pop(contextStackCursor$1, fiber); + pop(contextFiberStackCursor, fiber); + } + var DefaultSuspenseContext = 0; + var SubtreeSuspenseContextMask = 1; + var InvisibleParentSuspenseContext = 1; + var ForceSuspenseFallback = 2; + var suspenseStackCursor = createCursor(DefaultSuspenseContext); + function hasSuspenseContext(parentContext, flag) { + return (parentContext & flag) !== 0; + } + function setDefaultShallowSuspenseContext(parentContext) { + return parentContext & SubtreeSuspenseContextMask; + } + function setShallowSuspenseContext(parentContext, shallowContext) { + return parentContext & SubtreeSuspenseContextMask | shallowContext; + } + function addSubtreeSuspenseContext(parentContext, subtreeContext) { + return parentContext | subtreeContext; + } + function pushSuspenseContext(fiber, newContext) { + push(suspenseStackCursor, newContext, fiber); + } + function popSuspenseContext(fiber) { + pop(suspenseStackCursor, fiber); + } + function shouldCaptureSuspense(workInProgress2, hasInvisibleParent) { + var nextState = workInProgress2.memoizedState; + if (nextState !== null) { + if (nextState.dehydrated !== null) { + return true; + } + return false; + } + var props = workInProgress2.memoizedProps; + { + return true; + } + } + function findFirstSuspended(row) { + var node = row; + while (node !== null) { + if (node.tag === SuspenseComponent) { + var state = node.memoizedState; + if (state !== null) { + var dehydrated = state.dehydrated; + if (dehydrated === null || isSuspenseInstancePending(dehydrated) || isSuspenseInstanceFallback(dehydrated)) { + return node; + } + } + } else if (node.tag === SuspenseListComponent && // revealOrder undefined can't be trusted because it don't + // keep track of whether it suspended or not. + node.memoizedProps.revealOrder !== void 0) { + var didSuspend = (node.flags & DidCapture) !== NoFlags; + if (didSuspend) { + return node; + } + } else if (node.child !== null) { + node.child.return = node; + node = node.child; + continue; + } + if (node === row) { + return null; + } + while (node.sibling === null) { + if (node.return === null || node.return === row) { + return null; + } + node = node.return; + } + node.sibling.return = node.return; + node = node.sibling; + } + return null; + } + var NoFlags$1 = ( + /* */ + 0 + ); + var HasEffect = ( + /* */ + 1 + ); + var Insertion = ( + /* */ + 2 + ); + var Layout = ( + /* */ + 4 + ); + var Passive$1 = ( + /* */ + 8 + ); + var workInProgressSources = []; + function resetWorkInProgressVersions() { + for (var i = 0; i < workInProgressSources.length; i++) { + var mutableSource = workInProgressSources[i]; + if (isPrimaryRenderer) { + mutableSource._workInProgressVersionPrimary = null; + } else { + mutableSource._workInProgressVersionSecondary = null; + } + } + workInProgressSources.length = 0; + } + function registerMutableSourceForHydration(root, mutableSource) { + var getVersion = mutableSource._getVersion; + var version = getVersion(mutableSource._source); + if (root.mutableSourceEagerHydrationData == null) { + root.mutableSourceEagerHydrationData = [mutableSource, version]; + } else { + root.mutableSourceEagerHydrationData.push(mutableSource, version); + } + } + var ReactCurrentDispatcher$1 = ReactSharedInternals.ReactCurrentDispatcher, ReactCurrentBatchConfig$1 = ReactSharedInternals.ReactCurrentBatchConfig; + var didWarnAboutMismatchedHooksForComponent; + var didWarnUncachedGetSnapshot; + { + didWarnAboutMismatchedHooksForComponent = /* @__PURE__ */ new Set(); + } + var renderLanes = NoLanes; + var currentlyRenderingFiber$1 = null; + var currentHook = null; + var workInProgressHook = null; + var didScheduleRenderPhaseUpdate = false; + var didScheduleRenderPhaseUpdateDuringThisPass = false; + var localIdCounter = 0; + var globalClientIdCounter = 0; + var RE_RENDER_LIMIT = 25; + var currentHookNameInDev = null; + var hookTypesDev = null; + var hookTypesUpdateIndexDev = -1; + var ignorePreviousDependencies = false; + function mountHookTypesDev() { + { + var hookName = currentHookNameInDev; + if (hookTypesDev === null) { + hookTypesDev = [hookName]; + } else { + hookTypesDev.push(hookName); + } + } + } + function updateHookTypesDev() { + { + var hookName = currentHookNameInDev; + if (hookTypesDev !== null) { + hookTypesUpdateIndexDev++; + if (hookTypesDev[hookTypesUpdateIndexDev] !== hookName) { + warnOnHookMismatchInDev(hookName); + } + } + } + } + function checkDepsAreArrayDev(deps) { + { + if (deps !== void 0 && deps !== null && !isArray(deps)) { + error("%s received a final argument that is not an array (instead, received `%s`). When specified, the final argument must be an array.", currentHookNameInDev, typeof deps); + } + } + } + function warnOnHookMismatchInDev(currentHookName) { + { + var componentName = getComponentNameFromFiber(currentlyRenderingFiber$1); + if (!didWarnAboutMismatchedHooksForComponent.has(componentName)) { + didWarnAboutMismatchedHooksForComponent.add(componentName); + if (hookTypesDev !== null) { + var table = ""; + var secondColumnStart = 30; + for (var i = 0; i <= hookTypesUpdateIndexDev; i++) { + var oldHookName = hookTypesDev[i]; + var newHookName = i === hookTypesUpdateIndexDev ? currentHookName : oldHookName; + var row = i + 1 + ". " + oldHookName; + while (row.length < secondColumnStart) { + row += " "; + } + row += newHookName + "\n"; + table += row; + } + error("React has detected a change in the order of Hooks called by %s. This will lead to bugs and errors if not fixed. For more information, read the Rules of Hooks: https://reactjs.org/link/rules-of-hooks\n\n Previous render Next render\n ------------------------------------------------------\n%s ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", componentName, table); + } + } + } + } + function throwInvalidHookError() { + throw new Error("Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:\n1. You might have mismatching versions of React and the renderer (such as React DOM)\n2. You might be breaking the Rules of Hooks\n3. You might have more than one copy of React in the same app\nSee https://reactjs.org/link/invalid-hook-call for tips about how to debug and fix this problem."); + } + function areHookInputsEqual(nextDeps, prevDeps) { + { + if (ignorePreviousDependencies) { + return false; + } + } + if (prevDeps === null) { + { + error("%s received a final argument during this render, but not during the previous render. Even though the final argument is optional, its type cannot change between renders.", currentHookNameInDev); + } + return false; + } + { + if (nextDeps.length !== prevDeps.length) { + error("The final argument passed to %s changed size between renders. The order and size of this array must remain constant.\n\nPrevious: %s\nIncoming: %s", currentHookNameInDev, "[" + prevDeps.join(", ") + "]", "[" + nextDeps.join(", ") + "]"); + } + } + for (var i = 0; i < prevDeps.length && i < nextDeps.length; i++) { + if (objectIs(nextDeps[i], prevDeps[i])) { + continue; + } + return false; + } + return true; + } + function renderWithHooks(current2, workInProgress2, Component, props, secondArg, nextRenderLanes) { + renderLanes = nextRenderLanes; + currentlyRenderingFiber$1 = workInProgress2; + { + hookTypesDev = current2 !== null ? current2._debugHookTypes : null; + hookTypesUpdateIndexDev = -1; + ignorePreviousDependencies = current2 !== null && current2.type !== workInProgress2.type; + } + workInProgress2.memoizedState = null; + workInProgress2.updateQueue = null; + workInProgress2.lanes = NoLanes; + { + if (current2 !== null && current2.memoizedState !== null) { + ReactCurrentDispatcher$1.current = HooksDispatcherOnUpdateInDEV; + } else if (hookTypesDev !== null) { + ReactCurrentDispatcher$1.current = HooksDispatcherOnMountWithHookTypesInDEV; + } else { + ReactCurrentDispatcher$1.current = HooksDispatcherOnMountInDEV; + } + } + var children = Component(props, secondArg); + if (didScheduleRenderPhaseUpdateDuringThisPass) { + var numberOfReRenders = 0; + do { + didScheduleRenderPhaseUpdateDuringThisPass = false; + localIdCounter = 0; + if (numberOfReRenders >= RE_RENDER_LIMIT) { + throw new Error("Too many re-renders. React limits the number of renders to prevent an infinite loop."); + } + numberOfReRenders += 1; + { + ignorePreviousDependencies = false; + } + currentHook = null; + workInProgressHook = null; + workInProgress2.updateQueue = null; + { + hookTypesUpdateIndexDev = -1; + } + ReactCurrentDispatcher$1.current = HooksDispatcherOnRerenderInDEV; + children = Component(props, secondArg); + } while (didScheduleRenderPhaseUpdateDuringThisPass); + } + ReactCurrentDispatcher$1.current = ContextOnlyDispatcher; + { + workInProgress2._debugHookTypes = hookTypesDev; + } + var didRenderTooFewHooks = currentHook !== null && currentHook.next !== null; + renderLanes = NoLanes; + currentlyRenderingFiber$1 = null; + currentHook = null; + workInProgressHook = null; + { + currentHookNameInDev = null; + hookTypesDev = null; + hookTypesUpdateIndexDev = -1; + if (current2 !== null && (current2.flags & StaticMask) !== (workInProgress2.flags & StaticMask) && // Disable this warning in legacy mode, because legacy Suspense is weird + // and creates false positives. To make this work in legacy mode, we'd + // need to mark fibers that commit in an incomplete state, somehow. For + // now I'll disable the warning that most of the bugs that would trigger + // it are either exclusive to concurrent mode or exist in both. + (current2.mode & ConcurrentMode) !== NoMode) { + error("Internal React error: Expected static flag was missing. Please notify the React team."); + } + } + didScheduleRenderPhaseUpdate = false; + if (didRenderTooFewHooks) { + throw new Error("Rendered fewer hooks than expected. This may be caused by an accidental early return statement."); + } + return children; + } + function checkDidRenderIdHook() { + var didRenderIdHook = localIdCounter !== 0; + localIdCounter = 0; + return didRenderIdHook; + } + function bailoutHooks(current2, workInProgress2, lanes) { + workInProgress2.updateQueue = current2.updateQueue; + if ((workInProgress2.mode & StrictEffectsMode) !== NoMode) { + workInProgress2.flags &= ~(MountPassiveDev | MountLayoutDev | Passive | Update); + } else { + workInProgress2.flags &= ~(Passive | Update); + } + current2.lanes = removeLanes(current2.lanes, lanes); + } + function resetHooksAfterThrow() { + ReactCurrentDispatcher$1.current = ContextOnlyDispatcher; + if (didScheduleRenderPhaseUpdate) { + var hook = currentlyRenderingFiber$1.memoizedState; + while (hook !== null) { + var queue = hook.queue; + if (queue !== null) { + queue.pending = null; + } + hook = hook.next; + } + didScheduleRenderPhaseUpdate = false; + } + renderLanes = NoLanes; + currentlyRenderingFiber$1 = null; + currentHook = null; + workInProgressHook = null; + { + hookTypesDev = null; + hookTypesUpdateIndexDev = -1; + currentHookNameInDev = null; + isUpdatingOpaqueValueInRenderPhase = false; + } + didScheduleRenderPhaseUpdateDuringThisPass = false; + localIdCounter = 0; + } + function mountWorkInProgressHook() { + var hook = { + memoizedState: null, + baseState: null, + baseQueue: null, + queue: null, + next: null + }; + if (workInProgressHook === null) { + currentlyRenderingFiber$1.memoizedState = workInProgressHook = hook; + } else { + workInProgressHook = workInProgressHook.next = hook; + } + return workInProgressHook; + } + function updateWorkInProgressHook() { + var nextCurrentHook; + if (currentHook === null) { + var current2 = currentlyRenderingFiber$1.alternate; + if (current2 !== null) { + nextCurrentHook = current2.memoizedState; + } else { + nextCurrentHook = null; + } + } else { + nextCurrentHook = currentHook.next; + } + var nextWorkInProgressHook; + if (workInProgressHook === null) { + nextWorkInProgressHook = currentlyRenderingFiber$1.memoizedState; + } else { + nextWorkInProgressHook = workInProgressHook.next; + } + if (nextWorkInProgressHook !== null) { + workInProgressHook = nextWorkInProgressHook; + nextWorkInProgressHook = workInProgressHook.next; + currentHook = nextCurrentHook; + } else { + if (nextCurrentHook === null) { + throw new Error("Rendered more hooks than during the previous render."); + } + currentHook = nextCurrentHook; + var newHook = { + memoizedState: currentHook.memoizedState, + baseState: currentHook.baseState, + baseQueue: currentHook.baseQueue, + queue: currentHook.queue, + next: null + }; + if (workInProgressHook === null) { + currentlyRenderingFiber$1.memoizedState = workInProgressHook = newHook; + } else { + workInProgressHook = workInProgressHook.next = newHook; + } + } + return workInProgressHook; + } + function createFunctionComponentUpdateQueue() { + return { + lastEffect: null, + stores: null + }; + } + function basicStateReducer(state, action) { + return typeof action === "function" ? action(state) : action; + } + function mountReducer(reducer, initialArg, init) { + var hook = mountWorkInProgressHook(); + var initialState; + if (init !== void 0) { + initialState = init(initialArg); + } else { + initialState = initialArg; + } + hook.memoizedState = hook.baseState = initialState; + var queue = { + pending: null, + interleaved: null, + lanes: NoLanes, + dispatch: null, + lastRenderedReducer: reducer, + lastRenderedState: initialState + }; + hook.queue = queue; + var dispatch = queue.dispatch = dispatchReducerAction.bind(null, currentlyRenderingFiber$1, queue); + return [hook.memoizedState, dispatch]; + } + function updateReducer(reducer, initialArg, init) { + var hook = updateWorkInProgressHook(); + var queue = hook.queue; + if (queue === null) { + throw new Error("Should have a queue. This is likely a bug in React. Please file an issue."); + } + queue.lastRenderedReducer = reducer; + var current2 = currentHook; + var baseQueue = current2.baseQueue; + var pendingQueue = queue.pending; + if (pendingQueue !== null) { + if (baseQueue !== null) { + var baseFirst = baseQueue.next; + var pendingFirst = pendingQueue.next; + baseQueue.next = pendingFirst; + pendingQueue.next = baseFirst; + } + { + if (current2.baseQueue !== baseQueue) { + error("Internal error: Expected work-in-progress queue to be a clone. This is a bug in React."); + } + } + current2.baseQueue = baseQueue = pendingQueue; + queue.pending = null; + } + if (baseQueue !== null) { + var first = baseQueue.next; + var newState = current2.baseState; + var newBaseState = null; + var newBaseQueueFirst = null; + var newBaseQueueLast = null; + var update = first; + do { + var updateLane = update.lane; + if (!isSubsetOfLanes(renderLanes, updateLane)) { + var clone2 = { + lane: updateLane, + action: update.action, + hasEagerState: update.hasEagerState, + eagerState: update.eagerState, + next: null + }; + if (newBaseQueueLast === null) { + newBaseQueueFirst = newBaseQueueLast = clone2; + newBaseState = newState; + } else { + newBaseQueueLast = newBaseQueueLast.next = clone2; + } + currentlyRenderingFiber$1.lanes = mergeLanes(currentlyRenderingFiber$1.lanes, updateLane); + markSkippedUpdateLanes(updateLane); + } else { + if (newBaseQueueLast !== null) { + var _clone = { + // This update is going to be committed so we never want uncommit + // it. Using NoLane works because 0 is a subset of all bitmasks, so + // this will never be skipped by the check above. + lane: NoLane, + action: update.action, + hasEagerState: update.hasEagerState, + eagerState: update.eagerState, + next: null + }; + newBaseQueueLast = newBaseQueueLast.next = _clone; + } + if (update.hasEagerState) { + newState = update.eagerState; + } else { + var action = update.action; + newState = reducer(newState, action); + } + } + update = update.next; + } while (update !== null && update !== first); + if (newBaseQueueLast === null) { + newBaseState = newState; + } else { + newBaseQueueLast.next = newBaseQueueFirst; + } + if (!objectIs(newState, hook.memoizedState)) { + markWorkInProgressReceivedUpdate(); + } + hook.memoizedState = newState; + hook.baseState = newBaseState; + hook.baseQueue = newBaseQueueLast; + queue.lastRenderedState = newState; + } + var lastInterleaved = queue.interleaved; + if (lastInterleaved !== null) { + var interleaved = lastInterleaved; + do { + var interleavedLane = interleaved.lane; + currentlyRenderingFiber$1.lanes = mergeLanes(currentlyRenderingFiber$1.lanes, interleavedLane); + markSkippedUpdateLanes(interleavedLane); + interleaved = interleaved.next; + } while (interleaved !== lastInterleaved); + } else if (baseQueue === null) { + queue.lanes = NoLanes; + } + var dispatch = queue.dispatch; + return [hook.memoizedState, dispatch]; + } + function rerenderReducer(reducer, initialArg, init) { + var hook = updateWorkInProgressHook(); + var queue = hook.queue; + if (queue === null) { + throw new Error("Should have a queue. This is likely a bug in React. Please file an issue."); + } + queue.lastRenderedReducer = reducer; + var dispatch = queue.dispatch; + var lastRenderPhaseUpdate = queue.pending; + var newState = hook.memoizedState; + if (lastRenderPhaseUpdate !== null) { + queue.pending = null; + var firstRenderPhaseUpdate = lastRenderPhaseUpdate.next; + var update = firstRenderPhaseUpdate; + do { + var action = update.action; + newState = reducer(newState, action); + update = update.next; + } while (update !== firstRenderPhaseUpdate); + if (!objectIs(newState, hook.memoizedState)) { + markWorkInProgressReceivedUpdate(); + } + hook.memoizedState = newState; + if (hook.baseQueue === null) { + hook.baseState = newState; + } + queue.lastRenderedState = newState; + } + return [newState, dispatch]; + } + function mountMutableSource(source, getSnapshot, subscribe2) { + { + return void 0; + } + } + function updateMutableSource(source, getSnapshot, subscribe2) { + { + return void 0; + } + } + function mountSyncExternalStore(subscribe2, getSnapshot, getServerSnapshot) { + var fiber = currentlyRenderingFiber$1; + var hook = mountWorkInProgressHook(); + var nextSnapshot; + var isHydrating2 = getIsHydrating(); + if (isHydrating2) { + if (getServerSnapshot === void 0) { + throw new Error("Missing getServerSnapshot, which is required for server-rendered content. Will revert to client rendering."); + } + nextSnapshot = getServerSnapshot(); + { + if (!didWarnUncachedGetSnapshot) { + if (nextSnapshot !== getServerSnapshot()) { + error("The result of getServerSnapshot should be cached to avoid an infinite loop"); + didWarnUncachedGetSnapshot = true; + } + } + } + } else { + nextSnapshot = getSnapshot(); + { + if (!didWarnUncachedGetSnapshot) { + var cachedSnapshot = getSnapshot(); + if (!objectIs(nextSnapshot, cachedSnapshot)) { + error("The result of getSnapshot should be cached to avoid an infinite loop"); + didWarnUncachedGetSnapshot = true; + } + } + } + var root = getWorkInProgressRoot(); + if (root === null) { + throw new Error("Expected a work-in-progress root. This is a bug in React. Please file an issue."); + } + if (!includesBlockingLane(root, renderLanes)) { + pushStoreConsistencyCheck(fiber, getSnapshot, nextSnapshot); + } + } + hook.memoizedState = nextSnapshot; + var inst = { + value: nextSnapshot, + getSnapshot + }; + hook.queue = inst; + mountEffect(subscribeToStore.bind(null, fiber, inst, subscribe2), [subscribe2]); + fiber.flags |= Passive; + pushEffect(HasEffect | Passive$1, updateStoreInstance.bind(null, fiber, inst, nextSnapshot, getSnapshot), void 0, null); + return nextSnapshot; + } + function updateSyncExternalStore(subscribe2, getSnapshot, getServerSnapshot) { + var fiber = currentlyRenderingFiber$1; + var hook = updateWorkInProgressHook(); + var nextSnapshot = getSnapshot(); + { + if (!didWarnUncachedGetSnapshot) { + var cachedSnapshot = getSnapshot(); + if (!objectIs(nextSnapshot, cachedSnapshot)) { + error("The result of getSnapshot should be cached to avoid an infinite loop"); + didWarnUncachedGetSnapshot = true; + } + } + } + var prevSnapshot = hook.memoizedState; + var snapshotChanged = !objectIs(prevSnapshot, nextSnapshot); + if (snapshotChanged) { + hook.memoizedState = nextSnapshot; + markWorkInProgressReceivedUpdate(); + } + var inst = hook.queue; + updateEffect(subscribeToStore.bind(null, fiber, inst, subscribe2), [subscribe2]); + if (inst.getSnapshot !== getSnapshot || snapshotChanged || // Check if the susbcribe function changed. We can save some memory by + // checking whether we scheduled a subscription effect above. + workInProgressHook !== null && workInProgressHook.memoizedState.tag & HasEffect) { + fiber.flags |= Passive; + pushEffect(HasEffect | Passive$1, updateStoreInstance.bind(null, fiber, inst, nextSnapshot, getSnapshot), void 0, null); + var root = getWorkInProgressRoot(); + if (root === null) { + throw new Error("Expected a work-in-progress root. This is a bug in React. Please file an issue."); + } + if (!includesBlockingLane(root, renderLanes)) { + pushStoreConsistencyCheck(fiber, getSnapshot, nextSnapshot); + } + } + return nextSnapshot; + } + function pushStoreConsistencyCheck(fiber, getSnapshot, renderedSnapshot) { + fiber.flags |= StoreConsistency; + var check = { + getSnapshot, + value: renderedSnapshot + }; + var componentUpdateQueue = currentlyRenderingFiber$1.updateQueue; + if (componentUpdateQueue === null) { + componentUpdateQueue = createFunctionComponentUpdateQueue(); + currentlyRenderingFiber$1.updateQueue = componentUpdateQueue; + componentUpdateQueue.stores = [check]; + } else { + var stores = componentUpdateQueue.stores; + if (stores === null) { + componentUpdateQueue.stores = [check]; + } else { + stores.push(check); + } + } + } + function updateStoreInstance(fiber, inst, nextSnapshot, getSnapshot) { + inst.value = nextSnapshot; + inst.getSnapshot = getSnapshot; + if (checkIfSnapshotChanged(inst)) { + forceStoreRerender(fiber); + } + } + function subscribeToStore(fiber, inst, subscribe2) { + var handleStoreChange = function() { + if (checkIfSnapshotChanged(inst)) { + forceStoreRerender(fiber); + } + }; + return subscribe2(handleStoreChange); + } + function checkIfSnapshotChanged(inst) { + var latestGetSnapshot = inst.getSnapshot; + var prevValue = inst.value; + try { + var nextValue = latestGetSnapshot(); + return !objectIs(prevValue, nextValue); + } catch (error2) { + return true; + } + } + function forceStoreRerender(fiber) { + var root = enqueueConcurrentRenderForLane(fiber, SyncLane); + if (root !== null) { + scheduleUpdateOnFiber(root, fiber, SyncLane, NoTimestamp); + } + } + function mountState(initialState) { + var hook = mountWorkInProgressHook(); + if (typeof initialState === "function") { + initialState = initialState(); + } + hook.memoizedState = hook.baseState = initialState; + var queue = { + pending: null, + interleaved: null, + lanes: NoLanes, + dispatch: null, + lastRenderedReducer: basicStateReducer, + lastRenderedState: initialState + }; + hook.queue = queue; + var dispatch = queue.dispatch = dispatchSetState.bind(null, currentlyRenderingFiber$1, queue); + return [hook.memoizedState, dispatch]; + } + function updateState(initialState) { + return updateReducer(basicStateReducer); + } + function rerenderState(initialState) { + return rerenderReducer(basicStateReducer); + } + function pushEffect(tag, create, destroy, deps) { + var effect = { + tag, + create, + destroy, + deps, + // Circular + next: null + }; + var componentUpdateQueue = currentlyRenderingFiber$1.updateQueue; + if (componentUpdateQueue === null) { + componentUpdateQueue = createFunctionComponentUpdateQueue(); + currentlyRenderingFiber$1.updateQueue = componentUpdateQueue; + componentUpdateQueue.lastEffect = effect.next = effect; + } else { + var lastEffect = componentUpdateQueue.lastEffect; + if (lastEffect === null) { + componentUpdateQueue.lastEffect = effect.next = effect; + } else { + var firstEffect = lastEffect.next; + lastEffect.next = effect; + effect.next = firstEffect; + componentUpdateQueue.lastEffect = effect; + } + } + return effect; + } + function mountRef(initialValue) { + var hook = mountWorkInProgressHook(); + { + var _ref2 = { + current: initialValue + }; + hook.memoizedState = _ref2; + return _ref2; + } + } + function updateRef(initialValue) { + var hook = updateWorkInProgressHook(); + return hook.memoizedState; + } + function mountEffectImpl(fiberFlags, hookFlags, create, deps) { + var hook = mountWorkInProgressHook(); + var nextDeps = deps === void 0 ? null : deps; + currentlyRenderingFiber$1.flags |= fiberFlags; + hook.memoizedState = pushEffect(HasEffect | hookFlags, create, void 0, nextDeps); + } + function updateEffectImpl(fiberFlags, hookFlags, create, deps) { + var hook = updateWorkInProgressHook(); + var nextDeps = deps === void 0 ? null : deps; + var destroy = void 0; + if (currentHook !== null) { + var prevEffect = currentHook.memoizedState; + destroy = prevEffect.destroy; + if (nextDeps !== null) { + var prevDeps = prevEffect.deps; + if (areHookInputsEqual(nextDeps, prevDeps)) { + hook.memoizedState = pushEffect(hookFlags, create, destroy, nextDeps); + return; + } + } + } + currentlyRenderingFiber$1.flags |= fiberFlags; + hook.memoizedState = pushEffect(HasEffect | hookFlags, create, destroy, nextDeps); + } + function mountEffect(create, deps) { + if ((currentlyRenderingFiber$1.mode & StrictEffectsMode) !== NoMode) { + return mountEffectImpl(MountPassiveDev | Passive | PassiveStatic, Passive$1, create, deps); + } else { + return mountEffectImpl(Passive | PassiveStatic, Passive$1, create, deps); + } + } + function updateEffect(create, deps) { + return updateEffectImpl(Passive, Passive$1, create, deps); + } + function mountInsertionEffect(create, deps) { + return mountEffectImpl(Update, Insertion, create, deps); + } + function updateInsertionEffect(create, deps) { + return updateEffectImpl(Update, Insertion, create, deps); + } + function mountLayoutEffect(create, deps) { + var fiberFlags = Update; + { + fiberFlags |= LayoutStatic; + } + if ((currentlyRenderingFiber$1.mode & StrictEffectsMode) !== NoMode) { + fiberFlags |= MountLayoutDev; + } + return mountEffectImpl(fiberFlags, Layout, create, deps); + } + function updateLayoutEffect(create, deps) { + return updateEffectImpl(Update, Layout, create, deps); + } + function imperativeHandleEffect(create, ref) { + if (typeof ref === "function") { + var refCallback = ref; + var _inst = create(); + refCallback(_inst); + return function() { + refCallback(null); + }; + } else if (ref !== null && ref !== void 0) { + var refObject = ref; + { + if (!refObject.hasOwnProperty("current")) { + error("Expected useImperativeHandle() first argument to either be a ref callback or React.createRef() object. Instead received: %s.", "an object with keys {" + Object.keys(refObject).join(", ") + "}"); + } + } + var _inst2 = create(); + refObject.current = _inst2; + return function() { + refObject.current = null; + }; + } + } + function mountImperativeHandle(ref, create, deps) { + { + if (typeof create !== "function") { + error("Expected useImperativeHandle() second argument to be a function that creates a handle. Instead received: %s.", create !== null ? typeof create : "null"); + } + } + var effectDeps = deps !== null && deps !== void 0 ? deps.concat([ref]) : null; + var fiberFlags = Update; + { + fiberFlags |= LayoutStatic; + } + if ((currentlyRenderingFiber$1.mode & StrictEffectsMode) !== NoMode) { + fiberFlags |= MountLayoutDev; + } + return mountEffectImpl(fiberFlags, Layout, imperativeHandleEffect.bind(null, create, ref), effectDeps); + } + function updateImperativeHandle(ref, create, deps) { + { + if (typeof create !== "function") { + error("Expected useImperativeHandle() second argument to be a function that creates a handle. Instead received: %s.", create !== null ? typeof create : "null"); + } + } + var effectDeps = deps !== null && deps !== void 0 ? deps.concat([ref]) : null; + return updateEffectImpl(Update, Layout, imperativeHandleEffect.bind(null, create, ref), effectDeps); + } + function mountDebugValue(value, formatterFn) { + } + var updateDebugValue = mountDebugValue; + function mountCallback(callback, deps) { + var hook = mountWorkInProgressHook(); + var nextDeps = deps === void 0 ? null : deps; + hook.memoizedState = [callback, nextDeps]; + return callback; + } + function updateCallback(callback, deps) { + var hook = updateWorkInProgressHook(); + var nextDeps = deps === void 0 ? null : deps; + var prevState = hook.memoizedState; + if (prevState !== null) { + if (nextDeps !== null) { + var prevDeps = prevState[1]; + if (areHookInputsEqual(nextDeps, prevDeps)) { + return prevState[0]; + } + } + } + hook.memoizedState = [callback, nextDeps]; + return callback; + } + function mountMemo(nextCreate, deps) { + var hook = mountWorkInProgressHook(); + var nextDeps = deps === void 0 ? null : deps; + var nextValue = nextCreate(); + hook.memoizedState = [nextValue, nextDeps]; + return nextValue; + } + function updateMemo(nextCreate, deps) { + var hook = updateWorkInProgressHook(); + var nextDeps = deps === void 0 ? null : deps; + var prevState = hook.memoizedState; + if (prevState !== null) { + if (nextDeps !== null) { + var prevDeps = prevState[1]; + if (areHookInputsEqual(nextDeps, prevDeps)) { + return prevState[0]; + } + } + } + var nextValue = nextCreate(); + hook.memoizedState = [nextValue, nextDeps]; + return nextValue; + } + function mountDeferredValue(value) { + var hook = mountWorkInProgressHook(); + hook.memoizedState = value; + return value; + } + function updateDeferredValue(value) { + var hook = updateWorkInProgressHook(); + var resolvedCurrentHook = currentHook; + var prevValue = resolvedCurrentHook.memoizedState; + return updateDeferredValueImpl(hook, prevValue, value); + } + function rerenderDeferredValue(value) { + var hook = updateWorkInProgressHook(); + if (currentHook === null) { + hook.memoizedState = value; + return value; + } else { + var prevValue = currentHook.memoizedState; + return updateDeferredValueImpl(hook, prevValue, value); + } + } + function updateDeferredValueImpl(hook, prevValue, value) { + var shouldDeferValue = !includesOnlyNonUrgentLanes(renderLanes); + if (shouldDeferValue) { + if (!objectIs(value, prevValue)) { + var deferredLane = claimNextTransitionLane(); + currentlyRenderingFiber$1.lanes = mergeLanes(currentlyRenderingFiber$1.lanes, deferredLane); + markSkippedUpdateLanes(deferredLane); + hook.baseState = true; + } + return prevValue; + } else { + if (hook.baseState) { + hook.baseState = false; + markWorkInProgressReceivedUpdate(); + } + hook.memoizedState = value; + return value; + } + } + function startTransition(setPending, callback, options) { + var previousPriority = getCurrentUpdatePriority(); + setCurrentUpdatePriority(higherEventPriority(previousPriority, ContinuousEventPriority)); + setPending(true); + var prevTransition = ReactCurrentBatchConfig$1.transition; + ReactCurrentBatchConfig$1.transition = {}; + var currentTransition = ReactCurrentBatchConfig$1.transition; + { + ReactCurrentBatchConfig$1.transition._updatedFibers = /* @__PURE__ */ new Set(); + } + try { + setPending(false); + callback(); + } finally { + setCurrentUpdatePriority(previousPriority); + ReactCurrentBatchConfig$1.transition = prevTransition; + { + if (prevTransition === null && currentTransition._updatedFibers) { + var updatedFibersCount = currentTransition._updatedFibers.size; + if (updatedFibersCount > 10) { + warn("Detected a large number of updates inside startTransition. If this is due to a subscription please re-write it to use React provided hooks. Otherwise concurrent mode guarantees are off the table."); + } + currentTransition._updatedFibers.clear(); + } + } + } + } + function mountTransition() { + var _mountState = mountState(false), isPending = _mountState[0], setPending = _mountState[1]; + var start = startTransition.bind(null, setPending); + var hook = mountWorkInProgressHook(); + hook.memoizedState = start; + return [isPending, start]; + } + function updateTransition() { + var _updateState = updateState(), isPending = _updateState[0]; + var hook = updateWorkInProgressHook(); + var start = hook.memoizedState; + return [isPending, start]; + } + function rerenderTransition() { + var _rerenderState = rerenderState(), isPending = _rerenderState[0]; + var hook = updateWorkInProgressHook(); + var start = hook.memoizedState; + return [isPending, start]; + } + var isUpdatingOpaqueValueInRenderPhase = false; + function getIsUpdatingOpaqueValueInRenderPhaseInDEV() { + { + return isUpdatingOpaqueValueInRenderPhase; + } + } + function mountId() { + var hook = mountWorkInProgressHook(); + var root = getWorkInProgressRoot(); + var identifierPrefix = root.identifierPrefix; + var id; + if (getIsHydrating()) { + var treeId = getTreeId(); + id = ":" + identifierPrefix + "R" + treeId; + var localId = localIdCounter++; + if (localId > 0) { + id += "H" + localId.toString(32); + } + id += ":"; + } else { + var globalClientId = globalClientIdCounter++; + id = ":" + identifierPrefix + "r" + globalClientId.toString(32) + ":"; + } + hook.memoizedState = id; + return id; + } + function updateId() { + var hook = updateWorkInProgressHook(); + var id = hook.memoizedState; + return id; + } + function dispatchReducerAction(fiber, queue, action) { + { + if (typeof arguments[3] === "function") { + error("State updates from the useState() and useReducer() Hooks don't support the second callback argument. To execute a side effect after rendering, declare it in the component body with useEffect()."); + } + } + var lane = requestUpdateLane(fiber); + var update = { + lane, + action, + hasEagerState: false, + eagerState: null, + next: null + }; + if (isRenderPhaseUpdate(fiber)) { + enqueueRenderPhaseUpdate(queue, update); + } else { + var root = enqueueConcurrentHookUpdate(fiber, queue, update, lane); + if (root !== null) { + var eventTime = requestEventTime(); + scheduleUpdateOnFiber(root, fiber, lane, eventTime); + entangleTransitionUpdate(root, queue, lane); + } + } + markUpdateInDevTools(fiber, lane); + } + function dispatchSetState(fiber, queue, action) { + { + if (typeof arguments[3] === "function") { + error("State updates from the useState() and useReducer() Hooks don't support the second callback argument. To execute a side effect after rendering, declare it in the component body with useEffect()."); + } + } + var lane = requestUpdateLane(fiber); + var update = { + lane, + action, + hasEagerState: false, + eagerState: null, + next: null + }; + if (isRenderPhaseUpdate(fiber)) { + enqueueRenderPhaseUpdate(queue, update); + } else { + var alternate = fiber.alternate; + if (fiber.lanes === NoLanes && (alternate === null || alternate.lanes === NoLanes)) { + var lastRenderedReducer = queue.lastRenderedReducer; + if (lastRenderedReducer !== null) { + var prevDispatcher; + { + prevDispatcher = ReactCurrentDispatcher$1.current; + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV; + } + try { + var currentState = queue.lastRenderedState; + var eagerState = lastRenderedReducer(currentState, action); + update.hasEagerState = true; + update.eagerState = eagerState; + if (objectIs(eagerState, currentState)) { + enqueueConcurrentHookUpdateAndEagerlyBailout(fiber, queue, update, lane); + return; + } + } catch (error2) { + } finally { + { + ReactCurrentDispatcher$1.current = prevDispatcher; + } + } + } + } + var root = enqueueConcurrentHookUpdate(fiber, queue, update, lane); + if (root !== null) { + var eventTime = requestEventTime(); + scheduleUpdateOnFiber(root, fiber, lane, eventTime); + entangleTransitionUpdate(root, queue, lane); + } + } + markUpdateInDevTools(fiber, lane); + } + function isRenderPhaseUpdate(fiber) { + var alternate = fiber.alternate; + return fiber === currentlyRenderingFiber$1 || alternate !== null && alternate === currentlyRenderingFiber$1; + } + function enqueueRenderPhaseUpdate(queue, update) { + didScheduleRenderPhaseUpdateDuringThisPass = didScheduleRenderPhaseUpdate = true; + var pending = queue.pending; + if (pending === null) { + update.next = update; + } else { + update.next = pending.next; + pending.next = update; + } + queue.pending = update; + } + function entangleTransitionUpdate(root, queue, lane) { + if (isTransitionLane(lane)) { + var queueLanes = queue.lanes; + queueLanes = intersectLanes(queueLanes, root.pendingLanes); + var newQueueLanes = mergeLanes(queueLanes, lane); + queue.lanes = newQueueLanes; + markRootEntangled(root, newQueueLanes); + } + } + function markUpdateInDevTools(fiber, lane, action) { + { + markStateUpdateScheduled(fiber, lane); + } + } + var ContextOnlyDispatcher = { + readContext, + useCallback: throwInvalidHookError, + useContext: throwInvalidHookError, + useEffect: throwInvalidHookError, + useImperativeHandle: throwInvalidHookError, + useInsertionEffect: throwInvalidHookError, + useLayoutEffect: throwInvalidHookError, + useMemo: throwInvalidHookError, + useReducer: throwInvalidHookError, + useRef: throwInvalidHookError, + useState: throwInvalidHookError, + useDebugValue: throwInvalidHookError, + useDeferredValue: throwInvalidHookError, + useTransition: throwInvalidHookError, + useMutableSource: throwInvalidHookError, + useSyncExternalStore: throwInvalidHookError, + useId: throwInvalidHookError, + unstable_isNewReconciler: enableNewReconciler + }; + var HooksDispatcherOnMountInDEV = null; + var HooksDispatcherOnMountWithHookTypesInDEV = null; + var HooksDispatcherOnUpdateInDEV = null; + var HooksDispatcherOnRerenderInDEV = null; + var InvalidNestedHooksDispatcherOnMountInDEV = null; + var InvalidNestedHooksDispatcherOnUpdateInDEV = null; + var InvalidNestedHooksDispatcherOnRerenderInDEV = null; + { + var warnInvalidContextAccess = function() { + error("Context can only be read while React is rendering. In classes, you can read it in the render method or getDerivedStateFromProps. In function components, you can read it directly in the function body, but not inside Hooks like useReducer() or useMemo()."); + }; + var warnInvalidHookAccess = function() { + error("Do not call Hooks inside useEffect(...), useMemo(...), or other built-in Hooks. You can only call Hooks at the top level of your React function. For more information, see https://reactjs.org/link/rules-of-hooks"); + }; + HooksDispatcherOnMountInDEV = { + readContext: function(context) { + return readContext(context); + }, + useCallback: function(callback, deps) { + currentHookNameInDev = "useCallback"; + mountHookTypesDev(); + checkDepsAreArrayDev(deps); + return mountCallback(callback, deps); + }, + useContext: function(context) { + currentHookNameInDev = "useContext"; + mountHookTypesDev(); + return readContext(context); + }, + useEffect: function(create, deps) { + currentHookNameInDev = "useEffect"; + mountHookTypesDev(); + checkDepsAreArrayDev(deps); + return mountEffect(create, deps); + }, + useImperativeHandle: function(ref, create, deps) { + currentHookNameInDev = "useImperativeHandle"; + mountHookTypesDev(); + checkDepsAreArrayDev(deps); + return mountImperativeHandle(ref, create, deps); + }, + useInsertionEffect: function(create, deps) { + currentHookNameInDev = "useInsertionEffect"; + mountHookTypesDev(); + checkDepsAreArrayDev(deps); + return mountInsertionEffect(create, deps); + }, + useLayoutEffect: function(create, deps) { + currentHookNameInDev = "useLayoutEffect"; + mountHookTypesDev(); + checkDepsAreArrayDev(deps); + return mountLayoutEffect(create, deps); + }, + useMemo: function(create, deps) { + currentHookNameInDev = "useMemo"; + mountHookTypesDev(); + checkDepsAreArrayDev(deps); + var prevDispatcher = ReactCurrentDispatcher$1.current; + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV; + try { + return mountMemo(create, deps); + } finally { + ReactCurrentDispatcher$1.current = prevDispatcher; + } + }, + useReducer: function(reducer, initialArg, init) { + currentHookNameInDev = "useReducer"; + mountHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher$1.current; + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV; + try { + return mountReducer(reducer, initialArg, init); + } finally { + ReactCurrentDispatcher$1.current = prevDispatcher; + } + }, + useRef: function(initialValue) { + currentHookNameInDev = "useRef"; + mountHookTypesDev(); + return mountRef(initialValue); + }, + useState: function(initialState) { + currentHookNameInDev = "useState"; + mountHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher$1.current; + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV; + try { + return mountState(initialState); + } finally { + ReactCurrentDispatcher$1.current = prevDispatcher; + } + }, + useDebugValue: function(value, formatterFn) { + currentHookNameInDev = "useDebugValue"; + mountHookTypesDev(); + return mountDebugValue(); + }, + useDeferredValue: function(value) { + currentHookNameInDev = "useDeferredValue"; + mountHookTypesDev(); + return mountDeferredValue(value); + }, + useTransition: function() { + currentHookNameInDev = "useTransition"; + mountHookTypesDev(); + return mountTransition(); + }, + useMutableSource: function(source, getSnapshot, subscribe2) { + currentHookNameInDev = "useMutableSource"; + mountHookTypesDev(); + return mountMutableSource(); + }, + useSyncExternalStore: function(subscribe2, getSnapshot, getServerSnapshot) { + currentHookNameInDev = "useSyncExternalStore"; + mountHookTypesDev(); + return mountSyncExternalStore(subscribe2, getSnapshot, getServerSnapshot); + }, + useId: function() { + currentHookNameInDev = "useId"; + mountHookTypesDev(); + return mountId(); + }, + unstable_isNewReconciler: enableNewReconciler + }; + HooksDispatcherOnMountWithHookTypesInDEV = { + readContext: function(context) { + return readContext(context); + }, + useCallback: function(callback, deps) { + currentHookNameInDev = "useCallback"; + updateHookTypesDev(); + return mountCallback(callback, deps); + }, + useContext: function(context) { + currentHookNameInDev = "useContext"; + updateHookTypesDev(); + return readContext(context); + }, + useEffect: function(create, deps) { + currentHookNameInDev = "useEffect"; + updateHookTypesDev(); + return mountEffect(create, deps); + }, + useImperativeHandle: function(ref, create, deps) { + currentHookNameInDev = "useImperativeHandle"; + updateHookTypesDev(); + return mountImperativeHandle(ref, create, deps); + }, + useInsertionEffect: function(create, deps) { + currentHookNameInDev = "useInsertionEffect"; + updateHookTypesDev(); + return mountInsertionEffect(create, deps); + }, + useLayoutEffect: function(create, deps) { + currentHookNameInDev = "useLayoutEffect"; + updateHookTypesDev(); + return mountLayoutEffect(create, deps); + }, + useMemo: function(create, deps) { + currentHookNameInDev = "useMemo"; + updateHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher$1.current; + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV; + try { + return mountMemo(create, deps); + } finally { + ReactCurrentDispatcher$1.current = prevDispatcher; + } + }, + useReducer: function(reducer, initialArg, init) { + currentHookNameInDev = "useReducer"; + updateHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher$1.current; + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV; + try { + return mountReducer(reducer, initialArg, init); + } finally { + ReactCurrentDispatcher$1.current = prevDispatcher; + } + }, + useRef: function(initialValue) { + currentHookNameInDev = "useRef"; + updateHookTypesDev(); + return mountRef(initialValue); + }, + useState: function(initialState) { + currentHookNameInDev = "useState"; + updateHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher$1.current; + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV; + try { + return mountState(initialState); + } finally { + ReactCurrentDispatcher$1.current = prevDispatcher; + } + }, + useDebugValue: function(value, formatterFn) { + currentHookNameInDev = "useDebugValue"; + updateHookTypesDev(); + return mountDebugValue(); + }, + useDeferredValue: function(value) { + currentHookNameInDev = "useDeferredValue"; + updateHookTypesDev(); + return mountDeferredValue(value); + }, + useTransition: function() { + currentHookNameInDev = "useTransition"; + updateHookTypesDev(); + return mountTransition(); + }, + useMutableSource: function(source, getSnapshot, subscribe2) { + currentHookNameInDev = "useMutableSource"; + updateHookTypesDev(); + return mountMutableSource(); + }, + useSyncExternalStore: function(subscribe2, getSnapshot, getServerSnapshot) { + currentHookNameInDev = "useSyncExternalStore"; + updateHookTypesDev(); + return mountSyncExternalStore(subscribe2, getSnapshot, getServerSnapshot); + }, + useId: function() { + currentHookNameInDev = "useId"; + updateHookTypesDev(); + return mountId(); + }, + unstable_isNewReconciler: enableNewReconciler + }; + HooksDispatcherOnUpdateInDEV = { + readContext: function(context) { + return readContext(context); + }, + useCallback: function(callback, deps) { + currentHookNameInDev = "useCallback"; + updateHookTypesDev(); + return updateCallback(callback, deps); + }, + useContext: function(context) { + currentHookNameInDev = "useContext"; + updateHookTypesDev(); + return readContext(context); + }, + useEffect: function(create, deps) { + currentHookNameInDev = "useEffect"; + updateHookTypesDev(); + return updateEffect(create, deps); + }, + useImperativeHandle: function(ref, create, deps) { + currentHookNameInDev = "useImperativeHandle"; + updateHookTypesDev(); + return updateImperativeHandle(ref, create, deps); + }, + useInsertionEffect: function(create, deps) { + currentHookNameInDev = "useInsertionEffect"; + updateHookTypesDev(); + return updateInsertionEffect(create, deps); + }, + useLayoutEffect: function(create, deps) { + currentHookNameInDev = "useLayoutEffect"; + updateHookTypesDev(); + return updateLayoutEffect(create, deps); + }, + useMemo: function(create, deps) { + currentHookNameInDev = "useMemo"; + updateHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher$1.current; + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV; + try { + return updateMemo(create, deps); + } finally { + ReactCurrentDispatcher$1.current = prevDispatcher; + } + }, + useReducer: function(reducer, initialArg, init) { + currentHookNameInDev = "useReducer"; + updateHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher$1.current; + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV; + try { + return updateReducer(reducer, initialArg, init); + } finally { + ReactCurrentDispatcher$1.current = prevDispatcher; + } + }, + useRef: function(initialValue) { + currentHookNameInDev = "useRef"; + updateHookTypesDev(); + return updateRef(); + }, + useState: function(initialState) { + currentHookNameInDev = "useState"; + updateHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher$1.current; + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV; + try { + return updateState(initialState); + } finally { + ReactCurrentDispatcher$1.current = prevDispatcher; + } + }, + useDebugValue: function(value, formatterFn) { + currentHookNameInDev = "useDebugValue"; + updateHookTypesDev(); + return updateDebugValue(); + }, + useDeferredValue: function(value) { + currentHookNameInDev = "useDeferredValue"; + updateHookTypesDev(); + return updateDeferredValue(value); + }, + useTransition: function() { + currentHookNameInDev = "useTransition"; + updateHookTypesDev(); + return updateTransition(); + }, + useMutableSource: function(source, getSnapshot, subscribe2) { + currentHookNameInDev = "useMutableSource"; + updateHookTypesDev(); + return updateMutableSource(); + }, + useSyncExternalStore: function(subscribe2, getSnapshot, getServerSnapshot) { + currentHookNameInDev = "useSyncExternalStore"; + updateHookTypesDev(); + return updateSyncExternalStore(subscribe2, getSnapshot); + }, + useId: function() { + currentHookNameInDev = "useId"; + updateHookTypesDev(); + return updateId(); + }, + unstable_isNewReconciler: enableNewReconciler + }; + HooksDispatcherOnRerenderInDEV = { + readContext: function(context) { + return readContext(context); + }, + useCallback: function(callback, deps) { + currentHookNameInDev = "useCallback"; + updateHookTypesDev(); + return updateCallback(callback, deps); + }, + useContext: function(context) { + currentHookNameInDev = "useContext"; + updateHookTypesDev(); + return readContext(context); + }, + useEffect: function(create, deps) { + currentHookNameInDev = "useEffect"; + updateHookTypesDev(); + return updateEffect(create, deps); + }, + useImperativeHandle: function(ref, create, deps) { + currentHookNameInDev = "useImperativeHandle"; + updateHookTypesDev(); + return updateImperativeHandle(ref, create, deps); + }, + useInsertionEffect: function(create, deps) { + currentHookNameInDev = "useInsertionEffect"; + updateHookTypesDev(); + return updateInsertionEffect(create, deps); + }, + useLayoutEffect: function(create, deps) { + currentHookNameInDev = "useLayoutEffect"; + updateHookTypesDev(); + return updateLayoutEffect(create, deps); + }, + useMemo: function(create, deps) { + currentHookNameInDev = "useMemo"; + updateHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher$1.current; + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnRerenderInDEV; + try { + return updateMemo(create, deps); + } finally { + ReactCurrentDispatcher$1.current = prevDispatcher; + } + }, + useReducer: function(reducer, initialArg, init) { + currentHookNameInDev = "useReducer"; + updateHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher$1.current; + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnRerenderInDEV; + try { + return rerenderReducer(reducer, initialArg, init); + } finally { + ReactCurrentDispatcher$1.current = prevDispatcher; + } + }, + useRef: function(initialValue) { + currentHookNameInDev = "useRef"; + updateHookTypesDev(); + return updateRef(); + }, + useState: function(initialState) { + currentHookNameInDev = "useState"; + updateHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher$1.current; + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnRerenderInDEV; + try { + return rerenderState(initialState); + } finally { + ReactCurrentDispatcher$1.current = prevDispatcher; + } + }, + useDebugValue: function(value, formatterFn) { + currentHookNameInDev = "useDebugValue"; + updateHookTypesDev(); + return updateDebugValue(); + }, + useDeferredValue: function(value) { + currentHookNameInDev = "useDeferredValue"; + updateHookTypesDev(); + return rerenderDeferredValue(value); + }, + useTransition: function() { + currentHookNameInDev = "useTransition"; + updateHookTypesDev(); + return rerenderTransition(); + }, + useMutableSource: function(source, getSnapshot, subscribe2) { + currentHookNameInDev = "useMutableSource"; + updateHookTypesDev(); + return updateMutableSource(); + }, + useSyncExternalStore: function(subscribe2, getSnapshot, getServerSnapshot) { + currentHookNameInDev = "useSyncExternalStore"; + updateHookTypesDev(); + return updateSyncExternalStore(subscribe2, getSnapshot); + }, + useId: function() { + currentHookNameInDev = "useId"; + updateHookTypesDev(); + return updateId(); + }, + unstable_isNewReconciler: enableNewReconciler + }; + InvalidNestedHooksDispatcherOnMountInDEV = { + readContext: function(context) { + warnInvalidContextAccess(); + return readContext(context); + }, + useCallback: function(callback, deps) { + currentHookNameInDev = "useCallback"; + warnInvalidHookAccess(); + mountHookTypesDev(); + return mountCallback(callback, deps); + }, + useContext: function(context) { + currentHookNameInDev = "useContext"; + warnInvalidHookAccess(); + mountHookTypesDev(); + return readContext(context); + }, + useEffect: function(create, deps) { + currentHookNameInDev = "useEffect"; + warnInvalidHookAccess(); + mountHookTypesDev(); + return mountEffect(create, deps); + }, + useImperativeHandle: function(ref, create, deps) { + currentHookNameInDev = "useImperativeHandle"; + warnInvalidHookAccess(); + mountHookTypesDev(); + return mountImperativeHandle(ref, create, deps); + }, + useInsertionEffect: function(create, deps) { + currentHookNameInDev = "useInsertionEffect"; + warnInvalidHookAccess(); + mountHookTypesDev(); + return mountInsertionEffect(create, deps); + }, + useLayoutEffect: function(create, deps) { + currentHookNameInDev = "useLayoutEffect"; + warnInvalidHookAccess(); + mountHookTypesDev(); + return mountLayoutEffect(create, deps); + }, + useMemo: function(create, deps) { + currentHookNameInDev = "useMemo"; + warnInvalidHookAccess(); + mountHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher$1.current; + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV; + try { + return mountMemo(create, deps); + } finally { + ReactCurrentDispatcher$1.current = prevDispatcher; + } + }, + useReducer: function(reducer, initialArg, init) { + currentHookNameInDev = "useReducer"; + warnInvalidHookAccess(); + mountHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher$1.current; + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV; + try { + return mountReducer(reducer, initialArg, init); + } finally { + ReactCurrentDispatcher$1.current = prevDispatcher; + } + }, + useRef: function(initialValue) { + currentHookNameInDev = "useRef"; + warnInvalidHookAccess(); + mountHookTypesDev(); + return mountRef(initialValue); + }, + useState: function(initialState) { + currentHookNameInDev = "useState"; + warnInvalidHookAccess(); + mountHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher$1.current; + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV; + try { + return mountState(initialState); + } finally { + ReactCurrentDispatcher$1.current = prevDispatcher; + } + }, + useDebugValue: function(value, formatterFn) { + currentHookNameInDev = "useDebugValue"; + warnInvalidHookAccess(); + mountHookTypesDev(); + return mountDebugValue(); + }, + useDeferredValue: function(value) { + currentHookNameInDev = "useDeferredValue"; + warnInvalidHookAccess(); + mountHookTypesDev(); + return mountDeferredValue(value); + }, + useTransition: function() { + currentHookNameInDev = "useTransition"; + warnInvalidHookAccess(); + mountHookTypesDev(); + return mountTransition(); + }, + useMutableSource: function(source, getSnapshot, subscribe2) { + currentHookNameInDev = "useMutableSource"; + warnInvalidHookAccess(); + mountHookTypesDev(); + return mountMutableSource(); + }, + useSyncExternalStore: function(subscribe2, getSnapshot, getServerSnapshot) { + currentHookNameInDev = "useSyncExternalStore"; + warnInvalidHookAccess(); + mountHookTypesDev(); + return mountSyncExternalStore(subscribe2, getSnapshot, getServerSnapshot); + }, + useId: function() { + currentHookNameInDev = "useId"; + warnInvalidHookAccess(); + mountHookTypesDev(); + return mountId(); + }, + unstable_isNewReconciler: enableNewReconciler + }; + InvalidNestedHooksDispatcherOnUpdateInDEV = { + readContext: function(context) { + warnInvalidContextAccess(); + return readContext(context); + }, + useCallback: function(callback, deps) { + currentHookNameInDev = "useCallback"; + warnInvalidHookAccess(); + updateHookTypesDev(); + return updateCallback(callback, deps); + }, + useContext: function(context) { + currentHookNameInDev = "useContext"; + warnInvalidHookAccess(); + updateHookTypesDev(); + return readContext(context); + }, + useEffect: function(create, deps) { + currentHookNameInDev = "useEffect"; + warnInvalidHookAccess(); + updateHookTypesDev(); + return updateEffect(create, deps); + }, + useImperativeHandle: function(ref, create, deps) { + currentHookNameInDev = "useImperativeHandle"; + warnInvalidHookAccess(); + updateHookTypesDev(); + return updateImperativeHandle(ref, create, deps); + }, + useInsertionEffect: function(create, deps) { + currentHookNameInDev = "useInsertionEffect"; + warnInvalidHookAccess(); + updateHookTypesDev(); + return updateInsertionEffect(create, deps); + }, + useLayoutEffect: function(create, deps) { + currentHookNameInDev = "useLayoutEffect"; + warnInvalidHookAccess(); + updateHookTypesDev(); + return updateLayoutEffect(create, deps); + }, + useMemo: function(create, deps) { + currentHookNameInDev = "useMemo"; + warnInvalidHookAccess(); + updateHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher$1.current; + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV; + try { + return updateMemo(create, deps); + } finally { + ReactCurrentDispatcher$1.current = prevDispatcher; + } + }, + useReducer: function(reducer, initialArg, init) { + currentHookNameInDev = "useReducer"; + warnInvalidHookAccess(); + updateHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher$1.current; + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV; + try { + return updateReducer(reducer, initialArg, init); + } finally { + ReactCurrentDispatcher$1.current = prevDispatcher; + } + }, + useRef: function(initialValue) { + currentHookNameInDev = "useRef"; + warnInvalidHookAccess(); + updateHookTypesDev(); + return updateRef(); + }, + useState: function(initialState) { + currentHookNameInDev = "useState"; + warnInvalidHookAccess(); + updateHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher$1.current; + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV; + try { + return updateState(initialState); + } finally { + ReactCurrentDispatcher$1.current = prevDispatcher; + } + }, + useDebugValue: function(value, formatterFn) { + currentHookNameInDev = "useDebugValue"; + warnInvalidHookAccess(); + updateHookTypesDev(); + return updateDebugValue(); + }, + useDeferredValue: function(value) { + currentHookNameInDev = "useDeferredValue"; + warnInvalidHookAccess(); + updateHookTypesDev(); + return updateDeferredValue(value); + }, + useTransition: function() { + currentHookNameInDev = "useTransition"; + warnInvalidHookAccess(); + updateHookTypesDev(); + return updateTransition(); + }, + useMutableSource: function(source, getSnapshot, subscribe2) { + currentHookNameInDev = "useMutableSource"; + warnInvalidHookAccess(); + updateHookTypesDev(); + return updateMutableSource(); + }, + useSyncExternalStore: function(subscribe2, getSnapshot, getServerSnapshot) { + currentHookNameInDev = "useSyncExternalStore"; + warnInvalidHookAccess(); + updateHookTypesDev(); + return updateSyncExternalStore(subscribe2, getSnapshot); + }, + useId: function() { + currentHookNameInDev = "useId"; + warnInvalidHookAccess(); + updateHookTypesDev(); + return updateId(); + }, + unstable_isNewReconciler: enableNewReconciler + }; + InvalidNestedHooksDispatcherOnRerenderInDEV = { + readContext: function(context) { + warnInvalidContextAccess(); + return readContext(context); + }, + useCallback: function(callback, deps) { + currentHookNameInDev = "useCallback"; + warnInvalidHookAccess(); + updateHookTypesDev(); + return updateCallback(callback, deps); + }, + useContext: function(context) { + currentHookNameInDev = "useContext"; + warnInvalidHookAccess(); + updateHookTypesDev(); + return readContext(context); + }, + useEffect: function(create, deps) { + currentHookNameInDev = "useEffect"; + warnInvalidHookAccess(); + updateHookTypesDev(); + return updateEffect(create, deps); + }, + useImperativeHandle: function(ref, create, deps) { + currentHookNameInDev = "useImperativeHandle"; + warnInvalidHookAccess(); + updateHookTypesDev(); + return updateImperativeHandle(ref, create, deps); + }, + useInsertionEffect: function(create, deps) { + currentHookNameInDev = "useInsertionEffect"; + warnInvalidHookAccess(); + updateHookTypesDev(); + return updateInsertionEffect(create, deps); + }, + useLayoutEffect: function(create, deps) { + currentHookNameInDev = "useLayoutEffect"; + warnInvalidHookAccess(); + updateHookTypesDev(); + return updateLayoutEffect(create, deps); + }, + useMemo: function(create, deps) { + currentHookNameInDev = "useMemo"; + warnInvalidHookAccess(); + updateHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher$1.current; + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV; + try { + return updateMemo(create, deps); + } finally { + ReactCurrentDispatcher$1.current = prevDispatcher; + } + }, + useReducer: function(reducer, initialArg, init) { + currentHookNameInDev = "useReducer"; + warnInvalidHookAccess(); + updateHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher$1.current; + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV; + try { + return rerenderReducer(reducer, initialArg, init); + } finally { + ReactCurrentDispatcher$1.current = prevDispatcher; + } + }, + useRef: function(initialValue) { + currentHookNameInDev = "useRef"; + warnInvalidHookAccess(); + updateHookTypesDev(); + return updateRef(); + }, + useState: function(initialState) { + currentHookNameInDev = "useState"; + warnInvalidHookAccess(); + updateHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher$1.current; + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV; + try { + return rerenderState(initialState); + } finally { + ReactCurrentDispatcher$1.current = prevDispatcher; + } + }, + useDebugValue: function(value, formatterFn) { + currentHookNameInDev = "useDebugValue"; + warnInvalidHookAccess(); + updateHookTypesDev(); + return updateDebugValue(); + }, + useDeferredValue: function(value) { + currentHookNameInDev = "useDeferredValue"; + warnInvalidHookAccess(); + updateHookTypesDev(); + return rerenderDeferredValue(value); + }, + useTransition: function() { + currentHookNameInDev = "useTransition"; + warnInvalidHookAccess(); + updateHookTypesDev(); + return rerenderTransition(); + }, + useMutableSource: function(source, getSnapshot, subscribe2) { + currentHookNameInDev = "useMutableSource"; + warnInvalidHookAccess(); + updateHookTypesDev(); + return updateMutableSource(); + }, + useSyncExternalStore: function(subscribe2, getSnapshot, getServerSnapshot) { + currentHookNameInDev = "useSyncExternalStore"; + warnInvalidHookAccess(); + updateHookTypesDev(); + return updateSyncExternalStore(subscribe2, getSnapshot); + }, + useId: function() { + currentHookNameInDev = "useId"; + warnInvalidHookAccess(); + updateHookTypesDev(); + return updateId(); + }, + unstable_isNewReconciler: enableNewReconciler + }; + } + var now$1 = Scheduler.unstable_now; + var commitTime = 0; + var layoutEffectStartTime = -1; + var profilerStartTime = -1; + var passiveEffectStartTime = -1; + var currentUpdateIsNested = false; + var nestedUpdateScheduled = false; + function isCurrentUpdateNested() { + return currentUpdateIsNested; + } + function markNestedUpdateScheduled() { + { + nestedUpdateScheduled = true; + } + } + function resetNestedUpdateFlag() { + { + currentUpdateIsNested = false; + nestedUpdateScheduled = false; + } + } + function syncNestedUpdateFlag() { + { + currentUpdateIsNested = nestedUpdateScheduled; + nestedUpdateScheduled = false; + } + } + function getCommitTime() { + return commitTime; + } + function recordCommitTime() { + commitTime = now$1(); + } + function startProfilerTimer(fiber) { + profilerStartTime = now$1(); + if (fiber.actualStartTime < 0) { + fiber.actualStartTime = now$1(); + } + } + function stopProfilerTimerIfRunning(fiber) { + profilerStartTime = -1; + } + function stopProfilerTimerIfRunningAndRecordDelta(fiber, overrideBaseTime) { + if (profilerStartTime >= 0) { + var elapsedTime = now$1() - profilerStartTime; + fiber.actualDuration += elapsedTime; + if (overrideBaseTime) { + fiber.selfBaseDuration = elapsedTime; + } + profilerStartTime = -1; + } + } + function recordLayoutEffectDuration(fiber) { + if (layoutEffectStartTime >= 0) { + var elapsedTime = now$1() - layoutEffectStartTime; + layoutEffectStartTime = -1; + var parentFiber = fiber.return; + while (parentFiber !== null) { + switch (parentFiber.tag) { + case HostRoot: + var root = parentFiber.stateNode; + root.effectDuration += elapsedTime; + return; + case Profiler: + var parentStateNode = parentFiber.stateNode; + parentStateNode.effectDuration += elapsedTime; + return; + } + parentFiber = parentFiber.return; + } + } + } + function recordPassiveEffectDuration(fiber) { + if (passiveEffectStartTime >= 0) { + var elapsedTime = now$1() - passiveEffectStartTime; + passiveEffectStartTime = -1; + var parentFiber = fiber.return; + while (parentFiber !== null) { + switch (parentFiber.tag) { + case HostRoot: + var root = parentFiber.stateNode; + if (root !== null) { + root.passiveEffectDuration += elapsedTime; + } + return; + case Profiler: + var parentStateNode = parentFiber.stateNode; + if (parentStateNode !== null) { + parentStateNode.passiveEffectDuration += elapsedTime; + } + return; + } + parentFiber = parentFiber.return; + } + } + } + function startLayoutEffectTimer() { + layoutEffectStartTime = now$1(); + } + function startPassiveEffectTimer() { + passiveEffectStartTime = now$1(); + } + function transferActualDuration(fiber) { + var child = fiber.child; + while (child) { + fiber.actualDuration += child.actualDuration; + child = child.sibling; + } + } + function createCapturedValueAtFiber(value, source) { + return { + value, + source, + stack: getStackByFiberInDevAndProd(source), + digest: null + }; + } + function createCapturedValue(value, digest, stack) { + return { + value, + source: null, + stack: stack != null ? stack : null, + digest: digest != null ? digest : null + }; + } + function showErrorDialog(boundary, errorInfo) { + return true; + } + function logCapturedError(boundary, errorInfo) { + try { + var logError = showErrorDialog(boundary, errorInfo); + if (logError === false) { + return; + } + var error2 = errorInfo.value; + if (true) { + var source = errorInfo.source; + var stack = errorInfo.stack; + var componentStack = stack !== null ? stack : ""; + if (error2 != null && error2._suppressLogging) { + if (boundary.tag === ClassComponent) { + return; + } + console["error"](error2); + } + var componentName = source ? getComponentNameFromFiber(source) : null; + var componentNameMessage = componentName ? "The above error occurred in the <" + componentName + "> component:" : "The above error occurred in one of your React components:"; + var errorBoundaryMessage; + if (boundary.tag === HostRoot) { + errorBoundaryMessage = "Consider adding an error boundary to your tree to customize error handling behavior.\nVisit https://reactjs.org/link/error-boundaries to learn more about error boundaries."; + } else { + var errorBoundaryName = getComponentNameFromFiber(boundary) || "Anonymous"; + errorBoundaryMessage = "React will try to recreate this component tree from scratch " + ("using the error boundary you provided, " + errorBoundaryName + "."); + } + var combinedMessage = componentNameMessage + "\n" + componentStack + "\n\n" + ("" + errorBoundaryMessage); + console["error"](combinedMessage); + } else { + console["error"](error2); + } + } catch (e) { + setTimeout(function() { + throw e; + }); + } + } + var PossiblyWeakMap$1 = typeof WeakMap === "function" ? WeakMap : Map; + function createRootErrorUpdate(fiber, errorInfo, lane) { + var update = createUpdate(NoTimestamp, lane); + update.tag = CaptureUpdate; + update.payload = { + element: null + }; + var error2 = errorInfo.value; + update.callback = function() { + onUncaughtError(error2); + logCapturedError(fiber, errorInfo); + }; + return update; + } + function createClassErrorUpdate(fiber, errorInfo, lane) { + var update = createUpdate(NoTimestamp, lane); + update.tag = CaptureUpdate; + var getDerivedStateFromError = fiber.type.getDerivedStateFromError; + if (typeof getDerivedStateFromError === "function") { + var error$1 = errorInfo.value; + update.payload = function() { + return getDerivedStateFromError(error$1); + }; + update.callback = function() { + { + markFailedErrorBoundaryForHotReloading(fiber); + } + logCapturedError(fiber, errorInfo); + }; + } + var inst = fiber.stateNode; + if (inst !== null && typeof inst.componentDidCatch === "function") { + update.callback = function callback() { + { + markFailedErrorBoundaryForHotReloading(fiber); + } + logCapturedError(fiber, errorInfo); + if (typeof getDerivedStateFromError !== "function") { + markLegacyErrorBoundaryAsFailed(this); + } + var error$12 = errorInfo.value; + var stack = errorInfo.stack; + this.componentDidCatch(error$12, { + componentStack: stack !== null ? stack : "" + }); + { + if (typeof getDerivedStateFromError !== "function") { + if (!includesSomeLane(fiber.lanes, SyncLane)) { + error("%s: Error boundaries should implement getDerivedStateFromError(). In that method, return a state update to display an error message or fallback UI.", getComponentNameFromFiber(fiber) || "Unknown"); + } + } + } + }; + } + return update; + } + function attachPingListener(root, wakeable, lanes) { + var pingCache = root.pingCache; + var threadIDs; + if (pingCache === null) { + pingCache = root.pingCache = new PossiblyWeakMap$1(); + threadIDs = /* @__PURE__ */ new Set(); + pingCache.set(wakeable, threadIDs); + } else { + threadIDs = pingCache.get(wakeable); + if (threadIDs === void 0) { + threadIDs = /* @__PURE__ */ new Set(); + pingCache.set(wakeable, threadIDs); + } + } + if (!threadIDs.has(lanes)) { + threadIDs.add(lanes); + var ping = pingSuspendedRoot.bind(null, root, wakeable, lanes); + { + if (isDevToolsPresent) { + restorePendingUpdaters(root, lanes); + } + } + wakeable.then(ping, ping); + } + } + function attachRetryListener(suspenseBoundary, root, wakeable, lanes) { + var wakeables = suspenseBoundary.updateQueue; + if (wakeables === null) { + var updateQueue = /* @__PURE__ */ new Set(); + updateQueue.add(wakeable); + suspenseBoundary.updateQueue = updateQueue; + } else { + wakeables.add(wakeable); + } + } + function resetSuspendedComponent(sourceFiber, rootRenderLanes) { + var tag = sourceFiber.tag; + if ((sourceFiber.mode & ConcurrentMode) === NoMode && (tag === FunctionComponent || tag === ForwardRef || tag === SimpleMemoComponent)) { + var currentSource = sourceFiber.alternate; + if (currentSource) { + sourceFiber.updateQueue = currentSource.updateQueue; + sourceFiber.memoizedState = currentSource.memoizedState; + sourceFiber.lanes = currentSource.lanes; + } else { + sourceFiber.updateQueue = null; + sourceFiber.memoizedState = null; + } + } + } + function getNearestSuspenseBoundaryToCapture(returnFiber) { + var node = returnFiber; + do { + if (node.tag === SuspenseComponent && shouldCaptureSuspense(node)) { + return node; + } + node = node.return; + } while (node !== null); + return null; + } + function markSuspenseBoundaryShouldCapture(suspenseBoundary, returnFiber, sourceFiber, root, rootRenderLanes) { + if ((suspenseBoundary.mode & ConcurrentMode) === NoMode) { + if (suspenseBoundary === returnFiber) { + suspenseBoundary.flags |= ShouldCapture; + } else { + suspenseBoundary.flags |= DidCapture; + sourceFiber.flags |= ForceUpdateForLegacySuspense; + sourceFiber.flags &= ~(LifecycleEffectMask | Incomplete); + if (sourceFiber.tag === ClassComponent) { + var currentSourceFiber = sourceFiber.alternate; + if (currentSourceFiber === null) { + sourceFiber.tag = IncompleteClassComponent; + } else { + var update = createUpdate(NoTimestamp, SyncLane); + update.tag = ForceUpdate; + enqueueUpdate(sourceFiber, update, SyncLane); + } + } + sourceFiber.lanes = mergeLanes(sourceFiber.lanes, SyncLane); + } + return suspenseBoundary; + } + suspenseBoundary.flags |= ShouldCapture; + suspenseBoundary.lanes = rootRenderLanes; + return suspenseBoundary; + } + function throwException(root, returnFiber, sourceFiber, value, rootRenderLanes) { + sourceFiber.flags |= Incomplete; + { + if (isDevToolsPresent) { + restorePendingUpdaters(root, rootRenderLanes); + } + } + if (value !== null && typeof value === "object" && typeof value.then === "function") { + var wakeable = value; + resetSuspendedComponent(sourceFiber); + { + if (getIsHydrating() && sourceFiber.mode & ConcurrentMode) { + markDidThrowWhileHydratingDEV(); + } + } + var suspenseBoundary = getNearestSuspenseBoundaryToCapture(returnFiber); + if (suspenseBoundary !== null) { + suspenseBoundary.flags &= ~ForceClientRender; + markSuspenseBoundaryShouldCapture(suspenseBoundary, returnFiber, sourceFiber, root, rootRenderLanes); + if (suspenseBoundary.mode & ConcurrentMode) { + attachPingListener(root, wakeable, rootRenderLanes); + } + attachRetryListener(suspenseBoundary, root, wakeable); + return; + } else { + if (!includesSyncLane(rootRenderLanes)) { + attachPingListener(root, wakeable, rootRenderLanes); + renderDidSuspendDelayIfPossible(); + return; + } + var uncaughtSuspenseError = new Error("A component suspended while responding to synchronous input. This will cause the UI to be replaced with a loading indicator. To fix, updates that suspend should be wrapped with startTransition."); + value = uncaughtSuspenseError; + } + } else { + if (getIsHydrating() && sourceFiber.mode & ConcurrentMode) { + markDidThrowWhileHydratingDEV(); + var _suspenseBoundary = getNearestSuspenseBoundaryToCapture(returnFiber); + if (_suspenseBoundary !== null) { + if ((_suspenseBoundary.flags & ShouldCapture) === NoFlags) { + _suspenseBoundary.flags |= ForceClientRender; + } + markSuspenseBoundaryShouldCapture(_suspenseBoundary, returnFiber, sourceFiber, root, rootRenderLanes); + queueHydrationError(createCapturedValueAtFiber(value, sourceFiber)); + return; + } + } + } + value = createCapturedValueAtFiber(value, sourceFiber); + renderDidError(value); + var workInProgress2 = returnFiber; + do { + switch (workInProgress2.tag) { + case HostRoot: { + var _errorInfo = value; + workInProgress2.flags |= ShouldCapture; + var lane = pickArbitraryLane(rootRenderLanes); + workInProgress2.lanes = mergeLanes(workInProgress2.lanes, lane); + var update = createRootErrorUpdate(workInProgress2, _errorInfo, lane); + enqueueCapturedUpdate(workInProgress2, update); + return; + } + case ClassComponent: + var errorInfo = value; + var ctor = workInProgress2.type; + var instance = workInProgress2.stateNode; + if ((workInProgress2.flags & DidCapture) === NoFlags && (typeof ctor.getDerivedStateFromError === "function" || instance !== null && typeof instance.componentDidCatch === "function" && !isAlreadyFailedLegacyErrorBoundary(instance))) { + workInProgress2.flags |= ShouldCapture; + var _lane = pickArbitraryLane(rootRenderLanes); + workInProgress2.lanes = mergeLanes(workInProgress2.lanes, _lane); + var _update = createClassErrorUpdate(workInProgress2, errorInfo, _lane); + enqueueCapturedUpdate(workInProgress2, _update); + return; + } + break; + } + workInProgress2 = workInProgress2.return; + } while (workInProgress2 !== null); + } + function getSuspendedCache() { + { + return null; + } + } + var ReactCurrentOwner$1 = ReactSharedInternals.ReactCurrentOwner; + var didReceiveUpdate = false; + var didWarnAboutBadClass; + var didWarnAboutModulePatternComponent; + var didWarnAboutContextTypeOnFunctionComponent; + var didWarnAboutGetDerivedStateOnFunctionComponent; + var didWarnAboutFunctionRefs; + var didWarnAboutReassigningProps; + var didWarnAboutRevealOrder; + var didWarnAboutTailOptions; + { + didWarnAboutBadClass = {}; + didWarnAboutModulePatternComponent = {}; + didWarnAboutContextTypeOnFunctionComponent = {}; + didWarnAboutGetDerivedStateOnFunctionComponent = {}; + didWarnAboutFunctionRefs = {}; + didWarnAboutReassigningProps = false; + didWarnAboutRevealOrder = {}; + didWarnAboutTailOptions = {}; + } + function reconcileChildren(current2, workInProgress2, nextChildren, renderLanes2) { + if (current2 === null) { + workInProgress2.child = mountChildFibers(workInProgress2, null, nextChildren, renderLanes2); + } else { + workInProgress2.child = reconcileChildFibers(workInProgress2, current2.child, nextChildren, renderLanes2); + } + } + function forceUnmountCurrentAndReconcile(current2, workInProgress2, nextChildren, renderLanes2) { + workInProgress2.child = reconcileChildFibers(workInProgress2, current2.child, null, renderLanes2); + workInProgress2.child = reconcileChildFibers(workInProgress2, null, nextChildren, renderLanes2); + } + function updateForwardRef(current2, workInProgress2, Component, nextProps, renderLanes2) { + { + if (workInProgress2.type !== workInProgress2.elementType) { + var innerPropTypes = Component.propTypes; + if (innerPropTypes) { + checkPropTypes( + innerPropTypes, + nextProps, + // Resolved props + "prop", + getComponentNameFromType(Component) + ); + } + } + } + var render = Component.render; + var ref = workInProgress2.ref; + var nextChildren; + var hasId; + prepareToReadContext(workInProgress2, renderLanes2); + { + markComponentRenderStarted(workInProgress2); + } + { + ReactCurrentOwner$1.current = workInProgress2; + setIsRendering(true); + nextChildren = renderWithHooks(current2, workInProgress2, render, nextProps, ref, renderLanes2); + hasId = checkDidRenderIdHook(); + if (workInProgress2.mode & StrictLegacyMode) { + setIsStrictModeForDevtools(true); + try { + nextChildren = renderWithHooks(current2, workInProgress2, render, nextProps, ref, renderLanes2); + hasId = checkDidRenderIdHook(); + } finally { + setIsStrictModeForDevtools(false); + } + } + setIsRendering(false); + } + { + markComponentRenderStopped(); + } + if (current2 !== null && !didReceiveUpdate) { + bailoutHooks(current2, workInProgress2, renderLanes2); + return bailoutOnAlreadyFinishedWork(current2, workInProgress2, renderLanes2); + } + if (getIsHydrating() && hasId) { + pushMaterializedTreeId(workInProgress2); + } + workInProgress2.flags |= PerformedWork; + reconcileChildren(current2, workInProgress2, nextChildren, renderLanes2); + return workInProgress2.child; + } + function updateMemoComponent(current2, workInProgress2, Component, nextProps, renderLanes2) { + if (current2 === null) { + var type = Component.type; + if (isSimpleFunctionComponent(type) && Component.compare === null && // SimpleMemoComponent codepath doesn't resolve outer props either. + Component.defaultProps === void 0) { + var resolvedType = type; + { + resolvedType = resolveFunctionForHotReloading(type); + } + workInProgress2.tag = SimpleMemoComponent; + workInProgress2.type = resolvedType; + { + validateFunctionComponentInDev(workInProgress2, type); + } + return updateSimpleMemoComponent(current2, workInProgress2, resolvedType, nextProps, renderLanes2); + } + { + var innerPropTypes = type.propTypes; + if (innerPropTypes) { + checkPropTypes( + innerPropTypes, + nextProps, + // Resolved props + "prop", + getComponentNameFromType(type) + ); + } + } + var child = createFiberFromTypeAndProps(Component.type, null, nextProps, workInProgress2, workInProgress2.mode, renderLanes2); + child.ref = workInProgress2.ref; + child.return = workInProgress2; + workInProgress2.child = child; + return child; + } + { + var _type = Component.type; + var _innerPropTypes = _type.propTypes; + if (_innerPropTypes) { + checkPropTypes( + _innerPropTypes, + nextProps, + // Resolved props + "prop", + getComponentNameFromType(_type) + ); + } + } + var currentChild = current2.child; + var hasScheduledUpdateOrContext = checkScheduledUpdateOrContext(current2, renderLanes2); + if (!hasScheduledUpdateOrContext) { + var prevProps = currentChild.memoizedProps; + var compare2 = Component.compare; + compare2 = compare2 !== null ? compare2 : shallowEqual; + if (compare2(prevProps, nextProps) && current2.ref === workInProgress2.ref) { + return bailoutOnAlreadyFinishedWork(current2, workInProgress2, renderLanes2); + } + } + workInProgress2.flags |= PerformedWork; + var newChild = createWorkInProgress(currentChild, nextProps); + newChild.ref = workInProgress2.ref; + newChild.return = workInProgress2; + workInProgress2.child = newChild; + return newChild; + } + function updateSimpleMemoComponent(current2, workInProgress2, Component, nextProps, renderLanes2) { + { + if (workInProgress2.type !== workInProgress2.elementType) { + var outerMemoType = workInProgress2.elementType; + if (outerMemoType.$$typeof === REACT_LAZY_TYPE) { + var lazyComponent = outerMemoType; + var payload = lazyComponent._payload; + var init = lazyComponent._init; + try { + outerMemoType = init(payload); + } catch (x) { + outerMemoType = null; + } + var outerPropTypes = outerMemoType && outerMemoType.propTypes; + if (outerPropTypes) { + checkPropTypes( + outerPropTypes, + nextProps, + // Resolved (SimpleMemoComponent has no defaultProps) + "prop", + getComponentNameFromType(outerMemoType) + ); + } + } + } + } + if (current2 !== null) { + var prevProps = current2.memoizedProps; + if (shallowEqual(prevProps, nextProps) && current2.ref === workInProgress2.ref && // Prevent bailout if the implementation changed due to hot reload. + workInProgress2.type === current2.type) { + didReceiveUpdate = false; + workInProgress2.pendingProps = nextProps = prevProps; + if (!checkScheduledUpdateOrContext(current2, renderLanes2)) { + workInProgress2.lanes = current2.lanes; + return bailoutOnAlreadyFinishedWork(current2, workInProgress2, renderLanes2); + } else if ((current2.flags & ForceUpdateForLegacySuspense) !== NoFlags) { + didReceiveUpdate = true; + } + } + } + return updateFunctionComponent(current2, workInProgress2, Component, nextProps, renderLanes2); + } + function updateOffscreenComponent(current2, workInProgress2, renderLanes2) { + var nextProps = workInProgress2.pendingProps; + var nextChildren = nextProps.children; + var prevState = current2 !== null ? current2.memoizedState : null; + if (nextProps.mode === "hidden" || enableLegacyHidden) { + if ((workInProgress2.mode & ConcurrentMode) === NoMode) { + var nextState = { + baseLanes: NoLanes, + cachePool: null, + transitions: null + }; + workInProgress2.memoizedState = nextState; + pushRenderLanes(workInProgress2, renderLanes2); + } else if (!includesSomeLane(renderLanes2, OffscreenLane)) { + var spawnedCachePool = null; + var nextBaseLanes; + if (prevState !== null) { + var prevBaseLanes = prevState.baseLanes; + nextBaseLanes = mergeLanes(prevBaseLanes, renderLanes2); + } else { + nextBaseLanes = renderLanes2; + } + workInProgress2.lanes = workInProgress2.childLanes = laneToLanes(OffscreenLane); + var _nextState = { + baseLanes: nextBaseLanes, + cachePool: spawnedCachePool, + transitions: null + }; + workInProgress2.memoizedState = _nextState; + workInProgress2.updateQueue = null; + pushRenderLanes(workInProgress2, nextBaseLanes); + return null; + } else { + var _nextState2 = { + baseLanes: NoLanes, + cachePool: null, + transitions: null + }; + workInProgress2.memoizedState = _nextState2; + var subtreeRenderLanes2 = prevState !== null ? prevState.baseLanes : renderLanes2; + pushRenderLanes(workInProgress2, subtreeRenderLanes2); + } + } else { + var _subtreeRenderLanes; + if (prevState !== null) { + _subtreeRenderLanes = mergeLanes(prevState.baseLanes, renderLanes2); + workInProgress2.memoizedState = null; + } else { + _subtreeRenderLanes = renderLanes2; + } + pushRenderLanes(workInProgress2, _subtreeRenderLanes); + } + reconcileChildren(current2, workInProgress2, nextChildren, renderLanes2); + return workInProgress2.child; + } + function updateFragment(current2, workInProgress2, renderLanes2) { + var nextChildren = workInProgress2.pendingProps; + reconcileChildren(current2, workInProgress2, nextChildren, renderLanes2); + return workInProgress2.child; + } + function updateMode(current2, workInProgress2, renderLanes2) { + var nextChildren = workInProgress2.pendingProps.children; + reconcileChildren(current2, workInProgress2, nextChildren, renderLanes2); + return workInProgress2.child; + } + function updateProfiler(current2, workInProgress2, renderLanes2) { + { + workInProgress2.flags |= Update; + { + var stateNode = workInProgress2.stateNode; + stateNode.effectDuration = 0; + stateNode.passiveEffectDuration = 0; + } + } + var nextProps = workInProgress2.pendingProps; + var nextChildren = nextProps.children; + reconcileChildren(current2, workInProgress2, nextChildren, renderLanes2); + return workInProgress2.child; + } + function markRef(current2, workInProgress2) { + var ref = workInProgress2.ref; + if (current2 === null && ref !== null || current2 !== null && current2.ref !== ref) { + workInProgress2.flags |= Ref; + { + workInProgress2.flags |= RefStatic; + } + } + } + function updateFunctionComponent(current2, workInProgress2, Component, nextProps, renderLanes2) { + { + if (workInProgress2.type !== workInProgress2.elementType) { + var innerPropTypes = Component.propTypes; + if (innerPropTypes) { + checkPropTypes( + innerPropTypes, + nextProps, + // Resolved props + "prop", + getComponentNameFromType(Component) + ); + } + } + } + var context; + { + var unmaskedContext = getUnmaskedContext(workInProgress2, Component, true); + context = getMaskedContext(workInProgress2, unmaskedContext); + } + var nextChildren; + var hasId; + prepareToReadContext(workInProgress2, renderLanes2); + { + markComponentRenderStarted(workInProgress2); + } + { + ReactCurrentOwner$1.current = workInProgress2; + setIsRendering(true); + nextChildren = renderWithHooks(current2, workInProgress2, Component, nextProps, context, renderLanes2); + hasId = checkDidRenderIdHook(); + if (workInProgress2.mode & StrictLegacyMode) { + setIsStrictModeForDevtools(true); + try { + nextChildren = renderWithHooks(current2, workInProgress2, Component, nextProps, context, renderLanes2); + hasId = checkDidRenderIdHook(); + } finally { + setIsStrictModeForDevtools(false); + } + } + setIsRendering(false); + } + { + markComponentRenderStopped(); + } + if (current2 !== null && !didReceiveUpdate) { + bailoutHooks(current2, workInProgress2, renderLanes2); + return bailoutOnAlreadyFinishedWork(current2, workInProgress2, renderLanes2); + } + if (getIsHydrating() && hasId) { + pushMaterializedTreeId(workInProgress2); + } + workInProgress2.flags |= PerformedWork; + reconcileChildren(current2, workInProgress2, nextChildren, renderLanes2); + return workInProgress2.child; + } + function updateClassComponent(current2, workInProgress2, Component, nextProps, renderLanes2) { + { + switch (shouldError(workInProgress2)) { + case false: { + var _instance = workInProgress2.stateNode; + var ctor = workInProgress2.type; + var tempInstance = new ctor(workInProgress2.memoizedProps, _instance.context); + var state = tempInstance.state; + _instance.updater.enqueueSetState(_instance, state, null); + break; + } + case true: { + workInProgress2.flags |= DidCapture; + workInProgress2.flags |= ShouldCapture; + var error$1 = new Error("Simulated error coming from DevTools"); + var lane = pickArbitraryLane(renderLanes2); + workInProgress2.lanes = mergeLanes(workInProgress2.lanes, lane); + var update = createClassErrorUpdate(workInProgress2, createCapturedValueAtFiber(error$1, workInProgress2), lane); + enqueueCapturedUpdate(workInProgress2, update); + break; + } + } + if (workInProgress2.type !== workInProgress2.elementType) { + var innerPropTypes = Component.propTypes; + if (innerPropTypes) { + checkPropTypes( + innerPropTypes, + nextProps, + // Resolved props + "prop", + getComponentNameFromType(Component) + ); + } + } + } + var hasContext; + if (isContextProvider(Component)) { + hasContext = true; + pushContextProvider(workInProgress2); + } else { + hasContext = false; + } + prepareToReadContext(workInProgress2, renderLanes2); + var instance = workInProgress2.stateNode; + var shouldUpdate; + if (instance === null) { + resetSuspendedCurrentOnMountInLegacyMode(current2, workInProgress2); + constructClassInstance(workInProgress2, Component, nextProps); + mountClassInstance(workInProgress2, Component, nextProps, renderLanes2); + shouldUpdate = true; + } else if (current2 === null) { + shouldUpdate = resumeMountClassInstance(workInProgress2, Component, nextProps, renderLanes2); + } else { + shouldUpdate = updateClassInstance(current2, workInProgress2, Component, nextProps, renderLanes2); + } + var nextUnitOfWork = finishClassComponent(current2, workInProgress2, Component, shouldUpdate, hasContext, renderLanes2); + { + var inst = workInProgress2.stateNode; + if (shouldUpdate && inst.props !== nextProps) { + if (!didWarnAboutReassigningProps) { + error("It looks like %s is reassigning its own `this.props` while rendering. This is not supported and can lead to confusing bugs.", getComponentNameFromFiber(workInProgress2) || "a component"); + } + didWarnAboutReassigningProps = true; + } + } + return nextUnitOfWork; + } + function finishClassComponent(current2, workInProgress2, Component, shouldUpdate, hasContext, renderLanes2) { + markRef(current2, workInProgress2); + var didCaptureError = (workInProgress2.flags & DidCapture) !== NoFlags; + if (!shouldUpdate && !didCaptureError) { + if (hasContext) { + invalidateContextProvider(workInProgress2, Component, false); + } + return bailoutOnAlreadyFinishedWork(current2, workInProgress2, renderLanes2); + } + var instance = workInProgress2.stateNode; + ReactCurrentOwner$1.current = workInProgress2; + var nextChildren; + if (didCaptureError && typeof Component.getDerivedStateFromError !== "function") { + nextChildren = null; + { + stopProfilerTimerIfRunning(); + } + } else { + { + markComponentRenderStarted(workInProgress2); + } + { + setIsRendering(true); + nextChildren = instance.render(); + if (workInProgress2.mode & StrictLegacyMode) { + setIsStrictModeForDevtools(true); + try { + instance.render(); + } finally { + setIsStrictModeForDevtools(false); + } + } + setIsRendering(false); + } + { + markComponentRenderStopped(); + } + } + workInProgress2.flags |= PerformedWork; + if (current2 !== null && didCaptureError) { + forceUnmountCurrentAndReconcile(current2, workInProgress2, nextChildren, renderLanes2); + } else { + reconcileChildren(current2, workInProgress2, nextChildren, renderLanes2); + } + workInProgress2.memoizedState = instance.state; + if (hasContext) { + invalidateContextProvider(workInProgress2, Component, true); + } + return workInProgress2.child; + } + function pushHostRootContext(workInProgress2) { + var root = workInProgress2.stateNode; + if (root.pendingContext) { + pushTopLevelContextObject(workInProgress2, root.pendingContext, root.pendingContext !== root.context); + } else if (root.context) { + pushTopLevelContextObject(workInProgress2, root.context, false); + } + pushHostContainer(workInProgress2, root.containerInfo); + } + function updateHostRoot(current2, workInProgress2, renderLanes2) { + pushHostRootContext(workInProgress2); + if (current2 === null) { + throw new Error("Should have a current fiber. This is a bug in React."); + } + var nextProps = workInProgress2.pendingProps; + var prevState = workInProgress2.memoizedState; + var prevChildren = prevState.element; + cloneUpdateQueue(current2, workInProgress2); + processUpdateQueue(workInProgress2, nextProps, null, renderLanes2); + var nextState = workInProgress2.memoizedState; + var root = workInProgress2.stateNode; + var nextChildren = nextState.element; + if (supportsHydration && prevState.isDehydrated) { + var overrideState = { + element: nextChildren, + isDehydrated: false, + cache: nextState.cache, + pendingSuspenseBoundaries: nextState.pendingSuspenseBoundaries, + transitions: nextState.transitions + }; + var updateQueue = workInProgress2.updateQueue; + updateQueue.baseState = overrideState; + workInProgress2.memoizedState = overrideState; + if (workInProgress2.flags & ForceClientRender) { + var recoverableError = createCapturedValueAtFiber(new Error("There was an error while hydrating. Because the error happened outside of a Suspense boundary, the entire root will switch to client rendering."), workInProgress2); + return mountHostRootWithoutHydrating(current2, workInProgress2, nextChildren, renderLanes2, recoverableError); + } else if (nextChildren !== prevChildren) { + var _recoverableError = createCapturedValueAtFiber(new Error("This root received an early update, before anything was able hydrate. Switched the entire root to client rendering."), workInProgress2); + return mountHostRootWithoutHydrating(current2, workInProgress2, nextChildren, renderLanes2, _recoverableError); + } else { + enterHydrationState(workInProgress2); + var child = mountChildFibers(workInProgress2, null, nextChildren, renderLanes2); + workInProgress2.child = child; + var node = child; + while (node) { + node.flags = node.flags & ~Placement | Hydrating; + node = node.sibling; + } + } + } else { + resetHydrationState(); + if (nextChildren === prevChildren) { + return bailoutOnAlreadyFinishedWork(current2, workInProgress2, renderLanes2); + } + reconcileChildren(current2, workInProgress2, nextChildren, renderLanes2); + } + return workInProgress2.child; + } + function mountHostRootWithoutHydrating(current2, workInProgress2, nextChildren, renderLanes2, recoverableError) { + resetHydrationState(); + queueHydrationError(recoverableError); + workInProgress2.flags |= ForceClientRender; + reconcileChildren(current2, workInProgress2, nextChildren, renderLanes2); + return workInProgress2.child; + } + function updateHostComponent(current2, workInProgress2, renderLanes2) { + pushHostContext(workInProgress2); + if (current2 === null) { + tryToClaimNextHydratableInstance(workInProgress2); + } + var type = workInProgress2.type; + var nextProps = workInProgress2.pendingProps; + var prevProps = current2 !== null ? current2.memoizedProps : null; + var nextChildren = nextProps.children; + var isDirectTextChild = shouldSetTextContent(type, nextProps); + if (isDirectTextChild) { + nextChildren = null; + } else if (prevProps !== null && shouldSetTextContent(type, prevProps)) { + workInProgress2.flags |= ContentReset; + } + markRef(current2, workInProgress2); + reconcileChildren(current2, workInProgress2, nextChildren, renderLanes2); + return workInProgress2.child; + } + function updateHostText(current2, workInProgress2) { + if (current2 === null) { + tryToClaimNextHydratableInstance(workInProgress2); + } + return null; + } + function mountLazyComponent(_current, workInProgress2, elementType, renderLanes2) { + resetSuspendedCurrentOnMountInLegacyMode(_current, workInProgress2); + var props = workInProgress2.pendingProps; + var lazyComponent = elementType; + var payload = lazyComponent._payload; + var init = lazyComponent._init; + var Component = init(payload); + workInProgress2.type = Component; + var resolvedTag = workInProgress2.tag = resolveLazyComponentTag(Component); + var resolvedProps = resolveDefaultProps(Component, props); + var child; + switch (resolvedTag) { + case FunctionComponent: { + { + validateFunctionComponentInDev(workInProgress2, Component); + workInProgress2.type = Component = resolveFunctionForHotReloading(Component); + } + child = updateFunctionComponent(null, workInProgress2, Component, resolvedProps, renderLanes2); + return child; + } + case ClassComponent: { + { + workInProgress2.type = Component = resolveClassForHotReloading(Component); + } + child = updateClassComponent(null, workInProgress2, Component, resolvedProps, renderLanes2); + return child; + } + case ForwardRef: { + { + workInProgress2.type = Component = resolveForwardRefForHotReloading(Component); + } + child = updateForwardRef(null, workInProgress2, Component, resolvedProps, renderLanes2); + return child; + } + case MemoComponent: { + { + if (workInProgress2.type !== workInProgress2.elementType) { + var outerPropTypes = Component.propTypes; + if (outerPropTypes) { + checkPropTypes( + outerPropTypes, + resolvedProps, + // Resolved for outer only + "prop", + getComponentNameFromType(Component) + ); + } + } + } + child = updateMemoComponent( + null, + workInProgress2, + Component, + resolveDefaultProps(Component.type, resolvedProps), + // The inner type can have defaults too + renderLanes2 + ); + return child; + } + } + var hint = ""; + { + if (Component !== null && typeof Component === "object" && Component.$$typeof === REACT_LAZY_TYPE) { + hint = " Did you wrap a component in React.lazy() more than once?"; + } + } + throw new Error("Element type is invalid. Received a promise that resolves to: " + Component + ". " + ("Lazy element type must resolve to a class or function." + hint)); + } + function mountIncompleteClassComponent(_current, workInProgress2, Component, nextProps, renderLanes2) { + resetSuspendedCurrentOnMountInLegacyMode(_current, workInProgress2); + workInProgress2.tag = ClassComponent; + var hasContext; + if (isContextProvider(Component)) { + hasContext = true; + pushContextProvider(workInProgress2); + } else { + hasContext = false; + } + prepareToReadContext(workInProgress2, renderLanes2); + constructClassInstance(workInProgress2, Component, nextProps); + mountClassInstance(workInProgress2, Component, nextProps, renderLanes2); + return finishClassComponent(null, workInProgress2, Component, true, hasContext, renderLanes2); + } + function mountIndeterminateComponent(_current, workInProgress2, Component, renderLanes2) { + resetSuspendedCurrentOnMountInLegacyMode(_current, workInProgress2); + var props = workInProgress2.pendingProps; + var context; + { + var unmaskedContext = getUnmaskedContext(workInProgress2, Component, false); + context = getMaskedContext(workInProgress2, unmaskedContext); + } + prepareToReadContext(workInProgress2, renderLanes2); + var value; + var hasId; + { + markComponentRenderStarted(workInProgress2); + } + { + if (Component.prototype && typeof Component.prototype.render === "function") { + var componentName = getComponentNameFromType(Component) || "Unknown"; + if (!didWarnAboutBadClass[componentName]) { + error("The <%s /> component appears to have a render method, but doesn't extend React.Component. This is likely to cause errors. Change %s to extend React.Component instead.", componentName, componentName); + didWarnAboutBadClass[componentName] = true; + } + } + if (workInProgress2.mode & StrictLegacyMode) { + ReactStrictModeWarnings.recordLegacyContextWarning(workInProgress2, null); + } + setIsRendering(true); + ReactCurrentOwner$1.current = workInProgress2; + value = renderWithHooks(null, workInProgress2, Component, props, context, renderLanes2); + hasId = checkDidRenderIdHook(); + setIsRendering(false); + } + { + markComponentRenderStopped(); + } + workInProgress2.flags |= PerformedWork; + { + if (typeof value === "object" && value !== null && typeof value.render === "function" && value.$$typeof === void 0) { + var _componentName = getComponentNameFromType(Component) || "Unknown"; + if (!didWarnAboutModulePatternComponent[_componentName]) { + error("The <%s /> component appears to be a function component that returns a class instance. Change %s to a class that extends React.Component instead. If you can't use a class try assigning the prototype on the function as a workaround. `%s.prototype = React.Component.prototype`. Don't use an arrow function since it cannot be called with `new` by React.", _componentName, _componentName, _componentName); + didWarnAboutModulePatternComponent[_componentName] = true; + } + } + } + if ( + // Run these checks in production only if the flag is off. + // Eventually we'll delete this branch altogether. + typeof value === "object" && value !== null && typeof value.render === "function" && value.$$typeof === void 0 + ) { + { + var _componentName2 = getComponentNameFromType(Component) || "Unknown"; + if (!didWarnAboutModulePatternComponent[_componentName2]) { + error("The <%s /> component appears to be a function component that returns a class instance. Change %s to a class that extends React.Component instead. If you can't use a class try assigning the prototype on the function as a workaround. `%s.prototype = React.Component.prototype`. Don't use an arrow function since it cannot be called with `new` by React.", _componentName2, _componentName2, _componentName2); + didWarnAboutModulePatternComponent[_componentName2] = true; + } + } + workInProgress2.tag = ClassComponent; + workInProgress2.memoizedState = null; + workInProgress2.updateQueue = null; + var hasContext = false; + if (isContextProvider(Component)) { + hasContext = true; + pushContextProvider(workInProgress2); + } else { + hasContext = false; + } + workInProgress2.memoizedState = value.state !== null && value.state !== void 0 ? value.state : null; + initializeUpdateQueue(workInProgress2); + adoptClassInstance(workInProgress2, value); + mountClassInstance(workInProgress2, Component, props, renderLanes2); + return finishClassComponent(null, workInProgress2, Component, true, hasContext, renderLanes2); + } else { + workInProgress2.tag = FunctionComponent; + { + if (workInProgress2.mode & StrictLegacyMode) { + setIsStrictModeForDevtools(true); + try { + value = renderWithHooks(null, workInProgress2, Component, props, context, renderLanes2); + hasId = checkDidRenderIdHook(); + } finally { + setIsStrictModeForDevtools(false); + } + } + } + if (getIsHydrating() && hasId) { + pushMaterializedTreeId(workInProgress2); + } + reconcileChildren(null, workInProgress2, value, renderLanes2); + { + validateFunctionComponentInDev(workInProgress2, Component); + } + return workInProgress2.child; + } + } + function validateFunctionComponentInDev(workInProgress2, Component) { + { + if (Component) { + if (Component.childContextTypes) { + error("%s(...): childContextTypes cannot be defined on a function component.", Component.displayName || Component.name || "Component"); + } + } + if (workInProgress2.ref !== null) { + var info = ""; + var ownerName = getCurrentFiberOwnerNameInDevOrNull(); + if (ownerName) { + info += "\n\nCheck the render method of `" + ownerName + "`."; + } + var warningKey = ownerName || ""; + var debugSource = workInProgress2._debugSource; + if (debugSource) { + warningKey = debugSource.fileName + ":" + debugSource.lineNumber; + } + if (!didWarnAboutFunctionRefs[warningKey]) { + didWarnAboutFunctionRefs[warningKey] = true; + error("Function components cannot be given refs. Attempts to access this ref will fail. Did you mean to use React.forwardRef()?%s", info); + } + } + if (typeof Component.getDerivedStateFromProps === "function") { + var _componentName3 = getComponentNameFromType(Component) || "Unknown"; + if (!didWarnAboutGetDerivedStateOnFunctionComponent[_componentName3]) { + error("%s: Function components do not support getDerivedStateFromProps.", _componentName3); + didWarnAboutGetDerivedStateOnFunctionComponent[_componentName3] = true; + } + } + if (typeof Component.contextType === "object" && Component.contextType !== null) { + var _componentName4 = getComponentNameFromType(Component) || "Unknown"; + if (!didWarnAboutContextTypeOnFunctionComponent[_componentName4]) { + error("%s: Function components do not support contextType.", _componentName4); + didWarnAboutContextTypeOnFunctionComponent[_componentName4] = true; + } + } + } + } + var SUSPENDED_MARKER = { + dehydrated: null, + treeContext: null, + retryLane: NoLane + }; + function mountSuspenseOffscreenState(renderLanes2) { + return { + baseLanes: renderLanes2, + cachePool: getSuspendedCache(), + transitions: null + }; + } + function updateSuspenseOffscreenState(prevOffscreenState, renderLanes2) { + var cachePool = null; + return { + baseLanes: mergeLanes(prevOffscreenState.baseLanes, renderLanes2), + cachePool, + transitions: prevOffscreenState.transitions + }; + } + function shouldRemainOnFallback(suspenseContext, current2, workInProgress2, renderLanes2) { + if (current2 !== null) { + var suspenseState = current2.memoizedState; + if (suspenseState === null) { + return false; + } + } + return hasSuspenseContext(suspenseContext, ForceSuspenseFallback); + } + function getRemainingWorkInPrimaryTree(current2, renderLanes2) { + return removeLanes(current2.childLanes, renderLanes2); + } + function updateSuspenseComponent(current2, workInProgress2, renderLanes2) { + var nextProps = workInProgress2.pendingProps; + { + if (shouldSuspend(workInProgress2)) { + workInProgress2.flags |= DidCapture; + } + } + var suspenseContext = suspenseStackCursor.current; + var showFallback = false; + var didSuspend = (workInProgress2.flags & DidCapture) !== NoFlags; + if (didSuspend || shouldRemainOnFallback(suspenseContext, current2)) { + showFallback = true; + workInProgress2.flags &= ~DidCapture; + } else { + if (current2 === null || current2.memoizedState !== null) { + { + suspenseContext = addSubtreeSuspenseContext(suspenseContext, InvisibleParentSuspenseContext); + } + } + } + suspenseContext = setDefaultShallowSuspenseContext(suspenseContext); + pushSuspenseContext(workInProgress2, suspenseContext); + if (current2 === null) { + tryToClaimNextHydratableInstance(workInProgress2); + var suspenseState = workInProgress2.memoizedState; + if (suspenseState !== null) { + var dehydrated = suspenseState.dehydrated; + if (dehydrated !== null) { + return mountDehydratedSuspenseComponent(workInProgress2, dehydrated); + } + } + var nextPrimaryChildren = nextProps.children; + var nextFallbackChildren = nextProps.fallback; + if (showFallback) { + var fallbackFragment = mountSuspenseFallbackChildren(workInProgress2, nextPrimaryChildren, nextFallbackChildren, renderLanes2); + var primaryChildFragment = workInProgress2.child; + primaryChildFragment.memoizedState = mountSuspenseOffscreenState(renderLanes2); + workInProgress2.memoizedState = SUSPENDED_MARKER; + return fallbackFragment; + } else { + return mountSuspensePrimaryChildren(workInProgress2, nextPrimaryChildren); + } + } else { + var prevState = current2.memoizedState; + if (prevState !== null) { + var _dehydrated = prevState.dehydrated; + if (_dehydrated !== null) { + return updateDehydratedSuspenseComponent(current2, workInProgress2, didSuspend, nextProps, _dehydrated, prevState, renderLanes2); + } + } + if (showFallback) { + var _nextFallbackChildren = nextProps.fallback; + var _nextPrimaryChildren = nextProps.children; + var fallbackChildFragment = updateSuspenseFallbackChildren(current2, workInProgress2, _nextPrimaryChildren, _nextFallbackChildren, renderLanes2); + var _primaryChildFragment2 = workInProgress2.child; + var prevOffscreenState = current2.child.memoizedState; + _primaryChildFragment2.memoizedState = prevOffscreenState === null ? mountSuspenseOffscreenState(renderLanes2) : updateSuspenseOffscreenState(prevOffscreenState, renderLanes2); + _primaryChildFragment2.childLanes = getRemainingWorkInPrimaryTree(current2, renderLanes2); + workInProgress2.memoizedState = SUSPENDED_MARKER; + return fallbackChildFragment; + } else { + var _nextPrimaryChildren2 = nextProps.children; + var _primaryChildFragment3 = updateSuspensePrimaryChildren(current2, workInProgress2, _nextPrimaryChildren2, renderLanes2); + workInProgress2.memoizedState = null; + return _primaryChildFragment3; + } + } + } + function mountSuspensePrimaryChildren(workInProgress2, primaryChildren, renderLanes2) { + var mode = workInProgress2.mode; + var primaryChildProps = { + mode: "visible", + children: primaryChildren + }; + var primaryChildFragment = mountWorkInProgressOffscreenFiber(primaryChildProps, mode); + primaryChildFragment.return = workInProgress2; + workInProgress2.child = primaryChildFragment; + return primaryChildFragment; + } + function mountSuspenseFallbackChildren(workInProgress2, primaryChildren, fallbackChildren, renderLanes2) { + var mode = workInProgress2.mode; + var progressedPrimaryFragment = workInProgress2.child; + var primaryChildProps = { + mode: "hidden", + children: primaryChildren + }; + var primaryChildFragment; + var fallbackChildFragment; + if ((mode & ConcurrentMode) === NoMode && progressedPrimaryFragment !== null) { + primaryChildFragment = progressedPrimaryFragment; + primaryChildFragment.childLanes = NoLanes; + primaryChildFragment.pendingProps = primaryChildProps; + if (workInProgress2.mode & ProfileMode) { + primaryChildFragment.actualDuration = 0; + primaryChildFragment.actualStartTime = -1; + primaryChildFragment.selfBaseDuration = 0; + primaryChildFragment.treeBaseDuration = 0; + } + fallbackChildFragment = createFiberFromFragment(fallbackChildren, mode, renderLanes2, null); + } else { + primaryChildFragment = mountWorkInProgressOffscreenFiber(primaryChildProps, mode); + fallbackChildFragment = createFiberFromFragment(fallbackChildren, mode, renderLanes2, null); + } + primaryChildFragment.return = workInProgress2; + fallbackChildFragment.return = workInProgress2; + primaryChildFragment.sibling = fallbackChildFragment; + workInProgress2.child = primaryChildFragment; + return fallbackChildFragment; + } + function mountWorkInProgressOffscreenFiber(offscreenProps, mode, renderLanes2) { + return createFiberFromOffscreen(offscreenProps, mode, NoLanes, null); + } + function updateWorkInProgressOffscreenFiber(current2, offscreenProps) { + return createWorkInProgress(current2, offscreenProps); + } + function updateSuspensePrimaryChildren(current2, workInProgress2, primaryChildren, renderLanes2) { + var currentPrimaryChildFragment = current2.child; + var currentFallbackChildFragment = currentPrimaryChildFragment.sibling; + var primaryChildFragment = updateWorkInProgressOffscreenFiber(currentPrimaryChildFragment, { + mode: "visible", + children: primaryChildren + }); + if ((workInProgress2.mode & ConcurrentMode) === NoMode) { + primaryChildFragment.lanes = renderLanes2; + } + primaryChildFragment.return = workInProgress2; + primaryChildFragment.sibling = null; + if (currentFallbackChildFragment !== null) { + var deletions = workInProgress2.deletions; + if (deletions === null) { + workInProgress2.deletions = [currentFallbackChildFragment]; + workInProgress2.flags |= ChildDeletion; + } else { + deletions.push(currentFallbackChildFragment); + } + } + workInProgress2.child = primaryChildFragment; + return primaryChildFragment; + } + function updateSuspenseFallbackChildren(current2, workInProgress2, primaryChildren, fallbackChildren, renderLanes2) { + var mode = workInProgress2.mode; + var currentPrimaryChildFragment = current2.child; + var currentFallbackChildFragment = currentPrimaryChildFragment.sibling; + var primaryChildProps = { + mode: "hidden", + children: primaryChildren + }; + var primaryChildFragment; + if ( + // In legacy mode, we commit the primary tree as if it successfully + // completed, even though it's in an inconsistent state. + (mode & ConcurrentMode) === NoMode && // Make sure we're on the second pass, i.e. the primary child fragment was + // already cloned. In legacy mode, the only case where this isn't true is + // when DevTools forces us to display a fallback; we skip the first render + // pass entirely and go straight to rendering the fallback. (In Concurrent + // Mode, SuspenseList can also trigger this scenario, but this is a legacy- + // only codepath.) + workInProgress2.child !== currentPrimaryChildFragment + ) { + var progressedPrimaryFragment = workInProgress2.child; + primaryChildFragment = progressedPrimaryFragment; + primaryChildFragment.childLanes = NoLanes; + primaryChildFragment.pendingProps = primaryChildProps; + if (workInProgress2.mode & ProfileMode) { + primaryChildFragment.actualDuration = 0; + primaryChildFragment.actualStartTime = -1; + primaryChildFragment.selfBaseDuration = currentPrimaryChildFragment.selfBaseDuration; + primaryChildFragment.treeBaseDuration = currentPrimaryChildFragment.treeBaseDuration; + } + workInProgress2.deletions = null; + } else { + primaryChildFragment = updateWorkInProgressOffscreenFiber(currentPrimaryChildFragment, primaryChildProps); + primaryChildFragment.subtreeFlags = currentPrimaryChildFragment.subtreeFlags & StaticMask; + } + var fallbackChildFragment; + if (currentFallbackChildFragment !== null) { + fallbackChildFragment = createWorkInProgress(currentFallbackChildFragment, fallbackChildren); + } else { + fallbackChildFragment = createFiberFromFragment(fallbackChildren, mode, renderLanes2, null); + fallbackChildFragment.flags |= Placement; + } + fallbackChildFragment.return = workInProgress2; + primaryChildFragment.return = workInProgress2; + primaryChildFragment.sibling = fallbackChildFragment; + workInProgress2.child = primaryChildFragment; + return fallbackChildFragment; + } + function retrySuspenseComponentWithoutHydrating(current2, workInProgress2, renderLanes2, recoverableError) { + if (recoverableError !== null) { + queueHydrationError(recoverableError); + } + reconcileChildFibers(workInProgress2, current2.child, null, renderLanes2); + var nextProps = workInProgress2.pendingProps; + var primaryChildren = nextProps.children; + var primaryChildFragment = mountSuspensePrimaryChildren(workInProgress2, primaryChildren); + primaryChildFragment.flags |= Placement; + workInProgress2.memoizedState = null; + return primaryChildFragment; + } + function mountSuspenseFallbackAfterRetryWithoutHydrating(current2, workInProgress2, primaryChildren, fallbackChildren, renderLanes2) { + var fiberMode = workInProgress2.mode; + var primaryChildProps = { + mode: "visible", + children: primaryChildren + }; + var primaryChildFragment = mountWorkInProgressOffscreenFiber(primaryChildProps, fiberMode); + var fallbackChildFragment = createFiberFromFragment(fallbackChildren, fiberMode, renderLanes2, null); + fallbackChildFragment.flags |= Placement; + primaryChildFragment.return = workInProgress2; + fallbackChildFragment.return = workInProgress2; + primaryChildFragment.sibling = fallbackChildFragment; + workInProgress2.child = primaryChildFragment; + if ((workInProgress2.mode & ConcurrentMode) !== NoMode) { + reconcileChildFibers(workInProgress2, current2.child, null, renderLanes2); + } + return fallbackChildFragment; + } + function mountDehydratedSuspenseComponent(workInProgress2, suspenseInstance, renderLanes2) { + if ((workInProgress2.mode & ConcurrentMode) === NoMode) { + { + error("Cannot hydrate Suspense in legacy mode. Switch from ReactDOM.hydrate(element, container) to ReactDOMClient.hydrateRoot(container, ).render(element) or remove the Suspense components from the server rendered components."); + } + workInProgress2.lanes = laneToLanes(SyncLane); + } else if (isSuspenseInstanceFallback(suspenseInstance)) { + workInProgress2.lanes = laneToLanes(DefaultHydrationLane); + } else { + workInProgress2.lanes = laneToLanes(OffscreenLane); + } + return null; + } + function updateDehydratedSuspenseComponent(current2, workInProgress2, didSuspend, nextProps, suspenseInstance, suspenseState, renderLanes2) { + if (!didSuspend) { + warnIfHydrating(); + if ((workInProgress2.mode & ConcurrentMode) === NoMode) { + return retrySuspenseComponentWithoutHydrating( + current2, + workInProgress2, + renderLanes2, + // TODO: When we delete legacy mode, we should make this error argument + // required — every concurrent mode path that causes hydration to + // de-opt to client rendering should have an error message. + null + ); + } + if (isSuspenseInstanceFallback(suspenseInstance)) { + var digest, message, stack; + { + var _getSuspenseInstanceF = getSuspenseInstanceFallbackErrorDetails(suspenseInstance); + digest = _getSuspenseInstanceF.digest; + message = _getSuspenseInstanceF.message; + stack = _getSuspenseInstanceF.stack; + } + var error2; + if (message) { + error2 = new Error(message); + } else { + error2 = new Error("The server could not finish this Suspense boundary, likely due to an error during server rendering. Switched to client rendering."); + } + var capturedValue = createCapturedValue(error2, digest, stack); + return retrySuspenseComponentWithoutHydrating(current2, workInProgress2, renderLanes2, capturedValue); + } + var hasContextChanged2 = includesSomeLane(renderLanes2, current2.childLanes); + if (didReceiveUpdate || hasContextChanged2) { + var root = getWorkInProgressRoot(); + if (root !== null) { + var attemptHydrationAtLane = getBumpedLaneForHydration(root, renderLanes2); + if (attemptHydrationAtLane !== NoLane && attemptHydrationAtLane !== suspenseState.retryLane) { + suspenseState.retryLane = attemptHydrationAtLane; + var eventTime = NoTimestamp; + enqueueConcurrentRenderForLane(current2, attemptHydrationAtLane); + scheduleUpdateOnFiber(root, current2, attemptHydrationAtLane, eventTime); + } + } + renderDidSuspendDelayIfPossible(); + var _capturedValue = createCapturedValue(new Error("This Suspense boundary received an update before it finished hydrating. This caused the boundary to switch to client rendering. The usual way to fix this is to wrap the original update in startTransition.")); + return retrySuspenseComponentWithoutHydrating(current2, workInProgress2, renderLanes2, _capturedValue); + } else if (isSuspenseInstancePending(suspenseInstance)) { + workInProgress2.flags |= DidCapture; + workInProgress2.child = current2.child; + var retry = retryDehydratedSuspenseBoundary.bind(null, current2); + registerSuspenseInstanceRetry(suspenseInstance, retry); + return null; + } else { + reenterHydrationStateFromDehydratedSuspenseInstance(workInProgress2, suspenseInstance, suspenseState.treeContext); + var primaryChildren = nextProps.children; + var primaryChildFragment = mountSuspensePrimaryChildren(workInProgress2, primaryChildren); + primaryChildFragment.flags |= Hydrating; + return primaryChildFragment; + } + } else { + if (workInProgress2.flags & ForceClientRender) { + workInProgress2.flags &= ~ForceClientRender; + var _capturedValue2 = createCapturedValue(new Error("There was an error while hydrating this Suspense boundary. Switched to client rendering.")); + return retrySuspenseComponentWithoutHydrating(current2, workInProgress2, renderLanes2, _capturedValue2); + } else if (workInProgress2.memoizedState !== null) { + workInProgress2.child = current2.child; + workInProgress2.flags |= DidCapture; + return null; + } else { + var nextPrimaryChildren = nextProps.children; + var nextFallbackChildren = nextProps.fallback; + var fallbackChildFragment = mountSuspenseFallbackAfterRetryWithoutHydrating(current2, workInProgress2, nextPrimaryChildren, nextFallbackChildren, renderLanes2); + var _primaryChildFragment4 = workInProgress2.child; + _primaryChildFragment4.memoizedState = mountSuspenseOffscreenState(renderLanes2); + workInProgress2.memoizedState = SUSPENDED_MARKER; + return fallbackChildFragment; + } + } + } + function scheduleSuspenseWorkOnFiber(fiber, renderLanes2, propagationRoot) { + fiber.lanes = mergeLanes(fiber.lanes, renderLanes2); + var alternate = fiber.alternate; + if (alternate !== null) { + alternate.lanes = mergeLanes(alternate.lanes, renderLanes2); + } + scheduleContextWorkOnParentPath(fiber.return, renderLanes2, propagationRoot); + } + function propagateSuspenseContextChange(workInProgress2, firstChild, renderLanes2) { + var node = firstChild; + while (node !== null) { + if (node.tag === SuspenseComponent) { + var state = node.memoizedState; + if (state !== null) { + scheduleSuspenseWorkOnFiber(node, renderLanes2, workInProgress2); + } + } else if (node.tag === SuspenseListComponent) { + scheduleSuspenseWorkOnFiber(node, renderLanes2, workInProgress2); + } else if (node.child !== null) { + node.child.return = node; + node = node.child; + continue; + } + if (node === workInProgress2) { + return; + } + while (node.sibling === null) { + if (node.return === null || node.return === workInProgress2) { + return; + } + node = node.return; + } + node.sibling.return = node.return; + node = node.sibling; + } + } + function findLastContentRow(firstChild) { + var row = firstChild; + var lastContentRow = null; + while (row !== null) { + var currentRow = row.alternate; + if (currentRow !== null && findFirstSuspended(currentRow) === null) { + lastContentRow = row; + } + row = row.sibling; + } + return lastContentRow; + } + function validateRevealOrder(revealOrder) { + { + if (revealOrder !== void 0 && revealOrder !== "forwards" && revealOrder !== "backwards" && revealOrder !== "together" && !didWarnAboutRevealOrder[revealOrder]) { + didWarnAboutRevealOrder[revealOrder] = true; + if (typeof revealOrder === "string") { + switch (revealOrder.toLowerCase()) { + case "together": + case "forwards": + case "backwards": { + error('"%s" is not a valid value for revealOrder on . Use lowercase "%s" instead.', revealOrder, revealOrder.toLowerCase()); + break; + } + case "forward": + case "backward": { + error('"%s" is not a valid value for revealOrder on . React uses the -s suffix in the spelling. Use "%ss" instead.', revealOrder, revealOrder.toLowerCase()); + break; + } + default: + error('"%s" is not a supported revealOrder on . Did you mean "together", "forwards" or "backwards"?', revealOrder); + break; + } + } else { + error('%s is not a supported value for revealOrder on . Did you mean "together", "forwards" or "backwards"?', revealOrder); + } + } + } + } + function validateTailOptions(tailMode, revealOrder) { + { + if (tailMode !== void 0 && !didWarnAboutTailOptions[tailMode]) { + if (tailMode !== "collapsed" && tailMode !== "hidden") { + didWarnAboutTailOptions[tailMode] = true; + error('"%s" is not a supported value for tail on . Did you mean "collapsed" or "hidden"?', tailMode); + } else if (revealOrder !== "forwards" && revealOrder !== "backwards") { + didWarnAboutTailOptions[tailMode] = true; + error(' is only valid if revealOrder is "forwards" or "backwards". Did you mean to specify revealOrder="forwards"?', tailMode); + } + } + } + } + function validateSuspenseListNestedChild(childSlot, index2) { + { + var isAnArray = isArray(childSlot); + var isIterable = !isAnArray && typeof getIteratorFn(childSlot) === "function"; + if (isAnArray || isIterable) { + var type = isAnArray ? "array" : "iterable"; + error("A nested %s was passed to row #%s in . Wrap it in an additional SuspenseList to configure its revealOrder: ... {%s} ... ", type, index2, type); + return false; + } + } + return true; + } + function validateSuspenseListChildren(children, revealOrder) { + { + if ((revealOrder === "forwards" || revealOrder === "backwards") && children !== void 0 && children !== null && children !== false) { + if (isArray(children)) { + for (var i = 0; i < children.length; i++) { + if (!validateSuspenseListNestedChild(children[i], i)) { + return; + } + } + } else { + var iteratorFn = getIteratorFn(children); + if (typeof iteratorFn === "function") { + var childrenIterator = iteratorFn.call(children); + if (childrenIterator) { + var step = childrenIterator.next(); + var _i = 0; + for (; !step.done; step = childrenIterator.next()) { + if (!validateSuspenseListNestedChild(step.value, _i)) { + return; + } + _i++; + } + } + } else { + error('A single row was passed to a . This is not useful since it needs multiple rows. Did you mean to pass multiple children or an array?', revealOrder); + } + } + } + } + } + function initSuspenseListRenderState(workInProgress2, isBackwards, tail, lastContentRow, tailMode) { + var renderState = workInProgress2.memoizedState; + if (renderState === null) { + workInProgress2.memoizedState = { + isBackwards, + rendering: null, + renderingStartTime: 0, + last: lastContentRow, + tail, + tailMode + }; + } else { + renderState.isBackwards = isBackwards; + renderState.rendering = null; + renderState.renderingStartTime = 0; + renderState.last = lastContentRow; + renderState.tail = tail; + renderState.tailMode = tailMode; + } + } + function updateSuspenseListComponent(current2, workInProgress2, renderLanes2) { + var nextProps = workInProgress2.pendingProps; + var revealOrder = nextProps.revealOrder; + var tailMode = nextProps.tail; + var newChildren = nextProps.children; + validateRevealOrder(revealOrder); + validateTailOptions(tailMode, revealOrder); + validateSuspenseListChildren(newChildren, revealOrder); + reconcileChildren(current2, workInProgress2, newChildren, renderLanes2); + var suspenseContext = suspenseStackCursor.current; + var shouldForceFallback = hasSuspenseContext(suspenseContext, ForceSuspenseFallback); + if (shouldForceFallback) { + suspenseContext = setShallowSuspenseContext(suspenseContext, ForceSuspenseFallback); + workInProgress2.flags |= DidCapture; + } else { + var didSuspendBefore = current2 !== null && (current2.flags & DidCapture) !== NoFlags; + if (didSuspendBefore) { + propagateSuspenseContextChange(workInProgress2, workInProgress2.child, renderLanes2); + } + suspenseContext = setDefaultShallowSuspenseContext(suspenseContext); + } + pushSuspenseContext(workInProgress2, suspenseContext); + if ((workInProgress2.mode & ConcurrentMode) === NoMode) { + workInProgress2.memoizedState = null; + } else { + switch (revealOrder) { + case "forwards": { + var lastContentRow = findLastContentRow(workInProgress2.child); + var tail; + if (lastContentRow === null) { + tail = workInProgress2.child; + workInProgress2.child = null; + } else { + tail = lastContentRow.sibling; + lastContentRow.sibling = null; + } + initSuspenseListRenderState( + workInProgress2, + false, + // isBackwards + tail, + lastContentRow, + tailMode + ); + break; + } + case "backwards": { + var _tail = null; + var row = workInProgress2.child; + workInProgress2.child = null; + while (row !== null) { + var currentRow = row.alternate; + if (currentRow !== null && findFirstSuspended(currentRow) === null) { + workInProgress2.child = row; + break; + } + var nextRow = row.sibling; + row.sibling = _tail; + _tail = row; + row = nextRow; + } + initSuspenseListRenderState( + workInProgress2, + true, + // isBackwards + _tail, + null, + // last + tailMode + ); + break; + } + case "together": { + initSuspenseListRenderState( + workInProgress2, + false, + // isBackwards + null, + // tail + null, + // last + void 0 + ); + break; + } + default: { + workInProgress2.memoizedState = null; + } + } + } + return workInProgress2.child; + } + function updatePortalComponent(current2, workInProgress2, renderLanes2) { + pushHostContainer(workInProgress2, workInProgress2.stateNode.containerInfo); + var nextChildren = workInProgress2.pendingProps; + if (current2 === null) { + workInProgress2.child = reconcileChildFibers(workInProgress2, null, nextChildren, renderLanes2); + } else { + reconcileChildren(current2, workInProgress2, nextChildren, renderLanes2); + } + return workInProgress2.child; + } + var hasWarnedAboutUsingNoValuePropOnContextProvider = false; + function updateContextProvider(current2, workInProgress2, renderLanes2) { + var providerType = workInProgress2.type; + var context = providerType._context; + var newProps = workInProgress2.pendingProps; + var oldProps = workInProgress2.memoizedProps; + var newValue = newProps.value; + { + if (!("value" in newProps)) { + if (!hasWarnedAboutUsingNoValuePropOnContextProvider) { + hasWarnedAboutUsingNoValuePropOnContextProvider = true; + error("The `value` prop is required for the ``. Did you misspell it or forget to pass it?"); + } + } + var providerPropTypes = workInProgress2.type.propTypes; + if (providerPropTypes) { + checkPropTypes(providerPropTypes, newProps, "prop", "Context.Provider"); + } + } + pushProvider(workInProgress2, context, newValue); + { + if (oldProps !== null) { + var oldValue = oldProps.value; + if (objectIs(oldValue, newValue)) { + if (oldProps.children === newProps.children && !hasContextChanged()) { + return bailoutOnAlreadyFinishedWork(current2, workInProgress2, renderLanes2); + } + } else { + propagateContextChange(workInProgress2, context, renderLanes2); + } + } + } + var newChildren = newProps.children; + reconcileChildren(current2, workInProgress2, newChildren, renderLanes2); + return workInProgress2.child; + } + var hasWarnedAboutUsingContextAsConsumer = false; + function updateContextConsumer(current2, workInProgress2, renderLanes2) { + var context = workInProgress2.type; + { + if (context._context === void 0) { + if (context !== context.Consumer) { + if (!hasWarnedAboutUsingContextAsConsumer) { + hasWarnedAboutUsingContextAsConsumer = true; + error("Rendering directly is not supported and will be removed in a future major release. Did you mean to render instead?"); + } + } + } else { + context = context._context; + } + } + var newProps = workInProgress2.pendingProps; + var render = newProps.children; + { + if (typeof render !== "function") { + error("A context consumer was rendered with multiple children, or a child that isn't a function. A context consumer expects a single child that is a function. If you did pass a function, make sure there is no trailing or leading whitespace around it."); + } + } + prepareToReadContext(workInProgress2, renderLanes2); + var newValue = readContext(context); + { + markComponentRenderStarted(workInProgress2); + } + var newChildren; + { + ReactCurrentOwner$1.current = workInProgress2; + setIsRendering(true); + newChildren = render(newValue); + setIsRendering(false); + } + { + markComponentRenderStopped(); + } + workInProgress2.flags |= PerformedWork; + reconcileChildren(current2, workInProgress2, newChildren, renderLanes2); + return workInProgress2.child; + } + function markWorkInProgressReceivedUpdate() { + didReceiveUpdate = true; + } + function resetSuspendedCurrentOnMountInLegacyMode(current2, workInProgress2) { + if ((workInProgress2.mode & ConcurrentMode) === NoMode) { + if (current2 !== null) { + current2.alternate = null; + workInProgress2.alternate = null; + workInProgress2.flags |= Placement; + } + } + } + function bailoutOnAlreadyFinishedWork(current2, workInProgress2, renderLanes2) { + if (current2 !== null) { + workInProgress2.dependencies = current2.dependencies; + } + { + stopProfilerTimerIfRunning(); + } + markSkippedUpdateLanes(workInProgress2.lanes); + if (!includesSomeLane(renderLanes2, workInProgress2.childLanes)) { + { + return null; + } + } + cloneChildFibers(current2, workInProgress2); + return workInProgress2.child; + } + function remountFiber(current2, oldWorkInProgress, newWorkInProgress) { + { + var returnFiber = oldWorkInProgress.return; + if (returnFiber === null) { + throw new Error("Cannot swap the root fiber."); + } + current2.alternate = null; + oldWorkInProgress.alternate = null; + newWorkInProgress.index = oldWorkInProgress.index; + newWorkInProgress.sibling = oldWorkInProgress.sibling; + newWorkInProgress.return = oldWorkInProgress.return; + newWorkInProgress.ref = oldWorkInProgress.ref; + if (oldWorkInProgress === returnFiber.child) { + returnFiber.child = newWorkInProgress; + } else { + var prevSibling = returnFiber.child; + if (prevSibling === null) { + throw new Error("Expected parent to have a child."); + } + while (prevSibling.sibling !== oldWorkInProgress) { + prevSibling = prevSibling.sibling; + if (prevSibling === null) { + throw new Error("Expected to find the previous sibling."); + } + } + prevSibling.sibling = newWorkInProgress; + } + var deletions = returnFiber.deletions; + if (deletions === null) { + returnFiber.deletions = [current2]; + returnFiber.flags |= ChildDeletion; + } else { + deletions.push(current2); + } + newWorkInProgress.flags |= Placement; + return newWorkInProgress; + } + } + function checkScheduledUpdateOrContext(current2, renderLanes2) { + var updateLanes = current2.lanes; + if (includesSomeLane(updateLanes, renderLanes2)) { + return true; + } + return false; + } + function attemptEarlyBailoutIfNoScheduledUpdate(current2, workInProgress2, renderLanes2) { + switch (workInProgress2.tag) { + case HostRoot: + pushHostRootContext(workInProgress2); + var root = workInProgress2.stateNode; + resetHydrationState(); + break; + case HostComponent: + pushHostContext(workInProgress2); + break; + case ClassComponent: { + var Component = workInProgress2.type; + if (isContextProvider(Component)) { + pushContextProvider(workInProgress2); + } + break; + } + case HostPortal: + pushHostContainer(workInProgress2, workInProgress2.stateNode.containerInfo); + break; + case ContextProvider: { + var newValue = workInProgress2.memoizedProps.value; + var context = workInProgress2.type._context; + pushProvider(workInProgress2, context, newValue); + break; + } + case Profiler: + { + var hasChildWork = includesSomeLane(renderLanes2, workInProgress2.childLanes); + if (hasChildWork) { + workInProgress2.flags |= Update; + } + { + var stateNode = workInProgress2.stateNode; + stateNode.effectDuration = 0; + stateNode.passiveEffectDuration = 0; + } + } + break; + case SuspenseComponent: { + var state = workInProgress2.memoizedState; + if (state !== null) { + if (state.dehydrated !== null) { + pushSuspenseContext(workInProgress2, setDefaultShallowSuspenseContext(suspenseStackCursor.current)); + workInProgress2.flags |= DidCapture; + return null; + } + var primaryChildFragment = workInProgress2.child; + var primaryChildLanes = primaryChildFragment.childLanes; + if (includesSomeLane(renderLanes2, primaryChildLanes)) { + return updateSuspenseComponent(current2, workInProgress2, renderLanes2); + } else { + pushSuspenseContext(workInProgress2, setDefaultShallowSuspenseContext(suspenseStackCursor.current)); + var child = bailoutOnAlreadyFinishedWork(current2, workInProgress2, renderLanes2); + if (child !== null) { + return child.sibling; + } else { + return null; + } + } + } else { + pushSuspenseContext(workInProgress2, setDefaultShallowSuspenseContext(suspenseStackCursor.current)); + } + break; + } + case SuspenseListComponent: { + var didSuspendBefore = (current2.flags & DidCapture) !== NoFlags; + var _hasChildWork = includesSomeLane(renderLanes2, workInProgress2.childLanes); + if (didSuspendBefore) { + if (_hasChildWork) { + return updateSuspenseListComponent(current2, workInProgress2, renderLanes2); + } + workInProgress2.flags |= DidCapture; + } + var renderState = workInProgress2.memoizedState; + if (renderState !== null) { + renderState.rendering = null; + renderState.tail = null; + renderState.lastEffect = null; + } + pushSuspenseContext(workInProgress2, suspenseStackCursor.current); + if (_hasChildWork) { + break; + } else { + return null; + } + } + case OffscreenComponent: + case LegacyHiddenComponent: { + workInProgress2.lanes = NoLanes; + return updateOffscreenComponent(current2, workInProgress2, renderLanes2); + } + } + return bailoutOnAlreadyFinishedWork(current2, workInProgress2, renderLanes2); + } + function beginWork(current2, workInProgress2, renderLanes2) { + { + if (workInProgress2._debugNeedsRemount && current2 !== null) { + return remountFiber(current2, workInProgress2, createFiberFromTypeAndProps(workInProgress2.type, workInProgress2.key, workInProgress2.pendingProps, workInProgress2._debugOwner || null, workInProgress2.mode, workInProgress2.lanes)); + } + } + if (current2 !== null) { + var oldProps = current2.memoizedProps; + var newProps = workInProgress2.pendingProps; + if (oldProps !== newProps || hasContextChanged() || // Force a re-render if the implementation changed due to hot reload: + workInProgress2.type !== current2.type) { + didReceiveUpdate = true; + } else { + var hasScheduledUpdateOrContext = checkScheduledUpdateOrContext(current2, renderLanes2); + if (!hasScheduledUpdateOrContext && // If this is the second pass of an error or suspense boundary, there + // may not be work scheduled on `current`, so we check for this flag. + (workInProgress2.flags & DidCapture) === NoFlags) { + didReceiveUpdate = false; + return attemptEarlyBailoutIfNoScheduledUpdate(current2, workInProgress2, renderLanes2); + } + if ((current2.flags & ForceUpdateForLegacySuspense) !== NoFlags) { + didReceiveUpdate = true; + } else { + didReceiveUpdate = false; + } + } + } else { + didReceiveUpdate = false; + if (getIsHydrating() && isForkedChild(workInProgress2)) { + var slotIndex = workInProgress2.index; + var numberOfForks = getForksAtLevel(); + pushTreeId(workInProgress2, numberOfForks, slotIndex); + } + } + workInProgress2.lanes = NoLanes; + switch (workInProgress2.tag) { + case IndeterminateComponent: { + return mountIndeterminateComponent(current2, workInProgress2, workInProgress2.type, renderLanes2); + } + case LazyComponent: { + var elementType = workInProgress2.elementType; + return mountLazyComponent(current2, workInProgress2, elementType, renderLanes2); + } + case FunctionComponent: { + var Component = workInProgress2.type; + var unresolvedProps = workInProgress2.pendingProps; + var resolvedProps = workInProgress2.elementType === Component ? unresolvedProps : resolveDefaultProps(Component, unresolvedProps); + return updateFunctionComponent(current2, workInProgress2, Component, resolvedProps, renderLanes2); + } + case ClassComponent: { + var _Component = workInProgress2.type; + var _unresolvedProps = workInProgress2.pendingProps; + var _resolvedProps = workInProgress2.elementType === _Component ? _unresolvedProps : resolveDefaultProps(_Component, _unresolvedProps); + return updateClassComponent(current2, workInProgress2, _Component, _resolvedProps, renderLanes2); + } + case HostRoot: + return updateHostRoot(current2, workInProgress2, renderLanes2); + case HostComponent: + return updateHostComponent(current2, workInProgress2, renderLanes2); + case HostText: + return updateHostText(current2, workInProgress2); + case SuspenseComponent: + return updateSuspenseComponent(current2, workInProgress2, renderLanes2); + case HostPortal: + return updatePortalComponent(current2, workInProgress2, renderLanes2); + case ForwardRef: { + var type = workInProgress2.type; + var _unresolvedProps2 = workInProgress2.pendingProps; + var _resolvedProps2 = workInProgress2.elementType === type ? _unresolvedProps2 : resolveDefaultProps(type, _unresolvedProps2); + return updateForwardRef(current2, workInProgress2, type, _resolvedProps2, renderLanes2); + } + case Fragment: + return updateFragment(current2, workInProgress2, renderLanes2); + case Mode: + return updateMode(current2, workInProgress2, renderLanes2); + case Profiler: + return updateProfiler(current2, workInProgress2, renderLanes2); + case ContextProvider: + return updateContextProvider(current2, workInProgress2, renderLanes2); + case ContextConsumer: + return updateContextConsumer(current2, workInProgress2, renderLanes2); + case MemoComponent: { + var _type2 = workInProgress2.type; + var _unresolvedProps3 = workInProgress2.pendingProps; + var _resolvedProps3 = resolveDefaultProps(_type2, _unresolvedProps3); + { + if (workInProgress2.type !== workInProgress2.elementType) { + var outerPropTypes = _type2.propTypes; + if (outerPropTypes) { + checkPropTypes( + outerPropTypes, + _resolvedProps3, + // Resolved for outer only + "prop", + getComponentNameFromType(_type2) + ); + } + } + } + _resolvedProps3 = resolveDefaultProps(_type2.type, _resolvedProps3); + return updateMemoComponent(current2, workInProgress2, _type2, _resolvedProps3, renderLanes2); + } + case SimpleMemoComponent: { + return updateSimpleMemoComponent(current2, workInProgress2, workInProgress2.type, workInProgress2.pendingProps, renderLanes2); + } + case IncompleteClassComponent: { + var _Component2 = workInProgress2.type; + var _unresolvedProps4 = workInProgress2.pendingProps; + var _resolvedProps4 = workInProgress2.elementType === _Component2 ? _unresolvedProps4 : resolveDefaultProps(_Component2, _unresolvedProps4); + return mountIncompleteClassComponent(current2, workInProgress2, _Component2, _resolvedProps4, renderLanes2); + } + case SuspenseListComponent: { + return updateSuspenseListComponent(current2, workInProgress2, renderLanes2); + } + case ScopeComponent: { + break; + } + case OffscreenComponent: { + return updateOffscreenComponent(current2, workInProgress2, renderLanes2); + } + } + throw new Error("Unknown unit of work tag (" + workInProgress2.tag + "). This error is likely caused by a bug in React. Please file an issue."); + } + function markUpdate(workInProgress2) { + workInProgress2.flags |= Update; + } + function markRef$1(workInProgress2) { + workInProgress2.flags |= Ref; + { + workInProgress2.flags |= RefStatic; + } + } + function hadNoMutationsEffects(current2, completedWork) { + var didBailout = current2 !== null && current2.child === completedWork.child; + if (didBailout) { + return true; + } + if ((completedWork.flags & ChildDeletion) !== NoFlags) { + return false; + } + var child = completedWork.child; + while (child !== null) { + if ((child.flags & MutationMask) !== NoFlags || (child.subtreeFlags & MutationMask) !== NoFlags) { + return false; + } + child = child.sibling; + } + return true; + } + var appendAllChildren; + var updateHostContainer; + var updateHostComponent$1; + var updateHostText$1; + if (supportsMutation) { + appendAllChildren = function(parent, workInProgress2, needsVisibilityToggle, isHidden) { + var node = workInProgress2.child; + while (node !== null) { + if (node.tag === HostComponent || node.tag === HostText) { + appendInitialChild(parent, node.stateNode); + } else if (node.tag === HostPortal) + ; + else if (node.child !== null) { + node.child.return = node; + node = node.child; + continue; + } + if (node === workInProgress2) { + return; + } + while (node.sibling === null) { + if (node.return === null || node.return === workInProgress2) { + return; + } + node = node.return; + } + node.sibling.return = node.return; + node = node.sibling; + } + }; + updateHostContainer = function(current2, workInProgress2) { + }; + updateHostComponent$1 = function(current2, workInProgress2, type, newProps, rootContainerInstance) { + var oldProps = current2.memoizedProps; + if (oldProps === newProps) { + return; + } + var instance = workInProgress2.stateNode; + var currentHostContext = getHostContext(); + var updatePayload = prepareUpdate(instance, type, oldProps, newProps, rootContainerInstance, currentHostContext); + workInProgress2.updateQueue = updatePayload; + if (updatePayload) { + markUpdate(workInProgress2); + } + }; + updateHostText$1 = function(current2, workInProgress2, oldText, newText) { + if (oldText !== newText) { + markUpdate(workInProgress2); + } + }; + } else if (supportsPersistence) { + appendAllChildren = function(parent, workInProgress2, needsVisibilityToggle, isHidden) { + var node = workInProgress2.child; + while (node !== null) { + if (node.tag === HostComponent) { + var instance = node.stateNode; + if (needsVisibilityToggle && isHidden) { + var props = node.memoizedProps; + var type = node.type; + instance = cloneHiddenInstance(instance, type, props, node); + } + appendInitialChild(parent, instance); + } else if (node.tag === HostText) { + var _instance = node.stateNode; + if (needsVisibilityToggle && isHidden) { + var text = node.memoizedProps; + _instance = cloneHiddenTextInstance(_instance, text, node); + } + appendInitialChild(parent, _instance); + } else if (node.tag === HostPortal) + ; + else if (node.tag === OffscreenComponent && node.memoizedState !== null) { + var child = node.child; + if (child !== null) { + child.return = node; + } + appendAllChildren(parent, node, true, true); + } else if (node.child !== null) { + node.child.return = node; + node = node.child; + continue; + } + node = node; + if (node === workInProgress2) { + return; + } + while (node.sibling === null) { + if (node.return === null || node.return === workInProgress2) { + return; + } + node = node.return; + } + node.sibling.return = node.return; + node = node.sibling; + } + }; + var appendAllChildrenToContainer = function(containerChildSet, workInProgress2, needsVisibilityToggle, isHidden) { + var node = workInProgress2.child; + while (node !== null) { + if (node.tag === HostComponent) { + var instance = node.stateNode; + if (needsVisibilityToggle && isHidden) { + var props = node.memoizedProps; + var type = node.type; + instance = cloneHiddenInstance(instance, type, props, node); + } + appendChildToContainerChildSet(containerChildSet, instance); + } else if (node.tag === HostText) { + var _instance2 = node.stateNode; + if (needsVisibilityToggle && isHidden) { + var text = node.memoizedProps; + _instance2 = cloneHiddenTextInstance(_instance2, text, node); + } + appendChildToContainerChildSet(containerChildSet, _instance2); + } else if (node.tag === HostPortal) + ; + else if (node.tag === OffscreenComponent && node.memoizedState !== null) { + var child = node.child; + if (child !== null) { + child.return = node; + } + appendAllChildrenToContainer(containerChildSet, node, true, true); + } else if (node.child !== null) { + node.child.return = node; + node = node.child; + continue; + } + node = node; + if (node === workInProgress2) { + return; + } + while (node.sibling === null) { + if (node.return === null || node.return === workInProgress2) { + return; + } + node = node.return; + } + node.sibling.return = node.return; + node = node.sibling; + } + }; + updateHostContainer = function(current2, workInProgress2) { + var portalOrRoot = workInProgress2.stateNode; + var childrenUnchanged = hadNoMutationsEffects(current2, workInProgress2); + if (childrenUnchanged) + ; + else { + var container = portalOrRoot.containerInfo; + var newChildSet = createContainerChildSet(container); + appendAllChildrenToContainer(newChildSet, workInProgress2, false, false); + portalOrRoot.pendingChildren = newChildSet; + markUpdate(workInProgress2); + finalizeContainerChildren(container, newChildSet); + } + }; + updateHostComponent$1 = function(current2, workInProgress2, type, newProps, rootContainerInstance) { + var currentInstance = current2.stateNode; + var oldProps = current2.memoizedProps; + var childrenUnchanged = hadNoMutationsEffects(current2, workInProgress2); + if (childrenUnchanged && oldProps === newProps) { + workInProgress2.stateNode = currentInstance; + return; + } + var recyclableInstance = workInProgress2.stateNode; + var currentHostContext = getHostContext(); + var updatePayload = null; + if (oldProps !== newProps) { + updatePayload = prepareUpdate(recyclableInstance, type, oldProps, newProps, rootContainerInstance, currentHostContext); + } + if (childrenUnchanged && updatePayload === null) { + workInProgress2.stateNode = currentInstance; + return; + } + var newInstance = cloneInstance(currentInstance, updatePayload, type, oldProps, newProps, workInProgress2, childrenUnchanged, recyclableInstance); + if (finalizeInitialChildren(newInstance, type, newProps, rootContainerInstance, currentHostContext)) { + markUpdate(workInProgress2); + } + workInProgress2.stateNode = newInstance; + if (childrenUnchanged) { + markUpdate(workInProgress2); + } else { + appendAllChildren(newInstance, workInProgress2, false, false); + } + }; + updateHostText$1 = function(current2, workInProgress2, oldText, newText) { + if (oldText !== newText) { + var rootContainerInstance = getRootHostContainer(); + var currentHostContext = getHostContext(); + workInProgress2.stateNode = createTextInstance(newText, rootContainerInstance, currentHostContext, workInProgress2); + markUpdate(workInProgress2); + } else { + workInProgress2.stateNode = current2.stateNode; + } + }; + } else { + updateHostContainer = function(current2, workInProgress2) { + }; + updateHostComponent$1 = function(current2, workInProgress2, type, newProps, rootContainerInstance) { + }; + updateHostText$1 = function(current2, workInProgress2, oldText, newText) { + }; + } + function cutOffTailIfNeeded(renderState, hasRenderedATailFallback) { + if (getIsHydrating()) { + return; + } + switch (renderState.tailMode) { + case "hidden": { + var tailNode = renderState.tail; + var lastTailNode = null; + while (tailNode !== null) { + if (tailNode.alternate !== null) { + lastTailNode = tailNode; + } + tailNode = tailNode.sibling; + } + if (lastTailNode === null) { + renderState.tail = null; + } else { + lastTailNode.sibling = null; + } + break; + } + case "collapsed": { + var _tailNode = renderState.tail; + var _lastTailNode = null; + while (_tailNode !== null) { + if (_tailNode.alternate !== null) { + _lastTailNode = _tailNode; + } + _tailNode = _tailNode.sibling; + } + if (_lastTailNode === null) { + if (!hasRenderedATailFallback && renderState.tail !== null) { + renderState.tail.sibling = null; + } else { + renderState.tail = null; + } + } else { + _lastTailNode.sibling = null; + } + break; + } + } + } + function bubbleProperties(completedWork) { + var didBailout = completedWork.alternate !== null && completedWork.alternate.child === completedWork.child; + var newChildLanes = NoLanes; + var subtreeFlags = NoFlags; + if (!didBailout) { + if ((completedWork.mode & ProfileMode) !== NoMode) { + var actualDuration = completedWork.actualDuration; + var treeBaseDuration = completedWork.selfBaseDuration; + var child = completedWork.child; + while (child !== null) { + newChildLanes = mergeLanes(newChildLanes, mergeLanes(child.lanes, child.childLanes)); + subtreeFlags |= child.subtreeFlags; + subtreeFlags |= child.flags; + actualDuration += child.actualDuration; + treeBaseDuration += child.treeBaseDuration; + child = child.sibling; + } + completedWork.actualDuration = actualDuration; + completedWork.treeBaseDuration = treeBaseDuration; + } else { + var _child = completedWork.child; + while (_child !== null) { + newChildLanes = mergeLanes(newChildLanes, mergeLanes(_child.lanes, _child.childLanes)); + subtreeFlags |= _child.subtreeFlags; + subtreeFlags |= _child.flags; + _child.return = completedWork; + _child = _child.sibling; + } + } + completedWork.subtreeFlags |= subtreeFlags; + } else { + if ((completedWork.mode & ProfileMode) !== NoMode) { + var _treeBaseDuration = completedWork.selfBaseDuration; + var _child2 = completedWork.child; + while (_child2 !== null) { + newChildLanes = mergeLanes(newChildLanes, mergeLanes(_child2.lanes, _child2.childLanes)); + subtreeFlags |= _child2.subtreeFlags & StaticMask; + subtreeFlags |= _child2.flags & StaticMask; + _treeBaseDuration += _child2.treeBaseDuration; + _child2 = _child2.sibling; + } + completedWork.treeBaseDuration = _treeBaseDuration; + } else { + var _child3 = completedWork.child; + while (_child3 !== null) { + newChildLanes = mergeLanes(newChildLanes, mergeLanes(_child3.lanes, _child3.childLanes)); + subtreeFlags |= _child3.subtreeFlags & StaticMask; + subtreeFlags |= _child3.flags & StaticMask; + _child3.return = completedWork; + _child3 = _child3.sibling; + } + } + completedWork.subtreeFlags |= subtreeFlags; + } + completedWork.childLanes = newChildLanes; + return didBailout; + } + function completeDehydratedSuspenseBoundary(current2, workInProgress2, nextState) { + if (hasUnhydratedTailNodes() && (workInProgress2.mode & ConcurrentMode) !== NoMode && (workInProgress2.flags & DidCapture) === NoFlags) { + warnIfUnhydratedTailNodes(workInProgress2); + resetHydrationState(); + workInProgress2.flags |= ForceClientRender | Incomplete | ShouldCapture; + return false; + } + var wasHydrated = popHydrationState(workInProgress2); + if (nextState !== null && nextState.dehydrated !== null) { + if (current2 === null) { + if (!wasHydrated) { + throw new Error("A dehydrated suspense component was completed without a hydrated node. This is probably a bug in React."); + } + prepareToHydrateHostSuspenseInstance(workInProgress2); + bubbleProperties(workInProgress2); + { + if ((workInProgress2.mode & ProfileMode) !== NoMode) { + var isTimedOutSuspense = nextState !== null; + if (isTimedOutSuspense) { + var primaryChildFragment = workInProgress2.child; + if (primaryChildFragment !== null) { + workInProgress2.treeBaseDuration -= primaryChildFragment.treeBaseDuration; + } + } + } + } + return false; + } else { + resetHydrationState(); + if ((workInProgress2.flags & DidCapture) === NoFlags) { + workInProgress2.memoizedState = null; + } + workInProgress2.flags |= Update; + bubbleProperties(workInProgress2); + { + if ((workInProgress2.mode & ProfileMode) !== NoMode) { + var _isTimedOutSuspense = nextState !== null; + if (_isTimedOutSuspense) { + var _primaryChildFragment = workInProgress2.child; + if (_primaryChildFragment !== null) { + workInProgress2.treeBaseDuration -= _primaryChildFragment.treeBaseDuration; + } + } + } + } + return false; + } + } else { + upgradeHydrationErrorsToRecoverable(); + return true; + } + } + function completeWork(current2, workInProgress2, renderLanes2) { + var newProps = workInProgress2.pendingProps; + popTreeContext(workInProgress2); + switch (workInProgress2.tag) { + case IndeterminateComponent: + case LazyComponent: + case SimpleMemoComponent: + case FunctionComponent: + case ForwardRef: + case Fragment: + case Mode: + case Profiler: + case ContextConsumer: + case MemoComponent: + bubbleProperties(workInProgress2); + return null; + case ClassComponent: { + var Component = workInProgress2.type; + if (isContextProvider(Component)) { + popContext(workInProgress2); + } + bubbleProperties(workInProgress2); + return null; + } + case HostRoot: { + var fiberRoot = workInProgress2.stateNode; + popHostContainer(workInProgress2); + popTopLevelContextObject(workInProgress2); + resetWorkInProgressVersions(); + if (fiberRoot.pendingContext) { + fiberRoot.context = fiberRoot.pendingContext; + fiberRoot.pendingContext = null; + } + if (current2 === null || current2.child === null) { + var wasHydrated = popHydrationState(workInProgress2); + if (wasHydrated) { + markUpdate(workInProgress2); + } else { + if (current2 !== null) { + var prevState = current2.memoizedState; + if ( + // Check if this is a client root + !prevState.isDehydrated || // Check if we reverted to client rendering (e.g. due to an error) + (workInProgress2.flags & ForceClientRender) !== NoFlags + ) { + workInProgress2.flags |= Snapshot; + upgradeHydrationErrorsToRecoverable(); + } + } + } + } + updateHostContainer(current2, workInProgress2); + bubbleProperties(workInProgress2); + return null; + } + case HostComponent: { + popHostContext(workInProgress2); + var rootContainerInstance = getRootHostContainer(); + var type = workInProgress2.type; + if (current2 !== null && workInProgress2.stateNode != null) { + updateHostComponent$1(current2, workInProgress2, type, newProps, rootContainerInstance); + if (current2.ref !== workInProgress2.ref) { + markRef$1(workInProgress2); + } + } else { + if (!newProps) { + if (workInProgress2.stateNode === null) { + throw new Error("We must have new props for new mounts. This error is likely caused by a bug in React. Please file an issue."); + } + bubbleProperties(workInProgress2); + return null; + } + var currentHostContext = getHostContext(); + var _wasHydrated = popHydrationState(workInProgress2); + if (_wasHydrated) { + if (prepareToHydrateHostInstance(workInProgress2, rootContainerInstance, currentHostContext)) { + markUpdate(workInProgress2); + } + } else { + var instance = createInstance(type, newProps, rootContainerInstance, currentHostContext, workInProgress2); + appendAllChildren(instance, workInProgress2, false, false); + workInProgress2.stateNode = instance; + if (finalizeInitialChildren(instance, type, newProps, rootContainerInstance, currentHostContext)) { + markUpdate(workInProgress2); + } + } + if (workInProgress2.ref !== null) { + markRef$1(workInProgress2); + } + } + bubbleProperties(workInProgress2); + return null; + } + case HostText: { + var newText = newProps; + if (current2 && workInProgress2.stateNode != null) { + var oldText = current2.memoizedProps; + updateHostText$1(current2, workInProgress2, oldText, newText); + } else { + if (typeof newText !== "string") { + if (workInProgress2.stateNode === null) { + throw new Error("We must have new props for new mounts. This error is likely caused by a bug in React. Please file an issue."); + } + } + var _rootContainerInstance = getRootHostContainer(); + var _currentHostContext = getHostContext(); + var _wasHydrated2 = popHydrationState(workInProgress2); + if (_wasHydrated2) { + if (prepareToHydrateHostTextInstance(workInProgress2)) { + markUpdate(workInProgress2); + } + } else { + workInProgress2.stateNode = createTextInstance(newText, _rootContainerInstance, _currentHostContext, workInProgress2); + } + } + bubbleProperties(workInProgress2); + return null; + } + case SuspenseComponent: { + popSuspenseContext(workInProgress2); + var nextState = workInProgress2.memoizedState; + if (current2 === null || current2.memoizedState !== null && current2.memoizedState.dehydrated !== null) { + var fallthroughToNormalSuspensePath = completeDehydratedSuspenseBoundary(current2, workInProgress2, nextState); + if (!fallthroughToNormalSuspensePath) { + if (workInProgress2.flags & ShouldCapture) { + return workInProgress2; + } else { + return null; + } + } + } + if ((workInProgress2.flags & DidCapture) !== NoFlags) { + workInProgress2.lanes = renderLanes2; + if ((workInProgress2.mode & ProfileMode) !== NoMode) { + transferActualDuration(workInProgress2); + } + return workInProgress2; + } + var nextDidTimeout = nextState !== null; + var prevDidTimeout = current2 !== null && current2.memoizedState !== null; + if (nextDidTimeout !== prevDidTimeout) { + if (nextDidTimeout) { + var _offscreenFiber2 = workInProgress2.child; + _offscreenFiber2.flags |= Visibility; + if ((workInProgress2.mode & ConcurrentMode) !== NoMode) { + var hasInvisibleChildContext = current2 === null && (workInProgress2.memoizedProps.unstable_avoidThisFallback !== true || !enableSuspenseAvoidThisFallback); + if (hasInvisibleChildContext || hasSuspenseContext(suspenseStackCursor.current, InvisibleParentSuspenseContext)) { + renderDidSuspend(); + } else { + renderDidSuspendDelayIfPossible(); + } + } + } + } + var wakeables = workInProgress2.updateQueue; + if (wakeables !== null) { + workInProgress2.flags |= Update; + } + bubbleProperties(workInProgress2); + { + if ((workInProgress2.mode & ProfileMode) !== NoMode) { + if (nextDidTimeout) { + var primaryChildFragment = workInProgress2.child; + if (primaryChildFragment !== null) { + workInProgress2.treeBaseDuration -= primaryChildFragment.treeBaseDuration; + } + } + } + } + return null; + } + case HostPortal: + popHostContainer(workInProgress2); + updateHostContainer(current2, workInProgress2); + if (current2 === null) { + preparePortalMount(workInProgress2.stateNode.containerInfo); + } + bubbleProperties(workInProgress2); + return null; + case ContextProvider: + var context = workInProgress2.type._context; + popProvider(context, workInProgress2); + bubbleProperties(workInProgress2); + return null; + case IncompleteClassComponent: { + var _Component = workInProgress2.type; + if (isContextProvider(_Component)) { + popContext(workInProgress2); + } + bubbleProperties(workInProgress2); + return null; + } + case SuspenseListComponent: { + popSuspenseContext(workInProgress2); + var renderState = workInProgress2.memoizedState; + if (renderState === null) { + bubbleProperties(workInProgress2); + return null; + } + var didSuspendAlready = (workInProgress2.flags & DidCapture) !== NoFlags; + var renderedTail = renderState.rendering; + if (renderedTail === null) { + if (!didSuspendAlready) { + var cannotBeSuspended = renderHasNotSuspendedYet() && (current2 === null || (current2.flags & DidCapture) === NoFlags); + if (!cannotBeSuspended) { + var row = workInProgress2.child; + while (row !== null) { + var suspended = findFirstSuspended(row); + if (suspended !== null) { + didSuspendAlready = true; + workInProgress2.flags |= DidCapture; + cutOffTailIfNeeded(renderState, false); + var newThenables = suspended.updateQueue; + if (newThenables !== null) { + workInProgress2.updateQueue = newThenables; + workInProgress2.flags |= Update; + } + workInProgress2.subtreeFlags = NoFlags; + resetChildFibers(workInProgress2, renderLanes2); + pushSuspenseContext(workInProgress2, setShallowSuspenseContext(suspenseStackCursor.current, ForceSuspenseFallback)); + return workInProgress2.child; + } + row = row.sibling; + } + } + if (renderState.tail !== null && now() > getRenderTargetTime()) { + workInProgress2.flags |= DidCapture; + didSuspendAlready = true; + cutOffTailIfNeeded(renderState, false); + workInProgress2.lanes = SomeRetryLane; + } + } else { + cutOffTailIfNeeded(renderState, false); + } + } else { + if (!didSuspendAlready) { + var _suspended = findFirstSuspended(renderedTail); + if (_suspended !== null) { + workInProgress2.flags |= DidCapture; + didSuspendAlready = true; + var _newThenables = _suspended.updateQueue; + if (_newThenables !== null) { + workInProgress2.updateQueue = _newThenables; + workInProgress2.flags |= Update; + } + cutOffTailIfNeeded(renderState, true); + if (renderState.tail === null && renderState.tailMode === "hidden" && !renderedTail.alternate && !getIsHydrating()) { + bubbleProperties(workInProgress2); + return null; + } + } else if ( + // The time it took to render last row is greater than the remaining + // time we have to render. So rendering one more row would likely + // exceed it. + now() * 2 - renderState.renderingStartTime > getRenderTargetTime() && renderLanes2 !== OffscreenLane + ) { + workInProgress2.flags |= DidCapture; + didSuspendAlready = true; + cutOffTailIfNeeded(renderState, false); + workInProgress2.lanes = SomeRetryLane; + } + } + if (renderState.isBackwards) { + renderedTail.sibling = workInProgress2.child; + workInProgress2.child = renderedTail; + } else { + var previousSibling = renderState.last; + if (previousSibling !== null) { + previousSibling.sibling = renderedTail; + } else { + workInProgress2.child = renderedTail; + } + renderState.last = renderedTail; + } + } + if (renderState.tail !== null) { + var next = renderState.tail; + renderState.rendering = next; + renderState.tail = next.sibling; + renderState.renderingStartTime = now(); + next.sibling = null; + var suspenseContext = suspenseStackCursor.current; + if (didSuspendAlready) { + suspenseContext = setShallowSuspenseContext(suspenseContext, ForceSuspenseFallback); + } else { + suspenseContext = setDefaultShallowSuspenseContext(suspenseContext); + } + pushSuspenseContext(workInProgress2, suspenseContext); + return next; + } + bubbleProperties(workInProgress2); + return null; + } + case ScopeComponent: { + break; + } + case OffscreenComponent: + case LegacyHiddenComponent: { + popRenderLanes(workInProgress2); + var _nextState = workInProgress2.memoizedState; + var nextIsHidden = _nextState !== null; + if (current2 !== null) { + var _prevState = current2.memoizedState; + var prevIsHidden = _prevState !== null; + if (prevIsHidden !== nextIsHidden && // LegacyHidden doesn't do any hiding — it only pre-renders. + !enableLegacyHidden) { + workInProgress2.flags |= Visibility; + } + } + if (!nextIsHidden || (workInProgress2.mode & ConcurrentMode) === NoMode) { + bubbleProperties(workInProgress2); + } else { + if (includesSomeLane(subtreeRenderLanes, OffscreenLane)) { + bubbleProperties(workInProgress2); + if (supportsMutation) { + if (workInProgress2.subtreeFlags & (Placement | Update)) { + workInProgress2.flags |= Visibility; + } + } + } + } + return null; + } + case CacheComponent: { + return null; + } + case TracingMarkerComponent: { + return null; + } + } + throw new Error("Unknown unit of work tag (" + workInProgress2.tag + "). This error is likely caused by a bug in React. Please file an issue."); + } + function unwindWork(current2, workInProgress2, renderLanes2) { + popTreeContext(workInProgress2); + switch (workInProgress2.tag) { + case ClassComponent: { + var Component = workInProgress2.type; + if (isContextProvider(Component)) { + popContext(workInProgress2); + } + var flags = workInProgress2.flags; + if (flags & ShouldCapture) { + workInProgress2.flags = flags & ~ShouldCapture | DidCapture; + if ((workInProgress2.mode & ProfileMode) !== NoMode) { + transferActualDuration(workInProgress2); + } + return workInProgress2; + } + return null; + } + case HostRoot: { + var root = workInProgress2.stateNode; + popHostContainer(workInProgress2); + popTopLevelContextObject(workInProgress2); + resetWorkInProgressVersions(); + var _flags = workInProgress2.flags; + if ((_flags & ShouldCapture) !== NoFlags && (_flags & DidCapture) === NoFlags) { + workInProgress2.flags = _flags & ~ShouldCapture | DidCapture; + return workInProgress2; + } + return null; + } + case HostComponent: { + popHostContext(workInProgress2); + return null; + } + case SuspenseComponent: { + popSuspenseContext(workInProgress2); + var suspenseState = workInProgress2.memoizedState; + if (suspenseState !== null && suspenseState.dehydrated !== null) { + if (workInProgress2.alternate === null) { + throw new Error("Threw in newly mounted dehydrated component. This is likely a bug in React. Please file an issue."); + } + resetHydrationState(); + } + var _flags2 = workInProgress2.flags; + if (_flags2 & ShouldCapture) { + workInProgress2.flags = _flags2 & ~ShouldCapture | DidCapture; + if ((workInProgress2.mode & ProfileMode) !== NoMode) { + transferActualDuration(workInProgress2); + } + return workInProgress2; + } + return null; + } + case SuspenseListComponent: { + popSuspenseContext(workInProgress2); + return null; + } + case HostPortal: + popHostContainer(workInProgress2); + return null; + case ContextProvider: + var context = workInProgress2.type._context; + popProvider(context, workInProgress2); + return null; + case OffscreenComponent: + case LegacyHiddenComponent: + popRenderLanes(workInProgress2); + return null; + case CacheComponent: + return null; + default: + return null; + } + } + function unwindInterruptedWork(current2, interruptedWork, renderLanes2) { + popTreeContext(interruptedWork); + switch (interruptedWork.tag) { + case ClassComponent: { + var childContextTypes = interruptedWork.type.childContextTypes; + if (childContextTypes !== null && childContextTypes !== void 0) { + popContext(interruptedWork); + } + break; + } + case HostRoot: { + var root = interruptedWork.stateNode; + popHostContainer(interruptedWork); + popTopLevelContextObject(interruptedWork); + resetWorkInProgressVersions(); + break; + } + case HostComponent: { + popHostContext(interruptedWork); + break; + } + case HostPortal: + popHostContainer(interruptedWork); + break; + case SuspenseComponent: + popSuspenseContext(interruptedWork); + break; + case SuspenseListComponent: + popSuspenseContext(interruptedWork); + break; + case ContextProvider: + var context = interruptedWork.type._context; + popProvider(context, interruptedWork); + break; + case OffscreenComponent: + case LegacyHiddenComponent: + popRenderLanes(interruptedWork); + break; + } + } + function invokeGuardedCallbackProd(name, func, context, a, b, c, d, e, f) { + var funcArgs = Array.prototype.slice.call(arguments, 3); + try { + func.apply(context, funcArgs); + } catch (error2) { + this.onError(error2); + } + } + var invokeGuardedCallbackImpl = invokeGuardedCallbackProd; + { + if (false) { + var fakeNode = (void 0).createElement("react"); + invokeGuardedCallbackImpl = function invokeGuardedCallbackDev(name, func, context, a, b, c, d, e, f) { + if (true) { + throw new Error("The `document` global was defined when React was initialized, but is not defined anymore. This can happen in a test environment if a component schedules an update from an asynchronous callback, but the test has already finished running. To solve this, you can either unmount the component at the end of your test (and ensure that any asynchronous operations get canceled in `componentWillUnmount`), or you can change the test itself to be asynchronous."); + } + var evt = (void 0).createEvent("Event"); + var didCall = false; + var didError = true; + var windowEvent = (void 0).event; + var windowEventDescriptor = Object.getOwnPropertyDescriptor(void 0, "event"); + function restoreAfterDispatch() { + fakeNode.removeEventListener(evtType, callCallback2, false); + if (typeof (void 0).event !== "undefined" && (void 0).hasOwnProperty("event")) { + (void 0).event = windowEvent; + } + } + var funcArgs = Array.prototype.slice.call(arguments, 3); + function callCallback2() { + didCall = true; + restoreAfterDispatch(); + func.apply(context, funcArgs); + didError = false; + } + var error2; + var didSetError = false; + var isCrossOriginError = false; + function handleWindowError(event) { + error2 = event.error; + didSetError = true; + if (error2 === null && event.colno === 0 && event.lineno === 0) { + isCrossOriginError = true; + } + if (event.defaultPrevented) { + if (error2 != null && typeof error2 === "object") { + try { + error2._suppressLogging = true; + } catch (inner) { + } + } + } + } + var evtType = "react-" + (name ? name : "invokeguardedcallback"); + (void 0).addEventListener("error", handleWindowError); + fakeNode.addEventListener(evtType, callCallback2, false); + evt.initEvent(evtType, false, false); + fakeNode.dispatchEvent(evt); + if (windowEventDescriptor) { + Object.defineProperty(void 0, "event", windowEventDescriptor); + } + if (didCall && didError) { + if (!didSetError) { + error2 = new Error(`An error was thrown inside one of your components, but React doesn't know what it was. This is likely due to browser flakiness. React does its best to preserve the "Pause on exceptions" behavior of the DevTools, which requires some DEV-mode only tricks. It's possible that these don't work in your browser. Try triggering the error in production mode, or switching to a modern browser. If you suspect that this is actually an issue with React, please file an issue.`); + } else if (isCrossOriginError) { + error2 = new Error("A cross-origin error was thrown. React doesn't have access to the actual error object in development. See https://reactjs.org/link/crossorigin-error for more information."); + } + this.onError(error2); + } + (void 0).removeEventListener("error", handleWindowError); + if (!didCall) { + restoreAfterDispatch(); + return invokeGuardedCallbackProd.apply(this, arguments); + } + }; + } + } + var invokeGuardedCallbackImpl$1 = invokeGuardedCallbackImpl; + var hasError = false; + var caughtError = null; + var reporter = { + onError: function(error2) { + hasError = true; + caughtError = error2; + } + }; + function invokeGuardedCallback(name, func, context, a, b, c, d, e, f) { + hasError = false; + caughtError = null; + invokeGuardedCallbackImpl$1.apply(reporter, arguments); + } + function hasCaughtError() { + return hasError; + } + function clearCaughtError() { + if (hasError) { + var error2 = caughtError; + hasError = false; + caughtError = null; + return error2; + } else { + throw new Error("clearCaughtError was called but no error was captured. This error is likely caused by a bug in React. Please file an issue."); + } + } + var didWarnAboutUndefinedSnapshotBeforeUpdate = null; + { + didWarnAboutUndefinedSnapshotBeforeUpdate = /* @__PURE__ */ new Set(); + } + var offscreenSubtreeIsHidden = false; + var offscreenSubtreeWasHidden = false; + var PossiblyWeakSet = typeof WeakSet === "function" ? WeakSet : Set; + var nextEffect = null; + var inProgressLanes = null; + var inProgressRoot = null; + function reportUncaughtErrorInDEV(error2) { + { + invokeGuardedCallback(null, function() { + throw error2; + }); + clearCaughtError(); + } + } + var callComponentWillUnmountWithTimer = function(current2, instance) { + instance.props = current2.memoizedProps; + instance.state = current2.memoizedState; + if (current2.mode & ProfileMode) { + try { + startLayoutEffectTimer(); + instance.componentWillUnmount(); + } finally { + recordLayoutEffectDuration(current2); + } + } else { + instance.componentWillUnmount(); + } + }; + function safelyCallCommitHookLayoutEffectListMount(current2, nearestMountedAncestor) { + try { + commitHookEffectListMount(Layout, current2); + } catch (error2) { + captureCommitPhaseError(current2, nearestMountedAncestor, error2); + } + } + function safelyCallComponentWillUnmount(current2, nearestMountedAncestor, instance) { + try { + callComponentWillUnmountWithTimer(current2, instance); + } catch (error2) { + captureCommitPhaseError(current2, nearestMountedAncestor, error2); + } + } + function safelyCallComponentDidMount(current2, nearestMountedAncestor, instance) { + try { + instance.componentDidMount(); + } catch (error2) { + captureCommitPhaseError(current2, nearestMountedAncestor, error2); + } + } + function safelyAttachRef(current2, nearestMountedAncestor) { + try { + commitAttachRef(current2); + } catch (error2) { + captureCommitPhaseError(current2, nearestMountedAncestor, error2); + } + } + function safelyDetachRef(current2, nearestMountedAncestor) { + var ref = current2.ref; + if (ref !== null) { + if (typeof ref === "function") { + var retVal; + try { + if (enableProfilerTimer && enableProfilerCommitHooks && current2.mode & ProfileMode) { + try { + startLayoutEffectTimer(); + retVal = ref(null); + } finally { + recordLayoutEffectDuration(current2); + } + } else { + retVal = ref(null); + } + } catch (error2) { + captureCommitPhaseError(current2, nearestMountedAncestor, error2); + } + { + if (typeof retVal === "function") { + error("Unexpected return value from a callback ref in %s. A callback ref should not return a function.", getComponentNameFromFiber(current2)); + } + } + } else { + ref.current = null; + } + } + } + function safelyCallDestroy(current2, nearestMountedAncestor, destroy) { + try { + destroy(); + } catch (error2) { + captureCommitPhaseError(current2, nearestMountedAncestor, error2); + } + } + var focusedInstanceHandle = null; + var shouldFireAfterActiveInstanceBlur = false; + function commitBeforeMutationEffects(root, firstChild) { + focusedInstanceHandle = prepareForCommit(root.containerInfo); + nextEffect = firstChild; + commitBeforeMutationEffects_begin(); + var shouldFire = shouldFireAfterActiveInstanceBlur; + shouldFireAfterActiveInstanceBlur = false; + focusedInstanceHandle = null; + return shouldFire; + } + function commitBeforeMutationEffects_begin() { + while (nextEffect !== null) { + var fiber = nextEffect; + var child = fiber.child; + if ((fiber.subtreeFlags & BeforeMutationMask) !== NoFlags && child !== null) { + child.return = fiber; + nextEffect = child; + } else { + commitBeforeMutationEffects_complete(); + } + } + } + function commitBeforeMutationEffects_complete() { + while (nextEffect !== null) { + var fiber = nextEffect; + setCurrentFiber(fiber); + try { + commitBeforeMutationEffectsOnFiber(fiber); + } catch (error2) { + captureCommitPhaseError(fiber, fiber.return, error2); + } + resetCurrentFiber(); + var sibling = fiber.sibling; + if (sibling !== null) { + sibling.return = fiber.return; + nextEffect = sibling; + return; + } + nextEffect = fiber.return; + } + } + function commitBeforeMutationEffectsOnFiber(finishedWork) { + var current2 = finishedWork.alternate; + var flags = finishedWork.flags; + if ((flags & Snapshot) !== NoFlags) { + setCurrentFiber(finishedWork); + switch (finishedWork.tag) { + case FunctionComponent: + case ForwardRef: + case SimpleMemoComponent: { + break; + } + case ClassComponent: { + if (current2 !== null) { + var prevProps = current2.memoizedProps; + var prevState = current2.memoizedState; + var instance = finishedWork.stateNode; + { + if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) { + if (instance.props !== finishedWork.memoizedProps) { + error("Expected %s props to match memoized props before getSnapshotBeforeUpdate. This might either be because of a bug in React, or because a component reassigns its own `this.props`. Please file an issue.", getComponentNameFromFiber(finishedWork) || "instance"); + } + if (instance.state !== finishedWork.memoizedState) { + error("Expected %s state to match memoized state before getSnapshotBeforeUpdate. This might either be because of a bug in React, or because a component reassigns its own `this.state`. Please file an issue.", getComponentNameFromFiber(finishedWork) || "instance"); + } + } + } + var snapshot = instance.getSnapshotBeforeUpdate(finishedWork.elementType === finishedWork.type ? prevProps : resolveDefaultProps(finishedWork.type, prevProps), prevState); + { + var didWarnSet = didWarnAboutUndefinedSnapshotBeforeUpdate; + if (snapshot === void 0 && !didWarnSet.has(finishedWork.type)) { + didWarnSet.add(finishedWork.type); + error("%s.getSnapshotBeforeUpdate(): A snapshot value (or null) must be returned. You have returned undefined.", getComponentNameFromFiber(finishedWork)); + } + } + instance.__reactInternalSnapshotBeforeUpdate = snapshot; + } + break; + } + case HostRoot: { + if (supportsMutation) { + var root = finishedWork.stateNode; + clearContainer(root.containerInfo); + } + break; + } + case HostComponent: + case HostText: + case HostPortal: + case IncompleteClassComponent: + break; + default: { + throw new Error("This unit of work tag should not have side-effects. This error is likely caused by a bug in React. Please file an issue."); + } + } + resetCurrentFiber(); + } + } + function commitHookEffectListUnmount(flags, finishedWork, nearestMountedAncestor) { + var updateQueue = finishedWork.updateQueue; + var lastEffect = updateQueue !== null ? updateQueue.lastEffect : null; + if (lastEffect !== null) { + var firstEffect = lastEffect.next; + var effect = firstEffect; + do { + if ((effect.tag & flags) === flags) { + var destroy = effect.destroy; + effect.destroy = void 0; + if (destroy !== void 0) { + { + if ((flags & Passive$1) !== NoFlags$1) { + markComponentPassiveEffectUnmountStarted(finishedWork); + } else if ((flags & Layout) !== NoFlags$1) { + markComponentLayoutEffectUnmountStarted(finishedWork); + } + } + { + if ((flags & Insertion) !== NoFlags$1) { + setIsRunningInsertionEffect(true); + } + } + safelyCallDestroy(finishedWork, nearestMountedAncestor, destroy); + { + if ((flags & Insertion) !== NoFlags$1) { + setIsRunningInsertionEffect(false); + } + } + { + if ((flags & Passive$1) !== NoFlags$1) { + markComponentPassiveEffectUnmountStopped(); + } else if ((flags & Layout) !== NoFlags$1) { + markComponentLayoutEffectUnmountStopped(); + } + } + } + } + effect = effect.next; + } while (effect !== firstEffect); + } + } + function commitHookEffectListMount(flags, finishedWork) { + var updateQueue = finishedWork.updateQueue; + var lastEffect = updateQueue !== null ? updateQueue.lastEffect : null; + if (lastEffect !== null) { + var firstEffect = lastEffect.next; + var effect = firstEffect; + do { + if ((effect.tag & flags) === flags) { + { + if ((flags & Passive$1) !== NoFlags$1) { + markComponentPassiveEffectMountStarted(finishedWork); + } else if ((flags & Layout) !== NoFlags$1) { + markComponentLayoutEffectMountStarted(finishedWork); + } + } + var create = effect.create; + { + if ((flags & Insertion) !== NoFlags$1) { + setIsRunningInsertionEffect(true); + } + } + effect.destroy = create(); + { + if ((flags & Insertion) !== NoFlags$1) { + setIsRunningInsertionEffect(false); + } + } + { + if ((flags & Passive$1) !== NoFlags$1) { + markComponentPassiveEffectMountStopped(); + } else if ((flags & Layout) !== NoFlags$1) { + markComponentLayoutEffectMountStopped(); + } + } + { + var destroy = effect.destroy; + if (destroy !== void 0 && typeof destroy !== "function") { + var hookName = void 0; + if ((effect.tag & Layout) !== NoFlags) { + hookName = "useLayoutEffect"; + } else if ((effect.tag & Insertion) !== NoFlags) { + hookName = "useInsertionEffect"; + } else { + hookName = "useEffect"; + } + var addendum = void 0; + if (destroy === null) { + addendum = " You returned null. If your effect does not require clean up, return undefined (or nothing)."; + } else if (typeof destroy.then === "function") { + addendum = "\n\nIt looks like you wrote " + hookName + "(async () => ...) or returned a Promise. Instead, write the async function inside your effect and call it immediately:\n\n" + hookName + "(() => {\n async function fetchData() {\n // You can await here\n const response = await MyAPI.getData(someId);\n // ...\n }\n fetchData();\n}, [someId]); // Or [] if effect doesn't need props or state\n\nLearn more about data fetching with Hooks: https://reactjs.org/link/hooks-data-fetching"; + } else { + addendum = " You returned: " + destroy; + } + error("%s must not return anything besides a function, which is used for clean-up.%s", hookName, addendum); + } + } + } + effect = effect.next; + } while (effect !== firstEffect); + } + } + function commitPassiveEffectDurations(finishedRoot, finishedWork) { + { + if ((finishedWork.flags & Update) !== NoFlags) { + switch (finishedWork.tag) { + case Profiler: { + var passiveEffectDuration = finishedWork.stateNode.passiveEffectDuration; + var _finishedWork$memoize = finishedWork.memoizedProps, id = _finishedWork$memoize.id, onPostCommit = _finishedWork$memoize.onPostCommit; + var commitTime2 = getCommitTime(); + var phase = finishedWork.alternate === null ? "mount" : "update"; + { + if (isCurrentUpdateNested()) { + phase = "nested-update"; + } + } + if (typeof onPostCommit === "function") { + onPostCommit(id, phase, passiveEffectDuration, commitTime2); + } + var parentFiber = finishedWork.return; + outer: + while (parentFiber !== null) { + switch (parentFiber.tag) { + case HostRoot: + var root = parentFiber.stateNode; + root.passiveEffectDuration += passiveEffectDuration; + break outer; + case Profiler: + var parentStateNode = parentFiber.stateNode; + parentStateNode.passiveEffectDuration += passiveEffectDuration; + break outer; + } + parentFiber = parentFiber.return; + } + break; + } + } + } + } + } + function commitLayoutEffectOnFiber(finishedRoot, current2, finishedWork, committedLanes) { + if ((finishedWork.flags & LayoutMask) !== NoFlags) { + switch (finishedWork.tag) { + case FunctionComponent: + case ForwardRef: + case SimpleMemoComponent: { + if (!offscreenSubtreeWasHidden) { + if (finishedWork.mode & ProfileMode) { + try { + startLayoutEffectTimer(); + commitHookEffectListMount(Layout | HasEffect, finishedWork); + } finally { + recordLayoutEffectDuration(finishedWork); + } + } else { + commitHookEffectListMount(Layout | HasEffect, finishedWork); + } + } + break; + } + case ClassComponent: { + var instance = finishedWork.stateNode; + if (finishedWork.flags & Update) { + if (!offscreenSubtreeWasHidden) { + if (current2 === null) { + { + if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) { + if (instance.props !== finishedWork.memoizedProps) { + error("Expected %s props to match memoized props before componentDidMount. This might either be because of a bug in React, or because a component reassigns its own `this.props`. Please file an issue.", getComponentNameFromFiber(finishedWork) || "instance"); + } + if (instance.state !== finishedWork.memoizedState) { + error("Expected %s state to match memoized state before componentDidMount. This might either be because of a bug in React, or because a component reassigns its own `this.state`. Please file an issue.", getComponentNameFromFiber(finishedWork) || "instance"); + } + } + } + if (finishedWork.mode & ProfileMode) { + try { + startLayoutEffectTimer(); + instance.componentDidMount(); + } finally { + recordLayoutEffectDuration(finishedWork); + } + } else { + instance.componentDidMount(); + } + } else { + var prevProps = finishedWork.elementType === finishedWork.type ? current2.memoizedProps : resolveDefaultProps(finishedWork.type, current2.memoizedProps); + var prevState = current2.memoizedState; + { + if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) { + if (instance.props !== finishedWork.memoizedProps) { + error("Expected %s props to match memoized props before componentDidUpdate. This might either be because of a bug in React, or because a component reassigns its own `this.props`. Please file an issue.", getComponentNameFromFiber(finishedWork) || "instance"); + } + if (instance.state !== finishedWork.memoizedState) { + error("Expected %s state to match memoized state before componentDidUpdate. This might either be because of a bug in React, or because a component reassigns its own `this.state`. Please file an issue.", getComponentNameFromFiber(finishedWork) || "instance"); + } + } + } + if (finishedWork.mode & ProfileMode) { + try { + startLayoutEffectTimer(); + instance.componentDidUpdate(prevProps, prevState, instance.__reactInternalSnapshotBeforeUpdate); + } finally { + recordLayoutEffectDuration(finishedWork); + } + } else { + instance.componentDidUpdate(prevProps, prevState, instance.__reactInternalSnapshotBeforeUpdate); + } + } + } + } + var updateQueue = finishedWork.updateQueue; + if (updateQueue !== null) { + { + if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) { + if (instance.props !== finishedWork.memoizedProps) { + error("Expected %s props to match memoized props before processing the update queue. This might either be because of a bug in React, or because a component reassigns its own `this.props`. Please file an issue.", getComponentNameFromFiber(finishedWork) || "instance"); + } + if (instance.state !== finishedWork.memoizedState) { + error("Expected %s state to match memoized state before processing the update queue. This might either be because of a bug in React, or because a component reassigns its own `this.state`. Please file an issue.", getComponentNameFromFiber(finishedWork) || "instance"); + } + } + } + commitUpdateQueue(finishedWork, updateQueue, instance); + } + break; + } + case HostRoot: { + var _updateQueue = finishedWork.updateQueue; + if (_updateQueue !== null) { + var _instance = null; + if (finishedWork.child !== null) { + switch (finishedWork.child.tag) { + case HostComponent: + _instance = getPublicInstance(finishedWork.child.stateNode); + break; + case ClassComponent: + _instance = finishedWork.child.stateNode; + break; + } + } + commitUpdateQueue(finishedWork, _updateQueue, _instance); + } + break; + } + case HostComponent: { + var _instance2 = finishedWork.stateNode; + if (current2 === null && finishedWork.flags & Update) { + var type = finishedWork.type; + var props = finishedWork.memoizedProps; + commitMount(_instance2, type, props, finishedWork); + } + break; + } + case HostText: { + break; + } + case HostPortal: { + break; + } + case Profiler: { + { + var _finishedWork$memoize2 = finishedWork.memoizedProps, onCommit = _finishedWork$memoize2.onCommit, onRender = _finishedWork$memoize2.onRender; + var effectDuration = finishedWork.stateNode.effectDuration; + var commitTime2 = getCommitTime(); + var phase = current2 === null ? "mount" : "update"; + { + if (isCurrentUpdateNested()) { + phase = "nested-update"; + } + } + if (typeof onRender === "function") { + onRender(finishedWork.memoizedProps.id, phase, finishedWork.actualDuration, finishedWork.treeBaseDuration, finishedWork.actualStartTime, commitTime2); + } + { + if (typeof onCommit === "function") { + onCommit(finishedWork.memoizedProps.id, phase, effectDuration, commitTime2); + } + enqueuePendingPassiveProfilerEffect(finishedWork); + var parentFiber = finishedWork.return; + outer: + while (parentFiber !== null) { + switch (parentFiber.tag) { + case HostRoot: + var root = parentFiber.stateNode; + root.effectDuration += effectDuration; + break outer; + case Profiler: + var parentStateNode = parentFiber.stateNode; + parentStateNode.effectDuration += effectDuration; + break outer; + } + parentFiber = parentFiber.return; + } + } + } + break; + } + case SuspenseComponent: { + commitSuspenseHydrationCallbacks(finishedRoot, finishedWork); + break; + } + case SuspenseListComponent: + case IncompleteClassComponent: + case ScopeComponent: + case OffscreenComponent: + case LegacyHiddenComponent: + case TracingMarkerComponent: { + break; + } + default: + throw new Error("This unit of work tag should not have side-effects. This error is likely caused by a bug in React. Please file an issue."); + } + } + if (!offscreenSubtreeWasHidden) { + { + if (finishedWork.flags & Ref) { + commitAttachRef(finishedWork); + } + } + } + } + function reappearLayoutEffectsOnFiber(node) { + switch (node.tag) { + case FunctionComponent: + case ForwardRef: + case SimpleMemoComponent: { + if (node.mode & ProfileMode) { + try { + startLayoutEffectTimer(); + safelyCallCommitHookLayoutEffectListMount(node, node.return); + } finally { + recordLayoutEffectDuration(node); + } + } else { + safelyCallCommitHookLayoutEffectListMount(node, node.return); + } + break; + } + case ClassComponent: { + var instance = node.stateNode; + if (typeof instance.componentDidMount === "function") { + safelyCallComponentDidMount(node, node.return, instance); + } + safelyAttachRef(node, node.return); + break; + } + case HostComponent: { + safelyAttachRef(node, node.return); + break; + } + } + } + function hideOrUnhideAllChildren(finishedWork, isHidden) { + var hostSubtreeRoot = null; + if (supportsMutation) { + var node = finishedWork; + while (true) { + if (node.tag === HostComponent) { + if (hostSubtreeRoot === null) { + hostSubtreeRoot = node; + try { + var instance = node.stateNode; + if (isHidden) { + hideInstance(instance); + } else { + unhideInstance(node.stateNode, node.memoizedProps); + } + } catch (error2) { + captureCommitPhaseError(finishedWork, finishedWork.return, error2); + } + } + } else if (node.tag === HostText) { + if (hostSubtreeRoot === null) { + try { + var _instance3 = node.stateNode; + if (isHidden) { + hideTextInstance(_instance3); + } else { + unhideTextInstance(_instance3, node.memoizedProps); + } + } catch (error2) { + captureCommitPhaseError(finishedWork, finishedWork.return, error2); + } + } + } else if ((node.tag === OffscreenComponent || node.tag === LegacyHiddenComponent) && node.memoizedState !== null && node !== finishedWork) + ; + else if (node.child !== null) { + node.child.return = node; + node = node.child; + continue; + } + if (node === finishedWork) { + return; + } + while (node.sibling === null) { + if (node.return === null || node.return === finishedWork) { + return; + } + if (hostSubtreeRoot === node) { + hostSubtreeRoot = null; + } + node = node.return; + } + if (hostSubtreeRoot === node) { + hostSubtreeRoot = null; + } + node.sibling.return = node.return; + node = node.sibling; + } + } + } + function commitAttachRef(finishedWork) { + var ref = finishedWork.ref; + if (ref !== null) { + var instance = finishedWork.stateNode; + var instanceToUse; + switch (finishedWork.tag) { + case HostComponent: + instanceToUse = getPublicInstance(instance); + break; + default: + instanceToUse = instance; + } + if (typeof ref === "function") { + var retVal; + if (finishedWork.mode & ProfileMode) { + try { + startLayoutEffectTimer(); + retVal = ref(instanceToUse); + } finally { + recordLayoutEffectDuration(finishedWork); + } + } else { + retVal = ref(instanceToUse); + } + { + if (typeof retVal === "function") { + error("Unexpected return value from a callback ref in %s. A callback ref should not return a function.", getComponentNameFromFiber(finishedWork)); + } + } + } else { + { + if (!ref.hasOwnProperty("current")) { + error("Unexpected ref object provided for %s. Use either a ref-setter function or React.createRef().", getComponentNameFromFiber(finishedWork)); + } + } + ref.current = instanceToUse; + } + } + } + function detachFiberMutation(fiber) { + var alternate = fiber.alternate; + if (alternate !== null) { + alternate.return = null; + } + fiber.return = null; + } + function detachFiberAfterEffects(fiber) { + var alternate = fiber.alternate; + if (alternate !== null) { + fiber.alternate = null; + detachFiberAfterEffects(alternate); + } + { + fiber.child = null; + fiber.deletions = null; + fiber.sibling = null; + if (fiber.tag === HostComponent) { + var hostInstance = fiber.stateNode; + if (hostInstance !== null) { + detachDeletedInstance(hostInstance); + } + } + fiber.stateNode = null; + { + fiber._debugOwner = null; + } + { + fiber.return = null; + fiber.dependencies = null; + fiber.memoizedProps = null; + fiber.memoizedState = null; + fiber.pendingProps = null; + fiber.stateNode = null; + fiber.updateQueue = null; + } + } + } + function emptyPortalContainer(current2) { + if (!supportsPersistence) { + return; + } + var portal = current2.stateNode; + var containerInfo = portal.containerInfo; + var emptyChildSet = createContainerChildSet(containerInfo); + replaceContainerChildren(containerInfo, emptyChildSet); + } + function getHostParentFiber(fiber) { + var parent = fiber.return; + while (parent !== null) { + if (isHostParent(parent)) { + return parent; + } + parent = parent.return; + } + throw new Error("Expected to find a host parent. This error is likely caused by a bug in React. Please file an issue."); + } + function isHostParent(fiber) { + return fiber.tag === HostComponent || fiber.tag === HostRoot || fiber.tag === HostPortal; + } + function getHostSibling(fiber) { + var node = fiber; + siblings: + while (true) { + while (node.sibling === null) { + if (node.return === null || isHostParent(node.return)) { + return null; + } + node = node.return; + } + node.sibling.return = node.return; + node = node.sibling; + while (node.tag !== HostComponent && node.tag !== HostText && node.tag !== DehydratedFragment) { + if (node.flags & Placement) { + continue siblings; + } + if (node.child === null || node.tag === HostPortal) { + continue siblings; + } else { + node.child.return = node; + node = node.child; + } + } + if (!(node.flags & Placement)) { + return node.stateNode; + } + } + } + function commitPlacement(finishedWork) { + if (!supportsMutation) { + return; + } + var parentFiber = getHostParentFiber(finishedWork); + switch (parentFiber.tag) { + case HostComponent: { + var parent = parentFiber.stateNode; + if (parentFiber.flags & ContentReset) { + resetTextContent(parent); + parentFiber.flags &= ~ContentReset; + } + var before = getHostSibling(finishedWork); + insertOrAppendPlacementNode(finishedWork, before, parent); + break; + } + case HostRoot: + case HostPortal: { + var _parent = parentFiber.stateNode.containerInfo; + var _before = getHostSibling(finishedWork); + insertOrAppendPlacementNodeIntoContainer(finishedWork, _before, _parent); + break; + } + default: + throw new Error("Invalid host parent fiber. This error is likely caused by a bug in React. Please file an issue."); + } + } + function insertOrAppendPlacementNodeIntoContainer(node, before, parent) { + var tag = node.tag; + var isHost = tag === HostComponent || tag === HostText; + if (isHost) { + var stateNode = node.stateNode; + if (before) { + insertInContainerBefore(parent, stateNode, before); + } else { + appendChildToContainer(parent, stateNode); + } + } else if (tag === HostPortal) + ; + else { + var child = node.child; + if (child !== null) { + insertOrAppendPlacementNodeIntoContainer(child, before, parent); + var sibling = child.sibling; + while (sibling !== null) { + insertOrAppendPlacementNodeIntoContainer(sibling, before, parent); + sibling = sibling.sibling; + } + } + } + } + function insertOrAppendPlacementNode(node, before, parent) { + var tag = node.tag; + var isHost = tag === HostComponent || tag === HostText; + if (isHost) { + var stateNode = node.stateNode; + if (before) { + insertBefore(parent, stateNode, before); + } else { + appendChild(parent, stateNode); + } + } else if (tag === HostPortal) + ; + else { + var child = node.child; + if (child !== null) { + insertOrAppendPlacementNode(child, before, parent); + var sibling = child.sibling; + while (sibling !== null) { + insertOrAppendPlacementNode(sibling, before, parent); + sibling = sibling.sibling; + } + } + } + } + var hostParent = null; + var hostParentIsContainer = false; + function commitDeletionEffects(root, returnFiber, deletedFiber) { + if (supportsMutation) { + var parent = returnFiber; + findParent: + while (parent !== null) { + switch (parent.tag) { + case HostComponent: { + hostParent = parent.stateNode; + hostParentIsContainer = false; + break findParent; + } + case HostRoot: { + hostParent = parent.stateNode.containerInfo; + hostParentIsContainer = true; + break findParent; + } + case HostPortal: { + hostParent = parent.stateNode.containerInfo; + hostParentIsContainer = true; + break findParent; + } + } + parent = parent.return; + } + if (hostParent === null) { + throw new Error("Expected to find a host parent. This error is likely caused by a bug in React. Please file an issue."); + } + commitDeletionEffectsOnFiber(root, returnFiber, deletedFiber); + hostParent = null; + hostParentIsContainer = false; + } else { + commitDeletionEffectsOnFiber(root, returnFiber, deletedFiber); + } + detachFiberMutation(deletedFiber); + } + function recursivelyTraverseDeletionEffects(finishedRoot, nearestMountedAncestor, parent) { + var child = parent.child; + while (child !== null) { + commitDeletionEffectsOnFiber(finishedRoot, nearestMountedAncestor, child); + child = child.sibling; + } + } + function commitDeletionEffectsOnFiber(finishedRoot, nearestMountedAncestor, deletedFiber) { + onCommitUnmount(deletedFiber); + switch (deletedFiber.tag) { + case HostComponent: { + if (!offscreenSubtreeWasHidden) { + safelyDetachRef(deletedFiber, nearestMountedAncestor); + } + } + case HostText: { + if (supportsMutation) { + var prevHostParent = hostParent; + var prevHostParentIsContainer = hostParentIsContainer; + hostParent = null; + recursivelyTraverseDeletionEffects(finishedRoot, nearestMountedAncestor, deletedFiber); + hostParent = prevHostParent; + hostParentIsContainer = prevHostParentIsContainer; + if (hostParent !== null) { + if (hostParentIsContainer) { + removeChildFromContainer(hostParent, deletedFiber.stateNode); + } else { + removeChild(hostParent, deletedFiber.stateNode); + } + } + } else { + recursivelyTraverseDeletionEffects(finishedRoot, nearestMountedAncestor, deletedFiber); + } + return; + } + case DehydratedFragment: { + if (supportsMutation) { + if (hostParent !== null) { + if (hostParentIsContainer) { + clearSuspenseBoundaryFromContainer(hostParent, deletedFiber.stateNode); + } else { + clearSuspenseBoundary(hostParent, deletedFiber.stateNode); + } + } + } + return; + } + case HostPortal: { + if (supportsMutation) { + var _prevHostParent = hostParent; + var _prevHostParentIsContainer = hostParentIsContainer; + hostParent = deletedFiber.stateNode.containerInfo; + hostParentIsContainer = true; + recursivelyTraverseDeletionEffects(finishedRoot, nearestMountedAncestor, deletedFiber); + hostParent = _prevHostParent; + hostParentIsContainer = _prevHostParentIsContainer; + } else { + emptyPortalContainer(deletedFiber); + recursivelyTraverseDeletionEffects(finishedRoot, nearestMountedAncestor, deletedFiber); + } + return; + } + case FunctionComponent: + case ForwardRef: + case MemoComponent: + case SimpleMemoComponent: { + if (!offscreenSubtreeWasHidden) { + var updateQueue = deletedFiber.updateQueue; + if (updateQueue !== null) { + var lastEffect = updateQueue.lastEffect; + if (lastEffect !== null) { + var firstEffect = lastEffect.next; + var effect = firstEffect; + do { + var _effect = effect, destroy = _effect.destroy, tag = _effect.tag; + if (destroy !== void 0) { + if ((tag & Insertion) !== NoFlags$1) { + safelyCallDestroy(deletedFiber, nearestMountedAncestor, destroy); + } else if ((tag & Layout) !== NoFlags$1) { + { + markComponentLayoutEffectUnmountStarted(deletedFiber); + } + if (deletedFiber.mode & ProfileMode) { + startLayoutEffectTimer(); + safelyCallDestroy(deletedFiber, nearestMountedAncestor, destroy); + recordLayoutEffectDuration(deletedFiber); + } else { + safelyCallDestroy(deletedFiber, nearestMountedAncestor, destroy); + } + { + markComponentLayoutEffectUnmountStopped(); + } + } + } + effect = effect.next; + } while (effect !== firstEffect); + } + } + } + recursivelyTraverseDeletionEffects(finishedRoot, nearestMountedAncestor, deletedFiber); + return; + } + case ClassComponent: { + if (!offscreenSubtreeWasHidden) { + safelyDetachRef(deletedFiber, nearestMountedAncestor); + var instance = deletedFiber.stateNode; + if (typeof instance.componentWillUnmount === "function") { + safelyCallComponentWillUnmount(deletedFiber, nearestMountedAncestor, instance); + } + } + recursivelyTraverseDeletionEffects(finishedRoot, nearestMountedAncestor, deletedFiber); + return; + } + case ScopeComponent: { + recursivelyTraverseDeletionEffects(finishedRoot, nearestMountedAncestor, deletedFiber); + return; + } + case OffscreenComponent: { + if ( + // TODO: Remove this dead flag + deletedFiber.mode & ConcurrentMode + ) { + var prevOffscreenSubtreeWasHidden = offscreenSubtreeWasHidden; + offscreenSubtreeWasHidden = prevOffscreenSubtreeWasHidden || deletedFiber.memoizedState !== null; + recursivelyTraverseDeletionEffects(finishedRoot, nearestMountedAncestor, deletedFiber); + offscreenSubtreeWasHidden = prevOffscreenSubtreeWasHidden; + } else { + recursivelyTraverseDeletionEffects(finishedRoot, nearestMountedAncestor, deletedFiber); + } + break; + } + default: { + recursivelyTraverseDeletionEffects(finishedRoot, nearestMountedAncestor, deletedFiber); + return; + } + } + } + function commitSuspenseCallback(finishedWork) { + var newState = finishedWork.memoizedState; + } + function commitSuspenseHydrationCallbacks(finishedRoot, finishedWork) { + if (!supportsHydration) { + return; + } + var newState = finishedWork.memoizedState; + if (newState === null) { + var current2 = finishedWork.alternate; + if (current2 !== null) { + var prevState = current2.memoizedState; + if (prevState !== null) { + var suspenseInstance = prevState.dehydrated; + if (suspenseInstance !== null) { + commitHydratedSuspenseInstance(suspenseInstance); + } + } + } + } + } + function attachSuspenseRetryListeners(finishedWork) { + var wakeables = finishedWork.updateQueue; + if (wakeables !== null) { + finishedWork.updateQueue = null; + var retryCache = finishedWork.stateNode; + if (retryCache === null) { + retryCache = finishedWork.stateNode = new PossiblyWeakSet(); + } + wakeables.forEach(function(wakeable) { + var retry = resolveRetryWakeable.bind(null, finishedWork, wakeable); + if (!retryCache.has(wakeable)) { + retryCache.add(wakeable); + { + if (isDevToolsPresent) { + if (inProgressLanes !== null && inProgressRoot !== null) { + restorePendingUpdaters(inProgressRoot, inProgressLanes); + } else { + throw Error("Expected finished root and lanes to be set. This is a bug in React."); + } + } + } + wakeable.then(retry, retry); + } + }); + } + } + function commitMutationEffects(root, finishedWork, committedLanes) { + inProgressLanes = committedLanes; + inProgressRoot = root; + setCurrentFiber(finishedWork); + commitMutationEffectsOnFiber(finishedWork, root); + setCurrentFiber(finishedWork); + inProgressLanes = null; + inProgressRoot = null; + } + function recursivelyTraverseMutationEffects(root, parentFiber, lanes) { + var deletions = parentFiber.deletions; + if (deletions !== null) { + for (var i = 0; i < deletions.length; i++) { + var childToDelete = deletions[i]; + try { + commitDeletionEffects(root, parentFiber, childToDelete); + } catch (error2) { + captureCommitPhaseError(childToDelete, parentFiber, error2); + } + } + } + var prevDebugFiber = getCurrentFiber(); + if (parentFiber.subtreeFlags & MutationMask) { + var child = parentFiber.child; + while (child !== null) { + setCurrentFiber(child); + commitMutationEffectsOnFiber(child, root); + child = child.sibling; + } + } + setCurrentFiber(prevDebugFiber); + } + function commitMutationEffectsOnFiber(finishedWork, root, lanes) { + var current2 = finishedWork.alternate; + var flags = finishedWork.flags; + switch (finishedWork.tag) { + case FunctionComponent: + case ForwardRef: + case MemoComponent: + case SimpleMemoComponent: { + recursivelyTraverseMutationEffects(root, finishedWork); + commitReconciliationEffects(finishedWork); + if (flags & Update) { + try { + commitHookEffectListUnmount(Insertion | HasEffect, finishedWork, finishedWork.return); + commitHookEffectListMount(Insertion | HasEffect, finishedWork); + } catch (error2) { + captureCommitPhaseError(finishedWork, finishedWork.return, error2); + } + if (finishedWork.mode & ProfileMode) { + try { + startLayoutEffectTimer(); + commitHookEffectListUnmount(Layout | HasEffect, finishedWork, finishedWork.return); + } catch (error2) { + captureCommitPhaseError(finishedWork, finishedWork.return, error2); + } + recordLayoutEffectDuration(finishedWork); + } else { + try { + commitHookEffectListUnmount(Layout | HasEffect, finishedWork, finishedWork.return); + } catch (error2) { + captureCommitPhaseError(finishedWork, finishedWork.return, error2); + } + } + } + return; + } + case ClassComponent: { + recursivelyTraverseMutationEffects(root, finishedWork); + commitReconciliationEffects(finishedWork); + if (flags & Ref) { + if (current2 !== null) { + safelyDetachRef(current2, current2.return); + } + } + return; + } + case HostComponent: { + recursivelyTraverseMutationEffects(root, finishedWork); + commitReconciliationEffects(finishedWork); + if (flags & Ref) { + if (current2 !== null) { + safelyDetachRef(current2, current2.return); + } + } + if (supportsMutation) { + if (finishedWork.flags & ContentReset) { + var instance = finishedWork.stateNode; + try { + resetTextContent(instance); + } catch (error2) { + captureCommitPhaseError(finishedWork, finishedWork.return, error2); + } + } + if (flags & Update) { + var _instance4 = finishedWork.stateNode; + if (_instance4 != null) { + var newProps = finishedWork.memoizedProps; + var oldProps = current2 !== null ? current2.memoizedProps : newProps; + var type = finishedWork.type; + var updatePayload = finishedWork.updateQueue; + finishedWork.updateQueue = null; + if (updatePayload !== null) { + try { + commitUpdate(_instance4, updatePayload, type, oldProps, newProps, finishedWork); + } catch (error2) { + captureCommitPhaseError(finishedWork, finishedWork.return, error2); + } + } + } + } + } + return; + } + case HostText: { + recursivelyTraverseMutationEffects(root, finishedWork); + commitReconciliationEffects(finishedWork); + if (flags & Update) { + if (supportsMutation) { + if (finishedWork.stateNode === null) { + throw new Error("This should have a text node initialized. This error is likely caused by a bug in React. Please file an issue."); + } + var textInstance = finishedWork.stateNode; + var newText = finishedWork.memoizedProps; + var oldText = current2 !== null ? current2.memoizedProps : newText; + try { + commitTextUpdate(textInstance, oldText, newText); + } catch (error2) { + captureCommitPhaseError(finishedWork, finishedWork.return, error2); + } + } + } + return; + } + case HostRoot: { + recursivelyTraverseMutationEffects(root, finishedWork); + commitReconciliationEffects(finishedWork); + if (flags & Update) { + if (supportsMutation && supportsHydration) { + if (current2 !== null) { + var prevRootState = current2.memoizedState; + if (prevRootState.isDehydrated) { + try { + commitHydratedContainer(root.containerInfo); + } catch (error2) { + captureCommitPhaseError(finishedWork, finishedWork.return, error2); + } + } + } + } + if (supportsPersistence) { + var containerInfo = root.containerInfo; + var pendingChildren = root.pendingChildren; + try { + replaceContainerChildren(containerInfo, pendingChildren); + } catch (error2) { + captureCommitPhaseError(finishedWork, finishedWork.return, error2); + } + } + } + return; + } + case HostPortal: { + recursivelyTraverseMutationEffects(root, finishedWork); + commitReconciliationEffects(finishedWork); + if (flags & Update) { + if (supportsPersistence) { + var portal = finishedWork.stateNode; + var _containerInfo = portal.containerInfo; + var _pendingChildren = portal.pendingChildren; + try { + replaceContainerChildren(_containerInfo, _pendingChildren); + } catch (error2) { + captureCommitPhaseError(finishedWork, finishedWork.return, error2); + } + } + } + return; + } + case SuspenseComponent: { + recursivelyTraverseMutationEffects(root, finishedWork); + commitReconciliationEffects(finishedWork); + var offscreenFiber = finishedWork.child; + if (offscreenFiber.flags & Visibility) { + var offscreenInstance = offscreenFiber.stateNode; + var newState = offscreenFiber.memoizedState; + var isHidden = newState !== null; + offscreenInstance.isHidden = isHidden; + if (isHidden) { + var wasHidden = offscreenFiber.alternate !== null && offscreenFiber.alternate.memoizedState !== null; + if (!wasHidden) { + markCommitTimeOfFallback(); + } + } + } + if (flags & Update) { + try { + commitSuspenseCallback(finishedWork); + } catch (error2) { + captureCommitPhaseError(finishedWork, finishedWork.return, error2); + } + attachSuspenseRetryListeners(finishedWork); + } + return; + } + case OffscreenComponent: { + var _wasHidden = current2 !== null && current2.memoizedState !== null; + if ( + // TODO: Remove this dead flag + finishedWork.mode & ConcurrentMode + ) { + var prevOffscreenSubtreeWasHidden = offscreenSubtreeWasHidden; + offscreenSubtreeWasHidden = prevOffscreenSubtreeWasHidden || _wasHidden; + recursivelyTraverseMutationEffects(root, finishedWork); + offscreenSubtreeWasHidden = prevOffscreenSubtreeWasHidden; + } else { + recursivelyTraverseMutationEffects(root, finishedWork); + } + commitReconciliationEffects(finishedWork); + if (flags & Visibility) { + var _offscreenInstance = finishedWork.stateNode; + var _newState = finishedWork.memoizedState; + var _isHidden = _newState !== null; + var offscreenBoundary = finishedWork; + _offscreenInstance.isHidden = _isHidden; + { + if (_isHidden) { + if (!_wasHidden) { + if ((offscreenBoundary.mode & ConcurrentMode) !== NoMode) { + nextEffect = offscreenBoundary; + var offscreenChild = offscreenBoundary.child; + while (offscreenChild !== null) { + nextEffect = offscreenChild; + disappearLayoutEffects_begin(offscreenChild); + offscreenChild = offscreenChild.sibling; + } + } + } + } + } + if (supportsMutation) { + hideOrUnhideAllChildren(offscreenBoundary, _isHidden); + } + } + return; + } + case SuspenseListComponent: { + recursivelyTraverseMutationEffects(root, finishedWork); + commitReconciliationEffects(finishedWork); + if (flags & Update) { + attachSuspenseRetryListeners(finishedWork); + } + return; + } + case ScopeComponent: { + return; + } + default: { + recursivelyTraverseMutationEffects(root, finishedWork); + commitReconciliationEffects(finishedWork); + return; + } + } + } + function commitReconciliationEffects(finishedWork) { + var flags = finishedWork.flags; + if (flags & Placement) { + try { + commitPlacement(finishedWork); + } catch (error2) { + captureCommitPhaseError(finishedWork, finishedWork.return, error2); + } + finishedWork.flags &= ~Placement; + } + if (flags & Hydrating) { + finishedWork.flags &= ~Hydrating; + } + } + function commitLayoutEffects(finishedWork, root, committedLanes) { + inProgressLanes = committedLanes; + inProgressRoot = root; + nextEffect = finishedWork; + commitLayoutEffects_begin(finishedWork, root, committedLanes); + inProgressLanes = null; + inProgressRoot = null; + } + function commitLayoutEffects_begin(subtreeRoot, root, committedLanes) { + var isModernRoot = (subtreeRoot.mode & ConcurrentMode) !== NoMode; + while (nextEffect !== null) { + var fiber = nextEffect; + var firstChild = fiber.child; + if (fiber.tag === OffscreenComponent && isModernRoot) { + var isHidden = fiber.memoizedState !== null; + var newOffscreenSubtreeIsHidden = isHidden || offscreenSubtreeIsHidden; + if (newOffscreenSubtreeIsHidden) { + commitLayoutMountEffects_complete(subtreeRoot, root, committedLanes); + continue; + } else { + var current2 = fiber.alternate; + var wasHidden = current2 !== null && current2.memoizedState !== null; + var newOffscreenSubtreeWasHidden = wasHidden || offscreenSubtreeWasHidden; + var prevOffscreenSubtreeIsHidden = offscreenSubtreeIsHidden; + var prevOffscreenSubtreeWasHidden = offscreenSubtreeWasHidden; + offscreenSubtreeIsHidden = newOffscreenSubtreeIsHidden; + offscreenSubtreeWasHidden = newOffscreenSubtreeWasHidden; + if (offscreenSubtreeWasHidden && !prevOffscreenSubtreeWasHidden) { + nextEffect = fiber; + reappearLayoutEffects_begin(fiber); + } + var child = firstChild; + while (child !== null) { + nextEffect = child; + commitLayoutEffects_begin( + child, + // New root; bubble back up to here and stop. + root, + committedLanes + ); + child = child.sibling; + } + nextEffect = fiber; + offscreenSubtreeIsHidden = prevOffscreenSubtreeIsHidden; + offscreenSubtreeWasHidden = prevOffscreenSubtreeWasHidden; + commitLayoutMountEffects_complete(subtreeRoot, root, committedLanes); + continue; + } + } + if ((fiber.subtreeFlags & LayoutMask) !== NoFlags && firstChild !== null) { + firstChild.return = fiber; + nextEffect = firstChild; + } else { + commitLayoutMountEffects_complete(subtreeRoot, root, committedLanes); + } + } + } + function commitLayoutMountEffects_complete(subtreeRoot, root, committedLanes) { + while (nextEffect !== null) { + var fiber = nextEffect; + if ((fiber.flags & LayoutMask) !== NoFlags) { + var current2 = fiber.alternate; + setCurrentFiber(fiber); + try { + commitLayoutEffectOnFiber(root, current2, fiber, committedLanes); + } catch (error2) { + captureCommitPhaseError(fiber, fiber.return, error2); + } + resetCurrentFiber(); + } + if (fiber === subtreeRoot) { + nextEffect = null; + return; + } + var sibling = fiber.sibling; + if (sibling !== null) { + sibling.return = fiber.return; + nextEffect = sibling; + return; + } + nextEffect = fiber.return; + } + } + function disappearLayoutEffects_begin(subtreeRoot) { + while (nextEffect !== null) { + var fiber = nextEffect; + var firstChild = fiber.child; + switch (fiber.tag) { + case FunctionComponent: + case ForwardRef: + case MemoComponent: + case SimpleMemoComponent: { + if (fiber.mode & ProfileMode) { + try { + startLayoutEffectTimer(); + commitHookEffectListUnmount(Layout, fiber, fiber.return); + } finally { + recordLayoutEffectDuration(fiber); + } + } else { + commitHookEffectListUnmount(Layout, fiber, fiber.return); + } + break; + } + case ClassComponent: { + safelyDetachRef(fiber, fiber.return); + var instance = fiber.stateNode; + if (typeof instance.componentWillUnmount === "function") { + safelyCallComponentWillUnmount(fiber, fiber.return, instance); + } + break; + } + case HostComponent: { + safelyDetachRef(fiber, fiber.return); + break; + } + case OffscreenComponent: { + var isHidden = fiber.memoizedState !== null; + if (isHidden) { + disappearLayoutEffects_complete(subtreeRoot); + continue; + } + break; + } + } + if (firstChild !== null) { + firstChild.return = fiber; + nextEffect = firstChild; + } else { + disappearLayoutEffects_complete(subtreeRoot); + } + } + } + function disappearLayoutEffects_complete(subtreeRoot) { + while (nextEffect !== null) { + var fiber = nextEffect; + if (fiber === subtreeRoot) { + nextEffect = null; + return; + } + var sibling = fiber.sibling; + if (sibling !== null) { + sibling.return = fiber.return; + nextEffect = sibling; + return; + } + nextEffect = fiber.return; + } + } + function reappearLayoutEffects_begin(subtreeRoot) { + while (nextEffect !== null) { + var fiber = nextEffect; + var firstChild = fiber.child; + if (fiber.tag === OffscreenComponent) { + var isHidden = fiber.memoizedState !== null; + if (isHidden) { + reappearLayoutEffects_complete(subtreeRoot); + continue; + } + } + if (firstChild !== null) { + firstChild.return = fiber; + nextEffect = firstChild; + } else { + reappearLayoutEffects_complete(subtreeRoot); + } + } + } + function reappearLayoutEffects_complete(subtreeRoot) { + while (nextEffect !== null) { + var fiber = nextEffect; + setCurrentFiber(fiber); + try { + reappearLayoutEffectsOnFiber(fiber); + } catch (error2) { + captureCommitPhaseError(fiber, fiber.return, error2); + } + resetCurrentFiber(); + if (fiber === subtreeRoot) { + nextEffect = null; + return; + } + var sibling = fiber.sibling; + if (sibling !== null) { + sibling.return = fiber.return; + nextEffect = sibling; + return; + } + nextEffect = fiber.return; + } + } + function commitPassiveMountEffects(root, finishedWork, committedLanes, committedTransitions) { + nextEffect = finishedWork; + commitPassiveMountEffects_begin(finishedWork, root, committedLanes, committedTransitions); + } + function commitPassiveMountEffects_begin(subtreeRoot, root, committedLanes, committedTransitions) { + while (nextEffect !== null) { + var fiber = nextEffect; + var firstChild = fiber.child; + if ((fiber.subtreeFlags & PassiveMask) !== NoFlags && firstChild !== null) { + firstChild.return = fiber; + nextEffect = firstChild; + } else { + commitPassiveMountEffects_complete(subtreeRoot, root, committedLanes, committedTransitions); + } + } + } + function commitPassiveMountEffects_complete(subtreeRoot, root, committedLanes, committedTransitions) { + while (nextEffect !== null) { + var fiber = nextEffect; + if ((fiber.flags & Passive) !== NoFlags) { + setCurrentFiber(fiber); + try { + commitPassiveMountOnFiber(root, fiber, committedLanes, committedTransitions); + } catch (error2) { + captureCommitPhaseError(fiber, fiber.return, error2); + } + resetCurrentFiber(); + } + if (fiber === subtreeRoot) { + nextEffect = null; + return; + } + var sibling = fiber.sibling; + if (sibling !== null) { + sibling.return = fiber.return; + nextEffect = sibling; + return; + } + nextEffect = fiber.return; + } + } + function commitPassiveMountOnFiber(finishedRoot, finishedWork, committedLanes, committedTransitions) { + switch (finishedWork.tag) { + case FunctionComponent: + case ForwardRef: + case SimpleMemoComponent: { + if (finishedWork.mode & ProfileMode) { + startPassiveEffectTimer(); + try { + commitHookEffectListMount(Passive$1 | HasEffect, finishedWork); + } finally { + recordPassiveEffectDuration(finishedWork); + } + } else { + commitHookEffectListMount(Passive$1 | HasEffect, finishedWork); + } + break; + } + } + } + function commitPassiveUnmountEffects(firstChild) { + nextEffect = firstChild; + commitPassiveUnmountEffects_begin(); + } + function commitPassiveUnmountEffects_begin() { + while (nextEffect !== null) { + var fiber = nextEffect; + var child = fiber.child; + if ((nextEffect.flags & ChildDeletion) !== NoFlags) { + var deletions = fiber.deletions; + if (deletions !== null) { + for (var i = 0; i < deletions.length; i++) { + var fiberToDelete = deletions[i]; + nextEffect = fiberToDelete; + commitPassiveUnmountEffectsInsideOfDeletedTree_begin(fiberToDelete, fiber); + } + { + var previousFiber = fiber.alternate; + if (previousFiber !== null) { + var detachedChild = previousFiber.child; + if (detachedChild !== null) { + previousFiber.child = null; + do { + var detachedSibling = detachedChild.sibling; + detachedChild.sibling = null; + detachedChild = detachedSibling; + } while (detachedChild !== null); + } + } + } + nextEffect = fiber; + } + } + if ((fiber.subtreeFlags & PassiveMask) !== NoFlags && child !== null) { + child.return = fiber; + nextEffect = child; + } else { + commitPassiveUnmountEffects_complete(); + } + } + } + function commitPassiveUnmountEffects_complete() { + while (nextEffect !== null) { + var fiber = nextEffect; + if ((fiber.flags & Passive) !== NoFlags) { + setCurrentFiber(fiber); + commitPassiveUnmountOnFiber(fiber); + resetCurrentFiber(); + } + var sibling = fiber.sibling; + if (sibling !== null) { + sibling.return = fiber.return; + nextEffect = sibling; + return; + } + nextEffect = fiber.return; + } + } + function commitPassiveUnmountOnFiber(finishedWork) { + switch (finishedWork.tag) { + case FunctionComponent: + case ForwardRef: + case SimpleMemoComponent: { + if (finishedWork.mode & ProfileMode) { + startPassiveEffectTimer(); + commitHookEffectListUnmount(Passive$1 | HasEffect, finishedWork, finishedWork.return); + recordPassiveEffectDuration(finishedWork); + } else { + commitHookEffectListUnmount(Passive$1 | HasEffect, finishedWork, finishedWork.return); + } + break; + } + } + } + function commitPassiveUnmountEffectsInsideOfDeletedTree_begin(deletedSubtreeRoot, nearestMountedAncestor) { + while (nextEffect !== null) { + var fiber = nextEffect; + setCurrentFiber(fiber); + commitPassiveUnmountInsideDeletedTreeOnFiber(fiber, nearestMountedAncestor); + resetCurrentFiber(); + var child = fiber.child; + if (child !== null) { + child.return = fiber; + nextEffect = child; + } else { + commitPassiveUnmountEffectsInsideOfDeletedTree_complete(deletedSubtreeRoot); + } + } + } + function commitPassiveUnmountEffectsInsideOfDeletedTree_complete(deletedSubtreeRoot) { + while (nextEffect !== null) { + var fiber = nextEffect; + var sibling = fiber.sibling; + var returnFiber = fiber.return; + { + detachFiberAfterEffects(fiber); + if (fiber === deletedSubtreeRoot) { + nextEffect = null; + return; + } + } + if (sibling !== null) { + sibling.return = returnFiber; + nextEffect = sibling; + return; + } + nextEffect = returnFiber; + } + } + function commitPassiveUnmountInsideDeletedTreeOnFiber(current2, nearestMountedAncestor) { + switch (current2.tag) { + case FunctionComponent: + case ForwardRef: + case SimpleMemoComponent: { + if (current2.mode & ProfileMode) { + startPassiveEffectTimer(); + commitHookEffectListUnmount(Passive$1, current2, nearestMountedAncestor); + recordPassiveEffectDuration(current2); + } else { + commitHookEffectListUnmount(Passive$1, current2, nearestMountedAncestor); + } + break; + } + } + } + function invokeLayoutEffectMountInDEV(fiber) { + { + switch (fiber.tag) { + case FunctionComponent: + case ForwardRef: + case SimpleMemoComponent: { + try { + commitHookEffectListMount(Layout | HasEffect, fiber); + } catch (error2) { + captureCommitPhaseError(fiber, fiber.return, error2); + } + break; + } + case ClassComponent: { + var instance = fiber.stateNode; + try { + instance.componentDidMount(); + } catch (error2) { + captureCommitPhaseError(fiber, fiber.return, error2); + } + break; + } + } + } + } + function invokePassiveEffectMountInDEV(fiber) { + { + switch (fiber.tag) { + case FunctionComponent: + case ForwardRef: + case SimpleMemoComponent: { + try { + commitHookEffectListMount(Passive$1 | HasEffect, fiber); + } catch (error2) { + captureCommitPhaseError(fiber, fiber.return, error2); + } + break; + } + } + } + } + function invokeLayoutEffectUnmountInDEV(fiber) { + { + switch (fiber.tag) { + case FunctionComponent: + case ForwardRef: + case SimpleMemoComponent: { + try { + commitHookEffectListUnmount(Layout | HasEffect, fiber, fiber.return); + } catch (error2) { + captureCommitPhaseError(fiber, fiber.return, error2); + } + break; + } + case ClassComponent: { + var instance = fiber.stateNode; + if (typeof instance.componentWillUnmount === "function") { + safelyCallComponentWillUnmount(fiber, fiber.return, instance); + } + break; + } + } + } + } + function invokePassiveEffectUnmountInDEV(fiber) { + { + switch (fiber.tag) { + case FunctionComponent: + case ForwardRef: + case SimpleMemoComponent: { + try { + commitHookEffectListUnmount(Passive$1 | HasEffect, fiber, fiber.return); + } catch (error2) { + captureCommitPhaseError(fiber, fiber.return, error2); + } + } + } + } + } + var COMPONENT_TYPE = 0; + var HAS_PSEUDO_CLASS_TYPE = 1; + var ROLE_TYPE = 2; + var TEST_NAME_TYPE = 3; + var TEXT_TYPE = 4; + if (typeof Symbol === "function" && Symbol.for) { + var symbolFor = Symbol.for; + COMPONENT_TYPE = symbolFor("selector.component"); + HAS_PSEUDO_CLASS_TYPE = symbolFor("selector.has_pseudo_class"); + ROLE_TYPE = symbolFor("selector.role"); + TEST_NAME_TYPE = symbolFor("selector.test_id"); + TEXT_TYPE = symbolFor("selector.text"); + } + function createComponentSelector(component) { + return { + $$typeof: COMPONENT_TYPE, + value: component + }; + } + function createHasPseudoClassSelector(selectors) { + return { + $$typeof: HAS_PSEUDO_CLASS_TYPE, + value: selectors + }; + } + function createRoleSelector(role) { + return { + $$typeof: ROLE_TYPE, + value: role + }; + } + function createTextSelector(text) { + return { + $$typeof: TEXT_TYPE, + value: text + }; + } + function createTestNameSelector(id) { + return { + $$typeof: TEST_NAME_TYPE, + value: id + }; + } + function findFiberRootForHostRoot(hostRoot) { + var maybeFiber = getInstanceFromNode(hostRoot); + if (maybeFiber != null) { + if (typeof maybeFiber.memoizedProps["data-testname"] !== "string") { + throw new Error("Invalid host root specified. Should be either a React container or a node with a testname attribute."); + } + return maybeFiber; + } else { + var fiberRoot = findFiberRoot(hostRoot); + if (fiberRoot === null) { + throw new Error("Could not find React container within specified host subtree."); + } + return fiberRoot.stateNode.current; + } + } + function matchSelector(fiber, selector) { + switch (selector.$$typeof) { + case COMPONENT_TYPE: + if (fiber.type === selector.value) { + return true; + } + break; + case HAS_PSEUDO_CLASS_TYPE: + return hasMatchingPaths(fiber, selector.value); + case ROLE_TYPE: + if (fiber.tag === HostComponent) { + var node = fiber.stateNode; + if (matchAccessibilityRole(node, selector.value)) { + return true; + } + } + break; + case TEXT_TYPE: + if (fiber.tag === HostComponent || fiber.tag === HostText) { + var textContent = getTextContent(fiber); + if (textContent !== null && textContent.indexOf(selector.value) >= 0) { + return true; + } + } + break; + case TEST_NAME_TYPE: + if (fiber.tag === HostComponent) { + var dataTestID = fiber.memoizedProps["data-testname"]; + if (typeof dataTestID === "string" && dataTestID.toLowerCase() === selector.value.toLowerCase()) { + return true; + } + } + break; + default: + throw new Error("Invalid selector type specified."); + } + return false; + } + function selectorToString(selector) { + switch (selector.$$typeof) { + case COMPONENT_TYPE: + var displayName = getComponentNameFromType(selector.value) || "Unknown"; + return "<" + displayName + ">"; + case HAS_PSEUDO_CLASS_TYPE: + return ":has(" + (selectorToString(selector) || "") + ")"; + case ROLE_TYPE: + return '[role="' + selector.value + '"]'; + case TEXT_TYPE: + return '"' + selector.value + '"'; + case TEST_NAME_TYPE: + return '[data-testname="' + selector.value + '"]'; + default: + throw new Error("Invalid selector type specified."); + } + } + function findPaths(root, selectors) { + var matchingFibers = []; + var stack = [root, 0]; + var index2 = 0; + while (index2 < stack.length) { + var fiber = stack[index2++]; + var selectorIndex = stack[index2++]; + var selector = selectors[selectorIndex]; + if (fiber.tag === HostComponent && isHiddenSubtree(fiber)) { + continue; + } else { + while (selector != null && matchSelector(fiber, selector)) { + selectorIndex++; + selector = selectors[selectorIndex]; + } + } + if (selectorIndex === selectors.length) { + matchingFibers.push(fiber); + } else { + var child = fiber.child; + while (child !== null) { + stack.push(child, selectorIndex); + child = child.sibling; + } + } + } + return matchingFibers; + } + function hasMatchingPaths(root, selectors) { + var stack = [root, 0]; + var index2 = 0; + while (index2 < stack.length) { + var fiber = stack[index2++]; + var selectorIndex = stack[index2++]; + var selector = selectors[selectorIndex]; + if (fiber.tag === HostComponent && isHiddenSubtree(fiber)) { + continue; + } else { + while (selector != null && matchSelector(fiber, selector)) { + selectorIndex++; + selector = selectors[selectorIndex]; + } + } + if (selectorIndex === selectors.length) { + return true; + } else { + var child = fiber.child; + while (child !== null) { + stack.push(child, selectorIndex); + child = child.sibling; + } + } + } + return false; + } + function findAllNodes(hostRoot, selectors) { + if (!supportsTestSelectors) { + throw new Error("Test selector API is not supported by this renderer."); + } + var root = findFiberRootForHostRoot(hostRoot); + var matchingFibers = findPaths(root, selectors); + var instanceRoots = []; + var stack = Array.from(matchingFibers); + var index2 = 0; + while (index2 < stack.length) { + var node = stack[index2++]; + if (node.tag === HostComponent) { + if (isHiddenSubtree(node)) { + continue; + } + instanceRoots.push(node.stateNode); + } else { + var child = node.child; + while (child !== null) { + stack.push(child); + child = child.sibling; + } + } + } + return instanceRoots; + } + function getFindAllNodesFailureDescription(hostRoot, selectors) { + if (!supportsTestSelectors) { + throw new Error("Test selector API is not supported by this renderer."); + } + var root = findFiberRootForHostRoot(hostRoot); + var maxSelectorIndex = 0; + var matchedNames = []; + var stack = [root, 0]; + var index2 = 0; + while (index2 < stack.length) { + var fiber = stack[index2++]; + var selectorIndex = stack[index2++]; + var selector = selectors[selectorIndex]; + if (fiber.tag === HostComponent && isHiddenSubtree(fiber)) { + continue; + } else if (matchSelector(fiber, selector)) { + matchedNames.push(selectorToString(selector)); + selectorIndex++; + if (selectorIndex > maxSelectorIndex) { + maxSelectorIndex = selectorIndex; + } + } + if (selectorIndex < selectors.length) { + var child = fiber.child; + while (child !== null) { + stack.push(child, selectorIndex); + child = child.sibling; + } + } + } + if (maxSelectorIndex < selectors.length) { + var unmatchedNames = []; + for (var i = maxSelectorIndex; i < selectors.length; i++) { + unmatchedNames.push(selectorToString(selectors[i])); + } + return "findAllNodes was able to match part of the selector:\n" + (" " + matchedNames.join(" > ") + "\n\n") + "No matching component was found for:\n" + (" " + unmatchedNames.join(" > ")); + } + return null; + } + function findBoundingRects(hostRoot, selectors) { + if (!supportsTestSelectors) { + throw new Error("Test selector API is not supported by this renderer."); + } + var instanceRoots = findAllNodes(hostRoot, selectors); + var boundingRects = []; + for (var i = 0; i < instanceRoots.length; i++) { + boundingRects.push(getBoundingRect(instanceRoots[i])); + } + for (var _i = boundingRects.length - 1; _i > 0; _i--) { + var targetRect = boundingRects[_i]; + var targetLeft = targetRect.x; + var targetRight = targetLeft + targetRect.width; + var targetTop = targetRect.y; + var targetBottom = targetTop + targetRect.height; + for (var j = _i - 1; j >= 0; j--) { + if (_i !== j) { + var otherRect = boundingRects[j]; + var otherLeft = otherRect.x; + var otherRight = otherLeft + otherRect.width; + var otherTop = otherRect.y; + var otherBottom = otherTop + otherRect.height; + if (targetLeft >= otherLeft && targetTop >= otherTop && targetRight <= otherRight && targetBottom <= otherBottom) { + boundingRects.splice(_i, 1); + break; + } else if (targetLeft === otherLeft && targetRect.width === otherRect.width && !(otherBottom < targetTop) && !(otherTop > targetBottom)) { + if (otherTop > targetTop) { + otherRect.height += otherTop - targetTop; + otherRect.y = targetTop; + } + if (otherBottom < targetBottom) { + otherRect.height = targetBottom - otherTop; + } + boundingRects.splice(_i, 1); + break; + } else if (targetTop === otherTop && targetRect.height === otherRect.height && !(otherRight < targetLeft) && !(otherLeft > targetRight)) { + if (otherLeft > targetLeft) { + otherRect.width += otherLeft - targetLeft; + otherRect.x = targetLeft; + } + if (otherRight < targetRight) { + otherRect.width = targetRight - otherLeft; + } + boundingRects.splice(_i, 1); + break; + } + } + } + } + return boundingRects; + } + function focusWithin(hostRoot, selectors) { + if (!supportsTestSelectors) { + throw new Error("Test selector API is not supported by this renderer."); + } + var root = findFiberRootForHostRoot(hostRoot); + var matchingFibers = findPaths(root, selectors); + var stack = Array.from(matchingFibers); + var index2 = 0; + while (index2 < stack.length) { + var fiber = stack[index2++]; + if (isHiddenSubtree(fiber)) { + continue; + } + if (fiber.tag === HostComponent) { + var node = fiber.stateNode; + if (setFocusIfFocusable(node)) { + return true; + } + } + var child = fiber.child; + while (child !== null) { + stack.push(child); + child = child.sibling; + } + } + return false; + } + var commitHooks = []; + function onCommitRoot$1() { + if (supportsTestSelectors) { + commitHooks.forEach(function(commitHook) { + return commitHook(); + }); + } + } + function observeVisibleRects(hostRoot, selectors, callback, options) { + if (!supportsTestSelectors) { + throw new Error("Test selector API is not supported by this renderer."); + } + var instanceRoots = findAllNodes(hostRoot, selectors); + var _setupIntersectionObs = setupIntersectionObserver(instanceRoots, callback, options), disconnect = _setupIntersectionObs.disconnect, observe = _setupIntersectionObs.observe, unobserve = _setupIntersectionObs.unobserve; + var commitHook = function() { + var nextInstanceRoots = findAllNodes(hostRoot, selectors); + instanceRoots.forEach(function(target) { + if (nextInstanceRoots.indexOf(target) < 0) { + unobserve(target); + } + }); + nextInstanceRoots.forEach(function(target) { + if (instanceRoots.indexOf(target) < 0) { + observe(target); + } + }); + }; + commitHooks.push(commitHook); + return { + disconnect: function() { + var index2 = commitHooks.indexOf(commitHook); + if (index2 >= 0) { + commitHooks.splice(index2, 1); + } + disconnect(); + } + }; + } + var ReactCurrentActQueue = ReactSharedInternals.ReactCurrentActQueue; + function isLegacyActEnvironment(fiber) { + { + var isReactActEnvironmentGlobal = ( + // $FlowExpectedError – Flow doesn't know about IS_REACT_ACT_ENVIRONMENT global + typeof IS_REACT_ACT_ENVIRONMENT !== "undefined" ? IS_REACT_ACT_ENVIRONMENT : void 0 + ); + var jestIsDefined = typeof jest !== "undefined"; + return warnsIfNotActing && jestIsDefined && isReactActEnvironmentGlobal !== false; + } + } + function isConcurrentActEnvironment() { + { + var isReactActEnvironmentGlobal = ( + // $FlowExpectedError – Flow doesn't know about IS_REACT_ACT_ENVIRONMENT global + typeof IS_REACT_ACT_ENVIRONMENT !== "undefined" ? IS_REACT_ACT_ENVIRONMENT : void 0 + ); + if (!isReactActEnvironmentGlobal && ReactCurrentActQueue.current !== null) { + error("The current testing environment is not configured to support act(...)"); + } + return isReactActEnvironmentGlobal; + } + } + var ceil = Math.ceil; + var ReactCurrentDispatcher$2 = ReactSharedInternals.ReactCurrentDispatcher, ReactCurrentOwner$2 = ReactSharedInternals.ReactCurrentOwner, ReactCurrentBatchConfig$2 = ReactSharedInternals.ReactCurrentBatchConfig, ReactCurrentActQueue$1 = ReactSharedInternals.ReactCurrentActQueue; + var NoContext = ( + /* */ + 0 + ); + var BatchedContext = ( + /* */ + 1 + ); + var RenderContext = ( + /* */ + 2 + ); + var CommitContext = ( + /* */ + 4 + ); + var RootInProgress = 0; + var RootFatalErrored = 1; + var RootErrored = 2; + var RootSuspended = 3; + var RootSuspendedWithDelay = 4; + var RootCompleted = 5; + var RootDidNotComplete = 6; + var executionContext = NoContext; + var workInProgressRoot = null; + var workInProgress = null; + var workInProgressRootRenderLanes = NoLanes; + var subtreeRenderLanes = NoLanes; + var subtreeRenderLanesCursor = createCursor(NoLanes); + var workInProgressRootExitStatus = RootInProgress; + var workInProgressRootFatalError = null; + var workInProgressRootIncludedLanes = NoLanes; + var workInProgressRootSkippedLanes = NoLanes; + var workInProgressRootInterleavedUpdatedLanes = NoLanes; + var workInProgressRootPingedLanes = NoLanes; + var workInProgressRootConcurrentErrors = null; + var workInProgressRootRecoverableErrors = null; + var globalMostRecentFallbackTime = 0; + var FALLBACK_THROTTLE_MS = 500; + var workInProgressRootRenderTargetTime = Infinity; + var RENDER_TIMEOUT_MS = 500; + var workInProgressTransitions = null; + function resetRenderTimer() { + workInProgressRootRenderTargetTime = now() + RENDER_TIMEOUT_MS; + } + function getRenderTargetTime() { + return workInProgressRootRenderTargetTime; + } + var hasUncaughtError = false; + var firstUncaughtError = null; + var legacyErrorBoundariesThatAlreadyFailed = null; + var rootDoesHavePassiveEffects = false; + var rootWithPendingPassiveEffects = null; + var pendingPassiveEffectsLanes = NoLanes; + var pendingPassiveProfilerEffects = []; + var pendingPassiveTransitions = null; + var NESTED_UPDATE_LIMIT = 50; + var nestedUpdateCount = 0; + var rootWithNestedUpdates = null; + var isFlushingPassiveEffects = false; + var didScheduleUpdateDuringPassiveEffects = false; + var NESTED_PASSIVE_UPDATE_LIMIT = 50; + var nestedPassiveUpdateCount = 0; + var rootWithPassiveNestedUpdates = null; + var currentEventTime = NoTimestamp; + var currentEventTransitionLane = NoLanes; + var isRunningInsertionEffect = false; + function getWorkInProgressRoot() { + return workInProgressRoot; + } + function requestEventTime() { + if ((executionContext & (RenderContext | CommitContext)) !== NoContext) { + return now(); + } + if (currentEventTime !== NoTimestamp) { + return currentEventTime; + } + currentEventTime = now(); + return currentEventTime; + } + function requestUpdateLane(fiber) { + var mode = fiber.mode; + if ((mode & ConcurrentMode) === NoMode) { + return SyncLane; + } else if ((executionContext & RenderContext) !== NoContext && workInProgressRootRenderLanes !== NoLanes) { + return pickArbitraryLane(workInProgressRootRenderLanes); + } + var isTransition = requestCurrentTransition() !== NoTransition; + if (isTransition) { + if (ReactCurrentBatchConfig$2.transition !== null) { + var transition = ReactCurrentBatchConfig$2.transition; + if (!transition._updatedFibers) { + transition._updatedFibers = /* @__PURE__ */ new Set(); + } + transition._updatedFibers.add(fiber); + } + if (currentEventTransitionLane === NoLane) { + currentEventTransitionLane = claimNextTransitionLane(); + } + return currentEventTransitionLane; + } + var updateLane = getCurrentUpdatePriority(); + if (updateLane !== NoLane) { + return updateLane; + } + var eventLane = getCurrentEventPriority(); + return eventLane; + } + function requestRetryLane(fiber) { + var mode = fiber.mode; + if ((mode & ConcurrentMode) === NoMode) { + return SyncLane; + } + return claimNextRetryLane(); + } + function scheduleUpdateOnFiber(root, fiber, lane, eventTime) { + checkForNestedUpdates(); + { + if (isRunningInsertionEffect) { + error("useInsertionEffect must not schedule updates."); + } + } + { + if (isFlushingPassiveEffects) { + didScheduleUpdateDuringPassiveEffects = true; + } + } + markRootUpdated(root, lane, eventTime); + if ((executionContext & RenderContext) !== NoLanes && root === workInProgressRoot) { + warnAboutRenderPhaseUpdatesInDEV(fiber); + } else { + { + if (isDevToolsPresent) { + addFiberToLanesMap(root, fiber, lane); + } + } + warnIfUpdatesNotWrappedWithActDEV(fiber); + if (root === workInProgressRoot) { + if ((executionContext & RenderContext) === NoContext) { + workInProgressRootInterleavedUpdatedLanes = mergeLanes(workInProgressRootInterleavedUpdatedLanes, lane); + } + if (workInProgressRootExitStatus === RootSuspendedWithDelay) { + markRootSuspended$1(root, workInProgressRootRenderLanes); + } + } + ensureRootIsScheduled(root, eventTime); + if (lane === SyncLane && executionContext === NoContext && (fiber.mode & ConcurrentMode) === NoMode && // Treat `act` as if it's inside `batchedUpdates`, even in legacy mode. + !ReactCurrentActQueue$1.isBatchingLegacy) { + resetRenderTimer(); + flushSyncCallbacksOnlyInLegacyMode(); + } + } + } + function scheduleInitialHydrationOnRoot(root, lane, eventTime) { + var current2 = root.current; + current2.lanes = lane; + markRootUpdated(root, lane, eventTime); + ensureRootIsScheduled(root, eventTime); + } + function isUnsafeClassRenderPhaseUpdate(fiber) { + return ( + // TODO: Remove outdated deferRenderPhaseUpdateToNextBatch experiment. We + // decided not to enable it. + (executionContext & RenderContext) !== NoContext + ); + } + function ensureRootIsScheduled(root, currentTime) { + var existingCallbackNode = root.callbackNode; + markStarvedLanesAsExpired(root, currentTime); + var nextLanes = getNextLanes(root, root === workInProgressRoot ? workInProgressRootRenderLanes : NoLanes); + if (nextLanes === NoLanes) { + if (existingCallbackNode !== null) { + cancelCallback$1(existingCallbackNode); + } + root.callbackNode = null; + root.callbackPriority = NoLane; + return; + } + var newCallbackPriority = getHighestPriorityLane(nextLanes); + var existingCallbackPriority = root.callbackPriority; + if (existingCallbackPriority === newCallbackPriority && // Special case related to `act`. If the currently scheduled task is a + // Scheduler task, rather than an `act` task, cancel it and re-scheduled + // on the `act` queue. + !(ReactCurrentActQueue$1.current !== null && existingCallbackNode !== fakeActCallbackNode)) { + { + if (existingCallbackNode == null && existingCallbackPriority !== SyncLane) { + error("Expected scheduled callback to exist. This error is likely caused by a bug in React. Please file an issue."); + } + } + return; + } + if (existingCallbackNode != null) { + cancelCallback$1(existingCallbackNode); + } + var newCallbackNode; + if (newCallbackPriority === SyncLane) { + if (root.tag === LegacyRoot) { + if (ReactCurrentActQueue$1.isBatchingLegacy !== null) { + ReactCurrentActQueue$1.didScheduleLegacyUpdate = true; + } + scheduleLegacySyncCallback(performSyncWorkOnRoot.bind(null, root)); + } else { + scheduleSyncCallback(performSyncWorkOnRoot.bind(null, root)); + } + if (supportsMicrotasks) { + if (ReactCurrentActQueue$1.current !== null) { + ReactCurrentActQueue$1.current.push(flushSyncCallbacks); + } else { + scheduleMicrotask(function() { + if ((executionContext & (RenderContext | CommitContext)) === NoContext) { + flushSyncCallbacks(); + } + }); + } + } else { + scheduleCallback$1(ImmediatePriority, flushSyncCallbacks); + } + newCallbackNode = null; + } else { + var schedulerPriorityLevel; + switch (lanesToEventPriority(nextLanes)) { + case DiscreteEventPriority: + schedulerPriorityLevel = ImmediatePriority; + break; + case ContinuousEventPriority: + schedulerPriorityLevel = UserBlockingPriority; + break; + case DefaultEventPriority: + schedulerPriorityLevel = NormalPriority; + break; + case IdleEventPriority: + schedulerPriorityLevel = IdlePriority; + break; + default: + schedulerPriorityLevel = NormalPriority; + break; + } + newCallbackNode = scheduleCallback$1(schedulerPriorityLevel, performConcurrentWorkOnRoot.bind(null, root)); + } + root.callbackPriority = newCallbackPriority; + root.callbackNode = newCallbackNode; + } + function performConcurrentWorkOnRoot(root, didTimeout) { + { + resetNestedUpdateFlag(); + } + currentEventTime = NoTimestamp; + currentEventTransitionLane = NoLanes; + if ((executionContext & (RenderContext | CommitContext)) !== NoContext) { + throw new Error("Should not already be working."); + } + var originalCallbackNode = root.callbackNode; + var didFlushPassiveEffects = flushPassiveEffects(); + if (didFlushPassiveEffects) { + if (root.callbackNode !== originalCallbackNode) { + return null; + } + } + var lanes = getNextLanes(root, root === workInProgressRoot ? workInProgressRootRenderLanes : NoLanes); + if (lanes === NoLanes) { + return null; + } + var shouldTimeSlice = !includesBlockingLane(root, lanes) && !includesExpiredLane(root, lanes) && !didTimeout; + var exitStatus = shouldTimeSlice ? renderRootConcurrent(root, lanes) : renderRootSync(root, lanes); + if (exitStatus !== RootInProgress) { + if (exitStatus === RootErrored) { + var errorRetryLanes = getLanesToRetrySynchronouslyOnError(root); + if (errorRetryLanes !== NoLanes) { + lanes = errorRetryLanes; + exitStatus = recoverFromConcurrentError(root, errorRetryLanes); + } + } + if (exitStatus === RootFatalErrored) { + var fatalError = workInProgressRootFatalError; + prepareFreshStack(root, NoLanes); + markRootSuspended$1(root, lanes); + ensureRootIsScheduled(root, now()); + throw fatalError; + } + if (exitStatus === RootDidNotComplete) { + markRootSuspended$1(root, lanes); + } else { + var renderWasConcurrent = !includesBlockingLane(root, lanes); + var finishedWork = root.current.alternate; + if (renderWasConcurrent && !isRenderConsistentWithExternalStores(finishedWork)) { + exitStatus = renderRootSync(root, lanes); + if (exitStatus === RootErrored) { + var _errorRetryLanes = getLanesToRetrySynchronouslyOnError(root); + if (_errorRetryLanes !== NoLanes) { + lanes = _errorRetryLanes; + exitStatus = recoverFromConcurrentError(root, _errorRetryLanes); + } + } + if (exitStatus === RootFatalErrored) { + var _fatalError = workInProgressRootFatalError; + prepareFreshStack(root, NoLanes); + markRootSuspended$1(root, lanes); + ensureRootIsScheduled(root, now()); + throw _fatalError; + } + } + root.finishedWork = finishedWork; + root.finishedLanes = lanes; + finishConcurrentRender(root, exitStatus, lanes); + } + } + ensureRootIsScheduled(root, now()); + if (root.callbackNode === originalCallbackNode) { + return performConcurrentWorkOnRoot.bind(null, root); + } + return null; + } + function recoverFromConcurrentError(root, errorRetryLanes) { + var errorsFromFirstAttempt = workInProgressRootConcurrentErrors; + if (isRootDehydrated(root)) { + var rootWorkInProgress = prepareFreshStack(root, errorRetryLanes); + rootWorkInProgress.flags |= ForceClientRender; + { + errorHydratingContainer(root.containerInfo); + } + } + var exitStatus = renderRootSync(root, errorRetryLanes); + if (exitStatus !== RootErrored) { + var errorsFromSecondAttempt = workInProgressRootRecoverableErrors; + workInProgressRootRecoverableErrors = errorsFromFirstAttempt; + if (errorsFromSecondAttempt !== null) { + queueRecoverableErrors(errorsFromSecondAttempt); + } + } + return exitStatus; + } + function queueRecoverableErrors(errors) { + if (workInProgressRootRecoverableErrors === null) { + workInProgressRootRecoverableErrors = errors; + } else { + workInProgressRootRecoverableErrors.push.apply(workInProgressRootRecoverableErrors, errors); + } + } + function finishConcurrentRender(root, exitStatus, lanes) { + switch (exitStatus) { + case RootInProgress: + case RootFatalErrored: { + throw new Error("Root did not complete. This is a bug in React."); + } + case RootErrored: { + commitRoot(root, workInProgressRootRecoverableErrors, workInProgressTransitions); + break; + } + case RootSuspended: { + markRootSuspended$1(root, lanes); + if (includesOnlyRetries(lanes) && // do not delay if we're inside an act() scope + !shouldForceFlushFallbacksInDEV()) { + var msUntilTimeout = globalMostRecentFallbackTime + FALLBACK_THROTTLE_MS - now(); + if (msUntilTimeout > 10) { + var nextLanes = getNextLanes(root, NoLanes); + if (nextLanes !== NoLanes) { + break; + } + var suspendedLanes = root.suspendedLanes; + if (!isSubsetOfLanes(suspendedLanes, lanes)) { + var eventTime = requestEventTime(); + markRootPinged(root, suspendedLanes); + break; + } + root.timeoutHandle = scheduleTimeout(commitRoot.bind(null, root, workInProgressRootRecoverableErrors, workInProgressTransitions), msUntilTimeout); + break; + } + } + commitRoot(root, workInProgressRootRecoverableErrors, workInProgressTransitions); + break; + } + case RootSuspendedWithDelay: { + markRootSuspended$1(root, lanes); + if (includesOnlyTransitions(lanes)) { + break; + } + if (!shouldForceFlushFallbacksInDEV()) { + var mostRecentEventTime = getMostRecentEventTime(root, lanes); + var eventTimeMs = mostRecentEventTime; + var timeElapsedMs = now() - eventTimeMs; + var _msUntilTimeout = jnd(timeElapsedMs) - timeElapsedMs; + if (_msUntilTimeout > 10) { + root.timeoutHandle = scheduleTimeout(commitRoot.bind(null, root, workInProgressRootRecoverableErrors, workInProgressTransitions), _msUntilTimeout); + break; + } + } + commitRoot(root, workInProgressRootRecoverableErrors, workInProgressTransitions); + break; + } + case RootCompleted: { + commitRoot(root, workInProgressRootRecoverableErrors, workInProgressTransitions); + break; + } + default: { + throw new Error("Unknown root exit status."); + } + } + } + function isRenderConsistentWithExternalStores(finishedWork) { + var node = finishedWork; + while (true) { + if (node.flags & StoreConsistency) { + var updateQueue = node.updateQueue; + if (updateQueue !== null) { + var checks = updateQueue.stores; + if (checks !== null) { + for (var i = 0; i < checks.length; i++) { + var check = checks[i]; + var getSnapshot = check.getSnapshot; + var renderedValue = check.value; + try { + if (!objectIs(getSnapshot(), renderedValue)) { + return false; + } + } catch (error2) { + return false; + } + } + } + } + } + var child = node.child; + if (node.subtreeFlags & StoreConsistency && child !== null) { + child.return = node; + node = child; + continue; + } + if (node === finishedWork) { + return true; + } + while (node.sibling === null) { + if (node.return === null || node.return === finishedWork) { + return true; + } + node = node.return; + } + node.sibling.return = node.return; + node = node.sibling; + } + return true; + } + function markRootSuspended$1(root, suspendedLanes) { + suspendedLanes = removeLanes(suspendedLanes, workInProgressRootPingedLanes); + suspendedLanes = removeLanes(suspendedLanes, workInProgressRootInterleavedUpdatedLanes); + markRootSuspended(root, suspendedLanes); + } + function performSyncWorkOnRoot(root) { + { + syncNestedUpdateFlag(); + } + if ((executionContext & (RenderContext | CommitContext)) !== NoContext) { + throw new Error("Should not already be working."); + } + flushPassiveEffects(); + var lanes = getNextLanes(root, NoLanes); + if (!includesSomeLane(lanes, SyncLane)) { + ensureRootIsScheduled(root, now()); + return null; + } + var exitStatus = renderRootSync(root, lanes); + if (root.tag !== LegacyRoot && exitStatus === RootErrored) { + var errorRetryLanes = getLanesToRetrySynchronouslyOnError(root); + if (errorRetryLanes !== NoLanes) { + lanes = errorRetryLanes; + exitStatus = recoverFromConcurrentError(root, errorRetryLanes); + } + } + if (exitStatus === RootFatalErrored) { + var fatalError = workInProgressRootFatalError; + prepareFreshStack(root, NoLanes); + markRootSuspended$1(root, lanes); + ensureRootIsScheduled(root, now()); + throw fatalError; + } + if (exitStatus === RootDidNotComplete) { + throw new Error("Root did not complete. This is a bug in React."); + } + var finishedWork = root.current.alternate; + root.finishedWork = finishedWork; + root.finishedLanes = lanes; + commitRoot(root, workInProgressRootRecoverableErrors, workInProgressTransitions); + ensureRootIsScheduled(root, now()); + return null; + } + function flushRoot(root, lanes) { + if (lanes !== NoLanes) { + markRootEntangled(root, mergeLanes(lanes, SyncLane)); + ensureRootIsScheduled(root, now()); + if ((executionContext & (RenderContext | CommitContext)) === NoContext) { + resetRenderTimer(); + flushSyncCallbacks(); + } + } + } + function deferredUpdates(fn) { + var previousPriority = getCurrentUpdatePriority(); + var prevTransition = ReactCurrentBatchConfig$2.transition; + try { + ReactCurrentBatchConfig$2.transition = null; + setCurrentUpdatePriority(DefaultEventPriority); + return fn(); + } finally { + setCurrentUpdatePriority(previousPriority); + ReactCurrentBatchConfig$2.transition = prevTransition; + } + } + function batchedUpdates(fn, a) { + var prevExecutionContext = executionContext; + executionContext |= BatchedContext; + try { + return fn(a); + } finally { + executionContext = prevExecutionContext; + if (executionContext === NoContext && // Treat `act` as if it's inside `batchedUpdates`, even in legacy mode. + !ReactCurrentActQueue$1.isBatchingLegacy) { + resetRenderTimer(); + flushSyncCallbacksOnlyInLegacyMode(); + } + } + } + function discreteUpdates(fn, a, b, c, d) { + var previousPriority = getCurrentUpdatePriority(); + var prevTransition = ReactCurrentBatchConfig$2.transition; + try { + ReactCurrentBatchConfig$2.transition = null; + setCurrentUpdatePriority(DiscreteEventPriority); + return fn(a, b, c, d); + } finally { + setCurrentUpdatePriority(previousPriority); + ReactCurrentBatchConfig$2.transition = prevTransition; + if (executionContext === NoContext) { + resetRenderTimer(); + } + } + } + function flushSync(fn) { + if (rootWithPendingPassiveEffects !== null && rootWithPendingPassiveEffects.tag === LegacyRoot && (executionContext & (RenderContext | CommitContext)) === NoContext) { + flushPassiveEffects(); + } + var prevExecutionContext = executionContext; + executionContext |= BatchedContext; + var prevTransition = ReactCurrentBatchConfig$2.transition; + var previousPriority = getCurrentUpdatePriority(); + try { + ReactCurrentBatchConfig$2.transition = null; + setCurrentUpdatePriority(DiscreteEventPriority); + if (fn) { + return fn(); + } else { + return void 0; + } + } finally { + setCurrentUpdatePriority(previousPriority); + ReactCurrentBatchConfig$2.transition = prevTransition; + executionContext = prevExecutionContext; + if ((executionContext & (RenderContext | CommitContext)) === NoContext) { + flushSyncCallbacks(); + } + } + } + function isAlreadyRendering() { + return (executionContext & (RenderContext | CommitContext)) !== NoContext; + } + function flushControlled(fn) { + var prevExecutionContext = executionContext; + executionContext |= BatchedContext; + var prevTransition = ReactCurrentBatchConfig$2.transition; + var previousPriority = getCurrentUpdatePriority(); + try { + ReactCurrentBatchConfig$2.transition = null; + setCurrentUpdatePriority(DiscreteEventPriority); + fn(); + } finally { + setCurrentUpdatePriority(previousPriority); + ReactCurrentBatchConfig$2.transition = prevTransition; + executionContext = prevExecutionContext; + if (executionContext === NoContext) { + resetRenderTimer(); + flushSyncCallbacks(); + } + } + } + function pushRenderLanes(fiber, lanes) { + push(subtreeRenderLanesCursor, subtreeRenderLanes, fiber); + subtreeRenderLanes = mergeLanes(subtreeRenderLanes, lanes); + workInProgressRootIncludedLanes = mergeLanes(workInProgressRootIncludedLanes, lanes); + } + function popRenderLanes(fiber) { + subtreeRenderLanes = subtreeRenderLanesCursor.current; + pop(subtreeRenderLanesCursor, fiber); + } + function prepareFreshStack(root, lanes) { + root.finishedWork = null; + root.finishedLanes = NoLanes; + var timeoutHandle = root.timeoutHandle; + if (timeoutHandle !== noTimeout) { + root.timeoutHandle = noTimeout; + cancelTimeout(timeoutHandle); + } + if (workInProgress !== null) { + var interruptedWork = workInProgress.return; + while (interruptedWork !== null) { + var current2 = interruptedWork.alternate; + unwindInterruptedWork(current2, interruptedWork); + interruptedWork = interruptedWork.return; + } + } + workInProgressRoot = root; + var rootWorkInProgress = createWorkInProgress(root.current, null); + workInProgress = rootWorkInProgress; + workInProgressRootRenderLanes = subtreeRenderLanes = workInProgressRootIncludedLanes = lanes; + workInProgressRootExitStatus = RootInProgress; + workInProgressRootFatalError = null; + workInProgressRootSkippedLanes = NoLanes; + workInProgressRootInterleavedUpdatedLanes = NoLanes; + workInProgressRootPingedLanes = NoLanes; + workInProgressRootConcurrentErrors = null; + workInProgressRootRecoverableErrors = null; + finishQueueingConcurrentUpdates(); + { + ReactStrictModeWarnings.discardPendingWarnings(); + } + return rootWorkInProgress; + } + function handleError(root, thrownValue) { + do { + var erroredWork = workInProgress; + try { + resetContextDependencies(); + resetHooksAfterThrow(); + resetCurrentFiber(); + ReactCurrentOwner$2.current = null; + if (erroredWork === null || erroredWork.return === null) { + workInProgressRootExitStatus = RootFatalErrored; + workInProgressRootFatalError = thrownValue; + workInProgress = null; + return; + } + if (enableProfilerTimer && erroredWork.mode & ProfileMode) { + stopProfilerTimerIfRunningAndRecordDelta(erroredWork, true); + } + if (enableSchedulingProfiler) { + markComponentRenderStopped(); + if (thrownValue !== null && typeof thrownValue === "object" && typeof thrownValue.then === "function") { + var wakeable = thrownValue; + markComponentSuspended(erroredWork, wakeable, workInProgressRootRenderLanes); + } else { + markComponentErrored(erroredWork, thrownValue, workInProgressRootRenderLanes); + } + } + throwException(root, erroredWork.return, erroredWork, thrownValue, workInProgressRootRenderLanes); + completeUnitOfWork(erroredWork); + } catch (yetAnotherThrownValue) { + thrownValue = yetAnotherThrownValue; + if (workInProgress === erroredWork && erroredWork !== null) { + erroredWork = erroredWork.return; + workInProgress = erroredWork; + } else { + erroredWork = workInProgress; + } + continue; + } + return; + } while (true); + } + function pushDispatcher() { + var prevDispatcher = ReactCurrentDispatcher$2.current; + ReactCurrentDispatcher$2.current = ContextOnlyDispatcher; + if (prevDispatcher === null) { + return ContextOnlyDispatcher; + } else { + return prevDispatcher; + } + } + function popDispatcher(prevDispatcher) { + ReactCurrentDispatcher$2.current = prevDispatcher; + } + function markCommitTimeOfFallback() { + globalMostRecentFallbackTime = now(); + } + function markSkippedUpdateLanes(lane) { + workInProgressRootSkippedLanes = mergeLanes(lane, workInProgressRootSkippedLanes); + } + function renderDidSuspend() { + if (workInProgressRootExitStatus === RootInProgress) { + workInProgressRootExitStatus = RootSuspended; + } + } + function renderDidSuspendDelayIfPossible() { + if (workInProgressRootExitStatus === RootInProgress || workInProgressRootExitStatus === RootSuspended || workInProgressRootExitStatus === RootErrored) { + workInProgressRootExitStatus = RootSuspendedWithDelay; + } + if (workInProgressRoot !== null && (includesNonIdleWork(workInProgressRootSkippedLanes) || includesNonIdleWork(workInProgressRootInterleavedUpdatedLanes))) { + markRootSuspended$1(workInProgressRoot, workInProgressRootRenderLanes); + } + } + function renderDidError(error2) { + if (workInProgressRootExitStatus !== RootSuspendedWithDelay) { + workInProgressRootExitStatus = RootErrored; + } + if (workInProgressRootConcurrentErrors === null) { + workInProgressRootConcurrentErrors = [error2]; + } else { + workInProgressRootConcurrentErrors.push(error2); + } + } + function renderHasNotSuspendedYet() { + return workInProgressRootExitStatus === RootInProgress; + } + function renderRootSync(root, lanes) { + var prevExecutionContext = executionContext; + executionContext |= RenderContext; + var prevDispatcher = pushDispatcher(); + if (workInProgressRoot !== root || workInProgressRootRenderLanes !== lanes) { + { + if (isDevToolsPresent) { + var memoizedUpdaters = root.memoizedUpdaters; + if (memoizedUpdaters.size > 0) { + restorePendingUpdaters(root, workInProgressRootRenderLanes); + memoizedUpdaters.clear(); + } + movePendingFibersToMemoized(root, lanes); + } + } + workInProgressTransitions = getTransitionsForLanes(); + prepareFreshStack(root, lanes); + } + { + markRenderStarted(lanes); + } + do { + try { + workLoopSync(); + break; + } catch (thrownValue) { + handleError(root, thrownValue); + } + } while (true); + resetContextDependencies(); + executionContext = prevExecutionContext; + popDispatcher(prevDispatcher); + if (workInProgress !== null) { + throw new Error("Cannot commit an incomplete root. This error is likely caused by a bug in React. Please file an issue."); + } + { + markRenderStopped(); + } + workInProgressRoot = null; + workInProgressRootRenderLanes = NoLanes; + return workInProgressRootExitStatus; + } + function workLoopSync() { + while (workInProgress !== null) { + performUnitOfWork(workInProgress); + } + } + function renderRootConcurrent(root, lanes) { + var prevExecutionContext = executionContext; + executionContext |= RenderContext; + var prevDispatcher = pushDispatcher(); + if (workInProgressRoot !== root || workInProgressRootRenderLanes !== lanes) { + { + if (isDevToolsPresent) { + var memoizedUpdaters = root.memoizedUpdaters; + if (memoizedUpdaters.size > 0) { + restorePendingUpdaters(root, workInProgressRootRenderLanes); + memoizedUpdaters.clear(); + } + movePendingFibersToMemoized(root, lanes); + } + } + workInProgressTransitions = getTransitionsForLanes(); + resetRenderTimer(); + prepareFreshStack(root, lanes); + } + { + markRenderStarted(lanes); + } + do { + try { + workLoopConcurrent(); + break; + } catch (thrownValue) { + handleError(root, thrownValue); + } + } while (true); + resetContextDependencies(); + popDispatcher(prevDispatcher); + executionContext = prevExecutionContext; + if (workInProgress !== null) { + { + markRenderYielded(); + } + return RootInProgress; + } else { + { + markRenderStopped(); + } + workInProgressRoot = null; + workInProgressRootRenderLanes = NoLanes; + return workInProgressRootExitStatus; + } + } + function workLoopConcurrent() { + while (workInProgress !== null && !shouldYield()) { + performUnitOfWork(workInProgress); + } + } + function performUnitOfWork(unitOfWork) { + var current2 = unitOfWork.alternate; + setCurrentFiber(unitOfWork); + var next; + if ((unitOfWork.mode & ProfileMode) !== NoMode) { + startProfilerTimer(unitOfWork); + next = beginWork$1(current2, unitOfWork, subtreeRenderLanes); + stopProfilerTimerIfRunningAndRecordDelta(unitOfWork, true); + } else { + next = beginWork$1(current2, unitOfWork, subtreeRenderLanes); + } + resetCurrentFiber(); + unitOfWork.memoizedProps = unitOfWork.pendingProps; + if (next === null) { + completeUnitOfWork(unitOfWork); + } else { + workInProgress = next; + } + ReactCurrentOwner$2.current = null; + } + function completeUnitOfWork(unitOfWork) { + var completedWork = unitOfWork; + do { + var current2 = completedWork.alternate; + var returnFiber = completedWork.return; + if ((completedWork.flags & Incomplete) === NoFlags) { + setCurrentFiber(completedWork); + var next = void 0; + if ((completedWork.mode & ProfileMode) === NoMode) { + next = completeWork(current2, completedWork, subtreeRenderLanes); + } else { + startProfilerTimer(completedWork); + next = completeWork(current2, completedWork, subtreeRenderLanes); + stopProfilerTimerIfRunningAndRecordDelta(completedWork, false); + } + resetCurrentFiber(); + if (next !== null) { + workInProgress = next; + return; + } + } else { + var _next = unwindWork(current2, completedWork); + if (_next !== null) { + _next.flags &= HostEffectMask; + workInProgress = _next; + return; + } + if ((completedWork.mode & ProfileMode) !== NoMode) { + stopProfilerTimerIfRunningAndRecordDelta(completedWork, false); + var actualDuration = completedWork.actualDuration; + var child = completedWork.child; + while (child !== null) { + actualDuration += child.actualDuration; + child = child.sibling; + } + completedWork.actualDuration = actualDuration; + } + if (returnFiber !== null) { + returnFiber.flags |= Incomplete; + returnFiber.subtreeFlags = NoFlags; + returnFiber.deletions = null; + } else { + workInProgressRootExitStatus = RootDidNotComplete; + workInProgress = null; + return; + } + } + var siblingFiber = completedWork.sibling; + if (siblingFiber !== null) { + workInProgress = siblingFiber; + return; + } + completedWork = returnFiber; + workInProgress = completedWork; + } while (completedWork !== null); + if (workInProgressRootExitStatus === RootInProgress) { + workInProgressRootExitStatus = RootCompleted; + } + } + function commitRoot(root, recoverableErrors, transitions) { + var previousUpdateLanePriority = getCurrentUpdatePriority(); + var prevTransition = ReactCurrentBatchConfig$2.transition; + try { + ReactCurrentBatchConfig$2.transition = null; + setCurrentUpdatePriority(DiscreteEventPriority); + commitRootImpl(root, recoverableErrors, transitions, previousUpdateLanePriority); + } finally { + ReactCurrentBatchConfig$2.transition = prevTransition; + setCurrentUpdatePriority(previousUpdateLanePriority); + } + return null; + } + function commitRootImpl(root, recoverableErrors, transitions, renderPriorityLevel) { + do { + flushPassiveEffects(); + } while (rootWithPendingPassiveEffects !== null); + flushRenderPhaseStrictModeWarningsInDEV(); + if ((executionContext & (RenderContext | CommitContext)) !== NoContext) { + throw new Error("Should not already be working."); + } + var finishedWork = root.finishedWork; + var lanes = root.finishedLanes; + { + markCommitStarted(lanes); + } + if (finishedWork === null) { + { + markCommitStopped(); + } + return null; + } else { + { + if (lanes === NoLanes) { + error("root.finishedLanes should not be empty during a commit. This is a bug in React."); + } + } + } + root.finishedWork = null; + root.finishedLanes = NoLanes; + if (finishedWork === root.current) { + throw new Error("Cannot commit the same tree as before. This error is likely caused by a bug in React. Please file an issue."); + } + root.callbackNode = null; + root.callbackPriority = NoLane; + var remainingLanes = mergeLanes(finishedWork.lanes, finishedWork.childLanes); + markRootFinished(root, remainingLanes); + if (root === workInProgressRoot) { + workInProgressRoot = null; + workInProgress = null; + workInProgressRootRenderLanes = NoLanes; + } + if ((finishedWork.subtreeFlags & PassiveMask) !== NoFlags || (finishedWork.flags & PassiveMask) !== NoFlags) { + if (!rootDoesHavePassiveEffects) { + rootDoesHavePassiveEffects = true; + pendingPassiveTransitions = transitions; + scheduleCallback$1(NormalPriority, function() { + flushPassiveEffects(); + return null; + }); + } + } + var subtreeHasEffects = (finishedWork.subtreeFlags & (BeforeMutationMask | MutationMask | LayoutMask | PassiveMask)) !== NoFlags; + var rootHasEffect = (finishedWork.flags & (BeforeMutationMask | MutationMask | LayoutMask | PassiveMask)) !== NoFlags; + if (subtreeHasEffects || rootHasEffect) { + var prevTransition = ReactCurrentBatchConfig$2.transition; + ReactCurrentBatchConfig$2.transition = null; + var previousPriority = getCurrentUpdatePriority(); + setCurrentUpdatePriority(DiscreteEventPriority); + var prevExecutionContext = executionContext; + executionContext |= CommitContext; + ReactCurrentOwner$2.current = null; + var shouldFireAfterActiveInstanceBlur2 = commitBeforeMutationEffects(root, finishedWork); + { + recordCommitTime(); + } + commitMutationEffects(root, finishedWork, lanes); + resetAfterCommit(root.containerInfo); + root.current = finishedWork; + { + markLayoutEffectsStarted(lanes); + } + commitLayoutEffects(finishedWork, root, lanes); + { + markLayoutEffectsStopped(); + } + requestPaint(); + executionContext = prevExecutionContext; + setCurrentUpdatePriority(previousPriority); + ReactCurrentBatchConfig$2.transition = prevTransition; + } else { + root.current = finishedWork; + { + recordCommitTime(); + } + } + var rootDidHavePassiveEffects = rootDoesHavePassiveEffects; + if (rootDoesHavePassiveEffects) { + rootDoesHavePassiveEffects = false; + rootWithPendingPassiveEffects = root; + pendingPassiveEffectsLanes = lanes; + } else { + { + nestedPassiveUpdateCount = 0; + rootWithPassiveNestedUpdates = null; + } + } + remainingLanes = root.pendingLanes; + if (remainingLanes === NoLanes) { + legacyErrorBoundariesThatAlreadyFailed = null; + } + { + if (!rootDidHavePassiveEffects) { + commitDoubleInvokeEffectsInDEV(root.current, false); + } + } + onCommitRoot(finishedWork.stateNode, renderPriorityLevel); + { + if (isDevToolsPresent) { + root.memoizedUpdaters.clear(); + } + } + { + onCommitRoot$1(); + } + ensureRootIsScheduled(root, now()); + if (recoverableErrors !== null) { + var onRecoverableError = root.onRecoverableError; + for (var i = 0; i < recoverableErrors.length; i++) { + var recoverableError = recoverableErrors[i]; + var componentStack = recoverableError.stack; + var digest = recoverableError.digest; + onRecoverableError(recoverableError.value, { + componentStack, + digest + }); + } + } + if (hasUncaughtError) { + hasUncaughtError = false; + var error$1 = firstUncaughtError; + firstUncaughtError = null; + throw error$1; + } + if (includesSomeLane(pendingPassiveEffectsLanes, SyncLane) && root.tag !== LegacyRoot) { + flushPassiveEffects(); + } + remainingLanes = root.pendingLanes; + if (includesSomeLane(remainingLanes, SyncLane)) { + { + markNestedUpdateScheduled(); + } + if (root === rootWithNestedUpdates) { + nestedUpdateCount++; + } else { + nestedUpdateCount = 0; + rootWithNestedUpdates = root; + } + } else { + nestedUpdateCount = 0; + } + flushSyncCallbacks(); + { + markCommitStopped(); + } + return null; + } + function flushPassiveEffects() { + if (rootWithPendingPassiveEffects !== null) { + var renderPriority = lanesToEventPriority(pendingPassiveEffectsLanes); + var priority2 = lowerEventPriority(DefaultEventPriority, renderPriority); + var prevTransition = ReactCurrentBatchConfig$2.transition; + var previousPriority = getCurrentUpdatePriority(); + try { + ReactCurrentBatchConfig$2.transition = null; + setCurrentUpdatePriority(priority2); + return flushPassiveEffectsImpl(); + } finally { + setCurrentUpdatePriority(previousPriority); + ReactCurrentBatchConfig$2.transition = prevTransition; + } + } + return false; + } + function enqueuePendingPassiveProfilerEffect(fiber) { + { + pendingPassiveProfilerEffects.push(fiber); + if (!rootDoesHavePassiveEffects) { + rootDoesHavePassiveEffects = true; + scheduleCallback$1(NormalPriority, function() { + flushPassiveEffects(); + return null; + }); + } + } + } + function flushPassiveEffectsImpl() { + if (rootWithPendingPassiveEffects === null) { + return false; + } + var transitions = pendingPassiveTransitions; + pendingPassiveTransitions = null; + var root = rootWithPendingPassiveEffects; + var lanes = pendingPassiveEffectsLanes; + rootWithPendingPassiveEffects = null; + pendingPassiveEffectsLanes = NoLanes; + if ((executionContext & (RenderContext | CommitContext)) !== NoContext) { + throw new Error("Cannot flush passive effects while already rendering."); + } + { + isFlushingPassiveEffects = true; + didScheduleUpdateDuringPassiveEffects = false; + } + { + markPassiveEffectsStarted(lanes); + } + var prevExecutionContext = executionContext; + executionContext |= CommitContext; + commitPassiveUnmountEffects(root.current); + commitPassiveMountEffects(root, root.current, lanes, transitions); + { + var profilerEffects = pendingPassiveProfilerEffects; + pendingPassiveProfilerEffects = []; + for (var i = 0; i < profilerEffects.length; i++) { + var _fiber = profilerEffects[i]; + commitPassiveEffectDurations(root, _fiber); + } + } + { + markPassiveEffectsStopped(); + } + { + commitDoubleInvokeEffectsInDEV(root.current, true); + } + executionContext = prevExecutionContext; + flushSyncCallbacks(); + { + if (didScheduleUpdateDuringPassiveEffects) { + if (root === rootWithPassiveNestedUpdates) { + nestedPassiveUpdateCount++; + } else { + nestedPassiveUpdateCount = 0; + rootWithPassiveNestedUpdates = root; + } + } else { + nestedPassiveUpdateCount = 0; + } + isFlushingPassiveEffects = false; + didScheduleUpdateDuringPassiveEffects = false; + } + onPostCommitRoot(root); + { + var stateNode = root.current.stateNode; + stateNode.effectDuration = 0; + stateNode.passiveEffectDuration = 0; + } + return true; + } + function isAlreadyFailedLegacyErrorBoundary(instance) { + return legacyErrorBoundariesThatAlreadyFailed !== null && legacyErrorBoundariesThatAlreadyFailed.has(instance); + } + function markLegacyErrorBoundaryAsFailed(instance) { + if (legacyErrorBoundariesThatAlreadyFailed === null) { + legacyErrorBoundariesThatAlreadyFailed = /* @__PURE__ */ new Set([instance]); + } else { + legacyErrorBoundariesThatAlreadyFailed.add(instance); + } + } + function prepareToThrowUncaughtError(error2) { + if (!hasUncaughtError) { + hasUncaughtError = true; + firstUncaughtError = error2; + } + } + var onUncaughtError = prepareToThrowUncaughtError; + function captureCommitPhaseErrorOnRoot(rootFiber, sourceFiber, error2) { + var errorInfo = createCapturedValueAtFiber(error2, sourceFiber); + var update = createRootErrorUpdate(rootFiber, errorInfo, SyncLane); + var root = enqueueUpdate(rootFiber, update, SyncLane); + var eventTime = requestEventTime(); + if (root !== null) { + markRootUpdated(root, SyncLane, eventTime); + ensureRootIsScheduled(root, eventTime); + } + } + function captureCommitPhaseError(sourceFiber, nearestMountedAncestor, error$1) { + { + reportUncaughtErrorInDEV(error$1); + setIsRunningInsertionEffect(false); + } + if (sourceFiber.tag === HostRoot) { + captureCommitPhaseErrorOnRoot(sourceFiber, sourceFiber, error$1); + return; + } + var fiber = null; + { + fiber = nearestMountedAncestor; + } + while (fiber !== null) { + if (fiber.tag === HostRoot) { + captureCommitPhaseErrorOnRoot(fiber, sourceFiber, error$1); + return; + } else if (fiber.tag === ClassComponent) { + var ctor = fiber.type; + var instance = fiber.stateNode; + if (typeof ctor.getDerivedStateFromError === "function" || typeof instance.componentDidCatch === "function" && !isAlreadyFailedLegacyErrorBoundary(instance)) { + var errorInfo = createCapturedValueAtFiber(error$1, sourceFiber); + var update = createClassErrorUpdate(fiber, errorInfo, SyncLane); + var root = enqueueUpdate(fiber, update, SyncLane); + var eventTime = requestEventTime(); + if (root !== null) { + markRootUpdated(root, SyncLane, eventTime); + ensureRootIsScheduled(root, eventTime); + } + return; + } + } + fiber = fiber.return; + } + { + error("Internal React error: Attempted to capture a commit phase error inside a detached tree. This indicates a bug in React. Likely causes include deleting the same fiber more than once, committing an already-finished tree, or an inconsistent return pointer.\n\nError message:\n\n%s", error$1); + } + } + function pingSuspendedRoot(root, wakeable, pingedLanes) { + var pingCache = root.pingCache; + if (pingCache !== null) { + pingCache.delete(wakeable); + } + var eventTime = requestEventTime(); + markRootPinged(root, pingedLanes); + warnIfSuspenseResolutionNotWrappedWithActDEV(root); + if (workInProgressRoot === root && isSubsetOfLanes(workInProgressRootRenderLanes, pingedLanes)) { + if (workInProgressRootExitStatus === RootSuspendedWithDelay || workInProgressRootExitStatus === RootSuspended && includesOnlyRetries(workInProgressRootRenderLanes) && now() - globalMostRecentFallbackTime < FALLBACK_THROTTLE_MS) { + prepareFreshStack(root, NoLanes); + } else { + workInProgressRootPingedLanes = mergeLanes(workInProgressRootPingedLanes, pingedLanes); + } + } + ensureRootIsScheduled(root, eventTime); + } + function retryTimedOutBoundary(boundaryFiber, retryLane) { + if (retryLane === NoLane) { + retryLane = requestRetryLane(boundaryFiber); + } + var eventTime = requestEventTime(); + var root = enqueueConcurrentRenderForLane(boundaryFiber, retryLane); + if (root !== null) { + markRootUpdated(root, retryLane, eventTime); + ensureRootIsScheduled(root, eventTime); + } + } + function retryDehydratedSuspenseBoundary(boundaryFiber) { + var suspenseState = boundaryFiber.memoizedState; + var retryLane = NoLane; + if (suspenseState !== null) { + retryLane = suspenseState.retryLane; + } + retryTimedOutBoundary(boundaryFiber, retryLane); + } + function resolveRetryWakeable(boundaryFiber, wakeable) { + var retryLane = NoLane; + var retryCache; + switch (boundaryFiber.tag) { + case SuspenseComponent: + retryCache = boundaryFiber.stateNode; + var suspenseState = boundaryFiber.memoizedState; + if (suspenseState !== null) { + retryLane = suspenseState.retryLane; + } + break; + case SuspenseListComponent: + retryCache = boundaryFiber.stateNode; + break; + default: + throw new Error("Pinged unknown suspense boundary type. This is probably a bug in React."); + } + if (retryCache !== null) { + retryCache.delete(wakeable); + } + retryTimedOutBoundary(boundaryFiber, retryLane); + } + function jnd(timeElapsed) { + return timeElapsed < 120 ? 120 : timeElapsed < 480 ? 480 : timeElapsed < 1080 ? 1080 : timeElapsed < 1920 ? 1920 : timeElapsed < 3e3 ? 3e3 : timeElapsed < 4320 ? 4320 : ceil(timeElapsed / 1960) * 1960; + } + function checkForNestedUpdates() { + if (nestedUpdateCount > NESTED_UPDATE_LIMIT) { + nestedUpdateCount = 0; + rootWithNestedUpdates = null; + throw new Error("Maximum update depth exceeded. This can happen when a component repeatedly calls setState inside componentWillUpdate or componentDidUpdate. React limits the number of nested updates to prevent infinite loops."); + } + { + if (nestedPassiveUpdateCount > NESTED_PASSIVE_UPDATE_LIMIT) { + nestedPassiveUpdateCount = 0; + rootWithPassiveNestedUpdates = null; + error("Maximum update depth exceeded. This can happen when a component calls setState inside useEffect, but useEffect either doesn't have a dependency array, or one of the dependencies changes on every render."); + } + } + } + function flushRenderPhaseStrictModeWarningsInDEV() { + { + ReactStrictModeWarnings.flushLegacyContextWarning(); + { + ReactStrictModeWarnings.flushPendingUnsafeLifecycleWarnings(); + } + } + } + function commitDoubleInvokeEffectsInDEV(fiber, hasPassiveEffects) { + { + setCurrentFiber(fiber); + invokeEffectsInDev(fiber, MountLayoutDev, invokeLayoutEffectUnmountInDEV); + if (hasPassiveEffects) { + invokeEffectsInDev(fiber, MountPassiveDev, invokePassiveEffectUnmountInDEV); + } + invokeEffectsInDev(fiber, MountLayoutDev, invokeLayoutEffectMountInDEV); + if (hasPassiveEffects) { + invokeEffectsInDev(fiber, MountPassiveDev, invokePassiveEffectMountInDEV); + } + resetCurrentFiber(); + } + } + function invokeEffectsInDev(firstChild, fiberFlags, invokeEffectFn) { + { + var current2 = firstChild; + var subtreeRoot = null; + while (current2 !== null) { + var primarySubtreeFlag = current2.subtreeFlags & fiberFlags; + if (current2 !== subtreeRoot && current2.child !== null && primarySubtreeFlag !== NoFlags) { + current2 = current2.child; + } else { + if ((current2.flags & fiberFlags) !== NoFlags) { + invokeEffectFn(current2); + } + if (current2.sibling !== null) { + current2 = current2.sibling; + } else { + current2 = subtreeRoot = current2.return; + } + } + } + } + } + var didWarnStateUpdateForNotYetMountedComponent = null; + function warnAboutUpdateOnNotYetMountedFiberInDEV(fiber) { + { + if ((executionContext & RenderContext) !== NoContext) { + return; + } + if (!(fiber.mode & ConcurrentMode)) { + return; + } + var tag = fiber.tag; + if (tag !== IndeterminateComponent && tag !== HostRoot && tag !== ClassComponent && tag !== FunctionComponent && tag !== ForwardRef && tag !== MemoComponent && tag !== SimpleMemoComponent) { + return; + } + var componentName = getComponentNameFromFiber(fiber) || "ReactComponent"; + if (didWarnStateUpdateForNotYetMountedComponent !== null) { + if (didWarnStateUpdateForNotYetMountedComponent.has(componentName)) { + return; + } + didWarnStateUpdateForNotYetMountedComponent.add(componentName); + } else { + didWarnStateUpdateForNotYetMountedComponent = /* @__PURE__ */ new Set([componentName]); + } + var previousFiber = current; + try { + setCurrentFiber(fiber); + error("Can't perform a React state update on a component that hasn't mounted yet. This indicates that you have a side-effect in your render function that asynchronously later calls tries to update the component. Move this work to useEffect instead."); + } finally { + if (previousFiber) { + setCurrentFiber(fiber); + } else { + resetCurrentFiber(); + } + } + } + } + var beginWork$1; + { + var dummyFiber = null; + beginWork$1 = function(current2, unitOfWork, lanes) { + var originalWorkInProgressCopy = assignFiberPropertiesInDEV(dummyFiber, unitOfWork); + try { + return beginWork(current2, unitOfWork, lanes); + } catch (originalError) { + if (didSuspendOrErrorWhileHydratingDEV() || originalError !== null && typeof originalError === "object" && typeof originalError.then === "function") { + throw originalError; + } + resetContextDependencies(); + resetHooksAfterThrow(); + unwindInterruptedWork(current2, unitOfWork); + assignFiberPropertiesInDEV(unitOfWork, originalWorkInProgressCopy); + if (unitOfWork.mode & ProfileMode) { + startProfilerTimer(unitOfWork); + } + invokeGuardedCallback(null, beginWork, null, current2, unitOfWork, lanes); + if (hasCaughtError()) { + var replayError = clearCaughtError(); + if (typeof replayError === "object" && replayError !== null && replayError._suppressLogging && typeof originalError === "object" && originalError !== null && !originalError._suppressLogging) { + originalError._suppressLogging = true; + } + } + throw originalError; + } + }; + } + var didWarnAboutUpdateInRender = false; + var didWarnAboutUpdateInRenderForAnotherComponent; + { + didWarnAboutUpdateInRenderForAnotherComponent = /* @__PURE__ */ new Set(); + } + function warnAboutRenderPhaseUpdatesInDEV(fiber) { + { + if (isRendering && !getIsUpdatingOpaqueValueInRenderPhaseInDEV()) { + switch (fiber.tag) { + case FunctionComponent: + case ForwardRef: + case SimpleMemoComponent: { + var renderingComponentName = workInProgress && getComponentNameFromFiber(workInProgress) || "Unknown"; + var dedupeKey = renderingComponentName; + if (!didWarnAboutUpdateInRenderForAnotherComponent.has(dedupeKey)) { + didWarnAboutUpdateInRenderForAnotherComponent.add(dedupeKey); + var setStateComponentName = getComponentNameFromFiber(fiber) || "Unknown"; + error("Cannot update a component (`%s`) while rendering a different component (`%s`). To locate the bad setState() call inside `%s`, follow the stack trace as described in https://reactjs.org/link/setstate-in-render", setStateComponentName, renderingComponentName, renderingComponentName); + } + break; + } + case ClassComponent: { + if (!didWarnAboutUpdateInRender) { + error("Cannot update during an existing state transition (such as within `render`). Render methods should be a pure function of props and state."); + didWarnAboutUpdateInRender = true; + } + break; + } + } + } + } + } + function restorePendingUpdaters(root, lanes) { + { + if (isDevToolsPresent) { + var memoizedUpdaters = root.memoizedUpdaters; + memoizedUpdaters.forEach(function(schedulingFiber) { + addFiberToLanesMap(root, schedulingFiber, lanes); + }); + } + } + } + var fakeActCallbackNode = {}; + function scheduleCallback$1(priorityLevel, callback) { + { + var actQueue = ReactCurrentActQueue$1.current; + if (actQueue !== null) { + actQueue.push(callback); + return fakeActCallbackNode; + } else { + return scheduleCallback(priorityLevel, callback); + } + } + } + function cancelCallback$1(callbackNode) { + if (callbackNode === fakeActCallbackNode) { + return; + } + return cancelCallback(callbackNode); + } + function shouldForceFlushFallbacksInDEV() { + return ReactCurrentActQueue$1.current !== null; + } + function warnIfUpdatesNotWrappedWithActDEV(fiber) { + { + if (fiber.mode & ConcurrentMode) { + if (!isConcurrentActEnvironment()) { + return; + } + } else { + if (!isLegacyActEnvironment()) { + return; + } + if (executionContext !== NoContext) { + return; + } + if (fiber.tag !== FunctionComponent && fiber.tag !== ForwardRef && fiber.tag !== SimpleMemoComponent) { + return; + } + } + if (ReactCurrentActQueue$1.current === null) { + var previousFiber = current; + try { + setCurrentFiber(fiber); + error("An update to %s inside a test was not wrapped in act(...).\n\nWhen testing, code that causes React state updates should be wrapped into act(...):\n\nact(() => {\n /* fire events that update state */\n});\n/* assert on the output */\n\nThis ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act", getComponentNameFromFiber(fiber)); + } finally { + if (previousFiber) { + setCurrentFiber(fiber); + } else { + resetCurrentFiber(); + } + } + } + } + } + function warnIfSuspenseResolutionNotWrappedWithActDEV(root) { + { + if (root.tag !== LegacyRoot && isConcurrentActEnvironment() && ReactCurrentActQueue$1.current === null) { + error("A suspended resource finished loading inside a test, but the event was not wrapped in act(...).\n\nWhen testing, code that resolves suspended data should be wrapped into act(...):\n\nact(() => {\n /* finish loading suspended data */\n});\n/* assert on the output */\n\nThis ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act"); + } + } + } + function setIsRunningInsertionEffect(isRunning) { + { + isRunningInsertionEffect = isRunning; + } + } + var resolveFamily = null; + var failedBoundaries = null; + var setRefreshHandler = function(handler) { + { + resolveFamily = handler; + } + }; + function resolveFunctionForHotReloading(type) { + { + if (resolveFamily === null) { + return type; + } + var family = resolveFamily(type); + if (family === void 0) { + return type; + } + return family.current; + } + } + function resolveClassForHotReloading(type) { + return resolveFunctionForHotReloading(type); + } + function resolveForwardRefForHotReloading(type) { + { + if (resolveFamily === null) { + return type; + } + var family = resolveFamily(type); + if (family === void 0) { + if (type !== null && type !== void 0 && typeof type.render === "function") { + var currentRender = resolveFunctionForHotReloading(type.render); + if (type.render !== currentRender) { + var syntheticType = { + $$typeof: REACT_FORWARD_REF_TYPE, + render: currentRender + }; + if (type.displayName !== void 0) { + syntheticType.displayName = type.displayName; + } + return syntheticType; + } + } + return type; + } + return family.current; + } + } + function isCompatibleFamilyForHotReloading(fiber, element) { + { + if (resolveFamily === null) { + return false; + } + var prevType = fiber.elementType; + var nextType = element.type; + var needsCompareFamilies = false; + var $$typeofNextType = typeof nextType === "object" && nextType !== null ? nextType.$$typeof : null; + switch (fiber.tag) { + case ClassComponent: { + if (typeof nextType === "function") { + needsCompareFamilies = true; + } + break; + } + case FunctionComponent: { + if (typeof nextType === "function") { + needsCompareFamilies = true; + } else if ($$typeofNextType === REACT_LAZY_TYPE) { + needsCompareFamilies = true; + } + break; + } + case ForwardRef: { + if ($$typeofNextType === REACT_FORWARD_REF_TYPE) { + needsCompareFamilies = true; + } else if ($$typeofNextType === REACT_LAZY_TYPE) { + needsCompareFamilies = true; + } + break; + } + case MemoComponent: + case SimpleMemoComponent: { + if ($$typeofNextType === REACT_MEMO_TYPE) { + needsCompareFamilies = true; + } else if ($$typeofNextType === REACT_LAZY_TYPE) { + needsCompareFamilies = true; + } + break; + } + default: + return false; + } + if (needsCompareFamilies) { + var prevFamily = resolveFamily(prevType); + if (prevFamily !== void 0 && prevFamily === resolveFamily(nextType)) { + return true; + } + } + return false; + } + } + function markFailedErrorBoundaryForHotReloading(fiber) { + { + if (resolveFamily === null) { + return; + } + if (typeof WeakSet !== "function") { + return; + } + if (failedBoundaries === null) { + failedBoundaries = /* @__PURE__ */ new WeakSet(); + } + failedBoundaries.add(fiber); + } + } + var scheduleRefresh = function(root, update) { + { + if (resolveFamily === null) { + return; + } + var staleFamilies = update.staleFamilies, updatedFamilies = update.updatedFamilies; + flushPassiveEffects(); + flushSync(function() { + scheduleFibersWithFamiliesRecursively(root.current, updatedFamilies, staleFamilies); + }); + } + }; + var scheduleRoot = function(root, element) { + { + if (root.context !== emptyContextObject) { + return; + } + flushPassiveEffects(); + flushSync(function() { + updateContainer(element, root, null, null); + }); + } + }; + function scheduleFibersWithFamiliesRecursively(fiber, updatedFamilies, staleFamilies) { + { + var alternate = fiber.alternate, child = fiber.child, sibling = fiber.sibling, tag = fiber.tag, type = fiber.type; + var candidateType = null; + switch (tag) { + case FunctionComponent: + case SimpleMemoComponent: + case ClassComponent: + candidateType = type; + break; + case ForwardRef: + candidateType = type.render; + break; + } + if (resolveFamily === null) { + throw new Error("Expected resolveFamily to be set during hot reload."); + } + var needsRender = false; + var needsRemount = false; + if (candidateType !== null) { + var family = resolveFamily(candidateType); + if (family !== void 0) { + if (staleFamilies.has(family)) { + needsRemount = true; + } else if (updatedFamilies.has(family)) { + if (tag === ClassComponent) { + needsRemount = true; + } else { + needsRender = true; + } + } + } + } + if (failedBoundaries !== null) { + if (failedBoundaries.has(fiber) || alternate !== null && failedBoundaries.has(alternate)) { + needsRemount = true; + } + } + if (needsRemount) { + fiber._debugNeedsRemount = true; + } + if (needsRemount || needsRender) { + var _root = enqueueConcurrentRenderForLane(fiber, SyncLane); + if (_root !== null) { + scheduleUpdateOnFiber(_root, fiber, SyncLane, NoTimestamp); + } + } + if (child !== null && !needsRemount) { + scheduleFibersWithFamiliesRecursively(child, updatedFamilies, staleFamilies); + } + if (sibling !== null) { + scheduleFibersWithFamiliesRecursively(sibling, updatedFamilies, staleFamilies); + } + } + } + var findHostInstancesForRefresh = function(root, families) { + { + var hostInstances = /* @__PURE__ */ new Set(); + var types = new Set(families.map(function(family) { + return family.current; + })); + findHostInstancesForMatchingFibersRecursively(root.current, types, hostInstances); + return hostInstances; + } + }; + function findHostInstancesForMatchingFibersRecursively(fiber, types, hostInstances) { + { + var child = fiber.child, sibling = fiber.sibling, tag = fiber.tag, type = fiber.type; + var candidateType = null; + switch (tag) { + case FunctionComponent: + case SimpleMemoComponent: + case ClassComponent: + candidateType = type; + break; + case ForwardRef: + candidateType = type.render; + break; + } + var didMatch = false; + if (candidateType !== null) { + if (types.has(candidateType)) { + didMatch = true; + } + } + if (didMatch) { + findHostInstancesForFiberShallowly(fiber, hostInstances); + } else { + if (child !== null) { + findHostInstancesForMatchingFibersRecursively(child, types, hostInstances); + } + } + if (sibling !== null) { + findHostInstancesForMatchingFibersRecursively(sibling, types, hostInstances); + } + } + } + function findHostInstancesForFiberShallowly(fiber, hostInstances) { + { + var foundHostInstances = findChildHostInstancesForFiberShallowly(fiber, hostInstances); + if (foundHostInstances) { + return; + } + var node = fiber; + while (true) { + switch (node.tag) { + case HostComponent: + hostInstances.add(node.stateNode); + return; + case HostPortal: + hostInstances.add(node.stateNode.containerInfo); + return; + case HostRoot: + hostInstances.add(node.stateNode.containerInfo); + return; + } + if (node.return === null) { + throw new Error("Expected to reach root first."); + } + node = node.return; + } + } + } + function findChildHostInstancesForFiberShallowly(fiber, hostInstances) { + { + var node = fiber; + var foundHostInstances = false; + while (true) { + if (node.tag === HostComponent) { + foundHostInstances = true; + hostInstances.add(node.stateNode); + } else if (node.child !== null) { + node.child.return = node; + node = node.child; + continue; + } + if (node === fiber) { + return foundHostInstances; + } + while (node.sibling === null) { + if (node.return === null || node.return === fiber) { + return foundHostInstances; + } + node = node.return; + } + node.sibling.return = node.return; + node = node.sibling; + } + } + return false; + } + var hasBadMapPolyfill; + { + hasBadMapPolyfill = false; + try { + var nonExtensibleObject = Object.preventExtensions({}); + /* @__PURE__ */ new Map([[nonExtensibleObject, null]]); + /* @__PURE__ */ new Set([nonExtensibleObject]); + } catch (e) { + hasBadMapPolyfill = true; + } + } + function FiberNode(tag, pendingProps, key, mode) { + this.tag = tag; + this.key = key; + this.elementType = null; + this.type = null; + this.stateNode = null; + this.return = null; + this.child = null; + this.sibling = null; + this.index = 0; + this.ref = null; + this.pendingProps = pendingProps; + this.memoizedProps = null; + this.updateQueue = null; + this.memoizedState = null; + this.dependencies = null; + this.mode = mode; + this.flags = NoFlags; + this.subtreeFlags = NoFlags; + this.deletions = null; + this.lanes = NoLanes; + this.childLanes = NoLanes; + this.alternate = null; + { + this.actualDuration = Number.NaN; + this.actualStartTime = Number.NaN; + this.selfBaseDuration = Number.NaN; + this.treeBaseDuration = Number.NaN; + this.actualDuration = 0; + this.actualStartTime = -1; + this.selfBaseDuration = 0; + this.treeBaseDuration = 0; + } + { + this._debugSource = null; + this._debugOwner = null; + this._debugNeedsRemount = false; + this._debugHookTypes = null; + if (!hasBadMapPolyfill && typeof Object.preventExtensions === "function") { + Object.preventExtensions(this); + } + } + } + var createFiber = function(tag, pendingProps, key, mode) { + return new FiberNode(tag, pendingProps, key, mode); + }; + function shouldConstruct$1(Component) { + var prototype = Component.prototype; + return !!(prototype && prototype.isReactComponent); + } + function isSimpleFunctionComponent(type) { + return typeof type === "function" && !shouldConstruct$1(type) && type.defaultProps === void 0; + } + function resolveLazyComponentTag(Component) { + if (typeof Component === "function") { + return shouldConstruct$1(Component) ? ClassComponent : FunctionComponent; + } else if (Component !== void 0 && Component !== null) { + var $$typeof = Component.$$typeof; + if ($$typeof === REACT_FORWARD_REF_TYPE) { + return ForwardRef; + } + if ($$typeof === REACT_MEMO_TYPE) { + return MemoComponent; + } + } + return IndeterminateComponent; + } + function createWorkInProgress(current2, pendingProps) { + var workInProgress2 = current2.alternate; + if (workInProgress2 === null) { + workInProgress2 = createFiber(current2.tag, pendingProps, current2.key, current2.mode); + workInProgress2.elementType = current2.elementType; + workInProgress2.type = current2.type; + workInProgress2.stateNode = current2.stateNode; + { + workInProgress2._debugSource = current2._debugSource; + workInProgress2._debugOwner = current2._debugOwner; + workInProgress2._debugHookTypes = current2._debugHookTypes; + } + workInProgress2.alternate = current2; + current2.alternate = workInProgress2; + } else { + workInProgress2.pendingProps = pendingProps; + workInProgress2.type = current2.type; + workInProgress2.flags = NoFlags; + workInProgress2.subtreeFlags = NoFlags; + workInProgress2.deletions = null; + { + workInProgress2.actualDuration = 0; + workInProgress2.actualStartTime = -1; + } + } + workInProgress2.flags = current2.flags & StaticMask; + workInProgress2.childLanes = current2.childLanes; + workInProgress2.lanes = current2.lanes; + workInProgress2.child = current2.child; + workInProgress2.memoizedProps = current2.memoizedProps; + workInProgress2.memoizedState = current2.memoizedState; + workInProgress2.updateQueue = current2.updateQueue; + var currentDependencies = current2.dependencies; + workInProgress2.dependencies = currentDependencies === null ? null : { + lanes: currentDependencies.lanes, + firstContext: currentDependencies.firstContext + }; + workInProgress2.sibling = current2.sibling; + workInProgress2.index = current2.index; + workInProgress2.ref = current2.ref; + { + workInProgress2.selfBaseDuration = current2.selfBaseDuration; + workInProgress2.treeBaseDuration = current2.treeBaseDuration; + } + { + workInProgress2._debugNeedsRemount = current2._debugNeedsRemount; + switch (workInProgress2.tag) { + case IndeterminateComponent: + case FunctionComponent: + case SimpleMemoComponent: + workInProgress2.type = resolveFunctionForHotReloading(current2.type); + break; + case ClassComponent: + workInProgress2.type = resolveClassForHotReloading(current2.type); + break; + case ForwardRef: + workInProgress2.type = resolveForwardRefForHotReloading(current2.type); + break; + } + } + return workInProgress2; + } + function resetWorkInProgress(workInProgress2, renderLanes2) { + workInProgress2.flags &= StaticMask | Placement; + var current2 = workInProgress2.alternate; + if (current2 === null) { + workInProgress2.childLanes = NoLanes; + workInProgress2.lanes = renderLanes2; + workInProgress2.child = null; + workInProgress2.subtreeFlags = NoFlags; + workInProgress2.memoizedProps = null; + workInProgress2.memoizedState = null; + workInProgress2.updateQueue = null; + workInProgress2.dependencies = null; + workInProgress2.stateNode = null; + { + workInProgress2.selfBaseDuration = 0; + workInProgress2.treeBaseDuration = 0; + } + } else { + workInProgress2.childLanes = current2.childLanes; + workInProgress2.lanes = current2.lanes; + workInProgress2.child = current2.child; + workInProgress2.subtreeFlags = NoFlags; + workInProgress2.deletions = null; + workInProgress2.memoizedProps = current2.memoizedProps; + workInProgress2.memoizedState = current2.memoizedState; + workInProgress2.updateQueue = current2.updateQueue; + workInProgress2.type = current2.type; + var currentDependencies = current2.dependencies; + workInProgress2.dependencies = currentDependencies === null ? null : { + lanes: currentDependencies.lanes, + firstContext: currentDependencies.firstContext + }; + { + workInProgress2.selfBaseDuration = current2.selfBaseDuration; + workInProgress2.treeBaseDuration = current2.treeBaseDuration; + } + } + return workInProgress2; + } + function createHostRootFiber(tag, isStrictMode, concurrentUpdatesByDefaultOverride) { + var mode; + if (tag === ConcurrentRoot) { + mode = ConcurrentMode; + if (isStrictMode === true) { + mode |= StrictLegacyMode; + { + mode |= StrictEffectsMode; + } + } + } else { + mode = NoMode; + } + if (isDevToolsPresent) { + mode |= ProfileMode; + } + return createFiber(HostRoot, null, null, mode); + } + function createFiberFromTypeAndProps(type, key, pendingProps, owner, mode, lanes) { + var fiberTag = IndeterminateComponent; + var resolvedType = type; + if (typeof type === "function") { + if (shouldConstruct$1(type)) { + fiberTag = ClassComponent; + { + resolvedType = resolveClassForHotReloading(resolvedType); + } + } else { + { + resolvedType = resolveFunctionForHotReloading(resolvedType); + } + } + } else if (typeof type === "string") { + fiberTag = HostComponent; + } else { + getTag: + switch (type) { + case REACT_FRAGMENT_TYPE: + return createFiberFromFragment(pendingProps.children, mode, lanes, key); + case REACT_STRICT_MODE_TYPE: + fiberTag = Mode; + mode |= StrictLegacyMode; + if ((mode & ConcurrentMode) !== NoMode) { + mode |= StrictEffectsMode; + } + break; + case REACT_PROFILER_TYPE: + return createFiberFromProfiler(pendingProps, mode, lanes, key); + case REACT_SUSPENSE_TYPE: + return createFiberFromSuspense(pendingProps, mode, lanes, key); + case REACT_SUSPENSE_LIST_TYPE: + return createFiberFromSuspenseList(pendingProps, mode, lanes, key); + case REACT_OFFSCREEN_TYPE: + return createFiberFromOffscreen(pendingProps, mode, lanes, key); + case REACT_LEGACY_HIDDEN_TYPE: + case REACT_SCOPE_TYPE: + case REACT_CACHE_TYPE: + case REACT_TRACING_MARKER_TYPE: + case REACT_DEBUG_TRACING_MODE_TYPE: + default: { + if (typeof type === "object" && type !== null) { + switch (type.$$typeof) { + case REACT_PROVIDER_TYPE: + fiberTag = ContextProvider; + break getTag; + case REACT_CONTEXT_TYPE: + fiberTag = ContextConsumer; + break getTag; + case REACT_FORWARD_REF_TYPE: + fiberTag = ForwardRef; + { + resolvedType = resolveForwardRefForHotReloading(resolvedType); + } + break getTag; + case REACT_MEMO_TYPE: + fiberTag = MemoComponent; + break getTag; + case REACT_LAZY_TYPE: + fiberTag = LazyComponent; + resolvedType = null; + break getTag; + } + } + var info = ""; + { + if (type === void 0 || typeof type === "object" && type !== null && Object.keys(type).length === 0) { + info += " You likely forgot to export your component from the file it's defined in, or you might have mixed up default and named imports."; + } + var ownerName = owner ? getComponentNameFromFiber(owner) : null; + if (ownerName) { + info += "\n\nCheck the render method of `" + ownerName + "`."; + } + } + throw new Error("Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) " + ("but got: " + (type == null ? type : typeof type) + "." + info)); + } + } + } + var fiber = createFiber(fiberTag, pendingProps, key, mode); + fiber.elementType = type; + fiber.type = resolvedType; + fiber.lanes = lanes; + { + fiber._debugOwner = owner; + } + return fiber; + } + function createFiberFromElement(element, mode, lanes) { + var owner = null; + { + owner = element._owner; + } + var type = element.type; + var key = element.key; + var pendingProps = element.props; + var fiber = createFiberFromTypeAndProps(type, key, pendingProps, owner, mode, lanes); + { + fiber._debugSource = element._source; + fiber._debugOwner = element._owner; + } + return fiber; + } + function createFiberFromFragment(elements, mode, lanes, key) { + var fiber = createFiber(Fragment, elements, key, mode); + fiber.lanes = lanes; + return fiber; + } + function createFiberFromProfiler(pendingProps, mode, lanes, key) { + { + if (typeof pendingProps.id !== "string") { + error('Profiler must specify an "id" of type `string` as a prop. Received the type `%s` instead.', typeof pendingProps.id); + } + } + var fiber = createFiber(Profiler, pendingProps, key, mode | ProfileMode); + fiber.elementType = REACT_PROFILER_TYPE; + fiber.lanes = lanes; + { + fiber.stateNode = { + effectDuration: 0, + passiveEffectDuration: 0 + }; + } + return fiber; + } + function createFiberFromSuspense(pendingProps, mode, lanes, key) { + var fiber = createFiber(SuspenseComponent, pendingProps, key, mode); + fiber.elementType = REACT_SUSPENSE_TYPE; + fiber.lanes = lanes; + return fiber; + } + function createFiberFromSuspenseList(pendingProps, mode, lanes, key) { + var fiber = createFiber(SuspenseListComponent, pendingProps, key, mode); + fiber.elementType = REACT_SUSPENSE_LIST_TYPE; + fiber.lanes = lanes; + return fiber; + } + function createFiberFromOffscreen(pendingProps, mode, lanes, key) { + var fiber = createFiber(OffscreenComponent, pendingProps, key, mode); + fiber.elementType = REACT_OFFSCREEN_TYPE; + fiber.lanes = lanes; + var primaryChildInstance = { + isHidden: false + }; + fiber.stateNode = primaryChildInstance; + return fiber; + } + function createFiberFromText(content, mode, lanes) { + var fiber = createFiber(HostText, content, null, mode); + fiber.lanes = lanes; + return fiber; + } + function createFiberFromHostInstanceForDeletion() { + var fiber = createFiber(HostComponent, null, null, NoMode); + fiber.elementType = "DELETED"; + return fiber; + } + function createFiberFromDehydratedFragment(dehydratedNode) { + var fiber = createFiber(DehydratedFragment, null, null, NoMode); + fiber.stateNode = dehydratedNode; + return fiber; + } + function createFiberFromPortal(portal, mode, lanes) { + var pendingProps = portal.children !== null ? portal.children : []; + var fiber = createFiber(HostPortal, pendingProps, portal.key, mode); + fiber.lanes = lanes; + fiber.stateNode = { + containerInfo: portal.containerInfo, + pendingChildren: null, + // Used by persistent updates + implementation: portal.implementation + }; + return fiber; + } + function assignFiberPropertiesInDEV(target, source) { + if (target === null) { + target = createFiber(IndeterminateComponent, null, null, NoMode); + } + target.tag = source.tag; + target.key = source.key; + target.elementType = source.elementType; + target.type = source.type; + target.stateNode = source.stateNode; + target.return = source.return; + target.child = source.child; + target.sibling = source.sibling; + target.index = source.index; + target.ref = source.ref; + target.pendingProps = source.pendingProps; + target.memoizedProps = source.memoizedProps; + target.updateQueue = source.updateQueue; + target.memoizedState = source.memoizedState; + target.dependencies = source.dependencies; + target.mode = source.mode; + target.flags = source.flags; + target.subtreeFlags = source.subtreeFlags; + target.deletions = source.deletions; + target.lanes = source.lanes; + target.childLanes = source.childLanes; + target.alternate = source.alternate; + { + target.actualDuration = source.actualDuration; + target.actualStartTime = source.actualStartTime; + target.selfBaseDuration = source.selfBaseDuration; + target.treeBaseDuration = source.treeBaseDuration; + } + target._debugSource = source._debugSource; + target._debugOwner = source._debugOwner; + target._debugNeedsRemount = source._debugNeedsRemount; + target._debugHookTypes = source._debugHookTypes; + return target; + } + function FiberRootNode(containerInfo, tag, hydrate, identifierPrefix, onRecoverableError) { + this.tag = tag; + this.containerInfo = containerInfo; + this.pendingChildren = null; + this.current = null; + this.pingCache = null; + this.finishedWork = null; + this.timeoutHandle = noTimeout; + this.context = null; + this.pendingContext = null; + this.callbackNode = null; + this.callbackPriority = NoLane; + this.eventTimes = createLaneMap(NoLanes); + this.expirationTimes = createLaneMap(NoTimestamp); + this.pendingLanes = NoLanes; + this.suspendedLanes = NoLanes; + this.pingedLanes = NoLanes; + this.expiredLanes = NoLanes; + this.mutableReadLanes = NoLanes; + this.finishedLanes = NoLanes; + this.entangledLanes = NoLanes; + this.entanglements = createLaneMap(NoLanes); + this.identifierPrefix = identifierPrefix; + this.onRecoverableError = onRecoverableError; + if (supportsHydration) { + this.mutableSourceEagerHydrationData = null; + } + { + this.effectDuration = 0; + this.passiveEffectDuration = 0; + } + { + this.memoizedUpdaters = /* @__PURE__ */ new Set(); + var pendingUpdatersLaneMap = this.pendingUpdatersLaneMap = []; + for (var _i = 0; _i < TotalLanes; _i++) { + pendingUpdatersLaneMap.push(/* @__PURE__ */ new Set()); + } + } + { + switch (tag) { + case ConcurrentRoot: + this._debugRootType = hydrate ? "hydrateRoot()" : "createRoot()"; + break; + case LegacyRoot: + this._debugRootType = hydrate ? "hydrate()" : "render()"; + break; + } + } + } + function createFiberRoot(containerInfo, tag, hydrate, initialChildren, hydrationCallbacks, isStrictMode, concurrentUpdatesByDefaultOverride, identifierPrefix, onRecoverableError, transitionCallbacks) { + var root = new FiberRootNode(containerInfo, tag, hydrate, identifierPrefix, onRecoverableError); + var uninitializedFiber = createHostRootFiber(tag, isStrictMode); + root.current = uninitializedFiber; + uninitializedFiber.stateNode = root; + { + var _initialState = { + element: initialChildren, + isDehydrated: hydrate, + cache: null, + // not enabled yet + transitions: null, + pendingSuspenseBoundaries: null + }; + uninitializedFiber.memoizedState = _initialState; + } + initializeUpdateQueue(uninitializedFiber); + return root; + } + var ReactVersion = "18.2.0"; + function createPortal(children, containerInfo, implementation) { + var key = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : null; + { + checkKeyStringCoercion(key); + } + return { + // This tag allow us to uniquely identify this as a React Portal + $$typeof: REACT_PORTAL_TYPE, + key: key == null ? null : "" + key, + children, + containerInfo, + implementation + }; + } + var didWarnAboutNestedUpdates; + var didWarnAboutFindNodeInStrictMode; + { + didWarnAboutNestedUpdates = false; + didWarnAboutFindNodeInStrictMode = {}; + } + function getContextForSubtree(parentComponent) { + if (!parentComponent) { + return emptyContextObject; + } + var fiber = get(parentComponent); + var parentContext = findCurrentUnmaskedContext(fiber); + if (fiber.tag === ClassComponent) { + var Component = fiber.type; + if (isContextProvider(Component)) { + return processChildContext(fiber, Component, parentContext); + } + } + return parentContext; + } + function findHostInstance(component) { + var fiber = get(component); + if (fiber === void 0) { + if (typeof component.render === "function") { + throw new Error("Unable to find node on an unmounted component."); + } else { + var keys = Object.keys(component).join(","); + throw new Error("Argument appears to not be a ReactComponent. Keys: " + keys); + } + } + var hostFiber = findCurrentHostFiber(fiber); + if (hostFiber === null) { + return null; + } + return hostFiber.stateNode; + } + function findHostInstanceWithWarning(component, methodName) { + { + var fiber = get(component); + if (fiber === void 0) { + if (typeof component.render === "function") { + throw new Error("Unable to find node on an unmounted component."); + } else { + var keys = Object.keys(component).join(","); + throw new Error("Argument appears to not be a ReactComponent. Keys: " + keys); + } + } + var hostFiber = findCurrentHostFiber(fiber); + if (hostFiber === null) { + return null; + } + if (hostFiber.mode & StrictLegacyMode) { + var componentName = getComponentNameFromFiber(fiber) || "Component"; + if (!didWarnAboutFindNodeInStrictMode[componentName]) { + didWarnAboutFindNodeInStrictMode[componentName] = true; + var previousFiber = current; + try { + setCurrentFiber(hostFiber); + if (fiber.mode & StrictLegacyMode) { + error("%s is deprecated in StrictMode. %s was passed an instance of %s which is inside StrictMode. Instead, add a ref directly to the element you want to reference. Learn more about using refs safely here: https://reactjs.org/link/strict-mode-find-node", methodName, methodName, componentName); + } else { + error("%s is deprecated in StrictMode. %s was passed an instance of %s which renders StrictMode children. Instead, add a ref directly to the element you want to reference. Learn more about using refs safely here: https://reactjs.org/link/strict-mode-find-node", methodName, methodName, componentName); + } + } finally { + if (previousFiber) { + setCurrentFiber(previousFiber); + } else { + resetCurrentFiber(); + } + } + } + } + return hostFiber.stateNode; + } + } + function createContainer(containerInfo, tag, hydrationCallbacks, isStrictMode, concurrentUpdatesByDefaultOverride, identifierPrefix, onRecoverableError, transitionCallbacks) { + var hydrate = false; + var initialChildren = null; + return createFiberRoot(containerInfo, tag, hydrate, initialChildren, hydrationCallbacks, isStrictMode, concurrentUpdatesByDefaultOverride, identifierPrefix, onRecoverableError); + } + function createHydrationContainer(initialChildren, callback, containerInfo, tag, hydrationCallbacks, isStrictMode, concurrentUpdatesByDefaultOverride, identifierPrefix, onRecoverableError, transitionCallbacks) { + var hydrate = true; + var root = createFiberRoot(containerInfo, tag, hydrate, initialChildren, hydrationCallbacks, isStrictMode, concurrentUpdatesByDefaultOverride, identifierPrefix, onRecoverableError); + root.context = getContextForSubtree(null); + var current2 = root.current; + var eventTime = requestEventTime(); + var lane = requestUpdateLane(current2); + var update = createUpdate(eventTime, lane); + update.callback = callback !== void 0 && callback !== null ? callback : null; + enqueueUpdate(current2, update, lane); + scheduleInitialHydrationOnRoot(root, lane, eventTime); + return root; + } + function updateContainer(element, container, parentComponent, callback) { + { + onScheduleRoot(container, element); + } + var current$1 = container.current; + var eventTime = requestEventTime(); + var lane = requestUpdateLane(current$1); + { + markRenderScheduled(lane); + } + var context = getContextForSubtree(parentComponent); + if (container.context === null) { + container.context = context; + } else { + container.pendingContext = context; + } + { + if (isRendering && current !== null && !didWarnAboutNestedUpdates) { + didWarnAboutNestedUpdates = true; + error("Render methods should be a pure function of props and state; triggering nested component updates from render is not allowed. If necessary, trigger nested updates in componentDidUpdate.\n\nCheck the render method of %s.", getComponentNameFromFiber(current) || "Unknown"); + } + } + var update = createUpdate(eventTime, lane); + update.payload = { + element + }; + callback = callback === void 0 ? null : callback; + if (callback !== null) { + { + if (typeof callback !== "function") { + error("render(...): Expected the last optional `callback` argument to be a function. Instead received: %s.", callback); + } + } + update.callback = callback; + } + var root = enqueueUpdate(current$1, update, lane); + if (root !== null) { + scheduleUpdateOnFiber(root, current$1, lane, eventTime); + entangleTransitions(root, current$1, lane); + } + return lane; + } + function getPublicRootInstance(container) { + var containerFiber = container.current; + if (!containerFiber.child) { + return null; + } + switch (containerFiber.child.tag) { + case HostComponent: + return getPublicInstance(containerFiber.child.stateNode); + default: + return containerFiber.child.stateNode; + } + } + function attemptSynchronousHydration(fiber) { + switch (fiber.tag) { + case HostRoot: { + var root = fiber.stateNode; + if (isRootDehydrated(root)) { + var lanes = getHighestPriorityPendingLanes(root); + flushRoot(root, lanes); + } + break; + } + case SuspenseComponent: { + flushSync(function() { + var root2 = enqueueConcurrentRenderForLane(fiber, SyncLane); + if (root2 !== null) { + var eventTime = requestEventTime(); + scheduleUpdateOnFiber(root2, fiber, SyncLane, eventTime); + } + }); + var retryLane = SyncLane; + markRetryLaneIfNotHydrated(fiber, retryLane); + break; + } + } + } + function markRetryLaneImpl(fiber, retryLane) { + var suspenseState = fiber.memoizedState; + if (suspenseState !== null && suspenseState.dehydrated !== null) { + suspenseState.retryLane = higherPriorityLane(suspenseState.retryLane, retryLane); + } + } + function markRetryLaneIfNotHydrated(fiber, retryLane) { + markRetryLaneImpl(fiber, retryLane); + var alternate = fiber.alternate; + if (alternate) { + markRetryLaneImpl(alternate, retryLane); + } + } + function attemptDiscreteHydration(fiber) { + if (fiber.tag !== SuspenseComponent) { + return; + } + var lane = SyncLane; + var root = enqueueConcurrentRenderForLane(fiber, lane); + if (root !== null) { + var eventTime = requestEventTime(); + scheduleUpdateOnFiber(root, fiber, lane, eventTime); + } + markRetryLaneIfNotHydrated(fiber, lane); + } + function attemptContinuousHydration(fiber) { + if (fiber.tag !== SuspenseComponent) { + return; + } + var lane = SelectiveHydrationLane; + var root = enqueueConcurrentRenderForLane(fiber, lane); + if (root !== null) { + var eventTime = requestEventTime(); + scheduleUpdateOnFiber(root, fiber, lane, eventTime); + } + markRetryLaneIfNotHydrated(fiber, lane); + } + function attemptHydrationAtCurrentPriority(fiber) { + if (fiber.tag !== SuspenseComponent) { + return; + } + var lane = requestUpdateLane(fiber); + var root = enqueueConcurrentRenderForLane(fiber, lane); + if (root !== null) { + var eventTime = requestEventTime(); + scheduleUpdateOnFiber(root, fiber, lane, eventTime); + } + markRetryLaneIfNotHydrated(fiber, lane); + } + function findHostInstanceWithNoPortals(fiber) { + var hostFiber = findCurrentHostFiberWithNoPortals(fiber); + if (hostFiber === null) { + return null; + } + return hostFiber.stateNode; + } + var shouldErrorImpl = function(fiber) { + return null; + }; + function shouldError(fiber) { + return shouldErrorImpl(fiber); + } + var shouldSuspendImpl = function(fiber) { + return false; + }; + function shouldSuspend(fiber) { + return shouldSuspendImpl(fiber); + } + var overrideHookState = null; + var overrideHookStateDeletePath = null; + var overrideHookStateRenamePath = null; + var overrideProps = null; + var overridePropsDeletePath = null; + var overridePropsRenamePath = null; + var scheduleUpdate = null; + var setErrorHandler = null; + var setSuspenseHandler = null; + { + var copyWithDeleteImpl = function(obj, path, index2) { + var key = path[index2]; + var updated = isArray(obj) ? obj.slice() : assign({}, obj); + if (index2 + 1 === path.length) { + if (isArray(updated)) { + updated.splice(key, 1); + } else { + delete updated[key]; + } + return updated; + } + updated[key] = copyWithDeleteImpl(obj[key], path, index2 + 1); + return updated; + }; + var copyWithDelete = function(obj, path) { + return copyWithDeleteImpl(obj, path, 0); + }; + var copyWithRenameImpl = function(obj, oldPath, newPath, index2) { + var oldKey = oldPath[index2]; + var updated = isArray(obj) ? obj.slice() : assign({}, obj); + if (index2 + 1 === oldPath.length) { + var newKey = newPath[index2]; + updated[newKey] = updated[oldKey]; + if (isArray(updated)) { + updated.splice(oldKey, 1); + } else { + delete updated[oldKey]; + } + } else { + updated[oldKey] = copyWithRenameImpl( + // $FlowFixMe number or string is fine here + obj[oldKey], + oldPath, + newPath, + index2 + 1 + ); + } + return updated; + }; + var copyWithRename = function(obj, oldPath, newPath) { + if (oldPath.length !== newPath.length) { + warn("copyWithRename() expects paths of the same length"); + return; + } else { + for (var i = 0; i < newPath.length - 1; i++) { + if (oldPath[i] !== newPath[i]) { + warn("copyWithRename() expects paths to be the same except for the deepest key"); + return; + } + } + } + return copyWithRenameImpl(obj, oldPath, newPath, 0); + }; + var copyWithSetImpl = function(obj, path, index2, value) { + if (index2 >= path.length) { + return value; + } + var key = path[index2]; + var updated = isArray(obj) ? obj.slice() : assign({}, obj); + updated[key] = copyWithSetImpl(obj[key], path, index2 + 1, value); + return updated; + }; + var copyWithSet = function(obj, path, value) { + return copyWithSetImpl(obj, path, 0, value); + }; + var findHook = function(fiber, id) { + var currentHook2 = fiber.memoizedState; + while (currentHook2 !== null && id > 0) { + currentHook2 = currentHook2.next; + id--; + } + return currentHook2; + }; + overrideHookState = function(fiber, id, path, value) { + var hook = findHook(fiber, id); + if (hook !== null) { + var newState = copyWithSet(hook.memoizedState, path, value); + hook.memoizedState = newState; + hook.baseState = newState; + fiber.memoizedProps = assign({}, fiber.memoizedProps); + var root = enqueueConcurrentRenderForLane(fiber, SyncLane); + if (root !== null) { + scheduleUpdateOnFiber(root, fiber, SyncLane, NoTimestamp); + } + } + }; + overrideHookStateDeletePath = function(fiber, id, path) { + var hook = findHook(fiber, id); + if (hook !== null) { + var newState = copyWithDelete(hook.memoizedState, path); + hook.memoizedState = newState; + hook.baseState = newState; + fiber.memoizedProps = assign({}, fiber.memoizedProps); + var root = enqueueConcurrentRenderForLane(fiber, SyncLane); + if (root !== null) { + scheduleUpdateOnFiber(root, fiber, SyncLane, NoTimestamp); + } + } + }; + overrideHookStateRenamePath = function(fiber, id, oldPath, newPath) { + var hook = findHook(fiber, id); + if (hook !== null) { + var newState = copyWithRename(hook.memoizedState, oldPath, newPath); + hook.memoizedState = newState; + hook.baseState = newState; + fiber.memoizedProps = assign({}, fiber.memoizedProps); + var root = enqueueConcurrentRenderForLane(fiber, SyncLane); + if (root !== null) { + scheduleUpdateOnFiber(root, fiber, SyncLane, NoTimestamp); + } + } + }; + overrideProps = function(fiber, path, value) { + fiber.pendingProps = copyWithSet(fiber.memoizedProps, path, value); + if (fiber.alternate) { + fiber.alternate.pendingProps = fiber.pendingProps; + } + var root = enqueueConcurrentRenderForLane(fiber, SyncLane); + if (root !== null) { + scheduleUpdateOnFiber(root, fiber, SyncLane, NoTimestamp); + } + }; + overridePropsDeletePath = function(fiber, path) { + fiber.pendingProps = copyWithDelete(fiber.memoizedProps, path); + if (fiber.alternate) { + fiber.alternate.pendingProps = fiber.pendingProps; + } + var root = enqueueConcurrentRenderForLane(fiber, SyncLane); + if (root !== null) { + scheduleUpdateOnFiber(root, fiber, SyncLane, NoTimestamp); + } + }; + overridePropsRenamePath = function(fiber, oldPath, newPath) { + fiber.pendingProps = copyWithRename(fiber.memoizedProps, oldPath, newPath); + if (fiber.alternate) { + fiber.alternate.pendingProps = fiber.pendingProps; + } + var root = enqueueConcurrentRenderForLane(fiber, SyncLane); + if (root !== null) { + scheduleUpdateOnFiber(root, fiber, SyncLane, NoTimestamp); + } + }; + scheduleUpdate = function(fiber) { + var root = enqueueConcurrentRenderForLane(fiber, SyncLane); + if (root !== null) { + scheduleUpdateOnFiber(root, fiber, SyncLane, NoTimestamp); + } + }; + setErrorHandler = function(newShouldErrorImpl) { + shouldErrorImpl = newShouldErrorImpl; + }; + setSuspenseHandler = function(newShouldSuspendImpl) { + shouldSuspendImpl = newShouldSuspendImpl; + }; + } + function findHostInstanceByFiber(fiber) { + var hostFiber = findCurrentHostFiber(fiber); + if (hostFiber === null) { + return null; + } + return hostFiber.stateNode; + } + function emptyFindFiberByHostInstance(instance) { + return null; + } + function getCurrentFiberForDevTools() { + return current; + } + function injectIntoDevTools(devToolsConfig) { + var findFiberByHostInstance = devToolsConfig.findFiberByHostInstance; + var ReactCurrentDispatcher2 = ReactSharedInternals.ReactCurrentDispatcher; + return injectInternals({ + bundleType: devToolsConfig.bundleType, + version: devToolsConfig.version, + rendererPackageName: devToolsConfig.rendererPackageName, + rendererConfig: devToolsConfig.rendererConfig, + overrideHookState, + overrideHookStateDeletePath, + overrideHookStateRenamePath, + overrideProps, + overridePropsDeletePath, + overridePropsRenamePath, + setErrorHandler, + setSuspenseHandler, + scheduleUpdate, + currentDispatcherRef: ReactCurrentDispatcher2, + findHostInstanceByFiber, + findFiberByHostInstance: findFiberByHostInstance || emptyFindFiberByHostInstance, + // React Refresh + findHostInstancesForRefresh, + scheduleRefresh, + scheduleRoot, + setRefreshHandler, + // Enables DevTools to append owner stacks to error messages in DEV mode. + getCurrentFiber: getCurrentFiberForDevTools, + // Enables DevTools to detect reconciler version rather than renderer version + // which may not match for third party renderers. + reconcilerVersion: ReactVersion + }); + } + exports3.attemptContinuousHydration = attemptContinuousHydration; + exports3.attemptDiscreteHydration = attemptDiscreteHydration; + exports3.attemptHydrationAtCurrentPriority = attemptHydrationAtCurrentPriority; + exports3.attemptSynchronousHydration = attemptSynchronousHydration; + exports3.batchedUpdates = batchedUpdates; + exports3.createComponentSelector = createComponentSelector; + exports3.createContainer = createContainer; + exports3.createHasPseudoClassSelector = createHasPseudoClassSelector; + exports3.createHydrationContainer = createHydrationContainer; + exports3.createPortal = createPortal; + exports3.createRoleSelector = createRoleSelector; + exports3.createTestNameSelector = createTestNameSelector; + exports3.createTextSelector = createTextSelector; + exports3.deferredUpdates = deferredUpdates; + exports3.discreteUpdates = discreteUpdates; + exports3.findAllNodes = findAllNodes; + exports3.findBoundingRects = findBoundingRects; + exports3.findHostInstance = findHostInstance; + exports3.findHostInstanceWithNoPortals = findHostInstanceWithNoPortals; + exports3.findHostInstanceWithWarning = findHostInstanceWithWarning; + exports3.flushControlled = flushControlled; + exports3.flushPassiveEffects = flushPassiveEffects; + exports3.flushSync = flushSync; + exports3.focusWithin = focusWithin; + exports3.getCurrentUpdatePriority = getCurrentUpdatePriority; + exports3.getFindAllNodesFailureDescription = getFindAllNodesFailureDescription; + exports3.getPublicRootInstance = getPublicRootInstance; + exports3.injectIntoDevTools = injectIntoDevTools; + exports3.isAlreadyRendering = isAlreadyRendering; + exports3.observeVisibleRects = observeVisibleRects; + exports3.registerMutableSourceForHydration = registerMutableSourceForHydration; + exports3.runWithPriority = runWithPriority; + exports3.shouldError = shouldError; + exports3.shouldSuspend = shouldSuspend; + exports3.updateContainer = updateContainer; + return exports3; + }; + } + } +}); + +// node_modules/react-reconciler/index.js +var require_react_reconciler = __commonJS({ + "node_modules/react-reconciler/index.js"(exports2, module2) { + "use strict"; + if (false) { + module2.exports = null; + } else { + module2.exports = require_react_reconciler_development(); + } + } +}); + +// src/index.ts.entry-point.ts +var index_ts_entry_point_exports = {}; +__export(index_ts_entry_point_exports, { + main: () => main, + onStart: () => onStart, + onUpdate: () => onUpdate, + rendererTransport: () => rendererTransport +}); +module.exports = __toCommonJS(index_ts_entry_point_exports); + +// node_modules/@dcl/ecs/dist/components/generated/pb/decentraland/sdk/components/animator.gen.js +var import_minimal = __toESM(require_minimal2()); +function createBasePBAnimator() { + return { states: [] }; +} +var PBAnimator; +(function(PBAnimator2) { + function encode(message, writer = import_minimal.default.Writer.create()) { + for (const v of message.states) { + PBAnimationState.encode(v, writer.uint32(10).fork()).ldelim(); + } + return writer; + } + PBAnimator2.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal.default.Reader ? input : import_minimal.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBasePBAnimator(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + message.states.push(PBAnimationState.decode(reader, reader.uint32())); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + PBAnimator2.decode = decode; +})(PBAnimator || (PBAnimator = {})); +function createBasePBAnimationState() { + return { clip: "", playing: void 0, weight: void 0, speed: void 0, loop: void 0, shouldReset: void 0 }; +} +var PBAnimationState; +(function(PBAnimationState2) { + function encode(message, writer = import_minimal.default.Writer.create()) { + if (message.clip !== "") { + writer.uint32(18).string(message.clip); + } + if (message.playing !== void 0) { + writer.uint32(24).bool(message.playing); + } + if (message.weight !== void 0) { + writer.uint32(37).float(message.weight); + } + if (message.speed !== void 0) { + writer.uint32(45).float(message.speed); + } + if (message.loop !== void 0) { + writer.uint32(48).bool(message.loop); + } + if (message.shouldReset !== void 0) { + writer.uint32(56).bool(message.shouldReset); + } + return writer; + } + PBAnimationState2.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal.default.Reader ? input : import_minimal.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBasePBAnimationState(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 2: + if (tag !== 18) { + break; + } + message.clip = reader.string(); + continue; + case 3: + if (tag !== 24) { + break; + } + message.playing = reader.bool(); + continue; + case 4: + if (tag !== 37) { + break; + } + message.weight = reader.float(); + continue; + case 5: + if (tag !== 45) { + break; + } + message.speed = reader.float(); + continue; + case 6: + if (tag !== 48) { + break; + } + message.loop = reader.bool(); + continue; + case 7: + if (tag !== 56) { + break; + } + message.shouldReset = reader.bool(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + PBAnimationState2.decode = decode; +})(PBAnimationState || (PBAnimationState = {})); + +// node_modules/@dcl/ecs/dist/components/generated/Animator.gen.js +var AnimatorSchema = { + COMPONENT_ID: 1042, + serialize(value, builder) { + const writer = PBAnimator.encode(value); + const buffer = new Uint8Array(writer.finish(), 0, writer.len); + builder.writeBuffer(buffer, false); + }, + deserialize(reader) { + return PBAnimator.decode(reader.buffer(), reader.remainingBytes()); + }, + create() { + return PBAnimator.decode(new Uint8Array()); + }, + jsonSchema: { + type: "object", + properties: {}, + serializationType: "protocol-buffer", + protocolBuffer: "PBAnimator" + } +}; + +// node_modules/@dcl/ecs/dist/components/generated/pb/decentraland/sdk/components/audio_source.gen.js +var import_minimal2 = __toESM(require_minimal2()); +function createBasePBAudioSource() { + return { playing: void 0, volume: void 0, loop: void 0, pitch: void 0, audioClipUrl: "" }; +} +var PBAudioSource; +(function(PBAudioSource2) { + function encode(message, writer = import_minimal2.default.Writer.create()) { + if (message.playing !== void 0) { + writer.uint32(8).bool(message.playing); + } + if (message.volume !== void 0) { + writer.uint32(21).float(message.volume); + } + if (message.loop !== void 0) { + writer.uint32(24).bool(message.loop); + } + if (message.pitch !== void 0) { + writer.uint32(37).float(message.pitch); + } + if (message.audioClipUrl !== "") { + writer.uint32(42).string(message.audioClipUrl); + } + return writer; + } + PBAudioSource2.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal2.default.Reader ? input : import_minimal2.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBasePBAudioSource(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 8) { + break; + } + message.playing = reader.bool(); + continue; + case 2: + if (tag !== 21) { + break; + } + message.volume = reader.float(); + continue; + case 3: + if (tag !== 24) { + break; + } + message.loop = reader.bool(); + continue; + case 4: + if (tag !== 37) { + break; + } + message.pitch = reader.float(); + continue; + case 5: + if (tag !== 42) { + break; + } + message.audioClipUrl = reader.string(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + PBAudioSource2.decode = decode; +})(PBAudioSource || (PBAudioSource = {})); + +// node_modules/@dcl/ecs/dist/components/generated/AudioSource.gen.js +var AudioSourceSchema = { + COMPONENT_ID: 1020, + serialize(value, builder) { + const writer = PBAudioSource.encode(value); + const buffer = new Uint8Array(writer.finish(), 0, writer.len); + builder.writeBuffer(buffer, false); + }, + deserialize(reader) { + return PBAudioSource.decode(reader.buffer(), reader.remainingBytes()); + }, + create() { + return PBAudioSource.decode(new Uint8Array()); + }, + jsonSchema: { + type: "object", + properties: {}, + serializationType: "protocol-buffer", + protocolBuffer: "PBAudioSource" + } +}; + +// node_modules/@dcl/ecs/dist/components/generated/pb/decentraland/sdk/components/audio_stream.gen.js +var import_minimal3 = __toESM(require_minimal2()); +function createBasePBAudioStream() { + return { playing: void 0, volume: void 0, url: "" }; +} +var PBAudioStream; +(function(PBAudioStream2) { + function encode(message, writer = import_minimal3.default.Writer.create()) { + if (message.playing !== void 0) { + writer.uint32(8).bool(message.playing); + } + if (message.volume !== void 0) { + writer.uint32(21).float(message.volume); + } + if (message.url !== "") { + writer.uint32(26).string(message.url); + } + return writer; + } + PBAudioStream2.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal3.default.Reader ? input : import_minimal3.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBasePBAudioStream(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 8) { + break; + } + message.playing = reader.bool(); + continue; + case 2: + if (tag !== 21) { + break; + } + message.volume = reader.float(); + continue; + case 3: + if (tag !== 26) { + break; + } + message.url = reader.string(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + PBAudioStream2.decode = decode; +})(PBAudioStream || (PBAudioStream = {})); + +// node_modules/@dcl/ecs/dist/components/generated/AudioStream.gen.js +var AudioStreamSchema = { + COMPONENT_ID: 1021, + serialize(value, builder) { + const writer = PBAudioStream.encode(value); + const buffer = new Uint8Array(writer.finish(), 0, writer.len); + builder.writeBuffer(buffer, false); + }, + deserialize(reader) { + return PBAudioStream.decode(reader.buffer(), reader.remainingBytes()); + }, + create() { + return PBAudioStream.decode(new Uint8Array()); + }, + jsonSchema: { + type: "object", + properties: {}, + serializationType: "protocol-buffer", + protocolBuffer: "PBAudioStream" + } +}; + +// node_modules/@dcl/ecs/dist/components/generated/pb/decentraland/sdk/components/avatar_attach.gen.js +var import_minimal4 = __toESM(require_minimal2()); +var AvatarAnchorPointType; +(function(AvatarAnchorPointType2) { + AvatarAnchorPointType2[AvatarAnchorPointType2["AAPT_POSITION"] = 0] = "AAPT_POSITION"; + AvatarAnchorPointType2[AvatarAnchorPointType2["AAPT_NAME_TAG"] = 1] = "AAPT_NAME_TAG"; + AvatarAnchorPointType2[AvatarAnchorPointType2["AAPT_LEFT_HAND"] = 2] = "AAPT_LEFT_HAND"; + AvatarAnchorPointType2[AvatarAnchorPointType2["AAPT_RIGHT_HAND"] = 3] = "AAPT_RIGHT_HAND"; +})(AvatarAnchorPointType || (AvatarAnchorPointType = {})); +function createBasePBAvatarAttach() { + return { avatarId: void 0, anchorPointId: 0 }; +} +var PBAvatarAttach; +(function(PBAvatarAttach2) { + function encode(message, writer = import_minimal4.default.Writer.create()) { + if (message.avatarId !== void 0) { + writer.uint32(10).string(message.avatarId); + } + if (message.anchorPointId !== 0) { + writer.uint32(16).int32(message.anchorPointId); + } + return writer; + } + PBAvatarAttach2.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal4.default.Reader ? input : import_minimal4.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBasePBAvatarAttach(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + message.avatarId = reader.string(); + continue; + case 2: + if (tag !== 16) { + break; + } + message.anchorPointId = reader.int32(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + PBAvatarAttach2.decode = decode; +})(PBAvatarAttach || (PBAvatarAttach = {})); + +// node_modules/@dcl/ecs/dist/components/generated/AvatarAttach.gen.js +var AvatarAttachSchema = { + COMPONENT_ID: 1073, + serialize(value, builder) { + const writer = PBAvatarAttach.encode(value); + const buffer = new Uint8Array(writer.finish(), 0, writer.len); + builder.writeBuffer(buffer, false); + }, + deserialize(reader) { + return PBAvatarAttach.decode(reader.buffer(), reader.remainingBytes()); + }, + create() { + return PBAvatarAttach.decode(new Uint8Array()); + }, + jsonSchema: { + type: "object", + properties: {}, + serializationType: "protocol-buffer", + protocolBuffer: "PBAvatarAttach" + } +}; + +// node_modules/@dcl/ecs/dist/components/generated/pb/decentraland/sdk/components/avatar_modifier_area.gen.js +var import_minimal6 = __toESM(require_minimal2()); + +// node_modules/@dcl/ecs/dist/components/generated/pb/decentraland/common/vectors.gen.js +var import_minimal5 = __toESM(require_minimal2()); +function createBasePosition() { + return { x: 0, y: 0, z: 0 }; +} +var Position; +(function(Position2) { + function encode(message, writer = import_minimal5.default.Writer.create()) { + if (message.x !== 0) { + writer.uint32(13).float(message.x); + } + if (message.y !== 0) { + writer.uint32(21).float(message.y); + } + if (message.z !== 0) { + writer.uint32(29).float(message.z); + } + return writer; + } + Position2.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal5.default.Reader ? input : import_minimal5.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBasePosition(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 13) { + break; + } + message.x = reader.float(); + continue; + case 2: + if (tag !== 21) { + break; + } + message.y = reader.float(); + continue; + case 3: + if (tag !== 29) { + break; + } + message.z = reader.float(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + Position2.decode = decode; +})(Position || (Position = {})); +function createBaseVector3() { + return { x: 0, y: 0, z: 0 }; +} +var Vector3; +(function(Vector33) { + function encode(message, writer = import_minimal5.default.Writer.create()) { + if (message.x !== 0) { + writer.uint32(13).float(message.x); + } + if (message.y !== 0) { + writer.uint32(21).float(message.y); + } + if (message.z !== 0) { + writer.uint32(29).float(message.z); + } + return writer; + } + Vector33.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal5.default.Reader ? input : import_minimal5.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBaseVector3(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 13) { + break; + } + message.x = reader.float(); + continue; + case 2: + if (tag !== 21) { + break; + } + message.y = reader.float(); + continue; + case 3: + if (tag !== 29) { + break; + } + message.z = reader.float(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + Vector33.decode = decode; +})(Vector3 || (Vector3 = {})); +function createBaseVector2() { + return { x: 0, y: 0 }; +} +var Vector2; +(function(Vector22) { + function encode(message, writer = import_minimal5.default.Writer.create()) { + if (message.x !== 0) { + writer.uint32(13).float(message.x); + } + if (message.y !== 0) { + writer.uint32(21).float(message.y); + } + return writer; + } + Vector22.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal5.default.Reader ? input : import_minimal5.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBaseVector2(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 13) { + break; + } + message.x = reader.float(); + continue; + case 2: + if (tag !== 21) { + break; + } + message.y = reader.float(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + Vector22.decode = decode; +})(Vector2 || (Vector2 = {})); +function createBaseQuaternion() { + return { x: 0, y: 0, z: 0, w: 0 }; +} +var Quaternion; +(function(Quaternion3) { + function encode(message, writer = import_minimal5.default.Writer.create()) { + if (message.x !== 0) { + writer.uint32(13).float(message.x); + } + if (message.y !== 0) { + writer.uint32(21).float(message.y); + } + if (message.z !== 0) { + writer.uint32(29).float(message.z); + } + if (message.w !== 0) { + writer.uint32(37).float(message.w); + } + return writer; + } + Quaternion3.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal5.default.Reader ? input : import_minimal5.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBaseQuaternion(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 13) { + break; + } + message.x = reader.float(); + continue; + case 2: + if (tag !== 21) { + break; + } + message.y = reader.float(); + continue; + case 3: + if (tag !== 29) { + break; + } + message.z = reader.float(); + continue; + case 4: + if (tag !== 37) { + break; + } + message.w = reader.float(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + Quaternion3.decode = decode; +})(Quaternion || (Quaternion = {})); + +// node_modules/@dcl/ecs/dist/components/generated/pb/decentraland/sdk/components/avatar_modifier_area.gen.js +var AvatarModifierType; +(function(AvatarModifierType2) { + AvatarModifierType2[AvatarModifierType2["AMT_HIDE_AVATARS"] = 0] = "AMT_HIDE_AVATARS"; + AvatarModifierType2[AvatarModifierType2["AMT_DISABLE_PASSPORTS"] = 1] = "AMT_DISABLE_PASSPORTS"; +})(AvatarModifierType || (AvatarModifierType = {})); +function createBasePBAvatarModifierArea() { + return { area: void 0, excludeIds: [], modifiers: [] }; +} +var PBAvatarModifierArea; +(function(PBAvatarModifierArea2) { + function encode(message, writer = import_minimal6.default.Writer.create()) { + if (message.area !== void 0) { + Vector3.encode(message.area, writer.uint32(10).fork()).ldelim(); + } + for (const v of message.excludeIds) { + writer.uint32(18).string(v); + } + writer.uint32(26).fork(); + for (const v of message.modifiers) { + writer.int32(v); + } + writer.ldelim(); + return writer; + } + PBAvatarModifierArea2.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal6.default.Reader ? input : import_minimal6.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBasePBAvatarModifierArea(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + message.area = Vector3.decode(reader, reader.uint32()); + continue; + case 2: + if (tag !== 18) { + break; + } + message.excludeIds.push(reader.string()); + continue; + case 3: + if (tag === 24) { + message.modifiers.push(reader.int32()); + continue; + } + if (tag === 26) { + const end2 = reader.uint32() + reader.pos; + while (reader.pos < end2) { + message.modifiers.push(reader.int32()); + } + continue; + } + break; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + PBAvatarModifierArea2.decode = decode; +})(PBAvatarModifierArea || (PBAvatarModifierArea = {})); + +// node_modules/@dcl/ecs/dist/components/generated/AvatarModifierArea.gen.js +var AvatarModifierAreaSchema = { + COMPONENT_ID: 1070, + serialize(value, builder) { + const writer = PBAvatarModifierArea.encode(value); + const buffer = new Uint8Array(writer.finish(), 0, writer.len); + builder.writeBuffer(buffer, false); + }, + deserialize(reader) { + return PBAvatarModifierArea.decode(reader.buffer(), reader.remainingBytes()); + }, + create() { + return PBAvatarModifierArea.decode(new Uint8Array()); + }, + jsonSchema: { + type: "object", + properties: {}, + serializationType: "protocol-buffer", + protocolBuffer: "PBAvatarModifierArea" + } +}; + +// node_modules/long/index.js +var wasm = null; +try { + wasm = new WebAssembly.Instance(new WebAssembly.Module(new Uint8Array([ + 0, + 97, + 115, + 109, + 1, + 0, + 0, + 0, + 1, + 13, + 2, + 96, + 0, + 1, + 127, + 96, + 4, + 127, + 127, + 127, + 127, + 1, + 127, + 3, + 7, + 6, + 0, + 1, + 1, + 1, + 1, + 1, + 6, + 6, + 1, + 127, + 1, + 65, + 0, + 11, + 7, + 50, + 6, + 3, + 109, + 117, + 108, + 0, + 1, + 5, + 100, + 105, + 118, + 95, + 115, + 0, + 2, + 5, + 100, + 105, + 118, + 95, + 117, + 0, + 3, + 5, + 114, + 101, + 109, + 95, + 115, + 0, + 4, + 5, + 114, + 101, + 109, + 95, + 117, + 0, + 5, + 8, + 103, + 101, + 116, + 95, + 104, + 105, + 103, + 104, + 0, + 0, + 10, + 191, + 1, + 6, + 4, + 0, + 35, + 0, + 11, + 36, + 1, + 1, + 126, + 32, + 0, + 173, + 32, + 1, + 173, + 66, + 32, + 134, + 132, + 32, + 2, + 173, + 32, + 3, + 173, + 66, + 32, + 134, + 132, + 126, + 34, + 4, + 66, + 32, + 135, + 167, + 36, + 0, + 32, + 4, + 167, + 11, + 36, + 1, + 1, + 126, + 32, + 0, + 173, + 32, + 1, + 173, + 66, + 32, + 134, + 132, + 32, + 2, + 173, + 32, + 3, + 173, + 66, + 32, + 134, + 132, + 127, + 34, + 4, + 66, + 32, + 135, + 167, + 36, + 0, + 32, + 4, + 167, + 11, + 36, + 1, + 1, + 126, + 32, + 0, + 173, + 32, + 1, + 173, + 66, + 32, + 134, + 132, + 32, + 2, + 173, + 32, + 3, + 173, + 66, + 32, + 134, + 132, + 128, + 34, + 4, + 66, + 32, + 135, + 167, + 36, + 0, + 32, + 4, + 167, + 11, + 36, + 1, + 1, + 126, + 32, + 0, + 173, + 32, + 1, + 173, + 66, + 32, + 134, + 132, + 32, + 2, + 173, + 32, + 3, + 173, + 66, + 32, + 134, + 132, + 129, + 34, + 4, + 66, + 32, + 135, + 167, + 36, + 0, + 32, + 4, + 167, + 11, + 36, + 1, + 1, + 126, + 32, + 0, + 173, + 32, + 1, + 173, + 66, + 32, + 134, + 132, + 32, + 2, + 173, + 32, + 3, + 173, + 66, + 32, + 134, + 132, + 130, + 34, + 4, + 66, + 32, + 135, + 167, + 36, + 0, + 32, + 4, + 167, + 11 + ])), {}).exports; +} catch (e) { +} +function Long(low, high, unsigned) { + this.low = low | 0; + this.high = high | 0; + this.unsigned = !!unsigned; +} +Long.prototype.__isLong__; +Object.defineProperty(Long.prototype, "__isLong__", { value: true }); +function isLong(obj) { + return (obj && obj["__isLong__"]) === true; +} +function ctz32(value) { + var c = Math.clz32(value & -value); + return value ? 31 - c : c; +} +Long.isLong = isLong; +var INT_CACHE = {}; +var UINT_CACHE = {}; +function fromInt(value, unsigned) { + var obj, cachedObj, cache; + if (unsigned) { + value >>>= 0; + if (cache = 0 <= value && value < 256) { + cachedObj = UINT_CACHE[value]; + if (cachedObj) + return cachedObj; + } + obj = fromBits(value, 0, true); + if (cache) + UINT_CACHE[value] = obj; + return obj; + } else { + value |= 0; + if (cache = -128 <= value && value < 128) { + cachedObj = INT_CACHE[value]; + if (cachedObj) + return cachedObj; + } + obj = fromBits(value, value < 0 ? -1 : 0, false); + if (cache) + INT_CACHE[value] = obj; + return obj; + } +} +Long.fromInt = fromInt; +function fromNumber(value, unsigned) { + if (isNaN(value)) + return unsigned ? UZERO : ZERO; + if (unsigned) { + if (value < 0) + return UZERO; + if (value >= TWO_PWR_64_DBL) + return MAX_UNSIGNED_VALUE; + } else { + if (value <= -TWO_PWR_63_DBL) + return MIN_VALUE; + if (value + 1 >= TWO_PWR_63_DBL) + return MAX_VALUE; + } + if (value < 0) + return fromNumber(-value, unsigned).neg(); + return fromBits(value % TWO_PWR_32_DBL | 0, value / TWO_PWR_32_DBL | 0, unsigned); +} +Long.fromNumber = fromNumber; +function fromBits(lowBits, highBits, unsigned) { + return new Long(lowBits, highBits, unsigned); +} +Long.fromBits = fromBits; +var pow_dbl = Math.pow; +function fromString(str, unsigned, radix) { + if (str.length === 0) + throw Error("empty string"); + if (typeof unsigned === "number") { + radix = unsigned; + unsigned = false; + } else { + unsigned = !!unsigned; + } + if (str === "NaN" || str === "Infinity" || str === "+Infinity" || str === "-Infinity") + return unsigned ? UZERO : ZERO; + radix = radix || 10; + if (radix < 2 || 36 < radix) + throw RangeError("radix"); + var p; + if ((p = str.indexOf("-")) > 0) + throw Error("interior hyphen"); + else if (p === 0) { + return fromString(str.substring(1), unsigned, radix).neg(); + } + var radixToPower = fromNumber(pow_dbl(radix, 8)); + var result = ZERO; + for (var i = 0; i < str.length; i += 8) { + var size = Math.min(8, str.length - i), value = parseInt(str.substring(i, i + size), radix); + if (size < 8) { + var power = fromNumber(pow_dbl(radix, size)); + result = result.mul(power).add(fromNumber(value)); + } else { + result = result.mul(radixToPower); + result = result.add(fromNumber(value)); + } + } + result.unsigned = unsigned; + return result; +} +Long.fromString = fromString; +function fromValue(val, unsigned) { + if (typeof val === "number") + return fromNumber(val, unsigned); + if (typeof val === "string") + return fromString(val, unsigned); + return fromBits(val.low, val.high, typeof unsigned === "boolean" ? unsigned : val.unsigned); +} +Long.fromValue = fromValue; +var TWO_PWR_16_DBL = 1 << 16; +var TWO_PWR_24_DBL = 1 << 24; +var TWO_PWR_32_DBL = TWO_PWR_16_DBL * TWO_PWR_16_DBL; +var TWO_PWR_64_DBL = TWO_PWR_32_DBL * TWO_PWR_32_DBL; +var TWO_PWR_63_DBL = TWO_PWR_64_DBL / 2; +var TWO_PWR_24 = fromInt(TWO_PWR_24_DBL); +var ZERO = fromInt(0); +Long.ZERO = ZERO; +var UZERO = fromInt(0, true); +Long.UZERO = UZERO; +var ONE = fromInt(1); +Long.ONE = ONE; +var UONE = fromInt(1, true); +Long.UONE = UONE; +var NEG_ONE = fromInt(-1); +Long.NEG_ONE = NEG_ONE; +var MAX_VALUE = fromBits(4294967295 | 0, 2147483647 | 0, false); +Long.MAX_VALUE = MAX_VALUE; +var MAX_UNSIGNED_VALUE = fromBits(4294967295 | 0, 4294967295 | 0, true); +Long.MAX_UNSIGNED_VALUE = MAX_UNSIGNED_VALUE; +var MIN_VALUE = fromBits(0, 2147483648 | 0, false); +Long.MIN_VALUE = MIN_VALUE; +var LongPrototype = Long.prototype; +LongPrototype.toInt = function toInt() { + return this.unsigned ? this.low >>> 0 : this.low; +}; +LongPrototype.toNumber = function toNumber() { + if (this.unsigned) + return (this.high >>> 0) * TWO_PWR_32_DBL + (this.low >>> 0); + return this.high * TWO_PWR_32_DBL + (this.low >>> 0); +}; +LongPrototype.toString = function toString(radix) { + radix = radix || 10; + if (radix < 2 || 36 < radix) + throw RangeError("radix"); + if (this.isZero()) + return "0"; + if (this.isNegative()) { + if (this.eq(MIN_VALUE)) { + var radixLong = fromNumber(radix), div = this.div(radixLong), rem1 = div.mul(radixLong).sub(this); + return div.toString(radix) + rem1.toInt().toString(radix); + } else + return "-" + this.neg().toString(radix); + } + var radixToPower = fromNumber(pow_dbl(radix, 6), this.unsigned), rem = this; + var result = ""; + while (true) { + var remDiv = rem.div(radixToPower), intval = rem.sub(remDiv.mul(radixToPower)).toInt() >>> 0, digits = intval.toString(radix); + rem = remDiv; + if (rem.isZero()) + return digits + result; + else { + while (digits.length < 6) + digits = "0" + digits; + result = "" + digits + result; + } + } +}; +LongPrototype.getHighBits = function getHighBits() { + return this.high; +}; +LongPrototype.getHighBitsUnsigned = function getHighBitsUnsigned() { + return this.high >>> 0; +}; +LongPrototype.getLowBits = function getLowBits() { + return this.low; +}; +LongPrototype.getLowBitsUnsigned = function getLowBitsUnsigned() { + return this.low >>> 0; +}; +LongPrototype.getNumBitsAbs = function getNumBitsAbs() { + if (this.isNegative()) + return this.eq(MIN_VALUE) ? 64 : this.neg().getNumBitsAbs(); + var val = this.high != 0 ? this.high : this.low; + for (var bit = 31; bit > 0; bit--) + if ((val & 1 << bit) != 0) + break; + return this.high != 0 ? bit + 33 : bit + 1; +}; +LongPrototype.isZero = function isZero() { + return this.high === 0 && this.low === 0; +}; +LongPrototype.eqz = LongPrototype.isZero; +LongPrototype.isNegative = function isNegative() { + return !this.unsigned && this.high < 0; +}; +LongPrototype.isPositive = function isPositive() { + return this.unsigned || this.high >= 0; +}; +LongPrototype.isOdd = function isOdd() { + return (this.low & 1) === 1; +}; +LongPrototype.isEven = function isEven() { + return (this.low & 1) === 0; +}; +LongPrototype.equals = function equals(other) { + if (!isLong(other)) + other = fromValue(other); + if (this.unsigned !== other.unsigned && this.high >>> 31 === 1 && other.high >>> 31 === 1) + return false; + return this.high === other.high && this.low === other.low; +}; +LongPrototype.eq = LongPrototype.equals; +LongPrototype.notEquals = function notEquals(other) { + return !this.eq( + /* validates */ + other + ); +}; +LongPrototype.neq = LongPrototype.notEquals; +LongPrototype.ne = LongPrototype.notEquals; +LongPrototype.lessThan = function lessThan(other) { + return this.comp( + /* validates */ + other + ) < 0; +}; +LongPrototype.lt = LongPrototype.lessThan; +LongPrototype.lessThanOrEqual = function lessThanOrEqual(other) { + return this.comp( + /* validates */ + other + ) <= 0; +}; +LongPrototype.lte = LongPrototype.lessThanOrEqual; +LongPrototype.le = LongPrototype.lessThanOrEqual; +LongPrototype.greaterThan = function greaterThan(other) { + return this.comp( + /* validates */ + other + ) > 0; +}; +LongPrototype.gt = LongPrototype.greaterThan; +LongPrototype.greaterThanOrEqual = function greaterThanOrEqual(other) { + return this.comp( + /* validates */ + other + ) >= 0; +}; +LongPrototype.gte = LongPrototype.greaterThanOrEqual; +LongPrototype.ge = LongPrototype.greaterThanOrEqual; +LongPrototype.compare = function compare(other) { + if (!isLong(other)) + other = fromValue(other); + if (this.eq(other)) + return 0; + var thisNeg = this.isNegative(), otherNeg = other.isNegative(); + if (thisNeg && !otherNeg) + return -1; + if (!thisNeg && otherNeg) + return 1; + if (!this.unsigned) + return this.sub(other).isNegative() ? -1 : 1; + return other.high >>> 0 > this.high >>> 0 || other.high === this.high && other.low >>> 0 > this.low >>> 0 ? -1 : 1; +}; +LongPrototype.comp = LongPrototype.compare; +LongPrototype.negate = function negate() { + if (!this.unsigned && this.eq(MIN_VALUE)) + return MIN_VALUE; + return this.not().add(ONE); +}; +LongPrototype.neg = LongPrototype.negate; +LongPrototype.add = function add(addend) { + if (!isLong(addend)) + addend = fromValue(addend); + var a48 = this.high >>> 16; + var a32 = this.high & 65535; + var a16 = this.low >>> 16; + var a00 = this.low & 65535; + var b48 = addend.high >>> 16; + var b32 = addend.high & 65535; + var b16 = addend.low >>> 16; + var b00 = addend.low & 65535; + var c48 = 0, c32 = 0, c16 = 0, c00 = 0; + c00 += a00 + b00; + c16 += c00 >>> 16; + c00 &= 65535; + c16 += a16 + b16; + c32 += c16 >>> 16; + c16 &= 65535; + c32 += a32 + b32; + c48 += c32 >>> 16; + c32 &= 65535; + c48 += a48 + b48; + c48 &= 65535; + return fromBits(c16 << 16 | c00, c48 << 16 | c32, this.unsigned); +}; +LongPrototype.subtract = function subtract(subtrahend) { + if (!isLong(subtrahend)) + subtrahend = fromValue(subtrahend); + return this.add(subtrahend.neg()); +}; +LongPrototype.sub = LongPrototype.subtract; +LongPrototype.multiply = function multiply(multiplier) { + if (this.isZero()) + return this; + if (!isLong(multiplier)) + multiplier = fromValue(multiplier); + if (wasm) { + var low = wasm["mul"]( + this.low, + this.high, + multiplier.low, + multiplier.high + ); + return fromBits(low, wasm["get_high"](), this.unsigned); + } + if (multiplier.isZero()) + return this.unsigned ? UZERO : ZERO; + if (this.eq(MIN_VALUE)) + return multiplier.isOdd() ? MIN_VALUE : ZERO; + if (multiplier.eq(MIN_VALUE)) + return this.isOdd() ? MIN_VALUE : ZERO; + if (this.isNegative()) { + if (multiplier.isNegative()) + return this.neg().mul(multiplier.neg()); + else + return this.neg().mul(multiplier).neg(); + } else if (multiplier.isNegative()) + return this.mul(multiplier.neg()).neg(); + if (this.lt(TWO_PWR_24) && multiplier.lt(TWO_PWR_24)) + return fromNumber(this.toNumber() * multiplier.toNumber(), this.unsigned); + var a48 = this.high >>> 16; + var a32 = this.high & 65535; + var a16 = this.low >>> 16; + var a00 = this.low & 65535; + var b48 = multiplier.high >>> 16; + var b32 = multiplier.high & 65535; + var b16 = multiplier.low >>> 16; + var b00 = multiplier.low & 65535; + var c48 = 0, c32 = 0, c16 = 0, c00 = 0; + c00 += a00 * b00; + c16 += c00 >>> 16; + c00 &= 65535; + c16 += a16 * b00; + c32 += c16 >>> 16; + c16 &= 65535; + c16 += a00 * b16; + c32 += c16 >>> 16; + c16 &= 65535; + c32 += a32 * b00; + c48 += c32 >>> 16; + c32 &= 65535; + c32 += a16 * b16; + c48 += c32 >>> 16; + c32 &= 65535; + c32 += a00 * b32; + c48 += c32 >>> 16; + c32 &= 65535; + c48 += a48 * b00 + a32 * b16 + a16 * b32 + a00 * b48; + c48 &= 65535; + return fromBits(c16 << 16 | c00, c48 << 16 | c32, this.unsigned); +}; +LongPrototype.mul = LongPrototype.multiply; +LongPrototype.divide = function divide(divisor) { + if (!isLong(divisor)) + divisor = fromValue(divisor); + if (divisor.isZero()) + throw Error("division by zero"); + if (wasm) { + if (!this.unsigned && this.high === -2147483648 && divisor.low === -1 && divisor.high === -1) { + return this; + } + var low = (this.unsigned ? wasm["div_u"] : wasm["div_s"])( + this.low, + this.high, + divisor.low, + divisor.high + ); + return fromBits(low, wasm["get_high"](), this.unsigned); + } + if (this.isZero()) + return this.unsigned ? UZERO : ZERO; + var approx, rem, res; + if (!this.unsigned) { + if (this.eq(MIN_VALUE)) { + if (divisor.eq(ONE) || divisor.eq(NEG_ONE)) + return MIN_VALUE; + else if (divisor.eq(MIN_VALUE)) + return ONE; + else { + var halfThis = this.shr(1); + approx = halfThis.div(divisor).shl(1); + if (approx.eq(ZERO)) { + return divisor.isNegative() ? ONE : NEG_ONE; + } else { + rem = this.sub(divisor.mul(approx)); + res = approx.add(rem.div(divisor)); + return res; + } + } + } else if (divisor.eq(MIN_VALUE)) + return this.unsigned ? UZERO : ZERO; + if (this.isNegative()) { + if (divisor.isNegative()) + return this.neg().div(divisor.neg()); + return this.neg().div(divisor).neg(); + } else if (divisor.isNegative()) + return this.div(divisor.neg()).neg(); + res = ZERO; + } else { + if (!divisor.unsigned) + divisor = divisor.toUnsigned(); + if (divisor.gt(this)) + return UZERO; + if (divisor.gt(this.shru(1))) + return UONE; + res = UZERO; + } + rem = this; + while (rem.gte(divisor)) { + approx = Math.max(1, Math.floor(rem.toNumber() / divisor.toNumber())); + var log2 = Math.ceil(Math.log(approx) / Math.LN2), delta = log2 <= 48 ? 1 : pow_dbl(2, log2 - 48), approxRes = fromNumber(approx), approxRem = approxRes.mul(divisor); + while (approxRem.isNegative() || approxRem.gt(rem)) { + approx -= delta; + approxRes = fromNumber(approx, this.unsigned); + approxRem = approxRes.mul(divisor); + } + if (approxRes.isZero()) + approxRes = ONE; + res = res.add(approxRes); + rem = rem.sub(approxRem); + } + return res; +}; +LongPrototype.div = LongPrototype.divide; +LongPrototype.modulo = function modulo(divisor) { + if (!isLong(divisor)) + divisor = fromValue(divisor); + if (wasm) { + var low = (this.unsigned ? wasm["rem_u"] : wasm["rem_s"])( + this.low, + this.high, + divisor.low, + divisor.high + ); + return fromBits(low, wasm["get_high"](), this.unsigned); + } + return this.sub(this.div(divisor).mul(divisor)); +}; +LongPrototype.mod = LongPrototype.modulo; +LongPrototype.rem = LongPrototype.modulo; +LongPrototype.not = function not() { + return fromBits(~this.low, ~this.high, this.unsigned); +}; +LongPrototype.countLeadingZeros = function countLeadingZeros() { + return this.high ? Math.clz32(this.high) : Math.clz32(this.low) + 32; +}; +LongPrototype.clz = LongPrototype.countLeadingZeros; +LongPrototype.countTrailingZeros = function countTrailingZeros() { + return this.low ? ctz32(this.low) : ctz32(this.high) + 32; +}; +LongPrototype.ctz = LongPrototype.countTrailingZeros; +LongPrototype.and = function and(other) { + if (!isLong(other)) + other = fromValue(other); + return fromBits(this.low & other.low, this.high & other.high, this.unsigned); +}; +LongPrototype.or = function or(other) { + if (!isLong(other)) + other = fromValue(other); + return fromBits(this.low | other.low, this.high | other.high, this.unsigned); +}; +LongPrototype.xor = function xor(other) { + if (!isLong(other)) + other = fromValue(other); + return fromBits(this.low ^ other.low, this.high ^ other.high, this.unsigned); +}; +LongPrototype.shiftLeft = function shiftLeft(numBits) { + if (isLong(numBits)) + numBits = numBits.toInt(); + if ((numBits &= 63) === 0) + return this; + else if (numBits < 32) + return fromBits(this.low << numBits, this.high << numBits | this.low >>> 32 - numBits, this.unsigned); + else + return fromBits(0, this.low << numBits - 32, this.unsigned); +}; +LongPrototype.shl = LongPrototype.shiftLeft; +LongPrototype.shiftRight = function shiftRight(numBits) { + if (isLong(numBits)) + numBits = numBits.toInt(); + if ((numBits &= 63) === 0) + return this; + else if (numBits < 32) + return fromBits(this.low >>> numBits | this.high << 32 - numBits, this.high >> numBits, this.unsigned); + else + return fromBits(this.high >> numBits - 32, this.high >= 0 ? 0 : -1, this.unsigned); +}; +LongPrototype.shr = LongPrototype.shiftRight; +LongPrototype.shiftRightUnsigned = function shiftRightUnsigned(numBits) { + if (isLong(numBits)) + numBits = numBits.toInt(); + if ((numBits &= 63) === 0) + return this; + if (numBits < 32) + return fromBits(this.low >>> numBits | this.high << 32 - numBits, this.high >>> numBits, this.unsigned); + if (numBits === 32) + return fromBits(this.high, 0, this.unsigned); + return fromBits(this.high >>> numBits - 32, 0, this.unsigned); +}; +LongPrototype.shru = LongPrototype.shiftRightUnsigned; +LongPrototype.shr_u = LongPrototype.shiftRightUnsigned; +LongPrototype.rotateLeft = function rotateLeft(numBits) { + var b; + if (isLong(numBits)) + numBits = numBits.toInt(); + if ((numBits &= 63) === 0) + return this; + if (numBits === 32) + return fromBits(this.high, this.low, this.unsigned); + if (numBits < 32) { + b = 32 - numBits; + return fromBits(this.low << numBits | this.high >>> b, this.high << numBits | this.low >>> b, this.unsigned); + } + numBits -= 32; + b = 32 - numBits; + return fromBits(this.high << numBits | this.low >>> b, this.low << numBits | this.high >>> b, this.unsigned); +}; +LongPrototype.rotl = LongPrototype.rotateLeft; +LongPrototype.rotateRight = function rotateRight(numBits) { + var b; + if (isLong(numBits)) + numBits = numBits.toInt(); + if ((numBits &= 63) === 0) + return this; + if (numBits === 32) + return fromBits(this.high, this.low, this.unsigned); + if (numBits < 32) { + b = 32 - numBits; + return fromBits(this.high << b | this.low >>> numBits, this.low << b | this.high >>> numBits, this.unsigned); + } + numBits -= 32; + b = 32 - numBits; + return fromBits(this.low << b | this.high >>> numBits, this.high << b | this.low >>> numBits, this.unsigned); +}; +LongPrototype.rotr = LongPrototype.rotateRight; +LongPrototype.toSigned = function toSigned() { + if (!this.unsigned) + return this; + return fromBits(this.low, this.high, false); +}; +LongPrototype.toUnsigned = function toUnsigned() { + if (this.unsigned) + return this; + return fromBits(this.low, this.high, true); +}; +LongPrototype.toBytes = function toBytes(le) { + return le ? this.toBytesLE() : this.toBytesBE(); +}; +LongPrototype.toBytesLE = function toBytesLE() { + var hi = this.high, lo = this.low; + return [ + lo & 255, + lo >>> 8 & 255, + lo >>> 16 & 255, + lo >>> 24, + hi & 255, + hi >>> 8 & 255, + hi >>> 16 & 255, + hi >>> 24 + ]; +}; +LongPrototype.toBytesBE = function toBytesBE() { + var hi = this.high, lo = this.low; + return [ + hi >>> 24, + hi >>> 16 & 255, + hi >>> 8 & 255, + hi & 255, + lo >>> 24, + lo >>> 16 & 255, + lo >>> 8 & 255, + lo & 255 + ]; +}; +Long.fromBytes = function fromBytes(bytes, unsigned, le) { + return le ? Long.fromBytesLE(bytes, unsigned) : Long.fromBytesBE(bytes, unsigned); +}; +Long.fromBytesLE = function fromBytesLE(bytes, unsigned) { + return new Long( + bytes[0] | bytes[1] << 8 | bytes[2] << 16 | bytes[3] << 24, + bytes[4] | bytes[5] << 8 | bytes[6] << 16 | bytes[7] << 24, + unsigned + ); +}; +Long.fromBytesBE = function fromBytesBE(bytes, unsigned) { + return new Long( + bytes[4] << 24 | bytes[5] << 16 | bytes[6] << 8 | bytes[7], + bytes[0] << 24 | bytes[1] << 16 | bytes[2] << 8 | bytes[3], + unsigned + ); +}; +var long_default = Long; + +// node_modules/@dcl/ecs/dist/components/generated/pb/decentraland/sdk/components/avatar_shape.gen.js +var import_minimal8 = __toESM(require_minimal2()); + +// node_modules/@dcl/ecs/dist/components/generated/pb/decentraland/common/colors.gen.js +var import_minimal7 = __toESM(require_minimal2()); +function createBaseColor3() { + return { r: 0, g: 0, b: 0 }; +} +var Color3; +(function(Color33) { + function encode(message, writer = import_minimal7.default.Writer.create()) { + if (message.r !== 0) { + writer.uint32(13).float(message.r); + } + if (message.g !== 0) { + writer.uint32(21).float(message.g); + } + if (message.b !== 0) { + writer.uint32(29).float(message.b); + } + return writer; + } + Color33.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal7.default.Reader ? input : import_minimal7.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBaseColor3(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 13) { + break; + } + message.r = reader.float(); + continue; + case 2: + if (tag !== 21) { + break; + } + message.g = reader.float(); + continue; + case 3: + if (tag !== 29) { + break; + } + message.b = reader.float(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + Color33.decode = decode; +})(Color3 || (Color3 = {})); +function createBaseColor4() { + return { r: 0, g: 0, b: 0, a: 0 }; +} +var Color4; +(function(Color44) { + function encode(message, writer = import_minimal7.default.Writer.create()) { + if (message.r !== 0) { + writer.uint32(13).float(message.r); + } + if (message.g !== 0) { + writer.uint32(21).float(message.g); + } + if (message.b !== 0) { + writer.uint32(29).float(message.b); + } + if (message.a !== 0) { + writer.uint32(37).float(message.a); + } + return writer; + } + Color44.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal7.default.Reader ? input : import_minimal7.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBaseColor4(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 13) { + break; + } + message.r = reader.float(); + continue; + case 2: + if (tag !== 21) { + break; + } + message.g = reader.float(); + continue; + case 3: + if (tag !== 29) { + break; + } + message.b = reader.float(); + continue; + case 4: + if (tag !== 37) { + break; + } + message.a = reader.float(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + Color44.decode = decode; +})(Color4 || (Color4 = {})); + +// node_modules/@dcl/ecs/dist/components/generated/pb/decentraland/sdk/components/avatar_shape.gen.js +function createBasePBAvatarShape() { + return { + id: "", + name: void 0, + bodyShape: void 0, + skinColor: void 0, + hairColor: void 0, + eyeColor: void 0, + expressionTriggerId: void 0, + expressionTriggerTimestamp: void 0, + talking: void 0, + wearables: [], + emotes: [] + }; +} +var PBAvatarShape; +(function(PBAvatarShape2) { + function encode(message, writer = import_minimal8.default.Writer.create()) { + if (message.id !== "") { + writer.uint32(10).string(message.id); + } + if (message.name !== void 0) { + writer.uint32(18).string(message.name); + } + if (message.bodyShape !== void 0) { + writer.uint32(26).string(message.bodyShape); + } + if (message.skinColor !== void 0) { + Color3.encode(message.skinColor, writer.uint32(34).fork()).ldelim(); + } + if (message.hairColor !== void 0) { + Color3.encode(message.hairColor, writer.uint32(42).fork()).ldelim(); + } + if (message.eyeColor !== void 0) { + Color3.encode(message.eyeColor, writer.uint32(50).fork()).ldelim(); + } + if (message.expressionTriggerId !== void 0) { + writer.uint32(58).string(message.expressionTriggerId); + } + if (message.expressionTriggerTimestamp !== void 0) { + writer.uint32(64).int64(message.expressionTriggerTimestamp); + } + if (message.talking !== void 0) { + writer.uint32(72).bool(message.talking); + } + for (const v of message.wearables) { + writer.uint32(82).string(v); + } + for (const v of message.emotes) { + writer.uint32(90).string(v); + } + return writer; + } + PBAvatarShape2.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal8.default.Reader ? input : import_minimal8.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBasePBAvatarShape(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + message.id = reader.string(); + continue; + case 2: + if (tag !== 18) { + break; + } + message.name = reader.string(); + continue; + case 3: + if (tag !== 26) { + break; + } + message.bodyShape = reader.string(); + continue; + case 4: + if (tag !== 34) { + break; + } + message.skinColor = Color3.decode(reader, reader.uint32()); + continue; + case 5: + if (tag !== 42) { + break; + } + message.hairColor = Color3.decode(reader, reader.uint32()); + continue; + case 6: + if (tag !== 50) { + break; + } + message.eyeColor = Color3.decode(reader, reader.uint32()); + continue; + case 7: + if (tag !== 58) { + break; + } + message.expressionTriggerId = reader.string(); + continue; + case 8: + if (tag !== 64) { + break; + } + message.expressionTriggerTimestamp = longToNumber(reader.int64()); + continue; + case 9: + if (tag !== 72) { + break; + } + message.talking = reader.bool(); + continue; + case 10: + if (tag !== 82) { + break; + } + message.wearables.push(reader.string()); + continue; + case 11: + if (tag !== 90) { + break; + } + message.emotes.push(reader.string()); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + PBAvatarShape2.decode = decode; +})(PBAvatarShape || (PBAvatarShape = {})); +var tsProtoGlobalThis = (() => { + if (typeof globalThis !== "undefined") { + return globalThis; + } + if (typeof self !== "undefined") { + return self; + } + if (false) { + return void 0; + } + if (typeof global !== "undefined") { + return global; + } + throw "Unable to locate global object"; +})(); +function longToNumber(long) { + if (long.gt(Number.MAX_SAFE_INTEGER)) { + throw new tsProtoGlobalThis.Error("Value is larger than Number.MAX_SAFE_INTEGER"); + } + return long.toNumber(); +} +if (import_minimal8.default.util.Long !== long_default) { + import_minimal8.default.util.Long = long_default; + import_minimal8.default.configure(); +} + +// node_modules/@dcl/ecs/dist/components/generated/AvatarShape.gen.js +var AvatarShapeSchema = { + COMPONENT_ID: 1080, + serialize(value, builder) { + const writer = PBAvatarShape.encode(value); + const buffer = new Uint8Array(writer.finish(), 0, writer.len); + builder.writeBuffer(buffer, false); + }, + deserialize(reader) { + return PBAvatarShape.decode(reader.buffer(), reader.remainingBytes()); + }, + create() { + return PBAvatarShape.decode(new Uint8Array()); + }, + jsonSchema: { + type: "object", + properties: {}, + serializationType: "protocol-buffer", + protocolBuffer: "PBAvatarShape" + } +}; + +// node_modules/@dcl/ecs/dist/components/generated/pb/decentraland/sdk/components/billboard.gen.js +var import_minimal9 = __toESM(require_minimal2()); +var BillboardMode; +(function(BillboardMode2) { + BillboardMode2[BillboardMode2["BM_NONE"] = 0] = "BM_NONE"; + BillboardMode2[BillboardMode2["BM_X"] = 1] = "BM_X"; + BillboardMode2[BillboardMode2["BM_Y"] = 2] = "BM_Y"; + BillboardMode2[BillboardMode2["BM_Z"] = 4] = "BM_Z"; + BillboardMode2[BillboardMode2["BM_ALL"] = 7] = "BM_ALL"; +})(BillboardMode || (BillboardMode = {})); +function createBasePBBillboard() { + return { billboardMode: void 0 }; +} +var PBBillboard; +(function(PBBillboard2) { + function encode(message, writer = import_minimal9.default.Writer.create()) { + if (message.billboardMode !== void 0) { + writer.uint32(8).int32(message.billboardMode); + } + return writer; + } + PBBillboard2.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal9.default.Reader ? input : import_minimal9.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBasePBBillboard(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 8) { + break; + } + message.billboardMode = reader.int32(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + PBBillboard2.decode = decode; +})(PBBillboard || (PBBillboard = {})); + +// node_modules/@dcl/ecs/dist/components/generated/Billboard.gen.js +var BillboardSchema = { + COMPONENT_ID: 1090, + serialize(value, builder) { + const writer = PBBillboard.encode(value); + const buffer = new Uint8Array(writer.finish(), 0, writer.len); + builder.writeBuffer(buffer, false); + }, + deserialize(reader) { + return PBBillboard.decode(reader.buffer(), reader.remainingBytes()); + }, + create() { + return PBBillboard.decode(new Uint8Array()); + }, + jsonSchema: { + type: "object", + properties: {}, + serializationType: "protocol-buffer", + protocolBuffer: "PBBillboard" + } +}; + +// node_modules/@dcl/ecs/dist/components/generated/pb/decentraland/sdk/components/camera_mode.gen.js +var import_minimal10 = __toESM(require_minimal2()); +function createBasePBCameraMode() { + return { mode: 0 }; +} +var PBCameraMode; +(function(PBCameraMode2) { + function encode(message, writer = import_minimal10.default.Writer.create()) { + if (message.mode !== 0) { + writer.uint32(8).int32(message.mode); + } + return writer; + } + PBCameraMode2.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal10.default.Reader ? input : import_minimal10.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBasePBCameraMode(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 8) { + break; + } + message.mode = reader.int32(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + PBCameraMode2.decode = decode; +})(PBCameraMode || (PBCameraMode = {})); + +// node_modules/@dcl/ecs/dist/components/generated/CameraMode.gen.js +var CameraModeSchema = { + COMPONENT_ID: 1072, + serialize(value, builder) { + const writer = PBCameraMode.encode(value); + const buffer = new Uint8Array(writer.finish(), 0, writer.len); + builder.writeBuffer(buffer, false); + }, + deserialize(reader) { + return PBCameraMode.decode(reader.buffer(), reader.remainingBytes()); + }, + create() { + return PBCameraMode.decode(new Uint8Array()); + }, + jsonSchema: { + type: "object", + properties: {}, + serializationType: "protocol-buffer", + protocolBuffer: "PBCameraMode" + } +}; + +// node_modules/@dcl/ecs/dist/components/generated/pb/decentraland/sdk/components/camera_mode_area.gen.js +var import_minimal11 = __toESM(require_minimal2()); +function createBasePBCameraModeArea() { + return { area: void 0, mode: 0 }; +} +var PBCameraModeArea; +(function(PBCameraModeArea2) { + function encode(message, writer = import_minimal11.default.Writer.create()) { + if (message.area !== void 0) { + Vector3.encode(message.area, writer.uint32(10).fork()).ldelim(); + } + if (message.mode !== 0) { + writer.uint32(16).int32(message.mode); + } + return writer; + } + PBCameraModeArea2.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal11.default.Reader ? input : import_minimal11.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBasePBCameraModeArea(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + message.area = Vector3.decode(reader, reader.uint32()); + continue; + case 2: + if (tag !== 16) { + break; + } + message.mode = reader.int32(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + PBCameraModeArea2.decode = decode; +})(PBCameraModeArea || (PBCameraModeArea = {})); + +// node_modules/@dcl/ecs/dist/components/generated/CameraModeArea.gen.js +var CameraModeAreaSchema = { + COMPONENT_ID: 1071, + serialize(value, builder) { + const writer = PBCameraModeArea.encode(value); + const buffer = new Uint8Array(writer.finish(), 0, writer.len); + builder.writeBuffer(buffer, false); + }, + deserialize(reader) { + return PBCameraModeArea.decode(reader.buffer(), reader.remainingBytes()); + }, + create() { + return PBCameraModeArea.decode(new Uint8Array()); + }, + jsonSchema: { + type: "object", + properties: {}, + serializationType: "protocol-buffer", + protocolBuffer: "PBCameraModeArea" + } +}; + +// node_modules/@dcl/ecs/dist/components/generated/pb/decentraland/sdk/components/engine_info.gen.js +var import_minimal12 = __toESM(require_minimal2()); +function createBasePBEngineInfo() { + return { frameNumber: 0, totalRuntime: 0, tickNumber: 0 }; +} +var PBEngineInfo; +(function(PBEngineInfo2) { + function encode(message, writer = import_minimal12.default.Writer.create()) { + if (message.frameNumber !== 0) { + writer.uint32(8).uint32(message.frameNumber); + } + if (message.totalRuntime !== 0) { + writer.uint32(21).float(message.totalRuntime); + } + if (message.tickNumber !== 0) { + writer.uint32(24).uint32(message.tickNumber); + } + return writer; + } + PBEngineInfo2.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal12.default.Reader ? input : import_minimal12.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBasePBEngineInfo(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 8) { + break; + } + message.frameNumber = reader.uint32(); + continue; + case 2: + if (tag !== 21) { + break; + } + message.totalRuntime = reader.float(); + continue; + case 3: + if (tag !== 24) { + break; + } + message.tickNumber = reader.uint32(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + PBEngineInfo2.decode = decode; +})(PBEngineInfo || (PBEngineInfo = {})); + +// node_modules/@dcl/ecs/dist/components/generated/EngineInfo.gen.js +var EngineInfoSchema = { + COMPONENT_ID: 1048, + serialize(value, builder) { + const writer = PBEngineInfo.encode(value); + const buffer = new Uint8Array(writer.finish(), 0, writer.len); + builder.writeBuffer(buffer, false); + }, + deserialize(reader) { + return PBEngineInfo.decode(reader.buffer(), reader.remainingBytes()); + }, + create() { + return PBEngineInfo.decode(new Uint8Array()); + }, + jsonSchema: { + type: "object", + properties: {}, + serializationType: "protocol-buffer", + protocolBuffer: "PBEngineInfo" + } +}; + +// node_modules/@dcl/ecs/dist/components/generated/pb/decentraland/sdk/components/gltf_container.gen.js +var import_minimal13 = __toESM(require_minimal2()); +function createBasePBGltfContainer() { + return { src: "", visibleMeshesCollisionMask: void 0, invisibleMeshesCollisionMask: void 0 }; +} +var PBGltfContainer; +(function(PBGltfContainer2) { + function encode(message, writer = import_minimal13.default.Writer.create()) { + if (message.src !== "") { + writer.uint32(10).string(message.src); + } + if (message.visibleMeshesCollisionMask !== void 0) { + writer.uint32(32).uint32(message.visibleMeshesCollisionMask); + } + if (message.invisibleMeshesCollisionMask !== void 0) { + writer.uint32(40).uint32(message.invisibleMeshesCollisionMask); + } + return writer; + } + PBGltfContainer2.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal13.default.Reader ? input : import_minimal13.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBasePBGltfContainer(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + message.src = reader.string(); + continue; + case 4: + if (tag !== 32) { + break; + } + message.visibleMeshesCollisionMask = reader.uint32(); + continue; + case 5: + if (tag !== 40) { + break; + } + message.invisibleMeshesCollisionMask = reader.uint32(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + PBGltfContainer2.decode = decode; +})(PBGltfContainer || (PBGltfContainer = {})); + +// node_modules/@dcl/ecs/dist/components/generated/GltfContainer.gen.js +var GltfContainerSchema = { + COMPONENT_ID: 1041, + serialize(value, builder) { + const writer = PBGltfContainer.encode(value); + const buffer = new Uint8Array(writer.finish(), 0, writer.len); + builder.writeBuffer(buffer, false); + }, + deserialize(reader) { + return PBGltfContainer.decode(reader.buffer(), reader.remainingBytes()); + }, + create() { + return PBGltfContainer.decode(new Uint8Array()); + }, + jsonSchema: { + type: "object", + properties: {}, + serializationType: "protocol-buffer", + protocolBuffer: "PBGltfContainer" + } +}; + +// node_modules/@dcl/ecs/dist/components/generated/pb/decentraland/sdk/components/gltf_container_loading_state.gen.js +var import_minimal14 = __toESM(require_minimal2()); +function createBasePBGltfContainerLoadingState() { + return { currentState: 0 }; +} +var PBGltfContainerLoadingState; +(function(PBGltfContainerLoadingState2) { + function encode(message, writer = import_minimal14.default.Writer.create()) { + if (message.currentState !== 0) { + writer.uint32(8).int32(message.currentState); + } + return writer; + } + PBGltfContainerLoadingState2.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal14.default.Reader ? input : import_minimal14.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBasePBGltfContainerLoadingState(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 8) { + break; + } + message.currentState = reader.int32(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + PBGltfContainerLoadingState2.decode = decode; +})(PBGltfContainerLoadingState || (PBGltfContainerLoadingState = {})); + +// node_modules/@dcl/ecs/dist/components/generated/GltfContainerLoadingState.gen.js +var GltfContainerLoadingStateSchema = { + COMPONENT_ID: 1049, + serialize(value, builder) { + const writer = PBGltfContainerLoadingState.encode(value); + const buffer = new Uint8Array(writer.finish(), 0, writer.len); + builder.writeBuffer(buffer, false); + }, + deserialize(reader) { + return PBGltfContainerLoadingState.decode(reader.buffer(), reader.remainingBytes()); + }, + create() { + return PBGltfContainerLoadingState.decode(new Uint8Array()); + }, + jsonSchema: { + type: "object", + properties: {}, + serializationType: "protocol-buffer", + protocolBuffer: "PBGltfContainerLoadingState" + } +}; + +// node_modules/@dcl/ecs/dist/components/generated/pb/decentraland/sdk/components/material.gen.js +var import_minimal16 = __toESM(require_minimal2()); + +// node_modules/@dcl/ecs/dist/components/generated/pb/decentraland/common/texture.gen.js +var import_minimal15 = __toESM(require_minimal2()); +var TextureWrapMode; +(function(TextureWrapMode2) { + TextureWrapMode2[TextureWrapMode2["TWM_REPEAT"] = 0] = "TWM_REPEAT"; + TextureWrapMode2[TextureWrapMode2["TWM_CLAMP"] = 1] = "TWM_CLAMP"; + TextureWrapMode2[TextureWrapMode2["TWM_MIRROR"] = 2] = "TWM_MIRROR"; +})(TextureWrapMode || (TextureWrapMode = {})); +var TextureFilterMode; +(function(TextureFilterMode2) { + TextureFilterMode2[TextureFilterMode2["TFM_POINT"] = 0] = "TFM_POINT"; + TextureFilterMode2[TextureFilterMode2["TFM_BILINEAR"] = 1] = "TFM_BILINEAR"; + TextureFilterMode2[TextureFilterMode2["TFM_TRILINEAR"] = 2] = "TFM_TRILINEAR"; +})(TextureFilterMode || (TextureFilterMode = {})); +function createBaseTexture() { + return { src: "", wrapMode: void 0, filterMode: void 0 }; +} +var Texture; +(function(Texture2) { + function encode(message, writer = import_minimal15.default.Writer.create()) { + if (message.src !== "") { + writer.uint32(10).string(message.src); + } + if (message.wrapMode !== void 0) { + writer.uint32(16).int32(message.wrapMode); + } + if (message.filterMode !== void 0) { + writer.uint32(24).int32(message.filterMode); + } + return writer; + } + Texture2.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal15.default.Reader ? input : import_minimal15.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBaseTexture(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + message.src = reader.string(); + continue; + case 2: + if (tag !== 16) { + break; + } + message.wrapMode = reader.int32(); + continue; + case 3: + if (tag !== 24) { + break; + } + message.filterMode = reader.int32(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + Texture2.decode = decode; +})(Texture || (Texture = {})); +function createBaseAvatarTexture() { + return { userId: "", wrapMode: void 0, filterMode: void 0 }; +} +var AvatarTexture; +(function(AvatarTexture2) { + function encode(message, writer = import_minimal15.default.Writer.create()) { + if (message.userId !== "") { + writer.uint32(10).string(message.userId); + } + if (message.wrapMode !== void 0) { + writer.uint32(16).int32(message.wrapMode); + } + if (message.filterMode !== void 0) { + writer.uint32(24).int32(message.filterMode); + } + return writer; + } + AvatarTexture2.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal15.default.Reader ? input : import_minimal15.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBaseAvatarTexture(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + message.userId = reader.string(); + continue; + case 2: + if (tag !== 16) { + break; + } + message.wrapMode = reader.int32(); + continue; + case 3: + if (tag !== 24) { + break; + } + message.filterMode = reader.int32(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + AvatarTexture2.decode = decode; +})(AvatarTexture || (AvatarTexture = {})); +function createBaseVideoTexture() { + return { videoPlayerEntity: 0, wrapMode: void 0, filterMode: void 0 }; +} +var VideoTexture; +(function(VideoTexture2) { + function encode(message, writer = import_minimal15.default.Writer.create()) { + if (message.videoPlayerEntity !== 0) { + writer.uint32(8).uint32(message.videoPlayerEntity); + } + if (message.wrapMode !== void 0) { + writer.uint32(16).int32(message.wrapMode); + } + if (message.filterMode !== void 0) { + writer.uint32(24).int32(message.filterMode); + } + return writer; + } + VideoTexture2.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal15.default.Reader ? input : import_minimal15.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBaseVideoTexture(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 8) { + break; + } + message.videoPlayerEntity = reader.uint32(); + continue; + case 2: + if (tag !== 16) { + break; + } + message.wrapMode = reader.int32(); + continue; + case 3: + if (tag !== 24) { + break; + } + message.filterMode = reader.int32(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + VideoTexture2.decode = decode; +})(VideoTexture || (VideoTexture = {})); +function createBaseTextureUnion() { + return { tex: void 0 }; +} +var TextureUnion; +(function(TextureUnion2) { + function encode(message, writer = import_minimal15.default.Writer.create()) { + switch (message.tex?.$case) { + case "texture": + Texture.encode(message.tex.texture, writer.uint32(10).fork()).ldelim(); + break; + case "avatarTexture": + AvatarTexture.encode(message.tex.avatarTexture, writer.uint32(18).fork()).ldelim(); + break; + case "videoTexture": + VideoTexture.encode(message.tex.videoTexture, writer.uint32(26).fork()).ldelim(); + break; + } + return writer; + } + TextureUnion2.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal15.default.Reader ? input : import_minimal15.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBaseTextureUnion(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + message.tex = { $case: "texture", texture: Texture.decode(reader, reader.uint32()) }; + continue; + case 2: + if (tag !== 18) { + break; + } + message.tex = { $case: "avatarTexture", avatarTexture: AvatarTexture.decode(reader, reader.uint32()) }; + continue; + case 3: + if (tag !== 26) { + break; + } + message.tex = { $case: "videoTexture", videoTexture: VideoTexture.decode(reader, reader.uint32()) }; + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + TextureUnion2.decode = decode; +})(TextureUnion || (TextureUnion = {})); + +// node_modules/@dcl/ecs/dist/components/generated/pb/decentraland/sdk/components/material.gen.js +var MaterialTransparencyMode; +(function(MaterialTransparencyMode2) { + MaterialTransparencyMode2[MaterialTransparencyMode2["MTM_OPAQUE"] = 0] = "MTM_OPAQUE"; + MaterialTransparencyMode2[MaterialTransparencyMode2["MTM_ALPHA_TEST"] = 1] = "MTM_ALPHA_TEST"; + MaterialTransparencyMode2[MaterialTransparencyMode2["MTM_ALPHA_BLEND"] = 2] = "MTM_ALPHA_BLEND"; + MaterialTransparencyMode2[MaterialTransparencyMode2["MTM_ALPHA_TEST_AND_ALPHA_BLEND"] = 3] = "MTM_ALPHA_TEST_AND_ALPHA_BLEND"; + MaterialTransparencyMode2[MaterialTransparencyMode2["MTM_AUTO"] = 4] = "MTM_AUTO"; +})(MaterialTransparencyMode || (MaterialTransparencyMode = {})); +function createBasePBMaterial() { + return { material: void 0 }; +} +var PBMaterial; +(function(PBMaterial2) { + function encode(message, writer = import_minimal16.default.Writer.create()) { + switch (message.material?.$case) { + case "unlit": + PBMaterial_UnlitMaterial.encode(message.material.unlit, writer.uint32(10).fork()).ldelim(); + break; + case "pbr": + PBMaterial_PbrMaterial.encode(message.material.pbr, writer.uint32(18).fork()).ldelim(); + break; + } + return writer; + } + PBMaterial2.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal16.default.Reader ? input : import_minimal16.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBasePBMaterial(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + message.material = { $case: "unlit", unlit: PBMaterial_UnlitMaterial.decode(reader, reader.uint32()) }; + continue; + case 2: + if (tag !== 18) { + break; + } + message.material = { $case: "pbr", pbr: PBMaterial_PbrMaterial.decode(reader, reader.uint32()) }; + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + PBMaterial2.decode = decode; +})(PBMaterial || (PBMaterial = {})); +function createBasePBMaterial_UnlitMaterial() { + return { texture: void 0, alphaTest: void 0, castShadows: void 0, diffuseColor: void 0 }; +} +var PBMaterial_UnlitMaterial; +(function(PBMaterial_UnlitMaterial2) { + function encode(message, writer = import_minimal16.default.Writer.create()) { + if (message.texture !== void 0) { + TextureUnion.encode(message.texture, writer.uint32(10).fork()).ldelim(); + } + if (message.alphaTest !== void 0) { + writer.uint32(21).float(message.alphaTest); + } + if (message.castShadows !== void 0) { + writer.uint32(24).bool(message.castShadows); + } + if (message.diffuseColor !== void 0) { + Color4.encode(message.diffuseColor, writer.uint32(34).fork()).ldelim(); + } + return writer; + } + PBMaterial_UnlitMaterial2.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal16.default.Reader ? input : import_minimal16.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBasePBMaterial_UnlitMaterial(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + message.texture = TextureUnion.decode(reader, reader.uint32()); + continue; + case 2: + if (tag !== 21) { + break; + } + message.alphaTest = reader.float(); + continue; + case 3: + if (tag !== 24) { + break; + } + message.castShadows = reader.bool(); + continue; + case 4: + if (tag !== 34) { + break; + } + message.diffuseColor = Color4.decode(reader, reader.uint32()); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + PBMaterial_UnlitMaterial2.decode = decode; +})(PBMaterial_UnlitMaterial || (PBMaterial_UnlitMaterial = {})); +function createBasePBMaterial_PbrMaterial() { + return { + texture: void 0, + alphaTest: void 0, + castShadows: void 0, + alphaTexture: void 0, + emissiveTexture: void 0, + bumpTexture: void 0, + albedoColor: void 0, + emissiveColor: void 0, + reflectivityColor: void 0, + transparencyMode: void 0, + metallic: void 0, + roughness: void 0, + specularIntensity: void 0, + emissiveIntensity: void 0, + directIntensity: void 0 + }; +} +var PBMaterial_PbrMaterial; +(function(PBMaterial_PbrMaterial2) { + function encode(message, writer = import_minimal16.default.Writer.create()) { + if (message.texture !== void 0) { + TextureUnion.encode(message.texture, writer.uint32(10).fork()).ldelim(); + } + if (message.alphaTest !== void 0) { + writer.uint32(21).float(message.alphaTest); + } + if (message.castShadows !== void 0) { + writer.uint32(24).bool(message.castShadows); + } + if (message.alphaTexture !== void 0) { + TextureUnion.encode(message.alphaTexture, writer.uint32(34).fork()).ldelim(); + } + if (message.emissiveTexture !== void 0) { + TextureUnion.encode(message.emissiveTexture, writer.uint32(42).fork()).ldelim(); + } + if (message.bumpTexture !== void 0) { + TextureUnion.encode(message.bumpTexture, writer.uint32(50).fork()).ldelim(); + } + if (message.albedoColor !== void 0) { + Color4.encode(message.albedoColor, writer.uint32(58).fork()).ldelim(); + } + if (message.emissiveColor !== void 0) { + Color3.encode(message.emissiveColor, writer.uint32(66).fork()).ldelim(); + } + if (message.reflectivityColor !== void 0) { + Color3.encode(message.reflectivityColor, writer.uint32(74).fork()).ldelim(); + } + if (message.transparencyMode !== void 0) { + writer.uint32(80).int32(message.transparencyMode); + } + if (message.metallic !== void 0) { + writer.uint32(93).float(message.metallic); + } + if (message.roughness !== void 0) { + writer.uint32(101).float(message.roughness); + } + if (message.specularIntensity !== void 0) { + writer.uint32(117).float(message.specularIntensity); + } + if (message.emissiveIntensity !== void 0) { + writer.uint32(125).float(message.emissiveIntensity); + } + if (message.directIntensity !== void 0) { + writer.uint32(133).float(message.directIntensity); + } + return writer; + } + PBMaterial_PbrMaterial2.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal16.default.Reader ? input : import_minimal16.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBasePBMaterial_PbrMaterial(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + message.texture = TextureUnion.decode(reader, reader.uint32()); + continue; + case 2: + if (tag !== 21) { + break; + } + message.alphaTest = reader.float(); + continue; + case 3: + if (tag !== 24) { + break; + } + message.castShadows = reader.bool(); + continue; + case 4: + if (tag !== 34) { + break; + } + message.alphaTexture = TextureUnion.decode(reader, reader.uint32()); + continue; + case 5: + if (tag !== 42) { + break; + } + message.emissiveTexture = TextureUnion.decode(reader, reader.uint32()); + continue; + case 6: + if (tag !== 50) { + break; + } + message.bumpTexture = TextureUnion.decode(reader, reader.uint32()); + continue; + case 7: + if (tag !== 58) { + break; + } + message.albedoColor = Color4.decode(reader, reader.uint32()); + continue; + case 8: + if (tag !== 66) { + break; + } + message.emissiveColor = Color3.decode(reader, reader.uint32()); + continue; + case 9: + if (tag !== 74) { + break; + } + message.reflectivityColor = Color3.decode(reader, reader.uint32()); + continue; + case 10: + if (tag !== 80) { + break; + } + message.transparencyMode = reader.int32(); + continue; + case 11: + if (tag !== 93) { + break; + } + message.metallic = reader.float(); + continue; + case 12: + if (tag !== 101) { + break; + } + message.roughness = reader.float(); + continue; + case 14: + if (tag !== 117) { + break; + } + message.specularIntensity = reader.float(); + continue; + case 15: + if (tag !== 125) { + break; + } + message.emissiveIntensity = reader.float(); + continue; + case 16: + if (tag !== 133) { + break; + } + message.directIntensity = reader.float(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + PBMaterial_PbrMaterial2.decode = decode; +})(PBMaterial_PbrMaterial || (PBMaterial_PbrMaterial = {})); + +// node_modules/@dcl/ecs/dist/components/generated/Material.gen.js +var MaterialSchema = { + COMPONENT_ID: 1017, + serialize(value, builder) { + const writer = PBMaterial.encode(value); + const buffer = new Uint8Array(writer.finish(), 0, writer.len); + builder.writeBuffer(buffer, false); + }, + deserialize(reader) { + return PBMaterial.decode(reader.buffer(), reader.remainingBytes()); + }, + create() { + return PBMaterial.decode(new Uint8Array()); + }, + jsonSchema: { + type: "object", + properties: {}, + serializationType: "protocol-buffer", + protocolBuffer: "PBMaterial" + } +}; + +// node_modules/@dcl/ecs/dist/components/generated/pb/decentraland/sdk/components/mesh_collider.gen.js +var import_minimal17 = __toESM(require_minimal2()); +var ColliderLayer; +(function(ColliderLayer3) { + ColliderLayer3[ColliderLayer3["CL_NONE"] = 0] = "CL_NONE"; + ColliderLayer3[ColliderLayer3["CL_POINTER"] = 1] = "CL_POINTER"; + ColliderLayer3[ColliderLayer3["CL_PHYSICS"] = 2] = "CL_PHYSICS"; + ColliderLayer3[ColliderLayer3["CL_RESERVED1"] = 4] = "CL_RESERVED1"; + ColliderLayer3[ColliderLayer3["CL_RESERVED2"] = 8] = "CL_RESERVED2"; + ColliderLayer3[ColliderLayer3["CL_RESERVED3"] = 16] = "CL_RESERVED3"; + ColliderLayer3[ColliderLayer3["CL_RESERVED4"] = 32] = "CL_RESERVED4"; + ColliderLayer3[ColliderLayer3["CL_RESERVED5"] = 64] = "CL_RESERVED5"; + ColliderLayer3[ColliderLayer3["CL_RESERVED6"] = 128] = "CL_RESERVED6"; + ColliderLayer3[ColliderLayer3["CL_CUSTOM1"] = 256] = "CL_CUSTOM1"; + ColliderLayer3[ColliderLayer3["CL_CUSTOM2"] = 512] = "CL_CUSTOM2"; + ColliderLayer3[ColliderLayer3["CL_CUSTOM3"] = 1024] = "CL_CUSTOM3"; + ColliderLayer3[ColliderLayer3["CL_CUSTOM4"] = 2048] = "CL_CUSTOM4"; + ColliderLayer3[ColliderLayer3["CL_CUSTOM5"] = 4096] = "CL_CUSTOM5"; + ColliderLayer3[ColliderLayer3["CL_CUSTOM6"] = 8192] = "CL_CUSTOM6"; + ColliderLayer3[ColliderLayer3["CL_CUSTOM7"] = 16384] = "CL_CUSTOM7"; + ColliderLayer3[ColliderLayer3["CL_CUSTOM8"] = 32768] = "CL_CUSTOM8"; +})(ColliderLayer || (ColliderLayer = {})); +function createBasePBMeshCollider() { + return { collisionMask: void 0, mesh: void 0 }; +} +var PBMeshCollider; +(function(PBMeshCollider2) { + function encode(message, writer = import_minimal17.default.Writer.create()) { + if (message.collisionMask !== void 0) { + writer.uint32(8).uint32(message.collisionMask); + } + switch (message.mesh?.$case) { + case "box": + PBMeshCollider_BoxMesh.encode(message.mesh.box, writer.uint32(18).fork()).ldelim(); + break; + case "sphere": + PBMeshCollider_SphereMesh.encode(message.mesh.sphere, writer.uint32(26).fork()).ldelim(); + break; + case "cylinder": + PBMeshCollider_CylinderMesh.encode(message.mesh.cylinder, writer.uint32(34).fork()).ldelim(); + break; + case "plane": + PBMeshCollider_PlaneMesh.encode(message.mesh.plane, writer.uint32(42).fork()).ldelim(); + break; + } + return writer; + } + PBMeshCollider2.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal17.default.Reader ? input : import_minimal17.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBasePBMeshCollider(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 8) { + break; + } + message.collisionMask = reader.uint32(); + continue; + case 2: + if (tag !== 18) { + break; + } + message.mesh = { $case: "box", box: PBMeshCollider_BoxMesh.decode(reader, reader.uint32()) }; + continue; + case 3: + if (tag !== 26) { + break; + } + message.mesh = { $case: "sphere", sphere: PBMeshCollider_SphereMesh.decode(reader, reader.uint32()) }; + continue; + case 4: + if (tag !== 34) { + break; + } + message.mesh = { $case: "cylinder", cylinder: PBMeshCollider_CylinderMesh.decode(reader, reader.uint32()) }; + continue; + case 5: + if (tag !== 42) { + break; + } + message.mesh = { $case: "plane", plane: PBMeshCollider_PlaneMesh.decode(reader, reader.uint32()) }; + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + PBMeshCollider2.decode = decode; +})(PBMeshCollider || (PBMeshCollider = {})); +function createBasePBMeshCollider_BoxMesh() { + return {}; +} +var PBMeshCollider_BoxMesh; +(function(PBMeshCollider_BoxMesh2) { + function encode(_, writer = import_minimal17.default.Writer.create()) { + return writer; + } + PBMeshCollider_BoxMesh2.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal17.default.Reader ? input : import_minimal17.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBasePBMeshCollider_BoxMesh(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + PBMeshCollider_BoxMesh2.decode = decode; +})(PBMeshCollider_BoxMesh || (PBMeshCollider_BoxMesh = {})); +function createBasePBMeshCollider_CylinderMesh() { + return { radiusTop: void 0, radiusBottom: void 0 }; +} +var PBMeshCollider_CylinderMesh; +(function(PBMeshCollider_CylinderMesh2) { + function encode(message, writer = import_minimal17.default.Writer.create()) { + if (message.radiusTop !== void 0) { + writer.uint32(13).float(message.radiusTop); + } + if (message.radiusBottom !== void 0) { + writer.uint32(21).float(message.radiusBottom); + } + return writer; + } + PBMeshCollider_CylinderMesh2.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal17.default.Reader ? input : import_minimal17.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBasePBMeshCollider_CylinderMesh(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 13) { + break; + } + message.radiusTop = reader.float(); + continue; + case 2: + if (tag !== 21) { + break; + } + message.radiusBottom = reader.float(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + PBMeshCollider_CylinderMesh2.decode = decode; +})(PBMeshCollider_CylinderMesh || (PBMeshCollider_CylinderMesh = {})); +function createBasePBMeshCollider_PlaneMesh() { + return {}; +} +var PBMeshCollider_PlaneMesh; +(function(PBMeshCollider_PlaneMesh2) { + function encode(_, writer = import_minimal17.default.Writer.create()) { + return writer; + } + PBMeshCollider_PlaneMesh2.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal17.default.Reader ? input : import_minimal17.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBasePBMeshCollider_PlaneMesh(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + PBMeshCollider_PlaneMesh2.decode = decode; +})(PBMeshCollider_PlaneMesh || (PBMeshCollider_PlaneMesh = {})); +function createBasePBMeshCollider_SphereMesh() { + return {}; +} +var PBMeshCollider_SphereMesh; +(function(PBMeshCollider_SphereMesh2) { + function encode(_, writer = import_minimal17.default.Writer.create()) { + return writer; + } + PBMeshCollider_SphereMesh2.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal17.default.Reader ? input : import_minimal17.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBasePBMeshCollider_SphereMesh(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + PBMeshCollider_SphereMesh2.decode = decode; +})(PBMeshCollider_SphereMesh || (PBMeshCollider_SphereMesh = {})); + +// node_modules/@dcl/ecs/dist/components/generated/MeshCollider.gen.js +var MeshColliderSchema = { + COMPONENT_ID: 1019, + serialize(value, builder) { + const writer = PBMeshCollider.encode(value); + const buffer = new Uint8Array(writer.finish(), 0, writer.len); + builder.writeBuffer(buffer, false); + }, + deserialize(reader) { + return PBMeshCollider.decode(reader.buffer(), reader.remainingBytes()); + }, + create() { + return PBMeshCollider.decode(new Uint8Array()); + }, + jsonSchema: { + type: "object", + properties: {}, + serializationType: "protocol-buffer", + protocolBuffer: "PBMeshCollider" + } +}; + +// node_modules/@dcl/ecs/dist/components/generated/pb/decentraland/sdk/components/mesh_renderer.gen.js +var import_minimal18 = __toESM(require_minimal2()); +function createBasePBMeshRenderer() { + return { mesh: void 0 }; +} +var PBMeshRenderer; +(function(PBMeshRenderer2) { + function encode(message, writer = import_minimal18.default.Writer.create()) { + switch (message.mesh?.$case) { + case "box": + PBMeshRenderer_BoxMesh.encode(message.mesh.box, writer.uint32(10).fork()).ldelim(); + break; + case "sphere": + PBMeshRenderer_SphereMesh.encode(message.mesh.sphere, writer.uint32(18).fork()).ldelim(); + break; + case "cylinder": + PBMeshRenderer_CylinderMesh.encode(message.mesh.cylinder, writer.uint32(26).fork()).ldelim(); + break; + case "plane": + PBMeshRenderer_PlaneMesh.encode(message.mesh.plane, writer.uint32(34).fork()).ldelim(); + break; + } + return writer; + } + PBMeshRenderer2.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal18.default.Reader ? input : import_minimal18.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBasePBMeshRenderer(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + message.mesh = { $case: "box", box: PBMeshRenderer_BoxMesh.decode(reader, reader.uint32()) }; + continue; + case 2: + if (tag !== 18) { + break; + } + message.mesh = { $case: "sphere", sphere: PBMeshRenderer_SphereMesh.decode(reader, reader.uint32()) }; + continue; + case 3: + if (tag !== 26) { + break; + } + message.mesh = { $case: "cylinder", cylinder: PBMeshRenderer_CylinderMesh.decode(reader, reader.uint32()) }; + continue; + case 4: + if (tag !== 34) { + break; + } + message.mesh = { $case: "plane", plane: PBMeshRenderer_PlaneMesh.decode(reader, reader.uint32()) }; + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + PBMeshRenderer2.decode = decode; +})(PBMeshRenderer || (PBMeshRenderer = {})); +function createBasePBMeshRenderer_BoxMesh() { + return { uvs: [] }; +} +var PBMeshRenderer_BoxMesh; +(function(PBMeshRenderer_BoxMesh2) { + function encode(message, writer = import_minimal18.default.Writer.create()) { + writer.uint32(10).fork(); + for (const v of message.uvs) { + writer.float(v); + } + writer.ldelim(); + return writer; + } + PBMeshRenderer_BoxMesh2.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal18.default.Reader ? input : import_minimal18.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBasePBMeshRenderer_BoxMesh(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag === 13) { + message.uvs.push(reader.float()); + continue; + } + if (tag === 10) { + const end2 = reader.uint32() + reader.pos; + while (reader.pos < end2) { + message.uvs.push(reader.float()); + } + continue; + } + break; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + PBMeshRenderer_BoxMesh2.decode = decode; +})(PBMeshRenderer_BoxMesh || (PBMeshRenderer_BoxMesh = {})); +function createBasePBMeshRenderer_CylinderMesh() { + return { radiusTop: void 0, radiusBottom: void 0 }; +} +var PBMeshRenderer_CylinderMesh; +(function(PBMeshRenderer_CylinderMesh2) { + function encode(message, writer = import_minimal18.default.Writer.create()) { + if (message.radiusTop !== void 0) { + writer.uint32(13).float(message.radiusTop); + } + if (message.radiusBottom !== void 0) { + writer.uint32(21).float(message.radiusBottom); + } + return writer; + } + PBMeshRenderer_CylinderMesh2.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal18.default.Reader ? input : import_minimal18.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBasePBMeshRenderer_CylinderMesh(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 13) { + break; + } + message.radiusTop = reader.float(); + continue; + case 2: + if (tag !== 21) { + break; + } + message.radiusBottom = reader.float(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + PBMeshRenderer_CylinderMesh2.decode = decode; +})(PBMeshRenderer_CylinderMesh || (PBMeshRenderer_CylinderMesh = {})); +function createBasePBMeshRenderer_PlaneMesh() { + return { uvs: [] }; +} +var PBMeshRenderer_PlaneMesh; +(function(PBMeshRenderer_PlaneMesh2) { + function encode(message, writer = import_minimal18.default.Writer.create()) { + writer.uint32(10).fork(); + for (const v of message.uvs) { + writer.float(v); + } + writer.ldelim(); + return writer; + } + PBMeshRenderer_PlaneMesh2.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal18.default.Reader ? input : import_minimal18.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBasePBMeshRenderer_PlaneMesh(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag === 13) { + message.uvs.push(reader.float()); + continue; + } + if (tag === 10) { + const end2 = reader.uint32() + reader.pos; + while (reader.pos < end2) { + message.uvs.push(reader.float()); + } + continue; + } + break; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + PBMeshRenderer_PlaneMesh2.decode = decode; +})(PBMeshRenderer_PlaneMesh || (PBMeshRenderer_PlaneMesh = {})); +function createBasePBMeshRenderer_SphereMesh() { + return {}; +} +var PBMeshRenderer_SphereMesh; +(function(PBMeshRenderer_SphereMesh2) { + function encode(_, writer = import_minimal18.default.Writer.create()) { + return writer; + } + PBMeshRenderer_SphereMesh2.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal18.default.Reader ? input : import_minimal18.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBasePBMeshRenderer_SphereMesh(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + PBMeshRenderer_SphereMesh2.decode = decode; +})(PBMeshRenderer_SphereMesh || (PBMeshRenderer_SphereMesh = {})); + +// node_modules/@dcl/ecs/dist/components/generated/MeshRenderer.gen.js +var MeshRendererSchema = { + COMPONENT_ID: 1018, + serialize(value, builder) { + const writer = PBMeshRenderer.encode(value); + const buffer = new Uint8Array(writer.finish(), 0, writer.len); + builder.writeBuffer(buffer, false); + }, + deserialize(reader) { + return PBMeshRenderer.decode(reader.buffer(), reader.remainingBytes()); + }, + create() { + return PBMeshRenderer.decode(new Uint8Array()); + }, + jsonSchema: { + type: "object", + properties: {}, + serializationType: "protocol-buffer", + protocolBuffer: "PBMeshRenderer" + } +}; + +// node_modules/@dcl/ecs/dist/components/generated/pb/decentraland/sdk/components/nft_shape.gen.js +var import_minimal19 = __toESM(require_minimal2()); +var NftFrameType; +(function(NftFrameType2) { + NftFrameType2[NftFrameType2["NFT_CLASSIC"] = 0] = "NFT_CLASSIC"; + NftFrameType2[NftFrameType2["NFT_BAROQUE_ORNAMENT"] = 1] = "NFT_BAROQUE_ORNAMENT"; + NftFrameType2[NftFrameType2["NFT_DIAMOND_ORNAMENT"] = 2] = "NFT_DIAMOND_ORNAMENT"; + NftFrameType2[NftFrameType2["NFT_MINIMAL_WIDE"] = 3] = "NFT_MINIMAL_WIDE"; + NftFrameType2[NftFrameType2["NFT_MINIMAL_GREY"] = 4] = "NFT_MINIMAL_GREY"; + NftFrameType2[NftFrameType2["NFT_BLOCKY"] = 5] = "NFT_BLOCKY"; + NftFrameType2[NftFrameType2["NFT_GOLD_EDGES"] = 6] = "NFT_GOLD_EDGES"; + NftFrameType2[NftFrameType2["NFT_GOLD_CARVED"] = 7] = "NFT_GOLD_CARVED"; + NftFrameType2[NftFrameType2["NFT_GOLD_WIDE"] = 8] = "NFT_GOLD_WIDE"; + NftFrameType2[NftFrameType2["NFT_GOLD_ROUNDED"] = 9] = "NFT_GOLD_ROUNDED"; + NftFrameType2[NftFrameType2["NFT_METAL_MEDIUM"] = 10] = "NFT_METAL_MEDIUM"; + NftFrameType2[NftFrameType2["NFT_METAL_WIDE"] = 11] = "NFT_METAL_WIDE"; + NftFrameType2[NftFrameType2["NFT_METAL_SLIM"] = 12] = "NFT_METAL_SLIM"; + NftFrameType2[NftFrameType2["NFT_METAL_ROUNDED"] = 13] = "NFT_METAL_ROUNDED"; + NftFrameType2[NftFrameType2["NFT_PINS"] = 14] = "NFT_PINS"; + NftFrameType2[NftFrameType2["NFT_MINIMAL_BLACK"] = 15] = "NFT_MINIMAL_BLACK"; + NftFrameType2[NftFrameType2["NFT_MINIMAL_WHITE"] = 16] = "NFT_MINIMAL_WHITE"; + NftFrameType2[NftFrameType2["NFT_TAPE"] = 17] = "NFT_TAPE"; + NftFrameType2[NftFrameType2["NFT_WOOD_SLIM"] = 18] = "NFT_WOOD_SLIM"; + NftFrameType2[NftFrameType2["NFT_WOOD_WIDE"] = 19] = "NFT_WOOD_WIDE"; + NftFrameType2[NftFrameType2["NFT_WOOD_TWIGS"] = 20] = "NFT_WOOD_TWIGS"; + NftFrameType2[NftFrameType2["NFT_CANVAS"] = 21] = "NFT_CANVAS"; + NftFrameType2[NftFrameType2["NFT_NONE"] = 22] = "NFT_NONE"; +})(NftFrameType || (NftFrameType = {})); +function createBasePBNftShape() { + return { urn: "", style: void 0, color: void 0 }; +} +var PBNftShape; +(function(PBNftShape2) { + function encode(message, writer = import_minimal19.default.Writer.create()) { + if (message.urn !== "") { + writer.uint32(10).string(message.urn); + } + if (message.style !== void 0) { + writer.uint32(16).int32(message.style); + } + if (message.color !== void 0) { + Color3.encode(message.color, writer.uint32(26).fork()).ldelim(); + } + return writer; + } + PBNftShape2.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal19.default.Reader ? input : import_minimal19.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBasePBNftShape(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + message.urn = reader.string(); + continue; + case 2: + if (tag !== 16) { + break; + } + message.style = reader.int32(); + continue; + case 3: + if (tag !== 26) { + break; + } + message.color = Color3.decode(reader, reader.uint32()); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + PBNftShape2.decode = decode; +})(PBNftShape || (PBNftShape = {})); + +// node_modules/@dcl/ecs/dist/components/generated/NftShape.gen.js +var NftShapeSchema = { + COMPONENT_ID: 1040, + serialize(value, builder) { + const writer = PBNftShape.encode(value); + const buffer = new Uint8Array(writer.finish(), 0, writer.len); + builder.writeBuffer(buffer, false); + }, + deserialize(reader) { + return PBNftShape.decode(reader.buffer(), reader.remainingBytes()); + }, + create() { + return PBNftShape.decode(new Uint8Array()); + }, + jsonSchema: { + type: "object", + properties: {}, + serializationType: "protocol-buffer", + protocolBuffer: "PBNftShape" + } +}; + +// node_modules/@dcl/ecs/dist/components/generated/pb/decentraland/sdk/components/pointer_events.gen.js +var import_minimal20 = __toESM(require_minimal2()); +function createBasePBPointerEvents() { + return { pointerEvents: [] }; +} +var PBPointerEvents; +(function(PBPointerEvents2) { + function encode(message, writer = import_minimal20.default.Writer.create()) { + for (const v of message.pointerEvents) { + PBPointerEvents_Entry.encode(v, writer.uint32(10).fork()).ldelim(); + } + return writer; + } + PBPointerEvents2.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal20.default.Reader ? input : import_minimal20.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBasePBPointerEvents(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + message.pointerEvents.push(PBPointerEvents_Entry.decode(reader, reader.uint32())); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + PBPointerEvents2.decode = decode; +})(PBPointerEvents || (PBPointerEvents = {})); +function createBasePBPointerEvents_Info() { + return { button: void 0, hoverText: void 0, maxDistance: void 0, showFeedback: void 0 }; +} +var PBPointerEvents_Info; +(function(PBPointerEvents_Info2) { + function encode(message, writer = import_minimal20.default.Writer.create()) { + if (message.button !== void 0) { + writer.uint32(8).int32(message.button); + } + if (message.hoverText !== void 0) { + writer.uint32(18).string(message.hoverText); + } + if (message.maxDistance !== void 0) { + writer.uint32(29).float(message.maxDistance); + } + if (message.showFeedback !== void 0) { + writer.uint32(32).bool(message.showFeedback); + } + return writer; + } + PBPointerEvents_Info2.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal20.default.Reader ? input : import_minimal20.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBasePBPointerEvents_Info(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 8) { + break; + } + message.button = reader.int32(); + continue; + case 2: + if (tag !== 18) { + break; + } + message.hoverText = reader.string(); + continue; + case 3: + if (tag !== 29) { + break; + } + message.maxDistance = reader.float(); + continue; + case 4: + if (tag !== 32) { + break; + } + message.showFeedback = reader.bool(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + PBPointerEvents_Info2.decode = decode; +})(PBPointerEvents_Info || (PBPointerEvents_Info = {})); +function createBasePBPointerEvents_Entry() { + return { eventType: 0, eventInfo: void 0 }; +} +var PBPointerEvents_Entry; +(function(PBPointerEvents_Entry2) { + function encode(message, writer = import_minimal20.default.Writer.create()) { + if (message.eventType !== 0) { + writer.uint32(8).int32(message.eventType); + } + if (message.eventInfo !== void 0) { + PBPointerEvents_Info.encode(message.eventInfo, writer.uint32(18).fork()).ldelim(); + } + return writer; + } + PBPointerEvents_Entry2.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal20.default.Reader ? input : import_minimal20.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBasePBPointerEvents_Entry(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 8) { + break; + } + message.eventType = reader.int32(); + continue; + case 2: + if (tag !== 18) { + break; + } + message.eventInfo = PBPointerEvents_Info.decode(reader, reader.uint32()); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + PBPointerEvents_Entry2.decode = decode; +})(PBPointerEvents_Entry || (PBPointerEvents_Entry = {})); + +// node_modules/@dcl/ecs/dist/components/generated/PointerEvents.gen.js +var PointerEventsSchema = { + COMPONENT_ID: 1062, + serialize(value, builder) { + const writer = PBPointerEvents.encode(value); + const buffer = new Uint8Array(writer.finish(), 0, writer.len); + builder.writeBuffer(buffer, false); + }, + deserialize(reader) { + return PBPointerEvents.decode(reader.buffer(), reader.remainingBytes()); + }, + create() { + return PBPointerEvents.decode(new Uint8Array()); + }, + jsonSchema: { + type: "object", + properties: {}, + serializationType: "protocol-buffer", + protocolBuffer: "PBPointerEvents" + } +}; + +// node_modules/@dcl/ecs/dist/components/generated/pb/decentraland/sdk/components/pointer_events_result.gen.js +var import_minimal22 = __toESM(require_minimal2()); + +// node_modules/@dcl/ecs/dist/components/generated/pb/decentraland/sdk/components/common/raycast_hit.gen.js +var import_minimal21 = __toESM(require_minimal2()); +function createBaseRaycastHit() { + return { + position: void 0, + globalOrigin: void 0, + direction: void 0, + normalHit: void 0, + length: 0, + meshName: void 0, + entityId: void 0 + }; +} +var RaycastHit; +(function(RaycastHit2) { + function encode(message, writer = import_minimal21.default.Writer.create()) { + if (message.position !== void 0) { + Vector3.encode(message.position, writer.uint32(10).fork()).ldelim(); + } + if (message.globalOrigin !== void 0) { + Vector3.encode(message.globalOrigin, writer.uint32(18).fork()).ldelim(); + } + if (message.direction !== void 0) { + Vector3.encode(message.direction, writer.uint32(26).fork()).ldelim(); + } + if (message.normalHit !== void 0) { + Vector3.encode(message.normalHit, writer.uint32(34).fork()).ldelim(); + } + if (message.length !== 0) { + writer.uint32(45).float(message.length); + } + if (message.meshName !== void 0) { + writer.uint32(50).string(message.meshName); + } + if (message.entityId !== void 0) { + writer.uint32(56).uint32(message.entityId); + } + return writer; + } + RaycastHit2.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal21.default.Reader ? input : import_minimal21.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBaseRaycastHit(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + message.position = Vector3.decode(reader, reader.uint32()); + continue; + case 2: + if (tag !== 18) { + break; + } + message.globalOrigin = Vector3.decode(reader, reader.uint32()); + continue; + case 3: + if (tag !== 26) { + break; + } + message.direction = Vector3.decode(reader, reader.uint32()); + continue; + case 4: + if (tag !== 34) { + break; + } + message.normalHit = Vector3.decode(reader, reader.uint32()); + continue; + case 5: + if (tag !== 45) { + break; + } + message.length = reader.float(); + continue; + case 6: + if (tag !== 50) { + break; + } + message.meshName = reader.string(); + continue; + case 7: + if (tag !== 56) { + break; + } + message.entityId = reader.uint32(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + RaycastHit2.decode = decode; +})(RaycastHit || (RaycastHit = {})); + +// node_modules/@dcl/ecs/dist/components/generated/pb/decentraland/sdk/components/pointer_events_result.gen.js +function createBasePBPointerEventsResult() { + return { button: 0, hit: void 0, state: 0, timestamp: 0, analog: void 0, tickNumber: 0 }; +} +var PBPointerEventsResult; +(function(PBPointerEventsResult2) { + function encode(message, writer = import_minimal22.default.Writer.create()) { + if (message.button !== 0) { + writer.uint32(8).int32(message.button); + } + if (message.hit !== void 0) { + RaycastHit.encode(message.hit, writer.uint32(18).fork()).ldelim(); + } + if (message.state !== 0) { + writer.uint32(32).int32(message.state); + } + if (message.timestamp !== 0) { + writer.uint32(40).uint32(message.timestamp); + } + if (message.analog !== void 0) { + writer.uint32(53).float(message.analog); + } + if (message.tickNumber !== 0) { + writer.uint32(56).uint32(message.tickNumber); + } + return writer; + } + PBPointerEventsResult2.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal22.default.Reader ? input : import_minimal22.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBasePBPointerEventsResult(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 8) { + break; + } + message.button = reader.int32(); + continue; + case 2: + if (tag !== 18) { + break; + } + message.hit = RaycastHit.decode(reader, reader.uint32()); + continue; + case 4: + if (tag !== 32) { + break; + } + message.state = reader.int32(); + continue; + case 5: + if (tag !== 40) { + break; + } + message.timestamp = reader.uint32(); + continue; + case 6: + if (tag !== 53) { + break; + } + message.analog = reader.float(); + continue; + case 7: + if (tag !== 56) { + break; + } + message.tickNumber = reader.uint32(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + PBPointerEventsResult2.decode = decode; +})(PBPointerEventsResult || (PBPointerEventsResult = {})); + +// node_modules/@dcl/ecs/dist/components/generated/PointerEventsResult.gen.js +var PointerEventsResultSchema = { + COMPONENT_ID: 1063, + serialize(value, builder) { + const writer = PBPointerEventsResult.encode(value); + const buffer = new Uint8Array(writer.finish(), 0, writer.len); + builder.writeBuffer(buffer, false); + }, + deserialize(reader) { + return PBPointerEventsResult.decode(reader.buffer(), reader.remainingBytes()); + }, + create() { + return PBPointerEventsResult.decode(new Uint8Array()); + }, + jsonSchema: { + type: "object", + properties: {}, + serializationType: "protocol-buffer", + protocolBuffer: "PBPointerEventsResult" + } +}; + +// node_modules/@dcl/ecs/dist/components/generated/pb/decentraland/sdk/components/pointer_lock.gen.js +var import_minimal23 = __toESM(require_minimal2()); +function createBasePBPointerLock() { + return { isPointerLocked: false }; +} +var PBPointerLock; +(function(PBPointerLock2) { + function encode(message, writer = import_minimal23.default.Writer.create()) { + if (message.isPointerLocked === true) { + writer.uint32(8).bool(message.isPointerLocked); + } + return writer; + } + PBPointerLock2.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal23.default.Reader ? input : import_minimal23.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBasePBPointerLock(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 8) { + break; + } + message.isPointerLocked = reader.bool(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + PBPointerLock2.decode = decode; +})(PBPointerLock || (PBPointerLock = {})); + +// node_modules/@dcl/ecs/dist/components/generated/PointerLock.gen.js +var PointerLockSchema = { + COMPONENT_ID: 1074, + serialize(value, builder) { + const writer = PBPointerLock.encode(value); + const buffer = new Uint8Array(writer.finish(), 0, writer.len); + builder.writeBuffer(buffer, false); + }, + deserialize(reader) { + return PBPointerLock.decode(reader.buffer(), reader.remainingBytes()); + }, + create() { + return PBPointerLock.decode(new Uint8Array()); + }, + jsonSchema: { + type: "object", + properties: {}, + serializationType: "protocol-buffer", + protocolBuffer: "PBPointerLock" + } +}; + +// node_modules/@dcl/ecs/dist/components/generated/pb/decentraland/sdk/components/raycast.gen.js +var import_minimal24 = __toESM(require_minimal2()); +var RaycastQueryType; +(function(RaycastQueryType2) { + RaycastQueryType2[RaycastQueryType2["RQT_HIT_FIRST"] = 0] = "RQT_HIT_FIRST"; + RaycastQueryType2[RaycastQueryType2["RQT_QUERY_ALL"] = 1] = "RQT_QUERY_ALL"; + RaycastQueryType2[RaycastQueryType2["RQT_NONE"] = 2] = "RQT_NONE"; +})(RaycastQueryType || (RaycastQueryType = {})); +function createBasePBRaycast() { + return { + timestamp: void 0, + originOffset: void 0, + direction: void 0, + maxDistance: 0, + queryType: 0, + continuous: void 0, + collisionMask: void 0 + }; +} +var PBRaycast; +(function(PBRaycast2) { + function encode(message, writer = import_minimal24.default.Writer.create()) { + if (message.timestamp !== void 0) { + writer.uint32(8).uint32(message.timestamp); + } + if (message.originOffset !== void 0) { + Vector3.encode(message.originOffset, writer.uint32(18).fork()).ldelim(); + } + switch (message.direction?.$case) { + case "localDirection": + Vector3.encode(message.direction.localDirection, writer.uint32(50).fork()).ldelim(); + break; + case "globalDirection": + Vector3.encode(message.direction.globalDirection, writer.uint32(26).fork()).ldelim(); + break; + case "globalTarget": + Vector3.encode(message.direction.globalTarget, writer.uint32(58).fork()).ldelim(); + break; + case "targetEntity": + writer.uint32(80).uint32(message.direction.targetEntity); + break; + } + if (message.maxDistance !== 0) { + writer.uint32(37).float(message.maxDistance); + } + if (message.queryType !== 0) { + writer.uint32(40).int32(message.queryType); + } + if (message.continuous !== void 0) { + writer.uint32(64).bool(message.continuous); + } + if (message.collisionMask !== void 0) { + writer.uint32(72).uint32(message.collisionMask); + } + return writer; + } + PBRaycast2.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal24.default.Reader ? input : import_minimal24.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBasePBRaycast(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 8) { + break; + } + message.timestamp = reader.uint32(); + continue; + case 2: + if (tag !== 18) { + break; + } + message.originOffset = Vector3.decode(reader, reader.uint32()); + continue; + case 6: + if (tag !== 50) { + break; + } + message.direction = { $case: "localDirection", localDirection: Vector3.decode(reader, reader.uint32()) }; + continue; + case 3: + if (tag !== 26) { + break; + } + message.direction = { $case: "globalDirection", globalDirection: Vector3.decode(reader, reader.uint32()) }; + continue; + case 7: + if (tag !== 58) { + break; + } + message.direction = { $case: "globalTarget", globalTarget: Vector3.decode(reader, reader.uint32()) }; + continue; + case 10: + if (tag !== 80) { + break; + } + message.direction = { $case: "targetEntity", targetEntity: reader.uint32() }; + continue; + case 4: + if (tag !== 37) { + break; + } + message.maxDistance = reader.float(); + continue; + case 5: + if (tag !== 40) { + break; + } + message.queryType = reader.int32(); + continue; + case 8: + if (tag !== 64) { + break; + } + message.continuous = reader.bool(); + continue; + case 9: + if (tag !== 72) { + break; + } + message.collisionMask = reader.uint32(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + PBRaycast2.decode = decode; +})(PBRaycast || (PBRaycast = {})); + +// node_modules/@dcl/ecs/dist/components/generated/Raycast.gen.js +var RaycastSchema = { + COMPONENT_ID: 1067, + serialize(value, builder) { + const writer = PBRaycast.encode(value); + const buffer = new Uint8Array(writer.finish(), 0, writer.len); + builder.writeBuffer(buffer, false); + }, + deserialize(reader) { + return PBRaycast.decode(reader.buffer(), reader.remainingBytes()); + }, + create() { + return PBRaycast.decode(new Uint8Array()); + }, + jsonSchema: { + type: "object", + properties: {}, + serializationType: "protocol-buffer", + protocolBuffer: "PBRaycast" + } +}; + +// node_modules/@dcl/ecs/dist/components/generated/pb/decentraland/sdk/components/raycast_result.gen.js +var import_minimal25 = __toESM(require_minimal2()); +function createBasePBRaycastResult() { + return { timestamp: void 0, globalOrigin: void 0, direction: void 0, hits: [], tickNumber: 0 }; +} +var PBRaycastResult; +(function(PBRaycastResult2) { + function encode(message, writer = import_minimal25.default.Writer.create()) { + if (message.timestamp !== void 0) { + writer.uint32(8).uint32(message.timestamp); + } + if (message.globalOrigin !== void 0) { + Vector3.encode(message.globalOrigin, writer.uint32(18).fork()).ldelim(); + } + if (message.direction !== void 0) { + Vector3.encode(message.direction, writer.uint32(26).fork()).ldelim(); + } + for (const v of message.hits) { + RaycastHit.encode(v, writer.uint32(34).fork()).ldelim(); + } + if (message.tickNumber !== 0) { + writer.uint32(40).uint32(message.tickNumber); + } + return writer; + } + PBRaycastResult2.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal25.default.Reader ? input : import_minimal25.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBasePBRaycastResult(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 8) { + break; + } + message.timestamp = reader.uint32(); + continue; + case 2: + if (tag !== 18) { + break; + } + message.globalOrigin = Vector3.decode(reader, reader.uint32()); + continue; + case 3: + if (tag !== 26) { + break; + } + message.direction = Vector3.decode(reader, reader.uint32()); + continue; + case 4: + if (tag !== 34) { + break; + } + message.hits.push(RaycastHit.decode(reader, reader.uint32())); + continue; + case 5: + if (tag !== 40) { + break; + } + message.tickNumber = reader.uint32(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + PBRaycastResult2.decode = decode; +})(PBRaycastResult || (PBRaycastResult = {})); + +// node_modules/@dcl/ecs/dist/components/generated/RaycastResult.gen.js +var RaycastResultSchema = { + COMPONENT_ID: 1068, + serialize(value, builder) { + const writer = PBRaycastResult.encode(value); + const buffer = new Uint8Array(writer.finish(), 0, writer.len); + builder.writeBuffer(buffer, false); + }, + deserialize(reader) { + return PBRaycastResult.decode(reader.buffer(), reader.remainingBytes()); + }, + create() { + return PBRaycastResult.decode(new Uint8Array()); + }, + jsonSchema: { + type: "object", + properties: {}, + serializationType: "protocol-buffer", + protocolBuffer: "PBRaycastResult" + } +}; + +// node_modules/@dcl/ecs/dist/components/generated/pb/decentraland/sdk/components/text_shape.gen.js +var import_minimal26 = __toESM(require_minimal2()); +function createBasePBTextShape() { + return { + text: "", + font: void 0, + fontSize: void 0, + fontAutoSize: void 0, + textAlign: void 0, + width: void 0, + height: void 0, + paddingTop: void 0, + paddingRight: void 0, + paddingBottom: void 0, + paddingLeft: void 0, + lineSpacing: void 0, + lineCount: void 0, + textWrapping: void 0, + shadowBlur: void 0, + shadowOffsetX: void 0, + shadowOffsetY: void 0, + outlineWidth: void 0, + shadowColor: void 0, + outlineColor: void 0, + textColor: void 0 + }; +} +var PBTextShape; +(function(PBTextShape2) { + function encode(message, writer = import_minimal26.default.Writer.create()) { + if (message.text !== "") { + writer.uint32(10).string(message.text); + } + if (message.font !== void 0) { + writer.uint32(16).int32(message.font); + } + if (message.fontSize !== void 0) { + writer.uint32(29).float(message.fontSize); + } + if (message.fontAutoSize !== void 0) { + writer.uint32(32).bool(message.fontAutoSize); + } + if (message.textAlign !== void 0) { + writer.uint32(40).int32(message.textAlign); + } + if (message.width !== void 0) { + writer.uint32(53).float(message.width); + } + if (message.height !== void 0) { + writer.uint32(61).float(message.height); + } + if (message.paddingTop !== void 0) { + writer.uint32(69).float(message.paddingTop); + } + if (message.paddingRight !== void 0) { + writer.uint32(77).float(message.paddingRight); + } + if (message.paddingBottom !== void 0) { + writer.uint32(85).float(message.paddingBottom); + } + if (message.paddingLeft !== void 0) { + writer.uint32(93).float(message.paddingLeft); + } + if (message.lineSpacing !== void 0) { + writer.uint32(101).float(message.lineSpacing); + } + if (message.lineCount !== void 0) { + writer.uint32(104).int32(message.lineCount); + } + if (message.textWrapping !== void 0) { + writer.uint32(112).bool(message.textWrapping); + } + if (message.shadowBlur !== void 0) { + writer.uint32(125).float(message.shadowBlur); + } + if (message.shadowOffsetX !== void 0) { + writer.uint32(133).float(message.shadowOffsetX); + } + if (message.shadowOffsetY !== void 0) { + writer.uint32(141).float(message.shadowOffsetY); + } + if (message.outlineWidth !== void 0) { + writer.uint32(149).float(message.outlineWidth); + } + if (message.shadowColor !== void 0) { + Color3.encode(message.shadowColor, writer.uint32(154).fork()).ldelim(); + } + if (message.outlineColor !== void 0) { + Color3.encode(message.outlineColor, writer.uint32(162).fork()).ldelim(); + } + if (message.textColor !== void 0) { + Color4.encode(message.textColor, writer.uint32(170).fork()).ldelim(); + } + return writer; + } + PBTextShape2.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal26.default.Reader ? input : import_minimal26.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBasePBTextShape(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + message.text = reader.string(); + continue; + case 2: + if (tag !== 16) { + break; + } + message.font = reader.int32(); + continue; + case 3: + if (tag !== 29) { + break; + } + message.fontSize = reader.float(); + continue; + case 4: + if (tag !== 32) { + break; + } + message.fontAutoSize = reader.bool(); + continue; + case 5: + if (tag !== 40) { + break; + } + message.textAlign = reader.int32(); + continue; + case 6: + if (tag !== 53) { + break; + } + message.width = reader.float(); + continue; + case 7: + if (tag !== 61) { + break; + } + message.height = reader.float(); + continue; + case 8: + if (tag !== 69) { + break; + } + message.paddingTop = reader.float(); + continue; + case 9: + if (tag !== 77) { + break; + } + message.paddingRight = reader.float(); + continue; + case 10: + if (tag !== 85) { + break; + } + message.paddingBottom = reader.float(); + continue; + case 11: + if (tag !== 93) { + break; + } + message.paddingLeft = reader.float(); + continue; + case 12: + if (tag !== 101) { + break; + } + message.lineSpacing = reader.float(); + continue; + case 13: + if (tag !== 104) { + break; + } + message.lineCount = reader.int32(); + continue; + case 14: + if (tag !== 112) { + break; + } + message.textWrapping = reader.bool(); + continue; + case 15: + if (tag !== 125) { + break; + } + message.shadowBlur = reader.float(); + continue; + case 16: + if (tag !== 133) { + break; + } + message.shadowOffsetX = reader.float(); + continue; + case 17: + if (tag !== 141) { + break; + } + message.shadowOffsetY = reader.float(); + continue; + case 18: + if (tag !== 149) { + break; + } + message.outlineWidth = reader.float(); + continue; + case 19: + if (tag !== 154) { + break; + } + message.shadowColor = Color3.decode(reader, reader.uint32()); + continue; + case 20: + if (tag !== 162) { + break; + } + message.outlineColor = Color3.decode(reader, reader.uint32()); + continue; + case 21: + if (tag !== 170) { + break; + } + message.textColor = Color4.decode(reader, reader.uint32()); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + PBTextShape2.decode = decode; +})(PBTextShape || (PBTextShape = {})); + +// node_modules/@dcl/ecs/dist/components/generated/TextShape.gen.js +var TextShapeSchema = { + COMPONENT_ID: 1030, + serialize(value, builder) { + const writer = PBTextShape.encode(value); + const buffer = new Uint8Array(writer.finish(), 0, writer.len); + builder.writeBuffer(buffer, false); + }, + deserialize(reader) { + return PBTextShape.decode(reader.buffer(), reader.remainingBytes()); + }, + create() { + return PBTextShape.decode(new Uint8Array()); + }, + jsonSchema: { + type: "object", + properties: {}, + serializationType: "protocol-buffer", + protocolBuffer: "PBTextShape" + } +}; + +// node_modules/@dcl/ecs/dist/components/generated/pb/decentraland/sdk/components/tween.gen.js +var import_minimal27 = __toESM(require_minimal2()); +var EasingFunction; +(function(EasingFunction2) { + EasingFunction2[EasingFunction2["EF_LINEAR"] = 0] = "EF_LINEAR"; + EasingFunction2[EasingFunction2["EF_EASEINQUAD"] = 1] = "EF_EASEINQUAD"; + EasingFunction2[EasingFunction2["EF_EASEOUTQUAD"] = 2] = "EF_EASEOUTQUAD"; + EasingFunction2[EasingFunction2["EF_EASEQUAD"] = 3] = "EF_EASEQUAD"; + EasingFunction2[EasingFunction2["EF_EASEINSINE"] = 4] = "EF_EASEINSINE"; + EasingFunction2[EasingFunction2["EF_EASEOUTSINE"] = 5] = "EF_EASEOUTSINE"; + EasingFunction2[EasingFunction2["EF_EASESINE"] = 6] = "EF_EASESINE"; + EasingFunction2[EasingFunction2["EF_EASEINEXPO"] = 7] = "EF_EASEINEXPO"; + EasingFunction2[EasingFunction2["EF_EASEOUTEXPO"] = 8] = "EF_EASEOUTEXPO"; + EasingFunction2[EasingFunction2["EF_EASEEXPO"] = 9] = "EF_EASEEXPO"; + EasingFunction2[EasingFunction2["EF_EASEINELASTIC"] = 10] = "EF_EASEINELASTIC"; + EasingFunction2[EasingFunction2["EF_EASEOUTELASTIC"] = 11] = "EF_EASEOUTELASTIC"; + EasingFunction2[EasingFunction2["EF_EASEELASTIC"] = 12] = "EF_EASEELASTIC"; + EasingFunction2[EasingFunction2["EF_EASEINBOUNCE"] = 13] = "EF_EASEINBOUNCE"; + EasingFunction2[EasingFunction2["EF_EASEOUTBOUNCE"] = 14] = "EF_EASEOUTBOUNCE"; + EasingFunction2[EasingFunction2["EF_EASEBOUNCE"] = 15] = "EF_EASEBOUNCE"; + EasingFunction2[EasingFunction2["EF_EASEINCUBIC"] = 16] = "EF_EASEINCUBIC"; + EasingFunction2[EasingFunction2["EF_EASEOUTCUBIC"] = 17] = "EF_EASEOUTCUBIC"; + EasingFunction2[EasingFunction2["EF_EASECUBIC"] = 18] = "EF_EASECUBIC"; + EasingFunction2[EasingFunction2["EF_EASEINQUART"] = 19] = "EF_EASEINQUART"; + EasingFunction2[EasingFunction2["EF_EASEOUTQUART"] = 20] = "EF_EASEOUTQUART"; + EasingFunction2[EasingFunction2["EF_EASEQUART"] = 21] = "EF_EASEQUART"; + EasingFunction2[EasingFunction2["EF_EASEINQUINT"] = 22] = "EF_EASEINQUINT"; + EasingFunction2[EasingFunction2["EF_EASEOUTQUINT"] = 23] = "EF_EASEOUTQUINT"; + EasingFunction2[EasingFunction2["EF_EASEQUINT"] = 24] = "EF_EASEQUINT"; + EasingFunction2[EasingFunction2["EF_EASEINCIRC"] = 25] = "EF_EASEINCIRC"; + EasingFunction2[EasingFunction2["EF_EASEOUTCIRC"] = 26] = "EF_EASEOUTCIRC"; + EasingFunction2[EasingFunction2["EF_EASECIRC"] = 27] = "EF_EASECIRC"; + EasingFunction2[EasingFunction2["EF_EASEINBACK"] = 28] = "EF_EASEINBACK"; + EasingFunction2[EasingFunction2["EF_EASEOUTBACK"] = 29] = "EF_EASEOUTBACK"; + EasingFunction2[EasingFunction2["EF_EASEBACK"] = 30] = "EF_EASEBACK"; +})(EasingFunction || (EasingFunction = {})); +function createBasePBTween() { + return { duration: 0, easingFunction: 0, mode: void 0, playing: void 0, currentTime: void 0 }; +} +var PBTween; +(function(PBTween2) { + function encode(message, writer = import_minimal27.default.Writer.create()) { + if (message.duration !== 0) { + writer.uint32(13).float(message.duration); + } + if (message.easingFunction !== 0) { + writer.uint32(16).int32(message.easingFunction); + } + switch (message.mode?.$case) { + case "move": + Move.encode(message.mode.move, writer.uint32(26).fork()).ldelim(); + break; + case "rotate": + Rotate.encode(message.mode.rotate, writer.uint32(34).fork()).ldelim(); + break; + case "scale": + Scale.encode(message.mode.scale, writer.uint32(42).fork()).ldelim(); + break; + } + if (message.playing !== void 0) { + writer.uint32(48).bool(message.playing); + } + if (message.currentTime !== void 0) { + writer.uint32(61).float(message.currentTime); + } + return writer; + } + PBTween2.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal27.default.Reader ? input : import_minimal27.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBasePBTween(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 13) { + break; + } + message.duration = reader.float(); + continue; + case 2: + if (tag !== 16) { + break; + } + message.easingFunction = reader.int32(); + continue; + case 3: + if (tag !== 26) { + break; + } + message.mode = { $case: "move", move: Move.decode(reader, reader.uint32()) }; + continue; + case 4: + if (tag !== 34) { + break; + } + message.mode = { $case: "rotate", rotate: Rotate.decode(reader, reader.uint32()) }; + continue; + case 5: + if (tag !== 42) { + break; + } + message.mode = { $case: "scale", scale: Scale.decode(reader, reader.uint32()) }; + continue; + case 6: + if (tag !== 48) { + break; + } + message.playing = reader.bool(); + continue; + case 7: + if (tag !== 61) { + break; + } + message.currentTime = reader.float(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + PBTween2.decode = decode; +})(PBTween || (PBTween = {})); +function createBaseMove() { + return { start: void 0, end: void 0, faceDirection: void 0 }; +} +var Move; +(function(Move2) { + function encode(message, writer = import_minimal27.default.Writer.create()) { + if (message.start !== void 0) { + Vector3.encode(message.start, writer.uint32(10).fork()).ldelim(); + } + if (message.end !== void 0) { + Vector3.encode(message.end, writer.uint32(18).fork()).ldelim(); + } + if (message.faceDirection !== void 0) { + writer.uint32(24).bool(message.faceDirection); + } + return writer; + } + Move2.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal27.default.Reader ? input : import_minimal27.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBaseMove(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + message.start = Vector3.decode(reader, reader.uint32()); + continue; + case 2: + if (tag !== 18) { + break; + } + message.end = Vector3.decode(reader, reader.uint32()); + continue; + case 3: + if (tag !== 24) { + break; + } + message.faceDirection = reader.bool(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + Move2.decode = decode; +})(Move || (Move = {})); +function createBaseRotate() { + return { start: void 0, end: void 0 }; +} +var Rotate; +(function(Rotate2) { + function encode(message, writer = import_minimal27.default.Writer.create()) { + if (message.start !== void 0) { + Quaternion.encode(message.start, writer.uint32(10).fork()).ldelim(); + } + if (message.end !== void 0) { + Quaternion.encode(message.end, writer.uint32(18).fork()).ldelim(); + } + return writer; + } + Rotate2.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal27.default.Reader ? input : import_minimal27.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBaseRotate(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + message.start = Quaternion.decode(reader, reader.uint32()); + continue; + case 2: + if (tag !== 18) { + break; + } + message.end = Quaternion.decode(reader, reader.uint32()); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + Rotate2.decode = decode; +})(Rotate || (Rotate = {})); +function createBaseScale() { + return { start: void 0, end: void 0 }; +} +var Scale; +(function(Scale2) { + function encode(message, writer = import_minimal27.default.Writer.create()) { + if (message.start !== void 0) { + Vector3.encode(message.start, writer.uint32(10).fork()).ldelim(); + } + if (message.end !== void 0) { + Vector3.encode(message.end, writer.uint32(18).fork()).ldelim(); + } + return writer; + } + Scale2.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal27.default.Reader ? input : import_minimal27.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBaseScale(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + message.start = Vector3.decode(reader, reader.uint32()); + continue; + case 2: + if (tag !== 18) { + break; + } + message.end = Vector3.decode(reader, reader.uint32()); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + Scale2.decode = decode; +})(Scale || (Scale = {})); + +// node_modules/@dcl/ecs/dist/components/generated/Tween.gen.js +var TweenSchema = { + COMPONENT_ID: 1102, + serialize(value, builder) { + const writer = PBTween.encode(value); + const buffer = new Uint8Array(writer.finish(), 0, writer.len); + builder.writeBuffer(buffer, false); + }, + deserialize(reader) { + return PBTween.decode(reader.buffer(), reader.remainingBytes()); + }, + create() { + return PBTween.decode(new Uint8Array()); + }, + jsonSchema: { + type: "object", + properties: {}, + serializationType: "protocol-buffer", + protocolBuffer: "PBTween" + } +}; + +// node_modules/@dcl/ecs/dist/components/generated/pb/decentraland/sdk/components/tween_sequence.gen.js +var import_minimal28 = __toESM(require_minimal2()); +var TweenLoop; +(function(TweenLoop2) { + TweenLoop2[TweenLoop2["TL_RESTART"] = 0] = "TL_RESTART"; + TweenLoop2[TweenLoop2["TL_YOYO"] = 1] = "TL_YOYO"; +})(TweenLoop || (TweenLoop = {})); +function createBasePBTweenSequence() { + return { sequence: [], loop: void 0 }; +} +var PBTweenSequence; +(function(PBTweenSequence2) { + function encode(message, writer = import_minimal28.default.Writer.create()) { + for (const v of message.sequence) { + PBTween.encode(v, writer.uint32(10).fork()).ldelim(); + } + if (message.loop !== void 0) { + writer.uint32(16).int32(message.loop); + } + return writer; + } + PBTweenSequence2.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal28.default.Reader ? input : import_minimal28.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBasePBTweenSequence(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + message.sequence.push(PBTween.decode(reader, reader.uint32())); + continue; + case 2: + if (tag !== 16) { + break; + } + message.loop = reader.int32(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + PBTweenSequence2.decode = decode; +})(PBTweenSequence || (PBTweenSequence = {})); + +// node_modules/@dcl/ecs/dist/components/generated/TweenSequence.gen.js +var TweenSequenceSchema = { + COMPONENT_ID: 1104, + serialize(value, builder) { + const writer = PBTweenSequence.encode(value); + const buffer = new Uint8Array(writer.finish(), 0, writer.len); + builder.writeBuffer(buffer, false); + }, + deserialize(reader) { + return PBTweenSequence.decode(reader.buffer(), reader.remainingBytes()); + }, + create() { + return PBTweenSequence.decode(new Uint8Array()); + }, + jsonSchema: { + type: "object", + properties: {}, + serializationType: "protocol-buffer", + protocolBuffer: "PBTweenSequence" + } +}; + +// node_modules/@dcl/ecs/dist/components/generated/pb/decentraland/sdk/components/tween_state.gen.js +var import_minimal29 = __toESM(require_minimal2()); +var TweenStateStatus; +(function(TweenStateStatus2) { + TweenStateStatus2[TweenStateStatus2["TS_ACTIVE"] = 0] = "TS_ACTIVE"; + TweenStateStatus2[TweenStateStatus2["TS_COMPLETED"] = 1] = "TS_COMPLETED"; + TweenStateStatus2[TweenStateStatus2["TS_PAUSED"] = 2] = "TS_PAUSED"; +})(TweenStateStatus || (TweenStateStatus = {})); +function createBasePBTweenState() { + return { state: 0, currentTime: 0 }; +} +var PBTweenState; +(function(PBTweenState2) { + function encode(message, writer = import_minimal29.default.Writer.create()) { + if (message.state !== 0) { + writer.uint32(8).int32(message.state); + } + if (message.currentTime !== 0) { + writer.uint32(21).float(message.currentTime); + } + return writer; + } + PBTweenState2.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal29.default.Reader ? input : import_minimal29.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBasePBTweenState(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 8) { + break; + } + message.state = reader.int32(); + continue; + case 2: + if (tag !== 21) { + break; + } + message.currentTime = reader.float(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + PBTweenState2.decode = decode; +})(PBTweenState || (PBTweenState = {})); + +// node_modules/@dcl/ecs/dist/components/generated/TweenState.gen.js +var TweenStateSchema = { + COMPONENT_ID: 1103, + serialize(value, builder) { + const writer = PBTweenState.encode(value); + const buffer = new Uint8Array(writer.finish(), 0, writer.len); + builder.writeBuffer(buffer, false); + }, + deserialize(reader) { + return PBTweenState.decode(reader.buffer(), reader.remainingBytes()); + }, + create() { + return PBTweenState.decode(new Uint8Array()); + }, + jsonSchema: { + type: "object", + properties: {}, + serializationType: "protocol-buffer", + protocolBuffer: "PBTweenState" + } +}; + +// node_modules/@dcl/ecs/dist/components/generated/pb/decentraland/sdk/components/ui_background.gen.js +var import_minimal31 = __toESM(require_minimal2()); + +// node_modules/@dcl/ecs/dist/components/generated/pb/decentraland/common/border_rect.gen.js +var import_minimal30 = __toESM(require_minimal2()); +function createBaseBorderRect() { + return { top: 0, left: 0, right: 0, bottom: 0 }; +} +var BorderRect; +(function(BorderRect2) { + function encode(message, writer = import_minimal30.default.Writer.create()) { + if (message.top !== 0) { + writer.uint32(13).float(message.top); + } + if (message.left !== 0) { + writer.uint32(21).float(message.left); + } + if (message.right !== 0) { + writer.uint32(29).float(message.right); + } + if (message.bottom !== 0) { + writer.uint32(37).float(message.bottom); + } + return writer; + } + BorderRect2.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal30.default.Reader ? input : import_minimal30.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBaseBorderRect(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 13) { + break; + } + message.top = reader.float(); + continue; + case 2: + if (tag !== 21) { + break; + } + message.left = reader.float(); + continue; + case 3: + if (tag !== 29) { + break; + } + message.right = reader.float(); + continue; + case 4: + if (tag !== 37) { + break; + } + message.bottom = reader.float(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + BorderRect2.decode = decode; +})(BorderRect || (BorderRect = {})); +function createBaseRect() { + return { x: 0, y: 0, width: 0, height: 0 }; +} +var Rect; +(function(Rect2) { + function encode(message, writer = import_minimal30.default.Writer.create()) { + if (message.x !== 0) { + writer.uint32(13).float(message.x); + } + if (message.y !== 0) { + writer.uint32(21).float(message.y); + } + if (message.width !== 0) { + writer.uint32(29).float(message.width); + } + if (message.height !== 0) { + writer.uint32(37).float(message.height); + } + return writer; + } + Rect2.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal30.default.Reader ? input : import_minimal30.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBaseRect(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 13) { + break; + } + message.x = reader.float(); + continue; + case 2: + if (tag !== 21) { + break; + } + message.y = reader.float(); + continue; + case 3: + if (tag !== 29) { + break; + } + message.width = reader.float(); + continue; + case 4: + if (tag !== 37) { + break; + } + message.height = reader.float(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + Rect2.decode = decode; +})(Rect || (Rect = {})); + +// node_modules/@dcl/ecs/dist/components/generated/pb/decentraland/sdk/components/ui_background.gen.js +var BackgroundTextureMode; +(function(BackgroundTextureMode2) { + BackgroundTextureMode2[BackgroundTextureMode2["NINE_SLICES"] = 0] = "NINE_SLICES"; + BackgroundTextureMode2[BackgroundTextureMode2["CENTER"] = 1] = "CENTER"; + BackgroundTextureMode2[BackgroundTextureMode2["STRETCH"] = 2] = "STRETCH"; +})(BackgroundTextureMode || (BackgroundTextureMode = {})); +function createBasePBUiBackground() { + return { color: void 0, texture: void 0, textureMode: 0, textureSlices: void 0, uvs: [] }; +} +var PBUiBackground; +(function(PBUiBackground2) { + function encode(message, writer = import_minimal31.default.Writer.create()) { + if (message.color !== void 0) { + Color4.encode(message.color, writer.uint32(10).fork()).ldelim(); + } + if (message.texture !== void 0) { + TextureUnion.encode(message.texture, writer.uint32(18).fork()).ldelim(); + } + if (message.textureMode !== 0) { + writer.uint32(24).int32(message.textureMode); + } + if (message.textureSlices !== void 0) { + BorderRect.encode(message.textureSlices, writer.uint32(34).fork()).ldelim(); + } + writer.uint32(42).fork(); + for (const v of message.uvs) { + writer.float(v); + } + writer.ldelim(); + return writer; + } + PBUiBackground2.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal31.default.Reader ? input : import_minimal31.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBasePBUiBackground(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + message.color = Color4.decode(reader, reader.uint32()); + continue; + case 2: + if (tag !== 18) { + break; + } + message.texture = TextureUnion.decode(reader, reader.uint32()); + continue; + case 3: + if (tag !== 24) { + break; + } + message.textureMode = reader.int32(); + continue; + case 4: + if (tag !== 34) { + break; + } + message.textureSlices = BorderRect.decode(reader, reader.uint32()); + continue; + case 5: + if (tag === 45) { + message.uvs.push(reader.float()); + continue; + } + if (tag === 42) { + const end2 = reader.uint32() + reader.pos; + while (reader.pos < end2) { + message.uvs.push(reader.float()); + } + continue; + } + break; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + PBUiBackground2.decode = decode; +})(PBUiBackground || (PBUiBackground = {})); + +// node_modules/@dcl/ecs/dist/components/generated/UiBackground.gen.js +var UiBackgroundSchema = { + COMPONENT_ID: 1053, + serialize(value, builder) { + const writer = PBUiBackground.encode(value); + const buffer = new Uint8Array(writer.finish(), 0, writer.len); + builder.writeBuffer(buffer, false); + }, + deserialize(reader) { + return PBUiBackground.decode(reader.buffer(), reader.remainingBytes()); + }, + create() { + return PBUiBackground.decode(new Uint8Array()); + }, + jsonSchema: { + type: "object", + properties: {}, + serializationType: "protocol-buffer", + protocolBuffer: "PBUiBackground" + } +}; + +// node_modules/@dcl/ecs/dist/components/generated/pb/decentraland/sdk/components/ui_canvas_information.gen.js +var import_minimal32 = __toESM(require_minimal2()); +function createBasePBUiCanvasInformation() { + return { devicePixelRatio: 0, width: 0, height: 0, interactableArea: void 0 }; +} +var PBUiCanvasInformation; +(function(PBUiCanvasInformation2) { + function encode(message, writer = import_minimal32.default.Writer.create()) { + if (message.devicePixelRatio !== 0) { + writer.uint32(13).float(message.devicePixelRatio); + } + if (message.width !== 0) { + writer.uint32(16).int32(message.width); + } + if (message.height !== 0) { + writer.uint32(24).int32(message.height); + } + if (message.interactableArea !== void 0) { + BorderRect.encode(message.interactableArea, writer.uint32(34).fork()).ldelim(); + } + return writer; + } + PBUiCanvasInformation2.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal32.default.Reader ? input : import_minimal32.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBasePBUiCanvasInformation(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 13) { + break; + } + message.devicePixelRatio = reader.float(); + continue; + case 2: + if (tag !== 16) { + break; + } + message.width = reader.int32(); + continue; + case 3: + if (tag !== 24) { + break; + } + message.height = reader.int32(); + continue; + case 4: + if (tag !== 34) { + break; + } + message.interactableArea = BorderRect.decode(reader, reader.uint32()); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + PBUiCanvasInformation2.decode = decode; +})(PBUiCanvasInformation || (PBUiCanvasInformation = {})); + +// node_modules/@dcl/ecs/dist/components/generated/UiCanvasInformation.gen.js +var UiCanvasInformationSchema = { + COMPONENT_ID: 1054, + serialize(value, builder) { + const writer = PBUiCanvasInformation.encode(value); + const buffer = new Uint8Array(writer.finish(), 0, writer.len); + builder.writeBuffer(buffer, false); + }, + deserialize(reader) { + return PBUiCanvasInformation.decode(reader.buffer(), reader.remainingBytes()); + }, + create() { + return PBUiCanvasInformation.decode(new Uint8Array()); + }, + jsonSchema: { + type: "object", + properties: {}, + serializationType: "protocol-buffer", + protocolBuffer: "PBUiCanvasInformation" + } +}; + +// node_modules/@dcl/ecs/dist/components/generated/pb/decentraland/sdk/components/ui_dropdown.gen.js +var import_minimal33 = __toESM(require_minimal2()); +function createBasePBUiDropdown() { + return { + acceptEmpty: false, + emptyLabel: void 0, + options: [], + selectedIndex: void 0, + disabled: false, + color: void 0, + textAlign: void 0, + font: void 0, + fontSize: void 0 + }; +} +var PBUiDropdown; +(function(PBUiDropdown2) { + function encode(message, writer = import_minimal33.default.Writer.create()) { + if (message.acceptEmpty === true) { + writer.uint32(8).bool(message.acceptEmpty); + } + if (message.emptyLabel !== void 0) { + writer.uint32(18).string(message.emptyLabel); + } + for (const v of message.options) { + writer.uint32(26).string(v); + } + if (message.selectedIndex !== void 0) { + writer.uint32(32).int32(message.selectedIndex); + } + if (message.disabled === true) { + writer.uint32(40).bool(message.disabled); + } + if (message.color !== void 0) { + Color4.encode(message.color, writer.uint32(50).fork()).ldelim(); + } + if (message.textAlign !== void 0) { + writer.uint32(80).int32(message.textAlign); + } + if (message.font !== void 0) { + writer.uint32(88).int32(message.font); + } + if (message.fontSize !== void 0) { + writer.uint32(96).int32(message.fontSize); + } + return writer; + } + PBUiDropdown2.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal33.default.Reader ? input : import_minimal33.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBasePBUiDropdown(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 8) { + break; + } + message.acceptEmpty = reader.bool(); + continue; + case 2: + if (tag !== 18) { + break; + } + message.emptyLabel = reader.string(); + continue; + case 3: + if (tag !== 26) { + break; + } + message.options.push(reader.string()); + continue; + case 4: + if (tag !== 32) { + break; + } + message.selectedIndex = reader.int32(); + continue; + case 5: + if (tag !== 40) { + break; + } + message.disabled = reader.bool(); + continue; + case 6: + if (tag !== 50) { + break; + } + message.color = Color4.decode(reader, reader.uint32()); + continue; + case 10: + if (tag !== 80) { + break; + } + message.textAlign = reader.int32(); + continue; + case 11: + if (tag !== 88) { + break; + } + message.font = reader.int32(); + continue; + case 12: + if (tag !== 96) { + break; + } + message.fontSize = reader.int32(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + PBUiDropdown2.decode = decode; +})(PBUiDropdown || (PBUiDropdown = {})); + +// node_modules/@dcl/ecs/dist/components/generated/UiDropdown.gen.js +var UiDropdownSchema = { + COMPONENT_ID: 1094, + serialize(value, builder) { + const writer = PBUiDropdown.encode(value); + const buffer = new Uint8Array(writer.finish(), 0, writer.len); + builder.writeBuffer(buffer, false); + }, + deserialize(reader) { + return PBUiDropdown.decode(reader.buffer(), reader.remainingBytes()); + }, + create() { + return PBUiDropdown.decode(new Uint8Array()); + }, + jsonSchema: { + type: "object", + properties: {}, + serializationType: "protocol-buffer", + protocolBuffer: "PBUiDropdown" + } +}; + +// node_modules/@dcl/ecs/dist/components/generated/pb/decentraland/sdk/components/ui_dropdown_result.gen.js +var import_minimal34 = __toESM(require_minimal2()); +function createBasePBUiDropdownResult() { + return { value: 0 }; +} +var PBUiDropdownResult; +(function(PBUiDropdownResult2) { + function encode(message, writer = import_minimal34.default.Writer.create()) { + if (message.value !== 0) { + writer.uint32(8).int32(message.value); + } + return writer; + } + PBUiDropdownResult2.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal34.default.Reader ? input : import_minimal34.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBasePBUiDropdownResult(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 8) { + break; + } + message.value = reader.int32(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + PBUiDropdownResult2.decode = decode; +})(PBUiDropdownResult || (PBUiDropdownResult = {})); + +// node_modules/@dcl/ecs/dist/components/generated/UiDropdownResult.gen.js +var UiDropdownResultSchema = { + COMPONENT_ID: 1096, + serialize(value, builder) { + const writer = PBUiDropdownResult.encode(value); + const buffer = new Uint8Array(writer.finish(), 0, writer.len); + builder.writeBuffer(buffer, false); + }, + deserialize(reader) { + return PBUiDropdownResult.decode(reader.buffer(), reader.remainingBytes()); + }, + create() { + return PBUiDropdownResult.decode(new Uint8Array()); + }, + jsonSchema: { + type: "object", + properties: {}, + serializationType: "protocol-buffer", + protocolBuffer: "PBUiDropdownResult" + } +}; + +// node_modules/@dcl/ecs/dist/components/generated/pb/decentraland/sdk/components/ui_input.gen.js +var import_minimal35 = __toESM(require_minimal2()); +function createBasePBUiInput() { + return { + placeholder: "", + color: void 0, + placeholderColor: void 0, + disabled: false, + textAlign: void 0, + font: void 0, + fontSize: void 0, + value: void 0 + }; +} +var PBUiInput; +(function(PBUiInput2) { + function encode(message, writer = import_minimal35.default.Writer.create()) { + if (message.placeholder !== "") { + writer.uint32(10).string(message.placeholder); + } + if (message.color !== void 0) { + Color4.encode(message.color, writer.uint32(18).fork()).ldelim(); + } + if (message.placeholderColor !== void 0) { + Color4.encode(message.placeholderColor, writer.uint32(26).fork()).ldelim(); + } + if (message.disabled === true) { + writer.uint32(32).bool(message.disabled); + } + if (message.textAlign !== void 0) { + writer.uint32(80).int32(message.textAlign); + } + if (message.font !== void 0) { + writer.uint32(88).int32(message.font); + } + if (message.fontSize !== void 0) { + writer.uint32(96).int32(message.fontSize); + } + if (message.value !== void 0) { + writer.uint32(106).string(message.value); + } + return writer; + } + PBUiInput2.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal35.default.Reader ? input : import_minimal35.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBasePBUiInput(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + message.placeholder = reader.string(); + continue; + case 2: + if (tag !== 18) { + break; + } + message.color = Color4.decode(reader, reader.uint32()); + continue; + case 3: + if (tag !== 26) { + break; + } + message.placeholderColor = Color4.decode(reader, reader.uint32()); + continue; + case 4: + if (tag !== 32) { + break; + } + message.disabled = reader.bool(); + continue; + case 10: + if (tag !== 80) { + break; + } + message.textAlign = reader.int32(); + continue; + case 11: + if (tag !== 88) { + break; + } + message.font = reader.int32(); + continue; + case 12: + if (tag !== 96) { + break; + } + message.fontSize = reader.int32(); + continue; + case 13: + if (tag !== 106) { + break; + } + message.value = reader.string(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + PBUiInput2.decode = decode; +})(PBUiInput || (PBUiInput = {})); + +// node_modules/@dcl/ecs/dist/components/generated/UiInput.gen.js +var UiInputSchema = { + COMPONENT_ID: 1093, + serialize(value, builder) { + const writer = PBUiInput.encode(value); + const buffer = new Uint8Array(writer.finish(), 0, writer.len); + builder.writeBuffer(buffer, false); + }, + deserialize(reader) { + return PBUiInput.decode(reader.buffer(), reader.remainingBytes()); + }, + create() { + return PBUiInput.decode(new Uint8Array()); + }, + jsonSchema: { + type: "object", + properties: {}, + serializationType: "protocol-buffer", + protocolBuffer: "PBUiInput" + } +}; + +// node_modules/@dcl/ecs/dist/components/generated/pb/decentraland/sdk/components/ui_input_result.gen.js +var import_minimal36 = __toESM(require_minimal2()); +function createBasePBUiInputResult() { + return { value: "", isSubmit: void 0 }; +} +var PBUiInputResult; +(function(PBUiInputResult2) { + function encode(message, writer = import_minimal36.default.Writer.create()) { + if (message.value !== "") { + writer.uint32(10).string(message.value); + } + if (message.isSubmit !== void 0) { + writer.uint32(16).bool(message.isSubmit); + } + return writer; + } + PBUiInputResult2.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal36.default.Reader ? input : import_minimal36.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBasePBUiInputResult(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + message.value = reader.string(); + continue; + case 2: + if (tag !== 16) { + break; + } + message.isSubmit = reader.bool(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + PBUiInputResult2.decode = decode; +})(PBUiInputResult || (PBUiInputResult = {})); + +// node_modules/@dcl/ecs/dist/components/generated/UiInputResult.gen.js +var UiInputResultSchema = { + COMPONENT_ID: 1095, + serialize(value, builder) { + const writer = PBUiInputResult.encode(value); + const buffer = new Uint8Array(writer.finish(), 0, writer.len); + builder.writeBuffer(buffer, false); + }, + deserialize(reader) { + return PBUiInputResult.decode(reader.buffer(), reader.remainingBytes()); + }, + create() { + return PBUiInputResult.decode(new Uint8Array()); + }, + jsonSchema: { + type: "object", + properties: {}, + serializationType: "protocol-buffer", + protocolBuffer: "PBUiInputResult" + } +}; + +// node_modules/@dcl/ecs/dist/components/generated/pb/decentraland/sdk/components/ui_text.gen.js +var import_minimal37 = __toESM(require_minimal2()); +function createBasePBUiText() { + return { value: "", color: void 0, textAlign: void 0, font: void 0, fontSize: void 0 }; +} +var PBUiText; +(function(PBUiText2) { + function encode(message, writer = import_minimal37.default.Writer.create()) { + if (message.value !== "") { + writer.uint32(10).string(message.value); + } + if (message.color !== void 0) { + Color4.encode(message.color, writer.uint32(18).fork()).ldelim(); + } + if (message.textAlign !== void 0) { + writer.uint32(24).int32(message.textAlign); + } + if (message.font !== void 0) { + writer.uint32(32).int32(message.font); + } + if (message.fontSize !== void 0) { + writer.uint32(40).int32(message.fontSize); + } + return writer; + } + PBUiText2.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal37.default.Reader ? input : import_minimal37.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBasePBUiText(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + message.value = reader.string(); + continue; + case 2: + if (tag !== 18) { + break; + } + message.color = Color4.decode(reader, reader.uint32()); + continue; + case 3: + if (tag !== 24) { + break; + } + message.textAlign = reader.int32(); + continue; + case 4: + if (tag !== 32) { + break; + } + message.font = reader.int32(); + continue; + case 5: + if (tag !== 40) { + break; + } + message.fontSize = reader.int32(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + PBUiText2.decode = decode; +})(PBUiText || (PBUiText = {})); + +// node_modules/@dcl/ecs/dist/components/generated/UiText.gen.js +var UiTextSchema = { + COMPONENT_ID: 1052, + serialize(value, builder) { + const writer = PBUiText.encode(value); + const buffer = new Uint8Array(writer.finish(), 0, writer.len); + builder.writeBuffer(buffer, false); + }, + deserialize(reader) { + return PBUiText.decode(reader.buffer(), reader.remainingBytes()); + }, + create() { + return PBUiText.decode(new Uint8Array()); + }, + jsonSchema: { + type: "object", + properties: {}, + serializationType: "protocol-buffer", + protocolBuffer: "PBUiText" + } +}; + +// node_modules/@dcl/ecs/dist/components/generated/pb/decentraland/sdk/components/ui_transform.gen.js +var import_minimal38 = __toESM(require_minimal2()); +var YGPositionType; +(function(YGPositionType2) { + YGPositionType2[YGPositionType2["YGPT_RELATIVE"] = 0] = "YGPT_RELATIVE"; + YGPositionType2[YGPositionType2["YGPT_ABSOLUTE"] = 1] = "YGPT_ABSOLUTE"; +})(YGPositionType || (YGPositionType = {})); +var YGAlign; +(function(YGAlign2) { + YGAlign2[YGAlign2["YGA_AUTO"] = 0] = "YGA_AUTO"; + YGAlign2[YGAlign2["YGA_FLEX_START"] = 1] = "YGA_FLEX_START"; + YGAlign2[YGAlign2["YGA_CENTER"] = 2] = "YGA_CENTER"; + YGAlign2[YGAlign2["YGA_FLEX_END"] = 3] = "YGA_FLEX_END"; + YGAlign2[YGAlign2["YGA_STRETCH"] = 4] = "YGA_STRETCH"; + YGAlign2[YGAlign2["YGA_BASELINE"] = 5] = "YGA_BASELINE"; + YGAlign2[YGAlign2["YGA_SPACE_BETWEEN"] = 6] = "YGA_SPACE_BETWEEN"; + YGAlign2[YGAlign2["YGA_SPACE_AROUND"] = 7] = "YGA_SPACE_AROUND"; +})(YGAlign || (YGAlign = {})); +var YGUnit; +(function(YGUnit2) { + YGUnit2[YGUnit2["YGU_UNDEFINED"] = 0] = "YGU_UNDEFINED"; + YGUnit2[YGUnit2["YGU_POINT"] = 1] = "YGU_POINT"; + YGUnit2[YGUnit2["YGU_PERCENT"] = 2] = "YGU_PERCENT"; + YGUnit2[YGUnit2["YGU_AUTO"] = 3] = "YGU_AUTO"; +})(YGUnit || (YGUnit = {})); +var YGFlexDirection; +(function(YGFlexDirection2) { + YGFlexDirection2[YGFlexDirection2["YGFD_ROW"] = 0] = "YGFD_ROW"; + YGFlexDirection2[YGFlexDirection2["YGFD_COLUMN"] = 1] = "YGFD_COLUMN"; + YGFlexDirection2[YGFlexDirection2["YGFD_COLUMN_REVERSE"] = 2] = "YGFD_COLUMN_REVERSE"; + YGFlexDirection2[YGFlexDirection2["YGFD_ROW_REVERSE"] = 3] = "YGFD_ROW_REVERSE"; +})(YGFlexDirection || (YGFlexDirection = {})); +var YGWrap; +(function(YGWrap2) { + YGWrap2[YGWrap2["YGW_NO_WRAP"] = 0] = "YGW_NO_WRAP"; + YGWrap2[YGWrap2["YGW_WRAP"] = 1] = "YGW_WRAP"; + YGWrap2[YGWrap2["YGW_WRAP_REVERSE"] = 2] = "YGW_WRAP_REVERSE"; +})(YGWrap || (YGWrap = {})); +var YGJustify; +(function(YGJustify2) { + YGJustify2[YGJustify2["YGJ_FLEX_START"] = 0] = "YGJ_FLEX_START"; + YGJustify2[YGJustify2["YGJ_CENTER"] = 1] = "YGJ_CENTER"; + YGJustify2[YGJustify2["YGJ_FLEX_END"] = 2] = "YGJ_FLEX_END"; + YGJustify2[YGJustify2["YGJ_SPACE_BETWEEN"] = 3] = "YGJ_SPACE_BETWEEN"; + YGJustify2[YGJustify2["YGJ_SPACE_AROUND"] = 4] = "YGJ_SPACE_AROUND"; + YGJustify2[YGJustify2["YGJ_SPACE_EVENLY"] = 5] = "YGJ_SPACE_EVENLY"; +})(YGJustify || (YGJustify = {})); +var YGOverflow; +(function(YGOverflow2) { + YGOverflow2[YGOverflow2["YGO_VISIBLE"] = 0] = "YGO_VISIBLE"; + YGOverflow2[YGOverflow2["YGO_HIDDEN"] = 1] = "YGO_HIDDEN"; + YGOverflow2[YGOverflow2["YGO_SCROLL"] = 2] = "YGO_SCROLL"; +})(YGOverflow || (YGOverflow = {})); +var YGDisplay; +(function(YGDisplay2) { + YGDisplay2[YGDisplay2["YGD_FLEX"] = 0] = "YGD_FLEX"; + YGDisplay2[YGDisplay2["YGD_NONE"] = 1] = "YGD_NONE"; +})(YGDisplay || (YGDisplay = {})); +var YGEdge; +(function(YGEdge2) { + YGEdge2[YGEdge2["YGE_LEFT"] = 0] = "YGE_LEFT"; + YGEdge2[YGEdge2["YGE_TOP"] = 1] = "YGE_TOP"; + YGEdge2[YGEdge2["YGE_RIGHT"] = 2] = "YGE_RIGHT"; + YGEdge2[YGEdge2["YGE_BOTTOM"] = 3] = "YGE_BOTTOM"; + YGEdge2[YGEdge2["YGE_START"] = 4] = "YGE_START"; + YGEdge2[YGEdge2["YGE_END"] = 5] = "YGE_END"; + YGEdge2[YGEdge2["YGE_HORIZONTAL"] = 6] = "YGE_HORIZONTAL"; + YGEdge2[YGEdge2["YGE_VERTICAL"] = 7] = "YGE_VERTICAL"; + YGEdge2[YGEdge2["YGE_ALL"] = 8] = "YGE_ALL"; +})(YGEdge || (YGEdge = {})); +var PointerFilterMode; +(function(PointerFilterMode2) { + PointerFilterMode2[PointerFilterMode2["PFM_NONE"] = 0] = "PFM_NONE"; + PointerFilterMode2[PointerFilterMode2["PFM_BLOCK"] = 1] = "PFM_BLOCK"; +})(PointerFilterMode || (PointerFilterMode = {})); +function createBasePBUiTransform() { + return { + parent: 0, + rightOf: 0, + alignContent: void 0, + alignItems: void 0, + flexWrap: void 0, + flexShrink: void 0, + positionType: 0, + alignSelf: 0, + flexDirection: 0, + justifyContent: 0, + overflow: 0, + display: 0, + flexBasisUnit: 0, + flexBasis: 0, + flexGrow: 0, + widthUnit: 0, + width: 0, + heightUnit: 0, + height: 0, + minWidthUnit: 0, + minWidth: 0, + minHeightUnit: 0, + minHeight: 0, + maxWidthUnit: 0, + maxWidth: 0, + maxHeightUnit: 0, + maxHeight: 0, + positionLeftUnit: 0, + positionLeft: 0, + positionTopUnit: 0, + positionTop: 0, + positionRightUnit: 0, + positionRight: 0, + positionBottomUnit: 0, + positionBottom: 0, + marginLeftUnit: 0, + marginLeft: 0, + marginTopUnit: 0, + marginTop: 0, + marginRightUnit: 0, + marginRight: 0, + marginBottomUnit: 0, + marginBottom: 0, + paddingLeftUnit: 0, + paddingLeft: 0, + paddingTopUnit: 0, + paddingTop: 0, + paddingRightUnit: 0, + paddingRight: 0, + paddingBottomUnit: 0, + paddingBottom: 0, + pointerFilter: void 0 + }; +} +var PBUiTransform; +(function(PBUiTransform2) { + function encode(message, writer = import_minimal38.default.Writer.create()) { + if (message.parent !== 0) { + writer.uint32(8).int32(message.parent); + } + if (message.rightOf !== 0) { + writer.uint32(16).int32(message.rightOf); + } + if (message.alignContent !== void 0) { + writer.uint32(24).int32(message.alignContent); + } + if (message.alignItems !== void 0) { + writer.uint32(32).int32(message.alignItems); + } + if (message.flexWrap !== void 0) { + writer.uint32(40).int32(message.flexWrap); + } + if (message.flexShrink !== void 0) { + writer.uint32(53).float(message.flexShrink); + } + if (message.positionType !== 0) { + writer.uint32(56).int32(message.positionType); + } + if (message.alignSelf !== 0) { + writer.uint32(64).int32(message.alignSelf); + } + if (message.flexDirection !== 0) { + writer.uint32(72).int32(message.flexDirection); + } + if (message.justifyContent !== 0) { + writer.uint32(80).int32(message.justifyContent); + } + if (message.overflow !== 0) { + writer.uint32(88).int32(message.overflow); + } + if (message.display !== 0) { + writer.uint32(96).int32(message.display); + } + if (message.flexBasisUnit !== 0) { + writer.uint32(104).int32(message.flexBasisUnit); + } + if (message.flexBasis !== 0) { + writer.uint32(117).float(message.flexBasis); + } + if (message.flexGrow !== 0) { + writer.uint32(125).float(message.flexGrow); + } + if (message.widthUnit !== 0) { + writer.uint32(128).int32(message.widthUnit); + } + if (message.width !== 0) { + writer.uint32(141).float(message.width); + } + if (message.heightUnit !== 0) { + writer.uint32(144).int32(message.heightUnit); + } + if (message.height !== 0) { + writer.uint32(157).float(message.height); + } + if (message.minWidthUnit !== 0) { + writer.uint32(160).int32(message.minWidthUnit); + } + if (message.minWidth !== 0) { + writer.uint32(173).float(message.minWidth); + } + if (message.minHeightUnit !== 0) { + writer.uint32(176).int32(message.minHeightUnit); + } + if (message.minHeight !== 0) { + writer.uint32(189).float(message.minHeight); + } + if (message.maxWidthUnit !== 0) { + writer.uint32(192).int32(message.maxWidthUnit); + } + if (message.maxWidth !== 0) { + writer.uint32(205).float(message.maxWidth); + } + if (message.maxHeightUnit !== 0) { + writer.uint32(208).int32(message.maxHeightUnit); + } + if (message.maxHeight !== 0) { + writer.uint32(221).float(message.maxHeight); + } + if (message.positionLeftUnit !== 0) { + writer.uint32(224).int32(message.positionLeftUnit); + } + if (message.positionLeft !== 0) { + writer.uint32(237).float(message.positionLeft); + } + if (message.positionTopUnit !== 0) { + writer.uint32(240).int32(message.positionTopUnit); + } + if (message.positionTop !== 0) { + writer.uint32(253).float(message.positionTop); + } + if (message.positionRightUnit !== 0) { + writer.uint32(256).int32(message.positionRightUnit); + } + if (message.positionRight !== 0) { + writer.uint32(269).float(message.positionRight); + } + if (message.positionBottomUnit !== 0) { + writer.uint32(272).int32(message.positionBottomUnit); + } + if (message.positionBottom !== 0) { + writer.uint32(285).float(message.positionBottom); + } + if (message.marginLeftUnit !== 0) { + writer.uint32(288).int32(message.marginLeftUnit); + } + if (message.marginLeft !== 0) { + writer.uint32(301).float(message.marginLeft); + } + if (message.marginTopUnit !== 0) { + writer.uint32(304).int32(message.marginTopUnit); + } + if (message.marginTop !== 0) { + writer.uint32(317).float(message.marginTop); + } + if (message.marginRightUnit !== 0) { + writer.uint32(320).int32(message.marginRightUnit); + } + if (message.marginRight !== 0) { + writer.uint32(333).float(message.marginRight); + } + if (message.marginBottomUnit !== 0) { + writer.uint32(336).int32(message.marginBottomUnit); + } + if (message.marginBottom !== 0) { + writer.uint32(349).float(message.marginBottom); + } + if (message.paddingLeftUnit !== 0) { + writer.uint32(352).int32(message.paddingLeftUnit); + } + if (message.paddingLeft !== 0) { + writer.uint32(365).float(message.paddingLeft); + } + if (message.paddingTopUnit !== 0) { + writer.uint32(368).int32(message.paddingTopUnit); + } + if (message.paddingTop !== 0) { + writer.uint32(381).float(message.paddingTop); + } + if (message.paddingRightUnit !== 0) { + writer.uint32(384).int32(message.paddingRightUnit); + } + if (message.paddingRight !== 0) { + writer.uint32(397).float(message.paddingRight); + } + if (message.paddingBottomUnit !== 0) { + writer.uint32(400).int32(message.paddingBottomUnit); + } + if (message.paddingBottom !== 0) { + writer.uint32(413).float(message.paddingBottom); + } + if (message.pointerFilter !== void 0) { + writer.uint32(416).int32(message.pointerFilter); + } + return writer; + } + PBUiTransform2.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal38.default.Reader ? input : import_minimal38.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBasePBUiTransform(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 8) { + break; + } + message.parent = reader.int32(); + continue; + case 2: + if (tag !== 16) { + break; + } + message.rightOf = reader.int32(); + continue; + case 3: + if (tag !== 24) { + break; + } + message.alignContent = reader.int32(); + continue; + case 4: + if (tag !== 32) { + break; + } + message.alignItems = reader.int32(); + continue; + case 5: + if (tag !== 40) { + break; + } + message.flexWrap = reader.int32(); + continue; + case 6: + if (tag !== 53) { + break; + } + message.flexShrink = reader.float(); + continue; + case 7: + if (tag !== 56) { + break; + } + message.positionType = reader.int32(); + continue; + case 8: + if (tag !== 64) { + break; + } + message.alignSelf = reader.int32(); + continue; + case 9: + if (tag !== 72) { + break; + } + message.flexDirection = reader.int32(); + continue; + case 10: + if (tag !== 80) { + break; + } + message.justifyContent = reader.int32(); + continue; + case 11: + if (tag !== 88) { + break; + } + message.overflow = reader.int32(); + continue; + case 12: + if (tag !== 96) { + break; + } + message.display = reader.int32(); + continue; + case 13: + if (tag !== 104) { + break; + } + message.flexBasisUnit = reader.int32(); + continue; + case 14: + if (tag !== 117) { + break; + } + message.flexBasis = reader.float(); + continue; + case 15: + if (tag !== 125) { + break; + } + message.flexGrow = reader.float(); + continue; + case 16: + if (tag !== 128) { + break; + } + message.widthUnit = reader.int32(); + continue; + case 17: + if (tag !== 141) { + break; + } + message.width = reader.float(); + continue; + case 18: + if (tag !== 144) { + break; + } + message.heightUnit = reader.int32(); + continue; + case 19: + if (tag !== 157) { + break; + } + message.height = reader.float(); + continue; + case 20: + if (tag !== 160) { + break; + } + message.minWidthUnit = reader.int32(); + continue; + case 21: + if (tag !== 173) { + break; + } + message.minWidth = reader.float(); + continue; + case 22: + if (tag !== 176) { + break; + } + message.minHeightUnit = reader.int32(); + continue; + case 23: + if (tag !== 189) { + break; + } + message.minHeight = reader.float(); + continue; + case 24: + if (tag !== 192) { + break; + } + message.maxWidthUnit = reader.int32(); + continue; + case 25: + if (tag !== 205) { + break; + } + message.maxWidth = reader.float(); + continue; + case 26: + if (tag !== 208) { + break; + } + message.maxHeightUnit = reader.int32(); + continue; + case 27: + if (tag !== 221) { + break; + } + message.maxHeight = reader.float(); + continue; + case 28: + if (tag !== 224) { + break; + } + message.positionLeftUnit = reader.int32(); + continue; + case 29: + if (tag !== 237) { + break; + } + message.positionLeft = reader.float(); + continue; + case 30: + if (tag !== 240) { + break; + } + message.positionTopUnit = reader.int32(); + continue; + case 31: + if (tag !== 253) { + break; + } + message.positionTop = reader.float(); + continue; + case 32: + if (tag !== 256) { + break; + } + message.positionRightUnit = reader.int32(); + continue; + case 33: + if (tag !== 269) { + break; + } + message.positionRight = reader.float(); + continue; + case 34: + if (tag !== 272) { + break; + } + message.positionBottomUnit = reader.int32(); + continue; + case 35: + if (tag !== 285) { + break; + } + message.positionBottom = reader.float(); + continue; + case 36: + if (tag !== 288) { + break; + } + message.marginLeftUnit = reader.int32(); + continue; + case 37: + if (tag !== 301) { + break; + } + message.marginLeft = reader.float(); + continue; + case 38: + if (tag !== 304) { + break; + } + message.marginTopUnit = reader.int32(); + continue; + case 39: + if (tag !== 317) { + break; + } + message.marginTop = reader.float(); + continue; + case 40: + if (tag !== 320) { + break; + } + message.marginRightUnit = reader.int32(); + continue; + case 41: + if (tag !== 333) { + break; + } + message.marginRight = reader.float(); + continue; + case 42: + if (tag !== 336) { + break; + } + message.marginBottomUnit = reader.int32(); + continue; + case 43: + if (tag !== 349) { + break; + } + message.marginBottom = reader.float(); + continue; + case 44: + if (tag !== 352) { + break; + } + message.paddingLeftUnit = reader.int32(); + continue; + case 45: + if (tag !== 365) { + break; + } + message.paddingLeft = reader.float(); + continue; + case 46: + if (tag !== 368) { + break; + } + message.paddingTopUnit = reader.int32(); + continue; + case 47: + if (tag !== 381) { + break; + } + message.paddingTop = reader.float(); + continue; + case 48: + if (tag !== 384) { + break; + } + message.paddingRightUnit = reader.int32(); + continue; + case 49: + if (tag !== 397) { + break; + } + message.paddingRight = reader.float(); + continue; + case 50: + if (tag !== 400) { + break; + } + message.paddingBottomUnit = reader.int32(); + continue; + case 51: + if (tag !== 413) { + break; + } + message.paddingBottom = reader.float(); + continue; + case 52: + if (tag !== 416) { + break; + } + message.pointerFilter = reader.int32(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + PBUiTransform2.decode = decode; +})(PBUiTransform || (PBUiTransform = {})); + +// node_modules/@dcl/ecs/dist/components/generated/UiTransform.gen.js +var UiTransformSchema = { + COMPONENT_ID: 1050, + serialize(value, builder) { + const writer = PBUiTransform.encode(value); + const buffer = new Uint8Array(writer.finish(), 0, writer.len); + builder.writeBuffer(buffer, false); + }, + deserialize(reader) { + return PBUiTransform.decode(reader.buffer(), reader.remainingBytes()); + }, + create() { + return PBUiTransform.decode(new Uint8Array()); + }, + jsonSchema: { + type: "object", + properties: {}, + serializationType: "protocol-buffer", + protocolBuffer: "PBUiTransform" + } +}; + +// node_modules/@dcl/ecs/dist/components/generated/pb/decentraland/sdk/components/video_event.gen.js +var import_minimal39 = __toESM(require_minimal2()); +var VideoState; +(function(VideoState2) { + VideoState2[VideoState2["VS_NONE"] = 0] = "VS_NONE"; + VideoState2[VideoState2["VS_ERROR"] = 1] = "VS_ERROR"; + VideoState2[VideoState2["VS_LOADING"] = 2] = "VS_LOADING"; + VideoState2[VideoState2["VS_READY"] = 3] = "VS_READY"; + VideoState2[VideoState2["VS_PLAYING"] = 4] = "VS_PLAYING"; + VideoState2[VideoState2["VS_BUFFERING"] = 5] = "VS_BUFFERING"; + VideoState2[VideoState2["VS_SEEKING"] = 6] = "VS_SEEKING"; + VideoState2[VideoState2["VS_PAUSED"] = 7] = "VS_PAUSED"; +})(VideoState || (VideoState = {})); +function createBasePBVideoEvent() { + return { timestamp: 0, tickNumber: 0, currentOffset: 0, videoLength: 0, state: 0 }; +} +var PBVideoEvent; +(function(PBVideoEvent2) { + function encode(message, writer = import_minimal39.default.Writer.create()) { + if (message.timestamp !== 0) { + writer.uint32(8).uint32(message.timestamp); + } + if (message.tickNumber !== 0) { + writer.uint32(16).uint32(message.tickNumber); + } + if (message.currentOffset !== 0) { + writer.uint32(29).float(message.currentOffset); + } + if (message.videoLength !== 0) { + writer.uint32(37).float(message.videoLength); + } + if (message.state !== 0) { + writer.uint32(40).int32(message.state); + } + return writer; + } + PBVideoEvent2.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal39.default.Reader ? input : import_minimal39.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBasePBVideoEvent(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 8) { + break; + } + message.timestamp = reader.uint32(); + continue; + case 2: + if (tag !== 16) { + break; + } + message.tickNumber = reader.uint32(); + continue; + case 3: + if (tag !== 29) { + break; + } + message.currentOffset = reader.float(); + continue; + case 4: + if (tag !== 37) { + break; + } + message.videoLength = reader.float(); + continue; + case 5: + if (tag !== 40) { + break; + } + message.state = reader.int32(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + PBVideoEvent2.decode = decode; +})(PBVideoEvent || (PBVideoEvent = {})); + +// node_modules/@dcl/ecs/dist/components/generated/VideoEvent.gen.js +var VideoEventSchema = { + COMPONENT_ID: 1044, + serialize(value, builder) { + const writer = PBVideoEvent.encode(value); + const buffer = new Uint8Array(writer.finish(), 0, writer.len); + builder.writeBuffer(buffer, false); + }, + deserialize(reader) { + return PBVideoEvent.decode(reader.buffer(), reader.remainingBytes()); + }, + create() { + return PBVideoEvent.decode(new Uint8Array()); + }, + jsonSchema: { + type: "object", + properties: {}, + serializationType: "protocol-buffer", + protocolBuffer: "PBVideoEvent" + } +}; + +// node_modules/@dcl/ecs/dist/components/generated/pb/decentraland/sdk/components/video_player.gen.js +var import_minimal40 = __toESM(require_minimal2()); +function createBasePBVideoPlayer() { + return { + src: "", + playing: void 0, + position: void 0, + volume: void 0, + playbackRate: void 0, + loop: void 0 + }; +} +var PBVideoPlayer; +(function(PBVideoPlayer2) { + function encode(message, writer = import_minimal40.default.Writer.create()) { + if (message.src !== "") { + writer.uint32(10).string(message.src); + } + if (message.playing !== void 0) { + writer.uint32(16).bool(message.playing); + } + if (message.position !== void 0) { + writer.uint32(29).float(message.position); + } + if (message.volume !== void 0) { + writer.uint32(37).float(message.volume); + } + if (message.playbackRate !== void 0) { + writer.uint32(45).float(message.playbackRate); + } + if (message.loop !== void 0) { + writer.uint32(48).bool(message.loop); + } + return writer; + } + PBVideoPlayer2.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal40.default.Reader ? input : import_minimal40.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBasePBVideoPlayer(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + message.src = reader.string(); + continue; + case 2: + if (tag !== 16) { + break; + } + message.playing = reader.bool(); + continue; + case 3: + if (tag !== 29) { + break; + } + message.position = reader.float(); + continue; + case 4: + if (tag !== 37) { + break; + } + message.volume = reader.float(); + continue; + case 5: + if (tag !== 45) { + break; + } + message.playbackRate = reader.float(); + continue; + case 6: + if (tag !== 48) { + break; + } + message.loop = reader.bool(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + PBVideoPlayer2.decode = decode; +})(PBVideoPlayer || (PBVideoPlayer = {})); + +// node_modules/@dcl/ecs/dist/components/generated/VideoPlayer.gen.js +var VideoPlayerSchema = { + COMPONENT_ID: 1043, + serialize(value, builder) { + const writer = PBVideoPlayer.encode(value); + const buffer = new Uint8Array(writer.finish(), 0, writer.len); + builder.writeBuffer(buffer, false); + }, + deserialize(reader) { + return PBVideoPlayer.decode(reader.buffer(), reader.remainingBytes()); + }, + create() { + return PBVideoPlayer.decode(new Uint8Array()); + }, + jsonSchema: { + type: "object", + properties: {}, + serializationType: "protocol-buffer", + protocolBuffer: "PBVideoPlayer" + } +}; + +// node_modules/@dcl/ecs/dist/components/generated/pb/decentraland/sdk/components/visibility_component.gen.js +var import_minimal41 = __toESM(require_minimal2()); +function createBasePBVisibilityComponent() { + return { visible: void 0 }; +} +var PBVisibilityComponent; +(function(PBVisibilityComponent2) { + function encode(message, writer = import_minimal41.default.Writer.create()) { + if (message.visible !== void 0) { + writer.uint32(8).bool(message.visible); + } + return writer; + } + PBVisibilityComponent2.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal41.default.Reader ? input : import_minimal41.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBasePBVisibilityComponent(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 8) { + break; + } + message.visible = reader.bool(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + PBVisibilityComponent2.decode = decode; +})(PBVisibilityComponent || (PBVisibilityComponent = {})); + +// node_modules/@dcl/ecs/dist/components/generated/VisibilityComponent.gen.js +var VisibilityComponentSchema = { + COMPONENT_ID: 1081, + serialize(value, builder) { + const writer = PBVisibilityComponent.encode(value); + const buffer = new Uint8Array(writer.finish(), 0, writer.len); + builder.writeBuffer(buffer, false); + }, + deserialize(reader) { + return PBVisibilityComponent.decode(reader.buffer(), reader.remainingBytes()); + }, + create() { + return PBVisibilityComponent.decode(new Uint8Array()); + }, + jsonSchema: { + type: "object", + properties: {}, + serializationType: "protocol-buffer", + protocolBuffer: "PBVisibilityComponent" + } +}; + +// node_modules/@dcl/ecs/dist/components/generated/index.gen.js +var Animator = (engine2) => /* @__PURE__ */ engine2.defineComponentFromSchema("core::Animator", AnimatorSchema); +var AudioSource = (engine2) => /* @__PURE__ */ engine2.defineComponentFromSchema("core::AudioSource", AudioSourceSchema); +var AudioStream = (engine2) => /* @__PURE__ */ engine2.defineComponentFromSchema("core::AudioStream", AudioStreamSchema); +var AvatarAttach = (engine2) => /* @__PURE__ */ engine2.defineComponentFromSchema("core::AvatarAttach", AvatarAttachSchema); +var AvatarModifierArea = (engine2) => /* @__PURE__ */ engine2.defineComponentFromSchema("core::AvatarModifierArea", AvatarModifierAreaSchema); +var AvatarShape = (engine2) => /* @__PURE__ */ engine2.defineComponentFromSchema("core::AvatarShape", AvatarShapeSchema); +var Billboard = (engine2) => /* @__PURE__ */ engine2.defineComponentFromSchema("core::Billboard", BillboardSchema); +var CameraMode = (engine2) => /* @__PURE__ */ engine2.defineComponentFromSchema("core::CameraMode", CameraModeSchema); +var CameraModeArea = (engine2) => /* @__PURE__ */ engine2.defineComponentFromSchema("core::CameraModeArea", CameraModeAreaSchema); +var EngineInfo = (engine2) => /* @__PURE__ */ engine2.defineComponentFromSchema("core::EngineInfo", EngineInfoSchema); +var GltfContainer = (engine2) => /* @__PURE__ */ engine2.defineComponentFromSchema("core::GltfContainer", GltfContainerSchema); +var GltfContainerLoadingState = (engine2) => /* @__PURE__ */ engine2.defineComponentFromSchema("core::GltfContainerLoadingState", GltfContainerLoadingStateSchema); +var Material = (engine2) => /* @__PURE__ */ engine2.defineComponentFromSchema("core::Material", MaterialSchema); +var MeshCollider = (engine2) => /* @__PURE__ */ engine2.defineComponentFromSchema("core::MeshCollider", MeshColliderSchema); +var MeshRenderer = (engine2) => /* @__PURE__ */ engine2.defineComponentFromSchema("core::MeshRenderer", MeshRendererSchema); +var NftShape = (engine2) => /* @__PURE__ */ engine2.defineComponentFromSchema("core::NftShape", NftShapeSchema); +var PointerEvents = (engine2) => /* @__PURE__ */ engine2.defineComponentFromSchema("core::PointerEvents", PointerEventsSchema); +var PointerEventsResult = (engine2) => /* @__PURE__ */ engine2.defineValueSetComponentFromSchema("core::PointerEventsResult", PointerEventsResultSchema, { + timestampFunction: (t) => t.timestamp, + maxElements: 100 +}); +var PointerLock = (engine2) => /* @__PURE__ */ engine2.defineComponentFromSchema("core::PointerLock", PointerLockSchema); +var Raycast = (engine2) => /* @__PURE__ */ engine2.defineComponentFromSchema("core::Raycast", RaycastSchema); +var RaycastResult = (engine2) => /* @__PURE__ */ engine2.defineComponentFromSchema("core::RaycastResult", RaycastResultSchema); +var TextShape = (engine2) => /* @__PURE__ */ engine2.defineComponentFromSchema("core::TextShape", TextShapeSchema); +var Tween = (engine2) => /* @__PURE__ */ engine2.defineComponentFromSchema("core::Tween", TweenSchema); +var TweenSequence = (engine2) => /* @__PURE__ */ engine2.defineComponentFromSchema("core::TweenSequence", TweenSequenceSchema); +var TweenState = (engine2) => /* @__PURE__ */ engine2.defineComponentFromSchema("core::TweenState", TweenStateSchema); +var UiBackground = (engine2) => /* @__PURE__ */ engine2.defineComponentFromSchema("core::UiBackground", UiBackgroundSchema); +var UiCanvasInformation = (engine2) => /* @__PURE__ */ engine2.defineComponentFromSchema("core::UiCanvasInformation", UiCanvasInformationSchema); +var UiDropdown = (engine2) => /* @__PURE__ */ engine2.defineComponentFromSchema("core::UiDropdown", UiDropdownSchema); +var UiDropdownResult = (engine2) => /* @__PURE__ */ engine2.defineComponentFromSchema("core::UiDropdownResult", UiDropdownResultSchema); +var UiInput = (engine2) => /* @__PURE__ */ engine2.defineComponentFromSchema("core::UiInput", UiInputSchema); +var UiInputResult = (engine2) => /* @__PURE__ */ engine2.defineComponentFromSchema("core::UiInputResult", UiInputResultSchema); +var UiText = (engine2) => /* @__PURE__ */ engine2.defineComponentFromSchema("core::UiText", UiTextSchema); +var UiTransform = (engine2) => /* @__PURE__ */ engine2.defineComponentFromSchema("core::UiTransform", UiTransformSchema); +var VideoEvent = (engine2) => /* @__PURE__ */ engine2.defineValueSetComponentFromSchema("core::VideoEvent", VideoEventSchema, { + timestampFunction: (t) => t.timestamp, + maxElements: 100 +}); +var VideoPlayer = (engine2) => /* @__PURE__ */ engine2.defineComponentFromSchema("core::VideoPlayer", VideoPlayerSchema); +var VisibilityComponent = (engine2) => /* @__PURE__ */ engine2.defineComponentFromSchema("core::VisibilityComponent", VisibilityComponentSchema); +var componentDefinitionByName = { + "core::Animator": Animator, + "core::AudioSource": AudioSource, + "core::AudioStream": AudioStream, + "core::AvatarAttach": AvatarAttach, + "core::AvatarModifierArea": AvatarModifierArea, + "core::AvatarShape": AvatarShape, + "core::Billboard": Billboard, + "core::CameraMode": CameraMode, + "core::CameraModeArea": CameraModeArea, + "core::EngineInfo": EngineInfo, + "core::GltfContainer": GltfContainer, + "core::GltfContainerLoadingState": GltfContainerLoadingState, + "core::Material": Material, + "core::MeshCollider": MeshCollider, + "core::MeshRenderer": MeshRenderer, + "core::NftShape": NftShape, + "core::PointerEvents": PointerEvents, + "core::PointerEventsResult": PointerEventsResult, + "core::PointerLock": PointerLock, + "core::Raycast": Raycast, + "core::RaycastResult": RaycastResult, + "core::TextShape": TextShape, + "core::Tween": Tween, + "core::TweenSequence": TweenSequence, + "core::TweenState": TweenState, + "core::UiBackground": UiBackground, + "core::UiCanvasInformation": UiCanvasInformation, + "core::UiDropdown": UiDropdown, + "core::UiDropdownResult": UiDropdownResult, + "core::UiInput": UiInput, + "core::UiInputResult": UiInputResult, + "core::UiText": UiText, + "core::UiTransform": UiTransform, + "core::VideoEvent": VideoEvent, + "core::VideoPlayer": VideoPlayer, + "core::VisibilityComponent": VisibilityComponent +}; + +// node_modules/@dcl/ecs/dist/components/extended/Animator.js +function defineAnimatorComponent(engine2) { + const theComponent = Animator(engine2); + function getClipAndAnimator(entity, clipName) { + const anim = theComponent.getMutableOrNull(entity); + if (!anim) + return [null, null]; + const state = anim.states.find((item) => item.clip === clipName); + if (!state) + return [anim, null]; + return [anim, state]; + } + return { + ...theComponent, + getClipOrNull(entity, clipName) { + const [_, state] = getClipAndAnimator(entity, clipName); + return state; + }, + getClip(entity, clipName) { + const [animator, state] = getClipAndAnimator(entity, clipName); + if (!animator) { + throw new Error(`There is no Animator found in the entity ${entity}`); + } + if (!state) { + throw new Error(`The Animator component of ${entity} has no the state ${clipName}`); + } + return state; + }, + playSingleAnimation(entity, clipName, shouldReset = true) { + const [animator, state] = getClipAndAnimator(entity, clipName); + if (!animator || !state) + return false; + for (const state2 of animator.states) { + state2.playing = false; + state2.shouldReset = true; + } + state.playing = true; + state.shouldReset = shouldReset; + return true; + }, + stopAllAnimations(entity, resetCursor = true) { + const animator = theComponent.getMutableOrNull(entity); + if (!animator) + return false; + for (const state of animator.states) { + state.playing = false; + state.shouldReset = resetCursor; + } + return true; + } + }; +} + +// node_modules/@dcl/ecs/dist/components/extended/Material.js +var TextureHelper = { + Common(texture) { + return { + tex: { + $case: "texture", + texture + } + }; + }, + Avatar(avatarTexture) { + return { + tex: { + $case: "avatarTexture", + avatarTexture + } + }; + }, + Video(videoTexture) { + return { + tex: { + $case: "videoTexture", + videoTexture + } + }; + } +}; +function defineMaterialComponent(engine2) { + const theComponent = Material(engine2); + return { + ...theComponent, + Texture: TextureHelper, + setBasicMaterial(entity, material) { + theComponent.createOrReplace(entity, { + material: { + $case: "unlit", + unlit: material + } + }); + }, + setPbrMaterial(entity, material) { + theComponent.createOrReplace(entity, { + material: { + $case: "pbr", + pbr: material + } + }); + } + }; +} + +// node_modules/@dcl/ecs/dist/components/extended/MeshCollider.js +function defineMeshColliderComponent(engine2) { + const theComponent = MeshCollider(engine2); + function getCollisionMask(layers) { + if (Array.isArray(layers)) { + return layers.map((item) => item).reduce((prev, item) => prev | item, 0); + } else if (layers) { + return layers; + } + } + return { + ...theComponent, + setBox(entity, colliderLayers) { + theComponent.createOrReplace(entity, { + mesh: { $case: "box", box: {} }, + collisionMask: getCollisionMask(colliderLayers) + }); + }, + setPlane(entity, colliderLayers) { + theComponent.createOrReplace(entity, { + mesh: { $case: "plane", plane: {} }, + collisionMask: getCollisionMask(colliderLayers) + }); + }, + setCylinder(entity, radiusBottom, radiusTop, colliderLayers) { + theComponent.createOrReplace(entity, { + mesh: { $case: "cylinder", cylinder: { radiusBottom, radiusTop } }, + collisionMask: getCollisionMask(colliderLayers) + }); + }, + setSphere(entity, colliderLayers) { + theComponent.createOrReplace(entity, { + mesh: { $case: "sphere", sphere: {} }, + collisionMask: getCollisionMask(colliderLayers) + }); + } + }; +} + +// node_modules/@dcl/ecs/dist/components/extended/MeshRenderer.js +function defineMeshRendererComponent(engine2) { + const theComponent = MeshRenderer(engine2); + return { + ...theComponent, + setBox(entity, uvs) { + theComponent.createOrReplace(entity, { + mesh: { $case: "box", box: { uvs: uvs || [] } } + }); + }, + setPlane(entity, uvs) { + theComponent.createOrReplace(entity, { + mesh: { $case: "plane", plane: { uvs: uvs || [] } } + }); + }, + setCylinder(entity, radiusBottom, radiusTop) { + theComponent.createOrReplace(entity, { + mesh: { $case: "cylinder", cylinder: { radiusBottom, radiusTop } } + }); + }, + setSphere(entity) { + theComponent.createOrReplace(entity, { + mesh: { $case: "sphere", sphere: {} } + }); + } + }; +} + +// node_modules/@dcl/ecs/dist/components/extended/Tween.js +var TweenHelper = { + Move(move) { + return { + $case: "move", + move + }; + }, + Rotate(rotate) { + return { + $case: "rotate", + rotate + }; + }, + Scale(scale) { + return { + $case: "scale", + scale + }; + } +}; +function defineTweenComponent(engine2) { + const theComponent = Tween(engine2); + return { + ...theComponent, + Mode: TweenHelper + }; +} + +// node_modules/@dcl/ecs/dist/schemas/Array.js +var IArray = (type) => { + return { + serialize(value, builder) { + builder.writeUint32(value.length); + for (const item of value) { + type.serialize(item, builder); + } + }, + deserialize(reader) { + const newArray = []; + const length2 = reader.readUint32(); + for (let index = 0; index < length2; index++) { + newArray.push(type.deserialize(reader)); + } + return newArray; + }, + create() { + return []; + }, + jsonSchema: { + type: "array", + items: type.jsonSchema, + serializationType: "array" + } + }; +}; + +// node_modules/@dcl/ecs/dist/schemas/basic/Boolean.js +var Bool = { + serialize(value, builder) { + builder.writeInt8(value ? 1 : 0); + }, + deserialize(reader) { + return reader.readInt8() === 1; + }, + create() { + return false; + }, + jsonSchema: { + type: "boolean", + serializationType: "boolean" + } +}; + +// node_modules/@dcl/ecs/dist/schemas/basic/Integer.js +var Int64 = { + serialize(value, builder) { + builder.writeInt64(BigInt(value)); + }, + deserialize(reader) { + return Number(reader.readInt64()); + }, + create() { + return 0; + }, + jsonSchema: { + type: "integer", + serializationType: "int64" + } +}; +var Int32 = { + serialize(value, builder) { + builder.writeInt32(value); + }, + deserialize(reader) { + return reader.readInt32(); + }, + create() { + return 0; + }, + jsonSchema: { + type: "integer", + serializationType: "int32" + } +}; +var Int16 = { + serialize(value, builder) { + builder.writeInt16(value); + }, + deserialize(reader) { + return reader.readInt16(); + }, + create() { + return 0; + }, + jsonSchema: { + type: "integer", + serializationType: "int16" + } +}; +var Int8 = { + serialize(value, builder) { + builder.writeInt8(value); + }, + deserialize(reader) { + return reader.readInt8(); + }, + create() { + return 0; + }, + jsonSchema: { + type: "integer", + serializationType: "int8" + } +}; + +// node_modules/@dcl/ecs/dist/schemas/basic/String.js +var FlatString = { + serialize(value, builder) { + builder.writeUtf8String(value); + }, + deserialize(reader) { + return reader.readUtf8String(); + }, + create() { + return ""; + }, + jsonSchema: { + type: "string", + serializationType: "utf8-string" + } +}; +var EcsString = FlatString; + +// node_modules/@dcl/ecs/dist/schemas/basic/Enum.js +function validateMemberValuesAreNumbersAndInRangeInt32(enumValue) { + const MIN_VALUE2 = -(2 ** 31), MAX_VALUE2 = 2 ** 31 - 1; + let valueCount = 0, totalCount = 0; + for (const key in enumValue) { + if (typeof enumValue[key] === "number") { + if (enumValue[key] > MAX_VALUE2 || enumValue[key] < MIN_VALUE2) { + throw new Error(`Enum member values must be numbers within the range of ${MIN_VALUE2} to ${MAX_VALUE2}.`); + } + valueCount++; + } + totalCount++; + } + if (totalCount !== valueCount * 2) { + throw new Error("All enum member values must be of numeric type."); + } +} +function validateMemberValuesAreStrings(enumValue) { + for (const key in enumValue) { + if (typeof enumValue[key] !== "string") { + throw new Error("All enum member values must be of string type."); + } + } +} +var IntEnumReflectionType = "enum-int"; +var IntEnum = (enumObject, defaultValue) => { + validateMemberValuesAreNumbersAndInRangeInt32(enumObject); + return { + serialize(value, builder) { + Int32.serialize(value, builder); + }, + deserialize(reader) { + return Int32.deserialize(reader); + }, + create() { + return defaultValue; + }, + jsonSchema: { + // JSON-schema + type: "integer", + enum: Object.values(enumObject).filter((item) => Number.isInteger(item)), + default: defaultValue, + // @dcl/ecs Schema Spec + serializationType: IntEnumReflectionType, + enumObject + } + }; +}; +var StringEnumReflectionType = "enum-string"; +var StringEnum = (enumObject, defaultValue) => { + validateMemberValuesAreStrings(enumObject); + return { + serialize(value, builder) { + FlatString.serialize(value, builder); + }, + deserialize(reader) { + return FlatString.deserialize(reader); + }, + create() { + return defaultValue; + }, + jsonSchema: { + // JSON-schema + type: "string", + enum: Object.values(enumObject), + default: defaultValue, + // @dcl/ecs Schema Spec + serializationType: StringEnumReflectionType, + enumObject + } + }; +}; + +// node_modules/@dcl/ecs/dist/schemas/basic/Float.js +var Float32 = { + serialize(value, builder) { + builder.writeFloat32(value); + }, + deserialize(reader) { + return reader.readFloat32(); + }, + create() { + return 0; + }, + jsonSchema: { + type: "number", + serializationType: "float32" + } +}; +var Float64 = { + serialize(value, builder) { + builder.writeFloat64(value); + }, + deserialize(reader) { + return reader.readFloat64(); + }, + create() { + return 0; + }, + jsonSchema: { + type: "number", + serializationType: "float64" + } +}; + +// node_modules/@dcl/ecs/dist/schemas/custom/Color3.js +var Color3Schema = { + serialize(value, builder) { + builder.writeFloat32(value.r); + builder.writeFloat32(value.g); + builder.writeFloat32(value.b); + }, + deserialize(reader) { + return { + r: reader.readFloat32(), + g: reader.readFloat32(), + b: reader.readFloat32() + }; + }, + create() { + return { r: 0, g: 0, b: 0 }; + }, + jsonSchema: { + type: "object", + properties: { + r: { type: "number" }, + g: { type: "number" }, + b: { type: "number" } + }, + serializationType: "color3" + } +}; + +// node_modules/@dcl/ecs/dist/schemas/custom/Color4.js +var Color4Schema = { + serialize(value, builder) { + builder.writeFloat32(value.r); + builder.writeFloat32(value.g); + builder.writeFloat32(value.b); + builder.writeFloat32(value.a); + }, + deserialize(reader) { + return { + r: reader.readFloat32(), + g: reader.readFloat32(), + b: reader.readFloat32(), + a: reader.readFloat32() + }; + }, + create() { + return { r: 0, g: 0, b: 0, a: 0 }; + }, + jsonSchema: { + type: "object", + properties: { + r: { type: "number" }, + g: { type: "number" }, + b: { type: "number" }, + a: { type: "number" } + }, + serializationType: "color4" + } +}; + +// node_modules/@dcl/ecs/dist/schemas/custom/Entity.js +var EntitySchema = { + serialize(value, builder) { + builder.writeInt32(value); + }, + deserialize(reader) { + return reader.readInt32(); + }, + create() { + return 0; + }, + jsonSchema: { + type: "integer", + serializationType: "entity" + } +}; + +// node_modules/@dcl/ecs/dist/schemas/custom/Quaternion.js +var QuaternionSchema = { + serialize(value, builder) { + builder.writeFloat32(value.x); + builder.writeFloat32(value.y); + builder.writeFloat32(value.z); + builder.writeFloat32(value.w); + }, + deserialize(reader) { + return { + x: reader.readFloat32(), + y: reader.readFloat32(), + z: reader.readFloat32(), + w: reader.readFloat32() + }; + }, + create() { + return { x: 0, y: 0, z: 0, w: 0 }; + }, + jsonSchema: { + type: "object", + properties: { + x: { type: "number" }, + y: { type: "number" }, + z: { type: "number" }, + w: { type: "number" } + }, + serializationType: "quaternion" + } +}; + +// node_modules/@dcl/ecs/dist/schemas/custom/Vector3.js +var Vector3Schema = { + serialize(value, builder) { + builder.writeFloat32(value.x); + builder.writeFloat32(value.y); + builder.writeFloat32(value.z); + }, + deserialize(reader) { + return { + x: reader.readFloat32(), + y: reader.readFloat32(), + z: reader.readFloat32() + }; + }, + create() { + return { x: 0, y: 0, z: 0 }; + }, + jsonSchema: { + type: "object", + properties: { + x: { type: "number" }, + y: { type: "number" }, + z: { type: "number" }, + w: { type: "number" } + }, + serializationType: "vector3" + } +}; + +// node_modules/@dcl/ecs/dist/schemas/Map.js +var IMap = (spec, defaultValue) => { + const specReflection = Object.keys(spec).reduce((specReflection2, currentKey) => { + specReflection2[currentKey] = spec[currentKey].jsonSchema; + return specReflection2; + }, {}); + return { + serialize(value, builder) { + for (const key in spec) { + spec[key].serialize(value[key], builder); + } + }, + deserialize(reader) { + const newValue = {}; + for (const key in spec) { + ; + newValue[key] = spec[key].deserialize(reader); + } + return newValue; + }, + create() { + const newValue = {}; + for (const key in spec) { + ; + newValue[key] = spec[key].create(); + } + return { ...newValue, ...defaultValue }; + }, + extend: (base) => { + const newValue = {}; + for (const key in spec) { + ; + newValue[key] = spec[key].create(); + } + return { ...newValue, ...defaultValue, ...base }; + }, + jsonSchema: { + type: "object", + properties: specReflection, + serializationType: "map" + } + }; +}; + +// node_modules/@dcl/ecs/dist/schemas/Optional.js +var IOptional = (spec) => { + return { + serialize(value, builder) { + if (value) { + builder.writeInt8(1); + spec.serialize(value, builder); + } else { + builder.writeInt8(0); + } + }, + deserialize(reader) { + const exists = reader.readInt8(); + if (exists) { + return spec.deserialize(reader); + } + }, + create() { + return void 0; + }, + jsonSchema: { + type: spec.jsonSchema.type, + serializationType: "optional", + optionalJsonSchema: spec.jsonSchema + } + }; +}; + +// node_modules/@dcl/ecs/dist/schemas/OneOf.js +var IOneOf = (specs) => { + const specKeys = Object.keys(specs); + const keyToIndex = specKeys.reduce((dict, key, index) => { + dict[key] = index; + return dict; + }, {}); + const specReflection = specKeys.reduce((specReflection2, currentKey) => { + specReflection2[currentKey] = specs[currentKey].jsonSchema; + return specReflection2; + }, {}); + return { + serialize({ $case, value }, builder) { + const _value = keyToIndex[$case.toString()] + 1; + builder.writeUint8(_value); + specs[$case].serialize(value, builder); + }, + deserialize(reader) { + const $case = specKeys[reader.readInt8() - 1]; + const value = specs[$case].deserialize(reader); + return { $case, value }; + }, + create() { + return {}; + }, + jsonSchema: { + type: "object", + properties: specReflection, + serializationType: "one-of" + } + }; +}; + +// node_modules/@dcl/ecs/dist/schemas/buildSchema/utils.js +var isSchemaType = (value, types) => types.includes(value.serializationType); +var isOneOfJsonSchema = (type) => isSchemaType(type, ["one-of"]); +var getUnknownSchema = () => ({ + type: { type: "object", serializationType: "unknown" }, + value: void 0 +}); +var isCompoundType = (type) => isSchemaType(type, ["array", "map"]); +var getTypeAndValue = (properties, value, key) => { + const type = properties[key]; + const valueKey = value[key]; + if (isOneOfJsonSchema(type)) { + const typedMapValue = valueKey; + if (!typedMapValue.$case) + return getUnknownSchema(); + const propType = type.properties[typedMapValue.$case]; + if (isCompoundType(propType)) + value[key] = { [typedMapValue.$case]: typedMapValue.value }; + return { type: propType, value: typedMapValue.value }; + } + return { type, value: valueKey }; +}; + +// node_modules/@dcl/ecs/dist/schemas/buildSchema/index.js +var primitiveSchemas = { + [Bool.jsonSchema.serializationType]: Bool, + [EcsString.jsonSchema.serializationType]: EcsString, + [Float32.jsonSchema.serializationType]: Float32, + [Float64.jsonSchema.serializationType]: Float64, + [Int8.jsonSchema.serializationType]: Int8, + [Int16.jsonSchema.serializationType]: Int16, + [Int32.jsonSchema.serializationType]: Int32, + [Int64.jsonSchema.serializationType]: Int64, + [Vector3Schema.jsonSchema.serializationType]: Vector3Schema, + [QuaternionSchema.jsonSchema.serializationType]: QuaternionSchema, + [Color3Schema.jsonSchema.serializationType]: Color3Schema, + [Color4Schema.jsonSchema.serializationType]: Color4Schema, + [EntitySchema.jsonSchema.serializationType]: EntitySchema +}; +function jsonSchemaToSchema(jsonSchema) { + if (primitiveSchemas[jsonSchema.serializationType]) { + return primitiveSchemas[jsonSchema.serializationType]; + } + if (jsonSchema.serializationType === "map") { + const mapJsonSchema = jsonSchema; + const spec = {}; + for (const key in mapJsonSchema.properties) { + spec[key] = jsonSchemaToSchema(mapJsonSchema.properties[key]); + } + return IMap(spec); + } + if (jsonSchema.serializationType === "optional") { + const withItemsJsonSchema = jsonSchema; + return IOptional(jsonSchemaToSchema(withItemsJsonSchema.optionalJsonSchema)); + } + if (jsonSchema.serializationType === "array") { + const withItemsJsonSchema = jsonSchema; + return IArray(jsonSchemaToSchema(withItemsJsonSchema.items)); + } + if (jsonSchema.serializationType === "enum-int") { + const enumJsonSchema = jsonSchema; + return IntEnum(enumJsonSchema.enumObject, enumJsonSchema.default); + } + if (jsonSchema.serializationType === "enum-string") { + const enumJsonSchema = jsonSchema; + return StringEnum(enumJsonSchema.enumObject, enumJsonSchema.default); + } + if (jsonSchema.serializationType === "one-of") { + const oneOfJsonSchema = jsonSchema; + const spec = {}; + for (const key in oneOfJsonSchema.properties) { + spec[key] = jsonSchemaToSchema(oneOfJsonSchema.properties[key]); + } + return IOneOf(spec); + } + throw new Error(`${jsonSchema.serializationType} is not supported as reverse schema generation.`); +} +function mutateValues(jsonSchema, value, mutateFn) { + if (jsonSchema.serializationType === "map") { + const { properties } = jsonSchema; + const typedValue = value; + for (const key in properties) { + const { type, value: mapValue } = getTypeAndValue(properties, typedValue, key); + if (type.serializationType === "unknown") + continue; + if (isCompoundType(type)) { + mutateValues(type, mapValue, mutateFn); + } else { + const newValue = mutateFn(mapValue, type); + if (newValue.changed) { + typedValue[key] = newValue.value; + } + } + } + } else if (jsonSchema.serializationType === "array") { + const { items } = jsonSchema; + const arrayValue = value; + for (let i = 0, n = arrayValue.length; i < n; i++) { + const { type, value: value2 } = getTypeAndValue({ items }, { items: arrayValue[i] }, "items"); + if (isCompoundType(type)) { + mutateValues(type, value2, mutateFn); + } else { + const newValue = mutateFn(value2, type); + if (newValue.changed) { + arrayValue[i] = newValue.value; + } + } + } + } +} + +// node_modules/@dcl/ecs/dist/schemas/index.js +var Schemas; +(function(Schemas2) { + Schemas2.Boolean = Bool; + Schemas2.String = EcsString; + Schemas2.Float = Float32; + Schemas2.Double = Float64; + Schemas2.Byte = Int8; + Schemas2.Short = Int16; + Schemas2.Int = Int32; + Schemas2.Int64 = Int64; + Schemas2.Number = Float32; + Schemas2.Vector3 = Vector3Schema; + Schemas2.Quaternion = QuaternionSchema; + Schemas2.Color3 = Color3Schema; + Schemas2.Color4 = Color4Schema; + Schemas2.Entity = EntitySchema; + Schemas2.EnumNumber = IntEnum; + Schemas2.EnumString = StringEnum; + Schemas2.Array = IArray; + Schemas2.Map = IMap; + Schemas2.Optional = IOptional; + Schemas2.OneOf = IOneOf; + Schemas2.fromJson = jsonSchemaToSchema; + Schemas2.mutateNestedValues = mutateValues; +})(Schemas || (Schemas = {})); + +// node_modules/@dcl/ecs/dist/components/manual/Name.js +function defineNameComponent(engine2) { + const Name3 = engine2.defineComponent("core-schema::Name", { + value: Schemas.String + }); + return Name3; +} +var Name_default = defineNameComponent; + +// node_modules/@dcl/ecs/dist/components/manual/SyncComponents.js +function defineSyncComponents(engine2) { + const SyncComponents3 = engine2.defineComponent("core-schema::Sync-Components", { + componentIds: Schemas.Array(Schemas.Int64) + }); + return SyncComponents3; +} +var SyncComponents_default = defineSyncComponents; + +// node_modules/@dcl/ecs/dist/components/manual/NetworkEntity.js +function defineNetworkEntityComponent(engine2) { + const EntityNetwork = engine2.defineComponent("core-schema::Network-Entity", { + networkId: Schemas.Int64, + entityId: Schemas.Entity + }); + return EntityNetwork; +} +var NetworkEntity_default = defineNetworkEntityComponent; + +// node_modules/@dcl/ecs/dist/components/manual/NetworkParent.js +function defineNetworkParentComponent(engine2) { + const EntityNetwork = engine2.defineComponent("core-schema::Network-Parent", { + networkId: Schemas.Int64, + entityId: Schemas.Entity + }); + return EntityNetwork; +} +var NetworkParent_default = defineNetworkParentComponent; + +// node_modules/@dcl/ecs/dist/components/manual/Transform.js +var TRANSFORM_LENGTH = 44; +var TransformSchema = { + serialize(value, builder) { + const ptr = builder.incrementWriteOffset(TRANSFORM_LENGTH); + builder.setFloat32(ptr, value.position.x); + builder.setFloat32(ptr + 4, value.position.y); + builder.setFloat32(ptr + 8, value.position.z); + builder.setFloat32(ptr + 12, value.rotation.x); + builder.setFloat32(ptr + 16, value.rotation.y); + builder.setFloat32(ptr + 20, value.rotation.z); + builder.setFloat32(ptr + 24, value.rotation.w); + builder.setFloat32(ptr + 28, value.scale.x); + builder.setFloat32(ptr + 32, value.scale.y); + builder.setFloat32(ptr + 36, value.scale.z); + builder.setUint32(ptr + 40, value.parent || 0); + }, + deserialize(reader) { + const ptr = reader.incrementReadOffset(TRANSFORM_LENGTH); + return { + position: { + x: reader.getFloat32(ptr), + y: reader.getFloat32(ptr + 4), + z: reader.getFloat32(ptr + 8) + }, + rotation: { + x: reader.getFloat32(ptr + 12), + y: reader.getFloat32(ptr + 16), + z: reader.getFloat32(ptr + 20), + w: reader.getFloat32(ptr + 24) + }, + scale: { + x: reader.getFloat32(ptr + 28), + y: reader.getFloat32(ptr + 32), + z: reader.getFloat32(ptr + 36) + }, + parent: reader.getUint32(ptr + 40) + }; + }, + create() { + return { + position: { x: 0, y: 0, z: 0 }, + scale: { x: 1, y: 1, z: 1 }, + rotation: { x: 0, y: 0, z: 0, w: 1 }, + parent: 0 + }; + }, + extend(value) { + return { + position: { x: 0, y: 0, z: 0 }, + scale: { x: 1, y: 1, z: 1 }, + rotation: { x: 0, y: 0, z: 0, w: 1 }, + parent: 0, + ...value + }; + }, + jsonSchema: { + type: "object", + properties: { + position: { + type: "object", + properties: { + x: { type: "number" }, + y: { type: "number" }, + z: { type: "number" } + } + }, + scale: { + type: "object", + properties: { + x: { type: "number" }, + y: { type: "number" }, + z: { type: "number" } + } + }, + rotation: { + type: "object", + properties: { + x: { type: "number" }, + y: { type: "number" }, + z: { type: "number" }, + w: { type: "number" } + } + }, + parent: { type: "integer" } + }, + serializationType: "transform" + } +}; +function defineTransformComponent(engine2) { + const transformDef = engine2.defineComponentFromSchema("core::Transform", TransformSchema); + return { + ...transformDef, + create(entity, val) { + return transformDef.create(entity, TransformSchema.extend(val)); + }, + createOrReplace(entity, val) { + return transformDef.createOrReplace(entity, TransformSchema.extend(val)); + } + }; +} + +// node_modules/@dcl/ecs/dist/components/index.js +var Transform = (engine2) => defineTransformComponent(engine2); +var Material2 = (engine2) => defineMaterialComponent(engine2); +var Animator2 = (engine2) => defineAnimatorComponent(engine2); +var MeshRenderer2 = (engine2) => defineMeshRendererComponent(engine2); +var MeshCollider2 = (engine2) => defineMeshColliderComponent(engine2); +var Tween2 = (engine2) => defineTweenComponent(engine2); +var Name = (engine2) => Name_default(engine2); +var SyncComponents = (engine2) => SyncComponents_default(engine2); +var NetworkEntity = (engine2) => NetworkEntity_default(engine2); +var NetworkParent = (engine2) => NetworkParent_default(engine2); + +// node_modules/@dcl/ecs/dist/components/generated/component-names.gen.js +var coreComponentMappings = { + "core::Transform": 1, + "core::Animator": 1042, + "core::AudioSource": 1020, + "core::AudioStream": 1021, + "core::AvatarAttach": 1073, + "core::AvatarBase": 1087, + "core::AvatarEmoteCommand": 1088, + "core::AvatarEquippedData": 1091, + "core::AvatarModifierArea": 1070, + "core::AvatarShape": 1080, + "core::Billboard": 1090, + "core::CameraMode": 1072, + "core::CameraModeArea": 1071, + "core::EngineInfo": 1048, + "core::GltfContainer": 1041, + "core::GltfContainerLoadingState": 1049, + "core::Material": 1017, + "core::MeshCollider": 1019, + "core::MeshRenderer": 1018, + "core::NftShape": 1040, + "core::PlayerIdentityData": 1089, + "core::PointerEvents": 1062, + "core::PointerEventsResult": 1063, + "core::PointerLock": 1074, + "core::Raycast": 1067, + "core::RaycastResult": 1068, + "core::TextShape": 1030, + "core::Tween": 1102, + "core::TweenSequence": 1104, + "core::TweenState": 1103, + "core::UiBackground": 1053, + "core::UiCanvasInformation": 1054, + "core::UiDropdown": 1094, + "core::UiDropdownResult": 1096, + "core::UiInput": 1093, + "core::UiInputResult": 1095, + "core::UiText": 1052, + "core::UiTransform": 1050, + "core::VideoEvent": 1044, + "core::VideoPlayer": 1043, + "core::VisibilityComponent": 1081 +}; + +// node_modules/@dcl/ecs/dist/components/component-number.js +var utf8 = __toESM(require_utf8()); + +// node_modules/@dcl/ecs/dist/runtime/crc.js +var CRC_TABLE = new Int32Array([ + 0, + 1996959894, + 3993919788, + 2567524794, + 124634137, + 1886057615, + 3915621685, + 2657392035, + 249268274, + 2044508324, + 3772115230, + 2547177864, + 162941995, + 2125561021, + 3887607047, + 2428444049, + 498536548, + 1789927666, + 4089016648, + 2227061214, + 450548861, + 1843258603, + 4107580753, + 2211677639, + 325883990, + 1684777152, + 4251122042, + 2321926636, + 335633487, + 1661365465, + 4195302755, + 2366115317, + 997073096, + 1281953886, + 3579855332, + 2724688242, + 1006888145, + 1258607687, + 3524101629, + 2768942443, + 901097722, + 1119000684, + 3686517206, + 2898065728, + 853044451, + 1172266101, + 3705015759, + 2882616665, + 651767980, + 1373503546, + 3369554304, + 3218104598, + 565507253, + 1454621731, + 3485111705, + 3099436303, + 671266974, + 1594198024, + 3322730930, + 2970347812, + 795835527, + 1483230225, + 3244367275, + 3060149565, + 1994146192, + 31158534, + 2563907772, + 4023717930, + 1907459465, + 112637215, + 2680153253, + 3904427059, + 2013776290, + 251722036, + 2517215374, + 3775830040, + 2137656763, + 141376813, + 2439277719, + 3865271297, + 1802195444, + 476864866, + 2238001368, + 4066508878, + 1812370925, + 453092731, + 2181625025, + 4111451223, + 1706088902, + 314042704, + 2344532202, + 4240017532, + 1658658271, + 366619977, + 2362670323, + 4224994405, + 1303535960, + 984961486, + 2747007092, + 3569037538, + 1256170817, + 1037604311, + 2765210733, + 3554079995, + 1131014506, + 879679996, + 2909243462, + 3663771856, + 1141124467, + 855842277, + 2852801631, + 3708648649, + 1342533948, + 654459306, + 3188396048, + 3373015174, + 1466479909, + 544179635, + 3110523913, + 3462522015, + 1591671054, + 702138776, + 2966460450, + 3352799412, + 1504918807, + 783551873, + 3082640443, + 3233442989, + 3988292384, + 2596254646, + 62317068, + 1957810842, + 3939845945, + 2647816111, + 81470997, + 1943803523, + 3814918930, + 2489596804, + 225274430, + 2053790376, + 3826175755, + 2466906013, + 167816743, + 2097651377, + 4027552580, + 2265490386, + 503444072, + 1762050814, + 4150417245, + 2154129355, + 426522225, + 1852507879, + 4275313526, + 2312317920, + 282753626, + 1742555852, + 4189708143, + 2394877945, + 397917763, + 1622183637, + 3604390888, + 2714866558, + 953729732, + 1340076626, + 3518719985, + 2797360999, + 1068828381, + 1219638859, + 3624741850, + 2936675148, + 906185462, + 1090812512, + 3747672003, + 2825379669, + 829329135, + 1181335161, + 3412177804, + 3160834842, + 628085408, + 1382605366, + 3423369109, + 3138078467, + 570562233, + 1426400815, + 3317316542, + 2998733608, + 733239954, + 1555261956, + 3268935591, + 3050360625, + 752459403, + 1541320221, + 2607071920, + 3965973030, + 1969922972, + 40735498, + 2617837225, + 3943577151, + 1913087877, + 83908371, + 2512341634, + 3803740692, + 2075208622, + 213261112, + 2463272603, + 3855990285, + 2094854071, + 198958881, + 2262029012, + 4057260610, + 1759359992, + 534414190, + 2176718541, + 4139329115, + 1873836001, + 414664567, + 2282248934, + 4279200368, + 1711684554, + 285281116, + 2405801727, + 4167216745, + 1634467795, + 376229701, + 2685067896, + 3608007406, + 1308918612, + 956543938, + 2808555105, + 3495958263, + 1231636301, + 1047427035, + 2932959818, + 3654703836, + 1088359270, + 936918e3, + 2847714899, + 3736837829, + 1202900863, + 817233897, + 3183342108, + 3401237130, + 1404277552, + 615818150, + 3134207493, + 3453421203, + 1423857449, + 601450431, + 3009837614, + 3294710456, + 1567103746, + 711928724, + 3020668471, + 3272380065, + 1510334235, + 755167117 +]); +function _crc32(buf, previous) { + let crc = ~~previous ^ -1; + for (let n = 0; n < buf.length; n++) { + crc = CRC_TABLE[(crc ^ buf[n]) & 255] ^ crc >>> 8; + } + return crc ^ -1; +} +function unsignedCRC32(data, prev = 0) { + return _crc32(data, prev) >>> 0; +} + +// node_modules/@dcl/ecs/dist/components/component-number.js +var MAX_STATIC_COMPONENT = 1 << 11; +function componentNumberFromName(componentName) { + if (coreComponentMappings[componentName]) + return coreComponentMappings[componentName]; + const bytes = new Uint8Array(128); + utf8.write(componentName, bytes, 0); + return (unsignedCRC32(bytes) + MAX_STATIC_COMPONENT & 4294967295) >>> 0; +} + +// node_modules/@dcl/ecs/dist/runtime/invariant.js +var __DEV__ = true; +function checkNotThenable(t, error) { + if (__DEV__) { + if (t && typeof t === "object" && typeof t.then === "function") { + throw new Error(error); + } + } + return t; +} + +// node_modules/@dcl/ecs/dist/systems/crdt/gset.js +function createVersionGSet() { + const lastVersion = /* @__PURE__ */ new Map(); + return { + /** + * + * @param number + * @param version + * @returns + */ + addTo(number, version) { + if (version < 0) { + return false; + } + const currentValue = lastVersion.get(number); + if (currentValue !== void 0 && currentValue >= version) { + return true; + } + lastVersion.set(number, version); + return true; + }, + /** + * @returns the set with [number, version] of each value + */ + has(n, v) { + const currentValue = lastVersion.get(n); + if (currentValue !== void 0 && currentValue >= v) { + return true; + } + return false; + }, + /** + * Warning: this function returns the reference to the internal map, + * if you need to mutate some value, make a copy. + * For optimization purpose the copy isn't made here. + * + * @returns the map of number to version + */ + getMap() { + return lastVersion; + } + }; +} + +// node_modules/@dcl/ecs/dist/engine/entity.js +var MAX_U16 = 65535; +var MASK_UPPER_16_ON_32 = 4294901760; +var AMOUNT_VERSION_AVAILABLE = MAX_U16 + 1; +var MAX_ENTITY_NUMBER = MAX_U16; +var RESERVED_STATIC_ENTITIES = 512; +var RESERVED_LOCAL_ENTITIES = MAX_ENTITY_NUMBER; +var EntityUtils; +(function(EntityUtils2) { + function fromEntityId(entityId) { + return [(entityId & MAX_U16) >>> 0, ((entityId & MASK_UPPER_16_ON_32) >> 16 & MAX_U16) >>> 0]; + } + EntityUtils2.fromEntityId = fromEntityId; + function toEntityId(entityNumber, entityVersion) { + return (entityNumber & MAX_U16 | (entityVersion & MAX_U16) << 16) >>> 0; + } + EntityUtils2.toEntityId = toEntityId; +})(EntityUtils || (EntityUtils = {})); +var EntityState; +(function(EntityState2) { + EntityState2[EntityState2["Unknown"] = 0] = "Unknown"; + EntityState2[EntityState2["UsedEntity"] = 1] = "UsedEntity"; + EntityState2[EntityState2["Removed"] = 2] = "Removed"; + EntityState2[EntityState2["Reserved"] = 3] = "Reserved"; +})(EntityState || (EntityState = {})); +function EntityContainer() { + let entityCounter = RESERVED_STATIC_ENTITIES; + let networkEntityCounter; + let networkedEntitiesRange; + const usedEntities = /* @__PURE__ */ new Set(); + let toRemoveEntities = []; + const removedEntities = createVersionGSet(); + let localEntitiesAvailable = RESERVED_LOCAL_ENTITIES; + function setNetworkEntitiesRange(reservedLocalEntities, range) { + localEntitiesAvailable = reservedLocalEntities; + networkedEntitiesRange = range; + networkEntityCounter = range[0]; + } + function generateNewEntity(networked) { + if (entityCounter > MAX_ENTITY_NUMBER - 1) { + throw new Error(`It fails trying to generate an entity out of range ${MAX_ENTITY_NUMBER}.`); + } + if (networked && networkEntityCounter > networkedEntitiesRange[1]) { + throw new Error(`Max amount of network entities reached ${networkedEntitiesRange[1]} `); + } + if (!networked && entityCounter >= localEntitiesAvailable) { + throw new Error(`Max amount of local entities reached ${localEntitiesAvailable}`); + } + const entityNumber = networked ? networkEntityCounter++ : entityCounter++; + const entityVersion = removedEntities.getMap().has(entityNumber) ? removedEntities.getMap().get(entityNumber) + 1 : 0; + const entity = EntityUtils.toEntityId(entityNumber, entityVersion); + if (usedEntities.has(entity)) { + return generateNewEntity(); + } + usedEntities.add(entity); + return entity; + } + function generateEntity(networked) { + if (networked && !networkedEntitiesRange) { + throw new Error("Network entities ranged not initialized. Connect to a CRDT Server"); + } + const usedNetworkSize = (networkedEntitiesRange && [...usedEntities.values()].filter(($) => { + const [entityId] = EntityUtils.fromEntityId($); + return entityId >= networkedEntitiesRange[0] && entityId <= networkedEntitiesRange[1]; + }).length) ?? 0; + const usedSize = usedEntities.size - usedNetworkSize; + if (!networked && usedSize + RESERVED_STATIC_ENTITIES >= entityCounter) { + return generateNewEntity(networked); + } + if (networked && usedNetworkSize + networkedEntitiesRange[0] >= networkEntityCounter) { + return generateNewEntity(networked); + } + for (const [number, version] of removedEntities.getMap()) { + if (version < MAX_U16) { + if (networked && (number < networkedEntitiesRange[0] || number > networkedEntitiesRange[1])) + continue; + if (!networked && number >= localEntitiesAvailable) + continue; + const entity = EntityUtils.toEntityId(number, version + 1); + if (!usedEntities.has(entity) && !toRemoveEntities.includes(entity)) { + usedEntities.add(entity); + return entity; + } + } + } + return generateNewEntity(networked); + } + function removeEntity(entity) { + if (entity < RESERVED_STATIC_ENTITIES) + return false; + if (usedEntities.has(entity)) { + usedEntities.delete(entity); + toRemoveEntities.push(entity); + } else { + updateRemovedEntity(entity); + } + return true; + } + function releaseRemovedEntities() { + const arr = toRemoveEntities; + if (arr.length) { + toRemoveEntities = []; + for (const entity of arr) { + const [n, v] = EntityUtils.fromEntityId(entity); + removedEntities.addTo(n, v); + } + } + return arr; + } + function updateRemovedEntity(entity) { + const [n, v] = EntityUtils.fromEntityId(entity); + removedEntities.addTo(n, v); + for (let i = 0; i <= v; i++) { + usedEntities.delete(EntityUtils.toEntityId(n, i)); + } + return true; + } + function updateUsedEntity(entity) { + const [n, v] = EntityUtils.fromEntityId(entity); + if (removedEntities.has(n, v)) + return false; + if (v > 0) { + for (let i = 0; i <= v - 1; i++) { + usedEntities.delete(EntityUtils.toEntityId(n, i)); + } + removedEntities.addTo(n, v - 1); + } + usedEntities.add(entity); + return true; + } + function getEntityState(entity) { + const [n, v] = EntityUtils.fromEntityId(entity); + if (n < RESERVED_STATIC_ENTITIES) { + return EntityState.Reserved; + } + if (usedEntities.has(entity)) { + return EntityState.UsedEntity; + } + const removedVersion = removedEntities.getMap().get(n); + if (removedVersion !== void 0 && removedVersion >= v) { + return EntityState.Removed; + } + return EntityState.Unknown; + } + return { + setNetworkEntitiesRange, + generateEntity, + removeEntity, + getExistingEntities() { + return new Set(usedEntities); + }, + getEntityState, + releaseRemovedEntities, + updateRemovedEntity, + updateUsedEntity + }; +} + +// node_modules/@dcl/ecs/dist/serialization/ByteBuffer/index.js +var utf82 = __toESM(require_utf8()); +var __classPrivateFieldGet = function(receiver, state, kind, f) { + if (kind === "a" && !f) + throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) + throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); +}; +var _ReadWriteByteBuffer_instances; +var _ReadWriteByteBuffer_woAdd; +var _ReadWriteByteBuffer_roAdd; +function getNextSize(currentSize, intendedSize) { + const minNewSize = Math.max(currentSize, intendedSize) + 1024; + return Math.ceil(minNewSize / 1024) * 1024; +} +var defaultInitialCapacity = 10240; +var ReadWriteByteBuffer = class { + /** + * @param buffer - The initial buffer, provide a buffer if you need to set "initial capacity" + * @param readingOffset - Set the cursor where begins to read. Default 0 + * @param writingOffset - Set the cursor to not start writing from the begin of it. Defaults to the buffer size + */ + constructor(buffer, readingOffset, writingOffset) { + _ReadWriteByteBuffer_instances.add(this); + this._buffer = buffer || new Uint8Array(defaultInitialCapacity); + this.view = new DataView(this._buffer.buffer, this._buffer.byteOffset); + this.woffset = writingOffset ?? (buffer ? this._buffer.length : null) ?? 0; + this.roffset = readingOffset ?? 0; + } + buffer() { + return this._buffer; + } + bufferLength() { + return this._buffer.length; + } + resetBuffer() { + this.roffset = 0; + this.woffset = 0; + } + currentReadOffset() { + return this.roffset; + } + currentWriteOffset() { + return this.woffset; + } + incrementReadOffset(amount) { + return __classPrivateFieldGet(this, _ReadWriteByteBuffer_instances, "m", _ReadWriteByteBuffer_roAdd).call(this, amount); + } + remainingBytes() { + return this.woffset - this.roffset; + } + readFloat32() { + return this.view.getFloat32(__classPrivateFieldGet(this, _ReadWriteByteBuffer_instances, "m", _ReadWriteByteBuffer_roAdd).call(this, 4), true); + } + readFloat64() { + return this.view.getFloat64(__classPrivateFieldGet(this, _ReadWriteByteBuffer_instances, "m", _ReadWriteByteBuffer_roAdd).call(this, 8), true); + } + readInt8() { + return this.view.getInt8(__classPrivateFieldGet(this, _ReadWriteByteBuffer_instances, "m", _ReadWriteByteBuffer_roAdd).call(this, 1)); + } + readInt16() { + return this.view.getInt16(__classPrivateFieldGet(this, _ReadWriteByteBuffer_instances, "m", _ReadWriteByteBuffer_roAdd).call(this, 2), true); + } + readInt32() { + return this.view.getInt32(__classPrivateFieldGet(this, _ReadWriteByteBuffer_instances, "m", _ReadWriteByteBuffer_roAdd).call(this, 4), true); + } + readInt64() { + return this.view.getBigInt64(__classPrivateFieldGet(this, _ReadWriteByteBuffer_instances, "m", _ReadWriteByteBuffer_roAdd).call(this, 8), true); + } + readUint8() { + return this.view.getUint8(__classPrivateFieldGet(this, _ReadWriteByteBuffer_instances, "m", _ReadWriteByteBuffer_roAdd).call(this, 1)); + } + readUint16() { + return this.view.getUint16(__classPrivateFieldGet(this, _ReadWriteByteBuffer_instances, "m", _ReadWriteByteBuffer_roAdd).call(this, 2), true); + } + readUint32() { + return this.view.getUint32(__classPrivateFieldGet(this, _ReadWriteByteBuffer_instances, "m", _ReadWriteByteBuffer_roAdd).call(this, 4), true); + } + readUint64() { + return this.view.getBigUint64(__classPrivateFieldGet(this, _ReadWriteByteBuffer_instances, "m", _ReadWriteByteBuffer_roAdd).call(this, 8), true); + } + readBuffer() { + const length2 = this.view.getUint32(__classPrivateFieldGet(this, _ReadWriteByteBuffer_instances, "m", _ReadWriteByteBuffer_roAdd).call(this, 4), true); + return this._buffer.subarray(__classPrivateFieldGet(this, _ReadWriteByteBuffer_instances, "m", _ReadWriteByteBuffer_roAdd).call(this, length2), __classPrivateFieldGet(this, _ReadWriteByteBuffer_instances, "m", _ReadWriteByteBuffer_roAdd).call(this, 0)); + } + readUtf8String() { + const length2 = this.view.getUint32(__classPrivateFieldGet(this, _ReadWriteByteBuffer_instances, "m", _ReadWriteByteBuffer_roAdd).call(this, 4), true); + return utf82.read(this._buffer, __classPrivateFieldGet(this, _ReadWriteByteBuffer_instances, "m", _ReadWriteByteBuffer_roAdd).call(this, length2), __classPrivateFieldGet(this, _ReadWriteByteBuffer_instances, "m", _ReadWriteByteBuffer_roAdd).call(this, 0)); + } + incrementWriteOffset(amount) { + return __classPrivateFieldGet(this, _ReadWriteByteBuffer_instances, "m", _ReadWriteByteBuffer_woAdd).call(this, amount); + } + toBinary() { + return this._buffer.subarray(0, this.woffset); + } + toCopiedBinary() { + return new Uint8Array(this.toBinary()); + } + writeBuffer(value, writeLength = true) { + if (writeLength) { + this.writeUint32(value.byteLength); + } + const o = __classPrivateFieldGet(this, _ReadWriteByteBuffer_instances, "m", _ReadWriteByteBuffer_woAdd).call(this, value.byteLength); + this._buffer.set(value, o); + } + writeUtf8String(value, writeLength = true) { + const byteLength = utf82.length(value); + if (writeLength) { + this.writeUint32(byteLength); + } + const o = __classPrivateFieldGet(this, _ReadWriteByteBuffer_instances, "m", _ReadWriteByteBuffer_woAdd).call(this, byteLength); + utf82.write(value, this._buffer, o); + } + writeFloat32(value) { + const o = __classPrivateFieldGet(this, _ReadWriteByteBuffer_instances, "m", _ReadWriteByteBuffer_woAdd).call(this, 4); + this.view.setFloat32(o, value, true); + } + writeFloat64(value) { + const o = __classPrivateFieldGet(this, _ReadWriteByteBuffer_instances, "m", _ReadWriteByteBuffer_woAdd).call(this, 8); + this.view.setFloat64(o, value, true); + } + writeInt8(value) { + const o = __classPrivateFieldGet(this, _ReadWriteByteBuffer_instances, "m", _ReadWriteByteBuffer_woAdd).call(this, 1); + this.view.setInt8(o, value); + } + writeInt16(value) { + const o = __classPrivateFieldGet(this, _ReadWriteByteBuffer_instances, "m", _ReadWriteByteBuffer_woAdd).call(this, 2); + this.view.setInt16(o, value, true); + } + writeInt32(value) { + const o = __classPrivateFieldGet(this, _ReadWriteByteBuffer_instances, "m", _ReadWriteByteBuffer_woAdd).call(this, 4); + this.view.setInt32(o, value, true); + } + writeInt64(value) { + const o = __classPrivateFieldGet(this, _ReadWriteByteBuffer_instances, "m", _ReadWriteByteBuffer_woAdd).call(this, 8); + this.view.setBigInt64(o, value, true); + } + writeUint8(value) { + const o = __classPrivateFieldGet(this, _ReadWriteByteBuffer_instances, "m", _ReadWriteByteBuffer_woAdd).call(this, 1); + this.view.setUint8(o, value); + } + writeUint16(value) { + const o = __classPrivateFieldGet(this, _ReadWriteByteBuffer_instances, "m", _ReadWriteByteBuffer_woAdd).call(this, 2); + this.view.setUint16(o, value, true); + } + writeUint32(value) { + const o = __classPrivateFieldGet(this, _ReadWriteByteBuffer_instances, "m", _ReadWriteByteBuffer_woAdd).call(this, 4); + this.view.setUint32(o, value, true); + } + writeUint64(value) { + const o = __classPrivateFieldGet(this, _ReadWriteByteBuffer_instances, "m", _ReadWriteByteBuffer_woAdd).call(this, 8); + this.view.setBigUint64(o, value, true); + } + // DataView Proxy + getFloat32(offset) { + return this.view.getFloat32(offset, true); + } + getFloat64(offset) { + return this.view.getFloat64(offset, true); + } + getInt8(offset) { + return this.view.getInt8(offset); + } + getInt16(offset) { + return this.view.getInt16(offset, true); + } + getInt32(offset) { + return this.view.getInt32(offset, true); + } + getInt64(offset) { + return this.view.getBigInt64(offset, true); + } + getUint8(offset) { + return this.view.getUint8(offset); + } + getUint16(offset) { + return this.view.getUint16(offset, true); + } + getUint32(offset) { + return this.view.getUint32(offset, true); + } + getUint64(offset) { + return this.view.getBigUint64(offset, true); + } + setFloat32(offset, value) { + this.view.setFloat32(offset, value, true); + } + setFloat64(offset, value) { + this.view.setFloat64(offset, value, true); + } + setInt8(offset, value) { + this.view.setInt8(offset, value); + } + setInt16(offset, value) { + this.view.setInt16(offset, value, true); + } + setInt32(offset, value) { + this.view.setInt32(offset, value, true); + } + setInt64(offset, value) { + this.view.setBigInt64(offset, value, true); + } + setUint8(offset, value) { + this.view.setUint8(offset, value); + } + setUint16(offset, value) { + this.view.setUint16(offset, value, true); + } + setUint32(offset, value) { + this.view.setUint32(offset, value, true); + } + setUint64(offset, value) { + this.view.setBigUint64(offset, value, true); + } +}; +_ReadWriteByteBuffer_instances = /* @__PURE__ */ new WeakSet(), _ReadWriteByteBuffer_woAdd = function _ReadWriteByteBuffer_woAdd2(amount) { + if (this.woffset + amount > this._buffer.byteLength) { + const newsize = getNextSize(this._buffer.byteLength, this.woffset + amount); + const newBuffer = new Uint8Array(newsize); + newBuffer.set(this._buffer); + const oldOffset = this._buffer.byteOffset; + this._buffer = newBuffer; + this.view = new DataView(this._buffer.buffer, oldOffset); + } + this.woffset += amount; + return this.woffset - amount; +}, _ReadWriteByteBuffer_roAdd = function _ReadWriteByteBuffer_roAdd2(amount) { + if (this.roffset + amount > this.woffset) { + throw new Error("Outside of the bounds of writen data."); + } + this.roffset += amount; + return this.roffset - amount; +}; + +// node_modules/@dcl/ecs/dist/serialization/crdt/types.js +var CrdtMessageType; +(function(CrdtMessageType2) { + CrdtMessageType2[CrdtMessageType2["RESERVED"] = 0] = "RESERVED"; + CrdtMessageType2[CrdtMessageType2["PUT_COMPONENT"] = 1] = "PUT_COMPONENT"; + CrdtMessageType2[CrdtMessageType2["DELETE_COMPONENT"] = 2] = "DELETE_COMPONENT"; + CrdtMessageType2[CrdtMessageType2["DELETE_ENTITY"] = 3] = "DELETE_ENTITY"; + CrdtMessageType2[CrdtMessageType2["APPEND_VALUE"] = 4] = "APPEND_VALUE"; + CrdtMessageType2[CrdtMessageType2["PUT_COMPONENT_NETWORK"] = 5] = "PUT_COMPONENT_NETWORK"; + CrdtMessageType2[CrdtMessageType2["DELETE_COMPONENT_NETWORK"] = 6] = "DELETE_COMPONENT_NETWORK"; + CrdtMessageType2[CrdtMessageType2["DELETE_ENTITY_NETWORK"] = 7] = "DELETE_ENTITY_NETWORK"; + CrdtMessageType2[CrdtMessageType2["MAX_MESSAGE_TYPE"] = 8] = "MAX_MESSAGE_TYPE"; +})(CrdtMessageType || (CrdtMessageType = {})); +var CRDT_MESSAGE_HEADER_LENGTH = 8; +var ProcessMessageResultType; +(function(ProcessMessageResultType2) { + ProcessMessageResultType2[ProcessMessageResultType2["StateUpdatedTimestamp"] = 1] = "StateUpdatedTimestamp"; + ProcessMessageResultType2[ProcessMessageResultType2["StateOutdatedTimestamp"] = 2] = "StateOutdatedTimestamp"; + ProcessMessageResultType2[ProcessMessageResultType2["NoChanges"] = 3] = "NoChanges"; + ProcessMessageResultType2[ProcessMessageResultType2["StateOutdatedData"] = 4] = "StateOutdatedData"; + ProcessMessageResultType2[ProcessMessageResultType2["StateUpdatedData"] = 5] = "StateUpdatedData"; + ProcessMessageResultType2[ProcessMessageResultType2["EntityWasDeleted"] = 6] = "EntityWasDeleted"; + ProcessMessageResultType2[ProcessMessageResultType2["EntityDeleted"] = 7] = "EntityDeleted"; +})(ProcessMessageResultType || (ProcessMessageResultType = {})); + +// node_modules/@dcl/ecs/dist/serialization/crdt/crdtMessageProtocol.js +var CrdtMessageProtocol; +(function(CrdtMessageProtocol2) { + function validate(buf) { + const rem = buf.remainingBytes(); + if (rem < CRDT_MESSAGE_HEADER_LENGTH) { + return false; + } + const messageLength = buf.getUint32(buf.currentReadOffset()); + if (rem < messageLength) { + return false; + } + return true; + } + CrdtMessageProtocol2.validate = validate; + function readHeader(buf) { + if (!validate(buf)) { + return null; + } + return { + length: buf.readUint32(), + type: buf.readUint32() + }; + } + CrdtMessageProtocol2.readHeader = readHeader; + function getHeader(buf) { + if (!validate(buf)) { + return null; + } + const currentOffset = buf.currentReadOffset(); + return { + length: buf.getUint32(currentOffset), + type: buf.getUint32(currentOffset + 4) + }; + } + CrdtMessageProtocol2.getHeader = getHeader; + function consumeMessage(buf) { + const header = getHeader(buf); + if (!header) { + return false; + } + buf.incrementReadOffset(header.length); + return true; + } + CrdtMessageProtocol2.consumeMessage = consumeMessage; +})(CrdtMessageProtocol || (CrdtMessageProtocol = {})); + +// node_modules/@dcl/ecs/dist/serialization/crdt/deleteComponent.js +var DeleteComponent; +(function(DeleteComponent2) { + DeleteComponent2.MESSAGE_HEADER_LENGTH = 12; + function write3(entity, componentId, timestamp, buf) { + const messageLength = CRDT_MESSAGE_HEADER_LENGTH + DeleteComponent2.MESSAGE_HEADER_LENGTH; + const startMessageOffset = buf.incrementWriteOffset(messageLength); + buf.setUint32(startMessageOffset, messageLength); + buf.setUint32(startMessageOffset + 4, CrdtMessageType.DELETE_COMPONENT); + buf.setUint32(startMessageOffset + 8, entity); + buf.setUint32(startMessageOffset + 12, componentId); + buf.setUint32(startMessageOffset + 16, timestamp); + } + DeleteComponent2.write = write3; + function read2(buf) { + const header = CrdtMessageProtocol.readHeader(buf); + if (!header) { + return null; + } + if (header.type !== CrdtMessageType.DELETE_COMPONENT) { + throw new Error("DeleteComponentOperation tried to read another message type."); + } + const msg = { + ...header, + entityId: buf.readUint32(), + componentId: buf.readUint32(), + timestamp: buf.readUint32() + }; + return msg; + } + DeleteComponent2.read = read2; +})(DeleteComponent || (DeleteComponent = {})); + +// node_modules/@dcl/ecs/dist/serialization/crdt/appendValue.js +var AppendValueOperation; +(function(AppendValueOperation2) { + AppendValueOperation2.MESSAGE_HEADER_LENGTH = 16; + function write3(entity, timestamp, componentId, data, buf) { + const startMessageOffset = buf.incrementWriteOffset(CRDT_MESSAGE_HEADER_LENGTH + AppendValueOperation2.MESSAGE_HEADER_LENGTH); + buf.writeBuffer(data, false); + const messageLength = buf.currentWriteOffset() - startMessageOffset; + buf.setUint32(startMessageOffset, messageLength); + buf.setUint32(startMessageOffset + 4, CrdtMessageType.APPEND_VALUE); + buf.setUint32(startMessageOffset + 8, entity); + buf.setUint32(startMessageOffset + 12, componentId); + buf.setUint32(startMessageOffset + 16, timestamp); + const newLocal = messageLength - AppendValueOperation2.MESSAGE_HEADER_LENGTH - CRDT_MESSAGE_HEADER_LENGTH; + buf.setUint32(startMessageOffset + 20, newLocal); + } + AppendValueOperation2.write = write3; + function read2(buf) { + const header = CrdtMessageProtocol.readHeader(buf); + if (!header) { + return null; + } + if (header.type !== CrdtMessageType.APPEND_VALUE) { + throw new Error("AppendValueOperation tried to read another message type."); + } + return { + ...header, + entityId: buf.readUint32(), + componentId: buf.readUint32(), + timestamp: buf.readUint32(), + data: buf.readBuffer() + }; + } + AppendValueOperation2.read = read2; +})(AppendValueOperation || (AppendValueOperation = {})); + +// node_modules/@dcl/ecs/dist/serialization/crdt/deleteEntity.js +var DeleteEntity; +(function(DeleteEntity2) { + DeleteEntity2.MESSAGE_HEADER_LENGTH = 4; + function write3(entity, buf) { + buf.writeUint32(CRDT_MESSAGE_HEADER_LENGTH + 4); + buf.writeUint32(CrdtMessageType.DELETE_ENTITY); + buf.writeUint32(entity); + } + DeleteEntity2.write = write3; + function read2(buf) { + const header = CrdtMessageProtocol.readHeader(buf); + if (!header) { + return null; + } + if (header.type !== CrdtMessageType.DELETE_ENTITY) { + throw new Error("DeleteEntity tried to read another message type."); + } + return { + ...header, + entityId: buf.readUint32() + }; + } + DeleteEntity2.read = read2; +})(DeleteEntity || (DeleteEntity = {})); + +// node_modules/@dcl/ecs/dist/serialization/crdt/putComponent.js +var PutComponentOperation; +(function(PutComponentOperation2) { + PutComponentOperation2.MESSAGE_HEADER_LENGTH = 16; + function write3(entity, timestamp, componentId, data, buf) { + const startMessageOffset = buf.incrementWriteOffset(CRDT_MESSAGE_HEADER_LENGTH + PutComponentOperation2.MESSAGE_HEADER_LENGTH); + buf.writeBuffer(data, false); + const messageLength = buf.currentWriteOffset() - startMessageOffset; + buf.setUint32(startMessageOffset, messageLength); + buf.setUint32(startMessageOffset + 4, CrdtMessageType.PUT_COMPONENT); + buf.setUint32(startMessageOffset + 8, entity); + buf.setUint32(startMessageOffset + 12, componentId); + buf.setUint32(startMessageOffset + 16, timestamp); + const newLocal = messageLength - PutComponentOperation2.MESSAGE_HEADER_LENGTH - CRDT_MESSAGE_HEADER_LENGTH; + buf.setUint32(startMessageOffset + 20, newLocal); + } + PutComponentOperation2.write = write3; + function read2(buf) { + const header = CrdtMessageProtocol.readHeader(buf); + if (!header) { + return null; + } + if (header.type !== CrdtMessageType.PUT_COMPONENT) { + throw new Error("PutComponentOperation tried to read another message type."); + } + return { + ...header, + entityId: buf.readUint32(), + componentId: buf.readUint32(), + timestamp: buf.readUint32(), + data: buf.readBuffer() + }; + } + PutComponentOperation2.read = read2; +})(PutComponentOperation || (PutComponentOperation = {})); + +// node_modules/@dcl/ecs/dist/serialization/crdt/network/putComponentNetwork.js +var PutNetworkComponentOperation; +(function(PutNetworkComponentOperation2) { + PutNetworkComponentOperation2.MESSAGE_HEADER_LENGTH = 20; + function write3(entity, timestamp, componentId, networkId, data, buf) { + const startMessageOffset = buf.incrementWriteOffset(CRDT_MESSAGE_HEADER_LENGTH + PutNetworkComponentOperation2.MESSAGE_HEADER_LENGTH); + buf.writeBuffer(data, false); + const messageLength = buf.currentWriteOffset() - startMessageOffset; + buf.setUint32(startMessageOffset, messageLength); + buf.setUint32(startMessageOffset + 4, CrdtMessageType.PUT_COMPONENT_NETWORK); + buf.setUint32(startMessageOffset + 8, entity); + buf.setUint32(startMessageOffset + 12, componentId); + buf.setUint32(startMessageOffset + 16, timestamp); + buf.setUint32(startMessageOffset + 20, networkId); + const dataLength = messageLength - PutNetworkComponentOperation2.MESSAGE_HEADER_LENGTH - CRDT_MESSAGE_HEADER_LENGTH; + buf.setUint32(startMessageOffset + 24, dataLength); + } + PutNetworkComponentOperation2.write = write3; + function read2(buf) { + const header = CrdtMessageProtocol.readHeader(buf); + if (!header) { + return null; + } + if (header.type !== CrdtMessageType.PUT_COMPONENT_NETWORK) { + throw new Error("PutComponentNetworkOperation tried to read another message type."); + } + return { + ...header, + entityId: buf.readUint32(), + componentId: buf.readUint32(), + timestamp: buf.readUint32(), + networkId: buf.readUint32(), + data: buf.readBuffer() + }; + } + PutNetworkComponentOperation2.read = read2; +})(PutNetworkComponentOperation || (PutNetworkComponentOperation = {})); + +// node_modules/@dcl/ecs/dist/serialization/crdt/network/deleteComponentNetwork.js +var DeleteComponentNetwork; +(function(DeleteComponentNetwork2) { + DeleteComponentNetwork2.MESSAGE_HEADER_LENGTH = 16; + function write3(entity, componentId, timestamp, networkId, buf) { + const messageLength = CRDT_MESSAGE_HEADER_LENGTH + DeleteComponentNetwork2.MESSAGE_HEADER_LENGTH; + const startMessageOffset = buf.incrementWriteOffset(messageLength); + buf.setUint32(startMessageOffset, messageLength); + buf.setUint32(startMessageOffset + 4, CrdtMessageType.DELETE_COMPONENT_NETWORK); + buf.setUint32(startMessageOffset + 8, entity); + buf.setUint32(startMessageOffset + 12, componentId); + buf.setUint32(startMessageOffset + 16, timestamp); + buf.setUint32(startMessageOffset + 20, networkId); + } + DeleteComponentNetwork2.write = write3; + function read2(buf) { + const header = CrdtMessageProtocol.readHeader(buf); + if (!header) { + return null; + } + if (header.type !== CrdtMessageType.DELETE_COMPONENT_NETWORK) { + throw new Error("DeleteComponentOperation tried to read another message type."); + } + return { + ...header, + entityId: buf.readUint32(), + componentId: buf.readUint32(), + timestamp: buf.readUint32(), + networkId: buf.readUint32() + }; + } + DeleteComponentNetwork2.read = read2; +})(DeleteComponentNetwork || (DeleteComponentNetwork = {})); + +// node_modules/@dcl/ecs/dist/serialization/crdt/network/deleteEntityNetwork.js +var DeleteEntityNetwork; +(function(DeleteEntityNetwork2) { + DeleteEntityNetwork2.MESSAGE_HEADER_LENGTH = 8; + function write3(entity, networkId, buf) { + buf.writeUint32(CRDT_MESSAGE_HEADER_LENGTH + 4); + buf.writeUint32(CrdtMessageType.DELETE_ENTITY_NETWORK); + buf.writeUint32(entity); + buf.writeUint32(networkId); + } + DeleteEntityNetwork2.write = write3; + function read2(buf) { + const header = CrdtMessageProtocol.readHeader(buf); + if (!header) { + return null; + } + if (header.type !== CrdtMessageType.DELETE_ENTITY_NETWORK) { + throw new Error("DeleteEntityNetwork tried to read another message type."); + } + return { + ...header, + entityId: buf.readUint32(), + networkId: buf.readUint32() + }; + } + DeleteEntityNetwork2.read = read2; +})(DeleteEntityNetwork || (DeleteEntityNetwork = {})); + +// node_modules/@dcl/ecs/dist/serialization/crdt/network/utils.js +function isNetworkMessage(message) { + return [ + CrdtMessageType.DELETE_COMPONENT_NETWORK, + CrdtMessageType.DELETE_ENTITY_NETWORK, + CrdtMessageType.PUT_COMPONENT_NETWORK + ].includes(message.type); +} +function networkMessageToLocal(message, localEntityId, buffer, destinationBuffer) { + const offset = buffer.currentWriteOffset(); + if (message.type === CrdtMessageType.PUT_COMPONENT_NETWORK) { + PutComponentOperation.write(localEntityId, message.timestamp, message.componentId, message.data, buffer); + } else if (message.type === CrdtMessageType.DELETE_COMPONENT_NETWORK) { + DeleteComponent.write(localEntityId, message.componentId, message.timestamp, buffer); + } else if (message.type === CrdtMessageType.DELETE_ENTITY_NETWORK) { + DeleteEntity.write(localEntityId, buffer); + } + destinationBuffer.writeBuffer(buffer.buffer().subarray(offset, buffer.currentWriteOffset()), false); +} +function localMessageToNetwork(message, network, buffer, destinationBuffer) { + const offset = buffer.currentWriteOffset(); + if (message.type === CrdtMessageType.PUT_COMPONENT) { + PutNetworkComponentOperation.write(network.entityId, message.timestamp, message.componentId, network.networkId, message.data, buffer); + } else if (message.type === CrdtMessageType.DELETE_COMPONENT) { + DeleteComponentNetwork.write(network.entityId, message.componentId, message.timestamp, network.networkId, buffer); + } else if (message.type === CrdtMessageType.DELETE_ENTITY) { + DeleteEntityNetwork.write(network.entityId, network.networkId, buffer); + } + destinationBuffer.writeBuffer(buffer.buffer().subarray(offset, buffer.currentWriteOffset()), false); +} +function fixTransformParent(message, transformValue, parent) { + let transform = transformValue; + const buffer = new ReadWriteByteBuffer(); + if (!transform && "data" in message) { + buffer.writeBuffer(message.data); + transform = TransformSchema.deserialize(buffer); + buffer.resetBuffer(); + } + if (!transform) + throw new Error("Invalid parent transform"); + const newTransform = { ...transform, parent }; + buffer.resetBuffer(); + TransformSchema.serialize(newTransform, buffer); + return buffer.toBinary(); +} + +// node_modules/@dcl/ecs/dist/systems/crdt/index.js +function crdtSceneSystem(engine2, onProcessEntityComponentChange) { + const transports = []; + const NetworkEntity3 = NetworkEntity(engine2); + const NetworkParent3 = NetworkParent(engine2); + const Transform4 = Transform(engine2); + const receivedMessages = []; + const broadcastMessages = []; + function parseChunkMessage(transportId) { + return function parseChunkMessage2(chunkMessage) { + const buffer = new ReadWriteByteBuffer(chunkMessage); + let header; + while (header = CrdtMessageProtocol.getHeader(buffer)) { + const offset = buffer.currentReadOffset(); + let message = void 0; + if (header.type === CrdtMessageType.DELETE_COMPONENT) { + message = DeleteComponent.read(buffer); + } else if (header.type === CrdtMessageType.DELETE_COMPONENT_NETWORK) { + message = DeleteComponentNetwork.read(buffer); + } else if (header.type === CrdtMessageType.PUT_COMPONENT) { + message = PutComponentOperation.read(buffer); + } else if (header.type === CrdtMessageType.PUT_COMPONENT_NETWORK) { + message = PutNetworkComponentOperation.read(buffer); + } else if (header.type === CrdtMessageType.DELETE_ENTITY) { + message = DeleteEntity.read(buffer); + } else if (header.type === CrdtMessageType.DELETE_ENTITY_NETWORK) { + message = DeleteEntityNetwork.read(buffer); + } else if (header.type === CrdtMessageType.APPEND_VALUE) { + message = AppendValueOperation.read(buffer); + } else { + buffer.incrementReadOffset(header.length); + } + if (message) { + receivedMessages.push({ + ...message, + transportId, + messageBuffer: buffer.buffer().subarray(offset, buffer.currentReadOffset()) + }); + } + } + }; + } + function getMessages(value) { + const messagesToProcess = value.splice(0, value.length); + return messagesToProcess; + } + function findNetworkId(msg) { + const hasNetworkId = "networkId" in msg; + if (hasNetworkId) { + for (const [entityId, network] of engine2.getEntitiesWith(NetworkEntity3)) { + if (network.networkId === msg.networkId && network.entityId === msg.entityId) { + return { entityId, network }; + } + } + } + return { entityId: msg.entityId }; + } + async function receiveMessages() { + const messagesToProcess = getMessages(receivedMessages); + const entitiesShouldBeCleaned = []; + for (const msg of messagesToProcess) { + let { entityId, network } = findNetworkId(msg); + if (isNetworkMessage(msg) && !network) { + entityId = engine2.addEntity(); + network = { entityId: msg.entityId, networkId: msg.networkId }; + NetworkEntity3.createOrReplace(entityId, network); + } + if (msg.type === CrdtMessageType.DELETE_ENTITY || msg.type === CrdtMessageType.DELETE_ENTITY_NETWORK) { + entitiesShouldBeCleaned.push(entityId); + broadcastMessages.push(msg); + } else { + const entityState = engine2.entityContainer.getEntityState(entityId); + if (entityState === EntityState.Removed) + continue; + if (entityState === EntityState.Unknown) { + engine2.entityContainer.updateUsedEntity(entityId); + } + const component = engine2.getComponentOrNull(msg.componentId); + if (component) { + if (msg.type === CrdtMessageType.PUT_COMPONENT && component.componentId === Transform4.componentId && NetworkEntity3.has(entityId) && NetworkParent3.has(entityId)) { + msg.data = fixTransformParent(msg); + } + const [conflictMessage, value] = component.updateFromCrdt({ ...msg, entityId }); + if (!conflictMessage) { + broadcastMessages.push(msg); + onProcessEntityComponentChange && onProcessEntityComponentChange(msg.entityId, msg.type, component, value); + } + } else { + broadcastMessages.push(msg); + } + } + } + for (const entity of entitiesShouldBeCleaned) { + for (const definition of engine2.componentsIter()) { + definition.entityDeleted(entity, true); + } + engine2.entityContainer.updateRemovedEntity(entity); + onProcessEntityComponentChange && onProcessEntityComponentChange(entity, CrdtMessageType.DELETE_ENTITY); + } + } + async function sendMessages(entitiesDeletedThisTick) { + const crdtMessages = getMessages(broadcastMessages); + const buffer = new ReadWriteByteBuffer(); + for (const component of engine2.componentsIter()) { + for (const message of component.getCrdtUpdates()) { + const offset = buffer.currentWriteOffset(); + if (transports.some((t) => t.filter(message))) { + if (message.type === CrdtMessageType.PUT_COMPONENT) { + PutComponentOperation.write(message.entityId, message.timestamp, message.componentId, message.data, buffer); + } else if (message.type === CrdtMessageType.DELETE_COMPONENT) { + DeleteComponent.write(message.entityId, component.componentId, message.timestamp, buffer); + } else if (message.type === CrdtMessageType.APPEND_VALUE) { + AppendValueOperation.write(message.entityId, message.timestamp, message.componentId, message.data, buffer); + } + crdtMessages.push({ + ...message, + messageBuffer: buffer.buffer().subarray(offset, buffer.currentWriteOffset()) + }); + if (onProcessEntityComponentChange) { + const rawValue = message.type === CrdtMessageType.PUT_COMPONENT || message.type === CrdtMessageType.APPEND_VALUE ? component.get(message.entityId) : void 0; + onProcessEntityComponentChange(message.entityId, message.type, component, rawValue); + } + } + } + } + for (const entityId of entitiesDeletedThisTick) { + const offset = buffer.currentWriteOffset(); + DeleteEntity.write(entityId, buffer); + crdtMessages.push({ + type: CrdtMessageType.DELETE_ENTITY, + entityId, + messageBuffer: buffer.buffer().subarray(offset, buffer.currentWriteOffset()) + }); + onProcessEntityComponentChange && onProcessEntityComponentChange(entityId, CrdtMessageType.DELETE_ENTITY); + } + const transportBuffer = new ReadWriteByteBuffer(); + for (const index in transports) { + const transportIndex = Number(index); + const transport = transports[transportIndex]; + const isRendererTransport = transport.type === "renderer"; + const isNetworkTransport = transport.type === "network"; + transportBuffer.resetBuffer(); + const buffer2 = new ReadWriteByteBuffer(); + for (const message2 of crdtMessages) { + if (message2.transportId === transportIndex) + continue; + if (!transport.filter(message2)) + continue; + const { entityId } = findNetworkId(message2); + const transformNeedsFix = "componentId" in message2 && message2.componentId === Transform4.componentId && Transform4.has(entityId) && NetworkParent3.has(entityId) && NetworkEntity3.has(entityId); + if (isRendererTransport && message2.type === CrdtMessageType.PUT_COMPONENT && transformNeedsFix) { + const parent = findNetworkId(NetworkParent3.get(entityId)); + const transformData = fixTransformParent(message2, Transform4.get(entityId), parent.entityId); + const offset = buffer2.currentWriteOffset(); + PutComponentOperation.write(entityId, message2.timestamp, message2.componentId, transformData, buffer2); + transportBuffer.writeBuffer(buffer2.buffer().subarray(offset, buffer2.currentWriteOffset()), false); + continue; + } + if (isRendererTransport && isNetworkMessage(message2)) { + let transformData = "data" in message2 ? message2.data : new Uint8Array(); + if (transformNeedsFix) { + const parent = findNetworkId(NetworkParent3.get(entityId)); + transformData = fixTransformParent(message2, Transform4.get(entityId), parent.entityId); + } + networkMessageToLocal({ ...message2, data: transformData }, entityId, buffer2, transportBuffer); + continue; + } + if (isNetworkTransport && !isNetworkMessage(message2)) { + const networkData = NetworkEntity3.getOrNull(message2.entityId); + if (networkData) { + localMessageToNetwork(message2, networkData, buffer2, transportBuffer); + continue; + } + } + transportBuffer.writeBuffer(message2.messageBuffer, false); + } + const message = transportBuffer.currentWriteOffset() ? transportBuffer.toBinary() : new Uint8Array([]); + await transport.send(message); + } + } + function addTransport(transport) { + const id = transports.push(transport) - 1; + transport.onmessage = parseChunkMessage(id); + } + return { + sendMessages, + receiveMessages, + addTransport + }; +} + +// node_modules/@dcl/ecs/dist/systems/crdt/utils.js +var CrdtUtils; +(function(CrdtUtils2) { + let SynchronizedEntityType; + (function(SynchronizedEntityType2) { + SynchronizedEntityType2[SynchronizedEntityType2["NETWORKED"] = 0] = "NETWORKED"; + SynchronizedEntityType2[SynchronizedEntityType2["RENDERER"] = 1] = "RENDERER"; + })(SynchronizedEntityType = CrdtUtils2.SynchronizedEntityType || (CrdtUtils2.SynchronizedEntityType = {})); +})(CrdtUtils || (CrdtUtils = {})); +function dataCompare(a, b) { + if (a === b) + return 0; + if (a === null && b !== null) + return -1; + if (a !== null && b === null) + return 1; + if (a instanceof Uint8Array && b instanceof Uint8Array) { + const lengthDifference = a.byteLength - b.byteLength; + if (lengthDifference !== 0) { + return lengthDifference > 0 ? 1 : -1; + } + let res; + for (let i = 0, n = a.byteLength; i < n; i++) { + res = a[i] - b[i]; + if (res !== 0) { + return res > 0 ? 1 : -1; + } + } + return 0; + } + if (typeof a === "string") { + const lengthDifference = a.length - b.length; + if (lengthDifference !== 0) { + return lengthDifference > 0 ? 1 : -1; + } + return a.localeCompare(b); + } + return a > b ? 1 : -1; +} + +// node_modules/@dcl/ecs/dist/engine/readonly.js +function deepReadonly(val) { + return Object.freeze({ ...val }); +} + +// node_modules/@dcl/ecs/dist/engine/lww-element-set-component-definition.js +function incrementTimestamp(entity, timestamps) { + const newTimestamp = (timestamps.get(entity) || 0) + 1; + timestamps.set(entity, newTimestamp); + return newTimestamp; +} +function createDumpLwwFunctionFromCrdt(componentId, timestamps, schema, data) { + return function dumpCrdtState(buffer, filterEntity) { + for (const [entity, timestamp] of timestamps) { + if (filterEntity) { + if (!filterEntity(entity)) + continue; + } + if (data.has(entity)) { + const it = data.get(entity); + const buf = new ReadWriteByteBuffer(); + schema.serialize(it, buf); + PutComponentOperation.write(entity, timestamp, componentId, buf.toBinary(), buffer); + } else { + DeleteComponent.write(entity, componentId, timestamp, buffer); + } + } + }; +} +function createUpdateLwwFromCrdt(componentId, timestamps, schema, data) { + function crdtRuleForCurrentState(message) { + const { entityId, timestamp } = message; + const currentTimestamp = timestamps.get(entityId); + if (currentTimestamp === void 0 || currentTimestamp < timestamp) { + return ProcessMessageResultType.StateUpdatedTimestamp; + } + if (currentTimestamp > timestamp) { + return ProcessMessageResultType.StateOutdatedTimestamp; + } + if (message.type === CrdtMessageType.DELETE_COMPONENT && !data.has(entityId)) { + return ProcessMessageResultType.NoChanges; + } + let currentDataGreater = 0; + if (data.has(entityId)) { + const writeBuffer = new ReadWriteByteBuffer(); + schema.serialize(data.get(entityId), writeBuffer); + currentDataGreater = dataCompare(writeBuffer.toBinary(), message.data || null); + } else { + currentDataGreater = dataCompare(null, message.data); + } + if (currentDataGreater === 0) { + return ProcessMessageResultType.NoChanges; + } else if (currentDataGreater > 0) { + return ProcessMessageResultType.StateOutdatedData; + } else { + return ProcessMessageResultType.StateUpdatedData; + } + } + return (msg) => { + if (msg.type !== CrdtMessageType.PUT_COMPONENT && msg.type !== CrdtMessageType.PUT_COMPONENT_NETWORK && msg.type !== CrdtMessageType.DELETE_COMPONENT && msg.type !== CrdtMessageType.DELETE_COMPONENT_NETWORK) + return [null, data.get(msg.entityId)]; + const action = crdtRuleForCurrentState(msg); + const entity = msg.entityId; + switch (action) { + case ProcessMessageResultType.StateUpdatedData: + case ProcessMessageResultType.StateUpdatedTimestamp: { + timestamps.set(entity, msg.timestamp); + if (msg.type === CrdtMessageType.PUT_COMPONENT || msg.type === CrdtMessageType.PUT_COMPONENT_NETWORK) { + const buf = new ReadWriteByteBuffer(msg.data); + data.set(entity, schema.deserialize(buf)); + } else { + data.delete(entity); + } + return [null, data.get(entity)]; + } + case ProcessMessageResultType.StateOutdatedTimestamp: + case ProcessMessageResultType.StateOutdatedData: { + if (data.has(entity)) { + const writeBuffer = new ReadWriteByteBuffer(); + schema.serialize(data.get(entity), writeBuffer); + return [ + { + type: CrdtMessageType.PUT_COMPONENT, + componentId, + data: writeBuffer.toBinary(), + entityId: entity, + timestamp: timestamps.get(entity) + }, + data.get(entity) + ]; + } else { + return [ + { + type: CrdtMessageType.DELETE_COMPONENT, + componentId, + entityId: entity, + timestamp: timestamps.get(entity) + }, + void 0 + ]; + } + } + } + return [null, data.get(entity)]; + }; +} +function createGetCrdtMessagesForLww(componentId, timestamps, dirtyIterator, schema, data) { + return function* () { + for (const entity of dirtyIterator) { + const newTimestamp = incrementTimestamp(entity, timestamps); + if (data.has(entity)) { + const writeBuffer = new ReadWriteByteBuffer(); + schema.serialize(data.get(entity), writeBuffer); + const msg = { + type: CrdtMessageType.PUT_COMPONENT, + componentId, + entityId: entity, + data: writeBuffer.toBinary(), + timestamp: newTimestamp + }; + yield msg; + } else { + const msg = { + type: CrdtMessageType.DELETE_COMPONENT, + componentId, + entityId: entity, + timestamp: newTimestamp + }; + yield msg; + } + } + dirtyIterator.clear(); + }; +} +function createComponentDefinitionFromSchema(componentName, componentId, schema) { + const data = /* @__PURE__ */ new Map(); + const dirtyIterator = /* @__PURE__ */ new Set(); + const timestamps = /* @__PURE__ */ new Map(); + return { + get componentId() { + return componentId; + }, + get componentName() { + return componentName; + }, + get componentType() { + return 0; + }, + schema, + has(entity) { + return data.has(entity); + }, + deleteFrom(entity, markAsDirty = true) { + const component = data.get(entity); + if (data.delete(entity) && markAsDirty) { + dirtyIterator.add(entity); + } + return component || null; + }, + entityDeleted(entity, markAsDirty) { + if (data.delete(entity) && markAsDirty) { + dirtyIterator.add(entity); + } + }, + getOrNull(entity) { + const component = data.get(entity); + return component ? deepReadonly(component) : null; + }, + get(entity) { + const component = data.get(entity); + if (!component) { + throw new Error(`[getFrom] Component ${componentName} for entity #${entity} not found`); + } + return deepReadonly(component); + }, + create(entity, value) { + const component = data.get(entity); + if (component) { + throw new Error(`[create] Component ${componentName} for ${entity} already exists`); + } + const usedValue = value === void 0 ? schema.create() : schema.extend ? schema.extend(value) : value; + data.set(entity, usedValue); + dirtyIterator.add(entity); + return usedValue; + }, + createOrReplace(entity, value) { + const usedValue = value === void 0 ? schema.create() : schema.extend ? schema.extend(value) : value; + data.set(entity, usedValue); + dirtyIterator.add(entity); + return usedValue; + }, + getMutableOrNull(entity) { + const component = data.get(entity); + if (!component) { + return null; + } + dirtyIterator.add(entity); + return component; + }, + getOrCreateMutable(entity, value) { + const component = data.get(entity); + if (!component) { + return this.create(entity, value); + } else { + dirtyIterator.add(entity); + return component; + } + }, + getMutable(entity) { + const component = this.getMutableOrNull(entity); + if (component === null) { + throw new Error(`[mutable] Component ${componentName} for ${entity} not found`); + } + return component; + }, + *iterator() { + for (const [entity, component] of data) { + yield [entity, component]; + } + }, + *dirtyIterator() { + for (const entity of dirtyIterator) { + yield entity; + } + }, + getCrdtUpdates: createGetCrdtMessagesForLww(componentId, timestamps, dirtyIterator, schema, data), + updateFromCrdt: createUpdateLwwFromCrdt(componentId, timestamps, schema, data), + dumpCrdtStateToBuffer: createDumpLwwFunctionFromCrdt(componentId, timestamps, schema, data) + }; +} + +// node_modules/@dcl/ecs/dist/engine/systems.js +var SYSTEMS_REGULAR_PRIORITY = 1e5; +function SystemContainer() { + const systems = []; + function sort() { + systems.sort((a, b) => b.priority - a.priority); + } + function add2(fn, priority2, name) { + const systemName = name ?? fn.name; + if (systems.find((item) => item.fn === fn)) { + throw new Error(`System ${JSON.stringify(systemName)} already added to the engine`); + } + systems.push({ + fn, + priority: priority2, + name: systemName + }); + sort(); + } + function remove(selector) { + let index = -1; + if (typeof selector === "string") { + index = systems.findIndex((item) => item.name === selector); + } else { + index = systems.findIndex((item) => item.fn === selector); + } + if (index === -1) { + return false; + } + systems.splice(index, 1); + sort(); + return true; + } + return { + add: add2, + remove, + getSystems() { + return systems; + } + }; +} + +// node_modules/@dcl/ecs/dist/engine/grow-only-value-set-component-definition.js +var emptyReadonlySet = freezeSet(/* @__PURE__ */ new Set()); +function frozenError() { + throw new Error("The set is frozen"); +} +function freezeSet(set) { + ; + set.add = frozenError; + set.clear = frozenError; + return set; +} +function sortByTimestamp(a, b) { + return a.timestamp > b.timestamp ? 1 : -1; +} +function createValueSetComponentDefinitionFromSchema(componentName, componentId, schema, options) { + const data = /* @__PURE__ */ new Map(); + const dirtyIterator = /* @__PURE__ */ new Set(); + const queuedCommands = []; + function shouldSort(row) { + const len = row.raw.length; + if (len > 1 && row.raw[len - 1].timestamp <= row.raw[len - 2].timestamp) { + return true; + } + return false; + } + function gotUpdated(entity) { + const row = data.get(entity); + if (row) { + if (shouldSort(row)) { + row.raw.sort(sortByTimestamp); + } + while (row.raw.length > options.maxElements) { + row.raw.shift(); + } + const frozenSet = freezeSet(new Set(row?.raw.map(($) => $.value))); + row.frozenSet = frozenSet; + return frozenSet; + } else { + return emptyReadonlySet; + } + } + function append(entity, value) { + let row = data.get(entity); + if (!row) { + row = { raw: [], frozenSet: emptyReadonlySet }; + data.set(entity, row); + } + const usedValue = schema.extend ? schema.extend(value) : value; + const timestamp = options.timestampFunction(usedValue); + if (__DEV__) { + Object.freeze(usedValue); + } + row.raw.push({ value: usedValue, timestamp }); + return { set: gotUpdated(entity), value: usedValue }; + } + const ret = { + get componentId() { + return componentId; + }, + get componentName() { + return componentName; + }, + get componentType() { + return 1; + }, + schema, + has(entity) { + return data.has(entity); + }, + entityDeleted(entity) { + data.delete(entity); + }, + get(entity) { + const values = data.get(entity); + if (values) { + return values.frozenSet; + } else { + return emptyReadonlySet; + } + }, + addValue(entity, rawValue) { + const { set, value } = append(entity, rawValue); + dirtyIterator.add(entity); + const buf = new ReadWriteByteBuffer(); + schema.serialize(value, buf); + queuedCommands.push({ + componentId, + data: buf.toBinary(), + entityId: entity, + timestamp: 0, + type: CrdtMessageType.APPEND_VALUE + }); + return set; + }, + *iterator() { + for (const [entity, component] of data) { + yield [entity, component.frozenSet]; + } + }, + *dirtyIterator() { + for (const entity of dirtyIterator) { + yield entity; + } + }, + getCrdtUpdates() { + dirtyIterator.clear(); + return queuedCommands.splice(0, queuedCommands.length); + }, + updateFromCrdt(_body) { + if (_body.type === CrdtMessageType.APPEND_VALUE) { + const buf = new ReadWriteByteBuffer(_body.data); + append(_body.entityId, schema.deserialize(buf)); + } + return [null, void 0]; + }, + dumpCrdtStateToBuffer: function(buffer, filterEntity) { + for (const [entity, { raw }] of data) { + if (filterEntity && !filterEntity(entity)) + continue; + for (const it of raw) { + const buf = new ReadWriteByteBuffer(); + schema.serialize(it.value, buf); + AppendValueOperation.write(entity, 0, componentId, buf.toBinary(), buffer); + } + } + } + }; + return ret; +} + +// node_modules/@dcl/ecs/dist/runtime/helpers/tree.js +function* genEntityTree(entity, entities) { + if (!entities.has(entity)) + return; + entities.delete(entity); + for (const [_entity, value] of entities) { + if (value.parent === entity) { + yield* genEntityTree(_entity, entities); + } + } + yield entity; +} +function getComponentEntityTree(engine2, entity, component) { + const entities = new Map(engine2.getEntitiesWith(component)); + return genEntityTree(entity, entities); +} +function removeNetworkEntityChildrens(engine2, parent) { + const NetworkParent3 = NetworkParent(engine2); + const NetworkEntity3 = NetworkEntity(engine2); + engine2.removeEntity(parent); + const network = NetworkEntity3.getOrNull(parent); + if (network) { + for (const [entity, parent2] of engine2.getEntitiesWith(NetworkParent3)) { + if (parent2.entityId === network.entityId && parent2.networkId === network.networkId) { + removeNetworkEntityChildrens(engine2, entity); + } + } + } + return; +} +function removeEntityWithChildren(engine2, entity) { + const Transform4 = Transform(engine2); + const NetworkEntity3 = NetworkEntity(engine2); + if (NetworkEntity3.has(entity)) { + return removeNetworkEntityChildrens(engine2, entity); + } + for (const ent of getComponentEntityTree(engine2, entity, Transform4)) { + engine2.removeEntity(ent); + } +} + +// node_modules/@dcl/ecs/dist/engine/input.js +var InputCommands = [ + 0, + 1, + 2, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13 + /* InputAction.IA_ACTION_6 */ +]; +var InputStateUpdateSystemPriority = 1 << 20; +function createInputSystem(engine2) { + const PointerEventsResult3 = PointerEventsResult(engine2); + const globalState = { + previousFrameMaxTimestamp: 0, + currentFrameMaxTimestamp: 0, + buttonState: /* @__PURE__ */ new Map(), + thisFrameCommands: [] + }; + function findLastAction(pointerEventType, inputAction, entity) { + const ascendingTimestampIterator = PointerEventsResult3.get(entity); + for (const command of Array.from(ascendingTimestampIterator).reverse()) { + if (command.button === inputAction && command.state === pointerEventType) { + return command; + } + } + } + function* findCommandsByActionDescending(inputAction, entity) { + const ascendingTimestampIterator = PointerEventsResult3.get(entity); + for (const command of Array.from(ascendingTimestampIterator).reverse()) { + if (command.button === inputAction) { + yield command; + } + } + } + function buttonStateUpdateSystem() { + let maxTimestamp = globalState.currentFrameMaxTimestamp; + globalState.previousFrameMaxTimestamp = maxTimestamp; + if (globalState.thisFrameCommands.length) { + globalState.thisFrameCommands = []; + } + for (const [, commands] of engine2.getEntitiesWith(PointerEventsResult3)) { + const arrayCommands = Array.from(commands); + for (let i = arrayCommands.length - 1; i >= 0; i--) { + const command = arrayCommands[i]; + if (command.timestamp > maxTimestamp) { + maxTimestamp = command.timestamp; + } + if (command.timestamp > globalState.previousFrameMaxTimestamp) { + globalState.thisFrameCommands.push(command); + } + if (command.state === 0 || command.state === 1) { + const prevCommand = globalState.buttonState.get(command.button); + if (!prevCommand || command.timestamp > prevCommand.timestamp) { + globalState.buttonState.set(command.button, command); + } else { + break; + } + } + } + } + globalState.currentFrameMaxTimestamp = maxTimestamp; + } + engine2.addSystem(buttonStateUpdateSystem, InputStateUpdateSystemPriority, "@dcl/ecs#inputSystem"); + function timestampIsCurrentFrame(timestamp) { + if (timestamp > globalState.previousFrameMaxTimestamp && timestamp <= globalState.currentFrameMaxTimestamp) { + return true; + } else { + return false; + } + } + function getClick(inputAction, entity) { + if (inputAction !== 3) { + return findClick(inputAction, entity); + } + for (const input of InputCommands) { + const cmd = findClick(input, entity); + if (cmd) + return cmd; + } + return null; + } + function findClick(inputAction, entity) { + let down = null; + let up = null; + for (const it of findCommandsByActionDescending(inputAction, entity)) { + if (!up) { + if (it.state === 0) { + up = it; + continue; + } + } else if (!down) { + if (it.state === 1) { + down = it; + break; + } + } + } + if (!up || !down) + return null; + if (down.timestamp < up.timestamp && timestampIsCurrentFrame(up.timestamp)) { + return { up, down }; + } + return null; + } + function getInputCommandFromEntity(inputAction, pointerEventType, entity) { + if (inputAction !== 3) { + return findInputCommand(inputAction, pointerEventType, entity); + } + for (const input of InputCommands) { + const cmd = findInputCommand(input, pointerEventType, entity); + if (cmd) + return cmd; + } + return null; + } + function getInputCommand(inputAction, pointerEventType, entity) { + if (entity) { + return getInputCommandFromEntity(inputAction, pointerEventType, entity); + } else { + for (const command of globalState.thisFrameCommands) { + if ((command.button === inputAction || inputAction === 3) && command.state === pointerEventType) { + return command; + } + } + return null; + } + } + function findInputCommand(inputAction, pointerEventType, entity) { + const command = findLastAction(pointerEventType, inputAction, entity); + if (!command) + return null; + if (timestampIsCurrentFrame(command.timestamp)) { + return command; + } else { + return null; + } + } + function isClicked(inputAction, entity) { + return getClick(inputAction, entity) !== null; + } + function isTriggered(inputAction, pointerEventType, entity) { + if (entity) { + const command = findLastAction(pointerEventType, inputAction, entity); + return command && timestampIsCurrentFrame(command.timestamp) || false; + } else { + for (const command of globalState.thisFrameCommands) { + if ((command.button === inputAction || inputAction === 3) && command.state === pointerEventType) { + return true; + } + } + return false; + } + } + function isPressed(inputAction) { + return globalState.buttonState.get(inputAction)?.state === 1; + } + return { + isPressed, + getClick, + getInputCommand, + isClicked, + isTriggered + }; +} + +// node_modules/@dcl/ecs/dist/engine/component.js +var ComponentType; +(function(ComponentType2) { + ComponentType2[ComponentType2["LastWriteWinElementSet"] = 0] = "LastWriteWinElementSet"; + ComponentType2[ComponentType2["GrowOnlyValueSet"] = 1] = "GrowOnlyValueSet"; +})(ComponentType || (ComponentType = {})); + +// node_modules/@dcl/ecs/dist/engine/index.js +function preEngine() { + const entityContainer = EntityContainer(); + const componentsDefinition = /* @__PURE__ */ new Map(); + const systems = SystemContainer(); + let sealed = false; + function addSystem(fn, priority2 = SYSTEMS_REGULAR_PRIORITY, name) { + systems.add(fn, priority2, name); + } + function removeSystem(selector) { + return systems.remove(selector); + } + function addEntity() { + const entity = entityContainer.generateEntity(); + return entity; + } + function removeEntity(entity) { + for (const [, component] of componentsDefinition) { + if (component.componentName === "core-schema::Network-Entity") + continue; + component.entityDeleted(entity, true); + } + return entityContainer.removeEntity(entity); + } + function removeEntityWithChildren2(entity) { + return removeEntityWithChildren({ removeEntity, defineComponentFromSchema, getEntitiesWith, defineComponent }, entity); + } + function registerComponentDefinition(componentName, component) { + if (sealed) + throw new Error("Engine is already sealed. No components can be added at this stage"); + const componentId = componentNumberFromName(componentName); + const prev = componentsDefinition.get(componentId); + if (prev) { + throw new Error(`Component number ${componentId} was already registered.`); + } + if (component.componentName !== componentName) { + throw new Error(`Component name doesn't match componentDefinition.componentName ${componentName} != ${component.componentName}`); + } + if (component.componentId !== componentId) { + throw new Error(`Component number doesn't match componentDefinition.componentId ${componentId} != ${component.componentId}`); + } + componentsDefinition.set(componentId, component); + return component; + } + function defineComponentFromSchema(componentName, schema) { + const componentId = componentNumberFromName(componentName); + const prev = componentsDefinition.get(componentId); + if (prev) { + return prev; + } + if (sealed) + throw new Error("Engine is already sealed. No components can be added at this stage"); + const newComponent = createComponentDefinitionFromSchema(componentName, componentId, schema); + componentsDefinition.set(componentId, newComponent); + return newComponent; + } + function defineValueSetComponentFromSchema(componentName, schema, options) { + const componentId = componentNumberFromName(componentName); + const prev = componentsDefinition.get(componentId); + if (prev) { + return prev; + } + if (sealed) + throw new Error("Engine is already sealed. No components can be added at this stage"); + const newComponent = createValueSetComponentDefinitionFromSchema(componentName, componentId, schema, options); + componentsDefinition.set(componentId, newComponent); + return newComponent; + } + function defineComponent(componentName, mapSpec, constructorDefault) { + const componentId = componentNumberFromName(componentName); + const prev = componentsDefinition.get(componentId); + if (prev) { + return prev; + } + if (sealed) + throw new Error("Engine is already sealed. No components can be added at this stage"); + const schemaSpec = Schemas.Map(mapSpec, constructorDefault); + const def = createComponentDefinitionFromSchema(componentName, componentId, schemaSpec); + const newComponent = { + ...def, + create(entity, val) { + return def.create(entity, val); + }, + createOrReplace(entity, val) { + return def.createOrReplace(entity, val); + } + }; + componentsDefinition.set(componentId, newComponent); + return newComponent; + } + function getComponent2(componentIdOrName) { + const componentId = typeof componentIdOrName === "number" ? componentIdOrName : componentNumberFromName(componentIdOrName); + const component = componentsDefinition.get(componentId); + if (!component) { + throw new Error(`Component ${componentIdOrName} not found. You need to declare the components at the beginnig of the engine declaration`); + } + return component; + } + function getComponentOrNull(componentIdOrName) { + const componentId = typeof componentIdOrName === "number" ? componentIdOrName : componentNumberFromName(componentIdOrName); + return componentsDefinition.get(componentId) ?? /* istanbul ignore next */ + null; + } + function* getEntitiesWith(...components) { + for (const [entity, ...groupComp] of getComponentDefGroup(...components)) { + yield [entity, ...groupComp.map((c) => c.get(entity))]; + } + } + function getEntityOrNullByName(value) { + const LabelComponent = Name({ defineComponent }); + for (const [entity, name] of getEntitiesWith(LabelComponent)) { + if (name.value === value) + return entity; + } + return null; + } + function* getComponentDefGroup(...args) { + const [firstComponentDef, ...componentDefinitions] = args; + for (const [entity] of firstComponentDef.iterator()) { + let matches = true; + for (const componentDef of componentDefinitions) { + if (!componentDef.has(entity)) { + matches = false; + break; + } + } + if (matches) { + yield [entity, ...args]; + } + } + } + function getSystems() { + return systems.getSystems(); + } + function componentsIter() { + return componentsDefinition.values(); + } + function removeComponentDefinition(componentIdOrName) { + if (sealed) + throw new Error("Engine is already sealed. No components can be removed at this stage"); + const componentId = typeof componentIdOrName === "number" ? componentIdOrName : componentNumberFromName(componentIdOrName); + componentsDefinition.delete(componentId); + } + Transform({ defineComponentFromSchema }); + function seal() { + if (!sealed) { + sealed = true; + } + } + return { + addEntity, + removeEntity, + removeEntityWithChildren: removeEntityWithChildren2, + addSystem, + getSystems, + removeSystem, + defineComponent, + defineComponentFromSchema, + defineValueSetComponentFromSchema, + getEntitiesWith, + getComponent: getComponent2, + getComponentOrNull, + getEntityOrNullByName, + removeComponentDefinition, + registerComponentDefinition, + entityContainer, + componentsIter, + seal + }; +} +function Engine(options) { + const partialEngine = preEngine(); + const crdtSystem = crdtSceneSystem(partialEngine, options?.onChangeFunction || null); + async function update(dt) { + await crdtSystem.receiveMessages(); + for (const system of partialEngine.getSystems()) { + const ret = system.fn(dt); + checkNotThenable(ret, `A system (${system.name || "anonymous"}) returned a thenable. Systems cannot be async functions. Documentation: https://dcl.gg/sdk/sync-systems`); + } + const deletedEntites = partialEngine.entityContainer.releaseRemovedEntities(); + await crdtSystem.sendMessages(deletedEntites); + } + return { + addEntity: partialEngine.addEntity, + removeEntity: partialEngine.removeEntity, + removeEntityWithChildren: partialEngine.removeEntityWithChildren, + addSystem: partialEngine.addSystem, + removeSystem: partialEngine.removeSystem, + defineComponent: partialEngine.defineComponent, + defineComponentFromSchema: partialEngine.defineComponentFromSchema, + defineValueSetComponentFromSchema: partialEngine.defineValueSetComponentFromSchema, + registerComponentDefinition: partialEngine.registerComponentDefinition, + getEntitiesWith: partialEngine.getEntitiesWith, + getComponent: partialEngine.getComponent, + getComponentOrNull: partialEngine.getComponentOrNull, + removeComponentDefinition: partialEngine.removeComponentDefinition, + componentsIter: partialEngine.componentsIter, + seal: partialEngine.seal, + getEntityOrNullByName: partialEngine.getEntityOrNullByName, + update, + RootEntity: 0, + PlayerEntity: 1, + CameraEntity: 2, + getEntityState: partialEngine.entityContainer.getEntityState, + addTransport: crdtSystem.addTransport, + entityContainer: partialEngine.entityContainer + }; +} + +// node_modules/@dcl/ecs/dist/systems/async-task.js +function getAndClean(value) { + const messagesToProcess = Array.from(value); + value.length = 0; + return messagesToProcess; +} +function createTaskSystem(engine2) { + const tasks = []; + async function runTask(task) { + try { + const resp = await task(); + return resp; + } catch (e) { + console.error(e); + } + } + function executeTasks() { + for (const task of getAndClean(tasks)) { + runTask(task).catch(console.error); + } + } + engine2.addSystem(executeTasks); + return function(task) { + tasks.push(task); + }; +} + +// node_modules/@dcl/ecs/dist/systems/events.js +function createPointerEventsSystem(engine2, inputSystem2) { + const PointerEvents4 = PointerEvents(engine2); + let EventType; + (function(EventType2) { + EventType2[EventType2["Click"] = 0] = "Click"; + EventType2[EventType2["Down"] = 1] = "Down"; + EventType2[EventType2["Up"] = 2] = "Up"; + })(EventType || (EventType = {})); + const getDefaultOpts = (opts = {}) => ({ + button: 3, + ...opts + }); + const eventsMap = /* @__PURE__ */ new Map(); + function getEvent(entity) { + return eventsMap.get(entity) || eventsMap.set(entity, /* @__PURE__ */ new Map()).get(entity); + } + function setPointerEvent(entity, type, opts) { + if (opts.hoverText || opts.showFeedback) { + const pointerEvent = PointerEvents4.getMutableOrNull(entity) || PointerEvents4.create(entity); + pointerEvent.pointerEvents.push({ + eventType: type, + eventInfo: { + button: opts.button, + showFeedback: opts.showFeedback, + hoverText: opts.hoverText, + maxDistance: opts.maxDistance + } + }); + } + } + function removePointerEvent(entity, type, button) { + const pointerEvent = PointerEvents4.getMutableOrNull(entity); + if (!pointerEvent) + return; + pointerEvent.pointerEvents = pointerEvent.pointerEvents.filter((pointer) => !(pointer.eventInfo?.button === button && pointer.eventType === type)); + } + function getPointerEvent(eventType) { + if (eventType === EventType.Up) { + return 0; + } + return 1; + } + function removeEvent(entity, type) { + const event = getEvent(entity); + const pointerEvent = event.get(type); + if (pointerEvent?.opts.hoverText) { + removePointerEvent(entity, getPointerEvent(type), pointerEvent.opts.button); + } + event.delete(type); + } + engine2.addSystem(function EventSystem() { + for (const [entity, event] of eventsMap) { + if (engine2.getEntityState(entity) === EntityState.Removed) { + eventsMap.delete(entity); + continue; + } + for (const [eventType, { cb, opts }] of event) { + if (eventType === EventType.Click) { + const command = inputSystem2.getClick(opts.button, entity); + if (command) + checkNotThenable(cb(command.up), "Click event returned a thenable. Only synchronous functions are allowed"); + } + if (eventType === EventType.Down || eventType === EventType.Up) { + const command = inputSystem2.getInputCommand(opts.button, getPointerEvent(eventType), entity); + if (command) { + checkNotThenable(cb(command), "Event handler returned a thenable. Only synchronous functions are allowed"); + } + } + } + } + }); + const onPointerDown = (...args) => { + const [data, cb, maybeOpts] = args; + if (typeof data === "number") { + return onPointerDown({ entity: data, opts: maybeOpts ?? {} }, cb); + } + const { entity, opts } = data; + const options = getDefaultOpts(opts); + removeEvent(entity, EventType.Down); + getEvent(entity).set(EventType.Down, { cb, opts: options }); + setPointerEvent(entity, 1, options); + }; + const onPointerUp = (...args) => { + const [data, cb, maybeOpts] = args; + if (typeof data === "number") { + return onPointerUp({ entity: data, opts: maybeOpts ?? {} }, cb); + } + const { entity, opts } = data; + const options = getDefaultOpts(opts); + removeEvent(entity, EventType.Up); + getEvent(entity).set(EventType.Up, { cb, opts: options }); + setPointerEvent(entity, 0, options); + }; + return { + removeOnClick(entity) { + removeEvent(entity, EventType.Click); + }, + removeOnPointerDown(entity) { + removeEvent(entity, EventType.Down); + }, + removeOnPointerUp(entity) { + removeEvent(entity, EventType.Up); + }, + onClick(value, cb) { + const { entity } = value; + const options = getDefaultOpts(value.opts); + removeEvent(entity, EventType.Click); + getEvent(entity).set(EventType.Click, { cb, opts: options }); + setPointerEvent(entity, 1, options); + }, + onPointerDown, + onPointerUp + }; +} + +// node_modules/@dcl/ecs/dist/systems/tween.js +function createTweenSystem(engine2) { + const Tween5 = Tween2(engine2); + const TweenState2 = TweenState(engine2); + const TweenSequence2 = TweenSequence(engine2); + const cache = /* @__PURE__ */ new Map(); + function isCompleted(entity) { + const tweenState = TweenState2.getOrNull(entity); + const tween = Tween5.getOrNull(entity); + const tweenCache = cache.get(entity); + if (!tweenState || !tween) + return false; + if ( + // Renderer notified that the tween is completed + (tweenChanged(entity) || tweenState.state === 1) && // Avoid sending isCompleted multiple times + !tweenCache?.completed && // Amount of frames needed to consider a tween completed + (tweenCache?.frames ?? 0) > 2 + ) { + return true; + } + return false; + } + function tweenChanged(entity) { + const currentTween = Tween5.getOrNull(entity); + const prevTween = cache.get(entity)?.tween; + if (currentTween && !prevTween || !currentTween && prevTween) { + return true; + } + const currentBuff = new ReadWriteByteBuffer(); + Tween5.schema.serialize(currentTween, currentBuff); + const equal = dataCompare(currentBuff.toBinary(), prevTween); + return equal; + } + const restartTweens = []; + engine2.addSystem(() => { + for (const restart of restartTweens) { + restart(); + } + restartTweens.length = 0; + for (const [entity, tween] of engine2.getEntitiesWith(Tween5)) { + if (tweenChanged(entity)) { + const buffer = new ReadWriteByteBuffer(); + Tween5.schema.serialize(tween, buffer); + cache.set(entity, { + tween: buffer.toBinary(), + frames: 0, + completed: false, + changed: true + }); + continue; + } + const tweenCache = cache.get(entity); + tweenCache.frames += 1; + tweenCache.changed = false; + if (isCompleted(entity)) { + tweenCache.frames = 0; + tweenCache.completed = true; + const tweenSequence = TweenSequence2.getOrNull(entity); + if (!tweenSequence) + continue; + const { sequence } = tweenSequence; + if (sequence && sequence.length) { + const [nextTweenSequence, ...otherTweens] = sequence; + Tween5.createOrReplace(entity, nextTweenSequence); + const mutableTweenHelper = TweenSequence2.getMutable(entity); + mutableTweenHelper.sequence = otherTweens; + if (tweenSequence.loop === 0) { + mutableTweenHelper.sequence.push(tween); + } + } else if (tweenSequence.loop === 1) { + Tween5.createOrReplace(entity, backwardsTween(tween)); + } else if (tweenSequence.loop === 0) { + Tween5.deleteFrom(entity); + cache.delete(entity); + restartTweens.push(() => { + Tween5.createOrReplace(entity, tween); + }); + } + } + } + }, Number.NEGATIVE_INFINITY); + function backwardsTween(tween) { + if (tween.mode?.$case === "move" && tween.mode.move) { + return { ...tween, mode: { ...tween.mode, move: { start: tween.mode.move.end, end: tween.mode.move.start } } }; + } + if (tween.mode?.$case === "rotate" && tween.mode.rotate) { + return { + ...tween, + mode: { ...tween.mode, rotate: { start: tween.mode.rotate.end, end: tween.mode.rotate.start } } + }; + } + if (tween.mode?.$case === "scale" && tween.mode.scale) { + return { ...tween, mode: { ...tween.mode, scale: { start: tween.mode.scale.end, end: tween.mode.scale.start } } }; + } + throw new Error("Invalid tween"); + } + return { + // This event is fired only once per tween + tweenCompleted: isCompleted + }; +} + +// node_modules/@dcl/ecs/dist/runtime/initialization/index.js +var engine = /* @__PURE__ */ Engine(); +var inputSystem = /* @__PURE__ */ createInputSystem(engine); +var pointerEventsSystem = /* @__PURE__ */ createPointerEventsSystem(engine, inputSystem); +var tweenSystem = createTweenSystem(engine); +var executeTask = /* @__PURE__ */ createTaskSystem(engine); + +// node_modules/@dcl/ecs/dist/components/generated/global.gen.js +var AudioSource2 = /* @__PURE__ */ AudioSource(engine); +var AudioStream2 = /* @__PURE__ */ AudioStream(engine); +var AvatarAttach2 = /* @__PURE__ */ AvatarAttach(engine); +var CameraModeArea2 = /* @__PURE__ */ CameraModeArea(engine); +var EngineInfo2 = /* @__PURE__ */ EngineInfo(engine); +var GltfContainer2 = /* @__PURE__ */ GltfContainer(engine); +var GltfContainerLoadingState2 = /* @__PURE__ */ GltfContainerLoadingState(engine); +var PointerEvents2 = /* @__PURE__ */ PointerEvents(engine); +var PointerEventsResult2 = /* @__PURE__ */ PointerEventsResult(engine); +var TextShape2 = /* @__PURE__ */ TextShape(engine); +var UiBackground2 = /* @__PURE__ */ UiBackground(engine); +var UiText2 = /* @__PURE__ */ UiText(engine); +var UiTransform2 = /* @__PURE__ */ UiTransform(engine); +var VideoPlayer2 = /* @__PURE__ */ VideoPlayer(engine); +var VisibilityComponent2 = /* @__PURE__ */ VisibilityComponent(engine); + +// node_modules/@dcl/ecs/dist/components/generated/pb/decentraland/sdk/components/common/camera_type.gen.js +var CameraType; +(function(CameraType2) { + CameraType2[CameraType2["CT_FIRST_PERSON"] = 0] = "CT_FIRST_PERSON"; + CameraType2[CameraType2["CT_THIRD_PERSON"] = 1] = "CT_THIRD_PERSON"; + CameraType2[CameraType2["CT_CINEMATIC"] = 2] = "CT_CINEMATIC"; +})(CameraType || (CameraType = {})); + +// node_modules/@dcl/ecs/dist/components/generated/pb/decentraland/sdk/components/common/input_action.gen.js +var InputAction; +(function(InputAction2) { + InputAction2[InputAction2["IA_POINTER"] = 0] = "IA_POINTER"; + InputAction2[InputAction2["IA_PRIMARY"] = 1] = "IA_PRIMARY"; + InputAction2[InputAction2["IA_SECONDARY"] = 2] = "IA_SECONDARY"; + InputAction2[InputAction2["IA_ANY"] = 3] = "IA_ANY"; + InputAction2[InputAction2["IA_FORWARD"] = 4] = "IA_FORWARD"; + InputAction2[InputAction2["IA_BACKWARD"] = 5] = "IA_BACKWARD"; + InputAction2[InputAction2["IA_RIGHT"] = 6] = "IA_RIGHT"; + InputAction2[InputAction2["IA_LEFT"] = 7] = "IA_LEFT"; + InputAction2[InputAction2["IA_JUMP"] = 8] = "IA_JUMP"; + InputAction2[InputAction2["IA_WALK"] = 9] = "IA_WALK"; + InputAction2[InputAction2["IA_ACTION_3"] = 10] = "IA_ACTION_3"; + InputAction2[InputAction2["IA_ACTION_4"] = 11] = "IA_ACTION_4"; + InputAction2[InputAction2["IA_ACTION_5"] = 12] = "IA_ACTION_5"; + InputAction2[InputAction2["IA_ACTION_6"] = 13] = "IA_ACTION_6"; +})(InputAction || (InputAction = {})); +var PointerEventType; +(function(PointerEventType3) { + PointerEventType3[PointerEventType3["PET_UP"] = 0] = "PET_UP"; + PointerEventType3[PointerEventType3["PET_DOWN"] = 1] = "PET_DOWN"; + PointerEventType3[PointerEventType3["PET_HOVER_ENTER"] = 2] = "PET_HOVER_ENTER"; + PointerEventType3[PointerEventType3["PET_HOVER_LEAVE"] = 3] = "PET_HOVER_LEAVE"; +})(PointerEventType || (PointerEventType = {})); + +// node_modules/@dcl/ecs/dist/components/generated/pb/decentraland/sdk/components/common/loading_state.gen.js +var LoadingState; +(function(LoadingState2) { + LoadingState2[LoadingState2["UNKNOWN"] = 0] = "UNKNOWN"; + LoadingState2[LoadingState2["LOADING"] = 1] = "LOADING"; + LoadingState2[LoadingState2["NOT_FOUND"] = 2] = "NOT_FOUND"; + LoadingState2[LoadingState2["FINISHED_WITH_ERROR"] = 3] = "FINISHED_WITH_ERROR"; + LoadingState2[LoadingState2["FINISHED"] = 4] = "FINISHED"; +})(LoadingState || (LoadingState = {})); + +// node_modules/@dcl/ecs/dist/components/generated/pb/decentraland/sdk/components/common/texts.gen.js +var TextAlignMode; +(function(TextAlignMode2) { + TextAlignMode2[TextAlignMode2["TAM_TOP_LEFT"] = 0] = "TAM_TOP_LEFT"; + TextAlignMode2[TextAlignMode2["TAM_TOP_CENTER"] = 1] = "TAM_TOP_CENTER"; + TextAlignMode2[TextAlignMode2["TAM_TOP_RIGHT"] = 2] = "TAM_TOP_RIGHT"; + TextAlignMode2[TextAlignMode2["TAM_MIDDLE_LEFT"] = 3] = "TAM_MIDDLE_LEFT"; + TextAlignMode2[TextAlignMode2["TAM_MIDDLE_CENTER"] = 4] = "TAM_MIDDLE_CENTER"; + TextAlignMode2[TextAlignMode2["TAM_MIDDLE_RIGHT"] = 5] = "TAM_MIDDLE_RIGHT"; + TextAlignMode2[TextAlignMode2["TAM_BOTTOM_LEFT"] = 6] = "TAM_BOTTOM_LEFT"; + TextAlignMode2[TextAlignMode2["TAM_BOTTOM_CENTER"] = 7] = "TAM_BOTTOM_CENTER"; + TextAlignMode2[TextAlignMode2["TAM_BOTTOM_RIGHT"] = 8] = "TAM_BOTTOM_RIGHT"; +})(TextAlignMode || (TextAlignMode = {})); +var Font; +(function(Font3) { + Font3[Font3["F_SANS_SERIF"] = 0] = "F_SANS_SERIF"; + Font3[Font3["F_SERIF"] = 1] = "F_SERIF"; + Font3[Font3["F_MONOSPACE"] = 2] = "F_MONOSPACE"; +})(Font || (Font = {})); + +// node_modules/@dcl/ecs/dist/composite/components.js +function getCompositeRootComponent(engine2) { + const component = engine2.getComponentOrNull("composite::root"); + if (component) { + return component; + } + return engine2.defineComponent("composite::root", { + src: Schemas.String, + entities: Schemas.Array(Schemas.Map({ + src: Schemas.Entity, + dest: Schemas.Entity + })) + }); +} + +// node_modules/@dcl/ecs/dist/composite/path.js +var currentWorkingDir = "/"; +function normalizeStringPosix(path, allowAboveRoot = false) { + let res = ""; + let lastSegmentLength = 0; + let lastSlash = -1; + let dots = 0; + let code; + for (let i = 0; i <= path.length; ++i) { + if (i < path.length) + code = path.charCodeAt(i); + else if (code === 47) + break; + else + code = 47; + if (code === 47) { + if (lastSlash === i - 1 || dots === 1) { + } else if (lastSlash !== i - 1 && dots === 2) { + if (res.length < 2 || lastSegmentLength !== 2 || res.charCodeAt(res.length - 1) !== 46 || res.charCodeAt(res.length - 2) !== 46) { + if (res.length > 2) { + const lastSlashIndex = res.lastIndexOf("/"); + if (lastSlashIndex !== res.length - 1) { + if (lastSlashIndex === -1) { + res = ""; + lastSegmentLength = 0; + } else { + res = res.slice(0, lastSlashIndex); + lastSegmentLength = res.length - 1 - res.lastIndexOf("/"); + } + lastSlash = i; + dots = 0; + continue; + } + } else if (res.length === 2 || res.length === 1) { + res = ""; + lastSegmentLength = 0; + lastSlash = i; + dots = 0; + continue; + } + } + if (allowAboveRoot) { + if (res.length > 0) + res += "/.."; + else + res = ".."; + lastSegmentLength = 2; + } + } else { + if (res.length > 0) + res += "/" + path.slice(lastSlash + 1, i); + else + res = path.slice(lastSlash + 1, i); + lastSegmentLength = i - lastSlash - 1; + } + lastSlash = i; + dots = 0; + } else if (code === 46 && dots !== -1) { + ++dots; + } else { + dots = -1; + } + } + return res; +} +function resolve(...args) { + let resolvedPath = ""; + let resolvedAbsolute = false; + let cwd; + for (let i = args.length - 1; i >= -1 && !resolvedAbsolute; i--) { + let path; + if (i >= 0) + path = args[i]; + else { + if (cwd === void 0) + cwd = currentWorkingDir; + path = cwd; + } + if (path.length === 0) { + continue; + } + resolvedPath = path + "/" + resolvedPath; + resolvedAbsolute = path.charCodeAt(0) === 47; + } + resolvedPath = normalizeStringPosix(resolvedPath, !resolvedAbsolute); + if (resolvedAbsolute) { + if (resolvedPath.length > 0) + return "/" + resolvedPath; + else + return "/"; + } else if (resolvedPath.length > 0) { + return resolvedPath; + } else { + return "."; + } +} +function dirname(path) { + if (path.length === 0) + return "."; + let code = path.charCodeAt(0); + const hasRoot = code === 47; + let end = -1; + let matchedSlash = true; + for (let i = path.length - 1; i >= 1; --i) { + code = path.charCodeAt(i); + if (code === 47) { + if (!matchedSlash) { + end = i; + break; + } + } else { + matchedSlash = false; + } + } + if (end === -1) + return hasRoot ? "/" : "."; + if (hasRoot && end === 1) + return "//"; + return path.slice(0, end); +} +function resolveComposite(path, cwd) { + const absolutePath = path.startsWith(".") ? resolve(cwd, path) : resolve(path); + return absolutePath.substring(1); +} + +// node_modules/@dcl/ecs/dist/composite/instance.js +var EntityMappingMode; +(function(EntityMappingMode2) { + EntityMappingMode2[EntityMappingMode2["EMM_NONE"] = 0] = "EMM_NONE"; + EntityMappingMode2[EntityMappingMode2["EMM_NEXT_AVAILABLE"] = 1] = "EMM_NEXT_AVAILABLE"; + EntityMappingMode2[EntityMappingMode2["EMM_DIRECT_MAPPING"] = 2] = "EMM_DIRECT_MAPPING"; +})(EntityMappingMode || (EntityMappingMode = {})); +function getComponentValue(componentDefinition, component) { + if (component.data?.$case === "json") { + return component.data.json; + } else { + return componentDefinition.schema.deserialize(new ReadWriteByteBuffer(component.data?.binary)); + } +} +function getComponentDefinition(engine2, component) { + const existingComponentDefinition = engine2.getComponentOrNull(component.name); + if (!existingComponentDefinition) { + if (component.name.startsWith("core::")) { + if (component.name in componentDefinitionByName) { + return componentDefinitionByName[component.name](engine2); + } else { + throw new Error(`The core component ${component.name} was not found.`); + } + } else if (component.jsonSchema) { + return engine2.defineComponentFromSchema(component.name, Schemas.fromJson(component.jsonSchema)); + } else { + throw new Error(`${component.name} is not defined and there is no schema to define it.`); + } + } else { + return existingComponentDefinition; + } +} +function getEntityMapping(engine2, compositeEntity, mappedEntities, { entityMapping }) { + const existingEntity = mappedEntities.get(compositeEntity); + if (existingEntity) { + return existingEntity; + } + if (entityMapping?.type === EntityMappingMode.EMM_DIRECT_MAPPING) { + const entity = entityMapping.getCompositeEntity(compositeEntity); + mappedEntities.set(compositeEntity, entity); + return entity; + } + const newEntity = entityMapping?.type === EntityMappingMode.EMM_NEXT_AVAILABLE ? entityMapping.getNextAvailableEntity() : engine2.addEntity(); + if (newEntity === null) { + throw new Error("There is no more entities to allocate"); + } + mappedEntities.set(compositeEntity, newEntity); + return newEntity; +} +function instanceComposite(engine2, compositeResource, compositeProvider2, options) { + const { rootEntity, alreadyRequestedSrc: optionalAlreadyRequestedSrc, entityMapping } = options; + const alreadyRequestedSrc = optionalAlreadyRequestedSrc || /* @__PURE__ */ new Set(); + const compositeDirectoryPath = dirname(resolve(compositeResource.src)); + const TransformComponentNumber = componentNumberFromName("core::Transform"); + const CompositeRootComponent = getCompositeRootComponent(engine2); + const mappedEntities = /* @__PURE__ */ new Map(); + const getCompositeEntity = (compositeEntity) => getEntityMapping(engine2, compositeEntity, mappedEntities, options); + const compositeRootEntity = rootEntity ?? getCompositeEntity(0); + if (rootEntity) { + mappedEntities.set(0, rootEntity); + } + const childrenComposite = compositeResource.composite.components.find((item) => item.name === CompositeRootComponent.componentName); + if (childrenComposite) { + for (const [childCompositeEntity, compositeRawData] of childrenComposite.data) { + const childComposite = getComponentValue(CompositeRootComponent, compositeRawData); + const childCompositePath = resolveComposite(childComposite.src, compositeDirectoryPath); + const childCompositeResource = compositeProvider2.getCompositeOrNull(childCompositePath); + const targetEntity = getCompositeEntity(childCompositeEntity); + if (childCompositeResource) { + if (alreadyRequestedSrc.has(childCompositeResource.src) || childCompositeResource.src === compositeResource.src) { + throw new Error(`Composite ${compositeResource.src} has a recursive instanciation while try to instance ${childCompositeResource.src}. Previous instances: ${alreadyRequestedSrc.toString()}`); + } + instanceComposite(engine2, childCompositeResource, compositeProvider2, { + rootEntity: targetEntity, + alreadyRequestedSrc: new Set(alreadyRequestedSrc).add(childCompositeResource.src), + entityMapping: entityMapping?.type === EntityMappingMode.EMM_NEXT_AVAILABLE ? entityMapping : void 0 + }); + } + } + } + for (const component of compositeResource.composite.components) { + if (component.name === CompositeRootComponent.componentName) + continue; + const componentDefinition = getComponentDefinition(engine2, component); + for (const [entity, compositeComponentValue] of component.data) { + const componentValueDeserialized = getComponentValue(componentDefinition, compositeComponentValue); + const targetEntity = getCompositeEntity(entity); + const componentValue = componentDefinition.create(targetEntity, componentValueDeserialized); + if (componentDefinition.componentId === TransformComponentNumber) { + const transform = componentValue; + if (transform.parent) { + transform.parent = getCompositeEntity(transform.parent); + } else { + transform.parent = getCompositeEntity(0); + } + } else { + Schemas.mutateNestedValues(componentDefinition.schema.jsonSchema, componentValue, (value, valueType) => { + if (valueType.serializationType === "entity") { + return { changed: true, value: getCompositeEntity(value) }; + } else { + return { changed: false }; + } + }); + } + } + } + const composite = CompositeRootComponent.getMutableOrNull(compositeRootEntity) || CompositeRootComponent.create(compositeRootEntity); + for (const [entitySource, targetEntity] of mappedEntities) { + composite.entities.push({ + src: entitySource, + dest: targetEntity + }); + } + composite.src = compositeResource.src; + return compositeRootEntity; +} + +// node_modules/@dcl/ecs/dist/composite/proto/gen/composite.gen.js +var import_minimal43 = __toESM(require_minimal2()); + +// node_modules/@dcl/ecs/dist/composite/proto/gen/google/protobuf/struct.gen.js +var import_minimal42 = __toESM(require_minimal2()); +var NullValue; +(function(NullValue2) { + NullValue2[NullValue2["NULL_VALUE"] = 0] = "NULL_VALUE"; +})(NullValue || (NullValue = {})); +function nullValueFromJSON(object) { + switch (object) { + case 0: + case "NULL_VALUE": + return 0; + default: + throw new tsProtoGlobalThis2.Error("Unrecognized enum value " + object + " for enum NullValue"); + } +} +function nullValueToJSON(object) { + switch (object) { + case 0: + return "NULL_VALUE"; + default: + throw new tsProtoGlobalThis2.Error("Unrecognized enum value " + object + " for enum NullValue"); + } +} +function createBaseStruct() { + return { fields: /* @__PURE__ */ new Map() }; +} +var Struct; +(function(Struct2) { + function encode(message, writer = import_minimal42.default.Writer.create()) { + message.fields.forEach((value, key) => { + if (value !== void 0) { + Struct_FieldsEntry.encode({ key, value }, writer.uint32(10).fork()).ldelim(); + } + }); + return writer; + } + Struct2.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal42.default.Reader ? input : import_minimal42.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBaseStruct(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + const entry1 = Struct_FieldsEntry.decode(reader, reader.uint32()); + if (entry1.value !== void 0) { + message.fields.set(entry1.key, entry1.value); + } + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + Struct2.decode = decode; + function fromJSON(object) { + return { + fields: isObject(object.fields) ? Object.entries(object.fields).reduce((acc, [key, value]) => { + acc.set(key, value); + return acc; + }, /* @__PURE__ */ new Map()) : /* @__PURE__ */ new Map() + }; + } + Struct2.fromJSON = fromJSON; + function toJSON(message) { + const obj = {}; + obj.fields = {}; + if (message.fields) { + message.fields.forEach((v, k) => { + obj.fields[k] = v; + }); + } + return obj; + } + Struct2.toJSON = toJSON; + function wrap(object) { + const struct = createBaseStruct(); + if (object !== void 0) { + Object.keys(object).forEach((key) => { + struct.fields.set(key, object[key]); + }); + } + return struct; + } + Struct2.wrap = wrap; + function unwrap(message) { + const object = {}; + [...message.fields.keys()].forEach((key) => { + object[key] = message.fields.get(key); + }); + return object; + } + Struct2.unwrap = unwrap; +})(Struct || (Struct = {})); +function createBaseStruct_FieldsEntry() { + return { key: "", value: void 0 }; +} +var Struct_FieldsEntry; +(function(Struct_FieldsEntry2) { + function encode(message, writer = import_minimal42.default.Writer.create()) { + if (message.key !== "") { + writer.uint32(10).string(message.key); + } + if (message.value !== void 0) { + Value.encode(Value.wrap(message.value), writer.uint32(18).fork()).ldelim(); + } + return writer; + } + Struct_FieldsEntry2.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal42.default.Reader ? input : import_minimal42.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBaseStruct_FieldsEntry(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + message.key = reader.string(); + continue; + case 2: + if (tag !== 18) { + break; + } + message.value = Value.unwrap(Value.decode(reader, reader.uint32())); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + Struct_FieldsEntry2.decode = decode; + function fromJSON(object) { + return { key: isSet(object.key) ? String(object.key) : "", value: isSet(object?.value) ? object.value : void 0 }; + } + Struct_FieldsEntry2.fromJSON = fromJSON; + function toJSON(message) { + const obj = {}; + message.key !== void 0 && (obj.key = message.key); + message.value !== void 0 && (obj.value = message.value); + return obj; + } + Struct_FieldsEntry2.toJSON = toJSON; +})(Struct_FieldsEntry || (Struct_FieldsEntry = {})); +function createBaseValue() { + return { kind: void 0 }; +} +var Value; +(function(Value2) { + function encode(message, writer = import_minimal42.default.Writer.create()) { + switch (message.kind?.$case) { + case "nullValue": + writer.uint32(8).int32(message.kind.nullValue); + break; + case "numberValue": + writer.uint32(17).double(message.kind.numberValue); + break; + case "stringValue": + writer.uint32(26).string(message.kind.stringValue); + break; + case "boolValue": + writer.uint32(32).bool(message.kind.boolValue); + break; + case "structValue": + Struct.encode(Struct.wrap(message.kind.structValue), writer.uint32(42).fork()).ldelim(); + break; + case "listValue": + ListValue.encode(ListValue.wrap(message.kind.listValue), writer.uint32(50).fork()).ldelim(); + break; + } + return writer; + } + Value2.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal42.default.Reader ? input : import_minimal42.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBaseValue(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 8) { + break; + } + message.kind = { $case: "nullValue", nullValue: reader.int32() }; + continue; + case 2: + if (tag !== 17) { + break; + } + message.kind = { $case: "numberValue", numberValue: reader.double() }; + continue; + case 3: + if (tag !== 26) { + break; + } + message.kind = { $case: "stringValue", stringValue: reader.string() }; + continue; + case 4: + if (tag !== 32) { + break; + } + message.kind = { $case: "boolValue", boolValue: reader.bool() }; + continue; + case 5: + if (tag !== 42) { + break; + } + message.kind = { $case: "structValue", structValue: Struct.unwrap(Struct.decode(reader, reader.uint32())) }; + continue; + case 6: + if (tag !== 50) { + break; + } + message.kind = { $case: "listValue", listValue: ListValue.unwrap(ListValue.decode(reader, reader.uint32())) }; + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + Value2.decode = decode; + function fromJSON(object) { + return { + kind: isSet(object.nullValue) ? { $case: "nullValue", nullValue: nullValueFromJSON(object.nullValue) } : isSet(object.numberValue) ? { $case: "numberValue", numberValue: Number(object.numberValue) } : isSet(object.stringValue) ? { $case: "stringValue", stringValue: String(object.stringValue) } : isSet(object.boolValue) ? { $case: "boolValue", boolValue: Boolean(object.boolValue) } : isSet(object.structValue) ? { $case: "structValue", structValue: object.structValue } : isSet(object.listValue) ? { $case: "listValue", listValue: [...object.listValue] } : void 0 + }; + } + Value2.fromJSON = fromJSON; + function toJSON(message) { + const obj = {}; + message.kind?.$case === "nullValue" && (obj.nullValue = message.kind?.nullValue !== void 0 ? nullValueToJSON(message.kind?.nullValue) : void 0); + message.kind?.$case === "numberValue" && (obj.numberValue = message.kind?.numberValue); + message.kind?.$case === "stringValue" && (obj.stringValue = message.kind?.stringValue); + message.kind?.$case === "boolValue" && (obj.boolValue = message.kind?.boolValue); + message.kind?.$case === "structValue" && (obj.structValue = message.kind?.structValue); + message.kind?.$case === "listValue" && (obj.listValue = message.kind?.listValue); + return obj; + } + Value2.toJSON = toJSON; + function wrap(value) { + const result = createBaseValue(); + if (value === null) { + result.kind = { + $case: "nullValue", + nullValue: 0 + /* NullValue.NULL_VALUE */ + }; + } else if (typeof value === "boolean") { + result.kind = { $case: "boolValue", boolValue: value }; + } else if (typeof value === "number") { + result.kind = { $case: "numberValue", numberValue: value }; + } else if (typeof value === "string") { + result.kind = { $case: "stringValue", stringValue: value }; + } else if (Array.isArray(value)) { + result.kind = { $case: "listValue", listValue: value }; + } else if (typeof value === "object") { + result.kind = { $case: "structValue", structValue: value }; + } else if (typeof value !== "undefined") { + throw new Error("Unsupported any value type: " + typeof value); + } + return result; + } + Value2.wrap = wrap; + function unwrap(message) { + if (message.kind?.$case === "nullValue") { + return null; + } else if (message.kind?.$case === "numberValue") { + return message.kind?.numberValue; + } else if (message.kind?.$case === "stringValue") { + return message.kind?.stringValue; + } else if (message.kind?.$case === "boolValue") { + return message.kind?.boolValue; + } else if (message.kind?.$case === "structValue") { + return message.kind?.structValue; + } else if (message.kind?.$case === "listValue") { + return message.kind?.listValue; + } else { + return void 0; + } + } + Value2.unwrap = unwrap; +})(Value || (Value = {})); +function createBaseListValue() { + return { values: [] }; +} +var ListValue; +(function(ListValue2) { + function encode(message, writer = import_minimal42.default.Writer.create()) { + for (const v of message.values) { + Value.encode(Value.wrap(v), writer.uint32(10).fork()).ldelim(); + } + return writer; + } + ListValue2.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal42.default.Reader ? input : import_minimal42.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBaseListValue(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + message.values.push(Value.unwrap(Value.decode(reader, reader.uint32()))); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + ListValue2.decode = decode; + function fromJSON(object) { + return { values: Array.isArray(object?.values) ? [...object.values] : [] }; + } + ListValue2.fromJSON = fromJSON; + function toJSON(message) { + const obj = {}; + if (message.values) { + obj.values = message.values.map((e) => e); + } else { + obj.values = []; + } + return obj; + } + ListValue2.toJSON = toJSON; + function wrap(array) { + const result = createBaseListValue(); + result.values = array ?? []; + return result; + } + ListValue2.wrap = wrap; + function unwrap(message) { + if (message?.hasOwnProperty("values") && Array.isArray(message.values)) { + return message.values; + } else { + return message; + } + } + ListValue2.unwrap = unwrap; +})(ListValue || (ListValue = {})); +var tsProtoGlobalThis2 = (() => { + if (typeof globalThis !== "undefined") { + return globalThis; + } + if (typeof self !== "undefined") { + return self; + } + if (false) { + return void 0; + } + if (typeof global !== "undefined") { + return global; + } + throw "Unable to locate global object"; +})(); +function isObject(value) { + return typeof value === "object" && value !== null; +} +function isSet(value) { + return value !== null && value !== void 0; +} + +// node_modules/@dcl/ecs/dist/composite/proto/gen/composite.gen.js +function createBaseComponentData() { + return { data: void 0 }; +} +var ComponentData; +(function(ComponentData2) { + function encode(message, writer = import_minimal43.default.Writer.create()) { + switch (message.data?.$case) { + case "json": + Value.encode(Value.wrap(message.data.json), writer.uint32(10).fork()).ldelim(); + break; + case "binary": + writer.uint32(18).bytes(message.data.binary); + break; + } + return writer; + } + ComponentData2.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal43.default.Reader ? input : import_minimal43.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBaseComponentData(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + message.data = { $case: "json", json: Value.unwrap(Value.decode(reader, reader.uint32())) }; + continue; + case 2: + if (tag !== 18) { + break; + } + message.data = { $case: "binary", binary: reader.bytes() }; + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + ComponentData2.decode = decode; + function fromJSON(object) { + return { + data: isSet2(object.json) ? { $case: "json", json: object.json } : isSet2(object.binary) ? { $case: "binary", binary: bytesFromBase64(object.binary) } : void 0 + }; + } + ComponentData2.fromJSON = fromJSON; + function toJSON(message) { + const obj = {}; + message.data?.$case === "json" && (obj.json = message.data?.json); + message.data?.$case === "binary" && (obj.binary = message.data?.binary !== void 0 ? base64FromBytes(message.data?.binary) : void 0); + return obj; + } + ComponentData2.toJSON = toJSON; +})(ComponentData || (ComponentData = {})); +function createBaseCompositeComponent() { + return { name: "", jsonSchema: void 0, data: /* @__PURE__ */ new Map() }; +} +var CompositeComponent; +(function(CompositeComponent2) { + function encode(message, writer = import_minimal43.default.Writer.create()) { + if (message.name !== "") { + writer.uint32(10).string(message.name); + } + if (message.jsonSchema !== void 0) { + Value.encode(Value.wrap(message.jsonSchema), writer.uint32(18).fork()).ldelim(); + } + message.data.forEach((value, key) => { + CompositeComponent_DataEntry.encode({ key, value }, writer.uint32(26).fork()).ldelim(); + }); + return writer; + } + CompositeComponent2.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal43.default.Reader ? input : import_minimal43.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBaseCompositeComponent(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + message.name = reader.string(); + continue; + case 2: + if (tag !== 18) { + break; + } + message.jsonSchema = Value.unwrap(Value.decode(reader, reader.uint32())); + continue; + case 3: + if (tag !== 26) { + break; + } + const entry3 = CompositeComponent_DataEntry.decode(reader, reader.uint32()); + if (entry3.value !== void 0) { + message.data.set(entry3.key, entry3.value); + } + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + CompositeComponent2.decode = decode; + function fromJSON(object) { + return { + name: isSet2(object.name) ? String(object.name) : "", + jsonSchema: isSet2(object?.jsonSchema) ? object.jsonSchema : void 0, + data: isObject2(object.data) ? Object.entries(object.data).reduce((acc, [key, value]) => { + acc.set(Number(key), ComponentData.fromJSON(value)); + return acc; + }, /* @__PURE__ */ new Map()) : /* @__PURE__ */ new Map() + }; + } + CompositeComponent2.fromJSON = fromJSON; + function toJSON(message) { + const obj = {}; + message.name !== void 0 && (obj.name = message.name); + message.jsonSchema !== void 0 && (obj.jsonSchema = message.jsonSchema); + obj.data = {}; + if (message.data) { + message.data.forEach((v, k) => { + obj.data[k] = ComponentData.toJSON(v); + }); + } + return obj; + } + CompositeComponent2.toJSON = toJSON; +})(CompositeComponent || (CompositeComponent = {})); +function createBaseCompositeComponent_DataEntry() { + return { key: 0, value: void 0 }; +} +var CompositeComponent_DataEntry; +(function(CompositeComponent_DataEntry2) { + function encode(message, writer = import_minimal43.default.Writer.create()) { + if (message.key !== 0) { + writer.uint32(8).int32(message.key); + } + if (message.value !== void 0) { + ComponentData.encode(message.value, writer.uint32(18).fork()).ldelim(); + } + return writer; + } + CompositeComponent_DataEntry2.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal43.default.Reader ? input : import_minimal43.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBaseCompositeComponent_DataEntry(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 8) { + break; + } + message.key = reader.int32(); + continue; + case 2: + if (tag !== 18) { + break; + } + message.value = ComponentData.decode(reader, reader.uint32()); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + CompositeComponent_DataEntry2.decode = decode; + function fromJSON(object) { + return { + key: isSet2(object.key) ? Number(object.key) : 0, + value: isSet2(object.value) ? ComponentData.fromJSON(object.value) : void 0 + }; + } + CompositeComponent_DataEntry2.fromJSON = fromJSON; + function toJSON(message) { + const obj = {}; + message.key !== void 0 && (obj.key = Math.round(message.key)); + message.value !== void 0 && (obj.value = message.value ? ComponentData.toJSON(message.value) : void 0); + return obj; + } + CompositeComponent_DataEntry2.toJSON = toJSON; +})(CompositeComponent_DataEntry || (CompositeComponent_DataEntry = {})); +function createBaseCompositeDefinition() { + return { version: 0, components: [] }; +} +var CompositeDefinition; +(function(CompositeDefinition2) { + function encode(message, writer = import_minimal43.default.Writer.create()) { + if (message.version !== 0) { + writer.uint32(8).int32(message.version); + } + for (const v of message.components) { + CompositeComponent.encode(v, writer.uint32(18).fork()).ldelim(); + } + return writer; + } + CompositeDefinition2.encode = encode; + function decode(input, length2) { + const reader = input instanceof import_minimal43.default.Reader ? input : import_minimal43.default.Reader.create(input); + let end = length2 === void 0 ? reader.len : reader.pos + length2; + const message = createBaseCompositeDefinition(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 8) { + break; + } + message.version = reader.int32(); + continue; + case 2: + if (tag !== 18) { + break; + } + message.components.push(CompositeComponent.decode(reader, reader.uint32())); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + } + CompositeDefinition2.decode = decode; + function fromJSON(object) { + return { + version: isSet2(object.version) ? Number(object.version) : 0, + components: Array.isArray(object?.components) ? object.components.map((e) => CompositeComponent.fromJSON(e)) : [] + }; + } + CompositeDefinition2.fromJSON = fromJSON; + function toJSON(message) { + const obj = {}; + message.version !== void 0 && (obj.version = Math.round(message.version)); + if (message.components) { + obj.components = message.components.map((e) => e ? CompositeComponent.toJSON(e) : void 0); + } else { + obj.components = []; + } + return obj; + } + CompositeDefinition2.toJSON = toJSON; +})(CompositeDefinition || (CompositeDefinition = {})); +var tsProtoGlobalThis3 = (() => { + if (typeof globalThis !== "undefined") { + return globalThis; + } + if (typeof self !== "undefined") { + return self; + } + if (false) { + return void 0; + } + if (typeof global !== "undefined") { + return global; + } + throw "Unable to locate global object"; +})(); +function bytesFromBase64(b64) { + if (tsProtoGlobalThis3.Buffer) { + return Uint8Array.from(tsProtoGlobalThis3.Buffer.from(b64, "base64")); + } else { + const bin = tsProtoGlobalThis3.atob(b64); + const arr = new Uint8Array(bin.length); + for (let i = 0; i < bin.length; ++i) { + arr[i] = bin.charCodeAt(i); + } + return arr; + } +} +function base64FromBytes(arr) { + if (tsProtoGlobalThis3.Buffer) { + return tsProtoGlobalThis3.Buffer.from(arr).toString("base64"); + } else { + const bin = []; + arr.forEach((byte) => { + bin.push(String.fromCharCode(byte)); + }); + return tsProtoGlobalThis3.btoa(bin.join("")); + } +} +function isObject2(value) { + return typeof value === "object" && value !== null; +} +function isSet2(value) { + return value !== null && value !== void 0; +} + +// node_modules/@dcl/ecs/dist/composite/index.js +var Composite; +(function(Composite2) { + function fromJson(object) { + return CompositeDefinition.fromJSON(object); + } + Composite2.fromJson = fromJson; + function fromBinary(buffer) { + return CompositeDefinition.decode(buffer); + } + Composite2.fromBinary = fromBinary; + function toJson(composite) { + return CompositeDefinition.toJSON(composite); + } + Composite2.toJson = toJson; + function toBinary(composite) { + return CompositeDefinition.encode(composite).finish(); + } + Composite2.toBinary = toBinary; + function instance(engine2, compositeData, compositeProvider2, options = {}) { + instanceComposite(engine2, compositeData, compositeProvider2, options); + } + Composite2.instance = instance; + function resolveAndNormalizePath(src, cwd = "/") { + return resolveComposite(src, cwd); + } + Composite2.resolveAndNormalizePath = resolveAndNormalizePath; +})(Composite || (Composite = {})); + +// node_modules/@dcl/ecs/dist/index.js +var Transform2 = /* @__PURE__ */ Transform(engine); +var Animator3 = /* @__PURE__ */ Animator2(engine); +var Material3 = /* @__PURE__ */ Material2(engine); +var MeshRenderer3 = /* @__PURE__ */ MeshRenderer2(engine); +var MeshCollider3 = /* @__PURE__ */ MeshCollider2(engine); +var Name2 = Name(engine); +var Tween3 = /* @__PURE__ */ Tween2(engine); +var SyncComponents2 = /* @__PURE__ */ SyncComponents(engine); +var NetworkEntity2 = /* @__PURE__ */ NetworkEntity(engine); +var NetworkParent2 = /* @__PURE__ */ NetworkParent(engine); + +// node_modules/@dcl/ecs-math/dist/types.js +var ToGammaSpace = 1 / 2.2; +var ToLinearSpace = 2.2; +var Epsilon = 1e-6; +var DEG2RAD = Math.PI / 180; +var RAD2DEG = 360 / (Math.PI * 2); + +// node_modules/@dcl/ecs-math/dist/Scalar.js +var Scalar; +(function(Scalar2) { + Scalar2.TwoPi = Math.PI * 2; + function withinEpsilon(a, b, epsilon = 1401298e-51) { + const num = a - b; + return -epsilon <= num && num <= epsilon; + } + Scalar2.withinEpsilon = withinEpsilon; + function toHex(i) { + const str = i.toString(16); + if (i <= 15) { + return ("0" + str).toUpperCase(); + } + return str.toUpperCase(); + } + Scalar2.toHex = toHex; + function sign(value) { + const _value = +value; + if (_value === 0 || isNaN(_value)) { + return _value; + } + return _value > 0 ? 1 : -1; + } + Scalar2.sign = sign; + function clamp(value, min = 0, max = 1) { + return Math.min(max, Math.max(min, value)); + } + Scalar2.clamp = clamp; + function log2(value) { + return Math.log(value) * Math.LOG2E; + } + Scalar2.log2 = log2; + function repeat(value, length2) { + return value - Math.floor(value / length2) * length2; + } + Scalar2.repeat = repeat; + function normalize(value, min, max) { + return (value - min) / (max - min); + } + Scalar2.normalize = normalize; + function denormalize(normalized, min, max) { + return normalized * (max - min) + min; + } + Scalar2.denormalize = denormalize; + function deltaAngle(current, target) { + let num = repeat(target - current, 360); + if (num > 180) { + num -= 360; + } + return num; + } + Scalar2.deltaAngle = deltaAngle; + function pingPong(tx, length2) { + const t = repeat(tx, length2 * 2); + return length2 - Math.abs(t - length2); + } + Scalar2.pingPong = pingPong; + function smoothStep(from, to, tx) { + let t = clamp(tx); + t = -2 * t * t * t + 3 * t * t; + return to * t + from * (1 - t); + } + Scalar2.smoothStep = smoothStep; + function moveTowards(current, target, maxDelta) { + let result = 0; + if (Math.abs(target - current) <= maxDelta) { + result = target; + } else { + result = current + sign(target - current) * maxDelta; + } + return result; + } + Scalar2.moveTowards = moveTowards; + function moveTowardsAngle(current, target, maxDelta) { + const num = deltaAngle(current, target); + let result = 0; + if (-maxDelta < num && num < maxDelta) { + result = target; + } else { + result = moveTowards(current, current + num, maxDelta); + } + return result; + } + Scalar2.moveTowardsAngle = moveTowardsAngle; + function lerp(start, end, amount) { + return start + (end - start) * amount; + } + Scalar2.lerp = lerp; + function lerpAngle(start, end, amount) { + let num = repeat(end - start, 360); + if (num > 180) { + num -= 360; + } + return start + num * clamp(amount); + } + Scalar2.lerpAngle = lerpAngle; + function inverseLerp(a, b, value) { + let result = 0; + if (a !== b) { + result = clamp((value - a) / (b - a)); + } else { + result = 0; + } + return result; + } + Scalar2.inverseLerp = inverseLerp; + function hermite(value1, tangent1, value2, tangent2, amount) { + const squared = amount * amount; + const cubed = amount * squared; + const part1 = 2 * cubed - 3 * squared + 1; + const part2 = -2 * cubed + 3 * squared; + const part3 = cubed - 2 * squared + amount; + const part4 = cubed - squared; + return value1 * part1 + value2 * part2 + tangent1 * part3 + tangent2 * part4; + } + Scalar2.hermite = hermite; + function randomRange(min, max) { + if (min === max) { + return min; + } + return Math.random() * (max - min) + min; + } + Scalar2.randomRange = randomRange; + function rangeToPercent(num, min, max) { + return (num - min) / (max - min); + } + Scalar2.rangeToPercent = rangeToPercent; + function percentToRange(percent, min, max) { + return (max - min) * percent + min; + } + Scalar2.percentToRange = percentToRange; + function normalizeRadians(angle) { + return angle - Scalar2.TwoPi * Math.floor((angle + Math.PI) / Scalar2.TwoPi); + } + Scalar2.normalizeRadians = normalizeRadians; +})(Scalar || (Scalar = {})); + +// node_modules/@dcl/ecs-math/dist/Vector3.js +var Vector32; +(function(Vector33) { + function isNonUniform(vector) { + const absX = Math.abs(vector.x); + const absY = Math.abs(vector.y); + if (absX !== absY) { + return true; + } + const absZ = Math.abs(vector.z); + if (absX !== absZ) { + return true; + } + return false; + } + Vector33.isNonUniform = isNonUniform; + function create(x = 0, y = 0, z = 0) { + return { x, y, z }; + } + Vector33.create = create; + function add2(vector1, vector2) { + return { + x: vector1.x + vector2.x, + y: vector1.y + vector2.y, + z: vector1.z + vector2.z + }; + } + Vector33.add = add2; + function addToRef(vector1, vector2, result) { + result.x = vector1.x + vector2.x; + result.y = vector1.y + vector2.y; + result.z = vector1.z + vector2.z; + } + Vector33.addToRef = addToRef; + function subtract2(vector1, vector2) { + return { + x: vector1.x - vector2.x, + y: vector1.y - vector2.y, + z: vector1.z - vector2.z + }; + } + Vector33.subtract = subtract2; + function subtractToRef(vector1, vector2, result) { + result.x = vector1.x - vector2.x; + result.y = vector1.y - vector2.y; + result.z = vector1.z - vector2.z; + } + Vector33.subtractToRef = subtractToRef; + function subtractFromFloatsToRef(vector1, x, y, z, result) { + result.x = vector1.x - x; + result.y = vector1.y - y; + result.z = vector1.z - z; + } + Vector33.subtractFromFloatsToRef = subtractFromFloatsToRef; + function negate2(value) { + return { x: -value.x, y: -value.y, z: -value.z }; + } + Vector33.negate = negate2; + function copyFrom(source, dest) { + dest.x = source.x; + dest.y = source.y; + dest.z = source.z; + } + Vector33.copyFrom = copyFrom; + function copyFromFloats(x, y, z, dest) { + dest.x = x; + dest.y = y; + dest.z = z; + } + Vector33.copyFromFloats = copyFromFloats; + function clone2(source) { + return create(source.x, source.y, source.z); + } + Vector33.clone = clone2; + function getClipFactor(vector0, vector1, axis, size) { + const d0 = dot(vector0, axis) - size; + const d1 = dot(vector1, axis) - size; + const s = d0 / (d0 - d1); + return s; + } + Vector33.getClipFactor = getClipFactor; + function getAngleBetweenVectors(vector0, vector1, normal) { + const v0 = normalize(vector0); + const v1 = normalize(vector1); + const v0v1dot = dot(v0, v1); + const n = create(); + crossToRef(v0, v1, n); + if (dot(n, normal) > 0) { + return Math.acos(v0v1dot); + } + return -Math.acos(v0v1dot); + } + Vector33.getAngleBetweenVectors = getAngleBetweenVectors; + function fromArray(array, offset = 0) { + return create(array[offset], array[offset + 1], array[offset + 2]); + } + Vector33.fromArray = fromArray; + function fromFloatArray(array, offset) { + return fromArray(array, offset); + } + Vector33.fromFloatArray = fromFloatArray; + function fromArrayToRef(array, offset, result) { + result.x = array[offset]; + result.y = array[offset + 1]; + result.z = array[offset + 2]; + } + Vector33.fromArrayToRef = fromArrayToRef; + function fromFloatArrayToRef(array, offset, result) { + return fromArrayToRef(array, offset, result); + } + Vector33.fromFloatArrayToRef = fromFloatArrayToRef; + function length2(vector) { + return Math.sqrt(vector.x * vector.x + vector.y * vector.y + vector.z * vector.z); + } + Vector33.length = length2; + function lengthSquared(vector) { + return vector.x * vector.x + vector.y * vector.y + vector.z * vector.z; + } + Vector33.lengthSquared = lengthSquared; + function scaleToRef(vector, scale2, result) { + result.x = vector.x * scale2; + result.y = vector.y * scale2; + result.z = vector.z * scale2; + } + Vector33.scaleToRef = scaleToRef; + function scale(vector, scale2) { + return create(vector.x * scale2, vector.y * scale2, vector.z * scale2); + } + Vector33.scale = scale; + function normalizeFromLength(vector, len) { + const result = create(0, 0, 0); + normalizeFromLengthToRef(vector, len, result); + return result; + } + Vector33.normalizeFromLength = normalizeFromLength; + function normalizeFromLengthToRef(vector, len, result) { + if (len === 0 || len === 1) { + copyFrom(vector, result); + return; + } + scaleToRef(vector, 1 / len, result); + } + Vector33.normalizeFromLengthToRef = normalizeFromLengthToRef; + function normalize(vector) { + return normalizeFromLength(vector, length2(vector)); + } + Vector33.normalize = normalize; + function normalizeToRef(vector, result) { + normalizeFromLengthToRef(vector, length2(vector), result); + } + Vector33.normalizeToRef = normalizeToRef; + function dot(left, right) { + return left.x * right.x + left.y * right.y + left.z * right.z; + } + Vector33.dot = dot; + function applyMatrix4(vector, matrix) { + const result = clone2(vector); + applyMatrix4ToRef(vector, matrix, result); + return result; + } + Vector33.applyMatrix4 = applyMatrix4; + function applyMatrix4ToRef(vector, matrix, result) { + const { x, y, z } = vector; + const m = matrix._m; + const w = 1 / (m[3] * x + m[7] * y + m[11] * z + m[15]); + result.x = (m[0] * x + m[4] * y + m[8] * z + m[12]) * w; + result.y = (m[1] * x + m[5] * y + m[9] * z + m[13]) * w; + result.z = (m[2] * x + m[6] * y + m[10] * z + m[14]) * w; + } + Vector33.applyMatrix4ToRef = applyMatrix4ToRef; + function rotate(vector, q) { + const result = create(); + rotateToRef(vector, q, result); + return result; + } + Vector33.rotate = rotate; + function rotateToRef(vector, q, result) { + const { x, y, z } = vector; + const { x: qx, y: qy, z: qz, w: qw } = q; + const ix = qw * x + qy * z - qz * y; + const iy = qw * y + qz * x - qx * z; + const iz = qw * z + qx * y - qy * x; + const iw = -qx * x - qy * y - qz * z; + result.x = ix * qw + iw * -qx + iy * -qz - iz * -qy; + result.y = iy * qw + iw * -qy + iz * -qx - ix * -qz; + result.z = iz * qw + iw * -qz + ix * -qy - iy * -qx; + } + Vector33.rotateToRef = rotateToRef; + function lerp(start, end, amount) { + const result = create(0, 0, 0); + lerpToRef(start, end, amount, result); + return result; + } + Vector33.lerp = lerp; + function lerpToRef(start, end, amount, result) { + result.x = start.x + (end.x - start.x) * amount; + result.y = start.y + (end.y - start.y) * amount; + result.z = start.z + (end.z - start.z) * amount; + } + Vector33.lerpToRef = lerpToRef; + function cross(left, right) { + const result = Zero(); + crossToRef(left, right, result); + return result; + } + Vector33.cross = cross; + function crossToRef(left, right, result) { + result.x = left.y * right.z - left.z * right.y; + result.y = left.z * right.x - left.x * right.z; + result.z = left.x * right.y - left.y * right.x; + } + Vector33.crossToRef = crossToRef; + function transformCoordinates(vector, transformation) { + const result = Zero(); + transformCoordinatesToRef(vector, transformation, result); + return result; + } + Vector33.transformCoordinates = transformCoordinates; + function transformCoordinatesToRef(vector, transformation, result) { + return transformCoordinatesFromFloatsToRef(vector.x, vector.y, vector.z, transformation, result); + } + Vector33.transformCoordinatesToRef = transformCoordinatesToRef; + function transformCoordinatesFromFloatsToRef(x, y, z, transformation, result) { + const m = transformation._m; + const rx = x * m[0] + y * m[4] + z * m[8] + m[12]; + const ry = x * m[1] + y * m[5] + z * m[9] + m[13]; + const rz = x * m[2] + y * m[6] + z * m[10] + m[14]; + const rw = 1 / (x * m[3] + y * m[7] + z * m[11] + m[15]); + result.x = rx * rw; + result.y = ry * rw; + result.z = rz * rw; + } + Vector33.transformCoordinatesFromFloatsToRef = transformCoordinatesFromFloatsToRef; + function transformNormal(vector, transformation) { + const result = Zero(); + transformNormalToRef(vector, transformation, result); + return result; + } + Vector33.transformNormal = transformNormal; + function transformNormalToRef(vector, transformation, result) { + transformNormalFromFloatsToRef(vector.x, vector.y, vector.z, transformation, result); + } + Vector33.transformNormalToRef = transformNormalToRef; + function transformNormalFromFloatsToRef(x, y, z, transformation, result) { + const m = transformation._m; + result.x = x * m[0] + y * m[4] + z * m[8]; + result.y = x * m[1] + y * m[5] + z * m[9]; + result.z = x * m[2] + y * m[6] + z * m[10]; + } + Vector33.transformNormalFromFloatsToRef = transformNormalFromFloatsToRef; + function catmullRom(value1, value2, value3, value4, amount) { + const squared = amount * amount; + const cubed = amount * squared; + const x = 0.5 * (2 * value2.x + (-value1.x + value3.x) * amount + (2 * value1.x - 5 * value2.x + 4 * value3.x - value4.x) * squared + (-value1.x + 3 * value2.x - 3 * value3.x + value4.x) * cubed); + const y = 0.5 * (2 * value2.y + (-value1.y + value3.y) * amount + (2 * value1.y - 5 * value2.y + 4 * value3.y - value4.y) * squared + (-value1.y + 3 * value2.y - 3 * value3.y + value4.y) * cubed); + const z = 0.5 * (2 * value2.z + (-value1.z + value3.z) * amount + (2 * value1.z - 5 * value2.z + 4 * value3.z - value4.z) * squared + (-value1.z + 3 * value2.z - 3 * value3.z + value4.z) * cubed); + return create(x, y, z); + } + Vector33.catmullRom = catmullRom; + function clamp(value, min, max) { + const v = create(); + clampToRef(value, min, max, v); + return v; + } + Vector33.clamp = clamp; + function clampToRef(value, min, max, result) { + let x = value.x; + x = x > max.x ? max.x : x; + x = x < min.x ? min.x : x; + let y = value.y; + y = y > max.y ? max.y : y; + y = y < min.y ? min.y : y; + let z = value.z; + z = z > max.z ? max.z : z; + z = z < min.z ? min.z : z; + copyFromFloats(x, y, z, result); + } + Vector33.clampToRef = clampToRef; + function hermite(value1, tangent1, value2, tangent2, amount) { + const squared = amount * amount; + const cubed = amount * squared; + const part1 = 2 * cubed - 3 * squared + 1; + const part2 = -2 * cubed + 3 * squared; + const part3 = cubed - 2 * squared + amount; + const part4 = cubed - squared; + const x = value1.x * part1 + value2.x * part2 + tangent1.x * part3 + tangent2.x * part4; + const y = value1.y * part1 + value2.y * part2 + tangent1.y * part3 + tangent2.y * part4; + const z = value1.z * part1 + value2.z * part2 + tangent1.z * part3 + tangent2.z * part4; + return create(x, y, z); + } + Vector33.hermite = hermite; + function minimize(left, right) { + const min = create(); + minimizeInPlaceFromFloatsToRef(right, left.x, left.y, left.z, min); + return min; + } + Vector33.minimize = minimize; + function maximize(left, right) { + const max = create(); + maximizeInPlaceFromFloatsToRef(left, right.x, right.y, right.z, max); + return max; + } + Vector33.maximize = maximize; + function distance(value1, value2) { + return Math.sqrt(distanceSquared(value1, value2)); + } + Vector33.distance = distance; + function distanceSquared(value1, value2) { + const x = value1.x - value2.x; + const y = value1.y - value2.y; + const z = value1.z - value2.z; + return x * x + y * y + z * z; + } + Vector33.distanceSquared = distanceSquared; + function center(value1, value2) { + const center2 = add2(value1, value2); + scaleToRef(center2, 0.5, center2); + return center2; + } + Vector33.center = center; + function rotationFromAxis(axis1, axis2, axis3) { + const rotation = Zero(); + rotationFromAxisToRef(axis1, axis2, axis3, rotation); + return rotation; + } + Vector33.rotationFromAxis = rotationFromAxis; + function rotationFromAxisToRef(axis1, axis2, axis3, result) { + const quat = Quaternion2.create(); + Quaternion2.fromAxisToRotationQuaternionToRef(axis1, axis2, axis3, quat); + copyFrom(Quaternion2.toEulerAngles(quat), result); + } + Vector33.rotationFromAxisToRef = rotationFromAxisToRef; + function toString2(vector) { + return `(${vector.x}, ${vector.y}, ${vector.z})`; + } + Vector33.toString = toString2; + function getHashCode(vector) { + let hash = vector.x || 0; + hash = hash * 397 ^ (vector.y || 0); + hash = hash * 397 ^ (vector.z || 0); + return hash; + } + Vector33.getHashCode = getHashCode; + function equals2(vector1, vector2) { + return vector1.x === vector2.x && vector1.y === vector2.y && vector1.z === vector2.z; + } + Vector33.equals = equals2; + function equalsWithEpsilon(vector1, vector2, epsilon = Epsilon) { + return Scalar.withinEpsilon(vector1.x, vector2.x, epsilon) && Scalar.withinEpsilon(vector1.y, vector2.y, epsilon) && Scalar.withinEpsilon(vector1.z, vector2.z, epsilon); + } + Vector33.equalsWithEpsilon = equalsWithEpsilon; + function equalsToFloats(vector, x, y, z) { + return vector.x === x && vector.y === y && vector.z === z; + } + Vector33.equalsToFloats = equalsToFloats; + function multiply2(vector1, vector2) { + const result = create(); + multiplyToRef(vector1, vector2, result); + return result; + } + Vector33.multiply = multiply2; + function multiplyToRef(vector1, vector2, result) { + result.x = vector1.x * vector2.x; + result.y = vector1.y * vector2.y; + result.z = vector1.z * vector2.z; + } + Vector33.multiplyToRef = multiplyToRef; + function multiplyByFloatsToRef(vector1, x, y, z, result) { + result.x = vector1.x * x; + result.y = vector1.y * y; + result.z = vector1.z * z; + } + Vector33.multiplyByFloatsToRef = multiplyByFloatsToRef; + function multiplyByFloats(vector1, x, y, z) { + const result = create(); + multiplyByFloatsToRef(vector1, x, y, z, result); + return result; + } + Vector33.multiplyByFloats = multiplyByFloats; + function divide2(vector1, vector2) { + return { + x: vector1.x / vector2.x, + y: vector1.y / vector2.y, + z: vector1.z / vector2.z + }; + } + Vector33.divide = divide2; + function divideToRef(vector1, vector2, result) { + result.x = vector1.x / vector2.x; + result.y = vector1.y / vector2.y; + result.z = vector1.z / vector2.z; + } + Vector33.divideToRef = divideToRef; + function maximizeInPlaceFromFloatsToRef(vector1, x, y, z, result) { + if (x > vector1.x) { + result.x = x; + } else { + result.x = vector1.x; + } + if (y > vector1.y) { + result.y = y; + } else { + result.y = vector1.y; + } + if (z > vector1.z) { + result.z = z; + } else { + result.z = vector1.z; + } + } + Vector33.maximizeInPlaceFromFloatsToRef = maximizeInPlaceFromFloatsToRef; + function minimizeInPlaceFromFloatsToRef(vector1, x, y, z, result) { + if (x < vector1.x) { + result.x = x; + } else { + result.x = vector1.x; + } + if (y < vector1.y) { + result.y = y; + } else { + result.y = vector1.y; + } + if (z < vector1.z) { + result.z = z; + } else { + result.z = vector1.z; + } + } + Vector33.minimizeInPlaceFromFloatsToRef = minimizeInPlaceFromFloatsToRef; + function floor(vector1) { + return create(Math.floor(vector1.x), Math.floor(vector1.y), Math.floor(vector1.z)); + } + Vector33.floor = floor; + function fract(vector1) { + return create(vector1.x - Math.floor(vector1.x), vector1.y - Math.floor(vector1.y), vector1.z - Math.floor(vector1.z)); + } + Vector33.fract = fract; + function Zero() { + return create(0, 0, 0); + } + Vector33.Zero = Zero; + function One() { + return create(1, 1, 1); + } + Vector33.One = One; + function Up() { + return create(0, 1, 0); + } + Vector33.Up = Up; + function Down() { + return create(0, -1, 0); + } + Vector33.Down = Down; + function Forward() { + return create(0, 0, 1); + } + Vector33.Forward = Forward; + function Backward() { + return create(0, 0, -1); + } + Vector33.Backward = Backward; + function Right() { + return create(1, 0, 0); + } + Vector33.Right = Right; + function Left() { + return create(-1, 0, 0); + } + Vector33.Left = Left; + function Random() { + return create(Math.random(), Math.random(), Math.random()); + } + Vector33.Random = Random; +})(Vector32 || (Vector32 = {})); + +// node_modules/@dcl/ecs-math/dist/Plane.js +var Plane; +(function(Plane2) { + function create(a, b, c, d) { + return { + normal: Vector32.create(a, b, c), + d + }; + } + Plane2.create = create; + function fromArray(array) { + return create(array[0], array[1], array[2], array[3]); + } + Plane2.fromArray = fromArray; + function fromPoints(_point1, _point2, _point3) { + const result = create(0, 0, 0, 0); + return result; + } + Plane2.fromPoints = fromPoints; + function romPositionAndNormal(origin, normal) { + const result = create(0, 0, 0, 0); + result.normal = Vector32.normalize(normal); + result.d = -(normal.x * origin.x + normal.y * origin.y + normal.z * origin.z); + return result; + } + Plane2.romPositionAndNormal = romPositionAndNormal; + function signedDistanceToPlaneFromPositionAndNormal(origin, normal, point) { + const d = -(normal.x * origin.x + normal.y * origin.y + normal.z * origin.z); + return Vector32.dot(point, normal) + d; + } + Plane2.signedDistanceToPlaneFromPositionAndNormal = signedDistanceToPlaneFromPositionAndNormal; + function asArray(plane) { + return [plane.normal.x, plane.normal.y, plane.normal.z, plane.d]; + } + Plane2.asArray = asArray; + function clone2(plane) { + return create(plane.normal.x, plane.normal.y, plane.normal.z, plane.d); + } + Plane2.clone = clone2; + function getHashCode(_plane) { + return 0; + } + Plane2.getHashCode = getHashCode; + function normalize(plane) { + const result = create(0, 0, 0, 0); + const norm = Math.sqrt(plane.normal.x * plane.normal.x + plane.normal.y * plane.normal.y + plane.normal.z * plane.normal.z); + let magnitude = 0; + if (norm !== 0) { + magnitude = 1 / norm; + } + result.normal.x = plane.normal.x * magnitude; + result.normal.y = plane.normal.y * magnitude; + result.normal.z = plane.normal.z * magnitude; + result.d *= magnitude; + return plane; + } + Plane2.normalize = normalize; + function transform(plane, transformation) { + const transposedMatrix = Matrix.create(); + Matrix.transposeToRef(transformation, transposedMatrix); + const m = transposedMatrix._m; + const x = plane.normal.x; + const y = plane.normal.y; + const z = plane.normal.z; + const d = plane.d; + const normalX = x * m[0] + y * m[1] + z * m[2] + d * m[3]; + const normalY = x * m[4] + y * m[5] + z * m[6] + d * m[7]; + const normalZ = x * m[8] + y * m[9] + z * m[10] + d * m[11]; + const finalD = x * m[12] + y * m[13] + z * m[14] + d * m[15]; + return create(normalX, normalY, normalZ, finalD); + } + Plane2.transform = transform; + function dotCoordinate(plane, point) { + return plane.normal.x * point.x + plane.normal.y * point.y + plane.normal.z * point.z + plane.d; + } + Plane2.dotCoordinate = dotCoordinate; + function copyFromPoints(point1, point2, point3) { + const x1 = point2.x - point1.x; + const y1 = point2.y - point1.y; + const z1 = point2.z - point1.z; + const x2 = point3.x - point1.x; + const y2 = point3.y - point1.y; + const z2 = point3.z - point1.z; + const yz = y1 * z2 - z1 * y2; + const xz = z1 * x2 - x1 * z2; + const xy = x1 * y2 - y1 * x2; + const pyth = Math.sqrt(yz * yz + xz * xz + xy * xy); + let invPyth; + if (pyth !== 0) { + invPyth = 1 / pyth; + } else { + invPyth = 0; + } + const normal = Vector32.create(yz * invPyth, xz * invPyth, xy * invPyth); + return { + normal, + d: -(normal.x * point1.x + normal.y * point1.y + normal.z * point1.z) + }; + } + Plane2.copyFromPoints = copyFromPoints; + function isFrontFacingTo(plane, direction, epsilon) { + const dot = Vector32.dot(plane.normal, direction); + return dot <= epsilon; + } + Plane2.isFrontFacingTo = isFrontFacingTo; + function signedDistanceTo(plane, point) { + return Vector32.dot(point, plane.normal) + plane.d; + } + Plane2.signedDistanceTo = signedDistanceTo; +})(Plane || (Plane = {})); + +// node_modules/@dcl/ecs-math/dist/Matrix.js +var Matrix; +(function(Matrix2) { + function m(self2) { + return self2._m; + } + Matrix2.m = m; + let _updateFlagSeed = 0; + const _identityReadonly = {}; + function IdentityReadonly() { + return _identityReadonly; + } + Matrix2.IdentityReadonly = IdentityReadonly; + function create() { + const newMatrix = { + updateFlag: 0, + isIdentity: false, + isIdentity3x2: true, + _isIdentityDirty: true, + _isIdentity3x2Dirty: true, + _m: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + }; + _updateIdentityStatus(newMatrix, false); + return newMatrix; + } + Matrix2.create = create; + function fromArray(array, offset = 0) { + const result = create(); + fromArrayToRef(array, offset, result); + return result; + } + Matrix2.fromArray = fromArray; + function fromArrayToRef(array, offset, result) { + for (let index = 0; index < 16; index++) { + result._m[index] = array[index + offset]; + } + _markAsUpdated(result); + } + Matrix2.fromArrayToRef = fromArrayToRef; + function fromFloatArrayToRefScaled(array, offset, scale2, result) { + for (let index = 0; index < 16; index++) { + result._m[index] = array[index + offset] * scale2; + } + _markAsUpdated(result); + } + Matrix2.fromFloatArrayToRefScaled = fromFloatArrayToRefScaled; + function fromValuesToRef(initialM11, initialM12, initialM13, initialM14, initialM21, initialM22, initialM23, initialM24, initialM31, initialM32, initialM33, initialM34, initialM41, initialM42, initialM43, initialM44, result) { + const m2 = result._m; + m2[0] = initialM11; + m2[1] = initialM12; + m2[2] = initialM13; + m2[3] = initialM14; + m2[4] = initialM21; + m2[5] = initialM22; + m2[6] = initialM23; + m2[7] = initialM24; + m2[8] = initialM31; + m2[9] = initialM32; + m2[10] = initialM33; + m2[11] = initialM34; + m2[12] = initialM41; + m2[13] = initialM42; + m2[14] = initialM43; + m2[15] = initialM44; + _markAsUpdated(result); + } + Matrix2.fromValuesToRef = fromValuesToRef; + function fromValues(initialM11, initialM12, initialM13, initialM14, initialM21, initialM22, initialM23, initialM24, initialM31, initialM32, initialM33, initialM34, initialM41, initialM42, initialM43, initialM44) { + const result = create(); + const m2 = result._m; + m2[0] = initialM11; + m2[1] = initialM12; + m2[2] = initialM13; + m2[3] = initialM14; + m2[4] = initialM21; + m2[5] = initialM22; + m2[6] = initialM23; + m2[7] = initialM24; + m2[8] = initialM31; + m2[9] = initialM32; + m2[10] = initialM33; + m2[11] = initialM34; + m2[12] = initialM41; + m2[13] = initialM42; + m2[14] = initialM43; + m2[15] = initialM44; + _markAsUpdated(result); + return result; + } + Matrix2.fromValues = fromValues; + function compose(scale2, rotation, translation2) { + const result = create(); + composeToRef(scale2, rotation, translation2, result); + return result; + } + Matrix2.compose = compose; + function composeToRef(scale2, rotation, translation2, result) { + const tmpMatrix = [create(), create(), create()]; + scalingToRef(scale2.x, scale2.y, scale2.z, tmpMatrix[1]); + fromQuaternionToRef(rotation, tmpMatrix[0]); + multiplyToRef(tmpMatrix[1], tmpMatrix[0], result); + setTranslation(result, translation2); + } + Matrix2.composeToRef = composeToRef; + function Identity() { + const identity = fromValues(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + _updateIdentityStatus(identity, true); + return identity; + } + Matrix2.Identity = Identity; + function IdentityToRef(result) { + fromValuesToRef(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, result); + _updateIdentityStatus(result, true); + } + Matrix2.IdentityToRef = IdentityToRef; + function Zero() { + const zero = fromValues(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + _updateIdentityStatus(zero, false); + return zero; + } + Matrix2.Zero = Zero; + function RotationX(angle) { + const result = create(); + rotationXToRef(angle, result); + return result; + } + Matrix2.RotationX = RotationX; + function rotationXToRef(angle, result) { + const s = Math.sin(angle); + const c = Math.cos(angle); + fromValuesToRef(1, 0, 0, 0, 0, c, s, 0, 0, -s, c, 0, 0, 0, 0, 1, result); + _updateIdentityStatus(result, c === 1 && s === 0); + } + Matrix2.rotationXToRef = rotationXToRef; + function rotationY(angle) { + const result = create(); + rotationYToRef(angle, result); + return result; + } + Matrix2.rotationY = rotationY; + function rotationYToRef(angle, result) { + const s = Math.sin(angle); + const c = Math.cos(angle); + fromValuesToRef(c, 0, -s, 0, 0, 1, 0, 0, s, 0, c, 0, 0, 0, 0, 1, result); + _updateIdentityStatus(result, c === 1 && s === 0); + } + Matrix2.rotationYToRef = rotationYToRef; + function rotationZ(angle) { + const result = create(); + rotationZToRef(angle, result); + return result; + } + Matrix2.rotationZ = rotationZ; + function rotationZToRef(angle, result) { + const s = Math.sin(angle); + const c = Math.cos(angle); + fromValuesToRef(c, s, 0, 0, -s, c, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, result); + _updateIdentityStatus(result, c === 1 && s === 0); + } + Matrix2.rotationZToRef = rotationZToRef; + function rotationAxis(axis, angle) { + const result = create(); + rotationAxisToRef(axis, angle, result); + return result; + } + Matrix2.rotationAxis = rotationAxis; + function rotationAxisToRef(_axis, angle, result) { + const s = Math.sin(-angle); + const c = Math.cos(-angle); + const c1 = 1 - c; + const axis = Vector32.normalize(_axis); + const m2 = result._m; + m2[0] = axis.x * axis.x * c1 + c; + m2[1] = axis.x * axis.y * c1 - axis.z * s; + m2[2] = axis.x * axis.z * c1 + axis.y * s; + m2[3] = 0; + m2[4] = axis.y * axis.x * c1 + axis.z * s; + m2[5] = axis.y * axis.y * c1 + c; + m2[6] = axis.y * axis.z * c1 - axis.x * s; + m2[7] = 0; + m2[8] = axis.z * axis.x * c1 - axis.y * s; + m2[9] = axis.z * axis.y * c1 + axis.x * s; + m2[10] = axis.z * axis.z * c1 + c; + m2[11] = 0; + m2[12] = 0; + m2[13] = 0; + m2[14] = 0; + m2[15] = 1; + _markAsUpdated(result); + } + Matrix2.rotationAxisToRef = rotationAxisToRef; + function rotationYawPitchRoll(yaw, pitch, roll) { + const result = create(); + rotationYawPitchRollToRef(yaw, pitch, roll, result); + return result; + } + Matrix2.rotationYawPitchRoll = rotationYawPitchRoll; + function rotationYawPitchRollToRef(yaw, pitch, roll, result) { + const quaternionResult = Quaternion2.Zero(); + Quaternion2.fromRotationYawPitchRollToRef(yaw, pitch, roll, quaternionResult); + fromQuaternionToRef(quaternionResult, result); + } + Matrix2.rotationYawPitchRollToRef = rotationYawPitchRollToRef; + function scaling(x, y, z) { + const result = create(); + scalingToRef(x, y, z, result); + return result; + } + Matrix2.scaling = scaling; + function scalingToRef(x, y, z, result) { + fromValuesToRef(x, 0, 0, 0, 0, y, 0, 0, 0, 0, z, 0, 0, 0, 0, 1, result); + _updateIdentityStatus(result, x === 1 && y === 1 && z === 1); + } + Matrix2.scalingToRef = scalingToRef; + function translation(x, y, z) { + const result = create(); + translationToRef(x, y, z, result); + return result; + } + Matrix2.translation = translation; + function translationToRef(x, y, z, result) { + fromValuesToRef(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, x, y, z, 1, result); + _updateIdentityStatus(result, x === 0 && y === 0 && z === 0); + } + Matrix2.translationToRef = translationToRef; + function lerp(startValue, endValue, gradient) { + const result = create(); + lerpToRef(startValue, endValue, gradient, result); + return result; + } + Matrix2.lerp = lerp; + function lerpToRef(startValue, endValue, gradient, result) { + for (let index = 0; index < 16; index++) { + result._m[index] = startValue._m[index] * (1 - gradient) + endValue._m[index] * gradient; + } + _markAsUpdated(result); + } + Matrix2.lerpToRef = lerpToRef; + function decomposeLerp(startValue, endValue, gradient) { + const result = create(); + decomposeLerpToRef(startValue, endValue, gradient, result); + return result; + } + Matrix2.decomposeLerp = decomposeLerp; + function decomposeLerpToRef(startValue, endValue, gradient, result) { + const startScale = Vector32.Zero(); + const startRotation = Quaternion2.Zero(); + const startTranslation = Vector32.Zero(); + decompose(startValue, startScale, startRotation, startTranslation); + const endScale = Vector32.Zero(); + const endRotation = Quaternion2.Zero(); + const endTranslation = Vector32.Zero(); + decompose(endValue, endScale, endRotation, endTranslation); + const resultScale = Vector32.Zero(); + Vector32.lerpToRef(startScale, endScale, gradient, resultScale); + const resultRotation = Quaternion2.Zero(); + Quaternion2.slerpToRef(startRotation, endRotation, gradient, resultRotation); + const resultTranslation = Vector32.Zero(); + Vector32.lerpToRef(startTranslation, endTranslation, gradient, resultTranslation); + composeToRef(resultScale, resultRotation, resultTranslation, result); + } + Matrix2.decomposeLerpToRef = decomposeLerpToRef; + function LookAtLH(eye, target, up) { + const result = create(); + lookAtLHToRef(eye, target, up, result); + return result; + } + Matrix2.LookAtLH = LookAtLH; + function lookAtLHToRef(eye, target, up, result) { + const xAxis = Vector32.Zero(); + const yAxis = Vector32.Zero(); + const zAxis = Vector32.Zero(); + Vector32.subtractToRef(target, eye, zAxis); + Vector32.normalizeToRef(zAxis, zAxis); + Vector32.crossToRef(up, zAxis, xAxis); + const xSquareLength = Vector32.lengthSquared(xAxis); + if (xSquareLength === 0) { + xAxis.x = 1; + } else { + Vector32.normalizeFromLengthToRef(xAxis, Math.sqrt(xSquareLength), xAxis); + } + Vector32.crossToRef(zAxis, xAxis, yAxis); + Vector32.normalizeToRef(yAxis, yAxis); + const ex = -Vector32.dot(xAxis, eye); + const ey = -Vector32.dot(yAxis, eye); + const ez = -Vector32.dot(zAxis, eye); + fromValuesToRef(xAxis.x, yAxis.x, zAxis.x, 0, xAxis.y, yAxis.y, zAxis.y, 0, xAxis.z, yAxis.z, zAxis.z, 0, ex, ey, ez, 1, result); + } + Matrix2.lookAtLHToRef = lookAtLHToRef; + function lookAtRH(eye, target, up) { + const result = create(); + lookAtRHToRef(eye, target, up, result); + return result; + } + Matrix2.lookAtRH = lookAtRH; + function lookAtRHToRef(eye, target, up, result) { + const xAxis = Vector32.Zero(); + const yAxis = Vector32.Zero(); + const zAxis = Vector32.Zero(); + Vector32.subtractToRef(eye, target, zAxis); + Vector32.normalizeToRef(zAxis, zAxis); + Vector32.crossToRef(up, zAxis, xAxis); + const xSquareLength = Vector32.lengthSquared(xAxis); + if (xSquareLength === 0) { + xAxis.x = 1; + } else { + Vector32.normalizeFromLengthToRef(xAxis, Math.sqrt(xSquareLength), xAxis); + } + Vector32.crossToRef(zAxis, xAxis, yAxis); + Vector32.normalizeToRef(yAxis, yAxis); + const ex = -Vector32.dot(xAxis, eye); + const ey = -Vector32.dot(yAxis, eye); + const ez = -Vector32.dot(zAxis, eye); + fromValuesToRef(xAxis.x, yAxis.x, zAxis.x, 0, xAxis.y, yAxis.y, zAxis.y, 0, xAxis.z, yAxis.z, zAxis.z, 0, ex, ey, ez, 1, result); + } + Matrix2.lookAtRHToRef = lookAtRHToRef; + function orthoLH(width, height, znear, zfar) { + const matrix = create(); + orthoLHToRef(width, height, znear, zfar, matrix); + return matrix; + } + Matrix2.orthoLH = orthoLH; + function orthoLHToRef(width, height, znear, zfar, result) { + const n = znear; + const f = zfar; + const a = 2 / width; + const b = 2 / height; + const c = 2 / (f - n); + const d = -(f + n) / (f - n); + fromValuesToRef(a, 0, 0, 0, 0, b, 0, 0, 0, 0, c, 0, 0, 0, d, 1, result); + _updateIdentityStatus(result, a === 1 && b === 1 && c === 1 && d === 0); + } + Matrix2.orthoLHToRef = orthoLHToRef; + function OrthoOffCenterLH(left, right, bottom, top, znear, zfar) { + const matrix = create(); + orthoOffCenterLHToRef(left, right, bottom, top, znear, zfar, matrix); + return matrix; + } + Matrix2.OrthoOffCenterLH = OrthoOffCenterLH; + function orthoOffCenterLHToRef(left, right, bottom, top, znear, zfar, result) { + const n = znear; + const f = zfar; + const a = 2 / (right - left); + const b = 2 / (top - bottom); + const c = 2 / (f - n); + const d = -(f + n) / (f - n); + const i0 = (left + right) / (left - right); + const i1 = (top + bottom) / (bottom - top); + fromValuesToRef(a, 0, 0, 0, 0, b, 0, 0, 0, 0, c, 0, i0, i1, d, 1, result); + _markAsUpdated(result); + } + Matrix2.orthoOffCenterLHToRef = orthoOffCenterLHToRef; + function orthoOffCenterRH(left, right, bottom, top, znear, zfar) { + const matrix = create(); + orthoOffCenterRHToRef(left, right, bottom, top, znear, zfar, matrix); + return matrix; + } + Matrix2.orthoOffCenterRH = orthoOffCenterRH; + function orthoOffCenterRHToRef(left, right, bottom, top, znear, zfar, result) { + orthoOffCenterLHToRef(left, right, bottom, top, znear, zfar, result); + result._m[10] *= -1; + } + Matrix2.orthoOffCenterRHToRef = orthoOffCenterRHToRef; + function perspectiveLH(width, height, znear, zfar) { + const matrix = create(); + const n = znear; + const f = zfar; + const a = 2 * n / width; + const b = 2 * n / height; + const c = (f + n) / (f - n); + const d = -2 * f * n / (f - n); + fromValuesToRef(a, 0, 0, 0, 0, b, 0, 0, 0, 0, c, 1, 0, 0, d, 0, matrix); + _updateIdentityStatus(matrix, false); + return matrix; + } + Matrix2.perspectiveLH = perspectiveLH; + function perspectiveFovLH(fov, aspect, znear, zfar) { + const matrix = create(); + perspectiveFovLHToRef(fov, aspect, znear, zfar, matrix); + return matrix; + } + Matrix2.perspectiveFovLH = perspectiveFovLH; + function perspectiveFovLHToRef(fov, aspect, znear, zfar, result, isVerticalFovFixed = true) { + const n = znear; + const f = zfar; + const t = 1 / Math.tan(fov * 0.5); + const a = isVerticalFovFixed ? t / aspect : t; + const b = isVerticalFovFixed ? t : t * aspect; + const c = (f + n) / (f - n); + const d = -2 * f * n / (f - n); + fromValuesToRef(a, 0, 0, 0, 0, b, 0, 0, 0, 0, c, 1, 0, 0, d, 0, result); + _updateIdentityStatus(result, false); + } + Matrix2.perspectiveFovLHToRef = perspectiveFovLHToRef; + function PerspectiveFovRH(fov, aspect, znear, zfar) { + const matrix = create(); + perspectiveFovRHToRef(fov, aspect, znear, zfar, matrix); + return matrix; + } + Matrix2.PerspectiveFovRH = PerspectiveFovRH; + function perspectiveFovRHToRef(fov, aspect, znear, zfar, result, isVerticalFovFixed = true) { + const n = znear; + const f = zfar; + const t = 1 / Math.tan(fov * 0.5); + const a = isVerticalFovFixed ? t / aspect : t; + const b = isVerticalFovFixed ? t : t * aspect; + const c = -(f + n) / (f - n); + const d = -2 * f * n / (f - n); + fromValuesToRef(a, 0, 0, 0, 0, b, 0, 0, 0, 0, c, -1, 0, 0, d, 0, result); + _updateIdentityStatus(result, false); + } + Matrix2.perspectiveFovRHToRef = perspectiveFovRHToRef; + function perspectiveFovWebVRToRef(fov, znear, zfar, result, rightHanded = false) { + const rightHandedFactor = rightHanded ? -1 : 1; + const upTan = Math.tan(fov.upDegrees * Math.PI / 180); + const downTan = Math.tan(fov.downDegrees * Math.PI / 180); + const leftTan = Math.tan(fov.leftDegrees * Math.PI / 180); + const rightTan = Math.tan(fov.rightDegrees * Math.PI / 180); + const xScale = 2 / (leftTan + rightTan); + const yScale = 2 / (upTan + downTan); + const m2 = result._m; + m2[0] = xScale; + m2[1] = m2[2] = m2[3] = m2[4] = 0; + m2[5] = yScale; + m2[6] = m2[7] = 0; + m2[8] = (leftTan - rightTan) * xScale * 0.5; + m2[9] = -((upTan - downTan) * yScale * 0.5); + m2[10] = -zfar / (znear - zfar); + m2[11] = 1 * rightHandedFactor; + m2[12] = m2[13] = m2[15] = 0; + m2[14] = -(2 * zfar * znear) / (zfar - znear); + _markAsUpdated(result); + } + Matrix2.perspectiveFovWebVRToRef = perspectiveFovWebVRToRef; + function GetAsMatrix2x2(matrix) { + return [matrix._m[0], matrix._m[1], matrix._m[4], matrix._m[5]]; + } + Matrix2.GetAsMatrix2x2 = GetAsMatrix2x2; + function GetAsMatrix3x3(matrix) { + return [ + matrix._m[0], + matrix._m[1], + matrix._m[2], + matrix._m[4], + matrix._m[5], + matrix._m[6], + matrix._m[8], + matrix._m[9], + matrix._m[10] + ]; + } + Matrix2.GetAsMatrix3x3 = GetAsMatrix3x3; + function transpose(matrix) { + const result = create(); + transposeToRef(matrix, result); + return result; + } + Matrix2.transpose = transpose; + function transposeToRef(matrix, result) { + const rm = result._m; + const mm = matrix._m; + rm[0] = mm[0]; + rm[1] = mm[4]; + rm[2] = mm[8]; + rm[3] = mm[12]; + rm[4] = mm[1]; + rm[5] = mm[5]; + rm[6] = mm[9]; + rm[7] = mm[13]; + rm[8] = mm[2]; + rm[9] = mm[6]; + rm[10] = mm[10]; + rm[11] = mm[14]; + rm[12] = mm[3]; + rm[13] = mm[7]; + rm[14] = mm[11]; + rm[15] = mm[15]; + _updateIdentityStatus(result, matrix.isIdentity, matrix._isIdentityDirty); + } + Matrix2.transposeToRef = transposeToRef; + function reflection(plane) { + const matrix = create(); + reflectionToRef(plane, matrix); + return matrix; + } + Matrix2.reflection = reflection; + function reflectionToRef(_plane, result) { + const plane = Plane.normalize(_plane); + const x = plane.normal.x; + const y = plane.normal.y; + const z = plane.normal.z; + const temp = -2 * x; + const temp2 = -2 * y; + const temp3 = -2 * z; + fromValuesToRef(temp * x + 1, temp2 * x, temp3 * x, 0, temp * y, temp2 * y + 1, temp3 * y, 0, temp * z, temp2 * z, temp3 * z + 1, 0, temp * plane.d, temp2 * plane.d, temp3 * plane.d, 1, result); + } + Matrix2.reflectionToRef = reflectionToRef; + function fromXYZAxesToRef(xaxis, yaxis, zaxis, result) { + fromValuesToRef(xaxis.x, xaxis.y, xaxis.z, 0, yaxis.x, yaxis.y, yaxis.z, 0, zaxis.x, zaxis.y, zaxis.z, 0, 0, 0, 0, 1, result); + } + Matrix2.fromXYZAxesToRef = fromXYZAxesToRef; + function fromQuaternionToRef(quat, result) { + const xx = quat.x * quat.x; + const yy = quat.y * quat.y; + const zz = quat.z * quat.z; + const xy = quat.x * quat.y; + const zw = quat.z * quat.w; + const zx = quat.z * quat.x; + const yw = quat.y * quat.w; + const yz = quat.y * quat.z; + const xw = quat.x * quat.w; + result._m[0] = 1 - 2 * (yy + zz); + result._m[1] = 2 * (xy + zw); + result._m[2] = 2 * (zx - yw); + result._m[3] = 0; + result._m[4] = 2 * (xy - zw); + result._m[5] = 1 - 2 * (zz + xx); + result._m[6] = 2 * (yz + xw); + result._m[7] = 0; + result._m[8] = 2 * (zx + yw); + result._m[9] = 2 * (yz - xw); + result._m[10] = 1 - 2 * (yy + xx); + result._m[11] = 0; + result._m[12] = 0; + result._m[13] = 0; + result._m[14] = 0; + result._m[15] = 1; + _markAsUpdated(result); + } + Matrix2.fromQuaternionToRef = fromQuaternionToRef; + function _markAsUpdated(self2) { + self2.updateFlag = _updateFlagSeed++; + self2.isIdentity = false; + self2.isIdentity3x2 = false; + self2._isIdentityDirty = true; + self2._isIdentity3x2Dirty = true; + } + function isIdentityUpdate(self2) { + if (self2._isIdentityDirty) { + self2._isIdentityDirty = false; + const m2 = self2._m; + self2.isIdentity = m2[0] === 1 && m2[1] === 0 && m2[2] === 0 && m2[3] === 0 && m2[4] === 0 && m2[5] === 1 && m2[6] === 0 && m2[7] === 0 && m2[8] === 0 && m2[9] === 0 && m2[10] === 1 && m2[11] === 0 && m2[12] === 0 && m2[13] === 0 && m2[14] === 0 && m2[15] === 1; + } + return self2.isIdentity; + } + Matrix2.isIdentityUpdate = isIdentityUpdate; + function isIdentityAs3x2Update(self2) { + if (self2._isIdentity3x2Dirty) { + self2._isIdentity3x2Dirty = false; + if (self2._m[0] !== 1 || self2._m[5] !== 1 || self2._m[15] !== 1) { + self2.isIdentity3x2 = false; + } else if (self2._m[1] !== 0 || self2._m[2] !== 0 || self2._m[3] !== 0 || self2._m[4] !== 0 || self2._m[6] !== 0 || self2._m[7] !== 0 || self2._m[8] !== 0 || self2._m[9] !== 0 || self2._m[10] !== 0 || self2._m[11] !== 0 || self2._m[12] !== 0 || self2._m[13] !== 0 || self2._m[14] !== 0) { + self2.isIdentity3x2 = false; + } else { + self2.isIdentity3x2 = true; + } + } + return self2.isIdentity3x2; + } + Matrix2.isIdentityAs3x2Update = isIdentityAs3x2Update; + function determinant(self2) { + if (self2.isIdentity === true) { + return 1; + } + const m2 = self2._m; + const m00 = m2[0], m01 = m2[1], m02 = m2[2], m03 = m2[3]; + const m10 = m2[4], m11 = m2[5], m12 = m2[6], m13 = m2[7]; + const m20 = m2[8], m21 = m2[9], m22 = m2[10], m23 = m2[11]; + const m30 = m2[12], m31 = m2[13], m32 = m2[14], m33 = m2[15]; + const det_22_33 = m22 * m33 - m32 * m23; + const det_21_33 = m21 * m33 - m31 * m23; + const det_21_32 = m21 * m32 - m31 * m22; + const det_20_33 = m20 * m33 - m30 * m23; + const det_20_32 = m20 * m32 - m22 * m30; + const det_20_31 = m20 * m31 - m30 * m21; + const cofact_00 = +(m11 * det_22_33 - m12 * det_21_33 + m13 * det_21_32); + const cofact_01 = -(m10 * det_22_33 - m12 * det_20_33 + m13 * det_20_32); + const cofact_02 = +(m10 * det_21_33 - m11 * det_20_33 + m13 * det_20_31); + const cofact_03 = -(m10 * det_21_32 - m11 * det_20_32 + m12 * det_20_31); + return m00 * cofact_00 + m01 * cofact_01 + m02 * cofact_02 + m03 * cofact_03; + } + Matrix2.determinant = determinant; + function toArray(self2) { + return self2._m; + } + Matrix2.toArray = toArray; + function asArray(self2) { + return self2._m; + } + Matrix2.asArray = asArray; + function reset(self2) { + fromValuesToRef(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, self2); + _updateIdentityStatus(self2, false); + } + Matrix2.reset = reset; + function add2(self2, other) { + const result = create(); + addToRef(self2, other, result); + return result; + } + Matrix2.add = add2; + function addToRef(self2, other, result) { + for (let index = 0; index < 16; index++) { + result._m[index] = self2._m[index] + other._m[index]; + } + _markAsUpdated(result); + } + Matrix2.addToRef = addToRef; + function addToSelf(self2, other) { + for (let index = 0; index < 16; index++) { + self2._m[index] += other._m[index]; + } + _markAsUpdated(self2); + } + Matrix2.addToSelf = addToSelf; + function invert(source) { + const result = create(); + invertToRef(source, result); + return result; + } + Matrix2.invert = invert; + function invertToRef(source, result) { + if (source.isIdentity === true) { + copy(source, result); + return; + } + const m2 = source._m; + const m00 = m2[0], m01 = m2[1], m02 = m2[2], m03 = m2[3]; + const m10 = m2[4], m11 = m2[5], m12 = m2[6], m13 = m2[7]; + const m20 = m2[8], m21 = m2[9], m22 = m2[10], m23 = m2[11]; + const m30 = m2[12], m31 = m2[13], m32 = m2[14], m33 = m2[15]; + const det_22_33 = m22 * m33 - m32 * m23; + const det_21_33 = m21 * m33 - m31 * m23; + const det_21_32 = m21 * m32 - m31 * m22; + const det_20_33 = m20 * m33 - m30 * m23; + const det_20_32 = m20 * m32 - m22 * m30; + const det_20_31 = m20 * m31 - m30 * m21; + const cofact_00 = +(m11 * det_22_33 - m12 * det_21_33 + m13 * det_21_32); + const cofact_01 = -(m10 * det_22_33 - m12 * det_20_33 + m13 * det_20_32); + const cofact_02 = +(m10 * det_21_33 - m11 * det_20_33 + m13 * det_20_31); + const cofact_03 = -(m10 * det_21_32 - m11 * det_20_32 + m12 * det_20_31); + const det = m00 * cofact_00 + m01 * cofact_01 + m02 * cofact_02 + m03 * cofact_03; + if (det === 0) { + copy(source, result); + return; + } + const detInv = 1 / det; + const det_12_33 = m12 * m33 - m32 * m13; + const det_11_33 = m11 * m33 - m31 * m13; + const det_11_32 = m11 * m32 - m31 * m12; + const det_10_33 = m10 * m33 - m30 * m13; + const det_10_32 = m10 * m32 - m30 * m12; + const det_10_31 = m10 * m31 - m30 * m11; + const det_12_23 = m12 * m23 - m22 * m13; + const det_11_23 = m11 * m23 - m21 * m13; + const det_11_22 = m11 * m22 - m21 * m12; + const det_10_23 = m10 * m23 - m20 * m13; + const det_10_22 = m10 * m22 - m20 * m12; + const det_10_21 = m10 * m21 - m20 * m11; + const cofact_10 = -(m01 * det_22_33 - m02 * det_21_33 + m03 * det_21_32); + const cofact_11 = +(m00 * det_22_33 - m02 * det_20_33 + m03 * det_20_32); + const cofact_12 = -(m00 * det_21_33 - m01 * det_20_33 + m03 * det_20_31); + const cofact_13 = +(m00 * det_21_32 - m01 * det_20_32 + m02 * det_20_31); + const cofact_20 = +(m01 * det_12_33 - m02 * det_11_33 + m03 * det_11_32); + const cofact_21 = -(m00 * det_12_33 - m02 * det_10_33 + m03 * det_10_32); + const cofact_22 = +(m00 * det_11_33 - m01 * det_10_33 + m03 * det_10_31); + const cofact_23 = -(m00 * det_11_32 - m01 * det_10_32 + m02 * det_10_31); + const cofact_30 = -(m01 * det_12_23 - m02 * det_11_23 + m03 * det_11_22); + const cofact_31 = +(m00 * det_12_23 - m02 * det_10_23 + m03 * det_10_22); + const cofact_32 = -(m00 * det_11_23 - m01 * det_10_23 + m03 * det_10_21); + const cofact_33 = +(m00 * det_11_22 - m01 * det_10_22 + m02 * det_10_21); + fromValuesToRef(cofact_00 * detInv, cofact_10 * detInv, cofact_20 * detInv, cofact_30 * detInv, cofact_01 * detInv, cofact_11 * detInv, cofact_21 * detInv, cofact_31 * detInv, cofact_02 * detInv, cofact_12 * detInv, cofact_22 * detInv, cofact_32 * detInv, cofact_03 * detInv, cofact_13 * detInv, cofact_23 * detInv, cofact_33 * detInv, result); + } + Matrix2.invertToRef = invertToRef; + function addAtIndex(self2, index, value) { + self2._m[index] += value; + _markAsUpdated(self2); + } + Matrix2.addAtIndex = addAtIndex; + function multiplyAtIndex(self2, index, value) { + self2._m[index] *= value; + _markAsUpdated(self2); + return self2; + } + Matrix2.multiplyAtIndex = multiplyAtIndex; + function setTranslationFromFloats(self2, x, y, z) { + self2._m[12] = x; + self2._m[13] = y; + self2._m[14] = z; + _markAsUpdated(self2); + } + Matrix2.setTranslationFromFloats = setTranslationFromFloats; + function setTranslation(self2, vector3) { + setTranslationFromFloats(self2, vector3.x, vector3.y, vector3.z); + } + Matrix2.setTranslation = setTranslation; + function getTranslation(self2) { + return Vector32.create(self2._m[12], self2._m[13], self2._m[14]); + } + Matrix2.getTranslation = getTranslation; + function getTranslationToRef(self2, result) { + result.x = self2._m[12]; + result.y = self2._m[13]; + result.z = self2._m[14]; + } + Matrix2.getTranslationToRef = getTranslationToRef; + function removeRotationAndScaling(self2) { + const m2 = self2._m; + fromValuesToRef(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, m2[12], m2[13], m2[14], m2[15], self2); + _updateIdentityStatus(self2, m2[12] === 0 && m2[13] === 0 && m2[14] === 0 && m2[15] === 1); + return self2; + } + Matrix2.removeRotationAndScaling = removeRotationAndScaling; + function multiply2(self2, other) { + const result = create(); + multiplyToRef(self2, other, result); + return result; + } + Matrix2.multiply = multiply2; + function copy(from, dest) { + copyToArray(from, dest._m); + _updateIdentityStatus(dest, from.isIdentity, from._isIdentityDirty, from.isIdentity3x2, from._isIdentity3x2Dirty); + } + Matrix2.copy = copy; + function copyToArray(self2, arrayDest, offsetDest = 0) { + for (let index = 0; index < 16; index++) { + arrayDest[offsetDest + index] = self2._m[index]; + } + } + Matrix2.copyToArray = copyToArray; + function multiplyToRef(self2, other, result) { + if (self2.isIdentity) { + copy(other, result); + return; + } + if (other.isIdentity) { + copy(self2, result); + return; + } + multiplyToArray(self2, other, result._m, 0); + _markAsUpdated(result); + } + Matrix2.multiplyToRef = multiplyToRef; + function multiplyToArray(self2, other, result, offset) { + const m2 = self2._m; + const otherM = other._m; + const tm0 = m2[0], tm1 = m2[1], tm2 = m2[2], tm3 = m2[3]; + const tm4 = m2[4], tm5 = m2[5], tm6 = m2[6], tm7 = m2[7]; + const tm8 = m2[8], tm9 = m2[9], tm10 = m2[10], tm11 = m2[11]; + const tm12 = m2[12], tm13 = m2[13], tm14 = m2[14], tm15 = m2[15]; + const om0 = otherM[0], om1 = otherM[1], om2 = otherM[2], om3 = otherM[3]; + const om4 = otherM[4], om5 = otherM[5], om6 = otherM[6], om7 = otherM[7]; + const om8 = otherM[8], om9 = otherM[9], om10 = otherM[10], om11 = otherM[11]; + const om12 = otherM[12], om13 = otherM[13], om14 = otherM[14], om15 = otherM[15]; + result[offset] = tm0 * om0 + tm1 * om4 + tm2 * om8 + tm3 * om12; + result[offset + 1] = tm0 * om1 + tm1 * om5 + tm2 * om9 + tm3 * om13; + result[offset + 2] = tm0 * om2 + tm1 * om6 + tm2 * om10 + tm3 * om14; + result[offset + 3] = tm0 * om3 + tm1 * om7 + tm2 * om11 + tm3 * om15; + result[offset + 4] = tm4 * om0 + tm5 * om4 + tm6 * om8 + tm7 * om12; + result[offset + 5] = tm4 * om1 + tm5 * om5 + tm6 * om9 + tm7 * om13; + result[offset + 6] = tm4 * om2 + tm5 * om6 + tm6 * om10 + tm7 * om14; + result[offset + 7] = tm4 * om3 + tm5 * om7 + tm6 * om11 + tm7 * om15; + result[offset + 8] = tm8 * om0 + tm9 * om4 + tm10 * om8 + tm11 * om12; + result[offset + 9] = tm8 * om1 + tm9 * om5 + tm10 * om9 + tm11 * om13; + result[offset + 10] = tm8 * om2 + tm9 * om6 + tm10 * om10 + tm11 * om14; + result[offset + 11] = tm8 * om3 + tm9 * om7 + tm10 * om11 + tm11 * om15; + result[offset + 12] = tm12 * om0 + tm13 * om4 + tm14 * om8 + tm15 * om12; + result[offset + 13] = tm12 * om1 + tm13 * om5 + tm14 * om9 + tm15 * om13; + result[offset + 14] = tm12 * om2 + tm13 * om6 + tm14 * om10 + tm15 * om14; + result[offset + 15] = tm12 * om3 + tm13 * om7 + tm14 * om11 + tm15 * om15; + } + Matrix2.multiplyToArray = multiplyToArray; + function equals2(self2, value) { + const other = value; + if (!other) { + return false; + } + if (self2.isIdentity || other.isIdentity) { + if (!self2._isIdentityDirty && !other._isIdentityDirty) { + return self2.isIdentity && other.isIdentity; + } + } + const m2 = self2._m; + const om = other._m; + return m2[0] === om[0] && m2[1] === om[1] && m2[2] === om[2] && m2[3] === om[3] && m2[4] === om[4] && m2[5] === om[5] && m2[6] === om[6] && m2[7] === om[7] && m2[8] === om[8] && m2[9] === om[9] && m2[10] === om[10] && m2[11] === om[11] && m2[12] === om[12] && m2[13] === om[13] && m2[14] === om[14] && m2[15] === om[15]; + } + Matrix2.equals = equals2; + function clone2(self2) { + const result = create(); + copy(self2, result); + return result; + } + Matrix2.clone = clone2; + function getHashCode(self2) { + let hash = self2._m[0] || 0; + for (let i = 1; i < 16; i++) { + hash = hash * 397 ^ (self2._m[i] || 0); + } + return hash; + } + Matrix2.getHashCode = getHashCode; + function decompose(self2, scale2, rotation, translation2) { + if (self2.isIdentity) { + if (translation2) { + translation2.x = 0; + translation2.y = 0; + translation2.z = 0; + } + if (scale2) { + scale2.x = 1; + scale2.y = 1; + scale2.z = 1; + } + if (rotation) { + rotation.w = 1; + rotation.x = 0; + rotation.y = 0; + rotation.z = 0; + } + return true; + } + const m2 = self2._m; + if (translation2) { + translation2.x = m2[12]; + translation2.y = m2[13]; + translation2.z = m2[14]; + } + const usedScale = scale2 || Vector32.Zero(); + usedScale.x = Math.sqrt(m2[0] * m2[0] + m2[1] * m2[1] + m2[2] * m2[2]); + usedScale.y = Math.sqrt(m2[4] * m2[4] + m2[5] * m2[5] + m2[6] * m2[6]); + usedScale.z = Math.sqrt(m2[8] * m2[8] + m2[9] * m2[9] + m2[10] * m2[10]); + if (determinant(self2) <= 0) { + usedScale.y *= -1; + } + if (usedScale.x === 0 || usedScale.y === 0 || usedScale.z === 0) { + if (rotation) { + rotation.w = 1; + rotation.x = 0; + rotation.y = 0; + rotation.z = 0; + } + return false; + } + if (rotation) { + const sx = 1 / usedScale.x, sy = 1 / usedScale.y, sz = 1 / usedScale.z; + const tmpMatrix = create(); + fromValuesToRef(m2[0] * sx, m2[1] * sx, m2[2] * sx, 0, m2[4] * sy, m2[5] * sy, m2[6] * sy, 0, m2[8] * sz, m2[9] * sz, m2[10] * sz, 0, 0, 0, 0, 1, tmpMatrix); + Quaternion2.fromRotationMatrixToRef(tmpMatrix, rotation); + } + return true; + } + Matrix2.decompose = decompose; + function setRowFromFloats(self2, index, x, y, z, w) { + if (index < 0 || index > 3) { + return; + } + const i = index * 4; + self2._m[i + 0] = x; + self2._m[i + 1] = y; + self2._m[i + 2] = z; + self2._m[i + 3] = w; + _markAsUpdated(self2); + } + Matrix2.setRowFromFloats = setRowFromFloats; + function scale(self2, scale2) { + const result = create(); + scaleToRef(self2, scale2, result); + return result; + } + Matrix2.scale = scale; + function scaleToRef(self2, scale2, result) { + for (let index = 0; index < 16; index++) { + result._m[index] = self2._m[index] * scale2; + } + _markAsUpdated(result); + } + Matrix2.scaleToRef = scaleToRef; + function scaleAndAddToRef(self2, scale2, result) { + for (let index = 0; index < 16; index++) { + result._m[index] += self2._m[index] * scale2; + } + _markAsUpdated(result); + } + Matrix2.scaleAndAddToRef = scaleAndAddToRef; + function normalMatrixToRef(self2, ref) { + const tmp = create(); + invertToRef(self2, tmp); + transposeToRef(tmp, ref); + const m2 = ref._m; + fromValuesToRef(m2[0], m2[1], m2[2], 0, m2[4], m2[5], m2[6], 0, m2[8], m2[9], m2[10], 0, 0, 0, 0, 1, ref); + } + Matrix2.normalMatrixToRef = normalMatrixToRef; + function getRotationMatrix(self2) { + const result = create(); + getRotationMatrixToRef(self2, result); + return result; + } + Matrix2.getRotationMatrix = getRotationMatrix; + function getRotationMatrixToRef(self2, result) { + const scale2 = Vector32.Zero(); + if (!decompose(self2, scale2)) { + result = Identity(); + return; + } + const m2 = self2._m; + const sx = 1 / scale2.x, sy = 1 / scale2.y, sz = 1 / scale2.z; + fromValuesToRef(m2[0] * sx, m2[1] * sx, m2[2] * sx, 0, m2[4] * sy, m2[5] * sy, m2[6] * sy, 0, m2[8] * sz, m2[9] * sz, m2[10] * sz, 0, 0, 0, 0, 1, result); + } + Matrix2.getRotationMatrixToRef = getRotationMatrixToRef; + function toggleModelMatrixHandInPlace(self2) { + self2._m[2] *= -1; + self2._m[6] *= -1; + self2._m[8] *= -1; + self2._m[9] *= -1; + self2._m[14] *= -1; + _markAsUpdated(self2); + } + Matrix2.toggleModelMatrixHandInPlace = toggleModelMatrixHandInPlace; + function toggleProjectionMatrixHandInPlace(self2) { + self2._m[8] *= -1; + self2._m[9] *= -1; + self2._m[10] *= -1; + self2._m[11] *= -1; + _markAsUpdated(self2); + } + Matrix2.toggleProjectionMatrixHandInPlace = toggleProjectionMatrixHandInPlace; + function _updateIdentityStatus(self2, isIdentity, isIdentityDirty = false, isIdentity3x2 = false, isIdentity3x2Dirty = true) { + self2.updateFlag = _updateFlagSeed++; + self2.isIdentity = isIdentity; + self2.isIdentity3x2 = isIdentity || isIdentity3x2; + self2._isIdentityDirty = self2.isIdentity ? false : isIdentityDirty; + self2._isIdentity3x2Dirty = self2.isIdentity3x2 ? false : isIdentity3x2Dirty; + } +})(Matrix || (Matrix = {})); + +// node_modules/@dcl/ecs-math/dist/Quaternion.js +var Quaternion2; +(function(Quaternion3) { + function create(x = 0, y = 0, z = 0, w = 1) { + return { x, y, z, w }; + } + Quaternion3.create = create; + function add2(q1, q2) { + return { x: q1.x + q2.x, y: q1.y + q2.y, z: q1.z + q2.z, w: q1.w + q2.w }; + } + Quaternion3.add = add2; + function fromRotationYawPitchRoll(yaw, pitch, roll) { + const halfPitch = pitch * 0.5; + const halfYaw = yaw * 0.5; + const halfRoll = roll * 0.5; + const c1 = Math.cos(halfPitch); + const c2 = Math.cos(halfYaw); + const c3 = Math.cos(halfRoll); + const s1 = Math.sin(halfPitch); + const s2 = Math.sin(halfYaw); + const s3 = Math.sin(halfRoll); + return create(c2 * s1 * c3 + s2 * c1 * s3, s2 * c1 * c3 - c2 * s1 * s3, c2 * c1 * s3 - s2 * s1 * c3, c2 * c1 * c3 + s2 * s1 * s3); + } + Quaternion3.fromRotationYawPitchRoll = fromRotationYawPitchRoll; + function fromEulerDegrees(x, y, z) { + return fromRotationYawPitchRoll(y * DEG2RAD, x * DEG2RAD, z * DEG2RAD); + } + Quaternion3.fromEulerDegrees = fromEulerDegrees; + function length2(q) { + return Math.sqrt(lengthSquared(q)); + } + Quaternion3.length = length2; + function lengthSquared(q) { + return q.x * q.x + q.y * q.y + q.z * q.z + q.w * q.w; + } + Quaternion3.lengthSquared = lengthSquared; + function dot(left, right) { + return left.x * right.x + left.y * right.y + left.z * right.z + left.w * right.w; + } + Quaternion3.dot = dot; + function angle(quat1, quat2) { + const dotVal = dot(quat1, quat2); + return Math.acos(Math.min(Math.abs(dotVal), 1)) * 2 * RAD2DEG; + } + Quaternion3.angle = angle; + function rotateTowards(from, to, maxDegreesDelta) { + const num = angle(from, to); + if (num === 0) { + return to; + } + const t = Math.min(1, maxDegreesDelta / num); + return slerp(from, to, t); + } + Quaternion3.rotateTowards = rotateTowards; + function lookRotation(forward, up = { x: 0, y: 1, z: 0 }) { + const forwardNew = Vector32.normalize(forward); + const right = Vector32.normalize(Vector32.cross(up, forwardNew)); + const upNew = Vector32.cross(forwardNew, right); + const m00 = right.x; + const m01 = right.y; + const m02 = right.z; + const m10 = upNew.x; + const m11 = upNew.y; + const m12 = upNew.z; + const m20 = forwardNew.x; + const m21 = forwardNew.y; + const m22 = forwardNew.z; + const num8 = m00 + m11 + m22; + const quaternion = create(); + if (num8 > 0) { + let num = Math.sqrt(num8 + 1); + quaternion.w = num * 0.5; + num = 0.5 / num; + quaternion.x = (m12 - m21) * num; + quaternion.y = (m20 - m02) * num; + quaternion.z = (m01 - m10) * num; + return quaternion; + } + if (m00 >= m11 && m00 >= m22) { + const num7 = Math.sqrt(1 + m00 - m11 - m22); + const num4 = 0.5 / num7; + quaternion.x = 0.5 * num7; + quaternion.y = (m01 + m10) * num4; + quaternion.z = (m02 + m20) * num4; + quaternion.w = (m12 - m21) * num4; + return quaternion; + } + if (m11 > m22) { + const num6 = Math.sqrt(1 + m11 - m00 - m22); + const num3 = 0.5 / num6; + quaternion.x = (m10 + m01) * num3; + quaternion.y = 0.5 * num6; + quaternion.z = (m21 + m12) * num3; + quaternion.w = (m20 - m02) * num3; + return quaternion; + } + const num5 = Math.sqrt(1 + m22 - m00 - m11); + const num2 = 0.5 / num5; + quaternion.x = (m20 + m02) * num2; + quaternion.y = (m21 + m12) * num2; + quaternion.z = 0.5 * num5; + quaternion.w = (m01 - m10) * num2; + return quaternion; + } + Quaternion3.lookRotation = lookRotation; + function normalize(q) { + const qLength = 1 / length2(q); + return create(q.x * qLength, q.y * qLength, q.z * qLength, q.w * qLength); + } + Quaternion3.normalize = normalize; + function fromToRotation(from, to, up = Vector32.Up()) { + const v0 = Vector32.normalize(from); + const v1 = Vector32.normalize(to); + const a = Vector32.cross(v0, v1); + const w = Math.sqrt(Vector32.lengthSquared(v0) * Vector32.lengthSquared(v1)) + Vector32.dot(v0, v1); + if (Vector32.lengthSquared(a) < 1e-4) { + return Math.abs(w) < 1e-4 ? normalize(create(up.x, up.y, up.z, 0)) : Identity(); + } else { + return normalize(create(a.x, a.y, a.z, w)); + } + } + Quaternion3.fromToRotation = fromToRotation; + function Identity() { + return create(0, 0, 0, 1); + } + Quaternion3.Identity = Identity; + function toEulerAngles(q) { + const out = Vector32.create(); + const unit = q.x * q.x + q.y * q.y + q.z * q.z + q.w * q.w; + const test = q.x * q.w - q.y * q.z; + if (test > 0.4995 * unit) { + out.x = Math.PI / 2; + out.y = 2 * Math.atan2(q.y, q.x); + out.z = 0; + } else if (test < -0.4995 * unit) { + out.x = -Math.PI / 2; + out.y = -2 * Math.atan2(q.y, q.x); + out.z = 0; + } else { + out.x = Math.asin(2 * (q.w * q.x - q.y * q.z)); + out.y = Math.atan2(2 * q.w * q.y + 2 * q.z * q.x, 1 - 2 * (q.x * q.x + q.y * q.y)); + out.z = Math.atan2(2 * q.w * q.z + 2 * q.x * q.y, 1 - 2 * (q.z * q.z + q.x * q.x)); + } + out.x *= RAD2DEG; + out.y *= RAD2DEG; + out.z *= RAD2DEG; + out.x = Scalar.repeat(out.x, 360); + out.y = Scalar.repeat(out.y, 360); + out.z = Scalar.repeat(out.z, 360); + return out; + } + Quaternion3.toEulerAngles = toEulerAngles; + function fromRotationYawPitchRollToRef(yaw, pitch, roll, result) { + const halfPitch = pitch * 0.5; + const halfYaw = yaw * 0.5; + const halfRoll = roll * 0.5; + const c1 = Math.cos(halfPitch); + const c2 = Math.cos(halfYaw); + const c3 = Math.cos(halfRoll); + const s1 = Math.sin(halfPitch); + const s2 = Math.sin(halfYaw); + const s3 = Math.sin(halfRoll); + result.x = c2 * s1 * c3 + s2 * c1 * s3; + result.y = s2 * c1 * c3 - c2 * s1 * s3; + result.z = c2 * c1 * s3 - s2 * s1 * c3; + result.w = c2 * c1 * c3 + s2 * s1 * s3; + } + Quaternion3.fromRotationYawPitchRollToRef = fromRotationYawPitchRollToRef; + function fromRotationMatrixToRef(matrix, result) { + const data = matrix._m; + const m11 = data[0], m12 = data[4], m13 = data[8]; + const m21 = data[1], m22 = data[5], m23 = data[9]; + const m31 = data[2], m32 = data[6], m33 = data[10]; + const trace = m11 + m22 + m33; + let s; + if (trace > 0) { + s = 0.5 / Math.sqrt(trace + 1); + result.w = 0.25 / s; + result.x = (m32 - m23) * s; + result.y = (m13 - m31) * s; + result.z = (m21 - m12) * s; + } else if (m11 > m22 && m11 > m33) { + s = 2 * Math.sqrt(1 + m11 - m22 - m33); + result.w = (m32 - m23) / s; + result.x = 0.25 * s; + result.y = (m12 + m21) / s; + result.z = (m13 + m31) / s; + } else if (m22 > m33) { + s = 2 * Math.sqrt(1 + m22 - m11 - m33); + result.w = (m13 - m31) / s; + result.x = (m12 + m21) / s; + result.y = 0.25 * s; + result.z = (m23 + m32) / s; + } else { + s = 2 * Math.sqrt(1 + m33 - m11 - m22); + result.w = (m21 - m12) / s; + result.x = (m13 + m31) / s; + result.y = (m23 + m32) / s; + result.z = 0.25 * s; + } + } + Quaternion3.fromRotationMatrixToRef = fromRotationMatrixToRef; + function slerp(left, right, amount) { + const result = Quaternion3.Identity(); + Quaternion3.slerpToRef(left, right, amount, result); + return result; + } + Quaternion3.slerp = slerp; + function slerpToRef(left, right, amount, result) { + let num2; + let num3; + let num4 = left.x * right.x + left.y * right.y + left.z * right.z + left.w * right.w; + let flag = false; + if (num4 < 0) { + flag = true; + num4 = -num4; + } + if (num4 > 0.999999) { + num3 = 1 - amount; + num2 = flag ? -amount : amount; + } else { + const num5 = Math.acos(num4); + const num6 = 1 / Math.sin(num5); + num3 = Math.sin((1 - amount) * num5) * num6; + num2 = flag ? -Math.sin(amount * num5) * num6 : Math.sin(amount * num5) * num6; + } + result.x = num3 * left.x + num2 * right.x; + result.y = num3 * left.y + num2 * right.y; + result.z = num3 * left.z + num2 * right.z; + result.w = num3 * left.w + num2 * right.w; + } + Quaternion3.slerpToRef = slerpToRef; + function multiply2(self2, q1) { + const result = create(0, 0, 0, 1); + multiplyToRef(self2, q1, result); + return result; + } + Quaternion3.multiply = multiply2; + function multiplyToRef(self2, q1, result) { + result.x = self2.x * q1.w + self2.y * q1.z - self2.z * q1.y + self2.w * q1.x; + result.y = -self2.x * q1.z + self2.y * q1.w + self2.z * q1.x + self2.w * q1.y; + result.z = self2.x * q1.y - self2.y * q1.x + self2.z * q1.w + self2.w * q1.z; + result.w = -self2.x * q1.x - self2.y * q1.y - self2.z * q1.z + self2.w * q1.w; + } + Quaternion3.multiplyToRef = multiplyToRef; + function fromAngleAxis(degrees, axis) { + if (Vector32.lengthSquared(axis) === 0) { + return Quaternion3.Identity(); + } + const result = Identity(); + let radians = degrees * DEG2RAD; + radians *= 0.5; + const a2 = Vector32.normalize(axis); + Vector32.scaleToRef(a2, Math.sin(radians), a2); + result.x = a2.x; + result.y = a2.y; + result.z = a2.z; + result.w = Math.cos(radians); + return normalize(result); + } + Quaternion3.fromAngleAxis = fromAngleAxis; + function fromAxisToRotationQuaternion(axis1, axis2, axis3) { + const quat = Quaternion3.create(0, 0, 0, 0); + fromAxisToRotationQuaternionToRef(axis1, axis2, axis3, quat); + return quat; + } + Quaternion3.fromAxisToRotationQuaternion = fromAxisToRotationQuaternion; + function fromAxisToRotationQuaternionToRef(axis1, axis2, axis3, ref) { + const rotMat = Matrix.create(); + Matrix.fromXYZAxesToRef(Vector32.normalize(axis1), Vector32.normalize(axis2), Vector32.normalize(axis3), rotMat); + Quaternion3.fromRotationMatrixToRef(rotMat, ref); + } + Quaternion3.fromAxisToRotationQuaternionToRef = fromAxisToRotationQuaternionToRef; + function Zero() { + return create(0, 0, 0, 0); + } + Quaternion3.Zero = Zero; + function fromLookAt(position, target, worldUp = Vector32.Up()) { + const result = Quaternion3.Identity(); + fromLookAtToRef(position, target, worldUp, result); + return result; + } + Quaternion3.fromLookAt = fromLookAt; + function fromLookAtToRef(position, target, worldUp = Vector32.Up(), result) { + const m = Matrix.Identity(); + Matrix.lookAtLHToRef(position, target, worldUp, m); + Matrix.invertToRef(m, m); + Quaternion3.fromRotationMatrixToRef(m, result); + } + Quaternion3.fromLookAtToRef = fromLookAtToRef; +})(Quaternion2 || (Quaternion2 = {})); + +// node_modules/@dcl/ecs-math/dist/Color4.js +var Color42; +(function(Color44) { + function create(r = 0, g = 0, b = 0, a = 1) { + return { r, g, b, a }; + } + Color44.create = create; + function fromHexString(hex) { + if (hex.substring(0, 1) !== "#" || hex.length !== 7 && hex.length !== 9) { + return create(0, 0, 0, 1); + } + const r = parseInt(hex.substring(1, 3), 16); + const g = parseInt(hex.substring(3, 5), 16); + const b = parseInt(hex.substring(5, 7), 16); + const aStr = hex.substring(7, 9); + const a = aStr ? parseInt(aStr, 16) : 255; + return Color44.fromInts(r, g, b, a); + } + Color44.fromHexString = fromHexString; + function lerp(left, right, amount) { + const result = create(0, 0, 0, 0); + Color44.lerpToRef(left, right, amount, result); + return result; + } + Color44.lerp = lerp; + function lerpToRef(left, right, amount, result) { + result.r = left.r + (right.r - left.r) * amount; + result.g = left.g + (right.g - left.g) * amount; + result.b = left.b + (right.b - left.b) * amount; + result.a = left.a + (right.a - left.a) * amount; + } + Color44.lerpToRef = lerpToRef; + function Red() { + return create(1, 0, 0, 1); + } + Color44.Red = Red; + function Green() { + return create(0, 1, 0, 1); + } + Color44.Green = Green; + function Blue() { + return create(0, 0, 1, 1); + } + Color44.Blue = Blue; + function Black() { + return create(0, 0, 0, 1); + } + Color44.Black = Black; + function White() { + return create(1, 1, 1, 1); + } + Color44.White = White; + function Purple() { + return create(0.5, 0, 0.5, 1); + } + Color44.Purple = Purple; + function Magenta() { + return create(1, 0, 1, 1); + } + Color44.Magenta = Magenta; + function Yellow() { + return create(1, 1, 0, 1); + } + Color44.Yellow = Yellow; + function Gray() { + return create(0.5, 0.5, 0.5, 1); + } + Color44.Gray = Gray; + function Teal() { + return create(0, 1, 1, 1); + } + Color44.Teal = Teal; + function Clear() { + return create(0, 0, 0, 0); + } + Color44.Clear = Clear; + function fromColor3(color3, alpha = 1) { + return create(color3.r, color3.g, color3.b, alpha); + } + Color44.fromColor3 = fromColor3; + function fromArray(array, offset = 0) { + return create(array[offset], array[offset + 1], array[offset + 2], array[offset + 3]); + } + Color44.fromArray = fromArray; + function fromInts(r, g, b, a) { + return create(r / 255, g / 255, b / 255, a / 255); + } + Color44.fromInts = fromInts; + function checkColors4(colors, count) { + if (colors.length === count * 3) { + const colors4 = []; + for (let index = 0; index < colors.length; index += 3) { + const newIndex = index / 3 * 4; + colors4[newIndex] = colors[index]; + colors4[newIndex + 1] = colors[index + 1]; + colors4[newIndex + 2] = colors[index + 2]; + colors4[newIndex + 3] = 1; + } + return colors4; + } + return colors; + } + Color44.checkColors4 = checkColors4; + function addToRef(a, b, ref) { + ref.r = a.r + b.r; + ref.g = a.g + b.g; + ref.b = a.b + b.b; + ref.a = a.a + b.a; + } + Color44.addToRef = addToRef; + function toArray(value, array, index = 0) { + array[index] = value.r; + array[index + 1] = value.g; + array[index + 2] = value.b; + array[index + 3] = value.a; + } + Color44.toArray = toArray; + function add2(value, right) { + const ret = Clear(); + addToRef(value, right, ret); + return ret; + } + Color44.add = add2; + function subtract2(value, right) { + const ret = Clear(); + subtractToRef(value, right, ret); + return ret; + } + Color44.subtract = subtract2; + function subtractToRef(a, b, result) { + result.r = a.r - b.r; + result.g = a.g - b.g; + result.b = a.b - b.b; + result.a = a.a - b.a; + } + Color44.subtractToRef = subtractToRef; + function scale(value, scale2) { + return create(value.r * scale2, value.g * scale2, value.b * scale2, value.a * scale2); + } + Color44.scale = scale; + function scaleToRef(value, scale2, result) { + result.r = value.r * scale2; + result.g = value.g * scale2; + result.b = value.b * scale2; + result.a = value.a * scale2; + } + Color44.scaleToRef = scaleToRef; + function scaleAndAddToRef(value, scale2, result) { + result.r += value.r * scale2; + result.g += value.g * scale2; + result.b += value.b * scale2; + result.a += value.a * scale2; + } + Color44.scaleAndAddToRef = scaleAndAddToRef; + function clampToRef(value, min = 0, max = 1, result) { + result.r = Scalar.clamp(value.r, min, max); + result.g = Scalar.clamp(value.g, min, max); + result.b = Scalar.clamp(value.b, min, max); + result.a = Scalar.clamp(value.a, min, max); + } + Color44.clampToRef = clampToRef; + function multiply2(value, color) { + return create(value.r * color.r, value.g * color.g, value.b * color.b, value.a * color.a); + } + Color44.multiply = multiply2; + function multiplyToRef(value, color, result) { + result.r = value.r * color.r; + result.g = value.g * color.g; + result.b = value.b * color.b; + result.a = value.a * color.a; + } + Color44.multiplyToRef = multiplyToRef; + function toString2(value) { + return "{R: " + value.r + " G:" + value.g + " B:" + value.b + " A:" + value.a + "}"; + } + Color44.toString = toString2; + function getHashCode(value) { + let hash = value.r || 0; + hash = hash * 397 ^ (value.g || 0); + hash = hash * 397 ^ (value.b || 0); + hash = hash * 397 ^ (value.a || 0); + return hash; + } + Color44.getHashCode = getHashCode; + function clone2(value) { + return create(value.r, value.g, value.b, value.a); + } + Color44.clone = clone2; + function copyFrom(source, dest) { + dest.r = source.r; + dest.g = source.g; + dest.b = source.b; + dest.a = source.a; + } + Color44.copyFrom = copyFrom; + function copyFromFloats(r, g, b, a, dest) { + dest.r = r; + dest.g = g; + dest.b = b; + dest.a = a; + } + Color44.copyFromFloats = copyFromFloats; + function set(r, g, b, a, dest) { + dest.r = r; + dest.g = g; + dest.b = b; + dest.a = a; + } + Color44.set = set; + function toHexString(value) { + const intR = value.r * 255 | 0; + const intG = value.g * 255 | 0; + const intB = value.b * 255 | 0; + const intA = value.a * 255 | 0; + return "#" + Scalar.toHex(intR) + Scalar.toHex(intG) + Scalar.toHex(intB) + Scalar.toHex(intA); + } + Color44.toHexString = toHexString; + function toLinearSpace(value) { + const convertedColor = create(); + toLinearSpaceToRef(value, convertedColor); + return convertedColor; + } + Color44.toLinearSpace = toLinearSpace; + function toLinearSpaceToRef(value, ref) { + ref.r = Math.pow(value.r, ToLinearSpace); + ref.g = Math.pow(value.g, ToLinearSpace); + ref.b = Math.pow(value.b, ToLinearSpace); + ref.a = value.a; + } + Color44.toLinearSpaceToRef = toLinearSpaceToRef; + function toGammaSpace(value) { + const convertedColor = create(); + toGammaSpaceToRef(value, convertedColor); + return convertedColor; + } + Color44.toGammaSpace = toGammaSpace; + function toGammaSpaceToRef(value, convertedColor) { + convertedColor.r = Math.pow(value.r, ToGammaSpace); + convertedColor.g = Math.pow(value.g, ToGammaSpace); + convertedColor.b = Math.pow(value.b, ToGammaSpace); + convertedColor.a = value.a; + } + Color44.toGammaSpaceToRef = toGammaSpaceToRef; +})(Color42 || (Color42 = {})); + +// node_modules/@dcl/ecs-math/dist/Color3.js +var Color32; +(function(Color33) { + function create(r = 0, g = 0, b = 0) { + return { r, g, b }; + } + Color33.create = create; + function fromHexString(hex) { + if (hex.substring(0, 1) !== "#" || hex.length !== 7) { + return create(0, 0, 0); + } + const r = parseInt(hex.substring(1, 3), 16); + const g = parseInt(hex.substring(3, 5), 16); + const b = parseInt(hex.substring(5, 7), 16); + return fromInts(r, g, b); + } + Color33.fromHexString = fromHexString; + function fromArray(array, offset = 0) { + return create(array[offset], array[offset + 1], array[offset + 2]); + } + Color33.fromArray = fromArray; + function fromInts(r, g, b) { + return create(r / 255, g / 255, b / 255); + } + Color33.fromInts = fromInts; + function lerp(start, end, amount) { + const result = create(0, 0, 0); + Color33.lerpToRef(start, end, amount, result); + return result; + } + Color33.lerp = lerp; + function lerpToRef(left, right, amount, result) { + result.r = left.r + (right.r - left.r) * amount; + result.g = left.g + (right.g - left.g) * amount; + result.b = left.b + (right.b - left.b) * amount; + } + Color33.lerpToRef = lerpToRef; + function Red() { + return create(1, 0, 0); + } + Color33.Red = Red; + function Green() { + return create(0, 1, 0); + } + Color33.Green = Green; + function Blue() { + return create(0, 0, 1); + } + Color33.Blue = Blue; + function Black() { + return create(0, 0, 0); + } + Color33.Black = Black; + function White() { + return create(1, 1, 1); + } + Color33.White = White; + function Purple() { + return create(0.5, 0, 0.5); + } + Color33.Purple = Purple; + function Magenta() { + return create(1, 0, 1); + } + Color33.Magenta = Magenta; + function Yellow() { + return create(1, 1, 0); + } + Color33.Yellow = Yellow; + function Gray() { + return create(0.5, 0.5, 0.5); + } + Color33.Gray = Gray; + function Teal() { + return create(0, 1, 1); + } + Color33.Teal = Teal; + function Random() { + return create(Math.random(), Math.random(), Math.random()); + } + Color33.Random = Random; + function toString2(value) { + return "{R: " + value.r + " G:" + value.g + " B:" + value.b + "}"; + } + Color33.toString = toString2; + function getHashCode(value) { + let hash = value.r || 0; + hash = hash * 397 ^ (value.g || 0); + hash = hash * 397 ^ (value.b || 0); + return hash; + } + Color33.getHashCode = getHashCode; + function toArray(value, array, index = 0) { + array[index] = value.r; + array[index + 1] = value.g; + array[index + 2] = value.b; + } + Color33.toArray = toArray; + function toColor4(value, alpha = 1) { + return Color42.create(value.r, value.g, value.b, alpha); + } + Color33.toColor4 = toColor4; + function asArray(value) { + const result = new Array(); + toArray(value, result, 0); + return result; + } + Color33.asArray = asArray; + function toLuminance(value) { + return value.r * 0.3 + value.g * 0.59 + value.b * 0.11; + } + Color33.toLuminance = toLuminance; + function multiply2(value, otherColor) { + return create(value.r * otherColor.r, value.g * otherColor.g, value.b * otherColor.b); + } + Color33.multiply = multiply2; + function multiplyToRef(value, otherColor, result) { + result.r = value.r * otherColor.r; + result.g = value.g * otherColor.g; + result.b = value.b * otherColor.b; + } + Color33.multiplyToRef = multiplyToRef; + function equals2(value, otherColor) { + return otherColor && value.r === otherColor.r && value.g === otherColor.g && value.b === otherColor.b; + } + Color33.equals = equals2; + function equalsFloats(value, r, g, b) { + return value.r === r && value.g === g && value.b === b; + } + Color33.equalsFloats = equalsFloats; + function scale(value, scale2) { + return create(value.r * scale2, value.g * scale2, value.b * scale2); + } + Color33.scale = scale; + function scaleToRef(value, scale2, result) { + result.r = value.r * scale2; + result.g = value.g * scale2; + result.b = value.b * scale2; + } + Color33.scaleToRef = scaleToRef; + function scaleAndAddToRef(value, scale2, result) { + result.r += value.r * scale2; + result.g += value.g * scale2; + result.b += value.b * scale2; + } + Color33.scaleAndAddToRef = scaleAndAddToRef; + function clampToRef(value, min = 0, max = 1, result) { + result.r = Scalar.clamp(value.r, min, max); + result.g = Scalar.clamp(value.g, min, max); + result.b = Scalar.clamp(value.b, min, max); + } + Color33.clampToRef = clampToRef; + function clamp(value, min = 0, max = 1) { + const result = Color33.Black(); + clampToRef(value, min, max, result); + return result; + } + Color33.clamp = clamp; + function add2(value, otherColor) { + return create(value.r + otherColor.r, value.g + otherColor.g, value.b + otherColor.b); + } + Color33.add = add2; + function addToRef(value, otherColor, result) { + result.r = value.r + otherColor.r; + result.g = value.g + otherColor.g; + result.b = value.b + otherColor.b; + } + Color33.addToRef = addToRef; + function subtract2(value, otherColor) { + return create(value.r - otherColor.r, value.g - otherColor.g, value.b - otherColor.b); + } + Color33.subtract = subtract2; + function subtractToRef(value, otherColor, result) { + result.r = value.r - otherColor.r; + result.g = value.g - otherColor.g; + result.b = value.b - otherColor.b; + } + Color33.subtractToRef = subtractToRef; + function clone2(value) { + return create(value.r, value.g, value.b); + } + Color33.clone = clone2; + function copyFrom(source, dest) { + dest.r = source.r; + dest.g = source.g; + dest.b = source.b; + } + Color33.copyFrom = copyFrom; + function set(dest, r, g, b) { + dest.r = r; + dest.g = g; + dest.b = b; + } + Color33.set = set; + function toHexString(value) { + const intR = value.r * 255 | 0; + const intG = value.g * 255 | 0; + const intB = value.b * 255 | 0; + return "#" + Scalar.toHex(intR) + Scalar.toHex(intG) + Scalar.toHex(intB); + } + Color33.toHexString = toHexString; + function toLinearSpace(value) { + const convertedColor = create(); + toLinearSpaceToRef(value, convertedColor); + return convertedColor; + } + Color33.toLinearSpace = toLinearSpace; + function toLinearSpaceToRef(value, convertedColor) { + convertedColor.r = Math.pow(value.r, ToLinearSpace); + convertedColor.g = Math.pow(value.g, ToLinearSpace); + convertedColor.b = Math.pow(value.b, ToLinearSpace); + } + Color33.toLinearSpaceToRef = toLinearSpaceToRef; + function toGammaSpace(value) { + const convertedColor = create(); + toGammaSpaceToRef(value, convertedColor); + return convertedColor; + } + Color33.toGammaSpace = toGammaSpace; + function toGammaSpaceToRef(value, convertedColor) { + convertedColor.r = Math.pow(value.r, ToGammaSpace); + convertedColor.g = Math.pow(value.g, ToGammaSpace); + convertedColor.b = Math.pow(value.b, ToGammaSpace); + } + Color33.toGammaSpaceToRef = toGammaSpaceToRef; +})(Color32 || (Color32 = {})); + +// src/definitions.ts +var BeerType = /* @__PURE__ */ ((BeerType3) => { + BeerType3[BeerType3["NONE"] = 0] = "NONE"; + BeerType3[BeerType3["RED"] = 1] = "RED"; + BeerType3[BeerType3["YELLOW"] = 2] = "YELLOW"; + BeerType3[BeerType3["GREEN"] = 3] = "GREEN"; + return BeerType3; +})(BeerType || {}); +var SoupState = /* @__PURE__ */ ((SoupState2) => { + SoupState2[SoupState2["Empty"] = 0] = "Empty"; + SoupState2[SoupState2["Raw"] = 1] = "Raw"; + SoupState2[SoupState2["Cooked"] = 2] = "Cooked"; + SoupState2[SoupState2["Burned"] = 3] = "Burned"; + return SoupState2; +})(SoupState || {}); +var IngredientType = /* @__PURE__ */ ((IngredientType2) => { + IngredientType2[IngredientType2["Noodles"] = 0] = "Noodles"; + IngredientType2[IngredientType2["SushiRoll"] = 1] = "SushiRoll"; + IngredientType2[IngredientType2["CookedNoodles"] = 2] = "CookedNoodles"; + IngredientType2[IngredientType2["SlicedSushi"] = 3] = "SlicedSushi"; + IngredientType2[IngredientType2["Trash"] = 4] = "Trash"; + IngredientType2[IngredientType2["BeerGlass"] = 5] = "BeerGlass"; + IngredientType2[IngredientType2["YellowBeer"] = 6] = "YellowBeer"; + IngredientType2[IngredientType2["RedBeer"] = 7] = "RedBeer"; + IngredientType2[IngredientType2["GreenBeer"] = 8] = "GreenBeer"; + return IngredientType2; +})(IngredientType || {}); +var TAP_DATA = { + [1 /* RED */]: { + name: "Red", + model: "assets/models/redTap.glb", + position: Vector32.create(0.368, 0, 0.31) + }, + [2 /* YELLOW */]: { + name: "Yellow", + model: "assets/models/yellowTap.glb", + position: Vector32.create(0, 0, 0.31) + }, + [3 /* GREEN */]: { + name: "Green", + model: "assets/models/greenTap.glb", + position: Vector32.create(-0.368, 0, 0.31) + } +}; +function getTapData(tapBeerType) { + return TAP_DATA[tapBeerType]; +} +var HighestID = engine.defineComponent("HighestID", { + id: Schemas.Number +}); +var BeerGlass = engine.defineComponent("BeerGlass", { + //beingFilled: Schemas.Boolean, + filled: Schemas.Boolean, + beerType: Schemas.EnumNumber(BeerType, 0 /* NONE */), + drinking: Schemas.Boolean +}); +var PickedUp = engine.defineComponent("PickedUp", { + //child: Schemas.Entity, + avatarId: Schemas.String +}); +var TapComponent = engine.defineComponent("TapComponent", { + pouringTime: Schemas.Number, + pouring: Schemas.Boolean, + beerType: Schemas.EnumNumber(BeerType, 0 /* NONE */) +}); +var TapBase = engine.defineComponent("TapBase", { + beerType: Schemas.EnumNumber(BeerType, 0 /* NONE */) +}); +var PotData = engine.defineComponent("Pot", { + state: Schemas.EnumNumber(SoupState, 1 /* Raw */), + hasIngredient: Schemas.Boolean, + progressBar: Schemas.Entity, + attachedEntity: Schemas.Entity || void 0 +}, { + state: 0 /* Empty */, + hasIngredient: false, + attachedEntity: void 0 +}); +var GrabableObjectComponent = engine.defineComponent("GrabableObjectComponent", { + type: Schemas.EnumNumber(IngredientType, 0 /* Noodles */), + beingProcessed: Schemas.Boolean, + processed: Schemas.Boolean +}, { + type: 0 /* Noodles */ +}); +var Cooking = engine.defineComponent("Cooking", { + active: Schemas.Boolean, + time: Schemas.Number, + progressBar: Schemas.Entity +}, { + active: true, + time: 0 +}); +var CuttingBoard = engine.defineComponent("CuttingBoard", { + hasRoll: Schemas.Boolean, + cutting: Schemas.Boolean, + rollChild: Schemas.Entity || void 0, + cuts: Schemas.Number, + cutTime: Schemas.Number, + totalCutTime: Schemas.Number, + modelEntity: Schemas.Entity +}, { + hasRoll: false, + cuts: 0, + rollChild: void 0, + cutting: false, + cutTime: 0.7, + totalCutTime: 0.7 +}); +var ProgressBar = engine.defineComponent("ProgressBar", { + visible: Schemas.Boolean, + active: Schemas.Boolean, + ratio: Schemas.Number, + yellowWarning: Schemas.Number, + redWarning: Schemas.Number, + fullLength: Schemas.Number, + movesUp: Schemas.Boolean, + color: Schemas.Color4, + speed: Schemas.Number, + parent: Schemas.Entity +}, { + visible: true, + active: true, + ratio: 0, + yellowWarning: 0.5, + redWarning: 0.75, + fullLength: 1, + movesUp: true, + color: Color42.Green(), + speed: 1 + //parent: Schemas.Entity +}); +var CustomerData = engine.defineComponent("CustomerData", { + active: Schemas.Boolean, + dish: Schemas.EnumNumber(IngredientType, 0 /* Noodles */), + message: Schemas.String, + speechBubble: Schemas.Entity, + receivedDish: Schemas.Boolean, + // TODO: true to force the 1st initialization?? + //plate: CustomerPlate + seatNumber: Schemas.Number, + timeBeforeLeaving: Schemas.Number, + timeBeforeEntering: Schemas.Number, + waitingTimer: Schemas.Number, + progressBar: Schemas.Entity +}, { + active: false, + receivedDish: false, + timeBeforeLeaving: 30, + timeBeforeEntering: 10, + waitingTimer: 30 +}); +var GameData = engine.defineComponent("GameData", { + active: Schemas.Boolean, + playerScore: Schemas.Number, + playerMisses: Schemas.Number, + customerTimer: Schemas.Number, + customerInterval: Schemas.Number +}, { + active: true, + playerScore: 0, + playerMisses: 0, + customerTimer: 2, + customerInterval: 10 +}); + +// src/modules/helpers.ts +var import_UserIdentity = require("~system/UserIdentity"); +function getPlayerPosition() { + return Transform2.getOrNull(engine.PlayerEntity)?.position || Vector32.create(); +} +var currentPlayerId; +void executeTask(async () => { + const user = await (0, import_UserIdentity.getUserData)({}); + if (!user.data) + return; + currentPlayerId = user.data?.userId; +}); +function playSound(audio, loop = false, position) { + const entity = engine.addEntity(); + AudioSource2.create(entity, { + audioClipUrl: audio, + loop, + playing: true + }); + Transform2.create(entity, { + position + }); + return entity; +} + +// node_modules/@dcl/sdk/network/index.js +var import_CommunicationsController = require("~system/CommunicationsController"); + +// node_modules/@dcl/sdk/network/filter.js +function syncFilter(engine2) { + const NetworkEntity3 = engine2.getComponent(NetworkEntity2.componentId); + const SyncComponents3 = engine2.getComponent(SyncComponents2.componentId); + return function(message) { + const componentId = message.componentId; + if ([PointerEventsResult2.componentId, GltfContainerLoadingState2.componentId].includes(componentId)) { + return false; + } + const [entityId] = EntityUtils.fromEntityId(message.entityId); + if (entityId < RESERVED_STATIC_ENTITIES) { + return false; + } + const network = NetworkEntity3.getOrNull(message.entityId); + if (message.type === CrdtMessageType.DELETE_ENTITY_NETWORK || network && message.type === CrdtMessageType.DELETE_ENTITY) { + return true; + } + const sync = SyncComponents3.getOrNull(message.entityId); + if (!sync) + return false; + if (message.timestamp <= 1) { + return true; + } + if (componentId === NetworkEntity3.componentId) { + return false; + } + if (componentId === NetworkParent2.componentId || componentId === SyncComponents3.componentId) { + return true; + } + if (componentId && sync.componentIds.includes(componentId)) { + return true; + } + return false; + }; +} + +// node_modules/@dcl/sdk/network/state.js +function engineToCrdt(engine2) { + const crdtBuffer = new ReadWriteByteBuffer(); + const networkBuffer = new ReadWriteByteBuffer(); + const SyncComponents3 = engine2.getComponent(SyncComponents2.componentId); + const NetworkEntity3 = engine2.getComponent(NetworkEntity2.componentId); + for (const itComponentDefinition of engine2.componentsIter()) { + itComponentDefinition.dumpCrdtStateToBuffer(crdtBuffer, (entity) => { + const isNetworkEntity = NetworkEntity3.has(entity); + if (!isNetworkEntity) { + return false; + } + const isDynamicEntity = NetworkEntity3.get(entity).networkId; + if (isDynamicEntity) { + return true; + } + return SyncComponents3.get(entity).componentIds.includes(itComponentDefinition.componentId); + }); + } + let header; + while (header = CrdtMessageProtocol.getHeader(crdtBuffer)) { + if (header.type === CrdtMessageType.PUT_COMPONENT) { + const message = PutComponentOperation.read(crdtBuffer); + const networkEntity = NetworkEntity3.getOrNull(message.entityId); + if (networkEntity) { + PutNetworkComponentOperation.write(networkEntity.entityId, message.timestamp, message.componentId, networkEntity.networkId, message.data, networkBuffer); + } else { + PutComponentOperation.write(message.entityId, message.timestamp, message.componentId, message.data, networkBuffer); + } + } else { + crdtBuffer.incrementReadOffset(header.length); + } + } + return networkBuffer.toBinary(); +} + +// node_modules/@dcl/sdk/network/binary-message-bus.js +var CommsMessage; +(function(CommsMessage2) { + CommsMessage2[CommsMessage2["CRDT"] = 1] = "CRDT"; + CommsMessage2[CommsMessage2["REQ_CRDT_STATE"] = 2] = "REQ_CRDT_STATE"; + CommsMessage2[CommsMessage2["RES_CRDT_STATE"] = 3] = "RES_CRDT_STATE"; +})(CommsMessage || (CommsMessage = {})); +function BinaryMessageBus(send) { + const mapping = /* @__PURE__ */ new Map(); + return { + on: (message, callback) => { + mapping.set(message, callback); + }, + emit: (message, value) => { + send(craftCommsMessage(message, value)); + }, + __processMessages: (messages) => { + for (const message of messages) { + const commsMsg = decodeCommsMessage(message); + if (!commsMsg) + continue; + const { sender, messageType, data } = commsMsg; + const fn = mapping.get(messageType); + if (fn) + fn(data, sender); + } + } + }; +} +function craftCommsMessage(messageType, payload) { + const msg = new Uint8Array(payload.byteLength + 1); + msg.set([messageType]); + msg.set(payload, 1); + return msg; +} +function decodeCommsMessage(data) { + try { + let offset = 0; + const r = new Uint8Array(data); + const view = new DataView(r.buffer); + const senderLength = view.getUint8(offset); + offset += 1; + const sender = decodeString(data.subarray(1, senderLength + 1)); + offset += senderLength; + const messageType = view.getUint8(offset); + offset += 1; + const message = r.subarray(offset); + return { + sender, + messageType, + data: message + }; + } catch (e) { + console.error("Invalid Comms message", e); + } +} +function decodeString(data) { + const buffer = new ReadWriteByteBuffer(); + buffer.writeBuffer(data, true); + return buffer.readUtf8String(); +} + +// node_modules/@dcl/sdk/network/utils.js +var definePlayersInScene = (engine2) => engine2.defineComponent("players-scene", { + timestamp: Schemas.Number, + userId: Schemas.String +}); +var stateInitialized = false; +function setInitialized() { + stateInitialized = true; +} +var INITIAL_CRDT_RENDERER_MESSAGES_SENT = false; +function fetchProfile(myProfile2, getUserData3) { + void getUserData3({}).then(({ data }) => { + if (data?.userId) { + const userId = data.userId; + const networkId = componentNumberFromName(data.userId); + myProfile2.networkId = networkId; + myProfile2.userId = userId; + } else { + throw new Error(`Couldn't fetch profile data`); + } + }); +} +function syncTransportIsReady(engine2) { + const EngineInfo3 = engine2.getComponent(EngineInfo2.componentId); + if (!INITIAL_CRDT_RENDERER_MESSAGES_SENT) { + const engineInfo = EngineInfo3.getOrNull(engine2.RootEntity); + if (engineInfo && engineInfo.tickNumber > 2) { + INITIAL_CRDT_RENDERER_MESSAGES_SENT = true; + } + } + return INITIAL_CRDT_RENDERER_MESSAGES_SENT; +} +function stateInitializedChecker(engine2, _profile, _syncEntity) { + const EngineInfo3 = engine2.getComponent(EngineInfo2.componentId); + async function enterScene() { + if ((EngineInfo3.getOrNull(engine2.RootEntity)?.tickNumber ?? 0) > 100) { + setInitialized(); + return; + } + } + void enterScene(); +} + +// node_modules/@dcl/sdk/network/entities.js +function entityUtils(engine2, profile) { + const NetworkEntity3 = engine2.getComponent(NetworkEntity2.componentId); + const NetworkParent3 = engine2.getComponent(NetworkParent2.componentId); + const Transform4 = engine2.getComponent(Transform2.componentId); + const SyncComponents3 = engine2.getComponent(SyncComponents2.componentId); + function syncEntity2(entityId, componentIds, entityEnumId) { + if (!profile?.networkId) { + throw new Error("Profile not initialized. Called syncEntity inside the main() function."); + } + const networkValue = { entityId, networkId: profile.networkId }; + if (entityEnumId !== void 0) { + networkValue.networkId = 0; + networkValue.entityId = entityEnumId; + for (const [_, network] of engine2.getEntitiesWith(NetworkEntity3)) { + if (network.networkId === networkValue.networkId && network.entityId === networkValue.entityId) { + throw new Error("syncEntity failed because the id provided is already in use"); + } + } + } + NetworkEntity3.createOrReplace(entityId, networkValue); + SyncComponents3.createOrReplace(entityId, { componentIds }); + } + function* getChildren2(parent) { + const network = NetworkEntity3.getOrNull(parent); + if (network) { + for (const [entity, parent2] of engine2.getEntitiesWith(NetworkParent3)) { + if (parent2.entityId === network.entityId && parent2.networkId === network.networkId) { + yield entity; + } + } + } + } + function getFirstChild2(entity) { + return Array.from(getChildren2(entity))[0]; + } + function getParent2(child) { + const parent = NetworkParent3.getOrNull(child); + if (!parent) + return void 0; + for (const [entity, network] of engine2.getEntitiesWith(NetworkEntity3)) { + if (parent.networkId === network.networkId && parent.entityId === network.entityId) { + return entity; + } + } + return void 0; + } + function parentEntity4(entity, parent) { + const network = NetworkEntity3.getOrNull(parent); + if (!network) { + throw new Error("Entity is not sync. Call syncEntity on the parent."); + } + NetworkParent3.createOrReplace(entity, network); + if (!Transform4.getOrNull(entity)) { + Transform4.create(entity); + } else { + Transform4.getMutable(entity); + } + } + function removeParent2(entity) { + const network = NetworkEntity3.getOrNull(entity); + if (!network) { + throw new Error("Entity is not sync"); + } + NetworkParent3.deleteFrom(entity); + } + return { + syncEntity: syncEntity2, + getChildren: getChildren2, + getParent: getParent2, + parentEntity: parentEntity4, + removeParent: removeParent2, + getFirstChild: getFirstChild2 + }; +} + +// node_modules/@dcl/sdk/network/message-bus-sync.js +function addSyncTransport(engine2, sendBinary2, getUserData3) { + definePlayersInScene(engine2); + const myProfile2 = {}; + fetchProfile(myProfile2, getUserData3); + const entityDefinitions = entityUtils(engine2, myProfile2); + const pendingMessageBusMessagesToSend = []; + const binaryMessageBus = BinaryMessageBus((message) => pendingMessageBusMessagesToSend.push(message)); + function getMessagesToSend() { + const messages = [...pendingMessageBusMessagesToSend]; + pendingMessageBusMessagesToSend.length = 0; + return messages; + } + const transport = { + filter: syncFilter(engine2), + send: async (message) => { + if (syncTransportIsReady(engine2) && message.byteLength) { + binaryMessageBus.emit(CommsMessage.CRDT, message); + } + const messages = getMessagesToSend(); + const response = await sendBinary2({ data: messages }); + binaryMessageBus.__processMessages(response.data); + }, + type: "network" + }; + engine2.addTransport(transport); + engine2.addSystem(() => stateInitializedChecker(engine2, myProfile2, entityDefinitions.syncEntity)); + binaryMessageBus.emit(CommsMessage.REQ_CRDT_STATE, new Uint8Array()); + binaryMessageBus.on(CommsMessage.RES_CRDT_STATE, (value) => { + if (!stateInitialized) { + setInitialized(); + transport.onmessage(value); + } + }); + binaryMessageBus.on(CommsMessage.REQ_CRDT_STATE, () => { + if (stateInitialized) { + binaryMessageBus.emit(CommsMessage.RES_CRDT_STATE, engineToCrdt(engine2)); + } + }); + binaryMessageBus.on(CommsMessage.CRDT, (value) => { + transport.onmessage(value); + }); + return { + ...entityDefinitions, + myProfile: myProfile2 + }; +} + +// node_modules/@dcl/sdk/network/index.js +var import_UserIdentity2 = require("~system/UserIdentity"); +var { getChildren, syncEntity, parentEntity, getParent, myProfile, removeParent, getFirstChild } = addSyncTransport(engine, import_CommunicationsController.sendBinary, import_UserIdentity2.getUserData); + +// node_modules/@dcl-sdk/utils/dist/math.js +function getWorldPosition(entity) { + let transform = Transform2.getOrNull(entity); + if (!transform) + return Vector32.Zero(); + let parent = transform.parent; + if (!parent) { + return transform.position; + } else { + let parentRotation = Transform2.get(parent).rotation; + return Vector32.add(getWorldPosition(parent), Vector32.rotate(transform.position, parentRotation)); + } +} +function getWorldRotation(entity) { + let transform = Transform2.getOrNull(entity); + if (!transform) + return Quaternion2.Identity(); + let parent = transform.parent; + if (!parent) { + return transform.rotation; + } else { + return Quaternion2.multiply(transform.rotation, getWorldRotation(parent)); + } +} +var InterpolationType; +(function(InterpolationType3) { + InterpolationType3["LINEAR"] = "linear"; + InterpolationType3["EASEINQUAD"] = "easeinquad"; + InterpolationType3["EASEOUTQUAD"] = "easeoutquad"; + InterpolationType3["EASEQUAD"] = "easequad"; + InterpolationType3["EASEINSINE"] = "easeinsine"; + InterpolationType3["EASEOUTSINE"] = "easeoutsine"; + InterpolationType3["EASESINE"] = "easeinoutsine"; + InterpolationType3["EASEINEXPO"] = "easeinexpo"; + InterpolationType3["EASEOUTEXPO"] = "easeoutexpo"; + InterpolationType3["EASEEXPO"] = "easeinoutexpo"; + InterpolationType3["EASEINELASTIC"] = "easeinelastic"; + InterpolationType3["EASEOUTELASTIC"] = "easeoutelastic"; + InterpolationType3["EASEELASTIC"] = "easeinoutelastic"; + InterpolationType3["EASEINBOUNCE"] = "easeinbounce"; + InterpolationType3["EASEOUTEBOUNCE"] = "easeoutbounce"; + InterpolationType3["EASEBOUNCE"] = "easeinoutbounce"; +})(InterpolationType || (InterpolationType = {})); +function interpolate(type, t) { + switch (type) { + case InterpolationType.LINEAR: + return InterpolateLinear(t); + case InterpolationType.EASEINQUAD: + return InterpolateEaseInQuad(t); + case InterpolationType.EASEOUTQUAD: + return InterpolateEaseOutQuad(t); + case InterpolationType.EASEQUAD: + return InterpolateEaseQuad(t); + case InterpolationType.EASEINSINE: + return InterpolateEaseInSine(t); + case InterpolationType.EASEOUTSINE: + return InterpolateEaseOutSine(t); + case InterpolationType.EASESINE: + return InterpolateEaseInOutSine(t); + case InterpolationType.EASEINEXPO: + return InterpolateEaseInExpo(t); + case InterpolationType.EASEOUTEXPO: + return InterpolateEaseOutExpo(t); + case InterpolationType.EASEEXPO: + return InterpolateEaseInOutExpo(t); + case InterpolationType.EASEINELASTIC: + return InterpolateEaseInElastic(t); + case InterpolationType.EASEOUTELASTIC: + return InterpolateEaseOutElastic(t); + case InterpolationType.EASEELASTIC: + return InterpolateEaseInOutElastic(t); + case InterpolationType.EASEINBOUNCE: + return InterpolateEaseInBounce(t); + case InterpolationType.EASEOUTEBOUNCE: + return InterpolateEaseOutBounce(t); + case InterpolationType.EASEBOUNCE: + return InterpolateEaseInOutBounce(t); + default: + return InterpolateLinear(t); + } +} +function InterpolateLinear(t) { + return t; +} +function InterpolateEaseInQuad(t) { + return t * t; +} +function InterpolateEaseOutQuad(t) { + return t * (2 - t); +} +function InterpolateEaseQuad(t) { + return t * t / (2 * (t * t - t) + 1); +} +function InterpolateEaseInSine(t) { + return 1 - Math.cos(t * Math.PI / 2); +} +function InterpolateEaseOutSine(t) { + return Math.sin(t * Math.PI / 2); +} +function InterpolateEaseInOutSine(t) { + return -(Math.cos(Math.PI * t) - 1) / 2; +} +function InterpolateEaseInExpo(t) { + return t === 0 ? 0 : Math.pow(2, 10 * t - 10); +} +function InterpolateEaseOutExpo(t) { + return t === 1 ? 1 : 1 - Math.pow(2, -10 * t); +} +function InterpolateEaseInOutExpo(t) { + return t === 0 ? 0 : t === 1 ? 1 : t < 0.5 ? Math.pow(2, 20 * t - 10) / 2 : (2 - Math.pow(2, -20 * t + 10)) / 2; +} +function InterpolateEaseInElastic(t) { + const c4 = 2 * Math.PI / 3; + return t === 0 ? 0 : t === 1 ? 1 : -Math.pow(2, 10 * t - 10) * Math.sin((t * 10 - 10.75) * c4); +} +function InterpolateEaseOutElastic(t) { + const c5 = 2 * Math.PI / 3; + return t === 0 ? 0 : t === 1 ? 1 : Math.pow(2, -10 * t) * Math.sin((t * 10 - 0.75) * c5) + 1; +} +function InterpolateEaseInOutElastic(t) { + const c6 = 2 * Math.PI / 4.5; + return t === 0 ? 0 : t === 1 ? 1 : t < 0.5 ? -(Math.pow(2, 20 * t - 10) * Math.sin((20 * t - 11.125) * c6)) / 2 : Math.pow(2, -20 * t + 10) * Math.sin((20 * t - 11.125) * c6) / 2 + 1; +} +function InterpolateEaseInBounce(t) { + return 1 - bounce(1 - t); +} +function InterpolateEaseOutBounce(t) { + return bounce(t); +} +function InterpolateEaseInOutBounce(t) { + return t < 0.5 ? (1 - bounce(1 - 2 * t)) / 2 : (1 + bounce(2 * t - 1)) / 2; +} +function bounce(x) { + const n1 = 7.5625; + const d1 = 2.75; + if (x < 1 / d1) { + return n1 * x * x; + } else if (x < 2 / d1) { + return n1 * (x -= 1.5 / d1) * x + 0.75; + } else if (x < 2.5 / d1) { + return n1 * (x -= 2.25 / d1) * x + 0.9375; + } else { + return n1 * (x -= 2.625 / d1) * x + 0.984375; + } +} +function createCatmullRomSpline(points, nbPoints, closed) { + const catmullRom = new Array(); + const step = 1 / nbPoints; + let amount = 0; + if (closed) { + const pointsCount = points.length; + for (let i = 0; i < pointsCount; i++) { + amount = 0; + for (let c = 0; c < nbPoints; c++) { + catmullRom.push(Vector32.catmullRom(points[i % pointsCount], points[(i + 1) % pointsCount], points[(i + 2) % pointsCount], points[(i + 3) % pointsCount], amount)); + amount += step; + } + } + catmullRom.push(catmullRom[0]); + } else { + const totalPoints = new Array(); + totalPoints.push(Vector32.clone(points[0])); + Array.prototype.push.apply(totalPoints, points); + totalPoints.push(Vector32.clone(points[points.length - 1])); + let i = 0; + for (; i < totalPoints.length - 3; i++) { + amount = 0; + for (let c = 0; c < nbPoints; c++) { + catmullRom.push(Vector32.catmullRom(totalPoints[i], totalPoints[i + 1], totalPoints[i + 2], totalPoints[i + 3], amount)); + amount += step; + } + } + i--; + catmullRom.push(Vector32.catmullRom(totalPoints[i], totalPoints[i + 1], totalPoints[i + 2], totalPoints[i + 3], amount)); + } + return catmullRom; +} +function areAABBIntersecting(aMin, aMax, bMin, bMax) { + return aMin.x <= bMax.x && aMax.x >= bMin.x && aMin.y <= bMax.y && aMax.y >= bMin.y && aMin.z <= bMax.z && aMax.z >= bMin.z; +} +function areSpheresIntersecting(aPos, aRadius, bPos, bRadius) { + const sqDist = Vector32.distanceSquared(aPos, bPos); + const radiusSum = aRadius + bRadius; + return sqDist < radiusSum * radiusSum; +} +function areAABBSphereIntersecting(boxMin, boxMax, spherePos, sphereRadius) { + let dmin = 0; + if (spherePos.x < boxMin.x) + dmin += (boxMin.x - spherePos.x) * (boxMin.x - spherePos.x); + if (spherePos.x > boxMax.x) + dmin += (spherePos.x - boxMax.x) * (spherePos.x - boxMax.x); + if (spherePos.y < boxMin.y) + dmin += (boxMin.y - spherePos.y) * (boxMin.y - spherePos.y); + if (spherePos.y > boxMax.y) + dmin += (spherePos.y - boxMax.y) * (spherePos.y - boxMax.y); + if (spherePos.z < boxMin.z) + dmin += (boxMin.z - spherePos.z) * (boxMin.z - spherePos.z); + if (spherePos.z > boxMax.z) + dmin += (spherePos.z - boxMax.z) * (spherePos.z - boxMax.z); + return dmin < sphereRadius * sphereRadius; +} + +// node_modules/@dcl-sdk/utils/dist/priority.js +var REGULAR_PRIORITY = 1e5; +var priority; +(function(priority2) { + priority2.TimerSystemPriority = REGULAR_PRIORITY + 256; + priority2.TweenSystemPriority = REGULAR_PRIORITY + 192; + priority2.PerpetualMotionSystemPriority = REGULAR_PRIORITY + 192; + priority2.PathSystemPriority = REGULAR_PRIORITY + 192; + priority2.TriggerSystemPriority = REGULAR_PRIORITY + 128; + priority2.ActionSystemPriority = REGULAR_PRIORITY + 64; +})(priority || (priority = {})); + +// node_modules/@dcl-sdk/utils/dist/timer.js +function createTimers(targetEngine) { + const timers2 = /* @__PURE__ */ new Map(); + let timerIdCounter = 0; + function system(dt) { + let deadTimers = []; + let callbacks = []; + for (let [timerId, timerData] of timers2) { + timerData.accumulatedTime += 1e3 * dt; + if (timerData.accumulatedTime < timerData.interval) + continue; + callbacks.push(timerData.callback); + if (timerData.recurrent) { + timerData.accumulatedTime -= Math.floor(timerData.accumulatedTime / timerData.interval) * timerData.interval; + } else { + deadTimers.push(timerId); + } + } + for (let timerId of deadTimers) + timers2.delete(timerId); + for (let callback of callbacks) + callback(); + } + targetEngine.addSystem(system, priority.TimerSystemPriority); + return { + setTimeout(callback, milliseconds) { + let timerId = timerIdCounter++; + timers2.set(timerId, { callback, interval: milliseconds, recurrent: false, accumulatedTime: 0 }); + return timerId; + }, + clearTimeout(timer) { + timers2.delete(timer); + }, + setInterval(callback, milliseconds) { + let timerId = timerIdCounter++; + timers2.set(timerId, { callback, interval: milliseconds, recurrent: true, accumulatedTime: 0 }); + return timerId; + }, + clearInterval(timer) { + timers2.delete(timer); + } + }; +} +var timers = createTimers(engine); + +// node_modules/@dcl-sdk/utils/dist/toggle.js +var ToggleState; +(function(ToggleState2) { + ToggleState2[ToggleState2["Off"] = 0] = "Off"; + ToggleState2[ToggleState2["On"] = 1] = "On"; +})(ToggleState || (ToggleState = {})); +function createToggles(targetEngine, timers2) { + const Toggle = targetEngine.defineComponent("dcl.utils.Toggle", { + state: Schemas.EnumNumber(ToggleState, ToggleState.Off) + }); + let toggles2 = /* @__PURE__ */ new Map(); + timers2.setInterval(function() { + for (const entity of toggles2.keys()) { + if (targetEngine.getEntityState(entity) == EntityState.Removed || !Toggle.has(entity)) { + toggles2.delete(entity); + } + } + }, 5e3); + return { + addToggle(entity, state, callback) { + toggles2.set(entity, callback); + Toggle.createOrReplace(entity, { state }); + }, + removeToggle(entity) { + toggles2.delete(entity); + Toggle.deleteFrom(entity); + }, + setCallback(entity, callback) { + toggles2.set(entity, callback); + }, + set(entity, state) { + const oldState = Toggle.get(entity).state; + if (oldState != state) { + Toggle.getMutable(entity).state = state; + const callback = toggles2.get(entity); + if (callback) + callback(state); + } + }, + flip(entity) { + this.set(entity, 1 - Toggle.get(entity).state); + }, + isOn(entity) { + return Toggle.get(entity).state == ToggleState.On; + } + }; +} +var toggles = createToggles(engine, timers); + +// node_modules/@dcl-sdk/utils/dist/tween.js +function createTweens(targetEngine) { + const Vector3TweenSchema = { + start: Schemas.Vector3, + end: Schemas.Vector3, + interpolationType: Schemas.EnumString(InterpolationType, InterpolationType.LINEAR), + speed: Schemas.Float, + normalizedTime: Schemas.Float + }; + const PositionTween = targetEngine.defineComponent("dcl.utils.PositionTween", Vector3TweenSchema); + const ScaleTween = targetEngine.defineComponent("dcl.utils.ScaleTween", Vector3TweenSchema); + const RotationTween = targetEngine.defineComponent("dcl.utils.RotationTween", { + start: Schemas.Quaternion, + end: Schemas.Quaternion, + interpolationType: Schemas.EnumString(InterpolationType, InterpolationType.LINEAR), + speed: Schemas.Float, + normalizedTime: Schemas.Float + }); + const positionFinishCbs = /* @__PURE__ */ new Map(); + const rotationFinishCbs = /* @__PURE__ */ new Map(); + const scaleFinishCbs = /* @__PURE__ */ new Map(); + function makeSystem(tweenType, callbacks, transformer) { + return function system(dt) { + const deadTweens = []; + for (const entity of callbacks.keys()) { + if (targetEngine.getEntityState(entity) == EntityState.Removed || !tweenType.has(entity)) { + callbacks.delete(entity); + continue; + } + const tween = tweenType.getMutable(entity); + tween.normalizedTime = Scalar.clamp(tween.normalizedTime + dt * tween.speed, 0, 1); + const lerpTime = interpolate(tween.interpolationType, tween.normalizedTime); + transformer(Transform2.getMutable(entity), tween.start, tween.end, lerpTime); + if (tween.normalizedTime >= 1) + deadTweens.push(entity); + } + for (const entity of deadTweens) { + const callback = callbacks.get(entity); + tweenType.deleteFrom(entity); + callbacks.delete(entity); + if (callback) + callback(); + } + }; + } + function makeStop(tweenType, callbacks) { + return function(entity) { + tweenType.deleteFrom(entity); + callbacks.delete(entity); + }; + } + function makeStart(tweenType, callbacks) { + return function(entity, start, end, duration, interpolationType = InterpolationType.LINEAR, onFinish) { + callbacks.set(entity, onFinish); + tweenType.createOrReplace(entity, { + start, + end, + speed: duration == 0 ? 0 : 1 / duration, + interpolationType, + normalizedTime: duration == 0 ? 1 : 0 + }); + }; + } + function makeGetOnFinishCallback(callbacks) { + return function(entity) { + if (!callbacks.has(entity)) + throw new Error(`Entity ${entity} is not registered with tweens system`); + return callbacks.get(entity); + }; + } + targetEngine.addSystem(makeSystem(PositionTween, positionFinishCbs, function(transform, start, end, time) { + transform.position = Vector32.lerp(start, end, time); + }), priority.TweenSystemPriority); + targetEngine.addSystem(makeSystem(RotationTween, rotationFinishCbs, function(transform, start, end, time) { + transform.rotation = Quaternion2.slerp(start, end, time); + }), priority.TweenSystemPriority); + targetEngine.addSystem(makeSystem(ScaleTween, scaleFinishCbs, function(transform, start, end, time) { + transform.scale = Vector32.lerp(start, end, time); + }), priority.TweenSystemPriority); + return { + startTranslation: makeStart(PositionTween, positionFinishCbs), + stopTranslation: makeStop(PositionTween, positionFinishCbs), + startRotation: makeStart(RotationTween, rotationFinishCbs), + stopRotation: makeStop(RotationTween, rotationFinishCbs), + startScaling: makeStart(ScaleTween, scaleFinishCbs), + stopScaling: makeStop(ScaleTween, scaleFinishCbs), + getTranslationOnFinishCallback: makeGetOnFinishCallback(positionFinishCbs), + getRotationOnFinishCallback: makeGetOnFinishCallback(rotationFinishCbs), + getScalingOnFinishCallback: makeGetOnFinishCallback(scaleFinishCbs) + }; +} +var tweens = createTweens(engine); + +// node_modules/@dcl-sdk/utils/dist/perpetualMotion.js +function createPerpetualMotions(targetEngine) { + const PerpetualRotation = targetEngine.defineComponent("dcl.utils.PerpetualRotation", { + velocity: Schemas.Quaternion + }); + function system(dt) { + for (const [entity, rotation] of targetEngine.getEntitiesWith(PerpetualRotation, Transform2)) { + const rotationDelta = Quaternion2.slerp(Quaternion2.Identity(), rotation.velocity, dt); + const transform = Transform2.getMutable(entity); + transform.rotation = Quaternion2.normalize(Quaternion2.multiply(transform.rotation, rotationDelta)); + } + } + targetEngine.addSystem(system, priority.PerpetualMotionSystemPriority); + return { + startRotation(entity, velocity) { + PerpetualRotation.createOrReplace(entity, { velocity }); + }, + stopRotation(entity) { + PerpetualRotation.deleteFrom(entity); + } + }; +} +var perpetualMotions = createPerpetualMotions(engine); + +// node_modules/@dcl-sdk/utils/dist/path.js +function createPaths(targetEngine) { + const FollowPath = targetEngine.defineComponent("dcl.utils.FollowPath", { + points: Schemas.Array(Schemas.Vector3), + faceDirection: Schemas.Boolean, + speed: Schemas.Number, + normalizedTime: Schemas.Number, + currentIndex: Schemas.Number, + segmentTimes: Schemas.Array(Schemas.Number), + curveSegmentCount: Schemas.Number + }); + const finishCbs = /* @__PURE__ */ new Map(); + const pointReachedCbs = /* @__PURE__ */ new Map(); + function unregisterEntity(entity) { + finishCbs.delete(entity); + pointReachedCbs.delete(entity); + FollowPath.deleteFrom(entity); + } + function system(dt) { + const deadPaths = []; + const pointReachedPaths = []; + for (const entity of finishCbs.keys()) { + if (targetEngine.getEntityState(entity) == EntityState.Removed || !FollowPath.has(entity)) { + unregisterEntity(entity); + continue; + } + const transform = Transform2.getMutable(entity); + const path = FollowPath.getMutable(entity); + path.normalizedTime = Scalar.clamp(path.normalizedTime + dt * path.speed, 0, 1); + if (path.normalizedTime >= 1) + deadPaths.push(entity); + while (path.normalizedTime >= path.segmentTimes[path.currentIndex] && path.currentIndex < path.points.length - 1) { + if (path.faceDirection) { + const direction = Vector32.subtract(path.points[path.currentIndex + 1], path.points[path.currentIndex]); + transform.rotation = Quaternion2.lookRotation(direction); + } + if (path.currentIndex > 0 && path.currentIndex % path.curveSegmentCount == 0) { + const pointIndex = path.currentIndex / path.curveSegmentCount; + const pointCoords = path.points[path.currentIndex]; + const nextPointCoords = path.points[path.currentIndex + path.curveSegmentCount]; + pointReachedPaths.push({ entity, index: pointIndex, coords: pointCoords, nextCoords: nextPointCoords }); + } + path.currentIndex += 1; + } + const timeDiff = path.segmentTimes[path.currentIndex] - path.segmentTimes[path.currentIndex - 1]; + const coef = (path.segmentTimes[path.currentIndex] - path.normalizedTime) / timeDiff; + transform.position = Vector32.lerp(path.points[path.currentIndex], path.points[path.currentIndex - 1], coef); + } + for (const pointReached of pointReachedPaths) { + const callback = pointReachedCbs.get(pointReached.entity); + if (callback) { + callback(pointReached.index, pointReached.coords, pointReached.nextCoords); + } + } + for (const entity of deadPaths) { + const callback = finishCbs.get(entity); + unregisterEntity(entity); + if (callback) + callback(); + } + } + targetEngine.addSystem(system, priority.PathSystemPriority); + function startPath(entity, points, duration, faceDirection, curveSegmentCount, onFinishCallback, onPointReachedCallback) { + if (points.length < 2) + throw new Error("At least 2 points are required to form a path."); + if (duration == 0) + throw new Error("Path duration must not be zero"); + if (curveSegmentCount) { + const loop = Vector32.equals(points[0], points[points.length - 1]); + if (loop) { + points.pop(); + points.unshift(points.pop()); + } + points = createCatmullRomSpline(points, curveSegmentCount, loop); + } else { + curveSegmentCount = 1; + } + finishCbs.set(entity, onFinishCallback); + pointReachedCbs.set(entity, onPointReachedCallback); + let totalLength = 0; + const segmentLengths = []; + for (let i = 0; i < points.length - 1; i++) { + let sqDist = Vector32.distance(points[i], points[i + 1]); + totalLength += sqDist; + segmentLengths.push(sqDist); + } + const segmentTimes = [0]; + for (let i = 0; i < segmentLengths.length; i++) { + segmentTimes.push(segmentLengths[i] / totalLength + segmentTimes[i]); + } + FollowPath.createOrReplace(entity, { + points, + segmentTimes, + curveSegmentCount, + speed: 1 / duration, + normalizedTime: 0, + currentIndex: 0, + faceDirection + }); + } + return { + startStraightPath(entity, points, duration, faceDirection, onFinishCallback, onPointReachedCallback) { + return startPath(entity, points, duration, faceDirection, 0, onFinishCallback, onPointReachedCallback); + }, + startSmoothPath(entity, points, duration, segmentCount, faceDirection, onFinishCallback, onPointReachedCallback) { + if (segmentCount < 2 || !Number.isInteger(segmentCount)) + throw new Error(`segmentCount must be an integer that is greater than 2, got: ${segmentCount}`); + return startPath(entity, points, duration, faceDirection, segmentCount, onFinishCallback, onPointReachedCallback); + }, + stopPath(entity) { + unregisterEntity(entity); + }, + getOnFinishCallback(entity) { + if (!finishCbs.has(entity)) + throw new Error(`Entity ${entity} is not registered in triggers system`); + return finishCbs.get(entity); + } + }; +} +var paths = createPaths(engine); + +// node_modules/@dcl-sdk/utils/dist/trigger.js +var LAYER_1 = 1; +var ALL_LAYERS = 255; +var NO_LAYERS = 0; +var PLAYER_LAYER_ID = LAYER_1; +function createTriggers(targetEngine) { + const Trigger = engine.defineComponent("dcl.utils.Trigger", { + active: Schemas.Boolean, + layerMask: Schemas.Int, + triggeredByMask: Schemas.Int, + areas: Schemas.Array(Schemas.OneOf({ + box: Schemas.Map({ + position: Schemas.Vector3, + scale: Schemas.Vector3 + }), + sphere: Schemas.Map({ + position: Schemas.Vector3, + radius: Schemas.Number + }) + })), + debugColor: Schemas.Color3 + }); + const triggerEnterCbs = /* @__PURE__ */ new Map(); + const triggerExitCbs = /* @__PURE__ */ new Map(); + let debugDraw = false; + const activeCollisions = /* @__PURE__ */ new Map(); + const debugEntities = /* @__PURE__ */ new Map(); + function updateDebugDraw(enabled) { + if (!enabled) + return; + for (const [entity, trigger] of targetEngine.getEntitiesWith(Trigger, Transform2)) { + let shapes = debugEntities.get(entity); + const areaCount = trigger.areas.length; + while (shapes.length > areaCount) { + targetEngine.removeEntity(shapes.pop()); + } + while (shapes.length < areaCount) { + shapes.push(targetEngine.addEntity()); + } + const worldPosition = getWorldPosition(entity); + const worldRotation = getWorldRotation(entity); + for (let i = 0; i < areaCount; ++i) { + const shapeSpec = trigger.areas[i]; + const shape = shapes[i]; + let scale; + if (shapeSpec.$case == "box") { + scale = shapeSpec.value.scale; + MeshRenderer3.setBox(shape); + } else { + const radius = shapeSpec.value.radius; + scale = { x: radius, y: radius, z: radius }; + MeshRenderer3.setSphere(shape); + } + Transform2.createOrReplace(shape, { + position: Vector32.add(worldPosition, Vector32.rotate(shapeSpec.value.position, worldRotation)), + scale + }); + const color = trigger.active ? trigger.debugColor : Color32.Black(); + Material3.setPbrMaterial(shape, { albedoColor: Color42.fromInts(255 * color.r, 255 * color.g, 255 * color.b, 75) }); + } + } + } + function areTriggersIntersecting(shapeWorldPos0, t0, shapeWorldPos1, t1) { + for (let i = 0; i < t0.areas.length; ++i) { + const t0World = shapeWorldPos0[i]; + const t0Area = t0.areas[i]; + if (t0Area.$case == "box") { + const t0Box = t0Area.value; + const t0Min = Vector32.subtract(t0World, Vector32.scale(t0Box.scale, 0.5)); + const t0Max = Vector32.add(t0Min, t0Box.scale); + for (let j = 0; j < t1.areas.length; ++j) { + const t1World = shapeWorldPos1[j]; + const t1Area = t1.areas[j]; + if (t1Area.$case == "box") { + const t1Box = t1Area.value; + const t1Min = Vector32.subtract(t1World, Vector32.scale(t1Box.scale, 0.5)); + const t1Max = Vector32.add(t1Min, t1Box.scale); + if (areAABBIntersecting(t0Min, t0Max, t1Min, t1Max)) + return true; + } else { + if (areAABBSphereIntersecting(t0Min, t0Max, t1World, t1Area.value.radius)) + return true; + } + } + } else { + const t0Radius = t0Area.value.radius; + for (let j = 0; j < t1.areas.length; ++j) { + const t1World = shapeWorldPos1[j]; + const t1Area = t1.areas[j]; + if (t1Area.$case == "box") { + const t1Box = t1Area.value; + const t1Min = Vector32.subtract(t1World, Vector32.scale(t1Box.scale, 0.5)); + const t1Max = Vector32.add(t1Min, t1Box.scale); + if (areAABBSphereIntersecting(t1Min, t1Max, t0World, t0Radius)) + return true; + } else { + if (areSpheresIntersecting(t0World, t0Radius, t1World, t1Area.value.radius)) + return true; + } + } + } + } + return false; + } + function computeCollisions(entity, shapeWorldPos) { + let collisions = EMPTY_IMMUTABLE_SET; + const trigger = Trigger.get(entity); + if (!trigger.active) + return collisions; + if (trigger.triggeredByMask == PLAYER_LAYER_ID) { + const playerEntity = targetEngine.PlayerEntity; + const playerTrigger = Trigger.get(targetEngine.PlayerEntity); + if (playerEntity == entity) + return collisions; + if (!playerTrigger.active) + return collisions; + if (!(trigger.triggeredByMask & playerTrigger.layerMask)) + return collisions; + const intersecting = areTriggersIntersecting(shapeWorldPos.get(entity), trigger, shapeWorldPos.get(playerEntity), playerTrigger); + if (intersecting) { + if (collisions === EMPTY_IMMUTABLE_SET) + collisions = /* @__PURE__ */ new Set(); + collisions.add(playerEntity); + } + } else { + for (const [otherEntity, otherTrigger] of targetEngine.getEntitiesWith(Trigger, Transform2)) { + if (otherEntity == entity) + continue; + if (!otherTrigger.active) + continue; + if (!(trigger.triggeredByMask & otherTrigger.layerMask)) + continue; + const intersecting = areTriggersIntersecting(shapeWorldPos.get(entity), trigger, shapeWorldPos.get(otherEntity), otherTrigger); + if (intersecting) { + if (collisions === EMPTY_IMMUTABLE_SET) + collisions = /* @__PURE__ */ new Set(); + collisions.add(otherEntity); + } + } + } + return collisions; + } + function updateCollisions() { + const collisionsStarted = []; + const collisionsEnded = []; + const shapeWorldPositions = /* @__PURE__ */ new Map(); + for (const entity of activeCollisions.keys()) { + if (targetEngine.getEntityState(entity) == EntityState.Removed || !Trigger.has(entity)) { + for (const debugEntity of debugEntities.get(entity)) + targetEngine.removeEntity(debugEntity); + for (const collisions of activeCollisions.values()) { + if (collisions.has(entity)) + collisions.delete(entity); + } + debugEntities.delete(entity); + activeCollisions.delete(entity); + triggerEnterCbs.delete(entity); + triggerExitCbs.delete(entity); + continue; + } + const positions = []; + const entityWorldPosition = getWorldPosition(entity); + const entityWorldRotation = getWorldRotation(entity); + const trigger = Trigger.get(entity); + for (const shape of trigger.areas) { + positions.push(Vector32.add(entityWorldPosition, Vector32.rotate(shape.value.position, entityWorldRotation))); + } + shapeWorldPositions.set(entity, positions); + } + for (const entity of activeCollisions.keys()) { + const newCollisions = computeCollisions(entity, shapeWorldPositions); + const oldCollisions = activeCollisions.get(entity); + for (const oldCollision of oldCollisions) { + if (!newCollisions.has(oldCollision)) + collisionsEnded.push([entity, oldCollision]); + } + for (const newCollision of newCollisions) { + if (!oldCollisions.has(newCollision)) + collisionsStarted.push([entity, newCollision]); + } + activeCollisions.set(entity, newCollisions); + } + for (const [entity, collision] of collisionsStarted) { + const callback = triggerEnterCbs.get(entity); + if (callback) + callback(collision); + } + for (const [entity, collision] of collisionsEnded) { + const callback = triggerExitCbs.get(entity); + if (callback) + callback(collision); + } + } + function system(dt) { + updateCollisions(); + updateDebugDraw(debugDraw); + } + targetEngine.addSystem(system, priority.TriggerSystemPriority); + function triggerAreasFromSpec(areas) { + if (!areas) + areas = [{ type: "box" }]; + const triggerAreas = []; + for (const area of areas) { + if (area.type == "box") { + triggerAreas.push({ + $case: "box", + value: { + position: area.position ? area.position : Vector32.Zero(), + scale: area.scale ? area.scale : Vector32.One() + } + }); + } else { + triggerAreas.push({ + $case: "sphere", + value: { + position: area.position ? area.position : Vector32.Zero(), + radius: area.radius ? area.radius : 1 + } + }); + } + } + return triggerAreas; + } + const triggersInterface = { + addTrigger(entity, layerMask = NO_LAYERS, triggeredByMask = NO_LAYERS, areas, onEnterCallback, onExitCallback, debugColor) { + if (layerMask < 0 || layerMask > ALL_LAYERS || !Number.isInteger(layerMask)) + throw new Error(`Bad layerMask: ${layerMask}. Expected a non-negative integer no greater than ${ALL_LAYERS}`); + if (triggeredByMask < 0 || triggeredByMask > ALL_LAYERS || !Number.isInteger(triggeredByMask)) + throw new Error(`Bad triggeredByMask: ${triggeredByMask}. Expected a non-negative integer no greater than ${ALL_LAYERS}`); + debugEntities.set(entity, []); + activeCollisions.set(entity, /* @__PURE__ */ new Set()); + triggerEnterCbs.set(entity, onEnterCallback); + triggerExitCbs.set(entity, onExitCallback); + Trigger.createOrReplace(entity, { + active: true, + layerMask, + triggeredByMask, + areas: triggerAreasFromSpec(areas), + debugColor: debugColor ? debugColor : Color32.Red() + }); + }, + removeTrigger(entity) { + const collisions = activeCollisions.get(entity); + const callback = triggerExitCbs.get(entity); + for (const debugEntity of debugEntities.get(entity)) + targetEngine.removeEntity(debugEntity); + debugEntities.delete(entity); + activeCollisions.delete(entity); + triggerEnterCbs.delete(entity); + triggerExitCbs.delete(entity); + Trigger.deleteFrom(entity); + const collidingEntities = []; + for (const [otherEntity, otherEntityCollisions] of activeCollisions) { + if (otherEntityCollisions.has(entity)) { + otherEntityCollisions.delete(entity); + collidingEntities.push(otherEntity); + } + } + if (callback) { + for (const collision of collisions) + callback(collision); + } + for (const otherEntity of collidingEntities) { + const callback2 = triggerExitCbs.get(otherEntity); + if (callback2) + callback2(entity); + } + }, + oneTimeTrigger(entity, layerMask = NO_LAYERS, triggeredByMask = NO_LAYERS, areas, onEnterCallback, debugColor) { + this.addTrigger(entity, layerMask, triggeredByMask, areas, function(e) { + triggers.removeTrigger(entity); + if (onEnterCallback) + onEnterCallback(e); + }, void 0, debugColor); + }, + enableTrigger(entity, enabled) { + Trigger.getMutable(entity).active = enabled; + }, + isTriggerEnabled(entity) { + return Trigger.get(entity).active; + }, + getLayerMask(entity) { + return Trigger.get(entity).layerMask; + }, + setLayerMask(entity, mask) { + if (mask < 0 || mask > ALL_LAYERS || !Number.isInteger(mask)) + throw new Error(`Bad layerMask: ${mask}. Expected a non-negative integer no greater than ${ALL_LAYERS}`); + Trigger.getMutable(entity).layerMask = mask; + }, + getTriggeredByMask(entity) { + return Trigger.get(entity).triggeredByMask; + }, + setTriggeredByMask(entity, mask) { + if (mask < 0 || mask > ALL_LAYERS || !Number.isInteger(mask)) + throw new Error(`Bad layerMask: ${mask}. Expected a non-negative integer no greater than ${ALL_LAYERS}`); + Trigger.getMutable(entity).triggeredByMask = mask; + }, + getAreas(entity) { + return Trigger.get(entity).areas; + }, + setAreas(entity, areas) { + Trigger.getMutable(entity).areas = triggerAreasFromSpec(areas); + }, + setOnEnterCallback(entity, callback) { + triggerEnterCbs.set(entity, callback); + }, + setOnExitCallback(entity, callback) { + triggerExitCbs.set(entity, callback); + }, + enableDebugDraw(enabled) { + debugDraw = enabled; + if (!enabled) { + for (const shapes of debugEntities.values()) { + for (const shape of shapes) + targetEngine.removeEntity(shape); + shapes.length = 0; + } + } + }, + isDebugDrawEnabled() { + return debugDraw; + } + }; + triggersInterface.addTrigger(targetEngine.PlayerEntity, PLAYER_LAYER_ID, NO_LAYERS, [{ + type: "box", + scale: { x: 0.65, y: 1.92, z: 0.65 }, + position: { x: 0, y: 0.15, z: 0 } + }], void 0, void 0, Color32.Green()); + return triggersInterface; +} +var triggers = createTriggers(engine); +var EMPTY_IMMUTABLE_SET = /* @__PURE__ */ new Set(); +EMPTY_IMMUTABLE_SET.add = (entity) => { + debugger; + throw new Error("EMPTY_SET is read only"); +}; +EMPTY_IMMUTABLE_SET.delete = (entity) => { + throw new Error("EMPTY_SET is read only"); +}; +EMPTY_IMMUTABLE_SET.has = (entity) => { + return false; +}; + +// node_modules/@dcl-sdk/utils/dist/action.js +var actions; +(function(actions3) { + class SequenceRunner { + constructor(targetEngine, sequenceBuilt, onFinishCallback) { + this.beginSequenceNode = null; + this.currentSequenceNode = null; + this.running = false; + this.started = false; + this.engine = targetEngine; + this.systemFn = (dt) => { + this.update(dt); + }; + this.engine.addSystem(this.systemFn, priority.ActionSystemPriority); + if (sequenceBuilt) { + this.startSequence(sequenceBuilt); + } + if (onFinishCallback) + this.setOnFinishCallback(onFinishCallback); + } + startSequence(sequenceBuilt) { + this.beginSequenceNode = sequenceBuilt.beginSequenceNode; + this.currentSequenceNode = this.beginSequenceNode; + this.running = true; + this.started = false; + } + destroy() { + this.engine.removeSystem(this.systemFn); + } + setOnFinishCallback(onFinishCallback) { + this.onFinishCallback = onFinishCallback; + } + isRunning() { + return this.running; + } + stop() { + this.running = false; + } + resume() { + if (this.beginSequenceNode != null) + this.running = true; + } + reset() { + this.currentSequenceNode = this.beginSequenceNode; + this.running = true; + this.started = false; + } + getRunningAction() { + let currentNode = this.currentSequenceNode; + if (this.currentSequenceNode instanceof SubSequenceNode) { + do { + currentNode = currentNode.currentInnerSequence; + } while (currentNode instanceof SubSequenceNode); + } + return currentNode.action; + } + update(dt) { + if (!this.running) + return; + if (!this.started) { + this.currentSequenceNode.onStart(); + this.started = true; + return; + } + if (!this.currentSequenceNode.hasFinish()) { + this.currentSequenceNode.update(dt); + return; + } + this.currentSequenceNode.onFinish(); + this.currentSequenceNode = this.currentSequenceNode.next; + if (this.currentSequenceNode) { + this.currentSequenceNode.onStart(); + } else { + this.running = false; + if (this.onFinishCallback) + this.onFinishCallback(); + } + } + } + actions3.SequenceRunner = SequenceRunner; + class SequenceBuilder { + constructor() { + this.currentSequenceNode = null; + this.beginSequenceNode = null; + this.whileNodeStack = []; + } + then(action) { + if (this.currentSequenceNode == null) { + this.currentSequenceNode = new SequenceNode(); + this.currentSequenceNode.action = action; + this.beginSequenceNode = this.currentSequenceNode; + } else { + let next = new SequenceNode(); + next.action = action; + this.currentSequenceNode = this.currentSequenceNode.then(next); + } + return this; + } + if(condition) { + let ifSeq = new IfSequenceNode(condition); + if (this.currentSequenceNode == null) { + this.currentSequenceNode = ifSeq; + this.beginSequenceNode = ifSeq; + } else { + this.currentSequenceNode = this.currentSequenceNode.then(ifSeq); + } + return this; + } + else() { + let seq = this.currentSequenceNode.getSequence(); + if (seq instanceof IfSequenceNode) { + seq.closed = true; + let elseSeq = new ElseSequenceNode(seq); + this.currentSequenceNode = this.currentSequenceNode.then(elseSeq); + } else { + throw new Error("IF statement is needed to be called before ELSE statement."); + } + return this; + } + endIf() { + let seq = this.currentSequenceNode.getSequence(); + if (seq instanceof IfSequenceNode || seq instanceof ElseSequenceNode) { + seq.closed = true; + } else { + throw new Error("IF statement is needed to be called before ENDIF statement."); + } + return this; + } + while(condition) { + let whileSeq = new WhileSequenceNode(condition); + if (this.currentSequenceNode == null) { + this.currentSequenceNode = whileSeq; + this.beginSequenceNode = whileSeq; + } else { + this.currentSequenceNode = this.currentSequenceNode.then(whileSeq); + } + this.whileNodeStack.push(whileSeq); + return this; + } + endWhile() { + let seq = this.currentSequenceNode.getSequence(); + if (seq instanceof WhileSequenceNode) { + seq.closed = true; + if (this.whileNodeStack.length > 0) { + this.whileNodeStack.splice(this.whileNodeStack.length - 1, 1); + } + } else { + throw new Error("WHILE statement is needed to be called before ENDWHILE statement."); + } + return this; + } + breakWhile() { + if (this.whileNodeStack.length > 0) { + this.currentSequenceNode = this.currentSequenceNode.then(new BreakWhileSequenceNode(this.whileNodeStack[this.whileNodeStack.length - 1])); + } else { + throw new Error("WHILE statement is needed to be called before BREAKWHILE statement."); + } + return this; + } + } + actions3.SequenceBuilder = SequenceBuilder; + class SequenceNode { + constructor() { + this.action = null; + this.next = null; + } + then(next) { + this.next = next; + return next; + } + onStart() { + if (this.action) + this.action.onStart(); + } + update(dt) { + if (this.action) + this.action.update(dt); + } + onFinish() { + if (this.action) + this.action.onFinish(); + } + hasFinish() { + if (this.action) + return this.action.hasFinished; + else + return true; + } + getSequence() { + return this; + } + } + actions3.SequenceNode = SequenceNode; + class SubSequenceNode extends SequenceNode { + constructor() { + super(...arguments); + this.currentInnerSequence = null; + this.startingInnerSequence = null; + this.closed = false; + } + then(next) { + if (this.currentInnerSequence == null) { + this.currentInnerSequence = next; + this.startingInnerSequence = next; + } else { + if (this.closed) { + this.next = next; + return next; + } else { + this.currentInnerSequence = this.currentInnerSequence.then(next); + } + } + return this; + } + onStart() { + this.currentInnerSequence = this.startingInnerSequence; + if (this.currentInnerSequence) + this.currentInnerSequence.onStart(); + } + update(dt) { + if (this.currentInnerSequence) { + if (!this.currentInnerSequence.hasFinish()) { + this.currentInnerSequence.update(dt); + } else { + this.currentInnerSequence.onFinish(); + this.currentInnerSequence = this.currentInnerSequence.next; + if (this.currentInnerSequence) + this.currentInnerSequence.onStart(); + } + } + } + onFinish() { + if (this.currentInnerSequence) + this.currentInnerSequence.onFinish(); + } + hasFinish() { + return this.currentInnerSequence == null; + } + getSequence() { + if (this.currentInnerSequence) { + let innerSeq = this.currentInnerSequence.getSequence(); + if (innerSeq instanceof SubSequenceNode) { + if (!innerSeq.closed) { + return innerSeq; + } + } + } + return this; + } + } + class IfSequenceNode extends SubSequenceNode { + constructor(condition) { + super(); + this.result = false; + this.condition = condition; + } + onStart() { + this.result = this.condition(); + if (this.result) + super.onStart(); + else + this.currentInnerSequence = null; + } + } + class ElseSequenceNode extends SubSequenceNode { + constructor(ifSequence) { + super(); + this.ifSequence = null; + this.ifSequence = ifSequence; + } + onStart() { + if (this.ifSequence && !this.ifSequence.result) + super.onStart(); + else + this.currentInnerSequence = null; + } + } + class WhileSequenceNode extends SubSequenceNode { + constructor(condition) { + super(); + this.breakWhile = false; + this.condition = condition; + } + onStart() { + this.breakWhile = false; + if (this.condition()) + super.onStart(); + else + this.currentInnerSequence = null; + } + update(dt) { + if (this.currentInnerSequence) { + if (!this.currentInnerSequence.hasFinish()) { + this.currentInnerSequence.update(dt); + } else { + this.currentInnerSequence.onFinish(); + this.currentInnerSequence = this.currentInnerSequence.next; + if (this.currentInnerSequence == null) + this.currentInnerSequence = this.startingInnerSequence; + if (this.currentInnerSequence) + this.currentInnerSequence.onStart(); + } + } + } + hasFinish() { + return this.breakWhile || !this.condition(); + } + } + class BreakWhileSequenceNode extends SequenceNode { + constructor(whileNode) { + super(); + this.whileNode = whileNode; + } + onStart() { + this.whileNode.breakWhile = true; + } + } +})(actions || (actions = {})); + +// src/modules/cuttingBoard.ts +function cutSushi(entity, modelEntity) { + let boardData = CuttingBoard.getMutable(entity); + if (!boardData.hasRoll || boardData.cutting) + return; + let ingredient = boardData.rollChild; + let ingredientData = GrabableObjectComponent.getMutable(ingredient); + if (ingredientData.type != 1 /* SushiRoll */) { + ruinFood(ingredient); + } + boardData.cutting = true; + boardData.cuts += 1; + switch (boardData.cuts) { + case 1: + Animator3.playSingleAnimation(modelEntity, "State1", false); + break; + case 2: + Animator3.playSingleAnimation(modelEntity, "State2", false); + break; + case 3: + Animator3.playSingleAnimation(modelEntity, "State3", false); + break; + case 4: + Animator3.playSingleAnimation(modelEntity, "State4", false); + break; + case 5: + Animator3.playSingleAnimation(modelEntity, "State5", false); + if (ingredientData.type != 1 /* SushiRoll */) + return; + timers.setTimeout(() => { + ingredientData.type = 3 /* SlicedSushi */; + GltfContainer2.getMutable(ingredient).src = "assets/models/PlateSushi.glb"; + }, 300); + break; + case 6: + Animator3.playSingleAnimation(modelEntity, "State5", false); + ruinFood(ingredient); + break; + default: + break; + } + timers.setTimeout(() => { + boardData.cutting = false; + }, 500); +} +function switchToCutMode(entity) { + const pointerEvent = PointerEvents2.getMutable(entity).pointerEvents[0]; + if (pointerEvent && pointerEvent.eventInfo) { + pointerEvent.eventInfo.hoverText = "Cut"; + } +} +function switchToEmpty(entity) { + const pointerEvent = PointerEvents2.getMutable(entity).pointerEvents[0]; + if (pointerEvent && pointerEvent.eventInfo) { + pointerEvent.eventInfo.hoverText = "Put"; + pointerEvent.eventInfo.button = InputAction.IA_PRIMARY; + } + Animator3.stopAllAnimations(entity, true); +} +function ruinFood(entity) { + console.log("ruin food"); + let objectData = GrabableObjectComponent.getMutable(entity); + objectData.type = 4 /* Trash */; + GltfContainer2.getMutable(entity).src = "assets/models/GarbageFood.glb"; +} + +// src/modules/progressBars.ts +function CreateProgressBar(parent, height, yRotation, movesUp, startHidden, speed, id1, id2) { + const background = engine.addEntity(); + Transform2.create(background, { + position: Vector32.create(0, height ? height : 1, 0), + scale: Vector32.create(0.82, 0.15, 1), + rotation: Quaternion2.fromEulerDegrees(0, yRotation ? yRotation : 0, 0) + }); + MeshRenderer3.setPlane(background); + syncEntity(background, [Transform2.componentId, VisibilityComponent2.componentId], id1); + parentEntity(background, parent); + const progressBar = engine.addEntity(); + Transform2.create(progressBar, { + position: Vector32.create(0, 0, -0.03), + scale: Vector32.create(0.95, 0.8, 1) + }); + MeshRenderer3.setPlane(progressBar); + Material3.setBasicMaterial(progressBar, { diffuseColor: Color42.Green() }); + ProgressBar.create(progressBar, { + parent, + color: Color42.Green(), + movesUp, + ratio: movesUp ? 0 : 1, + redWarning: movesUp ? 0.8 : 0.2, + speed: speed ? speed : 1, + visible: startHidden ? false : true, + active: startHidden ? false : true + }); + syncEntity(progressBar, [Transform2.componentId, Material3.componentId, VisibilityComponent2.componentId], id2); + parentEntity(progressBar, background); + if (startHidden) { + VisibilityComponent2.create(background, { visible: false }); + VisibilityComponent2.create(progressBar, { visible: false }); + } + return progressBar; +} +function ProgressBarUpdate(dt) { + for (const [entity] of engine.getEntitiesWith(ProgressBar)) { + const progressBar = ProgressBar.getMutable(entity); + if (progressBar.active) { + if (progressBar.movesUp) { + progressBar.ratio += dt / 10 * progressBar.speed; + if (progressBar.ratio > progressBar.yellowWarning && progressBar.color == Color42.Green()) { + changeBarColor(entity, Color42.Yellow()); + } else if (progressBar.ratio > progressBar.redWarning && progressBar.color != Color42.Red()) { + changeBarColor(entity, Color42.Red()); + } else if (progressBar.ratio > progressBar.fullLength) { + progressBar.ratio = 1; + progressBar.active = false; + } + } else { + progressBar.ratio -= dt / 10 * progressBar.speed; + if (progressBar.ratio < progressBar.yellowWarning && progressBar.color == Color42.Green()) { + changeBarColor(entity, Color42.Yellow()); + } else if (progressBar.ratio < progressBar.redWarning && progressBar.color != Color42.Red()) { + changeBarColor(entity, Color42.Red()); + } else if (progressBar.ratio <= 0) { + progressBar.ratio = 0; + progressBar.active = false; + } + } + if (progressBar.ratio > progressBar.fullLength) { + progressBar.active = false; + } + const transform = Transform2.getMutable(entity); + let width = Scalar.lerp(0, progressBar.fullLength, progressBar.ratio); + transform.scale.x = width; + transform.position.x = -progressBar.fullLength / 2 + width / 2; + } + } +} +function changeBarColor(entity, color) { + const progressBar = ProgressBar.getMutable(entity); + progressBar.color = color; + const material = Material3.getMutable(entity); + Material3.setBasicMaterial(entity, { diffuseColor: color }); +} +function HideProgressBar(entity) { + const progressBar = ProgressBar.getMutable(entity); + progressBar.visible = false; + VisibilityComponent2.createOrReplace(entity, { visible: false }); + const parent = getParent(entity); + if (parent) { + VisibilityComponent2.createOrReplace(parent, { visible: false }); + } +} +function ResetProgressBar(entity) { + const parent = getParent(entity); + const barData = ProgressBar.getMutable(entity); + barData.active = true; + if (barData.movesUp) { + barData.ratio = 0; + } else { + barData.ratio = 1; + } + barData.color = Color42.Green(); + barData.visible = true; + if (VisibilityComponent2.has(entity)) { + VisibilityComponent2.deleteFrom(entity); + } + if (parent && VisibilityComponent2.has(parent)) { + VisibilityComponent2.deleteFrom(parent); + } + changeBarColor(entity, Color42.Green()); +} + +// src/modules/speechBubble.ts +var bubble1Texture = Material3.Texture.Common({ + src: "assets/textures/bubble.png" +}); +var bubble3Texture = Material3.Texture.Common({ + src: "assets/textures/bubble3.png" +}); +function createSpeechBubble(parent, seatNumber, text, height, bubbleType) { + let bubbleParentId = 28 /* BUBBLE1_A */; + let backgroundId = 29 /* BUBBLE1_B */; + let textId = 30 /* BUBBLE1_C */; + switch (seatNumber) { + case 1: + bubbleParentId = 28 /* BUBBLE1_A */; + backgroundId = 29 /* BUBBLE1_B */; + textId = 30 /* BUBBLE1_C */; + break; + case 2: + bubbleParentId = 31 /* BUBBLE2_A */; + backgroundId = 32 /* BUBBLE2_B */; + textId = 33 /* BUBBLE2_C */; + break; + case 3: + bubbleParentId = 34 /* BUBBLE3_A */; + backgroundId = 35 /* BUBBLE3_B */; + textId = 36 /* BUBBLE3_C */; + break; + case 4: + bubbleParentId = 37 /* BUBBLE4_A */; + backgroundId = 38 /* BUBBLE4_B */; + textId = 39 /* BUBBLE4_C */; + break; + } + const bubbleParent = engine.addEntity(); + Transform2.create(bubbleParent, { + position: Vector32.create(-1, 0, 0), + rotation: Quaternion2.fromEulerDegrees(0, 180, 0) + }); + const background = engine.addEntity(); + Transform2.create(background, { + position: Vector32.create(-0.6, height ? height - 0.35 : 0.65, 0), + scale: Vector32.create(1.4, 1.6, 1), + rotation: Quaternion2.fromEulerDegrees(0, 0, 0) + }); + MeshRenderer3.setPlane(background); + VisibilityComponent2.createOrReplace(background, { visible: false }); + const textEntity = engine.addEntity(); + Transform2.create(textEntity, { + position: Vector32.create(-1, height ? height - 0.1 : 0.9, -0.03), + scale: Vector32.create(0.85, 0.85, 0.85), + rotation: Quaternion2.fromEulerDegrees(0, 0, 0) + }); + TextShape2.create(textEntity, { + text, + width: 1.1, + height: 1.1, + textAlign: TextAlignMode.TAM_MIDDLE_LEFT, + fontSize: 1 + }); + VisibilityComponent2.createOrReplace(textEntity, { visible: false }); + let texture = bubble1Texture; + let color = Color42.Gray(); + switch (bubbleType) { + case 1 /* Good */: + texture = bubble3Texture; + color = Color42.Green(); + break; + case 2 /* Bad */: + texture = bubble3Texture; + color = Color42.Red(); + break; + } + Material3.setBasicMaterial(background, { + diffuseColor: color, + texture + }); + syncEntity(bubbleParent, [], bubbleParentId); + parentEntity(bubbleParent, parent); + syncEntity(background, [Material3.componentId, Transform2.componentId, VisibilityComponent2.componentId], backgroundId); + parentEntity(background, bubbleParent); + syncEntity(textEntity, [TextShape2.componentId, Transform2.componentId, VisibilityComponent2.componentId], textId); + parentEntity(textEntity, bubbleParent); + return bubbleParent; +} +function updateSpeechBubble(bubble, text, bubbleType) { + const children = Array.from(getChildren(bubble)); + let backgroundEntity = void 0; + let textEntity = void 0; + for (const ent of children) { + VisibilityComponent2.deleteFrom(ent); + if (TextShape2.has(ent)) { + textEntity = ent; + } + if (MeshRenderer3.has(ent)) { + backgroundEntity = ent; + } + } + if (!backgroundEntity || !textEntity) { + return; + } + let texture = bubble1Texture; + let color = Color42.Gray(); + switch (bubbleType) { + case 1 /* Good */: + texture = bubble3Texture; + color = Color42.Green(); + break; + case 2 /* Bad */: + texture = bubble3Texture; + color = Color42.Red(); + break; + } + Material3.setBasicMaterial(backgroundEntity, { + diffuseColor: color, + texture + }); + TextShape2.getMutable(textEntity).text = text; +} +function HideSpeechBubble(bubble) { + const children = Array.from(getChildren(bubble)); + for (const ent of children) { + VisibilityComponent2.createOrReplace(ent, { visible: false }); + } +} + +// src/modules/customers.ts +var customerRawNoodleMessages = [ + "Me like some \nnoodles! Me like'em RAW!", + "RAW noodles please, \nand hurry!", + "Noodles! A nice \ndry brick of RAW ones!", + "Noodles! \nNO cooking for me", + "HARD RAW NOODLES" +]; +var customerRawSushiMessages = [ + "They say you got \nthe best rolls, \ngimme! NO slicing!", + "One roll please. \nIn ONE piece!", + "A full sushi roll \nI can swallow in one gulp!", + "SUSHI. NO CUTTING." +]; +var customerCookedNoodleMessages = [ + "I want cooked \nnoodles, NOW!", + "I... need... my... \nhot... noodles...", + "Ramen Noodles, they \nbetter be here soon.", + "Decentraland's best \nramen huh? I'll try some", + "A bowl of noodles, \nplease" +]; +var customerSlicedSushiMessages = [ + "sliced sushi! \nonegai shimaaasu!", + "Sushi. Tic Toc.", + "Sushi dammit! \nWhat rya waiting for?", + "Been exploring \nDecentraland all day, \nsushi please" +]; +var customerTrashMessages = [ + "Noodles! Gimme \nthe stinky ones!", + "Noodles, the burrrrrrrnt\n the better!", + "Well-cooked noodles. \nBurnt, as you people say.", + "They say you sell\n garbage for food,\n I'd like some", + "Garbage, don't care\n what kind" +]; +var customerEmptyBeerMessages = [ + "An empty beer glass. \nSo it looks like I was \nwaiting long", + "Just a glass, nothing\n in it. \nFeeling existential.", + "Empty glass. All I\n can afford." +]; +var customerYellowBeerMessages = [ + "I want a cold regular\n beer!", + "I heard you do craft\n beer, gimme a yellow!", + "Beer! A nice cold normal\n one!" +]; +var customerRedBeerMessages = [ + "I want a RED beer!", + "Red beer. Im a \nbit of a hipster!", + "Beer red like the \nblood of my enemies! \nlol" +]; +var customerGreenBeerMessages = [ + "I like weird stuff, \ngreen beer!", + "Green Beer. Dont care \nabout the taste, want \na cool pic for insagram", + "Beer! A nice cold \ngreen one!" +]; +var customerLookingMessage = [ + "Im just here to watch", + "I dont want anything. \nJust here to make you \nfeel uncomfortable.", + "Making a documentary, \nkeep working as if \nIm not here" +]; +var customerCorrectDishMessages = [ + "Excellent!", + "Nicely done!", + "(\u3000\uFF3E\u2207\uFF3E)", + "It was about time...", + "Nice job!", + "Just what I needed!", + "Yummy!", + "YES!!!", + "( \u02D8 \xB3\u02D8)", + "It's fine" +]; +var customerWrongDishMessages = [ + "Customer service \nSUCKS here!", + "Do you even understand \nmy language?", + "What a waste of time!", + "NO! NO! NO!", + "Guess who's a \nramen shop critic?", + "I'll never come \nback here", + "I'll talk SO bad \nabout this place", + "\u0449(\xBA\u0414\xBA\u0449)", + "@#&*#$!", + "\u0B67\u0F3C\u0CA0\u76CA\u0CA0\u0F3D" +]; +var position1 = Vector32.create(13.5, 0.75, 10.5); +var position2 = Vector32.create(13.5, 0.75, 11.5); +var position3 = Vector32.create(13.5, 0.75, 12.5); +var position4 = Vector32.create(13.5, 0.75, 13.5); +var ACCELERATION_RATE = 0.99; +function CreateCustomer(seatNumber) { + const customer = engine.addEntity(); + let position = Vector32.Zero(); + let customerSyncId = 52 /* CUSTOMER1 */; + let progressBarIdA = 40 /* PBAR1_A */; + let progressBarIdB = 41 /* PBAR1_B */; + switch (seatNumber) { + case 1: + position = position1; + customerSyncId = 52 /* CUSTOMER1 */; + progressBarIdA = 40 /* PBAR1_A */; + progressBarIdB = 41 /* PBAR1_B */; + break; + case 2: + position = position2; + customerSyncId = 53 /* CUSTOMER2 */; + progressBarIdA = 42 /* PBAR2_A */; + progressBarIdB = 43 /* PBAR2_B */; + break; + case 3: + position = position3; + customerSyncId = 54 /* CUSTOMER3 */; + progressBarIdA = 44 /* PBAR3_A */; + progressBarIdB = 45 /* PBAR3_B */; + break; + case 4: + position = position4; + customerSyncId = 55 /* CUSTOMER4 */; + progressBarIdA = 46 /* PBAR4_A */; + progressBarIdB = 47 /* PBAR4_B */; + break; + } + Transform2.create(customer, { + position, + scale: Vector32.create(0.75, 0.75, 0.75), + rotation: Quaternion2.fromEulerDegrees(0, 90, 0) + }); + GltfContainer2.create(customer, { + src: "assets/models/walkers/BlockDog.glb" + }); + Animator3.create(customer); + Animator3.playSingleAnimation(customer, "Sitting", false); + syncEntity(customer, [GltfContainer2.componentId, Transform2.componentId, CustomerData.componentId, Animator3.componentId, VisibilityComponent2.componentId], customerSyncId); + const randomTime = Scalar.randomRange(2, 4); + const progressBar = CreateProgressBar(customer, 1.3, 180, false, true, 0.1, progressBarIdA, progressBarIdB); + const speechBubble = createSpeechBubble(customer, seatNumber, "Placeholder", 2.3); + CustomerData.create(customer, { + message: "placeHolder", + speechBubble, + receivedDish: false, + seatNumber, + //plate: CustomerPlate + timeBeforeLeaving: Scalar.randomRange(3, 5), + //timeBeforeEntering: randomTime, + waitingTimer: randomTime, + progressBar + }); + VisibilityComponent2.createOrReplace(customer, { visible: false }); +} +function summonCustomer() { + let takenSeats = []; + const [gameEntities] = engine.getEntitiesWith(GameData); + const gameEntity = gameEntities[0]; + if (!gameEntity || !GameData.has(gameEntity)) { + console.log("NO GAME ENTITY"); + return; + } + const gameData = GameData.getMutable(gameEntity); + let customerCount = 0; + for (const [customer] of engine.getEntitiesWith(CustomerData)) { + if (CustomerData.get(customer).active && CustomerData.get(customer).receivedDish == false) { + customerCount++; + takenSeats.push(CustomerData.get(customer).seatNumber); + } + } + let seatNumber = 0; + if (customerCount > 4) + return; + if (gameData.playerScore >= 150) { + if (!takenSeats.includes(1)) { + seatNumber = 1; + } else if (!takenSeats.includes(2)) { + seatNumber = 2; + } else if (!takenSeats.includes(3)) { + seatNumber = 3; + } else if (!takenSeats.includes(4)) { + seatNumber = 4; + } else { + console.log("FULLY STAFFED TABLES, customer count:", customerCount); + return; + } + } else if (gameData.playerScore >= 50) { + console.log("CUSTOMER COUNT: ", customerCount, "TAKEN SEATS: ", takenSeats); + if (!takenSeats.includes(1)) { + seatNumber = 1; + } else if (!takenSeats.includes(2)) { + seatNumber = 2; + } else { + console.log("FULLY STAFFED TABLES, customer count:", customerCount); + return; + } + } else { + if (customerCount < 1) { + seatNumber = 1; + } else { + console.log("FULLY STAFFED TABLES, customer count:", customerCount); + return; + } + } + console.log("SUMMONING NEW CUSTOMER, SEAT NUMBER: ", seatNumber, "TAKEN SEATS ", takenSeats); + for (const [customer] of engine.getEntitiesWith(CustomerData)) { + console.log("ITERATING OVER CUSTOMERS"); + if (CustomerData.get(customer).seatNumber == seatNumber) { + resetCustomer(customer); + } + } +} +function hideCustomer(customer) { + VisibilityComponent2.createOrReplace(customer, { visible: false }); + const customerData = CustomerData.getMutable(customer); + console.log("HIDING CUSTOMER: ", customerData.seatNumber); + customerData.active = false; + customerData.receivedDish = false; + if (customerData.progressBar) { + HideProgressBar(customerData.progressBar); + } + HideSpeechBubble(customerData.speechBubble); +} +function resetCustomer(customer) { + const customerData = CustomerData.getMutable(customer); + customerData.active = true; + customerData.waitingTimer = 5; + customerData.timeBeforeLeaving = Scalar.randomRange(3, 5); + customerData.receivedDish = false; + VisibilityComponent2.deleteFrom(customer); + ResetProgressBar(customerData.progressBar); + const dish = Math.floor(Scalar.randomRange(0, 9)); + console.log("DISH SELECTED: ", dish); + let messages; + switch (dish) { + case 0: + messages = customerRawNoodleMessages; + break; + case 1: + messages = customerRawSushiMessages; + break; + case 2: + messages = customerCookedNoodleMessages; + break; + case 3: + messages = customerSlicedSushiMessages; + break; + case 4: + messages = customerTrashMessages; + break; + case 5: + messages = customerEmptyBeerMessages; + break; + case 6: + messages = customerYellowBeerMessages; + break; + case 7: + messages = customerRedBeerMessages; + break; + case 8: + messages = customerGreenBeerMessages; + break; + default: + messages = customerLookingMessage; + break; + } + let randomIndex = Math.floor(Scalar.randomRange(0, messages.length)); + updateSpeechBubble(customerData.speechBubble, messages[randomIndex], 0 /* Neutral */); + console.log("NEW TEXT: ", messages[randomIndex]); + customerData.dish = dish; + customerData.message = messages[randomIndex]; +} +function CustomerSystem(dt) { + for (const [entity] of engine.getEntitiesWith(CustomerData)) { + const customerData = CustomerData.getMutable(entity); + if (customerData.active && customerData.progressBar && ProgressBar.has(customerData.progressBar)) { + const progressBar = ProgressBar.getMutable(customerData.progressBar); + if (progressBar.speed > 0 && progressBar.ratio <= 0) { + let wrongDish = customerData.dish + 1; + if (wrongDish == Object.keys(IngredientType).length) { + wrongDish = 0; + } + deliverOrder(wrongDish, entity); + HideProgressBar(customerData.progressBar); + } + } + if (customerData.receivedDish && customerData.waitingTimer > 0) { + customerData.waitingTimer -= dt; + if (customerData.waitingTimer <= 0) { + hideCustomer(entity); + } + } + } + for (const [entity] of engine.getEntitiesWith(GameData)) { + const gameData = GameData.getMutable(entity); + gameData.customerTimer -= dt; + if (gameData.customerTimer <= 0) { + summonCustomer(); + gameData.customerTimer = gameData.customerInterval; + gameData.customerInterval = gameData.customerInterval * ACCELERATION_RATE; + console.log("NEW CUSTOMER INTERVAL", gameData.customerInterval); + } + } +} +function deliverOrder(dishType, customer, dish) { + const customerData = CustomerData.getMutable(customer); + if (!customerData.active || customerData.receivedDish) + return; + if (customerData.progressBar) { + HideProgressBar(customerData.progressBar); + } + const [gameEntities] = engine.getEntitiesWith(GameData); + const gameEntity = gameEntities[0]; + if (!gameEntity || !GameData.has(gameEntity)) + return; + const gameData = GameData.getMutable(gameEntity); + if (customerData.dish == dishType) { + gameData.playerScore += 10; + updateScore(); + const message = customerCorrectDishMessages[Math.floor(Scalar.randomRange(0, customerCorrectDishMessages.length))]; + customerData.message = message; + updateSpeechBubble(customerData.speechBubble, message, 1 /* Good */); + } else { + console.log("WRONG DISH: ", dishType, " EXPECTED: ", customerData.dish); + gameData.playerMisses += 1; + updateMisses(); + const message = customerWrongDishMessages[Math.floor(Scalar.randomRange(0, customerWrongDishMessages.length))]; + customerData.message = message; + updateSpeechBubble(customerData.speechBubble, message, 2 /* Bad */); + playSound("sounds/error.mp3", false, getPlayerPosition()); + if (gameData.playerMisses <= 3) { + timers.setTimeout(() => { + restartGame(); + }, 1e3); + } + } + customerData.receivedDish = true; + if (dish) { + timers.setTimeout(() => { + if (BeerGlass.has(dish)) { + BeerGlass.getMutable(dish).filled = false; + BeerGlass.getMutable(dish).beerType = 0 /* NONE */; + GrabableObjectComponent.getMutable(dish).type = 5 /* BeerGlass */; + Animator3.playSingleAnimation(dish, "Blank"); + playSound("sounds/swallow.mp3", false, getPlayerPosition()); + } else { + engine.removeEntity(dish); + } + }, 3e3); + } +} +function updateScore() { + const [gameEntities] = engine.getEntitiesWith(GameData); + const gameEntity = gameEntities[0]; + if (!gameEntity || !GameData.has(gameEntity)) + return; + const gameData = GameData.getMutable(gameEntity); + const scoreEntity = engine.getEntityOrNullByName("Score"); + if (scoreEntity) { + const scoreText = TextShape2.getMutable(scoreEntity); + scoreText.text = "Score: " + gameData.playerScore.toString(); + } +} +function updateMisses() { + const [gameEntities] = engine.getEntitiesWith(GameData); + const gameEntity = gameEntities[0]; + if (!gameEntity || !GameData.has(gameEntity)) + return; + const gameData = GameData.getMutable(gameEntity); + const missesEntity = engine.getEntityOrNullByName("Misses"); + if (missesEntity) { + const missesText = TextShape2.getMutable(missesEntity); + missesText.text = "Misses: " + gameData.playerMisses.toString(); + } +} +function restartGame() { + const [gameEntities] = engine.getEntitiesWith(GameData); + const gameEntity = gameEntities[0]; + if (!gameEntity || !GameData.has(gameEntity)) + return; + const gameData = GameData.getMutable(gameEntity); + gameData.playerScore = 0; + gameData.playerMisses = 0; + gameData.customerTimer = 2; + gameData.customerInterval = 10; + const customers = engine.getEntitiesWith(CustomerData); + for (const [customer] of customers) { + hideCustomer(customer); + } + playSound("sounds/error.mp3", false, getPlayerPosition()); + updateScore(); + updateMisses(); +} + +// src/modules/pot.ts +var COOKED_AFTER = 5; +var BURNT_AFTER = 10; +function instancePot(pot, id, pbid1, pbid2) { + syncEntity( + pot, + [Cooking.componentId, PotData.componentId], + id + ); + const progressBar = CreateProgressBar(pot, 1, 270, true, true, 1, pbid1, pbid2); + PotData.create(pot, { + progressBar + }); + PointerEvents2.create(pot, { + pointerEvents: [ + { + eventType: PointerEventType.PET_DOWN, + eventInfo: { + hoverText: "Add", + maxDistance: 5, + button: InputAction.IA_PRIMARY + } + } + ] + }); +} +function pickFood(pot) { + const potData = PotData.getMutable(pot); + if (potData && potData.hasIngredient && potData.attachedEntity !== void 0) { + console.log("PICKING UP FROM POT"); + pickUpItem(potData.attachedEntity); + potData.hasIngredient = false; + potData.state = 1 /* Raw */; + if (Cooking.has(pot)) { + Cooking.deleteFrom(pot); + } + HideProgressBar(potData.progressBar); + } +} +function startCooking(pot) { + if (Cooking.has(pot) && Cooking.get(pot).active) + return; + Cooking.createOrReplace(pot); + PotData.getMutable(pot); + ResetProgressBar(PotData.getMutable(pot).progressBar); +} +function cookSystem(dt) { + for (const [entity, _cooking, _potData] of engine.getEntitiesWith(Cooking, PotData)) { + if (_cooking.active && _potData.hasIngredient) { + const cooking = Cooking.getMutable(entity); + cooking.time += dt; + if (cooking.time > COOKED_AFTER && _potData.hasIngredient && _potData.state === 1 /* Raw */) { + console.log("COOKED!"); + const potData = PotData.getMutable(entity); + potData.state = 2 /* Cooked */; + const food = potData.attachedEntity; + if (GltfContainer2.has(food) && GrabableObjectComponent.has(food)) { + GltfContainer2.getMutable(food).src = "assets/models/PlateNoodles.glb"; + GrabableObjectComponent.getMutable(food).type = 2 /* CookedNoodles */; + } + } else if (cooking.time > BURNT_AFTER && _potData.state === 2 /* Cooked */) { + console.log("BURNING!!!"); + if (GltfContainer2.has(entity)) { + GltfContainer2.getMutable(entity).src = "assets/models/CookingPotDirty.glb"; + } + const potData = PotData.getMutable(entity); + potData.state = 3 /* Burned */; + const food = potData.attachedEntity; + if (GltfContainer2.has(food) && GrabableObjectComponent.has(food)) { + GltfContainer2.getMutable(food).src = "assets/models/GarbageFood.glb"; + GrabableObjectComponent.getMutable(food).type = 4 /* Trash */; + } + } + } else if (_cooking.active && !_potData.hasIngredient) { + Cooking.deleteFrom(entity); + HideProgressBar(_potData.progressBar); + } + } +} + +// src/modules/pickAndDrop.ts +function pickingGlassSystem() { + for (const [entity, pickedUp] of engine.getEntitiesWith(PickedUp)) { + const tryToDropCommand = inputSystem.getInputCommand(InputAction.IA_PRIMARY, PointerEventType.PET_DOWN); + if (tryToDropCommand) { + const pickedUpChild = Array.from(getChildren(entity))[0]; + if (pickedUp.avatarId !== currentPlayerId || !pickedUpChild) + continue; + let drop = false; + const hitPosition = tryToDropCommand.hit?.position || getPlayerPosition(); + const hitEntity = tryToDropCommand.hit?.entityId; + const hitParentEntity = getParent(hitEntity); + if (hitParentEntity && TapBase.getOrNull(hitParentEntity)) { + Transform2.getMutable(pickedUpChild).rotation = Quaternion2.Zero(); + Transform2.getMutable(pickedUpChild).position = Vector32.Zero(); + console.log("DROPPED ON TAP"); + parentEntity(pickedUpChild, hitParentEntity); + drop = true; + } else if (hitParentEntity && CuttingBoard.has(hitParentEntity)) { + console.log("DROPPED ON CUTTING BOARD"); + const board = CuttingBoard.getMutable(hitParentEntity); + if (!board || !board.hasRoll || !board.modelEntity) { + parentEntity(pickedUpChild, hitParentEntity); + drop = true; + Transform2.getMutable(pickedUpChild).rotation = Quaternion2.Zero(); + Transform2.getMutable(pickedUpChild).position = Vector32.Zero(); + board.hasRoll = true; + board.rollChild = pickedUpChild; + board.cutting = false; + board.cuts = 0; + Animator3.stopAllAnimations(hitEntity, true); + switchToCutMode(board.modelEntity); + } + } else if (hitEntity && PotData.has(hitEntity)) { + console.log("DROPPED ON POT"); + const pot = PotData.getMutable(hitEntity); + if (pot && !pot.hasIngredient) { + parentEntity(pickedUpChild, hitEntity); + pot.hasIngredient = true; + pot.attachedEntity = pickedUpChild; + pot.state = 1 /* Raw */; + drop = true; + const grabbable = GrabableObjectComponent.get(pickedUpChild); + if (grabbable.type !== 0 /* Noodles */) { + ruinFood(pickedUpChild); + } + } + } else { + const diff = Vector32.subtract(Vector32.Up(), tryToDropCommand.hit?.normalHit || Vector32.Zero()); + console.log("DROPPED ON TABLE ", Vector32.length(diff), tryToDropCommand.hit?.normalHit); + if (Vector32.length(diff) < 0.05) { + removeParent(pickedUpChild); + Transform2.createOrReplace(pickedUpChild, { + position: hitPosition, + parent: void 0 + }); + drop = true; + checkNearCustomer(pickedUpChild); + } + } + if (drop) { + PickedUp.deleteFrom(entity); + playSound("sounds/putDown.mp3", false, hitPosition); + } + } + return; + } + for (const [entity, grabbable] of engine.getEntitiesWith(GrabableObjectComponent, Transform2)) { + if (inputSystem.isTriggered(InputAction.IA_PRIMARY, PointerEventType.PET_DOWN, entity)) { + if (grabbable.beingProcessed) { + return; + } + pickUpItem(entity); + } + } +} +function pickUpItem(entity) { + const oldParent = getParent(entity); + const parentToGrabbed = engine.addEntity(); + PickedUp.create(parentToGrabbed, { + avatarId: currentPlayerId + }); + AvatarAttach2.create(parentToGrabbed, { + avatarId: currentPlayerId, + anchorPointId: AvatarAnchorPointType.AAPT_RIGHT_HAND + }); + Transform2.createOrReplace(entity, { + position: Vector32.create(0, 0.225, 0), + rotation: Quaternion2.fromEulerDegrees(180, -90, -60) + }); + syncEntity(parentToGrabbed, [AvatarAttach2.componentId, Transform2.componentId, PickedUp.componentId, GrabableObjectComponent.componentId]); + parentEntity(entity, parentToGrabbed); + playSound("sounds/pickUp.mp3", false, getPlayerPosition()); + if (oldParent && PotData.has(oldParent)) { + const pot = PotData.getMutable(oldParent); + if (pot && pot.attachedEntity === entity) { + pot.hasIngredient = false; + HideProgressBar(pot.progressBar); + pot.state = 0 /* Empty */; + pickFood(oldParent); + } + } + if (oldParent && CuttingBoard.has(oldParent)) { + const board = CuttingBoard.getMutable(oldParent); + if (board && board.rollChild === entity) { + board.hasRoll = false; + board.cutting = false; + board.cuts = 0; + switchToEmpty(board.modelEntity); + } + } +} +function checkNearCustomer(entity) { + const itemTransform = Transform2.get(entity); + let closestCustomer = null; + let closestDistance = 1.5; + for (const [entity2, customer, customerTransform] of engine.getEntitiesWith(CustomerData, Transform2)) { + const diff = Vector32.length(Vector32.subtract(itemTransform.position, customerTransform.position)); + if (diff < closestDistance) { + closestCustomer = entity2; + closestDistance = diff; + } + } + if (closestCustomer) { + const itemData = GrabableObjectComponent.get(entity); + deliverOrder(itemData.type, closestCustomer, entity); + } else { + console.log("NO CUSTOMER NEAR"); + } +} + +// src/modules/factory.ts +function instanceBeer(entity, id) { + BeerGlass.create(entity); + GrabableObjectComponent.create(entity, { type: 5 /* BeerGlass */ }); + syncEntity( + entity, + [Animator3.componentId, AudioSource2.componentId, Transform2.componentId, BeerGlass.componentId, GrabableObjectComponent.componentId], + id + ); +} +function createIngredient(ingredient, position, fall) { + const entity = engine.addEntity(); + let model = ""; + switch (ingredient) { + case 0 /* Noodles */: + model = "assets/models/NoodlesRaw.glb"; + break; + case 1 /* SushiRoll */: + model = "assets/models/SushiRoll.glb"; + break; + case 2 /* CookedNoodles */: + model = "assets/models/PlateNoodles.glb"; + break; + case 3 /* SlicedSushi */: + model = "assets/models/PlateSushi.glb"; + break; + case 4 /* Trash */: + model = "assets/models/GarbageFood.glb"; + break; + } + GltfContainer2.create(entity, { + src: model, + visibleMeshesCollisionMask: ColliderLayer.CL_POINTER, + invisibleMeshesCollisionMask: void 0 + }); + Transform2.create(entity, { position }); + GrabableObjectComponent.create(entity, { type: ingredient }); + PointerEvents2.create(entity, { + pointerEvents: [ + { + eventType: PointerEventType.PET_DOWN, + eventInfo: { + hoverText: "Pick up", + maxDistance: 5, + button: InputAction.IA_PRIMARY + } + } + ] + }); + if (fall) { + Tween3.create(entity, { + mode: Tween3.Mode.Move({ + start: position, + end: Vector32.add(position, Vector32.create(0, -0.7, 0)) + }), + duration: 500, + easingFunction: EasingFunction.EF_LINEAR + }); + } + syncEntity( + entity, + [AudioSource2.componentId, Transform2.componentId, GrabableObjectComponent.componentId, Tween3.componentId, GltfContainer2.componentId] + ); + return ingredient; +} +function createTap(tapBeerType, dispenseEntity, id) { + const tapEntity = engine.addEntity(); + const tapData = getTapData(tapBeerType); + TapComponent.create(tapEntity, { + beerType: tapBeerType + }); + GltfContainer2.create(tapEntity, { + src: tapData.model + }); + Transform2.create(tapEntity, { + //parent: dispenseEntity + }); + parentEntity(tapEntity, dispenseEntity); + Animator3.create(tapEntity, { + states: [ + { + clip: "Blank", + playing: true, + loop: false + }, + { + clip: "Pour", + loop: false + } + ] + }); + PointerEvents2.create(tapEntity, { + pointerEvents: [ + { + eventType: PointerEventType.PET_DOWN, + eventInfo: { + hoverText: "Pour", + maxDistance: 5, + button: InputAction.IA_PRIMARY + } + } + ] + }); + syncEntity(tapEntity, [Animator3.componentId, AudioSource2.componentId], id); + const tapColliderPosition = Vector32.add(tapData.position, Vector32.create(0, 0.05, 0)); + const colliderParentEntity = engine.addEntity(); + Transform2.create(colliderParentEntity, { + //parent: tapEntity, + position: tapColliderPosition + }); + TapBase.create(colliderParentEntity, { + beerType: tapBeerType + }); + syncEntity(colliderParentEntity, [], id + 100); + parentEntity(colliderParentEntity, tapEntity); + const colliderEntity = engine.addEntity(); + Transform2.create(colliderEntity, { + //parent: colliderParentEntity, + scale: Vector32.scale(Vector32.One(), 0.33), + rotation: Quaternion2.fromEulerDegrees(90, 0, 0) + }); + syncEntity(colliderEntity, [], id + 200); + parentEntity(colliderEntity, colliderParentEntity); + MeshCollider3.setPlane(colliderEntity); + PointerEvents2.create(colliderEntity, { + pointerEvents: [ + { + eventType: PointerEventType.PET_DOWN, + eventInfo: { + hoverText: "Place mug", + button: InputAction.IA_PRIMARY + } + } + ] + }); +} +function createCuttingBoard(position, id) { + const CutterParent = engine.addEntity(); + Transform2.create(CutterParent, { + position, + rotation: Quaternion2.fromEulerDegrees(0, 0, 0) + }); + syncEntity(CutterParent, [], id + 100); + const boardModel = engine.addEntity(); + CuttingBoard.create(CutterParent, { + modelEntity: boardModel + }); + GltfContainer2.create(boardModel, { + src: "assets/models/Cutter.gltf", + visibleMeshesCollisionMask: ColliderLayer.CL_POINTER + }); + Transform2.create(boardModel, { + position: Vector32.create(0, -0.1, 0), + scale: Vector32.create(0.01, 0.01, 0.01), + rotation: Quaternion2.fromEulerDegrees(0, 180, 0) + }); + Animator3.create(boardModel, { + states: [ + { + clip: "State0", + playing: true, + loop: false + }, + { + clip: "State1", + playing: false, + loop: false + }, + { + clip: "State2", + playing: false, + loop: false + }, + { + clip: "State3", + playing: false, + loop: false + }, + { + clip: "State4", + playing: false, + loop: false + }, + { + clip: "State5", + playing: false, + loop: false + } + ] + }); + pointerEventsSystem.onPointerDown( + { + entity: boardModel, + opts: { button: InputAction.IA_PRIMARY, hoverText: "Put", maxDistance: 5 } + }, + function() { + cutSushi(CutterParent, boardModel); + console.log("clicked entity"); + } + ); + syncEntity(boardModel, [Animator3.componentId, AudioSource2.componentId, CuttingBoard.componentId, PointerEvents2.componentId], id); + parentEntity(boardModel, CutterParent); +} + +// src/modules/tap.ts +function getBeerBehindTap(beerType) { + for (const [glassEntity] of engine.getEntitiesWith(BeerGlass)) { + const glassParent = getParent(glassEntity); + if (glassParent && TapBase.getOrNull(glassParent)?.beerType === beerType) { + return glassEntity; + } + } +} +function tapPumpSystem(dt) { + for (const [entity, tapReadonly] of engine.getEntitiesWith(TapComponent)) { + if (tapReadonly.pouring) { + if (Scalar.withinEpsilon(tapReadonly.pouringTime, 0)) { + Animator3.playSingleAnimation(entity, `Pour`); + playSound("sounds/beerPump.mp3", false, getPlayerPosition()); + const glassEntity = getBeerBehindTap(tapReadonly.beerType); + if (glassEntity) + Animator3.playSingleAnimation(glassEntity, `Pour${getTapData(tapReadonly.beerType).name}`); + } + const tap = TapComponent.getMutable(entity); + tap.pouringTime += dt; + if (tap.pouringTime >= 2.5) { + tap.pouring = false; + tap.pouringTime = 0; + const glassEntity = getBeerBehindTap(tap.beerType); + if (glassEntity) { + const glass = BeerGlass.getMutable(glassEntity); + glass.beerType = tap.beerType; + glass.filled = true; + const grabbable = GrabableObjectComponent.getMutable(glassEntity); + grabbable.beingProcessed = false; + } + } + } else if (inputSystem.isTriggered(InputAction.IA_PRIMARY, PointerEventType.PET_DOWN, entity)) { + const glassEntity = getBeerBehindTap(tapReadonly.beerType); + if (!glassEntity) { + return; + } + const glass = BeerGlass.getMutable(glassEntity); + if (glass.filled) { + return; + } + const tap = TapComponent.getMutable(entity); + tap.pouring = true; + tap.pouringTime = 0; + glass.beerType = tap.beerType; + const grabbable = GrabableObjectComponent.getMutable(glassEntity); + grabbable.beingProcessed = true; + switch (tap.beerType) { + case 2 /* YELLOW */: + grabbable.type = 6 /* YellowBeer */; + break; + case 1 /* RED */: + grabbable.type = 7 /* RedBeer */; + break; + case 3 /* GREEN */: + grabbable.type = 8 /* GreenBeer */; + break; + } + grabbable.type; + } + } +} + +// src/ui.tsx +var import_RestrictedActions = require("~system/RestrictedActions"); + +// node_modules/@dcl/react-ecs/dist/react-ecs.js +var import_react = __toESM(require_react()); +var ReactEcs; +(function(ReactEcs2) { + ReactEcs2.createElement = import_react.default.createElement; +})(ReactEcs || (ReactEcs = {})); + +// node_modules/@dcl/react-ecs/dist/reconciler/index.js +var import_react_reconciler = __toESM(require_react_reconciler()); + +// node_modules/@dcl/react-ecs/dist/components/Label/utils.js +var parseFont = { + "sans-serif": 0, + serif: 1, + monospace: 2 + /* Font.F_MONOSPACE */ +}; +function getFont(font) { + if (!font) + return void 0; + return { font: parseFont[font] }; +} +var parseTextAlign = { + "top-left": 0, + "top-center": 1, + "top-right": 2, + "middle-left": 3, + "middle-center": 4, + "middle-right": 5, + "bottom-left": 6, + "bottom-center": 7, + "bottom-right": 8 + /* TextAlignMode.TAM_BOTTOM_RIGHT */ +}; +function getTextAlign(textAlign) { + if (!textAlign) + return void 0; + return { textAlign: parseTextAlign[textAlign] }; +} + +// node_modules/@dcl/react-ecs/dist/components/uiBackground/utils.js +var parseTextureMode = { + "nine-slices": 0, + center: 1, + stretch: 2 + /* BackgroundTextureMode.STRETCH */ +}; +function getTextureMode(mode) { + const value = mode ? parseTextureMode[mode] : 1; + return { textureMode: value }; +} +function getTexture(props) { + if (props.texture) { + return { + tex: { + $case: "texture", + texture: parseTexture(props.texture) + } + }; + } + if (props.avatarTexture) { + return { + tex: { + $case: "avatarTexture", + avatarTexture: parseTexture(props.avatarTexture) + } + }; + } + return void 0; +} +function parseTexture(texture) { + return { + ...texture, + wrapMode: texture.wrapMode ? parseWrap[texture.wrapMode] : void 0, + filterMode: texture.filterMode ? parseFilter[texture.filterMode] : void 0 + }; +} +var parseWrap = { + repeat: 0, + clamp: 1, + mirror: 2 + /* TextureWrapMode.TWM_MIRROR */ +}; +var parseFilter = { + point: 0, + "bi-linear": 1, + "tri-linear": 2 + /* TextureFilterMode.TFM_TRILINEAR */ +}; + +// node_modules/@dcl/react-ecs/dist/components/uiBackground/index.js +function parseUiBackground(props) { + if (!props || !Object.keys(props).length) + return void 0; + const texture = getTexture(props); + return { + ...props, + ...getTextureMode(props.textureMode), + uvs: props.uvs ?? [], + texture + }; +} + +// node_modules/@dcl/react-ecs/dist/components/uiTransform/utils.js +function capitalize(value) { + return `${value[0].toUpperCase()}${value.slice(1, value.length)}`; +} +function isPercent(val) { + return typeof val === "string" && val.endsWith("%"); +} +function isPoint(val) { + return typeof val === "string" && val.endsWith("px"); +} +function parsePositionUnit(val) { + function getValue(key, value) { + return Number(value.slice(0, value.indexOf(key))); + } + if (val === void 0 || val === null) { + return [ + void 0, + 0 + /* YGUnit.YGU_UNDEFINED */ + ]; + } + if (val === "auto") { + return [ + 0, + 3 + /* YGUnit.YGU_AUTO */ + ]; + } + if (typeof val === "number" || typeof val === "string" && !isNaN(Number(val))) { + return [ + Number(val), + 1 + /* YGUnit.YGU_POINT */ + ]; + } + if (isPercent(val)) { + return [ + getValue("%", val), + 2 + /* YGUnit.YGU_PERCENT */ + ]; + } + if (isPoint(val)) { + return [ + getValue("px", val), + 1 + /* YGUnit.YGU_POINT */ + ]; + } + return [ + void 0, + 0 + /* YGUnit.YGU_UNDEFINED */ + ]; +} +function parsePosition(position = {}, prop) { + if (typeof position === "object") { + const obj = {}; + for (const key in position) { + const typedKey = key; + const propKey = `${prop}${capitalize(typedKey)}`; + const propKeyUnit = `${prop}${capitalize(typedKey)}Unit`; + const [value, unit] = parsePositionUnit(position[typedKey]); + if (value === void 0) + continue; + obj[propKeyUnit] = unit; + obj[propKey] = value; + } + return obj; + } + if (typeof position === "number") { + return parsePosition({ top: position, left: position, right: position, bottom: position }, prop); + } + const values = position.split(" ").filter((a) => a !== ""); + if (values.length === 1) { + const [value] = values; + return parsePosition({ top: value, left: value, right: value, bottom: value }, prop); + } + if (values.length === 2) { + const [topBottom, rigthLeft] = values; + return parsePosition({ top: topBottom, left: rigthLeft, right: rigthLeft, bottom: topBottom }, prop); + } + if (values.length === 3) { + const [top2, rigthLeft, bottom2] = values; + return parsePosition({ top: top2, left: rigthLeft, right: rigthLeft, bottom: bottom2 }, prop); + } + const [top, right, bottom, left] = values; + return parsePosition({ top, right, bottom, left }, prop); +} +function parseSize(val, key) { + const unitKey = `${key}Unit`; + const [value, unit] = parsePositionUnit(val); + if (value === void 0) + return {}; + return { + [key]: value, + [unitKey]: unit + }; +} +function getDisplay(display) { + const value = display ? parseDisplay[display] : 0; + return { display: value }; +} +var parseDisplay = { + flex: 0, + none: 1 + /* YGDisplay.YGD_NONE */ +}; +function getJustify(justify) { + const value = justify ? parseJustify[justify] : 0; + return { justifyContent: value }; +} +var parseJustify = { + center: 1, + "flex-end": 2, + "flex-start": 0, + "space-around": 4, + "space-between": 3, + "space-evenly": 5 + /* YGJustify.YGJ_SPACE_EVENLY */ +}; +function getAlign(prop, align) { + const value = parseAligns[align]; + return { [prop]: value }; +} +var parseAligns = { + auto: 0, + baseline: 5, + center: 2, + "flex-end": 3, + "flex-start": 1, + stretch: 4, + "space-between": 6, + "space-around": 7 + /* YGAlign.YGA_SPACE_AROUND */ +}; +function getFlexDirection(flexDirection) { + const value = flexDirection ? parseFlexDirection[flexDirection] : 0; + return { flexDirection: value }; +} +var parseFlexDirection = { + row: 0, + column: 1, + "row-reverse": 3, + "column-reverse": 2 + /* YGFlexDirection.YGFD_COLUMN_REVERSE */ +}; +function getFlexWrap(flexWrap) { + const value = parseFlexWrap[flexWrap]; + return { flexWrap: value }; +} +var parseFlexWrap = { + wrap: 1, + nowrap: 0, + "wrap-reverse": 2 + /* YGWrap.YGW_WRAP_REVERSE */ +}; +function getOverflow(overflow) { + const value = overflow ? parseOverflow[overflow] : 0; + return { overflow: value }; +} +var parseOverflow = { + visible: 0, + scroll: 2, + hidden: 1 + /* YGOverflow.YGO_HIDDEN */ +}; +function getPositionType(position) { + const value = position ? parsePositionType[position] : 0; + return { positionType: value }; +} +var parsePositionType = { + relative: 0, + absolute: 1 + /* YGPositionType.YGPT_ABSOLUTE */ +}; +function getPointerFilter(pointerFilter) { + const value = pointerFilter ? parsePointerFilter[pointerFilter] : 0; + return { pointerFilter: value }; +} +var parsePointerFilter = { + none: 0, + block: 1 + /* PointerFilterMode.PFM_BLOCK */ +}; + +// node_modules/@dcl/react-ecs/dist/components/uiTransform/index.js +var CANVAS_ROOT_ENTITY = 0; +var defaultUiTransform = { + overflow: 0, + display: 0, + justifyContent: 0, + alignSelf: 0, + flexDirection: 0, + positionType: 0, + parent: CANVAS_ROOT_ENTITY, + rightOf: 0, + flexBasis: 0, + width: 0, + height: 0, + minWidth: 0, + minHeight: 0, + maxWidth: 0, + maxHeight: 0, + flexGrow: 0, + marginBottom: 0, + marginBottomUnit: 0, + marginLeft: 0, + marginLeftUnit: 0, + marginRight: 0, + marginRightUnit: 0, + marginTop: 0, + marginTopUnit: 0, + maxHeightUnit: 0, + maxWidthUnit: 0, + minHeightUnit: 0, + minWidthUnit: 0, + paddingBottom: 0, + paddingBottomUnit: 0, + paddingLeft: 0, + paddingLeftUnit: 0, + paddingTopUnit: 0, + paddingRight: 0, + paddingRightUnit: 0, + paddingTop: 0, + positionBottom: 0, + positionBottomUnit: 0, + positionLeft: 0, + positionLeftUnit: 0, + positionRight: 0, + positionRightUnit: 0, + positionTop: 0, + positionTopUnit: 0, + flexBasisUnit: 0, + widthUnit: 0, + heightUnit: 0, + pointerFilter: 0 + /* PointerFilterMode.PFM_NONE */ +}; +function parseUiTransform(props = {}) { + const { height, minHeight, maxHeight, width, minWidth, maxWidth, alignItems, alignContent, flexWrap, ...otherProps } = props; + return { + ...defaultUiTransform, + ...otherProps, + ...parsePosition(props.position, "position"), + ...parsePosition(props.margin, "margin"), + ...parsePosition(props.padding, "padding"), + ...parseSize(props.height, "height"), + ...parseSize(props.minHeight, "minHeight"), + ...parseSize(props.maxHeight, "maxHeight"), + ...parseSize(props.width, "width"), + ...parseSize(props.minWidth, "minWidth"), + ...parseSize(props.maxWidth, "maxWidth"), + ...getDisplay(props.display), + ...getAlign("alignSelf", props.alignSelf ?? "auto"), + ...getJustify(props.justifyContent), + ...getFlexDirection(props.flexDirection), + ...getOverflow(props.overflow), + ...getPointerFilter(props.pointerFilter), + ...getPositionType(props.positionType), + // Optional values + ...alignContent && getAlign("alignContent", alignContent), + ...alignItems && getAlign("alignItems", alignItems), + ...flexWrap && getFlexWrap(flexWrap) + }; +} + +// node_modules/@dcl/react-ecs/dist/components/utils.js +function parseProps(props) { + const { uiTransform, uiBackground, ...otherProps } = props; + const uiTransformProps = parseUiTransform(uiTransform); + const uiBackgroundProps = uiBackground ? { uiBackground: parseUiBackground(uiBackground) } : void 0; + return { + ...otherProps, + uiTransform: uiTransformProps, + ...uiBackgroundProps + }; +} + +// node_modules/@dcl/react-ecs/dist/components/listeners/types.js +var listeners = { + onMouseDown: void 0, + onMouseUp: void 0 +}; +var listenersKey = Object.keys(listeners); +var isListener = (key) => listenersKey.includes(key); + +// node_modules/@dcl/react-ecs/dist/components/Label/index.js +function Label(props) { + const { uiTransform, uiBackground, onMouseDown, onMouseUp, ...uiTextProps } = props; + const commonProps = parseProps({ + uiTransform, + uiBackground, + onMouseDown, + onMouseUp + }); + const { font, textAlign, ...textProps } = uiTextProps; + const uiText = { + ...textProps, + ...getFont(font), + ...getTextAlign(textAlign) + }; + return ReactEcs.createElement("entity", { ...commonProps, uiText }); +} + +// node_modules/@dcl/react-ecs/dist/components/index.js +function UiEntity(props) { + const uiText = props.uiText && { + uiText: { + ...props.uiText, + ...getFont(props.uiText.font), + ...getTextAlign(props.uiText.textAlign) + } + }; + return ReactEcs.createElement("entity", { ...parseProps(props), ...uiText }); +} + +// node_modules/@dcl/react-ecs/dist/reconciler/utils.js +function propsChanged(component, prevProps, nextProps) { + if (prevProps && !nextProps) { + return { type: "delete", component }; + } + if (!nextProps) { + return; + } + if (!prevProps && nextProps) { + return { type: "add", props: nextProps, component }; + } + if (isListener(component)) { + if (!isEqual(prevProps, nextProps)) { + return { type: "put", component, props: nextProps }; + } + } + const changes = {}; + for (const k in prevProps) { + const propKey = k; + if (!isEqual(prevProps[propKey], nextProps[propKey])) { + changes[propKey] = nextProps[propKey]; + } + } + if (!Object.keys(changes).length) { + return; + } + return { type: "put", props: changes, component }; +} +var entityComponent = { + uiText: void 0, + uiBackground: void 0, + uiTransform: void 0, + onMouseDown: void 0, + onMouseUp: void 0, + uiInput: void 0, + uiDropdown: void 0 +}; +var componentKeys = Object.keys(entityComponent); +function isEqual(val1, val2) { + if (!val1 && !val2) { + return true; + } + if (!val1 || !val2) { + return val1 === val2; + } + if (val1 === val2) { + return true; + } + if (typeof val1 !== typeof val2) { + return false; + } + if (typeof val1 !== "object") { + return val1 === val2; + } + if (Array.isArray(val1) && Array.isArray(val2)) { + if (val1.length !== val2.length) { + return false; + } + } + if (Object.keys(val1).length !== Object.keys(val2).length) { + return false; + } + if (JSON.stringify(val1) === JSON.stringify(val2)) { + return true; + } + for (const key in val1) { + if (!isEqual(val1[key], val2[key])) { + return false; + } + } + return true; +} +var isNotUndefined = (val) => { + return !!val; +}; +var noopConfig = { + supportsMutation: true, + supportsPersistence: false, + noTimeout: -1, + isPrimaryRenderer: true, + supportsHydration: false, + /* istanbul ignore next */ + insertInContainerBefore(_container, _child, _beforeChild) { + }, + detachDeletedInstance(_node) { + }, + /* istanbul ignore next */ + hideInstance(_instance) { + }, + /* istanbul ignore next */ + hideTextInstance(_textInstance) { + }, + /* istanbul ignore next */ + unhideInstance(_instance, _props) { + }, + /* istanbul ignore next */ + unhideTextInstance(_textInstance, _text) { + }, + /* istanbul ignore next */ + clearContainer(_container) { + }, + /* istanbul ignore next */ + getCurrentEventPriority() { + return 0; + }, + /* istanbul ignore next */ + getInstanceFromNode(_node) { + return null; + }, + /* istanbul ignore next */ + beforeActiveInstanceBlur() { + }, + /* istanbul ignore next */ + afterActiveInstanceBlur() { + }, + /* istanbul ignore next */ + prepareScopeUpdate() { + }, + /* istanbul ignore next */ + getInstanceFromScope() { + return null; + }, + /* istanbul ignore next */ + commitMount(_instance, _type, _props, _internalInstanceHandle) { + }, + /* istanbul ignore next */ + resetTextContent(_instance) { + }, + /* istanbul ignore next */ + commitTextUpdate(_textInstance, _oldText, _newText) { + }, + prepareForCommit(_containerInfo) { + return null; + }, + resetAfterCommit(_containerInfo) { + }, + /* istanbul ignore next */ + preparePortalMount(_containerInfo) { + }, + /* istanbul ignore next */ + createTextInstance(_text, _rootContainer, _hostContext, _internalHandle) { + return {}; + }, + /* istanbul ignore next */ + scheduleTimeout(_fn, _delay) { + }, + /* istanbul ignore next */ + cancelTimeout(_id) { + }, + shouldSetTextContent(_type, _props) { + return false; + }, + getRootHostContext(_rootContainer) { + return null; + }, + getChildHostContext(_parentHostContext, _type, _rootContainer) { + return null; + }, + /* istanbul ignore next */ + getPublicInstance(instance) { + return instance; + }, + finalizeInitialChildren(_instance, _type, _props, _rootContainer, _hostContext) { + return false; + } +}; + +// node_modules/@dcl/react-ecs/dist/reconciler/index.js +function getPointerEnum(pointerKey) { + const pointers = { + onMouseDown: 1, + onMouseUp: 0 + /* PointerEventType.PET_UP */ + }; + return pointers[pointerKey]; +} +function createReconciler(engine2, pointerEvents) { + const entities = /* @__PURE__ */ new Set(); + const changeEvents = /* @__PURE__ */ new Map(); + const clickEvents = /* @__PURE__ */ new Map(); + const UiTransform3 = UiTransform(engine2); + const UiText3 = UiText(engine2); + const UiBackground3 = UiBackground(engine2); + const UiInput2 = UiInput(engine2); + const UiInputResult2 = UiInputResult(engine2); + const UiDropdown2 = UiDropdown(engine2); + const UiDropdownResult2 = UiDropdownResult(engine2); + const getComponentId = { + uiTransform: UiTransform3.componentId, + uiText: UiText3.componentId, + uiBackground: UiBackground3.componentId, + uiInput: UiInput2.componentId, + uiDropdown: UiDropdown2.componentId + }; + function pointerEventCallback(entity, pointerEvent) { + const callback = clickEvents.get(entity)?.get(pointerEvent); + if (callback) + callback(); + return; + } + function updateTree(instance, props) { + upsertComponent(instance, props, "uiTransform"); + } + function upsertListener(instance, update) { + if (update.type === "delete" || !update.props) { + clickEvents.get(instance.entity)?.delete(getPointerEnum(update.component)); + if (update.component === "onMouseDown") { + pointerEvents.removeOnPointerDown(instance.entity); + } else if (update.component === "onMouseUp") { + pointerEvents.removeOnPointerUp(instance.entity); + } + return; + } + if (update.props) { + const pointerEvent = getPointerEnum(update.component); + const entityEvent = clickEvents.get(instance.entity) || clickEvents.set(instance.entity, /* @__PURE__ */ new Map()).get(instance.entity); + const alreadyHasPointerEvent = entityEvent.get(pointerEvent); + entityEvent.set(pointerEvent, update.props); + if (alreadyHasPointerEvent) + return; + const pointerEventSystem = update.component === "onMouseDown" ? pointerEvents.onPointerDown : pointerEvents.onPointerUp; + pointerEventSystem(instance.entity, () => pointerEventCallback(instance.entity, pointerEvent), { + button: 0, + // We add this showFeedBack so the pointerEventSystem creates a PointerEvent component with our entity + // This is needed for the renderer to know which entities are clickeables + showFeedback: true + }); + } + } + function removeComponent(instance, component) { + const componentId = getComponentId[component]; + const Component = engine2.getComponent(componentId); + Component.deleteFrom(instance.entity); + } + function upsertComponent(instance, props = {}, componentName) { + const componentId = getComponentId[componentName]; + const onChangeExists = "onChange" in props; + const onSubmitExists = "onSubmit" in props; + const entityState = changeEvents.get(instance.entity)?.get(componentId); + const onChange = onChangeExists ? props["onChange"] : entityState?.onChangeCallback; + const onSubmit = onSubmitExists ? props["onSubmit"] : entityState?.onSubmitCallback; + if (onChangeExists || onSubmitExists) { + updateOnChange(instance.entity, componentId, { + onChangeCallback: onChange, + onSubmitCallback: onSubmit + }); + delete props.onChange; + delete props.onSubmit; + } + if (!Object.keys(props).length) { + return; + } + const ComponentDef = engine2.getComponent(componentId); + const component = ComponentDef.getMutableOrNull(instance.entity) || ComponentDef.create(instance.entity); + for (const key in props) { + const keyProp = key; + component[keyProp] = props[keyProp]; + } + } + function removeChildEntity(instance) { + changeEvents.delete(instance.entity); + engine2.removeEntity(instance.entity); + for (const child of instance._child) { + removeChildEntity(child); + } + } + function appendChild(parent, child) { + if (!child || !Object.keys(parent).length) + return; + const isReorder = parent._child.find((c) => c.entity === child.entity); + if (isReorder) { + const rightOfChild = parent._child.find((c) => c.rightOf === child.entity); + if (rightOfChild) { + rightOfChild.rightOf = child.rightOf; + parent._child = parent._child.filter((c) => c.entity !== child.entity); + parent._child.push(child); + updateTree(rightOfChild, { rightOf: rightOfChild.rightOf }); + } + child.rightOf = parent._child[parent._child.length - 2]?.entity; + } else { + child.rightOf = parent._child[parent._child.length - 1]?.entity; + parent._child.push(child); + } + child.parent = parent.entity; + updateTree(child, { rightOf: child.rightOf, parent: parent.entity }); + } + function removeChild(parentInstance, child) { + const childIndex = parentInstance._child.findIndex((c) => c.entity === child.entity); + const childToModify = parentInstance._child[childIndex + 1]; + if (childToModify) { + childToModify.rightOf = child.rightOf; + updateTree(childToModify, { rightOf: child.rightOf }); + } + parentInstance._child.splice(childIndex, 1); + removeChildEntity(child); + } + function updateOnChange(entity, componentId, state) { + const event = changeEvents.get(entity) || changeEvents.set(entity, /* @__PURE__ */ new Map()).get(entity); + const oldState = event.get(componentId); + const onChangeCallback = state?.onChangeCallback; + const onSubmitCallback = state?.onSubmitCallback; + const value = state?.value ?? oldState?.value; + const isSubmit = state?.isSubmit ?? oldState?.isSubmit; + event.set(componentId, { onChangeCallback, onSubmitCallback, value, isSubmit }); + } + const hostConfig = { + ...noopConfig, + createInstance(type, props) { + const entity = engine2.addEntity(); + entities.add(entity); + const instance = { + entity, + _child: [], + parent: CANVAS_ROOT_ENTITY, + rightOf: void 0 + }; + for (const key in props) { + const keyTyped = key; + if (keyTyped === "children" || keyTyped === "key") { + continue; + } + if (isListener(keyTyped)) { + upsertListener(instance, { + type: "add", + props: props[keyTyped], + component: keyTyped + }); + } else { + upsertComponent(instance, props[keyTyped], keyTyped); + } + } + return instance; + }, + appendChild, + appendChildToContainer: appendChild, + appendInitialChild: appendChild, + removeChild, + prepareUpdate(_instance, _type, oldProps, newProps) { + return componentKeys.map((component) => propsChanged(component, oldProps[component], newProps[component])).filter(isNotUndefined); + }, + commitUpdate(instance, updatePayload, _type, _prevProps, _nextProps, _internalHandle) { + for (const update of updatePayload) { + if (isListener(update.component)) { + upsertListener(instance, update); + continue; + } + if (update.type === "delete") { + removeComponent(instance, update.component); + } else if (update.props) { + upsertComponent(instance, update.props, update.component); + } + } + }, + insertBefore(parentInstance, child, beforeChild) { + const beforeChildIndex = parentInstance._child.findIndex((c) => c.entity === beforeChild.entity); + parentInstance._child = [ + ...parentInstance._child.slice(0, beforeChildIndex), + child, + ...parentInstance._child.slice(beforeChildIndex) + ]; + child.rightOf = beforeChild.rightOf; + beforeChild.rightOf = child.entity; + child.parent = parentInstance.entity; + updateTree(child, { rightOf: child.rightOf, parent: child.parent }); + updateTree(beforeChild, { rightOf: beforeChild.rightOf }); + }, + removeChildFromContainer(parenInstance, child) { + removeChildEntity(child); + } + }; + const reconciler = (0, import_react_reconciler.default)(hostConfig); + const root = reconciler.createContainer( + {}, + 0, + null, + false, + null, + "", + /* istanbul ignore next */ + function() { + }, + null + ); + function handleOnChange(componentId, resultComponent) { + for (const [entity, Result] of engine2.getEntitiesWith(resultComponent)) { + const entityState = changeEvents.get(entity)?.get(componentId); + const isSubmit = !!Result.isSubmit; + if (entityState?.onChangeCallback && Result.value !== entityState.value) { + entityState.onChangeCallback(Result.value); + } + if (entityState?.onSubmitCallback && isSubmit && !entityState.isSubmit) { + entityState.onSubmitCallback(Result.value); + } + updateOnChange(entity, componentId, { + onChangeCallback: entityState?.onChangeCallback, + onSubmitCallback: entityState?.onSubmitCallback, + value: Result.value, + isSubmit + }); + } + } + return { + update: function(component) { + if (changeEvents.size) { + handleOnChange(UiInput2.componentId, UiInputResult2); + handleOnChange(UiDropdown2.componentId, UiDropdownResult2); + } + return reconciler.updateContainer(component, root, null); + }, + getEntities: () => Array.from(entities) + }; +} + +// node_modules/@dcl/react-ecs/dist/system.js +function createReactBasedUiSystem(engine2, pointerSystem) { + const renderer = createReconciler(engine2, pointerSystem); + let uiComponent2 = void 0; + function ReactBasedUiSystem() { + if (uiComponent2) + renderer.update(uiComponent2()); + } + engine2.addSystem(ReactBasedUiSystem, 1e5, "@dcl/react-ecs"); + return { + destroy() { + engine2.removeSystem(ReactBasedUiSystem); + for (const entity of renderer.getEntities()) { + engine2.removeEntity(entity); + } + }, + setUiRenderer(ui) { + uiComponent2 = ui; + } + }; +} + +// node_modules/@dcl/react-ecs/dist/index.js +var ReactEcsRenderer = /* @__PURE__ */ createReactBasedUiSystem(engine, pointerEventsSystem); +var dist_default = ReactEcs; + +// node_modules/@dcl/sdk/react-ecs.js +var react_ecs_default = dist_default; + +// src/ui.tsx +var projectPath = "beer-dispenser"; +var uiComponent = () => [ + GitHubLinkUi() + // Other UI elements +]; +function setupUi() { + ReactEcsRenderer.setUiRenderer(uiComponent); +} +function GitHubLinkUi() { + const fullPath = "https://github.com/decentraland/sdk7-goerli-plaza/tree/main/" + projectPath; + return /* @__PURE__ */ react_ecs_default.createElement( + UiEntity, + { + uiTransform: { + flexDirection: "column", + alignItems: "center", + justifyContent: "space-between", + positionType: "absolute", + position: { right: "8%", bottom: "3%" } + } + }, + /* @__PURE__ */ react_ecs_default.createElement( + UiEntity, + { + uiTransform: { + width: "100", + height: "100" + }, + uiBackground: { + textureMode: "stretch", + texture: { + src: "images/gh.png" + } + }, + onMouseDown: () => { + console.log("OPENING LINK"); + (0, import_RestrictedActions.openExternalUrl)({ url: fullPath }); + } + } + ), + /* @__PURE__ */ react_ecs_default.createElement( + Label, + { + value: "View code", + color: Color42.Black(), + fontSize: 18, + textAlign: "middle-center" + } + ) + ); +} + +// node_modules/@dcl/asset-packs/dist/action-types.js +function addActionType(engine2, type, schema) { + const ActionTypes = getComponent(ComponentName.ACTION_TYPES, engine2); + const actionTypes = ActionTypes.getOrCreateMutable(engine2.RootEntity); + const actionType = { + type, + jsonSchema: JSON.stringify(schema?.jsonSchema || Schemas.Map({}).jsonSchema) + }; + actionTypes.value = [ + ...actionTypes.value.filter(($) => $.type !== actionType.type), + actionType + ]; +} +function getPayload(action) { + return JSON.parse(action.jsonPayload); +} + +// node_modules/@dcl/asset-packs/dist/enums.js +var ComponentName; +(function(ComponentName2) { + ComponentName2["ACTION_TYPES"] = "asset-packs::ActionTypes"; + ComponentName2["ACTIONS"] = "asset-packs::Actions"; + ComponentName2["COUNTER"] = "asset-packs::Counter"; + ComponentName2["TRIGGERS"] = "asset-packs::Triggers"; + ComponentName2["STATES"] = "asset-packs::States"; +})(ComponentName || (ComponentName = {})); +var TweenType; +(function(TweenType2) { + TweenType2["MOVE_ITEM"] = "move_item"; + TweenType2["ROTATE_ITEM"] = "rotate_item"; + TweenType2["SCALE_ITEM"] = "scale_item"; +})(TweenType || (TweenType = {})); +var InterpolationType2; +(function(InterpolationType3) { + InterpolationType3["LINEAR"] = "linear"; + InterpolationType3["EASEINQUAD"] = "easeinquad"; + InterpolationType3["EASEOUTQUAD"] = "easeoutquad"; + InterpolationType3["EASEQUAD"] = "easequad"; + InterpolationType3["EASEINSINE"] = "easeinsine"; + InterpolationType3["EASEOUTSINE"] = "easeoutsine"; + InterpolationType3["EASESINE"] = "easeinoutsine"; + InterpolationType3["EASEINEXPO"] = "easeinexpo"; + InterpolationType3["EASEOUTEXPO"] = "easeoutexpo"; + InterpolationType3["EASEEXPO"] = "easeinoutexpo"; + InterpolationType3["EASEINELASTIC"] = "easeinelastic"; + InterpolationType3["EASEOUTELASTIC"] = "easeoutelastic"; + InterpolationType3["EASEELASTIC"] = "easeinoutelastic"; + InterpolationType3["EASEINBOUNCE"] = "easeinbounce"; + InterpolationType3["EASEOUTEBOUNCE"] = "easeoutbounce"; + InterpolationType3["EASEBOUNCE"] = "easeinoutbounce"; +})(InterpolationType2 || (InterpolationType2 = {})); +var ActionType; +(function(ActionType2) { + ActionType2["PLAY_ANIMATION"] = "play_animation"; + ActionType2["STOP_ANIMATION"] = "stop_animation"; + ActionType2["SET_STATE"] = "set_state"; + ActionType2["START_TWEEN"] = "start_tween"; + ActionType2["SET_COUNTER"] = "set_counter"; + ActionType2["INCREMENT_COUNTER"] = "increment_counter"; + ActionType2["DECREASE_COUNTER"] = "decrease_counter"; + ActionType2["PLAY_SOUND"] = "play_sound"; + ActionType2["STOP_SOUND"] = "stop_sound"; + ActionType2["SET_VISIBILITY"] = "set_visibility"; + ActionType2["ATTACH_TO_PLAYER"] = "attach_to_player"; + ActionType2["DETACH_FROM_PLAYER"] = "detach_from_player"; + ActionType2["PLAY_VIDEO_STREAM"] = "play_video_stream"; + ActionType2["STOP_VIDEO_STREAM"] = "stop_video_stream"; + ActionType2["PLAY_AUDIO_STREAM"] = "play_audio_stream"; + ActionType2["STOP_AUDIO_STREAM"] = "stop_audio_stream"; + ActionType2["TELEPORT_PLAYER"] = "teleport_player"; + ActionType2["MOVE_PLAYER"] = "move_player"; + ActionType2["PLAY_DEFAULT_EMOTE"] = "play_default_emote"; + ActionType2["PLAY_CUSTOM_EMOTE"] = "play_custom_emote"; + ActionType2["OPEN_LINK"] = "open_link"; + ActionType2["SHOW_TEXT"] = "show_text"; + ActionType2["HIDE_TEXT"] = "hide_text"; + ActionType2["START_DELAY"] = "start_delay"; + ActionType2["STOP_DELAY"] = "stop_delay"; + ActionType2["START_LOOP"] = "start_loop"; + ActionType2["STOP_LOOP"] = "stop_loop"; + ActionType2["CLONE_ENTITY"] = "clone_entity"; + ActionType2["REMOVE_ENTITY"] = "remove_entity"; + ActionType2["SHOW_IMAGE"] = "show_image"; + ActionType2["HIDE_IMAGE"] = "hide_image"; +})(ActionType || (ActionType = {})); +var TriggerType; +(function(TriggerType2) { + TriggerType2["ON_CLICK"] = "on_click"; + TriggerType2["ON_STATE_CHANGE"] = "on_state_change"; + TriggerType2["ON_SPAWN"] = "on_spawn"; + TriggerType2["ON_TWEEN_END"] = "on_tween_end"; + TriggerType2["ON_COUNTER_CHANGE"] = "on_counter_change"; + TriggerType2["ON_PLAYER_ENTERS_AREA"] = "on_player_enters_area"; + TriggerType2["ON_PLAYER_LEAVES_AREA"] = "on_player_leaves_area"; + TriggerType2["ON_DELAY"] = "on_delay"; + TriggerType2["ON_LOOP"] = "on_loop"; + TriggerType2["ON_CLONE"] = "on_clone"; + TriggerType2["ON_CLICK_IMAGE"] = "on_click_image"; +})(TriggerType || (TriggerType = {})); +var TriggerConditionType; +(function(TriggerConditionType2) { + TriggerConditionType2["WHEN_STATE_IS"] = "when_state_is"; + TriggerConditionType2["WHEN_STATE_IS_NOT"] = "when_state_is_not"; + TriggerConditionType2["WHEN_COUNTER_EQUALS"] = "when_counter_equals"; + TriggerConditionType2["WHEN_COUNTER_IS_GREATER_THAN"] = "when_counter_is_greater_than"; + TriggerConditionType2["WHEN_COUNTER_IS_LESS_THAN"] = "when_counter_is_less_than"; +})(TriggerConditionType || (TriggerConditionType = {})); +var TriggerConditionOperation; +(function(TriggerConditionOperation2) { + TriggerConditionOperation2["AND"] = "and"; + TriggerConditionOperation2["OR"] = "or"; +})(TriggerConditionOperation || (TriggerConditionOperation = {})); +var AlignMode; +(function(AlignMode2) { + AlignMode2[AlignMode2["TAM_TOP_LEFT"] = 0] = "TAM_TOP_LEFT"; + AlignMode2[AlignMode2["TAM_TOP_CENTER"] = 1] = "TAM_TOP_CENTER"; + AlignMode2[AlignMode2["TAM_TOP_RIGHT"] = 2] = "TAM_TOP_RIGHT"; + AlignMode2[AlignMode2["TAM_MIDDLE_LEFT"] = 3] = "TAM_MIDDLE_LEFT"; + AlignMode2[AlignMode2["TAM_MIDDLE_CENTER"] = 4] = "TAM_MIDDLE_CENTER"; + AlignMode2[AlignMode2["TAM_MIDDLE_RIGHT"] = 5] = "TAM_MIDDLE_RIGHT"; + AlignMode2[AlignMode2["TAM_BOTTOM_LEFT"] = 6] = "TAM_BOTTOM_LEFT"; + AlignMode2[AlignMode2["TAM_BOTTOM_CENTER"] = 7] = "TAM_BOTTOM_CENTER"; + AlignMode2[AlignMode2["TAM_BOTTOM_RIGHT"] = 8] = "TAM_BOTTOM_RIGHT"; +})(AlignMode || (AlignMode = {})); +var Font2; +(function(Font3) { + Font3[Font3["F_SANS_SERIF"] = 0] = "F_SANS_SERIF"; + Font3[Font3["F_SERIF"] = 1] = "F_SERIF"; + Font3[Font3["F_MONOSPACE"] = 2] = "F_MONOSPACE"; +})(Font2 || (Font2 = {})); +var Colliders; +(function(Colliders2) { + Colliders2[Colliders2["CL_NONE"] = 0] = "CL_NONE"; + Colliders2[Colliders2["CL_POINTER"] = 1] = "CL_POINTER"; + Colliders2[Colliders2["CL_PHYSICS"] = 2] = "CL_PHYSICS"; + Colliders2[Colliders2["CL_RESERVED1"] = 4] = "CL_RESERVED1"; + Colliders2[Colliders2["CL_RESERVED2"] = 8] = "CL_RESERVED2"; + Colliders2[Colliders2["CL_RESERVED3"] = 16] = "CL_RESERVED3"; + Colliders2[Colliders2["CL_RESERVED4"] = 32] = "CL_RESERVED4"; + Colliders2[Colliders2["CL_RESERVED5"] = 64] = "CL_RESERVED5"; + Colliders2[Colliders2["CL_RESERVED6"] = 128] = "CL_RESERVED6"; + Colliders2[Colliders2["CL_CUSTOM1"] = 256] = "CL_CUSTOM1"; + Colliders2[Colliders2["CL_CUSTOM2"] = 512] = "CL_CUSTOM2"; + Colliders2[Colliders2["CL_CUSTOM3"] = 1024] = "CL_CUSTOM3"; + Colliders2[Colliders2["CL_CUSTOM4"] = 2048] = "CL_CUSTOM4"; + Colliders2[Colliders2["CL_CUSTOM5"] = 4096] = "CL_CUSTOM5"; + Colliders2[Colliders2["CL_CUSTOM6"] = 8192] = "CL_CUSTOM6"; + Colliders2[Colliders2["CL_CUSTOM7"] = 16384] = "CL_CUSTOM7"; + Colliders2[Colliders2["CL_CUSTOM8"] = 32768] = "CL_CUSTOM8"; +})(Colliders || (Colliders = {})); + +// node_modules/mitt/dist/mitt.mjs +function mitt_default(n) { + return { all: n = n || /* @__PURE__ */ new Map(), on: function(t, e) { + var i = n.get(t); + i ? i.push(e) : n.set(t, [e]); + }, off: function(t, e) { + var i = n.get(t); + i && (e ? i.splice(i.indexOf(e) >>> 0, 1) : n.set(t, [])); + }, emit: function(t, e) { + var i = n.get(t); + i && i.slice().map(function(n2) { + n2(e); + }), (i = n.get("*")) && i.slice().map(function(n2) { + n2(t, e); + }); + } }; +} + +// node_modules/@dcl/asset-packs/dist/events.js +var triggers2 = /* @__PURE__ */ new Map(); +var actions2 = /* @__PURE__ */ new Map(); +function getTriggerEvents(entity) { + if (!triggers2.has(entity)) { + triggers2.set(entity, mitt_default()); + } + return triggers2.get(entity); +} +function getActionEvents(entity) { + if (!actions2.has(entity)) { + actions2.set(entity, mitt_default()); + } + return actions2.get(entity); +} + +// node_modules/@dcl/asset-packs/dist/id.js +var COMPONENTS_WITH_ID = [ + ComponentName.ACTIONS, + ComponentName.STATES, + ComponentName.COUNTER +]; +function getCounterComponent(engine2) { + return engine2.getComponent(ComponentName.COUNTER); +} +function getNextId(engine2) { + const Counter = getCounterComponent(engine2); + const counter = Counter.getOrCreateMutable(engine2.RootEntity); + return ++counter.value; +} +function requiresId(component) { + return COMPONENTS_WITH_ID.includes(component.componentName); +} + +// node_modules/@dcl/asset-packs/dist/states.js +function isValidState(states, value) { + return !!value && states.value.includes(value); +} +function getCurrentValue(states) { + if (isValidState(states, states.currentValue)) { + return states.currentValue; + } + return getDefaultValue(states); +} +function getDefaultValue(states) { + if (isValidState(states, states.defaultValue)) { + return states.defaultValue; + } + if (states.value.length > 0) { + return states.value[0]; + } +} + +// node_modules/@dcl/asset-packs/dist/lww.js +function isLastWriteWinComponent(component) { + return !!component.createOrReplace; +} + +// node_modules/@dcl/asset-packs/dist/clone.js +function clone(entity, engine2, Triggers) { + const cloned = engine2.addEntity(); + const newIds = /* @__PURE__ */ new Map(); + debugger; + for (const component of engine2.componentsIter()) { + if (component.has(entity)) { + let newValue = JSON.parse(JSON.stringify(component.get(entity))); + if (requiresId(component)) { + component; + const oldId = newValue.id; + const newId = getNextId(engine2); + newIds.set(oldId, newId); + newValue = { + ...newValue, + id: newId + }; + } + if (isLastWriteWinComponent(component)) { + component.createOrReplace(cloned, newValue); + } + } + } + if (Triggers.has(cloned)) { + const triggers3 = Triggers.getMutable(cloned); + for (const trigger of triggers3.value) { + for (const action of trigger.actions) { + if (action.id) { + const newId = newIds.get(action.id); + if (newId) { + action.id = newId; + } + } + } + if (trigger.conditions) { + for (const condition of trigger.conditions) { + if (condition.id) { + const newId = newIds.get(condition.id); + if (newId) { + condition.id = newId; + } + } + } + } + } + } + return cloned; +} + +// node_modules/@dcl/asset-packs/dist/definitions.js +var ActionSchemas = { + [ActionType.PLAY_ANIMATION]: Schemas.Map({ + animation: Schemas.String, + loop: Schemas.Optional(Schemas.Boolean) + }), + [ActionType.STOP_ANIMATION]: Schemas.Map({}), + [ActionType.SET_STATE]: Schemas.Map({ state: Schemas.String }), + [ActionType.START_TWEEN]: Schemas.Map({ + type: Schemas.EnumString(TweenType, TweenType.MOVE_ITEM), + end: Schemas.Vector3, + interpolationType: Schemas.EnumString(InterpolationType2, InterpolationType2.LINEAR), + duration: Schemas.Float, + relative: Schemas.Boolean + }), + [ActionType.SET_COUNTER]: Schemas.Map({ counter: Schemas.Int }), + [ActionType.INCREMENT_COUNTER]: Schemas.Map({}), + [ActionType.DECREASE_COUNTER]: Schemas.Map({}), + [ActionType.PLAY_SOUND]: Schemas.Map({ + src: Schemas.String, + loop: Schemas.Optional(Schemas.Boolean), + volume: Schemas.Optional(Schemas.Float) + }), + [ActionType.STOP_SOUND]: Schemas.Map({}), + [ActionType.SET_VISIBILITY]: Schemas.Map({ + visible: Schemas.Boolean, + physicsCollider: Schemas.Optional(Schemas.Boolean), + collider: Schemas.Optional(Schemas.EnumNumber(Colliders, Colliders.CL_POINTER)) + }), + [ActionType.ATTACH_TO_PLAYER]: Schemas.Map({ + anchorPointId: Schemas.Int + }), + [ActionType.DETACH_FROM_PLAYER]: Schemas.Map({}), + [ActionType.PLAY_VIDEO_STREAM]: Schemas.Map({ + src: Schemas.Optional(Schemas.String), + loop: Schemas.Optional(Schemas.Boolean), + volume: Schemas.Optional(Schemas.Float), + dclCast: Schemas.Optional(Schemas.Boolean) + }), + [ActionType.STOP_VIDEO_STREAM]: Schemas.Map({}), + [ActionType.PLAY_AUDIO_STREAM]: Schemas.Map({ + url: Schemas.String, + volume: Schemas.Optional(Schemas.Float) + }), + [ActionType.STOP_AUDIO_STREAM]: Schemas.Map({}), + [ActionType.TELEPORT_PLAYER]: Schemas.Map({ + x: Schemas.Int, + y: Schemas.Int + }), + [ActionType.MOVE_PLAYER]: Schemas.Map({ + position: Schemas.Vector3, + cameraTarget: Schemas.Optional(Schemas.Vector3) + }), + [ActionType.PLAY_DEFAULT_EMOTE]: Schemas.Map({ + emote: Schemas.String + }), + [ActionType.PLAY_CUSTOM_EMOTE]: Schemas.Map({ + src: Schemas.String, + loop: Schemas.Optional(Schemas.Boolean) + }), + [ActionType.OPEN_LINK]: Schemas.Map({ + url: Schemas.String + }), + [ActionType.SHOW_TEXT]: Schemas.Map({ + text: Schemas.String, + hideAfterSeconds: Schemas.Float, + font: Schemas.EnumNumber(Font2, Font2.F_SANS_SERIF), + fontSize: Schemas.Optional(Schemas.Float), + textAlign: Schemas.EnumNumber(AlignMode, AlignMode.TAM_MIDDLE_CENTER) + }), + [ActionType.HIDE_TEXT]: Schemas.Map({}), + [ActionType.START_DELAY]: Schemas.Map({ + actions: Schemas.Array(Schemas.String), + timeout: Schemas.Float + }), + [ActionType.STOP_DELAY]: Schemas.Map({ + action: Schemas.String + }), + [ActionType.START_LOOP]: Schemas.Map({ + actions: Schemas.Array(Schemas.String), + interval: Schemas.Float + }), + [ActionType.STOP_LOOP]: Schemas.Map({ + action: Schemas.String + }), + [ActionType.CLONE_ENTITY]: Schemas.Map({ + position: Schemas.Vector3 + }), + [ActionType.REMOVE_ENTITY]: Schemas.Map({}), + [ActionType.SHOW_IMAGE]: Schemas.Map({ + src: Schemas.String, + align: Schemas.EnumNumber(AlignMode, AlignMode.TAM_MIDDLE_CENTER), + height: Schemas.Float, + width: Schemas.Float, + hideAfterSeconds: Schemas.Optional(Schemas.Float), + text: Schemas.Optional(Schemas.String), + fontSize: Schemas.Optional(Schemas.Float) + }), + [ActionType.HIDE_IMAGE]: Schemas.Map({ + imageEntity: Schemas.Optional(Schemas.Int) + }) +}; +function getComponent(componentName, engine2) { + try { + return engine2.getComponent(componentName); + } catch (error) { + console.error(`Error using getComponent with componentName="${componentName}"`); + throw error; + } +} +function getComponents(engine2) { + return { + Actions: getComponent(ComponentName.ACTIONS, engine2), + States: getComponent(ComponentName.STATES, engine2), + Counter: getComponent(ComponentName.COUNTER, engine2), + Triggers: getComponent(ComponentName.TRIGGERS, engine2) + }; +} +function createComponents(engine2) { + const ActionTypes = engine2.defineComponent(ComponentName.ACTION_TYPES, { + value: Schemas.Array(Schemas.Map({ + type: Schemas.String, + jsonSchema: Schemas.String + })) + }); + const Actions = engine2.defineComponent(ComponentName.ACTIONS, { + id: Schemas.Int, + value: Schemas.Array(Schemas.Map({ + name: Schemas.String, + type: Schemas.String, + jsonPayload: Schemas.String + })) + }); + const Counter = engine2.defineComponent(ComponentName.COUNTER, { + id: Schemas.Number, + value: Schemas.Int + }); + const Triggers = engine2.defineComponent(ComponentName.TRIGGERS, { + value: Schemas.Array(Schemas.Map({ + type: Schemas.EnumString(TriggerType, TriggerType.ON_CLICK), + conditions: Schemas.Optional(Schemas.Array(Schemas.Map({ + id: Schemas.Optional(Schemas.Int), + type: Schemas.EnumString(TriggerConditionType, TriggerConditionType.WHEN_STATE_IS), + value: Schemas.String + }))), + operation: Schemas.Optional(Schemas.EnumString(TriggerConditionOperation, TriggerConditionOperation.AND)), + actions: Schemas.Array(Schemas.Map({ + id: Schemas.Optional(Schemas.Int), + name: Schemas.Optional(Schemas.String) + })) + })) + }); + const States = engine2.defineComponent(ComponentName.STATES, { + id: Schemas.Number, + value: Schemas.Array(Schemas.String), + defaultValue: Schemas.Optional(Schemas.String), + currentValue: Schemas.Optional(Schemas.String) + }); + return { + ActionTypes, + Actions, + Counter, + Triggers, + States + }; +} +function initComponents(engine2, components) { + const actionTypes = Object.values(ActionType); + for (const type of actionTypes) { + const actionType = type; + addActionType(engine2, actionType, ActionSchemas[actionType]); + } + const Counter = engine2.getComponent(ComponentName.COUNTER); + const counter = Counter.getOrCreateMutable(engine2.RootEntity); + counter.value = counter.value || 0; + if (components && components.VideoPlayer && components.Material) { + initVideoPlayerComponents(engine2, { + VideoPlayer: components.VideoPlayer, + Material: components.Material + }); + } +} +function getVideoTexture({ material }) { + if (material?.$case === "pbr" && material.pbr.texture?.tex?.$case === "videoTexture") { + return material.pbr.texture.tex.videoTexture; + } + return void 0; +} +function initVideoPlayerComponentMaterial(entity, { Material: Material4 }, material) { + if (!material || !material.material || material.material.$case !== "pbr") { + return null; + } + Material4.setPbrMaterial(entity, { + ...material.material.pbr, + texture: Material4.Texture.Video({ + videoPlayerEntity: entity + }) + }); +} +function initVideoPlayerComponents(engine2, components) { + function replaceVideoTexture() { + const { Material: Material4, VideoPlayer: VideoPlayer3 } = components; + engine2.removeSystem(replaceVideoTexture); + for (const [entity, material] of engine2.getEntitiesWith(Material4, VideoPlayer3)) { + const videoTexture = getVideoTexture(material); + if (videoTexture?.videoPlayerEntity === engine2.RootEntity) { + initVideoPlayerComponentMaterial(entity, components, material); + } + } + } + engine2.addSystem(replaceVideoTexture); +} +function getConditionTypesByComponentName(componentName) { + switch (componentName) { + case ComponentName.STATES: { + return [ + TriggerConditionType.WHEN_STATE_IS, + TriggerConditionType.WHEN_STATE_IS_NOT + ]; + } + case ComponentName.COUNTER: { + return [ + TriggerConditionType.WHEN_COUNTER_EQUALS, + TriggerConditionType.WHEN_COUNTER_IS_GREATER_THAN, + TriggerConditionType.WHEN_COUNTER_IS_LESS_THAN + ]; + } + default: { + return []; + } + } +} + +// node_modules/@dcl/asset-packs/dist/actions.js +var import_UserActionModule = require("~system/UserActionModule"); +var import_RestrictedActions2 = require("~system/RestrictedActions"); +var import_CommsApi = require("~system/CommsApi"); + +// node_modules/@dcl/asset-packs/dist/timer.js +var queueDelay = /* @__PURE__ */ new Map(); +var queueInterval = /* @__PURE__ */ new Map(); +function createTimerSystem() { + return function timerSystem(dt) { + intervalSystem(dt); + delaySystem(dt); + }; + function intervalSystem(dt) { + for (const [entity, actions3] of queueInterval.entries()) { + const triggerEvents = getTriggerEvents(entity); + for (const action of actions3) { + if (action.timeout === action.interval) { + action.callback(); + } + action.timeout -= dt; + if (action.timeout <= 0) { + action.timeout = action.interval; + triggerEvents.emit(TriggerType.ON_LOOP); + } + } + } + } + function delaySystem(dt) { + for (const [entity, actions3] of queueDelay.entries()) { + const triggerEvents = getTriggerEvents(entity); + const completedActions = []; + let idx = 0; + for (const action of actions3) { + action.timeout -= dt; + if (action.timeout <= 0) { + action.callback(); + triggerEvents.emit(TriggerType.ON_DELAY); + completedActions.push(idx); + } + idx++; + } + for (const action of completedActions) { + actions3.splice(action, 1); + } + } + } +} +function startTimeout(entity, action, timeout, callback) { + const actionCallbacks = queueDelay.get(entity) ?? []; + actionCallbacks.push({ timeout, action, callback }); + queueDelay.set(entity, actionCallbacks); +} +function stopTimeout(entity, action) { + const delays = queueDelay.get(entity) ?? []; + queueDelay.set(entity, delays.filter(($) => $.action !== action)); +} +function stopAllTimeouts(entity) { + queueDelay.delete(entity); +} +function startInterval(entity, action, interval, callback) { + const actionCallbacks = queueInterval.get(entity) ?? []; + actionCallbacks.push({ timeout: interval, action, callback, interval }); + queueInterval.set(entity, actionCallbacks); +} +function stopInterval(entity, action) { + const intervals = queueInterval.get(entity) ?? []; + queueInterval.set(entity, intervals.filter(($) => $.action !== action)); +} +function stopAllIntervals(entity) { + queueInterval.delete(entity); +} + +// node_modules/@dcl/asset-packs/dist/ui.js +function getAlignMode(align, isColumn) { + switch (align) { + case AlignMode.TAM_TOP_LEFT: { + return { + alignItems: 1, + justifyContent: 0 + }; + } + case AlignMode.TAM_TOP_CENTER: { + return isColumn ? { + alignItems: 2, + justifyContent: 0 + } : { + alignItems: 1, + justifyContent: 1 + }; + } + case AlignMode.TAM_TOP_RIGHT: { + return isColumn ? { + alignItems: 3, + justifyContent: 0 + } : { + alignItems: 1, + justifyContent: 2 + }; + } + case AlignMode.TAM_MIDDLE_LEFT: { + return isColumn ? { + alignItems: 1, + justifyContent: 1 + } : { + alignItems: 2, + justifyContent: 0 + }; + } + case AlignMode.TAM_MIDDLE_CENTER: { + return { + alignItems: 2, + justifyContent: 1 + }; + } + case AlignMode.TAM_MIDDLE_RIGHT: { + return isColumn ? { + alignItems: 3, + justifyContent: 1 + } : { + alignItems: 2, + justifyContent: 2 + }; + } + case AlignMode.TAM_BOTTOM_LEFT: { + return isColumn ? { + alignItems: 1, + justifyContent: 2 + } : { + alignItems: 2, + justifyContent: 1 + }; + } + case AlignMode.TAM_BOTTOM_CENTER: { + return isColumn ? { + alignItems: 2, + justifyContent: 2 + } : { + alignItems: 3, + justifyContent: 1 + }; + } + case AlignMode.TAM_BOTTOM_RIGHT: { + return { + alignItems: 3, + justifyContent: 2 + }; + } + } +} +function mapAlignToScreenAlign(align, flexDirection = 0) { + const isColumn = flexDirection === 1; + switch (align) { + case AlignMode.TAM_TOP_LEFT: + return getAlignMode(align, isColumn); + case AlignMode.TAM_TOP_CENTER: + return getAlignMode(align, isColumn); + case AlignMode.TAM_TOP_RIGHT: + return getAlignMode(align, isColumn); + case AlignMode.TAM_MIDDLE_LEFT: + return getAlignMode(align, isColumn); + case AlignMode.TAM_MIDDLE_CENTER: + return getAlignMode(align, isColumn); + case AlignMode.TAM_MIDDLE_RIGHT: + return getAlignMode(align, isColumn); + case AlignMode.TAM_BOTTOM_LEFT: + return getAlignMode(align, isColumn); + case AlignMode.TAM_BOTTOM_CENTER: + return getAlignMode(align, isColumn); + case AlignMode.TAM_BOTTOM_RIGHT: + return getAlignMode(align, isColumn); + default: + throw new Error(`Unsupported AlignMode: ${align}`); + } +} +function getUITransform(entiy, height = 100, width = 100, unit = 2) { + let uiTransformComponent = UiTransform2.getMutableOrNull(entiy); + if (!uiTransformComponent) { + uiTransformComponent = UiTransform2.create(entiy); + uiTransformComponent.heightUnit = unit; + uiTransformComponent.widthUnit = unit; + uiTransformComponent.height = height; + uiTransformComponent.width = width; + uiTransformComponent.maxHeightUnit = unit; + uiTransformComponent.maxWidthUnit = unit; + uiTransformComponent.maxHeight = height; + uiTransformComponent.maxWidth = width; + } + if (entiy === 0) { + uiTransformComponent.positionType = 1; + } + return uiTransformComponent; +} +function getUIBackground(entity, src, textureMode = 0, wrapMode = 1) { + return UiBackground2.createOrReplace(entity, { + textureMode, + texture: { + tex: { + $case: "texture", + texture: { + src, + wrapMode + } + } + }, + uvs: [] + }); +} +function breakLines(text, linelength) { + const lineBreak = "\n"; + let counter = 0; + let line = ""; + let returnText = ""; + let bMatchFound = false; + const lineLen = linelength ? linelength : 50; + if (!text) + return ""; + if (text.length < lineLen + 1) { + return text; + } + while (counter < text.length) { + line = text.substring(counter, counter + lineLen); + bMatchFound = false; + if (line.length == lineLen) { + for (let i = line.length; i > -1; i--) { + if (line.substring(i, i + 1) == " ") { + counter += line.substring(0, i).length; + line = line.substring(0, i) + lineBreak; + returnText += line; + bMatchFound = true; + break; + } + } + if (!bMatchFound) { + counter += line.length; + line = line + lineBreak; + returnText += line; + } + } else { + returnText += line; + break; + } + } + return returnText; +} +function getUIText(entity, text, fontSize = 10, containerWidth, align = AlignMode.TAM_MIDDLE_CENTER, color = Color42.Black()) { + const lineLength = Math.floor(containerWidth / (fontSize / 1.7)); + return UiText2.createOrReplace(entity, { + value: breakLines(text, lineLength), + fontSize, + font: Font2.F_MONOSPACE, + textAlign: align, + color + }); +} + +// node_modules/@dcl/asset-packs/dist/triggers.js +var initedEntities = /* @__PURE__ */ new Set(); +var actionQueue = []; +var internalInitTriggers = null; +function initTriggers(entity) { + if (internalInitTriggers) { + return internalInitTriggers(entity); + } + throw new Error(`Cannot call initTriggers while triggersSystem has not been created`); +} +function createTriggersSystem(engine2, pointerEventsSystem3) { + const { Actions, States, Counter, Triggers } = getComponents(engine2); + internalInitTriggers = initEntityTriggers; + return function triggersSystem(_dt) { + while (actionQueue.length > 0) { + const { entity, action } = actionQueue.shift(); + const actionEvents = getActionEvents(entity); + actionEvents.emit(action.name, getPayload(action)); + } + const entitiesWithTriggers = engine2.getEntitiesWith(Triggers); + for (const [entity] of entitiesWithTriggers) { + initEntityTriggers(entity); + } + }; + function initEntityTriggers(entity) { + if (!Triggers.has(entity) || initedEntities.has(entity)) { + return; + } + const triggers3 = Triggers.get(entity); + const types = triggers3.value.reduce((types2, trigger) => types2.add(trigger.type), /* @__PURE__ */ new Set()); + for (const type of types) { + switch (type) { + case TriggerType.ON_CLICK: { + initOnClickTrigger(entity); + break; + } + case TriggerType.ON_PLAYER_ENTERS_AREA: + case TriggerType.ON_PLAYER_LEAVES_AREA: { + initOnPlayerTriggerArea(entity); + break; + } + } + } + const triggerEvents = getTriggerEvents(entity); + for (const trigger of triggers3.value) { + triggerEvents.on(trigger.type, () => { + if (checkConditions(trigger)) { + for (const triggerAction of trigger.actions) { + if (isValidAction(triggerAction)) { + const entity2 = getEntityByAction(triggerAction); + if (entity2) { + const actions3 = Actions.getOrNull(entity2); + if (actions3) { + const action = actions3.value.find(($) => $.name === triggerAction.name); + if (action) { + actionQueue.push({ entity: entity2, action }); + } + } + } + } + } + } + }); + } + triggerEvents.emit(TriggerType.ON_SPAWN); + initedEntities.add(entity); + } + function isValidAction(action) { + const { id, name } = action; + return !!id && !!name; + } + function checkConditions(trigger) { + if (trigger.conditions && trigger.conditions.length > 0) { + const conditions = trigger.conditions.map(checkCondition); + const isTrue = (result) => !!result; + const operation = trigger.operation || TriggerConditionOperation.AND; + switch (operation) { + case TriggerConditionOperation.AND: { + return conditions.every(isTrue); + } + case TriggerConditionOperation.OR: { + return conditions.some(isTrue); + } + } + } + return true; + } + function checkCondition(condition) { + const entity = getEntityByCondition(condition); + if (entity) { + try { + switch (condition.type) { + case TriggerConditionType.WHEN_STATE_IS: { + const states = States.getOrNull(entity); + if (states !== null) { + const currentValue = getCurrentValue(states); + return currentValue === condition.value; + } + break; + } + case TriggerConditionType.WHEN_STATE_IS_NOT: { + const states = States.getOrNull(entity); + if (states !== null) { + const currentValue = getCurrentValue(states); + return currentValue !== condition.value; + } + break; + } + case TriggerConditionType.WHEN_COUNTER_EQUALS: { + const counter = Counter.getOrNull(entity); + if (counter !== null) { + const numeric = Number(condition.value); + if (!isNaN(numeric)) { + return counter.value === numeric; + } + } + break; + } + case TriggerConditionType.WHEN_COUNTER_IS_GREATER_THAN: { + const counter = Counter.getOrNull(entity); + if (counter !== null) { + const numeric = Number(condition.value); + if (!isNaN(numeric)) { + return counter.value > numeric; + } + } + break; + } + case TriggerConditionType.WHEN_COUNTER_IS_LESS_THAN: { + const counter = Counter.getOrNull(entity); + if (counter !== null) { + const numeric = Number(condition.value); + if (!isNaN(numeric)) { + return counter.value < numeric; + } + } + break; + } + } + } catch (error) { + console.error("Error in condition", condition); + } + } + return false; + } + function getEntityById(componentName, id) { + const Component = engine2.getComponent(componentName); + const entities = Array.from(engine2.getEntitiesWith(Component)); + const result = entities.find(([_entity, value]) => value.id === id); + return Array.isArray(result) && result.length > 0 ? result[0] : null; + } + function getEntityByAction(action) { + if (action.id) { + const entity = getEntityById(ComponentName.ACTIONS, action.id); + if (entity) { + return entity; + } + } + return null; + } + function getEntityByCondition(condition) { + const componentName = Object.values(ComponentName).map((componentName2) => ({ + componentName: componentName2, + conditionTypes: getConditionTypesByComponentName(componentName2) + })).reduce((result, { componentName: componentName2, conditionTypes }) => conditionTypes.includes(condition.type) ? componentName2 : result, null); + if (componentName && condition.id) { + const entity = getEntityById(componentName, condition.id); + if (entity) { + return entity; + } + } + return null; + } + function initOnClickTrigger(entity) { + pointerEventsSystem3.onPointerDown({ + entity, + opts: { + button: 0, + hoverText: "Click" + } + }, () => { + const triggerEvents = getTriggerEvents(entity); + triggerEvents.emit(TriggerType.ON_CLICK); + }); + } + function initOnPlayerTriggerArea(entity) { + const { scale } = Transform2.get(entity); + triggers.addTrigger(entity, NO_LAYERS, LAYER_1, [ + { + type: "box", + scale + } + ], () => { + const triggerEvents = getTriggerEvents(entity); + triggerEvents.emit(TriggerType.ON_PLAYER_ENTERS_AREA); + }, () => { + const triggerEvents = getTriggerEvents(entity); + triggerEvents.emit(TriggerType.ON_PLAYER_LEAVES_AREA); + }); + } +} + +// node_modules/@dcl/asset-packs/dist/actions.js +var initedEntities2 = /* @__PURE__ */ new Set(); +var uiStacks = /* @__PURE__ */ new Map(); +var lastUiEntityClicked = /* @__PURE__ */ new Map(); +var internalInitActions = null; +function createActionsSystem(engine2, components) { + const { Animator: Animator6, Transform: Transform4, AudioSource: AudioSource3, AvatarAttach: AvatarAttach3, VisibilityComponent: VisibilityComponent3, GltfContainer: GltfContainer3 } = components; + const { Actions, States, Counter, Triggers } = getComponents(engine2); + internalInitActions = initActions; + return function actionsSystem(_dt) { + const entitiesWithActions = engine2.getEntitiesWith(Actions); + for (const [entity] of entitiesWithActions) { + initActions(entity); + } + }; + function initActions(entity) { + if (!Actions.has(entity) || initedEntities2.has(entity)) { + return; + } + const actions3 = Actions.get(entity); + const types = actions3.value.reduce((types2, action) => types2.add(action.type), /* @__PURE__ */ new Set()); + for (const type of types) { + switch (type) { + case ActionType.PLAY_ANIMATION: { + initPlayAnimation(entity); + break; + } + default: + break; + } + } + const actionEvents = getActionEvents(entity); + for (const action of actions3.value) { + actionEvents.on(action.name, () => { + switch (action.type) { + case ActionType.PLAY_ANIMATION: { + handlePlayAnimation(entity, getPayload(action)); + break; + } + case ActionType.STOP_ANIMATION: { + handleStopAnimation(entity, getPayload(action)); + break; + } + case ActionType.SET_STATE: { + handleSetState(entity, getPayload(action)); + break; + } + case ActionType.START_TWEEN: { + handleStartTween(entity, getPayload(action)); + break; + } + case ActionType.SET_COUNTER: { + handleSetCounter(entity, getPayload(action)); + break; + } + case ActionType.INCREMENT_COUNTER: { + handleIncrementCounter(entity, getPayload(action)); + break; + } + case ActionType.DECREASE_COUNTER: { + handleDecreaseCounter(entity, getPayload(action)); + break; + } + case ActionType.PLAY_SOUND: { + handlePlaySound(entity, getPayload(action)); + break; + } + case ActionType.STOP_SOUND: { + handleStopSound(entity, getPayload(action)); + break; + } + case ActionType.SET_VISIBILITY: { + handleSetVisibility(entity, getPayload(action)); + break; + } + case ActionType.ATTACH_TO_PLAYER: { + handleAttachToPlayer(entity, getPayload(action)); + break; + } + case ActionType.DETACH_FROM_PLAYER: { + handleDetachFromPlayer(entity, getPayload(action)); + break; + } + case ActionType.PLAY_VIDEO_STREAM: { + handlePlayVideo(entity, getPayload(action)); + break; + } + case ActionType.STOP_VIDEO_STREAM: { + handleStopVideo(entity, getPayload(action)); + break; + } + case ActionType.PLAY_AUDIO_STREAM: { + handlePlayAudioStream(entity, getPayload(action)); + break; + } + case ActionType.STOP_AUDIO_STREAM: { + handleStopAudioStream(entity, getPayload(action)); + break; + } + case ActionType.TELEPORT_PLAYER: { + handleTeleportPlayer(entity, getPayload(action)); + break; + } + case ActionType.MOVE_PLAYER: { + handleMovePlayer(entity, getPayload(action)); + break; + } + case ActionType.PLAY_DEFAULT_EMOTE: { + handlePlayDefaultEmote(entity, getPayload(action)); + break; + } + case ActionType.PLAY_CUSTOM_EMOTE: { + handlePlayCustomEmote(entity, getPayload(action)); + break; + } + case ActionType.OPEN_LINK: { + handleOpenLink(entity, getPayload(action)); + break; + } + case ActionType.SHOW_TEXT: { + handleShowText(entity, getPayload(action)); + break; + } + case ActionType.HIDE_TEXT: { + handleHideText(entity, getPayload(action)); + break; + } + case ActionType.START_DELAY: { + handleStartDelay(entity, getPayload(action)); + break; + } + case ActionType.STOP_DELAY: { + handleStopDelay(entity, getPayload(action)); + break; + } + case ActionType.START_LOOP: { + handleStartLoop(entity, getPayload(action)); + break; + } + case ActionType.STOP_LOOP: { + handleStopLoop(entity, getPayload(action)); + break; + } + case ActionType.CLONE_ENTITY: { + handleCloneEntity(entity, getPayload(action)); + break; + } + case ActionType.REMOVE_ENTITY: { + handleRemoveEntity(entity, getPayload(action)); + break; + } + case ActionType.SHOW_IMAGE: { + handleShowImage(entity, getPayload(action)); + break; + } + case ActionType.HIDE_IMAGE: { + handleHideImage(entity, getPayload(action)); + break; + } + default: + break; + } + }); + } + initedEntities2.add(entity); + } + function initPlayAnimation(entity) { + if (!Animator6.has(entity)) { + Animator6.create(entity, { + states: [] + }); + Animator6.stopAllAnimations(entity); + } + } + function handlePlayAnimation(entity, payload) { + const { animation, loop } = payload; + const animator = Animator6.getMutable(entity); + if (!animator.states.some(($) => $.clip === animation)) { + animator.states = [ + ...animator.states, + { + clip: animation + } + ]; + } + Animator6.stopAllAnimations(entity); + const clip = Animator6.getClip(entity, animation); + clip.playing = true; + clip.loop = loop ?? false; + } + function handleStopAnimation(entity, _payload) { + if (Animator6.has(entity)) { + Animator6.stopAllAnimations(entity); + } + } + function handleSetState(entity, payload) { + const states = States.getMutableOrNull(entity); + if (states) { + let nextState = payload.state; + nextState = isValidState(states, nextState) ? nextState : getDefaultValue(states); + states.currentValue = nextState; + const triggerEvents = getTriggerEvents(entity); + triggerEvents.emit(TriggerType.ON_STATE_CHANGE); + } + } + function handleStartTween(entity, payload) { + if (payload) { + const triggerEvents = getTriggerEvents(entity); + const onTweenEnd = () => triggerEvents.emit(TriggerType.ON_TWEEN_END); + switch (payload.type) { + case TweenType.MOVE_ITEM: { + handleMoveItem(entity, payload, onTweenEnd); + break; + } + case TweenType.ROTATE_ITEM: { + handleRotateItem(entity, payload, onTweenEnd); + break; + } + case TweenType.SCALE_ITEM: { + handleScaleItem(entity, payload, onTweenEnd); + break; + } + default: { + throw new Error(`Unknown tween type: ${payload.type}`); + } + } + } + } + function handleMoveItem(entity, tween, onTweenEnd) { + const transform = Transform4.get(entity); + const { duration, interpolationType, relative } = tween; + const end = Vector32.create(tween.end.x, tween.end.y, tween.end.z); + const endPosition = relative ? Vector32.add(transform.position, end) : end; + tweens.startTranslation(entity, transform.position, endPosition, duration, interpolationType, onTweenEnd); + } + function handleRotateItem(entity, tween, onTweenEnd) { + const transform = Transform4.get(entity); + const { duration, interpolationType, relative } = tween; + const end = Quaternion2.fromEulerDegrees(tween.end.x, tween.end.y, tween.end.z); + const endRotation = relative ? Quaternion2.multiply(transform.rotation, end) : end; + tweens.startRotation(entity, transform.rotation, endRotation, duration, interpolationType, onTweenEnd); + } + function handleScaleItem(entity, tween, onTweenEnd) { + const transform = Transform4.get(entity); + const { duration, interpolationType, relative } = tween; + const end = Vector32.create(tween.end.x, tween.end.y, tween.end.z); + const endScale = relative ? Vector32.add(transform.scale, end) : end; + tweens.startScaling(entity, transform.scale, endScale, duration, interpolationType, onTweenEnd); + } + function handleSetCounter(entity, payload) { + const counter = Counter.getMutableOrNull(entity); + if (counter) { + counter.value = payload.counter; + const triggerEvents = getTriggerEvents(entity); + triggerEvents.emit(TriggerType.ON_COUNTER_CHANGE); + } + } + function handleIncrementCounter(entity, _payload) { + const counter = Counter.getMutableOrNull(entity); + if (counter) { + counter.value += 1; + const triggerEvents = getTriggerEvents(entity); + triggerEvents.emit(TriggerType.ON_COUNTER_CHANGE); + } + } + function handleDecreaseCounter(entity, _payload) { + const counter = Counter.getMutableOrNull(entity); + if (counter) { + counter.value -= 1; + const triggerEvents = getTriggerEvents(entity); + triggerEvents.emit(TriggerType.ON_COUNTER_CHANGE); + } + } + function handlePlaySound(entity, payload) { + const { src, loop, volume } = payload; + AudioSource3.createOrReplace(entity, { + audioClipUrl: src, + loop, + playing: true, + volume: volume ?? 1 + }); + } + function handleStopSound(entity, _payload) { + const audioSource = AudioSource3.getMutableOrNull(entity); + if (audioSource) { + audioSource.playing = false; + } + } + function handleSetVisibility(entity, payload) { + const { visible, collider } = payload; + VisibilityComponent3.createOrReplace(entity, { visible }); + const gltf = GltfContainer3.getMutableOrNull(entity); + const meshCollider = MeshCollider3.getMutableOrNull(entity); + if (collider !== void 0) { + if (gltf) { + gltf.invisibleMeshesCollisionMask = collider; + } else if (meshCollider) { + meshCollider.collisionMask = collider; + } + } + } + function handleAttachToPlayer(entity, payload) { + const { anchorPointId } = payload; + AvatarAttach3.createOrReplace(entity, { anchorPointId }); + } + function handleDetachFromPlayer(entity, _payload) { + if (AvatarAttach3.has(entity)) { + AvatarAttach3.deleteFrom(entity); + } + } + function handleTeleportPlayer(_entity, payload) { + const { x, y } = payload; + (0, import_UserActionModule.requestTeleport)({ + destination: `${x},${y}` + }); + } + function handleMovePlayer(_entity, payload) { + const options = { + newRelativePosition: payload.position, + cameraTarget: payload.cameraTarget + }; + console.log("movePlayerTo", options); + void (0, import_RestrictedActions2.movePlayerTo)(options); + } + function handlePlayDefaultEmote(_entity, payload) { + const { emote } = payload; + void (0, import_RestrictedActions2.triggerEmote)({ predefinedEmote: emote }); + } + function handlePlayCustomEmote(_entity, payload) { + const { src, loop } = payload; + void (0, import_RestrictedActions2.triggerSceneEmote)({ src, loop }); + } + function handleOpenLink(_entity, payload) { + const { url } = payload; + void (0, import_RestrictedActions2.openExternalUrl)({ url }); + } + async function getVideoSrc({ src, dclCast }) { + if (dclCast) { + const { streams } = await (0, import_CommsApi.getActiveVideoStreams)({}); + return streams.length > 0 ? streams[0].trackSid : ""; + } + return src ?? ""; + } + function handlePlayVideo(entity, payload) { + const videoSource = VideoPlayer2.getMutableOrNull(entity); + if (videoSource && videoSource.src) { + videoSource.playing = true; + } else { + getVideoSrc(payload).then((src) => { + if (!src) + return; + VideoPlayer2.createOrReplace(entity, { + src, + volume: payload.volume ?? 1, + loop: payload.loop ?? false, + playing: true + }); + initVideoPlayerComponentMaterial(entity, components, Material3.getOrNull(entity)); + }); + } + } + function handleStopVideo(entity, _payload) { + const videoSource = VideoPlayer2.getMutableOrNull(entity); + if (videoSource) { + videoSource.playing = false; + } + } + function handlePlayAudioStream(entity, payload) { + const { url, volume } = payload; + AudioStream2.createOrReplace(entity, { + url, + playing: true, + volume: volume ?? 1 + }); + } + function handleStopAudioStream(entity, _payload) { + const audioSource = AudioStream2.getMutableOrNull(entity); + if (audioSource) { + audioSource.playing = false; + } + } + function handleShowText(entity, payload) { + const { text, hideAfterSeconds, font, fontSize, textAlign } = payload; + const uiTransformComponent = getUITransform(entity); + if (uiTransformComponent) { + UiText2.createOrReplace(entity, { + value: text, + font, + fontSize, + textAlign + }); + startTimeout(entity, ActionType.HIDE_TEXT, hideAfterSeconds, () => handleHideText(entity, {})); + } + } + function handleHideText(entity, _payload) { + const uiTextComponent = UiText2.getOrNull(entity); + if (uiTextComponent) { + UiText2.deleteFrom(entity); + } + } + function findActionByName(entity, name) { + const actions3 = Actions.getOrNull(entity); + return actions3?.value.find(($) => $.name === name); + } + function handleStartDelay(entity, payload) { + const { actions: actions3, timeout } = payload; + for (const actionName of actions3) { + const action = findActionByName(entity, actionName); + if (action) { + startTimeout(entity, actionName, timeout, () => { + const actionEvents = getActionEvents(entity); + actionEvents.emit(action.name, getPayload(action)); + }); + } + } + } + function handleStopDelay(entity, payload) { + const { action } = payload; + stopTimeout(entity, action); + } + function handleStartLoop(entity, payload) { + const { actions: actions3, interval } = payload; + for (const actionName of actions3) { + const action = findActionByName(entity, actionName); + if (action) { + startInterval(entity, actionName, interval, () => { + const actionEvents = getActionEvents(entity); + actionEvents.emit(action.name, getPayload(action)); + }); + } + } + } + function handleStopLoop(entity, payload) { + const { action } = payload; + stopInterval(entity, action); + } + function handleCloneEntity(entity, payload) { + const { position } = payload; + const cloned = clone(entity, engine2, Triggers); + initActions(cloned); + initTriggers(cloned); + const transform = Transform4.getOrCreateMutable(cloned); + transform.position = position; + const triggerEvents = getTriggerEvents(cloned); + triggerEvents.emit(TriggerType.ON_CLONE); + } + function handleRemoveEntity(entity, _payload) { + stopAllTimeouts(entity); + stopAllIntervals(entity); + engine2.removeEntity(entity); + } + function getUiStack(align) { + const key = `${align.alignItems},${align.justifyContent}`; + if (!uiStacks.has(key)) { + uiStacks.set(key, engine2.addEntity()); + } + return uiStacks.get(key); + } + function handleShowImage(entity, payload) { + const { src, text, hideAfterSeconds, fontSize, align, height, width } = payload; + getUITransform(engine2.RootEntity); + const screenAlign = mapAlignToScreenAlign(align); + const uiStack = getUiStack(screenAlign); + const uiStackTransformComponent = getUITransform(uiStack); + uiStackTransformComponent.alignItems = screenAlign.alignItems; + uiStackTransformComponent.justifyContent = screenAlign.justifyContent; + uiStackTransformComponent.positionType = 1; + const imageEntity = engine2.addEntity(); + const imageTransformComponent = getUITransform(imageEntity, width, height, 1); + imageTransformComponent.parent = uiStack; + imageTransformComponent.pointerFilter = 1; + getUIBackground(imageEntity, src); + if (text) { + getUIText(imageEntity, text, fontSize, width); + } + pointerEventsSystem.onPointerDown({ + entity: imageEntity, + opts: { + button: 0, + hoverText: "Click" + } + }, () => { + lastUiEntityClicked.set(entity, imageEntity); + const triggerEvents = getTriggerEvents(entity); + triggerEvents.emit(TriggerType.ON_CLICK_IMAGE); + }); + if (hideAfterSeconds) { + startTimeout(entity, ActionType.HIDE_IMAGE, hideAfterSeconds, () => handleHideImage(entity, { imageEntity })); + } + } + function handleHideImage(entity, payload) { + const { imageEntity } = payload; + if (imageEntity) { + engine2.removeEntity(imageEntity); + } else { + const clickedImage = lastUiEntityClicked.get(entity); + if (clickedImage) { + engine2.removeEntity(clickedImage); + lastUiEntityClicked.delete(entity); + } + } + } +} + +// node_modules/@dcl/asset-packs/dist/scene-entrypoint.js +function initAssetPacks(_engine, _pointerEventsSystem, _components) { + const engine2 = _engine; + const pointerEventsSystem3 = _pointerEventsSystem; + const components = _components; + try { + createComponents(engine2); + engine2.addSystem(createActionsSystem(engine2, components)); + engine2.addSystem(createTriggersSystem(engine2, pointerEventsSystem3)); + engine2.addSystem(createTimerSystem()); + initComponents(engine2, components); + } catch (error) { + console.error(`Error initializing Asset Packs: ${error.message}`); + } +} + +// src/index.ts +initAssetPacks(engine, pointerEventsSystem, { + Animator: Animator3, + AudioSource: AudioSource2, + AvatarAttach: AvatarAttach2, + Transform: Transform2, + VisibilityComponent: VisibilityComponent2, + GltfContainer: GltfContainer2, + Material: Material3, + VideoPlayer: VideoPlayer2 +}); +function main() { + HighestID.create(engine.RootEntity, { id: 1001 }); + syncEntity(engine.RootEntity, [HighestID.componentId], 1e3); + const gameEntity = engine.addEntity(); + GameData.create(gameEntity, {}); + syncEntity(gameEntity, [GameData.componentId], 20 /* GAME_SESSION */); + const easterEgg = engine.addEntity(); + Transform2.create(easterEgg, { + position: Vector32.create(19, 2, 4), + rotation: Quaternion2.fromEulerDegrees(0, 90, 0) + }); + TextShape2.create(easterEgg, { + text: "You don't want to know what's\nbehind the kitchen", + fontSize: 3 + }); + const noodles_expender = engine.getEntityOrNullByName("ExpenderNoodles"); + const roll_expender = engine.getEntityOrNullByName("ExpenderRolls"); + const noodles_button = engine.getEntityOrNullByName("Noodle Button"); + const roll_button = engine.getEntityOrNullByName("Roll Button"); + if (noodles_expender && roll_expender && noodles_button && roll_button) { + const noodles_button_events = getTriggerEvents(noodles_button); + noodles_button_events.on(TriggerType.ON_CLICK, () => { + console.log("BUTTON WAS PRESSED!!"); + const startPosition = Vector32.add(Transform2.get(noodles_expender).position, Vector32.create(0, 0.7, 0)); + createIngredient(0 /* Noodles */, startPosition, true); + }); + const roll_button_events = getTriggerEvents(roll_button); + roll_button_events.on(TriggerType.ON_CLICK, () => { + console.log("BUTTON WAS PRESSED!!"); + const startPosition = Vector32.add(Transform2.get(roll_expender).position, Vector32.create(0, 0.7, 0)); + createIngredient(1 /* SushiRoll */, startPosition, true); + }); + syncEntity(noodles_button, [Animator3.componentId, AudioSource2.componentId], 25 /* DISPENSER_BUTTON1 */); + syncEntity(roll_button, [Animator3.componentId, AudioSource2.componentId], 26 /* DISPENSER_BUTTON2 */); + } + const pot1 = engine.getEntityOrNullByName("Pot1"); + const pot2 = engine.getEntityOrNullByName("Pot2"); + const pot1_button = engine.getEntityOrNullByName("Pot1 Button"); + const pot2_button = engine.getEntityOrNullByName("Pot2 Button"); + if (pot1 && pot2 && pot1_button && pot2_button) { + instancePot(pot1, 6 /* POT1 */, 48 /* PBAR5_A */, 49 /* PBAR5_B */); + instancePot(pot2, 7 /* POT2 */, 50 /* PBAR6_A */, 51 /* PBAR6_B */); + const pot1_button_events = getTriggerEvents(pot1_button); + pot1_button_events.on(TriggerType.ON_CLICK, () => { + console.log("BUTTON WAS PRESSED!!"); + startCooking(pot1); + }); + const pot2_button_events = getTriggerEvents(pot2_button); + pot2_button_events.on(TriggerType.ON_CLICK, () => { + console.log("BUTTON WAS PRESSED!!"); + startCooking(pot2); + }); + syncEntity(pot1_button, [Animator3.componentId, AudioSource2.componentId], 23 /* POT_BUTTON1 */); + syncEntity(pot2_button, [Animator3.componentId, AudioSource2.componentId], 24 /* POT_BUTTON2 */); + } + const restart = engine.getEntityOrNullByName("Restart_Button"); + if (restart) { + const restart_event = getTriggerEvents(restart); + restart_event.on(TriggerType.ON_CLICK, () => { + restartGame(); + }); + syncEntity(restart, [Animator3.componentId, AudioSource2.componentId], 27 /* RESET_BUTTON */); + } + CreateCustomer(1); + CreateCustomer(2); + CreateCustomer(3); + CreateCustomer(4); + const dispenserEntity = engine.addEntity(); + GltfContainer2.create(dispenserEntity, { + src: "assets/models/beerDispenser.glb" + }); + Transform2.create(dispenserEntity, { + position: Vector32.create(19.5, 1, 8.5), + rotation: Quaternion2.fromEulerDegrees(0, 270, 0) + }); + syncEntity(dispenserEntity, [], 19 /* BEER_DISPENSER */); + createTap(1 /* RED */, dispenserEntity, 1 /* TAP_RED */); + createTap(3 /* GREEN */, dispenserEntity, 3 /* TAP_YELLOW */); + createTap(2 /* YELLOW */, dispenserEntity, 2 /* TAP_GREEN */); + createCuttingBoard(Vector32.create(17.5, 1.1, 14.5), 4 /* CUTTER1 */); + createCuttingBoard(Vector32.create(15.5, 1.1, 14.5), 5 /* CUTTER2 */); + const beer1 = engine.getEntityOrNullByName("Beer1"); + const beer2 = engine.getEntityOrNullByName("Beer2"); + const beer3 = engine.getEntityOrNullByName("Beer3"); + const beer4 = engine.getEntityOrNullByName("Beer4"); + const beer5 = engine.getEntityOrNullByName("Beer5"); + const beer6 = engine.getEntityOrNullByName("Beer6"); + const beer7 = engine.getEntityOrNullByName("Beer7"); + const beer8 = engine.getEntityOrNullByName("Beer8"); + const beer9 = engine.getEntityOrNullByName("Beer9"); + if (beer1 && beer2 && beer3 && beer4 && beer5 && beer6 && beer7 && beer8 && beer9) { + instanceBeer(beer1, 10 /* GLASS1 */); + instanceBeer(beer2, 11 /* GLASS2 */); + instanceBeer(beer3, 12 /* GLASS3 */); + instanceBeer(beer4, 13 /* GLASS4 */); + instanceBeer(beer5, 14 /* GLASS5 */); + instanceBeer(beer6, 15 /* GLASS6 */); + instanceBeer(beer7, 16 /* GLASS7 */); + instanceBeer(beer8, 17 /* GLASS8 */); + instanceBeer(beer9, 18 /* GLASS9 */); + } + const cameraMod = engine.addEntity(); + Transform2.create(cameraMod, { position: Vector32.create(17, 2, 12) }); + CameraModeArea2.create(cameraMod, { + area: Vector32.create(6, 2, 10), + mode: CameraType.CT_FIRST_PERSON + }); + const score = engine.getEntityOrNullByName("Score"); + const misses = engine.getEntityOrNullByName("Misses"); + if (score && misses) { + syncEntity(score, [TextShape2.componentId], 21 /* SCORE_TEXT */); + syncEntity(misses, [TextShape2.componentId], 22 /* MISSES_TEXT */); + } + engine.addSystem(pickingGlassSystem); + engine.addSystem(tapPumpSystem); + engine.addSystem(cookSystem); + engine.addSystem(ProgressBarUpdate); + engine.addSystem(CustomerSystem); + setupUi(); +} + +// node_modules/@dcl/sdk/index.js +var import_EngineApi2 = require("~system/EngineApi"); + +// node_modules/@dcl/sdk/internal/transports/rendererTransport.js +function createRendererTransport(engineApi) { + async function sendToRenderer(message) { + const response = await engineApi.crdtSendToRenderer({ + data: new Uint8Array(message) + }); + if (response && response.data && response.data.length) { + if (rendererTransport2.onmessage) { + for (const byteArray of response.data) { + rendererTransport2.onmessage(byteArray); + } + } + } + } + const rendererTransport2 = { + async send(message) { + try { + await sendToRenderer(message); + } catch (error) { + console.error(error); + debugger; + } + }, + filter(message) { + if (message.componentId > MAX_STATIC_COMPONENT) { + return false; + } + return !!message; + }, + type: "renderer" + }; + return rendererTransport2; +} + +// node_modules/@dcl/sdk/internal/Observable.js +var ObserverEventState = class { + constructor(mask, skipNextObservers = false, target, currentTarget) { + this.initalize(mask, skipNextObservers, target, currentTarget); + } + initalize(mask, skipNextObservers = false, target, currentTarget) { + this.mask = mask; + this.skipNextObservers = skipNextObservers; + this.target = target; + this.currentTarget = currentTarget; + return this; + } +}; +var Observer = class { + constructor(callback, mask, scope = null) { + this.callback = callback; + this.mask = mask; + this.scope = scope; + this.unregisterOnNextCall = false; + this._willBeUnregistered = false; + } +}; +var Observable = class _Observable { + constructor(onObserverAdded) { + this._observers = new Array(); + this._onObserverAdded = null; + this._eventState = new ObserverEventState(0); + if (onObserverAdded) { + this._onObserverAdded = onObserverAdded; + } + } + add(callback, mask = -1, insertFirst = false, scope = null, unregisterOnFirstCall = false) { + if (!callback) { + return null; + } + const observer = new Observer(callback, mask, scope); + observer.unregisterOnNextCall = unregisterOnFirstCall; + if (insertFirst) { + this._observers.unshift(observer); + } else { + this._observers.push(observer); + } + if (this._onObserverAdded) { + this._onObserverAdded(observer); + } + return observer; + } + addOnce(callback) { + return this.add(callback, void 0, void 0, void 0, true); + } + remove(observer) { + if (!observer) { + return false; + } + const index = this._observers.indexOf(observer); + if (index !== -1) { + this._deferUnregister(observer); + return true; + } + return false; + } + removeCallback(callback, scope) { + for (let index = 0; index < this._observers.length; index++) { + if (this._observers[index].callback === callback && (!scope || scope === this._observers[index].scope)) { + this._deferUnregister(this._observers[index]); + return true; + } + } + return false; + } + notifyObservers(eventData, mask = -1, target, currentTarget) { + if (!this._observers.length) { + return true; + } + const state = this._eventState; + state.mask = mask; + state.target = target; + state.currentTarget = currentTarget; + state.skipNextObservers = false; + state.lastReturnValue = eventData; + for (const obs of this._observers) { + if (obs._willBeUnregistered) { + continue; + } + if (obs.mask & mask) { + if (obs.scope) { + state.lastReturnValue = obs.callback.apply(obs.scope, [eventData, state]); + } else { + state.lastReturnValue = obs.callback(eventData, state); + } + if (obs.unregisterOnNextCall) { + this._deferUnregister(obs); + } + } + if (state.skipNextObservers) { + return false; + } + } + return true; + } + notifyObserversWithPromise(eventData, mask = -1, target, currentTarget) { + let p = Promise.resolve(eventData); + if (!this._observers.length) { + return p; + } + const state = this._eventState; + state.mask = mask; + state.target = target; + state.currentTarget = currentTarget; + state.skipNextObservers = false; + this._observers.forEach((obs) => { + if (state.skipNextObservers) { + return; + } + if (obs._willBeUnregistered) { + return; + } + if (obs.mask & mask) { + if (obs.scope) { + p = p.then((lastReturnedValue) => { + state.lastReturnValue = lastReturnedValue; + return obs.callback.apply(obs.scope, [eventData, state]); + }); + } else { + p = p.then((lastReturnedValue) => { + state.lastReturnValue = lastReturnedValue; + return obs.callback(eventData, state); + }); + } + if (obs.unregisterOnNextCall) { + this._deferUnregister(obs); + } + } + }); + return p.then(() => { + return eventData; + }); + } + notifyObserver(observer, eventData, mask = -1) { + const state = this._eventState; + state.mask = mask; + state.skipNextObservers = false; + observer.callback(eventData, state); + } + hasObservers() { + return this._observers.length > 0; + } + clear() { + this._observers = new Array(); + this._onObserverAdded = null; + } + clone() { + const result = new _Observable(); + result._observers = this._observers.slice(0); + return result; + } + hasSpecificMask(mask = -1) { + for (const obs of this._observers) { + if (obs.mask & mask || obs.mask === mask) { + return true; + } + } + return false; + } + _deferUnregister(observer) { + observer.unregisterOnNextCall = false; + observer._willBeUnregistered = true; + Promise.resolve().then.bind(Promise.resolve())(async () => this._remove(observer)).catch(console.error); + } + _remove(observer) { + if (!observer) { + return false; + } + const index = this._observers.indexOf(observer); + if (index !== -1) { + this._observers.splice(index, 1); + return true; + } + return false; + } +}; + +// node_modules/@dcl/sdk/observables.js +var import_EngineApi = require("~system/EngineApi"); +var subscribeFunction = import_EngineApi.subscribe; +function createSubscriber(eventName) { + return () => { + subscribeFunction({ eventId: eventName }).catch(console.error); + }; +} +var onEnterSceneObservable = new Observable(createSubscriber("onEnterScene")); +var onLeaveSceneObservable = new Observable(createSubscriber("onLeaveScene")); +var onSceneReadyObservable = new Observable(createSubscriber("sceneStart")); +var onPlayerExpressionObservable = new Observable(createSubscriber("playerExpression")); +var onVideoEvent = new Observable(createSubscriber("videoEvent")); +var onProfileChanged = new Observable(createSubscriber("profileChanged")); +var onPlayerConnectedObservable = new Observable(createSubscriber("playerConnected")); +var onPlayerDisconnectedObservable = new Observable(createSubscriber("playerDisconnected")); +var onRealmChangedObservable = new Observable(createSubscriber("onRealmChanged")); +var onPlayerClickedObservable = new Observable(createSubscriber("playerClicked")); +var onCommsMessage = new Observable(createSubscriber("comms")); +async function pollEvents(sendBatch2) { + const { events } = await sendBatch2({ actions: [] }); + for (const e of events) { + if (e.generic) { + const data = JSON.parse(e.generic.eventData); + switch (e.generic.eventId) { + case "onEnterScene": { + onEnterSceneObservable.notifyObservers(data); + break; + } + case "onLeaveScene": { + onLeaveSceneObservable.notifyObservers(data); + break; + } + case "sceneStart": { + onSceneReadyObservable.notifyObservers(data); + break; + } + case "playerExpression": { + onPlayerExpressionObservable.notifyObservers(data); + break; + } + case "videoEvent": { + const videoData = data; + onVideoEvent.notifyObservers(videoData); + break; + } + case "profileChanged": { + onProfileChanged.notifyObservers(data); + break; + } + case "playerConnected": { + onPlayerConnectedObservable.notifyObservers(data); + break; + } + case "playerDisconnected": { + onPlayerDisconnectedObservable.notifyObservers(data); + break; + } + case "onRealmChanged": { + onRealmChangedObservable.notifyObservers(data); + break; + } + case "playerClicked": { + onPlayerClickedObservable.notifyObservers(data); + break; + } + case "comms": { + onCommsMessage.notifyObservers(data); + break; + } + } + } + } +} + +// sdk-composite:all-composites +var compositeFromLoader = { "assets/scene/main.composite": { "version": 1, "components": [{ "name": "composite::root", "jsonSchema": { "type": "object", "properties": { "src": { "type": "string", "serializationType": "utf8-string" }, "entities": { "type": "array", "items": { "type": "object", "properties": { "src": { "type": "integer", "serializationType": "entity" }, "dest": { "type": "integer", "serializationType": "entity" } }, "serializationType": "map" }, "serializationType": "array" } }, "serializationType": "map" }, "data": {} }, { "name": "core::Transform", "jsonSchema": { "type": "object", "properties": { "position": { "type": "object", "properties": { "x": { "type": "number" }, "y": { "type": "number" }, "z": { "type": "number" } } }, "scale": { "type": "object", "properties": { "x": { "type": "number" }, "y": { "type": "number" }, "z": { "type": "number" } } }, "rotation": { "type": "object", "properties": { "x": { "type": "number" }, "y": { "type": "number" }, "z": { "type": "number" }, "w": { "type": "number" } } }, "parent": { "type": "integer" } }, "serializationType": "transform" }, "data": { "513": { "json": { "position": { "x": 11, "y": 0, "z": 11 }, "scale": { "x": 1, "y": 1, "z": 1 }, "rotation": { "x": 0, "y": 1, "z": 0, "w": 6123234262925839e-32 }, "parent": 0 } }, "514": { "json": { "position": { "x": 19.462968826293945, "y": 1.0224852561950684, "z": 10.496221542358398 }, "scale": { "x": 0.9999999403953552, "y": 1, "z": 0.9999999403953552 }, "rotation": { "x": 0, "y": -0.7071067690849304, "z": 0, "w": 0.7071067690849304 }, "parent": 0 } }, "515": { "json": { "position": { "x": 19.35105323791504, "y": 1.0425816774368286, "z": 12.364835739135742 }, "scale": { "x": 0.9999999403953552, "y": 1, "z": 0.9999999403953552 }, "rotation": { "x": 0, "y": -0.7071067690849304, "z": 0, "w": 0.7071067690849304 }, "parent": 0 } }, "516": { "json": { "position": { "x": 18.510000228881836, "y": 1.0099999904632568, "z": 14.539999961853027 }, "scale": { "x": 1, "y": 1, "z": 1 }, "rotation": { "x": 0, "y": 0.7071067690849304, "z": 0, "w": 0.7071067690849304 }, "parent": 0 } }, "517": { "json": { "position": { "x": 16.479999542236328, "y": 1.0099999904632568, "z": 14.529999732971191 }, "scale": { "x": 1, "y": 1, "z": 1 }, "rotation": { "x": 0, "y": 0.7071067690849304, "z": 0, "w": 0.7071067690849304 }, "parent": 0 } }, "518": { "json": { "position": { "x": 19.096506118774414, "y": 0.7099999785423279, "z": 12.5 }, "scale": { "x": 0.9999999403953552, "y": 0.9999999403953552, "z": 1 }, "rotation": { "x": 0, "y": 0, "z": 0.7071067690849304, "w": 0.7071067690849304 }, "parent": 0 } }, "519": { "json": { "position": { "x": 19.096506118774414, "y": 0.7099999785423279, "z": 10.548395156860352 }, "scale": { "x": 0.9999998807907104, "y": 0.9999998807907104, "z": 1 }, "rotation": { "x": 0, "y": 0, "z": 0.7071067690849304, "w": 0.7071067690849304 }, "parent": 0 } }, "520": { "json": { "position": { "x": 18.46963119506836, "y": 0.7099999785423279, "z": 14.05458927154541 }, "scale": { "x": 1, "y": 1, "z": 1 }, "rotation": { "x": -0.5, "y": -0.5, "z": 0.5, "w": 0.5 }, "parent": 0 } }, "521": { "json": { "position": { "x": 16.46424102783203, "y": 0.7099999785423279, "z": 14.05458927154541 }, "rotation": { "x": -0.5, "y": -0.5, "z": 0.5, "w": 0.5 }, "scale": { "x": 1, "y": 1, "z": 1 }, "parent": 0 } }, "522": { "json": { "position": { "x": 14.706628799438477, "y": 1.012992262840271, "z": 9.178457260131836 }, "scale": { "x": 1, "y": 1, "z": 1 }, "rotation": { "x": 0, "y": 0.6473962068557739, "z": 0, "w": 0.7621536254882812 }, "parent": 0 } }, "523": { "json": { "position": { "x": 14.002402305603027, "y": 1.012992262840271, "z": 9.178457260131836 }, "scale": { "x": 1, "y": 1, "z": 1 }, "rotation": { "x": 0, "y": 0.6473961472511292, "z": 0, "w": 0.762153685092926 }, "parent": 0 } }, "524": { "json": { "position": { "x": 19.233787536621094, "y": 1.012992262840271, "z": 11.185989379882812 }, "scale": { "x": 1, "y": 1, "z": 1 }, "rotation": { "x": 0, "y": 0.6473961472511292, "z": 0, "w": 0.762153685092926 }, "parent": 0 } }, "525": { "json": { "position": { "x": 19.233787536621094, "y": 1.012992262840271, "z": 13.173835754394531 }, "scale": { "x": 1, "y": 1, "z": 1 }, "rotation": { "x": 0, "y": 0.6473961472511292, "z": 0, "w": 0.762153685092926 }, "parent": 0 } }, "526": { "json": { "position": { "x": 18.64331817626953, "y": 0.029041828587651253, "z": 7.3249101638793945 }, "scale": { "x": 1, "y": 1, "z": 1 }, "rotation": { "x": 0, "y": 0.6473961472511292, "z": 0, "w": 0.762153685092926 }, "parent": 0 } }, "527": { "json": { "position": { "x": 12.185543060302734, "y": 0.07731946557760239, "z": 1.911895751953125 }, "scale": { "x": 1, "y": 1, "z": 1 }, "rotation": { "x": 0, "y": 0.6473961472511292, "z": 0, "w": 0.762153685092926 }, "parent": 0 } }, "528": { "json": { "position": { "x": 13.326274871826172, "y": 0.07731946557760239, "z": 11.485663414001465 }, "scale": { "x": 1, "y": 1, "z": 1 }, "rotation": { "x": 0, "y": 0.17769677937030792, "z": 0, "w": 0.9840852618217468 }, "parent": 0 } }, "529": { "json": { "position": { "x": 14.002402305603027, "y": 1.012992262840271, "z": 14.68221664428711 }, "scale": { "x": 1, "y": 1, "z": 1 }, "rotation": { "x": 0, "y": 0.6473961472511292, "z": 0, "w": 0.762153685092926 }, "parent": 0 } }, "530": { "json": { "position": { "x": 14.407966613769531, "y": 1.012992262840271, "z": 14.085762977600098 }, "scale": { "x": 1, "y": 1, "z": 1 }, "rotation": { "x": 0, "y": 0.6473961472511292, "z": 0, "w": 0.762153685092926 }, "parent": 0 } }, "531": { "json": { "position": { "x": 16.843204498291016, "y": 2.992232322692871, "z": 14.752776145935059 }, "rotation": { "x": 0, "y": 0, "z": 0, "w": 1 }, "scale": { "x": 1, "y": 1, "z": 1 }, "parent": 0 } }, "532": { "json": { "position": { "x": 16.843204498291016, "y": 2.4553236961364746, "z": 14.752776145935059 }, "rotation": { "x": 0, "y": 0, "z": 0, "w": 1 }, "scale": { "x": 1, "y": 1, "z": 1 }, "parent": 0 } }, "534": { "json": { "position": { "x": 8, "y": -0.05000000074505806, "z": 8 }, "rotation": { "x": 0, "y": 0, "z": 0, "w": 1 }, "scale": { "x": 1, "y": 1, "z": 1 }, "parent": 0 } }, "535": { "json": { "position": { "x": 24, "y": -0.05000000074505806, "z": 8 }, "rotation": { "x": 0, "y": 0, "z": 0, "w": 1 }, "scale": { "x": 1, "y": 1, "z": 1 }, "parent": 0 } }, "536": { "json": { "position": { "x": 24, "y": -0.05000000074505806, "z": 24 }, "rotation": { "x": 0, "y": 0, "z": 0, "w": 1 }, "scale": { "x": 1, "y": 1, "z": 1 }, "parent": 0 } }, "537": { "json": { "position": { "x": 8, "y": -0.05000000074505806, "z": 24 }, "rotation": { "x": 0, "y": 0, "z": 0, "w": 1 }, "scale": { "x": 1, "y": 1, "z": 1 }, "parent": 0 } }, "538": { "json": { "position": { "x": 17.479999542236328, "y": 1.2400000095367432, "z": 7.019999980926514 }, "rotation": { "x": 0.7071067690849304, "y": 0, "z": 0, "w": 0.7071067690849304 }, "scale": { "x": 0.75, "y": 0.75, "z": 0.75 }, "parent": 0 } }, "539": { "json": { "position": { "x": 17.445201873779297, "y": 1.742148756980896, "z": 7.010000228881836 }, "rotation": { "x": 0, "y": 1, "z": 0, "w": 6123234262925839e-32 }, "scale": { "x": 1, "y": 1, "z": 1 }, "parent": 0 } }, "540": { "json": { "position": { "x": 12.081329345703125, "y": 4.309999942779541, "z": 1.010474443435669 }, "rotation": { "x": 0, "y": 1, "z": 0, "w": 6123234262925839e-32 }, "scale": { "x": 1, "y": 1, "z": 1 }, "parent": 0 } }, "541": { "json": { "position": { "x": 0.9356998801231384, "y": 4.95363712310791, "z": 12.010000228881836 }, "rotation": { "x": -0.7071067690849304, "y": -4329780632585522e-32, "z": 0.7071067690849304, "w": 4329780632585522e-32 }, "scale": { "x": 0.9999999403953552, "y": 0.9999999403953552, "z": 0.9999999403953552 }, "parent": 0 } } } }, { "name": "core::GltfContainer", "jsonSchema": { "type": "object", "properties": {}, "serializationType": "protocol-buffer", "protocolBuffer": "PBGltfContainer" }, "data": { "513": { "json": { "src": "assets/models/Environment.glb", "visibleMeshesCollisionMask": 1, "invisibleMeshesCollisionMask": 2 } }, "514": { "json": { "src": "assets/models/ExpenderNoodles.glb", "visibleMeshesCollisionMask": 1, "invisibleMeshesCollisionMask": 2 } }, "515": { "json": { "src": "assets/models/ExpenderRolls.glb", "visibleMeshesCollisionMask": 1, "invisibleMeshesCollisionMask": 2 } }, "516": { "json": { "src": "assets/models/CookingPotClean.glb", "visibleMeshesCollisionMask": 1, "invisibleMeshesCollisionMask": 2 } }, "517": { "json": { "src": "assets/models/CookingPotClean.glb", "visibleMeshesCollisionMask": 1, "invisibleMeshesCollisionMask": 2 } }, "518": { "json": { "src": "assets/builder/red_button/red_button.glb", "visibleMeshesCollisionMask": 1, "invisibleMeshesCollisionMask": 2 } }, "519": { "json": { "src": "assets/builder/red_button/red_button.glb", "visibleMeshesCollisionMask": 1, "invisibleMeshesCollisionMask": 2 } }, "520": { "json": { "src": "assets/builder/red_button/red_button.glb", "visibleMeshesCollisionMask": 1, "invisibleMeshesCollisionMask": 2 } }, "521": { "json": { "src": "assets/builder/red_button/red_button.glb", "visibleMeshesCollisionMask": 1, "invisibleMeshesCollisionMask": 2 } }, "522": { "json": { "src": "assets/models/beerGlass.glb", "visibleMeshesCollisionMask": 1, "invisibleMeshesCollisionMask": 2 } }, "523": { "json": { "src": "assets/models/beerGlass.glb", "visibleMeshesCollisionMask": 1, "invisibleMeshesCollisionMask": 2 } }, "524": { "json": { "src": "assets/models/beerGlass.glb", "visibleMeshesCollisionMask": 1, "invisibleMeshesCollisionMask": 2 } }, "525": { "json": { "src": "assets/models/beerGlass.glb", "visibleMeshesCollisionMask": 1, "invisibleMeshesCollisionMask": 2 } }, "526": { "json": { "src": "assets/models/beerGlass.glb", "visibleMeshesCollisionMask": 1, "invisibleMeshesCollisionMask": 2 } }, "527": { "json": { "src": "assets/models/beerGlass.glb", "visibleMeshesCollisionMask": 1, "invisibleMeshesCollisionMask": 2 } }, "528": { "json": { "src": "assets/models/beerGlass.glb", "visibleMeshesCollisionMask": 1, "invisibleMeshesCollisionMask": 2 } }, "529": { "json": { "src": "assets/models/beerGlass.glb", "visibleMeshesCollisionMask": 1, "invisibleMeshesCollisionMask": 2 } }, "530": { "json": { "src": "assets/models/beerGlass.glb", "visibleMeshesCollisionMask": 1, "invisibleMeshesCollisionMask": 2 } }, "534": { "json": { "src": "assets/builder/concrete/FloorBaseConcrete_01/FloorBaseConcrete_01.glb", "visibleMeshesCollisionMask": 1, "invisibleMeshesCollisionMask": 2 } }, "535": { "json": { "src": "assets/builder/concrete/FloorBaseConcrete_01/FloorBaseConcrete_01.glb", "visibleMeshesCollisionMask": 1, "invisibleMeshesCollisionMask": 2 } }, "536": { "json": { "src": "assets/builder/concrete/FloorBaseConcrete_01/FloorBaseConcrete_01.glb", "visibleMeshesCollisionMask": 1, "invisibleMeshesCollisionMask": 2 } }, "537": { "json": { "src": "assets/builder/concrete/FloorBaseConcrete_01/FloorBaseConcrete_01.glb", "visibleMeshesCollisionMask": 1, "invisibleMeshesCollisionMask": 2 } }, "538": { "json": { "src": "assets/builder/red_light_button/red_scifi_button.glb", "visibleMeshesCollisionMask": 1, "invisibleMeshesCollisionMask": 2 } }, "540": { "json": { "src": "assets/builder/arrow_sign/Arrow_Sign.glb", "visibleMeshesCollisionMask": 1, "invisibleMeshesCollisionMask": 2 } }, "541": { "json": { "src": "assets/builder/arrow_sign/Arrow_Sign.glb", "visibleMeshesCollisionMask": 1, "invisibleMeshesCollisionMask": 2 } } } }, { "name": "core-schema::Name", "jsonSchema": { "type": "object", "properties": { "value": { "type": "string", "serializationType": "utf8-string" } }, "serializationType": "map" }, "data": { "513": { "json": { "value": "Environment.glb" } }, "514": { "json": { "value": "ExpenderNoodles" } }, "515": { "json": { "value": "ExpenderRolls" } }, "516": { "json": { "value": "Pot1" } }, "517": { "json": { "value": "Pot2" } }, "518": { "json": { "value": "Roll Button" } }, "519": { "json": { "value": "Noodle Button" } }, "520": { "json": { "value": "Pot1 Button" } }, "521": { "json": { "value": "Pot2 Button" } }, "522": { "json": { "value": "Beer1" } }, "523": { "json": { "value": "Beer2" } }, "524": { "json": { "value": "Beer3" } }, "525": { "json": { "value": "Beer4" } }, "526": { "json": { "value": "Beer5" } }, "527": { "json": { "value": "Beer6" } }, "528": { "json": { "value": "Beer7" } }, "529": { "json": { "value": "Beer8" } }, "530": { "json": { "value": "Beer9" } }, "531": { "json": { "value": "Score" } }, "532": { "json": { "value": "Misses" } }, "534": { "json": { "value": "Concrete" } }, "535": { "json": { "value": "Concrete" } }, "536": { "json": { "value": "Concrete" } }, "537": { "json": { "value": "Concrete" } }, "538": { "json": { "value": "Restart_Button" } }, "539": { "json": { "value": "Text" } }, "540": { "json": { "value": "Arrow Sign" } }, "541": { "json": { "value": "Arrow Sign" } } } }, { "name": "core::TextShape", "jsonSchema": { "type": "object", "properties": {}, "serializationType": "protocol-buffer", "protocolBuffer": "PBTextShape" }, "data": { "531": { "json": { "text": "Score: 0", "font": 2, "fontSize": 6, "fontAutoSize": false, "textAlign": 4, "width": 100, "height": 100, "paddingTop": 0, "paddingRight": 0, "paddingBottom": 0, "paddingLeft": 0, "lineSpacing": 0, "lineCount": 1, "textWrapping": false, "shadowBlur": 0, "shadowOffsetX": 0, "shadowOffsetY": 0, "outlineWidth": 0, "shadowColor": { "r": 1, "g": 1, "b": 1 }, "outlineColor": { "r": 1, "g": 1, "b": 1 }, "textColor": { "r": 1, "g": 1, "b": 1, "a": 1 } } }, "532": { "json": { "text": "Misses: 0", "font": 2, "fontSize": 4, "fontAutoSize": false, "textAlign": 4, "width": 100, "height": 100, "paddingTop": 0, "paddingRight": 0, "paddingBottom": 0, "paddingLeft": 0, "lineSpacing": 0, "lineCount": 1, "textWrapping": false, "shadowBlur": 0, "shadowOffsetX": 0, "shadowOffsetY": 0, "outlineWidth": 0, "shadowColor": { "r": 1, "g": 1, "b": 1 }, "outlineColor": { "r": 1, "g": 1, "b": 1 }, "textColor": { "r": 1, "g": 0, "b": 0, "a": 1 } } }, "539": { "json": { "text": "Restart", "font": 2, "fontSize": 3, "fontAutoSize": false, "textAlign": 4, "width": 100, "height": 100, "paddingTop": 0, "paddingRight": 0, "paddingBottom": 0, "paddingLeft": 0, "lineSpacing": 0, "lineCount": 1, "textWrapping": false, "shadowBlur": 0, "shadowOffsetX": 0, "shadowOffsetY": 0, "outlineWidth": 0, "shadowColor": { "r": 1, "g": 1, "b": 1 }, "outlineColor": { "r": 1, "g": 1, "b": 1 }, "textColor": { "r": 1, "g": 1, "b": 1, "a": 1 } } } } }, { "name": "core::Animator", "jsonSchema": { "type": "object", "properties": {}, "serializationType": "protocol-buffer", "protocolBuffer": "PBAnimator" }, "data": { "518": { "json": { "states": [{ "clip": "trigger", "playing": false, "weight": 1, "speed": 1, "loop": false, "shouldReset": false }] } }, "519": { "json": { "states": [{ "clip": "trigger", "playing": false, "weight": 1, "speed": 1, "loop": false, "shouldReset": false }] } }, "520": { "json": { "states": [{ "clip": "trigger", "playing": false, "weight": 1, "speed": 1, "loop": false, "shouldReset": false }] } }, "521": { "json": { "states": [{ "clip": "trigger", "playing": false, "weight": 1, "speed": 1, "loop": false, "shouldReset": false }] } }, "522": { "json": { "states": [{ "clip": "PourRed", "playing": false, "weight": 1, "speed": 1, "loop": false, "shouldReset": false }, { "clip": "Blank", "playing": true, "weight": 1, "speed": 1, "loop": false, "shouldReset": false }, { "clip": "PourYellow", "playing": false, "weight": 1, "speed": 1, "loop": false, "shouldReset": false }, { "clip": "PourGreen", "playing": false, "weight": 1, "speed": 1, "loop": false, "shouldReset": false }] } }, "523": { "json": { "states": [{ "clip": "PourRed", "playing": false, "weight": 1, "speed": 1, "loop": false, "shouldReset": false }, { "clip": "Blank", "playing": true, "weight": 1, "speed": 1, "loop": false, "shouldReset": false }, { "clip": "PourYellow", "playing": false, "weight": 1, "speed": 1, "loop": false, "shouldReset": false }, { "clip": "PourGreen", "playing": false, "weight": 1, "speed": 1, "loop": false, "shouldReset": false }] } }, "524": { "json": { "states": [{ "clip": "PourRed", "playing": false, "weight": 1, "speed": 1, "loop": false, "shouldReset": false }, { "clip": "Blank", "playing": true, "weight": 1, "speed": 1, "loop": false, "shouldReset": false }, { "clip": "PourYellow", "playing": false, "weight": 1, "speed": 1, "loop": false, "shouldReset": false }, { "clip": "PourGreen", "playing": false, "weight": 1, "speed": 1, "loop": false, "shouldReset": false }] } }, "525": { "json": { "states": [{ "clip": "PourRed", "playing": false, "weight": 1, "speed": 1, "loop": false, "shouldReset": false }, { "clip": "Blank", "playing": true, "weight": 1, "speed": 1, "loop": false, "shouldReset": false }, { "clip": "PourYellow", "playing": false, "weight": 1, "speed": 1, "loop": false, "shouldReset": false }, { "clip": "PourGreen", "playing": false, "weight": 1, "speed": 1, "loop": false, "shouldReset": false }] } }, "526": { "json": { "states": [{ "clip": "PourRed", "playing": false, "weight": 1, "speed": 1, "loop": false, "shouldReset": false }, { "clip": "Blank", "playing": true, "weight": 1, "speed": 1, "loop": false, "shouldReset": false }, { "clip": "PourYellow", "playing": false, "weight": 1, "speed": 1, "loop": false, "shouldReset": false }, { "clip": "PourGreen", "playing": false, "weight": 1, "speed": 1, "loop": false, "shouldReset": false }] } }, "527": { "json": { "states": [{ "clip": "PourRed", "playing": false, "weight": 1, "speed": 1, "loop": false, "shouldReset": false }, { "clip": "Blank", "playing": true, "weight": 1, "speed": 1, "loop": false, "shouldReset": false }, { "clip": "PourYellow", "playing": false, "weight": 1, "speed": 1, "loop": false, "shouldReset": false }, { "clip": "PourGreen", "playing": false, "weight": 1, "speed": 1, "loop": false, "shouldReset": false }] } }, "528": { "json": { "states": [{ "clip": "PourRed", "playing": false, "weight": 1, "speed": 1, "loop": false, "shouldReset": false }, { "clip": "Blank", "playing": true, "weight": 1, "speed": 1, "loop": false, "shouldReset": false }, { "clip": "PourYellow", "playing": false, "weight": 1, "speed": 1, "loop": false, "shouldReset": false }, { "clip": "PourGreen", "playing": false, "weight": 1, "speed": 1, "loop": false, "shouldReset": false }] } }, "529": { "json": { "states": [{ "clip": "PourRed", "playing": false, "weight": 1, "speed": 1, "loop": false, "shouldReset": false }, { "clip": "Blank", "playing": true, "weight": 1, "speed": 1, "loop": false, "shouldReset": false }, { "clip": "PourYellow", "playing": false, "weight": 1, "speed": 1, "loop": false, "shouldReset": false }, { "clip": "PourGreen", "playing": false, "weight": 1, "speed": 1, "loop": false, "shouldReset": false }] } }, "530": { "json": { "states": [{ "clip": "PourRed", "playing": false, "weight": 1, "speed": 1, "loop": false, "shouldReset": false }, { "clip": "Blank", "playing": true, "weight": 1, "speed": 1, "loop": false, "shouldReset": false }, { "clip": "PourYellow", "playing": false, "weight": 1, "speed": 1, "loop": false, "shouldReset": false }, { "clip": "PourGreen", "playing": false, "weight": 1, "speed": 1, "loop": false, "shouldReset": false }] } }, "538": { "json": { "states": [{ "clip": "trigger", "playing": false, "weight": 1, "speed": 1, "loop": false, "shouldReset": false }] } } } }, { "name": "core::PointerEvents", "jsonSchema": { "type": "object", "properties": {}, "serializationType": "protocol-buffer", "protocolBuffer": "PBPointerEvents" }, "data": { "513": { "json": { "pointerEvents": [{ "eventType": 1, "eventInfo": { "button": 3, "hoverText": "Interact", "maxDistance": 10, "showFeedback": false } }] } }, "522": { "json": { "pointerEvents": [{ "eventType": 1, "eventInfo": { "button": 1, "hoverText": "Pick Up", "maxDistance": 5, "showFeedback": true } }] } }, "523": { "json": { "pointerEvents": [{ "eventType": 1, "eventInfo": { "button": 1, "hoverText": "Pick Up", "maxDistance": 5, "showFeedback": true } }] } }, "524": { "json": { "pointerEvents": [{ "eventType": 1, "eventInfo": { "button": 1, "hoverText": "Pick Up", "maxDistance": 5, "showFeedback": true } }] } }, "525": { "json": { "pointerEvents": [{ "eventType": 1, "eventInfo": { "button": 1, "hoverText": "Pick Up", "maxDistance": 5, "showFeedback": true } }] } }, "526": { "json": { "pointerEvents": [{ "eventType": 1, "eventInfo": { "button": 1, "hoverText": "Pick Up", "maxDistance": 5, "showFeedback": true } }] } }, "527": { "json": { "pointerEvents": [{ "eventType": 1, "eventInfo": { "button": 1, "hoverText": "Pick Up", "maxDistance": 5, "showFeedback": true } }] } }, "528": { "json": { "pointerEvents": [{ "eventType": 1, "eventInfo": { "button": 1, "hoverText": "Pick Up", "maxDistance": 5, "showFeedback": true } }] } }, "529": { "json": { "pointerEvents": [{ "eventType": 1, "eventInfo": { "button": 1, "hoverText": "Pick Up", "maxDistance": 5, "showFeedback": true } }] } }, "530": { "json": { "pointerEvents": [{ "eventType": 1, "eventInfo": { "button": 1, "hoverText": "Pick Up", "maxDistance": 5, "showFeedback": true } }] } }, "538": { "json": { "pointerEvents": [{ "eventType": 1, "eventInfo": { "button": 0, "hoverText": "Restart", "maxDistance": 10, "showFeedback": true } }] } } } }, { "name": "inspector::Selection", "jsonSchema": { "type": "object", "properties": { "gizmo": { "type": "integer", "serializationType": "int32" } }, "serializationType": "map" }, "data": { "538": { "json": { "gizmo": 0 } } } }, { "name": "inspector::Scene", "jsonSchema": { "type": "object", "properties": { "layout": { "type": "object", "properties": { "base": { "type": "object", "properties": { "x": { "type": "integer", "serializationType": "int32" }, "y": { "type": "integer", "serializationType": "int32" } }, "serializationType": "map" }, "parcels": { "type": "array", "items": { "type": "object", "properties": { "x": { "type": "integer", "serializationType": "int32" }, "y": { "type": "integer", "serializationType": "int32" } }, "serializationType": "map" }, "serializationType": "array" } }, "serializationType": "map" } }, "serializationType": "map" }, "data": { "0": { "json": { "layout": { "base": { "x": 0, "y": 0 }, "parcels": [{ "x": 0, "y": 0 }, { "x": 0, "y": 1 }, { "x": 1, "y": 0 }, { "x": 1, "y": 1 }] } } } } }, { "name": "inspector::Nodes", "jsonSchema": { "type": "object", "properties": { "value": { "type": "array", "items": { "type": "object", "properties": { "entity": { "type": "integer", "serializationType": "entity" }, "open": { "type": "boolean", "serializationType": "optional", "optionalJsonSchema": { "type": "boolean", "serializationType": "boolean" } }, "children": { "type": "array", "items": { "type": "integer", "serializationType": "entity" }, "serializationType": "array" } }, "serializationType": "map" }, "serializationType": "array" } }, "serializationType": "map" }, "data": { "0": { "json": { "value": [{ "entity": 512, "open": true, "children": [513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540] }, { "entity": 513, "children": [] }, { "entity": 514, "children": [] }, { "entity": 515, "children": [] }, { "entity": 516, "children": [] }, { "entity": 517, "children": [] }, { "entity": 518, "children": [] }, { "entity": 519, "children": [] }, { "entity": 520, "children": [] }, { "entity": 521, "children": [] }, { "entity": 522, "children": [] }, { "entity": 523, "children": [] }, { "entity": 524, "children": [] }, { "entity": 525, "children": [] }, { "entity": 526, "children": [] }, { "entity": 527, "children": [] }, { "entity": 528, "children": [] }, { "entity": 529, "children": [] }, { "entity": 530, "children": [] }, { "entity": 531, "children": [] }, { "entity": 532, "children": [] }, { "entity": 533, "children": [] }, { "entity": 534, "children": [] }, { "entity": 535, "children": [] }, { "entity": 536, "children": [] }, { "entity": 537, "children": [] }, { "entity": 538, "children": [] }, { "entity": 539, "children": [] }, { "entity": 540, "children": [] }] } } } }, { "name": "asset-packs::ActionTypes", "jsonSchema": { "type": "object", "properties": { "value": { "type": "array", "items": { "type": "object", "properties": { "type": { "type": "string", "serializationType": "utf8-string" }, "jsonSchema": { "type": "string", "serializationType": "utf8-string" } }, "serializationType": "map" }, "serializationType": "array" } }, "serializationType": "map" }, "data": { "0": { "json": { "value": [{ "type": "play_animation", "jsonSchema": '{"type":"object","properties":{"animation":{"type":"string","serializationType":"utf8-string"},"loop":{"type":"boolean","serializationType":"optional","optionalJsonSchema":{"type":"boolean","serializationType":"boolean"}}},"serializationType":"map"}' }, { "type": "stop_animation", "jsonSchema": '{"type":"object","properties":{},"serializationType":"map"}' }, { "type": "set_state", "jsonSchema": '{"type":"object","properties":{"state":{"type":"string","serializationType":"utf8-string"}},"serializationType":"map"}' }, { "type": "start_tween", "jsonSchema": '{"type":"object","properties":{"type":{"type":"string","enum":["move_item","rotate_item","scale_item"],"default":"move_item","serializationType":"enum-string","enumObject":{"MOVE_ITEM":"move_item","ROTATE_ITEM":"rotate_item","SCALE_ITEM":"scale_item"}},"end":{"type":"object","properties":{"x":{"type":"number"},"y":{"type":"number"},"z":{"type":"number"},"w":{"type":"number"}},"serializationType":"vector3"},"interpolationType":{"type":"string","enum":["linear","easeinquad","easeoutquad","easequad","easeinsine","easeoutsine","easeinoutsine","easeinexpo","easeoutexpo","easeinoutexpo","easeinelastic","easeoutelastic","easeinoutelastic","easeinbounce","easeoutbounce","easeinoutbounce"],"default":"linear","serializationType":"enum-string","enumObject":{"LINEAR":"linear","EASEINQUAD":"easeinquad","EASEOUTQUAD":"easeoutquad","EASEQUAD":"easequad","EASEINSINE":"easeinsine","EASEOUTSINE":"easeoutsine","EASESINE":"easeinoutsine","EASEINEXPO":"easeinexpo","EASEOUTEXPO":"easeoutexpo","EASEEXPO":"easeinoutexpo","EASEINELASTIC":"easeinelastic","EASEOUTELASTIC":"easeoutelastic","EASEELASTIC":"easeinoutelastic","EASEINBOUNCE":"easeinbounce","EASEOUTEBOUNCE":"easeoutbounce","EASEBOUNCE":"easeinoutbounce"}},"duration":{"type":"number","serializationType":"float32"},"relative":{"type":"boolean","serializationType":"boolean"}},"serializationType":"map"}' }, { "type": "set_counter", "jsonSchema": '{"type":"object","properties":{"counter":{"type":"integer","serializationType":"int32"}},"serializationType":"map"}' }, { "type": "increment_counter", "jsonSchema": '{"type":"object","properties":{},"serializationType":"map"}' }, { "type": "decrease_counter", "jsonSchema": '{"type":"object","properties":{},"serializationType":"map"}' }, { "type": "play_sound", "jsonSchema": '{"type":"object","properties":{"src":{"type":"string","serializationType":"utf8-string"},"loop":{"type":"boolean","serializationType":"optional","optionalJsonSchema":{"type":"boolean","serializationType":"boolean"}},"volume":{"type":"number","serializationType":"optional","optionalJsonSchema":{"type":"number","serializationType":"float32"}}},"serializationType":"map"}' }, { "type": "stop_sound", "jsonSchema": '{"type":"object","properties":{},"serializationType":"map"}' }, { "type": "set_visibility", "jsonSchema": '{"type":"object","properties":{"visible":{"type":"boolean","serializationType":"boolean"},"physicsCollider":{"type":"boolean","serializationType":"optional","optionalJsonSchema":{"type":"boolean","serializationType":"boolean"}},"collider":{"type":"integer","serializationType":"optional","optionalJsonSchema":{"type":"integer","enum":[0,1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768],"default":1,"serializationType":"enum-int","enumObject":{"0":"CL_NONE","1":"CL_POINTER","2":"CL_PHYSICS","4":"CL_RESERVED1","8":"CL_RESERVED2","16":"CL_RESERVED3","32":"CL_RESERVED4","64":"CL_RESERVED5","128":"CL_RESERVED6","256":"CL_CUSTOM1","512":"CL_CUSTOM2","1024":"CL_CUSTOM3","2048":"CL_CUSTOM4","4096":"CL_CUSTOM5","8192":"CL_CUSTOM6","16384":"CL_CUSTOM7","32768":"CL_CUSTOM8","CL_NONE":0,"CL_POINTER":1,"CL_PHYSICS":2,"CL_RESERVED1":4,"CL_RESERVED2":8,"CL_RESERVED3":16,"CL_RESERVED4":32,"CL_RESERVED5":64,"CL_RESERVED6":128,"CL_CUSTOM1":256,"CL_CUSTOM2":512,"CL_CUSTOM3":1024,"CL_CUSTOM4":2048,"CL_CUSTOM5":4096,"CL_CUSTOM6":8192,"CL_CUSTOM7":16384,"CL_CUSTOM8":32768}}}},"serializationType":"map"}' }, { "type": "attach_to_player", "jsonSchema": '{"type":"object","properties":{"anchorPointId":{"type":"integer","serializationType":"int32"}},"serializationType":"map"}' }, { "type": "detach_from_player", "jsonSchema": '{"type":"object","properties":{},"serializationType":"map"}' }, { "type": "play_video_stream", "jsonSchema": '{"type":"object","properties":{"src":{"type":"string","serializationType":"optional","optionalJsonSchema":{"type":"string","serializationType":"utf8-string"}},"loop":{"type":"boolean","serializationType":"optional","optionalJsonSchema":{"type":"boolean","serializationType":"boolean"}},"volume":{"type":"number","serializationType":"optional","optionalJsonSchema":{"type":"number","serializationType":"float32"}},"dclCast":{"type":"boolean","serializationType":"optional","optionalJsonSchema":{"type":"boolean","serializationType":"boolean"}}},"serializationType":"map"}' }, { "type": "stop_video_stream", "jsonSchema": '{"type":"object","properties":{},"serializationType":"map"}' }, { "type": "play_audio_stream", "jsonSchema": '{"type":"object","properties":{"url":{"type":"string","serializationType":"utf8-string"},"volume":{"type":"number","serializationType":"optional","optionalJsonSchema":{"type":"number","serializationType":"float32"}}},"serializationType":"map"}' }, { "type": "stop_audio_stream", "jsonSchema": '{"type":"object","properties":{},"serializationType":"map"}' }, { "type": "teleport_player", "jsonSchema": '{"type":"object","properties":{"x":{"type":"integer","serializationType":"int32"},"y":{"type":"integer","serializationType":"int32"}},"serializationType":"map"}' }, { "type": "move_player", "jsonSchema": '{"type":"object","properties":{"position":{"type":"object","properties":{"x":{"type":"number"},"y":{"type":"number"},"z":{"type":"number"},"w":{"type":"number"}},"serializationType":"vector3"},"cameraTarget":{"type":"object","serializationType":"optional","optionalJsonSchema":{"type":"object","properties":{"x":{"type":"number"},"y":{"type":"number"},"z":{"type":"number"},"w":{"type":"number"}},"serializationType":"vector3"}}},"serializationType":"map"}' }, { "type": "play_default_emote", "jsonSchema": '{"type":"object","properties":{"emote":{"type":"string","serializationType":"utf8-string"}},"serializationType":"map"}' }, { "type": "play_custom_emote", "jsonSchema": '{"type":"object","properties":{"src":{"type":"string","serializationType":"utf8-string"},"loop":{"type":"boolean","serializationType":"optional","optionalJsonSchema":{"type":"boolean","serializationType":"boolean"}}},"serializationType":"map"}' }, { "type": "open_link", "jsonSchema": '{"type":"object","properties":{"url":{"type":"string","serializationType":"utf8-string"}},"serializationType":"map"}' }, { "type": "show_text", "jsonSchema": '{"type":"object","properties":{"text":{"type":"string","serializationType":"utf8-string"},"hideAfterSeconds":{"type":"number","serializationType":"float32"},"font":{"type":"integer","enum":[0,1,2],"default":0,"serializationType":"enum-int","enumObject":{"0":"F_SANS_SERIF","1":"F_SERIF","2":"F_MONOSPACE","F_SANS_SERIF":0,"F_SERIF":1,"F_MONOSPACE":2}},"fontSize":{"type":"number","serializationType":"optional","optionalJsonSchema":{"type":"number","serializationType":"float32"}},"textAlign":{"type":"integer","enum":[0,1,2,3,4,5,6,7,8],"default":4,"serializationType":"enum-int","enumObject":{"0":"TAM_TOP_LEFT","1":"TAM_TOP_CENTER","2":"TAM_TOP_RIGHT","3":"TAM_MIDDLE_LEFT","4":"TAM_MIDDLE_CENTER","5":"TAM_MIDDLE_RIGHT","6":"TAM_BOTTOM_LEFT","7":"TAM_BOTTOM_CENTER","8":"TAM_BOTTOM_RIGHT","TAM_TOP_LEFT":0,"TAM_TOP_CENTER":1,"TAM_TOP_RIGHT":2,"TAM_MIDDLE_LEFT":3,"TAM_MIDDLE_CENTER":4,"TAM_MIDDLE_RIGHT":5,"TAM_BOTTOM_LEFT":6,"TAM_BOTTOM_CENTER":7,"TAM_BOTTOM_RIGHT":8}}},"serializationType":"map"}' }, { "type": "hide_text", "jsonSchema": '{"type":"object","properties":{},"serializationType":"map"}' }, { "type": "start_delay", "jsonSchema": '{"type":"object","properties":{"actions":{"type":"array","items":{"type":"string","serializationType":"utf8-string"},"serializationType":"array"},"timeout":{"type":"number","serializationType":"float32"}},"serializationType":"map"}' }, { "type": "stop_delay", "jsonSchema": '{"type":"object","properties":{"action":{"type":"string","serializationType":"utf8-string"}},"serializationType":"map"}' }, { "type": "start_loop", "jsonSchema": '{"type":"object","properties":{"actions":{"type":"array","items":{"type":"string","serializationType":"utf8-string"},"serializationType":"array"},"interval":{"type":"number","serializationType":"float32"}},"serializationType":"map"}' }, { "type": "stop_loop", "jsonSchema": '{"type":"object","properties":{"action":{"type":"string","serializationType":"utf8-string"}},"serializationType":"map"}' }, { "type": "clone_entity", "jsonSchema": '{"type":"object","properties":{"position":{"type":"object","properties":{"x":{"type":"number"},"y":{"type":"number"},"z":{"type":"number"},"w":{"type":"number"}},"serializationType":"vector3"}},"serializationType":"map"}' }, { "type": "remove_entity", "jsonSchema": '{"type":"object","properties":{},"serializationType":"map"}' }, { "type": "show_image", "jsonSchema": '{"type":"object","properties":{"src":{"type":"string","serializationType":"utf8-string"},"align":{"type":"integer","enum":[0,1,2,3,4,5,6,7,8],"default":4,"serializationType":"enum-int","enumObject":{"0":"TAM_TOP_LEFT","1":"TAM_TOP_CENTER","2":"TAM_TOP_RIGHT","3":"TAM_MIDDLE_LEFT","4":"TAM_MIDDLE_CENTER","5":"TAM_MIDDLE_RIGHT","6":"TAM_BOTTOM_LEFT","7":"TAM_BOTTOM_CENTER","8":"TAM_BOTTOM_RIGHT","TAM_TOP_LEFT":0,"TAM_TOP_CENTER":1,"TAM_TOP_RIGHT":2,"TAM_MIDDLE_LEFT":3,"TAM_MIDDLE_CENTER":4,"TAM_MIDDLE_RIGHT":5,"TAM_BOTTOM_LEFT":6,"TAM_BOTTOM_CENTER":7,"TAM_BOTTOM_RIGHT":8}},"height":{"type":"number","serializationType":"float32"},"width":{"type":"number","serializationType":"float32"},"hideAfterSeconds":{"type":"number","serializationType":"optional","optionalJsonSchema":{"type":"number","serializationType":"float32"}},"text":{"type":"string","serializationType":"optional","optionalJsonSchema":{"type":"string","serializationType":"utf8-string"}},"fontSize":{"type":"number","serializationType":"optional","optionalJsonSchema":{"type":"number","serializationType":"float32"}}},"serializationType":"map"}' }, { "type": "hide_image", "jsonSchema": '{"type":"object","properties":{"imageEntity":{"type":"integer","serializationType":"optional","optionalJsonSchema":{"type":"integer","serializationType":"int32"}}},"serializationType":"map"}' }] } } } }, { "name": "asset-packs::Actions", "jsonSchema": { "type": "object", "properties": { "id": { "type": "integer", "serializationType": "int32" }, "value": { "type": "array", "items": { "type": "object", "properties": { "name": { "type": "string", "serializationType": "utf8-string" }, "type": { "type": "string", "serializationType": "utf8-string" }, "jsonPayload": { "type": "string", "serializationType": "utf8-string" } }, "serializationType": "map" }, "serializationType": "array" } }, "serializationType": "map" }, "data": { "518": { "json": { "id": 1, "value": [{ "name": "Play Activate Animation", "type": "play_animation", "jsonPayload": '{ "animation": "trigger" }' }, { "name": "Play Sound", "type": "play_sound", "jsonPayload": '{"src":"assets/builder/red_button/sound.mp3"}' }] } }, "519": { "json": { "id": 2, "value": [{ "name": "Play Activate Animation", "type": "play_animation", "jsonPayload": '{ "animation": "trigger" }' }, { "name": "Play Sound", "type": "play_sound", "jsonPayload": '{"src":"assets/builder/red_button/sound.mp3"}' }] } }, "520": { "json": { "id": 3, "value": [{ "name": "Play Activate Animation", "type": "play_animation", "jsonPayload": '{ "animation": "trigger" }' }, { "name": "Play Sound", "type": "play_sound", "jsonPayload": '{"src":"assets/builder/red_button/sound.mp3"}' }] } }, "521": { "json": { "id": 4, "value": [{ "name": "Play Activate Animation", "type": "play_animation", "jsonPayload": '{ "animation": "trigger" }' }, { "name": "Play Sound", "type": "play_sound", "jsonPayload": '{"src":"assets/builder/red_button/sound.mp3"}' }] } }, "538": { "json": { "id": 5, "value": [{ "name": "Play Activate Animation", "type": "play_animation", "jsonPayload": '{ "animation": "trigger" }' }, { "name": "Play Sound", "type": "play_sound", "jsonPayload": '{"src":"assets/builder/red_light_button/sound.mp3"}' }] } } } }, { "name": "asset-packs::Counter", "jsonSchema": { "type": "object", "properties": { "id": { "type": "number", "serializationType": "float32" }, "value": { "type": "integer", "serializationType": "int32" } }, "serializationType": "map" }, "data": { "0": { "json": { "id": 0, "value": 5 } } } }, { "name": "asset-packs::Triggers", "jsonSchema": { "type": "object", "properties": { "value": { "type": "array", "items": { "type": "object", "properties": { "type": { "type": "string", "enum": ["on_click", "on_state_change", "on_spawn", "on_tween_end", "on_counter_change", "on_player_enters_area", "on_player_leaves_area", "on_delay", "on_loop", "on_clone", "on_click_image"], "default": "on_click", "serializationType": "enum-string", "enumObject": { "ON_CLICK": "on_click", "ON_STATE_CHANGE": "on_state_change", "ON_SPAWN": "on_spawn", "ON_TWEEN_END": "on_tween_end", "ON_COUNTER_CHANGE": "on_counter_change", "ON_PLAYER_ENTERS_AREA": "on_player_enters_area", "ON_PLAYER_LEAVES_AREA": "on_player_leaves_area", "ON_DELAY": "on_delay", "ON_LOOP": "on_loop", "ON_CLONE": "on_clone", "ON_CLICK_IMAGE": "on_click_image" } }, "conditions": { "type": "array", "serializationType": "optional", "optionalJsonSchema": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "integer", "serializationType": "optional", "optionalJsonSchema": { "type": "integer", "serializationType": "int32" } }, "type": { "type": "string", "enum": ["when_state_is", "when_state_is_not", "when_counter_equals", "when_counter_is_greater_than", "when_counter_is_less_than"], "default": "when_state_is", "serializationType": "enum-string", "enumObject": { "WHEN_STATE_IS": "when_state_is", "WHEN_STATE_IS_NOT": "when_state_is_not", "WHEN_COUNTER_EQUALS": "when_counter_equals", "WHEN_COUNTER_IS_GREATER_THAN": "when_counter_is_greater_than", "WHEN_COUNTER_IS_LESS_THAN": "when_counter_is_less_than" } }, "value": { "type": "string", "serializationType": "utf8-string" } }, "serializationType": "map" }, "serializationType": "array" } }, "operation": { "type": "string", "serializationType": "optional", "optionalJsonSchema": { "type": "string", "enum": ["and", "or"], "default": "and", "serializationType": "enum-string", "enumObject": { "AND": "and", "OR": "or" } } }, "actions": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "integer", "serializationType": "optional", "optionalJsonSchema": { "type": "integer", "serializationType": "int32" } }, "name": { "type": "string", "serializationType": "optional", "optionalJsonSchema": { "type": "string", "serializationType": "utf8-string" } } }, "serializationType": "map" }, "serializationType": "array" } }, "serializationType": "map" }, "serializationType": "array" } }, "serializationType": "map" }, "data": { "518": { "json": { "value": [{ "type": "on_click", "conditions": [], "actions": [{ "id": 1, "name": "Play Activate Animation" }, { "id": 1, "name": "Play Sound" }] }] } }, "519": { "json": { "value": [{ "type": "on_click", "conditions": [], "actions": [{ "id": 2, "name": "Play Activate Animation" }, { "id": 2, "name": "Play Sound" }] }] } }, "520": { "json": { "value": [{ "type": "on_click", "conditions": [], "actions": [{ "id": 3, "name": "Play Activate Animation" }, { "id": 3, "name": "Play Sound" }] }] } }, "521": { "json": { "value": [{ "type": "on_click", "conditions": [], "actions": [{ "id": 4, "name": "Play Activate Animation" }, { "id": 4, "name": "Play Sound" }] }] } }, "538": { "json": { "value": [{ "type": "on_click", "conditions": [], "actions": [{ "id": 5, "name": "Play Activate Animation" }, { "id": 5, "name": "Play Sound" }] }] } } } }, { "name": "inspector::TransformConfig", "jsonSchema": { "type": "object", "properties": { "porportionalScaling": { "type": "boolean", "serializationType": "optional", "optionalJsonSchema": { "type": "boolean", "serializationType": "boolean" } } }, "serializationType": "map" }, "data": { "513": { "json": {} }, "514": { "json": {} }, "515": { "json": {} }, "516": { "json": {} }, "517": { "json": {} }, "518": { "json": {} }, "519": { "json": {} }, "520": { "json": {} }, "521": { "json": {} }, "522": { "json": {} }, "523": { "json": {} }, "524": { "json": {} }, "525": { "json": {} }, "526": { "json": {} }, "527": { "json": {} }, "528": { "json": {} }, "529": { "json": {} }, "530": { "json": {} }, "531": { "json": {} }, "532": { "json": {} }, "534": { "json": {} }, "535": { "json": {} }, "536": { "json": {} }, "537": { "json": {} }, "538": { "json": {} }, "539": { "json": {} }, "540": { "json": {} }, "541": { "json": {} } } }, { "name": "cube-id", "jsonSchema": { "type": "object", "properties": {}, "serializationType": "map" }, "data": { "512": { "json": {} } } }] } }; + +// node_modules/@dcl/sdk/composite-provider.js +var composites = []; +var compositeProvider = { + getCompositeOrNull(src, _currentPath) { + const fromLoader = compositeFromLoader[src]; + if (fromLoader) { + try { + if (fromLoader instanceof Uint8Array) { + const composite = Composite.fromBinary(fromLoader); + composites.push({ src, composite }); + } else if (typeof fromLoader === "string") { + const composite = Composite.fromJson(JSON.parse(fromLoader)); + composites.push({ src, composite }); + } else if (typeof fromLoader === "object") { + const composite = Composite.fromJson(fromLoader); + composites.push({ src, composite }); + } + } catch (err) { + console.error(err); + } + delete compositeFromLoader[src]; + } + return composites.find((item) => item.src === src) || null; + } +}; + +// node_modules/@dcl/sdk/index.js +var rendererTransport = createRendererTransport({ crdtSendToRenderer: import_EngineApi2.crdtSendToRenderer }); +engine.addTransport(rendererTransport); +async function onUpdate(deltaTime) { + engine.seal(); + await engine.update(deltaTime); + await pollEvents(import_EngineApi2.sendBatch); +} +async function onStart() { + const response = await (0, import_EngineApi2.crdtGetState)({ data: new Uint8Array() }); + if (!response.hasEntities) { + const mainComposite = compositeProvider.getCompositeOrNull("main.composite"); + if (mainComposite) { + try { + Composite.instance(engine, mainComposite, compositeProvider); + } catch (err) { + console.log(`Warning: main.composite couldn't be instanced.`); + console.error(err); + } + } + } + if (!!rendererTransport.onmessage) { + if (response && response.data && response.data.length) { + for (const byteArray of response.data) { + rendererTransport.onmessage(byteArray); + } + } + } +} + +// src/index.ts.entry-point.ts +if (main !== void 0) { + let _INTERNAL_startup_system = function() { + const maybePromise = main(); + if (maybePromise && typeof maybePromise === "object" && typeof maybePromise.then === "function") { + maybePromise.catch(console.error); + } + engine.removeSystem(_INTERNAL_startup_system); + }; + engine.addSystem(_INTERNAL_startup_system, Infinity); +} /*! Bundled license information: -react/cjs/react.production.min.js: +react/cjs/react.development.js: (** * @license React - * react.production.min.js + * react.development.js * * Copyright (c) Facebook, Inc. and its affiliates. * @@ -71,10 +38256,10 @@ react/cjs/react.production.min.js: * LICENSE file in the root directory of this source tree. *) -scheduler/cjs/scheduler.production.min.js: +scheduler/cjs/scheduler.development.js: (** * @license React - * scheduler.production.min.js + * scheduler.development.js * * Copyright (c) Facebook, Inc. and its affiliates. * @@ -82,10 +38267,10 @@ scheduler/cjs/scheduler.production.min.js: * LICENSE file in the root directory of this source tree. *) -react-reconciler/cjs/react-reconciler.production.min.js: +react-reconciler/cjs/react-reconciler.development.js: (** * @license React - * react-reconciler.production.min.js + * react-reconciler.development.js * * Copyright (c) Facebook, Inc. and its affiliates. * @@ -114,3 +38299,4 @@ long/index.js: * SPDX-License-Identifier: Apache-2.0 *) */ +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vbm9kZV9tb2R1bGVzL0Bwcm90b2J1ZmpzL2FzcHJvbWlzZS9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHByb3RvYnVmanMvYmFzZTY0L2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcHJvdG9idWZqcy9ldmVudGVtaXR0ZXIvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL0Bwcm90b2J1ZmpzL2Zsb2F0L2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcHJvdG9idWZqcy9pbnF1aXJlL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcHJvdG9idWZqcy91dGY4L2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcHJvdG9idWZqcy9wb29sL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9wcm90b2J1ZmpzL3NyYy91dGlsL2xvbmdiaXRzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9wcm90b2J1ZmpzL3NyYy91dGlsL21pbmltYWwuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3Byb3RvYnVmanMvc3JjL3dyaXRlci5qcyIsICIuLi9ub2RlX21vZHVsZXMvcHJvdG9idWZqcy9zcmMvd3JpdGVyX2J1ZmZlci5qcyIsICIuLi9ub2RlX21vZHVsZXMvcHJvdG9idWZqcy9zcmMvcmVhZGVyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9wcm90b2J1ZmpzL3NyYy9yZWFkZXJfYnVmZmVyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9wcm90b2J1ZmpzL3NyYy9ycGMvc2VydmljZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvcHJvdG9idWZqcy9zcmMvcnBjLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9wcm90b2J1ZmpzL3NyYy9yb290cy5qcyIsICIuLi9ub2RlX21vZHVsZXMvcHJvdG9idWZqcy9zcmMvaW5kZXgtbWluaW1hbC5qcyIsICIuLi9ub2RlX21vZHVsZXMvcHJvdG9idWZqcy9taW5pbWFsLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yZWFjdC9janMvcmVhY3QuZGV2ZWxvcG1lbnQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JlYWN0L2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9zY2hlZHVsZXIvY2pzL3NjaGVkdWxlci5kZXZlbG9wbWVudC5qcyIsICIuLi9ub2RlX21vZHVsZXMvc2NoZWR1bGVyL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWNvbmNpbGVyL2Nqcy9yZWFjdC1yZWNvbmNpbGVyLmRldmVsb3BtZW50LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWNvbmNpbGVyL2luZGV4LmpzIiwgIi4uL3NyYy9pbmRleC50cy5lbnRyeS1wb2ludC50cyIsICIuLi9ub2RlX21vZHVsZXMvQGRjbC9lY3MvZGlzdC9jb21wb25lbnRzL2dlbmVyYXRlZC9wYi9kZWNlbnRyYWxhbmQvc2RrL2NvbXBvbmVudHMvYW5pbWF0b3IuZ2VuLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL2Vjcy9kaXN0L2NvbXBvbmVudHMvZ2VuZXJhdGVkL0FuaW1hdG9yLmdlbi5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGRjbC9lY3MvZGlzdC9jb21wb25lbnRzL2dlbmVyYXRlZC9wYi9kZWNlbnRyYWxhbmQvc2RrL2NvbXBvbmVudHMvYXVkaW9fc291cmNlLmdlbi5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGRjbC9lY3MvZGlzdC9jb21wb25lbnRzL2dlbmVyYXRlZC9BdWRpb1NvdXJjZS5nZW4uanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BkY2wvZWNzL2Rpc3QvY29tcG9uZW50cy9nZW5lcmF0ZWQvcGIvZGVjZW50cmFsYW5kL3Nkay9jb21wb25lbnRzL2F1ZGlvX3N0cmVhbS5nZW4uanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BkY2wvZWNzL2Rpc3QvY29tcG9uZW50cy9nZW5lcmF0ZWQvQXVkaW9TdHJlYW0uZ2VuLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL2Vjcy9kaXN0L2NvbXBvbmVudHMvZ2VuZXJhdGVkL3BiL2RlY2VudHJhbGFuZC9zZGsvY29tcG9uZW50cy9hdmF0YXJfYXR0YWNoLmdlbi5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGRjbC9lY3MvZGlzdC9jb21wb25lbnRzL2dlbmVyYXRlZC9BdmF0YXJBdHRhY2guZ2VuLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL2Vjcy9kaXN0L2NvbXBvbmVudHMvZ2VuZXJhdGVkL3BiL2RlY2VudHJhbGFuZC9zZGsvY29tcG9uZW50cy9hdmF0YXJfbW9kaWZpZXJfYXJlYS5nZW4uanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BkY2wvZWNzL2Rpc3QvY29tcG9uZW50cy9nZW5lcmF0ZWQvcGIvZGVjZW50cmFsYW5kL2NvbW1vbi92ZWN0b3JzLmdlbi5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGRjbC9lY3MvZGlzdC9jb21wb25lbnRzL2dlbmVyYXRlZC9BdmF0YXJNb2RpZmllckFyZWEuZ2VuLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9sb25nL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL2Vjcy9kaXN0L2NvbXBvbmVudHMvZ2VuZXJhdGVkL3BiL2RlY2VudHJhbGFuZC9zZGsvY29tcG9uZW50cy9hdmF0YXJfc2hhcGUuZ2VuLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL2Vjcy9kaXN0L2NvbXBvbmVudHMvZ2VuZXJhdGVkL3BiL2RlY2VudHJhbGFuZC9jb21tb24vY29sb3JzLmdlbi5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGRjbC9lY3MvZGlzdC9jb21wb25lbnRzL2dlbmVyYXRlZC9BdmF0YXJTaGFwZS5nZW4uanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BkY2wvZWNzL2Rpc3QvY29tcG9uZW50cy9nZW5lcmF0ZWQvcGIvZGVjZW50cmFsYW5kL3Nkay9jb21wb25lbnRzL2JpbGxib2FyZC5nZW4uanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BkY2wvZWNzL2Rpc3QvY29tcG9uZW50cy9nZW5lcmF0ZWQvQmlsbGJvYXJkLmdlbi5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGRjbC9lY3MvZGlzdC9jb21wb25lbnRzL2dlbmVyYXRlZC9wYi9kZWNlbnRyYWxhbmQvc2RrL2NvbXBvbmVudHMvY2FtZXJhX21vZGUuZ2VuLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL2Vjcy9kaXN0L2NvbXBvbmVudHMvZ2VuZXJhdGVkL0NhbWVyYU1vZGUuZ2VuLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL2Vjcy9kaXN0L2NvbXBvbmVudHMvZ2VuZXJhdGVkL3BiL2RlY2VudHJhbGFuZC9zZGsvY29tcG9uZW50cy9jYW1lcmFfbW9kZV9hcmVhLmdlbi5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGRjbC9lY3MvZGlzdC9jb21wb25lbnRzL2dlbmVyYXRlZC9DYW1lcmFNb2RlQXJlYS5nZW4uanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BkY2wvZWNzL2Rpc3QvY29tcG9uZW50cy9nZW5lcmF0ZWQvcGIvZGVjZW50cmFsYW5kL3Nkay9jb21wb25lbnRzL2VuZ2luZV9pbmZvLmdlbi5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGRjbC9lY3MvZGlzdC9jb21wb25lbnRzL2dlbmVyYXRlZC9FbmdpbmVJbmZvLmdlbi5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGRjbC9lY3MvZGlzdC9jb21wb25lbnRzL2dlbmVyYXRlZC9wYi9kZWNlbnRyYWxhbmQvc2RrL2NvbXBvbmVudHMvZ2x0Zl9jb250YWluZXIuZ2VuLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL2Vjcy9kaXN0L2NvbXBvbmVudHMvZ2VuZXJhdGVkL0dsdGZDb250YWluZXIuZ2VuLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL2Vjcy9kaXN0L2NvbXBvbmVudHMvZ2VuZXJhdGVkL3BiL2RlY2VudHJhbGFuZC9zZGsvY29tcG9uZW50cy9nbHRmX2NvbnRhaW5lcl9sb2FkaW5nX3N0YXRlLmdlbi5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGRjbC9lY3MvZGlzdC9jb21wb25lbnRzL2dlbmVyYXRlZC9HbHRmQ29udGFpbmVyTG9hZGluZ1N0YXRlLmdlbi5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGRjbC9lY3MvZGlzdC9jb21wb25lbnRzL2dlbmVyYXRlZC9wYi9kZWNlbnRyYWxhbmQvc2RrL2NvbXBvbmVudHMvbWF0ZXJpYWwuZ2VuLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL2Vjcy9kaXN0L2NvbXBvbmVudHMvZ2VuZXJhdGVkL3BiL2RlY2VudHJhbGFuZC9jb21tb24vdGV4dHVyZS5nZW4uanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BkY2wvZWNzL2Rpc3QvY29tcG9uZW50cy9nZW5lcmF0ZWQvTWF0ZXJpYWwuZ2VuLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL2Vjcy9kaXN0L2NvbXBvbmVudHMvZ2VuZXJhdGVkL3BiL2RlY2VudHJhbGFuZC9zZGsvY29tcG9uZW50cy9tZXNoX2NvbGxpZGVyLmdlbi5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGRjbC9lY3MvZGlzdC9jb21wb25lbnRzL2dlbmVyYXRlZC9NZXNoQ29sbGlkZXIuZ2VuLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL2Vjcy9kaXN0L2NvbXBvbmVudHMvZ2VuZXJhdGVkL3BiL2RlY2VudHJhbGFuZC9zZGsvY29tcG9uZW50cy9tZXNoX3JlbmRlcmVyLmdlbi5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGRjbC9lY3MvZGlzdC9jb21wb25lbnRzL2dlbmVyYXRlZC9NZXNoUmVuZGVyZXIuZ2VuLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL2Vjcy9kaXN0L2NvbXBvbmVudHMvZ2VuZXJhdGVkL3BiL2RlY2VudHJhbGFuZC9zZGsvY29tcG9uZW50cy9uZnRfc2hhcGUuZ2VuLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL2Vjcy9kaXN0L2NvbXBvbmVudHMvZ2VuZXJhdGVkL05mdFNoYXBlLmdlbi5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGRjbC9lY3MvZGlzdC9jb21wb25lbnRzL2dlbmVyYXRlZC9wYi9kZWNlbnRyYWxhbmQvc2RrL2NvbXBvbmVudHMvcG9pbnRlcl9ldmVudHMuZ2VuLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL2Vjcy9kaXN0L2NvbXBvbmVudHMvZ2VuZXJhdGVkL1BvaW50ZXJFdmVudHMuZ2VuLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL2Vjcy9kaXN0L2NvbXBvbmVudHMvZ2VuZXJhdGVkL3BiL2RlY2VudHJhbGFuZC9zZGsvY29tcG9uZW50cy9wb2ludGVyX2V2ZW50c19yZXN1bHQuZ2VuLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL2Vjcy9kaXN0L2NvbXBvbmVudHMvZ2VuZXJhdGVkL3BiL2RlY2VudHJhbGFuZC9zZGsvY29tcG9uZW50cy9jb21tb24vcmF5Y2FzdF9oaXQuZ2VuLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL2Vjcy9kaXN0L2NvbXBvbmVudHMvZ2VuZXJhdGVkL1BvaW50ZXJFdmVudHNSZXN1bHQuZ2VuLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL2Vjcy9kaXN0L2NvbXBvbmVudHMvZ2VuZXJhdGVkL3BiL2RlY2VudHJhbGFuZC9zZGsvY29tcG9uZW50cy9wb2ludGVyX2xvY2suZ2VuLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL2Vjcy9kaXN0L2NvbXBvbmVudHMvZ2VuZXJhdGVkL1BvaW50ZXJMb2NrLmdlbi5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGRjbC9lY3MvZGlzdC9jb21wb25lbnRzL2dlbmVyYXRlZC9wYi9kZWNlbnRyYWxhbmQvc2RrL2NvbXBvbmVudHMvcmF5Y2FzdC5nZW4uanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BkY2wvZWNzL2Rpc3QvY29tcG9uZW50cy9nZW5lcmF0ZWQvUmF5Y2FzdC5nZW4uanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BkY2wvZWNzL2Rpc3QvY29tcG9uZW50cy9nZW5lcmF0ZWQvcGIvZGVjZW50cmFsYW5kL3Nkay9jb21wb25lbnRzL3JheWNhc3RfcmVzdWx0Lmdlbi5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGRjbC9lY3MvZGlzdC9jb21wb25lbnRzL2dlbmVyYXRlZC9SYXljYXN0UmVzdWx0Lmdlbi5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGRjbC9lY3MvZGlzdC9jb21wb25lbnRzL2dlbmVyYXRlZC9wYi9kZWNlbnRyYWxhbmQvc2RrL2NvbXBvbmVudHMvdGV4dF9zaGFwZS5nZW4uanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BkY2wvZWNzL2Rpc3QvY29tcG9uZW50cy9nZW5lcmF0ZWQvVGV4dFNoYXBlLmdlbi5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGRjbC9lY3MvZGlzdC9jb21wb25lbnRzL2dlbmVyYXRlZC9wYi9kZWNlbnRyYWxhbmQvc2RrL2NvbXBvbmVudHMvdHdlZW4uZ2VuLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL2Vjcy9kaXN0L2NvbXBvbmVudHMvZ2VuZXJhdGVkL1R3ZWVuLmdlbi5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGRjbC9lY3MvZGlzdC9jb21wb25lbnRzL2dlbmVyYXRlZC9wYi9kZWNlbnRyYWxhbmQvc2RrL2NvbXBvbmVudHMvdHdlZW5fc2VxdWVuY2UuZ2VuLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL2Vjcy9kaXN0L2NvbXBvbmVudHMvZ2VuZXJhdGVkL1R3ZWVuU2VxdWVuY2UuZ2VuLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL2Vjcy9kaXN0L2NvbXBvbmVudHMvZ2VuZXJhdGVkL3BiL2RlY2VudHJhbGFuZC9zZGsvY29tcG9uZW50cy90d2Vlbl9zdGF0ZS5nZW4uanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BkY2wvZWNzL2Rpc3QvY29tcG9uZW50cy9nZW5lcmF0ZWQvVHdlZW5TdGF0ZS5nZW4uanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BkY2wvZWNzL2Rpc3QvY29tcG9uZW50cy9nZW5lcmF0ZWQvcGIvZGVjZW50cmFsYW5kL3Nkay9jb21wb25lbnRzL3VpX2JhY2tncm91bmQuZ2VuLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL2Vjcy9kaXN0L2NvbXBvbmVudHMvZ2VuZXJhdGVkL3BiL2RlY2VudHJhbGFuZC9jb21tb24vYm9yZGVyX3JlY3QuZ2VuLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL2Vjcy9kaXN0L2NvbXBvbmVudHMvZ2VuZXJhdGVkL1VpQmFja2dyb3VuZC5nZW4uanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BkY2wvZWNzL2Rpc3QvY29tcG9uZW50cy9nZW5lcmF0ZWQvcGIvZGVjZW50cmFsYW5kL3Nkay9jb21wb25lbnRzL3VpX2NhbnZhc19pbmZvcm1hdGlvbi5nZW4uanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BkY2wvZWNzL2Rpc3QvY29tcG9uZW50cy9nZW5lcmF0ZWQvVWlDYW52YXNJbmZvcm1hdGlvbi5nZW4uanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BkY2wvZWNzL2Rpc3QvY29tcG9uZW50cy9nZW5lcmF0ZWQvcGIvZGVjZW50cmFsYW5kL3Nkay9jb21wb25lbnRzL3VpX2Ryb3Bkb3duLmdlbi5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGRjbC9lY3MvZGlzdC9jb21wb25lbnRzL2dlbmVyYXRlZC9VaURyb3Bkb3duLmdlbi5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGRjbC9lY3MvZGlzdC9jb21wb25lbnRzL2dlbmVyYXRlZC9wYi9kZWNlbnRyYWxhbmQvc2RrL2NvbXBvbmVudHMvdWlfZHJvcGRvd25fcmVzdWx0Lmdlbi5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGRjbC9lY3MvZGlzdC9jb21wb25lbnRzL2dlbmVyYXRlZC9VaURyb3Bkb3duUmVzdWx0Lmdlbi5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGRjbC9lY3MvZGlzdC9jb21wb25lbnRzL2dlbmVyYXRlZC9wYi9kZWNlbnRyYWxhbmQvc2RrL2NvbXBvbmVudHMvdWlfaW5wdXQuZ2VuLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL2Vjcy9kaXN0L2NvbXBvbmVudHMvZ2VuZXJhdGVkL1VpSW5wdXQuZ2VuLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL2Vjcy9kaXN0L2NvbXBvbmVudHMvZ2VuZXJhdGVkL3BiL2RlY2VudHJhbGFuZC9zZGsvY29tcG9uZW50cy91aV9pbnB1dF9yZXN1bHQuZ2VuLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL2Vjcy9kaXN0L2NvbXBvbmVudHMvZ2VuZXJhdGVkL1VpSW5wdXRSZXN1bHQuZ2VuLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL2Vjcy9kaXN0L2NvbXBvbmVudHMvZ2VuZXJhdGVkL3BiL2RlY2VudHJhbGFuZC9zZGsvY29tcG9uZW50cy91aV90ZXh0Lmdlbi5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGRjbC9lY3MvZGlzdC9jb21wb25lbnRzL2dlbmVyYXRlZC9VaVRleHQuZ2VuLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL2Vjcy9kaXN0L2NvbXBvbmVudHMvZ2VuZXJhdGVkL3BiL2RlY2VudHJhbGFuZC9zZGsvY29tcG9uZW50cy91aV90cmFuc2Zvcm0uZ2VuLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL2Vjcy9kaXN0L2NvbXBvbmVudHMvZ2VuZXJhdGVkL1VpVHJhbnNmb3JtLmdlbi5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGRjbC9lY3MvZGlzdC9jb21wb25lbnRzL2dlbmVyYXRlZC9wYi9kZWNlbnRyYWxhbmQvc2RrL2NvbXBvbmVudHMvdmlkZW9fZXZlbnQuZ2VuLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL2Vjcy9kaXN0L2NvbXBvbmVudHMvZ2VuZXJhdGVkL1ZpZGVvRXZlbnQuZ2VuLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL2Vjcy9kaXN0L2NvbXBvbmVudHMvZ2VuZXJhdGVkL3BiL2RlY2VudHJhbGFuZC9zZGsvY29tcG9uZW50cy92aWRlb19wbGF5ZXIuZ2VuLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL2Vjcy9kaXN0L2NvbXBvbmVudHMvZ2VuZXJhdGVkL1ZpZGVvUGxheWVyLmdlbi5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGRjbC9lY3MvZGlzdC9jb21wb25lbnRzL2dlbmVyYXRlZC9wYi9kZWNlbnRyYWxhbmQvc2RrL2NvbXBvbmVudHMvdmlzaWJpbGl0eV9jb21wb25lbnQuZ2VuLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL2Vjcy9kaXN0L2NvbXBvbmVudHMvZ2VuZXJhdGVkL1Zpc2liaWxpdHlDb21wb25lbnQuZ2VuLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL2Vjcy9kaXN0L2NvbXBvbmVudHMvZ2VuZXJhdGVkL2luZGV4Lmdlbi5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGRjbC9lY3MvZGlzdC9jb21wb25lbnRzL2V4dGVuZGVkL0FuaW1hdG9yLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL2Vjcy9kaXN0L2NvbXBvbmVudHMvZXh0ZW5kZWQvTWF0ZXJpYWwuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BkY2wvZWNzL2Rpc3QvY29tcG9uZW50cy9leHRlbmRlZC9NZXNoQ29sbGlkZXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BkY2wvZWNzL2Rpc3QvY29tcG9uZW50cy9leHRlbmRlZC9NZXNoUmVuZGVyZXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BkY2wvZWNzL2Rpc3QvY29tcG9uZW50cy9leHRlbmRlZC9Ud2Vlbi5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGRjbC9lY3MvZGlzdC9zY2hlbWFzL0FycmF5LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL2Vjcy9kaXN0L3NjaGVtYXMvYmFzaWMvQm9vbGVhbi5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGRjbC9lY3MvZGlzdC9zY2hlbWFzL2Jhc2ljL0ludGVnZXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BkY2wvZWNzL2Rpc3Qvc2NoZW1hcy9iYXNpYy9TdHJpbmcuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BkY2wvZWNzL2Rpc3Qvc2NoZW1hcy9iYXNpYy9FbnVtLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL2Vjcy9kaXN0L3NjaGVtYXMvYmFzaWMvRmxvYXQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BkY2wvZWNzL2Rpc3Qvc2NoZW1hcy9jdXN0b20vQ29sb3IzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL2Vjcy9kaXN0L3NjaGVtYXMvY3VzdG9tL0NvbG9yNC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGRjbC9lY3MvZGlzdC9zY2hlbWFzL2N1c3RvbS9FbnRpdHkuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BkY2wvZWNzL2Rpc3Qvc2NoZW1hcy9jdXN0b20vUXVhdGVybmlvbi5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGRjbC9lY3MvZGlzdC9zY2hlbWFzL2N1c3RvbS9WZWN0b3IzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL2Vjcy9kaXN0L3NjaGVtYXMvTWFwLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL2Vjcy9kaXN0L3NjaGVtYXMvT3B0aW9uYWwuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BkY2wvZWNzL2Rpc3Qvc2NoZW1hcy9PbmVPZi5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGRjbC9lY3MvZGlzdC9zY2hlbWFzL2J1aWxkU2NoZW1hL3V0aWxzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL2Vjcy9kaXN0L3NjaGVtYXMvYnVpbGRTY2hlbWEvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BkY2wvZWNzL2Rpc3Qvc2NoZW1hcy9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGRjbC9lY3MvZGlzdC9jb21wb25lbnRzL21hbnVhbC9OYW1lLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL2Vjcy9kaXN0L2NvbXBvbmVudHMvbWFudWFsL1N5bmNDb21wb25lbnRzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL2Vjcy9kaXN0L2NvbXBvbmVudHMvbWFudWFsL05ldHdvcmtFbnRpdHkuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BkY2wvZWNzL2Rpc3QvY29tcG9uZW50cy9tYW51YWwvTmV0d29ya1BhcmVudC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGRjbC9lY3MvZGlzdC9jb21wb25lbnRzL21hbnVhbC9UcmFuc2Zvcm0uanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BkY2wvZWNzL2Rpc3QvY29tcG9uZW50cy9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGRjbC9lY3MvZGlzdC9jb21wb25lbnRzL2dlbmVyYXRlZC9jb21wb25lbnQtbmFtZXMuZ2VuLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL2Vjcy9kaXN0L2NvbXBvbmVudHMvY29tcG9uZW50LW51bWJlci5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGRjbC9lY3MvZGlzdC9ydW50aW1lL2NyYy5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGRjbC9lY3MvZGlzdC9ydW50aW1lL2ludmFyaWFudC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGRjbC9lY3MvZGlzdC9zeXN0ZW1zL2NyZHQvZ3NldC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGRjbC9lY3MvZGlzdC9lbmdpbmUvZW50aXR5LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL2Vjcy9kaXN0L3NlcmlhbGl6YXRpb24vQnl0ZUJ1ZmZlci9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGRjbC9lY3MvZGlzdC9zZXJpYWxpemF0aW9uL2NyZHQvdHlwZXMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BkY2wvZWNzL2Rpc3Qvc2VyaWFsaXphdGlvbi9jcmR0L2NyZHRNZXNzYWdlUHJvdG9jb2wuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BkY2wvZWNzL2Rpc3Qvc2VyaWFsaXphdGlvbi9jcmR0L2RlbGV0ZUNvbXBvbmVudC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGRjbC9lY3MvZGlzdC9zZXJpYWxpemF0aW9uL2NyZHQvYXBwZW5kVmFsdWUuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BkY2wvZWNzL2Rpc3Qvc2VyaWFsaXphdGlvbi9jcmR0L2RlbGV0ZUVudGl0eS5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGRjbC9lY3MvZGlzdC9zZXJpYWxpemF0aW9uL2NyZHQvcHV0Q29tcG9uZW50LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL2Vjcy9kaXN0L3NlcmlhbGl6YXRpb24vY3JkdC9uZXR3b3JrL3B1dENvbXBvbmVudE5ldHdvcmsuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BkY2wvZWNzL2Rpc3Qvc2VyaWFsaXphdGlvbi9jcmR0L25ldHdvcmsvZGVsZXRlQ29tcG9uZW50TmV0d29yay5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGRjbC9lY3MvZGlzdC9zZXJpYWxpemF0aW9uL2NyZHQvbmV0d29yay9kZWxldGVFbnRpdHlOZXR3b3JrLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL2Vjcy9kaXN0L3NlcmlhbGl6YXRpb24vY3JkdC9uZXR3b3JrL3V0aWxzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL2Vjcy9kaXN0L3N5c3RlbXMvY3JkdC9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGRjbC9lY3MvZGlzdC9zeXN0ZW1zL2NyZHQvdXRpbHMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BkY2wvZWNzL2Rpc3QvZW5naW5lL3JlYWRvbmx5LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL2Vjcy9kaXN0L2VuZ2luZS9sd3ctZWxlbWVudC1zZXQtY29tcG9uZW50LWRlZmluaXRpb24uanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BkY2wvZWNzL2Rpc3QvZW5naW5lL3N5c3RlbXMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BkY2wvZWNzL2Rpc3QvZW5naW5lL2dyb3ctb25seS12YWx1ZS1zZXQtY29tcG9uZW50LWRlZmluaXRpb24uanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BkY2wvZWNzL2Rpc3QvcnVudGltZS9oZWxwZXJzL3RyZWUuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BkY2wvZWNzL2Rpc3QvZW5naW5lL2lucHV0LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL2Vjcy9kaXN0L2VuZ2luZS9jb21wb25lbnQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BkY2wvZWNzL2Rpc3QvZW5naW5lL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL2Vjcy9kaXN0L3N5c3RlbXMvYXN5bmMtdGFzay5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGRjbC9lY3MvZGlzdC9zeXN0ZW1zL2V2ZW50cy5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGRjbC9lY3MvZGlzdC9zeXN0ZW1zL3R3ZWVuLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL2Vjcy9kaXN0L3J1bnRpbWUvaW5pdGlhbGl6YXRpb24vaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BkY2wvZWNzL2Rpc3QvY29tcG9uZW50cy9nZW5lcmF0ZWQvZ2xvYmFsLmdlbi5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGRjbC9lY3MvZGlzdC9jb21wb25lbnRzL2dlbmVyYXRlZC9wYi9kZWNlbnRyYWxhbmQvc2RrL2NvbXBvbmVudHMvY29tbW9uL2NhbWVyYV90eXBlLmdlbi5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGRjbC9lY3MvZGlzdC9jb21wb25lbnRzL2dlbmVyYXRlZC9wYi9kZWNlbnRyYWxhbmQvc2RrL2NvbXBvbmVudHMvY29tbW9uL2lucHV0X2FjdGlvbi5nZW4uanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BkY2wvZWNzL2Rpc3QvY29tcG9uZW50cy9nZW5lcmF0ZWQvcGIvZGVjZW50cmFsYW5kL3Nkay9jb21wb25lbnRzL2NvbW1vbi9sb2FkaW5nX3N0YXRlLmdlbi5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGRjbC9lY3MvZGlzdC9jb21wb25lbnRzL2dlbmVyYXRlZC9wYi9kZWNlbnRyYWxhbmQvc2RrL2NvbXBvbmVudHMvY29tbW9uL3RleHRzLmdlbi5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGRjbC9lY3MvZGlzdC9jb21wb3NpdGUvY29tcG9uZW50cy5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGRjbC9lY3MvZGlzdC9jb21wb3NpdGUvcGF0aC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGRjbC9lY3MvZGlzdC9jb21wb3NpdGUvaW5zdGFuY2UuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BkY2wvZWNzL2Rpc3QvY29tcG9zaXRlL3Byb3RvL2dlbi9jb21wb3NpdGUuZ2VuLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL2Vjcy9kaXN0L2NvbXBvc2l0ZS9wcm90by9nZW4vZ29vZ2xlL3Byb3RvYnVmL3N0cnVjdC5nZW4uanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BkY2wvZWNzL2Rpc3QvY29tcG9zaXRlL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL2Vjcy9kaXN0L2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL2Vjcy1tYXRoL2Rpc3QvdHlwZXMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BkY2wvZWNzLW1hdGgvZGlzdC9TY2FsYXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BkY2wvZWNzLW1hdGgvZGlzdC9WZWN0b3IzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL2Vjcy1tYXRoL2Rpc3QvUGxhbmUuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BkY2wvZWNzLW1hdGgvZGlzdC9NYXRyaXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BkY2wvZWNzLW1hdGgvZGlzdC9RdWF0ZXJuaW9uLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL2Vjcy1tYXRoL2Rpc3QvQ29sb3I0LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL2Vjcy1tYXRoL2Rpc3QvQ29sb3IzLmpzIiwgIi4uL3NyYy9kZWZpbml0aW9ucy50cyIsICIuLi9zcmMvbW9kdWxlcy9oZWxwZXJzLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL3Nkay9zcmMvbmV0d29yay9pbmRleC50cyIsICIuLi9ub2RlX21vZHVsZXMvQGRjbC9zZGsvc3JjL25ldHdvcmsvZmlsdGVyLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL3Nkay9zcmMvbmV0d29yay9zdGF0ZS50cyIsICIuLi9ub2RlX21vZHVsZXMvQGRjbC9zZGsvc3JjL25ldHdvcmsvYmluYXJ5LW1lc3NhZ2UtYnVzLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL3Nkay9zcmMvbmV0d29yay91dGlscy50cyIsICIuLi9ub2RlX21vZHVsZXMvQGRjbC9zZGsvc3JjL25ldHdvcmsvZW50aXRpZXMudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BkY2wvc2RrL3NyYy9uZXR3b3JrL21lc3NhZ2UtYnVzLXN5bmMudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BkY2wtc2RrL3V0aWxzL3NyYy9tYXRoLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsLXNkay91dGlscy9zcmMvcHJpb3JpdHkudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BkY2wtc2RrL3V0aWxzL3NyYy90aW1lci50cyIsICIuLi9ub2RlX21vZHVsZXMvQGRjbC1zZGsvdXRpbHMvc3JjL3RvZ2dsZS50cyIsICIuLi9ub2RlX21vZHVsZXMvQGRjbC1zZGsvdXRpbHMvc3JjL3R3ZWVuLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsLXNkay91dGlscy9zcmMvcGVycGV0dWFsTW90aW9uLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsLXNkay91dGlscy9zcmMvcGF0aC50cyIsICIuLi9ub2RlX21vZHVsZXMvQGRjbC1zZGsvdXRpbHMvc3JjL3RyaWdnZXIudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BkY2wtc2RrL3V0aWxzL3NyYy9hY3Rpb24udHMiLCAiLi4vc3JjL21vZHVsZXMvY3V0dGluZ0JvYXJkLnRzIiwgIi4uL3NyYy9tb2R1bGVzL3Byb2dyZXNzQmFycy50cyIsICIuLi9zcmMvbW9kdWxlcy9zcGVlY2hCdWJibGUudHMiLCAiLi4vc3JjL21vZHVsZXMvY3VzdG9tZXJzLnRzIiwgIi4uL3NyYy9tb2R1bGVzL3BvdC50cyIsICIuLi9zcmMvbW9kdWxlcy9waWNrQW5kRHJvcC50cyIsICIuLi9zcmMvbW9kdWxlcy9mYWN0b3J5LnRzIiwgIi4uL3NyYy9tb2R1bGVzL3RhcC50cyIsICIuLi9zcmMvdWkudHN4IiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL3JlYWN0LWVjcy9kaXN0L3JlYWN0LWVjcy5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGRjbC9yZWFjdC1lY3MvZGlzdC9yZWNvbmNpbGVyL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL3JlYWN0LWVjcy9kaXN0L2NvbXBvbmVudHMvTGFiZWwvdXRpbHMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BkY2wvcmVhY3QtZWNzL2Rpc3QvY29tcG9uZW50cy91aUJhY2tncm91bmQvdXRpbHMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BkY2wvcmVhY3QtZWNzL2Rpc3QvY29tcG9uZW50cy91aUJhY2tncm91bmQvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BkY2wvcmVhY3QtZWNzL2Rpc3QvY29tcG9uZW50cy91aVRyYW5zZm9ybS91dGlscy5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGRjbC9yZWFjdC1lY3MvZGlzdC9jb21wb25lbnRzL3VpVHJhbnNmb3JtL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL3JlYWN0LWVjcy9kaXN0L2NvbXBvbmVudHMvdXRpbHMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BkY2wvcmVhY3QtZWNzL2Rpc3QvY29tcG9uZW50cy9saXN0ZW5lcnMvdHlwZXMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BkY2wvcmVhY3QtZWNzL2Rpc3QvY29tcG9uZW50cy9MYWJlbC9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGRjbC9yZWFjdC1lY3MvZGlzdC9jb21wb25lbnRzL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL3JlYWN0LWVjcy9kaXN0L3JlY29uY2lsZXIvdXRpbHMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BkY2wvcmVhY3QtZWNzL2Rpc3Qvc3lzdGVtLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL3JlYWN0LWVjcy9kaXN0L2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL3Nkay9zcmMvcmVhY3QtZWNzLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL2Fzc2V0LXBhY2tzL3NyYy9hY3Rpb24tdHlwZXMudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BkY2wvYXNzZXQtcGFja3Mvc3JjL2VudW1zLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9taXR0L3NyYy9pbmRleC50cyIsICIuLi9ub2RlX21vZHVsZXMvQGRjbC9hc3NldC1wYWNrcy9zcmMvZXZlbnRzLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL2Fzc2V0LXBhY2tzL3NyYy9pZC50cyIsICIuLi9ub2RlX21vZHVsZXMvQGRjbC9hc3NldC1wYWNrcy9zcmMvc3RhdGVzLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL2Fzc2V0LXBhY2tzL3NyYy9sd3cudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BkY2wvYXNzZXQtcGFja3Mvc3JjL2Nsb25lLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL2Fzc2V0LXBhY2tzL3NyYy9kZWZpbml0aW9ucy50cyIsICIuLi9ub2RlX21vZHVsZXMvQGRjbC9hc3NldC1wYWNrcy9zcmMvYWN0aW9ucy50cyIsICIuLi9ub2RlX21vZHVsZXMvQGRjbC9hc3NldC1wYWNrcy9zcmMvdGltZXIudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BkY2wvYXNzZXQtcGFja3Mvc3JjL3VpLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL2Fzc2V0LXBhY2tzL3NyYy90cmlnZ2Vycy50cyIsICIuLi9ub2RlX21vZHVsZXMvQGRjbC9hc3NldC1wYWNrcy9zcmMvc2NlbmUtZW50cnlwb2ludC50cyIsICIuLi9zcmMvaW5kZXgudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BkY2wvc2RrL3NyYy9pbmRleC50cyIsICIuLi9ub2RlX21vZHVsZXMvQGRjbC9zZGsvc3JjL2ludGVybmFsL3RyYW5zcG9ydHMvcmVuZGVyZXJUcmFuc3BvcnQudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BkY2wvc2RrL3NyYy9pbnRlcm5hbC9PYnNlcnZhYmxlLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9AZGNsL3Nkay9zcmMvb2JzZXJ2YWJsZXMudHMiLCAic2RrLWNvbXBvc2l0ZTphbGwtY29tcG9zaXRlcyIsICIuLi9ub2RlX21vZHVsZXMvQGRjbC9zZGsvc3JjL2NvbXBvc2l0ZS1wcm92aWRlci50cyJdLAogICJzb3VyY2VSb290IjogImZpbGU6Ly8vVXNlcnMvTmljby9Eb2N1bWVudHMvZ2l0aHViL2hvcnJpYmxlLXRlc3RzL01pa2FzLWtpdGNoZW4tU0RLNy9iaW4iLAogICJzb3VyY2VzQ29udGVudCI6IFsiXCJ1c2Ugc3RyaWN0XCI7XHJcbm1vZHVsZS5leHBvcnRzID0gYXNQcm9taXNlO1xyXG5cclxuLyoqXHJcbiAqIENhbGxiYWNrIGFzIHVzZWQgYnkge0BsaW5rIHV0aWwuYXNQcm9taXNlfS5cclxuICogQHR5cGVkZWYgYXNQcm9taXNlQ2FsbGJhY2tcclxuICogQHR5cGUge2Z1bmN0aW9ufVxyXG4gKiBAcGFyYW0ge0Vycm9yfG51bGx9IGVycm9yIEVycm9yLCBpZiBhbnlcclxuICogQHBhcmFtIHsuLi4qfSBwYXJhbXMgQWRkaXRpb25hbCBhcmd1bWVudHNcclxuICogQHJldHVybnMge3VuZGVmaW5lZH1cclxuICovXHJcblxyXG4vKipcclxuICogUmV0dXJucyBhIHByb21pc2UgZnJvbSBhIG5vZGUtc3R5bGUgY2FsbGJhY2sgZnVuY3Rpb24uXHJcbiAqIEBtZW1iZXJvZiB1dGlsXHJcbiAqIEBwYXJhbSB7YXNQcm9taXNlQ2FsbGJhY2t9IGZuIEZ1bmN0aW9uIHRvIGNhbGxcclxuICogQHBhcmFtIHsqfSBjdHggRnVuY3Rpb24gY29udGV4dFxyXG4gKiBAcGFyYW0gey4uLip9IHBhcmFtcyBGdW5jdGlvbiBhcmd1bWVudHNcclxuICogQHJldHVybnMge1Byb21pc2U8Kj59IFByb21pc2lmaWVkIGZ1bmN0aW9uXHJcbiAqL1xyXG5mdW5jdGlvbiBhc1Byb21pc2UoZm4sIGN0eC8qLCB2YXJhcmdzICovKSB7XHJcbiAgICB2YXIgcGFyYW1zICA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSksXHJcbiAgICAgICAgb2Zmc2V0ICA9IDAsXHJcbiAgICAgICAgaW5kZXggICA9IDIsXHJcbiAgICAgICAgcGVuZGluZyA9IHRydWU7XHJcbiAgICB3aGlsZSAoaW5kZXggPCBhcmd1bWVudHMubGVuZ3RoKVxyXG4gICAgICAgIHBhcmFtc1tvZmZzZXQrK10gPSBhcmd1bWVudHNbaW5kZXgrK107XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gZXhlY3V0b3IocmVzb2x2ZSwgcmVqZWN0KSB7XHJcbiAgICAgICAgcGFyYW1zW29mZnNldF0gPSBmdW5jdGlvbiBjYWxsYmFjayhlcnIvKiwgdmFyYXJncyAqLykge1xyXG4gICAgICAgICAgICBpZiAocGVuZGluZykge1xyXG4gICAgICAgICAgICAgICAgcGVuZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgaWYgKGVycilcclxuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBwYXJhbXMgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChvZmZzZXQgPCBwYXJhbXMubGVuZ3RoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXNbb2Zmc2V0KytdID0gYXJndW1lbnRzW29mZnNldF07XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZS5hcHBseShudWxsLCBwYXJhbXMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBmbi5hcHBseShjdHggfHwgbnVsbCwgcGFyYW1zKTtcclxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgaWYgKHBlbmRpbmcpIHtcclxuICAgICAgICAgICAgICAgIHBlbmRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbn1cclxuIiwgIlwidXNlIHN0cmljdFwiO1xyXG5cclxuLyoqXHJcbiAqIEEgbWluaW1hbCBiYXNlNjQgaW1wbGVtZW50YXRpb24gZm9yIG51bWJlciBhcnJheXMuXHJcbiAqIEBtZW1iZXJvZiB1dGlsXHJcbiAqIEBuYW1lc3BhY2VcclxuICovXHJcbnZhciBiYXNlNjQgPSBleHBvcnRzO1xyXG5cclxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIGJ5dGUgbGVuZ3RoIG9mIGEgYmFzZTY0IGVuY29kZWQgc3RyaW5nLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIEJhc2U2NCBlbmNvZGVkIHN0cmluZ1xyXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBCeXRlIGxlbmd0aFxyXG4gKi9cclxuYmFzZTY0Lmxlbmd0aCA9IGZ1bmN0aW9uIGxlbmd0aChzdHJpbmcpIHtcclxuICAgIHZhciBwID0gc3RyaW5nLmxlbmd0aDtcclxuICAgIGlmICghcClcclxuICAgICAgICByZXR1cm4gMDtcclxuICAgIHZhciBuID0gMDtcclxuICAgIHdoaWxlICgtLXAgJSA0ID4gMSAmJiBzdHJpbmcuY2hhckF0KHApID09PSBcIj1cIilcclxuICAgICAgICArK247XHJcbiAgICByZXR1cm4gTWF0aC5jZWlsKHN0cmluZy5sZW5ndGggKiAzKSAvIDQgLSBuO1xyXG59O1xyXG5cclxuLy8gQmFzZTY0IGVuY29kaW5nIHRhYmxlXHJcbnZhciBiNjQgPSBuZXcgQXJyYXkoNjQpO1xyXG5cclxuLy8gQmFzZTY0IGRlY29kaW5nIHRhYmxlXHJcbnZhciBzNjQgPSBuZXcgQXJyYXkoMTIzKTtcclxuXHJcbi8vIDY1Li45MCwgOTcuLjEyMiwgNDguLjU3LCA0MywgNDdcclxuZm9yICh2YXIgaSA9IDA7IGkgPCA2NDspXHJcbiAgICBzNjRbYjY0W2ldID0gaSA8IDI2ID8gaSArIDY1IDogaSA8IDUyID8gaSArIDcxIDogaSA8IDYyID8gaSAtIDQgOiBpIC0gNTkgfCA0M10gPSBpKys7XHJcblxyXG4vKipcclxuICogRW5jb2RlcyBhIGJ1ZmZlciB0byBhIGJhc2U2NCBlbmNvZGVkIHN0cmluZy5cclxuICogQHBhcmFtIHtVaW50OEFycmF5fSBidWZmZXIgU291cmNlIGJ1ZmZlclxyXG4gKiBAcGFyYW0ge251bWJlcn0gc3RhcnQgU291cmNlIHN0YXJ0XHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBlbmQgU291cmNlIGVuZFxyXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBCYXNlNjQgZW5jb2RlZCBzdHJpbmdcclxuICovXHJcbmJhc2U2NC5lbmNvZGUgPSBmdW5jdGlvbiBlbmNvZGUoYnVmZmVyLCBzdGFydCwgZW5kKSB7XHJcbiAgICB2YXIgcGFydHMgPSBudWxsLFxyXG4gICAgICAgIGNodW5rID0gW107XHJcbiAgICB2YXIgaSA9IDAsIC8vIG91dHB1dCBpbmRleFxyXG4gICAgICAgIGogPSAwLCAvLyBnb3RvIGluZGV4XHJcbiAgICAgICAgdDsgICAgIC8vIHRlbXBvcmFyeVxyXG4gICAgd2hpbGUgKHN0YXJ0IDwgZW5kKSB7XHJcbiAgICAgICAgdmFyIGIgPSBidWZmZXJbc3RhcnQrK107XHJcbiAgICAgICAgc3dpdGNoIChqKSB7XHJcbiAgICAgICAgICAgIGNhc2UgMDpcclxuICAgICAgICAgICAgICAgIGNodW5rW2krK10gPSBiNjRbYiA+PiAyXTtcclxuICAgICAgICAgICAgICAgIHQgPSAoYiAmIDMpIDw8IDQ7XHJcbiAgICAgICAgICAgICAgICBqID0gMTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIDE6XHJcbiAgICAgICAgICAgICAgICBjaHVua1tpKytdID0gYjY0W3QgfCBiID4+IDRdO1xyXG4gICAgICAgICAgICAgICAgdCA9IChiICYgMTUpIDw8IDI7XHJcbiAgICAgICAgICAgICAgICBqID0gMjtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIDI6XHJcbiAgICAgICAgICAgICAgICBjaHVua1tpKytdID0gYjY0W3QgfCBiID4+IDZdO1xyXG4gICAgICAgICAgICAgICAgY2h1bmtbaSsrXSA9IGI2NFtiICYgNjNdO1xyXG4gICAgICAgICAgICAgICAgaiA9IDA7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGkgPiA4MTkxKSB7XHJcbiAgICAgICAgICAgIChwYXJ0cyB8fCAocGFydHMgPSBbXSkpLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsIGNodW5rKSk7XHJcbiAgICAgICAgICAgIGkgPSAwO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChqKSB7XHJcbiAgICAgICAgY2h1bmtbaSsrXSA9IGI2NFt0XTtcclxuICAgICAgICBjaHVua1tpKytdID0gNjE7XHJcbiAgICAgICAgaWYgKGogPT09IDEpXHJcbiAgICAgICAgICAgIGNodW5rW2krK10gPSA2MTtcclxuICAgIH1cclxuICAgIGlmIChwYXJ0cykge1xyXG4gICAgICAgIGlmIChpKVxyXG4gICAgICAgICAgICBwYXJ0cy5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLCBjaHVuay5zbGljZSgwLCBpKSkpO1xyXG4gICAgICAgIHJldHVybiBwYXJ0cy5qb2luKFwiXCIpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLCBjaHVuay5zbGljZSgwLCBpKSk7XHJcbn07XHJcblxyXG52YXIgaW52YWxpZEVuY29kaW5nID0gXCJpbnZhbGlkIGVuY29kaW5nXCI7XHJcblxyXG4vKipcclxuICogRGVjb2RlcyBhIGJhc2U2NCBlbmNvZGVkIHN0cmluZyB0byBhIGJ1ZmZlci5cclxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBTb3VyY2Ugc3RyaW5nXHJcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gYnVmZmVyIERlc3RpbmF0aW9uIGJ1ZmZlclxyXG4gKiBAcGFyYW0ge251bWJlcn0gb2Zmc2V0IERlc3RpbmF0aW9uIG9mZnNldFxyXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBOdW1iZXIgb2YgYnl0ZXMgd3JpdHRlblxyXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgZW5jb2RpbmcgaXMgaW52YWxpZFxyXG4gKi9cclxuYmFzZTY0LmRlY29kZSA9IGZ1bmN0aW9uIGRlY29kZShzdHJpbmcsIGJ1ZmZlciwgb2Zmc2V0KSB7XHJcbiAgICB2YXIgc3RhcnQgPSBvZmZzZXQ7XHJcbiAgICB2YXIgaiA9IDAsIC8vIGdvdG8gaW5kZXhcclxuICAgICAgICB0OyAgICAgLy8gdGVtcG9yYXJ5XHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0cmluZy5sZW5ndGg7KSB7XHJcbiAgICAgICAgdmFyIGMgPSBzdHJpbmcuY2hhckNvZGVBdChpKyspO1xyXG4gICAgICAgIGlmIChjID09PSA2MSAmJiBqID4gMSlcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgaWYgKChjID0gczY0W2NdKSA9PT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgICB0aHJvdyBFcnJvcihpbnZhbGlkRW5jb2RpbmcpO1xyXG4gICAgICAgIHN3aXRjaCAoaikge1xyXG4gICAgICAgICAgICBjYXNlIDA6XHJcbiAgICAgICAgICAgICAgICB0ID0gYztcclxuICAgICAgICAgICAgICAgIGogPSAxO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgMTpcclxuICAgICAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSB0IDw8IDIgfCAoYyAmIDQ4KSA+PiA0O1xyXG4gICAgICAgICAgICAgICAgdCA9IGM7XHJcbiAgICAgICAgICAgICAgICBqID0gMjtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIDI6XHJcbiAgICAgICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gKHQgJiAxNSkgPDwgNCB8IChjICYgNjApID4+IDI7XHJcbiAgICAgICAgICAgICAgICB0ID0gYztcclxuICAgICAgICAgICAgICAgIGogPSAzO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgMzpcclxuICAgICAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSAodCAmIDMpIDw8IDYgfCBjO1xyXG4gICAgICAgICAgICAgICAgaiA9IDA7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoaiA9PT0gMSlcclxuICAgICAgICB0aHJvdyBFcnJvcihpbnZhbGlkRW5jb2RpbmcpO1xyXG4gICAgcmV0dXJuIG9mZnNldCAtIHN0YXJ0O1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFRlc3RzIGlmIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFwcGVhcnMgdG8gYmUgYmFzZTY0IGVuY29kZWQuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgU3RyaW5nIHRvIHRlc3RcclxuICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiBwcm9iYWJseSBiYXNlNjQgZW5jb2RlZCwgb3RoZXJ3aXNlIGZhbHNlXHJcbiAqL1xyXG5iYXNlNjQudGVzdCA9IGZ1bmN0aW9uIHRlc3Qoc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gL14oPzpbQS1aYS16MC05Ky9dezR9KSooPzpbQS1aYS16MC05Ky9dezJ9PT18W0EtWmEtejAtOSsvXXszfT0pPyQvLnRlc3Qoc3RyaW5nKTtcclxufTtcclxuIiwgIlwidXNlIHN0cmljdFwiO1xyXG5tb2R1bGUuZXhwb3J0cyA9IEV2ZW50RW1pdHRlcjtcclxuXHJcbi8qKlxyXG4gKiBDb25zdHJ1Y3RzIGEgbmV3IGV2ZW50IGVtaXR0ZXIgaW5zdGFuY2UuXHJcbiAqIEBjbGFzc2Rlc2MgQSBtaW5pbWFsIGV2ZW50IGVtaXR0ZXIuXHJcbiAqIEBtZW1iZXJvZiB1dGlsXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKi9cclxuZnVuY3Rpb24gRXZlbnRFbWl0dGVyKCkge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVnaXN0ZXJlZCBsaXN0ZW5lcnMuXHJcbiAgICAgKiBAdHlwZSB7T2JqZWN0LjxzdHJpbmcsKj59XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXHJcbiAgICB0aGlzLl9saXN0ZW5lcnMgPSB7fTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJlZ2lzdGVycyBhbiBldmVudCBsaXN0ZW5lci5cclxuICogQHBhcmFtIHtzdHJpbmd9IGV2dCBFdmVudCBuYW1lXHJcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGZuIExpc3RlbmVyXHJcbiAqIEBwYXJhbSB7Kn0gW2N0eF0gTGlzdGVuZXIgY29udGV4dFxyXG4gKiBAcmV0dXJucyB7dXRpbC5FdmVudEVtaXR0ZXJ9IGB0aGlzYFxyXG4gKi9cclxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uIG9uKGV2dCwgZm4sIGN0eCkge1xyXG4gICAgKHRoaXMuX2xpc3RlbmVyc1tldnRdIHx8ICh0aGlzLl9saXN0ZW5lcnNbZXZ0XSA9IFtdKSkucHVzaCh7XHJcbiAgICAgICAgZm4gIDogZm4sXHJcbiAgICAgICAgY3R4IDogY3R4IHx8IHRoaXNcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbn07XHJcblxyXG4vKipcclxuICogUmVtb3ZlcyBhbiBldmVudCBsaXN0ZW5lciBvciBhbnkgbWF0Y2hpbmcgbGlzdGVuZXJzIGlmIGFyZ3VtZW50cyBhcmUgb21pdHRlZC5cclxuICogQHBhcmFtIHtzdHJpbmd9IFtldnRdIEV2ZW50IG5hbWUuIFJlbW92ZXMgYWxsIGxpc3RlbmVycyBpZiBvbWl0dGVkLlxyXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBbZm5dIExpc3RlbmVyIHRvIHJlbW92ZS4gUmVtb3ZlcyBhbGwgbGlzdGVuZXJzIG9mIGBldnRgIGlmIG9taXR0ZWQuXHJcbiAqIEByZXR1cm5zIHt1dGlsLkV2ZW50RW1pdHRlcn0gYHRoaXNgXHJcbiAqL1xyXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9mZiA9IGZ1bmN0aW9uIG9mZihldnQsIGZuKSB7XHJcbiAgICBpZiAoZXZ0ID09PSB1bmRlZmluZWQpXHJcbiAgICAgICAgdGhpcy5fbGlzdGVuZXJzID0ge307XHJcbiAgICBlbHNlIHtcclxuICAgICAgICBpZiAoZm4gPT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgdGhpcy5fbGlzdGVuZXJzW2V2dF0gPSBbXTtcclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdmFyIGxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVyc1tldnRdO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7KVxyXG4gICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyc1tpXS5mbiA9PT0gZm4pXHJcbiAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJzLnNwbGljZShpLCAxKTtcclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICArK2k7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXM7XHJcbn07XHJcblxyXG4vKipcclxuICogRW1pdHMgYW4gZXZlbnQgYnkgY2FsbGluZyBpdHMgbGlzdGVuZXJzIHdpdGggdGhlIHNwZWNpZmllZCBhcmd1bWVudHMuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBldnQgRXZlbnQgbmFtZVxyXG4gKiBAcGFyYW0gey4uLip9IGFyZ3MgQXJndW1lbnRzXHJcbiAqIEByZXR1cm5zIHt1dGlsLkV2ZW50RW1pdHRlcn0gYHRoaXNgXHJcbiAqL1xyXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbiBlbWl0KGV2dCkge1xyXG4gICAgdmFyIGxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVyc1tldnRdO1xyXG4gICAgaWYgKGxpc3RlbmVycykge1xyXG4gICAgICAgIHZhciBhcmdzID0gW10sXHJcbiAgICAgICAgICAgIGkgPSAxO1xyXG4gICAgICAgIGZvciAoOyBpIDwgYXJndW1lbnRzLmxlbmd0aDspXHJcbiAgICAgICAgICAgIGFyZ3MucHVzaChhcmd1bWVudHNbaSsrXSk7XHJcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7KVxyXG4gICAgICAgICAgICBsaXN0ZW5lcnNbaV0uZm4uYXBwbHkobGlzdGVuZXJzW2krK10uY3R4LCBhcmdzKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzO1xyXG59O1xyXG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoZmFjdG9yeSk7XHJcblxyXG4vKipcclxuICogUmVhZHMgLyB3cml0ZXMgZmxvYXRzIC8gZG91YmxlcyBmcm9tIC8gdG8gYnVmZmVycy5cclxuICogQG5hbWUgdXRpbC5mbG9hdFxyXG4gKiBAbmFtZXNwYWNlXHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFdyaXRlcyBhIDMyIGJpdCBmbG9hdCB0byBhIGJ1ZmZlciB1c2luZyBsaXR0bGUgZW5kaWFuIGJ5dGUgb3JkZXIuXHJcbiAqIEBuYW1lIHV0aWwuZmxvYXQud3JpdGVGbG9hdExFXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsIFZhbHVlIHRvIHdyaXRlXHJcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gYnVmIFRhcmdldCBidWZmZXJcclxuICogQHBhcmFtIHtudW1iZXJ9IHBvcyBUYXJnZXQgYnVmZmVyIG9mZnNldFxyXG4gKiBAcmV0dXJucyB7dW5kZWZpbmVkfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBXcml0ZXMgYSAzMiBiaXQgZmxvYXQgdG8gYSBidWZmZXIgdXNpbmcgYmlnIGVuZGlhbiBieXRlIG9yZGVyLlxyXG4gKiBAbmFtZSB1dGlsLmZsb2F0LndyaXRlRmxvYXRCRVxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtudW1iZXJ9IHZhbCBWYWx1ZSB0byB3cml0ZVxyXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGJ1ZiBUYXJnZXQgYnVmZmVyXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBwb3MgVGFyZ2V0IGJ1ZmZlciBvZmZzZXRcclxuICogQHJldHVybnMge3VuZGVmaW5lZH1cclxuICovXHJcblxyXG4vKipcclxuICogUmVhZHMgYSAzMiBiaXQgZmxvYXQgZnJvbSBhIGJ1ZmZlciB1c2luZyBsaXR0bGUgZW5kaWFuIGJ5dGUgb3JkZXIuXHJcbiAqIEBuYW1lIHV0aWwuZmxvYXQucmVhZEZsb2F0TEVcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gYnVmIFNvdXJjZSBidWZmZXJcclxuICogQHBhcmFtIHtudW1iZXJ9IHBvcyBTb3VyY2UgYnVmZmVyIG9mZnNldFxyXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBWYWx1ZSByZWFkXHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFJlYWRzIGEgMzIgYml0IGZsb2F0IGZyb20gYSBidWZmZXIgdXNpbmcgYmlnIGVuZGlhbiBieXRlIG9yZGVyLlxyXG4gKiBAbmFtZSB1dGlsLmZsb2F0LnJlYWRGbG9hdEJFXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGJ1ZiBTb3VyY2UgYnVmZmVyXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBwb3MgU291cmNlIGJ1ZmZlciBvZmZzZXRcclxuICogQHJldHVybnMge251bWJlcn0gVmFsdWUgcmVhZFxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBXcml0ZXMgYSA2NCBiaXQgZG91YmxlIHRvIGEgYnVmZmVyIHVzaW5nIGxpdHRsZSBlbmRpYW4gYnl0ZSBvcmRlci5cclxuICogQG5hbWUgdXRpbC5mbG9hdC53cml0ZURvdWJsZUxFXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsIFZhbHVlIHRvIHdyaXRlXHJcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gYnVmIFRhcmdldCBidWZmZXJcclxuICogQHBhcmFtIHtudW1iZXJ9IHBvcyBUYXJnZXQgYnVmZmVyIG9mZnNldFxyXG4gKiBAcmV0dXJucyB7dW5kZWZpbmVkfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBXcml0ZXMgYSA2NCBiaXQgZG91YmxlIHRvIGEgYnVmZmVyIHVzaW5nIGJpZyBlbmRpYW4gYnl0ZSBvcmRlci5cclxuICogQG5hbWUgdXRpbC5mbG9hdC53cml0ZURvdWJsZUJFXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsIFZhbHVlIHRvIHdyaXRlXHJcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gYnVmIFRhcmdldCBidWZmZXJcclxuICogQHBhcmFtIHtudW1iZXJ9IHBvcyBUYXJnZXQgYnVmZmVyIG9mZnNldFxyXG4gKiBAcmV0dXJucyB7dW5kZWZpbmVkfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBSZWFkcyBhIDY0IGJpdCBkb3VibGUgZnJvbSBhIGJ1ZmZlciB1c2luZyBsaXR0bGUgZW5kaWFuIGJ5dGUgb3JkZXIuXHJcbiAqIEBuYW1lIHV0aWwuZmxvYXQucmVhZERvdWJsZUxFXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGJ1ZiBTb3VyY2UgYnVmZmVyXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBwb3MgU291cmNlIGJ1ZmZlciBvZmZzZXRcclxuICogQHJldHVybnMge251bWJlcn0gVmFsdWUgcmVhZFxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBSZWFkcyBhIDY0IGJpdCBkb3VibGUgZnJvbSBhIGJ1ZmZlciB1c2luZyBiaWcgZW5kaWFuIGJ5dGUgb3JkZXIuXHJcbiAqIEBuYW1lIHV0aWwuZmxvYXQucmVhZERvdWJsZUJFXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGJ1ZiBTb3VyY2UgYnVmZmVyXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBwb3MgU291cmNlIGJ1ZmZlciBvZmZzZXRcclxuICogQHJldHVybnMge251bWJlcn0gVmFsdWUgcmVhZFxyXG4gKi9cclxuXHJcbi8vIEZhY3RvcnkgZnVuY3Rpb24gZm9yIHRoZSBwdXJwb3NlIG9mIG5vZGUtYmFzZWQgdGVzdGluZyBpbiBtb2RpZmllZCBnbG9iYWwgZW52aXJvbm1lbnRzXHJcbmZ1bmN0aW9uIGZhY3RvcnkoZXhwb3J0cykge1xyXG5cclxuICAgIC8vIGZsb2F0OiB0eXBlZCBhcnJheVxyXG4gICAgaWYgKHR5cGVvZiBGbG9hdDMyQXJyYXkgIT09IFwidW5kZWZpbmVkXCIpIChmdW5jdGlvbigpIHtcclxuXHJcbiAgICAgICAgdmFyIGYzMiA9IG5ldyBGbG9hdDMyQXJyYXkoWyAtMCBdKSxcclxuICAgICAgICAgICAgZjhiID0gbmV3IFVpbnQ4QXJyYXkoZjMyLmJ1ZmZlciksXHJcbiAgICAgICAgICAgIGxlICA9IGY4YlszXSA9PT0gMTI4O1xyXG5cclxuICAgICAgICBmdW5jdGlvbiB3cml0ZUZsb2F0X2YzMl9jcHkodmFsLCBidWYsIHBvcykge1xyXG4gICAgICAgICAgICBmMzJbMF0gPSB2YWw7XHJcbiAgICAgICAgICAgIGJ1Zltwb3MgICAgXSA9IGY4YlswXTtcclxuICAgICAgICAgICAgYnVmW3BvcyArIDFdID0gZjhiWzFdO1xyXG4gICAgICAgICAgICBidWZbcG9zICsgMl0gPSBmOGJbMl07XHJcbiAgICAgICAgICAgIGJ1Zltwb3MgKyAzXSA9IGY4YlszXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIHdyaXRlRmxvYXRfZjMyX3Jldih2YWwsIGJ1ZiwgcG9zKSB7XHJcbiAgICAgICAgICAgIGYzMlswXSA9IHZhbDtcclxuICAgICAgICAgICAgYnVmW3BvcyAgICBdID0gZjhiWzNdO1xyXG4gICAgICAgICAgICBidWZbcG9zICsgMV0gPSBmOGJbMl07XHJcbiAgICAgICAgICAgIGJ1Zltwb3MgKyAyXSA9IGY4YlsxXTtcclxuICAgICAgICAgICAgYnVmW3BvcyArIDNdID0gZjhiWzBdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cclxuICAgICAgICBleHBvcnRzLndyaXRlRmxvYXRMRSA9IGxlID8gd3JpdGVGbG9hdF9mMzJfY3B5IDogd3JpdGVGbG9hdF9mMzJfcmV2O1xyXG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXHJcbiAgICAgICAgZXhwb3J0cy53cml0ZUZsb2F0QkUgPSBsZSA/IHdyaXRlRmxvYXRfZjMyX3JldiA6IHdyaXRlRmxvYXRfZjMyX2NweTtcclxuXHJcbiAgICAgICAgZnVuY3Rpb24gcmVhZEZsb2F0X2YzMl9jcHkoYnVmLCBwb3MpIHtcclxuICAgICAgICAgICAgZjhiWzBdID0gYnVmW3BvcyAgICBdO1xyXG4gICAgICAgICAgICBmOGJbMV0gPSBidWZbcG9zICsgMV07XHJcbiAgICAgICAgICAgIGY4YlsyXSA9IGJ1Zltwb3MgKyAyXTtcclxuICAgICAgICAgICAgZjhiWzNdID0gYnVmW3BvcyArIDNdO1xyXG4gICAgICAgICAgICByZXR1cm4gZjMyWzBdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gcmVhZEZsb2F0X2YzMl9yZXYoYnVmLCBwb3MpIHtcclxuICAgICAgICAgICAgZjhiWzNdID0gYnVmW3BvcyAgICBdO1xyXG4gICAgICAgICAgICBmOGJbMl0gPSBidWZbcG9zICsgMV07XHJcbiAgICAgICAgICAgIGY4YlsxXSA9IGJ1Zltwb3MgKyAyXTtcclxuICAgICAgICAgICAgZjhiWzBdID0gYnVmW3BvcyArIDNdO1xyXG4gICAgICAgICAgICByZXR1cm4gZjMyWzBdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cclxuICAgICAgICBleHBvcnRzLnJlYWRGbG9hdExFID0gbGUgPyByZWFkRmxvYXRfZjMyX2NweSA6IHJlYWRGbG9hdF9mMzJfcmV2O1xyXG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXHJcbiAgICAgICAgZXhwb3J0cy5yZWFkRmxvYXRCRSA9IGxlID8gcmVhZEZsb2F0X2YzMl9yZXYgOiByZWFkRmxvYXRfZjMyX2NweTtcclxuXHJcbiAgICAvLyBmbG9hdDogaWVlZTc1NFxyXG4gICAgfSkoKTsgZWxzZSAoZnVuY3Rpb24oKSB7XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIHdyaXRlRmxvYXRfaWVlZTc1NCh3cml0ZVVpbnQsIHZhbCwgYnVmLCBwb3MpIHtcclxuICAgICAgICAgICAgdmFyIHNpZ24gPSB2YWwgPCAwID8gMSA6IDA7XHJcbiAgICAgICAgICAgIGlmIChzaWduKVxyXG4gICAgICAgICAgICAgICAgdmFsID0gLXZhbDtcclxuICAgICAgICAgICAgaWYgKHZhbCA9PT0gMClcclxuICAgICAgICAgICAgICAgIHdyaXRlVWludCgxIC8gdmFsID4gMCA/IC8qIHBvc2l0aXZlICovIDAgOiAvKiBuZWdhdGl2ZSAwICovIDIxNDc0ODM2NDgsIGJ1ZiwgcG9zKTtcclxuICAgICAgICAgICAgZWxzZSBpZiAoaXNOYU4odmFsKSlcclxuICAgICAgICAgICAgICAgIHdyaXRlVWludCgyMTQzMjg5MzQ0LCBidWYsIHBvcyk7XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHZhbCA+IDMuNDAyODIzNDY2Mzg1Mjg4NmUrMzgpIC8vICstSW5maW5pdHlcclxuICAgICAgICAgICAgICAgIHdyaXRlVWludCgoc2lnbiA8PCAzMSB8IDIxMzkwOTUwNDApID4+PiAwLCBidWYsIHBvcyk7XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHZhbCA8IDEuMTc1NDk0MzUwODIyMjg3NWUtMzgpIC8vIGRlbm9ybWFsXHJcbiAgICAgICAgICAgICAgICB3cml0ZVVpbnQoKHNpZ24gPDwgMzEgfCBNYXRoLnJvdW5kKHZhbCAvIDEuNDAxMjk4NDY0MzI0ODE3ZS00NSkpID4+PiAwLCBidWYsIHBvcyk7XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdmFyIGV4cG9uZW50ID0gTWF0aC5mbG9vcihNYXRoLmxvZyh2YWwpIC8gTWF0aC5MTjIpLFxyXG4gICAgICAgICAgICAgICAgICAgIG1hbnRpc3NhID0gTWF0aC5yb3VuZCh2YWwgKiBNYXRoLnBvdygyLCAtZXhwb25lbnQpICogODM4ODYwOCkgJiA4Mzg4NjA3O1xyXG4gICAgICAgICAgICAgICAgd3JpdGVVaW50KChzaWduIDw8IDMxIHwgZXhwb25lbnQgKyAxMjcgPDwgMjMgfCBtYW50aXNzYSkgPj4+IDAsIGJ1ZiwgcG9zKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZXhwb3J0cy53cml0ZUZsb2F0TEUgPSB3cml0ZUZsb2F0X2llZWU3NTQuYmluZChudWxsLCB3cml0ZVVpbnRMRSk7XHJcbiAgICAgICAgZXhwb3J0cy53cml0ZUZsb2F0QkUgPSB3cml0ZUZsb2F0X2llZWU3NTQuYmluZChudWxsLCB3cml0ZVVpbnRCRSk7XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIHJlYWRGbG9hdF9pZWVlNzU0KHJlYWRVaW50LCBidWYsIHBvcykge1xyXG4gICAgICAgICAgICB2YXIgdWludCA9IHJlYWRVaW50KGJ1ZiwgcG9zKSxcclxuICAgICAgICAgICAgICAgIHNpZ24gPSAodWludCA+PiAzMSkgKiAyICsgMSxcclxuICAgICAgICAgICAgICAgIGV4cG9uZW50ID0gdWludCA+Pj4gMjMgJiAyNTUsXHJcbiAgICAgICAgICAgICAgICBtYW50aXNzYSA9IHVpbnQgJiA4Mzg4NjA3O1xyXG4gICAgICAgICAgICByZXR1cm4gZXhwb25lbnQgPT09IDI1NVxyXG4gICAgICAgICAgICAgICAgPyBtYW50aXNzYVxyXG4gICAgICAgICAgICAgICAgPyBOYU5cclxuICAgICAgICAgICAgICAgIDogc2lnbiAqIEluZmluaXR5XHJcbiAgICAgICAgICAgICAgICA6IGV4cG9uZW50ID09PSAwIC8vIGRlbm9ybWFsXHJcbiAgICAgICAgICAgICAgICA/IHNpZ24gKiAxLjQwMTI5ODQ2NDMyNDgxN2UtNDUgKiBtYW50aXNzYVxyXG4gICAgICAgICAgICAgICAgOiBzaWduICogTWF0aC5wb3coMiwgZXhwb25lbnQgLSAxNTApICogKG1hbnRpc3NhICsgODM4ODYwOCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBleHBvcnRzLnJlYWRGbG9hdExFID0gcmVhZEZsb2F0X2llZWU3NTQuYmluZChudWxsLCByZWFkVWludExFKTtcclxuICAgICAgICBleHBvcnRzLnJlYWRGbG9hdEJFID0gcmVhZEZsb2F0X2llZWU3NTQuYmluZChudWxsLCByZWFkVWludEJFKTtcclxuXHJcbiAgICB9KSgpO1xyXG5cclxuICAgIC8vIGRvdWJsZTogdHlwZWQgYXJyYXlcclxuICAgIGlmICh0eXBlb2YgRmxvYXQ2NEFycmF5ICE9PSBcInVuZGVmaW5lZFwiKSAoZnVuY3Rpb24oKSB7XHJcblxyXG4gICAgICAgIHZhciBmNjQgPSBuZXcgRmxvYXQ2NEFycmF5KFstMF0pLFxyXG4gICAgICAgICAgICBmOGIgPSBuZXcgVWludDhBcnJheShmNjQuYnVmZmVyKSxcclxuICAgICAgICAgICAgbGUgID0gZjhiWzddID09PSAxMjg7XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIHdyaXRlRG91YmxlX2Y2NF9jcHkodmFsLCBidWYsIHBvcykge1xyXG4gICAgICAgICAgICBmNjRbMF0gPSB2YWw7XHJcbiAgICAgICAgICAgIGJ1Zltwb3MgICAgXSA9IGY4YlswXTtcclxuICAgICAgICAgICAgYnVmW3BvcyArIDFdID0gZjhiWzFdO1xyXG4gICAgICAgICAgICBidWZbcG9zICsgMl0gPSBmOGJbMl07XHJcbiAgICAgICAgICAgIGJ1Zltwb3MgKyAzXSA9IGY4YlszXTtcclxuICAgICAgICAgICAgYnVmW3BvcyArIDRdID0gZjhiWzRdO1xyXG4gICAgICAgICAgICBidWZbcG9zICsgNV0gPSBmOGJbNV07XHJcbiAgICAgICAgICAgIGJ1Zltwb3MgKyA2XSA9IGY4Yls2XTtcclxuICAgICAgICAgICAgYnVmW3BvcyArIDddID0gZjhiWzddO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gd3JpdGVEb3VibGVfZjY0X3Jldih2YWwsIGJ1ZiwgcG9zKSB7XHJcbiAgICAgICAgICAgIGY2NFswXSA9IHZhbDtcclxuICAgICAgICAgICAgYnVmW3BvcyAgICBdID0gZjhiWzddO1xyXG4gICAgICAgICAgICBidWZbcG9zICsgMV0gPSBmOGJbNl07XHJcbiAgICAgICAgICAgIGJ1Zltwb3MgKyAyXSA9IGY4Yls1XTtcclxuICAgICAgICAgICAgYnVmW3BvcyArIDNdID0gZjhiWzRdO1xyXG4gICAgICAgICAgICBidWZbcG9zICsgNF0gPSBmOGJbM107XHJcbiAgICAgICAgICAgIGJ1Zltwb3MgKyA1XSA9IGY4YlsyXTtcclxuICAgICAgICAgICAgYnVmW3BvcyArIDZdID0gZjhiWzFdO1xyXG4gICAgICAgICAgICBidWZbcG9zICsgN10gPSBmOGJbMF07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xyXG4gICAgICAgIGV4cG9ydHMud3JpdGVEb3VibGVMRSA9IGxlID8gd3JpdGVEb3VibGVfZjY0X2NweSA6IHdyaXRlRG91YmxlX2Y2NF9yZXY7XHJcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cclxuICAgICAgICBleHBvcnRzLndyaXRlRG91YmxlQkUgPSBsZSA/IHdyaXRlRG91YmxlX2Y2NF9yZXYgOiB3cml0ZURvdWJsZV9mNjRfY3B5O1xyXG5cclxuICAgICAgICBmdW5jdGlvbiByZWFkRG91YmxlX2Y2NF9jcHkoYnVmLCBwb3MpIHtcclxuICAgICAgICAgICAgZjhiWzBdID0gYnVmW3BvcyAgICBdO1xyXG4gICAgICAgICAgICBmOGJbMV0gPSBidWZbcG9zICsgMV07XHJcbiAgICAgICAgICAgIGY4YlsyXSA9IGJ1Zltwb3MgKyAyXTtcclxuICAgICAgICAgICAgZjhiWzNdID0gYnVmW3BvcyArIDNdO1xyXG4gICAgICAgICAgICBmOGJbNF0gPSBidWZbcG9zICsgNF07XHJcbiAgICAgICAgICAgIGY4Yls1XSA9IGJ1Zltwb3MgKyA1XTtcclxuICAgICAgICAgICAgZjhiWzZdID0gYnVmW3BvcyArIDZdO1xyXG4gICAgICAgICAgICBmOGJbN10gPSBidWZbcG9zICsgN107XHJcbiAgICAgICAgICAgIHJldHVybiBmNjRbMF07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdW5jdGlvbiByZWFkRG91YmxlX2Y2NF9yZXYoYnVmLCBwb3MpIHtcclxuICAgICAgICAgICAgZjhiWzddID0gYnVmW3BvcyAgICBdO1xyXG4gICAgICAgICAgICBmOGJbNl0gPSBidWZbcG9zICsgMV07XHJcbiAgICAgICAgICAgIGY4Yls1XSA9IGJ1Zltwb3MgKyAyXTtcclxuICAgICAgICAgICAgZjhiWzRdID0gYnVmW3BvcyArIDNdO1xyXG4gICAgICAgICAgICBmOGJbM10gPSBidWZbcG9zICsgNF07XHJcbiAgICAgICAgICAgIGY4YlsyXSA9IGJ1Zltwb3MgKyA1XTtcclxuICAgICAgICAgICAgZjhiWzFdID0gYnVmW3BvcyArIDZdO1xyXG4gICAgICAgICAgICBmOGJbMF0gPSBidWZbcG9zICsgN107XHJcbiAgICAgICAgICAgIHJldHVybiBmNjRbMF07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xyXG4gICAgICAgIGV4cG9ydHMucmVhZERvdWJsZUxFID0gbGUgPyByZWFkRG91YmxlX2Y2NF9jcHkgOiByZWFkRG91YmxlX2Y2NF9yZXY7XHJcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cclxuICAgICAgICBleHBvcnRzLnJlYWREb3VibGVCRSA9IGxlID8gcmVhZERvdWJsZV9mNjRfcmV2IDogcmVhZERvdWJsZV9mNjRfY3B5O1xyXG5cclxuICAgIC8vIGRvdWJsZTogaWVlZTc1NFxyXG4gICAgfSkoKTsgZWxzZSAoZnVuY3Rpb24oKSB7XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIHdyaXRlRG91YmxlX2llZWU3NTQod3JpdGVVaW50LCBvZmYwLCBvZmYxLCB2YWwsIGJ1ZiwgcG9zKSB7XHJcbiAgICAgICAgICAgIHZhciBzaWduID0gdmFsIDwgMCA/IDEgOiAwO1xyXG4gICAgICAgICAgICBpZiAoc2lnbilcclxuICAgICAgICAgICAgICAgIHZhbCA9IC12YWw7XHJcbiAgICAgICAgICAgIGlmICh2YWwgPT09IDApIHtcclxuICAgICAgICAgICAgICAgIHdyaXRlVWludCgwLCBidWYsIHBvcyArIG9mZjApO1xyXG4gICAgICAgICAgICAgICAgd3JpdGVVaW50KDEgLyB2YWwgPiAwID8gLyogcG9zaXRpdmUgKi8gMCA6IC8qIG5lZ2F0aXZlIDAgKi8gMjE0NzQ4MzY0OCwgYnVmLCBwb3MgKyBvZmYxKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChpc05hTih2YWwpKSB7XHJcbiAgICAgICAgICAgICAgICB3cml0ZVVpbnQoMCwgYnVmLCBwb3MgKyBvZmYwKTtcclxuICAgICAgICAgICAgICAgIHdyaXRlVWludCgyMTQ2OTU5MzYwLCBidWYsIHBvcyArIG9mZjEpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHZhbCA+IDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4KSB7IC8vICstSW5maW5pdHlcclxuICAgICAgICAgICAgICAgIHdyaXRlVWludCgwLCBidWYsIHBvcyArIG9mZjApO1xyXG4gICAgICAgICAgICAgICAgd3JpdGVVaW50KChzaWduIDw8IDMxIHwgMjE0NjQzNTA3MikgPj4+IDAsIGJ1ZiwgcG9zICsgb2ZmMSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgbWFudGlzc2E7XHJcbiAgICAgICAgICAgICAgICBpZiAodmFsIDwgMi4yMjUwNzM4NTg1MDcyMDE0ZS0zMDgpIHsgLy8gZGVub3JtYWxcclxuICAgICAgICAgICAgICAgICAgICBtYW50aXNzYSA9IHZhbCAvIDVlLTMyNDtcclxuICAgICAgICAgICAgICAgICAgICB3cml0ZVVpbnQobWFudGlzc2EgPj4+IDAsIGJ1ZiwgcG9zICsgb2ZmMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVVaW50KChzaWduIDw8IDMxIHwgbWFudGlzc2EgLyA0Mjk0OTY3Mjk2KSA+Pj4gMCwgYnVmLCBwb3MgKyBvZmYxKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGV4cG9uZW50ID0gTWF0aC5mbG9vcihNYXRoLmxvZyh2YWwpIC8gTWF0aC5MTjIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChleHBvbmVudCA9PT0gMTAyNClcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXhwb25lbnQgPSAxMDIzO1xyXG4gICAgICAgICAgICAgICAgICAgIG1hbnRpc3NhID0gdmFsICogTWF0aC5wb3coMiwgLWV4cG9uZW50KTtcclxuICAgICAgICAgICAgICAgICAgICB3cml0ZVVpbnQobWFudGlzc2EgKiA0NTAzNTk5NjI3MzcwNDk2ID4+PiAwLCBidWYsIHBvcyArIG9mZjApO1xyXG4gICAgICAgICAgICAgICAgICAgIHdyaXRlVWludCgoc2lnbiA8PCAzMSB8IGV4cG9uZW50ICsgMTAyMyA8PCAyMCB8IG1hbnRpc3NhICogMTA0ODU3NiAmIDEwNDg1NzUpID4+PiAwLCBidWYsIHBvcyArIG9mZjEpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBleHBvcnRzLndyaXRlRG91YmxlTEUgPSB3cml0ZURvdWJsZV9pZWVlNzU0LmJpbmQobnVsbCwgd3JpdGVVaW50TEUsIDAsIDQpO1xyXG4gICAgICAgIGV4cG9ydHMud3JpdGVEb3VibGVCRSA9IHdyaXRlRG91YmxlX2llZWU3NTQuYmluZChudWxsLCB3cml0ZVVpbnRCRSwgNCwgMCk7XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIHJlYWREb3VibGVfaWVlZTc1NChyZWFkVWludCwgb2ZmMCwgb2ZmMSwgYnVmLCBwb3MpIHtcclxuICAgICAgICAgICAgdmFyIGxvID0gcmVhZFVpbnQoYnVmLCBwb3MgKyBvZmYwKSxcclxuICAgICAgICAgICAgICAgIGhpID0gcmVhZFVpbnQoYnVmLCBwb3MgKyBvZmYxKTtcclxuICAgICAgICAgICAgdmFyIHNpZ24gPSAoaGkgPj4gMzEpICogMiArIDEsXHJcbiAgICAgICAgICAgICAgICBleHBvbmVudCA9IGhpID4+PiAyMCAmIDIwNDcsXHJcbiAgICAgICAgICAgICAgICBtYW50aXNzYSA9IDQyOTQ5NjcyOTYgKiAoaGkgJiAxMDQ4NTc1KSArIGxvO1xyXG4gICAgICAgICAgICByZXR1cm4gZXhwb25lbnQgPT09IDIwNDdcclxuICAgICAgICAgICAgICAgID8gbWFudGlzc2FcclxuICAgICAgICAgICAgICAgID8gTmFOXHJcbiAgICAgICAgICAgICAgICA6IHNpZ24gKiBJbmZpbml0eVxyXG4gICAgICAgICAgICAgICAgOiBleHBvbmVudCA9PT0gMCAvLyBkZW5vcm1hbFxyXG4gICAgICAgICAgICAgICAgPyBzaWduICogNWUtMzI0ICogbWFudGlzc2FcclxuICAgICAgICAgICAgICAgIDogc2lnbiAqIE1hdGgucG93KDIsIGV4cG9uZW50IC0gMTA3NSkgKiAobWFudGlzc2EgKyA0NTAzNTk5NjI3MzcwNDk2KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGV4cG9ydHMucmVhZERvdWJsZUxFID0gcmVhZERvdWJsZV9pZWVlNzU0LmJpbmQobnVsbCwgcmVhZFVpbnRMRSwgMCwgNCk7XHJcbiAgICAgICAgZXhwb3J0cy5yZWFkRG91YmxlQkUgPSByZWFkRG91YmxlX2llZWU3NTQuYmluZChudWxsLCByZWFkVWludEJFLCA0LCAwKTtcclxuXHJcbiAgICB9KSgpO1xyXG5cclxuICAgIHJldHVybiBleHBvcnRzO1xyXG59XHJcblxyXG4vLyB1aW50IGhlbHBlcnNcclxuXHJcbmZ1bmN0aW9uIHdyaXRlVWludExFKHZhbCwgYnVmLCBwb3MpIHtcclxuICAgIGJ1Zltwb3MgICAgXSA9ICB2YWwgICAgICAgICYgMjU1O1xyXG4gICAgYnVmW3BvcyArIDFdID0gIHZhbCA+Pj4gOCAgJiAyNTU7XHJcbiAgICBidWZbcG9zICsgMl0gPSAgdmFsID4+PiAxNiAmIDI1NTtcclxuICAgIGJ1Zltwb3MgKyAzXSA9ICB2YWwgPj4+IDI0O1xyXG59XHJcblxyXG5mdW5jdGlvbiB3cml0ZVVpbnRCRSh2YWwsIGJ1ZiwgcG9zKSB7XHJcbiAgICBidWZbcG9zICAgIF0gPSAgdmFsID4+PiAyNDtcclxuICAgIGJ1Zltwb3MgKyAxXSA9ICB2YWwgPj4+IDE2ICYgMjU1O1xyXG4gICAgYnVmW3BvcyArIDJdID0gIHZhbCA+Pj4gOCAgJiAyNTU7XHJcbiAgICBidWZbcG9zICsgM10gPSAgdmFsICAgICAgICAmIDI1NTtcclxufVxyXG5cclxuZnVuY3Rpb24gcmVhZFVpbnRMRShidWYsIHBvcykge1xyXG4gICAgcmV0dXJuIChidWZbcG9zICAgIF1cclxuICAgICAgICAgIHwgYnVmW3BvcyArIDFdIDw8IDhcclxuICAgICAgICAgIHwgYnVmW3BvcyArIDJdIDw8IDE2XHJcbiAgICAgICAgICB8IGJ1Zltwb3MgKyAzXSA8PCAyNCkgPj4+IDA7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlYWRVaW50QkUoYnVmLCBwb3MpIHtcclxuICAgIHJldHVybiAoYnVmW3BvcyAgICBdIDw8IDI0XHJcbiAgICAgICAgICB8IGJ1Zltwb3MgKyAxXSA8PCAxNlxyXG4gICAgICAgICAgfCBidWZbcG9zICsgMl0gPDwgOFxyXG4gICAgICAgICAgfCBidWZbcG9zICsgM10pID4+PiAwO1xyXG59XHJcbiIsICJcInVzZSBzdHJpY3RcIjtcclxubW9kdWxlLmV4cG9ydHMgPSBpbnF1aXJlO1xyXG5cclxuLyoqXHJcbiAqIFJlcXVpcmVzIGEgbW9kdWxlIG9ubHkgaWYgYXZhaWxhYmxlLlxyXG4gKiBAbWVtYmVyb2YgdXRpbFxyXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kdWxlTmFtZSBNb2R1bGUgdG8gcmVxdWlyZVxyXG4gKiBAcmV0dXJucyB7P09iamVjdH0gUmVxdWlyZWQgbW9kdWxlIGlmIGF2YWlsYWJsZSBhbmQgbm90IGVtcHR5LCBvdGhlcndpc2UgYG51bGxgXHJcbiAqL1xyXG5mdW5jdGlvbiBpbnF1aXJlKG1vZHVsZU5hbWUpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgdmFyIG1vZCA9IGV2YWwoXCJxdWlyZVwiLnJlcGxhY2UoL14vLFwicmVcIikpKG1vZHVsZU5hbWUpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWV2YWxcclxuICAgICAgICBpZiAobW9kICYmIChtb2QubGVuZ3RoIHx8IE9iamVjdC5rZXlzKG1vZCkubGVuZ3RoKSlcclxuICAgICAgICAgICAgcmV0dXJuIG1vZDtcclxuICAgIH0gY2F0Y2ggKGUpIHt9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tZW1wdHlcclxuICAgIHJldHVybiBudWxsO1xyXG59XHJcbiIsICJcInVzZSBzdHJpY3RcIjtcclxuXHJcbi8qKlxyXG4gKiBBIG1pbmltYWwgVVRGOCBpbXBsZW1lbnRhdGlvbiBmb3IgbnVtYmVyIGFycmF5cy5cclxuICogQG1lbWJlcm9mIHV0aWxcclxuICogQG5hbWVzcGFjZVxyXG4gKi9cclxudmFyIHV0ZjggPSBleHBvcnRzO1xyXG5cclxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIFVURjggYnl0ZSBsZW5ndGggb2YgYSBzdHJpbmcuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgU3RyaW5nXHJcbiAqIEByZXR1cm5zIHtudW1iZXJ9IEJ5dGUgbGVuZ3RoXHJcbiAqL1xyXG51dGY4Lmxlbmd0aCA9IGZ1bmN0aW9uIHV0ZjhfbGVuZ3RoKHN0cmluZykge1xyXG4gICAgdmFyIGxlbiA9IDAsXHJcbiAgICAgICAgYyA9IDA7XHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0cmluZy5sZW5ndGg7ICsraSkge1xyXG4gICAgICAgIGMgPSBzdHJpbmcuY2hhckNvZGVBdChpKTtcclxuICAgICAgICBpZiAoYyA8IDEyOClcclxuICAgICAgICAgICAgbGVuICs9IDE7XHJcbiAgICAgICAgZWxzZSBpZiAoYyA8IDIwNDgpXHJcbiAgICAgICAgICAgIGxlbiArPSAyO1xyXG4gICAgICAgIGVsc2UgaWYgKChjICYgMHhGQzAwKSA9PT0gMHhEODAwICYmIChzdHJpbmcuY2hhckNvZGVBdChpICsgMSkgJiAweEZDMDApID09PSAweERDMDApIHtcclxuICAgICAgICAgICAgKytpO1xyXG4gICAgICAgICAgICBsZW4gKz0gNDtcclxuICAgICAgICB9IGVsc2VcclxuICAgICAgICAgICAgbGVuICs9IDM7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbGVuO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFJlYWRzIFVURjggYnl0ZXMgYXMgYSBzdHJpbmcuXHJcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gYnVmZmVyIFNvdXJjZSBidWZmZXJcclxuICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IFNvdXJjZSBzdGFydFxyXG4gKiBAcGFyYW0ge251bWJlcn0gZW5kIFNvdXJjZSBlbmRcclxuICogQHJldHVybnMge3N0cmluZ30gU3RyaW5nIHJlYWRcclxuICovXHJcbnV0ZjgucmVhZCA9IGZ1bmN0aW9uIHV0ZjhfcmVhZChidWZmZXIsIHN0YXJ0LCBlbmQpIHtcclxuICAgIHZhciBsZW4gPSBlbmQgLSBzdGFydDtcclxuICAgIGlmIChsZW4gPCAxKVxyXG4gICAgICAgIHJldHVybiBcIlwiO1xyXG4gICAgdmFyIHBhcnRzID0gbnVsbCxcclxuICAgICAgICBjaHVuayA9IFtdLFxyXG4gICAgICAgIGkgPSAwLCAvLyBjaGFyIG9mZnNldFxyXG4gICAgICAgIHQ7ICAgICAvLyB0ZW1wb3JhcnlcclxuICAgIHdoaWxlIChzdGFydCA8IGVuZCkge1xyXG4gICAgICAgIHQgPSBidWZmZXJbc3RhcnQrK107XHJcbiAgICAgICAgaWYgKHQgPCAxMjgpXHJcbiAgICAgICAgICAgIGNodW5rW2krK10gPSB0O1xyXG4gICAgICAgIGVsc2UgaWYgKHQgPiAxOTEgJiYgdCA8IDIyNClcclxuICAgICAgICAgICAgY2h1bmtbaSsrXSA9ICh0ICYgMzEpIDw8IDYgfCBidWZmZXJbc3RhcnQrK10gJiA2MztcclxuICAgICAgICBlbHNlIGlmICh0ID4gMjM5ICYmIHQgPCAzNjUpIHtcclxuICAgICAgICAgICAgdCA9ICgodCAmIDcpIDw8IDE4IHwgKGJ1ZmZlcltzdGFydCsrXSAmIDYzKSA8PCAxMiB8IChidWZmZXJbc3RhcnQrK10gJiA2MykgPDwgNiB8IGJ1ZmZlcltzdGFydCsrXSAmIDYzKSAtIDB4MTAwMDA7XHJcbiAgICAgICAgICAgIGNodW5rW2krK10gPSAweEQ4MDAgKyAodCA+PiAxMCk7XHJcbiAgICAgICAgICAgIGNodW5rW2krK10gPSAweERDMDAgKyAodCAmIDEwMjMpO1xyXG4gICAgICAgIH0gZWxzZVxyXG4gICAgICAgICAgICBjaHVua1tpKytdID0gKHQgJiAxNSkgPDwgMTIgfCAoYnVmZmVyW3N0YXJ0KytdICYgNjMpIDw8IDYgfCBidWZmZXJbc3RhcnQrK10gJiA2MztcclxuICAgICAgICBpZiAoaSA+IDgxOTEpIHtcclxuICAgICAgICAgICAgKHBhcnRzIHx8IChwYXJ0cyA9IFtdKSkucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZywgY2h1bmspKTtcclxuICAgICAgICAgICAgaSA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHBhcnRzKSB7XHJcbiAgICAgICAgaWYgKGkpXHJcbiAgICAgICAgICAgIHBhcnRzLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsIGNodW5rLnNsaWNlKDAsIGkpKSk7XHJcbiAgICAgICAgcmV0dXJuIHBhcnRzLmpvaW4oXCJcIik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsIGNodW5rLnNsaWNlKDAsIGkpKTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBXcml0ZXMgYSBzdHJpbmcgYXMgVVRGOCBieXRlcy5cclxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBTb3VyY2Ugc3RyaW5nXHJcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gYnVmZmVyIERlc3RpbmF0aW9uIGJ1ZmZlclxyXG4gKiBAcGFyYW0ge251bWJlcn0gb2Zmc2V0IERlc3RpbmF0aW9uIG9mZnNldFxyXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBCeXRlcyB3cml0dGVuXHJcbiAqL1xyXG51dGY4LndyaXRlID0gZnVuY3Rpb24gdXRmOF93cml0ZShzdHJpbmcsIGJ1ZmZlciwgb2Zmc2V0KSB7XHJcbiAgICB2YXIgc3RhcnQgPSBvZmZzZXQsXHJcbiAgICAgICAgYzEsIC8vIGNoYXJhY3RlciAxXHJcbiAgICAgICAgYzI7IC8vIGNoYXJhY3RlciAyXHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0cmluZy5sZW5ndGg7ICsraSkge1xyXG4gICAgICAgIGMxID0gc3RyaW5nLmNoYXJDb2RlQXQoaSk7XHJcbiAgICAgICAgaWYgKGMxIDwgMTI4KSB7XHJcbiAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBjMTtcclxuICAgICAgICB9IGVsc2UgaWYgKGMxIDwgMjA0OCkge1xyXG4gICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gYzEgPj4gNiAgICAgICB8IDE5MjtcclxuICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IGMxICAgICAgICYgNjMgfCAxMjg7XHJcbiAgICAgICAgfSBlbHNlIGlmICgoYzEgJiAweEZDMDApID09PSAweEQ4MDAgJiYgKChjMiA9IHN0cmluZy5jaGFyQ29kZUF0KGkgKyAxKSkgJiAweEZDMDApID09PSAweERDMDApIHtcclxuICAgICAgICAgICAgYzEgPSAweDEwMDAwICsgKChjMSAmIDB4MDNGRikgPDwgMTApICsgKGMyICYgMHgwM0ZGKTtcclxuICAgICAgICAgICAgKytpO1xyXG4gICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gYzEgPj4gMTggICAgICB8IDI0MDtcclxuICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IGMxID4+IDEyICYgNjMgfCAxMjg7XHJcbiAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBjMSA+PiA2ICAmIDYzIHwgMTI4O1xyXG4gICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gYzEgICAgICAgJiA2MyB8IDEyODtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gYzEgPj4gMTIgICAgICB8IDIyNDtcclxuICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IGMxID4+IDYgICYgNjMgfCAxMjg7XHJcbiAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBjMSAgICAgICAmIDYzIHwgMTI4O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBvZmZzZXQgLSBzdGFydDtcclxufTtcclxuIiwgIlwidXNlIHN0cmljdFwiO1xyXG5tb2R1bGUuZXhwb3J0cyA9IHBvb2w7XHJcblxyXG4vKipcclxuICogQW4gYWxsb2NhdG9yIGFzIHVzZWQgYnkge0BsaW5rIHV0aWwucG9vbH0uXHJcbiAqIEB0eXBlZGVmIFBvb2xBbGxvY2F0b3JcclxuICogQHR5cGUge2Z1bmN0aW9ufVxyXG4gKiBAcGFyYW0ge251bWJlcn0gc2l6ZSBCdWZmZXIgc2l6ZVxyXG4gKiBAcmV0dXJucyB7VWludDhBcnJheX0gQnVmZmVyXHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEEgc2xpY2VyIGFzIHVzZWQgYnkge0BsaW5rIHV0aWwucG9vbH0uXHJcbiAqIEB0eXBlZGVmIFBvb2xTbGljZXJcclxuICogQHR5cGUge2Z1bmN0aW9ufVxyXG4gKiBAcGFyYW0ge251bWJlcn0gc3RhcnQgU3RhcnQgb2Zmc2V0XHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBlbmQgRW5kIG9mZnNldFxyXG4gKiBAcmV0dXJucyB7VWludDhBcnJheX0gQnVmZmVyIHNsaWNlXHJcbiAqIEB0aGlzIHtVaW50OEFycmF5fVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBBIGdlbmVyYWwgcHVycG9zZSBidWZmZXIgcG9vbC5cclxuICogQG1lbWJlcm9mIHV0aWxcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7UG9vbEFsbG9jYXRvcn0gYWxsb2MgQWxsb2NhdG9yXHJcbiAqIEBwYXJhbSB7UG9vbFNsaWNlcn0gc2xpY2UgU2xpY2VyXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbc2l6ZT04MTkyXSBTbGFiIHNpemVcclxuICogQHJldHVybnMge1Bvb2xBbGxvY2F0b3J9IFBvb2xlZCBhbGxvY2F0b3JcclxuICovXHJcbmZ1bmN0aW9uIHBvb2woYWxsb2MsIHNsaWNlLCBzaXplKSB7XHJcbiAgICB2YXIgU0laRSAgID0gc2l6ZSB8fCA4MTkyO1xyXG4gICAgdmFyIE1BWCAgICA9IFNJWkUgPj4+IDE7XHJcbiAgICB2YXIgc2xhYiAgID0gbnVsbDtcclxuICAgIHZhciBvZmZzZXQgPSBTSVpFO1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uIHBvb2xfYWxsb2Moc2l6ZSkge1xyXG4gICAgICAgIGlmIChzaXplIDwgMSB8fCBzaXplID4gTUFYKVxyXG4gICAgICAgICAgICByZXR1cm4gYWxsb2Moc2l6ZSk7XHJcbiAgICAgICAgaWYgKG9mZnNldCArIHNpemUgPiBTSVpFKSB7XHJcbiAgICAgICAgICAgIHNsYWIgPSBhbGxvYyhTSVpFKTtcclxuICAgICAgICAgICAgb2Zmc2V0ID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGJ1ZiA9IHNsaWNlLmNhbGwoc2xhYiwgb2Zmc2V0LCBvZmZzZXQgKz0gc2l6ZSk7XHJcbiAgICAgICAgaWYgKG9mZnNldCAmIDcpIC8vIGFsaWduIHRvIDMyIGJpdFxyXG4gICAgICAgICAgICBvZmZzZXQgPSAob2Zmc2V0IHwgNykgKyAxO1xyXG4gICAgICAgIHJldHVybiBidWY7XHJcbiAgICB9O1xyXG59XHJcbiIsICJcInVzZSBzdHJpY3RcIjtcbm1vZHVsZS5leHBvcnRzID0gTG9uZ0JpdHM7XG5cbnZhciB1dGlsID0gcmVxdWlyZShcIi4uL3V0aWwvbWluaW1hbFwiKTtcblxuLyoqXG4gKiBDb25zdHJ1Y3RzIG5ldyBsb25nIGJpdHMuXG4gKiBAY2xhc3NkZXNjIEhlbHBlciBjbGFzcyBmb3Igd29ya2luZyB3aXRoIHRoZSBsb3cgYW5kIGhpZ2ggYml0cyBvZiBhIDY0IGJpdCB2YWx1ZS5cbiAqIEBtZW1iZXJvZiB1dGlsXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7bnVtYmVyfSBsbyBMb3cgMzIgYml0cywgdW5zaWduZWRcbiAqIEBwYXJhbSB7bnVtYmVyfSBoaSBIaWdoIDMyIGJpdHMsIHVuc2lnbmVkXG4gKi9cbmZ1bmN0aW9uIExvbmdCaXRzKGxvLCBoaSkge1xuXG4gICAgLy8gbm90ZSB0aGF0IHRoZSBjYXN0cyBiZWxvdyBhcmUgdGhlb3JldGljYWxseSB1bm5lY2Vzc2FyeSBhcyBvZiB0b2RheSwgYnV0IG9sZGVyIHN0YXRpY2FsbHlcbiAgICAvLyBnZW5lcmF0ZWQgY29udmVydGVyIGNvZGUgbWlnaHQgc3RpbGwgY2FsbCB0aGUgY3RvciB3aXRoIHNpZ25lZCAzMmJpdHMuIGtlcHQgZm9yIGNvbXBhdC5cblxuICAgIC8qKlxuICAgICAqIExvdyBiaXRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgdGhpcy5sbyA9IGxvID4+PiAwO1xuXG4gICAgLyoqXG4gICAgICogSGlnaCBiaXRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgdGhpcy5oaSA9IGhpID4+PiAwO1xufVxuXG4vKipcbiAqIFplcm8gYml0cy5cbiAqIEBtZW1iZXJvZiB1dGlsLkxvbmdCaXRzXG4gKiBAdHlwZSB7dXRpbC5Mb25nQml0c31cbiAqL1xudmFyIHplcm8gPSBMb25nQml0cy56ZXJvID0gbmV3IExvbmdCaXRzKDAsIDApO1xuXG56ZXJvLnRvTnVtYmVyID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuemVyby56ekVuY29kZSA9IHplcm8uenpEZWNvZGUgPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH07XG56ZXJvLmxlbmd0aCA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gMTsgfTtcblxuLyoqXG4gKiBaZXJvIGhhc2guXG4gKiBAbWVtYmVyb2YgdXRpbC5Mb25nQml0c1xuICogQHR5cGUge3N0cmluZ31cbiAqL1xudmFyIHplcm9IYXNoID0gTG9uZ0JpdHMuemVyb0hhc2ggPSBcIlxcMFxcMFxcMFxcMFxcMFxcMFxcMFxcMFwiO1xuXG4vKipcbiAqIENvbnN0cnVjdHMgbmV3IGxvbmcgYml0cyBmcm9tIHRoZSBzcGVjaWZpZWQgbnVtYmVyLlxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIFZhbHVlXG4gKiBAcmV0dXJucyB7dXRpbC5Mb25nQml0c30gSW5zdGFuY2VcbiAqL1xuTG9uZ0JpdHMuZnJvbU51bWJlciA9IGZ1bmN0aW9uIGZyb21OdW1iZXIodmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT09IDApXG4gICAgICAgIHJldHVybiB6ZXJvO1xuICAgIHZhciBzaWduID0gdmFsdWUgPCAwO1xuICAgIGlmIChzaWduKVxuICAgICAgICB2YWx1ZSA9IC12YWx1ZTtcbiAgICB2YXIgbG8gPSB2YWx1ZSA+Pj4gMCxcbiAgICAgICAgaGkgPSAodmFsdWUgLSBsbykgLyA0Mjk0OTY3Mjk2ID4+PiAwO1xuICAgIGlmIChzaWduKSB7XG4gICAgICAgIGhpID0gfmhpID4+PiAwO1xuICAgICAgICBsbyA9IH5sbyA+Pj4gMDtcbiAgICAgICAgaWYgKCsrbG8gPiA0Mjk0OTY3Mjk1KSB7XG4gICAgICAgICAgICBsbyA9IDA7XG4gICAgICAgICAgICBpZiAoKytoaSA+IDQyOTQ5NjcyOTUpXG4gICAgICAgICAgICAgICAgaGkgPSAwO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuZXcgTG9uZ0JpdHMobG8sIGhpKTtcbn07XG5cbi8qKlxuICogQ29uc3RydWN0cyBuZXcgbG9uZyBiaXRzIGZyb20gYSBudW1iZXIsIGxvbmcgb3Igc3RyaW5nLlxuICogQHBhcmFtIHtMb25nfG51bWJlcnxzdHJpbmd9IHZhbHVlIFZhbHVlXG4gKiBAcmV0dXJucyB7dXRpbC5Mb25nQml0c30gSW5zdGFuY2VcbiAqL1xuTG9uZ0JpdHMuZnJvbSA9IGZ1bmN0aW9uIGZyb20odmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKVxuICAgICAgICByZXR1cm4gTG9uZ0JpdHMuZnJvbU51bWJlcih2YWx1ZSk7XG4gICAgaWYgKHV0aWwuaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICAgIGlmICh1dGlsLkxvbmcpXG4gICAgICAgICAgICB2YWx1ZSA9IHV0aWwuTG9uZy5mcm9tU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIExvbmdCaXRzLmZyb21OdW1iZXIocGFyc2VJbnQodmFsdWUsIDEwKSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZS5sb3cgfHwgdmFsdWUuaGlnaCA/IG5ldyBMb25nQml0cyh2YWx1ZS5sb3cgPj4+IDAsIHZhbHVlLmhpZ2ggPj4+IDApIDogemVybztcbn07XG5cbi8qKlxuICogQ29udmVydHMgdGhpcyBsb25nIGJpdHMgdG8gYSBwb3NzaWJseSB1bnNhZmUgSmF2YVNjcmlwdCBudW1iZXIuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFt1bnNpZ25lZD1mYWxzZV0gV2hldGhlciB1bnNpZ25lZCBvciBub3RcbiAqIEByZXR1cm5zIHtudW1iZXJ9IFBvc3NpYmx5IHVuc2FmZSBudW1iZXJcbiAqL1xuTG9uZ0JpdHMucHJvdG90eXBlLnRvTnVtYmVyID0gZnVuY3Rpb24gdG9OdW1iZXIodW5zaWduZWQpIHtcbiAgICBpZiAoIXVuc2lnbmVkICYmIHRoaXMuaGkgPj4+IDMxKSB7XG4gICAgICAgIHZhciBsbyA9IH50aGlzLmxvICsgMSA+Pj4gMCxcbiAgICAgICAgICAgIGhpID0gfnRoaXMuaGkgICAgID4+PiAwO1xuICAgICAgICBpZiAoIWxvKVxuICAgICAgICAgICAgaGkgPSBoaSArIDEgPj4+IDA7XG4gICAgICAgIHJldHVybiAtKGxvICsgaGkgKiA0Mjk0OTY3Mjk2KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubG8gKyB0aGlzLmhpICogNDI5NDk2NzI5Njtcbn07XG5cbi8qKlxuICogQ29udmVydHMgdGhpcyBsb25nIGJpdHMgdG8gYSBsb25nLlxuICogQHBhcmFtIHtib29sZWFufSBbdW5zaWduZWQ9ZmFsc2VdIFdoZXRoZXIgdW5zaWduZWQgb3Igbm90XG4gKiBAcmV0dXJucyB7TG9uZ30gTG9uZ1xuICovXG5Mb25nQml0cy5wcm90b3R5cGUudG9Mb25nID0gZnVuY3Rpb24gdG9Mb25nKHVuc2lnbmVkKSB7XG4gICAgcmV0dXJuIHV0aWwuTG9uZ1xuICAgICAgICA/IG5ldyB1dGlsLkxvbmcodGhpcy5sbyB8IDAsIHRoaXMuaGkgfCAwLCBCb29sZWFuKHVuc2lnbmVkKSlcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgOiB7IGxvdzogdGhpcy5sbyB8IDAsIGhpZ2g6IHRoaXMuaGkgfCAwLCB1bnNpZ25lZDogQm9vbGVhbih1bnNpZ25lZCkgfTtcbn07XG5cbnZhciBjaGFyQ29kZUF0ID0gU3RyaW5nLnByb3RvdHlwZS5jaGFyQ29kZUF0O1xuXG4vKipcbiAqIENvbnN0cnVjdHMgbmV3IGxvbmcgYml0cyBmcm9tIHRoZSBzcGVjaWZpZWQgOCBjaGFyYWN0ZXJzIGxvbmcgaGFzaC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBoYXNoIEhhc2hcbiAqIEByZXR1cm5zIHt1dGlsLkxvbmdCaXRzfSBCaXRzXG4gKi9cbkxvbmdCaXRzLmZyb21IYXNoID0gZnVuY3Rpb24gZnJvbUhhc2goaGFzaCkge1xuICAgIGlmIChoYXNoID09PSB6ZXJvSGFzaClcbiAgICAgICAgcmV0dXJuIHplcm87XG4gICAgcmV0dXJuIG5ldyBMb25nQml0cyhcbiAgICAgICAgKCBjaGFyQ29kZUF0LmNhbGwoaGFzaCwgMClcbiAgICAgICAgfCBjaGFyQ29kZUF0LmNhbGwoaGFzaCwgMSkgPDwgOFxuICAgICAgICB8IGNoYXJDb2RlQXQuY2FsbChoYXNoLCAyKSA8PCAxNlxuICAgICAgICB8IGNoYXJDb2RlQXQuY2FsbChoYXNoLCAzKSA8PCAyNCkgPj4+IDBcbiAgICAsXG4gICAgICAgICggY2hhckNvZGVBdC5jYWxsKGhhc2gsIDQpXG4gICAgICAgIHwgY2hhckNvZGVBdC5jYWxsKGhhc2gsIDUpIDw8IDhcbiAgICAgICAgfCBjaGFyQ29kZUF0LmNhbGwoaGFzaCwgNikgPDwgMTZcbiAgICAgICAgfCBjaGFyQ29kZUF0LmNhbGwoaGFzaCwgNykgPDwgMjQpID4+PiAwXG4gICAgKTtcbn07XG5cbi8qKlxuICogQ29udmVydHMgdGhpcyBsb25nIGJpdHMgdG8gYSA4IGNoYXJhY3RlcnMgbG9uZyBoYXNoLlxuICogQHJldHVybnMge3N0cmluZ30gSGFzaFxuICovXG5Mb25nQml0cy5wcm90b3R5cGUudG9IYXNoID0gZnVuY3Rpb24gdG9IYXNoKCkge1xuICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKFxuICAgICAgICB0aGlzLmxvICAgICAgICAmIDI1NSxcbiAgICAgICAgdGhpcy5sbyA+Pj4gOCAgJiAyNTUsXG4gICAgICAgIHRoaXMubG8gPj4+IDE2ICYgMjU1LFxuICAgICAgICB0aGlzLmxvID4+PiAyNCAgICAgICxcbiAgICAgICAgdGhpcy5oaSAgICAgICAgJiAyNTUsXG4gICAgICAgIHRoaXMuaGkgPj4+IDggICYgMjU1LFxuICAgICAgICB0aGlzLmhpID4+PiAxNiAmIDI1NSxcbiAgICAgICAgdGhpcy5oaSA+Pj4gMjRcbiAgICApO1xufTtcblxuLyoqXG4gKiBaaWctemFnIGVuY29kZXMgdGhpcyBsb25nIGJpdHMuXG4gKiBAcmV0dXJucyB7dXRpbC5Mb25nQml0c30gYHRoaXNgXG4gKi9cbkxvbmdCaXRzLnByb3RvdHlwZS56ekVuY29kZSA9IGZ1bmN0aW9uIHp6RW5jb2RlKCkge1xuICAgIHZhciBtYXNrID0gICB0aGlzLmhpID4+IDMxO1xuICAgIHRoaXMuaGkgID0gKCh0aGlzLmhpIDw8IDEgfCB0aGlzLmxvID4+PiAzMSkgXiBtYXNrKSA+Pj4gMDtcbiAgICB0aGlzLmxvICA9ICggdGhpcy5sbyA8PCAxICAgICAgICAgICAgICAgICAgIF4gbWFzaykgPj4+IDA7XG4gICAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFppZy16YWcgZGVjb2RlcyB0aGlzIGxvbmcgYml0cy5cbiAqIEByZXR1cm5zIHt1dGlsLkxvbmdCaXRzfSBgdGhpc2BcbiAqL1xuTG9uZ0JpdHMucHJvdG90eXBlLnp6RGVjb2RlID0gZnVuY3Rpb24genpEZWNvZGUoKSB7XG4gICAgdmFyIG1hc2sgPSAtKHRoaXMubG8gJiAxKTtcbiAgICB0aGlzLmxvICA9ICgodGhpcy5sbyA+Pj4gMSB8IHRoaXMuaGkgPDwgMzEpIF4gbWFzaykgPj4+IDA7XG4gICAgdGhpcy5oaSAgPSAoIHRoaXMuaGkgPj4+IDEgICAgICAgICAgICAgICAgICBeIG1hc2spID4+PiAwO1xuICAgIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBsZW5ndGggb2YgdGhpcyBsb25nYml0cyB3aGVuIGVuY29kZWQgYXMgYSB2YXJpbnQuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBMZW5ndGhcbiAqL1xuTG9uZ0JpdHMucHJvdG90eXBlLmxlbmd0aCA9IGZ1bmN0aW9uIGxlbmd0aCgpIHtcbiAgICB2YXIgcGFydDAgPSAgdGhpcy5sbyxcbiAgICAgICAgcGFydDEgPSAodGhpcy5sbyA+Pj4gMjggfCB0aGlzLmhpIDw8IDQpID4+PiAwLFxuICAgICAgICBwYXJ0MiA9ICB0aGlzLmhpID4+PiAyNDtcbiAgICByZXR1cm4gcGFydDIgPT09IDBcbiAgICAgICAgID8gcGFydDEgPT09IDBcbiAgICAgICAgICAgPyBwYXJ0MCA8IDE2Mzg0XG4gICAgICAgICAgICAgPyBwYXJ0MCA8IDEyOCA/IDEgOiAyXG4gICAgICAgICAgICAgOiBwYXJ0MCA8IDIwOTcxNTIgPyAzIDogNFxuICAgICAgICAgICA6IHBhcnQxIDwgMTYzODRcbiAgICAgICAgICAgICA/IHBhcnQxIDwgMTI4ID8gNSA6IDZcbiAgICAgICAgICAgICA6IHBhcnQxIDwgMjA5NzE1MiA/IDcgOiA4XG4gICAgICAgICA6IHBhcnQyIDwgMTI4ID8gOSA6IDEwO1xufTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbnZhciB1dGlsID0gZXhwb3J0cztcblxuLy8gdXNlZCB0byByZXR1cm4gYSBQcm9taXNlIHdoZXJlIGNhbGxiYWNrIGlzIG9taXR0ZWRcbnV0aWwuYXNQcm9taXNlID0gcmVxdWlyZShcIkBwcm90b2J1ZmpzL2FzcHJvbWlzZVwiKTtcblxuLy8gY29udmVydHMgdG8gLyBmcm9tIGJhc2U2NCBlbmNvZGVkIHN0cmluZ3NcbnV0aWwuYmFzZTY0ID0gcmVxdWlyZShcIkBwcm90b2J1ZmpzL2Jhc2U2NFwiKTtcblxuLy8gYmFzZSBjbGFzcyBvZiBycGMuU2VydmljZVxudXRpbC5FdmVudEVtaXR0ZXIgPSByZXF1aXJlKFwiQHByb3RvYnVmanMvZXZlbnRlbWl0dGVyXCIpO1xuXG4vLyBmbG9hdCBoYW5kbGluZyBhY2Nyb3NzIGJyb3dzZXJzXG51dGlsLmZsb2F0ID0gcmVxdWlyZShcIkBwcm90b2J1ZmpzL2Zsb2F0XCIpO1xuXG4vLyByZXF1aXJlcyBtb2R1bGVzIG9wdGlvbmFsbHkgYW5kIGhpZGVzIHRoZSBjYWxsIGZyb20gYnVuZGxlcnNcbnV0aWwuaW5xdWlyZSA9IHJlcXVpcmUoXCJAcHJvdG9idWZqcy9pbnF1aXJlXCIpO1xuXG4vLyBjb252ZXJ0cyB0byAvIGZyb20gdXRmOCBlbmNvZGVkIHN0cmluZ3NcbnV0aWwudXRmOCA9IHJlcXVpcmUoXCJAcHJvdG9idWZqcy91dGY4XCIpO1xuXG4vLyBwcm92aWRlcyBhIG5vZGUtbGlrZSBidWZmZXIgcG9vbCBpbiB0aGUgYnJvd3NlclxudXRpbC5wb29sID0gcmVxdWlyZShcIkBwcm90b2J1ZmpzL3Bvb2xcIik7XG5cbi8vIHV0aWxpdHkgdG8gd29yayB3aXRoIHRoZSBsb3cgYW5kIGhpZ2ggYml0cyBvZiBhIDY0IGJpdCB2YWx1ZVxudXRpbC5Mb25nQml0cyA9IHJlcXVpcmUoXCIuL2xvbmdiaXRzXCIpO1xuXG4vKipcbiAqIFdoZXRoZXIgcnVubmluZyB3aXRoaW4gbm9kZSBvciBub3QuXG4gKiBAbWVtYmVyb2YgdXRpbFxuICogQHR5cGUge2Jvb2xlYW59XG4gKi9cbnV0aWwuaXNOb2RlID0gQm9vbGVhbih0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiXG4gICAgICAgICAgICAgICAgICAgJiYgZ2xvYmFsXG4gICAgICAgICAgICAgICAgICAgJiYgZ2xvYmFsLnByb2Nlc3NcbiAgICAgICAgICAgICAgICAgICAmJiBnbG9iYWwucHJvY2Vzcy52ZXJzaW9uc1xuICAgICAgICAgICAgICAgICAgICYmIGdsb2JhbC5wcm9jZXNzLnZlcnNpb25zLm5vZGUpO1xuXG4vKipcbiAqIEdsb2JhbCBvYmplY3QgcmVmZXJlbmNlLlxuICogQG1lbWJlcm9mIHV0aWxcbiAqIEB0eXBlIHtPYmplY3R9XG4gKi9cbnV0aWwuZ2xvYmFsID0gdXRpbC5pc05vZGUgJiYgZ2xvYmFsXG4gICAgICAgICAgIHx8IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgd2luZG93XG4gICAgICAgICAgIHx8IHR5cGVvZiBzZWxmICAgIT09IFwidW5kZWZpbmVkXCIgJiYgc2VsZlxuICAgICAgICAgICB8fCB0aGlzOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWludmFsaWQtdGhpc1xuXG4vKipcbiAqIEFuIGltbXVhYmxlIGVtcHR5IGFycmF5LlxuICogQG1lbWJlcm9mIHV0aWxcbiAqIEB0eXBlIHtBcnJheS48Kj59XG4gKiBAY29uc3RcbiAqL1xudXRpbC5lbXB0eUFycmF5ID0gT2JqZWN0LmZyZWV6ZSA/IE9iamVjdC5mcmVlemUoW10pIDogLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8gW107IC8vIHVzZWQgb24gcHJvdG90eXBlc1xuXG4vKipcbiAqIEFuIGltbXV0YWJsZSBlbXB0eSBvYmplY3QuXG4gKiBAdHlwZSB7T2JqZWN0fVxuICogQGNvbnN0XG4gKi9cbnV0aWwuZW1wdHlPYmplY3QgPSBPYmplY3QuZnJlZXplID8gT2JqZWN0LmZyZWV6ZSh7fSkgOiAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLyB7fTsgLy8gdXNlZCBvbiBwcm90b3R5cGVzXG5cbi8qKlxuICogVGVzdHMgaWYgdGhlIHNwZWNpZmllZCB2YWx1ZSBpcyBhbiBpbnRlZ2VyLlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIHZhbHVlIGlzIGFuIGludGVnZXJcbiAqL1xudXRpbC5pc0ludGVnZXIgPSBOdW1iZXIuaXNJbnRlZ2VyIHx8IC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovIGZ1bmN0aW9uIGlzSW50ZWdlcih2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgJiYgaXNGaW5pdGUodmFsdWUpICYmIE1hdGguZmxvb3IodmFsdWUpID09PSB2YWx1ZTtcbn07XG5cbi8qKlxuICogVGVzdHMgaWYgdGhlIHNwZWNpZmllZCB2YWx1ZSBpcyBhIHN0cmluZy5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgdmFsdWUgaXMgYSBzdHJpbmdcbiAqL1xudXRpbC5pc1N0cmluZyA9IGZ1bmN0aW9uIGlzU3RyaW5nKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZztcbn07XG5cbi8qKlxuICogVGVzdHMgaWYgdGhlIHNwZWNpZmllZCB2YWx1ZSBpcyBhIG5vbi1udWxsIG9iamVjdC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgdmFsdWUgaXMgYSBub24tbnVsbCBvYmplY3RcbiAqL1xudXRpbC5pc09iamVjdCA9IGZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIjtcbn07XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgcHJvcGVydHkgb24gYSBtZXNzYWdlIGlzIGNvbnNpZGVyZWQgdG8gYmUgcHJlc2VudC5cbiAqIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIHV0aWwuaXNTZXR9LlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFBsYWluIG9iamVjdCBvciBtZXNzYWdlIGluc3RhbmNlXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvcCBQcm9wZXJ0eSBuYW1lXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIGNvbnNpZGVyZWQgdG8gYmUgcHJlc2VudCwgb3RoZXJ3aXNlIGBmYWxzZWBcbiAqL1xudXRpbC5pc3NldCA9XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgcHJvcGVydHkgb24gYSBtZXNzYWdlIGlzIGNvbnNpZGVyZWQgdG8gYmUgcHJlc2VudC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogUGxhaW4gb2JqZWN0IG9yIG1lc3NhZ2UgaW5zdGFuY2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wIFByb3BlcnR5IG5hbWVcbiAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgY29uc2lkZXJlZCB0byBiZSBwcmVzZW50LCBvdGhlcndpc2UgYGZhbHNlYFxuICovXG51dGlsLmlzU2V0ID0gZnVuY3Rpb24gaXNTZXQob2JqLCBwcm9wKSB7XG4gICAgdmFyIHZhbHVlID0gb2JqW3Byb3BdO1xuICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIG9iai5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgLy8gZXNsaW50LWRpc2FibGUtbGluZSBlcWVxZXEsIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiIHx8IChBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlLmxlbmd0aCA6IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGgpID4gMDtcbiAgICByZXR1cm4gZmFsc2U7XG59O1xuXG4vKipcbiAqIEFueSBjb21wYXRpYmxlIEJ1ZmZlciBpbnN0YW5jZS5cbiAqIFRoaXMgaXMgYSBtaW5pbWFsIHN0YW5kLWFsb25lIGRlZmluaXRpb24gb2YgYSBCdWZmZXIgaW5zdGFuY2UuIFRoZSBhY3R1YWwgdHlwZSBpcyB0aGF0IGV4cG9ydGVkIGJ5IG5vZGUncyB0eXBpbmdzLlxuICogQGludGVyZmFjZSBCdWZmZXJcbiAqIEBleHRlbmRzIFVpbnQ4QXJyYXlcbiAqL1xuXG4vKipcbiAqIE5vZGUncyBCdWZmZXIgY2xhc3MgaWYgYXZhaWxhYmxlLlxuICogQHR5cGUge0NvbnN0cnVjdG9yPEJ1ZmZlcj59XG4gKi9cbnV0aWwuQnVmZmVyID0gKGZ1bmN0aW9uKCkge1xuICAgIHRyeSB7XG4gICAgICAgIHZhciBCdWZmZXIgPSB1dGlsLmlucXVpcmUoXCJidWZmZXJcIikuQnVmZmVyO1xuICAgICAgICAvLyByZWZ1c2UgdG8gdXNlIG5vbi1ub2RlIGJ1ZmZlcnMgaWYgbm90IGV4cGxpY2l0bHkgYXNzaWduZWQgKHBlcmYgcmVhc29ucyk6XG4gICAgICAgIHJldHVybiBCdWZmZXIucHJvdG90eXBlLnV0ZjhXcml0ZSA/IEJ1ZmZlciA6IC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovIG51bGw7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59KSgpO1xuXG4vLyBJbnRlcm5hbCBhbGlhcyBvZiBvciBwb2x5ZnVsbCBmb3IgQnVmZmVyLmZyb20uXG51dGlsLl9CdWZmZXJfZnJvbSA9IG51bGw7XG5cbi8vIEludGVybmFsIGFsaWFzIG9mIG9yIHBvbHlmaWxsIGZvciBCdWZmZXIuYWxsb2NVbnNhZmUuXG51dGlsLl9CdWZmZXJfYWxsb2NVbnNhZmUgPSBudWxsO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgYnVmZmVyIG9mIHdoYXRldmVyIHR5cGUgc3VwcG9ydGVkIGJ5IHRoZSBlbnZpcm9ubWVudC5cbiAqIEBwYXJhbSB7bnVtYmVyfG51bWJlcltdfSBbc2l6ZU9yQXJyYXk9MF0gQnVmZmVyIHNpemUgb3IgbnVtYmVyIGFycmF5XG4gKiBAcmV0dXJucyB7VWludDhBcnJheXxCdWZmZXJ9IEJ1ZmZlclxuICovXG51dGlsLm5ld0J1ZmZlciA9IGZ1bmN0aW9uIG5ld0J1ZmZlcihzaXplT3JBcnJheSkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgcmV0dXJuIHR5cGVvZiBzaXplT3JBcnJheSA9PT0gXCJudW1iZXJcIlxuICAgICAgICA/IHV0aWwuQnVmZmVyXG4gICAgICAgICAgICA/IHV0aWwuX0J1ZmZlcl9hbGxvY1Vuc2FmZShzaXplT3JBcnJheSlcbiAgICAgICAgICAgIDogbmV3IHV0aWwuQXJyYXkoc2l6ZU9yQXJyYXkpXG4gICAgICAgIDogdXRpbC5CdWZmZXJcbiAgICAgICAgICAgID8gdXRpbC5fQnVmZmVyX2Zyb20oc2l6ZU9yQXJyYXkpXG4gICAgICAgICAgICA6IHR5cGVvZiBVaW50OEFycmF5ID09PSBcInVuZGVmaW5lZFwiXG4gICAgICAgICAgICAgICAgPyBzaXplT3JBcnJheVxuICAgICAgICAgICAgICAgIDogbmV3IFVpbnQ4QXJyYXkoc2l6ZU9yQXJyYXkpO1xufTtcblxuLyoqXG4gKiBBcnJheSBpbXBsZW1lbnRhdGlvbiB1c2VkIGluIHRoZSBicm93c2VyLiBgVWludDhBcnJheWAgaWYgc3VwcG9ydGVkLCBvdGhlcndpc2UgYEFycmF5YC5cbiAqIEB0eXBlIHtDb25zdHJ1Y3RvcjxVaW50OEFycmF5Pn1cbiAqL1xudXRpbC5BcnJheSA9IHR5cGVvZiBVaW50OEFycmF5ICE9PSBcInVuZGVmaW5lZFwiID8gVWludDhBcnJheSAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLyA6IEFycmF5O1xuXG4vKipcbiAqIEFueSBjb21wYXRpYmxlIExvbmcgaW5zdGFuY2UuXG4gKiBUaGlzIGlzIGEgbWluaW1hbCBzdGFuZC1hbG9uZSBkZWZpbml0aW9uIG9mIGEgTG9uZyBpbnN0YW5jZS4gVGhlIGFjdHVhbCB0eXBlIGlzIHRoYXQgZXhwb3J0ZWQgYnkgbG9uZy5qcy5cbiAqIEBpbnRlcmZhY2UgTG9uZ1xuICogQHByb3BlcnR5IHtudW1iZXJ9IGxvdyBMb3cgYml0c1xuICogQHByb3BlcnR5IHtudW1iZXJ9IGhpZ2ggSGlnaCBiaXRzXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHVuc2lnbmVkIFdoZXRoZXIgdW5zaWduZWQgb3Igbm90XG4gKi9cblxuLyoqXG4gKiBMb25nLmpzJ3MgTG9uZyBjbGFzcyBpZiBhdmFpbGFibGUuXG4gKiBAdHlwZSB7Q29uc3RydWN0b3I8TG9uZz59XG4gKi9cbnV0aWwuTG9uZyA9IC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovIHV0aWwuZ2xvYmFsLmRjb2RlSU8gJiYgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8gdXRpbC5nbG9iYWwuZGNvZGVJTy5Mb25nXG4gICAgICAgICB8fCAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLyB1dGlsLmdsb2JhbC5Mb25nXG4gICAgICAgICB8fCB1dGlsLmlucXVpcmUoXCJsb25nXCIpO1xuXG4vKipcbiAqIFJlZ3VsYXIgZXhwcmVzc2lvbiB1c2VkIHRvIHZlcmlmeSAyIGJpdCAoYGJvb2xgKSBtYXAga2V5cy5cbiAqIEB0eXBlIHtSZWdFeHB9XG4gKiBAY29uc3RcbiAqL1xudXRpbC5rZXkyUmUgPSAvXnRydWV8ZmFsc2V8MHwxJC87XG5cbi8qKlxuICogUmVndWxhciBleHByZXNzaW9uIHVzZWQgdG8gdmVyaWZ5IDMyIGJpdCAoYGludDMyYCBldGMuKSBtYXAga2V5cy5cbiAqIEB0eXBlIHtSZWdFeHB9XG4gKiBAY29uc3RcbiAqL1xudXRpbC5rZXkzMlJlID0gL14tPyg/OjB8WzEtOV1bMC05XSopJC87XG5cbi8qKlxuICogUmVndWxhciBleHByZXNzaW9uIHVzZWQgdG8gdmVyaWZ5IDY0IGJpdCAoYGludDY0YCBldGMuKSBtYXAga2V5cy5cbiAqIEB0eXBlIHtSZWdFeHB9XG4gKiBAY29uc3RcbiAqL1xudXRpbC5rZXk2NFJlID0gL14oPzpbXFxcXHgwMC1cXFxceGZmXXs4fXwtPyg/OjB8WzEtOV1bMC05XSopKSQvO1xuXG4vKipcbiAqIENvbnZlcnRzIGEgbnVtYmVyIG9yIGxvbmcgdG8gYW4gOCBjaGFyYWN0ZXJzIGxvbmcgaGFzaCBzdHJpbmcuXG4gKiBAcGFyYW0ge0xvbmd8bnVtYmVyfSB2YWx1ZSBWYWx1ZSB0byBjb252ZXJ0XG4gKiBAcmV0dXJucyB7c3RyaW5nfSBIYXNoXG4gKi9cbnV0aWwubG9uZ1RvSGFzaCA9IGZ1bmN0aW9uIGxvbmdUb0hhc2godmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWVcbiAgICAgICAgPyB1dGlsLkxvbmdCaXRzLmZyb20odmFsdWUpLnRvSGFzaCgpXG4gICAgICAgIDogdXRpbC5Mb25nQml0cy56ZXJvSGFzaDtcbn07XG5cbi8qKlxuICogQ29udmVydHMgYW4gOCBjaGFyYWN0ZXJzIGxvbmcgaGFzaCBzdHJpbmcgdG8gYSBsb25nIG9yIG51bWJlci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBoYXNoIEhhc2hcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Vuc2lnbmVkPWZhbHNlXSBXaGV0aGVyIHVuc2lnbmVkIG9yIG5vdFxuICogQHJldHVybnMge0xvbmd8bnVtYmVyfSBPcmlnaW5hbCB2YWx1ZVxuICovXG51dGlsLmxvbmdGcm9tSGFzaCA9IGZ1bmN0aW9uIGxvbmdGcm9tSGFzaChoYXNoLCB1bnNpZ25lZCkge1xuICAgIHZhciBiaXRzID0gdXRpbC5Mb25nQml0cy5mcm9tSGFzaChoYXNoKTtcbiAgICBpZiAodXRpbC5Mb25nKVxuICAgICAgICByZXR1cm4gdXRpbC5Mb25nLmZyb21CaXRzKGJpdHMubG8sIGJpdHMuaGksIHVuc2lnbmVkKTtcbiAgICByZXR1cm4gYml0cy50b051bWJlcihCb29sZWFuKHVuc2lnbmVkKSk7XG59O1xuXG4vKipcbiAqIE1lcmdlcyB0aGUgcHJvcGVydGllcyBvZiB0aGUgc291cmNlIG9iamVjdCBpbnRvIHRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gKiBAbWVtYmVyb2YgdXRpbFxuICogQHBhcmFtIHtPYmplY3QuPHN0cmluZywqPn0gZHN0IERlc3RpbmF0aW9uIG9iamVjdFxuICogQHBhcmFtIHtPYmplY3QuPHN0cmluZywqPn0gc3JjIFNvdXJjZSBvYmplY3RcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lmTm90U2V0PWZhbHNlXSBNZXJnZXMgb25seSBpZiB0aGUga2V5IGlzIG5vdCBhbHJlYWR5IHNldFxuICogQHJldHVybnMge09iamVjdC48c3RyaW5nLCo+fSBEZXN0aW5hdGlvbiBvYmplY3RcbiAqL1xuZnVuY3Rpb24gbWVyZ2UoZHN0LCBzcmMsIGlmTm90U2V0KSB7IC8vIHVzZWQgYnkgY29udmVydGVyc1xuICAgIGZvciAodmFyIGtleXMgPSBPYmplY3Qua2V5cyhzcmMpLCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyArK2kpXG4gICAgICAgIGlmIChkc3Rba2V5c1tpXV0gPT09IHVuZGVmaW5lZCB8fCAhaWZOb3RTZXQpXG4gICAgICAgICAgICBkc3Rba2V5c1tpXV0gPSBzcmNba2V5c1tpXV07XG4gICAgcmV0dXJuIGRzdDtcbn1cblxudXRpbC5tZXJnZSA9IG1lcmdlO1xuXG4vKipcbiAqIENvbnZlcnRzIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgYSBzdHJpbmcgdG8gbG93ZXIgY2FzZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgU3RyaW5nIHRvIGNvbnZlcnRcbiAqIEByZXR1cm5zIHtzdHJpbmd9IENvbnZlcnRlZCBzdHJpbmdcbiAqL1xudXRpbC5sY0ZpcnN0ID0gZnVuY3Rpb24gbGNGaXJzdChzdHIpIHtcbiAgICByZXR1cm4gc3RyLmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpICsgc3RyLnN1YnN0cmluZygxKTtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIGN1c3RvbSBlcnJvciBjb25zdHJ1Y3Rvci5cbiAqIEBtZW1iZXJvZiB1dGlsXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBFcnJvciBuYW1lXG4gKiBAcmV0dXJucyB7Q29uc3RydWN0b3I8RXJyb3I+fSBDdXN0b20gZXJyb3IgY29uc3RydWN0b3JcbiAqL1xuZnVuY3Rpb24gbmV3RXJyb3IobmFtZSkge1xuXG4gICAgZnVuY3Rpb24gQ3VzdG9tRXJyb3IobWVzc2FnZSwgcHJvcGVydGllcykge1xuXG4gICAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBDdXN0b21FcnJvcikpXG4gICAgICAgICAgICByZXR1cm4gbmV3IEN1c3RvbUVycm9yKG1lc3NhZ2UsIHByb3BlcnRpZXMpO1xuXG4gICAgICAgIC8vIEVycm9yLmNhbGwodGhpcywgbWVzc2FnZSk7XG4gICAgICAgIC8vIF4ganVzdCByZXR1cm5zIGEgbmV3IGVycm9yIGluc3RhbmNlIGJlY2F1c2UgdGhlIGN0b3IgY2FuIGJlIGNhbGxlZCBhcyBhIGZ1bmN0aW9uXG5cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwibWVzc2FnZVwiLCB7IGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtZXNzYWdlOyB9IH0pO1xuXG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSkgLy8gbm9kZVxuICAgICAgICAgICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgQ3VzdG9tRXJyb3IpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJzdGFja1wiLCB7IHZhbHVlOiBuZXcgRXJyb3IoKS5zdGFjayB8fCBcIlwiIH0pO1xuXG4gICAgICAgIGlmIChwcm9wZXJ0aWVzKVxuICAgICAgICAgICAgbWVyZ2UodGhpcywgcHJvcGVydGllcyk7XG4gICAgfVxuXG4gICAgQ3VzdG9tRXJyb3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShFcnJvci5wcm90b3R5cGUsIHtcbiAgICAgICAgY29uc3RydWN0b3I6IHtcbiAgICAgICAgICAgIHZhbHVlOiBDdXN0b21FcnJvcixcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIG5hbWU6IHtcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgeyByZXR1cm4gbmFtZTsgfSxcbiAgICAgICAgICAgIHNldDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAvLyBjb25maWd1cmFibGU6IGZhbHNlIHdvdWxkIGFjY3VyYXRlbHkgcHJlc2VydmUgdGhlIGJlaGF2aW9yIG9mXG4gICAgICAgICAgICAvLyB0aGUgb3JpZ2luYWwsIGJ1dCBJJ20gZ3Vlc3NpbmcgdGhhdCB3YXMgbm90IGludGVudGlvbmFsLlxuICAgICAgICAgICAgLy8gRm9yIGFuIGFjdHVhbCBlcnJvciBzdWJjbGFzcywgdGhpcyBwcm9wZXJ0eSB3b3VsZFxuICAgICAgICAgICAgLy8gYmUgY29uZmlndXJhYmxlLlxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICB0b1N0cmluZzoge1xuICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKCkgeyByZXR1cm4gdGhpcy5uYW1lICsgXCI6IFwiICsgdGhpcy5tZXNzYWdlOyB9LFxuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBDdXN0b21FcnJvcjtcbn1cblxudXRpbC5uZXdFcnJvciA9IG5ld0Vycm9yO1xuXG4vKipcbiAqIENvbnN0cnVjdHMgYSBuZXcgcHJvdG9jb2wgZXJyb3IuXG4gKiBAY2xhc3NkZXNjIEVycm9yIHN1YmNsYXNzIGluZGljYXRpbmcgYSBwcm90b2NvbCBzcGVjaWZjIGVycm9yLlxuICogQG1lbWJlcm9mIHV0aWxcbiAqIEBleHRlbmRzIEVycm9yXG4gKiBAdGVtcGxhdGUgVCBleHRlbmRzIE1lc3NhZ2U8VD5cbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgRXJyb3IgbWVzc2FnZVxuICogQHBhcmFtIHtPYmplY3QuPHN0cmluZywqPn0gW3Byb3BlcnRpZXNdIEFkZGl0aW9uYWwgcHJvcGVydGllc1xuICogQGV4YW1wbGVcbiAqIHRyeSB7XG4gKiAgICAgTXlNZXNzYWdlLmRlY29kZShzb21lQnVmZmVyKTsgLy8gdGhyb3dzIGlmIHJlcXVpcmVkIGZpZWxkcyBhcmUgbWlzc2luZ1xuICogfSBjYXRjaCAoZSkge1xuICogICAgIGlmIChlIGluc3RhbmNlb2YgUHJvdG9jb2xFcnJvciAmJiBlLmluc3RhbmNlKVxuICogICAgICAgICBjb25zb2xlLmxvZyhcImRlY29kZWQgc28gZmFyOiBcIiArIEpTT04uc3RyaW5naWZ5KGUuaW5zdGFuY2UpKTtcbiAqIH1cbiAqL1xudXRpbC5Qcm90b2NvbEVycm9yID0gbmV3RXJyb3IoXCJQcm90b2NvbEVycm9yXCIpO1xuXG4vKipcbiAqIFNvIGZhciBkZWNvZGVkIG1lc3NhZ2UgaW5zdGFuY2UuXG4gKiBAbmFtZSB1dGlsLlByb3RvY29sRXJyb3IjaW5zdGFuY2VcbiAqIEB0eXBlIHtNZXNzYWdlPFQ+fVxuICovXG5cbi8qKlxuICogQSBPbmVPZiBnZXR0ZXIgYXMgcmV0dXJuZWQgYnkge0BsaW5rIHV0aWwub25lT2ZHZXR0ZXJ9LlxuICogQHR5cGVkZWYgT25lT2ZHZXR0ZXJcbiAqIEB0eXBlIHtmdW5jdGlvbn1cbiAqIEByZXR1cm5zIHtzdHJpbmd8dW5kZWZpbmVkfSBTZXQgZmllbGQgbmFtZSwgaWYgYW55XG4gKi9cblxuLyoqXG4gKiBCdWlsZHMgYSBnZXR0ZXIgZm9yIGEgb25lb2YncyBwcmVzZW50IGZpZWxkIG5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBmaWVsZE5hbWVzIEZpZWxkIG5hbWVzXG4gKiBAcmV0dXJucyB7T25lT2ZHZXR0ZXJ9IFVuYm91bmQgZ2V0dGVyXG4gKi9cbnV0aWwub25lT2ZHZXR0ZXIgPSBmdW5jdGlvbiBnZXRPbmVPZihmaWVsZE5hbWVzKSB7XG4gICAgdmFyIGZpZWxkTWFwID0ge307XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaWVsZE5hbWVzLmxlbmd0aDsgKytpKVxuICAgICAgICBmaWVsZE1hcFtmaWVsZE5hbWVzW2ldXSA9IDE7XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfHVuZGVmaW5lZH0gU2V0IGZpZWxkIG5hbWUsIGlmIGFueVxuICAgICAqIEB0aGlzIE9iamVjdFxuICAgICAqIEBpZ25vcmVcbiAgICAgKi9cbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgY29uc2lzdGVudC1yZXR1cm5cbiAgICAgICAgZm9yICh2YXIga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMpLCBpID0ga2V5cy5sZW5ndGggLSAxOyBpID4gLTE7IC0taSlcbiAgICAgICAgICAgIGlmIChmaWVsZE1hcFtrZXlzW2ldXSA9PT0gMSAmJiB0aGlzW2tleXNbaV1dICE9PSB1bmRlZmluZWQgJiYgdGhpc1trZXlzW2ldXSAhPT0gbnVsbClcbiAgICAgICAgICAgICAgICByZXR1cm4ga2V5c1tpXTtcbiAgICB9O1xufTtcblxuLyoqXG4gKiBBIE9uZU9mIHNldHRlciBhcyByZXR1cm5lZCBieSB7QGxpbmsgdXRpbC5vbmVPZlNldHRlcn0uXG4gKiBAdHlwZWRlZiBPbmVPZlNldHRlclxuICogQHR5cGUge2Z1bmN0aW9ufVxuICogQHBhcmFtIHtzdHJpbmd8dW5kZWZpbmVkfSB2YWx1ZSBGaWVsZCBuYW1lXG4gKiBAcmV0dXJucyB7dW5kZWZpbmVkfVxuICovXG5cbi8qKlxuICogQnVpbGRzIGEgc2V0dGVyIGZvciBhIG9uZW9mJ3MgcHJlc2VudCBmaWVsZCBuYW1lLlxuICogQHBhcmFtIHtzdHJpbmdbXX0gZmllbGROYW1lcyBGaWVsZCBuYW1lc1xuICogQHJldHVybnMge09uZU9mU2V0dGVyfSBVbmJvdW5kIHNldHRlclxuICovXG51dGlsLm9uZU9mU2V0dGVyID0gZnVuY3Rpb24gc2V0T25lT2YoZmllbGROYW1lcykge1xuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgRmllbGQgbmFtZVxuICAgICAqIEByZXR1cm5zIHt1bmRlZmluZWR9XG4gICAgICogQHRoaXMgT2JqZWN0XG4gICAgICogQGlnbm9yZVxuICAgICAqL1xuICAgIHJldHVybiBmdW5jdGlvbihuYW1lKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmllbGROYW1lcy5sZW5ndGg7ICsraSlcbiAgICAgICAgICAgIGlmIChmaWVsZE5hbWVzW2ldICE9PSBuYW1lKVxuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzW2ZpZWxkTmFtZXNbaV1dO1xuICAgIH07XG59O1xuXG4vKipcbiAqIERlZmF1bHQgY29udmVyc2lvbiBvcHRpb25zIHVzZWQgZm9yIHtAbGluayBNZXNzYWdlI3RvSlNPTn0gaW1wbGVtZW50YXRpb25zLlxuICpcbiAqIFRoZXNlIG9wdGlvbnMgYXJlIGNsb3NlIHRvIHByb3RvMydzIEpTT04gbWFwcGluZyB3aXRoIHRoZSBleGNlcHRpb24gdGhhdCBpbnRlcm5hbCB0eXBlcyBsaWtlIEFueSBhcmUgaGFuZGxlZCBqdXN0IGxpa2UgbWVzc2FnZXMuIE1vcmUgcHJlY2lzZWx5OlxuICpcbiAqIC0gTG9uZ3MgYmVjb21lIHN0cmluZ3NcbiAqIC0gRW51bXMgYmVjb21lIHN0cmluZyBrZXlzXG4gKiAtIEJ5dGVzIGJlY29tZSBiYXNlNjQgZW5jb2RlZCBzdHJpbmdzXG4gKiAtIChTdWItKU1lc3NhZ2VzIGJlY29tZSBwbGFpbiBvYmplY3RzXG4gKiAtIE1hcHMgYmVjb21lIHBsYWluIG9iamVjdHMgd2l0aCBhbGwgc3RyaW5nIGtleXNcbiAqIC0gUmVwZWF0ZWQgZmllbGRzIGJlY29tZSBhcnJheXNcbiAqIC0gTmFOIGFuZCBJbmZpbml0eSBmb3IgZmxvYXQgYW5kIGRvdWJsZSBmaWVsZHMgYmVjb21lIHN0cmluZ3NcbiAqXG4gKiBAdHlwZSB7SUNvbnZlcnNpb25PcHRpb25zfVxuICogQHNlZSBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3MvcHJvdG8zP2hsPWVuI2pzb25cbiAqL1xudXRpbC50b0pTT05PcHRpb25zID0ge1xuICAgIGxvbmdzOiBTdHJpbmcsXG4gICAgZW51bXM6IFN0cmluZyxcbiAgICBieXRlczogU3RyaW5nLFxuICAgIGpzb246IHRydWVcbn07XG5cbi8vIFNldHMgdXAgYnVmZmVyIHV0aWxpdHkgYWNjb3JkaW5nIHRvIHRoZSBlbnZpcm9ubWVudCAoY2FsbGVkIGluIGluZGV4LW1pbmltYWwpXG51dGlsLl9jb25maWd1cmUgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgQnVmZmVyID0gdXRpbC5CdWZmZXI7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKCFCdWZmZXIpIHtcbiAgICAgICAgdXRpbC5fQnVmZmVyX2Zyb20gPSB1dGlsLl9CdWZmZXJfYWxsb2NVbnNhZmUgPSBudWxsO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIGJlY2F1c2Ugbm9kZSA0LnggYnVmZmVycyBhcmUgaW5jb21wYXRpYmxlICYgaW1tdXRhYmxlXG4gICAgLy8gc2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGNvZGVJTy9wcm90b2J1Zi5qcy9wdWxsLzY2NVxuICAgIHV0aWwuX0J1ZmZlcl9mcm9tID0gQnVmZmVyLmZyb20gIT09IFVpbnQ4QXJyYXkuZnJvbSAmJiBCdWZmZXIuZnJvbSB8fFxuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICBmdW5jdGlvbiBCdWZmZXJfZnJvbSh2YWx1ZSwgZW5jb2RpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQnVmZmVyKHZhbHVlLCBlbmNvZGluZyk7XG4gICAgICAgIH07XG4gICAgdXRpbC5fQnVmZmVyX2FsbG9jVW5zYWZlID0gQnVmZmVyLmFsbG9jVW5zYWZlIHx8XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgIGZ1bmN0aW9uIEJ1ZmZlcl9hbGxvY1Vuc2FmZShzaXplKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEJ1ZmZlcihzaXplKTtcbiAgICAgICAgfTtcbn07XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5tb2R1bGUuZXhwb3J0cyA9IFdyaXRlcjtcblxudmFyIHV0aWwgICAgICA9IHJlcXVpcmUoXCIuL3V0aWwvbWluaW1hbFwiKTtcblxudmFyIEJ1ZmZlcldyaXRlcjsgLy8gY3ljbGljXG5cbnZhciBMb25nQml0cyAgPSB1dGlsLkxvbmdCaXRzLFxuICAgIGJhc2U2NCAgICA9IHV0aWwuYmFzZTY0LFxuICAgIHV0ZjggICAgICA9IHV0aWwudXRmODtcblxuLyoqXG4gKiBDb25zdHJ1Y3RzIGEgbmV3IHdyaXRlciBvcGVyYXRpb24gaW5zdGFuY2UuXG4gKiBAY2xhc3NkZXNjIFNjaGVkdWxlZCB3cml0ZXIgb3BlcmF0aW9uLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKCosIFVpbnQ4QXJyYXksIG51bWJlcil9IGZuIEZ1bmN0aW9uIHRvIGNhbGxcbiAqIEBwYXJhbSB7bnVtYmVyfSBsZW4gVmFsdWUgYnl0ZSBsZW5ndGhcbiAqIEBwYXJhbSB7Kn0gdmFsIFZhbHVlIHRvIHdyaXRlXG4gKiBAaWdub3JlXG4gKi9cbmZ1bmN0aW9uIE9wKGZuLCBsZW4sIHZhbCkge1xuXG4gICAgLyoqXG4gICAgICogRnVuY3Rpb24gdG8gY2FsbC5cbiAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oVWludDhBcnJheSwgbnVtYmVyLCAqKX1cbiAgICAgKi9cbiAgICB0aGlzLmZuID0gZm47XG5cbiAgICAvKipcbiAgICAgKiBWYWx1ZSBieXRlIGxlbmd0aC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIHRoaXMubGVuID0gbGVuO1xuXG4gICAgLyoqXG4gICAgICogTmV4dCBvcGVyYXRpb24uXG4gICAgICogQHR5cGUge1dyaXRlci5PcHx1bmRlZmluZWR9XG4gICAgICovXG4gICAgdGhpcy5uZXh0ID0gdW5kZWZpbmVkO1xuXG4gICAgLyoqXG4gICAgICogVmFsdWUgdG8gd3JpdGUuXG4gICAgICogQHR5cGUgeyp9XG4gICAgICovXG4gICAgdGhpcy52YWwgPSB2YWw7IC8vIHR5cGUgdmFyaWVzXG59XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5mdW5jdGlvbiBub29wKCkge30gLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1lbXB0eS1mdW5jdGlvblxuXG4vKipcbiAqIENvbnN0cnVjdHMgYSBuZXcgd3JpdGVyIHN0YXRlIGluc3RhbmNlLlxuICogQGNsYXNzZGVzYyBDb3BpZWQgd3JpdGVyIHN0YXRlLlxuICogQG1lbWJlcm9mIFdyaXRlclxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge1dyaXRlcn0gd3JpdGVyIFdyaXRlciB0byBjb3B5IHN0YXRlIGZyb21cbiAqIEBpZ25vcmVcbiAqL1xuZnVuY3Rpb24gU3RhdGUod3JpdGVyKSB7XG5cbiAgICAvKipcbiAgICAgKiBDdXJyZW50IGhlYWQuXG4gICAgICogQHR5cGUge1dyaXRlci5PcH1cbiAgICAgKi9cbiAgICB0aGlzLmhlYWQgPSB3cml0ZXIuaGVhZDtcblxuICAgIC8qKlxuICAgICAqIEN1cnJlbnQgdGFpbC5cbiAgICAgKiBAdHlwZSB7V3JpdGVyLk9wfVxuICAgICAqL1xuICAgIHRoaXMudGFpbCA9IHdyaXRlci50YWlsO1xuXG4gICAgLyoqXG4gICAgICogQ3VycmVudCBidWZmZXIgbGVuZ3RoLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgdGhpcy5sZW4gPSB3cml0ZXIubGVuO1xuXG4gICAgLyoqXG4gICAgICogTmV4dCBzdGF0ZS5cbiAgICAgKiBAdHlwZSB7U3RhdGV8bnVsbH1cbiAgICAgKi9cbiAgICB0aGlzLm5leHQgPSB3cml0ZXIuc3RhdGVzO1xufVxuXG4vKipcbiAqIENvbnN0cnVjdHMgYSBuZXcgd3JpdGVyIGluc3RhbmNlLlxuICogQGNsYXNzZGVzYyBXaXJlIGZvcm1hdCB3cml0ZXIgdXNpbmcgYFVpbnQ4QXJyYXlgIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGBBcnJheWAuXG4gKiBAY29uc3RydWN0b3JcbiAqL1xuZnVuY3Rpb24gV3JpdGVyKCkge1xuXG4gICAgLyoqXG4gICAgICogQ3VycmVudCBsZW5ndGguXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICB0aGlzLmxlbiA9IDA7XG5cbiAgICAvKipcbiAgICAgKiBPcGVyYXRpb25zIGhlYWQuXG4gICAgICogQHR5cGUge09iamVjdH1cbiAgICAgKi9cbiAgICB0aGlzLmhlYWQgPSBuZXcgT3Aobm9vcCwgMCwgMCk7XG5cbiAgICAvKipcbiAgICAgKiBPcGVyYXRpb25zIHRhaWxcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAqL1xuICAgIHRoaXMudGFpbCA9IHRoaXMuaGVhZDtcblxuICAgIC8qKlxuICAgICAqIExpbmtlZCBmb3JrZWQgc3RhdGVzLlxuICAgICAqIEB0eXBlIHtPYmplY3R8bnVsbH1cbiAgICAgKi9cbiAgICB0aGlzLnN0YXRlcyA9IG51bGw7XG5cbiAgICAvLyBXaGVuIGEgdmFsdWUgaXMgd3JpdHRlbiwgdGhlIHdyaXRlciBjYWxjdWxhdGVzIGl0cyBieXRlIGxlbmd0aCBhbmQgcHV0cyBpdCBpbnRvIGEgbGlua2VkXG4gICAgLy8gbGlzdCBvZiBvcGVyYXRpb25zIHRvIHBlcmZvcm0gd2hlbiBmaW5pc2goKSBpcyBjYWxsZWQuIFRoaXMgYm90aCBhbGxvd3MgdXMgdG8gYWxsb2NhdGVcbiAgICAvLyBidWZmZXJzIG9mIHRoZSBleGFjdCByZXF1aXJlZCBzaXplIGFuZCByZWR1Y2VzIHRoZSBhbW91bnQgb2Ygd29yayB3ZSBoYXZlIHRvIGRvIGNvbXBhcmVkXG4gICAgLy8gdG8gZmlyc3QgY2FsY3VsYXRpbmcgb3ZlciBvYmplY3RzIGFuZCB0aGVuIGVuY29kaW5nIG92ZXIgb2JqZWN0cy4gSW4gb3VyIGNhc2UsIHRoZSBlbmNvZGluZ1xuICAgIC8vIHBhcnQgaXMganVzdCBhIGxpbmtlZCBsaXN0IHdhbGsgY2FsbGluZyBvcGVyYXRpb25zIHdpdGggYWxyZWFkeSBwcmVwYXJlZCB2YWx1ZXMuXG59XG5cbnZhciBjcmVhdGUgPSBmdW5jdGlvbiBjcmVhdGUoKSB7XG4gICAgcmV0dXJuIHV0aWwuQnVmZmVyXG4gICAgICAgID8gZnVuY3Rpb24gY3JlYXRlX2J1ZmZlcl9zZXR1cCgpIHtcbiAgICAgICAgICAgIHJldHVybiAoV3JpdGVyLmNyZWF0ZSA9IGZ1bmN0aW9uIGNyZWF0ZV9idWZmZXIoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCdWZmZXJXcml0ZXIoKTtcbiAgICAgICAgICAgIH0pKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgOiBmdW5jdGlvbiBjcmVhdGVfYXJyYXkoKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFdyaXRlcigpO1xuICAgICAgICB9O1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHdyaXRlci5cbiAqIEBmdW5jdGlvblxuICogQHJldHVybnMge0J1ZmZlcldyaXRlcnxXcml0ZXJ9IEEge0BsaW5rIEJ1ZmZlcldyaXRlcn0gd2hlbiBCdWZmZXJzIGFyZSBzdXBwb3J0ZWQsIG90aGVyd2lzZSBhIHtAbGluayBXcml0ZXJ9XG4gKi9cbldyaXRlci5jcmVhdGUgPSBjcmVhdGUoKTtcblxuLyoqXG4gKiBBbGxvY2F0ZXMgYSBidWZmZXIgb2YgdGhlIHNwZWNpZmllZCBzaXplLlxuICogQHBhcmFtIHtudW1iZXJ9IHNpemUgQnVmZmVyIHNpemVcbiAqIEByZXR1cm5zIHtVaW50OEFycmF5fSBCdWZmZXJcbiAqL1xuV3JpdGVyLmFsbG9jID0gZnVuY3Rpb24gYWxsb2Moc2l6ZSkge1xuICAgIHJldHVybiBuZXcgdXRpbC5BcnJheShzaXplKTtcbn07XG5cbi8vIFVzZSBVaW50OEFycmF5IGJ1ZmZlciBwb29sIGluIHRoZSBicm93c2VyLCBqdXN0IGxpa2Ugbm9kZSBkb2VzIHdpdGggYnVmZmVyc1xuLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbmlmICh1dGlsLkFycmF5ICE9PSBBcnJheSlcbiAgICBXcml0ZXIuYWxsb2MgPSB1dGlsLnBvb2woV3JpdGVyLmFsbG9jLCB1dGlsLkFycmF5LnByb3RvdHlwZS5zdWJhcnJheSk7XG5cbi8qKlxuICogUHVzaGVzIGEgbmV3IG9wZXJhdGlvbiB0byB0aGUgcXVldWUuXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKFVpbnQ4QXJyYXksIG51bWJlciwgKil9IGZuIEZ1bmN0aW9uIHRvIGNhbGxcbiAqIEBwYXJhbSB7bnVtYmVyfSBsZW4gVmFsdWUgYnl0ZSBsZW5ndGhcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWwgVmFsdWUgdG8gd3JpdGVcbiAqIEByZXR1cm5zIHtXcml0ZXJ9IGB0aGlzYFxuICogQHByaXZhdGVcbiAqL1xuV3JpdGVyLnByb3RvdHlwZS5fcHVzaCA9IGZ1bmN0aW9uIHB1c2goZm4sIGxlbiwgdmFsKSB7XG4gICAgdGhpcy50YWlsID0gdGhpcy50YWlsLm5leHQgPSBuZXcgT3AoZm4sIGxlbiwgdmFsKTtcbiAgICB0aGlzLmxlbiArPSBsZW47XG4gICAgcmV0dXJuIHRoaXM7XG59O1xuXG5mdW5jdGlvbiB3cml0ZUJ5dGUodmFsLCBidWYsIHBvcykge1xuICAgIGJ1Zltwb3NdID0gdmFsICYgMjU1O1xufVxuXG5mdW5jdGlvbiB3cml0ZVZhcmludDMyKHZhbCwgYnVmLCBwb3MpIHtcbiAgICB3aGlsZSAodmFsID4gMTI3KSB7XG4gICAgICAgIGJ1Zltwb3MrK10gPSB2YWwgJiAxMjcgfCAxMjg7XG4gICAgICAgIHZhbCA+Pj49IDc7XG4gICAgfVxuICAgIGJ1Zltwb3NdID0gdmFsO1xufVxuXG4vKipcbiAqIENvbnN0cnVjdHMgYSBuZXcgdmFyaW50IHdyaXRlciBvcGVyYXRpb24gaW5zdGFuY2UuXG4gKiBAY2xhc3NkZXNjIFNjaGVkdWxlZCB2YXJpbnQgd3JpdGVyIG9wZXJhdGlvbi5cbiAqIEBleHRlbmRzIE9wXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7bnVtYmVyfSBsZW4gVmFsdWUgYnl0ZSBsZW5ndGhcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWwgVmFsdWUgdG8gd3JpdGVcbiAqIEBpZ25vcmVcbiAqL1xuZnVuY3Rpb24gVmFyaW50T3AobGVuLCB2YWwpIHtcbiAgICB0aGlzLmxlbiA9IGxlbjtcbiAgICB0aGlzLm5leHQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy52YWwgPSB2YWw7XG59XG5cblZhcmludE9wLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoT3AucHJvdG90eXBlKTtcblZhcmludE9wLnByb3RvdHlwZS5mbiA9IHdyaXRlVmFyaW50MzI7XG5cbi8qKlxuICogV3JpdGVzIGFuIHVuc2lnbmVkIDMyIGJpdCB2YWx1ZSBhcyBhIHZhcmludC5cbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSBWYWx1ZSB0byB3cml0ZVxuICogQHJldHVybnMge1dyaXRlcn0gYHRoaXNgXG4gKi9cbldyaXRlci5wcm90b3R5cGUudWludDMyID0gZnVuY3Rpb24gd3JpdGVfdWludDMyKHZhbHVlKSB7XG4gICAgLy8gaGVyZSwgdGhlIGNhbGwgdG8gdGhpcy5wdXNoIGhhcyBiZWVuIGlubGluZWQgYW5kIGEgdmFyaW50IHNwZWNpZmljIE9wIHN1YmNsYXNzIGlzIHVzZWQuXG4gICAgLy8gdWludDMyIGlzIGJ5IGZhciB0aGUgbW9zdCBmcmVxdWVudGx5IHVzZWQgb3BlcmF0aW9uIGFuZCBiZW5lZml0cyBzaWduaWZpY2FudGx5IGZyb20gdGhpcy5cbiAgICB0aGlzLmxlbiArPSAodGhpcy50YWlsID0gdGhpcy50YWlsLm5leHQgPSBuZXcgVmFyaW50T3AoXG4gICAgICAgICh2YWx1ZSA9IHZhbHVlID4+PiAwKVxuICAgICAgICAgICAgICAgIDwgMTI4ICAgICAgID8gMVxuICAgICAgICA6IHZhbHVlIDwgMTYzODQgICAgID8gMlxuICAgICAgICA6IHZhbHVlIDwgMjA5NzE1MiAgID8gM1xuICAgICAgICA6IHZhbHVlIDwgMjY4NDM1NDU2ID8gNFxuICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAgNSxcbiAgICB2YWx1ZSkpLmxlbjtcbiAgICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogV3JpdGVzIGEgc2lnbmVkIDMyIGJpdCB2YWx1ZSBhcyBhIHZhcmludC5cbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIFZhbHVlIHRvIHdyaXRlXG4gKiBAcmV0dXJucyB7V3JpdGVyfSBgdGhpc2BcbiAqL1xuV3JpdGVyLnByb3RvdHlwZS5pbnQzMiA9IGZ1bmN0aW9uIHdyaXRlX2ludDMyKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlIDwgMFxuICAgICAgICA/IHRoaXMuX3B1c2god3JpdGVWYXJpbnQ2NCwgMTAsIExvbmdCaXRzLmZyb21OdW1iZXIodmFsdWUpKSAvLyAxMCBieXRlcyBwZXIgc3BlY1xuICAgICAgICA6IHRoaXMudWludDMyKHZhbHVlKTtcbn07XG5cbi8qKlxuICogV3JpdGVzIGEgMzIgYml0IHZhbHVlIGFzIGEgdmFyaW50LCB6aWctemFnIGVuY29kZWQuXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgVmFsdWUgdG8gd3JpdGVcbiAqIEByZXR1cm5zIHtXcml0ZXJ9IGB0aGlzYFxuICovXG5Xcml0ZXIucHJvdG90eXBlLnNpbnQzMiA9IGZ1bmN0aW9uIHdyaXRlX3NpbnQzMih2YWx1ZSkge1xuICAgIHJldHVybiB0aGlzLnVpbnQzMigodmFsdWUgPDwgMSBeIHZhbHVlID4+IDMxKSA+Pj4gMCk7XG59O1xuXG5mdW5jdGlvbiB3cml0ZVZhcmludDY0KHZhbCwgYnVmLCBwb3MpIHtcbiAgICB3aGlsZSAodmFsLmhpKSB7XG4gICAgICAgIGJ1Zltwb3MrK10gPSB2YWwubG8gJiAxMjcgfCAxMjg7XG4gICAgICAgIHZhbC5sbyA9ICh2YWwubG8gPj4+IDcgfCB2YWwuaGkgPDwgMjUpID4+PiAwO1xuICAgICAgICB2YWwuaGkgPj4+PSA3O1xuICAgIH1cbiAgICB3aGlsZSAodmFsLmxvID4gMTI3KSB7XG4gICAgICAgIGJ1Zltwb3MrK10gPSB2YWwubG8gJiAxMjcgfCAxMjg7XG4gICAgICAgIHZhbC5sbyA9IHZhbC5sbyA+Pj4gNztcbiAgICB9XG4gICAgYnVmW3BvcysrXSA9IHZhbC5sbztcbn1cblxuLyoqXG4gKiBXcml0ZXMgYW4gdW5zaWduZWQgNjQgYml0IHZhbHVlIGFzIGEgdmFyaW50LlxuICogQHBhcmFtIHtMb25nfG51bWJlcnxzdHJpbmd9IHZhbHVlIFZhbHVlIHRvIHdyaXRlXG4gKiBAcmV0dXJucyB7V3JpdGVyfSBgdGhpc2BcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gSWYgYHZhbHVlYCBpcyBhIHN0cmluZyBhbmQgbm8gbG9uZyBsaWJyYXJ5IGlzIHByZXNlbnQuXG4gKi9cbldyaXRlci5wcm90b3R5cGUudWludDY0ID0gZnVuY3Rpb24gd3JpdGVfdWludDY0KHZhbHVlKSB7XG4gICAgdmFyIGJpdHMgPSBMb25nQml0cy5mcm9tKHZhbHVlKTtcbiAgICByZXR1cm4gdGhpcy5fcHVzaCh3cml0ZVZhcmludDY0LCBiaXRzLmxlbmd0aCgpLCBiaXRzKTtcbn07XG5cbi8qKlxuICogV3JpdGVzIGEgc2lnbmVkIDY0IGJpdCB2YWx1ZSBhcyBhIHZhcmludC5cbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtMb25nfG51bWJlcnxzdHJpbmd9IHZhbHVlIFZhbHVlIHRvIHdyaXRlXG4gKiBAcmV0dXJucyB7V3JpdGVyfSBgdGhpc2BcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gSWYgYHZhbHVlYCBpcyBhIHN0cmluZyBhbmQgbm8gbG9uZyBsaWJyYXJ5IGlzIHByZXNlbnQuXG4gKi9cbldyaXRlci5wcm90b3R5cGUuaW50NjQgPSBXcml0ZXIucHJvdG90eXBlLnVpbnQ2NDtcblxuLyoqXG4gKiBXcml0ZXMgYSBzaWduZWQgNjQgYml0IHZhbHVlIGFzIGEgdmFyaW50LCB6aWctemFnIGVuY29kZWQuXG4gKiBAcGFyYW0ge0xvbmd8bnVtYmVyfHN0cmluZ30gdmFsdWUgVmFsdWUgdG8gd3JpdGVcbiAqIEByZXR1cm5zIHtXcml0ZXJ9IGB0aGlzYFxuICogQHRocm93cyB7VHlwZUVycm9yfSBJZiBgdmFsdWVgIGlzIGEgc3RyaW5nIGFuZCBubyBsb25nIGxpYnJhcnkgaXMgcHJlc2VudC5cbiAqL1xuV3JpdGVyLnByb3RvdHlwZS5zaW50NjQgPSBmdW5jdGlvbiB3cml0ZV9zaW50NjQodmFsdWUpIHtcbiAgICB2YXIgYml0cyA9IExvbmdCaXRzLmZyb20odmFsdWUpLnp6RW5jb2RlKCk7XG4gICAgcmV0dXJuIHRoaXMuX3B1c2god3JpdGVWYXJpbnQ2NCwgYml0cy5sZW5ndGgoKSwgYml0cyk7XG59O1xuXG4vKipcbiAqIFdyaXRlcyBhIGJvb2xpc2ggdmFsdWUgYXMgYSB2YXJpbnQuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IHZhbHVlIFZhbHVlIHRvIHdyaXRlXG4gKiBAcmV0dXJucyB7V3JpdGVyfSBgdGhpc2BcbiAqL1xuV3JpdGVyLnByb3RvdHlwZS5ib29sID0gZnVuY3Rpb24gd3JpdGVfYm9vbCh2YWx1ZSkge1xuICAgIHJldHVybiB0aGlzLl9wdXNoKHdyaXRlQnl0ZSwgMSwgdmFsdWUgPyAxIDogMCk7XG59O1xuXG5mdW5jdGlvbiB3cml0ZUZpeGVkMzIodmFsLCBidWYsIHBvcykge1xuICAgIGJ1Zltwb3MgICAgXSA9ICB2YWwgICAgICAgICAmIDI1NTtcbiAgICBidWZbcG9zICsgMV0gPSAgdmFsID4+PiA4ICAgJiAyNTU7XG4gICAgYnVmW3BvcyArIDJdID0gIHZhbCA+Pj4gMTYgICYgMjU1O1xuICAgIGJ1Zltwb3MgKyAzXSA9ICB2YWwgPj4+IDI0O1xufVxuXG4vKipcbiAqIFdyaXRlcyBhbiB1bnNpZ25lZCAzMiBiaXQgdmFsdWUgYXMgZml4ZWQgMzIgYml0cy5cbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSBWYWx1ZSB0byB3cml0ZVxuICogQHJldHVybnMge1dyaXRlcn0gYHRoaXNgXG4gKi9cbldyaXRlci5wcm90b3R5cGUuZml4ZWQzMiA9IGZ1bmN0aW9uIHdyaXRlX2ZpeGVkMzIodmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5fcHVzaCh3cml0ZUZpeGVkMzIsIDQsIHZhbHVlID4+PiAwKTtcbn07XG5cbi8qKlxuICogV3JpdGVzIGEgc2lnbmVkIDMyIGJpdCB2YWx1ZSBhcyBmaXhlZCAzMiBiaXRzLlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgVmFsdWUgdG8gd3JpdGVcbiAqIEByZXR1cm5zIHtXcml0ZXJ9IGB0aGlzYFxuICovXG5Xcml0ZXIucHJvdG90eXBlLnNmaXhlZDMyID0gV3JpdGVyLnByb3RvdHlwZS5maXhlZDMyO1xuXG4vKipcbiAqIFdyaXRlcyBhbiB1bnNpZ25lZCA2NCBiaXQgdmFsdWUgYXMgZml4ZWQgNjQgYml0cy5cbiAqIEBwYXJhbSB7TG9uZ3xudW1iZXJ8c3RyaW5nfSB2YWx1ZSBWYWx1ZSB0byB3cml0ZVxuICogQHJldHVybnMge1dyaXRlcn0gYHRoaXNgXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IElmIGB2YWx1ZWAgaXMgYSBzdHJpbmcgYW5kIG5vIGxvbmcgbGlicmFyeSBpcyBwcmVzZW50LlxuICovXG5Xcml0ZXIucHJvdG90eXBlLmZpeGVkNjQgPSBmdW5jdGlvbiB3cml0ZV9maXhlZDY0KHZhbHVlKSB7XG4gICAgdmFyIGJpdHMgPSBMb25nQml0cy5mcm9tKHZhbHVlKTtcbiAgICByZXR1cm4gdGhpcy5fcHVzaCh3cml0ZUZpeGVkMzIsIDQsIGJpdHMubG8pLl9wdXNoKHdyaXRlRml4ZWQzMiwgNCwgYml0cy5oaSk7XG59O1xuXG4vKipcbiAqIFdyaXRlcyBhIHNpZ25lZCA2NCBiaXQgdmFsdWUgYXMgZml4ZWQgNjQgYml0cy5cbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtMb25nfG51bWJlcnxzdHJpbmd9IHZhbHVlIFZhbHVlIHRvIHdyaXRlXG4gKiBAcmV0dXJucyB7V3JpdGVyfSBgdGhpc2BcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gSWYgYHZhbHVlYCBpcyBhIHN0cmluZyBhbmQgbm8gbG9uZyBsaWJyYXJ5IGlzIHByZXNlbnQuXG4gKi9cbldyaXRlci5wcm90b3R5cGUuc2ZpeGVkNjQgPSBXcml0ZXIucHJvdG90eXBlLmZpeGVkNjQ7XG5cbi8qKlxuICogV3JpdGVzIGEgZmxvYXQgKDMyIGJpdCkuXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSBWYWx1ZSB0byB3cml0ZVxuICogQHJldHVybnMge1dyaXRlcn0gYHRoaXNgXG4gKi9cbldyaXRlci5wcm90b3R5cGUuZmxvYXQgPSBmdW5jdGlvbiB3cml0ZV9mbG9hdCh2YWx1ZSkge1xuICAgIHJldHVybiB0aGlzLl9wdXNoKHV0aWwuZmxvYXQud3JpdGVGbG9hdExFLCA0LCB2YWx1ZSk7XG59O1xuXG4vKipcbiAqIFdyaXRlcyBhIGRvdWJsZSAoNjQgYml0IGZsb2F0KS5cbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIFZhbHVlIHRvIHdyaXRlXG4gKiBAcmV0dXJucyB7V3JpdGVyfSBgdGhpc2BcbiAqL1xuV3JpdGVyLnByb3RvdHlwZS5kb3VibGUgPSBmdW5jdGlvbiB3cml0ZV9kb3VibGUodmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5fcHVzaCh1dGlsLmZsb2F0LndyaXRlRG91YmxlTEUsIDgsIHZhbHVlKTtcbn07XG5cbnZhciB3cml0ZUJ5dGVzID0gdXRpbC5BcnJheS5wcm90b3R5cGUuc2V0XG4gICAgPyBmdW5jdGlvbiB3cml0ZUJ5dGVzX3NldCh2YWwsIGJ1ZiwgcG9zKSB7XG4gICAgICAgIGJ1Zi5zZXQodmFsLCBwb3MpOyAvLyBhbHNvIHdvcmtzIGZvciBwbGFpbiBhcnJheSB2YWx1ZXNcbiAgICB9XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICA6IGZ1bmN0aW9uIHdyaXRlQnl0ZXNfZm9yKHZhbCwgYnVmLCBwb3MpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyArK2kpXG4gICAgICAgICAgICBidWZbcG9zICsgaV0gPSB2YWxbaV07XG4gICAgfTtcblxuLyoqXG4gKiBXcml0ZXMgYSBzZXF1ZW5jZSBvZiBieXRlcy5cbiAqIEBwYXJhbSB7VWludDhBcnJheXxzdHJpbmd9IHZhbHVlIEJ1ZmZlciBvciBiYXNlNjQgZW5jb2RlZCBzdHJpbmcgdG8gd3JpdGVcbiAqIEByZXR1cm5zIHtXcml0ZXJ9IGB0aGlzYFxuICovXG5Xcml0ZXIucHJvdG90eXBlLmJ5dGVzID0gZnVuY3Rpb24gd3JpdGVfYnl0ZXModmFsdWUpIHtcbiAgICB2YXIgbGVuID0gdmFsdWUubGVuZ3RoID4+PiAwO1xuICAgIGlmICghbGVuKVxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaCh3cml0ZUJ5dGUsIDEsIDApO1xuICAgIGlmICh1dGlsLmlzU3RyaW5nKHZhbHVlKSkge1xuICAgICAgICB2YXIgYnVmID0gV3JpdGVyLmFsbG9jKGxlbiA9IGJhc2U2NC5sZW5ndGgodmFsdWUpKTtcbiAgICAgICAgYmFzZTY0LmRlY29kZSh2YWx1ZSwgYnVmLCAwKTtcbiAgICAgICAgdmFsdWUgPSBidWY7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnVpbnQzMihsZW4pLl9wdXNoKHdyaXRlQnl0ZXMsIGxlbiwgdmFsdWUpO1xufTtcblxuLyoqXG4gKiBXcml0ZXMgYSBzdHJpbmcuXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgVmFsdWUgdG8gd3JpdGVcbiAqIEByZXR1cm5zIHtXcml0ZXJ9IGB0aGlzYFxuICovXG5Xcml0ZXIucHJvdG90eXBlLnN0cmluZyA9IGZ1bmN0aW9uIHdyaXRlX3N0cmluZyh2YWx1ZSkge1xuICAgIHZhciBsZW4gPSB1dGY4Lmxlbmd0aCh2YWx1ZSk7XG4gICAgcmV0dXJuIGxlblxuICAgICAgICA/IHRoaXMudWludDMyKGxlbikuX3B1c2godXRmOC53cml0ZSwgbGVuLCB2YWx1ZSlcbiAgICAgICAgOiB0aGlzLl9wdXNoKHdyaXRlQnl0ZSwgMSwgMCk7XG59O1xuXG4vKipcbiAqIEZvcmtzIHRoaXMgd3JpdGVyJ3Mgc3RhdGUgYnkgcHVzaGluZyBpdCB0byBhIHN0YWNrLlxuICogQ2FsbGluZyB7QGxpbmsgV3JpdGVyI3Jlc2V0fHJlc2V0fSBvciB7QGxpbmsgV3JpdGVyI2xkZWxpbXxsZGVsaW19IHJlc2V0cyB0aGUgd3JpdGVyIHRvIHRoZSBwcmV2aW91cyBzdGF0ZS5cbiAqIEByZXR1cm5zIHtXcml0ZXJ9IGB0aGlzYFxuICovXG5Xcml0ZXIucHJvdG90eXBlLmZvcmsgPSBmdW5jdGlvbiBmb3JrKCkge1xuICAgIHRoaXMuc3RhdGVzID0gbmV3IFN0YXRlKHRoaXMpO1xuICAgIHRoaXMuaGVhZCA9IHRoaXMudGFpbCA9IG5ldyBPcChub29wLCAwLCAwKTtcbiAgICB0aGlzLmxlbiA9IDA7XG4gICAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFJlc2V0cyB0aGlzIGluc3RhbmNlIHRvIHRoZSBsYXN0IHN0YXRlLlxuICogQHJldHVybnMge1dyaXRlcn0gYHRoaXNgXG4gKi9cbldyaXRlci5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiByZXNldCgpIHtcbiAgICBpZiAodGhpcy5zdGF0ZXMpIHtcbiAgICAgICAgdGhpcy5oZWFkICAgPSB0aGlzLnN0YXRlcy5oZWFkO1xuICAgICAgICB0aGlzLnRhaWwgICA9IHRoaXMuc3RhdGVzLnRhaWw7XG4gICAgICAgIHRoaXMubGVuICAgID0gdGhpcy5zdGF0ZXMubGVuO1xuICAgICAgICB0aGlzLnN0YXRlcyA9IHRoaXMuc3RhdGVzLm5leHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5oZWFkID0gdGhpcy50YWlsID0gbmV3IE9wKG5vb3AsIDAsIDApO1xuICAgICAgICB0aGlzLmxlbiAgPSAwO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogUmVzZXRzIHRvIHRoZSBsYXN0IHN0YXRlIGFuZCBhcHBlbmRzIHRoZSBmb3JrIHN0YXRlJ3MgY3VycmVudCB3cml0ZSBsZW5ndGggYXMgYSB2YXJpbnQgZm9sbG93ZWQgYnkgaXRzIG9wZXJhdGlvbnMuXG4gKiBAcmV0dXJucyB7V3JpdGVyfSBgdGhpc2BcbiAqL1xuV3JpdGVyLnByb3RvdHlwZS5sZGVsaW0gPSBmdW5jdGlvbiBsZGVsaW0oKSB7XG4gICAgdmFyIGhlYWQgPSB0aGlzLmhlYWQsXG4gICAgICAgIHRhaWwgPSB0aGlzLnRhaWwsXG4gICAgICAgIGxlbiAgPSB0aGlzLmxlbjtcbiAgICB0aGlzLnJlc2V0KCkudWludDMyKGxlbik7XG4gICAgaWYgKGxlbikge1xuICAgICAgICB0aGlzLnRhaWwubmV4dCA9IGhlYWQubmV4dDsgLy8gc2tpcCBub29wXG4gICAgICAgIHRoaXMudGFpbCA9IHRhaWw7XG4gICAgICAgIHRoaXMubGVuICs9IGxlbjtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIEZpbmlzaGVzIHRoZSB3cml0ZSBvcGVyYXRpb24uXG4gKiBAcmV0dXJucyB7VWludDhBcnJheX0gRmluaXNoZWQgYnVmZmVyXG4gKi9cbldyaXRlci5wcm90b3R5cGUuZmluaXNoID0gZnVuY3Rpb24gZmluaXNoKCkge1xuICAgIHZhciBoZWFkID0gdGhpcy5oZWFkLm5leHQsIC8vIHNraXAgbm9vcFxuICAgICAgICBidWYgID0gdGhpcy5jb25zdHJ1Y3Rvci5hbGxvYyh0aGlzLmxlbiksXG4gICAgICAgIHBvcyAgPSAwO1xuICAgIHdoaWxlIChoZWFkKSB7XG4gICAgICAgIGhlYWQuZm4oaGVhZC52YWwsIGJ1ZiwgcG9zKTtcbiAgICAgICAgcG9zICs9IGhlYWQubGVuO1xuICAgICAgICBoZWFkID0gaGVhZC5uZXh0O1xuICAgIH1cbiAgICAvLyB0aGlzLmhlYWQgPSB0aGlzLnRhaWwgPSBudWxsO1xuICAgIHJldHVybiBidWY7XG59O1xuXG5Xcml0ZXIuX2NvbmZpZ3VyZSA9IGZ1bmN0aW9uKEJ1ZmZlcldyaXRlcl8pIHtcbiAgICBCdWZmZXJXcml0ZXIgPSBCdWZmZXJXcml0ZXJfO1xuICAgIFdyaXRlci5jcmVhdGUgPSBjcmVhdGUoKTtcbiAgICBCdWZmZXJXcml0ZXIuX2NvbmZpZ3VyZSgpO1xufTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbm1vZHVsZS5leHBvcnRzID0gQnVmZmVyV3JpdGVyO1xuXG4vLyBleHRlbmRzIFdyaXRlclxudmFyIFdyaXRlciA9IHJlcXVpcmUoXCIuL3dyaXRlclwiKTtcbihCdWZmZXJXcml0ZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShXcml0ZXIucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBCdWZmZXJXcml0ZXI7XG5cbnZhciB1dGlsID0gcmVxdWlyZShcIi4vdXRpbC9taW5pbWFsXCIpO1xuXG4vKipcbiAqIENvbnN0cnVjdHMgYSBuZXcgYnVmZmVyIHdyaXRlciBpbnN0YW5jZS5cbiAqIEBjbGFzc2Rlc2MgV2lyZSBmb3JtYXQgd3JpdGVyIHVzaW5nIG5vZGUgYnVmZmVycy5cbiAqIEBleHRlbmRzIFdyaXRlclxuICogQGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIEJ1ZmZlcldyaXRlcigpIHtcbiAgICBXcml0ZXIuY2FsbCh0aGlzKTtcbn1cblxuQnVmZmVyV3JpdGVyLl9jb25maWd1cmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgLyoqXG4gICAgICogQWxsb2NhdGVzIGEgYnVmZmVyIG9mIHRoZSBzcGVjaWZpZWQgc2l6ZS5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc2l6ZSBCdWZmZXIgc2l6ZVxuICAgICAqIEByZXR1cm5zIHtCdWZmZXJ9IEJ1ZmZlclxuICAgICAqL1xuICAgIEJ1ZmZlcldyaXRlci5hbGxvYyA9IHV0aWwuX0J1ZmZlcl9hbGxvY1Vuc2FmZTtcblxuICAgIEJ1ZmZlcldyaXRlci53cml0ZUJ5dGVzQnVmZmVyID0gdXRpbC5CdWZmZXIgJiYgdXRpbC5CdWZmZXIucHJvdG90eXBlIGluc3RhbmNlb2YgVWludDhBcnJheSAmJiB1dGlsLkJ1ZmZlci5wcm90b3R5cGUuc2V0Lm5hbWUgPT09IFwic2V0XCJcbiAgICAgICAgPyBmdW5jdGlvbiB3cml0ZUJ5dGVzQnVmZmVyX3NldCh2YWwsIGJ1ZiwgcG9zKSB7XG4gICAgICAgICAgYnVmLnNldCh2YWwsIHBvcyk7IC8vIGZhc3RlciB0aGFuIGNvcHkgKHJlcXVpcmVzIG5vZGUgPj0gNCB3aGVyZSBCdWZmZXJzIGV4dGVuZCBVaW50OEFycmF5IGFuZCBzZXQgaXMgcHJvcGVybHkgaW5oZXJpdGVkKVxuICAgICAgICAgIC8vIGFsc28gd29ya3MgZm9yIHBsYWluIGFycmF5IHZhbHVlc1xuICAgICAgICB9XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgIDogZnVuY3Rpb24gd3JpdGVCeXRlc0J1ZmZlcl9jb3B5KHZhbCwgYnVmLCBwb3MpIHtcbiAgICAgICAgICBpZiAodmFsLmNvcHkpIC8vIEJ1ZmZlciB2YWx1ZXNcbiAgICAgICAgICAgIHZhbC5jb3B5KGJ1ZiwgcG9zLCAwLCB2YWwubGVuZ3RoKTtcbiAgICAgICAgICBlbHNlIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsLmxlbmd0aDspIC8vIHBsYWluIGFycmF5IHZhbHVlc1xuICAgICAgICAgICAgYnVmW3BvcysrXSA9IHZhbFtpKytdO1xuICAgICAgICB9O1xufTtcblxuXG4vKipcbiAqIEBvdmVycmlkZVxuICovXG5CdWZmZXJXcml0ZXIucHJvdG90eXBlLmJ5dGVzID0gZnVuY3Rpb24gd3JpdGVfYnl0ZXNfYnVmZmVyKHZhbHVlKSB7XG4gICAgaWYgKHV0aWwuaXNTdHJpbmcodmFsdWUpKVxuICAgICAgICB2YWx1ZSA9IHV0aWwuX0J1ZmZlcl9mcm9tKHZhbHVlLCBcImJhc2U2NFwiKTtcbiAgICB2YXIgbGVuID0gdmFsdWUubGVuZ3RoID4+PiAwO1xuICAgIHRoaXMudWludDMyKGxlbik7XG4gICAgaWYgKGxlbilcbiAgICAgICAgdGhpcy5fcHVzaChCdWZmZXJXcml0ZXIud3JpdGVCeXRlc0J1ZmZlciwgbGVuLCB2YWx1ZSk7XG4gICAgcmV0dXJuIHRoaXM7XG59O1xuXG5mdW5jdGlvbiB3cml0ZVN0cmluZ0J1ZmZlcih2YWwsIGJ1ZiwgcG9zKSB7XG4gICAgaWYgKHZhbC5sZW5ndGggPCA0MCkgLy8gcGxhaW4ganMgaXMgZmFzdGVyIGZvciBzaG9ydCBzdHJpbmdzIChwcm9iYWJseSBkdWUgdG8gcmVkdW5kYW50IGFzc2VydGlvbnMpXG4gICAgICAgIHV0aWwudXRmOC53cml0ZSh2YWwsIGJ1ZiwgcG9zKTtcbiAgICBlbHNlIGlmIChidWYudXRmOFdyaXRlKVxuICAgICAgICBidWYudXRmOFdyaXRlKHZhbCwgcG9zKTtcbiAgICBlbHNlXG4gICAgICAgIGJ1Zi53cml0ZSh2YWwsIHBvcyk7XG59XG5cbi8qKlxuICogQG92ZXJyaWRlXG4gKi9cbkJ1ZmZlcldyaXRlci5wcm90b3R5cGUuc3RyaW5nID0gZnVuY3Rpb24gd3JpdGVfc3RyaW5nX2J1ZmZlcih2YWx1ZSkge1xuICAgIHZhciBsZW4gPSB1dGlsLkJ1ZmZlci5ieXRlTGVuZ3RoKHZhbHVlKTtcbiAgICB0aGlzLnVpbnQzMihsZW4pO1xuICAgIGlmIChsZW4pXG4gICAgICAgIHRoaXMuX3B1c2god3JpdGVTdHJpbmdCdWZmZXIsIGxlbiwgdmFsdWUpO1xuICAgIHJldHVybiB0aGlzO1xufTtcblxuXG4vKipcbiAqIEZpbmlzaGVzIHRoZSB3cml0ZSBvcGVyYXRpb24uXG4gKiBAbmFtZSBCdWZmZXJXcml0ZXIjZmluaXNoXG4gKiBAZnVuY3Rpb25cbiAqIEByZXR1cm5zIHtCdWZmZXJ9IEZpbmlzaGVkIGJ1ZmZlclxuICovXG5cbkJ1ZmZlcldyaXRlci5fY29uZmlndXJlKCk7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5tb2R1bGUuZXhwb3J0cyA9IFJlYWRlcjtcblxudmFyIHV0aWwgICAgICA9IHJlcXVpcmUoXCIuL3V0aWwvbWluaW1hbFwiKTtcblxudmFyIEJ1ZmZlclJlYWRlcjsgLy8gY3ljbGljXG5cbnZhciBMb25nQml0cyAgPSB1dGlsLkxvbmdCaXRzLFxuICAgIHV0ZjggICAgICA9IHV0aWwudXRmODtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmZ1bmN0aW9uIGluZGV4T3V0T2ZSYW5nZShyZWFkZXIsIHdyaXRlTGVuZ3RoKSB7XG4gICAgcmV0dXJuIFJhbmdlRXJyb3IoXCJpbmRleCBvdXQgb2YgcmFuZ2U6IFwiICsgcmVhZGVyLnBvcyArIFwiICsgXCIgKyAod3JpdGVMZW5ndGggfHwgMSkgKyBcIiA+IFwiICsgcmVhZGVyLmxlbik7XG59XG5cbi8qKlxuICogQ29uc3RydWN0cyBhIG5ldyByZWFkZXIgaW5zdGFuY2UgdXNpbmcgdGhlIHNwZWNpZmllZCBidWZmZXIuXG4gKiBAY2xhc3NkZXNjIFdpcmUgZm9ybWF0IHJlYWRlciB1c2luZyBgVWludDhBcnJheWAgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgYEFycmF5YC5cbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtVaW50OEFycmF5fSBidWZmZXIgQnVmZmVyIHRvIHJlYWQgZnJvbVxuICovXG5mdW5jdGlvbiBSZWFkZXIoYnVmZmVyKSB7XG5cbiAgICAvKipcbiAgICAgKiBSZWFkIGJ1ZmZlci5cbiAgICAgKiBAdHlwZSB7VWludDhBcnJheX1cbiAgICAgKi9cbiAgICB0aGlzLmJ1ZiA9IGJ1ZmZlcjtcblxuICAgIC8qKlxuICAgICAqIFJlYWQgYnVmZmVyIHBvc2l0aW9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgdGhpcy5wb3MgPSAwO1xuXG4gICAgLyoqXG4gICAgICogUmVhZCBidWZmZXIgbGVuZ3RoLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgdGhpcy5sZW4gPSBidWZmZXIubGVuZ3RoO1xufVxuXG52YXIgY3JlYXRlX2FycmF5ID0gdHlwZW9mIFVpbnQ4QXJyYXkgIT09IFwidW5kZWZpbmVkXCJcbiAgICA/IGZ1bmN0aW9uIGNyZWF0ZV90eXBlZF9hcnJheShidWZmZXIpIHtcbiAgICAgICAgaWYgKGJ1ZmZlciBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgfHwgQXJyYXkuaXNBcnJheShidWZmZXIpKVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWFkZXIoYnVmZmVyKTtcbiAgICAgICAgdGhyb3cgRXJyb3IoXCJpbGxlZ2FsIGJ1ZmZlclwiKTtcbiAgICB9XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICA6IGZ1bmN0aW9uIGNyZWF0ZV9hcnJheShidWZmZXIpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYnVmZmVyKSlcbiAgICAgICAgICAgIHJldHVybiBuZXcgUmVhZGVyKGJ1ZmZlcik7XG4gICAgICAgIHRocm93IEVycm9yKFwiaWxsZWdhbCBidWZmZXJcIik7XG4gICAgfTtcblxudmFyIGNyZWF0ZSA9IGZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgICByZXR1cm4gdXRpbC5CdWZmZXJcbiAgICAgICAgPyBmdW5jdGlvbiBjcmVhdGVfYnVmZmVyX3NldHVwKGJ1ZmZlcikge1xuICAgICAgICAgICAgcmV0dXJuIChSZWFkZXIuY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlX2J1ZmZlcihidWZmZXIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdXRpbC5CdWZmZXIuaXNCdWZmZXIoYnVmZmVyKVxuICAgICAgICAgICAgICAgICAgICA/IG5ldyBCdWZmZXJSZWFkZXIoYnVmZmVyKVxuICAgICAgICAgICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICAgICAgICAgICAgICA6IGNyZWF0ZV9hcnJheShidWZmZXIpO1xuICAgICAgICAgICAgfSkoYnVmZmVyKTtcbiAgICAgICAgfVxuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICA6IGNyZWF0ZV9hcnJheTtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyByZWFkZXIgdXNpbmcgdGhlIHNwZWNpZmllZCBidWZmZXIuXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7VWludDhBcnJheXxCdWZmZXJ9IGJ1ZmZlciBCdWZmZXIgdG8gcmVhZCBmcm9tXG4gKiBAcmV0dXJucyB7UmVhZGVyfEJ1ZmZlclJlYWRlcn0gQSB7QGxpbmsgQnVmZmVyUmVhZGVyfSBpZiBgYnVmZmVyYCBpcyBhIEJ1ZmZlciwgb3RoZXJ3aXNlIGEge0BsaW5rIFJlYWRlcn1cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBgYnVmZmVyYCBpcyBub3QgYSB2YWxpZCBidWZmZXJcbiAqL1xuUmVhZGVyLmNyZWF0ZSA9IGNyZWF0ZSgpO1xuXG5SZWFkZXIucHJvdG90eXBlLl9zbGljZSA9IHV0aWwuQXJyYXkucHJvdG90eXBlLnN1YmFycmF5IHx8IC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovIHV0aWwuQXJyYXkucHJvdG90eXBlLnNsaWNlO1xuXG4vKipcbiAqIFJlYWRzIGEgdmFyaW50IGFzIGFuIHVuc2lnbmVkIDMyIGJpdCB2YWx1ZS5cbiAqIEBmdW5jdGlvblxuICogQHJldHVybnMge251bWJlcn0gVmFsdWUgcmVhZFxuICovXG5SZWFkZXIucHJvdG90eXBlLnVpbnQzMiA9IChmdW5jdGlvbiByZWFkX3VpbnQzMl9zZXR1cCgpIHtcbiAgICB2YXIgdmFsdWUgPSA0Mjk0OTY3Mjk1OyAvLyBvcHRpbWl6ZXIgdHlwZS1oaW50LCB0ZW5kcyB0byBkZW9wdCBvdGhlcndpc2UgKD8hKVxuICAgIHJldHVybiBmdW5jdGlvbiByZWFkX3VpbnQzMigpIHtcbiAgICAgICAgdmFsdWUgPSAoICAgICAgICAgdGhpcy5idWZbdGhpcy5wb3NdICYgMTI3ICAgICAgICkgPj4+IDA7IGlmICh0aGlzLmJ1Zlt0aGlzLnBvcysrXSA8IDEyOCkgcmV0dXJuIHZhbHVlO1xuICAgICAgICB2YWx1ZSA9ICh2YWx1ZSB8ICh0aGlzLmJ1Zlt0aGlzLnBvc10gJiAxMjcpIDw8ICA3KSA+Pj4gMDsgaWYgKHRoaXMuYnVmW3RoaXMucG9zKytdIDwgMTI4KSByZXR1cm4gdmFsdWU7XG4gICAgICAgIHZhbHVlID0gKHZhbHVlIHwgKHRoaXMuYnVmW3RoaXMucG9zXSAmIDEyNykgPDwgMTQpID4+PiAwOyBpZiAodGhpcy5idWZbdGhpcy5wb3MrK10gPCAxMjgpIHJldHVybiB2YWx1ZTtcbiAgICAgICAgdmFsdWUgPSAodmFsdWUgfCAodGhpcy5idWZbdGhpcy5wb3NdICYgMTI3KSA8PCAyMSkgPj4+IDA7IGlmICh0aGlzLmJ1Zlt0aGlzLnBvcysrXSA8IDEyOCkgcmV0dXJuIHZhbHVlO1xuICAgICAgICB2YWx1ZSA9ICh2YWx1ZSB8ICh0aGlzLmJ1Zlt0aGlzLnBvc10gJiAgMTUpIDw8IDI4KSA+Pj4gMDsgaWYgKHRoaXMuYnVmW3RoaXMucG9zKytdIDwgMTI4KSByZXR1cm4gdmFsdWU7XG5cbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICAgIGlmICgodGhpcy5wb3MgKz0gNSkgPiB0aGlzLmxlbikge1xuICAgICAgICAgICAgdGhpcy5wb3MgPSB0aGlzLmxlbjtcbiAgICAgICAgICAgIHRocm93IGluZGV4T3V0T2ZSYW5nZSh0aGlzLCAxMCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH07XG59KSgpO1xuXG4vKipcbiAqIFJlYWRzIGEgdmFyaW50IGFzIGEgc2lnbmVkIDMyIGJpdCB2YWx1ZS5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFZhbHVlIHJlYWRcbiAqL1xuUmVhZGVyLnByb3RvdHlwZS5pbnQzMiA9IGZ1bmN0aW9uIHJlYWRfaW50MzIoKSB7XG4gICAgcmV0dXJuIHRoaXMudWludDMyKCkgfCAwO1xufTtcblxuLyoqXG4gKiBSZWFkcyBhIHppZy16YWcgZW5jb2RlZCB2YXJpbnQgYXMgYSBzaWduZWQgMzIgYml0IHZhbHVlLlxuICogQHJldHVybnMge251bWJlcn0gVmFsdWUgcmVhZFxuICovXG5SZWFkZXIucHJvdG90eXBlLnNpbnQzMiA9IGZ1bmN0aW9uIHJlYWRfc2ludDMyKCkge1xuICAgIHZhciB2YWx1ZSA9IHRoaXMudWludDMyKCk7XG4gICAgcmV0dXJuIHZhbHVlID4+PiAxIF4gLSh2YWx1ZSAmIDEpIHwgMDtcbn07XG5cbi8qIGVzbGludC1kaXNhYmxlIG5vLWludmFsaWQtdGhpcyAqL1xuXG5mdW5jdGlvbiByZWFkTG9uZ1ZhcmludCgpIHtcbiAgICAvLyB0ZW5kcyB0byBkZW9wdCB3aXRoIGxvY2FsIHZhcnMgZm9yIG9jdGV0IGV0Yy5cbiAgICB2YXIgYml0cyA9IG5ldyBMb25nQml0cygwLCAwKTtcbiAgICB2YXIgaSA9IDA7XG4gICAgaWYgKHRoaXMubGVuIC0gdGhpcy5wb3MgPiA0KSB7IC8vIGZhc3Qgcm91dGUgKGxvKVxuICAgICAgICBmb3IgKDsgaSA8IDQ7ICsraSkge1xuICAgICAgICAgICAgLy8gMXN0Li40dGhcbiAgICAgICAgICAgIGJpdHMubG8gPSAoYml0cy5sbyB8ICh0aGlzLmJ1Zlt0aGlzLnBvc10gJiAxMjcpIDw8IGkgKiA3KSA+Pj4gMDtcbiAgICAgICAgICAgIGlmICh0aGlzLmJ1Zlt0aGlzLnBvcysrXSA8IDEyOClcbiAgICAgICAgICAgICAgICByZXR1cm4gYml0cztcbiAgICAgICAgfVxuICAgICAgICAvLyA1dGhcbiAgICAgICAgYml0cy5sbyA9IChiaXRzLmxvIHwgKHRoaXMuYnVmW3RoaXMucG9zXSAmIDEyNykgPDwgMjgpID4+PiAwO1xuICAgICAgICBiaXRzLmhpID0gKGJpdHMuaGkgfCAodGhpcy5idWZbdGhpcy5wb3NdICYgMTI3KSA+PiAgNCkgPj4+IDA7XG4gICAgICAgIGlmICh0aGlzLmJ1Zlt0aGlzLnBvcysrXSA8IDEyOClcbiAgICAgICAgICAgIHJldHVybiBiaXRzO1xuICAgICAgICBpID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKDsgaSA8IDM7ICsraSkge1xuICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICAgICAgICBpZiAodGhpcy5wb3MgPj0gdGhpcy5sZW4pXG4gICAgICAgICAgICAgICAgdGhyb3cgaW5kZXhPdXRPZlJhbmdlKHRoaXMpO1xuICAgICAgICAgICAgLy8gMXN0Li4zdGhcbiAgICAgICAgICAgIGJpdHMubG8gPSAoYml0cy5sbyB8ICh0aGlzLmJ1Zlt0aGlzLnBvc10gJiAxMjcpIDw8IGkgKiA3KSA+Pj4gMDtcbiAgICAgICAgICAgIGlmICh0aGlzLmJ1Zlt0aGlzLnBvcysrXSA8IDEyOClcbiAgICAgICAgICAgICAgICByZXR1cm4gYml0cztcbiAgICAgICAgfVxuICAgICAgICAvLyA0dGhcbiAgICAgICAgYml0cy5sbyA9IChiaXRzLmxvIHwgKHRoaXMuYnVmW3RoaXMucG9zKytdICYgMTI3KSA8PCBpICogNykgPj4+IDA7XG4gICAgICAgIHJldHVybiBiaXRzO1xuICAgIH1cbiAgICBpZiAodGhpcy5sZW4gLSB0aGlzLnBvcyA+IDQpIHsgLy8gZmFzdCByb3V0ZSAoaGkpXG4gICAgICAgIGZvciAoOyBpIDwgNTsgKytpKSB7XG4gICAgICAgICAgICAvLyA2dGguLjEwdGhcbiAgICAgICAgICAgIGJpdHMuaGkgPSAoYml0cy5oaSB8ICh0aGlzLmJ1Zlt0aGlzLnBvc10gJiAxMjcpIDw8IGkgKiA3ICsgMykgPj4+IDA7XG4gICAgICAgICAgICBpZiAodGhpcy5idWZbdGhpcy5wb3MrK10gPCAxMjgpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGJpdHM7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKDsgaSA8IDU7ICsraSkge1xuICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICAgICAgICBpZiAodGhpcy5wb3MgPj0gdGhpcy5sZW4pXG4gICAgICAgICAgICAgICAgdGhyb3cgaW5kZXhPdXRPZlJhbmdlKHRoaXMpO1xuICAgICAgICAgICAgLy8gNnRoLi4xMHRoXG4gICAgICAgICAgICBiaXRzLmhpID0gKGJpdHMuaGkgfCAodGhpcy5idWZbdGhpcy5wb3NdICYgMTI3KSA8PCBpICogNyArIDMpID4+PiAwO1xuICAgICAgICAgICAgaWYgKHRoaXMuYnVmW3RoaXMucG9zKytdIDwgMTI4KVxuICAgICAgICAgICAgICAgIHJldHVybiBiaXRzO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgdGhyb3cgRXJyb3IoXCJpbnZhbGlkIHZhcmludCBlbmNvZGluZ1wiKTtcbn1cblxuLyogZXNsaW50LWVuYWJsZSBuby1pbnZhbGlkLXRoaXMgKi9cblxuLyoqXG4gKiBSZWFkcyBhIHZhcmludCBhcyBhIHNpZ25lZCA2NCBiaXQgdmFsdWUuXG4gKiBAbmFtZSBSZWFkZXIjaW50NjRcbiAqIEBmdW5jdGlvblxuICogQHJldHVybnMge0xvbmd9IFZhbHVlIHJlYWRcbiAqL1xuXG4vKipcbiAqIFJlYWRzIGEgdmFyaW50IGFzIGFuIHVuc2lnbmVkIDY0IGJpdCB2YWx1ZS5cbiAqIEBuYW1lIFJlYWRlciN1aW50NjRcbiAqIEBmdW5jdGlvblxuICogQHJldHVybnMge0xvbmd9IFZhbHVlIHJlYWRcbiAqL1xuXG4vKipcbiAqIFJlYWRzIGEgemlnLXphZyBlbmNvZGVkIHZhcmludCBhcyBhIHNpZ25lZCA2NCBiaXQgdmFsdWUuXG4gKiBAbmFtZSBSZWFkZXIjc2ludDY0XG4gKiBAZnVuY3Rpb25cbiAqIEByZXR1cm5zIHtMb25nfSBWYWx1ZSByZWFkXG4gKi9cblxuLyoqXG4gKiBSZWFkcyBhIHZhcmludCBhcyBhIGJvb2xlYW4uXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVmFsdWUgcmVhZFxuICovXG5SZWFkZXIucHJvdG90eXBlLmJvb2wgPSBmdW5jdGlvbiByZWFkX2Jvb2woKSB7XG4gICAgcmV0dXJuIHRoaXMudWludDMyKCkgIT09IDA7XG59O1xuXG5mdW5jdGlvbiByZWFkRml4ZWQzMl9lbmQoYnVmLCBlbmQpIHsgLy8gbm90ZSB0aGF0IHRoaXMgdXNlcyBgZW5kYCwgbm90IGBwb3NgXG4gICAgcmV0dXJuIChidWZbZW5kIC0gNF1cbiAgICAgICAgICB8IGJ1ZltlbmQgLSAzXSA8PCA4XG4gICAgICAgICAgfCBidWZbZW5kIC0gMl0gPDwgMTZcbiAgICAgICAgICB8IGJ1ZltlbmQgLSAxXSA8PCAyNCkgPj4+IDA7XG59XG5cbi8qKlxuICogUmVhZHMgZml4ZWQgMzIgYml0cyBhcyBhbiB1bnNpZ25lZCAzMiBiaXQgaW50ZWdlci5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFZhbHVlIHJlYWRcbiAqL1xuUmVhZGVyLnByb3RvdHlwZS5maXhlZDMyID0gZnVuY3Rpb24gcmVhZF9maXhlZDMyKCkge1xuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKHRoaXMucG9zICsgNCA+IHRoaXMubGVuKVxuICAgICAgICB0aHJvdyBpbmRleE91dE9mUmFuZ2UodGhpcywgNCk7XG5cbiAgICByZXR1cm4gcmVhZEZpeGVkMzJfZW5kKHRoaXMuYnVmLCB0aGlzLnBvcyArPSA0KTtcbn07XG5cbi8qKlxuICogUmVhZHMgZml4ZWQgMzIgYml0cyBhcyBhIHNpZ25lZCAzMiBiaXQgaW50ZWdlci5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFZhbHVlIHJlYWRcbiAqL1xuUmVhZGVyLnByb3RvdHlwZS5zZml4ZWQzMiA9IGZ1bmN0aW9uIHJlYWRfc2ZpeGVkMzIoKSB7XG5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAodGhpcy5wb3MgKyA0ID4gdGhpcy5sZW4pXG4gICAgICAgIHRocm93IGluZGV4T3V0T2ZSYW5nZSh0aGlzLCA0KTtcblxuICAgIHJldHVybiByZWFkRml4ZWQzMl9lbmQodGhpcy5idWYsIHRoaXMucG9zICs9IDQpIHwgMDtcbn07XG5cbi8qIGVzbGludC1kaXNhYmxlIG5vLWludmFsaWQtdGhpcyAqL1xuXG5mdW5jdGlvbiByZWFkRml4ZWQ2NCgvKiB0aGlzOiBSZWFkZXIgKi8pIHtcblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmICh0aGlzLnBvcyArIDggPiB0aGlzLmxlbilcbiAgICAgICAgdGhyb3cgaW5kZXhPdXRPZlJhbmdlKHRoaXMsIDgpO1xuXG4gICAgcmV0dXJuIG5ldyBMb25nQml0cyhyZWFkRml4ZWQzMl9lbmQodGhpcy5idWYsIHRoaXMucG9zICs9IDQpLCByZWFkRml4ZWQzMl9lbmQodGhpcy5idWYsIHRoaXMucG9zICs9IDQpKTtcbn1cblxuLyogZXNsaW50LWVuYWJsZSBuby1pbnZhbGlkLXRoaXMgKi9cblxuLyoqXG4gKiBSZWFkcyBmaXhlZCA2NCBiaXRzLlxuICogQG5hbWUgUmVhZGVyI2ZpeGVkNjRcbiAqIEBmdW5jdGlvblxuICogQHJldHVybnMge0xvbmd9IFZhbHVlIHJlYWRcbiAqL1xuXG4vKipcbiAqIFJlYWRzIHppZy16YWcgZW5jb2RlZCBmaXhlZCA2NCBiaXRzLlxuICogQG5hbWUgUmVhZGVyI3NmaXhlZDY0XG4gKiBAZnVuY3Rpb25cbiAqIEByZXR1cm5zIHtMb25nfSBWYWx1ZSByZWFkXG4gKi9cblxuLyoqXG4gKiBSZWFkcyBhIGZsb2F0ICgzMiBiaXQpIGFzIGEgbnVtYmVyLlxuICogQGZ1bmN0aW9uXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBWYWx1ZSByZWFkXG4gKi9cblJlYWRlci5wcm90b3R5cGUuZmxvYXQgPSBmdW5jdGlvbiByZWFkX2Zsb2F0KCkge1xuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKHRoaXMucG9zICsgNCA+IHRoaXMubGVuKVxuICAgICAgICB0aHJvdyBpbmRleE91dE9mUmFuZ2UodGhpcywgNCk7XG5cbiAgICB2YXIgdmFsdWUgPSB1dGlsLmZsb2F0LnJlYWRGbG9hdExFKHRoaXMuYnVmLCB0aGlzLnBvcyk7XG4gICAgdGhpcy5wb3MgKz0gNDtcbiAgICByZXR1cm4gdmFsdWU7XG59O1xuXG4vKipcbiAqIFJlYWRzIGEgZG91YmxlICg2NCBiaXQgZmxvYXQpIGFzIGEgbnVtYmVyLlxuICogQGZ1bmN0aW9uXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBWYWx1ZSByZWFkXG4gKi9cblJlYWRlci5wcm90b3R5cGUuZG91YmxlID0gZnVuY3Rpb24gcmVhZF9kb3VibGUoKSB7XG5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAodGhpcy5wb3MgKyA4ID4gdGhpcy5sZW4pXG4gICAgICAgIHRocm93IGluZGV4T3V0T2ZSYW5nZSh0aGlzLCA0KTtcblxuICAgIHZhciB2YWx1ZSA9IHV0aWwuZmxvYXQucmVhZERvdWJsZUxFKHRoaXMuYnVmLCB0aGlzLnBvcyk7XG4gICAgdGhpcy5wb3MgKz0gODtcbiAgICByZXR1cm4gdmFsdWU7XG59O1xuXG4vKipcbiAqIFJlYWRzIGEgc2VxdWVuY2Ugb2YgYnl0ZXMgcHJlY2VlZGVkIGJ5IGl0cyBsZW5ndGggYXMgYSB2YXJpbnQuXG4gKiBAcmV0dXJucyB7VWludDhBcnJheX0gVmFsdWUgcmVhZFxuICovXG5SZWFkZXIucHJvdG90eXBlLmJ5dGVzID0gZnVuY3Rpb24gcmVhZF9ieXRlcygpIHtcbiAgICB2YXIgbGVuZ3RoID0gdGhpcy51aW50MzIoKSxcbiAgICAgICAgc3RhcnQgID0gdGhpcy5wb3MsXG4gICAgICAgIGVuZCAgICA9IHRoaXMucG9zICsgbGVuZ3RoO1xuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKGVuZCA+IHRoaXMubGVuKVxuICAgICAgICB0aHJvdyBpbmRleE91dE9mUmFuZ2UodGhpcywgbGVuZ3RoKTtcblxuICAgIHRoaXMucG9zICs9IGxlbmd0aDtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmJ1ZikpIC8vIHBsYWluIGFycmF5XG4gICAgICAgIHJldHVybiB0aGlzLmJ1Zi5zbGljZShzdGFydCwgZW5kKTtcblxuICAgIGlmIChzdGFydCA9PT0gZW5kKSB7IC8vIGZpeCBmb3IgSUUgMTAvV2luOCBhbmQgb3RoZXJzJyBzdWJhcnJheSByZXR1cm5pbmcgYXJyYXkgb2Ygc2l6ZSAxXG4gICAgICAgIHZhciBuYXRpdmVCdWZmZXIgPSB1dGlsLkJ1ZmZlcjtcbiAgICAgICAgcmV0dXJuIG5hdGl2ZUJ1ZmZlclxuICAgICAgICAgICAgPyBuYXRpdmVCdWZmZXIuYWxsb2MoMClcbiAgICAgICAgICAgIDogbmV3IHRoaXMuYnVmLmNvbnN0cnVjdG9yKDApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fc2xpY2UuY2FsbCh0aGlzLmJ1Ziwgc3RhcnQsIGVuZCk7XG59O1xuXG4vKipcbiAqIFJlYWRzIGEgc3RyaW5nIHByZWNlZWRlZCBieSBpdHMgYnl0ZSBsZW5ndGggYXMgYSB2YXJpbnQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBWYWx1ZSByZWFkXG4gKi9cblJlYWRlci5wcm90b3R5cGUuc3RyaW5nID0gZnVuY3Rpb24gcmVhZF9zdHJpbmcoKSB7XG4gICAgdmFyIGJ5dGVzID0gdGhpcy5ieXRlcygpO1xuICAgIHJldHVybiB1dGY4LnJlYWQoYnl0ZXMsIDAsIGJ5dGVzLmxlbmd0aCk7XG59O1xuXG4vKipcbiAqIFNraXBzIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGJ5dGVzIGlmIHNwZWNpZmllZCwgb3RoZXJ3aXNlIHNraXBzIGEgdmFyaW50LlxuICogQHBhcmFtIHtudW1iZXJ9IFtsZW5ndGhdIExlbmd0aCBpZiBrbm93biwgb3RoZXJ3aXNlIGEgdmFyaW50IGlzIGFzc3VtZWRcbiAqIEByZXR1cm5zIHtSZWFkZXJ9IGB0aGlzYFxuICovXG5SZWFkZXIucHJvdG90eXBlLnNraXAgPSBmdW5jdGlvbiBza2lwKGxlbmd0aCkge1xuICAgIGlmICh0eXBlb2YgbGVuZ3RoID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICBpZiAodGhpcy5wb3MgKyBsZW5ndGggPiB0aGlzLmxlbilcbiAgICAgICAgICAgIHRocm93IGluZGV4T3V0T2ZSYW5nZSh0aGlzLCBsZW5ndGgpO1xuICAgICAgICB0aGlzLnBvcyArPSBsZW5ndGg7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICAgICAgICBpZiAodGhpcy5wb3MgPj0gdGhpcy5sZW4pXG4gICAgICAgICAgICAgICAgdGhyb3cgaW5kZXhPdXRPZlJhbmdlKHRoaXMpO1xuICAgICAgICB9IHdoaWxlICh0aGlzLmJ1Zlt0aGlzLnBvcysrXSAmIDEyOCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBTa2lwcyB0aGUgbmV4dCBlbGVtZW50IG9mIHRoZSBzcGVjaWZpZWQgd2lyZSB0eXBlLlxuICogQHBhcmFtIHtudW1iZXJ9IHdpcmVUeXBlIFdpcmUgdHlwZSByZWNlaXZlZFxuICogQHJldHVybnMge1JlYWRlcn0gYHRoaXNgXG4gKi9cblJlYWRlci5wcm90b3R5cGUuc2tpcFR5cGUgPSBmdW5jdGlvbih3aXJlVHlwZSkge1xuICAgIHN3aXRjaCAod2lyZVR5cGUpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgdGhpcy5za2lwKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgdGhpcy5za2lwKDgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIHRoaXMuc2tpcCh0aGlzLnVpbnQzMigpKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICB3aGlsZSAoKHdpcmVUeXBlID0gdGhpcy51aW50MzIoKSAmIDcpICE9PSA0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5za2lwVHlwZSh3aXJlVHlwZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgdGhpcy5za2lwKDQpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IEVycm9yKFwiaW52YWxpZCB3aXJlIHR5cGUgXCIgKyB3aXJlVHlwZSArIFwiIGF0IG9mZnNldCBcIiArIHRoaXMucG9zKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG59O1xuXG5SZWFkZXIuX2NvbmZpZ3VyZSA9IGZ1bmN0aW9uKEJ1ZmZlclJlYWRlcl8pIHtcbiAgICBCdWZmZXJSZWFkZXIgPSBCdWZmZXJSZWFkZXJfO1xuICAgIFJlYWRlci5jcmVhdGUgPSBjcmVhdGUoKTtcbiAgICBCdWZmZXJSZWFkZXIuX2NvbmZpZ3VyZSgpO1xuXG4gICAgdmFyIGZuID0gdXRpbC5Mb25nID8gXCJ0b0xvbmdcIiA6IC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovIFwidG9OdW1iZXJcIjtcbiAgICB1dGlsLm1lcmdlKFJlYWRlci5wcm90b3R5cGUsIHtcblxuICAgICAgICBpbnQ2NDogZnVuY3Rpb24gcmVhZF9pbnQ2NCgpIHtcbiAgICAgICAgICAgIHJldHVybiByZWFkTG9uZ1ZhcmludC5jYWxsKHRoaXMpW2ZuXShmYWxzZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgdWludDY0OiBmdW5jdGlvbiByZWFkX3VpbnQ2NCgpIHtcbiAgICAgICAgICAgIHJldHVybiByZWFkTG9uZ1ZhcmludC5jYWxsKHRoaXMpW2ZuXSh0cnVlKTtcbiAgICAgICAgfSxcblxuICAgICAgICBzaW50NjQ6IGZ1bmN0aW9uIHJlYWRfc2ludDY0KCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlYWRMb25nVmFyaW50LmNhbGwodGhpcykuenpEZWNvZGUoKVtmbl0oZmFsc2UpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGZpeGVkNjQ6IGZ1bmN0aW9uIHJlYWRfZml4ZWQ2NCgpIHtcbiAgICAgICAgICAgIHJldHVybiByZWFkRml4ZWQ2NC5jYWxsKHRoaXMpW2ZuXSh0cnVlKTtcbiAgICAgICAgfSxcblxuICAgICAgICBzZml4ZWQ2NDogZnVuY3Rpb24gcmVhZF9zZml4ZWQ2NCgpIHtcbiAgICAgICAgICAgIHJldHVybiByZWFkRml4ZWQ2NC5jYWxsKHRoaXMpW2ZuXShmYWxzZSk7XG4gICAgICAgIH1cblxuICAgIH0pO1xufTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbm1vZHVsZS5leHBvcnRzID0gQnVmZmVyUmVhZGVyO1xuXG4vLyBleHRlbmRzIFJlYWRlclxudmFyIFJlYWRlciA9IHJlcXVpcmUoXCIuL3JlYWRlclwiKTtcbihCdWZmZXJSZWFkZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShSZWFkZXIucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBCdWZmZXJSZWFkZXI7XG5cbnZhciB1dGlsID0gcmVxdWlyZShcIi4vdXRpbC9taW5pbWFsXCIpO1xuXG4vKipcbiAqIENvbnN0cnVjdHMgYSBuZXcgYnVmZmVyIHJlYWRlciBpbnN0YW5jZS5cbiAqIEBjbGFzc2Rlc2MgV2lyZSBmb3JtYXQgcmVhZGVyIHVzaW5nIG5vZGUgYnVmZmVycy5cbiAqIEBleHRlbmRzIFJlYWRlclxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0J1ZmZlcn0gYnVmZmVyIEJ1ZmZlciB0byByZWFkIGZyb21cbiAqL1xuZnVuY3Rpb24gQnVmZmVyUmVhZGVyKGJ1ZmZlcikge1xuICAgIFJlYWRlci5jYWxsKHRoaXMsIGJ1ZmZlcik7XG5cbiAgICAvKipcbiAgICAgKiBSZWFkIGJ1ZmZlci5cbiAgICAgKiBAbmFtZSBCdWZmZXJSZWFkZXIjYnVmXG4gICAgICogQHR5cGUge0J1ZmZlcn1cbiAgICAgKi9cbn1cblxuQnVmZmVyUmVhZGVyLl9jb25maWd1cmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAodXRpbC5CdWZmZXIpXG4gICAgICAgIEJ1ZmZlclJlYWRlci5wcm90b3R5cGUuX3NsaWNlID0gdXRpbC5CdWZmZXIucHJvdG90eXBlLnNsaWNlO1xufTtcblxuXG4vKipcbiAqIEBvdmVycmlkZVxuICovXG5CdWZmZXJSZWFkZXIucHJvdG90eXBlLnN0cmluZyA9IGZ1bmN0aW9uIHJlYWRfc3RyaW5nX2J1ZmZlcigpIHtcbiAgICB2YXIgbGVuID0gdGhpcy51aW50MzIoKTsgLy8gbW9kaWZpZXMgcG9zXG4gICAgcmV0dXJuIHRoaXMuYnVmLnV0ZjhTbGljZVxuICAgICAgICA/IHRoaXMuYnVmLnV0ZjhTbGljZSh0aGlzLnBvcywgdGhpcy5wb3MgPSBNYXRoLm1pbih0aGlzLnBvcyArIGxlbiwgdGhpcy5sZW4pKVxuICAgICAgICA6IHRoaXMuYnVmLnRvU3RyaW5nKFwidXRmLThcIiwgdGhpcy5wb3MsIHRoaXMucG9zID0gTWF0aC5taW4odGhpcy5wb3MgKyBsZW4sIHRoaXMubGVuKSk7XG59O1xuXG4vKipcbiAqIFJlYWRzIGEgc2VxdWVuY2Ugb2YgYnl0ZXMgcHJlY2VlZGVkIGJ5IGl0cyBsZW5ndGggYXMgYSB2YXJpbnQuXG4gKiBAbmFtZSBCdWZmZXJSZWFkZXIjYnl0ZXNcbiAqIEBmdW5jdGlvblxuICogQHJldHVybnMge0J1ZmZlcn0gVmFsdWUgcmVhZFxuICovXG5cbkJ1ZmZlclJlYWRlci5fY29uZmlndXJlKCk7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5tb2R1bGUuZXhwb3J0cyA9IFNlcnZpY2U7XG5cbnZhciB1dGlsID0gcmVxdWlyZShcIi4uL3V0aWwvbWluaW1hbFwiKTtcblxuLy8gRXh0ZW5kcyBFdmVudEVtaXR0ZXJcbihTZXJ2aWNlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodXRpbC5FdmVudEVtaXR0ZXIucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBTZXJ2aWNlO1xuXG4vKipcbiAqIEEgc2VydmljZSBtZXRob2QgY2FsbGJhY2sgYXMgdXNlZCBieSB7QGxpbmsgcnBjLlNlcnZpY2VNZXRob2R8U2VydmljZU1ldGhvZH0uXG4gKlxuICogRGlmZmVycyBmcm9tIHtAbGluayBSUENJbXBsQ2FsbGJhY2t9IGluIHRoYXQgaXQgaXMgYW4gYWN0dWFsIGNhbGxiYWNrIG9mIGEgc2VydmljZSBtZXRob2Qgd2hpY2ggbWF5IG5vdCByZXR1cm4gYHJlc3BvbnNlID0gbnVsbGAuXG4gKiBAdHlwZWRlZiBycGMuU2VydmljZU1ldGhvZENhbGxiYWNrXG4gKiBAdGVtcGxhdGUgVFJlcyBleHRlbmRzIE1lc3NhZ2U8VFJlcz5cbiAqIEB0eXBlIHtmdW5jdGlvbn1cbiAqIEBwYXJhbSB7RXJyb3J8bnVsbH0gZXJyb3IgRXJyb3IsIGlmIGFueVxuICogQHBhcmFtIHtUUmVzfSBbcmVzcG9uc2VdIFJlc3BvbnNlIG1lc3NhZ2VcbiAqIEByZXR1cm5zIHt1bmRlZmluZWR9XG4gKi9cblxuLyoqXG4gKiBBIHNlcnZpY2UgbWV0aG9kIHBhcnQgb2YgYSB7QGxpbmsgcnBjLlNlcnZpY2V9IGFzIGNyZWF0ZWQgYnkge0BsaW5rIFNlcnZpY2UuY3JlYXRlfS5cbiAqIEB0eXBlZGVmIHJwYy5TZXJ2aWNlTWV0aG9kXG4gKiBAdGVtcGxhdGUgVFJlcSBleHRlbmRzIE1lc3NhZ2U8VFJlcT5cbiAqIEB0ZW1wbGF0ZSBUUmVzIGV4dGVuZHMgTWVzc2FnZTxUUmVzPlxuICogQHR5cGUge2Z1bmN0aW9ufVxuICogQHBhcmFtIHtUUmVxfFByb3BlcnRpZXM8VFJlcT59IHJlcXVlc3QgUmVxdWVzdCBtZXNzYWdlIG9yIHBsYWluIG9iamVjdFxuICogQHBhcmFtIHtycGMuU2VydmljZU1ldGhvZENhbGxiYWNrPFRSZXM+fSBbY2FsbGJhY2tdIE5vZGUtc3R5bGUgY2FsbGJhY2sgY2FsbGVkIHdpdGggdGhlIGVycm9yLCBpZiBhbnksIGFuZCB0aGUgcmVzcG9uc2UgbWVzc2FnZVxuICogQHJldHVybnMge1Byb21pc2U8TWVzc2FnZTxUUmVzPj59IFByb21pc2UgaWYgYGNhbGxiYWNrYCBoYXMgYmVlbiBvbWl0dGVkLCBvdGhlcndpc2UgYHVuZGVmaW5lZGBcbiAqL1xuXG4vKipcbiAqIENvbnN0cnVjdHMgYSBuZXcgUlBDIHNlcnZpY2UgaW5zdGFuY2UuXG4gKiBAY2xhc3NkZXNjIEFuIFJQQyBzZXJ2aWNlIGFzIHJldHVybmVkIGJ5IHtAbGluayBTZXJ2aWNlI2NyZWF0ZX0uXG4gKiBAZXhwb3J0cyBycGMuU2VydmljZVxuICogQGV4dGVuZHMgdXRpbC5FdmVudEVtaXR0ZXJcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtSUENJbXBsfSBycGNJbXBsIFJQQyBpbXBsZW1lbnRhdGlvblxuICogQHBhcmFtIHtib29sZWFufSBbcmVxdWVzdERlbGltaXRlZD1mYWxzZV0gV2hldGhlciByZXF1ZXN0cyBhcmUgbGVuZ3RoLWRlbGltaXRlZFxuICogQHBhcmFtIHtib29sZWFufSBbcmVzcG9uc2VEZWxpbWl0ZWQ9ZmFsc2VdIFdoZXRoZXIgcmVzcG9uc2VzIGFyZSBsZW5ndGgtZGVsaW1pdGVkXG4gKi9cbmZ1bmN0aW9uIFNlcnZpY2UocnBjSW1wbCwgcmVxdWVzdERlbGltaXRlZCwgcmVzcG9uc2VEZWxpbWl0ZWQpIHtcblxuICAgIGlmICh0eXBlb2YgcnBjSW1wbCAhPT0gXCJmdW5jdGlvblwiKVxuICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCJycGNJbXBsIG11c3QgYmUgYSBmdW5jdGlvblwiKTtcblxuICAgIHV0aWwuRXZlbnRFbWl0dGVyLmNhbGwodGhpcyk7XG5cbiAgICAvKipcbiAgICAgKiBSUEMgaW1wbGVtZW50YXRpb24uIEJlY29tZXMgYG51bGxgIG9uY2UgdGhlIHNlcnZpY2UgaXMgZW5kZWQuXG4gICAgICogQHR5cGUge1JQQ0ltcGx8bnVsbH1cbiAgICAgKi9cbiAgICB0aGlzLnJwY0ltcGwgPSBycGNJbXBsO1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciByZXF1ZXN0cyBhcmUgbGVuZ3RoLWRlbGltaXRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICB0aGlzLnJlcXVlc3REZWxpbWl0ZWQgPSBCb29sZWFuKHJlcXVlc3REZWxpbWl0ZWQpO1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciByZXNwb25zZXMgYXJlIGxlbmd0aC1kZWxpbWl0ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICovXG4gICAgdGhpcy5yZXNwb25zZURlbGltaXRlZCA9IEJvb2xlYW4ocmVzcG9uc2VEZWxpbWl0ZWQpO1xufVxuXG4vKipcbiAqIENhbGxzIGEgc2VydmljZSBtZXRob2QgdGhyb3VnaCB7QGxpbmsgcnBjLlNlcnZpY2UjcnBjSW1wbHxycGNJbXBsfS5cbiAqIEBwYXJhbSB7TWV0aG9kfHJwYy5TZXJ2aWNlTWV0aG9kPFRSZXEsVFJlcz59IG1ldGhvZCBSZWZsZWN0ZWQgb3Igc3RhdGljIG1ldGhvZFxuICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxUUmVxPn0gcmVxdWVzdEN0b3IgUmVxdWVzdCBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxUUmVzPn0gcmVzcG9uc2VDdG9yIFJlc3BvbnNlIGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge1RSZXF8UHJvcGVydGllczxUUmVxPn0gcmVxdWVzdCBSZXF1ZXN0IG1lc3NhZ2Ugb3IgcGxhaW4gb2JqZWN0XG4gKiBAcGFyYW0ge3JwYy5TZXJ2aWNlTWV0aG9kQ2FsbGJhY2s8VFJlcz59IGNhbGxiYWNrIFNlcnZpY2UgY2FsbGJhY2tcbiAqIEByZXR1cm5zIHt1bmRlZmluZWR9XG4gKiBAdGVtcGxhdGUgVFJlcSBleHRlbmRzIE1lc3NhZ2U8VFJlcT5cbiAqIEB0ZW1wbGF0ZSBUUmVzIGV4dGVuZHMgTWVzc2FnZTxUUmVzPlxuICovXG5TZXJ2aWNlLnByb3RvdHlwZS5ycGNDYWxsID0gZnVuY3Rpb24gcnBjQ2FsbChtZXRob2QsIHJlcXVlc3RDdG9yLCByZXNwb25zZUN0b3IsIHJlcXVlc3QsIGNhbGxiYWNrKSB7XG5cbiAgICBpZiAoIXJlcXVlc3QpXG4gICAgICAgIHRocm93IFR5cGVFcnJvcihcInJlcXVlc3QgbXVzdCBiZSBzcGVjaWZpZWRcIik7XG5cbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKCFjYWxsYmFjaylcbiAgICAgICAgcmV0dXJuIHV0aWwuYXNQcm9taXNlKHJwY0NhbGwsIHNlbGYsIG1ldGhvZCwgcmVxdWVzdEN0b3IsIHJlc3BvbnNlQ3RvciwgcmVxdWVzdCk7XG5cbiAgICBpZiAoIXNlbGYucnBjSW1wbCkge1xuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyBjYWxsYmFjayhFcnJvcihcImFscmVhZHkgZW5kZWRcIikpOyB9LCAwKTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gc2VsZi5ycGNJbXBsKFxuICAgICAgICAgICAgbWV0aG9kLFxuICAgICAgICAgICAgcmVxdWVzdEN0b3Jbc2VsZi5yZXF1ZXN0RGVsaW1pdGVkID8gXCJlbmNvZGVEZWxpbWl0ZWRcIiA6IFwiZW5jb2RlXCJdKHJlcXVlc3QpLmZpbmlzaCgpLFxuICAgICAgICAgICAgZnVuY3Rpb24gcnBjQ2FsbGJhY2soZXJyLCByZXNwb25zZSkge1xuXG4gICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLmVtaXQoXCJlcnJvclwiLCBlcnIsIG1ldGhvZCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLmVuZCgvKiBlbmRlZEJ5UlBDICovIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICghKHJlc3BvbnNlIGluc3RhbmNlb2YgcmVzcG9uc2VDdG9yKSkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSByZXNwb25zZUN0b3Jbc2VsZi5yZXNwb25zZURlbGltaXRlZCA/IFwiZGVjb2RlRGVsaW1pdGVkXCIgOiBcImRlY29kZVwiXShyZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lbWl0KFwiZXJyb3JcIiwgZXJyLCBtZXRob2QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBzZWxmLmVtaXQoXCJkYXRhXCIsIHJlc3BvbnNlLCBtZXRob2QpO1xuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsLCByZXNwb25zZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHNlbGYuZW1pdChcImVycm9yXCIsIGVyciwgbWV0aG9kKTtcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsgY2FsbGJhY2soZXJyKTsgfSwgMCk7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxufTtcblxuLyoqXG4gKiBFbmRzIHRoaXMgc2VydmljZSBhbmQgZW1pdHMgdGhlIGBlbmRgIGV2ZW50LlxuICogQHBhcmFtIHtib29sZWFufSBbZW5kZWRCeVJQQz1mYWxzZV0gV2hldGhlciB0aGUgc2VydmljZSBoYXMgYmVlbiBlbmRlZCBieSB0aGUgUlBDIGltcGxlbWVudGF0aW9uLlxuICogQHJldHVybnMge3JwYy5TZXJ2aWNlfSBgdGhpc2BcbiAqL1xuU2VydmljZS5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24gZW5kKGVuZGVkQnlSUEMpIHtcbiAgICBpZiAodGhpcy5ycGNJbXBsKSB7XG4gICAgICAgIGlmICghZW5kZWRCeVJQQykgLy8gc2lnbmFsIGVuZCB0byBycGNJbXBsXG4gICAgICAgICAgICB0aGlzLnJwY0ltcGwobnVsbCwgbnVsbCwgbnVsbCk7XG4gICAgICAgIHRoaXMucnBjSW1wbCA9IG51bGw7XG4gICAgICAgIHRoaXMuZW1pdChcImVuZFwiKS5vZmYoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG59O1xuIiwgIlwidXNlIHN0cmljdFwiO1xuXG4vKipcbiAqIFN0cmVhbWluZyBSUEMgaGVscGVycy5cbiAqIEBuYW1lc3BhY2VcbiAqL1xudmFyIHJwYyA9IGV4cG9ydHM7XG5cbi8qKlxuICogUlBDIGltcGxlbWVudGF0aW9uIHBhc3NlZCB0byB7QGxpbmsgU2VydmljZSNjcmVhdGV9IHBlcmZvcm1pbmcgYSBzZXJ2aWNlIHJlcXVlc3Qgb24gbmV0d29yayBsZXZlbCwgaS5lLiBieSB1dGlsaXppbmcgaHR0cCByZXF1ZXN0cyBvciB3ZWJzb2NrZXRzLlxuICogQHR5cGVkZWYgUlBDSW1wbFxuICogQHR5cGUge2Z1bmN0aW9ufVxuICogQHBhcmFtIHtNZXRob2R8cnBjLlNlcnZpY2VNZXRob2Q8TWVzc2FnZTx7fT4sTWVzc2FnZTx7fT4+fSBtZXRob2QgUmVmbGVjdGVkIG9yIHN0YXRpYyBtZXRob2QgYmVpbmcgY2FsbGVkXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IHJlcXVlc3REYXRhIFJlcXVlc3QgZGF0YVxuICogQHBhcmFtIHtSUENJbXBsQ2FsbGJhY2t9IGNhbGxiYWNrIENhbGxiYWNrIGZ1bmN0aW9uXG4gKiBAcmV0dXJucyB7dW5kZWZpbmVkfVxuICogQGV4YW1wbGVcbiAqIGZ1bmN0aW9uIHJwY0ltcGwobWV0aG9kLCByZXF1ZXN0RGF0YSwgY2FsbGJhY2spIHtcbiAqICAgICBpZiAocHJvdG9idWYudXRpbC5sY0ZpcnN0KG1ldGhvZC5uYW1lKSAhPT0gXCJteU1ldGhvZFwiKSAvLyBjb21wYXRpYmxlIHdpdGggc3RhdGljIGNvZGVcbiAqICAgICAgICAgdGhyb3cgRXJyb3IoXCJubyBzdWNoIG1ldGhvZFwiKTtcbiAqICAgICBhc3luY2hyb25vdXNseU9idGFpbkFSZXNwb25zZShyZXF1ZXN0RGF0YSwgZnVuY3Rpb24oZXJyLCByZXNwb25zZURhdGEpIHtcbiAqICAgICAgICAgY2FsbGJhY2soZXJyLCByZXNwb25zZURhdGEpO1xuICogICAgIH0pO1xuICogfVxuICovXG5cbi8qKlxuICogTm9kZS1zdHlsZSBjYWxsYmFjayBhcyB1c2VkIGJ5IHtAbGluayBSUENJbXBsfS5cbiAqIEB0eXBlZGVmIFJQQ0ltcGxDYWxsYmFja1xuICogQHR5cGUge2Z1bmN0aW9ufVxuICogQHBhcmFtIHtFcnJvcnxudWxsfSBlcnJvciBFcnJvciwgaWYgYW55LCBvdGhlcndpc2UgYG51bGxgXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl8bnVsbH0gW3Jlc3BvbnNlXSBSZXNwb25zZSBkYXRhIG9yIGBudWxsYCB0byBzaWduYWwgZW5kIG9mIHN0cmVhbSwgaWYgdGhlcmUgaGFzbid0IGJlZW4gYW4gZXJyb3JcbiAqIEByZXR1cm5zIHt1bmRlZmluZWR9XG4gKi9cblxucnBjLlNlcnZpY2UgPSByZXF1aXJlKFwiLi9ycGMvc2VydmljZVwiKTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbm1vZHVsZS5leHBvcnRzID0ge307XG5cbi8qKlxuICogTmFtZWQgcm9vdHMuXG4gKiBUaGlzIGlzIHdoZXJlIHBianMgc3RvcmVzIGdlbmVyYXRlZCBzdHJ1Y3R1cmVzICh0aGUgb3B0aW9uIGAtciwgLS1yb290YCBzcGVjaWZpZXMgYSBuYW1lKS5cbiAqIENhbiBhbHNvIGJlIHVzZWQgbWFudWFsbHkgdG8gbWFrZSByb290cyBhdmFpbGFibGUgYWNyb3NzIG1vZHVsZXMuXG4gKiBAbmFtZSByb290c1xuICogQHR5cGUge09iamVjdC48c3RyaW5nLFJvb3Q+fVxuICogQGV4YW1wbGVcbiAqIC8vIHBianMgLXIgbXlyb290IC1vIGNvbXBpbGVkLmpzIC4uLlxuICpcbiAqIC8vIGluIGFub3RoZXIgbW9kdWxlOlxuICogcmVxdWlyZShcIi4vY29tcGlsZWQuanNcIik7XG4gKlxuICogLy8gaW4gYW55IHN1YnNlcXVlbnQgbW9kdWxlOlxuICogdmFyIHJvb3QgPSBwcm90b2J1Zi5yb290c1tcIm15cm9vdFwiXTtcbiAqL1xuIiwgIlwidXNlIHN0cmljdFwiO1xudmFyIHByb3RvYnVmID0gZXhwb3J0cztcblxuLyoqXG4gKiBCdWlsZCB0eXBlLCBvbmUgb2YgYFwiZnVsbFwiYCwgYFwibGlnaHRcImAgb3IgYFwibWluaW1hbFwiYC5cbiAqIEBuYW1lIGJ1aWxkXG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQGNvbnN0XG4gKi9cbnByb3RvYnVmLmJ1aWxkID0gXCJtaW5pbWFsXCI7XG5cbi8vIFNlcmlhbGl6YXRpb25cbnByb3RvYnVmLldyaXRlciAgICAgICA9IHJlcXVpcmUoXCIuL3dyaXRlclwiKTtcbnByb3RvYnVmLkJ1ZmZlcldyaXRlciA9IHJlcXVpcmUoXCIuL3dyaXRlcl9idWZmZXJcIik7XG5wcm90b2J1Zi5SZWFkZXIgICAgICAgPSByZXF1aXJlKFwiLi9yZWFkZXJcIik7XG5wcm90b2J1Zi5CdWZmZXJSZWFkZXIgPSByZXF1aXJlKFwiLi9yZWFkZXJfYnVmZmVyXCIpO1xuXG4vLyBVdGlsaXR5XG5wcm90b2J1Zi51dGlsICAgICAgICAgPSByZXF1aXJlKFwiLi91dGlsL21pbmltYWxcIik7XG5wcm90b2J1Zi5ycGMgICAgICAgICAgPSByZXF1aXJlKFwiLi9ycGNcIik7XG5wcm90b2J1Zi5yb290cyAgICAgICAgPSByZXF1aXJlKFwiLi9yb290c1wiKTtcbnByb3RvYnVmLmNvbmZpZ3VyZSAgICA9IGNvbmZpZ3VyZTtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbi8qKlxuICogUmVjb25maWd1cmVzIHRoZSBsaWJyYXJ5IGFjY29yZGluZyB0byB0aGUgZW52aXJvbm1lbnQuXG4gKiBAcmV0dXJucyB7dW5kZWZpbmVkfVxuICovXG5mdW5jdGlvbiBjb25maWd1cmUoKSB7XG4gICAgcHJvdG9idWYudXRpbC5fY29uZmlndXJlKCk7XG4gICAgcHJvdG9idWYuV3JpdGVyLl9jb25maWd1cmUocHJvdG9idWYuQnVmZmVyV3JpdGVyKTtcbiAgICBwcm90b2J1Zi5SZWFkZXIuX2NvbmZpZ3VyZShwcm90b2J1Zi5CdWZmZXJSZWFkZXIpO1xufVxuXG4vLyBTZXQgdXAgYnVmZmVyIHV0aWxpdHkgYWNjb3JkaW5nIHRvIHRoZSBlbnZpcm9ubWVudFxuY29uZmlndXJlKCk7XG4iLCAiLy8gbWluaW1hbCBsaWJyYXJ5IGVudHJ5IHBvaW50LlxuXG5cInVzZSBzdHJpY3RcIjtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIi4vc3JjL2luZGV4LW1pbmltYWxcIik7XG4iLCAiLyoqXG4gKiBAbGljZW5zZSBSZWFjdFxuICogcmVhY3QuZGV2ZWxvcG1lbnQuanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgKGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgJ3VzZSBzdHJpY3QnO1xuXG4vKiBnbG9iYWwgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICovXG5pZiAoXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gIT09ICd1bmRlZmluZWQnICYmXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0YXJ0ID09PVxuICAgICdmdW5jdGlvbidcbikge1xuICBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0YXJ0KG5ldyBFcnJvcigpKTtcbn1cbiAgICAgICAgICB2YXIgUmVhY3RWZXJzaW9uID0gJzE4LjIuMCc7XG5cbi8vIEFUVEVOVElPTlxuLy8gV2hlbiBhZGRpbmcgbmV3IHN5bWJvbHMgdG8gdGhpcyBmaWxlLFxuLy8gUGxlYXNlIGNvbnNpZGVyIGFsc28gYWRkaW5nIHRvICdyZWFjdC1kZXZ0b29scy1zaGFyZWQvc3JjL2JhY2tlbmQvUmVhY3RTeW1ib2xzJ1xuLy8gVGhlIFN5bWJvbCB1c2VkIHRvIHRhZyB0aGUgUmVhY3RFbGVtZW50LWxpa2UgdHlwZXMuXG52YXIgUkVBQ1RfRUxFTUVOVF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuZWxlbWVudCcpO1xudmFyIFJFQUNUX1BPUlRBTF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QucG9ydGFsJyk7XG52YXIgUkVBQ1RfRlJBR01FTlRfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmZyYWdtZW50Jyk7XG52YXIgUkVBQ1RfU1RSSUNUX01PREVfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnN0cmljdF9tb2RlJyk7XG52YXIgUkVBQ1RfUFJPRklMRVJfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnByb2ZpbGVyJyk7XG52YXIgUkVBQ1RfUFJPVklERVJfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnByb3ZpZGVyJyk7XG52YXIgUkVBQ1RfQ09OVEVYVF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuY29udGV4dCcpO1xudmFyIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5mb3J3YXJkX3JlZicpO1xudmFyIFJFQUNUX1NVU1BFTlNFX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5zdXNwZW5zZScpO1xudmFyIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnN1c3BlbnNlX2xpc3QnKTtcbnZhciBSRUFDVF9NRU1PX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5tZW1vJyk7XG52YXIgUkVBQ1RfTEFaWV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QubGF6eScpO1xudmFyIFJFQUNUX09GRlNDUkVFTl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Qub2Zmc2NyZWVuJyk7XG52YXIgTUFZQkVfSVRFUkFUT1JfU1lNQk9MID0gU3ltYm9sLml0ZXJhdG9yO1xudmFyIEZBVVhfSVRFUkFUT1JfU1lNQk9MID0gJ0BAaXRlcmF0b3InO1xuZnVuY3Rpb24gZ2V0SXRlcmF0b3JGbihtYXliZUl0ZXJhYmxlKSB7XG4gIGlmIChtYXliZUl0ZXJhYmxlID09PSBudWxsIHx8IHR5cGVvZiBtYXliZUl0ZXJhYmxlICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIG1heWJlSXRlcmF0b3IgPSBNQVlCRV9JVEVSQVRPUl9TWU1CT0wgJiYgbWF5YmVJdGVyYWJsZVtNQVlCRV9JVEVSQVRPUl9TWU1CT0xdIHx8IG1heWJlSXRlcmFibGVbRkFVWF9JVEVSQVRPUl9TWU1CT0xdO1xuXG4gIGlmICh0eXBlb2YgbWF5YmVJdGVyYXRvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBtYXliZUl0ZXJhdG9yO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogS2VlcHMgdHJhY2sgb2YgdGhlIGN1cnJlbnQgZGlzcGF0Y2hlci5cbiAqL1xudmFyIFJlYWN0Q3VycmVudERpc3BhdGNoZXIgPSB7XG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICogQHR5cGUge1JlYWN0Q29tcG9uZW50fVxuICAgKi9cbiAgY3VycmVudDogbnVsbFxufTtcblxuLyoqXG4gKiBLZWVwcyB0cmFjayBvZiB0aGUgY3VycmVudCBiYXRjaCdzIGNvbmZpZ3VyYXRpb24gc3VjaCBhcyBob3cgbG9uZyBhbiB1cGRhdGVcbiAqIHNob3VsZCBzdXNwZW5kIGZvciBpZiBpdCBuZWVkcyB0by5cbiAqL1xudmFyIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnID0ge1xuICB0cmFuc2l0aW9uOiBudWxsXG59O1xuXG52YXIgUmVhY3RDdXJyZW50QWN0UXVldWUgPSB7XG4gIGN1cnJlbnQ6IG51bGwsXG4gIC8vIFVzZWQgdG8gcmVwcm9kdWNlIGJlaGF2aW9yIG9mIGBiYXRjaGVkVXBkYXRlc2AgaW4gbGVnYWN5IG1vZGUuXG4gIGlzQmF0Y2hpbmdMZWdhY3k6IGZhbHNlLFxuICBkaWRTY2hlZHVsZUxlZ2FjeVVwZGF0ZTogZmFsc2Vcbn07XG5cbi8qKlxuICogS2VlcHMgdHJhY2sgb2YgdGhlIGN1cnJlbnQgb3duZXIuXG4gKlxuICogVGhlIGN1cnJlbnQgb3duZXIgaXMgdGhlIGNvbXBvbmVudCB3aG8gc2hvdWxkIG93biBhbnkgY29tcG9uZW50cyB0aGF0IGFyZVxuICogY3VycmVudGx5IGJlaW5nIGNvbnN0cnVjdGVkLlxuICovXG52YXIgUmVhY3RDdXJyZW50T3duZXIgPSB7XG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICogQHR5cGUge1JlYWN0Q29tcG9uZW50fVxuICAgKi9cbiAgY3VycmVudDogbnVsbFxufTtcblxudmFyIFJlYWN0RGVidWdDdXJyZW50RnJhbWUgPSB7fTtcbnZhciBjdXJyZW50RXh0cmFTdGFja0ZyYW1lID0gbnVsbDtcbmZ1bmN0aW9uIHNldEV4dHJhU3RhY2tGcmFtZShzdGFjaykge1xuICB7XG4gICAgY3VycmVudEV4dHJhU3RhY2tGcmFtZSA9IHN0YWNrO1xuICB9XG59XG5cbntcbiAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5zZXRFeHRyYVN0YWNrRnJhbWUgPSBmdW5jdGlvbiAoc3RhY2spIHtcbiAgICB7XG4gICAgICBjdXJyZW50RXh0cmFTdGFja0ZyYW1lID0gc3RhY2s7XG4gICAgfVxuICB9OyAvLyBTdGFjayBpbXBsZW1lbnRhdGlvbiBpbmplY3RlZCBieSB0aGUgY3VycmVudCByZW5kZXJlci5cblxuXG4gIFJlYWN0RGVidWdDdXJyZW50RnJhbWUuZ2V0Q3VycmVudFN0YWNrID0gbnVsbDtcblxuICBSZWFjdERlYnVnQ3VycmVudEZyYW1lLmdldFN0YWNrQWRkZW5kdW0gPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHN0YWNrID0gJyc7IC8vIEFkZCBhbiBleHRyYSB0b3AgZnJhbWUgd2hpbGUgYW4gZWxlbWVudCBpcyBiZWluZyB2YWxpZGF0ZWRcblxuICAgIGlmIChjdXJyZW50RXh0cmFTdGFja0ZyYW1lKSB7XG4gICAgICBzdGFjayArPSBjdXJyZW50RXh0cmFTdGFja0ZyYW1lO1xuICAgIH0gLy8gRGVsZWdhdGUgdG8gdGhlIGluamVjdGVkIHJlbmRlcmVyLXNwZWNpZmljIGltcGxlbWVudGF0aW9uXG5cblxuICAgIHZhciBpbXBsID0gUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5nZXRDdXJyZW50U3RhY2s7XG5cbiAgICBpZiAoaW1wbCkge1xuICAgICAgc3RhY2sgKz0gaW1wbCgpIHx8ICcnO1xuICAgIH1cblxuICAgIHJldHVybiBzdGFjaztcbiAgfTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxudmFyIGVuYWJsZVNjb3BlQVBJID0gZmFsc2U7IC8vIEV4cGVyaW1lbnRhbCBDcmVhdGUgRXZlbnQgSGFuZGxlIEFQSS5cbnZhciBlbmFibGVDYWNoZUVsZW1lbnQgPSBmYWxzZTtcbnZhciBlbmFibGVUcmFuc2l0aW9uVHJhY2luZyA9IGZhbHNlOyAvLyBObyBrbm93biBidWdzLCBidXQgbmVlZHMgcGVyZm9ybWFuY2UgdGVzdGluZ1xuXG52YXIgZW5hYmxlTGVnYWN5SGlkZGVuID0gZmFsc2U7IC8vIEVuYWJsZXMgdW5zdGFibGVfYXZvaWRUaGlzRmFsbGJhY2sgZmVhdHVyZSBpbiBGaWJlclxuLy8gc3R1ZmYuIEludGVuZGVkIHRvIGVuYWJsZSBSZWFjdCBjb3JlIG1lbWJlcnMgdG8gbW9yZSBlYXNpbHkgZGVidWcgc2NoZWR1bGluZ1xuLy8gaXNzdWVzIGluIERFViBidWlsZHMuXG5cbnZhciBlbmFibGVEZWJ1Z1RyYWNpbmcgPSBmYWxzZTsgLy8gVHJhY2sgd2hpY2ggRmliZXIocykgc2NoZWR1bGUgcmVuZGVyIHdvcmsuXG5cbnZhciBSZWFjdFNoYXJlZEludGVybmFscyA9IHtcbiAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlcjogUmVhY3RDdXJyZW50RGlzcGF0Y2hlcixcbiAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWc6IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLFxuICBSZWFjdEN1cnJlbnRPd25lcjogUmVhY3RDdXJyZW50T3duZXJcbn07XG5cbntcbiAgUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSA9IFJlYWN0RGVidWdDdXJyZW50RnJhbWU7XG4gIFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudEFjdFF1ZXVlID0gUmVhY3RDdXJyZW50QWN0UXVldWU7XG59XG5cbi8vIGJ5IGNhbGxzIHRvIHRoZXNlIG1ldGhvZHMgYnkgYSBCYWJlbCBwbHVnaW4uXG4vL1xuLy8gSW4gUFJPRCAob3IgaW4gcGFja2FnZXMgd2l0aG91dCBhY2Nlc3MgdG8gUmVhY3QgaW50ZXJuYWxzKSxcbi8vIHRoZXkgYXJlIGxlZnQgYXMgdGhleSBhcmUgaW5zdGVhZC5cblxuZnVuY3Rpb24gd2Fybihmb3JtYXQpIHtcbiAge1xuICAgIHtcbiAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICB9XG5cbiAgICAgIHByaW50V2FybmluZygnd2FybicsIGZvcm1hdCwgYXJncyk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBlcnJvcihmb3JtYXQpIHtcbiAge1xuICAgIHtcbiAgICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuMiA+IDEgPyBfbGVuMiAtIDEgOiAwKSwgX2tleTIgPSAxOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICAgIGFyZ3NbX2tleTIgLSAxXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgICB9XG5cbiAgICAgIHByaW50V2FybmluZygnZXJyb3InLCBmb3JtYXQsIGFyZ3MpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBwcmludFdhcm5pbmcobGV2ZWwsIGZvcm1hdCwgYXJncykge1xuICAvLyBXaGVuIGNoYW5naW5nIHRoaXMgbG9naWMsIHlvdSBtaWdodCB3YW50IHRvIGFsc29cbiAgLy8gdXBkYXRlIGNvbnNvbGVXaXRoU3RhY2tEZXYud3d3LmpzIGFzIHdlbGwuXG4gIHtcbiAgICB2YXIgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0RGVidWdDdXJyZW50RnJhbWU7XG4gICAgdmFyIHN0YWNrID0gUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5nZXRTdGFja0FkZGVuZHVtKCk7XG5cbiAgICBpZiAoc3RhY2sgIT09ICcnKSB7XG4gICAgICBmb3JtYXQgKz0gJyVzJztcbiAgICAgIGFyZ3MgPSBhcmdzLmNvbmNhdChbc3RhY2tdKTtcbiAgICB9IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvblxuXG5cbiAgICB2YXIgYXJnc1dpdGhGb3JtYXQgPSBhcmdzLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgcmV0dXJuIFN0cmluZyhpdGVtKTtcbiAgICB9KTsgLy8gQ2FyZWZ1bDogUk4gY3VycmVudGx5IGRlcGVuZHMgb24gdGhpcyBwcmVmaXhcblxuICAgIGFyZ3NXaXRoRm9ybWF0LnVuc2hpZnQoJ1dhcm5pbmc6ICcgKyBmb3JtYXQpOyAvLyBXZSBpbnRlbnRpb25hbGx5IGRvbid0IHVzZSBzcHJlYWQgKG9yIC5hcHBseSkgZGlyZWN0bHkgYmVjYXVzZSBpdFxuICAgIC8vIGJyZWFrcyBJRTk6IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTM2MTBcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nXG5cbiAgICBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuY2FsbChjb25zb2xlW2xldmVsXSwgY29uc29sZSwgYXJnc1dpdGhGb3JtYXQpO1xuICB9XG59XG5cbnZhciBkaWRXYXJuU3RhdGVVcGRhdGVGb3JVbm1vdW50ZWRDb21wb25lbnQgPSB7fTtcblxuZnVuY3Rpb24gd2Fybk5vb3AocHVibGljSW5zdGFuY2UsIGNhbGxlck5hbWUpIHtcbiAge1xuICAgIHZhciBfY29uc3RydWN0b3IgPSBwdWJsaWNJbnN0YW5jZS5jb25zdHJ1Y3RvcjtcbiAgICB2YXIgY29tcG9uZW50TmFtZSA9IF9jb25zdHJ1Y3RvciAmJiAoX2NvbnN0cnVjdG9yLmRpc3BsYXlOYW1lIHx8IF9jb25zdHJ1Y3Rvci5uYW1lKSB8fCAnUmVhY3RDbGFzcyc7XG4gICAgdmFyIHdhcm5pbmdLZXkgPSBjb21wb25lbnROYW1lICsgXCIuXCIgKyBjYWxsZXJOYW1lO1xuXG4gICAgaWYgKGRpZFdhcm5TdGF0ZVVwZGF0ZUZvclVubW91bnRlZENvbXBvbmVudFt3YXJuaW5nS2V5XSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGVycm9yKFwiQ2FuJ3QgY2FsbCAlcyBvbiBhIGNvbXBvbmVudCB0aGF0IGlzIG5vdCB5ZXQgbW91bnRlZC4gXCIgKyAnVGhpcyBpcyBhIG5vLW9wLCBidXQgaXQgbWlnaHQgaW5kaWNhdGUgYSBidWcgaW4geW91ciBhcHBsaWNhdGlvbi4gJyArICdJbnN0ZWFkLCBhc3NpZ24gdG8gYHRoaXMuc3RhdGVgIGRpcmVjdGx5IG9yIGRlZmluZSBhIGBzdGF0ZSA9IHt9O2AgJyArICdjbGFzcyBwcm9wZXJ0eSB3aXRoIHRoZSBkZXNpcmVkIHN0YXRlIGluIHRoZSAlcyBjb21wb25lbnQuJywgY2FsbGVyTmFtZSwgY29tcG9uZW50TmFtZSk7XG5cbiAgICBkaWRXYXJuU3RhdGVVcGRhdGVGb3JVbm1vdW50ZWRDb21wb25lbnRbd2FybmluZ0tleV0gPSB0cnVlO1xuICB9XG59XG4vKipcbiAqIFRoaXMgaXMgdGhlIGFic3RyYWN0IEFQSSBmb3IgYW4gdXBkYXRlIHF1ZXVlLlxuICovXG5cblxudmFyIFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlID0ge1xuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoaXMgY29tcG9zaXRlIGNvbXBvbmVudCBpcyBtb3VudGVkLlxuICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRoZSBpbnN0YW5jZSB3ZSB3YW50IHRvIHRlc3QuXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgbW91bnRlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKiBAcHJvdGVjdGVkXG4gICAqIEBmaW5hbFxuICAgKi9cbiAgaXNNb3VudGVkOiBmdW5jdGlvbiAocHVibGljSW5zdGFuY2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEZvcmNlcyBhbiB1cGRhdGUuIFRoaXMgc2hvdWxkIG9ubHkgYmUgaW52b2tlZCB3aGVuIGl0IGlzIGtub3duIHdpdGhcbiAgICogY2VydGFpbnR5IHRoYXQgd2UgYXJlICoqbm90KiogaW4gYSBET00gdHJhbnNhY3Rpb24uXG4gICAqXG4gICAqIFlvdSBtYXkgd2FudCB0byBjYWxsIHRoaXMgd2hlbiB5b3Uga25vdyB0aGF0IHNvbWUgZGVlcGVyIGFzcGVjdCBvZiB0aGVcbiAgICogY29tcG9uZW50J3Mgc3RhdGUgaGFzIGNoYW5nZWQgYnV0IGBzZXRTdGF0ZWAgd2FzIG5vdCBjYWxsZWQuXG4gICAqXG4gICAqIFRoaXMgd2lsbCBub3QgaW52b2tlIGBzaG91bGRDb21wb25lbnRVcGRhdGVgLCBidXQgaXQgd2lsbCBpbnZva2VcbiAgICogYGNvbXBvbmVudFdpbGxVcGRhdGVgIGFuZCBgY29tcG9uZW50RGlkVXBkYXRlYC5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2UgdGhhdCBzaG91bGQgcmVyZW5kZXIuXG4gICAqIEBwYXJhbSB7P2Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsZWQgYWZ0ZXIgY29tcG9uZW50IGlzIHVwZGF0ZWQuXG4gICAqIEBwYXJhbSB7P3N0cmluZ30gY2FsbGVyTmFtZSBuYW1lIG9mIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIGluIHRoZSBwdWJsaWMgQVBJLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGVucXVldWVGb3JjZVVwZGF0ZTogZnVuY3Rpb24gKHB1YmxpY0luc3RhbmNlLCBjYWxsYmFjaywgY2FsbGVyTmFtZSkge1xuICAgIHdhcm5Ob29wKHB1YmxpY0luc3RhbmNlLCAnZm9yY2VVcGRhdGUnKTtcbiAgfSxcblxuICAvKipcbiAgICogUmVwbGFjZXMgYWxsIG9mIHRoZSBzdGF0ZS4gQWx3YXlzIHVzZSB0aGlzIG9yIGBzZXRTdGF0ZWAgdG8gbXV0YXRlIHN0YXRlLlxuICAgKiBZb3Ugc2hvdWxkIHRyZWF0IGB0aGlzLnN0YXRlYCBhcyBpbW11dGFibGUuXG4gICAqXG4gICAqIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IGB0aGlzLnN0YXRlYCB3aWxsIGJlIGltbWVkaWF0ZWx5IHVwZGF0ZWQsIHNvXG4gICAqIGFjY2Vzc2luZyBgdGhpcy5zdGF0ZWAgYWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZCBtYXkgcmV0dXJuIHRoZSBvbGQgdmFsdWUuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHRoYXQgc2hvdWxkIHJlcmVuZGVyLlxuICAgKiBAcGFyYW0ge29iamVjdH0gY29tcGxldGVTdGF0ZSBOZXh0IHN0YXRlLlxuICAgKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIGFmdGVyIGNvbXBvbmVudCBpcyB1cGRhdGVkLlxuICAgKiBAcGFyYW0gez9zdHJpbmd9IGNhbGxlck5hbWUgbmFtZSBvZiB0aGUgY2FsbGluZyBmdW5jdGlvbiBpbiB0aGUgcHVibGljIEFQSS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBlbnF1ZXVlUmVwbGFjZVN0YXRlOiBmdW5jdGlvbiAocHVibGljSW5zdGFuY2UsIGNvbXBsZXRlU3RhdGUsIGNhbGxiYWNrLCBjYWxsZXJOYW1lKSB7XG4gICAgd2Fybk5vb3AocHVibGljSW5zdGFuY2UsICdyZXBsYWNlU3RhdGUnKTtcbiAgfSxcblxuICAvKipcbiAgICogU2V0cyBhIHN1YnNldCBvZiB0aGUgc3RhdGUuIFRoaXMgb25seSBleGlzdHMgYmVjYXVzZSBfcGVuZGluZ1N0YXRlIGlzXG4gICAqIGludGVybmFsLiBUaGlzIHByb3ZpZGVzIGEgbWVyZ2luZyBzdHJhdGVneSB0aGF0IGlzIG5vdCBhdmFpbGFibGUgdG8gZGVlcFxuICAgKiBwcm9wZXJ0aWVzIHdoaWNoIGlzIGNvbmZ1c2luZy4gVE9ETzogRXhwb3NlIHBlbmRpbmdTdGF0ZSBvciBkb24ndCB1c2UgaXRcbiAgICogZHVyaW5nIHRoZSBtZXJnZS5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2UgdGhhdCBzaG91bGQgcmVyZW5kZXIuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBwYXJ0aWFsU3RhdGUgTmV4dCBwYXJ0aWFsIHN0YXRlIHRvIGJlIG1lcmdlZCB3aXRoIHN0YXRlLlxuICAgKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIGFmdGVyIGNvbXBvbmVudCBpcyB1cGRhdGVkLlxuICAgKiBAcGFyYW0gez9zdHJpbmd9IE5hbWUgb2YgdGhlIGNhbGxpbmcgZnVuY3Rpb24gaW4gdGhlIHB1YmxpYyBBUEkuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZW5xdWV1ZVNldFN0YXRlOiBmdW5jdGlvbiAocHVibGljSW5zdGFuY2UsIHBhcnRpYWxTdGF0ZSwgY2FsbGJhY2ssIGNhbGxlck5hbWUpIHtcbiAgICB3YXJuTm9vcChwdWJsaWNJbnN0YW5jZSwgJ3NldFN0YXRlJyk7XG4gIH1cbn07XG5cbnZhciBhc3NpZ24gPSBPYmplY3QuYXNzaWduO1xuXG52YXIgZW1wdHlPYmplY3QgPSB7fTtcblxue1xuICBPYmplY3QuZnJlZXplKGVtcHR5T2JqZWN0KTtcbn1cbi8qKlxuICogQmFzZSBjbGFzcyBoZWxwZXJzIGZvciB0aGUgdXBkYXRpbmcgc3RhdGUgb2YgYSBjb21wb25lbnQuXG4gKi9cblxuXG5mdW5jdGlvbiBDb21wb25lbnQocHJvcHMsIGNvbnRleHQsIHVwZGF0ZXIpIHtcbiAgdGhpcy5wcm9wcyA9IHByb3BzO1xuICB0aGlzLmNvbnRleHQgPSBjb250ZXh0OyAvLyBJZiBhIGNvbXBvbmVudCBoYXMgc3RyaW5nIHJlZnMsIHdlIHdpbGwgYXNzaWduIGEgZGlmZmVyZW50IG9iamVjdCBsYXRlci5cblxuICB0aGlzLnJlZnMgPSBlbXB0eU9iamVjdDsgLy8gV2UgaW5pdGlhbGl6ZSB0aGUgZGVmYXVsdCB1cGRhdGVyIGJ1dCB0aGUgcmVhbCBvbmUgZ2V0cyBpbmplY3RlZCBieSB0aGVcbiAgLy8gcmVuZGVyZXIuXG5cbiAgdGhpcy51cGRhdGVyID0gdXBkYXRlciB8fCBSZWFjdE5vb3BVcGRhdGVRdWV1ZTtcbn1cblxuQ29tcG9uZW50LnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50ID0ge307XG4vKipcbiAqIFNldHMgYSBzdWJzZXQgb2YgdGhlIHN0YXRlLiBBbHdheXMgdXNlIHRoaXMgdG8gbXV0YXRlXG4gKiBzdGF0ZS4gWW91IHNob3VsZCB0cmVhdCBgdGhpcy5zdGF0ZWAgYXMgaW1tdXRhYmxlLlxuICpcbiAqIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IGB0aGlzLnN0YXRlYCB3aWxsIGJlIGltbWVkaWF0ZWx5IHVwZGF0ZWQsIHNvXG4gKiBhY2Nlc3NpbmcgYHRoaXMuc3RhdGVgIGFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QgbWF5IHJldHVybiB0aGUgb2xkIHZhbHVlLlxuICpcbiAqIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IGNhbGxzIHRvIGBzZXRTdGF0ZWAgd2lsbCBydW4gc3luY2hyb25vdXNseSxcbiAqIGFzIHRoZXkgbWF5IGV2ZW50dWFsbHkgYmUgYmF0Y2hlZCB0b2dldGhlci4gIFlvdSBjYW4gcHJvdmlkZSBhbiBvcHRpb25hbFxuICogY2FsbGJhY2sgdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIHdoZW4gdGhlIGNhbGwgdG8gc2V0U3RhdGUgaXMgYWN0dWFsbHlcbiAqIGNvbXBsZXRlZC5cbiAqXG4gKiBXaGVuIGEgZnVuY3Rpb24gaXMgcHJvdmlkZWQgdG8gc2V0U3RhdGUsIGl0IHdpbGwgYmUgY2FsbGVkIGF0IHNvbWUgcG9pbnQgaW5cbiAqIHRoZSBmdXR1cmUgKG5vdCBzeW5jaHJvbm91c2x5KS4gSXQgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgdXAgdG8gZGF0ZVxuICogY29tcG9uZW50IGFyZ3VtZW50cyAoc3RhdGUsIHByb3BzLCBjb250ZXh0KS4gVGhlc2UgdmFsdWVzIGNhbiBiZSBkaWZmZXJlbnRcbiAqIGZyb20gdGhpcy4qIGJlY2F1c2UgeW91ciBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIGFmdGVyIHJlY2VpdmVQcm9wcyBidXQgYmVmb3JlXG4gKiBzaG91bGRDb21wb25lbnRVcGRhdGUsIGFuZCB0aGlzIG5ldyBzdGF0ZSwgcHJvcHMsIGFuZCBjb250ZXh0IHdpbGwgbm90IHlldCBiZVxuICogYXNzaWduZWQgdG8gdGhpcy5cbiAqXG4gKiBAcGFyYW0ge29iamVjdHxmdW5jdGlvbn0gcGFydGlhbFN0YXRlIE5leHQgcGFydGlhbCBzdGF0ZSBvciBmdW5jdGlvbiB0b1xuICogICAgICAgIHByb2R1Y2UgbmV4dCBwYXJ0aWFsIHN0YXRlIHRvIGJlIG1lcmdlZCB3aXRoIGN1cnJlbnQgc3RhdGUuXG4gKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIGFmdGVyIHN0YXRlIGlzIHVwZGF0ZWQuXG4gKiBAZmluYWxcbiAqIEBwcm90ZWN0ZWRcbiAqL1xuXG5Db21wb25lbnQucHJvdG90eXBlLnNldFN0YXRlID0gZnVuY3Rpb24gKHBhcnRpYWxTdGF0ZSwgY2FsbGJhY2spIHtcbiAgaWYgKHR5cGVvZiBwYXJ0aWFsU3RhdGUgIT09ICdvYmplY3QnICYmIHR5cGVvZiBwYXJ0aWFsU3RhdGUgIT09ICdmdW5jdGlvbicgJiYgcGFydGlhbFN0YXRlICE9IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFN0YXRlKC4uLik6IHRha2VzIGFuIG9iamVjdCBvZiBzdGF0ZSB2YXJpYWJsZXMgdG8gdXBkYXRlIG9yIGEgJyArICdmdW5jdGlvbiB3aGljaCByZXR1cm5zIGFuIG9iamVjdCBvZiBzdGF0ZSB2YXJpYWJsZXMuJyk7XG4gIH1cblxuICB0aGlzLnVwZGF0ZXIuZW5xdWV1ZVNldFN0YXRlKHRoaXMsIHBhcnRpYWxTdGF0ZSwgY2FsbGJhY2ssICdzZXRTdGF0ZScpO1xufTtcbi8qKlxuICogRm9yY2VzIGFuIHVwZGF0ZS4gVGhpcyBzaG91bGQgb25seSBiZSBpbnZva2VkIHdoZW4gaXQgaXMga25vd24gd2l0aFxuICogY2VydGFpbnR5IHRoYXQgd2UgYXJlICoqbm90KiogaW4gYSBET00gdHJhbnNhY3Rpb24uXG4gKlxuICogWW91IG1heSB3YW50IHRvIGNhbGwgdGhpcyB3aGVuIHlvdSBrbm93IHRoYXQgc29tZSBkZWVwZXIgYXNwZWN0IG9mIHRoZVxuICogY29tcG9uZW50J3Mgc3RhdGUgaGFzIGNoYW5nZWQgYnV0IGBzZXRTdGF0ZWAgd2FzIG5vdCBjYWxsZWQuXG4gKlxuICogVGhpcyB3aWxsIG5vdCBpbnZva2UgYHNob3VsZENvbXBvbmVudFVwZGF0ZWAsIGJ1dCBpdCB3aWxsIGludm9rZVxuICogYGNvbXBvbmVudFdpbGxVcGRhdGVgIGFuZCBgY29tcG9uZW50RGlkVXBkYXRlYC5cbiAqXG4gKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIGFmdGVyIHVwZGF0ZSBpcyBjb21wbGV0ZS5cbiAqIEBmaW5hbFxuICogQHByb3RlY3RlZFxuICovXG5cblxuQ29tcG9uZW50LnByb3RvdHlwZS5mb3JjZVVwZGF0ZSA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICB0aGlzLnVwZGF0ZXIuZW5xdWV1ZUZvcmNlVXBkYXRlKHRoaXMsIGNhbGxiYWNrLCAnZm9yY2VVcGRhdGUnKTtcbn07XG4vKipcbiAqIERlcHJlY2F0ZWQgQVBJcy4gVGhlc2UgQVBJcyB1c2VkIHRvIGV4aXN0IG9uIGNsYXNzaWMgUmVhY3QgY2xhc3NlcyBidXQgc2luY2VcbiAqIHdlIHdvdWxkIGxpa2UgdG8gZGVwcmVjYXRlIHRoZW0sIHdlJ3JlIG5vdCBnb2luZyB0byBtb3ZlIHRoZW0gb3ZlciB0byB0aGlzXG4gKiBtb2Rlcm4gYmFzZSBjbGFzcy4gSW5zdGVhZCwgd2UgZGVmaW5lIGEgZ2V0dGVyIHRoYXQgd2FybnMgaWYgaXQncyBhY2Nlc3NlZC5cbiAqL1xuXG5cbntcbiAgdmFyIGRlcHJlY2F0ZWRBUElzID0ge1xuICAgIGlzTW91bnRlZDogWydpc01vdW50ZWQnLCAnSW5zdGVhZCwgbWFrZSBzdXJlIHRvIGNsZWFuIHVwIHN1YnNjcmlwdGlvbnMgYW5kIHBlbmRpbmcgcmVxdWVzdHMgaW4gJyArICdjb21wb25lbnRXaWxsVW5tb3VudCB0byBwcmV2ZW50IG1lbW9yeSBsZWFrcy4nXSxcbiAgICByZXBsYWNlU3RhdGU6IFsncmVwbGFjZVN0YXRlJywgJ1JlZmFjdG9yIHlvdXIgY29kZSB0byB1c2Ugc2V0U3RhdGUgaW5zdGVhZCAoc2VlICcgKyAnaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8zMjM2KS4nXVxuICB9O1xuXG4gIHZhciBkZWZpbmVEZXByZWNhdGlvbldhcm5pbmcgPSBmdW5jdGlvbiAobWV0aG9kTmFtZSwgaW5mbykge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb21wb25lbnQucHJvdG90eXBlLCBtZXRob2ROYW1lLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgd2FybignJXMoLi4uKSBpcyBkZXByZWNhdGVkIGluIHBsYWluIEphdmFTY3JpcHQgUmVhY3QgY2xhc3Nlcy4gJXMnLCBpbmZvWzBdLCBpbmZvWzFdKTtcblxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIGZvciAodmFyIGZuTmFtZSBpbiBkZXByZWNhdGVkQVBJcykge1xuICAgIGlmIChkZXByZWNhdGVkQVBJcy5oYXNPd25Qcm9wZXJ0eShmbk5hbWUpKSB7XG4gICAgICBkZWZpbmVEZXByZWNhdGlvbldhcm5pbmcoZm5OYW1lLCBkZXByZWNhdGVkQVBJc1tmbk5hbWVdKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gQ29tcG9uZW50RHVtbXkoKSB7fVxuXG5Db21wb25lbnREdW1teS5wcm90b3R5cGUgPSBDb21wb25lbnQucHJvdG90eXBlO1xuLyoqXG4gKiBDb252ZW5pZW5jZSBjb21wb25lbnQgd2l0aCBkZWZhdWx0IHNoYWxsb3cgZXF1YWxpdHkgY2hlY2sgZm9yIHNDVS5cbiAqL1xuXG5mdW5jdGlvbiBQdXJlQ29tcG9uZW50KHByb3BzLCBjb250ZXh0LCB1cGRhdGVyKSB7XG4gIHRoaXMucHJvcHMgPSBwcm9wcztcbiAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsgLy8gSWYgYSBjb21wb25lbnQgaGFzIHN0cmluZyByZWZzLCB3ZSB3aWxsIGFzc2lnbiBhIGRpZmZlcmVudCBvYmplY3QgbGF0ZXIuXG5cbiAgdGhpcy5yZWZzID0gZW1wdHlPYmplY3Q7XG4gIHRoaXMudXBkYXRlciA9IHVwZGF0ZXIgfHwgUmVhY3ROb29wVXBkYXRlUXVldWU7XG59XG5cbnZhciBwdXJlQ29tcG9uZW50UHJvdG90eXBlID0gUHVyZUNvbXBvbmVudC5wcm90b3R5cGUgPSBuZXcgQ29tcG9uZW50RHVtbXkoKTtcbnB1cmVDb21wb25lbnRQcm90b3R5cGUuY29uc3RydWN0b3IgPSBQdXJlQ29tcG9uZW50OyAvLyBBdm9pZCBhbiBleHRyYSBwcm90b3R5cGUganVtcCBmb3IgdGhlc2UgbWV0aG9kcy5cblxuYXNzaWduKHB1cmVDb21wb25lbnRQcm90b3R5cGUsIENvbXBvbmVudC5wcm90b3R5cGUpO1xucHVyZUNvbXBvbmVudFByb3RvdHlwZS5pc1B1cmVSZWFjdENvbXBvbmVudCA9IHRydWU7XG5cbi8vIGFuIGltbXV0YWJsZSBvYmplY3Qgd2l0aCBhIHNpbmdsZSBtdXRhYmxlIHZhbHVlXG5mdW5jdGlvbiBjcmVhdGVSZWYoKSB7XG4gIHZhciByZWZPYmplY3QgPSB7XG4gICAgY3VycmVudDogbnVsbFxuICB9O1xuXG4gIHtcbiAgICBPYmplY3Quc2VhbChyZWZPYmplY3QpO1xuICB9XG5cbiAgcmV0dXJuIHJlZk9iamVjdDtcbn1cblxudmFyIGlzQXJyYXlJbXBsID0gQXJyYXkuaXNBcnJheTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlZGVjbGFyZVxuXG5mdW5jdGlvbiBpc0FycmF5KGEpIHtcbiAgcmV0dXJuIGlzQXJyYXlJbXBsKGEpO1xufVxuXG4vKlxuICogVGhlIGAnJyArIHZhbHVlYCBwYXR0ZXJuICh1c2VkIGluIGluIHBlcmYtc2Vuc2l0aXZlIGNvZGUpIHRocm93cyBmb3IgU3ltYm9sXG4gKiBhbmQgVGVtcG9yYWwuKiB0eXBlcy4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzIyMDY0LlxuICpcbiAqIFRoZSBmdW5jdGlvbnMgaW4gdGhpcyBtb2R1bGUgd2lsbCB0aHJvdyBhbiBlYXNpZXItdG8tdW5kZXJzdGFuZCxcbiAqIGVhc2llci10by1kZWJ1ZyBleGNlcHRpb24gd2l0aCBhIGNsZWFyIGVycm9ycyBtZXNzYWdlIG1lc3NhZ2UgZXhwbGFpbmluZyB0aGVcbiAqIHByb2JsZW0uIChJbnN0ZWFkIG9mIGEgY29uZnVzaW5nIGV4Y2VwdGlvbiB0aHJvd24gaW5zaWRlIHRoZSBpbXBsZW1lbnRhdGlvblxuICogb2YgdGhlIGB2YWx1ZWAgb2JqZWN0KS5cbiAqL1xuLy8gJEZsb3dGaXhNZSBvbmx5IGNhbGxlZCBpbiBERVYsIHNvIHZvaWQgcmV0dXJuIGlzIG5vdCBwb3NzaWJsZS5cbmZ1bmN0aW9uIHR5cGVOYW1lKHZhbHVlKSB7XG4gIHtcbiAgICAvLyB0b1N0cmluZ1RhZyBpcyBuZWVkZWQgZm9yIG5hbWVzcGFjZWQgdHlwZXMgbGlrZSBUZW1wb3JhbC5JbnN0YW50XG4gICAgdmFyIGhhc1RvU3RyaW5nVGFnID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wudG9TdHJpbmdUYWc7XG4gICAgdmFyIHR5cGUgPSBoYXNUb1N0cmluZ1RhZyAmJiB2YWx1ZVtTeW1ib2wudG9TdHJpbmdUYWddIHx8IHZhbHVlLmNvbnN0cnVjdG9yLm5hbWUgfHwgJ09iamVjdCc7XG4gICAgcmV0dXJuIHR5cGU7XG4gIH1cbn0gLy8gJEZsb3dGaXhNZSBvbmx5IGNhbGxlZCBpbiBERVYsIHNvIHZvaWQgcmV0dXJuIGlzIG5vdCBwb3NzaWJsZS5cblxuXG5mdW5jdGlvbiB3aWxsQ29lcmNpb25UaHJvdyh2YWx1ZSkge1xuICB7XG4gICAgdHJ5IHtcbiAgICAgIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSkge1xuICAvLyBJZiB5b3UgZW5kZWQgdXAgaGVyZSBieSBmb2xsb3dpbmcgYW4gZXhjZXB0aW9uIGNhbGwgc3RhY2ssIGhlcmUncyB3aGF0J3NcbiAgLy8gaGFwcGVuZWQ6IHlvdSBzdXBwbGllZCBhbiBvYmplY3Qgb3Igc3ltYm9sIHZhbHVlIHRvIFJlYWN0IChhcyBhIHByb3AsIGtleSxcbiAgLy8gRE9NIGF0dHJpYnV0ZSwgQ1NTIHByb3BlcnR5LCBzdHJpbmcgcmVmLCBldGMuKSBhbmQgd2hlbiBSZWFjdCB0cmllZCB0b1xuICAvLyBjb2VyY2UgaXQgdG8gYSBzdHJpbmcgdXNpbmcgYCcnICsgdmFsdWVgLCBhbiBleGNlcHRpb24gd2FzIHRocm93bi5cbiAgLy9cbiAgLy8gVGhlIG1vc3QgY29tbW9uIHR5cGVzIHRoYXQgd2lsbCBjYXVzZSB0aGlzIGV4Y2VwdGlvbiBhcmUgYFN5bWJvbGAgaW5zdGFuY2VzXG4gIC8vIGFuZCBUZW1wb3JhbCBvYmplY3RzIGxpa2UgYFRlbXBvcmFsLkluc3RhbnRgLiBCdXQgYW55IG9iamVjdCB0aGF0IGhhcyBhXG4gIC8vIGB2YWx1ZU9mYCBvciBgW1N5bWJvbC50b1ByaW1pdGl2ZV1gIG1ldGhvZCB0aGF0IHRocm93cyB3aWxsIGFsc28gY2F1c2UgdGhpc1xuICAvLyBleGNlcHRpb24uIChMaWJyYXJ5IGF1dGhvcnMgZG8gdGhpcyB0byBwcmV2ZW50IHVzZXJzIGZyb20gdXNpbmcgYnVpbHQtaW5cbiAgLy8gbnVtZXJpYyBvcGVyYXRvcnMgbGlrZSBgK2Agb3IgY29tcGFyaXNvbiBvcGVyYXRvcnMgbGlrZSBgPj1gIGJlY2F1c2UgY3VzdG9tXG4gIC8vIG1ldGhvZHMgYXJlIG5lZWRlZCB0byBwZXJmb3JtIGFjY3VyYXRlIGFyaXRobWV0aWMgb3IgY29tcGFyaXNvbi4pXG4gIC8vXG4gIC8vIFRvIGZpeCB0aGUgcHJvYmxlbSwgY29lcmNlIHRoaXMgb2JqZWN0IG9yIHN5bWJvbCB2YWx1ZSB0byBhIHN0cmluZyBiZWZvcmVcbiAgLy8gcGFzc2luZyBpdCB0byBSZWFjdC4gVGhlIG1vc3QgcmVsaWFibGUgd2F5IGlzIHVzdWFsbHkgYFN0cmluZyh2YWx1ZSlgLlxuICAvL1xuICAvLyBUbyBmaW5kIHdoaWNoIHZhbHVlIGlzIHRocm93aW5nLCBjaGVjayB0aGUgYnJvd3NlciBvciBkZWJ1Z2dlciBjb25zb2xlLlxuICAvLyBCZWZvcmUgdGhpcyBleGNlcHRpb24gd2FzIHRocm93biwgdGhlcmUgc2hvdWxkIGJlIGBjb25zb2xlLmVycm9yYCBvdXRwdXRcbiAgLy8gdGhhdCBzaG93cyB0aGUgdHlwZSAoU3ltYm9sLCBUZW1wb3JhbC5QbGFpbkRhdGUsIGV0Yy4pIHRoYXQgY2F1c2VkIHRoZVxuICAvLyBwcm9ibGVtIGFuZCBob3cgdGhhdCB0eXBlIHdhcyB1c2VkOiBrZXksIGF0cnJpYnV0ZSwgaW5wdXQgdmFsdWUgcHJvcCwgZXRjLlxuICAvLyBJbiBtb3N0IGNhc2VzLCB0aGlzIGNvbnNvbGUgb3V0cHV0IGFsc28gc2hvd3MgdGhlIGNvbXBvbmVudCBhbmQgaXRzXG4gIC8vIGFuY2VzdG9yIGNvbXBvbmVudHMgd2hlcmUgdGhlIGV4Y2VwdGlvbiBoYXBwZW5lZC5cbiAgLy9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3NhZmUtc3RyaW5nLWNvZXJjaW9uXG4gIHJldHVybiAnJyArIHZhbHVlO1xufVxuZnVuY3Rpb24gY2hlY2tLZXlTdHJpbmdDb2VyY2lvbih2YWx1ZSkge1xuICB7XG4gICAgaWYgKHdpbGxDb2VyY2lvblRocm93KHZhbHVlKSkge1xuICAgICAgZXJyb3IoJ1RoZSBwcm92aWRlZCBrZXkgaXMgYW4gdW5zdXBwb3J0ZWQgdHlwZSAlcy4nICsgJyBUaGlzIHZhbHVlIG11c3QgYmUgY29lcmNlZCB0byBhIHN0cmluZyBiZWZvcmUgYmVmb3JlIHVzaW5nIGl0IGhlcmUuJywgdHlwZU5hbWUodmFsdWUpKTtcblxuICAgICAgcmV0dXJuIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSk7IC8vIHRocm93ICh0byBoZWxwIGNhbGxlcnMgZmluZCB0cm91Ymxlc2hvb3RpbmcgY29tbWVudHMpXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldFdyYXBwZWROYW1lKG91dGVyVHlwZSwgaW5uZXJUeXBlLCB3cmFwcGVyTmFtZSkge1xuICB2YXIgZGlzcGxheU5hbWUgPSBvdXRlclR5cGUuZGlzcGxheU5hbWU7XG5cbiAgaWYgKGRpc3BsYXlOYW1lKSB7XG4gICAgcmV0dXJuIGRpc3BsYXlOYW1lO1xuICB9XG5cbiAgdmFyIGZ1bmN0aW9uTmFtZSA9IGlubmVyVHlwZS5kaXNwbGF5TmFtZSB8fCBpbm5lclR5cGUubmFtZSB8fCAnJztcbiAgcmV0dXJuIGZ1bmN0aW9uTmFtZSAhPT0gJycgPyB3cmFwcGVyTmFtZSArIFwiKFwiICsgZnVuY3Rpb25OYW1lICsgXCIpXCIgOiB3cmFwcGVyTmFtZTtcbn0gLy8gS2VlcCBpbiBzeW5jIHdpdGggcmVhY3QtcmVjb25jaWxlci9nZXRDb21wb25lbnROYW1lRnJvbUZpYmVyXG5cblxuZnVuY3Rpb24gZ2V0Q29udGV4dE5hbWUodHlwZSkge1xuICByZXR1cm4gdHlwZS5kaXNwbGF5TmFtZSB8fCAnQ29udGV4dCc7XG59IC8vIE5vdGUgdGhhdCB0aGUgcmVjb25jaWxlciBwYWNrYWdlIHNob3VsZCBnZW5lcmFsbHkgcHJlZmVyIHRvIHVzZSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKCkgaW5zdGVhZC5cblxuXG5mdW5jdGlvbiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZSkge1xuICBpZiAodHlwZSA9PSBudWxsKSB7XG4gICAgLy8gSG9zdCByb290LCB0ZXh0IG5vZGUgb3IganVzdCBpbnZhbGlkIHR5cGUuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB7XG4gICAgaWYgKHR5cGVvZiB0eXBlLnRhZyA9PT0gJ251bWJlcicpIHtcbiAgICAgIGVycm9yKCdSZWNlaXZlZCBhbiB1bmV4cGVjdGVkIG9iamVjdCBpbiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoKS4gJyArICdUaGlzIGlzIGxpa2VseSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHR5cGUuZGlzcGxheU5hbWUgfHwgdHlwZS5uYW1lIHx8IG51bGw7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHR5cGU7XG4gIH1cblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFJFQUNUX0ZSQUdNRU5UX1RZUEU6XG4gICAgICByZXR1cm4gJ0ZyYWdtZW50JztcblxuICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICByZXR1cm4gJ1BvcnRhbCc7XG5cbiAgICBjYXNlIFJFQUNUX1BST0ZJTEVSX1RZUEU6XG4gICAgICByZXR1cm4gJ1Byb2ZpbGVyJztcblxuICAgIGNhc2UgUkVBQ1RfU1RSSUNUX01PREVfVFlQRTpcbiAgICAgIHJldHVybiAnU3RyaWN0TW9kZSc7XG5cbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6XG4gICAgICByZXR1cm4gJ1N1c3BlbnNlJztcblxuICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFOlxuICAgICAgcmV0dXJuICdTdXNwZW5zZUxpc3QnO1xuXG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgc3dpdGNoICh0eXBlLiQkdHlwZW9mKSB7XG4gICAgICBjYXNlIFJFQUNUX0NPTlRFWFRfVFlQRTpcbiAgICAgICAgdmFyIGNvbnRleHQgPSB0eXBlO1xuICAgICAgICByZXR1cm4gZ2V0Q29udGV4dE5hbWUoY29udGV4dCkgKyAnLkNvbnN1bWVyJztcblxuICAgICAgY2FzZSBSRUFDVF9QUk9WSURFUl9UWVBFOlxuICAgICAgICB2YXIgcHJvdmlkZXIgPSB0eXBlO1xuICAgICAgICByZXR1cm4gZ2V0Q29udGV4dE5hbWUocHJvdmlkZXIuX2NvbnRleHQpICsgJy5Qcm92aWRlcic7XG5cbiAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTpcbiAgICAgICAgcmV0dXJuIGdldFdyYXBwZWROYW1lKHR5cGUsIHR5cGUucmVuZGVyLCAnRm9yd2FyZFJlZicpO1xuXG4gICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgdmFyIG91dGVyTmFtZSA9IHR5cGUuZGlzcGxheU5hbWUgfHwgbnVsbDtcblxuICAgICAgICBpZiAob3V0ZXJOYW1lICE9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIG91dGVyTmFtZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZS50eXBlKSB8fCAnTWVtbyc7XG5cbiAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGxhenlDb21wb25lbnQgPSB0eXBlO1xuICAgICAgICAgIHZhciBwYXlsb2FkID0gbGF6eUNvbXBvbmVudC5fcGF5bG9hZDtcbiAgICAgICAgICB2YXIgaW5pdCA9IGxhenlDb21wb25lbnQuX2luaXQ7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShpbml0KHBheWxvYWQpKTtcbiAgICAgICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbnZhciBSRVNFUlZFRF9QUk9QUyA9IHtcbiAga2V5OiB0cnVlLFxuICByZWY6IHRydWUsXG4gIF9fc2VsZjogdHJ1ZSxcbiAgX19zb3VyY2U6IHRydWVcbn07XG52YXIgc3BlY2lhbFByb3BLZXlXYXJuaW5nU2hvd24sIHNwZWNpYWxQcm9wUmVmV2FybmluZ1Nob3duLCBkaWRXYXJuQWJvdXRTdHJpbmdSZWZzO1xuXG57XG4gIGRpZFdhcm5BYm91dFN0cmluZ1JlZnMgPSB7fTtcbn1cblxuZnVuY3Rpb24gaGFzVmFsaWRSZWYoY29uZmlnKSB7XG4gIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsICdyZWYnKSkge1xuICAgICAgdmFyIGdldHRlciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY29uZmlnLCAncmVmJykuZ2V0O1xuXG4gICAgICBpZiAoZ2V0dGVyICYmIGdldHRlci5pc1JlYWN0V2FybmluZykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNvbmZpZy5yZWYgIT09IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gaGFzVmFsaWRLZXkoY29uZmlnKSB7XG4gIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsICdrZXknKSkge1xuICAgICAgdmFyIGdldHRlciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY29uZmlnLCAna2V5JykuZ2V0O1xuXG4gICAgICBpZiAoZ2V0dGVyICYmIGdldHRlci5pc1JlYWN0V2FybmluZykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNvbmZpZy5rZXkgIT09IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZGVmaW5lS2V5UHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKSB7XG4gIHZhciB3YXJuQWJvdXRBY2Nlc3NpbmdLZXkgPSBmdW5jdGlvbiAoKSB7XG4gICAge1xuICAgICAgaWYgKCFzcGVjaWFsUHJvcEtleVdhcm5pbmdTaG93bikge1xuICAgICAgICBzcGVjaWFsUHJvcEtleVdhcm5pbmdTaG93biA9IHRydWU7XG5cbiAgICAgICAgZXJyb3IoJyVzOiBga2V5YCBpcyBub3QgYSBwcm9wLiBUcnlpbmcgdG8gYWNjZXNzIGl0IHdpbGwgcmVzdWx0ICcgKyAnaW4gYHVuZGVmaW5lZGAgYmVpbmcgcmV0dXJuZWQuIElmIHlvdSBuZWVkIHRvIGFjY2VzcyB0aGUgc2FtZSAnICsgJ3ZhbHVlIHdpdGhpbiB0aGUgY2hpbGQgY29tcG9uZW50LCB5b3Ugc2hvdWxkIHBhc3MgaXQgYXMgYSBkaWZmZXJlbnQgJyArICdwcm9wLiAoaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3NwZWNpYWwtcHJvcHMpJywgZGlzcGxheU5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICB3YXJuQWJvdXRBY2Nlc3NpbmdLZXkuaXNSZWFjdFdhcm5pbmcgPSB0cnVlO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvcHMsICdrZXknLCB7XG4gICAgZ2V0OiB3YXJuQWJvdXRBY2Nlc3NpbmdLZXksXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBkZWZpbmVSZWZQcm9wV2FybmluZ0dldHRlcihwcm9wcywgZGlzcGxheU5hbWUpIHtcbiAgdmFyIHdhcm5BYm91dEFjY2Vzc2luZ1JlZiA9IGZ1bmN0aW9uICgpIHtcbiAgICB7XG4gICAgICBpZiAoIXNwZWNpYWxQcm9wUmVmV2FybmluZ1Nob3duKSB7XG4gICAgICAgIHNwZWNpYWxQcm9wUmVmV2FybmluZ1Nob3duID0gdHJ1ZTtcblxuICAgICAgICBlcnJvcignJXM6IGByZWZgIGlzIG5vdCBhIHByb3AuIFRyeWluZyB0byBhY2Nlc3MgaXQgd2lsbCByZXN1bHQgJyArICdpbiBgdW5kZWZpbmVkYCBiZWluZyByZXR1cm5lZC4gSWYgeW91IG5lZWQgdG8gYWNjZXNzIHRoZSBzYW1lICcgKyAndmFsdWUgd2l0aGluIHRoZSBjaGlsZCBjb21wb25lbnQsIHlvdSBzaG91bGQgcGFzcyBpdCBhcyBhIGRpZmZlcmVudCAnICsgJ3Byb3AuIChodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3BlY2lhbC1wcm9wcyknLCBkaXNwbGF5TmFtZSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHdhcm5BYm91dEFjY2Vzc2luZ1JlZi5pc1JlYWN0V2FybmluZyA9IHRydWU7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm9wcywgJ3JlZicsIHtcbiAgICBnZXQ6IHdhcm5BYm91dEFjY2Vzc2luZ1JlZixcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHdhcm5JZlN0cmluZ1JlZkNhbm5vdEJlQXV0b0NvbnZlcnRlZChjb25maWcpIHtcbiAge1xuICAgIGlmICh0eXBlb2YgY29uZmlnLnJlZiA9PT0gJ3N0cmluZycgJiYgUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCAmJiBjb25maWcuX19zZWxmICYmIFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQuc3RhdGVOb2RlICE9PSBjb25maWcuX19zZWxmKSB7XG4gICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LnR5cGUpO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dFN0cmluZ1JlZnNbY29tcG9uZW50TmFtZV0pIHtcbiAgICAgICAgZXJyb3IoJ0NvbXBvbmVudCBcIiVzXCIgY29udGFpbnMgdGhlIHN0cmluZyByZWYgXCIlc1wiLiAnICsgJ1N1cHBvcnQgZm9yIHN0cmluZyByZWZzIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiAnICsgJ1RoaXMgY2FzZSBjYW5ub3QgYmUgYXV0b21hdGljYWxseSBjb252ZXJ0ZWQgdG8gYW4gYXJyb3cgZnVuY3Rpb24uICcgKyAnV2UgYXNrIHlvdSB0byBtYW51YWxseSBmaXggdGhpcyBjYXNlIGJ5IHVzaW5nIHVzZVJlZigpIG9yIGNyZWF0ZVJlZigpIGluc3RlYWQuICcgKyAnTGVhcm4gbW9yZSBhYm91dCB1c2luZyByZWZzIHNhZmVseSBoZXJlOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zdHJpY3QtbW9kZS1zdHJpbmctcmVmJywgY29tcG9uZW50TmFtZSwgY29uZmlnLnJlZik7XG5cbiAgICAgICAgZGlkV2FybkFib3V0U3RyaW5nUmVmc1tjb21wb25lbnROYW1lXSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4vKipcbiAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhIG5ldyBSZWFjdCBlbGVtZW50LiBUaGlzIG5vIGxvbmdlciBhZGhlcmVzIHRvXG4gKiB0aGUgY2xhc3MgcGF0dGVybiwgc28gZG8gbm90IHVzZSBuZXcgdG8gY2FsbCBpdC4gQWxzbywgaW5zdGFuY2VvZiBjaGVja1xuICogd2lsbCBub3Qgd29yay4gSW5zdGVhZCB0ZXN0ICQkdHlwZW9mIGZpZWxkIGFnYWluc3QgU3ltYm9sLmZvcigncmVhY3QuZWxlbWVudCcpIHRvIGNoZWNrXG4gKiBpZiBzb21ldGhpbmcgaXMgYSBSZWFjdCBFbGVtZW50LlxuICpcbiAqIEBwYXJhbSB7Kn0gdHlwZVxuICogQHBhcmFtIHsqfSBwcm9wc1xuICogQHBhcmFtIHsqfSBrZXlcbiAqIEBwYXJhbSB7c3RyaW5nfG9iamVjdH0gcmVmXG4gKiBAcGFyYW0geyp9IG93bmVyXG4gKiBAcGFyYW0geyp9IHNlbGYgQSAqdGVtcG9yYXJ5KiBoZWxwZXIgdG8gZGV0ZWN0IHBsYWNlcyB3aGVyZSBgdGhpc2AgaXNcbiAqIGRpZmZlcmVudCBmcm9tIHRoZSBgb3duZXJgIHdoZW4gUmVhY3QuY3JlYXRlRWxlbWVudCBpcyBjYWxsZWQsIHNvIHRoYXQgd2VcbiAqIGNhbiB3YXJuLiBXZSB3YW50IHRvIGdldCByaWQgb2Ygb3duZXIgYW5kIHJlcGxhY2Ugc3RyaW5nIGByZWZgcyB3aXRoIGFycm93XG4gKiBmdW5jdGlvbnMsIGFuZCBhcyBsb25nIGFzIGB0aGlzYCBhbmQgb3duZXIgYXJlIHRoZSBzYW1lLCB0aGVyZSB3aWxsIGJlIG5vXG4gKiBjaGFuZ2UgaW4gYmVoYXZpb3IuXG4gKiBAcGFyYW0geyp9IHNvdXJjZSBBbiBhbm5vdGF0aW9uIG9iamVjdCAoYWRkZWQgYnkgYSB0cmFuc3BpbGVyIG9yIG90aGVyd2lzZSlcbiAqIGluZGljYXRpbmcgZmlsZW5hbWUsIGxpbmUgbnVtYmVyLCBhbmQvb3Igb3RoZXIgaW5mb3JtYXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuXG5cbnZhciBSZWFjdEVsZW1lbnQgPSBmdW5jdGlvbiAodHlwZSwga2V5LCByZWYsIHNlbGYsIHNvdXJjZSwgb3duZXIsIHByb3BzKSB7XG4gIHZhciBlbGVtZW50ID0ge1xuICAgIC8vIFRoaXMgdGFnIGFsbG93cyB1cyB0byB1bmlxdWVseSBpZGVudGlmeSB0aGlzIGFzIGEgUmVhY3QgRWxlbWVudFxuICAgICQkdHlwZW9mOiBSRUFDVF9FTEVNRU5UX1RZUEUsXG4gICAgLy8gQnVpbHQtaW4gcHJvcGVydGllcyB0aGF0IGJlbG9uZyBvbiB0aGUgZWxlbWVudFxuICAgIHR5cGU6IHR5cGUsXG4gICAga2V5OiBrZXksXG4gICAgcmVmOiByZWYsXG4gICAgcHJvcHM6IHByb3BzLFxuICAgIC8vIFJlY29yZCB0aGUgY29tcG9uZW50IHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB0aGlzIGVsZW1lbnQuXG4gICAgX293bmVyOiBvd25lclxuICB9O1xuXG4gIHtcbiAgICAvLyBUaGUgdmFsaWRhdGlvbiBmbGFnIGlzIGN1cnJlbnRseSBtdXRhdGl2ZS4gV2UgcHV0IGl0IG9uXG4gICAgLy8gYW4gZXh0ZXJuYWwgYmFja2luZyBzdG9yZSBzbyB0aGF0IHdlIGNhbiBmcmVlemUgdGhlIHdob2xlIG9iamVjdC5cbiAgICAvLyBUaGlzIGNhbiBiZSByZXBsYWNlZCB3aXRoIGEgV2Vha01hcCBvbmNlIHRoZXkgYXJlIGltcGxlbWVudGVkIGluXG4gICAgLy8gY29tbW9ubHkgdXNlZCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudHMuXG4gICAgZWxlbWVudC5fc3RvcmUgPSB7fTsgLy8gVG8gbWFrZSBjb21wYXJpbmcgUmVhY3RFbGVtZW50cyBlYXNpZXIgZm9yIHRlc3RpbmcgcHVycG9zZXMsIHdlIG1ha2VcbiAgICAvLyB0aGUgdmFsaWRhdGlvbiBmbGFnIG5vbi1lbnVtZXJhYmxlICh3aGVyZSBwb3NzaWJsZSwgd2hpY2ggc2hvdWxkXG4gICAgLy8gaW5jbHVkZSBldmVyeSBlbnZpcm9ubWVudCB3ZSBydW4gdGVzdHMgaW4pLCBzbyB0aGUgdGVzdCBmcmFtZXdvcmtcbiAgICAvLyBpZ25vcmVzIGl0LlxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsZW1lbnQuX3N0b3JlLCAndmFsaWRhdGVkJywge1xuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICB2YWx1ZTogZmFsc2VcbiAgICB9KTsgLy8gc2VsZiBhbmQgc291cmNlIGFyZSBERVYgb25seSBwcm9wZXJ0aWVzLlxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsZW1lbnQsICdfc2VsZicsIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIHZhbHVlOiBzZWxmXG4gICAgfSk7IC8vIFR3byBlbGVtZW50cyBjcmVhdGVkIGluIHR3byBkaWZmZXJlbnQgcGxhY2VzIHNob3VsZCBiZSBjb25zaWRlcmVkXG4gICAgLy8gZXF1YWwgZm9yIHRlc3RpbmcgcHVycG9zZXMgYW5kIHRoZXJlZm9yZSB3ZSBoaWRlIGl0IGZyb20gZW51bWVyYXRpb24uXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudCwgJ19zb3VyY2UnLCB7XG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICB2YWx1ZTogc291cmNlXG4gICAgfSk7XG5cbiAgICBpZiAoT2JqZWN0LmZyZWV6ZSkge1xuICAgICAgT2JqZWN0LmZyZWV6ZShlbGVtZW50LnByb3BzKTtcbiAgICAgIE9iamVjdC5mcmVlemUoZWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQ7XG59O1xuLyoqXG4gKiBDcmVhdGUgYW5kIHJldHVybiBhIG5ldyBSZWFjdEVsZW1lbnQgb2YgdGhlIGdpdmVuIHR5cGUuXG4gKiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlYWN0LWFwaS5odG1sI2NyZWF0ZWVsZW1lbnRcbiAqL1xuXG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50KHR5cGUsIGNvbmZpZywgY2hpbGRyZW4pIHtcbiAgdmFyIHByb3BOYW1lOyAvLyBSZXNlcnZlZCBuYW1lcyBhcmUgZXh0cmFjdGVkXG5cbiAgdmFyIHByb3BzID0ge307XG4gIHZhciBrZXkgPSBudWxsO1xuICB2YXIgcmVmID0gbnVsbDtcbiAgdmFyIHNlbGYgPSBudWxsO1xuICB2YXIgc291cmNlID0gbnVsbDtcblxuICBpZiAoY29uZmlnICE9IG51bGwpIHtcbiAgICBpZiAoaGFzVmFsaWRSZWYoY29uZmlnKSkge1xuICAgICAgcmVmID0gY29uZmlnLnJlZjtcblxuICAgICAge1xuICAgICAgICB3YXJuSWZTdHJpbmdSZWZDYW5ub3RCZUF1dG9Db252ZXJ0ZWQoY29uZmlnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaGFzVmFsaWRLZXkoY29uZmlnKSkge1xuICAgICAge1xuICAgICAgICBjaGVja0tleVN0cmluZ0NvZXJjaW9uKGNvbmZpZy5rZXkpO1xuICAgICAgfVxuXG4gICAgICBrZXkgPSAnJyArIGNvbmZpZy5rZXk7XG4gICAgfVxuXG4gICAgc2VsZiA9IGNvbmZpZy5fX3NlbGYgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjb25maWcuX19zZWxmO1xuICAgIHNvdXJjZSA9IGNvbmZpZy5fX3NvdXJjZSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGNvbmZpZy5fX3NvdXJjZTsgLy8gUmVtYWluaW5nIHByb3BlcnRpZXMgYXJlIGFkZGVkIHRvIGEgbmV3IHByb3BzIG9iamVjdFxuXG4gICAgZm9yIChwcm9wTmFtZSBpbiBjb25maWcpIHtcbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgcHJvcE5hbWUpICYmICFSRVNFUlZFRF9QUk9QUy5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHtcbiAgICAgICAgcHJvcHNbcHJvcE5hbWVdID0gY29uZmlnW3Byb3BOYW1lXTtcbiAgICAgIH1cbiAgICB9XG4gIH0gLy8gQ2hpbGRyZW4gY2FuIGJlIG1vcmUgdGhhbiBvbmUgYXJndW1lbnQsIGFuZCB0aG9zZSBhcmUgdHJhbnNmZXJyZWQgb250b1xuICAvLyB0aGUgbmV3bHkgYWxsb2NhdGVkIHByb3BzIG9iamVjdC5cblxuXG4gIHZhciBjaGlsZHJlbkxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGggLSAyO1xuXG4gIGlmIChjaGlsZHJlbkxlbmd0aCA9PT0gMSkge1xuICAgIHByb3BzLmNoaWxkcmVuID0gY2hpbGRyZW47XG4gIH0gZWxzZSBpZiAoY2hpbGRyZW5MZW5ndGggPiAxKSB7XG4gICAgdmFyIGNoaWxkQXJyYXkgPSBBcnJheShjaGlsZHJlbkxlbmd0aCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuTGVuZ3RoOyBpKyspIHtcbiAgICAgIGNoaWxkQXJyYXlbaV0gPSBhcmd1bWVudHNbaSArIDJdO1xuICAgIH1cblxuICAgIHtcbiAgICAgIGlmIChPYmplY3QuZnJlZXplKSB7XG4gICAgICAgIE9iamVjdC5mcmVlemUoY2hpbGRBcnJheSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJvcHMuY2hpbGRyZW4gPSBjaGlsZEFycmF5O1xuICB9IC8vIFJlc29sdmUgZGVmYXVsdCBwcm9wc1xuXG5cbiAgaWYgKHR5cGUgJiYgdHlwZS5kZWZhdWx0UHJvcHMpIHtcbiAgICB2YXIgZGVmYXVsdFByb3BzID0gdHlwZS5kZWZhdWx0UHJvcHM7XG5cbiAgICBmb3IgKHByb3BOYW1lIGluIGRlZmF1bHRQcm9wcykge1xuICAgICAgaWYgKHByb3BzW3Byb3BOYW1lXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGRlZmF1bHRQcm9wc1twcm9wTmFtZV07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAge1xuICAgIGlmIChrZXkgfHwgcmVmKSB7XG4gICAgICB2YXIgZGlzcGxheU5hbWUgPSB0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJyA/IHR5cGUuZGlzcGxheU5hbWUgfHwgdHlwZS5uYW1lIHx8ICdVbmtub3duJyA6IHR5cGU7XG5cbiAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgZGVmaW5lS2V5UHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlZikge1xuICAgICAgICBkZWZpbmVSZWZQcm9wV2FybmluZ0dldHRlcihwcm9wcywgZGlzcGxheU5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBSZWFjdEVsZW1lbnQodHlwZSwga2V5LCByZWYsIHNlbGYsIHNvdXJjZSwgUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCwgcHJvcHMpO1xufVxuZnVuY3Rpb24gY2xvbmVBbmRSZXBsYWNlS2V5KG9sZEVsZW1lbnQsIG5ld0tleSkge1xuICB2YXIgbmV3RWxlbWVudCA9IFJlYWN0RWxlbWVudChvbGRFbGVtZW50LnR5cGUsIG5ld0tleSwgb2xkRWxlbWVudC5yZWYsIG9sZEVsZW1lbnQuX3NlbGYsIG9sZEVsZW1lbnQuX3NvdXJjZSwgb2xkRWxlbWVudC5fb3duZXIsIG9sZEVsZW1lbnQucHJvcHMpO1xuICByZXR1cm4gbmV3RWxlbWVudDtcbn1cbi8qKlxuICogQ2xvbmUgYW5kIHJldHVybiBhIG5ldyBSZWFjdEVsZW1lbnQgdXNpbmcgZWxlbWVudCBhcyB0aGUgc3RhcnRpbmcgcG9pbnQuXG4gKiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlYWN0LWFwaS5odG1sI2Nsb25lZWxlbWVudFxuICovXG5cbmZ1bmN0aW9uIGNsb25lRWxlbWVudChlbGVtZW50LCBjb25maWcsIGNoaWxkcmVuKSB7XG4gIGlmIChlbGVtZW50ID09PSBudWxsIHx8IGVsZW1lbnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlJlYWN0LmNsb25lRWxlbWVudCguLi4pOiBUaGUgYXJndW1lbnQgbXVzdCBiZSBhIFJlYWN0IGVsZW1lbnQsIGJ1dCB5b3UgcGFzc2VkIFwiICsgZWxlbWVudCArIFwiLlwiKTtcbiAgfVxuXG4gIHZhciBwcm9wTmFtZTsgLy8gT3JpZ2luYWwgcHJvcHMgYXJlIGNvcGllZFxuXG4gIHZhciBwcm9wcyA9IGFzc2lnbih7fSwgZWxlbWVudC5wcm9wcyk7IC8vIFJlc2VydmVkIG5hbWVzIGFyZSBleHRyYWN0ZWRcblxuICB2YXIga2V5ID0gZWxlbWVudC5rZXk7XG4gIHZhciByZWYgPSBlbGVtZW50LnJlZjsgLy8gU2VsZiBpcyBwcmVzZXJ2ZWQgc2luY2UgdGhlIG93bmVyIGlzIHByZXNlcnZlZC5cblxuICB2YXIgc2VsZiA9IGVsZW1lbnQuX3NlbGY7IC8vIFNvdXJjZSBpcyBwcmVzZXJ2ZWQgc2luY2UgY2xvbmVFbGVtZW50IGlzIHVubGlrZWx5IHRvIGJlIHRhcmdldGVkIGJ5IGFcbiAgLy8gdHJhbnNwaWxlciwgYW5kIHRoZSBvcmlnaW5hbCBzb3VyY2UgaXMgcHJvYmFibHkgYSBiZXR0ZXIgaW5kaWNhdG9yIG9mIHRoZVxuICAvLyB0cnVlIG93bmVyLlxuXG4gIHZhciBzb3VyY2UgPSBlbGVtZW50Ll9zb3VyY2U7IC8vIE93bmVyIHdpbGwgYmUgcHJlc2VydmVkLCB1bmxlc3MgcmVmIGlzIG92ZXJyaWRkZW5cblxuICB2YXIgb3duZXIgPSBlbGVtZW50Ll9vd25lcjtcblxuICBpZiAoY29uZmlnICE9IG51bGwpIHtcbiAgICBpZiAoaGFzVmFsaWRSZWYoY29uZmlnKSkge1xuICAgICAgLy8gU2lsZW50bHkgc3RlYWwgdGhlIHJlZiBmcm9tIHRoZSBwYXJlbnQuXG4gICAgICByZWYgPSBjb25maWcucmVmO1xuICAgICAgb3duZXIgPSBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50O1xuICAgIH1cblxuICAgIGlmIChoYXNWYWxpZEtleShjb25maWcpKSB7XG4gICAgICB7XG4gICAgICAgIGNoZWNrS2V5U3RyaW5nQ29lcmNpb24oY29uZmlnLmtleSk7XG4gICAgICB9XG5cbiAgICAgIGtleSA9ICcnICsgY29uZmlnLmtleTtcbiAgICB9IC8vIFJlbWFpbmluZyBwcm9wZXJ0aWVzIG92ZXJyaWRlIGV4aXN0aW5nIHByb3BzXG5cblxuICAgIHZhciBkZWZhdWx0UHJvcHM7XG5cbiAgICBpZiAoZWxlbWVudC50eXBlICYmIGVsZW1lbnQudHlwZS5kZWZhdWx0UHJvcHMpIHtcbiAgICAgIGRlZmF1bHRQcm9wcyA9IGVsZW1lbnQudHlwZS5kZWZhdWx0UHJvcHM7XG4gICAgfVxuXG4gICAgZm9yIChwcm9wTmFtZSBpbiBjb25maWcpIHtcbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgcHJvcE5hbWUpICYmICFSRVNFUlZFRF9QUk9QUy5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHtcbiAgICAgICAgaWYgKGNvbmZpZ1twcm9wTmFtZV0gPT09IHVuZGVmaW5lZCAmJiBkZWZhdWx0UHJvcHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIFJlc29sdmUgZGVmYXVsdCBwcm9wc1xuICAgICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGRlZmF1bHRQcm9wc1twcm9wTmFtZV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvcHNbcHJvcE5hbWVdID0gY29uZmlnW3Byb3BOYW1lXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSAvLyBDaGlsZHJlbiBjYW4gYmUgbW9yZSB0aGFuIG9uZSBhcmd1bWVudCwgYW5kIHRob3NlIGFyZSB0cmFuc2ZlcnJlZCBvbnRvXG4gIC8vIHRoZSBuZXdseSBhbGxvY2F0ZWQgcHJvcHMgb2JqZWN0LlxuXG5cbiAgdmFyIGNoaWxkcmVuTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCAtIDI7XG5cbiAgaWYgKGNoaWxkcmVuTGVuZ3RoID09PSAxKSB7XG4gICAgcHJvcHMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgfSBlbHNlIGlmIChjaGlsZHJlbkxlbmd0aCA+IDEpIHtcbiAgICB2YXIgY2hpbGRBcnJheSA9IEFycmF5KGNoaWxkcmVuTGVuZ3RoKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW5MZW5ndGg7IGkrKykge1xuICAgICAgY2hpbGRBcnJheVtpXSA9IGFyZ3VtZW50c1tpICsgMl07XG4gICAgfVxuXG4gICAgcHJvcHMuY2hpbGRyZW4gPSBjaGlsZEFycmF5O1xuICB9XG5cbiAgcmV0dXJuIFJlYWN0RWxlbWVudChlbGVtZW50LnR5cGUsIGtleSwgcmVmLCBzZWxmLCBzb3VyY2UsIG93bmVyLCBwcm9wcyk7XG59XG4vKipcbiAqIFZlcmlmaWVzIHRoZSBvYmplY3QgaXMgYSBSZWFjdEVsZW1lbnQuXG4gKiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlYWN0LWFwaS5odG1sI2lzdmFsaWRlbGVtZW50XG4gKiBAcGFyYW0gez9vYmplY3R9IG9iamVjdFxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBgb2JqZWN0YCBpcyBhIFJlYWN0RWxlbWVudC5cbiAqIEBmaW5hbFxuICovXG5cbmZ1bmN0aW9uIGlzVmFsaWRFbGVtZW50KG9iamVjdCkge1xuICByZXR1cm4gdHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgb2JqZWN0ICE9PSBudWxsICYmIG9iamVjdC4kJHR5cGVvZiA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFO1xufVxuXG52YXIgU0VQQVJBVE9SID0gJy4nO1xudmFyIFNVQlNFUEFSQVRPUiA9ICc6Jztcbi8qKlxuICogRXNjYXBlIGFuZCB3cmFwIGtleSBzbyBpdCBpcyBzYWZlIHRvIHVzZSBhcyBhIHJlYWN0aWRcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IHRvIGJlIGVzY2FwZWQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IHRoZSBlc2NhcGVkIGtleS5cbiAqL1xuXG5mdW5jdGlvbiBlc2NhcGUoa2V5KSB7XG4gIHZhciBlc2NhcGVSZWdleCA9IC9bPTpdL2c7XG4gIHZhciBlc2NhcGVyTG9va3VwID0ge1xuICAgICc9JzogJz0wJyxcbiAgICAnOic6ICc9MidcbiAgfTtcbiAgdmFyIGVzY2FwZWRTdHJpbmcgPSBrZXkucmVwbGFjZShlc2NhcGVSZWdleCwgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgcmV0dXJuIGVzY2FwZXJMb29rdXBbbWF0Y2hdO1xuICB9KTtcbiAgcmV0dXJuICckJyArIGVzY2FwZWRTdHJpbmc7XG59XG4vKipcbiAqIFRPRE86IFRlc3QgdGhhdCBhIHNpbmdsZSBjaGlsZCBhbmQgYW4gYXJyYXkgd2l0aCBvbmUgaXRlbSBoYXZlIHRoZSBzYW1lIGtleVxuICogcGF0dGVybi5cbiAqL1xuXG5cbnZhciBkaWRXYXJuQWJvdXRNYXBzID0gZmFsc2U7XG52YXIgdXNlclByb3ZpZGVkS2V5RXNjYXBlUmVnZXggPSAvXFwvKy9nO1xuXG5mdW5jdGlvbiBlc2NhcGVVc2VyUHJvdmlkZWRLZXkodGV4dCkge1xuICByZXR1cm4gdGV4dC5yZXBsYWNlKHVzZXJQcm92aWRlZEtleUVzY2FwZVJlZ2V4LCAnJCYvJyk7XG59XG4vKipcbiAqIEdlbmVyYXRlIGEga2V5IHN0cmluZyB0aGF0IGlkZW50aWZpZXMgYSBlbGVtZW50IHdpdGhpbiBhIHNldC5cbiAqXG4gKiBAcGFyYW0geyp9IGVsZW1lbnQgQSBlbGVtZW50IHRoYXQgY291bGQgY29udGFpbiBhIG1hbnVhbCBrZXkuXG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXggSW5kZXggdGhhdCBpcyB1c2VkIGlmIGEgbWFudWFsIGtleSBpcyBub3QgcHJvdmlkZWQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cblxuXG5mdW5jdGlvbiBnZXRFbGVtZW50S2V5KGVsZW1lbnQsIGluZGV4KSB7XG4gIC8vIERvIHNvbWUgdHlwZWNoZWNraW5nIGhlcmUgc2luY2Ugd2UgY2FsbCB0aGlzIGJsaW5kbHkuIFdlIHdhbnQgdG8gZW5zdXJlXG4gIC8vIHRoYXQgd2UgZG9uJ3QgYmxvY2sgcG90ZW50aWFsIGZ1dHVyZSBFUyBBUElzLlxuICBpZiAodHlwZW9mIGVsZW1lbnQgPT09ICdvYmplY3QnICYmIGVsZW1lbnQgIT09IG51bGwgJiYgZWxlbWVudC5rZXkgIT0gbnVsbCkge1xuICAgIC8vIEV4cGxpY2l0IGtleVxuICAgIHtcbiAgICAgIGNoZWNrS2V5U3RyaW5nQ29lcmNpb24oZWxlbWVudC5rZXkpO1xuICAgIH1cblxuICAgIHJldHVybiBlc2NhcGUoJycgKyBlbGVtZW50LmtleSk7XG4gIH0gLy8gSW1wbGljaXQga2V5IGRldGVybWluZWQgYnkgdGhlIGluZGV4IGluIHRoZSBzZXRcblxuXG4gIHJldHVybiBpbmRleC50b1N0cmluZygzNik7XG59XG5cbmZ1bmN0aW9uIG1hcEludG9BcnJheShjaGlsZHJlbiwgYXJyYXksIGVzY2FwZWRQcmVmaXgsIG5hbWVTb0ZhciwgY2FsbGJhY2spIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgY2hpbGRyZW47XG5cbiAgaWYgKHR5cGUgPT09ICd1bmRlZmluZWQnIHx8IHR5cGUgPT09ICdib29sZWFuJykge1xuICAgIC8vIEFsbCBvZiB0aGUgYWJvdmUgYXJlIHBlcmNlaXZlZCBhcyBudWxsLlxuICAgIGNoaWxkcmVuID0gbnVsbDtcbiAgfVxuXG4gIHZhciBpbnZva2VDYWxsYmFjayA9IGZhbHNlO1xuXG4gIGlmIChjaGlsZHJlbiA9PT0gbnVsbCkge1xuICAgIGludm9rZUNhbGxiYWNrID0gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICBpbnZva2VDYWxsYmFjayA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgICBzd2l0Y2ggKGNoaWxkcmVuLiQkdHlwZW9mKSB7XG4gICAgICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgICAgIGludm9rZUNhbGxiYWNrID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgfVxuICB9XG5cbiAgaWYgKGludm9rZUNhbGxiYWNrKSB7XG4gICAgdmFyIF9jaGlsZCA9IGNoaWxkcmVuO1xuICAgIHZhciBtYXBwZWRDaGlsZCA9IGNhbGxiYWNrKF9jaGlsZCk7IC8vIElmIGl0J3MgdGhlIG9ubHkgY2hpbGQsIHRyZWF0IHRoZSBuYW1lIGFzIGlmIGl0IHdhcyB3cmFwcGVkIGluIGFuIGFycmF5XG4gICAgLy8gc28gdGhhdCBpdCdzIGNvbnNpc3RlbnQgaWYgdGhlIG51bWJlciBvZiBjaGlsZHJlbiBncm93czpcblxuICAgIHZhciBjaGlsZEtleSA9IG5hbWVTb0ZhciA9PT0gJycgPyBTRVBBUkFUT1IgKyBnZXRFbGVtZW50S2V5KF9jaGlsZCwgMCkgOiBuYW1lU29GYXI7XG5cbiAgICBpZiAoaXNBcnJheShtYXBwZWRDaGlsZCkpIHtcbiAgICAgIHZhciBlc2NhcGVkQ2hpbGRLZXkgPSAnJztcblxuICAgICAgaWYgKGNoaWxkS2V5ICE9IG51bGwpIHtcbiAgICAgICAgZXNjYXBlZENoaWxkS2V5ID0gZXNjYXBlVXNlclByb3ZpZGVkS2V5KGNoaWxkS2V5KSArICcvJztcbiAgICAgIH1cblxuICAgICAgbWFwSW50b0FycmF5KG1hcHBlZENoaWxkLCBhcnJheSwgZXNjYXBlZENoaWxkS2V5LCAnJywgZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgcmV0dXJuIGM7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKG1hcHBlZENoaWxkICE9IG51bGwpIHtcbiAgICAgIGlmIChpc1ZhbGlkRWxlbWVudChtYXBwZWRDaGlsZCkpIHtcbiAgICAgICAge1xuICAgICAgICAgIC8vIFRoZSBgaWZgIHN0YXRlbWVudCBoZXJlIHByZXZlbnRzIGF1dG8tZGlzYWJsaW5nIG9mIHRoZSBzYWZlXG4gICAgICAgICAgLy8gY29lcmNpb24gRVNMaW50IHJ1bGUsIHNvIHdlIG11c3QgbWFudWFsbHkgZGlzYWJsZSBpdCBiZWxvdy5cbiAgICAgICAgICAvLyAkRmxvd0ZpeE1lIEZsb3cgaW5jb3JyZWN0bHkgdGhpbmtzIFJlYWN0LlBvcnRhbCBkb2Vzbid0IGhhdmUgYSBrZXlcbiAgICAgICAgICBpZiAobWFwcGVkQ2hpbGQua2V5ICYmICghX2NoaWxkIHx8IF9jaGlsZC5rZXkgIT09IG1hcHBlZENoaWxkLmtleSkpIHtcbiAgICAgICAgICAgIGNoZWNrS2V5U3RyaW5nQ29lcmNpb24obWFwcGVkQ2hpbGQua2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBtYXBwZWRDaGlsZCA9IGNsb25lQW5kUmVwbGFjZUtleShtYXBwZWRDaGlsZCwgLy8gS2VlcCBib3RoIHRoZSAobWFwcGVkKSBhbmQgb2xkIGtleXMgaWYgdGhleSBkaWZmZXIsIGp1c3QgYXNcbiAgICAgICAgLy8gdHJhdmVyc2VBbGxDaGlsZHJlbiB1c2VkIHRvIGRvIGZvciBvYmplY3RzIGFzIGNoaWxkcmVuXG4gICAgICAgIGVzY2FwZWRQcmVmaXggKyAoIC8vICRGbG93Rml4TWUgRmxvdyBpbmNvcnJlY3RseSB0aGlua3MgUmVhY3QuUG9ydGFsIGRvZXNuJ3QgaGF2ZSBhIGtleVxuICAgICAgICBtYXBwZWRDaGlsZC5rZXkgJiYgKCFfY2hpbGQgfHwgX2NoaWxkLmtleSAhPT0gbWFwcGVkQ2hpbGQua2V5KSA/IC8vICRGbG93Rml4TWUgRmxvdyBpbmNvcnJlY3RseSB0aGlua3MgZXhpc3RpbmcgZWxlbWVudCdzIGtleSBjYW4gYmUgYSBudW1iZXJcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3NhZmUtc3RyaW5nLWNvZXJjaW9uXG4gICAgICAgIGVzY2FwZVVzZXJQcm92aWRlZEtleSgnJyArIG1hcHBlZENoaWxkLmtleSkgKyAnLycgOiAnJykgKyBjaGlsZEtleSk7XG4gICAgICB9XG5cbiAgICAgIGFycmF5LnB1c2gobWFwcGVkQ2hpbGQpO1xuICAgIH1cblxuICAgIHJldHVybiAxO1xuICB9XG5cbiAgdmFyIGNoaWxkO1xuICB2YXIgbmV4dE5hbWU7XG4gIHZhciBzdWJ0cmVlQ291bnQgPSAwOyAvLyBDb3VudCBvZiBjaGlsZHJlbiBmb3VuZCBpbiB0aGUgY3VycmVudCBzdWJ0cmVlLlxuXG4gIHZhciBuZXh0TmFtZVByZWZpeCA9IG5hbWVTb0ZhciA9PT0gJycgPyBTRVBBUkFUT1IgOiBuYW1lU29GYXIgKyBTVUJTRVBBUkFUT1I7XG5cbiAgaWYgKGlzQXJyYXkoY2hpbGRyZW4pKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgY2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICAgIG5leHROYW1lID0gbmV4dE5hbWVQcmVmaXggKyBnZXRFbGVtZW50S2V5KGNoaWxkLCBpKTtcbiAgICAgIHN1YnRyZWVDb3VudCArPSBtYXBJbnRvQXJyYXkoY2hpbGQsIGFycmF5LCBlc2NhcGVkUHJlZml4LCBuZXh0TmFtZSwgY2FsbGJhY2spO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YXIgaXRlcmF0b3JGbiA9IGdldEl0ZXJhdG9yRm4oY2hpbGRyZW4pO1xuXG4gICAgaWYgKHR5cGVvZiBpdGVyYXRvckZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgaXRlcmFibGVDaGlsZHJlbiA9IGNoaWxkcmVuO1xuXG4gICAgICB7XG4gICAgICAgIC8vIFdhcm4gYWJvdXQgdXNpbmcgTWFwcyBhcyBjaGlsZHJlblxuICAgICAgICBpZiAoaXRlcmF0b3JGbiA9PT0gaXRlcmFibGVDaGlsZHJlbi5lbnRyaWVzKSB7XG4gICAgICAgICAgaWYgKCFkaWRXYXJuQWJvdXRNYXBzKSB7XG4gICAgICAgICAgICB3YXJuKCdVc2luZyBNYXBzIGFzIGNoaWxkcmVuIGlzIG5vdCBzdXBwb3J0ZWQuICcgKyAnVXNlIGFuIGFycmF5IG9mIGtleWVkIFJlYWN0RWxlbWVudHMgaW5zdGVhZC4nKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBkaWRXYXJuQWJvdXRNYXBzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgaXRlcmF0b3IgPSBpdGVyYXRvckZuLmNhbGwoaXRlcmFibGVDaGlsZHJlbik7XG4gICAgICB2YXIgc3RlcDtcbiAgICAgIHZhciBpaSA9IDA7XG5cbiAgICAgIHdoaWxlICghKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHtcbiAgICAgICAgY2hpbGQgPSBzdGVwLnZhbHVlO1xuICAgICAgICBuZXh0TmFtZSA9IG5leHROYW1lUHJlZml4ICsgZ2V0RWxlbWVudEtleShjaGlsZCwgaWkrKyk7XG4gICAgICAgIHN1YnRyZWVDb3VudCArPSBtYXBJbnRvQXJyYXkoY2hpbGQsIGFycmF5LCBlc2NhcGVkUHJlZml4LCBuZXh0TmFtZSwgY2FsbGJhY2spO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvblxuICAgICAgdmFyIGNoaWxkcmVuU3RyaW5nID0gU3RyaW5nKGNoaWxkcmVuKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk9iamVjdHMgYXJlIG5vdCB2YWxpZCBhcyBhIFJlYWN0IGNoaWxkIChmb3VuZDogXCIgKyAoY2hpbGRyZW5TdHJpbmcgPT09ICdbb2JqZWN0IE9iamVjdF0nID8gJ29iamVjdCB3aXRoIGtleXMgeycgKyBPYmplY3Qua2V5cyhjaGlsZHJlbikuam9pbignLCAnKSArICd9JyA6IGNoaWxkcmVuU3RyaW5nKSArIFwiKS4gXCIgKyAnSWYgeW91IG1lYW50IHRvIHJlbmRlciBhIGNvbGxlY3Rpb24gb2YgY2hpbGRyZW4sIHVzZSBhbiBhcnJheSAnICsgJ2luc3RlYWQuJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN1YnRyZWVDb3VudDtcbn1cblxuLyoqXG4gKiBNYXBzIGNoaWxkcmVuIHRoYXQgYXJlIHR5cGljYWxseSBzcGVjaWZpZWQgYXMgYHByb3BzLmNoaWxkcmVuYC5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlYWN0LWFwaS5odG1sI3JlYWN0Y2hpbGRyZW5tYXBcbiAqXG4gKiBUaGUgcHJvdmlkZWQgbWFwRnVuY3Rpb24oY2hpbGQsIGluZGV4KSB3aWxsIGJlIGNhbGxlZCBmb3IgZWFjaFxuICogbGVhZiBjaGlsZC5cbiAqXG4gKiBAcGFyYW0gez8qfSBjaGlsZHJlbiBDaGlsZHJlbiB0cmVlIGNvbnRhaW5lci5cbiAqIEBwYXJhbSB7ZnVuY3Rpb24oKiwgaW50KX0gZnVuYyBUaGUgbWFwIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsqfSBjb250ZXh0IENvbnRleHQgZm9yIG1hcEZ1bmN0aW9uLlxuICogQHJldHVybiB7b2JqZWN0fSBPYmplY3QgY29udGFpbmluZyB0aGUgb3JkZXJlZCBtYXAgb2YgcmVzdWx0cy5cbiAqL1xuZnVuY3Rpb24gbWFwQ2hpbGRyZW4oY2hpbGRyZW4sIGZ1bmMsIGNvbnRleHQpIHtcbiAgaWYgKGNoaWxkcmVuID09IG51bGwpIHtcbiAgICByZXR1cm4gY2hpbGRyZW47XG4gIH1cblxuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciBjb3VudCA9IDA7XG4gIG1hcEludG9BcnJheShjaGlsZHJlbiwgcmVzdWx0LCAnJywgJycsIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgIHJldHVybiBmdW5jLmNhbGwoY29udGV4dCwgY2hpbGQsIGNvdW50KyspO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cbi8qKlxuICogQ291bnQgdGhlIG51bWJlciBvZiBjaGlsZHJlbiB0aGF0IGFyZSB0eXBpY2FsbHkgc3BlY2lmaWVkIGFzXG4gKiBgcHJvcHMuY2hpbGRyZW5gLlxuICpcbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjcmVhY3RjaGlsZHJlbmNvdW50XG4gKlxuICogQHBhcmFtIHs/Kn0gY2hpbGRyZW4gQ2hpbGRyZW4gdHJlZSBjb250YWluZXIuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBudW1iZXIgb2YgY2hpbGRyZW4uXG4gKi9cblxuXG5mdW5jdGlvbiBjb3VudENoaWxkcmVuKGNoaWxkcmVuKSB7XG4gIHZhciBuID0gMDtcbiAgbWFwQ2hpbGRyZW4oY2hpbGRyZW4sIGZ1bmN0aW9uICgpIHtcbiAgICBuKys7IC8vIERvbid0IHJldHVybiBhbnl0aGluZ1xuICB9KTtcbiAgcmV0dXJuIG47XG59XG5cbi8qKlxuICogSXRlcmF0ZXMgdGhyb3VnaCBjaGlsZHJlbiB0aGF0IGFyZSB0eXBpY2FsbHkgc3BlY2lmaWVkIGFzIGBwcm9wcy5jaGlsZHJlbmAuXG4gKlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNyZWFjdGNoaWxkcmVuZm9yZWFjaFxuICpcbiAqIFRoZSBwcm92aWRlZCBmb3JFYWNoRnVuYyhjaGlsZCwgaW5kZXgpIHdpbGwgYmUgY2FsbGVkIGZvciBlYWNoXG4gKiBsZWFmIGNoaWxkLlxuICpcbiAqIEBwYXJhbSB7Pyp9IGNoaWxkcmVuIENoaWxkcmVuIHRyZWUgY29udGFpbmVyLlxuICogQHBhcmFtIHtmdW5jdGlvbigqLCBpbnQpfSBmb3JFYWNoRnVuY1xuICogQHBhcmFtIHsqfSBmb3JFYWNoQ29udGV4dCBDb250ZXh0IGZvciBmb3JFYWNoQ29udGV4dC5cbiAqL1xuZnVuY3Rpb24gZm9yRWFjaENoaWxkcmVuKGNoaWxkcmVuLCBmb3JFYWNoRnVuYywgZm9yRWFjaENvbnRleHQpIHtcbiAgbWFwQ2hpbGRyZW4oY2hpbGRyZW4sIGZ1bmN0aW9uICgpIHtcbiAgICBmb3JFYWNoRnVuYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyAvLyBEb24ndCByZXR1cm4gYW55dGhpbmcuXG4gIH0sIGZvckVhY2hDb250ZXh0KTtcbn1cbi8qKlxuICogRmxhdHRlbiBhIGNoaWxkcmVuIG9iamVjdCAodHlwaWNhbGx5IHNwZWNpZmllZCBhcyBgcHJvcHMuY2hpbGRyZW5gKSBhbmRcbiAqIHJldHVybiBhbiBhcnJheSB3aXRoIGFwcHJvcHJpYXRlbHkgcmUta2V5ZWQgY2hpbGRyZW4uXG4gKlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNyZWFjdGNoaWxkcmVudG9hcnJheVxuICovXG5cblxuZnVuY3Rpb24gdG9BcnJheShjaGlsZHJlbikge1xuICByZXR1cm4gbWFwQ2hpbGRyZW4oY2hpbGRyZW4sIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgIHJldHVybiBjaGlsZDtcbiAgfSkgfHwgW107XG59XG4vKipcbiAqIFJldHVybnMgdGhlIGZpcnN0IGNoaWxkIGluIGEgY29sbGVjdGlvbiBvZiBjaGlsZHJlbiBhbmQgdmVyaWZpZXMgdGhhdCB0aGVyZVxuICogaXMgb25seSBvbmUgY2hpbGQgaW4gdGhlIGNvbGxlY3Rpb24uXG4gKlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNyZWFjdGNoaWxkcmVub25seVxuICpcbiAqIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGF0IGEgc2luZ2xlIGNoaWxkIGdldHNcbiAqIHBhc3NlZCB3aXRob3V0IGEgd3JhcHBlciwgYnV0IHRoZSBwdXJwb3NlIG9mIHRoaXMgaGVscGVyIGZ1bmN0aW9uIGlzIHRvXG4gKiBhYnN0cmFjdCBhd2F5IHRoZSBwYXJ0aWN1bGFyIHN0cnVjdHVyZSBvZiBjaGlsZHJlbi5cbiAqXG4gKiBAcGFyYW0gez9vYmplY3R9IGNoaWxkcmVuIENoaWxkIGNvbGxlY3Rpb24gc3RydWN0dXJlLlxuICogQHJldHVybiB7UmVhY3RFbGVtZW50fSBUaGUgZmlyc3QgYW5kIG9ubHkgYFJlYWN0RWxlbWVudGAgY29udGFpbmVkIGluIHRoZVxuICogc3RydWN0dXJlLlxuICovXG5cblxuZnVuY3Rpb24gb25seUNoaWxkKGNoaWxkcmVuKSB7XG4gIGlmICghaXNWYWxpZEVsZW1lbnQoY2hpbGRyZW4pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdSZWFjdC5DaGlsZHJlbi5vbmx5IGV4cGVjdGVkIHRvIHJlY2VpdmUgYSBzaW5nbGUgUmVhY3QgZWxlbWVudCBjaGlsZC4nKTtcbiAgfVxuXG4gIHJldHVybiBjaGlsZHJlbjtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQ29udGV4dChkZWZhdWx0VmFsdWUpIHtcbiAgLy8gVE9ETzogU2Vjb25kIGFyZ3VtZW50IHVzZWQgdG8gYmUgYW4gb3B0aW9uYWwgYGNhbGN1bGF0ZUNoYW5nZWRCaXRzYFxuICAvLyBmdW5jdGlvbi4gV2FybiB0byByZXNlcnZlIGZvciBmdXR1cmUgdXNlP1xuICB2YXIgY29udGV4dCA9IHtcbiAgICAkJHR5cGVvZjogUkVBQ1RfQ09OVEVYVF9UWVBFLFxuICAgIC8vIEFzIGEgd29ya2Fyb3VuZCB0byBzdXBwb3J0IG11bHRpcGxlIGNvbmN1cnJlbnQgcmVuZGVyZXJzLCB3ZSBjYXRlZ29yaXplXG4gICAgLy8gc29tZSByZW5kZXJlcnMgYXMgcHJpbWFyeSBhbmQgb3RoZXJzIGFzIHNlY29uZGFyeS4gV2Ugb25seSBleHBlY3RcbiAgICAvLyB0aGVyZSB0byBiZSB0d28gY29uY3VycmVudCByZW5kZXJlcnMgYXQgbW9zdDogUmVhY3QgTmF0aXZlIChwcmltYXJ5KSBhbmRcbiAgICAvLyBGYWJyaWMgKHNlY29uZGFyeSk7IFJlYWN0IERPTSAocHJpbWFyeSkgYW5kIFJlYWN0IEFSVCAoc2Vjb25kYXJ5KS5cbiAgICAvLyBTZWNvbmRhcnkgcmVuZGVyZXJzIHN0b3JlIHRoZWlyIGNvbnRleHQgdmFsdWVzIG9uIHNlcGFyYXRlIGZpZWxkcy5cbiAgICBfY3VycmVudFZhbHVlOiBkZWZhdWx0VmFsdWUsXG4gICAgX2N1cnJlbnRWYWx1ZTI6IGRlZmF1bHRWYWx1ZSxcbiAgICAvLyBVc2VkIHRvIHRyYWNrIGhvdyBtYW55IGNvbmN1cnJlbnQgcmVuZGVyZXJzIHRoaXMgY29udGV4dCBjdXJyZW50bHlcbiAgICAvLyBzdXBwb3J0cyB3aXRoaW4gaW4gYSBzaW5nbGUgcmVuZGVyZXIuIFN1Y2ggYXMgcGFyYWxsZWwgc2VydmVyIHJlbmRlcmluZy5cbiAgICBfdGhyZWFkQ291bnQ6IDAsXG4gICAgLy8gVGhlc2UgYXJlIGNpcmN1bGFyXG4gICAgUHJvdmlkZXI6IG51bGwsXG4gICAgQ29uc3VtZXI6IG51bGwsXG4gICAgLy8gQWRkIHRoZXNlIHRvIHVzZSBzYW1lIGhpZGRlbiBjbGFzcyBpbiBWTSBhcyBTZXJ2ZXJDb250ZXh0XG4gICAgX2RlZmF1bHRWYWx1ZTogbnVsbCxcbiAgICBfZ2xvYmFsTmFtZTogbnVsbFxuICB9O1xuICBjb250ZXh0LlByb3ZpZGVyID0ge1xuICAgICQkdHlwZW9mOiBSRUFDVF9QUk9WSURFUl9UWVBFLFxuICAgIF9jb250ZXh0OiBjb250ZXh0XG4gIH07XG4gIHZhciBoYXNXYXJuZWRBYm91dFVzaW5nTmVzdGVkQ29udGV4dENvbnN1bWVycyA9IGZhbHNlO1xuICB2YXIgaGFzV2FybmVkQWJvdXRVc2luZ0NvbnN1bWVyUHJvdmlkZXIgPSBmYWxzZTtcbiAgdmFyIGhhc1dhcm5lZEFib3V0RGlzcGxheU5hbWVPbkNvbnN1bWVyID0gZmFsc2U7XG5cbiAge1xuICAgIC8vIEEgc2VwYXJhdGUgb2JqZWN0LCBidXQgcHJveGllcyBiYWNrIHRvIHRoZSBvcmlnaW5hbCBjb250ZXh0IG9iamVjdCBmb3JcbiAgICAvLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gSXQgaGFzIGEgZGlmZmVyZW50ICQkdHlwZW9mLCBzbyB3ZSBjYW4gcHJvcGVybHlcbiAgICAvLyB3YXJuIGZvciB0aGUgaW5jb3JyZWN0IHVzYWdlIG9mIENvbnRleHQgYXMgYSBDb25zdW1lci5cbiAgICB2YXIgQ29uc3VtZXIgPSB7XG4gICAgICAkJHR5cGVvZjogUkVBQ1RfQ09OVEVYVF9UWVBFLFxuICAgICAgX2NvbnRleHQ6IGNvbnRleHRcbiAgICB9OyAvLyAkRmxvd0ZpeE1lOiBGbG93IGNvbXBsYWlucyBhYm91dCBub3Qgc2V0dGluZyBhIHZhbHVlLCB3aGljaCBpcyBpbnRlbnRpb25hbCBoZXJlXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhDb25zdW1lciwge1xuICAgICAgUHJvdmlkZXI6IHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKCFoYXNXYXJuZWRBYm91dFVzaW5nQ29uc3VtZXJQcm92aWRlcikge1xuICAgICAgICAgICAgaGFzV2FybmVkQWJvdXRVc2luZ0NvbnN1bWVyUHJvdmlkZXIgPSB0cnVlO1xuXG4gICAgICAgICAgICBlcnJvcignUmVuZGVyaW5nIDxDb250ZXh0LkNvbnN1bWVyLlByb3ZpZGVyPiBpcyBub3Qgc3VwcG9ydGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gJyArICdhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiBEaWQgeW91IG1lYW4gdG8gcmVuZGVyIDxDb250ZXh0LlByb3ZpZGVyPiBpbnN0ZWFkPycpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBjb250ZXh0LlByb3ZpZGVyO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChfUHJvdmlkZXIpIHtcbiAgICAgICAgICBjb250ZXh0LlByb3ZpZGVyID0gX1Byb3ZpZGVyO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgX2N1cnJlbnRWYWx1ZToge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gY29udGV4dC5fY3VycmVudFZhbHVlO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChfY3VycmVudFZhbHVlKSB7XG4gICAgICAgICAgY29udGV4dC5fY3VycmVudFZhbHVlID0gX2N1cnJlbnRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIF9jdXJyZW50VmFsdWUyOiB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBjb250ZXh0Ll9jdXJyZW50VmFsdWUyO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChfY3VycmVudFZhbHVlMikge1xuICAgICAgICAgIGNvbnRleHQuX2N1cnJlbnRWYWx1ZTIgPSBfY3VycmVudFZhbHVlMjtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIF90aHJlYWRDb3VudDoge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gY29udGV4dC5fdGhyZWFkQ291bnQ7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKF90aHJlYWRDb3VudCkge1xuICAgICAgICAgIGNvbnRleHQuX3RocmVhZENvdW50ID0gX3RocmVhZENvdW50O1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgQ29uc3VtZXI6IHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKCFoYXNXYXJuZWRBYm91dFVzaW5nTmVzdGVkQ29udGV4dENvbnN1bWVycykge1xuICAgICAgICAgICAgaGFzV2FybmVkQWJvdXRVc2luZ05lc3RlZENvbnRleHRDb25zdW1lcnMgPSB0cnVlO1xuXG4gICAgICAgICAgICBlcnJvcignUmVuZGVyaW5nIDxDb250ZXh0LkNvbnN1bWVyLkNvbnN1bWVyPiBpcyBub3Qgc3VwcG9ydGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gJyArICdhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiBEaWQgeW91IG1lYW4gdG8gcmVuZGVyIDxDb250ZXh0LkNvbnN1bWVyPiBpbnN0ZWFkPycpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBjb250ZXh0LkNvbnN1bWVyO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZGlzcGxheU5hbWU6IHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbnRleHQuZGlzcGxheU5hbWU7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKGRpc3BsYXlOYW1lKSB7XG4gICAgICAgICAgaWYgKCFoYXNXYXJuZWRBYm91dERpc3BsYXlOYW1lT25Db25zdW1lcikge1xuICAgICAgICAgICAgd2FybignU2V0dGluZyBgZGlzcGxheU5hbWVgIG9uIENvbnRleHQuQ29uc3VtZXIgaGFzIG5vIGVmZmVjdC4gJyArIFwiWW91IHNob3VsZCBzZXQgaXQgZGlyZWN0bHkgb24gdGhlIGNvbnRleHQgd2l0aCBDb250ZXh0LmRpc3BsYXlOYW1lID0gJyVzJy5cIiwgZGlzcGxheU5hbWUpO1xuXG4gICAgICAgICAgICBoYXNXYXJuZWRBYm91dERpc3BsYXlOYW1lT25Db25zdW1lciA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7IC8vICRGbG93Rml4TWU6IEZsb3cgY29tcGxhaW5zIGFib3V0IG1pc3NpbmcgcHJvcGVydGllcyBiZWNhdXNlIGl0IGRvZXNuJ3QgdW5kZXJzdGFuZCBkZWZpbmVQcm9wZXJ0eVxuXG4gICAgY29udGV4dC5Db25zdW1lciA9IENvbnN1bWVyO1xuICB9XG5cbiAge1xuICAgIGNvbnRleHQuX2N1cnJlbnRSZW5kZXJlciA9IG51bGw7XG4gICAgY29udGV4dC5fY3VycmVudFJlbmRlcmVyMiA9IG51bGw7XG4gIH1cblxuICByZXR1cm4gY29udGV4dDtcbn1cblxudmFyIFVuaW5pdGlhbGl6ZWQgPSAtMTtcbnZhciBQZW5kaW5nID0gMDtcbnZhciBSZXNvbHZlZCA9IDE7XG52YXIgUmVqZWN0ZWQgPSAyO1xuXG5mdW5jdGlvbiBsYXp5SW5pdGlhbGl6ZXIocGF5bG9hZCkge1xuICBpZiAocGF5bG9hZC5fc3RhdHVzID09PSBVbmluaXRpYWxpemVkKSB7XG4gICAgdmFyIGN0b3IgPSBwYXlsb2FkLl9yZXN1bHQ7XG4gICAgdmFyIHRoZW5hYmxlID0gY3RvcigpOyAvLyBUcmFuc2l0aW9uIHRvIHRoZSBuZXh0IHN0YXRlLlxuICAgIC8vIFRoaXMgbWlnaHQgdGhyb3cgZWl0aGVyIGJlY2F1c2UgaXQncyBtaXNzaW5nIG9yIHRocm93cy4gSWYgc28sIHdlIHRyZWF0IGl0XG4gICAgLy8gYXMgc3RpbGwgdW5pbml0aWFsaXplZCBhbmQgdHJ5IGFnYWluIG5leHQgdGltZS4gV2hpY2ggaXMgdGhlIHNhbWUgYXMgd2hhdFxuICAgIC8vIGhhcHBlbnMgaWYgdGhlIGN0b3Igb3IgYW55IHdyYXBwZXJzIHByb2Nlc3NpbmcgdGhlIGN0b3IgdGhyb3dzLiBUaGlzIG1pZ2h0XG4gICAgLy8gZW5kIHVwIGZpeGluZyBpdCBpZiB0aGUgcmVzb2x1dGlvbiB3YXMgYSBjb25jdXJyZW5jeSBidWcuXG5cbiAgICB0aGVuYWJsZS50aGVuKGZ1bmN0aW9uIChtb2R1bGVPYmplY3QpIHtcbiAgICAgIGlmIChwYXlsb2FkLl9zdGF0dXMgPT09IFBlbmRpbmcgfHwgcGF5bG9hZC5fc3RhdHVzID09PSBVbmluaXRpYWxpemVkKSB7XG4gICAgICAgIC8vIFRyYW5zaXRpb24gdG8gdGhlIG5leHQgc3RhdGUuXG4gICAgICAgIHZhciByZXNvbHZlZCA9IHBheWxvYWQ7XG4gICAgICAgIHJlc29sdmVkLl9zdGF0dXMgPSBSZXNvbHZlZDtcbiAgICAgICAgcmVzb2x2ZWQuX3Jlc3VsdCA9IG1vZHVsZU9iamVjdDtcbiAgICAgIH1cbiAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgIGlmIChwYXlsb2FkLl9zdGF0dXMgPT09IFBlbmRpbmcgfHwgcGF5bG9hZC5fc3RhdHVzID09PSBVbmluaXRpYWxpemVkKSB7XG4gICAgICAgIC8vIFRyYW5zaXRpb24gdG8gdGhlIG5leHQgc3RhdGUuXG4gICAgICAgIHZhciByZWplY3RlZCA9IHBheWxvYWQ7XG4gICAgICAgIHJlamVjdGVkLl9zdGF0dXMgPSBSZWplY3RlZDtcbiAgICAgICAgcmVqZWN0ZWQuX3Jlc3VsdCA9IGVycm9yO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKHBheWxvYWQuX3N0YXR1cyA9PT0gVW5pbml0aWFsaXplZCkge1xuICAgICAgLy8gSW4gY2FzZSwgd2UncmUgc3RpbGwgdW5pbml0aWFsaXplZCwgdGhlbiB3ZSdyZSB3YWl0aW5nIGZvciB0aGUgdGhlbmFibGVcbiAgICAgIC8vIHRvIHJlc29sdmUuIFNldCBpdCBhcyBwZW5kaW5nIGluIHRoZSBtZWFudGltZS5cbiAgICAgIHZhciBwZW5kaW5nID0gcGF5bG9hZDtcbiAgICAgIHBlbmRpbmcuX3N0YXR1cyA9IFBlbmRpbmc7XG4gICAgICBwZW5kaW5nLl9yZXN1bHQgPSB0aGVuYWJsZTtcbiAgICB9XG4gIH1cblxuICBpZiAocGF5bG9hZC5fc3RhdHVzID09PSBSZXNvbHZlZCkge1xuICAgIHZhciBtb2R1bGVPYmplY3QgPSBwYXlsb2FkLl9yZXN1bHQ7XG5cbiAgICB7XG4gICAgICBpZiAobW9kdWxlT2JqZWN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZXJyb3IoJ2xhenk6IEV4cGVjdGVkIHRoZSByZXN1bHQgb2YgYSBkeW5hbWljIGltcCcgKyAnb3J0KCkgY2FsbC4gJyArICdJbnN0ZWFkIHJlY2VpdmVkOiAlc1xcblxcbllvdXIgY29kZSBzaG91bGQgbG9vayBsaWtlOiBcXG4gICcgKyAvLyBCcmVhayB1cCBpbXBvcnRzIHRvIGF2b2lkIGFjY2lkZW50YWxseSBwYXJzaW5nIHRoZW0gYXMgZGVwZW5kZW5jaWVzLlxuICAgICAgICAnY29uc3QgTXlDb21wb25lbnQgPSBsYXp5KCgpID0+IGltcCcgKyBcIm9ydCgnLi9NeUNvbXBvbmVudCcpKVxcblxcblwiICsgJ0RpZCB5b3UgYWNjaWRlbnRhbGx5IHB1dCBjdXJseSBicmFjZXMgYXJvdW5kIHRoZSBpbXBvcnQ/JywgbW9kdWxlT2JqZWN0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB7XG4gICAgICBpZiAoISgnZGVmYXVsdCcgaW4gbW9kdWxlT2JqZWN0KSkge1xuICAgICAgICBlcnJvcignbGF6eTogRXhwZWN0ZWQgdGhlIHJlc3VsdCBvZiBhIGR5bmFtaWMgaW1wJyArICdvcnQoKSBjYWxsLiAnICsgJ0luc3RlYWQgcmVjZWl2ZWQ6ICVzXFxuXFxuWW91ciBjb2RlIHNob3VsZCBsb29rIGxpa2U6IFxcbiAgJyArIC8vIEJyZWFrIHVwIGltcG9ydHMgdG8gYXZvaWQgYWNjaWRlbnRhbGx5IHBhcnNpbmcgdGhlbSBhcyBkZXBlbmRlbmNpZXMuXG4gICAgICAgICdjb25zdCBNeUNvbXBvbmVudCA9IGxhenkoKCkgPT4gaW1wJyArIFwib3J0KCcuL015Q29tcG9uZW50JykpXCIsIG1vZHVsZU9iamVjdCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1vZHVsZU9iamVjdC5kZWZhdWx0O1xuICB9IGVsc2Uge1xuICAgIHRocm93IHBheWxvYWQuX3Jlc3VsdDtcbiAgfVxufVxuXG5mdW5jdGlvbiBsYXp5KGN0b3IpIHtcbiAgdmFyIHBheWxvYWQgPSB7XG4gICAgLy8gV2UgdXNlIHRoZXNlIGZpZWxkcyB0byBzdG9yZSB0aGUgcmVzdWx0LlxuICAgIF9zdGF0dXM6IFVuaW5pdGlhbGl6ZWQsXG4gICAgX3Jlc3VsdDogY3RvclxuICB9O1xuICB2YXIgbGF6eVR5cGUgPSB7XG4gICAgJCR0eXBlb2Y6IFJFQUNUX0xBWllfVFlQRSxcbiAgICBfcGF5bG9hZDogcGF5bG9hZCxcbiAgICBfaW5pdDogbGF6eUluaXRpYWxpemVyXG4gIH07XG5cbiAge1xuICAgIC8vIEluIHByb2R1Y3Rpb24sIHRoaXMgd291bGQganVzdCBzZXQgaXQgb24gdGhlIG9iamVjdC5cbiAgICB2YXIgZGVmYXVsdFByb3BzO1xuICAgIHZhciBwcm9wVHlwZXM7IC8vICRGbG93Rml4TWVcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGxhenlUeXBlLCB7XG4gICAgICBkZWZhdWx0UHJvcHM6IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gZGVmYXVsdFByb3BzO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChuZXdEZWZhdWx0UHJvcHMpIHtcbiAgICAgICAgICBlcnJvcignUmVhY3QubGF6eSguLi4pOiBJdCBpcyBub3Qgc3VwcG9ydGVkIHRvIGFzc2lnbiBgZGVmYXVsdFByb3BzYCB0byAnICsgJ2EgbGF6eSBjb21wb25lbnQgaW1wb3J0LiBFaXRoZXIgc3BlY2lmeSB0aGVtIHdoZXJlIHRoZSBjb21wb25lbnQgJyArICdpcyBkZWZpbmVkLCBvciBjcmVhdGUgYSB3cmFwcGluZyBjb21wb25lbnQgYXJvdW5kIGl0LicpO1xuXG4gICAgICAgICAgZGVmYXVsdFByb3BzID0gbmV3RGVmYXVsdFByb3BzOyAvLyBNYXRjaCBwcm9kdWN0aW9uIGJlaGF2aW9yIG1vcmUgY2xvc2VseTpcbiAgICAgICAgICAvLyAkRmxvd0ZpeE1lXG5cbiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobGF6eVR5cGUsICdkZWZhdWx0UHJvcHMnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBwcm9wVHlwZXM6IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gcHJvcFR5cGVzO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChuZXdQcm9wVHlwZXMpIHtcbiAgICAgICAgICBlcnJvcignUmVhY3QubGF6eSguLi4pOiBJdCBpcyBub3Qgc3VwcG9ydGVkIHRvIGFzc2lnbiBgcHJvcFR5cGVzYCB0byAnICsgJ2EgbGF6eSBjb21wb25lbnQgaW1wb3J0LiBFaXRoZXIgc3BlY2lmeSB0aGVtIHdoZXJlIHRoZSBjb21wb25lbnQgJyArICdpcyBkZWZpbmVkLCBvciBjcmVhdGUgYSB3cmFwcGluZyBjb21wb25lbnQgYXJvdW5kIGl0LicpO1xuXG4gICAgICAgICAgcHJvcFR5cGVzID0gbmV3UHJvcFR5cGVzOyAvLyBNYXRjaCBwcm9kdWN0aW9uIGJlaGF2aW9yIG1vcmUgY2xvc2VseTpcbiAgICAgICAgICAvLyAkRmxvd0ZpeE1lXG5cbiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobGF6eVR5cGUsICdwcm9wVHlwZXMnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBsYXp5VHlwZTtcbn1cblxuZnVuY3Rpb24gZm9yd2FyZFJlZihyZW5kZXIpIHtcbiAge1xuICAgIGlmIChyZW5kZXIgIT0gbnVsbCAmJiByZW5kZXIuJCR0eXBlb2YgPT09IFJFQUNUX01FTU9fVFlQRSkge1xuICAgICAgZXJyb3IoJ2ZvcndhcmRSZWYgcmVxdWlyZXMgYSByZW5kZXIgZnVuY3Rpb24gYnV0IHJlY2VpdmVkIGEgYG1lbW9gICcgKyAnY29tcG9uZW50LiBJbnN0ZWFkIG9mIGZvcndhcmRSZWYobWVtbyguLi4pKSwgdXNlICcgKyAnbWVtbyhmb3J3YXJkUmVmKC4uLikpLicpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHJlbmRlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJ2ZvcndhcmRSZWYgcmVxdWlyZXMgYSByZW5kZXIgZnVuY3Rpb24gYnV0IHdhcyBnaXZlbiAlcy4nLCByZW5kZXIgPT09IG51bGwgPyAnbnVsbCcgOiB0eXBlb2YgcmVuZGVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHJlbmRlci5sZW5ndGggIT09IDAgJiYgcmVuZGVyLmxlbmd0aCAhPT0gMikge1xuICAgICAgICBlcnJvcignZm9yd2FyZFJlZiByZW5kZXIgZnVuY3Rpb25zIGFjY2VwdCBleGFjdGx5IHR3byBwYXJhbWV0ZXJzOiBwcm9wcyBhbmQgcmVmLiAlcycsIHJlbmRlci5sZW5ndGggPT09IDEgPyAnRGlkIHlvdSBmb3JnZXQgdG8gdXNlIHRoZSByZWYgcGFyYW1ldGVyPycgOiAnQW55IGFkZGl0aW9uYWwgcGFyYW1ldGVyIHdpbGwgYmUgdW5kZWZpbmVkLicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChyZW5kZXIgIT0gbnVsbCkge1xuICAgICAgaWYgKHJlbmRlci5kZWZhdWx0UHJvcHMgIT0gbnVsbCB8fCByZW5kZXIucHJvcFR5cGVzICE9IG51bGwpIHtcbiAgICAgICAgZXJyb3IoJ2ZvcndhcmRSZWYgcmVuZGVyIGZ1bmN0aW9ucyBkbyBub3Qgc3VwcG9ydCBwcm9wVHlwZXMgb3IgZGVmYXVsdFByb3BzLiAnICsgJ0RpZCB5b3UgYWNjaWRlbnRhbGx5IHBhc3MgYSBSZWFjdCBjb21wb25lbnQ/Jyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIGVsZW1lbnRUeXBlID0ge1xuICAgICQkdHlwZW9mOiBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFLFxuICAgIHJlbmRlcjogcmVuZGVyXG4gIH07XG5cbiAge1xuICAgIHZhciBvd25OYW1lO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50VHlwZSwgJ2Rpc3BsYXlOYW1lJywge1xuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG93bk5hbWU7XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICBvd25OYW1lID0gbmFtZTsgLy8gVGhlIGlubmVyIGNvbXBvbmVudCBzaG91bGRuJ3QgaW5oZXJpdCB0aGlzIGRpc3BsYXkgbmFtZSBpbiBtb3N0IGNhc2VzLFxuICAgICAgICAvLyBiZWNhdXNlIHRoZSBjb21wb25lbnQgbWF5IGJlIHVzZWQgZWxzZXdoZXJlLlxuICAgICAgICAvLyBCdXQgaXQncyBuaWNlIGZvciBhbm9ueW1vdXMgZnVuY3Rpb25zIHRvIGluaGVyaXQgdGhlIG5hbWUsXG4gICAgICAgIC8vIHNvIHRoYXQgb3VyIGNvbXBvbmVudC1zdGFjayBnZW5lcmF0aW9uIGxvZ2ljIHdpbGwgZGlzcGxheSB0aGVpciBmcmFtZXMuXG4gICAgICAgIC8vIEFuIGFub255bW91cyBmdW5jdGlvbiBnZW5lcmFsbHkgc3VnZ2VzdHMgYSBwYXR0ZXJuIGxpa2U6XG4gICAgICAgIC8vICAgUmVhY3QuZm9yd2FyZFJlZigocHJvcHMsIHJlZikgPT4gey4uLn0pO1xuICAgICAgICAvLyBUaGlzIGtpbmQgb2YgaW5uZXIgZnVuY3Rpb24gaXMgbm90IHVzZWQgZWxzZXdoZXJlIHNvIHRoZSBzaWRlIGVmZmVjdCBpcyBva2F5LlxuXG4gICAgICAgIGlmICghcmVuZGVyLm5hbWUgJiYgIXJlbmRlci5kaXNwbGF5TmFtZSkge1xuICAgICAgICAgIHJlbmRlci5kaXNwbGF5TmFtZSA9IG5hbWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50VHlwZTtcbn1cblxudmFyIFJFQUNUX01PRFVMRV9SRUZFUkVOQ0U7XG5cbntcbiAgUkVBQ1RfTU9EVUxFX1JFRkVSRU5DRSA9IFN5bWJvbC5mb3IoJ3JlYWN0Lm1vZHVsZS5yZWZlcmVuY2UnKTtcbn1cblxuZnVuY3Rpb24gaXNWYWxpZEVsZW1lbnRUeXBlKHR5cGUpIHtcbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9IC8vIE5vdGU6IHR5cGVvZiBtaWdodCBiZSBvdGhlciB0aGFuICdzeW1ib2wnIG9yICdudW1iZXInIChlLmcuIGlmIGl0J3MgYSBwb2x5ZmlsbCkuXG5cblxuICBpZiAodHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9QUk9GSUxFUl9UWVBFIHx8IGVuYWJsZURlYnVnVHJhY2luZyAgfHwgdHlwZSA9PT0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSB8fCBlbmFibGVMZWdhY3lIaWRkZW4gIHx8IHR5cGUgPT09IFJFQUNUX09GRlNDUkVFTl9UWVBFIHx8IGVuYWJsZVNjb3BlQVBJICB8fCBlbmFibGVDYWNoZUVsZW1lbnQgIHx8IGVuYWJsZVRyYW5zaXRpb25UcmFjaW5nICkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiB0eXBlICE9PSBudWxsKSB7XG4gICAgaWYgKHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0xBWllfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfUFJPVklERVJfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9DT05URVhUX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSB8fCAvLyBUaGlzIG5lZWRzIHRvIGluY2x1ZGUgYWxsIHBvc3NpYmxlIG1vZHVsZSByZWZlcmVuY2Ugb2JqZWN0XG4gICAgLy8gdHlwZXMgc3VwcG9ydGVkIGJ5IGFueSBGbGlnaHQgY29uZmlndXJhdGlvbiBhbnl3aGVyZSBzaW5jZVxuICAgIC8vIHdlIGRvbid0IGtub3cgd2hpY2ggRmxpZ2h0IGJ1aWxkIHRoaXMgd2lsbCBlbmQgdXAgYmVpbmcgdXNlZFxuICAgIC8vIHdpdGguXG4gICAgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTU9EVUxFX1JFRkVSRU5DRSB8fCB0eXBlLmdldE1vZHVsZUlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gbWVtbyh0eXBlLCBjb21wYXJlKSB7XG4gIHtcbiAgICBpZiAoIWlzVmFsaWRFbGVtZW50VHlwZSh0eXBlKSkge1xuICAgICAgZXJyb3IoJ21lbW86IFRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgY29tcG9uZW50LiBJbnN0ZWFkICcgKyAncmVjZWl2ZWQ6ICVzJywgdHlwZSA9PT0gbnVsbCA/ICdudWxsJyA6IHR5cGVvZiB0eXBlKTtcbiAgICB9XG4gIH1cblxuICB2YXIgZWxlbWVudFR5cGUgPSB7XG4gICAgJCR0eXBlb2Y6IFJFQUNUX01FTU9fVFlQRSxcbiAgICB0eXBlOiB0eXBlLFxuICAgIGNvbXBhcmU6IGNvbXBhcmUgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjb21wYXJlXG4gIH07XG5cbiAge1xuICAgIHZhciBvd25OYW1lO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50VHlwZSwgJ2Rpc3BsYXlOYW1lJywge1xuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG93bk5hbWU7XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICBvd25OYW1lID0gbmFtZTsgLy8gVGhlIGlubmVyIGNvbXBvbmVudCBzaG91bGRuJ3QgaW5oZXJpdCB0aGlzIGRpc3BsYXkgbmFtZSBpbiBtb3N0IGNhc2VzLFxuICAgICAgICAvLyBiZWNhdXNlIHRoZSBjb21wb25lbnQgbWF5IGJlIHVzZWQgZWxzZXdoZXJlLlxuICAgICAgICAvLyBCdXQgaXQncyBuaWNlIGZvciBhbm9ueW1vdXMgZnVuY3Rpb25zIHRvIGluaGVyaXQgdGhlIG5hbWUsXG4gICAgICAgIC8vIHNvIHRoYXQgb3VyIGNvbXBvbmVudC1zdGFjayBnZW5lcmF0aW9uIGxvZ2ljIHdpbGwgZGlzcGxheSB0aGVpciBmcmFtZXMuXG4gICAgICAgIC8vIEFuIGFub255bW91cyBmdW5jdGlvbiBnZW5lcmFsbHkgc3VnZ2VzdHMgYSBwYXR0ZXJuIGxpa2U6XG4gICAgICAgIC8vICAgUmVhY3QubWVtbygocHJvcHMpID0+IHsuLi59KTtcbiAgICAgICAgLy8gVGhpcyBraW5kIG9mIGlubmVyIGZ1bmN0aW9uIGlzIG5vdCB1c2VkIGVsc2V3aGVyZSBzbyB0aGUgc2lkZSBlZmZlY3QgaXMgb2theS5cblxuICAgICAgICBpZiAoIXR5cGUubmFtZSAmJiAhdHlwZS5kaXNwbGF5TmFtZSkge1xuICAgICAgICAgIHR5cGUuZGlzcGxheU5hbWUgPSBuYW1lO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gZWxlbWVudFR5cGU7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVEaXNwYXRjaGVyKCkge1xuICB2YXIgZGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIuY3VycmVudDtcblxuICB7XG4gICAgaWYgKGRpc3BhdGNoZXIgPT09IG51bGwpIHtcbiAgICAgIGVycm9yKCdJbnZhbGlkIGhvb2sgY2FsbC4gSG9va3MgY2FuIG9ubHkgYmUgY2FsbGVkIGluc2lkZSBvZiB0aGUgYm9keSBvZiBhIGZ1bmN0aW9uIGNvbXBvbmVudC4gVGhpcyBjb3VsZCBoYXBwZW4gZm9yJyArICcgb25lIG9mIHRoZSBmb2xsb3dpbmcgcmVhc29uczpcXG4nICsgJzEuIFlvdSBtaWdodCBoYXZlIG1pc21hdGNoaW5nIHZlcnNpb25zIG9mIFJlYWN0IGFuZCB0aGUgcmVuZGVyZXIgKHN1Y2ggYXMgUmVhY3QgRE9NKVxcbicgKyAnMi4gWW91IG1pZ2h0IGJlIGJyZWFraW5nIHRoZSBSdWxlcyBvZiBIb29rc1xcbicgKyAnMy4gWW91IG1pZ2h0IGhhdmUgbW9yZSB0aGFuIG9uZSBjb3B5IG9mIFJlYWN0IGluIHRoZSBzYW1lIGFwcFxcbicgKyAnU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9pbnZhbGlkLWhvb2stY2FsbCBmb3IgdGlwcyBhYm91dCBob3cgdG8gZGVidWcgYW5kIGZpeCB0aGlzIHByb2JsZW0uJyk7XG4gICAgfVxuICB9IC8vIFdpbGwgcmVzdWx0IGluIGEgbnVsbCBhY2Nlc3MgZXJyb3IgaWYgYWNjZXNzZWQgb3V0c2lkZSByZW5kZXIgcGhhc2UuIFdlXG4gIC8vIGludGVudGlvbmFsbHkgZG9uJ3QgdGhyb3cgb3VyIG93biBlcnJvciBiZWNhdXNlIHRoaXMgaXMgaW4gYSBob3QgcGF0aC5cbiAgLy8gQWxzbyBoZWxwcyBlbnN1cmUgdGhpcyBpcyBpbmxpbmVkLlxuXG5cbiAgcmV0dXJuIGRpc3BhdGNoZXI7XG59XG5mdW5jdGlvbiB1c2VDb250ZXh0KENvbnRleHQpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuXG4gIHtcbiAgICAvLyBUT0RPOiBhZGQgYSBtb3JlIGdlbmVyaWMgd2FybmluZyBmb3IgaW52YWxpZCB2YWx1ZXMuXG4gICAgaWYgKENvbnRleHQuX2NvbnRleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIHJlYWxDb250ZXh0ID0gQ29udGV4dC5fY29udGV4dDsgLy8gRG9uJ3QgZGVkdXBsaWNhdGUgYmVjYXVzZSB0aGlzIGxlZ2l0aW1hdGVseSBjYXVzZXMgYnVnc1xuICAgICAgLy8gYW5kIG5vYm9keSBzaG91bGQgYmUgdXNpbmcgdGhpcyBpbiBleGlzdGluZyBjb2RlLlxuXG4gICAgICBpZiAocmVhbENvbnRleHQuQ29uc3VtZXIgPT09IENvbnRleHQpIHtcbiAgICAgICAgZXJyb3IoJ0NhbGxpbmcgdXNlQ29udGV4dChDb250ZXh0LkNvbnN1bWVyKSBpcyBub3Qgc3VwcG9ydGVkLCBtYXkgY2F1c2UgYnVncywgYW5kIHdpbGwgYmUgJyArICdyZW1vdmVkIGluIGEgZnV0dXJlIG1ham9yIHJlbGVhc2UuIERpZCB5b3UgbWVhbiB0byBjYWxsIHVzZUNvbnRleHQoQ29udGV4dCkgaW5zdGVhZD8nKTtcbiAgICAgIH0gZWxzZSBpZiAocmVhbENvbnRleHQuUHJvdmlkZXIgPT09IENvbnRleHQpIHtcbiAgICAgICAgZXJyb3IoJ0NhbGxpbmcgdXNlQ29udGV4dChDb250ZXh0LlByb3ZpZGVyKSBpcyBub3Qgc3VwcG9ydGVkLiAnICsgJ0RpZCB5b3UgbWVhbiB0byBjYWxsIHVzZUNvbnRleHQoQ29udGV4dCkgaW5zdGVhZD8nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZGlzcGF0Y2hlci51c2VDb250ZXh0KENvbnRleHQpO1xufVxuZnVuY3Rpb24gdXNlU3RhdGUoaW5pdGlhbFN0YXRlKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlU3RhdGUoaW5pdGlhbFN0YXRlKTtcbn1cbmZ1bmN0aW9uIHVzZVJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZVJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCk7XG59XG5mdW5jdGlvbiB1c2VSZWYoaW5pdGlhbFZhbHVlKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlUmVmKGluaXRpYWxWYWx1ZSk7XG59XG5mdW5jdGlvbiB1c2VFZmZlY3QoY3JlYXRlLCBkZXBzKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlRWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG59XG5mdW5jdGlvbiB1c2VJbnNlcnRpb25FZmZlY3QoY3JlYXRlLCBkZXBzKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlSW5zZXJ0aW9uRWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG59XG5mdW5jdGlvbiB1c2VMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlTGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG59XG5mdW5jdGlvbiB1c2VDYWxsYmFjayhjYWxsYmFjaywgZGVwcykge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZUNhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKTtcbn1cbmZ1bmN0aW9uIHVzZU1lbW8oY3JlYXRlLCBkZXBzKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlTWVtbyhjcmVhdGUsIGRlcHMpO1xufVxuZnVuY3Rpb24gdXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcykge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xufVxuZnVuY3Rpb24gdXNlRGVidWdWYWx1ZSh2YWx1ZSwgZm9ybWF0dGVyRm4pIHtcbiAge1xuICAgIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgICByZXR1cm4gZGlzcGF0Y2hlci51c2VEZWJ1Z1ZhbHVlKHZhbHVlLCBmb3JtYXR0ZXJGbik7XG4gIH1cbn1cbmZ1bmN0aW9uIHVzZVRyYW5zaXRpb24oKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlVHJhbnNpdGlvbigpO1xufVxuZnVuY3Rpb24gdXNlRGVmZXJyZWRWYWx1ZSh2YWx1ZSkge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZURlZmVycmVkVmFsdWUodmFsdWUpO1xufVxuZnVuY3Rpb24gdXNlSWQoKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlSWQoKTtcbn1cbmZ1bmN0aW9uIHVzZVN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlU3luY0V4dGVybmFsU3RvcmUoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpO1xufVxuXG4vLyBIZWxwZXJzIHRvIHBhdGNoIGNvbnNvbGUubG9ncyB0byBhdm9pZCBsb2dnaW5nIGR1cmluZyBzaWRlLWVmZmVjdCBmcmVlXG4vLyByZXBsYXlpbmcgb24gcmVuZGVyIGZ1bmN0aW9uLiBUaGlzIGN1cnJlbnRseSBvbmx5IHBhdGNoZXMgdGhlIG9iamVjdFxuLy8gbGF6aWx5IHdoaWNoIHdvbid0IGNvdmVyIGlmIHRoZSBsb2cgZnVuY3Rpb24gd2FzIGV4dHJhY3RlZCBlYWdlcmx5LlxuLy8gV2UgY291bGQgYWxzbyBlYWdlcmx5IHBhdGNoIHRoZSBtZXRob2QuXG52YXIgZGlzYWJsZWREZXB0aCA9IDA7XG52YXIgcHJldkxvZztcbnZhciBwcmV2SW5mbztcbnZhciBwcmV2V2FybjtcbnZhciBwcmV2RXJyb3I7XG52YXIgcHJldkdyb3VwO1xudmFyIHByZXZHcm91cENvbGxhcHNlZDtcbnZhciBwcmV2R3JvdXBFbmQ7XG5cbmZ1bmN0aW9uIGRpc2FibGVkTG9nKCkge31cblxuZGlzYWJsZWRMb2cuX19yZWFjdERpc2FibGVkTG9nID0gdHJ1ZTtcbmZ1bmN0aW9uIGRpc2FibGVMb2dzKCkge1xuICB7XG4gICAgaWYgKGRpc2FibGVkRGVwdGggPT09IDApIHtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgICAgcHJldkxvZyA9IGNvbnNvbGUubG9nO1xuICAgICAgcHJldkluZm8gPSBjb25zb2xlLmluZm87XG4gICAgICBwcmV2V2FybiA9IGNvbnNvbGUud2FybjtcbiAgICAgIHByZXZFcnJvciA9IGNvbnNvbGUuZXJyb3I7XG4gICAgICBwcmV2R3JvdXAgPSBjb25zb2xlLmdyb3VwO1xuICAgICAgcHJldkdyb3VwQ29sbGFwc2VkID0gY29uc29sZS5ncm91cENvbGxhcHNlZDtcbiAgICAgIHByZXZHcm91cEVuZCA9IGNvbnNvbGUuZ3JvdXBFbmQ7IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTkwOTlcblxuICAgICAgdmFyIHByb3BzID0ge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlOiBkaXNhYmxlZExvZyxcbiAgICAgICAgd3JpdGFibGU6IHRydWVcbiAgICAgIH07IC8vICRGbG93Rml4TWUgRmxvdyB0aGlua3MgY29uc29sZSBpcyBpbW11dGFibGUuXG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGNvbnNvbGUsIHtcbiAgICAgICAgaW5mbzogcHJvcHMsXG4gICAgICAgIGxvZzogcHJvcHMsXG4gICAgICAgIHdhcm46IHByb3BzLFxuICAgICAgICBlcnJvcjogcHJvcHMsXG4gICAgICAgIGdyb3VwOiBwcm9wcyxcbiAgICAgICAgZ3JvdXBDb2xsYXBzZWQ6IHByb3BzLFxuICAgICAgICBncm91cEVuZDogcHJvcHNcbiAgICAgIH0pO1xuICAgICAgLyogZXNsaW50LWVuYWJsZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmcgKi9cbiAgICB9XG5cbiAgICBkaXNhYmxlZERlcHRoKys7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlZW5hYmxlTG9ncygpIHtcbiAge1xuICAgIGRpc2FibGVkRGVwdGgtLTtcblxuICAgIGlmIChkaXNhYmxlZERlcHRoID09PSAwKSB7XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmcgKi9cbiAgICAgIHZhciBwcm9wcyA9IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgfTsgLy8gJEZsb3dGaXhNZSBGbG93IHRoaW5rcyBjb25zb2xlIGlzIGltbXV0YWJsZS5cblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoY29uc29sZSwge1xuICAgICAgICBsb2c6IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkxvZ1xuICAgICAgICB9KSxcbiAgICAgICAgaW5mbzogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2SW5mb1xuICAgICAgICB9KSxcbiAgICAgICAgd2FybjogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2V2FyblxuICAgICAgICB9KSxcbiAgICAgICAgZXJyb3I6IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkVycm9yXG4gICAgICAgIH0pLFxuICAgICAgICBncm91cDogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2R3JvdXBcbiAgICAgICAgfSksXG4gICAgICAgIGdyb3VwQ29sbGFwc2VkOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZHcm91cENvbGxhcHNlZFxuICAgICAgICB9KSxcbiAgICAgICAgZ3JvdXBFbmQ6IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkdyb3VwRW5kXG4gICAgICAgIH0pXG4gICAgICB9KTtcbiAgICAgIC8qIGVzbGludC1lbmFibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovXG4gICAgfVxuXG4gICAgaWYgKGRpc2FibGVkRGVwdGggPCAwKSB7XG4gICAgICBlcnJvcignZGlzYWJsZWREZXB0aCBmZWxsIGJlbG93IHplcm8uICcgKyAnVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuICB9XG59XG5cbnZhciBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnREaXNwYXRjaGVyO1xudmFyIHByZWZpeDtcbmZ1bmN0aW9uIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKG5hbWUsIHNvdXJjZSwgb3duZXJGbikge1xuICB7XG4gICAgaWYgKHByZWZpeCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBFeHRyYWN0IHRoZSBWTSBzcGVjaWZpYyBwcmVmaXggdXNlZCBieSBlYWNoIGxpbmUuXG4gICAgICB0cnkge1xuICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICB2YXIgbWF0Y2ggPSB4LnN0YWNrLnRyaW0oKS5tYXRjaCgvXFxuKCAqKGF0ICk/KS8pO1xuICAgICAgICBwcmVmaXggPSBtYXRjaCAmJiBtYXRjaFsxXSB8fCAnJztcbiAgICAgIH1cbiAgICB9IC8vIFdlIHVzZSB0aGUgcHJlZml4IHRvIGVuc3VyZSBvdXIgc3RhY2tzIGxpbmUgdXAgd2l0aCBuYXRpdmUgc3RhY2sgZnJhbWVzLlxuXG5cbiAgICByZXR1cm4gJ1xcbicgKyBwcmVmaXggKyBuYW1lO1xuICB9XG59XG52YXIgcmVlbnRyeSA9IGZhbHNlO1xudmFyIGNvbXBvbmVudEZyYW1lQ2FjaGU7XG5cbntcbiAgdmFyIFBvc3NpYmx5V2Vha01hcCA9IHR5cGVvZiBXZWFrTWFwID09PSAnZnVuY3Rpb24nID8gV2Vha01hcCA6IE1hcDtcbiAgY29tcG9uZW50RnJhbWVDYWNoZSA9IG5ldyBQb3NzaWJseVdlYWtNYXAoKTtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZShmbiwgY29uc3RydWN0KSB7XG4gIC8vIElmIHNvbWV0aGluZyBhc2tlZCBmb3IgYSBzdGFjayBpbnNpZGUgYSBmYWtlIHJlbmRlciwgaXQgc2hvdWxkIGdldCBpZ25vcmVkLlxuICBpZiAoICFmbiB8fCByZWVudHJ5KSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAge1xuICAgIHZhciBmcmFtZSA9IGNvbXBvbmVudEZyYW1lQ2FjaGUuZ2V0KGZuKTtcblxuICAgIGlmIChmcmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZnJhbWU7XG4gICAgfVxuICB9XG5cbiAgdmFyIGNvbnRyb2w7XG4gIHJlZW50cnkgPSB0cnVlO1xuICB2YXIgcHJldmlvdXNQcmVwYXJlU3RhY2tUcmFjZSA9IEVycm9yLnByZXBhcmVTdGFja1RyYWNlOyAvLyAkRmxvd0ZpeE1lIEl0IGRvZXMgYWNjZXB0IHVuZGVmaW5lZC5cblxuICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IHVuZGVmaW5lZDtcbiAgdmFyIHByZXZpb3VzRGlzcGF0Y2hlcjtcblxuICB7XG4gICAgcHJldmlvdXNEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7IC8vIFNldCB0aGUgZGlzcGF0Y2hlciBpbiBERVYgYmVjYXVzZSB0aGlzIG1pZ2h0IGJlIGNhbGwgaW4gdGhlIHJlbmRlciBmdW5jdGlvblxuICAgIC8vIGZvciB3YXJuaW5ncy5cblxuICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gbnVsbDtcbiAgICBkaXNhYmxlTG9ncygpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICAvLyBUaGlzIHNob3VsZCB0aHJvdy5cbiAgICBpZiAoY29uc3RydWN0KSB7XG4gICAgICAvLyBTb21ldGhpbmcgc2hvdWxkIGJlIHNldHRpbmcgdGhlIHByb3BzIGluIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICAgIHZhciBGYWtlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgfTsgLy8gJEZsb3dGaXhNZVxuXG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShGYWtlLnByb3RvdHlwZSwgJ3Byb3BzJywge1xuICAgICAgICBzZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAvLyBXZSB1c2UgYSB0aHJvd2luZyBzZXR0ZXIgaW5zdGVhZCBvZiBmcm96ZW4gb3Igbm9uLXdyaXRhYmxlIHByb3BzXG4gICAgICAgICAgLy8gYmVjYXVzZSB0aGF0IHdvbid0IHRocm93IGluIGEgbm9uLXN0cmljdCBtb2RlIGZ1bmN0aW9uLlxuICAgICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09ICdvYmplY3QnICYmIFJlZmxlY3QuY29uc3RydWN0KSB7XG4gICAgICAgIC8vIFdlIGNvbnN0cnVjdCBhIGRpZmZlcmVudCBjb250cm9sIGZvciB0aGlzIGNhc2UgdG8gaW5jbHVkZSBhbnkgZXh0cmFcbiAgICAgICAgLy8gZnJhbWVzIGFkZGVkIGJ5IHRoZSBjb25zdHJ1Y3QgY2FsbC5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBSZWZsZWN0LmNvbnN0cnVjdChGYWtlLCBbXSk7XG4gICAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgICBjb250cm9sID0geDtcbiAgICAgICAgfVxuXG4gICAgICAgIFJlZmxlY3QuY29uc3RydWN0KGZuLCBbXSwgRmFrZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIEZha2UuY2FsbCgpO1xuICAgICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgICAgY29udHJvbCA9IHg7XG4gICAgICAgIH1cblxuICAgICAgICBmbi5jYWxsKEZha2UucHJvdG90eXBlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgY29udHJvbCA9IHg7XG4gICAgICB9XG5cbiAgICAgIGZuKCk7XG4gICAgfVxuICB9IGNhdGNoIChzYW1wbGUpIHtcbiAgICAvLyBUaGlzIGlzIGlubGluZWQgbWFudWFsbHkgYmVjYXVzZSBjbG9zdXJlIGRvZXNuJ3QgZG8gaXQgZm9yIHVzLlxuICAgIGlmIChzYW1wbGUgJiYgY29udHJvbCAmJiB0eXBlb2Ygc2FtcGxlLnN0YWNrID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gVGhpcyBleHRyYWN0cyB0aGUgZmlyc3QgZnJhbWUgZnJvbSB0aGUgc2FtcGxlIHRoYXQgaXNuJ3QgYWxzbyBpbiB0aGUgY29udHJvbC5cbiAgICAgIC8vIFNraXBwaW5nIG9uZSBmcmFtZSB0aGF0IHdlIGFzc3VtZSBpcyB0aGUgZnJhbWUgdGhhdCBjYWxscyB0aGUgdHdvLlxuICAgICAgdmFyIHNhbXBsZUxpbmVzID0gc2FtcGxlLnN0YWNrLnNwbGl0KCdcXG4nKTtcbiAgICAgIHZhciBjb250cm9sTGluZXMgPSBjb250cm9sLnN0YWNrLnNwbGl0KCdcXG4nKTtcbiAgICAgIHZhciBzID0gc2FtcGxlTGluZXMubGVuZ3RoIC0gMTtcbiAgICAgIHZhciBjID0gY29udHJvbExpbmVzLmxlbmd0aCAtIDE7XG5cbiAgICAgIHdoaWxlIChzID49IDEgJiYgYyA+PSAwICYmIHNhbXBsZUxpbmVzW3NdICE9PSBjb250cm9sTGluZXNbY10pIHtcbiAgICAgICAgLy8gV2UgZXhwZWN0IGF0IGxlYXN0IG9uZSBzdGFjayBmcmFtZSB0byBiZSBzaGFyZWQuXG4gICAgICAgIC8vIFR5cGljYWxseSB0aGlzIHdpbGwgYmUgdGhlIHJvb3QgbW9zdCBvbmUuIEhvd2V2ZXIsIHN0YWNrIGZyYW1lcyBtYXkgYmVcbiAgICAgICAgLy8gY3V0IG9mZiBkdWUgdG8gbWF4aW11bSBzdGFjayBsaW1pdHMuIEluIHRoaXMgY2FzZSwgb25lIG1heWJlIGN1dCBvZmZcbiAgICAgICAgLy8gZWFybGllciB0aGFuIHRoZSBvdGhlci4gV2UgYXNzdW1lIHRoYXQgdGhlIHNhbXBsZSBpcyBsb25nZXIgb3IgdGhlIHNhbWVcbiAgICAgICAgLy8gYW5kIHRoZXJlIGZvciBjdXQgb2ZmIGVhcmxpZXIuIFNvIHdlIHNob3VsZCBmaW5kIHRoZSByb290IG1vc3QgZnJhbWUgaW5cbiAgICAgICAgLy8gdGhlIHNhbXBsZSBzb21ld2hlcmUgaW4gdGhlIGNvbnRyb2wuXG4gICAgICAgIGMtLTtcbiAgICAgIH1cblxuICAgICAgZm9yICg7IHMgPj0gMSAmJiBjID49IDA7IHMtLSwgYy0tKSB7XG4gICAgICAgIC8vIE5leHQgd2UgZmluZCB0aGUgZmlyc3Qgb25lIHRoYXQgaXNuJ3QgdGhlIHNhbWUgd2hpY2ggc2hvdWxkIGJlIHRoZVxuICAgICAgICAvLyBmcmFtZSB0aGF0IGNhbGxlZCBvdXIgc2FtcGxlIGZ1bmN0aW9uIGFuZCB0aGUgY29udHJvbC5cbiAgICAgICAgaWYgKHNhbXBsZUxpbmVzW3NdICE9PSBjb250cm9sTGluZXNbY10pIHtcbiAgICAgICAgICAvLyBJbiBWOCwgdGhlIGZpcnN0IGxpbmUgaXMgZGVzY3JpYmluZyB0aGUgbWVzc2FnZSBidXQgb3RoZXIgVk1zIGRvbid0LlxuICAgICAgICAgIC8vIElmIHdlJ3JlIGFib3V0IHRvIHJldHVybiB0aGUgZmlyc3QgbGluZSwgYW5kIHRoZSBjb250cm9sIGlzIGFsc28gb24gdGhlIHNhbWVcbiAgICAgICAgICAvLyBsaW5lLCB0aGF0J3MgYSBwcmV0dHkgZ29vZCBpbmRpY2F0b3IgdGhhdCBvdXIgc2FtcGxlIHRocmV3IGF0IHNhbWUgbGluZSBhc1xuICAgICAgICAgIC8vIHRoZSBjb250cm9sLiBJLmUuIGJlZm9yZSB3ZSBlbnRlcmVkIHRoZSBzYW1wbGUgZnJhbWUuIFNvIHdlIGlnbm9yZSB0aGlzIHJlc3VsdC5cbiAgICAgICAgICAvLyBUaGlzIGNhbiBoYXBwZW4gaWYgeW91IHBhc3NlZCBhIGNsYXNzIHRvIGZ1bmN0aW9uIGNvbXBvbmVudCwgb3Igbm9uLWZ1bmN0aW9uLlxuICAgICAgICAgIGlmIChzICE9PSAxIHx8IGMgIT09IDEpIHtcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgcy0tO1xuICAgICAgICAgICAgICBjLS07IC8vIFdlIG1heSBzdGlsbCBoYXZlIHNpbWlsYXIgaW50ZXJtZWRpYXRlIGZyYW1lcyBmcm9tIHRoZSBjb25zdHJ1Y3QgY2FsbC5cbiAgICAgICAgICAgICAgLy8gVGhlIG5leHQgb25lIHRoYXQgaXNuJ3QgdGhlIHNhbWUgc2hvdWxkIGJlIG91ciBtYXRjaCB0aG91Z2guXG5cbiAgICAgICAgICAgICAgaWYgKGMgPCAwIHx8IHNhbXBsZUxpbmVzW3NdICE9PSBjb250cm9sTGluZXNbY10pIHtcbiAgICAgICAgICAgICAgICAvLyBWOCBhZGRzIGEgXCJuZXdcIiBwcmVmaXggZm9yIG5hdGl2ZSBjbGFzc2VzLiBMZXQncyByZW1vdmUgaXQgdG8gbWFrZSBpdCBwcmV0dGllci5cbiAgICAgICAgICAgICAgICB2YXIgX2ZyYW1lID0gJ1xcbicgKyBzYW1wbGVMaW5lc1tzXS5yZXBsYWNlKCcgYXQgbmV3ICcsICcgYXQgJyk7IC8vIElmIG91ciBjb21wb25lbnQgZnJhbWUgaXMgbGFiZWxlZCBcIjxhbm9ueW1vdXM+XCJcbiAgICAgICAgICAgICAgICAvLyBidXQgd2UgaGF2ZSBhIHVzZXItcHJvdmlkZWQgXCJkaXNwbGF5TmFtZVwiXG4gICAgICAgICAgICAgICAgLy8gc3BsaWNlIGl0IGluIHRvIG1ha2UgdGhlIHN0YWNrIG1vcmUgcmVhZGFibGUuXG5cblxuICAgICAgICAgICAgICAgIGlmIChmbi5kaXNwbGF5TmFtZSAmJiBfZnJhbWUuaW5jbHVkZXMoJzxhbm9ueW1vdXM+JykpIHtcbiAgICAgICAgICAgICAgICAgIF9mcmFtZSA9IF9mcmFtZS5yZXBsYWNlKCc8YW5vbnltb3VzPicsIGZuLmRpc3BsYXlOYW1lKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudEZyYW1lQ2FjaGUuc2V0KGZuLCBfZnJhbWUpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gLy8gUmV0dXJuIHRoZSBsaW5lIHdlIGZvdW5kLlxuXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gX2ZyYW1lO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IHdoaWxlIChzID49IDEgJiYgYyA+PSAwKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICByZWVudHJ5ID0gZmFsc2U7XG5cbiAgICB7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZpb3VzRGlzcGF0Y2hlcjtcbiAgICAgIHJlZW5hYmxlTG9ncygpO1xuICAgIH1cblxuICAgIEVycm9yLnByZXBhcmVTdGFja1RyYWNlID0gcHJldmlvdXNQcmVwYXJlU3RhY2tUcmFjZTtcbiAgfSAvLyBGYWxsYmFjayB0byBqdXN0IHVzaW5nIHRoZSBuYW1lIGlmIHdlIGNvdWxkbid0IG1ha2UgaXQgdGhyb3cuXG5cblxuICB2YXIgbmFtZSA9IGZuID8gZm4uZGlzcGxheU5hbWUgfHwgZm4ubmFtZSA6ICcnO1xuICB2YXIgc3ludGhldGljRnJhbWUgPSBuYW1lID8gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUobmFtZSkgOiAnJztcblxuICB7XG4gICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29tcG9uZW50RnJhbWVDYWNoZS5zZXQoZm4sIHN5bnRoZXRpY0ZyYW1lKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3ludGhldGljRnJhbWU7XG59XG5mdW5jdGlvbiBkZXNjcmliZUZ1bmN0aW9uQ29tcG9uZW50RnJhbWUoZm4sIHNvdXJjZSwgb3duZXJGbikge1xuICB7XG4gICAgcmV0dXJuIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUoZm4sIGZhbHNlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRDb25zdHJ1Y3QoQ29tcG9uZW50KSB7XG4gIHZhciBwcm90b3R5cGUgPSBDb21wb25lbnQucHJvdG90eXBlO1xuICByZXR1cm4gISEocHJvdG90eXBlICYmIHByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50KTtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKHR5cGUsIHNvdXJjZSwgb3duZXJGbikge1xuXG4gIGlmICh0eXBlID09IG51bGwpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICB7XG4gICAgICByZXR1cm4gZGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZSh0eXBlLCBzaG91bGRDb25zdHJ1Y3QodHlwZSkpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUodHlwZSk7XG4gIH1cblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6XG4gICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoJ1N1c3BlbnNlJyk7XG5cbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTpcbiAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZSgnU3VzcGVuc2VMaXN0Jyk7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgc3dpdGNoICh0eXBlLiQkdHlwZW9mKSB7XG4gICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6XG4gICAgICAgIHJldHVybiBkZXNjcmliZUZ1bmN0aW9uQ29tcG9uZW50RnJhbWUodHlwZS5yZW5kZXIpO1xuXG4gICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgLy8gTWVtbyBtYXkgY29udGFpbiBhbnkgY29tcG9uZW50IHR5cGUgc28gd2UgcmVjdXJzaXZlbHkgcmVzb2x2ZSBpdC5cbiAgICAgICAgcmV0dXJuIGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVih0eXBlLnR5cGUsIHNvdXJjZSwgb3duZXJGbik7XG5cbiAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGxhenlDb21wb25lbnQgPSB0eXBlO1xuICAgICAgICAgIHZhciBwYXlsb2FkID0gbGF6eUNvbXBvbmVudC5fcGF5bG9hZDtcbiAgICAgICAgICB2YXIgaW5pdCA9IGxhenlDb21wb25lbnQuX2luaXQ7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gTGF6eSBtYXkgY29udGFpbiBhbnkgY29tcG9uZW50IHR5cGUgc28gd2UgcmVjdXJzaXZlbHkgcmVzb2x2ZSBpdC5cbiAgICAgICAgICAgIHJldHVybiBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYoaW5pdChwYXlsb2FkKSwgc291cmNlLCBvd25lckZuKTtcbiAgICAgICAgICB9IGNhdGNoICh4KSB7fVxuICAgICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuICcnO1xufVxuXG52YXIgbG9nZ2VkVHlwZUZhaWx1cmVzID0ge307XG52YXIgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSQxID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZTtcblxuZnVuY3Rpb24gc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQoZWxlbWVudCkge1xuICB7XG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIHZhciBvd25lciA9IGVsZW1lbnQuX293bmVyO1xuICAgICAgdmFyIHN0YWNrID0gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKGVsZW1lbnQudHlwZSwgZWxlbWVudC5fc291cmNlLCBvd25lciA/IG93bmVyLnR5cGUgOiBudWxsKTtcbiAgICAgIFJlYWN0RGVidWdDdXJyZW50RnJhbWUkMS5zZXRFeHRyYVN0YWNrRnJhbWUoc3RhY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBSZWFjdERlYnVnQ3VycmVudEZyYW1lJDEuc2V0RXh0cmFTdGFja0ZyYW1lKG51bGwpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjaGVja1Byb3BUeXBlcyh0eXBlU3BlY3MsIHZhbHVlcywgbG9jYXRpb24sIGNvbXBvbmVudE5hbWUsIGVsZW1lbnQpIHtcbiAge1xuICAgIC8vICRGbG93Rml4TWUgVGhpcyBpcyBva2F5IGJ1dCBGbG93IGRvZXNuJ3Qga25vdyBpdC5cbiAgICB2YXIgaGFzID0gRnVuY3Rpb24uY2FsbC5iaW5kKGhhc093blByb3BlcnR5KTtcblxuICAgIGZvciAodmFyIHR5cGVTcGVjTmFtZSBpbiB0eXBlU3BlY3MpIHtcbiAgICAgIGlmIChoYXModHlwZVNwZWNzLCB0eXBlU3BlY05hbWUpKSB7XG4gICAgICAgIHZhciBlcnJvciQxID0gdm9pZCAwOyAvLyBQcm9wIHR5cGUgdmFsaWRhdGlvbiBtYXkgdGhyb3cuIEluIGNhc2UgdGhleSBkbywgd2UgZG9uJ3Qgd2FudCB0b1xuICAgICAgICAvLyBmYWlsIHRoZSByZW5kZXIgcGhhc2Ugd2hlcmUgaXQgZGlkbid0IGZhaWwgYmVmb3JlLiBTbyB3ZSBsb2cgaXQuXG4gICAgICAgIC8vIEFmdGVyIHRoZXNlIGhhdmUgYmVlbiBjbGVhbmVkIHVwLCB3ZSdsbCBsZXQgdGhlbSB0aHJvdy5cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgaW50ZW50aW9uYWxseSBhbiBpbnZhcmlhbnQgdGhhdCBnZXRzIGNhdWdodC4gSXQncyB0aGUgc2FtZVxuICAgICAgICAgIC8vIGJlaGF2aW9yIGFzIHdpdGhvdXQgdGhpcyBzdGF0ZW1lbnQgZXhjZXB0IHdpdGggYSBiZXR0ZXIgbWVzc2FnZS5cbiAgICAgICAgICBpZiAodHlwZW9mIHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvcHJvZC1lcnJvci1jb2Rlc1xuICAgICAgICAgICAgdmFyIGVyciA9IEVycm9yKChjb21wb25lbnROYW1lIHx8ICdSZWFjdCBjbGFzcycpICsgJzogJyArIGxvY2F0aW9uICsgJyB0eXBlIGAnICsgdHlwZVNwZWNOYW1lICsgJ2AgaXMgaW52YWxpZDsgJyArICdpdCBtdXN0IGJlIGEgZnVuY3Rpb24sIHVzdWFsbHkgZnJvbSB0aGUgYHByb3AtdHlwZXNgIHBhY2thZ2UsIGJ1dCByZWNlaXZlZCBgJyArIHR5cGVvZiB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSArICdgLicgKyAnVGhpcyBvZnRlbiBoYXBwZW5zIGJlY2F1c2Ugb2YgdHlwb3Mgc3VjaCBhcyBgUHJvcFR5cGVzLmZ1bmN0aW9uYCBpbnN0ZWFkIG9mIGBQcm9wVHlwZXMuZnVuY2AuJyk7XG4gICAgICAgICAgICBlcnIubmFtZSA9ICdJbnZhcmlhbnQgVmlvbGF0aW9uJztcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBlcnJvciQxID0gdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0odmFsdWVzLCB0eXBlU3BlY05hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBudWxsLCAnU0VDUkVUX0RPX05PVF9QQVNTX1RISVNfT1JfWU9VX1dJTExfQkVfRklSRUQnKTtcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgICBlcnJvciQxID0gZXg7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXJyb3IkMSAmJiAhKGVycm9yJDEgaW5zdGFuY2VvZiBFcnJvcikpIHtcbiAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChlbGVtZW50KTtcblxuICAgICAgICAgIGVycm9yKCclczogdHlwZSBzcGVjaWZpY2F0aW9uIG9mICVzJyArICcgYCVzYCBpcyBpbnZhbGlkOyB0aGUgdHlwZSBjaGVja2VyICcgKyAnZnVuY3Rpb24gbXVzdCByZXR1cm4gYG51bGxgIG9yIGFuIGBFcnJvcmAgYnV0IHJldHVybmVkIGEgJXMuICcgKyAnWW91IG1heSBoYXZlIGZvcmdvdHRlbiB0byBwYXNzIGFuIGFyZ3VtZW50IHRvIHRoZSB0eXBlIGNoZWNrZXIgJyArICdjcmVhdG9yIChhcnJheU9mLCBpbnN0YW5jZU9mLCBvYmplY3RPZiwgb25lT2YsIG9uZU9mVHlwZSwgYW5kICcgKyAnc2hhcGUgYWxsIHJlcXVpcmUgYW4gYXJndW1lbnQpLicsIGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJywgbG9jYXRpb24sIHR5cGVTcGVjTmFtZSwgdHlwZW9mIGVycm9yJDEpO1xuXG4gICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQobnVsbCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXJyb3IkMSBpbnN0YW5jZW9mIEVycm9yICYmICEoZXJyb3IkMS5tZXNzYWdlIGluIGxvZ2dlZFR5cGVGYWlsdXJlcykpIHtcbiAgICAgICAgICAvLyBPbmx5IG1vbml0b3IgdGhpcyBmYWlsdXJlIG9uY2UgYmVjYXVzZSB0aGVyZSB0ZW5kcyB0byBiZSBhIGxvdCBvZiB0aGVcbiAgICAgICAgICAvLyBzYW1lIGVycm9yLlxuICAgICAgICAgIGxvZ2dlZFR5cGVGYWlsdXJlc1tlcnJvciQxLm1lc3NhZ2VdID0gdHJ1ZTtcbiAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChlbGVtZW50KTtcblxuICAgICAgICAgIGVycm9yKCdGYWlsZWQgJXMgdHlwZTogJXMnLCBsb2NhdGlvbiwgZXJyb3IkMS5tZXNzYWdlKTtcblxuICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KG51bGwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEoZWxlbWVudCkge1xuICB7XG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIHZhciBvd25lciA9IGVsZW1lbnQuX293bmVyO1xuICAgICAgdmFyIHN0YWNrID0gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKGVsZW1lbnQudHlwZSwgZWxlbWVudC5fc291cmNlLCBvd25lciA/IG93bmVyLnR5cGUgOiBudWxsKTtcbiAgICAgIHNldEV4dHJhU3RhY2tGcmFtZShzdGFjayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldEV4dHJhU3RhY2tGcmFtZShudWxsKTtcbiAgICB9XG4gIH1cbn1cblxudmFyIHByb3BUeXBlc01pc3NwZWxsV2FybmluZ1Nob3duO1xuXG57XG4gIHByb3BUeXBlc01pc3NwZWxsV2FybmluZ1Nob3duID0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bSgpIHtcbiAgaWYgKFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQpIHtcbiAgICB2YXIgbmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LnR5cGUpO1xuXG4gICAgaWYgKG5hbWUpIHtcbiAgICAgIHJldHVybiAnXFxuXFxuQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgYCcgKyBuYW1lICsgJ2AuJztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gJyc7XG59XG5cbmZ1bmN0aW9uIGdldFNvdXJjZUluZm9FcnJvckFkZGVuZHVtKHNvdXJjZSkge1xuICBpZiAoc291cmNlICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YXIgZmlsZU5hbWUgPSBzb3VyY2UuZmlsZU5hbWUucmVwbGFjZSgvXi4qW1xcXFxcXC9dLywgJycpO1xuICAgIHZhciBsaW5lTnVtYmVyID0gc291cmNlLmxpbmVOdW1iZXI7XG4gICAgcmV0dXJuICdcXG5cXG5DaGVjayB5b3VyIGNvZGUgYXQgJyArIGZpbGVOYW1lICsgJzonICsgbGluZU51bWJlciArICcuJztcbiAgfVxuXG4gIHJldHVybiAnJztcbn1cblxuZnVuY3Rpb24gZ2V0U291cmNlSW5mb0Vycm9yQWRkZW5kdW1Gb3JQcm9wcyhlbGVtZW50UHJvcHMpIHtcbiAgaWYgKGVsZW1lbnRQcm9wcyAhPT0gbnVsbCAmJiBlbGVtZW50UHJvcHMgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBnZXRTb3VyY2VJbmZvRXJyb3JBZGRlbmR1bShlbGVtZW50UHJvcHMuX19zb3VyY2UpO1xuICB9XG5cbiAgcmV0dXJuICcnO1xufVxuLyoqXG4gKiBXYXJuIGlmIHRoZXJlJ3Mgbm8ga2V5IGV4cGxpY2l0bHkgc2V0IG9uIGR5bmFtaWMgYXJyYXlzIG9mIGNoaWxkcmVuIG9yXG4gKiBvYmplY3Qga2V5cyBhcmUgbm90IHZhbGlkLiBUaGlzIGFsbG93cyB1cyB0byBrZWVwIHRyYWNrIG9mIGNoaWxkcmVuIGJldHdlZW5cbiAqIHVwZGF0ZXMuXG4gKi9cblxuXG52YXIgb3duZXJIYXNLZXlVc2VXYXJuaW5nID0ge307XG5cbmZ1bmN0aW9uIGdldEN1cnJlbnRDb21wb25lbnRFcnJvckluZm8ocGFyZW50VHlwZSkge1xuICB2YXIgaW5mbyA9IGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bSgpO1xuXG4gIGlmICghaW5mbykge1xuICAgIHZhciBwYXJlbnROYW1lID0gdHlwZW9mIHBhcmVudFR5cGUgPT09ICdzdHJpbmcnID8gcGFyZW50VHlwZSA6IHBhcmVudFR5cGUuZGlzcGxheU5hbWUgfHwgcGFyZW50VHlwZS5uYW1lO1xuXG4gICAgaWYgKHBhcmVudE5hbWUpIHtcbiAgICAgIGluZm8gPSBcIlxcblxcbkNoZWNrIHRoZSB0b3AtbGV2ZWwgcmVuZGVyIGNhbGwgdXNpbmcgPFwiICsgcGFyZW50TmFtZSArIFwiPi5cIjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaW5mbztcbn1cbi8qKlxuICogV2FybiBpZiB0aGUgZWxlbWVudCBkb2Vzbid0IGhhdmUgYW4gZXhwbGljaXQga2V5IGFzc2lnbmVkIHRvIGl0LlxuICogVGhpcyBlbGVtZW50IGlzIGluIGFuIGFycmF5LiBUaGUgYXJyYXkgY291bGQgZ3JvdyBhbmQgc2hyaW5rIG9yIGJlXG4gKiByZW9yZGVyZWQuIEFsbCBjaGlsZHJlbiB0aGF0IGhhdmVuJ3QgYWxyZWFkeSBiZWVuIHZhbGlkYXRlZCBhcmUgcmVxdWlyZWQgdG9cbiAqIGhhdmUgYSBcImtleVwiIHByb3BlcnR5IGFzc2lnbmVkIHRvIGl0LiBFcnJvciBzdGF0dXNlcyBhcmUgY2FjaGVkIHNvIGEgd2FybmluZ1xuICogd2lsbCBvbmx5IGJlIHNob3duIG9uY2UuXG4gKlxuICogQGludGVybmFsXG4gKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gZWxlbWVudCBFbGVtZW50IHRoYXQgcmVxdWlyZXMgYSBrZXkuXG4gKiBAcGFyYW0geyp9IHBhcmVudFR5cGUgZWxlbWVudCdzIHBhcmVudCdzIHR5cGUuXG4gKi9cblxuXG5mdW5jdGlvbiB2YWxpZGF0ZUV4cGxpY2l0S2V5KGVsZW1lbnQsIHBhcmVudFR5cGUpIHtcbiAgaWYgKCFlbGVtZW50Ll9zdG9yZSB8fCBlbGVtZW50Ll9zdG9yZS52YWxpZGF0ZWQgfHwgZWxlbWVudC5rZXkgIT0gbnVsbCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGVsZW1lbnQuX3N0b3JlLnZhbGlkYXRlZCA9IHRydWU7XG4gIHZhciBjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvID0gZ2V0Q3VycmVudENvbXBvbmVudEVycm9ySW5mbyhwYXJlbnRUeXBlKTtcblxuICBpZiAob3duZXJIYXNLZXlVc2VXYXJuaW5nW2N1cnJlbnRDb21wb25lbnRFcnJvckluZm9dKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgb3duZXJIYXNLZXlVc2VXYXJuaW5nW2N1cnJlbnRDb21wb25lbnRFcnJvckluZm9dID0gdHJ1ZTsgLy8gVXN1YWxseSB0aGUgY3VycmVudCBvd25lciBpcyB0aGUgb2ZmZW5kZXIsIGJ1dCBpZiBpdCBhY2NlcHRzIGNoaWxkcmVuIGFzIGFcbiAgLy8gcHJvcGVydHksIGl0IG1heSBiZSB0aGUgY3JlYXRvciBvZiB0aGUgY2hpbGQgdGhhdCdzIHJlc3BvbnNpYmxlIGZvclxuICAvLyBhc3NpZ25pbmcgaXQgYSBrZXkuXG5cbiAgdmFyIGNoaWxkT3duZXIgPSAnJztcblxuICBpZiAoZWxlbWVudCAmJiBlbGVtZW50Ll9vd25lciAmJiBlbGVtZW50Ll9vd25lciAhPT0gUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCkge1xuICAgIC8vIEdpdmUgdGhlIGNvbXBvbmVudCB0aGF0IG9yaWdpbmFsbHkgY3JlYXRlZCB0aGlzIGNoaWxkLlxuICAgIGNoaWxkT3duZXIgPSBcIiBJdCB3YXMgcGFzc2VkIGEgY2hpbGQgZnJvbSBcIiArIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShlbGVtZW50Ll9vd25lci50eXBlKSArIFwiLlwiO1xuICB9XG5cbiAge1xuICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEoZWxlbWVudCk7XG5cbiAgICBlcnJvcignRWFjaCBjaGlsZCBpbiBhIGxpc3Qgc2hvdWxkIGhhdmUgYSB1bmlxdWUgXCJrZXlcIiBwcm9wLicgKyAnJXMlcyBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3dhcm5pbmcta2V5cyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nLCBjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvLCBjaGlsZE93bmVyKTtcblxuICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEobnVsbCk7XG4gIH1cbn1cbi8qKlxuICogRW5zdXJlIHRoYXQgZXZlcnkgZWxlbWVudCBlaXRoZXIgaXMgcGFzc2VkIGluIGEgc3RhdGljIGxvY2F0aW9uLCBpbiBhblxuICogYXJyYXkgd2l0aCBhbiBleHBsaWNpdCBrZXlzIHByb3BlcnR5IGRlZmluZWQsIG9yIGluIGFuIG9iamVjdCBsaXRlcmFsXG4gKiB3aXRoIHZhbGlkIGtleSBwcm9wZXJ0eS5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqIEBwYXJhbSB7UmVhY3ROb2RlfSBub2RlIFN0YXRpY2FsbHkgcGFzc2VkIGNoaWxkIG9mIGFueSB0eXBlLlxuICogQHBhcmFtIHsqfSBwYXJlbnRUeXBlIG5vZGUncyBwYXJlbnQncyB0eXBlLlxuICovXG5cblxuZnVuY3Rpb24gdmFsaWRhdGVDaGlsZEtleXMobm9kZSwgcGFyZW50VHlwZSkge1xuICBpZiAodHlwZW9mIG5vZGUgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGlzQXJyYXkobm9kZSkpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjaGlsZCA9IG5vZGVbaV07XG5cbiAgICAgIGlmIChpc1ZhbGlkRWxlbWVudChjaGlsZCkpIHtcbiAgICAgICAgdmFsaWRhdGVFeHBsaWNpdEtleShjaGlsZCwgcGFyZW50VHlwZSk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzVmFsaWRFbGVtZW50KG5vZGUpKSB7XG4gICAgLy8gVGhpcyBlbGVtZW50IHdhcyBwYXNzZWQgaW4gYSB2YWxpZCBsb2NhdGlvbi5cbiAgICBpZiAobm9kZS5fc3RvcmUpIHtcbiAgICAgIG5vZGUuX3N0b3JlLnZhbGlkYXRlZCA9IHRydWU7XG4gICAgfVxuICB9IGVsc2UgaWYgKG5vZGUpIHtcbiAgICB2YXIgaXRlcmF0b3JGbiA9IGdldEl0ZXJhdG9yRm4obm9kZSk7XG5cbiAgICBpZiAodHlwZW9mIGl0ZXJhdG9yRm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIEVudHJ5IGl0ZXJhdG9ycyB1c2VkIHRvIHByb3ZpZGUgaW1wbGljaXQga2V5cyxcbiAgICAgIC8vIGJ1dCBub3cgd2UgcHJpbnQgYSBzZXBhcmF0ZSB3YXJuaW5nIGZvciB0aGVtIGxhdGVyLlxuICAgICAgaWYgKGl0ZXJhdG9yRm4gIT09IG5vZGUuZW50cmllcykge1xuICAgICAgICB2YXIgaXRlcmF0b3IgPSBpdGVyYXRvckZuLmNhbGwobm9kZSk7XG4gICAgICAgIHZhciBzdGVwO1xuXG4gICAgICAgIHdoaWxlICghKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHtcbiAgICAgICAgICBpZiAoaXNWYWxpZEVsZW1lbnQoc3RlcC52YWx1ZSkpIHtcbiAgICAgICAgICAgIHZhbGlkYXRlRXhwbGljaXRLZXkoc3RlcC52YWx1ZSwgcGFyZW50VHlwZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4vKipcbiAqIEdpdmVuIGFuIGVsZW1lbnQsIHZhbGlkYXRlIHRoYXQgaXRzIHByb3BzIGZvbGxvdyB0aGUgcHJvcFR5cGVzIGRlZmluaXRpb24sXG4gKiBwcm92aWRlZCBieSB0aGUgdHlwZS5cbiAqXG4gKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gZWxlbWVudFxuICovXG5cblxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wVHlwZXMoZWxlbWVudCkge1xuICB7XG4gICAgdmFyIHR5cGUgPSBlbGVtZW50LnR5cGU7XG5cbiAgICBpZiAodHlwZSA9PT0gbnVsbCB8fCB0eXBlID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHByb3BUeXBlcztcblxuICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcHJvcFR5cGVzID0gdHlwZS5wcm9wVHlwZXM7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgKHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgfHwgLy8gTm90ZTogTWVtbyBvbmx5IGNoZWNrcyBvdXRlciBwcm9wcyBoZXJlLlxuICAgIC8vIElubmVyIHByb3BzIGFyZSBjaGVja2VkIGluIHRoZSByZWNvbmNpbGVyLlxuICAgIHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX01FTU9fVFlQRSkpIHtcbiAgICAgIHByb3BUeXBlcyA9IHR5cGUucHJvcFR5cGVzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHByb3BUeXBlcykge1xuICAgICAgLy8gSW50ZW50aW9uYWxseSBpbnNpZGUgdG8gYXZvaWQgdHJpZ2dlcmluZyBsYXp5IGluaXRpYWxpemVyczpcbiAgICAgIHZhciBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUpO1xuICAgICAgY2hlY2tQcm9wVHlwZXMocHJvcFR5cGVzLCBlbGVtZW50LnByb3BzLCAncHJvcCcsIG5hbWUsIGVsZW1lbnQpO1xuICAgIH0gZWxzZSBpZiAodHlwZS5Qcm9wVHlwZXMgIT09IHVuZGVmaW5lZCAmJiAhcHJvcFR5cGVzTWlzc3BlbGxXYXJuaW5nU2hvd24pIHtcbiAgICAgIHByb3BUeXBlc01pc3NwZWxsV2FybmluZ1Nob3duID0gdHJ1ZTsgLy8gSW50ZW50aW9uYWxseSBpbnNpZGUgdG8gYXZvaWQgdHJpZ2dlcmluZyBsYXp5IGluaXRpYWxpemVyczpcblxuICAgICAgdmFyIF9uYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUpO1xuXG4gICAgICBlcnJvcignQ29tcG9uZW50ICVzIGRlY2xhcmVkIGBQcm9wVHlwZXNgIGluc3RlYWQgb2YgYHByb3BUeXBlc2AuIERpZCB5b3UgbWlzc3BlbGwgdGhlIHByb3BlcnR5IGFzc2lnbm1lbnQ/JywgX25hbWUgfHwgJ1Vua25vd24nKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHR5cGUuZ2V0RGVmYXVsdFByb3BzID09PSAnZnVuY3Rpb24nICYmICF0eXBlLmdldERlZmF1bHRQcm9wcy5pc1JlYWN0Q2xhc3NBcHByb3ZlZCkge1xuICAgICAgZXJyb3IoJ2dldERlZmF1bHRQcm9wcyBpcyBvbmx5IHVzZWQgb24gY2xhc3NpYyBSZWFjdC5jcmVhdGVDbGFzcyAnICsgJ2RlZmluaXRpb25zLiBVc2UgYSBzdGF0aWMgcHJvcGVydHkgbmFtZWQgYGRlZmF1bHRQcm9wc2AgaW5zdGVhZC4nKTtcbiAgICB9XG4gIH1cbn1cbi8qKlxuICogR2l2ZW4gYSBmcmFnbWVudCwgdmFsaWRhdGUgdGhhdCBpdCBjYW4gb25seSBiZSBwcm92aWRlZCB3aXRoIGZyYWdtZW50IHByb3BzXG4gKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gZnJhZ21lbnRcbiAqL1xuXG5cbmZ1bmN0aW9uIHZhbGlkYXRlRnJhZ21lbnRQcm9wcyhmcmFnbWVudCkge1xuICB7XG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhmcmFnbWVudC5wcm9wcyk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuXG4gICAgICBpZiAoa2V5ICE9PSAnY2hpbGRyZW4nICYmIGtleSAhPT0gJ2tleScpIHtcbiAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShmcmFnbWVudCk7XG5cbiAgICAgICAgZXJyb3IoJ0ludmFsaWQgcHJvcCBgJXNgIHN1cHBsaWVkIHRvIGBSZWFjdC5GcmFnbWVudGAuICcgKyAnUmVhY3QuRnJhZ21lbnQgY2FuIG9ubHkgaGF2ZSBga2V5YCBhbmQgYGNoaWxkcmVuYCBwcm9wcy4nLCBrZXkpO1xuXG4gICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEobnVsbCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChmcmFnbWVudC5yZWYgIT09IG51bGwpIHtcbiAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEoZnJhZ21lbnQpO1xuXG4gICAgICBlcnJvcignSW52YWxpZCBhdHRyaWJ1dGUgYHJlZmAgc3VwcGxpZWQgdG8gYFJlYWN0LkZyYWdtZW50YC4nKTtcblxuICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShudWxsKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnRXaXRoVmFsaWRhdGlvbih0eXBlLCBwcm9wcywgY2hpbGRyZW4pIHtcbiAgdmFyIHZhbGlkVHlwZSA9IGlzVmFsaWRFbGVtZW50VHlwZSh0eXBlKTsgLy8gV2Ugd2FybiBpbiB0aGlzIGNhc2UgYnV0IGRvbid0IHRocm93LiBXZSBleHBlY3QgdGhlIGVsZW1lbnQgY3JlYXRpb24gdG9cbiAgLy8gc3VjY2VlZCBhbmQgdGhlcmUgd2lsbCBsaWtlbHkgYmUgZXJyb3JzIGluIHJlbmRlci5cblxuICBpZiAoIXZhbGlkVHlwZSkge1xuICAgIHZhciBpbmZvID0gJyc7XG5cbiAgICBpZiAodHlwZSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiB0eXBlICE9PSBudWxsICYmIE9iamVjdC5rZXlzKHR5cGUpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgaW5mbyArPSAnIFlvdSBsaWtlbHkgZm9yZ290IHRvIGV4cG9ydCB5b3VyIGNvbXBvbmVudCBmcm9tIHRoZSBmaWxlICcgKyBcIml0J3MgZGVmaW5lZCBpbiwgb3IgeW91IG1pZ2h0IGhhdmUgbWl4ZWQgdXAgZGVmYXVsdCBhbmQgbmFtZWQgaW1wb3J0cy5cIjtcbiAgICB9XG5cbiAgICB2YXIgc291cmNlSW5mbyA9IGdldFNvdXJjZUluZm9FcnJvckFkZGVuZHVtRm9yUHJvcHMocHJvcHMpO1xuXG4gICAgaWYgKHNvdXJjZUluZm8pIHtcbiAgICAgIGluZm8gKz0gc291cmNlSW5mbztcbiAgICB9IGVsc2Uge1xuICAgICAgaW5mbyArPSBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oKTtcbiAgICB9XG5cbiAgICB2YXIgdHlwZVN0cmluZztcblxuICAgIGlmICh0eXBlID09PSBudWxsKSB7XG4gICAgICB0eXBlU3RyaW5nID0gJ251bGwnO1xuICAgIH0gZWxzZSBpZiAoaXNBcnJheSh0eXBlKSkge1xuICAgICAgdHlwZVN0cmluZyA9ICdhcnJheSc7XG4gICAgfSBlbHNlIGlmICh0eXBlICE9PSB1bmRlZmluZWQgJiYgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFKSB7XG4gICAgICB0eXBlU3RyaW5nID0gXCI8XCIgKyAoZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUudHlwZSkgfHwgJ1Vua25vd24nKSArIFwiIC8+XCI7XG4gICAgICBpbmZvID0gJyBEaWQgeW91IGFjY2lkZW50YWxseSBleHBvcnQgYSBKU1ggbGl0ZXJhbCBpbnN0ZWFkIG9mIGEgY29tcG9uZW50Pyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHR5cGVTdHJpbmcgPSB0eXBlb2YgdHlwZTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBlcnJvcignUmVhY3QuY3JlYXRlRWxlbWVudDogdHlwZSBpcyBpbnZhbGlkIC0tIGV4cGVjdGVkIGEgc3RyaW5nIChmb3IgJyArICdidWlsdC1pbiBjb21wb25lbnRzKSBvciBhIGNsYXNzL2Z1bmN0aW9uIChmb3IgY29tcG9zaXRlICcgKyAnY29tcG9uZW50cykgYnV0IGdvdDogJXMuJXMnLCB0eXBlU3RyaW5nLCBpbmZvKTtcbiAgICB9XG4gIH1cblxuICB2YXIgZWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgLy8gVGhlIHJlc3VsdCBjYW4gYmUgbnVsbGlzaCBpZiBhIG1vY2sgb3IgYSBjdXN0b20gZnVuY3Rpb24gaXMgdXNlZC5cbiAgLy8gVE9ETzogRHJvcCB0aGlzIHdoZW4gdGhlc2UgYXJlIG5vIGxvbmdlciBhbGxvd2VkIGFzIHRoZSB0eXBlIGFyZ3VtZW50LlxuXG4gIGlmIChlbGVtZW50ID09IG51bGwpIHtcbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfSAvLyBTa2lwIGtleSB3YXJuaW5nIGlmIHRoZSB0eXBlIGlzbid0IHZhbGlkIHNpbmNlIG91ciBrZXkgdmFsaWRhdGlvbiBsb2dpY1xuICAvLyBkb2Vzbid0IGV4cGVjdCBhIG5vbi1zdHJpbmcvZnVuY3Rpb24gdHlwZSBhbmQgY2FuIHRocm93IGNvbmZ1c2luZyBlcnJvcnMuXG4gIC8vIFdlIGRvbid0IHdhbnQgZXhjZXB0aW9uIGJlaGF2aW9yIHRvIGRpZmZlciBiZXR3ZWVuIGRldiBhbmQgcHJvZC5cbiAgLy8gKFJlbmRlcmluZyB3aWxsIHRocm93IHdpdGggYSBoZWxwZnVsIG1lc3NhZ2UgYW5kIGFzIHNvb24gYXMgdGhlIHR5cGUgaXNcbiAgLy8gZml4ZWQsIHRoZSBrZXkgd2FybmluZ3Mgd2lsbCBhcHBlYXIuKVxuXG5cbiAgaWYgKHZhbGlkVHlwZSkge1xuICAgIGZvciAodmFyIGkgPSAyOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YWxpZGF0ZUNoaWxkS2V5cyhhcmd1bWVudHNbaV0sIHR5cGUpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFKSB7XG4gICAgdmFsaWRhdGVGcmFnbWVudFByb3BzKGVsZW1lbnQpO1xuICB9IGVsc2Uge1xuICAgIHZhbGlkYXRlUHJvcFR5cGVzKGVsZW1lbnQpO1xuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQ7XG59XG52YXIgZGlkV2FybkFib3V0RGVwcmVjYXRlZENyZWF0ZUZhY3RvcnkgPSBmYWxzZTtcbmZ1bmN0aW9uIGNyZWF0ZUZhY3RvcnlXaXRoVmFsaWRhdGlvbih0eXBlKSB7XG4gIHZhciB2YWxpZGF0ZWRGYWN0b3J5ID0gY3JlYXRlRWxlbWVudFdpdGhWYWxpZGF0aW9uLmJpbmQobnVsbCwgdHlwZSk7XG4gIHZhbGlkYXRlZEZhY3RvcnkudHlwZSA9IHR5cGU7XG5cbiAge1xuICAgIGlmICghZGlkV2FybkFib3V0RGVwcmVjYXRlZENyZWF0ZUZhY3RvcnkpIHtcbiAgICAgIGRpZFdhcm5BYm91dERlcHJlY2F0ZWRDcmVhdGVGYWN0b3J5ID0gdHJ1ZTtcblxuICAgICAgd2FybignUmVhY3QuY3JlYXRlRmFjdG9yeSgpIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiAnICsgJ2EgZnV0dXJlIG1ham9yIHJlbGVhc2UuIENvbnNpZGVyIHVzaW5nIEpTWCAnICsgJ29yIHVzZSBSZWFjdC5jcmVhdGVFbGVtZW50KCkgZGlyZWN0bHkgaW5zdGVhZC4nKTtcbiAgICB9IC8vIExlZ2FjeSBob29rOiByZW1vdmUgaXRcblxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHZhbGlkYXRlZEZhY3RvcnksICd0eXBlJywge1xuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgd2FybignRmFjdG9yeS50eXBlIGlzIGRlcHJlY2F0ZWQuIEFjY2VzcyB0aGUgY2xhc3MgZGlyZWN0bHkgJyArICdiZWZvcmUgcGFzc2luZyBpdCB0byBjcmVhdGVGYWN0b3J5LicpO1xuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAndHlwZScsIHtcbiAgICAgICAgICB2YWx1ZTogdHlwZVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHR5cGU7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gdmFsaWRhdGVkRmFjdG9yeTtcbn1cbmZ1bmN0aW9uIGNsb25lRWxlbWVudFdpdGhWYWxpZGF0aW9uKGVsZW1lbnQsIHByb3BzLCBjaGlsZHJlbikge1xuICB2YXIgbmV3RWxlbWVudCA9IGNsb25lRWxlbWVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gIGZvciAodmFyIGkgPSAyOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFsaWRhdGVDaGlsZEtleXMoYXJndW1lbnRzW2ldLCBuZXdFbGVtZW50LnR5cGUpO1xuICB9XG5cbiAgdmFsaWRhdGVQcm9wVHlwZXMobmV3RWxlbWVudCk7XG4gIHJldHVybiBuZXdFbGVtZW50O1xufVxuXG5mdW5jdGlvbiBzdGFydFRyYW5zaXRpb24oc2NvcGUsIG9wdGlvbnMpIHtcbiAgdmFyIHByZXZUcmFuc2l0aW9uID0gUmVhY3RDdXJyZW50QmF0Y2hDb25maWcudHJhbnNpdGlvbjtcbiAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWcudHJhbnNpdGlvbiA9IHt9O1xuICB2YXIgY3VycmVudFRyYW5zaXRpb24gPSBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZy50cmFuc2l0aW9uO1xuXG4gIHtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZy50cmFuc2l0aW9uLl91cGRhdGVkRmliZXJzID0gbmV3IFNldCgpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBzY29wZSgpO1xuICB9IGZpbmFsbHkge1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLnRyYW5zaXRpb24gPSBwcmV2VHJhbnNpdGlvbjtcblxuICAgIHtcbiAgICAgIGlmIChwcmV2VHJhbnNpdGlvbiA9PT0gbnVsbCAmJiBjdXJyZW50VHJhbnNpdGlvbi5fdXBkYXRlZEZpYmVycykge1xuICAgICAgICB2YXIgdXBkYXRlZEZpYmVyc0NvdW50ID0gY3VycmVudFRyYW5zaXRpb24uX3VwZGF0ZWRGaWJlcnMuc2l6ZTtcblxuICAgICAgICBpZiAodXBkYXRlZEZpYmVyc0NvdW50ID4gMTApIHtcbiAgICAgICAgICB3YXJuKCdEZXRlY3RlZCBhIGxhcmdlIG51bWJlciBvZiB1cGRhdGVzIGluc2lkZSBzdGFydFRyYW5zaXRpb24uICcgKyAnSWYgdGhpcyBpcyBkdWUgdG8gYSBzdWJzY3JpcHRpb24gcGxlYXNlIHJlLXdyaXRlIGl0IHRvIHVzZSBSZWFjdCBwcm92aWRlZCBob29rcy4gJyArICdPdGhlcndpc2UgY29uY3VycmVudCBtb2RlIGd1YXJhbnRlZXMgYXJlIG9mZiB0aGUgdGFibGUuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjdXJyZW50VHJhbnNpdGlvbi5fdXBkYXRlZEZpYmVycy5jbGVhcigpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG52YXIgZGlkV2FybkFib3V0TWVzc2FnZUNoYW5uZWwgPSBmYWxzZTtcbnZhciBlbnF1ZXVlVGFza0ltcGwgPSBudWxsO1xuZnVuY3Rpb24gZW5xdWV1ZVRhc2sodGFzaykge1xuICBpZiAoZW5xdWV1ZVRhc2tJbXBsID09PSBudWxsKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIHJlYWQgcmVxdWlyZSBvZmYgdGhlIG1vZHVsZSBvYmplY3QgdG8gZ2V0IGFyb3VuZCB0aGUgYnVuZGxlcnMuXG4gICAgICAvLyB3ZSBkb24ndCB3YW50IHRoZW0gdG8gZGV0ZWN0IGEgcmVxdWlyZSBhbmQgYnVuZGxlIGEgTm9kZSBwb2x5ZmlsbC5cbiAgICAgIHZhciByZXF1aXJlU3RyaW5nID0gKCdyZXF1aXJlJyArIE1hdGgucmFuZG9tKCkpLnNsaWNlKDAsIDcpO1xuICAgICAgdmFyIG5vZGVSZXF1aXJlID0gbW9kdWxlICYmIG1vZHVsZVtyZXF1aXJlU3RyaW5nXTsgLy8gYXNzdW1pbmcgd2UncmUgaW4gbm9kZSwgbGV0J3MgdHJ5IHRvIGdldCBub2RlJ3NcbiAgICAgIC8vIHZlcnNpb24gb2Ygc2V0SW1tZWRpYXRlLCBieXBhc3NpbmcgZmFrZSB0aW1lcnMgaWYgYW55LlxuXG4gICAgICBlbnF1ZXVlVGFza0ltcGwgPSBub2RlUmVxdWlyZS5jYWxsKG1vZHVsZSwgJ3RpbWVycycpLnNldEltbWVkaWF0ZTtcbiAgICB9IGNhdGNoIChfZXJyKSB7XG4gICAgICAvLyB3ZSdyZSBpbiBhIGJyb3dzZXJcbiAgICAgIC8vIHdlIGNhbid0IHVzZSByZWd1bGFyIHRpbWVycyBiZWNhdXNlIHRoZXkgbWF5IHN0aWxsIGJlIGZha2VkXG4gICAgICAvLyBzbyB3ZSB0cnkgTWVzc2FnZUNoYW5uZWwrcG9zdE1lc3NhZ2UgaW5zdGVhZFxuICAgICAgZW5xdWV1ZVRhc2tJbXBsID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoZGlkV2FybkFib3V0TWVzc2FnZUNoYW5uZWwgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBkaWRXYXJuQWJvdXRNZXNzYWdlQ2hhbm5lbCA9IHRydWU7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgTWVzc2FnZUNoYW5uZWwgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgIGVycm9yKCdUaGlzIGJyb3dzZXIgZG9lcyBub3QgaGF2ZSBhIE1lc3NhZ2VDaGFubmVsIGltcGxlbWVudGF0aW9uLCAnICsgJ3NvIGVucXVldWluZyB0YXNrcyB2aWEgYXdhaXQgYWN0KGFzeW5jICgpID0+IC4uLikgd2lsbCBmYWlsLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMgJyArICdpZiB5b3UgZW5jb3VudGVyIHRoaXMgd2FybmluZy4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpO1xuICAgICAgICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IGNhbGxiYWNrO1xuICAgICAgICBjaGFubmVsLnBvcnQyLnBvc3RNZXNzYWdlKHVuZGVmaW5lZCk7XG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBlbnF1ZXVlVGFza0ltcGwodGFzayk7XG59XG5cbnZhciBhY3RTY29wZURlcHRoID0gMDtcbnZhciBkaWRXYXJuTm9Bd2FpdEFjdCA9IGZhbHNlO1xuZnVuY3Rpb24gYWN0KGNhbGxiYWNrKSB7XG4gIHtcbiAgICAvLyBgYWN0YCBjYWxscyBjYW4gYmUgbmVzdGVkLCBzbyB3ZSB0cmFjayB0aGUgZGVwdGguIFRoaXMgcmVwcmVzZW50cyB0aGVcbiAgICAvLyBudW1iZXIgb2YgYGFjdGAgc2NvcGVzIG9uIHRoZSBzdGFjay5cbiAgICB2YXIgcHJldkFjdFNjb3BlRGVwdGggPSBhY3RTY29wZURlcHRoO1xuICAgIGFjdFNjb3BlRGVwdGgrKztcblxuICAgIGlmIChSZWFjdEN1cnJlbnRBY3RRdWV1ZS5jdXJyZW50ID09PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIGlzIHRoZSBvdXRlcm1vc3QgYGFjdGAgc2NvcGUuIEluaXRpYWxpemUgdGhlIHF1ZXVlLiBUaGUgcmVjb25jaWxlclxuICAgICAgLy8gd2lsbCBkZXRlY3QgdGhlIHF1ZXVlIGFuZCB1c2UgaXQgaW5zdGVhZCBvZiBTY2hlZHVsZXIuXG4gICAgICBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5jdXJyZW50ID0gW107XG4gICAgfVxuXG4gICAgdmFyIHByZXZJc0JhdGNoaW5nTGVnYWN5ID0gUmVhY3RDdXJyZW50QWN0UXVldWUuaXNCYXRjaGluZ0xlZ2FjeTtcbiAgICB2YXIgcmVzdWx0O1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFVzZWQgdG8gcmVwcm9kdWNlIGJlaGF2aW9yIG9mIGBiYXRjaGVkVXBkYXRlc2AgaW4gbGVnYWN5IG1vZGUuIE9ubHlcbiAgICAgIC8vIHNldCB0byBgdHJ1ZWAgd2hpbGUgdGhlIGdpdmVuIGNhbGxiYWNrIGlzIGV4ZWN1dGVkLCBub3QgZm9yIHVwZGF0ZXNcbiAgICAgIC8vIHRyaWdnZXJlZCBkdXJpbmcgYW4gYXN5bmMgZXZlbnQsIGJlY2F1c2UgdGhpcyBpcyBob3cgdGhlIGxlZ2FjeVxuICAgICAgLy8gaW1wbGVtZW50YXRpb24gb2YgYGFjdGAgYmVoYXZlZC5cbiAgICAgIFJlYWN0Q3VycmVudEFjdFF1ZXVlLmlzQmF0Y2hpbmdMZWdhY3kgPSB0cnVlO1xuICAgICAgcmVzdWx0ID0gY2FsbGJhY2soKTsgLy8gUmVwbGljYXRlIGJlaGF2aW9yIG9mIG9yaWdpbmFsIGBhY3RgIGltcGxlbWVudGF0aW9uIGluIGxlZ2FjeSBtb2RlLFxuICAgICAgLy8gd2hpY2ggZmx1c2hlZCB1cGRhdGVzIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBzY29wZSBmdW5jdGlvbiBleGl0cywgZXZlblxuICAgICAgLy8gaWYgaXQncyBhbiBhc3luYyBmdW5jdGlvbi5cblxuICAgICAgaWYgKCFwcmV2SXNCYXRjaGluZ0xlZ2FjeSAmJiBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5kaWRTY2hlZHVsZUxlZ2FjeVVwZGF0ZSkge1xuICAgICAgICB2YXIgcXVldWUgPSBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5jdXJyZW50O1xuXG4gICAgICAgIGlmIChxdWV1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIFJlYWN0Q3VycmVudEFjdFF1ZXVlLmRpZFNjaGVkdWxlTGVnYWN5VXBkYXRlID0gZmFsc2U7XG4gICAgICAgICAgZmx1c2hBY3RRdWV1ZShxdWV1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcG9wQWN0U2NvcGUocHJldkFjdFNjb3BlRGVwdGgpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIFJlYWN0Q3VycmVudEFjdFF1ZXVlLmlzQmF0Y2hpbmdMZWdhY3kgPSBwcmV2SXNCYXRjaGluZ0xlZ2FjeTtcbiAgICB9XG5cbiAgICBpZiAocmVzdWx0ICE9PSBudWxsICYmIHR5cGVvZiByZXN1bHQgPT09ICdvYmplY3QnICYmIHR5cGVvZiByZXN1bHQudGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIHRoZW5hYmxlUmVzdWx0ID0gcmVzdWx0OyAvLyBUaGUgY2FsbGJhY2sgaXMgYW4gYXN5bmMgZnVuY3Rpb24gKGkuZS4gcmV0dXJuZWQgYSBwcm9taXNlKS4gV2FpdFxuICAgICAgLy8gZm9yIGl0IHRvIHJlc29sdmUgYmVmb3JlIGV4aXRpbmcgdGhlIGN1cnJlbnQgc2NvcGUuXG5cbiAgICAgIHZhciB3YXNBd2FpdGVkID0gZmFsc2U7XG4gICAgICB2YXIgdGhlbmFibGUgPSB7XG4gICAgICAgIHRoZW46IGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICB3YXNBd2FpdGVkID0gdHJ1ZTtcbiAgICAgICAgICB0aGVuYWJsZVJlc3VsdC50aGVuKGZ1bmN0aW9uIChyZXR1cm5WYWx1ZSkge1xuICAgICAgICAgICAgcG9wQWN0U2NvcGUocHJldkFjdFNjb3BlRGVwdGgpO1xuXG4gICAgICAgICAgICBpZiAoYWN0U2NvcGVEZXB0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAvLyBXZSd2ZSBleGl0ZWQgdGhlIG91dGVybW9zdCBhY3Qgc2NvcGUuIFJlY3Vyc2l2ZWx5IGZsdXNoIHRoZVxuICAgICAgICAgICAgICAvLyBxdWV1ZSB1bnRpbCB0aGVyZSdzIG5vIHJlbWFpbmluZyB3b3JrLlxuICAgICAgICAgICAgICByZWN1cnNpdmVseUZsdXNoQXN5bmNBY3RXb3JrKHJldHVyblZhbHVlLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVzb2x2ZShyZXR1cm5WYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSwgZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICAvLyBUaGUgY2FsbGJhY2sgdGhyZXcgYW4gZXJyb3IuXG4gICAgICAgICAgICBwb3BBY3RTY29wZShwcmV2QWN0U2NvcGVEZXB0aCk7XG4gICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICB7XG4gICAgICAgIGlmICghZGlkV2Fybk5vQXdhaXRBY3QgJiYgdHlwZW9mIFByb21pc2UgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbiAoKSB7fSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoIXdhc0F3YWl0ZWQpIHtcbiAgICAgICAgICAgICAgZGlkV2Fybk5vQXdhaXRBY3QgPSB0cnVlO1xuXG4gICAgICAgICAgICAgIGVycm9yKCdZb3UgY2FsbGVkIGFjdChhc3luYyAoKSA9PiAuLi4pIHdpdGhvdXQgYXdhaXQuICcgKyAnVGhpcyBjb3VsZCBsZWFkIHRvIHVuZXhwZWN0ZWQgdGVzdGluZyBiZWhhdmlvdXIsICcgKyAnaW50ZXJsZWF2aW5nIG11bHRpcGxlIGFjdCBjYWxscyBhbmQgbWl4aW5nIHRoZWlyICcgKyAnc2NvcGVzLiAnICsgJ1lvdSBzaG91bGQgLSBhd2FpdCBhY3QoYXN5bmMgKCkgPT4gLi4uKTsnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhlbmFibGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciByZXR1cm5WYWx1ZSA9IHJlc3VsdDsgLy8gVGhlIGNhbGxiYWNrIGlzIG5vdCBhbiBhc3luYyBmdW5jdGlvbi4gRXhpdCB0aGUgY3VycmVudCBzY29wZVxuICAgICAgLy8gaW1tZWRpYXRlbHksIHdpdGhvdXQgYXdhaXRpbmcuXG5cbiAgICAgIHBvcEFjdFNjb3BlKHByZXZBY3RTY29wZURlcHRoKTtcblxuICAgICAgaWYgKGFjdFNjb3BlRGVwdGggPT09IDApIHtcbiAgICAgICAgLy8gRXhpdGluZyB0aGUgb3V0ZXJtb3N0IGFjdCBzY29wZS4gRmx1c2ggdGhlIHF1ZXVlLlxuICAgICAgICB2YXIgX3F1ZXVlID0gUmVhY3RDdXJyZW50QWN0UXVldWUuY3VycmVudDtcblxuICAgICAgICBpZiAoX3F1ZXVlICE9PSBudWxsKSB7XG4gICAgICAgICAgZmx1c2hBY3RRdWV1ZShfcXVldWUpO1xuICAgICAgICAgIFJlYWN0Q3VycmVudEFjdFF1ZXVlLmN1cnJlbnQgPSBudWxsO1xuICAgICAgICB9IC8vIFJldHVybiBhIHRoZW5hYmxlLiBJZiB0aGUgdXNlciBhd2FpdHMgaXQsIHdlJ2xsIGZsdXNoIGFnYWluIGluXG4gICAgICAgIC8vIGNhc2UgYWRkaXRpb25hbCB3b3JrIHdhcyBzY2hlZHVsZWQgYnkgYSBtaWNyb3Rhc2suXG5cblxuICAgICAgICB2YXIgX3RoZW5hYmxlID0ge1xuICAgICAgICAgIHRoZW46IGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIC8vIENvbmZpcm0gd2UgaGF2ZW4ndCByZS1lbnRlcmVkIGFub3RoZXIgYGFjdGAgc2NvcGUsIGluIGNhc2VcbiAgICAgICAgICAgIC8vIHRoZSB1c2VyIGRvZXMgc29tZXRoaW5nIHdlaXJkIGxpa2UgYXdhaXQgdGhlIHRoZW5hYmxlXG4gICAgICAgICAgICAvLyBtdWx0aXBsZSB0aW1lcy5cbiAgICAgICAgICAgIGlmIChSZWFjdEN1cnJlbnRBY3RRdWV1ZS5jdXJyZW50ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGZsdXNoIHRoZSBxdWV1ZSB1bnRpbCB0aGVyZSdzIG5vIHJlbWFpbmluZyB3b3JrLlxuICAgICAgICAgICAgICBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5jdXJyZW50ID0gW107XG4gICAgICAgICAgICAgIHJlY3Vyc2l2ZWx5Rmx1c2hBc3luY0FjdFdvcmsocmV0dXJuVmFsdWUsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXNvbHZlKHJldHVyblZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBfdGhlbmFibGU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBTaW5jZSB3ZSdyZSBpbnNpZGUgYSBuZXN0ZWQgYGFjdGAgc2NvcGUsIHRoZSByZXR1cm5lZCB0aGVuYWJsZVxuICAgICAgICAvLyBpbW1lZGlhdGVseSByZXNvbHZlcy4gVGhlIG91dGVyIHNjb3BlIHdpbGwgZmx1c2ggdGhlIHF1ZXVlLlxuICAgICAgICB2YXIgX3RoZW5hYmxlMiA9IHtcbiAgICAgICAgICB0aGVuOiBmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICByZXNvbHZlKHJldHVyblZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBfdGhlbmFibGUyO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBwb3BBY3RTY29wZShwcmV2QWN0U2NvcGVEZXB0aCkge1xuICB7XG4gICAgaWYgKHByZXZBY3RTY29wZURlcHRoICE9PSBhY3RTY29wZURlcHRoIC0gMSkge1xuICAgICAgZXJyb3IoJ1lvdSBzZWVtIHRvIGhhdmUgb3ZlcmxhcHBpbmcgYWN0KCkgY2FsbHMsIHRoaXMgaXMgbm90IHN1cHBvcnRlZC4gJyArICdCZSBzdXJlIHRvIGF3YWl0IHByZXZpb3VzIGFjdCgpIGNhbGxzIGJlZm9yZSBtYWtpbmcgYSBuZXcgb25lLiAnKTtcbiAgICB9XG5cbiAgICBhY3RTY29wZURlcHRoID0gcHJldkFjdFNjb3BlRGVwdGg7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVjdXJzaXZlbHlGbHVzaEFzeW5jQWN0V29yayhyZXR1cm5WYWx1ZSwgcmVzb2x2ZSwgcmVqZWN0KSB7XG4gIHtcbiAgICB2YXIgcXVldWUgPSBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5jdXJyZW50O1xuXG4gICAgaWYgKHF1ZXVlICE9PSBudWxsKSB7XG4gICAgICB0cnkge1xuICAgICAgICBmbHVzaEFjdFF1ZXVlKHF1ZXVlKTtcbiAgICAgICAgZW5xdWV1ZVRhc2soZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChxdWV1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIC8vIE5vIGFkZGl0aW9uYWwgd29yayB3YXMgc2NoZWR1bGVkLiBGaW5pc2guXG4gICAgICAgICAgICBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5jdXJyZW50ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc29sdmUocmV0dXJuVmFsdWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBLZWVwIGZsdXNoaW5nIHdvcmsgdW50aWwgdGhlcmUncyBub25lIGxlZnQuXG4gICAgICAgICAgICByZWN1cnNpdmVseUZsdXNoQXN5bmNBY3RXb3JrKHJldHVyblZhbHVlLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXNvbHZlKHJldHVyblZhbHVlKTtcbiAgICB9XG4gIH1cbn1cblxudmFyIGlzRmx1c2hpbmcgPSBmYWxzZTtcblxuZnVuY3Rpb24gZmx1c2hBY3RRdWV1ZShxdWV1ZSkge1xuICB7XG4gICAgaWYgKCFpc0ZsdXNoaW5nKSB7XG4gICAgICAvLyBQcmV2ZW50IHJlLWVudHJhbmNlLlxuICAgICAgaXNGbHVzaGluZyA9IHRydWU7XG4gICAgICB2YXIgaSA9IDA7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciAoOyBpIDwgcXVldWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgY2FsbGJhY2sgPSBxdWV1ZVtpXTtcblxuICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sodHJ1ZSk7XG4gICAgICAgICAgfSB3aGlsZSAoY2FsbGJhY2sgIT09IG51bGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgcXVldWUubGVuZ3RoID0gMDtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIElmIHNvbWV0aGluZyB0aHJvd3MsIGxlYXZlIHRoZSByZW1haW5pbmcgY2FsbGJhY2tzIG9uIHRoZSBxdWV1ZS5cbiAgICAgICAgcXVldWUgPSBxdWV1ZS5zbGljZShpICsgMSk7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaXNGbHVzaGluZyA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG52YXIgY3JlYXRlRWxlbWVudCQxID0gIGNyZWF0ZUVsZW1lbnRXaXRoVmFsaWRhdGlvbiA7XG52YXIgY2xvbmVFbGVtZW50JDEgPSAgY2xvbmVFbGVtZW50V2l0aFZhbGlkYXRpb24gO1xudmFyIGNyZWF0ZUZhY3RvcnkgPSAgY3JlYXRlRmFjdG9yeVdpdGhWYWxpZGF0aW9uIDtcbnZhciBDaGlsZHJlbiA9IHtcbiAgbWFwOiBtYXBDaGlsZHJlbixcbiAgZm9yRWFjaDogZm9yRWFjaENoaWxkcmVuLFxuICBjb3VudDogY291bnRDaGlsZHJlbixcbiAgdG9BcnJheTogdG9BcnJheSxcbiAgb25seTogb25seUNoaWxkXG59O1xuXG5leHBvcnRzLkNoaWxkcmVuID0gQ2hpbGRyZW47XG5leHBvcnRzLkNvbXBvbmVudCA9IENvbXBvbmVudDtcbmV4cG9ydHMuRnJhZ21lbnQgPSBSRUFDVF9GUkFHTUVOVF9UWVBFO1xuZXhwb3J0cy5Qcm9maWxlciA9IFJFQUNUX1BST0ZJTEVSX1RZUEU7XG5leHBvcnRzLlB1cmVDb21wb25lbnQgPSBQdXJlQ29tcG9uZW50O1xuZXhwb3J0cy5TdHJpY3RNb2RlID0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRTtcbmV4cG9ydHMuU3VzcGVuc2UgPSBSRUFDVF9TVVNQRU5TRV9UWVBFO1xuZXhwb3J0cy5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRCA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzO1xuZXhwb3J0cy5jbG9uZUVsZW1lbnQgPSBjbG9uZUVsZW1lbnQkMTtcbmV4cG9ydHMuY3JlYXRlQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQ7XG5leHBvcnRzLmNyZWF0ZUVsZW1lbnQgPSBjcmVhdGVFbGVtZW50JDE7XG5leHBvcnRzLmNyZWF0ZUZhY3RvcnkgPSBjcmVhdGVGYWN0b3J5O1xuZXhwb3J0cy5jcmVhdGVSZWYgPSBjcmVhdGVSZWY7XG5leHBvcnRzLmZvcndhcmRSZWYgPSBmb3J3YXJkUmVmO1xuZXhwb3J0cy5pc1ZhbGlkRWxlbWVudCA9IGlzVmFsaWRFbGVtZW50O1xuZXhwb3J0cy5sYXp5ID0gbGF6eTtcbmV4cG9ydHMubWVtbyA9IG1lbW87XG5leHBvcnRzLnN0YXJ0VHJhbnNpdGlvbiA9IHN0YXJ0VHJhbnNpdGlvbjtcbmV4cG9ydHMudW5zdGFibGVfYWN0ID0gYWN0O1xuZXhwb3J0cy51c2VDYWxsYmFjayA9IHVzZUNhbGxiYWNrO1xuZXhwb3J0cy51c2VDb250ZXh0ID0gdXNlQ29udGV4dDtcbmV4cG9ydHMudXNlRGVidWdWYWx1ZSA9IHVzZURlYnVnVmFsdWU7XG5leHBvcnRzLnVzZURlZmVycmVkVmFsdWUgPSB1c2VEZWZlcnJlZFZhbHVlO1xuZXhwb3J0cy51c2VFZmZlY3QgPSB1c2VFZmZlY3Q7XG5leHBvcnRzLnVzZUlkID0gdXNlSWQ7XG5leHBvcnRzLnVzZUltcGVyYXRpdmVIYW5kbGUgPSB1c2VJbXBlcmF0aXZlSGFuZGxlO1xuZXhwb3J0cy51c2VJbnNlcnRpb25FZmZlY3QgPSB1c2VJbnNlcnRpb25FZmZlY3Q7XG5leHBvcnRzLnVzZUxheW91dEVmZmVjdCA9IHVzZUxheW91dEVmZmVjdDtcbmV4cG9ydHMudXNlTWVtbyA9IHVzZU1lbW87XG5leHBvcnRzLnVzZVJlZHVjZXIgPSB1c2VSZWR1Y2VyO1xuZXhwb3J0cy51c2VSZWYgPSB1c2VSZWY7XG5leHBvcnRzLnVzZVN0YXRlID0gdXNlU3RhdGU7XG5leHBvcnRzLnVzZVN5bmNFeHRlcm5hbFN0b3JlID0gdXNlU3luY0V4dGVybmFsU3RvcmU7XG5leHBvcnRzLnVzZVRyYW5zaXRpb24gPSB1c2VUcmFuc2l0aW9uO1xuZXhwb3J0cy52ZXJzaW9uID0gUmVhY3RWZXJzaW9uO1xuICAgICAgICAgIC8qIGdsb2JhbCBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gKi9cbmlmIChcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RvcCA9PT1cbiAgICAnZnVuY3Rpb24nXG4pIHtcbiAgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdG9wKG5ldyBFcnJvcigpKTtcbn1cbiAgICAgICAgXG4gIH0pKCk7XG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LnByb2R1Y3Rpb24ubWluLmpzJyk7XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LmRldmVsb3BtZW50LmpzJyk7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZSBSZWFjdFxuICogc2NoZWR1bGVyLmRldmVsb3BtZW50LmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gIChmdW5jdGlvbigpIHtcblxuICAgICAgICAgICd1c2Ugc3RyaWN0JztcblxuLyogZ2xvYmFsIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAqL1xuaWYgKFxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICE9PSAndW5kZWZpbmVkJyAmJlxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdGFydCA9PT1cbiAgICAnZnVuY3Rpb24nXG4pIHtcbiAgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdGFydChuZXcgRXJyb3IoKSk7XG59XG4gICAgICAgICAgdmFyIGVuYWJsZVNjaGVkdWxlckRlYnVnZ2luZyA9IGZhbHNlO1xudmFyIGVuYWJsZVByb2ZpbGluZyA9IGZhbHNlO1xudmFyIGZyYW1lWWllbGRNcyA9IDU7XG5cbmZ1bmN0aW9uIHB1c2goaGVhcCwgbm9kZSkge1xuICB2YXIgaW5kZXggPSBoZWFwLmxlbmd0aDtcbiAgaGVhcC5wdXNoKG5vZGUpO1xuICBzaWZ0VXAoaGVhcCwgbm9kZSwgaW5kZXgpO1xufVxuZnVuY3Rpb24gcGVlayhoZWFwKSB7XG4gIHJldHVybiBoZWFwLmxlbmd0aCA9PT0gMCA/IG51bGwgOiBoZWFwWzBdO1xufVxuZnVuY3Rpb24gcG9wKGhlYXApIHtcbiAgaWYgKGhlYXAubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgZmlyc3QgPSBoZWFwWzBdO1xuICB2YXIgbGFzdCA9IGhlYXAucG9wKCk7XG5cbiAgaWYgKGxhc3QgIT09IGZpcnN0KSB7XG4gICAgaGVhcFswXSA9IGxhc3Q7XG4gICAgc2lmdERvd24oaGVhcCwgbGFzdCwgMCk7XG4gIH1cblxuICByZXR1cm4gZmlyc3Q7XG59XG5cbmZ1bmN0aW9uIHNpZnRVcChoZWFwLCBub2RlLCBpKSB7XG4gIHZhciBpbmRleCA9IGk7XG5cbiAgd2hpbGUgKGluZGV4ID4gMCkge1xuICAgIHZhciBwYXJlbnRJbmRleCA9IGluZGV4IC0gMSA+Pj4gMTtcbiAgICB2YXIgcGFyZW50ID0gaGVhcFtwYXJlbnRJbmRleF07XG5cbiAgICBpZiAoY29tcGFyZShwYXJlbnQsIG5vZGUpID4gMCkge1xuICAgICAgLy8gVGhlIHBhcmVudCBpcyBsYXJnZXIuIFN3YXAgcG9zaXRpb25zLlxuICAgICAgaGVhcFtwYXJlbnRJbmRleF0gPSBub2RlO1xuICAgICAgaGVhcFtpbmRleF0gPSBwYXJlbnQ7XG4gICAgICBpbmRleCA9IHBhcmVudEluZGV4O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGUgcGFyZW50IGlzIHNtYWxsZXIuIEV4aXQuXG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNpZnREb3duKGhlYXAsIG5vZGUsIGkpIHtcbiAgdmFyIGluZGV4ID0gaTtcbiAgdmFyIGxlbmd0aCA9IGhlYXAubGVuZ3RoO1xuICB2YXIgaGFsZkxlbmd0aCA9IGxlbmd0aCA+Pj4gMTtcblxuICB3aGlsZSAoaW5kZXggPCBoYWxmTGVuZ3RoKSB7XG4gICAgdmFyIGxlZnRJbmRleCA9IChpbmRleCArIDEpICogMiAtIDE7XG4gICAgdmFyIGxlZnQgPSBoZWFwW2xlZnRJbmRleF07XG4gICAgdmFyIHJpZ2h0SW5kZXggPSBsZWZ0SW5kZXggKyAxO1xuICAgIHZhciByaWdodCA9IGhlYXBbcmlnaHRJbmRleF07IC8vIElmIHRoZSBsZWZ0IG9yIHJpZ2h0IG5vZGUgaXMgc21hbGxlciwgc3dhcCB3aXRoIHRoZSBzbWFsbGVyIG9mIHRob3NlLlxuXG4gICAgaWYgKGNvbXBhcmUobGVmdCwgbm9kZSkgPCAwKSB7XG4gICAgICBpZiAocmlnaHRJbmRleCA8IGxlbmd0aCAmJiBjb21wYXJlKHJpZ2h0LCBsZWZ0KSA8IDApIHtcbiAgICAgICAgaGVhcFtpbmRleF0gPSByaWdodDtcbiAgICAgICAgaGVhcFtyaWdodEluZGV4XSA9IG5vZGU7XG4gICAgICAgIGluZGV4ID0gcmlnaHRJbmRleDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGhlYXBbaW5kZXhdID0gbGVmdDtcbiAgICAgICAgaGVhcFtsZWZ0SW5kZXhdID0gbm9kZTtcbiAgICAgICAgaW5kZXggPSBsZWZ0SW5kZXg7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChyaWdodEluZGV4IDwgbGVuZ3RoICYmIGNvbXBhcmUocmlnaHQsIG5vZGUpIDwgMCkge1xuICAgICAgaGVhcFtpbmRleF0gPSByaWdodDtcbiAgICAgIGhlYXBbcmlnaHRJbmRleF0gPSBub2RlO1xuICAgICAgaW5kZXggPSByaWdodEluZGV4O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBOZWl0aGVyIGNoaWxkIGlzIHNtYWxsZXIuIEV4aXQuXG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbXBhcmUoYSwgYikge1xuICAvLyBDb21wYXJlIHNvcnQgaW5kZXggZmlyc3QsIHRoZW4gdGFzayBpZC5cbiAgdmFyIGRpZmYgPSBhLnNvcnRJbmRleCAtIGIuc29ydEluZGV4O1xuICByZXR1cm4gZGlmZiAhPT0gMCA/IGRpZmYgOiBhLmlkIC0gYi5pZDtcbn1cblxuLy8gVE9ETzogVXNlIHN5bWJvbHM/XG52YXIgSW1tZWRpYXRlUHJpb3JpdHkgPSAxO1xudmFyIFVzZXJCbG9ja2luZ1ByaW9yaXR5ID0gMjtcbnZhciBOb3JtYWxQcmlvcml0eSA9IDM7XG52YXIgTG93UHJpb3JpdHkgPSA0O1xudmFyIElkbGVQcmlvcml0eSA9IDU7XG5cbmZ1bmN0aW9uIG1hcmtUYXNrRXJyb3JlZCh0YXNrLCBtcykge1xufVxuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby12YXIgKi9cblxudmFyIGhhc1BlcmZvcm1hbmNlTm93ID0gdHlwZW9mIHBlcmZvcm1hbmNlID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgcGVyZm9ybWFuY2Uubm93ID09PSAnZnVuY3Rpb24nO1xuXG5pZiAoaGFzUGVyZm9ybWFuY2VOb3cpIHtcbiAgdmFyIGxvY2FsUGVyZm9ybWFuY2UgPSBwZXJmb3JtYW5jZTtcblxuICBleHBvcnRzLnVuc3RhYmxlX25vdyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gbG9jYWxQZXJmb3JtYW5jZS5ub3coKTtcbiAgfTtcbn0gZWxzZSB7XG4gIHZhciBsb2NhbERhdGUgPSBEYXRlO1xuICB2YXIgaW5pdGlhbFRpbWUgPSBsb2NhbERhdGUubm93KCk7XG5cbiAgZXhwb3J0cy51bnN0YWJsZV9ub3cgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGxvY2FsRGF0ZS5ub3coKSAtIGluaXRpYWxUaW1lO1xuICB9O1xufSAvLyBNYXggMzEgYml0IGludGVnZXIuIFRoZSBtYXggaW50ZWdlciBzaXplIGluIFY4IGZvciAzMi1iaXQgc3lzdGVtcy5cbi8vIE1hdGgucG93KDIsIDMwKSAtIDFcbi8vIDBiMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExXG5cblxudmFyIG1heFNpZ25lZDMxQml0SW50ID0gMTA3Mzc0MTgyMzsgLy8gVGltZXMgb3V0IGltbWVkaWF0ZWx5XG5cbnZhciBJTU1FRElBVEVfUFJJT1JJVFlfVElNRU9VVCA9IC0xOyAvLyBFdmVudHVhbGx5IHRpbWVzIG91dFxuXG52YXIgVVNFUl9CTE9DS0lOR19QUklPUklUWV9USU1FT1VUID0gMjUwO1xudmFyIE5PUk1BTF9QUklPUklUWV9USU1FT1VUID0gNTAwMDtcbnZhciBMT1dfUFJJT1JJVFlfVElNRU9VVCA9IDEwMDAwOyAvLyBOZXZlciB0aW1lcyBvdXRcblxudmFyIElETEVfUFJJT1JJVFlfVElNRU9VVCA9IG1heFNpZ25lZDMxQml0SW50OyAvLyBUYXNrcyBhcmUgc3RvcmVkIG9uIGEgbWluIGhlYXBcblxudmFyIHRhc2tRdWV1ZSA9IFtdO1xudmFyIHRpbWVyUXVldWUgPSBbXTsgLy8gSW5jcmVtZW50aW5nIGlkIGNvdW50ZXIuIFVzZWQgdG8gbWFpbnRhaW4gaW5zZXJ0aW9uIG9yZGVyLlxuXG52YXIgdGFza0lkQ291bnRlciA9IDE7IC8vIFBhdXNpbmcgdGhlIHNjaGVkdWxlciBpcyB1c2VmdWwgZm9yIGRlYnVnZ2luZy5cbnZhciBjdXJyZW50VGFzayA9IG51bGw7XG52YXIgY3VycmVudFByaW9yaXR5TGV2ZWwgPSBOb3JtYWxQcmlvcml0eTsgLy8gVGhpcyBpcyBzZXQgd2hpbGUgcGVyZm9ybWluZyB3b3JrLCB0byBwcmV2ZW50IHJlLWVudHJhbmNlLlxuXG52YXIgaXNQZXJmb3JtaW5nV29yayA9IGZhbHNlO1xudmFyIGlzSG9zdENhbGxiYWNrU2NoZWR1bGVkID0gZmFsc2U7XG52YXIgaXNIb3N0VGltZW91dFNjaGVkdWxlZCA9IGZhbHNlOyAvLyBDYXB0dXJlIGxvY2FsIHJlZmVyZW5jZXMgdG8gbmF0aXZlIEFQSXMsIGluIGNhc2UgYSBwb2x5ZmlsbCBvdmVycmlkZXMgdGhlbS5cblxudmFyIGxvY2FsU2V0VGltZW91dCA9IHR5cGVvZiBzZXRUaW1lb3V0ID09PSAnZnVuY3Rpb24nID8gc2V0VGltZW91dCA6IG51bGw7XG52YXIgbG9jYWxDbGVhclRpbWVvdXQgPSB0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nID8gY2xlYXJUaW1lb3V0IDogbnVsbDtcbnZhciBsb2NhbFNldEltbWVkaWF0ZSA9IHR5cGVvZiBzZXRJbW1lZGlhdGUgIT09ICd1bmRlZmluZWQnID8gc2V0SW1tZWRpYXRlIDogbnVsbDsgLy8gSUUgYW5kIE5vZGUuanMgKyBqc2RvbVxuXG52YXIgaXNJbnB1dFBlbmRpbmcgPSB0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiBuYXZpZ2F0b3Iuc2NoZWR1bGluZyAhPT0gdW5kZWZpbmVkICYmIG5hdmlnYXRvci5zY2hlZHVsaW5nLmlzSW5wdXRQZW5kaW5nICE9PSB1bmRlZmluZWQgPyBuYXZpZ2F0b3Iuc2NoZWR1bGluZy5pc0lucHV0UGVuZGluZy5iaW5kKG5hdmlnYXRvci5zY2hlZHVsaW5nKSA6IG51bGw7XG5cbmZ1bmN0aW9uIGFkdmFuY2VUaW1lcnMoY3VycmVudFRpbWUpIHtcbiAgLy8gQ2hlY2sgZm9yIHRhc2tzIHRoYXQgYXJlIG5vIGxvbmdlciBkZWxheWVkIGFuZCBhZGQgdGhlbSB0byB0aGUgcXVldWUuXG4gIHZhciB0aW1lciA9IHBlZWsodGltZXJRdWV1ZSk7XG5cbiAgd2hpbGUgKHRpbWVyICE9PSBudWxsKSB7XG4gICAgaWYgKHRpbWVyLmNhbGxiYWNrID09PSBudWxsKSB7XG4gICAgICAvLyBUaW1lciB3YXMgY2FuY2VsbGVkLlxuICAgICAgcG9wKHRpbWVyUXVldWUpO1xuICAgIH0gZWxzZSBpZiAodGltZXIuc3RhcnRUaW1lIDw9IGN1cnJlbnRUaW1lKSB7XG4gICAgICAvLyBUaW1lciBmaXJlZC4gVHJhbnNmZXIgdG8gdGhlIHRhc2sgcXVldWUuXG4gICAgICBwb3AodGltZXJRdWV1ZSk7XG4gICAgICB0aW1lci5zb3J0SW5kZXggPSB0aW1lci5leHBpcmF0aW9uVGltZTtcbiAgICAgIHB1c2godGFza1F1ZXVlLCB0aW1lcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlbWFpbmluZyB0aW1lcnMgYXJlIHBlbmRpbmcuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGltZXIgPSBwZWVrKHRpbWVyUXVldWUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhbmRsZVRpbWVvdXQoY3VycmVudFRpbWUpIHtcbiAgaXNIb3N0VGltZW91dFNjaGVkdWxlZCA9IGZhbHNlO1xuICBhZHZhbmNlVGltZXJzKGN1cnJlbnRUaW1lKTtcblxuICBpZiAoIWlzSG9zdENhbGxiYWNrU2NoZWR1bGVkKSB7XG4gICAgaWYgKHBlZWsodGFza1F1ZXVlKSAhPT0gbnVsbCkge1xuICAgICAgaXNIb3N0Q2FsbGJhY2tTY2hlZHVsZWQgPSB0cnVlO1xuICAgICAgcmVxdWVzdEhvc3RDYWxsYmFjayhmbHVzaFdvcmspO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgZmlyc3RUaW1lciA9IHBlZWsodGltZXJRdWV1ZSk7XG5cbiAgICAgIGlmIChmaXJzdFRpbWVyICE9PSBudWxsKSB7XG4gICAgICAgIHJlcXVlc3RIb3N0VGltZW91dChoYW5kbGVUaW1lb3V0LCBmaXJzdFRpbWVyLnN0YXJ0VGltZSAtIGN1cnJlbnRUaW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZmx1c2hXb3JrKGhhc1RpbWVSZW1haW5pbmcsIGluaXRpYWxUaW1lKSB7XG5cblxuICBpc0hvc3RDYWxsYmFja1NjaGVkdWxlZCA9IGZhbHNlO1xuXG4gIGlmIChpc0hvc3RUaW1lb3V0U2NoZWR1bGVkKSB7XG4gICAgLy8gV2Ugc2NoZWR1bGVkIGEgdGltZW91dCBidXQgaXQncyBubyBsb25nZXIgbmVlZGVkLiBDYW5jZWwgaXQuXG4gICAgaXNIb3N0VGltZW91dFNjaGVkdWxlZCA9IGZhbHNlO1xuICAgIGNhbmNlbEhvc3RUaW1lb3V0KCk7XG4gIH1cblxuICBpc1BlcmZvcm1pbmdXb3JrID0gdHJ1ZTtcbiAgdmFyIHByZXZpb3VzUHJpb3JpdHlMZXZlbCA9IGN1cnJlbnRQcmlvcml0eUxldmVsO1xuXG4gIHRyeSB7XG4gICAgaWYgKGVuYWJsZVByb2ZpbGluZykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHdvcmtMb29wKGhhc1RpbWVSZW1haW5pbmcsIGluaXRpYWxUaW1lKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChjdXJyZW50VGFzayAhPT0gbnVsbCkge1xuICAgICAgICAgIHZhciBjdXJyZW50VGltZSA9IGV4cG9ydHMudW5zdGFibGVfbm93KCk7XG4gICAgICAgICAgbWFya1Rhc2tFcnJvcmVkKGN1cnJlbnRUYXNrLCBjdXJyZW50VGltZSk7XG4gICAgICAgICAgY3VycmVudFRhc2suaXNRdWV1ZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBObyBjYXRjaCBpbiBwcm9kIGNvZGUgcGF0aC5cbiAgICAgIHJldHVybiB3b3JrTG9vcChoYXNUaW1lUmVtYWluaW5nLCBpbml0aWFsVGltZSk7XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIGN1cnJlbnRUYXNrID0gbnVsbDtcbiAgICBjdXJyZW50UHJpb3JpdHlMZXZlbCA9IHByZXZpb3VzUHJpb3JpdHlMZXZlbDtcbiAgICBpc1BlcmZvcm1pbmdXb3JrID0gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gd29ya0xvb3AoaGFzVGltZVJlbWFpbmluZywgaW5pdGlhbFRpbWUpIHtcbiAgdmFyIGN1cnJlbnRUaW1lID0gaW5pdGlhbFRpbWU7XG4gIGFkdmFuY2VUaW1lcnMoY3VycmVudFRpbWUpO1xuICBjdXJyZW50VGFzayA9IHBlZWsodGFza1F1ZXVlKTtcblxuICB3aGlsZSAoY3VycmVudFRhc2sgIT09IG51bGwgJiYgIShlbmFibGVTY2hlZHVsZXJEZWJ1Z2dpbmcgKSkge1xuICAgIGlmIChjdXJyZW50VGFzay5leHBpcmF0aW9uVGltZSA+IGN1cnJlbnRUaW1lICYmICghaGFzVGltZVJlbWFpbmluZyB8fCBzaG91bGRZaWVsZFRvSG9zdCgpKSkge1xuICAgICAgLy8gVGhpcyBjdXJyZW50VGFzayBoYXNuJ3QgZXhwaXJlZCwgYW5kIHdlJ3ZlIHJlYWNoZWQgdGhlIGRlYWRsaW5lLlxuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgdmFyIGNhbGxiYWNrID0gY3VycmVudFRhc2suY2FsbGJhY2s7XG5cbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjdXJyZW50VGFzay5jYWxsYmFjayA9IG51bGw7XG4gICAgICBjdXJyZW50UHJpb3JpdHlMZXZlbCA9IGN1cnJlbnRUYXNrLnByaW9yaXR5TGV2ZWw7XG4gICAgICB2YXIgZGlkVXNlckNhbGxiYWNrVGltZW91dCA9IGN1cnJlbnRUYXNrLmV4cGlyYXRpb25UaW1lIDw9IGN1cnJlbnRUaW1lO1xuXG4gICAgICB2YXIgY29udGludWF0aW9uQ2FsbGJhY2sgPSBjYWxsYmFjayhkaWRVc2VyQ2FsbGJhY2tUaW1lb3V0KTtcbiAgICAgIGN1cnJlbnRUaW1lID0gZXhwb3J0cy51bnN0YWJsZV9ub3coKTtcblxuICAgICAgaWYgKHR5cGVvZiBjb250aW51YXRpb25DYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjdXJyZW50VGFzay5jYWxsYmFjayA9IGNvbnRpbnVhdGlvbkNhbGxiYWNrO1xuICAgICAgfSBlbHNlIHtcblxuICAgICAgICBpZiAoY3VycmVudFRhc2sgPT09IHBlZWsodGFza1F1ZXVlKSkge1xuICAgICAgICAgIHBvcCh0YXNrUXVldWUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGFkdmFuY2VUaW1lcnMoY3VycmVudFRpbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwb3AodGFza1F1ZXVlKTtcbiAgICB9XG5cbiAgICBjdXJyZW50VGFzayA9IHBlZWsodGFza1F1ZXVlKTtcbiAgfSAvLyBSZXR1cm4gd2hldGhlciB0aGVyZSdzIGFkZGl0aW9uYWwgd29ya1xuXG5cbiAgaWYgKGN1cnJlbnRUYXNrICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGZpcnN0VGltZXIgPSBwZWVrKHRpbWVyUXVldWUpO1xuXG4gICAgaWYgKGZpcnN0VGltZXIgIT09IG51bGwpIHtcbiAgICAgIHJlcXVlc3RIb3N0VGltZW91dChoYW5kbGVUaW1lb3V0LCBmaXJzdFRpbWVyLnN0YXJ0VGltZSAtIGN1cnJlbnRUaW1lKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gdW5zdGFibGVfcnVuV2l0aFByaW9yaXR5KHByaW9yaXR5TGV2ZWwsIGV2ZW50SGFuZGxlcikge1xuICBzd2l0Y2ggKHByaW9yaXR5TGV2ZWwpIHtcbiAgICBjYXNlIEltbWVkaWF0ZVByaW9yaXR5OlxuICAgIGNhc2UgVXNlckJsb2NraW5nUHJpb3JpdHk6XG4gICAgY2FzZSBOb3JtYWxQcmlvcml0eTpcbiAgICBjYXNlIExvd1ByaW9yaXR5OlxuICAgIGNhc2UgSWRsZVByaW9yaXR5OlxuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcHJpb3JpdHlMZXZlbCA9IE5vcm1hbFByaW9yaXR5O1xuICB9XG5cbiAgdmFyIHByZXZpb3VzUHJpb3JpdHlMZXZlbCA9IGN1cnJlbnRQcmlvcml0eUxldmVsO1xuICBjdXJyZW50UHJpb3JpdHlMZXZlbCA9IHByaW9yaXR5TGV2ZWw7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gZXZlbnRIYW5kbGVyKCk7XG4gIH0gZmluYWxseSB7XG4gICAgY3VycmVudFByaW9yaXR5TGV2ZWwgPSBwcmV2aW91c1ByaW9yaXR5TGV2ZWw7XG4gIH1cbn1cblxuZnVuY3Rpb24gdW5zdGFibGVfbmV4dChldmVudEhhbmRsZXIpIHtcbiAgdmFyIHByaW9yaXR5TGV2ZWw7XG5cbiAgc3dpdGNoIChjdXJyZW50UHJpb3JpdHlMZXZlbCkge1xuICAgIGNhc2UgSW1tZWRpYXRlUHJpb3JpdHk6XG4gICAgY2FzZSBVc2VyQmxvY2tpbmdQcmlvcml0eTpcbiAgICBjYXNlIE5vcm1hbFByaW9yaXR5OlxuICAgICAgLy8gU2hpZnQgZG93biB0byBub3JtYWwgcHJpb3JpdHlcbiAgICAgIHByaW9yaXR5TGV2ZWwgPSBOb3JtYWxQcmlvcml0eTtcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIEFueXRoaW5nIGxvd2VyIHRoYW4gbm9ybWFsIHByaW9yaXR5IHNob3VsZCByZW1haW4gYXQgdGhlIGN1cnJlbnQgbGV2ZWwuXG4gICAgICBwcmlvcml0eUxldmVsID0gY3VycmVudFByaW9yaXR5TGV2ZWw7XG4gICAgICBicmVhaztcbiAgfVxuXG4gIHZhciBwcmV2aW91c1ByaW9yaXR5TGV2ZWwgPSBjdXJyZW50UHJpb3JpdHlMZXZlbDtcbiAgY3VycmVudFByaW9yaXR5TGV2ZWwgPSBwcmlvcml0eUxldmVsO1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGV2ZW50SGFuZGxlcigpO1xuICB9IGZpbmFsbHkge1xuICAgIGN1cnJlbnRQcmlvcml0eUxldmVsID0gcHJldmlvdXNQcmlvcml0eUxldmVsO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX3dyYXBDYWxsYmFjayhjYWxsYmFjaykge1xuICB2YXIgcGFyZW50UHJpb3JpdHlMZXZlbCA9IGN1cnJlbnRQcmlvcml0eUxldmVsO1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIC8vIFRoaXMgaXMgYSBmb3JrIG9mIHJ1bldpdGhQcmlvcml0eSwgaW5saW5lZCBmb3IgcGVyZm9ybWFuY2UuXG4gICAgdmFyIHByZXZpb3VzUHJpb3JpdHlMZXZlbCA9IGN1cnJlbnRQcmlvcml0eUxldmVsO1xuICAgIGN1cnJlbnRQcmlvcml0eUxldmVsID0gcGFyZW50UHJpb3JpdHlMZXZlbDtcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2suYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgY3VycmVudFByaW9yaXR5TGV2ZWwgPSBwcmV2aW91c1ByaW9yaXR5TGV2ZWw7XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiB1bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrKHByaW9yaXR5TGV2ZWwsIGNhbGxiYWNrLCBvcHRpb25zKSB7XG4gIHZhciBjdXJyZW50VGltZSA9IGV4cG9ydHMudW5zdGFibGVfbm93KCk7XG4gIHZhciBzdGFydFRpbWU7XG5cbiAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnb2JqZWN0JyAmJiBvcHRpb25zICE9PSBudWxsKSB7XG4gICAgdmFyIGRlbGF5ID0gb3B0aW9ucy5kZWxheTtcblxuICAgIGlmICh0eXBlb2YgZGVsYXkgPT09ICdudW1iZXInICYmIGRlbGF5ID4gMCkge1xuICAgICAgc3RhcnRUaW1lID0gY3VycmVudFRpbWUgKyBkZWxheTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhcnRUaW1lID0gY3VycmVudFRpbWU7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHN0YXJ0VGltZSA9IGN1cnJlbnRUaW1lO1xuICB9XG5cbiAgdmFyIHRpbWVvdXQ7XG5cbiAgc3dpdGNoIChwcmlvcml0eUxldmVsKSB7XG4gICAgY2FzZSBJbW1lZGlhdGVQcmlvcml0eTpcbiAgICAgIHRpbWVvdXQgPSBJTU1FRElBVEVfUFJJT1JJVFlfVElNRU9VVDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBVc2VyQmxvY2tpbmdQcmlvcml0eTpcbiAgICAgIHRpbWVvdXQgPSBVU0VSX0JMT0NLSU5HX1BSSU9SSVRZX1RJTUVPVVQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgSWRsZVByaW9yaXR5OlxuICAgICAgdGltZW91dCA9IElETEVfUFJJT1JJVFlfVElNRU9VVDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBMb3dQcmlvcml0eTpcbiAgICAgIHRpbWVvdXQgPSBMT1dfUFJJT1JJVFlfVElNRU9VVDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBOb3JtYWxQcmlvcml0eTpcbiAgICBkZWZhdWx0OlxuICAgICAgdGltZW91dCA9IE5PUk1BTF9QUklPUklUWV9USU1FT1VUO1xuICAgICAgYnJlYWs7XG4gIH1cblxuICB2YXIgZXhwaXJhdGlvblRpbWUgPSBzdGFydFRpbWUgKyB0aW1lb3V0O1xuICB2YXIgbmV3VGFzayA9IHtcbiAgICBpZDogdGFza0lkQ291bnRlcisrLFxuICAgIGNhbGxiYWNrOiBjYWxsYmFjayxcbiAgICBwcmlvcml0eUxldmVsOiBwcmlvcml0eUxldmVsLFxuICAgIHN0YXJ0VGltZTogc3RhcnRUaW1lLFxuICAgIGV4cGlyYXRpb25UaW1lOiBleHBpcmF0aW9uVGltZSxcbiAgICBzb3J0SW5kZXg6IC0xXG4gIH07XG5cbiAgaWYgKHN0YXJ0VGltZSA+IGN1cnJlbnRUaW1lKSB7XG4gICAgLy8gVGhpcyBpcyBhIGRlbGF5ZWQgdGFzay5cbiAgICBuZXdUYXNrLnNvcnRJbmRleCA9IHN0YXJ0VGltZTtcbiAgICBwdXNoKHRpbWVyUXVldWUsIG5ld1Rhc2spO1xuXG4gICAgaWYgKHBlZWsodGFza1F1ZXVlKSA9PT0gbnVsbCAmJiBuZXdUYXNrID09PSBwZWVrKHRpbWVyUXVldWUpKSB7XG4gICAgICAvLyBBbGwgdGFza3MgYXJlIGRlbGF5ZWQsIGFuZCB0aGlzIGlzIHRoZSB0YXNrIHdpdGggdGhlIGVhcmxpZXN0IGRlbGF5LlxuICAgICAgaWYgKGlzSG9zdFRpbWVvdXRTY2hlZHVsZWQpIHtcbiAgICAgICAgLy8gQ2FuY2VsIGFuIGV4aXN0aW5nIHRpbWVvdXQuXG4gICAgICAgIGNhbmNlbEhvc3RUaW1lb3V0KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpc0hvc3RUaW1lb3V0U2NoZWR1bGVkID0gdHJ1ZTtcbiAgICAgIH0gLy8gU2NoZWR1bGUgYSB0aW1lb3V0LlxuXG5cbiAgICAgIHJlcXVlc3RIb3N0VGltZW91dChoYW5kbGVUaW1lb3V0LCBzdGFydFRpbWUgLSBjdXJyZW50VGltZSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIG5ld1Rhc2suc29ydEluZGV4ID0gZXhwaXJhdGlvblRpbWU7XG4gICAgcHVzaCh0YXNrUXVldWUsIG5ld1Rhc2spO1xuICAgIC8vIHdhaXQgdW50aWwgdGhlIG5leHQgdGltZSB3ZSB5aWVsZC5cblxuXG4gICAgaWYgKCFpc0hvc3RDYWxsYmFja1NjaGVkdWxlZCAmJiAhaXNQZXJmb3JtaW5nV29yaykge1xuICAgICAgaXNIb3N0Q2FsbGJhY2tTY2hlZHVsZWQgPSB0cnVlO1xuICAgICAgcmVxdWVzdEhvc3RDYWxsYmFjayhmbHVzaFdvcmspO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXdUYXNrO1xufVxuXG5mdW5jdGlvbiB1bnN0YWJsZV9wYXVzZUV4ZWN1dGlvbigpIHtcbn1cblxuZnVuY3Rpb24gdW5zdGFibGVfY29udGludWVFeGVjdXRpb24oKSB7XG5cbiAgaWYgKCFpc0hvc3RDYWxsYmFja1NjaGVkdWxlZCAmJiAhaXNQZXJmb3JtaW5nV29yaykge1xuICAgIGlzSG9zdENhbGxiYWNrU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICByZXF1ZXN0SG9zdENhbGxiYWNrKGZsdXNoV29yayk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdW5zdGFibGVfZ2V0Rmlyc3RDYWxsYmFja05vZGUoKSB7XG4gIHJldHVybiBwZWVrKHRhc2tRdWV1ZSk7XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX2NhbmNlbENhbGxiYWNrKHRhc2spIHtcbiAgLy8gcmVtb3ZlIGZyb20gdGhlIHF1ZXVlIGJlY2F1c2UgeW91IGNhbid0IHJlbW92ZSBhcmJpdHJhcnkgbm9kZXMgZnJvbSBhblxuICAvLyBhcnJheSBiYXNlZCBoZWFwLCBvbmx5IHRoZSBmaXJzdCBvbmUuKVxuXG5cbiAgdGFzay5jYWxsYmFjayA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX2dldEN1cnJlbnRQcmlvcml0eUxldmVsKCkge1xuICByZXR1cm4gY3VycmVudFByaW9yaXR5TGV2ZWw7XG59XG5cbnZhciBpc01lc3NhZ2VMb29wUnVubmluZyA9IGZhbHNlO1xudmFyIHNjaGVkdWxlZEhvc3RDYWxsYmFjayA9IG51bGw7XG52YXIgdGFza1RpbWVvdXRJRCA9IC0xOyAvLyBTY2hlZHVsZXIgcGVyaW9kaWNhbGx5IHlpZWxkcyBpbiBjYXNlIHRoZXJlIGlzIG90aGVyIHdvcmsgb24gdGhlIG1haW5cbi8vIHRocmVhZCwgbGlrZSB1c2VyIGV2ZW50cy4gQnkgZGVmYXVsdCwgaXQgeWllbGRzIG11bHRpcGxlIHRpbWVzIHBlciBmcmFtZS5cbi8vIEl0IGRvZXMgbm90IGF0dGVtcHQgdG8gYWxpZ24gd2l0aCBmcmFtZSBib3VuZGFyaWVzLCBzaW5jZSBtb3N0IHRhc2tzIGRvbid0XG4vLyBuZWVkIHRvIGJlIGZyYW1lIGFsaWduZWQ7IGZvciB0aG9zZSB0aGF0IGRvLCB1c2UgcmVxdWVzdEFuaW1hdGlvbkZyYW1lLlxuXG52YXIgZnJhbWVJbnRlcnZhbCA9IGZyYW1lWWllbGRNcztcbnZhciBzdGFydFRpbWUgPSAtMTtcblxuZnVuY3Rpb24gc2hvdWxkWWllbGRUb0hvc3QoKSB7XG4gIHZhciB0aW1lRWxhcHNlZCA9IGV4cG9ydHMudW5zdGFibGVfbm93KCkgLSBzdGFydFRpbWU7XG5cbiAgaWYgKHRpbWVFbGFwc2VkIDwgZnJhbWVJbnRlcnZhbCkge1xuICAgIC8vIFRoZSBtYWluIHRocmVhZCBoYXMgb25seSBiZWVuIGJsb2NrZWQgZm9yIGEgcmVhbGx5IHNob3J0IGFtb3VudCBvZiB0aW1lO1xuICAgIC8vIHNtYWxsZXIgdGhhbiBhIHNpbmdsZSBmcmFtZS4gRG9uJ3QgeWllbGQgeWV0LlxuICAgIHJldHVybiBmYWxzZTtcbiAgfSAvLyBUaGUgbWFpbiB0aHJlYWQgaGFzIGJlZW4gYmxvY2tlZCBmb3IgYSBub24tbmVnbGlnaWJsZSBhbW91bnQgb2YgdGltZS4gV2VcblxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiByZXF1ZXN0UGFpbnQoKSB7XG5cbn1cblxuZnVuY3Rpb24gZm9yY2VGcmFtZVJhdGUoZnBzKSB7XG4gIGlmIChmcHMgPCAwIHx8IGZwcyA+IDEyNSkge1xuICAgIC8vIFVzaW5nIGNvbnNvbGVbJ2Vycm9yJ10gdG8gZXZhZGUgQmFiZWwgYW5kIEVTTGludFxuICAgIGNvbnNvbGVbJ2Vycm9yJ10oJ2ZvcmNlRnJhbWVSYXRlIHRha2VzIGEgcG9zaXRpdmUgaW50IGJldHdlZW4gMCBhbmQgMTI1LCAnICsgJ2ZvcmNpbmcgZnJhbWUgcmF0ZXMgaGlnaGVyIHRoYW4gMTI1IGZwcyBpcyBub3Qgc3VwcG9ydGVkJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGZwcyA+IDApIHtcbiAgICBmcmFtZUludGVydmFsID0gTWF0aC5mbG9vcigxMDAwIC8gZnBzKTtcbiAgfSBlbHNlIHtcbiAgICAvLyByZXNldCB0aGUgZnJhbWVyYXRlXG4gICAgZnJhbWVJbnRlcnZhbCA9IGZyYW1lWWllbGRNcztcbiAgfVxufVxuXG52YXIgcGVyZm9ybVdvcmtVbnRpbERlYWRsaW5lID0gZnVuY3Rpb24gKCkge1xuICBpZiAoc2NoZWR1bGVkSG9zdENhbGxiYWNrICE9PSBudWxsKSB7XG4gICAgdmFyIGN1cnJlbnRUaW1lID0gZXhwb3J0cy51bnN0YWJsZV9ub3coKTsgLy8gS2VlcCB0cmFjayBvZiB0aGUgc3RhcnQgdGltZSBzbyB3ZSBjYW4gbWVhc3VyZSBob3cgbG9uZyB0aGUgbWFpbiB0aHJlYWRcbiAgICAvLyBoYXMgYmVlbiBibG9ja2VkLlxuXG4gICAgc3RhcnRUaW1lID0gY3VycmVudFRpbWU7XG4gICAgdmFyIGhhc1RpbWVSZW1haW5pbmcgPSB0cnVlOyAvLyBJZiBhIHNjaGVkdWxlciB0YXNrIHRocm93cywgZXhpdCB0aGUgY3VycmVudCBicm93c2VyIHRhc2sgc28gdGhlXG4gICAgLy8gZXJyb3IgY2FuIGJlIG9ic2VydmVkLlxuICAgIC8vXG4gICAgLy8gSW50ZW50aW9uYWxseSBub3QgdXNpbmcgYSB0cnktY2F0Y2gsIHNpbmNlIHRoYXQgbWFrZXMgc29tZSBkZWJ1Z2dpbmdcbiAgICAvLyB0ZWNobmlxdWVzIGhhcmRlci4gSW5zdGVhZCwgaWYgYHNjaGVkdWxlZEhvc3RDYWxsYmFja2AgZXJyb3JzLCB0aGVuXG4gICAgLy8gYGhhc01vcmVXb3JrYCB3aWxsIHJlbWFpbiB0cnVlLCBhbmQgd2UnbGwgY29udGludWUgdGhlIHdvcmsgbG9vcC5cblxuICAgIHZhciBoYXNNb3JlV29yayA9IHRydWU7XG5cbiAgICB0cnkge1xuICAgICAgaGFzTW9yZVdvcmsgPSBzY2hlZHVsZWRIb3N0Q2FsbGJhY2soaGFzVGltZVJlbWFpbmluZywgY3VycmVudFRpbWUpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoaGFzTW9yZVdvcmspIHtcbiAgICAgICAgLy8gSWYgdGhlcmUncyBtb3JlIHdvcmssIHNjaGVkdWxlIHRoZSBuZXh0IG1lc3NhZ2UgZXZlbnQgYXQgdGhlIGVuZFxuICAgICAgICAvLyBvZiB0aGUgcHJlY2VkaW5nIG9uZS5cbiAgICAgICAgc2NoZWR1bGVQZXJmb3JtV29ya1VudGlsRGVhZGxpbmUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlzTWVzc2FnZUxvb3BSdW5uaW5nID0gZmFsc2U7XG4gICAgICAgIHNjaGVkdWxlZEhvc3RDYWxsYmFjayA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlzTWVzc2FnZUxvb3BSdW5uaW5nID0gZmFsc2U7XG4gIH0gLy8gWWllbGRpbmcgdG8gdGhlIGJyb3dzZXIgd2lsbCBnaXZlIGl0IGEgY2hhbmNlIHRvIHBhaW50LCBzbyB3ZSBjYW5cbn07XG5cbnZhciBzY2hlZHVsZVBlcmZvcm1Xb3JrVW50aWxEZWFkbGluZTtcblxuaWYgKHR5cGVvZiBsb2NhbFNldEltbWVkaWF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAvLyBOb2RlLmpzIGFuZCBvbGQgSUUuXG4gIC8vIFRoZXJlJ3MgYSBmZXcgcmVhc29ucyBmb3Igd2h5IHdlIHByZWZlciBzZXRJbW1lZGlhdGUuXG4gIC8vXG4gIC8vIFVubGlrZSBNZXNzYWdlQ2hhbm5lbCwgaXQgZG9lc24ndCBwcmV2ZW50IGEgTm9kZS5qcyBwcm9jZXNzIGZyb20gZXhpdGluZy5cbiAgLy8gKEV2ZW4gdGhvdWdoIHRoaXMgaXMgYSBET00gZm9yayBvZiB0aGUgU2NoZWR1bGVyLCB5b3UgY291bGQgZ2V0IGhlcmVcbiAgLy8gd2l0aCBhIG1peCBvZiBOb2RlLmpzIDE1Kywgd2hpY2ggaGFzIGEgTWVzc2FnZUNoYW5uZWwsIGFuZCBqc2RvbS4pXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMjA3NTZcbiAgLy9cbiAgLy8gQnV0IGFsc28sIGl0IHJ1bnMgZWFybGllciB3aGljaCBpcyB0aGUgc2VtYW50aWMgd2Ugd2FudC5cbiAgLy8gSWYgb3RoZXIgYnJvd3NlcnMgZXZlciBpbXBsZW1lbnQgaXQsIGl0J3MgYmV0dGVyIHRvIHVzZSBpdC5cbiAgLy8gQWx0aG91Z2ggYm90aCBvZiB0aGVzZSB3b3VsZCBiZSBpbmZlcmlvciB0byBuYXRpdmUgc2NoZWR1bGluZy5cbiAgc2NoZWR1bGVQZXJmb3JtV29ya1VudGlsRGVhZGxpbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgbG9jYWxTZXRJbW1lZGlhdGUocGVyZm9ybVdvcmtVbnRpbERlYWRsaW5lKTtcbiAgfTtcbn0gZWxzZSBpZiAodHlwZW9mIE1lc3NhZ2VDaGFubmVsICE9PSAndW5kZWZpbmVkJykge1xuICAvLyBET00gYW5kIFdvcmtlciBlbnZpcm9ubWVudHMuXG4gIC8vIFdlIHByZWZlciBNZXNzYWdlQ2hhbm5lbCBiZWNhdXNlIG9mIHRoZSA0bXMgc2V0VGltZW91dCBjbGFtcGluZy5cbiAgdmFyIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAgdmFyIHBvcnQgPSBjaGFubmVsLnBvcnQyO1xuICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IHBlcmZvcm1Xb3JrVW50aWxEZWFkbGluZTtcblxuICBzY2hlZHVsZVBlcmZvcm1Xb3JrVW50aWxEZWFkbGluZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBwb3J0LnBvc3RNZXNzYWdlKG51bGwpO1xuICB9O1xufSBlbHNlIHtcbiAgLy8gV2Ugc2hvdWxkIG9ubHkgZmFsbGJhY2sgaGVyZSBpbiBub24tYnJvd3NlciBlbnZpcm9ubWVudHMuXG4gIHNjaGVkdWxlUGVyZm9ybVdvcmtVbnRpbERlYWRsaW5lID0gZnVuY3Rpb24gKCkge1xuICAgIGxvY2FsU2V0VGltZW91dChwZXJmb3JtV29ya1VudGlsRGVhZGxpbmUsIDApO1xuICB9O1xufVxuXG5mdW5jdGlvbiByZXF1ZXN0SG9zdENhbGxiYWNrKGNhbGxiYWNrKSB7XG4gIHNjaGVkdWxlZEhvc3RDYWxsYmFjayA9IGNhbGxiYWNrO1xuXG4gIGlmICghaXNNZXNzYWdlTG9vcFJ1bm5pbmcpIHtcbiAgICBpc01lc3NhZ2VMb29wUnVubmluZyA9IHRydWU7XG4gICAgc2NoZWR1bGVQZXJmb3JtV29ya1VudGlsRGVhZGxpbmUoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXF1ZXN0SG9zdFRpbWVvdXQoY2FsbGJhY2ssIG1zKSB7XG4gIHRhc2tUaW1lb3V0SUQgPSBsb2NhbFNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgIGNhbGxiYWNrKGV4cG9ydHMudW5zdGFibGVfbm93KCkpO1xuICB9LCBtcyk7XG59XG5cbmZ1bmN0aW9uIGNhbmNlbEhvc3RUaW1lb3V0KCkge1xuICBsb2NhbENsZWFyVGltZW91dCh0YXNrVGltZW91dElEKTtcbiAgdGFza1RpbWVvdXRJRCA9IC0xO1xufVxuXG52YXIgdW5zdGFibGVfcmVxdWVzdFBhaW50ID0gcmVxdWVzdFBhaW50O1xudmFyIHVuc3RhYmxlX1Byb2ZpbGluZyA9ICBudWxsO1xuXG5leHBvcnRzLnVuc3RhYmxlX0lkbGVQcmlvcml0eSA9IElkbGVQcmlvcml0eTtcbmV4cG9ydHMudW5zdGFibGVfSW1tZWRpYXRlUHJpb3JpdHkgPSBJbW1lZGlhdGVQcmlvcml0eTtcbmV4cG9ydHMudW5zdGFibGVfTG93UHJpb3JpdHkgPSBMb3dQcmlvcml0eTtcbmV4cG9ydHMudW5zdGFibGVfTm9ybWFsUHJpb3JpdHkgPSBOb3JtYWxQcmlvcml0eTtcbmV4cG9ydHMudW5zdGFibGVfUHJvZmlsaW5nID0gdW5zdGFibGVfUHJvZmlsaW5nO1xuZXhwb3J0cy51bnN0YWJsZV9Vc2VyQmxvY2tpbmdQcmlvcml0eSA9IFVzZXJCbG9ja2luZ1ByaW9yaXR5O1xuZXhwb3J0cy51bnN0YWJsZV9jYW5jZWxDYWxsYmFjayA9IHVuc3RhYmxlX2NhbmNlbENhbGxiYWNrO1xuZXhwb3J0cy51bnN0YWJsZV9jb250aW51ZUV4ZWN1dGlvbiA9IHVuc3RhYmxlX2NvbnRpbnVlRXhlY3V0aW9uO1xuZXhwb3J0cy51bnN0YWJsZV9mb3JjZUZyYW1lUmF0ZSA9IGZvcmNlRnJhbWVSYXRlO1xuZXhwb3J0cy51bnN0YWJsZV9nZXRDdXJyZW50UHJpb3JpdHlMZXZlbCA9IHVuc3RhYmxlX2dldEN1cnJlbnRQcmlvcml0eUxldmVsO1xuZXhwb3J0cy51bnN0YWJsZV9nZXRGaXJzdENhbGxiYWNrTm9kZSA9IHVuc3RhYmxlX2dldEZpcnN0Q2FsbGJhY2tOb2RlO1xuZXhwb3J0cy51bnN0YWJsZV9uZXh0ID0gdW5zdGFibGVfbmV4dDtcbmV4cG9ydHMudW5zdGFibGVfcGF1c2VFeGVjdXRpb24gPSB1bnN0YWJsZV9wYXVzZUV4ZWN1dGlvbjtcbmV4cG9ydHMudW5zdGFibGVfcmVxdWVzdFBhaW50ID0gdW5zdGFibGVfcmVxdWVzdFBhaW50O1xuZXhwb3J0cy51bnN0YWJsZV9ydW5XaXRoUHJpb3JpdHkgPSB1bnN0YWJsZV9ydW5XaXRoUHJpb3JpdHk7XG5leHBvcnRzLnVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2sgPSB1bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrO1xuZXhwb3J0cy51bnN0YWJsZV9zaG91bGRZaWVsZCA9IHNob3VsZFlpZWxkVG9Ib3N0O1xuZXhwb3J0cy51bnN0YWJsZV93cmFwQ2FsbGJhY2sgPSB1bnN0YWJsZV93cmFwQ2FsbGJhY2s7XG4gICAgICAgICAgLyogZ2xvYmFsIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAqL1xuaWYgKFxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICE9PSAndW5kZWZpbmVkJyAmJlxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdG9wID09PVxuICAgICdmdW5jdGlvbidcbikge1xuICBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0b3AobmV3IEVycm9yKCkpO1xufVxuICAgICAgICBcbiAgfSkoKTtcbn1cbiIsICIndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvc2NoZWR1bGVyLnByb2R1Y3Rpb24ubWluLmpzJyk7XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3NjaGVkdWxlci5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2UgUmVhY3RcbiAqIHJlYWN0LXJlY29uY2lsZXIuZGV2ZWxvcG1lbnQuanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAkJCRyZWNvbmNpbGVyKCQkJGhvc3RDb25maWcpIHtcbiAgICB2YXIgZXhwb3J0cyA9IHt9O1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xudmFyIFNjaGVkdWxlciA9IHJlcXVpcmUoJ3NjaGVkdWxlcicpO1xuXG52YXIgUmVhY3RTaGFyZWRJbnRlcm5hbHMgPSBSZWFjdC5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRDtcblxudmFyIHN1cHByZXNzV2FybmluZyA9IGZhbHNlO1xuZnVuY3Rpb24gc2V0U3VwcHJlc3NXYXJuaW5nKG5ld1N1cHByZXNzV2FybmluZykge1xuICB7XG4gICAgc3VwcHJlc3NXYXJuaW5nID0gbmV3U3VwcHJlc3NXYXJuaW5nO1xuICB9XG59IC8vIEluIERFViwgY2FsbHMgdG8gY29uc29sZS53YXJuIGFuZCBjb25zb2xlLmVycm9yIGdldCByZXBsYWNlZFxuLy8gYnkgY2FsbHMgdG8gdGhlc2UgbWV0aG9kcyBieSBhIEJhYmVsIHBsdWdpbi5cbi8vXG4vLyBJbiBQUk9EIChvciBpbiBwYWNrYWdlcyB3aXRob3V0IGFjY2VzcyB0byBSZWFjdCBpbnRlcm5hbHMpLFxuLy8gdGhleSBhcmUgbGVmdCBhcyB0aGV5IGFyZSBpbnN0ZWFkLlxuXG5mdW5jdGlvbiB3YXJuKGZvcm1hdCkge1xuICB7XG4gICAgaWYgKCFzdXBwcmVzc1dhcm5pbmcpIHtcbiAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICB9XG5cbiAgICAgIHByaW50V2FybmluZygnd2FybicsIGZvcm1hdCwgYXJncyk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBlcnJvcihmb3JtYXQpIHtcbiAge1xuICAgIGlmICghc3VwcHJlc3NXYXJuaW5nKSB7XG4gICAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjIgPiAxID8gX2xlbjIgLSAxIDogMCksIF9rZXkyID0gMTsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgICBhcmdzW19rZXkyIC0gMV0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgICAgfVxuXG4gICAgICBwcmludFdhcm5pbmcoJ2Vycm9yJywgZm9ybWF0LCBhcmdzKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJpbnRXYXJuaW5nKGxldmVsLCBmb3JtYXQsIGFyZ3MpIHtcbiAgLy8gV2hlbiBjaGFuZ2luZyB0aGlzIGxvZ2ljLCB5b3UgbWlnaHQgd2FudCB0byBhbHNvXG4gIC8vIHVwZGF0ZSBjb25zb2xlV2l0aFN0YWNrRGV2Lnd3dy5qcyBhcyB3ZWxsLlxuICB7XG4gICAgdmFyIFJlYWN0RGVidWdDdXJyZW50RnJhbWUgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdERlYnVnQ3VycmVudEZyYW1lO1xuICAgIHZhciBzdGFjayA9IFJlYWN0RGVidWdDdXJyZW50RnJhbWUuZ2V0U3RhY2tBZGRlbmR1bSgpO1xuXG4gICAgaWYgKHN0YWNrICE9PSAnJykge1xuICAgICAgZm9ybWF0ICs9ICclcyc7XG4gICAgICBhcmdzID0gYXJncy5jb25jYXQoW3N0YWNrXSk7XG4gICAgfSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvc2FmZS1zdHJpbmctY29lcmNpb25cblxuXG4gICAgdmFyIGFyZ3NXaXRoRm9ybWF0ID0gYXJncy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHJldHVybiBTdHJpbmcoaXRlbSk7XG4gICAgfSk7IC8vIENhcmVmdWw6IFJOIGN1cnJlbnRseSBkZXBlbmRzIG9uIHRoaXMgcHJlZml4XG5cbiAgICBhcmdzV2l0aEZvcm1hdC51bnNoaWZ0KCdXYXJuaW5nOiAnICsgZm9ybWF0KTsgLy8gV2UgaW50ZW50aW9uYWxseSBkb24ndCB1c2Ugc3ByZWFkIChvciAuYXBwbHkpIGRpcmVjdGx5IGJlY2F1c2UgaXRcbiAgICAvLyBicmVha3MgSUU5OiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzEzNjEwXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZ1xuXG4gICAgRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwoY29uc29sZVtsZXZlbF0sIGNvbnNvbGUsIGFyZ3NXaXRoRm9ybWF0KTtcbiAgfVxufVxuXG52YXIgYXNzaWduID0gT2JqZWN0LmFzc2lnbjtcblxuLyoqXG4gKiBgUmVhY3RJbnN0YW5jZU1hcGAgbWFpbnRhaW5zIGEgbWFwcGluZyBmcm9tIGEgcHVibGljIGZhY2luZyBzdGF0ZWZ1bFxuICogaW5zdGFuY2UgKGtleSkgYW5kIHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiAodmFsdWUpLiBUaGlzIGFsbG93cyBwdWJsaWNcbiAqIG1ldGhvZHMgdG8gYWNjZXB0IHRoZSB1c2VyIGZhY2luZyBpbnN0YW5jZSBhcyBhbiBhcmd1bWVudCBhbmQgbWFwIHRoZW0gYmFja1xuICogdG8gaW50ZXJuYWwgbWV0aG9kcy5cbiAqXG4gKiBOb3RlIHRoYXQgdGhpcyBtb2R1bGUgaXMgY3VycmVudGx5IHNoYXJlZCBhbmQgYXNzdW1lZCB0byBiZSBzdGF0ZWxlc3MuXG4gKiBJZiB0aGlzIGJlY29tZXMgYW4gYWN0dWFsIE1hcCwgdGhhdCB3aWxsIGJyZWFrLlxuICovXG5mdW5jdGlvbiBnZXQoa2V5KSB7XG4gIHJldHVybiBrZXkuX3JlYWN0SW50ZXJuYWxzO1xufVxuZnVuY3Rpb24gc2V0KGtleSwgdmFsdWUpIHtcbiAga2V5Ll9yZWFjdEludGVybmFscyA9IHZhbHVlO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gdGhlIHJlYWN0LXJlY29uY2lsZXIgcGFja2FnZS5cblxudmFyIGVuYWJsZU5ld1JlY29uY2lsZXIgPSBmYWxzZTsgLy8gU3VwcG9ydCBsZWdhY3kgUHJpbWVyIHN1cHBvcnQgb24gaW50ZXJuYWwgRkIgd3d3XG5cbnZhciBlbmFibGVMYXp5Q29udGV4dFByb3BhZ2F0aW9uID0gZmFsc2U7IC8vIEZCLW9ubHkgdXNhZ2UuIFRoZSBuZXcgQVBJIGhhcyBkaWZmZXJlbnQgc2VtYW50aWNzLlxuXG52YXIgZW5hYmxlTGVnYWN5SGlkZGVuID0gZmFsc2U7IC8vIEVuYWJsZXMgdW5zdGFibGVfYXZvaWRUaGlzRmFsbGJhY2sgZmVhdHVyZSBpbiBGaWJlclxuXG52YXIgZW5hYmxlU3VzcGVuc2VBdm9pZFRoaXNGYWxsYmFjayA9IGZhbHNlOyAvLyBFbmFibGVzIHVuc3RhYmxlX2F2b2lkVGhpc0ZhbGxiYWNrIGZlYXR1cmUgaW4gRml6elxudmFyIHdhcm5BYm91dFN0cmluZ1JlZnMgPSBmYWxzZTsgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIERlYnVnZ2luZyBhbmQgRGV2VG9vbHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBBZGRzIHVzZXIgdGltaW5nIG1hcmtzIGZvciBlLmcuIHN0YXRlIHVwZGF0ZXMsIHN1c3BlbnNlLCBhbmQgd29yayBsb29wIHN0dWZmLFxuLy8gZm9yIGFuIGV4cGVyaW1lbnRhbCB0aW1lbGluZSB0b29sLlxuXG52YXIgZW5hYmxlU2NoZWR1bGluZ1Byb2ZpbGVyID0gdHJ1ZTsgLy8gSGVscHMgaWRlbnRpZnkgc2lkZSBlZmZlY3RzIGluIHJlbmRlci1waGFzZSBsaWZlY3ljbGUgaG9va3MgYW5kIHNldFN0YXRlXG5cbnZhciBlbmFibGVQcm9maWxlclRpbWVyID0gdHJ1ZTsgLy8gUmVjb3JkIGR1cmF0aW9ucyBmb3IgY29tbWl0IGFuZCBwYXNzaXZlIGVmZmVjdHMgcGhhc2VzLlxuXG52YXIgZW5hYmxlUHJvZmlsZXJDb21taXRIb29rcyA9IHRydWU7IC8vIFBoYXNlIHBhcmFtIHBhc3NlZCB0byBvblJlbmRlciBjYWxsYmFjayBkaWZmZXJlbnRpYXRlcyBiZXR3ZWVuIGFuIFwidXBkYXRlXCIgYW5kIGEgXCJjYXNjYWRpbmctdXBkYXRlXCIuXG5cbnZhciBGdW5jdGlvbkNvbXBvbmVudCA9IDA7XG52YXIgQ2xhc3NDb21wb25lbnQgPSAxO1xudmFyIEluZGV0ZXJtaW5hdGVDb21wb25lbnQgPSAyOyAvLyBCZWZvcmUgd2Uga25vdyB3aGV0aGVyIGl0IGlzIGZ1bmN0aW9uIG9yIGNsYXNzXG5cbnZhciBIb3N0Um9vdCA9IDM7IC8vIFJvb3Qgb2YgYSBob3N0IHRyZWUuIENvdWxkIGJlIG5lc3RlZCBpbnNpZGUgYW5vdGhlciBub2RlLlxuXG52YXIgSG9zdFBvcnRhbCA9IDQ7IC8vIEEgc3VidHJlZS4gQ291bGQgYmUgYW4gZW50cnkgcG9pbnQgdG8gYSBkaWZmZXJlbnQgcmVuZGVyZXIuXG5cbnZhciBIb3N0Q29tcG9uZW50ID0gNTtcbnZhciBIb3N0VGV4dCA9IDY7XG52YXIgRnJhZ21lbnQgPSA3O1xudmFyIE1vZGUgPSA4O1xudmFyIENvbnRleHRDb25zdW1lciA9IDk7XG52YXIgQ29udGV4dFByb3ZpZGVyID0gMTA7XG52YXIgRm9yd2FyZFJlZiA9IDExO1xudmFyIFByb2ZpbGVyID0gMTI7XG52YXIgU3VzcGVuc2VDb21wb25lbnQgPSAxMztcbnZhciBNZW1vQ29tcG9uZW50ID0gMTQ7XG52YXIgU2ltcGxlTWVtb0NvbXBvbmVudCA9IDE1O1xudmFyIExhenlDb21wb25lbnQgPSAxNjtcbnZhciBJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQgPSAxNztcbnZhciBEZWh5ZHJhdGVkRnJhZ21lbnQgPSAxODtcbnZhciBTdXNwZW5zZUxpc3RDb21wb25lbnQgPSAxOTtcbnZhciBTY29wZUNvbXBvbmVudCA9IDIxO1xudmFyIE9mZnNjcmVlbkNvbXBvbmVudCA9IDIyO1xudmFyIExlZ2FjeUhpZGRlbkNvbXBvbmVudCA9IDIzO1xudmFyIENhY2hlQ29tcG9uZW50ID0gMjQ7XG52YXIgVHJhY2luZ01hcmtlckNvbXBvbmVudCA9IDI1O1xuXG4vLyBBVFRFTlRJT05cbi8vIFdoZW4gYWRkaW5nIG5ldyBzeW1ib2xzIHRvIHRoaXMgZmlsZSxcbi8vIFBsZWFzZSBjb25zaWRlciBhbHNvIGFkZGluZyB0byAncmVhY3QtZGV2dG9vbHMtc2hhcmVkL3NyYy9iYWNrZW5kL1JlYWN0U3ltYm9scydcbi8vIFRoZSBTeW1ib2wgdXNlZCB0byB0YWcgdGhlIFJlYWN0RWxlbWVudC1saWtlIHR5cGVzLlxudmFyIFJFQUNUX0VMRU1FTlRfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmVsZW1lbnQnKTtcbnZhciBSRUFDVF9QT1JUQUxfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnBvcnRhbCcpO1xudmFyIFJFQUNUX0ZSQUdNRU5UX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5mcmFnbWVudCcpO1xudmFyIFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5zdHJpY3RfbW9kZScpO1xudmFyIFJFQUNUX1BST0ZJTEVSX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5wcm9maWxlcicpO1xudmFyIFJFQUNUX1BST1ZJREVSX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5wcm92aWRlcicpO1xudmFyIFJFQUNUX0NPTlRFWFRfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmNvbnRleHQnKTtcbnZhciBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuZm9yd2FyZF9yZWYnKTtcbnZhciBSRUFDVF9TVVNQRU5TRV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Quc3VzcGVuc2UnKTtcbnZhciBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5zdXNwZW5zZV9saXN0Jyk7XG52YXIgUkVBQ1RfTUVNT19UWVBFID0gU3ltYm9sLmZvcigncmVhY3QubWVtbycpO1xudmFyIFJFQUNUX0xBWllfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmxhenknKTtcbnZhciBSRUFDVF9TQ09QRV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Quc2NvcGUnKTtcbnZhciBSRUFDVF9ERUJVR19UUkFDSU5HX01PREVfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmRlYnVnX3RyYWNlX21vZGUnKTtcbnZhciBSRUFDVF9PRkZTQ1JFRU5fVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0Lm9mZnNjcmVlbicpO1xudmFyIFJFQUNUX0xFR0FDWV9ISURERU5fVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmxlZ2FjeV9oaWRkZW4nKTtcbnZhciBSRUFDVF9DQUNIRV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuY2FjaGUnKTtcbnZhciBSRUFDVF9UUkFDSU5HX01BUktFUl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QudHJhY2luZ19tYXJrZXInKTtcbnZhciBNQVlCRV9JVEVSQVRPUl9TWU1CT0wgPSBTeW1ib2wuaXRlcmF0b3I7XG52YXIgRkFVWF9JVEVSQVRPUl9TWU1CT0wgPSAnQEBpdGVyYXRvcic7XG5mdW5jdGlvbiBnZXRJdGVyYXRvckZuKG1heWJlSXRlcmFibGUpIHtcbiAgaWYgKG1heWJlSXRlcmFibGUgPT09IG51bGwgfHwgdHlwZW9mIG1heWJlSXRlcmFibGUgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgbWF5YmVJdGVyYXRvciA9IE1BWUJFX0lURVJBVE9SX1NZTUJPTCAmJiBtYXliZUl0ZXJhYmxlW01BWUJFX0lURVJBVE9SX1NZTUJPTF0gfHwgbWF5YmVJdGVyYWJsZVtGQVVYX0lURVJBVE9SX1NZTUJPTF07XG5cbiAgaWYgKHR5cGVvZiBtYXliZUl0ZXJhdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIG1heWJlSXRlcmF0b3I7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gZ2V0V3JhcHBlZE5hbWUob3V0ZXJUeXBlLCBpbm5lclR5cGUsIHdyYXBwZXJOYW1lKSB7XG4gIHZhciBkaXNwbGF5TmFtZSA9IG91dGVyVHlwZS5kaXNwbGF5TmFtZTtcblxuICBpZiAoZGlzcGxheU5hbWUpIHtcbiAgICByZXR1cm4gZGlzcGxheU5hbWU7XG4gIH1cblxuICB2YXIgZnVuY3Rpb25OYW1lID0gaW5uZXJUeXBlLmRpc3BsYXlOYW1lIHx8IGlubmVyVHlwZS5uYW1lIHx8ICcnO1xuICByZXR1cm4gZnVuY3Rpb25OYW1lICE9PSAnJyA/IHdyYXBwZXJOYW1lICsgXCIoXCIgKyBmdW5jdGlvbk5hbWUgKyBcIilcIiA6IHdyYXBwZXJOYW1lO1xufSAvLyBLZWVwIGluIHN5bmMgd2l0aCByZWFjdC1yZWNvbmNpbGVyL2dldENvbXBvbmVudE5hbWVGcm9tRmliZXJcblxuXG5mdW5jdGlvbiBnZXRDb250ZXh0TmFtZSh0eXBlKSB7XG4gIHJldHVybiB0eXBlLmRpc3BsYXlOYW1lIHx8ICdDb250ZXh0Jztcbn0gLy8gTm90ZSB0aGF0IHRoZSByZWNvbmNpbGVyIHBhY2thZ2Ugc2hvdWxkIGdlbmVyYWxseSBwcmVmZXIgdG8gdXNlIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoKSBpbnN0ZWFkLlxuXG5cbmZ1bmN0aW9uIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlKSB7XG4gIGlmICh0eXBlID09IG51bGwpIHtcbiAgICAvLyBIb3N0IHJvb3QsIHRleHQgbm9kZSBvciBqdXN0IGludmFsaWQgdHlwZS5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHtcbiAgICBpZiAodHlwZW9mIHR5cGUudGFnID09PSAnbnVtYmVyJykge1xuICAgICAgZXJyb3IoJ1JlY2VpdmVkIGFuIHVuZXhwZWN0ZWQgb2JqZWN0IGluIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSgpLiAnICsgJ1RoaXMgaXMgbGlrZWx5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gdHlwZS5kaXNwbGF5TmFtZSB8fCB0eXBlLm5hbWUgfHwgbnVsbDtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdHlwZTtcbiAgfVxuXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgUkVBQ1RfRlJBR01FTlRfVFlQRTpcbiAgICAgIHJldHVybiAnRnJhZ21lbnQnO1xuXG4gICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgIHJldHVybiAnUG9ydGFsJztcblxuICAgIGNhc2UgUkVBQ1RfUFJPRklMRVJfVFlQRTpcbiAgICAgIHJldHVybiAnUHJvZmlsZXInO1xuXG4gICAgY2FzZSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFOlxuICAgICAgcmV0dXJuICdTdHJpY3RNb2RlJztcblxuICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfVFlQRTpcbiAgICAgIHJldHVybiAnU3VzcGVuc2UnO1xuXG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU6XG4gICAgICByZXR1cm4gJ1N1c3BlbnNlTGlzdCc7XG5cbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICBzd2l0Y2ggKHR5cGUuJCR0eXBlb2YpIHtcbiAgICAgIGNhc2UgUkVBQ1RfQ09OVEVYVF9UWVBFOlxuICAgICAgICB2YXIgY29udGV4dCA9IHR5cGU7XG4gICAgICAgIHJldHVybiBnZXRDb250ZXh0TmFtZShjb250ZXh0KSArICcuQ29uc3VtZXInO1xuXG4gICAgICBjYXNlIFJFQUNUX1BST1ZJREVSX1RZUEU6XG4gICAgICAgIHZhciBwcm92aWRlciA9IHR5cGU7XG4gICAgICAgIHJldHVybiBnZXRDb250ZXh0TmFtZShwcm92aWRlci5fY29udGV4dCkgKyAnLlByb3ZpZGVyJztcblxuICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICByZXR1cm4gZ2V0V3JhcHBlZE5hbWUodHlwZSwgdHlwZS5yZW5kZXIsICdGb3J3YXJkUmVmJyk7XG5cbiAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICB2YXIgb3V0ZXJOYW1lID0gdHlwZS5kaXNwbGF5TmFtZSB8fCBudWxsO1xuXG4gICAgICAgIGlmIChvdXRlck5hbWUgIT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gb3V0ZXJOYW1lO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlLnR5cGUpIHx8ICdNZW1vJztcblxuICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgbGF6eUNvbXBvbmVudCA9IHR5cGU7XG4gICAgICAgICAgdmFyIHBheWxvYWQgPSBsYXp5Q29tcG9uZW50Ll9wYXlsb2FkO1xuICAgICAgICAgIHZhciBpbml0ID0gbGF6eUNvbXBvbmVudC5faW5pdDtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKGluaXQocGF5bG9hZCkpO1xuICAgICAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZmFsbHRocm91Z2hcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gZ2V0V3JhcHBlZE5hbWUkMShvdXRlclR5cGUsIGlubmVyVHlwZSwgd3JhcHBlck5hbWUpIHtcbiAgdmFyIGZ1bmN0aW9uTmFtZSA9IGlubmVyVHlwZS5kaXNwbGF5TmFtZSB8fCBpbm5lclR5cGUubmFtZSB8fCAnJztcbiAgcmV0dXJuIG91dGVyVHlwZS5kaXNwbGF5TmFtZSB8fCAoZnVuY3Rpb25OYW1lICE9PSAnJyA/IHdyYXBwZXJOYW1lICsgXCIoXCIgKyBmdW5jdGlvbk5hbWUgKyBcIilcIiA6IHdyYXBwZXJOYW1lKTtcbn0gLy8gS2VlcCBpbiBzeW5jIHdpdGggc2hhcmVkL2dldENvbXBvbmVudE5hbWVGcm9tVHlwZVxuXG5cbmZ1bmN0aW9uIGdldENvbnRleHROYW1lJDEodHlwZSkge1xuICByZXR1cm4gdHlwZS5kaXNwbGF5TmFtZSB8fCAnQ29udGV4dCc7XG59XG5cbmZ1bmN0aW9uIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHtcbiAgdmFyIHRhZyA9IGZpYmVyLnRhZyxcbiAgICAgIHR5cGUgPSBmaWJlci50eXBlO1xuXG4gIHN3aXRjaCAodGFnKSB7XG4gICAgY2FzZSBDYWNoZUNvbXBvbmVudDpcbiAgICAgIHJldHVybiAnQ2FjaGUnO1xuXG4gICAgY2FzZSBDb250ZXh0Q29uc3VtZXI6XG4gICAgICB2YXIgY29udGV4dCA9IHR5cGU7XG4gICAgICByZXR1cm4gZ2V0Q29udGV4dE5hbWUkMShjb250ZXh0KSArICcuQ29uc3VtZXInO1xuXG4gICAgY2FzZSBDb250ZXh0UHJvdmlkZXI6XG4gICAgICB2YXIgcHJvdmlkZXIgPSB0eXBlO1xuICAgICAgcmV0dXJuIGdldENvbnRleHROYW1lJDEocHJvdmlkZXIuX2NvbnRleHQpICsgJy5Qcm92aWRlcic7XG5cbiAgICBjYXNlIERlaHlkcmF0ZWRGcmFnbWVudDpcbiAgICAgIHJldHVybiAnRGVoeWRyYXRlZEZyYWdtZW50JztcblxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgIHJldHVybiBnZXRXcmFwcGVkTmFtZSQxKHR5cGUsIHR5cGUucmVuZGVyLCAnRm9yd2FyZFJlZicpO1xuXG4gICAgY2FzZSBGcmFnbWVudDpcbiAgICAgIHJldHVybiAnRnJhZ21lbnQnO1xuXG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgLy8gSG9zdCBjb21wb25lbnQgdHlwZSBpcyB0aGUgZGlzcGxheSBuYW1lIChlLmcuIFwiZGl2XCIsIFwiVmlld1wiKVxuICAgICAgcmV0dXJuIHR5cGU7XG5cbiAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICByZXR1cm4gJ1BvcnRhbCc7XG5cbiAgICBjYXNlIEhvc3RSb290OlxuICAgICAgcmV0dXJuICdSb290JztcblxuICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICByZXR1cm4gJ1RleHQnO1xuXG4gICAgY2FzZSBMYXp5Q29tcG9uZW50OlxuICAgICAgLy8gTmFtZSBjb21lcyBmcm9tIHRoZSB0eXBlIGluIHRoaXMgY2FzZTsgd2UgZG9uJ3QgaGF2ZSBhIHRhZy5cbiAgICAgIHJldHVybiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZSk7XG5cbiAgICBjYXNlIE1vZGU6XG4gICAgICBpZiAodHlwZSA9PT0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRSkge1xuICAgICAgICAvLyBEb24ndCBiZSBsZXNzIHNwZWNpZmljIHRoYW4gc2hhcmVkL2dldENvbXBvbmVudE5hbWVGcm9tVHlwZVxuICAgICAgICByZXR1cm4gJ1N0cmljdE1vZGUnO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gJ01vZGUnO1xuXG4gICAgY2FzZSBPZmZzY3JlZW5Db21wb25lbnQ6XG4gICAgICByZXR1cm4gJ09mZnNjcmVlbic7XG5cbiAgICBjYXNlIFByb2ZpbGVyOlxuICAgICAgcmV0dXJuICdQcm9maWxlcic7XG5cbiAgICBjYXNlIFNjb3BlQ29tcG9uZW50OlxuICAgICAgcmV0dXJuICdTY29wZSc7XG5cbiAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAgcmV0dXJuICdTdXNwZW5zZSc7XG5cbiAgICBjYXNlIFN1c3BlbnNlTGlzdENvbXBvbmVudDpcbiAgICAgIHJldHVybiAnU3VzcGVuc2VMaXN0JztcblxuICAgIGNhc2UgVHJhY2luZ01hcmtlckNvbXBvbmVudDpcbiAgICAgIHJldHVybiAnVHJhY2luZ01hcmtlcic7XG4gICAgLy8gVGhlIGRpc3BsYXkgbmFtZSBmb3IgdGhpcyB0YWdzIGNvbWUgZnJvbSB0aGUgdXNlci1wcm92aWRlZCB0eXBlOlxuXG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgIGNhc2UgSW5jb21wbGV0ZUNsYXNzQ29tcG9uZW50OlxuICAgIGNhc2UgSW5kZXRlcm1pbmF0ZUNvbXBvbmVudDpcbiAgICBjYXNlIE1lbW9Db21wb25lbnQ6XG4gICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgaWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiB0eXBlLmRpc3BsYXlOYW1lIHx8IHR5cGUubmFtZSB8fCBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiB0eXBlO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcblxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8vIERvbid0IGNoYW5nZSB0aGVzZSB0d28gdmFsdWVzLiBUaGV5J3JlIHVzZWQgYnkgUmVhY3QgRGV2IFRvb2xzLlxudmFyIE5vRmxhZ3MgPVxuLyogICAgICAgICAgICAgICAgICAgICAgKi9cbjA7XG52YXIgUGVyZm9ybWVkV29yayA9XG4vKiAgICAgICAgICAgICAgICAqL1xuMTsgLy8gWW91IGNhbiBjaGFuZ2UgdGhlIHJlc3QgKGFuZCBhZGQgbW9yZSkuXG5cbnZhciBQbGFjZW1lbnQgPVxuLyogICAgICAgICAgICAgICAgICAgICovXG4yO1xudmFyIFVwZGF0ZSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbjQ7XG52YXIgQ2hpbGREZWxldGlvbiA9XG4vKiAgICAgICAgICAgICAgICAqL1xuMTY7XG52YXIgQ29udGVudFJlc2V0ID1cbi8qICAgICAgICAgICAgICAgICAqL1xuMzI7XG52YXIgQ2FsbGJhY2sgPVxuLyogICAgICAgICAgICAgICAgICAgICAqL1xuNjQ7XG52YXIgRGlkQ2FwdHVyZSA9XG4vKiAgICAgICAgICAgICAgICAgICAqL1xuMTI4O1xudmFyIEZvcmNlQ2xpZW50UmVuZGVyID1cbi8qICAgICAgICAgICAgKi9cbjI1NjtcbnZhciBSZWYgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICovXG41MTI7XG52YXIgU25hcHNob3QgPVxuLyogICAgICAgICAgICAgICAgICAgICAqL1xuMTAyNDtcbnZhciBQYXNzaXZlID1cbi8qICAgICAgICAgICAgICAgICAgICAgICovXG4yMDQ4O1xudmFyIEh5ZHJhdGluZyA9XG4vKiAgICAgICAgICAgICAgICAgICAgKi9cbjQwOTY7XG52YXIgVmlzaWJpbGl0eSA9XG4vKiAgICAgICAgICAgICAgICAgICAqL1xuODE5MjtcbnZhciBTdG9yZUNvbnNpc3RlbmN5ID1cbi8qICAgICAgICAgICAgICovXG4xNjM4NDtcbnZhciBMaWZlY3ljbGVFZmZlY3RNYXNrID0gUGFzc2l2ZSB8IFVwZGF0ZSB8IENhbGxiYWNrIHwgUmVmIHwgU25hcHNob3QgfCBTdG9yZUNvbnNpc3RlbmN5OyAvLyBVbmlvbiBvZiBhbGwgY29tbWl0IGZsYWdzIChmbGFncyB3aXRoIHRoZSBsaWZldGltZSBvZiBhIHBhcnRpY3VsYXIgY29tbWl0KVxuXG52YXIgSG9zdEVmZmVjdE1hc2sgPVxuLyogICAgICAgICAgICAgICAqL1xuMzI3Njc7IC8vIFRoZXNlIGFyZSBub3QgcmVhbGx5IHNpZGUgZWZmZWN0cywgYnV0IHdlIHN0aWxsIHJldXNlIHRoaXMgZmllbGQuXG5cbnZhciBJbmNvbXBsZXRlID1cbi8qICAgICAgICAgICAgICAgICAgICovXG4zMjc2ODtcbnZhciBTaG91bGRDYXB0dXJlID1cbi8qICAgICAgICAgICAgICAgICovXG42NTUzNjtcbnZhciBGb3JjZVVwZGF0ZUZvckxlZ2FjeVN1c3BlbnNlID1cbi8qICovXG4xMzEwNzI7XG52YXIgRm9ya2VkID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuMTA0ODU3NjsgLy8gU3RhdGljIHRhZ3MgZGVzY3JpYmUgYXNwZWN0cyBvZiBhIGZpYmVyIHRoYXQgYXJlIG5vdCBzcGVjaWZpYyB0byBhIHJlbmRlcixcbi8vIGUuZy4gYSBmaWJlciB1c2VzIGEgcGFzc2l2ZSBlZmZlY3QgKGV2ZW4gaWYgdGhlcmUgYXJlIG5vIHVwZGF0ZXMgb24gdGhpcyBwYXJ0aWN1bGFyIHJlbmRlcikuXG4vLyBUaGlzIGVuYWJsZXMgdXMgdG8gZGVmZXIgbW9yZSB3b3JrIGluIHRoZSB1bm1vdW50IGNhc2UsXG4vLyBzaW5jZSB3ZSBjYW4gZGVmZXIgdHJhdmVyc2luZyB0aGUgdHJlZSBkdXJpbmcgbGF5b3V0IHRvIGxvb2sgZm9yIFBhc3NpdmUgZWZmZWN0cyxcbi8vIGFuZCBpbnN0ZWFkIHJlbHkgb24gdGhlIHN0YXRpYyBmbGFnIGFzIGEgc2lnbmFsIHRoYXQgdGhlcmUgbWF5IGJlIGNsZWFudXAgd29yay5cblxudmFyIFJlZlN0YXRpYyA9XG4vKiAgICAgICAgICAgICAgICAgICAgKi9cbjIwOTcxNTI7XG52YXIgTGF5b3V0U3RhdGljID1cbi8qICAgICAgICAgICAgICAgICAqL1xuNDE5NDMwNDtcbnZhciBQYXNzaXZlU3RhdGljID1cbi8qICAgICAgICAgICAgICAgICovXG44Mzg4NjA4OyAvLyBUaGVzZSBmbGFncyBhbGxvdyB1cyB0byB0cmF2ZXJzZSB0byBmaWJlcnMgdGhhdCBoYXZlIGVmZmVjdHMgb24gbW91bnRcbi8vIHdpdGhvdXQgdHJhdmVyc2luZyB0aGUgZW50aXJlIHRyZWUgYWZ0ZXIgZXZlcnkgY29tbWl0IGZvclxuLy8gZG91YmxlIGludm9raW5nXG5cbnZhciBNb3VudExheW91dERldiA9XG4vKiAgICAgICAgICAgICAgICovXG4xNjc3NzIxNjtcbnZhciBNb3VudFBhc3NpdmVEZXYgPVxuLyogICAgICAgICAgICAgICovXG4zMzU1NDQzMjsgLy8gR3JvdXBzIG9mIGZsYWdzIHRoYXQgYXJlIHVzZWQgaW4gdGhlIGNvbW1pdCBwaGFzZSB0byBza2lwIG92ZXIgdHJlZXMgdGhhdFxuLy8gZG9uJ3QgY29udGFpbiBlZmZlY3RzLCBieSBjaGVja2luZyBzdWJ0cmVlRmxhZ3MuXG5cbnZhciBCZWZvcmVNdXRhdGlvbk1hc2sgPSAvLyBUT0RPOiBSZW1vdmUgVXBkYXRlIGZsYWcgZnJvbSBiZWZvcmUgbXV0YXRpb24gcGhhc2UgYnkgcmUtbGFuZGluZyBWaXNpYmlsaXR5XG4vLyBmbGFnIGxvZ2ljIChzZWUgIzIwMDQzKVxuVXBkYXRlIHwgU25hcHNob3QgfCAoIDApO1xudmFyIE11dGF0aW9uTWFzayA9IFBsYWNlbWVudCB8IFVwZGF0ZSB8IENoaWxkRGVsZXRpb24gfCBDb250ZW50UmVzZXQgfCBSZWYgfCBIeWRyYXRpbmcgfCBWaXNpYmlsaXR5O1xudmFyIExheW91dE1hc2sgPSBVcGRhdGUgfCBDYWxsYmFjayB8IFJlZiB8IFZpc2liaWxpdHk7IC8vIFRPRE86IFNwbGl0IGludG8gUGFzc2l2ZU1vdW50TWFzayBhbmQgUGFzc2l2ZVVubW91bnRNYXNrXG5cbnZhciBQYXNzaXZlTWFzayA9IFBhc3NpdmUgfCBDaGlsZERlbGV0aW9uOyAvLyBVbmlvbiBvZiB0YWdzIHRoYXQgZG9uJ3QgZ2V0IHJlc2V0IG9uIGNsb25lcy5cbi8vIFRoaXMgYWxsb3dzIGNlcnRhaW4gY29uY2VwdHMgdG8gcGVyc2lzdCB3aXRob3V0IHJlY2FsY3VsYXRpbmcgdGhlbSxcbi8vIGUuZy4gd2hldGhlciBhIHN1YnRyZWUgY29udGFpbnMgcGFzc2l2ZSBlZmZlY3RzIG9yIHBvcnRhbHMuXG5cbnZhciBTdGF0aWNNYXNrID0gTGF5b3V0U3RhdGljIHwgUGFzc2l2ZVN0YXRpYyB8IFJlZlN0YXRpYztcblxudmFyIFJlYWN0Q3VycmVudE93bmVyID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50T3duZXI7XG5mdW5jdGlvbiBnZXROZWFyZXN0TW91bnRlZEZpYmVyKGZpYmVyKSB7XG4gIHZhciBub2RlID0gZmliZXI7XG4gIHZhciBuZWFyZXN0TW91bnRlZCA9IGZpYmVyO1xuXG4gIGlmICghZmliZXIuYWx0ZXJuYXRlKSB7XG4gICAgLy8gSWYgdGhlcmUgaXMgbm8gYWx0ZXJuYXRlLCB0aGlzIG1pZ2h0IGJlIGEgbmV3IHRyZWUgdGhhdCBpc24ndCBpbnNlcnRlZFxuICAgIC8vIHlldC4gSWYgaXQgaXMsIHRoZW4gaXQgd2lsbCBoYXZlIGEgcGVuZGluZyBpbnNlcnRpb24gZWZmZWN0IG9uIGl0LlxuICAgIHZhciBuZXh0Tm9kZSA9IG5vZGU7XG5cbiAgICBkbyB7XG4gICAgICBub2RlID0gbmV4dE5vZGU7XG5cbiAgICAgIGlmICgobm9kZS5mbGFncyAmIChQbGFjZW1lbnQgfCBIeWRyYXRpbmcpKSAhPT0gTm9GbGFncykge1xuICAgICAgICAvLyBUaGlzIGlzIGFuIGluc2VydGlvbiBvciBpbi1wcm9ncmVzcyBoeWRyYXRpb24uIFRoZSBuZWFyZXN0IHBvc3NpYmxlXG4gICAgICAgIC8vIG1vdW50ZWQgZmliZXIgaXMgdGhlIHBhcmVudCBidXQgd2UgbmVlZCB0byBjb250aW51ZSB0byBmaWd1cmUgb3V0XG4gICAgICAgIC8vIGlmIHRoYXQgb25lIGlzIHN0aWxsIG1vdW50ZWQuXG4gICAgICAgIG5lYXJlc3RNb3VudGVkID0gbm9kZS5yZXR1cm47XG4gICAgICB9XG5cbiAgICAgIG5leHROb2RlID0gbm9kZS5yZXR1cm47XG4gICAgfSB3aGlsZSAobmV4dE5vZGUpO1xuICB9IGVsc2Uge1xuICAgIHdoaWxlIChub2RlLnJldHVybikge1xuICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIGlmIChub2RlLnRhZyA9PT0gSG9zdFJvb3QpIHtcbiAgICAvLyBUT0RPOiBDaGVjayBpZiB0aGlzIHdhcyBhIG5lc3RlZCBIb3N0Um9vdCB3aGVuIHVzZWQgd2l0aFxuICAgIC8vIHJlbmRlckNvbnRhaW5lckludG9TdWJ0cmVlLlxuICAgIHJldHVybiBuZWFyZXN0TW91bnRlZDtcbiAgfSAvLyBJZiB3ZSBkaWRuJ3QgaGl0IHRoZSByb290LCB0aGF0IG1lYW5zIHRoYXQgd2UncmUgaW4gYW4gZGlzY29ubmVjdGVkIHRyZWVcbiAgLy8gdGhhdCBoYXMgYmVlbiB1bm1vdW50ZWQuXG5cblxuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGlzRmliZXJNb3VudGVkKGZpYmVyKSB7XG4gIHJldHVybiBnZXROZWFyZXN0TW91bnRlZEZpYmVyKGZpYmVyKSA9PT0gZmliZXI7XG59XG5mdW5jdGlvbiBpc01vdW50ZWQoY29tcG9uZW50KSB7XG4gIHtcbiAgICB2YXIgb3duZXIgPSBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50O1xuXG4gICAgaWYgKG93bmVyICE9PSBudWxsICYmIG93bmVyLnRhZyA9PT0gQ2xhc3NDb21wb25lbnQpIHtcbiAgICAgIHZhciBvd25lckZpYmVyID0gb3duZXI7XG4gICAgICB2YXIgaW5zdGFuY2UgPSBvd25lckZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgaWYgKCFpbnN0YW5jZS5fd2FybmVkQWJvdXRSZWZzSW5SZW5kZXIpIHtcbiAgICAgICAgZXJyb3IoJyVzIGlzIGFjY2Vzc2luZyBpc01vdW50ZWQgaW5zaWRlIGl0cyByZW5kZXIoKSBmdW5jdGlvbi4gJyArICdyZW5kZXIoKSBzaG91bGQgYmUgYSBwdXJlIGZ1bmN0aW9uIG9mIHByb3BzIGFuZCBzdGF0ZS4gSXQgc2hvdWxkICcgKyAnbmV2ZXIgYWNjZXNzIHNvbWV0aGluZyB0aGF0IHJlcXVpcmVzIHN0YWxlIGRhdGEgZnJvbSB0aGUgcHJldmlvdXMgJyArICdyZW5kZXIsIHN1Y2ggYXMgcmVmcy4gTW92ZSB0aGlzIGxvZ2ljIHRvIGNvbXBvbmVudERpZE1vdW50IGFuZCAnICsgJ2NvbXBvbmVudERpZFVwZGF0ZSBpbnN0ZWFkLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIob3duZXJGaWJlcikgfHwgJ0EgY29tcG9uZW50Jyk7XG4gICAgICB9XG5cbiAgICAgIGluc3RhbmNlLl93YXJuZWRBYm91dFJlZnNJblJlbmRlciA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgdmFyIGZpYmVyID0gZ2V0KGNvbXBvbmVudCk7XG5cbiAgaWYgKCFmaWJlcikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBnZXROZWFyZXN0TW91bnRlZEZpYmVyKGZpYmVyKSA9PT0gZmliZXI7XG59XG5cbmZ1bmN0aW9uIGFzc2VydElzTW91bnRlZChmaWJlcikge1xuICBpZiAoZ2V0TmVhcmVzdE1vdW50ZWRGaWJlcihmaWJlcikgIT09IGZpYmVyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZmluZCBub2RlIG9uIGFuIHVubW91bnRlZCBjb21wb25lbnQuJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZEN1cnJlbnRGaWJlclVzaW5nU2xvd1BhdGgoZmliZXIpIHtcbiAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTtcblxuICBpZiAoIWFsdGVybmF0ZSkge1xuICAgIC8vIElmIHRoZXJlIGlzIG5vIGFsdGVybmF0ZSwgdGhlbiB3ZSBvbmx5IG5lZWQgdG8gY2hlY2sgaWYgaXQgaXMgbW91bnRlZC5cbiAgICB2YXIgbmVhcmVzdE1vdW50ZWQgPSBnZXROZWFyZXN0TW91bnRlZEZpYmVyKGZpYmVyKTtcblxuICAgIGlmIChuZWFyZXN0TW91bnRlZCA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZmluZCBub2RlIG9uIGFuIHVubW91bnRlZCBjb21wb25lbnQuJyk7XG4gICAgfVxuXG4gICAgaWYgKG5lYXJlc3RNb3VudGVkICE9PSBmaWJlcikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZpYmVyO1xuICB9IC8vIElmIHdlIGhhdmUgdHdvIHBvc3NpYmxlIGJyYW5jaGVzLCB3ZSdsbCB3YWxrIGJhY2t3YXJkcyB1cCB0byB0aGUgcm9vdFxuICAvLyB0byBzZWUgd2hhdCBwYXRoIHRoZSByb290IHBvaW50cyB0by4gT24gdGhlIHdheSB3ZSBtYXkgaGl0IG9uZSBvZiB0aGVcbiAgLy8gc3BlY2lhbCBjYXNlcyBhbmQgd2UnbGwgZGVhbCB3aXRoIHRoZW0uXG5cblxuICB2YXIgYSA9IGZpYmVyO1xuICB2YXIgYiA9IGFsdGVybmF0ZTtcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIHZhciBwYXJlbnRBID0gYS5yZXR1cm47XG5cbiAgICBpZiAocGFyZW50QSA9PT0gbnVsbCkge1xuICAgICAgLy8gV2UncmUgYXQgdGhlIHJvb3QuXG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICB2YXIgcGFyZW50QiA9IHBhcmVudEEuYWx0ZXJuYXRlO1xuXG4gICAgaWYgKHBhcmVudEIgPT09IG51bGwpIHtcbiAgICAgIC8vIFRoZXJlIGlzIG5vIGFsdGVybmF0ZS4gVGhpcyBpcyBhbiB1bnVzdWFsIGNhc2UuIEN1cnJlbnRseSwgaXQgb25seVxuICAgICAgLy8gaGFwcGVucyB3aGVuIGEgU3VzcGVuc2UgY29tcG9uZW50IGlzIGhpZGRlbi4gQW4gZXh0cmEgZnJhZ21lbnQgZmliZXJcbiAgICAgIC8vIGlzIGluc2VydGVkIGluIGJldHdlZW4gdGhlIFN1c3BlbnNlIGZpYmVyIGFuZCBpdHMgY2hpbGRyZW4uIFNraXBcbiAgICAgIC8vIG92ZXIgdGhpcyBleHRyYSBmcmFnbWVudCBmaWJlciBhbmQgcHJvY2VlZCB0byB0aGUgbmV4dCBwYXJlbnQuXG4gICAgICB2YXIgbmV4dFBhcmVudCA9IHBhcmVudEEucmV0dXJuO1xuXG4gICAgICBpZiAobmV4dFBhcmVudCAhPT0gbnVsbCkge1xuICAgICAgICBhID0gYiA9IG5leHRQYXJlbnQ7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfSAvLyBJZiB0aGVyZSdzIG5vIHBhcmVudCwgd2UncmUgYXQgdGhlIHJvb3QuXG5cblxuICAgICAgYnJlYWs7XG4gICAgfSAvLyBJZiBib3RoIGNvcGllcyBvZiB0aGUgcGFyZW50IGZpYmVyIHBvaW50IHRvIHRoZSBzYW1lIGNoaWxkLCB3ZSBjYW5cbiAgICAvLyBhc3N1bWUgdGhhdCB0aGUgY2hpbGQgaXMgY3VycmVudC4gVGhpcyBoYXBwZW5zIHdoZW4gd2UgYmFpbG91dCBvbiBsb3dcbiAgICAvLyBwcmlvcml0eTogdGhlIGJhaWxlZCBvdXQgZmliZXIncyBjaGlsZCByZXVzZXMgdGhlIGN1cnJlbnQgY2hpbGQuXG5cblxuICAgIGlmIChwYXJlbnRBLmNoaWxkID09PSBwYXJlbnRCLmNoaWxkKSB7XG4gICAgICB2YXIgY2hpbGQgPSBwYXJlbnRBLmNoaWxkO1xuXG4gICAgICB3aGlsZSAoY2hpbGQpIHtcbiAgICAgICAgaWYgKGNoaWxkID09PSBhKSB7XG4gICAgICAgICAgLy8gV2UndmUgZGV0ZXJtaW5lZCB0aGF0IEEgaXMgdGhlIGN1cnJlbnQgYnJhbmNoLlxuICAgICAgICAgIGFzc2VydElzTW91bnRlZChwYXJlbnRBKTtcbiAgICAgICAgICByZXR1cm4gZmliZXI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2hpbGQgPT09IGIpIHtcbiAgICAgICAgICAvLyBXZSd2ZSBkZXRlcm1pbmVkIHRoYXQgQiBpcyB0aGUgY3VycmVudCBicmFuY2guXG4gICAgICAgICAgYXNzZXJ0SXNNb3VudGVkKHBhcmVudEEpO1xuICAgICAgICAgIHJldHVybiBhbHRlcm5hdGU7XG4gICAgICAgIH1cblxuICAgICAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gICAgICB9IC8vIFdlIHNob3VsZCBuZXZlciBoYXZlIGFuIGFsdGVybmF0ZSBmb3IgYW55IG1vdW50aW5nIG5vZGUuIFNvIHRoZSBvbmx5XG4gICAgICAvLyB3YXkgdGhpcyBjb3VsZCBwb3NzaWJseSBoYXBwZW4gaXMgaWYgdGhpcyB3YXMgdW5tb3VudGVkLCBpZiBhdCBhbGwuXG5cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZmluZCBub2RlIG9uIGFuIHVubW91bnRlZCBjb21wb25lbnQuJyk7XG4gICAgfVxuXG4gICAgaWYgKGEucmV0dXJuICE9PSBiLnJldHVybikge1xuICAgICAgLy8gVGhlIHJldHVybiBwb2ludGVyIG9mIEEgYW5kIHRoZSByZXR1cm4gcG9pbnRlciBvZiBCIHBvaW50IHRvIGRpZmZlcmVudFxuICAgICAgLy8gZmliZXJzLiBXZSBhc3N1bWUgdGhhdCByZXR1cm4gcG9pbnRlcnMgbmV2ZXIgY3Jpc3MtY3Jvc3MsIHNvIEEgbXVzdFxuICAgICAgLy8gYmVsb25nIHRvIHRoZSBjaGlsZCBzZXQgb2YgQS5yZXR1cm4sIGFuZCBCIG11c3QgYmVsb25nIHRvIHRoZSBjaGlsZFxuICAgICAgLy8gc2V0IG9mIEIucmV0dXJuLlxuICAgICAgYSA9IHBhcmVudEE7XG4gICAgICBiID0gcGFyZW50QjtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhlIHJldHVybiBwb2ludGVycyBwb2ludCB0byB0aGUgc2FtZSBmaWJlci4gV2UnbGwgaGF2ZSB0byB1c2UgdGhlXG4gICAgICAvLyBkZWZhdWx0LCBzbG93IHBhdGg6IHNjYW4gdGhlIGNoaWxkIHNldHMgb2YgZWFjaCBwYXJlbnQgYWx0ZXJuYXRlIHRvIHNlZVxuICAgICAgLy8gd2hpY2ggY2hpbGQgYmVsb25ncyB0byB3aGljaCBzZXQuXG4gICAgICAvL1xuICAgICAgLy8gU2VhcmNoIHBhcmVudCBBJ3MgY2hpbGQgc2V0XG4gICAgICB2YXIgZGlkRmluZENoaWxkID0gZmFsc2U7XG4gICAgICB2YXIgX2NoaWxkID0gcGFyZW50QS5jaGlsZDtcblxuICAgICAgd2hpbGUgKF9jaGlsZCkge1xuICAgICAgICBpZiAoX2NoaWxkID09PSBhKSB7XG4gICAgICAgICAgZGlkRmluZENoaWxkID0gdHJ1ZTtcbiAgICAgICAgICBhID0gcGFyZW50QTtcbiAgICAgICAgICBiID0gcGFyZW50QjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChfY2hpbGQgPT09IGIpIHtcbiAgICAgICAgICBkaWRGaW5kQ2hpbGQgPSB0cnVlO1xuICAgICAgICAgIGIgPSBwYXJlbnRBO1xuICAgICAgICAgIGEgPSBwYXJlbnRCO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgX2NoaWxkID0gX2NoaWxkLnNpYmxpbmc7XG4gICAgICB9XG5cbiAgICAgIGlmICghZGlkRmluZENoaWxkKSB7XG4gICAgICAgIC8vIFNlYXJjaCBwYXJlbnQgQidzIGNoaWxkIHNldFxuICAgICAgICBfY2hpbGQgPSBwYXJlbnRCLmNoaWxkO1xuXG4gICAgICAgIHdoaWxlIChfY2hpbGQpIHtcbiAgICAgICAgICBpZiAoX2NoaWxkID09PSBhKSB7XG4gICAgICAgICAgICBkaWRGaW5kQ2hpbGQgPSB0cnVlO1xuICAgICAgICAgICAgYSA9IHBhcmVudEI7XG4gICAgICAgICAgICBiID0gcGFyZW50QTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChfY2hpbGQgPT09IGIpIHtcbiAgICAgICAgICAgIGRpZEZpbmRDaGlsZCA9IHRydWU7XG4gICAgICAgICAgICBiID0gcGFyZW50QjtcbiAgICAgICAgICAgIGEgPSBwYXJlbnRBO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgX2NoaWxkID0gX2NoaWxkLnNpYmxpbmc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWRpZEZpbmRDaGlsZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2hpbGQgd2FzIG5vdCBmb3VuZCBpbiBlaXRoZXIgcGFyZW50IHNldC4gVGhpcyBpbmRpY2F0ZXMgYSBidWcgJyArICdpbiBSZWFjdCByZWxhdGVkIHRvIHRoZSByZXR1cm4gcG9pbnRlci4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoYS5hbHRlcm5hdGUgIT09IGIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlJldHVybiBmaWJlcnMgc2hvdWxkIGFsd2F5cyBiZSBlYWNoIG90aGVycycgYWx0ZXJuYXRlcy4gXCIgKyAnVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG4gIH0gLy8gSWYgdGhlIHJvb3QgaXMgbm90IGEgaG9zdCBjb250YWluZXIsIHdlJ3JlIGluIGEgZGlzY29ubmVjdGVkIHRyZWUuIEkuZS5cbiAgLy8gdW5tb3VudGVkLlxuXG5cbiAgaWYgKGEudGFnICE9PSBIb3N0Um9vdCkge1xuICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGZpbmQgbm9kZSBvbiBhbiB1bm1vdW50ZWQgY29tcG9uZW50LicpO1xuICB9XG5cbiAgaWYgKGEuc3RhdGVOb2RlLmN1cnJlbnQgPT09IGEpIHtcbiAgICAvLyBXZSd2ZSBkZXRlcm1pbmVkIHRoYXQgQSBpcyB0aGUgY3VycmVudCBicmFuY2guXG4gICAgcmV0dXJuIGZpYmVyO1xuICB9IC8vIE90aGVyd2lzZSBCIGhhcyB0byBiZSBjdXJyZW50IGJyYW5jaC5cblxuXG4gIHJldHVybiBhbHRlcm5hdGU7XG59XG5mdW5jdGlvbiBmaW5kQ3VycmVudEhvc3RGaWJlcihwYXJlbnQpIHtcbiAgdmFyIGN1cnJlbnRQYXJlbnQgPSBmaW5kQ3VycmVudEZpYmVyVXNpbmdTbG93UGF0aChwYXJlbnQpO1xuICByZXR1cm4gY3VycmVudFBhcmVudCAhPT0gbnVsbCA/IGZpbmRDdXJyZW50SG9zdEZpYmVySW1wbChjdXJyZW50UGFyZW50KSA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIGZpbmRDdXJyZW50SG9zdEZpYmVySW1wbChub2RlKSB7XG4gIC8vIE5leHQgd2UnbGwgZHJpbGwgZG93biB0aGlzIGNvbXBvbmVudCB0byBmaW5kIHRoZSBmaXJzdCBIb3N0Q29tcG9uZW50L1RleHQuXG4gIGlmIChub2RlLnRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCBub2RlLnRhZyA9PT0gSG9zdFRleHQpIHtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuXG4gIHZhciBjaGlsZCA9IG5vZGUuY2hpbGQ7XG5cbiAgd2hpbGUgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgdmFyIG1hdGNoID0gZmluZEN1cnJlbnRIb3N0RmliZXJJbXBsKGNoaWxkKTtcblxuICAgIGlmIChtYXRjaCAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG1hdGNoO1xuICAgIH1cblxuICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBmaW5kQ3VycmVudEhvc3RGaWJlcldpdGhOb1BvcnRhbHMocGFyZW50KSB7XG4gIHZhciBjdXJyZW50UGFyZW50ID0gZmluZEN1cnJlbnRGaWJlclVzaW5nU2xvd1BhdGgocGFyZW50KTtcbiAgcmV0dXJuIGN1cnJlbnRQYXJlbnQgIT09IG51bGwgPyBmaW5kQ3VycmVudEhvc3RGaWJlcldpdGhOb1BvcnRhbHNJbXBsKGN1cnJlbnRQYXJlbnQpIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gZmluZEN1cnJlbnRIb3N0RmliZXJXaXRoTm9Qb3J0YWxzSW1wbChub2RlKSB7XG4gIC8vIE5leHQgd2UnbGwgZHJpbGwgZG93biB0aGlzIGNvbXBvbmVudCB0byBmaW5kIHRoZSBmaXJzdCBIb3N0Q29tcG9uZW50L1RleHQuXG4gIGlmIChub2RlLnRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCBub2RlLnRhZyA9PT0gSG9zdFRleHQpIHtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuXG4gIHZhciBjaGlsZCA9IG5vZGUuY2hpbGQ7XG5cbiAgd2hpbGUgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgaWYgKGNoaWxkLnRhZyAhPT0gSG9zdFBvcnRhbCkge1xuICAgICAgdmFyIG1hdGNoID0gZmluZEN1cnJlbnRIb3N0RmliZXJXaXRoTm9Qb3J0YWxzSW1wbChjaGlsZCk7XG5cbiAgICAgIGlmIChtYXRjaCAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbWF0Y2g7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY2hpbGQgPSBjaGlsZC5zaWJsaW5nO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbnZhciBpc0FycmF5SW1wbCA9IEFycmF5LmlzQXJyYXk7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZWRlY2xhcmVcblxuZnVuY3Rpb24gaXNBcnJheShhKSB7XG4gIHJldHVybiBpc0FycmF5SW1wbChhKTtcbn1cblxuLy8gVGhpcyBpcyBhIGhvc3QgY29uZmlnIHRoYXQncyB1c2VkIGZvciB0aGUgYHJlYWN0LXJlY29uY2lsZXJgIHBhY2thZ2Ugb24gbnBtLlxuLy8gSXQgaXMgb25seSB1c2VkIGJ5IHRoaXJkLXBhcnR5IHJlbmRlcmVycy5cbi8vXG4vLyBJdHMgQVBJIGxldHMgeW91IHBhc3MgdGhlIGhvc3QgY29uZmlnIGFzIGFuIGFyZ3VtZW50LlxuLy8gSG93ZXZlciwgaW5zaWRlIHRoZSBgcmVhY3QtcmVjb25jaWxlcmAgd2UgdHJlYXQgaG9zdCBjb25maWcgYXMgYSBtb2R1bGUuXG4vLyBUaGlzIGZpbGUgaXMgYSBzaGltIGJldHdlZW4gdHdvIHdvcmxkcy5cbi8vXG4vLyBJdCB3b3JrcyBiZWNhdXNlIHRoZSBgcmVhY3QtcmVjb25jaWxlcmAgYnVuZGxlIGlzIHdyYXBwZWQgaW4gc29tZXRoaW5nIGxpa2U6XG4vL1xuLy8gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoJCQkY29uZmlnKSB7XG4vLyAgIC8qIHJlY29uY2lsZXIgY29kZSAqL1xuLy8gfVxuLy9cbi8vIFNvIGAkJCRjb25maWdgIGxvb2tzIGxpa2UgYSBnbG9iYWwgdmFyaWFibGUsIGJ1dCBpdCdzXG4vLyByZWFsbHkgYW4gYXJndW1lbnQgdG8gYSB0b3AtbGV2ZWwgd3JhcHBpbmcgZnVuY3Rpb24uXG4vLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG4vLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG4vLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG4vLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG4vLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG4vLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG4vLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG4vLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG4vLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG4vLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG4vLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG4vLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG4vLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG4vLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG52YXIgZ2V0UHVibGljSW5zdGFuY2UgPSAkJCRob3N0Q29uZmlnLmdldFB1YmxpY0luc3RhbmNlO1xudmFyIGdldFJvb3RIb3N0Q29udGV4dCA9ICQkJGhvc3RDb25maWcuZ2V0Um9vdEhvc3RDb250ZXh0O1xudmFyIGdldENoaWxkSG9zdENvbnRleHQgPSAkJCRob3N0Q29uZmlnLmdldENoaWxkSG9zdENvbnRleHQ7XG52YXIgcHJlcGFyZUZvckNvbW1pdCA9ICQkJGhvc3RDb25maWcucHJlcGFyZUZvckNvbW1pdDtcbnZhciByZXNldEFmdGVyQ29tbWl0ID0gJCQkaG9zdENvbmZpZy5yZXNldEFmdGVyQ29tbWl0O1xudmFyIGNyZWF0ZUluc3RhbmNlID0gJCQkaG9zdENvbmZpZy5jcmVhdGVJbnN0YW5jZTtcbnZhciBhcHBlbmRJbml0aWFsQ2hpbGQgPSAkJCRob3N0Q29uZmlnLmFwcGVuZEluaXRpYWxDaGlsZDtcbnZhciBmaW5hbGl6ZUluaXRpYWxDaGlsZHJlbiA9ICQkJGhvc3RDb25maWcuZmluYWxpemVJbml0aWFsQ2hpbGRyZW47XG52YXIgcHJlcGFyZVVwZGF0ZSA9ICQkJGhvc3RDb25maWcucHJlcGFyZVVwZGF0ZTtcbnZhciBzaG91bGRTZXRUZXh0Q29udGVudCA9ICQkJGhvc3RDb25maWcuc2hvdWxkU2V0VGV4dENvbnRlbnQ7XG52YXIgY3JlYXRlVGV4dEluc3RhbmNlID0gJCQkaG9zdENvbmZpZy5jcmVhdGVUZXh0SW5zdGFuY2U7XG52YXIgc2NoZWR1bGVUaW1lb3V0ID0gJCQkaG9zdENvbmZpZy5zY2hlZHVsZVRpbWVvdXQ7XG52YXIgY2FuY2VsVGltZW91dCA9ICQkJGhvc3RDb25maWcuY2FuY2VsVGltZW91dDtcbnZhciBub1RpbWVvdXQgPSAkJCRob3N0Q29uZmlnLm5vVGltZW91dDtcbnZhciBpc1ByaW1hcnlSZW5kZXJlciA9ICQkJGhvc3RDb25maWcuaXNQcmltYXJ5UmVuZGVyZXI7XG52YXIgd2FybnNJZk5vdEFjdGluZyA9ICQkJGhvc3RDb25maWcud2FybnNJZk5vdEFjdGluZztcbnZhciBzdXBwb3J0c011dGF0aW9uID0gJCQkaG9zdENvbmZpZy5zdXBwb3J0c011dGF0aW9uO1xudmFyIHN1cHBvcnRzUGVyc2lzdGVuY2UgPSAkJCRob3N0Q29uZmlnLnN1cHBvcnRzUGVyc2lzdGVuY2U7XG52YXIgc3VwcG9ydHNIeWRyYXRpb24gPSAkJCRob3N0Q29uZmlnLnN1cHBvcnRzSHlkcmF0aW9uO1xudmFyIGdldEluc3RhbmNlRnJvbU5vZGUgPSAkJCRob3N0Q29uZmlnLmdldEluc3RhbmNlRnJvbU5vZGU7XG52YXIgYmVmb3JlQWN0aXZlSW5zdGFuY2VCbHVyID0gJCQkaG9zdENvbmZpZy5iZWZvcmVBY3RpdmVJbnN0YW5jZUJsdXI7XG52YXIgYWZ0ZXJBY3RpdmVJbnN0YW5jZUJsdXIgPSAkJCRob3N0Q29uZmlnLmFmdGVyQWN0aXZlSW5zdGFuY2VCbHVyO1xudmFyIHByZXBhcmVQb3J0YWxNb3VudCA9ICQkJGhvc3RDb25maWcucHJlcGFyZVBvcnRhbE1vdW50O1xudmFyIHByZXBhcmVTY29wZVVwZGF0ZSA9ICQkJGhvc3RDb25maWcucHJlcGFyZVNjb3BlVXBkYXRlO1xudmFyIGdldEluc3RhbmNlRnJvbVNjb3BlID0gJCQkaG9zdENvbmZpZy5nZXRJbnN0YW5jZUZyb21TY29wZTtcbnZhciBnZXRDdXJyZW50RXZlbnRQcmlvcml0eSA9ICQkJGhvc3RDb25maWcuZ2V0Q3VycmVudEV2ZW50UHJpb3JpdHk7XG52YXIgZGV0YWNoRGVsZXRlZEluc3RhbmNlID0gJCQkaG9zdENvbmZpZy5kZXRhY2hEZWxldGVkSW5zdGFuY2U7IC8vIC0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vICAgICAgTWljcm90YXNrc1xuLy8gICAgIChvcHRpb25hbClcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS1cblxudmFyIHN1cHBvcnRzTWljcm90YXNrcyA9ICQkJGhvc3RDb25maWcuc3VwcG9ydHNNaWNyb3Rhc2tzO1xudmFyIHNjaGVkdWxlTWljcm90YXNrID0gJCQkaG9zdENvbmZpZy5zY2hlZHVsZU1pY3JvdGFzazsgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gICAgICBUZXN0IHNlbGVjdG9yc1xuLy8gICAgIChvcHRpb25hbClcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS1cblxudmFyIHN1cHBvcnRzVGVzdFNlbGVjdG9ycyA9ICQkJGhvc3RDb25maWcuc3VwcG9ydHNUZXN0U2VsZWN0b3JzO1xudmFyIGZpbmRGaWJlclJvb3QgPSAkJCRob3N0Q29uZmlnLmZpbmRGaWJlclJvb3Q7XG52YXIgZ2V0Qm91bmRpbmdSZWN0ID0gJCQkaG9zdENvbmZpZy5nZXRCb3VuZGluZ1JlY3Q7XG52YXIgZ2V0VGV4dENvbnRlbnQgPSAkJCRob3N0Q29uZmlnLmdldFRleHRDb250ZW50O1xudmFyIGlzSGlkZGVuU3VidHJlZSA9ICQkJGhvc3RDb25maWcuaXNIaWRkZW5TdWJ0cmVlO1xudmFyIG1hdGNoQWNjZXNzaWJpbGl0eVJvbGUgPSAkJCRob3N0Q29uZmlnLm1hdGNoQWNjZXNzaWJpbGl0eVJvbGU7XG52YXIgc2V0Rm9jdXNJZkZvY3VzYWJsZSA9ICQkJGhvc3RDb25maWcuc2V0Rm9jdXNJZkZvY3VzYWJsZTtcbnZhciBzZXR1cEludGVyc2VjdGlvbk9ic2VydmVyID0gJCQkaG9zdENvbmZpZy5zZXR1cEludGVyc2VjdGlvbk9ic2VydmVyOyAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyAgICAgIE11dGF0aW9uXG4vLyAgICAgKG9wdGlvbmFsKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG52YXIgYXBwZW5kQ2hpbGQgPSAkJCRob3N0Q29uZmlnLmFwcGVuZENoaWxkO1xudmFyIGFwcGVuZENoaWxkVG9Db250YWluZXIgPSAkJCRob3N0Q29uZmlnLmFwcGVuZENoaWxkVG9Db250YWluZXI7XG52YXIgY29tbWl0VGV4dFVwZGF0ZSA9ICQkJGhvc3RDb25maWcuY29tbWl0VGV4dFVwZGF0ZTtcbnZhciBjb21taXRNb3VudCA9ICQkJGhvc3RDb25maWcuY29tbWl0TW91bnQ7XG52YXIgY29tbWl0VXBkYXRlID0gJCQkaG9zdENvbmZpZy5jb21taXRVcGRhdGU7XG52YXIgaW5zZXJ0QmVmb3JlID0gJCQkaG9zdENvbmZpZy5pbnNlcnRCZWZvcmU7XG52YXIgaW5zZXJ0SW5Db250YWluZXJCZWZvcmUgPSAkJCRob3N0Q29uZmlnLmluc2VydEluQ29udGFpbmVyQmVmb3JlO1xudmFyIHJlbW92ZUNoaWxkID0gJCQkaG9zdENvbmZpZy5yZW1vdmVDaGlsZDtcbnZhciByZW1vdmVDaGlsZEZyb21Db250YWluZXIgPSAkJCRob3N0Q29uZmlnLnJlbW92ZUNoaWxkRnJvbUNvbnRhaW5lcjtcbnZhciByZXNldFRleHRDb250ZW50ID0gJCQkaG9zdENvbmZpZy5yZXNldFRleHRDb250ZW50O1xudmFyIGhpZGVJbnN0YW5jZSA9ICQkJGhvc3RDb25maWcuaGlkZUluc3RhbmNlO1xudmFyIGhpZGVUZXh0SW5zdGFuY2UgPSAkJCRob3N0Q29uZmlnLmhpZGVUZXh0SW5zdGFuY2U7XG52YXIgdW5oaWRlSW5zdGFuY2UgPSAkJCRob3N0Q29uZmlnLnVuaGlkZUluc3RhbmNlO1xudmFyIHVuaGlkZVRleHRJbnN0YW5jZSA9ICQkJGhvc3RDb25maWcudW5oaWRlVGV4dEluc3RhbmNlO1xudmFyIGNsZWFyQ29udGFpbmVyID0gJCQkaG9zdENvbmZpZy5jbGVhckNvbnRhaW5lcjsgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gICAgIFBlcnNpc3RlbmNlXG4vLyAgICAgKG9wdGlvbmFsKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG52YXIgY2xvbmVJbnN0YW5jZSA9ICQkJGhvc3RDb25maWcuY2xvbmVJbnN0YW5jZTtcbnZhciBjcmVhdGVDb250YWluZXJDaGlsZFNldCA9ICQkJGhvc3RDb25maWcuY3JlYXRlQ29udGFpbmVyQ2hpbGRTZXQ7XG52YXIgYXBwZW5kQ2hpbGRUb0NvbnRhaW5lckNoaWxkU2V0ID0gJCQkaG9zdENvbmZpZy5hcHBlbmRDaGlsZFRvQ29udGFpbmVyQ2hpbGRTZXQ7XG52YXIgZmluYWxpemVDb250YWluZXJDaGlsZHJlbiA9ICQkJGhvc3RDb25maWcuZmluYWxpemVDb250YWluZXJDaGlsZHJlbjtcbnZhciByZXBsYWNlQ29udGFpbmVyQ2hpbGRyZW4gPSAkJCRob3N0Q29uZmlnLnJlcGxhY2VDb250YWluZXJDaGlsZHJlbjtcbnZhciBjbG9uZUhpZGRlbkluc3RhbmNlID0gJCQkaG9zdENvbmZpZy5jbG9uZUhpZGRlbkluc3RhbmNlO1xudmFyIGNsb25lSGlkZGVuVGV4dEluc3RhbmNlID0gJCQkaG9zdENvbmZpZy5jbG9uZUhpZGRlblRleHRJbnN0YW5jZTsgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gICAgIEh5ZHJhdGlvblxuLy8gICAgIChvcHRpb25hbClcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS1cblxudmFyIGNhbkh5ZHJhdGVJbnN0YW5jZSA9ICQkJGhvc3RDb25maWcuY2FuSHlkcmF0ZUluc3RhbmNlO1xudmFyIGNhbkh5ZHJhdGVUZXh0SW5zdGFuY2UgPSAkJCRob3N0Q29uZmlnLmNhbkh5ZHJhdGVUZXh0SW5zdGFuY2U7XG52YXIgY2FuSHlkcmF0ZVN1c3BlbnNlSW5zdGFuY2UgPSAkJCRob3N0Q29uZmlnLmNhbkh5ZHJhdGVTdXNwZW5zZUluc3RhbmNlO1xudmFyIGlzU3VzcGVuc2VJbnN0YW5jZVBlbmRpbmcgPSAkJCRob3N0Q29uZmlnLmlzU3VzcGVuc2VJbnN0YW5jZVBlbmRpbmc7XG52YXIgaXNTdXNwZW5zZUluc3RhbmNlRmFsbGJhY2sgPSAkJCRob3N0Q29uZmlnLmlzU3VzcGVuc2VJbnN0YW5jZUZhbGxiYWNrO1xudmFyIGdldFN1c3BlbnNlSW5zdGFuY2VGYWxsYmFja0Vycm9yRGV0YWlscyA9ICQkJGhvc3RDb25maWcuZ2V0U3VzcGVuc2VJbnN0YW5jZUZhbGxiYWNrRXJyb3JEZXRhaWxzO1xudmFyIHJlZ2lzdGVyU3VzcGVuc2VJbnN0YW5jZVJldHJ5ID0gJCQkaG9zdENvbmZpZy5yZWdpc3RlclN1c3BlbnNlSW5zdGFuY2VSZXRyeTtcbnZhciBnZXROZXh0SHlkcmF0YWJsZVNpYmxpbmcgPSAkJCRob3N0Q29uZmlnLmdldE5leHRIeWRyYXRhYmxlU2libGluZztcbnZhciBnZXRGaXJzdEh5ZHJhdGFibGVDaGlsZCA9ICQkJGhvc3RDb25maWcuZ2V0Rmlyc3RIeWRyYXRhYmxlQ2hpbGQ7XG52YXIgZ2V0Rmlyc3RIeWRyYXRhYmxlQ2hpbGRXaXRoaW5Db250YWluZXIgPSAkJCRob3N0Q29uZmlnLmdldEZpcnN0SHlkcmF0YWJsZUNoaWxkV2l0aGluQ29udGFpbmVyO1xudmFyIGdldEZpcnN0SHlkcmF0YWJsZUNoaWxkV2l0aGluU3VzcGVuc2VJbnN0YW5jZSA9ICQkJGhvc3RDb25maWcuZ2V0Rmlyc3RIeWRyYXRhYmxlQ2hpbGRXaXRoaW5TdXNwZW5zZUluc3RhbmNlO1xudmFyIGh5ZHJhdGVJbnN0YW5jZSA9ICQkJGhvc3RDb25maWcuaHlkcmF0ZUluc3RhbmNlO1xudmFyIGh5ZHJhdGVUZXh0SW5zdGFuY2UgPSAkJCRob3N0Q29uZmlnLmh5ZHJhdGVUZXh0SW5zdGFuY2U7XG52YXIgaHlkcmF0ZVN1c3BlbnNlSW5zdGFuY2UgPSAkJCRob3N0Q29uZmlnLmh5ZHJhdGVTdXNwZW5zZUluc3RhbmNlO1xudmFyIGdldE5leHRIeWRyYXRhYmxlSW5zdGFuY2VBZnRlclN1c3BlbnNlSW5zdGFuY2UgPSAkJCRob3N0Q29uZmlnLmdldE5leHRIeWRyYXRhYmxlSW5zdGFuY2VBZnRlclN1c3BlbnNlSW5zdGFuY2U7XG52YXIgY29tbWl0SHlkcmF0ZWRDb250YWluZXIgPSAkJCRob3N0Q29uZmlnLmNvbW1pdEh5ZHJhdGVkQ29udGFpbmVyO1xudmFyIGNvbW1pdEh5ZHJhdGVkU3VzcGVuc2VJbnN0YW5jZSA9ICQkJGhvc3RDb25maWcuY29tbWl0SHlkcmF0ZWRTdXNwZW5zZUluc3RhbmNlO1xudmFyIGNsZWFyU3VzcGVuc2VCb3VuZGFyeSA9ICQkJGhvc3RDb25maWcuY2xlYXJTdXNwZW5zZUJvdW5kYXJ5O1xudmFyIGNsZWFyU3VzcGVuc2VCb3VuZGFyeUZyb21Db250YWluZXIgPSAkJCRob3N0Q29uZmlnLmNsZWFyU3VzcGVuc2VCb3VuZGFyeUZyb21Db250YWluZXI7XG52YXIgc2hvdWxkRGVsZXRlVW5oeWRyYXRlZFRhaWxJbnN0YW5jZXMgPSAkJCRob3N0Q29uZmlnLnNob3VsZERlbGV0ZVVuaHlkcmF0ZWRUYWlsSW5zdGFuY2VzO1xudmFyIGRpZE5vdE1hdGNoSHlkcmF0ZWRDb250YWluZXJUZXh0SW5zdGFuY2UgPSAkJCRob3N0Q29uZmlnLmRpZE5vdE1hdGNoSHlkcmF0ZWRDb250YWluZXJUZXh0SW5zdGFuY2U7XG52YXIgZGlkTm90TWF0Y2hIeWRyYXRlZFRleHRJbnN0YW5jZSA9ICQkJGhvc3RDb25maWcuZGlkTm90TWF0Y2hIeWRyYXRlZFRleHRJbnN0YW5jZTtcbnZhciBkaWROb3RIeWRyYXRlSW5zdGFuY2VXaXRoaW5Db250YWluZXIgPSAkJCRob3N0Q29uZmlnLmRpZE5vdEh5ZHJhdGVJbnN0YW5jZVdpdGhpbkNvbnRhaW5lcjtcbnZhciBkaWROb3RIeWRyYXRlSW5zdGFuY2VXaXRoaW5TdXNwZW5zZUluc3RhbmNlID0gJCQkaG9zdENvbmZpZy5kaWROb3RIeWRyYXRlSW5zdGFuY2VXaXRoaW5TdXNwZW5zZUluc3RhbmNlO1xudmFyIGRpZE5vdEh5ZHJhdGVJbnN0YW5jZSA9ICQkJGhvc3RDb25maWcuZGlkTm90SHlkcmF0ZUluc3RhbmNlO1xudmFyIGRpZE5vdEZpbmRIeWRyYXRhYmxlSW5zdGFuY2VXaXRoaW5Db250YWluZXIgPSAkJCRob3N0Q29uZmlnLmRpZE5vdEZpbmRIeWRyYXRhYmxlSW5zdGFuY2VXaXRoaW5Db250YWluZXI7XG52YXIgZGlkTm90RmluZEh5ZHJhdGFibGVUZXh0SW5zdGFuY2VXaXRoaW5Db250YWluZXIgPSAkJCRob3N0Q29uZmlnLmRpZE5vdEZpbmRIeWRyYXRhYmxlVGV4dEluc3RhbmNlV2l0aGluQ29udGFpbmVyO1xudmFyIGRpZE5vdEZpbmRIeWRyYXRhYmxlU3VzcGVuc2VJbnN0YW5jZVdpdGhpbkNvbnRhaW5lciA9ICQkJGhvc3RDb25maWcuZGlkTm90RmluZEh5ZHJhdGFibGVTdXNwZW5zZUluc3RhbmNlV2l0aGluQ29udGFpbmVyO1xudmFyIGRpZE5vdEZpbmRIeWRyYXRhYmxlSW5zdGFuY2VXaXRoaW5TdXNwZW5zZUluc3RhbmNlID0gJCQkaG9zdENvbmZpZy5kaWROb3RGaW5kSHlkcmF0YWJsZUluc3RhbmNlV2l0aGluU3VzcGVuc2VJbnN0YW5jZTtcbnZhciBkaWROb3RGaW5kSHlkcmF0YWJsZVRleHRJbnN0YW5jZVdpdGhpblN1c3BlbnNlSW5zdGFuY2UgPSAkJCRob3N0Q29uZmlnLmRpZE5vdEZpbmRIeWRyYXRhYmxlVGV4dEluc3RhbmNlV2l0aGluU3VzcGVuc2VJbnN0YW5jZTtcbnZhciBkaWROb3RGaW5kSHlkcmF0YWJsZVN1c3BlbnNlSW5zdGFuY2VXaXRoaW5TdXNwZW5zZUluc3RhbmNlID0gJCQkaG9zdENvbmZpZy5kaWROb3RGaW5kSHlkcmF0YWJsZVN1c3BlbnNlSW5zdGFuY2VXaXRoaW5TdXNwZW5zZUluc3RhbmNlO1xudmFyIGRpZE5vdEZpbmRIeWRyYXRhYmxlSW5zdGFuY2UgPSAkJCRob3N0Q29uZmlnLmRpZE5vdEZpbmRIeWRyYXRhYmxlSW5zdGFuY2U7XG52YXIgZGlkTm90RmluZEh5ZHJhdGFibGVUZXh0SW5zdGFuY2UgPSAkJCRob3N0Q29uZmlnLmRpZE5vdEZpbmRIeWRyYXRhYmxlVGV4dEluc3RhbmNlO1xudmFyIGRpZE5vdEZpbmRIeWRyYXRhYmxlU3VzcGVuc2VJbnN0YW5jZSA9ICQkJGhvc3RDb25maWcuZGlkTm90RmluZEh5ZHJhdGFibGVTdXNwZW5zZUluc3RhbmNlO1xudmFyIGVycm9ySHlkcmF0aW5nQ29udGFpbmVyID0gJCQkaG9zdENvbmZpZy5lcnJvckh5ZHJhdGluZ0NvbnRhaW5lcjtcblxuLy8gSGVscGVycyB0byBwYXRjaCBjb25zb2xlLmxvZ3MgdG8gYXZvaWQgbG9nZ2luZyBkdXJpbmcgc2lkZS1lZmZlY3QgZnJlZVxuLy8gcmVwbGF5aW5nIG9uIHJlbmRlciBmdW5jdGlvbi4gVGhpcyBjdXJyZW50bHkgb25seSBwYXRjaGVzIHRoZSBvYmplY3Rcbi8vIGxhemlseSB3aGljaCB3b24ndCBjb3ZlciBpZiB0aGUgbG9nIGZ1bmN0aW9uIHdhcyBleHRyYWN0ZWQgZWFnZXJseS5cbi8vIFdlIGNvdWxkIGFsc28gZWFnZXJseSBwYXRjaCB0aGUgbWV0aG9kLlxudmFyIGRpc2FibGVkRGVwdGggPSAwO1xudmFyIHByZXZMb2c7XG52YXIgcHJldkluZm87XG52YXIgcHJldldhcm47XG52YXIgcHJldkVycm9yO1xudmFyIHByZXZHcm91cDtcbnZhciBwcmV2R3JvdXBDb2xsYXBzZWQ7XG52YXIgcHJldkdyb3VwRW5kO1xuXG5mdW5jdGlvbiBkaXNhYmxlZExvZygpIHt9XG5cbmRpc2FibGVkTG9nLl9fcmVhY3REaXNhYmxlZExvZyA9IHRydWU7XG5mdW5jdGlvbiBkaXNhYmxlTG9ncygpIHtcbiAge1xuICAgIGlmIChkaXNhYmxlZERlcHRoID09PSAwKSB7XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmcgKi9cbiAgICAgIHByZXZMb2cgPSBjb25zb2xlLmxvZztcbiAgICAgIHByZXZJbmZvID0gY29uc29sZS5pbmZvO1xuICAgICAgcHJldldhcm4gPSBjb25zb2xlLndhcm47XG4gICAgICBwcmV2RXJyb3IgPSBjb25zb2xlLmVycm9yO1xuICAgICAgcHJldkdyb3VwID0gY29uc29sZS5ncm91cDtcbiAgICAgIHByZXZHcm91cENvbGxhcHNlZCA9IGNvbnNvbGUuZ3JvdXBDb2xsYXBzZWQ7XG4gICAgICBwcmV2R3JvdXBFbmQgPSBjb25zb2xlLmdyb3VwRW5kOyAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzE5MDk5XG5cbiAgICAgIHZhciBwcm9wcyA9IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB2YWx1ZTogZGlzYWJsZWRMb2csXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICB9OyAvLyAkRmxvd0ZpeE1lIEZsb3cgdGhpbmtzIGNvbnNvbGUgaXMgaW1tdXRhYmxlLlxuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhjb25zb2xlLCB7XG4gICAgICAgIGluZm86IHByb3BzLFxuICAgICAgICBsb2c6IHByb3BzLFxuICAgICAgICB3YXJuOiBwcm9wcyxcbiAgICAgICAgZXJyb3I6IHByb3BzLFxuICAgICAgICBncm91cDogcHJvcHMsXG4gICAgICAgIGdyb3VwQ29sbGFwc2VkOiBwcm9wcyxcbiAgICAgICAgZ3JvdXBFbmQ6IHByb3BzXG4gICAgICB9KTtcbiAgICAgIC8qIGVzbGludC1lbmFibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovXG4gICAgfVxuXG4gICAgZGlzYWJsZWREZXB0aCsrO1xuICB9XG59XG5mdW5jdGlvbiByZWVuYWJsZUxvZ3MoKSB7XG4gIHtcbiAgICBkaXNhYmxlZERlcHRoLS07XG5cbiAgICBpZiAoZGlzYWJsZWREZXB0aCA9PT0gMCkge1xuICAgICAgLyogZXNsaW50LWRpc2FibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovXG4gICAgICB2YXIgcHJvcHMgPSB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWVcbiAgICAgIH07IC8vICRGbG93Rml4TWUgRmxvdyB0aGlua3MgY29uc29sZSBpcyBpbW11dGFibGUuXG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGNvbnNvbGUsIHtcbiAgICAgICAgbG9nOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZMb2dcbiAgICAgICAgfSksXG4gICAgICAgIGluZm86IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkluZm9cbiAgICAgICAgfSksXG4gICAgICAgIHdhcm46IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldldhcm5cbiAgICAgICAgfSksXG4gICAgICAgIGVycm9yOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZFcnJvclxuICAgICAgICB9KSxcbiAgICAgICAgZ3JvdXA6IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkdyb3VwXG4gICAgICAgIH0pLFxuICAgICAgICBncm91cENvbGxhcHNlZDogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2R3JvdXBDb2xsYXBzZWRcbiAgICAgICAgfSksXG4gICAgICAgIGdyb3VwRW5kOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZHcm91cEVuZFxuICAgICAgICB9KVxuICAgICAgfSk7XG4gICAgICAvKiBlc2xpbnQtZW5hYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgIH1cblxuICAgIGlmIChkaXNhYmxlZERlcHRoIDwgMCkge1xuICAgICAgZXJyb3IoJ2Rpc2FibGVkRGVwdGggZmVsbCBiZWxvdyB6ZXJvLiAnICsgJ1RoaXMgaXMgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cbiAgfVxufVxuXG52YXIgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudERpc3BhdGNoZXI7XG52YXIgcHJlZml4O1xuZnVuY3Rpb24gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUobmFtZSwgc291cmNlLCBvd25lckZuKSB7XG4gIHtcbiAgICBpZiAocHJlZml4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIEV4dHJhY3QgdGhlIFZNIHNwZWNpZmljIHByZWZpeCB1c2VkIGJ5IGVhY2ggbGluZS5cbiAgICAgIHRyeSB7XG4gICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgIHZhciBtYXRjaCA9IHguc3RhY2sudHJpbSgpLm1hdGNoKC9cXG4oICooYXQgKT8pLyk7XG4gICAgICAgIHByZWZpeCA9IG1hdGNoICYmIG1hdGNoWzFdIHx8ICcnO1xuICAgICAgfVxuICAgIH0gLy8gV2UgdXNlIHRoZSBwcmVmaXggdG8gZW5zdXJlIG91ciBzdGFja3MgbGluZSB1cCB3aXRoIG5hdGl2ZSBzdGFjayBmcmFtZXMuXG5cblxuICAgIHJldHVybiAnXFxuJyArIHByZWZpeCArIG5hbWU7XG4gIH1cbn1cbnZhciByZWVudHJ5ID0gZmFsc2U7XG52YXIgY29tcG9uZW50RnJhbWVDYWNoZTtcblxue1xuICB2YXIgUG9zc2libHlXZWFrTWFwID0gdHlwZW9mIFdlYWtNYXAgPT09ICdmdW5jdGlvbicgPyBXZWFrTWFwIDogTWFwO1xuICBjb21wb25lbnRGcmFtZUNhY2hlID0gbmV3IFBvc3NpYmx5V2Vha01hcCgpO1xufVxuXG5mdW5jdGlvbiBkZXNjcmliZU5hdGl2ZUNvbXBvbmVudEZyYW1lKGZuLCBjb25zdHJ1Y3QpIHtcbiAgLy8gSWYgc29tZXRoaW5nIGFza2VkIGZvciBhIHN0YWNrIGluc2lkZSBhIGZha2UgcmVuZGVyLCBpdCBzaG91bGQgZ2V0IGlnbm9yZWQuXG4gIGlmICggIWZuIHx8IHJlZW50cnkpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICB7XG4gICAgdmFyIGZyYW1lID0gY29tcG9uZW50RnJhbWVDYWNoZS5nZXQoZm4pO1xuXG4gICAgaWYgKGZyYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmcmFtZTtcbiAgICB9XG4gIH1cblxuICB2YXIgY29udHJvbDtcbiAgcmVlbnRyeSA9IHRydWU7XG4gIHZhciBwcmV2aW91c1ByZXBhcmVTdGFja1RyYWNlID0gRXJyb3IucHJlcGFyZVN0YWNrVHJhY2U7IC8vICRGbG93Rml4TWUgSXQgZG9lcyBhY2NlcHQgdW5kZWZpbmVkLlxuXG4gIEVycm9yLnByZXBhcmVTdGFja1RyYWNlID0gdW5kZWZpbmVkO1xuICB2YXIgcHJldmlvdXNEaXNwYXRjaGVyO1xuXG4gIHtcbiAgICBwcmV2aW91c0Rpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyLmN1cnJlbnQ7IC8vIFNldCB0aGUgZGlzcGF0Y2hlciBpbiBERVYgYmVjYXVzZSB0aGlzIG1pZ2h0IGJlIGNhbGwgaW4gdGhlIHJlbmRlciBmdW5jdGlvblxuICAgIC8vIGZvciB3YXJuaW5ncy5cblxuICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIuY3VycmVudCA9IG51bGw7XG4gICAgZGlzYWJsZUxvZ3MoKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgLy8gVGhpcyBzaG91bGQgdGhyb3cuXG4gICAgaWYgKGNvbnN0cnVjdCkge1xuICAgICAgLy8gU29tZXRoaW5nIHNob3VsZCBiZSBzZXR0aW5nIHRoZSBwcm9wcyBpbiB0aGUgY29uc3RydWN0b3IuXG4gICAgICB2YXIgRmFrZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgIH07IC8vICRGbG93Rml4TWVcblxuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRmFrZS5wcm90b3R5cGUsICdwcm9wcycsIHtcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgLy8gV2UgdXNlIGEgdGhyb3dpbmcgc2V0dGVyIGluc3RlYWQgb2YgZnJvemVuIG9yIG5vbi13cml0YWJsZSBwcm9wc1xuICAgICAgICAgIC8vIGJlY2F1c2UgdGhhdCB3b24ndCB0aHJvdyBpbiBhIG5vbi1zdHJpY3QgbW9kZSBmdW5jdGlvbi5cbiAgICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSAnb2JqZWN0JyAmJiBSZWZsZWN0LmNvbnN0cnVjdCkge1xuICAgICAgICAvLyBXZSBjb25zdHJ1Y3QgYSBkaWZmZXJlbnQgY29udHJvbCBmb3IgdGhpcyBjYXNlIHRvIGluY2x1ZGUgYW55IGV4dHJhXG4gICAgICAgIC8vIGZyYW1lcyBhZGRlZCBieSB0aGUgY29uc3RydWN0IGNhbGwuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgUmVmbGVjdC5jb25zdHJ1Y3QoRmFrZSwgW10pO1xuICAgICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgICAgY29udHJvbCA9IHg7XG4gICAgICAgIH1cblxuICAgICAgICBSZWZsZWN0LmNvbnN0cnVjdChmbiwgW10sIEZha2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBGYWtlLmNhbGwoKTtcbiAgICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICAgIGNvbnRyb2wgPSB4O1xuICAgICAgICB9XG5cbiAgICAgICAgZm4uY2FsbChGYWtlLnByb3RvdHlwZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgIGNvbnRyb2wgPSB4O1xuICAgICAgfVxuXG4gICAgICBmbigpO1xuICAgIH1cbiAgfSBjYXRjaCAoc2FtcGxlKSB7XG4gICAgLy8gVGhpcyBpcyBpbmxpbmVkIG1hbnVhbGx5IGJlY2F1c2UgY2xvc3VyZSBkb2Vzbid0IGRvIGl0IGZvciB1cy5cbiAgICBpZiAoc2FtcGxlICYmIGNvbnRyb2wgJiYgdHlwZW9mIHNhbXBsZS5zdGFjayA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIFRoaXMgZXh0cmFjdHMgdGhlIGZpcnN0IGZyYW1lIGZyb20gdGhlIHNhbXBsZSB0aGF0IGlzbid0IGFsc28gaW4gdGhlIGNvbnRyb2wuXG4gICAgICAvLyBTa2lwcGluZyBvbmUgZnJhbWUgdGhhdCB3ZSBhc3N1bWUgaXMgdGhlIGZyYW1lIHRoYXQgY2FsbHMgdGhlIHR3by5cbiAgICAgIHZhciBzYW1wbGVMaW5lcyA9IHNhbXBsZS5zdGFjay5zcGxpdCgnXFxuJyk7XG4gICAgICB2YXIgY29udHJvbExpbmVzID0gY29udHJvbC5zdGFjay5zcGxpdCgnXFxuJyk7XG4gICAgICB2YXIgcyA9IHNhbXBsZUxpbmVzLmxlbmd0aCAtIDE7XG4gICAgICB2YXIgYyA9IGNvbnRyb2xMaW5lcy5sZW5ndGggLSAxO1xuXG4gICAgICB3aGlsZSAocyA+PSAxICYmIGMgPj0gMCAmJiBzYW1wbGVMaW5lc1tzXSAhPT0gY29udHJvbExpbmVzW2NdKSB7XG4gICAgICAgIC8vIFdlIGV4cGVjdCBhdCBsZWFzdCBvbmUgc3RhY2sgZnJhbWUgdG8gYmUgc2hhcmVkLlxuICAgICAgICAvLyBUeXBpY2FsbHkgdGhpcyB3aWxsIGJlIHRoZSByb290IG1vc3Qgb25lLiBIb3dldmVyLCBzdGFjayBmcmFtZXMgbWF5IGJlXG4gICAgICAgIC8vIGN1dCBvZmYgZHVlIHRvIG1heGltdW0gc3RhY2sgbGltaXRzLiBJbiB0aGlzIGNhc2UsIG9uZSBtYXliZSBjdXQgb2ZmXG4gICAgICAgIC8vIGVhcmxpZXIgdGhhbiB0aGUgb3RoZXIuIFdlIGFzc3VtZSB0aGF0IHRoZSBzYW1wbGUgaXMgbG9uZ2VyIG9yIHRoZSBzYW1lXG4gICAgICAgIC8vIGFuZCB0aGVyZSBmb3IgY3V0IG9mZiBlYXJsaWVyLiBTbyB3ZSBzaG91bGQgZmluZCB0aGUgcm9vdCBtb3N0IGZyYW1lIGluXG4gICAgICAgIC8vIHRoZSBzYW1wbGUgc29tZXdoZXJlIGluIHRoZSBjb250cm9sLlxuICAgICAgICBjLS07XG4gICAgICB9XG5cbiAgICAgIGZvciAoOyBzID49IDEgJiYgYyA+PSAwOyBzLS0sIGMtLSkge1xuICAgICAgICAvLyBOZXh0IHdlIGZpbmQgdGhlIGZpcnN0IG9uZSB0aGF0IGlzbid0IHRoZSBzYW1lIHdoaWNoIHNob3VsZCBiZSB0aGVcbiAgICAgICAgLy8gZnJhbWUgdGhhdCBjYWxsZWQgb3VyIHNhbXBsZSBmdW5jdGlvbiBhbmQgdGhlIGNvbnRyb2wuXG4gICAgICAgIGlmIChzYW1wbGVMaW5lc1tzXSAhPT0gY29udHJvbExpbmVzW2NdKSB7XG4gICAgICAgICAgLy8gSW4gVjgsIHRoZSBmaXJzdCBsaW5lIGlzIGRlc2NyaWJpbmcgdGhlIG1lc3NhZ2UgYnV0IG90aGVyIFZNcyBkb24ndC5cbiAgICAgICAgICAvLyBJZiB3ZSdyZSBhYm91dCB0byByZXR1cm4gdGhlIGZpcnN0IGxpbmUsIGFuZCB0aGUgY29udHJvbCBpcyBhbHNvIG9uIHRoZSBzYW1lXG4gICAgICAgICAgLy8gbGluZSwgdGhhdCdzIGEgcHJldHR5IGdvb2QgaW5kaWNhdG9yIHRoYXQgb3VyIHNhbXBsZSB0aHJldyBhdCBzYW1lIGxpbmUgYXNcbiAgICAgICAgICAvLyB0aGUgY29udHJvbC4gSS5lLiBiZWZvcmUgd2UgZW50ZXJlZCB0aGUgc2FtcGxlIGZyYW1lLiBTbyB3ZSBpZ25vcmUgdGhpcyByZXN1bHQuXG4gICAgICAgICAgLy8gVGhpcyBjYW4gaGFwcGVuIGlmIHlvdSBwYXNzZWQgYSBjbGFzcyB0byBmdW5jdGlvbiBjb21wb25lbnQsIG9yIG5vbi1mdW5jdGlvbi5cbiAgICAgICAgICBpZiAocyAhPT0gMSB8fCBjICE9PSAxKSB7XG4gICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgIHMtLTtcbiAgICAgICAgICAgICAgYy0tOyAvLyBXZSBtYXkgc3RpbGwgaGF2ZSBzaW1pbGFyIGludGVybWVkaWF0ZSBmcmFtZXMgZnJvbSB0aGUgY29uc3RydWN0IGNhbGwuXG4gICAgICAgICAgICAgIC8vIFRoZSBuZXh0IG9uZSB0aGF0IGlzbid0IHRoZSBzYW1lIHNob3VsZCBiZSBvdXIgbWF0Y2ggdGhvdWdoLlxuXG4gICAgICAgICAgICAgIGlmIChjIDwgMCB8fCBzYW1wbGVMaW5lc1tzXSAhPT0gY29udHJvbExpbmVzW2NdKSB7XG4gICAgICAgICAgICAgICAgLy8gVjggYWRkcyBhIFwibmV3XCIgcHJlZml4IGZvciBuYXRpdmUgY2xhc3Nlcy4gTGV0J3MgcmVtb3ZlIGl0IHRvIG1ha2UgaXQgcHJldHRpZXIuXG4gICAgICAgICAgICAgICAgdmFyIF9mcmFtZSA9ICdcXG4nICsgc2FtcGxlTGluZXNbc10ucmVwbGFjZSgnIGF0IG5ldyAnLCAnIGF0ICcpOyAvLyBJZiBvdXIgY29tcG9uZW50IGZyYW1lIGlzIGxhYmVsZWQgXCI8YW5vbnltb3VzPlwiXG4gICAgICAgICAgICAgICAgLy8gYnV0IHdlIGhhdmUgYSB1c2VyLXByb3ZpZGVkIFwiZGlzcGxheU5hbWVcIlxuICAgICAgICAgICAgICAgIC8vIHNwbGljZSBpdCBpbiB0byBtYWtlIHRoZSBzdGFjayBtb3JlIHJlYWRhYmxlLlxuXG5cbiAgICAgICAgICAgICAgICBpZiAoZm4uZGlzcGxheU5hbWUgJiYgX2ZyYW1lLmluY2x1ZGVzKCc8YW5vbnltb3VzPicpKSB7XG4gICAgICAgICAgICAgICAgICBfZnJhbWUgPSBfZnJhbWUucmVwbGFjZSgnPGFub255bW91cz4nLCBmbi5kaXNwbGF5TmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRGcmFtZUNhY2hlLnNldChmbiwgX2ZyYW1lKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IC8vIFJldHVybiB0aGUgbGluZSB3ZSBmb3VuZC5cblxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIF9mcmFtZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSB3aGlsZSAocyA+PSAxICYmIGMgPj0gMCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgcmVlbnRyeSA9IGZhbHNlO1xuXG4gICAge1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlci5jdXJyZW50ID0gcHJldmlvdXNEaXNwYXRjaGVyO1xuICAgICAgcmVlbmFibGVMb2dzKCk7XG4gICAgfVxuXG4gICAgRXJyb3IucHJlcGFyZVN0YWNrVHJhY2UgPSBwcmV2aW91c1ByZXBhcmVTdGFja1RyYWNlO1xuICB9IC8vIEZhbGxiYWNrIHRvIGp1c3QgdXNpbmcgdGhlIG5hbWUgaWYgd2UgY291bGRuJ3QgbWFrZSBpdCB0aHJvdy5cblxuXG4gIHZhciBuYW1lID0gZm4gPyBmbi5kaXNwbGF5TmFtZSB8fCBmbi5uYW1lIDogJyc7XG4gIHZhciBzeW50aGV0aWNGcmFtZSA9IG5hbWUgPyBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZShuYW1lKSA6ICcnO1xuXG4gIHtcbiAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb21wb25lbnRGcmFtZUNhY2hlLnNldChmbiwgc3ludGhldGljRnJhbWUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzeW50aGV0aWNGcmFtZTtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVDbGFzc0NvbXBvbmVudEZyYW1lKGN0b3IsIHNvdXJjZSwgb3duZXJGbikge1xuICB7XG4gICAgcmV0dXJuIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUoY3RvciwgdHJ1ZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGRlc2NyaWJlRnVuY3Rpb25Db21wb25lbnRGcmFtZShmbiwgc291cmNlLCBvd25lckZuKSB7XG4gIHtcbiAgICByZXR1cm4gZGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZShmbiwgZmFsc2UpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNob3VsZENvbnN0cnVjdChDb21wb25lbnQpIHtcbiAgdmFyIHByb3RvdHlwZSA9IENvbXBvbmVudC5wcm90b3R5cGU7XG4gIHJldHVybiAhIShwcm90b3R5cGUgJiYgcHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQpO1xufVxuXG5mdW5jdGlvbiBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYodHlwZSwgc291cmNlLCBvd25lckZuKSB7XG5cbiAgaWYgKHR5cGUgPT0gbnVsbCkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHtcbiAgICAgIHJldHVybiBkZXNjcmliZU5hdGl2ZUNvbXBvbmVudEZyYW1lKHR5cGUsIHNob3VsZENvbnN0cnVjdCh0eXBlKSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZSh0eXBlKTtcbiAgfVxuXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfVFlQRTpcbiAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZSgnU3VzcGVuc2UnKTtcblxuICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFOlxuICAgICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKCdTdXNwZW5zZUxpc3QnKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICBzd2l0Y2ggKHR5cGUuJCR0eXBlb2YpIHtcbiAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTpcbiAgICAgICAgcmV0dXJuIGRlc2NyaWJlRnVuY3Rpb25Db21wb25lbnRGcmFtZSh0eXBlLnJlbmRlcik7XG5cbiAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICAvLyBNZW1vIG1heSBjb250YWluIGFueSBjb21wb25lbnQgdHlwZSBzbyB3ZSByZWN1cnNpdmVseSByZXNvbHZlIGl0LlxuICAgICAgICByZXR1cm4gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKHR5cGUudHlwZSwgc291cmNlLCBvd25lckZuKTtcblxuICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgbGF6eUNvbXBvbmVudCA9IHR5cGU7XG4gICAgICAgICAgdmFyIHBheWxvYWQgPSBsYXp5Q29tcG9uZW50Ll9wYXlsb2FkO1xuICAgICAgICAgIHZhciBpbml0ID0gbGF6eUNvbXBvbmVudC5faW5pdDtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBMYXp5IG1heSBjb250YWluIGFueSBjb21wb25lbnQgdHlwZSBzbyB3ZSByZWN1cnNpdmVseSByZXNvbHZlIGl0LlxuICAgICAgICAgICAgcmV0dXJuIGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVihpbml0KHBheWxvYWQpLCBzb3VyY2UsIG93bmVyRm4pO1xuICAgICAgICAgIH0gY2F0Y2ggKHgpIHt9XG4gICAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gJyc7XG59XG5cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbnZhciBsb2dnZWRUeXBlRmFpbHVyZXMgPSB7fTtcbnZhciBSZWFjdERlYnVnQ3VycmVudEZyYW1lID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZTtcblxuZnVuY3Rpb24gc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQoZWxlbWVudCkge1xuICB7XG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIHZhciBvd25lciA9IGVsZW1lbnQuX293bmVyO1xuICAgICAgdmFyIHN0YWNrID0gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKGVsZW1lbnQudHlwZSwgZWxlbWVudC5fc291cmNlLCBvd25lciA/IG93bmVyLnR5cGUgOiBudWxsKTtcbiAgICAgIFJlYWN0RGVidWdDdXJyZW50RnJhbWUuc2V0RXh0cmFTdGFja0ZyYW1lKHN0YWNrKTtcbiAgICB9IGVsc2Uge1xuICAgICAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5zZXRFeHRyYVN0YWNrRnJhbWUobnVsbCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNoZWNrUHJvcFR5cGVzKHR5cGVTcGVjcywgdmFsdWVzLCBsb2NhdGlvbiwgY29tcG9uZW50TmFtZSwgZWxlbWVudCkge1xuICB7XG4gICAgLy8gJEZsb3dGaXhNZSBUaGlzIGlzIG9rYXkgYnV0IEZsb3cgZG9lc24ndCBrbm93IGl0LlxuICAgIHZhciBoYXMgPSBGdW5jdGlvbi5jYWxsLmJpbmQoaGFzT3duUHJvcGVydHkpO1xuXG4gICAgZm9yICh2YXIgdHlwZVNwZWNOYW1lIGluIHR5cGVTcGVjcykge1xuICAgICAgaWYgKGhhcyh0eXBlU3BlY3MsIHR5cGVTcGVjTmFtZSkpIHtcbiAgICAgICAgdmFyIGVycm9yJDEgPSB2b2lkIDA7IC8vIFByb3AgdHlwZSB2YWxpZGF0aW9uIG1heSB0aHJvdy4gSW4gY2FzZSB0aGV5IGRvLCB3ZSBkb24ndCB3YW50IHRvXG4gICAgICAgIC8vIGZhaWwgdGhlIHJlbmRlciBwaGFzZSB3aGVyZSBpdCBkaWRuJ3QgZmFpbCBiZWZvcmUuIFNvIHdlIGxvZyBpdC5cbiAgICAgICAgLy8gQWZ0ZXIgdGhlc2UgaGF2ZSBiZWVuIGNsZWFuZWQgdXAsIHdlJ2xsIGxldCB0aGVtIHRocm93LlxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyBpbnRlbnRpb25hbGx5IGFuIGludmFyaWFudCB0aGF0IGdldHMgY2F1Z2h0LiBJdCdzIHRoZSBzYW1lXG4gICAgICAgICAgLy8gYmVoYXZpb3IgYXMgd2l0aG91dCB0aGlzIHN0YXRlbWVudCBleGNlcHQgd2l0aCBhIGJldHRlciBtZXNzYWdlLlxuICAgICAgICAgIGlmICh0eXBlb2YgdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9wcm9kLWVycm9yLWNvZGVzXG4gICAgICAgICAgICB2YXIgZXJyID0gRXJyb3IoKGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJykgKyAnOiAnICsgbG9jYXRpb24gKyAnIHR5cGUgYCcgKyB0eXBlU3BlY05hbWUgKyAnYCBpcyBpbnZhbGlkOyAnICsgJ2l0IG11c3QgYmUgYSBmdW5jdGlvbiwgdXN1YWxseSBmcm9tIHRoZSBgcHJvcC10eXBlc2AgcGFja2FnZSwgYnV0IHJlY2VpdmVkIGAnICsgdHlwZW9mIHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdICsgJ2AuJyArICdUaGlzIG9mdGVuIGhhcHBlbnMgYmVjYXVzZSBvZiB0eXBvcyBzdWNoIGFzIGBQcm9wVHlwZXMuZnVuY3Rpb25gIGluc3RlYWQgb2YgYFByb3BUeXBlcy5mdW5jYC4nKTtcbiAgICAgICAgICAgIGVyci5uYW1lID0gJ0ludmFyaWFudCBWaW9sYXRpb24nO1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGVycm9yJDEgPSB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSh2YWx1ZXMsIHR5cGVTcGVjTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIG51bGwsICdTRUNSRVRfRE9fTk9UX1BBU1NfVEhJU19PUl9ZT1VfV0lMTF9CRV9GSVJFRCcpO1xuICAgICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICAgIGVycm9yJDEgPSBleDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlcnJvciQxICYmICEoZXJyb3IkMSBpbnN0YW5jZW9mIEVycm9yKSkge1xuICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KGVsZW1lbnQpO1xuXG4gICAgICAgICAgZXJyb3IoJyVzOiB0eXBlIHNwZWNpZmljYXRpb24gb2YgJXMnICsgJyBgJXNgIGlzIGludmFsaWQ7IHRoZSB0eXBlIGNoZWNrZXIgJyArICdmdW5jdGlvbiBtdXN0IHJldHVybiBgbnVsbGAgb3IgYW4gYEVycm9yYCBidXQgcmV0dXJuZWQgYSAlcy4gJyArICdZb3UgbWF5IGhhdmUgZm9yZ290dGVuIHRvIHBhc3MgYW4gYXJndW1lbnQgdG8gdGhlIHR5cGUgY2hlY2tlciAnICsgJ2NyZWF0b3IgKGFycmF5T2YsIGluc3RhbmNlT2YsIG9iamVjdE9mLCBvbmVPZiwgb25lT2ZUeXBlLCBhbmQgJyArICdzaGFwZSBhbGwgcmVxdWlyZSBhbiBhcmd1bWVudCkuJywgY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnLCBsb2NhdGlvbiwgdHlwZVNwZWNOYW1lLCB0eXBlb2YgZXJyb3IkMSk7XG5cbiAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChudWxsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlcnJvciQxIGluc3RhbmNlb2YgRXJyb3IgJiYgIShlcnJvciQxLm1lc3NhZ2UgaW4gbG9nZ2VkVHlwZUZhaWx1cmVzKSkge1xuICAgICAgICAgIC8vIE9ubHkgbW9uaXRvciB0aGlzIGZhaWx1cmUgb25jZSBiZWNhdXNlIHRoZXJlIHRlbmRzIHRvIGJlIGEgbG90IG9mIHRoZVxuICAgICAgICAgIC8vIHNhbWUgZXJyb3IuXG4gICAgICAgICAgbG9nZ2VkVHlwZUZhaWx1cmVzW2Vycm9yJDEubWVzc2FnZV0gPSB0cnVlO1xuICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KGVsZW1lbnQpO1xuXG4gICAgICAgICAgZXJyb3IoJ0ZhaWxlZCAlcyB0eXBlOiAlcycsIGxvY2F0aW9uLCBlcnJvciQxLm1lc3NhZ2UpO1xuXG4gICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQobnVsbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIHZhbHVlU3RhY2sgPSBbXTtcbnZhciBmaWJlclN0YWNrO1xuXG57XG4gIGZpYmVyU3RhY2sgPSBbXTtcbn1cblxudmFyIGluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNyZWF0ZUN1cnNvcihkZWZhdWx0VmFsdWUpIHtcbiAgcmV0dXJuIHtcbiAgICBjdXJyZW50OiBkZWZhdWx0VmFsdWVcbiAgfTtcbn1cblxuZnVuY3Rpb24gcG9wKGN1cnNvciwgZmliZXIpIHtcbiAgaWYgKGluZGV4IDwgMCkge1xuICAgIHtcbiAgICAgIGVycm9yKCdVbmV4cGVjdGVkIHBvcC4nKTtcbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH1cblxuICB7XG4gICAgaWYgKGZpYmVyICE9PSBmaWJlclN0YWNrW2luZGV4XSkge1xuICAgICAgZXJyb3IoJ1VuZXhwZWN0ZWQgRmliZXIgcG9wcGVkLicpO1xuICAgIH1cbiAgfVxuXG4gIGN1cnNvci5jdXJyZW50ID0gdmFsdWVTdGFja1tpbmRleF07XG4gIHZhbHVlU3RhY2tbaW5kZXhdID0gbnVsbDtcblxuICB7XG4gICAgZmliZXJTdGFja1tpbmRleF0gPSBudWxsO1xuICB9XG5cbiAgaW5kZXgtLTtcbn1cblxuZnVuY3Rpb24gcHVzaChjdXJzb3IsIHZhbHVlLCBmaWJlcikge1xuICBpbmRleCsrO1xuICB2YWx1ZVN0YWNrW2luZGV4XSA9IGN1cnNvci5jdXJyZW50O1xuXG4gIHtcbiAgICBmaWJlclN0YWNrW2luZGV4XSA9IGZpYmVyO1xuICB9XG5cbiAgY3Vyc29yLmN1cnJlbnQgPSB2YWx1ZTtcbn1cblxudmFyIHdhcm5lZEFib3V0TWlzc2luZ0dldENoaWxkQ29udGV4dDtcblxue1xuICB3YXJuZWRBYm91dE1pc3NpbmdHZXRDaGlsZENvbnRleHQgPSB7fTtcbn1cblxudmFyIGVtcHR5Q29udGV4dE9iamVjdCA9IHt9O1xuXG57XG4gIE9iamVjdC5mcmVlemUoZW1wdHlDb250ZXh0T2JqZWN0KTtcbn0gLy8gQSBjdXJzb3IgdG8gdGhlIGN1cnJlbnQgbWVyZ2VkIGNvbnRleHQgb2JqZWN0IG9uIHRoZSBzdGFjay5cblxuXG52YXIgY29udGV4dFN0YWNrQ3Vyc29yID0gY3JlYXRlQ3Vyc29yKGVtcHR5Q29udGV4dE9iamVjdCk7IC8vIEEgY3Vyc29yIHRvIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGNvbnRleHQgaGFzIGNoYW5nZWQuXG5cbnZhciBkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yID0gY3JlYXRlQ3Vyc29yKGZhbHNlKTsgLy8gS2VlcCB0cmFjayBvZiB0aGUgcHJldmlvdXMgY29udGV4dCBvYmplY3QgdGhhdCB3YXMgb24gdGhlIHN0YWNrLlxuLy8gV2UgdXNlIHRoaXMgdG8gZ2V0IGFjY2VzcyB0byB0aGUgcGFyZW50IGNvbnRleHQgYWZ0ZXIgd2UgaGF2ZSBhbHJlYWR5XG4vLyBwdXNoZWQgdGhlIG5leHQgY29udGV4dCBwcm92aWRlciwgYW5kIG5vdyBuZWVkIHRvIG1lcmdlIHRoZWlyIGNvbnRleHRzLlxuXG52YXIgcHJldmlvdXNDb250ZXh0ID0gZW1wdHlDb250ZXh0T2JqZWN0O1xuXG5mdW5jdGlvbiBnZXRVbm1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgZGlkUHVzaE93bkNvbnRleHRJZlByb3ZpZGVyKSB7XG4gIHtcbiAgICBpZiAoZGlkUHVzaE93bkNvbnRleHRJZlByb3ZpZGVyICYmIGlzQ29udGV4dFByb3ZpZGVyKENvbXBvbmVudCkpIHtcbiAgICAgIC8vIElmIHRoZSBmaWJlciBpcyBhIGNvbnRleHQgcHJvdmlkZXIgaXRzZWxmLCB3aGVuIHdlIHJlYWQgaXRzIGNvbnRleHRcbiAgICAgIC8vIHdlIG1heSBoYXZlIGFscmVhZHkgcHVzaGVkIGl0cyBvd24gY2hpbGQgY29udGV4dCBvbiB0aGUgc3RhY2suIEEgY29udGV4dFxuICAgICAgLy8gcHJvdmlkZXIgc2hvdWxkIG5vdCBcInNlZVwiIGl0cyBvd24gY2hpbGQgY29udGV4dC4gVGhlcmVmb3JlIHdlIHJlYWQgdGhlXG4gICAgICAvLyBwcmV2aW91cyAocGFyZW50KSBjb250ZXh0IGluc3RlYWQgZm9yIGEgY29udGV4dCBwcm92aWRlci5cbiAgICAgIHJldHVybiBwcmV2aW91c0NvbnRleHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnRleHRTdGFja0N1cnNvci5jdXJyZW50O1xuICB9XG59XG5cbmZ1bmN0aW9uIGNhY2hlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgdW5tYXNrZWRDb250ZXh0LCBtYXNrZWRDb250ZXh0KSB7XG4gIHtcbiAgICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gICAgaW5zdGFuY2UuX19yZWFjdEludGVybmFsTWVtb2l6ZWRVbm1hc2tlZENoaWxkQ29udGV4dCA9IHVubWFza2VkQ29udGV4dDtcbiAgICBpbnN0YW5jZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1hc2tlZENoaWxkQ29udGV4dCA9IG1hc2tlZENvbnRleHQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0TWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgdW5tYXNrZWRDb250ZXh0KSB7XG4gIHtcbiAgICB2YXIgdHlwZSA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gICAgdmFyIGNvbnRleHRUeXBlcyA9IHR5cGUuY29udGV4dFR5cGVzO1xuXG4gICAgaWYgKCFjb250ZXh0VHlwZXMpIHtcbiAgICAgIHJldHVybiBlbXB0eUNvbnRleHRPYmplY3Q7XG4gICAgfSAvLyBBdm9pZCByZWNyZWF0aW5nIG1hc2tlZCBjb250ZXh0IHVubGVzcyB1bm1hc2tlZCBjb250ZXh0IGhhcyBjaGFuZ2VkLlxuICAgIC8vIEZhaWxpbmcgdG8gZG8gdGhpcyB3aWxsIHJlc3VsdCBpbiB1bm5lY2Vzc2FyeSBjYWxscyB0byBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzLlxuICAgIC8vIFRoaXMgbWF5IHRyaWdnZXIgaW5maW5pdGUgbG9vcHMgaWYgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyBjYWxscyBzZXRTdGF0ZS5cblxuXG4gICAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuXG4gICAgaWYgKGluc3RhbmNlICYmIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkVW5tYXNrZWRDaGlsZENvbnRleHQgPT09IHVubWFza2VkQ29udGV4dCkge1xuICAgICAgcmV0dXJuIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWFza2VkQ2hpbGRDb250ZXh0O1xuICAgIH1cblxuICAgIHZhciBjb250ZXh0ID0ge307XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gY29udGV4dFR5cGVzKSB7XG4gICAgICBjb250ZXh0W2tleV0gPSB1bm1hc2tlZENvbnRleHRba2V5XTtcbiAgICB9XG5cbiAgICB7XG4gICAgICB2YXIgbmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIod29ya0luUHJvZ3Jlc3MpIHx8ICdVbmtub3duJztcbiAgICAgIGNoZWNrUHJvcFR5cGVzKGNvbnRleHRUeXBlcywgY29udGV4dCwgJ2NvbnRleHQnLCBuYW1lKTtcbiAgICB9IC8vIENhY2hlIHVubWFza2VkIGNvbnRleHQgc28gd2UgY2FuIGF2b2lkIHJlY3JlYXRpbmcgbWFza2VkIGNvbnRleHQgdW5sZXNzIG5lY2Vzc2FyeS5cbiAgICAvLyBDb250ZXh0IGlzIGNyZWF0ZWQgYmVmb3JlIHRoZSBjbGFzcyBjb21wb25lbnQgaXMgaW5zdGFudGlhdGVkIHNvIGNoZWNrIGZvciBpbnN0YW5jZS5cblxuXG4gICAgaWYgKGluc3RhbmNlKSB7XG4gICAgICBjYWNoZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHVubWFza2VkQ29udGV4dCwgY29udGV4dCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnRleHQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFzQ29udGV4dENoYW5nZWQoKSB7XG4gIHtcbiAgICByZXR1cm4gZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvci5jdXJyZW50O1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzQ29udGV4dFByb3ZpZGVyKHR5cGUpIHtcbiAge1xuICAgIHZhciBjaGlsZENvbnRleHRUeXBlcyA9IHR5cGUuY2hpbGRDb250ZXh0VHlwZXM7XG4gICAgcmV0dXJuIGNoaWxkQ29udGV4dFR5cGVzICE9PSBudWxsICYmIGNoaWxkQ29udGV4dFR5cGVzICE9PSB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gcG9wQ29udGV4dChmaWJlcikge1xuICB7XG4gICAgcG9wKGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IsIGZpYmVyKTtcbiAgICBwb3AoY29udGV4dFN0YWNrQ3Vyc29yLCBmaWJlcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gcG9wVG9wTGV2ZWxDb250ZXh0T2JqZWN0KGZpYmVyKSB7XG4gIHtcbiAgICBwb3AoZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvciwgZmliZXIpO1xuICAgIHBvcChjb250ZXh0U3RhY2tDdXJzb3IsIGZpYmVyKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwdXNoVG9wTGV2ZWxDb250ZXh0T2JqZWN0KGZpYmVyLCBjb250ZXh0LCBkaWRDaGFuZ2UpIHtcbiAge1xuICAgIGlmIChjb250ZXh0U3RhY2tDdXJzb3IuY3VycmVudCAhPT0gZW1wdHlDb250ZXh0T2JqZWN0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgY29udGV4dCBmb3VuZCBvbiBzdGFjay4gJyArICdUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cblxuICAgIHB1c2goY29udGV4dFN0YWNrQ3Vyc29yLCBjb250ZXh0LCBmaWJlcik7XG4gICAgcHVzaChkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLCBkaWRDaGFuZ2UsIGZpYmVyKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcm9jZXNzQ2hpbGRDb250ZXh0KGZpYmVyLCB0eXBlLCBwYXJlbnRDb250ZXh0KSB7XG4gIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBmaWJlci5zdGF0ZU5vZGU7XG4gICAgdmFyIGNoaWxkQ29udGV4dFR5cGVzID0gdHlwZS5jaGlsZENvbnRleHRUeXBlczsgLy8gVE9ETyAoYnZhdWdobikgUmVwbGFjZSB0aGlzIGJlaGF2aW9yIHdpdGggYW4gaW52YXJpYW50KCkgaW4gdGhlIGZ1dHVyZS5cbiAgICAvLyBJdCBoYXMgb25seSBiZWVuIGFkZGVkIGluIEZpYmVyIHRvIG1hdGNoIHRoZSAodW5pbnRlbnRpb25hbCkgYmVoYXZpb3IgaW4gU3RhY2suXG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmdldENoaWxkQ29udGV4dCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAge1xuICAgICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdVbmtub3duJztcblxuICAgICAgICBpZiAoIXdhcm5lZEFib3V0TWlzc2luZ0dldENoaWxkQ29udGV4dFtjb21wb25lbnROYW1lXSkge1xuICAgICAgICAgIHdhcm5lZEFib3V0TWlzc2luZ0dldENoaWxkQ29udGV4dFtjb21wb25lbnROYW1lXSA9IHRydWU7XG5cbiAgICAgICAgICBlcnJvcignJXMuY2hpbGRDb250ZXh0VHlwZXMgaXMgc3BlY2lmaWVkIGJ1dCB0aGVyZSBpcyBubyBnZXRDaGlsZENvbnRleHQoKSBtZXRob2QgJyArICdvbiB0aGUgaW5zdGFuY2UuIFlvdSBjYW4gZWl0aGVyIGRlZmluZSBnZXRDaGlsZENvbnRleHQoKSBvbiAlcyBvciByZW1vdmUgJyArICdjaGlsZENvbnRleHRUeXBlcyBmcm9tIGl0LicsIGNvbXBvbmVudE5hbWUsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwYXJlbnRDb250ZXh0O1xuICAgIH1cblxuICAgIHZhciBjaGlsZENvbnRleHQgPSBpbnN0YW5jZS5nZXRDaGlsZENvbnRleHQoKTtcblxuICAgIGZvciAodmFyIGNvbnRleHRLZXkgaW4gY2hpbGRDb250ZXh0KSB7XG4gICAgICBpZiAoIShjb250ZXh0S2V5IGluIGNoaWxkQ29udGV4dFR5cGVzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdVbmtub3duJykgKyBcIi5nZXRDaGlsZENvbnRleHQoKToga2V5IFxcXCJcIiArIGNvbnRleHRLZXkgKyBcIlxcXCIgaXMgbm90IGRlZmluZWQgaW4gY2hpbGRDb250ZXh0VHlwZXMuXCIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHtcbiAgICAgIHZhciBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgJ1Vua25vd24nO1xuICAgICAgY2hlY2tQcm9wVHlwZXMoY2hpbGRDb250ZXh0VHlwZXMsIGNoaWxkQ29udGV4dCwgJ2NoaWxkIGNvbnRleHQnLCBuYW1lKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXNzaWduKHt9LCBwYXJlbnRDb250ZXh0LCBjaGlsZENvbnRleHQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHB1c2hDb250ZXh0UHJvdmlkZXIod29ya0luUHJvZ3Jlc3MpIHtcbiAge1xuICAgIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTsgLy8gV2UgcHVzaCB0aGUgY29udGV4dCBhcyBlYXJseSBhcyBwb3NzaWJsZSB0byBlbnN1cmUgc3RhY2sgaW50ZWdyaXR5LlxuICAgIC8vIElmIHRoZSBpbnN0YW5jZSBkb2VzIG5vdCBleGlzdCB5ZXQsIHdlIHdpbGwgcHVzaCBudWxsIGF0IGZpcnN0LFxuICAgIC8vIGFuZCByZXBsYWNlIGl0IG9uIHRoZSBzdGFjayBsYXRlciB3aGVuIGludmFsaWRhdGluZyB0aGUgY29udGV4dC5cblxuICAgIHZhciBtZW1vaXplZE1lcmdlZENoaWxkQ29udGV4dCA9IGluc3RhbmNlICYmIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWVyZ2VkQ2hpbGRDb250ZXh0IHx8IGVtcHR5Q29udGV4dE9iamVjdDsgLy8gUmVtZW1iZXIgdGhlIHBhcmVudCBjb250ZXh0IHNvIHdlIGNhbiBtZXJnZSB3aXRoIGl0IGxhdGVyLlxuICAgIC8vIEluaGVyaXQgdGhlIHBhcmVudCdzIGRpZC1wZXJmb3JtLXdvcmsgdmFsdWUgdG8gYXZvaWQgaW5hZHZlcnRlbnRseSBibG9ja2luZyB1cGRhdGVzLlxuXG4gICAgcHJldmlvdXNDb250ZXh0ID0gY29udGV4dFN0YWNrQ3Vyc29yLmN1cnJlbnQ7XG4gICAgcHVzaChjb250ZXh0U3RhY2tDdXJzb3IsIG1lbW9pemVkTWVyZ2VkQ2hpbGRDb250ZXh0LCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgcHVzaChkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLCBkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLmN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbnZhbGlkYXRlQ29udGV4dFByb3ZpZGVyKHdvcmtJblByb2dyZXNzLCB0eXBlLCBkaWRDaGFuZ2UpIHtcbiAge1xuICAgIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcblxuICAgIGlmICghaW5zdGFuY2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdG8gaGF2ZSBhbiBpbnN0YW5jZSBieSB0aGlzIHBvaW50LiAnICsgJ1RoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuXG4gICAgaWYgKGRpZENoYW5nZSkge1xuICAgICAgLy8gTWVyZ2UgcGFyZW50IGFuZCBvd24gY29udGV4dC5cbiAgICAgIC8vIFNraXAgdGhpcyBpZiB3ZSdyZSBub3QgdXBkYXRpbmcgZHVlIHRvIHNDVS5cbiAgICAgIC8vIFRoaXMgYXZvaWRzIHVubmVjZXNzYXJpbHkgcmVjb21wdXRpbmcgbWVtb2l6ZWQgdmFsdWVzLlxuICAgICAgdmFyIG1lcmdlZENvbnRleHQgPSBwcm9jZXNzQ2hpbGRDb250ZXh0KHdvcmtJblByb2dyZXNzLCB0eXBlLCBwcmV2aW91c0NvbnRleHQpO1xuICAgICAgaW5zdGFuY2UuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNZXJnZWRDaGlsZENvbnRleHQgPSBtZXJnZWRDb250ZXh0OyAvLyBSZXBsYWNlIHRoZSBvbGQgKG9yIGVtcHR5KSBjb250ZXh0IHdpdGggdGhlIG5ldyBvbmUuXG4gICAgICAvLyBJdCBpcyBpbXBvcnRhbnQgdG8gdW53aW5kIHRoZSBjb250ZXh0IGluIHRoZSByZXZlcnNlIG9yZGVyLlxuXG4gICAgICBwb3AoZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvciwgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgcG9wKGNvbnRleHRTdGFja0N1cnNvciwgd29ya0luUHJvZ3Jlc3MpOyAvLyBOb3cgcHVzaCB0aGUgbmV3IGNvbnRleHQgYW5kIG1hcmsgdGhhdCBpdCBoYXMgY2hhbmdlZC5cblxuICAgICAgcHVzaChjb250ZXh0U3RhY2tDdXJzb3IsIG1lcmdlZENvbnRleHQsIHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHB1c2goZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvciwgZGlkQ2hhbmdlLCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBvcChkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICBwdXNoKGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IsIGRpZENoYW5nZSwgd29ya0luUHJvZ3Jlc3MpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kQ3VycmVudFVubWFza2VkQ29udGV4dChmaWJlcikge1xuICB7XG4gICAgLy8gQ3VycmVudGx5IHRoaXMgaXMgb25seSB1c2VkIHdpdGggcmVuZGVyU3VidHJlZUludG9Db250YWluZXI7IG5vdCBzdXJlIGlmIGl0XG4gICAgLy8gbWFrZXMgc2Vuc2UgZWxzZXdoZXJlXG4gICAgaWYgKCFpc0ZpYmVyTW91bnRlZChmaWJlcikgfHwgZmliZXIudGFnICE9PSBDbGFzc0NvbXBvbmVudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBzdWJ0cmVlIHBhcmVudCB0byBiZSBhIG1vdW50ZWQgY2xhc3MgY29tcG9uZW50LiAnICsgJ1RoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuXG4gICAgdmFyIG5vZGUgPSBmaWJlcjtcblxuICAgIGRvIHtcbiAgICAgIHN3aXRjaCAobm9kZS50YWcpIHtcbiAgICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAgICByZXR1cm4gbm9kZS5zdGF0ZU5vZGUuY29udGV4dDtcblxuICAgICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBDb21wb25lbnQgPSBub2RlLnR5cGU7XG5cbiAgICAgICAgICAgIGlmIChpc0NvbnRleHRQcm92aWRlcihDb21wb25lbnQpKSB7XG4gICAgICAgICAgICAgIHJldHVybiBub2RlLnN0YXRlTm9kZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1lcmdlZENoaWxkQ29udGV4dDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgfSB3aGlsZSAobm9kZSAhPT0gbnVsbCk7XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZvdW5kIHVuZXhwZWN0ZWQgZGV0YWNoZWQgc3VidHJlZSBwYXJlbnQuICcgKyAnVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgfVxufVxuXG52YXIgTGVnYWN5Um9vdCA9IDA7XG52YXIgQ29uY3VycmVudFJvb3QgPSAxO1xuXG52YXIgTm9Nb2RlID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICovXG4wOyAvLyBUT0RPOiBSZW1vdmUgQ29uY3VycmVudE1vZGUgYnkgcmVhZGluZyBmcm9tIHRoZSByb290IHRhZyBpbnN0ZWFkXG5cbnZhciBDb25jdXJyZW50TW9kZSA9XG4vKiAgICAgICAgICAgICAgICAgKi9cbjE7XG52YXIgUHJvZmlsZU1vZGUgPVxuLyogICAgICAgICAgICAgICAgICAgICovXG4yO1xudmFyIFN0cmljdExlZ2FjeU1vZGUgPVxuLyogICAgICAgICAgICAgICAqL1xuODtcbnZhciBTdHJpY3RFZmZlY3RzTW9kZSA9XG4vKiAgICAgICAgICAgICAgKi9cbjE2O1xuXG4vLyBUT0RPOiBUaGlzIGlzIHByZXR0eSB3ZWxsIHN1cHBvcnRlZCBieSBicm93c2Vycy4gTWF5YmUgd2UgY2FuIGRyb3AgaXQuXG52YXIgY2x6MzIgPSBNYXRoLmNsejMyID8gTWF0aC5jbHozMiA6IGNsejMyRmFsbGJhY2s7IC8vIENvdW50IGxlYWRpbmcgemVyb3MuXG4vLyBCYXNlZCBvbjpcbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL01hdGgvY2x6MzJcblxudmFyIGxvZyA9IE1hdGgubG9nO1xudmFyIExOMiA9IE1hdGguTE4yO1xuXG5mdW5jdGlvbiBjbHozMkZhbGxiYWNrKHgpIHtcbiAgdmFyIGFzVWludCA9IHggPj4+IDA7XG5cbiAgaWYgKGFzVWludCA9PT0gMCkge1xuICAgIHJldHVybiAzMjtcbiAgfVxuXG4gIHJldHVybiAzMSAtIChsb2coYXNVaW50KSAvIExOMiB8IDApIHwgMDtcbn1cblxuLy8gSWYgdGhvc2UgdmFsdWVzIGFyZSBjaGFuZ2VkIHRoYXQgcGFja2FnZSBzaG91bGQgYmUgcmVidWlsdCBhbmQgcmVkZXBsb3llZC5cblxudmFyIFRvdGFsTGFuZXMgPSAzMTtcbnZhciBOb0xhbmVzID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjA7XG52YXIgTm9MYW5lID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuMDtcbnZhciBTeW5jTGFuZSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG4xO1xudmFyIElucHV0Q29udGludW91c0h5ZHJhdGlvbkxhbmUgPVxuLyogICAgKi9cbjI7XG52YXIgSW5wdXRDb250aW51b3VzTGFuZSA9XG4vKiAgICAgICAgICAgICAqL1xuNDtcbnZhciBEZWZhdWx0SHlkcmF0aW9uTGFuZSA9XG4vKiAgICAgICAgICAgICovXG44O1xudmFyIERlZmF1bHRMYW5lID1cbi8qICAgICAgICAgICAgICAgICAgICAgKi9cbjE2O1xudmFyIFRyYW5zaXRpb25IeWRyYXRpb25MYW5lID1cbi8qICAgICAgICAgICAgICAgICovXG4zMjtcbnZhciBUcmFuc2l0aW9uTGFuZXMgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICovXG40MTk0MjQwO1xudmFyIFRyYW5zaXRpb25MYW5lMSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG42NDtcbnZhciBUcmFuc2l0aW9uTGFuZTIgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuMTI4O1xudmFyIFRyYW5zaXRpb25MYW5lMyA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG4yNTY7XG52YXIgVHJhbnNpdGlvbkxhbmU0ID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjUxMjtcbnZhciBUcmFuc2l0aW9uTGFuZTUgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuMTAyNDtcbnZhciBUcmFuc2l0aW9uTGFuZTYgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuMjA0ODtcbnZhciBUcmFuc2l0aW9uTGFuZTcgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuNDA5NjtcbnZhciBUcmFuc2l0aW9uTGFuZTggPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuODE5MjtcbnZhciBUcmFuc2l0aW9uTGFuZTkgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuMTYzODQ7XG52YXIgVHJhbnNpdGlvbkxhbmUxMCA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbjMyNzY4O1xudmFyIFRyYW5zaXRpb25MYW5lMTEgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICovXG42NTUzNjtcbnZhciBUcmFuc2l0aW9uTGFuZTEyID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuMTMxMDcyO1xudmFyIFRyYW5zaXRpb25MYW5lMTMgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICovXG4yNjIxNDQ7XG52YXIgVHJhbnNpdGlvbkxhbmUxNCA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbjUyNDI4ODtcbnZhciBUcmFuc2l0aW9uTGFuZTE1ID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuMTA0ODU3NjtcbnZhciBUcmFuc2l0aW9uTGFuZTE2ID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuMjA5NzE1MjtcbnZhciBSZXRyeUxhbmVzID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4xMzAwMjM0MjQ7XG52YXIgUmV0cnlMYW5lMSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjQxOTQzMDQ7XG52YXIgUmV0cnlMYW5lMiA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjgzODg2MDg7XG52YXIgUmV0cnlMYW5lMyA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjE2Nzc3MjE2O1xudmFyIFJldHJ5TGFuZTQgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4zMzU1NDQzMjtcbnZhciBSZXRyeUxhbmU1ID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuNjcxMDg4NjQ7XG52YXIgU29tZVJldHJ5TGFuZSA9IFJldHJ5TGFuZTE7XG52YXIgU2VsZWN0aXZlSHlkcmF0aW9uTGFuZSA9XG4vKiAgICAgICAgICAqL1xuMTM0MjE3NzI4O1xudmFyIE5vbklkbGVMYW5lcyA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjI2ODQzNTQ1NTtcbnZhciBJZGxlSHlkcmF0aW9uTGFuZSA9XG4vKiAgICAgICAgICAgICAgICovXG4yNjg0MzU0NTY7XG52YXIgSWRsZUxhbmUgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuNTM2ODcwOTEyO1xudmFyIE9mZnNjcmVlbkxhbmUgPVxuLyogICAgICAgICAgICAgICAgICAgKi9cbjEwNzM3NDE4MjQ7IC8vIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3IgdGhlIGV4cGVyaW1lbnRhbCB0aW1lbGluZSAocmVhY3QtZGV2dG9vbHMtdGltZWxpbmUpXG4vLyBJdCBzaG91bGQgYmUga2VwdCBpbiBzeW5jIHdpdGggdGhlIExhbmVzIHZhbHVlcyBhYm92ZS5cblxuZnVuY3Rpb24gZ2V0TGFiZWxGb3JMYW5lKGxhbmUpIHtcbiAge1xuICAgIGlmIChsYW5lICYgU3luY0xhbmUpIHtcbiAgICAgIHJldHVybiAnU3luYyc7XG4gICAgfVxuXG4gICAgaWYgKGxhbmUgJiBJbnB1dENvbnRpbnVvdXNIeWRyYXRpb25MYW5lKSB7XG4gICAgICByZXR1cm4gJ0lucHV0Q29udGludW91c0h5ZHJhdGlvbic7XG4gICAgfVxuXG4gICAgaWYgKGxhbmUgJiBJbnB1dENvbnRpbnVvdXNMYW5lKSB7XG4gICAgICByZXR1cm4gJ0lucHV0Q29udGludW91cyc7XG4gICAgfVxuXG4gICAgaWYgKGxhbmUgJiBEZWZhdWx0SHlkcmF0aW9uTGFuZSkge1xuICAgICAgcmV0dXJuICdEZWZhdWx0SHlkcmF0aW9uJztcbiAgICB9XG5cbiAgICBpZiAobGFuZSAmIERlZmF1bHRMYW5lKSB7XG4gICAgICByZXR1cm4gJ0RlZmF1bHQnO1xuICAgIH1cblxuICAgIGlmIChsYW5lICYgVHJhbnNpdGlvbkh5ZHJhdGlvbkxhbmUpIHtcbiAgICAgIHJldHVybiAnVHJhbnNpdGlvbkh5ZHJhdGlvbic7XG4gICAgfVxuXG4gICAgaWYgKGxhbmUgJiBUcmFuc2l0aW9uTGFuZXMpIHtcbiAgICAgIHJldHVybiAnVHJhbnNpdGlvbic7XG4gICAgfVxuXG4gICAgaWYgKGxhbmUgJiBSZXRyeUxhbmVzKSB7XG4gICAgICByZXR1cm4gJ1JldHJ5JztcbiAgICB9XG5cbiAgICBpZiAobGFuZSAmIFNlbGVjdGl2ZUh5ZHJhdGlvbkxhbmUpIHtcbiAgICAgIHJldHVybiAnU2VsZWN0aXZlSHlkcmF0aW9uJztcbiAgICB9XG5cbiAgICBpZiAobGFuZSAmIElkbGVIeWRyYXRpb25MYW5lKSB7XG4gICAgICByZXR1cm4gJ0lkbGVIeWRyYXRpb24nO1xuICAgIH1cblxuICAgIGlmIChsYW5lICYgSWRsZUxhbmUpIHtcbiAgICAgIHJldHVybiAnSWRsZSc7XG4gICAgfVxuXG4gICAgaWYgKGxhbmUgJiBPZmZzY3JlZW5MYW5lKSB7XG4gICAgICByZXR1cm4gJ09mZnNjcmVlbic7XG4gICAgfVxuICB9XG59XG52YXIgTm9UaW1lc3RhbXAgPSAtMTtcbnZhciBuZXh0VHJhbnNpdGlvbkxhbmUgPSBUcmFuc2l0aW9uTGFuZTE7XG52YXIgbmV4dFJldHJ5TGFuZSA9IFJldHJ5TGFuZTE7XG5cbmZ1bmN0aW9uIGdldEhpZ2hlc3RQcmlvcml0eUxhbmVzKGxhbmVzKSB7XG4gIHN3aXRjaCAoZ2V0SGlnaGVzdFByaW9yaXR5TGFuZShsYW5lcykpIHtcbiAgICBjYXNlIFN5bmNMYW5lOlxuICAgICAgcmV0dXJuIFN5bmNMYW5lO1xuXG4gICAgY2FzZSBJbnB1dENvbnRpbnVvdXNIeWRyYXRpb25MYW5lOlxuICAgICAgcmV0dXJuIElucHV0Q29udGludW91c0h5ZHJhdGlvbkxhbmU7XG5cbiAgICBjYXNlIElucHV0Q29udGludW91c0xhbmU6XG4gICAgICByZXR1cm4gSW5wdXRDb250aW51b3VzTGFuZTtcblxuICAgIGNhc2UgRGVmYXVsdEh5ZHJhdGlvbkxhbmU6XG4gICAgICByZXR1cm4gRGVmYXVsdEh5ZHJhdGlvbkxhbmU7XG5cbiAgICBjYXNlIERlZmF1bHRMYW5lOlxuICAgICAgcmV0dXJuIERlZmF1bHRMYW5lO1xuXG4gICAgY2FzZSBUcmFuc2l0aW9uSHlkcmF0aW9uTGFuZTpcbiAgICAgIHJldHVybiBUcmFuc2l0aW9uSHlkcmF0aW9uTGFuZTtcblxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUyOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUzOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU0OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU1OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU2OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU3OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU4OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU5OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxMDpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTE6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTEyOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxMzpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTQ6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTE1OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxNjpcbiAgICAgIHJldHVybiBsYW5lcyAmIFRyYW5zaXRpb25MYW5lcztcblxuICAgIGNhc2UgUmV0cnlMYW5lMTpcbiAgICBjYXNlIFJldHJ5TGFuZTI6XG4gICAgY2FzZSBSZXRyeUxhbmUzOlxuICAgIGNhc2UgUmV0cnlMYW5lNDpcbiAgICBjYXNlIFJldHJ5TGFuZTU6XG4gICAgICByZXR1cm4gbGFuZXMgJiBSZXRyeUxhbmVzO1xuXG4gICAgY2FzZSBTZWxlY3RpdmVIeWRyYXRpb25MYW5lOlxuICAgICAgcmV0dXJuIFNlbGVjdGl2ZUh5ZHJhdGlvbkxhbmU7XG5cbiAgICBjYXNlIElkbGVIeWRyYXRpb25MYW5lOlxuICAgICAgcmV0dXJuIElkbGVIeWRyYXRpb25MYW5lO1xuXG4gICAgY2FzZSBJZGxlTGFuZTpcbiAgICAgIHJldHVybiBJZGxlTGFuZTtcblxuICAgIGNhc2UgT2Zmc2NyZWVuTGFuZTpcbiAgICAgIHJldHVybiBPZmZzY3JlZW5MYW5lO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHtcbiAgICAgICAgZXJyb3IoJ1Nob3VsZCBoYXZlIGZvdW5kIG1hdGNoaW5nIGxhbmVzLiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LicpO1xuICAgICAgfSAvLyBUaGlzIHNob3VsZG4ndCBiZSByZWFjaGFibGUsIGJ1dCBhcyBhIGZhbGxiYWNrLCByZXR1cm4gdGhlIGVudGlyZSBiaXRtYXNrLlxuXG5cbiAgICAgIHJldHVybiBsYW5lcztcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXROZXh0TGFuZXMocm9vdCwgd2lwTGFuZXMpIHtcbiAgLy8gRWFybHkgYmFpbG91dCBpZiB0aGVyZSdzIG5vIHBlbmRpbmcgd29yayBsZWZ0LlxuICB2YXIgcGVuZGluZ0xhbmVzID0gcm9vdC5wZW5kaW5nTGFuZXM7XG5cbiAgaWYgKHBlbmRpbmdMYW5lcyA9PT0gTm9MYW5lcykge1xuICAgIHJldHVybiBOb0xhbmVzO1xuICB9XG5cbiAgdmFyIG5leHRMYW5lcyA9IE5vTGFuZXM7XG4gIHZhciBzdXNwZW5kZWRMYW5lcyA9IHJvb3Quc3VzcGVuZGVkTGFuZXM7XG4gIHZhciBwaW5nZWRMYW5lcyA9IHJvb3QucGluZ2VkTGFuZXM7IC8vIERvIG5vdCB3b3JrIG9uIGFueSBpZGxlIHdvcmsgdW50aWwgYWxsIHRoZSBub24taWRsZSB3b3JrIGhhcyBmaW5pc2hlZCxcbiAgLy8gZXZlbiBpZiB0aGUgd29yayBpcyBzdXNwZW5kZWQuXG5cbiAgdmFyIG5vbklkbGVQZW5kaW5nTGFuZXMgPSBwZW5kaW5nTGFuZXMgJiBOb25JZGxlTGFuZXM7XG5cbiAgaWYgKG5vbklkbGVQZW5kaW5nTGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICB2YXIgbm9uSWRsZVVuYmxvY2tlZExhbmVzID0gbm9uSWRsZVBlbmRpbmdMYW5lcyAmIH5zdXNwZW5kZWRMYW5lcztcblxuICAgIGlmIChub25JZGxlVW5ibG9ja2VkTGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICAgIG5leHRMYW5lcyA9IGdldEhpZ2hlc3RQcmlvcml0eUxhbmVzKG5vbklkbGVVbmJsb2NrZWRMYW5lcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBub25JZGxlUGluZ2VkTGFuZXMgPSBub25JZGxlUGVuZGluZ0xhbmVzICYgcGluZ2VkTGFuZXM7XG5cbiAgICAgIGlmIChub25JZGxlUGluZ2VkTGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICAgICAgbmV4dExhbmVzID0gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZXMobm9uSWRsZVBpbmdlZExhbmVzKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gVGhlIG9ubHkgcmVtYWluaW5nIHdvcmsgaXMgSWRsZS5cbiAgICB2YXIgdW5ibG9ja2VkTGFuZXMgPSBwZW5kaW5nTGFuZXMgJiB+c3VzcGVuZGVkTGFuZXM7XG5cbiAgICBpZiAodW5ibG9ja2VkTGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICAgIG5leHRMYW5lcyA9IGdldEhpZ2hlc3RQcmlvcml0eUxhbmVzKHVuYmxvY2tlZExhbmVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHBpbmdlZExhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgICAgIG5leHRMYW5lcyA9IGdldEhpZ2hlc3RQcmlvcml0eUxhbmVzKHBpbmdlZExhbmVzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAobmV4dExhbmVzID09PSBOb0xhbmVzKSB7XG4gICAgLy8gVGhpcyBzaG91bGQgb25seSBiZSByZWFjaGFibGUgaWYgd2UncmUgc3VzcGVuZGVkXG4gICAgLy8gVE9ETzogQ29uc2lkZXIgd2FybmluZyBpbiB0aGlzIHBhdGggaWYgYSBmYWxsYmFjayB0aW1lciBpcyBub3Qgc2NoZWR1bGVkLlxuICAgIHJldHVybiBOb0xhbmVzO1xuICB9IC8vIElmIHdlJ3JlIGFscmVhZHkgaW4gdGhlIG1pZGRsZSBvZiBhIHJlbmRlciwgc3dpdGNoaW5nIGxhbmVzIHdpbGwgaW50ZXJydXB0XG4gIC8vIGl0IGFuZCB3ZSdsbCBsb3NlIG91ciBwcm9ncmVzcy4gV2Ugc2hvdWxkIG9ubHkgZG8gdGhpcyBpZiB0aGUgbmV3IGxhbmVzIGFyZVxuICAvLyBoaWdoZXIgcHJpb3JpdHkuXG5cblxuICBpZiAod2lwTGFuZXMgIT09IE5vTGFuZXMgJiYgd2lwTGFuZXMgIT09IG5leHRMYW5lcyAmJiAvLyBJZiB3ZSBhbHJlYWR5IHN1c3BlbmRlZCB3aXRoIGEgZGVsYXksIHRoZW4gaW50ZXJydXB0aW5nIGlzIGZpbmUuIERvbid0XG4gIC8vIGJvdGhlciB3YWl0aW5nIHVudGlsIHRoZSByb290IGlzIGNvbXBsZXRlLlxuICAod2lwTGFuZXMgJiBzdXNwZW5kZWRMYW5lcykgPT09IE5vTGFuZXMpIHtcbiAgICB2YXIgbmV4dExhbmUgPSBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lKG5leHRMYW5lcyk7XG4gICAgdmFyIHdpcExhbmUgPSBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lKHdpcExhbmVzKTtcblxuICAgIGlmICggLy8gVGVzdHMgd2hldGhlciB0aGUgbmV4dCBsYW5lIGlzIGVxdWFsIG9yIGxvd2VyIHByaW9yaXR5IHRoYW4gdGhlIHdpcFxuICAgIC8vIG9uZS4gVGhpcyB3b3JrcyBiZWNhdXNlIHRoZSBiaXRzIGRlY3JlYXNlIGluIHByaW9yaXR5IGFzIHlvdSBnbyBsZWZ0LlxuICAgIG5leHRMYW5lID49IHdpcExhbmUgfHwgLy8gRGVmYXVsdCBwcmlvcml0eSB1cGRhdGVzIHNob3VsZCBub3QgaW50ZXJydXB0IHRyYW5zaXRpb24gdXBkYXRlcy4gVGhlXG4gICAgLy8gb25seSBkaWZmZXJlbmNlIGJldHdlZW4gZGVmYXVsdCB1cGRhdGVzIGFuZCB0cmFuc2l0aW9uIHVwZGF0ZXMgaXMgdGhhdFxuICAgIC8vIGRlZmF1bHQgdXBkYXRlcyBkbyBub3Qgc3VwcG9ydCByZWZyZXNoIHRyYW5zaXRpb25zLlxuICAgIG5leHRMYW5lID09PSBEZWZhdWx0TGFuZSAmJiAod2lwTGFuZSAmIFRyYW5zaXRpb25MYW5lcykgIT09IE5vTGFuZXMpIHtcbiAgICAgIC8vIEtlZXAgd29ya2luZyBvbiB0aGUgZXhpc3RpbmcgaW4tcHJvZ3Jlc3MgdHJlZS4gRG8gbm90IGludGVycnVwdC5cbiAgICAgIHJldHVybiB3aXBMYW5lcztcbiAgICB9XG4gIH1cblxuICBpZiAoKG5leHRMYW5lcyAmIElucHV0Q29udGludW91c0xhbmUpICE9PSBOb0xhbmVzKSB7XG4gICAgLy8gV2hlbiB1cGRhdGVzIGFyZSBzeW5jIGJ5IGRlZmF1bHQsIHdlIGVudGFuZ2xlIGNvbnRpbnVvdXMgcHJpb3JpdHkgdXBkYXRlc1xuICAgIC8vIGFuZCBkZWZhdWx0IHVwZGF0ZXMsIHNvIHRoZXkgcmVuZGVyIGluIHRoZSBzYW1lIGJhdGNoLiBUaGUgb25seSByZWFzb25cbiAgICAvLyB0aGV5IHVzZSBzZXBhcmF0ZSBsYW5lcyBpcyBiZWNhdXNlIGNvbnRpbnVvdXMgdXBkYXRlcyBzaG91bGQgaW50ZXJydXB0XG4gICAgLy8gdHJhbnNpdGlvbnMsIGJ1dCBkZWZhdWx0IHVwZGF0ZXMgc2hvdWxkIG5vdC5cbiAgICBuZXh0TGFuZXMgfD0gcGVuZGluZ0xhbmVzICYgRGVmYXVsdExhbmU7XG4gIH0gLy8gQ2hlY2sgZm9yIGVudGFuZ2xlZCBsYW5lcyBhbmQgYWRkIHRoZW0gdG8gdGhlIGJhdGNoLlxuICAvL1xuICAvLyBBIGxhbmUgaXMgc2FpZCB0byBiZSBlbnRhbmdsZWQgd2l0aCBhbm90aGVyIHdoZW4gaXQncyBub3QgYWxsb3dlZCB0byByZW5kZXJcbiAgLy8gaW4gYSBiYXRjaCB0aGF0IGRvZXMgbm90IGFsc28gaW5jbHVkZSB0aGUgb3RoZXIgbGFuZS4gVHlwaWNhbGx5IHdlIGRvIHRoaXNcbiAgLy8gd2hlbiBtdWx0aXBsZSB1cGRhdGVzIGhhdmUgdGhlIHNhbWUgc291cmNlLCBhbmQgd2Ugb25seSB3YW50IHRvIHJlc3BvbmQgdG9cbiAgLy8gdGhlIG1vc3QgcmVjZW50IGV2ZW50IGZyb20gdGhhdCBzb3VyY2UuXG4gIC8vXG4gIC8vIE5vdGUgdGhhdCB3ZSBhcHBseSBlbnRhbmdsZW1lbnRzICphZnRlciogY2hlY2tpbmcgZm9yIHBhcnRpYWwgd29yayBhYm92ZS5cbiAgLy8gVGhpcyBtZWFucyB0aGF0IGlmIGEgbGFuZSBpcyBlbnRhbmdsZWQgZHVyaW5nIGFuIGludGVybGVhdmVkIGV2ZW50IHdoaWxlXG4gIC8vIGl0J3MgYWxyZWFkeSByZW5kZXJpbmcsIHdlIHdvbid0IGludGVycnVwdCBpdC4gVGhpcyBpcyBpbnRlbnRpb25hbCwgc2luY2VcbiAgLy8gZW50YW5nbGVtZW50IGlzIHVzdWFsbHkgXCJiZXN0IGVmZm9ydFwiOiB3ZSdsbCB0cnkgb3VyIGJlc3QgdG8gcmVuZGVyIHRoZVxuICAvLyBsYW5lcyBpbiB0aGUgc2FtZSBiYXRjaCwgYnV0IGl0J3Mgbm90IHdvcnRoIHRocm93aW5nIG91dCBwYXJ0aWFsbHlcbiAgLy8gY29tcGxldGVkIHdvcmsgaW4gb3JkZXIgdG8gZG8gaXQuXG4gIC8vIFRPRE86IFJlY29uc2lkZXIgdGhpcy4gVGhlIGNvdW50ZXItYXJndW1lbnQgaXMgdGhhdCB0aGUgcGFydGlhbCB3b3JrXG4gIC8vIHJlcHJlc2VudHMgYW4gaW50ZXJtZWRpYXRlIHN0YXRlLCB3aGljaCB3ZSBkb24ndCB3YW50IHRvIHNob3cgdG8gdGhlIHVzZXIuXG4gIC8vIEFuZCBieSBzcGVuZGluZyBleHRyYSB0aW1lIGZpbmlzaGluZyBpdCwgd2UncmUgaW5jcmVhc2luZyB0aGUgYW1vdW50IG9mXG4gIC8vIHRpbWUgaXQgdGFrZXMgdG8gc2hvdyB0aGUgZmluYWwgc3RhdGUsIHdoaWNoIGlzIHdoYXQgdGhleSBhcmUgYWN0dWFsbHlcbiAgLy8gd2FpdGluZyBmb3IuXG4gIC8vXG4gIC8vIEZvciB0aG9zZSBleGNlcHRpb25zIHdoZXJlIGVudGFuZ2xlbWVudCBpcyBzZW1hbnRpY2FsbHkgaW1wb3J0YW50LCBsaWtlXG4gIC8vIHVzZU11dGFibGVTb3VyY2UsIHdlIHNob3VsZCBlbnN1cmUgdGhhdCB0aGVyZSBpcyBubyBwYXJ0aWFsIHdvcmsgYXQgdGhlXG4gIC8vIHRpbWUgd2UgYXBwbHkgdGhlIGVudGFuZ2xlbWVudC5cblxuXG4gIHZhciBlbnRhbmdsZWRMYW5lcyA9IHJvb3QuZW50YW5nbGVkTGFuZXM7XG5cbiAgaWYgKGVudGFuZ2xlZExhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgdmFyIGVudGFuZ2xlbWVudHMgPSByb290LmVudGFuZ2xlbWVudHM7XG4gICAgdmFyIGxhbmVzID0gbmV4dExhbmVzICYgZW50YW5nbGVkTGFuZXM7XG5cbiAgICB3aGlsZSAobGFuZXMgPiAwKSB7XG4gICAgICB2YXIgaW5kZXggPSBwaWNrQXJiaXRyYXJ5TGFuZUluZGV4KGxhbmVzKTtcbiAgICAgIHZhciBsYW5lID0gMSA8PCBpbmRleDtcbiAgICAgIG5leHRMYW5lcyB8PSBlbnRhbmdsZW1lbnRzW2luZGV4XTtcbiAgICAgIGxhbmVzICY9IH5sYW5lO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXh0TGFuZXM7XG59XG5mdW5jdGlvbiBnZXRNb3N0UmVjZW50RXZlbnRUaW1lKHJvb3QsIGxhbmVzKSB7XG4gIHZhciBldmVudFRpbWVzID0gcm9vdC5ldmVudFRpbWVzO1xuICB2YXIgbW9zdFJlY2VudEV2ZW50VGltZSA9IE5vVGltZXN0YW1wO1xuXG4gIHdoaWxlIChsYW5lcyA+IDApIHtcbiAgICB2YXIgaW5kZXggPSBwaWNrQXJiaXRyYXJ5TGFuZUluZGV4KGxhbmVzKTtcbiAgICB2YXIgbGFuZSA9IDEgPDwgaW5kZXg7XG4gICAgdmFyIGV2ZW50VGltZSA9IGV2ZW50VGltZXNbaW5kZXhdO1xuXG4gICAgaWYgKGV2ZW50VGltZSA+IG1vc3RSZWNlbnRFdmVudFRpbWUpIHtcbiAgICAgIG1vc3RSZWNlbnRFdmVudFRpbWUgPSBldmVudFRpbWU7XG4gICAgfVxuXG4gICAgbGFuZXMgJj0gfmxhbmU7XG4gIH1cblxuICByZXR1cm4gbW9zdFJlY2VudEV2ZW50VGltZTtcbn1cblxuZnVuY3Rpb24gY29tcHV0ZUV4cGlyYXRpb25UaW1lKGxhbmUsIGN1cnJlbnRUaW1lKSB7XG4gIHN3aXRjaCAobGFuZSkge1xuICAgIGNhc2UgU3luY0xhbmU6XG4gICAgY2FzZSBJbnB1dENvbnRpbnVvdXNIeWRyYXRpb25MYW5lOlxuICAgIGNhc2UgSW5wdXRDb250aW51b3VzTGFuZTpcbiAgICAgIC8vIFVzZXIgaW50ZXJhY3Rpb25zIHNob3VsZCBleHBpcmUgc2xpZ2h0bHkgbW9yZSBxdWlja2x5LlxuICAgICAgLy9cbiAgICAgIC8vIE5PVEU6IFRoaXMgaXMgc2V0IHRvIHRoZSBjb3JyZXNwb25kaW5nIGNvbnN0YW50IGFzIGluIFNjaGVkdWxlci5qcy5cbiAgICAgIC8vIFdoZW4gd2UgbWFkZSBpdCBsYXJnZXIsIGEgcHJvZHVjdCBtZXRyaWMgaW4gd3d3IHJlZ3Jlc3NlZCwgc3VnZ2VzdGluZ1xuICAgICAgLy8gdGhlcmUncyBhIHVzZXIgaW50ZXJhY3Rpb24gdGhhdCdzIGJlaW5nIHN0YXJ2ZWQgYnkgYSBzZXJpZXMgb2ZcbiAgICAgIC8vIHN5bmNocm9ub3VzIHVwZGF0ZXMuIElmIHRoYXQgdGhlb3J5IGlzIGNvcnJlY3QsIHRoZSBwcm9wZXIgc29sdXRpb24gaXNcbiAgICAgIC8vIHRvIGZpeCB0aGUgc3RhcnZhdGlvbi4gSG93ZXZlciwgdGhpcyBzY2VuYXJpbyBzdXBwb3J0cyB0aGUgaWRlYSB0aGF0XG4gICAgICAvLyBleHBpcmF0aW9uIHRpbWVzIGFyZSBhbiBpbXBvcnRhbnQgc2FmZWd1YXJkIHdoZW4gc3RhcnZhdGlvblxuICAgICAgLy8gZG9lcyBoYXBwZW4uXG4gICAgICByZXR1cm4gY3VycmVudFRpbWUgKyAyNTA7XG5cbiAgICBjYXNlIERlZmF1bHRIeWRyYXRpb25MYW5lOlxuICAgIGNhc2UgRGVmYXVsdExhbmU6XG4gICAgY2FzZSBUcmFuc2l0aW9uSHlkcmF0aW9uTGFuZTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMjpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMzpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lNDpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lNTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lNjpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lNzpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lODpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lOTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTA6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTExOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxMjpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTM6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTE0OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxNTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTY6XG4gICAgICByZXR1cm4gY3VycmVudFRpbWUgKyA1MDAwO1xuXG4gICAgY2FzZSBSZXRyeUxhbmUxOlxuICAgIGNhc2UgUmV0cnlMYW5lMjpcbiAgICBjYXNlIFJldHJ5TGFuZTM6XG4gICAgY2FzZSBSZXRyeUxhbmU0OlxuICAgIGNhc2UgUmV0cnlMYW5lNTpcbiAgICAgIC8vIFRPRE86IFJldHJpZXMgc2hvdWxkIGJlIGFsbG93ZWQgdG8gZXhwaXJlIGlmIHRoZXkgYXJlIENQVSBib3VuZCBmb3JcbiAgICAgIC8vIHRvbyBsb25nLCBidXQgd2hlbiBJIG1hZGUgdGhpcyBjaGFuZ2UgaXQgY2F1c2VkIGEgc3Bpa2UgaW4gYnJvd3NlclxuICAgICAgLy8gY3Jhc2hlcy4gVGhlcmUgbXVzdCBiZSBzb21lIG90aGVyIHVuZGVybHlpbmcgYnVnOyBub3Qgc3VwZXIgdXJnZW50IGJ1dFxuICAgICAgLy8gaWRlYWxseSBzaG91bGQgZmlndXJlIG91dCB3aHkgYW5kIGZpeCBpdC4gVW5mb3J0dW5hdGVseSB3ZSBkb24ndCBoYXZlXG4gICAgICAvLyBhIHJlcHJvIGZvciB0aGUgY3Jhc2hlcywgb25seSBkZXRlY3RlZCB2aWEgcHJvZHVjdGlvbiBtZXRyaWNzLlxuICAgICAgcmV0dXJuIE5vVGltZXN0YW1wO1xuXG4gICAgY2FzZSBTZWxlY3RpdmVIeWRyYXRpb25MYW5lOlxuICAgIGNhc2UgSWRsZUh5ZHJhdGlvbkxhbmU6XG4gICAgY2FzZSBJZGxlTGFuZTpcbiAgICBjYXNlIE9mZnNjcmVlbkxhbmU6XG4gICAgICAvLyBBbnl0aGluZyBpZGxlIHByaW9yaXR5IG9yIGxvd2VyIHNob3VsZCBuZXZlciBleHBpcmUuXG4gICAgICByZXR1cm4gTm9UaW1lc3RhbXA7XG5cbiAgICBkZWZhdWx0OlxuICAgICAge1xuICAgICAgICBlcnJvcignU2hvdWxkIGhhdmUgZm91bmQgbWF0Y2hpbmcgbGFuZXMuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBOb1RpbWVzdGFtcDtcbiAgfVxufVxuXG5mdW5jdGlvbiBtYXJrU3RhcnZlZExhbmVzQXNFeHBpcmVkKHJvb3QsIGN1cnJlbnRUaW1lKSB7XG4gIC8vIFRPRE86IFRoaXMgZ2V0cyBjYWxsZWQgZXZlcnkgdGltZSB3ZSB5aWVsZC4gV2UgY2FuIG9wdGltaXplIGJ5IHN0b3JpbmdcbiAgLy8gdGhlIGVhcmxpZXN0IGV4cGlyYXRpb24gdGltZSBvbiB0aGUgcm9vdC4gVGhlbiB1c2UgdGhhdCB0byBxdWlja2x5IGJhaWwgb3V0XG4gIC8vIG9mIHRoaXMgZnVuY3Rpb24uXG4gIHZhciBwZW5kaW5nTGFuZXMgPSByb290LnBlbmRpbmdMYW5lcztcbiAgdmFyIHN1c3BlbmRlZExhbmVzID0gcm9vdC5zdXNwZW5kZWRMYW5lcztcbiAgdmFyIHBpbmdlZExhbmVzID0gcm9vdC5waW5nZWRMYW5lcztcbiAgdmFyIGV4cGlyYXRpb25UaW1lcyA9IHJvb3QuZXhwaXJhdGlvblRpbWVzOyAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIHBlbmRpbmcgbGFuZXMgYW5kIGNoZWNrIGlmIHdlJ3ZlIHJlYWNoZWQgdGhlaXJcbiAgLy8gZXhwaXJhdGlvbiB0aW1lLiBJZiBzbywgd2UnbGwgYXNzdW1lIHRoZSB1cGRhdGUgaXMgYmVpbmcgc3RhcnZlZCBhbmQgbWFya1xuICAvLyBpdCBhcyBleHBpcmVkIHRvIGZvcmNlIGl0IHRvIGZpbmlzaC5cblxuICB2YXIgbGFuZXMgPSBwZW5kaW5nTGFuZXM7XG5cbiAgd2hpbGUgKGxhbmVzID4gMCkge1xuICAgIHZhciBpbmRleCA9IHBpY2tBcmJpdHJhcnlMYW5lSW5kZXgobGFuZXMpO1xuICAgIHZhciBsYW5lID0gMSA8PCBpbmRleDtcbiAgICB2YXIgZXhwaXJhdGlvblRpbWUgPSBleHBpcmF0aW9uVGltZXNbaW5kZXhdO1xuXG4gICAgaWYgKGV4cGlyYXRpb25UaW1lID09PSBOb1RpbWVzdGFtcCkge1xuICAgICAgLy8gRm91bmQgYSBwZW5kaW5nIGxhbmUgd2l0aCBubyBleHBpcmF0aW9uIHRpbWUuIElmIGl0J3Mgbm90IHN1c3BlbmRlZCwgb3JcbiAgICAgIC8vIGlmIGl0J3MgcGluZ2VkLCBhc3N1bWUgaXQncyBDUFUtYm91bmQuIENvbXB1dGUgYSBuZXcgZXhwaXJhdGlvbiB0aW1lXG4gICAgICAvLyB1c2luZyB0aGUgY3VycmVudCB0aW1lLlxuICAgICAgaWYgKChsYW5lICYgc3VzcGVuZGVkTGFuZXMpID09PSBOb0xhbmVzIHx8IChsYW5lICYgcGluZ2VkTGFuZXMpICE9PSBOb0xhbmVzKSB7XG4gICAgICAgIC8vIEFzc3VtZXMgdGltZXN0YW1wcyBhcmUgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nLlxuICAgICAgICBleHBpcmF0aW9uVGltZXNbaW5kZXhdID0gY29tcHV0ZUV4cGlyYXRpb25UaW1lKGxhbmUsIGN1cnJlbnRUaW1lKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGV4cGlyYXRpb25UaW1lIDw9IGN1cnJlbnRUaW1lKSB7XG4gICAgICAvLyBUaGlzIGxhbmUgZXhwaXJlZFxuICAgICAgcm9vdC5leHBpcmVkTGFuZXMgfD0gbGFuZTtcbiAgICB9XG5cbiAgICBsYW5lcyAmPSB+bGFuZTtcbiAgfVxufSAvLyBUaGlzIHJldHVybnMgdGhlIGhpZ2hlc3QgcHJpb3JpdHkgcGVuZGluZyBsYW5lcyByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhleVxuLy8gYXJlIHN1c3BlbmRlZC5cblxuZnVuY3Rpb24gZ2V0SGlnaGVzdFByaW9yaXR5UGVuZGluZ0xhbmVzKHJvb3QpIHtcbiAgcmV0dXJuIGdldEhpZ2hlc3RQcmlvcml0eUxhbmVzKHJvb3QucGVuZGluZ0xhbmVzKTtcbn1cbmZ1bmN0aW9uIGdldExhbmVzVG9SZXRyeVN5bmNocm9ub3VzbHlPbkVycm9yKHJvb3QpIHtcbiAgdmFyIGV2ZXJ5dGhpbmdCdXRPZmZzY3JlZW4gPSByb290LnBlbmRpbmdMYW5lcyAmIH5PZmZzY3JlZW5MYW5lO1xuXG4gIGlmIChldmVyeXRoaW5nQnV0T2Zmc2NyZWVuICE9PSBOb0xhbmVzKSB7XG4gICAgcmV0dXJuIGV2ZXJ5dGhpbmdCdXRPZmZzY3JlZW47XG4gIH1cblxuICBpZiAoZXZlcnl0aGluZ0J1dE9mZnNjcmVlbiAmIE9mZnNjcmVlbkxhbmUpIHtcbiAgICByZXR1cm4gT2Zmc2NyZWVuTGFuZTtcbiAgfVxuXG4gIHJldHVybiBOb0xhbmVzO1xufVxuZnVuY3Rpb24gaW5jbHVkZXNTeW5jTGFuZShsYW5lcykge1xuICByZXR1cm4gKGxhbmVzICYgU3luY0xhbmUpICE9PSBOb0xhbmVzO1xufVxuZnVuY3Rpb24gaW5jbHVkZXNOb25JZGxlV29yayhsYW5lcykge1xuICByZXR1cm4gKGxhbmVzICYgTm9uSWRsZUxhbmVzKSAhPT0gTm9MYW5lcztcbn1cbmZ1bmN0aW9uIGluY2x1ZGVzT25seVJldHJpZXMobGFuZXMpIHtcbiAgcmV0dXJuIChsYW5lcyAmIFJldHJ5TGFuZXMpID09PSBsYW5lcztcbn1cbmZ1bmN0aW9uIGluY2x1ZGVzT25seU5vblVyZ2VudExhbmVzKGxhbmVzKSB7XG4gIHZhciBVcmdlbnRMYW5lcyA9IFN5bmNMYW5lIHwgSW5wdXRDb250aW51b3VzTGFuZSB8IERlZmF1bHRMYW5lO1xuICByZXR1cm4gKGxhbmVzICYgVXJnZW50TGFuZXMpID09PSBOb0xhbmVzO1xufVxuZnVuY3Rpb24gaW5jbHVkZXNPbmx5VHJhbnNpdGlvbnMobGFuZXMpIHtcbiAgcmV0dXJuIChsYW5lcyAmIFRyYW5zaXRpb25MYW5lcykgPT09IGxhbmVzO1xufVxuZnVuY3Rpb24gaW5jbHVkZXNCbG9ja2luZ0xhbmUocm9vdCwgbGFuZXMpIHtcblxuICB2YXIgU3luY0RlZmF1bHRMYW5lcyA9IElucHV0Q29udGludW91c0h5ZHJhdGlvbkxhbmUgfCBJbnB1dENvbnRpbnVvdXNMYW5lIHwgRGVmYXVsdEh5ZHJhdGlvbkxhbmUgfCBEZWZhdWx0TGFuZTtcbiAgcmV0dXJuIChsYW5lcyAmIFN5bmNEZWZhdWx0TGFuZXMpICE9PSBOb0xhbmVzO1xufVxuZnVuY3Rpb24gaW5jbHVkZXNFeHBpcmVkTGFuZShyb290LCBsYW5lcykge1xuICAvLyBUaGlzIGlzIGEgc2VwYXJhdGUgY2hlY2sgZnJvbSBpbmNsdWRlc0Jsb2NraW5nTGFuZSBiZWNhdXNlIGEgbGFuZSBjYW5cbiAgLy8gZXhwaXJlIGFmdGVyIGEgcmVuZGVyIGhhcyBhbHJlYWR5IHN0YXJ0ZWQuXG4gIHJldHVybiAobGFuZXMgJiByb290LmV4cGlyZWRMYW5lcykgIT09IE5vTGFuZXM7XG59XG5mdW5jdGlvbiBpc1RyYW5zaXRpb25MYW5lKGxhbmUpIHtcbiAgcmV0dXJuIChsYW5lICYgVHJhbnNpdGlvbkxhbmVzKSAhPT0gTm9MYW5lcztcbn1cbmZ1bmN0aW9uIGNsYWltTmV4dFRyYW5zaXRpb25MYW5lKCkge1xuICAvLyBDeWNsZSB0aHJvdWdoIHRoZSBsYW5lcywgYXNzaWduaW5nIGVhY2ggbmV3IHRyYW5zaXRpb24gdG8gdGhlIG5leHQgbGFuZS5cbiAgLy8gSW4gbW9zdCBjYXNlcywgdGhpcyBtZWFucyBldmVyeSB0cmFuc2l0aW9uIGdldHMgaXRzIG93biBsYW5lLCB1bnRpbCB3ZVxuICAvLyBydW4gb3V0IG9mIGxhbmVzIGFuZCBjeWNsZSBiYWNrIHRvIHRoZSBiZWdpbm5pbmcuXG4gIHZhciBsYW5lID0gbmV4dFRyYW5zaXRpb25MYW5lO1xuICBuZXh0VHJhbnNpdGlvbkxhbmUgPDw9IDE7XG5cbiAgaWYgKChuZXh0VHJhbnNpdGlvbkxhbmUgJiBUcmFuc2l0aW9uTGFuZXMpID09PSBOb0xhbmVzKSB7XG4gICAgbmV4dFRyYW5zaXRpb25MYW5lID0gVHJhbnNpdGlvbkxhbmUxO1xuICB9XG5cbiAgcmV0dXJuIGxhbmU7XG59XG5mdW5jdGlvbiBjbGFpbU5leHRSZXRyeUxhbmUoKSB7XG4gIHZhciBsYW5lID0gbmV4dFJldHJ5TGFuZTtcbiAgbmV4dFJldHJ5TGFuZSA8PD0gMTtcblxuICBpZiAoKG5leHRSZXRyeUxhbmUgJiBSZXRyeUxhbmVzKSA9PT0gTm9MYW5lcykge1xuICAgIG5leHRSZXRyeUxhbmUgPSBSZXRyeUxhbmUxO1xuICB9XG5cbiAgcmV0dXJuIGxhbmU7XG59XG5mdW5jdGlvbiBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lKGxhbmVzKSB7XG4gIHJldHVybiBsYW5lcyAmIC1sYW5lcztcbn1cbmZ1bmN0aW9uIHBpY2tBcmJpdHJhcnlMYW5lKGxhbmVzKSB7XG4gIC8vIFRoaXMgd3JhcHBlciBmdW5jdGlvbiBnZXRzIGlubGluZWQuIE9ubHkgZXhpc3RzIHNvIHRvIGNvbW11bmljYXRlIHRoYXQgaXRcbiAgLy8gZG9lc24ndCBtYXR0ZXIgd2hpY2ggYml0IGlzIHNlbGVjdGVkOyB5b3UgY2FuIHBpY2sgYW55IGJpdCB3aXRob3V0XG4gIC8vIGFmZmVjdGluZyB0aGUgYWxnb3JpdGhtcyB3aGVyZSBpdHMgdXNlZC4gSGVyZSBJJ20gdXNpbmdcbiAgLy8gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZSBiZWNhdXNlIGl0IHJlcXVpcmVzIHRoZSBmZXdlc3Qgb3BlcmF0aW9ucy5cbiAgcmV0dXJuIGdldEhpZ2hlc3RQcmlvcml0eUxhbmUobGFuZXMpO1xufVxuXG5mdW5jdGlvbiBwaWNrQXJiaXRyYXJ5TGFuZUluZGV4KGxhbmVzKSB7XG4gIHJldHVybiAzMSAtIGNsejMyKGxhbmVzKTtcbn1cblxuZnVuY3Rpb24gbGFuZVRvSW5kZXgobGFuZSkge1xuICByZXR1cm4gcGlja0FyYml0cmFyeUxhbmVJbmRleChsYW5lKTtcbn1cblxuZnVuY3Rpb24gaW5jbHVkZXNTb21lTGFuZShhLCBiKSB7XG4gIHJldHVybiAoYSAmIGIpICE9PSBOb0xhbmVzO1xufVxuZnVuY3Rpb24gaXNTdWJzZXRPZkxhbmVzKHNldCwgc3Vic2V0KSB7XG4gIHJldHVybiAoc2V0ICYgc3Vic2V0KSA9PT0gc3Vic2V0O1xufVxuZnVuY3Rpb24gbWVyZ2VMYW5lcyhhLCBiKSB7XG4gIHJldHVybiBhIHwgYjtcbn1cbmZ1bmN0aW9uIHJlbW92ZUxhbmVzKHNldCwgc3Vic2V0KSB7XG4gIHJldHVybiBzZXQgJiB+c3Vic2V0O1xufVxuZnVuY3Rpb24gaW50ZXJzZWN0TGFuZXMoYSwgYikge1xuICByZXR1cm4gYSAmIGI7XG59IC8vIFNlZW1zIHJlZHVuZGFudCwgYnV0IGl0IGNoYW5nZXMgdGhlIHR5cGUgZnJvbSBhIHNpbmdsZSBsYW5lICh1c2VkIGZvclxuLy8gdXBkYXRlcykgdG8gYSBncm91cCBvZiBsYW5lcyAodXNlZCBmb3IgZmx1c2hpbmcgd29yaykuXG5cbmZ1bmN0aW9uIGxhbmVUb0xhbmVzKGxhbmUpIHtcbiAgcmV0dXJuIGxhbmU7XG59XG5mdW5jdGlvbiBoaWdoZXJQcmlvcml0eUxhbmUoYSwgYikge1xuICAvLyBUaGlzIHdvcmtzIGJlY2F1c2UgdGhlIGJpdCByYW5nZXMgZGVjcmVhc2UgaW4gcHJpb3JpdHkgYXMgeW91IGdvIGxlZnQuXG4gIHJldHVybiBhICE9PSBOb0xhbmUgJiYgYSA8IGIgPyBhIDogYjtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUxhbmVNYXAoaW5pdGlhbCkge1xuICAvLyBJbnRlbnRpb25hbGx5IHB1c2hpbmcgb25lIGJ5IG9uZS5cbiAgLy8gaHR0cHM6Ly92OC5kZXYvYmxvZy9lbGVtZW50cy1raW5kcyNhdm9pZC1jcmVhdGluZy1ob2xlc1xuICB2YXIgbGFuZU1hcCA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgVG90YWxMYW5lczsgaSsrKSB7XG4gICAgbGFuZU1hcC5wdXNoKGluaXRpYWwpO1xuICB9XG5cbiAgcmV0dXJuIGxhbmVNYXA7XG59XG5mdW5jdGlvbiBtYXJrUm9vdFVwZGF0ZWQocm9vdCwgdXBkYXRlTGFuZSwgZXZlbnRUaW1lKSB7XG4gIHJvb3QucGVuZGluZ0xhbmVzIHw9IHVwZGF0ZUxhbmU7IC8vIElmIHRoZXJlIGFyZSBhbnkgc3VzcGVuZGVkIHRyYW5zaXRpb25zLCBpdCdzIHBvc3NpYmxlIHRoaXMgbmV3IHVwZGF0ZVxuICAvLyBjb3VsZCB1bmJsb2NrIHRoZW0uIENsZWFyIHRoZSBzdXNwZW5kZWQgbGFuZXMgc28gdGhhdCB3ZSBjYW4gdHJ5IHJlbmRlcmluZ1xuICAvLyB0aGVtIGFnYWluLlxuICAvL1xuICAvLyBUT0RPOiBXZSByZWFsbHkgb25seSBuZWVkIHRvIHVuc3VzcGVuZCBvbmx5IGxhbmVzIHRoYXQgYXJlIGluIHRoZVxuICAvLyBgc3VidHJlZUxhbmVzYCBvZiB0aGUgdXBkYXRlZCBmaWJlciwgb3IgdGhlIHVwZGF0ZSBsYW5lcyBvZiB0aGUgcmV0dXJuXG4gIC8vIHBhdGguIFRoaXMgd291bGQgZXhjbHVkZSBzdXNwZW5kZWQgdXBkYXRlcyBpbiBhbiB1bnJlbGF0ZWQgc2libGluZyB0cmVlLFxuICAvLyBzaW5jZSB0aGVyZSdzIG5vIHdheSBmb3IgdGhpcyB1cGRhdGUgdG8gdW5ibG9jayBpdC5cbiAgLy9cbiAgLy8gV2UgZG9uJ3QgZG8gdGhpcyBpZiB0aGUgaW5jb21pbmcgdXBkYXRlIGlzIGlkbGUsIGJlY2F1c2Ugd2UgbmV2ZXIgcHJvY2Vzc1xuICAvLyBpZGxlIHVwZGF0ZXMgdW50aWwgYWZ0ZXIgYWxsIHRoZSByZWd1bGFyIHVwZGF0ZXMgaGF2ZSBmaW5pc2hlZDsgdGhlcmUncyBub1xuICAvLyB3YXkgaXQgY291bGQgdW5ibG9jayBhIHRyYW5zaXRpb24uXG5cbiAgaWYgKHVwZGF0ZUxhbmUgIT09IElkbGVMYW5lKSB7XG4gICAgcm9vdC5zdXNwZW5kZWRMYW5lcyA9IE5vTGFuZXM7XG4gICAgcm9vdC5waW5nZWRMYW5lcyA9IE5vTGFuZXM7XG4gIH1cblxuICB2YXIgZXZlbnRUaW1lcyA9IHJvb3QuZXZlbnRUaW1lcztcbiAgdmFyIGluZGV4ID0gbGFuZVRvSW5kZXgodXBkYXRlTGFuZSk7IC8vIFdlIGNhbiBhbHdheXMgb3ZlcndyaXRlIGFuIGV4aXN0aW5nIHRpbWVzdGFtcCBiZWNhdXNlIHdlIHByZWZlciB0aGUgbW9zdFxuICAvLyByZWNlbnQgZXZlbnQsIGFuZCB3ZSBhc3N1bWUgdGltZSBpcyBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcuXG5cbiAgZXZlbnRUaW1lc1tpbmRleF0gPSBldmVudFRpbWU7XG59XG5mdW5jdGlvbiBtYXJrUm9vdFN1c3BlbmRlZChyb290LCBzdXNwZW5kZWRMYW5lcykge1xuICByb290LnN1c3BlbmRlZExhbmVzIHw9IHN1c3BlbmRlZExhbmVzO1xuICByb290LnBpbmdlZExhbmVzICY9IH5zdXNwZW5kZWRMYW5lczsgLy8gVGhlIHN1c3BlbmRlZCBsYW5lcyBhcmUgbm8gbG9uZ2VyIENQVS1ib3VuZC4gQ2xlYXIgdGhlaXIgZXhwaXJhdGlvbiB0aW1lcy5cblxuICB2YXIgZXhwaXJhdGlvblRpbWVzID0gcm9vdC5leHBpcmF0aW9uVGltZXM7XG4gIHZhciBsYW5lcyA9IHN1c3BlbmRlZExhbmVzO1xuXG4gIHdoaWxlIChsYW5lcyA+IDApIHtcbiAgICB2YXIgaW5kZXggPSBwaWNrQXJiaXRyYXJ5TGFuZUluZGV4KGxhbmVzKTtcbiAgICB2YXIgbGFuZSA9IDEgPDwgaW5kZXg7XG4gICAgZXhwaXJhdGlvblRpbWVzW2luZGV4XSA9IE5vVGltZXN0YW1wO1xuICAgIGxhbmVzICY9IH5sYW5lO1xuICB9XG59XG5mdW5jdGlvbiBtYXJrUm9vdFBpbmdlZChyb290LCBwaW5nZWRMYW5lcywgZXZlbnRUaW1lKSB7XG4gIHJvb3QucGluZ2VkTGFuZXMgfD0gcm9vdC5zdXNwZW5kZWRMYW5lcyAmIHBpbmdlZExhbmVzO1xufVxuZnVuY3Rpb24gbWFya1Jvb3RGaW5pc2hlZChyb290LCByZW1haW5pbmdMYW5lcykge1xuICB2YXIgbm9Mb25nZXJQZW5kaW5nTGFuZXMgPSByb290LnBlbmRpbmdMYW5lcyAmIH5yZW1haW5pbmdMYW5lcztcbiAgcm9vdC5wZW5kaW5nTGFuZXMgPSByZW1haW5pbmdMYW5lczsgLy8gTGV0J3MgdHJ5IGV2ZXJ5dGhpbmcgYWdhaW5cblxuICByb290LnN1c3BlbmRlZExhbmVzID0gTm9MYW5lcztcbiAgcm9vdC5waW5nZWRMYW5lcyA9IE5vTGFuZXM7XG4gIHJvb3QuZXhwaXJlZExhbmVzICY9IHJlbWFpbmluZ0xhbmVzO1xuICByb290Lm11dGFibGVSZWFkTGFuZXMgJj0gcmVtYWluaW5nTGFuZXM7XG4gIHJvb3QuZW50YW5nbGVkTGFuZXMgJj0gcmVtYWluaW5nTGFuZXM7XG4gIHZhciBlbnRhbmdsZW1lbnRzID0gcm9vdC5lbnRhbmdsZW1lbnRzO1xuICB2YXIgZXZlbnRUaW1lcyA9IHJvb3QuZXZlbnRUaW1lcztcbiAgdmFyIGV4cGlyYXRpb25UaW1lcyA9IHJvb3QuZXhwaXJhdGlvblRpbWVzOyAvLyBDbGVhciB0aGUgbGFuZXMgdGhhdCBubyBsb25nZXIgaGF2ZSBwZW5kaW5nIHdvcmtcblxuICB2YXIgbGFuZXMgPSBub0xvbmdlclBlbmRpbmdMYW5lcztcblxuICB3aGlsZSAobGFuZXMgPiAwKSB7XG4gICAgdmFyIGluZGV4ID0gcGlja0FyYml0cmFyeUxhbmVJbmRleChsYW5lcyk7XG4gICAgdmFyIGxhbmUgPSAxIDw8IGluZGV4O1xuICAgIGVudGFuZ2xlbWVudHNbaW5kZXhdID0gTm9MYW5lcztcbiAgICBldmVudFRpbWVzW2luZGV4XSA9IE5vVGltZXN0YW1wO1xuICAgIGV4cGlyYXRpb25UaW1lc1tpbmRleF0gPSBOb1RpbWVzdGFtcDtcbiAgICBsYW5lcyAmPSB+bGFuZTtcbiAgfVxufVxuZnVuY3Rpb24gbWFya1Jvb3RFbnRhbmdsZWQocm9vdCwgZW50YW5nbGVkTGFuZXMpIHtcbiAgLy8gSW4gYWRkaXRpb24gdG8gZW50YW5nbGluZyBlYWNoIG9mIHRoZSBnaXZlbiBsYW5lcyB3aXRoIGVhY2ggb3RoZXIsIHdlIGFsc29cbiAgLy8gaGF2ZSB0byBjb25zaWRlciBfdHJhbnNpdGl2ZV8gZW50YW5nbGVtZW50cy4gRm9yIGVhY2ggbGFuZSB0aGF0IGlzIGFscmVhZHlcbiAgLy8gZW50YW5nbGVkIHdpdGggKmFueSogb2YgdGhlIGdpdmVuIGxhbmVzLCB0aGF0IGxhbmUgaXMgbm93IHRyYW5zaXRpdmVseVxuICAvLyBlbnRhbmdsZWQgd2l0aCAqYWxsKiB0aGUgZ2l2ZW4gbGFuZXMuXG4gIC8vXG4gIC8vIFRyYW5zbGF0ZWQ6IElmIEMgaXMgZW50YW5nbGVkIHdpdGggQSwgdGhlbiBlbnRhbmdsaW5nIEEgd2l0aCBCIGFsc29cbiAgLy8gZW50YW5nbGVzIEMgd2l0aCBCLlxuICAvL1xuICAvLyBJZiB0aGlzIGlzIGhhcmQgdG8gZ3Jhc3AsIGl0IG1pZ2h0IGhlbHAgdG8gaW50ZW50aW9uYWxseSBicmVhayB0aGlzXG4gIC8vIGZ1bmN0aW9uIGFuZCBsb29rIGF0IHRoZSB0ZXN0cyB0aGF0IGZhaWwgaW4gUmVhY3RUcmFuc2l0aW9uLXRlc3QuanMuIFRyeVxuICAvLyBjb21tZW50aW5nIG91dCBvbmUgb2YgdGhlIGNvbmRpdGlvbnMgYmVsb3cuXG4gIHZhciByb290RW50YW5nbGVkTGFuZXMgPSByb290LmVudGFuZ2xlZExhbmVzIHw9IGVudGFuZ2xlZExhbmVzO1xuICB2YXIgZW50YW5nbGVtZW50cyA9IHJvb3QuZW50YW5nbGVtZW50cztcbiAgdmFyIGxhbmVzID0gcm9vdEVudGFuZ2xlZExhbmVzO1xuXG4gIHdoaWxlIChsYW5lcykge1xuICAgIHZhciBpbmRleCA9IHBpY2tBcmJpdHJhcnlMYW5lSW5kZXgobGFuZXMpO1xuICAgIHZhciBsYW5lID0gMSA8PCBpbmRleDtcblxuICAgIGlmICggLy8gSXMgdGhpcyBvbmUgb2YgdGhlIG5ld2x5IGVudGFuZ2xlZCBsYW5lcz9cbiAgICBsYW5lICYgZW50YW5nbGVkTGFuZXMgfCAvLyBJcyB0aGlzIGxhbmUgdHJhbnNpdGl2ZWx5IGVudGFuZ2xlZCB3aXRoIHRoZSBuZXdseSBlbnRhbmdsZWQgbGFuZXM/XG4gICAgZW50YW5nbGVtZW50c1tpbmRleF0gJiBlbnRhbmdsZWRMYW5lcykge1xuICAgICAgZW50YW5nbGVtZW50c1tpbmRleF0gfD0gZW50YW5nbGVkTGFuZXM7XG4gICAgfVxuXG4gICAgbGFuZXMgJj0gfmxhbmU7XG4gIH1cbn1cbmZ1bmN0aW9uIGdldEJ1bXBlZExhbmVGb3JIeWRyYXRpb24ocm9vdCwgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIHJlbmRlckxhbmUgPSBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lKHJlbmRlckxhbmVzKTtcbiAgdmFyIGxhbmU7XG5cbiAgc3dpdGNoIChyZW5kZXJMYW5lKSB7XG4gICAgY2FzZSBJbnB1dENvbnRpbnVvdXNMYW5lOlxuICAgICAgbGFuZSA9IElucHV0Q29udGludW91c0h5ZHJhdGlvbkxhbmU7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgRGVmYXVsdExhbmU6XG4gICAgICBsYW5lID0gRGVmYXVsdEh5ZHJhdGlvbkxhbmU7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUyOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUzOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU0OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU1OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU2OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU3OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU4OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU5OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxMDpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTE6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTEyOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxMzpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTQ6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTE1OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxNjpcbiAgICBjYXNlIFJldHJ5TGFuZTE6XG4gICAgY2FzZSBSZXRyeUxhbmUyOlxuICAgIGNhc2UgUmV0cnlMYW5lMzpcbiAgICBjYXNlIFJldHJ5TGFuZTQ6XG4gICAgY2FzZSBSZXRyeUxhbmU1OlxuICAgICAgbGFuZSA9IFRyYW5zaXRpb25IeWRyYXRpb25MYW5lO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIElkbGVMYW5lOlxuICAgICAgbGFuZSA9IElkbGVIeWRyYXRpb25MYW5lO1xuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgLy8gRXZlcnl0aGluZyBlbHNlIGlzIGFscmVhZHkgZWl0aGVyIGEgaHlkcmF0aW9uIGxhbmUsIG9yIHNob3VsZG4ndFxuICAgICAgLy8gYmUgcmV0cmllZCBhdCBhIGh5ZHJhdGlvbiBsYW5lLlxuICAgICAgbGFuZSA9IE5vTGFuZTtcbiAgICAgIGJyZWFrO1xuICB9IC8vIENoZWNrIGlmIHRoZSBsYW5lIHdlIGNob3NlIGlzIHN1c3BlbmRlZC4gSWYgc28sIHRoYXQgaW5kaWNhdGVzIHRoYXQgd2VcbiAgLy8gYWxyZWFkeSBhdHRlbXB0ZWQgYW5kIGZhaWxlZCB0byBoeWRyYXRlIGF0IHRoYXQgbGV2ZWwuIEFsc28gY2hlY2sgaWYgd2UncmVcbiAgLy8gYWxyZWFkeSByZW5kZXJpbmcgdGhhdCBsYW5lLCB3aGljaCBpcyByYXJlIGJ1dCBjb3VsZCBoYXBwZW4uXG5cblxuICBpZiAoKGxhbmUgJiAocm9vdC5zdXNwZW5kZWRMYW5lcyB8IHJlbmRlckxhbmVzKSkgIT09IE5vTGFuZSkge1xuICAgIC8vIEdpdmUgdXAgdHJ5aW5nIHRvIGh5ZHJhdGUgYW5kIGZhbGwgYmFjayB0byBjbGllbnQgcmVuZGVyLlxuICAgIHJldHVybiBOb0xhbmU7XG4gIH1cblxuICByZXR1cm4gbGFuZTtcbn1cbmZ1bmN0aW9uIGFkZEZpYmVyVG9MYW5lc01hcChyb290LCBmaWJlciwgbGFuZXMpIHtcblxuICBpZiAoIWlzRGV2VG9vbHNQcmVzZW50KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHBlbmRpbmdVcGRhdGVyc0xhbmVNYXAgPSByb290LnBlbmRpbmdVcGRhdGVyc0xhbmVNYXA7XG5cbiAgd2hpbGUgKGxhbmVzID4gMCkge1xuICAgIHZhciBpbmRleCA9IGxhbmVUb0luZGV4KGxhbmVzKTtcbiAgICB2YXIgbGFuZSA9IDEgPDwgaW5kZXg7XG4gICAgdmFyIHVwZGF0ZXJzID0gcGVuZGluZ1VwZGF0ZXJzTGFuZU1hcFtpbmRleF07XG4gICAgdXBkYXRlcnMuYWRkKGZpYmVyKTtcbiAgICBsYW5lcyAmPSB+bGFuZTtcbiAgfVxufVxuZnVuY3Rpb24gbW92ZVBlbmRpbmdGaWJlcnNUb01lbW9pemVkKHJvb3QsIGxhbmVzKSB7XG5cbiAgaWYgKCFpc0RldlRvb2xzUHJlc2VudCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBwZW5kaW5nVXBkYXRlcnNMYW5lTWFwID0gcm9vdC5wZW5kaW5nVXBkYXRlcnNMYW5lTWFwO1xuICB2YXIgbWVtb2l6ZWRVcGRhdGVycyA9IHJvb3QubWVtb2l6ZWRVcGRhdGVycztcblxuICB3aGlsZSAobGFuZXMgPiAwKSB7XG4gICAgdmFyIGluZGV4ID0gbGFuZVRvSW5kZXgobGFuZXMpO1xuICAgIHZhciBsYW5lID0gMSA8PCBpbmRleDtcbiAgICB2YXIgdXBkYXRlcnMgPSBwZW5kaW5nVXBkYXRlcnNMYW5lTWFwW2luZGV4XTtcblxuICAgIGlmICh1cGRhdGVycy5zaXplID4gMCkge1xuICAgICAgdXBkYXRlcnMuZm9yRWFjaChmdW5jdGlvbiAoZmliZXIpIHtcbiAgICAgICAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTtcblxuICAgICAgICBpZiAoYWx0ZXJuYXRlID09PSBudWxsIHx8ICFtZW1vaXplZFVwZGF0ZXJzLmhhcyhhbHRlcm5hdGUpKSB7XG4gICAgICAgICAgbWVtb2l6ZWRVcGRhdGVycy5hZGQoZmliZXIpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHVwZGF0ZXJzLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgbGFuZXMgJj0gfmxhbmU7XG4gIH1cbn1cbmZ1bmN0aW9uIGdldFRyYW5zaXRpb25zRm9yTGFuZXMocm9vdCwgbGFuZXMpIHtcbiAge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbnZhciBEaXNjcmV0ZUV2ZW50UHJpb3JpdHkgPSBTeW5jTGFuZTtcbnZhciBDb250aW51b3VzRXZlbnRQcmlvcml0eSA9IElucHV0Q29udGludW91c0xhbmU7XG52YXIgRGVmYXVsdEV2ZW50UHJpb3JpdHkgPSBEZWZhdWx0TGFuZTtcbnZhciBJZGxlRXZlbnRQcmlvcml0eSA9IElkbGVMYW5lO1xudmFyIGN1cnJlbnRVcGRhdGVQcmlvcml0eSA9IE5vTGFuZTtcbmZ1bmN0aW9uIGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSgpIHtcbiAgcmV0dXJuIGN1cnJlbnRVcGRhdGVQcmlvcml0eTtcbn1cbmZ1bmN0aW9uIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShuZXdQcmlvcml0eSkge1xuICBjdXJyZW50VXBkYXRlUHJpb3JpdHkgPSBuZXdQcmlvcml0eTtcbn1cbmZ1bmN0aW9uIHJ1bldpdGhQcmlvcml0eShwcmlvcml0eSwgZm4pIHtcbiAgdmFyIHByZXZpb3VzUHJpb3JpdHkgPSBjdXJyZW50VXBkYXRlUHJpb3JpdHk7XG5cbiAgdHJ5IHtcbiAgICBjdXJyZW50VXBkYXRlUHJpb3JpdHkgPSBwcmlvcml0eTtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBjdXJyZW50VXBkYXRlUHJpb3JpdHkgPSBwcmV2aW91c1ByaW9yaXR5O1xuICB9XG59XG5mdW5jdGlvbiBoaWdoZXJFdmVudFByaW9yaXR5KGEsIGIpIHtcbiAgcmV0dXJuIGEgIT09IDAgJiYgYSA8IGIgPyBhIDogYjtcbn1cbmZ1bmN0aW9uIGxvd2VyRXZlbnRQcmlvcml0eShhLCBiKSB7XG4gIHJldHVybiBhID09PSAwIHx8IGEgPiBiID8gYSA6IGI7XG59XG5mdW5jdGlvbiBpc0hpZ2hlckV2ZW50UHJpb3JpdHkoYSwgYikge1xuICByZXR1cm4gYSAhPT0gMCAmJiBhIDwgYjtcbn1cbmZ1bmN0aW9uIGxhbmVzVG9FdmVudFByaW9yaXR5KGxhbmVzKSB7XG4gIHZhciBsYW5lID0gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZShsYW5lcyk7XG5cbiAgaWYgKCFpc0hpZ2hlckV2ZW50UHJpb3JpdHkoRGlzY3JldGVFdmVudFByaW9yaXR5LCBsYW5lKSkge1xuICAgIHJldHVybiBEaXNjcmV0ZUV2ZW50UHJpb3JpdHk7XG4gIH1cblxuICBpZiAoIWlzSGlnaGVyRXZlbnRQcmlvcml0eShDb250aW51b3VzRXZlbnRQcmlvcml0eSwgbGFuZSkpIHtcbiAgICByZXR1cm4gQ29udGludW91c0V2ZW50UHJpb3JpdHk7XG4gIH1cblxuICBpZiAoaW5jbHVkZXNOb25JZGxlV29yayhsYW5lKSkge1xuICAgIHJldHVybiBEZWZhdWx0RXZlbnRQcmlvcml0eTtcbiAgfVxuXG4gIHJldHVybiBJZGxlRXZlbnRQcmlvcml0eTtcbn1cblxuLy8gVGhpcyBtb2R1bGUgb25seSBleGlzdHMgYXMgYW4gRVNNIHdyYXBwZXIgYXJvdW5kIHRoZSBleHRlcm5hbCBDb21tb25KU1xudmFyIHNjaGVkdWxlQ2FsbGJhY2sgPSBTY2hlZHVsZXIudW5zdGFibGVfc2NoZWR1bGVDYWxsYmFjaztcbnZhciBjYW5jZWxDYWxsYmFjayA9IFNjaGVkdWxlci51bnN0YWJsZV9jYW5jZWxDYWxsYmFjaztcbnZhciBzaG91bGRZaWVsZCA9IFNjaGVkdWxlci51bnN0YWJsZV9zaG91bGRZaWVsZDtcbnZhciByZXF1ZXN0UGFpbnQgPSBTY2hlZHVsZXIudW5zdGFibGVfcmVxdWVzdFBhaW50O1xudmFyIG5vdyA9IFNjaGVkdWxlci51bnN0YWJsZV9ub3c7XG52YXIgSW1tZWRpYXRlUHJpb3JpdHkgPSBTY2hlZHVsZXIudW5zdGFibGVfSW1tZWRpYXRlUHJpb3JpdHk7XG52YXIgVXNlckJsb2NraW5nUHJpb3JpdHkgPSBTY2hlZHVsZXIudW5zdGFibGVfVXNlckJsb2NraW5nUHJpb3JpdHk7XG52YXIgTm9ybWFsUHJpb3JpdHkgPSBTY2hlZHVsZXIudW5zdGFibGVfTm9ybWFsUHJpb3JpdHk7XG52YXIgSWRsZVByaW9yaXR5ID0gU2NoZWR1bGVyLnVuc3RhYmxlX0lkbGVQcmlvcml0eTtcbi8vIHRoaXMgZG9lc24ndCBhY3R1YWxseSBleGlzdCBvbiB0aGUgc2NoZWR1bGVyLCBidXQgaXQgKmRvZXMqXG4vLyBvbiBzY2hlZHVsZXIvdW5zdGFibGVfbW9jaywgd2hpY2ggd2UnbGwgbmVlZCBmb3IgaW50ZXJuYWwgdGVzdGluZ1xudmFyIHVuc3RhYmxlX3lpZWxkVmFsdWUgPSBTY2hlZHVsZXIudW5zdGFibGVfeWllbGRWYWx1ZTtcbnZhciB1bnN0YWJsZV9zZXREaXNhYmxlWWllbGRWYWx1ZSA9IFNjaGVkdWxlci51bnN0YWJsZV9zZXREaXNhYmxlWWllbGRWYWx1ZTtcblxudmFyIHJlbmRlcmVySUQgPSBudWxsO1xudmFyIGluamVjdGVkSG9vayA9IG51bGw7XG52YXIgaW5qZWN0ZWRQcm9maWxpbmdIb29rcyA9IG51bGw7XG52YXIgaGFzTG9nZ2VkRXJyb3IgPSBmYWxzZTtcbnZhciBpc0RldlRvb2xzUHJlc2VudCA9IHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gIT09ICd1bmRlZmluZWQnO1xuZnVuY3Rpb24gaW5qZWN0SW50ZXJuYWxzKGludGVybmFscykge1xuICBpZiAodHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAvLyBObyBEZXZUb29sc1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBob29rID0gX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fO1xuXG4gIGlmIChob29rLmlzRGlzYWJsZWQpIHtcbiAgICAvLyBUaGlzIGlzbid0IGEgcmVhbCBwcm9wZXJ0eSBvbiB0aGUgaG9vaywgYnV0IGl0IGNhbiBiZSBzZXQgdG8gb3B0IG91dFxuICAgIC8vIG9mIERldlRvb2xzIGludGVncmF0aW9uIGFuZCBhc3NvY2lhdGVkIHdhcm5pbmdzIGFuZCBsb2dzLlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMzg3N1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKCFob29rLnN1cHBvcnRzRmliZXIpIHtcbiAgICB7XG4gICAgICBlcnJvcignVGhlIGluc3RhbGxlZCB2ZXJzaW9uIG9mIFJlYWN0IERldlRvb2xzIGlzIHRvbyBvbGQgYW5kIHdpbGwgbm90IHdvcmsgJyArICd3aXRoIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgUmVhY3QuIFBsZWFzZSB1cGRhdGUgUmVhY3QgRGV2VG9vbHMuICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3JlYWN0LWRldnRvb2xzJyk7XG4gICAgfSAvLyBEZXZUb29scyBleGlzdHMsIGV2ZW4gdGhvdWdoIGl0IGRvZXNuJ3Qgc3VwcG9ydCBGaWJlci5cblxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICB0cnkge1xuICAgIGlmIChlbmFibGVTY2hlZHVsaW5nUHJvZmlsZXIpIHtcbiAgICAgIC8vIENvbmRpdGlvbmFsbHkgaW5qZWN0IHRoZXNlIGhvb2tzIG9ubHkgaWYgVGltZWxpbmUgcHJvZmlsZXIgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgYnVpbGQuXG4gICAgICAvLyBUaGlzIGdpdmVzIERldlRvb2xzIGEgd2F5IHRvIGZlYXR1cmUgZGV0ZWN0IHRoYXQgaXNuJ3QgdGllZCB0byB2ZXJzaW9uIG51bWJlclxuICAgICAgLy8gKHNpbmNlIHByb2ZpbGluZyBhbmQgdGltZWxpbmUgYXJlIGNvbnRyb2xsZWQgYnkgZGlmZmVyZW50IGZlYXR1cmUgZmxhZ3MpLlxuICAgICAgaW50ZXJuYWxzID0gYXNzaWduKHt9LCBpbnRlcm5hbHMsIHtcbiAgICAgICAgZ2V0TGFuZUxhYmVsTWFwOiBnZXRMYW5lTGFiZWxNYXAsXG4gICAgICAgIGluamVjdFByb2ZpbGluZ0hvb2tzOiBpbmplY3RQcm9maWxpbmdIb29rc1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmVuZGVyZXJJRCA9IGhvb2suaW5qZWN0KGludGVybmFscyk7IC8vIFdlIGhhdmUgc3VjY2Vzc2Z1bGx5IGluamVjdGVkLCBzbyBub3cgaXQgaXMgc2FmZSB0byBzZXQgdXAgaG9va3MuXG5cbiAgICBpbmplY3RlZEhvb2sgPSBob29rO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBDYXRjaCBhbGwgZXJyb3JzIGJlY2F1c2UgaXQgaXMgdW5zYWZlIHRvIHRocm93IGR1cmluZyBpbml0aWFsaXphdGlvbi5cbiAgICB7XG4gICAgICBlcnJvcignUmVhY3QgaW5zdHJ1bWVudGF0aW9uIGVuY291bnRlcmVkIGFuIGVycm9yOiAlcy4nLCBlcnIpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChob29rLmNoZWNrRENFKSB7XG4gICAgLy8gVGhpcyBpcyB0aGUgcmVhbCBEZXZUb29scy5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICAvLyBUaGlzIGlzIGxpa2VseSBhIGhvb2sgaW5zdGFsbGVkIGJ5IEZhc3QgUmVmcmVzaCBydW50aW1lLlxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gb25TY2hlZHVsZVJvb3Qocm9vdCwgY2hpbGRyZW4pIHtcbiAge1xuICAgIGlmIChpbmplY3RlZEhvb2sgJiYgdHlwZW9mIGluamVjdGVkSG9vay5vblNjaGVkdWxlRmliZXJSb290ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0cnkge1xuICAgICAgICBpbmplY3RlZEhvb2sub25TY2hlZHVsZUZpYmVyUm9vdChyZW5kZXJlcklELCByb290LCBjaGlsZHJlbik7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKCAhaGFzTG9nZ2VkRXJyb3IpIHtcbiAgICAgICAgICBoYXNMb2dnZWRFcnJvciA9IHRydWU7XG5cbiAgICAgICAgICBlcnJvcignUmVhY3QgaW5zdHJ1bWVudGF0aW9uIGVuY291bnRlcmVkIGFuIGVycm9yOiAlcycsIGVycik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG9uQ29tbWl0Um9vdChyb290LCBldmVudFByaW9yaXR5KSB7XG4gIGlmIChpbmplY3RlZEhvb2sgJiYgdHlwZW9mIGluamVjdGVkSG9vay5vbkNvbW1pdEZpYmVyUm9vdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRyeSB7XG4gICAgICB2YXIgZGlkRXJyb3IgPSAocm9vdC5jdXJyZW50LmZsYWdzICYgRGlkQ2FwdHVyZSkgPT09IERpZENhcHR1cmU7XG5cbiAgICAgIGlmIChlbmFibGVQcm9maWxlclRpbWVyKSB7XG4gICAgICAgIHZhciBzY2hlZHVsZXJQcmlvcml0eTtcblxuICAgICAgICBzd2l0Y2ggKGV2ZW50UHJpb3JpdHkpIHtcbiAgICAgICAgICBjYXNlIERpc2NyZXRlRXZlbnRQcmlvcml0eTpcbiAgICAgICAgICAgIHNjaGVkdWxlclByaW9yaXR5ID0gSW1tZWRpYXRlUHJpb3JpdHk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgQ29udGludW91c0V2ZW50UHJpb3JpdHk6XG4gICAgICAgICAgICBzY2hlZHVsZXJQcmlvcml0eSA9IFVzZXJCbG9ja2luZ1ByaW9yaXR5O1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIERlZmF1bHRFdmVudFByaW9yaXR5OlxuICAgICAgICAgICAgc2NoZWR1bGVyUHJpb3JpdHkgPSBOb3JtYWxQcmlvcml0eTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBJZGxlRXZlbnRQcmlvcml0eTpcbiAgICAgICAgICAgIHNjaGVkdWxlclByaW9yaXR5ID0gSWRsZVByaW9yaXR5O1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgc2NoZWR1bGVyUHJpb3JpdHkgPSBOb3JtYWxQcmlvcml0eTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaW5qZWN0ZWRIb29rLm9uQ29tbWl0RmliZXJSb290KHJlbmRlcmVySUQsIHJvb3QsIHNjaGVkdWxlclByaW9yaXR5LCBkaWRFcnJvcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbmplY3RlZEhvb2sub25Db21taXRGaWJlclJvb3QocmVuZGVyZXJJRCwgcm9vdCwgdW5kZWZpbmVkLCBkaWRFcnJvcik7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB7XG4gICAgICAgIGlmICghaGFzTG9nZ2VkRXJyb3IpIHtcbiAgICAgICAgICBoYXNMb2dnZWRFcnJvciA9IHRydWU7XG5cbiAgICAgICAgICBlcnJvcignUmVhY3QgaW5zdHJ1bWVudGF0aW9uIGVuY291bnRlcmVkIGFuIGVycm9yOiAlcycsIGVycik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG9uUG9zdENvbW1pdFJvb3Qocm9vdCkge1xuICBpZiAoaW5qZWN0ZWRIb29rICYmIHR5cGVvZiBpbmplY3RlZEhvb2sub25Qb3N0Q29tbWl0RmliZXJSb290ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdHJ5IHtcbiAgICAgIGluamVjdGVkSG9vay5vblBvc3RDb21taXRGaWJlclJvb3QocmVuZGVyZXJJRCwgcm9vdCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB7XG4gICAgICAgIGlmICghaGFzTG9nZ2VkRXJyb3IpIHtcbiAgICAgICAgICBoYXNMb2dnZWRFcnJvciA9IHRydWU7XG5cbiAgICAgICAgICBlcnJvcignUmVhY3QgaW5zdHJ1bWVudGF0aW9uIGVuY291bnRlcmVkIGFuIGVycm9yOiAlcycsIGVycik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG9uQ29tbWl0VW5tb3VudChmaWJlcikge1xuICBpZiAoaW5qZWN0ZWRIb29rICYmIHR5cGVvZiBpbmplY3RlZEhvb2sub25Db21taXRGaWJlclVubW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICB0cnkge1xuICAgICAgaW5qZWN0ZWRIb29rLm9uQ29tbWl0RmliZXJVbm1vdW50KHJlbmRlcmVySUQsIGZpYmVyKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHtcbiAgICAgICAgaWYgKCFoYXNMb2dnZWRFcnJvcikge1xuICAgICAgICAgIGhhc0xvZ2dlZEVycm9yID0gdHJ1ZTtcblxuICAgICAgICAgIGVycm9yKCdSZWFjdCBpbnN0cnVtZW50YXRpb24gZW5jb3VudGVyZWQgYW4gZXJyb3I6ICVzJywgZXJyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHMobmV3SXNTdHJpY3RNb2RlKSB7XG4gIHtcbiAgICBpZiAodHlwZW9mIHVuc3RhYmxlX3lpZWxkVmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIFdlJ3JlIGluIGEgdGVzdCBiZWNhdXNlIFNjaGVkdWxlci51bnN0YWJsZV95aWVsZFZhbHVlIG9ubHkgZXhpc3RzXG4gICAgICAvLyBpbiBTY2hlZHVsZXJNb2NrLiBUbyByZWR1Y2UgdGhlIG5vaXNlIGluIHN0cmljdCBtb2RlIHRlc3RzLFxuICAgICAgLy8gc3VwcHJlc3Mgd2FybmluZ3MgYW5kIGRpc2FibGUgc2NoZWR1bGVyIHlpZWxkaW5nIGR1cmluZyB0aGUgZG91YmxlIHJlbmRlclxuICAgICAgdW5zdGFibGVfc2V0RGlzYWJsZVlpZWxkVmFsdWUobmV3SXNTdHJpY3RNb2RlKTtcbiAgICAgIHNldFN1cHByZXNzV2FybmluZyhuZXdJc1N0cmljdE1vZGUpO1xuICAgIH1cblxuICAgIGlmIChpbmplY3RlZEhvb2sgJiYgdHlwZW9mIGluamVjdGVkSG9vay5zZXRTdHJpY3RNb2RlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0cnkge1xuICAgICAgICBpbmplY3RlZEhvb2suc2V0U3RyaWN0TW9kZShyZW5kZXJlcklELCBuZXdJc1N0cmljdE1vZGUpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoIWhhc0xvZ2dlZEVycm9yKSB7XG4gICAgICAgICAgICBoYXNMb2dnZWRFcnJvciA9IHRydWU7XG5cbiAgICAgICAgICAgIGVycm9yKCdSZWFjdCBpbnN0cnVtZW50YXRpb24gZW5jb3VudGVyZWQgYW4gZXJyb3I6ICVzJywgZXJyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn0gLy8gUHJvZmlsZXIgQVBJIGhvb2tzXG5cbmZ1bmN0aW9uIGluamVjdFByb2ZpbGluZ0hvb2tzKHByb2ZpbGluZ0hvb2tzKSB7XG4gIGluamVjdGVkUHJvZmlsaW5nSG9va3MgPSBwcm9maWxpbmdIb29rcztcbn1cblxuZnVuY3Rpb24gZ2V0TGFuZUxhYmVsTWFwKCkge1xuICB7XG4gICAgdmFyIG1hcCA9IG5ldyBNYXAoKTtcbiAgICB2YXIgbGFuZSA9IDE7XG5cbiAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgVG90YWxMYW5lczsgaW5kZXgrKykge1xuICAgICAgdmFyIGxhYmVsID0gZ2V0TGFiZWxGb3JMYW5lKGxhbmUpO1xuICAgICAgbWFwLnNldChsYW5lLCBsYWJlbCk7XG4gICAgICBsYW5lICo9IDI7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hcDtcbiAgfVxufVxuXG5mdW5jdGlvbiBtYXJrQ29tbWl0U3RhcnRlZChsYW5lcykge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbW1pdFN0YXJ0ZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbW1pdFN0YXJ0ZWQobGFuZXMpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0NvbW1pdFN0b3BwZWQoKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tbWl0U3RvcHBlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tbWl0U3RvcHBlZCgpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0NvbXBvbmVudFJlbmRlclN0YXJ0ZWQoZmliZXIpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRSZW5kZXJTdGFydGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRSZW5kZXJTdGFydGVkKGZpYmVyKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtDb21wb25lbnRSZW5kZXJTdG9wcGVkKCkge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudFJlbmRlclN0b3BwZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudFJlbmRlclN0b3BwZWQoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0TW91bnRTdGFydGVkKGZpYmVyKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdE1vdW50U3RhcnRlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdE1vdW50U3RhcnRlZChmaWJlcik7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdE1vdW50U3RvcHBlZCgpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0TW91bnRTdG9wcGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0TW91bnRTdG9wcGVkKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdFVubW91bnRTdGFydGVkKGZpYmVyKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdFVubW91bnRTdGFydGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0VW5tb3VudFN0YXJ0ZWQoZmliZXIpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RVbm1vdW50U3RvcHBlZCgpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0VW5tb3VudFN0b3BwZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RVbm1vdW50U3RvcHBlZCgpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0NvbXBvbmVudExheW91dEVmZmVjdE1vdW50U3RhcnRlZChmaWJlcikge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudExheW91dEVmZmVjdE1vdW50U3RhcnRlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0TW91bnRTdGFydGVkKGZpYmVyKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RNb3VudFN0b3BwZWQoKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0TW91bnRTdG9wcGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RNb3VudFN0b3BwZWQoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RVbm1vdW50U3RhcnRlZChmaWJlcikge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudExheW91dEVmZmVjdFVubW91bnRTdGFydGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RVbm1vdW50U3RhcnRlZChmaWJlcik7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0VW5tb3VudFN0b3BwZWQoKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0VW5tb3VudFN0b3BwZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudExheW91dEVmZmVjdFVubW91bnRTdG9wcGVkKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrQ29tcG9uZW50RXJyb3JlZChmaWJlciwgdGhyb3duVmFsdWUsIGxhbmVzKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50RXJyb3JlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50RXJyb3JlZChmaWJlciwgdGhyb3duVmFsdWUsIGxhbmVzKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtDb21wb25lbnRTdXNwZW5kZWQoZmliZXIsIHdha2VhYmxlLCBsYW5lcykge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudFN1c3BlbmRlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50U3VzcGVuZGVkKGZpYmVyLCB3YWtlYWJsZSwgbGFuZXMpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0xheW91dEVmZmVjdHNTdGFydGVkKGxhbmVzKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrTGF5b3V0RWZmZWN0c1N0YXJ0ZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0xheW91dEVmZmVjdHNTdGFydGVkKGxhbmVzKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtMYXlvdXRFZmZlY3RzU3RvcHBlZCgpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtMYXlvdXRFZmZlY3RzU3RvcHBlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrTGF5b3V0RWZmZWN0c1N0b3BwZWQoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtQYXNzaXZlRWZmZWN0c1N0YXJ0ZWQobGFuZXMpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtQYXNzaXZlRWZmZWN0c1N0YXJ0ZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1Bhc3NpdmVFZmZlY3RzU3RhcnRlZChsYW5lcyk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrUGFzc2l2ZUVmZmVjdHNTdG9wcGVkKCkge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1Bhc3NpdmVFZmZlY3RzU3RvcHBlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrUGFzc2l2ZUVmZmVjdHNTdG9wcGVkKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrUmVuZGVyU3RhcnRlZChsYW5lcykge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1JlbmRlclN0YXJ0ZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1JlbmRlclN0YXJ0ZWQobGFuZXMpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya1JlbmRlcllpZWxkZWQoKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrUmVuZGVyWWllbGRlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrUmVuZGVyWWllbGRlZCgpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya1JlbmRlclN0b3BwZWQoKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrUmVuZGVyU3RvcHBlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrUmVuZGVyU3RvcHBlZCgpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya1JlbmRlclNjaGVkdWxlZChsYW5lKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrUmVuZGVyU2NoZWR1bGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtSZW5kZXJTY2hlZHVsZWQobGFuZSk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrRm9yY2VVcGRhdGVTY2hlZHVsZWQoZmliZXIsIGxhbmUpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtGb3JjZVVwZGF0ZVNjaGVkdWxlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrRm9yY2VVcGRhdGVTY2hlZHVsZWQoZmliZXIsIGxhbmUpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya1N0YXRlVXBkYXRlU2NoZWR1bGVkKGZpYmVyLCBsYW5lKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrU3RhdGVVcGRhdGVTY2hlZHVsZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1N0YXRlVXBkYXRlU2NoZWR1bGVkKGZpYmVyLCBsYW5lKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBpbmxpbmVkIE9iamVjdC5pcyBwb2x5ZmlsbCB0byBhdm9pZCByZXF1aXJpbmcgY29uc3VtZXJzIHNoaXAgdGhlaXIgb3duXG4gKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvaXNcbiAqL1xuZnVuY3Rpb24gaXMoeCwgeSkge1xuICByZXR1cm4geCA9PT0geSAmJiAoeCAhPT0gMCB8fCAxIC8geCA9PT0gMSAvIHkpIHx8IHggIT09IHggJiYgeSAhPT0geSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtY29tcGFyZVxuICA7XG59XG5cbnZhciBvYmplY3RJcyA9IHR5cGVvZiBPYmplY3QuaXMgPT09ICdmdW5jdGlvbicgPyBPYmplY3QuaXMgOiBpcztcblxudmFyIHN5bmNRdWV1ZSA9IG51bGw7XG52YXIgaW5jbHVkZXNMZWdhY3lTeW5jQ2FsbGJhY2tzID0gZmFsc2U7XG52YXIgaXNGbHVzaGluZ1N5bmNRdWV1ZSA9IGZhbHNlO1xuZnVuY3Rpb24gc2NoZWR1bGVTeW5jQ2FsbGJhY2soY2FsbGJhY2spIHtcbiAgLy8gUHVzaCB0aGlzIGNhbGxiYWNrIGludG8gYW4gaW50ZXJuYWwgcXVldWUuIFdlJ2xsIGZsdXNoIHRoZXNlIGVpdGhlciBpblxuICAvLyB0aGUgbmV4dCB0aWNrLCBvciBlYXJsaWVyIGlmIHNvbWV0aGluZyBjYWxscyBgZmx1c2hTeW5jQ2FsbGJhY2tRdWV1ZWAuXG4gIGlmIChzeW5jUXVldWUgPT09IG51bGwpIHtcbiAgICBzeW5jUXVldWUgPSBbY2FsbGJhY2tdO1xuICB9IGVsc2Uge1xuICAgIC8vIFB1c2ggb250byBleGlzdGluZyBxdWV1ZS4gRG9uJ3QgbmVlZCB0byBzY2hlZHVsZSBhIGNhbGxiYWNrIGJlY2F1c2VcbiAgICAvLyB3ZSBhbHJlYWR5IHNjaGVkdWxlZCBvbmUgd2hlbiB3ZSBjcmVhdGVkIHRoZSBxdWV1ZS5cbiAgICBzeW5jUXVldWUucHVzaChjYWxsYmFjayk7XG4gIH1cbn1cbmZ1bmN0aW9uIHNjaGVkdWxlTGVnYWN5U3luY0NhbGxiYWNrKGNhbGxiYWNrKSB7XG4gIGluY2x1ZGVzTGVnYWN5U3luY0NhbGxiYWNrcyA9IHRydWU7XG4gIHNjaGVkdWxlU3luY0NhbGxiYWNrKGNhbGxiYWNrKTtcbn1cbmZ1bmN0aW9uIGZsdXNoU3luY0NhbGxiYWNrc09ubHlJbkxlZ2FjeU1vZGUoKSB7XG4gIC8vIE9ubHkgZmx1c2hlcyB0aGUgcXVldWUgaWYgdGhlcmUncyBhIGxlZ2FjeSBzeW5jIGNhbGxiYWNrIHNjaGVkdWxlZC5cbiAgLy8gVE9ETzogVGhlcmUncyBvbmx5IGEgc2luZ2xlIHR5cGUgb2YgY2FsbGJhY2s6IHBlcmZvcm1TeW5jT25Xb3JrT25Sb290LiBTb1xuICAvLyBpdCBtaWdodCBtYWtlIG1vcmUgc2Vuc2UgZm9yIHRoZSBxdWV1ZSB0byBiZSBhIGxpc3Qgb2Ygcm9vdHMgaW5zdGVhZCBvZiBhXG4gIC8vIGxpc3Qgb2YgZ2VuZXJpYyBjYWxsYmFja3MuIFRoZW4gd2UgY2FuIGhhdmUgdHdvOiBvbmUgZm9yIGxlZ2FjeSByb290cywgb25lXG4gIC8vIGZvciBjb25jdXJyZW50IHJvb3RzLiBBbmQgdGhpcyBtZXRob2Qgd291bGQgb25seSBmbHVzaCB0aGUgbGVnYWN5IG9uZXMuXG4gIGlmIChpbmNsdWRlc0xlZ2FjeVN5bmNDYWxsYmFja3MpIHtcbiAgICBmbHVzaFN5bmNDYWxsYmFja3MoKTtcbiAgfVxufVxuZnVuY3Rpb24gZmx1c2hTeW5jQ2FsbGJhY2tzKCkge1xuICBpZiAoIWlzRmx1c2hpbmdTeW5jUXVldWUgJiYgc3luY1F1ZXVlICE9PSBudWxsKSB7XG4gICAgLy8gUHJldmVudCByZS1lbnRyYW5jZS5cbiAgICBpc0ZsdXNoaW5nU3luY1F1ZXVlID0gdHJ1ZTtcbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIHByZXZpb3VzVXBkYXRlUHJpb3JpdHkgPSBnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoKTtcblxuICAgIHRyeSB7XG4gICAgICB2YXIgaXNTeW5jID0gdHJ1ZTtcbiAgICAgIHZhciBxdWV1ZSA9IHN5bmNRdWV1ZTsgLy8gVE9ETzogSXMgdGhpcyBuZWNlc3NhcnkgYW55bW9yZT8gVGhlIG9ubHkgdXNlciBjb2RlIHRoYXQgcnVucyBpbiB0aGlzXG4gICAgICAvLyBxdWV1ZSBpcyBpbiB0aGUgcmVuZGVyIG9yIGNvbW1pdCBwaGFzZXMuXG5cbiAgICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShEaXNjcmV0ZUV2ZW50UHJpb3JpdHkpO1xuXG4gICAgICBmb3IgKDsgaSA8IHF1ZXVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjYWxsYmFjayA9IHF1ZXVlW2ldO1xuXG4gICAgICAgIGRvIHtcbiAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrKGlzU3luYyk7XG4gICAgICAgIH0gd2hpbGUgKGNhbGxiYWNrICE9PSBudWxsKTtcbiAgICAgIH1cblxuICAgICAgc3luY1F1ZXVlID0gbnVsbDtcbiAgICAgIGluY2x1ZGVzTGVnYWN5U3luY0NhbGxiYWNrcyA9IGZhbHNlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBJZiBzb21ldGhpbmcgdGhyb3dzLCBsZWF2ZSB0aGUgcmVtYWluaW5nIGNhbGxiYWNrcyBvbiB0aGUgcXVldWUuXG4gICAgICBpZiAoc3luY1F1ZXVlICE9PSBudWxsKSB7XG4gICAgICAgIHN5bmNRdWV1ZSA9IHN5bmNRdWV1ZS5zbGljZShpICsgMSk7XG4gICAgICB9IC8vIFJlc3VtZSBmbHVzaGluZyBpbiB0aGUgbmV4dCB0aWNrXG5cblxuICAgICAgc2NoZWR1bGVDYWxsYmFjayhJbW1lZGlhdGVQcmlvcml0eSwgZmx1c2hTeW5jQ2FsbGJhY2tzKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkocHJldmlvdXNVcGRhdGVQcmlvcml0eSk7XG4gICAgICBpc0ZsdXNoaW5nU3luY1F1ZXVlID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8vIFRoaXMgaXMgaW1wb3J0ZWQgYnkgdGhlIGV2ZW50IHJlcGxheWluZyBpbXBsZW1lbnRhdGlvbiBpbiBSZWFjdCBET00uIEl0J3Ncbi8vIGluIGEgc2VwYXJhdGUgZmlsZSB0byBicmVhayBhIGNpcmN1bGFyIGRlcGVuZGVuY3kgYmV0d2VlbiB0aGUgcmVuZGVyZXIgYW5kXG4vLyB0aGUgcmVjb25jaWxlci5cbmZ1bmN0aW9uIGlzUm9vdERlaHlkcmF0ZWQocm9vdCkge1xuICB2YXIgY3VycmVudFN0YXRlID0gcm9vdC5jdXJyZW50Lm1lbW9pemVkU3RhdGU7XG4gIHJldHVybiBjdXJyZW50U3RhdGUuaXNEZWh5ZHJhdGVkO1xufVxuXG4vLyBUT0RPOiBVc2UgdGhlIHVuaWZpZWQgZmliZXIgc3RhY2sgbW9kdWxlIGluc3RlYWQgb2YgdGhpcyBsb2NhbCBvbmU/XG4vLyBJbnRlbnRpb25hbGx5IG5vdCB1c2luZyBpdCB5ZXQgdG8gZGVyaXNrIHRoZSBpbml0aWFsIGltcGxlbWVudGF0aW9uLCBiZWNhdXNlXG4vLyB0aGUgd2F5IHdlIHB1c2gvcG9wIHRoZXNlIHZhbHVlcyBpcyBhIGJpdCB1bnVzdWFsLiBJZiB0aGVyZSdzIGEgbWlzdGFrZSwgSSdkXG4vLyByYXRoZXIgdGhlIGlkcyBiZSB3cm9uZyB0aGFuIGNyYXNoIHRoZSB3aG9sZSByZWNvbmNpbGVyLlxudmFyIGZvcmtTdGFjayA9IFtdO1xudmFyIGZvcmtTdGFja0luZGV4ID0gMDtcbnZhciB0cmVlRm9ya1Byb3ZpZGVyID0gbnVsbDtcbnZhciB0cmVlRm9ya0NvdW50ID0gMDtcbnZhciBpZFN0YWNrID0gW107XG52YXIgaWRTdGFja0luZGV4ID0gMDtcbnZhciB0cmVlQ29udGV4dFByb3ZpZGVyID0gbnVsbDtcbnZhciB0cmVlQ29udGV4dElkID0gMTtcbnZhciB0cmVlQ29udGV4dE92ZXJmbG93ID0gJyc7XG5mdW5jdGlvbiBpc0ZvcmtlZENoaWxkKHdvcmtJblByb2dyZXNzKSB7XG4gIHdhcm5JZk5vdEh5ZHJhdGluZygpO1xuICByZXR1cm4gKHdvcmtJblByb2dyZXNzLmZsYWdzICYgRm9ya2VkKSAhPT0gTm9GbGFncztcbn1cbmZ1bmN0aW9uIGdldEZvcmtzQXRMZXZlbCh3b3JrSW5Qcm9ncmVzcykge1xuICB3YXJuSWZOb3RIeWRyYXRpbmcoKTtcbiAgcmV0dXJuIHRyZWVGb3JrQ291bnQ7XG59XG5mdW5jdGlvbiBnZXRUcmVlSWQoKSB7XG4gIHZhciBvdmVyZmxvdyA9IHRyZWVDb250ZXh0T3ZlcmZsb3c7XG4gIHZhciBpZFdpdGhMZWFkaW5nQml0ID0gdHJlZUNvbnRleHRJZDtcbiAgdmFyIGlkID0gaWRXaXRoTGVhZGluZ0JpdCAmIH5nZXRMZWFkaW5nQml0KGlkV2l0aExlYWRpbmdCaXQpO1xuICByZXR1cm4gaWQudG9TdHJpbmcoMzIpICsgb3ZlcmZsb3c7XG59XG5mdW5jdGlvbiBwdXNoVHJlZUZvcmsod29ya0luUHJvZ3Jlc3MsIHRvdGFsQ2hpbGRyZW4pIHtcbiAgLy8gVGhpcyBpcyBjYWxsZWQgcmlnaHQgYWZ0ZXIgd2UgcmVjb25jaWxlIGFuIGFycmF5IChvciBpdGVyYXRvcikgb2YgY2hpbGRcbiAgLy8gZmliZXJzLCBiZWNhdXNlIHRoYXQncyB0aGUgb25seSBwbGFjZSB3aGVyZSB3ZSBrbm93IGhvdyBtYW55IGNoaWxkcmVuIGluXG4gIC8vIHRoZSB3aG9sZSBzZXQgd2l0aG91dCBkb2luZyBleHRyYSB3b3JrIGxhdGVyLCBvciBzdG9yaW5nIGFkZHRpb25hbFxuICAvLyBpbmZvcm1hdGlvbiBvbiB0aGUgZmliZXIuXG4gIC8vXG4gIC8vIFRoYXQncyB3aHkgdGhpcyBmdW5jdGlvbiBpcyBzZXBhcmF0ZSBmcm9tIHB1c2hUcmVlSWQgXHUyMDE0IGl0J3MgY2FsbGVkIGR1cmluZ1xuICAvLyB0aGUgcmVuZGVyIHBoYXNlIG9mIHRoZSBmb3JrIHBhcmVudCwgbm90IHRoZSBjaGlsZCwgd2hpY2ggaXMgd2hlcmUgd2UgcHVzaFxuICAvLyB0aGUgb3RoZXIgY29udGV4dCB2YWx1ZXMuXG4gIC8vXG4gIC8vIEluIHRoZSBGaXp6IGltcGxlbWVudGF0aW9uIHRoaXMgaXMgbXVjaCBzaW1wbGVyIGJlY2F1c2UgdGhlIGNoaWxkIGlzXG4gIC8vIHJlbmRlcmVkIGluIHRoZSBzYW1lIGNhbGxzdGFjayBhcyB0aGUgcGFyZW50LlxuICAvL1xuICAvLyBJdCBtaWdodCBiZSBiZXR0ZXIgdG8ganVzdCBhZGQgYSBgZm9ya3NgIGZpZWxkIHRvIHRoZSBGaWJlciB0eXBlLiBJdCB3b3VsZFxuICAvLyBtYWtlIHRoaXMgbW9kdWxlIHNpbXBsZXIuXG4gIHdhcm5JZk5vdEh5ZHJhdGluZygpO1xuICBmb3JrU3RhY2tbZm9ya1N0YWNrSW5kZXgrK10gPSB0cmVlRm9ya0NvdW50O1xuICBmb3JrU3RhY2tbZm9ya1N0YWNrSW5kZXgrK10gPSB0cmVlRm9ya1Byb3ZpZGVyO1xuICB0cmVlRm9ya1Byb3ZpZGVyID0gd29ya0luUHJvZ3Jlc3M7XG4gIHRyZWVGb3JrQ291bnQgPSB0b3RhbENoaWxkcmVuO1xufVxuZnVuY3Rpb24gcHVzaFRyZWVJZCh3b3JrSW5Qcm9ncmVzcywgdG90YWxDaGlsZHJlbiwgaW5kZXgpIHtcbiAgd2FybklmTm90SHlkcmF0aW5nKCk7XG4gIGlkU3RhY2tbaWRTdGFja0luZGV4KytdID0gdHJlZUNvbnRleHRJZDtcbiAgaWRTdGFja1tpZFN0YWNrSW5kZXgrK10gPSB0cmVlQ29udGV4dE92ZXJmbG93O1xuICBpZFN0YWNrW2lkU3RhY2tJbmRleCsrXSA9IHRyZWVDb250ZXh0UHJvdmlkZXI7XG4gIHRyZWVDb250ZXh0UHJvdmlkZXIgPSB3b3JrSW5Qcm9ncmVzcztcbiAgdmFyIGJhc2VJZFdpdGhMZWFkaW5nQml0ID0gdHJlZUNvbnRleHRJZDtcbiAgdmFyIGJhc2VPdmVyZmxvdyA9IHRyZWVDb250ZXh0T3ZlcmZsb3c7IC8vIFRoZSBsZWZ0bW9zdCAxIG1hcmtzIHRoZSBlbmQgb2YgdGhlIHNlcXVlbmNlLCBub24taW5jbHVzaXZlLiBJdCdzIG5vdCBwYXJ0XG4gIC8vIG9mIHRoZSBpZDsgd2UgdXNlIGl0IHRvIGFjY291bnQgZm9yIGxlYWRpbmcgMHMuXG5cbiAgdmFyIGJhc2VMZW5ndGggPSBnZXRCaXRMZW5ndGgoYmFzZUlkV2l0aExlYWRpbmdCaXQpIC0gMTtcbiAgdmFyIGJhc2VJZCA9IGJhc2VJZFdpdGhMZWFkaW5nQml0ICYgfigxIDw8IGJhc2VMZW5ndGgpO1xuICB2YXIgc2xvdCA9IGluZGV4ICsgMTtcbiAgdmFyIGxlbmd0aCA9IGdldEJpdExlbmd0aCh0b3RhbENoaWxkcmVuKSArIGJhc2VMZW5ndGg7IC8vIDMwIGlzIHRoZSBtYXggbGVuZ3RoIHdlIGNhbiBzdG9yZSB3aXRob3V0IG92ZXJmbG93aW5nLCB0YWtpbmcgaW50b1xuICAvLyBjb25zaWRlcmF0aW9uIHRoZSBsZWFkaW5nIDEgd2UgdXNlIHRvIG1hcmsgdGhlIGVuZCBvZiB0aGUgc2VxdWVuY2UuXG5cbiAgaWYgKGxlbmd0aCA+IDMwKSB7XG4gICAgLy8gV2Ugb3ZlcmZsb3dlZCB0aGUgYml0d2lzZS1zYWZlIHJhbmdlLiBGYWxsIGJhY2sgdG8gc2xvd2VyIGFsZ29yaXRobS5cbiAgICAvLyBUaGlzIGJyYW5jaCBhc3N1bWVzIHRoZSBsZW5ndGggb2YgdGhlIGJhc2UgaWQgaXMgZ3JlYXRlciB0aGFuIDU7IGl0IHdvbid0XG4gICAgLy8gd29yayBmb3Igc21hbGxlciBpZHMsIGJlY2F1c2UgeW91IG5lZWQgNSBiaXRzIHBlciBjaGFyYWN0ZXIuXG4gICAgLy9cbiAgICAvLyBXZSBlbmNvZGUgdGhlIGlkIGluIG11bHRpcGxlIHN0ZXBzOiBmaXJzdCB0aGUgYmFzZSBpZCwgdGhlbiB0aGVcbiAgICAvLyByZW1haW5pbmcgZGlnaXRzLlxuICAgIC8vXG4gICAgLy8gRWFjaCA1IGJpdCBzZXF1ZW5jZSBjb3JyZXNwb25kcyB0byBhIHNpbmdsZSBiYXNlIDMyIGNoYXJhY3Rlci4gU28gZm9yXG4gICAgLy8gZXhhbXBsZSwgaWYgdGhlIGN1cnJlbnQgaWQgaXMgMjMgYml0cyBsb25nLCB3ZSBjYW4gY29udmVydCAyMCBvZiB0aG9zZVxuICAgIC8vIGJpdHMgaW50byBhIHN0cmluZyBvZiA0IGNoYXJhY3RlcnMsIHdpdGggMyBiaXRzIGxlZnQgb3Zlci5cbiAgICAvL1xuICAgIC8vIEZpcnN0IGNhbGN1bGF0ZSBob3cgbWFueSBiaXRzIGluIHRoZSBiYXNlIGlkIHJlcHJlc2VudCBhIGNvbXBsZXRlXG4gICAgLy8gc2VxdWVuY2Ugb2YgY2hhcmFjdGVycy5cbiAgICB2YXIgbnVtYmVyT2ZPdmVyZmxvd0JpdHMgPSBiYXNlTGVuZ3RoIC0gYmFzZUxlbmd0aCAlIDU7IC8vIFRoZW4gY3JlYXRlIGEgYml0bWFzayB0aGF0IHNlbGVjdHMgb25seSB0aG9zZSBiaXRzLlxuXG4gICAgdmFyIG5ld092ZXJmbG93Qml0cyA9ICgxIDw8IG51bWJlck9mT3ZlcmZsb3dCaXRzKSAtIDE7IC8vIFNlbGVjdCB0aGUgYml0cywgYW5kIGNvbnZlcnQgdGhlbSB0byBhIGJhc2UgMzIgc3RyaW5nLlxuXG4gICAgdmFyIG5ld092ZXJmbG93ID0gKGJhc2VJZCAmIG5ld092ZXJmbG93Qml0cykudG9TdHJpbmcoMzIpOyAvLyBOb3cgd2UgY2FuIHJlbW92ZSB0aG9zZSBiaXRzIGZyb20gdGhlIGJhc2UgaWQuXG5cbiAgICB2YXIgcmVzdE9mQmFzZUlkID0gYmFzZUlkID4+IG51bWJlck9mT3ZlcmZsb3dCaXRzO1xuICAgIHZhciByZXN0T2ZCYXNlTGVuZ3RoID0gYmFzZUxlbmd0aCAtIG51bWJlck9mT3ZlcmZsb3dCaXRzOyAvLyBGaW5hbGx5LCBlbmNvZGUgdGhlIHJlc3Qgb2YgdGhlIGJpdHMgdXNpbmcgdGhlIG5vcm1hbCBhbGdvcml0aG0uIEJlY2F1c2VcbiAgICAvLyB3ZSBtYWRlIG1vcmUgcm9vbSwgdGhpcyB0aW1lIGl0IHdvbid0IG92ZXJmbG93LlxuXG4gICAgdmFyIHJlc3RPZkxlbmd0aCA9IGdldEJpdExlbmd0aCh0b3RhbENoaWxkcmVuKSArIHJlc3RPZkJhc2VMZW5ndGg7XG4gICAgdmFyIHJlc3RPZk5ld0JpdHMgPSBzbG90IDw8IHJlc3RPZkJhc2VMZW5ndGg7XG4gICAgdmFyIGlkID0gcmVzdE9mTmV3Qml0cyB8IHJlc3RPZkJhc2VJZDtcbiAgICB2YXIgb3ZlcmZsb3cgPSBuZXdPdmVyZmxvdyArIGJhc2VPdmVyZmxvdztcbiAgICB0cmVlQ29udGV4dElkID0gMSA8PCByZXN0T2ZMZW5ndGggfCBpZDtcbiAgICB0cmVlQ29udGV4dE92ZXJmbG93ID0gb3ZlcmZsb3c7XG4gIH0gZWxzZSB7XG4gICAgLy8gTm9ybWFsIHBhdGhcbiAgICB2YXIgbmV3Qml0cyA9IHNsb3QgPDwgYmFzZUxlbmd0aDtcblxuICAgIHZhciBfaWQgPSBuZXdCaXRzIHwgYmFzZUlkO1xuXG4gICAgdmFyIF9vdmVyZmxvdyA9IGJhc2VPdmVyZmxvdztcbiAgICB0cmVlQ29udGV4dElkID0gMSA8PCBsZW5ndGggfCBfaWQ7XG4gICAgdHJlZUNvbnRleHRPdmVyZmxvdyA9IF9vdmVyZmxvdztcbiAgfVxufVxuZnVuY3Rpb24gcHVzaE1hdGVyaWFsaXplZFRyZWVJZCh3b3JrSW5Qcm9ncmVzcykge1xuICB3YXJuSWZOb3RIeWRyYXRpbmcoKTsgLy8gVGhpcyBjb21wb25lbnQgbWF0ZXJpYWxpemVkIGFuIGlkLiBUaGlzIHdpbGwgYWZmZWN0IGFueSBpZHMgdGhhdCBhcHBlYXJcbiAgLy8gaW4gaXRzIGNoaWxkcmVuLlxuXG4gIHZhciByZXR1cm5GaWJlciA9IHdvcmtJblByb2dyZXNzLnJldHVybjtcblxuICBpZiAocmV0dXJuRmliZXIgIT09IG51bGwpIHtcbiAgICB2YXIgbnVtYmVyT2ZGb3JrcyA9IDE7XG4gICAgdmFyIHNsb3RJbmRleCA9IDA7XG4gICAgcHVzaFRyZWVGb3JrKHdvcmtJblByb2dyZXNzLCBudW1iZXJPZkZvcmtzKTtcbiAgICBwdXNoVHJlZUlkKHdvcmtJblByb2dyZXNzLCBudW1iZXJPZkZvcmtzLCBzbG90SW5kZXgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldEJpdExlbmd0aChudW1iZXIpIHtcbiAgcmV0dXJuIDMyIC0gY2x6MzIobnVtYmVyKTtcbn1cblxuZnVuY3Rpb24gZ2V0TGVhZGluZ0JpdChpZCkge1xuICByZXR1cm4gMSA8PCBnZXRCaXRMZW5ndGgoaWQpIC0gMTtcbn1cblxuZnVuY3Rpb24gcG9wVHJlZUNvbnRleHQod29ya0luUHJvZ3Jlc3MpIHtcbiAgLy8gUmVzdG9yZSB0aGUgcHJldmlvdXMgdmFsdWVzLlxuICAvLyBUaGlzIGlzIGEgYml0IG1vcmUgY29tcGxpY2F0ZWQgdGhhbiBvdGhlciBjb250ZXh0LWxpa2UgbW9kdWxlcyBpbiBGaWJlclxuICAvLyBiZWNhdXNlIHRoZSBzYW1lIEZpYmVyIG1heSBhcHBlYXIgb24gdGhlIHN0YWNrIG11bHRpcGxlIHRpbWVzIGFuZCBmb3JcbiAgLy8gZGlmZmVyZW50IHJlYXNvbnMuIFdlIGhhdmUgdG8ga2VlcCBwb3BwaW5nIHVudGlsIHRoZSB3b3JrLWluLXByb2dyZXNzIGlzXG4gIC8vIG5vIGxvbmdlciBhdCB0aGUgdG9wIG9mIHRoZSBzdGFjay5cbiAgd2hpbGUgKHdvcmtJblByb2dyZXNzID09PSB0cmVlRm9ya1Byb3ZpZGVyKSB7XG4gICAgdHJlZUZvcmtQcm92aWRlciA9IGZvcmtTdGFja1stLWZvcmtTdGFja0luZGV4XTtcbiAgICBmb3JrU3RhY2tbZm9ya1N0YWNrSW5kZXhdID0gbnVsbDtcbiAgICB0cmVlRm9ya0NvdW50ID0gZm9ya1N0YWNrWy0tZm9ya1N0YWNrSW5kZXhdO1xuICAgIGZvcmtTdGFja1tmb3JrU3RhY2tJbmRleF0gPSBudWxsO1xuICB9XG5cbiAgd2hpbGUgKHdvcmtJblByb2dyZXNzID09PSB0cmVlQ29udGV4dFByb3ZpZGVyKSB7XG4gICAgdHJlZUNvbnRleHRQcm92aWRlciA9IGlkU3RhY2tbLS1pZFN0YWNrSW5kZXhdO1xuICAgIGlkU3RhY2tbaWRTdGFja0luZGV4XSA9IG51bGw7XG4gICAgdHJlZUNvbnRleHRPdmVyZmxvdyA9IGlkU3RhY2tbLS1pZFN0YWNrSW5kZXhdO1xuICAgIGlkU3RhY2tbaWRTdGFja0luZGV4XSA9IG51bGw7XG4gICAgdHJlZUNvbnRleHRJZCA9IGlkU3RhY2tbLS1pZFN0YWNrSW5kZXhdO1xuICAgIGlkU3RhY2tbaWRTdGFja0luZGV4XSA9IG51bGw7XG4gIH1cbn1cbmZ1bmN0aW9uIGdldFN1c3BlbmRlZFRyZWVDb250ZXh0KCkge1xuICB3YXJuSWZOb3RIeWRyYXRpbmcoKTtcblxuICBpZiAodHJlZUNvbnRleHRQcm92aWRlciAhPT0gbnVsbCkge1xuICAgIHJldHVybiB7XG4gICAgICBpZDogdHJlZUNvbnRleHRJZCxcbiAgICAgIG92ZXJmbG93OiB0cmVlQ29udGV4dE92ZXJmbG93XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuZnVuY3Rpb24gcmVzdG9yZVN1c3BlbmRlZFRyZWVDb250ZXh0KHdvcmtJblByb2dyZXNzLCBzdXNwZW5kZWRDb250ZXh0KSB7XG4gIHdhcm5JZk5vdEh5ZHJhdGluZygpO1xuICBpZFN0YWNrW2lkU3RhY2tJbmRleCsrXSA9IHRyZWVDb250ZXh0SWQ7XG4gIGlkU3RhY2tbaWRTdGFja0luZGV4KytdID0gdHJlZUNvbnRleHRPdmVyZmxvdztcbiAgaWRTdGFja1tpZFN0YWNrSW5kZXgrK10gPSB0cmVlQ29udGV4dFByb3ZpZGVyO1xuICB0cmVlQ29udGV4dElkID0gc3VzcGVuZGVkQ29udGV4dC5pZDtcbiAgdHJlZUNvbnRleHRPdmVyZmxvdyA9IHN1c3BlbmRlZENvbnRleHQub3ZlcmZsb3c7XG4gIHRyZWVDb250ZXh0UHJvdmlkZXIgPSB3b3JrSW5Qcm9ncmVzcztcbn1cblxuZnVuY3Rpb24gd2FybklmTm90SHlkcmF0aW5nKCkge1xuICB7XG4gICAgaWYgKCFnZXRJc0h5ZHJhdGluZygpKSB7XG4gICAgICBlcnJvcignRXhwZWN0ZWQgdG8gYmUgaHlkcmF0aW5nLiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSAnICsgJ2FuIGlzc3VlLicpO1xuICAgIH1cbiAgfVxufVxuXG4vLyBUaGlzIG1heSBoYXZlIGJlZW4gYW4gaW5zZXJ0aW9uIG9yIGEgaHlkcmF0aW9uLlxuXG52YXIgaHlkcmF0aW9uUGFyZW50RmliZXIgPSBudWxsO1xudmFyIG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgPSBudWxsO1xudmFyIGlzSHlkcmF0aW5nID0gZmFsc2U7IC8vIFRoaXMgZmxhZyBhbGxvd3MgZm9yIHdhcm5pbmcgc3VwcmVzc2lvbiB3aGVuIHdlIGV4cGVjdCB0aGVyZSB0byBiZSBtaXNtYXRjaGVzXG4vLyBkdWUgdG8gZWFybGllciBtaXNtYXRjaGVzIG9yIGEgc3VzcGVuZGVkIGZpYmVyLlxuXG52YXIgZGlkU3VzcGVuZE9yRXJyb3JERVYgPSBmYWxzZTsgLy8gSHlkcmF0aW9uIGVycm9ycyB0aGF0IHdlcmUgdGhyb3duIGluc2lkZSB0aGlzIGJvdW5kYXJ5XG5cbnZhciBoeWRyYXRpb25FcnJvcnMgPSBudWxsO1xuXG5mdW5jdGlvbiB3YXJuSWZIeWRyYXRpbmcoKSB7XG4gIHtcbiAgICBpZiAoaXNIeWRyYXRpbmcpIHtcbiAgICAgIGVycm9yKCdXZSBzaG91bGQgbm90IGJlIGh5ZHJhdGluZyBoZXJlLiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhIGJ1Zy4nKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbWFya0RpZFRocm93V2hpbGVIeWRyYXRpbmdERVYoKSB7XG4gIHtcbiAgICBkaWRTdXNwZW5kT3JFcnJvckRFViA9IHRydWU7XG4gIH1cbn1cbmZ1bmN0aW9uIGRpZFN1c3BlbmRPckVycm9yV2hpbGVIeWRyYXRpbmdERVYoKSB7XG4gIHtcbiAgICByZXR1cm4gZGlkU3VzcGVuZE9yRXJyb3JERVY7XG4gIH1cbn1cblxuZnVuY3Rpb24gZW50ZXJIeWRyYXRpb25TdGF0ZShmaWJlcikge1xuICBpZiAoIXN1cHBvcnRzSHlkcmF0aW9uKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIHBhcmVudEluc3RhbmNlID0gZmliZXIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG4gIG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgPSBnZXRGaXJzdEh5ZHJhdGFibGVDaGlsZFdpdGhpbkNvbnRhaW5lcihwYXJlbnRJbnN0YW5jZSk7XG4gIGh5ZHJhdGlvblBhcmVudEZpYmVyID0gZmliZXI7XG4gIGlzSHlkcmF0aW5nID0gdHJ1ZTtcbiAgaHlkcmF0aW9uRXJyb3JzID0gbnVsbDtcbiAgZGlkU3VzcGVuZE9yRXJyb3JERVYgPSBmYWxzZTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHJlZW50ZXJIeWRyYXRpb25TdGF0ZUZyb21EZWh5ZHJhdGVkU3VzcGVuc2VJbnN0YW5jZShmaWJlciwgc3VzcGVuc2VJbnN0YW5jZSwgdHJlZUNvbnRleHQpIHtcbiAgaWYgKCFzdXBwb3J0c0h5ZHJhdGlvbikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgPSBnZXRGaXJzdEh5ZHJhdGFibGVDaGlsZFdpdGhpblN1c3BlbnNlSW5zdGFuY2Uoc3VzcGVuc2VJbnN0YW5jZSk7XG4gIGh5ZHJhdGlvblBhcmVudEZpYmVyID0gZmliZXI7XG4gIGlzSHlkcmF0aW5nID0gdHJ1ZTtcbiAgaHlkcmF0aW9uRXJyb3JzID0gbnVsbDtcbiAgZGlkU3VzcGVuZE9yRXJyb3JERVYgPSBmYWxzZTtcblxuICBpZiAodHJlZUNvbnRleHQgIT09IG51bGwpIHtcbiAgICByZXN0b3JlU3VzcGVuZGVkVHJlZUNvbnRleHQoZmliZXIsIHRyZWVDb250ZXh0KTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiB3YXJuVW5oeWRyYXRlZEluc3RhbmNlKHJldHVybkZpYmVyLCBpbnN0YW5jZSkge1xuICB7XG4gICAgc3dpdGNoIChyZXR1cm5GaWJlci50YWcpIHtcbiAgICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICAgIHtcbiAgICAgICAgICBkaWROb3RIeWRyYXRlSW5zdGFuY2VXaXRoaW5Db250YWluZXIocmV0dXJuRmliZXIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8sIGluc3RhbmNlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgaXNDb25jdXJyZW50TW9kZSA9IChyZXR1cm5GaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGU7XG4gICAgICAgICAgZGlkTm90SHlkcmF0ZUluc3RhbmNlKHJldHVybkZpYmVyLnR5cGUsIHJldHVybkZpYmVyLm1lbW9pemVkUHJvcHMsIHJldHVybkZpYmVyLnN0YXRlTm9kZSwgaW5zdGFuY2UsIC8vIFRPRE86IERlbGV0ZSB0aGlzIGFyZ3VtZW50IHdoZW4gd2UgcmVtb3ZlIHRoZSBsZWdhY3kgcm9vdCBBUEkuXG4gICAgICAgICAgaXNDb25jdXJyZW50TW9kZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBzdXNwZW5zZVN0YXRlID0gcmV0dXJuRmliZXIubWVtb2l6ZWRTdGF0ZTtcbiAgICAgICAgICBpZiAoc3VzcGVuc2VTdGF0ZS5kZWh5ZHJhdGVkICE9PSBudWxsKSBkaWROb3RIeWRyYXRlSW5zdGFuY2VXaXRoaW5TdXNwZW5zZUluc3RhbmNlKHN1c3BlbnNlU3RhdGUuZGVoeWRyYXRlZCwgaW5zdGFuY2UpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGRlbGV0ZUh5ZHJhdGFibGVJbnN0YW5jZShyZXR1cm5GaWJlciwgaW5zdGFuY2UpIHtcbiAgd2FyblVuaHlkcmF0ZWRJbnN0YW5jZShyZXR1cm5GaWJlciwgaW5zdGFuY2UpO1xuICB2YXIgY2hpbGRUb0RlbGV0ZSA9IGNyZWF0ZUZpYmVyRnJvbUhvc3RJbnN0YW5jZUZvckRlbGV0aW9uKCk7XG4gIGNoaWxkVG9EZWxldGUuc3RhdGVOb2RlID0gaW5zdGFuY2U7XG4gIGNoaWxkVG9EZWxldGUucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gIHZhciBkZWxldGlvbnMgPSByZXR1cm5GaWJlci5kZWxldGlvbnM7XG5cbiAgaWYgKGRlbGV0aW9ucyA9PT0gbnVsbCkge1xuICAgIHJldHVybkZpYmVyLmRlbGV0aW9ucyA9IFtjaGlsZFRvRGVsZXRlXTtcbiAgICByZXR1cm5GaWJlci5mbGFncyB8PSBDaGlsZERlbGV0aW9uO1xuICB9IGVsc2Uge1xuICAgIGRlbGV0aW9ucy5wdXNoKGNoaWxkVG9EZWxldGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHdhcm5Ob25oeWRyYXRlZEluc3RhbmNlKHJldHVybkZpYmVyLCBmaWJlcikge1xuICB7XG4gICAgaWYgKGRpZFN1c3BlbmRPckVycm9yREVWKSB7XG4gICAgICAvLyBJbnNpZGUgYSBib3VuZGFyeSB0aGF0IGFscmVhZHkgc3VzcGVuZGVkLiBXZSdyZSBjdXJyZW50bHkgcmVuZGVyaW5nIHRoZVxuICAgICAgLy8gc2libGluZ3Mgb2YgYSBzdXNwZW5kZWQgbm9kZS4gVGhlIG1pc21hdGNoIG1heSBiZSBkdWUgdG8gdGhlIG1pc3NpbmdcbiAgICAgIC8vIGRhdGEsIHNvIGl0J3MgcHJvYmFibHkgYSBmYWxzZSBwb3NpdGl2ZS5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHJldHVybkZpYmVyLnRhZykge1xuICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBwYXJlbnRDb250YWluZXIgPSByZXR1cm5GaWJlci5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztcblxuICAgICAgICAgIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgICAgICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAgICAgICAgIHZhciB0eXBlID0gZmliZXIudHlwZTtcbiAgICAgICAgICAgICAgdmFyIHByb3BzID0gZmliZXIucGVuZGluZ1Byb3BzO1xuICAgICAgICAgICAgICBkaWROb3RGaW5kSHlkcmF0YWJsZUluc3RhbmNlV2l0aGluQ29udGFpbmVyKHBhcmVudENvbnRhaW5lciwgdHlwZSwgcHJvcHMpO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSBIb3N0VGV4dDpcbiAgICAgICAgICAgICAgdmFyIHRleHQgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG4gICAgICAgICAgICAgIGRpZE5vdEZpbmRIeWRyYXRhYmxlVGV4dEluc3RhbmNlV2l0aGluQ29udGFpbmVyKHBhcmVudENvbnRhaW5lciwgdGV4dCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAgICAgICAgICBkaWROb3RGaW5kSHlkcmF0YWJsZVN1c3BlbnNlSW5zdGFuY2VXaXRoaW5Db250YWluZXIocGFyZW50Q29udGFpbmVyKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIHBhcmVudFR5cGUgPSByZXR1cm5GaWJlci50eXBlO1xuICAgICAgICAgIHZhciBwYXJlbnRQcm9wcyA9IHJldHVybkZpYmVyLm1lbW9pemVkUHJvcHM7XG4gICAgICAgICAgdmFyIHBhcmVudEluc3RhbmNlID0gcmV0dXJuRmliZXIuc3RhdGVOb2RlO1xuXG4gICAgICAgICAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICAgICAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZhciBfdHlwZSA9IGZpYmVyLnR5cGU7XG4gICAgICAgICAgICAgICAgdmFyIF9wcm9wcyA9IGZpYmVyLnBlbmRpbmdQcm9wcztcbiAgICAgICAgICAgICAgICB2YXIgaXNDb25jdXJyZW50TW9kZSA9IChyZXR1cm5GaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGU7XG4gICAgICAgICAgICAgICAgZGlkTm90RmluZEh5ZHJhdGFibGVJbnN0YW5jZShwYXJlbnRUeXBlLCBwYXJlbnRQcm9wcywgcGFyZW50SW5zdGFuY2UsIF90eXBlLCBfcHJvcHMsIC8vIFRPRE86IERlbGV0ZSB0aGlzIGFyZ3VtZW50IHdoZW4gd2UgcmVtb3ZlIHRoZSBsZWdhY3kgcm9vdCBBUEkuXG4gICAgICAgICAgICAgICAgaXNDb25jdXJyZW50TW9kZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSBIb3N0VGV4dDpcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZhciBfdGV4dCA9IGZpYmVyLnBlbmRpbmdQcm9wcztcblxuICAgICAgICAgICAgICAgIHZhciBfaXNDb25jdXJyZW50TW9kZSA9IChyZXR1cm5GaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGU7XG5cbiAgICAgICAgICAgICAgICBkaWROb3RGaW5kSHlkcmF0YWJsZVRleHRJbnN0YW5jZShwYXJlbnRUeXBlLCBwYXJlbnRQcm9wcywgcGFyZW50SW5zdGFuY2UsIF90ZXh0LCAvLyBUT0RPOiBEZWxldGUgdGhpcyBhcmd1bWVudCB3aGVuIHdlIHJlbW92ZSB0aGUgbGVnYWN5IHJvb3QgQVBJLlxuICAgICAgICAgICAgICAgIF9pc0NvbmN1cnJlbnRNb2RlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZGlkTm90RmluZEh5ZHJhdGFibGVTdXNwZW5zZUluc3RhbmNlKHBhcmVudFR5cGUsIHBhcmVudFByb3BzLCBwYXJlbnRJbnN0YW5jZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIHN1c3BlbnNlU3RhdGUgPSByZXR1cm5GaWJlci5tZW1vaXplZFN0YXRlO1xuICAgICAgICAgIHZhciBfcGFyZW50SW5zdGFuY2UgPSBzdXNwZW5zZVN0YXRlLmRlaHlkcmF0ZWQ7XG4gICAgICAgICAgaWYgKF9wYXJlbnRJbnN0YW5jZSAhPT0gbnVsbCkgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICAgICAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAgICAgICAgdmFyIF90eXBlMiA9IGZpYmVyLnR5cGU7XG4gICAgICAgICAgICAgIHZhciBfcHJvcHMyID0gZmliZXIucGVuZGluZ1Byb3BzO1xuICAgICAgICAgICAgICBkaWROb3RGaW5kSHlkcmF0YWJsZUluc3RhbmNlV2l0aGluU3VzcGVuc2VJbnN0YW5jZShfcGFyZW50SW5zdGFuY2UsIF90eXBlMiwgX3Byb3BzMik7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIEhvc3RUZXh0OlxuICAgICAgICAgICAgICB2YXIgX3RleHQyID0gZmliZXIucGVuZGluZ1Byb3BzO1xuICAgICAgICAgICAgICBkaWROb3RGaW5kSHlkcmF0YWJsZVRleHRJbnN0YW5jZVdpdGhpblN1c3BlbnNlSW5zdGFuY2UoX3BhcmVudEluc3RhbmNlLCBfdGV4dDIpO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgICAgICAgICAgZGlkTm90RmluZEh5ZHJhdGFibGVTdXNwZW5zZUluc3RhbmNlV2l0aGluU3VzcGVuc2VJbnN0YW5jZShfcGFyZW50SW5zdGFuY2UpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpbnNlcnROb25IeWRyYXRlZEluc3RhbmNlKHJldHVybkZpYmVyLCBmaWJlcikge1xuICBmaWJlci5mbGFncyA9IGZpYmVyLmZsYWdzICYgfkh5ZHJhdGluZyB8IFBsYWNlbWVudDtcbiAgd2Fybk5vbmh5ZHJhdGVkSW5zdGFuY2UocmV0dXJuRmliZXIsIGZpYmVyKTtcbn1cblxuZnVuY3Rpb24gdHJ5SHlkcmF0ZShmaWJlciwgbmV4dEluc3RhbmNlKSB7XG4gIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgdHlwZSA9IGZpYmVyLnR5cGU7XG4gICAgICAgIHZhciBwcm9wcyA9IGZpYmVyLnBlbmRpbmdQcm9wcztcbiAgICAgICAgdmFyIGluc3RhbmNlID0gY2FuSHlkcmF0ZUluc3RhbmNlKG5leHRJbnN0YW5jZSwgdHlwZSwgcHJvcHMpO1xuXG4gICAgICAgIGlmIChpbnN0YW5jZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGZpYmVyLnN0YXRlTm9kZSA9IGluc3RhbmNlO1xuICAgICAgICAgIGh5ZHJhdGlvblBhcmVudEZpYmVyID0gZmliZXI7XG4gICAgICAgICAgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IGdldEZpcnN0SHlkcmF0YWJsZUNoaWxkKGluc3RhbmNlKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICB7XG4gICAgICAgIHZhciB0ZXh0ID0gZmliZXIucGVuZGluZ1Byb3BzO1xuICAgICAgICB2YXIgdGV4dEluc3RhbmNlID0gY2FuSHlkcmF0ZVRleHRJbnN0YW5jZShuZXh0SW5zdGFuY2UsIHRleHQpO1xuXG4gICAgICAgIGlmICh0ZXh0SW5zdGFuY2UgIT09IG51bGwpIHtcbiAgICAgICAgICBmaWJlci5zdGF0ZU5vZGUgPSB0ZXh0SW5zdGFuY2U7XG4gICAgICAgICAgaHlkcmF0aW9uUGFyZW50RmliZXIgPSBmaWJlcjsgLy8gVGV4dCBJbnN0YW5jZXMgZG9uJ3QgaGF2ZSBjaGlsZHJlbiBzbyB0aGVyZSdzIG5vdGhpbmcgdG8gaHlkcmF0ZS5cblxuICAgICAgICAgIG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgPSBudWxsO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIHN1c3BlbnNlSW5zdGFuY2UgPSBjYW5IeWRyYXRlU3VzcGVuc2VJbnN0YW5jZShuZXh0SW5zdGFuY2UpO1xuXG4gICAgICAgIGlmIChzdXNwZW5zZUluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgICAgICAgdmFyIHN1c3BlbnNlU3RhdGUgPSB7XG4gICAgICAgICAgICBkZWh5ZHJhdGVkOiBzdXNwZW5zZUluc3RhbmNlLFxuICAgICAgICAgICAgdHJlZUNvbnRleHQ6IGdldFN1c3BlbmRlZFRyZWVDb250ZXh0KCksXG4gICAgICAgICAgICByZXRyeUxhbmU6IE9mZnNjcmVlbkxhbmVcbiAgICAgICAgICB9O1xuICAgICAgICAgIGZpYmVyLm1lbW9pemVkU3RhdGUgPSBzdXNwZW5zZVN0YXRlOyAvLyBTdG9yZSB0aGUgZGVoeWRyYXRlZCBmcmFnbWVudCBhcyBhIGNoaWxkIGZpYmVyLlxuICAgICAgICAgIC8vIFRoaXMgc2ltcGxpZmllcyB0aGUgY29kZSBmb3IgZ2V0SG9zdFNpYmxpbmcgYW5kIGRlbGV0aW5nIG5vZGVzLFxuICAgICAgICAgIC8vIHNpbmNlIGl0IGRvZXNuJ3QgaGF2ZSB0byBjb25zaWRlciBhbGwgU3VzcGVuc2UgYm91bmRhcmllcyBhbmRcbiAgICAgICAgICAvLyBjaGVjayBpZiB0aGV5J3JlIGRlaHlkcmF0ZWQgb25lcyBvciBub3QuXG5cbiAgICAgICAgICB2YXIgZGVoeWRyYXRlZEZyYWdtZW50ID0gY3JlYXRlRmliZXJGcm9tRGVoeWRyYXRlZEZyYWdtZW50KHN1c3BlbnNlSW5zdGFuY2UpO1xuICAgICAgICAgIGRlaHlkcmF0ZWRGcmFnbWVudC5yZXR1cm4gPSBmaWJlcjtcbiAgICAgICAgICBmaWJlci5jaGlsZCA9IGRlaHlkcmF0ZWRGcmFnbWVudDtcbiAgICAgICAgICBoeWRyYXRpb25QYXJlbnRGaWJlciA9IGZpYmVyOyAvLyBXaGlsZSBhIFN1c3BlbnNlIEluc3RhbmNlIGRvZXMgaGF2ZSBjaGlsZHJlbiwgd2Ugd29uJ3Qgc3RlcCBpbnRvXG4gICAgICAgICAgLy8gaXQgZHVyaW5nIHRoZSBmaXJzdCBwYXNzLiBJbnN0ZWFkLCB3ZSdsbCByZWVudGVyIGl0IGxhdGVyLlxuXG4gICAgICAgICAgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IG51bGw7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNob3VsZENsaWVudFJlbmRlck9uTWlzbWF0Y2goZmliZXIpIHtcbiAgcmV0dXJuIChmaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGUgJiYgKGZpYmVyLmZsYWdzICYgRGlkQ2FwdHVyZSkgPT09IE5vRmxhZ3M7XG59XG5cbmZ1bmN0aW9uIHRocm93T25IeWRyYXRpb25NaXNtYXRjaChmaWJlcikge1xuICB0aHJvdyBuZXcgRXJyb3IoJ0h5ZHJhdGlvbiBmYWlsZWQgYmVjYXVzZSB0aGUgaW5pdGlhbCBVSSBkb2VzIG5vdCBtYXRjaCB3aGF0IHdhcyAnICsgJ3JlbmRlcmVkIG9uIHRoZSBzZXJ2ZXIuJyk7XG59XG5cbmZ1bmN0aW9uIHRyeVRvQ2xhaW1OZXh0SHlkcmF0YWJsZUluc3RhbmNlKGZpYmVyKSB7XG4gIGlmICghaXNIeWRyYXRpbmcpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgbmV4dEluc3RhbmNlID0gbmV4dEh5ZHJhdGFibGVJbnN0YW5jZTtcblxuICBpZiAoIW5leHRJbnN0YW5jZSkge1xuICAgIGlmIChzaG91bGRDbGllbnRSZW5kZXJPbk1pc21hdGNoKGZpYmVyKSkge1xuICAgICAgd2Fybk5vbmh5ZHJhdGVkSW5zdGFuY2UoaHlkcmF0aW9uUGFyZW50RmliZXIsIGZpYmVyKTtcbiAgICAgIHRocm93T25IeWRyYXRpb25NaXNtYXRjaCgpO1xuICAgIH0gLy8gTm90aGluZyB0byBoeWRyYXRlLiBNYWtlIGl0IGFuIGluc2VydGlvbi5cblxuXG4gICAgaW5zZXJ0Tm9uSHlkcmF0ZWRJbnN0YW5jZShoeWRyYXRpb25QYXJlbnRGaWJlciwgZmliZXIpO1xuICAgIGlzSHlkcmF0aW5nID0gZmFsc2U7XG4gICAgaHlkcmF0aW9uUGFyZW50RmliZXIgPSBmaWJlcjtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgZmlyc3RBdHRlbXB0ZWRJbnN0YW5jZSA9IG5leHRJbnN0YW5jZTtcblxuICBpZiAoIXRyeUh5ZHJhdGUoZmliZXIsIG5leHRJbnN0YW5jZSkpIHtcbiAgICBpZiAoc2hvdWxkQ2xpZW50UmVuZGVyT25NaXNtYXRjaChmaWJlcikpIHtcbiAgICAgIHdhcm5Ob25oeWRyYXRlZEluc3RhbmNlKGh5ZHJhdGlvblBhcmVudEZpYmVyLCBmaWJlcik7XG4gICAgICB0aHJvd09uSHlkcmF0aW9uTWlzbWF0Y2goKTtcbiAgICB9IC8vIElmIHdlIGNhbid0IGh5ZHJhdGUgdGhpcyBpbnN0YW5jZSBsZXQncyB0cnkgdGhlIG5leHQgb25lLlxuICAgIC8vIFdlIHVzZSB0aGlzIGFzIGEgaGV1cmlzdGljLiBJdCdzIGJhc2VkIG9uIGludHVpdGlvbiBhbmQgbm90IGRhdGEgc28gaXRcbiAgICAvLyBtaWdodCBiZSBmbGF3ZWQgb3IgdW5uZWNlc3NhcnkuXG5cblxuICAgIG5leHRJbnN0YW5jZSA9IGdldE5leHRIeWRyYXRhYmxlU2libGluZyhmaXJzdEF0dGVtcHRlZEluc3RhbmNlKTtcbiAgICB2YXIgcHJldkh5ZHJhdGlvblBhcmVudEZpYmVyID0gaHlkcmF0aW9uUGFyZW50RmliZXI7XG5cbiAgICBpZiAoIW5leHRJbnN0YW5jZSB8fCAhdHJ5SHlkcmF0ZShmaWJlciwgbmV4dEluc3RhbmNlKSkge1xuICAgICAgLy8gTm90aGluZyB0byBoeWRyYXRlLiBNYWtlIGl0IGFuIGluc2VydGlvbi5cbiAgICAgIGluc2VydE5vbkh5ZHJhdGVkSW5zdGFuY2UoaHlkcmF0aW9uUGFyZW50RmliZXIsIGZpYmVyKTtcbiAgICAgIGlzSHlkcmF0aW5nID0gZmFsc2U7XG4gICAgICBoeWRyYXRpb25QYXJlbnRGaWJlciA9IGZpYmVyO1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gV2UgbWF0Y2hlZCB0aGUgbmV4dCBvbmUsIHdlJ2xsIG5vdyBhc3N1bWUgdGhhdCB0aGUgZmlyc3Qgb25lIHdhc1xuICAgIC8vIHN1cGVyZmx1b3VzIGFuZCB3ZSdsbCBkZWxldGUgaXQuIFNpbmNlIHdlIGNhbid0IGVhZ2VybHkgZGVsZXRlIGl0XG4gICAgLy8gd2UnbGwgaGF2ZSB0byBzY2hlZHVsZSBhIGRlbGV0aW9uLiBUbyBkbyB0aGF0LCB0aGlzIG5vZGUgbmVlZHMgYSBkdW1teVxuICAgIC8vIGZpYmVyIGFzc29jaWF0ZWQgd2l0aCBpdC5cblxuXG4gICAgZGVsZXRlSHlkcmF0YWJsZUluc3RhbmNlKHByZXZIeWRyYXRpb25QYXJlbnRGaWJlciwgZmlyc3RBdHRlbXB0ZWRJbnN0YW5jZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJlcGFyZVRvSHlkcmF0ZUhvc3RJbnN0YW5jZShmaWJlciwgcm9vdENvbnRhaW5lckluc3RhbmNlLCBob3N0Q29udGV4dCkge1xuICBpZiAoIXN1cHBvcnRzSHlkcmF0aW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBwcmVwYXJlVG9IeWRyYXRlSG9zdEluc3RhbmNlKCkgdG8gbmV2ZXIgYmUgY2FsbGVkLiAnICsgJ1RoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gIH1cblxuICB2YXIgaW5zdGFuY2UgPSBmaWJlci5zdGF0ZU5vZGU7XG4gIHZhciBzaG91bGRXYXJuSWZNaXNtYXRjaERldiA9ICFkaWRTdXNwZW5kT3JFcnJvckRFVjtcbiAgdmFyIHVwZGF0ZVBheWxvYWQgPSBoeWRyYXRlSW5zdGFuY2UoaW5zdGFuY2UsIGZpYmVyLnR5cGUsIGZpYmVyLm1lbW9pemVkUHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgaG9zdENvbnRleHQsIGZpYmVyLCBzaG91bGRXYXJuSWZNaXNtYXRjaERldik7IC8vIFRPRE86IFR5cGUgdGhpcyBzcGVjaWZpYyB0byB0aGlzIHR5cGUgb2YgY29tcG9uZW50LlxuXG4gIGZpYmVyLnVwZGF0ZVF1ZXVlID0gdXBkYXRlUGF5bG9hZDsgLy8gSWYgdGhlIHVwZGF0ZSBwYXlsb2FkIGluZGljYXRlcyB0aGF0IHRoZXJlIGlzIGEgY2hhbmdlIG9yIGlmIHRoZXJlXG4gIC8vIGlzIGEgbmV3IHJlZiB3ZSBtYXJrIHRoaXMgYXMgYW4gdXBkYXRlLlxuXG4gIGlmICh1cGRhdGVQYXlsb2FkICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHByZXBhcmVUb0h5ZHJhdGVIb3N0VGV4dEluc3RhbmNlKGZpYmVyKSB7XG4gIGlmICghc3VwcG9ydHNIeWRyYXRpb24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHByZXBhcmVUb0h5ZHJhdGVIb3N0VGV4dEluc3RhbmNlKCkgdG8gbmV2ZXIgYmUgY2FsbGVkLiAnICsgJ1RoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gIH1cblxuICB2YXIgdGV4dEluc3RhbmNlID0gZmliZXIuc3RhdGVOb2RlO1xuICB2YXIgdGV4dENvbnRlbnQgPSBmaWJlci5tZW1vaXplZFByb3BzO1xuICB2YXIgc2hvdWxkV2FybklmTWlzbWF0Y2hEZXYgPSAhZGlkU3VzcGVuZE9yRXJyb3JERVY7XG4gIHZhciBzaG91bGRVcGRhdGUgPSBoeWRyYXRlVGV4dEluc3RhbmNlKHRleHRJbnN0YW5jZSwgdGV4dENvbnRlbnQsIGZpYmVyLCBzaG91bGRXYXJuSWZNaXNtYXRjaERldik7XG5cbiAgaWYgKHNob3VsZFVwZGF0ZSkge1xuICAgIC8vIFdlIGFzc3VtZSB0aGF0IHByZXBhcmVUb0h5ZHJhdGVIb3N0VGV4dEluc3RhbmNlIGlzIGNhbGxlZCBpbiBhIGNvbnRleHQgd2hlcmUgdGhlXG4gICAgLy8gaHlkcmF0aW9uIHBhcmVudCBpcyB0aGUgcGFyZW50IGhvc3QgY29tcG9uZW50IG9mIHRoaXMgaG9zdCB0ZXh0LlxuICAgIHZhciByZXR1cm5GaWJlciA9IGh5ZHJhdGlvblBhcmVudEZpYmVyO1xuXG4gICAgaWYgKHJldHVybkZpYmVyICE9PSBudWxsKSB7XG4gICAgICBzd2l0Y2ggKHJldHVybkZpYmVyLnRhZykge1xuICAgICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBwYXJlbnRDb250YWluZXIgPSByZXR1cm5GaWJlci5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztcbiAgICAgICAgICAgIHZhciBpc0NvbmN1cnJlbnRNb2RlID0gKHJldHVybkZpYmVyLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZTtcbiAgICAgICAgICAgIGRpZE5vdE1hdGNoSHlkcmF0ZWRDb250YWluZXJUZXh0SW5zdGFuY2UocGFyZW50Q29udGFpbmVyLCB0ZXh0SW5zdGFuY2UsIHRleHRDb250ZW50LCAvLyBUT0RPOiBEZWxldGUgdGhpcyBhcmd1bWVudCB3aGVuIHdlIHJlbW92ZSB0aGUgbGVnYWN5IHJvb3QgQVBJLlxuICAgICAgICAgICAgaXNDb25jdXJyZW50TW9kZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBwYXJlbnRUeXBlID0gcmV0dXJuRmliZXIudHlwZTtcbiAgICAgICAgICAgIHZhciBwYXJlbnRQcm9wcyA9IHJldHVybkZpYmVyLm1lbW9pemVkUHJvcHM7XG4gICAgICAgICAgICB2YXIgcGFyZW50SW5zdGFuY2UgPSByZXR1cm5GaWJlci5zdGF0ZU5vZGU7XG5cbiAgICAgICAgICAgIHZhciBfaXNDb25jdXJyZW50TW9kZTIgPSAocmV0dXJuRmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlO1xuXG4gICAgICAgICAgICBkaWROb3RNYXRjaEh5ZHJhdGVkVGV4dEluc3RhbmNlKHBhcmVudFR5cGUsIHBhcmVudFByb3BzLCBwYXJlbnRJbnN0YW5jZSwgdGV4dEluc3RhbmNlLCB0ZXh0Q29udGVudCwgLy8gVE9ETzogRGVsZXRlIHRoaXMgYXJndW1lbnQgd2hlbiB3ZSByZW1vdmUgdGhlIGxlZ2FjeSByb290IEFQSS5cbiAgICAgICAgICAgIF9pc0NvbmN1cnJlbnRNb2RlMik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHNob3VsZFVwZGF0ZTtcbn1cblxuZnVuY3Rpb24gcHJlcGFyZVRvSHlkcmF0ZUhvc3RTdXNwZW5zZUluc3RhbmNlKGZpYmVyKSB7XG4gIGlmICghc3VwcG9ydHNIeWRyYXRpb24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHByZXBhcmVUb0h5ZHJhdGVIb3N0U3VzcGVuc2VJbnN0YW5jZSgpIHRvIG5ldmVyIGJlIGNhbGxlZC4gJyArICdUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICB9XG5cbiAgdmFyIHN1c3BlbnNlU3RhdGUgPSBmaWJlci5tZW1vaXplZFN0YXRlO1xuICB2YXIgc3VzcGVuc2VJbnN0YW5jZSA9IHN1c3BlbnNlU3RhdGUgIT09IG51bGwgPyBzdXNwZW5zZVN0YXRlLmRlaHlkcmF0ZWQgOiBudWxsO1xuXG4gIGlmICghc3VzcGVuc2VJbnN0YW5jZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdG8gaGF2ZSBhIGh5ZHJhdGVkIHN1c3BlbnNlIGluc3RhbmNlLiAnICsgJ1RoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gIH1cblxuICBoeWRyYXRlU3VzcGVuc2VJbnN0YW5jZShzdXNwZW5zZUluc3RhbmNlLCBmaWJlcik7XG59XG5cbmZ1bmN0aW9uIHNraXBQYXN0RGVoeWRyYXRlZFN1c3BlbnNlSW5zdGFuY2UoZmliZXIpIHtcbiAgaWYgKCFzdXBwb3J0c0h5ZHJhdGlvbikge1xuICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgc2tpcFBhc3REZWh5ZHJhdGVkU3VzcGVuc2VJbnN0YW5jZSgpIHRvIG5ldmVyIGJlIGNhbGxlZC4gJyArICdUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICB9XG5cbiAgdmFyIHN1c3BlbnNlU3RhdGUgPSBmaWJlci5tZW1vaXplZFN0YXRlO1xuICB2YXIgc3VzcGVuc2VJbnN0YW5jZSA9IHN1c3BlbnNlU3RhdGUgIT09IG51bGwgPyBzdXNwZW5zZVN0YXRlLmRlaHlkcmF0ZWQgOiBudWxsO1xuXG4gIGlmICghc3VzcGVuc2VJbnN0YW5jZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdG8gaGF2ZSBhIGh5ZHJhdGVkIHN1c3BlbnNlIGluc3RhbmNlLiAnICsgJ1RoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gIH1cblxuICByZXR1cm4gZ2V0TmV4dEh5ZHJhdGFibGVJbnN0YW5jZUFmdGVyU3VzcGVuc2VJbnN0YW5jZShzdXNwZW5zZUluc3RhbmNlKTtcbn1cblxuZnVuY3Rpb24gcG9wVG9OZXh0SG9zdFBhcmVudChmaWJlcikge1xuICB2YXIgcGFyZW50ID0gZmliZXIucmV0dXJuO1xuXG4gIHdoaWxlIChwYXJlbnQgIT09IG51bGwgJiYgcGFyZW50LnRhZyAhPT0gSG9zdENvbXBvbmVudCAmJiBwYXJlbnQudGFnICE9PSBIb3N0Um9vdCAmJiBwYXJlbnQudGFnICE9PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgIHBhcmVudCA9IHBhcmVudC5yZXR1cm47XG4gIH1cblxuICBoeWRyYXRpb25QYXJlbnRGaWJlciA9IHBhcmVudDtcbn1cblxuZnVuY3Rpb24gcG9wSHlkcmF0aW9uU3RhdGUoZmliZXIpIHtcbiAgaWYgKCFzdXBwb3J0c0h5ZHJhdGlvbikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChmaWJlciAhPT0gaHlkcmF0aW9uUGFyZW50RmliZXIpIHtcbiAgICAvLyBXZSdyZSBkZWVwZXIgdGhhbiB0aGUgY3VycmVudCBoeWRyYXRpb24gY29udGV4dCwgaW5zaWRlIGFuIGluc2VydGVkXG4gICAgLy8gdHJlZS5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWlzSHlkcmF0aW5nKSB7XG4gICAgLy8gSWYgd2UncmUgbm90IGN1cnJlbnRseSBoeWRyYXRpbmcgYnV0IHdlJ3JlIGluIGEgaHlkcmF0aW9uIGNvbnRleHQsIHRoZW5cbiAgICAvLyB3ZSB3ZXJlIGFuIGluc2VydGlvbiBhbmQgbm93IG5lZWQgdG8gcG9wIHVwIHJlZW50ZXIgaHlkcmF0aW9uIG9mIG91clxuICAgIC8vIHNpYmxpbmdzLlxuICAgIHBvcFRvTmV4dEhvc3RQYXJlbnQoZmliZXIpO1xuICAgIGlzSHlkcmF0aW5nID0gdHJ1ZTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gLy8gSWYgd2UgaGF2ZSBhbnkgcmVtYWluaW5nIGh5ZHJhdGFibGUgbm9kZXMsIHdlIG5lZWQgdG8gZGVsZXRlIHRoZW0gbm93LlxuICAvLyBXZSBvbmx5IGRvIHRoaXMgZGVlcGVyIHRoYW4gaGVhZCBhbmQgYm9keSBzaW5jZSB0aGV5IHRlbmQgdG8gaGF2ZSByYW5kb21cbiAgLy8gb3RoZXIgbm9kZXMgaW4gdGhlbS4gV2UgYWxzbyBpZ25vcmUgY29tcG9uZW50cyB3aXRoIHB1cmUgdGV4dCBjb250ZW50IGluXG4gIC8vIHNpZGUgb2YgdGhlbS4gV2UgYWxzbyBkb24ndCBkZWxldGUgYW55dGhpbmcgaW5zaWRlIHRoZSByb290IGNvbnRhaW5lci5cblxuXG4gIGlmIChmaWJlci50YWcgIT09IEhvc3RSb290ICYmIChmaWJlci50YWcgIT09IEhvc3RDb21wb25lbnQgfHwgc2hvdWxkRGVsZXRlVW5oeWRyYXRlZFRhaWxJbnN0YW5jZXMoZmliZXIudHlwZSkgJiYgIXNob3VsZFNldFRleHRDb250ZW50KGZpYmVyLnR5cGUsIGZpYmVyLm1lbW9pemVkUHJvcHMpKSkge1xuICAgIHZhciBuZXh0SW5zdGFuY2UgPSBuZXh0SHlkcmF0YWJsZUluc3RhbmNlO1xuXG4gICAgaWYgKG5leHRJbnN0YW5jZSkge1xuICAgICAgaWYgKHNob3VsZENsaWVudFJlbmRlck9uTWlzbWF0Y2goZmliZXIpKSB7XG4gICAgICAgIHdhcm5JZlVuaHlkcmF0ZWRUYWlsTm9kZXMoZmliZXIpO1xuICAgICAgICB0aHJvd09uSHlkcmF0aW9uTWlzbWF0Y2goKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdoaWxlIChuZXh0SW5zdGFuY2UpIHtcbiAgICAgICAgICBkZWxldGVIeWRyYXRhYmxlSW5zdGFuY2UoZmliZXIsIG5leHRJbnN0YW5jZSk7XG4gICAgICAgICAgbmV4dEluc3RhbmNlID0gZ2V0TmV4dEh5ZHJhdGFibGVTaWJsaW5nKG5leHRJbnN0YW5jZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwb3BUb05leHRIb3N0UGFyZW50KGZpYmVyKTtcblxuICBpZiAoZmliZXIudGFnID09PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgIG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgPSBza2lwUGFzdERlaHlkcmF0ZWRTdXNwZW5zZUluc3RhbmNlKGZpYmVyKTtcbiAgfSBlbHNlIHtcbiAgICBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gaHlkcmF0aW9uUGFyZW50RmliZXIgPyBnZXROZXh0SHlkcmF0YWJsZVNpYmxpbmcoZmliZXIuc3RhdGVOb2RlKSA6IG51bGw7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gaGFzVW5oeWRyYXRlZFRhaWxOb2RlcygpIHtcbiAgcmV0dXJuIGlzSHlkcmF0aW5nICYmIG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgIT09IG51bGw7XG59XG5cbmZ1bmN0aW9uIHdhcm5JZlVuaHlkcmF0ZWRUYWlsTm9kZXMoZmliZXIpIHtcbiAgdmFyIG5leHRJbnN0YW5jZSA9IG5leHRIeWRyYXRhYmxlSW5zdGFuY2U7XG5cbiAgd2hpbGUgKG5leHRJbnN0YW5jZSkge1xuICAgIHdhcm5Vbmh5ZHJhdGVkSW5zdGFuY2UoZmliZXIsIG5leHRJbnN0YW5jZSk7XG4gICAgbmV4dEluc3RhbmNlID0gZ2V0TmV4dEh5ZHJhdGFibGVTaWJsaW5nKG5leHRJbnN0YW5jZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzZXRIeWRyYXRpb25TdGF0ZSgpIHtcbiAgaWYgKCFzdXBwb3J0c0h5ZHJhdGlvbikge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGh5ZHJhdGlvblBhcmVudEZpYmVyID0gbnVsbDtcbiAgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IG51bGw7XG4gIGlzSHlkcmF0aW5nID0gZmFsc2U7XG4gIGRpZFN1c3BlbmRPckVycm9yREVWID0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHVwZ3JhZGVIeWRyYXRpb25FcnJvcnNUb1JlY292ZXJhYmxlKCkge1xuICBpZiAoaHlkcmF0aW9uRXJyb3JzICE9PSBudWxsKSB7XG4gICAgLy8gU3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZCBhIGZvcmNlZCBjbGllbnQgcmVuZGVyLiBUaGUgZXJyb3JzIHRoYXQgb2NjdXJyZWRcbiAgICAvLyBkdXJpbmcgdGhlIGh5ZHJhdGlvbiBhdHRlbXB0IGFyZSBub3cgcmVjb3ZlcmVkLiBXZSB3aWxsIGxvZyB0aGVtIGluXG4gICAgLy8gY29tbWl0IHBoYXNlLCBvbmNlIHRoZSBlbnRpcmUgdHJlZSBoYXMgZmluaXNoZWQuXG4gICAgcXVldWVSZWNvdmVyYWJsZUVycm9ycyhoeWRyYXRpb25FcnJvcnMpO1xuICAgIGh5ZHJhdGlvbkVycm9ycyA9IG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0SXNIeWRyYXRpbmcoKSB7XG4gIHJldHVybiBpc0h5ZHJhdGluZztcbn1cblxuZnVuY3Rpb24gcXVldWVIeWRyYXRpb25FcnJvcihlcnJvcikge1xuICBpZiAoaHlkcmF0aW9uRXJyb3JzID09PSBudWxsKSB7XG4gICAgaHlkcmF0aW9uRXJyb3JzID0gW2Vycm9yXTtcbiAgfSBlbHNlIHtcbiAgICBoeWRyYXRpb25FcnJvcnMucHVzaChlcnJvcik7XG4gIH1cbn1cblxudmFyIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50QmF0Y2hDb25maWc7XG52YXIgTm9UcmFuc2l0aW9uID0gbnVsbDtcbmZ1bmN0aW9uIHJlcXVlc3RDdXJyZW50VHJhbnNpdGlvbigpIHtcbiAgcmV0dXJuIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLnRyYW5zaXRpb247XG59XG5cbi8qKlxuICogUGVyZm9ybXMgZXF1YWxpdHkgYnkgaXRlcmF0aW5nIHRocm91Z2gga2V5cyBvbiBhbiBvYmplY3QgYW5kIHJldHVybmluZyBmYWxzZVxuICogd2hlbiBhbnkga2V5IGhhcyB2YWx1ZXMgd2hpY2ggYXJlIG5vdCBzdHJpY3RseSBlcXVhbCBiZXR3ZWVuIHRoZSBhcmd1bWVudHMuXG4gKiBSZXR1cm5zIHRydWUgd2hlbiB0aGUgdmFsdWVzIG9mIGFsbCBrZXlzIGFyZSBzdHJpY3RseSBlcXVhbC5cbiAqL1xuXG5mdW5jdGlvbiBzaGFsbG93RXF1YWwob2JqQSwgb2JqQikge1xuICBpZiAob2JqZWN0SXMob2JqQSwgb2JqQikpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb2JqQSAhPT0gJ29iamVjdCcgfHwgb2JqQSA9PT0gbnVsbCB8fCB0eXBlb2Ygb2JqQiAhPT0gJ29iamVjdCcgfHwgb2JqQiA9PT0gbnVsbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBrZXlzQSA9IE9iamVjdC5rZXlzKG9iakEpO1xuICB2YXIga2V5c0IgPSBPYmplY3Qua2V5cyhvYmpCKTtcblxuICBpZiAoa2V5c0EubGVuZ3RoICE9PSBrZXlzQi5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gLy8gVGVzdCBmb3IgQSdzIGtleXMgZGlmZmVyZW50IGZyb20gQi5cblxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwga2V5c0EubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgY3VycmVudEtleSA9IGtleXNBW2ldO1xuXG4gICAgaWYgKCFoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iakIsIGN1cnJlbnRLZXkpIHx8ICFvYmplY3RJcyhvYmpBW2N1cnJlbnRLZXldLCBvYmpCW2N1cnJlbnRLZXldKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBkZXNjcmliZUZpYmVyKGZpYmVyKSB7XG4gIHZhciBvd25lciA9ICBmaWJlci5fZGVidWdPd25lciA/IGZpYmVyLl9kZWJ1Z093bmVyLnR5cGUgOiBudWxsIDtcbiAgdmFyIHNvdXJjZSA9ICBmaWJlci5fZGVidWdTb3VyY2UgO1xuXG4gIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKGZpYmVyLnR5cGUpO1xuXG4gICAgY2FzZSBMYXp5Q29tcG9uZW50OlxuICAgICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKCdMYXp5Jyk7XG5cbiAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKCdTdXNwZW5zZScpO1xuXG4gICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6XG4gICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoJ1N1c3BlbnNlTGlzdCcpO1xuXG4gICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICBjYXNlIEluZGV0ZXJtaW5hdGVDb21wb25lbnQ6XG4gICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgcmV0dXJuIGRlc2NyaWJlRnVuY3Rpb25Db21wb25lbnRGcmFtZShmaWJlci50eXBlKTtcblxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgIHJldHVybiBkZXNjcmliZUZ1bmN0aW9uQ29tcG9uZW50RnJhbWUoZmliZXIudHlwZS5yZW5kZXIpO1xuXG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgIHJldHVybiBkZXNjcmliZUNsYXNzQ29tcG9uZW50RnJhbWUoZmliZXIudHlwZSk7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuICcnO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFN0YWNrQnlGaWJlckluRGV2QW5kUHJvZCh3b3JrSW5Qcm9ncmVzcykge1xuICB0cnkge1xuICAgIHZhciBpbmZvID0gJyc7XG4gICAgdmFyIG5vZGUgPSB3b3JrSW5Qcm9ncmVzcztcblxuICAgIGRvIHtcbiAgICAgIGluZm8gKz0gZGVzY3JpYmVGaWJlcihub2RlKTtcbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9IHdoaWxlIChub2RlKTtcblxuICAgIHJldHVybiBpbmZvO1xuICB9IGNhdGNoICh4KSB7XG4gICAgcmV0dXJuICdcXG5FcnJvciBnZW5lcmF0aW5nIHN0YWNrOiAnICsgeC5tZXNzYWdlICsgJ1xcbicgKyB4LnN0YWNrO1xuICB9XG59XG5cbnZhciBSZWFjdERlYnVnQ3VycmVudEZyYW1lJDEgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdERlYnVnQ3VycmVudEZyYW1lO1xudmFyIGN1cnJlbnQgPSBudWxsO1xudmFyIGlzUmVuZGVyaW5nID0gZmFsc2U7XG5mdW5jdGlvbiBnZXRDdXJyZW50RmliZXJPd25lck5hbWVJbkRldk9yTnVsbCgpIHtcbiAge1xuICAgIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgb3duZXIgPSBjdXJyZW50Ll9kZWJ1Z093bmVyO1xuXG4gICAgaWYgKG93bmVyICE9PSBudWxsICYmIHR5cGVvZiBvd25lciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKG93bmVyKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gZ2V0Q3VycmVudEZpYmVyU3RhY2tJbkRldigpIHtcbiAge1xuICAgIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfSAvLyBTYWZlIGJlY2F1c2UgaWYgY3VycmVudCBmaWJlciBleGlzdHMsIHdlIGFyZSByZWNvbmNpbGluZyxcbiAgICAvLyBhbmQgaXQgaXMgZ3VhcmFudGVlZCB0byBiZSB0aGUgd29yay1pbi1wcm9ncmVzcyB2ZXJzaW9uLlxuXG5cbiAgICByZXR1cm4gZ2V0U3RhY2tCeUZpYmVySW5EZXZBbmRQcm9kKGN1cnJlbnQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc2V0Q3VycmVudEZpYmVyKCkge1xuICB7XG4gICAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSQxLmdldEN1cnJlbnRTdGFjayA9IG51bGw7XG4gICAgY3VycmVudCA9IG51bGw7XG4gICAgaXNSZW5kZXJpbmcgPSBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gc2V0Q3VycmVudEZpYmVyKGZpYmVyKSB7XG4gIHtcbiAgICBSZWFjdERlYnVnQ3VycmVudEZyYW1lJDEuZ2V0Q3VycmVudFN0YWNrID0gZmliZXIgPT09IG51bGwgPyBudWxsIDogZ2V0Q3VycmVudEZpYmVyU3RhY2tJbkRldjtcbiAgICBjdXJyZW50ID0gZmliZXI7XG4gICAgaXNSZW5kZXJpbmcgPSBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0Q3VycmVudEZpYmVyKCkge1xuICB7XG4gICAgcmV0dXJuIGN1cnJlbnQ7XG4gIH1cbn1cbmZ1bmN0aW9uIHNldElzUmVuZGVyaW5nKHJlbmRlcmluZykge1xuICB7XG4gICAgaXNSZW5kZXJpbmcgPSByZW5kZXJpbmc7XG4gIH1cbn1cblxudmFyIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzID0ge1xuICByZWNvcmRVbnNhZmVMaWZlY3ljbGVXYXJuaW5nczogZnVuY3Rpb24gKGZpYmVyLCBpbnN0YW5jZSkge30sXG4gIGZsdXNoUGVuZGluZ1Vuc2FmZUxpZmVjeWNsZVdhcm5pbmdzOiBmdW5jdGlvbiAoKSB7fSxcbiAgcmVjb3JkTGVnYWN5Q29udGV4dFdhcm5pbmc6IGZ1bmN0aW9uIChmaWJlciwgaW5zdGFuY2UpIHt9LFxuICBmbHVzaExlZ2FjeUNvbnRleHRXYXJuaW5nOiBmdW5jdGlvbiAoKSB7fSxcbiAgZGlzY2FyZFBlbmRpbmdXYXJuaW5nczogZnVuY3Rpb24gKCkge31cbn07XG5cbntcbiAgdmFyIGZpbmRTdHJpY3RSb290ID0gZnVuY3Rpb24gKGZpYmVyKSB7XG4gICAgdmFyIG1heWJlU3RyaWN0Um9vdCA9IG51bGw7XG4gICAgdmFyIG5vZGUgPSBmaWJlcjtcblxuICAgIHdoaWxlIChub2RlICE9PSBudWxsKSB7XG4gICAgICBpZiAobm9kZS5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkge1xuICAgICAgICBtYXliZVN0cmljdFJvb3QgPSBub2RlO1xuICAgICAgfVxuXG4gICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIG1heWJlU3RyaWN0Um9vdDtcbiAgfTtcblxuICB2YXIgc2V0VG9Tb3J0ZWRTdHJpbmcgPSBmdW5jdGlvbiAoc2V0KSB7XG4gICAgdmFyIGFycmF5ID0gW107XG4gICAgc2V0LmZvckVhY2goZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBhcnJheS5wdXNoKHZhbHVlKTtcbiAgICB9KTtcbiAgICByZXR1cm4gYXJyYXkuc29ydCgpLmpvaW4oJywgJyk7XG4gIH07XG5cbiAgdmFyIHBlbmRpbmdDb21wb25lbnRXaWxsTW91bnRXYXJuaW5ncyA9IFtdO1xuICB2YXIgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsTW91bnRXYXJuaW5ncyA9IFtdO1xuICB2YXIgcGVuZGluZ0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncyA9IFtdO1xuICB2YXIgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MgPSBbXTtcbiAgdmFyIHBlbmRpbmdDb21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MgPSBbXTtcbiAgdmFyIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzID0gW107IC8vIFRyYWNrcyBjb21wb25lbnRzIHdlIGhhdmUgYWxyZWFkeSB3YXJuZWQgYWJvdXQuXG5cbiAgdmFyIGRpZFdhcm5BYm91dFVuc2FmZUxpZmVjeWNsZXMgPSBuZXcgU2V0KCk7XG5cbiAgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MucmVjb3JkVW5zYWZlTGlmZWN5Y2xlV2FybmluZ3MgPSBmdW5jdGlvbiAoZmliZXIsIGluc3RhbmNlKSB7XG4gICAgLy8gRGVkdXBlIHN0cmF0ZWd5OiBXYXJuIG9uY2UgcGVyIGNvbXBvbmVudC5cbiAgICBpZiAoZGlkV2FybkFib3V0VW5zYWZlTGlmZWN5Y2xlcy5oYXMoZmliZXIudHlwZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJyAmJiAvLyBEb24ndCB3YXJuIGFib3V0IHJlYWN0LWxpZmVjeWNsZXMtY29tcGF0IHBvbHlmaWxsZWQgY29tcG9uZW50cy5cbiAgICBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQuX19zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZyAhPT0gdHJ1ZSkge1xuICAgICAgcGVuZGluZ0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzLnB1c2goZmliZXIpO1xuICAgIH1cblxuICAgIGlmIChmaWJlci5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSAmJiB0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsTW91bnRXYXJuaW5ncy5wdXNoKGZpYmVyKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicgJiYgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcy5fX3N1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5nICE9PSB0cnVlKSB7XG4gICAgICBwZW5kaW5nQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzLnB1c2goZmliZXIpO1xuICAgIH1cblxuICAgIGlmIChmaWJlci5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSAmJiB0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzLnB1c2goZmliZXIpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJyAmJiBpbnN0YW5jZS5jb21wb25lbnRXaWxsVXBkYXRlLl9fc3VwcHJlc3NEZXByZWNhdGlvbldhcm5pbmcgIT09IHRydWUpIHtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MucHVzaChmaWJlcik7XG4gICAgfVxuXG4gICAgaWYgKGZpYmVyLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlICYmIHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MucHVzaChmaWJlcik7XG4gICAgfVxuICB9O1xuXG4gIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLmZsdXNoUGVuZGluZ1Vuc2FmZUxpZmVjeWNsZVdhcm5pbmdzID0gZnVuY3Rpb24gKCkge1xuICAgIC8vIFdlIGRvIGFuIGluaXRpYWwgcGFzcyB0byBnYXRoZXIgY29tcG9uZW50IG5hbWVzXG4gICAgdmFyIGNvbXBvbmVudFdpbGxNb3VudFVuaXF1ZU5hbWVzID0gbmV3IFNldCgpO1xuXG4gICAgaWYgKHBlbmRpbmdDb21wb25lbnRXaWxsTW91bnRXYXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICBwZW5kaW5nQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MuZm9yRWFjaChmdW5jdGlvbiAoZmliZXIpIHtcbiAgICAgICAgY29tcG9uZW50V2lsbE1vdW50VW5pcXVlTmFtZXMuYWRkKGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdDb21wb25lbnQnKTtcbiAgICAgICAgZGlkV2FybkFib3V0VW5zYWZlTGlmZWN5Y2xlcy5hZGQoZmliZXIudHlwZSk7XG4gICAgICB9KTtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsTW91bnRXYXJuaW5ncyA9IFtdO1xuICAgIH1cblxuICAgIHZhciBVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50VW5pcXVlTmFtZXMgPSBuZXcgU2V0KCk7XG5cbiAgICBpZiAocGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsTW91bnRXYXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzLmZvckVhY2goZnVuY3Rpb24gKGZpYmVyKSB7XG4gICAgICAgIFVOU0FGRV9jb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcy5hZGQoZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgJ0NvbXBvbmVudCcpO1xuICAgICAgICBkaWRXYXJuQWJvdXRVbnNhZmVMaWZlY3ljbGVzLmFkZChmaWJlci50eXBlKTtcbiAgICAgIH0pO1xuICAgICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsTW91bnRXYXJuaW5ncyA9IFtdO1xuICAgIH1cblxuICAgIHZhciBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzVW5pcXVlTmFtZXMgPSBuZXcgU2V0KCk7XG5cbiAgICBpZiAocGVuZGluZ0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICBwZW5kaW5nQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzLmZvckVhY2goZnVuY3Rpb24gKGZpYmVyKSB7XG4gICAgICAgIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNVbmlxdWVOYW1lcy5hZGQoZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgJ0NvbXBvbmVudCcpO1xuICAgICAgICBkaWRXYXJuQWJvdXRVbnNhZmVMaWZlY3ljbGVzLmFkZChmaWJlci50eXBlKTtcbiAgICAgIH0pO1xuICAgICAgcGVuZGluZ0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncyA9IFtdO1xuICAgIH1cblxuICAgIHZhciBVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1VuaXF1ZU5hbWVzID0gbmV3IFNldCgpO1xuXG4gICAgaWYgKHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzLmZvckVhY2goZnVuY3Rpb24gKGZpYmVyKSB7XG4gICAgICAgIFVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzVW5pcXVlTmFtZXMuYWRkKGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdDb21wb25lbnQnKTtcbiAgICAgICAgZGlkV2FybkFib3V0VW5zYWZlTGlmZWN5Y2xlcy5hZGQoZmliZXIudHlwZSk7XG4gICAgICB9KTtcbiAgICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzID0gW107XG4gICAgfVxuXG4gICAgdmFyIGNvbXBvbmVudFdpbGxVcGRhdGVVbmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcblxuICAgIGlmIChwZW5kaW5nQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MuZm9yRWFjaChmdW5jdGlvbiAoZmliZXIpIHtcbiAgICAgICAgY29tcG9uZW50V2lsbFVwZGF0ZVVuaXF1ZU5hbWVzLmFkZChnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnQ29tcG9uZW50Jyk7XG4gICAgICAgIGRpZFdhcm5BYm91dFVuc2FmZUxpZmVjeWNsZXMuYWRkKGZpYmVyLnR5cGUpO1xuICAgICAgfSk7XG4gICAgICBwZW5kaW5nQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzID0gW107XG4gICAgfVxuXG4gICAgdmFyIFVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlVW5pcXVlTmFtZXMgPSBuZXcgU2V0KCk7XG5cbiAgICBpZiAocGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MuZm9yRWFjaChmdW5jdGlvbiAoZmliZXIpIHtcbiAgICAgICAgVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGVVbmlxdWVOYW1lcy5hZGQoZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgJ0NvbXBvbmVudCcpO1xuICAgICAgICBkaWRXYXJuQWJvdXRVbnNhZmVMaWZlY3ljbGVzLmFkZChmaWJlci50eXBlKTtcbiAgICAgIH0pO1xuICAgICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MgPSBbXTtcbiAgICB9IC8vIEZpbmFsbHksIHdlIGZsdXNoIGFsbCB0aGUgd2FybmluZ3NcbiAgICAvLyBVTlNBRkVfIG9uZXMgYmVmb3JlIHRoZSBkZXByZWNhdGVkIG9uZXMsIHNpbmNlIHRoZXknbGwgYmUgJ2xvdWRlcidcblxuXG4gICAgaWYgKFVOU0FGRV9jb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcy5zaXplID4gMCkge1xuICAgICAgdmFyIHNvcnRlZE5hbWVzID0gc2V0VG9Tb3J0ZWRTdHJpbmcoVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudFVuaXF1ZU5hbWVzKTtcblxuICAgICAgZXJyb3IoJ1VzaW5nIFVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgaW4gc3RyaWN0IG1vZGUgaXMgbm90IHJlY29tbWVuZGVkIGFuZCBtYXkgaW5kaWNhdGUgYnVncyBpbiB5b3VyIGNvZGUuICcgKyAnU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay91bnNhZmUtY29tcG9uZW50LWxpZmVjeWNsZXMgZm9yIGRldGFpbHMuXFxuXFxuJyArICcqIE1vdmUgY29kZSB3aXRoIHNpZGUgZWZmZWN0cyB0byBjb21wb25lbnREaWRNb3VudCwgYW5kIHNldCBpbml0aWFsIHN0YXRlIGluIHRoZSBjb25zdHJ1Y3Rvci5cXG4nICsgJ1xcblBsZWFzZSB1cGRhdGUgdGhlIGZvbGxvd2luZyBjb21wb25lbnRzOiAlcycsIHNvcnRlZE5hbWVzKTtcbiAgICB9XG5cbiAgICBpZiAoVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNVbmlxdWVOYW1lcy5zaXplID4gMCkge1xuICAgICAgdmFyIF9zb3J0ZWROYW1lcyA9IHNldFRvU29ydGVkU3RyaW5nKFVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzVW5pcXVlTmFtZXMpO1xuXG4gICAgICBlcnJvcignVXNpbmcgVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgaW4gc3RyaWN0IG1vZGUgaXMgbm90IHJlY29tbWVuZGVkICcgKyAnYW5kIG1heSBpbmRpY2F0ZSBidWdzIGluIHlvdXIgY29kZS4gJyArICdTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3Vuc2FmZS1jb21wb25lbnQtbGlmZWN5Y2xlcyBmb3IgZGV0YWlscy5cXG5cXG4nICsgJyogTW92ZSBkYXRhIGZldGNoaW5nIGNvZGUgb3Igc2lkZSBlZmZlY3RzIHRvIGNvbXBvbmVudERpZFVwZGF0ZS5cXG4nICsgXCIqIElmIHlvdSdyZSB1cGRhdGluZyBzdGF0ZSB3aGVuZXZlciBwcm9wcyBjaGFuZ2UsIFwiICsgJ3JlZmFjdG9yIHlvdXIgY29kZSB0byB1c2UgbWVtb2l6YXRpb24gdGVjaG5pcXVlcyBvciBtb3ZlIGl0IHRvICcgKyAnc3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcy4gTGVhcm4gbW9yZSBhdDogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2Rlcml2ZWQtc3RhdGVcXG4nICsgJ1xcblBsZWFzZSB1cGRhdGUgdGhlIGZvbGxvd2luZyBjb21wb25lbnRzOiAlcycsIF9zb3J0ZWROYW1lcyk7XG4gICAgfVxuXG4gICAgaWYgKFVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlVW5pcXVlTmFtZXMuc2l6ZSA+IDApIHtcbiAgICAgIHZhciBfc29ydGVkTmFtZXMyID0gc2V0VG9Tb3J0ZWRTdHJpbmcoVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGVVbmlxdWVOYW1lcyk7XG5cbiAgICAgIGVycm9yKCdVc2luZyBVTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSBpbiBzdHJpY3QgbW9kZSBpcyBub3QgcmVjb21tZW5kZWQgJyArICdhbmQgbWF5IGluZGljYXRlIGJ1Z3MgaW4geW91ciBjb2RlLiAnICsgJ1NlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvdW5zYWZlLWNvbXBvbmVudC1saWZlY3ljbGVzIGZvciBkZXRhaWxzLlxcblxcbicgKyAnKiBNb3ZlIGRhdGEgZmV0Y2hpbmcgY29kZSBvciBzaWRlIGVmZmVjdHMgdG8gY29tcG9uZW50RGlkVXBkYXRlLlxcbicgKyAnXFxuUGxlYXNlIHVwZGF0ZSB0aGUgZm9sbG93aW5nIGNvbXBvbmVudHM6ICVzJywgX3NvcnRlZE5hbWVzMik7XG4gICAgfVxuXG4gICAgaWYgKGNvbXBvbmVudFdpbGxNb3VudFVuaXF1ZU5hbWVzLnNpemUgPiAwKSB7XG4gICAgICB2YXIgX3NvcnRlZE5hbWVzMyA9IHNldFRvU29ydGVkU3RyaW5nKGNvbXBvbmVudFdpbGxNb3VudFVuaXF1ZU5hbWVzKTtcblxuICAgICAgd2FybignY29tcG9uZW50V2lsbE1vdW50IGhhcyBiZWVuIHJlbmFtZWQsIGFuZCBpcyBub3QgcmVjb21tZW5kZWQgZm9yIHVzZS4gJyArICdTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3Vuc2FmZS1jb21wb25lbnQtbGlmZWN5Y2xlcyBmb3IgZGV0YWlscy5cXG5cXG4nICsgJyogTW92ZSBjb2RlIHdpdGggc2lkZSBlZmZlY3RzIHRvIGNvbXBvbmVudERpZE1vdW50LCBhbmQgc2V0IGluaXRpYWwgc3RhdGUgaW4gdGhlIGNvbnN0cnVjdG9yLlxcbicgKyAnKiBSZW5hbWUgY29tcG9uZW50V2lsbE1vdW50IHRvIFVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgdG8gc3VwcHJlc3MgJyArICd0aGlzIHdhcm5pbmcgaW4gbm9uLXN0cmljdCBtb2RlLiBJbiBSZWFjdCAxOC54LCBvbmx5IHRoZSBVTlNBRkVfIG5hbWUgd2lsbCB3b3JrLiAnICsgJ1RvIHJlbmFtZSBhbGwgZGVwcmVjYXRlZCBsaWZlY3ljbGVzIHRvIHRoZWlyIG5ldyBuYW1lcywgeW91IGNhbiBydW4gJyArICdgbnB4IHJlYWN0LWNvZGVtb2QgcmVuYW1lLXVuc2FmZS1saWZlY3ljbGVzYCBpbiB5b3VyIHByb2plY3Qgc291cmNlIGZvbGRlci5cXG4nICsgJ1xcblBsZWFzZSB1cGRhdGUgdGhlIGZvbGxvd2luZyBjb21wb25lbnRzOiAlcycsIF9zb3J0ZWROYW1lczMpO1xuICAgIH1cblxuICAgIGlmIChjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzVW5pcXVlTmFtZXMuc2l6ZSA+IDApIHtcbiAgICAgIHZhciBfc29ydGVkTmFtZXM0ID0gc2V0VG9Tb3J0ZWRTdHJpbmcoY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1VuaXF1ZU5hbWVzKTtcblxuICAgICAgd2FybignY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyBoYXMgYmVlbiByZW5hbWVkLCBhbmQgaXMgbm90IHJlY29tbWVuZGVkIGZvciB1c2UuICcgKyAnU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay91bnNhZmUtY29tcG9uZW50LWxpZmVjeWNsZXMgZm9yIGRldGFpbHMuXFxuXFxuJyArICcqIE1vdmUgZGF0YSBmZXRjaGluZyBjb2RlIG9yIHNpZGUgZWZmZWN0cyB0byBjb21wb25lbnREaWRVcGRhdGUuXFxuJyArIFwiKiBJZiB5b3UncmUgdXBkYXRpbmcgc3RhdGUgd2hlbmV2ZXIgcHJvcHMgY2hhbmdlLCByZWZhY3RvciB5b3VyIFwiICsgJ2NvZGUgdG8gdXNlIG1lbW9pemF0aW9uIHRlY2huaXF1ZXMgb3IgbW92ZSBpdCB0byAnICsgJ3N0YXRpYyBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMuIExlYXJuIG1vcmUgYXQ6IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9kZXJpdmVkLXN0YXRlXFxuJyArICcqIFJlbmFtZSBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIHRvIFVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIHRvIHN1cHByZXNzICcgKyAndGhpcyB3YXJuaW5nIGluIG5vbi1zdHJpY3QgbW9kZS4gSW4gUmVhY3QgMTgueCwgb25seSB0aGUgVU5TQUZFXyBuYW1lIHdpbGwgd29yay4gJyArICdUbyByZW5hbWUgYWxsIGRlcHJlY2F0ZWQgbGlmZWN5Y2xlcyB0byB0aGVpciBuZXcgbmFtZXMsIHlvdSBjYW4gcnVuICcgKyAnYG5weCByZWFjdC1jb2RlbW9kIHJlbmFtZS11bnNhZmUtbGlmZWN5Y2xlc2AgaW4geW91ciBwcm9qZWN0IHNvdXJjZSBmb2xkZXIuXFxuJyArICdcXG5QbGVhc2UgdXBkYXRlIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czogJXMnLCBfc29ydGVkTmFtZXM0KTtcbiAgICB9XG5cbiAgICBpZiAoY29tcG9uZW50V2lsbFVwZGF0ZVVuaXF1ZU5hbWVzLnNpemUgPiAwKSB7XG4gICAgICB2YXIgX3NvcnRlZE5hbWVzNSA9IHNldFRvU29ydGVkU3RyaW5nKGNvbXBvbmVudFdpbGxVcGRhdGVVbmlxdWVOYW1lcyk7XG5cbiAgICAgIHdhcm4oJ2NvbXBvbmVudFdpbGxVcGRhdGUgaGFzIGJlZW4gcmVuYW1lZCwgYW5kIGlzIG5vdCByZWNvbW1lbmRlZCBmb3IgdXNlLiAnICsgJ1NlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvdW5zYWZlLWNvbXBvbmVudC1saWZlY3ljbGVzIGZvciBkZXRhaWxzLlxcblxcbicgKyAnKiBNb3ZlIGRhdGEgZmV0Y2hpbmcgY29kZSBvciBzaWRlIGVmZmVjdHMgdG8gY29tcG9uZW50RGlkVXBkYXRlLlxcbicgKyAnKiBSZW5hbWUgY29tcG9uZW50V2lsbFVwZGF0ZSB0byBVTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSB0byBzdXBwcmVzcyAnICsgJ3RoaXMgd2FybmluZyBpbiBub24tc3RyaWN0IG1vZGUuIEluIFJlYWN0IDE4LngsIG9ubHkgdGhlIFVOU0FGRV8gbmFtZSB3aWxsIHdvcmsuICcgKyAnVG8gcmVuYW1lIGFsbCBkZXByZWNhdGVkIGxpZmVjeWNsZXMgdG8gdGhlaXIgbmV3IG5hbWVzLCB5b3UgY2FuIHJ1biAnICsgJ2BucHggcmVhY3QtY29kZW1vZCByZW5hbWUtdW5zYWZlLWxpZmVjeWNsZXNgIGluIHlvdXIgcHJvamVjdCBzb3VyY2UgZm9sZGVyLlxcbicgKyAnXFxuUGxlYXNlIHVwZGF0ZSB0aGUgZm9sbG93aW5nIGNvbXBvbmVudHM6ICVzJywgX3NvcnRlZE5hbWVzNSk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBwZW5kaW5nTGVnYWN5Q29udGV4dFdhcm5pbmcgPSBuZXcgTWFwKCk7IC8vIFRyYWNrcyBjb21wb25lbnRzIHdlIGhhdmUgYWxyZWFkeSB3YXJuZWQgYWJvdXQuXG5cbiAgdmFyIGRpZFdhcm5BYm91dExlZ2FjeUNvbnRleHQgPSBuZXcgU2V0KCk7XG5cbiAgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MucmVjb3JkTGVnYWN5Q29udGV4dFdhcm5pbmcgPSBmdW5jdGlvbiAoZmliZXIsIGluc3RhbmNlKSB7XG4gICAgdmFyIHN0cmljdFJvb3QgPSBmaW5kU3RyaWN0Um9vdChmaWJlcik7XG5cbiAgICBpZiAoc3RyaWN0Um9vdCA9PT0gbnVsbCkge1xuICAgICAgZXJyb3IoJ0V4cGVjdGVkIHRvIGZpbmQgYSBTdHJpY3RNb2RlIGNvbXBvbmVudCBpbiBhIHN0cmljdCBtb2RlIHRyZWUuICcgKyAnVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gRGVkdXAgc3RyYXRlZ3k6IFdhcm4gb25jZSBwZXIgY29tcG9uZW50LlxuXG5cbiAgICBpZiAoZGlkV2FybkFib3V0TGVnYWN5Q29udGV4dC5oYXMoZmliZXIudHlwZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgd2FybmluZ3NGb3JSb290ID0gcGVuZGluZ0xlZ2FjeUNvbnRleHRXYXJuaW5nLmdldChzdHJpY3RSb290KTtcblxuICAgIGlmIChmaWJlci50eXBlLmNvbnRleHRUeXBlcyAhPSBudWxsIHx8IGZpYmVyLnR5cGUuY2hpbGRDb250ZXh0VHlwZXMgIT0gbnVsbCB8fCBpbnN0YW5jZSAhPT0gbnVsbCAmJiB0eXBlb2YgaW5zdGFuY2UuZ2V0Q2hpbGRDb250ZXh0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpZiAod2FybmluZ3NGb3JSb290ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgd2FybmluZ3NGb3JSb290ID0gW107XG4gICAgICAgIHBlbmRpbmdMZWdhY3lDb250ZXh0V2FybmluZy5zZXQoc3RyaWN0Um9vdCwgd2FybmluZ3NGb3JSb290KTtcbiAgICAgIH1cblxuICAgICAgd2FybmluZ3NGb3JSb290LnB1c2goZmliZXIpO1xuICAgIH1cbiAgfTtcblxuICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5mbHVzaExlZ2FjeUNvbnRleHRXYXJuaW5nID0gZnVuY3Rpb24gKCkge1xuICAgIHBlbmRpbmdMZWdhY3lDb250ZXh0V2FybmluZy5mb3JFYWNoKGZ1bmN0aW9uIChmaWJlckFycmF5LCBzdHJpY3RSb290KSB7XG4gICAgICBpZiAoZmliZXJBcnJheS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgZmlyc3RGaWJlciA9IGZpYmVyQXJyYXlbMF07XG4gICAgICB2YXIgdW5pcXVlTmFtZXMgPSBuZXcgU2V0KCk7XG4gICAgICBmaWJlckFycmF5LmZvckVhY2goZnVuY3Rpb24gKGZpYmVyKSB7XG4gICAgICAgIHVuaXF1ZU5hbWVzLmFkZChnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnQ29tcG9uZW50Jyk7XG4gICAgICAgIGRpZFdhcm5BYm91dExlZ2FjeUNvbnRleHQuYWRkKGZpYmVyLnR5cGUpO1xuICAgICAgfSk7XG4gICAgICB2YXIgc29ydGVkTmFtZXMgPSBzZXRUb1NvcnRlZFN0cmluZyh1bmlxdWVOYW1lcyk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHNldEN1cnJlbnRGaWJlcihmaXJzdEZpYmVyKTtcblxuICAgICAgICBlcnJvcignTGVnYWN5IGNvbnRleHQgQVBJIGhhcyBiZWVuIGRldGVjdGVkIHdpdGhpbiBhIHN0cmljdC1tb2RlIHRyZWUuJyArICdcXG5cXG5UaGUgb2xkIEFQSSB3aWxsIGJlIHN1cHBvcnRlZCBpbiBhbGwgMTYueCByZWxlYXNlcywgYnV0IGFwcGxpY2F0aW9ucyAnICsgJ3VzaW5nIGl0IHNob3VsZCBtaWdyYXRlIHRvIHRoZSBuZXcgdmVyc2lvbi4nICsgJ1xcblxcblBsZWFzZSB1cGRhdGUgdGhlIGZvbGxvd2luZyBjb21wb25lbnRzOiAlcycgKyAnXFxuXFxuTGVhcm4gbW9yZSBhYm91dCB0aGlzIHdhcm5pbmcgaGVyZTogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2xlZ2FjeS1jb250ZXh0Jywgc29ydGVkTmFtZXMpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5kaXNjYXJkUGVuZGluZ1dhcm5pbmdzID0gZnVuY3Rpb24gKCkge1xuICAgIHBlbmRpbmdDb21wb25lbnRXaWxsTW91bnRXYXJuaW5ncyA9IFtdO1xuICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MgPSBbXTtcbiAgICBwZW5kaW5nQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzID0gW107XG4gICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MgPSBbXTtcbiAgICBwZW5kaW5nQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzID0gW107XG4gICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MgPSBbXTtcbiAgICBwZW5kaW5nTGVnYWN5Q29udGV4dFdhcm5pbmcgPSBuZXcgTWFwKCk7XG4gIH07XG59XG5cbi8qXG4gKiBUaGUgYCcnICsgdmFsdWVgIHBhdHRlcm4gKHVzZWQgaW4gaW4gcGVyZi1zZW5zaXRpdmUgY29kZSkgdGhyb3dzIGZvciBTeW1ib2xcbiAqIGFuZCBUZW1wb3JhbC4qIHR5cGVzLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvMjIwNjQuXG4gKlxuICogVGhlIGZ1bmN0aW9ucyBpbiB0aGlzIG1vZHVsZSB3aWxsIHRocm93IGFuIGVhc2llci10by11bmRlcnN0YW5kLFxuICogZWFzaWVyLXRvLWRlYnVnIGV4Y2VwdGlvbiB3aXRoIGEgY2xlYXIgZXJyb3JzIG1lc3NhZ2UgbWVzc2FnZSBleHBsYWluaW5nIHRoZVxuICogcHJvYmxlbS4gKEluc3RlYWQgb2YgYSBjb25mdXNpbmcgZXhjZXB0aW9uIHRocm93biBpbnNpZGUgdGhlIGltcGxlbWVudGF0aW9uXG4gKiBvZiB0aGUgYHZhbHVlYCBvYmplY3QpLlxuICovXG4vLyAkRmxvd0ZpeE1lIG9ubHkgY2FsbGVkIGluIERFViwgc28gdm9pZCByZXR1cm4gaXMgbm90IHBvc3NpYmxlLlxuZnVuY3Rpb24gdHlwZU5hbWUodmFsdWUpIHtcbiAge1xuICAgIC8vIHRvU3RyaW5nVGFnIGlzIG5lZWRlZCBmb3IgbmFtZXNwYWNlZCB0eXBlcyBsaWtlIFRlbXBvcmFsLkluc3RhbnRcbiAgICB2YXIgaGFzVG9TdHJpbmdUYWcgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC50b1N0cmluZ1RhZztcbiAgICB2YXIgdHlwZSA9IGhhc1RvU3RyaW5nVGFnICYmIHZhbHVlW1N5bWJvbC50b1N0cmluZ1RhZ10gfHwgdmFsdWUuY29uc3RydWN0b3IubmFtZSB8fCAnT2JqZWN0JztcbiAgICByZXR1cm4gdHlwZTtcbiAgfVxufSAvLyAkRmxvd0ZpeE1lIG9ubHkgY2FsbGVkIGluIERFViwgc28gdm9pZCByZXR1cm4gaXMgbm90IHBvc3NpYmxlLlxuXG5cbmZ1bmN0aW9uIHdpbGxDb2VyY2lvblRocm93KHZhbHVlKSB7XG4gIHtcbiAgICB0cnkge1xuICAgICAgdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKSB7XG4gIC8vIElmIHlvdSBlbmRlZCB1cCBoZXJlIGJ5IGZvbGxvd2luZyBhbiBleGNlcHRpb24gY2FsbCBzdGFjaywgaGVyZSdzIHdoYXQnc1xuICAvLyBoYXBwZW5lZDogeW91IHN1cHBsaWVkIGFuIG9iamVjdCBvciBzeW1ib2wgdmFsdWUgdG8gUmVhY3QgKGFzIGEgcHJvcCwga2V5LFxuICAvLyBET00gYXR0cmlidXRlLCBDU1MgcHJvcGVydHksIHN0cmluZyByZWYsIGV0Yy4pIGFuZCB3aGVuIFJlYWN0IHRyaWVkIHRvXG4gIC8vIGNvZXJjZSBpdCB0byBhIHN0cmluZyB1c2luZyBgJycgKyB2YWx1ZWAsIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLlxuICAvL1xuICAvLyBUaGUgbW9zdCBjb21tb24gdHlwZXMgdGhhdCB3aWxsIGNhdXNlIHRoaXMgZXhjZXB0aW9uIGFyZSBgU3ltYm9sYCBpbnN0YW5jZXNcbiAgLy8gYW5kIFRlbXBvcmFsIG9iamVjdHMgbGlrZSBgVGVtcG9yYWwuSW5zdGFudGAuIEJ1dCBhbnkgb2JqZWN0IHRoYXQgaGFzIGFcbiAgLy8gYHZhbHVlT2ZgIG9yIGBbU3ltYm9sLnRvUHJpbWl0aXZlXWAgbWV0aG9kIHRoYXQgdGhyb3dzIHdpbGwgYWxzbyBjYXVzZSB0aGlzXG4gIC8vIGV4Y2VwdGlvbi4gKExpYnJhcnkgYXV0aG9ycyBkbyB0aGlzIHRvIHByZXZlbnQgdXNlcnMgZnJvbSB1c2luZyBidWlsdC1pblxuICAvLyBudW1lcmljIG9wZXJhdG9ycyBsaWtlIGArYCBvciBjb21wYXJpc29uIG9wZXJhdG9ycyBsaWtlIGA+PWAgYmVjYXVzZSBjdXN0b21cbiAgLy8gbWV0aG9kcyBhcmUgbmVlZGVkIHRvIHBlcmZvcm0gYWNjdXJhdGUgYXJpdGhtZXRpYyBvciBjb21wYXJpc29uLilcbiAgLy9cbiAgLy8gVG8gZml4IHRoZSBwcm9ibGVtLCBjb2VyY2UgdGhpcyBvYmplY3Qgb3Igc3ltYm9sIHZhbHVlIHRvIGEgc3RyaW5nIGJlZm9yZVxuICAvLyBwYXNzaW5nIGl0IHRvIFJlYWN0LiBUaGUgbW9zdCByZWxpYWJsZSB3YXkgaXMgdXN1YWxseSBgU3RyaW5nKHZhbHVlKWAuXG4gIC8vXG4gIC8vIFRvIGZpbmQgd2hpY2ggdmFsdWUgaXMgdGhyb3dpbmcsIGNoZWNrIHRoZSBicm93c2VyIG9yIGRlYnVnZ2VyIGNvbnNvbGUuXG4gIC8vIEJlZm9yZSB0aGlzIGV4Y2VwdGlvbiB3YXMgdGhyb3duLCB0aGVyZSBzaG91bGQgYmUgYGNvbnNvbGUuZXJyb3JgIG91dHB1dFxuICAvLyB0aGF0IHNob3dzIHRoZSB0eXBlIChTeW1ib2wsIFRlbXBvcmFsLlBsYWluRGF0ZSwgZXRjLikgdGhhdCBjYXVzZWQgdGhlXG4gIC8vIHByb2JsZW0gYW5kIGhvdyB0aGF0IHR5cGUgd2FzIHVzZWQ6IGtleSwgYXRycmlidXRlLCBpbnB1dCB2YWx1ZSBwcm9wLCBldGMuXG4gIC8vIEluIG1vc3QgY2FzZXMsIHRoaXMgY29uc29sZSBvdXRwdXQgYWxzbyBzaG93cyB0aGUgY29tcG9uZW50IGFuZCBpdHNcbiAgLy8gYW5jZXN0b3IgY29tcG9uZW50cyB3aGVyZSB0aGUgZXhjZXB0aW9uIGhhcHBlbmVkLlxuICAvL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvc2FmZS1zdHJpbmctY29lcmNpb25cbiAgcmV0dXJuICcnICsgdmFsdWU7XG59XG5mdW5jdGlvbiBjaGVja0tleVN0cmluZ0NvZXJjaW9uKHZhbHVlKSB7XG4gIHtcbiAgICBpZiAod2lsbENvZXJjaW9uVGhyb3codmFsdWUpKSB7XG4gICAgICBlcnJvcignVGhlIHByb3ZpZGVkIGtleSBpcyBhbiB1bnN1cHBvcnRlZCB0eXBlICVzLicgKyAnIFRoaXMgdmFsdWUgbXVzdCBiZSBjb2VyY2VkIHRvIGEgc3RyaW5nIGJlZm9yZSBiZWZvcmUgdXNpbmcgaXQgaGVyZS4nLCB0eXBlTmFtZSh2YWx1ZSkpO1xuXG4gICAgICByZXR1cm4gdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKTsgLy8gdGhyb3cgKHRvIGhlbHAgY2FsbGVycyBmaW5kIHRyb3VibGVzaG9vdGluZyBjb21tZW50cylcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGNoZWNrUHJvcFN0cmluZ0NvZXJjaW9uKHZhbHVlLCBwcm9wTmFtZSkge1xuICB7XG4gICAgaWYgKHdpbGxDb2VyY2lvblRocm93KHZhbHVlKSkge1xuICAgICAgZXJyb3IoJ1RoZSBwcm92aWRlZCBgJXNgIHByb3AgaXMgYW4gdW5zdXBwb3J0ZWQgdHlwZSAlcy4nICsgJyBUaGlzIHZhbHVlIG11c3QgYmUgY29lcmNlZCB0byBhIHN0cmluZyBiZWZvcmUgYmVmb3JlIHVzaW5nIGl0IGhlcmUuJywgcHJvcE5hbWUsIHR5cGVOYW1lKHZhbHVlKSk7XG5cbiAgICAgIHJldHVybiB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpOyAvLyB0aHJvdyAodG8gaGVscCBjYWxsZXJzIGZpbmQgdHJvdWJsZXNob290aW5nIGNvbW1lbnRzKVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiByZXNvbHZlRGVmYXVsdFByb3BzKENvbXBvbmVudCwgYmFzZVByb3BzKSB7XG4gIGlmIChDb21wb25lbnQgJiYgQ29tcG9uZW50LmRlZmF1bHRQcm9wcykge1xuICAgIC8vIFJlc29sdmUgZGVmYXVsdCBwcm9wcy4gVGFrZW4gZnJvbSBSZWFjdEVsZW1lbnRcbiAgICB2YXIgcHJvcHMgPSBhc3NpZ24oe30sIGJhc2VQcm9wcyk7XG4gICAgdmFyIGRlZmF1bHRQcm9wcyA9IENvbXBvbmVudC5kZWZhdWx0UHJvcHM7XG5cbiAgICBmb3IgKHZhciBwcm9wTmFtZSBpbiBkZWZhdWx0UHJvcHMpIHtcbiAgICAgIGlmIChwcm9wc1twcm9wTmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwcm9wc1twcm9wTmFtZV0gPSBkZWZhdWx0UHJvcHNbcHJvcE5hbWVdO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwcm9wcztcbiAgfVxuXG4gIHJldHVybiBiYXNlUHJvcHM7XG59XG5cbnZhciB2YWx1ZUN1cnNvciA9IGNyZWF0ZUN1cnNvcihudWxsKTtcbnZhciByZW5kZXJlclNpZ2lsO1xuXG57XG4gIC8vIFVzZSB0aGlzIHRvIGRldGVjdCBtdWx0aXBsZSByZW5kZXJlcnMgdXNpbmcgdGhlIHNhbWUgY29udGV4dFxuICByZW5kZXJlclNpZ2lsID0ge307XG59XG5cbnZhciBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciA9IG51bGw7XG52YXIgbGFzdENvbnRleHREZXBlbmRlbmN5ID0gbnVsbDtcbnZhciBsYXN0RnVsbHlPYnNlcnZlZENvbnRleHQgPSBudWxsO1xudmFyIGlzRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYgPSBmYWxzZTtcbmZ1bmN0aW9uIHJlc2V0Q29udGV4dERlcGVuZGVuY2llcygpIHtcbiAgLy8gVGhpcyBpcyBjYWxsZWQgcmlnaHQgYmVmb3JlIFJlYWN0IHlpZWxkcyBleGVjdXRpb24sIHRvIGVuc3VyZSBgcmVhZENvbnRleHRgXG4gIC8vIGNhbm5vdCBiZSBjYWxsZWQgb3V0c2lkZSB0aGUgcmVuZGVyIHBoYXNlLlxuICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciA9IG51bGw7XG4gIGxhc3RDb250ZXh0RGVwZW5kZW5jeSA9IG51bGw7XG4gIGxhc3RGdWxseU9ic2VydmVkQ29udGV4dCA9IG51bGw7XG5cbiAge1xuICAgIGlzRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYgPSBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gZW50ZXJEaXNhbGxvd2VkQ29udGV4dFJlYWRJbkRFVigpIHtcbiAge1xuICAgIGlzRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYgPSB0cnVlO1xuICB9XG59XG5mdW5jdGlvbiBleGl0RGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYoKSB7XG4gIHtcbiAgICBpc0Rpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWID0gZmFsc2U7XG4gIH1cbn1cbmZ1bmN0aW9uIHB1c2hQcm92aWRlcihwcm92aWRlckZpYmVyLCBjb250ZXh0LCBuZXh0VmFsdWUpIHtcbiAgaWYgKGlzUHJpbWFyeVJlbmRlcmVyKSB7XG4gICAgcHVzaCh2YWx1ZUN1cnNvciwgY29udGV4dC5fY3VycmVudFZhbHVlLCBwcm92aWRlckZpYmVyKTtcbiAgICBjb250ZXh0Ll9jdXJyZW50VmFsdWUgPSBuZXh0VmFsdWU7XG5cbiAgICB7XG4gICAgICBpZiAoY29udGV4dC5fY3VycmVudFJlbmRlcmVyICE9PSB1bmRlZmluZWQgJiYgY29udGV4dC5fY3VycmVudFJlbmRlcmVyICE9PSBudWxsICYmIGNvbnRleHQuX2N1cnJlbnRSZW5kZXJlciAhPT0gcmVuZGVyZXJTaWdpbCkge1xuICAgICAgICBlcnJvcignRGV0ZWN0ZWQgbXVsdGlwbGUgcmVuZGVyZXJzIGNvbmN1cnJlbnRseSByZW5kZXJpbmcgdGhlICcgKyAnc2FtZSBjb250ZXh0IHByb3ZpZGVyLiBUaGlzIGlzIGN1cnJlbnRseSB1bnN1cHBvcnRlZC4nKTtcbiAgICAgIH1cblxuICAgICAgY29udGV4dC5fY3VycmVudFJlbmRlcmVyID0gcmVuZGVyZXJTaWdpbDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcHVzaCh2YWx1ZUN1cnNvciwgY29udGV4dC5fY3VycmVudFZhbHVlMiwgcHJvdmlkZXJGaWJlcik7XG4gICAgY29udGV4dC5fY3VycmVudFZhbHVlMiA9IG5leHRWYWx1ZTtcblxuICAgIHtcbiAgICAgIGlmIChjb250ZXh0Ll9jdXJyZW50UmVuZGVyZXIyICE9PSB1bmRlZmluZWQgJiYgY29udGV4dC5fY3VycmVudFJlbmRlcmVyMiAhPT0gbnVsbCAmJiBjb250ZXh0Ll9jdXJyZW50UmVuZGVyZXIyICE9PSByZW5kZXJlclNpZ2lsKSB7XG4gICAgICAgIGVycm9yKCdEZXRlY3RlZCBtdWx0aXBsZSByZW5kZXJlcnMgY29uY3VycmVudGx5IHJlbmRlcmluZyB0aGUgJyArICdzYW1lIGNvbnRleHQgcHJvdmlkZXIuIFRoaXMgaXMgY3VycmVudGx5IHVuc3VwcG9ydGVkLicpO1xuICAgICAgfVxuXG4gICAgICBjb250ZXh0Ll9jdXJyZW50UmVuZGVyZXIyID0gcmVuZGVyZXJTaWdpbDtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHBvcFByb3ZpZGVyKGNvbnRleHQsIHByb3ZpZGVyRmliZXIpIHtcbiAgdmFyIGN1cnJlbnRWYWx1ZSA9IHZhbHVlQ3Vyc29yLmN1cnJlbnQ7XG4gIHBvcCh2YWx1ZUN1cnNvciwgcHJvdmlkZXJGaWJlcik7XG5cbiAgaWYgKGlzUHJpbWFyeVJlbmRlcmVyKSB7XG4gICAge1xuICAgICAgY29udGV4dC5fY3VycmVudFZhbHVlID0gY3VycmVudFZhbHVlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB7XG4gICAgICBjb250ZXh0Ll9jdXJyZW50VmFsdWUyID0gY3VycmVudFZhbHVlO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gc2NoZWR1bGVDb250ZXh0V29ya09uUGFyZW50UGF0aChwYXJlbnQsIHJlbmRlckxhbmVzLCBwcm9wYWdhdGlvblJvb3QpIHtcbiAgLy8gVXBkYXRlIHRoZSBjaGlsZCBsYW5lcyBvZiBhbGwgdGhlIGFuY2VzdG9ycywgaW5jbHVkaW5nIHRoZSBhbHRlcm5hdGVzLlxuICB2YXIgbm9kZSA9IHBhcmVudDtcblxuICB3aGlsZSAobm9kZSAhPT0gbnVsbCkge1xuICAgIHZhciBhbHRlcm5hdGUgPSBub2RlLmFsdGVybmF0ZTtcblxuICAgIGlmICghaXNTdWJzZXRPZkxhbmVzKG5vZGUuY2hpbGRMYW5lcywgcmVuZGVyTGFuZXMpKSB7XG4gICAgICBub2RlLmNoaWxkTGFuZXMgPSBtZXJnZUxhbmVzKG5vZGUuY2hpbGRMYW5lcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgICBpZiAoYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgICAgIGFsdGVybmF0ZS5jaGlsZExhbmVzID0gbWVyZ2VMYW5lcyhhbHRlcm5hdGUuY2hpbGRMYW5lcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoYWx0ZXJuYXRlICE9PSBudWxsICYmICFpc1N1YnNldE9mTGFuZXMoYWx0ZXJuYXRlLmNoaWxkTGFuZXMsIHJlbmRlckxhbmVzKSkge1xuICAgICAgYWx0ZXJuYXRlLmNoaWxkTGFuZXMgPSBtZXJnZUxhbmVzKGFsdGVybmF0ZS5jaGlsZExhbmVzLCByZW5kZXJMYW5lcyk7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUgPT09IHByb3BhZ2F0aW9uUm9vdCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICB9XG5cbiAge1xuICAgIGlmIChub2RlICE9PSBwcm9wYWdhdGlvblJvb3QpIHtcbiAgICAgIGVycm9yKCdFeHBlY3RlZCB0byBmaW5kIHRoZSBwcm9wYWdhdGlvbiByb290IHdoZW4gc2NoZWR1bGluZyBjb250ZXh0IHdvcmsuICcgKyAnVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHByb3BhZ2F0ZUNvbnRleHRDaGFuZ2Uod29ya0luUHJvZ3Jlc3MsIGNvbnRleHQsIHJlbmRlckxhbmVzKSB7XG4gIHtcbiAgICBwcm9wYWdhdGVDb250ZXh0Q2hhbmdlX2VhZ2VyKHdvcmtJblByb2dyZXNzLCBjb250ZXh0LCByZW5kZXJMYW5lcyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJvcGFnYXRlQ29udGV4dENoYW5nZV9lYWdlcih3b3JrSW5Qcm9ncmVzcywgY29udGV4dCwgcmVuZGVyTGFuZXMpIHtcblxuICB2YXIgZmliZXIgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcblxuICBpZiAoZmliZXIgIT09IG51bGwpIHtcbiAgICAvLyBTZXQgdGhlIHJldHVybiBwb2ludGVyIG9mIHRoZSBjaGlsZCB0byB0aGUgd29yay1pbi1wcm9ncmVzcyBmaWJlci5cbiAgICBmaWJlci5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgfVxuXG4gIHdoaWxlIChmaWJlciAhPT0gbnVsbCkge1xuICAgIHZhciBuZXh0RmliZXIgPSB2b2lkIDA7IC8vIFZpc2l0IHRoaXMgZmliZXIuXG5cbiAgICB2YXIgbGlzdCA9IGZpYmVyLmRlcGVuZGVuY2llcztcblxuICAgIGlmIChsaXN0ICE9PSBudWxsKSB7XG4gICAgICBuZXh0RmliZXIgPSBmaWJlci5jaGlsZDtcbiAgICAgIHZhciBkZXBlbmRlbmN5ID0gbGlzdC5maXJzdENvbnRleHQ7XG5cbiAgICAgIHdoaWxlIChkZXBlbmRlbmN5ICE9PSBudWxsKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBjb250ZXh0IG1hdGNoZXMuXG4gICAgICAgIGlmIChkZXBlbmRlbmN5LmNvbnRleHQgPT09IGNvbnRleHQpIHtcbiAgICAgICAgICAvLyBNYXRjaCEgU2NoZWR1bGUgYW4gdXBkYXRlIG9uIHRoaXMgZmliZXIuXG4gICAgICAgICAgaWYgKGZpYmVyLnRhZyA9PT0gQ2xhc3NDb21wb25lbnQpIHtcbiAgICAgICAgICAgIC8vIFNjaGVkdWxlIGEgZm9yY2UgdXBkYXRlIG9uIHRoZSB3b3JrLWluLXByb2dyZXNzLlxuICAgICAgICAgICAgdmFyIGxhbmUgPSBwaWNrQXJiaXRyYXJ5TGFuZShyZW5kZXJMYW5lcyk7XG4gICAgICAgICAgICB2YXIgdXBkYXRlID0gY3JlYXRlVXBkYXRlKE5vVGltZXN0YW1wLCBsYW5lKTtcbiAgICAgICAgICAgIHVwZGF0ZS50YWcgPSBGb3JjZVVwZGF0ZTsgLy8gVE9ETzogQmVjYXVzZSB3ZSBkb24ndCBoYXZlIGEgd29yay1pbi1wcm9ncmVzcywgdGhpcyB3aWxsIGFkZCB0aGVcbiAgICAgICAgICAgIC8vIHVwZGF0ZSB0byB0aGUgY3VycmVudCBmaWJlciwgdG9vLCB3aGljaCBtZWFucyBpdCB3aWxsIHBlcnNpc3QgZXZlbiBpZlxuICAgICAgICAgICAgLy8gdGhpcyByZW5kZXIgaXMgdGhyb3duIGF3YXkuIFNpbmNlIGl0J3MgYSByYWNlIGNvbmRpdGlvbiwgbm90IHN1cmUgaXQnc1xuICAgICAgICAgICAgLy8gd29ydGggZml4aW5nLlxuICAgICAgICAgICAgLy8gSW5saW5lZCBgZW5xdWV1ZVVwZGF0ZWAgdG8gcmVtb3ZlIGludGVybGVhdmVkIHVwZGF0ZSBjaGVja1xuXG4gICAgICAgICAgICB2YXIgdXBkYXRlUXVldWUgPSBmaWJlci51cGRhdGVRdWV1ZTtcblxuICAgICAgICAgICAgaWYgKHVwZGF0ZVF1ZXVlID09PSBudWxsKSA7IGVsc2Uge1xuICAgICAgICAgICAgICB2YXIgc2hhcmVkUXVldWUgPSB1cGRhdGVRdWV1ZS5zaGFyZWQ7XG4gICAgICAgICAgICAgIHZhciBwZW5kaW5nID0gc2hhcmVkUXVldWUucGVuZGluZztcblxuICAgICAgICAgICAgICBpZiAocGVuZGluZyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IHVwZGF0ZS4gQ3JlYXRlIGEgY2lyY3VsYXIgbGlzdC5cbiAgICAgICAgICAgICAgICB1cGRhdGUubmV4dCA9IHVwZGF0ZTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB1cGRhdGUubmV4dCA9IHBlbmRpbmcubmV4dDtcbiAgICAgICAgICAgICAgICBwZW5kaW5nLm5leHQgPSB1cGRhdGU7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBzaGFyZWRRdWV1ZS5wZW5kaW5nID0gdXBkYXRlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGZpYmVyLmxhbmVzID0gbWVyZ2VMYW5lcyhmaWJlci5sYW5lcywgcmVuZGVyTGFuZXMpO1xuICAgICAgICAgIHZhciBhbHRlcm5hdGUgPSBmaWJlci5hbHRlcm5hdGU7XG5cbiAgICAgICAgICBpZiAoYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBhbHRlcm5hdGUubGFuZXMgPSBtZXJnZUxhbmVzKGFsdGVybmF0ZS5sYW5lcywgcmVuZGVyTGFuZXMpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHNjaGVkdWxlQ29udGV4dFdvcmtPblBhcmVudFBhdGgoZmliZXIucmV0dXJuLCByZW5kZXJMYW5lcywgd29ya0luUHJvZ3Jlc3MpOyAvLyBNYXJrIHRoZSB1cGRhdGVkIGxhbmVzIG9uIHRoZSBsaXN0LCB0b28uXG5cbiAgICAgICAgICBsaXN0LmxhbmVzID0gbWVyZ2VMYW5lcyhsaXN0LmxhbmVzLCByZW5kZXJMYW5lcyk7IC8vIFNpbmNlIHdlIGFscmVhZHkgZm91bmQgYSBtYXRjaCwgd2UgY2FuIHN0b3AgdHJhdmVyc2luZyB0aGVcbiAgICAgICAgICAvLyBkZXBlbmRlbmN5IGxpc3QuXG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGRlcGVuZGVuY3kgPSBkZXBlbmRlbmN5Lm5leHQ7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChmaWJlci50YWcgPT09IENvbnRleHRQcm92aWRlcikge1xuICAgICAgLy8gRG9uJ3Qgc2NhbiBkZWVwZXIgaWYgdGhpcyBpcyBhIG1hdGNoaW5nIHByb3ZpZGVyXG4gICAgICBuZXh0RmliZXIgPSBmaWJlci50eXBlID09PSB3b3JrSW5Qcm9ncmVzcy50eXBlID8gbnVsbCA6IGZpYmVyLmNoaWxkO1xuICAgIH0gZWxzZSBpZiAoZmliZXIudGFnID09PSBEZWh5ZHJhdGVkRnJhZ21lbnQpIHtcbiAgICAgIC8vIElmIGEgZGVoeWRyYXRlZCBzdXNwZW5zZSBib3VuZGFyeSBpcyBpbiB0aGlzIHN1YnRyZWUsIHdlIGRvbid0IGtub3dcbiAgICAgIC8vIGlmIGl0IHdpbGwgaGF2ZSBhbnkgY29udGV4dCBjb25zdW1lcnMgaW4gaXQuIFRoZSBiZXN0IHdlIGNhbiBkbyBpc1xuICAgICAgLy8gbWFyayBpdCBhcyBoYXZpbmcgdXBkYXRlcy5cbiAgICAgIHZhciBwYXJlbnRTdXNwZW5zZSA9IGZpYmVyLnJldHVybjtcblxuICAgICAgaWYgKHBhcmVudFN1c3BlbnNlID09PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignV2UganVzdCBjYW1lIGZyb20gYSBwYXJlbnQgc28gd2UgbXVzdCBoYXZlIGhhZCBhIHBhcmVudC4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4nKTtcbiAgICAgIH1cblxuICAgICAgcGFyZW50U3VzcGVuc2UubGFuZXMgPSBtZXJnZUxhbmVzKHBhcmVudFN1c3BlbnNlLmxhbmVzLCByZW5kZXJMYW5lcyk7XG4gICAgICB2YXIgX2FsdGVybmF0ZSA9IHBhcmVudFN1c3BlbnNlLmFsdGVybmF0ZTtcblxuICAgICAgaWYgKF9hbHRlcm5hdGUgIT09IG51bGwpIHtcbiAgICAgICAgX2FsdGVybmF0ZS5sYW5lcyA9IG1lcmdlTGFuZXMoX2FsdGVybmF0ZS5sYW5lcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfSAvLyBUaGlzIGlzIGludGVudGlvbmFsbHkgcGFzc2luZyB0aGlzIGZpYmVyIGFzIHRoZSBwYXJlbnRcbiAgICAgIC8vIGJlY2F1c2Ugd2Ugd2FudCB0byBzY2hlZHVsZSB0aGlzIGZpYmVyIGFzIGhhdmluZyB3b3JrXG4gICAgICAvLyBvbiBpdHMgY2hpbGRyZW4uIFdlJ2xsIHVzZSB0aGUgY2hpbGRMYW5lcyBvblxuICAgICAgLy8gdGhpcyBmaWJlciB0byBpbmRpY2F0ZSB0aGF0IGEgY29udGV4dCBoYXMgY2hhbmdlZC5cblxuXG4gICAgICBzY2hlZHVsZUNvbnRleHRXb3JrT25QYXJlbnRQYXRoKHBhcmVudFN1c3BlbnNlLCByZW5kZXJMYW5lcywgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgbmV4dEZpYmVyID0gZmliZXIuc2libGluZztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVHJhdmVyc2UgZG93bi5cbiAgICAgIG5leHRGaWJlciA9IGZpYmVyLmNoaWxkO1xuICAgIH1cblxuICAgIGlmIChuZXh0RmliZXIgIT09IG51bGwpIHtcbiAgICAgIC8vIFNldCB0aGUgcmV0dXJuIHBvaW50ZXIgb2YgdGhlIGNoaWxkIHRvIHRoZSB3b3JrLWluLXByb2dyZXNzIGZpYmVyLlxuICAgICAgbmV4dEZpYmVyLnJldHVybiA9IGZpYmVyO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBObyBjaGlsZC4gVHJhdmVyc2UgdG8gbmV4dCBzaWJsaW5nLlxuICAgICAgbmV4dEZpYmVyID0gZmliZXI7XG5cbiAgICAgIHdoaWxlIChuZXh0RmliZXIgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKG5leHRGaWJlciA9PT0gd29ya0luUHJvZ3Jlc3MpIHtcbiAgICAgICAgICAvLyBXZSdyZSBiYWNrIHRvIHRoZSByb290IG9mIHRoaXMgc3VidHJlZS4gRXhpdC5cbiAgICAgICAgICBuZXh0RmliZXIgPSBudWxsO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHNpYmxpbmcgPSBuZXh0RmliZXIuc2libGluZztcblxuICAgICAgICBpZiAoc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgICAgIC8vIFNldCB0aGUgcmV0dXJuIHBvaW50ZXIgb2YgdGhlIHNpYmxpbmcgdG8gdGhlIHdvcmstaW4tcHJvZ3Jlc3MgZmliZXIuXG4gICAgICAgICAgc2libGluZy5yZXR1cm4gPSBuZXh0RmliZXIucmV0dXJuO1xuICAgICAgICAgIG5leHRGaWJlciA9IHNpYmxpbmc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gLy8gTm8gbW9yZSBzaWJsaW5ncy4gVHJhdmVyc2UgdXAuXG5cblxuICAgICAgICBuZXh0RmliZXIgPSBuZXh0RmliZXIucmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZpYmVyID0gbmV4dEZpYmVyO1xuICB9XG59XG5mdW5jdGlvbiBwcmVwYXJlVG9SZWFkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIgPSB3b3JrSW5Qcm9ncmVzcztcbiAgbGFzdENvbnRleHREZXBlbmRlbmN5ID0gbnVsbDtcbiAgbGFzdEZ1bGx5T2JzZXJ2ZWRDb250ZXh0ID0gbnVsbDtcbiAgdmFyIGRlcGVuZGVuY2llcyA9IHdvcmtJblByb2dyZXNzLmRlcGVuZGVuY2llcztcblxuICBpZiAoZGVwZW5kZW5jaWVzICE9PSBudWxsKSB7XG4gICAge1xuICAgICAgdmFyIGZpcnN0Q29udGV4dCA9IGRlcGVuZGVuY2llcy5maXJzdENvbnRleHQ7XG5cbiAgICAgIGlmIChmaXJzdENvbnRleHQgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKGluY2x1ZGVzU29tZUxhbmUoZGVwZW5kZW5jaWVzLmxhbmVzLCByZW5kZXJMYW5lcykpIHtcbiAgICAgICAgICAvLyBDb250ZXh0IGxpc3QgaGFzIGEgcGVuZGluZyB1cGRhdGUuIE1hcmsgdGhhdCB0aGlzIGZpYmVyIHBlcmZvcm1lZCB3b3JrLlxuICAgICAgICAgIG1hcmtXb3JrSW5Qcm9ncmVzc1JlY2VpdmVkVXBkYXRlKCk7XG4gICAgICAgIH0gLy8gUmVzZXQgdGhlIHdvcmstaW4tcHJvZ3Jlc3MgbGlzdFxuXG5cbiAgICAgICAgZGVwZW5kZW5jaWVzLmZpcnN0Q29udGV4dCA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiByZWFkQ29udGV4dChjb250ZXh0KSB7XG4gIHtcbiAgICAvLyBUaGlzIHdhcm5pbmcgd291bGQgZmlyZSBpZiB5b3UgcmVhZCBjb250ZXh0IGluc2lkZSBhIEhvb2sgbGlrZSB1c2VNZW1vLlxuICAgIC8vIFVubGlrZSB0aGUgY2xhc3MgY2hlY2sgYmVsb3csIGl0J3Mgbm90IGVuZm9yY2VkIGluIHByb2R1Y3Rpb24gZm9yIHBlcmYuXG4gICAgaWYgKGlzRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYpIHtcbiAgICAgIGVycm9yKCdDb250ZXh0IGNhbiBvbmx5IGJlIHJlYWQgd2hpbGUgUmVhY3QgaXMgcmVuZGVyaW5nLiAnICsgJ0luIGNsYXNzZXMsIHlvdSBjYW4gcmVhZCBpdCBpbiB0aGUgcmVuZGVyIG1ldGhvZCBvciBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMuICcgKyAnSW4gZnVuY3Rpb24gY29tcG9uZW50cywgeW91IGNhbiByZWFkIGl0IGRpcmVjdGx5IGluIHRoZSBmdW5jdGlvbiBib2R5LCBidXQgbm90ICcgKyAnaW5zaWRlIEhvb2tzIGxpa2UgdXNlUmVkdWNlcigpIG9yIHVzZU1lbW8oKS4nKTtcbiAgICB9XG4gIH1cblxuICB2YXIgdmFsdWUgPSBpc1ByaW1hcnlSZW5kZXJlciA/IGNvbnRleHQuX2N1cnJlbnRWYWx1ZSA6IGNvbnRleHQuX2N1cnJlbnRWYWx1ZTI7XG5cbiAgaWYgKGxhc3RGdWxseU9ic2VydmVkQ29udGV4dCA9PT0gY29udGV4dCkgOyBlbHNlIHtcbiAgICB2YXIgY29udGV4dEl0ZW0gPSB7XG4gICAgICBjb250ZXh0OiBjb250ZXh0LFxuICAgICAgbWVtb2l6ZWRWYWx1ZTogdmFsdWUsXG4gICAgICBuZXh0OiBudWxsXG4gICAgfTtcblxuICAgIGlmIChsYXN0Q29udGV4dERlcGVuZGVuY3kgPT09IG51bGwpIHtcbiAgICAgIGlmIChjdXJyZW50bHlSZW5kZXJpbmdGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbnRleHQgY2FuIG9ubHkgYmUgcmVhZCB3aGlsZSBSZWFjdCBpcyByZW5kZXJpbmcuICcgKyAnSW4gY2xhc3NlcywgeW91IGNhbiByZWFkIGl0IGluIHRoZSByZW5kZXIgbWV0aG9kIG9yIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcy4gJyArICdJbiBmdW5jdGlvbiBjb21wb25lbnRzLCB5b3UgY2FuIHJlYWQgaXQgZGlyZWN0bHkgaW4gdGhlIGZ1bmN0aW9uIGJvZHksIGJ1dCBub3QgJyArICdpbnNpZGUgSG9va3MgbGlrZSB1c2VSZWR1Y2VyKCkgb3IgdXNlTWVtbygpLicpO1xuICAgICAgfSAvLyBUaGlzIGlzIHRoZSBmaXJzdCBkZXBlbmRlbmN5IGZvciB0aGlzIGNvbXBvbmVudC4gQ3JlYXRlIGEgbmV3IGxpc3QuXG5cblxuICAgICAgbGFzdENvbnRleHREZXBlbmRlbmN5ID0gY29udGV4dEl0ZW07XG4gICAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlci5kZXBlbmRlbmNpZXMgPSB7XG4gICAgICAgIGxhbmVzOiBOb0xhbmVzLFxuICAgICAgICBmaXJzdENvbnRleHQ6IGNvbnRleHRJdGVtXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBBcHBlbmQgYSBuZXcgY29udGV4dCBpdGVtLlxuICAgICAgbGFzdENvbnRleHREZXBlbmRlbmN5ID0gbGFzdENvbnRleHREZXBlbmRlbmN5Lm5leHQgPSBjb250ZXh0SXRlbTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdmFsdWU7XG59XG5cbi8vIHJlbmRlci4gV2hlbiB0aGlzIHJlbmRlciBleGl0cywgZWl0aGVyIGJlY2F1c2UgaXQgZmluaXNoZXMgb3IgYmVjYXVzZSBpdCBpc1xuLy8gaW50ZXJydXB0ZWQsIHRoZSBpbnRlcmxlYXZlZCB1cGRhdGVzIHdpbGwgYmUgdHJhbnNmZXJyZWQgb250byB0aGUgbWFpbiBwYXJ0XG4vLyBvZiB0aGUgcXVldWUuXG5cbnZhciBjb25jdXJyZW50UXVldWVzID0gbnVsbDtcbmZ1bmN0aW9uIHB1c2hDb25jdXJyZW50VXBkYXRlUXVldWUocXVldWUpIHtcbiAgaWYgKGNvbmN1cnJlbnRRdWV1ZXMgPT09IG51bGwpIHtcbiAgICBjb25jdXJyZW50UXVldWVzID0gW3F1ZXVlXTtcbiAgfSBlbHNlIHtcbiAgICBjb25jdXJyZW50UXVldWVzLnB1c2gocXVldWUpO1xuICB9XG59XG5mdW5jdGlvbiBmaW5pc2hRdWV1ZWluZ0NvbmN1cnJlbnRVcGRhdGVzKCkge1xuICAvLyBUcmFuc2ZlciB0aGUgaW50ZXJsZWF2ZWQgdXBkYXRlcyBvbnRvIHRoZSBtYWluIHF1ZXVlLiBFYWNoIHF1ZXVlIGhhcyBhXG4gIC8vIGBwZW5kaW5nYCBmaWVsZCBhbmQgYW4gYGludGVybGVhdmVkYCBmaWVsZC4gV2hlbiB0aGV5IGFyZSBub3QgbnVsbCwgdGhleVxuICAvLyBwb2ludCB0byB0aGUgbGFzdCBub2RlIGluIGEgY2lyY3VsYXIgbGlua2VkIGxpc3QuIFdlIG5lZWQgdG8gYXBwZW5kIHRoZVxuICAvLyBpbnRlcmxlYXZlZCBsaXN0IHRvIHRoZSBlbmQgb2YgdGhlIHBlbmRpbmcgbGlzdCBieSBqb2luaW5nIHRoZW0gaW50byBhXG4gIC8vIHNpbmdsZSwgY2lyY3VsYXIgbGlzdC5cbiAgaWYgKGNvbmN1cnJlbnRRdWV1ZXMgIT09IG51bGwpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbmN1cnJlbnRRdWV1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBxdWV1ZSA9IGNvbmN1cnJlbnRRdWV1ZXNbaV07XG4gICAgICB2YXIgbGFzdEludGVybGVhdmVkVXBkYXRlID0gcXVldWUuaW50ZXJsZWF2ZWQ7XG5cbiAgICAgIGlmIChsYXN0SW50ZXJsZWF2ZWRVcGRhdGUgIT09IG51bGwpIHtcbiAgICAgICAgcXVldWUuaW50ZXJsZWF2ZWQgPSBudWxsO1xuICAgICAgICB2YXIgZmlyc3RJbnRlcmxlYXZlZFVwZGF0ZSA9IGxhc3RJbnRlcmxlYXZlZFVwZGF0ZS5uZXh0O1xuICAgICAgICB2YXIgbGFzdFBlbmRpbmdVcGRhdGUgPSBxdWV1ZS5wZW5kaW5nO1xuXG4gICAgICAgIGlmIChsYXN0UGVuZGluZ1VwZGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIHZhciBmaXJzdFBlbmRpbmdVcGRhdGUgPSBsYXN0UGVuZGluZ1VwZGF0ZS5uZXh0O1xuICAgICAgICAgIGxhc3RQZW5kaW5nVXBkYXRlLm5leHQgPSBmaXJzdEludGVybGVhdmVkVXBkYXRlO1xuICAgICAgICAgIGxhc3RJbnRlcmxlYXZlZFVwZGF0ZS5uZXh0ID0gZmlyc3RQZW5kaW5nVXBkYXRlO1xuICAgICAgICB9XG5cbiAgICAgICAgcXVldWUucGVuZGluZyA9IGxhc3RJbnRlcmxlYXZlZFVwZGF0ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25jdXJyZW50UXVldWVzID0gbnVsbDtcbiAgfVxufVxuZnVuY3Rpb24gZW5xdWV1ZUNvbmN1cnJlbnRIb29rVXBkYXRlKGZpYmVyLCBxdWV1ZSwgdXBkYXRlLCBsYW5lKSB7XG4gIHZhciBpbnRlcmxlYXZlZCA9IHF1ZXVlLmludGVybGVhdmVkO1xuXG4gIGlmIChpbnRlcmxlYXZlZCA9PT0gbnVsbCkge1xuICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IHVwZGF0ZS4gQ3JlYXRlIGEgY2lyY3VsYXIgbGlzdC5cbiAgICB1cGRhdGUubmV4dCA9IHVwZGF0ZTsgLy8gQXQgdGhlIGVuZCBvZiB0aGUgY3VycmVudCByZW5kZXIsIHRoaXMgcXVldWUncyBpbnRlcmxlYXZlZCB1cGRhdGVzIHdpbGxcbiAgICAvLyBiZSB0cmFuc2ZlcnJlZCB0byB0aGUgcGVuZGluZyBxdWV1ZS5cblxuICAgIHB1c2hDb25jdXJyZW50VXBkYXRlUXVldWUocXVldWUpO1xuICB9IGVsc2Uge1xuICAgIHVwZGF0ZS5uZXh0ID0gaW50ZXJsZWF2ZWQubmV4dDtcbiAgICBpbnRlcmxlYXZlZC5uZXh0ID0gdXBkYXRlO1xuICB9XG5cbiAgcXVldWUuaW50ZXJsZWF2ZWQgPSB1cGRhdGU7XG4gIHJldHVybiBtYXJrVXBkYXRlTGFuZUZyb21GaWJlclRvUm9vdChmaWJlciwgbGFuZSk7XG59XG5mdW5jdGlvbiBlbnF1ZXVlQ29uY3VycmVudEhvb2tVcGRhdGVBbmRFYWdlcmx5QmFpbG91dChmaWJlciwgcXVldWUsIHVwZGF0ZSwgbGFuZSkge1xuICB2YXIgaW50ZXJsZWF2ZWQgPSBxdWV1ZS5pbnRlcmxlYXZlZDtcblxuICBpZiAoaW50ZXJsZWF2ZWQgPT09IG51bGwpIHtcbiAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCB1cGRhdGUuIENyZWF0ZSBhIGNpcmN1bGFyIGxpc3QuXG4gICAgdXBkYXRlLm5leHQgPSB1cGRhdGU7IC8vIEF0IHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgcmVuZGVyLCB0aGlzIHF1ZXVlJ3MgaW50ZXJsZWF2ZWQgdXBkYXRlcyB3aWxsXG4gICAgLy8gYmUgdHJhbnNmZXJyZWQgdG8gdGhlIHBlbmRpbmcgcXVldWUuXG5cbiAgICBwdXNoQ29uY3VycmVudFVwZGF0ZVF1ZXVlKHF1ZXVlKTtcbiAgfSBlbHNlIHtcbiAgICB1cGRhdGUubmV4dCA9IGludGVybGVhdmVkLm5leHQ7XG4gICAgaW50ZXJsZWF2ZWQubmV4dCA9IHVwZGF0ZTtcbiAgfVxuXG4gIHF1ZXVlLmludGVybGVhdmVkID0gdXBkYXRlO1xufVxuZnVuY3Rpb24gZW5xdWV1ZUNvbmN1cnJlbnRDbGFzc1VwZGF0ZShmaWJlciwgcXVldWUsIHVwZGF0ZSwgbGFuZSkge1xuICB2YXIgaW50ZXJsZWF2ZWQgPSBxdWV1ZS5pbnRlcmxlYXZlZDtcblxuICBpZiAoaW50ZXJsZWF2ZWQgPT09IG51bGwpIHtcbiAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCB1cGRhdGUuIENyZWF0ZSBhIGNpcmN1bGFyIGxpc3QuXG4gICAgdXBkYXRlLm5leHQgPSB1cGRhdGU7IC8vIEF0IHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgcmVuZGVyLCB0aGlzIHF1ZXVlJ3MgaW50ZXJsZWF2ZWQgdXBkYXRlcyB3aWxsXG4gICAgLy8gYmUgdHJhbnNmZXJyZWQgdG8gdGhlIHBlbmRpbmcgcXVldWUuXG5cbiAgICBwdXNoQ29uY3VycmVudFVwZGF0ZVF1ZXVlKHF1ZXVlKTtcbiAgfSBlbHNlIHtcbiAgICB1cGRhdGUubmV4dCA9IGludGVybGVhdmVkLm5leHQ7XG4gICAgaW50ZXJsZWF2ZWQubmV4dCA9IHVwZGF0ZTtcbiAgfVxuXG4gIHF1ZXVlLmludGVybGVhdmVkID0gdXBkYXRlO1xuICByZXR1cm4gbWFya1VwZGF0ZUxhbmVGcm9tRmliZXJUb1Jvb3QoZmliZXIsIGxhbmUpO1xufVxuZnVuY3Rpb24gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCBsYW5lKSB7XG4gIHJldHVybiBtYXJrVXBkYXRlTGFuZUZyb21GaWJlclRvUm9vdChmaWJlciwgbGFuZSk7XG59IC8vIENhbGxpbmcgdGhpcyBmdW5jdGlvbiBvdXRzaWRlIHRoaXMgbW9kdWxlIHNob3VsZCBvbmx5IGJlIGRvbmUgZm9yIGJhY2t3YXJkc1xuLy8gY29tcGF0aWJpbGl0eSBhbmQgc2hvdWxkIGFsd2F5cyBiZSBhY2NvbXBhbmllZCBieSBhIHdhcm5pbmcuXG5cbnZhciB1bnNhZmVfbWFya1VwZGF0ZUxhbmVGcm9tRmliZXJUb1Jvb3QgPSBtYXJrVXBkYXRlTGFuZUZyb21GaWJlclRvUm9vdDtcblxuZnVuY3Rpb24gbWFya1VwZGF0ZUxhbmVGcm9tRmliZXJUb1Jvb3Qoc291cmNlRmliZXIsIGxhbmUpIHtcbiAgLy8gVXBkYXRlIHRoZSBzb3VyY2UgZmliZXIncyBsYW5lc1xuICBzb3VyY2VGaWJlci5sYW5lcyA9IG1lcmdlTGFuZXMoc291cmNlRmliZXIubGFuZXMsIGxhbmUpO1xuICB2YXIgYWx0ZXJuYXRlID0gc291cmNlRmliZXIuYWx0ZXJuYXRlO1xuXG4gIGlmIChhbHRlcm5hdGUgIT09IG51bGwpIHtcbiAgICBhbHRlcm5hdGUubGFuZXMgPSBtZXJnZUxhbmVzKGFsdGVybmF0ZS5sYW5lcywgbGFuZSk7XG4gIH1cblxuICB7XG4gICAgaWYgKGFsdGVybmF0ZSA9PT0gbnVsbCAmJiAoc291cmNlRmliZXIuZmxhZ3MgJiAoUGxhY2VtZW50IHwgSHlkcmF0aW5nKSkgIT09IE5vRmxhZ3MpIHtcbiAgICAgIHdhcm5BYm91dFVwZGF0ZU9uTm90WWV0TW91bnRlZEZpYmVySW5ERVYoc291cmNlRmliZXIpO1xuICAgIH1cbiAgfSAvLyBXYWxrIHRoZSBwYXJlbnQgcGF0aCB0byB0aGUgcm9vdCBhbmQgdXBkYXRlIHRoZSBjaGlsZCBsYW5lcy5cblxuXG4gIHZhciBub2RlID0gc291cmNlRmliZXI7XG4gIHZhciBwYXJlbnQgPSBzb3VyY2VGaWJlci5yZXR1cm47XG5cbiAgd2hpbGUgKHBhcmVudCAhPT0gbnVsbCkge1xuICAgIHBhcmVudC5jaGlsZExhbmVzID0gbWVyZ2VMYW5lcyhwYXJlbnQuY2hpbGRMYW5lcywgbGFuZSk7XG4gICAgYWx0ZXJuYXRlID0gcGFyZW50LmFsdGVybmF0ZTtcblxuICAgIGlmIChhbHRlcm5hdGUgIT09IG51bGwpIHtcbiAgICAgIGFsdGVybmF0ZS5jaGlsZExhbmVzID0gbWVyZ2VMYW5lcyhhbHRlcm5hdGUuY2hpbGRMYW5lcywgbGFuZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHtcbiAgICAgICAgaWYgKChwYXJlbnQuZmxhZ3MgJiAoUGxhY2VtZW50IHwgSHlkcmF0aW5nKSkgIT09IE5vRmxhZ3MpIHtcbiAgICAgICAgICB3YXJuQWJvdXRVcGRhdGVPbk5vdFlldE1vdW50ZWRGaWJlckluREVWKHNvdXJjZUZpYmVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIG5vZGUgPSBwYXJlbnQ7XG4gICAgcGFyZW50ID0gcGFyZW50LnJldHVybjtcbiAgfVxuXG4gIGlmIChub2RlLnRhZyA9PT0gSG9zdFJvb3QpIHtcbiAgICB2YXIgcm9vdCA9IG5vZGUuc3RhdGVOb2RlO1xuICAgIHJldHVybiByb290O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbnZhciBVcGRhdGVTdGF0ZSA9IDA7XG52YXIgUmVwbGFjZVN0YXRlID0gMTtcbnZhciBGb3JjZVVwZGF0ZSA9IDI7XG52YXIgQ2FwdHVyZVVwZGF0ZSA9IDM7IC8vIEdsb2JhbCBzdGF0ZSB0aGF0IGlzIHJlc2V0IGF0IHRoZSBiZWdpbm5pbmcgb2YgY2FsbGluZyBgcHJvY2Vzc1VwZGF0ZVF1ZXVlYC5cbi8vIEl0IHNob3VsZCBvbmx5IGJlIHJlYWQgcmlnaHQgYWZ0ZXIgY2FsbGluZyBgcHJvY2Vzc1VwZGF0ZVF1ZXVlYCwgdmlhXG4vLyBgY2hlY2tIYXNGb3JjZVVwZGF0ZUFmdGVyUHJvY2Vzc2luZ2AuXG5cbnZhciBoYXNGb3JjZVVwZGF0ZSA9IGZhbHNlO1xudmFyIGRpZFdhcm5VcGRhdGVJbnNpZGVVcGRhdGU7XG52YXIgY3VycmVudGx5UHJvY2Vzc2luZ1F1ZXVlO1xuXG57XG4gIGRpZFdhcm5VcGRhdGVJbnNpZGVVcGRhdGUgPSBmYWxzZTtcbiAgY3VycmVudGx5UHJvY2Vzc2luZ1F1ZXVlID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gaW5pdGlhbGl6ZVVwZGF0ZVF1ZXVlKGZpYmVyKSB7XG4gIHZhciBxdWV1ZSA9IHtcbiAgICBiYXNlU3RhdGU6IGZpYmVyLm1lbW9pemVkU3RhdGUsXG4gICAgZmlyc3RCYXNlVXBkYXRlOiBudWxsLFxuICAgIGxhc3RCYXNlVXBkYXRlOiBudWxsLFxuICAgIHNoYXJlZDoge1xuICAgICAgcGVuZGluZzogbnVsbCxcbiAgICAgIGludGVybGVhdmVkOiBudWxsLFxuICAgICAgbGFuZXM6IE5vTGFuZXNcbiAgICB9LFxuICAgIGVmZmVjdHM6IG51bGxcbiAgfTtcbiAgZmliZXIudXBkYXRlUXVldWUgPSBxdWV1ZTtcbn1cbmZ1bmN0aW9uIGNsb25lVXBkYXRlUXVldWUoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpIHtcbiAgLy8gQ2xvbmUgdGhlIHVwZGF0ZSBxdWV1ZSBmcm9tIGN1cnJlbnQuIFVubGVzcyBpdCdzIGFscmVhZHkgYSBjbG9uZS5cbiAgdmFyIHF1ZXVlID0gd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWU7XG4gIHZhciBjdXJyZW50UXVldWUgPSBjdXJyZW50LnVwZGF0ZVF1ZXVlO1xuXG4gIGlmIChxdWV1ZSA9PT0gY3VycmVudFF1ZXVlKSB7XG4gICAgdmFyIGNsb25lID0ge1xuICAgICAgYmFzZVN0YXRlOiBjdXJyZW50UXVldWUuYmFzZVN0YXRlLFxuICAgICAgZmlyc3RCYXNlVXBkYXRlOiBjdXJyZW50UXVldWUuZmlyc3RCYXNlVXBkYXRlLFxuICAgICAgbGFzdEJhc2VVcGRhdGU6IGN1cnJlbnRRdWV1ZS5sYXN0QmFzZVVwZGF0ZSxcbiAgICAgIHNoYXJlZDogY3VycmVudFF1ZXVlLnNoYXJlZCxcbiAgICAgIGVmZmVjdHM6IGN1cnJlbnRRdWV1ZS5lZmZlY3RzXG4gICAgfTtcbiAgICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IGNsb25lO1xuICB9XG59XG5mdW5jdGlvbiBjcmVhdGVVcGRhdGUoZXZlbnRUaW1lLCBsYW5lKSB7XG4gIHZhciB1cGRhdGUgPSB7XG4gICAgZXZlbnRUaW1lOiBldmVudFRpbWUsXG4gICAgbGFuZTogbGFuZSxcbiAgICB0YWc6IFVwZGF0ZVN0YXRlLFxuICAgIHBheWxvYWQ6IG51bGwsXG4gICAgY2FsbGJhY2s6IG51bGwsXG4gICAgbmV4dDogbnVsbFxuICB9O1xuICByZXR1cm4gdXBkYXRlO1xufVxuZnVuY3Rpb24gZW5xdWV1ZVVwZGF0ZShmaWJlciwgdXBkYXRlLCBsYW5lKSB7XG4gIHZhciB1cGRhdGVRdWV1ZSA9IGZpYmVyLnVwZGF0ZVF1ZXVlO1xuXG4gIGlmICh1cGRhdGVRdWV1ZSA9PT0gbnVsbCkge1xuICAgIC8vIE9ubHkgb2NjdXJzIGlmIHRoZSBmaWJlciBoYXMgYmVlbiB1bm1vdW50ZWQuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgc2hhcmVkUXVldWUgPSB1cGRhdGVRdWV1ZS5zaGFyZWQ7XG5cbiAge1xuICAgIGlmIChjdXJyZW50bHlQcm9jZXNzaW5nUXVldWUgPT09IHNoYXJlZFF1ZXVlICYmICFkaWRXYXJuVXBkYXRlSW5zaWRlVXBkYXRlKSB7XG4gICAgICBlcnJvcignQW4gdXBkYXRlIChzZXRTdGF0ZSwgcmVwbGFjZVN0YXRlLCBvciBmb3JjZVVwZGF0ZSkgd2FzIHNjaGVkdWxlZCAnICsgJ2Zyb20gaW5zaWRlIGFuIHVwZGF0ZSBmdW5jdGlvbi4gVXBkYXRlIGZ1bmN0aW9ucyBzaG91bGQgYmUgcHVyZSwgJyArICd3aXRoIHplcm8gc2lkZS1lZmZlY3RzLiBDb25zaWRlciB1c2luZyBjb21wb25lbnREaWRVcGRhdGUgb3IgYSAnICsgJ2NhbGxiYWNrLicpO1xuXG4gICAgICBkaWRXYXJuVXBkYXRlSW5zaWRlVXBkYXRlID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBpZiAoaXNVbnNhZmVDbGFzc1JlbmRlclBoYXNlVXBkYXRlKCkpIHtcbiAgICAvLyBUaGlzIGlzIGFuIHVuc2FmZSByZW5kZXIgcGhhc2UgdXBkYXRlLiBBZGQgZGlyZWN0bHkgdG8gdGhlIHVwZGF0ZVxuICAgIC8vIHF1ZXVlIHNvIHdlIGNhbiBwcm9jZXNzIGl0IGltbWVkaWF0ZWx5IGR1cmluZyB0aGUgY3VycmVudCByZW5kZXIuXG4gICAgdmFyIHBlbmRpbmcgPSBzaGFyZWRRdWV1ZS5wZW5kaW5nO1xuXG4gICAgaWYgKHBlbmRpbmcgPT09IG51bGwpIHtcbiAgICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IHVwZGF0ZS4gQ3JlYXRlIGEgY2lyY3VsYXIgbGlzdC5cbiAgICAgIHVwZGF0ZS5uZXh0ID0gdXBkYXRlO1xuICAgIH0gZWxzZSB7XG4gICAgICB1cGRhdGUubmV4dCA9IHBlbmRpbmcubmV4dDtcbiAgICAgIHBlbmRpbmcubmV4dCA9IHVwZGF0ZTtcbiAgICB9XG5cbiAgICBzaGFyZWRRdWV1ZS5wZW5kaW5nID0gdXBkYXRlOyAvLyBVcGRhdGUgdGhlIGNoaWxkTGFuZXMgZXZlbiB0aG91Z2ggd2UncmUgbW9zdCBsaWtlbHkgYWxyZWFkeSByZW5kZXJpbmdcbiAgICAvLyB0aGlzIGZpYmVyLiBUaGlzIGlzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBpbiB0aGUgY2FzZSB3aGVyZSB5b3VcbiAgICAvLyB1cGRhdGUgYSBkaWZmZXJlbnQgY29tcG9uZW50IGR1cmluZyByZW5kZXIgcGhhc2UgdGhhbiB0aGUgb25lIHRoYXQgaXNcbiAgICAvLyBjdXJyZW50bHkgcmVuZGVyaW5ncyAoYSBwYXR0ZXJuIHRoYXQgaXMgYWNjb21wYW5pZWQgYnkgYSB3YXJuaW5nKS5cblxuICAgIHJldHVybiB1bnNhZmVfbWFya1VwZGF0ZUxhbmVGcm9tRmliZXJUb1Jvb3QoZmliZXIsIGxhbmUpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBlbnF1ZXVlQ29uY3VycmVudENsYXNzVXBkYXRlKGZpYmVyLCBzaGFyZWRRdWV1ZSwgdXBkYXRlLCBsYW5lKTtcbiAgfVxufVxuZnVuY3Rpb24gZW50YW5nbGVUcmFuc2l0aW9ucyhyb290LCBmaWJlciwgbGFuZSkge1xuICB2YXIgdXBkYXRlUXVldWUgPSBmaWJlci51cGRhdGVRdWV1ZTtcblxuICBpZiAodXBkYXRlUXVldWUgPT09IG51bGwpIHtcbiAgICAvLyBPbmx5IG9jY3VycyBpZiB0aGUgZmliZXIgaGFzIGJlZW4gdW5tb3VudGVkLlxuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBzaGFyZWRRdWV1ZSA9IHVwZGF0ZVF1ZXVlLnNoYXJlZDtcblxuICBpZiAoaXNUcmFuc2l0aW9uTGFuZShsYW5lKSkge1xuICAgIHZhciBxdWV1ZUxhbmVzID0gc2hhcmVkUXVldWUubGFuZXM7IC8vIElmIGFueSBlbnRhbmdsZWQgbGFuZXMgYXJlIG5vIGxvbmdlciBwZW5kaW5nIG9uIHRoZSByb290LCB0aGVuIHRoZXkgbXVzdFxuICAgIC8vIGhhdmUgZmluaXNoZWQuIFdlIGNhbiByZW1vdmUgdGhlbSBmcm9tIHRoZSBzaGFyZWQgcXVldWUsIHdoaWNoIHJlcHJlc2VudHNcbiAgICAvLyBhIHN1cGVyc2V0IG9mIHRoZSBhY3R1YWxseSBwZW5kaW5nIGxhbmVzLiBJbiBzb21lIGNhc2VzIHdlIG1heSBlbnRhbmdsZVxuICAgIC8vIG1vcmUgdGhhbiB3ZSBuZWVkIHRvLCBidXQgdGhhdCdzIE9LLiBJbiBmYWN0IGl0J3Mgd29yc2UgaWYgd2UgKmRvbid0KlxuICAgIC8vIGVudGFuZ2xlIHdoZW4gd2Ugc2hvdWxkLlxuXG4gICAgcXVldWVMYW5lcyA9IGludGVyc2VjdExhbmVzKHF1ZXVlTGFuZXMsIHJvb3QucGVuZGluZ0xhbmVzKTsgLy8gRW50YW5nbGUgdGhlIG5ldyB0cmFuc2l0aW9uIGxhbmUgd2l0aCB0aGUgb3RoZXIgdHJhbnNpdGlvbiBsYW5lcy5cblxuICAgIHZhciBuZXdRdWV1ZUxhbmVzID0gbWVyZ2VMYW5lcyhxdWV1ZUxhbmVzLCBsYW5lKTtcbiAgICBzaGFyZWRRdWV1ZS5sYW5lcyA9IG5ld1F1ZXVlTGFuZXM7IC8vIEV2ZW4gaWYgcXVldWUubGFuZXMgYWxyZWFkeSBpbmNsdWRlIGxhbmUsIHdlIGRvbid0IGtub3cgZm9yIGNlcnRhaW4gaWZcbiAgICAvLyB0aGUgbGFuZSBmaW5pc2hlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHdlIGVudGFuZ2xlZCBpdC4gU28gd2UgbmVlZCB0b1xuICAgIC8vIGVudGFuZ2xlIGl0IGFnYWluLCBqdXN0IHRvIGJlIHN1cmUuXG5cbiAgICBtYXJrUm9vdEVudGFuZ2xlZChyb290LCBuZXdRdWV1ZUxhbmVzKTtcbiAgfVxufVxuZnVuY3Rpb24gZW5xdWV1ZUNhcHR1cmVkVXBkYXRlKHdvcmtJblByb2dyZXNzLCBjYXB0dXJlZFVwZGF0ZSkge1xuICAvLyBDYXB0dXJlZCB1cGRhdGVzIGFyZSB1cGRhdGVzIHRoYXQgYXJlIHRocm93biBieSBhIGNoaWxkIGR1cmluZyB0aGUgcmVuZGVyXG4gIC8vIHBoYXNlLiBUaGV5IHNob3VsZCBiZSBkaXNjYXJkZWQgaWYgdGhlIHJlbmRlciBpcyBhYm9ydGVkLiBUaGVyZWZvcmUsXG4gIC8vIHdlIHNob3VsZCBvbmx5IHB1dCB0aGVtIG9uIHRoZSB3b3JrLWluLXByb2dyZXNzIHF1ZXVlLCBub3QgdGhlIGN1cnJlbnQgb25lLlxuICB2YXIgcXVldWUgPSB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZTsgLy8gQ2hlY2sgaWYgdGhlIHdvcmstaW4tcHJvZ3Jlc3MgcXVldWUgaXMgYSBjbG9uZS5cblxuICB2YXIgY3VycmVudCA9IHdvcmtJblByb2dyZXNzLmFsdGVybmF0ZTtcblxuICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgIHZhciBjdXJyZW50UXVldWUgPSBjdXJyZW50LnVwZGF0ZVF1ZXVlO1xuXG4gICAgaWYgKHF1ZXVlID09PSBjdXJyZW50UXVldWUpIHtcbiAgICAgIC8vIFRoZSB3b3JrLWluLXByb2dyZXNzIHF1ZXVlIGlzIHRoZSBzYW1lIGFzIGN1cnJlbnQuIFRoaXMgaGFwcGVucyB3aGVuXG4gICAgICAvLyB3ZSBiYWlsIG91dCBvbiBhIHBhcmVudCBmaWJlciB0aGF0IHRoZW4gY2FwdHVyZXMgYW4gZXJyb3IgdGhyb3duIGJ5XG4gICAgICAvLyBhIGNoaWxkLiBTaW5jZSB3ZSB3YW50IHRvIGFwcGVuZCB0aGUgdXBkYXRlIG9ubHkgdG8gdGhlIHdvcmstaW5cbiAgICAgIC8vIC1wcm9ncmVzcyBxdWV1ZSwgd2UgbmVlZCB0byBjbG9uZSB0aGUgdXBkYXRlcy4gV2UgdXN1YWxseSBjbG9uZSBkdXJpbmdcbiAgICAgIC8vIHByb2Nlc3NVcGRhdGVRdWV1ZSwgYnV0IHRoYXQgZGlkbid0IGhhcHBlbiBpbiB0aGlzIGNhc2UgYmVjYXVzZSB3ZVxuICAgICAgLy8gc2tpcHBlZCBvdmVyIHRoZSBwYXJlbnQgd2hlbiB3ZSBiYWlsZWQgb3V0LlxuICAgICAgdmFyIG5ld0ZpcnN0ID0gbnVsbDtcbiAgICAgIHZhciBuZXdMYXN0ID0gbnVsbDtcbiAgICAgIHZhciBmaXJzdEJhc2VVcGRhdGUgPSBxdWV1ZS5maXJzdEJhc2VVcGRhdGU7XG5cbiAgICAgIGlmIChmaXJzdEJhc2VVcGRhdGUgIT09IG51bGwpIHtcbiAgICAgICAgLy8gTG9vcCB0aHJvdWdoIHRoZSB1cGRhdGVzIGFuZCBjbG9uZSB0aGVtLlxuICAgICAgICB2YXIgdXBkYXRlID0gZmlyc3RCYXNlVXBkYXRlO1xuXG4gICAgICAgIGRvIHtcbiAgICAgICAgICB2YXIgY2xvbmUgPSB7XG4gICAgICAgICAgICBldmVudFRpbWU6IHVwZGF0ZS5ldmVudFRpbWUsXG4gICAgICAgICAgICBsYW5lOiB1cGRhdGUubGFuZSxcbiAgICAgICAgICAgIHRhZzogdXBkYXRlLnRhZyxcbiAgICAgICAgICAgIHBheWxvYWQ6IHVwZGF0ZS5wYXlsb2FkLFxuICAgICAgICAgICAgY2FsbGJhY2s6IHVwZGF0ZS5jYWxsYmFjayxcbiAgICAgICAgICAgIG5leHQ6IG51bGxcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgaWYgKG5ld0xhc3QgPT09IG51bGwpIHtcbiAgICAgICAgICAgIG5ld0ZpcnN0ID0gbmV3TGFzdCA9IGNsb25lO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZXdMYXN0Lm5leHQgPSBjbG9uZTtcbiAgICAgICAgICAgIG5ld0xhc3QgPSBjbG9uZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB1cGRhdGUgPSB1cGRhdGUubmV4dDtcbiAgICAgICAgfSB3aGlsZSAodXBkYXRlICE9PSBudWxsKTsgLy8gQXBwZW5kIHRoZSBjYXB0dXJlZCB1cGRhdGUgdGhlIGVuZCBvZiB0aGUgY2xvbmVkIGxpc3QuXG5cblxuICAgICAgICBpZiAobmV3TGFzdCA9PT0gbnVsbCkge1xuICAgICAgICAgIG5ld0ZpcnN0ID0gbmV3TGFzdCA9IGNhcHR1cmVkVXBkYXRlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5ld0xhc3QubmV4dCA9IGNhcHR1cmVkVXBkYXRlO1xuICAgICAgICAgIG5ld0xhc3QgPSBjYXB0dXJlZFVwZGF0ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVGhlcmUgYXJlIG5vIGJhc2UgdXBkYXRlcy5cbiAgICAgICAgbmV3Rmlyc3QgPSBuZXdMYXN0ID0gY2FwdHVyZWRVcGRhdGU7XG4gICAgICB9XG5cbiAgICAgIHF1ZXVlID0ge1xuICAgICAgICBiYXNlU3RhdGU6IGN1cnJlbnRRdWV1ZS5iYXNlU3RhdGUsXG4gICAgICAgIGZpcnN0QmFzZVVwZGF0ZTogbmV3Rmlyc3QsXG4gICAgICAgIGxhc3RCYXNlVXBkYXRlOiBuZXdMYXN0LFxuICAgICAgICBzaGFyZWQ6IGN1cnJlbnRRdWV1ZS5zaGFyZWQsXG4gICAgICAgIGVmZmVjdHM6IGN1cnJlbnRRdWV1ZS5lZmZlY3RzXG4gICAgICB9O1xuICAgICAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBxdWV1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH0gLy8gQXBwZW5kIHRoZSB1cGRhdGUgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC5cblxuXG4gIHZhciBsYXN0QmFzZVVwZGF0ZSA9IHF1ZXVlLmxhc3RCYXNlVXBkYXRlO1xuXG4gIGlmIChsYXN0QmFzZVVwZGF0ZSA9PT0gbnVsbCkge1xuICAgIHF1ZXVlLmZpcnN0QmFzZVVwZGF0ZSA9IGNhcHR1cmVkVXBkYXRlO1xuICB9IGVsc2Uge1xuICAgIGxhc3RCYXNlVXBkYXRlLm5leHQgPSBjYXB0dXJlZFVwZGF0ZTtcbiAgfVxuXG4gIHF1ZXVlLmxhc3RCYXNlVXBkYXRlID0gY2FwdHVyZWRVcGRhdGU7XG59XG5cbmZ1bmN0aW9uIGdldFN0YXRlRnJvbVVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgcXVldWUsIHVwZGF0ZSwgcHJldlN0YXRlLCBuZXh0UHJvcHMsIGluc3RhbmNlKSB7XG4gIHN3aXRjaCAodXBkYXRlLnRhZykge1xuICAgIGNhc2UgUmVwbGFjZVN0YXRlOlxuICAgICAge1xuICAgICAgICB2YXIgcGF5bG9hZCA9IHVwZGF0ZS5wYXlsb2FkO1xuXG4gICAgICAgIGlmICh0eXBlb2YgcGF5bG9hZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIC8vIFVwZGF0ZXIgZnVuY3Rpb25cbiAgICAgICAgICB7XG4gICAgICAgICAgICBlbnRlckRpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIG5leHRTdGF0ZSA9IHBheWxvYWQuY2FsbChpbnN0YW5jZSwgcHJldlN0YXRlLCBuZXh0UHJvcHMpO1xuXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKCB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkge1xuICAgICAgICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyh0cnVlKTtcblxuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHBheWxvYWQuY2FsbChpbnN0YW5jZSwgcHJldlN0YXRlLCBuZXh0UHJvcHMpO1xuICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKGZhbHNlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBleGl0RGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gbmV4dFN0YXRlO1xuICAgICAgICB9IC8vIFN0YXRlIG9iamVjdFxuXG5cbiAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgICB9XG5cbiAgICBjYXNlIENhcHR1cmVVcGRhdGU6XG4gICAgICB7XG4gICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzID0gd29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiB+U2hvdWxkQ2FwdHVyZSB8IERpZENhcHR1cmU7XG4gICAgICB9XG4gICAgLy8gSW50ZW50aW9uYWwgZmFsbHRocm91Z2hcblxuICAgIGNhc2UgVXBkYXRlU3RhdGU6XG4gICAgICB7XG4gICAgICAgIHZhciBfcGF5bG9hZCA9IHVwZGF0ZS5wYXlsb2FkO1xuICAgICAgICB2YXIgcGFydGlhbFN0YXRlO1xuXG4gICAgICAgIGlmICh0eXBlb2YgX3BheWxvYWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAvLyBVcGRhdGVyIGZ1bmN0aW9uXG4gICAgICAgICAge1xuICAgICAgICAgICAgZW50ZXJEaXNhbGxvd2VkQ29udGV4dFJlYWRJbkRFVigpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHBhcnRpYWxTdGF0ZSA9IF9wYXlsb2FkLmNhbGwoaW5zdGFuY2UsIHByZXZTdGF0ZSwgbmV4dFByb3BzKTtcblxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmICggd29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgICAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHModHJ1ZSk7XG5cbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBfcGF5bG9hZC5jYWxsKGluc3RhbmNlLCBwcmV2U3RhdGUsIG5leHRQcm9wcyk7XG4gICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHMoZmFsc2UpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGV4aXREaXNhbGxvd2VkQ29udGV4dFJlYWRJbkRFVigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBQYXJ0aWFsIHN0YXRlIG9iamVjdFxuICAgICAgICAgIHBhcnRpYWxTdGF0ZSA9IF9wYXlsb2FkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhcnRpYWxTdGF0ZSA9PT0gbnVsbCB8fCBwYXJ0aWFsU3RhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIE51bGwgYW5kIHVuZGVmaW5lZCBhcmUgdHJlYXRlZCBhcyBuby1vcHMuXG4gICAgICAgICAgcmV0dXJuIHByZXZTdGF0ZTtcbiAgICAgICAgfSAvLyBNZXJnZSB0aGUgcGFydGlhbCBzdGF0ZSBhbmQgdGhlIHByZXZpb3VzIHN0YXRlLlxuXG5cbiAgICAgICAgcmV0dXJuIGFzc2lnbih7fSwgcHJldlN0YXRlLCBwYXJ0aWFsU3RhdGUpO1xuICAgICAgfVxuXG4gICAgY2FzZSBGb3JjZVVwZGF0ZTpcbiAgICAgIHtcbiAgICAgICAgaGFzRm9yY2VVcGRhdGUgPSB0cnVlO1xuICAgICAgICByZXR1cm4gcHJldlN0YXRlO1xuICAgICAgfVxuICB9XG5cbiAgcmV0dXJuIHByZXZTdGF0ZTtcbn1cblxuZnVuY3Rpb24gcHJvY2Vzc1VwZGF0ZVF1ZXVlKHdvcmtJblByb2dyZXNzLCBwcm9wcywgaW5zdGFuY2UsIHJlbmRlckxhbmVzKSB7XG4gIC8vIFRoaXMgaXMgYWx3YXlzIG5vbi1udWxsIG9uIGEgQ2xhc3NDb21wb25lbnQgb3IgSG9zdFJvb3RcbiAgdmFyIHF1ZXVlID0gd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWU7XG4gIGhhc0ZvcmNlVXBkYXRlID0gZmFsc2U7XG5cbiAge1xuICAgIGN1cnJlbnRseVByb2Nlc3NpbmdRdWV1ZSA9IHF1ZXVlLnNoYXJlZDtcbiAgfVxuXG4gIHZhciBmaXJzdEJhc2VVcGRhdGUgPSBxdWV1ZS5maXJzdEJhc2VVcGRhdGU7XG4gIHZhciBsYXN0QmFzZVVwZGF0ZSA9IHF1ZXVlLmxhc3RCYXNlVXBkYXRlOyAvLyBDaGVjayBpZiB0aGVyZSBhcmUgcGVuZGluZyB1cGRhdGVzLiBJZiBzbywgdHJhbnNmZXIgdGhlbSB0byB0aGUgYmFzZSBxdWV1ZS5cblxuICB2YXIgcGVuZGluZ1F1ZXVlID0gcXVldWUuc2hhcmVkLnBlbmRpbmc7XG5cbiAgaWYgKHBlbmRpbmdRdWV1ZSAhPT0gbnVsbCkge1xuICAgIHF1ZXVlLnNoYXJlZC5wZW5kaW5nID0gbnVsbDsgLy8gVGhlIHBlbmRpbmcgcXVldWUgaXMgY2lyY3VsYXIuIERpc2Nvbm5lY3QgdGhlIHBvaW50ZXIgYmV0d2VlbiBmaXJzdFxuICAgIC8vIGFuZCBsYXN0IHNvIHRoYXQgaXQncyBub24tY2lyY3VsYXIuXG5cbiAgICB2YXIgbGFzdFBlbmRpbmdVcGRhdGUgPSBwZW5kaW5nUXVldWU7XG4gICAgdmFyIGZpcnN0UGVuZGluZ1VwZGF0ZSA9IGxhc3RQZW5kaW5nVXBkYXRlLm5leHQ7XG4gICAgbGFzdFBlbmRpbmdVcGRhdGUubmV4dCA9IG51bGw7IC8vIEFwcGVuZCBwZW5kaW5nIHVwZGF0ZXMgdG8gYmFzZSBxdWV1ZVxuXG4gICAgaWYgKGxhc3RCYXNlVXBkYXRlID09PSBudWxsKSB7XG4gICAgICBmaXJzdEJhc2VVcGRhdGUgPSBmaXJzdFBlbmRpbmdVcGRhdGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxhc3RCYXNlVXBkYXRlLm5leHQgPSBmaXJzdFBlbmRpbmdVcGRhdGU7XG4gICAgfVxuXG4gICAgbGFzdEJhc2VVcGRhdGUgPSBsYXN0UGVuZGluZ1VwZGF0ZTsgLy8gSWYgdGhlcmUncyBhIGN1cnJlbnQgcXVldWUsIGFuZCBpdCdzIGRpZmZlcmVudCBmcm9tIHRoZSBiYXNlIHF1ZXVlLCB0aGVuXG4gICAgLy8gd2UgbmVlZCB0byB0cmFuc2ZlciB0aGUgdXBkYXRlcyB0byB0aGF0IHF1ZXVlLCB0b28uIEJlY2F1c2UgdGhlIGJhc2VcbiAgICAvLyBxdWV1ZSBpcyBhIHNpbmdseS1saW5rZWQgbGlzdCB3aXRoIG5vIGN5Y2xlcywgd2UgY2FuIGFwcGVuZCB0byBib3RoXG4gICAgLy8gbGlzdHMgYW5kIHRha2UgYWR2YW50YWdlIG9mIHN0cnVjdHVyYWwgc2hhcmluZy5cbiAgICAvLyBUT0RPOiBQYXNzIGBjdXJyZW50YCBhcyBhcmd1bWVudFxuXG4gICAgdmFyIGN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGU7XG5cbiAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgLy8gVGhpcyBpcyBhbHdheXMgbm9uLW51bGwgb24gYSBDbGFzc0NvbXBvbmVudCBvciBIb3N0Um9vdFxuICAgICAgdmFyIGN1cnJlbnRRdWV1ZSA9IGN1cnJlbnQudXBkYXRlUXVldWU7XG4gICAgICB2YXIgY3VycmVudExhc3RCYXNlVXBkYXRlID0gY3VycmVudFF1ZXVlLmxhc3RCYXNlVXBkYXRlO1xuXG4gICAgICBpZiAoY3VycmVudExhc3RCYXNlVXBkYXRlICE9PSBsYXN0QmFzZVVwZGF0ZSkge1xuICAgICAgICBpZiAoY3VycmVudExhc3RCYXNlVXBkYXRlID09PSBudWxsKSB7XG4gICAgICAgICAgY3VycmVudFF1ZXVlLmZpcnN0QmFzZVVwZGF0ZSA9IGZpcnN0UGVuZGluZ1VwZGF0ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjdXJyZW50TGFzdEJhc2VVcGRhdGUubmV4dCA9IGZpcnN0UGVuZGluZ1VwZGF0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGN1cnJlbnRRdWV1ZS5sYXN0QmFzZVVwZGF0ZSA9IGxhc3RQZW5kaW5nVXBkYXRlO1xuICAgICAgfVxuICAgIH1cbiAgfSAvLyBUaGVzZSB2YWx1ZXMgbWF5IGNoYW5nZSBhcyB3ZSBwcm9jZXNzIHRoZSBxdWV1ZS5cblxuXG4gIGlmIChmaXJzdEJhc2VVcGRhdGUgIT09IG51bGwpIHtcbiAgICAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIGxpc3Qgb2YgdXBkYXRlcyB0byBjb21wdXRlIHRoZSByZXN1bHQuXG4gICAgdmFyIG5ld1N0YXRlID0gcXVldWUuYmFzZVN0YXRlOyAvLyBUT0RPOiBEb24ndCBuZWVkIHRvIGFjY3VtdWxhdGUgdGhpcy4gSW5zdGVhZCwgd2UgY2FuIHJlbW92ZSByZW5kZXJMYW5lc1xuICAgIC8vIGZyb20gdGhlIG9yaWdpbmFsIGxhbmVzLlxuXG4gICAgdmFyIG5ld0xhbmVzID0gTm9MYW5lcztcbiAgICB2YXIgbmV3QmFzZVN0YXRlID0gbnVsbDtcbiAgICB2YXIgbmV3Rmlyc3RCYXNlVXBkYXRlID0gbnVsbDtcbiAgICB2YXIgbmV3TGFzdEJhc2VVcGRhdGUgPSBudWxsO1xuICAgIHZhciB1cGRhdGUgPSBmaXJzdEJhc2VVcGRhdGU7XG5cbiAgICBkbyB7XG4gICAgICB2YXIgdXBkYXRlTGFuZSA9IHVwZGF0ZS5sYW5lO1xuICAgICAgdmFyIHVwZGF0ZUV2ZW50VGltZSA9IHVwZGF0ZS5ldmVudFRpbWU7XG5cbiAgICAgIGlmICghaXNTdWJzZXRPZkxhbmVzKHJlbmRlckxhbmVzLCB1cGRhdGVMYW5lKSkge1xuICAgICAgICAvLyBQcmlvcml0eSBpcyBpbnN1ZmZpY2llbnQuIFNraXAgdGhpcyB1cGRhdGUuIElmIHRoaXMgaXMgdGhlIGZpcnN0XG4gICAgICAgIC8vIHNraXBwZWQgdXBkYXRlLCB0aGUgcHJldmlvdXMgdXBkYXRlL3N0YXRlIGlzIHRoZSBuZXcgYmFzZVxuICAgICAgICAvLyB1cGRhdGUvc3RhdGUuXG4gICAgICAgIHZhciBjbG9uZSA9IHtcbiAgICAgICAgICBldmVudFRpbWU6IHVwZGF0ZUV2ZW50VGltZSxcbiAgICAgICAgICBsYW5lOiB1cGRhdGVMYW5lLFxuICAgICAgICAgIHRhZzogdXBkYXRlLnRhZyxcbiAgICAgICAgICBwYXlsb2FkOiB1cGRhdGUucGF5bG9hZCxcbiAgICAgICAgICBjYWxsYmFjazogdXBkYXRlLmNhbGxiYWNrLFxuICAgICAgICAgIG5leHQ6IG51bGxcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAobmV3TGFzdEJhc2VVcGRhdGUgPT09IG51bGwpIHtcbiAgICAgICAgICBuZXdGaXJzdEJhc2VVcGRhdGUgPSBuZXdMYXN0QmFzZVVwZGF0ZSA9IGNsb25lO1xuICAgICAgICAgIG5ld0Jhc2VTdGF0ZSA9IG5ld1N0YXRlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5ld0xhc3RCYXNlVXBkYXRlID0gbmV3TGFzdEJhc2VVcGRhdGUubmV4dCA9IGNsb25lO1xuICAgICAgICB9IC8vIFVwZGF0ZSB0aGUgcmVtYWluaW5nIHByaW9yaXR5IGluIHRoZSBxdWV1ZS5cblxuXG4gICAgICAgIG5ld0xhbmVzID0gbWVyZ2VMYW5lcyhuZXdMYW5lcywgdXBkYXRlTGFuZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUaGlzIHVwZGF0ZSBkb2VzIGhhdmUgc3VmZmljaWVudCBwcmlvcml0eS5cbiAgICAgICAgaWYgKG5ld0xhc3RCYXNlVXBkYXRlICE9PSBudWxsKSB7XG4gICAgICAgICAgdmFyIF9jbG9uZSA9IHtcbiAgICAgICAgICAgIGV2ZW50VGltZTogdXBkYXRlRXZlbnRUaW1lLFxuICAgICAgICAgICAgLy8gVGhpcyB1cGRhdGUgaXMgZ29pbmcgdG8gYmUgY29tbWl0dGVkIHNvIHdlIG5ldmVyIHdhbnQgdW5jb21taXRcbiAgICAgICAgICAgIC8vIGl0LiBVc2luZyBOb0xhbmUgd29ya3MgYmVjYXVzZSAwIGlzIGEgc3Vic2V0IG9mIGFsbCBiaXRtYXNrcywgc29cbiAgICAgICAgICAgIC8vIHRoaXMgd2lsbCBuZXZlciBiZSBza2lwcGVkIGJ5IHRoZSBjaGVjayBhYm92ZS5cbiAgICAgICAgICAgIGxhbmU6IE5vTGFuZSxcbiAgICAgICAgICAgIHRhZzogdXBkYXRlLnRhZyxcbiAgICAgICAgICAgIHBheWxvYWQ6IHVwZGF0ZS5wYXlsb2FkLFxuICAgICAgICAgICAgY2FsbGJhY2s6IHVwZGF0ZS5jYWxsYmFjayxcbiAgICAgICAgICAgIG5leHQ6IG51bGxcbiAgICAgICAgICB9O1xuICAgICAgICAgIG5ld0xhc3RCYXNlVXBkYXRlID0gbmV3TGFzdEJhc2VVcGRhdGUubmV4dCA9IF9jbG9uZTtcbiAgICAgICAgfSAvLyBQcm9jZXNzIHRoaXMgdXBkYXRlLlxuXG5cbiAgICAgICAgbmV3U3RhdGUgPSBnZXRTdGF0ZUZyb21VcGRhdGUod29ya0luUHJvZ3Jlc3MsIHF1ZXVlLCB1cGRhdGUsIG5ld1N0YXRlLCBwcm9wcywgaW5zdGFuY2UpO1xuICAgICAgICB2YXIgY2FsbGJhY2sgPSB1cGRhdGUuY2FsbGJhY2s7XG5cbiAgICAgICAgaWYgKGNhbGxiYWNrICE9PSBudWxsICYmIC8vIElmIHRoZSB1cGRhdGUgd2FzIGFscmVhZHkgY29tbWl0dGVkLCB3ZSBzaG91bGQgbm90IHF1ZXVlIGl0c1xuICAgICAgICAvLyBjYWxsYmFjayBhZ2Fpbi5cbiAgICAgICAgdXBkYXRlLmxhbmUgIT09IE5vTGFuZSkge1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IENhbGxiYWNrO1xuICAgICAgICAgIHZhciBlZmZlY3RzID0gcXVldWUuZWZmZWN0cztcblxuICAgICAgICAgIGlmIChlZmZlY3RzID09PSBudWxsKSB7XG4gICAgICAgICAgICBxdWV1ZS5lZmZlY3RzID0gW3VwZGF0ZV07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVmZmVjdHMucHVzaCh1cGRhdGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB1cGRhdGUgPSB1cGRhdGUubmV4dDtcblxuICAgICAgaWYgKHVwZGF0ZSA9PT0gbnVsbCkge1xuICAgICAgICBwZW5kaW5nUXVldWUgPSBxdWV1ZS5zaGFyZWQucGVuZGluZztcblxuICAgICAgICBpZiAocGVuZGluZ1F1ZXVlID09PSBudWxsKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gQW4gdXBkYXRlIHdhcyBzY2hlZHVsZWQgZnJvbSBpbnNpZGUgYSByZWR1Y2VyLiBBZGQgdGhlIG5ld1xuICAgICAgICAgIC8vIHBlbmRpbmcgdXBkYXRlcyB0byB0aGUgZW5kIG9mIHRoZSBsaXN0IGFuZCBrZWVwIHByb2Nlc3NpbmcuXG4gICAgICAgICAgdmFyIF9sYXN0UGVuZGluZ1VwZGF0ZSA9IHBlbmRpbmdRdWV1ZTsgLy8gSW50ZW50aW9uYWxseSB1bnNvdW5kLiBQZW5kaW5nIHVwZGF0ZXMgZm9ybSBhIGNpcmN1bGFyIGxpc3QsIGJ1dCB3ZVxuICAgICAgICAgIC8vIHVucmF2ZWwgdGhlbSB3aGVuIHRyYW5zZmVycmluZyB0aGVtIHRvIHRoZSBiYXNlIHF1ZXVlLlxuXG4gICAgICAgICAgdmFyIF9maXJzdFBlbmRpbmdVcGRhdGUgPSBfbGFzdFBlbmRpbmdVcGRhdGUubmV4dDtcbiAgICAgICAgICBfbGFzdFBlbmRpbmdVcGRhdGUubmV4dCA9IG51bGw7XG4gICAgICAgICAgdXBkYXRlID0gX2ZpcnN0UGVuZGluZ1VwZGF0ZTtcbiAgICAgICAgICBxdWV1ZS5sYXN0QmFzZVVwZGF0ZSA9IF9sYXN0UGVuZGluZ1VwZGF0ZTtcbiAgICAgICAgICBxdWV1ZS5zaGFyZWQucGVuZGluZyA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IHdoaWxlICh0cnVlKTtcblxuICAgIGlmIChuZXdMYXN0QmFzZVVwZGF0ZSA9PT0gbnVsbCkge1xuICAgICAgbmV3QmFzZVN0YXRlID0gbmV3U3RhdGU7XG4gICAgfVxuXG4gICAgcXVldWUuYmFzZVN0YXRlID0gbmV3QmFzZVN0YXRlO1xuICAgIHF1ZXVlLmZpcnN0QmFzZVVwZGF0ZSA9IG5ld0ZpcnN0QmFzZVVwZGF0ZTtcbiAgICBxdWV1ZS5sYXN0QmFzZVVwZGF0ZSA9IG5ld0xhc3RCYXNlVXBkYXRlOyAvLyBJbnRlcmxlYXZlZCB1cGRhdGVzIGFyZSBzdG9yZWQgb24gYSBzZXBhcmF0ZSBxdWV1ZS4gV2UgYXJlbid0IGdvaW5nIHRvXG4gICAgLy8gcHJvY2VzcyB0aGVtIGR1cmluZyB0aGlzIHJlbmRlciwgYnV0IHdlIGRvIG5lZWQgdG8gdHJhY2sgd2hpY2ggbGFuZXNcbiAgICAvLyBhcmUgcmVtYWluaW5nLlxuXG4gICAgdmFyIGxhc3RJbnRlcmxlYXZlZCA9IHF1ZXVlLnNoYXJlZC5pbnRlcmxlYXZlZDtcblxuICAgIGlmIChsYXN0SW50ZXJsZWF2ZWQgIT09IG51bGwpIHtcbiAgICAgIHZhciBpbnRlcmxlYXZlZCA9IGxhc3RJbnRlcmxlYXZlZDtcblxuICAgICAgZG8ge1xuICAgICAgICBuZXdMYW5lcyA9IG1lcmdlTGFuZXMobmV3TGFuZXMsIGludGVybGVhdmVkLmxhbmUpO1xuICAgICAgICBpbnRlcmxlYXZlZCA9IGludGVybGVhdmVkLm5leHQ7XG4gICAgICB9IHdoaWxlIChpbnRlcmxlYXZlZCAhPT0gbGFzdEludGVybGVhdmVkKTtcbiAgICB9IGVsc2UgaWYgKGZpcnN0QmFzZVVwZGF0ZSA9PT0gbnVsbCkge1xuICAgICAgLy8gYHF1ZXVlLmxhbmVzYCBpcyB1c2VkIGZvciBlbnRhbmdsaW5nIHRyYW5zaXRpb25zLiBXZSBjYW4gc2V0IGl0IGJhY2sgdG9cbiAgICAgIC8vIHplcm8gb25jZSB0aGUgcXVldWUgaXMgZW1wdHkuXG4gICAgICBxdWV1ZS5zaGFyZWQubGFuZXMgPSBOb0xhbmVzO1xuICAgIH0gLy8gU2V0IHRoZSByZW1haW5pbmcgZXhwaXJhdGlvbiB0aW1lIHRvIGJlIHdoYXRldmVyIGlzIHJlbWFpbmluZyBpbiB0aGUgcXVldWUuXG4gICAgLy8gVGhpcyBzaG91bGQgYmUgZmluZSBiZWNhdXNlIHRoZSBvbmx5IHR3byBvdGhlciB0aGluZ3MgdGhhdCBjb250cmlidXRlIHRvXG4gICAgLy8gZXhwaXJhdGlvbiB0aW1lIGFyZSBwcm9wcyBhbmQgY29udGV4dC4gV2UncmUgYWxyZWFkeSBpbiB0aGUgbWlkZGxlIG9mIHRoZVxuICAgIC8vIGJlZ2luIHBoYXNlIGJ5IHRoZSB0aW1lIHdlIHN0YXJ0IHByb2Nlc3NpbmcgdGhlIHF1ZXVlLCBzbyB3ZSd2ZSBhbHJlYWR5XG4gICAgLy8gZGVhbHQgd2l0aCB0aGUgcHJvcHMuIENvbnRleHQgaW4gY29tcG9uZW50cyB0aGF0IHNwZWNpZnlcbiAgICAvLyBzaG91bGRDb21wb25lbnRVcGRhdGUgaXMgdHJpY2t5OyBidXQgd2UnbGwgaGF2ZSB0byBhY2NvdW50IGZvclxuICAgIC8vIHRoYXQgcmVnYXJkbGVzcy5cblxuXG4gICAgbWFya1NraXBwZWRVcGRhdGVMYW5lcyhuZXdMYW5lcyk7XG4gICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBuZXdMYW5lcztcbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbmV3U3RhdGU7XG4gIH1cblxuICB7XG4gICAgY3VycmVudGx5UHJvY2Vzc2luZ1F1ZXVlID0gbnVsbDtcbiAgfVxufVxuXG5mdW5jdGlvbiBjYWxsQ2FsbGJhY2soY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBhcmd1bWVudCBwYXNzZWQgYXMgY2FsbGJhY2suIEV4cGVjdGVkIGEgZnVuY3Rpb24uIEluc3RlYWQgJyArIChcInJlY2VpdmVkOiBcIiArIGNhbGxiYWNrKSk7XG4gIH1cblxuICBjYWxsYmFjay5jYWxsKGNvbnRleHQpO1xufVxuXG5mdW5jdGlvbiByZXNldEhhc0ZvcmNlVXBkYXRlQmVmb3JlUHJvY2Vzc2luZygpIHtcbiAgaGFzRm9yY2VVcGRhdGUgPSBmYWxzZTtcbn1cbmZ1bmN0aW9uIGNoZWNrSGFzRm9yY2VVcGRhdGVBZnRlclByb2Nlc3NpbmcoKSB7XG4gIHJldHVybiBoYXNGb3JjZVVwZGF0ZTtcbn1cbmZ1bmN0aW9uIGNvbW1pdFVwZGF0ZVF1ZXVlKGZpbmlzaGVkV29yaywgZmluaXNoZWRRdWV1ZSwgaW5zdGFuY2UpIHtcbiAgLy8gQ29tbWl0IHRoZSBlZmZlY3RzXG4gIHZhciBlZmZlY3RzID0gZmluaXNoZWRRdWV1ZS5lZmZlY3RzO1xuICBmaW5pc2hlZFF1ZXVlLmVmZmVjdHMgPSBudWxsO1xuXG4gIGlmIChlZmZlY3RzICE9PSBudWxsKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlZmZlY3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWZmZWN0ID0gZWZmZWN0c1tpXTtcbiAgICAgIHZhciBjYWxsYmFjayA9IGVmZmVjdC5jYWxsYmFjaztcblxuICAgICAgaWYgKGNhbGxiYWNrICE9PSBudWxsKSB7XG4gICAgICAgIGVmZmVjdC5jYWxsYmFjayA9IG51bGw7XG4gICAgICAgIGNhbGxDYWxsYmFjayhjYWxsYmFjaywgaW5zdGFuY2UpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG52YXIgZmFrZUludGVybmFsSW5zdGFuY2UgPSB7fTsgLy8gUmVhY3QuQ29tcG9uZW50IHVzZXMgYSBzaGFyZWQgZnJvemVuIG9iamVjdCBieSBkZWZhdWx0LlxuLy8gV2UnbGwgdXNlIGl0IHRvIGRldGVybWluZSB3aGV0aGVyIHdlIG5lZWQgdG8gaW5pdGlhbGl6ZSBsZWdhY3kgcmVmcy5cblxudmFyIGVtcHR5UmVmc09iamVjdCA9IG5ldyBSZWFjdC5Db21wb25lbnQoKS5yZWZzO1xudmFyIGRpZFdhcm5BYm91dFN0YXRlQXNzaWdubWVudEZvckNvbXBvbmVudDtcbnZhciBkaWRXYXJuQWJvdXRVbmluaXRpYWxpemVkU3RhdGU7XG52YXIgZGlkV2FybkFib3V0R2V0U25hcHNob3RCZWZvcmVVcGRhdGVXaXRob3V0RGlkVXBkYXRlO1xudmFyIGRpZFdhcm5BYm91dExlZ2FjeUxpZmVjeWNsZXNBbmREZXJpdmVkU3RhdGU7XG52YXIgZGlkV2FybkFib3V0VW5kZWZpbmVkRGVyaXZlZFN0YXRlO1xudmFyIHdhcm5PblVuZGVmaW5lZERlcml2ZWRTdGF0ZTtcbnZhciB3YXJuT25JbnZhbGlkQ2FsbGJhY2s7XG52YXIgZGlkV2FybkFib3V0RGlyZWN0bHlBc3NpZ25pbmdQcm9wc1RvU3RhdGU7XG52YXIgZGlkV2FybkFib3V0Q29udGV4dFR5cGVBbmRDb250ZXh0VHlwZXM7XG52YXIgZGlkV2FybkFib3V0SW52YWxpZGF0ZUNvbnRleHRUeXBlO1xuXG57XG4gIGRpZFdhcm5BYm91dFN0YXRlQXNzaWdubWVudEZvckNvbXBvbmVudCA9IG5ldyBTZXQoKTtcbiAgZGlkV2FybkFib3V0VW5pbml0aWFsaXplZFN0YXRlID0gbmV3IFNldCgpO1xuICBkaWRXYXJuQWJvdXRHZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZVdpdGhvdXREaWRVcGRhdGUgPSBuZXcgU2V0KCk7XG4gIGRpZFdhcm5BYm91dExlZ2FjeUxpZmVjeWNsZXNBbmREZXJpdmVkU3RhdGUgPSBuZXcgU2V0KCk7XG4gIGRpZFdhcm5BYm91dERpcmVjdGx5QXNzaWduaW5nUHJvcHNUb1N0YXRlID0gbmV3IFNldCgpO1xuICBkaWRXYXJuQWJvdXRVbmRlZmluZWREZXJpdmVkU3RhdGUgPSBuZXcgU2V0KCk7XG4gIGRpZFdhcm5BYm91dENvbnRleHRUeXBlQW5kQ29udGV4dFR5cGVzID0gbmV3IFNldCgpO1xuICBkaWRXYXJuQWJvdXRJbnZhbGlkYXRlQ29udGV4dFR5cGUgPSBuZXcgU2V0KCk7XG4gIHZhciBkaWRXYXJuT25JbnZhbGlkQ2FsbGJhY2sgPSBuZXcgU2V0KCk7XG5cbiAgd2Fybk9uSW52YWxpZENhbGxiYWNrID0gZnVuY3Rpb24gKGNhbGxiYWNrLCBjYWxsZXJOYW1lKSB7XG4gICAgaWYgKGNhbGxiYWNrID09PSBudWxsIHx8IHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBrZXkgPSBjYWxsZXJOYW1lICsgJ18nICsgY2FsbGJhY2s7XG5cbiAgICBpZiAoIWRpZFdhcm5PbkludmFsaWRDYWxsYmFjay5oYXMoa2V5KSkge1xuICAgICAgZGlkV2Fybk9uSW52YWxpZENhbGxiYWNrLmFkZChrZXkpO1xuXG4gICAgICBlcnJvcignJXMoLi4uKTogRXhwZWN0ZWQgdGhlIGxhc3Qgb3B0aW9uYWwgYGNhbGxiYWNrYCBhcmd1bWVudCB0byBiZSBhICcgKyAnZnVuY3Rpb24uIEluc3RlYWQgcmVjZWl2ZWQ6ICVzLicsIGNhbGxlck5hbWUsIGNhbGxiYWNrKTtcbiAgICB9XG4gIH07XG5cbiAgd2Fybk9uVW5kZWZpbmVkRGVyaXZlZFN0YXRlID0gZnVuY3Rpb24gKHR5cGUsIHBhcnRpYWxTdGF0ZSkge1xuICAgIGlmIChwYXJ0aWFsU3RhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZSkgfHwgJ0NvbXBvbmVudCc7XG5cbiAgICAgIGlmICghZGlkV2FybkFib3V0VW5kZWZpbmVkRGVyaXZlZFN0YXRlLmhhcyhjb21wb25lbnROYW1lKSkge1xuICAgICAgICBkaWRXYXJuQWJvdXRVbmRlZmluZWREZXJpdmVkU3RhdGUuYWRkKGNvbXBvbmVudE5hbWUpO1xuXG4gICAgICAgIGVycm9yKCclcy5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMoKTogQSB2YWxpZCBzdGF0ZSBvYmplY3QgKG9yIG51bGwpIG11c3QgYmUgcmV0dXJuZWQuICcgKyAnWW91IGhhdmUgcmV0dXJuZWQgdW5kZWZpbmVkLicsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfTsgLy8gVGhpcyBpcyBzbyBncm9zcyBidXQgaXQncyBhdCBsZWFzdCBub24tY3JpdGljYWwgYW5kIGNhbiBiZSByZW1vdmVkIGlmXG4gIC8vIGl0IGNhdXNlcyBwcm9ibGVtcy4gVGhpcyBpcyBtZWFudCB0byBnaXZlIGEgbmljZXIgZXJyb3IgbWVzc2FnZSBmb3JcbiAgLy8gUmVhY3RET00xNS51bnN0YWJsZV9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihyZWFjdERPTTE2Q29tcG9uZW50LFxuICAvLyAuLi4pKSB3aGljaCBvdGhlcndpc2UgdGhyb3dzIGEgXCJfcHJvY2Vzc0NoaWxkQ29udGV4dCBpcyBub3QgYSBmdW5jdGlvblwiXG4gIC8vIGV4Y2VwdGlvbi5cblxuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmYWtlSW50ZXJuYWxJbnN0YW5jZSwgJ19wcm9jZXNzQ2hpbGRDb250ZXh0Jywge1xuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ19wcm9jZXNzQ2hpbGRDb250ZXh0IGlzIG5vdCBhdmFpbGFibGUgaW4gUmVhY3QgMTYrLiBUaGlzIGxpa2VseSAnICsgJ21lYW5zIHlvdSBoYXZlIG11bHRpcGxlIGNvcGllcyBvZiBSZWFjdCBhbmQgYXJlIGF0dGVtcHRpbmcgdG8gbmVzdCAnICsgJ2EgUmVhY3QgMTUgdHJlZSBpbnNpZGUgYSBSZWFjdCAxNiB0cmVlIHVzaW5nICcgKyBcInVuc3RhYmxlX3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyLCB3aGljaCBpc24ndCBzdXBwb3J0ZWQuIFRyeSBcIiArICd0byBtYWtlIHN1cmUgeW91IGhhdmUgb25seSBvbmUgY29weSBvZiBSZWFjdCAoYW5kIGlkZWFsbHksIHN3aXRjaCAnICsgJ3RvIFJlYWN0RE9NLmNyZWF0ZVBvcnRhbCkuJyk7XG4gICAgfVxuICB9KTtcbiAgT2JqZWN0LmZyZWV6ZShmYWtlSW50ZXJuYWxJbnN0YW5jZSk7XG59XG5cbmZ1bmN0aW9uIGFwcGx5RGVyaXZlZFN0YXRlRnJvbVByb3BzKHdvcmtJblByb2dyZXNzLCBjdG9yLCBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMsIG5leHRQcm9wcykge1xuICB2YXIgcHJldlN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgdmFyIHBhcnRpYWxTdGF0ZSA9IGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhuZXh0UHJvcHMsIHByZXZTdGF0ZSk7XG5cbiAge1xuICAgIGlmICggd29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKHRydWUpO1xuXG4gICAgICB0cnkge1xuICAgICAgICAvLyBJbnZva2UgdGhlIGZ1bmN0aW9uIGFuIGV4dHJhIHRpbWUgdG8gaGVscCBkZXRlY3Qgc2lkZS1lZmZlY3RzLlxuICAgICAgICBwYXJ0aWFsU3RhdGUgPSBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMobmV4dFByb3BzLCBwcmV2U3RhdGUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHMoZmFsc2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHdhcm5PblVuZGVmaW5lZERlcml2ZWRTdGF0ZShjdG9yLCBwYXJ0aWFsU3RhdGUpO1xuICB9IC8vIE1lcmdlIHRoZSBwYXJ0aWFsIHN0YXRlIGFuZCB0aGUgcHJldmlvdXMgc3RhdGUuXG5cblxuICB2YXIgbWVtb2l6ZWRTdGF0ZSA9IHBhcnRpYWxTdGF0ZSA9PT0gbnVsbCB8fCBwYXJ0aWFsU3RhdGUgPT09IHVuZGVmaW5lZCA/IHByZXZTdGF0ZSA6IGFzc2lnbih7fSwgcHJldlN0YXRlLCBwYXJ0aWFsU3RhdGUpO1xuICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbWVtb2l6ZWRTdGF0ZTsgLy8gT25jZSB0aGUgdXBkYXRlIHF1ZXVlIGlzIGVtcHR5LCBwZXJzaXN0IHRoZSBkZXJpdmVkIHN0YXRlIG9udG8gdGhlXG4gIC8vIGJhc2Ugc3RhdGUuXG5cbiAgaWYgKHdvcmtJblByb2dyZXNzLmxhbmVzID09PSBOb0xhbmVzKSB7XG4gICAgLy8gUXVldWUgaXMgYWx3YXlzIG5vbi1udWxsIGZvciBjbGFzc2VzXG4gICAgdmFyIHVwZGF0ZVF1ZXVlID0gd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWU7XG4gICAgdXBkYXRlUXVldWUuYmFzZVN0YXRlID0gbWVtb2l6ZWRTdGF0ZTtcbiAgfVxufVxuXG52YXIgY2xhc3NDb21wb25lbnRVcGRhdGVyID0ge1xuICBpc01vdW50ZWQ6IGlzTW91bnRlZCxcbiAgZW5xdWV1ZVNldFN0YXRlOiBmdW5jdGlvbiAoaW5zdCwgcGF5bG9hZCwgY2FsbGJhY2spIHtcbiAgICB2YXIgZmliZXIgPSBnZXQoaW5zdCk7XG4gICAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgICB2YXIgbGFuZSA9IHJlcXVlc3RVcGRhdGVMYW5lKGZpYmVyKTtcbiAgICB2YXIgdXBkYXRlID0gY3JlYXRlVXBkYXRlKGV2ZW50VGltZSwgbGFuZSk7XG4gICAgdXBkYXRlLnBheWxvYWQgPSBwYXlsb2FkO1xuXG4gICAgaWYgKGNhbGxiYWNrICE9PSB1bmRlZmluZWQgJiYgY2FsbGJhY2sgIT09IG51bGwpIHtcbiAgICAgIHtcbiAgICAgICAgd2Fybk9uSW52YWxpZENhbGxiYWNrKGNhbGxiYWNrLCAnc2V0U3RhdGUnKTtcbiAgICAgIH1cblxuICAgICAgdXBkYXRlLmNhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgfVxuXG4gICAgdmFyIHJvb3QgPSBlbnF1ZXVlVXBkYXRlKGZpYmVyLCB1cGRhdGUsIGxhbmUpO1xuXG4gICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgbGFuZSwgZXZlbnRUaW1lKTtcbiAgICAgIGVudGFuZ2xlVHJhbnNpdGlvbnMocm9vdCwgZmliZXIsIGxhbmUpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIG1hcmtTdGF0ZVVwZGF0ZVNjaGVkdWxlZChmaWJlciwgbGFuZSk7XG4gICAgfVxuICB9LFxuICBlbnF1ZXVlUmVwbGFjZVN0YXRlOiBmdW5jdGlvbiAoaW5zdCwgcGF5bG9hZCwgY2FsbGJhY2spIHtcbiAgICB2YXIgZmliZXIgPSBnZXQoaW5zdCk7XG4gICAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgICB2YXIgbGFuZSA9IHJlcXVlc3RVcGRhdGVMYW5lKGZpYmVyKTtcbiAgICB2YXIgdXBkYXRlID0gY3JlYXRlVXBkYXRlKGV2ZW50VGltZSwgbGFuZSk7XG4gICAgdXBkYXRlLnRhZyA9IFJlcGxhY2VTdGF0ZTtcbiAgICB1cGRhdGUucGF5bG9hZCA9IHBheWxvYWQ7XG5cbiAgICBpZiAoY2FsbGJhY2sgIT09IHVuZGVmaW5lZCAmJiBjYWxsYmFjayAhPT0gbnVsbCkge1xuICAgICAge1xuICAgICAgICB3YXJuT25JbnZhbGlkQ2FsbGJhY2soY2FsbGJhY2ssICdyZXBsYWNlU3RhdGUnKTtcbiAgICAgIH1cblxuICAgICAgdXBkYXRlLmNhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgfVxuXG4gICAgdmFyIHJvb3QgPSBlbnF1ZXVlVXBkYXRlKGZpYmVyLCB1cGRhdGUsIGxhbmUpO1xuXG4gICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgbGFuZSwgZXZlbnRUaW1lKTtcbiAgICAgIGVudGFuZ2xlVHJhbnNpdGlvbnMocm9vdCwgZmliZXIsIGxhbmUpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIG1hcmtTdGF0ZVVwZGF0ZVNjaGVkdWxlZChmaWJlciwgbGFuZSk7XG4gICAgfVxuICB9LFxuICBlbnF1ZXVlRm9yY2VVcGRhdGU6IGZ1bmN0aW9uIChpbnN0LCBjYWxsYmFjaykge1xuICAgIHZhciBmaWJlciA9IGdldChpbnN0KTtcbiAgICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuICAgIHZhciBsYW5lID0gcmVxdWVzdFVwZGF0ZUxhbmUoZmliZXIpO1xuICAgIHZhciB1cGRhdGUgPSBjcmVhdGVVcGRhdGUoZXZlbnRUaW1lLCBsYW5lKTtcbiAgICB1cGRhdGUudGFnID0gRm9yY2VVcGRhdGU7XG5cbiAgICBpZiAoY2FsbGJhY2sgIT09IHVuZGVmaW5lZCAmJiBjYWxsYmFjayAhPT0gbnVsbCkge1xuICAgICAge1xuICAgICAgICB3YXJuT25JbnZhbGlkQ2FsbGJhY2soY2FsbGJhY2ssICdmb3JjZVVwZGF0ZScpO1xuICAgICAgfVxuXG4gICAgICB1cGRhdGUuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICB9XG5cbiAgICB2YXIgcm9vdCA9IGVucXVldWVVcGRhdGUoZmliZXIsIHVwZGF0ZSwgbGFuZSk7XG5cbiAgICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBsYW5lLCBldmVudFRpbWUpO1xuICAgICAgZW50YW5nbGVUcmFuc2l0aW9ucyhyb290LCBmaWJlciwgbGFuZSk7XG4gICAgfVxuXG4gICAge1xuICAgICAgbWFya0ZvcmNlVXBkYXRlU2NoZWR1bGVkKGZpYmVyLCBsYW5lKTtcbiAgICB9XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGNoZWNrU2hvdWxkQ29tcG9uZW50VXBkYXRlKHdvcmtJblByb2dyZXNzLCBjdG9yLCBvbGRQcm9wcywgbmV3UHJvcHMsIG9sZFN0YXRlLCBuZXdTdGF0ZSwgbmV4dENvbnRleHQpIHtcbiAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuXG4gIGlmICh0eXBlb2YgaW5zdGFuY2Uuc2hvdWxkQ29tcG9uZW50VXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdmFyIHNob3VsZFVwZGF0ZSA9IGluc3RhbmNlLnNob3VsZENvbXBvbmVudFVwZGF0ZShuZXdQcm9wcywgbmV3U3RhdGUsIG5leHRDb250ZXh0KTtcblxuICAgIHtcbiAgICAgIGlmICggd29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHModHJ1ZSk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBJbnZva2UgdGhlIGZ1bmN0aW9uIGFuIGV4dHJhIHRpbWUgdG8gaGVscCBkZXRlY3Qgc2lkZS1lZmZlY3RzLlxuICAgICAgICAgIHNob3VsZFVwZGF0ZSA9IGluc3RhbmNlLnNob3VsZENvbXBvbmVudFVwZGF0ZShuZXdQcm9wcywgbmV3U3RhdGUsIG5leHRDb250ZXh0KTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyhmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHNob3VsZFVwZGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGVycm9yKCclcy5zaG91bGRDb21wb25lbnRVcGRhdGUoKTogUmV0dXJuZWQgdW5kZWZpbmVkIGluc3RlYWQgb2YgYSAnICsgJ2Jvb2xlYW4gdmFsdWUuIE1ha2Ugc3VyZSB0byByZXR1cm4gdHJ1ZSBvciBmYWxzZS4nLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoY3RvcikgfHwgJ0NvbXBvbmVudCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzaG91bGRVcGRhdGU7XG4gIH1cblxuICBpZiAoY3Rvci5wcm90b3R5cGUgJiYgY3Rvci5wcm90b3R5cGUuaXNQdXJlUmVhY3RDb21wb25lbnQpIHtcbiAgICByZXR1cm4gIXNoYWxsb3dFcXVhbChvbGRQcm9wcywgbmV3UHJvcHMpIHx8ICFzaGFsbG93RXF1YWwob2xkU3RhdGUsIG5ld1N0YXRlKTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBjaGVja0NsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIGN0b3IsIG5ld1Byb3BzKSB7XG4gIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcblxuICB7XG4gICAgdmFyIG5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoY3RvcikgfHwgJ0NvbXBvbmVudCc7XG4gICAgdmFyIHJlbmRlclByZXNlbnQgPSBpbnN0YW5jZS5yZW5kZXI7XG5cbiAgICBpZiAoIXJlbmRlclByZXNlbnQpIHtcbiAgICAgIGlmIChjdG9yLnByb3RvdHlwZSAmJiB0eXBlb2YgY3Rvci5wcm90b3R5cGUucmVuZGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGVycm9yKCclcyguLi4pOiBObyBgcmVuZGVyYCBtZXRob2QgZm91bmQgb24gdGhlIHJldHVybmVkIGNvbXBvbmVudCAnICsgJ2luc3RhbmNlOiBkaWQgeW91IGFjY2lkZW50YWxseSByZXR1cm4gYW4gb2JqZWN0IGZyb20gdGhlIGNvbnN0cnVjdG9yPycsIG5hbWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3IoJyVzKC4uLik6IE5vIGByZW5kZXJgIG1ldGhvZCBmb3VuZCBvbiB0aGUgcmV0dXJuZWQgY29tcG9uZW50ICcgKyAnaW5zdGFuY2U6IHlvdSBtYXkgaGF2ZSBmb3Jnb3R0ZW4gdG8gZGVmaW5lIGByZW5kZXJgLicsIG5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpbnN0YW5jZS5nZXRJbml0aWFsU3RhdGUgJiYgIWluc3RhbmNlLmdldEluaXRpYWxTdGF0ZS5pc1JlYWN0Q2xhc3NBcHByb3ZlZCAmJiAhaW5zdGFuY2Uuc3RhdGUpIHtcbiAgICAgIGVycm9yKCdnZXRJbml0aWFsU3RhdGUgd2FzIGRlZmluZWQgb24gJXMsIGEgcGxhaW4gSmF2YVNjcmlwdCBjbGFzcy4gJyArICdUaGlzIGlzIG9ubHkgc3VwcG9ydGVkIGZvciBjbGFzc2VzIGNyZWF0ZWQgdXNpbmcgUmVhY3QuY3JlYXRlQ2xhc3MuICcgKyAnRGlkIHlvdSBtZWFuIHRvIGRlZmluZSBhIHN0YXRlIHByb3BlcnR5IGluc3RlYWQ/JywgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKGluc3RhbmNlLmdldERlZmF1bHRQcm9wcyAmJiAhaW5zdGFuY2UuZ2V0RGVmYXVsdFByb3BzLmlzUmVhY3RDbGFzc0FwcHJvdmVkKSB7XG4gICAgICBlcnJvcignZ2V0RGVmYXVsdFByb3BzIHdhcyBkZWZpbmVkIG9uICVzLCBhIHBsYWluIEphdmFTY3JpcHQgY2xhc3MuICcgKyAnVGhpcyBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgY2xhc3NlcyBjcmVhdGVkIHVzaW5nIFJlYWN0LmNyZWF0ZUNsYXNzLiAnICsgJ1VzZSBhIHN0YXRpYyBwcm9wZXJ0eSB0byBkZWZpbmUgZGVmYXVsdFByb3BzIGluc3RlYWQuJywgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKGluc3RhbmNlLnByb3BUeXBlcykge1xuICAgICAgZXJyb3IoJ3Byb3BUeXBlcyB3YXMgZGVmaW5lZCBhcyBhbiBpbnN0YW5jZSBwcm9wZXJ0eSBvbiAlcy4gVXNlIGEgc3RhdGljICcgKyAncHJvcGVydHkgdG8gZGVmaW5lIHByb3BUeXBlcyBpbnN0ZWFkLicsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmIChpbnN0YW5jZS5jb250ZXh0VHlwZSkge1xuICAgICAgZXJyb3IoJ2NvbnRleHRUeXBlIHdhcyBkZWZpbmVkIGFzIGFuIGluc3RhbmNlIHByb3BlcnR5IG9uICVzLiBVc2UgYSBzdGF0aWMgJyArICdwcm9wZXJ0eSB0byBkZWZpbmUgY29udGV4dFR5cGUgaW5zdGVhZC4nLCBuYW1lKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBpZiAoaW5zdGFuY2UuY29udGV4dFR5cGVzKSB7XG4gICAgICAgIGVycm9yKCdjb250ZXh0VHlwZXMgd2FzIGRlZmluZWQgYXMgYW4gaW5zdGFuY2UgcHJvcGVydHkgb24gJXMuIFVzZSBhIHN0YXRpYyAnICsgJ3Byb3BlcnR5IHRvIGRlZmluZSBjb250ZXh0VHlwZXMgaW5zdGVhZC4nLCBuYW1lKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGN0b3IuY29udGV4dFR5cGUgJiYgY3Rvci5jb250ZXh0VHlwZXMgJiYgIWRpZFdhcm5BYm91dENvbnRleHRUeXBlQW5kQ29udGV4dFR5cGVzLmhhcyhjdG9yKSkge1xuICAgICAgICBkaWRXYXJuQWJvdXRDb250ZXh0VHlwZUFuZENvbnRleHRUeXBlcy5hZGQoY3Rvcik7XG5cbiAgICAgICAgZXJyb3IoJyVzIGRlY2xhcmVzIGJvdGggY29udGV4dFR5cGVzIGFuZCBjb250ZXh0VHlwZSBzdGF0aWMgcHJvcGVydGllcy4gJyArICdUaGUgbGVnYWN5IGNvbnRleHRUeXBlcyBwcm9wZXJ0eSB3aWxsIGJlIGlnbm9yZWQuJywgbmFtZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRTaG91bGRVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCclcyBoYXMgYSBtZXRob2QgY2FsbGVkICcgKyAnY29tcG9uZW50U2hvdWxkVXBkYXRlKCkuIERpZCB5b3UgbWVhbiBzaG91bGRDb21wb25lbnRVcGRhdGUoKT8gJyArICdUaGUgbmFtZSBpcyBwaHJhc2VkIGFzIGEgcXVlc3Rpb24gYmVjYXVzZSB0aGUgZnVuY3Rpb24gaXMgJyArICdleHBlY3RlZCB0byByZXR1cm4gYSB2YWx1ZS4nLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAoY3Rvci5wcm90b3R5cGUgJiYgY3Rvci5wcm90b3R5cGUuaXNQdXJlUmVhY3RDb21wb25lbnQgJiYgdHlwZW9mIGluc3RhbmNlLnNob3VsZENvbXBvbmVudFVwZGF0ZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGVycm9yKCclcyBoYXMgYSBtZXRob2QgY2FsbGVkIHNob3VsZENvbXBvbmVudFVwZGF0ZSgpLiAnICsgJ3Nob3VsZENvbXBvbmVudFVwZGF0ZSBzaG91bGQgbm90IGJlIHVzZWQgd2hlbiBleHRlbmRpbmcgUmVhY3QuUHVyZUNvbXBvbmVudC4gJyArICdQbGVhc2UgZXh0ZW5kIFJlYWN0LkNvbXBvbmVudCBpZiBzaG91bGRDb21wb25lbnRVcGRhdGUgaXMgdXNlZC4nLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoY3RvcikgfHwgJ0EgcHVyZSBjb21wb25lbnQnKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZFVubW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCclcyBoYXMgYSBtZXRob2QgY2FsbGVkICcgKyAnY29tcG9uZW50RGlkVW5tb3VudCgpLiBCdXQgdGhlcmUgaXMgbm8gc3VjaCBsaWZlY3ljbGUgbWV0aG9kLiAnICsgJ0RpZCB5b3UgbWVhbiBjb21wb25lbnRXaWxsVW5tb3VudCgpPycsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignJXMgaGFzIGEgbWV0aG9kIGNhbGxlZCAnICsgJ2NvbXBvbmVudERpZFJlY2VpdmVQcm9wcygpLiBCdXQgdGhlcmUgaXMgbm8gc3VjaCBsaWZlY3ljbGUgbWV0aG9kLiAnICsgJ0lmIHlvdSBtZWFudCB0byB1cGRhdGUgdGhlIHN0YXRlIGluIHJlc3BvbnNlIHRvIGNoYW5naW5nIHByb3BzLCAnICsgJ3VzZSBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKCkuIElmIHlvdSBtZWFudCB0byBmZXRjaCBkYXRhIG9yICcgKyAncnVuIHNpZGUtZWZmZWN0cyBvciBtdXRhdGlvbnMgYWZ0ZXIgUmVhY3QgaGFzIHVwZGF0ZWQgdGhlIFVJLCB1c2UgY29tcG9uZW50RGlkVXBkYXRlKCkuJywgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsUmVjaWV2ZVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignJXMgaGFzIGEgbWV0aG9kIGNhbGxlZCAnICsgJ2NvbXBvbmVudFdpbGxSZWNpZXZlUHJvcHMoKS4gRGlkIHlvdSBtZWFuIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMoKT8nLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjaWV2ZVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignJXMgaGFzIGEgbWV0aG9kIGNhbGxlZCAnICsgJ1VOU0FGRV9jb21wb25lbnRXaWxsUmVjaWV2ZVByb3BzKCkuIERpZCB5b3UgbWVhbiBVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcygpPycsIG5hbWUpO1xuICAgIH1cblxuICAgIHZhciBoYXNNdXRhdGVkUHJvcHMgPSBpbnN0YW5jZS5wcm9wcyAhPT0gbmV3UHJvcHM7XG5cbiAgICBpZiAoaW5zdGFuY2UucHJvcHMgIT09IHVuZGVmaW5lZCAmJiBoYXNNdXRhdGVkUHJvcHMpIHtcbiAgICAgIGVycm9yKCclcyguLi4pOiBXaGVuIGNhbGxpbmcgc3VwZXIoKSBpbiBgJXNgLCBtYWtlIHN1cmUgdG8gcGFzcyAnICsgXCJ1cCB0aGUgc2FtZSBwcm9wcyB0aGF0IHlvdXIgY29tcG9uZW50J3MgY29uc3RydWN0b3Igd2FzIHBhc3NlZC5cIiwgbmFtZSwgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKGluc3RhbmNlLmRlZmF1bHRQcm9wcykge1xuICAgICAgZXJyb3IoJ1NldHRpbmcgZGVmYXVsdFByb3BzIGFzIGFuIGluc3RhbmNlIHByb3BlcnR5IG9uICVzIGlzIG5vdCBzdXBwb3J0ZWQgYW5kIHdpbGwgYmUgaWdub3JlZC4nICsgJyBJbnN0ZWFkLCBkZWZpbmUgZGVmYXVsdFByb3BzIGFzIGEgc3RhdGljIHByb3BlcnR5IG9uICVzLicsIG5hbWUsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZFVwZGF0ZSAhPT0gJ2Z1bmN0aW9uJyAmJiAhZGlkV2FybkFib3V0R2V0U25hcHNob3RCZWZvcmVVcGRhdGVXaXRob3V0RGlkVXBkYXRlLmhhcyhjdG9yKSkge1xuICAgICAgZGlkV2FybkFib3V0R2V0U25hcHNob3RCZWZvcmVVcGRhdGVXaXRob3V0RGlkVXBkYXRlLmFkZChjdG9yKTtcblxuICAgICAgZXJyb3IoJyVzOiBnZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSgpIHNob3VsZCBiZSB1c2VkIHdpdGggY29tcG9uZW50RGlkVXBkYXRlKCkuICcgKyAnVGhpcyBjb21wb25lbnQgZGVmaW5lcyBnZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSgpIG9ubHkuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKGN0b3IpKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJyVzOiBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMoKSBpcyBkZWZpbmVkIGFzIGFuIGluc3RhbmNlIG1ldGhvZCAnICsgJ2FuZCB3aWxsIGJlIGlnbm9yZWQuIEluc3RlYWQsIGRlY2xhcmUgaXQgYXMgYSBzdGF0aWMgbWV0aG9kLicsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignJXM6IGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcigpIGlzIGRlZmluZWQgYXMgYW4gaW5zdGFuY2UgbWV0aG9kICcgKyAnYW5kIHdpbGwgYmUgaWdub3JlZC4gSW5zdGVhZCwgZGVjbGFyZSBpdCBhcyBhIHN0YXRpYyBtZXRob2QuJywgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjdG9yLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignJXM6IGdldFNuYXBzaG90QmVmb3JlVXBkYXRlKCkgaXMgZGVmaW5lZCBhcyBhIHN0YXRpYyBtZXRob2QgJyArICdhbmQgd2lsbCBiZSBpZ25vcmVkLiBJbnN0ZWFkLCBkZWNsYXJlIGl0IGFzIGFuIGluc3RhbmNlIG1ldGhvZC4nLCBuYW1lKTtcbiAgICB9XG5cbiAgICB2YXIgX3N0YXRlID0gaW5zdGFuY2Uuc3RhdGU7XG5cbiAgICBpZiAoX3N0YXRlICYmICh0eXBlb2YgX3N0YXRlICE9PSAnb2JqZWN0JyB8fCBpc0FycmF5KF9zdGF0ZSkpKSB7XG4gICAgICBlcnJvcignJXMuc3RhdGU6IG11c3QgYmUgc2V0IHRvIGFuIG9iamVjdCBvciBudWxsJywgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5nZXRDaGlsZENvbnRleHQgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGN0b3IuY2hpbGRDb250ZXh0VHlwZXMgIT09ICdvYmplY3QnKSB7XG4gICAgICBlcnJvcignJXMuZ2V0Q2hpbGRDb250ZXh0KCk6IGNoaWxkQ29udGV4dFR5cGVzIG11c3QgYmUgZGVmaW5lZCBpbiBvcmRlciB0byAnICsgJ3VzZSBnZXRDaGlsZENvbnRleHQoKS4nLCBuYW1lKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYWRvcHRDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBpbnN0YW5jZSkge1xuICBpbnN0YW5jZS51cGRhdGVyID0gY2xhc3NDb21wb25lbnRVcGRhdGVyO1xuICB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgPSBpbnN0YW5jZTsgLy8gVGhlIGluc3RhbmNlIG5lZWRzIGFjY2VzcyB0byB0aGUgZmliZXIgc28gdGhhdCBpdCBjYW4gc2NoZWR1bGUgdXBkYXRlc1xuXG4gIHNldChpbnN0YW5jZSwgd29ya0luUHJvZ3Jlc3MpO1xuXG4gIHtcbiAgICBpbnN0YW5jZS5fcmVhY3RJbnRlcm5hbEluc3RhbmNlID0gZmFrZUludGVybmFsSW5zdGFuY2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29uc3RydWN0Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgY3RvciwgcHJvcHMpIHtcbiAgdmFyIGlzTGVnYWN5Q29udGV4dENvbnN1bWVyID0gZmFsc2U7XG4gIHZhciB1bm1hc2tlZENvbnRleHQgPSBlbXB0eUNvbnRleHRPYmplY3Q7XG4gIHZhciBjb250ZXh0ID0gZW1wdHlDb250ZXh0T2JqZWN0O1xuICB2YXIgY29udGV4dFR5cGUgPSBjdG9yLmNvbnRleHRUeXBlO1xuXG4gIHtcbiAgICBpZiAoJ2NvbnRleHRUeXBlJyBpbiBjdG9yKSB7XG4gICAgICB2YXIgaXNWYWxpZCA9IC8vIEFsbG93IG51bGwgZm9yIGNvbmRpdGlvbmFsIGRlY2xhcmF0aW9uXG4gICAgICBjb250ZXh0VHlwZSA9PT0gbnVsbCB8fCBjb250ZXh0VHlwZSAhPT0gdW5kZWZpbmVkICYmIGNvbnRleHRUeXBlLiQkdHlwZW9mID09PSBSRUFDVF9DT05URVhUX1RZUEUgJiYgY29udGV4dFR5cGUuX2NvbnRleHQgPT09IHVuZGVmaW5lZDsgLy8gTm90IGEgPENvbnRleHQuQ29uc3VtZXI+XG5cbiAgICAgIGlmICghaXNWYWxpZCAmJiAhZGlkV2FybkFib3V0SW52YWxpZGF0ZUNvbnRleHRUeXBlLmhhcyhjdG9yKSkge1xuICAgICAgICBkaWRXYXJuQWJvdXRJbnZhbGlkYXRlQ29udGV4dFR5cGUuYWRkKGN0b3IpO1xuICAgICAgICB2YXIgYWRkZW5kdW0gPSAnJztcblxuICAgICAgICBpZiAoY29udGV4dFR5cGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGFkZGVuZHVtID0gJyBIb3dldmVyLCBpdCBpcyBzZXQgdG8gdW5kZWZpbmVkLiAnICsgJ1RoaXMgY2FuIGJlIGNhdXNlZCBieSBhIHR5cG8gb3IgYnkgbWl4aW5nIHVwIG5hbWVkIGFuZCBkZWZhdWx0IGltcG9ydHMuICcgKyAnVGhpcyBjYW4gYWxzbyBoYXBwZW4gZHVlIHRvIGEgY2lyY3VsYXIgZGVwZW5kZW5jeSwgc28gJyArICd0cnkgbW92aW5nIHRoZSBjcmVhdGVDb250ZXh0KCkgY2FsbCB0byBhIHNlcGFyYXRlIGZpbGUuJztcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgY29udGV4dFR5cGUgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgYWRkZW5kdW0gPSAnIEhvd2V2ZXIsIGl0IGlzIHNldCB0byBhICcgKyB0eXBlb2YgY29udGV4dFR5cGUgKyAnLic7XG4gICAgICAgIH0gZWxzZSBpZiAoY29udGV4dFR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX1BST1ZJREVSX1RZUEUpIHtcbiAgICAgICAgICBhZGRlbmR1bSA9ICcgRGlkIHlvdSBhY2NpZGVudGFsbHkgcGFzcyB0aGUgQ29udGV4dC5Qcm92aWRlciBpbnN0ZWFkPyc7XG4gICAgICAgIH0gZWxzZSBpZiAoY29udGV4dFR5cGUuX2NvbnRleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIDxDb250ZXh0LkNvbnN1bWVyPlxuICAgICAgICAgIGFkZGVuZHVtID0gJyBEaWQgeW91IGFjY2lkZW50YWxseSBwYXNzIHRoZSBDb250ZXh0LkNvbnN1bWVyIGluc3RlYWQ/JztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhZGRlbmR1bSA9ICcgSG93ZXZlciwgaXQgaXMgc2V0IHRvIGFuIG9iamVjdCB3aXRoIGtleXMgeycgKyBPYmplY3Qua2V5cyhjb250ZXh0VHlwZSkuam9pbignLCAnKSArICd9Lic7XG4gICAgICAgIH1cblxuICAgICAgICBlcnJvcignJXMgZGVmaW5lcyBhbiBpbnZhbGlkIGNvbnRleHRUeXBlLiAnICsgJ2NvbnRleHRUeXBlIHNob3VsZCBwb2ludCB0byB0aGUgQ29udGV4dCBvYmplY3QgcmV0dXJuZWQgYnkgUmVhY3QuY3JlYXRlQ29udGV4dCgpLiVzJywgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKGN0b3IpIHx8ICdDb21wb25lbnQnLCBhZGRlbmR1bSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKHR5cGVvZiBjb250ZXh0VHlwZSA9PT0gJ29iamVjdCcgJiYgY29udGV4dFR5cGUgIT09IG51bGwpIHtcbiAgICBjb250ZXh0ID0gcmVhZENvbnRleHQoY29udGV4dFR5cGUpO1xuICB9IGVsc2Uge1xuICAgIHVubWFza2VkQ29udGV4dCA9IGdldFVubWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgY3RvciwgdHJ1ZSk7XG4gICAgdmFyIGNvbnRleHRUeXBlcyA9IGN0b3IuY29udGV4dFR5cGVzO1xuICAgIGlzTGVnYWN5Q29udGV4dENvbnN1bWVyID0gY29udGV4dFR5cGVzICE9PSBudWxsICYmIGNvbnRleHRUeXBlcyAhPT0gdW5kZWZpbmVkO1xuICAgIGNvbnRleHQgPSBpc0xlZ2FjeUNvbnRleHRDb25zdW1lciA/IGdldE1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHVubWFza2VkQ29udGV4dCkgOiBlbXB0eUNvbnRleHRPYmplY3Q7XG4gIH1cblxuICB2YXIgaW5zdGFuY2UgPSBuZXcgY3Rvcihwcm9wcywgY29udGV4dCk7IC8vIEluc3RhbnRpYXRlIHR3aWNlIHRvIGhlbHAgZGV0ZWN0IHNpZGUtZWZmZWN0cy5cblxuICB7XG4gICAgaWYgKCB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkge1xuICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHModHJ1ZSk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGluc3RhbmNlID0gbmV3IGN0b3IocHJvcHMsIGNvbnRleHQpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ld1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHMoZmFsc2UpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBzdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBpbnN0YW5jZS5zdGF0ZSAhPT0gbnVsbCAmJiBpbnN0YW5jZS5zdGF0ZSAhPT0gdW5kZWZpbmVkID8gaW5zdGFuY2Uuc3RhdGUgOiBudWxsO1xuICBhZG9wdENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIGluc3RhbmNlKTtcblxuICB7XG4gICAgaWYgKHR5cGVvZiBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJyAmJiBzdGF0ZSA9PT0gbnVsbCkge1xuICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoY3RvcikgfHwgJ0NvbXBvbmVudCc7XG5cbiAgICAgIGlmICghZGlkV2FybkFib3V0VW5pbml0aWFsaXplZFN0YXRlLmhhcyhjb21wb25lbnROYW1lKSkge1xuICAgICAgICBkaWRXYXJuQWJvdXRVbmluaXRpYWxpemVkU3RhdGUuYWRkKGNvbXBvbmVudE5hbWUpO1xuXG4gICAgICAgIGVycm9yKCdgJXNgIHVzZXMgYGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wc2AgYnV0IGl0cyBpbml0aWFsIHN0YXRlIGlzICcgKyAnJXMuIFRoaXMgaXMgbm90IHJlY29tbWVuZGVkLiBJbnN0ZWFkLCBkZWZpbmUgdGhlIGluaXRpYWwgc3RhdGUgYnkgJyArICdhc3NpZ25pbmcgYW4gb2JqZWN0IHRvIGB0aGlzLnN0YXRlYCBpbiB0aGUgY29uc3RydWN0b3Igb2YgYCVzYC4gJyArICdUaGlzIGVuc3VyZXMgdGhhdCBgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzYCBhcmd1bWVudHMgaGF2ZSBhIGNvbnNpc3RlbnQgc2hhcGUuJywgY29tcG9uZW50TmFtZSwgaW5zdGFuY2Uuc3RhdGUgPT09IG51bGwgPyAnbnVsbCcgOiAndW5kZWZpbmVkJywgY29tcG9uZW50TmFtZSk7XG4gICAgICB9XG4gICAgfSAvLyBJZiBuZXcgY29tcG9uZW50IEFQSXMgYXJlIGRlZmluZWQsIFwidW5zYWZlXCIgbGlmZWN5Y2xlcyB3b24ndCBiZSBjYWxsZWQuXG4gICAgLy8gV2FybiBhYm91dCB0aGVzZSBsaWZlY3ljbGVzIGlmIHRoZXkgYXJlIHByZXNlbnQuXG4gICAgLy8gRG9uJ3Qgd2FybiBhYm91dCByZWFjdC1saWZlY3ljbGVzLWNvbXBhdCBwb2x5ZmlsbGVkIG1ldGhvZHMgdGhvdWdoLlxuXG5cbiAgICBpZiAodHlwZW9mIGN0b3IuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBpbnN0YW5jZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIGZvdW5kV2lsbE1vdW50TmFtZSA9IG51bGw7XG4gICAgICB2YXIgZm91bmRXaWxsUmVjZWl2ZVByb3BzTmFtZSA9IG51bGw7XG4gICAgICB2YXIgZm91bmRXaWxsVXBkYXRlTmFtZSA9IG51bGw7XG5cbiAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nICYmIGluc3RhbmNlLmNvbXBvbmVudFdpbGxNb3VudC5fX3N1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5nICE9PSB0cnVlKSB7XG4gICAgICAgIGZvdW5kV2lsbE1vdW50TmFtZSA9ICdjb21wb25lbnRXaWxsTW91bnQnO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBmb3VuZFdpbGxNb3VudE5hbWUgPSAnVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCc7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJyAmJiBpbnN0YW5jZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzLl9fc3VwcHJlc3NEZXByZWNhdGlvbldhcm5pbmcgIT09IHRydWUpIHtcbiAgICAgICAgZm91bmRXaWxsUmVjZWl2ZVByb3BzTmFtZSA9ICdjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzJztcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGZvdW5kV2lsbFJlY2VpdmVQcm9wc05hbWUgPSAnVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMnO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVcGRhdGUgPT09ICdmdW5jdGlvbicgJiYgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVwZGF0ZS5fX3N1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5nICE9PSB0cnVlKSB7XG4gICAgICAgIGZvdW5kV2lsbFVwZGF0ZU5hbWUgPSAnY29tcG9uZW50V2lsbFVwZGF0ZSc7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBmb3VuZFdpbGxVcGRhdGVOYW1lID0gJ1VOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlJztcbiAgICAgIH1cblxuICAgICAgaWYgKGZvdW5kV2lsbE1vdW50TmFtZSAhPT0gbnVsbCB8fCBmb3VuZFdpbGxSZWNlaXZlUHJvcHNOYW1lICE9PSBudWxsIHx8IGZvdW5kV2lsbFVwZGF0ZU5hbWUgIT09IG51bGwpIHtcbiAgICAgICAgdmFyIF9jb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKGN0b3IpIHx8ICdDb21wb25lbnQnO1xuXG4gICAgICAgIHZhciBuZXdBcGlOYW1lID0gdHlwZW9mIGN0b3IuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nID8gJ2dldERlcml2ZWRTdGF0ZUZyb21Qcm9wcygpJyA6ICdnZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSgpJztcblxuICAgICAgICBpZiAoIWRpZFdhcm5BYm91dExlZ2FjeUxpZmVjeWNsZXNBbmREZXJpdmVkU3RhdGUuaGFzKF9jb21wb25lbnROYW1lKSkge1xuICAgICAgICAgIGRpZFdhcm5BYm91dExlZ2FjeUxpZmVjeWNsZXNBbmREZXJpdmVkU3RhdGUuYWRkKF9jb21wb25lbnROYW1lKTtcblxuICAgICAgICAgIGVycm9yKCdVbnNhZmUgbGVnYWN5IGxpZmVjeWNsZXMgd2lsbCBub3QgYmUgY2FsbGVkIGZvciBjb21wb25lbnRzIHVzaW5nIG5ldyBjb21wb25lbnQgQVBJcy5cXG5cXG4nICsgJyVzIHVzZXMgJXMgYnV0IGFsc28gY29udGFpbnMgdGhlIGZvbGxvd2luZyBsZWdhY3kgbGlmZWN5Y2xlczolcyVzJXNcXG5cXG4nICsgJ1RoZSBhYm92ZSBsaWZlY3ljbGVzIHNob3VsZCBiZSByZW1vdmVkLiBMZWFybiBtb3JlIGFib3V0IHRoaXMgd2FybmluZyBoZXJlOlxcbicgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3Vuc2FmZS1jb21wb25lbnQtbGlmZWN5Y2xlcycsIF9jb21wb25lbnROYW1lLCBuZXdBcGlOYW1lLCBmb3VuZFdpbGxNb3VudE5hbWUgIT09IG51bGwgPyBcIlxcbiAgXCIgKyBmb3VuZFdpbGxNb3VudE5hbWUgOiAnJywgZm91bmRXaWxsUmVjZWl2ZVByb3BzTmFtZSAhPT0gbnVsbCA/IFwiXFxuICBcIiArIGZvdW5kV2lsbFJlY2VpdmVQcm9wc05hbWUgOiAnJywgZm91bmRXaWxsVXBkYXRlTmFtZSAhPT0gbnVsbCA/IFwiXFxuICBcIiArIGZvdW5kV2lsbFVwZGF0ZU5hbWUgOiAnJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gLy8gQ2FjaGUgdW5tYXNrZWQgY29udGV4dCBzbyB3ZSBjYW4gYXZvaWQgcmVjcmVhdGluZyBtYXNrZWQgY29udGV4dCB1bmxlc3MgbmVjZXNzYXJ5LlxuICAvLyBSZWFjdEZpYmVyQ29udGV4dCB1c3VhbGx5IHVwZGF0ZXMgdGhpcyBjYWNoZSBidXQgY2FuJ3QgZm9yIG5ld2x5LWNyZWF0ZWQgaW5zdGFuY2VzLlxuXG5cbiAgaWYgKGlzTGVnYWN5Q29udGV4dENvbnN1bWVyKSB7XG4gICAgY2FjaGVDb250ZXh0KHdvcmtJblByb2dyZXNzLCB1bm1hc2tlZENvbnRleHQsIGNvbnRleHQpO1xuICB9XG5cbiAgcmV0dXJuIGluc3RhbmNlO1xufVxuXG5mdW5jdGlvbiBjYWxsQ29tcG9uZW50V2lsbE1vdW50KHdvcmtJblByb2dyZXNzLCBpbnN0YW5jZSkge1xuICB2YXIgb2xkU3RhdGUgPSBpbnN0YW5jZS5zdGF0ZTtcblxuICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGluc3RhbmNlLmNvbXBvbmVudFdpbGxNb3VudCgpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCgpO1xuICB9XG5cbiAgaWYgKG9sZFN0YXRlICE9PSBpbnN0YW5jZS5zdGF0ZSkge1xuICAgIHtcbiAgICAgIGVycm9yKCclcy5jb21wb25lbnRXaWxsTW91bnQoKTogQXNzaWduaW5nIGRpcmVjdGx5IHRvIHRoaXMuc3RhdGUgaXMgJyArIFwiZGVwcmVjYXRlZCAoZXhjZXB0IGluc2lkZSBhIGNvbXBvbmVudCdzIFwiICsgJ2NvbnN0cnVjdG9yKS4gVXNlIHNldFN0YXRlIGluc3RlYWQuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcih3b3JrSW5Qcm9ncmVzcykgfHwgJ0NvbXBvbmVudCcpO1xuICAgIH1cblxuICAgIGNsYXNzQ29tcG9uZW50VXBkYXRlci5lbnF1ZXVlUmVwbGFjZVN0YXRlKGluc3RhbmNlLCBpbnN0YW5jZS5zdGF0ZSwgbnVsbCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2FsbENvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMod29ya0luUHJvZ3Jlc3MsIGluc3RhbmNlLCBuZXdQcm9wcywgbmV4dENvbnRleHQpIHtcbiAgdmFyIG9sZFN0YXRlID0gaW5zdGFuY2Uuc3RhdGU7XG5cbiAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXdQcm9wcywgbmV4dENvbnRleHQpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5ld1Byb3BzLCBuZXh0Q29udGV4dCk7XG4gIH1cblxuICBpZiAoaW5zdGFuY2Uuc3RhdGUgIT09IG9sZFN0YXRlKSB7XG4gICAge1xuICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKHdvcmtJblByb2dyZXNzKSB8fCAnQ29tcG9uZW50JztcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRTdGF0ZUFzc2lnbm1lbnRGb3JDb21wb25lbnQuaGFzKGNvbXBvbmVudE5hbWUpKSB7XG4gICAgICAgIGRpZFdhcm5BYm91dFN0YXRlQXNzaWdubWVudEZvckNvbXBvbmVudC5hZGQoY29tcG9uZW50TmFtZSk7XG5cbiAgICAgICAgZXJyb3IoJyVzLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMoKTogQXNzaWduaW5nIGRpcmVjdGx5IHRvICcgKyBcInRoaXMuc3RhdGUgaXMgZGVwcmVjYXRlZCAoZXhjZXB0IGluc2lkZSBhIGNvbXBvbmVudCdzIFwiICsgJ2NvbnN0cnVjdG9yKS4gVXNlIHNldFN0YXRlIGluc3RlYWQuJywgY29tcG9uZW50TmFtZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY2xhc3NDb21wb25lbnRVcGRhdGVyLmVucXVldWVSZXBsYWNlU3RhdGUoaW5zdGFuY2UsIGluc3RhbmNlLnN0YXRlLCBudWxsKTtcbiAgfVxufSAvLyBJbnZva2VzIHRoZSBtb3VudCBsaWZlLWN5Y2xlcyBvbiBhIHByZXZpb3VzbHkgbmV2ZXIgcmVuZGVyZWQgaW5zdGFuY2UuXG5cblxuZnVuY3Rpb24gbW91bnRDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBjdG9yLCBuZXdQcm9wcywgcmVuZGVyTGFuZXMpIHtcbiAge1xuICAgIGNoZWNrQ2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgY3RvciwgbmV3UHJvcHMpO1xuICB9XG5cbiAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICBpbnN0YW5jZS5wcm9wcyA9IG5ld1Byb3BzO1xuICBpbnN0YW5jZS5zdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gIGluc3RhbmNlLnJlZnMgPSBlbXB0eVJlZnNPYmplY3Q7XG4gIGluaXRpYWxpemVVcGRhdGVRdWV1ZSh3b3JrSW5Qcm9ncmVzcyk7XG4gIHZhciBjb250ZXh0VHlwZSA9IGN0b3IuY29udGV4dFR5cGU7XG5cbiAgaWYgKHR5cGVvZiBjb250ZXh0VHlwZSA9PT0gJ29iamVjdCcgJiYgY29udGV4dFR5cGUgIT09IG51bGwpIHtcbiAgICBpbnN0YW5jZS5jb250ZXh0ID0gcmVhZENvbnRleHQoY29udGV4dFR5cGUpO1xuICB9IGVsc2Uge1xuICAgIHZhciB1bm1hc2tlZENvbnRleHQgPSBnZXRVbm1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIGN0b3IsIHRydWUpO1xuICAgIGluc3RhbmNlLmNvbnRleHQgPSBnZXRNYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCB1bm1hc2tlZENvbnRleHQpO1xuICB9XG5cbiAge1xuICAgIGlmIChpbnN0YW5jZS5zdGF0ZSA9PT0gbmV3UHJvcHMpIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKGN0b3IpIHx8ICdDb21wb25lbnQnO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dERpcmVjdGx5QXNzaWduaW5nUHJvcHNUb1N0YXRlLmhhcyhjb21wb25lbnROYW1lKSkge1xuICAgICAgICBkaWRXYXJuQWJvdXREaXJlY3RseUFzc2lnbmluZ1Byb3BzVG9TdGF0ZS5hZGQoY29tcG9uZW50TmFtZSk7XG5cbiAgICAgICAgZXJyb3IoJyVzOiBJdCBpcyBub3QgcmVjb21tZW5kZWQgdG8gYXNzaWduIHByb3BzIGRpcmVjdGx5IHRvIHN0YXRlICcgKyBcImJlY2F1c2UgdXBkYXRlcyB0byBwcm9wcyB3b24ndCBiZSByZWZsZWN0ZWQgaW4gc3RhdGUuIFwiICsgJ0luIG1vc3QgY2FzZXMsIGl0IGlzIGJldHRlciB0byB1c2UgcHJvcHMgZGlyZWN0bHkuJywgY29tcG9uZW50TmFtZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5yZWNvcmRMZWdhY3lDb250ZXh0V2FybmluZyh3b3JrSW5Qcm9ncmVzcywgaW5zdGFuY2UpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLnJlY29yZFVuc2FmZUxpZmVjeWNsZVdhcm5pbmdzKHdvcmtJblByb2dyZXNzLCBpbnN0YW5jZSk7XG4gICAgfVxuICB9XG5cbiAgaW5zdGFuY2Uuc3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICB2YXIgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID0gY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHM7XG5cbiAgaWYgKHR5cGVvZiBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBhcHBseURlcml2ZWRTdGF0ZUZyb21Qcm9wcyh3b3JrSW5Qcm9ncmVzcywgY3RvciwgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLCBuZXdQcm9wcyk7XG4gICAgaW5zdGFuY2Uuc3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICB9IC8vIEluIG9yZGVyIHRvIHN1cHBvcnQgcmVhY3QtbGlmZWN5Y2xlcy1jb21wYXQgcG9seWZpbGxlZCBjb21wb25lbnRzLFxuICAvLyBVbnNhZmUgbGlmZWN5Y2xlcyBzaG91bGQgbm90IGJlIGludm9rZWQgZm9yIGNvbXBvbmVudHMgdXNpbmcgdGhlIG5ldyBBUElzLlxuXG5cbiAgaWYgKHR5cGVvZiBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgIT09ICdmdW5jdGlvbicgJiYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicpKSB7XG4gICAgY2FsbENvbXBvbmVudFdpbGxNb3VudCh3b3JrSW5Qcm9ncmVzcywgaW5zdGFuY2UpOyAvLyBJZiB3ZSBoYWQgYWRkaXRpb25hbCBzdGF0ZSB1cGRhdGVzIGR1cmluZyB0aGlzIGxpZmUtY3ljbGUsIGxldCdzXG4gICAgLy8gcHJvY2VzcyB0aGVtIG5vdy5cblxuICAgIHByb2Nlc3NVcGRhdGVRdWV1ZSh3b3JrSW5Qcm9ncmVzcywgbmV3UHJvcHMsIGluc3RhbmNlLCByZW5kZXJMYW5lcyk7XG4gICAgaW5zdGFuY2Uuc3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciBmaWJlckZsYWdzID0gVXBkYXRlO1xuXG4gICAge1xuICAgICAgZmliZXJGbGFncyB8PSBMYXlvdXRTdGF0aWM7XG4gICAgfVxuXG4gICAgaWYgKCAod29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdEVmZmVjdHNNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICBmaWJlckZsYWdzIHw9IE1vdW50TGF5b3V0RGV2O1xuICAgIH1cblxuICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IGZpYmVyRmxhZ3M7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzdW1lTW91bnRDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBjdG9yLCBuZXdQcm9wcywgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICB2YXIgb2xkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzO1xuICBpbnN0YW5jZS5wcm9wcyA9IG9sZFByb3BzO1xuICB2YXIgb2xkQ29udGV4dCA9IGluc3RhbmNlLmNvbnRleHQ7XG4gIHZhciBjb250ZXh0VHlwZSA9IGN0b3IuY29udGV4dFR5cGU7XG4gIHZhciBuZXh0Q29udGV4dCA9IGVtcHR5Q29udGV4dE9iamVjdDtcblxuICBpZiAodHlwZW9mIGNvbnRleHRUeXBlID09PSAnb2JqZWN0JyAmJiBjb250ZXh0VHlwZSAhPT0gbnVsbCkge1xuICAgIG5leHRDb250ZXh0ID0gcmVhZENvbnRleHQoY29udGV4dFR5cGUpO1xuICB9IGVsc2Uge1xuICAgIHZhciBuZXh0TGVnYWN5VW5tYXNrZWRDb250ZXh0ID0gZ2V0VW5tYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCBjdG9yLCB0cnVlKTtcbiAgICBuZXh0Q29udGV4dCA9IGdldE1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIG5leHRMZWdhY3lVbm1hc2tlZENvbnRleHQpO1xuICB9XG5cbiAgdmFyIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9IGN0b3IuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzO1xuICB2YXIgaGFzTmV3TGlmZWN5Y2xlcyA9IHR5cGVvZiBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGluc3RhbmNlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlID09PSAnZnVuY3Rpb24nOyAvLyBOb3RlOiBEdXJpbmcgdGhlc2UgbGlmZS1jeWNsZXMsIGluc3RhbmNlLnByb3BzL2luc3RhbmNlLnN0YXRlIGFyZSB3aGF0XG4gIC8vIGV2ZXIgdGhlIHByZXZpb3VzbHkgYXR0ZW1wdGVkIHRvIHJlbmRlciAtIG5vdCB0aGUgXCJjdXJyZW50XCIuIEhvd2V2ZXIsXG4gIC8vIGR1cmluZyBjb21wb25lbnREaWRVcGRhdGUgd2UgcGFzcyB0aGUgXCJjdXJyZW50XCIgcHJvcHMuXG4gIC8vIEluIG9yZGVyIHRvIHN1cHBvcnQgcmVhY3QtbGlmZWN5Y2xlcy1jb21wYXQgcG9seWZpbGxlZCBjb21wb25lbnRzLFxuICAvLyBVbnNhZmUgbGlmZWN5Y2xlcyBzaG91bGQgbm90IGJlIGludm9rZWQgZm9yIGNvbXBvbmVudHMgdXNpbmcgdGhlIG5ldyBBUElzLlxuXG4gIGlmICghaGFzTmV3TGlmZWN5Y2xlcyAmJiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nKSkge1xuICAgIGlmIChvbGRQcm9wcyAhPT0gbmV3UHJvcHMgfHwgb2xkQ29udGV4dCAhPT0gbmV4dENvbnRleHQpIHtcbiAgICAgIGNhbGxDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKHdvcmtJblByb2dyZXNzLCBpbnN0YW5jZSwgbmV3UHJvcHMsIG5leHRDb250ZXh0KTtcbiAgICB9XG4gIH1cblxuICByZXNldEhhc0ZvcmNlVXBkYXRlQmVmb3JlUHJvY2Vzc2luZygpO1xuICB2YXIgb2xkU3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICB2YXIgbmV3U3RhdGUgPSBpbnN0YW5jZS5zdGF0ZSA9IG9sZFN0YXRlO1xuICBwcm9jZXNzVXBkYXRlUXVldWUod29ya0luUHJvZ3Jlc3MsIG5ld1Byb3BzLCBpbnN0YW5jZSwgcmVuZGVyTGFuZXMpO1xuICBuZXdTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKG9sZFByb3BzID09PSBuZXdQcm9wcyAmJiBvbGRTdGF0ZSA9PT0gbmV3U3RhdGUgJiYgIWhhc0NvbnRleHRDaGFuZ2VkKCkgJiYgIWNoZWNrSGFzRm9yY2VVcGRhdGVBZnRlclByb2Nlc3NpbmcoKSkge1xuICAgIC8vIElmIGFuIHVwZGF0ZSB3YXMgYWxyZWFkeSBpbiBwcm9ncmVzcywgd2Ugc2hvdWxkIHNjaGVkdWxlIGFuIFVwZGF0ZVxuICAgIC8vIGVmZmVjdCBldmVuIHRob3VnaCB3ZSdyZSBiYWlsaW5nIG91dCwgc28gdGhhdCBjV1UvY0RVIGFyZSBjYWxsZWQuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIGZpYmVyRmxhZ3MgPSBVcGRhdGU7XG5cbiAgICAgIHtcbiAgICAgICAgZmliZXJGbGFncyB8PSBMYXlvdXRTdGF0aWM7XG4gICAgICB9XG5cbiAgICAgIGlmICggKHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RFZmZlY3RzTW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgICBmaWJlckZsYWdzIHw9IE1vdW50TGF5b3V0RGV2O1xuICAgICAgfVxuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBmaWJlckZsYWdzO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgYXBwbHlEZXJpdmVkU3RhdGVGcm9tUHJvcHMod29ya0luUHJvZ3Jlc3MsIGN0b3IsIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcywgbmV3UHJvcHMpO1xuICAgIG5ld1N0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgfVxuXG4gIHZhciBzaG91bGRVcGRhdGUgPSBjaGVja0hhc0ZvcmNlVXBkYXRlQWZ0ZXJQcm9jZXNzaW5nKCkgfHwgY2hlY2tTaG91bGRDb21wb25lbnRVcGRhdGUod29ya0luUHJvZ3Jlc3MsIGN0b3IsIG9sZFByb3BzLCBuZXdQcm9wcywgb2xkU3RhdGUsIG5ld1N0YXRlLCBuZXh0Q29udGV4dCk7XG5cbiAgaWYgKHNob3VsZFVwZGF0ZSkge1xuICAgIC8vIEluIG9yZGVyIHRvIHN1cHBvcnQgcmVhY3QtbGlmZWN5Y2xlcy1jb21wYXQgcG9seWZpbGxlZCBjb21wb25lbnRzLFxuICAgIC8vIFVuc2FmZSBsaWZlY3ljbGVzIHNob3VsZCBub3QgYmUgaW52b2tlZCBmb3IgY29tcG9uZW50cyB1c2luZyB0aGUgbmV3IEFQSXMuXG4gICAgaWYgKCFoYXNOZXdMaWZlY3ljbGVzICYmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nKSkge1xuICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50KCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50KCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIF9maWJlckZsYWdzID0gVXBkYXRlO1xuXG4gICAgICB7XG4gICAgICAgIF9maWJlckZsYWdzIHw9IExheW91dFN0YXRpYztcbiAgICAgIH1cblxuICAgICAgaWYgKCAod29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdEVmZmVjdHNNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAgIF9maWJlckZsYWdzIHw9IE1vdW50TGF5b3V0RGV2O1xuICAgICAgfVxuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBfZmliZXJGbGFncztcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gSWYgYW4gdXBkYXRlIHdhcyBhbHJlYWR5IGluIHByb2dyZXNzLCB3ZSBzaG91bGQgc2NoZWR1bGUgYW4gVXBkYXRlXG4gICAgLy8gZWZmZWN0IGV2ZW4gdGhvdWdoIHdlJ3JlIGJhaWxpbmcgb3V0LCBzbyB0aGF0IGNXVS9jRFUgYXJlIGNhbGxlZC5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZE1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgX2ZpYmVyRmxhZ3MyID0gVXBkYXRlO1xuXG4gICAgICB7XG4gICAgICAgIF9maWJlckZsYWdzMiB8PSBMYXlvdXRTdGF0aWM7XG4gICAgICB9XG5cbiAgICAgIGlmICggKHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RFZmZlY3RzTW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgICBfZmliZXJGbGFnczIgfD0gTW91bnRMYXlvdXREZXY7XG4gICAgICB9XG5cbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IF9maWJlckZsYWdzMjtcbiAgICB9IC8vIElmIHNob3VsZENvbXBvbmVudFVwZGF0ZSByZXR1cm5lZCBmYWxzZSwgd2Ugc2hvdWxkIHN0aWxsIHVwZGF0ZSB0aGVcbiAgICAvLyBtZW1vaXplZCBzdGF0ZSB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgd29yayBjYW4gYmUgcmV1c2VkLlxuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzID0gbmV3UHJvcHM7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG5ld1N0YXRlO1xuICB9IC8vIFVwZGF0ZSB0aGUgZXhpc3RpbmcgaW5zdGFuY2UncyBzdGF0ZSwgcHJvcHMsIGFuZCBjb250ZXh0IHBvaW50ZXJzIGV2ZW5cbiAgLy8gaWYgc2hvdWxkQ29tcG9uZW50VXBkYXRlIHJldHVybnMgZmFsc2UuXG5cblxuICBpbnN0YW5jZS5wcm9wcyA9IG5ld1Byb3BzO1xuICBpbnN0YW5jZS5zdGF0ZSA9IG5ld1N0YXRlO1xuICBpbnN0YW5jZS5jb250ZXh0ID0gbmV4dENvbnRleHQ7XG4gIHJldHVybiBzaG91bGRVcGRhdGU7XG59IC8vIEludm9rZXMgdGhlIHVwZGF0ZSBsaWZlLWN5Y2xlcyBhbmQgcmV0dXJucyBmYWxzZSBpZiBpdCBzaG91bGRuJ3QgcmVyZW5kZXIuXG5cblxuZnVuY3Rpb24gdXBkYXRlQ2xhc3NJbnN0YW5jZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgY3RvciwgbmV3UHJvcHMsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgY2xvbmVVcGRhdGVRdWV1ZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7XG4gIHZhciB1bnJlc29sdmVkT2xkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzO1xuICB2YXIgb2xkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy50eXBlID09PSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSA/IHVucmVzb2x2ZWRPbGRQcm9wcyA6IHJlc29sdmVEZWZhdWx0UHJvcHMod29ya0luUHJvZ3Jlc3MudHlwZSwgdW5yZXNvbHZlZE9sZFByb3BzKTtcbiAgaW5zdGFuY2UucHJvcHMgPSBvbGRQcm9wcztcbiAgdmFyIHVucmVzb2x2ZWROZXdQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIG9sZENvbnRleHQgPSBpbnN0YW5jZS5jb250ZXh0O1xuICB2YXIgY29udGV4dFR5cGUgPSBjdG9yLmNvbnRleHRUeXBlO1xuICB2YXIgbmV4dENvbnRleHQgPSBlbXB0eUNvbnRleHRPYmplY3Q7XG5cbiAgaWYgKHR5cGVvZiBjb250ZXh0VHlwZSA9PT0gJ29iamVjdCcgJiYgY29udGV4dFR5cGUgIT09IG51bGwpIHtcbiAgICBuZXh0Q29udGV4dCA9IHJlYWRDb250ZXh0KGNvbnRleHRUeXBlKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbmV4dFVubWFza2VkQ29udGV4dCA9IGdldFVubWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgY3RvciwgdHJ1ZSk7XG4gICAgbmV4dENvbnRleHQgPSBnZXRNYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCBuZXh0VW5tYXNrZWRDb250ZXh0KTtcbiAgfVxuXG4gIHZhciBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPSBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcztcbiAgdmFyIGhhc05ld0xpZmVjeWNsZXMgPSB0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBpbnN0YW5jZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJzsgLy8gTm90ZTogRHVyaW5nIHRoZXNlIGxpZmUtY3ljbGVzLCBpbnN0YW5jZS5wcm9wcy9pbnN0YW5jZS5zdGF0ZSBhcmUgd2hhdFxuICAvLyBldmVyIHRoZSBwcmV2aW91c2x5IGF0dGVtcHRlZCB0byByZW5kZXIgLSBub3QgdGhlIFwiY3VycmVudFwiLiBIb3dldmVyLFxuICAvLyBkdXJpbmcgY29tcG9uZW50RGlkVXBkYXRlIHdlIHBhc3MgdGhlIFwiY3VycmVudFwiIHByb3BzLlxuICAvLyBJbiBvcmRlciB0byBzdXBwb3J0IHJlYWN0LWxpZmVjeWNsZXMtY29tcGF0IHBvbHlmaWxsZWQgY29tcG9uZW50cyxcbiAgLy8gVW5zYWZlIGxpZmVjeWNsZXMgc2hvdWxkIG5vdCBiZSBpbnZva2VkIGZvciBjb21wb25lbnRzIHVzaW5nIHRoZSBuZXcgQVBJcy5cblxuICBpZiAoIWhhc05ld0xpZmVjeWNsZXMgJiYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICBpZiAodW5yZXNvbHZlZE9sZFByb3BzICE9PSB1bnJlc29sdmVkTmV3UHJvcHMgfHwgb2xkQ29udGV4dCAhPT0gbmV4dENvbnRleHQpIHtcbiAgICAgIGNhbGxDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKHdvcmtJblByb2dyZXNzLCBpbnN0YW5jZSwgbmV3UHJvcHMsIG5leHRDb250ZXh0KTtcbiAgICB9XG4gIH1cblxuICByZXNldEhhc0ZvcmNlVXBkYXRlQmVmb3JlUHJvY2Vzc2luZygpO1xuICB2YXIgb2xkU3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICB2YXIgbmV3U3RhdGUgPSBpbnN0YW5jZS5zdGF0ZSA9IG9sZFN0YXRlO1xuICBwcm9jZXNzVXBkYXRlUXVldWUod29ya0luUHJvZ3Jlc3MsIG5ld1Byb3BzLCBpbnN0YW5jZSwgcmVuZGVyTGFuZXMpO1xuICBuZXdTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKHVucmVzb2x2ZWRPbGRQcm9wcyA9PT0gdW5yZXNvbHZlZE5ld1Byb3BzICYmIG9sZFN0YXRlID09PSBuZXdTdGF0ZSAmJiAhaGFzQ29udGV4dENoYW5nZWQoKSAmJiAhY2hlY2tIYXNGb3JjZVVwZGF0ZUFmdGVyUHJvY2Vzc2luZygpICYmICEoZW5hYmxlTGF6eUNvbnRleHRQcm9wYWdhdGlvbiAgICkpIHtcbiAgICAvLyBJZiBhbiB1cGRhdGUgd2FzIGFscmVhZHkgaW4gcHJvZ3Jlc3MsIHdlIHNob3VsZCBzY2hlZHVsZSBhbiBVcGRhdGVcbiAgICAvLyBlZmZlY3QgZXZlbiB0aG91Z2ggd2UncmUgYmFpbGluZyBvdXQsIHNvIHRoYXQgY1dVL2NEVSBhcmUgY2FsbGVkLlxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpZiAodW5yZXNvbHZlZE9sZFByb3BzICE9PSBjdXJyZW50Lm1lbW9pemVkUHJvcHMgfHwgb2xkU3RhdGUgIT09IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSkge1xuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKHVucmVzb2x2ZWRPbGRQcm9wcyAhPT0gY3VycmVudC5tZW1vaXplZFByb3BzIHx8IG9sZFN0YXRlICE9PSBjdXJyZW50Lm1lbW9pemVkU3RhdGUpIHtcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gU25hcHNob3Q7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBhcHBseURlcml2ZWRTdGF0ZUZyb21Qcm9wcyh3b3JrSW5Qcm9ncmVzcywgY3RvciwgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLCBuZXdQcm9wcyk7XG4gICAgbmV3U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICB9XG5cbiAgdmFyIHNob3VsZFVwZGF0ZSA9IGNoZWNrSGFzRm9yY2VVcGRhdGVBZnRlclByb2Nlc3NpbmcoKSB8fCBjaGVja1Nob3VsZENvbXBvbmVudFVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgY3Rvciwgb2xkUHJvcHMsIG5ld1Byb3BzLCBvbGRTdGF0ZSwgbmV3U3RhdGUsIG5leHRDb250ZXh0KSB8fCAvLyBUT0RPOiBJbiBzb21lIGNhc2VzLCB3ZSdsbCBlbmQgdXAgY2hlY2tpbmcgaWYgY29udGV4dCBoYXMgY2hhbmdlZCB0d2ljZSxcbiAgLy8gYm90aCBiZWZvcmUgYW5kIGFmdGVyIGBzaG91bGRDb21wb25lbnRVcGRhdGVgIGhhcyBiZWVuIGNhbGxlZC4gTm90IGlkZWFsLFxuICAvLyBidXQgSSdtIGxvYXRoIHRvIHJlZmFjdG9yIHRoaXMgZnVuY3Rpb24uIFRoaXMgb25seSBoYXBwZW5zIGZvciBtZW1vaXplZFxuICAvLyBjb21wb25lbnRzIHNvIGl0J3Mgbm90IHRoYXQgY29tbW9uLlxuICBlbmFibGVMYXp5Q29udGV4dFByb3BhZ2F0aW9uICAgO1xuXG4gIGlmIChzaG91bGRVcGRhdGUpIHtcbiAgICAvLyBJbiBvcmRlciB0byBzdXBwb3J0IHJlYWN0LWxpZmVjeWNsZXMtY29tcGF0IHBvbHlmaWxsZWQgY29tcG9uZW50cyxcbiAgICAvLyBVbnNhZmUgbGlmZWN5Y2xlcyBzaG91bGQgbm90IGJlIGludm9rZWQgZm9yIGNvbXBvbmVudHMgdXNpbmcgdGhlIG5ldyBBUElzLlxuICAgIGlmICghaGFzTmV3TGlmZWN5Y2xlcyAmJiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsVXBkYXRlID09PSAnZnVuY3Rpb24nKSkge1xuICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVcGRhdGUobmV3UHJvcHMsIG5ld1N0YXRlLCBuZXh0Q29udGV4dCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUobmV3UHJvcHMsIG5ld1N0YXRlLCBuZXh0Q29udGV4dCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFVwZGF0ZTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBTbmFwc2hvdDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gSWYgYW4gdXBkYXRlIHdhcyBhbHJlYWR5IGluIHByb2dyZXNzLCB3ZSBzaG91bGQgc2NoZWR1bGUgYW4gVXBkYXRlXG4gICAgLy8gZWZmZWN0IGV2ZW4gdGhvdWdoIHdlJ3JlIGJhaWxpbmcgb3V0LCBzbyB0aGF0IGNXVS9jRFUgYXJlIGNhbGxlZC5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKHVucmVzb2x2ZWRPbGRQcm9wcyAhPT0gY3VycmVudC5tZW1vaXplZFByb3BzIHx8IG9sZFN0YXRlICE9PSBjdXJyZW50Lm1lbW9pemVkU3RhdGUpIHtcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmICh1bnJlc29sdmVkT2xkUHJvcHMgIT09IGN1cnJlbnQubWVtb2l6ZWRQcm9wcyB8fCBvbGRTdGF0ZSAhPT0gY3VycmVudC5tZW1vaXplZFN0YXRlKSB7XG4gICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFNuYXBzaG90O1xuICAgICAgfVxuICAgIH0gLy8gSWYgc2hvdWxkQ29tcG9uZW50VXBkYXRlIHJldHVybmVkIGZhbHNlLCB3ZSBzaG91bGQgc3RpbGwgdXBkYXRlIHRoZVxuICAgIC8vIG1lbW9pemVkIHByb3BzL3N0YXRlIHRvIGluZGljYXRlIHRoYXQgdGhpcyB3b3JrIGNhbiBiZSByZXVzZWQuXG5cblxuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHMgPSBuZXdQcm9wcztcbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbmV3U3RhdGU7XG4gIH0gLy8gVXBkYXRlIHRoZSBleGlzdGluZyBpbnN0YW5jZSdzIHN0YXRlLCBwcm9wcywgYW5kIGNvbnRleHQgcG9pbnRlcnMgZXZlblxuICAvLyBpZiBzaG91bGRDb21wb25lbnRVcGRhdGUgcmV0dXJucyBmYWxzZS5cblxuXG4gIGluc3RhbmNlLnByb3BzID0gbmV3UHJvcHM7XG4gIGluc3RhbmNlLnN0YXRlID0gbmV3U3RhdGU7XG4gIGluc3RhbmNlLmNvbnRleHQgPSBuZXh0Q29udGV4dDtcbiAgcmV0dXJuIHNob3VsZFVwZGF0ZTtcbn1cblxudmFyIGRpZFdhcm5BYm91dE1hcHM7XG52YXIgZGlkV2FybkFib3V0R2VuZXJhdG9ycztcbnZhciBkaWRXYXJuQWJvdXRTdHJpbmdSZWZzO1xudmFyIG93bmVySGFzS2V5VXNlV2FybmluZztcbnZhciBvd25lckhhc0Z1bmN0aW9uVHlwZVdhcm5pbmc7XG5cbnZhciB3YXJuRm9yTWlzc2luZ0tleSA9IGZ1bmN0aW9uIChjaGlsZCwgcmV0dXJuRmliZXIpIHt9O1xuXG57XG4gIGRpZFdhcm5BYm91dE1hcHMgPSBmYWxzZTtcbiAgZGlkV2FybkFib3V0R2VuZXJhdG9ycyA9IGZhbHNlO1xuICBkaWRXYXJuQWJvdXRTdHJpbmdSZWZzID0ge307XG4gIC8qKlxuICAgKiBXYXJuIGlmIHRoZXJlJ3Mgbm8ga2V5IGV4cGxpY2l0bHkgc2V0IG9uIGR5bmFtaWMgYXJyYXlzIG9mIGNoaWxkcmVuIG9yXG4gICAqIG9iamVjdCBrZXlzIGFyZSBub3QgdmFsaWQuIFRoaXMgYWxsb3dzIHVzIHRvIGtlZXAgdHJhY2sgb2YgY2hpbGRyZW4gYmV0d2VlblxuICAgKiB1cGRhdGVzLlxuICAgKi9cblxuICBvd25lckhhc0tleVVzZVdhcm5pbmcgPSB7fTtcbiAgb3duZXJIYXNGdW5jdGlvblR5cGVXYXJuaW5nID0ge307XG5cbiAgd2FybkZvck1pc3NpbmdLZXkgPSBmdW5jdGlvbiAoY2hpbGQsIHJldHVybkZpYmVyKSB7XG4gICAgaWYgKGNoaWxkID09PSBudWxsIHx8IHR5cGVvZiBjaGlsZCAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWNoaWxkLl9zdG9yZSB8fCBjaGlsZC5fc3RvcmUudmFsaWRhdGVkIHx8IGNoaWxkLmtleSAhPSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjaGlsZC5fc3RvcmUgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlYWN0IENvbXBvbmVudCBpbiB3YXJuRm9yTWlzc2luZ0tleSBzaG91bGQgaGF2ZSBhIF9zdG9yZS4gJyArICdUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cblxuICAgIGNoaWxkLl9zdG9yZS52YWxpZGF0ZWQgPSB0cnVlO1xuICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihyZXR1cm5GaWJlcikgfHwgJ0NvbXBvbmVudCc7XG5cbiAgICBpZiAob3duZXJIYXNLZXlVc2VXYXJuaW5nW2NvbXBvbmVudE5hbWVdKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgb3duZXJIYXNLZXlVc2VXYXJuaW5nW2NvbXBvbmVudE5hbWVdID0gdHJ1ZTtcblxuICAgIGVycm9yKCdFYWNoIGNoaWxkIGluIGEgbGlzdCBzaG91bGQgaGF2ZSBhIHVuaXF1ZSAnICsgJ1wia2V5XCIgcHJvcC4gU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay93YXJuaW5nLWtleXMgZm9yICcgKyAnbW9yZSBpbmZvcm1hdGlvbi4nKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gY29lcmNlUmVmKHJldHVybkZpYmVyLCBjdXJyZW50LCBlbGVtZW50KSB7XG4gIHZhciBtaXhlZFJlZiA9IGVsZW1lbnQucmVmO1xuXG4gIGlmIChtaXhlZFJlZiAhPT0gbnVsbCAmJiB0eXBlb2YgbWl4ZWRSZWYgIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIG1peGVkUmVmICE9PSAnb2JqZWN0Jykge1xuICAgIHtcbiAgICAgIC8vIFRPRE86IENsZWFuIHRoaXMgdXAgb25jZSB3ZSB0dXJuIG9uIHRoZSBzdHJpbmcgcmVmIHdhcm5pbmcgZm9yXG4gICAgICAvLyBldmVyeW9uZSwgYmVjYXVzZSB0aGUgc3RyaWN0IG1vZGUgY2FzZSB3aWxsIG5vIGxvbmdlciBiZSByZWxldmFudFxuICAgICAgaWYgKChyZXR1cm5GaWJlci5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSB8fCB3YXJuQWJvdXRTdHJpbmdSZWZzKSAmJiAvLyBXZSB3YXJuIGluIFJlYWN0RWxlbWVudC5qcyBpZiBvd25lciBhbmQgc2VsZiBhcmUgZXF1YWwgZm9yIHN0cmluZyByZWZzXG4gICAgICAvLyBiZWNhdXNlIHRoZXNlIGNhbm5vdCBiZSBhdXRvbWF0aWNhbGx5IGNvbnZlcnRlZCB0byBhbiBhcnJvdyBmdW5jdGlvblxuICAgICAgLy8gdXNpbmcgYSBjb2RlbW9kLiBUaGVyZWZvcmUsIHdlIGRvbid0IGhhdmUgdG8gd2FybiBhYm91dCBzdHJpbmcgcmVmcyBhZ2Fpbi5cbiAgICAgICEoZWxlbWVudC5fb3duZXIgJiYgZWxlbWVudC5fc2VsZiAmJiBlbGVtZW50Ll9vd25lci5zdGF0ZU5vZGUgIT09IGVsZW1lbnQuX3NlbGYpKSB7XG4gICAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihyZXR1cm5GaWJlcikgfHwgJ0NvbXBvbmVudCc7XG5cbiAgICAgICAgaWYgKCFkaWRXYXJuQWJvdXRTdHJpbmdSZWZzW2NvbXBvbmVudE5hbWVdKSB7XG4gICAgICAgICAge1xuICAgICAgICAgICAgZXJyb3IoJ0Egc3RyaW5nIHJlZiwgXCIlc1wiLCBoYXMgYmVlbiBmb3VuZCB3aXRoaW4gYSBzdHJpY3QgbW9kZSB0cmVlLiAnICsgJ1N0cmluZyByZWZzIGFyZSBhIHNvdXJjZSBvZiBwb3RlbnRpYWwgYnVncyBhbmQgc2hvdWxkIGJlIGF2b2lkZWQuICcgKyAnV2UgcmVjb21tZW5kIHVzaW5nIHVzZVJlZigpIG9yIGNyZWF0ZVJlZigpIGluc3RlYWQuICcgKyAnTGVhcm4gbW9yZSBhYm91dCB1c2luZyByZWZzIHNhZmVseSBoZXJlOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zdHJpY3QtbW9kZS1zdHJpbmctcmVmJywgbWl4ZWRSZWYpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGRpZFdhcm5BYm91dFN0cmluZ1JlZnNbY29tcG9uZW50TmFtZV0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVsZW1lbnQuX293bmVyKSB7XG4gICAgICB2YXIgb3duZXIgPSBlbGVtZW50Ll9vd25lcjtcbiAgICAgIHZhciBpbnN0O1xuXG4gICAgICBpZiAob3duZXIpIHtcbiAgICAgICAgdmFyIG93bmVyRmliZXIgPSBvd25lcjtcblxuICAgICAgICBpZiAob3duZXJGaWJlci50YWcgIT09IENsYXNzQ29tcG9uZW50KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGdW5jdGlvbiBjb21wb25lbnRzIGNhbm5vdCBoYXZlIHN0cmluZyByZWZzLiAnICsgJ1dlIHJlY29tbWVuZCB1c2luZyB1c2VSZWYoKSBpbnN0ZWFkLiAnICsgJ0xlYXJuIG1vcmUgYWJvdXQgdXNpbmcgcmVmcyBzYWZlbHkgaGVyZTogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3RyaWN0LW1vZGUtc3RyaW5nLXJlZicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaW5zdCA9IG93bmVyRmliZXIuc3RhdGVOb2RlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWluc3QpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyBvd25lciBmb3Igc3RyaW5nIHJlZiBcIiArIG1peGVkUmVmICsgXCIuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIFwiICsgJ2J1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgICB9IC8vIEFzc2lnbmluZyB0aGlzIHRvIGEgY29uc3Qgc28gRmxvdyBrbm93cyBpdCB3b24ndCBjaGFuZ2UgaW4gdGhlIGNsb3N1cmVcblxuXG4gICAgICB2YXIgcmVzb2x2ZWRJbnN0ID0gaW5zdDtcblxuICAgICAge1xuICAgICAgICBjaGVja1Byb3BTdHJpbmdDb2VyY2lvbihtaXhlZFJlZiwgJ3JlZicpO1xuICAgICAgfVxuXG4gICAgICB2YXIgc3RyaW5nUmVmID0gJycgKyBtaXhlZFJlZjsgLy8gQ2hlY2sgaWYgcHJldmlvdXMgc3RyaW5nIHJlZiBtYXRjaGVzIG5ldyBzdHJpbmcgcmVmXG5cbiAgICAgIGlmIChjdXJyZW50ICE9PSBudWxsICYmIGN1cnJlbnQucmVmICE9PSBudWxsICYmIHR5cGVvZiBjdXJyZW50LnJlZiA9PT0gJ2Z1bmN0aW9uJyAmJiBjdXJyZW50LnJlZi5fc3RyaW5nUmVmID09PSBzdHJpbmdSZWYpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnQucmVmO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmVmID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHZhciByZWZzID0gcmVzb2x2ZWRJbnN0LnJlZnM7XG5cbiAgICAgICAgaWYgKHJlZnMgPT09IGVtcHR5UmVmc09iamVjdCkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgYSBsYXp5IHBvb2xlZCBmcm96ZW4gb2JqZWN0LCBzbyB3ZSBuZWVkIHRvIGluaXRpYWxpemUuXG4gICAgICAgICAgcmVmcyA9IHJlc29sdmVkSW5zdC5yZWZzID0ge307XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICBkZWxldGUgcmVmc1tzdHJpbmdSZWZdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlZnNbc3RyaW5nUmVmXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICByZWYuX3N0cmluZ1JlZiA9IHN0cmluZ1JlZjtcbiAgICAgIHJldHVybiByZWY7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0eXBlb2YgbWl4ZWRSZWYgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgcmVmIHRvIGJlIGEgZnVuY3Rpb24sIGEgc3RyaW5nLCBhbiBvYmplY3QgcmV0dXJuZWQgYnkgUmVhY3QuY3JlYXRlUmVmKCksIG9yIG51bGwuJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICghZWxlbWVudC5fb3duZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRWxlbWVudCByZWYgd2FzIHNwZWNpZmllZCBhcyBhIHN0cmluZyAoXCIgKyBtaXhlZFJlZiArIFwiKSBidXQgbm8gb3duZXIgd2FzIHNldC4gVGhpcyBjb3VsZCBoYXBwZW4gZm9yIG9uZSBvZlwiICsgJyB0aGUgZm9sbG93aW5nIHJlYXNvbnM6XFxuJyArICcxLiBZb3UgbWF5IGJlIGFkZGluZyBhIHJlZiB0byBhIGZ1bmN0aW9uIGNvbXBvbmVudFxcbicgKyBcIjIuIFlvdSBtYXkgYmUgYWRkaW5nIGEgcmVmIHRvIGEgY29tcG9uZW50IHRoYXQgd2FzIG5vdCBjcmVhdGVkIGluc2lkZSBhIGNvbXBvbmVudCdzIHJlbmRlciBtZXRob2RcXG5cIiArICczLiBZb3UgaGF2ZSBtdWx0aXBsZSBjb3BpZXMgb2YgUmVhY3QgbG9hZGVkXFxuJyArICdTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3JlZnMtbXVzdC1oYXZlLW93bmVyIGZvciBtb3JlIGluZm9ybWF0aW9uLicpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtaXhlZFJlZjtcbn1cblxuZnVuY3Rpb24gdGhyb3dPbkludmFsaWRPYmplY3RUeXBlKHJldHVybkZpYmVyLCBuZXdDaGlsZCkge1xuICB2YXIgY2hpbGRTdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobmV3Q2hpbGQpO1xuICB0aHJvdyBuZXcgRXJyb3IoXCJPYmplY3RzIGFyZSBub3QgdmFsaWQgYXMgYSBSZWFjdCBjaGlsZCAoZm91bmQ6IFwiICsgKGNoaWxkU3RyaW5nID09PSAnW29iamVjdCBPYmplY3RdJyA/ICdvYmplY3Qgd2l0aCBrZXlzIHsnICsgT2JqZWN0LmtleXMobmV3Q2hpbGQpLmpvaW4oJywgJykgKyAnfScgOiBjaGlsZFN0cmluZykgKyBcIikuIFwiICsgJ0lmIHlvdSBtZWFudCB0byByZW5kZXIgYSBjb2xsZWN0aW9uIG9mIGNoaWxkcmVuLCB1c2UgYW4gYXJyYXkgJyArICdpbnN0ZWFkLicpO1xufVxuXG5mdW5jdGlvbiB3YXJuT25GdW5jdGlvblR5cGUocmV0dXJuRmliZXIpIHtcbiAge1xuICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihyZXR1cm5GaWJlcikgfHwgJ0NvbXBvbmVudCc7XG5cbiAgICBpZiAob3duZXJIYXNGdW5jdGlvblR5cGVXYXJuaW5nW2NvbXBvbmVudE5hbWVdKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgb3duZXJIYXNGdW5jdGlvblR5cGVXYXJuaW5nW2NvbXBvbmVudE5hbWVdID0gdHJ1ZTtcblxuICAgIGVycm9yKCdGdW5jdGlvbnMgYXJlIG5vdCB2YWxpZCBhcyBhIFJlYWN0IGNoaWxkLiBUaGlzIG1heSBoYXBwZW4gaWYgJyArICd5b3UgcmV0dXJuIGEgQ29tcG9uZW50IGluc3RlYWQgb2YgPENvbXBvbmVudCAvPiBmcm9tIHJlbmRlci4gJyArICdPciBtYXliZSB5b3UgbWVhbnQgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIHJhdGhlciB0aGFuIHJldHVybiBpdC4nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXNvbHZlTGF6eShsYXp5VHlwZSkge1xuICB2YXIgcGF5bG9hZCA9IGxhenlUeXBlLl9wYXlsb2FkO1xuICB2YXIgaW5pdCA9IGxhenlUeXBlLl9pbml0O1xuICByZXR1cm4gaW5pdChwYXlsb2FkKTtcbn0gLy8gVGhpcyB3cmFwcGVyIGZ1bmN0aW9uIGV4aXN0cyBiZWNhdXNlIEkgZXhwZWN0IHRvIGNsb25lIHRoZSBjb2RlIGluIGVhY2ggcGF0aFxuLy8gdG8gYmUgYWJsZSB0byBvcHRpbWl6ZSBlYWNoIHBhdGggaW5kaXZpZHVhbGx5IGJ5IGJyYW5jaGluZyBlYXJseS4gVGhpcyBuZWVkc1xuLy8gYSBjb21waWxlciBvciB3ZSBjYW4gZG8gaXQgbWFudWFsbHkuIEhlbHBlcnMgdGhhdCBkb24ndCBuZWVkIHRoaXMgYnJhbmNoaW5nXG4vLyBsaXZlIG91dHNpZGUgb2YgdGhpcyBmdW5jdGlvbi5cblxuXG5mdW5jdGlvbiBDaGlsZFJlY29uY2lsZXIoc2hvdWxkVHJhY2tTaWRlRWZmZWN0cykge1xuICBmdW5jdGlvbiBkZWxldGVDaGlsZChyZXR1cm5GaWJlciwgY2hpbGRUb0RlbGV0ZSkge1xuICAgIGlmICghc2hvdWxkVHJhY2tTaWRlRWZmZWN0cykge1xuICAgICAgLy8gTm9vcC5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgZGVsZXRpb25zID0gcmV0dXJuRmliZXIuZGVsZXRpb25zO1xuXG4gICAgaWYgKGRlbGV0aW9ucyA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuRmliZXIuZGVsZXRpb25zID0gW2NoaWxkVG9EZWxldGVdO1xuICAgICAgcmV0dXJuRmliZXIuZmxhZ3MgfD0gQ2hpbGREZWxldGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRpb25zLnB1c2goY2hpbGRUb0RlbGV0ZSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkKSB7XG4gICAgaWYgKCFzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gICAgICAvLyBOb29wLlxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSAvLyBUT0RPOiBGb3IgdGhlIHNob3VsZENsb25lIGNhc2UsIHRoaXMgY291bGQgYmUgbWljcm8tb3B0aW1pemVkIGEgYml0IGJ5XG4gICAgLy8gYXNzdW1pbmcgdGhhdCBhZnRlciB0aGUgZmlyc3QgY2hpbGQgd2UndmUgYWxyZWFkeSBhZGRlZCBldmVyeXRoaW5nLlxuXG5cbiAgICB2YXIgY2hpbGRUb0RlbGV0ZSA9IGN1cnJlbnRGaXJzdENoaWxkO1xuXG4gICAgd2hpbGUgKGNoaWxkVG9EZWxldGUgIT09IG51bGwpIHtcbiAgICAgIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBjaGlsZFRvRGVsZXRlKTtcbiAgICAgIGNoaWxkVG9EZWxldGUgPSBjaGlsZFRvRGVsZXRlLnNpYmxpbmc7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBmdW5jdGlvbiBtYXBSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQpIHtcbiAgICAvLyBBZGQgdGhlIHJlbWFpbmluZyBjaGlsZHJlbiB0byBhIHRlbXBvcmFyeSBtYXAgc28gdGhhdCB3ZSBjYW4gZmluZCB0aGVtIGJ5XG4gICAgLy8ga2V5cyBxdWlja2x5LiBJbXBsaWNpdCAobnVsbCkga2V5cyBnZXQgYWRkZWQgdG8gdGhpcyBzZXQgd2l0aCB0aGVpciBpbmRleFxuICAgIC8vIGluc3RlYWQuXG4gICAgdmFyIGV4aXN0aW5nQ2hpbGRyZW4gPSBuZXcgTWFwKCk7XG4gICAgdmFyIGV4aXN0aW5nQ2hpbGQgPSBjdXJyZW50Rmlyc3RDaGlsZDtcblxuICAgIHdoaWxlIChleGlzdGluZ0NoaWxkICE9PSBudWxsKSB7XG4gICAgICBpZiAoZXhpc3RpbmdDaGlsZC5rZXkgIT09IG51bGwpIHtcbiAgICAgICAgZXhpc3RpbmdDaGlsZHJlbi5zZXQoZXhpc3RpbmdDaGlsZC5rZXksIGV4aXN0aW5nQ2hpbGQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXhpc3RpbmdDaGlsZHJlbi5zZXQoZXhpc3RpbmdDaGlsZC5pbmRleCwgZXhpc3RpbmdDaGlsZCk7XG4gICAgICB9XG5cbiAgICAgIGV4aXN0aW5nQ2hpbGQgPSBleGlzdGluZ0NoaWxkLnNpYmxpbmc7XG4gICAgfVxuXG4gICAgcmV0dXJuIGV4aXN0aW5nQ2hpbGRyZW47XG4gIH1cblxuICBmdW5jdGlvbiB1c2VGaWJlcihmaWJlciwgcGVuZGluZ1Byb3BzKSB7XG4gICAgLy8gV2UgY3VycmVudGx5IHNldCBzaWJsaW5nIHRvIG51bGwgYW5kIGluZGV4IHRvIDAgaGVyZSBiZWNhdXNlIGl0IGlzIGVhc3lcbiAgICAvLyB0byBmb3JnZXQgdG8gZG8gYmVmb3JlIHJldHVybmluZyBpdC4gRS5nLiBmb3IgdGhlIHNpbmdsZSBjaGlsZCBjYXNlLlxuICAgIHZhciBjbG9uZSA9IGNyZWF0ZVdvcmtJblByb2dyZXNzKGZpYmVyLCBwZW5kaW5nUHJvcHMpO1xuICAgIGNsb25lLmluZGV4ID0gMDtcbiAgICBjbG9uZS5zaWJsaW5nID0gbnVsbDtcbiAgICByZXR1cm4gY2xvbmU7XG4gIH1cblxuICBmdW5jdGlvbiBwbGFjZUNoaWxkKG5ld0ZpYmVyLCBsYXN0UGxhY2VkSW5kZXgsIG5ld0luZGV4KSB7XG4gICAgbmV3RmliZXIuaW5kZXggPSBuZXdJbmRleDtcblxuICAgIGlmICghc2hvdWxkVHJhY2tTaWRlRWZmZWN0cykge1xuICAgICAgLy8gRHVyaW5nIGh5ZHJhdGlvbiwgdGhlIHVzZUlkIGFsZ29yaXRobSBuZWVkcyB0byBrbm93IHdoaWNoIGZpYmVycyBhcmVcbiAgICAgIC8vIHBhcnQgb2YgYSBsaXN0IG9mIGNoaWxkcmVuIChhcnJheXMsIGl0ZXJhdG9ycykuXG4gICAgICBuZXdGaWJlci5mbGFncyB8PSBGb3JrZWQ7XG4gICAgICByZXR1cm4gbGFzdFBsYWNlZEluZGV4O1xuICAgIH1cblxuICAgIHZhciBjdXJyZW50ID0gbmV3RmliZXIuYWx0ZXJuYXRlO1xuXG4gICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgIHZhciBvbGRJbmRleCA9IGN1cnJlbnQuaW5kZXg7XG5cbiAgICAgIGlmIChvbGRJbmRleCA8IGxhc3RQbGFjZWRJbmRleCkge1xuICAgICAgICAvLyBUaGlzIGlzIGEgbW92ZS5cbiAgICAgICAgbmV3RmliZXIuZmxhZ3MgfD0gUGxhY2VtZW50O1xuICAgICAgICByZXR1cm4gbGFzdFBsYWNlZEluZGV4O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVGhpcyBpdGVtIGNhbiBzdGF5IGluIHBsYWNlLlxuICAgICAgICByZXR1cm4gb2xkSW5kZXg7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoaXMgaXMgYW4gaW5zZXJ0aW9uLlxuICAgICAgbmV3RmliZXIuZmxhZ3MgfD0gUGxhY2VtZW50O1xuICAgICAgcmV0dXJuIGxhc3RQbGFjZWRJbmRleDtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBwbGFjZVNpbmdsZUNoaWxkKG5ld0ZpYmVyKSB7XG4gICAgLy8gVGhpcyBpcyBzaW1wbGVyIGZvciB0aGUgc2luZ2xlIGNoaWxkIGNhc2UuIFdlIG9ubHkgbmVlZCB0byBkbyBhXG4gICAgLy8gcGxhY2VtZW50IGZvciBpbnNlcnRpbmcgbmV3IGNoaWxkcmVuLlxuICAgIGlmIChzaG91bGRUcmFja1NpZGVFZmZlY3RzICYmIG5ld0ZpYmVyLmFsdGVybmF0ZSA9PT0gbnVsbCkge1xuICAgICAgbmV3RmliZXIuZmxhZ3MgfD0gUGxhY2VtZW50O1xuICAgIH1cblxuICAgIHJldHVybiBuZXdGaWJlcjtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZVRleHROb2RlKHJldHVybkZpYmVyLCBjdXJyZW50LCB0ZXh0Q29udGVudCwgbGFuZXMpIHtcbiAgICBpZiAoY3VycmVudCA9PT0gbnVsbCB8fCBjdXJyZW50LnRhZyAhPT0gSG9zdFRleHQpIHtcbiAgICAgIC8vIEluc2VydFxuICAgICAgdmFyIGNyZWF0ZWQgPSBjcmVhdGVGaWJlckZyb21UZXh0KHRleHRDb250ZW50LCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcyk7XG4gICAgICBjcmVhdGVkLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgcmV0dXJuIGNyZWF0ZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFVwZGF0ZVxuICAgICAgdmFyIGV4aXN0aW5nID0gdXNlRmliZXIoY3VycmVudCwgdGV4dENvbnRlbnQpO1xuICAgICAgZXhpc3RpbmcucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICByZXR1cm4gZXhpc3Rpbmc7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlRWxlbWVudChyZXR1cm5GaWJlciwgY3VycmVudCwgZWxlbWVudCwgbGFuZXMpIHtcbiAgICB2YXIgZWxlbWVudFR5cGUgPSBlbGVtZW50LnR5cGU7XG5cbiAgICBpZiAoZWxlbWVudFR5cGUgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEUpIHtcbiAgICAgIHJldHVybiB1cGRhdGVGcmFnbWVudChyZXR1cm5GaWJlciwgY3VycmVudCwgZWxlbWVudC5wcm9wcy5jaGlsZHJlbiwgbGFuZXMsIGVsZW1lbnQua2V5KTtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgaWYgKGN1cnJlbnQuZWxlbWVudFR5cGUgPT09IGVsZW1lbnRUeXBlIHx8ICggLy8gS2VlcCB0aGlzIGNoZWNrIGlubGluZSBzbyBpdCBvbmx5IHJ1bnMgb24gdGhlIGZhbHNlIHBhdGg6XG4gICAgICAgaXNDb21wYXRpYmxlRmFtaWx5Rm9ySG90UmVsb2FkaW5nKGN1cnJlbnQsIGVsZW1lbnQpICkgfHwgLy8gTGF6eSB0eXBlcyBzaG91bGQgcmVjb25jaWxlIHRoZWlyIHJlc29sdmVkIHR5cGUuXG4gICAgICAvLyBXZSBuZWVkIHRvIGRvIHRoaXMgYWZ0ZXIgdGhlIEhvdCBSZWxvYWRpbmcgY2hlY2sgYWJvdmUsXG4gICAgICAvLyBiZWNhdXNlIGhvdCByZWxvYWRpbmcgaGFzIGRpZmZlcmVudCBzZW1hbnRpY3MgdGhhbiBwcm9kIGJlY2F1c2VcbiAgICAgIC8vIGl0IGRvZXNuJ3QgcmVzdXNwZW5kLiBTbyB3ZSBjYW4ndCBsZXQgdGhlIGNhbGwgYmVsb3cgc3VzcGVuZC5cbiAgICAgIHR5cGVvZiBlbGVtZW50VHlwZSA9PT0gJ29iamVjdCcgJiYgZWxlbWVudFR5cGUgIT09IG51bGwgJiYgZWxlbWVudFR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0xBWllfVFlQRSAmJiByZXNvbHZlTGF6eShlbGVtZW50VHlwZSkgPT09IGN1cnJlbnQudHlwZSkge1xuICAgICAgICAvLyBNb3ZlIGJhc2VkIG9uIGluZGV4XG4gICAgICAgIHZhciBleGlzdGluZyA9IHVzZUZpYmVyKGN1cnJlbnQsIGVsZW1lbnQucHJvcHMpO1xuICAgICAgICBleGlzdGluZy5yZWYgPSBjb2VyY2VSZWYocmV0dXJuRmliZXIsIGN1cnJlbnQsIGVsZW1lbnQpO1xuICAgICAgICBleGlzdGluZy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcblxuICAgICAgICB7XG4gICAgICAgICAgZXhpc3RpbmcuX2RlYnVnU291cmNlID0gZWxlbWVudC5fc291cmNlO1xuICAgICAgICAgIGV4aXN0aW5nLl9kZWJ1Z093bmVyID0gZWxlbWVudC5fb3duZXI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZXhpc3Rpbmc7XG4gICAgICB9XG4gICAgfSAvLyBJbnNlcnRcblxuXG4gICAgdmFyIGNyZWF0ZWQgPSBjcmVhdGVGaWJlckZyb21FbGVtZW50KGVsZW1lbnQsIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzKTtcbiAgICBjcmVhdGVkLnJlZiA9IGNvZXJjZVJlZihyZXR1cm5GaWJlciwgY3VycmVudCwgZWxlbWVudCk7XG4gICAgY3JlYXRlZC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICByZXR1cm4gY3JlYXRlZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZVBvcnRhbChyZXR1cm5GaWJlciwgY3VycmVudCwgcG9ydGFsLCBsYW5lcykge1xuICAgIGlmIChjdXJyZW50ID09PSBudWxsIHx8IGN1cnJlbnQudGFnICE9PSBIb3N0UG9ydGFsIHx8IGN1cnJlbnQuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8gIT09IHBvcnRhbC5jb250YWluZXJJbmZvIHx8IGN1cnJlbnQuc3RhdGVOb2RlLmltcGxlbWVudGF0aW9uICE9PSBwb3J0YWwuaW1wbGVtZW50YXRpb24pIHtcbiAgICAgIC8vIEluc2VydFxuICAgICAgdmFyIGNyZWF0ZWQgPSBjcmVhdGVGaWJlckZyb21Qb3J0YWwocG9ydGFsLCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcyk7XG4gICAgICBjcmVhdGVkLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgcmV0dXJuIGNyZWF0ZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFVwZGF0ZVxuICAgICAgdmFyIGV4aXN0aW5nID0gdXNlRmliZXIoY3VycmVudCwgcG9ydGFsLmNoaWxkcmVuIHx8IFtdKTtcbiAgICAgIGV4aXN0aW5nLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgcmV0dXJuIGV4aXN0aW5nO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZUZyYWdtZW50KHJldHVybkZpYmVyLCBjdXJyZW50LCBmcmFnbWVudCwgbGFuZXMsIGtleSkge1xuICAgIGlmIChjdXJyZW50ID09PSBudWxsIHx8IGN1cnJlbnQudGFnICE9PSBGcmFnbWVudCkge1xuICAgICAgLy8gSW5zZXJ0XG4gICAgICB2YXIgY3JlYXRlZCA9IGNyZWF0ZUZpYmVyRnJvbUZyYWdtZW50KGZyYWdtZW50LCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcywga2V5KTtcbiAgICAgIGNyZWF0ZWQucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICByZXR1cm4gY3JlYXRlZDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVXBkYXRlXG4gICAgICB2YXIgZXhpc3RpbmcgPSB1c2VGaWJlcihjdXJyZW50LCBmcmFnbWVudCk7XG4gICAgICBleGlzdGluZy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBleGlzdGluZztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVDaGlsZChyZXR1cm5GaWJlciwgbmV3Q2hpbGQsIGxhbmVzKSB7XG4gICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ3N0cmluZycgJiYgbmV3Q2hpbGQgIT09ICcnIHx8IHR5cGVvZiBuZXdDaGlsZCA9PT0gJ251bWJlcicpIHtcbiAgICAgIC8vIFRleHQgbm9kZXMgZG9uJ3QgaGF2ZSBrZXlzLiBJZiB0aGUgcHJldmlvdXMgbm9kZSBpcyBpbXBsaWNpdGx5IGtleWVkXG4gICAgICAvLyB3ZSBjYW4gY29udGludWUgdG8gcmVwbGFjZSBpdCB3aXRob3V0IGFib3J0aW5nIGV2ZW4gaWYgaXQgaXMgbm90IGEgdGV4dFxuICAgICAgLy8gbm9kZS5cbiAgICAgIHZhciBjcmVhdGVkID0gY3JlYXRlRmliZXJGcm9tVGV4dCgnJyArIG5ld0NoaWxkLCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcyk7XG4gICAgICBjcmVhdGVkLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgcmV0dXJuIGNyZWF0ZWQ7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ29iamVjdCcgJiYgbmV3Q2hpbGQgIT09IG51bGwpIHtcbiAgICAgIHN3aXRjaCAobmV3Q2hpbGQuJCR0eXBlb2YpIHtcbiAgICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIF9jcmVhdGVkID0gY3JlYXRlRmliZXJGcm9tRWxlbWVudChuZXdDaGlsZCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMpO1xuXG4gICAgICAgICAgICBfY3JlYXRlZC5yZWYgPSBjb2VyY2VSZWYocmV0dXJuRmliZXIsIG51bGwsIG5ld0NoaWxkKTtcbiAgICAgICAgICAgIF9jcmVhdGVkLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgICAgICAgcmV0dXJuIF9jcmVhdGVkO1xuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBfY3JlYXRlZDIgPSBjcmVhdGVGaWJlckZyb21Qb3J0YWwobmV3Q2hpbGQsIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzKTtcblxuICAgICAgICAgICAgX2NyZWF0ZWQyLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgICAgICAgcmV0dXJuIF9jcmVhdGVkMjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIHBheWxvYWQgPSBuZXdDaGlsZC5fcGF5bG9hZDtcbiAgICAgICAgICAgIHZhciBpbml0ID0gbmV3Q2hpbGQuX2luaXQ7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlQ2hpbGQocmV0dXJuRmliZXIsIGluaXQocGF5bG9hZCksIGxhbmVzKTtcbiAgICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0FycmF5KG5ld0NoaWxkKSB8fCBnZXRJdGVyYXRvckZuKG5ld0NoaWxkKSkge1xuICAgICAgICB2YXIgX2NyZWF0ZWQzID0gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQobmV3Q2hpbGQsIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzLCBudWxsKTtcblxuICAgICAgICBfY3JlYXRlZDMucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICAgIHJldHVybiBfY3JlYXRlZDM7XG4gICAgICB9XG5cbiAgICAgIHRocm93T25JbnZhbGlkT2JqZWN0VHlwZShyZXR1cm5GaWJlciwgbmV3Q2hpbGQpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgd2Fybk9uRnVuY3Rpb25UeXBlKHJldHVybkZpYmVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZVNsb3QocmV0dXJuRmliZXIsIG9sZEZpYmVyLCBuZXdDaGlsZCwgbGFuZXMpIHtcbiAgICAvLyBVcGRhdGUgdGhlIGZpYmVyIGlmIHRoZSBrZXlzIG1hdGNoLCBvdGhlcndpc2UgcmV0dXJuIG51bGwuXG4gICAgdmFyIGtleSA9IG9sZEZpYmVyICE9PSBudWxsID8gb2xkRmliZXIua2V5IDogbnVsbDtcblxuICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdzdHJpbmcnICYmIG5ld0NoaWxkICE9PSAnJyB8fCB0eXBlb2YgbmV3Q2hpbGQgPT09ICdudW1iZXInKSB7XG4gICAgICAvLyBUZXh0IG5vZGVzIGRvbid0IGhhdmUga2V5cy4gSWYgdGhlIHByZXZpb3VzIG5vZGUgaXMgaW1wbGljaXRseSBrZXllZFxuICAgICAgLy8gd2UgY2FuIGNvbnRpbnVlIHRvIHJlcGxhY2UgaXQgd2l0aG91dCBhYm9ydGluZyBldmVuIGlmIGl0IGlzIG5vdCBhIHRleHRcbiAgICAgIC8vIG5vZGUuXG4gICAgICBpZiAoa2V5ICE9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdXBkYXRlVGV4dE5vZGUocmV0dXJuRmliZXIsIG9sZEZpYmVyLCAnJyArIG5ld0NoaWxkLCBsYW5lcyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ29iamVjdCcgJiYgbmV3Q2hpbGQgIT09IG51bGwpIHtcbiAgICAgIHN3aXRjaCAobmV3Q2hpbGQuJCR0eXBlb2YpIHtcbiAgICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6XG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKG5ld0NoaWxkLmtleSA9PT0ga2V5KSB7XG4gICAgICAgICAgICAgIHJldHVybiB1cGRhdGVFbGVtZW50KHJldHVybkZpYmVyLCBvbGRGaWJlciwgbmV3Q2hpbGQsIGxhbmVzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmIChuZXdDaGlsZC5rZXkgPT09IGtleSkge1xuICAgICAgICAgICAgICByZXR1cm4gdXBkYXRlUG9ydGFsKHJldHVybkZpYmVyLCBvbGRGaWJlciwgbmV3Q2hpbGQsIGxhbmVzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgcGF5bG9hZCA9IG5ld0NoaWxkLl9wYXlsb2FkO1xuICAgICAgICAgICAgdmFyIGluaXQgPSBuZXdDaGlsZC5faW5pdDtcbiAgICAgICAgICAgIHJldHVybiB1cGRhdGVTbG90KHJldHVybkZpYmVyLCBvbGRGaWJlciwgaW5pdChwYXlsb2FkKSwgbGFuZXMpO1xuICAgICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGlzQXJyYXkobmV3Q2hpbGQpIHx8IGdldEl0ZXJhdG9yRm4obmV3Q2hpbGQpKSB7XG4gICAgICAgIGlmIChrZXkgIT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB1cGRhdGVGcmFnbWVudChyZXR1cm5GaWJlciwgb2xkRmliZXIsIG5ld0NoaWxkLCBsYW5lcywgbnVsbCk7XG4gICAgICB9XG5cbiAgICAgIHRocm93T25JbnZhbGlkT2JqZWN0VHlwZShyZXR1cm5GaWJlciwgbmV3Q2hpbGQpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgd2Fybk9uRnVuY3Rpb25UeXBlKHJldHVybkZpYmVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZUZyb21NYXAoZXhpc3RpbmdDaGlsZHJlbiwgcmV0dXJuRmliZXIsIG5ld0lkeCwgbmV3Q2hpbGQsIGxhbmVzKSB7XG4gICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ3N0cmluZycgJiYgbmV3Q2hpbGQgIT09ICcnIHx8IHR5cGVvZiBuZXdDaGlsZCA9PT0gJ251bWJlcicpIHtcbiAgICAgIC8vIFRleHQgbm9kZXMgZG9uJ3QgaGF2ZSBrZXlzLCBzbyB3ZSBuZWl0aGVyIGhhdmUgdG8gY2hlY2sgdGhlIG9sZCBub3JcbiAgICAgIC8vIG5ldyBub2RlIGZvciB0aGUga2V5LiBJZiBib3RoIGFyZSB0ZXh0IG5vZGVzLCB0aGV5IG1hdGNoLlxuICAgICAgdmFyIG1hdGNoZWRGaWJlciA9IGV4aXN0aW5nQ2hpbGRyZW4uZ2V0KG5ld0lkeCkgfHwgbnVsbDtcbiAgICAgIHJldHVybiB1cGRhdGVUZXh0Tm9kZShyZXR1cm5GaWJlciwgbWF0Y2hlZEZpYmVyLCAnJyArIG5ld0NoaWxkLCBsYW5lcyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ29iamVjdCcgJiYgbmV3Q2hpbGQgIT09IG51bGwpIHtcbiAgICAgIHN3aXRjaCAobmV3Q2hpbGQuJCR0eXBlb2YpIHtcbiAgICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIF9tYXRjaGVkRmliZXIgPSBleGlzdGluZ0NoaWxkcmVuLmdldChuZXdDaGlsZC5rZXkgPT09IG51bGwgPyBuZXdJZHggOiBuZXdDaGlsZC5rZXkpIHx8IG51bGw7XG5cbiAgICAgICAgICAgIHJldHVybiB1cGRhdGVFbGVtZW50KHJldHVybkZpYmVyLCBfbWF0Y2hlZEZpYmVyLCBuZXdDaGlsZCwgbGFuZXMpO1xuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBfbWF0Y2hlZEZpYmVyMiA9IGV4aXN0aW5nQ2hpbGRyZW4uZ2V0KG5ld0NoaWxkLmtleSA9PT0gbnVsbCA/IG5ld0lkeCA6IG5ld0NoaWxkLmtleSkgfHwgbnVsbDtcblxuICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZVBvcnRhbChyZXR1cm5GaWJlciwgX21hdGNoZWRGaWJlcjIsIG5ld0NoaWxkLCBsYW5lcyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICAgIHZhciBwYXlsb2FkID0gbmV3Q2hpbGQuX3BheWxvYWQ7XG4gICAgICAgICAgdmFyIGluaXQgPSBuZXdDaGlsZC5faW5pdDtcbiAgICAgICAgICByZXR1cm4gdXBkYXRlRnJvbU1hcChleGlzdGluZ0NoaWxkcmVuLCByZXR1cm5GaWJlciwgbmV3SWR4LCBpbml0KHBheWxvYWQpLCBsYW5lcyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0FycmF5KG5ld0NoaWxkKSB8fCBnZXRJdGVyYXRvckZuKG5ld0NoaWxkKSkge1xuICAgICAgICB2YXIgX21hdGNoZWRGaWJlcjMgPSBleGlzdGluZ0NoaWxkcmVuLmdldChuZXdJZHgpIHx8IG51bGw7XG5cbiAgICAgICAgcmV0dXJuIHVwZGF0ZUZyYWdtZW50KHJldHVybkZpYmVyLCBfbWF0Y2hlZEZpYmVyMywgbmV3Q2hpbGQsIGxhbmVzLCBudWxsKTtcbiAgICAgIH1cblxuICAgICAgdGhyb3dPbkludmFsaWRPYmplY3RUeXBlKHJldHVybkZpYmVyLCBuZXdDaGlsZCk7XG4gICAgfVxuXG4gICAge1xuICAgICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB3YXJuT25GdW5jdGlvblR5cGUocmV0dXJuRmliZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIC8qKlxuICAgKiBXYXJucyBpZiB0aGVyZSBpcyBhIGR1cGxpY2F0ZSBvciBtaXNzaW5nIGtleVxuICAgKi9cblxuXG4gIGZ1bmN0aW9uIHdhcm5PbkludmFsaWRLZXkoY2hpbGQsIGtub3duS2V5cywgcmV0dXJuRmliZXIpIHtcbiAgICB7XG4gICAgICBpZiAodHlwZW9mIGNoaWxkICE9PSAnb2JqZWN0JyB8fCBjaGlsZCA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4ga25vd25LZXlzO1xuICAgICAgfVxuXG4gICAgICBzd2l0Y2ggKGNoaWxkLiQkdHlwZW9mKSB7XG4gICAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgICAgIHdhcm5Gb3JNaXNzaW5nS2V5KGNoaWxkLCByZXR1cm5GaWJlcik7XG4gICAgICAgICAgdmFyIGtleSA9IGNoaWxkLmtleTtcblxuICAgICAgICAgIGlmICh0eXBlb2Yga2V5ICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGtub3duS2V5cyA9PT0gbnVsbCkge1xuICAgICAgICAgICAga25vd25LZXlzID0gbmV3IFNldCgpO1xuICAgICAgICAgICAga25vd25LZXlzLmFkZChrZXkpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFrbm93bktleXMuaGFzKGtleSkpIHtcbiAgICAgICAgICAgIGtub3duS2V5cy5hZGQoa2V5KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGVycm9yKCdFbmNvdW50ZXJlZCB0d28gY2hpbGRyZW4gd2l0aCB0aGUgc2FtZSBrZXksIGAlc2AuICcgKyAnS2V5cyBzaG91bGQgYmUgdW5pcXVlIHNvIHRoYXQgY29tcG9uZW50cyBtYWludGFpbiB0aGVpciBpZGVudGl0eSAnICsgJ2Fjcm9zcyB1cGRhdGVzLiBOb24tdW5pcXVlIGtleXMgbWF5IGNhdXNlIGNoaWxkcmVuIHRvIGJlICcgKyAnZHVwbGljYXRlZCBhbmQvb3Igb21pdHRlZCBcdTIwMTQgdGhlIGJlaGF2aW9yIGlzIHVuc3VwcG9ydGVkIGFuZCAnICsgJ2NvdWxkIGNoYW5nZSBpbiBhIGZ1dHVyZSB2ZXJzaW9uLicsIGtleSk7XG5cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAgICB2YXIgcGF5bG9hZCA9IGNoaWxkLl9wYXlsb2FkO1xuICAgICAgICAgIHZhciBpbml0ID0gY2hpbGQuX2luaXQ7XG4gICAgICAgICAgd2Fybk9uSW52YWxpZEtleShpbml0KHBheWxvYWQpLCBrbm93bktleXMsIHJldHVybkZpYmVyKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ga25vd25LZXlzO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVjb25jaWxlQ2hpbGRyZW5BcnJheShyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIG5ld0NoaWxkcmVuLCBsYW5lcykge1xuICAgIC8vIFRoaXMgYWxnb3JpdGhtIGNhbid0IG9wdGltaXplIGJ5IHNlYXJjaGluZyBmcm9tIGJvdGggZW5kcyBzaW5jZSB3ZVxuICAgIC8vIGRvbid0IGhhdmUgYmFja3BvaW50ZXJzIG9uIGZpYmVycy4gSSdtIHRyeWluZyB0byBzZWUgaG93IGZhciB3ZSBjYW4gZ2V0XG4gICAgLy8gd2l0aCB0aGF0IG1vZGVsLiBJZiBpdCBlbmRzIHVwIG5vdCBiZWluZyB3b3J0aCB0aGUgdHJhZGVvZmZzLCB3ZSBjYW5cbiAgICAvLyBhZGQgaXQgbGF0ZXIuXG4gICAgLy8gRXZlbiB3aXRoIGEgdHdvIGVuZGVkIG9wdGltaXphdGlvbiwgd2UnZCB3YW50IHRvIG9wdGltaXplIGZvciB0aGUgY2FzZVxuICAgIC8vIHdoZXJlIHRoZXJlIGFyZSBmZXcgY2hhbmdlcyBhbmQgYnJ1dGUgZm9yY2UgdGhlIGNvbXBhcmlzb24gaW5zdGVhZCBvZlxuICAgIC8vIGdvaW5nIGZvciB0aGUgTWFwLiBJdCdkIGxpa2UgdG8gZXhwbG9yZSBoaXR0aW5nIHRoYXQgcGF0aCBmaXJzdCBpblxuICAgIC8vIGZvcndhcmQtb25seSBtb2RlIGFuZCBvbmx5IGdvIGZvciB0aGUgTWFwIG9uY2Ugd2Ugbm90aWNlIHRoYXQgd2UgbmVlZFxuICAgIC8vIGxvdHMgb2YgbG9vayBhaGVhZC4gVGhpcyBkb2Vzbid0IGhhbmRsZSByZXZlcnNhbCBhcyB3ZWxsIGFzIHR3byBlbmRlZFxuICAgIC8vIHNlYXJjaCBidXQgdGhhdCdzIHVudXN1YWwuIEJlc2lkZXMsIGZvciB0aGUgdHdvIGVuZGVkIG9wdGltaXphdGlvbiB0b1xuICAgIC8vIHdvcmsgb24gSXRlcmFibGVzLCB3ZSdkIG5lZWQgdG8gY29weSB0aGUgd2hvbGUgc2V0LlxuICAgIC8vIEluIHRoaXMgZmlyc3QgaXRlcmF0aW9uLCB3ZSdsbCBqdXN0IGxpdmUgd2l0aCBoaXR0aW5nIHRoZSBiYWQgY2FzZVxuICAgIC8vIChhZGRpbmcgZXZlcnl0aGluZyB0byBhIE1hcCkgaW4gZm9yIGV2ZXJ5IGluc2VydC9tb3ZlLlxuICAgIC8vIElmIHlvdSBjaGFuZ2UgdGhpcyBjb2RlLCBhbHNvIHVwZGF0ZSByZWNvbmNpbGVDaGlsZHJlbkl0ZXJhdG9yKCkgd2hpY2hcbiAgICAvLyB1c2VzIHRoZSBzYW1lIGFsZ29yaXRobS5cbiAgICB7XG4gICAgICAvLyBGaXJzdCwgdmFsaWRhdGUga2V5cy5cbiAgICAgIHZhciBrbm93bktleXMgPSBudWxsO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5ld0NoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjaGlsZCA9IG5ld0NoaWxkcmVuW2ldO1xuICAgICAgICBrbm93bktleXMgPSB3YXJuT25JbnZhbGlkS2V5KGNoaWxkLCBrbm93bktleXMsIHJldHVybkZpYmVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgcmVzdWx0aW5nRmlyc3RDaGlsZCA9IG51bGw7XG4gICAgdmFyIHByZXZpb3VzTmV3RmliZXIgPSBudWxsO1xuICAgIHZhciBvbGRGaWJlciA9IGN1cnJlbnRGaXJzdENoaWxkO1xuICAgIHZhciBsYXN0UGxhY2VkSW5kZXggPSAwO1xuICAgIHZhciBuZXdJZHggPSAwO1xuICAgIHZhciBuZXh0T2xkRmliZXIgPSBudWxsO1xuXG4gICAgZm9yICg7IG9sZEZpYmVyICE9PSBudWxsICYmIG5ld0lkeCA8IG5ld0NoaWxkcmVuLmxlbmd0aDsgbmV3SWR4KyspIHtcbiAgICAgIGlmIChvbGRGaWJlci5pbmRleCA+IG5ld0lkeCkge1xuICAgICAgICBuZXh0T2xkRmliZXIgPSBvbGRGaWJlcjtcbiAgICAgICAgb2xkRmliZXIgPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV4dE9sZEZpYmVyID0gb2xkRmliZXIuc2libGluZztcbiAgICAgIH1cblxuICAgICAgdmFyIG5ld0ZpYmVyID0gdXBkYXRlU2xvdChyZXR1cm5GaWJlciwgb2xkRmliZXIsIG5ld0NoaWxkcmVuW25ld0lkeF0sIGxhbmVzKTtcblxuICAgICAgaWYgKG5ld0ZpYmVyID09PSBudWxsKSB7XG4gICAgICAgIC8vIFRPRE86IFRoaXMgYnJlYWtzIG9uIGVtcHR5IHNsb3RzIGxpa2UgbnVsbCBjaGlsZHJlbi4gVGhhdCdzXG4gICAgICAgIC8vIHVuZm9ydHVuYXRlIGJlY2F1c2UgaXQgdHJpZ2dlcnMgdGhlIHNsb3cgcGF0aCBhbGwgdGhlIHRpbWUuIFdlIG5lZWRcbiAgICAgICAgLy8gYSBiZXR0ZXIgd2F5IHRvIGNvbW11bmljYXRlIHdoZXRoZXIgdGhpcyB3YXMgYSBtaXNzIG9yIG51bGwsXG4gICAgICAgIC8vIGJvb2xlYW4sIHVuZGVmaW5lZCwgZXRjLlxuICAgICAgICBpZiAob2xkRmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgICBvbGRGaWJlciA9IG5leHRPbGRGaWJlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2hvdWxkVHJhY2tTaWRlRWZmZWN0cykge1xuICAgICAgICBpZiAob2xkRmliZXIgJiYgbmV3RmliZXIuYWx0ZXJuYXRlID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gV2UgbWF0Y2hlZCB0aGUgc2xvdCwgYnV0IHdlIGRpZG4ndCByZXVzZSB0aGUgZXhpc3RpbmcgZmliZXIsIHNvIHdlXG4gICAgICAgICAgLy8gbmVlZCB0byBkZWxldGUgdGhlIGV4aXN0aW5nIGNoaWxkLlxuICAgICAgICAgIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBvbGRGaWJlcik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGFzdFBsYWNlZEluZGV4ID0gcGxhY2VDaGlsZChuZXdGaWJlciwgbGFzdFBsYWNlZEluZGV4LCBuZXdJZHgpO1xuXG4gICAgICBpZiAocHJldmlvdXNOZXdGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAvLyBUT0RPOiBNb3ZlIG91dCBvZiB0aGUgbG9vcC4gVGhpcyBvbmx5IGhhcHBlbnMgZm9yIHRoZSBmaXJzdCBydW4uXG4gICAgICAgIHJlc3VsdGluZ0ZpcnN0Q2hpbGQgPSBuZXdGaWJlcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRPRE86IERlZmVyIHNpYmxpbmdzIGlmIHdlJ3JlIG5vdCBhdCB0aGUgcmlnaHQgaW5kZXggZm9yIHRoaXMgc2xvdC5cbiAgICAgICAgLy8gSS5lLiBpZiB3ZSBoYWQgbnVsbCB2YWx1ZXMgYmVmb3JlLCB0aGVuIHdlIHdhbnQgdG8gZGVmZXIgdGhpc1xuICAgICAgICAvLyBmb3IgZWFjaCBudWxsIHZhbHVlLiBIb3dldmVyLCB3ZSBhbHNvIGRvbid0IHdhbnQgdG8gY2FsbCB1cGRhdGVTbG90XG4gICAgICAgIC8vIHdpdGggdGhlIHByZXZpb3VzIG9uZS5cbiAgICAgICAgcHJldmlvdXNOZXdGaWJlci5zaWJsaW5nID0gbmV3RmliZXI7XG4gICAgICB9XG5cbiAgICAgIHByZXZpb3VzTmV3RmliZXIgPSBuZXdGaWJlcjtcbiAgICAgIG9sZEZpYmVyID0gbmV4dE9sZEZpYmVyO1xuICAgIH1cblxuICAgIGlmIChuZXdJZHggPT09IG5ld0NoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgLy8gV2UndmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBuZXcgY2hpbGRyZW4uIFdlIGNhbiBkZWxldGUgdGhlIHJlc3QuXG4gICAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgb2xkRmliZXIpO1xuXG4gICAgICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSkge1xuICAgICAgICB2YXIgbnVtYmVyT2ZGb3JrcyA9IG5ld0lkeDtcbiAgICAgICAgcHVzaFRyZWVGb3JrKHJldHVybkZpYmVyLCBudW1iZXJPZkZvcmtzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdGluZ0ZpcnN0Q2hpbGQ7XG4gICAgfVxuXG4gICAgaWYgKG9sZEZpYmVyID09PSBudWxsKSB7XG4gICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGFueSBtb3JlIGV4aXN0aW5nIGNoaWxkcmVuIHdlIGNhbiBjaG9vc2UgYSBmYXN0IHBhdGhcbiAgICAgIC8vIHNpbmNlIHRoZSByZXN0IHdpbGwgYWxsIGJlIGluc2VydGlvbnMuXG4gICAgICBmb3IgKDsgbmV3SWR4IDwgbmV3Q2hpbGRyZW4ubGVuZ3RoOyBuZXdJZHgrKykge1xuICAgICAgICB2YXIgX25ld0ZpYmVyID0gY3JlYXRlQ2hpbGQocmV0dXJuRmliZXIsIG5ld0NoaWxkcmVuW25ld0lkeF0sIGxhbmVzKTtcblxuICAgICAgICBpZiAoX25ld0ZpYmVyID09PSBudWxsKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBsYXN0UGxhY2VkSW5kZXggPSBwbGFjZUNoaWxkKF9uZXdGaWJlciwgbGFzdFBsYWNlZEluZGV4LCBuZXdJZHgpO1xuXG4gICAgICAgIGlmIChwcmV2aW91c05ld0ZpYmVyID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gVE9ETzogTW92ZSBvdXQgb2YgdGhlIGxvb3AuIFRoaXMgb25seSBoYXBwZW5zIGZvciB0aGUgZmlyc3QgcnVuLlxuICAgICAgICAgIHJlc3VsdGluZ0ZpcnN0Q2hpbGQgPSBfbmV3RmliZXI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJldmlvdXNOZXdGaWJlci5zaWJsaW5nID0gX25ld0ZpYmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJldmlvdXNOZXdGaWJlciA9IF9uZXdGaWJlcjtcbiAgICAgIH1cblxuICAgICAgaWYgKGdldElzSHlkcmF0aW5nKCkpIHtcbiAgICAgICAgdmFyIF9udW1iZXJPZkZvcmtzID0gbmV3SWR4O1xuICAgICAgICBwdXNoVHJlZUZvcmsocmV0dXJuRmliZXIsIF9udW1iZXJPZkZvcmtzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdGluZ0ZpcnN0Q2hpbGQ7XG4gICAgfSAvLyBBZGQgYWxsIGNoaWxkcmVuIHRvIGEga2V5IG1hcCBmb3IgcXVpY2sgbG9va3Vwcy5cblxuXG4gICAgdmFyIGV4aXN0aW5nQ2hpbGRyZW4gPSBtYXBSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgb2xkRmliZXIpOyAvLyBLZWVwIHNjYW5uaW5nIGFuZCB1c2UgdGhlIG1hcCB0byByZXN0b3JlIGRlbGV0ZWQgaXRlbXMgYXMgbW92ZXMuXG5cbiAgICBmb3IgKDsgbmV3SWR4IDwgbmV3Q2hpbGRyZW4ubGVuZ3RoOyBuZXdJZHgrKykge1xuICAgICAgdmFyIF9uZXdGaWJlcjIgPSB1cGRhdGVGcm9tTWFwKGV4aXN0aW5nQ2hpbGRyZW4sIHJldHVybkZpYmVyLCBuZXdJZHgsIG5ld0NoaWxkcmVuW25ld0lkeF0sIGxhbmVzKTtcblxuICAgICAgaWYgKF9uZXdGaWJlcjIgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKHNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgICAgICAgICBpZiAoX25ld0ZpYmVyMi5hbHRlcm5hdGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIFRoZSBuZXcgZmliZXIgaXMgYSB3b3JrIGluIHByb2dyZXNzLCBidXQgaWYgdGhlcmUgZXhpc3RzIGFcbiAgICAgICAgICAgIC8vIGN1cnJlbnQsIHRoYXQgbWVhbnMgdGhhdCB3ZSByZXVzZWQgdGhlIGZpYmVyLiBXZSBuZWVkIHRvIGRlbGV0ZVxuICAgICAgICAgICAgLy8gaXQgZnJvbSB0aGUgY2hpbGQgbGlzdCBzbyB0aGF0IHdlIGRvbid0IGFkZCBpdCB0byB0aGUgZGVsZXRpb25cbiAgICAgICAgICAgIC8vIGxpc3QuXG4gICAgICAgICAgICBleGlzdGluZ0NoaWxkcmVuLmRlbGV0ZShfbmV3RmliZXIyLmtleSA9PT0gbnVsbCA/IG5ld0lkeCA6IF9uZXdGaWJlcjIua2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsYXN0UGxhY2VkSW5kZXggPSBwbGFjZUNoaWxkKF9uZXdGaWJlcjIsIGxhc3RQbGFjZWRJbmRleCwgbmV3SWR4KTtcblxuICAgICAgICBpZiAocHJldmlvdXNOZXdGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAgIHJlc3VsdGluZ0ZpcnN0Q2hpbGQgPSBfbmV3RmliZXIyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByZXZpb3VzTmV3RmliZXIuc2libGluZyA9IF9uZXdGaWJlcjI7XG4gICAgICAgIH1cblxuICAgICAgICBwcmV2aW91c05ld0ZpYmVyID0gX25ld0ZpYmVyMjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2hvdWxkVHJhY2tTaWRlRWZmZWN0cykge1xuICAgICAgLy8gQW55IGV4aXN0aW5nIGNoaWxkcmVuIHRoYXQgd2VyZW4ndCBjb25zdW1lZCBhYm92ZSB3ZXJlIGRlbGV0ZWQuIFdlIG5lZWRcbiAgICAgIC8vIHRvIGFkZCB0aGVtIHRvIHRoZSBkZWxldGlvbiBsaXN0LlxuICAgICAgZXhpc3RpbmdDaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICByZXR1cm4gZGVsZXRlQ2hpbGQocmV0dXJuRmliZXIsIGNoaWxkKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChnZXRJc0h5ZHJhdGluZygpKSB7XG4gICAgICB2YXIgX251bWJlck9mRm9ya3MyID0gbmV3SWR4O1xuICAgICAgcHVzaFRyZWVGb3JrKHJldHVybkZpYmVyLCBfbnVtYmVyT2ZGb3JrczIpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRpbmdGaXJzdENoaWxkO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVjb25jaWxlQ2hpbGRyZW5JdGVyYXRvcihyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIG5ld0NoaWxkcmVuSXRlcmFibGUsIGxhbmVzKSB7XG4gICAgLy8gVGhpcyBpcyB0aGUgc2FtZSBpbXBsZW1lbnRhdGlvbiBhcyByZWNvbmNpbGVDaGlsZHJlbkFycmF5KCksXG4gICAgLy8gYnV0IHVzaW5nIHRoZSBpdGVyYXRvciBpbnN0ZWFkLlxuICAgIHZhciBpdGVyYXRvckZuID0gZ2V0SXRlcmF0b3JGbihuZXdDaGlsZHJlbkl0ZXJhYmxlKTtcblxuICAgIGlmICh0eXBlb2YgaXRlcmF0b3JGbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBbiBvYmplY3QgaXMgbm90IGFuIGl0ZXJhYmxlLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gJyArICdSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuXG4gICAge1xuICAgICAgLy8gV2UgZG9uJ3Qgc3VwcG9ydCByZW5kZXJpbmcgR2VuZXJhdG9ycyBiZWNhdXNlIGl0J3MgYSBtdXRhdGlvbi5cbiAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzEyOTk1XG4gICAgICBpZiAodHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiAvLyAkRmxvd0ZpeE1lIEZsb3cgZG9lc24ndCBrbm93IGFib3V0IHRvU3RyaW5nVGFnXG4gICAgICBuZXdDaGlsZHJlbkl0ZXJhYmxlW1N5bWJvbC50b1N0cmluZ1RhZ10gPT09ICdHZW5lcmF0b3InKSB7XG4gICAgICAgIGlmICghZGlkV2FybkFib3V0R2VuZXJhdG9ycykge1xuICAgICAgICAgIGVycm9yKCdVc2luZyBHZW5lcmF0b3JzIGFzIGNoaWxkcmVuIGlzIHVuc3VwcG9ydGVkIGFuZCB3aWxsIGxpa2VseSB5aWVsZCAnICsgJ3VuZXhwZWN0ZWQgcmVzdWx0cyBiZWNhdXNlIGVudW1lcmF0aW5nIGEgZ2VuZXJhdG9yIG11dGF0ZXMgaXQuICcgKyAnWW91IG1heSBjb252ZXJ0IGl0IHRvIGFuIGFycmF5IHdpdGggYEFycmF5LmZyb20oKWAgb3IgdGhlICcgKyAnYFsuLi5zcHJlYWRdYCBvcGVyYXRvciBiZWZvcmUgcmVuZGVyaW5nLiBLZWVwIGluIG1pbmQgJyArICd5b3UgbWlnaHQgbmVlZCB0byBwb2x5ZmlsbCB0aGVzZSBmZWF0dXJlcyBmb3Igb2xkZXIgYnJvd3NlcnMuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBkaWRXYXJuQWJvdXRHZW5lcmF0b3JzID0gdHJ1ZTtcbiAgICAgIH0gLy8gV2FybiBhYm91dCB1c2luZyBNYXBzIGFzIGNoaWxkcmVuXG5cblxuICAgICAgaWYgKG5ld0NoaWxkcmVuSXRlcmFibGUuZW50cmllcyA9PT0gaXRlcmF0b3JGbikge1xuICAgICAgICBpZiAoIWRpZFdhcm5BYm91dE1hcHMpIHtcbiAgICAgICAgICBlcnJvcignVXNpbmcgTWFwcyBhcyBjaGlsZHJlbiBpcyBub3Qgc3VwcG9ydGVkLiAnICsgJ1VzZSBhbiBhcnJheSBvZiBrZXllZCBSZWFjdEVsZW1lbnRzIGluc3RlYWQuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBkaWRXYXJuQWJvdXRNYXBzID0gdHJ1ZTtcbiAgICAgIH0gLy8gRmlyc3QsIHZhbGlkYXRlIGtleXMuXG4gICAgICAvLyBXZSdsbCBnZXQgYSBkaWZmZXJlbnQgaXRlcmF0b3IgbGF0ZXIgZm9yIHRoZSBtYWluIHBhc3MuXG5cblxuICAgICAgdmFyIF9uZXdDaGlsZHJlbiA9IGl0ZXJhdG9yRm4uY2FsbChuZXdDaGlsZHJlbkl0ZXJhYmxlKTtcblxuICAgICAgaWYgKF9uZXdDaGlsZHJlbikge1xuICAgICAgICB2YXIga25vd25LZXlzID0gbnVsbDtcblxuICAgICAgICB2YXIgX3N0ZXAgPSBfbmV3Q2hpbGRyZW4ubmV4dCgpO1xuXG4gICAgICAgIGZvciAoOyAhX3N0ZXAuZG9uZTsgX3N0ZXAgPSBfbmV3Q2hpbGRyZW4ubmV4dCgpKSB7XG4gICAgICAgICAgdmFyIGNoaWxkID0gX3N0ZXAudmFsdWU7XG4gICAgICAgICAga25vd25LZXlzID0gd2Fybk9uSW52YWxpZEtleShjaGlsZCwga25vd25LZXlzLCByZXR1cm5GaWJlcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgbmV3Q2hpbGRyZW4gPSBpdGVyYXRvckZuLmNhbGwobmV3Q2hpbGRyZW5JdGVyYWJsZSk7XG5cbiAgICBpZiAobmV3Q2hpbGRyZW4gPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBbiBpdGVyYWJsZSBvYmplY3QgcHJvdmlkZWQgbm8gaXRlcmF0b3IuJyk7XG4gICAgfVxuXG4gICAgdmFyIHJlc3VsdGluZ0ZpcnN0Q2hpbGQgPSBudWxsO1xuICAgIHZhciBwcmV2aW91c05ld0ZpYmVyID0gbnVsbDtcbiAgICB2YXIgb2xkRmliZXIgPSBjdXJyZW50Rmlyc3RDaGlsZDtcbiAgICB2YXIgbGFzdFBsYWNlZEluZGV4ID0gMDtcbiAgICB2YXIgbmV3SWR4ID0gMDtcbiAgICB2YXIgbmV4dE9sZEZpYmVyID0gbnVsbDtcbiAgICB2YXIgc3RlcCA9IG5ld0NoaWxkcmVuLm5leHQoKTtcblxuICAgIGZvciAoOyBvbGRGaWJlciAhPT0gbnVsbCAmJiAhc3RlcC5kb25lOyBuZXdJZHgrKywgc3RlcCA9IG5ld0NoaWxkcmVuLm5leHQoKSkge1xuICAgICAgaWYgKG9sZEZpYmVyLmluZGV4ID4gbmV3SWR4KSB7XG4gICAgICAgIG5leHRPbGRGaWJlciA9IG9sZEZpYmVyO1xuICAgICAgICBvbGRGaWJlciA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXh0T2xkRmliZXIgPSBvbGRGaWJlci5zaWJsaW5nO1xuICAgICAgfVxuXG4gICAgICB2YXIgbmV3RmliZXIgPSB1cGRhdGVTbG90KHJldHVybkZpYmVyLCBvbGRGaWJlciwgc3RlcC52YWx1ZSwgbGFuZXMpO1xuXG4gICAgICBpZiAobmV3RmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgLy8gVE9ETzogVGhpcyBicmVha3Mgb24gZW1wdHkgc2xvdHMgbGlrZSBudWxsIGNoaWxkcmVuLiBUaGF0J3NcbiAgICAgICAgLy8gdW5mb3J0dW5hdGUgYmVjYXVzZSBpdCB0cmlnZ2VycyB0aGUgc2xvdyBwYXRoIGFsbCB0aGUgdGltZS4gV2UgbmVlZFxuICAgICAgICAvLyBhIGJldHRlciB3YXkgdG8gY29tbXVuaWNhdGUgd2hldGhlciB0aGlzIHdhcyBhIG1pc3Mgb3IgbnVsbCxcbiAgICAgICAgLy8gYm9vbGVhbiwgdW5kZWZpbmVkLCBldGMuXG4gICAgICAgIGlmIChvbGRGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAgIG9sZEZpYmVyID0gbmV4dE9sZEZpYmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGlmIChzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gICAgICAgIGlmIChvbGRGaWJlciAmJiBuZXdGaWJlci5hbHRlcm5hdGUgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBXZSBtYXRjaGVkIHRoZSBzbG90LCBidXQgd2UgZGlkbid0IHJldXNlIHRoZSBleGlzdGluZyBmaWJlciwgc28gd2VcbiAgICAgICAgICAvLyBuZWVkIHRvIGRlbGV0ZSB0aGUgZXhpc3RpbmcgY2hpbGQuXG4gICAgICAgICAgZGVsZXRlQ2hpbGQocmV0dXJuRmliZXIsIG9sZEZpYmVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsYXN0UGxhY2VkSW5kZXggPSBwbGFjZUNoaWxkKG5ld0ZpYmVyLCBsYXN0UGxhY2VkSW5kZXgsIG5ld0lkeCk7XG5cbiAgICAgIGlmIChwcmV2aW91c05ld0ZpYmVyID09PSBudWxsKSB7XG4gICAgICAgIC8vIFRPRE86IE1vdmUgb3V0IG9mIHRoZSBsb29wLiBUaGlzIG9ubHkgaGFwcGVucyBmb3IgdGhlIGZpcnN0IHJ1bi5cbiAgICAgICAgcmVzdWx0aW5nRmlyc3RDaGlsZCA9IG5ld0ZpYmVyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVE9ETzogRGVmZXIgc2libGluZ3MgaWYgd2UncmUgbm90IGF0IHRoZSByaWdodCBpbmRleCBmb3IgdGhpcyBzbG90LlxuICAgICAgICAvLyBJLmUuIGlmIHdlIGhhZCBudWxsIHZhbHVlcyBiZWZvcmUsIHRoZW4gd2Ugd2FudCB0byBkZWZlciB0aGlzXG4gICAgICAgIC8vIGZvciBlYWNoIG51bGwgdmFsdWUuIEhvd2V2ZXIsIHdlIGFsc28gZG9uJ3Qgd2FudCB0byBjYWxsIHVwZGF0ZVNsb3RcbiAgICAgICAgLy8gd2l0aCB0aGUgcHJldmlvdXMgb25lLlxuICAgICAgICBwcmV2aW91c05ld0ZpYmVyLnNpYmxpbmcgPSBuZXdGaWJlcjtcbiAgICAgIH1cblxuICAgICAgcHJldmlvdXNOZXdGaWJlciA9IG5ld0ZpYmVyO1xuICAgICAgb2xkRmliZXIgPSBuZXh0T2xkRmliZXI7XG4gICAgfVxuXG4gICAgaWYgKHN0ZXAuZG9uZSkge1xuICAgICAgLy8gV2UndmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBuZXcgY2hpbGRyZW4uIFdlIGNhbiBkZWxldGUgdGhlIHJlc3QuXG4gICAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgb2xkRmliZXIpO1xuXG4gICAgICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSkge1xuICAgICAgICB2YXIgbnVtYmVyT2ZGb3JrcyA9IG5ld0lkeDtcbiAgICAgICAgcHVzaFRyZWVGb3JrKHJldHVybkZpYmVyLCBudW1iZXJPZkZvcmtzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdGluZ0ZpcnN0Q2hpbGQ7XG4gICAgfVxuXG4gICAgaWYgKG9sZEZpYmVyID09PSBudWxsKSB7XG4gICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGFueSBtb3JlIGV4aXN0aW5nIGNoaWxkcmVuIHdlIGNhbiBjaG9vc2UgYSBmYXN0IHBhdGhcbiAgICAgIC8vIHNpbmNlIHRoZSByZXN0IHdpbGwgYWxsIGJlIGluc2VydGlvbnMuXG4gICAgICBmb3IgKDsgIXN0ZXAuZG9uZTsgbmV3SWR4KyssIHN0ZXAgPSBuZXdDaGlsZHJlbi5uZXh0KCkpIHtcbiAgICAgICAgdmFyIF9uZXdGaWJlcjMgPSBjcmVhdGVDaGlsZChyZXR1cm5GaWJlciwgc3RlcC52YWx1ZSwgbGFuZXMpO1xuXG4gICAgICAgIGlmIChfbmV3RmliZXIzID09PSBudWxsKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBsYXN0UGxhY2VkSW5kZXggPSBwbGFjZUNoaWxkKF9uZXdGaWJlcjMsIGxhc3RQbGFjZWRJbmRleCwgbmV3SWR4KTtcblxuICAgICAgICBpZiAocHJldmlvdXNOZXdGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIFRPRE86IE1vdmUgb3V0IG9mIHRoZSBsb29wLiBUaGlzIG9ubHkgaGFwcGVucyBmb3IgdGhlIGZpcnN0IHJ1bi5cbiAgICAgICAgICByZXN1bHRpbmdGaXJzdENoaWxkID0gX25ld0ZpYmVyMztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcmV2aW91c05ld0ZpYmVyLnNpYmxpbmcgPSBfbmV3RmliZXIzO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJldmlvdXNOZXdGaWJlciA9IF9uZXdGaWJlcjM7XG4gICAgICB9XG5cbiAgICAgIGlmIChnZXRJc0h5ZHJhdGluZygpKSB7XG4gICAgICAgIHZhciBfbnVtYmVyT2ZGb3JrczMgPSBuZXdJZHg7XG4gICAgICAgIHB1c2hUcmVlRm9yayhyZXR1cm5GaWJlciwgX251bWJlck9mRm9ya3MzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdGluZ0ZpcnN0Q2hpbGQ7XG4gICAgfSAvLyBBZGQgYWxsIGNoaWxkcmVuIHRvIGEga2V5IG1hcCBmb3IgcXVpY2sgbG9va3Vwcy5cblxuXG4gICAgdmFyIGV4aXN0aW5nQ2hpbGRyZW4gPSBtYXBSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgb2xkRmliZXIpOyAvLyBLZWVwIHNjYW5uaW5nIGFuZCB1c2UgdGhlIG1hcCB0byByZXN0b3JlIGRlbGV0ZWQgaXRlbXMgYXMgbW92ZXMuXG5cbiAgICBmb3IgKDsgIXN0ZXAuZG9uZTsgbmV3SWR4KyssIHN0ZXAgPSBuZXdDaGlsZHJlbi5uZXh0KCkpIHtcbiAgICAgIHZhciBfbmV3RmliZXI0ID0gdXBkYXRlRnJvbU1hcChleGlzdGluZ0NoaWxkcmVuLCByZXR1cm5GaWJlciwgbmV3SWR4LCBzdGVwLnZhbHVlLCBsYW5lcyk7XG5cbiAgICAgIGlmIChfbmV3RmliZXI0ICE9PSBudWxsKSB7XG4gICAgICAgIGlmIChzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gICAgICAgICAgaWYgKF9uZXdGaWJlcjQuYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBUaGUgbmV3IGZpYmVyIGlzIGEgd29yayBpbiBwcm9ncmVzcywgYnV0IGlmIHRoZXJlIGV4aXN0cyBhXG4gICAgICAgICAgICAvLyBjdXJyZW50LCB0aGF0IG1lYW5zIHRoYXQgd2UgcmV1c2VkIHRoZSBmaWJlci4gV2UgbmVlZCB0byBkZWxldGVcbiAgICAgICAgICAgIC8vIGl0IGZyb20gdGhlIGNoaWxkIGxpc3Qgc28gdGhhdCB3ZSBkb24ndCBhZGQgaXQgdG8gdGhlIGRlbGV0aW9uXG4gICAgICAgICAgICAvLyBsaXN0LlxuICAgICAgICAgICAgZXhpc3RpbmdDaGlsZHJlbi5kZWxldGUoX25ld0ZpYmVyNC5rZXkgPT09IG51bGwgPyBuZXdJZHggOiBfbmV3RmliZXI0LmtleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGFzdFBsYWNlZEluZGV4ID0gcGxhY2VDaGlsZChfbmV3RmliZXI0LCBsYXN0UGxhY2VkSW5kZXgsIG5ld0lkeCk7XG5cbiAgICAgICAgaWYgKHByZXZpb3VzTmV3RmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgICByZXN1bHRpbmdGaXJzdENoaWxkID0gX25ld0ZpYmVyNDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcmV2aW91c05ld0ZpYmVyLnNpYmxpbmcgPSBfbmV3RmliZXI0O1xuICAgICAgICB9XG5cbiAgICAgICAgcHJldmlvdXNOZXdGaWJlciA9IF9uZXdGaWJlcjQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgICAgIC8vIEFueSBleGlzdGluZyBjaGlsZHJlbiB0aGF0IHdlcmVuJ3QgY29uc3VtZWQgYWJvdmUgd2VyZSBkZWxldGVkLiBXZSBuZWVkXG4gICAgICAvLyB0byBhZGQgdGhlbSB0byB0aGUgZGVsZXRpb24gbGlzdC5cbiAgICAgIGV4aXN0aW5nQ2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgcmV0dXJuIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBjaGlsZCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSkge1xuICAgICAgdmFyIF9udW1iZXJPZkZvcmtzNCA9IG5ld0lkeDtcbiAgICAgIHB1c2hUcmVlRm9yayhyZXR1cm5GaWJlciwgX251bWJlck9mRm9ya3M0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0aW5nRmlyc3RDaGlsZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlY29uY2lsZVNpbmdsZVRleHROb2RlKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgdGV4dENvbnRlbnQsIGxhbmVzKSB7XG4gICAgLy8gVGhlcmUncyBubyBuZWVkIHRvIGNoZWNrIGZvciBrZXlzIG9uIHRleHQgbm9kZXMgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBhXG4gICAgLy8gd2F5IHRvIGRlZmluZSB0aGVtLlxuICAgIGlmIChjdXJyZW50Rmlyc3RDaGlsZCAhPT0gbnVsbCAmJiBjdXJyZW50Rmlyc3RDaGlsZC50YWcgPT09IEhvc3RUZXh0KSB7XG4gICAgICAvLyBXZSBhbHJlYWR5IGhhdmUgYW4gZXhpc3Rpbmcgbm9kZSBzbyBsZXQncyBqdXN0IHVwZGF0ZSBpdCBhbmQgZGVsZXRlXG4gICAgICAvLyB0aGUgcmVzdC5cbiAgICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZC5zaWJsaW5nKTtcbiAgICAgIHZhciBleGlzdGluZyA9IHVzZUZpYmVyKGN1cnJlbnRGaXJzdENoaWxkLCB0ZXh0Q29udGVudCk7XG4gICAgICBleGlzdGluZy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBleGlzdGluZztcbiAgICB9IC8vIFRoZSBleGlzdGluZyBmaXJzdCBjaGlsZCBpcyBub3QgYSB0ZXh0IG5vZGUgc28gd2UgbmVlZCB0byBjcmVhdGUgb25lXG4gICAgLy8gYW5kIGRlbGV0ZSB0aGUgZXhpc3Rpbmcgb25lcy5cblxuXG4gICAgZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkKTtcbiAgICB2YXIgY3JlYXRlZCA9IGNyZWF0ZUZpYmVyRnJvbVRleHQodGV4dENvbnRlbnQsIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzKTtcbiAgICBjcmVhdGVkLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgIHJldHVybiBjcmVhdGVkO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVjb25jaWxlU2luZ2xlRWxlbWVudChyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIGVsZW1lbnQsIGxhbmVzKSB7XG4gICAgdmFyIGtleSA9IGVsZW1lbnQua2V5O1xuICAgIHZhciBjaGlsZCA9IGN1cnJlbnRGaXJzdENoaWxkO1xuXG4gICAgd2hpbGUgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICAvLyBUT0RPOiBJZiBrZXkgPT09IG51bGwgYW5kIGNoaWxkLmtleSA9PT0gbnVsbCwgdGhlbiB0aGlzIG9ubHkgYXBwbGllcyB0b1xuICAgICAgLy8gdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGxpc3QuXG4gICAgICBpZiAoY2hpbGQua2V5ID09PSBrZXkpIHtcbiAgICAgICAgdmFyIGVsZW1lbnRUeXBlID0gZWxlbWVudC50eXBlO1xuXG4gICAgICAgIGlmIChlbGVtZW50VHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSkge1xuICAgICAgICAgIGlmIChjaGlsZC50YWcgPT09IEZyYWdtZW50KSB7XG4gICAgICAgICAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY2hpbGQuc2libGluZyk7XG4gICAgICAgICAgICB2YXIgZXhpc3RpbmcgPSB1c2VGaWJlcihjaGlsZCwgZWxlbWVudC5wcm9wcy5jaGlsZHJlbik7XG4gICAgICAgICAgICBleGlzdGluZy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcblxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBleGlzdGluZy5fZGVidWdTb3VyY2UgPSBlbGVtZW50Ll9zb3VyY2U7XG4gICAgICAgICAgICAgIGV4aXN0aW5nLl9kZWJ1Z093bmVyID0gZWxlbWVudC5fb3duZXI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBleGlzdGluZztcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKGNoaWxkLmVsZW1lbnRUeXBlID09PSBlbGVtZW50VHlwZSB8fCAoIC8vIEtlZXAgdGhpcyBjaGVjayBpbmxpbmUgc28gaXQgb25seSBydW5zIG9uIHRoZSBmYWxzZSBwYXRoOlxuICAgICAgICAgICBpc0NvbXBhdGlibGVGYW1pbHlGb3JIb3RSZWxvYWRpbmcoY2hpbGQsIGVsZW1lbnQpICkgfHwgLy8gTGF6eSB0eXBlcyBzaG91bGQgcmVjb25jaWxlIHRoZWlyIHJlc29sdmVkIHR5cGUuXG4gICAgICAgICAgLy8gV2UgbmVlZCB0byBkbyB0aGlzIGFmdGVyIHRoZSBIb3QgUmVsb2FkaW5nIGNoZWNrIGFib3ZlLFxuICAgICAgICAgIC8vIGJlY2F1c2UgaG90IHJlbG9hZGluZyBoYXMgZGlmZmVyZW50IHNlbWFudGljcyB0aGFuIHByb2QgYmVjYXVzZVxuICAgICAgICAgIC8vIGl0IGRvZXNuJ3QgcmVzdXNwZW5kLiBTbyB3ZSBjYW4ndCBsZXQgdGhlIGNhbGwgYmVsb3cgc3VzcGVuZC5cbiAgICAgICAgICB0eXBlb2YgZWxlbWVudFR5cGUgPT09ICdvYmplY3QnICYmIGVsZW1lbnRUeXBlICE9PSBudWxsICYmIGVsZW1lbnRUeXBlLiQkdHlwZW9mID09PSBSRUFDVF9MQVpZX1RZUEUgJiYgcmVzb2x2ZUxhenkoZWxlbWVudFR5cGUpID09PSBjaGlsZC50eXBlKSB7XG4gICAgICAgICAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY2hpbGQuc2libGluZyk7XG5cbiAgICAgICAgICAgIHZhciBfZXhpc3RpbmcgPSB1c2VGaWJlcihjaGlsZCwgZWxlbWVudC5wcm9wcyk7XG5cbiAgICAgICAgICAgIF9leGlzdGluZy5yZWYgPSBjb2VyY2VSZWYocmV0dXJuRmliZXIsIGNoaWxkLCBlbGVtZW50KTtcbiAgICAgICAgICAgIF9leGlzdGluZy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcblxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBfZXhpc3RpbmcuX2RlYnVnU291cmNlID0gZWxlbWVudC5fc291cmNlO1xuICAgICAgICAgICAgICBfZXhpc3RpbmcuX2RlYnVnT3duZXIgPSBlbGVtZW50Ll9vd25lcjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIF9leGlzdGluZztcbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gRGlkbid0IG1hdGNoLlxuXG5cbiAgICAgICAgZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIGNoaWxkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGVDaGlsZChyZXR1cm5GaWJlciwgY2hpbGQpO1xuICAgICAgfVxuXG4gICAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gICAgfVxuXG4gICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSkge1xuICAgICAgdmFyIGNyZWF0ZWQgPSBjcmVhdGVGaWJlckZyb21GcmFnbWVudChlbGVtZW50LnByb3BzLmNoaWxkcmVuLCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcywgZWxlbWVudC5rZXkpO1xuICAgICAgY3JlYXRlZC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBjcmVhdGVkO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgX2NyZWF0ZWQ0ID0gY3JlYXRlRmliZXJGcm9tRWxlbWVudChlbGVtZW50LCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcyk7XG5cbiAgICAgIF9jcmVhdGVkNC5yZWYgPSBjb2VyY2VSZWYocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBlbGVtZW50KTtcbiAgICAgIF9jcmVhdGVkNC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBfY3JlYXRlZDQ7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVjb25jaWxlU2luZ2xlUG9ydGFsKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgcG9ydGFsLCBsYW5lcykge1xuICAgIHZhciBrZXkgPSBwb3J0YWwua2V5O1xuICAgIHZhciBjaGlsZCA9IGN1cnJlbnRGaXJzdENoaWxkO1xuXG4gICAgd2hpbGUgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICAvLyBUT0RPOiBJZiBrZXkgPT09IG51bGwgYW5kIGNoaWxkLmtleSA9PT0gbnVsbCwgdGhlbiB0aGlzIG9ubHkgYXBwbGllcyB0b1xuICAgICAgLy8gdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGxpc3QuXG4gICAgICBpZiAoY2hpbGQua2V5ID09PSBrZXkpIHtcbiAgICAgICAgaWYgKGNoaWxkLnRhZyA9PT0gSG9zdFBvcnRhbCAmJiBjaGlsZC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyA9PT0gcG9ydGFsLmNvbnRhaW5lckluZm8gJiYgY2hpbGQuc3RhdGVOb2RlLmltcGxlbWVudGF0aW9uID09PSBwb3J0YWwuaW1wbGVtZW50YXRpb24pIHtcbiAgICAgICAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY2hpbGQuc2libGluZyk7XG4gICAgICAgICAgdmFyIGV4aXN0aW5nID0gdXNlRmliZXIoY2hpbGQsIHBvcnRhbC5jaGlsZHJlbiB8fCBbXSk7XG4gICAgICAgICAgZXhpc3RpbmcucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICAgICAgcmV0dXJuIGV4aXN0aW5nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjaGlsZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBjaGlsZCk7XG4gICAgICB9XG5cbiAgICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgICB9XG5cbiAgICB2YXIgY3JlYXRlZCA9IGNyZWF0ZUZpYmVyRnJvbVBvcnRhbChwb3J0YWwsIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzKTtcbiAgICBjcmVhdGVkLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgIHJldHVybiBjcmVhdGVkO1xuICB9IC8vIFRoaXMgQVBJIHdpbGwgdGFnIHRoZSBjaGlsZHJlbiB3aXRoIHRoZSBzaWRlLWVmZmVjdCBvZiB0aGUgcmVjb25jaWxpYXRpb25cbiAgLy8gaXRzZWxmLiBUaGV5IHdpbGwgYmUgYWRkZWQgdG8gdGhlIHNpZGUtZWZmZWN0IGxpc3QgYXMgd2UgcGFzcyB0aHJvdWdoIHRoZVxuICAvLyBjaGlsZHJlbiBhbmQgdGhlIHBhcmVudC5cblxuXG4gIGZ1bmN0aW9uIHJlY29uY2lsZUNoaWxkRmliZXJzKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgbmV3Q2hpbGQsIGxhbmVzKSB7XG4gICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBub3QgcmVjdXJzaXZlLlxuICAgIC8vIElmIHRoZSB0b3AgbGV2ZWwgaXRlbSBpcyBhbiBhcnJheSwgd2UgdHJlYXQgaXQgYXMgYSBzZXQgb2YgY2hpbGRyZW4sXG4gICAgLy8gbm90IGFzIGEgZnJhZ21lbnQuIE5lc3RlZCBhcnJheXMgb24gdGhlIG90aGVyIGhhbmQgd2lsbCBiZSB0cmVhdGVkIGFzXG4gICAgLy8gZnJhZ21lbnQgbm9kZXMuIFJlY3Vyc2lvbiBoYXBwZW5zIGF0IHRoZSBub3JtYWwgZmxvdy5cbiAgICAvLyBIYW5kbGUgdG9wIGxldmVsIHVua2V5ZWQgZnJhZ21lbnRzIGFzIGlmIHRoZXkgd2VyZSBhcnJheXMuXG4gICAgLy8gVGhpcyBsZWFkcyB0byBhbiBhbWJpZ3VpdHkgYmV0d2VlbiA8PntbLi4uXX08Lz4gYW5kIDw+Li4uPC8+LlxuICAgIC8vIFdlIHRyZWF0IHRoZSBhbWJpZ3VvdXMgY2FzZXMgYWJvdmUgdGhlIHNhbWUuXG4gICAgdmFyIGlzVW5rZXllZFRvcExldmVsRnJhZ21lbnQgPSB0eXBlb2YgbmV3Q2hpbGQgPT09ICdvYmplY3QnICYmIG5ld0NoaWxkICE9PSBudWxsICYmIG5ld0NoaWxkLnR5cGUgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEUgJiYgbmV3Q2hpbGQua2V5ID09PSBudWxsO1xuXG4gICAgaWYgKGlzVW5rZXllZFRvcExldmVsRnJhZ21lbnQpIHtcbiAgICAgIG5ld0NoaWxkID0gbmV3Q2hpbGQucHJvcHMuY2hpbGRyZW47XG4gICAgfSAvLyBIYW5kbGUgb2JqZWN0IHR5cGVzXG5cblxuICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdvYmplY3QnICYmIG5ld0NoaWxkICE9PSBudWxsKSB7XG4gICAgICBzd2l0Y2ggKG5ld0NoaWxkLiQkdHlwZW9mKSB7XG4gICAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICAgIHJldHVybiBwbGFjZVNpbmdsZUNoaWxkKHJlY29uY2lsZVNpbmdsZUVsZW1lbnQocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBuZXdDaGlsZCwgbGFuZXMpKTtcblxuICAgICAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgICAgIHJldHVybiBwbGFjZVNpbmdsZUNoaWxkKHJlY29uY2lsZVNpbmdsZVBvcnRhbChyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIG5ld0NoaWxkLCBsYW5lcykpO1xuXG4gICAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICAgIHZhciBwYXlsb2FkID0gbmV3Q2hpbGQuX3BheWxvYWQ7XG4gICAgICAgICAgdmFyIGluaXQgPSBuZXdDaGlsZC5faW5pdDsgLy8gVE9ETzogVGhpcyBmdW5jdGlvbiBpcyBzdXBwb3NlZCB0byBiZSBub24tcmVjdXJzaXZlLlxuXG4gICAgICAgICAgcmV0dXJuIHJlY29uY2lsZUNoaWxkRmliZXJzKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgaW5pdChwYXlsb2FkKSwgbGFuZXMpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNBcnJheShuZXdDaGlsZCkpIHtcbiAgICAgICAgcmV0dXJuIHJlY29uY2lsZUNoaWxkcmVuQXJyYXkocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBuZXdDaGlsZCwgbGFuZXMpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZ2V0SXRlcmF0b3JGbihuZXdDaGlsZCkpIHtcbiAgICAgICAgcmV0dXJuIHJlY29uY2lsZUNoaWxkcmVuSXRlcmF0b3IocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBuZXdDaGlsZCwgbGFuZXMpO1xuICAgICAgfVxuXG4gICAgICB0aHJvd09uSW52YWxpZE9iamVjdFR5cGUocmV0dXJuRmliZXIsIG5ld0NoaWxkKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnc3RyaW5nJyAmJiBuZXdDaGlsZCAhPT0gJycgfHwgdHlwZW9mIG5ld0NoaWxkID09PSAnbnVtYmVyJykge1xuICAgICAgcmV0dXJuIHBsYWNlU2luZ2xlQ2hpbGQocmVjb25jaWxlU2luZ2xlVGV4dE5vZGUocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCAnJyArIG5ld0NoaWxkLCBsYW5lcykpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgd2Fybk9uRnVuY3Rpb25UeXBlKHJldHVybkZpYmVyKTtcbiAgICAgIH1cbiAgICB9IC8vIFJlbWFpbmluZyBjYXNlcyBhcmUgYWxsIHRyZWF0ZWQgYXMgZW1wdHkuXG5cblxuICAgIHJldHVybiBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQpO1xuICB9XG5cbiAgcmV0dXJuIHJlY29uY2lsZUNoaWxkRmliZXJzO1xufVxuXG52YXIgcmVjb25jaWxlQ2hpbGRGaWJlcnMgPSBDaGlsZFJlY29uY2lsZXIodHJ1ZSk7XG52YXIgbW91bnRDaGlsZEZpYmVycyA9IENoaWxkUmVjb25jaWxlcihmYWxzZSk7XG5mdW5jdGlvbiBjbG9uZUNoaWxkRmliZXJzKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKSB7XG4gIGlmIChjdXJyZW50ICE9PSBudWxsICYmIHdvcmtJblByb2dyZXNzLmNoaWxkICE9PSBjdXJyZW50LmNoaWxkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdSZXN1bWluZyB3b3JrIG5vdCB5ZXQgaW1wbGVtZW50ZWQuJyk7XG4gIH1cblxuICBpZiAod29ya0luUHJvZ3Jlc3MuY2hpbGQgPT09IG51bGwpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgY3VycmVudENoaWxkID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gIHZhciBuZXdDaGlsZCA9IGNyZWF0ZVdvcmtJblByb2dyZXNzKGN1cnJlbnRDaGlsZCwgY3VycmVudENoaWxkLnBlbmRpbmdQcm9wcyk7XG4gIHdvcmtJblByb2dyZXNzLmNoaWxkID0gbmV3Q2hpbGQ7XG4gIG5ld0NoaWxkLnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuXG4gIHdoaWxlIChjdXJyZW50Q2hpbGQuc2libGluZyAhPT0gbnVsbCkge1xuICAgIGN1cnJlbnRDaGlsZCA9IGN1cnJlbnRDaGlsZC5zaWJsaW5nO1xuICAgIG5ld0NoaWxkID0gbmV3Q2hpbGQuc2libGluZyA9IGNyZWF0ZVdvcmtJblByb2dyZXNzKGN1cnJlbnRDaGlsZCwgY3VycmVudENoaWxkLnBlbmRpbmdQcm9wcyk7XG4gICAgbmV3Q2hpbGQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gIH1cblxuICBuZXdDaGlsZC5zaWJsaW5nID0gbnVsbDtcbn0gLy8gUmVzZXQgYSB3b3JrSW5Qcm9ncmVzcyBjaGlsZCBzZXQgdG8gcHJlcGFyZSBpdCBmb3IgYSBzZWNvbmQgcGFzcy5cblxuZnVuY3Rpb24gcmVzZXRDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgbGFuZXMpIHtcbiAgdmFyIGNoaWxkID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG5cbiAgd2hpbGUgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgcmVzZXRXb3JrSW5Qcm9ncmVzcyhjaGlsZCwgbGFuZXMpO1xuICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgfVxufVxuXG52YXIgTk9fQ09OVEVYVCA9IHt9O1xudmFyIGNvbnRleHRTdGFja0N1cnNvciQxID0gY3JlYXRlQ3Vyc29yKE5PX0NPTlRFWFQpO1xudmFyIGNvbnRleHRGaWJlclN0YWNrQ3Vyc29yID0gY3JlYXRlQ3Vyc29yKE5PX0NPTlRFWFQpO1xudmFyIHJvb3RJbnN0YW5jZVN0YWNrQ3Vyc29yID0gY3JlYXRlQ3Vyc29yKE5PX0NPTlRFWFQpO1xuXG5mdW5jdGlvbiByZXF1aXJlZENvbnRleHQoYykge1xuICBpZiAoYyA9PT0gTk9fQ09OVEVYVCkge1xuICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgaG9zdCBjb250ZXh0IHRvIGV4aXN0LiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgJyArICdpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gIH1cblxuICByZXR1cm4gYztcbn1cblxuZnVuY3Rpb24gZ2V0Um9vdEhvc3RDb250YWluZXIoKSB7XG4gIHZhciByb290SW5zdGFuY2UgPSByZXF1aXJlZENvbnRleHQocm9vdEluc3RhbmNlU3RhY2tDdXJzb3IuY3VycmVudCk7XG4gIHJldHVybiByb290SW5zdGFuY2U7XG59XG5cbmZ1bmN0aW9uIHB1c2hIb3N0Q29udGFpbmVyKGZpYmVyLCBuZXh0Um9vdEluc3RhbmNlKSB7XG4gIC8vIFB1c2ggY3VycmVudCByb290IGluc3RhbmNlIG9udG8gdGhlIHN0YWNrO1xuICAvLyBUaGlzIGFsbG93cyB1cyB0byByZXNldCByb290IHdoZW4gcG9ydGFscyBhcmUgcG9wcGVkLlxuICBwdXNoKHJvb3RJbnN0YW5jZVN0YWNrQ3Vyc29yLCBuZXh0Um9vdEluc3RhbmNlLCBmaWJlcik7IC8vIFRyYWNrIHRoZSBjb250ZXh0IGFuZCB0aGUgRmliZXIgdGhhdCBwcm92aWRlZCBpdC5cbiAgLy8gVGhpcyBlbmFibGVzIHVzIHRvIHBvcCBvbmx5IEZpYmVycyB0aGF0IHByb3ZpZGUgdW5pcXVlIGNvbnRleHRzLlxuXG4gIHB1c2goY29udGV4dEZpYmVyU3RhY2tDdXJzb3IsIGZpYmVyLCBmaWJlcik7IC8vIEZpbmFsbHksIHdlIG5lZWQgdG8gcHVzaCB0aGUgaG9zdCBjb250ZXh0IHRvIHRoZSBzdGFjay5cbiAgLy8gSG93ZXZlciwgd2UgY2FuJ3QganVzdCBjYWxsIGdldFJvb3RIb3N0Q29udGV4dCgpIGFuZCBwdXNoIGl0IGJlY2F1c2VcbiAgLy8gd2UnZCBoYXZlIGEgZGlmZmVyZW50IG51bWJlciBvZiBlbnRyaWVzIG9uIHRoZSBzdGFjayBkZXBlbmRpbmcgb25cbiAgLy8gd2hldGhlciBnZXRSb290SG9zdENvbnRleHQoKSB0aHJvd3Mgc29tZXdoZXJlIGluIHJlbmRlcmVyIGNvZGUgb3Igbm90LlxuICAvLyBTbyB3ZSBwdXNoIGFuIGVtcHR5IHZhbHVlIGZpcnN0LiBUaGlzIGxldHMgdXMgc2FmZWx5IHVud2luZCBvbiBlcnJvcnMuXG5cbiAgcHVzaChjb250ZXh0U3RhY2tDdXJzb3IkMSwgTk9fQ09OVEVYVCwgZmliZXIpO1xuICB2YXIgbmV4dFJvb3RDb250ZXh0ID0gZ2V0Um9vdEhvc3RDb250ZXh0KG5leHRSb290SW5zdGFuY2UpOyAvLyBOb3cgdGhhdCB3ZSBrbm93IHRoaXMgZnVuY3Rpb24gZG9lc24ndCB0aHJvdywgcmVwbGFjZSBpdC5cblxuICBwb3AoY29udGV4dFN0YWNrQ3Vyc29yJDEsIGZpYmVyKTtcbiAgcHVzaChjb250ZXh0U3RhY2tDdXJzb3IkMSwgbmV4dFJvb3RDb250ZXh0LCBmaWJlcik7XG59XG5cbmZ1bmN0aW9uIHBvcEhvc3RDb250YWluZXIoZmliZXIpIHtcbiAgcG9wKGNvbnRleHRTdGFja0N1cnNvciQxLCBmaWJlcik7XG4gIHBvcChjb250ZXh0RmliZXJTdGFja0N1cnNvciwgZmliZXIpO1xuICBwb3Aocm9vdEluc3RhbmNlU3RhY2tDdXJzb3IsIGZpYmVyKTtcbn1cblxuZnVuY3Rpb24gZ2V0SG9zdENvbnRleHQoKSB7XG4gIHZhciBjb250ZXh0ID0gcmVxdWlyZWRDb250ZXh0KGNvbnRleHRTdGFja0N1cnNvciQxLmN1cnJlbnQpO1xuICByZXR1cm4gY29udGV4dDtcbn1cblxuZnVuY3Rpb24gcHVzaEhvc3RDb250ZXh0KGZpYmVyKSB7XG4gIHZhciByb290SW5zdGFuY2UgPSByZXF1aXJlZENvbnRleHQocm9vdEluc3RhbmNlU3RhY2tDdXJzb3IuY3VycmVudCk7XG4gIHZhciBjb250ZXh0ID0gcmVxdWlyZWRDb250ZXh0KGNvbnRleHRTdGFja0N1cnNvciQxLmN1cnJlbnQpO1xuICB2YXIgbmV4dENvbnRleHQgPSBnZXRDaGlsZEhvc3RDb250ZXh0KGNvbnRleHQsIGZpYmVyLnR5cGUsIHJvb3RJbnN0YW5jZSk7IC8vIERvbid0IHB1c2ggdGhpcyBGaWJlcidzIGNvbnRleHQgdW5sZXNzIGl0J3MgdW5pcXVlLlxuXG4gIGlmIChjb250ZXh0ID09PSBuZXh0Q29udGV4dCkge1xuICAgIHJldHVybjtcbiAgfSAvLyBUcmFjayB0aGUgY29udGV4dCBhbmQgdGhlIEZpYmVyIHRoYXQgcHJvdmlkZWQgaXQuXG4gIC8vIFRoaXMgZW5hYmxlcyB1cyB0byBwb3Agb25seSBGaWJlcnMgdGhhdCBwcm92aWRlIHVuaXF1ZSBjb250ZXh0cy5cblxuXG4gIHB1c2goY29udGV4dEZpYmVyU3RhY2tDdXJzb3IsIGZpYmVyLCBmaWJlcik7XG4gIHB1c2goY29udGV4dFN0YWNrQ3Vyc29yJDEsIG5leHRDb250ZXh0LCBmaWJlcik7XG59XG5cbmZ1bmN0aW9uIHBvcEhvc3RDb250ZXh0KGZpYmVyKSB7XG4gIC8vIERvIG5vdCBwb3AgdW5sZXNzIHRoaXMgRmliZXIgcHJvdmlkZWQgdGhlIGN1cnJlbnQgY29udGV4dC5cbiAgLy8gcHVzaEhvc3RDb250ZXh0KCkgb25seSBwdXNoZXMgRmliZXJzIHRoYXQgcHJvdmlkZSB1bmlxdWUgY29udGV4dHMuXG4gIGlmIChjb250ZXh0RmliZXJTdGFja0N1cnNvci5jdXJyZW50ICE9PSBmaWJlcikge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHBvcChjb250ZXh0U3RhY2tDdXJzb3IkMSwgZmliZXIpO1xuICBwb3AoY29udGV4dEZpYmVyU3RhY2tDdXJzb3IsIGZpYmVyKTtcbn1cblxudmFyIERlZmF1bHRTdXNwZW5zZUNvbnRleHQgPSAwOyAvLyBUaGUgU3VzcGVuc2UgQ29udGV4dCBpcyBzcGxpdCBpbnRvIHR3byBwYXJ0cy4gVGhlIGxvd2VyIGJpdHMgaXNcbi8vIGluaGVyaXRlZCBkZWVwbHkgZG93biB0aGUgc3VidHJlZS4gVGhlIHVwcGVyIGJpdHMgb25seSBhZmZlY3Rcbi8vIHRoaXMgaW1tZWRpYXRlIHN1c3BlbnNlIGJvdW5kYXJ5IGFuZCBnZXRzIHJlc2V0IGVhY2ggbmV3XG4vLyBib3VuZGFyeSBvciBzdXNwZW5zZSBsaXN0LlxuXG52YXIgU3VidHJlZVN1c3BlbnNlQ29udGV4dE1hc2sgPSAxOyAvLyBTdWJ0cmVlIEZsYWdzOlxuLy8gSW52aXNpYmxlUGFyZW50U3VzcGVuc2VDb250ZXh0IGluZGljYXRlcyB0aGF0IG9uZSBvZiBvdXIgcGFyZW50IFN1c3BlbnNlXG4vLyBib3VuZGFyaWVzIGlzIG5vdCBjdXJyZW50bHkgc2hvd2luZyB2aXNpYmxlIG1haW4gY29udGVudC5cbi8vIEVpdGhlciBiZWNhdXNlIGl0IGlzIGFscmVhZHkgc2hvd2luZyBhIGZhbGxiYWNrIG9yIGlzIG5vdCBtb3VudGVkIGF0IGFsbC5cbi8vIFdlIGNhbiB1c2UgdGhpcyB0byBkZXRlcm1pbmUgaWYgaXQgaXMgZGVzaXJhYmxlIHRvIHRyaWdnZXIgYSBmYWxsYmFjayBhdFxuLy8gdGhlIHBhcmVudC4gSWYgbm90LCB0aGVuIHdlIG1pZ2h0IG5lZWQgdG8gdHJpZ2dlciB1bmRlc2lyYWJsZSBib3VuZGFyaWVzXG4vLyBhbmQvb3Igc3VzcGVuZCB0aGUgY29tbWl0IHRvIGF2b2lkIGhpZGluZyB0aGUgcGFyZW50IGNvbnRlbnQuXG5cbnZhciBJbnZpc2libGVQYXJlbnRTdXNwZW5zZUNvbnRleHQgPSAxOyAvLyBTaGFsbG93IEZsYWdzOlxuLy8gRm9yY2VTdXNwZW5zZUZhbGxiYWNrIGNhbiBiZSB1c2VkIGJ5IFN1c3BlbnNlTGlzdCB0byBmb3JjZSBuZXdseSBhZGRlZFxuLy8gaXRlbXMgaW50byB0aGVpciBmYWxsYmFjayBzdGF0ZSBkdXJpbmcgb25lIG9mIHRoZSByZW5kZXIgcGFzc2VzLlxuXG52YXIgRm9yY2VTdXNwZW5zZUZhbGxiYWNrID0gMjtcbnZhciBzdXNwZW5zZVN0YWNrQ3Vyc29yID0gY3JlYXRlQ3Vyc29yKERlZmF1bHRTdXNwZW5zZUNvbnRleHQpO1xuZnVuY3Rpb24gaGFzU3VzcGVuc2VDb250ZXh0KHBhcmVudENvbnRleHQsIGZsYWcpIHtcbiAgcmV0dXJuIChwYXJlbnRDb250ZXh0ICYgZmxhZykgIT09IDA7XG59XG5mdW5jdGlvbiBzZXREZWZhdWx0U2hhbGxvd1N1c3BlbnNlQ29udGV4dChwYXJlbnRDb250ZXh0KSB7XG4gIHJldHVybiBwYXJlbnRDb250ZXh0ICYgU3VidHJlZVN1c3BlbnNlQ29udGV4dE1hc2s7XG59XG5mdW5jdGlvbiBzZXRTaGFsbG93U3VzcGVuc2VDb250ZXh0KHBhcmVudENvbnRleHQsIHNoYWxsb3dDb250ZXh0KSB7XG4gIHJldHVybiBwYXJlbnRDb250ZXh0ICYgU3VidHJlZVN1c3BlbnNlQ29udGV4dE1hc2sgfCBzaGFsbG93Q29udGV4dDtcbn1cbmZ1bmN0aW9uIGFkZFN1YnRyZWVTdXNwZW5zZUNvbnRleHQocGFyZW50Q29udGV4dCwgc3VidHJlZUNvbnRleHQpIHtcbiAgcmV0dXJuIHBhcmVudENvbnRleHQgfCBzdWJ0cmVlQ29udGV4dDtcbn1cbmZ1bmN0aW9uIHB1c2hTdXNwZW5zZUNvbnRleHQoZmliZXIsIG5ld0NvbnRleHQpIHtcbiAgcHVzaChzdXNwZW5zZVN0YWNrQ3Vyc29yLCBuZXdDb250ZXh0LCBmaWJlcik7XG59XG5mdW5jdGlvbiBwb3BTdXNwZW5zZUNvbnRleHQoZmliZXIpIHtcbiAgcG9wKHN1c3BlbnNlU3RhY2tDdXJzb3IsIGZpYmVyKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkQ2FwdHVyZVN1c3BlbnNlKHdvcmtJblByb2dyZXNzLCBoYXNJbnZpc2libGVQYXJlbnQpIHtcbiAgLy8gSWYgaXQgd2FzIHRoZSBwcmltYXJ5IGNoaWxkcmVuIHRoYXQganVzdCBzdXNwZW5kZWQsIGNhcHR1cmUgYW5kIHJlbmRlciB0aGVcbiAgLy8gZmFsbGJhY2suIE90aGVyd2lzZSwgZG9uJ3QgY2FwdHVyZSBhbmQgYnViYmxlIHRvIHRoZSBuZXh0IGJvdW5kYXJ5LlxuICB2YXIgbmV4dFN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcblxuICBpZiAobmV4dFN0YXRlICE9PSBudWxsKSB7XG4gICAgaWYgKG5leHRTdGF0ZS5kZWh5ZHJhdGVkICE9PSBudWxsKSB7XG4gICAgICAvLyBBIGRlaHlkcmF0ZWQgYm91bmRhcnkgYWx3YXlzIGNhcHR1cmVzLlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIHByb3BzID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wczsgLy8gUmVndWxhciBib3VuZGFyaWVzIGFsd2F5cyBjYXB0dXJlLlxuXG4gIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSAvLyBJZiBpdCdzIGEgYm91bmRhcnkgd2Ugc2hvdWxkIGF2b2lkLCB0aGVuIHdlIHByZWZlciB0byBidWJibGUgdXAgdG8gdGhlXG59XG5mdW5jdGlvbiBmaW5kRmlyc3RTdXNwZW5kZWQocm93KSB7XG4gIHZhciBub2RlID0gcm93O1xuXG4gIHdoaWxlIChub2RlICE9PSBudWxsKSB7XG4gICAgaWYgKG5vZGUudGFnID09PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgICAgdmFyIHN0YXRlID0gbm9kZS5tZW1vaXplZFN0YXRlO1xuXG4gICAgICBpZiAoc3RhdGUgIT09IG51bGwpIHtcbiAgICAgICAgdmFyIGRlaHlkcmF0ZWQgPSBzdGF0ZS5kZWh5ZHJhdGVkO1xuXG4gICAgICAgIGlmIChkZWh5ZHJhdGVkID09PSBudWxsIHx8IGlzU3VzcGVuc2VJbnN0YW5jZVBlbmRpbmcoZGVoeWRyYXRlZCkgfHwgaXNTdXNwZW5zZUluc3RhbmNlRmFsbGJhY2soZGVoeWRyYXRlZCkpIHtcbiAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobm9kZS50YWcgPT09IFN1c3BlbnNlTGlzdENvbXBvbmVudCAmJiAvLyByZXZlYWxPcmRlciB1bmRlZmluZWQgY2FuJ3QgYmUgdHJ1c3RlZCBiZWNhdXNlIGl0IGRvbid0XG4gICAgLy8ga2VlcCB0cmFjayBvZiB3aGV0aGVyIGl0IHN1c3BlbmRlZCBvciBub3QuXG4gICAgbm9kZS5tZW1vaXplZFByb3BzLnJldmVhbE9yZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhciBkaWRTdXNwZW5kID0gKG5vZGUuZmxhZ3MgJiBEaWRDYXB0dXJlKSAhPT0gTm9GbGFncztcblxuICAgICAgaWYgKGRpZFN1c3BlbmQpIHtcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChub2RlLmNoaWxkICE9PSBudWxsKSB7XG4gICAgICBub2RlLmNoaWxkLnJldHVybiA9IG5vZGU7XG4gICAgICBub2RlID0gbm9kZS5jaGlsZDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChub2RlID09PSByb3cpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHdoaWxlIChub2RlLnNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgIGlmIChub2RlLnJldHVybiA9PT0gbnVsbCB8fCBub2RlLnJldHVybiA9PT0gcm93KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgfVxuXG4gICAgbm9kZS5zaWJsaW5nLnJldHVybiA9IG5vZGUucmV0dXJuO1xuICAgIG5vZGUgPSBub2RlLnNpYmxpbmc7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxudmFyIE5vRmxhZ3MkMSA9XG4vKiAgICovXG4wOyAvLyBSZXByZXNlbnRzIHdoZXRoZXIgZWZmZWN0IHNob3VsZCBmaXJlLlxuXG52YXIgSGFzRWZmZWN0ID1cbi8qICovXG4xOyAvLyBSZXByZXNlbnRzIHRoZSBwaGFzZSBpbiB3aGljaCB0aGUgZWZmZWN0IChub3QgdGhlIGNsZWFuLXVwKSBmaXJlcy5cblxudmFyIEluc2VydGlvbiA9XG4vKiAgKi9cbjI7XG52YXIgTGF5b3V0ID1cbi8qICAgICovXG40O1xudmFyIFBhc3NpdmUkMSA9XG4vKiAgICovXG44O1xuXG4vLyBhbmQgc2hvdWxkIGJlIHJlc2V0IGJlZm9yZSBzdGFydGluZyBhIG5ldyByZW5kZXIuXG4vLyBUaGlzIHRyYWNrcyB3aGljaCBtdXRhYmxlIHNvdXJjZXMgbmVlZCB0byBiZSByZXNldCBhZnRlciBhIHJlbmRlci5cblxudmFyIHdvcmtJblByb2dyZXNzU291cmNlcyA9IFtdO1xuZnVuY3Rpb24gcmVzZXRXb3JrSW5Qcm9ncmVzc1ZlcnNpb25zKCkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHdvcmtJblByb2dyZXNzU291cmNlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBtdXRhYmxlU291cmNlID0gd29ya0luUHJvZ3Jlc3NTb3VyY2VzW2ldO1xuXG4gICAgaWYgKGlzUHJpbWFyeVJlbmRlcmVyKSB7XG4gICAgICBtdXRhYmxlU291cmNlLl93b3JrSW5Qcm9ncmVzc1ZlcnNpb25QcmltYXJ5ID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgbXV0YWJsZVNvdXJjZS5fd29ya0luUHJvZ3Jlc3NWZXJzaW9uU2Vjb25kYXJ5ID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICB3b3JrSW5Qcm9ncmVzc1NvdXJjZXMubGVuZ3RoID0gMDtcbn1cbi8vIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSB2ZXJzaW9uIHVzZWQgZm9yIHNlcnZlciByZW5kZXJpbmcgbWF0Y2hlcyB0aGUgb25lXG4vLyB0aGF0IGlzIGV2ZW50dWFsbHkgcmVhZCBkdXJpbmcgaHlkcmF0aW9uLlxuLy8gSWYgdGhleSBkb24ndCBtYXRjaCB0aGVyZSdzIGEgcG90ZW50aWFsIHRlYXIgYW5kIGEgZnVsbCBkZW9wdCByZW5kZXIgaXMgcmVxdWlyZWQuXG5cbmZ1bmN0aW9uIHJlZ2lzdGVyTXV0YWJsZVNvdXJjZUZvckh5ZHJhdGlvbihyb290LCBtdXRhYmxlU291cmNlKSB7XG4gIHZhciBnZXRWZXJzaW9uID0gbXV0YWJsZVNvdXJjZS5fZ2V0VmVyc2lvbjtcbiAgdmFyIHZlcnNpb24gPSBnZXRWZXJzaW9uKG11dGFibGVTb3VyY2UuX3NvdXJjZSk7IC8vIFRPRE8gQ2xlYXIgdGhpcyBkYXRhIG9uY2UgYWxsIHBlbmRpbmcgaHlkcmF0aW9uIHdvcmsgaXMgZmluaXNoZWQuXG4gIC8vIFJldGFpbmluZyBpdCBmb3JldmVyIG1heSBpbnRlcmZlcmUgd2l0aCBHQy5cblxuICBpZiAocm9vdC5tdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhID09IG51bGwpIHtcbiAgICByb290Lm11dGFibGVTb3VyY2VFYWdlckh5ZHJhdGlvbkRhdGEgPSBbbXV0YWJsZVNvdXJjZSwgdmVyc2lvbl07XG4gIH0gZWxzZSB7XG4gICAgcm9vdC5tdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhLnB1c2gobXV0YWJsZVNvdXJjZSwgdmVyc2lvbik7XG4gIH1cbn1cblxudmFyIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudERpc3BhdGNoZXIsXG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudEJhdGNoQ29uZmlnO1xudmFyIGRpZFdhcm5BYm91dE1pc21hdGNoZWRIb29rc0ZvckNvbXBvbmVudDtcbnZhciBkaWRXYXJuVW5jYWNoZWRHZXRTbmFwc2hvdDtcblxue1xuICBkaWRXYXJuQWJvdXRNaXNtYXRjaGVkSG9va3NGb3JDb21wb25lbnQgPSBuZXcgU2V0KCk7XG59XG5cbi8vIFRoZXNlIGFyZSBzZXQgcmlnaHQgYmVmb3JlIGNhbGxpbmcgdGhlIGNvbXBvbmVudC5cbnZhciByZW5kZXJMYW5lcyA9IE5vTGFuZXM7IC8vIFRoZSB3b3JrLWluLXByb2dyZXNzIGZpYmVyLiBJJ3ZlIG5hbWVkIGl0IGRpZmZlcmVudGx5IHRvIGRpc3Rpbmd1aXNoIGl0IGZyb21cbi8vIHRoZSB3b3JrLWluLXByb2dyZXNzIGhvb2suXG5cbnZhciBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxID0gbnVsbDsgLy8gSG9va3MgYXJlIHN0b3JlZCBhcyBhIGxpbmtlZCBsaXN0IG9uIHRoZSBmaWJlcidzIG1lbW9pemVkU3RhdGUgZmllbGQuIFRoZVxuLy8gY3VycmVudCBob29rIGxpc3QgaXMgdGhlIGxpc3QgdGhhdCBiZWxvbmdzIHRvIHRoZSBjdXJyZW50IGZpYmVyLiBUaGVcbi8vIHdvcmstaW4tcHJvZ3Jlc3MgaG9vayBsaXN0IGlzIGEgbmV3IGxpc3QgdGhhdCB3aWxsIGJlIGFkZGVkIHRvIHRoZVxuLy8gd29yay1pbi1wcm9ncmVzcyBmaWJlci5cblxudmFyIGN1cnJlbnRIb29rID0gbnVsbDtcbnZhciB3b3JrSW5Qcm9ncmVzc0hvb2sgPSBudWxsOyAvLyBXaGV0aGVyIGFuIHVwZGF0ZSB3YXMgc2NoZWR1bGVkIGF0IGFueSBwb2ludCBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZS4gVGhpc1xuLy8gZG9lcyBub3QgZ2V0IHJlc2V0IGlmIHdlIGRvIGFub3RoZXIgcmVuZGVyIHBhc3M7IG9ubHkgd2hlbiB3ZSdyZSBjb21wbGV0ZWx5XG4vLyBmaW5pc2hlZCBldmFsdWF0aW5nIHRoaXMgY29tcG9uZW50LiBUaGlzIGlzIGFuIG9wdGltaXphdGlvbiBzbyB3ZSBrbm93XG4vLyB3aGV0aGVyIHdlIG5lZWQgdG8gY2xlYXIgcmVuZGVyIHBoYXNlIHVwZGF0ZXMgYWZ0ZXIgYSB0aHJvdy5cblxudmFyIGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGUgPSBmYWxzZTsgLy8gV2hlcmUgYW4gdXBkYXRlIHdhcyBzY2hlZHVsZWQgb25seSBkdXJpbmcgdGhlIGN1cnJlbnQgcmVuZGVyIHBhc3MuIFRoaXNcbi8vIGdldHMgcmVzZXQgYWZ0ZXIgZWFjaCBhdHRlbXB0LlxuLy8gVE9ETzogTWF5YmUgdGhlcmUncyBzb21lIHdheSB0byBjb25zb2xpZGF0ZSB0aGlzIHdpdGhcbi8vIGBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlYC4gT3Igd2l0aCBgbnVtYmVyT2ZSZVJlbmRlcnNgLlxuXG52YXIgZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZUR1cmluZ1RoaXNQYXNzID0gZmFsc2U7IC8vIENvdW50cyB0aGUgbnVtYmVyIG9mIHVzZUlkIGhvb2tzIGluIHRoaXMgY29tcG9uZW50LlxuXG52YXIgbG9jYWxJZENvdW50ZXIgPSAwOyAvLyBVc2VkIGZvciBpZHMgdGhhdCBhcmUgZ2VuZXJhdGVkIGNvbXBsZXRlbHkgY2xpZW50LXNpZGUgKGkuZS4gbm90IGR1cmluZ1xuLy8gaHlkcmF0aW9uKS4gVGhpcyBjb3VudGVyIGlzIGdsb2JhbCwgc28gY2xpZW50IGlkcyBhcmUgbm90IHN0YWJsZSBhY3Jvc3Ncbi8vIHJlbmRlciBhdHRlbXB0cy5cblxudmFyIGdsb2JhbENsaWVudElkQ291bnRlciA9IDA7XG52YXIgUkVfUkVOREVSX0xJTUlUID0gMjU7IC8vIEluIERFViwgdGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgY3VycmVudGx5IGV4ZWN1dGluZyBwcmltaXRpdmUgaG9va1xuXG52YXIgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBudWxsOyAvLyBJbiBERVYsIHRoaXMgbGlzdCBlbnN1cmVzIHRoYXQgaG9va3MgYXJlIGNhbGxlZCBpbiB0aGUgc2FtZSBvcmRlciBiZXR3ZWVuIHJlbmRlcnMuXG4vLyBUaGUgbGlzdCBzdG9yZXMgdGhlIG9yZGVyIG9mIGhvb2tzIHVzZWQgZHVyaW5nIHRoZSBpbml0aWFsIHJlbmRlciAobW91bnQpLlxuLy8gU3Vic2VxdWVudCByZW5kZXJzICh1cGRhdGVzKSByZWZlcmVuY2UgdGhpcyBsaXN0LlxuXG52YXIgaG9va1R5cGVzRGV2ID0gbnVsbDtcbnZhciBob29rVHlwZXNVcGRhdGVJbmRleERldiA9IC0xOyAvLyBJbiBERVYsIHRoaXMgdHJhY2tzIHdoZXRoZXIgY3VycmVudGx5IHJlbmRlcmluZyBjb21wb25lbnQgbmVlZHMgdG8gaWdub3JlXG4vLyB0aGUgZGVwZW5kZW5jaWVzIGZvciBIb29rcyB0aGF0IG5lZWQgdGhlbSAoZS5nLiB1c2VFZmZlY3Qgb3IgdXNlTWVtbykuXG4vLyBXaGVuIHRydWUsIHN1Y2ggSG9va3Mgd2lsbCBhbHdheXMgYmUgXCJyZW1vdW50ZWRcIi4gT25seSB1c2VkIGR1cmluZyBob3QgcmVsb2FkLlxuXG52YXIgaWdub3JlUHJldmlvdXNEZXBlbmRlbmNpZXMgPSBmYWxzZTtcblxuZnVuY3Rpb24gbW91bnRIb29rVHlwZXNEZXYoKSB7XG4gIHtcbiAgICB2YXIgaG9va05hbWUgPSBjdXJyZW50SG9va05hbWVJbkRldjtcblxuICAgIGlmIChob29rVHlwZXNEZXYgPT09IG51bGwpIHtcbiAgICAgIGhvb2tUeXBlc0RldiA9IFtob29rTmFtZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGhvb2tUeXBlc0Rldi5wdXNoKGhvb2tOYW1lKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlSG9va1R5cGVzRGV2KCkge1xuICB7XG4gICAgdmFyIGhvb2tOYW1lID0gY3VycmVudEhvb2tOYW1lSW5EZXY7XG5cbiAgICBpZiAoaG9va1R5cGVzRGV2ICE9PSBudWxsKSB7XG4gICAgICBob29rVHlwZXNVcGRhdGVJbmRleERldisrO1xuXG4gICAgICBpZiAoaG9va1R5cGVzRGV2W2hvb2tUeXBlc1VwZGF0ZUluZGV4RGV2XSAhPT0gaG9va05hbWUpIHtcbiAgICAgICAgd2Fybk9uSG9va01pc21hdGNoSW5EZXYoaG9va05hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjaGVja0RlcHNBcmVBcnJheURldihkZXBzKSB7XG4gIHtcbiAgICBpZiAoZGVwcyAhPT0gdW5kZWZpbmVkICYmIGRlcHMgIT09IG51bGwgJiYgIWlzQXJyYXkoZGVwcykpIHtcbiAgICAgIC8vIFZlcmlmeSBkZXBzLCBidXQgb25seSBvbiBtb3VudCB0byBhdm9pZCBleHRyYSBjaGVja3MuXG4gICAgICAvLyBJdCdzIHVubGlrZWx5IHRoZWlyIHR5cGUgd291bGQgY2hhbmdlIGFzIHVzdWFsbHkgeW91IGRlZmluZSB0aGVtIGlubGluZS5cbiAgICAgIGVycm9yKCclcyByZWNlaXZlZCBhIGZpbmFsIGFyZ3VtZW50IHRoYXQgaXMgbm90IGFuIGFycmF5IChpbnN0ZWFkLCByZWNlaXZlZCBgJXNgKS4gV2hlbiAnICsgJ3NwZWNpZmllZCwgdGhlIGZpbmFsIGFyZ3VtZW50IG11c3QgYmUgYW4gYXJyYXkuJywgY3VycmVudEhvb2tOYW1lSW5EZXYsIHR5cGVvZiBkZXBzKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gd2Fybk9uSG9va01pc21hdGNoSW5EZXYoY3VycmVudEhvb2tOYW1lKSB7XG4gIHtcbiAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMSk7XG5cbiAgICBpZiAoIWRpZFdhcm5BYm91dE1pc21hdGNoZWRIb29rc0ZvckNvbXBvbmVudC5oYXMoY29tcG9uZW50TmFtZSkpIHtcbiAgICAgIGRpZFdhcm5BYm91dE1pc21hdGNoZWRIb29rc0ZvckNvbXBvbmVudC5hZGQoY29tcG9uZW50TmFtZSk7XG5cbiAgICAgIGlmIChob29rVHlwZXNEZXYgIT09IG51bGwpIHtcbiAgICAgICAgdmFyIHRhYmxlID0gJyc7XG4gICAgICAgIHZhciBzZWNvbmRDb2x1bW5TdGFydCA9IDMwO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDw9IGhvb2tUeXBlc1VwZGF0ZUluZGV4RGV2OyBpKyspIHtcbiAgICAgICAgICB2YXIgb2xkSG9va05hbWUgPSBob29rVHlwZXNEZXZbaV07XG4gICAgICAgICAgdmFyIG5ld0hvb2tOYW1lID0gaSA9PT0gaG9va1R5cGVzVXBkYXRlSW5kZXhEZXYgPyBjdXJyZW50SG9va05hbWUgOiBvbGRIb29rTmFtZTtcbiAgICAgICAgICB2YXIgcm93ID0gaSArIDEgKyBcIi4gXCIgKyBvbGRIb29rTmFtZTsgLy8gRXh0cmEgc3BhY2Ugc28gc2Vjb25kIGNvbHVtbiBsaW5lcyB1cFxuICAgICAgICAgIC8vIGxvbCBAIElFIG5vdCBzdXBwb3J0aW5nIFN0cmluZyNyZXBlYXRcblxuICAgICAgICAgIHdoaWxlIChyb3cubGVuZ3RoIDwgc2Vjb25kQ29sdW1uU3RhcnQpIHtcbiAgICAgICAgICAgIHJvdyArPSAnICc7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcm93ICs9IG5ld0hvb2tOYW1lICsgJ1xcbic7XG4gICAgICAgICAgdGFibGUgKz0gcm93O1xuICAgICAgICB9XG5cbiAgICAgICAgZXJyb3IoJ1JlYWN0IGhhcyBkZXRlY3RlZCBhIGNoYW5nZSBpbiB0aGUgb3JkZXIgb2YgSG9va3MgY2FsbGVkIGJ5ICVzLiAnICsgJ1RoaXMgd2lsbCBsZWFkIHRvIGJ1Z3MgYW5kIGVycm9ycyBpZiBub3QgZml4ZWQuICcgKyAnRm9yIG1vcmUgaW5mb3JtYXRpb24sIHJlYWQgdGhlIFJ1bGVzIG9mIEhvb2tzOiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvcnVsZXMtb2YtaG9va3NcXG5cXG4nICsgJyAgIFByZXZpb3VzIHJlbmRlciAgICAgICAgICAgIE5leHQgcmVuZGVyXFxuJyArICcgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG4nICsgJyVzJyArICcgICBeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cXG4nLCBjb21wb25lbnROYW1lLCB0YWJsZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHRocm93SW52YWxpZEhvb2tFcnJvcigpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGhvb2sgY2FsbC4gSG9va3MgY2FuIG9ubHkgYmUgY2FsbGVkIGluc2lkZSBvZiB0aGUgYm9keSBvZiBhIGZ1bmN0aW9uIGNvbXBvbmVudC4gVGhpcyBjb3VsZCBoYXBwZW4gZm9yJyArICcgb25lIG9mIHRoZSBmb2xsb3dpbmcgcmVhc29uczpcXG4nICsgJzEuIFlvdSBtaWdodCBoYXZlIG1pc21hdGNoaW5nIHZlcnNpb25zIG9mIFJlYWN0IGFuZCB0aGUgcmVuZGVyZXIgKHN1Y2ggYXMgUmVhY3QgRE9NKVxcbicgKyAnMi4gWW91IG1pZ2h0IGJlIGJyZWFraW5nIHRoZSBSdWxlcyBvZiBIb29rc1xcbicgKyAnMy4gWW91IG1pZ2h0IGhhdmUgbW9yZSB0aGFuIG9uZSBjb3B5IG9mIFJlYWN0IGluIHRoZSBzYW1lIGFwcFxcbicgKyAnU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9pbnZhbGlkLWhvb2stY2FsbCBmb3IgdGlwcyBhYm91dCBob3cgdG8gZGVidWcgYW5kIGZpeCB0aGlzIHByb2JsZW0uJyk7XG59XG5cbmZ1bmN0aW9uIGFyZUhvb2tJbnB1dHNFcXVhbChuZXh0RGVwcywgcHJldkRlcHMpIHtcbiAge1xuICAgIGlmIChpZ25vcmVQcmV2aW91c0RlcGVuZGVuY2llcykge1xuICAgICAgLy8gT25seSB0cnVlIHdoZW4gdGhpcyBjb21wb25lbnQgaXMgYmVpbmcgaG90IHJlbG9hZGVkLlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGlmIChwcmV2RGVwcyA9PT0gbnVsbCkge1xuICAgIHtcbiAgICAgIGVycm9yKCclcyByZWNlaXZlZCBhIGZpbmFsIGFyZ3VtZW50IGR1cmluZyB0aGlzIHJlbmRlciwgYnV0IG5vdCBkdXJpbmcgJyArICd0aGUgcHJldmlvdXMgcmVuZGVyLiBFdmVuIHRob3VnaCB0aGUgZmluYWwgYXJndW1lbnQgaXMgb3B0aW9uYWwsICcgKyAnaXRzIHR5cGUgY2Fubm90IGNoYW5nZSBiZXR3ZWVuIHJlbmRlcnMuJywgY3VycmVudEhvb2tOYW1lSW5EZXYpO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHtcbiAgICAvLyBEb24ndCBib3RoZXIgY29tcGFyaW5nIGxlbmd0aHMgaW4gcHJvZCBiZWNhdXNlIHRoZXNlIGFycmF5cyBzaG91bGQgYmVcbiAgICAvLyBwYXNzZWQgaW5saW5lLlxuICAgIGlmIChuZXh0RGVwcy5sZW5ndGggIT09IHByZXZEZXBzLmxlbmd0aCkge1xuICAgICAgZXJyb3IoJ1RoZSBmaW5hbCBhcmd1bWVudCBwYXNzZWQgdG8gJXMgY2hhbmdlZCBzaXplIGJldHdlZW4gcmVuZGVycy4gVGhlICcgKyAnb3JkZXIgYW5kIHNpemUgb2YgdGhpcyBhcnJheSBtdXN0IHJlbWFpbiBjb25zdGFudC5cXG5cXG4nICsgJ1ByZXZpb3VzOiAlc1xcbicgKyAnSW5jb21pbmc6ICVzJywgY3VycmVudEhvb2tOYW1lSW5EZXYsIFwiW1wiICsgcHJldkRlcHMuam9pbignLCAnKSArIFwiXVwiLCBcIltcIiArIG5leHREZXBzLmpvaW4oJywgJykgKyBcIl1cIik7XG4gICAgfVxuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcmV2RGVwcy5sZW5ndGggJiYgaSA8IG5leHREZXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKG9iamVjdElzKG5leHREZXBzW2ldLCBwcmV2RGVwc1tpXSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiByZW5kZXJXaXRoSG9va3MoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgcHJvcHMsIHNlY29uZEFyZywgbmV4dFJlbmRlckxhbmVzKSB7XG4gIHJlbmRlckxhbmVzID0gbmV4dFJlbmRlckxhbmVzO1xuICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxID0gd29ya0luUHJvZ3Jlc3M7XG5cbiAge1xuICAgIGhvb2tUeXBlc0RldiA9IGN1cnJlbnQgIT09IG51bGwgPyBjdXJyZW50Ll9kZWJ1Z0hvb2tUeXBlcyA6IG51bGw7XG4gICAgaG9va1R5cGVzVXBkYXRlSW5kZXhEZXYgPSAtMTsgLy8gVXNlZCBmb3IgaG90IHJlbG9hZGluZzpcblxuICAgIGlnbm9yZVByZXZpb3VzRGVwZW5kZW5jaWVzID0gY3VycmVudCAhPT0gbnVsbCAmJiBjdXJyZW50LnR5cGUgIT09IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gIH1cblxuICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBudWxsO1xuICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IE5vTGFuZXM7IC8vIFRoZSBmb2xsb3dpbmcgc2hvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIHJlc2V0XG4gIC8vIGN1cnJlbnRIb29rID0gbnVsbDtcbiAgLy8gd29ya0luUHJvZ3Jlc3NIb29rID0gbnVsbDtcbiAgLy8gZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZSA9IGZhbHNlO1xuICAvLyBsb2NhbElkQ291bnRlciA9IDA7XG4gIC8vIFRPRE8gV2FybiBpZiBubyBob29rcyBhcmUgdXNlZCBhdCBhbGwgZHVyaW5nIG1vdW50LCB0aGVuIHNvbWUgYXJlIHVzZWQgZHVyaW5nIHVwZGF0ZS5cbiAgLy8gQ3VycmVudGx5IHdlIHdpbGwgaWRlbnRpZnkgdGhlIHVwZGF0ZSByZW5kZXIgYXMgYSBtb3VudCBiZWNhdXNlIG1lbW9pemVkU3RhdGUgPT09IG51bGwuXG4gIC8vIFRoaXMgaXMgdHJpY2t5IGJlY2F1c2UgaXQncyB2YWxpZCBmb3IgY2VydGFpbiB0eXBlcyBvZiBjb21wb25lbnRzIChlLmcuIFJlYWN0LmxhenkpXG4gIC8vIFVzaW5nIG1lbW9pemVkU3RhdGUgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIG1vdW50L3VwZGF0ZSBvbmx5IHdvcmtzIGlmIGF0IGxlYXN0IG9uZSBzdGF0ZWZ1bCBob29rIGlzIHVzZWQuXG4gIC8vIE5vbi1zdGF0ZWZ1bCBob29rcyAoZS5nLiBjb250ZXh0KSBkb24ndCBnZXQgYWRkZWQgdG8gbWVtb2l6ZWRTdGF0ZSxcbiAgLy8gc28gbWVtb2l6ZWRTdGF0ZSB3b3VsZCBiZSBudWxsIGR1cmluZyB1cGRhdGVzIGFuZCBtb3VudHMuXG5cbiAge1xuICAgIGlmIChjdXJyZW50ICE9PSBudWxsICYmIGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuICAgIH0gZWxzZSBpZiAoaG9va1R5cGVzRGV2ICE9PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIGRpc3BhdGNoZXIgaGFuZGxlcyBhbiBlZGdlIGNhc2Ugd2hlcmUgYSBjb21wb25lbnQgaXMgdXBkYXRpbmcsXG4gICAgICAvLyBidXQgbm8gc3RhdGVmdWwgaG9va3MgaGF2ZSBiZWVuIHVzZWQuXG4gICAgICAvLyBXZSB3YW50IHRvIG1hdGNoIHRoZSBwcm9kdWN0aW9uIGNvZGUgYmVoYXZpb3IgKHdoaWNoIHdpbGwgdXNlIEhvb2tzRGlzcGF0Y2hlck9uTW91bnQpLFxuICAgICAgLy8gYnV0IHdpdGggdGhlIGV4dHJhIERFViB2YWxpZGF0aW9uIHRvIGVuc3VyZSBob29rcyBvcmRlcmluZyBoYXNuJ3QgY2hhbmdlZC5cbiAgICAgIC8vIFRoaXMgZGlzcGF0Y2hlciBkb2VzIHRoYXQuXG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEhvb2tzRGlzcGF0Y2hlck9uTW91bnRXaXRoSG9va1R5cGVzSW5ERVY7XG4gICAgfSBlbHNlIHtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuICAgIH1cbiAgfVxuXG4gIHZhciBjaGlsZHJlbiA9IENvbXBvbmVudChwcm9wcywgc2Vjb25kQXJnKTsgLy8gQ2hlY2sgaWYgdGhlcmUgd2FzIGEgcmVuZGVyIHBoYXNlIHVwZGF0ZVxuXG4gIGlmIChkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlRHVyaW5nVGhpc1Bhc3MpIHtcbiAgICAvLyBLZWVwIHJlbmRlcmluZyBpbiBhIGxvb3AgZm9yIGFzIGxvbmcgYXMgcmVuZGVyIHBoYXNlIHVwZGF0ZXMgY29udGludWUgdG9cbiAgICAvLyBiZSBzY2hlZHVsZWQuIFVzZSBhIGNvdW50ZXIgdG8gcHJldmVudCBpbmZpbml0ZSBsb29wcy5cbiAgICB2YXIgbnVtYmVyT2ZSZVJlbmRlcnMgPSAwO1xuXG4gICAgZG8ge1xuICAgICAgZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZUR1cmluZ1RoaXNQYXNzID0gZmFsc2U7XG4gICAgICBsb2NhbElkQ291bnRlciA9IDA7XG5cbiAgICAgIGlmIChudW1iZXJPZlJlUmVuZGVycyA+PSBSRV9SRU5ERVJfTElNSVQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUb28gbWFueSByZS1yZW5kZXJzLiBSZWFjdCBsaW1pdHMgdGhlIG51bWJlciBvZiByZW5kZXJzIHRvIHByZXZlbnQgJyArICdhbiBpbmZpbml0ZSBsb29wLicpO1xuICAgICAgfVxuXG4gICAgICBudW1iZXJPZlJlUmVuZGVycyArPSAxO1xuXG4gICAgICB7XG4gICAgICAgIC8vIEV2ZW4gd2hlbiBob3QgcmVsb2FkaW5nLCBhbGxvdyBkZXBlbmRlbmNpZXMgdG8gc3RhYmlsaXplXG4gICAgICAgIC8vIGFmdGVyIGZpcnN0IHJlbmRlciB0byBwcmV2ZW50IGluZmluaXRlIHJlbmRlciBwaGFzZSB1cGRhdGVzLlxuICAgICAgICBpZ25vcmVQcmV2aW91c0RlcGVuZGVuY2llcyA9IGZhbHNlO1xuICAgICAgfSAvLyBTdGFydCBvdmVyIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlzdFxuXG5cbiAgICAgIGN1cnJlbnRIb29rID0gbnVsbDtcbiAgICAgIHdvcmtJblByb2dyZXNzSG9vayA9IG51bGw7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IG51bGw7XG5cbiAgICAgIHtcbiAgICAgICAgLy8gQWxzbyB2YWxpZGF0ZSBob29rIG9yZGVyIGZvciBjYXNjYWRpbmcgdXBkYXRlcy5cbiAgICAgICAgaG9va1R5cGVzVXBkYXRlSW5kZXhEZXYgPSAtMTtcbiAgICAgIH1cblxuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSAgSG9va3NEaXNwYXRjaGVyT25SZXJlbmRlckluREVWIDtcbiAgICAgIGNoaWxkcmVuID0gQ29tcG9uZW50KHByb3BzLCBzZWNvbmRBcmcpO1xuICAgIH0gd2hpbGUgKGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGVEdXJpbmdUaGlzUGFzcyk7XG4gIH0gLy8gV2UgY2FuIGFzc3VtZSB0aGUgcHJldmlvdXMgZGlzcGF0Y2hlciBpcyBhbHdheXMgdGhpcyBvbmUsIHNpbmNlIHdlIHNldCBpdFxuICAvLyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSByZW5kZXIgcGhhc2UgYW5kIHRoZXJlJ3Mgbm8gcmUtZW50cmFuY2UuXG5cblxuICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IENvbnRleHRPbmx5RGlzcGF0Y2hlcjtcblxuICB7XG4gICAgd29ya0luUHJvZ3Jlc3MuX2RlYnVnSG9va1R5cGVzID0gaG9va1R5cGVzRGV2O1xuICB9IC8vIFRoaXMgY2hlY2sgdXNlcyBjdXJyZW50SG9vayBzbyB0aGF0IGl0IHdvcmtzIHRoZSBzYW1lIGluIERFViBhbmQgcHJvZCBidW5kbGVzLlxuICAvLyBob29rVHlwZXNEZXYgY291bGQgY2F0Y2ggbW9yZSBjYXNlcyAoZS5nLiBjb250ZXh0KSBidXQgb25seSBpbiBERVYgYnVuZGxlcy5cblxuXG4gIHZhciBkaWRSZW5kZXJUb29GZXdIb29rcyA9IGN1cnJlbnRIb29rICE9PSBudWxsICYmIGN1cnJlbnRIb29rLm5leHQgIT09IG51bGw7XG4gIHJlbmRlckxhbmVzID0gTm9MYW5lcztcbiAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMSA9IG51bGw7XG4gIGN1cnJlbnRIb29rID0gbnVsbDtcbiAgd29ya0luUHJvZ3Jlc3NIb29rID0gbnVsbDtcblxuICB7XG4gICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBudWxsO1xuICAgIGhvb2tUeXBlc0RldiA9IG51bGw7XG4gICAgaG9va1R5cGVzVXBkYXRlSW5kZXhEZXYgPSAtMTsgLy8gQ29uZmlybSB0aGF0IGEgc3RhdGljIGZsYWcgd2FzIG5vdCBhZGRlZCBvciByZW1vdmVkIHNpbmNlIHRoZSBsYXN0XG4gICAgLy8gcmVuZGVyLiBJZiB0aGlzIGZpcmVzLCBpdCBzdWdnZXN0cyB0aGF0IHdlIGluY29ycmVjdGx5IHJlc2V0IHRoZSBzdGF0aWNcbiAgICAvLyBmbGFncyBpbiBzb21lIG90aGVyIHBhcnQgb2YgdGhlIGNvZGViYXNlLiBUaGlzIGhhcyBoYXBwZW5lZCBiZWZvcmUsIGZvclxuICAgIC8vIGV4YW1wbGUsIGluIHRoZSBTdXNwZW5zZUxpc3QgaW1wbGVtZW50YXRpb24uXG5cbiAgICBpZiAoY3VycmVudCAhPT0gbnVsbCAmJiAoY3VycmVudC5mbGFncyAmIFN0YXRpY01hc2spICE9PSAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBTdGF0aWNNYXNrKSAmJiAvLyBEaXNhYmxlIHRoaXMgd2FybmluZyBpbiBsZWdhY3kgbW9kZSwgYmVjYXVzZSBsZWdhY3kgU3VzcGVuc2UgaXMgd2VpcmRcbiAgICAvLyBhbmQgY3JlYXRlcyBmYWxzZSBwb3NpdGl2ZXMuIFRvIG1ha2UgdGhpcyB3b3JrIGluIGxlZ2FjeSBtb2RlLCB3ZSdkXG4gICAgLy8gbmVlZCB0byBtYXJrIGZpYmVycyB0aGF0IGNvbW1pdCBpbiBhbiBpbmNvbXBsZXRlIHN0YXRlLCBzb21laG93LiBGb3JcbiAgICAvLyBub3cgSSdsbCBkaXNhYmxlIHRoZSB3YXJuaW5nIHRoYXQgbW9zdCBvZiB0aGUgYnVncyB0aGF0IHdvdWxkIHRyaWdnZXJcbiAgICAvLyBpdCBhcmUgZWl0aGVyIGV4Y2x1c2l2ZSB0byBjb25jdXJyZW50IG1vZGUgb3IgZXhpc3QgaW4gYm90aC5cbiAgICAoY3VycmVudC5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgIGVycm9yKCdJbnRlcm5hbCBSZWFjdCBlcnJvcjogRXhwZWN0ZWQgc3RhdGljIGZsYWcgd2FzIG1pc3NpbmcuIFBsZWFzZSAnICsgJ25vdGlmeSB0aGUgUmVhY3QgdGVhbS4nKTtcbiAgICB9XG4gIH1cblxuICBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlID0gZmFsc2U7IC8vIFRoaXMgaXMgcmVzZXQgYnkgY2hlY2tEaWRSZW5kZXJJZEhvb2tcbiAgLy8gbG9jYWxJZENvdW50ZXIgPSAwO1xuXG4gIGlmIChkaWRSZW5kZXJUb29GZXdIb29rcykge1xuICAgIHRocm93IG5ldyBFcnJvcignUmVuZGVyZWQgZmV3ZXIgaG9va3MgdGhhbiBleHBlY3RlZC4gVGhpcyBtYXkgYmUgY2F1c2VkIGJ5IGFuIGFjY2lkZW50YWwgJyArICdlYXJseSByZXR1cm4gc3RhdGVtZW50LicpO1xuICB9XG5cbiAgcmV0dXJuIGNoaWxkcmVuO1xufVxuZnVuY3Rpb24gY2hlY2tEaWRSZW5kZXJJZEhvb2soKSB7XG4gIC8vIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlciBldmVyeSByZW5kZXJXaXRoSG9va3MgY2FsbC5cbiAgLy8gQ29uY2VwdHVhbGx5LCBpdCdzIHBhcnQgb2YgdGhlIHJldHVybiB2YWx1ZSBvZiByZW5kZXJXaXRoSG9va3M7IGl0J3Mgb25seSBhXG4gIC8vIHNlcGFyYXRlIGZ1bmN0aW9uIHRvIGF2b2lkIHVzaW5nIGFuIGFycmF5IHR1cGxlLlxuICB2YXIgZGlkUmVuZGVySWRIb29rID0gbG9jYWxJZENvdW50ZXIgIT09IDA7XG4gIGxvY2FsSWRDb3VudGVyID0gMDtcbiAgcmV0dXJuIGRpZFJlbmRlcklkSG9vaztcbn1cbmZ1bmN0aW9uIGJhaWxvdXRIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbGFuZXMpIHtcbiAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBjdXJyZW50LnVwZGF0ZVF1ZXVlOyAvLyBUT0RPOiBEb24ndCBuZWVkIHRvIHJlc2V0IHRoZSBmbGFncyBoZXJlLCBiZWNhdXNlIHRoZXkncmUgcmVzZXQgaW4gdGhlXG4gIC8vIGNvbXBsZXRlIHBoYXNlIChidWJibGVQcm9wZXJ0aWVzKS5cblxuICBpZiAoICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0RWZmZWN0c01vZGUpICE9PSBOb01vZGUpIHtcbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyAmPSB+KE1vdW50UGFzc2l2ZURldiB8IE1vdW50TGF5b3V0RGV2IHwgUGFzc2l2ZSB8IFVwZGF0ZSk7XG4gIH0gZWxzZSB7XG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgJj0gfihQYXNzaXZlIHwgVXBkYXRlKTtcbiAgfVxuXG4gIGN1cnJlbnQubGFuZXMgPSByZW1vdmVMYW5lcyhjdXJyZW50LmxhbmVzLCBsYW5lcyk7XG59XG5mdW5jdGlvbiByZXNldEhvb2tzQWZ0ZXJUaHJvdygpIHtcbiAgLy8gV2UgY2FuIGFzc3VtZSB0aGUgcHJldmlvdXMgZGlzcGF0Y2hlciBpcyBhbHdheXMgdGhpcyBvbmUsIHNpbmNlIHdlIHNldCBpdFxuICAvLyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSByZW5kZXIgcGhhc2UgYW5kIHRoZXJlJ3Mgbm8gcmUtZW50cmFuY2UuXG4gIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gQ29udGV4dE9ubHlEaXNwYXRjaGVyO1xuXG4gIGlmIChkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlKSB7XG4gICAgLy8gVGhlcmUgd2VyZSByZW5kZXIgcGhhc2UgdXBkYXRlcy4gVGhlc2UgYXJlIG9ubHkgdmFsaWQgZm9yIHRoaXMgcmVuZGVyXG4gICAgLy8gcGhhc2UsIHdoaWNoIHdlIGFyZSBub3cgYWJvcnRpbmcuIFJlbW92ZSB0aGUgdXBkYXRlcyBmcm9tIHRoZSBxdWV1ZXMgc29cbiAgICAvLyB0aGV5IGRvIG5vdCBwZXJzaXN0IHRvIHRoZSBuZXh0IHJlbmRlci4gRG8gbm90IHJlbW92ZSB1cGRhdGVzIGZyb20gaG9va3NcbiAgICAvLyB0aGF0IHdlcmVuJ3QgcHJvY2Vzc2VkLlxuICAgIC8vXG4gICAgLy8gT25seSByZXNldCB0aGUgdXBkYXRlcyBmcm9tIHRoZSBxdWV1ZSBpZiBpdCBoYXMgYSBjbG9uZS4gSWYgaXQgZG9lc1xuICAgIC8vIG5vdCBoYXZlIGEgY2xvbmUsIHRoYXQgbWVhbnMgaXQgd2Fzbid0IHByb2Nlc3NlZCwgYW5kIHRoZSB1cGRhdGVzIHdlcmVcbiAgICAvLyBzY2hlZHVsZWQgYmVmb3JlIHdlIGVudGVyZWQgdGhlIHJlbmRlciBwaGFzZS5cbiAgICB2YXIgaG9vayA9IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEubWVtb2l6ZWRTdGF0ZTtcblxuICAgIHdoaWxlIChob29rICE9PSBudWxsKSB7XG4gICAgICB2YXIgcXVldWUgPSBob29rLnF1ZXVlO1xuXG4gICAgICBpZiAocXVldWUgIT09IG51bGwpIHtcbiAgICAgICAgcXVldWUucGVuZGluZyA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGhvb2sgPSBob29rLm5leHQ7XG4gICAgfVxuXG4gICAgZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZSA9IGZhbHNlO1xuICB9XG5cbiAgcmVuZGVyTGFuZXMgPSBOb0xhbmVzO1xuICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxID0gbnVsbDtcbiAgY3VycmVudEhvb2sgPSBudWxsO1xuICB3b3JrSW5Qcm9ncmVzc0hvb2sgPSBudWxsO1xuXG4gIHtcbiAgICBob29rVHlwZXNEZXYgPSBudWxsO1xuICAgIGhvb2tUeXBlc1VwZGF0ZUluZGV4RGV2ID0gLTE7XG4gICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBudWxsO1xuICAgIGlzVXBkYXRpbmdPcGFxdWVWYWx1ZUluUmVuZGVyUGhhc2UgPSBmYWxzZTtcbiAgfVxuXG4gIGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGVEdXJpbmdUaGlzUGFzcyA9IGZhbHNlO1xuICBsb2NhbElkQ291bnRlciA9IDA7XG59XG5cbmZ1bmN0aW9uIG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCkge1xuICB2YXIgaG9vayA9IHtcbiAgICBtZW1vaXplZFN0YXRlOiBudWxsLFxuICAgIGJhc2VTdGF0ZTogbnVsbCxcbiAgICBiYXNlUXVldWU6IG51bGwsXG4gICAgcXVldWU6IG51bGwsXG4gICAgbmV4dDogbnVsbFxuICB9O1xuXG4gIGlmICh3b3JrSW5Qcm9ncmVzc0hvb2sgPT09IG51bGwpIHtcbiAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCBob29rIGluIHRoZSBsaXN0XG4gICAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5tZW1vaXplZFN0YXRlID0gd29ya0luUHJvZ3Jlc3NIb29rID0gaG9vaztcbiAgfSBlbHNlIHtcbiAgICAvLyBBcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdFxuICAgIHdvcmtJblByb2dyZXNzSG9vayA9IHdvcmtJblByb2dyZXNzSG9vay5uZXh0ID0gaG9vaztcbiAgfVxuXG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzc0hvb2s7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpIHtcbiAgLy8gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJvdGggZm9yIHVwZGF0ZXMgYW5kIGZvciByZS1yZW5kZXJzIHRyaWdnZXJlZCBieSBhXG4gIC8vIHJlbmRlciBwaGFzZSB1cGRhdGUuIEl0IGFzc3VtZXMgdGhlcmUgaXMgZWl0aGVyIGEgY3VycmVudCBob29rIHdlIGNhblxuICAvLyBjbG9uZSwgb3IgYSB3b3JrLWluLXByb2dyZXNzIGhvb2sgZnJvbSBhIHByZXZpb3VzIHJlbmRlciBwYXNzIHRoYXQgd2UgY2FuXG4gIC8vIHVzZSBhcyBhIGJhc2UuIFdoZW4gd2UgcmVhY2ggdGhlIGVuZCBvZiB0aGUgYmFzZSBsaXN0LCB3ZSBtdXN0IHN3aXRjaCB0b1xuICAvLyB0aGUgZGlzcGF0Y2hlciB1c2VkIGZvciBtb3VudHMuXG4gIHZhciBuZXh0Q3VycmVudEhvb2s7XG5cbiAgaWYgKGN1cnJlbnRIb29rID09PSBudWxsKSB7XG4gICAgdmFyIGN1cnJlbnQgPSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLmFsdGVybmF0ZTtcblxuICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICBuZXh0Q3VycmVudEhvb2sgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5leHRDdXJyZW50SG9vayA9IG51bGw7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIG5leHRDdXJyZW50SG9vayA9IGN1cnJlbnRIb29rLm5leHQ7XG4gIH1cblxuICB2YXIgbmV4dFdvcmtJblByb2dyZXNzSG9vaztcblxuICBpZiAod29ya0luUHJvZ3Jlc3NIb29rID09PSBudWxsKSB7XG4gICAgbmV4dFdvcmtJblByb2dyZXNzSG9vayA9IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEubWVtb2l6ZWRTdGF0ZTtcbiAgfSBlbHNlIHtcbiAgICBuZXh0V29ya0luUHJvZ3Jlc3NIb29rID0gd29ya0luUHJvZ3Jlc3NIb29rLm5leHQ7XG4gIH1cblxuICBpZiAobmV4dFdvcmtJblByb2dyZXNzSG9vayAhPT0gbnVsbCkge1xuICAgIC8vIFRoZXJlJ3MgYWxyZWFkeSBhIHdvcmstaW4tcHJvZ3Jlc3MuIFJldXNlIGl0LlxuICAgIHdvcmtJblByb2dyZXNzSG9vayA9IG5leHRXb3JrSW5Qcm9ncmVzc0hvb2s7XG4gICAgbmV4dFdvcmtJblByb2dyZXNzSG9vayA9IHdvcmtJblByb2dyZXNzSG9vay5uZXh0O1xuICAgIGN1cnJlbnRIb29rID0gbmV4dEN1cnJlbnRIb29rO1xuICB9IGVsc2Uge1xuICAgIC8vIENsb25lIGZyb20gdGhlIGN1cnJlbnQgaG9vay5cbiAgICBpZiAobmV4dEN1cnJlbnRIb29rID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlbmRlcmVkIG1vcmUgaG9va3MgdGhhbiBkdXJpbmcgdGhlIHByZXZpb3VzIHJlbmRlci4nKTtcbiAgICB9XG5cbiAgICBjdXJyZW50SG9vayA9IG5leHRDdXJyZW50SG9vaztcbiAgICB2YXIgbmV3SG9vayA9IHtcbiAgICAgIG1lbW9pemVkU3RhdGU6IGN1cnJlbnRIb29rLm1lbW9pemVkU3RhdGUsXG4gICAgICBiYXNlU3RhdGU6IGN1cnJlbnRIb29rLmJhc2VTdGF0ZSxcbiAgICAgIGJhc2VRdWV1ZTogY3VycmVudEhvb2suYmFzZVF1ZXVlLFxuICAgICAgcXVldWU6IGN1cnJlbnRIb29rLnF1ZXVlLFxuICAgICAgbmV4dDogbnVsbFxuICAgIH07XG5cbiAgICBpZiAod29ya0luUHJvZ3Jlc3NIb29rID09PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCBob29rIGluIHRoZSBsaXN0LlxuICAgICAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5tZW1vaXplZFN0YXRlID0gd29ya0luUHJvZ3Jlc3NIb29rID0gbmV3SG9vaztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuXG4gICAgICB3b3JrSW5Qcm9ncmVzc0hvb2sgPSB3b3JrSW5Qcm9ncmVzc0hvb2submV4dCA9IG5ld0hvb2s7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzSG9vaztcbn1cblxuZnVuY3Rpb24gY3JlYXRlRnVuY3Rpb25Db21wb25lbnRVcGRhdGVRdWV1ZSgpIHtcbiAgcmV0dXJuIHtcbiAgICBsYXN0RWZmZWN0OiBudWxsLFxuICAgIHN0b3JlczogbnVsbFxuICB9O1xufVxuXG5mdW5jdGlvbiBiYXNpY1N0YXRlUmVkdWNlcihzdGF0ZSwgYWN0aW9uKSB7XG4gIC8vICRGbG93Rml4TWU6IEZsb3cgZG9lc24ndCBsaWtlIG1peGVkIHR5cGVzXG4gIHJldHVybiB0eXBlb2YgYWN0aW9uID09PSAnZnVuY3Rpb24nID8gYWN0aW9uKHN0YXRlKSA6IGFjdGlvbjtcbn1cblxuZnVuY3Rpb24gbW91bnRSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgaW5pdGlhbFN0YXRlO1xuXG4gIGlmIChpbml0ICE9PSB1bmRlZmluZWQpIHtcbiAgICBpbml0aWFsU3RhdGUgPSBpbml0KGluaXRpYWxBcmcpO1xuICB9IGVsc2Uge1xuICAgIGluaXRpYWxTdGF0ZSA9IGluaXRpYWxBcmc7XG4gIH1cblxuICBob29rLm1lbW9pemVkU3RhdGUgPSBob29rLmJhc2VTdGF0ZSA9IGluaXRpYWxTdGF0ZTtcbiAgdmFyIHF1ZXVlID0ge1xuICAgIHBlbmRpbmc6IG51bGwsXG4gICAgaW50ZXJsZWF2ZWQ6IG51bGwsXG4gICAgbGFuZXM6IE5vTGFuZXMsXG4gICAgZGlzcGF0Y2g6IG51bGwsXG4gICAgbGFzdFJlbmRlcmVkUmVkdWNlcjogcmVkdWNlcixcbiAgICBsYXN0UmVuZGVyZWRTdGF0ZTogaW5pdGlhbFN0YXRlXG4gIH07XG4gIGhvb2sucXVldWUgPSBxdWV1ZTtcbiAgdmFyIGRpc3BhdGNoID0gcXVldWUuZGlzcGF0Y2ggPSBkaXNwYXRjaFJlZHVjZXJBY3Rpb24uYmluZChudWxsLCBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLCBxdWV1ZSk7XG4gIHJldHVybiBbaG9vay5tZW1vaXplZFN0YXRlLCBkaXNwYXRjaF07XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgcXVldWUgPSBob29rLnF1ZXVlO1xuXG4gIGlmIChxdWV1ZSA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcignU2hvdWxkIGhhdmUgYSBxdWV1ZS4gVGhpcyBpcyBsaWtlbHkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICB9XG5cbiAgcXVldWUubGFzdFJlbmRlcmVkUmVkdWNlciA9IHJlZHVjZXI7XG4gIHZhciBjdXJyZW50ID0gY3VycmVudEhvb2s7IC8vIFRoZSBsYXN0IHJlYmFzZSB1cGRhdGUgdGhhdCBpcyBOT1QgcGFydCBvZiB0aGUgYmFzZSBzdGF0ZS5cblxuICB2YXIgYmFzZVF1ZXVlID0gY3VycmVudC5iYXNlUXVldWU7IC8vIFRoZSBsYXN0IHBlbmRpbmcgdXBkYXRlIHRoYXQgaGFzbid0IGJlZW4gcHJvY2Vzc2VkIHlldC5cblxuICB2YXIgcGVuZGluZ1F1ZXVlID0gcXVldWUucGVuZGluZztcblxuICBpZiAocGVuZGluZ1F1ZXVlICE9PSBudWxsKSB7XG4gICAgLy8gV2UgaGF2ZSBuZXcgdXBkYXRlcyB0aGF0IGhhdmVuJ3QgYmVlbiBwcm9jZXNzZWQgeWV0LlxuICAgIC8vIFdlJ2xsIGFkZCB0aGVtIHRvIHRoZSBiYXNlIHF1ZXVlLlxuICAgIGlmIChiYXNlUXVldWUgIT09IG51bGwpIHtcbiAgICAgIC8vIE1lcmdlIHRoZSBwZW5kaW5nIHF1ZXVlIGFuZCB0aGUgYmFzZSBxdWV1ZS5cbiAgICAgIHZhciBiYXNlRmlyc3QgPSBiYXNlUXVldWUubmV4dDtcbiAgICAgIHZhciBwZW5kaW5nRmlyc3QgPSBwZW5kaW5nUXVldWUubmV4dDtcbiAgICAgIGJhc2VRdWV1ZS5uZXh0ID0gcGVuZGluZ0ZpcnN0O1xuICAgICAgcGVuZGluZ1F1ZXVlLm5leHQgPSBiYXNlRmlyc3Q7XG4gICAgfVxuXG4gICAge1xuICAgICAgaWYgKGN1cnJlbnQuYmFzZVF1ZXVlICE9PSBiYXNlUXVldWUpIHtcbiAgICAgICAgLy8gSW50ZXJuYWwgaW52YXJpYW50IHRoYXQgc2hvdWxkIG5ldmVyIGhhcHBlbiwgYnV0IGZlYXNpYmx5IGNvdWxkIGluXG4gICAgICAgIC8vIHRoZSBmdXR1cmUgaWYgd2UgaW1wbGVtZW50IHJlc3VtaW5nLCBvciBzb21lIGZvcm0gb2YgdGhhdC5cbiAgICAgICAgZXJyb3IoJ0ludGVybmFsIGVycm9yOiBFeHBlY3RlZCB3b3JrLWluLXByb2dyZXNzIHF1ZXVlIHRvIGJlIGEgY2xvbmUuICcgKyAnVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjdXJyZW50LmJhc2VRdWV1ZSA9IGJhc2VRdWV1ZSA9IHBlbmRpbmdRdWV1ZTtcbiAgICBxdWV1ZS5wZW5kaW5nID0gbnVsbDtcbiAgfVxuXG4gIGlmIChiYXNlUXVldWUgIT09IG51bGwpIHtcbiAgICAvLyBXZSBoYXZlIGEgcXVldWUgdG8gcHJvY2Vzcy5cbiAgICB2YXIgZmlyc3QgPSBiYXNlUXVldWUubmV4dDtcbiAgICB2YXIgbmV3U3RhdGUgPSBjdXJyZW50LmJhc2VTdGF0ZTtcbiAgICB2YXIgbmV3QmFzZVN0YXRlID0gbnVsbDtcbiAgICB2YXIgbmV3QmFzZVF1ZXVlRmlyc3QgPSBudWxsO1xuICAgIHZhciBuZXdCYXNlUXVldWVMYXN0ID0gbnVsbDtcbiAgICB2YXIgdXBkYXRlID0gZmlyc3Q7XG5cbiAgICBkbyB7XG4gICAgICB2YXIgdXBkYXRlTGFuZSA9IHVwZGF0ZS5sYW5lO1xuXG4gICAgICBpZiAoIWlzU3Vic2V0T2ZMYW5lcyhyZW5kZXJMYW5lcywgdXBkYXRlTGFuZSkpIHtcbiAgICAgICAgLy8gUHJpb3JpdHkgaXMgaW5zdWZmaWNpZW50LiBTa2lwIHRoaXMgdXBkYXRlLiBJZiB0aGlzIGlzIHRoZSBmaXJzdFxuICAgICAgICAvLyBza2lwcGVkIHVwZGF0ZSwgdGhlIHByZXZpb3VzIHVwZGF0ZS9zdGF0ZSBpcyB0aGUgbmV3IGJhc2VcbiAgICAgICAgLy8gdXBkYXRlL3N0YXRlLlxuICAgICAgICB2YXIgY2xvbmUgPSB7XG4gICAgICAgICAgbGFuZTogdXBkYXRlTGFuZSxcbiAgICAgICAgICBhY3Rpb246IHVwZGF0ZS5hY3Rpb24sXG4gICAgICAgICAgaGFzRWFnZXJTdGF0ZTogdXBkYXRlLmhhc0VhZ2VyU3RhdGUsXG4gICAgICAgICAgZWFnZXJTdGF0ZTogdXBkYXRlLmVhZ2VyU3RhdGUsXG4gICAgICAgICAgbmV4dDogbnVsbFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChuZXdCYXNlUXVldWVMYXN0ID09PSBudWxsKSB7XG4gICAgICAgICAgbmV3QmFzZVF1ZXVlRmlyc3QgPSBuZXdCYXNlUXVldWVMYXN0ID0gY2xvbmU7XG4gICAgICAgICAgbmV3QmFzZVN0YXRlID0gbmV3U3RhdGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3QmFzZVF1ZXVlTGFzdCA9IG5ld0Jhc2VRdWV1ZUxhc3QubmV4dCA9IGNsb25lO1xuICAgICAgICB9IC8vIFVwZGF0ZSB0aGUgcmVtYWluaW5nIHByaW9yaXR5IGluIHRoZSBxdWV1ZS5cbiAgICAgICAgLy8gVE9ETzogRG9uJ3QgbmVlZCB0byBhY2N1bXVsYXRlIHRoaXMuIEluc3RlYWQsIHdlIGNhbiByZW1vdmVcbiAgICAgICAgLy8gcmVuZGVyTGFuZXMgZnJvbSB0aGUgb3JpZ2luYWwgbGFuZXMuXG5cblxuICAgICAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLmxhbmVzID0gbWVyZ2VMYW5lcyhjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLmxhbmVzLCB1cGRhdGVMYW5lKTtcbiAgICAgICAgbWFya1NraXBwZWRVcGRhdGVMYW5lcyh1cGRhdGVMYW5lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRoaXMgdXBkYXRlIGRvZXMgaGF2ZSBzdWZmaWNpZW50IHByaW9yaXR5LlxuICAgICAgICBpZiAobmV3QmFzZVF1ZXVlTGFzdCAhPT0gbnVsbCkge1xuICAgICAgICAgIHZhciBfY2xvbmUgPSB7XG4gICAgICAgICAgICAvLyBUaGlzIHVwZGF0ZSBpcyBnb2luZyB0byBiZSBjb21taXR0ZWQgc28gd2UgbmV2ZXIgd2FudCB1bmNvbW1pdFxuICAgICAgICAgICAgLy8gaXQuIFVzaW5nIE5vTGFuZSB3b3JrcyBiZWNhdXNlIDAgaXMgYSBzdWJzZXQgb2YgYWxsIGJpdG1hc2tzLCBzb1xuICAgICAgICAgICAgLy8gdGhpcyB3aWxsIG5ldmVyIGJlIHNraXBwZWQgYnkgdGhlIGNoZWNrIGFib3ZlLlxuICAgICAgICAgICAgbGFuZTogTm9MYW5lLFxuICAgICAgICAgICAgYWN0aW9uOiB1cGRhdGUuYWN0aW9uLFxuICAgICAgICAgICAgaGFzRWFnZXJTdGF0ZTogdXBkYXRlLmhhc0VhZ2VyU3RhdGUsXG4gICAgICAgICAgICBlYWdlclN0YXRlOiB1cGRhdGUuZWFnZXJTdGF0ZSxcbiAgICAgICAgICAgIG5leHQ6IG51bGxcbiAgICAgICAgICB9O1xuICAgICAgICAgIG5ld0Jhc2VRdWV1ZUxhc3QgPSBuZXdCYXNlUXVldWVMYXN0Lm5leHQgPSBfY2xvbmU7XG4gICAgICAgIH0gLy8gUHJvY2VzcyB0aGlzIHVwZGF0ZS5cblxuXG4gICAgICAgIGlmICh1cGRhdGUuaGFzRWFnZXJTdGF0ZSkge1xuICAgICAgICAgIC8vIElmIHRoaXMgdXBkYXRlIGlzIGEgc3RhdGUgdXBkYXRlIChub3QgYSByZWR1Y2VyKSBhbmQgd2FzIHByb2Nlc3NlZCBlYWdlcmx5LFxuICAgICAgICAgIC8vIHdlIGNhbiB1c2UgdGhlIGVhZ2VybHkgY29tcHV0ZWQgc3RhdGVcbiAgICAgICAgICBuZXdTdGF0ZSA9IHVwZGF0ZS5lYWdlclN0YXRlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBhY3Rpb24gPSB1cGRhdGUuYWN0aW9uO1xuICAgICAgICAgIG5ld1N0YXRlID0gcmVkdWNlcihuZXdTdGF0ZSwgYWN0aW9uKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB1cGRhdGUgPSB1cGRhdGUubmV4dDtcbiAgICB9IHdoaWxlICh1cGRhdGUgIT09IG51bGwgJiYgdXBkYXRlICE9PSBmaXJzdCk7XG5cbiAgICBpZiAobmV3QmFzZVF1ZXVlTGFzdCA9PT0gbnVsbCkge1xuICAgICAgbmV3QmFzZVN0YXRlID0gbmV3U3RhdGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld0Jhc2VRdWV1ZUxhc3QubmV4dCA9IG5ld0Jhc2VRdWV1ZUZpcnN0O1xuICAgIH0gLy8gTWFyayB0aGF0IHRoZSBmaWJlciBwZXJmb3JtZWQgd29yaywgYnV0IG9ubHkgaWYgdGhlIG5ldyBzdGF0ZSBpc1xuICAgIC8vIGRpZmZlcmVudCBmcm9tIHRoZSBjdXJyZW50IHN0YXRlLlxuXG5cbiAgICBpZiAoIW9iamVjdElzKG5ld1N0YXRlLCBob29rLm1lbW9pemVkU3RhdGUpKSB7XG4gICAgICBtYXJrV29ya0luUHJvZ3Jlc3NSZWNlaXZlZFVwZGF0ZSgpO1xuICAgIH1cblxuICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IG5ld1N0YXRlO1xuICAgIGhvb2suYmFzZVN0YXRlID0gbmV3QmFzZVN0YXRlO1xuICAgIGhvb2suYmFzZVF1ZXVlID0gbmV3QmFzZVF1ZXVlTGFzdDtcbiAgICBxdWV1ZS5sYXN0UmVuZGVyZWRTdGF0ZSA9IG5ld1N0YXRlO1xuICB9IC8vIEludGVybGVhdmVkIHVwZGF0ZXMgYXJlIHN0b3JlZCBvbiBhIHNlcGFyYXRlIHF1ZXVlLiBXZSBhcmVuJ3QgZ29pbmcgdG9cbiAgLy8gcHJvY2VzcyB0aGVtIGR1cmluZyB0aGlzIHJlbmRlciwgYnV0IHdlIGRvIG5lZWQgdG8gdHJhY2sgd2hpY2ggbGFuZXNcbiAgLy8gYXJlIHJlbWFpbmluZy5cblxuXG4gIHZhciBsYXN0SW50ZXJsZWF2ZWQgPSBxdWV1ZS5pbnRlcmxlYXZlZDtcblxuICBpZiAobGFzdEludGVybGVhdmVkICE9PSBudWxsKSB7XG4gICAgdmFyIGludGVybGVhdmVkID0gbGFzdEludGVybGVhdmVkO1xuXG4gICAgZG8ge1xuICAgICAgdmFyIGludGVybGVhdmVkTGFuZSA9IGludGVybGVhdmVkLmxhbmU7XG4gICAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLmxhbmVzID0gbWVyZ2VMYW5lcyhjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLmxhbmVzLCBpbnRlcmxlYXZlZExhbmUpO1xuICAgICAgbWFya1NraXBwZWRVcGRhdGVMYW5lcyhpbnRlcmxlYXZlZExhbmUpO1xuICAgICAgaW50ZXJsZWF2ZWQgPSBpbnRlcmxlYXZlZC5uZXh0O1xuICAgIH0gd2hpbGUgKGludGVybGVhdmVkICE9PSBsYXN0SW50ZXJsZWF2ZWQpO1xuICB9IGVsc2UgaWYgKGJhc2VRdWV1ZSA9PT0gbnVsbCkge1xuICAgIC8vIGBxdWV1ZS5sYW5lc2AgaXMgdXNlZCBmb3IgZW50YW5nbGluZyB0cmFuc2l0aW9ucy4gV2UgY2FuIHNldCBpdCBiYWNrIHRvXG4gICAgLy8gemVybyBvbmNlIHRoZSBxdWV1ZSBpcyBlbXB0eS5cbiAgICBxdWV1ZS5sYW5lcyA9IE5vTGFuZXM7XG4gIH1cblxuICB2YXIgZGlzcGF0Y2ggPSBxdWV1ZS5kaXNwYXRjaDtcbiAgcmV0dXJuIFtob29rLm1lbW9pemVkU3RhdGUsIGRpc3BhdGNoXTtcbn1cblxuZnVuY3Rpb24gcmVyZW5kZXJSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIHF1ZXVlID0gaG9vay5xdWV1ZTtcblxuICBpZiAocXVldWUgPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Nob3VsZCBoYXZlIGEgcXVldWUuIFRoaXMgaXMgbGlrZWx5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgfVxuXG4gIHF1ZXVlLmxhc3RSZW5kZXJlZFJlZHVjZXIgPSByZWR1Y2VyOyAvLyBUaGlzIGlzIGEgcmUtcmVuZGVyLiBBcHBseSB0aGUgbmV3IHJlbmRlciBwaGFzZSB1cGRhdGVzIHRvIHRoZSBwcmV2aW91c1xuICAvLyB3b3JrLWluLXByb2dyZXNzIGhvb2suXG5cbiAgdmFyIGRpc3BhdGNoID0gcXVldWUuZGlzcGF0Y2g7XG4gIHZhciBsYXN0UmVuZGVyUGhhc2VVcGRhdGUgPSBxdWV1ZS5wZW5kaW5nO1xuICB2YXIgbmV3U3RhdGUgPSBob29rLm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKGxhc3RSZW5kZXJQaGFzZVVwZGF0ZSAhPT0gbnVsbCkge1xuICAgIC8vIFRoZSBxdWV1ZSBkb2Vzbid0IHBlcnNpc3QgcGFzdCB0aGlzIHJlbmRlciBwYXNzLlxuICAgIHF1ZXVlLnBlbmRpbmcgPSBudWxsO1xuICAgIHZhciBmaXJzdFJlbmRlclBoYXNlVXBkYXRlID0gbGFzdFJlbmRlclBoYXNlVXBkYXRlLm5leHQ7XG4gICAgdmFyIHVwZGF0ZSA9IGZpcnN0UmVuZGVyUGhhc2VVcGRhdGU7XG5cbiAgICBkbyB7XG4gICAgICAvLyBQcm9jZXNzIHRoaXMgcmVuZGVyIHBoYXNlIHVwZGF0ZS4gV2UgZG9uJ3QgaGF2ZSB0byBjaGVjayB0aGVcbiAgICAgIC8vIHByaW9yaXR5IGJlY2F1c2UgaXQgd2lsbCBhbHdheXMgYmUgdGhlIHNhbWUgYXMgdGhlIGN1cnJlbnRcbiAgICAgIC8vIHJlbmRlcidzLlxuICAgICAgdmFyIGFjdGlvbiA9IHVwZGF0ZS5hY3Rpb247XG4gICAgICBuZXdTdGF0ZSA9IHJlZHVjZXIobmV3U3RhdGUsIGFjdGlvbik7XG4gICAgICB1cGRhdGUgPSB1cGRhdGUubmV4dDtcbiAgICB9IHdoaWxlICh1cGRhdGUgIT09IGZpcnN0UmVuZGVyUGhhc2VVcGRhdGUpOyAvLyBNYXJrIHRoYXQgdGhlIGZpYmVyIHBlcmZvcm1lZCB3b3JrLCBidXQgb25seSBpZiB0aGUgbmV3IHN0YXRlIGlzXG4gICAgLy8gZGlmZmVyZW50IGZyb20gdGhlIGN1cnJlbnQgc3RhdGUuXG5cblxuICAgIGlmICghb2JqZWN0SXMobmV3U3RhdGUsIGhvb2subWVtb2l6ZWRTdGF0ZSkpIHtcbiAgICAgIG1hcmtXb3JrSW5Qcm9ncmVzc1JlY2VpdmVkVXBkYXRlKCk7XG4gICAgfVxuXG4gICAgaG9vay5tZW1vaXplZFN0YXRlID0gbmV3U3RhdGU7IC8vIERvbid0IHBlcnNpc3QgdGhlIHN0YXRlIGFjY3VtdWxhdGVkIGZyb20gdGhlIHJlbmRlciBwaGFzZSB1cGRhdGVzIHRvXG4gICAgLy8gdGhlIGJhc2Ugc3RhdGUgdW5sZXNzIHRoZSBxdWV1ZSBpcyBlbXB0eS5cbiAgICAvLyBUT0RPOiBOb3Qgc3VyZSBpZiB0aGlzIGlzIHRoZSBkZXNpcmVkIHNlbWFudGljcywgYnV0IGl0J3Mgd2hhdCB3ZVxuICAgIC8vIGRvIGZvciBnRFNGUC4gSSBjYW4ndCByZW1lbWJlciB3aHkuXG5cbiAgICBpZiAoaG9vay5iYXNlUXVldWUgPT09IG51bGwpIHtcbiAgICAgIGhvb2suYmFzZVN0YXRlID0gbmV3U3RhdGU7XG4gICAgfVxuXG4gICAgcXVldWUubGFzdFJlbmRlcmVkU3RhdGUgPSBuZXdTdGF0ZTtcbiAgfVxuXG4gIHJldHVybiBbbmV3U3RhdGUsIGRpc3BhdGNoXTtcbn1cblxuZnVuY3Rpb24gbW91bnRNdXRhYmxlU291cmNlKHNvdXJjZSwgZ2V0U25hcHNob3QsIHN1YnNjcmliZSkge1xuICB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVNdXRhYmxlU291cmNlKHNvdXJjZSwgZ2V0U25hcHNob3QsIHN1YnNjcmliZSkge1xuICB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBtb3VudFN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KSB7XG4gIHZhciBmaWJlciA9IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDE7XG4gIHZhciBob29rID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIG5leHRTbmFwc2hvdDtcbiAgdmFyIGlzSHlkcmF0aW5nID0gZ2V0SXNIeWRyYXRpbmcoKTtcblxuICBpZiAoaXNIeWRyYXRpbmcpIHtcbiAgICBpZiAoZ2V0U2VydmVyU25hcHNob3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIGdldFNlcnZlclNuYXBzaG90LCB3aGljaCBpcyByZXF1aXJlZCBmb3IgJyArICdzZXJ2ZXItcmVuZGVyZWQgY29udGVudC4gV2lsbCByZXZlcnQgdG8gY2xpZW50IHJlbmRlcmluZy4nKTtcbiAgICB9XG5cbiAgICBuZXh0U25hcHNob3QgPSBnZXRTZXJ2ZXJTbmFwc2hvdCgpO1xuXG4gICAge1xuICAgICAgaWYgKCFkaWRXYXJuVW5jYWNoZWRHZXRTbmFwc2hvdCkge1xuICAgICAgICBpZiAobmV4dFNuYXBzaG90ICE9PSBnZXRTZXJ2ZXJTbmFwc2hvdCgpKSB7XG4gICAgICAgICAgZXJyb3IoJ1RoZSByZXN1bHQgb2YgZ2V0U2VydmVyU25hcHNob3Qgc2hvdWxkIGJlIGNhY2hlZCB0byBhdm9pZCBhbiBpbmZpbml0ZSBsb29wJyk7XG5cbiAgICAgICAgICBkaWRXYXJuVW5jYWNoZWRHZXRTbmFwc2hvdCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbmV4dFNuYXBzaG90ID0gZ2V0U25hcHNob3QoKTtcblxuICAgIHtcbiAgICAgIGlmICghZGlkV2FyblVuY2FjaGVkR2V0U25hcHNob3QpIHtcbiAgICAgICAgdmFyIGNhY2hlZFNuYXBzaG90ID0gZ2V0U25hcHNob3QoKTtcblxuICAgICAgICBpZiAoIW9iamVjdElzKG5leHRTbmFwc2hvdCwgY2FjaGVkU25hcHNob3QpKSB7XG4gICAgICAgICAgZXJyb3IoJ1RoZSByZXN1bHQgb2YgZ2V0U25hcHNob3Qgc2hvdWxkIGJlIGNhY2hlZCB0byBhdm9pZCBhbiBpbmZpbml0ZSBsb29wJyk7XG5cbiAgICAgICAgICBkaWRXYXJuVW5jYWNoZWRHZXRTbmFwc2hvdCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IC8vIFVubGVzcyB3ZSdyZSByZW5kZXJpbmcgYSBibG9ja2luZyBsYW5lLCBzY2hlZHVsZSBhIGNvbnNpc3RlbmN5IGNoZWNrLlxuICAgIC8vIFJpZ2h0IGJlZm9yZSBjb21taXR0aW5nLCB3ZSB3aWxsIHdhbGsgdGhlIHRyZWUgYW5kIGNoZWNrIGlmIGFueSBvZiB0aGVcbiAgICAvLyBzdG9yZXMgd2VyZSBtdXRhdGVkLlxuICAgIC8vXG4gICAgLy8gV2Ugd29uJ3QgZG8gdGhpcyBpZiB3ZSdyZSBoeWRyYXRpbmcgc2VydmVyLXJlbmRlcmVkIGNvbnRlbnQsIGJlY2F1c2UgaWZcbiAgICAvLyB0aGUgY29udGVudCBpcyBzdGFsZSwgaXQncyBhbHJlYWR5IHZpc2libGUgYW55d2F5LiBJbnN0ZWFkIHdlJ2xsIHBhdGNoXG4gICAgLy8gaXQgdXAgaW4gYSBwYXNzaXZlIGVmZmVjdC5cblxuXG4gICAgdmFyIHJvb3QgPSBnZXRXb3JrSW5Qcm9ncmVzc1Jvb3QoKTtcblxuICAgIGlmIChyb290ID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGEgd29yay1pbi1wcm9ncmVzcyByb290LiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG5cbiAgICBpZiAoIWluY2x1ZGVzQmxvY2tpbmdMYW5lKHJvb3QsIHJlbmRlckxhbmVzKSkge1xuICAgICAgcHVzaFN0b3JlQ29uc2lzdGVuY3lDaGVjayhmaWJlciwgZ2V0U25hcHNob3QsIG5leHRTbmFwc2hvdCk7XG4gICAgfVxuICB9IC8vIFJlYWQgdGhlIGN1cnJlbnQgc25hcHNob3QgZnJvbSB0aGUgc3RvcmUgb24gZXZlcnkgcmVuZGVyLiBUaGlzIGJyZWFrcyB0aGVcbiAgLy8gbm9ybWFsIHJ1bGVzIG9mIFJlYWN0LCBhbmQgb25seSB3b3JrcyBiZWNhdXNlIHN0b3JlIHVwZGF0ZXMgYXJlXG4gIC8vIGFsd2F5cyBzeW5jaHJvbm91cy5cblxuXG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IG5leHRTbmFwc2hvdDtcbiAgdmFyIGluc3QgPSB7XG4gICAgdmFsdWU6IG5leHRTbmFwc2hvdCxcbiAgICBnZXRTbmFwc2hvdDogZ2V0U25hcHNob3RcbiAgfTtcbiAgaG9vay5xdWV1ZSA9IGluc3Q7IC8vIFNjaGVkdWxlIGFuIGVmZmVjdCB0byBzdWJzY3JpYmUgdG8gdGhlIHN0b3JlLlxuXG4gIG1vdW50RWZmZWN0KHN1YnNjcmliZVRvU3RvcmUuYmluZChudWxsLCBmaWJlciwgaW5zdCwgc3Vic2NyaWJlKSwgW3N1YnNjcmliZV0pOyAvLyBTY2hlZHVsZSBhbiBlZmZlY3QgdG8gdXBkYXRlIHRoZSBtdXRhYmxlIGluc3RhbmNlIGZpZWxkcy4gV2Ugd2lsbCB1cGRhdGVcbiAgLy8gdGhpcyB3aGVuZXZlciBzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBvciB2YWx1ZSBjaGFuZ2VzLiBCZWNhdXNlIHRoZXJlJ3Mgbm9cbiAgLy8gY2xlYW4tdXAgZnVuY3Rpb24sIGFuZCB3ZSB0cmFjayB0aGUgZGVwcyBjb3JyZWN0bHksIHdlIGNhbiBjYWxsIHB1c2hFZmZlY3RcbiAgLy8gZGlyZWN0bHksIHdpdGhvdXQgc3RvcmluZyBhbnkgYWRkaXRpb25hbCBzdGF0ZS4gRm9yIHRoZSBzYW1lIHJlYXNvbiwgd2VcbiAgLy8gZG9uJ3QgbmVlZCB0byBzZXQgYSBzdGF0aWMgZmxhZywgZWl0aGVyLlxuICAvLyBUT0RPOiBXZSBjYW4gbW92ZSB0aGlzIHRvIHRoZSBwYXNzaXZlIHBoYXNlIG9uY2Ugd2UgYWRkIGEgcHJlLWNvbW1pdFxuICAvLyBjb25zaXN0ZW5jeSBjaGVjay4gU2VlIHRoZSBuZXh0IGNvbW1lbnQuXG5cbiAgZmliZXIuZmxhZ3MgfD0gUGFzc2l2ZTtcbiAgcHVzaEVmZmVjdChIYXNFZmZlY3QgfCBQYXNzaXZlJDEsIHVwZGF0ZVN0b3JlSW5zdGFuY2UuYmluZChudWxsLCBmaWJlciwgaW5zdCwgbmV4dFNuYXBzaG90LCBnZXRTbmFwc2hvdCksIHVuZGVmaW5lZCwgbnVsbCk7XG4gIHJldHVybiBuZXh0U25hcHNob3Q7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KSB7XG4gIHZhciBmaWJlciA9IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDE7XG4gIHZhciBob29rID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCk7IC8vIFJlYWQgdGhlIGN1cnJlbnQgc25hcHNob3QgZnJvbSB0aGUgc3RvcmUgb24gZXZlcnkgcmVuZGVyLiBUaGlzIGJyZWFrcyB0aGVcbiAgLy8gbm9ybWFsIHJ1bGVzIG9mIFJlYWN0LCBhbmQgb25seSB3b3JrcyBiZWNhdXNlIHN0b3JlIHVwZGF0ZXMgYXJlXG4gIC8vIGFsd2F5cyBzeW5jaHJvbm91cy5cblxuICB2YXIgbmV4dFNuYXBzaG90ID0gZ2V0U25hcHNob3QoKTtcblxuICB7XG4gICAgaWYgKCFkaWRXYXJuVW5jYWNoZWRHZXRTbmFwc2hvdCkge1xuICAgICAgdmFyIGNhY2hlZFNuYXBzaG90ID0gZ2V0U25hcHNob3QoKTtcblxuICAgICAgaWYgKCFvYmplY3RJcyhuZXh0U25hcHNob3QsIGNhY2hlZFNuYXBzaG90KSkge1xuICAgICAgICBlcnJvcignVGhlIHJlc3VsdCBvZiBnZXRTbmFwc2hvdCBzaG91bGQgYmUgY2FjaGVkIHRvIGF2b2lkIGFuIGluZmluaXRlIGxvb3AnKTtcblxuICAgICAgICBkaWRXYXJuVW5jYWNoZWRHZXRTbmFwc2hvdCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIHByZXZTbmFwc2hvdCA9IGhvb2subWVtb2l6ZWRTdGF0ZTtcbiAgdmFyIHNuYXBzaG90Q2hhbmdlZCA9ICFvYmplY3RJcyhwcmV2U25hcHNob3QsIG5leHRTbmFwc2hvdCk7XG5cbiAgaWYgKHNuYXBzaG90Q2hhbmdlZCkge1xuICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IG5leHRTbmFwc2hvdDtcbiAgICBtYXJrV29ya0luUHJvZ3Jlc3NSZWNlaXZlZFVwZGF0ZSgpO1xuICB9XG5cbiAgdmFyIGluc3QgPSBob29rLnF1ZXVlO1xuICB1cGRhdGVFZmZlY3Qoc3Vic2NyaWJlVG9TdG9yZS5iaW5kKG51bGwsIGZpYmVyLCBpbnN0LCBzdWJzY3JpYmUpLCBbc3Vic2NyaWJlXSk7IC8vIFdoZW5ldmVyIGdldFNuYXBzaG90IG9yIHN1YnNjcmliZSBjaGFuZ2VzLCB3ZSBuZWVkIHRvIGNoZWNrIGluIHRoZVxuICAvLyBjb21taXQgcGhhc2UgaWYgdGhlcmUgd2FzIGFuIGludGVybGVhdmVkIG11dGF0aW9uLiBJbiBjb25jdXJyZW50IG1vZGVcbiAgLy8gdGhpcyBjYW4gaGFwcGVuIGFsbCB0aGUgdGltZSwgYnV0IGV2ZW4gaW4gc3luY2hyb25vdXMgbW9kZSwgYW4gZWFybGllclxuICAvLyBlZmZlY3QgbWF5IGhhdmUgbXV0YXRlZCB0aGUgc3RvcmUuXG5cbiAgaWYgKGluc3QuZ2V0U25hcHNob3QgIT09IGdldFNuYXBzaG90IHx8IHNuYXBzaG90Q2hhbmdlZCB8fCAvLyBDaGVjayBpZiB0aGUgc3VzYmNyaWJlIGZ1bmN0aW9uIGNoYW5nZWQuIFdlIGNhbiBzYXZlIHNvbWUgbWVtb3J5IGJ5XG4gIC8vIGNoZWNraW5nIHdoZXRoZXIgd2Ugc2NoZWR1bGVkIGEgc3Vic2NyaXB0aW9uIGVmZmVjdCBhYm92ZS5cbiAgd29ya0luUHJvZ3Jlc3NIb29rICE9PSBudWxsICYmIHdvcmtJblByb2dyZXNzSG9vay5tZW1vaXplZFN0YXRlLnRhZyAmIEhhc0VmZmVjdCkge1xuICAgIGZpYmVyLmZsYWdzIHw9IFBhc3NpdmU7XG4gICAgcHVzaEVmZmVjdChIYXNFZmZlY3QgfCBQYXNzaXZlJDEsIHVwZGF0ZVN0b3JlSW5zdGFuY2UuYmluZChudWxsLCBmaWJlciwgaW5zdCwgbmV4dFNuYXBzaG90LCBnZXRTbmFwc2hvdCksIHVuZGVmaW5lZCwgbnVsbCk7IC8vIFVubGVzcyB3ZSdyZSByZW5kZXJpbmcgYSBibG9ja2luZyBsYW5lLCBzY2hlZHVsZSBhIGNvbnNpc3RlbmN5IGNoZWNrLlxuICAgIC8vIFJpZ2h0IGJlZm9yZSBjb21taXR0aW5nLCB3ZSB3aWxsIHdhbGsgdGhlIHRyZWUgYW5kIGNoZWNrIGlmIGFueSBvZiB0aGVcbiAgICAvLyBzdG9yZXMgd2VyZSBtdXRhdGVkLlxuXG4gICAgdmFyIHJvb3QgPSBnZXRXb3JrSW5Qcm9ncmVzc1Jvb3QoKTtcblxuICAgIGlmIChyb290ID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGEgd29yay1pbi1wcm9ncmVzcyByb290LiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG5cbiAgICBpZiAoIWluY2x1ZGVzQmxvY2tpbmdMYW5lKHJvb3QsIHJlbmRlckxhbmVzKSkge1xuICAgICAgcHVzaFN0b3JlQ29uc2lzdGVuY3lDaGVjayhmaWJlciwgZ2V0U25hcHNob3QsIG5leHRTbmFwc2hvdCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5leHRTbmFwc2hvdDtcbn1cblxuZnVuY3Rpb24gcHVzaFN0b3JlQ29uc2lzdGVuY3lDaGVjayhmaWJlciwgZ2V0U25hcHNob3QsIHJlbmRlcmVkU25hcHNob3QpIHtcbiAgZmliZXIuZmxhZ3MgfD0gU3RvcmVDb25zaXN0ZW5jeTtcbiAgdmFyIGNoZWNrID0ge1xuICAgIGdldFNuYXBzaG90OiBnZXRTbmFwc2hvdCxcbiAgICB2YWx1ZTogcmVuZGVyZWRTbmFwc2hvdFxuICB9O1xuICB2YXIgY29tcG9uZW50VXBkYXRlUXVldWUgPSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLnVwZGF0ZVF1ZXVlO1xuXG4gIGlmIChjb21wb25lbnRVcGRhdGVRdWV1ZSA9PT0gbnVsbCkge1xuICAgIGNvbXBvbmVudFVwZGF0ZVF1ZXVlID0gY3JlYXRlRnVuY3Rpb25Db21wb25lbnRVcGRhdGVRdWV1ZSgpO1xuICAgIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEudXBkYXRlUXVldWUgPSBjb21wb25lbnRVcGRhdGVRdWV1ZTtcbiAgICBjb21wb25lbnRVcGRhdGVRdWV1ZS5zdG9yZXMgPSBbY2hlY2tdO1xuICB9IGVsc2Uge1xuICAgIHZhciBzdG9yZXMgPSBjb21wb25lbnRVcGRhdGVRdWV1ZS5zdG9yZXM7XG5cbiAgICBpZiAoc3RvcmVzID09PSBudWxsKSB7XG4gICAgICBjb21wb25lbnRVcGRhdGVRdWV1ZS5zdG9yZXMgPSBbY2hlY2tdO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdG9yZXMucHVzaChjaGVjayk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVN0b3JlSW5zdGFuY2UoZmliZXIsIGluc3QsIG5leHRTbmFwc2hvdCwgZ2V0U25hcHNob3QpIHtcbiAgLy8gVGhlc2UgYXJlIHVwZGF0ZWQgaW4gdGhlIHBhc3NpdmUgcGhhc2VcbiAgaW5zdC52YWx1ZSA9IG5leHRTbmFwc2hvdDtcbiAgaW5zdC5nZXRTbmFwc2hvdCA9IGdldFNuYXBzaG90OyAvLyBTb21ldGhpbmcgbWF5IGhhdmUgYmVlbiBtdXRhdGVkIGluIGJldHdlZW4gcmVuZGVyIGFuZCBjb21taXQuIFRoaXMgY291bGRcbiAgLy8gaGF2ZSBiZWVuIGluIGFuIGV2ZW50IHRoYXQgZmlyZWQgYmVmb3JlIHRoZSBwYXNzaXZlIGVmZmVjdHMsIG9yIGl0IGNvdWxkXG4gIC8vIGhhdmUgYmVlbiBpbiBhIGxheW91dCBlZmZlY3QuIEluIHRoYXQgY2FzZSwgd2Ugd291bGQgaGF2ZSB1c2VkIHRoZSBvbGRcbiAgLy8gc25hcHNobyBhbmQgZ2V0U25hcHNob3QgdmFsdWVzIHRvIGJhaWwgb3V0LiBXZSBuZWVkIHRvIGNoZWNrIG9uZSBtb3JlIHRpbWUuXG5cbiAgaWYgKGNoZWNrSWZTbmFwc2hvdENoYW5nZWQoaW5zdCkpIHtcbiAgICAvLyBGb3JjZSBhIHJlLXJlbmRlci5cbiAgICBmb3JjZVN0b3JlUmVyZW5kZXIoZmliZXIpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHN1YnNjcmliZVRvU3RvcmUoZmliZXIsIGluc3QsIHN1YnNjcmliZSkge1xuICB2YXIgaGFuZGxlU3RvcmVDaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgLy8gVGhlIHN0b3JlIGNoYW5nZWQuIENoZWNrIGlmIHRoZSBzbmFwc2hvdCBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0IHRpbWUgd2VcbiAgICAvLyByZWFkIGZyb20gdGhlIHN0b3JlLlxuICAgIGlmIChjaGVja0lmU25hcHNob3RDaGFuZ2VkKGluc3QpKSB7XG4gICAgICAvLyBGb3JjZSBhIHJlLXJlbmRlci5cbiAgICAgIGZvcmNlU3RvcmVSZXJlbmRlcihmaWJlcik7XG4gICAgfVxuICB9OyAvLyBTdWJzY3JpYmUgdG8gdGhlIHN0b3JlIGFuZCByZXR1cm4gYSBjbGVhbi11cCBmdW5jdGlvbi5cblxuXG4gIHJldHVybiBzdWJzY3JpYmUoaGFuZGxlU3RvcmVDaGFuZ2UpO1xufVxuXG5mdW5jdGlvbiBjaGVja0lmU25hcHNob3RDaGFuZ2VkKGluc3QpIHtcbiAgdmFyIGxhdGVzdEdldFNuYXBzaG90ID0gaW5zdC5nZXRTbmFwc2hvdDtcbiAgdmFyIHByZXZWYWx1ZSA9IGluc3QudmFsdWU7XG5cbiAgdHJ5IHtcbiAgICB2YXIgbmV4dFZhbHVlID0gbGF0ZXN0R2V0U25hcHNob3QoKTtcbiAgICByZXR1cm4gIW9iamVjdElzKHByZXZWYWx1ZSwgbmV4dFZhbHVlKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmb3JjZVN0b3JlUmVyZW5kZXIoZmliZXIpIHtcbiAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoZmliZXIsIFN5bmNMYW5lKTtcblxuICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgU3luY0xhbmUsIE5vVGltZXN0YW1wKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtb3VudFN0YXRlKGluaXRpYWxTdGF0ZSkge1xuICB2YXIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG5cbiAgaWYgKHR5cGVvZiBpbml0aWFsU3RhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAvLyAkRmxvd0ZpeE1lOiBGbG93IGRvZXNuJ3QgbGlrZSBtaXhlZCB0eXBlc1xuICAgIGluaXRpYWxTdGF0ZSA9IGluaXRpYWxTdGF0ZSgpO1xuICB9XG5cbiAgaG9vay5tZW1vaXplZFN0YXRlID0gaG9vay5iYXNlU3RhdGUgPSBpbml0aWFsU3RhdGU7XG4gIHZhciBxdWV1ZSA9IHtcbiAgICBwZW5kaW5nOiBudWxsLFxuICAgIGludGVybGVhdmVkOiBudWxsLFxuICAgIGxhbmVzOiBOb0xhbmVzLFxuICAgIGRpc3BhdGNoOiBudWxsLFxuICAgIGxhc3RSZW5kZXJlZFJlZHVjZXI6IGJhc2ljU3RhdGVSZWR1Y2VyLFxuICAgIGxhc3RSZW5kZXJlZFN0YXRlOiBpbml0aWFsU3RhdGVcbiAgfTtcbiAgaG9vay5xdWV1ZSA9IHF1ZXVlO1xuICB2YXIgZGlzcGF0Y2ggPSBxdWV1ZS5kaXNwYXRjaCA9IGRpc3BhdGNoU2V0U3RhdGUuYmluZChudWxsLCBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLCBxdWV1ZSk7XG4gIHJldHVybiBbaG9vay5tZW1vaXplZFN0YXRlLCBkaXNwYXRjaF07XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVN0YXRlKGluaXRpYWxTdGF0ZSkge1xuICByZXR1cm4gdXBkYXRlUmVkdWNlcihiYXNpY1N0YXRlUmVkdWNlcik7XG59XG5cbmZ1bmN0aW9uIHJlcmVuZGVyU3RhdGUoaW5pdGlhbFN0YXRlKSB7XG4gIHJldHVybiByZXJlbmRlclJlZHVjZXIoYmFzaWNTdGF0ZVJlZHVjZXIpO1xufVxuXG5mdW5jdGlvbiBwdXNoRWZmZWN0KHRhZywgY3JlYXRlLCBkZXN0cm95LCBkZXBzKSB7XG4gIHZhciBlZmZlY3QgPSB7XG4gICAgdGFnOiB0YWcsXG4gICAgY3JlYXRlOiBjcmVhdGUsXG4gICAgZGVzdHJveTogZGVzdHJveSxcbiAgICBkZXBzOiBkZXBzLFxuICAgIC8vIENpcmN1bGFyXG4gICAgbmV4dDogbnVsbFxuICB9O1xuICB2YXIgY29tcG9uZW50VXBkYXRlUXVldWUgPSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLnVwZGF0ZVF1ZXVlO1xuXG4gIGlmIChjb21wb25lbnRVcGRhdGVRdWV1ZSA9PT0gbnVsbCkge1xuICAgIGNvbXBvbmVudFVwZGF0ZVF1ZXVlID0gY3JlYXRlRnVuY3Rpb25Db21wb25lbnRVcGRhdGVRdWV1ZSgpO1xuICAgIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEudXBkYXRlUXVldWUgPSBjb21wb25lbnRVcGRhdGVRdWV1ZTtcbiAgICBjb21wb25lbnRVcGRhdGVRdWV1ZS5sYXN0RWZmZWN0ID0gZWZmZWN0Lm5leHQgPSBlZmZlY3Q7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGxhc3RFZmZlY3QgPSBjb21wb25lbnRVcGRhdGVRdWV1ZS5sYXN0RWZmZWN0O1xuXG4gICAgaWYgKGxhc3RFZmZlY3QgPT09IG51bGwpIHtcbiAgICAgIGNvbXBvbmVudFVwZGF0ZVF1ZXVlLmxhc3RFZmZlY3QgPSBlZmZlY3QubmV4dCA9IGVmZmVjdDtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGZpcnN0RWZmZWN0ID0gbGFzdEVmZmVjdC5uZXh0O1xuICAgICAgbGFzdEVmZmVjdC5uZXh0ID0gZWZmZWN0O1xuICAgICAgZWZmZWN0Lm5leHQgPSBmaXJzdEVmZmVjdDtcbiAgICAgIGNvbXBvbmVudFVwZGF0ZVF1ZXVlLmxhc3RFZmZlY3QgPSBlZmZlY3Q7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGVmZmVjdDtcbn1cblxuZnVuY3Rpb24gbW91bnRSZWYoaW5pdGlhbFZhbHVlKSB7XG4gIHZhciBob29rID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTtcblxuICB7XG4gICAgdmFyIF9yZWYyID0ge1xuICAgICAgY3VycmVudDogaW5pdGlhbFZhbHVlXG4gICAgfTtcbiAgICBob29rLm1lbW9pemVkU3RhdGUgPSBfcmVmMjtcbiAgICByZXR1cm4gX3JlZjI7XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlUmVmKGluaXRpYWxWYWx1ZSkge1xuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICByZXR1cm4gaG9vay5tZW1vaXplZFN0YXRlO1xufVxuXG5mdW5jdGlvbiBtb3VudEVmZmVjdEltcGwoZmliZXJGbGFncywgaG9va0ZsYWdzLCBjcmVhdGUsIGRlcHMpIHtcbiAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgbmV4dERlcHMgPSBkZXBzID09PSB1bmRlZmluZWQgPyBudWxsIDogZGVwcztcbiAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5mbGFncyB8PSBmaWJlckZsYWdzO1xuICBob29rLm1lbW9pemVkU3RhdGUgPSBwdXNoRWZmZWN0KEhhc0VmZmVjdCB8IGhvb2tGbGFncywgY3JlYXRlLCB1bmRlZmluZWQsIG5leHREZXBzKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlRWZmZWN0SW1wbChmaWJlckZsYWdzLCBob29rRmxhZ3MsIGNyZWF0ZSwgZGVwcykge1xuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgbmV4dERlcHMgPSBkZXBzID09PSB1bmRlZmluZWQgPyBudWxsIDogZGVwcztcbiAgdmFyIGRlc3Ryb3kgPSB1bmRlZmluZWQ7XG5cbiAgaWYgKGN1cnJlbnRIb29rICE9PSBudWxsKSB7XG4gICAgdmFyIHByZXZFZmZlY3QgPSBjdXJyZW50SG9vay5tZW1vaXplZFN0YXRlO1xuICAgIGRlc3Ryb3kgPSBwcmV2RWZmZWN0LmRlc3Ryb3k7XG5cbiAgICBpZiAobmV4dERlcHMgIT09IG51bGwpIHtcbiAgICAgIHZhciBwcmV2RGVwcyA9IHByZXZFZmZlY3QuZGVwcztcblxuICAgICAgaWYgKGFyZUhvb2tJbnB1dHNFcXVhbChuZXh0RGVwcywgcHJldkRlcHMpKSB7XG4gICAgICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IHB1c2hFZmZlY3QoaG9va0ZsYWdzLCBjcmVhdGUsIGRlc3Ryb3ksIG5leHREZXBzKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEuZmxhZ3MgfD0gZmliZXJGbGFncztcbiAgaG9vay5tZW1vaXplZFN0YXRlID0gcHVzaEVmZmVjdChIYXNFZmZlY3QgfCBob29rRmxhZ3MsIGNyZWF0ZSwgZGVzdHJveSwgbmV4dERlcHMpO1xufVxuXG5mdW5jdGlvbiBtb3VudEVmZmVjdChjcmVhdGUsIGRlcHMpIHtcbiAgaWYgKCAoY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5tb2RlICYgU3RyaWN0RWZmZWN0c01vZGUpICE9PSBOb01vZGUpIHtcbiAgICByZXR1cm4gbW91bnRFZmZlY3RJbXBsKE1vdW50UGFzc2l2ZURldiB8IFBhc3NpdmUgfCBQYXNzaXZlU3RhdGljLCBQYXNzaXZlJDEsIGNyZWF0ZSwgZGVwcyk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG1vdW50RWZmZWN0SW1wbChQYXNzaXZlIHwgUGFzc2l2ZVN0YXRpYywgUGFzc2l2ZSQxLCBjcmVhdGUsIGRlcHMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUVmZmVjdChjcmVhdGUsIGRlcHMpIHtcbiAgcmV0dXJuIHVwZGF0ZUVmZmVjdEltcGwoUGFzc2l2ZSwgUGFzc2l2ZSQxLCBjcmVhdGUsIGRlcHMpO1xufVxuXG5mdW5jdGlvbiBtb3VudEluc2VydGlvbkVmZmVjdChjcmVhdGUsIGRlcHMpIHtcbiAgcmV0dXJuIG1vdW50RWZmZWN0SW1wbChVcGRhdGUsIEluc2VydGlvbiwgY3JlYXRlLCBkZXBzKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlSW5zZXJ0aW9uRWZmZWN0KGNyZWF0ZSwgZGVwcykge1xuICByZXR1cm4gdXBkYXRlRWZmZWN0SW1wbChVcGRhdGUsIEluc2VydGlvbiwgY3JlYXRlLCBkZXBzKTtcbn1cblxuZnVuY3Rpb24gbW91bnRMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKSB7XG4gIHZhciBmaWJlckZsYWdzID0gVXBkYXRlO1xuXG4gIHtcbiAgICBmaWJlckZsYWdzIHw9IExheW91dFN0YXRpYztcbiAgfVxuXG4gIGlmICggKGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEubW9kZSAmIFN0cmljdEVmZmVjdHNNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgZmliZXJGbGFncyB8PSBNb3VudExheW91dERldjtcbiAgfVxuXG4gIHJldHVybiBtb3VudEVmZmVjdEltcGwoZmliZXJGbGFncywgTGF5b3V0LCBjcmVhdGUsIGRlcHMpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKSB7XG4gIHJldHVybiB1cGRhdGVFZmZlY3RJbXBsKFVwZGF0ZSwgTGF5b3V0LCBjcmVhdGUsIGRlcHMpO1xufVxuXG5mdW5jdGlvbiBpbXBlcmF0aXZlSGFuZGxlRWZmZWN0KGNyZWF0ZSwgcmVmKSB7XG4gIGlmICh0eXBlb2YgcmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdmFyIHJlZkNhbGxiYWNrID0gcmVmO1xuXG4gICAgdmFyIF9pbnN0ID0gY3JlYXRlKCk7XG5cbiAgICByZWZDYWxsYmFjayhfaW5zdCk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJlZkNhbGxiYWNrKG51bGwpO1xuICAgIH07XG4gIH0gZWxzZSBpZiAocmVmICE9PSBudWxsICYmIHJlZiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFyIHJlZk9iamVjdCA9IHJlZjtcblxuICAgIHtcbiAgICAgIGlmICghcmVmT2JqZWN0Lmhhc093blByb3BlcnR5KCdjdXJyZW50JykpIHtcbiAgICAgICAgZXJyb3IoJ0V4cGVjdGVkIHVzZUltcGVyYXRpdmVIYW5kbGUoKSBmaXJzdCBhcmd1bWVudCB0byBlaXRoZXIgYmUgYSAnICsgJ3JlZiBjYWxsYmFjayBvciBSZWFjdC5jcmVhdGVSZWYoKSBvYmplY3QuIEluc3RlYWQgcmVjZWl2ZWQ6ICVzLicsICdhbiBvYmplY3Qgd2l0aCBrZXlzIHsnICsgT2JqZWN0LmtleXMocmVmT2JqZWN0KS5qb2luKCcsICcpICsgJ30nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgX2luc3QyID0gY3JlYXRlKCk7XG5cbiAgICByZWZPYmplY3QuY3VycmVudCA9IF9pbnN0MjtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmVmT2JqZWN0LmN1cnJlbnQgPSBudWxsO1xuICAgIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gbW91bnRJbXBlcmF0aXZlSGFuZGxlKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gIHtcbiAgICBpZiAodHlwZW9mIGNyZWF0ZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJ0V4cGVjdGVkIHVzZUltcGVyYXRpdmVIYW5kbGUoKSBzZWNvbmQgYXJndW1lbnQgdG8gYmUgYSBmdW5jdGlvbiAnICsgJ3RoYXQgY3JlYXRlcyBhIGhhbmRsZS4gSW5zdGVhZCByZWNlaXZlZDogJXMuJywgY3JlYXRlICE9PSBudWxsID8gdHlwZW9mIGNyZWF0ZSA6ICdudWxsJyk7XG4gICAgfVxuICB9IC8vIFRPRE86IElmIGRlcHMgYXJlIHByb3ZpZGVkLCBzaG91bGQgd2Ugc2tpcCBjb21wYXJpbmcgdGhlIHJlZiBpdHNlbGY/XG5cblxuICB2YXIgZWZmZWN0RGVwcyA9IGRlcHMgIT09IG51bGwgJiYgZGVwcyAhPT0gdW5kZWZpbmVkID8gZGVwcy5jb25jYXQoW3JlZl0pIDogbnVsbDtcbiAgdmFyIGZpYmVyRmxhZ3MgPSBVcGRhdGU7XG5cbiAge1xuICAgIGZpYmVyRmxhZ3MgfD0gTGF5b3V0U3RhdGljO1xuICB9XG5cbiAgaWYgKCAoY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5tb2RlICYgU3RyaWN0RWZmZWN0c01vZGUpICE9PSBOb01vZGUpIHtcbiAgICBmaWJlckZsYWdzIHw9IE1vdW50TGF5b3V0RGV2O1xuICB9XG5cbiAgcmV0dXJuIG1vdW50RWZmZWN0SW1wbChmaWJlckZsYWdzLCBMYXlvdXQsIGltcGVyYXRpdmVIYW5kbGVFZmZlY3QuYmluZChudWxsLCBjcmVhdGUsIHJlZiksIGVmZmVjdERlcHMpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVJbXBlcmF0aXZlSGFuZGxlKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gIHtcbiAgICBpZiAodHlwZW9mIGNyZWF0ZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJ0V4cGVjdGVkIHVzZUltcGVyYXRpdmVIYW5kbGUoKSBzZWNvbmQgYXJndW1lbnQgdG8gYmUgYSBmdW5jdGlvbiAnICsgJ3RoYXQgY3JlYXRlcyBhIGhhbmRsZS4gSW5zdGVhZCByZWNlaXZlZDogJXMuJywgY3JlYXRlICE9PSBudWxsID8gdHlwZW9mIGNyZWF0ZSA6ICdudWxsJyk7XG4gICAgfVxuICB9IC8vIFRPRE86IElmIGRlcHMgYXJlIHByb3ZpZGVkLCBzaG91bGQgd2Ugc2tpcCBjb21wYXJpbmcgdGhlIHJlZiBpdHNlbGY/XG5cblxuICB2YXIgZWZmZWN0RGVwcyA9IGRlcHMgIT09IG51bGwgJiYgZGVwcyAhPT0gdW5kZWZpbmVkID8gZGVwcy5jb25jYXQoW3JlZl0pIDogbnVsbDtcbiAgcmV0dXJuIHVwZGF0ZUVmZmVjdEltcGwoVXBkYXRlLCBMYXlvdXQsIGltcGVyYXRpdmVIYW5kbGVFZmZlY3QuYmluZChudWxsLCBjcmVhdGUsIHJlZiksIGVmZmVjdERlcHMpO1xufVxuXG5mdW5jdGlvbiBtb3VudERlYnVnVmFsdWUodmFsdWUsIGZvcm1hdHRlckZuKSB7Ly8gVGhpcyBob29rIGlzIG5vcm1hbGx5IGEgbm8tb3AuXG4gIC8vIFRoZSByZWFjdC1kZWJ1Zy1ob29rcyBwYWNrYWdlIGluamVjdHMgaXRzIG93biBpbXBsZW1lbnRhdGlvblxuICAvLyBzbyB0aGF0IGUuZy4gRGV2VG9vbHMgY2FuIGRpc3BsYXkgY3VzdG9tIGhvb2sgdmFsdWVzLlxufVxuXG52YXIgdXBkYXRlRGVidWdWYWx1ZSA9IG1vdW50RGVidWdWYWx1ZTtcblxuZnVuY3Rpb24gbW91bnRDYWxsYmFjayhjYWxsYmFjaywgZGVwcykge1xuICB2YXIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciBuZXh0RGVwcyA9IGRlcHMgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBkZXBzO1xuICBob29rLm1lbW9pemVkU3RhdGUgPSBbY2FsbGJhY2ssIG5leHREZXBzXTtcbiAgcmV0dXJuIGNhbGxiYWNrO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVDYWxsYmFjayhjYWxsYmFjaywgZGVwcykge1xuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgbmV4dERlcHMgPSBkZXBzID09PSB1bmRlZmluZWQgPyBudWxsIDogZGVwcztcbiAgdmFyIHByZXZTdGF0ZSA9IGhvb2subWVtb2l6ZWRTdGF0ZTtcblxuICBpZiAocHJldlN0YXRlICE9PSBudWxsKSB7XG4gICAgaWYgKG5leHREZXBzICE9PSBudWxsKSB7XG4gICAgICB2YXIgcHJldkRlcHMgPSBwcmV2U3RhdGVbMV07XG5cbiAgICAgIGlmIChhcmVIb29rSW5wdXRzRXF1YWwobmV4dERlcHMsIHByZXZEZXBzKSkge1xuICAgICAgICByZXR1cm4gcHJldlN0YXRlWzBdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IFtjYWxsYmFjaywgbmV4dERlcHNdO1xuICByZXR1cm4gY2FsbGJhY2s7XG59XG5cbmZ1bmN0aW9uIG1vdW50TWVtbyhuZXh0Q3JlYXRlLCBkZXBzKSB7XG4gIHZhciBob29rID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIG5leHREZXBzID0gZGVwcyA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGRlcHM7XG4gIHZhciBuZXh0VmFsdWUgPSBuZXh0Q3JlYXRlKCk7XG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IFtuZXh0VmFsdWUsIG5leHREZXBzXTtcbiAgcmV0dXJuIG5leHRWYWx1ZTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlTWVtbyhuZXh0Q3JlYXRlLCBkZXBzKSB7XG4gIHZhciBob29rID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciBuZXh0RGVwcyA9IGRlcHMgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBkZXBzO1xuICB2YXIgcHJldlN0YXRlID0gaG9vay5tZW1vaXplZFN0YXRlO1xuXG4gIGlmIChwcmV2U3RhdGUgIT09IG51bGwpIHtcbiAgICAvLyBBc3N1bWUgdGhlc2UgYXJlIGRlZmluZWQuIElmIHRoZXkncmUgbm90LCBhcmVIb29rSW5wdXRzRXF1YWwgd2lsbCB3YXJuLlxuICAgIGlmIChuZXh0RGVwcyAhPT0gbnVsbCkge1xuICAgICAgdmFyIHByZXZEZXBzID0gcHJldlN0YXRlWzFdO1xuXG4gICAgICBpZiAoYXJlSG9va0lucHV0c0VxdWFsKG5leHREZXBzLCBwcmV2RGVwcykpIHtcbiAgICAgICAgcmV0dXJuIHByZXZTdGF0ZVswXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgbmV4dFZhbHVlID0gbmV4dENyZWF0ZSgpO1xuICBob29rLm1lbW9pemVkU3RhdGUgPSBbbmV4dFZhbHVlLCBuZXh0RGVwc107XG4gIHJldHVybiBuZXh0VmFsdWU7XG59XG5cbmZ1bmN0aW9uIG1vdW50RGVmZXJyZWRWYWx1ZSh2YWx1ZSkge1xuICB2YXIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IHZhbHVlO1xuICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZURlZmVycmVkVmFsdWUodmFsdWUpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIHJlc29sdmVkQ3VycmVudEhvb2sgPSBjdXJyZW50SG9vaztcbiAgdmFyIHByZXZWYWx1ZSA9IHJlc29sdmVkQ3VycmVudEhvb2subWVtb2l6ZWRTdGF0ZTtcbiAgcmV0dXJuIHVwZGF0ZURlZmVycmVkVmFsdWVJbXBsKGhvb2ssIHByZXZWYWx1ZSwgdmFsdWUpO1xufVxuXG5mdW5jdGlvbiByZXJlbmRlckRlZmVycmVkVmFsdWUodmFsdWUpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcblxuICBpZiAoY3VycmVudEhvb2sgPT09IG51bGwpIHtcbiAgICAvLyBUaGlzIGlzIGEgcmVyZW5kZXIgZHVyaW5nIGEgbW91bnQuXG4gICAgaG9vay5tZW1vaXplZFN0YXRlID0gdmFsdWU7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9IGVsc2Uge1xuICAgIC8vIFRoaXMgaXMgYSByZXJlbmRlciBkdXJpbmcgYW4gdXBkYXRlLlxuICAgIHZhciBwcmV2VmFsdWUgPSBjdXJyZW50SG9vay5tZW1vaXplZFN0YXRlO1xuICAgIHJldHVybiB1cGRhdGVEZWZlcnJlZFZhbHVlSW1wbChob29rLCBwcmV2VmFsdWUsIHZhbHVlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVEZWZlcnJlZFZhbHVlSW1wbChob29rLCBwcmV2VmFsdWUsIHZhbHVlKSB7XG4gIHZhciBzaG91bGREZWZlclZhbHVlID0gIWluY2x1ZGVzT25seU5vblVyZ2VudExhbmVzKHJlbmRlckxhbmVzKTtcblxuICBpZiAoc2hvdWxkRGVmZXJWYWx1ZSkge1xuICAgIC8vIFRoaXMgaXMgYW4gdXJnZW50IHVwZGF0ZS4gSWYgdGhlIHZhbHVlIGhhcyBjaGFuZ2VkLCBrZWVwIHVzaW5nIHRoZVxuICAgIC8vIHByZXZpb3VzIHZhbHVlIGFuZCBzcGF3biBhIGRlZmVycmVkIHJlbmRlciB0byB1cGRhdGUgaXQgbGF0ZXIuXG4gICAgaWYgKCFvYmplY3RJcyh2YWx1ZSwgcHJldlZhbHVlKSkge1xuICAgICAgLy8gU2NoZWR1bGUgYSBkZWZlcnJlZCByZW5kZXJcbiAgICAgIHZhciBkZWZlcnJlZExhbmUgPSBjbGFpbU5leHRUcmFuc2l0aW9uTGFuZSgpO1xuICAgICAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5sYW5lcyA9IG1lcmdlTGFuZXMoY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5sYW5lcywgZGVmZXJyZWRMYW5lKTtcbiAgICAgIG1hcmtTa2lwcGVkVXBkYXRlTGFuZXMoZGVmZXJyZWRMYW5lKTsgLy8gU2V0IHRoaXMgdG8gdHJ1ZSB0byBpbmRpY2F0ZSB0aGF0IHRoZSByZW5kZXJlZCB2YWx1ZSBpcyBpbmNvbnNpc3RlbnRcbiAgICAgIC8vIGZyb20gdGhlIGxhdGVzdCB2YWx1ZS4gVGhlIG5hbWUgXCJiYXNlU3RhdGVcIiBkb2Vzbid0IHJlYWxseSBtYXRjaCBob3cgd2VcbiAgICAgIC8vIHVzZSBpdCBiZWNhdXNlIHdlJ3JlIHJldXNpbmcgYSBzdGF0ZSBob29rIGZpZWxkIGluc3RlYWQgb2YgY3JlYXRpbmcgYVxuICAgICAgLy8gbmV3IG9uZS5cblxuICAgICAgaG9vay5iYXNlU3RhdGUgPSB0cnVlO1xuICAgIH0gLy8gUmV1c2UgdGhlIHByZXZpb3VzIHZhbHVlXG5cblxuICAgIHJldHVybiBwcmV2VmFsdWU7XG4gIH0gZWxzZSB7XG4gICAgLy8gVGhpcyBpcyBub3QgYW4gdXJnZW50IHVwZGF0ZSwgc28gd2UgY2FuIHVzZSB0aGUgbGF0ZXN0IHZhbHVlIHJlZ2FyZGxlc3NcbiAgICAvLyBvZiB3aGF0IGl0IGlzLiBObyBuZWVkIHRvIGRlZmVyIGl0LlxuICAgIC8vIEhvd2V2ZXIsIGlmIHdlJ3JlIGN1cnJlbnRseSBpbnNpZGUgYSBzcGF3bmVkIHJlbmRlciwgdGhlbiB3ZSBuZWVkIHRvIG1hcmtcbiAgICAvLyB0aGlzIGFzIGFuIHVwZGF0ZSB0byBwcmV2ZW50IHRoZSBmaWJlciBmcm9tIGJhaWxpbmcgb3V0LlxuICAgIC8vXG4gICAgLy8gYGJhc2VTdGF0ZWAgaXMgdHJ1ZSB3aGVuIHRoZSBjdXJyZW50IHZhbHVlIGlzIGRpZmZlcmVudCBmcm9tIHRoZSByZW5kZXJlZFxuICAgIC8vIHZhbHVlLiBUaGUgbmFtZSBkb2Vzbid0IHJlYWxseSBtYXRjaCBob3cgd2UgdXNlIGl0IGJlY2F1c2Ugd2UncmUgcmV1c2luZ1xuICAgIC8vIGEgc3RhdGUgaG9vayBmaWVsZCBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgbmV3IG9uZS5cbiAgICBpZiAoaG9vay5iYXNlU3RhdGUpIHtcbiAgICAgIC8vIEZsaXAgdGhpcyBiYWNrIHRvIGZhbHNlLlxuICAgICAgaG9vay5iYXNlU3RhdGUgPSBmYWxzZTtcbiAgICAgIG1hcmtXb3JrSW5Qcm9ncmVzc1JlY2VpdmVkVXBkYXRlKCk7XG4gICAgfVxuXG4gICAgaG9vay5tZW1vaXplZFN0YXRlID0gdmFsdWU7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHN0YXJ0VHJhbnNpdGlvbihzZXRQZW5kaW5nLCBjYWxsYmFjaywgb3B0aW9ucykge1xuICB2YXIgcHJldmlvdXNQcmlvcml0eSA9IGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSgpO1xuICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoaGlnaGVyRXZlbnRQcmlvcml0eShwcmV2aW91c1ByaW9yaXR5LCBDb250aW51b3VzRXZlbnRQcmlvcml0eSkpO1xuICBzZXRQZW5kaW5nKHRydWUpO1xuICB2YXIgcHJldlRyYW5zaXRpb24gPSBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQxLnRyYW5zaXRpb247XG4gIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDEudHJhbnNpdGlvbiA9IHt9O1xuICB2YXIgY3VycmVudFRyYW5zaXRpb24gPSBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQxLnRyYW5zaXRpb247XG5cbiAge1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDEudHJhbnNpdGlvbi5fdXBkYXRlZEZpYmVycyA9IG5ldyBTZXQoKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgc2V0UGVuZGluZyhmYWxzZSk7XG4gICAgY2FsbGJhY2soKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkocHJldmlvdXNQcmlvcml0eSk7XG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMS50cmFuc2l0aW9uID0gcHJldlRyYW5zaXRpb247XG5cbiAgICB7XG4gICAgICBpZiAocHJldlRyYW5zaXRpb24gPT09IG51bGwgJiYgY3VycmVudFRyYW5zaXRpb24uX3VwZGF0ZWRGaWJlcnMpIHtcbiAgICAgICAgdmFyIHVwZGF0ZWRGaWJlcnNDb3VudCA9IGN1cnJlbnRUcmFuc2l0aW9uLl91cGRhdGVkRmliZXJzLnNpemU7XG5cbiAgICAgICAgaWYgKHVwZGF0ZWRGaWJlcnNDb3VudCA+IDEwKSB7XG4gICAgICAgICAgd2FybignRGV0ZWN0ZWQgYSBsYXJnZSBudW1iZXIgb2YgdXBkYXRlcyBpbnNpZGUgc3RhcnRUcmFuc2l0aW9uLiAnICsgJ0lmIHRoaXMgaXMgZHVlIHRvIGEgc3Vic2NyaXB0aW9uIHBsZWFzZSByZS13cml0ZSBpdCB0byB1c2UgUmVhY3QgcHJvdmlkZWQgaG9va3MuICcgKyAnT3RoZXJ3aXNlIGNvbmN1cnJlbnQgbW9kZSBndWFyYW50ZWVzIGFyZSBvZmYgdGhlIHRhYmxlLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgY3VycmVudFRyYW5zaXRpb24uX3VwZGF0ZWRGaWJlcnMuY2xlYXIoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbW91bnRUcmFuc2l0aW9uKCkge1xuICB2YXIgX21vdW50U3RhdGUgPSBtb3VudFN0YXRlKGZhbHNlKSxcbiAgICAgIGlzUGVuZGluZyA9IF9tb3VudFN0YXRlWzBdLFxuICAgICAgc2V0UGVuZGluZyA9IF9tb3VudFN0YXRlWzFdOyAvLyBUaGUgYHN0YXJ0YCBtZXRob2QgbmV2ZXIgY2hhbmdlcy5cblxuXG4gIHZhciBzdGFydCA9IHN0YXJ0VHJhbnNpdGlvbi5iaW5kKG51bGwsIHNldFBlbmRpbmcpO1xuICB2YXIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IHN0YXJ0O1xuICByZXR1cm4gW2lzUGVuZGluZywgc3RhcnRdO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVUcmFuc2l0aW9uKCkge1xuICB2YXIgX3VwZGF0ZVN0YXRlID0gdXBkYXRlU3RhdGUoKSxcbiAgICAgIGlzUGVuZGluZyA9IF91cGRhdGVTdGF0ZVswXTtcblxuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgc3RhcnQgPSBob29rLm1lbW9pemVkU3RhdGU7XG4gIHJldHVybiBbaXNQZW5kaW5nLCBzdGFydF07XG59XG5cbmZ1bmN0aW9uIHJlcmVuZGVyVHJhbnNpdGlvbigpIHtcbiAgdmFyIF9yZXJlbmRlclN0YXRlID0gcmVyZW5kZXJTdGF0ZSgpLFxuICAgICAgaXNQZW5kaW5nID0gX3JlcmVuZGVyU3RhdGVbMF07XG5cbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIHN0YXJ0ID0gaG9vay5tZW1vaXplZFN0YXRlO1xuICByZXR1cm4gW2lzUGVuZGluZywgc3RhcnRdO1xufVxuXG52YXIgaXNVcGRhdGluZ09wYXF1ZVZhbHVlSW5SZW5kZXJQaGFzZSA9IGZhbHNlO1xuZnVuY3Rpb24gZ2V0SXNVcGRhdGluZ09wYXF1ZVZhbHVlSW5SZW5kZXJQaGFzZUluREVWKCkge1xuICB7XG4gICAgcmV0dXJuIGlzVXBkYXRpbmdPcGFxdWVWYWx1ZUluUmVuZGVyUGhhc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gbW91bnRJZCgpIHtcbiAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgcm9vdCA9IGdldFdvcmtJblByb2dyZXNzUm9vdCgpOyAvLyBUT0RPOiBJbiBGaXp6LCBpZCBnZW5lcmF0aW9uIGlzIHNwZWNpZmljIHRvIGVhY2ggc2VydmVyIGNvbmZpZy4gTWF5YmUgd2VcbiAgLy8gc2hvdWxkIGRvIHRoaXMgaW4gRmliZXIsIHRvbz8gRGVmZXJyaW5nIHRoaXMgZGVjaXNpb24gZm9yIG5vdyBiZWNhdXNlXG4gIC8vIHRoZXJlJ3Mgbm8gb3RoZXIgcGxhY2UgdG8gc3RvcmUgdGhlIHByZWZpeCBleGNlcHQgZm9yIGFuIGludGVybmFsIGZpZWxkIG9uXG4gIC8vIHRoZSBwdWJsaWMgY3JlYXRlUm9vdCBvYmplY3QsIHdoaWNoIHRoZSBmaWJlciB0cmVlIGRvZXMgbm90IGN1cnJlbnRseSBoYXZlXG4gIC8vIGEgcmVmZXJlbmNlIHRvLlxuXG4gIHZhciBpZGVudGlmaWVyUHJlZml4ID0gcm9vdC5pZGVudGlmaWVyUHJlZml4O1xuICB2YXIgaWQ7XG5cbiAgaWYgKGdldElzSHlkcmF0aW5nKCkpIHtcbiAgICB2YXIgdHJlZUlkID0gZ2V0VHJlZUlkKCk7IC8vIFVzZSBhIGNhcHRpYWwgUiBwcmVmaXggZm9yIHNlcnZlci1nZW5lcmF0ZWQgaWRzLlxuXG4gICAgaWQgPSAnOicgKyBpZGVudGlmaWVyUHJlZml4ICsgJ1InICsgdHJlZUlkOyAvLyBVbmxlc3MgdGhpcyBpcyB0aGUgZmlyc3QgaWQgYXQgdGhpcyBsZXZlbCwgYXBwZW5kIGEgbnVtYmVyIGF0IHRoZSBlbmRcbiAgICAvLyB0aGF0IHJlcHJlc2VudHMgdGhlIHBvc2l0aW9uIG9mIHRoaXMgdXNlSWQgaG9vayBhbW9uZyBhbGwgdGhlIHVzZUlkXG4gICAgLy8gaG9va3MgZm9yIHRoaXMgZmliZXIuXG5cbiAgICB2YXIgbG9jYWxJZCA9IGxvY2FsSWRDb3VudGVyKys7XG5cbiAgICBpZiAobG9jYWxJZCA+IDApIHtcbiAgICAgIGlkICs9ICdIJyArIGxvY2FsSWQudG9TdHJpbmcoMzIpO1xuICAgIH1cblxuICAgIGlkICs9ICc6JztcbiAgfSBlbHNlIHtcbiAgICAvLyBVc2UgYSBsb3dlcmNhc2UgciBwcmVmaXggZm9yIGNsaWVudC1nZW5lcmF0ZWQgaWRzLlxuICAgIHZhciBnbG9iYWxDbGllbnRJZCA9IGdsb2JhbENsaWVudElkQ291bnRlcisrO1xuICAgIGlkID0gJzonICsgaWRlbnRpZmllclByZWZpeCArICdyJyArIGdsb2JhbENsaWVudElkLnRvU3RyaW5nKDMyKSArICc6JztcbiAgfVxuXG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IGlkO1xuICByZXR1cm4gaWQ7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUlkKCkge1xuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgaWQgPSBob29rLm1lbW9pemVkU3RhdGU7XG4gIHJldHVybiBpZDtcbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hSZWR1Y2VyQWN0aW9uKGZpYmVyLCBxdWV1ZSwgYWN0aW9uKSB7XG4gIHtcbiAgICBpZiAodHlwZW9mIGFyZ3VtZW50c1szXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoXCJTdGF0ZSB1cGRhdGVzIGZyb20gdGhlIHVzZVN0YXRlKCkgYW5kIHVzZVJlZHVjZXIoKSBIb29rcyBkb24ndCBzdXBwb3J0IHRoZSBcIiArICdzZWNvbmQgY2FsbGJhY2sgYXJndW1lbnQuIFRvIGV4ZWN1dGUgYSBzaWRlIGVmZmVjdCBhZnRlciAnICsgJ3JlbmRlcmluZywgZGVjbGFyZSBpdCBpbiB0aGUgY29tcG9uZW50IGJvZHkgd2l0aCB1c2VFZmZlY3QoKS4nKTtcbiAgICB9XG4gIH1cblxuICB2YXIgbGFuZSA9IHJlcXVlc3RVcGRhdGVMYW5lKGZpYmVyKTtcbiAgdmFyIHVwZGF0ZSA9IHtcbiAgICBsYW5lOiBsYW5lLFxuICAgIGFjdGlvbjogYWN0aW9uLFxuICAgIGhhc0VhZ2VyU3RhdGU6IGZhbHNlLFxuICAgIGVhZ2VyU3RhdGU6IG51bGwsXG4gICAgbmV4dDogbnVsbFxuICB9O1xuXG4gIGlmIChpc1JlbmRlclBoYXNlVXBkYXRlKGZpYmVyKSkge1xuICAgIGVucXVldWVSZW5kZXJQaGFzZVVwZGF0ZShxdWV1ZSwgdXBkYXRlKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgcm9vdCA9IGVucXVldWVDb25jdXJyZW50SG9va1VwZGF0ZShmaWJlciwgcXVldWUsIHVwZGF0ZSwgbGFuZSk7XG5cbiAgICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgICAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgbGFuZSwgZXZlbnRUaW1lKTtcbiAgICAgIGVudGFuZ2xlVHJhbnNpdGlvblVwZGF0ZShyb290LCBxdWV1ZSwgbGFuZSk7XG4gICAgfVxuICB9XG5cbiAgbWFya1VwZGF0ZUluRGV2VG9vbHMoZmliZXIsIGxhbmUpO1xufVxuXG5mdW5jdGlvbiBkaXNwYXRjaFNldFN0YXRlKGZpYmVyLCBxdWV1ZSwgYWN0aW9uKSB7XG4gIHtcbiAgICBpZiAodHlwZW9mIGFyZ3VtZW50c1szXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoXCJTdGF0ZSB1cGRhdGVzIGZyb20gdGhlIHVzZVN0YXRlKCkgYW5kIHVzZVJlZHVjZXIoKSBIb29rcyBkb24ndCBzdXBwb3J0IHRoZSBcIiArICdzZWNvbmQgY2FsbGJhY2sgYXJndW1lbnQuIFRvIGV4ZWN1dGUgYSBzaWRlIGVmZmVjdCBhZnRlciAnICsgJ3JlbmRlcmluZywgZGVjbGFyZSBpdCBpbiB0aGUgY29tcG9uZW50IGJvZHkgd2l0aCB1c2VFZmZlY3QoKS4nKTtcbiAgICB9XG4gIH1cblxuICB2YXIgbGFuZSA9IHJlcXVlc3RVcGRhdGVMYW5lKGZpYmVyKTtcbiAgdmFyIHVwZGF0ZSA9IHtcbiAgICBsYW5lOiBsYW5lLFxuICAgIGFjdGlvbjogYWN0aW9uLFxuICAgIGhhc0VhZ2VyU3RhdGU6IGZhbHNlLFxuICAgIGVhZ2VyU3RhdGU6IG51bGwsXG4gICAgbmV4dDogbnVsbFxuICB9O1xuXG4gIGlmIChpc1JlbmRlclBoYXNlVXBkYXRlKGZpYmVyKSkge1xuICAgIGVucXVldWVSZW5kZXJQaGFzZVVwZGF0ZShxdWV1ZSwgdXBkYXRlKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgYWx0ZXJuYXRlID0gZmliZXIuYWx0ZXJuYXRlO1xuXG4gICAgaWYgKGZpYmVyLmxhbmVzID09PSBOb0xhbmVzICYmIChhbHRlcm5hdGUgPT09IG51bGwgfHwgYWx0ZXJuYXRlLmxhbmVzID09PSBOb0xhbmVzKSkge1xuICAgICAgLy8gVGhlIHF1ZXVlIGlzIGN1cnJlbnRseSBlbXB0eSwgd2hpY2ggbWVhbnMgd2UgY2FuIGVhZ2VybHkgY29tcHV0ZSB0aGVcbiAgICAgIC8vIG5leHQgc3RhdGUgYmVmb3JlIGVudGVyaW5nIHRoZSByZW5kZXIgcGhhc2UuIElmIHRoZSBuZXcgc3RhdGUgaXMgdGhlXG4gICAgICAvLyBzYW1lIGFzIHRoZSBjdXJyZW50IHN0YXRlLCB3ZSBtYXkgYmUgYWJsZSB0byBiYWlsIG91dCBlbnRpcmVseS5cbiAgICAgIHZhciBsYXN0UmVuZGVyZWRSZWR1Y2VyID0gcXVldWUubGFzdFJlbmRlcmVkUmVkdWNlcjtcblxuICAgICAgaWYgKGxhc3RSZW5kZXJlZFJlZHVjZXIgIT09IG51bGwpIHtcbiAgICAgICAgdmFyIHByZXZEaXNwYXRjaGVyO1xuXG4gICAgICAgIHtcbiAgICAgICAgICBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIHZhciBjdXJyZW50U3RhdGUgPSBxdWV1ZS5sYXN0UmVuZGVyZWRTdGF0ZTtcbiAgICAgICAgICB2YXIgZWFnZXJTdGF0ZSA9IGxhc3RSZW5kZXJlZFJlZHVjZXIoY3VycmVudFN0YXRlLCBhY3Rpb24pOyAvLyBTdGFzaCB0aGUgZWFnZXJseSBjb21wdXRlZCBzdGF0ZSwgYW5kIHRoZSByZWR1Y2VyIHVzZWQgdG8gY29tcHV0ZVxuICAgICAgICAgIC8vIGl0LCBvbiB0aGUgdXBkYXRlIG9iamVjdC4gSWYgdGhlIHJlZHVjZXIgaGFzbid0IGNoYW5nZWQgYnkgdGhlXG4gICAgICAgICAgLy8gdGltZSB3ZSBlbnRlciB0aGUgcmVuZGVyIHBoYXNlLCB0aGVuIHRoZSBlYWdlciBzdGF0ZSBjYW4gYmUgdXNlZFxuICAgICAgICAgIC8vIHdpdGhvdXQgY2FsbGluZyB0aGUgcmVkdWNlciBhZ2Fpbi5cblxuICAgICAgICAgIHVwZGF0ZS5oYXNFYWdlclN0YXRlID0gdHJ1ZTtcbiAgICAgICAgICB1cGRhdGUuZWFnZXJTdGF0ZSA9IGVhZ2VyU3RhdGU7XG5cbiAgICAgICAgICBpZiAob2JqZWN0SXMoZWFnZXJTdGF0ZSwgY3VycmVudFN0YXRlKSkge1xuICAgICAgICAgICAgLy8gRmFzdCBwYXRoLiBXZSBjYW4gYmFpbCBvdXQgd2l0aG91dCBzY2hlZHVsaW5nIFJlYWN0IHRvIHJlLXJlbmRlci5cbiAgICAgICAgICAgIC8vIEl0J3Mgc3RpbGwgcG9zc2libGUgdGhhdCB3ZSdsbCBuZWVkIHRvIHJlYmFzZSB0aGlzIHVwZGF0ZSBsYXRlcixcbiAgICAgICAgICAgIC8vIGlmIHRoZSBjb21wb25lbnQgcmUtcmVuZGVycyBmb3IgYSBkaWZmZXJlbnQgcmVhc29uIGFuZCBieSB0aGF0XG4gICAgICAgICAgICAvLyB0aW1lIHRoZSByZWR1Y2VyIGhhcyBjaGFuZ2VkLlxuICAgICAgICAgICAgLy8gVE9ETzogRG8gd2Ugc3RpbGwgbmVlZCB0byBlbnRhbmdsZSB0cmFuc2l0aW9ucyBpbiB0aGlzIGNhc2U/XG4gICAgICAgICAgICBlbnF1ZXVlQ29uY3VycmVudEhvb2tVcGRhdGVBbmRFYWdlcmx5QmFpbG91dChmaWJlciwgcXVldWUsIHVwZGF0ZSwgbGFuZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikgey8vIFN1cHByZXNzIHRoZSBlcnJvci4gSXQgd2lsbCB0aHJvdyBhZ2FpbiBpbiB0aGUgcmVuZGVyIHBoYXNlLlxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudEhvb2tVcGRhdGUoZmliZXIsIHF1ZXVlLCB1cGRhdGUsIGxhbmUpO1xuXG4gICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIGxhbmUsIGV2ZW50VGltZSk7XG4gICAgICBlbnRhbmdsZVRyYW5zaXRpb25VcGRhdGUocm9vdCwgcXVldWUsIGxhbmUpO1xuICAgIH1cbiAgfVxuXG4gIG1hcmtVcGRhdGVJbkRldlRvb2xzKGZpYmVyLCBsYW5lKTtcbn1cblxuZnVuY3Rpb24gaXNSZW5kZXJQaGFzZVVwZGF0ZShmaWJlcikge1xuICB2YXIgYWx0ZXJuYXRlID0gZmliZXIuYWx0ZXJuYXRlO1xuICByZXR1cm4gZmliZXIgPT09IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEgfHwgYWx0ZXJuYXRlICE9PSBudWxsICYmIGFsdGVybmF0ZSA9PT0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMTtcbn1cblxuZnVuY3Rpb24gZW5xdWV1ZVJlbmRlclBoYXNlVXBkYXRlKHF1ZXVlLCB1cGRhdGUpIHtcbiAgLy8gVGhpcyBpcyBhIHJlbmRlciBwaGFzZSB1cGRhdGUuIFN0YXNoIGl0IGluIGEgbGF6aWx5LWNyZWF0ZWQgbWFwIG9mXG4gIC8vIHF1ZXVlIC0+IGxpbmtlZCBsaXN0IG9mIHVwZGF0ZXMuIEFmdGVyIHRoaXMgcmVuZGVyIHBhc3MsIHdlJ2xsIHJlc3RhcnRcbiAgLy8gYW5kIGFwcGx5IHRoZSBzdGFzaGVkIHVwZGF0ZXMgb24gdG9wIG9mIHRoZSB3b3JrLWluLXByb2dyZXNzIGhvb2suXG4gIGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGVEdXJpbmdUaGlzUGFzcyA9IGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGUgPSB0cnVlO1xuICB2YXIgcGVuZGluZyA9IHF1ZXVlLnBlbmRpbmc7XG5cbiAgaWYgKHBlbmRpbmcgPT09IG51bGwpIHtcbiAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCB1cGRhdGUuIENyZWF0ZSBhIGNpcmN1bGFyIGxpc3QuXG4gICAgdXBkYXRlLm5leHQgPSB1cGRhdGU7XG4gIH0gZWxzZSB7XG4gICAgdXBkYXRlLm5leHQgPSBwZW5kaW5nLm5leHQ7XG4gICAgcGVuZGluZy5uZXh0ID0gdXBkYXRlO1xuICB9XG5cbiAgcXVldWUucGVuZGluZyA9IHVwZGF0ZTtcbn0gLy8gVE9ETzogTW92ZSB0byBSZWFjdEZpYmVyQ29uY3VycmVudFVwZGF0ZXM/XG5cblxuZnVuY3Rpb24gZW50YW5nbGVUcmFuc2l0aW9uVXBkYXRlKHJvb3QsIHF1ZXVlLCBsYW5lKSB7XG4gIGlmIChpc1RyYW5zaXRpb25MYW5lKGxhbmUpKSB7XG4gICAgdmFyIHF1ZXVlTGFuZXMgPSBxdWV1ZS5sYW5lczsgLy8gSWYgYW55IGVudGFuZ2xlZCBsYW5lcyBhcmUgbm8gbG9uZ2VyIHBlbmRpbmcgb24gdGhlIHJvb3QsIHRoZW4gdGhleVxuICAgIC8vIG11c3QgaGF2ZSBmaW5pc2hlZC4gV2UgY2FuIHJlbW92ZSB0aGVtIGZyb20gdGhlIHNoYXJlZCBxdWV1ZSwgd2hpY2hcbiAgICAvLyByZXByZXNlbnRzIGEgc3VwZXJzZXQgb2YgdGhlIGFjdHVhbGx5IHBlbmRpbmcgbGFuZXMuIEluIHNvbWUgY2FzZXMgd2VcbiAgICAvLyBtYXkgZW50YW5nbGUgbW9yZSB0aGFuIHdlIG5lZWQgdG8sIGJ1dCB0aGF0J3MgT0suIEluIGZhY3QgaXQncyB3b3JzZSBpZlxuICAgIC8vIHdlICpkb24ndCogZW50YW5nbGUgd2hlbiB3ZSBzaG91bGQuXG5cbiAgICBxdWV1ZUxhbmVzID0gaW50ZXJzZWN0TGFuZXMocXVldWVMYW5lcywgcm9vdC5wZW5kaW5nTGFuZXMpOyAvLyBFbnRhbmdsZSB0aGUgbmV3IHRyYW5zaXRpb24gbGFuZSB3aXRoIHRoZSBvdGhlciB0cmFuc2l0aW9uIGxhbmVzLlxuXG4gICAgdmFyIG5ld1F1ZXVlTGFuZXMgPSBtZXJnZUxhbmVzKHF1ZXVlTGFuZXMsIGxhbmUpO1xuICAgIHF1ZXVlLmxhbmVzID0gbmV3UXVldWVMYW5lczsgLy8gRXZlbiBpZiBxdWV1ZS5sYW5lcyBhbHJlYWR5IGluY2x1ZGUgbGFuZSwgd2UgZG9uJ3Qga25vdyBmb3IgY2VydGFpbiBpZlxuICAgIC8vIHRoZSBsYW5lIGZpbmlzaGVkIHNpbmNlIHRoZSBsYXN0IHRpbWUgd2UgZW50YW5nbGVkIGl0LiBTbyB3ZSBuZWVkIHRvXG4gICAgLy8gZW50YW5nbGUgaXQgYWdhaW4sIGp1c3QgdG8gYmUgc3VyZS5cblxuICAgIG1hcmtSb290RW50YW5nbGVkKHJvb3QsIG5ld1F1ZXVlTGFuZXMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1hcmtVcGRhdGVJbkRldlRvb2xzKGZpYmVyLCBsYW5lLCBhY3Rpb24pIHtcblxuICB7XG4gICAgbWFya1N0YXRlVXBkYXRlU2NoZWR1bGVkKGZpYmVyLCBsYW5lKTtcbiAgfVxufVxuXG52YXIgQ29udGV4dE9ubHlEaXNwYXRjaGVyID0ge1xuICByZWFkQ29udGV4dDogcmVhZENvbnRleHQsXG4gIHVzZUNhbGxiYWNrOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZUNvbnRleHQ6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlRWZmZWN0OiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZUltcGVyYXRpdmVIYW5kbGU6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlSW5zZXJ0aW9uRWZmZWN0OiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZUxheW91dEVmZmVjdDogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VNZW1vOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZVJlZHVjZXI6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlUmVmOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZVN0YXRlOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZURlYnVnVmFsdWU6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlRGVmZXJyZWRWYWx1ZTogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VUcmFuc2l0aW9uOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZU11dGFibGVTb3VyY2U6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlU3luY0V4dGVybmFsU3RvcmU6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlSWQ6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiBlbmFibGVOZXdSZWNvbmNpbGVyXG59O1xuXG52YXIgSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWID0gbnVsbDtcbnZhciBIb29rc0Rpc3BhdGNoZXJPbk1vdW50V2l0aEhvb2tUeXBlc0luREVWID0gbnVsbDtcbnZhciBIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWID0gbnVsbDtcbnZhciBIb29rc0Rpc3BhdGNoZXJPblJlcmVuZGVySW5ERVYgPSBudWxsO1xudmFyIEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVYgPSBudWxsO1xudmFyIEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWID0gbnVsbDtcbnZhciBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25SZXJlbmRlckluREVWID0gbnVsbDtcblxue1xuICB2YXIgd2FybkludmFsaWRDb250ZXh0QWNjZXNzID0gZnVuY3Rpb24gKCkge1xuICAgIGVycm9yKCdDb250ZXh0IGNhbiBvbmx5IGJlIHJlYWQgd2hpbGUgUmVhY3QgaXMgcmVuZGVyaW5nLiAnICsgJ0luIGNsYXNzZXMsIHlvdSBjYW4gcmVhZCBpdCBpbiB0aGUgcmVuZGVyIG1ldGhvZCBvciBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMuICcgKyAnSW4gZnVuY3Rpb24gY29tcG9uZW50cywgeW91IGNhbiByZWFkIGl0IGRpcmVjdGx5IGluIHRoZSBmdW5jdGlvbiBib2R5LCBidXQgbm90ICcgKyAnaW5zaWRlIEhvb2tzIGxpa2UgdXNlUmVkdWNlcigpIG9yIHVzZU1lbW8oKS4nKTtcbiAgfTtcblxuICB2YXIgd2FybkludmFsaWRIb29rQWNjZXNzID0gZnVuY3Rpb24gKCkge1xuICAgIGVycm9yKCdEbyBub3QgY2FsbCBIb29rcyBpbnNpZGUgdXNlRWZmZWN0KC4uLiksIHVzZU1lbW8oLi4uKSwgb3Igb3RoZXIgYnVpbHQtaW4gSG9va3MuICcgKyAnWW91IGNhbiBvbmx5IGNhbGwgSG9va3MgYXQgdGhlIHRvcCBsZXZlbCBvZiB5b3VyIFJlYWN0IGZ1bmN0aW9uLiAnICsgJ0ZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvcnVsZXMtb2YtaG9va3MnKTtcbiAgfTtcblxuICBIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVYgPSB7XG4gICAgcmVhZENvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VDYWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDYWxsYmFjayc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgY2hlY2tEZXBzQXJlQXJyYXlEZXYoZGVwcyk7XG4gICAgICByZXR1cm4gbW91bnRDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ29udGV4dCc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgIH0sXG4gICAgdXNlRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VFZmZlY3QnO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIGNoZWNrRGVwc0FyZUFycmF5RGV2KGRlcHMpO1xuICAgICAgcmV0dXJuIG1vdW50RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlOiBmdW5jdGlvbiAocmVmLCBjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUltcGVyYXRpdmVIYW5kbGUnO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIGNoZWNrRGVwc0FyZUFycmF5RGV2KGRlcHMpO1xuICAgICAgcmV0dXJuIG1vdW50SW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbnNlcnRpb25FZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUluc2VydGlvbkVmZmVjdCc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgY2hlY2tEZXBzQXJlQXJyYXlEZXYoZGVwcyk7XG4gICAgICByZXR1cm4gbW91bnRJbnNlcnRpb25FZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUxheW91dEVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTGF5b3V0RWZmZWN0JztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICBjaGVja0RlcHNBcmVBcnJheURldihkZXBzKTtcbiAgICAgIHJldHVybiBtb3VudExheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTWVtbzogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTWVtbyc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgY2hlY2tEZXBzQXJlQXJyYXlEZXYoZGVwcyk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG1vdW50TWVtbyhjcmVhdGUsIGRlcHMpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZHVjZXI6IGZ1bmN0aW9uIChyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWR1Y2VyJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG1vdW50UmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWY6IGZ1bmN0aW9uIChpbml0aWFsVmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZic7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50UmVmKGluaXRpYWxWYWx1ZSk7XG4gICAgfSxcbiAgICB1c2VTdGF0ZTogZnVuY3Rpb24gKGluaXRpYWxTdGF0ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3RhdGUnO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbW91bnRTdGF0ZShpbml0aWFsU3RhdGUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZURlYnVnVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSwgZm9ybWF0dGVyRm4pIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlYnVnVmFsdWUnO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudERlYnVnVmFsdWUoKTtcbiAgICB9LFxuICAgIHVzZURlZmVycmVkVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVmZXJyZWRWYWx1ZSc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50RGVmZXJyZWRWYWx1ZSh2YWx1ZSk7XG4gICAgfSxcbiAgICB1c2VUcmFuc2l0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VUcmFuc2l0aW9uJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRUcmFuc2l0aW9uKCk7XG4gICAgfSxcbiAgICB1c2VNdXRhYmxlU291cmNlOiBmdW5jdGlvbiAoc291cmNlLCBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNdXRhYmxlU291cmNlJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRNdXRhYmxlU291cmNlKCk7XG4gICAgfSxcbiAgICB1c2VTeW5jRXh0ZXJuYWxTdG9yZTogZnVuY3Rpb24gKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTeW5jRXh0ZXJuYWxTdG9yZSc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50U3luY0V4dGVybmFsU3RvcmUoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpO1xuICAgIH0sXG4gICAgdXNlSWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUlkJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRJZCgpO1xuICAgIH0sXG4gICAgdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiBlbmFibGVOZXdSZWNvbmNpbGVyXG4gIH07XG5cbiAgSG9va3NEaXNwYXRjaGVyT25Nb3VudFdpdGhIb29rVHlwZXNJbkRFViA9IHtcbiAgICByZWFkQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTtcbiAgICB9LFxuICAgIHVzZUNhbGxiYWNrOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNhbGxiYWNrJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50Q2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNvbnRleHQnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUVmZmVjdCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudEVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZTogZnVuY3Rpb24gKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbXBlcmF0aXZlSGFuZGxlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50SW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbnNlcnRpb25FZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUluc2VydGlvbkVmZmVjdCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudEluc2VydGlvbkVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VMYXlvdXRFZmZlY3QnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZU1lbW86IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU1lbW8nO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG1vdW50TWVtbyhjcmVhdGUsIGRlcHMpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZHVjZXI6IGZ1bmN0aW9uIChyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWR1Y2VyJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBtb3VudFJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVmOiBmdW5jdGlvbiAoaW5pdGlhbFZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWYnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRSZWYoaW5pdGlhbFZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVN0YXRlOiBmdW5jdGlvbiAoaW5pdGlhbFN0YXRlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTdGF0ZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbW91bnRTdGF0ZShpbml0aWFsU3RhdGUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZURlYnVnVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSwgZm9ybWF0dGVyRm4pIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlYnVnVmFsdWUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnREZWJ1Z1ZhbHVlKCk7XG4gICAgfSxcbiAgICB1c2VEZWZlcnJlZFZhbHVlOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlZmVycmVkVmFsdWUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnREZWZlcnJlZFZhbHVlKHZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVRyYW5zaXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVRyYW5zaXRpb24nO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRUcmFuc2l0aW9uKCk7XG4gICAgfSxcbiAgICB1c2VNdXRhYmxlU291cmNlOiBmdW5jdGlvbiAoc291cmNlLCBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNdXRhYmxlU291cmNlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50TXV0YWJsZVNvdXJjZSgpO1xuICAgIH0sXG4gICAgdXNlU3luY0V4dGVybmFsU3RvcmU6IGZ1bmN0aW9uIChzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3luY0V4dGVybmFsU3RvcmUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRTeW5jRXh0ZXJuYWxTdG9yZShzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCk7XG4gICAgfSxcbiAgICB1c2VJZDogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSWQnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRJZCgpO1xuICAgIH0sXG4gICAgdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiBlbmFibGVOZXdSZWNvbmNpbGVyXG4gIH07XG5cbiAgSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFViA9IHtcbiAgICByZWFkQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTtcbiAgICB9LFxuICAgIHVzZUNhbGxiYWNrOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNhbGxiYWNrJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUNhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUNvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDb250ZXh0JztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgIH0sXG4gICAgdXNlRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VFZmZlY3QnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlRWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlOiBmdW5jdGlvbiAocmVmLCBjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUltcGVyYXRpdmVIYW5kbGUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbnNlcnRpb25FZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUluc2VydGlvbkVmZmVjdCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVJbnNlcnRpb25FZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUxheW91dEVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTGF5b3V0RWZmZWN0JztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUxheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTWVtbzogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTWVtbyc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZU1lbW8oY3JlYXRlLCBkZXBzKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWR1Y2VyOiBmdW5jdGlvbiAocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVkdWNlcic7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZVJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVmOiBmdW5jdGlvbiAoaW5pdGlhbFZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWYnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlUmVmKCk7XG4gICAgfSxcbiAgICB1c2VTdGF0ZTogZnVuY3Rpb24gKGluaXRpYWxTdGF0ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3RhdGUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB1cGRhdGVTdGF0ZShpbml0aWFsU3RhdGUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZURlYnVnVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSwgZm9ybWF0dGVyRm4pIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlYnVnVmFsdWUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlRGVidWdWYWx1ZSgpO1xuICAgIH0sXG4gICAgdXNlRGVmZXJyZWRWYWx1ZTogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWZlcnJlZFZhbHVlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZURlZmVycmVkVmFsdWUodmFsdWUpO1xuICAgIH0sXG4gICAgdXNlVHJhbnNpdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlVHJhbnNpdGlvbic7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVUcmFuc2l0aW9uKCk7XG4gICAgfSxcbiAgICB1c2VNdXRhYmxlU291cmNlOiBmdW5jdGlvbiAoc291cmNlLCBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNdXRhYmxlU291cmNlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZU11dGFibGVTb3VyY2UoKTtcbiAgICB9LFxuICAgIHVzZVN5bmNFeHRlcm5hbFN0b3JlOiBmdW5jdGlvbiAoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN5bmNFeHRlcm5hbFN0b3JlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZVN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U25hcHNob3QpO1xuICAgIH0sXG4gICAgdXNlSWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUlkJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUlkKCk7XG4gICAgfSxcbiAgICB1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6IGVuYWJsZU5ld1JlY29uY2lsZXJcbiAgfTtcblxuICBIb29rc0Rpc3BhdGNoZXJPblJlcmVuZGVySW5ERVYgPSB7XG4gICAgcmVhZENvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VDYWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDYWxsYmFjayc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ29udGV4dCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTtcbiAgICB9LFxuICAgIHVzZUVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRWZmZWN0JztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZTogZnVuY3Rpb24gKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbXBlcmF0aXZlSGFuZGxlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW5zZXJ0aW9uRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbnNlcnRpb25FZmZlY3QnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlSW5zZXJ0aW9uRWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VMYXlvdXRFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUxheW91dEVmZmVjdCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZU1lbW86IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU1lbW8nO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uUmVyZW5kZXJJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZU1lbW8oY3JlYXRlLCBkZXBzKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWR1Y2VyOiBmdW5jdGlvbiAocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVkdWNlcic7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25SZXJlbmRlckluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gcmVyZW5kZXJSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZjogZnVuY3Rpb24gKGluaXRpYWxWYWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVmJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZVJlZigpO1xuICAgIH0sXG4gICAgdXNlU3RhdGU6IGZ1bmN0aW9uIChpbml0aWFsU3RhdGUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN0YXRlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblJlcmVuZGVySW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiByZXJlbmRlclN0YXRlKGluaXRpYWxTdGF0ZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlRGVidWdWYWx1ZTogZnVuY3Rpb24gKHZhbHVlLCBmb3JtYXR0ZXJGbikge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVidWdWYWx1ZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVEZWJ1Z1ZhbHVlKCk7XG4gICAgfSxcbiAgICB1c2VEZWZlcnJlZFZhbHVlOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlZmVycmVkVmFsdWUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVyZW5kZXJEZWZlcnJlZFZhbHVlKHZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVRyYW5zaXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVRyYW5zaXRpb24nO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVyZW5kZXJUcmFuc2l0aW9uKCk7XG4gICAgfSxcbiAgICB1c2VNdXRhYmxlU291cmNlOiBmdW5jdGlvbiAoc291cmNlLCBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNdXRhYmxlU291cmNlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZU11dGFibGVTb3VyY2UoKTtcbiAgICB9LFxuICAgIHVzZVN5bmNFeHRlcm5hbFN0b3JlOiBmdW5jdGlvbiAoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN5bmNFeHRlcm5hbFN0b3JlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZVN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U25hcHNob3QpO1xuICAgIH0sXG4gICAgdXNlSWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUlkJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUlkKCk7XG4gICAgfSxcbiAgICB1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6IGVuYWJsZU5ld1JlY29uY2lsZXJcbiAgfTtcblxuICBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWID0ge1xuICAgIHJlYWRDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgd2FybkludmFsaWRDb250ZXh0QWNjZXNzKCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VDYWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDYWxsYmFjayc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ29udGV4dCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUVmZmVjdCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGU6IGZ1bmN0aW9uIChyZWYsIGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW1wZXJhdGl2ZUhhbmRsZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRJbXBlcmF0aXZlSGFuZGxlKHJlZiwgY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUluc2VydGlvbkVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW5zZXJ0aW9uRWZmZWN0JztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudEluc2VydGlvbkVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VMYXlvdXRFZmZlY3QnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50TGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VNZW1vOiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNZW1vJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbW91bnRNZW1vKGNyZWF0ZSwgZGVwcyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVkdWNlcjogZnVuY3Rpb24gKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZHVjZXInO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBtb3VudFJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVmOiBmdW5jdGlvbiAoaW5pdGlhbFZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWYnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50UmVmKGluaXRpYWxWYWx1ZSk7XG4gICAgfSxcbiAgICB1c2VTdGF0ZTogZnVuY3Rpb24gKGluaXRpYWxTdGF0ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3RhdGUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBtb3VudFN0YXRlKGluaXRpYWxTdGF0ZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlRGVidWdWYWx1ZTogZnVuY3Rpb24gKHZhbHVlLCBmb3JtYXR0ZXJGbikge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVidWdWYWx1ZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnREZWJ1Z1ZhbHVlKCk7XG4gICAgfSxcbiAgICB1c2VEZWZlcnJlZFZhbHVlOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlZmVycmVkVmFsdWUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50RGVmZXJyZWRWYWx1ZSh2YWx1ZSk7XG4gICAgfSxcbiAgICB1c2VUcmFuc2l0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VUcmFuc2l0aW9uJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudFRyYW5zaXRpb24oKTtcbiAgICB9LFxuICAgIHVzZU11dGFibGVTb3VyY2U6IGZ1bmN0aW9uIChzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU11dGFibGVTb3VyY2UnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50TXV0YWJsZVNvdXJjZSgpO1xuICAgIH0sXG4gICAgdXNlU3luY0V4dGVybmFsU3RvcmU6IGZ1bmN0aW9uIChzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3luY0V4dGVybmFsU3RvcmUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50U3luY0V4dGVybmFsU3RvcmUoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpO1xuICAgIH0sXG4gICAgdXNlSWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUlkJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudElkKCk7XG4gICAgfSxcbiAgICB1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6IGVuYWJsZU5ld1JlY29uY2lsZXJcbiAgfTtcblxuICBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFViA9IHtcbiAgICByZWFkQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIHdhcm5JbnZhbGlkQ29udGV4dEFjY2VzcygpO1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgIH0sXG4gICAgdXNlQ2FsbGJhY2s6IGZ1bmN0aW9uIChjYWxsYmFjaywgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ2FsbGJhY2snO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ29udGV4dCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgIH0sXG4gICAgdXNlRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VFZmZlY3QnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGU6IGZ1bmN0aW9uIChyZWYsIGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW1wZXJhdGl2ZUhhbmRsZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW5zZXJ0aW9uRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbnNlcnRpb25FZmZlY3QnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVJbnNlcnRpb25FZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUxheW91dEVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTGF5b3V0RWZmZWN0JztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlTGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VNZW1vOiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNZW1vJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB1cGRhdGVNZW1vKGNyZWF0ZSwgZGVwcyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVkdWNlcjogZnVuY3Rpb24gKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZHVjZXInO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZVJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVmOiBmdW5jdGlvbiAoaW5pdGlhbFZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWYnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVSZWYoKTtcbiAgICB9LFxuICAgIHVzZVN0YXRlOiBmdW5jdGlvbiAoaW5pdGlhbFN0YXRlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTdGF0ZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdXBkYXRlU3RhdGUoaW5pdGlhbFN0YXRlKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VEZWJ1Z1ZhbHVlOiBmdW5jdGlvbiAodmFsdWUsIGZvcm1hdHRlckZuKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWJ1Z1ZhbHVlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlRGVidWdWYWx1ZSgpO1xuICAgIH0sXG4gICAgdXNlRGVmZXJyZWRWYWx1ZTogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWZlcnJlZFZhbHVlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlRGVmZXJyZWRWYWx1ZSh2YWx1ZSk7XG4gICAgfSxcbiAgICB1c2VUcmFuc2l0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VUcmFuc2l0aW9uJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlVHJhbnNpdGlvbigpO1xuICAgIH0sXG4gICAgdXNlTXV0YWJsZVNvdXJjZTogZnVuY3Rpb24gKHNvdXJjZSwgZ2V0U25hcHNob3QsIHN1YnNjcmliZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTXV0YWJsZVNvdXJjZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZU11dGFibGVTb3VyY2UoKTtcbiAgICB9LFxuICAgIHVzZVN5bmNFeHRlcm5hbFN0b3JlOiBmdW5jdGlvbiAoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN5bmNFeHRlcm5hbFN0b3JlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlU3luY0V4dGVybmFsU3RvcmUoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCk7XG4gICAgfSxcbiAgICB1c2VJZDogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSWQnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVJZCgpO1xuICAgIH0sXG4gICAgdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiBlbmFibGVOZXdSZWNvbmNpbGVyXG4gIH07XG5cbiAgSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uUmVyZW5kZXJJbkRFViA9IHtcbiAgICByZWFkQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIHdhcm5JbnZhbGlkQ29udGV4dEFjY2VzcygpO1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgIH0sXG4gICAgdXNlQ2FsbGJhY2s6IGZ1bmN0aW9uIChjYWxsYmFjaywgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ2FsbGJhY2snO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ29udGV4dCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgIH0sXG4gICAgdXNlRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VFZmZlY3QnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGU6IGZ1bmN0aW9uIChyZWYsIGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW1wZXJhdGl2ZUhhbmRsZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW5zZXJ0aW9uRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbnNlcnRpb25FZmZlY3QnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVJbnNlcnRpb25FZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUxheW91dEVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTGF5b3V0RWZmZWN0JztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlTGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VNZW1vOiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNZW1vJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB1cGRhdGVNZW1vKGNyZWF0ZSwgZGVwcyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVkdWNlcjogZnVuY3Rpb24gKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZHVjZXInO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHJlcmVuZGVyUmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWY6IGZ1bmN0aW9uIChpbml0aWFsVmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZic7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZVJlZigpO1xuICAgIH0sXG4gICAgdXNlU3RhdGU6IGZ1bmN0aW9uIChpbml0aWFsU3RhdGUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN0YXRlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiByZXJlbmRlclN0YXRlKGluaXRpYWxTdGF0ZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlRGVidWdWYWx1ZTogZnVuY3Rpb24gKHZhbHVlLCBmb3JtYXR0ZXJGbikge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVidWdWYWx1ZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZURlYnVnVmFsdWUoKTtcbiAgICB9LFxuICAgIHVzZURlZmVycmVkVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVmZXJyZWRWYWx1ZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHJlcmVuZGVyRGVmZXJyZWRWYWx1ZSh2YWx1ZSk7XG4gICAgfSxcbiAgICB1c2VUcmFuc2l0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VUcmFuc2l0aW9uJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVyZW5kZXJUcmFuc2l0aW9uKCk7XG4gICAgfSxcbiAgICB1c2VNdXRhYmxlU291cmNlOiBmdW5jdGlvbiAoc291cmNlLCBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNdXRhYmxlU291cmNlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlTXV0YWJsZVNvdXJjZSgpO1xuICAgIH0sXG4gICAgdXNlU3luY0V4dGVybmFsU3RvcmU6IGZ1bmN0aW9uIChzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3luY0V4dGVybmFsU3RvcmUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVTeW5jRXh0ZXJuYWxTdG9yZShzdWJzY3JpYmUsIGdldFNuYXBzaG90KTtcbiAgICB9LFxuICAgIHVzZUlkOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJZCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUlkKCk7XG4gICAgfSxcbiAgICB1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6IGVuYWJsZU5ld1JlY29uY2lsZXJcbiAgfTtcbn1cblxudmFyIG5vdyQxID0gU2NoZWR1bGVyLnVuc3RhYmxlX25vdztcbnZhciBjb21taXRUaW1lID0gMDtcbnZhciBsYXlvdXRFZmZlY3RTdGFydFRpbWUgPSAtMTtcbnZhciBwcm9maWxlclN0YXJ0VGltZSA9IC0xO1xudmFyIHBhc3NpdmVFZmZlY3RTdGFydFRpbWUgPSAtMTtcbi8qKlxuICogVHJhY2tzIHdoZXRoZXIgdGhlIGN1cnJlbnQgdXBkYXRlIHdhcyBhIG5lc3RlZC9jYXNjYWRpbmcgdXBkYXRlIChzY2hlZHVsZWQgZnJvbSBhIGxheW91dCBlZmZlY3QpLlxuICpcbiAqIFRoZSBvdmVyYWxsIHNlcXVlbmNlIGlzOlxuICogICAxLiByZW5kZXJcbiAqICAgMi4gY29tbWl0IChhbmQgY2FsbCBgb25SZW5kZXJgLCBgb25Db21taXRgKVxuICogICAzLiBjaGVjayBmb3IgbmVzdGVkIHVwZGF0ZXNcbiAqICAgNC4gZmx1c2ggcGFzc2l2ZSBlZmZlY3RzIChhbmQgY2FsbCBgb25Qb3N0Q29tbWl0YClcbiAqXG4gKiBOZXN0ZWQgdXBkYXRlcyBhcmUgaWRlbnRpZmllZCBpbiBzdGVwIDMgYWJvdmUsXG4gKiBidXQgc3RlcCA0IHN0aWxsIGFwcGxpZXMgdG8gdGhlIHdvcmsgdGhhdCB3YXMganVzdCBjb21taXR0ZWQuXG4gKiBXZSB1c2UgdHdvIGZsYWdzIHRvIHRyYWNrIG5lc3RlZCB1cGRhdGVzIHRoZW46XG4gKiBvbmUgdHJhY2tzIHdoZXRoZXIgdGhlIHVwY29taW5nIHVwZGF0ZSBpcyBhIG5lc3RlZCB1cGRhdGUsXG4gKiBhbmQgdGhlIG90aGVyIHRyYWNrcyB3aGV0aGVyIHRoZSBjdXJyZW50IHVwZGF0ZSB3YXMgYSBuZXN0ZWQgdXBkYXRlLlxuICogVGhlIGZpcnN0IHZhbHVlIGdldHMgc3luY2VkIHRvIHRoZSBzZWNvbmQgYXQgdGhlIHN0YXJ0IG9mIHRoZSByZW5kZXIgcGhhc2UuXG4gKi9cblxudmFyIGN1cnJlbnRVcGRhdGVJc05lc3RlZCA9IGZhbHNlO1xudmFyIG5lc3RlZFVwZGF0ZVNjaGVkdWxlZCA9IGZhbHNlO1xuXG5mdW5jdGlvbiBpc0N1cnJlbnRVcGRhdGVOZXN0ZWQoKSB7XG4gIHJldHVybiBjdXJyZW50VXBkYXRlSXNOZXN0ZWQ7XG59XG5cbmZ1bmN0aW9uIG1hcmtOZXN0ZWRVcGRhdGVTY2hlZHVsZWQoKSB7XG4gIHtcbiAgICBuZXN0ZWRVcGRhdGVTY2hlZHVsZWQgPSB0cnVlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc2V0TmVzdGVkVXBkYXRlRmxhZygpIHtcbiAge1xuICAgIGN1cnJlbnRVcGRhdGVJc05lc3RlZCA9IGZhbHNlO1xuICAgIG5lc3RlZFVwZGF0ZVNjaGVkdWxlZCA9IGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHN5bmNOZXN0ZWRVcGRhdGVGbGFnKCkge1xuICB7XG4gICAgY3VycmVudFVwZGF0ZUlzTmVzdGVkID0gbmVzdGVkVXBkYXRlU2NoZWR1bGVkO1xuICAgIG5lc3RlZFVwZGF0ZVNjaGVkdWxlZCA9IGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldENvbW1pdFRpbWUoKSB7XG4gIHJldHVybiBjb21taXRUaW1lO1xufVxuXG5mdW5jdGlvbiByZWNvcmRDb21taXRUaW1lKCkge1xuXG4gIGNvbW1pdFRpbWUgPSBub3ckMSgpO1xufVxuXG5mdW5jdGlvbiBzdGFydFByb2ZpbGVyVGltZXIoZmliZXIpIHtcblxuICBwcm9maWxlclN0YXJ0VGltZSA9IG5vdyQxKCk7XG5cbiAgaWYgKGZpYmVyLmFjdHVhbFN0YXJ0VGltZSA8IDApIHtcbiAgICBmaWJlci5hY3R1YWxTdGFydFRpbWUgPSBub3ckMSgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHN0b3BQcm9maWxlclRpbWVySWZSdW5uaW5nKGZpYmVyKSB7XG5cbiAgcHJvZmlsZXJTdGFydFRpbWUgPSAtMTtcbn1cblxuZnVuY3Rpb24gc3RvcFByb2ZpbGVyVGltZXJJZlJ1bm5pbmdBbmRSZWNvcmREZWx0YShmaWJlciwgb3ZlcnJpZGVCYXNlVGltZSkge1xuXG4gIGlmIChwcm9maWxlclN0YXJ0VGltZSA+PSAwKSB7XG4gICAgdmFyIGVsYXBzZWRUaW1lID0gbm93JDEoKSAtIHByb2ZpbGVyU3RhcnRUaW1lO1xuICAgIGZpYmVyLmFjdHVhbER1cmF0aW9uICs9IGVsYXBzZWRUaW1lO1xuXG4gICAgaWYgKG92ZXJyaWRlQmFzZVRpbWUpIHtcbiAgICAgIGZpYmVyLnNlbGZCYXNlRHVyYXRpb24gPSBlbGFwc2VkVGltZTtcbiAgICB9XG5cbiAgICBwcm9maWxlclN0YXJ0VGltZSA9IC0xO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlY29yZExheW91dEVmZmVjdER1cmF0aW9uKGZpYmVyKSB7XG5cbiAgaWYgKGxheW91dEVmZmVjdFN0YXJ0VGltZSA+PSAwKSB7XG4gICAgdmFyIGVsYXBzZWRUaW1lID0gbm93JDEoKSAtIGxheW91dEVmZmVjdFN0YXJ0VGltZTtcbiAgICBsYXlvdXRFZmZlY3RTdGFydFRpbWUgPSAtMTsgLy8gU3RvcmUgZHVyYXRpb24gb24gdGhlIG5leHQgbmVhcmVzdCBQcm9maWxlciBhbmNlc3RvclxuICAgIC8vIE9yIHRoZSByb290IChmb3IgdGhlIERldlRvb2xzIFByb2ZpbGVyIHRvIHJlYWQpXG5cbiAgICB2YXIgcGFyZW50RmliZXIgPSBmaWJlci5yZXR1cm47XG5cbiAgICB3aGlsZSAocGFyZW50RmliZXIgIT09IG51bGwpIHtcbiAgICAgIHN3aXRjaCAocGFyZW50RmliZXIudGFnKSB7XG4gICAgICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICAgICAgdmFyIHJvb3QgPSBwYXJlbnRGaWJlci5zdGF0ZU5vZGU7XG4gICAgICAgICAgcm9vdC5lZmZlY3REdXJhdGlvbiArPSBlbGFwc2VkVGltZTtcbiAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgY2FzZSBQcm9maWxlcjpcbiAgICAgICAgICB2YXIgcGFyZW50U3RhdGVOb2RlID0gcGFyZW50RmliZXIuc3RhdGVOb2RlO1xuICAgICAgICAgIHBhcmVudFN0YXRlTm9kZS5lZmZlY3REdXJhdGlvbiArPSBlbGFwc2VkVGltZTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHBhcmVudEZpYmVyID0gcGFyZW50RmliZXIucmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiByZWNvcmRQYXNzaXZlRWZmZWN0RHVyYXRpb24oZmliZXIpIHtcblxuICBpZiAocGFzc2l2ZUVmZmVjdFN0YXJ0VGltZSA+PSAwKSB7XG4gICAgdmFyIGVsYXBzZWRUaW1lID0gbm93JDEoKSAtIHBhc3NpdmVFZmZlY3RTdGFydFRpbWU7XG4gICAgcGFzc2l2ZUVmZmVjdFN0YXJ0VGltZSA9IC0xOyAvLyBTdG9yZSBkdXJhdGlvbiBvbiB0aGUgbmV4dCBuZWFyZXN0IFByb2ZpbGVyIGFuY2VzdG9yXG4gICAgLy8gT3IgdGhlIHJvb3QgKGZvciB0aGUgRGV2VG9vbHMgUHJvZmlsZXIgdG8gcmVhZClcblxuICAgIHZhciBwYXJlbnRGaWJlciA9IGZpYmVyLnJldHVybjtcblxuICAgIHdoaWxlIChwYXJlbnRGaWJlciAhPT0gbnVsbCkge1xuICAgICAgc3dpdGNoIChwYXJlbnRGaWJlci50YWcpIHtcbiAgICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAgICB2YXIgcm9vdCA9IHBhcmVudEZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICAgICAgICByb290LnBhc3NpdmVFZmZlY3REdXJhdGlvbiArPSBlbGFwc2VkVGltZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgY2FzZSBQcm9maWxlcjpcbiAgICAgICAgICB2YXIgcGFyZW50U3RhdGVOb2RlID0gcGFyZW50RmliZXIuc3RhdGVOb2RlO1xuXG4gICAgICAgICAgaWYgKHBhcmVudFN0YXRlTm9kZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gRGV0YWNoZWQgZmliZXJzIGhhdmUgdGhlaXIgc3RhdGUgbm9kZSBjbGVhcmVkIG91dC5cbiAgICAgICAgICAgIC8vIEluIHRoaXMgY2FzZSwgdGhlIHJldHVybiBwb2ludGVyIGlzIGFsc28gY2xlYXJlZCBvdXQsXG4gICAgICAgICAgICAvLyBzbyB3ZSB3b24ndCBiZSBhYmxlIHRvIHJlcG9ydCB0aGUgdGltZSBzcGVudCBpbiB0aGlzIFByb2ZpbGVyJ3Mgc3VidHJlZS5cbiAgICAgICAgICAgIHBhcmVudFN0YXRlTm9kZS5wYXNzaXZlRWZmZWN0RHVyYXRpb24gKz0gZWxhcHNlZFRpbWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBwYXJlbnRGaWJlciA9IHBhcmVudEZpYmVyLnJldHVybjtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc3RhcnRMYXlvdXRFZmZlY3RUaW1lcigpIHtcblxuICBsYXlvdXRFZmZlY3RTdGFydFRpbWUgPSBub3ckMSgpO1xufVxuXG5mdW5jdGlvbiBzdGFydFBhc3NpdmVFZmZlY3RUaW1lcigpIHtcblxuICBwYXNzaXZlRWZmZWN0U3RhcnRUaW1lID0gbm93JDEoKTtcbn1cblxuZnVuY3Rpb24gdHJhbnNmZXJBY3R1YWxEdXJhdGlvbihmaWJlcikge1xuICAvLyBUcmFuc2ZlciB0aW1lIHNwZW50IHJlbmRlcmluZyB0aGVzZSBjaGlsZHJlbiBzbyB3ZSBkb24ndCBsb3NlIGl0XG4gIC8vIGFmdGVyIHdlIHJlcmVuZGVyLiBUaGlzIGlzIHVzZWQgYXMgYSBoZWxwZXIgaW4gc3BlY2lhbCBjYXNlc1xuICAvLyB3aGVyZSB3ZSBzaG91bGQgY291bnQgdGhlIHdvcmsgb2YgbXVsdGlwbGUgcGFzc2VzLlxuICB2YXIgY2hpbGQgPSBmaWJlci5jaGlsZDtcblxuICB3aGlsZSAoY2hpbGQpIHtcbiAgICBmaWJlci5hY3R1YWxEdXJhdGlvbiArPSBjaGlsZC5hY3R1YWxEdXJhdGlvbjtcbiAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlQ2FwdHVyZWRWYWx1ZUF0RmliZXIodmFsdWUsIHNvdXJjZSkge1xuICAvLyBJZiB0aGUgdmFsdWUgaXMgYW4gZXJyb3IsIGNhbGwgdGhpcyBmdW5jdGlvbiBpbW1lZGlhdGVseSBhZnRlciBpdCBpcyB0aHJvd25cbiAgLy8gc28gdGhlIHN0YWNrIGlzIGFjY3VyYXRlLlxuICByZXR1cm4ge1xuICAgIHZhbHVlOiB2YWx1ZSxcbiAgICBzb3VyY2U6IHNvdXJjZSxcbiAgICBzdGFjazogZ2V0U3RhY2tCeUZpYmVySW5EZXZBbmRQcm9kKHNvdXJjZSksXG4gICAgZGlnZXN0OiBudWxsXG4gIH07XG59XG5mdW5jdGlvbiBjcmVhdGVDYXB0dXJlZFZhbHVlKHZhbHVlLCBkaWdlc3QsIHN0YWNrKSB7XG4gIHJldHVybiB7XG4gICAgdmFsdWU6IHZhbHVlLFxuICAgIHNvdXJjZTogbnVsbCxcbiAgICBzdGFjazogc3RhY2sgIT0gbnVsbCA/IHN0YWNrIDogbnVsbCxcbiAgICBkaWdlc3Q6IGRpZ2VzdCAhPSBudWxsID8gZGlnZXN0IDogbnVsbFxuICB9O1xufVxuXG4vLyBUaGlzIG1vZHVsZSBpcyBmb3JrZWQgaW4gZGlmZmVyZW50IGVudmlyb25tZW50cy5cbi8vIEJ5IGRlZmF1bHQsIHJldHVybiBgdHJ1ZWAgdG8gbG9nIGVycm9ycyB0byB0aGUgY29uc29sZS5cbi8vIEZvcmtzIGNhbiByZXR1cm4gYGZhbHNlYCBpZiB0aGlzIGlzbid0IGRlc2lyYWJsZS5cbmZ1bmN0aW9uIHNob3dFcnJvckRpYWxvZyhib3VuZGFyeSwgZXJyb3JJbmZvKSB7XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBsb2dDYXB0dXJlZEVycm9yKGJvdW5kYXJ5LCBlcnJvckluZm8pIHtcbiAgdHJ5IHtcbiAgICB2YXIgbG9nRXJyb3IgPSBzaG93RXJyb3JEaWFsb2coYm91bmRhcnksIGVycm9ySW5mbyk7IC8vIEFsbG93IGluamVjdGVkIHNob3dFcnJvckRpYWxvZygpIHRvIHByZXZlbnQgZGVmYXVsdCBjb25zb2xlLmVycm9yIGxvZ2dpbmcuXG4gICAgLy8gVGhpcyBlbmFibGVzIHJlbmRlcmVycyBsaWtlIFJlYWN0TmF0aXZlIHRvIGJldHRlciBtYW5hZ2UgcmVkYm94IGJlaGF2aW9yLlxuXG4gICAgaWYgKGxvZ0Vycm9yID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBlcnJvciA9IGVycm9ySW5mby52YWx1ZTtcblxuICAgIGlmICh0cnVlKSB7XG4gICAgICB2YXIgc291cmNlID0gZXJyb3JJbmZvLnNvdXJjZTtcbiAgICAgIHZhciBzdGFjayA9IGVycm9ySW5mby5zdGFjaztcbiAgICAgIHZhciBjb21wb25lbnRTdGFjayA9IHN0YWNrICE9PSBudWxsID8gc3RhY2sgOiAnJzsgLy8gQnJvd3NlcnMgc3VwcG9ydCBzaWxlbmNpbmcgdW5jYXVnaHQgZXJyb3JzIGJ5IGNhbGxpbmdcbiAgICAgIC8vIGBwcmV2ZW50RGVmYXVsdCgpYCBpbiB3aW5kb3cgYGVycm9yYCBoYW5kbGVyLlxuICAgICAgLy8gV2UgcmVjb3JkIHRoaXMgaW5mb3JtYXRpb24gYXMgYW4gZXhwYW5kbyBvbiB0aGUgZXJyb3IuXG5cbiAgICAgIGlmIChlcnJvciAhPSBudWxsICYmIGVycm9yLl9zdXBwcmVzc0xvZ2dpbmcpIHtcbiAgICAgICAgaWYgKGJvdW5kYXJ5LnRhZyA9PT0gQ2xhc3NDb21wb25lbnQpIHtcbiAgICAgICAgICAvLyBUaGUgZXJyb3IgaXMgcmVjb3ZlcmFibGUgYW5kIHdhcyBzaWxlbmNlZC5cbiAgICAgICAgICAvLyBJZ25vcmUgaXQgYW5kIGRvbid0IHByaW50IHRoZSBzdGFjayBhZGRlbmR1bS5cbiAgICAgICAgICAvLyBUaGlzIGlzIGhhbmR5IGZvciB0ZXN0aW5nIGVycm9yIGJvdW5kYXJpZXMgd2l0aG91dCBub2lzZS5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gLy8gVGhlIGVycm9yIGlzIGZhdGFsLiBTaW5jZSB0aGUgc2lsZW5jaW5nIG1pZ2h0IGhhdmVcbiAgICAgICAgLy8gYmVlbiBhY2NpZGVudGFsLCB3ZSdsbCBzdXJmYWNlIGl0IGFueXdheS5cbiAgICAgICAgLy8gSG93ZXZlciwgdGhlIGJyb3dzZXIgd291bGQgaGF2ZSBzaWxlbmNlZCB0aGUgb3JpZ2luYWwgZXJyb3JcbiAgICAgICAgLy8gc28gd2UnbGwgcHJpbnQgaXQgZmlyc3QsIGFuZCB0aGVuIHByaW50IHRoZSBzdGFjayBhZGRlbmR1bS5cblxuXG4gICAgICAgIGNvbnNvbGVbJ2Vycm9yJ10oZXJyb3IpOyAvLyBEb24ndCB0cmFuc2Zvcm0gdG8gb3VyIHdyYXBwZXJcbiAgICAgICAgLy8gRm9yIGEgbW9yZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGlzIGJsb2NrLCBzZWU6XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzEzMzg0XG4gICAgICB9XG5cbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gc291cmNlID8gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihzb3VyY2UpIDogbnVsbDtcbiAgICAgIHZhciBjb21wb25lbnROYW1lTWVzc2FnZSA9IGNvbXBvbmVudE5hbWUgPyBcIlRoZSBhYm92ZSBlcnJvciBvY2N1cnJlZCBpbiB0aGUgPFwiICsgY29tcG9uZW50TmFtZSArIFwiPiBjb21wb25lbnQ6XCIgOiAnVGhlIGFib3ZlIGVycm9yIG9jY3VycmVkIGluIG9uZSBvZiB5b3VyIFJlYWN0IGNvbXBvbmVudHM6JztcbiAgICAgIHZhciBlcnJvckJvdW5kYXJ5TWVzc2FnZTtcblxuICAgICAgaWYgKGJvdW5kYXJ5LnRhZyA9PT0gSG9zdFJvb3QpIHtcbiAgICAgICAgZXJyb3JCb3VuZGFyeU1lc3NhZ2UgPSAnQ29uc2lkZXIgYWRkaW5nIGFuIGVycm9yIGJvdW5kYXJ5IHRvIHlvdXIgdHJlZSB0byBjdXN0b21pemUgZXJyb3IgaGFuZGxpbmcgYmVoYXZpb3IuXFxuJyArICdWaXNpdCBodHRwczovL3JlYWN0anMub3JnL2xpbmsvZXJyb3ItYm91bmRhcmllcyB0byBsZWFybiBtb3JlIGFib3V0IGVycm9yIGJvdW5kYXJpZXMuJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBlcnJvckJvdW5kYXJ5TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoYm91bmRhcnkpIHx8ICdBbm9ueW1vdXMnO1xuICAgICAgICBlcnJvckJvdW5kYXJ5TWVzc2FnZSA9IFwiUmVhY3Qgd2lsbCB0cnkgdG8gcmVjcmVhdGUgdGhpcyBjb21wb25lbnQgdHJlZSBmcm9tIHNjcmF0Y2ggXCIgKyAoXCJ1c2luZyB0aGUgZXJyb3IgYm91bmRhcnkgeW91IHByb3ZpZGVkLCBcIiArIGVycm9yQm91bmRhcnlOYW1lICsgXCIuXCIpO1xuICAgICAgfVxuXG4gICAgICB2YXIgY29tYmluZWRNZXNzYWdlID0gY29tcG9uZW50TmFtZU1lc3NhZ2UgKyBcIlxcblwiICsgY29tcG9uZW50U3RhY2sgKyBcIlxcblxcblwiICsgKFwiXCIgKyBlcnJvckJvdW5kYXJ5TWVzc2FnZSk7IC8vIEluIGRldmVsb3BtZW50LCB3ZSBwcm92aWRlIG91ciBvd24gbWVzc2FnZSB3aXRoIGp1c3QgdGhlIGNvbXBvbmVudCBzdGFjay5cbiAgICAgIC8vIFdlIGRvbid0IGluY2x1ZGUgdGhlIG9yaWdpbmFsIGVycm9yIG1lc3NhZ2UgYW5kIEpTIHN0YWNrIGJlY2F1c2UgdGhlIGJyb3dzZXJcbiAgICAgIC8vIGhhcyBhbHJlYWR5IHByaW50ZWQgaXQuIEV2ZW4gaWYgdGhlIGFwcGxpY2F0aW9uIHN3YWxsb3dzIHRoZSBlcnJvciwgaXQgaXMgc3RpbGxcbiAgICAgIC8vIGRpc3BsYXllZCBieSB0aGUgYnJvd3NlciB0aGFua3MgdG8gdGhlIERFVi1vbmx5IGZha2UgZXZlbnQgdHJpY2sgaW4gUmVhY3RFcnJvclV0aWxzLlxuXG4gICAgICBjb25zb2xlWydlcnJvciddKGNvbWJpbmVkTWVzc2FnZSk7IC8vIERvbid0IHRyYW5zZm9ybSB0byBvdXIgd3JhcHBlclxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJbiBwcm9kdWN0aW9uLCB3ZSBwcmludCB0aGUgZXJyb3IgZGlyZWN0bHkuXG4gICAgICAvLyBUaGlzIHdpbGwgaW5jbHVkZSB0aGUgbWVzc2FnZSwgdGhlIEpTIHN0YWNrLCBhbmQgYW55dGhpbmcgdGhlIGJyb3dzZXIgd2FudHMgdG8gc2hvdy5cbiAgICAgIC8vIFdlIHBhc3MgdGhlIGVycm9yIG9iamVjdCBpbnN0ZWFkIG9mIGN1c3RvbSBtZXNzYWdlIHNvIHRoYXQgdGhlIGJyb3dzZXIgZGlzcGxheXMgdGhlIGVycm9yIG5hdGl2ZWx5LlxuICAgICAgY29uc29sZVsnZXJyb3InXShlcnJvcik7IC8vIERvbid0IHRyYW5zZm9ybSB0byBvdXIgd3JhcHBlclxuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIFRoaXMgbWV0aG9kIG11c3Qgbm90IHRocm93LCBvciBSZWFjdCBpbnRlcm5hbCBzdGF0ZSB3aWxsIGdldCBtZXNzZWQgdXAuXG4gICAgLy8gSWYgY29uc29sZS5lcnJvciBpcyBvdmVycmlkZGVuLCBvciBsb2dDYXB0dXJlZEVycm9yKCkgc2hvd3MgYSBkaWFsb2cgdGhhdCB0aHJvd3MsXG4gICAgLy8gd2Ugd2FudCB0byByZXBvcnQgdGhpcyBlcnJvciBvdXRzaWRlIG9mIHRoZSBub3JtYWwgc3RhY2sgYXMgYSBsYXN0IHJlc29ydC5cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzEzMTg4XG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH0pO1xuICB9XG59XG5cbnZhciBQb3NzaWJseVdlYWtNYXAkMSA9IHR5cGVvZiBXZWFrTWFwID09PSAnZnVuY3Rpb24nID8gV2Vha01hcCA6IE1hcDtcblxuZnVuY3Rpb24gY3JlYXRlUm9vdEVycm9yVXBkYXRlKGZpYmVyLCBlcnJvckluZm8sIGxhbmUpIHtcbiAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVVwZGF0ZShOb1RpbWVzdGFtcCwgbGFuZSk7IC8vIFVubW91bnQgdGhlIHJvb3QgYnkgcmVuZGVyaW5nIG51bGwuXG5cbiAgdXBkYXRlLnRhZyA9IENhcHR1cmVVcGRhdGU7IC8vIENhdXRpb246IFJlYWN0IERldlRvb2xzIGN1cnJlbnRseSBkZXBlbmRzIG9uIHRoaXMgcHJvcGVydHlcbiAgLy8gYmVpbmcgY2FsbGVkIFwiZWxlbWVudFwiLlxuXG4gIHVwZGF0ZS5wYXlsb2FkID0ge1xuICAgIGVsZW1lbnQ6IG51bGxcbiAgfTtcbiAgdmFyIGVycm9yID0gZXJyb3JJbmZvLnZhbHVlO1xuXG4gIHVwZGF0ZS5jYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICBvblVuY2F1Z2h0RXJyb3IoZXJyb3IpO1xuICAgIGxvZ0NhcHR1cmVkRXJyb3IoZmliZXIsIGVycm9ySW5mbyk7XG4gIH07XG5cbiAgcmV0dXJuIHVwZGF0ZTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQ2xhc3NFcnJvclVwZGF0ZShmaWJlciwgZXJyb3JJbmZvLCBsYW5lKSB7XG4gIHZhciB1cGRhdGUgPSBjcmVhdGVVcGRhdGUoTm9UaW1lc3RhbXAsIGxhbmUpO1xuICB1cGRhdGUudGFnID0gQ2FwdHVyZVVwZGF0ZTtcbiAgdmFyIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvciA9IGZpYmVyLnR5cGUuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yO1xuXG4gIGlmICh0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdmFyIGVycm9yJDEgPSBlcnJvckluZm8udmFsdWU7XG5cbiAgICB1cGRhdGUucGF5bG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IoZXJyb3IkMSk7XG4gICAgfTtcblxuICAgIHVwZGF0ZS5jYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHtcbiAgICAgICAgbWFya0ZhaWxlZEVycm9yQm91bmRhcnlGb3JIb3RSZWxvYWRpbmcoZmliZXIpO1xuICAgICAgfVxuXG4gICAgICBsb2dDYXB0dXJlZEVycm9yKGZpYmVyLCBlcnJvckluZm8pO1xuICAgIH07XG4gIH1cblxuICB2YXIgaW5zdCA9IGZpYmVyLnN0YXRlTm9kZTtcblxuICBpZiAoaW5zdCAhPT0gbnVsbCAmJiB0eXBlb2YgaW5zdC5jb21wb25lbnREaWRDYXRjaCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHVwZGF0ZS5jYWxsYmFjayA9IGZ1bmN0aW9uIGNhbGxiYWNrKCkge1xuICAgICAge1xuICAgICAgICBtYXJrRmFpbGVkRXJyb3JCb3VuZGFyeUZvckhvdFJlbG9hZGluZyhmaWJlcik7XG4gICAgICB9XG5cbiAgICAgIGxvZ0NhcHR1cmVkRXJyb3IoZmliZXIsIGVycm9ySW5mbyk7XG5cbiAgICAgIGlmICh0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIFRvIHByZXNlcnZlIHRoZSBwcmVleGlzdGluZyByZXRyeSBiZWhhdmlvciBvZiBlcnJvciBib3VuZGFyaWVzLFxuICAgICAgICAvLyB3ZSBrZWVwIHRyYWNrIG9mIHdoaWNoIG9uZXMgYWxyZWFkeSBmYWlsZWQgZHVyaW5nIHRoaXMgYmF0Y2guXG4gICAgICAgIC8vIFRoaXMgZ2V0cyByZXNldCBiZWZvcmUgd2UgeWllbGQgYmFjayB0byB0aGUgYnJvd3Nlci5cbiAgICAgICAgLy8gVE9ETzogV2FybiBpbiBzdHJpY3QgbW9kZSBpZiBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgaXNcbiAgICAgICAgLy8gbm90IGRlZmluZWQuXG4gICAgICAgIG1hcmtMZWdhY3lFcnJvckJvdW5kYXJ5QXNGYWlsZWQodGhpcyk7XG4gICAgICB9XG5cbiAgICAgIHZhciBlcnJvciQxID0gZXJyb3JJbmZvLnZhbHVlO1xuICAgICAgdmFyIHN0YWNrID0gZXJyb3JJbmZvLnN0YWNrO1xuICAgICAgdGhpcy5jb21wb25lbnREaWRDYXRjaChlcnJvciQxLCB7XG4gICAgICAgIGNvbXBvbmVudFN0YWNrOiBzdGFjayAhPT0gbnVsbCA/IHN0YWNrIDogJydcbiAgICAgIH0pO1xuXG4gICAgICB7XG4gICAgICAgIGlmICh0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgLy8gSWYgY29tcG9uZW50RGlkQ2F0Y2ggaXMgdGhlIG9ubHkgZXJyb3IgYm91bmRhcnkgbWV0aG9kIGRlZmluZWQsXG4gICAgICAgICAgLy8gdGhlbiBpdCBuZWVkcyB0byBjYWxsIHNldFN0YXRlIHRvIHJlY292ZXIgZnJvbSBlcnJvcnMuXG4gICAgICAgICAgLy8gSWYgbm8gc3RhdGUgdXBkYXRlIGlzIHNjaGVkdWxlZCB0aGVuIHRoZSBib3VuZGFyeSB3aWxsIHN3YWxsb3cgdGhlIGVycm9yLlxuICAgICAgICAgIGlmICghaW5jbHVkZXNTb21lTGFuZShmaWJlci5sYW5lcywgU3luY0xhbmUpKSB7XG4gICAgICAgICAgICBlcnJvcignJXM6IEVycm9yIGJvdW5kYXJpZXMgc2hvdWxkIGltcGxlbWVudCBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IoKS4gJyArICdJbiB0aGF0IG1ldGhvZCwgcmV0dXJuIGEgc3RhdGUgdXBkYXRlIHRvIGRpc3BsYXkgYW4gZXJyb3IgbWVzc2FnZSBvciBmYWxsYmFjayBVSS4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnVW5rbm93bicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICByZXR1cm4gdXBkYXRlO1xufVxuXG5mdW5jdGlvbiBhdHRhY2hQaW5nTGlzdGVuZXIocm9vdCwgd2FrZWFibGUsIGxhbmVzKSB7XG4gIC8vIEF0dGFjaCBhIHBpbmcgbGlzdGVuZXJcbiAgLy9cbiAgLy8gVGhlIGRhdGEgbWlnaHQgcmVzb2x2ZSBiZWZvcmUgd2UgaGF2ZSBhIGNoYW5jZSB0byBjb21taXQgdGhlIGZhbGxiYWNrLiBPcixcbiAgLy8gaW4gdGhlIGNhc2Ugb2YgYSByZWZyZXNoLCB3ZSdsbCBuZXZlciBjb21taXQgYSBmYWxsYmFjay4gU28gd2UgbmVlZCB0b1xuICAvLyBhdHRhY2ggYSBsaXN0ZW5lciBub3cuIFdoZW4gaXQgcmVzb2x2ZXMgKFwicGluZ3NcIiksIHdlIGNhbiBkZWNpZGUgd2hldGhlciB0b1xuICAvLyB0cnkgcmVuZGVyaW5nIHRoZSB0cmVlIGFnYWluLlxuICAvL1xuICAvLyBPbmx5IGF0dGFjaCBhIGxpc3RlbmVyIGlmIG9uZSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0IGZvciB0aGUgbGFuZXNcbiAgLy8gd2UncmUgY3VycmVudGx5IHJlbmRlcmluZyAod2hpY2ggYWN0cyBsaWtlIGEgXCJ0aHJlYWQgSURcIiBoZXJlKS5cbiAgLy9cbiAgLy8gV2Ugb25seSBuZWVkIHRvIGRvIHRoaXMgaW4gY29uY3VycmVudCBtb2RlLiBMZWdhY3kgU3VzcGVuc2UgYWx3YXlzXG4gIC8vIGNvbW1pdHMgZmFsbGJhY2tzIHN5bmNocm9ub3VzbHksIHNvIHRoZXJlIGFyZSBubyBwaW5ncy5cbiAgdmFyIHBpbmdDYWNoZSA9IHJvb3QucGluZ0NhY2hlO1xuICB2YXIgdGhyZWFkSURzO1xuXG4gIGlmIChwaW5nQ2FjaGUgPT09IG51bGwpIHtcbiAgICBwaW5nQ2FjaGUgPSByb290LnBpbmdDYWNoZSA9IG5ldyBQb3NzaWJseVdlYWtNYXAkMSgpO1xuICAgIHRocmVhZElEcyA9IG5ldyBTZXQoKTtcbiAgICBwaW5nQ2FjaGUuc2V0KHdha2VhYmxlLCB0aHJlYWRJRHMpO1xuICB9IGVsc2Uge1xuICAgIHRocmVhZElEcyA9IHBpbmdDYWNoZS5nZXQod2FrZWFibGUpO1xuXG4gICAgaWYgKHRocmVhZElEcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJlYWRJRHMgPSBuZXcgU2V0KCk7XG4gICAgICBwaW5nQ2FjaGUuc2V0KHdha2VhYmxlLCB0aHJlYWRJRHMpO1xuICAgIH1cbiAgfVxuXG4gIGlmICghdGhyZWFkSURzLmhhcyhsYW5lcykpIHtcbiAgICAvLyBNZW1vaXplIHVzaW5nIHRoZSB0aHJlYWQgSUQgdG8gcHJldmVudCByZWR1bmRhbnQgbGlzdGVuZXJzLlxuICAgIHRocmVhZElEcy5hZGQobGFuZXMpO1xuICAgIHZhciBwaW5nID0gcGluZ1N1c3BlbmRlZFJvb3QuYmluZChudWxsLCByb290LCB3YWtlYWJsZSwgbGFuZXMpO1xuXG4gICAge1xuICAgICAgaWYgKGlzRGV2VG9vbHNQcmVzZW50KSB7XG4gICAgICAgIC8vIElmIHdlIGhhdmUgcGVuZGluZyB3b3JrIHN0aWxsLCByZXN0b3JlIHRoZSBvcmlnaW5hbCB1cGRhdGVyc1xuICAgICAgICByZXN0b3JlUGVuZGluZ1VwZGF0ZXJzKHJvb3QsIGxhbmVzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB3YWtlYWJsZS50aGVuKHBpbmcsIHBpbmcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGF0dGFjaFJldHJ5TGlzdGVuZXIoc3VzcGVuc2VCb3VuZGFyeSwgcm9vdCwgd2FrZWFibGUsIGxhbmVzKSB7XG4gIC8vIFJldHJ5IGxpc3RlbmVyXG4gIC8vXG4gIC8vIElmIHRoZSBmYWxsYmFjayBkb2VzIGNvbW1pdCwgd2UgbmVlZCB0byBhdHRhY2ggYSBkaWZmZXJlbnQgdHlwZSBvZlxuICAvLyBsaXN0ZW5lci4gVGhpcyBvbmUgc2NoZWR1bGVzIGFuIHVwZGF0ZSBvbiB0aGUgU3VzcGVuc2UgYm91bmRhcnkgdG8gdHVyblxuICAvLyB0aGUgZmFsbGJhY2sgc3RhdGUgb2ZmLlxuICAvL1xuICAvLyBTdGFzaCB0aGUgd2FrZWFibGUgb24gdGhlIGJvdW5kYXJ5IGZpYmVyIHNvIHdlIGNhbiBhY2Nlc3MgaXQgaW4gdGhlXG4gIC8vIGNvbW1pdCBwaGFzZS5cbiAgLy9cbiAgLy8gV2hlbiB0aGUgd2FrZWFibGUgcmVzb2x2ZXMsIHdlJ2xsIGF0dGVtcHQgdG8gcmVuZGVyIHRoZSBib3VuZGFyeVxuICAvLyBhZ2FpbiAoXCJyZXRyeVwiKS5cbiAgdmFyIHdha2VhYmxlcyA9IHN1c3BlbnNlQm91bmRhcnkudXBkYXRlUXVldWU7XG5cbiAgaWYgKHdha2VhYmxlcyA9PT0gbnVsbCkge1xuICAgIHZhciB1cGRhdGVRdWV1ZSA9IG5ldyBTZXQoKTtcbiAgICB1cGRhdGVRdWV1ZS5hZGQod2FrZWFibGUpO1xuICAgIHN1c3BlbnNlQm91bmRhcnkudXBkYXRlUXVldWUgPSB1cGRhdGVRdWV1ZTtcbiAgfSBlbHNlIHtcbiAgICB3YWtlYWJsZXMuYWRkKHdha2VhYmxlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXNldFN1c3BlbmRlZENvbXBvbmVudChzb3VyY2VGaWJlciwgcm9vdFJlbmRlckxhbmVzKSB7XG4gIC8vIEEgbGVnYWN5IG1vZGUgU3VzcGVuc2UgcXVpcmssIG9ubHkgcmVsZXZhbnQgdG8gaG9vayBjb21wb25lbnRzLlxuXG5cbiAgdmFyIHRhZyA9IHNvdXJjZUZpYmVyLnRhZztcblxuICBpZiAoKHNvdXJjZUZpYmVyLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSAmJiAodGFnID09PSBGdW5jdGlvbkNvbXBvbmVudCB8fCB0YWcgPT09IEZvcndhcmRSZWYgfHwgdGFnID09PSBTaW1wbGVNZW1vQ29tcG9uZW50KSkge1xuICAgIHZhciBjdXJyZW50U291cmNlID0gc291cmNlRmliZXIuYWx0ZXJuYXRlO1xuXG4gICAgaWYgKGN1cnJlbnRTb3VyY2UpIHtcbiAgICAgIHNvdXJjZUZpYmVyLnVwZGF0ZVF1ZXVlID0gY3VycmVudFNvdXJjZS51cGRhdGVRdWV1ZTtcbiAgICAgIHNvdXJjZUZpYmVyLm1lbW9pemVkU3RhdGUgPSBjdXJyZW50U291cmNlLm1lbW9pemVkU3RhdGU7XG4gICAgICBzb3VyY2VGaWJlci5sYW5lcyA9IGN1cnJlbnRTb3VyY2UubGFuZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNvdXJjZUZpYmVyLnVwZGF0ZVF1ZXVlID0gbnVsbDtcbiAgICAgIHNvdXJjZUZpYmVyLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXROZWFyZXN0U3VzcGVuc2VCb3VuZGFyeVRvQ2FwdHVyZShyZXR1cm5GaWJlcikge1xuICB2YXIgbm9kZSA9IHJldHVybkZpYmVyO1xuXG4gIGRvIHtcbiAgICBpZiAobm9kZS50YWcgPT09IFN1c3BlbnNlQ29tcG9uZW50ICYmIHNob3VsZENhcHR1cmVTdXNwZW5zZShub2RlKSkge1xuICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfSAvLyBUaGlzIGJvdW5kYXJ5IGFscmVhZHkgY2FwdHVyZWQgZHVyaW5nIHRoaXMgcmVuZGVyLiBDb250aW51ZSB0byB0aGUgbmV4dFxuICAgIC8vIGJvdW5kYXJ5LlxuXG5cbiAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gIH0gd2hpbGUgKG5vZGUgIT09IG51bGwpO1xuXG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBtYXJrU3VzcGVuc2VCb3VuZGFyeVNob3VsZENhcHR1cmUoc3VzcGVuc2VCb3VuZGFyeSwgcmV0dXJuRmliZXIsIHNvdXJjZUZpYmVyLCByb290LCByb290UmVuZGVyTGFuZXMpIHtcbiAgLy8gVGhpcyBtYXJrcyBhIFN1c3BlbnNlIGJvdW5kYXJ5IHNvIHRoYXQgd2hlbiB3ZSdyZSB1bndpbmRpbmcgdGhlIHN0YWNrLFxuICAvLyBpdCBjYXB0dXJlcyB0aGUgc3VzcGVuZGVkIFwiZXhjZXB0aW9uXCIgYW5kIGRvZXMgYSBzZWNvbmQgKGZhbGxiYWNrKSBwYXNzLlxuICBpZiAoKHN1c3BlbnNlQm91bmRhcnkubW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlKSB7XG4gICAgLy8gTGVnYWN5IE1vZGUgU3VzcGVuc2VcbiAgICAvL1xuICAgIC8vIElmIHRoZSBib3VuZGFyeSBpcyBpbiBsZWdhY3kgbW9kZSwgd2Ugc2hvdWxkICpub3QqXG4gICAgLy8gc3VzcGVuZCB0aGUgY29tbWl0LiBQcmV0ZW5kIGFzIGlmIHRoZSBzdXNwZW5kZWQgY29tcG9uZW50IHJlbmRlcmVkXG4gICAgLy8gbnVsbCBhbmQga2VlcCByZW5kZXJpbmcuIFdoZW4gdGhlIFN1c3BlbnNlIGJvdW5kYXJ5IGNvbXBsZXRlcyxcbiAgICAvLyB3ZSdsbCBkbyBhIHNlY29uZCBwYXNzIHRvIHJlbmRlciB0aGUgZmFsbGJhY2suXG4gICAgaWYgKHN1c3BlbnNlQm91bmRhcnkgPT09IHJldHVybkZpYmVyKSB7XG4gICAgICAvLyBTcGVjaWFsIGNhc2Ugd2hlcmUgd2Ugc3VzcGVuZGVkIHdoaWxlIHJlY29uY2lsaW5nIHRoZSBjaGlsZHJlbiBvZlxuICAgICAgLy8gYSBTdXNwZW5zZSBib3VuZGFyeSdzIGlubmVyIE9mZnNjcmVlbiB3cmFwcGVyIGZpYmVyLiBUaGlzIGhhcHBlbnNcbiAgICAgIC8vIHdoZW4gYSBSZWFjdC5sYXp5IGNvbXBvbmVudCBpcyBhIGRpcmVjdCBjaGlsZCBvZiBhXG4gICAgICAvLyBTdXNwZW5zZSBib3VuZGFyeS5cbiAgICAgIC8vXG4gICAgICAvLyBTdXNwZW5zZSBib3VuZGFyaWVzIGFyZSBpbXBsZW1lbnRlZCBhcyBtdWx0aXBsZSBmaWJlcnMsIGJ1dCB0aGV5XG4gICAgICAvLyBhcmUgYSBzaW5nbGUgY29uY2VwdHVhbCB1bml0LiBUaGUgbGVnYWN5IG1vZGUgYmVoYXZpb3Igd2hlcmUgd2VcbiAgICAgIC8vIHByZXRlbmQgdGhlIHN1c3BlbmRlZCBmaWJlciBjb21taXR0ZWQgYXMgYG51bGxgIHdvbid0IHdvcmssXG4gICAgICAvLyBiZWNhdXNlIGluIHRoaXMgY2FzZSB0aGUgXCJzdXNwZW5kZWRcIiBmaWJlciBpcyB0aGUgaW5uZXJcbiAgICAgIC8vIE9mZnNjcmVlbiB3cmFwcGVyLlxuICAgICAgLy9cbiAgICAgIC8vIEJlY2F1c2UgdGhlIGNvbnRlbnRzIG9mIHRoZSBib3VuZGFyeSBoYXZlbid0IHN0YXJ0ZWQgcmVuZGVyaW5nXG4gICAgICAvLyB5ZXQgKGkuZS4gbm90aGluZyBpbiB0aGUgdHJlZSBoYXMgcGFydGlhbGx5IHJlbmRlcmVkKSB3ZSBjYW5cbiAgICAgIC8vIHN3aXRjaCB0byB0aGUgcmVndWxhciwgY29uY3VycmVudCBtb2RlIGJlaGF2aW9yOiBtYXJrIHRoZVxuICAgICAgLy8gYm91bmRhcnkgd2l0aCBTaG91bGRDYXB0dXJlIGFuZCBlbnRlciB0aGUgdW53aW5kIHBoYXNlLlxuICAgICAgc3VzcGVuc2VCb3VuZGFyeS5mbGFncyB8PSBTaG91bGRDYXB0dXJlO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdXNwZW5zZUJvdW5kYXJ5LmZsYWdzIHw9IERpZENhcHR1cmU7XG4gICAgICBzb3VyY2VGaWJlci5mbGFncyB8PSBGb3JjZVVwZGF0ZUZvckxlZ2FjeVN1c3BlbnNlOyAvLyBXZSdyZSBnb2luZyB0byBjb21taXQgdGhpcyBmaWJlciBldmVuIHRob3VnaCBpdCBkaWRuJ3QgY29tcGxldGUuXG4gICAgICAvLyBCdXQgd2Ugc2hvdWxkbid0IGNhbGwgYW55IGxpZmVjeWNsZSBtZXRob2RzIG9yIGNhbGxiYWNrcy4gUmVtb3ZlXG4gICAgICAvLyBhbGwgbGlmZWN5Y2xlIGVmZmVjdCB0YWdzLlxuXG4gICAgICBzb3VyY2VGaWJlci5mbGFncyAmPSB+KExpZmVjeWNsZUVmZmVjdE1hc2sgfCBJbmNvbXBsZXRlKTtcblxuICAgICAgaWYgKHNvdXJjZUZpYmVyLnRhZyA9PT0gQ2xhc3NDb21wb25lbnQpIHtcbiAgICAgICAgdmFyIGN1cnJlbnRTb3VyY2VGaWJlciA9IHNvdXJjZUZpYmVyLmFsdGVybmF0ZTtcblxuICAgICAgICBpZiAoY3VycmVudFNvdXJjZUZpYmVyID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyBhIG5ldyBtb3VudC4gQ2hhbmdlIHRoZSB0YWcgc28gaXQncyBub3QgbWlzdGFrZW4gZm9yIGFcbiAgICAgICAgICAvLyBjb21wbGV0ZWQgY2xhc3MgY29tcG9uZW50LiBGb3IgZXhhbXBsZSwgd2Ugc2hvdWxkIG5vdCBjYWxsXG4gICAgICAgICAgLy8gY29tcG9uZW50V2lsbFVubW91bnQgaWYgaXQgaXMgZGVsZXRlZC5cbiAgICAgICAgICBzb3VyY2VGaWJlci50YWcgPSBJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gV2hlbiB3ZSB0cnkgcmVuZGVyaW5nIGFnYWluLCB3ZSBzaG91bGQgbm90IHJldXNlIHRoZSBjdXJyZW50IGZpYmVyLFxuICAgICAgICAgIC8vIHNpbmNlIGl0J3Mga25vd24gdG8gYmUgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlLiBVc2UgYSBmb3JjZSB1cGRhdGUgdG9cbiAgICAgICAgICAvLyBwcmV2ZW50IGEgYmFpbCBvdXQuXG4gICAgICAgICAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVVwZGF0ZShOb1RpbWVzdGFtcCwgU3luY0xhbmUpO1xuICAgICAgICAgIHVwZGF0ZS50YWcgPSBGb3JjZVVwZGF0ZTtcbiAgICAgICAgICBlbnF1ZXVlVXBkYXRlKHNvdXJjZUZpYmVyLCB1cGRhdGUsIFN5bmNMYW5lKTtcbiAgICAgICAgfVxuICAgICAgfSAvLyBUaGUgc291cmNlIGZpYmVyIGRpZCBub3QgY29tcGxldGUuIE1hcmsgaXQgd2l0aCBTeW5jIHByaW9yaXR5IHRvXG4gICAgICAvLyBpbmRpY2F0ZSB0aGF0IGl0IHN0aWxsIGhhcyBwZW5kaW5nIHdvcmsuXG5cblxuICAgICAgc291cmNlRmliZXIubGFuZXMgPSBtZXJnZUxhbmVzKHNvdXJjZUZpYmVyLmxhbmVzLCBTeW5jTGFuZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1c3BlbnNlQm91bmRhcnk7XG4gIH0gLy8gQ29uZmlybWVkIHRoYXQgdGhlIGJvdW5kYXJ5IGlzIGluIGEgY29uY3VycmVudCBtb2RlIHRyZWUuIENvbnRpbnVlXG4gIC8vIHdpdGggdGhlIG5vcm1hbCBzdXNwZW5kIHBhdGguXG4gIC8vXG4gIC8vIEFmdGVyIHRoaXMgd2UnbGwgdXNlIGEgc2V0IG9mIGhldXJpc3RpY3MgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhpc1xuICAvLyByZW5kZXIgcGFzcyB3aWxsIHJ1biB0byBjb21wbGV0aW9uIG9yIHJlc3RhcnQgb3IgXCJzdXNwZW5kXCIgdGhlIGNvbW1pdC5cbiAgLy8gVGhlIGFjdHVhbCBsb2dpYyBmb3IgdGhpcyBpcyBzcHJlYWQgb3V0IGluIGRpZmZlcmVudCBwbGFjZXMuXG4gIC8vXG4gIC8vIFRoaXMgZmlyc3QgcHJpbmNpcGxlIGlzIHRoYXQgaWYgd2UncmUgZ29pbmcgdG8gc3VzcGVuZCB3aGVuIHdlIGNvbXBsZXRlXG4gIC8vIGEgcm9vdCwgdGhlbiB3ZSBzaG91bGQgYWxzbyByZXN0YXJ0IGlmIHdlIGdldCBhbiB1cGRhdGUgb3IgcGluZyB0aGF0XG4gIC8vIG1pZ2h0IHVuc3VzcGVuZCBpdCwgYW5kIHZpY2UgdmVyc2EuIFRoZSBvbmx5IHJlYXNvbiB0byBzdXNwZW5kIGlzXG4gIC8vIGJlY2F1c2UgeW91IHRoaW5rIHlvdSBtaWdodCB3YW50IHRvIHJlc3RhcnQgYmVmb3JlIGNvbW1pdHRpbmcuIEhvd2V2ZXIsXG4gIC8vIGl0IGRvZXNuJ3QgbWFrZSBzZW5zZSB0byByZXN0YXJ0IG9ubHkgd2hpbGUgaW4gdGhlIHBlcmlvZCB3ZSdyZSBzdXNwZW5kZWQuXG4gIC8vXG4gIC8vIFJlc3RhcnRpbmcgdG9vIGFnZ3Jlc3NpdmVseSBpcyBhbHNvIG5vdCBnb29kIGJlY2F1c2UgaXQgc3RhcnZlcyBvdXQgYW55XG4gIC8vIGludGVybWVkaWF0ZSBsb2FkaW5nIHN0YXRlLiBTbyB3ZSB1c2UgaGV1cmlzdGljcyB0byBkZXRlcm1pbmUgd2hlbi5cbiAgLy8gU3VzcGVuc2UgSGV1cmlzdGljc1xuICAvL1xuICAvLyBJZiBub3RoaW5nIHRocmV3IGEgUHJvbWlzZSBvciBhbGwgdGhlIHNhbWUgZmFsbGJhY2tzIGFyZSBhbHJlYWR5IHNob3dpbmcsXG4gIC8vIHRoZW4gZG9uJ3Qgc3VzcGVuZC9yZXN0YXJ0LlxuICAvL1xuICAvLyBJZiB0aGlzIGlzIGFuIGluaXRpYWwgcmVuZGVyIG9mIGEgbmV3IHRyZWUgb2YgU3VzcGVuc2UgYm91bmRhcmllcyBhbmRcbiAgLy8gdGhvc2UgdHJpZ2dlciBhIGZhbGxiYWNrLCB0aGVuIGRvbid0IHN1c3BlbmQvcmVzdGFydC4gV2Ugd2FudCB0byBlbnN1cmVcbiAgLy8gdGhhdCB3ZSBjYW4gc2hvdyB0aGUgaW5pdGlhbCBsb2FkaW5nIHN0YXRlIGFzIHF1aWNrbHkgYXMgcG9zc2libGUuXG4gIC8vXG4gIC8vIElmIHdlIGhpdCBhIFwiRGVsYXllZFwiIGNhc2UsIHN1Y2ggYXMgd2hlbiB3ZSdkIHN3aXRjaCBmcm9tIGNvbnRlbnQgYmFjayBpbnRvXG4gIC8vIGEgZmFsbGJhY2ssIHRoZW4gd2Ugc2hvdWxkIGFsd2F5cyBzdXNwZW5kL3Jlc3RhcnQuIFRyYW5zaXRpb25zIGFwcGx5XG4gIC8vIHRvIHRoaXMgY2FzZS4gSWYgbm9uZSBpcyBkZWZpbmVkLCBKTkQgaXMgdXNlZCBpbnN0ZWFkLlxuICAvL1xuICAvLyBJZiB3ZSdyZSBhbHJlYWR5IHNob3dpbmcgYSBmYWxsYmFjayBhbmQgaXQgZ2V0cyBcInJldHJpZWRcIiwgYWxsb3dpbmcgdXMgdG8gc2hvd1xuICAvLyBhbm90aGVyIGxldmVsLCBidXQgdGhlcmUncyBzdGlsbCBhbiBpbm5lciBib3VuZGFyeSB0aGF0IHdvdWxkIHNob3cgYSBmYWxsYmFjayxcbiAgLy8gdGhlbiB3ZSBzdXNwZW5kL3Jlc3RhcnQgZm9yIDUwMG1zIHNpbmNlIHRoZSBsYXN0IHRpbWUgd2Ugc2hvd2VkIGEgZmFsbGJhY2tcbiAgLy8gYW55d2hlcmUgaW4gdGhlIHRyZWUuIFRoaXMgZWZmZWN0aXZlbHkgdGhyb3R0bGVzIHByb2dyZXNzaXZlIGxvYWRpbmcgaW50byBhXG4gIC8vIGNvbnNpc3RlbnQgdHJhaW4gb2YgY29tbWl0cy4gVGhpcyBhbHNvIGdpdmVzIHVzIGFuIG9wcG9ydHVuaXR5IHRvIHJlc3RhcnQgdG9cbiAgLy8gZ2V0IHRvIHRoZSBjb21wbGV0ZWQgc3RhdGUgc2xpZ2h0bHkgZWFybGllci5cbiAgLy9cbiAgLy8gSWYgdGhlcmUncyBhbWJpZ3VpdHkgZHVlIHRvIGJhdGNoaW5nIGl0J3MgcmVzb2x2ZWQgaW4gcHJlZmVyZW5jZSBvZjpcbiAgLy8gMSkgXCJkZWxheWVkXCIsIDIpIFwiaW5pdGlhbCByZW5kZXJcIiwgMykgXCJyZXRyeVwiLlxuICAvL1xuICAvLyBXZSB3YW50IHRvIGVuc3VyZSB0aGF0IGEgXCJidXN5XCIgc3RhdGUgZG9lc24ndCBnZXQgZm9yY2UgY29tbWl0dGVkLiBXZSB3YW50IHRvXG4gIC8vIGVuc3VyZSB0aGF0IG5ldyBpbml0aWFsIGxvYWRpbmcgc3RhdGVzIGNhbiBjb21taXQgYXMgc29vbiBhcyBwb3NzaWJsZS5cblxuXG4gIHN1c3BlbnNlQm91bmRhcnkuZmxhZ3MgfD0gU2hvdWxkQ2FwdHVyZTsgLy8gVE9ETzogSSB0aGluayB3ZSBjYW4gcmVtb3ZlIHRoaXMsIHNpbmNlIHdlIG5vdyB1c2UgYERpZENhcHR1cmVgIGluXG4gIC8vIHRoZSBiZWdpbiBwaGFzZSB0byBwcmV2ZW50IGFuIGVhcmx5IGJhaWxvdXQuXG5cbiAgc3VzcGVuc2VCb3VuZGFyeS5sYW5lcyA9IHJvb3RSZW5kZXJMYW5lcztcbiAgcmV0dXJuIHN1c3BlbnNlQm91bmRhcnk7XG59XG5cbmZ1bmN0aW9uIHRocm93RXhjZXB0aW9uKHJvb3QsIHJldHVybkZpYmVyLCBzb3VyY2VGaWJlciwgdmFsdWUsIHJvb3RSZW5kZXJMYW5lcykge1xuICAvLyBUaGUgc291cmNlIGZpYmVyIGRpZCBub3QgY29tcGxldGUuXG4gIHNvdXJjZUZpYmVyLmZsYWdzIHw9IEluY29tcGxldGU7XG5cbiAge1xuICAgIGlmIChpc0RldlRvb2xzUHJlc2VudCkge1xuICAgICAgLy8gSWYgd2UgaGF2ZSBwZW5kaW5nIHdvcmsgc3RpbGwsIHJlc3RvcmUgdGhlIG9yaWdpbmFsIHVwZGF0ZXJzXG4gICAgICByZXN0b3JlUGVuZGluZ1VwZGF0ZXJzKHJvb3QsIHJvb3RSZW5kZXJMYW5lcyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHZhbHVlLnRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAvLyBUaGlzIGlzIGEgd2FrZWFibGUuIFRoZSBjb21wb25lbnQgc3VzcGVuZGVkLlxuICAgIHZhciB3YWtlYWJsZSA9IHZhbHVlO1xuICAgIHJlc2V0U3VzcGVuZGVkQ29tcG9uZW50KHNvdXJjZUZpYmVyKTtcblxuICAgIHtcbiAgICAgIGlmIChnZXRJc0h5ZHJhdGluZygpICYmIHNvdXJjZUZpYmVyLm1vZGUgJiBDb25jdXJyZW50TW9kZSkge1xuICAgICAgICBtYXJrRGlkVGhyb3dXaGlsZUh5ZHJhdGluZ0RFVigpO1xuICAgICAgfVxuICAgIH1cblxuXG4gICAgdmFyIHN1c3BlbnNlQm91bmRhcnkgPSBnZXROZWFyZXN0U3VzcGVuc2VCb3VuZGFyeVRvQ2FwdHVyZShyZXR1cm5GaWJlcik7XG5cbiAgICBpZiAoc3VzcGVuc2VCb3VuZGFyeSAhPT0gbnVsbCkge1xuICAgICAgc3VzcGVuc2VCb3VuZGFyeS5mbGFncyAmPSB+Rm9yY2VDbGllbnRSZW5kZXI7XG4gICAgICBtYXJrU3VzcGVuc2VCb3VuZGFyeVNob3VsZENhcHR1cmUoc3VzcGVuc2VCb3VuZGFyeSwgcmV0dXJuRmliZXIsIHNvdXJjZUZpYmVyLCByb290LCByb290UmVuZGVyTGFuZXMpOyAvLyBXZSBvbmx5IGF0dGFjaCBwaW5nIGxpc3RlbmVycyBpbiBjb25jdXJyZW50IG1vZGUuIExlZ2FjeSBTdXNwZW5zZSBhbHdheXNcbiAgICAgIC8vIGNvbW1pdHMgZmFsbGJhY2tzIHN5bmNocm9ub3VzbHksIHNvIHRoZXJlIGFyZSBubyBwaW5ncy5cblxuICAgICAgaWYgKHN1c3BlbnNlQm91bmRhcnkubW9kZSAmIENvbmN1cnJlbnRNb2RlKSB7XG4gICAgICAgIGF0dGFjaFBpbmdMaXN0ZW5lcihyb290LCB3YWtlYWJsZSwgcm9vdFJlbmRlckxhbmVzKTtcbiAgICAgIH1cblxuICAgICAgYXR0YWNoUmV0cnlMaXN0ZW5lcihzdXNwZW5zZUJvdW5kYXJ5LCByb290LCB3YWtlYWJsZSk7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5vIGJvdW5kYXJ5IHdhcyBmb3VuZC4gVW5sZXNzIHRoaXMgaXMgYSBzeW5jIHVwZGF0ZSwgdGhpcyBpcyBPSy5cbiAgICAgIC8vIFdlIGNhbiBzdXNwZW5kIGFuZCB3YWl0IGZvciBtb3JlIGRhdGEgdG8gYXJyaXZlLlxuICAgICAgaWYgKCFpbmNsdWRlc1N5bmNMYW5lKHJvb3RSZW5kZXJMYW5lcykpIHtcbiAgICAgICAgLy8gVGhpcyBpcyBub3QgYSBzeW5jIHVwZGF0ZS4gU3VzcGVuZC4gU2luY2Ugd2UncmUgbm90IGFjdGl2YXRpbmcgYVxuICAgICAgICAvLyBTdXNwZW5zZSBib3VuZGFyeSwgdGhpcyB3aWxsIHVud2luZCBhbGwgdGhlIHdheSB0byB0aGUgcm9vdCB3aXRob3V0XG4gICAgICAgIC8vIHBlcmZvcm1pbmcgYSBzZWNvbmQgcGFzcyB0byByZW5kZXIgYSBmYWxsYmFjay4gKFRoaXMgaXMgYXJndWFibHkgaG93XG4gICAgICAgIC8vIHJlZnJlc2ggdHJhbnNpdGlvbnMgc2hvdWxkIHdvcmssIHRvbywgc2luY2Ugd2UncmUgbm90IGdvaW5nIHRvIGNvbW1pdFxuICAgICAgICAvLyB0aGUgZmFsbGJhY2tzIGFueXdheS4pXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFRoaXMgY2FzZSBhbHNvIGFwcGxpZXMgdG8gaW5pdGlhbCBoeWRyYXRpb24uXG4gICAgICAgIGF0dGFjaFBpbmdMaXN0ZW5lcihyb290LCB3YWtlYWJsZSwgcm9vdFJlbmRlckxhbmVzKTtcbiAgICAgICAgcmVuZGVyRGlkU3VzcGVuZERlbGF5SWZQb3NzaWJsZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IC8vIFRoaXMgaXMgYSBzeW5jL2Rpc2NyZXRlIHVwZGF0ZS4gV2UgdHJlYXQgdGhpcyBjYXNlIGxpa2UgYW4gZXJyb3JcbiAgICAgIC8vIGJlY2F1c2UgZGlzY3JldGUgcmVuZGVycyBhcmUgZXhwZWN0ZWQgdG8gcHJvZHVjZSBhIGNvbXBsZXRlIHRyZWVcbiAgICAgIC8vIHN5bmNocm9ub3VzbHkgdG8gbWFpbnRhaW4gY29uc2lzdGVuY3kgd2l0aCBleHRlcm5hbCBzdGF0ZS5cblxuXG4gICAgICB2YXIgdW5jYXVnaHRTdXNwZW5zZUVycm9yID0gbmV3IEVycm9yKCdBIGNvbXBvbmVudCBzdXNwZW5kZWQgd2hpbGUgcmVzcG9uZGluZyB0byBzeW5jaHJvbm91cyBpbnB1dC4gVGhpcyAnICsgJ3dpbGwgY2F1c2UgdGhlIFVJIHRvIGJlIHJlcGxhY2VkIHdpdGggYSBsb2FkaW5nIGluZGljYXRvci4gVG8gJyArICdmaXgsIHVwZGF0ZXMgdGhhdCBzdXNwZW5kIHNob3VsZCBiZSB3cmFwcGVkICcgKyAnd2l0aCBzdGFydFRyYW5zaXRpb24uJyk7IC8vIElmIHdlJ3JlIG91dHNpZGUgYSB0cmFuc2l0aW9uLCBmYWxsIHRocm91Z2ggdG8gdGhlIHJlZ3VsYXIgZXJyb3IgcGF0aC5cbiAgICAgIC8vIFRoZSBlcnJvciB3aWxsIGJlIGNhdWdodCBieSB0aGUgbmVhcmVzdCBzdXNwZW5zZSBib3VuZGFyeS5cblxuICAgICAgdmFsdWUgPSB1bmNhdWdodFN1c3BlbnNlRXJyb3I7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIFRoaXMgaXMgYSByZWd1bGFyIGVycm9yLCBub3QgYSBTdXNwZW5zZSB3YWtlYWJsZS5cbiAgICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSAmJiBzb3VyY2VGaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpIHtcbiAgICAgIG1hcmtEaWRUaHJvd1doaWxlSHlkcmF0aW5nREVWKCk7XG5cbiAgICAgIHZhciBfc3VzcGVuc2VCb3VuZGFyeSA9IGdldE5lYXJlc3RTdXNwZW5zZUJvdW5kYXJ5VG9DYXB0dXJlKHJldHVybkZpYmVyKTsgLy8gSWYgdGhlIGVycm9yIHdhcyB0aHJvd24gZHVyaW5nIGh5ZHJhdGlvbiwgd2UgbWF5IGJlIGFibGUgdG8gcmVjb3ZlciBieVxuICAgICAgLy8gZGlzY2FyZGluZyB0aGUgZGVoeWRyYXRlZCBjb250ZW50IGFuZCBzd2l0Y2hpbmcgdG8gYSBjbGllbnQgcmVuZGVyLlxuICAgICAgLy8gSW5zdGVhZCBvZiBzdXJmYWNpbmcgdGhlIGVycm9yLCBmaW5kIHRoZSBuZWFyZXN0IFN1c3BlbnNlIGJvdW5kYXJ5XG4gICAgICAvLyBhbmQgcmVuZGVyIGl0IGFnYWluIHdpdGhvdXQgaHlkcmF0aW9uLlxuXG5cbiAgICAgIGlmIChfc3VzcGVuc2VCb3VuZGFyeSAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoKF9zdXNwZW5zZUJvdW5kYXJ5LmZsYWdzICYgU2hvdWxkQ2FwdHVyZSkgPT09IE5vRmxhZ3MpIHtcbiAgICAgICAgICAvLyBTZXQgYSBmbGFnIHRvIGluZGljYXRlIHRoYXQgd2Ugc2hvdWxkIHRyeSByZW5kZXJpbmcgdGhlIG5vcm1hbFxuICAgICAgICAgIC8vIGNoaWxkcmVuIGFnYWluLCBub3QgdGhlIGZhbGxiYWNrLlxuICAgICAgICAgIF9zdXNwZW5zZUJvdW5kYXJ5LmZsYWdzIHw9IEZvcmNlQ2xpZW50UmVuZGVyO1xuICAgICAgICB9XG5cbiAgICAgICAgbWFya1N1c3BlbnNlQm91bmRhcnlTaG91bGRDYXB0dXJlKF9zdXNwZW5zZUJvdW5kYXJ5LCByZXR1cm5GaWJlciwgc291cmNlRmliZXIsIHJvb3QsIHJvb3RSZW5kZXJMYW5lcyk7IC8vIEV2ZW4gdGhvdWdoIHRoZSB1c2VyIG1heSBub3QgYmUgYWZmZWN0ZWQgYnkgdGhpcyBlcnJvciwgd2Ugc2hvdWxkXG4gICAgICAgIC8vIHN0aWxsIGxvZyBpdCBzbyBpdCBjYW4gYmUgZml4ZWQuXG5cbiAgICAgICAgcXVldWVIeWRyYXRpb25FcnJvcihjcmVhdGVDYXB0dXJlZFZhbHVlQXRGaWJlcih2YWx1ZSwgc291cmNlRmliZXIpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhbHVlID0gY3JlYXRlQ2FwdHVyZWRWYWx1ZUF0RmliZXIodmFsdWUsIHNvdXJjZUZpYmVyKTtcbiAgcmVuZGVyRGlkRXJyb3IodmFsdWUpOyAvLyBXZSBkaWRuJ3QgZmluZCBhIGJvdW5kYXJ5IHRoYXQgY291bGQgaGFuZGxlIHRoaXMgdHlwZSBvZiBleGNlcHRpb24uIFN0YXJ0XG4gIC8vIG92ZXIgYW5kIHRyYXZlcnNlIHBhcmVudCBwYXRoIGFnYWluLCB0aGlzIHRpbWUgdHJlYXRpbmcgdGhlIGV4Y2VwdGlvblxuICAvLyBhcyBhbiBlcnJvci5cblxuICB2YXIgd29ya0luUHJvZ3Jlc3MgPSByZXR1cm5GaWJlcjtcblxuICBkbyB7XG4gICAgc3dpdGNoICh3b3JrSW5Qcm9ncmVzcy50YWcpIHtcbiAgICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgX2Vycm9ySW5mbyA9IHZhbHVlO1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFNob3VsZENhcHR1cmU7XG4gICAgICAgICAgdmFyIGxhbmUgPSBwaWNrQXJiaXRyYXJ5TGFuZShyb290UmVuZGVyTGFuZXMpO1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gbWVyZ2VMYW5lcyh3b3JrSW5Qcm9ncmVzcy5sYW5lcywgbGFuZSk7XG4gICAgICAgICAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVJvb3RFcnJvclVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgX2Vycm9ySW5mbywgbGFuZSk7XG4gICAgICAgICAgZW5xdWV1ZUNhcHR1cmVkVXBkYXRlKHdvcmtJblByb2dyZXNzLCB1cGRhdGUpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICAvLyBDYXB0dXJlIGFuZCByZXRyeVxuICAgICAgICB2YXIgZXJyb3JJbmZvID0gdmFsdWU7XG4gICAgICAgIHZhciBjdG9yID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuXG4gICAgICAgIGlmICgod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBEaWRDYXB0dXJlKSA9PT0gTm9GbGFncyAmJiAodHlwZW9mIGN0b3IuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yID09PSAnZnVuY3Rpb24nIHx8IGluc3RhbmNlICE9PSBudWxsICYmIHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRDYXRjaCA9PT0gJ2Z1bmN0aW9uJyAmJiAhaXNBbHJlYWR5RmFpbGVkTGVnYWN5RXJyb3JCb3VuZGFyeShpbnN0YW5jZSkpKSB7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gU2hvdWxkQ2FwdHVyZTtcblxuICAgICAgICAgIHZhciBfbGFuZSA9IHBpY2tBcmJpdHJhcnlMYW5lKHJvb3RSZW5kZXJMYW5lcyk7XG5cbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IG1lcmdlTGFuZXMod29ya0luUHJvZ3Jlc3MubGFuZXMsIF9sYW5lKTsgLy8gU2NoZWR1bGUgdGhlIGVycm9yIGJvdW5kYXJ5IHRvIHJlLXJlbmRlciB1c2luZyB1cGRhdGVkIHN0YXRlXG5cbiAgICAgICAgICB2YXIgX3VwZGF0ZSA9IGNyZWF0ZUNsYXNzRXJyb3JVcGRhdGUod29ya0luUHJvZ3Jlc3MsIGVycm9ySW5mbywgX2xhbmUpO1xuXG4gICAgICAgICAgZW5xdWV1ZUNhcHR1cmVkVXBkYXRlKHdvcmtJblByb2dyZXNzLCBfdXBkYXRlKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICB3b3JrSW5Qcm9ncmVzcyA9IHdvcmtJblByb2dyZXNzLnJldHVybjtcbiAgfSB3aGlsZSAod29ya0luUHJvZ3Jlc3MgIT09IG51bGwpO1xufVxuXG5mdW5jdGlvbiBnZXRTdXNwZW5kZWRDYWNoZSgpIHtcbiAge1xuICAgIHJldHVybiBudWxsO1xuICB9IC8vIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gYSBTdXNwZW5zZSBib3VuZGFyeSBzdXNwZW5kcy4gSXQgcmV0dXJucyB0aGVcbn1cblxudmFyIFJlYWN0Q3VycmVudE93bmVyJDEgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRPd25lcjtcbnZhciBkaWRSZWNlaXZlVXBkYXRlID0gZmFsc2U7XG52YXIgZGlkV2FybkFib3V0QmFkQ2xhc3M7XG52YXIgZGlkV2FybkFib3V0TW9kdWxlUGF0dGVybkNvbXBvbmVudDtcbnZhciBkaWRXYXJuQWJvdXRDb250ZXh0VHlwZU9uRnVuY3Rpb25Db21wb25lbnQ7XG52YXIgZGlkV2FybkFib3V0R2V0RGVyaXZlZFN0YXRlT25GdW5jdGlvbkNvbXBvbmVudDtcbnZhciBkaWRXYXJuQWJvdXRGdW5jdGlvblJlZnM7XG52YXIgZGlkV2FybkFib3V0UmVhc3NpZ25pbmdQcm9wcztcbnZhciBkaWRXYXJuQWJvdXRSZXZlYWxPcmRlcjtcbnZhciBkaWRXYXJuQWJvdXRUYWlsT3B0aW9ucztcblxue1xuICBkaWRXYXJuQWJvdXRCYWRDbGFzcyA9IHt9O1xuICBkaWRXYXJuQWJvdXRNb2R1bGVQYXR0ZXJuQ29tcG9uZW50ID0ge307XG4gIGRpZFdhcm5BYm91dENvbnRleHRUeXBlT25GdW5jdGlvbkNvbXBvbmVudCA9IHt9O1xuICBkaWRXYXJuQWJvdXRHZXREZXJpdmVkU3RhdGVPbkZ1bmN0aW9uQ29tcG9uZW50ID0ge307XG4gIGRpZFdhcm5BYm91dEZ1bmN0aW9uUmVmcyA9IHt9O1xuICBkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzID0gZmFsc2U7XG4gIGRpZFdhcm5BYm91dFJldmVhbE9yZGVyID0ge307XG4gIGRpZFdhcm5BYm91dFRhaWxPcHRpb25zID0ge307XG59XG5cbmZ1bmN0aW9uIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKSB7XG4gIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgLy8gSWYgdGhpcyBpcyBhIGZyZXNoIG5ldyBjb21wb25lbnQgdGhhdCBoYXNuJ3QgYmVlbiByZW5kZXJlZCB5ZXQsIHdlXG4gICAgLy8gd29uJ3QgdXBkYXRlIGl0cyBjaGlsZCBzZXQgYnkgYXBwbHlpbmcgbWluaW1hbCBzaWRlLWVmZmVjdHMuIEluc3RlYWQsXG4gICAgLy8gd2Ugd2lsbCBhZGQgdGhlbSBhbGwgdG8gdGhlIGNoaWxkIGJlZm9yZSBpdCBnZXRzIHJlbmRlcmVkLiBUaGF0IG1lYW5zXG4gICAgLy8gd2UgY2FuIG9wdGltaXplIHRoaXMgcmVjb25jaWxpYXRpb24gcGFzcyBieSBub3QgdHJhY2tpbmcgc2lkZS1lZmZlY3RzLlxuICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gbW91bnRDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgbnVsbCwgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIH0gZWxzZSB7XG4gICAgLy8gSWYgdGhlIGN1cnJlbnQgY2hpbGQgaXMgdGhlIHNhbWUgYXMgdGhlIHdvcmsgaW4gcHJvZ3Jlc3MsIGl0IG1lYW5zIHRoYXRcbiAgICAvLyB3ZSBoYXZlbid0IHlldCBzdGFydGVkIGFueSB3b3JrIG9uIHRoZXNlIGNoaWxkcmVuLiBUaGVyZWZvcmUsIHdlIHVzZVxuICAgIC8vIHRoZSBjbG9uZSBhbGdvcml0aG0gdG8gY3JlYXRlIGEgY29weSBvZiBhbGwgdGhlIGN1cnJlbnQgY2hpbGRyZW4uXG4gICAgLy8gSWYgd2UgaGFkIGFueSBwcm9ncmVzc2VkIHdvcmsgYWxyZWFkeSwgdGhhdCBpcyBpbnZhbGlkIGF0IHRoaXMgcG9pbnQgc29cbiAgICAvLyBsZXQncyB0aHJvdyBpdCBvdXQuXG4gICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSByZWNvbmNpbGVDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgY3VycmVudC5jaGlsZCwgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZm9yY2VVbm1vdW50Q3VycmVudEFuZFJlY29uY2lsZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcykge1xuICAvLyBUaGlzIGZ1bmN0aW9uIGlzIGZvcmsgb2YgcmVjb25jaWxlQ2hpbGRyZW4uIEl0J3MgdXNlZCBpbiBjYXNlcyB3aGVyZSB3ZVxuICAvLyB3YW50IHRvIHJlY29uY2lsZSB3aXRob3V0IG1hdGNoaW5nIGFnYWluc3QgdGhlIGV4aXN0aW5nIHNldC4gVGhpcyBoYXMgdGhlXG4gIC8vIGVmZmVjdCBvZiBhbGwgY3VycmVudCBjaGlsZHJlbiBiZWluZyB1bm1vdW50ZWQ7IGV2ZW4gaWYgdGhlIHR5cGUgYW5kIGtleVxuICAvLyBhcmUgdGhlIHNhbWUsIHRoZSBvbGQgY2hpbGQgaXMgdW5tb3VudGVkIGFuZCBhIG5ldyBjaGlsZCBpcyBjcmVhdGVkLlxuICAvL1xuICAvLyBUbyBkbyB0aGlzLCB3ZSdyZSBnb2luZyB0byBnbyB0aHJvdWdoIHRoZSByZWNvbmNpbGUgYWxnb3JpdGhtIHR3aWNlLiBJblxuICAvLyB0aGUgZmlyc3QgcGFzcywgd2Ugc2NoZWR1bGUgYSBkZWxldGlvbiBmb3IgYWxsIHRoZSBjdXJyZW50IGNoaWxkcmVuIGJ5XG4gIC8vIHBhc3NpbmcgbnVsbC5cbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSByZWNvbmNpbGVDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgY3VycmVudC5jaGlsZCwgbnVsbCwgcmVuZGVyTGFuZXMpOyAvLyBJbiB0aGUgc2Vjb25kIHBhc3MsIHdlIG1vdW50IHRoZSBuZXcgY2hpbGRyZW4uIFRoZSB0cmljayBoZXJlIGlzIHRoYXQgd2VcbiAgLy8gcGFzcyBudWxsIGluIHBsYWNlIG9mIHdoZXJlIHdlIHVzdWFsbHkgcGFzcyB0aGUgY3VycmVudCBjaGlsZCBzZXQuIFRoaXMgaGFzXG4gIC8vIHRoZSBlZmZlY3Qgb2YgcmVtb3VudGluZyBhbGwgY2hpbGRyZW4gcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZWlyXG4gIC8vIGlkZW50aXRpZXMgbWF0Y2guXG5cbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSByZWNvbmNpbGVDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgbnVsbCwgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUZvcndhcmRSZWYoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJMYW5lcykge1xuICAvLyBUT0RPOiBjdXJyZW50IGNhbiBiZSBub24tbnVsbCBoZXJlIGV2ZW4gaWYgdGhlIGNvbXBvbmVudFxuICAvLyBoYXNuJ3QgeWV0IG1vdW50ZWQuIFRoaXMgaGFwcGVucyBhZnRlciB0aGUgZmlyc3QgcmVuZGVyIHN1c3BlbmRzLlxuICAvLyBXZSdsbCBuZWVkIHRvIGZpZ3VyZSBvdXQgaWYgdGhpcyBpcyBmaW5lIG9yIGNhbiBjYXVzZSBpc3N1ZXMuXG4gIHtcbiAgICBpZiAod29ya0luUHJvZ3Jlc3MudHlwZSAhPT0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUpIHtcbiAgICAgIC8vIExhenkgY29tcG9uZW50IHByb3BzIGNhbid0IGJlIHZhbGlkYXRlZCBpbiBjcmVhdGVFbGVtZW50XG4gICAgICAvLyBiZWNhdXNlIHRoZXkncmUgb25seSBndWFyYW50ZWVkIHRvIGJlIHJlc29sdmVkIGhlcmUuXG4gICAgICB2YXIgaW5uZXJQcm9wVHlwZXMgPSBDb21wb25lbnQucHJvcFR5cGVzO1xuXG4gICAgICBpZiAoaW5uZXJQcm9wVHlwZXMpIHtcbiAgICAgICAgY2hlY2tQcm9wVHlwZXMoaW5uZXJQcm9wVHlwZXMsIG5leHRQcm9wcywgLy8gUmVzb2x2ZWQgcHJvcHNcbiAgICAgICAgJ3Byb3AnLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoQ29tcG9uZW50KSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIHJlbmRlciA9IENvbXBvbmVudC5yZW5kZXI7XG4gIHZhciByZWYgPSB3b3JrSW5Qcm9ncmVzcy5yZWY7IC8vIFRoZSByZXN0IGlzIGEgZm9yayBvZiB1cGRhdGVGdW5jdGlvbkNvbXBvbmVudFxuXG4gIHZhciBuZXh0Q2hpbGRyZW47XG4gIHZhciBoYXNJZDtcbiAgcHJlcGFyZVRvUmVhZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICB7XG4gICAgbWFya0NvbXBvbmVudFJlbmRlclN0YXJ0ZWQod29ya0luUHJvZ3Jlc3MpO1xuICB9XG5cbiAge1xuICAgIFJlYWN0Q3VycmVudE93bmVyJDEuY3VycmVudCA9IHdvcmtJblByb2dyZXNzO1xuICAgIHNldElzUmVuZGVyaW5nKHRydWUpO1xuICAgIG5leHRDaGlsZHJlbiA9IHJlbmRlcldpdGhIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyLCBuZXh0UHJvcHMsIHJlZiwgcmVuZGVyTGFuZXMpO1xuICAgIGhhc0lkID0gY2hlY2tEaWRSZW5kZXJJZEhvb2soKTtcblxuICAgIGlmICggd29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKHRydWUpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBuZXh0Q2hpbGRyZW4gPSByZW5kZXJXaXRoSG9va3MoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlciwgbmV4dFByb3BzLCByZWYsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgaGFzSWQgPSBjaGVja0RpZFJlbmRlcklkSG9vaygpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHMoZmFsc2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHNldElzUmVuZGVyaW5nKGZhbHNlKTtcbiAgfVxuXG4gIHtcbiAgICBtYXJrQ29tcG9uZW50UmVuZGVyU3RvcHBlZCgpO1xuICB9XG5cbiAgaWYgKGN1cnJlbnQgIT09IG51bGwgJiYgIWRpZFJlY2VpdmVVcGRhdGUpIHtcbiAgICBiYWlsb3V0SG9va3MoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICByZXR1cm4gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICB9XG5cbiAgaWYgKGdldElzSHlkcmF0aW5nKCkgJiYgaGFzSWQpIHtcbiAgICBwdXNoTWF0ZXJpYWxpemVkVHJlZUlkKHdvcmtJblByb2dyZXNzKTtcbiAgfSAvLyBSZWFjdCBEZXZUb29scyByZWFkcyB0aGlzIGZsYWcuXG5cblxuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBQZXJmb3JtZWRXb3JrO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlTWVtb0NvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKSB7XG4gIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgdmFyIHR5cGUgPSBDb21wb25lbnQudHlwZTtcblxuICAgIGlmIChpc1NpbXBsZUZ1bmN0aW9uQ29tcG9uZW50KHR5cGUpICYmIENvbXBvbmVudC5jb21wYXJlID09PSBudWxsICYmIC8vIFNpbXBsZU1lbW9Db21wb25lbnQgY29kZXBhdGggZG9lc24ndCByZXNvbHZlIG91dGVyIHByb3BzIGVpdGhlci5cbiAgICBDb21wb25lbnQuZGVmYXVsdFByb3BzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhciByZXNvbHZlZFR5cGUgPSB0eXBlO1xuXG4gICAgICB7XG4gICAgICAgIHJlc29sdmVkVHlwZSA9IHJlc29sdmVGdW5jdGlvbkZvckhvdFJlbG9hZGluZyh0eXBlKTtcbiAgICAgIH0gLy8gSWYgdGhpcyBpcyBhIHBsYWluIGZ1bmN0aW9uIGNvbXBvbmVudCB3aXRob3V0IGRlZmF1bHQgcHJvcHMsXG4gICAgICAvLyBhbmQgd2l0aCBvbmx5IHRoZSBkZWZhdWx0IHNoYWxsb3cgY29tcGFyaXNvbiwgd2UgdXBncmFkZSBpdFxuICAgICAgLy8gdG8gYSBTaW1wbGVNZW1vQ29tcG9uZW50IHRvIGFsbG93IGZhc3QgcGF0aCB1cGRhdGVzLlxuXG5cbiAgICAgIHdvcmtJblByb2dyZXNzLnRhZyA9IFNpbXBsZU1lbW9Db21wb25lbnQ7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy50eXBlID0gcmVzb2x2ZWRUeXBlO1xuXG4gICAgICB7XG4gICAgICAgIHZhbGlkYXRlRnVuY3Rpb25Db21wb25lbnRJbkRldih3b3JrSW5Qcm9ncmVzcywgdHlwZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB1cGRhdGVTaW1wbGVNZW1vQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZXNvbHZlZFR5cGUsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIHZhciBpbm5lclByb3BUeXBlcyA9IHR5cGUucHJvcFR5cGVzO1xuXG4gICAgICBpZiAoaW5uZXJQcm9wVHlwZXMpIHtcbiAgICAgICAgLy8gSW5uZXIgbWVtbyBjb21wb25lbnQgcHJvcHMgYXJlbid0IGN1cnJlbnRseSB2YWxpZGF0ZWQgaW4gY3JlYXRlRWxlbWVudC5cbiAgICAgICAgLy8gV2UgY291bGQgbW92ZSBpdCB0aGVyZSwgYnV0IHdlJ2Qgc3RpbGwgbmVlZCB0aGlzIGZvciBsYXp5IGNvZGUgcGF0aC5cbiAgICAgICAgY2hlY2tQcm9wVHlwZXMoaW5uZXJQcm9wVHlwZXMsIG5leHRQcm9wcywgLy8gUmVzb2x2ZWQgcHJvcHNcbiAgICAgICAgJ3Byb3AnLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBjaGlsZCA9IGNyZWF0ZUZpYmVyRnJvbVR5cGVBbmRQcm9wcyhDb21wb25lbnQudHlwZSwgbnVsbCwgbmV4dFByb3BzLCB3b3JrSW5Qcm9ncmVzcywgd29ya0luUHJvZ3Jlc3MubW9kZSwgcmVuZGVyTGFuZXMpO1xuICAgIGNoaWxkLnJlZiA9IHdvcmtJblByb2dyZXNzLnJlZjtcbiAgICBjaGlsZC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IGNoaWxkO1xuICAgIHJldHVybiBjaGlsZDtcbiAgfVxuXG4gIHtcbiAgICB2YXIgX3R5cGUgPSBDb21wb25lbnQudHlwZTtcbiAgICB2YXIgX2lubmVyUHJvcFR5cGVzID0gX3R5cGUucHJvcFR5cGVzO1xuXG4gICAgaWYgKF9pbm5lclByb3BUeXBlcykge1xuICAgICAgLy8gSW5uZXIgbWVtbyBjb21wb25lbnQgcHJvcHMgYXJlbid0IGN1cnJlbnRseSB2YWxpZGF0ZWQgaW4gY3JlYXRlRWxlbWVudC5cbiAgICAgIC8vIFdlIGNvdWxkIG1vdmUgaXQgdGhlcmUsIGJ1dCB3ZSdkIHN0aWxsIG5lZWQgdGhpcyBmb3IgbGF6eSBjb2RlIHBhdGguXG4gICAgICBjaGVja1Byb3BUeXBlcyhfaW5uZXJQcm9wVHlwZXMsIG5leHRQcm9wcywgLy8gUmVzb2x2ZWQgcHJvcHNcbiAgICAgICdwcm9wJywgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKF90eXBlKSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGN1cnJlbnRDaGlsZCA9IGN1cnJlbnQuY2hpbGQ7IC8vIFRoaXMgaXMgYWx3YXlzIGV4YWN0bHkgb25lIGNoaWxkXG5cbiAgdmFyIGhhc1NjaGVkdWxlZFVwZGF0ZU9yQ29udGV4dCA9IGNoZWNrU2NoZWR1bGVkVXBkYXRlT3JDb250ZXh0KGN1cnJlbnQsIHJlbmRlckxhbmVzKTtcblxuICBpZiAoIWhhc1NjaGVkdWxlZFVwZGF0ZU9yQ29udGV4dCkge1xuICAgIC8vIFRoaXMgd2lsbCBiZSB0aGUgcHJvcHMgd2l0aCByZXNvbHZlZCBkZWZhdWx0UHJvcHMsXG4gICAgLy8gdW5saWtlIGN1cnJlbnQubWVtb2l6ZWRQcm9wcyB3aGljaCB3aWxsIGJlIHRoZSB1bnJlc29sdmVkIG9uZXMuXG4gICAgdmFyIHByZXZQcm9wcyA9IGN1cnJlbnRDaGlsZC5tZW1vaXplZFByb3BzOyAvLyBEZWZhdWx0IHRvIHNoYWxsb3cgY29tcGFyaXNvblxuXG4gICAgdmFyIGNvbXBhcmUgPSBDb21wb25lbnQuY29tcGFyZTtcbiAgICBjb21wYXJlID0gY29tcGFyZSAhPT0gbnVsbCA/IGNvbXBhcmUgOiBzaGFsbG93RXF1YWw7XG5cbiAgICBpZiAoY29tcGFyZShwcmV2UHJvcHMsIG5leHRQcm9wcykgJiYgY3VycmVudC5yZWYgPT09IHdvcmtJblByb2dyZXNzLnJlZikge1xuICAgICAgcmV0dXJuIGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICB9XG4gIH0gLy8gUmVhY3QgRGV2VG9vbHMgcmVhZHMgdGhpcyBmbGFnLlxuXG5cbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUGVyZm9ybWVkV29yaztcbiAgdmFyIG5ld0NoaWxkID0gY3JlYXRlV29ya0luUHJvZ3Jlc3MoY3VycmVudENoaWxkLCBuZXh0UHJvcHMpO1xuICBuZXdDaGlsZC5yZWYgPSB3b3JrSW5Qcm9ncmVzcy5yZWY7XG4gIG5ld0NoaWxkLnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IG5ld0NoaWxkO1xuICByZXR1cm4gbmV3Q2hpbGQ7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVNpbXBsZU1lbW9Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJMYW5lcykge1xuICAvLyBUT0RPOiBjdXJyZW50IGNhbiBiZSBub24tbnVsbCBoZXJlIGV2ZW4gaWYgdGhlIGNvbXBvbmVudFxuICAvLyBoYXNuJ3QgeWV0IG1vdW50ZWQuIFRoaXMgaGFwcGVucyB3aGVuIHRoZSBpbm5lciByZW5kZXIgc3VzcGVuZHMuXG4gIC8vIFdlJ2xsIG5lZWQgdG8gZmlndXJlIG91dCBpZiB0aGlzIGlzIGZpbmUgb3IgY2FuIGNhdXNlIGlzc3Vlcy5cbiAge1xuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy50eXBlICE9PSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSkge1xuICAgICAgLy8gTGF6eSBjb21wb25lbnQgcHJvcHMgY2FuJ3QgYmUgdmFsaWRhdGVkIGluIGNyZWF0ZUVsZW1lbnRcbiAgICAgIC8vIGJlY2F1c2UgdGhleSdyZSBvbmx5IGd1YXJhbnRlZWQgdG8gYmUgcmVzb2x2ZWQgaGVyZS5cbiAgICAgIHZhciBvdXRlck1lbW9UeXBlID0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGU7XG5cbiAgICAgIGlmIChvdXRlck1lbW9UeXBlLiQkdHlwZW9mID09PSBSRUFDVF9MQVpZX1RZUEUpIHtcbiAgICAgICAgLy8gV2Ugd2FybiB3aGVuIHlvdSBkZWZpbmUgcHJvcFR5cGVzIG9uIGxhenkoKVxuICAgICAgICAvLyBzbyBsZXQncyBqdXN0IHNraXAgb3ZlciBpdCB0byBmaW5kIG1lbW8oKSBvdXRlciB3cmFwcGVyLlxuICAgICAgICAvLyBJbm5lciBwcm9wcyBmb3IgbWVtbyBhcmUgdmFsaWRhdGVkIGxhdGVyLlxuICAgICAgICB2YXIgbGF6eUNvbXBvbmVudCA9IG91dGVyTWVtb1R5cGU7XG4gICAgICAgIHZhciBwYXlsb2FkID0gbGF6eUNvbXBvbmVudC5fcGF5bG9hZDtcbiAgICAgICAgdmFyIGluaXQgPSBsYXp5Q29tcG9uZW50Ll9pbml0O1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgb3V0ZXJNZW1vVHlwZSA9IGluaXQocGF5bG9hZCk7XG4gICAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgICBvdXRlck1lbW9UeXBlID0gbnVsbDtcbiAgICAgICAgfSAvLyBJbm5lciBwcm9wVHlwZXMgd2lsbCBiZSB2YWxpZGF0ZWQgaW4gdGhlIGZ1bmN0aW9uIGNvbXBvbmVudCBwYXRoLlxuXG5cbiAgICAgICAgdmFyIG91dGVyUHJvcFR5cGVzID0gb3V0ZXJNZW1vVHlwZSAmJiBvdXRlck1lbW9UeXBlLnByb3BUeXBlcztcblxuICAgICAgICBpZiAob3V0ZXJQcm9wVHlwZXMpIHtcbiAgICAgICAgICBjaGVja1Byb3BUeXBlcyhvdXRlclByb3BUeXBlcywgbmV4dFByb3BzLCAvLyBSZXNvbHZlZCAoU2ltcGxlTWVtb0NvbXBvbmVudCBoYXMgbm8gZGVmYXVsdFByb3BzKVxuICAgICAgICAgICdwcm9wJywgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKG91dGVyTWVtb1R5cGUpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgdmFyIHByZXZQcm9wcyA9IGN1cnJlbnQubWVtb2l6ZWRQcm9wcztcblxuICAgIGlmIChzaGFsbG93RXF1YWwocHJldlByb3BzLCBuZXh0UHJvcHMpICYmIGN1cnJlbnQucmVmID09PSB3b3JrSW5Qcm9ncmVzcy5yZWYgJiYgKCAvLyBQcmV2ZW50IGJhaWxvdXQgaWYgdGhlIGltcGxlbWVudGF0aW9uIGNoYW5nZWQgZHVlIHRvIGhvdCByZWxvYWQuXG4gICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPT09IGN1cnJlbnQudHlwZSApKSB7XG4gICAgICBkaWRSZWNlaXZlVXBkYXRlID0gZmFsc2U7IC8vIFRoZSBwcm9wcyBhcmUgc2hhbGxvd2x5IGVxdWFsLiBSZXVzZSB0aGUgcHJldmlvdXMgcHJvcHMgb2JqZWN0LCBsaWtlIHdlXG4gICAgICAvLyB3b3VsZCBkdXJpbmcgYSBub3JtYWwgZmliZXIgYmFpbG91dC5cbiAgICAgIC8vXG4gICAgICAvLyBXZSBkb24ndCBoYXZlIHN0cm9uZyBndWFyYW50ZWVzIHRoYXQgdGhlIHByb3BzIG9iamVjdCBpcyByZWZlcmVudGlhbGx5XG4gICAgICAvLyBlcXVhbCBkdXJpbmcgdXBkYXRlcyB3aGVyZSB3ZSBjYW4ndCBiYWlsIG91dCBhbnl3YXkgXHUyMDE0IGxpa2UgaWYgdGhlIHByb3BzXG4gICAgICAvLyBhcmUgc2hhbGxvd2x5IGVxdWFsLCBidXQgdGhlcmUncyBhIGxvY2FsIHN0YXRlIG9yIGNvbnRleHQgdXBkYXRlIGluIHRoZVxuICAgICAgLy8gc2FtZSBiYXRjaC5cbiAgICAgIC8vXG4gICAgICAvLyBIb3dldmVyLCBhcyBhIHByaW5jaXBsZSwgd2Ugc2hvdWxkIGFpbSB0byBtYWtlIHRoZSBiZWhhdmlvciBjb25zaXN0ZW50XG4gICAgICAvLyBhY3Jvc3MgZGlmZmVyZW50IHdheXMgb2YgbWVtb2l6aW5nIGEgY29tcG9uZW50LiBGb3IgZXhhbXBsZSwgUmVhY3QubWVtb1xuICAgICAgLy8gaGFzIGEgZGlmZmVyZW50IGludGVybmFsIEZpYmVyIGxheW91dCBpZiB5b3UgcGFzcyBhIG5vcm1hbCBmdW5jdGlvblxuICAgICAgLy8gY29tcG9uZW50IChTaW1wbGVNZW1vQ29tcG9uZW50KSB2ZXJzdXMgaWYgeW91IHBhc3MgYSBkaWZmZXJlbnQgdHlwZVxuICAgICAgLy8gbGlrZSBmb3J3YXJkUmVmIChNZW1vQ29tcG9uZW50KS4gQnV0IHRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gZGV0YWlsLlxuICAgICAgLy8gV3JhcHBpbmcgYSBjb21wb25lbnQgaW4gZm9yd2FyZFJlZiAob3IgUmVhY3QubGF6eSwgZXRjKSBzaG91bGRuJ3RcbiAgICAgIC8vIGFmZmVjdCB3aGV0aGVyIHRoZSBwcm9wcyBvYmplY3QgaXMgcmV1c2VkIGR1cmluZyBhIGJhaWxvdXQuXG5cbiAgICAgIHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcyA9IG5leHRQcm9wcyA9IHByZXZQcm9wcztcblxuICAgICAgaWYgKCFjaGVja1NjaGVkdWxlZFVwZGF0ZU9yQ29udGV4dChjdXJyZW50LCByZW5kZXJMYW5lcykpIHtcbiAgICAgICAgLy8gVGhlIHBlbmRpbmcgbGFuZXMgd2VyZSBjbGVhcmVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgYmVnaW5Xb3JrLiBXZSdyZVxuICAgICAgICAvLyBhYm91dCB0byBiYWlsIG91dCwgYnV0IHRoZXJlIG1pZ2h0IGJlIG90aGVyIGxhbmVzIHRoYXQgd2VyZW4ndFxuICAgICAgICAvLyBpbmNsdWRlZCBpbiB0aGUgY3VycmVudCByZW5kZXIuIFVzdWFsbHksIHRoZSBwcmlvcml0eSBsZXZlbCBvZiB0aGVcbiAgICAgICAgLy8gcmVtYWluaW5nIHVwZGF0ZXMgaXMgYWNjdW11bGF0ZWQgZHVyaW5nIHRoZSBldmFsdWF0aW9uIG9mIHRoZVxuICAgICAgICAvLyBjb21wb25lbnQgKGkuZS4gd2hlbiBwcm9jZXNzaW5nIHRoZSB1cGRhdGUgcXVldWUpLiBCdXQgc2luY2Ugc2luY2VcbiAgICAgICAgLy8gd2UncmUgYmFpbGluZyBvdXQgZWFybHkgKndpdGhvdXQqIGV2YWx1YXRpbmcgdGhlIGNvbXBvbmVudCwgd2UgbmVlZFxuICAgICAgICAvLyB0byBhY2NvdW50IGZvciBpdCBoZXJlLCB0b28uIFJlc2V0IHRvIHRoZSB2YWx1ZSBvZiB0aGUgY3VycmVudCBmaWJlci5cbiAgICAgICAgLy8gTk9URTogVGhpcyBvbmx5IGFwcGxpZXMgdG8gU2ltcGxlTWVtb0NvbXBvbmVudCwgbm90IE1lbW9Db21wb25lbnQsXG4gICAgICAgIC8vIGJlY2F1c2UgYSBNZW1vQ29tcG9uZW50IGZpYmVyIGRvZXMgbm90IGhhdmUgaG9va3Mgb3IgYW4gdXBkYXRlIHF1ZXVlO1xuICAgICAgICAvLyByYXRoZXIsIGl0IHdyYXBzIGFyb3VuZCBhbiBpbm5lciBjb21wb25lbnQsIHdoaWNoIG1heSBvciBtYXkgbm90XG4gICAgICAgIC8vIGNvbnRhaW5zIGhvb2tzLlxuICAgICAgICAvLyBUT0RPOiBNb3ZlIHRoZSByZXNldCBhdCBpbiBiZWdpbldvcmsgb3V0IG9mIHRoZSBjb21tb24gcGF0aCBzbyB0aGF0XG4gICAgICAgIC8vIHRoaXMgaXMgbm8gbG9uZ2VyIG5lY2Vzc2FyeS5cbiAgICAgICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBjdXJyZW50LmxhbmVzO1xuICAgICAgICByZXR1cm4gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfSBlbHNlIGlmICgoY3VycmVudC5mbGFncyAmIEZvcmNlVXBkYXRlRm9yTGVnYWN5U3VzcGVuc2UpICE9PSBOb0ZsYWdzKSB7XG4gICAgICAgIC8vIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2UgdGhhdCBvbmx5IGV4aXN0cyBmb3IgbGVnYWN5IG1vZGUuXG4gICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC8xOTIxNi5cbiAgICAgICAgZGlkUmVjZWl2ZVVwZGF0ZSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVwZGF0ZUZ1bmN0aW9uQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVPZmZzY3JlZW5Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBuZXh0UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciBuZXh0Q2hpbGRyZW4gPSBuZXh0UHJvcHMuY2hpbGRyZW47XG4gIHZhciBwcmV2U3RhdGUgPSBjdXJyZW50ICE9PSBudWxsID8gY3VycmVudC5tZW1vaXplZFN0YXRlIDogbnVsbDtcblxuICBpZiAobmV4dFByb3BzLm1vZGUgPT09ICdoaWRkZW4nIHx8IGVuYWJsZUxlZ2FjeUhpZGRlbiApIHtcbiAgICAvLyBSZW5kZXJpbmcgYSBoaWRkZW4gdHJlZS5cbiAgICBpZiAoKHdvcmtJblByb2dyZXNzLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSkge1xuICAgICAgLy8gSW4gbGVnYWN5IHN5bmMgbW9kZSwgZG9uJ3QgZGVmZXIgdGhlIHN1YnRyZWUuIFJlbmRlciBpdCBub3cuXG4gICAgICAvLyBUT0RPOiBDb25zaWRlciBob3cgT2Zmc2NyZWVuIHNob3VsZCB3b3JrIHdpdGggdHJhbnNpdGlvbnMgaW4gdGhlIGZ1dHVyZVxuICAgICAgdmFyIG5leHRTdGF0ZSA9IHtcbiAgICAgICAgYmFzZUxhbmVzOiBOb0xhbmVzLFxuICAgICAgICBjYWNoZVBvb2w6IG51bGwsXG4gICAgICAgIHRyYW5zaXRpb25zOiBudWxsXG4gICAgICB9O1xuICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG5leHRTdGF0ZTtcblxuICAgICAgcHVzaFJlbmRlckxhbmVzKHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgfSBlbHNlIGlmICghaW5jbHVkZXNTb21lTGFuZShyZW5kZXJMYW5lcywgT2Zmc2NyZWVuTGFuZSkpIHtcbiAgICAgIHZhciBzcGF3bmVkQ2FjaGVQb29sID0gbnVsbDsgLy8gV2UncmUgaGlkZGVuLCBhbmQgd2UncmUgbm90IHJlbmRlcmluZyBhdCBPZmZzY3JlZW4uIFdlIHdpbGwgYmFpbCBvdXRcbiAgICAgIC8vIGFuZCByZXN1bWUgdGhpcyB0cmVlIGxhdGVyLlxuXG4gICAgICB2YXIgbmV4dEJhc2VMYW5lcztcblxuICAgICAgaWYgKHByZXZTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICB2YXIgcHJldkJhc2VMYW5lcyA9IHByZXZTdGF0ZS5iYXNlTGFuZXM7XG4gICAgICAgIG5leHRCYXNlTGFuZXMgPSBtZXJnZUxhbmVzKHByZXZCYXNlTGFuZXMsIHJlbmRlckxhbmVzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5leHRCYXNlTGFuZXMgPSByZW5kZXJMYW5lcztcbiAgICAgIH0gLy8gU2NoZWR1bGUgdGhpcyBmaWJlciB0byByZS1yZW5kZXIgYXQgb2Zmc2NyZWVuIHByaW9yaXR5LiBUaGVuIGJhaWxvdXQuXG5cblxuICAgICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZExhbmVzID0gbGFuZVRvTGFuZXMoT2Zmc2NyZWVuTGFuZSk7XG4gICAgICB2YXIgX25leHRTdGF0ZSA9IHtcbiAgICAgICAgYmFzZUxhbmVzOiBuZXh0QmFzZUxhbmVzLFxuICAgICAgICBjYWNoZVBvb2w6IHNwYXduZWRDYWNoZVBvb2wsXG4gICAgICAgIHRyYW5zaXRpb25zOiBudWxsXG4gICAgICB9O1xuICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IF9uZXh0U3RhdGU7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IG51bGw7XG4gICAgICAvLyB0byBhdm9pZCBhIHB1c2gvcG9wIG1pc2FsaWdubWVudC5cblxuXG4gICAgICBwdXNoUmVuZGVyTGFuZXMod29ya0luUHJvZ3Jlc3MsIG5leHRCYXNlTGFuZXMpO1xuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhpcyBpcyB0aGUgc2Vjb25kIHJlbmRlci4gVGhlIHN1cnJvdW5kaW5nIHZpc2libGUgY29udGVudCBoYXMgYWxyZWFkeVxuICAgICAgLy8gY29tbWl0dGVkLiBOb3cgd2UgcmVzdW1lIHJlbmRlcmluZyB0aGUgaGlkZGVuIHRyZWUuXG4gICAgICAvLyBSZW5kZXJpbmcgYXQgb2Zmc2NyZWVuLCBzbyB3ZSBjYW4gY2xlYXIgdGhlIGJhc2UgbGFuZXMuXG4gICAgICB2YXIgX25leHRTdGF0ZTIgPSB7XG4gICAgICAgIGJhc2VMYW5lczogTm9MYW5lcyxcbiAgICAgICAgY2FjaGVQb29sOiBudWxsLFxuICAgICAgICB0cmFuc2l0aW9uczogbnVsbFxuICAgICAgfTtcbiAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBfbmV4dFN0YXRlMjsgLy8gUHVzaCB0aGUgbGFuZXMgdGhhdCB3ZXJlIHNraXBwZWQgd2hlbiB3ZSBiYWlsZWQgb3V0LlxuXG4gICAgICB2YXIgc3VidHJlZVJlbmRlckxhbmVzID0gcHJldlN0YXRlICE9PSBudWxsID8gcHJldlN0YXRlLmJhc2VMYW5lcyA6IHJlbmRlckxhbmVzO1xuXG4gICAgICBwdXNoUmVuZGVyTGFuZXMod29ya0luUHJvZ3Jlc3MsIHN1YnRyZWVSZW5kZXJMYW5lcyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIFJlbmRlcmluZyBhIHZpc2libGUgdHJlZS5cbiAgICB2YXIgX3N1YnRyZWVSZW5kZXJMYW5lcztcblxuICAgIGlmIChwcmV2U3RhdGUgIT09IG51bGwpIHtcbiAgICAgIC8vIFdlJ3JlIGdvaW5nIGZyb20gaGlkZGVuIC0+IHZpc2libGUuXG4gICAgICBfc3VidHJlZVJlbmRlckxhbmVzID0gbWVyZ2VMYW5lcyhwcmV2U3RhdGUuYmFzZUxhbmVzLCByZW5kZXJMYW5lcyk7XG5cbiAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBXZSB3ZXJlbid0IHByZXZpb3VzbHkgaGlkZGVuLCBhbmQgd2Ugc3RpbGwgYXJlbid0LCBzbyB0aGVyZSdzIG5vdGhpbmdcbiAgICAgIC8vIHNwZWNpYWwgdG8gZG8uIE5lZWQgdG8gcHVzaCB0byB0aGUgc3RhY2sgcmVnYXJkbGVzcywgdGhvdWdoLCB0byBhdm9pZFxuICAgICAgLy8gYSBwdXNoL3BvcCBtaXNhbGlnbm1lbnQuXG4gICAgICBfc3VidHJlZVJlbmRlckxhbmVzID0gcmVuZGVyTGFuZXM7XG4gICAgfVxuXG4gICAgcHVzaFJlbmRlckxhbmVzKHdvcmtJblByb2dyZXNzLCBfc3VidHJlZVJlbmRlckxhbmVzKTtcbiAgfVxuXG4gIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufSAvLyBOb3RlOiBUaGVzZSBoYXBwZW4gdG8gaGF2ZSBpZGVudGljYWwgYmVnaW4gcGhhc2VzLCBmb3Igbm93LiBXZSBzaG91bGRuJ3QgaG9sZFxuXG5mdW5jdGlvbiB1cGRhdGVGcmFnbWVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIG5leHRDaGlsZHJlbiA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZU1vZGUoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBuZXh0Q2hpbGRyZW4gPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHMuY2hpbGRyZW47XG4gIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVQcm9maWxlcihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAge1xuICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFVwZGF0ZTtcblxuICAgIHtcbiAgICAgIC8vIFJlc2V0IGVmZmVjdCBkdXJhdGlvbnMgZm9yIHRoZSBuZXh0IGV2ZW50dWFsIGVmZmVjdCBwaGFzZS5cbiAgICAgIC8vIFRoZXNlIGFyZSByZXNldCBkdXJpbmcgcmVuZGVyIHRvIGFsbG93IHRoZSBEZXZUb29scyBjb21taXQgaG9vayBhIGNoYW5jZSB0byByZWFkIHRoZW0sXG4gICAgICB2YXIgc3RhdGVOb2RlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICAgICAgc3RhdGVOb2RlLmVmZmVjdER1cmF0aW9uID0gMDtcbiAgICAgIHN0YXRlTm9kZS5wYXNzaXZlRWZmZWN0RHVyYXRpb24gPSAwO1xuICAgIH1cbiAgfVxuXG4gIHZhciBuZXh0UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciBuZXh0Q2hpbGRyZW4gPSBuZXh0UHJvcHMuY2hpbGRyZW47XG4gIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG5mdW5jdGlvbiBtYXJrUmVmKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKSB7XG4gIHZhciByZWYgPSB3b3JrSW5Qcm9ncmVzcy5yZWY7XG5cbiAgaWYgKGN1cnJlbnQgPT09IG51bGwgJiYgcmVmICE9PSBudWxsIHx8IGN1cnJlbnQgIT09IG51bGwgJiYgY3VycmVudC5yZWYgIT09IHJlZikge1xuICAgIC8vIFNjaGVkdWxlIGEgUmVmIGVmZmVjdFxuICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFJlZjtcblxuICAgIHtcbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFJlZlN0YXRpYztcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlRnVuY3Rpb25Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJMYW5lcykge1xuICB7XG4gICAgaWYgKHdvcmtJblByb2dyZXNzLnR5cGUgIT09IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlKSB7XG4gICAgICAvLyBMYXp5IGNvbXBvbmVudCBwcm9wcyBjYW4ndCBiZSB2YWxpZGF0ZWQgaW4gY3JlYXRlRWxlbWVudFxuICAgICAgLy8gYmVjYXVzZSB0aGV5J3JlIG9ubHkgZ3VhcmFudGVlZCB0byBiZSByZXNvbHZlZCBoZXJlLlxuICAgICAgdmFyIGlubmVyUHJvcFR5cGVzID0gQ29tcG9uZW50LnByb3BUeXBlcztcblxuICAgICAgaWYgKGlubmVyUHJvcFR5cGVzKSB7XG4gICAgICAgIGNoZWNrUHJvcFR5cGVzKGlubmVyUHJvcFR5cGVzLCBuZXh0UHJvcHMsIC8vIFJlc29sdmVkIHByb3BzXG4gICAgICAgICdwcm9wJywgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKENvbXBvbmVudCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBjb250ZXh0O1xuXG4gIHtcbiAgICB2YXIgdW5tYXNrZWRDb250ZXh0ID0gZ2V0VW5tYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHRydWUpO1xuICAgIGNvbnRleHQgPSBnZXRNYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCB1bm1hc2tlZENvbnRleHQpO1xuICB9XG5cbiAgdmFyIG5leHRDaGlsZHJlbjtcbiAgdmFyIGhhc0lkO1xuICBwcmVwYXJlVG9SZWFkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gIHtcbiAgICBtYXJrQ29tcG9uZW50UmVuZGVyU3RhcnRlZCh3b3JrSW5Qcm9ncmVzcyk7XG4gIH1cblxuICB7XG4gICAgUmVhY3RDdXJyZW50T3duZXIkMS5jdXJyZW50ID0gd29ya0luUHJvZ3Jlc3M7XG4gICAgc2V0SXNSZW5kZXJpbmcodHJ1ZSk7XG4gICAgbmV4dENoaWxkcmVuID0gcmVuZGVyV2l0aEhvb2tzKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgY29udGV4dCwgcmVuZGVyTGFuZXMpO1xuICAgIGhhc0lkID0gY2hlY2tEaWRSZW5kZXJJZEhvb2soKTtcblxuICAgIGlmICggd29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKHRydWUpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBuZXh0Q2hpbGRyZW4gPSByZW5kZXJXaXRoSG9va3MoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCBjb250ZXh0LCByZW5kZXJMYW5lcyk7XG4gICAgICAgIGhhc0lkID0gY2hlY2tEaWRSZW5kZXJJZEhvb2soKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRJc1JlbmRlcmluZyhmYWxzZSk7XG4gIH1cblxuICB7XG4gICAgbWFya0NvbXBvbmVudFJlbmRlclN0b3BwZWQoKTtcbiAgfVxuXG4gIGlmIChjdXJyZW50ICE9PSBudWxsICYmICFkaWRSZWNlaXZlVXBkYXRlKSB7XG4gICAgYmFpbG91dEhvb2tzKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgcmV0dXJuIGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgfVxuXG4gIGlmIChnZXRJc0h5ZHJhdGluZygpICYmIGhhc0lkKSB7XG4gICAgcHVzaE1hdGVyaWFsaXplZFRyZWVJZCh3b3JrSW5Qcm9ncmVzcyk7XG4gIH0gLy8gUmVhY3QgRGV2VG9vbHMgcmVhZHMgdGhpcyBmbGFnLlxuXG5cbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUGVyZm9ybWVkV29yaztcbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUNsYXNzQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpIHtcbiAge1xuICAgIC8vIFRoaXMgaXMgdXNlZCBieSBEZXZUb29scyB0byBmb3JjZSBhIGJvdW5kYXJ5IHRvIGVycm9yLlxuICAgIHN3aXRjaCAoc2hvdWxkRXJyb3Iod29ya0luUHJvZ3Jlc3MpKSB7XG4gICAgICBjYXNlIGZhbHNlOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIF9pbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgICAgICAgICB2YXIgY3RvciA9IHdvcmtJblByb2dyZXNzLnR5cGU7IC8vIFRPRE8gVGhpcyB3YXkgb2YgcmVzZXR0aW5nIHRoZSBlcnJvciBib3VuZGFyeSBzdGF0ZSBpcyBhIGhhY2suXG4gICAgICAgICAgLy8gSXMgdGhlcmUgYSBiZXR0ZXIgd2F5IHRvIGRvIHRoaXM/XG5cbiAgICAgICAgICB2YXIgdGVtcEluc3RhbmNlID0gbmV3IGN0b3Iod29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcywgX2luc3RhbmNlLmNvbnRleHQpO1xuICAgICAgICAgIHZhciBzdGF0ZSA9IHRlbXBJbnN0YW5jZS5zdGF0ZTtcblxuICAgICAgICAgIF9pbnN0YW5jZS51cGRhdGVyLmVucXVldWVTZXRTdGF0ZShfaW5zdGFuY2UsIHN0YXRlLCBudWxsKTtcblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgdHJ1ZTpcbiAgICAgICAge1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IERpZENhcHR1cmU7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gU2hvdWxkQ2FwdHVyZTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3Byb2QtZXJyb3ItY29kZXNcblxuICAgICAgICAgIHZhciBlcnJvciQxID0gbmV3IEVycm9yKCdTaW11bGF0ZWQgZXJyb3IgY29taW5nIGZyb20gRGV2VG9vbHMnKTtcbiAgICAgICAgICB2YXIgbGFuZSA9IHBpY2tBcmJpdHJhcnlMYW5lKHJlbmRlckxhbmVzKTtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IG1lcmdlTGFuZXMod29ya0luUHJvZ3Jlc3MubGFuZXMsIGxhbmUpOyAvLyBTY2hlZHVsZSB0aGUgZXJyb3IgYm91bmRhcnkgdG8gcmUtcmVuZGVyIHVzaW5nIHVwZGF0ZWQgc3RhdGVcblxuICAgICAgICAgIHZhciB1cGRhdGUgPSBjcmVhdGVDbGFzc0Vycm9yVXBkYXRlKHdvcmtJblByb2dyZXNzLCBjcmVhdGVDYXB0dXJlZFZhbHVlQXRGaWJlcihlcnJvciQxLCB3b3JrSW5Qcm9ncmVzcyksIGxhbmUpO1xuICAgICAgICAgIGVucXVldWVDYXB0dXJlZFVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgdXBkYXRlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy50eXBlICE9PSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSkge1xuICAgICAgLy8gTGF6eSBjb21wb25lbnQgcHJvcHMgY2FuJ3QgYmUgdmFsaWRhdGVkIGluIGNyZWF0ZUVsZW1lbnRcbiAgICAgIC8vIGJlY2F1c2UgdGhleSdyZSBvbmx5IGd1YXJhbnRlZWQgdG8gYmUgcmVzb2x2ZWQgaGVyZS5cbiAgICAgIHZhciBpbm5lclByb3BUeXBlcyA9IENvbXBvbmVudC5wcm9wVHlwZXM7XG5cbiAgICAgIGlmIChpbm5lclByb3BUeXBlcykge1xuICAgICAgICBjaGVja1Byb3BUeXBlcyhpbm5lclByb3BUeXBlcywgbmV4dFByb3BzLCAvLyBSZXNvbHZlZCBwcm9wc1xuICAgICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShDb21wb25lbnQpKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gLy8gUHVzaCBjb250ZXh0IHByb3ZpZGVycyBlYXJseSB0byBwcmV2ZW50IGNvbnRleHQgc3RhY2sgbWlzbWF0Y2hlcy5cbiAgLy8gRHVyaW5nIG1vdW50aW5nIHdlIGRvbid0IGtub3cgdGhlIGNoaWxkIGNvbnRleHQgeWV0IGFzIHRoZSBpbnN0YW5jZSBkb2Vzbid0IGV4aXN0LlxuICAvLyBXZSB3aWxsIGludmFsaWRhdGUgdGhlIGNoaWxkIGNvbnRleHQgaW4gZmluaXNoQ2xhc3NDb21wb25lbnQoKSByaWdodCBhZnRlciByZW5kZXJpbmcuXG5cblxuICB2YXIgaGFzQ29udGV4dDtcblxuICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkge1xuICAgIGhhc0NvbnRleHQgPSB0cnVlO1xuICAgIHB1c2hDb250ZXh0UHJvdmlkZXIod29ya0luUHJvZ3Jlc3MpO1xuICB9IGVsc2Uge1xuICAgIGhhc0NvbnRleHQgPSBmYWxzZTtcbiAgfVxuXG4gIHByZXBhcmVUb1JlYWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgdmFyIHNob3VsZFVwZGF0ZTtcblxuICBpZiAoaW5zdGFuY2UgPT09IG51bGwpIHtcbiAgICByZXNldFN1c3BlbmRlZEN1cnJlbnRPbk1vdW50SW5MZWdhY3lNb2RlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTsgLy8gSW4gdGhlIGluaXRpYWwgcGFzcyB3ZSBtaWdodCBuZWVkIHRvIGNvbnN0cnVjdCB0aGUgaW5zdGFuY2UuXG5cbiAgICBjb25zdHJ1Y3RDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcyk7XG4gICAgbW91bnRDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpO1xuICAgIHNob3VsZFVwZGF0ZSA9IHRydWU7XG4gIH0gZWxzZSBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgIC8vIEluIGEgcmVzdW1lLCB3ZSdsbCBhbHJlYWR5IGhhdmUgYW4gaW5zdGFuY2Ugd2UgY2FuIHJldXNlLlxuICAgIHNob3VsZFVwZGF0ZSA9IHJlc3VtZU1vdW50Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgfSBlbHNlIHtcbiAgICBzaG91bGRVcGRhdGUgPSB1cGRhdGVDbGFzc0luc3RhbmNlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpO1xuICB9XG5cbiAgdmFyIG5leHRVbml0T2ZXb3JrID0gZmluaXNoQ2xhc3NDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgc2hvdWxkVXBkYXRlLCBoYXNDb250ZXh0LCByZW5kZXJMYW5lcyk7XG5cbiAge1xuICAgIHZhciBpbnN0ID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuXG4gICAgaWYgKHNob3VsZFVwZGF0ZSAmJiBpbnN0LnByb3BzICE9PSBuZXh0UHJvcHMpIHtcbiAgICAgIGlmICghZGlkV2FybkFib3V0UmVhc3NpZ25pbmdQcm9wcykge1xuICAgICAgICBlcnJvcignSXQgbG9va3MgbGlrZSAlcyBpcyByZWFzc2lnbmluZyBpdHMgb3duIGB0aGlzLnByb3BzYCB3aGlsZSByZW5kZXJpbmcuICcgKyAnVGhpcyBpcyBub3Qgc3VwcG9ydGVkIGFuZCBjYW4gbGVhZCB0byBjb25mdXNpbmcgYnVncy4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKHdvcmtJblByb2dyZXNzKSB8fCAnYSBjb21wb25lbnQnKTtcbiAgICAgIH1cblxuICAgICAgZGlkV2FybkFib3V0UmVhc3NpZ25pbmdQcm9wcyA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5leHRVbml0T2ZXb3JrO1xufVxuXG5mdW5jdGlvbiBmaW5pc2hDbGFzc0NvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBzaG91bGRVcGRhdGUsIGhhc0NvbnRleHQsIHJlbmRlckxhbmVzKSB7XG4gIC8vIFJlZnMgc2hvdWxkIHVwZGF0ZSBldmVuIGlmIHNob3VsZENvbXBvbmVudFVwZGF0ZSByZXR1cm5zIGZhbHNlXG4gIG1hcmtSZWYoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuICB2YXIgZGlkQ2FwdHVyZUVycm9yID0gKHdvcmtJblByb2dyZXNzLmZsYWdzICYgRGlkQ2FwdHVyZSkgIT09IE5vRmxhZ3M7XG5cbiAgaWYgKCFzaG91bGRVcGRhdGUgJiYgIWRpZENhcHR1cmVFcnJvcikge1xuICAgIC8vIENvbnRleHQgcHJvdmlkZXJzIHNob3VsZCBkZWZlciB0byBzQ1UgZm9yIHJlbmRlcmluZ1xuICAgIGlmIChoYXNDb250ZXh0KSB7XG4gICAgICBpbnZhbGlkYXRlQ29udGV4dFByb3ZpZGVyKHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIGZhbHNlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICB9XG5cbiAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlOyAvLyBSZXJlbmRlclxuXG4gIFJlYWN0Q3VycmVudE93bmVyJDEuY3VycmVudCA9IHdvcmtJblByb2dyZXNzO1xuICB2YXIgbmV4dENoaWxkcmVuO1xuXG4gIGlmIChkaWRDYXB0dXJlRXJyb3IgJiYgdHlwZW9mIENvbXBvbmVudC5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgIT09ICdmdW5jdGlvbicpIHtcbiAgICAvLyBJZiB3ZSBjYXB0dXJlZCBhbiBlcnJvciwgYnV0IGdldERlcml2ZWRTdGF0ZUZyb21FcnJvciBpcyBub3QgZGVmaW5lZCxcbiAgICAvLyB1bm1vdW50IGFsbCB0aGUgY2hpbGRyZW4uIGNvbXBvbmVudERpZENhdGNoIHdpbGwgc2NoZWR1bGUgYW4gdXBkYXRlIHRvXG4gICAgLy8gcmUtcmVuZGVyIGEgZmFsbGJhY2suIFRoaXMgaXMgdGVtcG9yYXJ5IHVudGlsIHdlIG1pZ3JhdGUgZXZlcnlvbmUgdG9cbiAgICAvLyB0aGUgbmV3IEFQSS5cbiAgICAvLyBUT0RPOiBXYXJuIGluIGEgZnV0dXJlIHJlbGVhc2UuXG4gICAgbmV4dENoaWxkcmVuID0gbnVsbDtcblxuICAgIHtcbiAgICAgIHN0b3BQcm9maWxlclRpbWVySWZSdW5uaW5nKCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHtcbiAgICAgIG1hcmtDb21wb25lbnRSZW5kZXJTdGFydGVkKHdvcmtJblByb2dyZXNzKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBzZXRJc1JlbmRlcmluZyh0cnVlKTtcbiAgICAgIG5leHRDaGlsZHJlbiA9IGluc3RhbmNlLnJlbmRlcigpO1xuXG4gICAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKHRydWUpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaW5zdGFuY2UucmVuZGVyKCk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHMoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHNldElzUmVuZGVyaW5nKGZhbHNlKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBtYXJrQ29tcG9uZW50UmVuZGVyU3RvcHBlZCgpO1xuICAgIH1cbiAgfSAvLyBSZWFjdCBEZXZUb29scyByZWFkcyB0aGlzIGZsYWcuXG5cblxuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBQZXJmb3JtZWRXb3JrO1xuXG4gIGlmIChjdXJyZW50ICE9PSBudWxsICYmIGRpZENhcHR1cmVFcnJvcikge1xuICAgIC8vIElmIHdlJ3JlIHJlY292ZXJpbmcgZnJvbSBhbiBlcnJvciwgcmVjb25jaWxlIHdpdGhvdXQgcmV1c2luZyBhbnkgb2ZcbiAgICAvLyB0aGUgZXhpc3RpbmcgY2hpbGRyZW4uIENvbmNlcHR1YWxseSwgdGhlIG5vcm1hbCBjaGlsZHJlbiBhbmQgdGhlIGNoaWxkcmVuXG4gICAgLy8gdGhhdCBhcmUgc2hvd24gb24gZXJyb3IgYXJlIHR3byBkaWZmZXJlbnQgc2V0cywgc28gd2Ugc2hvdWxkbid0IHJldXNlXG4gICAgLy8gbm9ybWFsIGNoaWxkcmVuIGV2ZW4gaWYgdGhlaXIgaWRlbnRpdGllcyBtYXRjaC5cbiAgICBmb3JjZVVubW91bnRDdXJyZW50QW5kUmVjb25jaWxlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgfSBlbHNlIHtcbiAgICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIH0gLy8gTWVtb2l6ZSBzdGF0ZSB1c2luZyB0aGUgdmFsdWVzIHdlIGp1c3QgdXNlZCB0byByZW5kZXIuXG4gIC8vIFRPRE86IFJlc3RydWN0dXJlIHNvIHdlIG5ldmVyIHJlYWQgdmFsdWVzIGZyb20gdGhlIGluc3RhbmNlLlxuXG5cbiAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IGluc3RhbmNlLnN0YXRlOyAvLyBUaGUgY29udGV4dCBtaWdodCBoYXZlIGNoYW5nZWQgc28gd2UgbmVlZCB0byByZWNhbGN1bGF0ZSBpdC5cblxuICBpZiAoaGFzQ29udGV4dCkge1xuICAgIGludmFsaWRhdGVDb250ZXh0UHJvdmlkZXIod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgdHJ1ZSk7XG4gIH1cblxuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIHB1c2hIb3N0Um9vdENvbnRleHQod29ya0luUHJvZ3Jlc3MpIHtcbiAgdmFyIHJvb3QgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG5cbiAgaWYgKHJvb3QucGVuZGluZ0NvbnRleHQpIHtcbiAgICBwdXNoVG9wTGV2ZWxDb250ZXh0T2JqZWN0KHdvcmtJblByb2dyZXNzLCByb290LnBlbmRpbmdDb250ZXh0LCByb290LnBlbmRpbmdDb250ZXh0ICE9PSByb290LmNvbnRleHQpO1xuICB9IGVsc2UgaWYgKHJvb3QuY29udGV4dCkge1xuICAgIC8vIFNob3VsZCBhbHdheXMgYmUgc2V0XG4gICAgcHVzaFRvcExldmVsQ29udGV4dE9iamVjdCh3b3JrSW5Qcm9ncmVzcywgcm9vdC5jb250ZXh0LCBmYWxzZSk7XG4gIH1cblxuICBwdXNoSG9zdENvbnRhaW5lcih3b3JrSW5Qcm9ncmVzcywgcm9vdC5jb250YWluZXJJbmZvKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlSG9zdFJvb3QoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHB1c2hIb3N0Um9vdENvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuXG4gIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTaG91bGQgaGF2ZSBhIGN1cnJlbnQgZmliZXIuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuJyk7XG4gIH1cblxuICB2YXIgbmV4dFByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICB2YXIgcHJldlN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgdmFyIHByZXZDaGlsZHJlbiA9IHByZXZTdGF0ZS5lbGVtZW50O1xuICBjbG9uZVVwZGF0ZVF1ZXVlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTtcbiAgcHJvY2Vzc1VwZGF0ZVF1ZXVlKHdvcmtJblByb2dyZXNzLCBuZXh0UHJvcHMsIG51bGwsIHJlbmRlckxhbmVzKTtcbiAgdmFyIG5leHRTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gIHZhciByb290ID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICAvLyBiZWluZyBjYWxsZWQgXCJlbGVtZW50XCIuXG5cblxuICB2YXIgbmV4dENoaWxkcmVuID0gbmV4dFN0YXRlLmVsZW1lbnQ7XG5cbiAgaWYgKHN1cHBvcnRzSHlkcmF0aW9uICYmIHByZXZTdGF0ZS5pc0RlaHlkcmF0ZWQpIHtcbiAgICAvLyBUaGlzIGlzIGEgaHlkcmF0aW9uIHJvb3Qgd2hvc2Ugc2hlbGwgaGFzIG5vdCB5ZXQgaHlkcmF0ZWQuIFdlIHNob3VsZFxuICAgIC8vIGF0dGVtcHQgdG8gaHlkcmF0ZS5cbiAgICAvLyBGbGlwIGlzRGVoeWRyYXRlZCB0byBmYWxzZSB0byBpbmRpY2F0ZSB0aGF0IHdoZW4gdGhpcyByZW5kZXJcbiAgICAvLyBmaW5pc2hlcywgdGhlIHJvb3Qgd2lsbCBubyBsb25nZXIgYmUgZGVoeWRyYXRlZC5cbiAgICB2YXIgb3ZlcnJpZGVTdGF0ZSA9IHtcbiAgICAgIGVsZW1lbnQ6IG5leHRDaGlsZHJlbixcbiAgICAgIGlzRGVoeWRyYXRlZDogZmFsc2UsXG4gICAgICBjYWNoZTogbmV4dFN0YXRlLmNhY2hlLFxuICAgICAgcGVuZGluZ1N1c3BlbnNlQm91bmRhcmllczogbmV4dFN0YXRlLnBlbmRpbmdTdXNwZW5zZUJvdW5kYXJpZXMsXG4gICAgICB0cmFuc2l0aW9uczogbmV4dFN0YXRlLnRyYW5zaXRpb25zXG4gICAgfTtcbiAgICB2YXIgdXBkYXRlUXVldWUgPSB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZTsgLy8gYGJhc2VTdGF0ZWAgY2FuIGFsd2F5cyBiZSB0aGUgbGFzdCBzdGF0ZSBiZWNhdXNlIHRoZSByb290IGRvZXNuJ3RcbiAgICAvLyBoYXZlIHJlZHVjZXIgZnVuY3Rpb25zIHNvIGl0IGRvZXNuJ3QgbmVlZCByZWJhc2luZy5cblxuICAgIHVwZGF0ZVF1ZXVlLmJhc2VTdGF0ZSA9IG92ZXJyaWRlU3RhdGU7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG92ZXJyaWRlU3RhdGU7XG5cbiAgICBpZiAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBGb3JjZUNsaWVudFJlbmRlcikge1xuICAgICAgLy8gU29tZXRoaW5nIGVycm9yZWQgZHVyaW5nIGEgcHJldmlvdXMgYXR0ZW1wdCB0byBoeWRyYXRlIHRoZSBzaGVsbCwgc28gd2VcbiAgICAgIC8vIGZvcmNlZCBhIGNsaWVudCByZW5kZXIuXG4gICAgICB2YXIgcmVjb3ZlcmFibGVFcnJvciA9IGNyZWF0ZUNhcHR1cmVkVmFsdWVBdEZpYmVyKG5ldyBFcnJvcignVGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGh5ZHJhdGluZy4gQmVjYXVzZSB0aGUgZXJyb3IgaGFwcGVuZWQgb3V0c2lkZSAnICsgJ29mIGEgU3VzcGVuc2UgYm91bmRhcnksIHRoZSBlbnRpcmUgcm9vdCB3aWxsIHN3aXRjaCB0byAnICsgJ2NsaWVudCByZW5kZXJpbmcuJyksIHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHJldHVybiBtb3VudEhvc3RSb290V2l0aG91dEh5ZHJhdGluZyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcywgcmVjb3ZlcmFibGVFcnJvcik7XG4gICAgfSBlbHNlIGlmIChuZXh0Q2hpbGRyZW4gIT09IHByZXZDaGlsZHJlbikge1xuICAgICAgdmFyIF9yZWNvdmVyYWJsZUVycm9yID0gY3JlYXRlQ2FwdHVyZWRWYWx1ZUF0RmliZXIobmV3IEVycm9yKCdUaGlzIHJvb3QgcmVjZWl2ZWQgYW4gZWFybHkgdXBkYXRlLCBiZWZvcmUgYW55dGhpbmcgd2FzIGFibGUgJyArICdoeWRyYXRlLiBTd2l0Y2hlZCB0aGUgZW50aXJlIHJvb3QgdG8gY2xpZW50IHJlbmRlcmluZy4nKSwgd29ya0luUHJvZ3Jlc3MpO1xuXG4gICAgICByZXR1cm4gbW91bnRIb3N0Um9vdFdpdGhvdXRIeWRyYXRpbmcoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMsIF9yZWNvdmVyYWJsZUVycm9yKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhlIG91dGVybW9zdCBzaGVsbCBoYXMgbm90IGh5ZHJhdGVkIHlldC4gU3RhcnQgaHlkcmF0aW5nLlxuICAgICAgZW50ZXJIeWRyYXRpb25TdGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgICAgIHZhciBjaGlsZCA9IG1vdW50Q2hpbGRGaWJlcnMod29ya0luUHJvZ3Jlc3MsIG51bGwsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICAgICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBjaGlsZDtcbiAgICAgIHZhciBub2RlID0gY2hpbGQ7XG5cbiAgICAgIHdoaWxlIChub2RlKSB7XG4gICAgICAgIC8vIE1hcmsgZWFjaCBjaGlsZCBhcyBoeWRyYXRpbmcuIFRoaXMgaXMgYSBmYXN0IHBhdGggdG8ga25vdyB3aGV0aGVyIHRoaXNcbiAgICAgICAgLy8gdHJlZSBpcyBwYXJ0IG9mIGEgaHlkcmF0aW5nIHRyZWUuIFRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgYSBjaGlsZFxuICAgICAgICAvLyBub2RlIGhhcyBmdWxseSBtb3VudGVkIHlldCwgYW5kIGZvciBzY2hlZHVsaW5nIGV2ZW50IHJlcGxheWluZy5cbiAgICAgICAgLy8gQ29uY2VwdHVhbGx5IHRoaXMgaXMgc2ltaWxhciB0byBQbGFjZW1lbnQgaW4gdGhhdCBhIG5ldyBzdWJ0cmVlIGlzXG4gICAgICAgIC8vIGluc2VydGVkIGludG8gdGhlIFJlYWN0IHRyZWUgaGVyZS4gSXQganVzdCBoYXBwZW5zIHRvIG5vdCBuZWVkIERPTVxuICAgICAgICAvLyBtdXRhdGlvbnMgYmVjYXVzZSBpdCBhbHJlYWR5IGV4aXN0cy5cbiAgICAgICAgbm9kZS5mbGFncyA9IG5vZGUuZmxhZ3MgJiB+UGxhY2VtZW50IHwgSHlkcmF0aW5nO1xuICAgICAgICBub2RlID0gbm9kZS5zaWJsaW5nO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBSb290IGlzIG5vdCBkZWh5ZHJhdGVkLiBFaXRoZXIgdGhpcyBpcyBhIGNsaWVudC1vbmx5IHJvb3QsIG9yIGl0XG4gICAgLy8gYWxyZWFkeSBoeWRyYXRlZC5cbiAgICByZXNldEh5ZHJhdGlvblN0YXRlKCk7XG5cbiAgICBpZiAobmV4dENoaWxkcmVuID09PSBwcmV2Q2hpbGRyZW4pIHtcbiAgICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgfVxuXG4gICAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICB9XG5cbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG5mdW5jdGlvbiBtb3VudEhvc3RSb290V2l0aG91dEh5ZHJhdGluZyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcywgcmVjb3ZlcmFibGVFcnJvcikge1xuICAvLyBSZXZlcnQgdG8gY2xpZW50IHJlbmRlcmluZy5cbiAgcmVzZXRIeWRyYXRpb25TdGF0ZSgpO1xuICBxdWV1ZUh5ZHJhdGlvbkVycm9yKHJlY292ZXJhYmxlRXJyb3IpO1xuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBGb3JjZUNsaWVudFJlbmRlcjtcbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUhvc3RDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHB1c2hIb3N0Q29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICB0cnlUb0NsYWltTmV4dEh5ZHJhdGFibGVJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcyk7XG4gIH1cblxuICB2YXIgdHlwZSA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gIHZhciBuZXh0UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciBwcmV2UHJvcHMgPSBjdXJyZW50ICE9PSBudWxsID8gY3VycmVudC5tZW1vaXplZFByb3BzIDogbnVsbDtcbiAgdmFyIG5leHRDaGlsZHJlbiA9IG5leHRQcm9wcy5jaGlsZHJlbjtcbiAgdmFyIGlzRGlyZWN0VGV4dENoaWxkID0gc2hvdWxkU2V0VGV4dENvbnRlbnQodHlwZSwgbmV4dFByb3BzKTtcblxuICBpZiAoaXNEaXJlY3RUZXh0Q2hpbGQpIHtcbiAgICAvLyBXZSBzcGVjaWFsIGNhc2UgYSBkaXJlY3QgdGV4dCBjaGlsZCBvZiBhIGhvc3Qgbm9kZS4gVGhpcyBpcyBhIGNvbW1vblxuICAgIC8vIGNhc2UuIFdlIHdvbid0IGhhbmRsZSBpdCBhcyBhIHJlaWZpZWQgY2hpbGQuIFdlIHdpbGwgaW5zdGVhZCBoYW5kbGVcbiAgICAvLyB0aGlzIGluIHRoZSBob3N0IGVudmlyb25tZW50IHRoYXQgYWxzbyBoYXMgYWNjZXNzIHRvIHRoaXMgcHJvcC4gVGhhdFxuICAgIC8vIGF2b2lkcyBhbGxvY2F0aW5nIGFub3RoZXIgSG9zdFRleHQgZmliZXIgYW5kIHRyYXZlcnNpbmcgaXQuXG4gICAgbmV4dENoaWxkcmVuID0gbnVsbDtcbiAgfSBlbHNlIGlmIChwcmV2UHJvcHMgIT09IG51bGwgJiYgc2hvdWxkU2V0VGV4dENvbnRlbnQodHlwZSwgcHJldlByb3BzKSkge1xuICAgIC8vIElmIHdlJ3JlIHN3aXRjaGluZyBmcm9tIGEgZGlyZWN0IHRleHQgY2hpbGQgdG8gYSBub3JtYWwgY2hpbGQsIG9yIHRvXG4gICAgLy8gZW1wdHksIHdlIG5lZWQgdG8gc2NoZWR1bGUgdGhlIHRleHQgY29udGVudCB0byBiZSByZXNldC5cbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBDb250ZW50UmVzZXQ7XG4gIH1cblxuICBtYXJrUmVmKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTtcbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUhvc3RUZXh0KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKSB7XG4gIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgdHJ5VG9DbGFpbU5leHRIeWRyYXRhYmxlSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MpO1xuICB9IC8vIE5vdGhpbmcgdG8gZG8gaGVyZS4gVGhpcyBpcyB0ZXJtaW5hbC4gV2UnbGwgZG8gdGhlIGNvbXBsZXRpb24gc3RlcFxuICAvLyBpbW1lZGlhdGVseSBhZnRlci5cblxuXG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBtb3VudExhenlDb21wb25lbnQoX2N1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBlbGVtZW50VHlwZSwgcmVuZGVyTGFuZXMpIHtcbiAgcmVzZXRTdXNwZW5kZWRDdXJyZW50T25Nb3VudEluTGVnYWN5TW9kZShfY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuICB2YXIgcHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciBsYXp5Q29tcG9uZW50ID0gZWxlbWVudFR5cGU7XG4gIHZhciBwYXlsb2FkID0gbGF6eUNvbXBvbmVudC5fcGF5bG9hZDtcbiAgdmFyIGluaXQgPSBsYXp5Q29tcG9uZW50Ll9pbml0O1xuICB2YXIgQ29tcG9uZW50ID0gaW5pdChwYXlsb2FkKTsgLy8gU3RvcmUgdGhlIHVud3JhcHBlZCBjb21wb25lbnQgaW4gdGhlIHR5cGUuXG5cbiAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IENvbXBvbmVudDtcbiAgdmFyIHJlc29sdmVkVGFnID0gd29ya0luUHJvZ3Jlc3MudGFnID0gcmVzb2x2ZUxhenlDb21wb25lbnRUYWcoQ29tcG9uZW50KTtcbiAgdmFyIHJlc29sdmVkUHJvcHMgPSByZXNvbHZlRGVmYXVsdFByb3BzKENvbXBvbmVudCwgcHJvcHMpO1xuICB2YXIgY2hpbGQ7XG5cbiAgc3dpdGNoIChyZXNvbHZlZFRhZykge1xuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHtcbiAgICAgICAgICB2YWxpZGF0ZUZ1bmN0aW9uQ29tcG9uZW50SW5EZXYod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCk7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IENvbXBvbmVudCA9IHJlc29sdmVGdW5jdGlvbkZvckhvdFJlbG9hZGluZyhDb21wb25lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY2hpbGQgPSB1cGRhdGVGdW5jdGlvbkNvbXBvbmVudChudWxsLCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCByZXNvbHZlZFByb3BzLCByZW5kZXJMYW5lcyk7XG4gICAgICAgIHJldHVybiBjaGlsZDtcbiAgICAgIH1cblxuICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy50eXBlID0gQ29tcG9uZW50ID0gcmVzb2x2ZUNsYXNzRm9ySG90UmVsb2FkaW5nKENvbXBvbmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBjaGlsZCA9IHVwZGF0ZUNsYXNzQ29tcG9uZW50KG51bGwsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHJlc29sdmVkUHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgICAgfVxuXG4gICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAge1xuICAgICAgICB7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IENvbXBvbmVudCA9IHJlc29sdmVGb3J3YXJkUmVmRm9ySG90UmVsb2FkaW5nKENvbXBvbmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBjaGlsZCA9IHVwZGF0ZUZvcndhcmRSZWYobnVsbCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgcmVzb2x2ZWRQcm9wcywgcmVuZGVyTGFuZXMpO1xuICAgICAgICByZXR1cm4gY2hpbGQ7XG4gICAgICB9XG5cbiAgICBjYXNlIE1lbW9Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAod29ya0luUHJvZ3Jlc3MudHlwZSAhPT0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUpIHtcbiAgICAgICAgICAgIHZhciBvdXRlclByb3BUeXBlcyA9IENvbXBvbmVudC5wcm9wVHlwZXM7XG5cbiAgICAgICAgICAgIGlmIChvdXRlclByb3BUeXBlcykge1xuICAgICAgICAgICAgICBjaGVja1Byb3BUeXBlcyhvdXRlclByb3BUeXBlcywgcmVzb2x2ZWRQcm9wcywgLy8gUmVzb2x2ZWQgZm9yIG91dGVyIG9ubHlcbiAgICAgICAgICAgICAgJ3Byb3AnLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoQ29tcG9uZW50KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY2hpbGQgPSB1cGRhdGVNZW1vQ29tcG9uZW50KG51bGwsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHJlc29sdmVEZWZhdWx0UHJvcHMoQ29tcG9uZW50LnR5cGUsIHJlc29sdmVkUHJvcHMpLCAvLyBUaGUgaW5uZXIgdHlwZSBjYW4gaGF2ZSBkZWZhdWx0cyB0b29cbiAgICAgICAgcmVuZGVyTGFuZXMpO1xuICAgICAgICByZXR1cm4gY2hpbGQ7XG4gICAgICB9XG4gIH1cblxuICB2YXIgaGludCA9ICcnO1xuXG4gIHtcbiAgICBpZiAoQ29tcG9uZW50ICE9PSBudWxsICYmIHR5cGVvZiBDb21wb25lbnQgPT09ICdvYmplY3QnICYmIENvbXBvbmVudC4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFKSB7XG4gICAgICBoaW50ID0gJyBEaWQgeW91IHdyYXAgYSBjb21wb25lbnQgaW4gUmVhY3QubGF6eSgpIG1vcmUgdGhhbiBvbmNlPyc7XG4gICAgfVxuICB9IC8vIFRoaXMgbWVzc2FnZSBpbnRlbnRpb25hbGx5IGRvZXNuJ3QgbWVudGlvbiBGb3J3YXJkUmVmIG9yIE1lbW9Db21wb25lbnRcbiAgLy8gYmVjYXVzZSB0aGUgZmFjdCB0aGF0IGl0J3MgYSBzZXBhcmF0ZSB0eXBlIG9mIHdvcmsgaXMgYW5cbiAgLy8gaW1wbGVtZW50YXRpb24gZGV0YWlsLlxuXG5cbiAgdGhyb3cgbmV3IEVycm9yKFwiRWxlbWVudCB0eXBlIGlzIGludmFsaWQuIFJlY2VpdmVkIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvOiBcIiArIENvbXBvbmVudCArIFwiLiBcIiArIChcIkxhenkgZWxlbWVudCB0eXBlIG11c3QgcmVzb2x2ZSB0byBhIGNsYXNzIG9yIGZ1bmN0aW9uLlwiICsgaGludCkpO1xufVxuXG5mdW5jdGlvbiBtb3VudEluY29tcGxldGVDbGFzc0NvbXBvbmVudChfY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJMYW5lcykge1xuICByZXNldFN1c3BlbmRlZEN1cnJlbnRPbk1vdW50SW5MZWdhY3lNb2RlKF9jdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7IC8vIFByb21vdGUgdGhlIGZpYmVyIHRvIGEgY2xhc3MgYW5kIHRyeSByZW5kZXJpbmcgYWdhaW4uXG5cbiAgd29ya0luUHJvZ3Jlc3MudGFnID0gQ2xhc3NDb21wb25lbnQ7IC8vIFRoZSByZXN0IG9mIHRoaXMgZnVuY3Rpb24gaXMgYSBmb3JrIG9mIGB1cGRhdGVDbGFzc0NvbXBvbmVudGBcbiAgLy8gUHVzaCBjb250ZXh0IHByb3ZpZGVycyBlYXJseSB0byBwcmV2ZW50IGNvbnRleHQgc3RhY2sgbWlzbWF0Y2hlcy5cbiAgLy8gRHVyaW5nIG1vdW50aW5nIHdlIGRvbid0IGtub3cgdGhlIGNoaWxkIGNvbnRleHQgeWV0IGFzIHRoZSBpbnN0YW5jZSBkb2Vzbid0IGV4aXN0LlxuICAvLyBXZSB3aWxsIGludmFsaWRhdGUgdGhlIGNoaWxkIGNvbnRleHQgaW4gZmluaXNoQ2xhc3NDb21wb25lbnQoKSByaWdodCBhZnRlciByZW5kZXJpbmcuXG5cbiAgdmFyIGhhc0NvbnRleHQ7XG5cbiAgaWYgKGlzQ29udGV4dFByb3ZpZGVyKENvbXBvbmVudCkpIHtcbiAgICBoYXNDb250ZXh0ID0gdHJ1ZTtcbiAgICBwdXNoQ29udGV4dFByb3ZpZGVyKHdvcmtJblByb2dyZXNzKTtcbiAgfSBlbHNlIHtcbiAgICBoYXNDb250ZXh0ID0gZmFsc2U7XG4gIH1cblxuICBwcmVwYXJlVG9SZWFkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICBjb25zdHJ1Y3RDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcyk7XG4gIG1vdW50Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgcmV0dXJuIGZpbmlzaENsYXNzQ29tcG9uZW50KG51bGwsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHRydWUsIGhhc0NvbnRleHQsIHJlbmRlckxhbmVzKTtcbn1cblxuZnVuY3Rpb24gbW91bnRJbmRldGVybWluYXRlQ29tcG9uZW50KF9jdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCByZW5kZXJMYW5lcykge1xuICByZXNldFN1c3BlbmRlZEN1cnJlbnRPbk1vdW50SW5MZWdhY3lNb2RlKF9jdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7XG4gIHZhciBwcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIGNvbnRleHQ7XG5cbiAge1xuICAgIHZhciB1bm1hc2tlZENvbnRleHQgPSBnZXRVbm1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgZmFsc2UpO1xuICAgIGNvbnRleHQgPSBnZXRNYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCB1bm1hc2tlZENvbnRleHQpO1xuICB9XG5cbiAgcHJlcGFyZVRvUmVhZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgdmFyIHZhbHVlO1xuICB2YXIgaGFzSWQ7XG5cbiAge1xuICAgIG1hcmtDb21wb25lbnRSZW5kZXJTdGFydGVkKHdvcmtJblByb2dyZXNzKTtcbiAgfVxuXG4gIHtcbiAgICBpZiAoQ29tcG9uZW50LnByb3RvdHlwZSAmJiB0eXBlb2YgQ29tcG9uZW50LnByb3RvdHlwZS5yZW5kZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKENvbXBvbmVudCkgfHwgJ1Vua25vd24nO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dEJhZENsYXNzW2NvbXBvbmVudE5hbWVdKSB7XG4gICAgICAgIGVycm9yKFwiVGhlIDwlcyAvPiBjb21wb25lbnQgYXBwZWFycyB0byBoYXZlIGEgcmVuZGVyIG1ldGhvZCwgYnV0IGRvZXNuJ3QgZXh0ZW5kIFJlYWN0LkNvbXBvbmVudC4gXCIgKyAnVGhpcyBpcyBsaWtlbHkgdG8gY2F1c2UgZXJyb3JzLiBDaGFuZ2UgJXMgdG8gZXh0ZW5kIFJlYWN0LkNvbXBvbmVudCBpbnN0ZWFkLicsIGNvbXBvbmVudE5hbWUsIGNvbXBvbmVudE5hbWUpO1xuXG4gICAgICAgIGRpZFdhcm5BYm91dEJhZENsYXNzW2NvbXBvbmVudE5hbWVdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAod29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLnJlY29yZExlZ2FjeUNvbnRleHRXYXJuaW5nKHdvcmtJblByb2dyZXNzLCBudWxsKTtcbiAgICB9XG5cbiAgICBzZXRJc1JlbmRlcmluZyh0cnVlKTtcbiAgICBSZWFjdEN1cnJlbnRPd25lciQxLmN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcztcbiAgICB2YWx1ZSA9IHJlbmRlcldpdGhIb29rcyhudWxsLCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBwcm9wcywgY29udGV4dCwgcmVuZGVyTGFuZXMpO1xuICAgIGhhc0lkID0gY2hlY2tEaWRSZW5kZXJJZEhvb2soKTtcbiAgICBzZXRJc1JlbmRlcmluZyhmYWxzZSk7XG4gIH1cblxuICB7XG4gICAgbWFya0NvbXBvbmVudFJlbmRlclN0b3BwZWQoKTtcbiAgfSAvLyBSZWFjdCBEZXZUb29scyByZWFkcyB0aGlzIGZsYWcuXG5cblxuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBQZXJmb3JtZWRXb3JrO1xuXG4gIHtcbiAgICAvLyBTdXBwb3J0IGZvciBtb2R1bGUgY29tcG9uZW50cyBpcyBkZXByZWNhdGVkIGFuZCBpcyByZW1vdmVkIGJlaGluZCBhIGZsYWcuXG4gICAgLy8gV2hldGhlciBvciBub3QgaXQgd291bGQgY3Jhc2ggbGF0ZXIsIHdlIHdhbnQgdG8gc2hvdyBhIGdvb2QgbWVzc2FnZSBpbiBERVYgZmlyc3QuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlLnJlbmRlciA9PT0gJ2Z1bmN0aW9uJyAmJiB2YWx1ZS4kJHR5cGVvZiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YXIgX2NvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoQ29tcG9uZW50KSB8fCAnVW5rbm93bic7XG5cbiAgICAgIGlmICghZGlkV2FybkFib3V0TW9kdWxlUGF0dGVybkNvbXBvbmVudFtfY29tcG9uZW50TmFtZV0pIHtcbiAgICAgICAgZXJyb3IoJ1RoZSA8JXMgLz4gY29tcG9uZW50IGFwcGVhcnMgdG8gYmUgYSBmdW5jdGlvbiBjb21wb25lbnQgdGhhdCByZXR1cm5zIGEgY2xhc3MgaW5zdGFuY2UuICcgKyAnQ2hhbmdlICVzIHRvIGEgY2xhc3MgdGhhdCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCBpbnN0ZWFkLiAnICsgXCJJZiB5b3UgY2FuJ3QgdXNlIGEgY2xhc3MgdHJ5IGFzc2lnbmluZyB0aGUgcHJvdG90eXBlIG9uIHRoZSBmdW5jdGlvbiBhcyBhIHdvcmthcm91bmQuIFwiICsgXCJgJXMucHJvdG90eXBlID0gUmVhY3QuQ29tcG9uZW50LnByb3RvdHlwZWAuIERvbid0IHVzZSBhbiBhcnJvdyBmdW5jdGlvbiBzaW5jZSBpdCBcIiArICdjYW5ub3QgYmUgY2FsbGVkIHdpdGggYG5ld2AgYnkgUmVhY3QuJywgX2NvbXBvbmVudE5hbWUsIF9jb21wb25lbnROYW1lLCBfY29tcG9uZW50TmFtZSk7XG5cbiAgICAgICAgZGlkV2FybkFib3V0TW9kdWxlUGF0dGVybkNvbXBvbmVudFtfY29tcG9uZW50TmFtZV0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICggLy8gUnVuIHRoZXNlIGNoZWNrcyBpbiBwcm9kdWN0aW9uIG9ubHkgaWYgdGhlIGZsYWcgaXMgb2ZmLlxuICAvLyBFdmVudHVhbGx5IHdlJ2xsIGRlbGV0ZSB0aGlzIGJyYW5jaCBhbHRvZ2V0aGVyLlxuICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUucmVuZGVyID09PSAnZnVuY3Rpb24nICYmIHZhbHVlLiQkdHlwZW9mID09PSB1bmRlZmluZWQpIHtcbiAgICB7XG4gICAgICB2YXIgX2NvbXBvbmVudE5hbWUyID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKENvbXBvbmVudCkgfHwgJ1Vua25vd24nO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dE1vZHVsZVBhdHRlcm5Db21wb25lbnRbX2NvbXBvbmVudE5hbWUyXSkge1xuICAgICAgICBlcnJvcignVGhlIDwlcyAvPiBjb21wb25lbnQgYXBwZWFycyB0byBiZSBhIGZ1bmN0aW9uIGNvbXBvbmVudCB0aGF0IHJldHVybnMgYSBjbGFzcyBpbnN0YW5jZS4gJyArICdDaGFuZ2UgJXMgdG8gYSBjbGFzcyB0aGF0IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IGluc3RlYWQuICcgKyBcIklmIHlvdSBjYW4ndCB1c2UgYSBjbGFzcyB0cnkgYXNzaWduaW5nIHRoZSBwcm90b3R5cGUgb24gdGhlIGZ1bmN0aW9uIGFzIGEgd29ya2Fyb3VuZC4gXCIgKyBcImAlcy5wcm90b3R5cGUgPSBSZWFjdC5Db21wb25lbnQucHJvdG90eXBlYC4gRG9uJ3QgdXNlIGFuIGFycm93IGZ1bmN0aW9uIHNpbmNlIGl0IFwiICsgJ2Nhbm5vdCBiZSBjYWxsZWQgd2l0aCBgbmV3YCBieSBSZWFjdC4nLCBfY29tcG9uZW50TmFtZTIsIF9jb21wb25lbnROYW1lMiwgX2NvbXBvbmVudE5hbWUyKTtcblxuICAgICAgICBkaWRXYXJuQWJvdXRNb2R1bGVQYXR0ZXJuQ29tcG9uZW50W19jb21wb25lbnROYW1lMl0gPSB0cnVlO1xuICAgICAgfVxuICAgIH0gLy8gUHJvY2VlZCB1bmRlciB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoaXMgaXMgYSBjbGFzcyBpbnN0YW5jZVxuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcy50YWcgPSBDbGFzc0NvbXBvbmVudDsgLy8gVGhyb3cgb3V0IGFueSBob29rcyB0aGF0IHdlcmUgdXNlZC5cblxuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gbnVsbDsgLy8gUHVzaCBjb250ZXh0IHByb3ZpZGVycyBlYXJseSB0byBwcmV2ZW50IGNvbnRleHQgc3RhY2sgbWlzbWF0Y2hlcy5cbiAgICAvLyBEdXJpbmcgbW91bnRpbmcgd2UgZG9uJ3Qga25vdyB0aGUgY2hpbGQgY29udGV4dCB5ZXQgYXMgdGhlIGluc3RhbmNlIGRvZXNuJ3QgZXhpc3QuXG4gICAgLy8gV2Ugd2lsbCBpbnZhbGlkYXRlIHRoZSBjaGlsZCBjb250ZXh0IGluIGZpbmlzaENsYXNzQ29tcG9uZW50KCkgcmlnaHQgYWZ0ZXIgcmVuZGVyaW5nLlxuXG4gICAgdmFyIGhhc0NvbnRleHQgPSBmYWxzZTtcblxuICAgIGlmIChpc0NvbnRleHRQcm92aWRlcihDb21wb25lbnQpKSB7XG4gICAgICBoYXNDb250ZXh0ID0gdHJ1ZTtcbiAgICAgIHB1c2hDb250ZXh0UHJvdmlkZXIod29ya0luUHJvZ3Jlc3MpO1xuICAgIH0gZWxzZSB7XG4gICAgICBoYXNDb250ZXh0ID0gZmFsc2U7XG4gICAgfVxuXG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IHZhbHVlLnN0YXRlICE9PSBudWxsICYmIHZhbHVlLnN0YXRlICE9PSB1bmRlZmluZWQgPyB2YWx1ZS5zdGF0ZSA6IG51bGw7XG4gICAgaW5pdGlhbGl6ZVVwZGF0ZVF1ZXVlKHdvcmtJblByb2dyZXNzKTtcbiAgICBhZG9wdENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIHZhbHVlKTtcbiAgICBtb3VudENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgcHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgICByZXR1cm4gZmluaXNoQ2xhc3NDb21wb25lbnQobnVsbCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgdHJ1ZSwgaGFzQ29udGV4dCwgcmVuZGVyTGFuZXMpO1xuICB9IGVsc2Uge1xuICAgIC8vIFByb2NlZWQgdW5kZXIgdGhlIGFzc3VtcHRpb24gdGhhdCB0aGlzIGlzIGEgZnVuY3Rpb24gY29tcG9uZW50XG4gICAgd29ya0luUHJvZ3Jlc3MudGFnID0gRnVuY3Rpb25Db21wb25lbnQ7XG5cbiAgICB7XG5cbiAgICAgIGlmICggd29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHModHJ1ZSk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB2YWx1ZSA9IHJlbmRlcldpdGhIb29rcyhudWxsLCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBwcm9wcywgY29udGV4dCwgcmVuZGVyTGFuZXMpO1xuICAgICAgICAgIGhhc0lkID0gY2hlY2tEaWRSZW5kZXJJZEhvb2soKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyhmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSAmJiBoYXNJZCkge1xuICAgICAgcHVzaE1hdGVyaWFsaXplZFRyZWVJZCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgfVxuXG4gICAgcmVjb25jaWxlQ2hpbGRyZW4obnVsbCwgd29ya0luUHJvZ3Jlc3MsIHZhbHVlLCByZW5kZXJMYW5lcyk7XG5cbiAgICB7XG4gICAgICB2YWxpZGF0ZUZ1bmN0aW9uQ29tcG9uZW50SW5EZXYod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICB9XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlRnVuY3Rpb25Db21wb25lbnRJbkRldih3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50KSB7XG4gIHtcbiAgICBpZiAoQ29tcG9uZW50KSB7XG4gICAgICBpZiAoQ29tcG9uZW50LmNoaWxkQ29udGV4dFR5cGVzKSB7XG4gICAgICAgIGVycm9yKCclcyguLi4pOiBjaGlsZENvbnRleHRUeXBlcyBjYW5ub3QgYmUgZGVmaW5lZCBvbiBhIGZ1bmN0aW9uIGNvbXBvbmVudC4nLCBDb21wb25lbnQuZGlzcGxheU5hbWUgfHwgQ29tcG9uZW50Lm5hbWUgfHwgJ0NvbXBvbmVudCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5yZWYgIT09IG51bGwpIHtcbiAgICAgIHZhciBpbmZvID0gJyc7XG4gICAgICB2YXIgb3duZXJOYW1lID0gZ2V0Q3VycmVudEZpYmVyT3duZXJOYW1lSW5EZXZPck51bGwoKTtcblxuICAgICAgaWYgKG93bmVyTmFtZSkge1xuICAgICAgICBpbmZvICs9ICdcXG5cXG5DaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgJyArIG93bmVyTmFtZSArICdgLic7XG4gICAgICB9XG5cbiAgICAgIHZhciB3YXJuaW5nS2V5ID0gb3duZXJOYW1lIHx8ICcnO1xuICAgICAgdmFyIGRlYnVnU291cmNlID0gd29ya0luUHJvZ3Jlc3MuX2RlYnVnU291cmNlO1xuXG4gICAgICBpZiAoZGVidWdTb3VyY2UpIHtcbiAgICAgICAgd2FybmluZ0tleSA9IGRlYnVnU291cmNlLmZpbGVOYW1lICsgJzonICsgZGVidWdTb3VyY2UubGluZU51bWJlcjtcbiAgICAgIH1cblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRGdW5jdGlvblJlZnNbd2FybmluZ0tleV0pIHtcbiAgICAgICAgZGlkV2FybkFib3V0RnVuY3Rpb25SZWZzW3dhcm5pbmdLZXldID0gdHJ1ZTtcblxuICAgICAgICBlcnJvcignRnVuY3Rpb24gY29tcG9uZW50cyBjYW5ub3QgYmUgZ2l2ZW4gcmVmcy4gJyArICdBdHRlbXB0cyB0byBhY2Nlc3MgdGhpcyByZWYgd2lsbCBmYWlsLiAnICsgJ0RpZCB5b3UgbWVhbiB0byB1c2UgUmVhY3QuZm9yd2FyZFJlZigpPyVzJywgaW5mbyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBDb21wb25lbnQuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgX2NvbXBvbmVudE5hbWUzID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKENvbXBvbmVudCkgfHwgJ1Vua25vd24nO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dEdldERlcml2ZWRTdGF0ZU9uRnVuY3Rpb25Db21wb25lbnRbX2NvbXBvbmVudE5hbWUzXSkge1xuICAgICAgICBlcnJvcignJXM6IEZ1bmN0aW9uIGNvbXBvbmVudHMgZG8gbm90IHN1cHBvcnQgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLicsIF9jb21wb25lbnROYW1lMyk7XG5cbiAgICAgICAgZGlkV2FybkFib3V0R2V0RGVyaXZlZFN0YXRlT25GdW5jdGlvbkNvbXBvbmVudFtfY29tcG9uZW50TmFtZTNdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIENvbXBvbmVudC5jb250ZXh0VHlwZSA9PT0gJ29iamVjdCcgJiYgQ29tcG9uZW50LmNvbnRleHRUeXBlICE9PSBudWxsKSB7XG4gICAgICB2YXIgX2NvbXBvbmVudE5hbWU0ID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKENvbXBvbmVudCkgfHwgJ1Vua25vd24nO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dENvbnRleHRUeXBlT25GdW5jdGlvbkNvbXBvbmVudFtfY29tcG9uZW50TmFtZTRdKSB7XG4gICAgICAgIGVycm9yKCclczogRnVuY3Rpb24gY29tcG9uZW50cyBkbyBub3Qgc3VwcG9ydCBjb250ZXh0VHlwZS4nLCBfY29tcG9uZW50TmFtZTQpO1xuXG4gICAgICAgIGRpZFdhcm5BYm91dENvbnRleHRUeXBlT25GdW5jdGlvbkNvbXBvbmVudFtfY29tcG9uZW50TmFtZTRdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIFNVU1BFTkRFRF9NQVJLRVIgPSB7XG4gIGRlaHlkcmF0ZWQ6IG51bGwsXG4gIHRyZWVDb250ZXh0OiBudWxsLFxuICByZXRyeUxhbmU6IE5vTGFuZVxufTtcblxuZnVuY3Rpb24gbW91bnRTdXNwZW5zZU9mZnNjcmVlblN0YXRlKHJlbmRlckxhbmVzKSB7XG4gIHJldHVybiB7XG4gICAgYmFzZUxhbmVzOiByZW5kZXJMYW5lcyxcbiAgICBjYWNoZVBvb2w6IGdldFN1c3BlbmRlZENhY2hlKCksXG4gICAgdHJhbnNpdGlvbnM6IG51bGxcbiAgfTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlU3VzcGVuc2VPZmZzY3JlZW5TdGF0ZShwcmV2T2Zmc2NyZWVuU3RhdGUsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBjYWNoZVBvb2wgPSBudWxsO1xuXG4gIHJldHVybiB7XG4gICAgYmFzZUxhbmVzOiBtZXJnZUxhbmVzKHByZXZPZmZzY3JlZW5TdGF0ZS5iYXNlTGFuZXMsIHJlbmRlckxhbmVzKSxcbiAgICBjYWNoZVBvb2w6IGNhY2hlUG9vbCxcbiAgICB0cmFuc2l0aW9uczogcHJldk9mZnNjcmVlblN0YXRlLnRyYW5zaXRpb25zXG4gIH07XG59IC8vIFRPRE86IFByb2JhYmx5IHNob3VsZCBpbmxpbmUgdGhpcyBiYWNrXG5cblxuZnVuY3Rpb24gc2hvdWxkUmVtYWluT25GYWxsYmFjayhzdXNwZW5zZUNvbnRleHQsIGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICAvLyBJZiB3ZSdyZSBhbHJlYWR5IHNob3dpbmcgYSBmYWxsYmFjaywgdGhlcmUgYXJlIGNhc2VzIHdoZXJlIHdlIG5lZWQgdG9cbiAgLy8gcmVtYWluIG9uIHRoYXQgZmFsbGJhY2sgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBjb250ZW50IGhhcyByZXNvbHZlZC5cbiAgLy8gRm9yIGV4YW1wbGUsIFN1c3BlbnNlTGlzdCBjb29yZGluYXRlcyB3aGVuIG5lc3RlZCBjb250ZW50IGFwcGVhcnMuXG4gIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgdmFyIHN1c3BlbnNlU3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG5cbiAgICBpZiAoc3VzcGVuc2VTdGF0ZSA9PT0gbnVsbCkge1xuICAgICAgLy8gQ3VycmVudGx5IHNob3dpbmcgY29udGVudC4gRG9uJ3QgaGlkZSBpdCwgZXZlbiBpZiBGb3JjZVN1c3BlbnNlRmFsbGJhY2tcbiAgICAgIC8vIGlzIHRydWUuIE1vcmUgcHJlY2lzZSBuYW1lIG1pZ2h0IGJlIFwiRm9yY2VSZW1haW5TdXNwZW5zZUZhbGxiYWNrXCIuXG4gICAgICAvLyBOb3RlOiBUaGlzIGlzIGEgZmFjdG9yaW5nIHNtZWxsLiBDYW4ndCByZW1haW4gb24gYSBmYWxsYmFjayBpZiB0aGVyZSdzXG4gICAgICAvLyBubyBmYWxsYmFjayB0byByZW1haW4gb24uXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9IC8vIE5vdCBjdXJyZW50bHkgc2hvd2luZyBjb250ZW50LiBDb25zdWx0IHRoZSBTdXNwZW5zZSBjb250ZXh0LlxuXG5cbiAgcmV0dXJuIGhhc1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZUNvbnRleHQsIEZvcmNlU3VzcGVuc2VGYWxsYmFjayk7XG59XG5cbmZ1bmN0aW9uIGdldFJlbWFpbmluZ1dvcmtJblByaW1hcnlUcmVlKGN1cnJlbnQsIHJlbmRlckxhbmVzKSB7XG4gIC8vIFRPRE86IFNob3VsZCBub3QgcmVtb3ZlIHJlbmRlciBsYW5lcyB0aGF0IHdlcmUgcGluZ2VkIGR1cmluZyB0aGlzIHJlbmRlclxuICByZXR1cm4gcmVtb3ZlTGFuZXMoY3VycmVudC5jaGlsZExhbmVzLCByZW5kZXJMYW5lcyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVN1c3BlbnNlQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICB2YXIgbmV4dFByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzOyAvLyBUaGlzIGlzIHVzZWQgYnkgRGV2VG9vbHMgdG8gZm9yY2UgYSBib3VuZGFyeSB0byBzdXNwZW5kLlxuXG4gIHtcbiAgICBpZiAoc2hvdWxkU3VzcGVuZCh3b3JrSW5Qcm9ncmVzcykpIHtcbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IERpZENhcHR1cmU7XG4gICAgfVxuICB9XG5cbiAgdmFyIHN1c3BlbnNlQ29udGV4dCA9IHN1c3BlbnNlU3RhY2tDdXJzb3IuY3VycmVudDtcbiAgdmFyIHNob3dGYWxsYmFjayA9IGZhbHNlO1xuICB2YXIgZGlkU3VzcGVuZCA9ICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIERpZENhcHR1cmUpICE9PSBOb0ZsYWdzO1xuXG4gIGlmIChkaWRTdXNwZW5kIHx8IHNob3VsZFJlbWFpbk9uRmFsbGJhY2soc3VzcGVuc2VDb250ZXh0LCBjdXJyZW50KSkge1xuICAgIC8vIFNvbWV0aGluZyBpbiB0aGlzIGJvdW5kYXJ5J3Mgc3VidHJlZSBhbHJlYWR5IHN1c3BlbmRlZC4gU3dpdGNoIHRvXG4gICAgLy8gcmVuZGVyaW5nIHRoZSBmYWxsYmFjayBjaGlsZHJlbi5cbiAgICBzaG93RmFsbGJhY2sgPSB0cnVlO1xuICAgIHdvcmtJblByb2dyZXNzLmZsYWdzICY9IH5EaWRDYXB0dXJlO1xuICB9IGVsc2Uge1xuICAgIC8vIEF0dGVtcHRpbmcgdGhlIG1haW4gY29udGVudFxuICAgIGlmIChjdXJyZW50ID09PSBudWxsIHx8IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgLy8gVGhpcyBpcyBhIG5ldyBtb3VudCBvciB0aGlzIGJvdW5kYXJ5IGlzIGFscmVhZHkgc2hvd2luZyBhIGZhbGxiYWNrIHN0YXRlLlxuICAgICAgLy8gTWFyayB0aGlzIHN1YnRyZWUgY29udGV4dCBhcyBoYXZpbmcgYXQgbGVhc3Qgb25lIGludmlzaWJsZSBwYXJlbnQgdGhhdCBjb3VsZFxuICAgICAgLy8gaGFuZGxlIHRoZSBmYWxsYmFjayBzdGF0ZS5cbiAgICAgIC8vIEF2b2lkZWQgYm91bmRhcmllcyBhcmUgbm90IGNvbnNpZGVyZWQgc2luY2UgdGhleSBjYW5ub3QgaGFuZGxlIHByZWZlcnJlZCBmYWxsYmFjayBzdGF0ZXMuXG4gICAgICB7XG4gICAgICAgIHN1c3BlbnNlQ29udGV4dCA9IGFkZFN1YnRyZWVTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VDb250ZXh0LCBJbnZpc2libGVQYXJlbnRTdXNwZW5zZUNvbnRleHQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHN1c3BlbnNlQ29udGV4dCA9IHNldERlZmF1bHRTaGFsbG93U3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlQ29udGV4dCk7XG4gIHB1c2hTdXNwZW5zZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHN1c3BlbnNlQ29udGV4dCk7IC8vIE9LLCB0aGUgbmV4dCBwYXJ0IGlzIGNvbmZ1c2luZy4gV2UncmUgYWJvdXQgdG8gcmVjb25jaWxlIHRoZSBTdXNwZW5zZVxuICAvLyBib3VuZGFyeSdzIGNoaWxkcmVuLiBUaGlzIGludm9sdmVzIHNvbWUgY3VzdG9tIHJlY29uY2lsaWF0aW9uIGxvZ2ljLiBUd29cbiAgLy8gbWFpbiByZWFzb25zIHRoaXMgaXMgc28gY29tcGxpY2F0ZWQuXG4gIC8vXG4gIC8vIEZpcnN0LCBMZWdhY3kgTW9kZSBoYXMgZGlmZmVyZW50IHNlbWFudGljcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuIFRoZVxuICAvLyBwcmltYXJ5IHRyZWUgd2lsbCBjb21taXQgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlLCBzbyB3aGVuIHdlIGRvIHRoZVxuICAvLyBzZWNvbmQgcGFzcyB0byByZW5kZXIgdGhlIGZhbGxiYWNrLCB3ZSBkbyBzb21lIGV4Y2VlZGluZ2x5LCB1aCwgY2xldmVyXG4gIC8vIGhhY2tzIHRvIG1ha2UgdGhhdCBub3QgdG90YWxseSBicmVhay4gTGlrZSB0cmFuc2ZlcnJpbmcgZWZmZWN0cyBhbmRcbiAgLy8gZGVsZXRpb25zIGZyb20gaGlkZGVuIHRyZWUuIEluIENvbmN1cnJlbnQgTW9kZSwgaXQncyBtdWNoIHNpbXBsZXIsXG4gIC8vIGJlY2F1c2Ugd2UgYmFpbG91dCBvbiB0aGUgcHJpbWFyeSB0cmVlIGNvbXBsZXRlbHkgYW5kIGxlYXZlIGl0IGluIGl0cyBvbGRcbiAgLy8gc3RhdGUsIG5vIGVmZmVjdHMuIFNhbWUgYXMgd2hhdCB3ZSBkbyBmb3IgT2Zmc2NyZWVuIChleGNlcHQgdGhhdFxuICAvLyBPZmZzY3JlZW4gZG9lc24ndCBoYXZlIHRoZSBmaXJzdCByZW5kZXIgcGFzcykuXG4gIC8vXG4gIC8vIFNlY29uZCBpcyBoeWRyYXRpb24uIER1cmluZyBoeWRyYXRpb24sIHRoZSBTdXNwZW5zZSBmaWJlciBoYXMgYSBzbGlnaHRseVxuICAvLyBkaWZmZXJlbnQgbGF5b3V0LCB3aGVyZSB0aGUgY2hpbGQgcG9pbnRzIHRvIGEgZGVoeWRyYXRlZCBmcmFnbWVudCwgd2hpY2hcbiAgLy8gY29udGFpbnMgdGhlIERPTSByZW5kZXJlZCBieSB0aGUgc2VydmVyLlxuICAvL1xuICAvLyBUaGlyZCwgZXZlbiBpZiB5b3Ugc2V0IGFsbCB0aGF0IGFzaWRlLCBTdXNwZW5zZSBpcyBsaWtlIGVycm9yIGJvdW5kYXJpZXMgaW5cbiAgLy8gdGhhdCB3ZSBmaXJzdCB3ZSB0cnkgdG8gcmVuZGVyIG9uZSB0cmVlLCBhbmQgaWYgdGhhdCBmYWlscywgd2UgcmVuZGVyIGFnYWluXG4gIC8vIGFuZCBzd2l0Y2ggdG8gYSBkaWZmZXJlbnQgdHJlZS4gTGlrZSBhIHRyeS9jYXRjaCBibG9jay4gU28gd2UgaGF2ZSB0byB0cmFja1xuICAvLyB3aGljaCBicmFuY2ggd2UncmUgY3VycmVudGx5IHJlbmRlcmluZy4gSWRlYWxseSB3ZSB3b3VsZCBtb2RlbCB0aGlzIHVzaW5nXG4gIC8vIGEgc3RhY2suXG5cbiAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAvLyBJbml0aWFsIG1vdW50XG4gICAgLy8gU3BlY2lhbCBwYXRoIGZvciBoeWRyYXRpb25cbiAgICAvLyBJZiB3ZSdyZSBjdXJyZW50bHkgaHlkcmF0aW5nLCB0cnkgdG8gaHlkcmF0ZSB0aGlzIGJvdW5kYXJ5LlxuICAgIHRyeVRvQ2xhaW1OZXh0SHlkcmF0YWJsZUluc3RhbmNlKHdvcmtJblByb2dyZXNzKTsgLy8gVGhpcyBjb3VsZCd2ZSBiZWVuIGEgZGVoeWRyYXRlZCBzdXNwZW5zZSBjb21wb25lbnQuXG5cbiAgICB2YXIgc3VzcGVuc2VTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgICBpZiAoc3VzcGVuc2VTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgdmFyIGRlaHlkcmF0ZWQgPSBzdXNwZW5zZVN0YXRlLmRlaHlkcmF0ZWQ7XG5cbiAgICAgIGlmIChkZWh5ZHJhdGVkICE9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBtb3VudERlaHlkcmF0ZWRTdXNwZW5zZUNvbXBvbmVudCh3b3JrSW5Qcm9ncmVzcywgZGVoeWRyYXRlZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIG5leHRQcmltYXJ5Q2hpbGRyZW4gPSBuZXh0UHJvcHMuY2hpbGRyZW47XG4gICAgdmFyIG5leHRGYWxsYmFja0NoaWxkcmVuID0gbmV4dFByb3BzLmZhbGxiYWNrO1xuXG4gICAgaWYgKHNob3dGYWxsYmFjaykge1xuICAgICAgdmFyIGZhbGxiYWNrRnJhZ21lbnQgPSBtb3VudFN1c3BlbnNlRmFsbGJhY2tDaGlsZHJlbih3b3JrSW5Qcm9ncmVzcywgbmV4dFByaW1hcnlDaGlsZHJlbiwgbmV4dEZhbGxiYWNrQ2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgICAgIHZhciBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQubWVtb2l6ZWRTdGF0ZSA9IG1vdW50U3VzcGVuc2VPZmZzY3JlZW5TdGF0ZShyZW5kZXJMYW5lcyk7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gU1VTUEVOREVEX01BUktFUjtcblxuICAgICAgcmV0dXJuIGZhbGxiYWNrRnJhZ21lbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBtb3VudFN1c3BlbnNlUHJpbWFyeUNoaWxkcmVuKHdvcmtJblByb2dyZXNzLCBuZXh0UHJpbWFyeUNoaWxkcmVuKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gVGhpcyBpcyBhbiB1cGRhdGUuXG4gICAgLy8gU3BlY2lhbCBwYXRoIGZvciBoeWRyYXRpb25cbiAgICB2YXIgcHJldlN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuXG4gICAgaWYgKHByZXZTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgdmFyIF9kZWh5ZHJhdGVkID0gcHJldlN0YXRlLmRlaHlkcmF0ZWQ7XG5cbiAgICAgIGlmIChfZGVoeWRyYXRlZCAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdXBkYXRlRGVoeWRyYXRlZFN1c3BlbnNlQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBkaWRTdXNwZW5kLCBuZXh0UHJvcHMsIF9kZWh5ZHJhdGVkLCBwcmV2U3RhdGUsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2hvd0ZhbGxiYWNrKSB7XG4gICAgICB2YXIgX25leHRGYWxsYmFja0NoaWxkcmVuID0gbmV4dFByb3BzLmZhbGxiYWNrO1xuICAgICAgdmFyIF9uZXh0UHJpbWFyeUNoaWxkcmVuID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuICAgICAgdmFyIGZhbGxiYWNrQ2hpbGRGcmFnbWVudCA9IHVwZGF0ZVN1c3BlbnNlRmFsbGJhY2tDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgX25leHRQcmltYXJ5Q2hpbGRyZW4sIF9uZXh0RmFsbGJhY2tDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICAgICAgdmFyIF9wcmltYXJ5Q2hpbGRGcmFnbWVudDIgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICAgIHZhciBwcmV2T2Zmc2NyZWVuU3RhdGUgPSBjdXJyZW50LmNoaWxkLm1lbW9pemVkU3RhdGU7XG4gICAgICBfcHJpbWFyeUNoaWxkRnJhZ21lbnQyLm1lbW9pemVkU3RhdGUgPSBwcmV2T2Zmc2NyZWVuU3RhdGUgPT09IG51bGwgPyBtb3VudFN1c3BlbnNlT2Zmc2NyZWVuU3RhdGUocmVuZGVyTGFuZXMpIDogdXBkYXRlU3VzcGVuc2VPZmZzY3JlZW5TdGF0ZShwcmV2T2Zmc2NyZWVuU3RhdGUsIHJlbmRlckxhbmVzKTtcblxuICAgICAgX3ByaW1hcnlDaGlsZEZyYWdtZW50Mi5jaGlsZExhbmVzID0gZ2V0UmVtYWluaW5nV29ya0luUHJpbWFyeVRyZWUoY3VycmVudCwgcmVuZGVyTGFuZXMpO1xuICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IFNVU1BFTkRFRF9NQVJLRVI7XG4gICAgICByZXR1cm4gZmFsbGJhY2tDaGlsZEZyYWdtZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgX25leHRQcmltYXJ5Q2hpbGRyZW4yID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuXG4gICAgICB2YXIgX3ByaW1hcnlDaGlsZEZyYWdtZW50MyA9IHVwZGF0ZVN1c3BlbnNlUHJpbWFyeUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBfbmV4dFByaW1hcnlDaGlsZHJlbjIsIHJlbmRlckxhbmVzKTtcblxuICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gICAgICByZXR1cm4gX3ByaW1hcnlDaGlsZEZyYWdtZW50MztcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbW91bnRTdXNwZW5zZVByaW1hcnlDaGlsZHJlbih3b3JrSW5Qcm9ncmVzcywgcHJpbWFyeUNoaWxkcmVuLCByZW5kZXJMYW5lcykge1xuICB2YXIgbW9kZSA9IHdvcmtJblByb2dyZXNzLm1vZGU7XG4gIHZhciBwcmltYXJ5Q2hpbGRQcm9wcyA9IHtcbiAgICBtb2RlOiAndmlzaWJsZScsXG4gICAgY2hpbGRyZW46IHByaW1hcnlDaGlsZHJlblxuICB9O1xuICB2YXIgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSBtb3VudFdvcmtJblByb2dyZXNzT2Zmc2NyZWVuRmliZXIocHJpbWFyeUNoaWxkUHJvcHMsIG1vZGUpO1xuICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcbiAgcmV0dXJuIHByaW1hcnlDaGlsZEZyYWdtZW50O1xufVxuXG5mdW5jdGlvbiBtb3VudFN1c3BlbnNlRmFsbGJhY2tDaGlsZHJlbih3b3JrSW5Qcm9ncmVzcywgcHJpbWFyeUNoaWxkcmVuLCBmYWxsYmFja0NoaWxkcmVuLCByZW5kZXJMYW5lcykge1xuICB2YXIgbW9kZSA9IHdvcmtJblByb2dyZXNzLm1vZGU7XG4gIHZhciBwcm9ncmVzc2VkUHJpbWFyeUZyYWdtZW50ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gIHZhciBwcmltYXJ5Q2hpbGRQcm9wcyA9IHtcbiAgICBtb2RlOiAnaGlkZGVuJyxcbiAgICBjaGlsZHJlbjogcHJpbWFyeUNoaWxkcmVuXG4gIH07XG4gIHZhciBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcbiAgdmFyIGZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcblxuICBpZiAoKG1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSAmJiBwcm9ncmVzc2VkUHJpbWFyeUZyYWdtZW50ICE9PSBudWxsKSB7XG4gICAgLy8gSW4gbGVnYWN5IG1vZGUsIHdlIGNvbW1pdCB0aGUgcHJpbWFyeSB0cmVlIGFzIGlmIGl0IHN1Y2Nlc3NmdWxseVxuICAgIC8vIGNvbXBsZXRlZCwgZXZlbiB0aG91Z2ggaXQncyBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUuXG4gICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSBwcm9ncmVzc2VkUHJpbWFyeUZyYWdtZW50O1xuICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LmNoaWxkTGFuZXMgPSBOb0xhbmVzO1xuICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LnBlbmRpbmdQcm9wcyA9IHByaW1hcnlDaGlsZFByb3BzO1xuXG4gICAgaWYgKCB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgIC8vIFJlc2V0IHRoZSBkdXJhdGlvbnMgZnJvbSB0aGUgZmlyc3QgcGFzcyBzbyB0aGV5IGFyZW4ndCBpbmNsdWRlZCBpbiB0aGVcbiAgICAgIC8vIGZpbmFsIGFtb3VudHMuIFRoaXMgc2VlbXMgY291bnRlcmludHVpdGl2ZSwgc2luY2Ugd2UncmUgaW50ZW50aW9uYWxseVxuICAgICAgLy8gbm90IG1lYXN1cmluZyBwYXJ0IG9mIHRoZSByZW5kZXIgcGhhc2UsIGJ1dCB0aGlzIG1ha2VzIGl0IG1hdGNoIHdoYXQgd2VcbiAgICAgIC8vIGRvIGluIENvbmN1cnJlbnQgTW9kZS5cbiAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LmFjdHVhbER1cmF0aW9uID0gMDtcbiAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LmFjdHVhbFN0YXJ0VGltZSA9IC0xO1xuICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuc2VsZkJhc2VEdXJhdGlvbiA9IDA7XG4gICAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC50cmVlQmFzZUR1cmF0aW9uID0gMDtcbiAgICB9XG5cbiAgICBmYWxsYmFja0NoaWxkRnJhZ21lbnQgPSBjcmVhdGVGaWJlckZyb21GcmFnbWVudChmYWxsYmFja0NoaWxkcmVuLCBtb2RlLCByZW5kZXJMYW5lcywgbnVsbCk7XG4gIH0gZWxzZSB7XG4gICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSBtb3VudFdvcmtJblByb2dyZXNzT2Zmc2NyZWVuRmliZXIocHJpbWFyeUNoaWxkUHJvcHMsIG1vZGUpO1xuICAgIGZhbGxiYWNrQ2hpbGRGcmFnbWVudCA9IGNyZWF0ZUZpYmVyRnJvbUZyYWdtZW50KGZhbGxiYWNrQ2hpbGRyZW4sIG1vZGUsIHJlbmRlckxhbmVzLCBudWxsKTtcbiAgfVxuXG4gIHByaW1hcnlDaGlsZEZyYWdtZW50LnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICBmYWxsYmFja0NoaWxkRnJhZ21lbnQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gIHByaW1hcnlDaGlsZEZyYWdtZW50LnNpYmxpbmcgPSBmYWxsYmFja0NoaWxkRnJhZ21lbnQ7XG4gIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcHJpbWFyeUNoaWxkRnJhZ21lbnQ7XG4gIHJldHVybiBmYWxsYmFja0NoaWxkRnJhZ21lbnQ7XG59XG5cbmZ1bmN0aW9uIG1vdW50V29ya0luUHJvZ3Jlc3NPZmZzY3JlZW5GaWJlcihvZmZzY3JlZW5Qcm9wcywgbW9kZSwgcmVuZGVyTGFuZXMpIHtcbiAgLy8gVGhlIHByb3BzIGFyZ3VtZW50IHRvIGBjcmVhdGVGaWJlckZyb21PZmZzY3JlZW5gIGlzIGBhbnlgIHR5cGVkLCBzbyB3ZSB1c2VcbiAgLy8gdGhpcyB3cmFwcGVyIGZ1bmN0aW9uIHRvIGNvbnN0cmFpbiBpdC5cbiAgcmV0dXJuIGNyZWF0ZUZpYmVyRnJvbU9mZnNjcmVlbihvZmZzY3JlZW5Qcm9wcywgbW9kZSwgTm9MYW5lcywgbnVsbCk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVdvcmtJblByb2dyZXNzT2Zmc2NyZWVuRmliZXIoY3VycmVudCwgb2Zmc2NyZWVuUHJvcHMpIHtcbiAgLy8gVGhlIHByb3BzIGFyZ3VtZW50IHRvIGBjcmVhdGVXb3JrSW5Qcm9ncmVzc2AgaXMgYGFueWAgdHlwZWQsIHNvIHdlIHVzZSB0aGlzXG4gIC8vIHdyYXBwZXIgZnVuY3Rpb24gdG8gY29uc3RyYWluIGl0LlxuICByZXR1cm4gY3JlYXRlV29ya0luUHJvZ3Jlc3MoY3VycmVudCwgb2Zmc2NyZWVuUHJvcHMpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVTdXNwZW5zZVByaW1hcnlDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcHJpbWFyeUNoaWxkcmVuLCByZW5kZXJMYW5lcykge1xuICB2YXIgY3VycmVudFByaW1hcnlDaGlsZEZyYWdtZW50ID0gY3VycmVudC5jaGlsZDtcbiAgdmFyIGN1cnJlbnRGYWxsYmFja0NoaWxkRnJhZ21lbnQgPSBjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQuc2libGluZztcbiAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NPZmZzY3JlZW5GaWJlcihjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQsIHtcbiAgICBtb2RlOiAndmlzaWJsZScsXG4gICAgY2hpbGRyZW46IHByaW1hcnlDaGlsZHJlblxuICB9KTtcblxuICBpZiAoKHdvcmtJblByb2dyZXNzLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSkge1xuICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LmxhbmVzID0gcmVuZGVyTGFuZXM7XG4gIH1cblxuICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuc2libGluZyA9IG51bGw7XG5cbiAgaWYgKGN1cnJlbnRGYWxsYmFja0NoaWxkRnJhZ21lbnQgIT09IG51bGwpIHtcbiAgICAvLyBEZWxldGUgdGhlIGZhbGxiYWNrIGNoaWxkIGZyYWdtZW50XG4gICAgdmFyIGRlbGV0aW9ucyA9IHdvcmtJblByb2dyZXNzLmRlbGV0aW9ucztcblxuICAgIGlmIChkZWxldGlvbnMgPT09IG51bGwpIHtcbiAgICAgIHdvcmtJblByb2dyZXNzLmRlbGV0aW9ucyA9IFtjdXJyZW50RmFsbGJhY2tDaGlsZEZyYWdtZW50XTtcbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IENoaWxkRGVsZXRpb247XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0aW9ucy5wdXNoKGN1cnJlbnRGYWxsYmFja0NoaWxkRnJhZ21lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcHJpbWFyeUNoaWxkRnJhZ21lbnQ7XG4gIHJldHVybiBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlU3VzcGVuc2VGYWxsYmFja0NoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBwcmltYXJ5Q2hpbGRyZW4sIGZhbGxiYWNrQ2hpbGRyZW4sIHJlbmRlckxhbmVzKSB7XG4gIHZhciBtb2RlID0gd29ya0luUHJvZ3Jlc3MubW9kZTtcbiAgdmFyIGN1cnJlbnRQcmltYXJ5Q2hpbGRGcmFnbWVudCA9IGN1cnJlbnQuY2hpbGQ7XG4gIHZhciBjdXJyZW50RmFsbGJhY2tDaGlsZEZyYWdtZW50ID0gY3VycmVudFByaW1hcnlDaGlsZEZyYWdtZW50LnNpYmxpbmc7XG4gIHZhciBwcmltYXJ5Q2hpbGRQcm9wcyA9IHtcbiAgICBtb2RlOiAnaGlkZGVuJyxcbiAgICBjaGlsZHJlbjogcHJpbWFyeUNoaWxkcmVuXG4gIH07XG4gIHZhciBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcblxuICBpZiAoIC8vIEluIGxlZ2FjeSBtb2RlLCB3ZSBjb21taXQgdGhlIHByaW1hcnkgdHJlZSBhcyBpZiBpdCBzdWNjZXNzZnVsbHlcbiAgLy8gY29tcGxldGVkLCBldmVuIHRob3VnaCBpdCdzIGluIGFuIGluY29uc2lzdGVudCBzdGF0ZS5cbiAgKG1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSAmJiAvLyBNYWtlIHN1cmUgd2UncmUgb24gdGhlIHNlY29uZCBwYXNzLCBpLmUuIHRoZSBwcmltYXJ5IGNoaWxkIGZyYWdtZW50IHdhc1xuICAvLyBhbHJlYWR5IGNsb25lZC4gSW4gbGVnYWN5IG1vZGUsIHRoZSBvbmx5IGNhc2Ugd2hlcmUgdGhpcyBpc24ndCB0cnVlIGlzXG4gIC8vIHdoZW4gRGV2VG9vbHMgZm9yY2VzIHVzIHRvIGRpc3BsYXkgYSBmYWxsYmFjazsgd2Ugc2tpcCB0aGUgZmlyc3QgcmVuZGVyXG4gIC8vIHBhc3MgZW50aXJlbHkgYW5kIGdvIHN0cmFpZ2h0IHRvIHJlbmRlcmluZyB0aGUgZmFsbGJhY2suIChJbiBDb25jdXJyZW50XG4gIC8vIE1vZGUsIFN1c3BlbnNlTGlzdCBjYW4gYWxzbyB0cmlnZ2VyIHRoaXMgc2NlbmFyaW8sIGJ1dCB0aGlzIGlzIGEgbGVnYWN5LVxuICAvLyBvbmx5IGNvZGVwYXRoLilcbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgIT09IGN1cnJlbnRQcmltYXJ5Q2hpbGRGcmFnbWVudCkge1xuICAgIHZhciBwcm9ncmVzc2VkUHJpbWFyeUZyYWdtZW50ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSBwcm9ncmVzc2VkUHJpbWFyeUZyYWdtZW50O1xuICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LmNoaWxkTGFuZXMgPSBOb0xhbmVzO1xuICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LnBlbmRpbmdQcm9wcyA9IHByaW1hcnlDaGlsZFByb3BzO1xuXG4gICAgaWYgKCB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgIC8vIFJlc2V0IHRoZSBkdXJhdGlvbnMgZnJvbSB0aGUgZmlyc3QgcGFzcyBzbyB0aGV5IGFyZW4ndCBpbmNsdWRlZCBpbiB0aGVcbiAgICAgIC8vIGZpbmFsIGFtb3VudHMuIFRoaXMgc2VlbXMgY291bnRlcmludHVpdGl2ZSwgc2luY2Ugd2UncmUgaW50ZW50aW9uYWxseVxuICAgICAgLy8gbm90IG1lYXN1cmluZyBwYXJ0IG9mIHRoZSByZW5kZXIgcGhhc2UsIGJ1dCB0aGlzIG1ha2VzIGl0IG1hdGNoIHdoYXQgd2VcbiAgICAgIC8vIGRvIGluIENvbmN1cnJlbnQgTW9kZS5cbiAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LmFjdHVhbER1cmF0aW9uID0gMDtcbiAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LmFjdHVhbFN0YXJ0VGltZSA9IC0xO1xuICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuc2VsZkJhc2VEdXJhdGlvbiA9IGN1cnJlbnRQcmltYXJ5Q2hpbGRGcmFnbWVudC5zZWxmQmFzZUR1cmF0aW9uO1xuICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQudHJlZUJhc2VEdXJhdGlvbiA9IGN1cnJlbnRQcmltYXJ5Q2hpbGRGcmFnbWVudC50cmVlQmFzZUR1cmF0aW9uO1xuICAgIH0gLy8gVGhlIGZhbGxiYWNrIGZpYmVyIHdhcyBhZGRlZCBhcyBhIGRlbGV0aW9uIGR1cmluZyB0aGUgZmlyc3QgcGFzcy5cbiAgICAvLyBIb3dldmVyLCBzaW5jZSB3ZSdyZSBnb2luZyB0byByZW1haW4gb24gdGhlIGZhbGxiYWNrLCB3ZSBubyBsb25nZXIgd2FudFxuICAgIC8vIHRvIGRlbGV0ZSBpdC5cblxuXG4gICAgd29ya0luUHJvZ3Jlc3MuZGVsZXRpb25zID0gbnVsbDtcbiAgfSBlbHNlIHtcbiAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IHVwZGF0ZVdvcmtJblByb2dyZXNzT2Zmc2NyZWVuRmliZXIoY3VycmVudFByaW1hcnlDaGlsZEZyYWdtZW50LCBwcmltYXJ5Q2hpbGRQcm9wcyk7IC8vIFNpbmNlIHdlJ3JlIHJldXNpbmcgYSBjdXJyZW50IHRyZWUsIHdlIG5lZWQgdG8gcmV1c2UgdGhlIGZsYWdzLCB0b28uXG4gICAgLy8gKFdlIGRvbid0IGRvIHRoaXMgaW4gbGVnYWN5IG1vZGUsIGJlY2F1c2UgaW4gbGVnYWN5IG1vZGUgd2UgZG9uJ3QgcmUtdXNlXG4gICAgLy8gdGhlIGN1cnJlbnQgdHJlZTsgc2VlIHByZXZpb3VzIGJyYW5jaC4pXG5cbiAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5zdWJ0cmVlRmxhZ3MgPSBjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQuc3VidHJlZUZsYWdzICYgU3RhdGljTWFzaztcbiAgfVxuXG4gIHZhciBmYWxsYmFja0NoaWxkRnJhZ21lbnQ7XG5cbiAgaWYgKGN1cnJlbnRGYWxsYmFja0NoaWxkRnJhZ21lbnQgIT09IG51bGwpIHtcbiAgICBmYWxsYmFja0NoaWxkRnJhZ21lbnQgPSBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhjdXJyZW50RmFsbGJhY2tDaGlsZEZyYWdtZW50LCBmYWxsYmFja0NoaWxkcmVuKTtcbiAgfSBlbHNlIHtcbiAgICBmYWxsYmFja0NoaWxkRnJhZ21lbnQgPSBjcmVhdGVGaWJlckZyb21GcmFnbWVudChmYWxsYmFja0NoaWxkcmVuLCBtb2RlLCByZW5kZXJMYW5lcywgbnVsbCk7IC8vIE5lZWRzIGEgcGxhY2VtZW50IGVmZmVjdCBiZWNhdXNlIHRoZSBwYXJlbnQgKHRoZSBTdXNwZW5zZSBib3VuZGFyeSkgYWxyZWFkeVxuICAgIC8vIG1vdW50ZWQgYnV0IHRoaXMgaXMgYSBuZXcgZmliZXIuXG5cbiAgICBmYWxsYmFja0NoaWxkRnJhZ21lbnQuZmxhZ3MgfD0gUGxhY2VtZW50O1xuICB9XG5cbiAgZmFsbGJhY2tDaGlsZEZyYWdtZW50LnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuc2libGluZyA9IGZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcbiAgcmV0dXJuIGZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcbn1cblxuZnVuY3Rpb24gcmV0cnlTdXNwZW5zZUNvbXBvbmVudFdpdGhvdXRIeWRyYXRpbmcoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzLCByZWNvdmVyYWJsZUVycm9yKSB7XG4gIC8vIEZhbGxpbmcgYmFjayB0byBjbGllbnQgcmVuZGVyaW5nLiBCZWNhdXNlIHRoaXMgaGFzIHBlcmZvcm1hbmNlXG4gIC8vIGltcGxpY2F0aW9ucywgaXQncyBjb25zaWRlcmVkIGEgcmVjb3ZlcmFibGUgZXJyb3IsIGV2ZW4gdGhvdWdoIHRoZSB1c2VyXG4gIC8vIGxpa2VseSB3b24ndCBvYnNlcnZlIGFueXRoaW5nIHdyb25nIHdpdGggdGhlIFVJLlxuICAvL1xuICAvLyBUaGUgZXJyb3IgaXMgcGFzc2VkIGluIGFzIGFuIGFyZ3VtZW50IHRvIGVuZm9yY2UgdGhhdCBldmVyeSBjYWxsZXIgcHJvdmlkZVxuICAvLyBhIGN1c3RvbSBtZXNzYWdlLCBvciBleHBsaWNpdGx5IG9wdCBvdXQgKGN1cnJlbnRseSB0aGUgb25seSBwYXRoIHRoYXQgb3B0c1xuICAvLyBvdXQgaXMgbGVnYWN5IG1vZGU7IGV2ZXJ5IGNvbmN1cnJlbnQgcGF0aCBwcm92aWRlcyBhbiBlcnJvcikuXG4gIGlmIChyZWNvdmVyYWJsZUVycm9yICE9PSBudWxsKSB7XG4gICAgcXVldWVIeWRyYXRpb25FcnJvcihyZWNvdmVyYWJsZUVycm9yKTtcbiAgfSAvLyBUaGlzIHdpbGwgYWRkIHRoZSBvbGQgZmliZXIgdG8gdGhlIGRlbGV0aW9uIGxpc3RcblxuXG4gIHJlY29uY2lsZUNoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBjdXJyZW50LmNoaWxkLCBudWxsLCByZW5kZXJMYW5lcyk7IC8vIFdlJ3JlIG5vdyBub3Qgc3VzcGVuZGVkIG5vciBkZWh5ZHJhdGVkLlxuXG4gIHZhciBuZXh0UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciBwcmltYXJ5Q2hpbGRyZW4gPSBuZXh0UHJvcHMuY2hpbGRyZW47XG4gIHZhciBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IG1vdW50U3VzcGVuc2VQcmltYXJ5Q2hpbGRyZW4od29ya0luUHJvZ3Jlc3MsIHByaW1hcnlDaGlsZHJlbik7IC8vIE5lZWRzIGEgcGxhY2VtZW50IGVmZmVjdCBiZWNhdXNlIHRoZSBwYXJlbnQgKHRoZSBTdXNwZW5zZSBib3VuZGFyeSkgYWxyZWFkeVxuICAvLyBtb3VudGVkIGJ1dCB0aGlzIGlzIGEgbmV3IGZpYmVyLlxuXG4gIHByaW1hcnlDaGlsZEZyYWdtZW50LmZsYWdzIHw9IFBsYWNlbWVudDtcbiAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gIHJldHVybiBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcbn1cblxuZnVuY3Rpb24gbW91bnRTdXNwZW5zZUZhbGxiYWNrQWZ0ZXJSZXRyeVdpdGhvdXRIeWRyYXRpbmcoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHByaW1hcnlDaGlsZHJlbiwgZmFsbGJhY2tDaGlsZHJlbiwgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIGZpYmVyTW9kZSA9IHdvcmtJblByb2dyZXNzLm1vZGU7XG4gIHZhciBwcmltYXJ5Q2hpbGRQcm9wcyA9IHtcbiAgICBtb2RlOiAndmlzaWJsZScsXG4gICAgY2hpbGRyZW46IHByaW1hcnlDaGlsZHJlblxuICB9O1xuICB2YXIgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSBtb3VudFdvcmtJblByb2dyZXNzT2Zmc2NyZWVuRmliZXIocHJpbWFyeUNoaWxkUHJvcHMsIGZpYmVyTW9kZSk7XG4gIHZhciBmYWxsYmFja0NoaWxkRnJhZ21lbnQgPSBjcmVhdGVGaWJlckZyb21GcmFnbWVudChmYWxsYmFja0NoaWxkcmVuLCBmaWJlck1vZGUsIHJlbmRlckxhbmVzLCBudWxsKTsgLy8gTmVlZHMgYSBwbGFjZW1lbnQgZWZmZWN0IGJlY2F1c2UgdGhlIHBhcmVudCAodGhlIFN1c3BlbnNlXG4gIC8vIGJvdW5kYXJ5KSBhbHJlYWR5IG1vdW50ZWQgYnV0IHRoaXMgaXMgYSBuZXcgZmliZXIuXG5cbiAgZmFsbGJhY2tDaGlsZEZyYWdtZW50LmZsYWdzIHw9IFBsYWNlbWVudDtcbiAgcHJpbWFyeUNoaWxkRnJhZ21lbnQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gIGZhbGxiYWNrQ2hpbGRGcmFnbWVudC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuc2libGluZyA9IGZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcblxuICBpZiAoKHdvcmtJblByb2dyZXNzLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZSkge1xuICAgIC8vIFdlIHdpbGwgaGF2ZSBkcm9wcGVkIHRoZSBlZmZlY3QgbGlzdCB3aGljaCBjb250YWlucyB0aGVcbiAgICAvLyBkZWxldGlvbi4gV2UgbmVlZCB0byByZWNvbmNpbGUgdG8gZGVsZXRlIHRoZSBjdXJyZW50IGNoaWxkLlxuICAgIHJlY29uY2lsZUNoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBjdXJyZW50LmNoaWxkLCBudWxsLCByZW5kZXJMYW5lcyk7XG4gIH1cblxuICByZXR1cm4gZmFsbGJhY2tDaGlsZEZyYWdtZW50O1xufVxuXG5mdW5jdGlvbiBtb3VudERlaHlkcmF0ZWRTdXNwZW5zZUNvbXBvbmVudCh3b3JrSW5Qcm9ncmVzcywgc3VzcGVuc2VJbnN0YW5jZSwgcmVuZGVyTGFuZXMpIHtcbiAgLy8gRHVyaW5nIHRoZSBmaXJzdCBwYXNzLCB3ZSdsbCBiYWlsIG91dCBhbmQgbm90IGRyaWxsIGludG8gdGhlIGNoaWxkcmVuLlxuICAvLyBJbnN0ZWFkLCB3ZSdsbCBsZWF2ZSB0aGUgY29udGVudCBpbiBwbGFjZSBhbmQgdHJ5IHRvIGh5ZHJhdGUgaXQgbGF0ZXIuXG4gIGlmICgod29ya0luUHJvZ3Jlc3MubW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlKSB7XG4gICAge1xuICAgICAgZXJyb3IoJ0Nhbm5vdCBoeWRyYXRlIFN1c3BlbnNlIGluIGxlZ2FjeSBtb2RlLiBTd2l0Y2ggZnJvbSAnICsgJ1JlYWN0RE9NLmh5ZHJhdGUoZWxlbWVudCwgY29udGFpbmVyKSB0byAnICsgJ1JlYWN0RE9NQ2xpZW50Lmh5ZHJhdGVSb290KGNvbnRhaW5lciwgPEFwcCAvPiknICsgJy5yZW5kZXIoZWxlbWVudCkgb3IgcmVtb3ZlIHRoZSBTdXNwZW5zZSBjb21wb25lbnRzIGZyb20gJyArICd0aGUgc2VydmVyIHJlbmRlcmVkIGNvbXBvbmVudHMuJyk7XG4gICAgfVxuXG4gICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBsYW5lVG9MYW5lcyhTeW5jTGFuZSk7XG4gIH0gZWxzZSBpZiAoaXNTdXNwZW5zZUluc3RhbmNlRmFsbGJhY2soc3VzcGVuc2VJbnN0YW5jZSkpIHtcbiAgICAvLyBUaGlzIGlzIGEgY2xpZW50LW9ubHkgYm91bmRhcnkuIFNpbmNlIHdlIHdvbid0IGdldCBhbnkgY29udGVudCBmcm9tIHRoZSBzZXJ2ZXJcbiAgICAvLyBmb3IgdGhpcywgd2UgbmVlZCB0byBzY2hlZHVsZSB0aGF0IGF0IGEgaGlnaGVyIHByaW9yaXR5IGJhc2VkIG9uIHdoZW4gaXQgd291bGRcbiAgICAvLyBoYXZlIHRpbWVkIG91dC4gSW4gdGhlb3J5IHdlIGNvdWxkIHJlbmRlciBpdCBpbiB0aGlzIHBhc3MgYnV0IGl0IHdvdWxkIGhhdmUgdGhlXG4gICAgLy8gd3JvbmcgcHJpb3JpdHkgYXNzb2NpYXRlZCB3aXRoIGl0IGFuZCB3aWxsIHByZXZlbnQgaHlkcmF0aW9uIG9mIHBhcmVudCBwYXRoLlxuICAgIC8vIEluc3RlYWQsIHdlJ2xsIGxlYXZlIHdvcmsgbGVmdCBvbiBpdCB0byByZW5kZXIgaXQgaW4gYSBzZXBhcmF0ZSBjb21taXQuXG4gICAgLy8gVE9ETyBUaGlzIHRpbWUgc2hvdWxkIGJlIHRoZSB0aW1lIGF0IHdoaWNoIHRoZSBzZXJ2ZXIgcmVuZGVyZWQgcmVzcG9uc2UgdGhhdCBpc1xuICAgIC8vIGEgcGFyZW50IHRvIHRoaXMgYm91bmRhcnkgd2FzIGRpc3BsYXllZC4gSG93ZXZlciwgc2luY2Ugd2UgY3VycmVudGx5IGRvbid0IGhhdmVcbiAgICAvLyBhIHByb3RvY29sIHRvIHRyYW5zZmVyIHRoYXQgdGltZSwgd2UnbGwganVzdCBlc3RpbWF0ZSBpdCBieSB1c2luZyB0aGUgY3VycmVudFxuICAgIC8vIHRpbWUuIFRoaXMgd2lsbCBtZWFuIHRoYXQgU3VzcGVuc2UgdGltZW91dHMgYXJlIHNsaWdodGx5IHNoaWZ0ZWQgdG8gbGF0ZXIgdGhhblxuICAgIC8vIHRoZXkgc2hvdWxkIGJlLlxuICAgIC8vIFNjaGVkdWxlIGEgbm9ybWFsIHByaSB1cGRhdGUgdG8gcmVuZGVyIHRoaXMgY29udGVudC5cbiAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IGxhbmVUb0xhbmVzKERlZmF1bHRIeWRyYXRpb25MYW5lKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBXZSdsbCBjb250aW51ZSBoeWRyYXRpbmcgdGhlIHJlc3QgYXQgb2Zmc2NyZWVuIHByaW9yaXR5IHNpbmNlIHdlJ2xsIGFscmVhZHlcbiAgICAvLyBiZSBzaG93aW5nIHRoZSByaWdodCBjb250ZW50IGNvbWluZyBmcm9tIHRoZSBzZXJ2ZXIsIGl0IGlzIG5vIHJ1c2guXG4gICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBsYW5lVG9MYW5lcyhPZmZzY3JlZW5MYW5lKTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVEZWh5ZHJhdGVkU3VzcGVuc2VDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIGRpZFN1c3BlbmQsIG5leHRQcm9wcywgc3VzcGVuc2VJbnN0YW5jZSwgc3VzcGVuc2VTdGF0ZSwgcmVuZGVyTGFuZXMpIHtcbiAgaWYgKCFkaWRTdXNwZW5kKSB7XG4gICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgcmVuZGVyIHBhc3MuIEF0dGVtcHQgdG8gaHlkcmF0ZS5cbiAgICAvLyBXZSBzaG91bGQgbmV2ZXIgYmUgaHlkcmF0aW5nIGF0IHRoaXMgcG9pbnQgYmVjYXVzZSBpdCBpcyB0aGUgZmlyc3QgcGFzcyxcbiAgICAvLyBidXQgYWZ0ZXIgd2UndmUgYWxyZWFkeSBjb21taXR0ZWQgb25jZS5cbiAgICB3YXJuSWZIeWRyYXRpbmcoKTtcblxuICAgIGlmICgod29ya0luUHJvZ3Jlc3MubW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlKSB7XG4gICAgICByZXR1cm4gcmV0cnlTdXNwZW5zZUNvbXBvbmVudFdpdGhvdXRIeWRyYXRpbmcoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzLCAvLyBUT0RPOiBXaGVuIHdlIGRlbGV0ZSBsZWdhY3kgbW9kZSwgd2Ugc2hvdWxkIG1ha2UgdGhpcyBlcnJvciBhcmd1bWVudFxuICAgICAgLy8gcmVxdWlyZWQgXHUyMDE0IGV2ZXJ5IGNvbmN1cnJlbnQgbW9kZSBwYXRoIHRoYXQgY2F1c2VzIGh5ZHJhdGlvbiB0b1xuICAgICAgLy8gZGUtb3B0IHRvIGNsaWVudCByZW5kZXJpbmcgc2hvdWxkIGhhdmUgYW4gZXJyb3IgbWVzc2FnZS5cbiAgICAgIG51bGwpO1xuICAgIH1cblxuICAgIGlmIChpc1N1c3BlbnNlSW5zdGFuY2VGYWxsYmFjayhzdXNwZW5zZUluc3RhbmNlKSkge1xuICAgICAgLy8gVGhpcyBib3VuZGFyeSBpcyBpbiBhIHBlcm1hbmVudCBmYWxsYmFjayBzdGF0ZS4gSW4gdGhpcyBjYXNlLCB3ZSdsbCBuZXZlclxuICAgICAgLy8gZ2V0IGFuIHVwZGF0ZSBhbmQgd2UnbGwgbmV2ZXIgYmUgYWJsZSB0byBoeWRyYXRlIHRoZSBmaW5hbCBjb250ZW50LiBMZXQncyBqdXN0IHRyeSB0aGVcbiAgICAgIC8vIGNsaWVudCBzaWRlIHJlbmRlciBpbnN0ZWFkLlxuICAgICAgdmFyIGRpZ2VzdCwgbWVzc2FnZSwgc3RhY2s7XG5cbiAgICAgIHtcbiAgICAgICAgdmFyIF9nZXRTdXNwZW5zZUluc3RhbmNlRiA9IGdldFN1c3BlbnNlSW5zdGFuY2VGYWxsYmFja0Vycm9yRGV0YWlscyhzdXNwZW5zZUluc3RhbmNlKTtcblxuICAgICAgICBkaWdlc3QgPSBfZ2V0U3VzcGVuc2VJbnN0YW5jZUYuZGlnZXN0O1xuICAgICAgICBtZXNzYWdlID0gX2dldFN1c3BlbnNlSW5zdGFuY2VGLm1lc3NhZ2U7XG4gICAgICAgIHN0YWNrID0gX2dldFN1c3BlbnNlSW5zdGFuY2VGLnN0YWNrO1xuICAgICAgfVxuXG4gICAgICB2YXIgZXJyb3I7XG5cbiAgICAgIGlmIChtZXNzYWdlKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9wcm9kLWVycm9yLWNvZGVzXG4gICAgICAgIGVycm9yID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoJ1RoZSBzZXJ2ZXIgY291bGQgbm90IGZpbmlzaCB0aGlzIFN1c3BlbnNlIGJvdW5kYXJ5LCBsaWtlbHkgJyArICdkdWUgdG8gYW4gZXJyb3IgZHVyaW5nIHNlcnZlciByZW5kZXJpbmcuIFN3aXRjaGVkIHRvICcgKyAnY2xpZW50IHJlbmRlcmluZy4nKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGNhcHR1cmVkVmFsdWUgPSBjcmVhdGVDYXB0dXJlZFZhbHVlKGVycm9yLCBkaWdlc3QsIHN0YWNrKTtcbiAgICAgIHJldHVybiByZXRyeVN1c3BlbnNlQ29tcG9uZW50V2l0aG91dEh5ZHJhdGluZyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMsIGNhcHR1cmVkVmFsdWUpO1xuICAgIH1cbiAgICAvLyBhbnkgY29udGV4dCBoYXMgY2hhbmdlZCwgd2UgbmVlZCB0byB0cmVhdCBpcyBhcyBpZiB0aGUgaW5wdXQgbWlnaHQgaGF2ZSBjaGFuZ2VkLlxuXG5cbiAgICB2YXIgaGFzQ29udGV4dENoYW5nZWQgPSBpbmNsdWRlc1NvbWVMYW5lKHJlbmRlckxhbmVzLCBjdXJyZW50LmNoaWxkTGFuZXMpO1xuXG4gICAgaWYgKGRpZFJlY2VpdmVVcGRhdGUgfHwgaGFzQ29udGV4dENoYW5nZWQpIHtcbiAgICAgIC8vIFRoaXMgYm91bmRhcnkgaGFzIGNoYW5nZWQgc2luY2UgdGhlIGZpcnN0IHJlbmRlci4gVGhpcyBtZWFucyB0aGF0IHdlIGFyZSBub3cgdW5hYmxlIHRvXG4gICAgICAvLyBoeWRyYXRlIGl0LiBXZSBtaWdodCBzdGlsbCBiZSBhYmxlIHRvIGh5ZHJhdGUgaXQgdXNpbmcgYSBoaWdoZXIgcHJpb3JpdHkgbGFuZS5cbiAgICAgIHZhciByb290ID0gZ2V0V29ya0luUHJvZ3Jlc3NSb290KCk7XG5cbiAgICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICAgIHZhciBhdHRlbXB0SHlkcmF0aW9uQXRMYW5lID0gZ2V0QnVtcGVkTGFuZUZvckh5ZHJhdGlvbihyb290LCByZW5kZXJMYW5lcyk7XG5cbiAgICAgICAgaWYgKGF0dGVtcHRIeWRyYXRpb25BdExhbmUgIT09IE5vTGFuZSAmJiBhdHRlbXB0SHlkcmF0aW9uQXRMYW5lICE9PSBzdXNwZW5zZVN0YXRlLnJldHJ5TGFuZSkge1xuICAgICAgICAgIC8vIEludGVudGlvbmFsbHkgbXV0YXRpbmcgc2luY2UgdGhpcyByZW5kZXIgd2lsbCBnZXQgaW50ZXJydXB0ZWQuIFRoaXNcbiAgICAgICAgICAvLyBpcyBvbmUgb2YgdGhlIHZlcnkgcmFyZSB0aW1lcyB3aGVyZSB3ZSBtdXRhdGUgdGhlIGN1cnJlbnQgdHJlZVxuICAgICAgICAgIC8vIGR1cmluZyB0aGUgcmVuZGVyIHBoYXNlLlxuICAgICAgICAgIHN1c3BlbnNlU3RhdGUucmV0cnlMYW5lID0gYXR0ZW1wdEh5ZHJhdGlvbkF0TGFuZTsgLy8gVE9ETzogSWRlYWxseSB0aGlzIHdvdWxkIGluaGVyaXQgdGhlIGV2ZW50IHRpbWUgb2YgdGhlIGN1cnJlbnQgcmVuZGVyXG5cbiAgICAgICAgICB2YXIgZXZlbnRUaW1lID0gTm9UaW1lc3RhbXA7XG4gICAgICAgICAgZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGN1cnJlbnQsIGF0dGVtcHRIeWRyYXRpb25BdExhbmUpO1xuICAgICAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBjdXJyZW50LCBhdHRlbXB0SHlkcmF0aW9uQXRMYW5lLCBldmVudFRpbWUpO1xuICAgICAgICB9XG4gICAgICB9IC8vIElmIHdlIGhhdmUgc2NoZWR1bGVkIGhpZ2hlciBwcmkgd29yayBhYm92ZSwgdGhpcyB3aWxsIHByb2JhYmx5IGp1c3QgYWJvcnQgdGhlIHJlbmRlclxuICAgICAgLy8gc2luY2Ugd2Ugbm93IGhhdmUgaGlnaGVyIHByaW9yaXR5IHdvcmssIGJ1dCBpbiBjYXNlIGl0IGRvZXNuJ3QsIHdlIG5lZWQgdG8gcHJlcGFyZSB0b1xuICAgICAgLy8gcmVuZGVyIHNvbWV0aGluZywgaWYgd2UgdGltZSBvdXQuIEV2ZW4gaWYgdGhhdCByZXF1aXJlcyB1cyB0byBkZWxldGUgZXZlcnl0aGluZyBhbmRcbiAgICAgIC8vIHNraXAgaHlkcmF0aW9uLlxuICAgICAgLy8gRGVsYXkgaGF2aW5nIHRvIGRvIHRoaXMgYXMgbG9uZyBhcyB0aGUgc3VzcGVuc2UgdGltZW91dCBhbGxvd3MgdXMuXG5cblxuICAgICAgcmVuZGVyRGlkU3VzcGVuZERlbGF5SWZQb3NzaWJsZSgpO1xuXG4gICAgICB2YXIgX2NhcHR1cmVkVmFsdWUgPSBjcmVhdGVDYXB0dXJlZFZhbHVlKG5ldyBFcnJvcignVGhpcyBTdXNwZW5zZSBib3VuZGFyeSByZWNlaXZlZCBhbiB1cGRhdGUgYmVmb3JlIGl0IGZpbmlzaGVkICcgKyAnaHlkcmF0aW5nLiBUaGlzIGNhdXNlZCB0aGUgYm91bmRhcnkgdG8gc3dpdGNoIHRvIGNsaWVudCByZW5kZXJpbmcuICcgKyAnVGhlIHVzdWFsIHdheSB0byBmaXggdGhpcyBpcyB0byB3cmFwIHRoZSBvcmlnaW5hbCB1cGRhdGUgJyArICdpbiBzdGFydFRyYW5zaXRpb24uJykpO1xuXG4gICAgICByZXR1cm4gcmV0cnlTdXNwZW5zZUNvbXBvbmVudFdpdGhvdXRIeWRyYXRpbmcoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzLCBfY2FwdHVyZWRWYWx1ZSk7XG4gICAgfSBlbHNlIGlmIChpc1N1c3BlbnNlSW5zdGFuY2VQZW5kaW5nKHN1c3BlbnNlSW5zdGFuY2UpKSB7XG4gICAgICAvLyBUaGlzIGNvbXBvbmVudCBpcyBzdGlsbCBwZW5kaW5nIG1vcmUgZGF0YSBmcm9tIHRoZSBzZXJ2ZXIsIHNvIHdlIGNhbid0IGh5ZHJhdGUgaXRzXG4gICAgICAvLyBjb250ZW50LiBXZSB0cmVhdCBpdCBhcyBpZiB0aGlzIGNvbXBvbmVudCBzdXNwZW5kZWQgaXRzZWxmLiBJdCBtaWdodCBzZWVtIGFzIGlmXG4gICAgICAvLyB3ZSBjb3VsZCBqdXN0IHRyeSB0byByZW5kZXIgaXQgY2xpZW50LXNpZGUgaW5zdGVhZC4gSG93ZXZlciwgdGhpcyB3aWxsIHBlcmZvcm0gYVxuICAgICAgLy8gbG90IG9mIHVubmVjZXNzYXJ5IHdvcmsgYW5kIGlzIHVubGlrZWx5IHRvIGNvbXBsZXRlIHNpbmNlIGl0IG9mdGVuIHdpbGwgc3VzcGVuZFxuICAgICAgLy8gb24gbWlzc2luZyBkYXRhIGFueXdheS4gQWRkaXRpb25hbGx5LCB0aGUgc2VydmVyIG1pZ2h0IGJlIGFibGUgdG8gcmVuZGVyIG1vcmVcbiAgICAgIC8vIHRoYW4gd2UgY2FuIG9uIHRoZSBjbGllbnQgeWV0LiBJbiB0aGF0IGNhc2Ugd2UnZCBlbmQgdXAgd2l0aCBtb3JlIGZhbGxiYWNrIHN0YXRlc1xuICAgICAgLy8gb24gdGhlIGNsaWVudCB0aGFuIGlmIHdlIGp1c3QgbGVhdmUgaXQgYWxvbmUuIElmIHRoZSBzZXJ2ZXIgdGltZXMgb3V0IG9yIGVycm9yc1xuICAgICAgLy8gdGhlc2Ugc2hvdWxkIHVwZGF0ZSB0aGlzIGJvdW5kYXJ5IHRvIHRoZSBwZXJtYW5lbnQgRmFsbGJhY2sgc3RhdGUgaW5zdGVhZC5cbiAgICAgIC8vIE1hcmsgaXQgYXMgaGF2aW5nIGNhcHR1cmVkIChpLmUuIHN1c3BlbmRlZCkuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBEaWRDYXB0dXJlOyAvLyBMZWF2ZSB0aGUgY2hpbGQgaW4gcGxhY2UuIEkuZS4gdGhlIGRlaHlkcmF0ZWQgZnJhZ21lbnQuXG5cbiAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gY3VycmVudC5jaGlsZDsgLy8gUmVnaXN0ZXIgYSBjYWxsYmFjayB0byByZXRyeSB0aGlzIGJvdW5kYXJ5IG9uY2UgdGhlIHNlcnZlciBoYXMgc2VudCB0aGUgcmVzdWx0LlxuXG4gICAgICB2YXIgcmV0cnkgPSByZXRyeURlaHlkcmF0ZWRTdXNwZW5zZUJvdW5kYXJ5LmJpbmQobnVsbCwgY3VycmVudCk7XG4gICAgICByZWdpc3RlclN1c3BlbnNlSW5zdGFuY2VSZXRyeShzdXNwZW5zZUluc3RhbmNlLCByZXRyeSk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgYXR0ZW1wdC5cbiAgICAgIHJlZW50ZXJIeWRyYXRpb25TdGF0ZUZyb21EZWh5ZHJhdGVkU3VzcGVuc2VJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgc3VzcGVuc2VJbnN0YW5jZSwgc3VzcGVuc2VTdGF0ZS50cmVlQ29udGV4dCk7XG4gICAgICB2YXIgcHJpbWFyeUNoaWxkcmVuID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuICAgICAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gbW91bnRTdXNwZW5zZVByaW1hcnlDaGlsZHJlbih3b3JrSW5Qcm9ncmVzcywgcHJpbWFyeUNoaWxkcmVuKTsgLy8gTWFyayB0aGUgY2hpbGRyZW4gYXMgaHlkcmF0aW5nLiBUaGlzIGlzIGEgZmFzdCBwYXRoIHRvIGtub3cgd2hldGhlciB0aGlzXG4gICAgICAvLyB0cmVlIGlzIHBhcnQgb2YgYSBoeWRyYXRpbmcgdHJlZS4gVGhpcyBpcyB1c2VkIHRvIGRldGVybWluZSBpZiBhIGNoaWxkXG4gICAgICAvLyBub2RlIGhhcyBmdWxseSBtb3VudGVkIHlldCwgYW5kIGZvciBzY2hlZHVsaW5nIGV2ZW50IHJlcGxheWluZy5cbiAgICAgIC8vIENvbmNlcHR1YWxseSB0aGlzIGlzIHNpbWlsYXIgdG8gUGxhY2VtZW50IGluIHRoYXQgYSBuZXcgc3VidHJlZSBpc1xuICAgICAgLy8gaW5zZXJ0ZWQgaW50byB0aGUgUmVhY3QgdHJlZSBoZXJlLiBJdCBqdXN0IGhhcHBlbnMgdG8gbm90IG5lZWQgRE9NXG4gICAgICAvLyBtdXRhdGlvbnMgYmVjYXVzZSBpdCBhbHJlYWR5IGV4aXN0cy5cblxuICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuZmxhZ3MgfD0gSHlkcmF0aW5nO1xuICAgICAgcmV0dXJuIHByaW1hcnlDaGlsZEZyYWdtZW50O1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBUaGlzIGlzIHRoZSBzZWNvbmQgcmVuZGVyIHBhc3MuIFdlIGFscmVhZHkgYXR0ZW1wdGVkIHRvIGh5ZHJhdGVkLCBidXRcbiAgICAvLyBzb21ldGhpbmcgZWl0aGVyIHN1c3BlbmRlZCBvciBlcnJvcmVkLlxuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIEZvcmNlQ2xpZW50UmVuZGVyKSB7XG4gICAgICAvLyBTb21ldGhpbmcgZXJyb3JlZCBkdXJpbmcgaHlkcmF0aW9uLiBUcnkgYWdhaW4gd2l0aG91dCBoeWRyYXRpbmcuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyAmPSB+Rm9yY2VDbGllbnRSZW5kZXI7XG5cbiAgICAgIHZhciBfY2FwdHVyZWRWYWx1ZTIgPSBjcmVhdGVDYXB0dXJlZFZhbHVlKG5ldyBFcnJvcignVGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGh5ZHJhdGluZyB0aGlzIFN1c3BlbnNlIGJvdW5kYXJ5LiAnICsgJ1N3aXRjaGVkIHRvIGNsaWVudCByZW5kZXJpbmcuJykpO1xuXG4gICAgICByZXR1cm4gcmV0cnlTdXNwZW5zZUNvbXBvbmVudFdpdGhvdXRIeWRyYXRpbmcoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzLCBfY2FwdHVyZWRWYWx1ZTIpO1xuICAgIH0gZWxzZSBpZiAod29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgLy8gU29tZXRoaW5nIHN1c3BlbmRlZCBhbmQgd2Ugc2hvdWxkIHN0aWxsIGJlIGluIGRlaHlkcmF0ZWQgbW9kZS5cbiAgICAgIC8vIExlYXZlIHRoZSBleGlzdGluZyBjaGlsZCBpbiBwbGFjZS5cbiAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gY3VycmVudC5jaGlsZDsgLy8gVGhlIGRlaHlkcmF0ZWQgY29tcGxldGlvbiBwYXNzIGV4cGVjdHMgdGhpcyBmbGFnIHRvIGJlIHRoZXJlXG4gICAgICAvLyBidXQgdGhlIG5vcm1hbCBzdXNwZW5zZSBwYXNzIGRvZXNuJ3QuXG5cbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IERpZENhcHR1cmU7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU3VzcGVuZGVkIGJ1dCB3ZSBzaG91bGQgbm8gbG9uZ2VyIGJlIGluIGRlaHlkcmF0ZWQgbW9kZS5cbiAgICAgIC8vIFRoZXJlZm9yZSB3ZSBub3cgaGF2ZSB0byByZW5kZXIgdGhlIGZhbGxiYWNrLlxuICAgICAgdmFyIG5leHRQcmltYXJ5Q2hpbGRyZW4gPSBuZXh0UHJvcHMuY2hpbGRyZW47XG4gICAgICB2YXIgbmV4dEZhbGxiYWNrQ2hpbGRyZW4gPSBuZXh0UHJvcHMuZmFsbGJhY2s7XG4gICAgICB2YXIgZmFsbGJhY2tDaGlsZEZyYWdtZW50ID0gbW91bnRTdXNwZW5zZUZhbGxiYWNrQWZ0ZXJSZXRyeVdpdGhvdXRIeWRyYXRpbmcoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRQcmltYXJ5Q2hpbGRyZW4sIG5leHRGYWxsYmFja0NoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gICAgICB2YXIgX3ByaW1hcnlDaGlsZEZyYWdtZW50NCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgX3ByaW1hcnlDaGlsZEZyYWdtZW50NC5tZW1vaXplZFN0YXRlID0gbW91bnRTdXNwZW5zZU9mZnNjcmVlblN0YXRlKHJlbmRlckxhbmVzKTtcbiAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBTVVNQRU5ERURfTUFSS0VSO1xuICAgICAgcmV0dXJuIGZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2NoZWR1bGVTdXNwZW5zZVdvcmtPbkZpYmVyKGZpYmVyLCByZW5kZXJMYW5lcywgcHJvcGFnYXRpb25Sb290KSB7XG4gIGZpYmVyLmxhbmVzID0gbWVyZ2VMYW5lcyhmaWJlci5sYW5lcywgcmVuZGVyTGFuZXMpO1xuICB2YXIgYWx0ZXJuYXRlID0gZmliZXIuYWx0ZXJuYXRlO1xuXG4gIGlmIChhbHRlcm5hdGUgIT09IG51bGwpIHtcbiAgICBhbHRlcm5hdGUubGFuZXMgPSBtZXJnZUxhbmVzKGFsdGVybmF0ZS5sYW5lcywgcmVuZGVyTGFuZXMpO1xuICB9XG5cbiAgc2NoZWR1bGVDb250ZXh0V29ya09uUGFyZW50UGF0aChmaWJlci5yZXR1cm4sIHJlbmRlckxhbmVzLCBwcm9wYWdhdGlvblJvb3QpO1xufVxuXG5mdW5jdGlvbiBwcm9wYWdhdGVTdXNwZW5zZUNvbnRleHRDaGFuZ2Uod29ya0luUHJvZ3Jlc3MsIGZpcnN0Q2hpbGQsIHJlbmRlckxhbmVzKSB7XG4gIC8vIE1hcmsgYW55IFN1c3BlbnNlIGJvdW5kYXJpZXMgd2l0aCBmYWxsYmFja3MgYXMgaGF2aW5nIHdvcmsgdG8gZG8uXG4gIC8vIElmIHRoZXkgd2VyZSBwcmV2aW91c2x5IGZvcmNlZCBpbnRvIGZhbGxiYWNrcywgdGhleSBtYXkgbm93IGJlIGFibGVcbiAgLy8gdG8gdW5ibG9jay5cbiAgdmFyIG5vZGUgPSBmaXJzdENoaWxkO1xuXG4gIHdoaWxlIChub2RlICE9PSBudWxsKSB7XG4gICAgaWYgKG5vZGUudGFnID09PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgICAgdmFyIHN0YXRlID0gbm9kZS5tZW1vaXplZFN0YXRlO1xuXG4gICAgICBpZiAoc3RhdGUgIT09IG51bGwpIHtcbiAgICAgICAgc2NoZWR1bGVTdXNwZW5zZVdvcmtPbkZpYmVyKG5vZGUsIHJlbmRlckxhbmVzLCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChub2RlLnRhZyA9PT0gU3VzcGVuc2VMaXN0Q29tcG9uZW50KSB7XG4gICAgICAvLyBJZiB0aGUgdGFpbCBpcyBoaWRkZW4gdGhlcmUgbWlnaHQgbm90IGJlIGFuIFN1c3BlbnNlIGJvdW5kYXJpZXNcbiAgICAgIC8vIHRvIHNjaGVkdWxlIHdvcmsgb24uIEluIHRoaXMgY2FzZSB3ZSBoYXZlIHRvIHNjaGVkdWxlIGl0IG9uIHRoZVxuICAgICAgLy8gbGlzdCBpdHNlbGYuXG4gICAgICAvLyBXZSBkb24ndCBoYXZlIHRvIHRyYXZlcnNlIHRvIHRoZSBjaGlsZHJlbiBvZiB0aGUgbGlzdCBzaW5jZVxuICAgICAgLy8gdGhlIGxpc3Qgd2lsbCBwcm9wYWdhdGUgdGhlIGNoYW5nZSB3aGVuIGl0IHJlcmVuZGVycy5cbiAgICAgIHNjaGVkdWxlU3VzcGVuc2VXb3JrT25GaWJlcihub2RlLCByZW5kZXJMYW5lcywgd29ya0luUHJvZ3Jlc3MpO1xuICAgIH0gZWxzZSBpZiAobm9kZS5jaGlsZCAhPT0gbnVsbCkge1xuICAgICAgbm9kZS5jaGlsZC5yZXR1cm4gPSBub2RlO1xuICAgICAgbm9kZSA9IG5vZGUuY2hpbGQ7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAobm9kZSA9PT0gd29ya0luUHJvZ3Jlc3MpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB3aGlsZSAobm9kZS5zaWJsaW5nID09PSBudWxsKSB7XG4gICAgICBpZiAobm9kZS5yZXR1cm4gPT09IG51bGwgfHwgbm9kZS5yZXR1cm4gPT09IHdvcmtJblByb2dyZXNzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgIH1cblxuICAgIG5vZGUuc2libGluZy5yZXR1cm4gPSBub2RlLnJldHVybjtcbiAgICBub2RlID0gbm9kZS5zaWJsaW5nO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmRMYXN0Q29udGVudFJvdyhmaXJzdENoaWxkKSB7XG4gIC8vIFRoaXMgaXMgZ29pbmcgdG8gZmluZCB0aGUgbGFzdCByb3cgYW1vbmcgdGhlc2UgY2hpbGRyZW4gdGhhdCBpcyBhbHJlYWR5XG4gIC8vIHNob3dpbmcgY29udGVudCBvbiB0aGUgc2NyZWVuLCBhcyBvcHBvc2VkIHRvIGJlaW5nIGluIGZhbGxiYWNrIHN0YXRlIG9yXG4gIC8vIG5ldy4gSWYgYSByb3cgaGFzIG11bHRpcGxlIFN1c3BlbnNlIGJvdW5kYXJpZXMsIGFueSBvZiB0aGVtIGJlaW5nIGluIHRoZVxuICAvLyBmYWxsYmFjayBzdGF0ZSwgY291bnRzIGFzIHRoZSB3aG9sZSByb3cgYmVpbmcgaW4gYSBmYWxsYmFjayBzdGF0ZS5cbiAgLy8gTm90ZSB0aGF0IHRoZSBcInJvd3NcIiB3aWxsIGJlIHdvcmtJblByb2dyZXNzLCBidXQgYW55IG5lc3RlZCBjaGlsZHJlblxuICAvLyB3aWxsIHN0aWxsIGJlIGN1cnJlbnQgc2luY2Ugd2UgaGF2ZW4ndCByZW5kZXJlZCB0aGVtIHlldC4gVGhlIG1vdW50ZWRcbiAgLy8gb3JkZXIgbWF5IG5vdCBiZSB0aGUgc2FtZSBhcyB0aGUgbmV3IG9yZGVyLiBXZSB1c2UgdGhlIG5ldyBvcmRlci5cbiAgdmFyIHJvdyA9IGZpcnN0Q2hpbGQ7XG4gIHZhciBsYXN0Q29udGVudFJvdyA9IG51bGw7XG5cbiAgd2hpbGUgKHJvdyAhPT0gbnVsbCkge1xuICAgIHZhciBjdXJyZW50Um93ID0gcm93LmFsdGVybmF0ZTsgLy8gTmV3IHJvd3MgY2FuJ3QgYmUgY29udGVudCByb3dzLlxuXG4gICAgaWYgKGN1cnJlbnRSb3cgIT09IG51bGwgJiYgZmluZEZpcnN0U3VzcGVuZGVkKGN1cnJlbnRSb3cpID09PSBudWxsKSB7XG4gICAgICBsYXN0Q29udGVudFJvdyA9IHJvdztcbiAgICB9XG5cbiAgICByb3cgPSByb3cuc2libGluZztcbiAgfVxuXG4gIHJldHVybiBsYXN0Q29udGVudFJvdztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVSZXZlYWxPcmRlcihyZXZlYWxPcmRlcikge1xuICB7XG4gICAgaWYgKHJldmVhbE9yZGVyICE9PSB1bmRlZmluZWQgJiYgcmV2ZWFsT3JkZXIgIT09ICdmb3J3YXJkcycgJiYgcmV2ZWFsT3JkZXIgIT09ICdiYWNrd2FyZHMnICYmIHJldmVhbE9yZGVyICE9PSAndG9nZXRoZXInICYmICFkaWRXYXJuQWJvdXRSZXZlYWxPcmRlcltyZXZlYWxPcmRlcl0pIHtcbiAgICAgIGRpZFdhcm5BYm91dFJldmVhbE9yZGVyW3JldmVhbE9yZGVyXSA9IHRydWU7XG5cbiAgICAgIGlmICh0eXBlb2YgcmV2ZWFsT3JkZXIgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHN3aXRjaCAocmV2ZWFsT3JkZXIudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgIGNhc2UgJ3RvZ2V0aGVyJzpcbiAgICAgICAgICBjYXNlICdmb3J3YXJkcyc6XG4gICAgICAgICAgY2FzZSAnYmFja3dhcmRzJzpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZXJyb3IoJ1wiJXNcIiBpcyBub3QgYSB2YWxpZCB2YWx1ZSBmb3IgcmV2ZWFsT3JkZXIgb24gPFN1c3BlbnNlTGlzdCAvPi4gJyArICdVc2UgbG93ZXJjYXNlIFwiJXNcIiBpbnN0ZWFkLicsIHJldmVhbE9yZGVyLCByZXZlYWxPcmRlci50b0xvd2VyQ2FzZSgpKTtcblxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIGNhc2UgJ2ZvcndhcmQnOlxuICAgICAgICAgIGNhc2UgJ2JhY2t3YXJkJzpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZXJyb3IoJ1wiJXNcIiBpcyBub3QgYSB2YWxpZCB2YWx1ZSBmb3IgcmV2ZWFsT3JkZXIgb24gPFN1c3BlbnNlTGlzdCAvPi4gJyArICdSZWFjdCB1c2VzIHRoZSAtcyBzdWZmaXggaW4gdGhlIHNwZWxsaW5nLiBVc2UgXCIlc3NcIiBpbnN0ZWFkLicsIHJldmVhbE9yZGVyLCByZXZlYWxPcmRlci50b0xvd2VyQ2FzZSgpKTtcblxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBlcnJvcignXCIlc1wiIGlzIG5vdCBhIHN1cHBvcnRlZCByZXZlYWxPcmRlciBvbiA8U3VzcGVuc2VMaXN0IC8+LiAnICsgJ0RpZCB5b3UgbWVhbiBcInRvZ2V0aGVyXCIsIFwiZm9yd2FyZHNcIiBvciBcImJhY2t3YXJkc1wiPycsIHJldmVhbE9yZGVyKTtcblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yKCclcyBpcyBub3QgYSBzdXBwb3J0ZWQgdmFsdWUgZm9yIHJldmVhbE9yZGVyIG9uIDxTdXNwZW5zZUxpc3QgLz4uICcgKyAnRGlkIHlvdSBtZWFuIFwidG9nZXRoZXJcIiwgXCJmb3J3YXJkc1wiIG9yIFwiYmFja3dhcmRzXCI/JywgcmV2ZWFsT3JkZXIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVRhaWxPcHRpb25zKHRhaWxNb2RlLCByZXZlYWxPcmRlcikge1xuICB7XG4gICAgaWYgKHRhaWxNb2RlICE9PSB1bmRlZmluZWQgJiYgIWRpZFdhcm5BYm91dFRhaWxPcHRpb25zW3RhaWxNb2RlXSkge1xuICAgICAgaWYgKHRhaWxNb2RlICE9PSAnY29sbGFwc2VkJyAmJiB0YWlsTW9kZSAhPT0gJ2hpZGRlbicpIHtcbiAgICAgICAgZGlkV2FybkFib3V0VGFpbE9wdGlvbnNbdGFpbE1vZGVdID0gdHJ1ZTtcblxuICAgICAgICBlcnJvcignXCIlc1wiIGlzIG5vdCBhIHN1cHBvcnRlZCB2YWx1ZSBmb3IgdGFpbCBvbiA8U3VzcGVuc2VMaXN0IC8+LiAnICsgJ0RpZCB5b3UgbWVhbiBcImNvbGxhcHNlZFwiIG9yIFwiaGlkZGVuXCI/JywgdGFpbE1vZGUpO1xuICAgICAgfSBlbHNlIGlmIChyZXZlYWxPcmRlciAhPT0gJ2ZvcndhcmRzJyAmJiByZXZlYWxPcmRlciAhPT0gJ2JhY2t3YXJkcycpIHtcbiAgICAgICAgZGlkV2FybkFib3V0VGFpbE9wdGlvbnNbdGFpbE1vZGVdID0gdHJ1ZTtcblxuICAgICAgICBlcnJvcignPFN1c3BlbnNlTGlzdCB0YWlsPVwiJXNcIiAvPiBpcyBvbmx5IHZhbGlkIGlmIHJldmVhbE9yZGVyIGlzICcgKyAnXCJmb3J3YXJkc1wiIG9yIFwiYmFja3dhcmRzXCIuICcgKyAnRGlkIHlvdSBtZWFuIHRvIHNwZWNpZnkgcmV2ZWFsT3JkZXI9XCJmb3J3YXJkc1wiPycsIHRhaWxNb2RlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVTdXNwZW5zZUxpc3ROZXN0ZWRDaGlsZChjaGlsZFNsb3QsIGluZGV4KSB7XG4gIHtcbiAgICB2YXIgaXNBbkFycmF5ID0gaXNBcnJheShjaGlsZFNsb3QpO1xuICAgIHZhciBpc0l0ZXJhYmxlID0gIWlzQW5BcnJheSAmJiB0eXBlb2YgZ2V0SXRlcmF0b3JGbihjaGlsZFNsb3QpID09PSAnZnVuY3Rpb24nO1xuXG4gICAgaWYgKGlzQW5BcnJheSB8fCBpc0l0ZXJhYmxlKSB7XG4gICAgICB2YXIgdHlwZSA9IGlzQW5BcnJheSA/ICdhcnJheScgOiAnaXRlcmFibGUnO1xuXG4gICAgICBlcnJvcignQSBuZXN0ZWQgJXMgd2FzIHBhc3NlZCB0byByb3cgIyVzIGluIDxTdXNwZW5zZUxpc3QgLz4uIFdyYXAgaXQgaW4gJyArICdhbiBhZGRpdGlvbmFsIFN1c3BlbnNlTGlzdCB0byBjb25maWd1cmUgaXRzIHJldmVhbE9yZGVyOiAnICsgJzxTdXNwZW5zZUxpc3QgcmV2ZWFsT3JkZXI9Li4uPiAuLi4gJyArICc8U3VzcGVuc2VMaXN0IHJldmVhbE9yZGVyPS4uLj57JXN9PC9TdXNwZW5zZUxpc3Q+IC4uLiAnICsgJzwvU3VzcGVuc2VMaXN0PicsIHR5cGUsIGluZGV4LCB0eXBlKTtcblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVN1c3BlbnNlTGlzdENoaWxkcmVuKGNoaWxkcmVuLCByZXZlYWxPcmRlcikge1xuICB7XG4gICAgaWYgKChyZXZlYWxPcmRlciA9PT0gJ2ZvcndhcmRzJyB8fCByZXZlYWxPcmRlciA9PT0gJ2JhY2t3YXJkcycpICYmIGNoaWxkcmVuICE9PSB1bmRlZmluZWQgJiYgY2hpbGRyZW4gIT09IG51bGwgJiYgY2hpbGRyZW4gIT09IGZhbHNlKSB7XG4gICAgICBpZiAoaXNBcnJheShjaGlsZHJlbikpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmICghdmFsaWRhdGVTdXNwZW5zZUxpc3ROZXN0ZWRDaGlsZChjaGlsZHJlbltpXSwgaSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBpdGVyYXRvckZuID0gZ2V0SXRlcmF0b3JGbihjaGlsZHJlbik7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBpdGVyYXRvckZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgdmFyIGNoaWxkcmVuSXRlcmF0b3IgPSBpdGVyYXRvckZuLmNhbGwoY2hpbGRyZW4pO1xuXG4gICAgICAgICAgaWYgKGNoaWxkcmVuSXRlcmF0b3IpIHtcbiAgICAgICAgICAgIHZhciBzdGVwID0gY2hpbGRyZW5JdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgICB2YXIgX2kgPSAwO1xuXG4gICAgICAgICAgICBmb3IgKDsgIXN0ZXAuZG9uZTsgc3RlcCA9IGNoaWxkcmVuSXRlcmF0b3IubmV4dCgpKSB7XG4gICAgICAgICAgICAgIGlmICghdmFsaWRhdGVTdXNwZW5zZUxpc3ROZXN0ZWRDaGlsZChzdGVwLnZhbHVlLCBfaSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBfaSsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlcnJvcignQSBzaW5nbGUgcm93IHdhcyBwYXNzZWQgdG8gYSA8U3VzcGVuc2VMaXN0IHJldmVhbE9yZGVyPVwiJXNcIiAvPi4gJyArICdUaGlzIGlzIG5vdCB1c2VmdWwgc2luY2UgaXQgbmVlZHMgbXVsdGlwbGUgcm93cy4gJyArICdEaWQgeW91IG1lYW4gdG8gcGFzcyBtdWx0aXBsZSBjaGlsZHJlbiBvciBhbiBhcnJheT8nLCByZXZlYWxPcmRlcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5pdFN1c3BlbnNlTGlzdFJlbmRlclN0YXRlKHdvcmtJblByb2dyZXNzLCBpc0JhY2t3YXJkcywgdGFpbCwgbGFzdENvbnRlbnRSb3csIHRhaWxNb2RlKSB7XG4gIHZhciByZW5kZXJTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKHJlbmRlclN0YXRlID09PSBudWxsKSB7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IHtcbiAgICAgIGlzQmFja3dhcmRzOiBpc0JhY2t3YXJkcyxcbiAgICAgIHJlbmRlcmluZzogbnVsbCxcbiAgICAgIHJlbmRlcmluZ1N0YXJ0VGltZTogMCxcbiAgICAgIGxhc3Q6IGxhc3RDb250ZW50Um93LFxuICAgICAgdGFpbDogdGFpbCxcbiAgICAgIHRhaWxNb2RlOiB0YWlsTW9kZVxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgLy8gV2UgY2FuIHJldXNlIHRoZSBleGlzdGluZyBvYmplY3QgZnJvbSBwcmV2aW91cyByZW5kZXJzLlxuICAgIHJlbmRlclN0YXRlLmlzQmFja3dhcmRzID0gaXNCYWNrd2FyZHM7XG4gICAgcmVuZGVyU3RhdGUucmVuZGVyaW5nID0gbnVsbDtcbiAgICByZW5kZXJTdGF0ZS5yZW5kZXJpbmdTdGFydFRpbWUgPSAwO1xuICAgIHJlbmRlclN0YXRlLmxhc3QgPSBsYXN0Q29udGVudFJvdztcbiAgICByZW5kZXJTdGF0ZS50YWlsID0gdGFpbDtcbiAgICByZW5kZXJTdGF0ZS50YWlsTW9kZSA9IHRhaWxNb2RlO1xuICB9XG59IC8vIFRoaXMgY2FuIGVuZCB1cCByZW5kZXJpbmcgdGhpcyBjb21wb25lbnQgbXVsdGlwbGUgcGFzc2VzLlxuLy8gVGhlIGZpcnN0IHBhc3Mgc3BsaXRzIHRoZSBjaGlsZHJlbiBmaWJlcnMgaW50byB0d28gc2V0cy4gQSBoZWFkIGFuZCB0YWlsLlxuLy8gV2UgZmlyc3QgcmVuZGVyIHRoZSBoZWFkLiBJZiBhbnl0aGluZyBpcyBpbiBmYWxsYmFjayBzdGF0ZSwgd2UgZG8gYW5vdGhlclxuLy8gcGFzcyB0aHJvdWdoIGJlZ2luV29yayB0byByZXJlbmRlciBhbGwgY2hpbGRyZW4gKGluY2x1ZGluZyB0aGUgdGFpbCkgd2l0aFxuLy8gdGhlIGZvcmNlIHN1c3BlbmQgY29udGV4dC4gSWYgdGhlIGZpcnN0IHJlbmRlciBkaWRuJ3QgaGF2ZSBhbnl0aGluZyBpblxuLy8gaW4gZmFsbGJhY2sgc3RhdGUuIFRoZW4gd2UgcmVuZGVyIGVhY2ggcm93IGluIHRoZSB0YWlsIG9uZS1ieS1vbmUuXG4vLyBUaGF0IGhhcHBlbnMgaW4gdGhlIGNvbXBsZXRlV29yayBwaGFzZSB3aXRob3V0IGdvaW5nIGJhY2sgdG8gYmVnaW5Xb3JrLlxuXG5cbmZ1bmN0aW9uIHVwZGF0ZVN1c3BlbnNlTGlzdENvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIG5leHRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIHJldmVhbE9yZGVyID0gbmV4dFByb3BzLnJldmVhbE9yZGVyO1xuICB2YXIgdGFpbE1vZGUgPSBuZXh0UHJvcHMudGFpbDtcbiAgdmFyIG5ld0NoaWxkcmVuID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuICB2YWxpZGF0ZVJldmVhbE9yZGVyKHJldmVhbE9yZGVyKTtcbiAgdmFsaWRhdGVUYWlsT3B0aW9ucyh0YWlsTW9kZSwgcmV2ZWFsT3JkZXIpO1xuICB2YWxpZGF0ZVN1c3BlbnNlTGlzdENoaWxkcmVuKG5ld0NoaWxkcmVuLCByZXZlYWxPcmRlcik7XG4gIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXdDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICB2YXIgc3VzcGVuc2VDb250ZXh0ID0gc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50O1xuICB2YXIgc2hvdWxkRm9yY2VGYWxsYmFjayA9IGhhc1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZUNvbnRleHQsIEZvcmNlU3VzcGVuc2VGYWxsYmFjayk7XG5cbiAgaWYgKHNob3VsZEZvcmNlRmFsbGJhY2spIHtcbiAgICBzdXNwZW5zZUNvbnRleHQgPSBzZXRTaGFsbG93U3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlQ29udGV4dCwgRm9yY2VTdXNwZW5zZUZhbGxiYWNrKTtcbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBEaWRDYXB0dXJlO1xuICB9IGVsc2Uge1xuICAgIHZhciBkaWRTdXNwZW5kQmVmb3JlID0gY3VycmVudCAhPT0gbnVsbCAmJiAoY3VycmVudC5mbGFncyAmIERpZENhcHR1cmUpICE9PSBOb0ZsYWdzO1xuXG4gICAgaWYgKGRpZFN1c3BlbmRCZWZvcmUpIHtcbiAgICAgIC8vIElmIHdlIHByZXZpb3VzbHkgZm9yY2VkIGEgZmFsbGJhY2ssIHdlIG5lZWQgdG8gc2NoZWR1bGUgd29ya1xuICAgICAgLy8gb24gYW55IG5lc3RlZCBib3VuZGFyaWVzIHRvIGxldCB0aGVtIGtub3cgdG8gdHJ5IHRvIHJlbmRlclxuICAgICAgLy8gYWdhaW4uIFRoaXMgaXMgdGhlIHNhbWUgYXMgY29udGV4dCB1cGRhdGluZy5cbiAgICAgIHByb3BhZ2F0ZVN1c3BlbnNlQ29udGV4dENoYW5nZSh3b3JrSW5Qcm9ncmVzcywgd29ya0luUHJvZ3Jlc3MuY2hpbGQsIHJlbmRlckxhbmVzKTtcbiAgICB9XG5cbiAgICBzdXNwZW5zZUNvbnRleHQgPSBzZXREZWZhdWx0U2hhbGxvd1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZUNvbnRleHQpO1xuICB9XG5cbiAgcHVzaFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgc3VzcGVuc2VDb250ZXh0KTtcblxuICBpZiAoKHdvcmtJblByb2dyZXNzLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSkge1xuICAgIC8vIEluIGxlZ2FjeSBtb2RlLCBTdXNwZW5zZUxpc3QgZG9lc24ndCB3b3JrIHNvIHdlIGp1c3RcbiAgICAvLyB1c2UgbWFrZSBpdCBhIG5vb3AgYnkgdHJlYXRpbmcgaXQgYXMgdGhlIGRlZmF1bHQgcmV2ZWFsT3JkZXIuXG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gIH0gZWxzZSB7XG4gICAgc3dpdGNoIChyZXZlYWxPcmRlcikge1xuICAgICAgY2FzZSAnZm9yd2FyZHMnOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGxhc3RDb250ZW50Um93ID0gZmluZExhc3RDb250ZW50Um93KHdvcmtJblByb2dyZXNzLmNoaWxkKTtcbiAgICAgICAgICB2YXIgdGFpbDtcblxuICAgICAgICAgIGlmIChsYXN0Q29udGVudFJvdyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gVGhlIHdob2xlIGxpc3QgaXMgcGFydCBvZiB0aGUgdGFpbC5cbiAgICAgICAgICAgIC8vIFRPRE86IFdlIGNvdWxkIGZhc3QgcGF0aCBieSBqdXN0IHJlbmRlcmluZyB0aGUgdGFpbCBub3cuXG4gICAgICAgICAgICB0YWlsID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IG51bGw7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIERpc2Nvbm5lY3QgdGhlIHRhaWwgcm93cyBhZnRlciB0aGUgY29udGVudCByb3cuXG4gICAgICAgICAgICAvLyBXZSdyZSBnb2luZyB0byByZW5kZXIgdGhlbSBzZXBhcmF0ZWx5IGxhdGVyLlxuICAgICAgICAgICAgdGFpbCA9IGxhc3RDb250ZW50Um93LnNpYmxpbmc7XG4gICAgICAgICAgICBsYXN0Q29udGVudFJvdy5zaWJsaW5nID0gbnVsbDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpbml0U3VzcGVuc2VMaXN0UmVuZGVyU3RhdGUod29ya0luUHJvZ3Jlc3MsIGZhbHNlLCAvLyBpc0JhY2t3YXJkc1xuICAgICAgICAgIHRhaWwsIGxhc3RDb250ZW50Um93LCB0YWlsTW9kZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSAnYmFja3dhcmRzJzpcbiAgICAgICAge1xuICAgICAgICAgIC8vIFdlJ3JlIGdvaW5nIHRvIGZpbmQgdGhlIGZpcnN0IHJvdyB0aGF0IGhhcyBleGlzdGluZyBjb250ZW50LlxuICAgICAgICAgIC8vIEF0IHRoZSBzYW1lIHRpbWUgd2UncmUgZ29pbmcgdG8gcmV2ZXJzZSB0aGUgbGlzdCBvZiBldmVyeXRoaW5nXG4gICAgICAgICAgLy8gd2UgcGFzcyBpbiB0aGUgbWVhbnRpbWUuIFRoYXQncyBnb2luZyB0byBiZSBvdXIgdGFpbCBpbiByZXZlcnNlXG4gICAgICAgICAgLy8gb3JkZXIuXG4gICAgICAgICAgdmFyIF90YWlsID0gbnVsbDtcbiAgICAgICAgICB2YXIgcm93ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBudWxsO1xuXG4gICAgICAgICAgd2hpbGUgKHJvdyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIGN1cnJlbnRSb3cgPSByb3cuYWx0ZXJuYXRlOyAvLyBOZXcgcm93cyBjYW4ndCBiZSBjb250ZW50IHJvd3MuXG5cbiAgICAgICAgICAgIGlmIChjdXJyZW50Um93ICE9PSBudWxsICYmIGZpbmRGaXJzdFN1c3BlbmRlZChjdXJyZW50Um93KSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG1haW4gY29udGVudC5cbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSByb3c7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgbmV4dFJvdyA9IHJvdy5zaWJsaW5nO1xuICAgICAgICAgICAgcm93LnNpYmxpbmcgPSBfdGFpbDtcbiAgICAgICAgICAgIF90YWlsID0gcm93O1xuICAgICAgICAgICAgcm93ID0gbmV4dFJvdztcbiAgICAgICAgICB9IC8vIFRPRE86IElmIHdvcmtJblByb2dyZXNzLmNoaWxkIGlzIG51bGwsIHdlIGNhbiBjb250aW51ZSBvbiB0aGUgdGFpbCBpbW1lZGlhdGVseS5cblxuXG4gICAgICAgICAgaW5pdFN1c3BlbnNlTGlzdFJlbmRlclN0YXRlKHdvcmtJblByb2dyZXNzLCB0cnVlLCAvLyBpc0JhY2t3YXJkc1xuICAgICAgICAgIF90YWlsLCBudWxsLCAvLyBsYXN0XG4gICAgICAgICAgdGFpbE1vZGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgJ3RvZ2V0aGVyJzpcbiAgICAgICAge1xuICAgICAgICAgIGluaXRTdXNwZW5zZUxpc3RSZW5kZXJTdGF0ZSh3b3JrSW5Qcm9ncmVzcywgZmFsc2UsIC8vIGlzQmFja3dhcmRzXG4gICAgICAgICAgbnVsbCwgLy8gdGFpbFxuICAgICAgICAgIG51bGwsIC8vIGxhc3RcbiAgICAgICAgICB1bmRlZmluZWQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHtcbiAgICAgICAgICAvLyBUaGUgZGVmYXVsdCByZXZlYWwgb3JkZXIgaXMgdGhlIHNhbWUgYXMgbm90IGhhdmluZ1xuICAgICAgICAgIC8vIGEgYm91bmRhcnkuXG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVBvcnRhbENvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgcHVzaEhvc3RDb250YWluZXIod29ya0luUHJvZ3Jlc3MsIHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZS5jb250YWluZXJJbmZvKTtcbiAgdmFyIG5leHRDaGlsZHJlbiA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcblxuICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgIC8vIFBvcnRhbHMgYXJlIHNwZWNpYWwgYmVjYXVzZSB3ZSBkb24ndCBhcHBlbmQgdGhlIGNoaWxkcmVuIGR1cmluZyBtb3VudFxuICAgIC8vIGJ1dCBhdCBjb21taXQuIFRoZXJlZm9yZSB3ZSBuZWVkIHRvIHRyYWNrIGluc2VydGlvbnMgd2hpY2ggdGhlIG5vcm1hbFxuICAgIC8vIGZsb3cgZG9lc24ndCBkbyBkdXJpbmcgbW91bnQuIFRoaXMgZG9lc24ndCBoYXBwZW4gYXQgdGhlIHJvb3QgYmVjYXVzZVxuICAgIC8vIHRoZSByb290IGFsd2F5cyBzdGFydHMgd2l0aCBhIFwiY3VycmVudFwiIHdpdGggYSBudWxsIGNoaWxkLlxuICAgIC8vIFRPRE86IENvbnNpZGVyIHVuaWZ5aW5nIHRoaXMgd2l0aCBob3cgdGhlIHJvb3Qgd29ya3MuXG4gICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSByZWNvbmNpbGVDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgbnVsbCwgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIH0gZWxzZSB7XG4gICAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICB9XG5cbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG52YXIgaGFzV2FybmVkQWJvdXRVc2luZ05vVmFsdWVQcm9wT25Db250ZXh0UHJvdmlkZXIgPSBmYWxzZTtcblxuZnVuY3Rpb24gdXBkYXRlQ29udGV4dFByb3ZpZGVyKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICB2YXIgcHJvdmlkZXJUeXBlID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcbiAgdmFyIGNvbnRleHQgPSBwcm92aWRlclR5cGUuX2NvbnRleHQ7XG4gIHZhciBuZXdQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIG9sZFByb3BzID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcztcbiAgdmFyIG5ld1ZhbHVlID0gbmV3UHJvcHMudmFsdWU7XG5cbiAge1xuICAgIGlmICghKCd2YWx1ZScgaW4gbmV3UHJvcHMpKSB7XG4gICAgICBpZiAoIWhhc1dhcm5lZEFib3V0VXNpbmdOb1ZhbHVlUHJvcE9uQ29udGV4dFByb3ZpZGVyKSB7XG4gICAgICAgIGhhc1dhcm5lZEFib3V0VXNpbmdOb1ZhbHVlUHJvcE9uQ29udGV4dFByb3ZpZGVyID0gdHJ1ZTtcblxuICAgICAgICBlcnJvcignVGhlIGB2YWx1ZWAgcHJvcCBpcyByZXF1aXJlZCBmb3IgdGhlIGA8Q29udGV4dC5Qcm92aWRlcj5gLiBEaWQgeW91IG1pc3NwZWxsIGl0IG9yIGZvcmdldCB0byBwYXNzIGl0PycpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBwcm92aWRlclByb3BUeXBlcyA9IHdvcmtJblByb2dyZXNzLnR5cGUucHJvcFR5cGVzO1xuXG4gICAgaWYgKHByb3ZpZGVyUHJvcFR5cGVzKSB7XG4gICAgICBjaGVja1Byb3BUeXBlcyhwcm92aWRlclByb3BUeXBlcywgbmV3UHJvcHMsICdwcm9wJywgJ0NvbnRleHQuUHJvdmlkZXInKTtcbiAgICB9XG4gIH1cblxuICBwdXNoUHJvdmlkZXIod29ya0luUHJvZ3Jlc3MsIGNvbnRleHQsIG5ld1ZhbHVlKTtcblxuICB7XG4gICAgaWYgKG9sZFByb3BzICE9PSBudWxsKSB7XG4gICAgICB2YXIgb2xkVmFsdWUgPSBvbGRQcm9wcy52YWx1ZTtcblxuICAgICAgaWYgKG9iamVjdElzKG9sZFZhbHVlLCBuZXdWYWx1ZSkpIHtcbiAgICAgICAgLy8gTm8gY2hhbmdlLiBCYWlsb3V0IGVhcmx5IGlmIGNoaWxkcmVuIGFyZSB0aGUgc2FtZS5cbiAgICAgICAgaWYgKG9sZFByb3BzLmNoaWxkcmVuID09PSBuZXdQcm9wcy5jaGlsZHJlbiAmJiAhaGFzQ29udGV4dENoYW5nZWQoKSkge1xuICAgICAgICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRoZSBjb250ZXh0IHZhbHVlIGNoYW5nZWQuIFNlYXJjaCBmb3IgbWF0Y2hpbmcgY29uc3VtZXJzIGFuZCBzY2hlZHVsZVxuICAgICAgICAvLyB0aGVtIHRvIHVwZGF0ZS5cbiAgICAgICAgcHJvcGFnYXRlQ29udGV4dENoYW5nZSh3b3JrSW5Qcm9ncmVzcywgY29udGV4dCwgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBuZXdDaGlsZHJlbiA9IG5ld1Byb3BzLmNoaWxkcmVuO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV3Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG52YXIgaGFzV2FybmVkQWJvdXRVc2luZ0NvbnRleHRBc0NvbnN1bWVyID0gZmFsc2U7XG5cbmZ1bmN0aW9uIHVwZGF0ZUNvbnRleHRDb25zdW1lcihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIGNvbnRleHQgPSB3b3JrSW5Qcm9ncmVzcy50eXBlOyAvLyBUaGUgbG9naWMgYmVsb3cgZm9yIENvbnRleHQgZGlmZmVycyBkZXBlbmRpbmcgb24gUFJPRCBvciBERVYgbW9kZS4gSW5cbiAgLy8gREVWIG1vZGUsIHdlIGNyZWF0ZSBhIHNlcGFyYXRlIG9iamVjdCBmb3IgQ29udGV4dC5Db25zdW1lciB0aGF0IGFjdHNcbiAgLy8gbGlrZSBhIHByb3h5IHRvIENvbnRleHQuIFRoaXMgcHJveHkgb2JqZWN0IGFkZHMgdW5uZWNlc3NhcnkgY29kZSBpbiBQUk9EXG4gIC8vIHNvIHdlIHVzZSB0aGUgb2xkIGJlaGF2aW91ciAoQ29udGV4dC5Db25zdW1lciByZWZlcmVuY2VzIENvbnRleHQpIHRvXG4gIC8vIHJlZHVjZSBzaXplIGFuZCBvdmVyaGVhZC4gVGhlIHNlcGFyYXRlIG9iamVjdCByZWZlcmVuY2VzIGNvbnRleHQgdmlhXG4gIC8vIGEgcHJvcGVydHkgY2FsbGVkIFwiX2NvbnRleHRcIiwgd2hpY2ggYWxzbyBnaXZlcyB1cyB0aGUgYWJpbGl0eSB0byBjaGVja1xuICAvLyBpbiBERVYgbW9kZSBpZiB0aGlzIHByb3BlcnR5IGV4aXN0cyBvciBub3QgYW5kIHdhcm4gaWYgaXQgZG9lcyBub3QuXG5cbiAge1xuICAgIGlmIChjb250ZXh0Ll9jb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIFRoaXMgbWF5IGJlIGJlY2F1c2UgaXQncyBhIENvbnRleHQgKHJhdGhlciB0aGFuIGEgQ29uc3VtZXIpLlxuICAgICAgLy8gT3IgaXQgbWF5IGJlIGJlY2F1c2UgaXQncyBvbGRlciBSZWFjdCB3aGVyZSB0aGV5J3JlIHRoZSBzYW1lIHRoaW5nLlxuICAgICAgLy8gV2Ugb25seSB3YW50IHRvIHdhcm4gaWYgd2UncmUgc3VyZSBpdCdzIGEgbmV3IFJlYWN0LlxuICAgICAgaWYgKGNvbnRleHQgIT09IGNvbnRleHQuQ29uc3VtZXIpIHtcbiAgICAgICAgaWYgKCFoYXNXYXJuZWRBYm91dFVzaW5nQ29udGV4dEFzQ29uc3VtZXIpIHtcbiAgICAgICAgICBoYXNXYXJuZWRBYm91dFVzaW5nQ29udGV4dEFzQ29uc3VtZXIgPSB0cnVlO1xuXG4gICAgICAgICAgZXJyb3IoJ1JlbmRlcmluZyA8Q29udGV4dD4gZGlyZWN0bHkgaXMgbm90IHN1cHBvcnRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluICcgKyAnYSBmdXR1cmUgbWFqb3IgcmVsZWFzZS4gRGlkIHlvdSBtZWFuIHRvIHJlbmRlciA8Q29udGV4dC5Db25zdW1lcj4gaW5zdGVhZD8nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb250ZXh0ID0gY29udGV4dC5fY29udGV4dDtcbiAgICB9XG4gIH1cblxuICB2YXIgbmV3UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciByZW5kZXIgPSBuZXdQcm9wcy5jaGlsZHJlbjtcblxuICB7XG4gICAgaWYgKHR5cGVvZiByZW5kZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCdBIGNvbnRleHQgY29uc3VtZXIgd2FzIHJlbmRlcmVkIHdpdGggbXVsdGlwbGUgY2hpbGRyZW4sIG9yIGEgY2hpbGQgJyArIFwidGhhdCBpc24ndCBhIGZ1bmN0aW9uLiBBIGNvbnRleHQgY29uc3VtZXIgZXhwZWN0cyBhIHNpbmdsZSBjaGlsZCBcIiArICd0aGF0IGlzIGEgZnVuY3Rpb24uIElmIHlvdSBkaWQgcGFzcyBhIGZ1bmN0aW9uLCBtYWtlIHN1cmUgdGhlcmUgJyArICdpcyBubyB0cmFpbGluZyBvciBsZWFkaW5nIHdoaXRlc3BhY2UgYXJvdW5kIGl0LicpO1xuICAgIH1cbiAgfVxuXG4gIHByZXBhcmVUb1JlYWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gIHZhciBuZXdWYWx1ZSA9IHJlYWRDb250ZXh0KGNvbnRleHQpO1xuXG4gIHtcbiAgICBtYXJrQ29tcG9uZW50UmVuZGVyU3RhcnRlZCh3b3JrSW5Qcm9ncmVzcyk7XG4gIH1cblxuICB2YXIgbmV3Q2hpbGRyZW47XG5cbiAge1xuICAgIFJlYWN0Q3VycmVudE93bmVyJDEuY3VycmVudCA9IHdvcmtJblByb2dyZXNzO1xuICAgIHNldElzUmVuZGVyaW5nKHRydWUpO1xuICAgIG5ld0NoaWxkcmVuID0gcmVuZGVyKG5ld1ZhbHVlKTtcbiAgICBzZXRJc1JlbmRlcmluZyhmYWxzZSk7XG4gIH1cblxuICB7XG4gICAgbWFya0NvbXBvbmVudFJlbmRlclN0b3BwZWQoKTtcbiAgfSAvLyBSZWFjdCBEZXZUb29scyByZWFkcyB0aGlzIGZsYWcuXG5cblxuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBQZXJmb3JtZWRXb3JrO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV3Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG5mdW5jdGlvbiBtYXJrV29ya0luUHJvZ3Jlc3NSZWNlaXZlZFVwZGF0ZSgpIHtcbiAgZGlkUmVjZWl2ZVVwZGF0ZSA9IHRydWU7XG59XG5cbmZ1bmN0aW9uIHJlc2V0U3VzcGVuZGVkQ3VycmVudE9uTW91bnRJbkxlZ2FjeU1vZGUoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpIHtcbiAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb01vZGUpIHtcbiAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgLy8gQSBsYXp5IGNvbXBvbmVudCBvbmx5IG1vdW50cyBpZiBpdCBzdXNwZW5kZWQgaW5zaWRlIGEgbm9uLVxuICAgICAgLy8gY29uY3VycmVudCB0cmVlLCBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUuIFdlIHdhbnQgdG8gdHJlYXQgaXQgbGlrZVxuICAgICAgLy8gYSBuZXcgbW91bnQsIGV2ZW4gdGhvdWdoIGFuIGVtcHR5IHZlcnNpb24gb2YgaXQgYWxyZWFkeSBjb21taXR0ZWQuXG4gICAgICAvLyBEaXNjb25uZWN0IHRoZSBhbHRlcm5hdGUgcG9pbnRlcnMuXG4gICAgICBjdXJyZW50LmFsdGVybmF0ZSA9IG51bGw7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGUgPSBudWxsOyAvLyBTaW5jZSB0aGlzIGlzIGNvbmNlcHR1YWxseSBhIG5ldyBmaWJlciwgc2NoZWR1bGUgYSBQbGFjZW1lbnQgZWZmZWN0XG5cbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFBsYWNlbWVudDtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAvLyBSZXVzZSBwcmV2aW91cyBkZXBlbmRlbmNpZXNcbiAgICB3b3JrSW5Qcm9ncmVzcy5kZXBlbmRlbmNpZXMgPSBjdXJyZW50LmRlcGVuZGVuY2llcztcbiAgfVxuXG4gIHtcbiAgICAvLyBEb24ndCB1cGRhdGUgXCJiYXNlXCIgcmVuZGVyIHRpbWVzIGZvciBiYWlsb3V0cy5cbiAgICBzdG9wUHJvZmlsZXJUaW1lcklmUnVubmluZygpO1xuICB9XG5cbiAgbWFya1NraXBwZWRVcGRhdGVMYW5lcyh3b3JrSW5Qcm9ncmVzcy5sYW5lcyk7IC8vIENoZWNrIGlmIHRoZSBjaGlsZHJlbiBoYXZlIGFueSBwZW5kaW5nIHdvcmsuXG5cbiAgaWYgKCFpbmNsdWRlc1NvbWVMYW5lKHJlbmRlckxhbmVzLCB3b3JrSW5Qcm9ncmVzcy5jaGlsZExhbmVzKSkge1xuICAgIC8vIFRoZSBjaGlsZHJlbiBkb24ndCBoYXZlIGFueSB3b3JrIGVpdGhlci4gV2UgY2FuIHNraXAgdGhlbS5cbiAgICAvLyBUT0RPOiBPbmNlIHdlIGFkZCBiYWNrIHJlc3VtaW5nLCB3ZSBzaG91bGQgY2hlY2sgaWYgdGhlIGNoaWxkcmVuIGFyZVxuICAgIC8vIGEgd29yay1pbi1wcm9ncmVzcyBzZXQuIElmIHNvLCB3ZSBuZWVkIHRvIHRyYW5zZmVyIHRoZWlyIGVmZmVjdHMuXG4gICAge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9IC8vIFRoaXMgZmliZXIgZG9lc24ndCBoYXZlIHdvcmssIGJ1dCBpdHMgc3VidHJlZSBkb2VzLiBDbG9uZSB0aGUgY2hpbGRcbiAgLy8gZmliZXJzIGFuZCBjb250aW51ZS5cblxuXG4gIGNsb25lQ2hpbGRGaWJlcnMoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIHJlbW91bnRGaWJlcihjdXJyZW50LCBvbGRXb3JrSW5Qcm9ncmVzcywgbmV3V29ya0luUHJvZ3Jlc3MpIHtcbiAge1xuICAgIHZhciByZXR1cm5GaWJlciA9IG9sZFdvcmtJblByb2dyZXNzLnJldHVybjtcblxuICAgIGlmIChyZXR1cm5GaWJlciA9PT0gbnVsbCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3Byb2QtZXJyb3ItY29kZXNcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHN3YXAgdGhlIHJvb3QgZmliZXIuJyk7XG4gICAgfSAvLyBEaXNjb25uZWN0IGZyb20gdGhlIG9sZCBjdXJyZW50LlxuICAgIC8vIEl0IHdpbGwgZ2V0IGRlbGV0ZWQuXG5cblxuICAgIGN1cnJlbnQuYWx0ZXJuYXRlID0gbnVsbDtcbiAgICBvbGRXb3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGUgPSBudWxsOyAvLyBDb25uZWN0IHRvIHRoZSBuZXcgdHJlZS5cblxuICAgIG5ld1dvcmtJblByb2dyZXNzLmluZGV4ID0gb2xkV29ya0luUHJvZ3Jlc3MuaW5kZXg7XG4gICAgbmV3V29ya0luUHJvZ3Jlc3Muc2libGluZyA9IG9sZFdvcmtJblByb2dyZXNzLnNpYmxpbmc7XG4gICAgbmV3V29ya0luUHJvZ3Jlc3MucmV0dXJuID0gb2xkV29ya0luUHJvZ3Jlc3MucmV0dXJuO1xuICAgIG5ld1dvcmtJblByb2dyZXNzLnJlZiA9IG9sZFdvcmtJblByb2dyZXNzLnJlZjsgLy8gUmVwbGFjZSB0aGUgY2hpbGQvc2libGluZyBwb2ludGVycyBhYm92ZSBpdC5cblxuICAgIGlmIChvbGRXb3JrSW5Qcm9ncmVzcyA9PT0gcmV0dXJuRmliZXIuY2hpbGQpIHtcbiAgICAgIHJldHVybkZpYmVyLmNoaWxkID0gbmV3V29ya0luUHJvZ3Jlc3M7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBwcmV2U2libGluZyA9IHJldHVybkZpYmVyLmNoaWxkO1xuXG4gICAgICBpZiAocHJldlNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3Byb2QtZXJyb3ItY29kZXNcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBwYXJlbnQgdG8gaGF2ZSBhIGNoaWxkLicpO1xuICAgICAgfVxuXG4gICAgICB3aGlsZSAocHJldlNpYmxpbmcuc2libGluZyAhPT0gb2xkV29ya0luUHJvZ3Jlc3MpIHtcbiAgICAgICAgcHJldlNpYmxpbmcgPSBwcmV2U2libGluZy5zaWJsaW5nO1xuXG4gICAgICAgIGlmIChwcmV2U2libGluZyA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9wcm9kLWVycm9yLWNvZGVzXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB0byBmaW5kIHRoZSBwcmV2aW91cyBzaWJsaW5nLicpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHByZXZTaWJsaW5nLnNpYmxpbmcgPSBuZXdXb3JrSW5Qcm9ncmVzcztcbiAgICB9IC8vIERlbGV0ZSB0aGUgb2xkIGZpYmVyIGFuZCBwbGFjZSB0aGUgbmV3IG9uZS5cbiAgICAvLyBTaW5jZSB0aGUgb2xkIGZpYmVyIGlzIGRpc2Nvbm5lY3RlZCwgd2UgaGF2ZSB0byBzY2hlZHVsZSBpdCBtYW51YWxseS5cblxuXG4gICAgdmFyIGRlbGV0aW9ucyA9IHJldHVybkZpYmVyLmRlbGV0aW9ucztcblxuICAgIGlmIChkZWxldGlvbnMgPT09IG51bGwpIHtcbiAgICAgIHJldHVybkZpYmVyLmRlbGV0aW9ucyA9IFtjdXJyZW50XTtcbiAgICAgIHJldHVybkZpYmVyLmZsYWdzIHw9IENoaWxkRGVsZXRpb247XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0aW9ucy5wdXNoKGN1cnJlbnQpO1xuICAgIH1cblxuICAgIG5ld1dvcmtJblByb2dyZXNzLmZsYWdzIHw9IFBsYWNlbWVudDsgLy8gUmVzdGFydCB3b3JrIGZyb20gdGhlIG5ldyBmaWJlci5cblxuICAgIHJldHVybiBuZXdXb3JrSW5Qcm9ncmVzcztcbiAgfVxufVxuXG5mdW5jdGlvbiBjaGVja1NjaGVkdWxlZFVwZGF0ZU9yQ29udGV4dChjdXJyZW50LCByZW5kZXJMYW5lcykge1xuICAvLyBCZWZvcmUgcGVyZm9ybWluZyBhbiBlYXJseSBiYWlsb3V0LCB3ZSBtdXN0IGNoZWNrIGlmIHRoZXJlIGFyZSBwZW5kaW5nXG4gIC8vIHVwZGF0ZXMgb3IgY29udGV4dC5cbiAgdmFyIHVwZGF0ZUxhbmVzID0gY3VycmVudC5sYW5lcztcblxuICBpZiAoaW5jbHVkZXNTb21lTGFuZSh1cGRhdGVMYW5lcywgcmVuZGVyTGFuZXMpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gLy8gTm8gcGVuZGluZyB1cGRhdGUsIGJ1dCBiZWNhdXNlIGNvbnRleHQgaXMgcHJvcGFnYXRlZCBsYXppbHksIHdlIG5lZWRcblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGF0dGVtcHRFYXJseUJhaWxvdXRJZk5vU2NoZWR1bGVkVXBkYXRlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICAvLyBUaGlzIGZpYmVyIGRvZXMgbm90IGhhdmUgYW55IHBlbmRpbmcgd29yay4gQmFpbG91dCB3aXRob3V0IGVudGVyaW5nXG4gIC8vIHRoZSBiZWdpbiBwaGFzZS4gVGhlcmUncyBzdGlsbCBzb21lIGJvb2trZWVwaW5nIHdlIHRoYXQgbmVlZHMgdG8gYmUgZG9uZVxuICAvLyBpbiB0aGlzIG9wdGltaXplZCBwYXRoLCBtb3N0bHkgcHVzaGluZyBzdHVmZiBvbnRvIHRoZSBzdGFjay5cbiAgc3dpdGNoICh3b3JrSW5Qcm9ncmVzcy50YWcpIHtcbiAgICBjYXNlIEhvc3RSb290OlxuICAgICAgcHVzaEhvc3RSb290Q29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICB2YXIgcm9vdCA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcblxuICAgICAgcmVzZXRIeWRyYXRpb25TdGF0ZSgpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICBwdXNoSG9zdENvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgQ29tcG9uZW50ID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcblxuICAgICAgICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkge1xuICAgICAgICAgIHB1c2hDb250ZXh0UHJvdmlkZXIod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICBwdXNoSG9zdENvbnRhaW5lcih3b3JrSW5Qcm9ncmVzcywgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIENvbnRleHRQcm92aWRlcjpcbiAgICAgIHtcbiAgICAgICAgdmFyIG5ld1ZhbHVlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcy52YWx1ZTtcbiAgICAgICAgdmFyIGNvbnRleHQgPSB3b3JrSW5Qcm9ncmVzcy50eXBlLl9jb250ZXh0O1xuICAgICAgICBwdXNoUHJvdmlkZXIod29ya0luUHJvZ3Jlc3MsIGNvbnRleHQsIG5ld1ZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIFByb2ZpbGVyOlxuICAgICAge1xuICAgICAgICAvLyBQcm9maWxlciBzaG91bGQgb25seSBjYWxsIG9uUmVuZGVyIHdoZW4gb25lIG9mIGl0cyBkZXNjZW5kYW50cyBhY3R1YWxseSByZW5kZXJlZC5cbiAgICAgICAgdmFyIGhhc0NoaWxkV29yayA9IGluY2x1ZGVzU29tZUxhbmUocmVuZGVyTGFuZXMsIHdvcmtJblByb2dyZXNzLmNoaWxkTGFuZXMpO1xuXG4gICAgICAgIGlmIChoYXNDaGlsZFdvcmspIHtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7XG4gICAgICAgIH1cblxuICAgICAgICB7XG4gICAgICAgICAgLy8gUmVzZXQgZWZmZWN0IGR1cmF0aW9ucyBmb3IgdGhlIG5leHQgZXZlbnR1YWwgZWZmZWN0IHBoYXNlLlxuICAgICAgICAgIC8vIFRoZXNlIGFyZSByZXNldCBkdXJpbmcgcmVuZGVyIHRvIGFsbG93IHRoZSBEZXZUb29scyBjb21taXQgaG9vayBhIGNoYW5jZSB0byByZWFkIHRoZW0sXG4gICAgICAgICAgdmFyIHN0YXRlTm9kZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgICAgICAgICBzdGF0ZU5vZGUuZWZmZWN0RHVyYXRpb24gPSAwO1xuICAgICAgICAgIHN0YXRlTm9kZS5wYXNzaXZlRWZmZWN0RHVyYXRpb24gPSAwO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIHN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcblxuICAgICAgICBpZiAoc3RhdGUgIT09IG51bGwpIHtcbiAgICAgICAgICBpZiAoc3RhdGUuZGVoeWRyYXRlZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcHVzaFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgc2V0RGVmYXVsdFNoYWxsb3dTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50KSk7IC8vIFdlIGtub3cgdGhhdCB0aGlzIGNvbXBvbmVudCB3aWxsIHN1c3BlbmQgYWdhaW4gYmVjYXVzZSBpZiBpdCBoYXNcbiAgICAgICAgICAgIC8vIGJlZW4gdW5zdXNwZW5kZWQgaXQgaGFzIGNvbW1pdHRlZCBhcyBhIHJlc29sdmVkIFN1c3BlbnNlIGNvbXBvbmVudC5cbiAgICAgICAgICAgIC8vIElmIGl0IG5lZWRzIHRvIGJlIHJldHJpZWQsIGl0IHNob3VsZCBoYXZlIHdvcmsgc2NoZWR1bGVkIG9uIGl0LlxuXG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBEaWRDYXB0dXJlOyAvLyBXZSBzaG91bGQgbmV2ZXIgcmVuZGVyIHRoZSBjaGlsZHJlbiBvZiBhIGRlaHlkcmF0ZWQgYm91bmRhcnkgdW50aWwgd2VcbiAgICAgICAgICAgIC8vIHVwZ3JhZGUgaXQuIFdlIHJldHVybiBudWxsIGluc3RlYWQgb2YgYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yay5cblxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfSAvLyBJZiB0aGlzIGJvdW5kYXJ5IGlzIGN1cnJlbnRseSB0aW1lZCBvdXQsIHdlIG5lZWQgdG8gZGVjaWRlXG4gICAgICAgICAgLy8gd2hldGhlciB0byByZXRyeSB0aGUgcHJpbWFyeSBjaGlsZHJlbiwgb3IgdG8gc2tpcCBvdmVyIGl0IGFuZFxuICAgICAgICAgIC8vIGdvIHN0cmFpZ2h0IHRvIHRoZSBmYWxsYmFjay4gQ2hlY2sgdGhlIHByaW9yaXR5IG9mIHRoZSBwcmltYXJ5XG4gICAgICAgICAgLy8gY2hpbGQgZnJhZ21lbnQuXG5cblxuICAgICAgICAgIHZhciBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgICAgIHZhciBwcmltYXJ5Q2hpbGRMYW5lcyA9IHByaW1hcnlDaGlsZEZyYWdtZW50LmNoaWxkTGFuZXM7XG5cbiAgICAgICAgICBpZiAoaW5jbHVkZXNTb21lTGFuZShyZW5kZXJMYW5lcywgcHJpbWFyeUNoaWxkTGFuZXMpKSB7XG4gICAgICAgICAgICAvLyBUaGUgcHJpbWFyeSBjaGlsZHJlbiBoYXZlIHBlbmRpbmcgd29yay4gVXNlIHRoZSBub3JtYWwgcGF0aFxuICAgICAgICAgICAgLy8gdG8gYXR0ZW1wdCB0byByZW5kZXIgdGhlIHByaW1hcnkgY2hpbGRyZW4gYWdhaW4uXG4gICAgICAgICAgICByZXR1cm4gdXBkYXRlU3VzcGVuc2VDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gVGhlIHByaW1hcnkgY2hpbGQgZnJhZ21lbnQgZG9lcyBub3QgaGF2ZSBwZW5kaW5nIHdvcmsgbWFya2VkXG4gICAgICAgICAgICAvLyBvbiBpdFxuICAgICAgICAgICAgcHVzaFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgc2V0RGVmYXVsdFNoYWxsb3dTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50KSk7IC8vIFRoZSBwcmltYXJ5IGNoaWxkcmVuIGRvIG5vdCBoYXZlIHBlbmRpbmcgd29yayB3aXRoIHN1ZmZpY2llbnRcbiAgICAgICAgICAgIC8vIHByaW9yaXR5LiBCYWlsb3V0LlxuXG4gICAgICAgICAgICB2YXIgY2hpbGQgPSBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAgICAgICAgICAgIGlmIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAvLyBUaGUgZmFsbGJhY2sgY2hpbGRyZW4gaGF2ZSBwZW5kaW5nIHdvcmsuIFNraXAgb3ZlciB0aGVcbiAgICAgICAgICAgICAgLy8gcHJpbWFyeSBjaGlsZHJlbiBhbmQgd29yayBvbiB0aGUgZmFsbGJhY2suXG4gICAgICAgICAgICAgIHJldHVybiBjaGlsZC5zaWJsaW5nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gTm90ZTogV2UgY2FuIHJldHVybiBgbnVsbGAgaGVyZSBiZWNhdXNlIHdlIGFscmVhZHkgY2hlY2tlZFxuICAgICAgICAgICAgICAvLyB3aGV0aGVyIHRoZXJlIHdlcmUgbmVzdGVkIGNvbnRleHQgY29uc3VtZXJzLCB2aWEgdGhlIGNhbGwgdG9cbiAgICAgICAgICAgICAgLy8gYGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmtgIGFib3ZlLlxuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHVzaFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgc2V0RGVmYXVsdFNoYWxsb3dTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50KSk7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgU3VzcGVuc2VMaXN0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgZGlkU3VzcGVuZEJlZm9yZSA9IChjdXJyZW50LmZsYWdzICYgRGlkQ2FwdHVyZSkgIT09IE5vRmxhZ3M7XG5cbiAgICAgICAgdmFyIF9oYXNDaGlsZFdvcmsgPSBpbmNsdWRlc1NvbWVMYW5lKHJlbmRlckxhbmVzLCB3b3JrSW5Qcm9ncmVzcy5jaGlsZExhbmVzKTtcblxuICAgICAgICBpZiAoZGlkU3VzcGVuZEJlZm9yZSkge1xuICAgICAgICAgIGlmIChfaGFzQ2hpbGRXb3JrKSB7XG4gICAgICAgICAgICAvLyBJZiBzb21ldGhpbmcgd2FzIGluIGZhbGxiYWNrIHN0YXRlIGxhc3QgdGltZSwgYW5kIHdlIGhhdmUgYWxsIHRoZVxuICAgICAgICAgICAgLy8gc2FtZSBjaGlsZHJlbiB0aGVuIHdlJ3JlIHN0aWxsIGluIHByb2dyZXNzaXZlIGxvYWRpbmcgc3RhdGUuXG4gICAgICAgICAgICAvLyBTb21ldGhpbmcgbWlnaHQgZ2V0IHVuYmxvY2tlZCBieSBzdGF0ZSB1cGRhdGVzIG9yIHJldHJpZXMgaW4gdGhlXG4gICAgICAgICAgICAvLyB0cmVlIHdoaWNoIHdpbGwgYWZmZWN0IHRoZSB0YWlsLiBTbyB3ZSBuZWVkIHRvIHVzZSB0aGUgbm9ybWFsXG4gICAgICAgICAgICAvLyBwYXRoIHRvIGNvbXB1dGUgdGhlIGNvcnJlY3QgdGFpbC5cbiAgICAgICAgICAgIHJldHVybiB1cGRhdGVTdXNwZW5zZUxpc3RDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgICB9IC8vIElmIG5vbmUgb2YgdGhlIGNoaWxkcmVuIGhhZCBhbnkgd29yaywgdGhhdCBtZWFucyB0aGF0IG5vbmUgb2ZcbiAgICAgICAgICAvLyB0aGVtIGdvdCByZXRyaWVkIHNvIHRoZXknbGwgc3RpbGwgYmUgYmxvY2tlZCBpbiB0aGUgc2FtZSB3YXlcbiAgICAgICAgICAvLyBhcyBiZWZvcmUuIFdlIGNhbiBmYXN0IGJhaWwgb3V0LlxuXG5cbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBEaWRDYXB0dXJlO1xuICAgICAgICB9IC8vIElmIG5vdGhpbmcgc3VzcGVuZGVkIGJlZm9yZSBhbmQgd2UncmUgcmVuZGVyaW5nIHRoZSBzYW1lIGNoaWxkcmVuLFxuICAgICAgICAvLyB0aGVuIHRoZSB0YWlsIGRvZXNuJ3QgbWF0dGVyLiBBbnl0aGluZyBuZXcgdGhhdCBzdXNwZW5kcyB3aWxsIHdvcmtcbiAgICAgICAgLy8gaW4gdGhlIFwidG9nZXRoZXJcIiBtb2RlLCBzbyB3ZSBjYW4gY29udGludWUgZnJvbSB0aGUgc3RhdGUgd2UgaGFkLlxuXG5cbiAgICAgICAgdmFyIHJlbmRlclN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcblxuICAgICAgICBpZiAocmVuZGVyU3RhdGUgIT09IG51bGwpIHtcbiAgICAgICAgICAvLyBSZXNldCB0byB0aGUgXCJ0b2dldGhlclwiIG1vZGUgaW4gY2FzZSB3ZSd2ZSBzdGFydGVkIGEgZGlmZmVyZW50XG4gICAgICAgICAgLy8gdXBkYXRlIGluIHRoZSBwYXN0IGJ1dCBkaWRuJ3QgY29tcGxldGUgaXQuXG4gICAgICAgICAgcmVuZGVyU3RhdGUucmVuZGVyaW5nID0gbnVsbDtcbiAgICAgICAgICByZW5kZXJTdGF0ZS50YWlsID0gbnVsbDtcbiAgICAgICAgICByZW5kZXJTdGF0ZS5sYXN0RWZmZWN0ID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHB1c2hTdXNwZW5zZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHN1c3BlbnNlU3RhY2tDdXJzb3IuY3VycmVudCk7XG5cbiAgICAgICAgaWYgKF9oYXNDaGlsZFdvcmspIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBJZiBub25lIG9mIHRoZSBjaGlsZHJlbiBoYWQgYW55IHdvcmssIHRoYXQgbWVhbnMgdGhhdCBub25lIG9mXG4gICAgICAgICAgLy8gdGhlbSBnb3QgcmV0cmllZCBzbyB0aGV5J2xsIHN0aWxsIGJlIGJsb2NrZWQgaW4gdGhlIHNhbWUgd2F5XG4gICAgICAgICAgLy8gYXMgYmVmb3JlLiBXZSBjYW4gZmFzdCBiYWlsIG91dC5cbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgY2FzZSBPZmZzY3JlZW5Db21wb25lbnQ6XG4gICAgY2FzZSBMZWdhY3lIaWRkZW5Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIC8vIE5lZWQgdG8gY2hlY2sgaWYgdGhlIHRyZWUgc3RpbGwgbmVlZHMgdG8gYmUgZGVmZXJyZWQuIFRoaXMgaXNcbiAgICAgICAgLy8gYWxtb3N0IGlkZW50aWNhbCB0byB0aGUgbG9naWMgdXNlZCBpbiB0aGUgbm9ybWFsIHVwZGF0ZSBwYXRoLFxuICAgICAgICAvLyBzbyB3ZSdsbCBqdXN0IGVudGVyIHRoYXQuIFRoZSBvbmx5IGRpZmZlcmVuY2UgaXMgd2UnbGwgYmFpbCBvdXRcbiAgICAgICAgLy8gYXQgdGhlIG5leHQgbGV2ZWwgaW5zdGVhZCBvZiB0aGlzIG9uZSwgYmVjYXVzZSB0aGUgY2hpbGQgcHJvcHNcbiAgICAgICAgLy8gaGF2ZSBub3QgY2hhbmdlZC4gV2hpY2ggaXMgZmluZS5cbiAgICAgICAgLy8gVE9ETzogUHJvYmFibHkgc2hvdWxkIHJlZmFjdG9yIGBiZWdpbldvcmtgIHRvIHNwbGl0IHRoZSBiYWlsb3V0XG4gICAgICAgIC8vIHBhdGggZnJvbSB0aGUgbm9ybWFsIHBhdGguIEknbSB0ZW1wdGVkIHRvIGRvIGEgbGFiZWxlZCBicmVhayBoZXJlXG4gICAgICAgIC8vIGJ1dCBJIHdvbid0IDopXG4gICAgICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gTm9MYW5lcztcbiAgICAgICAgcmV0dXJuIHVwZGF0ZU9mZnNjcmVlbkNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuICB9XG5cbiAgcmV0dXJuIGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbn1cblxuZnVuY3Rpb24gYmVnaW5Xb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICB7XG4gICAgaWYgKHdvcmtJblByb2dyZXNzLl9kZWJ1Z05lZWRzUmVtb3VudCAmJiBjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIHdpbGwgcmVzdGFydCB0aGUgYmVnaW4gcGhhc2Ugd2l0aCBhIG5ldyBmaWJlci5cbiAgICAgIHJldHVybiByZW1vdW50RmliZXIoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIGNyZWF0ZUZpYmVyRnJvbVR5cGVBbmRQcm9wcyh3b3JrSW5Qcm9ncmVzcy50eXBlLCB3b3JrSW5Qcm9ncmVzcy5rZXksIHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcywgd29ya0luUHJvZ3Jlc3MuX2RlYnVnT3duZXIgfHwgbnVsbCwgd29ya0luUHJvZ3Jlc3MubW9kZSwgd29ya0luUHJvZ3Jlc3MubGFuZXMpKTtcbiAgICB9XG4gIH1cblxuICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgIHZhciBvbGRQcm9wcyA9IGN1cnJlbnQubWVtb2l6ZWRQcm9wcztcbiAgICB2YXIgbmV3UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG5cbiAgICBpZiAob2xkUHJvcHMgIT09IG5ld1Byb3BzIHx8IGhhc0NvbnRleHRDaGFuZ2VkKCkgfHwgKCAvLyBGb3JjZSBhIHJlLXJlbmRlciBpZiB0aGUgaW1wbGVtZW50YXRpb24gY2hhbmdlZCBkdWUgdG8gaG90IHJlbG9hZDpcbiAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSAhPT0gY3VycmVudC50eXBlICkpIHtcbiAgICAgIC8vIElmIHByb3BzIG9yIGNvbnRleHQgY2hhbmdlZCwgbWFyayB0aGUgZmliZXIgYXMgaGF2aW5nIHBlcmZvcm1lZCB3b3JrLlxuICAgICAgLy8gVGhpcyBtYXkgYmUgdW5zZXQgaWYgdGhlIHByb3BzIGFyZSBkZXRlcm1pbmVkIHRvIGJlIGVxdWFsIGxhdGVyIChtZW1vKS5cbiAgICAgIGRpZFJlY2VpdmVVcGRhdGUgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBOZWl0aGVyIHByb3BzIG5vciBsZWdhY3kgY29udGV4dCBjaGFuZ2VzLiBDaGVjayBpZiB0aGVyZSdzIGEgcGVuZGluZ1xuICAgICAgLy8gdXBkYXRlIG9yIGNvbnRleHQgY2hhbmdlLlxuICAgICAgdmFyIGhhc1NjaGVkdWxlZFVwZGF0ZU9yQ29udGV4dCA9IGNoZWNrU2NoZWR1bGVkVXBkYXRlT3JDb250ZXh0KGN1cnJlbnQsIHJlbmRlckxhbmVzKTtcblxuICAgICAgaWYgKCFoYXNTY2hlZHVsZWRVcGRhdGVPckNvbnRleHQgJiYgLy8gSWYgdGhpcyBpcyB0aGUgc2Vjb25kIHBhc3Mgb2YgYW4gZXJyb3Igb3Igc3VzcGVuc2UgYm91bmRhcnksIHRoZXJlXG4gICAgICAvLyBtYXkgbm90IGJlIHdvcmsgc2NoZWR1bGVkIG9uIGBjdXJyZW50YCwgc28gd2UgY2hlY2sgZm9yIHRoaXMgZmxhZy5cbiAgICAgICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIERpZENhcHR1cmUpID09PSBOb0ZsYWdzKSB7XG4gICAgICAgIC8vIE5vIHBlbmRpbmcgdXBkYXRlcyBvciBjb250ZXh0LiBCYWlsIG91dCBub3cuXG4gICAgICAgIGRpZFJlY2VpdmVVcGRhdGUgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIGF0dGVtcHRFYXJseUJhaWxvdXRJZk5vU2NoZWR1bGVkVXBkYXRlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICAgIGlmICgoY3VycmVudC5mbGFncyAmIEZvcmNlVXBkYXRlRm9yTGVnYWN5U3VzcGVuc2UpICE9PSBOb0ZsYWdzKSB7XG4gICAgICAgIC8vIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2UgdGhhdCBvbmx5IGV4aXN0cyBmb3IgbGVnYWN5IG1vZGUuXG4gICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC8xOTIxNi5cbiAgICAgICAgZGlkUmVjZWl2ZVVwZGF0ZSA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBBbiB1cGRhdGUgd2FzIHNjaGVkdWxlZCBvbiB0aGlzIGZpYmVyLCBidXQgdGhlcmUgYXJlIG5vIG5ldyBwcm9wc1xuICAgICAgICAvLyBub3IgbGVnYWN5IGNvbnRleHQuIFNldCB0aGlzIHRvIGZhbHNlLiBJZiBhbiB1cGRhdGUgcXVldWUgb3IgY29udGV4dFxuICAgICAgICAvLyBjb25zdW1lciBwcm9kdWNlcyBhIGNoYW5nZWQgdmFsdWUsIGl0IHdpbGwgc2V0IHRoaXMgdG8gdHJ1ZS4gT3RoZXJ3aXNlLFxuICAgICAgICAvLyB0aGUgY29tcG9uZW50IHdpbGwgYXNzdW1lIHRoZSBjaGlsZHJlbiBoYXZlIG5vdCBjaGFuZ2VkIGFuZCBiYWlsIG91dC5cbiAgICAgICAgZGlkUmVjZWl2ZVVwZGF0ZSA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBkaWRSZWNlaXZlVXBkYXRlID0gZmFsc2U7XG5cbiAgICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSAmJiBpc0ZvcmtlZENoaWxkKHdvcmtJblByb2dyZXNzKSkge1xuICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBjaGlsZCBiZWxvbmdzIHRvIGEgbGlzdCBvZiBtdWxpcGxlIGNoaWxkcmVuIGluXG4gICAgICAvLyBpdHMgcGFyZW50LlxuICAgICAgLy9cbiAgICAgIC8vIEluIGEgdHJ1ZSBtdWx0aS10aHJlYWRlZCBpbXBsZW1lbnRhdGlvbiwgd2Ugd291bGQgcmVuZGVyIGNoaWxkcmVuIG9uXG4gICAgICAvLyBwYXJhbGxlbCB0aHJlYWRzLiBUaGlzIHdvdWxkIHJlcHJlc2VudCB0aGUgYmVnaW5uaW5nIG9mIGEgbmV3IHJlbmRlclxuICAgICAgLy8gdGhyZWFkIGZvciB0aGlzIHN1YnRyZWUuXG4gICAgICAvL1xuICAgICAgLy8gV2Ugb25seSB1c2UgdGhpcyBmb3IgaWQgZ2VuZXJhdGlvbiBkdXJpbmcgaHlkcmF0aW9uLCB3aGljaCBpcyB3aHkgdGhlXG4gICAgICAvLyBsb2dpYyBpcyBsb2NhdGVkIGluIHRoaXMgc3BlY2lhbCBicmFuY2guXG4gICAgICB2YXIgc2xvdEluZGV4ID0gd29ya0luUHJvZ3Jlc3MuaW5kZXg7XG4gICAgICB2YXIgbnVtYmVyT2ZGb3JrcyA9IGdldEZvcmtzQXRMZXZlbCgpO1xuICAgICAgcHVzaFRyZWVJZCh3b3JrSW5Qcm9ncmVzcywgbnVtYmVyT2ZGb3Jrcywgc2xvdEluZGV4KTtcbiAgICB9XG4gIH0gLy8gQmVmb3JlIGVudGVyaW5nIHRoZSBiZWdpbiBwaGFzZSwgY2xlYXIgcGVuZGluZyB1cGRhdGUgcHJpb3JpdHkuXG4gIC8vIFRPRE86IFRoaXMgYXNzdW1lcyB0aGF0IHdlJ3JlIGFib3V0IHRvIGV2YWx1YXRlIHRoZSBjb21wb25lbnQgYW5kIHByb2Nlc3NcbiAgLy8gdGhlIHVwZGF0ZSBxdWV1ZS4gSG93ZXZlciwgdGhlcmUncyBhbiBleGNlcHRpb246IFNpbXBsZU1lbW9Db21wb25lbnRcbiAgLy8gc29tZXRpbWVzIGJhaWxzIG91dCBsYXRlciBpbiB0aGUgYmVnaW4gcGhhc2UuIFRoaXMgaW5kaWNhdGVzIHRoYXQgd2Ugc2hvdWxkXG4gIC8vIG1vdmUgdGhpcyBhc3NpZ25tZW50IG91dCBvZiB0aGUgY29tbW9uIHBhdGggYW5kIGludG8gZWFjaCBicmFuY2guXG5cblxuICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IE5vTGFuZXM7XG5cbiAgc3dpdGNoICh3b3JrSW5Qcm9ncmVzcy50YWcpIHtcbiAgICBjYXNlIEluZGV0ZXJtaW5hdGVDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHJldHVybiBtb3VudEluZGV0ZXJtaW5hdGVDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHdvcmtJblByb2dyZXNzLnR5cGUsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cblxuICAgIGNhc2UgTGF6eUNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIGVsZW1lbnRUeXBlID0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGU7XG4gICAgICAgIHJldHVybiBtb3VudExhenlDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIGVsZW1lbnRUeXBlLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgQ29tcG9uZW50ID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcbiAgICAgICAgdmFyIHVucmVzb2x2ZWRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgICAgICAgdmFyIHJlc29sdmVkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSA9PT0gQ29tcG9uZW50ID8gdW5yZXNvbHZlZFByb3BzIDogcmVzb2x2ZURlZmF1bHRQcm9wcyhDb21wb25lbnQsIHVucmVzb2x2ZWRQcm9wcyk7XG4gICAgICAgIHJldHVybiB1cGRhdGVGdW5jdGlvbkNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCByZXNvbHZlZFByb3BzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgX0NvbXBvbmVudCA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gICAgICAgIHZhciBfdW5yZXNvbHZlZFByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuXG4gICAgICAgIHZhciBfcmVzb2x2ZWRQcm9wcyA9IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlID09PSBfQ29tcG9uZW50ID8gX3VucmVzb2x2ZWRQcm9wcyA6IHJlc29sdmVEZWZhdWx0UHJvcHMoX0NvbXBvbmVudCwgX3VucmVzb2x2ZWRQcm9wcyk7XG5cbiAgICAgICAgcmV0dXJuIHVwZGF0ZUNsYXNzQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBfQ29tcG9uZW50LCBfcmVzb2x2ZWRQcm9wcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgIHJldHVybiB1cGRhdGVIb3N0Um9vdChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgcmV0dXJuIHVwZGF0ZUhvc3RDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICByZXR1cm4gdXBkYXRlSG9zdFRleHQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuXG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHJldHVybiB1cGRhdGVTdXNwZW5zZUNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAgcmV0dXJuIHVwZGF0ZVBvcnRhbENvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAge1xuICAgICAgICB2YXIgdHlwZSA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gICAgICAgIHZhciBfdW5yZXNvbHZlZFByb3BzMiA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcblxuICAgICAgICB2YXIgX3Jlc29sdmVkUHJvcHMyID0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUgPT09IHR5cGUgPyBfdW5yZXNvbHZlZFByb3BzMiA6IHJlc29sdmVEZWZhdWx0UHJvcHModHlwZSwgX3VucmVzb2x2ZWRQcm9wczIpO1xuXG4gICAgICAgIHJldHVybiB1cGRhdGVGb3J3YXJkUmVmKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCB0eXBlLCBfcmVzb2x2ZWRQcm9wczIsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cblxuICAgIGNhc2UgRnJhZ21lbnQ6XG4gICAgICByZXR1cm4gdXBkYXRlRnJhZ21lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICAgIGNhc2UgTW9kZTpcbiAgICAgIHJldHVybiB1cGRhdGVNb2RlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAgICBjYXNlIFByb2ZpbGVyOlxuICAgICAgcmV0dXJuIHVwZGF0ZVByb2ZpbGVyKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAgICBjYXNlIENvbnRleHRQcm92aWRlcjpcbiAgICAgIHJldHVybiB1cGRhdGVDb250ZXh0UHJvdmlkZXIoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICAgIGNhc2UgQ29udGV4dENvbnN1bWVyOlxuICAgICAgcmV0dXJuIHVwZGF0ZUNvbnRleHRDb25zdW1lcihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgY2FzZSBNZW1vQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgX3R5cGUyID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcbiAgICAgICAgdmFyIF91bnJlc29sdmVkUHJvcHMzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzOyAvLyBSZXNvbHZlIG91dGVyIHByb3BzIGZpcnN0LCB0aGVuIHJlc29sdmUgaW5uZXIgcHJvcHMuXG5cbiAgICAgICAgdmFyIF9yZXNvbHZlZFByb3BzMyA9IHJlc29sdmVEZWZhdWx0UHJvcHMoX3R5cGUyLCBfdW5yZXNvbHZlZFByb3BzMyk7XG5cbiAgICAgICAge1xuICAgICAgICAgIGlmICh3b3JrSW5Qcm9ncmVzcy50eXBlICE9PSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSkge1xuICAgICAgICAgICAgdmFyIG91dGVyUHJvcFR5cGVzID0gX3R5cGUyLnByb3BUeXBlcztcblxuICAgICAgICAgICAgaWYgKG91dGVyUHJvcFR5cGVzKSB7XG4gICAgICAgICAgICAgIGNoZWNrUHJvcFR5cGVzKG91dGVyUHJvcFR5cGVzLCBfcmVzb2x2ZWRQcm9wczMsIC8vIFJlc29sdmVkIGZvciBvdXRlciBvbmx5XG4gICAgICAgICAgICAgICdwcm9wJywgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKF90eXBlMikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIF9yZXNvbHZlZFByb3BzMyA9IHJlc29sdmVEZWZhdWx0UHJvcHMoX3R5cGUyLnR5cGUsIF9yZXNvbHZlZFByb3BzMyk7XG4gICAgICAgIHJldHVybiB1cGRhdGVNZW1vQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBfdHlwZTIsIF9yZXNvbHZlZFByb3BzMywgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuXG4gICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICByZXR1cm4gdXBkYXRlU2ltcGxlTWVtb0NvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgd29ya0luUHJvZ3Jlc3MudHlwZSwgd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICBjYXNlIEluY29tcGxldGVDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIF9Db21wb25lbnQyID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcbiAgICAgICAgdmFyIF91bnJlc29sdmVkUHJvcHM0ID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuXG4gICAgICAgIHZhciBfcmVzb2x2ZWRQcm9wczQgPSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSA9PT0gX0NvbXBvbmVudDIgPyBfdW5yZXNvbHZlZFByb3BzNCA6IHJlc29sdmVEZWZhdWx0UHJvcHMoX0NvbXBvbmVudDIsIF91bnJlc29sdmVkUHJvcHM0KTtcblxuICAgICAgICByZXR1cm4gbW91bnRJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIF9Db21wb25lbnQyLCBfcmVzb2x2ZWRQcm9wczQsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cblxuICAgIGNhc2UgU3VzcGVuc2VMaXN0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICByZXR1cm4gdXBkYXRlU3VzcGVuc2VMaXN0Q29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICBjYXNlIFNjb3BlQ29tcG9uZW50OlxuICAgICAge1xuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBPZmZzY3JlZW5Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHJldHVybiB1cGRhdGVPZmZzY3JlZW5Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gdW5pdCBvZiB3b3JrIHRhZyAoXCIgKyB3b3JrSW5Qcm9ncmVzcy50YWcgKyBcIikuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBcIiArICdSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG59XG5cbmZ1bmN0aW9uIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpIHtcbiAgLy8gVGFnIHRoZSBmaWJlciB3aXRoIGFuIHVwZGF0ZSBlZmZlY3QuIFRoaXMgdHVybnMgYSBQbGFjZW1lbnQgaW50b1xuICAvLyBhIFBsYWNlbWVudEFuZFVwZGF0ZS5cbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlO1xufVxuXG5mdW5jdGlvbiBtYXJrUmVmJDEod29ya0luUHJvZ3Jlc3MpIHtcbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUmVmO1xuXG4gIHtcbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBSZWZTdGF0aWM7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFkTm9NdXRhdGlvbnNFZmZlY3RzKGN1cnJlbnQsIGNvbXBsZXRlZFdvcmspIHtcbiAgdmFyIGRpZEJhaWxvdXQgPSBjdXJyZW50ICE9PSBudWxsICYmIGN1cnJlbnQuY2hpbGQgPT09IGNvbXBsZXRlZFdvcmsuY2hpbGQ7XG5cbiAgaWYgKGRpZEJhaWxvdXQpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICgoY29tcGxldGVkV29yay5mbGFncyAmIENoaWxkRGVsZXRpb24pICE9PSBOb0ZsYWdzKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IC8vIFRPRE86IElmIHdlIG1vdmUgdGhlIGBoYWROb011dGF0aW9uc0VmZmVjdHNgIGNhbGwgYWZ0ZXIgYGJ1YmJsZVByb3BlcnRpZXNgXG4gIC8vIHRoZW4gd2Ugb25seSBoYXZlIHRvIGNoZWNrIHRoZSBgY29tcGxldGVkV29yay5zdWJ0cmVlRmxhZ3NgLlxuXG5cbiAgdmFyIGNoaWxkID0gY29tcGxldGVkV29yay5jaGlsZDtcblxuICB3aGlsZSAoY2hpbGQgIT09IG51bGwpIHtcbiAgICBpZiAoKGNoaWxkLmZsYWdzICYgTXV0YXRpb25NYXNrKSAhPT0gTm9GbGFncyB8fCAoY2hpbGQuc3VidHJlZUZsYWdzICYgTXV0YXRpb25NYXNrKSAhPT0gTm9GbGFncykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG52YXIgYXBwZW5kQWxsQ2hpbGRyZW47XG52YXIgdXBkYXRlSG9zdENvbnRhaW5lcjtcbnZhciB1cGRhdGVIb3N0Q29tcG9uZW50JDE7XG52YXIgdXBkYXRlSG9zdFRleHQkMTtcblxuaWYgKHN1cHBvcnRzTXV0YXRpb24pIHtcbiAgLy8gTXV0YXRpb24gbW9kZVxuICBhcHBlbmRBbGxDaGlsZHJlbiA9IGZ1bmN0aW9uIChwYXJlbnQsIHdvcmtJblByb2dyZXNzLCBuZWVkc1Zpc2liaWxpdHlUb2dnbGUsIGlzSGlkZGVuKSB7XG4gICAgLy8gV2Ugb25seSBoYXZlIHRoZSB0b3AgRmliZXIgdGhhdCB3YXMgY3JlYXRlZCBidXQgd2UgbmVlZCByZWN1cnNlIGRvd24gaXRzXG4gICAgLy8gY2hpbGRyZW4gdG8gZmluZCBhbGwgdGhlIHRlcm1pbmFsIG5vZGVzLlxuICAgIHZhciBub2RlID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG5cbiAgICB3aGlsZSAobm9kZSAhPT0gbnVsbCkge1xuICAgICAgaWYgKG5vZGUudGFnID09PSBIb3N0Q29tcG9uZW50IHx8IG5vZGUudGFnID09PSBIb3N0VGV4dCkge1xuICAgICAgICBhcHBlbmRJbml0aWFsQ2hpbGQocGFyZW50LCBub2RlLnN0YXRlTm9kZSk7XG4gICAgICB9IGVsc2UgaWYgKG5vZGUudGFnID09PSBIb3N0UG9ydGFsKSA7IGVsc2UgaWYgKG5vZGUuY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgbm9kZS5jaGlsZC5yZXR1cm4gPSBub2RlO1xuICAgICAgICBub2RlID0gbm9kZS5jaGlsZDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlID09PSB3b3JrSW5Qcm9ncmVzcykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHdoaWxlIChub2RlLnNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgICAgaWYgKG5vZGUucmV0dXJuID09PSBudWxsIHx8IG5vZGUucmV0dXJuID09PSB3b3JrSW5Qcm9ncmVzcykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICAgIH1cblxuICAgICAgbm9kZS5zaWJsaW5nLnJldHVybiA9IG5vZGUucmV0dXJuO1xuICAgICAgbm9kZSA9IG5vZGUuc2libGluZztcbiAgICB9XG4gIH07XG5cbiAgdXBkYXRlSG9zdENvbnRhaW5lciA9IGZ1bmN0aW9uIChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcykgey8vIE5vb3BcbiAgfTtcblxuICB1cGRhdGVIb3N0Q29tcG9uZW50JDEgPSBmdW5jdGlvbiAoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHR5cGUsIG5ld1Byb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UpIHtcbiAgICAvLyBJZiB3ZSBoYXZlIGFuIGFsdGVybmF0ZSwgdGhhdCBtZWFucyB0aGlzIGlzIGFuIHVwZGF0ZSBhbmQgd2UgbmVlZCB0b1xuICAgIC8vIHNjaGVkdWxlIGEgc2lkZS1lZmZlY3QgdG8gZG8gdGhlIHVwZGF0ZXMuXG4gICAgdmFyIG9sZFByb3BzID0gY3VycmVudC5tZW1vaXplZFByb3BzO1xuXG4gICAgaWYgKG9sZFByb3BzID09PSBuZXdQcm9wcykge1xuICAgICAgLy8gSW4gbXV0YXRpb24gbW9kZSwgdGhpcyBpcyBzdWZmaWNpZW50IGZvciBhIGJhaWxvdXQgYmVjYXVzZVxuICAgICAgLy8gd2Ugd29uJ3QgdG91Y2ggdGhpcyBub2RlIGV2ZW4gaWYgY2hpbGRyZW4gY2hhbmdlZC5cbiAgICAgIHJldHVybjtcbiAgICB9IC8vIElmIHdlIGdldCB1cGRhdGVkIGJlY2F1c2Ugb25lIG9mIG91ciBjaGlsZHJlbiB1cGRhdGVkLCB3ZSBkb24ndFxuICAgIC8vIGhhdmUgbmV3UHJvcHMgc28gd2UnbGwgaGF2ZSB0byByZXVzZSB0aGVtLlxuICAgIC8vIFRPRE86IFNwbGl0IHRoZSB1cGRhdGUgQVBJIGFzIHNlcGFyYXRlIGZvciB0aGUgcHJvcHMgdnMuIGNoaWxkcmVuLlxuICAgIC8vIEV2ZW4gYmV0dGVyIHdvdWxkIGJlIGlmIGNoaWxkcmVuIHdlcmVuJ3Qgc3BlY2lhbCBjYXNlZCBhdCBhbGwgdGhvLlxuXG5cbiAgICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gICAgdmFyIGN1cnJlbnRIb3N0Q29udGV4dCA9IGdldEhvc3RDb250ZXh0KCk7IC8vIFRPRE86IEV4cGVyaWVuY2luZyBhbiBlcnJvciB3aGVyZSBvbGRQcm9wcyBpcyBudWxsLiBTdWdnZXN0cyBhIGhvc3RcbiAgICAvLyBjb21wb25lbnQgaXMgaGl0dGluZyB0aGUgcmVzdW1lIHBhdGguIEZpZ3VyZSBvdXQgd2h5LiBQb3NzaWJseVxuICAgIC8vIHJlbGF0ZWQgdG8gYGhpZGRlbmAuXG5cbiAgICB2YXIgdXBkYXRlUGF5bG9hZCA9IHByZXBhcmVVcGRhdGUoaW5zdGFuY2UsIHR5cGUsIG9sZFByb3BzLCBuZXdQcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlLCBjdXJyZW50SG9zdENvbnRleHQpOyAvLyBUT0RPOiBUeXBlIHRoaXMgc3BlY2lmaWMgdG8gdGhpcyB0eXBlIG9mIGNvbXBvbmVudC5cblxuICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gdXBkYXRlUGF5bG9hZDsgLy8gSWYgdGhlIHVwZGF0ZSBwYXlsb2FkIGluZGljYXRlcyB0aGF0IHRoZXJlIGlzIGEgY2hhbmdlIG9yIGlmIHRoZXJlXG4gICAgLy8gaXMgYSBuZXcgcmVmIHdlIG1hcmsgdGhpcyBhcyBhbiB1cGRhdGUuIEFsbCB0aGUgd29yayBpcyBkb25lIGluIGNvbW1pdFdvcmsuXG5cbiAgICBpZiAodXBkYXRlUGF5bG9hZCkge1xuICAgICAgbWFya1VwZGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgfVxuICB9O1xuXG4gIHVwZGF0ZUhvc3RUZXh0JDEgPSBmdW5jdGlvbiAoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG9sZFRleHQsIG5ld1RleHQpIHtcbiAgICAvLyBJZiB0aGUgdGV4dCBkaWZmZXJzLCBtYXJrIGl0IGFzIGFuIHVwZGF0ZS4gQWxsIHRoZSB3b3JrIGluIGRvbmUgaW4gY29tbWl0V29yay5cbiAgICBpZiAob2xkVGV4dCAhPT0gbmV3VGV4dCkge1xuICAgICAgbWFya1VwZGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgfVxuICB9O1xufSBlbHNlIGlmIChzdXBwb3J0c1BlcnNpc3RlbmNlKSB7XG4gIC8vIFBlcnNpc3RlbnQgaG9zdCB0cmVlIG1vZGVcbiAgYXBwZW5kQWxsQ2hpbGRyZW4gPSBmdW5jdGlvbiAocGFyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmVlZHNWaXNpYmlsaXR5VG9nZ2xlLCBpc0hpZGRlbikge1xuICAgIC8vIFdlIG9ubHkgaGF2ZSB0aGUgdG9wIEZpYmVyIHRoYXQgd2FzIGNyZWF0ZWQgYnV0IHdlIG5lZWQgcmVjdXJzZSBkb3duIGl0c1xuICAgIC8vIGNoaWxkcmVuIHRvIGZpbmQgYWxsIHRoZSB0ZXJtaW5hbCBub2Rlcy5cbiAgICB2YXIgbm9kZSA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuXG4gICAgd2hpbGUgKG5vZGUgIT09IG51bGwpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1sYWJlbHNcbiAgICAgICBpZiAobm9kZS50YWcgPT09IEhvc3RDb21wb25lbnQpIHtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gbm9kZS5zdGF0ZU5vZGU7XG5cbiAgICAgICAgaWYgKG5lZWRzVmlzaWJpbGl0eVRvZ2dsZSAmJiBpc0hpZGRlbikge1xuICAgICAgICAgIC8vIFRoaXMgY2hpbGQgaXMgaW5zaWRlIGEgdGltZWQgb3V0IHRyZWUuIEhpZGUgaXQuXG4gICAgICAgICAgdmFyIHByb3BzID0gbm9kZS5tZW1vaXplZFByb3BzO1xuICAgICAgICAgIHZhciB0eXBlID0gbm9kZS50eXBlO1xuICAgICAgICAgIGluc3RhbmNlID0gY2xvbmVIaWRkZW5JbnN0YW5jZShpbnN0YW5jZSwgdHlwZSwgcHJvcHMsIG5vZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXBwZW5kSW5pdGlhbENoaWxkKHBhcmVudCwgaW5zdGFuY2UpO1xuICAgICAgfSBlbHNlIGlmIChub2RlLnRhZyA9PT0gSG9zdFRleHQpIHtcbiAgICAgICAgdmFyIF9pbnN0YW5jZSA9IG5vZGUuc3RhdGVOb2RlO1xuXG4gICAgICAgIGlmIChuZWVkc1Zpc2liaWxpdHlUb2dnbGUgJiYgaXNIaWRkZW4pIHtcbiAgICAgICAgICAvLyBUaGlzIGNoaWxkIGlzIGluc2lkZSBhIHRpbWVkIG91dCB0cmVlLiBIaWRlIGl0LlxuICAgICAgICAgIHZhciB0ZXh0ID0gbm9kZS5tZW1vaXplZFByb3BzO1xuICAgICAgICAgIF9pbnN0YW5jZSA9IGNsb25lSGlkZGVuVGV4dEluc3RhbmNlKF9pbnN0YW5jZSwgdGV4dCwgbm9kZSk7XG4gICAgICAgIH1cblxuICAgICAgICBhcHBlbmRJbml0aWFsQ2hpbGQocGFyZW50LCBfaW5zdGFuY2UpO1xuICAgICAgfSBlbHNlIGlmIChub2RlLnRhZyA9PT0gSG9zdFBvcnRhbCkgOyBlbHNlIGlmIChub2RlLnRhZyA9PT0gT2Zmc2NyZWVuQ29tcG9uZW50ICYmIG5vZGUubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAvLyBUaGUgY2hpbGRyZW4gaW4gdGhpcyBib3VuZGFyeSBhcmUgaGlkZGVuLiBUb2dnbGUgdGhlaXIgdmlzaWJpbGl0eVxuICAgICAgICAvLyBiZWZvcmUgYXBwZW5kaW5nLlxuICAgICAgICB2YXIgY2hpbGQgPSBub2RlLmNoaWxkO1xuXG4gICAgICAgIGlmIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICAgIGNoaWxkLnJldHVybiA9IG5vZGU7XG4gICAgICAgIH1cblxuICAgICAgICBhcHBlbmRBbGxDaGlsZHJlbihwYXJlbnQsIG5vZGUsIHRydWUsIHRydWUpO1xuICAgICAgfSBlbHNlIGlmIChub2RlLmNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgIG5vZGUuY2hpbGQucmV0dXJuID0gbm9kZTtcbiAgICAgICAgbm9kZSA9IG5vZGUuY2hpbGQ7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfSAvLyAkRmxvd0ZpeE1lIFRoaXMgaXMgY29ycmVjdCBidXQgRmxvdyBpcyBjb25mdXNlZCBieSB0aGUgbGFiZWxlZCBicmVhay5cblxuXG4gICAgICBub2RlID0gbm9kZTtcblxuICAgICAgaWYgKG5vZGUgPT09IHdvcmtJblByb2dyZXNzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgd2hpbGUgKG5vZGUuc2libGluZyA9PT0gbnVsbCkge1xuICAgICAgICBpZiAobm9kZS5yZXR1cm4gPT09IG51bGwgfHwgbm9kZS5yZXR1cm4gPT09IHdvcmtJblByb2dyZXNzKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgICBub2RlID0gbm9kZS5zaWJsaW5nO1xuICAgIH1cbiAgfTsgLy8gQW4gdW5mb3J0dW5hdGUgZm9yayBvZiBhcHBlbmRBbGxDaGlsZHJlbiBiZWNhdXNlIHdlIGhhdmUgdHdvIGRpZmZlcmVudCBwYXJlbnQgdHlwZXMuXG5cblxuICB2YXIgYXBwZW5kQWxsQ2hpbGRyZW5Ub0NvbnRhaW5lciA9IGZ1bmN0aW9uIChjb250YWluZXJDaGlsZFNldCwgd29ya0luUHJvZ3Jlc3MsIG5lZWRzVmlzaWJpbGl0eVRvZ2dsZSwgaXNIaWRkZW4pIHtcbiAgICAvLyBXZSBvbmx5IGhhdmUgdGhlIHRvcCBGaWJlciB0aGF0IHdhcyBjcmVhdGVkIGJ1dCB3ZSBuZWVkIHJlY3Vyc2UgZG93biBpdHNcbiAgICAvLyBjaGlsZHJlbiB0byBmaW5kIGFsbCB0aGUgdGVybWluYWwgbm9kZXMuXG4gICAgdmFyIG5vZGUgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcblxuICAgIHdoaWxlIChub2RlICE9PSBudWxsKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbGFiZWxzXG4gICAgICAgaWYgKG5vZGUudGFnID09PSBIb3N0Q29tcG9uZW50KSB7XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IG5vZGUuc3RhdGVOb2RlO1xuXG4gICAgICAgIGlmIChuZWVkc1Zpc2liaWxpdHlUb2dnbGUgJiYgaXNIaWRkZW4pIHtcbiAgICAgICAgICAvLyBUaGlzIGNoaWxkIGlzIGluc2lkZSBhIHRpbWVkIG91dCB0cmVlLiBIaWRlIGl0LlxuICAgICAgICAgIHZhciBwcm9wcyA9IG5vZGUubWVtb2l6ZWRQcm9wcztcbiAgICAgICAgICB2YXIgdHlwZSA9IG5vZGUudHlwZTtcbiAgICAgICAgICBpbnN0YW5jZSA9IGNsb25lSGlkZGVuSW5zdGFuY2UoaW5zdGFuY2UsIHR5cGUsIHByb3BzLCBub2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGFwcGVuZENoaWxkVG9Db250YWluZXJDaGlsZFNldChjb250YWluZXJDaGlsZFNldCwgaW5zdGFuY2UpO1xuICAgICAgfSBlbHNlIGlmIChub2RlLnRhZyA9PT0gSG9zdFRleHQpIHtcbiAgICAgICAgdmFyIF9pbnN0YW5jZTIgPSBub2RlLnN0YXRlTm9kZTtcblxuICAgICAgICBpZiAobmVlZHNWaXNpYmlsaXR5VG9nZ2xlICYmIGlzSGlkZGVuKSB7XG4gICAgICAgICAgLy8gVGhpcyBjaGlsZCBpcyBpbnNpZGUgYSB0aW1lZCBvdXQgdHJlZS4gSGlkZSBpdC5cbiAgICAgICAgICB2YXIgdGV4dCA9IG5vZGUubWVtb2l6ZWRQcm9wcztcbiAgICAgICAgICBfaW5zdGFuY2UyID0gY2xvbmVIaWRkZW5UZXh0SW5zdGFuY2UoX2luc3RhbmNlMiwgdGV4dCwgbm9kZSk7XG4gICAgICAgIH1cblxuICAgICAgICBhcHBlbmRDaGlsZFRvQ29udGFpbmVyQ2hpbGRTZXQoY29udGFpbmVyQ2hpbGRTZXQsIF9pbnN0YW5jZTIpO1xuICAgICAgfSBlbHNlIGlmIChub2RlLnRhZyA9PT0gSG9zdFBvcnRhbCkgOyBlbHNlIGlmIChub2RlLnRhZyA9PT0gT2Zmc2NyZWVuQ29tcG9uZW50ICYmIG5vZGUubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAvLyBUaGUgY2hpbGRyZW4gaW4gdGhpcyBib3VuZGFyeSBhcmUgaGlkZGVuLiBUb2dnbGUgdGhlaXIgdmlzaWJpbGl0eVxuICAgICAgICAvLyBiZWZvcmUgYXBwZW5kaW5nLlxuICAgICAgICB2YXIgY2hpbGQgPSBub2RlLmNoaWxkO1xuXG4gICAgICAgIGlmIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICAgIGNoaWxkLnJldHVybiA9IG5vZGU7XG4gICAgICAgIH1cblxuICAgICAgICBhcHBlbmRBbGxDaGlsZHJlblRvQ29udGFpbmVyKGNvbnRhaW5lckNoaWxkU2V0LCBub2RlLCB0cnVlLCB0cnVlKTtcbiAgICAgIH0gZWxzZSBpZiAobm9kZS5jaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICBub2RlLmNoaWxkLnJldHVybiA9IG5vZGU7XG4gICAgICAgIG5vZGUgPSBub2RlLmNoaWxkO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gLy8gJEZsb3dGaXhNZSBUaGlzIGlzIGNvcnJlY3QgYnV0IEZsb3cgaXMgY29uZnVzZWQgYnkgdGhlIGxhYmVsZWQgYnJlYWsuXG5cblxuICAgICAgbm9kZSA9IG5vZGU7XG5cbiAgICAgIGlmIChub2RlID09PSB3b3JrSW5Qcm9ncmVzcykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHdoaWxlIChub2RlLnNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgICAgaWYgKG5vZGUucmV0dXJuID09PSBudWxsIHx8IG5vZGUucmV0dXJuID09PSB3b3JrSW5Qcm9ncmVzcykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICAgIH1cblxuICAgICAgbm9kZS5zaWJsaW5nLnJldHVybiA9IG5vZGUucmV0dXJuO1xuICAgICAgbm9kZSA9IG5vZGUuc2libGluZztcbiAgICB9XG4gIH07XG5cbiAgdXBkYXRlSG9zdENvbnRhaW5lciA9IGZ1bmN0aW9uIChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcykge1xuICAgIHZhciBwb3J0YWxPclJvb3QgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gICAgdmFyIGNoaWxkcmVuVW5jaGFuZ2VkID0gaGFkTm9NdXRhdGlvbnNFZmZlY3RzKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTtcblxuICAgIGlmIChjaGlsZHJlblVuY2hhbmdlZCkgOyBlbHNlIHtcbiAgICAgIHZhciBjb250YWluZXIgPSBwb3J0YWxPclJvb3QuY29udGFpbmVySW5mbztcbiAgICAgIHZhciBuZXdDaGlsZFNldCA9IGNyZWF0ZUNvbnRhaW5lckNoaWxkU2V0KGNvbnRhaW5lcik7IC8vIElmIGNoaWxkcmVuIG1pZ2h0IGhhdmUgY2hhbmdlZCwgd2UgaGF2ZSB0byBhZGQgdGhlbSBhbGwgdG8gdGhlIHNldC5cblxuICAgICAgYXBwZW5kQWxsQ2hpbGRyZW5Ub0NvbnRhaW5lcihuZXdDaGlsZFNldCwgd29ya0luUHJvZ3Jlc3MsIGZhbHNlLCBmYWxzZSk7XG4gICAgICBwb3J0YWxPclJvb3QucGVuZGluZ0NoaWxkcmVuID0gbmV3Q2hpbGRTZXQ7IC8vIFNjaGVkdWxlIGFuIHVwZGF0ZSBvbiB0aGUgY29udGFpbmVyIHRvIHN3YXAgb3V0IHRoZSBjb250YWluZXIuXG5cbiAgICAgIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgZmluYWxpemVDb250YWluZXJDaGlsZHJlbihjb250YWluZXIsIG5ld0NoaWxkU2V0KTtcbiAgICB9XG4gIH07XG5cbiAgdXBkYXRlSG9zdENvbXBvbmVudCQxID0gZnVuY3Rpb24gKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCB0eXBlLCBuZXdQcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlKSB7XG4gICAgdmFyIGN1cnJlbnRJbnN0YW5jZSA9IGN1cnJlbnQuc3RhdGVOb2RlO1xuICAgIHZhciBvbGRQcm9wcyA9IGN1cnJlbnQubWVtb2l6ZWRQcm9wczsgLy8gSWYgdGhlcmUgYXJlIG5vIGVmZmVjdHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbm9kZSwgdGhlbiBub25lIG9mIG91ciBjaGlsZHJlbiBoYWQgYW55IHVwZGF0ZXMuXG4gICAgLy8gVGhpcyBndWFyYW50ZWVzIHRoYXQgd2UgY2FuIHJldXNlIGFsbCBvZiB0aGVtLlxuXG4gICAgdmFyIGNoaWxkcmVuVW5jaGFuZ2VkID0gaGFkTm9NdXRhdGlvbnNFZmZlY3RzKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTtcblxuICAgIGlmIChjaGlsZHJlblVuY2hhbmdlZCAmJiBvbGRQcm9wcyA9PT0gbmV3UHJvcHMpIHtcbiAgICAgIC8vIE5vIGNoYW5nZXMsIGp1c3QgcmV1c2UgdGhlIGV4aXN0aW5nIGluc3RhbmNlLlxuICAgICAgLy8gTm90ZSB0aGF0IHRoaXMgbWlnaHQgcmVsZWFzZSBhIHByZXZpb3VzIGNsb25lLlxuICAgICAgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlID0gY3VycmVudEluc3RhbmNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciByZWN5Y2xhYmxlSW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gICAgdmFyIGN1cnJlbnRIb3N0Q29udGV4dCA9IGdldEhvc3RDb250ZXh0KCk7XG4gICAgdmFyIHVwZGF0ZVBheWxvYWQgPSBudWxsO1xuXG4gICAgaWYgKG9sZFByb3BzICE9PSBuZXdQcm9wcykge1xuICAgICAgdXBkYXRlUGF5bG9hZCA9IHByZXBhcmVVcGRhdGUocmVjeWNsYWJsZUluc3RhbmNlLCB0eXBlLCBvbGRQcm9wcywgbmV3UHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgY3VycmVudEhvc3RDb250ZXh0KTtcbiAgICB9XG5cbiAgICBpZiAoY2hpbGRyZW5VbmNoYW5nZWQgJiYgdXBkYXRlUGF5bG9hZCA9PT0gbnVsbCkge1xuICAgICAgLy8gTm8gY2hhbmdlcywganVzdCByZXVzZSB0aGUgZXhpc3RpbmcgaW5zdGFuY2UuXG4gICAgICAvLyBOb3RlIHRoYXQgdGhpcyBtaWdodCByZWxlYXNlIGEgcHJldmlvdXMgY2xvbmUuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgPSBjdXJyZW50SW5zdGFuY2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIG5ld0luc3RhbmNlID0gY2xvbmVJbnN0YW5jZShjdXJyZW50SW5zdGFuY2UsIHVwZGF0ZVBheWxvYWQsIHR5cGUsIG9sZFByb3BzLCBuZXdQcm9wcywgd29ya0luUHJvZ3Jlc3MsIGNoaWxkcmVuVW5jaGFuZ2VkLCByZWN5Y2xhYmxlSW5zdGFuY2UpO1xuXG4gICAgaWYgKGZpbmFsaXplSW5pdGlhbENoaWxkcmVuKG5ld0luc3RhbmNlLCB0eXBlLCBuZXdQcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlLCBjdXJyZW50SG9zdENvbnRleHQpKSB7XG4gICAgICBtYXJrVXBkYXRlKHdvcmtJblByb2dyZXNzKTtcbiAgICB9XG5cbiAgICB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgPSBuZXdJbnN0YW5jZTtcblxuICAgIGlmIChjaGlsZHJlblVuY2hhbmdlZCkge1xuICAgICAgLy8gSWYgdGhlcmUgYXJlIG5vIG90aGVyIGVmZmVjdHMgaW4gdGhpcyB0cmVlLCB3ZSBuZWVkIHRvIGZsYWcgdGhpcyBub2RlIGFzIGhhdmluZyBvbmUuXG4gICAgICAvLyBFdmVuIHRob3VnaCB3ZSdyZSBub3QgZ29pbmcgdG8gdXNlIGl0IGZvciBhbnl0aGluZy5cbiAgICAgIC8vIE90aGVyd2lzZSBwYXJlbnRzIHdvbid0IGtub3cgdGhhdCB0aGVyZSBhcmUgbmV3IGNoaWxkcmVuIHRvIHByb3BhZ2F0ZSB1cHdhcmRzLlxuICAgICAgbWFya1VwZGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElmIGNoaWxkcmVuIG1pZ2h0IGhhdmUgY2hhbmdlZCwgd2UgaGF2ZSB0byBhZGQgdGhlbSBhbGwgdG8gdGhlIHNldC5cbiAgICAgIGFwcGVuZEFsbENoaWxkcmVuKG5ld0luc3RhbmNlLCB3b3JrSW5Qcm9ncmVzcywgZmFsc2UsIGZhbHNlKTtcbiAgICB9XG4gIH07XG5cbiAgdXBkYXRlSG9zdFRleHQkMSA9IGZ1bmN0aW9uIChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgb2xkVGV4dCwgbmV3VGV4dCkge1xuICAgIGlmIChvbGRUZXh0ICE9PSBuZXdUZXh0KSB7XG4gICAgICAvLyBJZiB0aGUgdGV4dCBjb250ZW50IGRpZmZlcnMsIHdlJ2xsIGNyZWF0ZSBhIG5ldyB0ZXh0IGluc3RhbmNlIGZvciBpdC5cbiAgICAgIHZhciByb290Q29udGFpbmVySW5zdGFuY2UgPSBnZXRSb290SG9zdENvbnRhaW5lcigpO1xuICAgICAgdmFyIGN1cnJlbnRIb3N0Q29udGV4dCA9IGdldEhvc3RDb250ZXh0KCk7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgPSBjcmVhdGVUZXh0SW5zdGFuY2UobmV3VGV4dCwgcm9vdENvbnRhaW5lckluc3RhbmNlLCBjdXJyZW50SG9zdENvbnRleHQsIHdvcmtJblByb2dyZXNzKTsgLy8gV2UnbGwgaGF2ZSB0byBtYXJrIGl0IGFzIGhhdmluZyBhbiBlZmZlY3QsIGV2ZW4gdGhvdWdoIHdlIHdvbid0IHVzZSB0aGUgZWZmZWN0IGZvciBhbnl0aGluZy5cbiAgICAgIC8vIFRoaXMgbGV0cyB0aGUgcGFyZW50cyBrbm93IHRoYXQgYXQgbGVhc3Qgb25lIG9mIHRoZWlyIGNoaWxkcmVuIGhhcyBjaGFuZ2VkLlxuXG4gICAgICBtYXJrVXBkYXRlKHdvcmtJblByb2dyZXNzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlID0gY3VycmVudC5zdGF0ZU5vZGU7XG4gICAgfVxuICB9O1xufSBlbHNlIHtcbiAgLy8gTm8gaG9zdCBvcGVyYXRpb25zXG4gIHVwZGF0ZUhvc3RDb250YWluZXIgPSBmdW5jdGlvbiAoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpIHsvLyBOb29wXG4gIH07XG5cbiAgdXBkYXRlSG9zdENvbXBvbmVudCQxID0gZnVuY3Rpb24gKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCB0eXBlLCBuZXdQcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlKSB7Ly8gTm9vcFxuICB9O1xuXG4gIHVwZGF0ZUhvc3RUZXh0JDEgPSBmdW5jdGlvbiAoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG9sZFRleHQsIG5ld1RleHQpIHsvLyBOb29wXG4gIH07XG59XG5cbmZ1bmN0aW9uIGN1dE9mZlRhaWxJZk5lZWRlZChyZW5kZXJTdGF0ZSwgaGFzUmVuZGVyZWRBVGFpbEZhbGxiYWNrKSB7XG4gIGlmIChnZXRJc0h5ZHJhdGluZygpKSB7XG4gICAgLy8gSWYgd2UncmUgaHlkcmF0aW5nLCB3ZSBzaG91bGQgY29uc3VtZSBhcyBtYW55IGl0ZW1zIGFzIHdlIGNhblxuICAgIC8vIHNvIHdlIGRvbid0IGxlYXZlIGFueSBiZWhpbmQuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgc3dpdGNoIChyZW5kZXJTdGF0ZS50YWlsTW9kZSkge1xuICAgIGNhc2UgJ2hpZGRlbic6XG4gICAgICB7XG4gICAgICAgIC8vIEFueSBpbnNlcnRpb25zIGF0IHRoZSBlbmQgb2YgdGhlIHRhaWwgbGlzdCBhZnRlciB0aGlzIHBvaW50XG4gICAgICAgIC8vIHNob3VsZCBiZSBpbnZpc2libGUuIElmIHRoZXJlIGFyZSBhbHJlYWR5IG1vdW50ZWQgYm91bmRhcmllc1xuICAgICAgICAvLyBhbnl0aGluZyBiZWZvcmUgdGhlbSBhcmUgbm90IGNvbnNpZGVyZWQgZm9yIGNvbGxhcHNpbmcuXG4gICAgICAgIC8vIFRoZXJlZm9yZSB3ZSBuZWVkIHRvIGdvIHRocm91Z2ggdGhlIHdob2xlIHRhaWwgdG8gZmluZCBpZlxuICAgICAgICAvLyB0aGVyZSBhcmUgYW55LlxuICAgICAgICB2YXIgdGFpbE5vZGUgPSByZW5kZXJTdGF0ZS50YWlsO1xuICAgICAgICB2YXIgbGFzdFRhaWxOb2RlID0gbnVsbDtcblxuICAgICAgICB3aGlsZSAodGFpbE5vZGUgIT09IG51bGwpIHtcbiAgICAgICAgICBpZiAodGFpbE5vZGUuYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBsYXN0VGFpbE5vZGUgPSB0YWlsTm9kZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0YWlsTm9kZSA9IHRhaWxOb2RlLnNpYmxpbmc7XG4gICAgICAgIH0gLy8gTmV4dCB3ZSdyZSBzaW1wbHkgZ29pbmcgdG8gZGVsZXRlIGFsbCBpbnNlcnRpb25zIGFmdGVyIHRoZVxuICAgICAgICAvLyBsYXN0IHJlbmRlcmVkIGl0ZW0uXG5cblxuICAgICAgICBpZiAobGFzdFRhaWxOb2RlID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gQWxsIHJlbWFpbmluZyBpdGVtcyBpbiB0aGUgdGFpbCBhcmUgaW5zZXJ0aW9ucy5cbiAgICAgICAgICByZW5kZXJTdGF0ZS50YWlsID0gbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBEZXRhY2ggdGhlIGluc2VydGlvbiBhZnRlciB0aGUgbGFzdCBub2RlIHRoYXQgd2FzIGFscmVhZHlcbiAgICAgICAgICAvLyBpbnNlcnRlZC5cbiAgICAgICAgICBsYXN0VGFpbE5vZGUuc2libGluZyA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgJ2NvbGxhcHNlZCc6XG4gICAgICB7XG4gICAgICAgIC8vIEFueSBpbnNlcnRpb25zIGF0IHRoZSBlbmQgb2YgdGhlIHRhaWwgbGlzdCBhZnRlciB0aGlzIHBvaW50XG4gICAgICAgIC8vIHNob3VsZCBiZSBpbnZpc2libGUuIElmIHRoZXJlIGFyZSBhbHJlYWR5IG1vdW50ZWQgYm91bmRhcmllc1xuICAgICAgICAvLyBhbnl0aGluZyBiZWZvcmUgdGhlbSBhcmUgbm90IGNvbnNpZGVyZWQgZm9yIGNvbGxhcHNpbmcuXG4gICAgICAgIC8vIFRoZXJlZm9yZSB3ZSBuZWVkIHRvIGdvIHRocm91Z2ggdGhlIHdob2xlIHRhaWwgdG8gZmluZCBpZlxuICAgICAgICAvLyB0aGVyZSBhcmUgYW55LlxuICAgICAgICB2YXIgX3RhaWxOb2RlID0gcmVuZGVyU3RhdGUudGFpbDtcbiAgICAgICAgdmFyIF9sYXN0VGFpbE5vZGUgPSBudWxsO1xuXG4gICAgICAgIHdoaWxlIChfdGFpbE5vZGUgIT09IG51bGwpIHtcbiAgICAgICAgICBpZiAoX3RhaWxOb2RlLmFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgX2xhc3RUYWlsTm9kZSA9IF90YWlsTm9kZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBfdGFpbE5vZGUgPSBfdGFpbE5vZGUuc2libGluZztcbiAgICAgICAgfSAvLyBOZXh0IHdlJ3JlIHNpbXBseSBnb2luZyB0byBkZWxldGUgYWxsIGluc2VydGlvbnMgYWZ0ZXIgdGhlXG4gICAgICAgIC8vIGxhc3QgcmVuZGVyZWQgaXRlbS5cblxuXG4gICAgICAgIGlmIChfbGFzdFRhaWxOb2RlID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gQWxsIHJlbWFpbmluZyBpdGVtcyBpbiB0aGUgdGFpbCBhcmUgaW5zZXJ0aW9ucy5cbiAgICAgICAgICBpZiAoIWhhc1JlbmRlcmVkQVRhaWxGYWxsYmFjayAmJiByZW5kZXJTdGF0ZS50YWlsICE9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBXZSBzdXNwZW5kZWQgZHVyaW5nIHRoZSBoZWFkLiBXZSB3YW50IHRvIHNob3cgYXQgbGVhc3Qgb25lXG4gICAgICAgICAgICAvLyByb3cgYXQgdGhlIHRhaWwuIFNvIHdlJ2xsIGtlZXAgb24gYW5kIGN1dCBvZmYgdGhlIHJlc3QuXG4gICAgICAgICAgICByZW5kZXJTdGF0ZS50YWlsLnNpYmxpbmcgPSBudWxsO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZW5kZXJTdGF0ZS50YWlsID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gRGV0YWNoIHRoZSBpbnNlcnRpb24gYWZ0ZXIgdGhlIGxhc3Qgbm9kZSB0aGF0IHdhcyBhbHJlYWR5XG4gICAgICAgICAgLy8gaW5zZXJ0ZWQuXG4gICAgICAgICAgX2xhc3RUYWlsTm9kZS5zaWJsaW5nID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGJ1YmJsZVByb3BlcnRpZXMoY29tcGxldGVkV29yaykge1xuICB2YXIgZGlkQmFpbG91dCA9IGNvbXBsZXRlZFdvcmsuYWx0ZXJuYXRlICE9PSBudWxsICYmIGNvbXBsZXRlZFdvcmsuYWx0ZXJuYXRlLmNoaWxkID09PSBjb21wbGV0ZWRXb3JrLmNoaWxkO1xuICB2YXIgbmV3Q2hpbGRMYW5lcyA9IE5vTGFuZXM7XG4gIHZhciBzdWJ0cmVlRmxhZ3MgPSBOb0ZsYWdzO1xuXG4gIGlmICghZGlkQmFpbG91dCkge1xuICAgIC8vIEJ1YmJsZSB1cCB0aGUgZWFybGllc3QgZXhwaXJhdGlvbiB0aW1lLlxuICAgIGlmICggKGNvbXBsZXRlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAvLyBJbiBwcm9maWxpbmcgbW9kZSwgcmVzZXRDaGlsZEV4cGlyYXRpb25UaW1lIGlzIGFsc28gdXNlZCB0byByZXNldFxuICAgICAgLy8gcHJvZmlsZXIgZHVyYXRpb25zLlxuICAgICAgdmFyIGFjdHVhbER1cmF0aW9uID0gY29tcGxldGVkV29yay5hY3R1YWxEdXJhdGlvbjtcbiAgICAgIHZhciB0cmVlQmFzZUR1cmF0aW9uID0gY29tcGxldGVkV29yay5zZWxmQmFzZUR1cmF0aW9uO1xuICAgICAgdmFyIGNoaWxkID0gY29tcGxldGVkV29yay5jaGlsZDtcblxuICAgICAgd2hpbGUgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgIG5ld0NoaWxkTGFuZXMgPSBtZXJnZUxhbmVzKG5ld0NoaWxkTGFuZXMsIG1lcmdlTGFuZXMoY2hpbGQubGFuZXMsIGNoaWxkLmNoaWxkTGFuZXMpKTtcbiAgICAgICAgc3VidHJlZUZsYWdzIHw9IGNoaWxkLnN1YnRyZWVGbGFncztcbiAgICAgICAgc3VidHJlZUZsYWdzIHw9IGNoaWxkLmZsYWdzOyAvLyBXaGVuIGEgZmliZXIgaXMgY2xvbmVkLCBpdHMgYWN0dWFsRHVyYXRpb24gaXMgcmVzZXQgdG8gMC4gVGhpcyB2YWx1ZSB3aWxsXG4gICAgICAgIC8vIG9ubHkgYmUgdXBkYXRlZCBpZiB3b3JrIGlzIGRvbmUgb24gdGhlIGZpYmVyIChpLmUuIGl0IGRvZXNuJ3QgYmFpbG91dCkuXG4gICAgICAgIC8vIFdoZW4gd29yayBpcyBkb25lLCBpdCBzaG91bGQgYnViYmxlIHRvIHRoZSBwYXJlbnQncyBhY3R1YWxEdXJhdGlvbi4gSWZcbiAgICAgICAgLy8gdGhlIGZpYmVyIGhhcyBub3QgYmVlbiBjbG9uZWQgdGhvdWdoLCAobWVhbmluZyBubyB3b3JrIHdhcyBkb25lKSwgdGhlblxuICAgICAgICAvLyB0aGlzIHZhbHVlIHdpbGwgcmVmbGVjdCB0aGUgYW1vdW50IG9mIHRpbWUgc3BlbnQgd29ya2luZyBvbiBhIHByZXZpb3VzXG4gICAgICAgIC8vIHJlbmRlci4gSW4gdGhhdCBjYXNlIGl0IHNob3VsZCBub3QgYnViYmxlLiBXZSBkZXRlcm1pbmUgd2hldGhlciBpdCB3YXNcbiAgICAgICAgLy8gY2xvbmVkIGJ5IGNvbXBhcmluZyB0aGUgY2hpbGQgcG9pbnRlci5cblxuICAgICAgICBhY3R1YWxEdXJhdGlvbiArPSBjaGlsZC5hY3R1YWxEdXJhdGlvbjtcbiAgICAgICAgdHJlZUJhc2VEdXJhdGlvbiArPSBjaGlsZC50cmVlQmFzZUR1cmF0aW9uO1xuICAgICAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gICAgICB9XG5cbiAgICAgIGNvbXBsZXRlZFdvcmsuYWN0dWFsRHVyYXRpb24gPSBhY3R1YWxEdXJhdGlvbjtcbiAgICAgIGNvbXBsZXRlZFdvcmsudHJlZUJhc2VEdXJhdGlvbiA9IHRyZWVCYXNlRHVyYXRpb247XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBfY2hpbGQgPSBjb21wbGV0ZWRXb3JrLmNoaWxkO1xuXG4gICAgICB3aGlsZSAoX2NoaWxkICE9PSBudWxsKSB7XG4gICAgICAgIG5ld0NoaWxkTGFuZXMgPSBtZXJnZUxhbmVzKG5ld0NoaWxkTGFuZXMsIG1lcmdlTGFuZXMoX2NoaWxkLmxhbmVzLCBfY2hpbGQuY2hpbGRMYW5lcykpO1xuICAgICAgICBzdWJ0cmVlRmxhZ3MgfD0gX2NoaWxkLnN1YnRyZWVGbGFncztcbiAgICAgICAgc3VidHJlZUZsYWdzIHw9IF9jaGlsZC5mbGFnczsgLy8gVXBkYXRlIHRoZSByZXR1cm4gcG9pbnRlciBzbyB0aGUgdHJlZSBpcyBjb25zaXN0ZW50LiBUaGlzIGlzIGEgY29kZVxuICAgICAgICAvLyBzbWVsbCBiZWNhdXNlIGl0IGFzc3VtZXMgdGhlIGNvbW1pdCBwaGFzZSBpcyBuZXZlciBjb25jdXJyZW50IHdpdGhcbiAgICAgICAgLy8gdGhlIHJlbmRlciBwaGFzZS4gV2lsbCBhZGRyZXNzIGR1cmluZyByZWZhY3RvciB0byBhbHRlcm5hdGUgbW9kZWwuXG5cbiAgICAgICAgX2NoaWxkLnJldHVybiA9IGNvbXBsZXRlZFdvcms7XG4gICAgICAgIF9jaGlsZCA9IF9jaGlsZC5zaWJsaW5nO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbXBsZXRlZFdvcmsuc3VidHJlZUZsYWdzIHw9IHN1YnRyZWVGbGFncztcbiAgfSBlbHNlIHtcbiAgICAvLyBCdWJibGUgdXAgdGhlIGVhcmxpZXN0IGV4cGlyYXRpb24gdGltZS5cbiAgICBpZiAoIChjb21wbGV0ZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgLy8gSW4gcHJvZmlsaW5nIG1vZGUsIHJlc2V0Q2hpbGRFeHBpcmF0aW9uVGltZSBpcyBhbHNvIHVzZWQgdG8gcmVzZXRcbiAgICAgIC8vIHByb2ZpbGVyIGR1cmF0aW9ucy5cbiAgICAgIHZhciBfdHJlZUJhc2VEdXJhdGlvbiA9IGNvbXBsZXRlZFdvcmsuc2VsZkJhc2VEdXJhdGlvbjtcbiAgICAgIHZhciBfY2hpbGQyID0gY29tcGxldGVkV29yay5jaGlsZDtcblxuICAgICAgd2hpbGUgKF9jaGlsZDIgIT09IG51bGwpIHtcbiAgICAgICAgbmV3Q2hpbGRMYW5lcyA9IG1lcmdlTGFuZXMobmV3Q2hpbGRMYW5lcywgbWVyZ2VMYW5lcyhfY2hpbGQyLmxhbmVzLCBfY2hpbGQyLmNoaWxkTGFuZXMpKTsgLy8gXCJTdGF0aWNcIiBmbGFncyBzaGFyZSB0aGUgbGlmZXRpbWUgb2YgdGhlIGZpYmVyL2hvb2sgdGhleSBiZWxvbmcgdG8sXG4gICAgICAgIC8vIHNvIHdlIHNob3VsZCBidWJibGUgdGhvc2UgdXAgZXZlbiBkdXJpbmcgYSBiYWlsb3V0LiBBbGwgdGhlIG90aGVyXG4gICAgICAgIC8vIGZsYWdzIGhhdmUgYSBsaWZldGltZSBvbmx5IG9mIGEgc2luZ2xlIHJlbmRlciArIGNvbW1pdCwgc28gd2Ugc2hvdWxkXG4gICAgICAgIC8vIGlnbm9yZSB0aGVtLlxuXG4gICAgICAgIHN1YnRyZWVGbGFncyB8PSBfY2hpbGQyLnN1YnRyZWVGbGFncyAmIFN0YXRpY01hc2s7XG4gICAgICAgIHN1YnRyZWVGbGFncyB8PSBfY2hpbGQyLmZsYWdzICYgU3RhdGljTWFzaztcbiAgICAgICAgX3RyZWVCYXNlRHVyYXRpb24gKz0gX2NoaWxkMi50cmVlQmFzZUR1cmF0aW9uO1xuICAgICAgICBfY2hpbGQyID0gX2NoaWxkMi5zaWJsaW5nO1xuICAgICAgfVxuXG4gICAgICBjb21wbGV0ZWRXb3JrLnRyZWVCYXNlRHVyYXRpb24gPSBfdHJlZUJhc2VEdXJhdGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIF9jaGlsZDMgPSBjb21wbGV0ZWRXb3JrLmNoaWxkO1xuXG4gICAgICB3aGlsZSAoX2NoaWxkMyAhPT0gbnVsbCkge1xuICAgICAgICBuZXdDaGlsZExhbmVzID0gbWVyZ2VMYW5lcyhuZXdDaGlsZExhbmVzLCBtZXJnZUxhbmVzKF9jaGlsZDMubGFuZXMsIF9jaGlsZDMuY2hpbGRMYW5lcykpOyAvLyBcIlN0YXRpY1wiIGZsYWdzIHNoYXJlIHRoZSBsaWZldGltZSBvZiB0aGUgZmliZXIvaG9vayB0aGV5IGJlbG9uZyB0byxcbiAgICAgICAgLy8gc28gd2Ugc2hvdWxkIGJ1YmJsZSB0aG9zZSB1cCBldmVuIGR1cmluZyBhIGJhaWxvdXQuIEFsbCB0aGUgb3RoZXJcbiAgICAgICAgLy8gZmxhZ3MgaGF2ZSBhIGxpZmV0aW1lIG9ubHkgb2YgYSBzaW5nbGUgcmVuZGVyICsgY29tbWl0LCBzbyB3ZSBzaG91bGRcbiAgICAgICAgLy8gaWdub3JlIHRoZW0uXG5cbiAgICAgICAgc3VidHJlZUZsYWdzIHw9IF9jaGlsZDMuc3VidHJlZUZsYWdzICYgU3RhdGljTWFzaztcbiAgICAgICAgc3VidHJlZUZsYWdzIHw9IF9jaGlsZDMuZmxhZ3MgJiBTdGF0aWNNYXNrOyAvLyBVcGRhdGUgdGhlIHJldHVybiBwb2ludGVyIHNvIHRoZSB0cmVlIGlzIGNvbnNpc3RlbnQuIFRoaXMgaXMgYSBjb2RlXG4gICAgICAgIC8vIHNtZWxsIGJlY2F1c2UgaXQgYXNzdW1lcyB0aGUgY29tbWl0IHBoYXNlIGlzIG5ldmVyIGNvbmN1cnJlbnQgd2l0aFxuICAgICAgICAvLyB0aGUgcmVuZGVyIHBoYXNlLiBXaWxsIGFkZHJlc3MgZHVyaW5nIHJlZmFjdG9yIHRvIGFsdGVybmF0ZSBtb2RlbC5cblxuICAgICAgICBfY2hpbGQzLnJldHVybiA9IGNvbXBsZXRlZFdvcms7XG4gICAgICAgIF9jaGlsZDMgPSBfY2hpbGQzLnNpYmxpbmc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29tcGxldGVkV29yay5zdWJ0cmVlRmxhZ3MgfD0gc3VidHJlZUZsYWdzO1xuICB9XG5cbiAgY29tcGxldGVkV29yay5jaGlsZExhbmVzID0gbmV3Q2hpbGRMYW5lcztcbiAgcmV0dXJuIGRpZEJhaWxvdXQ7XG59XG5cbmZ1bmN0aW9uIGNvbXBsZXRlRGVoeWRyYXRlZFN1c3BlbnNlQm91bmRhcnkoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRTdGF0ZSkge1xuICBpZiAoaGFzVW5oeWRyYXRlZFRhaWxOb2RlcygpICYmICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGUgJiYgKHdvcmtJblByb2dyZXNzLmZsYWdzICYgRGlkQ2FwdHVyZSkgPT09IE5vRmxhZ3MpIHtcbiAgICB3YXJuSWZVbmh5ZHJhdGVkVGFpbE5vZGVzKHdvcmtJblByb2dyZXNzKTtcbiAgICByZXNldEh5ZHJhdGlvblN0YXRlKCk7XG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRm9yY2VDbGllbnRSZW5kZXIgfCBJbmNvbXBsZXRlIHwgU2hvdWxkQ2FwdHVyZTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgd2FzSHlkcmF0ZWQgPSBwb3BIeWRyYXRpb25TdGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgaWYgKG5leHRTdGF0ZSAhPT0gbnVsbCAmJiBuZXh0U3RhdGUuZGVoeWRyYXRlZCAhPT0gbnVsbCkge1xuICAgIC8vIFdlIG1pZ2h0IGJlIGluc2lkZSBhIGh5ZHJhdGlvbiBzdGF0ZSB0aGUgZmlyc3QgdGltZSB3ZSdyZSBwaWNraW5nIHVwIHRoaXNcbiAgICAvLyBTdXNwZW5zZSBib3VuZGFyeSwgYW5kIGFsc28gYWZ0ZXIgd2UndmUgcmVlbnRlcmVkIGl0IGZvciBmdXJ0aGVyIGh5ZHJhdGlvbi5cbiAgICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgICAgaWYgKCF3YXNIeWRyYXRlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0EgZGVoeWRyYXRlZCBzdXNwZW5zZSBjb21wb25lbnQgd2FzIGNvbXBsZXRlZCB3aXRob3V0IGEgaHlkcmF0ZWQgbm9kZS4gJyArICdUaGlzIGlzIHByb2JhYmx5IGEgYnVnIGluIFJlYWN0LicpO1xuICAgICAgfVxuXG4gICAgICBwcmVwYXJlVG9IeWRyYXRlSG9zdFN1c3BlbnNlSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgICAgIHtcbiAgICAgICAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgICB2YXIgaXNUaW1lZE91dFN1c3BlbnNlID0gbmV4dFN0YXRlICE9PSBudWxsO1xuXG4gICAgICAgICAgaWYgKGlzVGltZWRPdXRTdXNwZW5zZSkge1xuICAgICAgICAgICAgLy8gRG9uJ3QgY291bnQgdGltZSBzcGVudCBpbiBhIHRpbWVkIG91dCBTdXNwZW5zZSBzdWJ0cmVlIGFzIHBhcnQgb2YgdGhlIGJhc2UgZHVyYXRpb24uXG4gICAgICAgICAgICB2YXIgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcblxuICAgICAgICAgICAgaWYgKHByaW1hcnlDaGlsZEZyYWdtZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIC8vICRGbG93Rml4TWUgRmxvdyBkb2Vzbid0IHN1cHBvcnQgdHlwZSBjYXN0aW5nIGluIGNvbWJpbmF0aW9uIHdpdGggdGhlIC09IG9wZXJhdG9yXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnRyZWVCYXNlRHVyYXRpb24gLT0gcHJpbWFyeUNoaWxkRnJhZ21lbnQudHJlZUJhc2VEdXJhdGlvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBXZSBtaWdodCBoYXZlIHJlZW50ZXJlZCB0aGlzIGJvdW5kYXJ5IHRvIGh5ZHJhdGUgaXQuIElmIHNvLCB3ZSBuZWVkIHRvIHJlc2V0IHRoZSBoeWRyYXRpb25cbiAgICAgIC8vIHN0YXRlIHNpbmNlIHdlJ3JlIG5vdyBleGl0aW5nIG91dCBvZiBpdC4gcG9wSHlkcmF0aW9uU3RhdGUgZG9lc24ndCBkbyB0aGF0IGZvciB1cy5cbiAgICAgIHJlc2V0SHlkcmF0aW9uU3RhdGUoKTtcblxuICAgICAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIERpZENhcHR1cmUpID09PSBOb0ZsYWdzKSB7XG4gICAgICAgIC8vIFRoaXMgYm91bmRhcnkgZGlkIG5vdCBzdXNwZW5kIHNvIGl0J3Mgbm93IGh5ZHJhdGVkIGFuZCB1bnN1c3BlbmRlZC5cbiAgICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gICAgICB9IC8vIElmIG5vdGhpbmcgc3VzcGVuZGVkLCB3ZSBuZWVkIHRvIHNjaGVkdWxlIGFuIGVmZmVjdCB0byBtYXJrIHRoaXMgYm91bmRhcnlcbiAgICAgIC8vIGFzIGhhdmluZyBoeWRyYXRlZCBzbyBldmVudHMga25vdyB0aGF0IHRoZXkncmUgZnJlZSB0byBiZSBpbnZva2VkLlxuICAgICAgLy8gSXQncyBhbHNvIGEgc2lnbmFsIHRvIHJlcGxheSBldmVudHMgYW5kIHRoZSBzdXNwZW5zZSBjYWxsYmFjay5cbiAgICAgIC8vIElmIHNvbWV0aGluZyBzdXNwZW5kZWQsIHNjaGVkdWxlIGFuIGVmZmVjdCB0byBhdHRhY2ggcmV0cnkgbGlzdGVuZXJzLlxuICAgICAgLy8gU28gd2UgbWlnaHQgYXMgd2VsbCBhbHdheXMgbWFyayB0aGlzLlxuXG5cbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFVwZGF0ZTtcbiAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuXG4gICAgICB7XG4gICAgICAgIGlmICgod29ya0luUHJvZ3Jlc3MubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAgICAgdmFyIF9pc1RpbWVkT3V0U3VzcGVuc2UgPSBuZXh0U3RhdGUgIT09IG51bGw7XG5cbiAgICAgICAgICBpZiAoX2lzVGltZWRPdXRTdXNwZW5zZSkge1xuICAgICAgICAgICAgLy8gRG9uJ3QgY291bnQgdGltZSBzcGVudCBpbiBhIHRpbWVkIG91dCBTdXNwZW5zZSBzdWJ0cmVlIGFzIHBhcnQgb2YgdGhlIGJhc2UgZHVyYXRpb24uXG4gICAgICAgICAgICB2YXIgX3ByaW1hcnlDaGlsZEZyYWdtZW50ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG5cbiAgICAgICAgICAgIGlmIChfcHJpbWFyeUNoaWxkRnJhZ21lbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgLy8gJEZsb3dGaXhNZSBGbG93IGRvZXNuJ3Qgc3VwcG9ydCB0eXBlIGNhc3RpbmcgaW4gY29tYmluYXRpb24gd2l0aCB0aGUgLT0gb3BlcmF0b3JcbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MudHJlZUJhc2VEdXJhdGlvbiAtPSBfcHJpbWFyeUNoaWxkRnJhZ21lbnQudHJlZUJhc2VEdXJhdGlvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBTdWNjZXNzZnVsbHkgY29tcGxldGVkIHRoaXMgdHJlZS4gSWYgdGhpcyB3YXMgYSBmb3JjZWQgY2xpZW50IHJlbmRlcixcbiAgICAvLyB0aGVyZSBtYXkgaGF2ZSBiZWVuIHJlY292ZXJhYmxlIGVycm9ycyBkdXJpbmcgZmlyc3QgaHlkcmF0aW9uXG4gICAgLy8gYXR0ZW1wdC4gSWYgc28sIGFkZCB0aGVtIHRvIGEgcXVldWUgc28gd2UgY2FuIGxvZyB0aGVtIGluIHRoZVxuICAgIC8vIGNvbW1pdCBwaGFzZS5cbiAgICB1cGdyYWRlSHlkcmF0aW9uRXJyb3JzVG9SZWNvdmVyYWJsZSgpOyAvLyBGYWxsIHRocm91Z2ggdG8gbm9ybWFsIFN1c3BlbnNlIHBhdGhcblxuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbXBsZXRlV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIG5ld1Byb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzOyAvLyBOb3RlOiBUaGlzIGludGVudGlvbmFsbHkgZG9lc24ndCBjaGVjayBpZiB3ZSdyZSBoeWRyYXRpbmcgYmVjYXVzZSBjb21wYXJpbmdcbiAgLy8gdG8gdGhlIGN1cnJlbnQgdHJlZSBwcm92aWRlciBmaWJlciBpcyBqdXN0IGFzIGZhc3QgYW5kIGxlc3MgZXJyb3ItcHJvbmUuXG4gIC8vIElkZWFsbHkgd2Ugd291bGQgaGF2ZSBhIHNwZWNpYWwgdmVyc2lvbiBvZiB0aGUgd29yayBsb29wIG9ubHlcbiAgLy8gZm9yIGh5ZHJhdGlvbi5cblxuICBwb3BUcmVlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgc3dpdGNoICh3b3JrSW5Qcm9ncmVzcy50YWcpIHtcbiAgICBjYXNlIEluZGV0ZXJtaW5hdGVDb21wb25lbnQ6XG4gICAgY2FzZSBMYXp5Q29tcG9uZW50OlxuICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICBjYXNlIEZyYWdtZW50OlxuICAgIGNhc2UgTW9kZTpcbiAgICBjYXNlIFByb2ZpbGVyOlxuICAgIGNhc2UgQ29udGV4dENvbnN1bWVyOlxuICAgIGNhc2UgTWVtb0NvbXBvbmVudDpcbiAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgQ29tcG9uZW50ID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcblxuICAgICAgICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkge1xuICAgICAgICAgIHBvcENvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgIHtcbiAgICAgICAgdmFyIGZpYmVyUm9vdCA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgICAgICAgcG9wSG9zdENvbnRhaW5lcih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHBvcFRvcExldmVsQ29udGV4dE9iamVjdCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHJlc2V0V29ya0luUHJvZ3Jlc3NWZXJzaW9ucygpO1xuXG4gICAgICAgIGlmIChmaWJlclJvb3QucGVuZGluZ0NvbnRleHQpIHtcbiAgICAgICAgICBmaWJlclJvb3QuY29udGV4dCA9IGZpYmVyUm9vdC5wZW5kaW5nQ29udGV4dDtcbiAgICAgICAgICBmaWJlclJvb3QucGVuZGluZ0NvbnRleHQgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGN1cnJlbnQgPT09IG51bGwgfHwgY3VycmVudC5jaGlsZCA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIElmIHdlIGh5ZHJhdGVkLCBwb3Agc28gdGhhdCB3ZSBjYW4gZGVsZXRlIGFueSByZW1haW5pbmcgY2hpbGRyZW5cbiAgICAgICAgICAvLyB0aGF0IHdlcmVuJ3QgaHlkcmF0ZWQuXG4gICAgICAgICAgdmFyIHdhc0h5ZHJhdGVkID0gcG9wSHlkcmF0aW9uU3RhdGUod29ya0luUHJvZ3Jlc3MpO1xuXG4gICAgICAgICAgaWYgKHdhc0h5ZHJhdGVkKSB7XG4gICAgICAgICAgICAvLyBJZiB3ZSBoeWRyYXRlZCwgdGhlbiB3ZSdsbCBuZWVkIHRvIHNjaGVkdWxlIGFuIHVwZGF0ZSBmb3JcbiAgICAgICAgICAgIC8vIHRoZSBjb21taXQgc2lkZS1lZmZlY3RzIG9uIHRoZSByb290LlxuICAgICAgICAgICAgbWFya1VwZGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIHZhciBwcmV2U3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG5cbiAgICAgICAgICAgICAgaWYgKCAvLyBDaGVjayBpZiB0aGlzIGlzIGEgY2xpZW50IHJvb3RcbiAgICAgICAgICAgICAgIXByZXZTdGF0ZS5pc0RlaHlkcmF0ZWQgfHwgLy8gQ2hlY2sgaWYgd2UgcmV2ZXJ0ZWQgdG8gY2xpZW50IHJlbmRlcmluZyAoZS5nLiBkdWUgdG8gYW4gZXJyb3IpXG4gICAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIEZvcmNlQ2xpZW50UmVuZGVyKSAhPT0gTm9GbGFncykge1xuICAgICAgICAgICAgICAgIC8vIFNjaGVkdWxlIGFuIGVmZmVjdCB0byBjbGVhciB0aGlzIGNvbnRhaW5lciBhdCB0aGUgc3RhcnQgb2YgdGhlXG4gICAgICAgICAgICAgICAgLy8gbmV4dCBjb21taXQuIFRoaXMgaGFuZGxlcyB0aGUgY2FzZSBvZiBSZWFjdCByZW5kZXJpbmcgaW50byBhXG4gICAgICAgICAgICAgICAgLy8gY29udGFpbmVyIHdpdGggcHJldmlvdXMgY2hpbGRyZW4uIEl0J3MgYWxzbyBzYWZlIHRvIGRvIGZvclxuICAgICAgICAgICAgICAgIC8vIHVwZGF0ZXMgdG9vLCBiZWNhdXNlIGN1cnJlbnQuY2hpbGQgd291bGQgb25seSBiZSBudWxsIGlmIHRoZVxuICAgICAgICAgICAgICAgIC8vIHByZXZpb3VzIHJlbmRlciB3YXMgbnVsbCAoc28gdGhlIGNvbnRhaW5lciB3b3VsZCBhbHJlYWR5XG4gICAgICAgICAgICAgICAgLy8gYmUgZW1wdHkpLlxuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFNuYXBzaG90OyAvLyBJZiB0aGlzIHdhcyBhIGZvcmNlZCBjbGllbnQgcmVuZGVyLCB0aGVyZSBtYXkgaGF2ZSBiZWVuXG4gICAgICAgICAgICAgICAgLy8gcmVjb3ZlcmFibGUgZXJyb3JzIGR1cmluZyBmaXJzdCBoeWRyYXRpb24gYXR0ZW1wdC4gSWYgc28sIGFkZFxuICAgICAgICAgICAgICAgIC8vIHRoZW0gdG8gYSBxdWV1ZSBzbyB3ZSBjYW4gbG9nIHRoZW0gaW4gdGhlIGNvbW1pdCBwaGFzZS5cblxuICAgICAgICAgICAgICAgIHVwZ3JhZGVIeWRyYXRpb25FcnJvcnNUb1JlY292ZXJhYmxlKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB1cGRhdGVIb3N0Q29udGFpbmVyKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHBvcEhvc3RDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgdmFyIHJvb3RDb250YWluZXJJbnN0YW5jZSA9IGdldFJvb3RIb3N0Q29udGFpbmVyKCk7XG4gICAgICAgIHZhciB0eXBlID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcblxuICAgICAgICBpZiAoY3VycmVudCAhPT0gbnVsbCAmJiB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgIT0gbnVsbCkge1xuICAgICAgICAgIHVwZGF0ZUhvc3RDb21wb25lbnQkMShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgdHlwZSwgbmV3UHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSk7XG5cbiAgICAgICAgICBpZiAoY3VycmVudC5yZWYgIT09IHdvcmtJblByb2dyZXNzLnJlZikge1xuICAgICAgICAgICAgbWFya1JlZiQxKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKCFuZXdQcm9wcykge1xuICAgICAgICAgICAgaWYgKHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dlIG11c3QgaGF2ZSBuZXcgcHJvcHMgZm9yIG5ldyBtb3VudHMuIFRoaXMgZXJyb3IgaXMgbGlrZWx5ICcgKyAnY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICAgICAgICAgIH0gLy8gVGhpcyBjYW4gaGFwcGVuIHdoZW4gd2UgYWJvcnQgd29yay5cblxuXG4gICAgICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBjdXJyZW50SG9zdENvbnRleHQgPSBnZXRIb3N0Q29udGV4dCgpOyAvLyBUT0RPOiBNb3ZlIGNyZWF0ZUluc3RhbmNlIHRvIGJlZ2luV29yayBhbmQga2VlcCBpdCBvbiBhIGNvbnRleHRcbiAgICAgICAgICAvLyBcInN0YWNrXCIgYXMgdGhlIHBhcmVudC4gVGhlbiBhcHBlbmQgY2hpbGRyZW4gYXMgd2UgZ28gaW4gYmVnaW5Xb3JrXG4gICAgICAgICAgLy8gb3IgY29tcGxldGVXb3JrIGRlcGVuZGluZyBvbiB3aGV0aGVyIHdlIHdhbnQgdG8gYWRkIHRoZW0gdG9wLT5kb3duIG9yXG4gICAgICAgICAgLy8gYm90dG9tLT51cC4gVG9wLT5kb3duIGlzIGZhc3RlciBpbiBJRTExLlxuXG4gICAgICAgICAgdmFyIF93YXNIeWRyYXRlZCA9IHBvcEh5ZHJhdGlvblN0YXRlKHdvcmtJblByb2dyZXNzKTtcblxuICAgICAgICAgIGlmIChfd2FzSHlkcmF0ZWQpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IE1vdmUgdGhpcyBhbmQgY3JlYXRlSW5zdGFuY2Ugc3RlcCBpbnRvIHRoZSBiZWdpblBoYXNlXG4gICAgICAgICAgICAvLyB0byBjb25zb2xpZGF0ZS5cbiAgICAgICAgICAgIGlmIChwcmVwYXJlVG9IeWRyYXRlSG9zdEluc3RhbmNlKHdvcmtJblByb2dyZXNzLCByb290Q29udGFpbmVySW5zdGFuY2UsIGN1cnJlbnRIb3N0Q29udGV4dCkpIHtcbiAgICAgICAgICAgICAgLy8gSWYgY2hhbmdlcyB0byB0aGUgaHlkcmF0ZWQgbm9kZSBuZWVkIHRvIGJlIGFwcGxpZWQgYXQgdGhlXG4gICAgICAgICAgICAgIC8vIGNvbW1pdC1waGFzZSB3ZSBtYXJrIHRoaXMgYXMgc3VjaC5cbiAgICAgICAgICAgICAgbWFya1VwZGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBpbnN0YW5jZSA9IGNyZWF0ZUluc3RhbmNlKHR5cGUsIG5ld1Byb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UsIGN1cnJlbnRIb3N0Q29udGV4dCwgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgICAgYXBwZW5kQWxsQ2hpbGRyZW4oaW5zdGFuY2UsIHdvcmtJblByb2dyZXNzLCBmYWxzZSwgZmFsc2UpO1xuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlID0gaW5zdGFuY2U7IC8vIENlcnRhaW4gcmVuZGVyZXJzIHJlcXVpcmUgY29tbWl0LXRpbWUgZWZmZWN0cyBmb3IgaW5pdGlhbCBtb3VudC5cbiAgICAgICAgICAgIC8vIChlZyBET00gcmVuZGVyZXIgc3VwcG9ydHMgYXV0by1mb2N1cyBmb3IgY2VydGFpbiBlbGVtZW50cykuXG4gICAgICAgICAgICAvLyBNYWtlIHN1cmUgc3VjaCByZW5kZXJlcnMgZ2V0IHNjaGVkdWxlZCBmb3IgbGF0ZXIgd29yay5cblxuICAgICAgICAgICAgaWYgKGZpbmFsaXplSW5pdGlhbENoaWxkcmVuKGluc3RhbmNlLCB0eXBlLCBuZXdQcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlLCBjdXJyZW50SG9zdENvbnRleHQpKSB7XG4gICAgICAgICAgICAgIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5yZWYgIT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGEgcmVmIG9uIGEgaG9zdCBub2RlIHdlIG5lZWQgdG8gc2NoZWR1bGUgYSBjYWxsYmFja1xuICAgICAgICAgICAgbWFya1JlZiQxKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RUZXh0OlxuICAgICAge1xuICAgICAgICB2YXIgbmV3VGV4dCA9IG5ld1Byb3BzO1xuXG4gICAgICAgIGlmIChjdXJyZW50ICYmIHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSAhPSBudWxsKSB7XG4gICAgICAgICAgdmFyIG9sZFRleHQgPSBjdXJyZW50Lm1lbW9pemVkUHJvcHM7IC8vIElmIHdlIGhhdmUgYW4gYWx0ZXJuYXRlLCB0aGF0IG1lYW5zIHRoaXMgaXMgYW4gdXBkYXRlIGFuZCB3ZSBuZWVkXG4gICAgICAgICAgLy8gdG8gc2NoZWR1bGUgYSBzaWRlLWVmZmVjdCB0byBkbyB0aGUgdXBkYXRlcy5cblxuICAgICAgICAgIHVwZGF0ZUhvc3RUZXh0JDEoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG9sZFRleHQsIG5ld1RleHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICh0eXBlb2YgbmV3VGV4dCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXZSBtdXN0IGhhdmUgbmV3IHByb3BzIGZvciBuZXcgbW91bnRzLiBUaGlzIGVycm9yIGlzIGxpa2VseSAnICsgJ2NhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgICAgICAgICB9IC8vIFRoaXMgY2FuIGhhcHBlbiB3aGVuIHdlIGFib3J0IHdvcmsuXG5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgX3Jvb3RDb250YWluZXJJbnN0YW5jZSA9IGdldFJvb3RIb3N0Q29udGFpbmVyKCk7XG5cbiAgICAgICAgICB2YXIgX2N1cnJlbnRIb3N0Q29udGV4dCA9IGdldEhvc3RDb250ZXh0KCk7XG5cbiAgICAgICAgICB2YXIgX3dhc0h5ZHJhdGVkMiA9IHBvcEh5ZHJhdGlvblN0YXRlKHdvcmtJblByb2dyZXNzKTtcblxuICAgICAgICAgIGlmIChfd2FzSHlkcmF0ZWQyKSB7XG4gICAgICAgICAgICBpZiAocHJlcGFyZVRvSHlkcmF0ZUhvc3RUZXh0SW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MpKSB7XG4gICAgICAgICAgICAgIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgPSBjcmVhdGVUZXh0SW5zdGFuY2UobmV3VGV4dCwgX3Jvb3RDb250YWluZXJJbnN0YW5jZSwgX2N1cnJlbnRIb3N0Q29udGV4dCwgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHBvcFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHZhciBuZXh0U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlOyAvLyBTcGVjaWFsIHBhdGggZm9yIGRlaHlkcmF0ZWQgYm91bmRhcmllcy4gV2UgbWF5IGV2ZW50dWFsbHkgbW92ZSB0aGlzXG4gICAgICAgIC8vIHRvIGl0cyBvd24gZmliZXIgdHlwZSBzbyB0aGF0IHdlIGNhbiBhZGQgb3RoZXIga2luZHMgb2YgaHlkcmF0aW9uXG4gICAgICAgIC8vIGJvdW5kYXJpZXMgdGhhdCBhcmVuJ3QgYXNzb2NpYXRlZCB3aXRoIGEgU3VzcGVuc2UgdHJlZS4gSW4gYW50aWNpcGF0aW9uXG4gICAgICAgIC8vIG9mIHN1Y2ggYSByZWZhY3RvciwgYWxsIHRoZSBoeWRyYXRpb24gbG9naWMgaXMgY29udGFpbmVkIGluXG4gICAgICAgIC8vIHRoaXMgYnJhbmNoLlxuXG4gICAgICAgIGlmIChjdXJyZW50ID09PSBudWxsIHx8IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbCAmJiBjdXJyZW50Lm1lbW9pemVkU3RhdGUuZGVoeWRyYXRlZCAhPT0gbnVsbCkge1xuICAgICAgICAgIHZhciBmYWxsdGhyb3VnaFRvTm9ybWFsU3VzcGVuc2VQYXRoID0gY29tcGxldGVEZWh5ZHJhdGVkU3VzcGVuc2VCb3VuZGFyeShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dFN0YXRlKTtcblxuICAgICAgICAgIGlmICghZmFsbHRocm91Z2hUb05vcm1hbFN1c3BlbnNlUGF0aCkge1xuICAgICAgICAgICAgaWYgKHdvcmtJblByb2dyZXNzLmZsYWdzICYgU2hvdWxkQ2FwdHVyZSkge1xuICAgICAgICAgICAgICAvLyBTcGVjaWFsIGNhc2UuIFRoZXJlIHdlcmUgcmVtYWluaW5nIHVuaHlkcmF0ZWQgbm9kZXMuIFdlIHRyZWF0XG4gICAgICAgICAgICAgIC8vIHRoaXMgYXMgYSBtaXNtYXRjaC4gUmV2ZXJ0IHRvIGNsaWVudCByZW5kZXJpbmcuXG4gICAgICAgICAgICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzcztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIERpZCBub3QgZmluaXNoIGh5ZHJhdGluZywgZWl0aGVyIGJlY2F1c2UgdGhpcyBpcyB0aGUgaW5pdGlhbFxuICAgICAgICAgICAgICAvLyByZW5kZXIgb3IgYmVjYXVzZSBzb21ldGhpbmcgc3VzcGVuZGVkLlxuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IC8vIENvbnRpbnVlIHdpdGggdGhlIG5vcm1hbCBTdXNwZW5zZSBwYXRoLlxuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoKHdvcmtJblByb2dyZXNzLmZsYWdzICYgRGlkQ2FwdHVyZSkgIT09IE5vRmxhZ3MpIHtcbiAgICAgICAgICAvLyBTb21ldGhpbmcgc3VzcGVuZGVkLiBSZS1yZW5kZXIgd2l0aCB0aGUgZmFsbGJhY2sgY2hpbGRyZW4uXG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSByZW5kZXJMYW5lczsgLy8gRG8gbm90IHJlc2V0IHRoZSBlZmZlY3QgbGlzdC5cblxuICAgICAgICAgIGlmICggKHdvcmtJblByb2dyZXNzLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgICAgICAgdHJhbnNmZXJBY3R1YWxEdXJhdGlvbih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgfSAvLyBEb24ndCBidWJibGUgcHJvcGVydGllcyBpbiB0aGlzIGNhc2UuXG5cblxuICAgICAgICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzcztcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBuZXh0RGlkVGltZW91dCA9IG5leHRTdGF0ZSAhPT0gbnVsbDtcbiAgICAgICAgdmFyIHByZXZEaWRUaW1lb3V0ID0gY3VycmVudCAhPT0gbnVsbCAmJiBjdXJyZW50Lm1lbW9pemVkU3RhdGUgIT09IG51bGw7XG4gICAgICAgIC8vIGEgcGFzc2l2ZSBlZmZlY3QsIHdoaWNoIGlzIHdoZW4gd2UgcHJvY2VzcyB0aGUgdHJhbnNpdGlvbnNcblxuXG4gICAgICAgIGlmIChuZXh0RGlkVGltZW91dCAhPT0gcHJldkRpZFRpbWVvdXQpIHtcbiAgICAgICAgICAvLyBhbiBlZmZlY3QgdG8gdG9nZ2xlIHRoZSBzdWJ0cmVlJ3MgdmlzaWJpbGl0eS4gV2hlbiB3ZSBzd2l0Y2ggZnJvbVxuICAgICAgICAgIC8vIGZhbGxiYWNrIC0+IHByaW1hcnksIHRoZSBpbm5lciBPZmZzY3JlZW4gZmliZXIgc2NoZWR1bGVzIHRoaXMgZWZmZWN0XG4gICAgICAgICAgLy8gYXMgcGFydCBvZiBpdHMgbm9ybWFsIGNvbXBsZXRlIHBoYXNlLiBCdXQgd2hlbiB3ZSBzd2l0Y2ggZnJvbVxuICAgICAgICAgIC8vIHByaW1hcnkgLT4gZmFsbGJhY2ssIHRoZSBpbm5lciBPZmZzY3JlZW4gZmliZXIgZG9lcyBub3QgaGF2ZSBhIGNvbXBsZXRlXG4gICAgICAgICAgLy8gcGhhc2UuIFNvIHdlIG5lZWQgdG8gc2NoZWR1bGUgaXRzIGVmZmVjdCBoZXJlLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gV2UgYWxzbyB1c2UgdGhpcyBmbGFnIHRvIGNvbm5lY3QvZGlzY29ubmVjdCB0aGUgZWZmZWN0cywgYnV0IHRoZSBzYW1lXG4gICAgICAgICAgLy8gbG9naWMgYXBwbGllczogd2hlbiByZS1jb25uZWN0aW5nLCB0aGUgT2Zmc2NyZWVuIGZpYmVyJ3MgY29tcGxldGVcbiAgICAgICAgICAvLyBwaGFzZSB3aWxsIGhhbmRsZSBzY2hlZHVsaW5nIHRoZSBlZmZlY3QuIEl0J3Mgb25seSB3aGVuIHRoZSBmYWxsYmFja1xuICAgICAgICAgIC8vIGlzIGFjdGl2ZSB0aGF0IHdlIGhhdmUgdG8gZG8gYW55dGhpbmcgc3BlY2lhbC5cblxuXG4gICAgICAgICAgaWYgKG5leHREaWRUaW1lb3V0KSB7XG4gICAgICAgICAgICB2YXIgX29mZnNjcmVlbkZpYmVyMiA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgICAgICAgX29mZnNjcmVlbkZpYmVyMi5mbGFncyB8PSBWaXNpYmlsaXR5OyAvLyBUT0RPOiBUaGlzIHdpbGwgc3RpbGwgc3VzcGVuZCBhIHN5bmNocm9ub3VzIHRyZWUgaWYgYW55dGhpbmdcbiAgICAgICAgICAgIC8vIGluIHRoZSBjb25jdXJyZW50IHRyZWUgYWxyZWFkeSBzdXNwZW5kZWQgZHVyaW5nIHRoaXMgcmVuZGVyLlxuICAgICAgICAgICAgLy8gVGhpcyBpcyBhIGtub3duIGJ1Zy5cblxuICAgICAgICAgICAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgICAgICAgLy8gVE9ETzogTW92ZSB0aGlzIGJhY2sgdG8gdGhyb3dFeGNlcHRpb24gYmVjYXVzZSB0aGlzIGlzIHRvbyBsYXRlXG4gICAgICAgICAgICAgIC8vIGlmIHRoaXMgaXMgYSBsYXJnZSB0cmVlIHdoaWNoIGlzIGNvbW1vbiBmb3IgaW5pdGlhbCBsb2Fkcy4gV2VcbiAgICAgICAgICAgICAgLy8gZG9uJ3Qga25vdyBpZiB3ZSBzaG91bGQgcmVzdGFydCBhIHJlbmRlciBvciBub3QgdW50aWwgd2UgZ2V0XG4gICAgICAgICAgICAgIC8vIHRoaXMgbWFya2VyLCBhbmQgdGhpcyBpcyB0b28gbGF0ZS5cbiAgICAgICAgICAgICAgLy8gSWYgdGhpcyByZW5kZXIgYWxyZWFkeSBoYWQgYSBwaW5nIG9yIGxvd2VyIHByaSB1cGRhdGVzLFxuICAgICAgICAgICAgICAvLyBhbmQgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSBrbm93IHdlJ3JlIGdvaW5nIHRvIHN1c3BlbmQgd2VcbiAgICAgICAgICAgICAgLy8gc2hvdWxkIGJlIGFibGUgdG8gaW1tZWRpYXRlbHkgcmVzdGFydCBmcm9tIHdpdGhpbiB0aHJvd0V4Y2VwdGlvbi5cbiAgICAgICAgICAgICAgdmFyIGhhc0ludmlzaWJsZUNoaWxkQ29udGV4dCA9IGN1cnJlbnQgPT09IG51bGwgJiYgKHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHMudW5zdGFibGVfYXZvaWRUaGlzRmFsbGJhY2sgIT09IHRydWUgfHwgIWVuYWJsZVN1c3BlbnNlQXZvaWRUaGlzRmFsbGJhY2spO1xuXG4gICAgICAgICAgICAgIGlmIChoYXNJbnZpc2libGVDaGlsZENvbnRleHQgfHwgaGFzU3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlU3RhY2tDdXJzb3IuY3VycmVudCwgSW52aXNpYmxlUGFyZW50U3VzcGVuc2VDb250ZXh0KSkge1xuICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgd2FzIGluIGFuIGludmlzaWJsZSB0cmVlIG9yIGEgbmV3IHJlbmRlciwgdGhlbiBzaG93aW5nXG4gICAgICAgICAgICAgICAgLy8gdGhpcyBib3VuZGFyeSBpcyBvay5cbiAgICAgICAgICAgICAgICByZW5kZXJEaWRTdXNwZW5kKCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCB3ZSdyZSBnb2luZyB0byBoYXZlIHRvIGhpZGUgY29udGVudCBzbyB3ZSBzaG91bGRcbiAgICAgICAgICAgICAgICAvLyBzdXNwZW5kIGZvciBsb25nZXIgaWYgcG9zc2libGUuXG4gICAgICAgICAgICAgICAgcmVuZGVyRGlkU3VzcGVuZERlbGF5SWZQb3NzaWJsZSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHdha2VhYmxlcyA9IHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlO1xuXG4gICAgICAgIGlmICh3YWtlYWJsZXMgIT09IG51bGwpIHtcbiAgICAgICAgICAvLyBTY2hlZHVsZSBhbiBlZmZlY3QgdG8gYXR0YWNoIGEgcmV0cnkgbGlzdGVuZXIgdG8gdGhlIHByb21pc2UuXG4gICAgICAgICAgLy8gVE9ETzogTW92ZSB0byBwYXNzaXZlIHBoYXNlXG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlO1xuICAgICAgICB9XG5cbiAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgICAgICAge1xuICAgICAgICAgIGlmICgod29ya0luUHJvZ3Jlc3MubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAgICAgICBpZiAobmV4dERpZFRpbWVvdXQpIHtcbiAgICAgICAgICAgICAgLy8gRG9uJ3QgY291bnQgdGltZSBzcGVudCBpbiBhIHRpbWVkIG91dCBTdXNwZW5zZSBzdWJ0cmVlIGFzIHBhcnQgb2YgdGhlIGJhc2UgZHVyYXRpb24uXG4gICAgICAgICAgICAgIHZhciBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuXG4gICAgICAgICAgICAgIGlmIChwcmltYXJ5Q2hpbGRGcmFnbWVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vICRGbG93Rml4TWUgRmxvdyBkb2Vzbid0IHN1cHBvcnQgdHlwZSBjYXN0aW5nIGluIGNvbWJpbmF0aW9uIHdpdGggdGhlIC09IG9wZXJhdG9yXG4gICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MudHJlZUJhc2VEdXJhdGlvbiAtPSBwcmltYXJ5Q2hpbGRGcmFnbWVudC50cmVlQmFzZUR1cmF0aW9uO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICBwb3BIb3N0Q29udGFpbmVyKHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHVwZGF0ZUhvc3RDb250YWluZXIoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuXG4gICAgICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgICAgICBwcmVwYXJlUG9ydGFsTW91bnQod29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pO1xuICAgICAgfVxuXG4gICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHJldHVybiBudWxsO1xuXG4gICAgY2FzZSBDb250ZXh0UHJvdmlkZXI6XG4gICAgICAvLyBQb3AgcHJvdmlkZXIgZmliZXJcbiAgICAgIHZhciBjb250ZXh0ID0gd29ya0luUHJvZ3Jlc3MudHlwZS5fY29udGV4dDtcbiAgICAgIHBvcFByb3ZpZGVyKGNvbnRleHQsIHdvcmtJblByb2dyZXNzKTtcbiAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICBjYXNlIEluY29tcGxldGVDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgLy8gU2FtZSBhcyBjbGFzcyBjb21wb25lbnQgY2FzZS4gSSBwdXQgaXQgZG93biBoZXJlIHNvIHRoYXQgdGhlIHRhZ3MgYXJlXG4gICAgICAgIC8vIHNlcXVlbnRpYWwgdG8gZW5zdXJlIHRoaXMgc3dpdGNoIGlzIGNvbXBpbGVkIHRvIGEganVtcCB0YWJsZS5cbiAgICAgICAgdmFyIF9Db21wb25lbnQgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuXG4gICAgICAgIGlmIChpc0NvbnRleHRQcm92aWRlcihfQ29tcG9uZW50KSkge1xuICAgICAgICAgIHBvcENvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHBvcFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHZhciByZW5kZXJTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgICAgICAgaWYgKHJlbmRlclN0YXRlID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gV2UncmUgcnVubmluZyBpbiB0aGUgZGVmYXVsdCwgXCJpbmRlcGVuZGVudFwiIG1vZGUuXG4gICAgICAgICAgLy8gV2UgZG9uJ3QgZG8gYW55dGhpbmcgaW4gdGhpcyBtb2RlLlxuICAgICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGRpZFN1c3BlbmRBbHJlYWR5ID0gKHdvcmtJblByb2dyZXNzLmZsYWdzICYgRGlkQ2FwdHVyZSkgIT09IE5vRmxhZ3M7XG4gICAgICAgIHZhciByZW5kZXJlZFRhaWwgPSByZW5kZXJTdGF0ZS5yZW5kZXJpbmc7XG5cbiAgICAgICAgaWYgKHJlbmRlcmVkVGFpbCA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIFdlIGp1c3QgcmVuZGVyZWQgdGhlIGhlYWQuXG4gICAgICAgICAgaWYgKCFkaWRTdXNwZW5kQWxyZWFkeSkge1xuICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgcGFzcy4gV2UgbmVlZCB0byBmaWd1cmUgb3V0IGlmIGFueXRoaW5nIGlzIHN0aWxsXG4gICAgICAgICAgICAvLyBzdXNwZW5kZWQgaW4gdGhlIHJlbmRlcmVkIHNldC5cbiAgICAgICAgICAgIC8vIElmIG5ldyBjb250ZW50IHVuc3VzcGVuZGVkLCBidXQgdGhlcmUncyBzdGlsbCBzb21lIGNvbnRlbnQgdGhhdFxuICAgICAgICAgICAgLy8gZGlkbid0LiBUaGVuIHdlIG5lZWQgdG8gZG8gYSBzZWNvbmQgcGFzcyB0aGF0IGZvcmNlcyBldmVyeXRoaW5nXG4gICAgICAgICAgICAvLyB0byBrZWVwIHNob3dpbmcgdGhlaXIgZmFsbGJhY2tzLlxuICAgICAgICAgICAgLy8gV2UgbWlnaHQgYmUgc3VzcGVuZGVkIGlmIHNvbWV0aGluZyBpbiB0aGlzIHJlbmRlciBwYXNzIHN1c3BlbmRlZCwgb3JcbiAgICAgICAgICAgIC8vIHNvbWV0aGluZyBpbiB0aGUgcHJldmlvdXMgY29tbWl0dGVkIHBhc3Mgc3VzcGVuZGVkLiBPdGhlcndpc2UsXG4gICAgICAgICAgICAvLyB0aGVyZSdzIG5vIGNoYW5jZSBzbyB3ZSBjYW4gc2tpcCB0aGUgZXhwZW5zaXZlIGNhbGwgdG9cbiAgICAgICAgICAgIC8vIGZpbmRGaXJzdFN1c3BlbmRlZC5cbiAgICAgICAgICAgIHZhciBjYW5ub3RCZVN1c3BlbmRlZCA9IHJlbmRlckhhc05vdFN1c3BlbmRlZFlldCgpICYmIChjdXJyZW50ID09PSBudWxsIHx8IChjdXJyZW50LmZsYWdzICYgRGlkQ2FwdHVyZSkgPT09IE5vRmxhZ3MpO1xuXG4gICAgICAgICAgICBpZiAoIWNhbm5vdEJlU3VzcGVuZGVkKSB7XG4gICAgICAgICAgICAgIHZhciByb3cgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcblxuICAgICAgICAgICAgICB3aGlsZSAocm93ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdmFyIHN1c3BlbmRlZCA9IGZpbmRGaXJzdFN1c3BlbmRlZChyb3cpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHN1c3BlbmRlZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgZGlkU3VzcGVuZEFscmVhZHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgICAgICAgICAgICAgICAgIGN1dE9mZlRhaWxJZk5lZWRlZChyZW5kZXJTdGF0ZSwgZmFsc2UpOyAvLyBJZiB0aGlzIGlzIGEgbmV3bHkgc3VzcGVuZGVkIHRyZWUsIGl0IG1pZ2h0IG5vdCBnZXQgY29tbWl0dGVkIGFzXG4gICAgICAgICAgICAgICAgICAvLyBwYXJ0IG9mIHRoZSBzZWNvbmQgcGFzcy4gSW4gdGhhdCBjYXNlIG5vdGhpbmcgd2lsbCBzdWJzY3JpYmUgdG9cbiAgICAgICAgICAgICAgICAgIC8vIGl0cyB0aGVuYWJsZXMuIEluc3RlYWQsIHdlJ2xsIHRyYW5zZmVyIGl0cyB0aGVuYWJsZXMgdG8gdGhlXG4gICAgICAgICAgICAgICAgICAvLyBTdXNwZW5zZUxpc3Qgc28gdGhhdCBpdCBjYW4gcmV0cnkgaWYgdGhleSByZXNvbHZlLlxuICAgICAgICAgICAgICAgICAgLy8gVGhlcmUgbWlnaHQgYmUgbXVsdGlwbGUgb2YgdGhlc2UgaW4gdGhlIGxpc3QgYnV0IHNpbmNlIHdlJ3JlXG4gICAgICAgICAgICAgICAgICAvLyBnb2luZyB0byB3YWl0IGZvciBhbGwgb2YgdGhlbSBhbnl3YXksIGl0IGRvZXNuJ3QgcmVhbGx5IG1hdHRlclxuICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggb25lcyBnZXRzIHRvIHBpbmcuIEluIHRoZW9yeSB3ZSBjb3VsZCBnZXQgY2xldmVyIGFuZCBrZWVwXG4gICAgICAgICAgICAgICAgICAvLyB0cmFjayBvZiBob3cgbWFueSBkZXBlbmRlbmNpZXMgcmVtYWluIGJ1dCBpdCBnZXRzIHRyaWNreSBiZWNhdXNlXG4gICAgICAgICAgICAgICAgICAvLyBpbiB0aGUgbWVhbnRpbWUsIHdlIGNhbiBhZGQvcmVtb3ZlL2NoYW5nZSBpdGVtcyBhbmQgZGVwZW5kZW5jaWVzLlxuICAgICAgICAgICAgICAgICAgLy8gV2UgbWlnaHQgYmFpbCBvdXQgb2YgdGhlIGxvb3AgYmVmb3JlIGZpbmRpbmcgYW55IGJ1dCB0aGF0XG4gICAgICAgICAgICAgICAgICAvLyBkb2Vzbid0IG1hdHRlciBzaW5jZSB0aGF0IG1lYW5zIHRoYXQgdGhlIG90aGVyIGJvdW5kYXJpZXMgdGhhdFxuICAgICAgICAgICAgICAgICAgLy8gd2UgZGlkIGZpbmQgYWxyZWFkeSBoYXMgdGhlaXIgbGlzdGVuZXJzIGF0dGFjaGVkLlxuXG4gICAgICAgICAgICAgICAgICB2YXIgbmV3VGhlbmFibGVzID0gc3VzcGVuZGVkLnVwZGF0ZVF1ZXVlO1xuXG4gICAgICAgICAgICAgICAgICBpZiAobmV3VGhlbmFibGVzICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gbmV3VGhlbmFibGVzO1xuICAgICAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7XG4gICAgICAgICAgICAgICAgICB9IC8vIFJlcmVuZGVyIHRoZSB3aG9sZSBsaXN0LCBidXQgdGhpcyB0aW1lLCB3ZSdsbCBmb3JjZSBmYWxsYmFja3NcbiAgICAgICAgICAgICAgICAgIC8vIHRvIHN0YXkgaW4gcGxhY2UuXG4gICAgICAgICAgICAgICAgICAvLyBSZXNldCB0aGUgZWZmZWN0IGZsYWdzIGJlZm9yZSBkb2luZyB0aGUgc2Vjb25kIHBhc3Mgc2luY2UgdGhhdCdzIG5vdyBpbnZhbGlkLlxuICAgICAgICAgICAgICAgICAgLy8gUmVzZXQgdGhlIGNoaWxkIGZpYmVycyB0byB0aGVpciBvcmlnaW5hbCBzdGF0ZS5cblxuXG4gICAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5zdWJ0cmVlRmxhZ3MgPSBOb0ZsYWdzO1xuICAgICAgICAgICAgICAgICAgcmVzZXRDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpOyAvLyBTZXQgdXAgdGhlIFN1c3BlbnNlIENvbnRleHQgdG8gZm9yY2Ugc3VzcGVuc2UgYW5kIGltbWVkaWF0ZWx5XG4gICAgICAgICAgICAgICAgICAvLyByZXJlbmRlciB0aGUgY2hpbGRyZW4uXG5cbiAgICAgICAgICAgICAgICAgIHB1c2hTdXNwZW5zZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHNldFNoYWxsb3dTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50LCBGb3JjZVN1c3BlbnNlRmFsbGJhY2spKTsgLy8gRG9uJ3QgYnViYmxlIHByb3BlcnRpZXMgaW4gdGhpcyBjYXNlLlxuXG4gICAgICAgICAgICAgICAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcm93ID0gcm93LnNpYmxpbmc7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHJlbmRlclN0YXRlLnRhaWwgIT09IG51bGwgJiYgbm93KCkgPiBnZXRSZW5kZXJUYXJnZXRUaW1lKCkpIHtcbiAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBhbHJlYWR5IHBhc3NlZCBvdXIgQ1BVIGRlYWRsaW5lIGJ1dCB3ZSBzdGlsbCBoYXZlIHJvd3NcbiAgICAgICAgICAgICAgLy8gbGVmdCBpbiB0aGUgdGFpbC4gV2UnbGwganVzdCBnaXZlIHVwIGZ1cnRoZXIgYXR0ZW1wdHMgdG8gcmVuZGVyXG4gICAgICAgICAgICAgIC8vIHRoZSBtYWluIGNvbnRlbnQgYW5kIG9ubHkgcmVuZGVyIGZhbGxiYWNrcy5cbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgICAgICAgICAgICAgZGlkU3VzcGVuZEFscmVhZHkgPSB0cnVlO1xuICAgICAgICAgICAgICBjdXRPZmZUYWlsSWZOZWVkZWQocmVuZGVyU3RhdGUsIGZhbHNlKTsgLy8gU2luY2Ugbm90aGluZyBhY3R1YWxseSBzdXNwZW5kZWQsIHRoZXJlIHdpbGwgbm90aGluZyB0byBwaW5nIHRoaXNcbiAgICAgICAgICAgICAgLy8gdG8gZ2V0IGl0IHN0YXJ0ZWQgYmFjayB1cCB0byBhdHRlbXB0IHRoZSBuZXh0IGl0ZW0uIFdoaWxlIGluIHRlcm1zXG4gICAgICAgICAgICAgIC8vIG9mIHByaW9yaXR5IHRoaXMgd29yayBoYXMgdGhlIHNhbWUgcHJpb3JpdHkgYXMgdGhpcyBjdXJyZW50IHJlbmRlcixcbiAgICAgICAgICAgICAgLy8gaXQncyBub3QgcGFydCBvZiB0aGUgc2FtZSB0cmFuc2l0aW9uIG9uY2UgdGhlIHRyYW5zaXRpb24gaGFzXG4gICAgICAgICAgICAgIC8vIGNvbW1pdHRlZC4gSWYgaXQncyBzeW5jLCB3ZSBzdGlsbCB3YW50IHRvIHlpZWxkIHNvIHRoYXQgaXQgY2FuIGJlXG4gICAgICAgICAgICAgIC8vIHBhaW50ZWQuIENvbmNlcHR1YWxseSwgdGhpcyBpcyByZWFsbHkgdGhlIHNhbWUgYXMgcGluZ2luZy5cbiAgICAgICAgICAgICAgLy8gV2UgY2FuIHVzZSBhbnkgUmV0cnlMYW5lIGV2ZW4gaWYgaXQncyB0aGUgb25lIGN1cnJlbnRseSByZW5kZXJpbmdcbiAgICAgICAgICAgICAgLy8gc2luY2Ugd2UncmUgbGVhdmluZyBpdCBiZWhpbmQgb24gdGhpcyBub2RlLlxuXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gU29tZVJldHJ5TGFuZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY3V0T2ZmVGFpbElmTmVlZGVkKHJlbmRlclN0YXRlLCBmYWxzZSk7XG4gICAgICAgICAgfSAvLyBOZXh0IHdlJ3JlIGdvaW5nIHRvIHJlbmRlciB0aGUgdGFpbC5cblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEFwcGVuZCB0aGUgcmVuZGVyZWQgcm93IHRvIHRoZSBjaGlsZCBsaXN0LlxuICAgICAgICAgIGlmICghZGlkU3VzcGVuZEFscmVhZHkpIHtcbiAgICAgICAgICAgIHZhciBfc3VzcGVuZGVkID0gZmluZEZpcnN0U3VzcGVuZGVkKHJlbmRlcmVkVGFpbCk7XG5cbiAgICAgICAgICAgIGlmIChfc3VzcGVuZGVkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IERpZENhcHR1cmU7XG4gICAgICAgICAgICAgIGRpZFN1c3BlbmRBbHJlYWR5ID0gdHJ1ZTsgLy8gRW5zdXJlIHdlIHRyYW5zZmVyIHRoZSB1cGRhdGUgcXVldWUgdG8gdGhlIHBhcmVudCBzbyB0aGF0IGl0IGRvZXNuJ3RcbiAgICAgICAgICAgICAgLy8gZ2V0IGxvc3QgaWYgdGhpcyByb3cgZW5kcyB1cCBkcm9wcGVkIGR1cmluZyBhIHNlY29uZCBwYXNzLlxuXG4gICAgICAgICAgICAgIHZhciBfbmV3VGhlbmFibGVzID0gX3N1c3BlbmRlZC51cGRhdGVRdWV1ZTtcblxuICAgICAgICAgICAgICBpZiAoX25ld1RoZW5hYmxlcyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gX25ld1RoZW5hYmxlcztcbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBjdXRPZmZUYWlsSWZOZWVkZWQocmVuZGVyU3RhdGUsIHRydWUpOyAvLyBUaGlzIG1pZ2h0IGhhdmUgYmVlbiBtb2RpZmllZC5cblxuICAgICAgICAgICAgICBpZiAocmVuZGVyU3RhdGUudGFpbCA9PT0gbnVsbCAmJiByZW5kZXJTdGF0ZS50YWlsTW9kZSA9PT0gJ2hpZGRlbicgJiYgIXJlbmRlcmVkVGFpbC5hbHRlcm5hdGUgJiYgIWdldElzSHlkcmF0aW5nKCkgLy8gV2UgZG9uJ3QgY3V0IGl0IGlmIHdlJ3JlIGh5ZHJhdGluZy5cbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAvLyBXZSdyZSBkb25lLlxuICAgICAgICAgICAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCAvLyBUaGUgdGltZSBpdCB0b29rIHRvIHJlbmRlciBsYXN0IHJvdyBpcyBncmVhdGVyIHRoYW4gdGhlIHJlbWFpbmluZ1xuICAgICAgICAgICAgLy8gdGltZSB3ZSBoYXZlIHRvIHJlbmRlci4gU28gcmVuZGVyaW5nIG9uZSBtb3JlIHJvdyB3b3VsZCBsaWtlbHlcbiAgICAgICAgICAgIC8vIGV4Y2VlZCBpdC5cbiAgICAgICAgICAgIG5vdygpICogMiAtIHJlbmRlclN0YXRlLnJlbmRlcmluZ1N0YXJ0VGltZSA+IGdldFJlbmRlclRhcmdldFRpbWUoKSAmJiByZW5kZXJMYW5lcyAhPT0gT2Zmc2NyZWVuTGFuZSkge1xuICAgICAgICAgICAgICAvLyBXZSBoYXZlIG5vdyBwYXNzZWQgb3VyIENQVSBkZWFkbGluZSBhbmQgd2UnbGwganVzdCBnaXZlIHVwIGZ1cnRoZXJcbiAgICAgICAgICAgICAgLy8gYXR0ZW1wdHMgdG8gcmVuZGVyIHRoZSBtYWluIGNvbnRlbnQgYW5kIG9ubHkgcmVuZGVyIGZhbGxiYWNrcy5cbiAgICAgICAgICAgICAgLy8gVGhlIGFzc3VtcHRpb24gaXMgdGhhdCB0aGlzIGlzIHVzdWFsbHkgZmFzdGVyLlxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBEaWRDYXB0dXJlO1xuICAgICAgICAgICAgICBkaWRTdXNwZW5kQWxyZWFkeSA9IHRydWU7XG4gICAgICAgICAgICAgIGN1dE9mZlRhaWxJZk5lZWRlZChyZW5kZXJTdGF0ZSwgZmFsc2UpOyAvLyBTaW5jZSBub3RoaW5nIGFjdHVhbGx5IHN1c3BlbmRlZCwgdGhlcmUgd2lsbCBub3RoaW5nIHRvIHBpbmcgdGhpc1xuICAgICAgICAgICAgICAvLyB0byBnZXQgaXQgc3RhcnRlZCBiYWNrIHVwIHRvIGF0dGVtcHQgdGhlIG5leHQgaXRlbS4gV2hpbGUgaW4gdGVybXNcbiAgICAgICAgICAgICAgLy8gb2YgcHJpb3JpdHkgdGhpcyB3b3JrIGhhcyB0aGUgc2FtZSBwcmlvcml0eSBhcyB0aGlzIGN1cnJlbnQgcmVuZGVyLFxuICAgICAgICAgICAgICAvLyBpdCdzIG5vdCBwYXJ0IG9mIHRoZSBzYW1lIHRyYW5zaXRpb24gb25jZSB0aGUgdHJhbnNpdGlvbiBoYXNcbiAgICAgICAgICAgICAgLy8gY29tbWl0dGVkLiBJZiBpdCdzIHN5bmMsIHdlIHN0aWxsIHdhbnQgdG8geWllbGQgc28gdGhhdCBpdCBjYW4gYmVcbiAgICAgICAgICAgICAgLy8gcGFpbnRlZC4gQ29uY2VwdHVhbGx5LCB0aGlzIGlzIHJlYWxseSB0aGUgc2FtZSBhcyBwaW5naW5nLlxuICAgICAgICAgICAgICAvLyBXZSBjYW4gdXNlIGFueSBSZXRyeUxhbmUgZXZlbiBpZiBpdCdzIHRoZSBvbmUgY3VycmVudGx5IHJlbmRlcmluZ1xuICAgICAgICAgICAgICAvLyBzaW5jZSB3ZSdyZSBsZWF2aW5nIGl0IGJlaGluZCBvbiB0aGlzIG5vZGUuXG5cbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBTb21lUmV0cnlMYW5lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChyZW5kZXJTdGF0ZS5pc0JhY2t3YXJkcykge1xuICAgICAgICAgICAgLy8gVGhlIGVmZmVjdCBsaXN0IG9mIHRoZSBiYWNrd2FyZHMgdGFpbCB3aWxsIGhhdmUgYmVlbiBhZGRlZFxuICAgICAgICAgICAgLy8gdG8gdGhlIGVuZC4gVGhpcyBicmVha3MgdGhlIGd1YXJhbnRlZSB0aGF0IGxpZmUtY3ljbGVzIGZpcmUgaW5cbiAgICAgICAgICAgIC8vIHNpYmxpbmcgb3JkZXIgYnV0IHRoYXQgaXNuJ3QgYSBzdHJvbmcgZ3VhcmFudGVlIHByb21pc2VkIGJ5IFJlYWN0LlxuICAgICAgICAgICAgLy8gRXNwZWNpYWxseSBzaW5jZSB0aGVzZSBtaWdodCBhbHNvIGp1c3QgcG9wIGluIGR1cmluZyBmdXR1cmUgY29tbWl0cy5cbiAgICAgICAgICAgIC8vIEFwcGVuZCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0LlxuICAgICAgICAgICAgcmVuZGVyZWRUYWlsLnNpYmxpbmcgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcmVuZGVyZWRUYWlsO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgcHJldmlvdXNTaWJsaW5nID0gcmVuZGVyU3RhdGUubGFzdDtcblxuICAgICAgICAgICAgaWYgKHByZXZpb3VzU2libGluZyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICBwcmV2aW91c1NpYmxpbmcuc2libGluZyA9IHJlbmRlcmVkVGFpbDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcmVuZGVyZWRUYWlsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZW5kZXJTdGF0ZS5sYXN0ID0gcmVuZGVyZWRUYWlsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZW5kZXJTdGF0ZS50YWlsICE9PSBudWxsKSB7XG4gICAgICAgICAgLy8gV2Ugc3RpbGwgaGF2ZSB0YWlsIHJvd3MgdG8gcmVuZGVyLlxuICAgICAgICAgIC8vIFBvcCBhIHJvdy5cbiAgICAgICAgICB2YXIgbmV4dCA9IHJlbmRlclN0YXRlLnRhaWw7XG4gICAgICAgICAgcmVuZGVyU3RhdGUucmVuZGVyaW5nID0gbmV4dDtcbiAgICAgICAgICByZW5kZXJTdGF0ZS50YWlsID0gbmV4dC5zaWJsaW5nO1xuICAgICAgICAgIHJlbmRlclN0YXRlLnJlbmRlcmluZ1N0YXJ0VGltZSA9IG5vdygpO1xuICAgICAgICAgIG5leHQuc2libGluZyA9IG51bGw7IC8vIFJlc3RvcmUgdGhlIGNvbnRleHQuXG4gICAgICAgICAgLy8gVE9ETzogV2UgY2FuIHByb2JhYmx5IGp1c3QgYXZvaWQgcG9wcGluZyBpdCBpbnN0ZWFkIGFuZCBvbmx5XG4gICAgICAgICAgLy8gc2V0dGluZyBpdCB0aGUgZmlyc3QgdGltZSB3ZSBnbyBmcm9tIG5vdCBzdXNwZW5kZWQgdG8gc3VzcGVuZGVkLlxuXG4gICAgICAgICAgdmFyIHN1c3BlbnNlQ29udGV4dCA9IHN1c3BlbnNlU3RhY2tDdXJzb3IuY3VycmVudDtcblxuICAgICAgICAgIGlmIChkaWRTdXNwZW5kQWxyZWFkeSkge1xuICAgICAgICAgICAgc3VzcGVuc2VDb250ZXh0ID0gc2V0U2hhbGxvd1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZUNvbnRleHQsIEZvcmNlU3VzcGVuc2VGYWxsYmFjayk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN1c3BlbnNlQ29udGV4dCA9IHNldERlZmF1bHRTaGFsbG93U3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlQ29udGV4dCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcHVzaFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgc3VzcGVuc2VDb250ZXh0KTsgLy8gRG8gYSBwYXNzIG92ZXIgdGhlIG5leHQgcm93LlxuICAgICAgICAgIC8vIERvbid0IGJ1YmJsZSBwcm9wZXJ0aWVzIGluIHRoaXMgY2FzZS5cblxuICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICB9XG5cbiAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBTY29wZUNvbXBvbmVudDpcbiAgICAgIHtcblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgT2Zmc2NyZWVuQ29tcG9uZW50OlxuICAgIGNhc2UgTGVnYWN5SGlkZGVuQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBwb3BSZW5kZXJMYW5lcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHZhciBfbmV4dFN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgICAgICAgdmFyIG5leHRJc0hpZGRlbiA9IF9uZXh0U3RhdGUgIT09IG51bGw7XG5cbiAgICAgICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgICB2YXIgX3ByZXZTdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcbiAgICAgICAgICB2YXIgcHJldklzSGlkZGVuID0gX3ByZXZTdGF0ZSAhPT0gbnVsbDtcblxuICAgICAgICAgIGlmIChwcmV2SXNIaWRkZW4gIT09IG5leHRJc0hpZGRlbiAmJiAoIC8vIExlZ2FjeUhpZGRlbiBkb2Vzbid0IGRvIGFueSBoaWRpbmcgXHUyMDE0IGl0IG9ubHkgcHJlLXJlbmRlcnMuXG4gICAgICAgICAgIWVuYWJsZUxlZ2FjeUhpZGRlbiApKSB7XG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBWaXNpYmlsaXR5O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghbmV4dElzSGlkZGVuIHx8ICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb01vZGUpIHtcbiAgICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBEb24ndCBidWJibGUgcHJvcGVydGllcyBmb3IgaGlkZGVuIGNoaWxkcmVuIHVubGVzcyB3ZSdyZSByZW5kZXJpbmdcbiAgICAgICAgICAvLyBhdCBvZmZzY3JlZW4gcHJpb3JpdHkuXG4gICAgICAgICAgaWYgKGluY2x1ZGVzU29tZUxhbmUoc3VidHJlZVJlbmRlckxhbmVzLCBPZmZzY3JlZW5MYW5lKSkge1xuICAgICAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgICAgICAgICAgIGlmIChzdXBwb3J0c011dGF0aW9uKSB7XG4gICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZXJlIHdhcyBhbiBpbnNlcnRpb24gb3IgdXBkYXRlIGluIHRoZSBoaWRkZW4gc3VidHJlZS5cbiAgICAgICAgICAgICAgLy8gSWYgc28sIHdlIG5lZWQgdG8gaGlkZSB0aG9zZSBub2RlcyBpbiB0aGUgY29tbWl0IHBoYXNlLCBzb1xuICAgICAgICAgICAgICAvLyBzY2hlZHVsZSBhIHZpc2liaWxpdHkgZWZmZWN0LlxuICAgICAgICAgICAgICBpZiAoIHdvcmtJblByb2dyZXNzLnN1YnRyZWVGbGFncyAmIChQbGFjZW1lbnQgfCBVcGRhdGUpKSB7XG4gICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVmlzaWJpbGl0eTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIGNhc2UgQ2FjaGVDb21wb25lbnQ6XG4gICAgICB7XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIFRyYWNpbmdNYXJrZXJDb21wb25lbnQ6XG4gICAgICB7XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIHVuaXQgb2Ygd29yayB0YWcgKFwiICsgd29ya0luUHJvZ3Jlc3MudGFnICsgXCIpLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gXCIgKyAnUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xufVxuXG5mdW5jdGlvbiB1bndpbmRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICAvLyBOb3RlOiBUaGlzIGludGVudGlvbmFsbHkgZG9lc24ndCBjaGVjayBpZiB3ZSdyZSBoeWRyYXRpbmcgYmVjYXVzZSBjb21wYXJpbmdcbiAgLy8gdG8gdGhlIGN1cnJlbnQgdHJlZSBwcm92aWRlciBmaWJlciBpcyBqdXN0IGFzIGZhc3QgYW5kIGxlc3MgZXJyb3ItcHJvbmUuXG4gIC8vIElkZWFsbHkgd2Ugd291bGQgaGF2ZSBhIHNwZWNpYWwgdmVyc2lvbiBvZiB0aGUgd29yayBsb29wIG9ubHlcbiAgLy8gZm9yIGh5ZHJhdGlvbi5cbiAgcG9wVHJlZUNvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuXG4gIHN3aXRjaCAod29ya0luUHJvZ3Jlc3MudGFnKSB7XG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIENvbXBvbmVudCA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG5cbiAgICAgICAgaWYgKGlzQ29udGV4dFByb3ZpZGVyKENvbXBvbmVudCkpIHtcbiAgICAgICAgICBwb3BDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBmbGFncyA9IHdvcmtJblByb2dyZXNzLmZsYWdzO1xuXG4gICAgICAgIGlmIChmbGFncyAmIFNob3VsZENhcHR1cmUpIHtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyA9IGZsYWdzICYgflNob3VsZENhcHR1cmUgfCBEaWRDYXB0dXJlO1xuXG4gICAgICAgICAgaWYgKCAod29ya0luUHJvZ3Jlc3MubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAgICAgICB0cmFuc2ZlckFjdHVhbER1cmF0aW9uKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3M7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICB7XG4gICAgICAgIHZhciByb290ID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICAgICAgICBwb3BIb3N0Q29udGFpbmVyKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgcG9wVG9wTGV2ZWxDb250ZXh0T2JqZWN0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgcmVzZXRXb3JrSW5Qcm9ncmVzc1ZlcnNpb25zKCk7XG4gICAgICAgIHZhciBfZmxhZ3MgPSB3b3JrSW5Qcm9ncmVzcy5mbGFncztcblxuICAgICAgICBpZiAoKF9mbGFncyAmIFNob3VsZENhcHR1cmUpICE9PSBOb0ZsYWdzICYmIChfZmxhZ3MgJiBEaWRDYXB0dXJlKSA9PT0gTm9GbGFncykge1xuICAgICAgICAgIC8vIFRoZXJlIHdhcyBhbiBlcnJvciBkdXJpbmcgcmVuZGVyIHRoYXQgd2Fzbid0IGNhcHR1cmVkIGJ5IGEgc3VzcGVuc2VcbiAgICAgICAgICAvLyBib3VuZGFyeS4gRG8gYSBzZWNvbmQgcGFzcyBvbiB0aGUgcm9vdCB0byB1bm1vdW50IHRoZSBjaGlsZHJlbi5cbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyA9IF9mbGFncyAmIH5TaG91bGRDYXB0dXJlIHwgRGlkQ2FwdHVyZTtcbiAgICAgICAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3M7XG4gICAgICAgIH0gLy8gV2UgdW53b3VuZCB0byB0aGUgcm9vdCB3aXRob3V0IGNvbXBsZXRpbmcgaXQuIEV4aXQuXG5cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgLy8gVE9ETzogcG9wSHlkcmF0aW9uU3RhdGVcbiAgICAgICAgcG9wSG9zdENvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHBvcFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHZhciBzdXNwZW5zZVN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcblxuICAgICAgICBpZiAoc3VzcGVuc2VTdGF0ZSAhPT0gbnVsbCAmJiBzdXNwZW5zZVN0YXRlLmRlaHlkcmF0ZWQgIT09IG51bGwpIHtcbiAgICAgICAgICBpZiAod29ya0luUHJvZ3Jlc3MuYWx0ZXJuYXRlID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RocmV3IGluIG5ld2x5IG1vdW50ZWQgZGVoeWRyYXRlZCBjb21wb25lbnQuIFRoaXMgaXMgbGlrZWx5IGEgYnVnIGluICcgKyAnUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlc2V0SHlkcmF0aW9uU3RhdGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBfZmxhZ3MyID0gd29ya0luUHJvZ3Jlc3MuZmxhZ3M7XG5cbiAgICAgICAgaWYgKF9mbGFnczIgJiBTaG91bGRDYXB0dXJlKSB7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgPSBfZmxhZ3MyICYgflNob3VsZENhcHR1cmUgfCBEaWRDYXB0dXJlOyAvLyBDYXB0dXJlZCBhIHN1c3BlbnNlIGVmZmVjdC4gUmUtcmVuZGVyIHRoZSBib3VuZGFyeS5cblxuICAgICAgICAgIGlmICggKHdvcmtJblByb2dyZXNzLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgICAgICAgdHJhbnNmZXJBY3R1YWxEdXJhdGlvbih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHdvcmtJblByb2dyZXNzO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIFN1c3BlbnNlTGlzdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcG9wU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzKTsgLy8gU3VzcGVuc2VMaXN0IGRvZXNuJ3QgYWN0dWFsbHkgY2F0Y2ggYW55dGhpbmcuIEl0IHNob3VsZCd2ZSBiZWVuXG4gICAgICAgIC8vIGNhdWdodCBieSBhIG5lc3RlZCBib3VuZGFyeS4gSWYgbm90LCBpdCBzaG91bGQgYnViYmxlIHRocm91Z2guXG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICBwb3BIb3N0Q29udGFpbmVyKHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHJldHVybiBudWxsO1xuXG4gICAgY2FzZSBDb250ZXh0UHJvdmlkZXI6XG4gICAgICB2YXIgY29udGV4dCA9IHdvcmtJblByb2dyZXNzLnR5cGUuX2NvbnRleHQ7XG4gICAgICBwb3BQcm92aWRlcihjb250ZXh0LCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICByZXR1cm4gbnVsbDtcblxuICAgIGNhc2UgT2Zmc2NyZWVuQ29tcG9uZW50OlxuICAgIGNhc2UgTGVnYWN5SGlkZGVuQ29tcG9uZW50OlxuICAgICAgcG9wUmVuZGVyTGFuZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICBjYXNlIENhY2hlQ29tcG9uZW50OlxuXG4gICAgICByZXR1cm4gbnVsbDtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5mdW5jdGlvbiB1bndpbmRJbnRlcnJ1cHRlZFdvcmsoY3VycmVudCwgaW50ZXJydXB0ZWRXb3JrLCByZW5kZXJMYW5lcykge1xuICAvLyBOb3RlOiBUaGlzIGludGVudGlvbmFsbHkgZG9lc24ndCBjaGVjayBpZiB3ZSdyZSBoeWRyYXRpbmcgYmVjYXVzZSBjb21wYXJpbmdcbiAgLy8gdG8gdGhlIGN1cnJlbnQgdHJlZSBwcm92aWRlciBmaWJlciBpcyBqdXN0IGFzIGZhc3QgYW5kIGxlc3MgZXJyb3ItcHJvbmUuXG4gIC8vIElkZWFsbHkgd2Ugd291bGQgaGF2ZSBhIHNwZWNpYWwgdmVyc2lvbiBvZiB0aGUgd29yayBsb29wIG9ubHlcbiAgLy8gZm9yIGh5ZHJhdGlvbi5cbiAgcG9wVHJlZUNvbnRleHQoaW50ZXJydXB0ZWRXb3JrKTtcblxuICBzd2l0Y2ggKGludGVycnVwdGVkV29yay50YWcpIHtcbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgY2hpbGRDb250ZXh0VHlwZXMgPSBpbnRlcnJ1cHRlZFdvcmsudHlwZS5jaGlsZENvbnRleHRUeXBlcztcblxuICAgICAgICBpZiAoY2hpbGRDb250ZXh0VHlwZXMgIT09IG51bGwgJiYgY2hpbGRDb250ZXh0VHlwZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHBvcENvbnRleHQoaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgIHtcbiAgICAgICAgdmFyIHJvb3QgPSBpbnRlcnJ1cHRlZFdvcmsuc3RhdGVOb2RlO1xuICAgICAgICBwb3BIb3N0Q29udGFpbmVyKGludGVycnVwdGVkV29yayk7XG4gICAgICAgIHBvcFRvcExldmVsQ29udGV4dE9iamVjdChpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgICByZXNldFdvcmtJblByb2dyZXNzVmVyc2lvbnMoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHBvcEhvc3RDb250ZXh0KGludGVycnVwdGVkV29yayk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAgcG9wSG9zdENvbnRhaW5lcihpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAgcG9wU3VzcGVuc2VDb250ZXh0KGludGVycnVwdGVkV29yayk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgU3VzcGVuc2VMaXN0Q29tcG9uZW50OlxuICAgICAgcG9wU3VzcGVuc2VDb250ZXh0KGludGVycnVwdGVkV29yayk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgQ29udGV4dFByb3ZpZGVyOlxuICAgICAgdmFyIGNvbnRleHQgPSBpbnRlcnJ1cHRlZFdvcmsudHlwZS5fY29udGV4dDtcbiAgICAgIHBvcFByb3ZpZGVyKGNvbnRleHQsIGludGVycnVwdGVkV29yayk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgT2Zmc2NyZWVuQ29tcG9uZW50OlxuICAgIGNhc2UgTGVnYWN5SGlkZGVuQ29tcG9uZW50OlxuICAgICAgcG9wUmVuZGVyTGFuZXMoaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgIGJyZWFrO1xuICB9XG59XG5cbmZ1bmN0aW9uIGludm9rZUd1YXJkZWRDYWxsYmFja1Byb2QobmFtZSwgZnVuYywgY29udGV4dCwgYSwgYiwgYywgZCwgZSwgZikge1xuICB2YXIgZnVuY0FyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDMpO1xuXG4gIHRyeSB7XG4gICAgZnVuYy5hcHBseShjb250ZXh0LCBmdW5jQXJncyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdGhpcy5vbkVycm9yKGVycm9yKTtcbiAgfVxufVxuXG52YXIgaW52b2tlR3VhcmRlZENhbGxiYWNrSW1wbCA9IGludm9rZUd1YXJkZWRDYWxsYmFja1Byb2Q7XG5cbntcbiAgLy8gSW4gREVWIG1vZGUsIHdlIHN3YXAgb3V0IGludm9rZUd1YXJkZWRDYWxsYmFjayBmb3IgYSBzcGVjaWFsIHZlcnNpb25cbiAgLy8gdGhhdCBwbGF5cyBtb3JlIG5pY2VseSB3aXRoIHRoZSBicm93c2VyJ3MgRGV2VG9vbHMuIFRoZSBpZGVhIGlzIHRvIHByZXNlcnZlXG4gIC8vIFwiUGF1c2Ugb24gZXhjZXB0aW9uc1wiIGJlaGF2aW9yLiBCZWNhdXNlIFJlYWN0IHdyYXBzIGFsbCB1c2VyLXByb3ZpZGVkXG4gIC8vIGZ1bmN0aW9ucyBpbiBpbnZva2VHdWFyZGVkQ2FsbGJhY2ssIGFuZCB0aGUgcHJvZHVjdGlvbiB2ZXJzaW9uIG9mXG4gIC8vIGludm9rZUd1YXJkZWRDYWxsYmFjayB1c2VzIGEgdHJ5LWNhdGNoLCBhbGwgdXNlciBleGNlcHRpb25zIGFyZSB0cmVhdGVkXG4gIC8vIGxpa2UgY2F1Z2h0IGV4Y2VwdGlvbnMsIGFuZCB0aGUgRGV2VG9vbHMgd29uJ3QgcGF1c2UgdW5sZXNzIHRoZSBkZXZlbG9wZXJcbiAgLy8gdGFrZXMgdGhlIGV4dHJhIHN0ZXAgb2YgZW5hYmxpbmcgcGF1c2Ugb24gY2F1Z2h0IGV4Y2VwdGlvbnMuIFRoaXMgaXNcbiAgLy8gdW5pbnR1aXRpdmUsIHRob3VnaCwgYmVjYXVzZSBldmVuIHRob3VnaCBSZWFjdCBoYXMgY2F1Z2h0IHRoZSBlcnJvciwgZnJvbVxuICAvLyB0aGUgZGV2ZWxvcGVyJ3MgcGVyc3BlY3RpdmUsIHRoZSBlcnJvciBpcyB1bmNhdWdodC5cbiAgLy9cbiAgLy8gVG8gcHJlc2VydmUgdGhlIGV4cGVjdGVkIFwiUGF1c2Ugb24gZXhjZXB0aW9uc1wiIGJlaGF2aW9yLCB3ZSBkb24ndCB1c2UgYVxuICAvLyB0cnktY2F0Y2ggaW4gREVWLiBJbnN0ZWFkLCB3ZSBzeW5jaHJvbm91c2x5IGRpc3BhdGNoIGEgZmFrZSBldmVudCB0byBhIGZha2VcbiAgLy8gRE9NIG5vZGUsIGFuZCBjYWxsIHRoZSB1c2VyLXByb3ZpZGVkIGNhbGxiYWNrIGZyb20gaW5zaWRlIGFuIGV2ZW50IGhhbmRsZXJcbiAgLy8gZm9yIHRoYXQgZmFrZSBldmVudC4gSWYgdGhlIGNhbGxiYWNrIHRocm93cywgdGhlIGVycm9yIGlzIFwiY2FwdHVyZWRcIiB1c2luZ1xuICAvLyBhIGdsb2JhbCBldmVudCBoYW5kbGVyLiBCdXQgYmVjYXVzZSB0aGUgZXJyb3IgaGFwcGVucyBpbiBhIGRpZmZlcmVudFxuICAvLyBldmVudCBsb29wIGNvbnRleHQsIGl0IGRvZXMgbm90IGludGVycnVwdCB0aGUgbm9ybWFsIHByb2dyYW0gZmxvdy5cbiAgLy8gRWZmZWN0aXZlbHksIHRoaXMgZ2l2ZXMgdXMgdHJ5LWNhdGNoIGJlaGF2aW9yIHdpdGhvdXQgYWN0dWFsbHkgdXNpbmdcbiAgLy8gdHJ5LWNhdGNoLiBOZWF0IVxuICAvLyBDaGVjayB0aGF0IHRoZSBicm93c2VyIHN1cHBvcnRzIHRoZSBBUElzIHdlIG5lZWQgdG8gaW1wbGVtZW50IG91ciBzcGVjaWFsXG4gIC8vIERFViB2ZXJzaW9uIG9mIGludm9rZUd1YXJkZWRDYWxsYmFja1xuICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHdpbmRvdy5kaXNwYXRjaEV2ZW50ID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGRvY3VtZW50LmNyZWF0ZUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdmFyIGZha2VOb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncmVhY3QnKTtcblxuICAgIGludm9rZUd1YXJkZWRDYWxsYmFja0ltcGwgPSBmdW5jdGlvbiBpbnZva2VHdWFyZGVkQ2FsbGJhY2tEZXYobmFtZSwgZnVuYywgY29udGV4dCwgYSwgYiwgYywgZCwgZSwgZikge1xuICAgICAgLy8gSWYgZG9jdW1lbnQgZG9lc24ndCBleGlzdCB3ZSBrbm93IGZvciBzdXJlIHdlIHdpbGwgY3Jhc2ggaW4gdGhpcyBtZXRob2RcbiAgICAgIC8vIHdoZW4gd2UgY2FsbCBkb2N1bWVudC5jcmVhdGVFdmVudCgpLiBIb3dldmVyIHRoaXMgY2FuIGNhdXNlIGNvbmZ1c2luZ1xuICAgICAgLy8gZXJyb3JzOiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svY3JlYXRlLXJlYWN0LWFwcC9pc3N1ZXMvMzQ4MlxuICAgICAgLy8gU28gd2UgcHJlZW1wdGl2ZWx5IHRocm93IHdpdGggYSBiZXR0ZXIgbWVzc2FnZSBpbnN0ZWFkLlxuICAgICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcgfHwgZG9jdW1lbnQgPT09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgYGRvY3VtZW50YCBnbG9iYWwgd2FzIGRlZmluZWQgd2hlbiBSZWFjdCB3YXMgaW5pdGlhbGl6ZWQsIGJ1dCBpcyBub3QgJyArICdkZWZpbmVkIGFueW1vcmUuIFRoaXMgY2FuIGhhcHBlbiBpbiBhIHRlc3QgZW52aXJvbm1lbnQgaWYgYSBjb21wb25lbnQgJyArICdzY2hlZHVsZXMgYW4gdXBkYXRlIGZyb20gYW4gYXN5bmNocm9ub3VzIGNhbGxiYWNrLCBidXQgdGhlIHRlc3QgaGFzIGFscmVhZHkgJyArICdmaW5pc2hlZCBydW5uaW5nLiBUbyBzb2x2ZSB0aGlzLCB5b3UgY2FuIGVpdGhlciB1bm1vdW50IHRoZSBjb21wb25lbnQgYXQgJyArICd0aGUgZW5kIG9mIHlvdXIgdGVzdCAoYW5kIGVuc3VyZSB0aGF0IGFueSBhc3luY2hyb25vdXMgb3BlcmF0aW9ucyBnZXQgJyArICdjYW5jZWxlZCBpbiBgY29tcG9uZW50V2lsbFVubW91bnRgKSwgb3IgeW91IGNhbiBjaGFuZ2UgdGhlIHRlc3QgaXRzZWxmICcgKyAndG8gYmUgYXN5bmNocm9ub3VzLicpO1xuICAgICAgfVxuXG4gICAgICB2YXIgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7XG4gICAgICB2YXIgZGlkQ2FsbCA9IGZhbHNlOyAvLyBLZWVwcyB0cmFjayBvZiB3aGV0aGVyIHRoZSB1c2VyLXByb3ZpZGVkIGNhbGxiYWNrIHRocmV3IGFuIGVycm9yLiBXZVxuICAgICAgLy8gc2V0IHRoaXMgdG8gdHJ1ZSBhdCB0aGUgYmVnaW5uaW5nLCB0aGVuIHNldCBpdCB0byBmYWxzZSByaWdodCBhZnRlclxuICAgICAgLy8gY2FsbGluZyB0aGUgZnVuY3Rpb24uIElmIHRoZSBmdW5jdGlvbiBlcnJvcnMsIGBkaWRFcnJvcmAgd2lsbCBuZXZlciBiZVxuICAgICAgLy8gc2V0IHRvIGZhbHNlLiBUaGlzIHN0cmF0ZWd5IHdvcmtzIGV2ZW4gaWYgdGhlIGJyb3dzZXIgaXMgZmxha3kgYW5kXG4gICAgICAvLyBmYWlscyB0byBjYWxsIG91ciBnbG9iYWwgZXJyb3IgaGFuZGxlciwgYmVjYXVzZSBpdCBkb2Vzbid0IHJlbHkgb25cbiAgICAgIC8vIHRoZSBlcnJvciBldmVudCBhdCBhbGwuXG5cbiAgICAgIHZhciBkaWRFcnJvciA9IHRydWU7IC8vIEtlZXBzIHRyYWNrIG9mIHRoZSB2YWx1ZSBvZiB3aW5kb3cuZXZlbnQgc28gdGhhdCB3ZSBjYW4gcmVzZXQgaXRcbiAgICAgIC8vIGR1cmluZyB0aGUgY2FsbGJhY2sgdG8gbGV0IHVzZXIgY29kZSBhY2Nlc3Mgd2luZG93LmV2ZW50IGluIHRoZVxuICAgICAgLy8gYnJvd3NlcnMgdGhhdCBzdXBwb3J0IGl0LlxuXG4gICAgICB2YXIgd2luZG93RXZlbnQgPSB3aW5kb3cuZXZlbnQ7IC8vIEtlZXBzIHRyYWNrIG9mIHRoZSBkZXNjcmlwdG9yIG9mIHdpbmRvdy5ldmVudCB0byByZXN0b3JlIGl0IGFmdGVyIGV2ZW50XG4gICAgICAvLyBkaXNwYXRjaGluZzogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMzY4OFxuXG4gICAgICB2YXIgd2luZG93RXZlbnREZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3csICdldmVudCcpO1xuXG4gICAgICBmdW5jdGlvbiByZXN0b3JlQWZ0ZXJEaXNwYXRjaCgpIHtcbiAgICAgICAgLy8gV2UgaW1tZWRpYXRlbHkgcmVtb3ZlIHRoZSBjYWxsYmFjayBmcm9tIGV2ZW50IGxpc3RlbmVycyBzbyB0aGF0XG4gICAgICAgIC8vIG5lc3RlZCBgaW52b2tlR3VhcmRlZENhbGxiYWNrYCBjYWxscyBkbyBub3QgY2xhc2guIE90aGVyd2lzZSwgYVxuICAgICAgICAvLyBuZXN0ZWQgY2FsbCB3b3VsZCB0cmlnZ2VyIHRoZSBmYWtlIGV2ZW50IGhhbmRsZXJzIG9mIGFueSBjYWxsIGhpZ2hlclxuICAgICAgICAvLyBpbiB0aGUgc3RhY2suXG4gICAgICAgIGZha2VOb2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZ0VHlwZSwgY2FsbENhbGxiYWNrLCBmYWxzZSk7IC8vIFdlIGNoZWNrIGZvciB3aW5kb3cuaGFzT3duUHJvcGVydHkoJ2V2ZW50JykgdG8gcHJldmVudCB0aGVcbiAgICAgICAgLy8gd2luZG93LmV2ZW50IGFzc2lnbm1lbnQgaW4gYm90aCBJRSA8PSAxMCBhcyB0aGV5IHRocm93IGFuIGVycm9yXG4gICAgICAgIC8vIFwiTWVtYmVyIG5vdCBmb3VuZFwiIGluIHN0cmljdCBtb2RlLCBhbmQgaW4gRmlyZWZveCB3aGljaCBkb2VzIG5vdFxuICAgICAgICAvLyBzdXBwb3J0IHdpbmRvdy5ldmVudC5cblxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdy5ldmVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93Lmhhc093blByb3BlcnR5KCdldmVudCcpKSB7XG4gICAgICAgICAgd2luZG93LmV2ZW50ID0gd2luZG93RXZlbnQ7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gQ3JlYXRlIGFuIGV2ZW50IGhhbmRsZXIgZm9yIG91ciBmYWtlIGV2ZW50LiBXZSB3aWxsIHN5bmNocm9ub3VzbHlcbiAgICAgIC8vIGRpc3BhdGNoIG91ciBmYWtlIGV2ZW50IHVzaW5nIGBkaXNwYXRjaEV2ZW50YC4gSW5zaWRlIHRoZSBoYW5kbGVyLCB3ZVxuICAgICAgLy8gY2FsbCB0aGUgdXNlci1wcm92aWRlZCBjYWxsYmFjay5cblxuXG4gICAgICB2YXIgZnVuY0FyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDMpO1xuXG4gICAgICBmdW5jdGlvbiBjYWxsQ2FsbGJhY2soKSB7XG4gICAgICAgIGRpZENhbGwgPSB0cnVlO1xuICAgICAgICByZXN0b3JlQWZ0ZXJEaXNwYXRjaCgpO1xuICAgICAgICBmdW5jLmFwcGx5KGNvbnRleHQsIGZ1bmNBcmdzKTtcbiAgICAgICAgZGlkRXJyb3IgPSBmYWxzZTtcbiAgICAgIH0gLy8gQ3JlYXRlIGEgZ2xvYmFsIGVycm9yIGV2ZW50IGhhbmRsZXIuIFdlIHVzZSB0aGlzIHRvIGNhcHR1cmUgdGhlIHZhbHVlXG4gICAgICAvLyB0aGF0IHdhcyB0aHJvd24uIEl0J3MgcG9zc2libGUgdGhhdCB0aGlzIGVycm9yIGhhbmRsZXIgd2lsbCBmaXJlIG1vcmVcbiAgICAgIC8vIHRoYW4gb25jZTsgZm9yIGV4YW1wbGUsIGlmIG5vbi1SZWFjdCBjb2RlIGFsc28gY2FsbHMgYGRpc3BhdGNoRXZlbnRgXG4gICAgICAvLyBhbmQgYSBoYW5kbGVyIGZvciB0aGF0IGV2ZW50IHRocm93cy4gV2Ugc2hvdWxkIGJlIHJlc2lsaWVudCB0byBtb3N0IG9mXG4gICAgICAvLyB0aG9zZSBjYXNlcy4gRXZlbiBpZiBvdXIgZXJyb3IgZXZlbnQgaGFuZGxlciBmaXJlcyBtb3JlIHRoYW4gb25jZSwgdGhlXG4gICAgICAvLyBsYXN0IGVycm9yIGV2ZW50IGlzIGFsd2F5cyB1c2VkLiBJZiB0aGUgY2FsbGJhY2sgYWN0dWFsbHkgZG9lcyBlcnJvcixcbiAgICAgIC8vIHdlIGtub3cgdGhhdCB0aGUgbGFzdCBlcnJvciBldmVudCBpcyB0aGUgY29ycmVjdCBvbmUsIGJlY2F1c2UgaXQncyBub3RcbiAgICAgIC8vIHBvc3NpYmxlIGZvciBhbnl0aGluZyBlbHNlIHRvIGhhdmUgaGFwcGVuZWQgaW4gYmV0d2VlbiBvdXIgY2FsbGJhY2tcbiAgICAgIC8vIGVycm9yaW5nIGFuZCB0aGUgY29kZSB0aGF0IGZvbGxvd3MgdGhlIGBkaXNwYXRjaEV2ZW50YCBjYWxsIGJlbG93LiBJZlxuICAgICAgLy8gdGhlIGNhbGxiYWNrIGRvZXNuJ3QgZXJyb3IsIGJ1dCB0aGUgZXJyb3IgZXZlbnQgd2FzIGZpcmVkLCB3ZSBrbm93IHRvXG4gICAgICAvLyBpZ25vcmUgaXQgYmVjYXVzZSBgZGlkRXJyb3JgIHdpbGwgYmUgZmFsc2UsIGFzIGRlc2NyaWJlZCBhYm92ZS5cblxuXG4gICAgICB2YXIgZXJyb3I7IC8vIFVzZSB0aGlzIHRvIHRyYWNrIHdoZXRoZXIgdGhlIGVycm9yIGV2ZW50IGlzIGV2ZXIgY2FsbGVkLlxuXG4gICAgICB2YXIgZGlkU2V0RXJyb3IgPSBmYWxzZTtcbiAgICAgIHZhciBpc0Nyb3NzT3JpZ2luRXJyb3IgPSBmYWxzZTtcblxuICAgICAgZnVuY3Rpb24gaGFuZGxlV2luZG93RXJyb3IoZXZlbnQpIHtcbiAgICAgICAgZXJyb3IgPSBldmVudC5lcnJvcjtcbiAgICAgICAgZGlkU2V0RXJyb3IgPSB0cnVlO1xuXG4gICAgICAgIGlmIChlcnJvciA9PT0gbnVsbCAmJiBldmVudC5jb2xubyA9PT0gMCAmJiBldmVudC5saW5lbm8gPT09IDApIHtcbiAgICAgICAgICBpc0Nyb3NzT3JpZ2luRXJyb3IgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgICAvLyBTb21lIG90aGVyIGVycm9yIGhhbmRsZXIgaGFzIHByZXZlbnRlZCBkZWZhdWx0LlxuICAgICAgICAgIC8vIEJyb3dzZXJzIHNpbGVuY2UgdGhlIGVycm9yIHJlcG9ydCBpZiB0aGlzIGhhcHBlbnMuXG4gICAgICAgICAgLy8gV2UnbGwgcmVtZW1iZXIgdGhpcyB0byBsYXRlciBkZWNpZGUgd2hldGhlciB0byBsb2cgaXQgb3Igbm90LlxuICAgICAgICAgIGlmIChlcnJvciAhPSBudWxsICYmIHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGVycm9yLl9zdXBwcmVzc0xvZ2dpbmcgPSB0cnVlO1xuICAgICAgICAgICAgfSBjYXRjaCAoaW5uZXIpIHsvLyBJZ25vcmUuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IC8vIENyZWF0ZSBhIGZha2UgZXZlbnQgdHlwZS5cblxuXG4gICAgICB2YXIgZXZ0VHlwZSA9IFwicmVhY3QtXCIgKyAobmFtZSA/IG5hbWUgOiAnaW52b2tlZ3VhcmRlZGNhbGxiYWNrJyk7IC8vIEF0dGFjaCBvdXIgZXZlbnQgaGFuZGxlcnNcblxuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgaGFuZGxlV2luZG93RXJyb3IpO1xuICAgICAgZmFrZU5vZGUuYWRkRXZlbnRMaXN0ZW5lcihldnRUeXBlLCBjYWxsQ2FsbGJhY2ssIGZhbHNlKTsgLy8gU3luY2hyb25vdXNseSBkaXNwYXRjaCBvdXIgZmFrZSBldmVudC4gSWYgdGhlIHVzZXItcHJvdmlkZWQgZnVuY3Rpb25cbiAgICAgIC8vIGVycm9ycywgaXQgd2lsbCB0cmlnZ2VyIG91ciBnbG9iYWwgZXJyb3IgaGFuZGxlci5cblxuICAgICAgZXZ0LmluaXRFdmVudChldnRUeXBlLCBmYWxzZSwgZmFsc2UpO1xuICAgICAgZmFrZU5vZGUuZGlzcGF0Y2hFdmVudChldnQpO1xuXG4gICAgICBpZiAod2luZG93RXZlbnREZXNjcmlwdG9yKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdldmVudCcsIHdpbmRvd0V2ZW50RGVzY3JpcHRvcik7XG4gICAgICB9XG5cbiAgICAgIGlmIChkaWRDYWxsICYmIGRpZEVycm9yKSB7XG4gICAgICAgIGlmICghZGlkU2V0RXJyb3IpIHtcbiAgICAgICAgICAvLyBUaGUgY2FsbGJhY2sgZXJyb3JlZCwgYnV0IHRoZSBlcnJvciBldmVudCBuZXZlciBmaXJlZC5cbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvcHJvZC1lcnJvci1jb2Rlc1xuICAgICAgICAgIGVycm9yID0gbmV3IEVycm9yKCdBbiBlcnJvciB3YXMgdGhyb3duIGluc2lkZSBvbmUgb2YgeW91ciBjb21wb25lbnRzLCBidXQgUmVhY3QgJyArIFwiZG9lc24ndCBrbm93IHdoYXQgaXQgd2FzLiBUaGlzIGlzIGxpa2VseSBkdWUgdG8gYnJvd3NlciBcIiArICdmbGFraW5lc3MuIFJlYWN0IGRvZXMgaXRzIGJlc3QgdG8gcHJlc2VydmUgdGhlIFwiUGF1c2Ugb24gJyArICdleGNlcHRpb25zXCIgYmVoYXZpb3Igb2YgdGhlIERldlRvb2xzLCB3aGljaCByZXF1aXJlcyBzb21lICcgKyBcIkRFVi1tb2RlIG9ubHkgdHJpY2tzLiBJdCdzIHBvc3NpYmxlIHRoYXQgdGhlc2UgZG9uJ3Qgd29yayBpbiBcIiArICd5b3VyIGJyb3dzZXIuIFRyeSB0cmlnZ2VyaW5nIHRoZSBlcnJvciBpbiBwcm9kdWN0aW9uIG1vZGUsICcgKyAnb3Igc3dpdGNoaW5nIHRvIGEgbW9kZXJuIGJyb3dzZXIuIElmIHlvdSBzdXNwZWN0IHRoYXQgdGhpcyBpcyAnICsgJ2FjdHVhbGx5IGFuIGlzc3VlIHdpdGggUmVhY3QsIHBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzQ3Jvc3NPcmlnaW5FcnJvcikge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9wcm9kLWVycm9yLWNvZGVzXG4gICAgICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoXCJBIGNyb3NzLW9yaWdpbiBlcnJvciB3YXMgdGhyb3duLiBSZWFjdCBkb2Vzbid0IGhhdmUgYWNjZXNzIHRvIFwiICsgJ3RoZSBhY3R1YWwgZXJyb3Igb2JqZWN0IGluIGRldmVsb3BtZW50LiAnICsgJ1NlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvY3Jvc3NvcmlnaW4tZXJyb3IgZm9yIG1vcmUgaW5mb3JtYXRpb24uJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm9uRXJyb3IoZXJyb3IpO1xuICAgICAgfSAvLyBSZW1vdmUgb3VyIGV2ZW50IGxpc3RlbmVyc1xuXG5cbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIGhhbmRsZVdpbmRvd0Vycm9yKTtcblxuICAgICAgaWYgKCFkaWRDYWxsKSB7XG4gICAgICAgIC8vIFNvbWV0aGluZyB3ZW50IHJlYWxseSB3cm9uZywgYW5kIG91ciBldmVudCB3YXMgbm90IGRpc3BhdGNoZWQuXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTY3MzRcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xNjU4NVxuICAgICAgICAvLyBGYWxsIGJhY2sgdG8gdGhlIHByb2R1Y3Rpb24gaW1wbGVtZW50YXRpb24uXG4gICAgICAgIHJlc3RvcmVBZnRlckRpc3BhdGNoKCk7XG4gICAgICAgIHJldHVybiBpbnZva2VHdWFyZGVkQ2FsbGJhY2tQcm9kLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxufVxuXG52YXIgaW52b2tlR3VhcmRlZENhbGxiYWNrSW1wbCQxID0gaW52b2tlR3VhcmRlZENhbGxiYWNrSW1wbDtcblxudmFyIGhhc0Vycm9yID0gZmFsc2U7XG52YXIgY2F1Z2h0RXJyb3IgPSBudWxsOyAvLyBVc2VkIGJ5IGV2ZW50IHN5c3RlbSB0byBjYXB0dXJlL3JldGhyb3cgdGhlIGZpcnN0IGVycm9yLlxudmFyIHJlcG9ydGVyID0ge1xuICBvbkVycm9yOiBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICBoYXNFcnJvciA9IHRydWU7XG4gICAgY2F1Z2h0RXJyb3IgPSBlcnJvcjtcbiAgfVxufTtcbi8qKlxuICogQ2FsbCBhIGZ1bmN0aW9uIHdoaWxlIGd1YXJkaW5nIGFnYWluc3QgZXJyb3JzIHRoYXQgaGFwcGVucyB3aXRoaW4gaXQuXG4gKiBSZXR1cm5zIGFuIGVycm9yIGlmIGl0IHRocm93cywgb3RoZXJ3aXNlIG51bGwuXG4gKlxuICogSW4gcHJvZHVjdGlvbiwgdGhpcyBpcyBpbXBsZW1lbnRlZCB1c2luZyBhIHRyeS1jYXRjaC4gVGhlIHJlYXNvbiB3ZSBkb24ndFxuICogdXNlIGEgdHJ5LWNhdGNoIGRpcmVjdGx5IGlzIHNvIHRoYXQgd2UgY2FuIHN3YXAgb3V0IGEgZGlmZmVyZW50XG4gKiBpbXBsZW1lbnRhdGlvbiBpbiBERVYgbW9kZS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBvZiB0aGUgZ3VhcmQgdG8gdXNlIGZvciBsb2dnaW5nIG9yIGRlYnVnZ2luZ1xuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gaW52b2tlXG4gKiBAcGFyYW0geyp9IGNvbnRleHQgVGhlIGNvbnRleHQgdG8gdXNlIHdoZW4gY2FsbGluZyB0aGUgZnVuY3Rpb25cbiAqIEBwYXJhbSB7Li4uKn0gYXJncyBBcmd1bWVudHMgZm9yIGZ1bmN0aW9uXG4gKi9cblxuZnVuY3Rpb24gaW52b2tlR3VhcmRlZENhbGxiYWNrKG5hbWUsIGZ1bmMsIGNvbnRleHQsIGEsIGIsIGMsIGQsIGUsIGYpIHtcbiAgaGFzRXJyb3IgPSBmYWxzZTtcbiAgY2F1Z2h0RXJyb3IgPSBudWxsO1xuICBpbnZva2VHdWFyZGVkQ2FsbGJhY2tJbXBsJDEuYXBwbHkocmVwb3J0ZXIsIGFyZ3VtZW50cyk7XG59XG5mdW5jdGlvbiBoYXNDYXVnaHRFcnJvcigpIHtcbiAgcmV0dXJuIGhhc0Vycm9yO1xufVxuZnVuY3Rpb24gY2xlYXJDYXVnaHRFcnJvcigpIHtcbiAgaWYgKGhhc0Vycm9yKSB7XG4gICAgdmFyIGVycm9yID0gY2F1Z2h0RXJyb3I7XG4gICAgaGFzRXJyb3IgPSBmYWxzZTtcbiAgICBjYXVnaHRFcnJvciA9IG51bGw7XG4gICAgcmV0dXJuIGVycm9yO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJDYXVnaHRFcnJvciB3YXMgY2FsbGVkIGJ1dCBubyBlcnJvciB3YXMgY2FwdHVyZWQuIFRoaXMgZXJyb3IgJyArICdpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgfVxufVxuXG52YXIgZGlkV2FybkFib3V0VW5kZWZpbmVkU25hcHNob3RCZWZvcmVVcGRhdGUgPSBudWxsO1xuXG57XG4gIGRpZFdhcm5BYm91dFVuZGVmaW5lZFNuYXBzaG90QmVmb3JlVXBkYXRlID0gbmV3IFNldCgpO1xufSAvLyBVc2VkIGR1cmluZyB0aGUgY29tbWl0IHBoYXNlIHRvIHRyYWNrIHRoZSBzdGF0ZSBvZiB0aGUgT2Zmc2NyZWVuIGNvbXBvbmVudCBzdGFjay5cbi8vIEFsbG93cyB1cyB0byBhdm9pZCB0cmF2ZXJzaW5nIHRoZSByZXR1cm4gcGF0aCB0byBmaW5kIHRoZSBuZWFyZXN0IE9mZnNjcmVlbiBhbmNlc3Rvci5cbi8vIE9ubHkgdXNlZCB3aGVuIGVuYWJsZVN1c3BlbnNlTGF5b3V0RWZmZWN0U2VtYW50aWNzIGlzIGVuYWJsZWQuXG5cblxudmFyIG9mZnNjcmVlblN1YnRyZWVJc0hpZGRlbiA9IGZhbHNlO1xudmFyIG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gPSBmYWxzZTtcbnZhciBQb3NzaWJseVdlYWtTZXQgPSB0eXBlb2YgV2Vha1NldCA9PT0gJ2Z1bmN0aW9uJyA/IFdlYWtTZXQgOiBTZXQ7XG52YXIgbmV4dEVmZmVjdCA9IG51bGw7IC8vIFVzZWQgZm9yIFByb2ZpbGluZyBidWlsZHMgdG8gdHJhY2sgdXBkYXRlcnMuXG5cbnZhciBpblByb2dyZXNzTGFuZXMgPSBudWxsO1xudmFyIGluUHJvZ3Jlc3NSb290ID0gbnVsbDtcbmZ1bmN0aW9uIHJlcG9ydFVuY2F1Z2h0RXJyb3JJbkRFVihlcnJvcikge1xuICAvLyBXcmFwcGluZyBlYWNoIHNtYWxsIHBhcnQgb2YgdGhlIGNvbW1pdCBwaGFzZSBpbnRvIGEgZ3VhcmRlZFxuICAvLyBjYWxsYmFjayBpcyBhIGJpdCB0b28gc2xvdyAoaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvMjE2NjYpLlxuICAvLyBCdXQgd2UgcmVseSBvbiBpdCB0byBzdXJmYWNlIGVycm9ycyB0byBERVYgdG9vbHMgbGlrZSBvdmVybGF5c1xuICAvLyAoaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8yMTcxMikuXG4gIC8vIEFzIGEgY29tcHJvbWlzZSwgcmV0aHJvdyBvbmx5IGNhdWdodCBlcnJvcnMgaW4gYSBndWFyZC5cbiAge1xuICAgIGludm9rZUd1YXJkZWRDYWxsYmFjayhudWxsLCBmdW5jdGlvbiAoKSB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9KTtcbiAgICBjbGVhckNhdWdodEVycm9yKCk7XG4gIH1cbn1cblxudmFyIGNhbGxDb21wb25lbnRXaWxsVW5tb3VudFdpdGhUaW1lciA9IGZ1bmN0aW9uIChjdXJyZW50LCBpbnN0YW5jZSkge1xuICBpbnN0YW5jZS5wcm9wcyA9IGN1cnJlbnQubWVtb2l6ZWRQcm9wcztcbiAgaW5zdGFuY2Uuc3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKCBjdXJyZW50Lm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgIHRyeSB7XG4gICAgICBzdGFydExheW91dEVmZmVjdFRpbWVyKCk7XG4gICAgICBpbnN0YW5jZS5jb21wb25lbnRXaWxsVW5tb3VudCgpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICByZWNvcmRMYXlvdXRFZmZlY3REdXJhdGlvbihjdXJyZW50KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVubW91bnQoKTtcbiAgfVxufTsgLy8gQ2FwdHVyZSBlcnJvcnMgc28gdGhleSBkb24ndCBpbnRlcnJ1cHQgbW91bnRpbmcuXG5cblxuZnVuY3Rpb24gc2FmZWx5Q2FsbENvbW1pdEhvb2tMYXlvdXRFZmZlY3RMaXN0TW91bnQoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3Rvcikge1xuICB0cnkge1xuICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0TW91bnQoTGF5b3V0LCBjdXJyZW50KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBlcnJvcik7XG4gIH1cbn0gLy8gQ2FwdHVyZSBlcnJvcnMgc28gdGhleSBkb24ndCBpbnRlcnJ1cHQgdW5tb3VudGluZy5cblxuXG5mdW5jdGlvbiBzYWZlbHlDYWxsQ29tcG9uZW50V2lsbFVubW91bnQoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgaW5zdGFuY2UpIHtcbiAgdHJ5IHtcbiAgICBjYWxsQ29tcG9uZW50V2lsbFVubW91bnRXaXRoVGltZXIoY3VycmVudCwgaW5zdGFuY2UpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGVycm9yKTtcbiAgfVxufSAvLyBDYXB0dXJlIGVycm9ycyBzbyB0aGV5IGRvbid0IGludGVycnVwdCBtb3VudGluZy5cblxuXG5mdW5jdGlvbiBzYWZlbHlDYWxsQ29tcG9uZW50RGlkTW91bnQoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgaW5zdGFuY2UpIHtcbiAgdHJ5IHtcbiAgICBpbnN0YW5jZS5jb21wb25lbnREaWRNb3VudCgpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGVycm9yKTtcbiAgfVxufSAvLyBDYXB0dXJlIGVycm9ycyBzbyB0aGV5IGRvbid0IGludGVycnVwdCBtb3VudGluZy5cblxuXG5mdW5jdGlvbiBzYWZlbHlBdHRhY2hSZWYoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3Rvcikge1xuICB0cnkge1xuICAgIGNvbW1pdEF0dGFjaFJlZihjdXJyZW50KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBlcnJvcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2FmZWx5RGV0YWNoUmVmKGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IpIHtcbiAgdmFyIHJlZiA9IGN1cnJlbnQucmVmO1xuXG4gIGlmIChyZWYgIT09IG51bGwpIHtcbiAgICBpZiAodHlwZW9mIHJlZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIHJldFZhbDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGVuYWJsZVByb2ZpbGVyVGltZXIgJiYgZW5hYmxlUHJvZmlsZXJDb21taXRIb29rcyAmJiBjdXJyZW50Lm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBzdGFydExheW91dEVmZmVjdFRpbWVyKCk7XG4gICAgICAgICAgICByZXRWYWwgPSByZWYobnVsbCk7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIHJlY29yZExheW91dEVmZmVjdER1cmF0aW9uKGN1cnJlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXRWYWwgPSByZWYobnVsbCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGVycm9yKTtcbiAgICAgIH1cblxuICAgICAge1xuICAgICAgICBpZiAodHlwZW9mIHJldFZhbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGVycm9yKCdVbmV4cGVjdGVkIHJldHVybiB2YWx1ZSBmcm9tIGEgY2FsbGJhY2sgcmVmIGluICVzLiAnICsgJ0EgY2FsbGJhY2sgcmVmIHNob3VsZCBub3QgcmV0dXJuIGEgZnVuY3Rpb24uJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihjdXJyZW50KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmVmLmN1cnJlbnQgPSBudWxsO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzYWZlbHlDYWxsRGVzdHJveShjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZXN0cm95KSB7XG4gIHRyeSB7XG4gICAgZGVzdHJveSgpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGVycm9yKTtcbiAgfVxufVxuXG52YXIgZm9jdXNlZEluc3RhbmNlSGFuZGxlID0gbnVsbDtcbnZhciBzaG91bGRGaXJlQWZ0ZXJBY3RpdmVJbnN0YW5jZUJsdXIgPSBmYWxzZTtcbmZ1bmN0aW9uIGNvbW1pdEJlZm9yZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaXJzdENoaWxkKSB7XG4gIGZvY3VzZWRJbnN0YW5jZUhhbmRsZSA9IHByZXBhcmVGb3JDb21taXQocm9vdC5jb250YWluZXJJbmZvKTtcbiAgbmV4dEVmZmVjdCA9IGZpcnN0Q2hpbGQ7XG4gIGNvbW1pdEJlZm9yZU11dGF0aW9uRWZmZWN0c19iZWdpbigpOyAvLyBXZSBubyBsb25nZXIgbmVlZCB0byB0cmFjayB0aGUgYWN0aXZlIGluc3RhbmNlIGZpYmVyXG5cbiAgdmFyIHNob3VsZEZpcmUgPSBzaG91bGRGaXJlQWZ0ZXJBY3RpdmVJbnN0YW5jZUJsdXI7XG4gIHNob3VsZEZpcmVBZnRlckFjdGl2ZUluc3RhbmNlQmx1ciA9IGZhbHNlO1xuICBmb2N1c2VkSW5zdGFuY2VIYW5kbGUgPSBudWxsO1xuICByZXR1cm4gc2hvdWxkRmlyZTtcbn1cblxuZnVuY3Rpb24gY29tbWl0QmVmb3JlTXV0YXRpb25FZmZlY3RzX2JlZ2luKCkge1xuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7IC8vIFRoaXMgcGhhc2UgaXMgb25seSB1c2VkIGZvciBiZWZvcmVBY3RpdmVJbnN0YW5jZUJsdXIuXG5cbiAgICB2YXIgY2hpbGQgPSBmaWJlci5jaGlsZDtcblxuICAgIGlmICgoZmliZXIuc3VidHJlZUZsYWdzICYgQmVmb3JlTXV0YXRpb25NYXNrKSAhPT0gTm9GbGFncyAmJiBjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgY2hpbGQucmV0dXJuID0gZmliZXI7XG4gICAgICBuZXh0RWZmZWN0ID0gY2hpbGQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbW1pdEJlZm9yZU11dGF0aW9uRWZmZWN0c19jb21wbGV0ZSgpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRCZWZvcmVNdXRhdGlvbkVmZmVjdHNfY29tcGxldGUoKSB7XG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDtcbiAgICBzZXRDdXJyZW50RmliZXIoZmliZXIpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbW1pdEJlZm9yZU11dGF0aW9uRWZmZWN0c09uRmliZXIoZmliZXIpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaWJlciwgZmliZXIucmV0dXJuLCBlcnJvcik7XG4gICAgfVxuXG4gICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgICB2YXIgc2libGluZyA9IGZpYmVyLnNpYmxpbmc7XG5cbiAgICBpZiAoc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgc2libGluZy5yZXR1cm4gPSBmaWJlci5yZXR1cm47XG4gICAgICBuZXh0RWZmZWN0ID0gc2libGluZztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBuZXh0RWZmZWN0ID0gZmliZXIucmV0dXJuO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdEJlZm9yZU11dGF0aW9uRWZmZWN0c09uRmliZXIoZmluaXNoZWRXb3JrKSB7XG4gIHZhciBjdXJyZW50ID0gZmluaXNoZWRXb3JrLmFsdGVybmF0ZTtcbiAgdmFyIGZsYWdzID0gZmluaXNoZWRXb3JrLmZsYWdzO1xuXG4gIGlmICgoZmxhZ3MgJiBTbmFwc2hvdCkgIT09IE5vRmxhZ3MpIHtcbiAgICBzZXRDdXJyZW50RmliZXIoZmluaXNoZWRXb3JrKTtcblxuICAgIHN3aXRjaCAoZmluaXNoZWRXb3JrLnRhZykge1xuICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIHByZXZQcm9wcyA9IGN1cnJlbnQubWVtb2l6ZWRQcm9wcztcbiAgICAgICAgICAgIHZhciBwcmV2U3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG4gICAgICAgICAgICB2YXIgaW5zdGFuY2UgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlOyAvLyBXZSBjb3VsZCB1cGRhdGUgaW5zdGFuY2UgcHJvcHMgYW5kIHN0YXRlIGhlcmUsXG4gICAgICAgICAgICAvLyBidXQgaW5zdGVhZCB3ZSByZWx5IG9uIHRoZW0gYmVpbmcgc2V0IGR1cmluZyBsYXN0IHJlbmRlci5cbiAgICAgICAgICAgIC8vIFRPRE86IHJldmlzaXQgdGhpcyB3aGVuIHdlIGltcGxlbWVudCByZXN1bWluZy5cblxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpZiAoZmluaXNoZWRXb3JrLnR5cGUgPT09IGZpbmlzaGVkV29yay5lbGVtZW50VHlwZSAmJiAhZGlkV2FybkFib3V0UmVhc3NpZ25pbmdQcm9wcykge1xuICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZS5wcm9wcyAhPT0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHMpIHtcbiAgICAgICAgICAgICAgICAgIGVycm9yKCdFeHBlY3RlZCAlcyBwcm9wcyB0byBtYXRjaCBtZW1vaXplZCBwcm9wcyBiZWZvcmUgJyArICdnZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZS4gJyArICdUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlICcgKyAnYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMucHJvcHNgLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmluaXNoZWRXb3JrKSB8fCAnaW5zdGFuY2UnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2Uuc3RhdGUgIT09IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICBlcnJvcignRXhwZWN0ZWQgJXMgc3RhdGUgdG8gbWF0Y2ggbWVtb2l6ZWQgc3RhdGUgYmVmb3JlICcgKyAnZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUuICcgKyAnVGhpcyBtaWdodCBlaXRoZXIgYmUgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBSZWFjdCwgb3IgYmVjYXVzZSAnICsgJ2EgY29tcG9uZW50IHJlYXNzaWducyBpdHMgb3duIGB0aGlzLnN0YXRlYC4gJyArICdQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpbmlzaGVkV29yaykgfHwgJ2luc3RhbmNlJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBzbmFwc2hvdCA9IGluc3RhbmNlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlKGZpbmlzaGVkV29yay5lbGVtZW50VHlwZSA9PT0gZmluaXNoZWRXb3JrLnR5cGUgPyBwcmV2UHJvcHMgOiByZXNvbHZlRGVmYXVsdFByb3BzKGZpbmlzaGVkV29yay50eXBlLCBwcmV2UHJvcHMpLCBwcmV2U3RhdGUpO1xuXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHZhciBkaWRXYXJuU2V0ID0gZGlkV2FybkFib3V0VW5kZWZpbmVkU25hcHNob3RCZWZvcmVVcGRhdGU7XG5cbiAgICAgICAgICAgICAgaWYgKHNuYXBzaG90ID09PSB1bmRlZmluZWQgJiYgIWRpZFdhcm5TZXQuaGFzKGZpbmlzaGVkV29yay50eXBlKSkge1xuICAgICAgICAgICAgICAgIGRpZFdhcm5TZXQuYWRkKGZpbmlzaGVkV29yay50eXBlKTtcblxuICAgICAgICAgICAgICAgIGVycm9yKCclcy5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSgpOiBBIHNuYXBzaG90IHZhbHVlIChvciBudWxsKSAnICsgJ211c3QgYmUgcmV0dXJuZWQuIFlvdSBoYXZlIHJldHVybmVkIHVuZGVmaW5lZC4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpbmlzaGVkV29yaykpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbFNuYXBzaG90QmVmb3JlVXBkYXRlID0gc25hcHNob3Q7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAge1xuICAgICAgICAgIGlmIChzdXBwb3J0c011dGF0aW9uKSB7XG4gICAgICAgICAgICB2YXIgcm9vdCA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7XG4gICAgICAgICAgICBjbGVhckNvbnRhaW5lcihyb290LmNvbnRhaW5lckluZm8pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICBjYXNlIEluY29tcGxldGVDbGFzc0NvbXBvbmVudDpcbiAgICAgICAgLy8gTm90aGluZyB0byBkbyBmb3IgdGhlc2UgY29tcG9uZW50IHR5cGVzXG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIHVuaXQgb2Ygd29yayB0YWcgc2hvdWxkIG5vdCBoYXZlIHNpZGUtZWZmZWN0cy4gVGhpcyBlcnJvciBpcyAnICsgJ2xpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoZmxhZ3MsIGZpbmlzaGVkV29yaywgbmVhcmVzdE1vdW50ZWRBbmNlc3Rvcikge1xuICB2YXIgdXBkYXRlUXVldWUgPSBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWU7XG4gIHZhciBsYXN0RWZmZWN0ID0gdXBkYXRlUXVldWUgIT09IG51bGwgPyB1cGRhdGVRdWV1ZS5sYXN0RWZmZWN0IDogbnVsbDtcblxuICBpZiAobGFzdEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaXJzdEVmZmVjdCA9IGxhc3RFZmZlY3QubmV4dDtcbiAgICB2YXIgZWZmZWN0ID0gZmlyc3RFZmZlY3Q7XG5cbiAgICBkbyB7XG4gICAgICBpZiAoKGVmZmVjdC50YWcgJiBmbGFncykgPT09IGZsYWdzKSB7XG4gICAgICAgIC8vIFVubW91bnRcbiAgICAgICAgdmFyIGRlc3Ryb3kgPSBlZmZlY3QuZGVzdHJveTtcbiAgICAgICAgZWZmZWN0LmRlc3Ryb3kgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgaWYgKGRlc3Ryb3kgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmICgoZmxhZ3MgJiBQYXNzaXZlJDEpICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgICAgbWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RVbm1vdW50U3RhcnRlZChmaW5pc2hlZFdvcmspO1xuICAgICAgICAgICAgfSBlbHNlIGlmICgoZmxhZ3MgJiBMYXlvdXQpICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgICAgbWFya0NvbXBvbmVudExheW91dEVmZmVjdFVubW91bnRTdGFydGVkKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKChmbGFncyAmIEluc2VydGlvbikgIT09IE5vRmxhZ3MkMSkge1xuICAgICAgICAgICAgICBzZXRJc1J1bm5pbmdJbnNlcnRpb25FZmZlY3QodHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2FmZWx5Q2FsbERlc3Ryb3koZmluaXNoZWRXb3JrLCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZXN0cm95KTtcblxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmICgoZmxhZ3MgJiBJbnNlcnRpb24pICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgICAgc2V0SXNSdW5uaW5nSW5zZXJ0aW9uRWZmZWN0KGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAoKGZsYWdzICYgUGFzc2l2ZSQxKSAhPT0gTm9GbGFncyQxKSB7XG4gICAgICAgICAgICAgIG1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0VW5tb3VudFN0b3BwZWQoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoKGZsYWdzICYgTGF5b3V0KSAhPT0gTm9GbGFncyQxKSB7XG4gICAgICAgICAgICAgIG1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RVbm1vdW50U3RvcHBlZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBlZmZlY3QgPSBlZmZlY3QubmV4dDtcbiAgICB9IHdoaWxlIChlZmZlY3QgIT09IGZpcnN0RWZmZWN0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRIb29rRWZmZWN0TGlzdE1vdW50KGZsYWdzLCBmaW5pc2hlZFdvcmspIHtcbiAgdmFyIHVwZGF0ZVF1ZXVlID0gZmluaXNoZWRXb3JrLnVwZGF0ZVF1ZXVlO1xuICB2YXIgbGFzdEVmZmVjdCA9IHVwZGF0ZVF1ZXVlICE9PSBudWxsID8gdXBkYXRlUXVldWUubGFzdEVmZmVjdCA6IG51bGw7XG5cbiAgaWYgKGxhc3RFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmlyc3RFZmZlY3QgPSBsYXN0RWZmZWN0Lm5leHQ7XG4gICAgdmFyIGVmZmVjdCA9IGZpcnN0RWZmZWN0O1xuXG4gICAgZG8ge1xuICAgICAgaWYgKChlZmZlY3QudGFnICYgZmxhZ3MpID09PSBmbGFncykge1xuICAgICAgICB7XG4gICAgICAgICAgaWYgKChmbGFncyAmIFBhc3NpdmUkMSkgIT09IE5vRmxhZ3MkMSkge1xuICAgICAgICAgICAgbWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RNb3VudFN0YXJ0ZWQoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKChmbGFncyAmIExheW91dCkgIT09IE5vRmxhZ3MkMSkge1xuICAgICAgICAgICAgbWFya0NvbXBvbmVudExheW91dEVmZmVjdE1vdW50U3RhcnRlZChmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIH1cbiAgICAgICAgfSAvLyBNb3VudFxuXG5cbiAgICAgICAgdmFyIGNyZWF0ZSA9IGVmZmVjdC5jcmVhdGU7XG5cbiAgICAgICAge1xuICAgICAgICAgIGlmICgoZmxhZ3MgJiBJbnNlcnRpb24pICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgIHNldElzUnVubmluZ0luc2VydGlvbkVmZmVjdCh0cnVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBlZmZlY3QuZGVzdHJveSA9IGNyZWF0ZSgpO1xuXG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoKGZsYWdzICYgSW5zZXJ0aW9uKSAhPT0gTm9GbGFncyQxKSB7XG4gICAgICAgICAgICBzZXRJc1J1bm5pbmdJbnNlcnRpb25FZmZlY3QoZmFsc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoKGZsYWdzICYgUGFzc2l2ZSQxKSAhPT0gTm9GbGFncyQxKSB7XG4gICAgICAgICAgICBtYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdE1vdW50U3RvcHBlZCgpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoKGZsYWdzICYgTGF5b3V0KSAhPT0gTm9GbGFncyQxKSB7XG4gICAgICAgICAgICBtYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0TW91bnRTdG9wcGVkKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAge1xuICAgICAgICAgIHZhciBkZXN0cm95ID0gZWZmZWN0LmRlc3Ryb3k7XG5cbiAgICAgICAgICBpZiAoZGVzdHJveSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBkZXN0cm95ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB2YXIgaG9va05hbWUgPSB2b2lkIDA7XG5cbiAgICAgICAgICAgIGlmICgoZWZmZWN0LnRhZyAmIExheW91dCkgIT09IE5vRmxhZ3MpIHtcbiAgICAgICAgICAgICAgaG9va05hbWUgPSAndXNlTGF5b3V0RWZmZWN0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoKGVmZmVjdC50YWcgJiBJbnNlcnRpb24pICE9PSBOb0ZsYWdzKSB7XG4gICAgICAgICAgICAgIGhvb2tOYW1lID0gJ3VzZUluc2VydGlvbkVmZmVjdCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBob29rTmFtZSA9ICd1c2VFZmZlY3QnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgYWRkZW5kdW0gPSB2b2lkIDA7XG5cbiAgICAgICAgICAgIGlmIChkZXN0cm95ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIGFkZGVuZHVtID0gJyBZb3UgcmV0dXJuZWQgbnVsbC4gSWYgeW91ciBlZmZlY3QgZG9lcyBub3QgcmVxdWlyZSBjbGVhbiAnICsgJ3VwLCByZXR1cm4gdW5kZWZpbmVkIChvciBub3RoaW5nKS4nO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZGVzdHJveS50aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgIGFkZGVuZHVtID0gJ1xcblxcbkl0IGxvb2tzIGxpa2UgeW91IHdyb3RlICcgKyBob29rTmFtZSArICcoYXN5bmMgKCkgPT4gLi4uKSBvciByZXR1cm5lZCBhIFByb21pc2UuICcgKyAnSW5zdGVhZCwgd3JpdGUgdGhlIGFzeW5jIGZ1bmN0aW9uIGluc2lkZSB5b3VyIGVmZmVjdCAnICsgJ2FuZCBjYWxsIGl0IGltbWVkaWF0ZWx5OlxcblxcbicgKyBob29rTmFtZSArICcoKCkgPT4ge1xcbicgKyAnICBhc3luYyBmdW5jdGlvbiBmZXRjaERhdGEoKSB7XFxuJyArICcgICAgLy8gWW91IGNhbiBhd2FpdCBoZXJlXFxuJyArICcgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBNeUFQSS5nZXREYXRhKHNvbWVJZCk7XFxuJyArICcgICAgLy8gLi4uXFxuJyArICcgIH1cXG4nICsgJyAgZmV0Y2hEYXRhKCk7XFxuJyArIFwifSwgW3NvbWVJZF0pOyAvLyBPciBbXSBpZiBlZmZlY3QgZG9lc24ndCBuZWVkIHByb3BzIG9yIHN0YXRlXFxuXFxuXCIgKyAnTGVhcm4gbW9yZSBhYm91dCBkYXRhIGZldGNoaW5nIHdpdGggSG9va3M6IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9ob29rcy1kYXRhLWZldGNoaW5nJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGFkZGVuZHVtID0gJyBZb3UgcmV0dXJuZWQ6ICcgKyBkZXN0cm95O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBlcnJvcignJXMgbXVzdCBub3QgcmV0dXJuIGFueXRoaW5nIGJlc2lkZXMgYSBmdW5jdGlvbiwgJyArICd3aGljaCBpcyB1c2VkIGZvciBjbGVhbi11cC4lcycsIGhvb2tOYW1lLCBhZGRlbmR1bSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGVmZmVjdCA9IGVmZmVjdC5uZXh0O1xuICAgIH0gd2hpbGUgKGVmZmVjdCAhPT0gZmlyc3RFZmZlY3QpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFBhc3NpdmVFZmZlY3REdXJhdGlvbnMoZmluaXNoZWRSb290LCBmaW5pc2hlZFdvcmspIHtcbiAge1xuICAgIC8vIE9ubHkgUHJvZmlsZXJzIHdpdGggd29yayBpbiB0aGVpciBzdWJ0cmVlIHdpbGwgaGF2ZSBhbiBVcGRhdGUgZWZmZWN0IHNjaGVkdWxlZC5cbiAgICBpZiAoKGZpbmlzaGVkV29yay5mbGFncyAmIFVwZGF0ZSkgIT09IE5vRmxhZ3MpIHtcbiAgICAgIHN3aXRjaCAoZmluaXNoZWRXb3JrLnRhZykge1xuICAgICAgICBjYXNlIFByb2ZpbGVyOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBwYXNzaXZlRWZmZWN0RHVyYXRpb24gPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlLnBhc3NpdmVFZmZlY3REdXJhdGlvbjtcbiAgICAgICAgICAgIHZhciBfZmluaXNoZWRXb3JrJG1lbW9pemUgPSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcyxcbiAgICAgICAgICAgICAgICBpZCA9IF9maW5pc2hlZFdvcmskbWVtb2l6ZS5pZCxcbiAgICAgICAgICAgICAgICBvblBvc3RDb21taXQgPSBfZmluaXNoZWRXb3JrJG1lbW9pemUub25Qb3N0Q29tbWl0OyAvLyBUaGlzIHZhbHVlIHdpbGwgc3RpbGwgcmVmbGVjdCB0aGUgcHJldmlvdXMgY29tbWl0IHBoYXNlLlxuICAgICAgICAgICAgLy8gSXQgZG9lcyBub3QgZ2V0IHJlc2V0IHVudGlsIHRoZSBzdGFydCBvZiB0aGUgbmV4dCBjb21taXQgcGhhc2UuXG5cbiAgICAgICAgICAgIHZhciBjb21taXRUaW1lID0gZ2V0Q29tbWl0VGltZSgpO1xuICAgICAgICAgICAgdmFyIHBoYXNlID0gZmluaXNoZWRXb3JrLmFsdGVybmF0ZSA9PT0gbnVsbCA/ICdtb3VudCcgOiAndXBkYXRlJztcblxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpZiAoaXNDdXJyZW50VXBkYXRlTmVzdGVkKCkpIHtcbiAgICAgICAgICAgICAgICBwaGFzZSA9ICduZXN0ZWQtdXBkYXRlJztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZW9mIG9uUG9zdENvbW1pdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICBvblBvc3RDb21taXQoaWQsIHBoYXNlLCBwYXNzaXZlRWZmZWN0RHVyYXRpb24sIGNvbW1pdFRpbWUpO1xuICAgICAgICAgICAgfSAvLyBCdWJibGUgdGltZXMgdG8gdGhlIG5leHQgbmVhcmVzdCBhbmNlc3RvciBQcm9maWxlci5cbiAgICAgICAgICAgIC8vIEFmdGVyIHdlIHByb2Nlc3MgdGhhdCBQcm9maWxlciwgd2UnbGwgYnViYmxlIGZ1cnRoZXIgdXAuXG5cblxuICAgICAgICAgICAgdmFyIHBhcmVudEZpYmVyID0gZmluaXNoZWRXb3JrLnJldHVybjtcblxuICAgICAgICAgICAgb3V0ZXI6IHdoaWxlIChwYXJlbnRGaWJlciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICBzd2l0Y2ggKHBhcmVudEZpYmVyLnRhZykge1xuICAgICAgICAgICAgICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICAgICAgICAgICAgICB2YXIgcm9vdCA9IHBhcmVudEZpYmVyLnN0YXRlTm9kZTtcbiAgICAgICAgICAgICAgICAgIHJvb3QucGFzc2l2ZUVmZmVjdER1cmF0aW9uICs9IHBhc3NpdmVFZmZlY3REdXJhdGlvbjtcbiAgICAgICAgICAgICAgICAgIGJyZWFrIG91dGVyO1xuXG4gICAgICAgICAgICAgICAgY2FzZSBQcm9maWxlcjpcbiAgICAgICAgICAgICAgICAgIHZhciBwYXJlbnRTdGF0ZU5vZGUgPSBwYXJlbnRGaWJlci5zdGF0ZU5vZGU7XG4gICAgICAgICAgICAgICAgICBwYXJlbnRTdGF0ZU5vZGUucGFzc2l2ZUVmZmVjdER1cmF0aW9uICs9IHBhc3NpdmVFZmZlY3REdXJhdGlvbjtcbiAgICAgICAgICAgICAgICAgIGJyZWFrIG91dGVyO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcGFyZW50RmliZXIgPSBwYXJlbnRGaWJlci5yZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0TGF5b3V0RWZmZWN0T25GaWJlcihmaW5pc2hlZFJvb3QsIGN1cnJlbnQsIGZpbmlzaGVkV29yaywgY29tbWl0dGVkTGFuZXMpIHtcbiAgaWYgKChmaW5pc2hlZFdvcmsuZmxhZ3MgJiBMYXlvdXRNYXNrKSAhPT0gTm9GbGFncykge1xuICAgIHN3aXRjaCAoZmluaXNoZWRXb3JrLnRhZykge1xuICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIGlmICggIW9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4pIHtcbiAgICAgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQgbGF5b3V0IGVmZmVjdHMgaGF2ZSBhbHJlYWR5IGJlZW4gZGVzdHJveWVkIChkdXJpbmcgbXV0YXRpb24gcGhhc2UpLlxuICAgICAgICAgICAgLy8gVGhpcyBpcyBkb25lIHRvIHByZXZlbnQgc2libGluZyBjb21wb25lbnQgZWZmZWN0cyBmcm9tIGludGVyZmVyaW5nIHdpdGggZWFjaCBvdGhlcixcbiAgICAgICAgICAgIC8vIGUuZy4gYSBkZXN0cm95IGZ1bmN0aW9uIGluIG9uZSBjb21wb25lbnQgc2hvdWxkIG5ldmVyIG92ZXJyaWRlIGEgcmVmIHNldFxuICAgICAgICAgICAgLy8gYnkgYSBjcmVhdGUgZnVuY3Rpb24gaW4gYW5vdGhlciBjb21wb25lbnQgZHVyaW5nIHRoZSBzYW1lIGNvbW1pdC5cbiAgICAgICAgICAgIGlmICggZmluaXNoZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHN0YXJ0TGF5b3V0RWZmZWN0VGltZXIoKTtcbiAgICAgICAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdE1vdW50KExheW91dCB8IEhhc0VmZmVjdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICByZWNvcmRMYXlvdXRFZmZlY3REdXJhdGlvbihmaW5pc2hlZFdvcmspO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdE1vdW50KExheW91dCB8IEhhc0VmZmVjdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGluc3RhbmNlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcblxuICAgICAgICAgIGlmIChmaW5pc2hlZFdvcmsuZmxhZ3MgJiBVcGRhdGUpIHtcbiAgICAgICAgICAgIGlmICghb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbikge1xuICAgICAgICAgICAgICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vIFdlIGNvdWxkIHVwZGF0ZSBpbnN0YW5jZSBwcm9wcyBhbmQgc3RhdGUgaGVyZSxcbiAgICAgICAgICAgICAgICAvLyBidXQgaW5zdGVhZCB3ZSByZWx5IG9uIHRoZW0gYmVpbmcgc2V0IGR1cmluZyBsYXN0IHJlbmRlci5cbiAgICAgICAgICAgICAgICAvLyBUT0RPOiByZXZpc2l0IHRoaXMgd2hlbiB3ZSBpbXBsZW1lbnQgcmVzdW1pbmcuXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgaWYgKGZpbmlzaGVkV29yay50eXBlID09PSBmaW5pc2hlZFdvcmsuZWxlbWVudFR5cGUgJiYgIWRpZFdhcm5BYm91dFJlYXNzaWduaW5nUHJvcHMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlLnByb3BzICE9PSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcykge1xuICAgICAgICAgICAgICAgICAgICAgIGVycm9yKCdFeHBlY3RlZCAlcyBwcm9wcyB0byBtYXRjaCBtZW1vaXplZCBwcm9wcyBiZWZvcmUgJyArICdjb21wb25lbnREaWRNb3VudC4gJyArICdUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlICcgKyAnYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMucHJvcHNgLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmluaXNoZWRXb3JrKSB8fCAnaW5zdGFuY2UnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZS5zdGF0ZSAhPT0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICBlcnJvcignRXhwZWN0ZWQgJXMgc3RhdGUgdG8gbWF0Y2ggbWVtb2l6ZWQgc3RhdGUgYmVmb3JlICcgKyAnY29tcG9uZW50RGlkTW91bnQuICcgKyAnVGhpcyBtaWdodCBlaXRoZXIgYmUgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBSZWFjdCwgb3IgYmVjYXVzZSAnICsgJ2EgY29tcG9uZW50IHJlYXNzaWducyBpdHMgb3duIGB0aGlzLnN0YXRlYC4gJyArICdQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpbmlzaGVkV29yaykgfHwgJ2luc3RhbmNlJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIGZpbmlzaGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0TGF5b3V0RWZmZWN0VGltZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UuY29tcG9uZW50RGlkTW91bnQoKTtcbiAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgIHJlY29yZExheW91dEVmZmVjdER1cmF0aW9uKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGluc3RhbmNlLmNvbXBvbmVudERpZE1vdW50KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBwcmV2UHJvcHMgPSBmaW5pc2hlZFdvcmsuZWxlbWVudFR5cGUgPT09IGZpbmlzaGVkV29yay50eXBlID8gY3VycmVudC5tZW1vaXplZFByb3BzIDogcmVzb2x2ZURlZmF1bHRQcm9wcyhmaW5pc2hlZFdvcmsudHlwZSwgY3VycmVudC5tZW1vaXplZFByb3BzKTtcbiAgICAgICAgICAgICAgICB2YXIgcHJldlN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlOyAvLyBXZSBjb3VsZCB1cGRhdGUgaW5zdGFuY2UgcHJvcHMgYW5kIHN0YXRlIGhlcmUsXG4gICAgICAgICAgICAgICAgLy8gYnV0IGluc3RlYWQgd2UgcmVseSBvbiB0aGVtIGJlaW5nIHNldCBkdXJpbmcgbGFzdCByZW5kZXIuXG4gICAgICAgICAgICAgICAgLy8gVE9ETzogcmV2aXNpdCB0aGlzIHdoZW4gd2UgaW1wbGVtZW50IHJlc3VtaW5nLlxuXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgaWYgKGZpbmlzaGVkV29yay50eXBlID09PSBmaW5pc2hlZFdvcmsuZWxlbWVudFR5cGUgJiYgIWRpZFdhcm5BYm91dFJlYXNzaWduaW5nUHJvcHMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlLnByb3BzICE9PSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcykge1xuICAgICAgICAgICAgICAgICAgICAgIGVycm9yKCdFeHBlY3RlZCAlcyBwcm9wcyB0byBtYXRjaCBtZW1vaXplZCBwcm9wcyBiZWZvcmUgJyArICdjb21wb25lbnREaWRVcGRhdGUuICcgKyAnVGhpcyBtaWdodCBlaXRoZXIgYmUgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBSZWFjdCwgb3IgYmVjYXVzZSAnICsgJ2EgY29tcG9uZW50IHJlYXNzaWducyBpdHMgb3duIGB0aGlzLnByb3BzYC4gJyArICdQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpbmlzaGVkV29yaykgfHwgJ2luc3RhbmNlJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2Uuc3RhdGUgIT09IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgZXJyb3IoJ0V4cGVjdGVkICVzIHN0YXRlIHRvIG1hdGNoIG1lbW9pemVkIHN0YXRlIGJlZm9yZSAnICsgJ2NvbXBvbmVudERpZFVwZGF0ZS4gJyArICdUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlICcgKyAnYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMuc3RhdGVgLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmluaXNoZWRXb3JrKSB8fCAnaW5zdGFuY2UnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICggZmluaXNoZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRMYXlvdXRFZmZlY3RUaW1lcigpO1xuICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS5jb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzLCBwcmV2U3RhdGUsIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbFNuYXBzaG90QmVmb3JlVXBkYXRlKTtcbiAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgIHJlY29yZExheW91dEVmZmVjdER1cmF0aW9uKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGluc3RhbmNlLmNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMsIHByZXZTdGF0ZSwgaW5zdGFuY2UuX19yZWFjdEludGVybmFsU25hcHNob3RCZWZvcmVVcGRhdGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gLy8gVE9ETzogSSB0aGluayB0aGlzIGlzIG5vdyBhbHdheXMgbm9uLW51bGwgYnkgdGhlIHRpbWUgaXQgcmVhY2hlcyB0aGVcbiAgICAgICAgICAvLyBjb21taXQgcGhhc2UuIENvbnNpZGVyIHJlbW92aW5nIHRoZSB0eXBlIGNoZWNrLlxuXG5cbiAgICAgICAgICB2YXIgdXBkYXRlUXVldWUgPSBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWU7XG5cbiAgICAgICAgICBpZiAodXBkYXRlUXVldWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaWYgKGZpbmlzaGVkV29yay50eXBlID09PSBmaW5pc2hlZFdvcmsuZWxlbWVudFR5cGUgJiYgIWRpZFdhcm5BYm91dFJlYXNzaWduaW5nUHJvcHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2UucHJvcHMgIT09IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzKSB7XG4gICAgICAgICAgICAgICAgICBlcnJvcignRXhwZWN0ZWQgJXMgcHJvcHMgdG8gbWF0Y2ggbWVtb2l6ZWQgcHJvcHMgYmVmb3JlICcgKyAncHJvY2Vzc2luZyB0aGUgdXBkYXRlIHF1ZXVlLiAnICsgJ1RoaXMgbWlnaHQgZWl0aGVyIGJlIGJlY2F1c2Ugb2YgYSBidWcgaW4gUmVhY3QsIG9yIGJlY2F1c2UgJyArICdhIGNvbXBvbmVudCByZWFzc2lnbnMgaXRzIG93biBgdGhpcy5wcm9wc2AuICcgKyAnUGxlYXNlIGZpbGUgYW4gaXNzdWUuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaW5pc2hlZFdvcmspIHx8ICdpbnN0YW5jZScpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZS5zdGF0ZSAhPT0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgIGVycm9yKCdFeHBlY3RlZCAlcyBzdGF0ZSB0byBtYXRjaCBtZW1vaXplZCBzdGF0ZSBiZWZvcmUgJyArICdwcm9jZXNzaW5nIHRoZSB1cGRhdGUgcXVldWUuICcgKyAnVGhpcyBtaWdodCBlaXRoZXIgYmUgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBSZWFjdCwgb3IgYmVjYXVzZSAnICsgJ2EgY29tcG9uZW50IHJlYXNzaWducyBpdHMgb3duIGB0aGlzLnN0YXRlYC4gJyArICdQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpbmlzaGVkV29yaykgfHwgJ2luc3RhbmNlJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IC8vIFdlIGNvdWxkIHVwZGF0ZSBpbnN0YW5jZSBwcm9wcyBhbmQgc3RhdGUgaGVyZSxcbiAgICAgICAgICAgIC8vIGJ1dCBpbnN0ZWFkIHdlIHJlbHkgb24gdGhlbSBiZWluZyBzZXQgZHVyaW5nIGxhc3QgcmVuZGVyLlxuICAgICAgICAgICAgLy8gVE9ETzogcmV2aXNpdCB0aGlzIHdoZW4gd2UgaW1wbGVtZW50IHJlc3VtaW5nLlxuXG5cbiAgICAgICAgICAgIGNvbW1pdFVwZGF0ZVF1ZXVlKGZpbmlzaGVkV29yaywgdXBkYXRlUXVldWUsIGluc3RhbmNlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICB7XG4gICAgICAgICAgLy8gVE9ETzogSSB0aGluayB0aGlzIGlzIG5vdyBhbHdheXMgbm9uLW51bGwgYnkgdGhlIHRpbWUgaXQgcmVhY2hlcyB0aGVcbiAgICAgICAgICAvLyBjb21taXQgcGhhc2UuIENvbnNpZGVyIHJlbW92aW5nIHRoZSB0eXBlIGNoZWNrLlxuICAgICAgICAgIHZhciBfdXBkYXRlUXVldWUgPSBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWU7XG5cbiAgICAgICAgICBpZiAoX3VwZGF0ZVF1ZXVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgX2luc3RhbmNlID0gbnVsbDtcblxuICAgICAgICAgICAgaWYgKGZpbmlzaGVkV29yay5jaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICBzd2l0Y2ggKGZpbmlzaGVkV29yay5jaGlsZC50YWcpIHtcbiAgICAgICAgICAgICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAgICAgICAgICAgICBfaW5zdGFuY2UgPSBnZXRQdWJsaWNJbnN0YW5jZShmaW5pc2hlZFdvcmsuY2hpbGQuc3RhdGVOb2RlKTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAgICAgICAgICAgIF9pbnN0YW5jZSA9IGZpbmlzaGVkV29yay5jaGlsZC5zdGF0ZU5vZGU7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb21taXRVcGRhdGVRdWV1ZShmaW5pc2hlZFdvcmssIF91cGRhdGVRdWV1ZSwgX2luc3RhbmNlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgX2luc3RhbmNlMiA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7IC8vIFJlbmRlcmVycyBtYXkgc2NoZWR1bGUgd29yayB0byBiZSBkb25lIGFmdGVyIGhvc3QgY29tcG9uZW50cyBhcmUgbW91bnRlZFxuICAgICAgICAgIC8vIChlZyBET00gcmVuZGVyZXIgbWF5IHNjaGVkdWxlIGF1dG8tZm9jdXMgZm9yIGlucHV0cyBhbmQgZm9ybSBjb250cm9scykuXG4gICAgICAgICAgLy8gVGhlc2UgZWZmZWN0cyBzaG91bGQgb25seSBiZSBjb21taXR0ZWQgd2hlbiBjb21wb25lbnRzIGFyZSBmaXJzdCBtb3VudGVkLFxuICAgICAgICAgIC8vIGFrYSB3aGVuIHRoZXJlIGlzIG5vIGN1cnJlbnQvYWx0ZXJuYXRlLlxuXG4gICAgICAgICAgaWYgKGN1cnJlbnQgPT09IG51bGwgJiYgZmluaXNoZWRXb3JrLmZsYWdzICYgVXBkYXRlKSB7XG4gICAgICAgICAgICB2YXIgdHlwZSA9IGZpbmlzaGVkV29yay50eXBlO1xuICAgICAgICAgICAgdmFyIHByb3BzID0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHM7XG4gICAgICAgICAgICBjb21taXRNb3VudChfaW5zdGFuY2UyLCB0eXBlLCBwcm9wcywgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIEhvc3RUZXh0OlxuICAgICAgICB7XG4gICAgICAgICAgLy8gV2UgaGF2ZSBubyBsaWZlLWN5Y2xlcyBhc3NvY2lhdGVkIHdpdGggdGV4dC5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICAgIHtcbiAgICAgICAgICAvLyBXZSBoYXZlIG5vIGxpZmUtY3ljbGVzIGFzc29jaWF0ZWQgd2l0aCBwb3J0YWxzLlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgUHJvZmlsZXI6XG4gICAgICAgIHtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgX2ZpbmlzaGVkV29yayRtZW1vaXplMiA9IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzLFxuICAgICAgICAgICAgICAgIG9uQ29tbWl0ID0gX2ZpbmlzaGVkV29yayRtZW1vaXplMi5vbkNvbW1pdCxcbiAgICAgICAgICAgICAgICBvblJlbmRlciA9IF9maW5pc2hlZFdvcmskbWVtb2l6ZTIub25SZW5kZXI7XG4gICAgICAgICAgICB2YXIgZWZmZWN0RHVyYXRpb24gPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlLmVmZmVjdER1cmF0aW9uO1xuICAgICAgICAgICAgdmFyIGNvbW1pdFRpbWUgPSBnZXRDb21taXRUaW1lKCk7XG4gICAgICAgICAgICB2YXIgcGhhc2UgPSBjdXJyZW50ID09PSBudWxsID8gJ21vdW50JyA6ICd1cGRhdGUnO1xuXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlmIChpc0N1cnJlbnRVcGRhdGVOZXN0ZWQoKSkge1xuICAgICAgICAgICAgICAgIHBoYXNlID0gJ25lc3RlZC11cGRhdGUnO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb25SZW5kZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgb25SZW5kZXIoZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHMuaWQsIHBoYXNlLCBmaW5pc2hlZFdvcmsuYWN0dWFsRHVyYXRpb24sIGZpbmlzaGVkV29yay50cmVlQmFzZUR1cmF0aW9uLCBmaW5pc2hlZFdvcmsuYWN0dWFsU3RhcnRUaW1lLCBjb21taXRUaW1lKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpZiAodHlwZW9mIG9uQ29tbWl0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgb25Db21taXQoZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHMuaWQsIHBoYXNlLCBlZmZlY3REdXJhdGlvbiwgY29tbWl0VGltZSk7XG4gICAgICAgICAgICAgIH0gLy8gU2NoZWR1bGUgYSBwYXNzaXZlIGVmZmVjdCBmb3IgdGhpcyBQcm9maWxlciB0byBjYWxsIG9uUG9zdENvbW1pdCBob29rcy5cbiAgICAgICAgICAgICAgLy8gVGhpcyBlZmZlY3Qgc2hvdWxkIGJlIHNjaGVkdWxlZCBldmVuIGlmIHRoZXJlIGlzIG5vIG9uUG9zdENvbW1pdCBjYWxsYmFjayBmb3IgdGhpcyBQcm9maWxlcixcbiAgICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGUgZWZmZWN0IGlzIGFsc28gd2hlcmUgdGltZXMgYnViYmxlIHRvIHBhcmVudCBQcm9maWxlcnMuXG5cblxuICAgICAgICAgICAgICBlbnF1ZXVlUGVuZGluZ1Bhc3NpdmVQcm9maWxlckVmZmVjdChmaW5pc2hlZFdvcmspOyAvLyBQcm9wYWdhdGUgbGF5b3V0IGVmZmVjdCBkdXJhdGlvbnMgdG8gdGhlIG5leHQgbmVhcmVzdCBQcm9maWxlciBhbmNlc3Rvci5cbiAgICAgICAgICAgICAgLy8gRG8gbm90IHJlc2V0IHRoZXNlIHZhbHVlcyB1bnRpbCB0aGUgbmV4dCByZW5kZXIgc28gRGV2VG9vbHMgaGFzIGEgY2hhbmNlIHRvIHJlYWQgdGhlbSBmaXJzdC5cblxuICAgICAgICAgICAgICB2YXIgcGFyZW50RmliZXIgPSBmaW5pc2hlZFdvcmsucmV0dXJuO1xuXG4gICAgICAgICAgICAgIG91dGVyOiB3aGlsZSAocGFyZW50RmliZXIgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHBhcmVudEZpYmVyLnRhZykge1xuICAgICAgICAgICAgICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJvb3QgPSBwYXJlbnRGaWJlci5zdGF0ZU5vZGU7XG4gICAgICAgICAgICAgICAgICAgIHJvb3QuZWZmZWN0RHVyYXRpb24gKz0gZWZmZWN0RHVyYXRpb247XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrIG91dGVyO1xuXG4gICAgICAgICAgICAgICAgICBjYXNlIFByb2ZpbGVyOlxuICAgICAgICAgICAgICAgICAgICB2YXIgcGFyZW50U3RhdGVOb2RlID0gcGFyZW50RmliZXIuc3RhdGVOb2RlO1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnRTdGF0ZU5vZGUuZWZmZWN0RHVyYXRpb24gKz0gZWZmZWN0RHVyYXRpb247XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrIG91dGVyO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHBhcmVudEZpYmVyID0gcGFyZW50RmliZXIucmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIGNvbW1pdFN1c3BlbnNlSHlkcmF0aW9uQ2FsbGJhY2tzKGZpbmlzaGVkUm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFN1c3BlbnNlTGlzdENvbXBvbmVudDpcbiAgICAgIGNhc2UgSW5jb21wbGV0ZUNsYXNzQ29tcG9uZW50OlxuICAgICAgY2FzZSBTY29wZUNvbXBvbmVudDpcbiAgICAgIGNhc2UgT2Zmc2NyZWVuQ29tcG9uZW50OlxuICAgICAgY2FzZSBMZWdhY3lIaWRkZW5Db21wb25lbnQ6XG4gICAgICBjYXNlIFRyYWNpbmdNYXJrZXJDb21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgdW5pdCBvZiB3b3JrIHRhZyBzaG91bGQgbm90IGhhdmUgc2lkZS1lZmZlY3RzLiBUaGlzIGVycm9yIGlzICcgKyAnbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCAhb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbikge1xuICAgIHtcbiAgICAgIGlmIChmaW5pc2hlZFdvcmsuZmxhZ3MgJiBSZWYpIHtcbiAgICAgICAgY29tbWl0QXR0YWNoUmVmKGZpbmlzaGVkV29yayk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlYXBwZWFyTGF5b3V0RWZmZWN0c09uRmliZXIobm9kZSkge1xuICAvLyBUdXJuIG9uIGxheW91dCBlZmZlY3RzIGluIGEgdHJlZSB0aGF0IHByZXZpb3VzbHkgZGlzYXBwZWFyZWQuXG4gIC8vIFRPRE8gKE9mZnNjcmVlbikgQ2hlY2s6IGZsYWdzICYgTGF5b3V0U3RhdGljXG4gIHN3aXRjaCAobm9kZS50YWcpIHtcbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIGlmICggbm9kZS5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgc3RhcnRMYXlvdXRFZmZlY3RUaW1lcigpO1xuICAgICAgICAgICAgc2FmZWx5Q2FsbENvbW1pdEhvb2tMYXlvdXRFZmZlY3RMaXN0TW91bnQobm9kZSwgbm9kZS5yZXR1cm4pO1xuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICByZWNvcmRMYXlvdXRFZmZlY3REdXJhdGlvbihub2RlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2FmZWx5Q2FsbENvbW1pdEhvb2tMYXlvdXRFZmZlY3RMaXN0TW91bnQobm9kZSwgbm9kZS5yZXR1cm4pO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSBub2RlLnN0YXRlTm9kZTtcblxuICAgICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZE1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgc2FmZWx5Q2FsbENvbXBvbmVudERpZE1vdW50KG5vZGUsIG5vZGUucmV0dXJuLCBpbnN0YW5jZSk7XG4gICAgICAgIH1cblxuICAgICAgICBzYWZlbHlBdHRhY2hSZWYobm9kZSwgbm9kZS5yZXR1cm4pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgc2FmZWx5QXR0YWNoUmVmKG5vZGUsIG5vZGUucmV0dXJuKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaGlkZU9yVW5oaWRlQWxsQ2hpbGRyZW4oZmluaXNoZWRXb3JrLCBpc0hpZGRlbikge1xuICAvLyBPbmx5IGhpZGUgb3IgdW5oaWRlIHRoZSB0b3AtbW9zdCBob3N0IG5vZGVzLlxuICB2YXIgaG9zdFN1YnRyZWVSb290ID0gbnVsbDtcblxuICBpZiAoc3VwcG9ydHNNdXRhdGlvbikge1xuICAgIC8vIFdlIG9ubHkgaGF2ZSB0aGUgdG9wIEZpYmVyIHRoYXQgd2FzIGluc2VydGVkIGJ1dCB3ZSBuZWVkIHRvIHJlY3Vyc2UgZG93biBpdHNcbiAgICAvLyBjaGlsZHJlbiB0byBmaW5kIGFsbCB0aGUgdGVybWluYWwgbm9kZXMuXG4gICAgdmFyIG5vZGUgPSBmaW5pc2hlZFdvcms7XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgaWYgKG5vZGUudGFnID09PSBIb3N0Q29tcG9uZW50KSB7XG4gICAgICAgIGlmIChob3N0U3VidHJlZVJvb3QgPT09IG51bGwpIHtcbiAgICAgICAgICBob3N0U3VidHJlZVJvb3QgPSBub2RlO1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBpbnN0YW5jZSA9IG5vZGUuc3RhdGVOb2RlO1xuXG4gICAgICAgICAgICBpZiAoaXNIaWRkZW4pIHtcbiAgICAgICAgICAgICAgaGlkZUluc3RhbmNlKGluc3RhbmNlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHVuaGlkZUluc3RhbmNlKG5vZGUuc3RhdGVOb2RlLCBub2RlLm1lbW9pemVkUHJvcHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAobm9kZS50YWcgPT09IEhvc3RUZXh0KSB7XG4gICAgICAgIGlmIChob3N0U3VidHJlZVJvb3QgPT09IG51bGwpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIF9pbnN0YW5jZTMgPSBub2RlLnN0YXRlTm9kZTtcblxuICAgICAgICAgICAgaWYgKGlzSGlkZGVuKSB7XG4gICAgICAgICAgICAgIGhpZGVUZXh0SW5zdGFuY2UoX2luc3RhbmNlMyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB1bmhpZGVUZXh0SW5zdGFuY2UoX2luc3RhbmNlMywgbm9kZS5tZW1vaXplZFByb3BzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKChub2RlLnRhZyA9PT0gT2Zmc2NyZWVuQ29tcG9uZW50IHx8IG5vZGUudGFnID09PSBMZWdhY3lIaWRkZW5Db21wb25lbnQpICYmIG5vZGUubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbCAmJiBub2RlICE9PSBmaW5pc2hlZFdvcmspIDsgZWxzZSBpZiAobm9kZS5jaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICBub2RlLmNoaWxkLnJldHVybiA9IG5vZGU7XG4gICAgICAgIG5vZGUgPSBub2RlLmNoaWxkO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKG5vZGUgPT09IGZpbmlzaGVkV29yaykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHdoaWxlIChub2RlLnNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgICAgaWYgKG5vZGUucmV0dXJuID09PSBudWxsIHx8IG5vZGUucmV0dXJuID09PSBmaW5pc2hlZFdvcmspIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaG9zdFN1YnRyZWVSb290ID09PSBub2RlKSB7XG4gICAgICAgICAgaG9zdFN1YnRyZWVSb290ID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGhvc3RTdWJ0cmVlUm9vdCA9PT0gbm9kZSkge1xuICAgICAgICBob3N0U3VidHJlZVJvb3QgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgICBub2RlID0gbm9kZS5zaWJsaW5nO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRBdHRhY2hSZWYoZmluaXNoZWRXb3JrKSB7XG4gIHZhciByZWYgPSBmaW5pc2hlZFdvcmsucmVmO1xuXG4gIGlmIChyZWYgIT09IG51bGwpIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlO1xuICAgIHZhciBpbnN0YW5jZVRvVXNlO1xuXG4gICAgc3dpdGNoIChmaW5pc2hlZFdvcmsudGFnKSB7XG4gICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAgIGluc3RhbmNlVG9Vc2UgPSBnZXRQdWJsaWNJbnN0YW5jZShpbnN0YW5jZSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpbnN0YW5jZVRvVXNlID0gaW5zdGFuY2U7XG4gICAgfSAvLyBNb3ZlZCBvdXRzaWRlIHRvIGVuc3VyZSBEQ0Ugd29ya3Mgd2l0aCB0aGlzIGZsYWdcblxuICAgIGlmICh0eXBlb2YgcmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgcmV0VmFsO1xuXG4gICAgICBpZiAoIGZpbmlzaGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBzdGFydExheW91dEVmZmVjdFRpbWVyKCk7XG4gICAgICAgICAgcmV0VmFsID0gcmVmKGluc3RhbmNlVG9Vc2UpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHJlY29yZExheW91dEVmZmVjdER1cmF0aW9uKGZpbmlzaGVkV29yayk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldFZhbCA9IHJlZihpbnN0YW5jZVRvVXNlKTtcbiAgICAgIH1cblxuICAgICAge1xuICAgICAgICBpZiAodHlwZW9mIHJldFZhbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGVycm9yKCdVbmV4cGVjdGVkIHJldHVybiB2YWx1ZSBmcm9tIGEgY2FsbGJhY2sgcmVmIGluICVzLiAnICsgJ0EgY2FsbGJhY2sgcmVmIHNob3VsZCBub3QgcmV0dXJuIGEgZnVuY3Rpb24uJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaW5pc2hlZFdvcmspKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB7XG4gICAgICAgIGlmICghcmVmLmhhc093blByb3BlcnR5KCdjdXJyZW50JykpIHtcbiAgICAgICAgICBlcnJvcignVW5leHBlY3RlZCByZWYgb2JqZWN0IHByb3ZpZGVkIGZvciAlcy4gJyArICdVc2UgZWl0aGVyIGEgcmVmLXNldHRlciBmdW5jdGlvbiBvciBSZWFjdC5jcmVhdGVSZWYoKS4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpbmlzaGVkV29yaykpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJlZi5jdXJyZW50ID0gaW5zdGFuY2VUb1VzZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZGV0YWNoRmliZXJNdXRhdGlvbihmaWJlcikge1xuICAvLyBDdXQgb2ZmIHRoZSByZXR1cm4gcG9pbnRlciB0byBkaXNjb25uZWN0IGl0IGZyb20gdGhlIHRyZWUuXG4gIC8vIFRoaXMgZW5hYmxlcyB1cyB0byBkZXRlY3QgYW5kIHdhcm4gYWdhaW5zdCBzdGF0ZSB1cGRhdGVzIG9uIGFuIHVubW91bnRlZCBjb21wb25lbnQuXG4gIC8vIEl0IGFsc28gcHJldmVudHMgZXZlbnRzIGZyb20gYnViYmxpbmcgZnJvbSB3aXRoaW4gZGlzY29ubmVjdGVkIGNvbXBvbmVudHMuXG4gIC8vXG4gIC8vIElkZWFsbHksIHdlIHNob3VsZCBhbHNvIGNsZWFyIHRoZSBjaGlsZCBwb2ludGVyIG9mIHRoZSBwYXJlbnQgYWx0ZXJuYXRlIHRvIGxldCB0aGlzXG4gIC8vIGdldCBHQzplZCBidXQgd2UgZG9uJ3Qga25vdyB3aGljaCBmb3Igc3VyZSB3aGljaCBwYXJlbnQgaXMgdGhlIGN1cnJlbnRcbiAgLy8gb25lIHNvIHdlJ2xsIHNldHRsZSBmb3IgR0M6aW5nIHRoZSBzdWJ0cmVlIG9mIHRoaXMgY2hpbGQuXG4gIC8vIFRoaXMgY2hpbGQgaXRzZWxmIHdpbGwgYmUgR0M6ZWQgd2hlbiB0aGUgcGFyZW50IHVwZGF0ZXMgdGhlIG5leHQgdGltZS5cbiAgLy9cbiAgLy8gTm90ZSB0aGF0IHdlIGNhbid0IGNsZWFyIGNoaWxkIG9yIHNpYmxpbmcgcG9pbnRlcnMgeWV0LlxuICAvLyBUaGV5J3JlIG5lZWRlZCBmb3IgcGFzc2l2ZSBlZmZlY3RzIGFuZCBmb3IgZmluZERPTU5vZGUuXG4gIC8vIFdlIGRlZmVyIHRob3NlIGZpZWxkcywgYW5kIGFsbCBvdGhlciBjbGVhbnVwLCB0byB0aGUgcGFzc2l2ZSBwaGFzZSAoc2VlIGRldGFjaEZpYmVyQWZ0ZXJFZmZlY3RzKS5cbiAgLy9cbiAgLy8gRG9uJ3QgcmVzZXQgdGhlIGFsdGVybmF0ZSB5ZXQsIGVpdGhlci4gV2UgbmVlZCB0aGF0IHNvIHdlIGNhbiBkZXRhY2ggdGhlXG4gIC8vIGFsdGVybmF0ZSdzIGZpZWxkcyBpbiB0aGUgcGFzc2l2ZSBwaGFzZS4gQ2xlYXJpbmcgdGhlIHJldHVybiBwb2ludGVyIGlzXG4gIC8vIHN1ZmZpY2llbnQgZm9yIGZpbmRET01Ob2RlIHNlbWFudGljcy5cbiAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTtcblxuICBpZiAoYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgYWx0ZXJuYXRlLnJldHVybiA9IG51bGw7XG4gIH1cblxuICBmaWJlci5yZXR1cm4gPSBudWxsO1xufVxuXG5mdW5jdGlvbiBkZXRhY2hGaWJlckFmdGVyRWZmZWN0cyhmaWJlcikge1xuICB2YXIgYWx0ZXJuYXRlID0gZmliZXIuYWx0ZXJuYXRlO1xuXG4gIGlmIChhbHRlcm5hdGUgIT09IG51bGwpIHtcbiAgICBmaWJlci5hbHRlcm5hdGUgPSBudWxsO1xuICAgIGRldGFjaEZpYmVyQWZ0ZXJFZmZlY3RzKGFsdGVybmF0ZSk7XG4gIH0gLy8gTm90ZTogRGVmZW5zaXZlbHkgdXNpbmcgbmVnYXRpb24gaW5zdGVhZCBvZiA8IGluIGNhc2VcbiAgLy8gYGRlbGV0ZWRUcmVlQ2xlYW5VcExldmVsYCBpcyB1bmRlZmluZWQuXG5cblxuICB7XG4gICAgLy8gQ2xlYXIgY3ljbGljYWwgRmliZXIgZmllbGRzLiBUaGlzIGxldmVsIGFsb25lIGlzIGRlc2lnbmVkIHRvIHJvdWdobHlcbiAgICAvLyBhcHByb3hpbWF0ZSB0aGUgcGxhbm5lZCBGaWJlciByZWZhY3Rvci4gSW4gdGhhdCB3b3JsZCwgYHNldFN0YXRlYCB3aWxsIGJlXG4gICAgLy8gYm91bmQgdG8gYSBzcGVjaWFsIFwiaW5zdGFuY2VcIiBvYmplY3QgaW5zdGVhZCBvZiBhIEZpYmVyLiBUaGUgSW5zdGFuY2VcbiAgICAvLyBvYmplY3Qgd2lsbCBub3QgaGF2ZSBhbnkgb2YgdGhlc2UgZmllbGRzLiBJdCB3aWxsIG9ubHkgYmUgY29ubmVjdGVkIHRvXG4gICAgLy8gdGhlIGZpYmVyIHRyZWUgdmlhIGEgc2luZ2xlIGxpbmsgYXQgdGhlIHJvb3QuIFNvIGlmIHRoaXMgbGV2ZWwgYWxvbmUgaXNcbiAgICAvLyBzdWZmaWNpZW50IHRvIGZpeCBtZW1vcnkgaXNzdWVzLCB0aGF0IGJvZGVzIHdlbGwgZm9yIG91ciBwbGFucy5cbiAgICBmaWJlci5jaGlsZCA9IG51bGw7XG4gICAgZmliZXIuZGVsZXRpb25zID0gbnVsbDtcbiAgICBmaWJlci5zaWJsaW5nID0gbnVsbDsgLy8gVGhlIGBzdGF0ZU5vZGVgIGlzIGN5Y2xpY2FsIGJlY2F1c2Ugb24gaG9zdCBub2RlcyBpdCBwb2ludHMgdG8gdGhlIGhvc3RcbiAgICAvLyB0cmVlLCB3aGljaCBoYXMgaXRzIG93biBwb2ludGVycyB0byBjaGlsZHJlbiwgcGFyZW50cywgYW5kIHNpYmxpbmdzLlxuICAgIC8vIFRoZSBvdGhlciBob3N0IG5vZGVzIGFsc28gcG9pbnQgYmFjayB0byBmaWJlcnMsIHNvIHdlIHNob3VsZCBkZXRhY2ggdGhhdFxuICAgIC8vIG9uZSwgdG9vLlxuXG4gICAgaWYgKGZpYmVyLnRhZyA9PT0gSG9zdENvbXBvbmVudCkge1xuICAgICAgdmFyIGhvc3RJbnN0YW5jZSA9IGZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgaWYgKGhvc3RJbnN0YW5jZSAhPT0gbnVsbCkge1xuICAgICAgICBkZXRhY2hEZWxldGVkSW5zdGFuY2UoaG9zdEluc3RhbmNlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmaWJlci5zdGF0ZU5vZGUgPSBudWxsOyAvLyBJJ20gaW50ZW50aW9uYWxseSBub3QgY2xlYXJpbmcgdGhlIGByZXR1cm5gIGZpZWxkIGluIHRoaXMgbGV2ZWwuIFdlXG4gICAgLy8gYWxyZWFkeSBkaXNjb25uZWN0IHRoZSBgcmV0dXJuYCBwb2ludGVyIGF0IHRoZSByb290IG9mIHRoZSBkZWxldGVkXG4gICAgLy8gc3VidHJlZSAoaW4gYGRldGFjaEZpYmVyTXV0YXRpb25gKS4gQmVzaWRlcywgYHJldHVybmAgYnkgaXRzZWxmIGlzIG5vdFxuICAgIC8vIGN5Y2xpY2FsIFx1MjAxNCBpdCdzIG9ubHkgY3ljbGljYWwgd2hlbiBjb21iaW5lZCB3aXRoIGBjaGlsZGAsIGBzaWJsaW5nYCwgYW5kXG4gICAgLy8gYGFsdGVybmF0ZWAuIEJ1dCB3ZSdsbCBjbGVhciBpdCBpbiB0aGUgbmV4dCBsZXZlbCBhbnl3YXksIGp1c3QgaW4gY2FzZS5cblxuICAgIHtcbiAgICAgIGZpYmVyLl9kZWJ1Z093bmVyID0gbnVsbDtcbiAgICB9XG5cbiAgICB7XG4gICAgICAvLyBUaGVvcmV0aWNhbGx5LCBub3RoaW5nIGluIGhlcmUgc2hvdWxkIGJlIG5lY2Vzc2FyeSwgYmVjYXVzZSB3ZSBhbHJlYWR5XG4gICAgICAvLyBkaXNjb25uZWN0ZWQgdGhlIGZpYmVyIGZyb20gdGhlIHRyZWUuIFNvIGV2ZW4gaWYgc29tZXRoaW5nIGxlYWtzIHRoaXNcbiAgICAgIC8vIHBhcnRpY3VsYXIgZmliZXIsIGl0IHdvbid0IGxlYWsgYW55dGhpbmcgZWxzZVxuICAgICAgLy9cbiAgICAgIC8vIFRoZSBwdXJwb3NlIG9mIHRoaXMgYnJhbmNoIGlzIHRvIGJlIHN1cGVyIGFnZ3Jlc3NpdmUgc28gd2UgY2FuIG1lYXN1cmVcbiAgICAgIC8vIGlmIHRoZXJlJ3MgYW55IGRpZmZlcmVuY2UgaW4gbWVtb3J5IGltcGFjdC4gSWYgdGhlcmUgaXMsIHRoYXQgY291bGRcbiAgICAgIC8vIGluZGljYXRlIGEgUmVhY3QgbGVhayB3ZSBkb24ndCBrbm93IGFib3V0LlxuICAgICAgZmliZXIucmV0dXJuID0gbnVsbDtcbiAgICAgIGZpYmVyLmRlcGVuZGVuY2llcyA9IG51bGw7XG4gICAgICBmaWJlci5tZW1vaXplZFByb3BzID0gbnVsbDtcbiAgICAgIGZpYmVyLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICAgICAgZmliZXIucGVuZGluZ1Byb3BzID0gbnVsbDtcbiAgICAgIGZpYmVyLnN0YXRlTm9kZSA9IG51bGw7IC8vIFRPRE86IE1vdmUgdG8gYGNvbW1pdFBhc3NpdmVVbm1vdW50SW5zaWRlRGVsZXRlZFRyZWVPbkZpYmVyYCBpbnN0ZWFkLlxuXG4gICAgICBmaWJlci51cGRhdGVRdWV1ZSA9IG51bGw7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGVtcHR5UG9ydGFsQ29udGFpbmVyKGN1cnJlbnQpIHtcbiAgaWYgKCFzdXBwb3J0c1BlcnNpc3RlbmNlKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHBvcnRhbCA9IGN1cnJlbnQuc3RhdGVOb2RlO1xuICB2YXIgY29udGFpbmVySW5mbyA9IHBvcnRhbC5jb250YWluZXJJbmZvO1xuICB2YXIgZW1wdHlDaGlsZFNldCA9IGNyZWF0ZUNvbnRhaW5lckNoaWxkU2V0KGNvbnRhaW5lckluZm8pO1xuICByZXBsYWNlQ29udGFpbmVyQ2hpbGRyZW4oY29udGFpbmVySW5mbywgZW1wdHlDaGlsZFNldCk7XG59XG5cbmZ1bmN0aW9uIGdldEhvc3RQYXJlbnRGaWJlcihmaWJlcikge1xuICB2YXIgcGFyZW50ID0gZmliZXIucmV0dXJuO1xuXG4gIHdoaWxlIChwYXJlbnQgIT09IG51bGwpIHtcbiAgICBpZiAoaXNIb3N0UGFyZW50KHBhcmVudCkpIHtcbiAgICAgIHJldHVybiBwYXJlbnQ7XG4gICAgfVxuXG4gICAgcGFyZW50ID0gcGFyZW50LnJldHVybjtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdG8gZmluZCBhIGhvc3QgcGFyZW50LiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgJyArICdpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG59XG5cbmZ1bmN0aW9uIGlzSG9zdFBhcmVudChmaWJlcikge1xuICByZXR1cm4gZmliZXIudGFnID09PSBIb3N0Q29tcG9uZW50IHx8IGZpYmVyLnRhZyA9PT0gSG9zdFJvb3QgfHwgZmliZXIudGFnID09PSBIb3N0UG9ydGFsO1xufVxuXG5mdW5jdGlvbiBnZXRIb3N0U2libGluZyhmaWJlcikge1xuICAvLyBXZSdyZSBnb2luZyB0byBzZWFyY2ggZm9yd2FyZCBpbnRvIHRoZSB0cmVlIHVudGlsIHdlIGZpbmQgYSBzaWJsaW5nIGhvc3RcbiAgLy8gbm9kZS4gVW5mb3J0dW5hdGVseSwgaWYgbXVsdGlwbGUgaW5zZXJ0aW9ucyBhcmUgZG9uZSBpbiBhIHJvdyB3ZSBoYXZlIHRvXG4gIC8vIHNlYXJjaCBwYXN0IHRoZW0uIFRoaXMgbGVhZHMgdG8gZXhwb25lbnRpYWwgc2VhcmNoIGZvciB0aGUgbmV4dCBzaWJsaW5nLlxuICAvLyBUT0RPOiBGaW5kIGEgbW9yZSBlZmZpY2llbnQgd2F5IHRvIGRvIHRoaXMuXG4gIHZhciBub2RlID0gZmliZXI7XG5cbiAgc2libGluZ3M6IHdoaWxlICh0cnVlKSB7XG4gICAgLy8gSWYgd2UgZGlkbid0IGZpbmQgYW55dGhpbmcsIGxldCdzIHRyeSB0aGUgbmV4dCBzaWJsaW5nLlxuICAgIHdoaWxlIChub2RlLnNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgIGlmIChub2RlLnJldHVybiA9PT0gbnVsbCB8fCBpc0hvc3RQYXJlbnQobm9kZS5yZXR1cm4pKSB7XG4gICAgICAgIC8vIElmIHdlIHBvcCBvdXQgb2YgdGhlIHJvb3Qgb3IgaGl0IHRoZSBwYXJlbnQgdGhlIGZpYmVyIHdlIGFyZSB0aGVcbiAgICAgICAgLy8gbGFzdCBzaWJsaW5nLlxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgIH1cblxuICAgIG5vZGUuc2libGluZy5yZXR1cm4gPSBub2RlLnJldHVybjtcbiAgICBub2RlID0gbm9kZS5zaWJsaW5nO1xuXG4gICAgd2hpbGUgKG5vZGUudGFnICE9PSBIb3N0Q29tcG9uZW50ICYmIG5vZGUudGFnICE9PSBIb3N0VGV4dCAmJiBub2RlLnRhZyAhPT0gRGVoeWRyYXRlZEZyYWdtZW50KSB7XG4gICAgICAvLyBJZiBpdCBpcyBub3QgaG9zdCBub2RlIGFuZCwgd2UgbWlnaHQgaGF2ZSBhIGhvc3Qgbm9kZSBpbnNpZGUgaXQuXG4gICAgICAvLyBUcnkgdG8gc2VhcmNoIGRvd24gdW50aWwgd2UgZmluZCBvbmUuXG4gICAgICBpZiAobm9kZS5mbGFncyAmIFBsYWNlbWVudCkge1xuICAgICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGEgY2hpbGQsIHRyeSB0aGUgc2libGluZ3MgaW5zdGVhZC5cbiAgICAgICAgY29udGludWUgc2libGluZ3M7XG4gICAgICB9IC8vIElmIHdlIGRvbid0IGhhdmUgYSBjaGlsZCwgdHJ5IHRoZSBzaWJsaW5ncyBpbnN0ZWFkLlxuICAgICAgLy8gV2UgYWxzbyBza2lwIHBvcnRhbHMgYmVjYXVzZSB0aGV5IGFyZSBub3QgcGFydCBvZiB0aGlzIGhvc3QgdHJlZS5cblxuXG4gICAgICBpZiAobm9kZS5jaGlsZCA9PT0gbnVsbCB8fCBub2RlLnRhZyA9PT0gSG9zdFBvcnRhbCkge1xuICAgICAgICBjb250aW51ZSBzaWJsaW5ncztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5vZGUuY2hpbGQucmV0dXJuID0gbm9kZTtcbiAgICAgICAgbm9kZSA9IG5vZGUuY2hpbGQ7XG4gICAgICB9XG4gICAgfSAvLyBDaGVjayBpZiB0aGlzIGhvc3Qgbm9kZSBpcyBzdGFibGUgb3IgYWJvdXQgdG8gYmUgcGxhY2VkLlxuXG5cbiAgICBpZiAoIShub2RlLmZsYWdzICYgUGxhY2VtZW50KSkge1xuICAgICAgLy8gRm91bmQgaXQhXG4gICAgICByZXR1cm4gbm9kZS5zdGF0ZU5vZGU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFBsYWNlbWVudChmaW5pc2hlZFdvcmspIHtcbiAgaWYgKCFzdXBwb3J0c011dGF0aW9uKSB7XG4gICAgcmV0dXJuO1xuICB9IC8vIFJlY3Vyc2l2ZWx5IGluc2VydCBhbGwgaG9zdCBub2RlcyBpbnRvIHRoZSBwYXJlbnQuXG5cblxuICB2YXIgcGFyZW50RmliZXIgPSBnZXRIb3N0UGFyZW50RmliZXIoZmluaXNoZWRXb3JrKTsgLy8gTm90ZTogdGhlc2UgdHdvIHZhcmlhYmxlcyAqbXVzdCogYWx3YXlzIGJlIHVwZGF0ZWQgdG9nZXRoZXIuXG5cbiAgc3dpdGNoIChwYXJlbnRGaWJlci50YWcpIHtcbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBwYXJlbnQgPSBwYXJlbnRGaWJlci5zdGF0ZU5vZGU7XG5cbiAgICAgICAgaWYgKHBhcmVudEZpYmVyLmZsYWdzICYgQ29udGVudFJlc2V0KSB7XG4gICAgICAgICAgLy8gUmVzZXQgdGhlIHRleHQgY29udGVudCBvZiB0aGUgcGFyZW50IGJlZm9yZSBkb2luZyBhbnkgaW5zZXJ0aW9uc1xuICAgICAgICAgIHJlc2V0VGV4dENvbnRlbnQocGFyZW50KTsgLy8gQ2xlYXIgQ29udGVudFJlc2V0IGZyb20gdGhlIGVmZmVjdCB0YWdcblxuICAgICAgICAgIHBhcmVudEZpYmVyLmZsYWdzICY9IH5Db250ZW50UmVzZXQ7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgYmVmb3JlID0gZ2V0SG9zdFNpYmxpbmcoZmluaXNoZWRXb3JrKTsgLy8gV2Ugb25seSBoYXZlIHRoZSB0b3AgRmliZXIgdGhhdCB3YXMgaW5zZXJ0ZWQgYnV0IHdlIG5lZWQgdG8gcmVjdXJzZSBkb3duIGl0c1xuICAgICAgICAvLyBjaGlsZHJlbiB0byBmaW5kIGFsbCB0aGUgdGVybWluYWwgbm9kZXMuXG5cbiAgICAgICAgaW5zZXJ0T3JBcHBlbmRQbGFjZW1lbnROb2RlKGZpbmlzaGVkV29yaywgYmVmb3JlLCBwYXJlbnQpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAge1xuICAgICAgICB2YXIgX3BhcmVudCA9IHBhcmVudEZpYmVyLnN0YXRlTm9kZS5jb250YWluZXJJbmZvO1xuXG4gICAgICAgIHZhciBfYmVmb3JlID0gZ2V0SG9zdFNpYmxpbmcoZmluaXNoZWRXb3JrKTtcblxuICAgICAgICBpbnNlcnRPckFwcGVuZFBsYWNlbWVudE5vZGVJbnRvQ29udGFpbmVyKGZpbmlzaGVkV29yaywgX2JlZm9yZSwgX3BhcmVudCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZS1uby1mYWxsdGhyb3VnaFxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBob3N0IHBhcmVudCBmaWJlci4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnICcgKyAnaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGluc2VydE9yQXBwZW5kUGxhY2VtZW50Tm9kZUludG9Db250YWluZXIobm9kZSwgYmVmb3JlLCBwYXJlbnQpIHtcbiAgdmFyIHRhZyA9IG5vZGUudGFnO1xuICB2YXIgaXNIb3N0ID0gdGFnID09PSBIb3N0Q29tcG9uZW50IHx8IHRhZyA9PT0gSG9zdFRleHQ7XG5cbiAgaWYgKGlzSG9zdCkge1xuICAgIHZhciBzdGF0ZU5vZGUgPSBub2RlLnN0YXRlTm9kZTtcblxuICAgIGlmIChiZWZvcmUpIHtcbiAgICAgIGluc2VydEluQ29udGFpbmVyQmVmb3JlKHBhcmVudCwgc3RhdGVOb2RlLCBiZWZvcmUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcHBlbmRDaGlsZFRvQ29udGFpbmVyKHBhcmVudCwgc3RhdGVOb2RlKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodGFnID09PSBIb3N0UG9ydGFsKSA7IGVsc2Uge1xuICAgIHZhciBjaGlsZCA9IG5vZGUuY2hpbGQ7XG5cbiAgICBpZiAoY2hpbGQgIT09IG51bGwpIHtcbiAgICAgIGluc2VydE9yQXBwZW5kUGxhY2VtZW50Tm9kZUludG9Db250YWluZXIoY2hpbGQsIGJlZm9yZSwgcGFyZW50KTtcbiAgICAgIHZhciBzaWJsaW5nID0gY2hpbGQuc2libGluZztcblxuICAgICAgd2hpbGUgKHNpYmxpbmcgIT09IG51bGwpIHtcbiAgICAgICAgaW5zZXJ0T3JBcHBlbmRQbGFjZW1lbnROb2RlSW50b0NvbnRhaW5lcihzaWJsaW5nLCBiZWZvcmUsIHBhcmVudCk7XG4gICAgICAgIHNpYmxpbmcgPSBzaWJsaW5nLnNpYmxpbmc7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGluc2VydE9yQXBwZW5kUGxhY2VtZW50Tm9kZShub2RlLCBiZWZvcmUsIHBhcmVudCkge1xuICB2YXIgdGFnID0gbm9kZS50YWc7XG4gIHZhciBpc0hvc3QgPSB0YWcgPT09IEhvc3RDb21wb25lbnQgfHwgdGFnID09PSBIb3N0VGV4dDtcblxuICBpZiAoaXNIb3N0KSB7XG4gICAgdmFyIHN0YXRlTm9kZSA9IG5vZGUuc3RhdGVOb2RlO1xuXG4gICAgaWYgKGJlZm9yZSkge1xuICAgICAgaW5zZXJ0QmVmb3JlKHBhcmVudCwgc3RhdGVOb2RlLCBiZWZvcmUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcHBlbmRDaGlsZChwYXJlbnQsIHN0YXRlTm9kZSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHRhZyA9PT0gSG9zdFBvcnRhbCkgOyBlbHNlIHtcbiAgICB2YXIgY2hpbGQgPSBub2RlLmNoaWxkO1xuXG4gICAgaWYgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICBpbnNlcnRPckFwcGVuZFBsYWNlbWVudE5vZGUoY2hpbGQsIGJlZm9yZSwgcGFyZW50KTtcbiAgICAgIHZhciBzaWJsaW5nID0gY2hpbGQuc2libGluZztcblxuICAgICAgd2hpbGUgKHNpYmxpbmcgIT09IG51bGwpIHtcbiAgICAgICAgaW5zZXJ0T3JBcHBlbmRQbGFjZW1lbnROb2RlKHNpYmxpbmcsIGJlZm9yZSwgcGFyZW50KTtcbiAgICAgICAgc2libGluZyA9IHNpYmxpbmcuc2libGluZztcbiAgICAgIH1cbiAgICB9XG4gIH1cbn0gLy8gVGhlc2UgYXJlIHRyYWNrZWQgb24gdGhlIHN0YWNrIGFzIHdlIHJlY3Vyc2l2ZWx5IHRyYXZlcnNlIGFcbi8vIGRlbGV0ZWQgc3VidHJlZS5cbi8vIFRPRE86IFVwZGF0ZSB0aGVzZSBkdXJpbmcgdGhlIHdob2xlIG11dGF0aW9uIHBoYXNlLCBub3QganVzdCBkdXJpbmdcbi8vIGEgZGVsZXRpb24uXG5cblxudmFyIGhvc3RQYXJlbnQgPSBudWxsO1xudmFyIGhvc3RQYXJlbnRJc0NvbnRhaW5lciA9IGZhbHNlO1xuXG5mdW5jdGlvbiBjb21taXREZWxldGlvbkVmZmVjdHMocm9vdCwgcmV0dXJuRmliZXIsIGRlbGV0ZWRGaWJlcikge1xuICBpZiAoc3VwcG9ydHNNdXRhdGlvbikge1xuICAgIC8vIFdlIG9ubHkgaGF2ZSB0aGUgdG9wIEZpYmVyIHRoYXQgd2FzIGRlbGV0ZWQgYnV0IHdlIG5lZWQgdG8gcmVjdXJzZSBkb3duIGl0c1xuICAgIC8vIGNoaWxkcmVuIHRvIGZpbmQgYWxsIHRoZSB0ZXJtaW5hbCBub2Rlcy5cbiAgICAvLyBSZWN1cnNpdmVseSBkZWxldGUgYWxsIGhvc3Qgbm9kZXMgZnJvbSB0aGUgcGFyZW50LCBkZXRhY2ggcmVmcywgY2xlYW5cbiAgICAvLyB1cCBtb3VudGVkIGxheW91dCBlZmZlY3RzLCBhbmQgY2FsbCBjb21wb25lbnRXaWxsVW5tb3VudC5cbiAgICAvLyBXZSBvbmx5IG5lZWQgdG8gcmVtb3ZlIHRoZSB0b3Btb3N0IGhvc3QgY2hpbGQgaW4gZWFjaCBicmFuY2guIEJ1dCB0aGVuIHdlXG4gICAgLy8gc3RpbGwgbmVlZCB0byBrZWVwIHRyYXZlcnNpbmcgdG8gdW5tb3VudCBlZmZlY3RzLCByZWZzLCBhbmQgY1dVLiBUT0RPOiBXZVxuICAgIC8vIGNvdWxkIHNwbGl0IHRoaXMgaW50byB0d28gc2VwYXJhdGUgdHJhdmVyc2FscyBmdW5jdGlvbnMsIHdoZXJlIHRoZSBzZWNvbmRcbiAgICAvLyBvbmUgZG9lc24ndCBpbmNsdWRlIGFueSByZW1vdmVDaGlsZCBsb2dpYy4gVGhpcyBpcyBtYXliZSB0aGUgc2FtZVxuICAgIC8vIGZ1bmN0aW9uIGFzIFwiZGlzYXBwZWFyTGF5b3V0RWZmZWN0c1wiIChvciB3aGF0ZXZlciB0aGF0IHR1cm5zIGludG8gYWZ0ZXJcbiAgICAvLyB0aGUgbGF5b3V0IHBoYXNlIGlzIHJlZmFjdG9yZWQgdG8gdXNlIHJlY3Vyc2lvbikuXG4gICAgLy8gQmVmb3JlIHN0YXJ0aW5nLCBmaW5kIHRoZSBuZWFyZXN0IGhvc3QgcGFyZW50IG9uIHRoZSBzdGFjayBzbyB3ZSBrbm93XG4gICAgLy8gd2hpY2ggaW5zdGFuY2UvY29udGFpbmVyIHRvIHJlbW92ZSB0aGUgY2hpbGRyZW4gZnJvbS5cbiAgICAvLyBUT0RPOiBJbnN0ZWFkIG9mIHNlYXJjaGluZyB1cCB0aGUgZmliZXIgcmV0dXJuIHBhdGggb24gZXZlcnkgZGVsZXRpb24sIHdlXG4gICAgLy8gY2FuIHRyYWNrIHRoZSBuZWFyZXN0IGhvc3QgY29tcG9uZW50IG9uIHRoZSBKUyBzdGFjayBhcyB3ZSB0cmF2ZXJzZSB0aGVcbiAgICAvLyB0cmVlIGR1cmluZyB0aGUgY29tbWl0IHBoYXNlLiBUaGlzIHdvdWxkIG1ha2UgaW5zZXJ0aW9ucyBmYXN0ZXIsIHRvby5cbiAgICB2YXIgcGFyZW50ID0gcmV0dXJuRmliZXI7XG5cbiAgICBmaW5kUGFyZW50OiB3aGlsZSAocGFyZW50ICE9PSBudWxsKSB7XG4gICAgICBzd2l0Y2ggKHBhcmVudC50YWcpIHtcbiAgICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGhvc3RQYXJlbnQgPSBwYXJlbnQuc3RhdGVOb2RlO1xuICAgICAgICAgICAgaG9zdFBhcmVudElzQ29udGFpbmVyID0gZmFsc2U7XG4gICAgICAgICAgICBicmVhayBmaW5kUGFyZW50O1xuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGhvc3RQYXJlbnQgPSBwYXJlbnQuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG4gICAgICAgICAgICBob3N0UGFyZW50SXNDb250YWluZXIgPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWsgZmluZFBhcmVudDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGhvc3RQYXJlbnQgPSBwYXJlbnQuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG4gICAgICAgICAgICBob3N0UGFyZW50SXNDb250YWluZXIgPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWsgZmluZFBhcmVudDtcbiAgICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHBhcmVudCA9IHBhcmVudC5yZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGhvc3RQYXJlbnQgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdG8gZmluZCBhIGhvc3QgcGFyZW50LiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgJyArICdhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuXG4gICAgY29tbWl0RGVsZXRpb25FZmZlY3RzT25GaWJlcihyb290LCByZXR1cm5GaWJlciwgZGVsZXRlZEZpYmVyKTtcbiAgICBob3N0UGFyZW50ID0gbnVsbDtcbiAgICBob3N0UGFyZW50SXNDb250YWluZXIgPSBmYWxzZTtcbiAgfSBlbHNlIHtcbiAgICAvLyBEZXRhY2ggcmVmcyBhbmQgY2FsbCBjb21wb25lbnRXaWxsVW5tb3VudCgpIG9uIHRoZSB3aG9sZSBzdWJ0cmVlLlxuICAgIGNvbW1pdERlbGV0aW9uRWZmZWN0c09uRmliZXIocm9vdCwgcmV0dXJuRmliZXIsIGRlbGV0ZWRGaWJlcik7XG4gIH1cblxuICBkZXRhY2hGaWJlck11dGF0aW9uKGRlbGV0ZWRGaWJlcik7XG59XG5cbmZ1bmN0aW9uIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEZWxldGlvbkVmZmVjdHMoZmluaXNoZWRSb290LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBwYXJlbnQpIHtcbiAgLy8gVE9ETzogVXNlIGEgc3RhdGljIGZsYWcgdG8gc2tpcCB0cmVlcyB0aGF0IGRvbid0IGhhdmUgdW5tb3VudCBlZmZlY3RzXG4gIHZhciBjaGlsZCA9IHBhcmVudC5jaGlsZDtcblxuICB3aGlsZSAoY2hpbGQgIT09IG51bGwpIHtcbiAgICBjb21taXREZWxldGlvbkVmZmVjdHNPbkZpYmVyKGZpbmlzaGVkUm9vdCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgY2hpbGQpO1xuICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXREZWxldGlvbkVmZmVjdHNPbkZpYmVyKGZpbmlzaGVkUm9vdCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVsZXRlZEZpYmVyKSB7XG4gIG9uQ29tbWl0VW5tb3VudChkZWxldGVkRmliZXIpOyAvLyBUaGUgY2FzZXMgaW4gdGhpcyBvdXRlciBzd2l0Y2ggbW9kaWZ5IHRoZSBzdGFjayBiZWZvcmUgdGhleSB0cmF2ZXJzZVxuICAvLyBpbnRvIHRoZWlyIHN1YnRyZWUuIFRoZXJlIGFyZSBzaW1wbGVyIGNhc2VzIGluIHRoZSBpbm5lciBzd2l0Y2hcbiAgLy8gdGhhdCBkb24ndCBtb2RpZnkgdGhlIHN0YWNrLlxuXG4gIHN3aXRjaCAoZGVsZXRlZEZpYmVyLnRhZykge1xuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgaWYgKCFvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuKSB7XG4gICAgICAgICAgc2FmZWx5RGV0YWNoUmVmKGRlbGV0ZWRGaWJlciwgbmVhcmVzdE1vdW50ZWRBbmNlc3Rvcik7XG4gICAgICAgIH0gLy8gSW50ZW50aW9uYWwgZmFsbHRocm91Z2ggdG8gbmV4dCBicmFuY2hcblxuICAgICAgfVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZS1uby1mYWxsdGhyb3VnaFxuXG4gICAgY2FzZSBIb3N0VGV4dDpcbiAgICAgIHtcbiAgICAgICAgLy8gV2Ugb25seSBuZWVkIHRvIHJlbW92ZSB0aGUgbmVhcmVzdCBob3N0IGNoaWxkLiBTZXQgdGhlIGhvc3QgcGFyZW50XG4gICAgICAgIC8vIHRvIGBudWxsYCBvbiB0aGUgc3RhY2sgdG8gaW5kaWNhdGUgdGhhdCBuZXN0ZWQgY2hpbGRyZW4gZG9uJ3RcbiAgICAgICAgLy8gbmVlZCB0byBiZSByZW1vdmVkLlxuICAgICAgICBpZiAoc3VwcG9ydHNNdXRhdGlvbikge1xuICAgICAgICAgIHZhciBwcmV2SG9zdFBhcmVudCA9IGhvc3RQYXJlbnQ7XG4gICAgICAgICAgdmFyIHByZXZIb3N0UGFyZW50SXNDb250YWluZXIgPSBob3N0UGFyZW50SXNDb250YWluZXI7XG4gICAgICAgICAgaG9zdFBhcmVudCA9IG51bGw7XG4gICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZURlbGV0aW9uRWZmZWN0cyhmaW5pc2hlZFJvb3QsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlbGV0ZWRGaWJlcik7XG4gICAgICAgICAgaG9zdFBhcmVudCA9IHByZXZIb3N0UGFyZW50O1xuICAgICAgICAgIGhvc3RQYXJlbnRJc0NvbnRhaW5lciA9IHByZXZIb3N0UGFyZW50SXNDb250YWluZXI7XG5cbiAgICAgICAgICBpZiAoaG9zdFBhcmVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gTm93IHRoYXQgYWxsIHRoZSBjaGlsZCBlZmZlY3RzIGhhdmUgdW5tb3VudGVkLCB3ZSBjYW4gcmVtb3ZlIHRoZVxuICAgICAgICAgICAgLy8gbm9kZSBmcm9tIHRoZSB0cmVlLlxuICAgICAgICAgICAgaWYgKGhvc3RQYXJlbnRJc0NvbnRhaW5lcikge1xuICAgICAgICAgICAgICByZW1vdmVDaGlsZEZyb21Db250YWluZXIoaG9zdFBhcmVudCwgZGVsZXRlZEZpYmVyLnN0YXRlTm9kZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZW1vdmVDaGlsZChob3N0UGFyZW50LCBkZWxldGVkRmliZXIuc3RhdGVOb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZURlbGV0aW9uRWZmZWN0cyhmaW5pc2hlZFJvb3QsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlbGV0ZWRGaWJlcik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIERlaHlkcmF0ZWRGcmFnbWVudDpcbiAgICAgIHtcbiAgICAgICAgLy8gRGVsZXRlIHRoZSBkZWh5ZHJhdGVkIHN1c3BlbnNlIGJvdW5kYXJ5IGFuZCBhbGwgb2YgaXRzIGNvbnRlbnQuXG5cblxuICAgICAgICBpZiAoc3VwcG9ydHNNdXRhdGlvbikge1xuICAgICAgICAgIGlmIChob3N0UGFyZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoaG9zdFBhcmVudElzQ29udGFpbmVyKSB7XG4gICAgICAgICAgICAgIGNsZWFyU3VzcGVuc2VCb3VuZGFyeUZyb21Db250YWluZXIoaG9zdFBhcmVudCwgZGVsZXRlZEZpYmVyLnN0YXRlTm9kZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjbGVhclN1c3BlbnNlQm91bmRhcnkoaG9zdFBhcmVudCwgZGVsZXRlZEZpYmVyLnN0YXRlTm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAge1xuICAgICAgICBpZiAoc3VwcG9ydHNNdXRhdGlvbikge1xuICAgICAgICAgIC8vIFdoZW4gd2UgZ28gaW50byBhIHBvcnRhbCwgaXQgYmVjb21lcyB0aGUgcGFyZW50IHRvIHJlbW92ZSBmcm9tLlxuICAgICAgICAgIHZhciBfcHJldkhvc3RQYXJlbnQgPSBob3N0UGFyZW50O1xuICAgICAgICAgIHZhciBfcHJldkhvc3RQYXJlbnRJc0NvbnRhaW5lciA9IGhvc3RQYXJlbnRJc0NvbnRhaW5lcjtcbiAgICAgICAgICBob3N0UGFyZW50ID0gZGVsZXRlZEZpYmVyLnN0YXRlTm9kZS5jb250YWluZXJJbmZvO1xuICAgICAgICAgIGhvc3RQYXJlbnRJc0NvbnRhaW5lciA9IHRydWU7XG4gICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZURlbGV0aW9uRWZmZWN0cyhmaW5pc2hlZFJvb3QsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlbGV0ZWRGaWJlcik7XG4gICAgICAgICAgaG9zdFBhcmVudCA9IF9wcmV2SG9zdFBhcmVudDtcbiAgICAgICAgICBob3N0UGFyZW50SXNDb250YWluZXIgPSBfcHJldkhvc3RQYXJlbnRJc0NvbnRhaW5lcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlbXB0eVBvcnRhbENvbnRhaW5lcihkZWxldGVkRmliZXIpO1xuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEZWxldGlvbkVmZmVjdHMoZmluaXNoZWRSb290LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZWxldGVkRmliZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgY2FzZSBNZW1vQ29tcG9uZW50OlxuICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgaWYgKCFvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuKSB7XG4gICAgICAgICAgdmFyIHVwZGF0ZVF1ZXVlID0gZGVsZXRlZEZpYmVyLnVwZGF0ZVF1ZXVlO1xuXG4gICAgICAgICAgaWYgKHVwZGF0ZVF1ZXVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgbGFzdEVmZmVjdCA9IHVwZGF0ZVF1ZXVlLmxhc3RFZmZlY3Q7XG5cbiAgICAgICAgICAgIGlmIChsYXN0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIHZhciBmaXJzdEVmZmVjdCA9IGxhc3RFZmZlY3QubmV4dDtcbiAgICAgICAgICAgICAgdmFyIGVmZmVjdCA9IGZpcnN0RWZmZWN0O1xuXG4gICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICB2YXIgX2VmZmVjdCA9IGVmZmVjdCxcbiAgICAgICAgICAgICAgICAgICAgZGVzdHJveSA9IF9lZmZlY3QuZGVzdHJveSxcbiAgICAgICAgICAgICAgICAgICAgdGFnID0gX2VmZmVjdC50YWc7XG5cbiAgICAgICAgICAgICAgICBpZiAoZGVzdHJveSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoKHRhZyAmIEluc2VydGlvbikgIT09IE5vRmxhZ3MkMSkge1xuICAgICAgICAgICAgICAgICAgICBzYWZlbHlDYWxsRGVzdHJveShkZWxldGVkRmliZXIsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlc3Ryb3kpO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodGFnICYgTGF5b3V0KSAhPT0gTm9GbGFncyQxKSB7XG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBtYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0VW5tb3VudFN0YXJ0ZWQoZGVsZXRlZEZpYmVyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmICggZGVsZXRlZEZpYmVyLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0TGF5b3V0RWZmZWN0VGltZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICBzYWZlbHlDYWxsRGVzdHJveShkZWxldGVkRmliZXIsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlc3Ryb3kpO1xuICAgICAgICAgICAgICAgICAgICAgIHJlY29yZExheW91dEVmZmVjdER1cmF0aW9uKGRlbGV0ZWRGaWJlcik7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgc2FmZWx5Q2FsbERlc3Ryb3koZGVsZXRlZEZpYmVyLCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZXN0cm95KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBtYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0VW5tb3VudFN0b3BwZWQoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGVmZmVjdCA9IGVmZmVjdC5uZXh0O1xuICAgICAgICAgICAgICB9IHdoaWxlIChlZmZlY3QgIT09IGZpcnN0RWZmZWN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlRGVsZXRpb25FZmZlY3RzKGZpbmlzaGVkUm9vdCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVsZXRlZEZpYmVyKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgaWYgKCFvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuKSB7XG4gICAgICAgICAgc2FmZWx5RGV0YWNoUmVmKGRlbGV0ZWRGaWJlciwgbmVhcmVzdE1vdW50ZWRBbmNlc3Rvcik7XG4gICAgICAgICAgdmFyIGluc3RhbmNlID0gZGVsZXRlZEZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVubW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHNhZmVseUNhbGxDb21wb25lbnRXaWxsVW5tb3VudChkZWxldGVkRmliZXIsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGluc3RhbmNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlRGVsZXRpb25FZmZlY3RzKGZpbmlzaGVkUm9vdCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVsZXRlZEZpYmVyKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBTY29wZUNvbXBvbmVudDpcbiAgICAgIHtcblxuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlRGVsZXRpb25FZmZlY3RzKGZpbmlzaGVkUm9vdCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVsZXRlZEZpYmVyKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBPZmZzY3JlZW5Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIGlmICggLy8gVE9ETzogUmVtb3ZlIHRoaXMgZGVhZCBmbGFnXG4gICAgICAgICBkZWxldGVkRmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSB7XG4gICAgICAgICAgLy8gSWYgdGhpcyBvZmZzY3JlZW4gY29tcG9uZW50IGlzIGhpZGRlbiwgd2UgYWxyZWFkeSB1bm1vdW50ZWQgaXQuIEJlZm9yZVxuICAgICAgICAgIC8vIGRlbGV0aW5nIHRoZSBjaGlsZHJlbiwgdHJhY2sgdGhhdCBpdCdzIGFscmVhZHkgdW5tb3VudGVkIHNvIHRoYXQgd2VcbiAgICAgICAgICAvLyBkb24ndCBhdHRlbXB0IHRvIHVubW91bnQgdGhlIGVmZmVjdHMgYWdhaW4uXG4gICAgICAgICAgLy8gVE9ETzogSWYgdGhlIHRyZWUgaXMgaGlkZGVuLCBpbiBtb3N0IGNhc2VzIHdlIHNob3VsZCBiZSBhYmxlIHRvIHNraXBcbiAgICAgICAgICAvLyBvdmVyIHRoZSBuZXN0ZWQgY2hpbGRyZW4gZW50aXJlbHkuIEFuIGV4Y2VwdGlvbiBpcyB3ZSBoYXZlbid0IHlldCBmb3VuZFxuICAgICAgICAgIC8vIHRoZSB0b3Btb3N0IGhvc3Qgbm9kZSB0byBkZWxldGUsIHdoaWNoIHdlIGFscmVhZHkgdHJhY2sgb24gdGhlIHN0YWNrLlxuICAgICAgICAgIC8vIEJ1dCB0aGUgb3RoZXIgY2FzZSBpcyBwb3J0YWxzLCB3aGljaCBuZWVkIHRvIGJlIGRldGFjaGVkIG5vIG1hdHRlciBob3dcbiAgICAgICAgICAvLyBkZWVwbHkgdGhleSBhcmUgbmVzdGVkLiBXZSBzaG91bGQgdXNlIGEgc3VidHJlZSBmbGFnIHRvIHRyYWNrIHdoZXRoZXIgYVxuICAgICAgICAgIC8vIHN1YnRyZWUgaW5jbHVkZXMgYSBuZXN0ZWQgcG9ydGFsLlxuICAgICAgICAgIHZhciBwcmV2T2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiA9IG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW47XG4gICAgICAgICAgb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiA9IHByZXZPZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuIHx8IGRlbGV0ZWRGaWJlci5tZW1vaXplZFN0YXRlICE9PSBudWxsO1xuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEZWxldGlvbkVmZmVjdHMoZmluaXNoZWRSb290LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZWxldGVkRmliZXIpO1xuICAgICAgICAgIG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gPSBwcmV2T2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlRGVsZXRpb25FZmZlY3RzKGZpbmlzaGVkUm9vdCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVsZXRlZEZpYmVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHtcbiAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZURlbGV0aW9uRWZmZWN0cyhmaW5pc2hlZFJvb3QsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlbGV0ZWRGaWJlcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRTdXNwZW5zZUNhbGxiYWNrKGZpbmlzaGVkV29yaykge1xuICAvLyBUT0RPOiBNb3ZlIHRoaXMgdG8gcGFzc2l2ZSBwaGFzZVxuICB2YXIgbmV3U3RhdGUgPSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRTdGF0ZTtcbn1cblxuZnVuY3Rpb24gY29tbWl0U3VzcGVuc2VIeWRyYXRpb25DYWxsYmFja3MoZmluaXNoZWRSb290LCBmaW5pc2hlZFdvcmspIHtcbiAgaWYgKCFzdXBwb3J0c0h5ZHJhdGlvbikge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBuZXdTdGF0ZSA9IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlO1xuXG4gIGlmIChuZXdTdGF0ZSA9PT0gbnVsbCkge1xuICAgIHZhciBjdXJyZW50ID0gZmluaXNoZWRXb3JrLmFsdGVybmF0ZTtcblxuICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICB2YXIgcHJldlN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuXG4gICAgICBpZiAocHJldlN0YXRlICE9PSBudWxsKSB7XG4gICAgICAgIHZhciBzdXNwZW5zZUluc3RhbmNlID0gcHJldlN0YXRlLmRlaHlkcmF0ZWQ7XG5cbiAgICAgICAgaWYgKHN1c3BlbnNlSW5zdGFuY2UgIT09IG51bGwpIHtcbiAgICAgICAgICBjb21taXRIeWRyYXRlZFN1c3BlbnNlSW5zdGFuY2Uoc3VzcGVuc2VJbnN0YW5jZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYXR0YWNoU3VzcGVuc2VSZXRyeUxpc3RlbmVycyhmaW5pc2hlZFdvcmspIHtcbiAgLy8gSWYgdGhpcyBib3VuZGFyeSBqdXN0IHRpbWVkIG91dCwgdGhlbiBpdCB3aWxsIGhhdmUgYSBzZXQgb2Ygd2FrZWFibGVzLlxuICAvLyBGb3IgZWFjaCB3YWtlYWJsZSwgYXR0YWNoIGEgbGlzdGVuZXIgc28gdGhhdCB3aGVuIGl0IHJlc29sdmVzLCBSZWFjdFxuICAvLyBhdHRlbXB0cyB0byByZS1yZW5kZXIgdGhlIGJvdW5kYXJ5IGluIHRoZSBwcmltYXJ5IChwcmUtdGltZW91dCkgc3RhdGUuXG4gIHZhciB3YWtlYWJsZXMgPSBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWU7XG5cbiAgaWYgKHdha2VhYmxlcyAhPT0gbnVsbCkge1xuICAgIGZpbmlzaGVkV29yay51cGRhdGVRdWV1ZSA9IG51bGw7XG4gICAgdmFyIHJldHJ5Q2FjaGUgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlO1xuXG4gICAgaWYgKHJldHJ5Q2FjaGUgPT09IG51bGwpIHtcbiAgICAgIHJldHJ5Q2FjaGUgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlID0gbmV3IFBvc3NpYmx5V2Vha1NldCgpO1xuICAgIH1cblxuICAgIHdha2VhYmxlcy5mb3JFYWNoKGZ1bmN0aW9uICh3YWtlYWJsZSkge1xuICAgICAgLy8gTWVtb2l6ZSB1c2luZyB0aGUgYm91bmRhcnkgZmliZXIgdG8gcHJldmVudCByZWR1bmRhbnQgbGlzdGVuZXJzLlxuICAgICAgdmFyIHJldHJ5ID0gcmVzb2x2ZVJldHJ5V2FrZWFibGUuYmluZChudWxsLCBmaW5pc2hlZFdvcmssIHdha2VhYmxlKTtcblxuICAgICAgaWYgKCFyZXRyeUNhY2hlLmhhcyh3YWtlYWJsZSkpIHtcbiAgICAgICAgcmV0cnlDYWNoZS5hZGQod2FrZWFibGUpO1xuXG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoaXNEZXZUb29sc1ByZXNlbnQpIHtcbiAgICAgICAgICAgIGlmIChpblByb2dyZXNzTGFuZXMgIT09IG51bGwgJiYgaW5Qcm9ncmVzc1Jvb3QgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBwZW5kaW5nIHdvcmsgc3RpbGwsIGFzc29jaWF0ZSB0aGUgb3JpZ2luYWwgdXBkYXRlcnMgd2l0aCBpdC5cbiAgICAgICAgICAgICAgcmVzdG9yZVBlbmRpbmdVcGRhdGVycyhpblByb2dyZXNzUm9vdCwgaW5Qcm9ncmVzc0xhbmVzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRocm93IEVycm9yKCdFeHBlY3RlZCBmaW5pc2hlZCByb290IGFuZCBsYW5lcyB0byBiZSBzZXQuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgd2FrZWFibGUudGhlbihyZXRyeSwgcmV0cnkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59IC8vIFRoaXMgZnVuY3Rpb24gZGV0ZWN0cyB3aGVuIGEgU3VzcGVuc2UgYm91bmRhcnkgZ29lcyBmcm9tIHZpc2libGUgdG8gaGlkZGVuLlxuZnVuY3Rpb24gY29tbWl0TXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yaywgY29tbWl0dGVkTGFuZXMpIHtcbiAgaW5Qcm9ncmVzc0xhbmVzID0gY29tbWl0dGVkTGFuZXM7XG4gIGluUHJvZ3Jlc3NSb290ID0gcm9vdDtcbiAgc2V0Q3VycmVudEZpYmVyKGZpbmlzaGVkV29yayk7XG4gIGNvbW1pdE11dGF0aW9uRWZmZWN0c09uRmliZXIoZmluaXNoZWRXb3JrLCByb290KTtcbiAgc2V0Q3VycmVudEZpYmVyKGZpbmlzaGVkV29yayk7XG4gIGluUHJvZ3Jlc3NMYW5lcyA9IG51bGw7XG4gIGluUHJvZ3Jlc3NSb290ID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBwYXJlbnRGaWJlciwgbGFuZXMpIHtcbiAgLy8gRGVsZXRpb25zIGVmZmVjdHMgY2FuIGJlIHNjaGVkdWxlZCBvbiBhbnkgZmliZXIgdHlwZS4gVGhleSBuZWVkIHRvIGhhcHBlblxuICAvLyBiZWZvcmUgdGhlIGNoaWxkcmVuIGVmZmVjdHMgaGFlIGZpcmVkLlxuICB2YXIgZGVsZXRpb25zID0gcGFyZW50RmliZXIuZGVsZXRpb25zO1xuXG4gIGlmIChkZWxldGlvbnMgIT09IG51bGwpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRlbGV0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNoaWxkVG9EZWxldGUgPSBkZWxldGlvbnNbaV07XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbW1pdERlbGV0aW9uRWZmZWN0cyhyb290LCBwYXJlbnRGaWJlciwgY2hpbGRUb0RlbGV0ZSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihjaGlsZFRvRGVsZXRlLCBwYXJlbnRGaWJlciwgZXJyb3IpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBwcmV2RGVidWdGaWJlciA9IGdldEN1cnJlbnRGaWJlcigpO1xuXG4gIGlmIChwYXJlbnRGaWJlci5zdWJ0cmVlRmxhZ3MgJiBNdXRhdGlvbk1hc2spIHtcbiAgICB2YXIgY2hpbGQgPSBwYXJlbnRGaWJlci5jaGlsZDtcblxuICAgIHdoaWxlIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgc2V0Q3VycmVudEZpYmVyKGNoaWxkKTtcbiAgICAgIGNvbW1pdE11dGF0aW9uRWZmZWN0c09uRmliZXIoY2hpbGQsIHJvb3QpO1xuICAgICAgY2hpbGQgPSBjaGlsZC5zaWJsaW5nO1xuICAgIH1cbiAgfVxuXG4gIHNldEN1cnJlbnRGaWJlcihwcmV2RGVidWdGaWJlcik7XG59XG5cbmZ1bmN0aW9uIGNvbW1pdE11dGF0aW9uRWZmZWN0c09uRmliZXIoZmluaXNoZWRXb3JrLCByb290LCBsYW5lcykge1xuICB2YXIgY3VycmVudCA9IGZpbmlzaGVkV29yay5hbHRlcm5hdGU7XG4gIHZhciBmbGFncyA9IGZpbmlzaGVkV29yay5mbGFnczsgLy8gVGhlIGVmZmVjdCBmbGFnIHNob3VsZCBiZSBjaGVja2VkICphZnRlciogd2UgcmVmaW5lIHRoZSB0eXBlIG9mIGZpYmVyLFxuICAvLyBiZWNhdXNlIHRoZSBmaWJlciB0YWcgaXMgbW9yZSBzcGVjaWZpYy4gQW4gZXhjZXB0aW9uIGlzIGFueSBmbGFnIHJlbGF0ZWRcbiAgLy8gdG8gcmVjb25jaWxhdGlvbiwgYmVjYXVzZSB0aG9zZSBjYW4gYmUgc2V0IG9uIGFsbCBmaWJlciB0eXBlcy5cblxuICBzd2l0Y2ggKGZpbmlzaGVkV29yay50YWcpIHtcbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICBjYXNlIE1lbW9Db21wb25lbnQ6XG4gICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuXG4gICAgICAgIGlmIChmbGFncyAmIFVwZGF0ZSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoSW5zZXJ0aW9uIHwgSGFzRWZmZWN0LCBmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4pO1xuICAgICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RNb3VudChJbnNlcnRpb24gfCBIYXNFZmZlY3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgIH0gLy8gTGF5b3V0IGVmZmVjdHMgYXJlIGRlc3Ryb3llZCBkdXJpbmcgdGhlIG11dGF0aW9uIHBoYXNlIHNvIHRoYXQgYWxsXG4gICAgICAgICAgLy8gZGVzdHJveSBmdW5jdGlvbnMgZm9yIGFsbCBmaWJlcnMgYXJlIGNhbGxlZCBiZWZvcmUgYW55IGNyZWF0ZSBmdW5jdGlvbnMuXG4gICAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyBzaWJsaW5nIGNvbXBvbmVudCBlZmZlY3RzIGZyb20gaW50ZXJmZXJpbmcgd2l0aCBlYWNoIG90aGVyLFxuICAgICAgICAgIC8vIGUuZy4gYSBkZXN0cm95IGZ1bmN0aW9uIGluIG9uZSBjb21wb25lbnQgc2hvdWxkIG5ldmVyIG92ZXJyaWRlIGEgcmVmIHNldFxuICAgICAgICAgIC8vIGJ5IGEgY3JlYXRlIGZ1bmN0aW9uIGluIGFub3RoZXIgY29tcG9uZW50IGR1cmluZyB0aGUgc2FtZSBjb21taXQuXG5cblxuICAgICAgICAgIGlmICggZmluaXNoZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgc3RhcnRMYXlvdXRFZmZlY3RUaW1lcigpO1xuICAgICAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoTGF5b3V0IHwgSGFzRWZmZWN0LCBmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlY29yZExheW91dEVmZmVjdER1cmF0aW9uKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0VW5tb3VudChMYXlvdXQgfCBIYXNFZmZlY3QsIGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybik7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuXG4gICAgICAgIGlmIChmbGFncyAmIFJlZikge1xuICAgICAgICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgICBzYWZlbHlEZXRhY2hSZWYoY3VycmVudCwgY3VycmVudC5yZXR1cm4pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKTtcblxuICAgICAgICBpZiAoZmxhZ3MgJiBSZWYpIHtcbiAgICAgICAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgc2FmZWx5RGV0YWNoUmVmKGN1cnJlbnQsIGN1cnJlbnQucmV0dXJuKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3VwcG9ydHNNdXRhdGlvbikge1xuICAgICAgICAgIC8vIFRPRE86IENvbnRlbnRSZXNldCBnZXRzIGNsZWFyZWQgYnkgdGhlIGNoaWxkcmVuIGR1cmluZyB0aGUgY29tbWl0XG4gICAgICAgICAgLy8gcGhhc2UuIFRoaXMgaXMgYSByZWZhY3RvciBoYXphcmQgYmVjYXVzZSBpdCBtZWFucyB3ZSBtdXN0IHJlYWRcbiAgICAgICAgICAvLyBmbGFncyB0aGUgZmxhZ3MgYWZ0ZXIgYGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0c2AgaGFzIGFscmVhZHkgcnVuO1xuICAgICAgICAgIC8vIHRoZSBvcmRlciBtYXR0ZXJzLiBXZSBzaG91bGQgcmVmYWN0b3Igc28gdGhhdCBDb250ZW50UmVzZXQgZG9lcyBub3RcbiAgICAgICAgICAvLyByZWx5IG9uIG11dGF0aW5nIHRoZSBmbGFnIGR1cmluZyBjb21taXQuIExpa2UgYnkgc2V0dGluZyBhIGZsYWdcbiAgICAgICAgICAvLyBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZSBpbnN0ZWFkLlxuICAgICAgICAgIGlmIChmaW5pc2hlZFdvcmsuZmxhZ3MgJiBDb250ZW50UmVzZXQpIHtcbiAgICAgICAgICAgIHZhciBpbnN0YW5jZSA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHJlc2V0VGV4dENvbnRlbnQoaW5zdGFuY2UpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGZsYWdzICYgVXBkYXRlKSB7XG4gICAgICAgICAgICB2YXIgX2luc3RhbmNlNCA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7XG5cbiAgICAgICAgICAgIGlmIChfaW5zdGFuY2U0ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgLy8gQ29tbWl0IHRoZSB3b3JrIHByZXBhcmVkIGVhcmxpZXIuXG4gICAgICAgICAgICAgIHZhciBuZXdQcm9wcyA9IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzOyAvLyBGb3IgaHlkcmF0aW9uIHdlIHJldXNlIHRoZSB1cGRhdGUgcGF0aCBidXQgd2UgdHJlYXQgdGhlIG9sZFByb3BzXG4gICAgICAgICAgICAgIC8vIGFzIHRoZSBuZXdQcm9wcy4gVGhlIHVwZGF0ZVBheWxvYWQgd2lsbCBjb250YWluIHRoZSByZWFsIGNoYW5nZSBpblxuICAgICAgICAgICAgICAvLyB0aGlzIGNhc2UuXG5cbiAgICAgICAgICAgICAgdmFyIG9sZFByb3BzID0gY3VycmVudCAhPT0gbnVsbCA/IGN1cnJlbnQubWVtb2l6ZWRQcm9wcyA6IG5ld1Byb3BzO1xuICAgICAgICAgICAgICB2YXIgdHlwZSA9IGZpbmlzaGVkV29yay50eXBlOyAvLyBUT0RPOiBUeXBlIHRoZSB1cGRhdGVRdWV1ZSB0byBiZSBzcGVjaWZpYyB0byBob3N0IGNvbXBvbmVudHMuXG5cbiAgICAgICAgICAgICAgdmFyIHVwZGF0ZVBheWxvYWQgPSBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWU7XG4gICAgICAgICAgICAgIGZpbmlzaGVkV29yay51cGRhdGVRdWV1ZSA9IG51bGw7XG5cbiAgICAgICAgICAgICAgaWYgKHVwZGF0ZVBheWxvYWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgY29tbWl0VXBkYXRlKF9pbnN0YW5jZTQsIHVwZGF0ZVBheWxvYWQsIHR5cGUsIG9sZFByb3BzLCBuZXdQcm9wcywgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0VGV4dDpcbiAgICAgIHtcbiAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKTtcblxuICAgICAgICBpZiAoZmxhZ3MgJiBVcGRhdGUpIHtcbiAgICAgICAgICBpZiAoc3VwcG9ydHNNdXRhdGlvbikge1xuICAgICAgICAgICAgaWYgKGZpbmlzaGVkV29yay5zdGF0ZU5vZGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIHNob3VsZCBoYXZlIGEgdGV4dCBub2RlIGluaXRpYWxpemVkLiBUaGlzIGVycm9yIGlzIGxpa2VseSAnICsgJ2NhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciB0ZXh0SW5zdGFuY2UgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlO1xuICAgICAgICAgICAgdmFyIG5ld1RleHQgPSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wczsgLy8gRm9yIGh5ZHJhdGlvbiB3ZSByZXVzZSB0aGUgdXBkYXRlIHBhdGggYnV0IHdlIHRyZWF0IHRoZSBvbGRQcm9wc1xuICAgICAgICAgICAgLy8gYXMgdGhlIG5ld1Byb3BzLiBUaGUgdXBkYXRlUGF5bG9hZCB3aWxsIGNvbnRhaW4gdGhlIHJlYWwgY2hhbmdlIGluXG4gICAgICAgICAgICAvLyB0aGlzIGNhc2UuXG5cbiAgICAgICAgICAgIHZhciBvbGRUZXh0ID0gY3VycmVudCAhPT0gbnVsbCA/IGN1cnJlbnQubWVtb2l6ZWRQcm9wcyA6IG5ld1RleHQ7XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbW1pdFRleHRVcGRhdGUodGV4dEluc3RhbmNlLCBvbGRUZXh0LCBuZXdUZXh0KTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICB7XG4gICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzKGZpbmlzaGVkV29yayk7XG5cbiAgICAgICAgaWYgKGZsYWdzICYgVXBkYXRlKSB7XG4gICAgICAgICAgaWYgKHN1cHBvcnRzTXV0YXRpb24gJiYgc3VwcG9ydHNIeWRyYXRpb24pIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIHZhciBwcmV2Um9vdFN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuXG4gICAgICAgICAgICAgIGlmIChwcmV2Um9vdFN0YXRlLmlzRGVoeWRyYXRlZCkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICBjb21taXRIeWRyYXRlZENvbnRhaW5lcihyb290LmNvbnRhaW5lckluZm8pO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoc3VwcG9ydHNQZXJzaXN0ZW5jZSkge1xuICAgICAgICAgICAgdmFyIGNvbnRhaW5lckluZm8gPSByb290LmNvbnRhaW5lckluZm87XG4gICAgICAgICAgICB2YXIgcGVuZGluZ0NoaWxkcmVuID0gcm9vdC5wZW5kaW5nQ2hpbGRyZW47XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHJlcGxhY2VDb250YWluZXJDaGlsZHJlbihjb250YWluZXJJbmZvLCBwZW5kaW5nQ2hpbGRyZW4pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAge1xuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuXG4gICAgICAgIGlmIChmbGFncyAmIFVwZGF0ZSkge1xuICAgICAgICAgIGlmIChzdXBwb3J0c1BlcnNpc3RlbmNlKSB7XG4gICAgICAgICAgICB2YXIgcG9ydGFsID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcbiAgICAgICAgICAgIHZhciBfY29udGFpbmVySW5mbyA9IHBvcnRhbC5jb250YWluZXJJbmZvO1xuICAgICAgICAgICAgdmFyIF9wZW5kaW5nQ2hpbGRyZW4gPSBwb3J0YWwucGVuZGluZ0NoaWxkcmVuO1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICByZXBsYWNlQ29udGFpbmVyQ2hpbGRyZW4oX2NvbnRhaW5lckluZm8sIF9wZW5kaW5nQ2hpbGRyZW4pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgdmFyIG9mZnNjcmVlbkZpYmVyID0gZmluaXNoZWRXb3JrLmNoaWxkO1xuXG4gICAgICAgIGlmIChvZmZzY3JlZW5GaWJlci5mbGFncyAmIFZpc2liaWxpdHkpIHtcbiAgICAgICAgICB2YXIgb2Zmc2NyZWVuSW5zdGFuY2UgPSBvZmZzY3JlZW5GaWJlci5zdGF0ZU5vZGU7XG4gICAgICAgICAgdmFyIG5ld1N0YXRlID0gb2Zmc2NyZWVuRmliZXIubWVtb2l6ZWRTdGF0ZTtcbiAgICAgICAgICB2YXIgaXNIaWRkZW4gPSBuZXdTdGF0ZSAhPT0gbnVsbDsgLy8gVHJhY2sgdGhlIGN1cnJlbnQgc3RhdGUgb24gdGhlIE9mZnNjcmVlbiBpbnN0YW5jZSBzbyB3ZSBjYW5cbiAgICAgICAgICAvLyByZWFkIGl0IGR1cmluZyBhbiBldmVudFxuXG4gICAgICAgICAgb2Zmc2NyZWVuSW5zdGFuY2UuaXNIaWRkZW4gPSBpc0hpZGRlbjtcblxuICAgICAgICAgIGlmIChpc0hpZGRlbikge1xuICAgICAgICAgICAgdmFyIHdhc0hpZGRlbiA9IG9mZnNjcmVlbkZpYmVyLmFsdGVybmF0ZSAhPT0gbnVsbCAmJiBvZmZzY3JlZW5GaWJlci5hbHRlcm5hdGUubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbDtcblxuICAgICAgICAgICAgaWYgKCF3YXNIaWRkZW4pIHtcbiAgICAgICAgICAgICAgLy8gVE9ETzogTW92ZSB0byBwYXNzaXZlIHBoYXNlXG4gICAgICAgICAgICAgIG1hcmtDb21taXRUaW1lT2ZGYWxsYmFjaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmbGFncyAmIFVwZGF0ZSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb21taXRTdXNwZW5zZUNhbGxiYWNrKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGF0dGFjaFN1c3BlbnNlUmV0cnlMaXN0ZW5lcnMoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgT2Zmc2NyZWVuQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgX3dhc0hpZGRlbiA9IGN1cnJlbnQgIT09IG51bGwgJiYgY3VycmVudC5tZW1vaXplZFN0YXRlICE9PSBudWxsO1xuXG4gICAgICAgIGlmICggLy8gVE9ETzogUmVtb3ZlIHRoaXMgZGVhZCBmbGFnXG4gICAgICAgICBmaW5pc2hlZFdvcmsubW9kZSAmIENvbmN1cnJlbnRNb2RlKSB7XG4gICAgICAgICAgLy8gQmVmb3JlIGNvbW1pdHRpbmcgdGhlIGNoaWxkcmVuLCB0cmFjayBvbiB0aGUgc3RhY2sgd2hldGhlciB0aGlzXG4gICAgICAgICAgLy8gb2Zmc2NyZWVuIHN1YnRyZWUgd2FzIGFscmVhZHkgaGlkZGVuLCBzbyB0aGF0IHdlIGRvbid0IHVubW91bnQgdGhlXG4gICAgICAgICAgLy8gZWZmZWN0cyBhZ2Fpbi5cbiAgICAgICAgICB2YXIgcHJldk9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gPSBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuO1xuICAgICAgICAgIG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gPSBwcmV2T2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiB8fCBfd2FzSGlkZGVuO1xuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuID0gcHJldk9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICB9XG5cbiAgICAgICAgY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzKGZpbmlzaGVkV29yayk7XG5cbiAgICAgICAgaWYgKGZsYWdzICYgVmlzaWJpbGl0eSkge1xuICAgICAgICAgIHZhciBfb2Zmc2NyZWVuSW5zdGFuY2UgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlO1xuICAgICAgICAgIHZhciBfbmV3U3RhdGUgPSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRTdGF0ZTtcblxuICAgICAgICAgIHZhciBfaXNIaWRkZW4gPSBfbmV3U3RhdGUgIT09IG51bGw7XG5cbiAgICAgICAgICB2YXIgb2Zmc2NyZWVuQm91bmRhcnkgPSBmaW5pc2hlZFdvcms7IC8vIFRyYWNrIHRoZSBjdXJyZW50IHN0YXRlIG9uIHRoZSBPZmZzY3JlZW4gaW5zdGFuY2Ugc28gd2UgY2FuXG4gICAgICAgICAgLy8gcmVhZCBpdCBkdXJpbmcgYW4gZXZlbnRcblxuICAgICAgICAgIF9vZmZzY3JlZW5JbnN0YW5jZS5pc0hpZGRlbiA9IF9pc0hpZGRlbjtcblxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmIChfaXNIaWRkZW4pIHtcbiAgICAgICAgICAgICAgaWYgKCFfd2FzSGlkZGVuKSB7XG4gICAgICAgICAgICAgICAgaWYgKChvZmZzY3JlZW5Cb3VuZGFyeS5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgICAgICAgICAgIG5leHRFZmZlY3QgPSBvZmZzY3JlZW5Cb3VuZGFyeTtcbiAgICAgICAgICAgICAgICAgIHZhciBvZmZzY3JlZW5DaGlsZCA9IG9mZnNjcmVlbkJvdW5kYXJ5LmNoaWxkO1xuXG4gICAgICAgICAgICAgICAgICB3aGlsZSAob2Zmc2NyZWVuQ2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgbmV4dEVmZmVjdCA9IG9mZnNjcmVlbkNoaWxkO1xuICAgICAgICAgICAgICAgICAgICBkaXNhcHBlYXJMYXlvdXRFZmZlY3RzX2JlZ2luKG9mZnNjcmVlbkNoaWxkKTtcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2NyZWVuQ2hpbGQgPSBvZmZzY3JlZW5DaGlsZC5zaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChzdXBwb3J0c011dGF0aW9uKSB7XG4gICAgICAgICAgICAvLyBUT0RPOiBUaGlzIG5lZWRzIHRvIHJ1biB3aGVuZXZlciB0aGVyZSdzIGFuIGluc2VydGlvbiBvciB1cGRhdGVcbiAgICAgICAgICAgIC8vIGluc2lkZSBhIGhpZGRlbiBPZmZzY3JlZW4gdHJlZS5cbiAgICAgICAgICAgIGhpZGVPclVuaGlkZUFsbENoaWxkcmVuKG9mZnNjcmVlbkJvdW5kYXJ5LCBfaXNIaWRkZW4pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgU3VzcGVuc2VMaXN0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuXG4gICAgICAgIGlmIChmbGFncyAmIFVwZGF0ZSkge1xuICAgICAgICAgIGF0dGFjaFN1c3BlbnNlUmV0cnlMaXN0ZW5lcnMoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgU2NvcGVDb21wb25lbnQ6XG4gICAgICB7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHtcbiAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspIHtcbiAgLy8gUGxhY2VtZW50IGVmZmVjdHMgKGluc2VydGlvbnMsIHJlb3JkZXJzKSBjYW4gYmUgc2NoZWR1bGVkIG9uIGFueSBmaWJlclxuICAvLyB0eXBlLiBUaGV5IG5lZWRzIHRvIGhhcHBlbiBhZnRlciB0aGUgY2hpbGRyZW4gZWZmZWN0cyBoYXZlIGZpcmVkLCBidXRcbiAgLy8gYmVmb3JlIHRoZSBlZmZlY3RzIG9uIHRoaXMgZmliZXIgaGF2ZSBmaXJlZC5cbiAgdmFyIGZsYWdzID0gZmluaXNoZWRXb3JrLmZsYWdzO1xuXG4gIGlmIChmbGFncyAmIFBsYWNlbWVudCkge1xuICAgIHRyeSB7XG4gICAgICBjb21taXRQbGFjZW1lbnQoZmluaXNoZWRXb3JrKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgfSAvLyBDbGVhciB0aGUgXCJwbGFjZW1lbnRcIiBmcm9tIGVmZmVjdCB0YWcgc28gdGhhdCB3ZSBrbm93IHRoYXQgdGhpcyBpc1xuICAgIC8vIGluc2VydGVkLCBiZWZvcmUgYW55IGxpZmUtY3ljbGVzIGxpa2UgY29tcG9uZW50RGlkTW91bnQgZ2V0cyBjYWxsZWQuXG4gICAgLy8gVE9ETzogZmluZERPTU5vZGUgZG9lc24ndCByZWx5IG9uIHRoaXMgYW55IG1vcmUgYnV0IGlzTW91bnRlZCBkb2VzXG4gICAgLy8gYW5kIGlzTW91bnRlZCBpcyBkZXByZWNhdGVkIGFueXdheSBzbyB3ZSBzaG91bGQgYmUgYWJsZSB0byBraWxsIHRoaXMuXG5cblxuICAgIGZpbmlzaGVkV29yay5mbGFncyAmPSB+UGxhY2VtZW50O1xuICB9XG5cbiAgaWYgKGZsYWdzICYgSHlkcmF0aW5nKSB7XG4gICAgZmluaXNoZWRXb3JrLmZsYWdzICY9IH5IeWRyYXRpbmc7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0TGF5b3V0RWZmZWN0cyhmaW5pc2hlZFdvcmssIHJvb3QsIGNvbW1pdHRlZExhbmVzKSB7XG4gIGluUHJvZ3Jlc3NMYW5lcyA9IGNvbW1pdHRlZExhbmVzO1xuICBpblByb2dyZXNzUm9vdCA9IHJvb3Q7XG4gIG5leHRFZmZlY3QgPSBmaW5pc2hlZFdvcms7XG4gIGNvbW1pdExheW91dEVmZmVjdHNfYmVnaW4oZmluaXNoZWRXb3JrLCByb290LCBjb21taXR0ZWRMYW5lcyk7XG4gIGluUHJvZ3Jlc3NMYW5lcyA9IG51bGw7XG4gIGluUHJvZ3Jlc3NSb290ID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gY29tbWl0TGF5b3V0RWZmZWN0c19iZWdpbihzdWJ0cmVlUm9vdCwgcm9vdCwgY29tbWl0dGVkTGFuZXMpIHtcbiAgLy8gU3VzcGVuc2UgbGF5b3V0IGVmZmVjdHMgc2VtYW50aWNzIGRvbid0IGNoYW5nZSBmb3IgbGVnYWN5IHJvb3RzLlxuICB2YXIgaXNNb2Rlcm5Sb290ID0gKHN1YnRyZWVSb290Lm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZTtcblxuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7XG4gICAgdmFyIGZpcnN0Q2hpbGQgPSBmaWJlci5jaGlsZDtcblxuICAgIGlmICggZmliZXIudGFnID09PSBPZmZzY3JlZW5Db21wb25lbnQgJiYgaXNNb2Rlcm5Sb290KSB7XG4gICAgICAvLyBLZWVwIHRyYWNrIG9mIHRoZSBjdXJyZW50IE9mZnNjcmVlbiBzdGFjaydzIHN0YXRlLlxuICAgICAgdmFyIGlzSGlkZGVuID0gZmliZXIubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbDtcbiAgICAgIHZhciBuZXdPZmZzY3JlZW5TdWJ0cmVlSXNIaWRkZW4gPSBpc0hpZGRlbiB8fCBvZmZzY3JlZW5TdWJ0cmVlSXNIaWRkZW47XG5cbiAgICAgIGlmIChuZXdPZmZzY3JlZW5TdWJ0cmVlSXNIaWRkZW4pIHtcbiAgICAgICAgLy8gVGhlIE9mZnNjcmVlbiB0cmVlIGlzIGhpZGRlbi4gU2tpcCBvdmVyIGl0cyBsYXlvdXQgZWZmZWN0cy5cbiAgICAgICAgY29tbWl0TGF5b3V0TW91bnRFZmZlY3RzX2NvbXBsZXRlKHN1YnRyZWVSb290LCByb290LCBjb21taXR0ZWRMYW5lcyk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVE9ETyAoT2Zmc2NyZWVuKSBBbHNvIGNoZWNrOiBzdWJ0cmVlRmxhZ3MgJiBMYXlvdXRNYXNrXG4gICAgICAgIHZhciBjdXJyZW50ID0gZmliZXIuYWx0ZXJuYXRlO1xuICAgICAgICB2YXIgd2FzSGlkZGVuID0gY3VycmVudCAhPT0gbnVsbCAmJiBjdXJyZW50Lm1lbW9pemVkU3RhdGUgIT09IG51bGw7XG4gICAgICAgIHZhciBuZXdPZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuID0gd2FzSGlkZGVuIHx8IG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW47XG4gICAgICAgIHZhciBwcmV2T2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuID0gb2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuO1xuICAgICAgICB2YXIgcHJldk9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gPSBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuOyAvLyBUcmF2ZXJzZSB0aGUgT2Zmc2NyZWVuIHN1YnRyZWUgd2l0aCB0aGUgY3VycmVudCBPZmZzY3JlZW4gYXMgdGhlIHJvb3QuXG5cbiAgICAgICAgb2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuID0gbmV3T2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuO1xuICAgICAgICBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuID0gbmV3T2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbjtcblxuICAgICAgICBpZiAob2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiAmJiAhcHJldk9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4pIHtcbiAgICAgICAgICAvLyBUaGlzIGlzIHRoZSByb290IG9mIGEgcmVhcHBlYXJpbmcgYm91bmRhcnkuIFR1cm4gaXRzIGxheW91dCBlZmZlY3RzXG4gICAgICAgICAgLy8gYmFjayBvbi5cbiAgICAgICAgICBuZXh0RWZmZWN0ID0gZmliZXI7XG4gICAgICAgICAgcmVhcHBlYXJMYXlvdXRFZmZlY3RzX2JlZ2luKGZpYmVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBjaGlsZCA9IGZpcnN0Q2hpbGQ7XG5cbiAgICAgICAgd2hpbGUgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgICAgbmV4dEVmZmVjdCA9IGNoaWxkO1xuICAgICAgICAgIGNvbW1pdExheW91dEVmZmVjdHNfYmVnaW4oY2hpbGQsIC8vIE5ldyByb290OyBidWJibGUgYmFjayB1cCB0byBoZXJlIGFuZCBzdG9wLlxuICAgICAgICAgIHJvb3QsIGNvbW1pdHRlZExhbmVzKTtcbiAgICAgICAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gICAgICAgIH0gLy8gUmVzdG9yZSBPZmZzY3JlZW4gc3RhdGUgYW5kIHJlc3VtZSBpbiBvdXItcHJvZ3Jlc3MgdHJhdmVyc2FsLlxuXG5cbiAgICAgICAgbmV4dEVmZmVjdCA9IGZpYmVyO1xuICAgICAgICBvZmZzY3JlZW5TdWJ0cmVlSXNIaWRkZW4gPSBwcmV2T2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuO1xuICAgICAgICBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuID0gcHJldk9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW47XG4gICAgICAgIGNvbW1pdExheW91dE1vdW50RWZmZWN0c19jb21wbGV0ZShzdWJ0cmVlUm9vdCwgcm9vdCwgY29tbWl0dGVkTGFuZXMpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoKGZpYmVyLnN1YnRyZWVGbGFncyAmIExheW91dE1hc2spICE9PSBOb0ZsYWdzICYmIGZpcnN0Q2hpbGQgIT09IG51bGwpIHtcbiAgICAgIGZpcnN0Q2hpbGQucmV0dXJuID0gZmliZXI7XG4gICAgICBuZXh0RWZmZWN0ID0gZmlyc3RDaGlsZDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29tbWl0TGF5b3V0TW91bnRFZmZlY3RzX2NvbXBsZXRlKHN1YnRyZWVSb290LCByb290LCBjb21taXR0ZWRMYW5lcyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdExheW91dE1vdW50RWZmZWN0c19jb21wbGV0ZShzdWJ0cmVlUm9vdCwgcm9vdCwgY29tbWl0dGVkTGFuZXMpIHtcbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0O1xuXG4gICAgaWYgKChmaWJlci5mbGFncyAmIExheW91dE1hc2spICE9PSBOb0ZsYWdzKSB7XG4gICAgICB2YXIgY3VycmVudCA9IGZpYmVyLmFsdGVybmF0ZTtcbiAgICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbW1pdExheW91dEVmZmVjdE9uRmliZXIocm9vdCwgY3VycmVudCwgZmliZXIsIGNvbW1pdHRlZExhbmVzKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpYmVyLCBmaWJlci5yZXR1cm4sIGVycm9yKTtcbiAgICAgIH1cblxuICAgICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgICB9XG5cbiAgICBpZiAoZmliZXIgPT09IHN1YnRyZWVSb290KSB7XG4gICAgICBuZXh0RWZmZWN0ID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgc2libGluZyA9IGZpYmVyLnNpYmxpbmc7XG5cbiAgICBpZiAoc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgc2libGluZy5yZXR1cm4gPSBmaWJlci5yZXR1cm47XG4gICAgICBuZXh0RWZmZWN0ID0gc2libGluZztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBuZXh0RWZmZWN0ID0gZmliZXIucmV0dXJuO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRpc2FwcGVhckxheW91dEVmZmVjdHNfYmVnaW4oc3VidHJlZVJvb3QpIHtcbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0O1xuICAgIHZhciBmaXJzdENoaWxkID0gZmliZXIuY2hpbGQ7IC8vIFRPRE8gKE9mZnNjcmVlbikgQ2hlY2s6IGZsYWdzICYgKFJlZlN0YXRpYyB8IExheW91dFN0YXRpYylcblxuICAgIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgY2FzZSBNZW1vQ29tcG9uZW50OlxuICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgaWYgKCBmaWJlci5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHN0YXJ0TGF5b3V0RWZmZWN0VGltZXIoKTtcbiAgICAgICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KExheW91dCwgZmliZXIsIGZpYmVyLnJldHVybik7XG4gICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICByZWNvcmRMYXlvdXRFZmZlY3REdXJhdGlvbihmaWJlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0VW5tb3VudChMYXlvdXQsIGZpYmVyLCBmaWJlci5yZXR1cm4pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICAvLyBUT0RPIChPZmZzY3JlZW4pIENoZWNrOiBmbGFncyAmIFJlZlN0YXRpY1xuICAgICAgICAgIHNhZmVseURldGFjaFJlZihmaWJlciwgZmliZXIucmV0dXJuKTtcbiAgICAgICAgICB2YXIgaW5zdGFuY2UgPSBmaWJlci5zdGF0ZU5vZGU7XG5cbiAgICAgICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVbm1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBzYWZlbHlDYWxsQ29tcG9uZW50V2lsbFVubW91bnQoZmliZXIsIGZpYmVyLnJldHVybiwgaW5zdGFuY2UpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIHNhZmVseURldGFjaFJlZihmaWJlciwgZmliZXIucmV0dXJuKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIE9mZnNjcmVlbkNvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYVxuICAgICAgICAgIHZhciBpc0hpZGRlbiA9IGZpYmVyLm1lbW9pemVkU3RhdGUgIT09IG51bGw7XG5cbiAgICAgICAgICBpZiAoaXNIaWRkZW4pIHtcbiAgICAgICAgICAgIC8vIE5lc3RlZCBPZmZzY3JlZW4gdHJlZSBpcyBhbHJlYWR5IGhpZGRlbi4gRG9uJ3QgZGlzYXBwZWFyXG4gICAgICAgICAgICAvLyBpdHMgZWZmZWN0cy5cbiAgICAgICAgICAgIGRpc2FwcGVhckxheW91dEVmZmVjdHNfY29tcGxldGUoc3VidHJlZVJvb3QpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9IC8vIFRPRE8gKE9mZnNjcmVlbikgQ2hlY2s6IHN1YnRyZWVGbGFncyAmIExheW91dFN0YXRpY1xuXG5cbiAgICBpZiAoZmlyc3RDaGlsZCAhPT0gbnVsbCkge1xuICAgICAgZmlyc3RDaGlsZC5yZXR1cm4gPSBmaWJlcjtcbiAgICAgIG5leHRFZmZlY3QgPSBmaXJzdENoaWxkO1xuICAgIH0gZWxzZSB7XG4gICAgICBkaXNhcHBlYXJMYXlvdXRFZmZlY3RzX2NvbXBsZXRlKHN1YnRyZWVSb290KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZGlzYXBwZWFyTGF5b3V0RWZmZWN0c19jb21wbGV0ZShzdWJ0cmVlUm9vdCkge1xuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7XG5cbiAgICBpZiAoZmliZXIgPT09IHN1YnRyZWVSb290KSB7XG4gICAgICBuZXh0RWZmZWN0ID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgc2libGluZyA9IGZpYmVyLnNpYmxpbmc7XG5cbiAgICBpZiAoc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgc2libGluZy5yZXR1cm4gPSBmaWJlci5yZXR1cm47XG4gICAgICBuZXh0RWZmZWN0ID0gc2libGluZztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBuZXh0RWZmZWN0ID0gZmliZXIucmV0dXJuO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlYXBwZWFyTGF5b3V0RWZmZWN0c19iZWdpbihzdWJ0cmVlUm9vdCkge1xuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7XG4gICAgdmFyIGZpcnN0Q2hpbGQgPSBmaWJlci5jaGlsZDtcblxuICAgIGlmIChmaWJlci50YWcgPT09IE9mZnNjcmVlbkNvbXBvbmVudCkge1xuICAgICAgdmFyIGlzSGlkZGVuID0gZmliZXIubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbDtcblxuICAgICAgaWYgKGlzSGlkZGVuKSB7XG4gICAgICAgIC8vIE5lc3RlZCBPZmZzY3JlZW4gdHJlZSBpcyBzdGlsbCBoaWRkZW4uIERvbid0IHJlLWFwcGVhciBpdHMgZWZmZWN0cy5cbiAgICAgICAgcmVhcHBlYXJMYXlvdXRFZmZlY3RzX2NvbXBsZXRlKHN1YnRyZWVSb290KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfSAvLyBUT0RPIChPZmZzY3JlZW4pIENoZWNrOiBzdWJ0cmVlRmxhZ3MgJiBMYXlvdXRTdGF0aWNcblxuXG4gICAgaWYgKGZpcnN0Q2hpbGQgIT09IG51bGwpIHtcbiAgICAgIC8vIFRoaXMgbm9kZSBtYXkgaGF2ZSBiZWVuIHJldXNlZCBmcm9tIGEgcHJldmlvdXMgcmVuZGVyLCBzbyB3ZSBjYW4ndFxuICAgICAgLy8gYXNzdW1lIGl0cyByZXR1cm4gcG9pbnRlciBpcyBjb3JyZWN0LlxuICAgICAgZmlyc3RDaGlsZC5yZXR1cm4gPSBmaWJlcjtcbiAgICAgIG5leHRFZmZlY3QgPSBmaXJzdENoaWxkO1xuICAgIH0gZWxzZSB7XG4gICAgICByZWFwcGVhckxheW91dEVmZmVjdHNfY29tcGxldGUoc3VidHJlZVJvb3QpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiByZWFwcGVhckxheW91dEVmZmVjdHNfY29tcGxldGUoc3VidHJlZVJvb3QpIHtcbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0OyAvLyBUT0RPIChPZmZzY3JlZW4pIENoZWNrOiBmbGFncyAmIExheW91dFN0YXRpY1xuXG4gICAgc2V0Q3VycmVudEZpYmVyKGZpYmVyKTtcblxuICAgIHRyeSB7XG4gICAgICByZWFwcGVhckxheW91dEVmZmVjdHNPbkZpYmVyKGZpYmVyKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmliZXIsIGZpYmVyLnJldHVybiwgZXJyb3IpO1xuICAgIH1cblxuICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG5cbiAgICBpZiAoZmliZXIgPT09IHN1YnRyZWVSb290KSB7XG4gICAgICBuZXh0RWZmZWN0ID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgc2libGluZyA9IGZpYmVyLnNpYmxpbmc7XG5cbiAgICBpZiAoc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgLy8gVGhpcyBub2RlIG1heSBoYXZlIGJlZW4gcmV1c2VkIGZyb20gYSBwcmV2aW91cyByZW5kZXIsIHNvIHdlIGNhbid0XG4gICAgICAvLyBhc3N1bWUgaXRzIHJldHVybiBwb2ludGVyIGlzIGNvcnJlY3QuXG4gICAgICBzaWJsaW5nLnJldHVybiA9IGZpYmVyLnJldHVybjtcbiAgICAgIG5leHRFZmZlY3QgPSBzaWJsaW5nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG5leHRFZmZlY3QgPSBmaWJlci5yZXR1cm47XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0UGFzc2l2ZU1vdW50RWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmssIGNvbW1pdHRlZExhbmVzLCBjb21taXR0ZWRUcmFuc2l0aW9ucykge1xuICBuZXh0RWZmZWN0ID0gZmluaXNoZWRXb3JrO1xuICBjb21taXRQYXNzaXZlTW91bnRFZmZlY3RzX2JlZ2luKGZpbmlzaGVkV29yaywgcm9vdCwgY29tbWl0dGVkTGFuZXMsIGNvbW1pdHRlZFRyYW5zaXRpb25zKTtcbn1cblxuZnVuY3Rpb24gY29tbWl0UGFzc2l2ZU1vdW50RWZmZWN0c19iZWdpbihzdWJ0cmVlUm9vdCwgcm9vdCwgY29tbWl0dGVkTGFuZXMsIGNvbW1pdHRlZFRyYW5zaXRpb25zKSB7XG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDtcbiAgICB2YXIgZmlyc3RDaGlsZCA9IGZpYmVyLmNoaWxkO1xuXG4gICAgaWYgKChmaWJlci5zdWJ0cmVlRmxhZ3MgJiBQYXNzaXZlTWFzaykgIT09IE5vRmxhZ3MgJiYgZmlyc3RDaGlsZCAhPT0gbnVsbCkge1xuICAgICAgZmlyc3RDaGlsZC5yZXR1cm4gPSBmaWJlcjtcbiAgICAgIG5leHRFZmZlY3QgPSBmaXJzdENoaWxkO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb21taXRQYXNzaXZlTW91bnRFZmZlY3RzX2NvbXBsZXRlKHN1YnRyZWVSb290LCByb290LCBjb21taXR0ZWRMYW5lcywgY29tbWl0dGVkVHJhbnNpdGlvbnMpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRQYXNzaXZlTW91bnRFZmZlY3RzX2NvbXBsZXRlKHN1YnRyZWVSb290LCByb290LCBjb21taXR0ZWRMYW5lcywgY29tbWl0dGVkVHJhbnNpdGlvbnMpIHtcbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0O1xuXG4gICAgaWYgKChmaWJlci5mbGFncyAmIFBhc3NpdmUpICE9PSBOb0ZsYWdzKSB7XG4gICAgICBzZXRDdXJyZW50RmliZXIoZmliZXIpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb21taXRQYXNzaXZlTW91bnRPbkZpYmVyKHJvb3QsIGZpYmVyLCBjb21taXR0ZWRMYW5lcywgY29tbWl0dGVkVHJhbnNpdGlvbnMpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmliZXIsIGZpYmVyLnJldHVybiwgZXJyb3IpO1xuICAgICAgfVxuXG4gICAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICAgIH1cblxuICAgIGlmIChmaWJlciA9PT0gc3VidHJlZVJvb3QpIHtcbiAgICAgIG5leHRFZmZlY3QgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBzaWJsaW5nID0gZmliZXIuc2libGluZztcblxuICAgIGlmIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICBzaWJsaW5nLnJldHVybiA9IGZpYmVyLnJldHVybjtcbiAgICAgIG5leHRFZmZlY3QgPSBzaWJsaW5nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG5leHRFZmZlY3QgPSBmaWJlci5yZXR1cm47XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0UGFzc2l2ZU1vdW50T25GaWJlcihmaW5pc2hlZFJvb3QsIGZpbmlzaGVkV29yaywgY29tbWl0dGVkTGFuZXMsIGNvbW1pdHRlZFRyYW5zaXRpb25zKSB7XG4gIHN3aXRjaCAoZmluaXNoZWRXb3JrLnRhZykge1xuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgaWYgKCBmaW5pc2hlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAgICAgc3RhcnRQYXNzaXZlRWZmZWN0VGltZXIoKTtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdE1vdW50KFBhc3NpdmUkMSB8IEhhc0VmZmVjdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgcmVjb3JkUGFzc2l2ZUVmZmVjdER1cmF0aW9uKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0TW91bnQoUGFzc2l2ZSQxIHwgSGFzRWZmZWN0LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0UGFzc2l2ZVVubW91bnRFZmZlY3RzKGZpcnN0Q2hpbGQpIHtcbiAgbmV4dEVmZmVjdCA9IGZpcnN0Q2hpbGQ7XG4gIGNvbW1pdFBhc3NpdmVVbm1vdW50RWZmZWN0c19iZWdpbigpO1xufVxuXG5mdW5jdGlvbiBjb21taXRQYXNzaXZlVW5tb3VudEVmZmVjdHNfYmVnaW4oKSB7XG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDtcbiAgICB2YXIgY2hpbGQgPSBmaWJlci5jaGlsZDtcblxuICAgIGlmICgobmV4dEVmZmVjdC5mbGFncyAmIENoaWxkRGVsZXRpb24pICE9PSBOb0ZsYWdzKSB7XG4gICAgICB2YXIgZGVsZXRpb25zID0gZmliZXIuZGVsZXRpb25zO1xuXG4gICAgICBpZiAoZGVsZXRpb25zICE9PSBudWxsKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGVsZXRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGZpYmVyVG9EZWxldGUgPSBkZWxldGlvbnNbaV07XG4gICAgICAgICAgbmV4dEVmZmVjdCA9IGZpYmVyVG9EZWxldGU7XG4gICAgICAgICAgY29tbWl0UGFzc2l2ZVVubW91bnRFZmZlY3RzSW5zaWRlT2ZEZWxldGVkVHJlZV9iZWdpbihmaWJlclRvRGVsZXRlLCBmaWJlcik7XG4gICAgICAgIH1cblxuICAgICAgICB7XG4gICAgICAgICAgLy8gQSBmaWJlciB3YXMgZGVsZXRlZCBmcm9tIHRoaXMgcGFyZW50IGZpYmVyLCBidXQgaXQncyBzdGlsbCBwYXJ0IG9mXG4gICAgICAgICAgLy8gdGhlIHByZXZpb3VzIChhbHRlcm5hdGUpIHBhcmVudCBmaWJlcidzIGxpc3Qgb2YgY2hpbGRyZW4uIEJlY2F1c2VcbiAgICAgICAgICAvLyBjaGlsZHJlbiBhcmUgYSBsaW5rZWQgbGlzdCwgYW4gZWFybGllciBzaWJsaW5nIHRoYXQncyBzdGlsbCBhbGl2ZVxuICAgICAgICAgIC8vIHdpbGwgYmUgY29ubmVjdGVkIHRvIHRoZSBkZWxldGVkIGZpYmVyIHZpYSBpdHMgYGFsdGVybmF0ZWA6XG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyAgIGxpdmUgZmliZXJcbiAgICAgICAgICAvLyAgIC0tYWx0ZXJuYXRlLS0+IHByZXZpb3VzIGxpdmUgZmliZXJcbiAgICAgICAgICAvLyAgIC0tc2libGluZy0tPiBkZWxldGVkIGZpYmVyXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBXZSBjYW4ndCBkaXNjb25uZWN0IGBhbHRlcm5hdGVgIG9uIG5vZGVzIHRoYXQgaGF2ZW4ndCBiZWVuIGRlbGV0ZWRcbiAgICAgICAgICAvLyB5ZXQsIGJ1dCB3ZSBjYW4gZGlzY29ubmVjdCB0aGUgYHNpYmxpbmdgIGFuZCBgY2hpbGRgIHBvaW50ZXJzLlxuICAgICAgICAgIHZhciBwcmV2aW91c0ZpYmVyID0gZmliZXIuYWx0ZXJuYXRlO1xuXG4gICAgICAgICAgaWYgKHByZXZpb3VzRmliZXIgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBkZXRhY2hlZENoaWxkID0gcHJldmlvdXNGaWJlci5jaGlsZDtcblxuICAgICAgICAgICAgaWYgKGRldGFjaGVkQ2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgcHJldmlvdXNGaWJlci5jaGlsZCA9IG51bGw7XG5cbiAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgIHZhciBkZXRhY2hlZFNpYmxpbmcgPSBkZXRhY2hlZENoaWxkLnNpYmxpbmc7XG4gICAgICAgICAgICAgICAgZGV0YWNoZWRDaGlsZC5zaWJsaW5nID0gbnVsbDtcbiAgICAgICAgICAgICAgICBkZXRhY2hlZENoaWxkID0gZGV0YWNoZWRTaWJsaW5nO1xuICAgICAgICAgICAgICB9IHdoaWxlIChkZXRhY2hlZENoaWxkICE9PSBudWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBuZXh0RWZmZWN0ID0gZmliZXI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKChmaWJlci5zdWJ0cmVlRmxhZ3MgJiBQYXNzaXZlTWFzaykgIT09IE5vRmxhZ3MgJiYgY2hpbGQgIT09IG51bGwpIHtcbiAgICAgIGNoaWxkLnJldHVybiA9IGZpYmVyO1xuICAgICAgbmV4dEVmZmVjdCA9IGNoaWxkO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb21taXRQYXNzaXZlVW5tb3VudEVmZmVjdHNfY29tcGxldGUoKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0UGFzc2l2ZVVubW91bnRFZmZlY3RzX2NvbXBsZXRlKCkge1xuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7XG5cbiAgICBpZiAoKGZpYmVyLmZsYWdzICYgUGFzc2l2ZSkgIT09IE5vRmxhZ3MpIHtcbiAgICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG4gICAgICBjb21taXRQYXNzaXZlVW5tb3VudE9uRmliZXIoZmliZXIpO1xuICAgICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgICB9XG5cbiAgICB2YXIgc2libGluZyA9IGZpYmVyLnNpYmxpbmc7XG5cbiAgICBpZiAoc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgc2libGluZy5yZXR1cm4gPSBmaWJlci5yZXR1cm47XG4gICAgICBuZXh0RWZmZWN0ID0gc2libGluZztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBuZXh0RWZmZWN0ID0gZmliZXIucmV0dXJuO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFBhc3NpdmVVbm1vdW50T25GaWJlcihmaW5pc2hlZFdvcmspIHtcbiAgc3dpdGNoIChmaW5pc2hlZFdvcmsudGFnKSB7XG4gICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBpZiAoIGZpbmlzaGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgICBzdGFydFBhc3NpdmVFZmZlY3RUaW1lcigpO1xuICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0VW5tb3VudChQYXNzaXZlJDEgfCBIYXNFZmZlY3QsIGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybik7XG4gICAgICAgICAgcmVjb3JkUGFzc2l2ZUVmZmVjdER1cmF0aW9uKGZpbmlzaGVkV29yayk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KFBhc3NpdmUkMSB8IEhhc0VmZmVjdCwgZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFBhc3NpdmVVbm1vdW50RWZmZWN0c0luc2lkZU9mRGVsZXRlZFRyZWVfYmVnaW4oZGVsZXRlZFN1YnRyZWVSb290LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yKSB7XG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDsgLy8gRGVsZXRpb24gZWZmZWN0cyBmaXJlIGluIHBhcmVudCAtPiBjaGlsZCBvcmRlclxuICAgIC8vIFRPRE86IENoZWNrIGlmIGZpYmVyIGhhcyBhIFBhc3NpdmVTdGF0aWMgZmxhZ1xuXG4gICAgc2V0Q3VycmVudEZpYmVyKGZpYmVyKTtcbiAgICBjb21taXRQYXNzaXZlVW5tb3VudEluc2lkZURlbGV0ZWRUcmVlT25GaWJlcihmaWJlciwgbmVhcmVzdE1vdW50ZWRBbmNlc3Rvcik7XG4gICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgICB2YXIgY2hpbGQgPSBmaWJlci5jaGlsZDsgLy8gVE9ETzogT25seSB0cmF2ZXJzZSBzdWJ0cmVlIGlmIGl0IGhhcyBhIFBhc3NpdmVTdGF0aWMgZmxhZy4gKEJ1dCwgaWYgd2VcbiAgICAvLyBkbyB0aGlzLCBzdGlsbCBuZWVkIHRvIGhhbmRsZSBgZGVsZXRlZFRyZWVDbGVhblVwTGV2ZWxgIGNvcnJlY3RseS4pXG5cbiAgICBpZiAoY2hpbGQgIT09IG51bGwpIHtcbiAgICAgIGNoaWxkLnJldHVybiA9IGZpYmVyO1xuICAgICAgbmV4dEVmZmVjdCA9IGNoaWxkO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb21taXRQYXNzaXZlVW5tb3VudEVmZmVjdHNJbnNpZGVPZkRlbGV0ZWRUcmVlX2NvbXBsZXRlKGRlbGV0ZWRTdWJ0cmVlUm9vdCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFBhc3NpdmVVbm1vdW50RWZmZWN0c0luc2lkZU9mRGVsZXRlZFRyZWVfY29tcGxldGUoZGVsZXRlZFN1YnRyZWVSb290KSB7XG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDtcbiAgICB2YXIgc2libGluZyA9IGZpYmVyLnNpYmxpbmc7XG4gICAgdmFyIHJldHVybkZpYmVyID0gZmliZXIucmV0dXJuO1xuXG4gICAge1xuICAgICAgLy8gUmVjdXJzaXZlbHkgdHJhdmVyc2UgdGhlIGVudGlyZSBkZWxldGVkIHRyZWUgYW5kIGNsZWFuIHVwIGZpYmVyIGZpZWxkcy5cbiAgICAgIC8vIFRoaXMgaXMgbW9yZSBhZ2dyZXNzaXZlIHRoYW4gaWRlYWwsIGFuZCB0aGUgbG9uZyB0ZXJtIGdvYWwgaXMgdG8gb25seVxuICAgICAgLy8gaGF2ZSB0byBkZXRhY2ggdGhlIGRlbGV0ZWQgdHJlZSBhdCB0aGUgcm9vdC5cbiAgICAgIGRldGFjaEZpYmVyQWZ0ZXJFZmZlY3RzKGZpYmVyKTtcblxuICAgICAgaWYgKGZpYmVyID09PSBkZWxldGVkU3VidHJlZVJvb3QpIHtcbiAgICAgICAgbmV4dEVmZmVjdCA9IG51bGw7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgc2libGluZy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIG5leHRFZmZlY3QgPSBzaWJsaW5nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG5leHRFZmZlY3QgPSByZXR1cm5GaWJlcjtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRQYXNzaXZlVW5tb3VudEluc2lkZURlbGV0ZWRUcmVlT25GaWJlcihjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yKSB7XG4gIHN3aXRjaCAoY3VycmVudC50YWcpIHtcbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIGlmICggY3VycmVudC5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgICBzdGFydFBhc3NpdmVFZmZlY3RUaW1lcigpO1xuICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0VW5tb3VudChQYXNzaXZlJDEsIGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IpO1xuICAgICAgICAgIHJlY29yZFBhc3NpdmVFZmZlY3REdXJhdGlvbihjdXJyZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoUGFzc2l2ZSQxLCBjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICB9XG59IC8vIFRPRE86IFJldXNlIHJlYXBwZWFyTGF5b3V0RWZmZWN0cyB0cmF2ZXJzYWwgaGVyZT9cblxuXG5mdW5jdGlvbiBpbnZva2VMYXlvdXRFZmZlY3RNb3VudEluREVWKGZpYmVyKSB7XG4gIHtcbiAgICAvLyBXZSBkb24ndCBuZWVkIHRvIHJlLWNoZWNrIFN0cmljdEVmZmVjdHNNb2RlIGhlcmUuXG4gICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBpZiB0aGF0IGNoZWNrIGhhcyBhbHJlYWR5IHBhc3NlZC5cbiAgICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdE1vdW50KExheW91dCB8IEhhc0VmZmVjdCwgZmliZXIpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaWJlciwgZmliZXIucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBpbnN0YW5jZSA9IGZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpbnN0YW5jZS5jb21wb25lbnREaWRNb3VudCgpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaWJlciwgZmliZXIucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaW52b2tlUGFzc2l2ZUVmZmVjdE1vdW50SW5ERVYoZmliZXIpIHtcbiAge1xuICAgIC8vIFdlIGRvbid0IG5lZWQgdG8gcmUtY2hlY2sgU3RyaWN0RWZmZWN0c01vZGUgaGVyZS5cbiAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIGlmIHRoYXQgY2hlY2sgaGFzIGFscmVhZHkgcGFzc2VkLlxuICAgIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0TW91bnQoUGFzc2l2ZSQxIHwgSGFzRWZmZWN0LCBmaWJlcik7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpYmVyLCBmaWJlci5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpbnZva2VMYXlvdXRFZmZlY3RVbm1vdW50SW5ERVYoZmliZXIpIHtcbiAge1xuICAgIC8vIFdlIGRvbid0IG5lZWQgdG8gcmUtY2hlY2sgU3RyaWN0RWZmZWN0c01vZGUgaGVyZS5cbiAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIGlmIHRoYXQgY2hlY2sgaGFzIGFscmVhZHkgcGFzc2VkLlxuICAgIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0VW5tb3VudChMYXlvdXQgfCBIYXNFZmZlY3QsIGZpYmVyLCBmaWJlci5yZXR1cm4pO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaWJlciwgZmliZXIucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBpbnN0YW5jZSA9IGZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVubW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHNhZmVseUNhbGxDb21wb25lbnRXaWxsVW5tb3VudChmaWJlciwgZmliZXIucmV0dXJuLCBpbnN0YW5jZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaW52b2tlUGFzc2l2ZUVmZmVjdFVubW91bnRJbkRFVihmaWJlcikge1xuICB7XG4gICAgLy8gV2UgZG9uJ3QgbmVlZCB0byByZS1jaGVjayBTdHJpY3RFZmZlY3RzTW9kZSBoZXJlLlxuICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgaWYgdGhhdCBjaGVjayBoYXMgYWxyZWFkeSBwYXNzZWQuXG4gICAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KFBhc3NpdmUkMSB8IEhhc0VmZmVjdCwgZmliZXIsIGZpYmVyLnJldHVybik7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpYmVyLCBmaWJlci5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIENPTVBPTkVOVF9UWVBFID0gMDtcbnZhciBIQVNfUFNFVURPX0NMQVNTX1RZUEUgPSAxO1xudmFyIFJPTEVfVFlQRSA9IDI7XG52YXIgVEVTVF9OQU1FX1RZUEUgPSAzO1xudmFyIFRFWFRfVFlQRSA9IDQ7XG5cbmlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5mb3IpIHtcbiAgdmFyIHN5bWJvbEZvciA9IFN5bWJvbC5mb3I7XG4gIENPTVBPTkVOVF9UWVBFID0gc3ltYm9sRm9yKCdzZWxlY3Rvci5jb21wb25lbnQnKTtcbiAgSEFTX1BTRVVET19DTEFTU19UWVBFID0gc3ltYm9sRm9yKCdzZWxlY3Rvci5oYXNfcHNldWRvX2NsYXNzJyk7XG4gIFJPTEVfVFlQRSA9IHN5bWJvbEZvcignc2VsZWN0b3Iucm9sZScpO1xuICBURVNUX05BTUVfVFlQRSA9IHN5bWJvbEZvcignc2VsZWN0b3IudGVzdF9pZCcpO1xuICBURVhUX1RZUEUgPSBzeW1ib2xGb3IoJ3NlbGVjdG9yLnRleHQnKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQ29tcG9uZW50U2VsZWN0b3IoY29tcG9uZW50KSB7XG4gIHJldHVybiB7XG4gICAgJCR0eXBlb2Y6IENPTVBPTkVOVF9UWVBFLFxuICAgIHZhbHVlOiBjb21wb25lbnRcbiAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUhhc1BzZXVkb0NsYXNzU2VsZWN0b3Ioc2VsZWN0b3JzKSB7XG4gIHJldHVybiB7XG4gICAgJCR0eXBlb2Y6IEhBU19QU0VVRE9fQ0xBU1NfVFlQRSxcbiAgICB2YWx1ZTogc2VsZWN0b3JzXG4gIH07XG59XG5mdW5jdGlvbiBjcmVhdGVSb2xlU2VsZWN0b3Iocm9sZSkge1xuICByZXR1cm4ge1xuICAgICQkdHlwZW9mOiBST0xFX1RZUEUsXG4gICAgdmFsdWU6IHJvbGVcbiAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVRleHRTZWxlY3Rvcih0ZXh0KSB7XG4gIHJldHVybiB7XG4gICAgJCR0eXBlb2Y6IFRFWFRfVFlQRSxcbiAgICB2YWx1ZTogdGV4dFxuICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlVGVzdE5hbWVTZWxlY3RvcihpZCkge1xuICByZXR1cm4ge1xuICAgICQkdHlwZW9mOiBURVNUX05BTUVfVFlQRSxcbiAgICB2YWx1ZTogaWRcbiAgfTtcbn1cblxuZnVuY3Rpb24gZmluZEZpYmVyUm9vdEZvckhvc3RSb290KGhvc3RSb290KSB7XG4gIHZhciBtYXliZUZpYmVyID0gZ2V0SW5zdGFuY2VGcm9tTm9kZShob3N0Um9vdCk7XG5cbiAgaWYgKG1heWJlRmliZXIgIT0gbnVsbCkge1xuICAgIGlmICh0eXBlb2YgbWF5YmVGaWJlci5tZW1vaXplZFByb3BzWydkYXRhLXRlc3RuYW1lJ10gIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgaG9zdCByb290IHNwZWNpZmllZC4gU2hvdWxkIGJlIGVpdGhlciBhIFJlYWN0IGNvbnRhaW5lciBvciBhIG5vZGUgd2l0aCBhIHRlc3RuYW1lIGF0dHJpYnV0ZS4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWF5YmVGaWJlcjtcbiAgfSBlbHNlIHtcbiAgICB2YXIgZmliZXJSb290ID0gZmluZEZpYmVyUm9vdChob3N0Um9vdCk7XG5cbiAgICBpZiAoZmliZXJSb290ID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIFJlYWN0IGNvbnRhaW5lciB3aXRoaW4gc3BlY2lmaWVkIGhvc3Qgc3VidHJlZS4nKTtcbiAgICB9IC8vIFRoZSBGbG93IHR5cGUgZm9yIEZpYmVyUm9vdCBpcyBhIGxpdHRsZSBmdW5reS5cbiAgICAvLyBjcmVhdGVGaWJlclJvb3QoKSBjaGVhdHMgdGhpcyBieSB0cmVhdGluZyB0aGUgcm9vdCBhcyA6YW55IGFuZCBhZGRpbmcgc3RhdGVOb2RlIGxhemlseS5cblxuXG4gICAgcmV0dXJuIGZpYmVyUm9vdC5zdGF0ZU5vZGUuY3VycmVudDtcbiAgfVxufVxuXG5mdW5jdGlvbiBtYXRjaFNlbGVjdG9yKGZpYmVyLCBzZWxlY3Rvcikge1xuICBzd2l0Y2ggKHNlbGVjdG9yLiQkdHlwZW9mKSB7XG4gICAgY2FzZSBDT01QT05FTlRfVFlQRTpcbiAgICAgIGlmIChmaWJlci50eXBlID09PSBzZWxlY3Rvci52YWx1ZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIEhBU19QU0VVRE9fQ0xBU1NfVFlQRTpcbiAgICAgIHJldHVybiBoYXNNYXRjaGluZ1BhdGhzKGZpYmVyLCBzZWxlY3Rvci52YWx1ZSk7XG5cbiAgICBjYXNlIFJPTEVfVFlQRTpcbiAgICAgIGlmIChmaWJlci50YWcgPT09IEhvc3RDb21wb25lbnQpIHtcbiAgICAgICAgdmFyIG5vZGUgPSBmaWJlci5zdGF0ZU5vZGU7XG5cbiAgICAgICAgaWYgKG1hdGNoQWNjZXNzaWJpbGl0eVJvbGUobm9kZSwgc2VsZWN0b3IudmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFRFWFRfVFlQRTpcbiAgICAgIGlmIChmaWJlci50YWcgPT09IEhvc3RDb21wb25lbnQgfHwgZmliZXIudGFnID09PSBIb3N0VGV4dCkge1xuICAgICAgICB2YXIgdGV4dENvbnRlbnQgPSBnZXRUZXh0Q29udGVudChmaWJlcik7XG5cbiAgICAgICAgaWYgKHRleHRDb250ZW50ICE9PSBudWxsICYmIHRleHRDb250ZW50LmluZGV4T2Yoc2VsZWN0b3IudmFsdWUpID49IDApIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBicmVhaztcblxuICAgIGNhc2UgVEVTVF9OQU1FX1RZUEU6XG4gICAgICBpZiAoZmliZXIudGFnID09PSBIb3N0Q29tcG9uZW50KSB7XG4gICAgICAgIHZhciBkYXRhVGVzdElEID0gZmliZXIubWVtb2l6ZWRQcm9wc1snZGF0YS10ZXN0bmFtZSddO1xuXG4gICAgICAgIGlmICh0eXBlb2YgZGF0YVRlc3RJRCA9PT0gJ3N0cmluZycgJiYgZGF0YVRlc3RJRC50b0xvd2VyQ2FzZSgpID09PSBzZWxlY3Rvci52YWx1ZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHNlbGVjdG9yIHR5cGUgc3BlY2lmaWVkLicpO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBzZWxlY3RvclRvU3RyaW5nKHNlbGVjdG9yKSB7XG4gIHN3aXRjaCAoc2VsZWN0b3IuJCR0eXBlb2YpIHtcbiAgICBjYXNlIENPTVBPTkVOVF9UWVBFOlxuICAgICAgdmFyIGRpc3BsYXlOYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHNlbGVjdG9yLnZhbHVlKSB8fCAnVW5rbm93bic7XG4gICAgICByZXR1cm4gXCI8XCIgKyBkaXNwbGF5TmFtZSArIFwiPlwiO1xuXG4gICAgY2FzZSBIQVNfUFNFVURPX0NMQVNTX1RZUEU6XG4gICAgICByZXR1cm4gXCI6aGFzKFwiICsgKHNlbGVjdG9yVG9TdHJpbmcoc2VsZWN0b3IpIHx8ICcnKSArIFwiKVwiO1xuXG4gICAgY2FzZSBST0xFX1RZUEU6XG4gICAgICByZXR1cm4gXCJbcm9sZT1cXFwiXCIgKyBzZWxlY3Rvci52YWx1ZSArIFwiXFxcIl1cIjtcblxuICAgIGNhc2UgVEVYVF9UWVBFOlxuICAgICAgcmV0dXJuIFwiXFxcIlwiICsgc2VsZWN0b3IudmFsdWUgKyBcIlxcXCJcIjtcblxuICAgIGNhc2UgVEVTVF9OQU1FX1RZUEU6XG4gICAgICByZXR1cm4gXCJbZGF0YS10ZXN0bmFtZT1cXFwiXCIgKyBzZWxlY3Rvci52YWx1ZSArIFwiXFxcIl1cIjtcblxuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc2VsZWN0b3IgdHlwZSBzcGVjaWZpZWQuJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZFBhdGhzKHJvb3QsIHNlbGVjdG9ycykge1xuICB2YXIgbWF0Y2hpbmdGaWJlcnMgPSBbXTtcbiAgdmFyIHN0YWNrID0gW3Jvb3QsIDBdO1xuICB2YXIgaW5kZXggPSAwO1xuXG4gIHdoaWxlIChpbmRleCA8IHN0YWNrLmxlbmd0aCkge1xuICAgIHZhciBmaWJlciA9IHN0YWNrW2luZGV4KytdO1xuICAgIHZhciBzZWxlY3RvckluZGV4ID0gc3RhY2tbaW5kZXgrK107XG4gICAgdmFyIHNlbGVjdG9yID0gc2VsZWN0b3JzW3NlbGVjdG9ySW5kZXhdO1xuXG4gICAgaWYgKGZpYmVyLnRhZyA9PT0gSG9zdENvbXBvbmVudCAmJiBpc0hpZGRlblN1YnRyZWUoZmliZXIpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgd2hpbGUgKHNlbGVjdG9yICE9IG51bGwgJiYgbWF0Y2hTZWxlY3RvcihmaWJlciwgc2VsZWN0b3IpKSB7XG4gICAgICAgIHNlbGVjdG9ySW5kZXgrKztcbiAgICAgICAgc2VsZWN0b3IgPSBzZWxlY3RvcnNbc2VsZWN0b3JJbmRleF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNlbGVjdG9ySW5kZXggPT09IHNlbGVjdG9ycy5sZW5ndGgpIHtcbiAgICAgIG1hdGNoaW5nRmliZXJzLnB1c2goZmliZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgY2hpbGQgPSBmaWJlci5jaGlsZDtcblxuICAgICAgd2hpbGUgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgIHN0YWNrLnB1c2goY2hpbGQsIHNlbGVjdG9ySW5kZXgpO1xuICAgICAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1hdGNoaW5nRmliZXJzO1xufSAvLyBTYW1lIGFzIGZpbmRQYXRocyBidXQgd2l0aCBlYWdlciBiYWlsb3V0IG9uIGZpcnN0IG1hdGNoXG5cblxuZnVuY3Rpb24gaGFzTWF0Y2hpbmdQYXRocyhyb290LCBzZWxlY3RvcnMpIHtcbiAgdmFyIHN0YWNrID0gW3Jvb3QsIDBdO1xuICB2YXIgaW5kZXggPSAwO1xuXG4gIHdoaWxlIChpbmRleCA8IHN0YWNrLmxlbmd0aCkge1xuICAgIHZhciBmaWJlciA9IHN0YWNrW2luZGV4KytdO1xuICAgIHZhciBzZWxlY3RvckluZGV4ID0gc3RhY2tbaW5kZXgrK107XG4gICAgdmFyIHNlbGVjdG9yID0gc2VsZWN0b3JzW3NlbGVjdG9ySW5kZXhdO1xuXG4gICAgaWYgKGZpYmVyLnRhZyA9PT0gSG9zdENvbXBvbmVudCAmJiBpc0hpZGRlblN1YnRyZWUoZmliZXIpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgd2hpbGUgKHNlbGVjdG9yICE9IG51bGwgJiYgbWF0Y2hTZWxlY3RvcihmaWJlciwgc2VsZWN0b3IpKSB7XG4gICAgICAgIHNlbGVjdG9ySW5kZXgrKztcbiAgICAgICAgc2VsZWN0b3IgPSBzZWxlY3RvcnNbc2VsZWN0b3JJbmRleF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNlbGVjdG9ySW5kZXggPT09IHNlbGVjdG9ycy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgY2hpbGQgPSBmaWJlci5jaGlsZDtcblxuICAgICAgd2hpbGUgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgIHN0YWNrLnB1c2goY2hpbGQsIHNlbGVjdG9ySW5kZXgpO1xuICAgICAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBmaW5kQWxsTm9kZXMoaG9zdFJvb3QsIHNlbGVjdG9ycykge1xuICBpZiAoIXN1cHBvcnRzVGVzdFNlbGVjdG9ycykge1xuICAgIHRocm93IG5ldyBFcnJvcignVGVzdCBzZWxlY3RvciBBUEkgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIHJlbmRlcmVyLicpO1xuICB9XG5cbiAgdmFyIHJvb3QgPSBmaW5kRmliZXJSb290Rm9ySG9zdFJvb3QoaG9zdFJvb3QpO1xuICB2YXIgbWF0Y2hpbmdGaWJlcnMgPSBmaW5kUGF0aHMocm9vdCwgc2VsZWN0b3JzKTtcbiAgdmFyIGluc3RhbmNlUm9vdHMgPSBbXTtcbiAgdmFyIHN0YWNrID0gQXJyYXkuZnJvbShtYXRjaGluZ0ZpYmVycyk7XG4gIHZhciBpbmRleCA9IDA7XG5cbiAgd2hpbGUgKGluZGV4IDwgc3RhY2subGVuZ3RoKSB7XG4gICAgdmFyIG5vZGUgPSBzdGFja1tpbmRleCsrXTtcblxuICAgIGlmIChub2RlLnRhZyA9PT0gSG9zdENvbXBvbmVudCkge1xuICAgICAgaWYgKGlzSGlkZGVuU3VidHJlZShub2RlKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaW5zdGFuY2VSb290cy5wdXNoKG5vZGUuc3RhdGVOb2RlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGNoaWxkID0gbm9kZS5jaGlsZDtcblxuICAgICAgd2hpbGUgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgIHN0YWNrLnB1c2goY2hpbGQpO1xuICAgICAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGluc3RhbmNlUm9vdHM7XG59XG5mdW5jdGlvbiBnZXRGaW5kQWxsTm9kZXNGYWlsdXJlRGVzY3JpcHRpb24oaG9zdFJvb3QsIHNlbGVjdG9ycykge1xuICBpZiAoIXN1cHBvcnRzVGVzdFNlbGVjdG9ycykge1xuICAgIHRocm93IG5ldyBFcnJvcignVGVzdCBzZWxlY3RvciBBUEkgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIHJlbmRlcmVyLicpO1xuICB9XG5cbiAgdmFyIHJvb3QgPSBmaW5kRmliZXJSb290Rm9ySG9zdFJvb3QoaG9zdFJvb3QpO1xuICB2YXIgbWF4U2VsZWN0b3JJbmRleCA9IDA7XG4gIHZhciBtYXRjaGVkTmFtZXMgPSBbXTsgLy8gVGhlIGxvZ2ljIG9mIHRoaXMgbG9vcCBzaG91bGQgYmUga2VwdCBpbiBzeW5jIHdpdGggZmluZFBhdGhzKClcblxuICB2YXIgc3RhY2sgPSBbcm9vdCwgMF07XG4gIHZhciBpbmRleCA9IDA7XG5cbiAgd2hpbGUgKGluZGV4IDwgc3RhY2subGVuZ3RoKSB7XG4gICAgdmFyIGZpYmVyID0gc3RhY2tbaW5kZXgrK107XG4gICAgdmFyIHNlbGVjdG9ySW5kZXggPSBzdGFja1tpbmRleCsrXTtcbiAgICB2YXIgc2VsZWN0b3IgPSBzZWxlY3RvcnNbc2VsZWN0b3JJbmRleF07XG5cbiAgICBpZiAoZmliZXIudGFnID09PSBIb3N0Q29tcG9uZW50ICYmIGlzSGlkZGVuU3VidHJlZShmaWJlcikpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH0gZWxzZSBpZiAobWF0Y2hTZWxlY3RvcihmaWJlciwgc2VsZWN0b3IpKSB7XG4gICAgICBtYXRjaGVkTmFtZXMucHVzaChzZWxlY3RvclRvU3RyaW5nKHNlbGVjdG9yKSk7XG4gICAgICBzZWxlY3RvckluZGV4Kys7XG5cbiAgICAgIGlmIChzZWxlY3RvckluZGV4ID4gbWF4U2VsZWN0b3JJbmRleCkge1xuICAgICAgICBtYXhTZWxlY3RvckluZGV4ID0gc2VsZWN0b3JJbmRleDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2VsZWN0b3JJbmRleCA8IHNlbGVjdG9ycy5sZW5ndGgpIHtcbiAgICAgIHZhciBjaGlsZCA9IGZpYmVyLmNoaWxkO1xuXG4gICAgICB3aGlsZSAoY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgc3RhY2sucHVzaChjaGlsZCwgc2VsZWN0b3JJbmRleCk7XG4gICAgICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAobWF4U2VsZWN0b3JJbmRleCA8IHNlbGVjdG9ycy5sZW5ndGgpIHtcbiAgICB2YXIgdW5tYXRjaGVkTmFtZXMgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSBtYXhTZWxlY3RvckluZGV4OyBpIDwgc2VsZWN0b3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB1bm1hdGNoZWROYW1lcy5wdXNoKHNlbGVjdG9yVG9TdHJpbmcoc2VsZWN0b3JzW2ldKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuICdmaW5kQWxsTm9kZXMgd2FzIGFibGUgdG8gbWF0Y2ggcGFydCBvZiB0aGUgc2VsZWN0b3I6XFxuJyArIChcIiAgXCIgKyBtYXRjaGVkTmFtZXMuam9pbignID4gJykgKyBcIlxcblxcblwiKSArICdObyBtYXRjaGluZyBjb21wb25lbnQgd2FzIGZvdW5kIGZvcjpcXG4nICsgKFwiICBcIiArIHVubWF0Y2hlZE5hbWVzLmpvaW4oJyA+ICcpKTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gZmluZEJvdW5kaW5nUmVjdHMoaG9zdFJvb3QsIHNlbGVjdG9ycykge1xuICBpZiAoIXN1cHBvcnRzVGVzdFNlbGVjdG9ycykge1xuICAgIHRocm93IG5ldyBFcnJvcignVGVzdCBzZWxlY3RvciBBUEkgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIHJlbmRlcmVyLicpO1xuICB9XG5cbiAgdmFyIGluc3RhbmNlUm9vdHMgPSBmaW5kQWxsTm9kZXMoaG9zdFJvb3QsIHNlbGVjdG9ycyk7XG4gIHZhciBib3VuZGluZ1JlY3RzID0gW107XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbnN0YW5jZVJvb3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgYm91bmRpbmdSZWN0cy5wdXNoKGdldEJvdW5kaW5nUmVjdChpbnN0YW5jZVJvb3RzW2ldKSk7XG4gIH1cblxuICBmb3IgKHZhciBfaSA9IGJvdW5kaW5nUmVjdHMubGVuZ3RoIC0gMTsgX2kgPiAwOyBfaS0tKSB7XG4gICAgdmFyIHRhcmdldFJlY3QgPSBib3VuZGluZ1JlY3RzW19pXTtcbiAgICB2YXIgdGFyZ2V0TGVmdCA9IHRhcmdldFJlY3QueDtcbiAgICB2YXIgdGFyZ2V0UmlnaHQgPSB0YXJnZXRMZWZ0ICsgdGFyZ2V0UmVjdC53aWR0aDtcbiAgICB2YXIgdGFyZ2V0VG9wID0gdGFyZ2V0UmVjdC55O1xuICAgIHZhciB0YXJnZXRCb3R0b20gPSB0YXJnZXRUb3AgKyB0YXJnZXRSZWN0LmhlaWdodDtcblxuICAgIGZvciAodmFyIGogPSBfaSAtIDE7IGogPj0gMDsgai0tKSB7XG4gICAgICBpZiAoX2kgIT09IGopIHtcbiAgICAgICAgdmFyIG90aGVyUmVjdCA9IGJvdW5kaW5nUmVjdHNbal07XG4gICAgICAgIHZhciBvdGhlckxlZnQgPSBvdGhlclJlY3QueDtcbiAgICAgICAgdmFyIG90aGVyUmlnaHQgPSBvdGhlckxlZnQgKyBvdGhlclJlY3Qud2lkdGg7XG4gICAgICAgIHZhciBvdGhlclRvcCA9IG90aGVyUmVjdC55O1xuICAgICAgICB2YXIgb3RoZXJCb3R0b20gPSBvdGhlclRvcCArIG90aGVyUmVjdC5oZWlnaHQ7IC8vIE1lcmdpbmcgYWxsIHJlY3RzIHRvIHRoZSBtaW5pbXVtcyBzZXQgd291bGQgYmUgY29tcGxpY2F0ZWQsXG4gICAgICAgIC8vIGJ1dCB3ZSBjYW4gaGFuZGxlIHRoZSBtb3N0IGNvbW1vbiBjYXNlczpcbiAgICAgICAgLy8gMS4gY29tcGxldGVseSBvdmVybGFwcGluZyByZWN0c1xuICAgICAgICAvLyAyLiBhZGphY2VudCByZWN0cyB0aGF0IGFyZSB0aGUgc2FtZSB3aWR0aCBvciBoZWlnaHQgKGUuZy4gaXRlbXMgaW4gYSBsaXN0KVxuICAgICAgICAvL1xuICAgICAgICAvLyBFdmVuIGdpdmVuIHRoZSBhYm92ZSBjb25zdHJhaW50cyxcbiAgICAgICAgLy8gd2Ugc3RpbGwgd29uJ3QgZW5kIHVwIHdpdGggdGhlIGZld2VzdCBwb3NzaWJsZSByZWN0cyB3aXRob3V0IGRvaW5nIG11bHRpcGxlIHBhc3NlcyxcbiAgICAgICAgLy8gYnV0IGl0J3MgZ29vZCBlbm91Z2ggZm9yIHRoaXMgcHVycG9zZS5cblxuICAgICAgICBpZiAodGFyZ2V0TGVmdCA+PSBvdGhlckxlZnQgJiYgdGFyZ2V0VG9wID49IG90aGVyVG9wICYmIHRhcmdldFJpZ2h0IDw9IG90aGVyUmlnaHQgJiYgdGFyZ2V0Qm90dG9tIDw9IG90aGVyQm90dG9tKSB7XG4gICAgICAgICAgLy8gQ29tcGxldGUgb3ZlcmxhcHBpbmcgcmVjdHM7IHJlbW92ZSB0aGUgaW5uZXIgb25lLlxuICAgICAgICAgIGJvdW5kaW5nUmVjdHMuc3BsaWNlKF9pLCAxKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfSBlbHNlIGlmICh0YXJnZXRMZWZ0ID09PSBvdGhlckxlZnQgJiYgdGFyZ2V0UmVjdC53aWR0aCA9PT0gb3RoZXJSZWN0LndpZHRoICYmICEob3RoZXJCb3R0b20gPCB0YXJnZXRUb3ApICYmICEob3RoZXJUb3AgPiB0YXJnZXRCb3R0b20pKSB7XG4gICAgICAgICAgLy8gQWRqYWNlbnQgdmVydGljYWwgcmVjdHM7IG1lcmdlIHRoZW0uXG4gICAgICAgICAgaWYgKG90aGVyVG9wID4gdGFyZ2V0VG9wKSB7XG4gICAgICAgICAgICBvdGhlclJlY3QuaGVpZ2h0ICs9IG90aGVyVG9wIC0gdGFyZ2V0VG9wO1xuICAgICAgICAgICAgb3RoZXJSZWN0LnkgPSB0YXJnZXRUb3A7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKG90aGVyQm90dG9tIDwgdGFyZ2V0Qm90dG9tKSB7XG4gICAgICAgICAgICBvdGhlclJlY3QuaGVpZ2h0ID0gdGFyZ2V0Qm90dG9tIC0gb3RoZXJUb3A7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYm91bmRpbmdSZWN0cy5zcGxpY2UoX2ksIDEpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGVsc2UgaWYgKHRhcmdldFRvcCA9PT0gb3RoZXJUb3AgJiYgdGFyZ2V0UmVjdC5oZWlnaHQgPT09IG90aGVyUmVjdC5oZWlnaHQgJiYgIShvdGhlclJpZ2h0IDwgdGFyZ2V0TGVmdCkgJiYgIShvdGhlckxlZnQgPiB0YXJnZXRSaWdodCkpIHtcbiAgICAgICAgICAvLyBBZGphY2VudCBob3Jpem9udGFsIHJlY3RzOyBtZXJnZSB0aGVtLlxuICAgICAgICAgIGlmIChvdGhlckxlZnQgPiB0YXJnZXRMZWZ0KSB7XG4gICAgICAgICAgICBvdGhlclJlY3Qud2lkdGggKz0gb3RoZXJMZWZ0IC0gdGFyZ2V0TGVmdDtcbiAgICAgICAgICAgIG90aGVyUmVjdC54ID0gdGFyZ2V0TGVmdDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAob3RoZXJSaWdodCA8IHRhcmdldFJpZ2h0KSB7XG4gICAgICAgICAgICBvdGhlclJlY3Qud2lkdGggPSB0YXJnZXRSaWdodCAtIG90aGVyTGVmdDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBib3VuZGluZ1JlY3RzLnNwbGljZShfaSwgMSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gYm91bmRpbmdSZWN0cztcbn1cbmZ1bmN0aW9uIGZvY3VzV2l0aGluKGhvc3RSb290LCBzZWxlY3RvcnMpIHtcbiAgaWYgKCFzdXBwb3J0c1Rlc3RTZWxlY3RvcnMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Rlc3Qgc2VsZWN0b3IgQVBJIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyByZW5kZXJlci4nKTtcbiAgfVxuXG4gIHZhciByb290ID0gZmluZEZpYmVyUm9vdEZvckhvc3RSb290KGhvc3RSb290KTtcbiAgdmFyIG1hdGNoaW5nRmliZXJzID0gZmluZFBhdGhzKHJvb3QsIHNlbGVjdG9ycyk7XG4gIHZhciBzdGFjayA9IEFycmF5LmZyb20obWF0Y2hpbmdGaWJlcnMpO1xuICB2YXIgaW5kZXggPSAwO1xuXG4gIHdoaWxlIChpbmRleCA8IHN0YWNrLmxlbmd0aCkge1xuICAgIHZhciBmaWJlciA9IHN0YWNrW2luZGV4KytdO1xuXG4gICAgaWYgKGlzSGlkZGVuU3VidHJlZShmaWJlcikpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChmaWJlci50YWcgPT09IEhvc3RDb21wb25lbnQpIHtcbiAgICAgIHZhciBub2RlID0gZmliZXIuc3RhdGVOb2RlO1xuXG4gICAgICBpZiAoc2V0Rm9jdXNJZkZvY3VzYWJsZShub2RlKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgY2hpbGQgPSBmaWJlci5jaGlsZDtcblxuICAgIHdoaWxlIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgc3RhY2sucHVzaChjaGlsZCk7XG4gICAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxudmFyIGNvbW1pdEhvb2tzID0gW107XG5mdW5jdGlvbiBvbkNvbW1pdFJvb3QkMSgpIHtcbiAgaWYgKHN1cHBvcnRzVGVzdFNlbGVjdG9ycykge1xuICAgIGNvbW1pdEhvb2tzLmZvckVhY2goZnVuY3Rpb24gKGNvbW1pdEhvb2spIHtcbiAgICAgIHJldHVybiBjb21taXRIb29rKCk7XG4gICAgfSk7XG4gIH1cbn1cbmZ1bmN0aW9uIG9ic2VydmVWaXNpYmxlUmVjdHMoaG9zdFJvb3QsIHNlbGVjdG9ycywgY2FsbGJhY2ssIG9wdGlvbnMpIHtcbiAgaWYgKCFzdXBwb3J0c1Rlc3RTZWxlY3RvcnMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Rlc3Qgc2VsZWN0b3IgQVBJIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyByZW5kZXJlci4nKTtcbiAgfVxuXG4gIHZhciBpbnN0YW5jZVJvb3RzID0gZmluZEFsbE5vZGVzKGhvc3RSb290LCBzZWxlY3RvcnMpO1xuXG4gIHZhciBfc2V0dXBJbnRlcnNlY3Rpb25PYnMgPSBzZXR1cEludGVyc2VjdGlvbk9ic2VydmVyKGluc3RhbmNlUm9vdHMsIGNhbGxiYWNrLCBvcHRpb25zKSxcbiAgICAgIGRpc2Nvbm5lY3QgPSBfc2V0dXBJbnRlcnNlY3Rpb25PYnMuZGlzY29ubmVjdCxcbiAgICAgIG9ic2VydmUgPSBfc2V0dXBJbnRlcnNlY3Rpb25PYnMub2JzZXJ2ZSxcbiAgICAgIHVub2JzZXJ2ZSA9IF9zZXR1cEludGVyc2VjdGlvbk9icy51bm9ic2VydmU7IC8vIFdoZW4gUmVhY3QgbXV0YXRlcyB0aGUgaG9zdCBlbnZpcm9ubWVudCwgd2UgbWF5IG5lZWQgdG8gY2hhbmdlIHdoYXQgd2UncmUgbGlzdGVuaW5nIHRvLlxuXG5cbiAgdmFyIGNvbW1pdEhvb2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG5leHRJbnN0YW5jZVJvb3RzID0gZmluZEFsbE5vZGVzKGhvc3RSb290LCBzZWxlY3RvcnMpO1xuICAgIGluc3RhbmNlUm9vdHMuZm9yRWFjaChmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICBpZiAobmV4dEluc3RhbmNlUm9vdHMuaW5kZXhPZih0YXJnZXQpIDwgMCkge1xuICAgICAgICB1bm9ic2VydmUodGFyZ2V0KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBuZXh0SW5zdGFuY2VSb290cy5mb3JFYWNoKGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgIGlmIChpbnN0YW5jZVJvb3RzLmluZGV4T2YodGFyZ2V0KSA8IDApIHtcbiAgICAgICAgb2JzZXJ2ZSh0YXJnZXQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIGNvbW1pdEhvb2tzLnB1c2goY29tbWl0SG9vayk7XG4gIHJldHVybiB7XG4gICAgZGlzY29ubmVjdDogZnVuY3Rpb24gKCkge1xuICAgICAgLy8gU3RvcCBsaXN0ZW5pbmcgZm9yIFJlYWN0IG11dGF0aW9uczpcbiAgICAgIHZhciBpbmRleCA9IGNvbW1pdEhvb2tzLmluZGV4T2YoY29tbWl0SG9vayk7XG5cbiAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgIGNvbW1pdEhvb2tzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICB9IC8vIERpc2Nvbm5lY3QgdGhlIGhvc3Qgb2JzZXJ2ZXI6XG5cblxuICAgICAgZGlzY29ubmVjdCgpO1xuICAgIH1cbiAgfTtcbn1cblxudmFyIFJlYWN0Q3VycmVudEFjdFF1ZXVlID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50QWN0UXVldWU7XG5mdW5jdGlvbiBpc0xlZ2FjeUFjdEVudmlyb25tZW50KGZpYmVyKSB7XG4gIHtcbiAgICAvLyBMZWdhY3kgbW9kZS4gV2UgcHJlc2VydmUgdGhlIGJlaGF2aW9yIG9mIFJlYWN0IDE3J3MgYWN0LiBJdCBhc3N1bWVzIGFuXG4gICAgLy8gYWN0IGVudmlyb25tZW50IHdoZW5ldmVyIGBqZXN0YCBpcyBkZWZpbmVkLCBidXQgeW91IGNhbiBzdGlsbCB0dXJuIG9mZlxuICAgIC8vIHNwdXJpb3VzIHdhcm5pbmdzIGJ5IHNldHRpbmcgSVNfUkVBQ1RfQUNUX0VOVklST05NRU5UIGV4cGxpY2l0bHlcbiAgICAvLyB0byBmYWxzZS5cbiAgICB2YXIgaXNSZWFjdEFjdEVudmlyb25tZW50R2xvYmFsID0gLy8gJEZsb3dFeHBlY3RlZEVycm9yIFx1MjAxMyBGbG93IGRvZXNuJ3Qga25vdyBhYm91dCBJU19SRUFDVF9BQ1RfRU5WSVJPTk1FTlQgZ2xvYmFsXG4gICAgdHlwZW9mIElTX1JFQUNUX0FDVF9FTlZJUk9OTUVOVCAhPT0gJ3VuZGVmaW5lZCcgPyBJU19SRUFDVF9BQ1RfRU5WSVJPTk1FTlQgOiB1bmRlZmluZWQ7IC8vICRGbG93RXhwZWN0ZWRFcnJvciAtIEZsb3cgZG9lc24ndCBrbm93IGFib3V0IGplc3RcblxuICAgIHZhciBqZXN0SXNEZWZpbmVkID0gdHlwZW9mIGplc3QgIT09ICd1bmRlZmluZWQnO1xuICAgIHJldHVybiB3YXJuc0lmTm90QWN0aW5nICYmIGplc3RJc0RlZmluZWQgJiYgaXNSZWFjdEFjdEVudmlyb25tZW50R2xvYmFsICE9PSBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gaXNDb25jdXJyZW50QWN0RW52aXJvbm1lbnQoKSB7XG4gIHtcbiAgICB2YXIgaXNSZWFjdEFjdEVudmlyb25tZW50R2xvYmFsID0gLy8gJEZsb3dFeHBlY3RlZEVycm9yIFx1MjAxMyBGbG93IGRvZXNuJ3Qga25vdyBhYm91dCBJU19SRUFDVF9BQ1RfRU5WSVJPTk1FTlQgZ2xvYmFsXG4gICAgdHlwZW9mIElTX1JFQUNUX0FDVF9FTlZJUk9OTUVOVCAhPT0gJ3VuZGVmaW5lZCcgPyBJU19SRUFDVF9BQ1RfRU5WSVJPTk1FTlQgOiB1bmRlZmluZWQ7XG5cbiAgICBpZiAoIWlzUmVhY3RBY3RFbnZpcm9ubWVudEdsb2JhbCAmJiBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5jdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAvLyBUT0RPOiBJbmNsdWRlIGxpbmsgdG8gcmVsZXZhbnQgZG9jdW1lbnRhdGlvbiBwYWdlLlxuICAgICAgZXJyb3IoJ1RoZSBjdXJyZW50IHRlc3RpbmcgZW52aXJvbm1lbnQgaXMgbm90IGNvbmZpZ3VyZWQgdG8gc3VwcG9ydCAnICsgJ2FjdCguLi4pJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGlzUmVhY3RBY3RFbnZpcm9ubWVudEdsb2JhbDtcbiAgfVxufVxuXG52YXIgY2VpbCA9IE1hdGguY2VpbDtcbnZhciBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDIgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnREaXNwYXRjaGVyLFxuICAgIFJlYWN0Q3VycmVudE93bmVyJDIgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRPd25lcixcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQyID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50QmF0Y2hDb25maWcsXG4gICAgUmVhY3RDdXJyZW50QWN0UXVldWUkMSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudEFjdFF1ZXVlO1xudmFyIE5vQ29udGV4dCA9XG4vKiAgICAgICAgICAgICAqL1xuMDtcbnZhciBCYXRjaGVkQ29udGV4dCA9XG4vKiAgICAgICAgICAgICAgICovXG4xO1xudmFyIFJlbmRlckNvbnRleHQgPVxuLyogICAgICAgICAgICAgICAgKi9cbjI7XG52YXIgQ29tbWl0Q29udGV4dCA9XG4vKiAgICAgICAgICAgICAgICAqL1xuNDtcbnZhciBSb290SW5Qcm9ncmVzcyA9IDA7XG52YXIgUm9vdEZhdGFsRXJyb3JlZCA9IDE7XG52YXIgUm9vdEVycm9yZWQgPSAyO1xudmFyIFJvb3RTdXNwZW5kZWQgPSAzO1xudmFyIFJvb3RTdXNwZW5kZWRXaXRoRGVsYXkgPSA0O1xudmFyIFJvb3RDb21wbGV0ZWQgPSA1O1xudmFyIFJvb3REaWROb3RDb21wbGV0ZSA9IDY7IC8vIERlc2NyaWJlcyB3aGVyZSB3ZSBhcmUgaW4gdGhlIFJlYWN0IGV4ZWN1dGlvbiBzdGFja1xuXG52YXIgZXhlY3V0aW9uQ29udGV4dCA9IE5vQ29udGV4dDsgLy8gVGhlIHJvb3Qgd2UncmUgd29ya2luZyBvblxuXG52YXIgd29ya0luUHJvZ3Jlc3NSb290ID0gbnVsbDsgLy8gVGhlIGZpYmVyIHdlJ3JlIHdvcmtpbmcgb25cblxudmFyIHdvcmtJblByb2dyZXNzID0gbnVsbDsgLy8gVGhlIGxhbmVzIHdlJ3JlIHJlbmRlcmluZ1xuXG52YXIgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgPSBOb0xhbmVzOyAvLyBTdGFjayB0aGF0IGFsbG93cyBjb21wb25lbnRzIHRvIGNoYW5nZSB0aGUgcmVuZGVyIGxhbmVzIGZvciBpdHMgc3VidHJlZVxuLy8gVGhpcyBpcyBhIHN1cGVyc2V0IG9mIHRoZSBsYW5lcyB3ZSBzdGFydGVkIHdvcmtpbmcgb24gYXQgdGhlIHJvb3QuIFRoZSBvbmx5XG4vLyBjYXNlIHdoZXJlIGl0J3MgZGlmZmVyZW50IGZyb20gYHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzYCBpcyB3aGVuIHdlXG4vLyBlbnRlciBhIHN1YnRyZWUgdGhhdCBpcyBoaWRkZW4gYW5kIG5lZWRzIHRvIGJlIHVuaGlkZGVuOiBTdXNwZW5zZSBhbmRcbi8vIE9mZnNjcmVlbiBjb21wb25lbnQuXG4vL1xuLy8gTW9zdCB0aGluZ3MgaW4gdGhlIHdvcmsgbG9vcCBzaG91bGQgZGVhbCB3aXRoIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzLlxuLy8gTW9zdCB0aGluZ3MgaW4gYmVnaW4vY29tcGxldGUgcGhhc2VzIHNob3VsZCBkZWFsIHdpdGggc3VidHJlZVJlbmRlckxhbmVzLlxuXG52YXIgc3VidHJlZVJlbmRlckxhbmVzID0gTm9MYW5lcztcbnZhciBzdWJ0cmVlUmVuZGVyTGFuZXNDdXJzb3IgPSBjcmVhdGVDdXJzb3IoTm9MYW5lcyk7IC8vIFdoZXRoZXIgdG8gcm9vdCBjb21wbGV0ZWQsIGVycm9yZWQsIHN1c3BlbmRlZCwgZXRjLlxuXG52YXIgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9IFJvb3RJblByb2dyZXNzOyAvLyBBIGZhdGFsIGVycm9yLCBpZiBvbmUgaXMgdGhyb3duXG5cbnZhciB3b3JrSW5Qcm9ncmVzc1Jvb3RGYXRhbEVycm9yID0gbnVsbDsgLy8gXCJJbmNsdWRlZFwiIGxhbmVzIHJlZmVyIHRvIGxhbmVzIHRoYXQgd2VyZSB3b3JrZWQgb24gZHVyaW5nIHRoaXMgcmVuZGVyLiBJdCdzXG4vLyBzbGlnaHRseSBkaWZmZXJlbnQgdGhhbiBgcmVuZGVyTGFuZXNgIGJlY2F1c2UgYHJlbmRlckxhbmVzYCBjYW4gY2hhbmdlIGFzIHlvdVxuLy8gZW50ZXIgYW5kIGV4aXQgYW4gT2Zmc2NyZWVuIHRyZWUuIFRoaXMgdmFsdWUgaXMgdGhlIGNvbWJpbmF0aW9uIG9mIGFsbCByZW5kZXJcbi8vIGxhbmVzIGZvciB0aGUgZW50aXJlIHJlbmRlciBwaGFzZS5cblxudmFyIHdvcmtJblByb2dyZXNzUm9vdEluY2x1ZGVkTGFuZXMgPSBOb0xhbmVzOyAvLyBUaGUgd29yayBsZWZ0IG92ZXIgYnkgY29tcG9uZW50cyB0aGF0IHdlcmUgdmlzaXRlZCBkdXJpbmcgdGhpcyByZW5kZXIuIE9ubHlcbi8vIGluY2x1ZGVzIHVucHJvY2Vzc2VkIHVwZGF0ZXMsIG5vdCB3b3JrIGluIGJhaWxlZCBvdXQgY2hpbGRyZW4uXG5cbnZhciB3b3JrSW5Qcm9ncmVzc1Jvb3RTa2lwcGVkTGFuZXMgPSBOb0xhbmVzOyAvLyBMYW5lcyB0aGF0IHdlcmUgdXBkYXRlZCAoaW4gYW4gaW50ZXJsZWF2ZWQgZXZlbnQpIGR1cmluZyB0aGlzIHJlbmRlci5cblxudmFyIHdvcmtJblByb2dyZXNzUm9vdEludGVybGVhdmVkVXBkYXRlZExhbmVzID0gTm9MYW5lczsgLy8gTGFuZXMgdGhhdCB3ZXJlIHVwZGF0ZWQgZHVyaW5nIHRoZSByZW5kZXIgcGhhc2UgKCpub3QqIGFuIGludGVybGVhdmVkIGV2ZW50KS5cblxudmFyIHdvcmtJblByb2dyZXNzUm9vdFBpbmdlZExhbmVzID0gTm9MYW5lczsgLy8gRXJyb3JzIHRoYXQgYXJlIHRocm93biBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZS5cblxudmFyIHdvcmtJblByb2dyZXNzUm9vdENvbmN1cnJlbnRFcnJvcnMgPSBudWxsOyAvLyBUaGVzZSBhcmUgZXJyb3JzIHRoYXQgd2UgcmVjb3ZlcmVkIGZyb20gd2l0aG91dCBzdXJmYWNpbmcgdGhlbSB0byB0aGUgVUkuXG4vLyBXZSB3aWxsIGxvZyB0aGVtIG9uY2UgdGhlIHRyZWUgY29tbWl0cy5cblxudmFyIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzID0gbnVsbDsgLy8gVGhlIG1vc3QgcmVjZW50IHRpbWUgd2UgY29tbWl0dGVkIGEgZmFsbGJhY2suIFRoaXMgbGV0cyB1cyBlbnN1cmUgYSB0cmFpblxuLy8gbW9kZWwgd2hlcmUgd2UgZG9uJ3QgY29tbWl0IG5ldyBsb2FkaW5nIHN0YXRlcyBpbiB0b28gcXVpY2sgc3VjY2Vzc2lvbi5cblxudmFyIGdsb2JhbE1vc3RSZWNlbnRGYWxsYmFja1RpbWUgPSAwO1xudmFyIEZBTExCQUNLX1RIUk9UVExFX01TID0gNTAwOyAvLyBUaGUgYWJzb2x1dGUgdGltZSBmb3Igd2hlbiB3ZSBzaG91bGQgc3RhcnQgZ2l2aW5nIHVwIG9uIHJlbmRlcmluZ1xuLy8gbW9yZSBhbmQgcHJlZmVyIENQVSBzdXNwZW5zZSBoZXVyaXN0aWNzIGluc3RlYWQuXG5cbnZhciB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJUYXJnZXRUaW1lID0gSW5maW5pdHk7IC8vIEhvdyBsb25nIGEgcmVuZGVyIGlzIHN1cHBvc2VkIHRvIHRha2UgYmVmb3JlIHdlIHN0YXJ0IGZvbGxvd2luZyBDUFVcbi8vIHN1c3BlbnNlIGhldXJpc3RpY3MgYW5kIG9wdCBvdXQgb2YgcmVuZGVyaW5nIG1vcmUgY29udGVudC5cblxudmFyIFJFTkRFUl9USU1FT1VUX01TID0gNTAwO1xudmFyIHdvcmtJblByb2dyZXNzVHJhbnNpdGlvbnMgPSBudWxsO1xuXG5mdW5jdGlvbiByZXNldFJlbmRlclRpbWVyKCkge1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJUYXJnZXRUaW1lID0gbm93KCkgKyBSRU5ERVJfVElNRU9VVF9NUztcbn1cblxuZnVuY3Rpb24gZ2V0UmVuZGVyVGFyZ2V0VGltZSgpIHtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlclRhcmdldFRpbWU7XG59XG52YXIgaGFzVW5jYXVnaHRFcnJvciA9IGZhbHNlO1xudmFyIGZpcnN0VW5jYXVnaHRFcnJvciA9IG51bGw7XG52YXIgbGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQgPSBudWxsOyAvLyBPbmx5IHVzZWQgd2hlbiBlbmFibGVQcm9maWxlck5lc3RlZFVwZGF0ZVNjaGVkdWxlZEhvb2sgaXMgdHJ1ZTtcbnZhciByb290RG9lc0hhdmVQYXNzaXZlRWZmZWN0cyA9IGZhbHNlO1xudmFyIHJvb3RXaXRoUGVuZGluZ1Bhc3NpdmVFZmZlY3RzID0gbnVsbDtcbnZhciBwZW5kaW5nUGFzc2l2ZUVmZmVjdHNMYW5lcyA9IE5vTGFuZXM7XG52YXIgcGVuZGluZ1Bhc3NpdmVQcm9maWxlckVmZmVjdHMgPSBbXTtcbnZhciBwZW5kaW5nUGFzc2l2ZVRyYW5zaXRpb25zID0gbnVsbDsgLy8gVXNlIHRoZXNlIHRvIHByZXZlbnQgYW4gaW5maW5pdGUgbG9vcCBvZiBuZXN0ZWQgdXBkYXRlc1xuXG52YXIgTkVTVEVEX1VQREFURV9MSU1JVCA9IDUwO1xudmFyIG5lc3RlZFVwZGF0ZUNvdW50ID0gMDtcbnZhciByb290V2l0aE5lc3RlZFVwZGF0ZXMgPSBudWxsO1xudmFyIGlzRmx1c2hpbmdQYXNzaXZlRWZmZWN0cyA9IGZhbHNlO1xudmFyIGRpZFNjaGVkdWxlVXBkYXRlRHVyaW5nUGFzc2l2ZUVmZmVjdHMgPSBmYWxzZTtcbnZhciBORVNURURfUEFTU0lWRV9VUERBVEVfTElNSVQgPSA1MDtcbnZhciBuZXN0ZWRQYXNzaXZlVXBkYXRlQ291bnQgPSAwO1xudmFyIHJvb3RXaXRoUGFzc2l2ZU5lc3RlZFVwZGF0ZXMgPSBudWxsOyAvLyBJZiB0d28gdXBkYXRlcyBhcmUgc2NoZWR1bGVkIHdpdGhpbiB0aGUgc2FtZSBldmVudCwgd2Ugc2hvdWxkIHRyZWF0IHRoZWlyXG4vLyBldmVudCB0aW1lcyBhcyBzaW11bHRhbmVvdXMsIGV2ZW4gaWYgdGhlIGFjdHVhbCBjbG9jayB0aW1lIGhhcyBhZHZhbmNlZFxuLy8gYmV0d2VlbiB0aGUgZmlyc3QgYW5kIHNlY29uZCBjYWxsLlxuXG52YXIgY3VycmVudEV2ZW50VGltZSA9IE5vVGltZXN0YW1wO1xudmFyIGN1cnJlbnRFdmVudFRyYW5zaXRpb25MYW5lID0gTm9MYW5lcztcbnZhciBpc1J1bm5pbmdJbnNlcnRpb25FZmZlY3QgPSBmYWxzZTtcbmZ1bmN0aW9uIGdldFdvcmtJblByb2dyZXNzUm9vdCgpIHtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzUm9vdDtcbn1cbmZ1bmN0aW9uIHJlcXVlc3RFdmVudFRpbWUoKSB7XG4gIGlmICgoZXhlY3V0aW9uQ29udGV4dCAmIChSZW5kZXJDb250ZXh0IHwgQ29tbWl0Q29udGV4dCkpICE9PSBOb0NvbnRleHQpIHtcbiAgICAvLyBXZSdyZSBpbnNpZGUgUmVhY3QsIHNvIGl0J3MgZmluZSB0byByZWFkIHRoZSBhY3R1YWwgdGltZS5cbiAgICByZXR1cm4gbm93KCk7XG4gIH0gLy8gV2UncmUgbm90IGluc2lkZSBSZWFjdCwgc28gd2UgbWF5IGJlIGluIHRoZSBtaWRkbGUgb2YgYSBicm93c2VyIGV2ZW50LlxuXG5cbiAgaWYgKGN1cnJlbnRFdmVudFRpbWUgIT09IE5vVGltZXN0YW1wKSB7XG4gICAgLy8gVXNlIHRoZSBzYW1lIHN0YXJ0IHRpbWUgZm9yIGFsbCB1cGRhdGVzIHVudGlsIHdlIGVudGVyIFJlYWN0IGFnYWluLlxuICAgIHJldHVybiBjdXJyZW50RXZlbnRUaW1lO1xuICB9IC8vIFRoaXMgaXMgdGhlIGZpcnN0IHVwZGF0ZSBzaW5jZSBSZWFjdCB5aWVsZGVkLiBDb21wdXRlIGEgbmV3IHN0YXJ0IHRpbWUuXG5cblxuICBjdXJyZW50RXZlbnRUaW1lID0gbm93KCk7XG4gIHJldHVybiBjdXJyZW50RXZlbnRUaW1lO1xufVxuZnVuY3Rpb24gcmVxdWVzdFVwZGF0ZUxhbmUoZmliZXIpIHtcbiAgLy8gU3BlY2lhbCBjYXNlc1xuICB2YXIgbW9kZSA9IGZpYmVyLm1vZGU7XG5cbiAgaWYgKChtb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb01vZGUpIHtcbiAgICByZXR1cm4gU3luY0xhbmU7XG4gIH0gZWxzZSBpZiAoIChleGVjdXRpb25Db250ZXh0ICYgUmVuZGVyQ29udGV4dCkgIT09IE5vQ29udGV4dCAmJiB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyAhPT0gTm9MYW5lcykge1xuICAgIC8vIFRoaXMgaXMgYSByZW5kZXIgcGhhc2UgdXBkYXRlLiBUaGVzZSBhcmUgbm90IG9mZmljaWFsbHkgc3VwcG9ydGVkLiBUaGVcbiAgICAvLyBvbGQgYmVoYXZpb3IgaXMgdG8gZ2l2ZSB0aGlzIHRoZSBzYW1lIFwidGhyZWFkXCIgKGxhbmVzKSBhc1xuICAgIC8vIHdoYXRldmVyIGlzIGN1cnJlbnRseSByZW5kZXJpbmcuIFNvIGlmIHlvdSBjYWxsIGBzZXRTdGF0ZWAgb24gYSBjb21wb25lbnRcbiAgICAvLyB0aGF0IGhhcHBlbnMgbGF0ZXIgaW4gdGhlIHNhbWUgcmVuZGVyLCBpdCB3aWxsIGZsdXNoLiBJZGVhbGx5LCB3ZSB3YW50IHRvXG4gICAgLy8gcmVtb3ZlIHRoZSBzcGVjaWFsIGNhc2UgYW5kIHRyZWF0IHRoZW0gYXMgaWYgdGhleSBjYW1lIGZyb20gYW5cbiAgICAvLyBpbnRlcmxlYXZlZCBldmVudC4gUmVnYXJkbGVzcywgdGhpcyBwYXR0ZXJuIGlzIG5vdCBvZmZpY2lhbGx5IHN1cHBvcnRlZC5cbiAgICAvLyBUaGlzIGJlaGF2aW9yIGlzIG9ubHkgYSBmYWxsYmFjay4gVGhlIGZsYWcgb25seSBleGlzdHMgdW50aWwgd2UgY2FuIHJvbGxcbiAgICAvLyBvdXQgdGhlIHNldFN0YXRlIHdhcm5pbmcsIHNpbmNlIGV4aXN0aW5nIGNvZGUgbWlnaHQgYWNjaWRlbnRhbGx5IHJlbHkgb25cbiAgICAvLyB0aGUgY3VycmVudCBiZWhhdmlvci5cbiAgICByZXR1cm4gcGlja0FyYml0cmFyeUxhbmUod29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMpO1xuICB9XG5cbiAgdmFyIGlzVHJhbnNpdGlvbiA9IHJlcXVlc3RDdXJyZW50VHJhbnNpdGlvbigpICE9PSBOb1RyYW5zaXRpb247XG5cbiAgaWYgKGlzVHJhbnNpdGlvbikge1xuICAgIGlmICggUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMi50cmFuc2l0aW9uICE9PSBudWxsKSB7XG4gICAgICB2YXIgdHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDIudHJhbnNpdGlvbjtcblxuICAgICAgaWYgKCF0cmFuc2l0aW9uLl91cGRhdGVkRmliZXJzKSB7XG4gICAgICAgIHRyYW5zaXRpb24uX3VwZGF0ZWRGaWJlcnMgPSBuZXcgU2V0KCk7XG4gICAgICB9XG5cbiAgICAgIHRyYW5zaXRpb24uX3VwZGF0ZWRGaWJlcnMuYWRkKGZpYmVyKTtcbiAgICB9IC8vIFRoZSBhbGdvcml0aG0gZm9yIGFzc2lnbmluZyBhbiB1cGRhdGUgdG8gYSBsYW5lIHNob3VsZCBiZSBzdGFibGUgZm9yIGFsbFxuICAgIC8vIHVwZGF0ZXMgYXQgdGhlIHNhbWUgcHJpb3JpdHkgd2l0aGluIHRoZSBzYW1lIGV2ZW50LiBUbyBkbyB0aGlzLCB0aGVcbiAgICAvLyBpbnB1dHMgdG8gdGhlIGFsZ29yaXRobSBtdXN0IGJlIHRoZSBzYW1lLlxuICAgIC8vXG4gICAgLy8gVGhlIHRyaWNrIHdlIHVzZSBpcyB0byBjYWNoZSB0aGUgZmlyc3Qgb2YgZWFjaCBvZiB0aGVzZSBpbnB1dHMgd2l0aGluIGFuXG4gICAgLy8gZXZlbnQuIFRoZW4gcmVzZXQgdGhlIGNhY2hlZCB2YWx1ZXMgb25jZSB3ZSBjYW4gYmUgc3VyZSB0aGUgZXZlbnQgaXNcbiAgICAvLyBvdmVyLiBPdXIgaGV1cmlzdGljIGZvciB0aGF0IGlzIHdoZW5ldmVyIHdlIGVudGVyIGEgY29uY3VycmVudCB3b3JrIGxvb3AuXG5cblxuICAgIGlmIChjdXJyZW50RXZlbnRUcmFuc2l0aW9uTGFuZSA9PT0gTm9MYW5lKSB7XG4gICAgICAvLyBBbGwgdHJhbnNpdGlvbnMgd2l0aGluIHRoZSBzYW1lIGV2ZW50IGFyZSBhc3NpZ25lZCB0aGUgc2FtZSBsYW5lLlxuICAgICAgY3VycmVudEV2ZW50VHJhbnNpdGlvbkxhbmUgPSBjbGFpbU5leHRUcmFuc2l0aW9uTGFuZSgpO1xuICAgIH1cblxuICAgIHJldHVybiBjdXJyZW50RXZlbnRUcmFuc2l0aW9uTGFuZTtcbiAgfSAvLyBVcGRhdGVzIG9yaWdpbmF0aW5nIGluc2lkZSBjZXJ0YWluIFJlYWN0IG1ldGhvZHMsIGxpa2UgZmx1c2hTeW5jLCBoYXZlXG4gIC8vIHRoZWlyIHByaW9yaXR5IHNldCBieSB0cmFja2luZyBpdCB3aXRoIGEgY29udGV4dCB2YXJpYWJsZS5cbiAgLy9cbiAgLy8gVGhlIG9wYXF1ZSB0eXBlIHJldHVybmVkIGJ5IHRoZSBob3N0IGNvbmZpZyBpcyBpbnRlcm5hbGx5IGEgbGFuZSwgc28gd2UgY2FuXG4gIC8vIHVzZSB0aGF0IGRpcmVjdGx5LlxuICAvLyBUT0RPOiBNb3ZlIHRoaXMgdHlwZSBjb252ZXJzaW9uIHRvIHRoZSBldmVudCBwcmlvcml0eSBtb2R1bGUuXG5cblxuICB2YXIgdXBkYXRlTGFuZSA9IGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSgpO1xuXG4gIGlmICh1cGRhdGVMYW5lICE9PSBOb0xhbmUpIHtcbiAgICByZXR1cm4gdXBkYXRlTGFuZTtcbiAgfSAvLyBUaGlzIHVwZGF0ZSBvcmlnaW5hdGVkIG91dHNpZGUgUmVhY3QuIEFzayB0aGUgaG9zdCBlbnZpcm9ubWVudCBmb3IgYW5cbiAgLy8gYXBwcm9wcmlhdGUgcHJpb3JpdHksIGJhc2VkIG9uIHRoZSB0eXBlIG9mIGV2ZW50LlxuICAvL1xuICAvLyBUaGUgb3BhcXVlIHR5cGUgcmV0dXJuZWQgYnkgdGhlIGhvc3QgY29uZmlnIGlzIGludGVybmFsbHkgYSBsYW5lLCBzbyB3ZSBjYW5cbiAgLy8gdXNlIHRoYXQgZGlyZWN0bHkuXG4gIC8vIFRPRE86IE1vdmUgdGhpcyB0eXBlIGNvbnZlcnNpb24gdG8gdGhlIGV2ZW50IHByaW9yaXR5IG1vZHVsZS5cblxuXG4gIHZhciBldmVudExhbmUgPSBnZXRDdXJyZW50RXZlbnRQcmlvcml0eSgpO1xuICByZXR1cm4gZXZlbnRMYW5lO1xufVxuXG5mdW5jdGlvbiByZXF1ZXN0UmV0cnlMYW5lKGZpYmVyKSB7XG4gIC8vIFRoaXMgaXMgYSBmb3JrIG9mIGByZXF1ZXN0VXBkYXRlTGFuZWAgZGVzaWduZWQgc3BlY2lmaWNhbGx5IGZvciBTdXNwZW5zZVxuICAvLyBcInJldHJpZXNcIiBcdTIwMTQgYSBzcGVjaWFsIHVwZGF0ZSB0aGF0IGF0dGVtcHRzIHRvIGZsaXAgYSBTdXNwZW5zZSBib3VuZGFyeVxuICAvLyBmcm9tIGl0cyBwbGFjZWhvbGRlciBzdGF0ZSB0byBpdHMgcHJpbWFyeS9yZXNvbHZlZCBzdGF0ZS5cbiAgLy8gU3BlY2lhbCBjYXNlc1xuICB2YXIgbW9kZSA9IGZpYmVyLm1vZGU7XG5cbiAgaWYgKChtb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb01vZGUpIHtcbiAgICByZXR1cm4gU3luY0xhbmU7XG4gIH1cblxuICByZXR1cm4gY2xhaW1OZXh0UmV0cnlMYW5lKCk7XG59XG5cbmZ1bmN0aW9uIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgbGFuZSwgZXZlbnRUaW1lKSB7XG4gIGNoZWNrRm9yTmVzdGVkVXBkYXRlcygpO1xuXG4gIHtcbiAgICBpZiAoaXNSdW5uaW5nSW5zZXJ0aW9uRWZmZWN0KSB7XG4gICAgICBlcnJvcigndXNlSW5zZXJ0aW9uRWZmZWN0IG11c3Qgbm90IHNjaGVkdWxlIHVwZGF0ZXMuJyk7XG4gICAgfVxuICB9XG5cbiAge1xuICAgIGlmIChpc0ZsdXNoaW5nUGFzc2l2ZUVmZmVjdHMpIHtcbiAgICAgIGRpZFNjaGVkdWxlVXBkYXRlRHVyaW5nUGFzc2l2ZUVmZmVjdHMgPSB0cnVlO1xuICAgIH1cbiAgfSAvLyBNYXJrIHRoYXQgdGhlIHJvb3QgaGFzIGEgcGVuZGluZyB1cGRhdGUuXG5cblxuICBtYXJrUm9vdFVwZGF0ZWQocm9vdCwgbGFuZSwgZXZlbnRUaW1lKTtcblxuICBpZiAoKGV4ZWN1dGlvbkNvbnRleHQgJiBSZW5kZXJDb250ZXh0KSAhPT0gTm9MYW5lcyAmJiByb290ID09PSB3b3JrSW5Qcm9ncmVzc1Jvb3QpIHtcbiAgICAvLyBUaGlzIHVwZGF0ZSB3YXMgZGlzcGF0Y2hlZCBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZS4gVGhpcyBpcyBhIG1pc3Rha2VcbiAgICAvLyBpZiB0aGUgdXBkYXRlIG9yaWdpbmF0ZXMgZnJvbSB1c2VyIHNwYWNlICh3aXRoIHRoZSBleGNlcHRpb24gb2YgbG9jYWxcbiAgICAvLyBob29rIHVwZGF0ZXMsIHdoaWNoIGFyZSBoYW5kbGVkIGRpZmZlcmVudGx5IGFuZCBkb24ndCByZWFjaCB0aGlzXG4gICAgLy8gZnVuY3Rpb24pLCBidXQgdGhlcmUgYXJlIHNvbWUgaW50ZXJuYWwgUmVhY3QgZmVhdHVyZXMgdGhhdCB1c2UgdGhpcyBhc1xuICAgIC8vIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbCwgbGlrZSBzZWxlY3RpdmUgaHlkcmF0aW9uLlxuICAgIHdhcm5BYm91dFJlbmRlclBoYXNlVXBkYXRlc0luREVWKGZpYmVyKTsgLy8gVHJhY2sgbGFuZXMgdGhhdCB3ZXJlIHVwZGF0ZWQgZHVyaW5nIHRoZSByZW5kZXIgcGhhc2VcbiAgfSBlbHNlIHtcbiAgICAvLyBUaGlzIGlzIGEgbm9ybWFsIHVwZGF0ZSwgc2NoZWR1bGVkIGZyb20gb3V0c2lkZSB0aGUgcmVuZGVyIHBoYXNlLiBGb3JcbiAgICAvLyBleGFtcGxlLCBkdXJpbmcgYW4gaW5wdXQgZXZlbnQuXG4gICAge1xuICAgICAgaWYgKGlzRGV2VG9vbHNQcmVzZW50KSB7XG4gICAgICAgIGFkZEZpYmVyVG9MYW5lc01hcChyb290LCBmaWJlciwgbGFuZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgd2FybklmVXBkYXRlc05vdFdyYXBwZWRXaXRoQWN0REVWKGZpYmVyKTtcblxuICAgIGlmIChyb290ID09PSB3b3JrSW5Qcm9ncmVzc1Jvb3QpIHtcbiAgICAgIC8vIFJlY2VpdmVkIGFuIHVwZGF0ZSB0byBhIHRyZWUgdGhhdCdzIGluIHRoZSBtaWRkbGUgb2YgcmVuZGVyaW5nLiBNYXJrXG4gICAgICAvLyB0aGF0IHRoZXJlIHdhcyBhbiBpbnRlcmxlYXZlZCB1cGRhdGUgd29yayBvbiB0aGlzIHJvb3QuIFVubGVzcyB0aGVcbiAgICAgIC8vIGBkZWZlclJlbmRlclBoYXNlVXBkYXRlVG9OZXh0QmF0Y2hgIGZsYWcgaXMgb2ZmIGFuZCB0aGlzIGlzIGEgcmVuZGVyXG4gICAgICAvLyBwaGFzZSB1cGRhdGUuIEluIHRoYXQgY2FzZSwgd2UgZG9uJ3QgdHJlYXQgcmVuZGVyIHBoYXNlIHVwZGF0ZXMgYXMgaWZcbiAgICAgIC8vIHRoZXkgd2VyZSBpbnRlcmxlYXZlZCwgZm9yIGJhY2t3YXJkcyBjb21wYXQgcmVhc29ucy5cbiAgICAgIGlmICggKGV4ZWN1dGlvbkNvbnRleHQgJiBSZW5kZXJDb250ZXh0KSA9PT0gTm9Db250ZXh0KSB7XG4gICAgICAgIHdvcmtJblByb2dyZXNzUm9vdEludGVybGVhdmVkVXBkYXRlZExhbmVzID0gbWVyZ2VMYW5lcyh3b3JrSW5Qcm9ncmVzc1Jvb3RJbnRlcmxlYXZlZFVwZGF0ZWRMYW5lcywgbGFuZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID09PSBSb290U3VzcGVuZGVkV2l0aERlbGF5KSB7XG4gICAgICAgIC8vIFRoZSByb290IGFscmVhZHkgc3VzcGVuZGVkIHdpdGggYSBkZWxheSwgd2hpY2ggbWVhbnMgdGhpcyByZW5kZXJcbiAgICAgICAgLy8gZGVmaW5pdGVseSB3b24ndCBmaW5pc2guIFNpbmNlIHdlIGhhdmUgYSBuZXcgdXBkYXRlLCBsZXQncyBtYXJrIGl0IGFzXG4gICAgICAgIC8vIHN1c3BlbmRlZCBub3csIHJpZ2h0IGJlZm9yZSBtYXJraW5nIHRoZSBpbmNvbWluZyB1cGRhdGUuIFRoaXMgaGFzIHRoZVxuICAgICAgICAvLyBlZmZlY3Qgb2YgaW50ZXJydXB0aW5nIHRoZSBjdXJyZW50IHJlbmRlciBhbmQgc3dpdGNoaW5nIHRvIHRoZSB1cGRhdGUuXG4gICAgICAgIC8vIFRPRE86IE1ha2Ugc3VyZSB0aGlzIGRvZXNuJ3Qgb3ZlcnJpZGUgcGluZ3MgdGhhdCBoYXBwZW4gd2hpbGUgd2UndmVcbiAgICAgICAgLy8gYWxyZWFkeSBzdGFydGVkIHJlbmRlcmluZy5cbiAgICAgICAgbWFya1Jvb3RTdXNwZW5kZWQkMShyb290LCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIGV2ZW50VGltZSk7XG5cbiAgICBpZiAobGFuZSA9PT0gU3luY0xhbmUgJiYgZXhlY3V0aW9uQ29udGV4dCA9PT0gTm9Db250ZXh0ICYmIChmaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb01vZGUgJiYgLy8gVHJlYXQgYGFjdGAgYXMgaWYgaXQncyBpbnNpZGUgYGJhdGNoZWRVcGRhdGVzYCwgZXZlbiBpbiBsZWdhY3kgbW9kZS5cbiAgICAhKCBSZWFjdEN1cnJlbnRBY3RRdWV1ZSQxLmlzQmF0Y2hpbmdMZWdhY3kpKSB7XG4gICAgICAvLyBGbHVzaCB0aGUgc3luY2hyb25vdXMgd29yayBub3csIHVubGVzcyB3ZSdyZSBhbHJlYWR5IHdvcmtpbmcgb3IgaW5zaWRlXG4gICAgICAvLyBhIGJhdGNoLiBUaGlzIGlzIGludGVudGlvbmFsbHkgaW5zaWRlIHNjaGVkdWxlVXBkYXRlT25GaWJlciBpbnN0ZWFkIG9mXG4gICAgICAvLyBzY2hlZHVsZUNhbGxiYWNrRm9yRmliZXIgdG8gcHJlc2VydmUgdGhlIGFiaWxpdHkgdG8gc2NoZWR1bGUgYSBjYWxsYmFja1xuICAgICAgLy8gd2l0aG91dCBpbW1lZGlhdGVseSBmbHVzaGluZyBpdC4gV2Ugb25seSBkbyB0aGlzIGZvciB1c2VyLWluaXRpYXRlZFxuICAgICAgLy8gdXBkYXRlcywgdG8gcHJlc2VydmUgaGlzdG9yaWNhbCBiZWhhdmlvciBvZiBsZWdhY3kgbW9kZS5cbiAgICAgIHJlc2V0UmVuZGVyVGltZXIoKTtcbiAgICAgIGZsdXNoU3luY0NhbGxiYWNrc09ubHlJbkxlZ2FjeU1vZGUoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHNjaGVkdWxlSW5pdGlhbEh5ZHJhdGlvbk9uUm9vdChyb290LCBsYW5lLCBldmVudFRpbWUpIHtcbiAgLy8gVGhpcyBpcyBhIHNwZWNpYWwgZm9yayBvZiBzY2hlZHVsZVVwZGF0ZU9uRmliZXIgdGhhdCBpcyBvbmx5IHVzZWQgdG9cbiAgLy8gc2NoZWR1bGUgdGhlIGluaXRpYWwgaHlkcmF0aW9uIG9mIGEgcm9vdCB0aGF0IGhhcyBqdXN0IGJlZW4gY3JlYXRlZC4gTW9zdFxuICAvLyBvZiB0aGUgc3R1ZmYgaW4gc2NoZWR1bGVVcGRhdGVPbkZpYmVyIGNhbiBiZSBza2lwcGVkLlxuICAvL1xuICAvLyBUaGUgbWFpbiByZWFzb24gZm9yIHRoaXMgc2VwYXJhdGUgcGF0aCwgdGhvdWdoLCBpcyB0byBkaXN0aW5ndWlzaCB0aGVcbiAgLy8gaW5pdGlhbCBjaGlsZHJlbiBmcm9tIHN1YnNlcXVlbnQgdXBkYXRlcy4gSW4gZnVsbHkgY2xpZW50LXJlbmRlcmVkIHJvb3RzXG4gIC8vIChjcmVhdGVSb290IGluc3RlYWQgb2YgaHlkcmF0ZVJvb3QpLCBhbGwgdG9wLWxldmVsIHJlbmRlcnMgYXJlIG1vZGVsZWQgYXNcbiAgLy8gdXBkYXRlcywgYnV0IGh5ZHJhdGlvbiByb290cyBhcmUgc3BlY2lhbCBiZWNhdXNlIHRoZSBpbml0aWFsIHJlbmRlciBtdXN0XG4gIC8vIG1hdGNoIHdoYXQgd2FzIHJlbmRlcmVkIG9uIHRoZSBzZXJ2ZXIuXG4gIHZhciBjdXJyZW50ID0gcm9vdC5jdXJyZW50O1xuICBjdXJyZW50LmxhbmVzID0gbGFuZTtcbiAgbWFya1Jvb3RVcGRhdGVkKHJvb3QsIGxhbmUsIGV2ZW50VGltZSk7XG4gIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBldmVudFRpbWUpO1xufVxuZnVuY3Rpb24gaXNVbnNhZmVDbGFzc1JlbmRlclBoYXNlVXBkYXRlKGZpYmVyKSB7XG4gIC8vIENoZWNrIGlmIHRoaXMgaXMgYSByZW5kZXIgcGhhc2UgdXBkYXRlLiBPbmx5IGNhbGxlZCBieSBjbGFzcyBjb21wb25lbnRzLFxuICAvLyB3aGljaCBzcGVjaWFsIChkZXByZWNhdGVkKSBiZWhhdmlvciBmb3IgVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlIHByb3BzLlxuICByZXR1cm4gKC8vIFRPRE86IFJlbW92ZSBvdXRkYXRlZCBkZWZlclJlbmRlclBoYXNlVXBkYXRlVG9OZXh0QmF0Y2ggZXhwZXJpbWVudC4gV2VcbiAgICAvLyBkZWNpZGVkIG5vdCB0byBlbmFibGUgaXQuXG4gICAgIChleGVjdXRpb25Db250ZXh0ICYgUmVuZGVyQ29udGV4dCkgIT09IE5vQ29udGV4dFxuICApO1xufSAvLyBVc2UgdGhpcyBmdW5jdGlvbiB0byBzY2hlZHVsZSBhIHRhc2sgZm9yIGEgcm9vdC4gVGhlcmUncyBvbmx5IG9uZSB0YXNrIHBlclxuLy8gcm9vdDsgaWYgYSB0YXNrIHdhcyBhbHJlYWR5IHNjaGVkdWxlZCwgd2UnbGwgY2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBwcmlvcml0eVxuLy8gb2YgdGhlIGV4aXN0aW5nIHRhc2sgaXMgdGhlIHNhbWUgYXMgdGhlIHByaW9yaXR5IG9mIHRoZSBuZXh0IGxldmVsIHRoYXQgdGhlXG4vLyByb290IGhhcyB3b3JrIG9uLiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbiBldmVyeSB1cGRhdGUsIGFuZCByaWdodCBiZWZvcmVcbi8vIGV4aXRpbmcgYSB0YXNrLlxuXG5mdW5jdGlvbiBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgY3VycmVudFRpbWUpIHtcbiAgdmFyIGV4aXN0aW5nQ2FsbGJhY2tOb2RlID0gcm9vdC5jYWxsYmFja05vZGU7IC8vIENoZWNrIGlmIGFueSBsYW5lcyBhcmUgYmVpbmcgc3RhcnZlZCBieSBvdGhlciB3b3JrLiBJZiBzbywgbWFyayB0aGVtIGFzXG4gIC8vIGV4cGlyZWQgc28gd2Uga25vdyB0byB3b3JrIG9uIHRob3NlIG5leHQuXG5cbiAgbWFya1N0YXJ2ZWRMYW5lc0FzRXhwaXJlZChyb290LCBjdXJyZW50VGltZSk7IC8vIERldGVybWluZSB0aGUgbmV4dCBsYW5lcyB0byB3b3JrIG9uLCBhbmQgdGhlaXIgcHJpb3JpdHkuXG5cbiAgdmFyIG5leHRMYW5lcyA9IGdldE5leHRMYW5lcyhyb290LCByb290ID09PSB3b3JrSW5Qcm9ncmVzc1Jvb3QgPyB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyA6IE5vTGFuZXMpO1xuXG4gIGlmIChuZXh0TGFuZXMgPT09IE5vTGFuZXMpIHtcbiAgICAvLyBTcGVjaWFsIGNhc2U6IFRoZXJlJ3Mgbm90aGluZyB0byB3b3JrIG9uLlxuICAgIGlmIChleGlzdGluZ0NhbGxiYWNrTm9kZSAhPT0gbnVsbCkge1xuICAgICAgY2FuY2VsQ2FsbGJhY2skMShleGlzdGluZ0NhbGxiYWNrTm9kZSk7XG4gICAgfVxuXG4gICAgcm9vdC5jYWxsYmFja05vZGUgPSBudWxsO1xuICAgIHJvb3QuY2FsbGJhY2tQcmlvcml0eSA9IE5vTGFuZTtcbiAgICByZXR1cm47XG4gIH0gLy8gV2UgdXNlIHRoZSBoaWdoZXN0IHByaW9yaXR5IGxhbmUgdG8gcmVwcmVzZW50IHRoZSBwcmlvcml0eSBvZiB0aGUgY2FsbGJhY2suXG5cblxuICB2YXIgbmV3Q2FsbGJhY2tQcmlvcml0eSA9IGdldEhpZ2hlc3RQcmlvcml0eUxhbmUobmV4dExhbmVzKTsgLy8gQ2hlY2sgaWYgdGhlcmUncyBhbiBleGlzdGluZyB0YXNrLiBXZSBtYXkgYmUgYWJsZSB0byByZXVzZSBpdC5cblxuICB2YXIgZXhpc3RpbmdDYWxsYmFja1ByaW9yaXR5ID0gcm9vdC5jYWxsYmFja1ByaW9yaXR5O1xuXG4gIGlmIChleGlzdGluZ0NhbGxiYWNrUHJpb3JpdHkgPT09IG5ld0NhbGxiYWNrUHJpb3JpdHkgJiYgLy8gU3BlY2lhbCBjYXNlIHJlbGF0ZWQgdG8gYGFjdGAuIElmIHRoZSBjdXJyZW50bHkgc2NoZWR1bGVkIHRhc2sgaXMgYVxuICAvLyBTY2hlZHVsZXIgdGFzaywgcmF0aGVyIHRoYW4gYW4gYGFjdGAgdGFzaywgY2FuY2VsIGl0IGFuZCByZS1zY2hlZHVsZWRcbiAgLy8gb24gdGhlIGBhY3RgIHF1ZXVlLlxuICAhKCBSZWFjdEN1cnJlbnRBY3RRdWV1ZSQxLmN1cnJlbnQgIT09IG51bGwgJiYgZXhpc3RpbmdDYWxsYmFja05vZGUgIT09IGZha2VBY3RDYWxsYmFja05vZGUpKSB7XG4gICAge1xuICAgICAgLy8gSWYgd2UncmUgZ29pbmcgdG8gcmUtdXNlIGFuIGV4aXN0aW5nIHRhc2ssIGl0IG5lZWRzIHRvIGV4aXN0LlxuICAgICAgLy8gQXNzdW1lIHRoYXQgZGlzY3JldGUgdXBkYXRlIG1pY3JvdGFza3MgYXJlIG5vbi1jYW5jZWxsYWJsZSBhbmQgbnVsbC5cbiAgICAgIC8vIFRPRE86IFRlbXBvcmFyeSB1bnRpbCB3ZSBjb25maXJtIHRoaXMgd2FybmluZyBpcyBub3QgZmlyZWQuXG4gICAgICBpZiAoZXhpc3RpbmdDYWxsYmFja05vZGUgPT0gbnVsbCAmJiBleGlzdGluZ0NhbGxiYWNrUHJpb3JpdHkgIT09IFN5bmNMYW5lKSB7XG4gICAgICAgIGVycm9yKCdFeHBlY3RlZCBzY2hlZHVsZWQgY2FsbGJhY2sgdG8gZXhpc3QuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgICB9XG4gICAgfSAvLyBUaGUgcHJpb3JpdHkgaGFzbid0IGNoYW5nZWQuIFdlIGNhbiByZXVzZSB0aGUgZXhpc3RpbmcgdGFzay4gRXhpdC5cblxuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGV4aXN0aW5nQ2FsbGJhY2tOb2RlICE9IG51bGwpIHtcbiAgICAvLyBDYW5jZWwgdGhlIGV4aXN0aW5nIGNhbGxiYWNrLiBXZSdsbCBzY2hlZHVsZSBhIG5ldyBvbmUgYmVsb3cuXG4gICAgY2FuY2VsQ2FsbGJhY2skMShleGlzdGluZ0NhbGxiYWNrTm9kZSk7XG4gIH0gLy8gU2NoZWR1bGUgYSBuZXcgY2FsbGJhY2suXG5cblxuICB2YXIgbmV3Q2FsbGJhY2tOb2RlO1xuXG4gIGlmIChuZXdDYWxsYmFja1ByaW9yaXR5ID09PSBTeW5jTGFuZSkge1xuICAgIC8vIFNwZWNpYWwgY2FzZTogU3luYyBSZWFjdCBjYWxsYmFja3MgYXJlIHNjaGVkdWxlZCBvbiBhIHNwZWNpYWxcbiAgICAvLyBpbnRlcm5hbCBxdWV1ZVxuICAgIGlmIChyb290LnRhZyA9PT0gTGVnYWN5Um9vdCkge1xuICAgICAgaWYgKCBSZWFjdEN1cnJlbnRBY3RRdWV1ZSQxLmlzQmF0Y2hpbmdMZWdhY3kgIT09IG51bGwpIHtcbiAgICAgICAgUmVhY3RDdXJyZW50QWN0UXVldWUkMS5kaWRTY2hlZHVsZUxlZ2FjeVVwZGF0ZSA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIHNjaGVkdWxlTGVnYWN5U3luY0NhbGxiYWNrKHBlcmZvcm1TeW5jV29ya09uUm9vdC5iaW5kKG51bGwsIHJvb3QpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2NoZWR1bGVTeW5jQ2FsbGJhY2socGVyZm9ybVN5bmNXb3JrT25Sb290LmJpbmQobnVsbCwgcm9vdCkpO1xuICAgIH1cblxuICAgIGlmIChzdXBwb3J0c01pY3JvdGFza3MpIHtcbiAgICAgIC8vIEZsdXNoIHRoZSBxdWV1ZSBpbiBhIG1pY3JvdGFzay5cbiAgICAgIGlmICggUmVhY3RDdXJyZW50QWN0UXVldWUkMS5jdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAgIC8vIEluc2lkZSBgYWN0YCwgdXNlIG91ciBpbnRlcm5hbCBgYWN0YCBxdWV1ZSBzbyB0aGF0IHRoZXNlIGdldCBmbHVzaGVkXG4gICAgICAgIC8vIGF0IHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgc2NvcGUgZXZlbiB3aGVuIHVzaW5nIHRoZSBzeW5jIHZlcnNpb25cbiAgICAgICAgLy8gb2YgYGFjdGAuXG4gICAgICAgIFJlYWN0Q3VycmVudEFjdFF1ZXVlJDEuY3VycmVudC5wdXNoKGZsdXNoU3luY0NhbGxiYWNrcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzY2hlZHVsZU1pY3JvdGFzayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgLy8gSW4gU2FmYXJpLCBhcHBlbmRpbmcgYW4gaWZyYW1lIGZvcmNlcyBtaWNyb3Rhc2tzIHRvIHJ1bi5cbiAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzIyNDU5XG4gICAgICAgICAgLy8gV2UgZG9uJ3Qgc3VwcG9ydCBydW5uaW5nIGNhbGxiYWNrcyBpbiB0aGUgbWlkZGxlIG9mIHJlbmRlclxuICAgICAgICAgIC8vIG9yIGNvbW1pdCBzbyB3ZSBuZWVkIHRvIGNoZWNrIGFnYWluc3QgdGhhdC5cbiAgICAgICAgICBpZiAoKGV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSA9PT0gTm9Db250ZXh0KSB7XG4gICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhpcyB3b3VsZCBzdGlsbCBwcmVtYXR1cmVseSBmbHVzaCB0aGUgY2FsbGJhY2tzXG4gICAgICAgICAgICAvLyBpZiB0aGlzIGhhcHBlbnMgb3V0c2lkZSByZW5kZXIgb3IgY29tbWl0IHBoYXNlIChlLmcuIGluIGFuIGV2ZW50KS5cbiAgICAgICAgICAgIGZsdXNoU3luY0NhbGxiYWNrcygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZsdXNoIHRoZSBxdWV1ZSBpbiBhbiBJbW1lZGlhdGUgdGFzay5cbiAgICAgIHNjaGVkdWxlQ2FsbGJhY2skMShJbW1lZGlhdGVQcmlvcml0eSwgZmx1c2hTeW5jQ2FsbGJhY2tzKTtcbiAgICB9XG5cbiAgICBuZXdDYWxsYmFja05vZGUgPSBudWxsO1xuICB9IGVsc2Uge1xuICAgIHZhciBzY2hlZHVsZXJQcmlvcml0eUxldmVsO1xuXG4gICAgc3dpdGNoIChsYW5lc1RvRXZlbnRQcmlvcml0eShuZXh0TGFuZXMpKSB7XG4gICAgICBjYXNlIERpc2NyZXRlRXZlbnRQcmlvcml0eTpcbiAgICAgICAgc2NoZWR1bGVyUHJpb3JpdHlMZXZlbCA9IEltbWVkaWF0ZVByaW9yaXR5O1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBDb250aW51b3VzRXZlbnRQcmlvcml0eTpcbiAgICAgICAgc2NoZWR1bGVyUHJpb3JpdHlMZXZlbCA9IFVzZXJCbG9ja2luZ1ByaW9yaXR5O1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBEZWZhdWx0RXZlbnRQcmlvcml0eTpcbiAgICAgICAgc2NoZWR1bGVyUHJpb3JpdHlMZXZlbCA9IE5vcm1hbFByaW9yaXR5O1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBJZGxlRXZlbnRQcmlvcml0eTpcbiAgICAgICAgc2NoZWR1bGVyUHJpb3JpdHlMZXZlbCA9IElkbGVQcmlvcml0eTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHNjaGVkdWxlclByaW9yaXR5TGV2ZWwgPSBOb3JtYWxQcmlvcml0eTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgbmV3Q2FsbGJhY2tOb2RlID0gc2NoZWR1bGVDYWxsYmFjayQxKHNjaGVkdWxlclByaW9yaXR5TGV2ZWwsIHBlcmZvcm1Db25jdXJyZW50V29ya09uUm9vdC5iaW5kKG51bGwsIHJvb3QpKTtcbiAgfVxuXG4gIHJvb3QuY2FsbGJhY2tQcmlvcml0eSA9IG5ld0NhbGxiYWNrUHJpb3JpdHk7XG4gIHJvb3QuY2FsbGJhY2tOb2RlID0gbmV3Q2FsbGJhY2tOb2RlO1xufSAvLyBUaGlzIGlzIHRoZSBlbnRyeSBwb2ludCBmb3IgZXZlcnkgY29uY3VycmVudCB0YXNrLCBpLmUuIGFueXRoaW5nIHRoYXRcbi8vIGdvZXMgdGhyb3VnaCBTY2hlZHVsZXIuXG5cblxuZnVuY3Rpb24gcGVyZm9ybUNvbmN1cnJlbnRXb3JrT25Sb290KHJvb3QsIGRpZFRpbWVvdXQpIHtcbiAge1xuICAgIHJlc2V0TmVzdGVkVXBkYXRlRmxhZygpO1xuICB9IC8vIFNpbmNlIHdlIGtub3cgd2UncmUgaW4gYSBSZWFjdCBldmVudCwgd2UgY2FuIGNsZWFyIHRoZSBjdXJyZW50XG4gIC8vIGV2ZW50IHRpbWUuIFRoZSBuZXh0IHVwZGF0ZSB3aWxsIGNvbXB1dGUgYSBuZXcgZXZlbnQgdGltZS5cblxuXG4gIGN1cnJlbnRFdmVudFRpbWUgPSBOb1RpbWVzdGFtcDtcbiAgY3VycmVudEV2ZW50VHJhbnNpdGlvbkxhbmUgPSBOb0xhbmVzO1xuXG4gIGlmICgoZXhlY3V0aW9uQ29udGV4dCAmIChSZW5kZXJDb250ZXh0IHwgQ29tbWl0Q29udGV4dCkpICE9PSBOb0NvbnRleHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Nob3VsZCBub3QgYWxyZWFkeSBiZSB3b3JraW5nLicpO1xuICB9IC8vIEZsdXNoIGFueSBwZW5kaW5nIHBhc3NpdmUgZWZmZWN0cyBiZWZvcmUgZGVjaWRpbmcgd2hpY2ggbGFuZXMgdG8gd29yayBvbixcbiAgLy8gaW4gY2FzZSB0aGV5IHNjaGVkdWxlIGFkZGl0aW9uYWwgd29yay5cblxuXG4gIHZhciBvcmlnaW5hbENhbGxiYWNrTm9kZSA9IHJvb3QuY2FsbGJhY2tOb2RlO1xuICB2YXIgZGlkRmx1c2hQYXNzaXZlRWZmZWN0cyA9IGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTtcblxuICBpZiAoZGlkRmx1c2hQYXNzaXZlRWZmZWN0cykge1xuICAgIC8vIFNvbWV0aGluZyBpbiB0aGUgcGFzc2l2ZSBlZmZlY3QgcGhhc2UgbWF5IGhhdmUgY2FuY2VsZWQgdGhlIGN1cnJlbnQgdGFzay5cbiAgICAvLyBDaGVjayBpZiB0aGUgdGFzayBub2RlIGZvciB0aGlzIHJvb3Qgd2FzIGNoYW5nZWQuXG4gICAgaWYgKHJvb3QuY2FsbGJhY2tOb2RlICE9PSBvcmlnaW5hbENhbGxiYWNrTm9kZSkge1xuICAgICAgLy8gVGhlIGN1cnJlbnQgdGFzayB3YXMgY2FuY2VsZWQuIEV4aXQuIFdlIGRvbid0IG5lZWQgdG8gY2FsbFxuICAgICAgLy8gYGVuc3VyZVJvb3RJc1NjaGVkdWxlZGAgYmVjYXVzZSB0aGUgY2hlY2sgYWJvdmUgaW1wbGllcyBlaXRoZXIgdGhhdFxuICAgICAgLy8gdGhlcmUncyBhIG5ldyB0YXNrLCBvciB0aGF0IHRoZXJlJ3Mgbm8gcmVtYWluaW5nIHdvcmsgb24gdGhpcyByb290LlxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9IC8vIERldGVybWluZSB0aGUgbmV4dCBsYW5lcyB0byB3b3JrIG9uLCB1c2luZyB0aGUgZmllbGRzIHN0b3JlZFxuICAvLyBvbiB0aGUgcm9vdC5cblxuXG4gIHZhciBsYW5lcyA9IGdldE5leHRMYW5lcyhyb290LCByb290ID09PSB3b3JrSW5Qcm9ncmVzc1Jvb3QgPyB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyA6IE5vTGFuZXMpO1xuXG4gIGlmIChsYW5lcyA9PT0gTm9MYW5lcykge1xuICAgIC8vIERlZmVuc2l2ZSBjb2RpbmcuIFRoaXMgaXMgbmV2ZXIgZXhwZWN0ZWQgdG8gaGFwcGVuLlxuICAgIHJldHVybiBudWxsO1xuICB9IC8vIFdlIGRpc2FibGUgdGltZS1zbGljaW5nIGluIHNvbWUgY2FzZXM6IGlmIHRoZSB3b3JrIGhhcyBiZWVuIENQVS1ib3VuZFxuICAvLyBmb3IgdG9vIGxvbmcgKFwiZXhwaXJlZFwiIHdvcmssIHRvIHByZXZlbnQgc3RhcnZhdGlvbiksIG9yIHdlJ3JlIGluXG4gIC8vIHN5bmMtdXBkYXRlcy1ieS1kZWZhdWx0IG1vZGUuXG4gIC8vIFRPRE86IFdlIG9ubHkgY2hlY2sgYGRpZFRpbWVvdXRgIGRlZmVuc2l2ZWx5LCB0byBhY2NvdW50IGZvciBhIFNjaGVkdWxlclxuICAvLyBidWcgd2UncmUgc3RpbGwgaW52ZXN0aWdhdGluZy4gT25jZSB0aGUgYnVnIGluIFNjaGVkdWxlciBpcyBmaXhlZCxcbiAgLy8gd2UgY2FuIHJlbW92ZSB0aGlzLCBzaW5jZSB3ZSB0cmFjayBleHBpcmF0aW9uIG91cnNlbHZlcy5cblxuXG4gIHZhciBzaG91bGRUaW1lU2xpY2UgPSAhaW5jbHVkZXNCbG9ja2luZ0xhbmUocm9vdCwgbGFuZXMpICYmICFpbmNsdWRlc0V4cGlyZWRMYW5lKHJvb3QsIGxhbmVzKSAmJiAoICFkaWRUaW1lb3V0KTtcbiAgdmFyIGV4aXRTdGF0dXMgPSBzaG91bGRUaW1lU2xpY2UgPyByZW5kZXJSb290Q29uY3VycmVudChyb290LCBsYW5lcykgOiByZW5kZXJSb290U3luYyhyb290LCBsYW5lcyk7XG5cbiAgaWYgKGV4aXRTdGF0dXMgIT09IFJvb3RJblByb2dyZXNzKSB7XG4gICAgaWYgKGV4aXRTdGF0dXMgPT09IFJvb3RFcnJvcmVkKSB7XG4gICAgICAvLyBJZiBzb21ldGhpbmcgdGhyZXcgYW4gZXJyb3IsIHRyeSByZW5kZXJpbmcgb25lIG1vcmUgdGltZS4gV2UnbGxcbiAgICAgIC8vIHJlbmRlciBzeW5jaHJvbm91c2x5IHRvIGJsb2NrIGNvbmN1cnJlbnQgZGF0YSBtdXRhdGlvbnMsIGFuZCB3ZSdsbFxuICAgICAgLy8gaW5jbHVkZXMgYWxsIHBlbmRpbmcgdXBkYXRlcyBhcmUgaW5jbHVkZWQuIElmIGl0IHN0aWxsIGZhaWxzIGFmdGVyXG4gICAgICAvLyB0aGUgc2Vjb25kIGF0dGVtcHQsIHdlJ2xsIGdpdmUgdXAgYW5kIGNvbW1pdCB0aGUgcmVzdWx0aW5nIHRyZWUuXG4gICAgICB2YXIgZXJyb3JSZXRyeUxhbmVzID0gZ2V0TGFuZXNUb1JldHJ5U3luY2hyb25vdXNseU9uRXJyb3Iocm9vdCk7XG5cbiAgICAgIGlmIChlcnJvclJldHJ5TGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICAgICAgbGFuZXMgPSBlcnJvclJldHJ5TGFuZXM7XG4gICAgICAgIGV4aXRTdGF0dXMgPSByZWNvdmVyRnJvbUNvbmN1cnJlbnRFcnJvcihyb290LCBlcnJvclJldHJ5TGFuZXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChleGl0U3RhdHVzID09PSBSb290RmF0YWxFcnJvcmVkKSB7XG4gICAgICB2YXIgZmF0YWxFcnJvciA9IHdvcmtJblByb2dyZXNzUm9vdEZhdGFsRXJyb3I7XG4gICAgICBwcmVwYXJlRnJlc2hTdGFjayhyb290LCBOb0xhbmVzKTtcbiAgICAgIG1hcmtSb290U3VzcGVuZGVkJDEocm9vdCwgbGFuZXMpO1xuICAgICAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIG5vdygpKTtcbiAgICAgIHRocm93IGZhdGFsRXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKGV4aXRTdGF0dXMgPT09IFJvb3REaWROb3RDb21wbGV0ZSkge1xuICAgICAgLy8gVGhlIHJlbmRlciB1bndvdW5kIHdpdGhvdXQgY29tcGxldGluZyB0aGUgdHJlZS4gVGhpcyBoYXBwZW5zIGluIHNwZWNpYWxcbiAgICAgIC8vIGNhc2VzIHdoZXJlIG5lZWQgdG8gZXhpdCB0aGUgY3VycmVudCByZW5kZXIgd2l0aG91dCBwcm9kdWNpbmcgYVxuICAgICAgLy8gY29uc2lzdGVudCB0cmVlIG9yIGNvbW1pdHRpbmcuXG4gICAgICAvL1xuICAgICAgLy8gVGhpcyBzaG91bGQgb25seSBoYXBwZW4gZHVyaW5nIGEgY29uY3VycmVudCByZW5kZXIsIG5vdCBhIGRpc2NyZXRlIG9yXG4gICAgICAvLyBzeW5jaHJvbm91cyB1cGRhdGUuIFdlIHNob3VsZCBoYXZlIGFscmVhZHkgY2hlY2tlZCBmb3IgdGhpcyB3aGVuIHdlXG4gICAgICAvLyB1bndvdW5kIHRoZSBzdGFjay5cbiAgICAgIG1hcmtSb290U3VzcGVuZGVkJDEocm9vdCwgbGFuZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGUgcmVuZGVyIGNvbXBsZXRlZC5cbiAgICAgIC8vIENoZWNrIGlmIHRoaXMgcmVuZGVyIG1heSBoYXZlIHlpZWxkZWQgdG8gYSBjb25jdXJyZW50IGV2ZW50LCBhbmQgaWYgc28sXG4gICAgICAvLyBjb25maXJtIHRoYXQgYW55IG5ld2x5IHJlbmRlcmVkIHN0b3JlcyBhcmUgY29uc2lzdGVudC5cbiAgICAgIC8vIFRPRE86IEl0J3MgcG9zc2libGUgdGhhdCBldmVuIGEgY29uY3VycmVudCByZW5kZXIgbWF5IG5ldmVyIGhhdmUgeWllbGRlZFxuICAgICAgLy8gdG8gdGhlIG1haW4gdGhyZWFkLCBpZiBpdCB3YXMgZmFzdCBlbm91Z2gsIG9yIGlmIGl0IGV4cGlyZWQuIFdlIGNvdWxkXG4gICAgICAvLyBza2lwIHRoZSBjb25zaXN0ZW5jeSBjaGVjayBpbiB0aGF0IGNhc2UsIHRvby5cbiAgICAgIHZhciByZW5kZXJXYXNDb25jdXJyZW50ID0gIWluY2x1ZGVzQmxvY2tpbmdMYW5lKHJvb3QsIGxhbmVzKTtcbiAgICAgIHZhciBmaW5pc2hlZFdvcmsgPSByb290LmN1cnJlbnQuYWx0ZXJuYXRlO1xuXG4gICAgICBpZiAocmVuZGVyV2FzQ29uY3VycmVudCAmJiAhaXNSZW5kZXJDb25zaXN0ZW50V2l0aEV4dGVybmFsU3RvcmVzKGZpbmlzaGVkV29yaykpIHtcbiAgICAgICAgLy8gQSBzdG9yZSB3YXMgbXV0YXRlZCBpbiBhbiBpbnRlcmxlYXZlZCBldmVudC4gUmVuZGVyIGFnYWluLFxuICAgICAgICAvLyBzeW5jaHJvbm91c2x5LCB0byBibG9jayBmdXJ0aGVyIG11dGF0aW9ucy5cbiAgICAgICAgZXhpdFN0YXR1cyA9IHJlbmRlclJvb3RTeW5jKHJvb3QsIGxhbmVzKTsgLy8gV2UgbmVlZCB0byBjaGVjayBhZ2FpbiBpZiBzb21ldGhpbmcgdGhyZXdcblxuICAgICAgICBpZiAoZXhpdFN0YXR1cyA9PT0gUm9vdEVycm9yZWQpIHtcbiAgICAgICAgICB2YXIgX2Vycm9yUmV0cnlMYW5lcyA9IGdldExhbmVzVG9SZXRyeVN5bmNocm9ub3VzbHlPbkVycm9yKHJvb3QpO1xuXG4gICAgICAgICAgaWYgKF9lcnJvclJldHJ5TGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICAgICAgICAgIGxhbmVzID0gX2Vycm9yUmV0cnlMYW5lcztcbiAgICAgICAgICAgIGV4aXRTdGF0dXMgPSByZWNvdmVyRnJvbUNvbmN1cnJlbnRFcnJvcihyb290LCBfZXJyb3JSZXRyeUxhbmVzKTsgLy8gV2UgYXNzdW1lIHRoZSB0cmVlIGlzIG5vdyBjb25zaXN0ZW50IGJlY2F1c2Ugd2UgZGlkbid0IHlpZWxkIHRvIGFueVxuICAgICAgICAgICAgLy8gY29uY3VycmVudCBldmVudHMuXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV4aXRTdGF0dXMgPT09IFJvb3RGYXRhbEVycm9yZWQpIHtcbiAgICAgICAgICB2YXIgX2ZhdGFsRXJyb3IgPSB3b3JrSW5Qcm9ncmVzc1Jvb3RGYXRhbEVycm9yO1xuICAgICAgICAgIHByZXBhcmVGcmVzaFN0YWNrKHJvb3QsIE5vTGFuZXMpO1xuICAgICAgICAgIG1hcmtSb290U3VzcGVuZGVkJDEocm9vdCwgbGFuZXMpO1xuICAgICAgICAgIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBub3coKSk7XG4gICAgICAgICAgdGhyb3cgX2ZhdGFsRXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gV2Ugbm93IGhhdmUgYSBjb25zaXN0ZW50IHRyZWUuIFRoZSBuZXh0IHN0ZXAgaXMgZWl0aGVyIHRvIGNvbW1pdCBpdCxcbiAgICAgIC8vIG9yLCBpZiBzb21ldGhpbmcgc3VzcGVuZGVkLCB3YWl0IHRvIGNvbW1pdCBpdCBhZnRlciBhIHRpbWVvdXQuXG5cblxuICAgICAgcm9vdC5maW5pc2hlZFdvcmsgPSBmaW5pc2hlZFdvcms7XG4gICAgICByb290LmZpbmlzaGVkTGFuZXMgPSBsYW5lcztcbiAgICAgIGZpbmlzaENvbmN1cnJlbnRSZW5kZXIocm9vdCwgZXhpdFN0YXR1cywgbGFuZXMpO1xuICAgIH1cbiAgfVxuXG4gIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBub3coKSk7XG5cbiAgaWYgKHJvb3QuY2FsbGJhY2tOb2RlID09PSBvcmlnaW5hbENhbGxiYWNrTm9kZSkge1xuICAgIC8vIFRoZSB0YXNrIG5vZGUgc2NoZWR1bGVkIGZvciB0aGlzIHJvb3QgaXMgdGhlIHNhbWUgb25lIHRoYXQnc1xuICAgIC8vIGN1cnJlbnRseSBleGVjdXRlZC4gTmVlZCB0byByZXR1cm4gYSBjb250aW51YXRpb24uXG4gICAgcmV0dXJuIHBlcmZvcm1Db25jdXJyZW50V29ya09uUm9vdC5iaW5kKG51bGwsIHJvb3QpO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIHJlY292ZXJGcm9tQ29uY3VycmVudEVycm9yKHJvb3QsIGVycm9yUmV0cnlMYW5lcykge1xuICAvLyBJZiBhbiBlcnJvciBvY2N1cnJlZCBkdXJpbmcgaHlkcmF0aW9uLCBkaXNjYXJkIHNlcnZlciByZXNwb25zZSBhbmQgZmFsbFxuICAvLyBiYWNrIHRvIGNsaWVudCBzaWRlIHJlbmRlci5cbiAgLy8gQmVmb3JlIHJlbmRlcmluZyBhZ2Fpbiwgc2F2ZSB0aGUgZXJyb3JzIGZyb20gdGhlIHByZXZpb3VzIGF0dGVtcHQuXG4gIHZhciBlcnJvcnNGcm9tRmlyc3RBdHRlbXB0ID0gd29ya0luUHJvZ3Jlc3NSb290Q29uY3VycmVudEVycm9ycztcblxuICBpZiAoaXNSb290RGVoeWRyYXRlZChyb290KSkge1xuICAgIC8vIFRoZSBzaGVsbCBmYWlsZWQgdG8gaHlkcmF0ZS4gU2V0IGEgZmxhZyB0byBmb3JjZSBhIGNsaWVudCByZW5kZXJpbmdcbiAgICAvLyBkdXJpbmcgdGhlIG5leHQgYXR0ZW1wdC4gVG8gZG8gdGhpcywgd2UgY2FsbCBwcmVwYXJlRnJlc2hTdGFjayBub3dcbiAgICAvLyB0byBjcmVhdGUgdGhlIHJvb3Qgd29yay1pbi1wcm9ncmVzcyBmaWJlci4gVGhpcyBpcyBhIGJpdCB3ZWlyZCBpbiB0ZXJtc1xuICAgIC8vIG9mIGZhY3RvcmluZywgYmVjYXVzZSBpdCByZWxpZXMgb24gcmVuZGVyUm9vdFN5bmMgbm90IGNhbGxpbmdcbiAgICAvLyBwcmVwYXJlRnJlc2hTdGFjayBhZ2FpbiBpbiB0aGUgY2FsbCBiZWxvdywgd2hpY2ggaGFwcGVucyBiZWNhdXNlIHRoZVxuICAgIC8vIHJvb3QgYW5kIGxhbmVzIGhhdmVuJ3QgY2hhbmdlZC5cbiAgICAvL1xuICAgIC8vIFRPRE86IEkgdGhpbmsgd2hhdCB3ZSBzaG91bGQgZG8gaXMgc2V0IEZvcmNlQ2xpZW50UmVuZGVyIGluc2lkZVxuICAgIC8vIHRocm93RXhjZXB0aW9uLCBsaWtlIHdlIGRvIGZvciBuZXN0ZWQgU3VzcGVuc2UgYm91bmRhcmllcy4gVGhlIHJlYXNvblxuICAgIC8vIGl0J3MgaGVyZSBpbnN0ZWFkIGlzIHNvIHdlIGNhbiBzd2l0Y2ggdG8gdGhlIHN5bmNocm9ub3VzIHdvcmsgbG9vcCwgdG9vLlxuICAgIC8vIFNvbWV0aGluZyB0byBjb25zaWRlciBmb3IgYSBmdXR1cmUgcmVmYWN0b3IuXG4gICAgdmFyIHJvb3RXb3JrSW5Qcm9ncmVzcyA9IHByZXBhcmVGcmVzaFN0YWNrKHJvb3QsIGVycm9yUmV0cnlMYW5lcyk7XG4gICAgcm9vdFdvcmtJblByb2dyZXNzLmZsYWdzIHw9IEZvcmNlQ2xpZW50UmVuZGVyO1xuXG4gICAge1xuICAgICAgZXJyb3JIeWRyYXRpbmdDb250YWluZXIocm9vdC5jb250YWluZXJJbmZvKTtcbiAgICB9XG4gIH1cblxuICB2YXIgZXhpdFN0YXR1cyA9IHJlbmRlclJvb3RTeW5jKHJvb3QsIGVycm9yUmV0cnlMYW5lcyk7XG5cbiAgaWYgKGV4aXRTdGF0dXMgIT09IFJvb3RFcnJvcmVkKSB7XG4gICAgLy8gU3VjY2Vzc2Z1bGx5IGZpbmlzaGVkIHJlbmRlcmluZyBvbiByZXRyeVxuICAgIC8vIFRoZSBlcnJvcnMgZnJvbSB0aGUgZmFpbGVkIGZpcnN0IGF0dGVtcHQgaGF2ZSBiZWVuIHJlY292ZXJlZC4gQWRkXG4gICAgLy8gdGhlbSB0byB0aGUgY29sbGVjdGlvbiBvZiByZWNvdmVyYWJsZSBlcnJvcnMuIFdlJ2xsIGxvZyB0aGVtIGluIHRoZVxuICAgIC8vIGNvbW1pdCBwaGFzZS5cbiAgICB2YXIgZXJyb3JzRnJvbVNlY29uZEF0dGVtcHQgPSB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycztcbiAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycyA9IGVycm9yc0Zyb21GaXJzdEF0dGVtcHQ7IC8vIFRoZSBlcnJvcnMgZnJvbSB0aGUgc2Vjb25kIGF0dGVtcHQgc2hvdWxkIGJlIHF1ZXVlZCBhZnRlciB0aGUgZXJyb3JzXG4gICAgLy8gZnJvbSB0aGUgZmlyc3QgYXR0ZW1wdCwgdG8gcHJlc2VydmUgdGhlIGNhdXNhbCBzZXF1ZW5jZS5cblxuICAgIGlmIChlcnJvcnNGcm9tU2Vjb25kQXR0ZW1wdCAhPT0gbnVsbCkge1xuICAgICAgcXVldWVSZWNvdmVyYWJsZUVycm9ycyhlcnJvcnNGcm9tU2Vjb25kQXR0ZW1wdCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGV4aXRTdGF0dXM7XG59XG5cbmZ1bmN0aW9uIHF1ZXVlUmVjb3ZlcmFibGVFcnJvcnMoZXJyb3JzKSB7XG4gIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycyA9PT0gbnVsbCkge1xuICAgIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzID0gZXJyb3JzO1xuICB9IGVsc2Uge1xuICAgIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzLnB1c2guYXBwbHkod29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMsIGVycm9ycyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluaXNoQ29uY3VycmVudFJlbmRlcihyb290LCBleGl0U3RhdHVzLCBsYW5lcykge1xuICBzd2l0Y2ggKGV4aXRTdGF0dXMpIHtcbiAgICBjYXNlIFJvb3RJblByb2dyZXNzOlxuICAgIGNhc2UgUm9vdEZhdGFsRXJyb3JlZDpcbiAgICAgIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSb290IGRpZCBub3QgY29tcGxldGUuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuJyk7XG4gICAgICB9XG4gICAgLy8gRmxvdyBrbm93cyBhYm91dCBpbnZhcmlhbnQsIHNvIGl0IGNvbXBsYWlucyBpZiBJIGFkZCBhIGJyZWFrXG4gICAgLy8gc3RhdGVtZW50LCBidXQgZXNsaW50IGRvZXNuJ3Qga25vdyBhYm91dCBpbnZhcmlhbnQsIHNvIGl0IGNvbXBsYWluc1xuICAgIC8vIGlmIEkgZG8uIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuXG4gICAgY2FzZSBSb290RXJyb3JlZDpcbiAgICAgIHtcbiAgICAgICAgLy8gV2Ugc2hvdWxkIGhhdmUgYWxyZWFkeSBhdHRlbXB0ZWQgdG8gcmV0cnkgdGhpcyB0cmVlLiBJZiB3ZSByZWFjaGVkXG4gICAgICAgIC8vIHRoaXMgcG9pbnQsIGl0IGVycm9yZWQgYWdhaW4uIENvbW1pdCBpdC5cbiAgICAgICAgY29tbWl0Um9vdChyb290LCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycywgd29ya0luUHJvZ3Jlc3NUcmFuc2l0aW9ucyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBSb290U3VzcGVuZGVkOlxuICAgICAge1xuICAgICAgICBtYXJrUm9vdFN1c3BlbmRlZCQxKHJvb3QsIGxhbmVzKTsgLy8gV2UgaGF2ZSBhbiBhY2NlcHRhYmxlIGxvYWRpbmcgc3RhdGUuIFdlIG5lZWQgdG8gZmlndXJlIG91dCBpZiB3ZVxuICAgICAgICAvLyBzaG91bGQgaW1tZWRpYXRlbHkgY29tbWl0IGl0IG9yIHdhaXQgYSBiaXQuXG5cbiAgICAgICAgaWYgKGluY2x1ZGVzT25seVJldHJpZXMobGFuZXMpICYmIC8vIGRvIG5vdCBkZWxheSBpZiB3ZSdyZSBpbnNpZGUgYW4gYWN0KCkgc2NvcGVcbiAgICAgICAgIXNob3VsZEZvcmNlRmx1c2hGYWxsYmFja3NJbkRFVigpKSB7XG4gICAgICAgICAgLy8gVGhpcyByZW5kZXIgb25seSBpbmNsdWRlZCByZXRyaWVzLCBubyB1cGRhdGVzLiBUaHJvdHRsZSBjb21taXR0aW5nXG4gICAgICAgICAgLy8gcmV0cmllcyBzbyB0aGF0IHdlIGRvbid0IHNob3cgdG9vIG1hbnkgbG9hZGluZyBzdGF0ZXMgdG9vIHF1aWNrbHkuXG4gICAgICAgICAgdmFyIG1zVW50aWxUaW1lb3V0ID0gZ2xvYmFsTW9zdFJlY2VudEZhbGxiYWNrVGltZSArIEZBTExCQUNLX1RIUk9UVExFX01TIC0gbm93KCk7IC8vIERvbid0IGJvdGhlciB3aXRoIGEgdmVyeSBzaG9ydCBzdXNwZW5zZSB0aW1lLlxuXG4gICAgICAgICAgaWYgKG1zVW50aWxUaW1lb3V0ID4gMTApIHtcbiAgICAgICAgICAgIHZhciBuZXh0TGFuZXMgPSBnZXROZXh0TGFuZXMocm9vdCwgTm9MYW5lcyk7XG5cbiAgICAgICAgICAgIGlmIChuZXh0TGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICAgICAgICAgICAgLy8gVGhlcmUncyBhZGRpdGlvbmFsIHdvcmsgb24gdGhpcyByb290LlxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHN1c3BlbmRlZExhbmVzID0gcm9vdC5zdXNwZW5kZWRMYW5lcztcblxuICAgICAgICAgICAgaWYgKCFpc1N1YnNldE9mTGFuZXMoc3VzcGVuZGVkTGFuZXMsIGxhbmVzKSkge1xuICAgICAgICAgICAgICAvLyBXZSBzaG91bGQgcHJlZmVyIHRvIHJlbmRlciB0aGUgZmFsbGJhY2sgb2YgYXQgdGhlIGxhc3RcbiAgICAgICAgICAgICAgLy8gc3VzcGVuZGVkIGxldmVsLiBQaW5nIHRoZSBsYXN0IHN1c3BlbmRlZCBsZXZlbCB0byB0cnlcbiAgICAgICAgICAgICAgLy8gcmVuZGVyaW5nIGl0IGFnYWluLlxuICAgICAgICAgICAgICAvLyBGSVhNRTogV2hhdCBpZiB0aGUgc3VzcGVuZGVkIGxhbmVzIGFyZSBJZGxlPyBTaG91bGQgbm90IHJlc3RhcnQuXG4gICAgICAgICAgICAgIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gICAgICAgICAgICAgIG1hcmtSb290UGluZ2VkKHJvb3QsIHN1c3BlbmRlZExhbmVzKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9IC8vIFRoZSByZW5kZXIgaXMgc3VzcGVuZGVkLCBpdCBoYXNuJ3QgdGltZWQgb3V0LCBhbmQgdGhlcmUncyBub1xuICAgICAgICAgICAgLy8gbG93ZXIgcHJpb3JpdHkgd29yayB0byBkby4gSW5zdGVhZCBvZiBjb21taXR0aW5nIHRoZSBmYWxsYmFja1xuICAgICAgICAgICAgLy8gaW1tZWRpYXRlbHksIHdhaXQgZm9yIG1vcmUgZGF0YSB0byBhcnJpdmUuXG5cblxuICAgICAgICAgICAgcm9vdC50aW1lb3V0SGFuZGxlID0gc2NoZWR1bGVUaW1lb3V0KGNvbW1pdFJvb3QuYmluZChudWxsLCByb290LCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycywgd29ya0luUHJvZ3Jlc3NUcmFuc2l0aW9ucyksIG1zVW50aWxUaW1lb3V0KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfSAvLyBUaGUgd29yayBleHBpcmVkLiBDb21taXQgaW1tZWRpYXRlbHkuXG5cblxuICAgICAgICBjb21taXRSb290KHJvb3QsIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzLCB3b3JrSW5Qcm9ncmVzc1RyYW5zaXRpb25zKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIFJvb3RTdXNwZW5kZWRXaXRoRGVsYXk6XG4gICAgICB7XG4gICAgICAgIG1hcmtSb290U3VzcGVuZGVkJDEocm9vdCwgbGFuZXMpO1xuXG4gICAgICAgIGlmIChpbmNsdWRlc09ubHlUcmFuc2l0aW9ucyhsYW5lcykpIHtcbiAgICAgICAgICAvLyBUaGlzIGlzIGEgdHJhbnNpdGlvbiwgc28gd2Ugc2hvdWxkIGV4aXQgd2l0aG91dCBjb21taXR0aW5nIGFcbiAgICAgICAgICAvLyBwbGFjZWhvbGRlciBhbmQgd2l0aG91dCBzY2hlZHVsaW5nIGEgdGltZW91dC4gRGVsYXkgaW5kZWZpbml0ZWx5XG4gICAgICAgICAgLy8gdW50aWwgd2UgcmVjZWl2ZSBtb3JlIGRhdGEuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXNob3VsZEZvcmNlRmx1c2hGYWxsYmFja3NJbkRFVigpKSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyBub3QgYSB0cmFuc2l0aW9uLCBidXQgd2UgZGlkIHRyaWdnZXIgYW4gYXZvaWRlZCBzdGF0ZS5cbiAgICAgICAgICAvLyBTY2hlZHVsZSBhIHBsYWNlaG9sZGVyIHRvIGRpc3BsYXkgYWZ0ZXIgYSBzaG9ydCBkZWxheSwgdXNpbmcgdGhlIEp1c3RcbiAgICAgICAgICAvLyBOb3RpY2VhYmxlIERpZmZlcmVuY2UuXG4gICAgICAgICAgLy8gVE9ETzogSXMgdGhlIEpORCBvcHRpbWl6YXRpb24gd29ydGggdGhlIGFkZGVkIGNvbXBsZXhpdHk/IElmIHRoaXMgaXNcbiAgICAgICAgICAvLyB0aGUgb25seSByZWFzb24gd2UgdHJhY2sgdGhlIGV2ZW50IHRpbWUsIHRoZW4gcHJvYmFibHkgbm90LlxuICAgICAgICAgIC8vIENvbnNpZGVyIHJlbW92aW5nLlxuICAgICAgICAgIHZhciBtb3N0UmVjZW50RXZlbnRUaW1lID0gZ2V0TW9zdFJlY2VudEV2ZW50VGltZShyb290LCBsYW5lcyk7XG4gICAgICAgICAgdmFyIGV2ZW50VGltZU1zID0gbW9zdFJlY2VudEV2ZW50VGltZTtcbiAgICAgICAgICB2YXIgdGltZUVsYXBzZWRNcyA9IG5vdygpIC0gZXZlbnRUaW1lTXM7XG5cbiAgICAgICAgICB2YXIgX21zVW50aWxUaW1lb3V0ID0gam5kKHRpbWVFbGFwc2VkTXMpIC0gdGltZUVsYXBzZWRNczsgLy8gRG9uJ3QgYm90aGVyIHdpdGggYSB2ZXJ5IHNob3J0IHN1c3BlbnNlIHRpbWUuXG5cblxuICAgICAgICAgIGlmIChfbXNVbnRpbFRpbWVvdXQgPiAxMCkge1xuICAgICAgICAgICAgLy8gSW5zdGVhZCBvZiBjb21taXR0aW5nIHRoZSBmYWxsYmFjayBpbW1lZGlhdGVseSwgd2FpdCBmb3IgbW9yZSBkYXRhXG4gICAgICAgICAgICAvLyB0byBhcnJpdmUuXG4gICAgICAgICAgICByb290LnRpbWVvdXRIYW5kbGUgPSBzY2hlZHVsZVRpbWVvdXQoY29tbWl0Um9vdC5iaW5kKG51bGwsIHJvb3QsIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzLCB3b3JrSW5Qcm9ncmVzc1RyYW5zaXRpb25zKSwgX21zVW50aWxUaW1lb3V0KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfSAvLyBDb21taXQgdGhlIHBsYWNlaG9sZGVyLlxuXG5cbiAgICAgICAgY29tbWl0Um9vdChyb290LCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycywgd29ya0luUHJvZ3Jlc3NUcmFuc2l0aW9ucyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBSb290Q29tcGxldGVkOlxuICAgICAge1xuICAgICAgICAvLyBUaGUgd29yayBjb21wbGV0ZWQuIFJlYWR5IHRvIGNvbW1pdC5cbiAgICAgICAgY29tbWl0Um9vdChyb290LCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycywgd29ya0luUHJvZ3Jlc3NUcmFuc2l0aW9ucyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIHJvb3QgZXhpdCBzdGF0dXMuJyk7XG4gICAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNSZW5kZXJDb25zaXN0ZW50V2l0aEV4dGVybmFsU3RvcmVzKGZpbmlzaGVkV29yaykge1xuICAvLyBTZWFyY2ggdGhlIHJlbmRlcmVkIHRyZWUgZm9yIGV4dGVybmFsIHN0b3JlIHJlYWRzLCBhbmQgY2hlY2sgd2hldGhlciB0aGVcbiAgLy8gc3RvcmVzIHdlcmUgbXV0YXRlZCBpbiBhIGNvbmN1cnJlbnQgZXZlbnQuIEludGVudGlvbmFsbHkgdXNpbmcgYW4gaXRlcmF0aXZlXG4gIC8vIGxvb3AgaW5zdGVhZCBvZiByZWN1cnNpb24gc28gd2UgY2FuIGV4aXQgZWFybHkuXG4gIHZhciBub2RlID0gZmluaXNoZWRXb3JrO1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgaWYgKG5vZGUuZmxhZ3MgJiBTdG9yZUNvbnNpc3RlbmN5KSB7XG4gICAgICB2YXIgdXBkYXRlUXVldWUgPSBub2RlLnVwZGF0ZVF1ZXVlO1xuXG4gICAgICBpZiAodXBkYXRlUXVldWUgIT09IG51bGwpIHtcbiAgICAgICAgdmFyIGNoZWNrcyA9IHVwZGF0ZVF1ZXVlLnN0b3JlcztcblxuICAgICAgICBpZiAoY2hlY2tzICE9PSBudWxsKSB7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGVja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBjaGVjayA9IGNoZWNrc1tpXTtcbiAgICAgICAgICAgIHZhciBnZXRTbmFwc2hvdCA9IGNoZWNrLmdldFNuYXBzaG90O1xuICAgICAgICAgICAgdmFyIHJlbmRlcmVkVmFsdWUgPSBjaGVjay52YWx1ZTtcblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgaWYgKCFvYmplY3RJcyhnZXRTbmFwc2hvdCgpLCByZW5kZXJlZFZhbHVlKSkge1xuICAgICAgICAgICAgICAgIC8vIEZvdW5kIGFuIGluY29uc2lzdGVudCBzdG9yZS5cbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIC8vIElmIGBnZXRTbmFwc2hvdGAgdGhyb3dzLCByZXR1cm4gYGZhbHNlYC4gVGhpcyB3aWxsIHNjaGVkdWxlXG4gICAgICAgICAgICAgIC8vIGEgcmUtcmVuZGVyLCBhbmQgdGhlIGVycm9yIHdpbGwgYmUgcmV0aHJvd24gZHVyaW5nIHJlbmRlci5cbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBjaGlsZCA9IG5vZGUuY2hpbGQ7XG5cbiAgICBpZiAobm9kZS5zdWJ0cmVlRmxhZ3MgJiBTdG9yZUNvbnNpc3RlbmN5ICYmIGNoaWxkICE9PSBudWxsKSB7XG4gICAgICBjaGlsZC5yZXR1cm4gPSBub2RlO1xuICAgICAgbm9kZSA9IGNoaWxkO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUgPT09IGZpbmlzaGVkV29yaykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgd2hpbGUgKG5vZGUuc2libGluZyA9PT0gbnVsbCkge1xuICAgICAgaWYgKG5vZGUucmV0dXJuID09PSBudWxsIHx8IG5vZGUucmV0dXJuID09PSBmaW5pc2hlZFdvcmspIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9XG5cbiAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgbm9kZSA9IG5vZGUuc2libGluZztcbiAgfSAvLyBGbG93IGRvZXNuJ3Qga25vdyB0aGlzIGlzIHVucmVhY2hhYmxlLCBidXQgZXNsaW50IGRvZXNcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVucmVhY2hhYmxlXG5cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gbWFya1Jvb3RTdXNwZW5kZWQkMShyb290LCBzdXNwZW5kZWRMYW5lcykge1xuICAvLyBXaGVuIHN1c3BlbmRpbmcsIHdlIHNob3VsZCBhbHdheXMgZXhjbHVkZSBsYW5lcyB0aGF0IHdlcmUgcGluZ2VkIG9yIChtb3JlXG4gIC8vIHJhcmVseSwgc2luY2Ugd2UgdHJ5IHRvIGF2b2lkIGl0KSB1cGRhdGVkIGR1cmluZyB0aGUgcmVuZGVyIHBoYXNlLlxuICAvLyBUT0RPOiBMb2wgbWF5YmUgdGhlcmUncyBhIGJldHRlciB3YXkgdG8gZmFjdG9yIHRoaXMgYmVzaWRlcyB0aGlzXG4gIC8vIG9ibm94aW91c2x5IG5hbWVkIGZ1bmN0aW9uIDopXG4gIHN1c3BlbmRlZExhbmVzID0gcmVtb3ZlTGFuZXMoc3VzcGVuZGVkTGFuZXMsIHdvcmtJblByb2dyZXNzUm9vdFBpbmdlZExhbmVzKTtcbiAgc3VzcGVuZGVkTGFuZXMgPSByZW1vdmVMYW5lcyhzdXNwZW5kZWRMYW5lcywgd29ya0luUHJvZ3Jlc3NSb290SW50ZXJsZWF2ZWRVcGRhdGVkTGFuZXMpO1xuICBtYXJrUm9vdFN1c3BlbmRlZChyb290LCBzdXNwZW5kZWRMYW5lcyk7XG59IC8vIFRoaXMgaXMgdGhlIGVudHJ5IHBvaW50IGZvciBzeW5jaHJvbm91cyB0YXNrcyB0aGF0IGRvbid0IGdvXG4vLyB0aHJvdWdoIFNjaGVkdWxlclxuXG5cbmZ1bmN0aW9uIHBlcmZvcm1TeW5jV29ya09uUm9vdChyb290KSB7XG4gIHtcbiAgICBzeW5jTmVzdGVkVXBkYXRlRmxhZygpO1xuICB9XG5cbiAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgKFJlbmRlckNvbnRleHQgfCBDb21taXRDb250ZXh0KSkgIT09IE5vQ29udGV4dCkge1xuICAgIHRocm93IG5ldyBFcnJvcignU2hvdWxkIG5vdCBhbHJlYWR5IGJlIHdvcmtpbmcuJyk7XG4gIH1cblxuICBmbHVzaFBhc3NpdmVFZmZlY3RzKCk7XG4gIHZhciBsYW5lcyA9IGdldE5leHRMYW5lcyhyb290LCBOb0xhbmVzKTtcblxuICBpZiAoIWluY2x1ZGVzU29tZUxhbmUobGFuZXMsIFN5bmNMYW5lKSkge1xuICAgIC8vIFRoZXJlJ3Mgbm8gcmVtYWluaW5nIHN5bmMgd29yayBsZWZ0LlxuICAgIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBub3coKSk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgZXhpdFN0YXR1cyA9IHJlbmRlclJvb3RTeW5jKHJvb3QsIGxhbmVzKTtcblxuICBpZiAocm9vdC50YWcgIT09IExlZ2FjeVJvb3QgJiYgZXhpdFN0YXR1cyA9PT0gUm9vdEVycm9yZWQpIHtcbiAgICAvLyBJZiBzb21ldGhpbmcgdGhyZXcgYW4gZXJyb3IsIHRyeSByZW5kZXJpbmcgb25lIG1vcmUgdGltZS4gV2UnbGwgcmVuZGVyXG4gICAgLy8gc3luY2hyb25vdXNseSB0byBibG9jayBjb25jdXJyZW50IGRhdGEgbXV0YXRpb25zLCBhbmQgd2UnbGwgaW5jbHVkZXNcbiAgICAvLyBhbGwgcGVuZGluZyB1cGRhdGVzIGFyZSBpbmNsdWRlZC4gSWYgaXQgc3RpbGwgZmFpbHMgYWZ0ZXIgdGhlIHNlY29uZFxuICAgIC8vIGF0dGVtcHQsIHdlJ2xsIGdpdmUgdXAgYW5kIGNvbW1pdCB0aGUgcmVzdWx0aW5nIHRyZWUuXG4gICAgdmFyIGVycm9yUmV0cnlMYW5lcyA9IGdldExhbmVzVG9SZXRyeVN5bmNocm9ub3VzbHlPbkVycm9yKHJvb3QpO1xuXG4gICAgaWYgKGVycm9yUmV0cnlMYW5lcyAhPT0gTm9MYW5lcykge1xuICAgICAgbGFuZXMgPSBlcnJvclJldHJ5TGFuZXM7XG4gICAgICBleGl0U3RhdHVzID0gcmVjb3ZlckZyb21Db25jdXJyZW50RXJyb3Iocm9vdCwgZXJyb3JSZXRyeUxhbmVzKTtcbiAgICB9XG4gIH1cblxuICBpZiAoZXhpdFN0YXR1cyA9PT0gUm9vdEZhdGFsRXJyb3JlZCkge1xuICAgIHZhciBmYXRhbEVycm9yID0gd29ya0luUHJvZ3Jlc3NSb290RmF0YWxFcnJvcjtcbiAgICBwcmVwYXJlRnJlc2hTdGFjayhyb290LCBOb0xhbmVzKTtcbiAgICBtYXJrUm9vdFN1c3BlbmRlZCQxKHJvb3QsIGxhbmVzKTtcbiAgICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgbm93KCkpO1xuICAgIHRocm93IGZhdGFsRXJyb3I7XG4gIH1cblxuICBpZiAoZXhpdFN0YXR1cyA9PT0gUm9vdERpZE5vdENvbXBsZXRlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdSb290IGRpZCBub3QgY29tcGxldGUuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuJyk7XG4gIH0gLy8gV2Ugbm93IGhhdmUgYSBjb25zaXN0ZW50IHRyZWUuIEJlY2F1c2UgdGhpcyBpcyBhIHN5bmMgcmVuZGVyLCB3ZVxuICAvLyB3aWxsIGNvbW1pdCBpdCBldmVuIGlmIHNvbWV0aGluZyBzdXNwZW5kZWQuXG5cblxuICB2YXIgZmluaXNoZWRXb3JrID0gcm9vdC5jdXJyZW50LmFsdGVybmF0ZTtcbiAgcm9vdC5maW5pc2hlZFdvcmsgPSBmaW5pc2hlZFdvcms7XG4gIHJvb3QuZmluaXNoZWRMYW5lcyA9IGxhbmVzO1xuICBjb21taXRSb290KHJvb3QsIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzLCB3b3JrSW5Qcm9ncmVzc1RyYW5zaXRpb25zKTsgLy8gQmVmb3JlIGV4aXRpbmcsIG1ha2Ugc3VyZSB0aGVyZSdzIGEgY2FsbGJhY2sgc2NoZWR1bGVkIGZvciB0aGUgbmV4dFxuICAvLyBwZW5kaW5nIGxldmVsLlxuXG4gIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBub3coKSk7XG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBmbHVzaFJvb3Qocm9vdCwgbGFuZXMpIHtcbiAgaWYgKGxhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgbWFya1Jvb3RFbnRhbmdsZWQocm9vdCwgbWVyZ2VMYW5lcyhsYW5lcywgU3luY0xhbmUpKTtcbiAgICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgbm93KCkpO1xuXG4gICAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgKFJlbmRlckNvbnRleHQgfCBDb21taXRDb250ZXh0KSkgPT09IE5vQ29udGV4dCkge1xuICAgICAgcmVzZXRSZW5kZXJUaW1lcigpO1xuICAgICAgZmx1c2hTeW5jQ2FsbGJhY2tzKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBkZWZlcnJlZFVwZGF0ZXMoZm4pIHtcbiAgdmFyIHByZXZpb3VzUHJpb3JpdHkgPSBnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoKTtcbiAgdmFyIHByZXZUcmFuc2l0aW9uID0gUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMi50cmFuc2l0aW9uO1xuXG4gIHRyeSB7XG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMi50cmFuc2l0aW9uID0gbnVsbDtcbiAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoRGVmYXVsdEV2ZW50UHJpb3JpdHkpO1xuICAgIHJldHVybiBmbigpO1xuICB9IGZpbmFsbHkge1xuICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShwcmV2aW91c1ByaW9yaXR5KTtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQyLnRyYW5zaXRpb24gPSBwcmV2VHJhbnNpdGlvbjtcbiAgfVxufVxuZnVuY3Rpb24gYmF0Y2hlZFVwZGF0ZXMoZm4sIGEpIHtcbiAgdmFyIHByZXZFeGVjdXRpb25Db250ZXh0ID0gZXhlY3V0aW9uQ29udGV4dDtcbiAgZXhlY3V0aW9uQ29udGV4dCB8PSBCYXRjaGVkQ29udGV4dDtcblxuICB0cnkge1xuICAgIHJldHVybiBmbihhKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBleGVjdXRpb25Db250ZXh0ID0gcHJldkV4ZWN1dGlvbkNvbnRleHQ7IC8vIElmIHRoZXJlIHdlcmUgbGVnYWN5IHN5bmMgdXBkYXRlcywgZmx1c2ggdGhlbSBhdCB0aGUgZW5kIG9mIHRoZSBvdXRlclxuICAgIC8vIG1vc3QgYmF0Y2hlZFVwZGF0ZXMtbGlrZSBtZXRob2QuXG5cbiAgICBpZiAoZXhlY3V0aW9uQ29udGV4dCA9PT0gTm9Db250ZXh0ICYmIC8vIFRyZWF0IGBhY3RgIGFzIGlmIGl0J3MgaW5zaWRlIGBiYXRjaGVkVXBkYXRlc2AsIGV2ZW4gaW4gbGVnYWN5IG1vZGUuXG4gICAgISggUmVhY3RDdXJyZW50QWN0UXVldWUkMS5pc0JhdGNoaW5nTGVnYWN5KSkge1xuICAgICAgcmVzZXRSZW5kZXJUaW1lcigpO1xuICAgICAgZmx1c2hTeW5jQ2FsbGJhY2tzT25seUluTGVnYWN5TW9kZSgpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZGlzY3JldGVVcGRhdGVzKGZuLCBhLCBiLCBjLCBkKSB7XG4gIHZhciBwcmV2aW91c1ByaW9yaXR5ID0gZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KCk7XG4gIHZhciBwcmV2VHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDIudHJhbnNpdGlvbjtcblxuICB0cnkge1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDIudHJhbnNpdGlvbiA9IG51bGw7XG4gICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KERpc2NyZXRlRXZlbnRQcmlvcml0eSk7XG4gICAgcmV0dXJuIGZuKGEsIGIsIGMsIGQpO1xuICB9IGZpbmFsbHkge1xuICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShwcmV2aW91c1ByaW9yaXR5KTtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQyLnRyYW5zaXRpb24gPSBwcmV2VHJhbnNpdGlvbjtcblxuICAgIGlmIChleGVjdXRpb25Db250ZXh0ID09PSBOb0NvbnRleHQpIHtcbiAgICAgIHJlc2V0UmVuZGVyVGltZXIoKTtcbiAgICB9XG4gIH1cbn0gLy8gT3ZlcmxvYWQgdGhlIGRlZmluaXRpb24gdG8gdGhlIHR3byB2YWxpZCBzaWduYXR1cmVzLlxuLy8gV2FybmluZywgdGhpcyBvcHRzLW91dCBvZiBjaGVja2luZyB0aGUgZnVuY3Rpb24gYm9keS5cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlZGVjbGFyZVxuZnVuY3Rpb24gZmx1c2hTeW5jKGZuKSB7XG4gIC8vIEluIGxlZ2FjeSBtb2RlLCB3ZSBmbHVzaCBwZW5kaW5nIHBhc3NpdmUgZWZmZWN0cyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZVxuICAvLyBuZXh0IGV2ZW50LCBub3QgYXQgdGhlIGVuZCBvZiB0aGUgcHJldmlvdXMgb25lLlxuICBpZiAocm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMgIT09IG51bGwgJiYgcm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMudGFnID09PSBMZWdhY3lSb290ICYmIChleGVjdXRpb25Db250ZXh0ICYgKFJlbmRlckNvbnRleHQgfCBDb21taXRDb250ZXh0KSkgPT09IE5vQ29udGV4dCkge1xuICAgIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTtcbiAgfVxuXG4gIHZhciBwcmV2RXhlY3V0aW9uQ29udGV4dCA9IGV4ZWN1dGlvbkNvbnRleHQ7XG4gIGV4ZWN1dGlvbkNvbnRleHQgfD0gQmF0Y2hlZENvbnRleHQ7XG4gIHZhciBwcmV2VHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDIudHJhbnNpdGlvbjtcbiAgdmFyIHByZXZpb3VzUHJpb3JpdHkgPSBnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoKTtcblxuICB0cnkge1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDIudHJhbnNpdGlvbiA9IG51bGw7XG4gICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KERpc2NyZXRlRXZlbnRQcmlvcml0eSk7XG5cbiAgICBpZiAoZm4pIHtcbiAgICAgIHJldHVybiBmbigpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkocHJldmlvdXNQcmlvcml0eSk7XG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMi50cmFuc2l0aW9uID0gcHJldlRyYW5zaXRpb247XG4gICAgZXhlY3V0aW9uQ29udGV4dCA9IHByZXZFeGVjdXRpb25Db250ZXh0OyAvLyBGbHVzaCB0aGUgaW1tZWRpYXRlIGNhbGxiYWNrcyB0aGF0IHdlcmUgc2NoZWR1bGVkIGR1cmluZyB0aGlzIGJhdGNoLlxuICAgIC8vIE5vdGUgdGhhdCB0aGlzIHdpbGwgaGFwcGVuIGV2ZW4gaWYgYmF0Y2hlZFVwZGF0ZXMgaXMgaGlnaGVyIHVwXG4gICAgLy8gdGhlIHN0YWNrLlxuXG4gICAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgKFJlbmRlckNvbnRleHQgfCBDb21taXRDb250ZXh0KSkgPT09IE5vQ29udGV4dCkge1xuICAgICAgZmx1c2hTeW5jQ2FsbGJhY2tzKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBpc0FscmVhZHlSZW5kZXJpbmcoKSB7XG4gIC8vIFVzZWQgYnkgdGhlIHJlbmRlcmVyIHRvIHByaW50IGEgd2FybmluZyBpZiBjZXJ0YWluIEFQSXMgYXJlIGNhbGxlZCBmcm9tXG4gIC8vIHRoZSB3cm9uZyBjb250ZXh0LlxuICByZXR1cm4gIChleGVjdXRpb25Db250ZXh0ICYgKFJlbmRlckNvbnRleHQgfCBDb21taXRDb250ZXh0KSkgIT09IE5vQ29udGV4dDtcbn1cbmZ1bmN0aW9uIGZsdXNoQ29udHJvbGxlZChmbikge1xuICB2YXIgcHJldkV4ZWN1dGlvbkNvbnRleHQgPSBleGVjdXRpb25Db250ZXh0O1xuICBleGVjdXRpb25Db250ZXh0IHw9IEJhdGNoZWRDb250ZXh0O1xuICB2YXIgcHJldlRyYW5zaXRpb24gPSBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQyLnRyYW5zaXRpb247XG4gIHZhciBwcmV2aW91c1ByaW9yaXR5ID0gZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KCk7XG5cbiAgdHJ5IHtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQyLnRyYW5zaXRpb24gPSBudWxsO1xuICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShEaXNjcmV0ZUV2ZW50UHJpb3JpdHkpO1xuICAgIGZuKCk7XG4gIH0gZmluYWxseSB7XG4gICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KHByZXZpb3VzUHJpb3JpdHkpO1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDIudHJhbnNpdGlvbiA9IHByZXZUcmFuc2l0aW9uO1xuICAgIGV4ZWN1dGlvbkNvbnRleHQgPSBwcmV2RXhlY3V0aW9uQ29udGV4dDtcblxuICAgIGlmIChleGVjdXRpb25Db250ZXh0ID09PSBOb0NvbnRleHQpIHtcbiAgICAgIC8vIEZsdXNoIHRoZSBpbW1lZGlhdGUgY2FsbGJhY2tzIHRoYXQgd2VyZSBzY2hlZHVsZWQgZHVyaW5nIHRoaXMgYmF0Y2hcbiAgICAgIHJlc2V0UmVuZGVyVGltZXIoKTtcbiAgICAgIGZsdXNoU3luY0NhbGxiYWNrcygpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gcHVzaFJlbmRlckxhbmVzKGZpYmVyLCBsYW5lcykge1xuICBwdXNoKHN1YnRyZWVSZW5kZXJMYW5lc0N1cnNvciwgc3VidHJlZVJlbmRlckxhbmVzLCBmaWJlcik7XG4gIHN1YnRyZWVSZW5kZXJMYW5lcyA9IG1lcmdlTGFuZXMoc3VidHJlZVJlbmRlckxhbmVzLCBsYW5lcyk7XG4gIHdvcmtJblByb2dyZXNzUm9vdEluY2x1ZGVkTGFuZXMgPSBtZXJnZUxhbmVzKHdvcmtJblByb2dyZXNzUm9vdEluY2x1ZGVkTGFuZXMsIGxhbmVzKTtcbn1cbmZ1bmN0aW9uIHBvcFJlbmRlckxhbmVzKGZpYmVyKSB7XG4gIHN1YnRyZWVSZW5kZXJMYW5lcyA9IHN1YnRyZWVSZW5kZXJMYW5lc0N1cnNvci5jdXJyZW50O1xuICBwb3Aoc3VidHJlZVJlbmRlckxhbmVzQ3Vyc29yLCBmaWJlcik7XG59XG5cbmZ1bmN0aW9uIHByZXBhcmVGcmVzaFN0YWNrKHJvb3QsIGxhbmVzKSB7XG4gIHJvb3QuZmluaXNoZWRXb3JrID0gbnVsbDtcbiAgcm9vdC5maW5pc2hlZExhbmVzID0gTm9MYW5lcztcbiAgdmFyIHRpbWVvdXRIYW5kbGUgPSByb290LnRpbWVvdXRIYW5kbGU7XG5cbiAgaWYgKHRpbWVvdXRIYW5kbGUgIT09IG5vVGltZW91dCkge1xuICAgIC8vIFRoZSByb290IHByZXZpb3VzIHN1c3BlbmRlZCBhbmQgc2NoZWR1bGVkIGEgdGltZW91dCB0byBjb21taXQgYSBmYWxsYmFja1xuICAgIC8vIHN0YXRlLiBOb3cgdGhhdCB3ZSBoYXZlIGFkZGl0aW9uYWwgd29yaywgY2FuY2VsIHRoZSB0aW1lb3V0LlxuICAgIHJvb3QudGltZW91dEhhbmRsZSA9IG5vVGltZW91dDsgLy8gJEZsb3dGaXhNZSBDb21wbGFpbnMgbm9UaW1lb3V0IGlzIG5vdCBhIFRpbWVvdXRJRCwgZGVzcGl0ZSB0aGUgY2hlY2sgYWJvdmVcblxuICAgIGNhbmNlbFRpbWVvdXQodGltZW91dEhhbmRsZSk7XG4gIH1cblxuICBpZiAod29ya0luUHJvZ3Jlc3MgIT09IG51bGwpIHtcbiAgICB2YXIgaW50ZXJydXB0ZWRXb3JrID0gd29ya0luUHJvZ3Jlc3MucmV0dXJuO1xuXG4gICAgd2hpbGUgKGludGVycnVwdGVkV29yayAhPT0gbnVsbCkge1xuICAgICAgdmFyIGN1cnJlbnQgPSBpbnRlcnJ1cHRlZFdvcmsuYWx0ZXJuYXRlO1xuICAgICAgdW53aW5kSW50ZXJydXB0ZWRXb3JrKGN1cnJlbnQsIGludGVycnVwdGVkV29yayk7XG4gICAgICBpbnRlcnJ1cHRlZFdvcmsgPSBpbnRlcnJ1cHRlZFdvcmsucmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIHdvcmtJblByb2dyZXNzUm9vdCA9IHJvb3Q7XG4gIHZhciByb290V29ya0luUHJvZ3Jlc3MgPSBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhyb290LmN1cnJlbnQsIG51bGwpO1xuICB3b3JrSW5Qcm9ncmVzcyA9IHJvb3RXb3JrSW5Qcm9ncmVzcztcbiAgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgPSBzdWJ0cmVlUmVuZGVyTGFuZXMgPSB3b3JrSW5Qcm9ncmVzc1Jvb3RJbmNsdWRlZExhbmVzID0gbGFuZXM7XG4gIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPSBSb290SW5Qcm9ncmVzcztcbiAgd29ya0luUHJvZ3Jlc3NSb290RmF0YWxFcnJvciA9IG51bGw7XG4gIHdvcmtJblByb2dyZXNzUm9vdFNraXBwZWRMYW5lcyA9IE5vTGFuZXM7XG4gIHdvcmtJblByb2dyZXNzUm9vdEludGVybGVhdmVkVXBkYXRlZExhbmVzID0gTm9MYW5lcztcbiAgd29ya0luUHJvZ3Jlc3NSb290UGluZ2VkTGFuZXMgPSBOb0xhbmVzO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RDb25jdXJyZW50RXJyb3JzID0gbnVsbDtcbiAgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMgPSBudWxsO1xuICBmaW5pc2hRdWV1ZWluZ0NvbmN1cnJlbnRVcGRhdGVzKCk7XG5cbiAge1xuICAgIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLmRpc2NhcmRQZW5kaW5nV2FybmluZ3MoKTtcbiAgfVxuXG4gIHJldHVybiByb290V29ya0luUHJvZ3Jlc3M7XG59XG5cbmZ1bmN0aW9uIGhhbmRsZUVycm9yKHJvb3QsIHRocm93blZhbHVlKSB7XG4gIGRvIHtcbiAgICB2YXIgZXJyb3JlZFdvcmsgPSB3b3JrSW5Qcm9ncmVzcztcblxuICAgIHRyeSB7XG4gICAgICAvLyBSZXNldCBtb2R1bGUtbGV2ZWwgc3RhdGUgdGhhdCB3YXMgc2V0IGR1cmluZyB0aGUgcmVuZGVyIHBoYXNlLlxuICAgICAgcmVzZXRDb250ZXh0RGVwZW5kZW5jaWVzKCk7XG4gICAgICByZXNldEhvb2tzQWZ0ZXJUaHJvdygpO1xuICAgICAgcmVzZXRDdXJyZW50RmliZXIoKTsgLy8gVE9ETzogSSBmb3VuZCBhbmQgYWRkZWQgdGhpcyBtaXNzaW5nIGxpbmUgd2hpbGUgaW52ZXN0aWdhdGluZyBhXG4gICAgICAvLyBzZXBhcmF0ZSBpc3N1ZS4gV3JpdGUgYSByZWdyZXNzaW9uIHRlc3QgdXNpbmcgc3RyaW5nIHJlZnMuXG5cbiAgICAgIFJlYWN0Q3VycmVudE93bmVyJDIuY3VycmVudCA9IG51bGw7XG5cbiAgICAgIGlmIChlcnJvcmVkV29yayA9PT0gbnVsbCB8fCBlcnJvcmVkV29yay5yZXR1cm4gPT09IG51bGwpIHtcbiAgICAgICAgLy8gRXhwZWN0ZWQgdG8gYmUgd29ya2luZyBvbiBhIG5vbi1yb290IGZpYmVyLiBUaGlzIGlzIGEgZmF0YWwgZXJyb3JcbiAgICAgICAgLy8gYmVjYXVzZSB0aGVyZSdzIG5vIGFuY2VzdG9yIHRoYXQgY2FuIGhhbmRsZSBpdDsgdGhlIHJvb3QgaXNcbiAgICAgICAgLy8gc3VwcG9zZWQgdG8gY2FwdHVyZSBhbGwgZXJyb3JzIHRoYXQgd2VyZW4ndCBjYXVnaHQgYnkgYW4gZXJyb3JcbiAgICAgICAgLy8gYm91bmRhcnkuXG4gICAgICAgIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPSBSb290RmF0YWxFcnJvcmVkO1xuICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RGYXRhbEVycm9yID0gdGhyb3duVmFsdWU7IC8vIFNldCBgd29ya0luUHJvZ3Jlc3NgIHRvIG51bGwuIFRoaXMgcmVwcmVzZW50cyBhZHZhbmNpbmcgdG8gdGhlIG5leHRcbiAgICAgICAgLy8gc2libGluZywgb3IgdGhlIHBhcmVudCBpZiB0aGVyZSBhcmUgbm8gc2libGluZ3MuIEJ1dCBzaW5jZSB0aGUgcm9vdFxuICAgICAgICAvLyBoYXMgbm8gc2libGluZ3Mgbm9yIGEgcGFyZW50LCB3ZSBzZXQgaXQgdG8gbnVsbC4gVXN1YWxseSB0aGlzIGlzXG4gICAgICAgIC8vIGhhbmRsZWQgYnkgYGNvbXBsZXRlVW5pdE9mV29ya2Agb3IgYHVud2luZFdvcmtgLCBidXQgc2luY2Ugd2UncmVcbiAgICAgICAgLy8gaW50ZW50aW9uYWxseSBub3QgY2FsbGluZyB0aG9zZSwgd2UgbmVlZCBzZXQgaXQgaGVyZS5cbiAgICAgICAgLy8gVE9ETzogQ29uc2lkZXIgY2FsbGluZyBgdW53aW5kV29ya2AgdG8gcG9wIHRoZSBjb250ZXh0cy5cblxuICAgICAgICB3b3JrSW5Qcm9ncmVzcyA9IG51bGw7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGVuYWJsZVByb2ZpbGVyVGltZXIgJiYgZXJyb3JlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAgIC8vIFJlY29yZCB0aGUgdGltZSBzcGVudCByZW5kZXJpbmcgYmVmb3JlIGFuIGVycm9yIHdhcyB0aHJvd24uIFRoaXNcbiAgICAgICAgLy8gYXZvaWRzIGluYWNjdXJhdGUgUHJvZmlsZXIgZHVyYXRpb25zIGluIHRoZSBjYXNlIG9mIGFcbiAgICAgICAgLy8gc3VzcGVuZGVkIHJlbmRlci5cbiAgICAgICAgc3RvcFByb2ZpbGVyVGltZXJJZlJ1bm5pbmdBbmRSZWNvcmREZWx0YShlcnJvcmVkV29yaywgdHJ1ZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChlbmFibGVTY2hlZHVsaW5nUHJvZmlsZXIpIHtcbiAgICAgICAgbWFya0NvbXBvbmVudFJlbmRlclN0b3BwZWQoKTtcblxuICAgICAgICBpZiAodGhyb3duVmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHRocm93blZhbHVlID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgdGhyb3duVmFsdWUudGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHZhciB3YWtlYWJsZSA9IHRocm93blZhbHVlO1xuICAgICAgICAgIG1hcmtDb21wb25lbnRTdXNwZW5kZWQoZXJyb3JlZFdvcmssIHdha2VhYmxlLCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbWFya0NvbXBvbmVudEVycm9yZWQoZXJyb3JlZFdvcmssIHRocm93blZhbHVlLCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhyb3dFeGNlcHRpb24ocm9vdCwgZXJyb3JlZFdvcmsucmV0dXJuLCBlcnJvcmVkV29yaywgdGhyb3duVmFsdWUsIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzKTtcbiAgICAgIGNvbXBsZXRlVW5pdE9mV29yayhlcnJvcmVkV29yayk7XG4gICAgfSBjYXRjaCAoeWV0QW5vdGhlclRocm93blZhbHVlKSB7XG4gICAgICAvLyBTb21ldGhpbmcgaW4gdGhlIHJldHVybiBwYXRoIGFsc28gdGhyZXcuXG4gICAgICB0aHJvd25WYWx1ZSA9IHlldEFub3RoZXJUaHJvd25WYWx1ZTtcblxuICAgICAgaWYgKHdvcmtJblByb2dyZXNzID09PSBlcnJvcmVkV29yayAmJiBlcnJvcmVkV29yayAhPT0gbnVsbCkge1xuICAgICAgICAvLyBJZiB0aGlzIGJvdW5kYXJ5IGhhcyBhbHJlYWR5IGVycm9yZWQsIHRoZW4gd2UgaGFkIHRyb3VibGUgcHJvY2Vzc2luZ1xuICAgICAgICAvLyB0aGUgZXJyb3IuIEJ1YmJsZSBpdCB0byB0aGUgbmV4dCBib3VuZGFyeS5cbiAgICAgICAgZXJyb3JlZFdvcmsgPSBlcnJvcmVkV29yay5yZXR1cm47XG4gICAgICAgIHdvcmtJblByb2dyZXNzID0gZXJyb3JlZFdvcms7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvcmVkV29yayA9IHdvcmtJblByb2dyZXNzO1xuICAgICAgfVxuXG4gICAgICBjb250aW51ZTtcbiAgICB9IC8vIFJldHVybiB0byB0aGUgbm9ybWFsIHdvcmsgbG9vcC5cblxuXG4gICAgcmV0dXJuO1xuICB9IHdoaWxlICh0cnVlKTtcbn1cblxuZnVuY3Rpb24gcHVzaERpc3BhdGNoZXIoKSB7XG4gIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMi5jdXJyZW50O1xuICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDIuY3VycmVudCA9IENvbnRleHRPbmx5RGlzcGF0Y2hlcjtcblxuICBpZiAocHJldkRpc3BhdGNoZXIgPT09IG51bGwpIHtcbiAgICAvLyBUaGUgUmVhY3QgaXNvbW9ycGhpYyBwYWNrYWdlIGRvZXMgbm90IGluY2x1ZGUgYSBkZWZhdWx0IGRpc3BhdGNoZXIuXG4gICAgLy8gSW5zdGVhZCB0aGUgZmlyc3QgcmVuZGVyZXIgd2lsbCBsYXppbHkgYXR0YWNoIG9uZSwgaW4gb3JkZXIgdG8gZ2l2ZVxuICAgIC8vIG5pY2VyIGVycm9yIG1lc3NhZ2VzLlxuICAgIHJldHVybiBDb250ZXh0T25seURpc3BhdGNoZXI7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHByZXZEaXNwYXRjaGVyO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBvcERpc3BhdGNoZXIocHJldkRpc3BhdGNoZXIpIHtcbiAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQyLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbn1cblxuZnVuY3Rpb24gbWFya0NvbW1pdFRpbWVPZkZhbGxiYWNrKCkge1xuICBnbG9iYWxNb3N0UmVjZW50RmFsbGJhY2tUaW1lID0gbm93KCk7XG59XG5mdW5jdGlvbiBtYXJrU2tpcHBlZFVwZGF0ZUxhbmVzKGxhbmUpIHtcbiAgd29ya0luUHJvZ3Jlc3NSb290U2tpcHBlZExhbmVzID0gbWVyZ2VMYW5lcyhsYW5lLCB3b3JrSW5Qcm9ncmVzc1Jvb3RTa2lwcGVkTGFuZXMpO1xufVxuZnVuY3Rpb24gcmVuZGVyRGlkU3VzcGVuZCgpIHtcbiAgaWYgKHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPT09IFJvb3RJblByb2dyZXNzKSB7XG4gICAgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9IFJvb3RTdXNwZW5kZWQ7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlbmRlckRpZFN1c3BlbmREZWxheUlmUG9zc2libGUoKSB7XG4gIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID09PSBSb290SW5Qcm9ncmVzcyB8fCB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID09PSBSb290U3VzcGVuZGVkIHx8IHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPT09IFJvb3RFcnJvcmVkKSB7XG4gICAgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9IFJvb3RTdXNwZW5kZWRXaXRoRGVsYXk7XG4gIH0gLy8gQ2hlY2sgaWYgdGhlcmUgYXJlIHVwZGF0ZXMgdGhhdCB3ZSBza2lwcGVkIHRyZWUgdGhhdCBtaWdodCBoYXZlIHVuYmxvY2tlZFxuICAvLyB0aGlzIHJlbmRlci5cblxuXG4gIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3QgIT09IG51bGwgJiYgKGluY2x1ZGVzTm9uSWRsZVdvcmsod29ya0luUHJvZ3Jlc3NSb290U2tpcHBlZExhbmVzKSB8fCBpbmNsdWRlc05vbklkbGVXb3JrKHdvcmtJblByb2dyZXNzUm9vdEludGVybGVhdmVkVXBkYXRlZExhbmVzKSkpIHtcbiAgICAvLyBNYXJrIHRoZSBjdXJyZW50IHJlbmRlciBhcyBzdXNwZW5kZWQgc28gdGhhdCB3ZSBzd2l0Y2ggdG8gd29ya2luZyBvblxuICAgIC8vIHRoZSB1cGRhdGVzIHRoYXQgd2VyZSBza2lwcGVkLiBVc3VhbGx5IHdlIG9ubHkgc3VzcGVuZCBhdCB0aGUgZW5kIG9mXG4gICAgLy8gdGhlIHJlbmRlciBwaGFzZS5cbiAgICAvLyBUT0RPOiBXZSBzaG91bGQgcHJvYmFibHkgYWx3YXlzIG1hcmsgdGhlIHJvb3QgYXMgc3VzcGVuZGVkIGltbWVkaWF0ZWx5XG4gICAgLy8gKGluc2lkZSB0aGlzIGZ1bmN0aW9uKSwgc2luY2UgYnkgc3VzcGVuZGluZyBhdCB0aGUgZW5kIG9mIHRoZSByZW5kZXJcbiAgICAvLyBwaGFzZSBpbnRyb2R1Y2VzIGEgcG90ZW50aWFsIG1pc3Rha2Ugd2hlcmUgd2Ugc3VzcGVuZCBsYW5lcyB0aGF0IHdlcmVcbiAgICAvLyBwaW5nZWQgb3IgdXBkYXRlZCB3aGlsZSB3ZSB3ZXJlIHJlbmRlcmluZy5cbiAgICBtYXJrUm9vdFN1c3BlbmRlZCQxKHdvcmtJblByb2dyZXNzUm9vdCwgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMpO1xuICB9XG59XG5mdW5jdGlvbiByZW5kZXJEaWRFcnJvcihlcnJvcikge1xuICBpZiAod29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyAhPT0gUm9vdFN1c3BlbmRlZFdpdGhEZWxheSkge1xuICAgIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPSBSb290RXJyb3JlZDtcbiAgfVxuXG4gIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3RDb25jdXJyZW50RXJyb3JzID09PSBudWxsKSB7XG4gICAgd29ya0luUHJvZ3Jlc3NSb290Q29uY3VycmVudEVycm9ycyA9IFtlcnJvcl07XG4gIH0gZWxzZSB7XG4gICAgd29ya0luUHJvZ3Jlc3NSb290Q29uY3VycmVudEVycm9ycy5wdXNoKGVycm9yKTtcbiAgfVxufSAvLyBDYWxsZWQgZHVyaW5nIHJlbmRlciB0byBkZXRlcm1pbmUgaWYgYW55dGhpbmcgaGFzIHN1c3BlbmRlZC5cbi8vIFJldHVybnMgZmFsc2UgaWYgd2UncmUgbm90IHN1cmUuXG5cbmZ1bmN0aW9uIHJlbmRlckhhc05vdFN1c3BlbmRlZFlldCgpIHtcbiAgLy8gSWYgc29tZXRoaW5nIGVycm9yZWQgb3IgY29tcGxldGVkLCB3ZSBjYW4ndCByZWFsbHkgYmUgc3VyZSxcbiAgLy8gc28gdGhvc2UgYXJlIGZhbHNlLlxuICByZXR1cm4gd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdEluUHJvZ3Jlc3M7XG59XG5cbmZ1bmN0aW9uIHJlbmRlclJvb3RTeW5jKHJvb3QsIGxhbmVzKSB7XG4gIHZhciBwcmV2RXhlY3V0aW9uQ29udGV4dCA9IGV4ZWN1dGlvbkNvbnRleHQ7XG4gIGV4ZWN1dGlvbkNvbnRleHQgfD0gUmVuZGVyQ29udGV4dDtcbiAgdmFyIHByZXZEaXNwYXRjaGVyID0gcHVzaERpc3BhdGNoZXIoKTsgLy8gSWYgdGhlIHJvb3Qgb3IgbGFuZXMgaGF2ZSBjaGFuZ2VkLCB0aHJvdyBvdXQgdGhlIGV4aXN0aW5nIHN0YWNrXG4gIC8vIGFuZCBwcmVwYXJlIGEgZnJlc2ggb25lLiBPdGhlcndpc2Ugd2UnbGwgY29udGludWUgd2hlcmUgd2UgbGVmdCBvZmYuXG5cbiAgaWYgKHdvcmtJblByb2dyZXNzUm9vdCAhPT0gcm9vdCB8fCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyAhPT0gbGFuZXMpIHtcbiAgICB7XG4gICAgICBpZiAoaXNEZXZUb29sc1ByZXNlbnQpIHtcbiAgICAgICAgdmFyIG1lbW9pemVkVXBkYXRlcnMgPSByb290Lm1lbW9pemVkVXBkYXRlcnM7XG5cbiAgICAgICAgaWYgKG1lbW9pemVkVXBkYXRlcnMuc2l6ZSA+IDApIHtcbiAgICAgICAgICByZXN0b3JlUGVuZGluZ1VwZGF0ZXJzKHJvb3QsIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzKTtcbiAgICAgICAgICBtZW1vaXplZFVwZGF0ZXJzLmNsZWFyKCk7XG4gICAgICAgIH0gLy8gQXQgdGhpcyBwb2ludCwgbW92ZSBGaWJlcnMgdGhhdCBzY2hlZHVsZWQgdGhlIHVwY29taW5nIHdvcmsgZnJvbSB0aGUgTWFwIHRvIHRoZSBTZXQuXG4gICAgICAgIC8vIElmIHdlIGJhaWxvdXQgb24gdGhpcyB3b3JrLCB3ZSdsbCBtb3ZlIHRoZW0gYmFjayAobGlrZSBhYm92ZSkuXG4gICAgICAgIC8vIEl0J3MgaW1wb3J0YW50IHRvIG1vdmUgdGhlbSBub3cgaW4gY2FzZSB0aGUgd29yayBzcGF3bnMgbW9yZSB3b3JrIGF0IHRoZSBzYW1lIHByaW9yaXR5IHdpdGggZGlmZmVyZW50IHVwZGF0ZXJzLlxuICAgICAgICAvLyBUaGF0IHdheSB3ZSBjYW4ga2VlcCB0aGUgY3VycmVudCB1cGRhdGUgYW5kIGZ1dHVyZSB1cGRhdGVzIHNlcGFyYXRlLlxuXG5cbiAgICAgICAgbW92ZVBlbmRpbmdGaWJlcnNUb01lbW9pemVkKHJvb3QsIGxhbmVzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB3b3JrSW5Qcm9ncmVzc1RyYW5zaXRpb25zID0gZ2V0VHJhbnNpdGlvbnNGb3JMYW5lcygpO1xuICAgIHByZXBhcmVGcmVzaFN0YWNrKHJvb3QsIGxhbmVzKTtcbiAgfVxuXG4gIHtcbiAgICBtYXJrUmVuZGVyU3RhcnRlZChsYW5lcyk7XG4gIH1cblxuICBkbyB7XG4gICAgdHJ5IHtcbiAgICAgIHdvcmtMb29wU3luYygpO1xuICAgICAgYnJlYWs7XG4gICAgfSBjYXRjaCAodGhyb3duVmFsdWUpIHtcbiAgICAgIGhhbmRsZUVycm9yKHJvb3QsIHRocm93blZhbHVlKTtcbiAgICB9XG4gIH0gd2hpbGUgKHRydWUpO1xuXG4gIHJlc2V0Q29udGV4dERlcGVuZGVuY2llcygpO1xuICBleGVjdXRpb25Db250ZXh0ID0gcHJldkV4ZWN1dGlvbkNvbnRleHQ7XG4gIHBvcERpc3BhdGNoZXIocHJldkRpc3BhdGNoZXIpO1xuXG4gIGlmICh3b3JrSW5Qcm9ncmVzcyAhPT0gbnVsbCkge1xuICAgIC8vIFRoaXMgaXMgYSBzeW5jIHJlbmRlciwgc28gd2Ugc2hvdWxkIGhhdmUgZmluaXNoZWQgdGhlIHdob2xlIHRyZWUuXG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY29tbWl0IGFuIGluY29tcGxldGUgcm9vdC4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgJyArICdidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICB9XG5cbiAge1xuICAgIG1hcmtSZW5kZXJTdG9wcGVkKCk7XG4gIH0gLy8gU2V0IHRoaXMgdG8gbnVsbCB0byBpbmRpY2F0ZSB0aGVyZSdzIG5vIGluLXByb2dyZXNzIHJlbmRlci5cblxuXG4gIHdvcmtJblByb2dyZXNzUm9vdCA9IG51bGw7XG4gIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzID0gTm9MYW5lcztcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXM7XG59IC8vIFRoZSB3b3JrIGxvb3AgaXMgYW4gZXh0cmVtZWx5IGhvdCBwYXRoLiBUZWxsIENsb3N1cmUgbm90IHRvIGlubGluZSBpdC5cblxuLyoqIEBub2lubGluZSAqL1xuXG5cbmZ1bmN0aW9uIHdvcmtMb29wU3luYygpIHtcbiAgLy8gQWxyZWFkeSB0aW1lZCBvdXQsIHNvIHBlcmZvcm0gd29yayB3aXRob3V0IGNoZWNraW5nIGlmIHdlIG5lZWQgdG8geWllbGQuXG4gIHdoaWxlICh3b3JrSW5Qcm9ncmVzcyAhPT0gbnVsbCkge1xuICAgIHBlcmZvcm1Vbml0T2ZXb3JrKHdvcmtJblByb2dyZXNzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZW5kZXJSb290Q29uY3VycmVudChyb290LCBsYW5lcykge1xuICB2YXIgcHJldkV4ZWN1dGlvbkNvbnRleHQgPSBleGVjdXRpb25Db250ZXh0O1xuICBleGVjdXRpb25Db250ZXh0IHw9IFJlbmRlckNvbnRleHQ7XG4gIHZhciBwcmV2RGlzcGF0Y2hlciA9IHB1c2hEaXNwYXRjaGVyKCk7IC8vIElmIHRoZSByb290IG9yIGxhbmVzIGhhdmUgY2hhbmdlZCwgdGhyb3cgb3V0IHRoZSBleGlzdGluZyBzdGFja1xuICAvLyBhbmQgcHJlcGFyZSBhIGZyZXNoIG9uZS4gT3RoZXJ3aXNlIHdlJ2xsIGNvbnRpbnVlIHdoZXJlIHdlIGxlZnQgb2ZmLlxuXG4gIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3QgIT09IHJvb3QgfHwgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgIT09IGxhbmVzKSB7XG4gICAge1xuICAgICAgaWYgKGlzRGV2VG9vbHNQcmVzZW50KSB7XG4gICAgICAgIHZhciBtZW1vaXplZFVwZGF0ZXJzID0gcm9vdC5tZW1vaXplZFVwZGF0ZXJzO1xuXG4gICAgICAgIGlmIChtZW1vaXplZFVwZGF0ZXJzLnNpemUgPiAwKSB7XG4gICAgICAgICAgcmVzdG9yZVBlbmRpbmdVcGRhdGVycyhyb290LCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyk7XG4gICAgICAgICAgbWVtb2l6ZWRVcGRhdGVycy5jbGVhcigpO1xuICAgICAgICB9IC8vIEF0IHRoaXMgcG9pbnQsIG1vdmUgRmliZXJzIHRoYXQgc2NoZWR1bGVkIHRoZSB1cGNvbWluZyB3b3JrIGZyb20gdGhlIE1hcCB0byB0aGUgU2V0LlxuICAgICAgICAvLyBJZiB3ZSBiYWlsb3V0IG9uIHRoaXMgd29yaywgd2UnbGwgbW92ZSB0aGVtIGJhY2sgKGxpa2UgYWJvdmUpLlxuICAgICAgICAvLyBJdCdzIGltcG9ydGFudCB0byBtb3ZlIHRoZW0gbm93IGluIGNhc2UgdGhlIHdvcmsgc3Bhd25zIG1vcmUgd29yayBhdCB0aGUgc2FtZSBwcmlvcml0eSB3aXRoIGRpZmZlcmVudCB1cGRhdGVycy5cbiAgICAgICAgLy8gVGhhdCB3YXkgd2UgY2FuIGtlZXAgdGhlIGN1cnJlbnQgdXBkYXRlIGFuZCBmdXR1cmUgdXBkYXRlcyBzZXBhcmF0ZS5cblxuXG4gICAgICAgIG1vdmVQZW5kaW5nRmliZXJzVG9NZW1vaXplZChyb290LCBsYW5lcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgd29ya0luUHJvZ3Jlc3NUcmFuc2l0aW9ucyA9IGdldFRyYW5zaXRpb25zRm9yTGFuZXMoKTtcbiAgICByZXNldFJlbmRlclRpbWVyKCk7XG4gICAgcHJlcGFyZUZyZXNoU3RhY2socm9vdCwgbGFuZXMpO1xuICB9XG5cbiAge1xuICAgIG1hcmtSZW5kZXJTdGFydGVkKGxhbmVzKTtcbiAgfVxuXG4gIGRvIHtcbiAgICB0cnkge1xuICAgICAgd29ya0xvb3BDb25jdXJyZW50KCk7XG4gICAgICBicmVhaztcbiAgICB9IGNhdGNoICh0aHJvd25WYWx1ZSkge1xuICAgICAgaGFuZGxlRXJyb3Iocm9vdCwgdGhyb3duVmFsdWUpO1xuICAgIH1cbiAgfSB3aGlsZSAodHJ1ZSk7XG5cbiAgcmVzZXRDb250ZXh0RGVwZW5kZW5jaWVzKCk7XG4gIHBvcERpc3BhdGNoZXIocHJldkRpc3BhdGNoZXIpO1xuICBleGVjdXRpb25Db250ZXh0ID0gcHJldkV4ZWN1dGlvbkNvbnRleHQ7XG5cblxuICBpZiAod29ya0luUHJvZ3Jlc3MgIT09IG51bGwpIHtcbiAgICAvLyBTdGlsbCB3b3JrIHJlbWFpbmluZy5cbiAgICB7XG4gICAgICBtYXJrUmVuZGVyWWllbGRlZCgpO1xuICAgIH1cblxuICAgIHJldHVybiBSb290SW5Qcm9ncmVzcztcbiAgfSBlbHNlIHtcbiAgICAvLyBDb21wbGV0ZWQgdGhlIHRyZWUuXG4gICAge1xuICAgICAgbWFya1JlbmRlclN0b3BwZWQoKTtcbiAgICB9IC8vIFNldCB0aGlzIHRvIG51bGwgdG8gaW5kaWNhdGUgdGhlcmUncyBubyBpbi1wcm9ncmVzcyByZW5kZXIuXG5cblxuICAgIHdvcmtJblByb2dyZXNzUm9vdCA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgPSBOb0xhbmVzOyAvLyBSZXR1cm4gdGhlIGZpbmFsIGV4aXQgc3RhdHVzLlxuXG4gICAgcmV0dXJuIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXM7XG4gIH1cbn1cbi8qKiBAbm9pbmxpbmUgKi9cblxuXG5mdW5jdGlvbiB3b3JrTG9vcENvbmN1cnJlbnQoKSB7XG4gIC8vIFBlcmZvcm0gd29yayB1bnRpbCBTY2hlZHVsZXIgYXNrcyB1cyB0byB5aWVsZFxuICB3aGlsZSAod29ya0luUHJvZ3Jlc3MgIT09IG51bGwgJiYgIXNob3VsZFlpZWxkKCkpIHtcbiAgICBwZXJmb3JtVW5pdE9mV29yayh3b3JrSW5Qcm9ncmVzcyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcGVyZm9ybVVuaXRPZldvcmsodW5pdE9mV29yaykge1xuICAvLyBUaGUgY3VycmVudCwgZmx1c2hlZCwgc3RhdGUgb2YgdGhpcyBmaWJlciBpcyB0aGUgYWx0ZXJuYXRlLiBJZGVhbGx5XG4gIC8vIG5vdGhpbmcgc2hvdWxkIHJlbHkgb24gdGhpcywgYnV0IHJlbHlpbmcgb24gaXQgaGVyZSBtZWFucyB0aGF0IHdlIGRvbid0XG4gIC8vIG5lZWQgYW4gYWRkaXRpb25hbCBmaWVsZCBvbiB0aGUgd29yayBpbiBwcm9ncmVzcy5cbiAgdmFyIGN1cnJlbnQgPSB1bml0T2ZXb3JrLmFsdGVybmF0ZTtcbiAgc2V0Q3VycmVudEZpYmVyKHVuaXRPZldvcmspO1xuICB2YXIgbmV4dDtcblxuICBpZiAoICh1bml0T2ZXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSkge1xuICAgIHN0YXJ0UHJvZmlsZXJUaW1lcih1bml0T2ZXb3JrKTtcbiAgICBuZXh0ID0gYmVnaW5Xb3JrJDEoY3VycmVudCwgdW5pdE9mV29yaywgc3VidHJlZVJlbmRlckxhbmVzKTtcbiAgICBzdG9wUHJvZmlsZXJUaW1lcklmUnVubmluZ0FuZFJlY29yZERlbHRhKHVuaXRPZldvcmssIHRydWUpO1xuICB9IGVsc2Uge1xuICAgIG5leHQgPSBiZWdpbldvcmskMShjdXJyZW50LCB1bml0T2ZXb3JrLCBzdWJ0cmVlUmVuZGVyTGFuZXMpO1xuICB9XG5cbiAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgdW5pdE9mV29yay5tZW1vaXplZFByb3BzID0gdW5pdE9mV29yay5wZW5kaW5nUHJvcHM7XG5cbiAgaWYgKG5leHQgPT09IG51bGwpIHtcbiAgICAvLyBJZiB0aGlzIGRvZXNuJ3Qgc3Bhd24gbmV3IHdvcmssIGNvbXBsZXRlIHRoZSBjdXJyZW50IHdvcmsuXG4gICAgY29tcGxldGVVbml0T2ZXb3JrKHVuaXRPZldvcmspO1xuICB9IGVsc2Uge1xuICAgIHdvcmtJblByb2dyZXNzID0gbmV4dDtcbiAgfVxuXG4gIFJlYWN0Q3VycmVudE93bmVyJDIuY3VycmVudCA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIGNvbXBsZXRlVW5pdE9mV29yayh1bml0T2ZXb3JrKSB7XG4gIC8vIEF0dGVtcHQgdG8gY29tcGxldGUgdGhlIGN1cnJlbnQgdW5pdCBvZiB3b3JrLCB0aGVuIG1vdmUgdG8gdGhlIG5leHRcbiAgLy8gc2libGluZy4gSWYgdGhlcmUgYXJlIG5vIG1vcmUgc2libGluZ3MsIHJldHVybiB0byB0aGUgcGFyZW50IGZpYmVyLlxuICB2YXIgY29tcGxldGVkV29yayA9IHVuaXRPZldvcms7XG5cbiAgZG8ge1xuICAgIC8vIFRoZSBjdXJyZW50LCBmbHVzaGVkLCBzdGF0ZSBvZiB0aGlzIGZpYmVyIGlzIHRoZSBhbHRlcm5hdGUuIElkZWFsbHlcbiAgICAvLyBub3RoaW5nIHNob3VsZCByZWx5IG9uIHRoaXMsIGJ1dCByZWx5aW5nIG9uIGl0IGhlcmUgbWVhbnMgdGhhdCB3ZSBkb24ndFxuICAgIC8vIG5lZWQgYW4gYWRkaXRpb25hbCBmaWVsZCBvbiB0aGUgd29yayBpbiBwcm9ncmVzcy5cbiAgICB2YXIgY3VycmVudCA9IGNvbXBsZXRlZFdvcmsuYWx0ZXJuYXRlO1xuICAgIHZhciByZXR1cm5GaWJlciA9IGNvbXBsZXRlZFdvcmsucmV0dXJuOyAvLyBDaGVjayBpZiB0aGUgd29yayBjb21wbGV0ZWQgb3IgaWYgc29tZXRoaW5nIHRocmV3LlxuXG4gICAgaWYgKChjb21wbGV0ZWRXb3JrLmZsYWdzICYgSW5jb21wbGV0ZSkgPT09IE5vRmxhZ3MpIHtcbiAgICAgIHNldEN1cnJlbnRGaWJlcihjb21wbGV0ZWRXb3JrKTtcbiAgICAgIHZhciBuZXh0ID0gdm9pZCAwO1xuXG4gICAgICBpZiAoIChjb21wbGV0ZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkgPT09IE5vTW9kZSkge1xuICAgICAgICBuZXh0ID0gY29tcGxldGVXb3JrKGN1cnJlbnQsIGNvbXBsZXRlZFdvcmssIHN1YnRyZWVSZW5kZXJMYW5lcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGFydFByb2ZpbGVyVGltZXIoY29tcGxldGVkV29yayk7XG4gICAgICAgIG5leHQgPSBjb21wbGV0ZVdvcmsoY3VycmVudCwgY29tcGxldGVkV29yaywgc3VidHJlZVJlbmRlckxhbmVzKTsgLy8gVXBkYXRlIHJlbmRlciBkdXJhdGlvbiBhc3N1bWluZyB3ZSBkaWRuJ3QgZXJyb3IuXG5cbiAgICAgICAgc3RvcFByb2ZpbGVyVGltZXJJZlJ1bm5pbmdBbmRSZWNvcmREZWx0YShjb21wbGV0ZWRXb3JrLCBmYWxzZSk7XG4gICAgICB9XG5cbiAgICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG5cbiAgICAgIGlmIChuZXh0ICE9PSBudWxsKSB7XG4gICAgICAgIC8vIENvbXBsZXRpbmcgdGhpcyBmaWJlciBzcGF3bmVkIG5ldyB3b3JrLiBXb3JrIG9uIHRoYXQgbmV4dC5cbiAgICAgICAgd29ya0luUHJvZ3Jlc3MgPSBuZXh0O1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoaXMgZmliZXIgZGlkIG5vdCBjb21wbGV0ZSBiZWNhdXNlIHNvbWV0aGluZyB0aHJldy4gUG9wIHZhbHVlcyBvZmZcbiAgICAgIC8vIHRoZSBzdGFjayB3aXRob3V0IGVudGVyaW5nIHRoZSBjb21wbGV0ZSBwaGFzZS4gSWYgdGhpcyBpcyBhIGJvdW5kYXJ5LFxuICAgICAgLy8gY2FwdHVyZSB2YWx1ZXMgaWYgcG9zc2libGUuXG4gICAgICB2YXIgX25leHQgPSB1bndpbmRXb3JrKGN1cnJlbnQsIGNvbXBsZXRlZFdvcmspOyAvLyBCZWNhdXNlIHRoaXMgZmliZXIgZGlkIG5vdCBjb21wbGV0ZSwgZG9uJ3QgcmVzZXQgaXRzIGxhbmVzLlxuXG5cbiAgICAgIGlmIChfbmV4dCAhPT0gbnVsbCkge1xuICAgICAgICAvLyBJZiBjb21wbGV0aW5nIHRoaXMgd29yayBzcGF3bmVkIG5ldyB3b3JrLCBkbyB0aGF0IG5leHQuIFdlJ2xsIGNvbWVcbiAgICAgICAgLy8gYmFjayBoZXJlIGFnYWluLlxuICAgICAgICAvLyBTaW5jZSB3ZSdyZSByZXN0YXJ0aW5nLCByZW1vdmUgYW55dGhpbmcgdGhhdCBpcyBub3QgYSBob3N0IGVmZmVjdFxuICAgICAgICAvLyBmcm9tIHRoZSBlZmZlY3QgdGFnLlxuICAgICAgICBfbmV4dC5mbGFncyAmPSBIb3N0RWZmZWN0TWFzaztcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MgPSBfbmV4dDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoIChjb21wbGV0ZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgICAvLyBSZWNvcmQgdGhlIHJlbmRlciBkdXJhdGlvbiBmb3IgdGhlIGZpYmVyIHRoYXQgZXJyb3JlZC5cbiAgICAgICAgc3RvcFByb2ZpbGVyVGltZXJJZlJ1bm5pbmdBbmRSZWNvcmREZWx0YShjb21wbGV0ZWRXb3JrLCBmYWxzZSk7IC8vIEluY2x1ZGUgdGhlIHRpbWUgc3BlbnQgd29ya2luZyBvbiBmYWlsZWQgY2hpbGRyZW4gYmVmb3JlIGNvbnRpbnVpbmcuXG5cbiAgICAgICAgdmFyIGFjdHVhbER1cmF0aW9uID0gY29tcGxldGVkV29yay5hY3R1YWxEdXJhdGlvbjtcbiAgICAgICAgdmFyIGNoaWxkID0gY29tcGxldGVkV29yay5jaGlsZDtcblxuICAgICAgICB3aGlsZSAoY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgICBhY3R1YWxEdXJhdGlvbiArPSBjaGlsZC5hY3R1YWxEdXJhdGlvbjtcbiAgICAgICAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gICAgICAgIH1cblxuICAgICAgICBjb21wbGV0ZWRXb3JrLmFjdHVhbER1cmF0aW9uID0gYWN0dWFsRHVyYXRpb247XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXR1cm5GaWJlciAhPT0gbnVsbCkge1xuICAgICAgICAvLyBNYXJrIHRoZSBwYXJlbnQgZmliZXIgYXMgaW5jb21wbGV0ZSBhbmQgY2xlYXIgaXRzIHN1YnRyZWUgZmxhZ3MuXG4gICAgICAgIHJldHVybkZpYmVyLmZsYWdzIHw9IEluY29tcGxldGU7XG4gICAgICAgIHJldHVybkZpYmVyLnN1YnRyZWVGbGFncyA9IE5vRmxhZ3M7XG4gICAgICAgIHJldHVybkZpYmVyLmRlbGV0aW9ucyA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBXZSd2ZSB1bndvdW5kIGFsbCB0aGUgd2F5IHRvIHRoZSByb290LlxuICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID0gUm9vdERpZE5vdENvbXBsZXRlO1xuICAgICAgICB3b3JrSW5Qcm9ncmVzcyA9IG51bGw7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgc2libGluZ0ZpYmVyID0gY29tcGxldGVkV29yay5zaWJsaW5nO1xuXG4gICAgaWYgKHNpYmxpbmdGaWJlciAhPT0gbnVsbCkge1xuICAgICAgLy8gSWYgdGhlcmUgaXMgbW9yZSB3b3JrIHRvIGRvIGluIHRoaXMgcmV0dXJuRmliZXIsIGRvIHRoYXQgbmV4dC5cbiAgICAgIHdvcmtJblByb2dyZXNzID0gc2libGluZ0ZpYmVyO1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gT3RoZXJ3aXNlLCByZXR1cm4gdG8gdGhlIHBhcmVudFxuXG5cbiAgICBjb21wbGV0ZWRXb3JrID0gcmV0dXJuRmliZXI7IC8vIFVwZGF0ZSB0aGUgbmV4dCB0aGluZyB3ZSdyZSB3b3JraW5nIG9uIGluIGNhc2Ugc29tZXRoaW5nIHRocm93cy5cblxuICAgIHdvcmtJblByb2dyZXNzID0gY29tcGxldGVkV29yaztcbiAgfSB3aGlsZSAoY29tcGxldGVkV29yayAhPT0gbnVsbCk7IC8vIFdlJ3ZlIHJlYWNoZWQgdGhlIHJvb3QuXG5cblxuICBpZiAod29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdEluUHJvZ3Jlc3MpIHtcbiAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID0gUm9vdENvbXBsZXRlZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRSb290KHJvb3QsIHJlY292ZXJhYmxlRXJyb3JzLCB0cmFuc2l0aW9ucykge1xuICAvLyBUT0RPOiBUaGlzIG5vIGxvbmdlciBtYWtlcyBhbnkgc2Vuc2UuIFdlIGFscmVhZHkgd3JhcCB0aGUgbXV0YXRpb24gYW5kXG4gIC8vIGxheW91dCBwaGFzZXMuIFNob3VsZCBiZSBhYmxlIHRvIHJlbW92ZS5cbiAgdmFyIHByZXZpb3VzVXBkYXRlTGFuZVByaW9yaXR5ID0gZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KCk7XG4gIHZhciBwcmV2VHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDIudHJhbnNpdGlvbjtcblxuICB0cnkge1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDIudHJhbnNpdGlvbiA9IG51bGw7XG4gICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KERpc2NyZXRlRXZlbnRQcmlvcml0eSk7XG4gICAgY29tbWl0Um9vdEltcGwocm9vdCwgcmVjb3ZlcmFibGVFcnJvcnMsIHRyYW5zaXRpb25zLCBwcmV2aW91c1VwZGF0ZUxhbmVQcmlvcml0eSk7XG4gIH0gZmluYWxseSB7XG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMi50cmFuc2l0aW9uID0gcHJldlRyYW5zaXRpb247XG4gICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KHByZXZpb3VzVXBkYXRlTGFuZVByaW9yaXR5KTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBjb21taXRSb290SW1wbChyb290LCByZWNvdmVyYWJsZUVycm9ycywgdHJhbnNpdGlvbnMsIHJlbmRlclByaW9yaXR5TGV2ZWwpIHtcbiAgZG8ge1xuICAgIC8vIGBmbHVzaFBhc3NpdmVFZmZlY3RzYCB3aWxsIGNhbGwgYGZsdXNoU3luY1VwZGF0ZVF1ZXVlYCBhdCB0aGUgZW5kLCB3aGljaFxuICAgIC8vIG1lYW5zIGBmbHVzaFBhc3NpdmVFZmZlY3RzYCB3aWxsIHNvbWV0aW1lcyByZXN1bHQgaW4gYWRkaXRpb25hbFxuICAgIC8vIHBhc3NpdmUgZWZmZWN0cy4gU28gd2UgbmVlZCB0byBrZWVwIGZsdXNoaW5nIGluIGEgbG9vcCB1bnRpbCB0aGVyZSBhcmVcbiAgICAvLyBubyBtb3JlIHBlbmRpbmcgZWZmZWN0cy5cbiAgICAvLyBUT0RPOiBNaWdodCBiZSBiZXR0ZXIgaWYgYGZsdXNoUGFzc2l2ZUVmZmVjdHNgIGRpZCBub3QgYXV0b21hdGljYWxseVxuICAgIC8vIGZsdXNoIHN5bmNocm9ub3VzIHdvcmsgYXQgdGhlIGVuZCwgdG8gYXZvaWQgZmFjdG9yaW5nIGhhemFyZHMgbGlrZSB0aGlzLlxuICAgIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTtcbiAgfSB3aGlsZSAocm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMgIT09IG51bGwpO1xuXG4gIGZsdXNoUmVuZGVyUGhhc2VTdHJpY3RNb2RlV2FybmluZ3NJbkRFVigpO1xuXG4gIGlmICgoZXhlY3V0aW9uQ29udGV4dCAmIChSZW5kZXJDb250ZXh0IHwgQ29tbWl0Q29udGV4dCkpICE9PSBOb0NvbnRleHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Nob3VsZCBub3QgYWxyZWFkeSBiZSB3b3JraW5nLicpO1xuICB9XG5cbiAgdmFyIGZpbmlzaGVkV29yayA9IHJvb3QuZmluaXNoZWRXb3JrO1xuICB2YXIgbGFuZXMgPSByb290LmZpbmlzaGVkTGFuZXM7XG5cbiAge1xuICAgIG1hcmtDb21taXRTdGFydGVkKGxhbmVzKTtcbiAgfVxuXG4gIGlmIChmaW5pc2hlZFdvcmsgPT09IG51bGwpIHtcblxuICAgIHtcbiAgICAgIG1hcmtDb21taXRTdG9wcGVkKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH0gZWxzZSB7XG4gICAge1xuICAgICAgaWYgKGxhbmVzID09PSBOb0xhbmVzKSB7XG4gICAgICAgIGVycm9yKCdyb290LmZpbmlzaGVkTGFuZXMgc2hvdWxkIG5vdCBiZSBlbXB0eSBkdXJpbmcgYSBjb21taXQuIFRoaXMgaXMgYSAnICsgJ2J1ZyBpbiBSZWFjdC4nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByb290LmZpbmlzaGVkV29yayA9IG51bGw7XG4gIHJvb3QuZmluaXNoZWRMYW5lcyA9IE5vTGFuZXM7XG5cbiAgaWYgKGZpbmlzaGVkV29yayA9PT0gcm9vdC5jdXJyZW50KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY29tbWl0IHRoZSBzYW1lIHRyZWUgYXMgYmVmb3JlLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgJyArICdhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gIH0gLy8gY29tbWl0Um9vdCBuZXZlciByZXR1cm5zIGEgY29udGludWF0aW9uOyBpdCBhbHdheXMgZmluaXNoZXMgc3luY2hyb25vdXNseS5cbiAgLy8gU28gd2UgY2FuIGNsZWFyIHRoZXNlIG5vdyB0byBhbGxvdyBhIG5ldyBjYWxsYmFjayB0byBiZSBzY2hlZHVsZWQuXG5cblxuICByb290LmNhbGxiYWNrTm9kZSA9IG51bGw7XG4gIHJvb3QuY2FsbGJhY2tQcmlvcml0eSA9IE5vTGFuZTsgLy8gVXBkYXRlIHRoZSBmaXJzdCBhbmQgbGFzdCBwZW5kaW5nIHRpbWVzIG9uIHRoaXMgcm9vdC4gVGhlIG5ldyBmaXJzdFxuICAvLyBwZW5kaW5nIHRpbWUgaXMgd2hhdGV2ZXIgaXMgbGVmdCBvbiB0aGUgcm9vdCBmaWJlci5cblxuICB2YXIgcmVtYWluaW5nTGFuZXMgPSBtZXJnZUxhbmVzKGZpbmlzaGVkV29yay5sYW5lcywgZmluaXNoZWRXb3JrLmNoaWxkTGFuZXMpO1xuICBtYXJrUm9vdEZpbmlzaGVkKHJvb3QsIHJlbWFpbmluZ0xhbmVzKTtcblxuICBpZiAocm9vdCA9PT0gd29ya0luUHJvZ3Jlc3NSb290KSB7XG4gICAgLy8gV2UgY2FuIHJlc2V0IHRoZXNlIG5vdyB0aGF0IHRoZXkgYXJlIGZpbmlzaGVkLlxuICAgIHdvcmtJblByb2dyZXNzUm9vdCA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3MgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzID0gTm9MYW5lcztcbiAgfSAvLyBJZiB0aGVyZSBhcmUgcGVuZGluZyBwYXNzaXZlIGVmZmVjdHMsIHNjaGVkdWxlIGEgY2FsbGJhY2sgdG8gcHJvY2VzcyB0aGVtLlxuICAvLyBEbyB0aGlzIGFzIGVhcmx5IGFzIHBvc3NpYmxlLCBzbyBpdCBpcyBxdWV1ZWQgYmVmb3JlIGFueXRoaW5nIGVsc2UgdGhhdFxuICAvLyBtaWdodCBnZXQgc2NoZWR1bGVkIGluIHRoZSBjb21taXQgcGhhc2UuIChTZWUgIzE2NzE0LilcbiAgLy8gVE9ETzogRGVsZXRlIGFsbCBvdGhlciBwbGFjZXMgdGhhdCBzY2hlZHVsZSB0aGUgcGFzc2l2ZSBlZmZlY3QgY2FsbGJhY2tcbiAgLy8gVGhleSdyZSByZWR1bmRhbnQuXG5cblxuICBpZiAoKGZpbmlzaGVkV29yay5zdWJ0cmVlRmxhZ3MgJiBQYXNzaXZlTWFzaykgIT09IE5vRmxhZ3MgfHwgKGZpbmlzaGVkV29yay5mbGFncyAmIFBhc3NpdmVNYXNrKSAhPT0gTm9GbGFncykge1xuICAgIGlmICghcm9vdERvZXNIYXZlUGFzc2l2ZUVmZmVjdHMpIHtcbiAgICAgIHJvb3REb2VzSGF2ZVBhc3NpdmVFZmZlY3RzID0gdHJ1ZTtcbiAgICAgIC8vIHRvIHN0b3JlIGl0IGluIHBlbmRpbmdQYXNzaXZlVHJhbnNpdGlvbnMgdW50aWwgdGhleSBnZXQgcHJvY2Vzc2VkXG4gICAgICAvLyBXZSBuZWVkIHRvIHBhc3MgdGhpcyB0aHJvdWdoIGFzIGFuIGFyZ3VtZW50IHRvIGNvbW1pdFJvb3RcbiAgICAgIC8vIGJlY2F1c2Ugd29ya0luUHJvZ3Jlc3NUcmFuc2l0aW9ucyBtaWdodCBoYXZlIGNoYW5nZWQgYmV0d2VlblxuICAgICAgLy8gdGhlIHByZXZpb3VzIHJlbmRlciBhbmQgY29tbWl0IGlmIHdlIHRocm90dGxlIHRoZSBjb21taXRcbiAgICAgIC8vIHdpdGggc2V0VGltZW91dFxuXG4gICAgICBwZW5kaW5nUGFzc2l2ZVRyYW5zaXRpb25zID0gdHJhbnNpdGlvbnM7XG4gICAgICBzY2hlZHVsZUNhbGxiYWNrJDEoTm9ybWFsUHJpb3JpdHksIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZmx1c2hQYXNzaXZlRWZmZWN0cygpOyAvLyBUaGlzIHJlbmRlciB0cmlnZ2VyZWQgcGFzc2l2ZSBlZmZlY3RzOiByZWxlYXNlIHRoZSByb290IGNhY2hlIHBvb2xcbiAgICAgICAgLy8gKmFmdGVyKiBwYXNzaXZlIGVmZmVjdHMgZmlyZSB0byBhdm9pZCBmcmVlaW5nIGEgY2FjaGUgcG9vbCB0aGF0IG1heVxuICAgICAgICAvLyBiZSByZWZlcmVuY2VkIGJ5IGEgbm9kZSBpbiB0aGUgdHJlZSAoSG9zdFJvb3QsIENhY2hlIGJvdW5kYXJ5IGV0YylcblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSAvLyBDaGVjayBpZiB0aGVyZSBhcmUgYW55IGVmZmVjdHMgaW4gdGhlIHdob2xlIHRyZWUuXG4gIC8vIFRPRE86IFRoaXMgaXMgbGVmdCBvdmVyIGZyb20gdGhlIGVmZmVjdCBsaXN0IGltcGxlbWVudGF0aW9uLCB3aGVyZSB3ZSBoYWRcbiAgLy8gdG8gY2hlY2sgZm9yIHRoZSBleGlzdGVuY2Ugb2YgYGZpcnN0RWZmZWN0YCB0byBzYXRpc2Z5IEZsb3cuIEkgdGhpbmsgdGhlXG4gIC8vIG9ubHkgb3RoZXIgcmVhc29uIHRoaXMgb3B0aW1pemF0aW9uIGV4aXN0cyBpcyBiZWNhdXNlIGl0IGFmZmVjdHMgcHJvZmlsaW5nLlxuICAvLyBSZWNvbnNpZGVyIHdoZXRoZXIgdGhpcyBpcyBuZWNlc3NhcnkuXG5cblxuICB2YXIgc3VidHJlZUhhc0VmZmVjdHMgPSAoZmluaXNoZWRXb3JrLnN1YnRyZWVGbGFncyAmIChCZWZvcmVNdXRhdGlvbk1hc2sgfCBNdXRhdGlvbk1hc2sgfCBMYXlvdXRNYXNrIHwgUGFzc2l2ZU1hc2spKSAhPT0gTm9GbGFncztcbiAgdmFyIHJvb3RIYXNFZmZlY3QgPSAoZmluaXNoZWRXb3JrLmZsYWdzICYgKEJlZm9yZU11dGF0aW9uTWFzayB8IE11dGF0aW9uTWFzayB8IExheW91dE1hc2sgfCBQYXNzaXZlTWFzaykpICE9PSBOb0ZsYWdzO1xuXG4gIGlmIChzdWJ0cmVlSGFzRWZmZWN0cyB8fCByb290SGFzRWZmZWN0KSB7XG4gICAgdmFyIHByZXZUcmFuc2l0aW9uID0gUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMi50cmFuc2l0aW9uO1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDIudHJhbnNpdGlvbiA9IG51bGw7XG4gICAgdmFyIHByZXZpb3VzUHJpb3JpdHkgPSBnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoKTtcbiAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoRGlzY3JldGVFdmVudFByaW9yaXR5KTtcbiAgICB2YXIgcHJldkV4ZWN1dGlvbkNvbnRleHQgPSBleGVjdXRpb25Db250ZXh0O1xuICAgIGV4ZWN1dGlvbkNvbnRleHQgfD0gQ29tbWl0Q29udGV4dDsgLy8gUmVzZXQgdGhpcyB0byBudWxsIGJlZm9yZSBjYWxsaW5nIGxpZmVjeWNsZXNcblxuICAgIFJlYWN0Q3VycmVudE93bmVyJDIuY3VycmVudCA9IG51bGw7IC8vIFRoZSBjb21taXQgcGhhc2UgaXMgYnJva2VuIGludG8gc2V2ZXJhbCBzdWItcGhhc2VzLiBXZSBkbyBhIHNlcGFyYXRlIHBhc3NcbiAgICAvLyBvZiB0aGUgZWZmZWN0IGxpc3QgZm9yIGVhY2ggcGhhc2U6IGFsbCBtdXRhdGlvbiBlZmZlY3RzIGNvbWUgYmVmb3JlIGFsbFxuICAgIC8vIGxheW91dCBlZmZlY3RzLCBhbmQgc28gb24uXG4gICAgLy8gVGhlIGZpcnN0IHBoYXNlIGEgXCJiZWZvcmUgbXV0YXRpb25cIiBwaGFzZS4gV2UgdXNlIHRoaXMgcGhhc2UgdG8gcmVhZCB0aGVcbiAgICAvLyBzdGF0ZSBvZiB0aGUgaG9zdCB0cmVlIHJpZ2h0IGJlZm9yZSB3ZSBtdXRhdGUgaXQuIFRoaXMgaXMgd2hlcmVcbiAgICAvLyBnZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSBpcyBjYWxsZWQuXG5cbiAgICB2YXIgc2hvdWxkRmlyZUFmdGVyQWN0aXZlSW5zdGFuY2VCbHVyID0gY29tbWl0QmVmb3JlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayk7XG5cbiAgICB7XG4gICAgICAvLyBNYXJrIHRoZSBjdXJyZW50IGNvbW1pdCB0aW1lIHRvIGJlIHNoYXJlZCBieSBhbGwgUHJvZmlsZXJzIGluIHRoaXNcbiAgICAgIC8vIGJhdGNoLiBUaGlzIGVuYWJsZXMgdGhlbSB0byBiZSBncm91cGVkIGxhdGVyLlxuICAgICAgcmVjb3JkQ29tbWl0VGltZSgpO1xuICAgIH1cblxuXG4gICAgY29tbWl0TXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yaywgbGFuZXMpO1xuXG4gICAgcmVzZXRBZnRlckNvbW1pdChyb290LmNvbnRhaW5lckluZm8pOyAvLyBUaGUgd29yay1pbi1wcm9ncmVzcyB0cmVlIGlzIG5vdyB0aGUgY3VycmVudCB0cmVlLiBUaGlzIG11c3QgY29tZSBhZnRlclxuICAgIC8vIHRoZSBtdXRhdGlvbiBwaGFzZSwgc28gdGhhdCB0aGUgcHJldmlvdXMgdHJlZSBpcyBzdGlsbCBjdXJyZW50IGR1cmluZ1xuICAgIC8vIGNvbXBvbmVudFdpbGxVbm1vdW50LCBidXQgYmVmb3JlIHRoZSBsYXlvdXQgcGhhc2UsIHNvIHRoYXQgdGhlIGZpbmlzaGVkXG4gICAgLy8gd29yayBpcyBjdXJyZW50IGR1cmluZyBjb21wb25lbnREaWRNb3VudC9VcGRhdGUuXG5cbiAgICByb290LmN1cnJlbnQgPSBmaW5pc2hlZFdvcms7IC8vIFRoZSBuZXh0IHBoYXNlIGlzIHRoZSBsYXlvdXQgcGhhc2UsIHdoZXJlIHdlIGNhbGwgZWZmZWN0cyB0aGF0IHJlYWRcblxuICAgIHtcbiAgICAgIG1hcmtMYXlvdXRFZmZlY3RzU3RhcnRlZChsYW5lcyk7XG4gICAgfVxuXG4gICAgY29tbWl0TGF5b3V0RWZmZWN0cyhmaW5pc2hlZFdvcmssIHJvb3QsIGxhbmVzKTtcblxuICAgIHtcbiAgICAgIG1hcmtMYXlvdXRFZmZlY3RzU3RvcHBlZCgpO1xuICAgIH1cbiAgICAvLyBvcHBvcnR1bml0eSB0byBwYWludC5cblxuXG4gICAgcmVxdWVzdFBhaW50KCk7XG4gICAgZXhlY3V0aW9uQ29udGV4dCA9IHByZXZFeGVjdXRpb25Db250ZXh0OyAvLyBSZXNldCB0aGUgcHJpb3JpdHkgdG8gdGhlIHByZXZpb3VzIG5vbi1zeW5jIHZhbHVlLlxuXG4gICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KHByZXZpb3VzUHJpb3JpdHkpO1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDIudHJhbnNpdGlvbiA9IHByZXZUcmFuc2l0aW9uO1xuICB9IGVsc2Uge1xuICAgIC8vIE5vIGVmZmVjdHMuXG4gICAgcm9vdC5jdXJyZW50ID0gZmluaXNoZWRXb3JrOyAvLyBNZWFzdXJlIHRoZXNlIGFueXdheSBzbyB0aGUgZmxhbWVncmFwaCBleHBsaWNpdGx5IHNob3dzIHRoYXQgdGhlcmUgd2VyZVxuICAgIC8vIG5vIGVmZmVjdHMuXG4gICAgLy8gVE9ETzogTWF5YmUgdGhlcmUncyBhIGJldHRlciB3YXkgdG8gcmVwb3J0IHRoaXMuXG5cbiAgICB7XG4gICAgICByZWNvcmRDb21taXRUaW1lKCk7XG4gICAgfVxuICB9XG5cbiAgdmFyIHJvb3REaWRIYXZlUGFzc2l2ZUVmZmVjdHMgPSByb290RG9lc0hhdmVQYXNzaXZlRWZmZWN0cztcblxuICBpZiAocm9vdERvZXNIYXZlUGFzc2l2ZUVmZmVjdHMpIHtcbiAgICAvLyBUaGlzIGNvbW1pdCBoYXMgcGFzc2l2ZSBlZmZlY3RzLiBTdGFzaCBhIHJlZmVyZW5jZSB0byB0aGVtLiBCdXQgZG9uJ3RcbiAgICAvLyBzY2hlZHVsZSBhIGNhbGxiYWNrIHVudGlsIGFmdGVyIGZsdXNoaW5nIGxheW91dCB3b3JrLlxuICAgIHJvb3REb2VzSGF2ZVBhc3NpdmVFZmZlY3RzID0gZmFsc2U7XG4gICAgcm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMgPSByb290O1xuICAgIHBlbmRpbmdQYXNzaXZlRWZmZWN0c0xhbmVzID0gbGFuZXM7XG4gIH0gZWxzZSB7XG5cbiAgICB7XG4gICAgICBuZXN0ZWRQYXNzaXZlVXBkYXRlQ291bnQgPSAwO1xuICAgICAgcm9vdFdpdGhQYXNzaXZlTmVzdGVkVXBkYXRlcyA9IG51bGw7XG4gICAgfVxuICB9IC8vIFJlYWQgdGhpcyBhZ2Fpbiwgc2luY2UgYW4gZWZmZWN0IG1pZ2h0IGhhdmUgdXBkYXRlZCBpdFxuXG5cbiAgcmVtYWluaW5nTGFuZXMgPSByb290LnBlbmRpbmdMYW5lczsgLy8gQ2hlY2sgaWYgdGhlcmUncyByZW1haW5pbmcgd29yayBvbiB0aGlzIHJvb3RcbiAgLy8gVE9ETzogVGhpcyBpcyBwYXJ0IG9mIHRoZSBgY29tcG9uZW50RGlkQ2F0Y2hgIGltcGxlbWVudGF0aW9uLiBJdHMgcHVycG9zZVxuICAvLyBpcyB0byBkZXRlY3Qgd2hldGhlciBzb21ldGhpbmcgbWlnaHQgaGF2ZSBjYWxsZWQgc2V0U3RhdGUgaW5zaWRlXG4gIC8vIGBjb21wb25lbnREaWRDYXRjaGAuIFRoZSBtZWNoYW5pc20gaXMga25vd24gdG8gYmUgZmxhd2VkIGJlY2F1c2UgYHNldFN0YXRlYFxuICAvLyBpbnNpZGUgYGNvbXBvbmVudERpZENhdGNoYCBpcyBpdHNlbGYgZmxhd2VkIFx1MjAxNCB0aGF0J3Mgd2h5IHdlIHJlY29tbWVuZFxuICAvLyBgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yYCBpbnN0ZWFkLiBIb3dldmVyLCBpdCBjb3VsZCBiZSBpbXByb3ZlZCBieVxuICAvLyBjaGVja2luZyBpZiByZW1haW5pbmdMYW5lcyBpbmNsdWRlcyBTeW5jIHdvcmssIGluc3RlYWQgb2Ygd2hldGhlciB0aGVyZSdzXG4gIC8vIGFueSB3b3JrIHJlbWFpbmluZyBhdCBhbGwgKHdoaWNoIHdvdWxkIGFsc28gaW5jbHVkZSBzdHVmZiBsaWtlIFN1c3BlbnNlXG4gIC8vIHJldHJpZXMgb3IgdHJhbnNpdGlvbnMpLiBJdCdzIGJlZW4gbGlrZSB0aGlzIGZvciBhIHdoaWxlLCB0aG91Z2gsIHNvIGZpeGluZ1xuICAvLyBpdCBwcm9iYWJseSBpc24ndCB0aGF0IHVyZ2VudC5cblxuICBpZiAocmVtYWluaW5nTGFuZXMgPT09IE5vTGFuZXMpIHtcbiAgICAvLyBJZiB0aGVyZSdzIG5vIHJlbWFpbmluZyB3b3JrLCB3ZSBjYW4gY2xlYXIgdGhlIHNldCBvZiBhbHJlYWR5IGZhaWxlZFxuICAgIC8vIGVycm9yIGJvdW5kYXJpZXMuXG4gICAgbGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQgPSBudWxsO1xuICB9XG5cbiAge1xuICAgIGlmICghcm9vdERpZEhhdmVQYXNzaXZlRWZmZWN0cykge1xuICAgICAgY29tbWl0RG91YmxlSW52b2tlRWZmZWN0c0luREVWKHJvb3QuY3VycmVudCwgZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIG9uQ29tbWl0Um9vdChmaW5pc2hlZFdvcmsuc3RhdGVOb2RlLCByZW5kZXJQcmlvcml0eUxldmVsKTtcblxuICB7XG4gICAgaWYgKGlzRGV2VG9vbHNQcmVzZW50KSB7XG4gICAgICByb290Lm1lbW9pemVkVXBkYXRlcnMuY2xlYXIoKTtcbiAgICB9XG4gIH1cblxuICB7XG4gICAgb25Db21taXRSb290JDEoKTtcbiAgfSAvLyBBbHdheXMgY2FsbCB0aGlzIGJlZm9yZSBleGl0aW5nIGBjb21taXRSb290YCwgdG8gZW5zdXJlIHRoYXQgYW55XG4gIC8vIGFkZGl0aW9uYWwgd29yayBvbiB0aGlzIHJvb3QgaXMgc2NoZWR1bGVkLlxuXG5cbiAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIG5vdygpKTtcblxuICBpZiAocmVjb3ZlcmFibGVFcnJvcnMgIT09IG51bGwpIHtcbiAgICAvLyBUaGVyZSB3ZXJlIGVycm9ycyBkdXJpbmcgdGhpcyByZW5kZXIsIGJ1dCByZWNvdmVyZWQgZnJvbSB0aGVtIHdpdGhvdXRcbiAgICAvLyBuZWVkaW5nIHRvIHN1cmZhY2UgaXQgdG8gdGhlIFVJLiBXZSBsb2cgdGhlbSBoZXJlLlxuICAgIHZhciBvblJlY292ZXJhYmxlRXJyb3IgPSByb290Lm9uUmVjb3ZlcmFibGVFcnJvcjtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVjb3ZlcmFibGVFcnJvcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciByZWNvdmVyYWJsZUVycm9yID0gcmVjb3ZlcmFibGVFcnJvcnNbaV07XG4gICAgICB2YXIgY29tcG9uZW50U3RhY2sgPSByZWNvdmVyYWJsZUVycm9yLnN0YWNrO1xuICAgICAgdmFyIGRpZ2VzdCA9IHJlY292ZXJhYmxlRXJyb3IuZGlnZXN0O1xuICAgICAgb25SZWNvdmVyYWJsZUVycm9yKHJlY292ZXJhYmxlRXJyb3IudmFsdWUsIHtcbiAgICAgICAgY29tcG9uZW50U3RhY2s6IGNvbXBvbmVudFN0YWNrLFxuICAgICAgICBkaWdlc3Q6IGRpZ2VzdFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGhhc1VuY2F1Z2h0RXJyb3IpIHtcbiAgICBoYXNVbmNhdWdodEVycm9yID0gZmFsc2U7XG4gICAgdmFyIGVycm9yJDEgPSBmaXJzdFVuY2F1Z2h0RXJyb3I7XG4gICAgZmlyc3RVbmNhdWdodEVycm9yID0gbnVsbDtcbiAgICB0aHJvdyBlcnJvciQxO1xuICB9IC8vIElmIHRoZSBwYXNzaXZlIGVmZmVjdHMgYXJlIHRoZSByZXN1bHQgb2YgYSBkaXNjcmV0ZSByZW5kZXIsIGZsdXNoIHRoZW1cbiAgLy8gc3luY2hyb25vdXNseSBhdCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IHRhc2sgc28gdGhhdCB0aGUgcmVzdWx0IGlzXG4gIC8vIGltbWVkaWF0ZWx5IG9ic2VydmFibGUuIE90aGVyd2lzZSwgd2UgYXNzdW1lIHRoYXQgdGhleSBhcmUgbm90XG4gIC8vIG9yZGVyLWRlcGVuZGVudCBhbmQgZG8gbm90IG5lZWQgdG8gYmUgb2JzZXJ2ZWQgYnkgZXh0ZXJuYWwgc3lzdGVtcywgc28gd2VcbiAgLy8gY2FuIHdhaXQgdW50aWwgYWZ0ZXIgcGFpbnQuXG4gIC8vIFRPRE86IFdlIGNhbiBvcHRpbWl6ZSB0aGlzIGJ5IG5vdCBzY2hlZHVsaW5nIHRoZSBjYWxsYmFjayBlYXJsaWVyLiBTaW5jZSB3ZVxuICAvLyBjdXJyZW50bHkgc2NoZWR1bGUgdGhlIGNhbGxiYWNrIGluIG11bHRpcGxlIHBsYWNlcywgd2lsbCB3YWl0IHVudGlsIHRob3NlXG4gIC8vIGFyZSBjb25zb2xpZGF0ZWQuXG5cblxuICBpZiAoaW5jbHVkZXNTb21lTGFuZShwZW5kaW5nUGFzc2l2ZUVmZmVjdHNMYW5lcywgU3luY0xhbmUpICYmIHJvb3QudGFnICE9PSBMZWdhY3lSb290KSB7XG4gICAgZmx1c2hQYXNzaXZlRWZmZWN0cygpO1xuICB9IC8vIFJlYWQgdGhpcyBhZ2Fpbiwgc2luY2UgYSBwYXNzaXZlIGVmZmVjdCBtaWdodCBoYXZlIHVwZGF0ZWQgaXRcblxuXG4gIHJlbWFpbmluZ0xhbmVzID0gcm9vdC5wZW5kaW5nTGFuZXM7XG5cbiAgaWYgKGluY2x1ZGVzU29tZUxhbmUocmVtYWluaW5nTGFuZXMsIFN5bmNMYW5lKSkge1xuICAgIHtcbiAgICAgIG1hcmtOZXN0ZWRVcGRhdGVTY2hlZHVsZWQoKTtcbiAgICB9IC8vIENvdW50IHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIHJvb3Qgc3luY2hyb25vdXNseSByZS1yZW5kZXJzIHdpdGhvdXRcbiAgICAvLyBmaW5pc2hpbmcuIElmIHRoZXJlIGFyZSB0b28gbWFueSwgaXQgaW5kaWNhdGVzIGFuIGluZmluaXRlIHVwZGF0ZSBsb29wLlxuXG5cbiAgICBpZiAocm9vdCA9PT0gcm9vdFdpdGhOZXN0ZWRVcGRhdGVzKSB7XG4gICAgICBuZXN0ZWRVcGRhdGVDb3VudCsrO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXN0ZWRVcGRhdGVDb3VudCA9IDA7XG4gICAgICByb290V2l0aE5lc3RlZFVwZGF0ZXMgPSByb290O1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBuZXN0ZWRVcGRhdGVDb3VudCA9IDA7XG4gIH0gLy8gSWYgbGF5b3V0IHdvcmsgd2FzIHNjaGVkdWxlZCwgZmx1c2ggaXQgbm93LlxuXG5cbiAgZmx1c2hTeW5jQ2FsbGJhY2tzKCk7XG5cbiAge1xuICAgIG1hcmtDb21taXRTdG9wcGVkKCk7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gZmx1c2hQYXNzaXZlRWZmZWN0cygpIHtcbiAgLy8gUmV0dXJucyB3aGV0aGVyIHBhc3NpdmUgZWZmZWN0cyB3ZXJlIGZsdXNoZWQuXG4gIC8vIFRPRE86IENvbWJpbmUgdGhpcyBjaGVjayB3aXRoIHRoZSBvbmUgaW4gZmx1c2hQYXNzaXZlRUZmZWN0c0ltcGwuIFdlIHNob3VsZFxuICAvLyBwcm9iYWJseSBqdXN0IGNvbWJpbmUgdGhlIHR3byBmdW5jdGlvbnMuIEkgYmVsaWV2ZSB0aGV5IHdlcmUgb25seSBzZXBhcmF0ZVxuICAvLyBpbiB0aGUgZmlyc3QgcGxhY2UgYmVjYXVzZSB3ZSB1c2VkIHRvIHdyYXAgaXQgd2l0aFxuICAvLyBgU2NoZWR1bGVyLnJ1bldpdGhQcmlvcml0eWAsIHdoaWNoIGFjY2VwdHMgYSBmdW5jdGlvbi4gQnV0IG5vdyB3ZSB0cmFjayB0aGVcbiAgLy8gcHJpb3JpdHkgd2l0aGluIFJlYWN0IGl0c2VsZiwgc28gd2UgY2FuIG11dGF0ZSB0aGUgdmFyaWFibGUgZGlyZWN0bHkuXG4gIGlmIChyb290V2l0aFBlbmRpbmdQYXNzaXZlRWZmZWN0cyAhPT0gbnVsbCkge1xuICAgIHZhciByZW5kZXJQcmlvcml0eSA9IGxhbmVzVG9FdmVudFByaW9yaXR5KHBlbmRpbmdQYXNzaXZlRWZmZWN0c0xhbmVzKTtcbiAgICB2YXIgcHJpb3JpdHkgPSBsb3dlckV2ZW50UHJpb3JpdHkoRGVmYXVsdEV2ZW50UHJpb3JpdHksIHJlbmRlclByaW9yaXR5KTtcbiAgICB2YXIgcHJldlRyYW5zaXRpb24gPSBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQyLnRyYW5zaXRpb247XG4gICAgdmFyIHByZXZpb3VzUHJpb3JpdHkgPSBnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoKTtcblxuICAgIHRyeSB7XG4gICAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQyLnRyYW5zaXRpb24gPSBudWxsO1xuICAgICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KHByaW9yaXR5KTtcbiAgICAgIHJldHVybiBmbHVzaFBhc3NpdmVFZmZlY3RzSW1wbCgpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkocHJldmlvdXNQcmlvcml0eSk7XG4gICAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQyLnRyYW5zaXRpb24gPSBwcmV2VHJhbnNpdGlvbjsgLy8gT25jZSBwYXNzaXZlIGVmZmVjdHMgaGF2ZSBydW4gZm9yIHRoZSB0cmVlIC0gZ2l2aW5nIGNvbXBvbmVudHMgYVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGVucXVldWVQZW5kaW5nUGFzc2l2ZVByb2ZpbGVyRWZmZWN0KGZpYmVyKSB7XG4gIHtcbiAgICBwZW5kaW5nUGFzc2l2ZVByb2ZpbGVyRWZmZWN0cy5wdXNoKGZpYmVyKTtcblxuICAgIGlmICghcm9vdERvZXNIYXZlUGFzc2l2ZUVmZmVjdHMpIHtcbiAgICAgIHJvb3REb2VzSGF2ZVBhc3NpdmVFZmZlY3RzID0gdHJ1ZTtcbiAgICAgIHNjaGVkdWxlQ2FsbGJhY2skMShOb3JtYWxQcmlvcml0eSwgZnVuY3Rpb24gKCkge1xuICAgICAgICBmbHVzaFBhc3NpdmVFZmZlY3RzKCk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGZsdXNoUGFzc2l2ZUVmZmVjdHNJbXBsKCkge1xuICBpZiAocm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gLy8gQ2FjaGUgYW5kIGNsZWFyIHRoZSB0cmFuc2l0aW9ucyBmbGFnXG5cblxuICB2YXIgdHJhbnNpdGlvbnMgPSBwZW5kaW5nUGFzc2l2ZVRyYW5zaXRpb25zO1xuICBwZW5kaW5nUGFzc2l2ZVRyYW5zaXRpb25zID0gbnVsbDtcbiAgdmFyIHJvb3QgPSByb290V2l0aFBlbmRpbmdQYXNzaXZlRWZmZWN0cztcbiAgdmFyIGxhbmVzID0gcGVuZGluZ1Bhc3NpdmVFZmZlY3RzTGFuZXM7XG4gIHJvb3RXaXRoUGVuZGluZ1Bhc3NpdmVFZmZlY3RzID0gbnVsbDsgLy8gVE9ETzogVGhpcyBpcyBzb21ldGltZXMgb3V0IG9mIHN5bmMgd2l0aCByb290V2l0aFBlbmRpbmdQYXNzaXZlRWZmZWN0cy5cbiAgLy8gRmlndXJlIG91dCB3aHkgYW5kIGZpeCBpdC4gSXQncyBub3QgY2F1c2luZyBhbnkga25vd24gaXNzdWVzIChwcm9iYWJseVxuICAvLyBiZWNhdXNlIGl0J3Mgb25seSB1c2VkIGZvciBwcm9maWxpbmcpLCBidXQgaXQncyBhIHJlZmFjdG9yIGhhemFyZC5cblxuICBwZW5kaW5nUGFzc2l2ZUVmZmVjdHNMYW5lcyA9IE5vTGFuZXM7XG5cbiAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgKFJlbmRlckNvbnRleHQgfCBDb21taXRDb250ZXh0KSkgIT09IE5vQ29udGV4dCkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGZsdXNoIHBhc3NpdmUgZWZmZWN0cyB3aGlsZSBhbHJlYWR5IHJlbmRlcmluZy4nKTtcbiAgfVxuXG4gIHtcbiAgICBpc0ZsdXNoaW5nUGFzc2l2ZUVmZmVjdHMgPSB0cnVlO1xuICAgIGRpZFNjaGVkdWxlVXBkYXRlRHVyaW5nUGFzc2l2ZUVmZmVjdHMgPSBmYWxzZTtcbiAgfVxuXG4gIHtcbiAgICBtYXJrUGFzc2l2ZUVmZmVjdHNTdGFydGVkKGxhbmVzKTtcbiAgfVxuXG4gIHZhciBwcmV2RXhlY3V0aW9uQ29udGV4dCA9IGV4ZWN1dGlvbkNvbnRleHQ7XG4gIGV4ZWN1dGlvbkNvbnRleHQgfD0gQ29tbWl0Q29udGV4dDtcbiAgY29tbWl0UGFzc2l2ZVVubW91bnRFZmZlY3RzKHJvb3QuY3VycmVudCk7XG4gIGNvbW1pdFBhc3NpdmVNb3VudEVmZmVjdHMocm9vdCwgcm9vdC5jdXJyZW50LCBsYW5lcywgdHJhbnNpdGlvbnMpOyAvLyBUT0RPOiBNb3ZlIHRvIGNvbW1pdFBhc3NpdmVNb3VudEVmZmVjdHNcblxuICB7XG4gICAgdmFyIHByb2ZpbGVyRWZmZWN0cyA9IHBlbmRpbmdQYXNzaXZlUHJvZmlsZXJFZmZlY3RzO1xuICAgIHBlbmRpbmdQYXNzaXZlUHJvZmlsZXJFZmZlY3RzID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb2ZpbGVyRWZmZWN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIF9maWJlciA9IHByb2ZpbGVyRWZmZWN0c1tpXTtcbiAgICAgIGNvbW1pdFBhc3NpdmVFZmZlY3REdXJhdGlvbnMocm9vdCwgX2ZpYmVyKTtcbiAgICB9XG4gIH1cblxuICB7XG4gICAgbWFya1Bhc3NpdmVFZmZlY3RzU3RvcHBlZCgpO1xuICB9XG5cbiAge1xuICAgIGNvbW1pdERvdWJsZUludm9rZUVmZmVjdHNJbkRFVihyb290LmN1cnJlbnQsIHRydWUpO1xuICB9XG5cbiAgZXhlY3V0aW9uQ29udGV4dCA9IHByZXZFeGVjdXRpb25Db250ZXh0O1xuICBmbHVzaFN5bmNDYWxsYmFja3MoKTtcblxuICB7XG4gICAgLy8gSWYgYWRkaXRpb25hbCBwYXNzaXZlIGVmZmVjdHMgd2VyZSBzY2hlZHVsZWQsIGluY3JlbWVudCBhIGNvdW50ZXIuIElmIHRoaXNcbiAgICAvLyBleGNlZWRzIHRoZSBsaW1pdCwgd2UnbGwgZmlyZSBhIHdhcm5pbmcuXG4gICAgaWYgKGRpZFNjaGVkdWxlVXBkYXRlRHVyaW5nUGFzc2l2ZUVmZmVjdHMpIHtcbiAgICAgIGlmIChyb290ID09PSByb290V2l0aFBhc3NpdmVOZXN0ZWRVcGRhdGVzKSB7XG4gICAgICAgIG5lc3RlZFBhc3NpdmVVcGRhdGVDb3VudCsrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmVzdGVkUGFzc2l2ZVVwZGF0ZUNvdW50ID0gMDtcbiAgICAgICAgcm9vdFdpdGhQYXNzaXZlTmVzdGVkVXBkYXRlcyA9IHJvb3Q7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG5lc3RlZFBhc3NpdmVVcGRhdGVDb3VudCA9IDA7XG4gICAgfVxuXG4gICAgaXNGbHVzaGluZ1Bhc3NpdmVFZmZlY3RzID0gZmFsc2U7XG4gICAgZGlkU2NoZWR1bGVVcGRhdGVEdXJpbmdQYXNzaXZlRWZmZWN0cyA9IGZhbHNlO1xuICB9IC8vIFRPRE86IE1vdmUgdG8gY29tbWl0UGFzc2l2ZU1vdW50RWZmZWN0c1xuXG5cbiAgb25Qb3N0Q29tbWl0Um9vdChyb290KTtcblxuICB7XG4gICAgdmFyIHN0YXRlTm9kZSA9IHJvb3QuY3VycmVudC5zdGF0ZU5vZGU7XG4gICAgc3RhdGVOb2RlLmVmZmVjdER1cmF0aW9uID0gMDtcbiAgICBzdGF0ZU5vZGUucGFzc2l2ZUVmZmVjdER1cmF0aW9uID0gMDtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBpc0FscmVhZHlGYWlsZWRMZWdhY3lFcnJvckJvdW5kYXJ5KGluc3RhbmNlKSB7XG4gIHJldHVybiBsZWdhY3lFcnJvckJvdW5kYXJpZXNUaGF0QWxyZWFkeUZhaWxlZCAhPT0gbnVsbCAmJiBsZWdhY3lFcnJvckJvdW5kYXJpZXNUaGF0QWxyZWFkeUZhaWxlZC5oYXMoaW5zdGFuY2UpO1xufVxuZnVuY3Rpb24gbWFya0xlZ2FjeUVycm9yQm91bmRhcnlBc0ZhaWxlZChpbnN0YW5jZSkge1xuICBpZiAobGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQgPT09IG51bGwpIHtcbiAgICBsZWdhY3lFcnJvckJvdW5kYXJpZXNUaGF0QWxyZWFkeUZhaWxlZCA9IG5ldyBTZXQoW2luc3RhbmNlXSk7XG4gIH0gZWxzZSB7XG4gICAgbGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQuYWRkKGluc3RhbmNlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcmVwYXJlVG9UaHJvd1VuY2F1Z2h0RXJyb3IoZXJyb3IpIHtcbiAgaWYgKCFoYXNVbmNhdWdodEVycm9yKSB7XG4gICAgaGFzVW5jYXVnaHRFcnJvciA9IHRydWU7XG4gICAgZmlyc3RVbmNhdWdodEVycm9yID0gZXJyb3I7XG4gIH1cbn1cblxudmFyIG9uVW5jYXVnaHRFcnJvciA9IHByZXBhcmVUb1Rocm93VW5jYXVnaHRFcnJvcjtcblxuZnVuY3Rpb24gY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3JPblJvb3Qocm9vdEZpYmVyLCBzb3VyY2VGaWJlciwgZXJyb3IpIHtcbiAgdmFyIGVycm9ySW5mbyA9IGNyZWF0ZUNhcHR1cmVkVmFsdWVBdEZpYmVyKGVycm9yLCBzb3VyY2VGaWJlcik7XG4gIHZhciB1cGRhdGUgPSBjcmVhdGVSb290RXJyb3JVcGRhdGUocm9vdEZpYmVyLCBlcnJvckluZm8sIFN5bmNMYW5lKTtcbiAgdmFyIHJvb3QgPSBlbnF1ZXVlVXBkYXRlKHJvb3RGaWJlciwgdXBkYXRlLCBTeW5jTGFuZSk7XG4gIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG5cbiAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICBtYXJrUm9vdFVwZGF0ZWQocm9vdCwgU3luY0xhbmUsIGV2ZW50VGltZSk7XG4gICAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIGV2ZW50VGltZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3Ioc291cmNlRmliZXIsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGVycm9yJDEpIHtcbiAge1xuICAgIHJlcG9ydFVuY2F1Z2h0RXJyb3JJbkRFVihlcnJvciQxKTtcbiAgICBzZXRJc1J1bm5pbmdJbnNlcnRpb25FZmZlY3QoZmFsc2UpO1xuICB9XG5cbiAgaWYgKHNvdXJjZUZpYmVyLnRhZyA9PT0gSG9zdFJvb3QpIHtcbiAgICAvLyBFcnJvciB3YXMgdGhyb3duIGF0IHRoZSByb290LiBUaGVyZSBpcyBubyBwYXJlbnQsIHNvIHRoZSByb290XG4gICAgLy8gaXRzZWxmIHNob3VsZCBjYXB0dXJlIGl0LlxuICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yT25Sb290KHNvdXJjZUZpYmVyLCBzb3VyY2VGaWJlciwgZXJyb3IkMSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGZpYmVyID0gbnVsbDtcblxuICB7XG4gICAgZmliZXIgPSBuZWFyZXN0TW91bnRlZEFuY2VzdG9yO1xuICB9XG5cbiAgd2hpbGUgKGZpYmVyICE9PSBudWxsKSB7XG4gICAgaWYgKGZpYmVyLnRhZyA9PT0gSG9zdFJvb3QpIHtcbiAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yT25Sb290KGZpYmVyLCBzb3VyY2VGaWJlciwgZXJyb3IkMSk7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIGlmIChmaWJlci50YWcgPT09IENsYXNzQ29tcG9uZW50KSB7XG4gICAgICB2YXIgY3RvciA9IGZpYmVyLnR5cGU7XG4gICAgICB2YXIgaW5zdGFuY2UgPSBmaWJlci5zdGF0ZU5vZGU7XG5cbiAgICAgIGlmICh0eXBlb2YgY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZENhdGNoID09PSAnZnVuY3Rpb24nICYmICFpc0FscmVhZHlGYWlsZWRMZWdhY3lFcnJvckJvdW5kYXJ5KGluc3RhbmNlKSkge1xuICAgICAgICB2YXIgZXJyb3JJbmZvID0gY3JlYXRlQ2FwdHVyZWRWYWx1ZUF0RmliZXIoZXJyb3IkMSwgc291cmNlRmliZXIpO1xuICAgICAgICB2YXIgdXBkYXRlID0gY3JlYXRlQ2xhc3NFcnJvclVwZGF0ZShmaWJlciwgZXJyb3JJbmZvLCBTeW5jTGFuZSk7XG4gICAgICAgIHZhciByb290ID0gZW5xdWV1ZVVwZGF0ZShmaWJlciwgdXBkYXRlLCBTeW5jTGFuZSk7XG4gICAgICAgIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG5cbiAgICAgICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgICAgICBtYXJrUm9vdFVwZGF0ZWQocm9vdCwgU3luY0xhbmUsIGV2ZW50VGltZSk7XG4gICAgICAgICAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIGV2ZW50VGltZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgZmliZXIgPSBmaWJlci5yZXR1cm47XG4gIH1cblxuICB7XG4gICAgLy8gVE9ETzogVW50aWwgd2UgcmUtbGFuZCBza2lwVW5tb3VudGVkQm91bmRhcmllcyAoc2VlICMyMDE0NyksIHRoaXMgd2FybmluZ1xuICAgIC8vIHdpbGwgZmlyZSBmb3IgZXJyb3JzIHRoYXQgYXJlIHRocm93biBieSBkZXN0cm95IGZ1bmN0aW9ucyBpbnNpZGUgZGVsZXRlZFxuICAgIC8vIHRyZWVzLiBXaGF0IGl0IHNob3VsZCBpbnN0ZWFkIGRvIGlzIHByb3BhZ2F0ZSB0aGUgZXJyb3IgdG8gdGhlIHBhcmVudCBvZlxuICAgIC8vIHRoZSBkZWxldGVkIHRyZWUuIEluIHRoZSBtZWFudGltZSwgZG8gbm90IGFkZCB0aGlzIHdhcm5pbmcgdG8gdGhlXG4gICAgLy8gYWxsb3dsaXN0OyB0aGlzIGlzIG9ubHkgZm9yIG91ciBpbnRlcm5hbCB1c2UuXG4gICAgZXJyb3IoJ0ludGVybmFsIFJlYWN0IGVycm9yOiBBdHRlbXB0ZWQgdG8gY2FwdHVyZSBhIGNvbW1pdCBwaGFzZSBlcnJvciAnICsgJ2luc2lkZSBhIGRldGFjaGVkIHRyZWUuIFRoaXMgaW5kaWNhdGVzIGEgYnVnIGluIFJlYWN0LiBMaWtlbHkgJyArICdjYXVzZXMgaW5jbHVkZSBkZWxldGluZyB0aGUgc2FtZSBmaWJlciBtb3JlIHRoYW4gb25jZSwgY29tbWl0dGluZyBhbiAnICsgJ2FscmVhZHktZmluaXNoZWQgdHJlZSwgb3IgYW4gaW5jb25zaXN0ZW50IHJldHVybiBwb2ludGVyLlxcblxcbicgKyAnRXJyb3IgbWVzc2FnZTpcXG5cXG4lcycsIGVycm9yJDEpO1xuICB9XG59XG5mdW5jdGlvbiBwaW5nU3VzcGVuZGVkUm9vdChyb290LCB3YWtlYWJsZSwgcGluZ2VkTGFuZXMpIHtcbiAgdmFyIHBpbmdDYWNoZSA9IHJvb3QucGluZ0NhY2hlO1xuXG4gIGlmIChwaW5nQ2FjaGUgIT09IG51bGwpIHtcbiAgICAvLyBUaGUgd2FrZWFibGUgcmVzb2x2ZWQsIHNvIHdlIG5vIGxvbmdlciBuZWVkIHRvIG1lbW9pemUsIGJlY2F1c2UgaXQgd2lsbFxuICAgIC8vIG5ldmVyIGJlIHRocm93biBhZ2Fpbi5cbiAgICBwaW5nQ2FjaGUuZGVsZXRlKHdha2VhYmxlKTtcbiAgfVxuXG4gIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gIG1hcmtSb290UGluZ2VkKHJvb3QsIHBpbmdlZExhbmVzKTtcbiAgd2FybklmU3VzcGVuc2VSZXNvbHV0aW9uTm90V3JhcHBlZFdpdGhBY3RERVYocm9vdCk7XG5cbiAgaWYgKHdvcmtJblByb2dyZXNzUm9vdCA9PT0gcm9vdCAmJiBpc1N1YnNldE9mTGFuZXMod29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMsIHBpbmdlZExhbmVzKSkge1xuICAgIC8vIFJlY2VpdmVkIGEgcGluZyBhdCB0aGUgc2FtZSBwcmlvcml0eSBsZXZlbCBhdCB3aGljaCB3ZSdyZSBjdXJyZW50bHlcbiAgICAvLyByZW5kZXJpbmcuIFdlIG1pZ2h0IHdhbnQgdG8gcmVzdGFydCB0aGlzIHJlbmRlci4gVGhpcyBzaG91bGQgbWlycm9yXG4gICAgLy8gdGhlIGxvZ2ljIG9mIHdoZXRoZXIgb3Igbm90IGEgcm9vdCBzdXNwZW5kcyBvbmNlIGl0IGNvbXBsZXRlcy5cbiAgICAvLyBUT0RPOiBJZiB3ZSdyZSByZW5kZXJpbmcgc3luYyBlaXRoZXIgZHVlIHRvIFN5bmMsIEJhdGNoZWQgb3IgZXhwaXJlZCxcbiAgICAvLyB3ZSBzaG91bGQgcHJvYmFibHkgbmV2ZXIgcmVzdGFydC5cbiAgICAvLyBJZiB3ZSdyZSBzdXNwZW5kZWQgd2l0aCBkZWxheSwgb3IgaWYgaXQncyBhIHJldHJ5LCB3ZSdsbCBhbHdheXMgc3VzcGVuZFxuICAgIC8vIHNvIHdlIGNhbiBhbHdheXMgcmVzdGFydC5cbiAgICBpZiAod29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdFN1c3BlbmRlZFdpdGhEZWxheSB8fCB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID09PSBSb290U3VzcGVuZGVkICYmIGluY2x1ZGVzT25seVJldHJpZXMod29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMpICYmIG5vdygpIC0gZ2xvYmFsTW9zdFJlY2VudEZhbGxiYWNrVGltZSA8IEZBTExCQUNLX1RIUk9UVExFX01TKSB7XG4gICAgICAvLyBSZXN0YXJ0IGZyb20gdGhlIHJvb3QuXG4gICAgICBwcmVwYXJlRnJlc2hTdGFjayhyb290LCBOb0xhbmVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRXZlbiB0aG91Z2ggd2UgY2FuJ3QgcmVzdGFydCByaWdodCBub3csIHdlIG1pZ2h0IGdldCBhblxuICAgICAgLy8gb3Bwb3J0dW5pdHkgbGF0ZXIuIFNvIHdlIG1hcmsgdGhpcyByZW5kZXIgYXMgaGF2aW5nIGEgcGluZy5cbiAgICAgIHdvcmtJblByb2dyZXNzUm9vdFBpbmdlZExhbmVzID0gbWVyZ2VMYW5lcyh3b3JrSW5Qcm9ncmVzc1Jvb3RQaW5nZWRMYW5lcywgcGluZ2VkTGFuZXMpO1xuICAgIH1cbiAgfVxuXG4gIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBldmVudFRpbWUpO1xufVxuXG5mdW5jdGlvbiByZXRyeVRpbWVkT3V0Qm91bmRhcnkoYm91bmRhcnlGaWJlciwgcmV0cnlMYW5lKSB7XG4gIC8vIFRoZSBib3VuZGFyeSBmaWJlciAoYSBTdXNwZW5zZSBjb21wb25lbnQgb3IgU3VzcGVuc2VMaXN0IGNvbXBvbmVudClcbiAgLy8gcHJldmlvdXNseSB3YXMgcmVuZGVyZWQgaW4gaXRzIGZhbGxiYWNrIHN0YXRlLiBPbmUgb2YgdGhlIHByb21pc2VzIHRoYXRcbiAgLy8gc3VzcGVuZGVkIGl0IGhhcyByZXNvbHZlZCwgd2hpY2ggbWVhbnMgYXQgbGVhc3QgcGFydCBvZiB0aGUgdHJlZSB3YXNcbiAgLy8gbGlrZWx5IHVuYmxvY2tlZC4gVHJ5IHJlbmRlcmluZyBhZ2FpbiwgYXQgYSBuZXcgbGFuZXMuXG4gIGlmIChyZXRyeUxhbmUgPT09IE5vTGFuZSkge1xuICAgIC8vIFRPRE86IEFzc2lnbiB0aGlzIHRvIGBzdXNwZW5zZVN0YXRlLnJldHJ5TGFuZWA/IHRvIGF2b2lkXG4gICAgLy8gdW5uZWNlc3NhcnkgZW50YW5nbGVtZW50P1xuICAgIHJldHJ5TGFuZSA9IHJlcXVlc3RSZXRyeUxhbmUoYm91bmRhcnlGaWJlcik7XG4gIH0gLy8gVE9ETzogU3BlY2lhbCBjYXNlIGlkbGUgcHJpb3JpdHk/XG5cblxuICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuICB2YXIgcm9vdCA9IGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShib3VuZGFyeUZpYmVyLCByZXRyeUxhbmUpO1xuXG4gIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgbWFya1Jvb3RVcGRhdGVkKHJvb3QsIHJldHJ5TGFuZSwgZXZlbnRUaW1lKTtcbiAgICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgZXZlbnRUaW1lKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXRyeURlaHlkcmF0ZWRTdXNwZW5zZUJvdW5kYXJ5KGJvdW5kYXJ5RmliZXIpIHtcbiAgdmFyIHN1c3BlbnNlU3RhdGUgPSBib3VuZGFyeUZpYmVyLm1lbW9pemVkU3RhdGU7XG4gIHZhciByZXRyeUxhbmUgPSBOb0xhbmU7XG5cbiAgaWYgKHN1c3BlbnNlU3RhdGUgIT09IG51bGwpIHtcbiAgICByZXRyeUxhbmUgPSBzdXNwZW5zZVN0YXRlLnJldHJ5TGFuZTtcbiAgfVxuXG4gIHJldHJ5VGltZWRPdXRCb3VuZGFyeShib3VuZGFyeUZpYmVyLCByZXRyeUxhbmUpO1xufVxuZnVuY3Rpb24gcmVzb2x2ZVJldHJ5V2FrZWFibGUoYm91bmRhcnlGaWJlciwgd2FrZWFibGUpIHtcbiAgdmFyIHJldHJ5TGFuZSA9IE5vTGFuZTsgLy8gRGVmYXVsdFxuXG4gIHZhciByZXRyeUNhY2hlO1xuXG4gIHN3aXRjaCAoYm91bmRhcnlGaWJlci50YWcpIHtcbiAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAgcmV0cnlDYWNoZSA9IGJvdW5kYXJ5RmliZXIuc3RhdGVOb2RlO1xuICAgICAgdmFyIHN1c3BlbnNlU3RhdGUgPSBib3VuZGFyeUZpYmVyLm1lbW9pemVkU3RhdGU7XG5cbiAgICAgIGlmIChzdXNwZW5zZVN0YXRlICE9PSBudWxsKSB7XG4gICAgICAgIHJldHJ5TGFuZSA9IHN1c3BlbnNlU3RhdGUucmV0cnlMYW5lO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcblxuICAgIGNhc2UgU3VzcGVuc2VMaXN0Q29tcG9uZW50OlxuICAgICAgcmV0cnlDYWNoZSA9IGJvdW5kYXJ5RmliZXIuc3RhdGVOb2RlO1xuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQaW5nZWQgdW5rbm93biBzdXNwZW5zZSBib3VuZGFyeSB0eXBlLiAnICsgJ1RoaXMgaXMgcHJvYmFibHkgYSBidWcgaW4gUmVhY3QuJyk7XG4gIH1cblxuICBpZiAocmV0cnlDYWNoZSAhPT0gbnVsbCkge1xuICAgIC8vIFRoZSB3YWtlYWJsZSByZXNvbHZlZCwgc28gd2Ugbm8gbG9uZ2VyIG5lZWQgdG8gbWVtb2l6ZSwgYmVjYXVzZSBpdCB3aWxsXG4gICAgLy8gbmV2ZXIgYmUgdGhyb3duIGFnYWluLlxuICAgIHJldHJ5Q2FjaGUuZGVsZXRlKHdha2VhYmxlKTtcbiAgfVxuXG4gIHJldHJ5VGltZWRPdXRCb3VuZGFyeShib3VuZGFyeUZpYmVyLCByZXRyeUxhbmUpO1xufSAvLyBDb21wdXRlcyB0aGUgbmV4dCBKdXN0IE5vdGljZWFibGUgRGlmZmVyZW5jZSAoSk5EKSBib3VuZGFyeS5cbi8vIFRoZSB0aGVvcnkgaXMgdGhhdCBhIHBlcnNvbiBjYW4ndCB0ZWxsIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gc21hbGwgZGlmZmVyZW5jZXMgaW4gdGltZS5cbi8vIFRoZXJlZm9yZSwgaWYgd2Ugd2FpdCBhIGJpdCBsb25nZXIgdGhhbiBuZWNlc3NhcnkgdGhhdCB3b24ndCB0cmFuc2xhdGUgdG8gYSBub3RpY2VhYmxlXG4vLyBkaWZmZXJlbmNlIGluIHRoZSBleHBlcmllbmNlLiBIb3dldmVyLCB3YWl0aW5nIGZvciBsb25nZXIgbWlnaHQgbWVhbiB0aGF0IHdlIGNhbiBhdm9pZFxuLy8gc2hvd2luZyBhbiBpbnRlcm1lZGlhdGUgbG9hZGluZyBzdGF0ZS4gVGhlIGxvbmdlciB3ZSBoYXZlIGFscmVhZHkgd2FpdGVkLCB0aGUgaGFyZGVyIGl0XG4vLyBpcyB0byB0ZWxsIHNtYWxsIGRpZmZlcmVuY2VzIGluIHRpbWUuIFRoZXJlZm9yZSwgdGhlIGxvbmdlciB3ZSd2ZSBhbHJlYWR5IHdhaXRlZCxcbi8vIHRoZSBsb25nZXIgd2UgY2FuIHdhaXQgYWRkaXRpb25hbGx5LiBBdCBzb21lIHBvaW50IHdlIGhhdmUgdG8gZ2l2ZSB1cCB0aG91Z2guXG4vLyBXZSBwaWNrIGEgdHJhaW4gbW9kZWwgd2hlcmUgdGhlIG5leHQgYm91bmRhcnkgY29tbWl0cyBhdCBhIGNvbnNpc3RlbnQgc2NoZWR1bGUuXG4vLyBUaGVzZSBwYXJ0aWN1bGFyIG51bWJlcnMgYXJlIHZhZ3VlIGVzdGltYXRlcy4gV2UgZXhwZWN0IHRvIGFkanVzdCB0aGVtIGJhc2VkIG9uIHJlc2VhcmNoLlxuXG5mdW5jdGlvbiBqbmQodGltZUVsYXBzZWQpIHtcbiAgcmV0dXJuIHRpbWVFbGFwc2VkIDwgMTIwID8gMTIwIDogdGltZUVsYXBzZWQgPCA0ODAgPyA0ODAgOiB0aW1lRWxhcHNlZCA8IDEwODAgPyAxMDgwIDogdGltZUVsYXBzZWQgPCAxOTIwID8gMTkyMCA6IHRpbWVFbGFwc2VkIDwgMzAwMCA/IDMwMDAgOiB0aW1lRWxhcHNlZCA8IDQzMjAgPyA0MzIwIDogY2VpbCh0aW1lRWxhcHNlZCAvIDE5NjApICogMTk2MDtcbn1cblxuZnVuY3Rpb24gY2hlY2tGb3JOZXN0ZWRVcGRhdGVzKCkge1xuICBpZiAobmVzdGVkVXBkYXRlQ291bnQgPiBORVNURURfVVBEQVRFX0xJTUlUKSB7XG4gICAgbmVzdGVkVXBkYXRlQ291bnQgPSAwO1xuICAgIHJvb3RXaXRoTmVzdGVkVXBkYXRlcyA9IG51bGw7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNYXhpbXVtIHVwZGF0ZSBkZXB0aCBleGNlZWRlZC4gVGhpcyBjYW4gaGFwcGVuIHdoZW4gYSBjb21wb25lbnQgJyArICdyZXBlYXRlZGx5IGNhbGxzIHNldFN0YXRlIGluc2lkZSBjb21wb25lbnRXaWxsVXBkYXRlIG9yICcgKyAnY29tcG9uZW50RGlkVXBkYXRlLiBSZWFjdCBsaW1pdHMgdGhlIG51bWJlciBvZiBuZXN0ZWQgdXBkYXRlcyB0byAnICsgJ3ByZXZlbnQgaW5maW5pdGUgbG9vcHMuJyk7XG4gIH1cblxuICB7XG4gICAgaWYgKG5lc3RlZFBhc3NpdmVVcGRhdGVDb3VudCA+IE5FU1RFRF9QQVNTSVZFX1VQREFURV9MSU1JVCkge1xuICAgICAgbmVzdGVkUGFzc2l2ZVVwZGF0ZUNvdW50ID0gMDtcbiAgICAgIHJvb3RXaXRoUGFzc2l2ZU5lc3RlZFVwZGF0ZXMgPSBudWxsO1xuXG4gICAgICBlcnJvcignTWF4aW11bSB1cGRhdGUgZGVwdGggZXhjZWVkZWQuIFRoaXMgY2FuIGhhcHBlbiB3aGVuIGEgY29tcG9uZW50ICcgKyBcImNhbGxzIHNldFN0YXRlIGluc2lkZSB1c2VFZmZlY3QsIGJ1dCB1c2VFZmZlY3QgZWl0aGVyIGRvZXNuJ3QgXCIgKyAnaGF2ZSBhIGRlcGVuZGVuY3kgYXJyYXksIG9yIG9uZSBvZiB0aGUgZGVwZW5kZW5jaWVzIGNoYW5nZXMgb24gJyArICdldmVyeSByZW5kZXIuJyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGZsdXNoUmVuZGVyUGhhc2VTdHJpY3RNb2RlV2FybmluZ3NJbkRFVigpIHtcbiAge1xuICAgIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLmZsdXNoTGVnYWN5Q29udGV4dFdhcm5pbmcoKTtcblxuICAgIHtcbiAgICAgIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLmZsdXNoUGVuZGluZ1Vuc2FmZUxpZmVjeWNsZVdhcm5pbmdzKCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdERvdWJsZUludm9rZUVmZmVjdHNJbkRFVihmaWJlciwgaGFzUGFzc2l2ZUVmZmVjdHMpIHtcbiAge1xuICAgIC8vIFRPRE8gKFN0cmljdEVmZmVjdHMpIFNob3VsZCB3ZSBzZXQgYSBtYXJrZXIgb24gdGhlIHJvb3QgaWYgaXQgY29udGFpbnMgc3RyaWN0IGVmZmVjdHNcbiAgICAvLyBzbyB3ZSBkb24ndCB0cmF2ZXJzZSB1bm5lY2Vzc2FyaWx5PyBzaW1pbGFyIHRvIHN1YnRyZWVGbGFncyBidXQganVzdCBhdCB0aGUgcm9vdCBsZXZlbC5cbiAgICAvLyBNYXliZSBub3QgYSBiaWcgZGVhbCBzaW5jZSB0aGlzIGlzIERFViBvbmx5IGJlaGF2aW9yLlxuICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG4gICAgaW52b2tlRWZmZWN0c0luRGV2KGZpYmVyLCBNb3VudExheW91dERldiwgaW52b2tlTGF5b3V0RWZmZWN0VW5tb3VudEluREVWKTtcblxuICAgIGlmIChoYXNQYXNzaXZlRWZmZWN0cykge1xuICAgICAgaW52b2tlRWZmZWN0c0luRGV2KGZpYmVyLCBNb3VudFBhc3NpdmVEZXYsIGludm9rZVBhc3NpdmVFZmZlY3RVbm1vdW50SW5ERVYpO1xuICAgIH1cblxuICAgIGludm9rZUVmZmVjdHNJbkRldihmaWJlciwgTW91bnRMYXlvdXREZXYsIGludm9rZUxheW91dEVmZmVjdE1vdW50SW5ERVYpO1xuXG4gICAgaWYgKGhhc1Bhc3NpdmVFZmZlY3RzKSB7XG4gICAgICBpbnZva2VFZmZlY3RzSW5EZXYoZmliZXIsIE1vdW50UGFzc2l2ZURldiwgaW52b2tlUGFzc2l2ZUVmZmVjdE1vdW50SW5ERVYpO1xuICAgIH1cblxuICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW52b2tlRWZmZWN0c0luRGV2KGZpcnN0Q2hpbGQsIGZpYmVyRmxhZ3MsIGludm9rZUVmZmVjdEZuKSB7XG4gIHtcbiAgICAvLyBXZSBkb24ndCBuZWVkIHRvIHJlLWNoZWNrIFN0cmljdEVmZmVjdHNNb2RlIGhlcmUuXG4gICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBpZiB0aGF0IGNoZWNrIGhhcyBhbHJlYWR5IHBhc3NlZC5cbiAgICB2YXIgY3VycmVudCA9IGZpcnN0Q2hpbGQ7XG4gICAgdmFyIHN1YnRyZWVSb290ID0gbnVsbDtcblxuICAgIHdoaWxlIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICB2YXIgcHJpbWFyeVN1YnRyZWVGbGFnID0gY3VycmVudC5zdWJ0cmVlRmxhZ3MgJiBmaWJlckZsYWdzO1xuXG4gICAgICBpZiAoY3VycmVudCAhPT0gc3VidHJlZVJvb3QgJiYgY3VycmVudC5jaGlsZCAhPT0gbnVsbCAmJiBwcmltYXJ5U3VidHJlZUZsYWcgIT09IE5vRmxhZ3MpIHtcbiAgICAgICAgY3VycmVudCA9IGN1cnJlbnQuY2hpbGQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoKGN1cnJlbnQuZmxhZ3MgJiBmaWJlckZsYWdzKSAhPT0gTm9GbGFncykge1xuICAgICAgICAgIGludm9rZUVmZmVjdEZuKGN1cnJlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGN1cnJlbnQuc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnNpYmxpbmc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY3VycmVudCA9IHN1YnRyZWVSb290ID0gY3VycmVudC5yZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIGRpZFdhcm5TdGF0ZVVwZGF0ZUZvck5vdFlldE1vdW50ZWRDb21wb25lbnQgPSBudWxsO1xuZnVuY3Rpb24gd2FybkFib3V0VXBkYXRlT25Ob3RZZXRNb3VudGVkRmliZXJJbkRFVihmaWJlcikge1xuICB7XG4gICAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgUmVuZGVyQ29udGV4dCkgIT09IE5vQ29udGV4dCkge1xuICAgICAgLy8gV2UgbGV0IHRoZSBvdGhlciB3YXJuaW5nIGFib3V0IHJlbmRlciBwaGFzZSB1cGRhdGVzIGRlYWwgd2l0aCB0aGlzIG9uZS5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIShmaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHRhZyA9IGZpYmVyLnRhZztcblxuICAgIGlmICh0YWcgIT09IEluZGV0ZXJtaW5hdGVDb21wb25lbnQgJiYgdGFnICE9PSBIb3N0Um9vdCAmJiB0YWcgIT09IENsYXNzQ29tcG9uZW50ICYmIHRhZyAhPT0gRnVuY3Rpb25Db21wb25lbnQgJiYgdGFnICE9PSBGb3J3YXJkUmVmICYmIHRhZyAhPT0gTWVtb0NvbXBvbmVudCAmJiB0YWcgIT09IFNpbXBsZU1lbW9Db21wb25lbnQpIHtcbiAgICAgIC8vIE9ubHkgd2FybiBmb3IgdXNlci1kZWZpbmVkIGNvbXBvbmVudHMsIG5vdCBpbnRlcm5hbCBvbmVzIGxpa2UgU3VzcGVuc2UuXG4gICAgICByZXR1cm47XG4gICAgfSAvLyBXZSBzaG93IHRoZSB3aG9sZSBzdGFjayBidXQgZGVkdXBlIG9uIHRoZSB0b3AgY29tcG9uZW50J3MgbmFtZSBiZWNhdXNlXG4gICAgLy8gdGhlIHByb2JsZW1hdGljIGNvZGUgYWxtb3N0IGFsd2F5cyBsaWVzIGluc2lkZSB0aGF0IGNvbXBvbmVudC5cblxuXG4gICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnUmVhY3RDb21wb25lbnQnO1xuXG4gICAgaWYgKGRpZFdhcm5TdGF0ZVVwZGF0ZUZvck5vdFlldE1vdW50ZWRDb21wb25lbnQgIT09IG51bGwpIHtcbiAgICAgIGlmIChkaWRXYXJuU3RhdGVVcGRhdGVGb3JOb3RZZXRNb3VudGVkQ29tcG9uZW50Lmhhcyhjb21wb25lbnROYW1lKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGRpZFdhcm5TdGF0ZVVwZGF0ZUZvck5vdFlldE1vdW50ZWRDb21wb25lbnQuYWRkKGNvbXBvbmVudE5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkaWRXYXJuU3RhdGVVcGRhdGVGb3JOb3RZZXRNb3VudGVkQ29tcG9uZW50ID0gbmV3IFNldChbY29tcG9uZW50TmFtZV0pO1xuICAgIH1cblxuICAgIHZhciBwcmV2aW91c0ZpYmVyID0gY3VycmVudDtcblxuICAgIHRyeSB7XG4gICAgICBzZXRDdXJyZW50RmliZXIoZmliZXIpO1xuXG4gICAgICBlcnJvcihcIkNhbid0IHBlcmZvcm0gYSBSZWFjdCBzdGF0ZSB1cGRhdGUgb24gYSBjb21wb25lbnQgdGhhdCBoYXNuJ3QgbW91bnRlZCB5ZXQuIFwiICsgJ1RoaXMgaW5kaWNhdGVzIHRoYXQgeW91IGhhdmUgYSBzaWRlLWVmZmVjdCBpbiB5b3VyIHJlbmRlciBmdW5jdGlvbiB0aGF0ICcgKyAnYXN5bmNocm9ub3VzbHkgbGF0ZXIgY2FsbHMgdHJpZXMgdG8gdXBkYXRlIHRoZSBjb21wb25lbnQuIE1vdmUgdGhpcyB3b3JrIHRvICcgKyAndXNlRWZmZWN0IGluc3RlYWQuJyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChwcmV2aW91c0ZpYmVyKSB7XG4gICAgICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxudmFyIGJlZ2luV29yayQxO1xuXG57XG4gIHZhciBkdW1teUZpYmVyID0gbnVsbDtcblxuICBiZWdpbldvcmskMSA9IGZ1bmN0aW9uIChjdXJyZW50LCB1bml0T2ZXb3JrLCBsYW5lcykge1xuICAgIC8vIElmIGEgY29tcG9uZW50IHRocm93cyBhbiBlcnJvciwgd2UgcmVwbGF5IGl0IGFnYWluIGluIGEgc3luY2hyb25vdXNseVxuICAgIC8vIGRpc3BhdGNoZWQgZXZlbnQsIHNvIHRoYXQgdGhlIGRlYnVnZ2VyIHdpbGwgdHJlYXQgaXQgYXMgYW4gdW5jYXVnaHRcbiAgICAvLyBlcnJvciBTZWUgUmVhY3RFcnJvclV0aWxzIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgIC8vIEJlZm9yZSBlbnRlcmluZyB0aGUgYmVnaW4gcGhhc2UsIGNvcHkgdGhlIHdvcmstaW4tcHJvZ3Jlc3Mgb250byBhIGR1bW15XG4gICAgLy8gZmliZXIuIElmIGJlZ2luV29yayB0aHJvd3MsIHdlJ2xsIHVzZSB0aGlzIHRvIHJlc2V0IHRoZSBzdGF0ZS5cbiAgICB2YXIgb3JpZ2luYWxXb3JrSW5Qcm9ncmVzc0NvcHkgPSBhc3NpZ25GaWJlclByb3BlcnRpZXNJbkRFVihkdW1teUZpYmVyLCB1bml0T2ZXb3JrKTtcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYmVnaW5Xb3JrKGN1cnJlbnQsIHVuaXRPZldvcmssIGxhbmVzKTtcbiAgICB9IGNhdGNoIChvcmlnaW5hbEVycm9yKSB7XG4gICAgICBpZiAoZGlkU3VzcGVuZE9yRXJyb3JXaGlsZUh5ZHJhdGluZ0RFVigpIHx8IG9yaWdpbmFsRXJyb3IgIT09IG51bGwgJiYgdHlwZW9mIG9yaWdpbmFsRXJyb3IgPT09ICdvYmplY3QnICYmIHR5cGVvZiBvcmlnaW5hbEVycm9yLnRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gRG9uJ3QgcmVwbGF5IHByb21pc2VzLlxuICAgICAgICAvLyBEb24ndCByZXBsYXkgZXJyb3JzIGlmIHdlIGFyZSBoeWRyYXRpbmcgYW5kIGhhdmUgYWxyZWFkeSBzdXNwZW5kZWQgb3IgaGFuZGxlZCBhbiBlcnJvclxuICAgICAgICB0aHJvdyBvcmlnaW5hbEVycm9yO1xuICAgICAgfSAvLyBLZWVwIHRoaXMgY29kZSBpbiBzeW5jIHdpdGggaGFuZGxlRXJyb3I7IGFueSBjaGFuZ2VzIGhlcmUgbXVzdCBoYXZlXG4gICAgICAvLyBjb3JyZXNwb25kaW5nIGNoYW5nZXMgdGhlcmUuXG5cblxuICAgICAgcmVzZXRDb250ZXh0RGVwZW5kZW5jaWVzKCk7XG4gICAgICByZXNldEhvb2tzQWZ0ZXJUaHJvdygpOyAvLyBEb24ndCByZXNldCBjdXJyZW50IGRlYnVnIGZpYmVyLCBzaW5jZSB3ZSdyZSBhYm91dCB0byB3b3JrIG9uIHRoZVxuICAgICAgLy8gc2FtZSBmaWJlciBhZ2Fpbi5cbiAgICAgIC8vIFVud2luZCB0aGUgZmFpbGVkIHN0YWNrIGZyYW1lXG5cbiAgICAgIHVud2luZEludGVycnVwdGVkV29yayhjdXJyZW50LCB1bml0T2ZXb3JrKTsgLy8gUmVzdG9yZSB0aGUgb3JpZ2luYWwgcHJvcGVydGllcyBvZiB0aGUgZmliZXIuXG5cbiAgICAgIGFzc2lnbkZpYmVyUHJvcGVydGllc0luREVWKHVuaXRPZldvcmssIG9yaWdpbmFsV29ya0luUHJvZ3Jlc3NDb3B5KTtcblxuICAgICAgaWYgKCB1bml0T2ZXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAvLyBSZXNldCB0aGUgcHJvZmlsZXIgdGltZXIuXG4gICAgICAgIHN0YXJ0UHJvZmlsZXJUaW1lcih1bml0T2ZXb3JrKTtcbiAgICAgIH0gLy8gUnVuIGJlZ2luV29yayBhZ2Fpbi5cblxuXG4gICAgICBpbnZva2VHdWFyZGVkQ2FsbGJhY2sobnVsbCwgYmVnaW5Xb3JrLCBudWxsLCBjdXJyZW50LCB1bml0T2ZXb3JrLCBsYW5lcyk7XG5cbiAgICAgIGlmIChoYXNDYXVnaHRFcnJvcigpKSB7XG4gICAgICAgIHZhciByZXBsYXlFcnJvciA9IGNsZWFyQ2F1Z2h0RXJyb3IoKTtcblxuICAgICAgICBpZiAodHlwZW9mIHJlcGxheUVycm9yID09PSAnb2JqZWN0JyAmJiByZXBsYXlFcnJvciAhPT0gbnVsbCAmJiByZXBsYXlFcnJvci5fc3VwcHJlc3NMb2dnaW5nICYmIHR5cGVvZiBvcmlnaW5hbEVycm9yID09PSAnb2JqZWN0JyAmJiBvcmlnaW5hbEVycm9yICE9PSBudWxsICYmICFvcmlnaW5hbEVycm9yLl9zdXBwcmVzc0xvZ2dpbmcpIHtcbiAgICAgICAgICAvLyBJZiBzdXBwcmVzc2VkLCBsZXQgdGhlIGZsYWcgY2Fycnkgb3ZlciB0byB0aGUgb3JpZ2luYWwgZXJyb3Igd2hpY2ggaXMgdGhlIG9uZSB3ZSdsbCByZXRocm93LlxuICAgICAgICAgIG9yaWdpbmFsRXJyb3IuX3N1cHByZXNzTG9nZ2luZyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gV2UgYWx3YXlzIHRocm93IHRoZSBvcmlnaW5hbCBlcnJvciBpbiBjYXNlIHRoZSBzZWNvbmQgcmVuZGVyIHBhc3MgaXMgbm90IGlkZW1wb3RlbnQuXG4gICAgICAvLyBUaGlzIGNhbiBoYXBwZW4gaWYgYSBtZW1vaXplZCBmdW5jdGlvbiBvciBDb21tb25KUyBtb2R1bGUgZG9lc24ndCB0aHJvdyBhZnRlciBmaXJzdCBpbnZvY2F0aW9uLlxuXG5cbiAgICAgIHRocm93IG9yaWdpbmFsRXJyb3I7XG4gICAgfVxuICB9O1xufVxuXG52YXIgZGlkV2FybkFib3V0VXBkYXRlSW5SZW5kZXIgPSBmYWxzZTtcbnZhciBkaWRXYXJuQWJvdXRVcGRhdGVJblJlbmRlckZvckFub3RoZXJDb21wb25lbnQ7XG5cbntcbiAgZGlkV2FybkFib3V0VXBkYXRlSW5SZW5kZXJGb3JBbm90aGVyQ29tcG9uZW50ID0gbmV3IFNldCgpO1xufVxuXG5mdW5jdGlvbiB3YXJuQWJvdXRSZW5kZXJQaGFzZVVwZGF0ZXNJbkRFVihmaWJlcikge1xuICB7XG4gICAgaWYgKGlzUmVuZGVyaW5nICYmICFnZXRJc1VwZGF0aW5nT3BhcXVlVmFsdWVJblJlbmRlclBoYXNlSW5ERVYoKSkge1xuICAgICAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIHJlbmRlcmluZ0NvbXBvbmVudE5hbWUgPSB3b3JrSW5Qcm9ncmVzcyAmJiBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKHdvcmtJblByb2dyZXNzKSB8fCAnVW5rbm93bic7IC8vIERlZHVwZSBieSB0aGUgcmVuZGVyaW5nIGNvbXBvbmVudCBiZWNhdXNlIGl0J3MgdGhlIG9uZSB0aGF0IG5lZWRzIHRvIGJlIGZpeGVkLlxuXG4gICAgICAgICAgICB2YXIgZGVkdXBlS2V5ID0gcmVuZGVyaW5nQ29tcG9uZW50TmFtZTtcblxuICAgICAgICAgICAgaWYgKCFkaWRXYXJuQWJvdXRVcGRhdGVJblJlbmRlckZvckFub3RoZXJDb21wb25lbnQuaGFzKGRlZHVwZUtleSkpIHtcbiAgICAgICAgICAgICAgZGlkV2FybkFib3V0VXBkYXRlSW5SZW5kZXJGb3JBbm90aGVyQ29tcG9uZW50LmFkZChkZWR1cGVLZXkpO1xuICAgICAgICAgICAgICB2YXIgc2V0U3RhdGVDb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgJ1Vua25vd24nO1xuXG4gICAgICAgICAgICAgIGVycm9yKCdDYW5ub3QgdXBkYXRlIGEgY29tcG9uZW50IChgJXNgKSB3aGlsZSByZW5kZXJpbmcgYSAnICsgJ2RpZmZlcmVudCBjb21wb25lbnQgKGAlc2ApLiBUbyBsb2NhdGUgdGhlIGJhZCBzZXRTdGF0ZSgpIGNhbGwgaW5zaWRlIGAlc2AsICcgKyAnZm9sbG93IHRoZSBzdGFjayB0cmFjZSBhcyBkZXNjcmliZWQgaW4gaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3NldHN0YXRlLWluLXJlbmRlcicsIHNldFN0YXRlQ29tcG9uZW50TmFtZSwgcmVuZGVyaW5nQ29tcG9uZW50TmFtZSwgcmVuZGVyaW5nQ29tcG9uZW50TmFtZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmICghZGlkV2FybkFib3V0VXBkYXRlSW5SZW5kZXIpIHtcbiAgICAgICAgICAgICAgZXJyb3IoJ0Nhbm5vdCB1cGRhdGUgZHVyaW5nIGFuIGV4aXN0aW5nIHN0YXRlIHRyYW5zaXRpb24gKHN1Y2ggYXMgJyArICd3aXRoaW4gYHJlbmRlcmApLiBSZW5kZXIgbWV0aG9kcyBzaG91bGQgYmUgYSBwdXJlICcgKyAnZnVuY3Rpb24gb2YgcHJvcHMgYW5kIHN0YXRlLicpO1xuXG4gICAgICAgICAgICAgIGRpZFdhcm5BYm91dFVwZGF0ZUluUmVuZGVyID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiByZXN0b3JlUGVuZGluZ1VwZGF0ZXJzKHJvb3QsIGxhbmVzKSB7XG4gIHtcbiAgICBpZiAoaXNEZXZUb29sc1ByZXNlbnQpIHtcbiAgICAgIHZhciBtZW1vaXplZFVwZGF0ZXJzID0gcm9vdC5tZW1vaXplZFVwZGF0ZXJzO1xuICAgICAgbWVtb2l6ZWRVcGRhdGVycy5mb3JFYWNoKGZ1bmN0aW9uIChzY2hlZHVsaW5nRmliZXIpIHtcbiAgICAgICAgYWRkRmliZXJUb0xhbmVzTWFwKHJvb3QsIHNjaGVkdWxpbmdGaWJlciwgbGFuZXMpO1xuICAgICAgfSk7IC8vIFRoaXMgZnVuY3Rpb24gaW50ZW50aW9uYWxseSBkb2VzIG5vdCBjbGVhciBtZW1vaXplZCB1cGRhdGVycy5cbiAgICAgIC8vIFRob3NlIG1heSBzdGlsbCBiZSByZWxldmFudCB0byB0aGUgY3VycmVudCBjb21taXRcbiAgICAgIC8vIGFuZCBhIGZ1dHVyZSBvbmUgKGUuZy4gU3VzcGVuc2UpLlxuICAgIH1cbiAgfVxufVxudmFyIGZha2VBY3RDYWxsYmFja05vZGUgPSB7fTtcblxuZnVuY3Rpb24gc2NoZWR1bGVDYWxsYmFjayQxKHByaW9yaXR5TGV2ZWwsIGNhbGxiYWNrKSB7XG4gIHtcbiAgICAvLyBJZiB3ZSdyZSBjdXJyZW50bHkgaW5zaWRlIGFuIGBhY3RgIHNjb3BlLCBieXBhc3MgU2NoZWR1bGVyIGFuZCBwdXNoIHRvXG4gICAgLy8gdGhlIGBhY3RgIHF1ZXVlIGluc3RlYWQuXG4gICAgdmFyIGFjdFF1ZXVlID0gUmVhY3RDdXJyZW50QWN0UXVldWUkMS5jdXJyZW50O1xuXG4gICAgaWYgKGFjdFF1ZXVlICE9PSBudWxsKSB7XG4gICAgICBhY3RRdWV1ZS5wdXNoKGNhbGxiYWNrKTtcbiAgICAgIHJldHVybiBmYWtlQWN0Q2FsbGJhY2tOb2RlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gc2NoZWR1bGVDYWxsYmFjayhwcmlvcml0eUxldmVsLCBjYWxsYmFjayk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNhbmNlbENhbGxiYWNrJDEoY2FsbGJhY2tOb2RlKSB7XG4gIGlmICggY2FsbGJhY2tOb2RlID09PSBmYWtlQWN0Q2FsbGJhY2tOb2RlKSB7XG4gICAgcmV0dXJuO1xuICB9IC8vIEluIHByb2R1Y3Rpb24sIGFsd2F5cyBjYWxsIFNjaGVkdWxlci4gVGhpcyBmdW5jdGlvbiB3aWxsIGJlIHN0cmlwcGVkIG91dC5cblxuXG4gIHJldHVybiBjYW5jZWxDYWxsYmFjayhjYWxsYmFja05vZGUpO1xufVxuXG5mdW5jdGlvbiBzaG91bGRGb3JjZUZsdXNoRmFsbGJhY2tzSW5ERVYoKSB7XG4gIC8vIE5ldmVyIGZvcmNlIGZsdXNoIGluIHByb2R1Y3Rpb24uIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGdldCBzdHJpcHBlZCBvdXQuXG4gIHJldHVybiAgUmVhY3RDdXJyZW50QWN0UXVldWUkMS5jdXJyZW50ICE9PSBudWxsO1xufVxuXG5mdW5jdGlvbiB3YXJuSWZVcGRhdGVzTm90V3JhcHBlZFdpdGhBY3RERVYoZmliZXIpIHtcbiAge1xuICAgIGlmIChmaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpIHtcbiAgICAgIGlmICghaXNDb25jdXJyZW50QWN0RW52aXJvbm1lbnQoKSkge1xuICAgICAgICAvLyBOb3QgaW4gYW4gYWN0IGVudmlyb25tZW50LiBObyBuZWVkIHRvIHdhcm4uXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTGVnYWN5IG1vZGUgaGFzIGFkZGl0aW9uYWwgY2FzZXMgd2hlcmUgd2Ugc3VwcHJlc3MgYSB3YXJuaW5nLlxuICAgICAgaWYgKCFpc0xlZ2FjeUFjdEVudmlyb25tZW50KCkpIHtcbiAgICAgICAgLy8gTm90IGluIGFuIGFjdCBlbnZpcm9ubWVudC4gTm8gbmVlZCB0byB3YXJuLlxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChleGVjdXRpb25Db250ZXh0ICE9PSBOb0NvbnRleHQpIHtcbiAgICAgICAgLy8gTGVnYWN5IG1vZGUgZG9lc24ndCB3YXJuIGlmIHRoZSB1cGRhdGUgaXMgYmF0Y2hlZCwgaS5lLlxuICAgICAgICAvLyBiYXRjaGVkVXBkYXRlcyBvciBmbHVzaFN5bmMuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGZpYmVyLnRhZyAhPT0gRnVuY3Rpb25Db21wb25lbnQgJiYgZmliZXIudGFnICE9PSBGb3J3YXJkUmVmICYmIGZpYmVyLnRhZyAhPT0gU2ltcGxlTWVtb0NvbXBvbmVudCkge1xuICAgICAgICAvLyBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBwcmUtaG9va3MgY29kZSwgbGVnYWN5IG1vZGUgb25seVxuICAgICAgICAvLyB3YXJucyBmb3IgdXBkYXRlcyB0aGF0IG9yaWdpbmF0ZSBmcm9tIGEgaG9vay5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChSZWFjdEN1cnJlbnRBY3RRdWV1ZSQxLmN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAgIHZhciBwcmV2aW91c0ZpYmVyID0gY3VycmVudDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgc2V0Q3VycmVudEZpYmVyKGZpYmVyKTtcblxuICAgICAgICBlcnJvcignQW4gdXBkYXRlIHRvICVzIGluc2lkZSBhIHRlc3Qgd2FzIG5vdCB3cmFwcGVkIGluIGFjdCguLi4pLlxcblxcbicgKyAnV2hlbiB0ZXN0aW5nLCBjb2RlIHRoYXQgY2F1c2VzIFJlYWN0IHN0YXRlIHVwZGF0ZXMgc2hvdWxkIGJlICcgKyAnd3JhcHBlZCBpbnRvIGFjdCguLi4pOlxcblxcbicgKyAnYWN0KCgpID0+IHtcXG4nICsgJyAgLyogZmlyZSBldmVudHMgdGhhdCB1cGRhdGUgc3RhdGUgKi9cXG4nICsgJ30pO1xcbicgKyAnLyogYXNzZXJ0IG9uIHRoZSBvdXRwdXQgKi9cXG5cXG4nICsgXCJUaGlzIGVuc3VyZXMgdGhhdCB5b3UncmUgdGVzdGluZyB0aGUgYmVoYXZpb3IgdGhlIHVzZXIgd291bGQgc2VlIFwiICsgJ2luIHRoZSBicm93c2VyLicgKyAnIExlYXJuIG1vcmUgYXQgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3dyYXAtdGVzdHMtd2l0aC1hY3QnLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAocHJldmlvdXNGaWJlcikge1xuICAgICAgICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB3YXJuSWZTdXNwZW5zZVJlc29sdXRpb25Ob3RXcmFwcGVkV2l0aEFjdERFVihyb290KSB7XG4gIHtcbiAgICBpZiAocm9vdC50YWcgIT09IExlZ2FjeVJvb3QgJiYgaXNDb25jdXJyZW50QWN0RW52aXJvbm1lbnQoKSAmJiBSZWFjdEN1cnJlbnRBY3RRdWV1ZSQxLmN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAgIGVycm9yKCdBIHN1c3BlbmRlZCByZXNvdXJjZSBmaW5pc2hlZCBsb2FkaW5nIGluc2lkZSBhIHRlc3QsIGJ1dCB0aGUgZXZlbnQgJyArICd3YXMgbm90IHdyYXBwZWQgaW4gYWN0KC4uLikuXFxuXFxuJyArICdXaGVuIHRlc3RpbmcsIGNvZGUgdGhhdCByZXNvbHZlcyBzdXNwZW5kZWQgZGF0YSBzaG91bGQgYmUgd3JhcHBlZCAnICsgJ2ludG8gYWN0KC4uLik6XFxuXFxuJyArICdhY3QoKCkgPT4ge1xcbicgKyAnICAvKiBmaW5pc2ggbG9hZGluZyBzdXNwZW5kZWQgZGF0YSAqL1xcbicgKyAnfSk7XFxuJyArICcvKiBhc3NlcnQgb24gdGhlIG91dHB1dCAqL1xcblxcbicgKyBcIlRoaXMgZW5zdXJlcyB0aGF0IHlvdSdyZSB0ZXN0aW5nIHRoZSBiZWhhdmlvciB0aGUgdXNlciB3b3VsZCBzZWUgXCIgKyAnaW4gdGhlIGJyb3dzZXIuJyArICcgTGVhcm4gbW9yZSBhdCBodHRwczovL3JlYWN0anMub3JnL2xpbmsvd3JhcC10ZXN0cy13aXRoLWFjdCcpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzZXRJc1J1bm5pbmdJbnNlcnRpb25FZmZlY3QoaXNSdW5uaW5nKSB7XG4gIHtcbiAgICBpc1J1bm5pbmdJbnNlcnRpb25FZmZlY3QgPSBpc1J1bm5pbmc7XG4gIH1cbn1cblxuLyogZXNsaW50LWRpc2FibGUgcmVhY3QtaW50ZXJuYWwvcHJvZC1lcnJvci1jb2RlcyAqL1xudmFyIHJlc29sdmVGYW1pbHkgPSBudWxsOyAvLyAkRmxvd0ZpeE1lIEZsb3cgZ2V0cyBjb25mdXNlZCBieSBhIFdlYWtTZXQgZmVhdHVyZSBjaGVjayBiZWxvdy5cblxudmFyIGZhaWxlZEJvdW5kYXJpZXMgPSBudWxsO1xudmFyIHNldFJlZnJlc2hIYW5kbGVyID0gZnVuY3Rpb24gKGhhbmRsZXIpIHtcbiAge1xuICAgIHJlc29sdmVGYW1pbHkgPSBoYW5kbGVyO1xuICB9XG59O1xuZnVuY3Rpb24gcmVzb2x2ZUZ1bmN0aW9uRm9ySG90UmVsb2FkaW5nKHR5cGUpIHtcbiAge1xuICAgIGlmIChyZXNvbHZlRmFtaWx5ID09PSBudWxsKSB7XG4gICAgICAvLyBIb3QgcmVsb2FkaW5nIGlzIGRpc2FibGVkLlxuICAgICAgcmV0dXJuIHR5cGU7XG4gICAgfVxuXG4gICAgdmFyIGZhbWlseSA9IHJlc29sdmVGYW1pbHkodHlwZSk7XG5cbiAgICBpZiAoZmFtaWx5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0eXBlO1xuICAgIH0gLy8gVXNlIHRoZSBsYXRlc3Qga25vd24gaW1wbGVtZW50YXRpb24uXG5cblxuICAgIHJldHVybiBmYW1pbHkuY3VycmVudDtcbiAgfVxufVxuZnVuY3Rpb24gcmVzb2x2ZUNsYXNzRm9ySG90UmVsb2FkaW5nKHR5cGUpIHtcbiAgLy8gTm8gaW1wbGVtZW50YXRpb24gZGlmZmVyZW5jZXMuXG4gIHJldHVybiByZXNvbHZlRnVuY3Rpb25Gb3JIb3RSZWxvYWRpbmcodHlwZSk7XG59XG5mdW5jdGlvbiByZXNvbHZlRm9yd2FyZFJlZkZvckhvdFJlbG9hZGluZyh0eXBlKSB7XG4gIHtcbiAgICBpZiAocmVzb2x2ZUZhbWlseSA9PT0gbnVsbCkge1xuICAgICAgLy8gSG90IHJlbG9hZGluZyBpcyBkaXNhYmxlZC5cbiAgICAgIHJldHVybiB0eXBlO1xuICAgIH1cblxuICAgIHZhciBmYW1pbHkgPSByZXNvbHZlRmFtaWx5KHR5cGUpO1xuXG4gICAgaWYgKGZhbWlseSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBDaGVjayBpZiB3ZSdyZSBkZWFsaW5nIHdpdGggYSByZWFsIGZvcndhcmRSZWYuIERvbid0IHdhbnQgdG8gY3Jhc2ggZWFybHkuXG4gICAgICBpZiAodHlwZSAhPT0gbnVsbCAmJiB0eXBlICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHR5cGUucmVuZGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIEZvcndhcmRSZWYgaXMgc3BlY2lhbCBiZWNhdXNlIGl0cyByZXNvbHZlZCAudHlwZSBpcyBhbiBvYmplY3QsXG4gICAgICAgIC8vIGJ1dCBpdCdzIHBvc3NpYmxlIHRoYXQgd2Ugb25seSBoYXZlIGl0cyBpbm5lciByZW5kZXIgZnVuY3Rpb24gaW4gdGhlIG1hcC5cbiAgICAgICAgLy8gSWYgdGhhdCBpbm5lciByZW5kZXIgZnVuY3Rpb24gaXMgZGlmZmVyZW50LCB3ZSdsbCBidWlsZCBhIG5ldyBmb3J3YXJkUmVmIHR5cGUuXG4gICAgICAgIHZhciBjdXJyZW50UmVuZGVyID0gcmVzb2x2ZUZ1bmN0aW9uRm9ySG90UmVsb2FkaW5nKHR5cGUucmVuZGVyKTtcblxuICAgICAgICBpZiAodHlwZS5yZW5kZXIgIT09IGN1cnJlbnRSZW5kZXIpIHtcbiAgICAgICAgICB2YXIgc3ludGhldGljVHlwZSA9IHtcbiAgICAgICAgICAgICQkdHlwZW9mOiBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFLFxuICAgICAgICAgICAgcmVuZGVyOiBjdXJyZW50UmVuZGVyXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGlmICh0eXBlLmRpc3BsYXlOYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHN5bnRoZXRpY1R5cGUuZGlzcGxheU5hbWUgPSB0eXBlLmRpc3BsYXlOYW1lO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBzeW50aGV0aWNUeXBlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0eXBlO1xuICAgIH0gLy8gVXNlIHRoZSBsYXRlc3Qga25vd24gaW1wbGVtZW50YXRpb24uXG5cblxuICAgIHJldHVybiBmYW1pbHkuY3VycmVudDtcbiAgfVxufVxuZnVuY3Rpb24gaXNDb21wYXRpYmxlRmFtaWx5Rm9ySG90UmVsb2FkaW5nKGZpYmVyLCBlbGVtZW50KSB7XG4gIHtcbiAgICBpZiAocmVzb2x2ZUZhbWlseSA9PT0gbnVsbCkge1xuICAgICAgLy8gSG90IHJlbG9hZGluZyBpcyBkaXNhYmxlZC5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgcHJldlR5cGUgPSBmaWJlci5lbGVtZW50VHlwZTtcbiAgICB2YXIgbmV4dFR5cGUgPSBlbGVtZW50LnR5cGU7IC8vIElmIHdlIGdvdCBoZXJlLCB3ZSBrbm93IHR5cGVzIGFyZW4ndCA9PT0gZXF1YWwuXG5cbiAgICB2YXIgbmVlZHNDb21wYXJlRmFtaWxpZXMgPSBmYWxzZTtcbiAgICB2YXIgJCR0eXBlb2ZOZXh0VHlwZSA9IHR5cGVvZiBuZXh0VHlwZSA9PT0gJ29iamVjdCcgJiYgbmV4dFR5cGUgIT09IG51bGwgPyBuZXh0VHlwZS4kJHR5cGVvZiA6IG51bGw7XG5cbiAgICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIGlmICh0eXBlb2YgbmV4dFR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIG5lZWRzQ29tcGFyZUZhbWlsaWVzID0gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBuZXh0VHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgbmVlZHNDb21wYXJlRmFtaWxpZXMgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoJCR0eXBlb2ZOZXh0VHlwZSA9PT0gUkVBQ1RfTEFaWV9UWVBFKSB7XG4gICAgICAgICAgICAvLyBXZSBkb24ndCBrbm93IHRoZSBpbm5lciB0eXBlIHlldC5cbiAgICAgICAgICAgIC8vIFdlJ3JlIGdvaW5nIHRvIGFzc3VtZSB0aGF0IHRoZSBsYXp5IGlubmVyIHR5cGUgaXMgc3RhYmxlLFxuICAgICAgICAgICAgLy8gYW5kIHNvIGl0IGlzIHN1ZmZpY2llbnQgdG8gYXZvaWQgcmVjb25jaWxpbmcgaXQgYXdheS5cbiAgICAgICAgICAgIC8vIFdlJ3JlIG5vdCBnb2luZyB0byB1bndyYXAgb3IgYWN0dWFsbHkgdXNlIHRoZSBuZXcgbGF6eSB0eXBlLlxuICAgICAgICAgICAgbmVlZHNDb21wYXJlRmFtaWxpZXMgPSB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgICAge1xuICAgICAgICAgIGlmICgkJHR5cGVvZk5leHRUeXBlID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFKSB7XG4gICAgICAgICAgICBuZWVkc0NvbXBhcmVGYW1pbGllcyA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIGlmICgkJHR5cGVvZk5leHRUeXBlID09PSBSRUFDVF9MQVpZX1RZUEUpIHtcbiAgICAgICAgICAgIG5lZWRzQ29tcGFyZUZhbWlsaWVzID0gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIE1lbW9Db21wb25lbnQ6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoJCR0eXBlb2ZOZXh0VHlwZSA9PT0gUkVBQ1RfTUVNT19UWVBFKSB7XG4gICAgICAgICAgICAvLyBUT0RPOiBpZiBpdCB3YXMgYnV0IGNhbiBubyBsb25nZXIgYmUgc2ltcGxlLFxuICAgICAgICAgICAgLy8gd2Ugc2hvdWxkbid0IHNldCB0aGlzLlxuICAgICAgICAgICAgbmVlZHNDb21wYXJlRmFtaWxpZXMgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoJCR0eXBlb2ZOZXh0VHlwZSA9PT0gUkVBQ1RfTEFaWV9UWVBFKSB7XG4gICAgICAgICAgICBuZWVkc0NvbXBhcmVGYW1pbGllcyA9IHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gLy8gQ2hlY2sgaWYgYm90aCB0eXBlcyBoYXZlIGEgZmFtaWx5IGFuZCBpdCdzIHRoZSBzYW1lIG9uZS5cblxuXG4gICAgaWYgKG5lZWRzQ29tcGFyZUZhbWlsaWVzKSB7XG4gICAgICAvLyBOb3RlOiBtZW1vKCkgYW5kIGZvcndhcmRSZWYoKSB3ZSdsbCBjb21wYXJlIG91dGVyIHJhdGhlciB0aGFuIGlubmVyIHR5cGUuXG4gICAgICAvLyBUaGlzIG1lYW5zIGJvdGggb2YgdGhlbSBuZWVkIHRvIGJlIHJlZ2lzdGVyZWQgdG8gcHJlc2VydmUgc3RhdGUuXG4gICAgICAvLyBJZiB3ZSB1bndyYXBwZWQgYW5kIGNvbXBhcmVkIHRoZSBpbm5lciB0eXBlcyBmb3Igd3JhcHBlcnMgaW5zdGVhZCxcbiAgICAgIC8vIHRoZW4gd2Ugd291bGQgcmlzayBmYWxzZWx5IHNheWluZyB0d28gc2VwYXJhdGUgbWVtbyhGb28pXG4gICAgICAvLyBjYWxscyBhcmUgZXF1aXZhbGVudCBiZWNhdXNlIHRoZXkgd3JhcCB0aGUgc2FtZSBGb28gZnVuY3Rpb24uXG4gICAgICB2YXIgcHJldkZhbWlseSA9IHJlc29sdmVGYW1pbHkocHJldlR5cGUpO1xuXG4gICAgICBpZiAocHJldkZhbWlseSAhPT0gdW5kZWZpbmVkICYmIHByZXZGYW1pbHkgPT09IHJlc29sdmVGYW1pbHkobmV4dFR5cGUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gbWFya0ZhaWxlZEVycm9yQm91bmRhcnlGb3JIb3RSZWxvYWRpbmcoZmliZXIpIHtcbiAge1xuICAgIGlmIChyZXNvbHZlRmFtaWx5ID09PSBudWxsKSB7XG4gICAgICAvLyBIb3QgcmVsb2FkaW5nIGlzIGRpc2FibGVkLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgV2Vha1NldCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChmYWlsZWRCb3VuZGFyaWVzID09PSBudWxsKSB7XG4gICAgICBmYWlsZWRCb3VuZGFyaWVzID0gbmV3IFdlYWtTZXQoKTtcbiAgICB9XG5cbiAgICBmYWlsZWRCb3VuZGFyaWVzLmFkZChmaWJlcik7XG4gIH1cbn1cbnZhciBzY2hlZHVsZVJlZnJlc2ggPSBmdW5jdGlvbiAocm9vdCwgdXBkYXRlKSB7XG4gIHtcbiAgICBpZiAocmVzb2x2ZUZhbWlseSA9PT0gbnVsbCkge1xuICAgICAgLy8gSG90IHJlbG9hZGluZyBpcyBkaXNhYmxlZC5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgc3RhbGVGYW1pbGllcyA9IHVwZGF0ZS5zdGFsZUZhbWlsaWVzLFxuICAgICAgICB1cGRhdGVkRmFtaWxpZXMgPSB1cGRhdGUudXBkYXRlZEZhbWlsaWVzO1xuICAgIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTtcbiAgICBmbHVzaFN5bmMoZnVuY3Rpb24gKCkge1xuICAgICAgc2NoZWR1bGVGaWJlcnNXaXRoRmFtaWxpZXNSZWN1cnNpdmVseShyb290LmN1cnJlbnQsIHVwZGF0ZWRGYW1pbGllcywgc3RhbGVGYW1pbGllcyk7XG4gICAgfSk7XG4gIH1cbn07XG52YXIgc2NoZWR1bGVSb290ID0gZnVuY3Rpb24gKHJvb3QsIGVsZW1lbnQpIHtcbiAge1xuICAgIGlmIChyb290LmNvbnRleHQgIT09IGVtcHR5Q29udGV4dE9iamVjdCkge1xuICAgICAgLy8gU3VwZXIgZWRnZSBjYXNlOiByb290IGhhcyBhIGxlZ2FjeSBfcmVuZGVyU3VidHJlZSBjb250ZXh0XG4gICAgICAvLyBidXQgd2UgZG9uJ3Qga25vdyB0aGUgcGFyZW50Q29tcG9uZW50IHNvIHdlIGNhbid0IHBhc3MgaXQuXG4gICAgICAvLyBKdXN0IGlnbm9yZS4gV2UnbGwgZGVsZXRlIHRoaXMgd2l0aCBfcmVuZGVyU3VidHJlZSBjb2RlIHBhdGggbGF0ZXIuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZmx1c2hQYXNzaXZlRWZmZWN0cygpO1xuICAgIGZsdXNoU3luYyhmdW5jdGlvbiAoKSB7XG4gICAgICB1cGRhdGVDb250YWluZXIoZWxlbWVudCwgcm9vdCwgbnVsbCwgbnVsbCk7XG4gICAgfSk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIHNjaGVkdWxlRmliZXJzV2l0aEZhbWlsaWVzUmVjdXJzaXZlbHkoZmliZXIsIHVwZGF0ZWRGYW1pbGllcywgc3RhbGVGYW1pbGllcykge1xuICB7XG4gICAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZSxcbiAgICAgICAgY2hpbGQgPSBmaWJlci5jaGlsZCxcbiAgICAgICAgc2libGluZyA9IGZpYmVyLnNpYmxpbmcsXG4gICAgICAgIHRhZyA9IGZpYmVyLnRhZyxcbiAgICAgICAgdHlwZSA9IGZpYmVyLnR5cGU7XG4gICAgdmFyIGNhbmRpZGF0ZVR5cGUgPSBudWxsO1xuXG4gICAgc3dpdGNoICh0YWcpIHtcbiAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICBjYW5kaWRhdGVUeXBlID0gdHlwZTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgICAgY2FuZGlkYXRlVHlwZSA9IHR5cGUucmVuZGVyO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAocmVzb2x2ZUZhbWlseSA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCByZXNvbHZlRmFtaWx5IHRvIGJlIHNldCBkdXJpbmcgaG90IHJlbG9hZC4nKTtcbiAgICB9XG5cbiAgICB2YXIgbmVlZHNSZW5kZXIgPSBmYWxzZTtcbiAgICB2YXIgbmVlZHNSZW1vdW50ID0gZmFsc2U7XG5cbiAgICBpZiAoY2FuZGlkYXRlVHlwZSAhPT0gbnVsbCkge1xuICAgICAgdmFyIGZhbWlseSA9IHJlc29sdmVGYW1pbHkoY2FuZGlkYXRlVHlwZSk7XG5cbiAgICAgIGlmIChmYW1pbHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoc3RhbGVGYW1pbGllcy5oYXMoZmFtaWx5KSkge1xuICAgICAgICAgIG5lZWRzUmVtb3VudCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAodXBkYXRlZEZhbWlsaWVzLmhhcyhmYW1pbHkpKSB7XG4gICAgICAgICAgaWYgKHRhZyA9PT0gQ2xhc3NDb21wb25lbnQpIHtcbiAgICAgICAgICAgIG5lZWRzUmVtb3VudCA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5lZWRzUmVuZGVyID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZmFpbGVkQm91bmRhcmllcyAhPT0gbnVsbCkge1xuICAgICAgaWYgKGZhaWxlZEJvdW5kYXJpZXMuaGFzKGZpYmVyKSB8fCBhbHRlcm5hdGUgIT09IG51bGwgJiYgZmFpbGVkQm91bmRhcmllcy5oYXMoYWx0ZXJuYXRlKSkge1xuICAgICAgICBuZWVkc1JlbW91bnQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChuZWVkc1JlbW91bnQpIHtcbiAgICAgIGZpYmVyLl9kZWJ1Z05lZWRzUmVtb3VudCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKG5lZWRzUmVtb3VudCB8fCBuZWVkc1JlbmRlcikge1xuICAgICAgdmFyIF9yb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCBTeW5jTGFuZSk7XG5cbiAgICAgIGlmIChfcm9vdCAhPT0gbnVsbCkge1xuICAgICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIoX3Jvb3QsIGZpYmVyLCBTeW5jTGFuZSwgTm9UaW1lc3RhbXApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjaGlsZCAhPT0gbnVsbCAmJiAhbmVlZHNSZW1vdW50KSB7XG4gICAgICBzY2hlZHVsZUZpYmVyc1dpdGhGYW1pbGllc1JlY3Vyc2l2ZWx5KGNoaWxkLCB1cGRhdGVkRmFtaWxpZXMsIHN0YWxlRmFtaWxpZXMpO1xuICAgIH1cblxuICAgIGlmIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICBzY2hlZHVsZUZpYmVyc1dpdGhGYW1pbGllc1JlY3Vyc2l2ZWx5KHNpYmxpbmcsIHVwZGF0ZWRGYW1pbGllcywgc3RhbGVGYW1pbGllcyk7XG4gICAgfVxuICB9XG59XG5cbnZhciBmaW5kSG9zdEluc3RhbmNlc0ZvclJlZnJlc2ggPSBmdW5jdGlvbiAocm9vdCwgZmFtaWxpZXMpIHtcbiAge1xuICAgIHZhciBob3N0SW5zdGFuY2VzID0gbmV3IFNldCgpO1xuICAgIHZhciB0eXBlcyA9IG5ldyBTZXQoZmFtaWxpZXMubWFwKGZ1bmN0aW9uIChmYW1pbHkpIHtcbiAgICAgIHJldHVybiBmYW1pbHkuY3VycmVudDtcbiAgICB9KSk7XG4gICAgZmluZEhvc3RJbnN0YW5jZXNGb3JNYXRjaGluZ0ZpYmVyc1JlY3Vyc2l2ZWx5KHJvb3QuY3VycmVudCwgdHlwZXMsIGhvc3RJbnN0YW5jZXMpO1xuICAgIHJldHVybiBob3N0SW5zdGFuY2VzO1xuICB9XG59O1xuXG5mdW5jdGlvbiBmaW5kSG9zdEluc3RhbmNlc0Zvck1hdGNoaW5nRmliZXJzUmVjdXJzaXZlbHkoZmliZXIsIHR5cGVzLCBob3N0SW5zdGFuY2VzKSB7XG4gIHtcbiAgICB2YXIgY2hpbGQgPSBmaWJlci5jaGlsZCxcbiAgICAgICAgc2libGluZyA9IGZpYmVyLnNpYmxpbmcsXG4gICAgICAgIHRhZyA9IGZpYmVyLnRhZyxcbiAgICAgICAgdHlwZSA9IGZpYmVyLnR5cGU7XG4gICAgdmFyIGNhbmRpZGF0ZVR5cGUgPSBudWxsO1xuXG4gICAgc3dpdGNoICh0YWcpIHtcbiAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICBjYW5kaWRhdGVUeXBlID0gdHlwZTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgICAgY2FuZGlkYXRlVHlwZSA9IHR5cGUucmVuZGVyO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICB2YXIgZGlkTWF0Y2ggPSBmYWxzZTtcblxuICAgIGlmIChjYW5kaWRhdGVUeXBlICE9PSBudWxsKSB7XG4gICAgICBpZiAodHlwZXMuaGFzKGNhbmRpZGF0ZVR5cGUpKSB7XG4gICAgICAgIGRpZE1hdGNoID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZGlkTWF0Y2gpIHtcbiAgICAgIC8vIFdlIGhhdmUgYSBtYXRjaC4gVGhpcyBvbmx5IGRyaWxscyBkb3duIHRvIHRoZSBjbG9zZXN0IGhvc3QgY29tcG9uZW50cy5cbiAgICAgIC8vIFRoZXJlJ3Mgbm8gbmVlZCB0byBzZWFyY2ggZGVlcGVyIGJlY2F1c2UgZm9yIHRoZSBwdXJwb3NlIG9mIGdpdmluZ1xuICAgICAgLy8gdmlzdWFsIGZlZWRiYWNrLCBcImZsYXNoaW5nXCIgb3V0ZXJtb3N0IHBhcmVudCByZWN0YW5nbGVzIGlzIHN1ZmZpY2llbnQuXG4gICAgICBmaW5kSG9zdEluc3RhbmNlc0ZvckZpYmVyU2hhbGxvd2x5KGZpYmVyLCBob3N0SW5zdGFuY2VzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWYgdGhlcmUncyBubyBtYXRjaCwgbWF5YmUgdGhlcmUgd2lsbCBiZSBvbmUgZnVydGhlciBkb3duIGluIHRoZSBjaGlsZCB0cmVlLlxuICAgICAgaWYgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgIGZpbmRIb3N0SW5zdGFuY2VzRm9yTWF0Y2hpbmdGaWJlcnNSZWN1cnNpdmVseShjaGlsZCwgdHlwZXMsIGhvc3RJbnN0YW5jZXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICBmaW5kSG9zdEluc3RhbmNlc0Zvck1hdGNoaW5nRmliZXJzUmVjdXJzaXZlbHkoc2libGluZywgdHlwZXMsIGhvc3RJbnN0YW5jZXMpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kSG9zdEluc3RhbmNlc0ZvckZpYmVyU2hhbGxvd2x5KGZpYmVyLCBob3N0SW5zdGFuY2VzKSB7XG4gIHtcbiAgICB2YXIgZm91bmRIb3N0SW5zdGFuY2VzID0gZmluZENoaWxkSG9zdEluc3RhbmNlc0ZvckZpYmVyU2hhbGxvd2x5KGZpYmVyLCBob3N0SW5zdGFuY2VzKTtcblxuICAgIGlmIChmb3VuZEhvc3RJbnN0YW5jZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIElmIHdlIGRpZG4ndCBmaW5kIGFueSBob3N0IGNoaWxkcmVuLCBmYWxsYmFjayB0byBjbG9zZXN0IGhvc3QgcGFyZW50LlxuXG5cbiAgICB2YXIgbm9kZSA9IGZpYmVyO1xuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIHN3aXRjaCAobm9kZS50YWcpIHtcbiAgICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICAgIGhvc3RJbnN0YW5jZXMuYWRkKG5vZGUuc3RhdGVOb2RlKTtcbiAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAgICAgIGhvc3RJbnN0YW5jZXMuYWRkKG5vZGUuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pO1xuICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICAgIGhvc3RJbnN0YW5jZXMuYWRkKG5vZGUuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKG5vZGUucmV0dXJuID09PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdG8gcmVhY2ggcm9vdCBmaXJzdC4nKTtcbiAgICAgIH1cblxuICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kQ2hpbGRIb3N0SW5zdGFuY2VzRm9yRmliZXJTaGFsbG93bHkoZmliZXIsIGhvc3RJbnN0YW5jZXMpIHtcbiAge1xuICAgIHZhciBub2RlID0gZmliZXI7XG4gICAgdmFyIGZvdW5kSG9zdEluc3RhbmNlcyA9IGZhbHNlO1xuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGlmIChub2RlLnRhZyA9PT0gSG9zdENvbXBvbmVudCkge1xuICAgICAgICAvLyBXZSBnb3QgYSBtYXRjaC5cbiAgICAgICAgZm91bmRIb3N0SW5zdGFuY2VzID0gdHJ1ZTtcbiAgICAgICAgaG9zdEluc3RhbmNlcy5hZGQobm9kZS5zdGF0ZU5vZGUpOyAvLyBUaGVyZSBtYXkgc3RpbGwgYmUgbW9yZSwgc28ga2VlcCBzZWFyY2hpbmcuXG4gICAgICB9IGVsc2UgaWYgKG5vZGUuY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgbm9kZS5jaGlsZC5yZXR1cm4gPSBub2RlO1xuICAgICAgICBub2RlID0gbm9kZS5jaGlsZDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlID09PSBmaWJlcikge1xuICAgICAgICByZXR1cm4gZm91bmRIb3N0SW5zdGFuY2VzO1xuICAgICAgfVxuXG4gICAgICB3aGlsZSAobm9kZS5zaWJsaW5nID09PSBudWxsKSB7XG4gICAgICAgIGlmIChub2RlLnJldHVybiA9PT0gbnVsbCB8fCBub2RlLnJldHVybiA9PT0gZmliZXIpIHtcbiAgICAgICAgICByZXR1cm4gZm91bmRIb3N0SW5zdGFuY2VzO1xuICAgICAgICB9XG5cbiAgICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgICBub2RlID0gbm9kZS5zaWJsaW5nO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxudmFyIGhhc0JhZE1hcFBvbHlmaWxsO1xuXG57XG4gIGhhc0JhZE1hcFBvbHlmaWxsID0gZmFsc2U7XG5cbiAgdHJ5IHtcbiAgICB2YXIgbm9uRXh0ZW5zaWJsZU9iamVjdCA9IE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyh7fSk7XG4gICAgLyogZXNsaW50LWRpc2FibGUgbm8tbmV3ICovXG5cbiAgICBuZXcgTWFwKFtbbm9uRXh0ZW5zaWJsZU9iamVjdCwgbnVsbF1dKTtcbiAgICBuZXcgU2V0KFtub25FeHRlbnNpYmxlT2JqZWN0XSk7XG4gICAgLyogZXNsaW50LWVuYWJsZSBuby1uZXcgKi9cbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIFRPRE86IENvbnNpZGVyIHdhcm5pbmcgYWJvdXQgYmFkIHBvbHlmaWxsc1xuICAgIGhhc0JhZE1hcFBvbHlmaWxsID0gdHJ1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBGaWJlck5vZGUodGFnLCBwZW5kaW5nUHJvcHMsIGtleSwgbW9kZSkge1xuICAvLyBJbnN0YW5jZVxuICB0aGlzLnRhZyA9IHRhZztcbiAgdGhpcy5rZXkgPSBrZXk7XG4gIHRoaXMuZWxlbWVudFR5cGUgPSBudWxsO1xuICB0aGlzLnR5cGUgPSBudWxsO1xuICB0aGlzLnN0YXRlTm9kZSA9IG51bGw7IC8vIEZpYmVyXG5cbiAgdGhpcy5yZXR1cm4gPSBudWxsO1xuICB0aGlzLmNoaWxkID0gbnVsbDtcbiAgdGhpcy5zaWJsaW5nID0gbnVsbDtcbiAgdGhpcy5pbmRleCA9IDA7XG4gIHRoaXMucmVmID0gbnVsbDtcbiAgdGhpcy5wZW5kaW5nUHJvcHMgPSBwZW5kaW5nUHJvcHM7XG4gIHRoaXMubWVtb2l6ZWRQcm9wcyA9IG51bGw7XG4gIHRoaXMudXBkYXRlUXVldWUgPSBudWxsO1xuICB0aGlzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICB0aGlzLmRlcGVuZGVuY2llcyA9IG51bGw7XG4gIHRoaXMubW9kZSA9IG1vZGU7IC8vIEVmZmVjdHNcblxuICB0aGlzLmZsYWdzID0gTm9GbGFncztcbiAgdGhpcy5zdWJ0cmVlRmxhZ3MgPSBOb0ZsYWdzO1xuICB0aGlzLmRlbGV0aW9ucyA9IG51bGw7XG4gIHRoaXMubGFuZXMgPSBOb0xhbmVzO1xuICB0aGlzLmNoaWxkTGFuZXMgPSBOb0xhbmVzO1xuICB0aGlzLmFsdGVybmF0ZSA9IG51bGw7XG5cbiAge1xuICAgIC8vIE5vdGU6IFRoZSBmb2xsb3dpbmcgaXMgZG9uZSB0byBhdm9pZCBhIHY4IHBlcmZvcm1hbmNlIGNsaWZmLlxuICAgIC8vXG4gICAgLy8gSW5pdGlhbGl6aW5nIHRoZSBmaWVsZHMgYmVsb3cgdG8gc21pcyBhbmQgbGF0ZXIgdXBkYXRpbmcgdGhlbSB3aXRoXG4gICAgLy8gZG91YmxlIHZhbHVlcyB3aWxsIGNhdXNlIEZpYmVycyB0byBlbmQgdXAgaGF2aW5nIHNlcGFyYXRlIHNoYXBlcy5cbiAgICAvLyBUaGlzIGJlaGF2aW9yL2J1ZyBoYXMgc29tZXRoaW5nIHRvIGRvIHdpdGggT2JqZWN0LnByZXZlbnRFeHRlbnNpb24oKS5cbiAgICAvLyBGb3J0dW5hdGVseSB0aGlzIG9ubHkgaW1wYWN0cyBERVYgYnVpbGRzLlxuICAgIC8vIFVuZm9ydHVuYXRlbHkgaXQgbWFrZXMgUmVhY3QgdW51c2FibHkgc2xvdyBmb3Igc29tZSBhcHBsaWNhdGlvbnMuXG4gICAgLy8gVG8gd29yayBhcm91bmQgdGhpcywgaW5pdGlhbGl6ZSB0aGUgZmllbGRzIGJlbG93IHdpdGggZG91Ymxlcy5cbiAgICAvL1xuICAgIC8vIExlYXJuIG1vcmUgYWJvdXQgdGhpcyBoZXJlOlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTQzNjVcbiAgICAvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD04NTM4XG4gICAgdGhpcy5hY3R1YWxEdXJhdGlvbiA9IE51bWJlci5OYU47XG4gICAgdGhpcy5hY3R1YWxTdGFydFRpbWUgPSBOdW1iZXIuTmFOO1xuICAgIHRoaXMuc2VsZkJhc2VEdXJhdGlvbiA9IE51bWJlci5OYU47XG4gICAgdGhpcy50cmVlQmFzZUR1cmF0aW9uID0gTnVtYmVyLk5hTjsgLy8gSXQncyBva2F5IHRvIHJlcGxhY2UgdGhlIGluaXRpYWwgZG91YmxlcyB3aXRoIHNtaXMgYWZ0ZXIgaW5pdGlhbGl6YXRpb24uXG4gICAgLy8gVGhpcyB3b24ndCB0cmlnZ2VyIHRoZSBwZXJmb3JtYW5jZSBjbGlmZiBtZW50aW9uZWQgYWJvdmUsXG4gICAgLy8gYW5kIGl0IHNpbXBsaWZpZXMgb3RoZXIgcHJvZmlsZXIgY29kZSAoaW5jbHVkaW5nIERldlRvb2xzKS5cblxuICAgIHRoaXMuYWN0dWFsRHVyYXRpb24gPSAwO1xuICAgIHRoaXMuYWN0dWFsU3RhcnRUaW1lID0gLTE7XG4gICAgdGhpcy5zZWxmQmFzZUR1cmF0aW9uID0gMDtcbiAgICB0aGlzLnRyZWVCYXNlRHVyYXRpb24gPSAwO1xuICB9XG5cbiAge1xuICAgIC8vIFRoaXMgaXNuJ3QgZGlyZWN0bHkgdXNlZCBidXQgaXMgaGFuZHkgZm9yIGRlYnVnZ2luZyBpbnRlcm5hbHM6XG4gICAgdGhpcy5fZGVidWdTb3VyY2UgPSBudWxsO1xuICAgIHRoaXMuX2RlYnVnT3duZXIgPSBudWxsO1xuICAgIHRoaXMuX2RlYnVnTmVlZHNSZW1vdW50ID0gZmFsc2U7XG4gICAgdGhpcy5fZGVidWdIb29rVHlwZXMgPSBudWxsO1xuXG4gICAgaWYgKCFoYXNCYWRNYXBQb2x5ZmlsbCAmJiB0eXBlb2YgT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBPYmplY3QucHJldmVudEV4dGVuc2lvbnModGhpcyk7XG4gICAgfVxuICB9XG59IC8vIFRoaXMgaXMgYSBjb25zdHJ1Y3RvciBmdW5jdGlvbiwgcmF0aGVyIHRoYW4gYSBQT0pPIGNvbnN0cnVjdG9yLCBzdGlsbFxuLy8gcGxlYXNlIGVuc3VyZSB3ZSBkbyB0aGUgZm9sbG93aW5nOlxuLy8gMSkgTm9ib2R5IHNob3VsZCBhZGQgYW55IGluc3RhbmNlIG1ldGhvZHMgb24gdGhpcy4gSW5zdGFuY2UgbWV0aG9kcyBjYW4gYmVcbi8vICAgIG1vcmUgZGlmZmljdWx0IHRvIHByZWRpY3Qgd2hlbiB0aGV5IGdldCBvcHRpbWl6ZWQgYW5kIHRoZXkgYXJlIGFsbW9zdFxuLy8gICAgbmV2ZXIgaW5saW5lZCBwcm9wZXJseSBpbiBzdGF0aWMgY29tcGlsZXJzLlxuLy8gMikgTm9ib2R5IHNob3VsZCByZWx5IG9uIGBpbnN0YW5jZW9mIEZpYmVyYCBmb3IgdHlwZSB0ZXN0aW5nLiBXZSBzaG91bGRcbi8vICAgIGFsd2F5cyBrbm93IHdoZW4gaXQgaXMgYSBmaWJlci5cbi8vIDMpIFdlIG1pZ2h0IHdhbnQgdG8gZXhwZXJpbWVudCB3aXRoIHVzaW5nIG51bWVyaWMga2V5cyBzaW5jZSB0aGV5IGFyZSBlYXNpZXJcbi8vICAgIHRvIG9wdGltaXplIGluIGEgbm9uLUpJVCBlbnZpcm9ubWVudC5cbi8vIDQpIFdlIGNhbiBlYXNpbHkgZ28gZnJvbSBhIGNvbnN0cnVjdG9yIHRvIGEgY3JlYXRlRmliZXIgb2JqZWN0IGxpdGVyYWwgaWYgdGhhdFxuLy8gICAgaXMgZmFzdGVyLlxuLy8gNSkgSXQgc2hvdWxkIGJlIGVhc3kgdG8gcG9ydCB0aGlzIHRvIGEgQyBzdHJ1Y3QgYW5kIGtlZXAgYSBDIGltcGxlbWVudGF0aW9uXG4vLyAgICBjb21wYXRpYmxlLlxuXG5cbnZhciBjcmVhdGVGaWJlciA9IGZ1bmN0aW9uICh0YWcsIHBlbmRpbmdQcm9wcywga2V5LCBtb2RlKSB7XG4gIC8vICRGbG93Rml4TWU6IHRoZSBzaGFwZXMgYXJlIGV4YWN0IGhlcmUgYnV0IEZsb3cgZG9lc24ndCBsaWtlIGNvbnN0cnVjdG9yc1xuICByZXR1cm4gbmV3IEZpYmVyTm9kZSh0YWcsIHBlbmRpbmdQcm9wcywga2V5LCBtb2RlKTtcbn07XG5cbmZ1bmN0aW9uIHNob3VsZENvbnN0cnVjdCQxKENvbXBvbmVudCkge1xuICB2YXIgcHJvdG90eXBlID0gQ29tcG9uZW50LnByb3RvdHlwZTtcbiAgcmV0dXJuICEhKHByb3RvdHlwZSAmJiBwcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudCk7XG59XG5cbmZ1bmN0aW9uIGlzU2ltcGxlRnVuY3Rpb25Db21wb25lbnQodHlwZSkge1xuICByZXR1cm4gdHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicgJiYgIXNob3VsZENvbnN0cnVjdCQxKHR5cGUpICYmIHR5cGUuZGVmYXVsdFByb3BzID09PSB1bmRlZmluZWQ7XG59XG5mdW5jdGlvbiByZXNvbHZlTGF6eUNvbXBvbmVudFRhZyhDb21wb25lbnQpIHtcbiAgaWYgKHR5cGVvZiBDb21wb25lbnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gc2hvdWxkQ29uc3RydWN0JDEoQ29tcG9uZW50KSA/IENsYXNzQ29tcG9uZW50IDogRnVuY3Rpb25Db21wb25lbnQ7XG4gIH0gZWxzZSBpZiAoQ29tcG9uZW50ICE9PSB1bmRlZmluZWQgJiYgQ29tcG9uZW50ICE9PSBudWxsKSB7XG4gICAgdmFyICQkdHlwZW9mID0gQ29tcG9uZW50LiQkdHlwZW9mO1xuXG4gICAgaWYgKCQkdHlwZW9mID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFKSB7XG4gICAgICByZXR1cm4gRm9yd2FyZFJlZjtcbiAgICB9XG5cbiAgICBpZiAoJCR0eXBlb2YgPT09IFJFQUNUX01FTU9fVFlQRSkge1xuICAgICAgcmV0dXJuIE1lbW9Db21wb25lbnQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIEluZGV0ZXJtaW5hdGVDb21wb25lbnQ7XG59IC8vIFRoaXMgaXMgdXNlZCB0byBjcmVhdGUgYW4gYWx0ZXJuYXRlIGZpYmVyIHRvIGRvIHdvcmsgb24uXG5cbmZ1bmN0aW9uIGNyZWF0ZVdvcmtJblByb2dyZXNzKGN1cnJlbnQsIHBlbmRpbmdQcm9wcykge1xuICB2YXIgd29ya0luUHJvZ3Jlc3MgPSBjdXJyZW50LmFsdGVybmF0ZTtcblxuICBpZiAod29ya0luUHJvZ3Jlc3MgPT09IG51bGwpIHtcbiAgICAvLyBXZSB1c2UgYSBkb3VibGUgYnVmZmVyaW5nIHBvb2xpbmcgdGVjaG5pcXVlIGJlY2F1c2Ugd2Uga25vdyB0aGF0IHdlJ2xsXG4gICAgLy8gb25seSBldmVyIG5lZWQgYXQgbW9zdCB0d28gdmVyc2lvbnMgb2YgYSB0cmVlLiBXZSBwb29sIHRoZSBcIm90aGVyXCIgdW51c2VkXG4gICAgLy8gbm9kZSB0aGF0IHdlJ3JlIGZyZWUgdG8gcmV1c2UuIFRoaXMgaXMgbGF6aWx5IGNyZWF0ZWQgdG8gYXZvaWQgYWxsb2NhdGluZ1xuICAgIC8vIGV4dHJhIG9iamVjdHMgZm9yIHRoaW5ncyB0aGF0IGFyZSBuZXZlciB1cGRhdGVkLiBJdCBhbHNvIGFsbG93IHVzIHRvXG4gICAgLy8gcmVjbGFpbSB0aGUgZXh0cmEgbWVtb3J5IGlmIG5lZWRlZC5cbiAgICB3b3JrSW5Qcm9ncmVzcyA9IGNyZWF0ZUZpYmVyKGN1cnJlbnQudGFnLCBwZW5kaW5nUHJvcHMsIGN1cnJlbnQua2V5LCBjdXJyZW50Lm1vZGUpO1xuICAgIHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlID0gY3VycmVudC5lbGVtZW50VHlwZTtcbiAgICB3b3JrSW5Qcm9ncmVzcy50eXBlID0gY3VycmVudC50eXBlO1xuICAgIHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSA9IGN1cnJlbnQuc3RhdGVOb2RlO1xuXG4gICAge1xuICAgICAgLy8gREVWLW9ubHkgZmllbGRzXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5fZGVidWdTb3VyY2UgPSBjdXJyZW50Ll9kZWJ1Z1NvdXJjZTtcbiAgICAgIHdvcmtJblByb2dyZXNzLl9kZWJ1Z093bmVyID0gY3VycmVudC5fZGVidWdPd25lcjtcbiAgICAgIHdvcmtJblByb2dyZXNzLl9kZWJ1Z0hvb2tUeXBlcyA9IGN1cnJlbnQuX2RlYnVnSG9va1R5cGVzO1xuICAgIH1cblxuICAgIHdvcmtJblByb2dyZXNzLmFsdGVybmF0ZSA9IGN1cnJlbnQ7XG4gICAgY3VycmVudC5hbHRlcm5hdGUgPSB3b3JrSW5Qcm9ncmVzcztcbiAgfSBlbHNlIHtcbiAgICB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHMgPSBwZW5kaW5nUHJvcHM7IC8vIE5lZWRlZCBiZWNhdXNlIEJsb2NrcyBzdG9yZSBkYXRhIG9uIHR5cGUuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcy50eXBlID0gY3VycmVudC50eXBlOyAvLyBXZSBhbHJlYWR5IGhhdmUgYW4gYWx0ZXJuYXRlLlxuICAgIC8vIFJlc2V0IHRoZSBlZmZlY3QgdGFnLlxuXG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgPSBOb0ZsYWdzOyAvLyBUaGUgZWZmZWN0cyBhcmUgbm8gbG9uZ2VyIHZhbGlkLlxuXG4gICAgd29ya0luUHJvZ3Jlc3Muc3VidHJlZUZsYWdzID0gTm9GbGFncztcbiAgICB3b3JrSW5Qcm9ncmVzcy5kZWxldGlvbnMgPSBudWxsO1xuXG4gICAge1xuICAgICAgLy8gV2UgaW50ZW50aW9uYWxseSByZXNldCwgcmF0aGVyIHRoYW4gY29weSwgYWN0dWFsRHVyYXRpb24gJiBhY3R1YWxTdGFydFRpbWUuXG4gICAgICAvLyBUaGlzIHByZXZlbnRzIHRpbWUgZnJvbSBlbmRsZXNzbHkgYWNjdW11bGF0aW5nIGluIG5ldyBjb21taXRzLlxuICAgICAgLy8gVGhpcyBoYXMgdGhlIGRvd25zaWRlIG9mIHJlc2V0dGluZyB2YWx1ZXMgZm9yIGRpZmZlcmVudCBwcmlvcml0eSByZW5kZXJzLFxuICAgICAgLy8gQnV0IHdvcmtzIGZvciB5aWVsZGluZyAodGhlIGNvbW1vbiBjYXNlKSBhbmQgc2hvdWxkIHN1cHBvcnQgcmVzdW1pbmcuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5hY3R1YWxEdXJhdGlvbiA9IDA7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5hY3R1YWxTdGFydFRpbWUgPSAtMTtcbiAgICB9XG4gIH0gLy8gUmVzZXQgYWxsIGVmZmVjdHMgZXhjZXB0IHN0YXRpYyBvbmVzLlxuICAvLyBTdGF0aWMgZWZmZWN0cyBhcmUgbm90IHNwZWNpZmljIHRvIGEgcmVuZGVyLlxuXG5cbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgPSBjdXJyZW50LmZsYWdzICYgU3RhdGljTWFzaztcbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGRMYW5lcyA9IGN1cnJlbnQuY2hpbGRMYW5lcztcbiAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBjdXJyZW50LmxhbmVzO1xuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IGN1cnJlbnQuY2hpbGQ7XG4gIHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHMgPSBjdXJyZW50Lm1lbW9pemVkUHJvcHM7XG4gIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG4gIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gY3VycmVudC51cGRhdGVRdWV1ZTsgLy8gQ2xvbmUgdGhlIGRlcGVuZGVuY2llcyBvYmplY3QuIFRoaXMgaXMgbXV0YXRlZCBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZSwgc29cbiAgLy8gaXQgY2Fubm90IGJlIHNoYXJlZCB3aXRoIHRoZSBjdXJyZW50IGZpYmVyLlxuXG4gIHZhciBjdXJyZW50RGVwZW5kZW5jaWVzID0gY3VycmVudC5kZXBlbmRlbmNpZXM7XG4gIHdvcmtJblByb2dyZXNzLmRlcGVuZGVuY2llcyA9IGN1cnJlbnREZXBlbmRlbmNpZXMgPT09IG51bGwgPyBudWxsIDoge1xuICAgIGxhbmVzOiBjdXJyZW50RGVwZW5kZW5jaWVzLmxhbmVzLFxuICAgIGZpcnN0Q29udGV4dDogY3VycmVudERlcGVuZGVuY2llcy5maXJzdENvbnRleHRcbiAgfTsgLy8gVGhlc2Ugd2lsbCBiZSBvdmVycmlkZGVuIGR1cmluZyB0aGUgcGFyZW50J3MgcmVjb25jaWxpYXRpb25cblxuICB3b3JrSW5Qcm9ncmVzcy5zaWJsaW5nID0gY3VycmVudC5zaWJsaW5nO1xuICB3b3JrSW5Qcm9ncmVzcy5pbmRleCA9IGN1cnJlbnQuaW5kZXg7XG4gIHdvcmtJblByb2dyZXNzLnJlZiA9IGN1cnJlbnQucmVmO1xuXG4gIHtcbiAgICB3b3JrSW5Qcm9ncmVzcy5zZWxmQmFzZUR1cmF0aW9uID0gY3VycmVudC5zZWxmQmFzZUR1cmF0aW9uO1xuICAgIHdvcmtJblByb2dyZXNzLnRyZWVCYXNlRHVyYXRpb24gPSBjdXJyZW50LnRyZWVCYXNlRHVyYXRpb247XG4gIH1cblxuICB7XG4gICAgd29ya0luUHJvZ3Jlc3MuX2RlYnVnTmVlZHNSZW1vdW50ID0gY3VycmVudC5fZGVidWdOZWVkc1JlbW91bnQ7XG5cbiAgICBzd2l0Y2ggKHdvcmtJblByb2dyZXNzLnRhZykge1xuICAgICAgY2FzZSBJbmRldGVybWluYXRlQ29tcG9uZW50OlxuICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IHJlc29sdmVGdW5jdGlvbkZvckhvdFJlbG9hZGluZyhjdXJyZW50LnR5cGUpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IHJlc29sdmVDbGFzc0ZvckhvdFJlbG9hZGluZyhjdXJyZW50LnR5cGUpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgICB3b3JrSW5Qcm9ncmVzcy50eXBlID0gcmVzb2x2ZUZvcndhcmRSZWZGb3JIb3RSZWxvYWRpbmcoY3VycmVudC50eXBlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzO1xufSAvLyBVc2VkIHRvIHJldXNlIGEgRmliZXIgZm9yIGEgc2Vjb25kIHBhc3MuXG5cbmZ1bmN0aW9uIHJlc2V0V29ya0luUHJvZ3Jlc3Mod29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIC8vIFRoaXMgcmVzZXRzIHRoZSBGaWJlciB0byB3aGF0IGNyZWF0ZUZpYmVyIG9yIGNyZWF0ZVdvcmtJblByb2dyZXNzIHdvdWxkXG4gIC8vIGhhdmUgc2V0IHRoZSB2YWx1ZXMgdG8gYmVmb3JlIGR1cmluZyB0aGUgZmlyc3QgcGFzcy4gSWRlYWxseSB0aGlzIHdvdWxkbid0XG4gIC8vIGJlIG5lY2Vzc2FyeSBidXQgdW5mb3J0dW5hdGVseSBtYW55IGNvZGUgcGF0aHMgcmVhZHMgZnJvbSB0aGUgd29ya0luUHJvZ3Jlc3NcbiAgLy8gd2hlbiB0aGV5IHNob3VsZCBiZSByZWFkaW5nIGZyb20gY3VycmVudCBhbmQgd3JpdGluZyB0byB3b3JrSW5Qcm9ncmVzcy5cbiAgLy8gV2UgYXNzdW1lIHBlbmRpbmdQcm9wcywgaW5kZXgsIGtleSwgcmVmLCByZXR1cm4gYXJlIHN0aWxsIHVudG91Y2hlZCB0b1xuICAvLyBhdm9pZCBkb2luZyBhbm90aGVyIHJlY29uY2lsaWF0aW9uLlxuICAvLyBSZXNldCB0aGUgZWZmZWN0IGZsYWdzIGJ1dCBrZWVwIGFueSBQbGFjZW1lbnQgdGFncywgc2luY2UgdGhhdCdzIHNvbWV0aGluZ1xuICAvLyB0aGF0IGNoaWxkIGZpYmVyIGlzIHNldHRpbmcsIG5vdCB0aGUgcmVjb25jaWxpYXRpb24uXG4gIHdvcmtJblByb2dyZXNzLmZsYWdzICY9IFN0YXRpY01hc2sgfCBQbGFjZW1lbnQ7IC8vIFRoZSBlZmZlY3RzIGFyZSBubyBsb25nZXIgdmFsaWQuXG5cbiAgdmFyIGN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGU7XG5cbiAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAvLyBSZXNldCB0byBjcmVhdGVGaWJlcidzIGluaXRpYWwgdmFsdWVzLlxuICAgIHdvcmtJblByb2dyZXNzLmNoaWxkTGFuZXMgPSBOb0xhbmVzO1xuICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gcmVuZGVyTGFuZXM7XG4gICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzLnN1YnRyZWVGbGFncyA9IE5vRmxhZ3M7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcyA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzLmRlcGVuZGVuY2llcyA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlID0gbnVsbDtcblxuICAgIHtcbiAgICAgIC8vIE5vdGU6IFdlIGRvbid0IHJlc2V0IHRoZSBhY3R1YWxUaW1lIGNvdW50cy4gSXQncyB1c2VmdWwgdG8gYWNjdW11bGF0ZVxuICAgICAgLy8gYWN0dWFsIHRpbWUgYWNyb3NzIG11bHRpcGxlIHJlbmRlciBwYXNzZXMuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5zZWxmQmFzZUR1cmF0aW9uID0gMDtcbiAgICAgIHdvcmtJblByb2dyZXNzLnRyZWVCYXNlRHVyYXRpb24gPSAwO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBSZXNldCB0byB0aGUgY2xvbmVkIHZhbHVlcyB0aGF0IGNyZWF0ZVdvcmtJblByb2dyZXNzIHdvdWxkJ3ZlLlxuICAgIHdvcmtJblByb2dyZXNzLmNoaWxkTGFuZXMgPSBjdXJyZW50LmNoaWxkTGFuZXM7XG4gICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBjdXJyZW50LmxhbmVzO1xuICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gY3VycmVudC5jaGlsZDtcbiAgICB3b3JrSW5Qcm9ncmVzcy5zdWJ0cmVlRmxhZ3MgPSBOb0ZsYWdzO1xuICAgIHdvcmtJblByb2dyZXNzLmRlbGV0aW9ucyA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcyA9IGN1cnJlbnQubWVtb2l6ZWRQcm9wcztcbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gY3VycmVudC51cGRhdGVRdWV1ZTsgLy8gTmVlZGVkIGJlY2F1c2UgQmxvY2tzIHN0b3JlIGRhdGEgb24gdHlwZS5cblxuICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPSBjdXJyZW50LnR5cGU7IC8vIENsb25lIHRoZSBkZXBlbmRlbmNpZXMgb2JqZWN0LiBUaGlzIGlzIG11dGF0ZWQgZHVyaW5nIHRoZSByZW5kZXIgcGhhc2UsIHNvXG4gICAgLy8gaXQgY2Fubm90IGJlIHNoYXJlZCB3aXRoIHRoZSBjdXJyZW50IGZpYmVyLlxuXG4gICAgdmFyIGN1cnJlbnREZXBlbmRlbmNpZXMgPSBjdXJyZW50LmRlcGVuZGVuY2llcztcbiAgICB3b3JrSW5Qcm9ncmVzcy5kZXBlbmRlbmNpZXMgPSBjdXJyZW50RGVwZW5kZW5jaWVzID09PSBudWxsID8gbnVsbCA6IHtcbiAgICAgIGxhbmVzOiBjdXJyZW50RGVwZW5kZW5jaWVzLmxhbmVzLFxuICAgICAgZmlyc3RDb250ZXh0OiBjdXJyZW50RGVwZW5kZW5jaWVzLmZpcnN0Q29udGV4dFxuICAgIH07XG5cbiAgICB7XG4gICAgICAvLyBOb3RlOiBXZSBkb24ndCByZXNldCB0aGUgYWN0dWFsVGltZSBjb3VudHMuIEl0J3MgdXNlZnVsIHRvIGFjY3VtdWxhdGVcbiAgICAgIC8vIGFjdHVhbCB0aW1lIGFjcm9zcyBtdWx0aXBsZSByZW5kZXIgcGFzc2VzLlxuICAgICAgd29ya0luUHJvZ3Jlc3Muc2VsZkJhc2VEdXJhdGlvbiA9IGN1cnJlbnQuc2VsZkJhc2VEdXJhdGlvbjtcbiAgICAgIHdvcmtJblByb2dyZXNzLnRyZWVCYXNlRHVyYXRpb24gPSBjdXJyZW50LnRyZWVCYXNlRHVyYXRpb247XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzO1xufVxuZnVuY3Rpb24gY3JlYXRlSG9zdFJvb3RGaWJlcih0YWcsIGlzU3RyaWN0TW9kZSwgY29uY3VycmVudFVwZGF0ZXNCeURlZmF1bHRPdmVycmlkZSkge1xuICB2YXIgbW9kZTtcblxuICBpZiAodGFnID09PSBDb25jdXJyZW50Um9vdCkge1xuICAgIG1vZGUgPSBDb25jdXJyZW50TW9kZTtcblxuICAgIGlmIChpc1N0cmljdE1vZGUgPT09IHRydWUpIHtcbiAgICAgIG1vZGUgfD0gU3RyaWN0TGVnYWN5TW9kZTtcblxuICAgICAge1xuICAgICAgICBtb2RlIHw9IFN0cmljdEVmZmVjdHNNb2RlO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBtb2RlID0gTm9Nb2RlO1xuICB9XG5cbiAgaWYgKCBpc0RldlRvb2xzUHJlc2VudCkge1xuICAgIC8vIEFsd2F5cyBjb2xsZWN0IHByb2ZpbGUgdGltaW5ncyB3aGVuIERldlRvb2xzIGFyZSBwcmVzZW50LlxuICAgIC8vIFRoaXMgZW5hYmxlcyBEZXZUb29scyB0byBzdGFydCBjYXB0dXJpbmcgdGltaW5nIGF0IGFueSBwb2ludFx1MjAxM1xuICAgIC8vIFdpdGhvdXQgc29tZSBub2RlcyBpbiB0aGUgdHJlZSBoYXZpbmcgZW1wdHkgYmFzZSB0aW1lcy5cbiAgICBtb2RlIHw9IFByb2ZpbGVNb2RlO1xuICB9XG5cbiAgcmV0dXJuIGNyZWF0ZUZpYmVyKEhvc3RSb290LCBudWxsLCBudWxsLCBtb2RlKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbVR5cGVBbmRQcm9wcyh0eXBlLCAvLyBSZWFjdCRFbGVtZW50VHlwZVxua2V5LCBwZW5kaW5nUHJvcHMsIG93bmVyLCBtb2RlLCBsYW5lcykge1xuICB2YXIgZmliZXJUYWcgPSBJbmRldGVybWluYXRlQ29tcG9uZW50OyAvLyBUaGUgcmVzb2x2ZWQgdHlwZSBpcyBzZXQgaWYgd2Uga25vdyB3aGF0IHRoZSBmaW5hbCB0eXBlIHdpbGwgYmUuIEkuZS4gaXQncyBub3QgbGF6eS5cblxuICB2YXIgcmVzb2x2ZWRUeXBlID0gdHlwZTtcblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpZiAoc2hvdWxkQ29uc3RydWN0JDEodHlwZSkpIHtcbiAgICAgIGZpYmVyVGFnID0gQ2xhc3NDb21wb25lbnQ7XG5cbiAgICAgIHtcbiAgICAgICAgcmVzb2x2ZWRUeXBlID0gcmVzb2x2ZUNsYXNzRm9ySG90UmVsb2FkaW5nKHJlc29sdmVkVHlwZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHtcbiAgICAgICAgcmVzb2x2ZWRUeXBlID0gcmVzb2x2ZUZ1bmN0aW9uRm9ySG90UmVsb2FkaW5nKHJlc29sdmVkVHlwZSk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykge1xuICAgIGZpYmVyVGFnID0gSG9zdENvbXBvbmVudDtcbiAgfSBlbHNlIHtcbiAgICBnZXRUYWc6IHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBSRUFDVF9GUkFHTUVOVF9UWVBFOlxuICAgICAgICByZXR1cm4gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQocGVuZGluZ1Byb3BzLmNoaWxkcmVuLCBtb2RlLCBsYW5lcywga2V5KTtcblxuICAgICAgY2FzZSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFOlxuICAgICAgICBmaWJlclRhZyA9IE1vZGU7XG4gICAgICAgIG1vZGUgfD0gU3RyaWN0TGVnYWN5TW9kZTtcblxuICAgICAgICBpZiAoIChtb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgICAvLyBTdHJpY3QgZWZmZWN0cyBzaG91bGQgbmV2ZXIgcnVuIG9uIGxlZ2FjeSByb290c1xuICAgICAgICAgIG1vZGUgfD0gU3RyaWN0RWZmZWN0c01vZGU7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBSRUFDVF9QUk9GSUxFUl9UWVBFOlxuICAgICAgICByZXR1cm4gY3JlYXRlRmliZXJGcm9tUHJvZmlsZXIocGVuZGluZ1Byb3BzLCBtb2RlLCBsYW5lcywga2V5KTtcblxuICAgICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9UWVBFOlxuICAgICAgICByZXR1cm4gY3JlYXRlRmliZXJGcm9tU3VzcGVuc2UocGVuZGluZ1Byb3BzLCBtb2RlLCBsYW5lcywga2V5KTtcblxuICAgICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU6XG4gICAgICAgIHJldHVybiBjcmVhdGVGaWJlckZyb21TdXNwZW5zZUxpc3QocGVuZGluZ1Byb3BzLCBtb2RlLCBsYW5lcywga2V5KTtcblxuICAgICAgY2FzZSBSRUFDVF9PRkZTQ1JFRU5fVFlQRTpcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUZpYmVyRnJvbU9mZnNjcmVlbihwZW5kaW5nUHJvcHMsIG1vZGUsIGxhbmVzLCBrZXkpO1xuXG4gICAgICBjYXNlIFJFQUNUX0xFR0FDWV9ISURERU5fVFlQRTpcblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoXG5cbiAgICAgIGNhc2UgUkVBQ1RfU0NPUEVfVFlQRTpcblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoXG5cbiAgICAgIGNhc2UgUkVBQ1RfQ0FDSEVfVFlQRTpcblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoXG5cbiAgICAgIGNhc2UgUkVBQ1RfVFJBQ0lOR19NQVJLRVJfVFlQRTpcblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoXG5cbiAgICAgIGNhc2UgUkVBQ1RfREVCVUdfVFJBQ0lOR19NT0RFX1RZUEU6XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiB0eXBlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGUuJCR0eXBlb2YpIHtcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9QUk9WSURFUl9UWVBFOlxuICAgICAgICAgICAgICAgIGZpYmVyVGFnID0gQ29udGV4dFByb3ZpZGVyO1xuICAgICAgICAgICAgICAgIGJyZWFrIGdldFRhZztcblxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0NPTlRFWFRfVFlQRTpcbiAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgY29uc3VtZXJcbiAgICAgICAgICAgICAgICBmaWJlclRhZyA9IENvbnRleHRDb25zdW1lcjtcbiAgICAgICAgICAgICAgICBicmVhayBnZXRUYWc7XG5cbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICAgICAgICAgIGZpYmVyVGFnID0gRm9yd2FyZFJlZjtcblxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHJlc29sdmVkVHlwZSA9IHJlc29sdmVGb3J3YXJkUmVmRm9ySG90UmVsb2FkaW5nKHJlc29sdmVkVHlwZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWsgZ2V0VGFnO1xuXG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICAgICAgICAgIGZpYmVyVGFnID0gTWVtb0NvbXBvbmVudDtcbiAgICAgICAgICAgICAgICBicmVhayBnZXRUYWc7XG5cbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgICAgICAgICAgZmliZXJUYWcgPSBMYXp5Q29tcG9uZW50O1xuICAgICAgICAgICAgICAgIHJlc29sdmVkVHlwZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgYnJlYWsgZ2V0VGFnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBpbmZvID0gJyc7XG5cbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiB0eXBlICE9PSBudWxsICYmIE9iamVjdC5rZXlzKHR5cGUpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICBpbmZvICs9ICcgWW91IGxpa2VseSBmb3Jnb3QgdG8gZXhwb3J0IHlvdXIgY29tcG9uZW50IGZyb20gdGhlIGZpbGUgJyArIFwiaXQncyBkZWZpbmVkIGluLCBvciB5b3UgbWlnaHQgaGF2ZSBtaXhlZCB1cCBkZWZhdWx0IGFuZCBcIiArICduYW1lZCBpbXBvcnRzLic7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBvd25lck5hbWUgPSBvd25lciA/IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIob3duZXIpIDogbnVsbDtcblxuICAgICAgICAgICAgaWYgKG93bmVyTmFtZSkge1xuICAgICAgICAgICAgICBpbmZvICs9ICdcXG5cXG5DaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgJyArIG93bmVyTmFtZSArICdgLic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFbGVtZW50IHR5cGUgaXMgaW52YWxpZDogZXhwZWN0ZWQgYSBzdHJpbmcgKGZvciBidWlsdC1pbiAnICsgJ2NvbXBvbmVudHMpIG9yIGEgY2xhc3MvZnVuY3Rpb24gKGZvciBjb21wb3NpdGUgY29tcG9uZW50cykgJyArIChcImJ1dCBnb3Q6IFwiICsgKHR5cGUgPT0gbnVsbCA/IHR5cGUgOiB0eXBlb2YgdHlwZSkgKyBcIi5cIiArIGluZm8pKTtcbiAgICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKGZpYmVyVGFnLCBwZW5kaW5nUHJvcHMsIGtleSwgbW9kZSk7XG4gIGZpYmVyLmVsZW1lbnRUeXBlID0gdHlwZTtcbiAgZmliZXIudHlwZSA9IHJlc29sdmVkVHlwZTtcbiAgZmliZXIubGFuZXMgPSBsYW5lcztcblxuICB7XG4gICAgZmliZXIuX2RlYnVnT3duZXIgPSBvd25lcjtcbiAgfVxuXG4gIHJldHVybiBmaWJlcjtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbUVsZW1lbnQoZWxlbWVudCwgbW9kZSwgbGFuZXMpIHtcbiAgdmFyIG93bmVyID0gbnVsbDtcblxuICB7XG4gICAgb3duZXIgPSBlbGVtZW50Ll9vd25lcjtcbiAgfVxuXG4gIHZhciB0eXBlID0gZWxlbWVudC50eXBlO1xuICB2YXIga2V5ID0gZWxlbWVudC5rZXk7XG4gIHZhciBwZW5kaW5nUHJvcHMgPSBlbGVtZW50LnByb3BzO1xuICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlckZyb21UeXBlQW5kUHJvcHModHlwZSwga2V5LCBwZW5kaW5nUHJvcHMsIG93bmVyLCBtb2RlLCBsYW5lcyk7XG5cbiAge1xuICAgIGZpYmVyLl9kZWJ1Z1NvdXJjZSA9IGVsZW1lbnQuX3NvdXJjZTtcbiAgICBmaWJlci5fZGVidWdPd25lciA9IGVsZW1lbnQuX293bmVyO1xuICB9XG5cbiAgcmV0dXJuIGZpYmVyO1xufVxuZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQoZWxlbWVudHMsIG1vZGUsIGxhbmVzLCBrZXkpIHtcbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXIoRnJhZ21lbnQsIGVsZW1lbnRzLCBrZXksIG1vZGUpO1xuICBmaWJlci5sYW5lcyA9IGxhbmVzO1xuICByZXR1cm4gZmliZXI7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbVByb2ZpbGVyKHBlbmRpbmdQcm9wcywgbW9kZSwgbGFuZXMsIGtleSkge1xuICB7XG4gICAgaWYgKHR5cGVvZiBwZW5kaW5nUHJvcHMuaWQgIT09ICdzdHJpbmcnKSB7XG4gICAgICBlcnJvcignUHJvZmlsZXIgbXVzdCBzcGVjaWZ5IGFuIFwiaWRcIiBvZiB0eXBlIGBzdHJpbmdgIGFzIGEgcHJvcC4gUmVjZWl2ZWQgdGhlIHR5cGUgYCVzYCBpbnN0ZWFkLicsIHR5cGVvZiBwZW5kaW5nUHJvcHMuaWQpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKFByb2ZpbGVyLCBwZW5kaW5nUHJvcHMsIGtleSwgbW9kZSB8IFByb2ZpbGVNb2RlKTtcbiAgZmliZXIuZWxlbWVudFR5cGUgPSBSRUFDVF9QUk9GSUxFUl9UWVBFO1xuICBmaWJlci5sYW5lcyA9IGxhbmVzO1xuXG4gIHtcbiAgICBmaWJlci5zdGF0ZU5vZGUgPSB7XG4gICAgICBlZmZlY3REdXJhdGlvbjogMCxcbiAgICAgIHBhc3NpdmVFZmZlY3REdXJhdGlvbjogMFxuICAgIH07XG4gIH1cblxuICByZXR1cm4gZmliZXI7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbVN1c3BlbnNlKHBlbmRpbmdQcm9wcywgbW9kZSwgbGFuZXMsIGtleSkge1xuICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlcihTdXNwZW5zZUNvbXBvbmVudCwgcGVuZGluZ1Byb3BzLCBrZXksIG1vZGUpO1xuICBmaWJlci5lbGVtZW50VHlwZSA9IFJFQUNUX1NVU1BFTlNFX1RZUEU7XG4gIGZpYmVyLmxhbmVzID0gbGFuZXM7XG4gIHJldHVybiBmaWJlcjtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbVN1c3BlbnNlTGlzdChwZW5kaW5nUHJvcHMsIG1vZGUsIGxhbmVzLCBrZXkpIHtcbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXIoU3VzcGVuc2VMaXN0Q29tcG9uZW50LCBwZW5kaW5nUHJvcHMsIGtleSwgbW9kZSk7XG4gIGZpYmVyLmVsZW1lbnRUeXBlID0gUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFO1xuICBmaWJlci5sYW5lcyA9IGxhbmVzO1xuICByZXR1cm4gZmliZXI7XG59XG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21PZmZzY3JlZW4ocGVuZGluZ1Byb3BzLCBtb2RlLCBsYW5lcywga2V5KSB7XG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKE9mZnNjcmVlbkNvbXBvbmVudCwgcGVuZGluZ1Byb3BzLCBrZXksIG1vZGUpO1xuICBmaWJlci5lbGVtZW50VHlwZSA9IFJFQUNUX09GRlNDUkVFTl9UWVBFO1xuICBmaWJlci5sYW5lcyA9IGxhbmVzO1xuICB2YXIgcHJpbWFyeUNoaWxkSW5zdGFuY2UgPSB7XG4gICAgaXNIaWRkZW46IGZhbHNlXG4gIH07XG4gIGZpYmVyLnN0YXRlTm9kZSA9IHByaW1hcnlDaGlsZEluc3RhbmNlO1xuICByZXR1cm4gZmliZXI7XG59XG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21UZXh0KGNvbnRlbnQsIG1vZGUsIGxhbmVzKSB7XG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKEhvc3RUZXh0LCBjb250ZW50LCBudWxsLCBtb2RlKTtcbiAgZmliZXIubGFuZXMgPSBsYW5lcztcbiAgcmV0dXJuIGZpYmVyO1xufVxuZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tSG9zdEluc3RhbmNlRm9yRGVsZXRpb24oKSB7XG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKEhvc3RDb21wb25lbnQsIG51bGwsIG51bGwsIE5vTW9kZSk7XG4gIGZpYmVyLmVsZW1lbnRUeXBlID0gJ0RFTEVURUQnO1xuICByZXR1cm4gZmliZXI7XG59XG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21EZWh5ZHJhdGVkRnJhZ21lbnQoZGVoeWRyYXRlZE5vZGUpIHtcbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXIoRGVoeWRyYXRlZEZyYWdtZW50LCBudWxsLCBudWxsLCBOb01vZGUpO1xuICBmaWJlci5zdGF0ZU5vZGUgPSBkZWh5ZHJhdGVkTm9kZTtcbiAgcmV0dXJuIGZpYmVyO1xufVxuZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tUG9ydGFsKHBvcnRhbCwgbW9kZSwgbGFuZXMpIHtcbiAgdmFyIHBlbmRpbmdQcm9wcyA9IHBvcnRhbC5jaGlsZHJlbiAhPT0gbnVsbCA/IHBvcnRhbC5jaGlsZHJlbiA6IFtdO1xuICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlcihIb3N0UG9ydGFsLCBwZW5kaW5nUHJvcHMsIHBvcnRhbC5rZXksIG1vZGUpO1xuICBmaWJlci5sYW5lcyA9IGxhbmVzO1xuICBmaWJlci5zdGF0ZU5vZGUgPSB7XG4gICAgY29udGFpbmVySW5mbzogcG9ydGFsLmNvbnRhaW5lckluZm8sXG4gICAgcGVuZGluZ0NoaWxkcmVuOiBudWxsLFxuICAgIC8vIFVzZWQgYnkgcGVyc2lzdGVudCB1cGRhdGVzXG4gICAgaW1wbGVtZW50YXRpb246IHBvcnRhbC5pbXBsZW1lbnRhdGlvblxuICB9O1xuICByZXR1cm4gZmliZXI7XG59IC8vIFVzZWQgZm9yIHN0YXNoaW5nIFdJUCBwcm9wZXJ0aWVzIHRvIHJlcGxheSBmYWlsZWQgd29yayBpbiBERVYuXG5cbmZ1bmN0aW9uIGFzc2lnbkZpYmVyUHJvcGVydGllc0luREVWKHRhcmdldCwgc291cmNlKSB7XG4gIGlmICh0YXJnZXQgPT09IG51bGwpIHtcbiAgICAvLyBUaGlzIEZpYmVyJ3MgaW5pdGlhbCBwcm9wZXJ0aWVzIHdpbGwgYWx3YXlzIGJlIG92ZXJ3cml0dGVuLlxuICAgIC8vIFdlIG9ubHkgdXNlIGEgRmliZXIgdG8gZW5zdXJlIHRoZSBzYW1lIGhpZGRlbiBjbGFzcyBzbyBERVYgaXNuJ3Qgc2xvdy5cbiAgICB0YXJnZXQgPSBjcmVhdGVGaWJlcihJbmRldGVybWluYXRlQ29tcG9uZW50LCBudWxsLCBudWxsLCBOb01vZGUpO1xuICB9IC8vIFRoaXMgaXMgaW50ZW50aW9uYWxseSB3cml0dGVuIGFzIGEgbGlzdCBvZiBhbGwgcHJvcGVydGllcy5cbiAgLy8gV2UgdHJpZWQgdG8gdXNlIE9iamVjdC5hc3NpZ24oKSBpbnN0ZWFkIGJ1dCB0aGlzIGlzIGNhbGxlZCBpblxuICAvLyB0aGUgaG90dGVzdCBwYXRoLCBhbmQgT2JqZWN0LmFzc2lnbigpIHdhcyB0b28gc2xvdzpcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMjUwMlxuICAvLyBUaGlzIGNvZGUgaXMgREVWLW9ubHkgc28gc2l6ZSBpcyBub3QgYSBjb25jZXJuLlxuXG5cbiAgdGFyZ2V0LnRhZyA9IHNvdXJjZS50YWc7XG4gIHRhcmdldC5rZXkgPSBzb3VyY2Uua2V5O1xuICB0YXJnZXQuZWxlbWVudFR5cGUgPSBzb3VyY2UuZWxlbWVudFR5cGU7XG4gIHRhcmdldC50eXBlID0gc291cmNlLnR5cGU7XG4gIHRhcmdldC5zdGF0ZU5vZGUgPSBzb3VyY2Uuc3RhdGVOb2RlO1xuICB0YXJnZXQucmV0dXJuID0gc291cmNlLnJldHVybjtcbiAgdGFyZ2V0LmNoaWxkID0gc291cmNlLmNoaWxkO1xuICB0YXJnZXQuc2libGluZyA9IHNvdXJjZS5zaWJsaW5nO1xuICB0YXJnZXQuaW5kZXggPSBzb3VyY2UuaW5kZXg7XG4gIHRhcmdldC5yZWYgPSBzb3VyY2UucmVmO1xuICB0YXJnZXQucGVuZGluZ1Byb3BzID0gc291cmNlLnBlbmRpbmdQcm9wcztcbiAgdGFyZ2V0Lm1lbW9pemVkUHJvcHMgPSBzb3VyY2UubWVtb2l6ZWRQcm9wcztcbiAgdGFyZ2V0LnVwZGF0ZVF1ZXVlID0gc291cmNlLnVwZGF0ZVF1ZXVlO1xuICB0YXJnZXQubWVtb2l6ZWRTdGF0ZSA9IHNvdXJjZS5tZW1vaXplZFN0YXRlO1xuICB0YXJnZXQuZGVwZW5kZW5jaWVzID0gc291cmNlLmRlcGVuZGVuY2llcztcbiAgdGFyZ2V0Lm1vZGUgPSBzb3VyY2UubW9kZTtcbiAgdGFyZ2V0LmZsYWdzID0gc291cmNlLmZsYWdzO1xuICB0YXJnZXQuc3VidHJlZUZsYWdzID0gc291cmNlLnN1YnRyZWVGbGFncztcbiAgdGFyZ2V0LmRlbGV0aW9ucyA9IHNvdXJjZS5kZWxldGlvbnM7XG4gIHRhcmdldC5sYW5lcyA9IHNvdXJjZS5sYW5lcztcbiAgdGFyZ2V0LmNoaWxkTGFuZXMgPSBzb3VyY2UuY2hpbGRMYW5lcztcbiAgdGFyZ2V0LmFsdGVybmF0ZSA9IHNvdXJjZS5hbHRlcm5hdGU7XG5cbiAge1xuICAgIHRhcmdldC5hY3R1YWxEdXJhdGlvbiA9IHNvdXJjZS5hY3R1YWxEdXJhdGlvbjtcbiAgICB0YXJnZXQuYWN0dWFsU3RhcnRUaW1lID0gc291cmNlLmFjdHVhbFN0YXJ0VGltZTtcbiAgICB0YXJnZXQuc2VsZkJhc2VEdXJhdGlvbiA9IHNvdXJjZS5zZWxmQmFzZUR1cmF0aW9uO1xuICAgIHRhcmdldC50cmVlQmFzZUR1cmF0aW9uID0gc291cmNlLnRyZWVCYXNlRHVyYXRpb247XG4gIH1cblxuICB0YXJnZXQuX2RlYnVnU291cmNlID0gc291cmNlLl9kZWJ1Z1NvdXJjZTtcbiAgdGFyZ2V0Ll9kZWJ1Z093bmVyID0gc291cmNlLl9kZWJ1Z093bmVyO1xuICB0YXJnZXQuX2RlYnVnTmVlZHNSZW1vdW50ID0gc291cmNlLl9kZWJ1Z05lZWRzUmVtb3VudDtcbiAgdGFyZ2V0Ll9kZWJ1Z0hvb2tUeXBlcyA9IHNvdXJjZS5fZGVidWdIb29rVHlwZXM7XG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbmZ1bmN0aW9uIEZpYmVyUm9vdE5vZGUoY29udGFpbmVySW5mbywgdGFnLCBoeWRyYXRlLCBpZGVudGlmaWVyUHJlZml4LCBvblJlY292ZXJhYmxlRXJyb3IpIHtcbiAgdGhpcy50YWcgPSB0YWc7XG4gIHRoaXMuY29udGFpbmVySW5mbyA9IGNvbnRhaW5lckluZm87XG4gIHRoaXMucGVuZGluZ0NoaWxkcmVuID0gbnVsbDtcbiAgdGhpcy5jdXJyZW50ID0gbnVsbDtcbiAgdGhpcy5waW5nQ2FjaGUgPSBudWxsO1xuICB0aGlzLmZpbmlzaGVkV29yayA9IG51bGw7XG4gIHRoaXMudGltZW91dEhhbmRsZSA9IG5vVGltZW91dDtcbiAgdGhpcy5jb250ZXh0ID0gbnVsbDtcbiAgdGhpcy5wZW5kaW5nQ29udGV4dCA9IG51bGw7XG4gIHRoaXMuY2FsbGJhY2tOb2RlID0gbnVsbDtcbiAgdGhpcy5jYWxsYmFja1ByaW9yaXR5ID0gTm9MYW5lO1xuICB0aGlzLmV2ZW50VGltZXMgPSBjcmVhdGVMYW5lTWFwKE5vTGFuZXMpO1xuICB0aGlzLmV4cGlyYXRpb25UaW1lcyA9IGNyZWF0ZUxhbmVNYXAoTm9UaW1lc3RhbXApO1xuICB0aGlzLnBlbmRpbmdMYW5lcyA9IE5vTGFuZXM7XG4gIHRoaXMuc3VzcGVuZGVkTGFuZXMgPSBOb0xhbmVzO1xuICB0aGlzLnBpbmdlZExhbmVzID0gTm9MYW5lcztcbiAgdGhpcy5leHBpcmVkTGFuZXMgPSBOb0xhbmVzO1xuICB0aGlzLm11dGFibGVSZWFkTGFuZXMgPSBOb0xhbmVzO1xuICB0aGlzLmZpbmlzaGVkTGFuZXMgPSBOb0xhbmVzO1xuICB0aGlzLmVudGFuZ2xlZExhbmVzID0gTm9MYW5lcztcbiAgdGhpcy5lbnRhbmdsZW1lbnRzID0gY3JlYXRlTGFuZU1hcChOb0xhbmVzKTtcbiAgdGhpcy5pZGVudGlmaWVyUHJlZml4ID0gaWRlbnRpZmllclByZWZpeDtcbiAgdGhpcy5vblJlY292ZXJhYmxlRXJyb3IgPSBvblJlY292ZXJhYmxlRXJyb3I7XG5cbiAgaWYgKHN1cHBvcnRzSHlkcmF0aW9uKSB7XG4gICAgdGhpcy5tdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhID0gbnVsbDtcbiAgfVxuXG4gIHtcbiAgICB0aGlzLmVmZmVjdER1cmF0aW9uID0gMDtcbiAgICB0aGlzLnBhc3NpdmVFZmZlY3REdXJhdGlvbiA9IDA7XG4gIH1cblxuICB7XG4gICAgdGhpcy5tZW1vaXplZFVwZGF0ZXJzID0gbmV3IFNldCgpO1xuICAgIHZhciBwZW5kaW5nVXBkYXRlcnNMYW5lTWFwID0gdGhpcy5wZW5kaW5nVXBkYXRlcnNMYW5lTWFwID0gW107XG5cbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgVG90YWxMYW5lczsgX2krKykge1xuICAgICAgcGVuZGluZ1VwZGF0ZXJzTGFuZU1hcC5wdXNoKG5ldyBTZXQoKSk7XG4gICAgfVxuICB9XG5cbiAge1xuICAgIHN3aXRjaCAodGFnKSB7XG4gICAgICBjYXNlIENvbmN1cnJlbnRSb290OlxuICAgICAgICB0aGlzLl9kZWJ1Z1Jvb3RUeXBlID0gaHlkcmF0ZSA/ICdoeWRyYXRlUm9vdCgpJyA6ICdjcmVhdGVSb290KCknO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBMZWdhY3lSb290OlxuICAgICAgICB0aGlzLl9kZWJ1Z1Jvb3RUeXBlID0gaHlkcmF0ZSA/ICdoeWRyYXRlKCknIDogJ3JlbmRlcigpJztcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyUm9vdChjb250YWluZXJJbmZvLCB0YWcsIGh5ZHJhdGUsIGluaXRpYWxDaGlsZHJlbiwgaHlkcmF0aW9uQ2FsbGJhY2tzLCBpc1N0cmljdE1vZGUsIGNvbmN1cnJlbnRVcGRhdGVzQnlEZWZhdWx0T3ZlcnJpZGUsIC8vIFRPRE86IFdlIGhhdmUgc2V2ZXJhbCBvZiB0aGVzZSBhcmd1bWVudHMgdGhhdCBhcmUgY29uY2VwdHVhbGx5IHBhcnQgb2YgdGhlXG4vLyBob3N0IGNvbmZpZywgYnV0IGJlY2F1c2UgdGhleSBhcmUgcGFzc2VkIGluIGF0IHJ1bnRpbWUsIHdlIGhhdmUgdG8gdGhyZWFkXG4vLyB0aGVtIHRocm91Z2ggdGhlIHJvb3QgY29uc3RydWN0b3IuIFBlcmhhcHMgd2Ugc2hvdWxkIHB1dCB0aGVtIGFsbCBpbnRvIGFcbi8vIHNpbmdsZSB0eXBlLCBsaWtlIGEgRHluYW1pY0hvc3RDb25maWcgdGhhdCBpcyBkZWZpbmVkIGJ5IHRoZSByZW5kZXJlci5cbmlkZW50aWZpZXJQcmVmaXgsIG9uUmVjb3ZlcmFibGVFcnJvciwgdHJhbnNpdGlvbkNhbGxiYWNrcykge1xuICB2YXIgcm9vdCA9IG5ldyBGaWJlclJvb3ROb2RlKGNvbnRhaW5lckluZm8sIHRhZywgaHlkcmF0ZSwgaWRlbnRpZmllclByZWZpeCwgb25SZWNvdmVyYWJsZUVycm9yKTtcbiAgLy8gc3RhdGVOb2RlIGlzIGFueS5cblxuXG4gIHZhciB1bmluaXRpYWxpemVkRmliZXIgPSBjcmVhdGVIb3N0Um9vdEZpYmVyKHRhZywgaXNTdHJpY3RNb2RlKTtcbiAgcm9vdC5jdXJyZW50ID0gdW5pbml0aWFsaXplZEZpYmVyO1xuICB1bmluaXRpYWxpemVkRmliZXIuc3RhdGVOb2RlID0gcm9vdDtcblxuICB7XG4gICAgdmFyIF9pbml0aWFsU3RhdGUgPSB7XG4gICAgICBlbGVtZW50OiBpbml0aWFsQ2hpbGRyZW4sXG4gICAgICBpc0RlaHlkcmF0ZWQ6IGh5ZHJhdGUsXG4gICAgICBjYWNoZTogbnVsbCxcbiAgICAgIC8vIG5vdCBlbmFibGVkIHlldFxuICAgICAgdHJhbnNpdGlvbnM6IG51bGwsXG4gICAgICBwZW5kaW5nU3VzcGVuc2VCb3VuZGFyaWVzOiBudWxsXG4gICAgfTtcbiAgICB1bmluaXRpYWxpemVkRmliZXIubWVtb2l6ZWRTdGF0ZSA9IF9pbml0aWFsU3RhdGU7XG4gIH1cblxuICBpbml0aWFsaXplVXBkYXRlUXVldWUodW5pbml0aWFsaXplZEZpYmVyKTtcbiAgcmV0dXJuIHJvb3Q7XG59XG5cbnZhciBSZWFjdFZlcnNpb24gPSAnMTguMi4wJztcblxuZnVuY3Rpb24gY3JlYXRlUG9ydGFsKGNoaWxkcmVuLCBjb250YWluZXJJbmZvLCAvLyBUT0RPOiBmaWd1cmUgb3V0IHRoZSBBUEkgZm9yIGNyb3NzLXJlbmRlcmVyIGltcGxlbWVudGF0aW9uLlxuaW1wbGVtZW50YXRpb24pIHtcbiAgdmFyIGtleSA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogbnVsbDtcblxuICB7XG4gICAgY2hlY2tLZXlTdHJpbmdDb2VyY2lvbihrZXkpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAvLyBUaGlzIHRhZyBhbGxvdyB1cyB0byB1bmlxdWVseSBpZGVudGlmeSB0aGlzIGFzIGEgUmVhY3QgUG9ydGFsXG4gICAgJCR0eXBlb2Y6IFJFQUNUX1BPUlRBTF9UWVBFLFxuICAgIGtleToga2V5ID09IG51bGwgPyBudWxsIDogJycgKyBrZXksXG4gICAgY2hpbGRyZW46IGNoaWxkcmVuLFxuICAgIGNvbnRhaW5lckluZm86IGNvbnRhaW5lckluZm8sXG4gICAgaW1wbGVtZW50YXRpb246IGltcGxlbWVudGF0aW9uXG4gIH07XG59XG5cbnZhciBkaWRXYXJuQWJvdXROZXN0ZWRVcGRhdGVzO1xudmFyIGRpZFdhcm5BYm91dEZpbmROb2RlSW5TdHJpY3RNb2RlO1xuXG57XG4gIGRpZFdhcm5BYm91dE5lc3RlZFVwZGF0ZXMgPSBmYWxzZTtcbiAgZGlkV2FybkFib3V0RmluZE5vZGVJblN0cmljdE1vZGUgPSB7fTtcbn1cblxuZnVuY3Rpb24gZ2V0Q29udGV4dEZvclN1YnRyZWUocGFyZW50Q29tcG9uZW50KSB7XG4gIGlmICghcGFyZW50Q29tcG9uZW50KSB7XG4gICAgcmV0dXJuIGVtcHR5Q29udGV4dE9iamVjdDtcbiAgfVxuXG4gIHZhciBmaWJlciA9IGdldChwYXJlbnRDb21wb25lbnQpO1xuICB2YXIgcGFyZW50Q29udGV4dCA9IGZpbmRDdXJyZW50VW5tYXNrZWRDb250ZXh0KGZpYmVyKTtcblxuICBpZiAoZmliZXIudGFnID09PSBDbGFzc0NvbXBvbmVudCkge1xuICAgIHZhciBDb21wb25lbnQgPSBmaWJlci50eXBlO1xuXG4gICAgaWYgKGlzQ29udGV4dFByb3ZpZGVyKENvbXBvbmVudCkpIHtcbiAgICAgIHJldHVybiBwcm9jZXNzQ2hpbGRDb250ZXh0KGZpYmVyLCBDb21wb25lbnQsIHBhcmVudENvbnRleHQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwYXJlbnRDb250ZXh0O1xufVxuXG5mdW5jdGlvbiBmaW5kSG9zdEluc3RhbmNlKGNvbXBvbmVudCkge1xuICB2YXIgZmliZXIgPSBnZXQoY29tcG9uZW50KTtcblxuICBpZiAoZmliZXIgPT09IHVuZGVmaW5lZCkge1xuICAgIGlmICh0eXBlb2YgY29tcG9uZW50LnJlbmRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZmluZCBub2RlIG9uIGFuIHVubW91bnRlZCBjb21wb25lbnQuJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoY29tcG9uZW50KS5qb2luKCcsJyk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBcmd1bWVudCBhcHBlYXJzIHRvIG5vdCBiZSBhIFJlYWN0Q29tcG9uZW50LiBLZXlzOiBcIiArIGtleXMpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBob3N0RmliZXIgPSBmaW5kQ3VycmVudEhvc3RGaWJlcihmaWJlcik7XG5cbiAgaWYgKGhvc3RGaWJlciA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGhvc3RGaWJlci5zdGF0ZU5vZGU7XG59XG5cbmZ1bmN0aW9uIGZpbmRIb3N0SW5zdGFuY2VXaXRoV2FybmluZyhjb21wb25lbnQsIG1ldGhvZE5hbWUpIHtcbiAge1xuICAgIHZhciBmaWJlciA9IGdldChjb21wb25lbnQpO1xuXG4gICAgaWYgKGZpYmVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0eXBlb2YgY29tcG9uZW50LnJlbmRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBmaW5kIG5vZGUgb24gYW4gdW5tb3VudGVkIGNvbXBvbmVudC4nKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoY29tcG9uZW50KS5qb2luKCcsJyk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkFyZ3VtZW50IGFwcGVhcnMgdG8gbm90IGJlIGEgUmVhY3RDb21wb25lbnQuIEtleXM6IFwiICsga2V5cyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGhvc3RGaWJlciA9IGZpbmRDdXJyZW50SG9zdEZpYmVyKGZpYmVyKTtcblxuICAgIGlmIChob3N0RmliZXIgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChob3N0RmliZXIubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgJ0NvbXBvbmVudCc7XG5cbiAgICAgIGlmICghZGlkV2FybkFib3V0RmluZE5vZGVJblN0cmljdE1vZGVbY29tcG9uZW50TmFtZV0pIHtcbiAgICAgICAgZGlkV2FybkFib3V0RmluZE5vZGVJblN0cmljdE1vZGVbY29tcG9uZW50TmFtZV0gPSB0cnVlO1xuICAgICAgICB2YXIgcHJldmlvdXNGaWJlciA9IGN1cnJlbnQ7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBzZXRDdXJyZW50RmliZXIoaG9zdEZpYmVyKTtcblxuICAgICAgICAgIGlmIChmaWJlci5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkge1xuICAgICAgICAgICAgZXJyb3IoJyVzIGlzIGRlcHJlY2F0ZWQgaW4gU3RyaWN0TW9kZS4gJyArICclcyB3YXMgcGFzc2VkIGFuIGluc3RhbmNlIG9mICVzIHdoaWNoIGlzIGluc2lkZSBTdHJpY3RNb2RlLiAnICsgJ0luc3RlYWQsIGFkZCBhIHJlZiBkaXJlY3RseSB0byB0aGUgZWxlbWVudCB5b3Ugd2FudCB0byByZWZlcmVuY2UuICcgKyAnTGVhcm4gbW9yZSBhYm91dCB1c2luZyByZWZzIHNhZmVseSBoZXJlOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zdHJpY3QtbW9kZS1maW5kLW5vZGUnLCBtZXRob2ROYW1lLCBtZXRob2ROYW1lLCBjb21wb25lbnROYW1lKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZXJyb3IoJyVzIGlzIGRlcHJlY2F0ZWQgaW4gU3RyaWN0TW9kZS4gJyArICclcyB3YXMgcGFzc2VkIGFuIGluc3RhbmNlIG9mICVzIHdoaWNoIHJlbmRlcnMgU3RyaWN0TW9kZSBjaGlsZHJlbi4gJyArICdJbnN0ZWFkLCBhZGQgYSByZWYgZGlyZWN0bHkgdG8gdGhlIGVsZW1lbnQgeW91IHdhbnQgdG8gcmVmZXJlbmNlLiAnICsgJ0xlYXJuIG1vcmUgYWJvdXQgdXNpbmcgcmVmcyBzYWZlbHkgaGVyZTogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3RyaWN0LW1vZGUtZmluZC1ub2RlJywgbWV0aG9kTmFtZSwgbWV0aG9kTmFtZSwgY29tcG9uZW50TmFtZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIC8vIElkZWFsbHkgdGhpcyBzaG91bGQgcmVzZXQgdG8gcHJldmlvdXMgYnV0IHRoaXMgc2hvdWxkbid0IGJlIGNhbGxlZCBpblxuICAgICAgICAgIC8vIHJlbmRlciBhbmQgdGhlcmUncyBhbm90aGVyIHdhcm5pbmcgZm9yIHRoYXQgYW55d2F5LlxuICAgICAgICAgIGlmIChwcmV2aW91c0ZpYmVyKSB7XG4gICAgICAgICAgICBzZXRDdXJyZW50RmliZXIocHJldmlvdXNGaWJlcik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGhvc3RGaWJlci5zdGF0ZU5vZGU7XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlQ29udGFpbmVyKGNvbnRhaW5lckluZm8sIHRhZywgaHlkcmF0aW9uQ2FsbGJhY2tzLCBpc1N0cmljdE1vZGUsIGNvbmN1cnJlbnRVcGRhdGVzQnlEZWZhdWx0T3ZlcnJpZGUsIGlkZW50aWZpZXJQcmVmaXgsIG9uUmVjb3ZlcmFibGVFcnJvciwgdHJhbnNpdGlvbkNhbGxiYWNrcykge1xuICB2YXIgaHlkcmF0ZSA9IGZhbHNlO1xuICB2YXIgaW5pdGlhbENoaWxkcmVuID0gbnVsbDtcbiAgcmV0dXJuIGNyZWF0ZUZpYmVyUm9vdChjb250YWluZXJJbmZvLCB0YWcsIGh5ZHJhdGUsIGluaXRpYWxDaGlsZHJlbiwgaHlkcmF0aW9uQ2FsbGJhY2tzLCBpc1N0cmljdE1vZGUsIGNvbmN1cnJlbnRVcGRhdGVzQnlEZWZhdWx0T3ZlcnJpZGUsIGlkZW50aWZpZXJQcmVmaXgsIG9uUmVjb3ZlcmFibGVFcnJvcik7XG59XG5mdW5jdGlvbiBjcmVhdGVIeWRyYXRpb25Db250YWluZXIoaW5pdGlhbENoaWxkcmVuLCAvLyBUT0RPOiBSZW1vdmUgYGNhbGxiYWNrYCB3aGVuIHdlIGRlbGV0ZSBsZWdhY3kgbW9kZS5cbmNhbGxiYWNrLCBjb250YWluZXJJbmZvLCB0YWcsIGh5ZHJhdGlvbkNhbGxiYWNrcywgaXNTdHJpY3RNb2RlLCBjb25jdXJyZW50VXBkYXRlc0J5RGVmYXVsdE92ZXJyaWRlLCBpZGVudGlmaWVyUHJlZml4LCBvblJlY292ZXJhYmxlRXJyb3IsIHRyYW5zaXRpb25DYWxsYmFja3MpIHtcbiAgdmFyIGh5ZHJhdGUgPSB0cnVlO1xuICB2YXIgcm9vdCA9IGNyZWF0ZUZpYmVyUm9vdChjb250YWluZXJJbmZvLCB0YWcsIGh5ZHJhdGUsIGluaXRpYWxDaGlsZHJlbiwgaHlkcmF0aW9uQ2FsbGJhY2tzLCBpc1N0cmljdE1vZGUsIGNvbmN1cnJlbnRVcGRhdGVzQnlEZWZhdWx0T3ZlcnJpZGUsIGlkZW50aWZpZXJQcmVmaXgsIG9uUmVjb3ZlcmFibGVFcnJvcik7IC8vIFRPRE86IE1vdmUgdGhpcyB0byBGaWJlclJvb3QgY29uc3RydWN0b3JcblxuICByb290LmNvbnRleHQgPSBnZXRDb250ZXh0Rm9yU3VidHJlZShudWxsKTsgLy8gU2NoZWR1bGUgdGhlIGluaXRpYWwgcmVuZGVyLiBJbiBhIGh5ZHJhdGlvbiByb290LCB0aGlzIGlzIGRpZmZlcmVudCBmcm9tXG4gIC8vIGEgcmVndWxhciB1cGRhdGUgYmVjYXVzZSB0aGUgaW5pdGlhbCByZW5kZXIgbXVzdCBtYXRjaCB3YXMgd2FzIHJlbmRlcmVkXG4gIC8vIG9uIHRoZSBzZXJ2ZXIuXG4gIC8vIE5PVEU6IFRoaXMgdXBkYXRlIGludGVudGlvbmFsbHkgZG9lc24ndCBoYXZlIGEgcGF5bG9hZC4gV2UncmUgb25seSB1c2luZ1xuICAvLyB0aGUgdXBkYXRlIHRvIHNjaGVkdWxlIHdvcmsgb24gdGhlIHJvb3QgZmliZXIgKGFuZCwgZm9yIGxlZ2FjeSByb290cywgdG9cbiAgLy8gZW5xdWV1ZSB0aGUgY2FsbGJhY2sgaWYgb25lIGlzIHByb3ZpZGVkKS5cblxuICB2YXIgY3VycmVudCA9IHJvb3QuY3VycmVudDtcbiAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgdmFyIGxhbmUgPSByZXF1ZXN0VXBkYXRlTGFuZShjdXJyZW50KTtcbiAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVVwZGF0ZShldmVudFRpbWUsIGxhbmUpO1xuICB1cGRhdGUuY2FsbGJhY2sgPSBjYWxsYmFjayAhPT0gdW5kZWZpbmVkICYmIGNhbGxiYWNrICE9PSBudWxsID8gY2FsbGJhY2sgOiBudWxsO1xuICBlbnF1ZXVlVXBkYXRlKGN1cnJlbnQsIHVwZGF0ZSwgbGFuZSk7XG4gIHNjaGVkdWxlSW5pdGlhbEh5ZHJhdGlvbk9uUm9vdChyb290LCBsYW5lLCBldmVudFRpbWUpO1xuICByZXR1cm4gcm9vdDtcbn1cbmZ1bmN0aW9uIHVwZGF0ZUNvbnRhaW5lcihlbGVtZW50LCBjb250YWluZXIsIHBhcmVudENvbXBvbmVudCwgY2FsbGJhY2spIHtcbiAge1xuICAgIG9uU2NoZWR1bGVSb290KGNvbnRhaW5lciwgZWxlbWVudCk7XG4gIH1cblxuICB2YXIgY3VycmVudCQxID0gY29udGFpbmVyLmN1cnJlbnQ7XG4gIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gIHZhciBsYW5lID0gcmVxdWVzdFVwZGF0ZUxhbmUoY3VycmVudCQxKTtcblxuICB7XG4gICAgbWFya1JlbmRlclNjaGVkdWxlZChsYW5lKTtcbiAgfVxuXG4gIHZhciBjb250ZXh0ID0gZ2V0Q29udGV4dEZvclN1YnRyZWUocGFyZW50Q29tcG9uZW50KTtcblxuICBpZiAoY29udGFpbmVyLmNvbnRleHQgPT09IG51bGwpIHtcbiAgICBjb250YWluZXIuY29udGV4dCA9IGNvbnRleHQ7XG4gIH0gZWxzZSB7XG4gICAgY29udGFpbmVyLnBlbmRpbmdDb250ZXh0ID0gY29udGV4dDtcbiAgfVxuXG4gIHtcbiAgICBpZiAoaXNSZW5kZXJpbmcgJiYgY3VycmVudCAhPT0gbnVsbCAmJiAhZGlkV2FybkFib3V0TmVzdGVkVXBkYXRlcykge1xuICAgICAgZGlkV2FybkFib3V0TmVzdGVkVXBkYXRlcyA9IHRydWU7XG5cbiAgICAgIGVycm9yKCdSZW5kZXIgbWV0aG9kcyBzaG91bGQgYmUgYSBwdXJlIGZ1bmN0aW9uIG9mIHByb3BzIGFuZCBzdGF0ZTsgJyArICd0cmlnZ2VyaW5nIG5lc3RlZCBjb21wb25lbnQgdXBkYXRlcyBmcm9tIHJlbmRlciBpcyBub3QgYWxsb3dlZC4gJyArICdJZiBuZWNlc3NhcnksIHRyaWdnZXIgbmVzdGVkIHVwZGF0ZXMgaW4gY29tcG9uZW50RGlkVXBkYXRlLlxcblxcbicgKyAnQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgJXMuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihjdXJyZW50KSB8fCAnVW5rbm93bicpO1xuICAgIH1cbiAgfVxuXG4gIHZhciB1cGRhdGUgPSBjcmVhdGVVcGRhdGUoZXZlbnRUaW1lLCBsYW5lKTsgLy8gQ2F1dGlvbjogUmVhY3QgRGV2VG9vbHMgY3VycmVudGx5IGRlcGVuZHMgb24gdGhpcyBwcm9wZXJ0eVxuICAvLyBiZWluZyBjYWxsZWQgXCJlbGVtZW50XCIuXG5cbiAgdXBkYXRlLnBheWxvYWQgPSB7XG4gICAgZWxlbWVudDogZWxlbWVudFxuICB9O1xuICBjYWxsYmFjayA9IGNhbGxiYWNrID09PSB1bmRlZmluZWQgPyBudWxsIDogY2FsbGJhY2s7XG5cbiAgaWYgKGNhbGxiYWNrICE9PSBudWxsKSB7XG4gICAge1xuICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBlcnJvcigncmVuZGVyKC4uLik6IEV4cGVjdGVkIHRoZSBsYXN0IG9wdGlvbmFsIGBjYWxsYmFja2AgYXJndW1lbnQgdG8gYmUgYSAnICsgJ2Z1bmN0aW9uLiBJbnN0ZWFkIHJlY2VpdmVkOiAlcy4nLCBjYWxsYmFjayk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlLmNhbGxiYWNrID0gY2FsbGJhY2s7XG4gIH1cblxuICB2YXIgcm9vdCA9IGVucXVldWVVcGRhdGUoY3VycmVudCQxLCB1cGRhdGUsIGxhbmUpO1xuXG4gIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGN1cnJlbnQkMSwgbGFuZSwgZXZlbnRUaW1lKTtcbiAgICBlbnRhbmdsZVRyYW5zaXRpb25zKHJvb3QsIGN1cnJlbnQkMSwgbGFuZSk7XG4gIH1cblxuICByZXR1cm4gbGFuZTtcbn1cbmZ1bmN0aW9uIGdldFB1YmxpY1Jvb3RJbnN0YW5jZShjb250YWluZXIpIHtcbiAgdmFyIGNvbnRhaW5lckZpYmVyID0gY29udGFpbmVyLmN1cnJlbnQ7XG5cbiAgaWYgKCFjb250YWluZXJGaWJlci5jaGlsZCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgc3dpdGNoIChjb250YWluZXJGaWJlci5jaGlsZC50YWcpIHtcbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICByZXR1cm4gZ2V0UHVibGljSW5zdGFuY2UoY29udGFpbmVyRmliZXIuY2hpbGQuc3RhdGVOb2RlKTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gY29udGFpbmVyRmliZXIuY2hpbGQuc3RhdGVOb2RlO1xuICB9XG59XG5mdW5jdGlvbiBhdHRlbXB0U3luY2hyb25vdXNIeWRyYXRpb24oZmliZXIpIHtcbiAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICBjYXNlIEhvc3RSb290OlxuICAgICAge1xuICAgICAgICB2YXIgcm9vdCA9IGZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgICBpZiAoaXNSb290RGVoeWRyYXRlZChyb290KSkge1xuICAgICAgICAgIC8vIEZsdXNoIHRoZSBmaXJzdCBzY2hlZHVsZWQgXCJ1cGRhdGVcIi5cbiAgICAgICAgICB2YXIgbGFuZXMgPSBnZXRIaWdoZXN0UHJpb3JpdHlQZW5kaW5nTGFuZXMocm9vdCk7XG4gICAgICAgICAgZmx1c2hSb290KHJvb3QsIGxhbmVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgZmx1c2hTeW5jKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgcm9vdCA9IGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShmaWJlciwgU3luY0xhbmUpO1xuXG4gICAgICAgICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gICAgICAgICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIFN5bmNMYW5lLCBldmVudFRpbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7IC8vIElmIHdlJ3JlIHN0aWxsIGJsb2NrZWQgYWZ0ZXIgdGhpcywgd2UgbmVlZCB0byBpbmNyZWFzZVxuICAgICAgICAvLyB0aGUgcHJpb3JpdHkgb2YgYW55IHByb21pc2VzIHJlc29sdmluZyB3aXRoaW4gdGhpc1xuICAgICAgICAvLyBib3VuZGFyeSBzbyB0aGF0IHRoZXkgbmV4dCBhdHRlbXB0IGFsc28gaGFzIGhpZ2hlciBwcmkuXG5cbiAgICAgICAgdmFyIHJldHJ5TGFuZSA9IFN5bmNMYW5lO1xuICAgICAgICBtYXJrUmV0cnlMYW5lSWZOb3RIeWRyYXRlZChmaWJlciwgcmV0cnlMYW5lKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbWFya1JldHJ5TGFuZUltcGwoZmliZXIsIHJldHJ5TGFuZSkge1xuICB2YXIgc3VzcGVuc2VTdGF0ZSA9IGZpYmVyLm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKHN1c3BlbnNlU3RhdGUgIT09IG51bGwgJiYgc3VzcGVuc2VTdGF0ZS5kZWh5ZHJhdGVkICE9PSBudWxsKSB7XG4gICAgc3VzcGVuc2VTdGF0ZS5yZXRyeUxhbmUgPSBoaWdoZXJQcmlvcml0eUxhbmUoc3VzcGVuc2VTdGF0ZS5yZXRyeUxhbmUsIHJldHJ5TGFuZSk7XG4gIH1cbn0gLy8gSW5jcmVhc2VzIHRoZSBwcmlvcml0eSBvZiB0aGVuYWJsZXMgd2hlbiB0aGV5IHJlc29sdmUgd2l0aGluIHRoaXMgYm91bmRhcnkuXG5cblxuZnVuY3Rpb24gbWFya1JldHJ5TGFuZUlmTm90SHlkcmF0ZWQoZmliZXIsIHJldHJ5TGFuZSkge1xuICBtYXJrUmV0cnlMYW5lSW1wbChmaWJlciwgcmV0cnlMYW5lKTtcbiAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTtcblxuICBpZiAoYWx0ZXJuYXRlKSB7XG4gICAgbWFya1JldHJ5TGFuZUltcGwoYWx0ZXJuYXRlLCByZXRyeUxhbmUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGF0dGVtcHREaXNjcmV0ZUh5ZHJhdGlvbihmaWJlcikge1xuICBpZiAoZmliZXIudGFnICE9PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgIC8vIFdlIGlnbm9yZSBIb3N0Um9vdHMgaGVyZSBiZWNhdXNlIHdlIGNhbid0IGluY3JlYXNlXG4gICAgLy8gdGhlaXIgcHJpb3JpdHkgYW5kIHRoZXkgc2hvdWxkIG5vdCBzdXNwZW5kIG9uIEkvTyxcbiAgICAvLyBzaW5jZSB5b3UgaGF2ZSB0byB3cmFwIGFueXRoaW5nIHRoYXQgbWlnaHQgc3VzcGVuZCBpblxuICAgIC8vIFN1c3BlbnNlLlxuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBsYW5lID0gU3luY0xhbmU7XG4gIHZhciByb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCBsYW5lKTtcblxuICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBsYW5lLCBldmVudFRpbWUpO1xuICB9XG5cbiAgbWFya1JldHJ5TGFuZUlmTm90SHlkcmF0ZWQoZmliZXIsIGxhbmUpO1xufVxuZnVuY3Rpb24gYXR0ZW1wdENvbnRpbnVvdXNIeWRyYXRpb24oZmliZXIpIHtcbiAgaWYgKGZpYmVyLnRhZyAhPT0gU3VzcGVuc2VDb21wb25lbnQpIHtcbiAgICAvLyBXZSBpZ25vcmUgSG9zdFJvb3RzIGhlcmUgYmVjYXVzZSB3ZSBjYW4ndCBpbmNyZWFzZVxuICAgIC8vIHRoZWlyIHByaW9yaXR5IGFuZCB0aGV5IHNob3VsZCBub3Qgc3VzcGVuZCBvbiBJL08sXG4gICAgLy8gc2luY2UgeW91IGhhdmUgdG8gd3JhcCBhbnl0aGluZyB0aGF0IG1pZ2h0IHN1c3BlbmQgaW5cbiAgICAvLyBTdXNwZW5zZS5cbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgbGFuZSA9IFNlbGVjdGl2ZUh5ZHJhdGlvbkxhbmU7XG4gIHZhciByb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCBsYW5lKTtcblxuICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBsYW5lLCBldmVudFRpbWUpO1xuICB9XG5cbiAgbWFya1JldHJ5TGFuZUlmTm90SHlkcmF0ZWQoZmliZXIsIGxhbmUpO1xufVxuZnVuY3Rpb24gYXR0ZW1wdEh5ZHJhdGlvbkF0Q3VycmVudFByaW9yaXR5KGZpYmVyKSB7XG4gIGlmIChmaWJlci50YWcgIT09IFN1c3BlbnNlQ29tcG9uZW50KSB7XG4gICAgLy8gV2UgaWdub3JlIEhvc3RSb290cyBoZXJlIGJlY2F1c2Ugd2UgY2FuJ3QgaW5jcmVhc2VcbiAgICAvLyB0aGVpciBwcmlvcml0eSBvdGhlciB0aGFuIHN5bmNocm9ub3VzbHkgZmx1c2ggaXQuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGxhbmUgPSByZXF1ZXN0VXBkYXRlTGFuZShmaWJlcik7XG4gIHZhciByb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCBsYW5lKTtcblxuICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBsYW5lLCBldmVudFRpbWUpO1xuICB9XG5cbiAgbWFya1JldHJ5TGFuZUlmTm90SHlkcmF0ZWQoZmliZXIsIGxhbmUpO1xufVxuZnVuY3Rpb24gZmluZEhvc3RJbnN0YW5jZVdpdGhOb1BvcnRhbHMoZmliZXIpIHtcbiAgdmFyIGhvc3RGaWJlciA9IGZpbmRDdXJyZW50SG9zdEZpYmVyV2l0aE5vUG9ydGFscyhmaWJlcik7XG5cbiAgaWYgKGhvc3RGaWJlciA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGhvc3RGaWJlci5zdGF0ZU5vZGU7XG59XG5cbnZhciBzaG91bGRFcnJvckltcGwgPSBmdW5jdGlvbiAoZmliZXIpIHtcbiAgcmV0dXJuIG51bGw7XG59O1xuXG5mdW5jdGlvbiBzaG91bGRFcnJvcihmaWJlcikge1xuICByZXR1cm4gc2hvdWxkRXJyb3JJbXBsKGZpYmVyKTtcbn1cblxudmFyIHNob3VsZFN1c3BlbmRJbXBsID0gZnVuY3Rpb24gKGZpYmVyKSB7XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbmZ1bmN0aW9uIHNob3VsZFN1c3BlbmQoZmliZXIpIHtcbiAgcmV0dXJuIHNob3VsZFN1c3BlbmRJbXBsKGZpYmVyKTtcbn1cbnZhciBvdmVycmlkZUhvb2tTdGF0ZSA9IG51bGw7XG52YXIgb3ZlcnJpZGVIb29rU3RhdGVEZWxldGVQYXRoID0gbnVsbDtcbnZhciBvdmVycmlkZUhvb2tTdGF0ZVJlbmFtZVBhdGggPSBudWxsO1xudmFyIG92ZXJyaWRlUHJvcHMgPSBudWxsO1xudmFyIG92ZXJyaWRlUHJvcHNEZWxldGVQYXRoID0gbnVsbDtcbnZhciBvdmVycmlkZVByb3BzUmVuYW1lUGF0aCA9IG51bGw7XG52YXIgc2NoZWR1bGVVcGRhdGUgPSBudWxsO1xudmFyIHNldEVycm9ySGFuZGxlciA9IG51bGw7XG52YXIgc2V0U3VzcGVuc2VIYW5kbGVyID0gbnVsbDtcblxue1xuICB2YXIgY29weVdpdGhEZWxldGVJbXBsID0gZnVuY3Rpb24gKG9iaiwgcGF0aCwgaW5kZXgpIHtcbiAgICB2YXIga2V5ID0gcGF0aFtpbmRleF07XG4gICAgdmFyIHVwZGF0ZWQgPSBpc0FycmF5KG9iaikgPyBvYmouc2xpY2UoKSA6IGFzc2lnbih7fSwgb2JqKTtcblxuICAgIGlmIChpbmRleCArIDEgPT09IHBhdGgubGVuZ3RoKSB7XG4gICAgICBpZiAoaXNBcnJheSh1cGRhdGVkKSkge1xuICAgICAgICB1cGRhdGVkLnNwbGljZShrZXksIDEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIHVwZGF0ZWRba2V5XTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHVwZGF0ZWQ7XG4gICAgfSAvLyAkRmxvd0ZpeE1lIG51bWJlciBvciBzdHJpbmcgaXMgZmluZSBoZXJlXG5cblxuICAgIHVwZGF0ZWRba2V5XSA9IGNvcHlXaXRoRGVsZXRlSW1wbChvYmpba2V5XSwgcGF0aCwgaW5kZXggKyAxKTtcbiAgICByZXR1cm4gdXBkYXRlZDtcbiAgfTtcblxuICB2YXIgY29weVdpdGhEZWxldGUgPSBmdW5jdGlvbiAob2JqLCBwYXRoKSB7XG4gICAgcmV0dXJuIGNvcHlXaXRoRGVsZXRlSW1wbChvYmosIHBhdGgsIDApO1xuICB9O1xuXG4gIHZhciBjb3B5V2l0aFJlbmFtZUltcGwgPSBmdW5jdGlvbiAob2JqLCBvbGRQYXRoLCBuZXdQYXRoLCBpbmRleCkge1xuICAgIHZhciBvbGRLZXkgPSBvbGRQYXRoW2luZGV4XTtcbiAgICB2YXIgdXBkYXRlZCA9IGlzQXJyYXkob2JqKSA/IG9iai5zbGljZSgpIDogYXNzaWduKHt9LCBvYmopO1xuXG4gICAgaWYgKGluZGV4ICsgMSA9PT0gb2xkUGF0aC5sZW5ndGgpIHtcbiAgICAgIHZhciBuZXdLZXkgPSBuZXdQYXRoW2luZGV4XTsgLy8gJEZsb3dGaXhNZSBudW1iZXIgb3Igc3RyaW5nIGlzIGZpbmUgaGVyZVxuXG4gICAgICB1cGRhdGVkW25ld0tleV0gPSB1cGRhdGVkW29sZEtleV07XG5cbiAgICAgIGlmIChpc0FycmF5KHVwZGF0ZWQpKSB7XG4gICAgICAgIHVwZGF0ZWQuc3BsaWNlKG9sZEtleSwgMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgdXBkYXRlZFtvbGRLZXldO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyAkRmxvd0ZpeE1lIG51bWJlciBvciBzdHJpbmcgaXMgZmluZSBoZXJlXG4gICAgICB1cGRhdGVkW29sZEtleV0gPSBjb3B5V2l0aFJlbmFtZUltcGwoIC8vICRGbG93Rml4TWUgbnVtYmVyIG9yIHN0cmluZyBpcyBmaW5lIGhlcmVcbiAgICAgIG9ialtvbGRLZXldLCBvbGRQYXRoLCBuZXdQYXRoLCBpbmRleCArIDEpO1xuICAgIH1cblxuICAgIHJldHVybiB1cGRhdGVkO1xuICB9O1xuXG4gIHZhciBjb3B5V2l0aFJlbmFtZSA9IGZ1bmN0aW9uIChvYmosIG9sZFBhdGgsIG5ld1BhdGgpIHtcbiAgICBpZiAob2xkUGF0aC5sZW5ndGggIT09IG5ld1BhdGgubGVuZ3RoKSB7XG4gICAgICB3YXJuKCdjb3B5V2l0aFJlbmFtZSgpIGV4cGVjdHMgcGF0aHMgb2YgdGhlIHNhbWUgbGVuZ3RoJyk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuZXdQYXRoLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICBpZiAob2xkUGF0aFtpXSAhPT0gbmV3UGF0aFtpXSkge1xuICAgICAgICAgIHdhcm4oJ2NvcHlXaXRoUmVuYW1lKCkgZXhwZWN0cyBwYXRocyB0byBiZSB0aGUgc2FtZSBleGNlcHQgZm9yIHRoZSBkZWVwZXN0IGtleScpO1xuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvcHlXaXRoUmVuYW1lSW1wbChvYmosIG9sZFBhdGgsIG5ld1BhdGgsIDApO1xuICB9O1xuXG4gIHZhciBjb3B5V2l0aFNldEltcGwgPSBmdW5jdGlvbiAob2JqLCBwYXRoLCBpbmRleCwgdmFsdWUpIHtcbiAgICBpZiAoaW5kZXggPj0gcGF0aC5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICB2YXIga2V5ID0gcGF0aFtpbmRleF07XG4gICAgdmFyIHVwZGF0ZWQgPSBpc0FycmF5KG9iaikgPyBvYmouc2xpY2UoKSA6IGFzc2lnbih7fSwgb2JqKTsgLy8gJEZsb3dGaXhNZSBudW1iZXIgb3Igc3RyaW5nIGlzIGZpbmUgaGVyZVxuXG4gICAgdXBkYXRlZFtrZXldID0gY29weVdpdGhTZXRJbXBsKG9ialtrZXldLCBwYXRoLCBpbmRleCArIDEsIHZhbHVlKTtcbiAgICByZXR1cm4gdXBkYXRlZDtcbiAgfTtcblxuICB2YXIgY29weVdpdGhTZXQgPSBmdW5jdGlvbiAob2JqLCBwYXRoLCB2YWx1ZSkge1xuICAgIHJldHVybiBjb3B5V2l0aFNldEltcGwob2JqLCBwYXRoLCAwLCB2YWx1ZSk7XG4gIH07XG5cbiAgdmFyIGZpbmRIb29rID0gZnVuY3Rpb24gKGZpYmVyLCBpZCkge1xuICAgIC8vIEZvciBub3csIHRoZSBcImlkXCIgb2Ygc3RhdGVmdWwgaG9va3MgaXMganVzdCB0aGUgc3RhdGVmdWwgaG9vayBpbmRleC5cbiAgICAvLyBUaGlzIG1heSBjaGFuZ2UgaW4gdGhlIGZ1dHVyZSB3aXRoIGUuZy4gbmVzdGVkIGhvb2tzLlxuICAgIHZhciBjdXJyZW50SG9vayA9IGZpYmVyLm1lbW9pemVkU3RhdGU7XG5cbiAgICB3aGlsZSAoY3VycmVudEhvb2sgIT09IG51bGwgJiYgaWQgPiAwKSB7XG4gICAgICBjdXJyZW50SG9vayA9IGN1cnJlbnRIb29rLm5leHQ7XG4gICAgICBpZC0tO1xuICAgIH1cblxuICAgIHJldHVybiBjdXJyZW50SG9vaztcbiAgfTsgLy8gU3VwcG9ydCBEZXZUb29scyBlZGl0YWJsZSB2YWx1ZXMgZm9yIHVzZVN0YXRlIGFuZCB1c2VSZWR1Y2VyLlxuXG5cbiAgb3ZlcnJpZGVIb29rU3RhdGUgPSBmdW5jdGlvbiAoZmliZXIsIGlkLCBwYXRoLCB2YWx1ZSkge1xuICAgIHZhciBob29rID0gZmluZEhvb2soZmliZXIsIGlkKTtcblxuICAgIGlmIChob29rICE9PSBudWxsKSB7XG4gICAgICB2YXIgbmV3U3RhdGUgPSBjb3B5V2l0aFNldChob29rLm1lbW9pemVkU3RhdGUsIHBhdGgsIHZhbHVlKTtcbiAgICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IG5ld1N0YXRlO1xuICAgICAgaG9vay5iYXNlU3RhdGUgPSBuZXdTdGF0ZTsgLy8gV2UgYXJlbid0IGFjdHVhbGx5IGFkZGluZyBhbiB1cGRhdGUgdG8gdGhlIHF1ZXVlLFxuICAgICAgLy8gYmVjYXVzZSB0aGVyZSBpcyBubyB1cGRhdGUgd2UgY2FuIGFkZCBmb3IgdXNlUmVkdWNlciBob29rcyB0aGF0IHdvbid0IHRyaWdnZXIgYW4gZXJyb3IuXG4gICAgICAvLyAoVGhlcmUncyBubyBhcHByb3ByaWF0ZSBhY3Rpb24gdHlwZSBmb3IgRGV2VG9vbHMgb3ZlcnJpZGVzLilcbiAgICAgIC8vIEFzIGEgcmVzdWx0IHRob3VnaCwgUmVhY3Qgd2lsbCBzZWUgdGhlIHNjaGVkdWxlZCB1cGRhdGUgYXMgYSBub29wIGFuZCBiYWlsb3V0LlxuICAgICAgLy8gU2hhbGxvdyBjbG9uaW5nIHByb3BzIHdvcmtzIGFzIGEgd29ya2Fyb3VuZCBmb3Igbm93IHRvIGJ5cGFzcyB0aGUgYmFpbG91dCBjaGVjay5cblxuICAgICAgZmliZXIubWVtb2l6ZWRQcm9wcyA9IGFzc2lnbih7fSwgZmliZXIubWVtb2l6ZWRQcm9wcyk7XG4gICAgICB2YXIgcm9vdCA9IGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShmaWJlciwgU3luY0xhbmUpO1xuXG4gICAgICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIFN5bmNMYW5lLCBOb1RpbWVzdGFtcCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIG92ZXJyaWRlSG9va1N0YXRlRGVsZXRlUGF0aCA9IGZ1bmN0aW9uIChmaWJlciwgaWQsIHBhdGgpIHtcbiAgICB2YXIgaG9vayA9IGZpbmRIb29rKGZpYmVyLCBpZCk7XG5cbiAgICBpZiAoaG9vayAhPT0gbnVsbCkge1xuICAgICAgdmFyIG5ld1N0YXRlID0gY29weVdpdGhEZWxldGUoaG9vay5tZW1vaXplZFN0YXRlLCBwYXRoKTtcbiAgICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IG5ld1N0YXRlO1xuICAgICAgaG9vay5iYXNlU3RhdGUgPSBuZXdTdGF0ZTsgLy8gV2UgYXJlbid0IGFjdHVhbGx5IGFkZGluZyBhbiB1cGRhdGUgdG8gdGhlIHF1ZXVlLFxuICAgICAgLy8gYmVjYXVzZSB0aGVyZSBpcyBubyB1cGRhdGUgd2UgY2FuIGFkZCBmb3IgdXNlUmVkdWNlciBob29rcyB0aGF0IHdvbid0IHRyaWdnZXIgYW4gZXJyb3IuXG4gICAgICAvLyAoVGhlcmUncyBubyBhcHByb3ByaWF0ZSBhY3Rpb24gdHlwZSBmb3IgRGV2VG9vbHMgb3ZlcnJpZGVzLilcbiAgICAgIC8vIEFzIGEgcmVzdWx0IHRob3VnaCwgUmVhY3Qgd2lsbCBzZWUgdGhlIHNjaGVkdWxlZCB1cGRhdGUgYXMgYSBub29wIGFuZCBiYWlsb3V0LlxuICAgICAgLy8gU2hhbGxvdyBjbG9uaW5nIHByb3BzIHdvcmtzIGFzIGEgd29ya2Fyb3VuZCBmb3Igbm93IHRvIGJ5cGFzcyB0aGUgYmFpbG91dCBjaGVjay5cblxuICAgICAgZmliZXIubWVtb2l6ZWRQcm9wcyA9IGFzc2lnbih7fSwgZmliZXIubWVtb2l6ZWRQcm9wcyk7XG4gICAgICB2YXIgcm9vdCA9IGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShmaWJlciwgU3luY0xhbmUpO1xuXG4gICAgICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIFN5bmNMYW5lLCBOb1RpbWVzdGFtcCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIG92ZXJyaWRlSG9va1N0YXRlUmVuYW1lUGF0aCA9IGZ1bmN0aW9uIChmaWJlciwgaWQsIG9sZFBhdGgsIG5ld1BhdGgpIHtcbiAgICB2YXIgaG9vayA9IGZpbmRIb29rKGZpYmVyLCBpZCk7XG5cbiAgICBpZiAoaG9vayAhPT0gbnVsbCkge1xuICAgICAgdmFyIG5ld1N0YXRlID0gY29weVdpdGhSZW5hbWUoaG9vay5tZW1vaXplZFN0YXRlLCBvbGRQYXRoLCBuZXdQYXRoKTtcbiAgICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IG5ld1N0YXRlO1xuICAgICAgaG9vay5iYXNlU3RhdGUgPSBuZXdTdGF0ZTsgLy8gV2UgYXJlbid0IGFjdHVhbGx5IGFkZGluZyBhbiB1cGRhdGUgdG8gdGhlIHF1ZXVlLFxuICAgICAgLy8gYmVjYXVzZSB0aGVyZSBpcyBubyB1cGRhdGUgd2UgY2FuIGFkZCBmb3IgdXNlUmVkdWNlciBob29rcyB0aGF0IHdvbid0IHRyaWdnZXIgYW4gZXJyb3IuXG4gICAgICAvLyAoVGhlcmUncyBubyBhcHByb3ByaWF0ZSBhY3Rpb24gdHlwZSBmb3IgRGV2VG9vbHMgb3ZlcnJpZGVzLilcbiAgICAgIC8vIEFzIGEgcmVzdWx0IHRob3VnaCwgUmVhY3Qgd2lsbCBzZWUgdGhlIHNjaGVkdWxlZCB1cGRhdGUgYXMgYSBub29wIGFuZCBiYWlsb3V0LlxuICAgICAgLy8gU2hhbGxvdyBjbG9uaW5nIHByb3BzIHdvcmtzIGFzIGEgd29ya2Fyb3VuZCBmb3Igbm93IHRvIGJ5cGFzcyB0aGUgYmFpbG91dCBjaGVjay5cblxuICAgICAgZmliZXIubWVtb2l6ZWRQcm9wcyA9IGFzc2lnbih7fSwgZmliZXIubWVtb2l6ZWRQcm9wcyk7XG4gICAgICB2YXIgcm9vdCA9IGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShmaWJlciwgU3luY0xhbmUpO1xuXG4gICAgICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIFN5bmNMYW5lLCBOb1RpbWVzdGFtcCk7XG4gICAgICB9XG4gICAgfVxuICB9OyAvLyBTdXBwb3J0IERldlRvb2xzIHByb3BzIGZvciBmdW5jdGlvbiBjb21wb25lbnRzLCBmb3J3YXJkUmVmLCBtZW1vLCBob3N0IGNvbXBvbmVudHMsIGV0Yy5cblxuXG4gIG92ZXJyaWRlUHJvcHMgPSBmdW5jdGlvbiAoZmliZXIsIHBhdGgsIHZhbHVlKSB7XG4gICAgZmliZXIucGVuZGluZ1Byb3BzID0gY29weVdpdGhTZXQoZmliZXIubWVtb2l6ZWRQcm9wcywgcGF0aCwgdmFsdWUpO1xuXG4gICAgaWYgKGZpYmVyLmFsdGVybmF0ZSkge1xuICAgICAgZmliZXIuYWx0ZXJuYXRlLnBlbmRpbmdQcm9wcyA9IGZpYmVyLnBlbmRpbmdQcm9wcztcbiAgICB9XG5cbiAgICB2YXIgcm9vdCA9IGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShmaWJlciwgU3luY0xhbmUpO1xuXG4gICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgU3luY0xhbmUsIE5vVGltZXN0YW1wKTtcbiAgICB9XG4gIH07XG5cbiAgb3ZlcnJpZGVQcm9wc0RlbGV0ZVBhdGggPSBmdW5jdGlvbiAoZmliZXIsIHBhdGgpIHtcbiAgICBmaWJlci5wZW5kaW5nUHJvcHMgPSBjb3B5V2l0aERlbGV0ZShmaWJlci5tZW1vaXplZFByb3BzLCBwYXRoKTtcblxuICAgIGlmIChmaWJlci5hbHRlcm5hdGUpIHtcbiAgICAgIGZpYmVyLmFsdGVybmF0ZS5wZW5kaW5nUHJvcHMgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG4gICAgfVxuXG4gICAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoZmliZXIsIFN5bmNMYW5lKTtcblxuICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIFN5bmNMYW5lLCBOb1RpbWVzdGFtcCk7XG4gICAgfVxuICB9O1xuXG4gIG92ZXJyaWRlUHJvcHNSZW5hbWVQYXRoID0gZnVuY3Rpb24gKGZpYmVyLCBvbGRQYXRoLCBuZXdQYXRoKSB7XG4gICAgZmliZXIucGVuZGluZ1Byb3BzID0gY29weVdpdGhSZW5hbWUoZmliZXIubWVtb2l6ZWRQcm9wcywgb2xkUGF0aCwgbmV3UGF0aCk7XG5cbiAgICBpZiAoZmliZXIuYWx0ZXJuYXRlKSB7XG4gICAgICBmaWJlci5hbHRlcm5hdGUucGVuZGluZ1Byb3BzID0gZmliZXIucGVuZGluZ1Byb3BzO1xuICAgIH1cblxuICAgIHZhciByb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCBTeW5jTGFuZSk7XG5cbiAgICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBTeW5jTGFuZSwgTm9UaW1lc3RhbXApO1xuICAgIH1cbiAgfTtcblxuICBzY2hlZHVsZVVwZGF0ZSA9IGZ1bmN0aW9uIChmaWJlcikge1xuICAgIHZhciByb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCBTeW5jTGFuZSk7XG5cbiAgICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBTeW5jTGFuZSwgTm9UaW1lc3RhbXApO1xuICAgIH1cbiAgfTtcblxuICBzZXRFcnJvckhhbmRsZXIgPSBmdW5jdGlvbiAobmV3U2hvdWxkRXJyb3JJbXBsKSB7XG4gICAgc2hvdWxkRXJyb3JJbXBsID0gbmV3U2hvdWxkRXJyb3JJbXBsO1xuICB9O1xuXG4gIHNldFN1c3BlbnNlSGFuZGxlciA9IGZ1bmN0aW9uIChuZXdTaG91bGRTdXNwZW5kSW1wbCkge1xuICAgIHNob3VsZFN1c3BlbmRJbXBsID0gbmV3U2hvdWxkU3VzcGVuZEltcGw7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGZpbmRIb3N0SW5zdGFuY2VCeUZpYmVyKGZpYmVyKSB7XG4gIHZhciBob3N0RmliZXIgPSBmaW5kQ3VycmVudEhvc3RGaWJlcihmaWJlcik7XG5cbiAgaWYgKGhvc3RGaWJlciA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGhvc3RGaWJlci5zdGF0ZU5vZGU7XG59XG5cbmZ1bmN0aW9uIGVtcHR5RmluZEZpYmVyQnlIb3N0SW5zdGFuY2UoaW5zdGFuY2UpIHtcbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGdldEN1cnJlbnRGaWJlckZvckRldlRvb2xzKCkge1xuICByZXR1cm4gY3VycmVudDtcbn1cblxuZnVuY3Rpb24gaW5qZWN0SW50b0RldlRvb2xzKGRldlRvb2xzQ29uZmlnKSB7XG4gIHZhciBmaW5kRmliZXJCeUhvc3RJbnN0YW5jZSA9IGRldlRvb2xzQ29uZmlnLmZpbmRGaWJlckJ5SG9zdEluc3RhbmNlO1xuICB2YXIgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudERpc3BhdGNoZXI7XG4gIHJldHVybiBpbmplY3RJbnRlcm5hbHMoe1xuICAgIGJ1bmRsZVR5cGU6IGRldlRvb2xzQ29uZmlnLmJ1bmRsZVR5cGUsXG4gICAgdmVyc2lvbjogZGV2VG9vbHNDb25maWcudmVyc2lvbixcbiAgICByZW5kZXJlclBhY2thZ2VOYW1lOiBkZXZUb29sc0NvbmZpZy5yZW5kZXJlclBhY2thZ2VOYW1lLFxuICAgIHJlbmRlcmVyQ29uZmlnOiBkZXZUb29sc0NvbmZpZy5yZW5kZXJlckNvbmZpZyxcbiAgICBvdmVycmlkZUhvb2tTdGF0ZTogb3ZlcnJpZGVIb29rU3RhdGUsXG4gICAgb3ZlcnJpZGVIb29rU3RhdGVEZWxldGVQYXRoOiBvdmVycmlkZUhvb2tTdGF0ZURlbGV0ZVBhdGgsXG4gICAgb3ZlcnJpZGVIb29rU3RhdGVSZW5hbWVQYXRoOiBvdmVycmlkZUhvb2tTdGF0ZVJlbmFtZVBhdGgsXG4gICAgb3ZlcnJpZGVQcm9wczogb3ZlcnJpZGVQcm9wcyxcbiAgICBvdmVycmlkZVByb3BzRGVsZXRlUGF0aDogb3ZlcnJpZGVQcm9wc0RlbGV0ZVBhdGgsXG4gICAgb3ZlcnJpZGVQcm9wc1JlbmFtZVBhdGg6IG92ZXJyaWRlUHJvcHNSZW5hbWVQYXRoLFxuICAgIHNldEVycm9ySGFuZGxlcjogc2V0RXJyb3JIYW5kbGVyLFxuICAgIHNldFN1c3BlbnNlSGFuZGxlcjogc2V0U3VzcGVuc2VIYW5kbGVyLFxuICAgIHNjaGVkdWxlVXBkYXRlOiBzY2hlZHVsZVVwZGF0ZSxcbiAgICBjdXJyZW50RGlzcGF0Y2hlclJlZjogUmVhY3RDdXJyZW50RGlzcGF0Y2hlcixcbiAgICBmaW5kSG9zdEluc3RhbmNlQnlGaWJlcjogZmluZEhvc3RJbnN0YW5jZUJ5RmliZXIsXG4gICAgZmluZEZpYmVyQnlIb3N0SW5zdGFuY2U6IGZpbmRGaWJlckJ5SG9zdEluc3RhbmNlIHx8IGVtcHR5RmluZEZpYmVyQnlIb3N0SW5zdGFuY2UsXG4gICAgLy8gUmVhY3QgUmVmcmVzaFxuICAgIGZpbmRIb3N0SW5zdGFuY2VzRm9yUmVmcmVzaDogIGZpbmRIb3N0SW5zdGFuY2VzRm9yUmVmcmVzaCAsXG4gICAgc2NoZWR1bGVSZWZyZXNoOiAgc2NoZWR1bGVSZWZyZXNoICxcbiAgICBzY2hlZHVsZVJvb3Q6ICBzY2hlZHVsZVJvb3QgLFxuICAgIHNldFJlZnJlc2hIYW5kbGVyOiAgc2V0UmVmcmVzaEhhbmRsZXIgLFxuICAgIC8vIEVuYWJsZXMgRGV2VG9vbHMgdG8gYXBwZW5kIG93bmVyIHN0YWNrcyB0byBlcnJvciBtZXNzYWdlcyBpbiBERVYgbW9kZS5cbiAgICBnZXRDdXJyZW50RmliZXI6ICBnZXRDdXJyZW50RmliZXJGb3JEZXZUb29scyAsXG4gICAgLy8gRW5hYmxlcyBEZXZUb29scyB0byBkZXRlY3QgcmVjb25jaWxlciB2ZXJzaW9uIHJhdGhlciB0aGFuIHJlbmRlcmVyIHZlcnNpb25cbiAgICAvLyB3aGljaCBtYXkgbm90IG1hdGNoIGZvciB0aGlyZCBwYXJ0eSByZW5kZXJlcnMuXG4gICAgcmVjb25jaWxlclZlcnNpb246IFJlYWN0VmVyc2lvblxuICB9KTtcbn1cblxuZXhwb3J0cy5hdHRlbXB0Q29udGludW91c0h5ZHJhdGlvbiA9IGF0dGVtcHRDb250aW51b3VzSHlkcmF0aW9uO1xuZXhwb3J0cy5hdHRlbXB0RGlzY3JldGVIeWRyYXRpb24gPSBhdHRlbXB0RGlzY3JldGVIeWRyYXRpb247XG5leHBvcnRzLmF0dGVtcHRIeWRyYXRpb25BdEN1cnJlbnRQcmlvcml0eSA9IGF0dGVtcHRIeWRyYXRpb25BdEN1cnJlbnRQcmlvcml0eTtcbmV4cG9ydHMuYXR0ZW1wdFN5bmNocm9ub3VzSHlkcmF0aW9uID0gYXR0ZW1wdFN5bmNocm9ub3VzSHlkcmF0aW9uO1xuZXhwb3J0cy5iYXRjaGVkVXBkYXRlcyA9IGJhdGNoZWRVcGRhdGVzO1xuZXhwb3J0cy5jcmVhdGVDb21wb25lbnRTZWxlY3RvciA9IGNyZWF0ZUNvbXBvbmVudFNlbGVjdG9yO1xuZXhwb3J0cy5jcmVhdGVDb250YWluZXIgPSBjcmVhdGVDb250YWluZXI7XG5leHBvcnRzLmNyZWF0ZUhhc1BzZXVkb0NsYXNzU2VsZWN0b3IgPSBjcmVhdGVIYXNQc2V1ZG9DbGFzc1NlbGVjdG9yO1xuZXhwb3J0cy5jcmVhdGVIeWRyYXRpb25Db250YWluZXIgPSBjcmVhdGVIeWRyYXRpb25Db250YWluZXI7XG5leHBvcnRzLmNyZWF0ZVBvcnRhbCA9IGNyZWF0ZVBvcnRhbDtcbmV4cG9ydHMuY3JlYXRlUm9sZVNlbGVjdG9yID0gY3JlYXRlUm9sZVNlbGVjdG9yO1xuZXhwb3J0cy5jcmVhdGVUZXN0TmFtZVNlbGVjdG9yID0gY3JlYXRlVGVzdE5hbWVTZWxlY3RvcjtcbmV4cG9ydHMuY3JlYXRlVGV4dFNlbGVjdG9yID0gY3JlYXRlVGV4dFNlbGVjdG9yO1xuZXhwb3J0cy5kZWZlcnJlZFVwZGF0ZXMgPSBkZWZlcnJlZFVwZGF0ZXM7XG5leHBvcnRzLmRpc2NyZXRlVXBkYXRlcyA9IGRpc2NyZXRlVXBkYXRlcztcbmV4cG9ydHMuZmluZEFsbE5vZGVzID0gZmluZEFsbE5vZGVzO1xuZXhwb3J0cy5maW5kQm91bmRpbmdSZWN0cyA9IGZpbmRCb3VuZGluZ1JlY3RzO1xuZXhwb3J0cy5maW5kSG9zdEluc3RhbmNlID0gZmluZEhvc3RJbnN0YW5jZTtcbmV4cG9ydHMuZmluZEhvc3RJbnN0YW5jZVdpdGhOb1BvcnRhbHMgPSBmaW5kSG9zdEluc3RhbmNlV2l0aE5vUG9ydGFscztcbmV4cG9ydHMuZmluZEhvc3RJbnN0YW5jZVdpdGhXYXJuaW5nID0gZmluZEhvc3RJbnN0YW5jZVdpdGhXYXJuaW5nO1xuZXhwb3J0cy5mbHVzaENvbnRyb2xsZWQgPSBmbHVzaENvbnRyb2xsZWQ7XG5leHBvcnRzLmZsdXNoUGFzc2l2ZUVmZmVjdHMgPSBmbHVzaFBhc3NpdmVFZmZlY3RzO1xuZXhwb3J0cy5mbHVzaFN5bmMgPSBmbHVzaFN5bmM7XG5leHBvcnRzLmZvY3VzV2l0aGluID0gZm9jdXNXaXRoaW47XG5leHBvcnRzLmdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSA9IGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eTtcbmV4cG9ydHMuZ2V0RmluZEFsbE5vZGVzRmFpbHVyZURlc2NyaXB0aW9uID0gZ2V0RmluZEFsbE5vZGVzRmFpbHVyZURlc2NyaXB0aW9uO1xuZXhwb3J0cy5nZXRQdWJsaWNSb290SW5zdGFuY2UgPSBnZXRQdWJsaWNSb290SW5zdGFuY2U7XG5leHBvcnRzLmluamVjdEludG9EZXZUb29scyA9IGluamVjdEludG9EZXZUb29scztcbmV4cG9ydHMuaXNBbHJlYWR5UmVuZGVyaW5nID0gaXNBbHJlYWR5UmVuZGVyaW5nO1xuZXhwb3J0cy5vYnNlcnZlVmlzaWJsZVJlY3RzID0gb2JzZXJ2ZVZpc2libGVSZWN0cztcbmV4cG9ydHMucmVnaXN0ZXJNdXRhYmxlU291cmNlRm9ySHlkcmF0aW9uID0gcmVnaXN0ZXJNdXRhYmxlU291cmNlRm9ySHlkcmF0aW9uO1xuZXhwb3J0cy5ydW5XaXRoUHJpb3JpdHkgPSBydW5XaXRoUHJpb3JpdHk7XG5leHBvcnRzLnNob3VsZEVycm9yID0gc2hvdWxkRXJyb3I7XG5leHBvcnRzLnNob3VsZFN1c3BlbmQgPSBzaG91bGRTdXNwZW5kO1xuZXhwb3J0cy51cGRhdGVDb250YWluZXIgPSB1cGRhdGVDb250YWluZXI7XG4gICAgcmV0dXJuIGV4cG9ydHM7XG4gIH07XG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LXJlY29uY2lsZXIucHJvZHVjdGlvbi5taW4uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtcmVjb25jaWxlci5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwgIi8vIEJFR0lOIEFVVE8gR0VORVJBVEVEIENPREUgXCJ+c2RrL3NjZW5lLWVudHJ5cG9pbnRcIlxuXCJ1c2Ugc3RyaWN0XCI7XG5pbXBvcnQgKiBhcyBlbnRyeXBvaW50IGZyb20gJy9Vc2Vycy9OaWNvL0RvY3VtZW50cy9naXRodWIvaG9ycmlibGUtdGVzdHMvTWlrYXMta2l0Y2hlbi1TREs3L3NyYy9pbmRleC50cydcbmltcG9ydCB7IGVuZ2luZSB9IGZyb20gJ0BkY2wvc2RrL2VjcydcbmltcG9ydCAqIGFzIHNkayBmcm9tICdAZGNsL3NkaydcblxuaWYgKChlbnRyeXBvaW50IGFzIGFueSkubWFpbiAhPT0gdW5kZWZpbmVkKSB7XG4gIGZ1bmN0aW9uIF9JTlRFUk5BTF9zdGFydHVwX3N5c3RlbSgpIHtcbiAgICBjb25zdCBtYXliZVByb21pc2UgPSAoZW50cnlwb2ludCBhcyBhbnkpLm1haW4oKVxuICAgIGlmIChtYXliZVByb21pc2UgJiYgdHlwZW9mIG1heWJlUHJvbWlzZSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIChtYXliZVByb21pc2UgYXMgdW5rbm93biBhcyBQcm9taXNlPHVua25vd24+KS50aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBtYXliZVByb21pc2UuY2F0Y2goY29uc29sZS5lcnJvcilcbiAgICB9XG4gICAgZW5naW5lLnJlbW92ZVN5c3RlbShfSU5URVJOQUxfc3RhcnR1cF9zeXN0ZW0pXG4gIH1cbiAgZW5naW5lLmFkZFN5c3RlbShfSU5URVJOQUxfc3RhcnR1cF9zeXN0ZW0sIEluZmluaXR5KVxufVxuXG5leHBvcnQgKiBmcm9tICdAZGNsL3NkaydcbmV4cG9ydCAqIGZyb20gJy9Vc2Vycy9OaWNvL0RvY3VtZW50cy9naXRodWIvaG9ycmlibGUtdGVzdHMvTWlrYXMta2l0Y2hlbi1TREs3L3NyYy9pbmRleC50cydcbiIsICIvKiBlc2xpbnQtZGlzYWJsZSAqL1xuaW1wb3J0IF9tMCBmcm9tIFwicHJvdG9idWZqcy9taW5pbWFsXCI7XG5jb25zdCBwcm90b2J1ZlBhY2thZ2VTYXJhc2EgPSBcImRlY2VudHJhbGFuZC5zZGsuY29tcG9uZW50c1wiO1xuZnVuY3Rpb24gY3JlYXRlQmFzZVBCQW5pbWF0b3IoKSB7XG4gICAgcmV0dXJuIHsgc3RhdGVzOiBbXSB9O1xufVxuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB2YXIgUEJBbmltYXRvcjtcbihmdW5jdGlvbiAoUEJBbmltYXRvcikge1xuICAgIGZ1bmN0aW9uIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBfbTAuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGZvciAoY29uc3QgdiBvZiBtZXNzYWdlLnN0YXRlcykge1xuICAgICAgICAgICAgUEJBbmltYXRpb25TdGF0ZS5lbmNvZGUodiwgd3JpdGVyLnVpbnQzMigxMCkuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbiAgICBQQkFuaW1hdG9yLmVuY29kZSA9IGVuY29kZTtcbiAgICBmdW5jdGlvbiBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIF9tMC5SZWFkZXIgPyBpbnB1dCA6IF9tMC5SZWFkZXIuY3JlYXRlKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlUEJBbmltYXRvcigpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDEwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnN0YXRlcy5wdXNoKFBCQW5pbWF0aW9uU3RhdGUuZGVjb2RlKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCh0YWcgJiA3KSA9PT0gNCB8fCB0YWcgPT09IDApIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgUEJBbmltYXRvci5kZWNvZGUgPSBkZWNvZGU7XG59KShQQkFuaW1hdG9yIHx8IChQQkFuaW1hdG9yID0ge30pKTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VQQkFuaW1hdGlvblN0YXRlKCkge1xuICAgIHJldHVybiB7IGNsaXA6IFwiXCIsIHBsYXlpbmc6IHVuZGVmaW5lZCwgd2VpZ2h0OiB1bmRlZmluZWQsIHNwZWVkOiB1bmRlZmluZWQsIGxvb3A6IHVuZGVmaW5lZCwgc2hvdWxkUmVzZXQ6IHVuZGVmaW5lZCB9O1xufVxuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB2YXIgUEJBbmltYXRpb25TdGF0ZTtcbihmdW5jdGlvbiAoUEJBbmltYXRpb25TdGF0ZSkge1xuICAgIGZ1bmN0aW9uIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBfbTAuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLmNsaXAgIT09IFwiXCIpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTgpLnN0cmluZyhtZXNzYWdlLmNsaXApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnBsYXlpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyNCkuYm9vbChtZXNzYWdlLnBsYXlpbmcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLndlaWdodCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDM3KS5mbG9hdChtZXNzYWdlLndlaWdodCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2Uuc3BlZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig0NSkuZmxvYXQobWVzc2FnZS5zcGVlZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UubG9vcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDQ4KS5ib29sKG1lc3NhZ2UubG9vcCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2Uuc2hvdWxkUmVzZXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig1NikuYm9vbChtZXNzYWdlLnNob3VsZFJlc2V0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbiAgICBQQkFuaW1hdGlvblN0YXRlLmVuY29kZSA9IGVuY29kZTtcbiAgICBmdW5jdGlvbiBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIF9tMC5SZWFkZXIgPyBpbnB1dCA6IF9tMC5SZWFkZXIuY3JlYXRlKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlUEJBbmltYXRpb25TdGF0ZSgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDE4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmNsaXAgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMjQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucGxheWluZyA9IHJlYWRlci5ib29sKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMzcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uud2VpZ2h0ID0gcmVhZGVyLmZsb2F0KCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gNDUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc3BlZWQgPSByZWFkZXIuZmxvYXQoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSA0OCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5sb29wID0gcmVhZGVyLmJvb2woKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSA1Nikge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zaG91bGRSZXNldCA9IHJlYWRlci5ib29sKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCh0YWcgJiA3KSA9PT0gNCB8fCB0YWcgPT09IDApIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgUEJBbmltYXRpb25TdGF0ZS5kZWNvZGUgPSBkZWNvZGU7XG59KShQQkFuaW1hdGlvblN0YXRlIHx8IChQQkFuaW1hdGlvblN0YXRlID0ge30pKTtcbiIsICJpbXBvcnQgeyBQQkFuaW1hdG9yIH0gZnJvbSAnLi9wYi9kZWNlbnRyYWxhbmQvc2RrL2NvbXBvbmVudHMvYW5pbWF0b3IuZ2VuJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBBbmltYXRvclNjaGVtYSA9IHtcbiAgICBDT01QT05FTlRfSUQ6IDEwNDIsXG4gICAgc2VyaWFsaXplKHZhbHVlLCBidWlsZGVyKSB7XG4gICAgICAgIGNvbnN0IHdyaXRlciA9IFBCQW5pbWF0b3IuZW5jb2RlKHZhbHVlKTtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkod3JpdGVyLmZpbmlzaCgpLCAwLCB3cml0ZXIubGVuKTtcbiAgICAgICAgYnVpbGRlci53cml0ZUJ1ZmZlcihidWZmZXIsIGZhbHNlKTtcbiAgICB9LFxuICAgIGRlc2VyaWFsaXplKHJlYWRlcikge1xuICAgICAgICByZXR1cm4gUEJBbmltYXRvci5kZWNvZGUocmVhZGVyLmJ1ZmZlcigpLCByZWFkZXIucmVtYWluaW5nQnl0ZXMoKSk7XG4gICAgfSxcbiAgICBjcmVhdGUoKSB7XG4gICAgICAgIC8vIFRPRE86IHRoaXMgaXMgYSBoYWNrLlxuICAgICAgICByZXR1cm4gUEJBbmltYXRvci5kZWNvZGUobmV3IFVpbnQ4QXJyYXkoKSk7XG4gICAgfSxcbiAgICBqc29uU2NoZW1hOiB7XG4gICAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgIHByb3BlcnRpZXM6IHt9LFxuICAgICAgICBzZXJpYWxpemF0aW9uVHlwZTogXCJwcm90b2NvbC1idWZmZXJcIixcbiAgICAgICAgcHJvdG9jb2xCdWZmZXI6IFwiUEJBbmltYXRvclwiXG4gICAgfVxufTtcbiIsICIvKiBlc2xpbnQtZGlzYWJsZSAqL1xuaW1wb3J0IF9tMCBmcm9tIFwicHJvdG9idWZqcy9taW5pbWFsXCI7XG5jb25zdCBwcm90b2J1ZlBhY2thZ2VTYXJhc2EgPSBcImRlY2VudHJhbGFuZC5zZGsuY29tcG9uZW50c1wiO1xuZnVuY3Rpb24gY3JlYXRlQmFzZVBCQXVkaW9Tb3VyY2UoKSB7XG4gICAgcmV0dXJuIHsgcGxheWluZzogdW5kZWZpbmVkLCB2b2x1bWU6IHVuZGVmaW5lZCwgbG9vcDogdW5kZWZpbmVkLCBwaXRjaDogdW5kZWZpbmVkLCBhdWRpb0NsaXBVcmw6IFwiXCIgfTtcbn1cbi8qKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdmFyIFBCQXVkaW9Tb3VyY2U7XG4oZnVuY3Rpb24gKFBCQXVkaW9Tb3VyY2UpIHtcbiAgICBmdW5jdGlvbiBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gX20wLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5wbGF5aW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkuYm9vbChtZXNzYWdlLnBsYXlpbmcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnZvbHVtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDIxKS5mbG9hdChtZXNzYWdlLnZvbHVtZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UubG9vcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDI0KS5ib29sKG1lc3NhZ2UubG9vcCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UucGl0Y2ggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigzNykuZmxvYXQobWVzc2FnZS5waXRjaCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuYXVkaW9DbGlwVXJsICE9PSBcIlwiKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDQyKS5zdHJpbmcobWVzc2FnZS5hdWRpb0NsaXBVcmwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxuICAgIFBCQXVkaW9Tb3VyY2UuZW5jb2RlID0gZW5jb2RlO1xuICAgIGZ1bmN0aW9uIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgX20wLlJlYWRlciA/IGlucHV0IDogX20wLlJlYWRlci5jcmVhdGUoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VQQkF1ZGlvU291cmNlKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gOCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5wbGF5aW5nID0gcmVhZGVyLmJvb2woKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSAyMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS52b2x1bWUgPSByZWFkZXIuZmxvYXQoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSAyNCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5sb29wID0gcmVhZGVyLmJvb2woKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSAzNykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5waXRjaCA9IHJlYWRlci5mbG9hdCgpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDQyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmF1ZGlvQ2xpcFVybCA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKHRhZyAmIDcpID09PSA0IHx8IHRhZyA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBQQkF1ZGlvU291cmNlLmRlY29kZSA9IGRlY29kZTtcbn0pKFBCQXVkaW9Tb3VyY2UgfHwgKFBCQXVkaW9Tb3VyY2UgPSB7fSkpO1xuIiwgImltcG9ydCB7IFBCQXVkaW9Tb3VyY2UgfSBmcm9tICcuL3BiL2RlY2VudHJhbGFuZC9zZGsvY29tcG9uZW50cy9hdWRpb19zb3VyY2UuZ2VuJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBBdWRpb1NvdXJjZVNjaGVtYSA9IHtcbiAgICBDT01QT05FTlRfSUQ6IDEwMjAsXG4gICAgc2VyaWFsaXplKHZhbHVlLCBidWlsZGVyKSB7XG4gICAgICAgIGNvbnN0IHdyaXRlciA9IFBCQXVkaW9Tb3VyY2UuZW5jb2RlKHZhbHVlKTtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkod3JpdGVyLmZpbmlzaCgpLCAwLCB3cml0ZXIubGVuKTtcbiAgICAgICAgYnVpbGRlci53cml0ZUJ1ZmZlcihidWZmZXIsIGZhbHNlKTtcbiAgICB9LFxuICAgIGRlc2VyaWFsaXplKHJlYWRlcikge1xuICAgICAgICByZXR1cm4gUEJBdWRpb1NvdXJjZS5kZWNvZGUocmVhZGVyLmJ1ZmZlcigpLCByZWFkZXIucmVtYWluaW5nQnl0ZXMoKSk7XG4gICAgfSxcbiAgICBjcmVhdGUoKSB7XG4gICAgICAgIC8vIFRPRE86IHRoaXMgaXMgYSBoYWNrLlxuICAgICAgICByZXR1cm4gUEJBdWRpb1NvdXJjZS5kZWNvZGUobmV3IFVpbnQ4QXJyYXkoKSk7XG4gICAgfSxcbiAgICBqc29uU2NoZW1hOiB7XG4gICAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgIHByb3BlcnRpZXM6IHt9LFxuICAgICAgICBzZXJpYWxpemF0aW9uVHlwZTogXCJwcm90b2NvbC1idWZmZXJcIixcbiAgICAgICAgcHJvdG9jb2xCdWZmZXI6IFwiUEJBdWRpb1NvdXJjZVwiXG4gICAgfVxufTtcbiIsICIvKiBlc2xpbnQtZGlzYWJsZSAqL1xuaW1wb3J0IF9tMCBmcm9tIFwicHJvdG9idWZqcy9taW5pbWFsXCI7XG5jb25zdCBwcm90b2J1ZlBhY2thZ2VTYXJhc2EgPSBcImRlY2VudHJhbGFuZC5zZGsuY29tcG9uZW50c1wiO1xuZnVuY3Rpb24gY3JlYXRlQmFzZVBCQXVkaW9TdHJlYW0oKSB7XG4gICAgcmV0dXJuIHsgcGxheWluZzogdW5kZWZpbmVkLCB2b2x1bWU6IHVuZGVmaW5lZCwgdXJsOiBcIlwiIH07XG59XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHZhciBQQkF1ZGlvU3RyZWFtO1xuKGZ1bmN0aW9uIChQQkF1ZGlvU3RyZWFtKSB7XG4gICAgZnVuY3Rpb24gZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IF9tMC5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UucGxheWluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgpLmJvb2wobWVzc2FnZS5wbGF5aW5nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS52b2x1bWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyMSkuZmxvYXQobWVzc2FnZS52b2x1bWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnVybCAhPT0gXCJcIikge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyNikuc3RyaW5nKG1lc3NhZ2UudXJsKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbiAgICBQQkF1ZGlvU3RyZWFtLmVuY29kZSA9IGVuY29kZTtcbiAgICBmdW5jdGlvbiBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIF9tMC5SZWFkZXIgPyBpbnB1dCA6IF9tMC5SZWFkZXIuY3JlYXRlKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlUEJBdWRpb1N0cmVhbSgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucGxheWluZyA9IHJlYWRlci5ib29sKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMjEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uudm9sdW1lID0gcmVhZGVyLmZsb2F0KCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMjYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudXJsID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgodGFnICYgNykgPT09IDQgfHwgdGFnID09PSAwKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIFBCQXVkaW9TdHJlYW0uZGVjb2RlID0gZGVjb2RlO1xufSkoUEJBdWRpb1N0cmVhbSB8fCAoUEJBdWRpb1N0cmVhbSA9IHt9KSk7XG4iLCAiaW1wb3J0IHsgUEJBdWRpb1N0cmVhbSB9IGZyb20gJy4vcGIvZGVjZW50cmFsYW5kL3Nkay9jb21wb25lbnRzL2F1ZGlvX3N0cmVhbS5nZW4nO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IEF1ZGlvU3RyZWFtU2NoZW1hID0ge1xuICAgIENPTVBPTkVOVF9JRDogMTAyMSxcbiAgICBzZXJpYWxpemUodmFsdWUsIGJ1aWxkZXIpIHtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gUEJBdWRpb1N0cmVhbS5lbmNvZGUodmFsdWUpO1xuICAgICAgICBjb25zdCBidWZmZXIgPSBuZXcgVWludDhBcnJheSh3cml0ZXIuZmluaXNoKCksIDAsIHdyaXRlci5sZW4pO1xuICAgICAgICBidWlsZGVyLndyaXRlQnVmZmVyKGJ1ZmZlciwgZmFsc2UpO1xuICAgIH0sXG4gICAgZGVzZXJpYWxpemUocmVhZGVyKSB7XG4gICAgICAgIHJldHVybiBQQkF1ZGlvU3RyZWFtLmRlY29kZShyZWFkZXIuYnVmZmVyKCksIHJlYWRlci5yZW1haW5pbmdCeXRlcygpKTtcbiAgICB9LFxuICAgIGNyZWF0ZSgpIHtcbiAgICAgICAgLy8gVE9ETzogdGhpcyBpcyBhIGhhY2suXG4gICAgICAgIHJldHVybiBQQkF1ZGlvU3RyZWFtLmRlY29kZShuZXcgVWludDhBcnJheSgpKTtcbiAgICB9LFxuICAgIGpzb25TY2hlbWE6IHtcbiAgICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgICAgcHJvcGVydGllczoge30sXG4gICAgICAgIHNlcmlhbGl6YXRpb25UeXBlOiBcInByb3RvY29sLWJ1ZmZlclwiLFxuICAgICAgICBwcm90b2NvbEJ1ZmZlcjogXCJQQkF1ZGlvU3RyZWFtXCJcbiAgICB9XG59O1xuIiwgIi8qIGVzbGludC1kaXNhYmxlICovXG5pbXBvcnQgX20wIGZyb20gXCJwcm90b2J1ZmpzL21pbmltYWxcIjtcbmNvbnN0IHByb3RvYnVmUGFja2FnZVNhcmFzYSA9IFwiZGVjZW50cmFsYW5kLnNkay5jb21wb25lbnRzXCI7XG4vKiogQXZhdGFyQW5jaG9yUG9pbnRUeXBlIGRldGVybWluZXMgdGhlIHBhcnQgb2YgdGhlIGF2YXRhcidzIGJvZHkgdGhhdCBhbmNob3JzIHRoZSBFbnRpdHkuICovXG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHZhciBBdmF0YXJBbmNob3JQb2ludFR5cGU7XG4oZnVuY3Rpb24gKEF2YXRhckFuY2hvclBvaW50VHlwZSkge1xuICAgIEF2YXRhckFuY2hvclBvaW50VHlwZVtBdmF0YXJBbmNob3JQb2ludFR5cGVbXCJBQVBUX1BPU0lUSU9OXCJdID0gMF0gPSBcIkFBUFRfUE9TSVRJT05cIjtcbiAgICBBdmF0YXJBbmNob3JQb2ludFR5cGVbQXZhdGFyQW5jaG9yUG9pbnRUeXBlW1wiQUFQVF9OQU1FX1RBR1wiXSA9IDFdID0gXCJBQVBUX05BTUVfVEFHXCI7XG4gICAgQXZhdGFyQW5jaG9yUG9pbnRUeXBlW0F2YXRhckFuY2hvclBvaW50VHlwZVtcIkFBUFRfTEVGVF9IQU5EXCJdID0gMl0gPSBcIkFBUFRfTEVGVF9IQU5EXCI7XG4gICAgQXZhdGFyQW5jaG9yUG9pbnRUeXBlW0F2YXRhckFuY2hvclBvaW50VHlwZVtcIkFBUFRfUklHSFRfSEFORFwiXSA9IDNdID0gXCJBQVBUX1JJR0hUX0hBTkRcIjtcbn0pKEF2YXRhckFuY2hvclBvaW50VHlwZSB8fCAoQXZhdGFyQW5jaG9yUG9pbnRUeXBlID0ge30pKTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VQQkF2YXRhckF0dGFjaCgpIHtcbiAgICByZXR1cm4geyBhdmF0YXJJZDogdW5kZWZpbmVkLCBhbmNob3JQb2ludElkOiAwIH07XG59XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHZhciBQQkF2YXRhckF0dGFjaDtcbihmdW5jdGlvbiAoUEJBdmF0YXJBdHRhY2gpIHtcbiAgICBmdW5jdGlvbiBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gX20wLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5hdmF0YXJJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDEwKS5zdHJpbmcobWVzc2FnZS5hdmF0YXJJZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuYW5jaG9yUG9pbnRJZCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxNikuaW50MzIobWVzc2FnZS5hbmNob3JQb2ludElkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbiAgICBQQkF2YXRhckF0dGFjaC5lbmNvZGUgPSBlbmNvZGU7XG4gICAgZnVuY3Rpb24gZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBfbTAuUmVhZGVyID8gaW5wdXQgOiBfbTAuUmVhZGVyLmNyZWF0ZShpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZVBCQXZhdGFyQXR0YWNoKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMTApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuYXZhdGFySWQgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMTYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuYW5jaG9yUG9pbnRJZCA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgodGFnICYgNykgPT09IDQgfHwgdGFnID09PSAwKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIFBCQXZhdGFyQXR0YWNoLmRlY29kZSA9IGRlY29kZTtcbn0pKFBCQXZhdGFyQXR0YWNoIHx8IChQQkF2YXRhckF0dGFjaCA9IHt9KSk7XG4iLCAiaW1wb3J0IHsgUEJBdmF0YXJBdHRhY2ggfSBmcm9tICcuL3BiL2RlY2VudHJhbGFuZC9zZGsvY29tcG9uZW50cy9hdmF0YXJfYXR0YWNoLmdlbic7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgQXZhdGFyQXR0YWNoU2NoZW1hID0ge1xuICAgIENPTVBPTkVOVF9JRDogMTA3MyxcbiAgICBzZXJpYWxpemUodmFsdWUsIGJ1aWxkZXIpIHtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gUEJBdmF0YXJBdHRhY2guZW5jb2RlKHZhbHVlKTtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkod3JpdGVyLmZpbmlzaCgpLCAwLCB3cml0ZXIubGVuKTtcbiAgICAgICAgYnVpbGRlci53cml0ZUJ1ZmZlcihidWZmZXIsIGZhbHNlKTtcbiAgICB9LFxuICAgIGRlc2VyaWFsaXplKHJlYWRlcikge1xuICAgICAgICByZXR1cm4gUEJBdmF0YXJBdHRhY2guZGVjb2RlKHJlYWRlci5idWZmZXIoKSwgcmVhZGVyLnJlbWFpbmluZ0J5dGVzKCkpO1xuICAgIH0sXG4gICAgY3JlYXRlKCkge1xuICAgICAgICAvLyBUT0RPOiB0aGlzIGlzIGEgaGFjay5cbiAgICAgICAgcmV0dXJuIFBCQXZhdGFyQXR0YWNoLmRlY29kZShuZXcgVWludDhBcnJheSgpKTtcbiAgICB9LFxuICAgIGpzb25TY2hlbWE6IHtcbiAgICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgICAgcHJvcGVydGllczoge30sXG4gICAgICAgIHNlcmlhbGl6YXRpb25UeXBlOiBcInByb3RvY29sLWJ1ZmZlclwiLFxuICAgICAgICBwcm90b2NvbEJ1ZmZlcjogXCJQQkF2YXRhckF0dGFjaFwiXG4gICAgfVxufTtcbiIsICIvKiBlc2xpbnQtZGlzYWJsZSAqL1xuaW1wb3J0IF9tMCBmcm9tIFwicHJvdG9idWZqcy9taW5pbWFsXCI7XG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSBcIi4uLy4uL2NvbW1vbi92ZWN0b3JzLmdlblwiO1xuY29uc3QgcHJvdG9idWZQYWNrYWdlU2FyYXNhID0gXCJkZWNlbnRyYWxhbmQuc2RrLmNvbXBvbmVudHNcIjtcbi8qKiBBdmF0YXJNb2RpZmllclR5cGUgaXMgYW4gZWZmZWN0IHRoYXQgc2hvdWxkIGJlIGFwcGxpZWQgdG8gYXZhdGFycyBpbnNpZGUgdGhlIHJlZ2lvbi4gKi9cbi8qKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdmFyIEF2YXRhck1vZGlmaWVyVHlwZTtcbihmdW5jdGlvbiAoQXZhdGFyTW9kaWZpZXJUeXBlKSB7XG4gICAgLyoqIEFNVF9ISURFX0FWQVRBUlMgLSBhdmF0YXJzIGFyZSBpbnZpc2libGUgKi9cbiAgICBBdmF0YXJNb2RpZmllclR5cGVbQXZhdGFyTW9kaWZpZXJUeXBlW1wiQU1UX0hJREVfQVZBVEFSU1wiXSA9IDBdID0gXCJBTVRfSElERV9BVkFUQVJTXCI7XG4gICAgLyoqIEFNVF9ESVNBQkxFX1BBU1NQT1JUUyAtIHNlbGVjdGluZyAoZS5nLiBjbGlja2luZykgYW4gYXZhdGFyIHdpbGwgbm90IGJyaW5nIHVwIHRoZWlyIHByb2ZpbGUuICovXG4gICAgQXZhdGFyTW9kaWZpZXJUeXBlW0F2YXRhck1vZGlmaWVyVHlwZVtcIkFNVF9ESVNBQkxFX1BBU1NQT1JUU1wiXSA9IDFdID0gXCJBTVRfRElTQUJMRV9QQVNTUE9SVFNcIjtcbn0pKEF2YXRhck1vZGlmaWVyVHlwZSB8fCAoQXZhdGFyTW9kaWZpZXJUeXBlID0ge30pKTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VQQkF2YXRhck1vZGlmaWVyQXJlYSgpIHtcbiAgICByZXR1cm4geyBhcmVhOiB1bmRlZmluZWQsIGV4Y2x1ZGVJZHM6IFtdLCBtb2RpZmllcnM6IFtdIH07XG59XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHZhciBQQkF2YXRhck1vZGlmaWVyQXJlYTtcbihmdW5jdGlvbiAoUEJBdmF0YXJNb2RpZmllckFyZWEpIHtcbiAgICBmdW5jdGlvbiBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gX20wLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5hcmVhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIFZlY3RvcjMuZW5jb2RlKG1lc3NhZ2UuYXJlYSwgd3JpdGVyLnVpbnQzMigxMCkuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHYgb2YgbWVzc2FnZS5leGNsdWRlSWRzKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE4KS5zdHJpbmcodik7XG4gICAgICAgIH1cbiAgICAgICAgd3JpdGVyLnVpbnQzMigyNikuZm9yaygpO1xuICAgICAgICBmb3IgKGNvbnN0IHYgb2YgbWVzc2FnZS5tb2RpZmllcnMpIHtcbiAgICAgICAgICAgIHdyaXRlci5pbnQzMih2KTtcbiAgICAgICAgfVxuICAgICAgICB3cml0ZXIubGRlbGltKCk7XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxuICAgIFBCQXZhdGFyTW9kaWZpZXJBcmVhLmVuY29kZSA9IGVuY29kZTtcbiAgICBmdW5jdGlvbiBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIF9tMC5SZWFkZXIgPyBpbnB1dCA6IF9tMC5SZWFkZXIuY3JlYXRlKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlUEJBdmF0YXJNb2RpZmllckFyZWEoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSAxMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5hcmVhID0gVmVjdG9yMy5kZWNvZGUocmVhZGVyLCByZWFkZXIudWludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDE4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmV4Y2x1ZGVJZHMucHVzaChyZWFkZXIuc3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgPT09IDI0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm1vZGlmaWVycy5wdXNoKHJlYWRlci5pbnQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgPT09IDI2KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmQyID0gcmVhZGVyLnVpbnQzMigpICsgcmVhZGVyLnBvcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubW9kaWZpZXJzLnB1c2gocmVhZGVyLmludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKHRhZyAmIDcpID09PSA0IHx8IHRhZyA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBQQkF2YXRhck1vZGlmaWVyQXJlYS5kZWNvZGUgPSBkZWNvZGU7XG59KShQQkF2YXRhck1vZGlmaWVyQXJlYSB8fCAoUEJBdmF0YXJNb2RpZmllckFyZWEgPSB7fSkpO1xuIiwgIi8qIGVzbGludC1kaXNhYmxlICovXG5pbXBvcnQgX20wIGZyb20gXCJwcm90b2J1ZmpzL21pbmltYWxcIjtcbmNvbnN0IHByb3RvYnVmUGFja2FnZVNhcmFzYSA9IFwiZGVjZW50cmFsYW5kLmNvbW1vblwiO1xuZnVuY3Rpb24gY3JlYXRlQmFzZVBvc2l0aW9uKCkge1xuICAgIHJldHVybiB7IHg6IDAsIHk6IDAsIHo6IDAgfTtcbn1cbi8qKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdmFyIFBvc2l0aW9uO1xuKGZ1bmN0aW9uIChQb3NpdGlvbikge1xuICAgIGZ1bmN0aW9uIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBfbTAuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLnggIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTMpLmZsb2F0KG1lc3NhZ2UueCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UueSAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyMSkuZmxvYXQobWVzc2FnZS55KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS56ICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDI5KS5mbG9hdChtZXNzYWdlLnopO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxuICAgIFBvc2l0aW9uLmVuY29kZSA9IGVuY29kZTtcbiAgICBmdW5jdGlvbiBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIF9tMC5SZWFkZXIgPyBpbnB1dCA6IF9tMC5SZWFkZXIuY3JlYXRlKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlUG9zaXRpb24oKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSAxMykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS54ID0gcmVhZGVyLmZsb2F0KCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMjEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UueSA9IHJlYWRlci5mbG9hdCgpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDI5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnogPSByZWFkZXIuZmxvYXQoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKHRhZyAmIDcpID09PSA0IHx8IHRhZyA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBQb3NpdGlvbi5kZWNvZGUgPSBkZWNvZGU7XG59KShQb3NpdGlvbiB8fCAoUG9zaXRpb24gPSB7fSkpO1xuZnVuY3Rpb24gY3JlYXRlQmFzZVZlY3RvcjMoKSB7XG4gICAgcmV0dXJuIHsgeDogMCwgeTogMCwgejogMCB9O1xufVxuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB2YXIgVmVjdG9yMztcbihmdW5jdGlvbiAoVmVjdG9yMykge1xuICAgIGZ1bmN0aW9uIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBfbTAuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLnggIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTMpLmZsb2F0KG1lc3NhZ2UueCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UueSAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyMSkuZmxvYXQobWVzc2FnZS55KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS56ICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDI5KS5mbG9hdChtZXNzYWdlLnopO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxuICAgIFZlY3RvcjMuZW5jb2RlID0gZW5jb2RlO1xuICAgIGZ1bmN0aW9uIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgX20wLlJlYWRlciA/IGlucHV0IDogX20wLlJlYWRlci5jcmVhdGUoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VWZWN0b3IzKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMTMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UueCA9IHJlYWRlci5mbG9hdCgpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDIxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnkgPSByZWFkZXIuZmxvYXQoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSAyOSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS56ID0gcmVhZGVyLmZsb2F0KCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCh0YWcgJiA3KSA9PT0gNCB8fCB0YWcgPT09IDApIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgVmVjdG9yMy5kZWNvZGUgPSBkZWNvZGU7XG59KShWZWN0b3IzIHx8IChWZWN0b3IzID0ge30pKTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VWZWN0b3IyKCkge1xuICAgIHJldHVybiB7IHg6IDAsIHk6IDAgfTtcbn1cbi8qKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdmFyIFZlY3RvcjI7XG4oZnVuY3Rpb24gKFZlY3RvcjIpIHtcbiAgICBmdW5jdGlvbiBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gX20wLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS54ICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDEzKS5mbG9hdChtZXNzYWdlLngpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnkgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMjEpLmZsb2F0KG1lc3NhZ2UueSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9XG4gICAgVmVjdG9yMi5lbmNvZGUgPSBlbmNvZGU7XG4gICAgZnVuY3Rpb24gZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBfbTAuUmVhZGVyID8gaW5wdXQgOiBfbTAuUmVhZGVyLmNyZWF0ZShpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZVZlY3RvcjIoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSAxMykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS54ID0gcmVhZGVyLmZsb2F0KCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMjEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UueSA9IHJlYWRlci5mbG9hdCgpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgodGFnICYgNykgPT09IDQgfHwgdGFnID09PSAwKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIFZlY3RvcjIuZGVjb2RlID0gZGVjb2RlO1xufSkoVmVjdG9yMiB8fCAoVmVjdG9yMiA9IHt9KSk7XG5mdW5jdGlvbiBjcmVhdGVCYXNlUXVhdGVybmlvbigpIHtcbiAgICByZXR1cm4geyB4OiAwLCB5OiAwLCB6OiAwLCB3OiAwIH07XG59XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHZhciBRdWF0ZXJuaW9uO1xuKGZ1bmN0aW9uIChRdWF0ZXJuaW9uKSB7XG4gICAgZnVuY3Rpb24gZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IF9tMC5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UueCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxMykuZmxvYXQobWVzc2FnZS54KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS55ICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDIxKS5mbG9hdChtZXNzYWdlLnkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnogIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMjkpLmZsb2F0KG1lc3NhZ2Uueik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UudyAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigzNykuZmxvYXQobWVzc2FnZS53KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbiAgICBRdWF0ZXJuaW9uLmVuY29kZSA9IGVuY29kZTtcbiAgICBmdW5jdGlvbiBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIF9tMC5SZWFkZXIgPyBpbnB1dCA6IF9tMC5SZWFkZXIuY3JlYXRlKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlUXVhdGVybmlvbigpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDEzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnggPSByZWFkZXIuZmxvYXQoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSAyMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS55ID0gcmVhZGVyLmZsb2F0KCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMjkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UueiA9IHJlYWRlci5mbG9hdCgpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDM3KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLncgPSByZWFkZXIuZmxvYXQoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKHRhZyAmIDcpID09PSA0IHx8IHRhZyA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBRdWF0ZXJuaW9uLmRlY29kZSA9IGRlY29kZTtcbn0pKFF1YXRlcm5pb24gfHwgKFF1YXRlcm5pb24gPSB7fSkpO1xuIiwgImltcG9ydCB7IFBCQXZhdGFyTW9kaWZpZXJBcmVhIH0gZnJvbSAnLi9wYi9kZWNlbnRyYWxhbmQvc2RrL2NvbXBvbmVudHMvYXZhdGFyX21vZGlmaWVyX2FyZWEuZ2VuJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBBdmF0YXJNb2RpZmllckFyZWFTY2hlbWEgPSB7XG4gICAgQ09NUE9ORU5UX0lEOiAxMDcwLFxuICAgIHNlcmlhbGl6ZSh2YWx1ZSwgYnVpbGRlcikge1xuICAgICAgICBjb25zdCB3cml0ZXIgPSBQQkF2YXRhck1vZGlmaWVyQXJlYS5lbmNvZGUodmFsdWUpO1xuICAgICAgICBjb25zdCBidWZmZXIgPSBuZXcgVWludDhBcnJheSh3cml0ZXIuZmluaXNoKCksIDAsIHdyaXRlci5sZW4pO1xuICAgICAgICBidWlsZGVyLndyaXRlQnVmZmVyKGJ1ZmZlciwgZmFsc2UpO1xuICAgIH0sXG4gICAgZGVzZXJpYWxpemUocmVhZGVyKSB7XG4gICAgICAgIHJldHVybiBQQkF2YXRhck1vZGlmaWVyQXJlYS5kZWNvZGUocmVhZGVyLmJ1ZmZlcigpLCByZWFkZXIucmVtYWluaW5nQnl0ZXMoKSk7XG4gICAgfSxcbiAgICBjcmVhdGUoKSB7XG4gICAgICAgIC8vIFRPRE86IHRoaXMgaXMgYSBoYWNrLlxuICAgICAgICByZXR1cm4gUEJBdmF0YXJNb2RpZmllckFyZWEuZGVjb2RlKG5ldyBVaW50OEFycmF5KCkpO1xuICAgIH0sXG4gICAganNvblNjaGVtYToge1xuICAgICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgICBwcm9wZXJ0aWVzOiB7fSxcbiAgICAgICAgc2VyaWFsaXphdGlvblR5cGU6IFwicHJvdG9jb2wtYnVmZmVyXCIsXG4gICAgICAgIHByb3RvY29sQnVmZmVyOiBcIlBCQXZhdGFyTW9kaWZpZXJBcmVhXCJcbiAgICB9XG59O1xuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDA5IFRoZSBDbG9zdXJlIExpYnJhcnkgQXV0aG9yc1xuICogQ29weXJpZ2h0IDIwMjAgRGFuaWVsIFdpcnR6IC8gVGhlIGxvbmcuanMgQXV0aG9ycy5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuXG4vLyBXZWJBc3NlbWJseSBvcHRpbWl6YXRpb25zIHRvIGRvIG5hdGl2ZSBpNjQgbXVsdGlwbGljYXRpb24gYW5kIGRpdmlkZVxudmFyIHdhc20gPSBudWxsO1xudHJ5IHtcbiAgd2FzbSA9IG5ldyBXZWJBc3NlbWJseS5JbnN0YW5jZShuZXcgV2ViQXNzZW1ibHkuTW9kdWxlKG5ldyBVaW50OEFycmF5KFtcbiAgICAwLCA5NywgMTE1LCAxMDksIDEsIDAsIDAsIDAsIDEsIDEzLCAyLCA5NiwgMCwgMSwgMTI3LCA5NiwgNCwgMTI3LCAxMjcsIDEyNywgMTI3LCAxLCAxMjcsIDMsIDcsIDYsIDAsIDEsIDEsIDEsIDEsIDEsIDYsIDYsIDEsIDEyNywgMSwgNjUsIDAsIDExLCA3LCA1MCwgNiwgMywgMTA5LCAxMTcsIDEwOCwgMCwgMSwgNSwgMTAwLCAxMDUsIDExOCwgOTUsIDExNSwgMCwgMiwgNSwgMTAwLCAxMDUsIDExOCwgOTUsIDExNywgMCwgMywgNSwgMTE0LCAxMDEsIDEwOSwgOTUsIDExNSwgMCwgNCwgNSwgMTE0LCAxMDEsIDEwOSwgOTUsIDExNywgMCwgNSwgOCwgMTAzLCAxMDEsIDExNiwgOTUsIDEwNCwgMTA1LCAxMDMsIDEwNCwgMCwgMCwgMTAsIDE5MSwgMSwgNiwgNCwgMCwgMzUsIDAsIDExLCAzNiwgMSwgMSwgMTI2LCAzMiwgMCwgMTczLCAzMiwgMSwgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAzMiwgMiwgMTczLCAzMiwgMywgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAxMjYsIDM0LCA0LCA2NiwgMzIsIDEzNSwgMTY3LCAzNiwgMCwgMzIsIDQsIDE2NywgMTEsIDM2LCAxLCAxLCAxMjYsIDMyLCAwLCAxNzMsIDMyLCAxLCAxNzMsIDY2LCAzMiwgMTM0LCAxMzIsIDMyLCAyLCAxNzMsIDMyLCAzLCAxNzMsIDY2LCAzMiwgMTM0LCAxMzIsIDEyNywgMzQsIDQsIDY2LCAzMiwgMTM1LCAxNjcsIDM2LCAwLCAzMiwgNCwgMTY3LCAxMSwgMzYsIDEsIDEsIDEyNiwgMzIsIDAsIDE3MywgMzIsIDEsIDE3MywgNjYsIDMyLCAxMzQsIDEzMiwgMzIsIDIsIDE3MywgMzIsIDMsIDE3MywgNjYsIDMyLCAxMzQsIDEzMiwgMTI4LCAzNCwgNCwgNjYsIDMyLCAxMzUsIDE2NywgMzYsIDAsIDMyLCA0LCAxNjcsIDExLCAzNiwgMSwgMSwgMTI2LCAzMiwgMCwgMTczLCAzMiwgMSwgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAzMiwgMiwgMTczLCAzMiwgMywgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAxMjksIDM0LCA0LCA2NiwgMzIsIDEzNSwgMTY3LCAzNiwgMCwgMzIsIDQsIDE2NywgMTEsIDM2LCAxLCAxLCAxMjYsIDMyLCAwLCAxNzMsIDMyLCAxLCAxNzMsIDY2LCAzMiwgMTM0LCAxMzIsIDMyLCAyLCAxNzMsIDMyLCAzLCAxNzMsIDY2LCAzMiwgMTM0LCAxMzIsIDEzMCwgMzQsIDQsIDY2LCAzMiwgMTM1LCAxNjcsIDM2LCAwLCAzMiwgNCwgMTY3LCAxMVxuICBdKSksIHt9KS5leHBvcnRzO1xufSBjYXRjaCAoZSkge1xuICAvLyBubyB3YXNtIHN1cHBvcnQgOihcbn1cblxuLyoqXG4gKiBDb25zdHJ1Y3RzIGEgNjQgYml0IHR3bydzLWNvbXBsZW1lbnQgaW50ZWdlciwgZ2l2ZW4gaXRzIGxvdyBhbmQgaGlnaCAzMiBiaXQgdmFsdWVzIGFzICpzaWduZWQqIGludGVnZXJzLlxuICogIFNlZSB0aGUgZnJvbSogZnVuY3Rpb25zIGJlbG93IGZvciBtb3JlIGNvbnZlbmllbnQgd2F5cyBvZiBjb25zdHJ1Y3RpbmcgTG9uZ3MuXG4gKiBAZXhwb3J0cyBMb25nXG4gKiBAY2xhc3MgQSBMb25nIGNsYXNzIGZvciByZXByZXNlbnRpbmcgYSA2NCBiaXQgdHdvJ3MtY29tcGxlbWVudCBpbnRlZ2VyIHZhbHVlLlxuICogQHBhcmFtIHtudW1iZXJ9IGxvdyBUaGUgbG93IChzaWduZWQpIDMyIGJpdHMgb2YgdGhlIGxvbmdcbiAqIEBwYXJhbSB7bnVtYmVyfSBoaWdoIFRoZSBoaWdoIChzaWduZWQpIDMyIGJpdHMgb2YgdGhlIGxvbmdcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkIFdoZXRoZXIgdW5zaWduZWQgb3Igbm90LCBkZWZhdWx0cyB0byBzaWduZWRcbiAqIEBjb25zdHJ1Y3RvclxuICovXG5mdW5jdGlvbiBMb25nKGxvdywgaGlnaCwgdW5zaWduZWQpIHtcblxuICAvKipcbiAgICogVGhlIGxvdyAzMiBiaXRzIGFzIGEgc2lnbmVkIHZhbHVlLlxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cbiAgdGhpcy5sb3cgPSBsb3cgfCAwO1xuXG4gIC8qKlxuICAgKiBUaGUgaGlnaCAzMiBiaXRzIGFzIGEgc2lnbmVkIHZhbHVlLlxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cbiAgdGhpcy5oaWdoID0gaGlnaCB8IDA7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdW5zaWduZWQgb3Igbm90LlxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICovXG4gIHRoaXMudW5zaWduZWQgPSAhIXVuc2lnbmVkO1xufVxuXG4vLyBUaGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgYSBsb25nIGlzIHRoZSB0d28gZ2l2ZW4gc2lnbmVkLCAzMi1iaXQgdmFsdWVzLlxuLy8gV2UgdXNlIDMyLWJpdCBwaWVjZXMgYmVjYXVzZSB0aGVzZSBhcmUgdGhlIHNpemUgb2YgaW50ZWdlcnMgb24gd2hpY2hcbi8vIEphdmFzY3JpcHQgcGVyZm9ybXMgYml0LW9wZXJhdGlvbnMuICBGb3Igb3BlcmF0aW9ucyBsaWtlIGFkZGl0aW9uIGFuZFxuLy8gbXVsdGlwbGljYXRpb24sIHdlIHNwbGl0IGVhY2ggbnVtYmVyIGludG8gMTYgYml0IHBpZWNlcywgd2hpY2ggY2FuIGVhc2lseSBiZVxuLy8gbXVsdGlwbGllZCB3aXRoaW4gSmF2YXNjcmlwdCdzIGZsb2F0aW5nLXBvaW50IHJlcHJlc2VudGF0aW9uIHdpdGhvdXQgb3ZlcmZsb3dcbi8vIG9yIGNoYW5nZSBpbiBzaWduLlxuLy9cbi8vIEluIHRoZSBhbGdvcml0aG1zIGJlbG93LCB3ZSBmcmVxdWVudGx5IHJlZHVjZSB0aGUgbmVnYXRpdmUgY2FzZSB0byB0aGVcbi8vIHBvc2l0aXZlIGNhc2UgYnkgbmVnYXRpbmcgdGhlIGlucHV0KHMpIGFuZCB0aGVuIHBvc3QtcHJvY2Vzc2luZyB0aGUgcmVzdWx0LlxuLy8gTm90ZSB0aGF0IHdlIG11c3QgQUxXQVlTIGNoZWNrIHNwZWNpYWxseSB3aGV0aGVyIHRob3NlIHZhbHVlcyBhcmUgTUlOX1ZBTFVFXG4vLyAoLTJeNjMpIGJlY2F1c2UgLU1JTl9WQUxVRSA9PSBNSU5fVkFMVUUgKHNpbmNlIDJeNjMgY2Fubm90IGJlIHJlcHJlc2VudGVkIGFzXG4vLyBhIHBvc2l0aXZlIG51bWJlciwgaXQgb3ZlcmZsb3dzIGJhY2sgaW50byBhIG5lZ2F0aXZlKS4gIE5vdCBoYW5kbGluZyB0aGlzXG4vLyBjYXNlIHdvdWxkIG9mdGVuIHJlc3VsdCBpbiBpbmZpbml0ZSByZWN1cnNpb24uXG4vL1xuLy8gQ29tbW9uIGNvbnN0YW50IHZhbHVlcyBaRVJPLCBPTkUsIE5FR19PTkUsIGV0Yy4gYXJlIGRlZmluZWQgYmVsb3cgdGhlIGZyb20qXG4vLyBtZXRob2RzIG9uIHdoaWNoIHRoZXkgZGVwZW5kLlxuXG4vKipcbiAqIEFuIGluZGljYXRvciB1c2VkIHRvIHJlbGlhYmx5IGRldGVybWluZSBpZiBhbiBvYmplY3QgaXMgYSBMb25nIG9yIG5vdC5cbiAqIEB0eXBlIHtib29sZWFufVxuICogQGNvbnN0XG4gKiBAcHJpdmF0ZVxuICovXG5Mb25nLnByb3RvdHlwZS5fX2lzTG9uZ19fO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoTG9uZy5wcm90b3R5cGUsIFwiX19pc0xvbmdfX1wiLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG4vKipcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHsqfSBvYmogT2JqZWN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqIEBpbm5lclxuICovXG5mdW5jdGlvbiBpc0xvbmcob2JqKSB7XG4gIHJldHVybiAob2JqICYmIG9ialtcIl9faXNMb25nX19cIl0pID09PSB0cnVlO1xufVxuXG4vKipcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHsqfSB2YWx1ZSBudW1iZXJcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKiBAaW5uZXJcbiAqL1xuZnVuY3Rpb24gY3R6MzIodmFsdWUpIHtcbiAgdmFyIGMgPSBNYXRoLmNsejMyKHZhbHVlICYgLXZhbHVlKTtcbiAgcmV0dXJuIHZhbHVlID8gMzEgLSBjIDogYztcbn1cblxuLyoqXG4gKiBUZXN0cyBpZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyBhIExvbmcuXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7Kn0gb2JqIE9iamVjdFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbkxvbmcuaXNMb25nID0gaXNMb25nO1xuXG4vKipcbiAqIEEgY2FjaGUgb2YgdGhlIExvbmcgcmVwcmVzZW50YXRpb25zIG9mIHNtYWxsIGludGVnZXIgdmFsdWVzLlxuICogQHR5cGUgeyFPYmplY3R9XG4gKiBAaW5uZXJcbiAqL1xudmFyIElOVF9DQUNIRSA9IHt9O1xuXG4vKipcbiAqIEEgY2FjaGUgb2YgdGhlIExvbmcgcmVwcmVzZW50YXRpb25zIG9mIHNtYWxsIHVuc2lnbmVkIGludGVnZXIgdmFsdWVzLlxuICogQHR5cGUgeyFPYmplY3R9XG4gKiBAaW5uZXJcbiAqL1xudmFyIFVJTlRfQ0FDSEUgPSB7fTtcblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkXG4gKiBAcmV0dXJucyB7IUxvbmd9XG4gKiBAaW5uZXJcbiAqL1xuZnVuY3Rpb24gZnJvbUludCh2YWx1ZSwgdW5zaWduZWQpIHtcbiAgdmFyIG9iaiwgY2FjaGVkT2JqLCBjYWNoZTtcbiAgaWYgKHVuc2lnbmVkKSB7XG4gICAgdmFsdWUgPj4+PSAwO1xuICAgIGlmIChjYWNoZSA9ICgwIDw9IHZhbHVlICYmIHZhbHVlIDwgMjU2KSkge1xuICAgICAgY2FjaGVkT2JqID0gVUlOVF9DQUNIRVt2YWx1ZV07XG4gICAgICBpZiAoY2FjaGVkT2JqKVxuICAgICAgICByZXR1cm4gY2FjaGVkT2JqO1xuICAgIH1cbiAgICBvYmogPSBmcm9tQml0cyh2YWx1ZSwgMCwgdHJ1ZSk7XG4gICAgaWYgKGNhY2hlKVxuICAgICAgVUlOVF9DQUNIRVt2YWx1ZV0gPSBvYmo7XG4gICAgcmV0dXJuIG9iajtcbiAgfSBlbHNlIHtcbiAgICB2YWx1ZSB8PSAwO1xuICAgIGlmIChjYWNoZSA9ICgtMTI4IDw9IHZhbHVlICYmIHZhbHVlIDwgMTI4KSkge1xuICAgICAgY2FjaGVkT2JqID0gSU5UX0NBQ0hFW3ZhbHVlXTtcbiAgICAgIGlmIChjYWNoZWRPYmopXG4gICAgICAgIHJldHVybiBjYWNoZWRPYmo7XG4gICAgfVxuICAgIG9iaiA9IGZyb21CaXRzKHZhbHVlLCB2YWx1ZSA8IDAgPyAtMSA6IDAsIGZhbHNlKTtcbiAgICBpZiAoY2FjaGUpXG4gICAgICBJTlRfQ0FDSEVbdmFsdWVdID0gb2JqO1xuICAgIHJldHVybiBvYmo7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgTG9uZyByZXByZXNlbnRpbmcgdGhlIGdpdmVuIDMyIGJpdCBpbnRlZ2VyIHZhbHVlLlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgVGhlIDMyIGJpdCBpbnRlZ2VyIGluIHF1ZXN0aW9uXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSB1bnNpZ25lZCBXaGV0aGVyIHVuc2lnbmVkIG9yIG5vdCwgZGVmYXVsdHMgdG8gc2lnbmVkXG4gKiBAcmV0dXJucyB7IUxvbmd9IFRoZSBjb3JyZXNwb25kaW5nIExvbmcgdmFsdWVcbiAqL1xuTG9uZy5mcm9tSW50ID0gZnJvbUludDtcblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkXG4gKiBAcmV0dXJucyB7IUxvbmd9XG4gKiBAaW5uZXJcbiAqL1xuZnVuY3Rpb24gZnJvbU51bWJlcih2YWx1ZSwgdW5zaWduZWQpIHtcbiAgaWYgKGlzTmFOKHZhbHVlKSlcbiAgICByZXR1cm4gdW5zaWduZWQgPyBVWkVSTyA6IFpFUk87XG4gIGlmICh1bnNpZ25lZCkge1xuICAgIGlmICh2YWx1ZSA8IDApXG4gICAgICByZXR1cm4gVVpFUk87XG4gICAgaWYgKHZhbHVlID49IFRXT19QV1JfNjRfREJMKVxuICAgICAgcmV0dXJuIE1BWF9VTlNJR05FRF9WQUxVRTtcbiAgfSBlbHNlIHtcbiAgICBpZiAodmFsdWUgPD0gLVRXT19QV1JfNjNfREJMKVxuICAgICAgcmV0dXJuIE1JTl9WQUxVRTtcbiAgICBpZiAodmFsdWUgKyAxID49IFRXT19QV1JfNjNfREJMKVxuICAgICAgcmV0dXJuIE1BWF9WQUxVRTtcbiAgfVxuICBpZiAodmFsdWUgPCAwKVxuICAgIHJldHVybiBmcm9tTnVtYmVyKC12YWx1ZSwgdW5zaWduZWQpLm5lZygpO1xuICByZXR1cm4gZnJvbUJpdHMoKHZhbHVlICUgVFdPX1BXUl8zMl9EQkwpIHwgMCwgKHZhbHVlIC8gVFdPX1BXUl8zMl9EQkwpIHwgMCwgdW5zaWduZWQpO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBMb25nIHJlcHJlc2VudGluZyB0aGUgZ2l2ZW4gdmFsdWUsIHByb3ZpZGVkIHRoYXQgaXQgaXMgYSBmaW5pdGUgbnVtYmVyLiBPdGhlcndpc2UsIHplcm8gaXMgcmV0dXJuZWQuXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSBUaGUgbnVtYmVyIGluIHF1ZXN0aW9uXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSB1bnNpZ25lZCBXaGV0aGVyIHVuc2lnbmVkIG9yIG5vdCwgZGVmYXVsdHMgdG8gc2lnbmVkXG4gKiBAcmV0dXJucyB7IUxvbmd9IFRoZSBjb3JyZXNwb25kaW5nIExvbmcgdmFsdWVcbiAqL1xuTG9uZy5mcm9tTnVtYmVyID0gZnJvbU51bWJlcjtcblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gbG93Qml0c1xuICogQHBhcmFtIHtudW1iZXJ9IGhpZ2hCaXRzXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSB1bnNpZ25lZFxuICogQHJldHVybnMgeyFMb25nfVxuICogQGlubmVyXG4gKi9cbmZ1bmN0aW9uIGZyb21CaXRzKGxvd0JpdHMsIGhpZ2hCaXRzLCB1bnNpZ25lZCkge1xuICByZXR1cm4gbmV3IExvbmcobG93Qml0cywgaGlnaEJpdHMsIHVuc2lnbmVkKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgTG9uZyByZXByZXNlbnRpbmcgdGhlIDY0IGJpdCBpbnRlZ2VyIHRoYXQgY29tZXMgYnkgY29uY2F0ZW5hdGluZyB0aGUgZ2l2ZW4gbG93IGFuZCBoaWdoIGJpdHMuIEVhY2ggaXNcbiAqICBhc3N1bWVkIHRvIHVzZSAzMiBiaXRzLlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge251bWJlcn0gbG93Qml0cyBUaGUgbG93IDMyIGJpdHNcbiAqIEBwYXJhbSB7bnVtYmVyfSBoaWdoQml0cyBUaGUgaGlnaCAzMiBiaXRzXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSB1bnNpZ25lZCBXaGV0aGVyIHVuc2lnbmVkIG9yIG5vdCwgZGVmYXVsdHMgdG8gc2lnbmVkXG4gKiBAcmV0dXJucyB7IUxvbmd9IFRoZSBjb3JyZXNwb25kaW5nIExvbmcgdmFsdWVcbiAqL1xuTG9uZy5mcm9tQml0cyA9IGZyb21CaXRzO1xuXG4vKipcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtudW1iZXJ9IGJhc2VcbiAqIEBwYXJhbSB7bnVtYmVyfSBleHBvbmVudFxuICogQHJldHVybnMge251bWJlcn1cbiAqIEBpbm5lclxuICovXG52YXIgcG93X2RibCA9IE1hdGgucG93OyAvLyBVc2VkIDQgdGltZXMgKDQqOCB0byAxNSs0KVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAqIEBwYXJhbSB7KGJvb2xlYW58bnVtYmVyKT19IHVuc2lnbmVkXG4gKiBAcGFyYW0ge251bWJlcj19IHJhZGl4XG4gKiBAcmV0dXJucyB7IUxvbmd9XG4gKiBAaW5uZXJcbiAqL1xuZnVuY3Rpb24gZnJvbVN0cmluZyhzdHIsIHVuc2lnbmVkLCByYWRpeCkge1xuICBpZiAoc3RyLmxlbmd0aCA9PT0gMClcbiAgICB0aHJvdyBFcnJvcignZW1wdHkgc3RyaW5nJyk7XG4gIGlmICh0eXBlb2YgdW5zaWduZWQgPT09ICdudW1iZXInKSB7XG4gICAgLy8gRm9yIGdvb2cubWF0aC5sb25nIGNvbXBhdGliaWxpdHlcbiAgICByYWRpeCA9IHVuc2lnbmVkO1xuICAgIHVuc2lnbmVkID0gZmFsc2U7XG4gIH0gZWxzZSB7XG4gICAgdW5zaWduZWQgPSAhIXVuc2lnbmVkO1xuICB9XG4gIGlmIChzdHIgPT09IFwiTmFOXCIgfHwgc3RyID09PSBcIkluZmluaXR5XCIgfHwgc3RyID09PSBcIitJbmZpbml0eVwiIHx8IHN0ciA9PT0gXCItSW5maW5pdHlcIilcbiAgICByZXR1cm4gdW5zaWduZWQgPyBVWkVSTyA6IFpFUk87XG4gIHJhZGl4ID0gcmFkaXggfHwgMTA7XG4gIGlmIChyYWRpeCA8IDIgfHwgMzYgPCByYWRpeClcbiAgICB0aHJvdyBSYW5nZUVycm9yKCdyYWRpeCcpO1xuXG4gIHZhciBwO1xuICBpZiAoKHAgPSBzdHIuaW5kZXhPZignLScpKSA+IDApXG4gICAgdGhyb3cgRXJyb3IoJ2ludGVyaW9yIGh5cGhlbicpO1xuICBlbHNlIGlmIChwID09PSAwKSB7XG4gICAgcmV0dXJuIGZyb21TdHJpbmcoc3RyLnN1YnN0cmluZygxKSwgdW5zaWduZWQsIHJhZGl4KS5uZWcoKTtcbiAgfVxuXG4gIC8vIERvIHNldmVyYWwgKDgpIGRpZ2l0cyBlYWNoIHRpbWUgdGhyb3VnaCB0aGUgbG9vcCwgc28gYXMgdG9cbiAgLy8gbWluaW1pemUgdGhlIGNhbGxzIHRvIHRoZSB2ZXJ5IGV4cGVuc2l2ZSBlbXVsYXRlZCBkaXYuXG4gIHZhciByYWRpeFRvUG93ZXIgPSBmcm9tTnVtYmVyKHBvd19kYmwocmFkaXgsIDgpKTtcblxuICB2YXIgcmVzdWx0ID0gWkVSTztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpICs9IDgpIHtcbiAgICB2YXIgc2l6ZSA9IE1hdGgubWluKDgsIHN0ci5sZW5ndGggLSBpKSxcbiAgICAgIHZhbHVlID0gcGFyc2VJbnQoc3RyLnN1YnN0cmluZyhpLCBpICsgc2l6ZSksIHJhZGl4KTtcbiAgICBpZiAoc2l6ZSA8IDgpIHtcbiAgICAgIHZhciBwb3dlciA9IGZyb21OdW1iZXIocG93X2RibChyYWRpeCwgc2l6ZSkpO1xuICAgICAgcmVzdWx0ID0gcmVzdWx0Lm11bChwb3dlcikuYWRkKGZyb21OdW1iZXIodmFsdWUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gcmVzdWx0Lm11bChyYWRpeFRvUG93ZXIpO1xuICAgICAgcmVzdWx0ID0gcmVzdWx0LmFkZChmcm9tTnVtYmVyKHZhbHVlKSk7XG4gICAgfVxuICB9XG4gIHJlc3VsdC51bnNpZ25lZCA9IHVuc2lnbmVkO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBMb25nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBzdHJpbmcsIHdyaXR0ZW4gdXNpbmcgdGhlIHNwZWNpZmllZCByYWRpeC5cbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtzdHJpbmd9IHN0ciBUaGUgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgTG9uZ1xuICogQHBhcmFtIHsoYm9vbGVhbnxudW1iZXIpPX0gdW5zaWduZWQgV2hldGhlciB1bnNpZ25lZCBvciBub3QsIGRlZmF1bHRzIHRvIHNpZ25lZFxuICogQHBhcmFtIHtudW1iZXI9fSByYWRpeCBUaGUgcmFkaXggaW4gd2hpY2ggdGhlIHRleHQgaXMgd3JpdHRlbiAoMi0zNiksIGRlZmF1bHRzIHRvIDEwXG4gKiBAcmV0dXJucyB7IUxvbmd9IFRoZSBjb3JyZXNwb25kaW5nIExvbmcgdmFsdWVcbiAqL1xuTG9uZy5mcm9tU3RyaW5nID0gZnJvbVN0cmluZztcblxuLyoqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ3whe2xvdzogbnVtYmVyLCBoaWdoOiBudW1iZXIsIHVuc2lnbmVkOiBib29sZWFufX0gdmFsXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSB1bnNpZ25lZFxuICogQHJldHVybnMgeyFMb25nfVxuICogQGlubmVyXG4gKi9cbmZ1bmN0aW9uIGZyb21WYWx1ZSh2YWwsIHVuc2lnbmVkKSB7XG4gIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJylcbiAgICByZXR1cm4gZnJvbU51bWJlcih2YWwsIHVuc2lnbmVkKTtcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKVxuICAgIHJldHVybiBmcm9tU3RyaW5nKHZhbCwgdW5zaWduZWQpO1xuICAvLyBUaHJvd3MgZm9yIG5vbi1vYmplY3RzLCBjb252ZXJ0cyBub24taW5zdGFuY2VvZiBMb25nOlxuICByZXR1cm4gZnJvbUJpdHModmFsLmxvdywgdmFsLmhpZ2gsIHR5cGVvZiB1bnNpZ25lZCA9PT0gJ2Jvb2xlYW4nID8gdW5zaWduZWQgOiB2YWwudW5zaWduZWQpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIHRoZSBzcGVjaWZpZWQgdmFsdWUgdG8gYSBMb25nIHVzaW5nIHRoZSBhcHByb3ByaWF0ZSBmcm9tKiBmdW5jdGlvbiBmb3IgaXRzIHR5cGUuXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ3whe2xvdzogbnVtYmVyLCBoaWdoOiBudW1iZXIsIHVuc2lnbmVkOiBib29sZWFufX0gdmFsIFZhbHVlXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSB1bnNpZ25lZCBXaGV0aGVyIHVuc2lnbmVkIG9yIG5vdCwgZGVmYXVsdHMgdG8gc2lnbmVkXG4gKiBAcmV0dXJucyB7IUxvbmd9XG4gKi9cbkxvbmcuZnJvbVZhbHVlID0gZnJvbVZhbHVlO1xuXG4vLyBOT1RFOiB0aGUgY29tcGlsZXIgc2hvdWxkIGlubGluZSB0aGVzZSBjb25zdGFudCB2YWx1ZXMgYmVsb3cgYW5kIHRoZW4gcmVtb3ZlIHRoZXNlIHZhcmlhYmxlcywgc28gdGhlcmUgc2hvdWxkIGJlXG4vLyBubyBydW50aW1lIHBlbmFsdHkgZm9yIHRoZXNlLlxuXG4vKipcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKiBAY29uc3RcbiAqIEBpbm5lclxuICovXG52YXIgVFdPX1BXUl8xNl9EQkwgPSAxIDw8IDE2O1xuXG4vKipcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKiBAY29uc3RcbiAqIEBpbm5lclxuICovXG52YXIgVFdPX1BXUl8yNF9EQkwgPSAxIDw8IDI0O1xuXG4vKipcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKiBAY29uc3RcbiAqIEBpbm5lclxuICovXG52YXIgVFdPX1BXUl8zMl9EQkwgPSBUV09fUFdSXzE2X0RCTCAqIFRXT19QV1JfMTZfREJMO1xuXG4vKipcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKiBAY29uc3RcbiAqIEBpbm5lclxuICovXG52YXIgVFdPX1BXUl82NF9EQkwgPSBUV09fUFdSXzMyX0RCTCAqIFRXT19QV1JfMzJfREJMO1xuXG4vKipcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKiBAY29uc3RcbiAqIEBpbm5lclxuICovXG52YXIgVFdPX1BXUl82M19EQkwgPSBUV09fUFdSXzY0X0RCTCAvIDI7XG5cbi8qKlxuICogQHR5cGUgeyFMb25nfVxuICogQGNvbnN0XG4gKiBAaW5uZXJcbiAqL1xudmFyIFRXT19QV1JfMjQgPSBmcm9tSW50KFRXT19QV1JfMjRfREJMKTtcblxuLyoqXG4gKiBAdHlwZSB7IUxvbmd9XG4gKiBAaW5uZXJcbiAqL1xudmFyIFpFUk8gPSBmcm9tSW50KDApO1xuXG4vKipcbiAqIFNpZ25lZCB6ZXJvLlxuICogQHR5cGUgeyFMb25nfVxuICovXG5Mb25nLlpFUk8gPSBaRVJPO1xuXG4vKipcbiAqIEB0eXBlIHshTG9uZ31cbiAqIEBpbm5lclxuICovXG52YXIgVVpFUk8gPSBmcm9tSW50KDAsIHRydWUpO1xuXG4vKipcbiAqIFVuc2lnbmVkIHplcm8uXG4gKiBAdHlwZSB7IUxvbmd9XG4gKi9cbkxvbmcuVVpFUk8gPSBVWkVSTztcblxuLyoqXG4gKiBAdHlwZSB7IUxvbmd9XG4gKiBAaW5uZXJcbiAqL1xudmFyIE9ORSA9IGZyb21JbnQoMSk7XG5cbi8qKlxuICogU2lnbmVkIG9uZS5cbiAqIEB0eXBlIHshTG9uZ31cbiAqL1xuTG9uZy5PTkUgPSBPTkU7XG5cbi8qKlxuICogQHR5cGUgeyFMb25nfVxuICogQGlubmVyXG4gKi9cbnZhciBVT05FID0gZnJvbUludCgxLCB0cnVlKTtcblxuLyoqXG4gKiBVbnNpZ25lZCBvbmUuXG4gKiBAdHlwZSB7IUxvbmd9XG4gKi9cbkxvbmcuVU9ORSA9IFVPTkU7XG5cbi8qKlxuICogQHR5cGUgeyFMb25nfVxuICogQGlubmVyXG4gKi9cbnZhciBORUdfT05FID0gZnJvbUludCgtMSk7XG5cbi8qKlxuICogU2lnbmVkIG5lZ2F0aXZlIG9uZS5cbiAqIEB0eXBlIHshTG9uZ31cbiAqL1xuTG9uZy5ORUdfT05FID0gTkVHX09ORTtcblxuLyoqXG4gKiBAdHlwZSB7IUxvbmd9XG4gKiBAaW5uZXJcbiAqL1xudmFyIE1BWF9WQUxVRSA9IGZyb21CaXRzKDB4RkZGRkZGRkYgfCAwLCAweDdGRkZGRkZGIHwgMCwgZmFsc2UpO1xuXG4vKipcbiAqIE1heGltdW0gc2lnbmVkIHZhbHVlLlxuICogQHR5cGUgeyFMb25nfVxuICovXG5Mb25nLk1BWF9WQUxVRSA9IE1BWF9WQUxVRTtcblxuLyoqXG4gKiBAdHlwZSB7IUxvbmd9XG4gKiBAaW5uZXJcbiAqL1xudmFyIE1BWF9VTlNJR05FRF9WQUxVRSA9IGZyb21CaXRzKDB4RkZGRkZGRkYgfCAwLCAweEZGRkZGRkZGIHwgMCwgdHJ1ZSk7XG5cbi8qKlxuICogTWF4aW11bSB1bnNpZ25lZCB2YWx1ZS5cbiAqIEB0eXBlIHshTG9uZ31cbiAqL1xuTG9uZy5NQVhfVU5TSUdORURfVkFMVUUgPSBNQVhfVU5TSUdORURfVkFMVUU7XG5cbi8qKlxuICogQHR5cGUgeyFMb25nfVxuICogQGlubmVyXG4gKi9cbnZhciBNSU5fVkFMVUUgPSBmcm9tQml0cygwLCAweDgwMDAwMDAwIHwgMCwgZmFsc2UpO1xuXG4vKipcbiAqIE1pbmltdW0gc2lnbmVkIHZhbHVlLlxuICogQHR5cGUgeyFMb25nfVxuICovXG5Mb25nLk1JTl9WQUxVRSA9IE1JTl9WQUxVRTtcblxuLyoqXG4gKiBAYWxpYXMgTG9uZy5wcm90b3R5cGVcbiAqIEBpbm5lclxuICovXG52YXIgTG9uZ1Byb3RvdHlwZSA9IExvbmcucHJvdG90eXBlO1xuXG4vKipcbiAqIENvbnZlcnRzIHRoZSBMb25nIHRvIGEgMzIgYml0IGludGVnZXIsIGFzc3VtaW5nIGl0IGlzIGEgMzIgYml0IGludGVnZXIuXG4gKiBAdGhpcyB7IUxvbmd9XG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5Mb25nUHJvdG90eXBlLnRvSW50ID0gZnVuY3Rpb24gdG9JbnQoKSB7XG4gIHJldHVybiB0aGlzLnVuc2lnbmVkID8gdGhpcy5sb3cgPj4+IDAgOiB0aGlzLmxvdztcbn07XG5cbi8qKlxuICogQ29udmVydHMgdGhlIExvbmcgdG8gYSB0aGUgbmVhcmVzdCBmbG9hdGluZy1wb2ludCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHZhbHVlIChkb3VibGUsIDUzIGJpdCBtYW50aXNzYSkuXG4gKiBAdGhpcyB7IUxvbmd9XG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5Mb25nUHJvdG90eXBlLnRvTnVtYmVyID0gZnVuY3Rpb24gdG9OdW1iZXIoKSB7XG4gIGlmICh0aGlzLnVuc2lnbmVkKVxuICAgIHJldHVybiAoKHRoaXMuaGlnaCA+Pj4gMCkgKiBUV09fUFdSXzMyX0RCTCkgKyAodGhpcy5sb3cgPj4+IDApO1xuICByZXR1cm4gdGhpcy5oaWdoICogVFdPX1BXUl8zMl9EQkwgKyAodGhpcy5sb3cgPj4+IDApO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyB0aGUgTG9uZyB0byBhIHN0cmluZyB3cml0dGVuIGluIHRoZSBzcGVjaWZpZWQgcmFkaXguXG4gKiBAdGhpcyB7IUxvbmd9XG4gKiBAcGFyYW0ge251bWJlcj19IHJhZGl4IFJhZGl4ICgyLTM2KSwgZGVmYXVsdHMgdG8gMTBcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKiBAb3ZlcnJpZGVcbiAqIEB0aHJvd3Mge1JhbmdlRXJyb3J9IElmIGByYWRpeGAgaXMgb3V0IG9mIHJhbmdlXG4gKi9cbkxvbmdQcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyhyYWRpeCkge1xuICByYWRpeCA9IHJhZGl4IHx8IDEwO1xuICBpZiAocmFkaXggPCAyIHx8IDM2IDwgcmFkaXgpXG4gICAgdGhyb3cgUmFuZ2VFcnJvcigncmFkaXgnKTtcbiAgaWYgKHRoaXMuaXNaZXJvKCkpXG4gICAgcmV0dXJuICcwJztcbiAgaWYgKHRoaXMuaXNOZWdhdGl2ZSgpKSB7IC8vIFVuc2lnbmVkIExvbmdzIGFyZSBuZXZlciBuZWdhdGl2ZVxuICAgIGlmICh0aGlzLmVxKE1JTl9WQUxVRSkpIHtcbiAgICAgIC8vIFdlIG5lZWQgdG8gY2hhbmdlIHRoZSBMb25nIHZhbHVlIGJlZm9yZSBpdCBjYW4gYmUgbmVnYXRlZCwgc28gd2UgcmVtb3ZlXG4gICAgICAvLyB0aGUgYm90dG9tLW1vc3QgZGlnaXQgaW4gdGhpcyBiYXNlIGFuZCB0aGVuIHJlY3Vyc2UgdG8gZG8gdGhlIHJlc3QuXG4gICAgICB2YXIgcmFkaXhMb25nID0gZnJvbU51bWJlcihyYWRpeCksXG4gICAgICAgIGRpdiA9IHRoaXMuZGl2KHJhZGl4TG9uZyksXG4gICAgICAgIHJlbTEgPSBkaXYubXVsKHJhZGl4TG9uZykuc3ViKHRoaXMpO1xuICAgICAgcmV0dXJuIGRpdi50b1N0cmluZyhyYWRpeCkgKyByZW0xLnRvSW50KCkudG9TdHJpbmcocmFkaXgpO1xuICAgIH0gZWxzZVxuICAgICAgcmV0dXJuICctJyArIHRoaXMubmVnKCkudG9TdHJpbmcocmFkaXgpO1xuICB9XG5cbiAgLy8gRG8gc2V2ZXJhbCAoNikgZGlnaXRzIGVhY2ggdGltZSB0aHJvdWdoIHRoZSBsb29wLCBzbyBhcyB0b1xuICAvLyBtaW5pbWl6ZSB0aGUgY2FsbHMgdG8gdGhlIHZlcnkgZXhwZW5zaXZlIGVtdWxhdGVkIGRpdi5cbiAgdmFyIHJhZGl4VG9Qb3dlciA9IGZyb21OdW1iZXIocG93X2RibChyYWRpeCwgNiksIHRoaXMudW5zaWduZWQpLFxuICAgIHJlbSA9IHRoaXM7XG4gIHZhciByZXN1bHQgPSAnJztcbiAgd2hpbGUgKHRydWUpIHtcbiAgICB2YXIgcmVtRGl2ID0gcmVtLmRpdihyYWRpeFRvUG93ZXIpLFxuICAgICAgaW50dmFsID0gcmVtLnN1YihyZW1EaXYubXVsKHJhZGl4VG9Qb3dlcikpLnRvSW50KCkgPj4+IDAsXG4gICAgICBkaWdpdHMgPSBpbnR2YWwudG9TdHJpbmcocmFkaXgpO1xuICAgIHJlbSA9IHJlbURpdjtcbiAgICBpZiAocmVtLmlzWmVybygpKVxuICAgICAgcmV0dXJuIGRpZ2l0cyArIHJlc3VsdDtcbiAgICBlbHNlIHtcbiAgICAgIHdoaWxlIChkaWdpdHMubGVuZ3RoIDwgNilcbiAgICAgICAgZGlnaXRzID0gJzAnICsgZGlnaXRzO1xuICAgICAgcmVzdWx0ID0gJycgKyBkaWdpdHMgKyByZXN1bHQ7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIEdldHMgdGhlIGhpZ2ggMzIgYml0cyBhcyBhIHNpZ25lZCBpbnRlZ2VyLlxuICogQHRoaXMgeyFMb25nfVxuICogQHJldHVybnMge251bWJlcn0gU2lnbmVkIGhpZ2ggYml0c1xuICovXG5Mb25nUHJvdG90eXBlLmdldEhpZ2hCaXRzID0gZnVuY3Rpb24gZ2V0SGlnaEJpdHMoKSB7XG4gIHJldHVybiB0aGlzLmhpZ2g7XG59O1xuXG4vKipcbiAqIEdldHMgdGhlIGhpZ2ggMzIgYml0cyBhcyBhbiB1bnNpZ25lZCBpbnRlZ2VyLlxuICogQHRoaXMgeyFMb25nfVxuICogQHJldHVybnMge251bWJlcn0gVW5zaWduZWQgaGlnaCBiaXRzXG4gKi9cbkxvbmdQcm90b3R5cGUuZ2V0SGlnaEJpdHNVbnNpZ25lZCA9IGZ1bmN0aW9uIGdldEhpZ2hCaXRzVW5zaWduZWQoKSB7XG4gIHJldHVybiB0aGlzLmhpZ2ggPj4+IDA7XG59O1xuXG4vKipcbiAqIEdldHMgdGhlIGxvdyAzMiBiaXRzIGFzIGEgc2lnbmVkIGludGVnZXIuXG4gKiBAdGhpcyB7IUxvbmd9XG4gKiBAcmV0dXJucyB7bnVtYmVyfSBTaWduZWQgbG93IGJpdHNcbiAqL1xuTG9uZ1Byb3RvdHlwZS5nZXRMb3dCaXRzID0gZnVuY3Rpb24gZ2V0TG93Qml0cygpIHtcbiAgcmV0dXJuIHRoaXMubG93O1xufTtcblxuLyoqXG4gKiBHZXRzIHRoZSBsb3cgMzIgYml0cyBhcyBhbiB1bnNpZ25lZCBpbnRlZ2VyLlxuICogQHRoaXMgeyFMb25nfVxuICogQHJldHVybnMge251bWJlcn0gVW5zaWduZWQgbG93IGJpdHNcbiAqL1xuTG9uZ1Byb3RvdHlwZS5nZXRMb3dCaXRzVW5zaWduZWQgPSBmdW5jdGlvbiBnZXRMb3dCaXRzVW5zaWduZWQoKSB7XG4gIHJldHVybiB0aGlzLmxvdyA+Pj4gMDtcbn07XG5cbi8qKlxuICogR2V0cyB0aGUgbnVtYmVyIG9mIGJpdHMgbmVlZGVkIHRvIHJlcHJlc2VudCB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhpcyBMb25nLlxuICogQHRoaXMgeyFMb25nfVxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuTG9uZ1Byb3RvdHlwZS5nZXROdW1CaXRzQWJzID0gZnVuY3Rpb24gZ2V0TnVtQml0c0FicygpIHtcbiAgaWYgKHRoaXMuaXNOZWdhdGl2ZSgpKSAvLyBVbnNpZ25lZCBMb25ncyBhcmUgbmV2ZXIgbmVnYXRpdmVcbiAgICByZXR1cm4gdGhpcy5lcShNSU5fVkFMVUUpID8gNjQgOiB0aGlzLm5lZygpLmdldE51bUJpdHNBYnMoKTtcbiAgdmFyIHZhbCA9IHRoaXMuaGlnaCAhPSAwID8gdGhpcy5oaWdoIDogdGhpcy5sb3c7XG4gIGZvciAodmFyIGJpdCA9IDMxOyBiaXQgPiAwOyBiaXQtLSlcbiAgICBpZiAoKHZhbCAmICgxIDw8IGJpdCkpICE9IDApXG4gICAgICBicmVhaztcbiAgcmV0dXJuIHRoaXMuaGlnaCAhPSAwID8gYml0ICsgMzMgOiBiaXQgKyAxO1xufTtcblxuLyoqXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBlcXVhbHMgemVyby5cbiAqIEB0aGlzIHshTG9uZ31cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5Mb25nUHJvdG90eXBlLmlzWmVybyA9IGZ1bmN0aW9uIGlzWmVybygpIHtcbiAgcmV0dXJuIHRoaXMuaGlnaCA9PT0gMCAmJiB0aGlzLmxvdyA9PT0gMDtcbn07XG5cbi8qKlxuICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgZXF1YWxzIHplcm8uIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjaXNaZXJvfS5cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5Mb25nUHJvdG90eXBlLmVxeiA9IExvbmdQcm90b3R5cGUuaXNaZXJvO1xuXG4vKipcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIG5lZ2F0aXZlLlxuICogQHRoaXMgeyFMb25nfVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbkxvbmdQcm90b3R5cGUuaXNOZWdhdGl2ZSA9IGZ1bmN0aW9uIGlzTmVnYXRpdmUoKSB7XG4gIHJldHVybiAhdGhpcy51bnNpZ25lZCAmJiB0aGlzLmhpZ2ggPCAwO1xufTtcblxuLyoqXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBwb3NpdGl2ZSBvciB6ZXJvLlxuICogQHRoaXMgeyFMb25nfVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbkxvbmdQcm90b3R5cGUuaXNQb3NpdGl2ZSA9IGZ1bmN0aW9uIGlzUG9zaXRpdmUoKSB7XG4gIHJldHVybiB0aGlzLnVuc2lnbmVkIHx8IHRoaXMuaGlnaCA+PSAwO1xufTtcblxuLyoqXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBvZGQuXG4gKiBAdGhpcyB7IUxvbmd9XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuTG9uZ1Byb3RvdHlwZS5pc09kZCA9IGZ1bmN0aW9uIGlzT2RkKCkge1xuICByZXR1cm4gKHRoaXMubG93ICYgMSkgPT09IDE7XG59O1xuXG4vKipcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIGV2ZW4uXG4gKiBAdGhpcyB7IUxvbmd9XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuTG9uZ1Byb3RvdHlwZS5pc0V2ZW4gPSBmdW5jdGlvbiBpc0V2ZW4oKSB7XG4gIHJldHVybiAodGhpcy5sb3cgJiAxKSA9PT0gMDtcbn07XG5cbi8qKlxuICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgZXF1YWxzIHRoZSBzcGVjaWZpZWQncy5cbiAqIEB0aGlzIHshTG9uZ31cbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5Mb25nUHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyhvdGhlcikge1xuICBpZiAoIWlzTG9uZyhvdGhlcikpXG4gICAgb3RoZXIgPSBmcm9tVmFsdWUob3RoZXIpO1xuICBpZiAodGhpcy51bnNpZ25lZCAhPT0gb3RoZXIudW5zaWduZWQgJiYgKHRoaXMuaGlnaCA+Pj4gMzEpID09PSAxICYmIChvdGhlci5oaWdoID4+PiAzMSkgPT09IDEpXG4gICAgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gdGhpcy5oaWdoID09PSBvdGhlci5oaWdoICYmIHRoaXMubG93ID09PSBvdGhlci5sb3c7XG59O1xuXG4vKipcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGVxdWFscyB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjZXF1YWxzfS5cbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbkxvbmdQcm90b3R5cGUuZXEgPSBMb25nUHJvdG90eXBlLmVxdWFscztcblxuLyoqXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBkaWZmZXJzIGZyb20gdGhlIHNwZWNpZmllZCdzLlxuICogQHRoaXMgeyFMb25nfVxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbkxvbmdQcm90b3R5cGUubm90RXF1YWxzID0gZnVuY3Rpb24gbm90RXF1YWxzKG90aGVyKSB7XG4gIHJldHVybiAhdGhpcy5lcSgvKiB2YWxpZGF0ZXMgKi8gb3RoZXIpO1xufTtcblxuLyoqXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBkaWZmZXJzIGZyb20gdGhlIHNwZWNpZmllZCdzLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI25vdEVxdWFsc30uXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5Mb25nUHJvdG90eXBlLm5lcSA9IExvbmdQcm90b3R5cGUubm90RXF1YWxzO1xuXG4vKipcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGRpZmZlcnMgZnJvbSB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjbm90RXF1YWxzfS5cbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbkxvbmdQcm90b3R5cGUubmUgPSBMb25nUHJvdG90eXBlLm5vdEVxdWFscztcblxuLyoqXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBsZXNzIHRoYW4gdGhlIHNwZWNpZmllZCdzLlxuICogQHRoaXMgeyFMb25nfVxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbkxvbmdQcm90b3R5cGUubGVzc1RoYW4gPSBmdW5jdGlvbiBsZXNzVGhhbihvdGhlcikge1xuICByZXR1cm4gdGhpcy5jb21wKC8qIHZhbGlkYXRlcyAqLyBvdGhlcikgPCAwO1xufTtcblxuLyoqXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBsZXNzIHRoYW4gdGhlIHNwZWNpZmllZCdzLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI2xlc3NUaGFufS5cbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbkxvbmdQcm90b3R5cGUubHQgPSBMb25nUHJvdG90eXBlLmxlc3NUaGFuO1xuXG4vKipcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0aGUgc3BlY2lmaWVkJ3MuXG4gKiBAdGhpcyB7IUxvbmd9XG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuTG9uZ1Byb3RvdHlwZS5sZXNzVGhhbk9yRXF1YWwgPSBmdW5jdGlvbiBsZXNzVGhhbk9yRXF1YWwob3RoZXIpIHtcbiAgcmV0dXJuIHRoaXMuY29tcCgvKiB2YWxpZGF0ZXMgKi8gb3RoZXIpIDw9IDA7XG59O1xuXG4vKipcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjbGVzc1RoYW5PckVxdWFsfS5cbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbkxvbmdQcm90b3R5cGUubHRlID0gTG9uZ1Byb3RvdHlwZS5sZXNzVGhhbk9yRXF1YWw7XG5cbi8qKlxuICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRoZSBzcGVjaWZpZWQncy4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNsZXNzVGhhbk9yRXF1YWx9LlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuTG9uZ1Byb3RvdHlwZS5sZSA9IExvbmdQcm90b3R5cGUubGVzc1RoYW5PckVxdWFsO1xuXG4vKipcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkJ3MuXG4gKiBAdGhpcyB7IUxvbmd9XG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuTG9uZ1Byb3RvdHlwZS5ncmVhdGVyVGhhbiA9IGZ1bmN0aW9uIGdyZWF0ZXJUaGFuKG90aGVyKSB7XG4gIHJldHVybiB0aGlzLmNvbXAoLyogdmFsaWRhdGVzICovIG90aGVyKSA+IDA7XG59O1xuXG4vKipcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjZ3JlYXRlclRoYW59LlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuTG9uZ1Byb3RvdHlwZS5ndCA9IExvbmdQcm90b3R5cGUuZ3JlYXRlclRoYW47XG5cbi8qKlxuICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRoZSBzcGVjaWZpZWQncy5cbiAqIEB0aGlzIHshTG9uZ31cbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5Mb25nUHJvdG90eXBlLmdyZWF0ZXJUaGFuT3JFcXVhbCA9IGZ1bmN0aW9uIGdyZWF0ZXJUaGFuT3JFcXVhbChvdGhlcikge1xuICByZXR1cm4gdGhpcy5jb21wKC8qIHZhbGlkYXRlcyAqLyBvdGhlcikgPj0gMDtcbn07XG5cbi8qKlxuICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRoZSBzcGVjaWZpZWQncy4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNncmVhdGVyVGhhbk9yRXF1YWx9LlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuTG9uZ1Byb3RvdHlwZS5ndGUgPSBMb25nUHJvdG90eXBlLmdyZWF0ZXJUaGFuT3JFcXVhbDtcblxuLyoqXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdGhlIHNwZWNpZmllZCdzLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI2dyZWF0ZXJUaGFuT3JFcXVhbH0uXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5Mb25nUHJvdG90eXBlLmdlID0gTG9uZ1Byb3RvdHlwZS5ncmVhdGVyVGhhbk9yRXF1YWw7XG5cbi8qKlxuICogQ29tcGFyZXMgdGhpcyBMb25nJ3MgdmFsdWUgd2l0aCB0aGUgc3BlY2lmaWVkJ3MuXG4gKiBAdGhpcyB7IUxvbmd9XG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXG4gKiBAcmV0dXJucyB7bnVtYmVyfSAwIGlmIHRoZXkgYXJlIHRoZSBzYW1lLCAxIGlmIHRoZSB0aGlzIGlzIGdyZWF0ZXIgYW5kIC0xXG4gKiAgaWYgdGhlIGdpdmVuIG9uZSBpcyBncmVhdGVyXG4gKi9cbkxvbmdQcm90b3R5cGUuY29tcGFyZSA9IGZ1bmN0aW9uIGNvbXBhcmUob3RoZXIpIHtcbiAgaWYgKCFpc0xvbmcob3RoZXIpKVxuICAgIG90aGVyID0gZnJvbVZhbHVlKG90aGVyKTtcbiAgaWYgKHRoaXMuZXEob3RoZXIpKVxuICAgIHJldHVybiAwO1xuICB2YXIgdGhpc05lZyA9IHRoaXMuaXNOZWdhdGl2ZSgpLFxuICAgIG90aGVyTmVnID0gb3RoZXIuaXNOZWdhdGl2ZSgpO1xuICBpZiAodGhpc05lZyAmJiAhb3RoZXJOZWcpXG4gICAgcmV0dXJuIC0xO1xuICBpZiAoIXRoaXNOZWcgJiYgb3RoZXJOZWcpXG4gICAgcmV0dXJuIDE7XG4gIC8vIEF0IHRoaXMgcG9pbnQgdGhlIHNpZ24gYml0cyBhcmUgdGhlIHNhbWVcbiAgaWYgKCF0aGlzLnVuc2lnbmVkKVxuICAgIHJldHVybiB0aGlzLnN1YihvdGhlcikuaXNOZWdhdGl2ZSgpID8gLTEgOiAxO1xuICAvLyBCb3RoIGFyZSBwb3NpdGl2ZSBpZiBhdCBsZWFzdCBvbmUgaXMgdW5zaWduZWRcbiAgcmV0dXJuIChvdGhlci5oaWdoID4+PiAwKSA+ICh0aGlzLmhpZ2ggPj4+IDApIHx8IChvdGhlci5oaWdoID09PSB0aGlzLmhpZ2ggJiYgKG90aGVyLmxvdyA+Pj4gMCkgPiAodGhpcy5sb3cgPj4+IDApKSA/IC0xIDogMTtcbn07XG5cbi8qKlxuICogQ29tcGFyZXMgdGhpcyBMb25nJ3MgdmFsdWUgd2l0aCB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjY29tcGFyZX0uXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcbiAqIEByZXR1cm5zIHtudW1iZXJ9IDAgaWYgdGhleSBhcmUgdGhlIHNhbWUsIDEgaWYgdGhlIHRoaXMgaXMgZ3JlYXRlciBhbmQgLTFcbiAqICBpZiB0aGUgZ2l2ZW4gb25lIGlzIGdyZWF0ZXJcbiAqL1xuTG9uZ1Byb3RvdHlwZS5jb21wID0gTG9uZ1Byb3RvdHlwZS5jb21wYXJlO1xuXG4vKipcbiAqIE5lZ2F0ZXMgdGhpcyBMb25nJ3MgdmFsdWUuXG4gKiBAdGhpcyB7IUxvbmd9XG4gKiBAcmV0dXJucyB7IUxvbmd9IE5lZ2F0ZWQgTG9uZ1xuICovXG5Mb25nUHJvdG90eXBlLm5lZ2F0ZSA9IGZ1bmN0aW9uIG5lZ2F0ZSgpIHtcbiAgaWYgKCF0aGlzLnVuc2lnbmVkICYmIHRoaXMuZXEoTUlOX1ZBTFVFKSlcbiAgICByZXR1cm4gTUlOX1ZBTFVFO1xuICByZXR1cm4gdGhpcy5ub3QoKS5hZGQoT05FKTtcbn07XG5cbi8qKlxuICogTmVnYXRlcyB0aGlzIExvbmcncyB2YWx1ZS4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNuZWdhdGV9LlxuICogQGZ1bmN0aW9uXG4gKiBAcmV0dXJucyB7IUxvbmd9IE5lZ2F0ZWQgTG9uZ1xuICovXG5Mb25nUHJvdG90eXBlLm5lZyA9IExvbmdQcm90b3R5cGUubmVnYXRlO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHN1bSBvZiB0aGlzIGFuZCB0aGUgc3BlY2lmaWVkIExvbmcuXG4gKiBAdGhpcyB7IUxvbmd9XG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd9IGFkZGVuZCBBZGRlbmRcbiAqIEByZXR1cm5zIHshTG9uZ30gU3VtXG4gKi9cbkxvbmdQcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gYWRkKGFkZGVuZCkge1xuICBpZiAoIWlzTG9uZyhhZGRlbmQpKVxuICAgIGFkZGVuZCA9IGZyb21WYWx1ZShhZGRlbmQpO1xuXG4gIC8vIERpdmlkZSBlYWNoIG51bWJlciBpbnRvIDQgY2h1bmtzIG9mIDE2IGJpdHMsIGFuZCB0aGVuIHN1bSB0aGUgY2h1bmtzLlxuXG4gIHZhciBhNDggPSB0aGlzLmhpZ2ggPj4+IDE2O1xuICB2YXIgYTMyID0gdGhpcy5oaWdoICYgMHhGRkZGO1xuICB2YXIgYTE2ID0gdGhpcy5sb3cgPj4+IDE2O1xuICB2YXIgYTAwID0gdGhpcy5sb3cgJiAweEZGRkY7XG5cbiAgdmFyIGI0OCA9IGFkZGVuZC5oaWdoID4+PiAxNjtcbiAgdmFyIGIzMiA9IGFkZGVuZC5oaWdoICYgMHhGRkZGO1xuICB2YXIgYjE2ID0gYWRkZW5kLmxvdyA+Pj4gMTY7XG4gIHZhciBiMDAgPSBhZGRlbmQubG93ICYgMHhGRkZGO1xuXG4gIHZhciBjNDggPSAwLCBjMzIgPSAwLCBjMTYgPSAwLCBjMDAgPSAwO1xuICBjMDAgKz0gYTAwICsgYjAwO1xuICBjMTYgKz0gYzAwID4+PiAxNjtcbiAgYzAwICY9IDB4RkZGRjtcbiAgYzE2ICs9IGExNiArIGIxNjtcbiAgYzMyICs9IGMxNiA+Pj4gMTY7XG4gIGMxNiAmPSAweEZGRkY7XG4gIGMzMiArPSBhMzIgKyBiMzI7XG4gIGM0OCArPSBjMzIgPj4+IDE2O1xuICBjMzIgJj0gMHhGRkZGO1xuICBjNDggKz0gYTQ4ICsgYjQ4O1xuICBjNDggJj0gMHhGRkZGO1xuICByZXR1cm4gZnJvbUJpdHMoKGMxNiA8PCAxNikgfCBjMDAsIChjNDggPDwgMTYpIHwgYzMyLCB0aGlzLnVuc2lnbmVkKTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZGlmZmVyZW5jZSBvZiB0aGlzIGFuZCB0aGUgc3BlY2lmaWVkIExvbmcuXG4gKiBAdGhpcyB7IUxvbmd9XG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd9IHN1YnRyYWhlbmQgU3VidHJhaGVuZFxuICogQHJldHVybnMgeyFMb25nfSBEaWZmZXJlbmNlXG4gKi9cbkxvbmdQcm90b3R5cGUuc3VidHJhY3QgPSBmdW5jdGlvbiBzdWJ0cmFjdChzdWJ0cmFoZW5kKSB7XG4gIGlmICghaXNMb25nKHN1YnRyYWhlbmQpKVxuICAgIHN1YnRyYWhlbmQgPSBmcm9tVmFsdWUoc3VidHJhaGVuZCk7XG4gIHJldHVybiB0aGlzLmFkZChzdWJ0cmFoZW5kLm5lZygpKTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZGlmZmVyZW5jZSBvZiB0aGlzIGFuZCB0aGUgc3BlY2lmaWVkIExvbmcuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjc3VidHJhY3R9LlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd9IHN1YnRyYWhlbmQgU3VidHJhaGVuZFxuICogQHJldHVybnMgeyFMb25nfSBEaWZmZXJlbmNlXG4gKi9cbkxvbmdQcm90b3R5cGUuc3ViID0gTG9uZ1Byb3RvdHlwZS5zdWJ0cmFjdDtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBwcm9kdWN0IG9mIHRoaXMgYW5kIHRoZSBzcGVjaWZpZWQgTG9uZy5cbiAqIEB0aGlzIHshTG9uZ31cbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gbXVsdGlwbGllciBNdWx0aXBsaWVyXG4gKiBAcmV0dXJucyB7IUxvbmd9IFByb2R1Y3RcbiAqL1xuTG9uZ1Byb3RvdHlwZS5tdWx0aXBseSA9IGZ1bmN0aW9uIG11bHRpcGx5KG11bHRpcGxpZXIpIHtcbiAgaWYgKHRoaXMuaXNaZXJvKCkpXG4gICAgcmV0dXJuIHRoaXM7XG4gIGlmICghaXNMb25nKG11bHRpcGxpZXIpKVxuICAgIG11bHRpcGxpZXIgPSBmcm9tVmFsdWUobXVsdGlwbGllcik7XG5cbiAgLy8gdXNlIHdhc20gc3VwcG9ydCBpZiBwcmVzZW50XG4gIGlmICh3YXNtKSB7XG4gICAgdmFyIGxvdyA9IHdhc21bXCJtdWxcIl0odGhpcy5sb3csXG4gICAgICB0aGlzLmhpZ2gsXG4gICAgICBtdWx0aXBsaWVyLmxvdyxcbiAgICAgIG11bHRpcGxpZXIuaGlnaCk7XG4gICAgcmV0dXJuIGZyb21CaXRzKGxvdywgd2FzbVtcImdldF9oaWdoXCJdKCksIHRoaXMudW5zaWduZWQpO1xuICB9XG5cbiAgaWYgKG11bHRpcGxpZXIuaXNaZXJvKCkpXG4gICAgcmV0dXJuIHRoaXMudW5zaWduZWQgPyBVWkVSTyA6IFpFUk87XG4gIGlmICh0aGlzLmVxKE1JTl9WQUxVRSkpXG4gICAgcmV0dXJuIG11bHRpcGxpZXIuaXNPZGQoKSA/IE1JTl9WQUxVRSA6IFpFUk87XG4gIGlmIChtdWx0aXBsaWVyLmVxKE1JTl9WQUxVRSkpXG4gICAgcmV0dXJuIHRoaXMuaXNPZGQoKSA/IE1JTl9WQUxVRSA6IFpFUk87XG5cbiAgaWYgKHRoaXMuaXNOZWdhdGl2ZSgpKSB7XG4gICAgaWYgKG11bHRpcGxpZXIuaXNOZWdhdGl2ZSgpKVxuICAgICAgcmV0dXJuIHRoaXMubmVnKCkubXVsKG11bHRpcGxpZXIubmVnKCkpO1xuICAgIGVsc2VcbiAgICAgIHJldHVybiB0aGlzLm5lZygpLm11bChtdWx0aXBsaWVyKS5uZWcoKTtcbiAgfSBlbHNlIGlmIChtdWx0aXBsaWVyLmlzTmVnYXRpdmUoKSlcbiAgICByZXR1cm4gdGhpcy5tdWwobXVsdGlwbGllci5uZWcoKSkubmVnKCk7XG5cbiAgLy8gSWYgYm90aCBsb25ncyBhcmUgc21hbGwsIHVzZSBmbG9hdCBtdWx0aXBsaWNhdGlvblxuICBpZiAodGhpcy5sdChUV09fUFdSXzI0KSAmJiBtdWx0aXBsaWVyLmx0KFRXT19QV1JfMjQpKVxuICAgIHJldHVybiBmcm9tTnVtYmVyKHRoaXMudG9OdW1iZXIoKSAqIG11bHRpcGxpZXIudG9OdW1iZXIoKSwgdGhpcy51bnNpZ25lZCk7XG5cbiAgLy8gRGl2aWRlIGVhY2ggbG9uZyBpbnRvIDQgY2h1bmtzIG9mIDE2IGJpdHMsIGFuZCB0aGVuIGFkZCB1cCA0eDQgcHJvZHVjdHMuXG4gIC8vIFdlIGNhbiBza2lwIHByb2R1Y3RzIHRoYXQgd291bGQgb3ZlcmZsb3cuXG5cbiAgdmFyIGE0OCA9IHRoaXMuaGlnaCA+Pj4gMTY7XG4gIHZhciBhMzIgPSB0aGlzLmhpZ2ggJiAweEZGRkY7XG4gIHZhciBhMTYgPSB0aGlzLmxvdyA+Pj4gMTY7XG4gIHZhciBhMDAgPSB0aGlzLmxvdyAmIDB4RkZGRjtcblxuICB2YXIgYjQ4ID0gbXVsdGlwbGllci5oaWdoID4+PiAxNjtcbiAgdmFyIGIzMiA9IG11bHRpcGxpZXIuaGlnaCAmIDB4RkZGRjtcbiAgdmFyIGIxNiA9IG11bHRpcGxpZXIubG93ID4+PiAxNjtcbiAgdmFyIGIwMCA9IG11bHRpcGxpZXIubG93ICYgMHhGRkZGO1xuXG4gIHZhciBjNDggPSAwLCBjMzIgPSAwLCBjMTYgPSAwLCBjMDAgPSAwO1xuICBjMDAgKz0gYTAwICogYjAwO1xuICBjMTYgKz0gYzAwID4+PiAxNjtcbiAgYzAwICY9IDB4RkZGRjtcbiAgYzE2ICs9IGExNiAqIGIwMDtcbiAgYzMyICs9IGMxNiA+Pj4gMTY7XG4gIGMxNiAmPSAweEZGRkY7XG4gIGMxNiArPSBhMDAgKiBiMTY7XG4gIGMzMiArPSBjMTYgPj4+IDE2O1xuICBjMTYgJj0gMHhGRkZGO1xuICBjMzIgKz0gYTMyICogYjAwO1xuICBjNDggKz0gYzMyID4+PiAxNjtcbiAgYzMyICY9IDB4RkZGRjtcbiAgYzMyICs9IGExNiAqIGIxNjtcbiAgYzQ4ICs9IGMzMiA+Pj4gMTY7XG4gIGMzMiAmPSAweEZGRkY7XG4gIGMzMiArPSBhMDAgKiBiMzI7XG4gIGM0OCArPSBjMzIgPj4+IDE2O1xuICBjMzIgJj0gMHhGRkZGO1xuICBjNDggKz0gYTQ4ICogYjAwICsgYTMyICogYjE2ICsgYTE2ICogYjMyICsgYTAwICogYjQ4O1xuICBjNDggJj0gMHhGRkZGO1xuICByZXR1cm4gZnJvbUJpdHMoKGMxNiA8PCAxNikgfCBjMDAsIChjNDggPDwgMTYpIHwgYzMyLCB0aGlzLnVuc2lnbmVkKTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcHJvZHVjdCBvZiB0aGlzIGFuZCB0aGUgc3BlY2lmaWVkIExvbmcuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjbXVsdGlwbHl9LlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd9IG11bHRpcGxpZXIgTXVsdGlwbGllclxuICogQHJldHVybnMgeyFMb25nfSBQcm9kdWN0XG4gKi9cbkxvbmdQcm90b3R5cGUubXVsID0gTG9uZ1Byb3RvdHlwZS5tdWx0aXBseTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoaXMgTG9uZyBkaXZpZGVkIGJ5IHRoZSBzcGVjaWZpZWQuIFRoZSByZXN1bHQgaXMgc2lnbmVkIGlmIHRoaXMgTG9uZyBpcyBzaWduZWQgb3JcbiAqICB1bnNpZ25lZCBpZiB0aGlzIExvbmcgaXMgdW5zaWduZWQuXG4gKiBAdGhpcyB7IUxvbmd9XG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd9IGRpdmlzb3IgRGl2aXNvclxuICogQHJldHVybnMgeyFMb25nfSBRdW90aWVudFxuICovXG5Mb25nUHJvdG90eXBlLmRpdmlkZSA9IGZ1bmN0aW9uIGRpdmlkZShkaXZpc29yKSB7XG4gIGlmICghaXNMb25nKGRpdmlzb3IpKVxuICAgIGRpdmlzb3IgPSBmcm9tVmFsdWUoZGl2aXNvcik7XG4gIGlmIChkaXZpc29yLmlzWmVybygpKVxuICAgIHRocm93IEVycm9yKCdkaXZpc2lvbiBieSB6ZXJvJyk7XG5cbiAgLy8gdXNlIHdhc20gc3VwcG9ydCBpZiBwcmVzZW50XG4gIGlmICh3YXNtKSB7XG4gICAgLy8gZ3VhcmQgYWdhaW5zdCBzaWduZWQgZGl2aXNpb24gb3ZlcmZsb3c6IHRoZSBsYXJnZXN0XG4gICAgLy8gbmVnYXRpdmUgbnVtYmVyIC8gLTEgd291bGQgYmUgMSBsYXJnZXIgdGhhbiB0aGUgbGFyZ2VzdFxuICAgIC8vIHBvc2l0aXZlIG51bWJlciwgZHVlIHRvIHR3bydzIGNvbXBsZW1lbnQuXG4gICAgaWYgKCF0aGlzLnVuc2lnbmVkICYmXG4gICAgICB0aGlzLmhpZ2ggPT09IC0weDgwMDAwMDAwICYmXG4gICAgICBkaXZpc29yLmxvdyA9PT0gLTEgJiYgZGl2aXNvci5oaWdoID09PSAtMSkge1xuICAgICAgLy8gYmUgY29uc2lzdGVudCB3aXRoIG5vbi13YXNtIGNvZGUgcGF0aFxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHZhciBsb3cgPSAodGhpcy51bnNpZ25lZCA/IHdhc21bXCJkaXZfdVwiXSA6IHdhc21bXCJkaXZfc1wiXSkoXG4gICAgICB0aGlzLmxvdyxcbiAgICAgIHRoaXMuaGlnaCxcbiAgICAgIGRpdmlzb3IubG93LFxuICAgICAgZGl2aXNvci5oaWdoXG4gICAgKTtcbiAgICByZXR1cm4gZnJvbUJpdHMobG93LCB3YXNtW1wiZ2V0X2hpZ2hcIl0oKSwgdGhpcy51bnNpZ25lZCk7XG4gIH1cblxuICBpZiAodGhpcy5pc1plcm8oKSlcbiAgICByZXR1cm4gdGhpcy51bnNpZ25lZCA/IFVaRVJPIDogWkVSTztcbiAgdmFyIGFwcHJveCwgcmVtLCByZXM7XG4gIGlmICghdGhpcy51bnNpZ25lZCkge1xuICAgIC8vIFRoaXMgc2VjdGlvbiBpcyBvbmx5IHJlbGV2YW50IGZvciBzaWduZWQgbG9uZ3MgYW5kIGlzIGRlcml2ZWQgZnJvbSB0aGVcbiAgICAvLyBjbG9zdXJlIGxpYnJhcnkgYXMgYSB3aG9sZS5cbiAgICBpZiAodGhpcy5lcShNSU5fVkFMVUUpKSB7XG4gICAgICBpZiAoZGl2aXNvci5lcShPTkUpIHx8IGRpdmlzb3IuZXEoTkVHX09ORSkpXG4gICAgICAgIHJldHVybiBNSU5fVkFMVUU7ICAvLyByZWNhbGwgdGhhdCAtTUlOX1ZBTFVFID09IE1JTl9WQUxVRVxuICAgICAgZWxzZSBpZiAoZGl2aXNvci5lcShNSU5fVkFMVUUpKVxuICAgICAgICByZXR1cm4gT05FO1xuICAgICAgZWxzZSB7XG4gICAgICAgIC8vIEF0IHRoaXMgcG9pbnQsIHdlIGhhdmUgfG90aGVyfCA+PSAyLCBzbyB8dGhpcy9vdGhlcnwgPCB8TUlOX1ZBTFVFfC5cbiAgICAgICAgdmFyIGhhbGZUaGlzID0gdGhpcy5zaHIoMSk7XG4gICAgICAgIGFwcHJveCA9IGhhbGZUaGlzLmRpdihkaXZpc29yKS5zaGwoMSk7XG4gICAgICAgIGlmIChhcHByb3guZXEoWkVSTykpIHtcbiAgICAgICAgICByZXR1cm4gZGl2aXNvci5pc05lZ2F0aXZlKCkgPyBPTkUgOiBORUdfT05FO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlbSA9IHRoaXMuc3ViKGRpdmlzb3IubXVsKGFwcHJveCkpO1xuICAgICAgICAgIHJlcyA9IGFwcHJveC5hZGQocmVtLmRpdihkaXZpc29yKSk7XG4gICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZGl2aXNvci5lcShNSU5fVkFMVUUpKVxuICAgICAgcmV0dXJuIHRoaXMudW5zaWduZWQgPyBVWkVSTyA6IFpFUk87XG4gICAgaWYgKHRoaXMuaXNOZWdhdGl2ZSgpKSB7XG4gICAgICBpZiAoZGl2aXNvci5pc05lZ2F0aXZlKCkpXG4gICAgICAgIHJldHVybiB0aGlzLm5lZygpLmRpdihkaXZpc29yLm5lZygpKTtcbiAgICAgIHJldHVybiB0aGlzLm5lZygpLmRpdihkaXZpc29yKS5uZWcoKTtcbiAgICB9IGVsc2UgaWYgKGRpdmlzb3IuaXNOZWdhdGl2ZSgpKVxuICAgICAgcmV0dXJuIHRoaXMuZGl2KGRpdmlzb3IubmVnKCkpLm5lZygpO1xuICAgIHJlcyA9IFpFUk87XG4gIH0gZWxzZSB7XG4gICAgLy8gVGhlIGFsZ29yaXRobSBiZWxvdyBoYXMgbm90IGJlZW4gbWFkZSBmb3IgdW5zaWduZWQgbG9uZ3MuIEl0J3MgdGhlcmVmb3JlXG4gICAgLy8gcmVxdWlyZWQgdG8gdGFrZSBzcGVjaWFsIGNhcmUgb2YgdGhlIE1TQiBwcmlvciB0byBydW5uaW5nIGl0LlxuICAgIGlmICghZGl2aXNvci51bnNpZ25lZClcbiAgICAgIGRpdmlzb3IgPSBkaXZpc29yLnRvVW5zaWduZWQoKTtcbiAgICBpZiAoZGl2aXNvci5ndCh0aGlzKSlcbiAgICAgIHJldHVybiBVWkVSTztcbiAgICBpZiAoZGl2aXNvci5ndCh0aGlzLnNocnUoMSkpKSAvLyAxNSA+Pj4gMSA9IDcgOyB3aXRoIGRpdmlzb3IgPSA4IDsgdHJ1ZVxuICAgICAgcmV0dXJuIFVPTkU7XG4gICAgcmVzID0gVVpFUk87XG4gIH1cblxuICAvLyBSZXBlYXQgdGhlIGZvbGxvd2luZyB1bnRpbCB0aGUgcmVtYWluZGVyIGlzIGxlc3MgdGhhbiBvdGhlcjogIGZpbmQgYVxuICAvLyBmbG9hdGluZy1wb2ludCB0aGF0IGFwcHJveGltYXRlcyByZW1haW5kZXIgLyBvdGhlciAqZnJvbSBiZWxvdyosIGFkZCB0aGlzXG4gIC8vIGludG8gdGhlIHJlc3VsdCwgYW5kIHN1YnRyYWN0IGl0IGZyb20gdGhlIHJlbWFpbmRlci4gIEl0IGlzIGNyaXRpY2FsIHRoYXRcbiAgLy8gdGhlIGFwcHJveGltYXRlIHZhbHVlIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgcmVhbCB2YWx1ZSBzbyB0aGF0IHRoZVxuICAvLyByZW1haW5kZXIgbmV2ZXIgYmVjb21lcyBuZWdhdGl2ZS5cbiAgcmVtID0gdGhpcztcbiAgd2hpbGUgKHJlbS5ndGUoZGl2aXNvcikpIHtcbiAgICAvLyBBcHByb3hpbWF0ZSB0aGUgcmVzdWx0IG9mIGRpdmlzaW9uLiBUaGlzIG1heSBiZSBhIGxpdHRsZSBncmVhdGVyIG9yXG4gICAgLy8gc21hbGxlciB0aGFuIHRoZSBhY3R1YWwgdmFsdWUuXG4gICAgYXBwcm94ID0gTWF0aC5tYXgoMSwgTWF0aC5mbG9vcihyZW0udG9OdW1iZXIoKSAvIGRpdmlzb3IudG9OdW1iZXIoKSkpO1xuXG4gICAgLy8gV2Ugd2lsbCB0d2VhayB0aGUgYXBwcm94aW1hdGUgcmVzdWx0IGJ5IGNoYW5naW5nIGl0IGluIHRoZSA0OC10aCBkaWdpdCBvclxuICAgIC8vIHRoZSBzbWFsbGVzdCBub24tZnJhY3Rpb25hbCBkaWdpdCwgd2hpY2hldmVyIGlzIGxhcmdlci5cbiAgICB2YXIgbG9nMiA9IE1hdGguY2VpbChNYXRoLmxvZyhhcHByb3gpIC8gTWF0aC5MTjIpLFxuICAgICAgZGVsdGEgPSAobG9nMiA8PSA0OCkgPyAxIDogcG93X2RibCgyLCBsb2cyIC0gNDgpLFxuXG4gICAgICAvLyBEZWNyZWFzZSB0aGUgYXBwcm94aW1hdGlvbiB1bnRpbCBpdCBpcyBzbWFsbGVyIHRoYW4gdGhlIHJlbWFpbmRlci4gIE5vdGVcbiAgICAgIC8vIHRoYXQgaWYgaXQgaXMgdG9vIGxhcmdlLCB0aGUgcHJvZHVjdCBvdmVyZmxvd3MgYW5kIGlzIG5lZ2F0aXZlLlxuICAgICAgYXBwcm94UmVzID0gZnJvbU51bWJlcihhcHByb3gpLFxuICAgICAgYXBwcm94UmVtID0gYXBwcm94UmVzLm11bChkaXZpc29yKTtcbiAgICB3aGlsZSAoYXBwcm94UmVtLmlzTmVnYXRpdmUoKSB8fCBhcHByb3hSZW0uZ3QocmVtKSkge1xuICAgICAgYXBwcm94IC09IGRlbHRhO1xuICAgICAgYXBwcm94UmVzID0gZnJvbU51bWJlcihhcHByb3gsIHRoaXMudW5zaWduZWQpO1xuICAgICAgYXBwcm94UmVtID0gYXBwcm94UmVzLm11bChkaXZpc29yKTtcbiAgICB9XG5cbiAgICAvLyBXZSBrbm93IHRoZSBhbnN3ZXIgY2FuJ3QgYmUgemVyby4uLiBhbmQgYWN0dWFsbHksIHplcm8gd291bGQgY2F1c2VcbiAgICAvLyBpbmZpbml0ZSByZWN1cnNpb24gc2luY2Ugd2Ugd291bGQgbWFrZSBubyBwcm9ncmVzcy5cbiAgICBpZiAoYXBwcm94UmVzLmlzWmVybygpKVxuICAgICAgYXBwcm94UmVzID0gT05FO1xuXG4gICAgcmVzID0gcmVzLmFkZChhcHByb3hSZXMpO1xuICAgIHJlbSA9IHJlbS5zdWIoYXBwcm94UmVtKTtcbiAgfVxuICByZXR1cm4gcmVzO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoaXMgTG9uZyBkaXZpZGVkIGJ5IHRoZSBzcGVjaWZpZWQuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjZGl2aWRlfS5cbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8c3RyaW5nfSBkaXZpc29yIERpdmlzb3JcbiAqIEByZXR1cm5zIHshTG9uZ30gUXVvdGllbnRcbiAqL1xuTG9uZ1Byb3RvdHlwZS5kaXYgPSBMb25nUHJvdG90eXBlLmRpdmlkZTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoaXMgTG9uZyBtb2R1bG8gdGhlIHNwZWNpZmllZC5cbiAqIEB0aGlzIHshTG9uZ31cbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gZGl2aXNvciBEaXZpc29yXG4gKiBAcmV0dXJucyB7IUxvbmd9IFJlbWFpbmRlclxuICovXG5Mb25nUHJvdG90eXBlLm1vZHVsbyA9IGZ1bmN0aW9uIG1vZHVsbyhkaXZpc29yKSB7XG4gIGlmICghaXNMb25nKGRpdmlzb3IpKVxuICAgIGRpdmlzb3IgPSBmcm9tVmFsdWUoZGl2aXNvcik7XG5cbiAgLy8gdXNlIHdhc20gc3VwcG9ydCBpZiBwcmVzZW50XG4gIGlmICh3YXNtKSB7XG4gICAgdmFyIGxvdyA9ICh0aGlzLnVuc2lnbmVkID8gd2FzbVtcInJlbV91XCJdIDogd2FzbVtcInJlbV9zXCJdKShcbiAgICAgIHRoaXMubG93LFxuICAgICAgdGhpcy5oaWdoLFxuICAgICAgZGl2aXNvci5sb3csXG4gICAgICBkaXZpc29yLmhpZ2hcbiAgICApO1xuICAgIHJldHVybiBmcm9tQml0cyhsb3csIHdhc21bXCJnZXRfaGlnaFwiXSgpLCB0aGlzLnVuc2lnbmVkKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzLnN1Yih0aGlzLmRpdihkaXZpc29yKS5tdWwoZGl2aXNvcikpO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoaXMgTG9uZyBtb2R1bG8gdGhlIHNwZWNpZmllZC4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNtb2R1bG99LlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd9IGRpdmlzb3IgRGl2aXNvclxuICogQHJldHVybnMgeyFMb25nfSBSZW1haW5kZXJcbiAqL1xuTG9uZ1Byb3RvdHlwZS5tb2QgPSBMb25nUHJvdG90eXBlLm1vZHVsbztcblxuLyoqXG4gKiBSZXR1cm5zIHRoaXMgTG9uZyBtb2R1bG8gdGhlIHNwZWNpZmllZC4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNtb2R1bG99LlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd9IGRpdmlzb3IgRGl2aXNvclxuICogQHJldHVybnMgeyFMb25nfSBSZW1haW5kZXJcbiAqL1xuTG9uZ1Byb3RvdHlwZS5yZW0gPSBMb25nUHJvdG90eXBlLm1vZHVsbztcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBiaXR3aXNlIE5PVCBvZiB0aGlzIExvbmcuXG4gKiBAdGhpcyB7IUxvbmd9XG4gKiBAcmV0dXJucyB7IUxvbmd9XG4gKi9cbkxvbmdQcm90b3R5cGUubm90ID0gZnVuY3Rpb24gbm90KCkge1xuICByZXR1cm4gZnJvbUJpdHMofnRoaXMubG93LCB+dGhpcy5oaWdoLCB0aGlzLnVuc2lnbmVkKTtcbn07XG5cbi8qKlxuICogUmV0dXJucyBjb3VudCBsZWFkaW5nIHplcm9zIG9mIHRoaXMgTG9uZy5cbiAqIEB0aGlzIHshTG9uZ31cbiAqIEByZXR1cm5zIHshbnVtYmVyfVxuICovXG5Mb25nUHJvdG90eXBlLmNvdW50TGVhZGluZ1plcm9zID0gZnVuY3Rpb24gY291bnRMZWFkaW5nWmVyb3MoKSB7XG4gIHJldHVybiB0aGlzLmhpZ2ggPyBNYXRoLmNsejMyKHRoaXMuaGlnaCkgOiBNYXRoLmNsejMyKHRoaXMubG93KSArIDMyO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIGNvdW50IGxlYWRpbmcgemVyb3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjY291bnRMZWFkaW5nWmVyb3N9LlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0geyFMb25nfVxuICogQHJldHVybnMgeyFudW1iZXJ9XG4gKi9cbkxvbmdQcm90b3R5cGUuY2x6ID0gTG9uZ1Byb3RvdHlwZS5jb3VudExlYWRpbmdaZXJvcztcblxuLyoqXG4gKiBSZXR1cm5zIGNvdW50IHRyYWlsaW5nIHplcm9zIG9mIHRoaXMgTG9uZy5cbiAqIEB0aGlzIHshTG9uZ31cbiAqIEByZXR1cm5zIHshbnVtYmVyfVxuICovXG5Mb25nUHJvdG90eXBlLmNvdW50VHJhaWxpbmdaZXJvcyA9IGZ1bmN0aW9uIGNvdW50VHJhaWxpbmdaZXJvcygpIHtcbiAgcmV0dXJuIHRoaXMubG93ID8gY3R6MzIodGhpcy5sb3cpIDogY3R6MzIodGhpcy5oaWdoKSArIDMyO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIGNvdW50IHRyYWlsaW5nIHplcm9zLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI2NvdW50VHJhaWxpbmdaZXJvc30uXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7IUxvbmd9XG4gKiBAcmV0dXJucyB7IW51bWJlcn1cbiAqL1xuTG9uZ1Byb3RvdHlwZS5jdHogPSBMb25nUHJvdG90eXBlLmNvdW50VHJhaWxpbmdaZXJvcztcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBiaXR3aXNlIEFORCBvZiB0aGlzIExvbmcgYW5kIHRoZSBzcGVjaWZpZWQuXG4gKiBAdGhpcyB7IUxvbmd9XG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd9IG90aGVyIE90aGVyIExvbmdcbiAqIEByZXR1cm5zIHshTG9uZ31cbiAqL1xuTG9uZ1Byb3RvdHlwZS5hbmQgPSBmdW5jdGlvbiBhbmQob3RoZXIpIHtcbiAgaWYgKCFpc0xvbmcob3RoZXIpKVxuICAgIG90aGVyID0gZnJvbVZhbHVlKG90aGVyKTtcbiAgcmV0dXJuIGZyb21CaXRzKHRoaXMubG93ICYgb3RoZXIubG93LCB0aGlzLmhpZ2ggJiBvdGhlci5oaWdoLCB0aGlzLnVuc2lnbmVkKTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgYml0d2lzZSBPUiBvZiB0aGlzIExvbmcgYW5kIHRoZSBzcGVjaWZpZWQuXG4gKiBAdGhpcyB7IUxvbmd9XG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd9IG90aGVyIE90aGVyIExvbmdcbiAqIEByZXR1cm5zIHshTG9uZ31cbiAqL1xuTG9uZ1Byb3RvdHlwZS5vciA9IGZ1bmN0aW9uIG9yKG90aGVyKSB7XG4gIGlmICghaXNMb25nKG90aGVyKSlcbiAgICBvdGhlciA9IGZyb21WYWx1ZShvdGhlcik7XG4gIHJldHVybiBmcm9tQml0cyh0aGlzLmxvdyB8IG90aGVyLmxvdywgdGhpcy5oaWdoIHwgb3RoZXIuaGlnaCwgdGhpcy51bnNpZ25lZCk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGJpdHdpc2UgWE9SIG9mIHRoaXMgTG9uZyBhbmQgdGhlIGdpdmVuIG9uZS5cbiAqIEB0aGlzIHshTG9uZ31cbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgTG9uZ1xuICogQHJldHVybnMgeyFMb25nfVxuICovXG5Mb25nUHJvdG90eXBlLnhvciA9IGZ1bmN0aW9uIHhvcihvdGhlcikge1xuICBpZiAoIWlzTG9uZyhvdGhlcikpXG4gICAgb3RoZXIgPSBmcm9tVmFsdWUob3RoZXIpO1xuICByZXR1cm4gZnJvbUJpdHModGhpcy5sb3cgXiBvdGhlci5sb3csIHRoaXMuaGlnaCBeIG90aGVyLmhpZ2gsIHRoaXMudW5zaWduZWQpO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoaXMgTG9uZyB3aXRoIGJpdHMgc2hpZnRlZCB0byB0aGUgbGVmdCBieSB0aGUgZ2l2ZW4gYW1vdW50LlxuICogQHRoaXMgeyFMb25nfVxuICogQHBhcmFtIHtudW1iZXJ8IUxvbmd9IG51bUJpdHMgTnVtYmVyIG9mIGJpdHNcbiAqIEByZXR1cm5zIHshTG9uZ30gU2hpZnRlZCBMb25nXG4gKi9cbkxvbmdQcm90b3R5cGUuc2hpZnRMZWZ0ID0gZnVuY3Rpb24gc2hpZnRMZWZ0KG51bUJpdHMpIHtcbiAgaWYgKGlzTG9uZyhudW1CaXRzKSlcbiAgICBudW1CaXRzID0gbnVtQml0cy50b0ludCgpO1xuICBpZiAoKG51bUJpdHMgJj0gNjMpID09PSAwKVxuICAgIHJldHVybiB0aGlzO1xuICBlbHNlIGlmIChudW1CaXRzIDwgMzIpXG4gICAgcmV0dXJuIGZyb21CaXRzKHRoaXMubG93IDw8IG51bUJpdHMsICh0aGlzLmhpZ2ggPDwgbnVtQml0cykgfCAodGhpcy5sb3cgPj4+ICgzMiAtIG51bUJpdHMpKSwgdGhpcy51bnNpZ25lZCk7XG4gIGVsc2VcbiAgICByZXR1cm4gZnJvbUJpdHMoMCwgdGhpcy5sb3cgPDwgKG51bUJpdHMgLSAzMiksIHRoaXMudW5zaWduZWQpO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoaXMgTG9uZyB3aXRoIGJpdHMgc2hpZnRlZCB0byB0aGUgbGVmdCBieSB0aGUgZ2l2ZW4gYW1vdW50LiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI3NoaWZ0TGVmdH0uXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7bnVtYmVyfCFMb25nfSBudW1CaXRzIE51bWJlciBvZiBiaXRzXG4gKiBAcmV0dXJucyB7IUxvbmd9IFNoaWZ0ZWQgTG9uZ1xuICovXG5Mb25nUHJvdG90eXBlLnNobCA9IExvbmdQcm90b3R5cGUuc2hpZnRMZWZ0O1xuXG4vKipcbiAqIFJldHVybnMgdGhpcyBMb25nIHdpdGggYml0cyBhcml0aG1ldGljYWxseSBzaGlmdGVkIHRvIHRoZSByaWdodCBieSB0aGUgZ2l2ZW4gYW1vdW50LlxuICogQHRoaXMgeyFMb25nfVxuICogQHBhcmFtIHtudW1iZXJ8IUxvbmd9IG51bUJpdHMgTnVtYmVyIG9mIGJpdHNcbiAqIEByZXR1cm5zIHshTG9uZ30gU2hpZnRlZCBMb25nXG4gKi9cbkxvbmdQcm90b3R5cGUuc2hpZnRSaWdodCA9IGZ1bmN0aW9uIHNoaWZ0UmlnaHQobnVtQml0cykge1xuICBpZiAoaXNMb25nKG51bUJpdHMpKVxuICAgIG51bUJpdHMgPSBudW1CaXRzLnRvSW50KCk7XG4gIGlmICgobnVtQml0cyAmPSA2MykgPT09IDApXG4gICAgcmV0dXJuIHRoaXM7XG4gIGVsc2UgaWYgKG51bUJpdHMgPCAzMilcbiAgICByZXR1cm4gZnJvbUJpdHMoKHRoaXMubG93ID4+PiBudW1CaXRzKSB8ICh0aGlzLmhpZ2ggPDwgKDMyIC0gbnVtQml0cykpLCB0aGlzLmhpZ2ggPj4gbnVtQml0cywgdGhpcy51bnNpZ25lZCk7XG4gIGVsc2VcbiAgICByZXR1cm4gZnJvbUJpdHModGhpcy5oaWdoID4+IChudW1CaXRzIC0gMzIpLCB0aGlzLmhpZ2ggPj0gMCA/IDAgOiAtMSwgdGhpcy51bnNpZ25lZCk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhpcyBMb25nIHdpdGggYml0cyBhcml0aG1ldGljYWxseSBzaGlmdGVkIHRvIHRoZSByaWdodCBieSB0aGUgZ2l2ZW4gYW1vdW50LiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI3NoaWZ0UmlnaHR9LlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge251bWJlcnwhTG9uZ30gbnVtQml0cyBOdW1iZXIgb2YgYml0c1xuICogQHJldHVybnMgeyFMb25nfSBTaGlmdGVkIExvbmdcbiAqL1xuTG9uZ1Byb3RvdHlwZS5zaHIgPSBMb25nUHJvdG90eXBlLnNoaWZ0UmlnaHQ7XG5cbi8qKlxuICogUmV0dXJucyB0aGlzIExvbmcgd2l0aCBiaXRzIGxvZ2ljYWxseSBzaGlmdGVkIHRvIHRoZSByaWdodCBieSB0aGUgZ2l2ZW4gYW1vdW50LlxuICogQHRoaXMgeyFMb25nfVxuICogQHBhcmFtIHtudW1iZXJ8IUxvbmd9IG51bUJpdHMgTnVtYmVyIG9mIGJpdHNcbiAqIEByZXR1cm5zIHshTG9uZ30gU2hpZnRlZCBMb25nXG4gKi9cbkxvbmdQcm90b3R5cGUuc2hpZnRSaWdodFVuc2lnbmVkID0gZnVuY3Rpb24gc2hpZnRSaWdodFVuc2lnbmVkKG51bUJpdHMpIHtcbiAgaWYgKGlzTG9uZyhudW1CaXRzKSkgbnVtQml0cyA9IG51bUJpdHMudG9JbnQoKTtcbiAgaWYgKChudW1CaXRzICY9IDYzKSA9PT0gMCkgcmV0dXJuIHRoaXM7XG4gIGlmIChudW1CaXRzIDwgMzIpIHJldHVybiBmcm9tQml0cygodGhpcy5sb3cgPj4+IG51bUJpdHMpIHwgKHRoaXMuaGlnaCA8PCAoMzIgLSBudW1CaXRzKSksIHRoaXMuaGlnaCA+Pj4gbnVtQml0cywgdGhpcy51bnNpZ25lZCk7XG4gIGlmIChudW1CaXRzID09PSAzMikgcmV0dXJuIGZyb21CaXRzKHRoaXMuaGlnaCwgMCwgdGhpcy51bnNpZ25lZCk7XG4gIHJldHVybiBmcm9tQml0cyh0aGlzLmhpZ2ggPj4+IChudW1CaXRzIC0gMzIpLCAwLCB0aGlzLnVuc2lnbmVkKTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGlzIExvbmcgd2l0aCBiaXRzIGxvZ2ljYWxseSBzaGlmdGVkIHRvIHRoZSByaWdodCBieSB0aGUgZ2l2ZW4gYW1vdW50LiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI3NoaWZ0UmlnaHRVbnNpZ25lZH0uXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7bnVtYmVyfCFMb25nfSBudW1CaXRzIE51bWJlciBvZiBiaXRzXG4gKiBAcmV0dXJucyB7IUxvbmd9IFNoaWZ0ZWQgTG9uZ1xuICovXG5Mb25nUHJvdG90eXBlLnNocnUgPSBMb25nUHJvdG90eXBlLnNoaWZ0UmlnaHRVbnNpZ25lZDtcblxuLyoqXG4gKiBSZXR1cm5zIHRoaXMgTG9uZyB3aXRoIGJpdHMgbG9naWNhbGx5IHNoaWZ0ZWQgdG8gdGhlIHJpZ2h0IGJ5IHRoZSBnaXZlbiBhbW91bnQuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjc2hpZnRSaWdodFVuc2lnbmVkfS5cbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtudW1iZXJ8IUxvbmd9IG51bUJpdHMgTnVtYmVyIG9mIGJpdHNcbiAqIEByZXR1cm5zIHshTG9uZ30gU2hpZnRlZCBMb25nXG4gKi9cbkxvbmdQcm90b3R5cGUuc2hyX3UgPSBMb25nUHJvdG90eXBlLnNoaWZ0UmlnaHRVbnNpZ25lZDtcblxuLyoqXG4gKiBSZXR1cm5zIHRoaXMgTG9uZyB3aXRoIGJpdHMgcm90YXRlZCB0byB0aGUgbGVmdCBieSB0aGUgZ2l2ZW4gYW1vdW50LlxuICogQHRoaXMgeyFMb25nfVxuICogQHBhcmFtIHtudW1iZXJ8IUxvbmd9IG51bUJpdHMgTnVtYmVyIG9mIGJpdHNcbiAqIEByZXR1cm5zIHshTG9uZ30gUm90YXRlZCBMb25nXG4gKi9cbkxvbmdQcm90b3R5cGUucm90YXRlTGVmdCA9IGZ1bmN0aW9uIHJvdGF0ZUxlZnQobnVtQml0cykge1xuICB2YXIgYjtcbiAgaWYgKGlzTG9uZyhudW1CaXRzKSkgbnVtQml0cyA9IG51bUJpdHMudG9JbnQoKTtcbiAgaWYgKChudW1CaXRzICY9IDYzKSA9PT0gMCkgcmV0dXJuIHRoaXM7XG4gIGlmIChudW1CaXRzID09PSAzMikgcmV0dXJuIGZyb21CaXRzKHRoaXMuaGlnaCwgdGhpcy5sb3csIHRoaXMudW5zaWduZWQpO1xuICBpZiAobnVtQml0cyA8IDMyKSB7XG4gICAgYiA9ICgzMiAtIG51bUJpdHMpO1xuICAgIHJldHVybiBmcm9tQml0cygoKHRoaXMubG93IDw8IG51bUJpdHMpIHwgKHRoaXMuaGlnaCA+Pj4gYikpLCAoKHRoaXMuaGlnaCA8PCBudW1CaXRzKSB8ICh0aGlzLmxvdyA+Pj4gYikpLCB0aGlzLnVuc2lnbmVkKTtcbiAgfVxuICBudW1CaXRzIC09IDMyO1xuICBiID0gKDMyIC0gbnVtQml0cyk7XG4gIHJldHVybiBmcm9tQml0cygoKHRoaXMuaGlnaCA8PCBudW1CaXRzKSB8ICh0aGlzLmxvdyA+Pj4gYikpLCAoKHRoaXMubG93IDw8IG51bUJpdHMpIHwgKHRoaXMuaGlnaCA+Pj4gYikpLCB0aGlzLnVuc2lnbmVkKTtcbn1cbi8qKlxuICogUmV0dXJucyB0aGlzIExvbmcgd2l0aCBiaXRzIHJvdGF0ZWQgdG8gdGhlIGxlZnQgYnkgdGhlIGdpdmVuIGFtb3VudC4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNyb3RhdGVMZWZ0fS5cbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtudW1iZXJ8IUxvbmd9IG51bUJpdHMgTnVtYmVyIG9mIGJpdHNcbiAqIEByZXR1cm5zIHshTG9uZ30gUm90YXRlZCBMb25nXG4gKi9cbkxvbmdQcm90b3R5cGUucm90bCA9IExvbmdQcm90b3R5cGUucm90YXRlTGVmdDtcblxuLyoqXG4gKiBSZXR1cm5zIHRoaXMgTG9uZyB3aXRoIGJpdHMgcm90YXRlZCB0byB0aGUgcmlnaHQgYnkgdGhlIGdpdmVuIGFtb3VudC5cbiAqIEB0aGlzIHshTG9uZ31cbiAqIEBwYXJhbSB7bnVtYmVyfCFMb25nfSBudW1CaXRzIE51bWJlciBvZiBiaXRzXG4gKiBAcmV0dXJucyB7IUxvbmd9IFJvdGF0ZWQgTG9uZ1xuICovXG5Mb25nUHJvdG90eXBlLnJvdGF0ZVJpZ2h0ID0gZnVuY3Rpb24gcm90YXRlUmlnaHQobnVtQml0cykge1xuICB2YXIgYjtcbiAgaWYgKGlzTG9uZyhudW1CaXRzKSkgbnVtQml0cyA9IG51bUJpdHMudG9JbnQoKTtcbiAgaWYgKChudW1CaXRzICY9IDYzKSA9PT0gMCkgcmV0dXJuIHRoaXM7XG4gIGlmIChudW1CaXRzID09PSAzMikgcmV0dXJuIGZyb21CaXRzKHRoaXMuaGlnaCwgdGhpcy5sb3csIHRoaXMudW5zaWduZWQpO1xuICBpZiAobnVtQml0cyA8IDMyKSB7XG4gICAgYiA9ICgzMiAtIG51bUJpdHMpO1xuICAgIHJldHVybiBmcm9tQml0cygoKHRoaXMuaGlnaCA8PCBiKSB8ICh0aGlzLmxvdyA+Pj4gbnVtQml0cykpLCAoKHRoaXMubG93IDw8IGIpIHwgKHRoaXMuaGlnaCA+Pj4gbnVtQml0cykpLCB0aGlzLnVuc2lnbmVkKTtcbiAgfVxuICBudW1CaXRzIC09IDMyO1xuICBiID0gKDMyIC0gbnVtQml0cyk7XG4gIHJldHVybiBmcm9tQml0cygoKHRoaXMubG93IDw8IGIpIHwgKHRoaXMuaGlnaCA+Pj4gbnVtQml0cykpLCAoKHRoaXMuaGlnaCA8PCBiKSB8ICh0aGlzLmxvdyA+Pj4gbnVtQml0cykpLCB0aGlzLnVuc2lnbmVkKTtcbn1cbi8qKlxuICogUmV0dXJucyB0aGlzIExvbmcgd2l0aCBiaXRzIHJvdGF0ZWQgdG8gdGhlIHJpZ2h0IGJ5IHRoZSBnaXZlbiBhbW91bnQuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjcm90YXRlUmlnaHR9LlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge251bWJlcnwhTG9uZ30gbnVtQml0cyBOdW1iZXIgb2YgYml0c1xuICogQHJldHVybnMgeyFMb25nfSBSb3RhdGVkIExvbmdcbiAqL1xuTG9uZ1Byb3RvdHlwZS5yb3RyID0gTG9uZ1Byb3RvdHlwZS5yb3RhdGVSaWdodDtcblxuLyoqXG4gKiBDb252ZXJ0cyB0aGlzIExvbmcgdG8gc2lnbmVkLlxuICogQHRoaXMgeyFMb25nfVxuICogQHJldHVybnMgeyFMb25nfSBTaWduZWQgbG9uZ1xuICovXG5Mb25nUHJvdG90eXBlLnRvU2lnbmVkID0gZnVuY3Rpb24gdG9TaWduZWQoKSB7XG4gIGlmICghdGhpcy51bnNpZ25lZClcbiAgICByZXR1cm4gdGhpcztcbiAgcmV0dXJuIGZyb21CaXRzKHRoaXMubG93LCB0aGlzLmhpZ2gsIGZhbHNlKTtcbn07XG5cbi8qKlxuICogQ29udmVydHMgdGhpcyBMb25nIHRvIHVuc2lnbmVkLlxuICogQHRoaXMgeyFMb25nfVxuICogQHJldHVybnMgeyFMb25nfSBVbnNpZ25lZCBsb25nXG4gKi9cbkxvbmdQcm90b3R5cGUudG9VbnNpZ25lZCA9IGZ1bmN0aW9uIHRvVW5zaWduZWQoKSB7XG4gIGlmICh0aGlzLnVuc2lnbmVkKVxuICAgIHJldHVybiB0aGlzO1xuICByZXR1cm4gZnJvbUJpdHModGhpcy5sb3csIHRoaXMuaGlnaCwgdHJ1ZSk7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIHRoaXMgTG9uZyB0byBpdHMgYnl0ZSByZXByZXNlbnRhdGlvbi5cbiAqIEBwYXJhbSB7Ym9vbGVhbj19IGxlIFdoZXRoZXIgbGl0dGxlIG9yIGJpZyBlbmRpYW4sIGRlZmF1bHRzIHRvIGJpZyBlbmRpYW5cbiAqIEB0aGlzIHshTG9uZ31cbiAqIEByZXR1cm5zIHshQXJyYXkuPG51bWJlcj59IEJ5dGUgcmVwcmVzZW50YXRpb25cbiAqL1xuTG9uZ1Byb3RvdHlwZS50b0J5dGVzID0gZnVuY3Rpb24gdG9CeXRlcyhsZSkge1xuICByZXR1cm4gbGUgPyB0aGlzLnRvQnl0ZXNMRSgpIDogdGhpcy50b0J5dGVzQkUoKTtcbn07XG5cbi8qKlxuICogQ29udmVydHMgdGhpcyBMb25nIHRvIGl0cyBsaXR0bGUgZW5kaWFuIGJ5dGUgcmVwcmVzZW50YXRpb24uXG4gKiBAdGhpcyB7IUxvbmd9XG4gKiBAcmV0dXJucyB7IUFycmF5LjxudW1iZXI+fSBMaXR0bGUgZW5kaWFuIGJ5dGUgcmVwcmVzZW50YXRpb25cbiAqL1xuTG9uZ1Byb3RvdHlwZS50b0J5dGVzTEUgPSBmdW5jdGlvbiB0b0J5dGVzTEUoKSB7XG4gIHZhciBoaSA9IHRoaXMuaGlnaCxcbiAgICBsbyA9IHRoaXMubG93O1xuICByZXR1cm4gW1xuICAgIGxvICYgMHhmZixcbiAgICBsbyA+Pj4gOCAmIDB4ZmYsXG4gICAgbG8gPj4+IDE2ICYgMHhmZixcbiAgICBsbyA+Pj4gMjQsXG4gICAgaGkgJiAweGZmLFxuICAgIGhpID4+PiA4ICYgMHhmZixcbiAgICBoaSA+Pj4gMTYgJiAweGZmLFxuICAgIGhpID4+PiAyNFxuICBdO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyB0aGlzIExvbmcgdG8gaXRzIGJpZyBlbmRpYW4gYnl0ZSByZXByZXNlbnRhdGlvbi5cbiAqIEB0aGlzIHshTG9uZ31cbiAqIEByZXR1cm5zIHshQXJyYXkuPG51bWJlcj59IEJpZyBlbmRpYW4gYnl0ZSByZXByZXNlbnRhdGlvblxuICovXG5Mb25nUHJvdG90eXBlLnRvQnl0ZXNCRSA9IGZ1bmN0aW9uIHRvQnl0ZXNCRSgpIHtcbiAgdmFyIGhpID0gdGhpcy5oaWdoLFxuICAgIGxvID0gdGhpcy5sb3c7XG4gIHJldHVybiBbXG4gICAgaGkgPj4+IDI0LFxuICAgIGhpID4+PiAxNiAmIDB4ZmYsXG4gICAgaGkgPj4+IDggJiAweGZmLFxuICAgIGhpICYgMHhmZixcbiAgICBsbyA+Pj4gMjQsXG4gICAgbG8gPj4+IDE2ICYgMHhmZixcbiAgICBsbyA+Pj4gOCAmIDB4ZmYsXG4gICAgbG8gJiAweGZmXG4gIF07XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBMb25nIGZyb20gaXRzIGJ5dGUgcmVwcmVzZW50YXRpb24uXG4gKiBAcGFyYW0geyFBcnJheS48bnVtYmVyPn0gYnl0ZXMgQnl0ZSByZXByZXNlbnRhdGlvblxuICogQHBhcmFtIHtib29sZWFuPX0gdW5zaWduZWQgV2hldGhlciB1bnNpZ25lZCBvciBub3QsIGRlZmF1bHRzIHRvIHNpZ25lZFxuICogQHBhcmFtIHtib29sZWFuPX0gbGUgV2hldGhlciBsaXR0bGUgb3IgYmlnIGVuZGlhbiwgZGVmYXVsdHMgdG8gYmlnIGVuZGlhblxuICogQHJldHVybnMge0xvbmd9IFRoZSBjb3JyZXNwb25kaW5nIExvbmcgdmFsdWVcbiAqL1xuTG9uZy5mcm9tQnl0ZXMgPSBmdW5jdGlvbiBmcm9tQnl0ZXMoYnl0ZXMsIHVuc2lnbmVkLCBsZSkge1xuICByZXR1cm4gbGUgPyBMb25nLmZyb21CeXRlc0xFKGJ5dGVzLCB1bnNpZ25lZCkgOiBMb25nLmZyb21CeXRlc0JFKGJ5dGVzLCB1bnNpZ25lZCk7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBMb25nIGZyb20gaXRzIGxpdHRsZSBlbmRpYW4gYnl0ZSByZXByZXNlbnRhdGlvbi5cbiAqIEBwYXJhbSB7IUFycmF5LjxudW1iZXI+fSBieXRlcyBMaXR0bGUgZW5kaWFuIGJ5dGUgcmVwcmVzZW50YXRpb25cbiAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkIFdoZXRoZXIgdW5zaWduZWQgb3Igbm90LCBkZWZhdWx0cyB0byBzaWduZWRcbiAqIEByZXR1cm5zIHtMb25nfSBUaGUgY29ycmVzcG9uZGluZyBMb25nIHZhbHVlXG4gKi9cbkxvbmcuZnJvbUJ5dGVzTEUgPSBmdW5jdGlvbiBmcm9tQnl0ZXNMRShieXRlcywgdW5zaWduZWQpIHtcbiAgcmV0dXJuIG5ldyBMb25nKFxuICAgIGJ5dGVzWzBdIHxcbiAgICBieXRlc1sxXSA8PCA4IHxcbiAgICBieXRlc1syXSA8PCAxNiB8XG4gICAgYnl0ZXNbM10gPDwgMjQsXG4gICAgYnl0ZXNbNF0gfFxuICAgIGJ5dGVzWzVdIDw8IDggfFxuICAgIGJ5dGVzWzZdIDw8IDE2IHxcbiAgICBieXRlc1s3XSA8PCAyNCxcbiAgICB1bnNpZ25lZFxuICApO1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgTG9uZyBmcm9tIGl0cyBiaWcgZW5kaWFuIGJ5dGUgcmVwcmVzZW50YXRpb24uXG4gKiBAcGFyYW0geyFBcnJheS48bnVtYmVyPn0gYnl0ZXMgQmlnIGVuZGlhbiBieXRlIHJlcHJlc2VudGF0aW9uXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSB1bnNpZ25lZCBXaGV0aGVyIHVuc2lnbmVkIG9yIG5vdCwgZGVmYXVsdHMgdG8gc2lnbmVkXG4gKiBAcmV0dXJucyB7TG9uZ30gVGhlIGNvcnJlc3BvbmRpbmcgTG9uZyB2YWx1ZVxuICovXG5Mb25nLmZyb21CeXRlc0JFID0gZnVuY3Rpb24gZnJvbUJ5dGVzQkUoYnl0ZXMsIHVuc2lnbmVkKSB7XG4gIHJldHVybiBuZXcgTG9uZyhcbiAgICBieXRlc1s0XSA8PCAyNCB8XG4gICAgYnl0ZXNbNV0gPDwgMTYgfFxuICAgIGJ5dGVzWzZdIDw8IDggfFxuICAgIGJ5dGVzWzddLFxuICAgIGJ5dGVzWzBdIDw8IDI0IHxcbiAgICBieXRlc1sxXSA8PCAxNiB8XG4gICAgYnl0ZXNbMl0gPDwgOCB8XG4gICAgYnl0ZXNbM10sXG4gICAgdW5zaWduZWRcbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IExvbmc7XG4iLCAiLyogZXNsaW50LWRpc2FibGUgKi9cbmltcG9ydCBMb25nIGZyb20gXCJsb25nXCI7XG5pbXBvcnQgX20wIGZyb20gXCJwcm90b2J1ZmpzL21pbmltYWxcIjtcbmltcG9ydCB7IENvbG9yMyB9IGZyb20gXCIuLi8uLi9jb21tb24vY29sb3JzLmdlblwiO1xuY29uc3QgcHJvdG9idWZQYWNrYWdlU2FyYXNhID0gXCJkZWNlbnRyYWxhbmQuc2RrLmNvbXBvbmVudHNcIjtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VQQkF2YXRhclNoYXBlKCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGlkOiBcIlwiLFxuICAgICAgICBuYW1lOiB1bmRlZmluZWQsXG4gICAgICAgIGJvZHlTaGFwZTogdW5kZWZpbmVkLFxuICAgICAgICBza2luQ29sb3I6IHVuZGVmaW5lZCxcbiAgICAgICAgaGFpckNvbG9yOiB1bmRlZmluZWQsXG4gICAgICAgIGV5ZUNvbG9yOiB1bmRlZmluZWQsXG4gICAgICAgIGV4cHJlc3Npb25UcmlnZ2VySWQ6IHVuZGVmaW5lZCxcbiAgICAgICAgZXhwcmVzc2lvblRyaWdnZXJUaW1lc3RhbXA6IHVuZGVmaW5lZCxcbiAgICAgICAgdGFsa2luZzogdW5kZWZpbmVkLFxuICAgICAgICB3ZWFyYWJsZXM6IFtdLFxuICAgICAgICBlbW90ZXM6IFtdLFxuICAgIH07XG59XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHZhciBQQkF2YXRhclNoYXBlO1xuKGZ1bmN0aW9uIChQQkF2YXRhclNoYXBlKSB7XG4gICAgZnVuY3Rpb24gZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IF9tMC5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UuaWQgIT09IFwiXCIpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTApLnN0cmluZyhtZXNzYWdlLmlkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5uYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTgpLnN0cmluZyhtZXNzYWdlLm5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmJvZHlTaGFwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDI2KS5zdHJpbmcobWVzc2FnZS5ib2R5U2hhcGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnNraW5Db2xvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBDb2xvcjMuZW5jb2RlKG1lc3NhZ2Uuc2tpbkNvbG9yLCB3cml0ZXIudWludDMyKDM0KS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmhhaXJDb2xvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBDb2xvcjMuZW5jb2RlKG1lc3NhZ2UuaGFpckNvbG9yLCB3cml0ZXIudWludDMyKDQyKS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmV5ZUNvbG9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIENvbG9yMy5lbmNvZGUobWVzc2FnZS5leWVDb2xvciwgd3JpdGVyLnVpbnQzMig1MCkuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5leHByZXNzaW9uVHJpZ2dlcklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNTgpLnN0cmluZyhtZXNzYWdlLmV4cHJlc3Npb25UcmlnZ2VySWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmV4cHJlc3Npb25UcmlnZ2VyVGltZXN0YW1wICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNjQpLmludDY0KG1lc3NhZ2UuZXhwcmVzc2lvblRyaWdnZXJUaW1lc3RhbXApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnRhbGtpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig3MikuYm9vbChtZXNzYWdlLnRhbGtpbmcpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgdiBvZiBtZXNzYWdlLndlYXJhYmxlcykge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4Mikuc3RyaW5nKHYpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgdiBvZiBtZXNzYWdlLmVtb3Rlcykge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig5MCkuc3RyaW5nKHYpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxuICAgIFBCQXZhdGFyU2hhcGUuZW5jb2RlID0gZW5jb2RlO1xuICAgIGZ1bmN0aW9uIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgX20wLlJlYWRlciA/IGlucHV0IDogX20wLlJlYWRlci5jcmVhdGUoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VQQkF2YXRhclNoYXBlKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMTApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuaWQgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMTgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubmFtZSA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSAyNikge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5ib2R5U2hhcGUgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMzQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2tpbkNvbG9yID0gQ29sb3IzLmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gNDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuaGFpckNvbG9yID0gQ29sb3IzLmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gNTApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZXllQ29sb3IgPSBDb2xvcjMuZGVjb2RlKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSA1OCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5leHByZXNzaW9uVHJpZ2dlcklkID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDY0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmV4cHJlc3Npb25UcmlnZ2VyVGltZXN0YW1wID0gbG9uZ1RvTnVtYmVyKHJlYWRlci5pbnQ2NCgpKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSA3Mikge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50YWxraW5nID0gcmVhZGVyLmJvb2woKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gODIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uud2VhcmFibGVzLnB1c2gocmVhZGVyLnN0cmluZygpKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gOTApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZW1vdGVzLnB1c2gocmVhZGVyLnN0cmluZygpKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKHRhZyAmIDcpID09PSA0IHx8IHRhZyA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBQQkF2YXRhclNoYXBlLmRlY29kZSA9IGRlY29kZTtcbn0pKFBCQXZhdGFyU2hhcGUgfHwgKFBCQXZhdGFyU2hhcGUgPSB7fSkpO1xuY29uc3QgdHNQcm90b0dsb2JhbFRoaXMgPSAoKCkgPT4ge1xuICAgIGlmICh0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICByZXR1cm4gZ2xvYmFsVGhpcztcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIHJldHVybiBzZWxmO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICByZXR1cm4gd2luZG93O1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICByZXR1cm4gZ2xvYmFsO1xuICAgIH1cbiAgICB0aHJvdyBcIlVuYWJsZSB0byBsb2NhdGUgZ2xvYmFsIG9iamVjdFwiO1xufSkoKTtcbmZ1bmN0aW9uIGxvbmdUb051bWJlcihsb25nKSB7XG4gICAgaWYgKGxvbmcuZ3QoTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpKSB7XG4gICAgICAgIHRocm93IG5ldyB0c1Byb3RvR2xvYmFsVGhpcy5FcnJvcihcIlZhbHVlIGlzIGxhcmdlciB0aGFuIE51bWJlci5NQVhfU0FGRV9JTlRFR0VSXCIpO1xuICAgIH1cbiAgICByZXR1cm4gbG9uZy50b051bWJlcigpO1xufVxuaWYgKF9tMC51dGlsLkxvbmcgIT09IExvbmcpIHtcbiAgICBfbTAudXRpbC5Mb25nID0gTG9uZztcbiAgICBfbTAuY29uZmlndXJlKCk7XG59XG4iLCAiLyogZXNsaW50LWRpc2FibGUgKi9cbmltcG9ydCBfbTAgZnJvbSBcInByb3RvYnVmanMvbWluaW1hbFwiO1xuY29uc3QgcHJvdG9idWZQYWNrYWdlU2FyYXNhID0gXCJkZWNlbnRyYWxhbmQuY29tbW9uXCI7XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ29sb3IzKCkge1xuICAgIHJldHVybiB7IHI6IDAsIGc6IDAsIGI6IDAgfTtcbn1cbi8qKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdmFyIENvbG9yMztcbihmdW5jdGlvbiAoQ29sb3IzKSB7XG4gICAgZnVuY3Rpb24gZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IF9tMC5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UuciAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxMykuZmxvYXQobWVzc2FnZS5yKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5nICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDIxKS5mbG9hdChtZXNzYWdlLmcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmIgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMjkpLmZsb2F0KG1lc3NhZ2UuYik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9XG4gICAgQ29sb3IzLmVuY29kZSA9IGVuY29kZTtcbiAgICBmdW5jdGlvbiBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIF9tMC5SZWFkZXIgPyBpbnB1dCA6IF9tMC5SZWFkZXIuY3JlYXRlKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ29sb3IzKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMTMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuciA9IHJlYWRlci5mbG9hdCgpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDIxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmcgPSByZWFkZXIuZmxvYXQoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSAyOSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5iID0gcmVhZGVyLmZsb2F0KCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCh0YWcgJiA3KSA9PT0gNCB8fCB0YWcgPT09IDApIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgQ29sb3IzLmRlY29kZSA9IGRlY29kZTtcbn0pKENvbG9yMyB8fCAoQ29sb3IzID0ge30pKTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDb2xvcjQoKSB7XG4gICAgcmV0dXJuIHsgcjogMCwgZzogMCwgYjogMCwgYTogMCB9O1xufVxuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB2YXIgQ29sb3I0O1xuKGZ1bmN0aW9uIChDb2xvcjQpIHtcbiAgICBmdW5jdGlvbiBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gX20wLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5yICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDEzKS5mbG9hdChtZXNzYWdlLnIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmcgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMjEpLmZsb2F0KG1lc3NhZ2UuZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuYiAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyOSkuZmxvYXQobWVzc2FnZS5iKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5hICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDM3KS5mbG9hdChtZXNzYWdlLmEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxuICAgIENvbG9yNC5lbmNvZGUgPSBlbmNvZGU7XG4gICAgZnVuY3Rpb24gZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBfbTAuUmVhZGVyID8gaW5wdXQgOiBfbTAuUmVhZGVyLmNyZWF0ZShpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNvbG9yNCgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDEzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnIgPSByZWFkZXIuZmxvYXQoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSAyMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5nID0gcmVhZGVyLmZsb2F0KCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMjkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuYiA9IHJlYWRlci5mbG9hdCgpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDM3KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmEgPSByZWFkZXIuZmxvYXQoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKHRhZyAmIDcpID09PSA0IHx8IHRhZyA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBDb2xvcjQuZGVjb2RlID0gZGVjb2RlO1xufSkoQ29sb3I0IHx8IChDb2xvcjQgPSB7fSkpO1xuIiwgImltcG9ydCB7IFBCQXZhdGFyU2hhcGUgfSBmcm9tICcuL3BiL2RlY2VudHJhbGFuZC9zZGsvY29tcG9uZW50cy9hdmF0YXJfc2hhcGUuZ2VuJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBBdmF0YXJTaGFwZVNjaGVtYSA9IHtcbiAgICBDT01QT05FTlRfSUQ6IDEwODAsXG4gICAgc2VyaWFsaXplKHZhbHVlLCBidWlsZGVyKSB7XG4gICAgICAgIGNvbnN0IHdyaXRlciA9IFBCQXZhdGFyU2hhcGUuZW5jb2RlKHZhbHVlKTtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkod3JpdGVyLmZpbmlzaCgpLCAwLCB3cml0ZXIubGVuKTtcbiAgICAgICAgYnVpbGRlci53cml0ZUJ1ZmZlcihidWZmZXIsIGZhbHNlKTtcbiAgICB9LFxuICAgIGRlc2VyaWFsaXplKHJlYWRlcikge1xuICAgICAgICByZXR1cm4gUEJBdmF0YXJTaGFwZS5kZWNvZGUocmVhZGVyLmJ1ZmZlcigpLCByZWFkZXIucmVtYWluaW5nQnl0ZXMoKSk7XG4gICAgfSxcbiAgICBjcmVhdGUoKSB7XG4gICAgICAgIC8vIFRPRE86IHRoaXMgaXMgYSBoYWNrLlxuICAgICAgICByZXR1cm4gUEJBdmF0YXJTaGFwZS5kZWNvZGUobmV3IFVpbnQ4QXJyYXkoKSk7XG4gICAgfSxcbiAgICBqc29uU2NoZW1hOiB7XG4gICAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgIHByb3BlcnRpZXM6IHt9LFxuICAgICAgICBzZXJpYWxpemF0aW9uVHlwZTogXCJwcm90b2NvbC1idWZmZXJcIixcbiAgICAgICAgcHJvdG9jb2xCdWZmZXI6IFwiUEJBdmF0YXJTaGFwZVwiXG4gICAgfVxufTtcbiIsICIvKiBlc2xpbnQtZGlzYWJsZSAqL1xuaW1wb3J0IF9tMCBmcm9tIFwicHJvdG9idWZqcy9taW5pbWFsXCI7XG5jb25zdCBwcm90b2J1ZlBhY2thZ2VTYXJhc2EgPSBcImRlY2VudHJhbGFuZC5zZGsuY29tcG9uZW50c1wiO1xuLyoqXG4gKiBCaWxsYm9hcmRNb2RlIGluZGljYXRlcyBvbmUgb3IgbW9yZSBheGlzIGZvciBhdXRvbWF0aWMgcm90YXRpb24sIGluIE9SLWFibGUgYml0IGZsYWcgZm9ybS5cbiAqIE9ubHkgdGhlIHZhbHVlcyBiZWxvdyBhbmQgdGhlIChCTV9YIHwgQk1fWSkgY29tYmluYXRpb24gYXJlIHZhbGlkLlxuICovXG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHZhciBCaWxsYm9hcmRNb2RlO1xuKGZ1bmN0aW9uIChCaWxsYm9hcmRNb2RlKSB7XG4gICAgQmlsbGJvYXJkTW9kZVtCaWxsYm9hcmRNb2RlW1wiQk1fTk9ORVwiXSA9IDBdID0gXCJCTV9OT05FXCI7XG4gICAgQmlsbGJvYXJkTW9kZVtCaWxsYm9hcmRNb2RlW1wiQk1fWFwiXSA9IDFdID0gXCJCTV9YXCI7XG4gICAgQmlsbGJvYXJkTW9kZVtCaWxsYm9hcmRNb2RlW1wiQk1fWVwiXSA9IDJdID0gXCJCTV9ZXCI7XG4gICAgQmlsbGJvYXJkTW9kZVtCaWxsYm9hcmRNb2RlW1wiQk1fWlwiXSA9IDRdID0gXCJCTV9aXCI7XG4gICAgLyoqIEJNX0FMTCAtIGJpdHdpc2UgY29tYmluYXRpb24gQk1fWCB8IEJNX1kgfCBCTV9aICovXG4gICAgQmlsbGJvYXJkTW9kZVtCaWxsYm9hcmRNb2RlW1wiQk1fQUxMXCJdID0gN10gPSBcIkJNX0FMTFwiO1xufSkoQmlsbGJvYXJkTW9kZSB8fCAoQmlsbGJvYXJkTW9kZSA9IHt9KSk7XG5mdW5jdGlvbiBjcmVhdGVCYXNlUEJCaWxsYm9hcmQoKSB7XG4gICAgcmV0dXJuIHsgYmlsbGJvYXJkTW9kZTogdW5kZWZpbmVkIH07XG59XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHZhciBQQkJpbGxib2FyZDtcbihmdW5jdGlvbiAoUEJCaWxsYm9hcmQpIHtcbiAgICBmdW5jdGlvbiBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gX20wLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5iaWxsYm9hcmRNb2RlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkuaW50MzIobWVzc2FnZS5iaWxsYm9hcmRNb2RlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbiAgICBQQkJpbGxib2FyZC5lbmNvZGUgPSBlbmNvZGU7XG4gICAgZnVuY3Rpb24gZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBfbTAuUmVhZGVyID8gaW5wdXQgOiBfbTAuUmVhZGVyLmNyZWF0ZShpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZVBCQmlsbGJvYXJkKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gOCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5iaWxsYm9hcmRNb2RlID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCh0YWcgJiA3KSA9PT0gNCB8fCB0YWcgPT09IDApIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgUEJCaWxsYm9hcmQuZGVjb2RlID0gZGVjb2RlO1xufSkoUEJCaWxsYm9hcmQgfHwgKFBCQmlsbGJvYXJkID0ge30pKTtcbiIsICJpbXBvcnQgeyBQQkJpbGxib2FyZCB9IGZyb20gJy4vcGIvZGVjZW50cmFsYW5kL3Nkay9jb21wb25lbnRzL2JpbGxib2FyZC5nZW4nO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IEJpbGxib2FyZFNjaGVtYSA9IHtcbiAgICBDT01QT05FTlRfSUQ6IDEwOTAsXG4gICAgc2VyaWFsaXplKHZhbHVlLCBidWlsZGVyKSB7XG4gICAgICAgIGNvbnN0IHdyaXRlciA9IFBCQmlsbGJvYXJkLmVuY29kZSh2YWx1ZSk7XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KHdyaXRlci5maW5pc2goKSwgMCwgd3JpdGVyLmxlbik7XG4gICAgICAgIGJ1aWxkZXIud3JpdGVCdWZmZXIoYnVmZmVyLCBmYWxzZSk7XG4gICAgfSxcbiAgICBkZXNlcmlhbGl6ZShyZWFkZXIpIHtcbiAgICAgICAgcmV0dXJuIFBCQmlsbGJvYXJkLmRlY29kZShyZWFkZXIuYnVmZmVyKCksIHJlYWRlci5yZW1haW5pbmdCeXRlcygpKTtcbiAgICB9LFxuICAgIGNyZWF0ZSgpIHtcbiAgICAgICAgLy8gVE9ETzogdGhpcyBpcyBhIGhhY2suXG4gICAgICAgIHJldHVybiBQQkJpbGxib2FyZC5kZWNvZGUobmV3IFVpbnQ4QXJyYXkoKSk7XG4gICAgfSxcbiAgICBqc29uU2NoZW1hOiB7XG4gICAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgIHByb3BlcnRpZXM6IHt9LFxuICAgICAgICBzZXJpYWxpemF0aW9uVHlwZTogXCJwcm90b2NvbC1idWZmZXJcIixcbiAgICAgICAgcHJvdG9jb2xCdWZmZXI6IFwiUEJCaWxsYm9hcmRcIlxuICAgIH1cbn07XG4iLCAiLyogZXNsaW50LWRpc2FibGUgKi9cbmltcG9ydCBfbTAgZnJvbSBcInByb3RvYnVmanMvbWluaW1hbFwiO1xuY29uc3QgcHJvdG9idWZQYWNrYWdlU2FyYXNhID0gXCJkZWNlbnRyYWxhbmQuc2RrLmNvbXBvbmVudHNcIjtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VQQkNhbWVyYU1vZGUoKSB7XG4gICAgcmV0dXJuIHsgbW9kZTogMCB9O1xufVxuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB2YXIgUEJDYW1lcmFNb2RlO1xuKGZ1bmN0aW9uIChQQkNhbWVyYU1vZGUpIHtcbiAgICBmdW5jdGlvbiBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gX20wLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5tb2RlICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgpLmludDMyKG1lc3NhZ2UubW9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9XG4gICAgUEJDYW1lcmFNb2RlLmVuY29kZSA9IGVuY29kZTtcbiAgICBmdW5jdGlvbiBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIF9tMC5SZWFkZXIgPyBpbnB1dCA6IF9tMC5SZWFkZXIuY3JlYXRlKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlUEJDYW1lcmFNb2RlKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gOCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5tb2RlID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCh0YWcgJiA3KSA9PT0gNCB8fCB0YWcgPT09IDApIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgUEJDYW1lcmFNb2RlLmRlY29kZSA9IGRlY29kZTtcbn0pKFBCQ2FtZXJhTW9kZSB8fCAoUEJDYW1lcmFNb2RlID0ge30pKTtcbiIsICJpbXBvcnQgeyBQQkNhbWVyYU1vZGUgfSBmcm9tICcuL3BiL2RlY2VudHJhbGFuZC9zZGsvY29tcG9uZW50cy9jYW1lcmFfbW9kZS5nZW4nO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IENhbWVyYU1vZGVTY2hlbWEgPSB7XG4gICAgQ09NUE9ORU5UX0lEOiAxMDcyLFxuICAgIHNlcmlhbGl6ZSh2YWx1ZSwgYnVpbGRlcikge1xuICAgICAgICBjb25zdCB3cml0ZXIgPSBQQkNhbWVyYU1vZGUuZW5jb2RlKHZhbHVlKTtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkod3JpdGVyLmZpbmlzaCgpLCAwLCB3cml0ZXIubGVuKTtcbiAgICAgICAgYnVpbGRlci53cml0ZUJ1ZmZlcihidWZmZXIsIGZhbHNlKTtcbiAgICB9LFxuICAgIGRlc2VyaWFsaXplKHJlYWRlcikge1xuICAgICAgICByZXR1cm4gUEJDYW1lcmFNb2RlLmRlY29kZShyZWFkZXIuYnVmZmVyKCksIHJlYWRlci5yZW1haW5pbmdCeXRlcygpKTtcbiAgICB9LFxuICAgIGNyZWF0ZSgpIHtcbiAgICAgICAgLy8gVE9ETzogdGhpcyBpcyBhIGhhY2suXG4gICAgICAgIHJldHVybiBQQkNhbWVyYU1vZGUuZGVjb2RlKG5ldyBVaW50OEFycmF5KCkpO1xuICAgIH0sXG4gICAganNvblNjaGVtYToge1xuICAgICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgICBwcm9wZXJ0aWVzOiB7fSxcbiAgICAgICAgc2VyaWFsaXphdGlvblR5cGU6IFwicHJvdG9jb2wtYnVmZmVyXCIsXG4gICAgICAgIHByb3RvY29sQnVmZmVyOiBcIlBCQ2FtZXJhTW9kZVwiXG4gICAgfVxufTtcbiIsICIvKiBlc2xpbnQtZGlzYWJsZSAqL1xuaW1wb3J0IF9tMCBmcm9tIFwicHJvdG9idWZqcy9taW5pbWFsXCI7XG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSBcIi4uLy4uL2NvbW1vbi92ZWN0b3JzLmdlblwiO1xuY29uc3QgcHJvdG9idWZQYWNrYWdlU2FyYXNhID0gXCJkZWNlbnRyYWxhbmQuc2RrLmNvbXBvbmVudHNcIjtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VQQkNhbWVyYU1vZGVBcmVhKCkge1xuICAgIHJldHVybiB7IGFyZWE6IHVuZGVmaW5lZCwgbW9kZTogMCB9O1xufVxuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB2YXIgUEJDYW1lcmFNb2RlQXJlYTtcbihmdW5jdGlvbiAoUEJDYW1lcmFNb2RlQXJlYSkge1xuICAgIGZ1bmN0aW9uIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBfbTAuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLmFyZWEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgVmVjdG9yMy5lbmNvZGUobWVzc2FnZS5hcmVhLCB3cml0ZXIudWludDMyKDEwKS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLm1vZGUgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTYpLmludDMyKG1lc3NhZ2UubW9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9XG4gICAgUEJDYW1lcmFNb2RlQXJlYS5lbmNvZGUgPSBlbmNvZGU7XG4gICAgZnVuY3Rpb24gZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBfbTAuUmVhZGVyID8gaW5wdXQgOiBfbTAuUmVhZGVyLmNyZWF0ZShpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZVBCQ2FtZXJhTW9kZUFyZWEoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSAxMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5hcmVhID0gVmVjdG9yMy5kZWNvZGUocmVhZGVyLCByZWFkZXIudWludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDE2KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm1vZGUgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKHRhZyAmIDcpID09PSA0IHx8IHRhZyA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBQQkNhbWVyYU1vZGVBcmVhLmRlY29kZSA9IGRlY29kZTtcbn0pKFBCQ2FtZXJhTW9kZUFyZWEgfHwgKFBCQ2FtZXJhTW9kZUFyZWEgPSB7fSkpO1xuIiwgImltcG9ydCB7IFBCQ2FtZXJhTW9kZUFyZWEgfSBmcm9tICcuL3BiL2RlY2VudHJhbGFuZC9zZGsvY29tcG9uZW50cy9jYW1lcmFfbW9kZV9hcmVhLmdlbic7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgQ2FtZXJhTW9kZUFyZWFTY2hlbWEgPSB7XG4gICAgQ09NUE9ORU5UX0lEOiAxMDcxLFxuICAgIHNlcmlhbGl6ZSh2YWx1ZSwgYnVpbGRlcikge1xuICAgICAgICBjb25zdCB3cml0ZXIgPSBQQkNhbWVyYU1vZGVBcmVhLmVuY29kZSh2YWx1ZSk7XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KHdyaXRlci5maW5pc2goKSwgMCwgd3JpdGVyLmxlbik7XG4gICAgICAgIGJ1aWxkZXIud3JpdGVCdWZmZXIoYnVmZmVyLCBmYWxzZSk7XG4gICAgfSxcbiAgICBkZXNlcmlhbGl6ZShyZWFkZXIpIHtcbiAgICAgICAgcmV0dXJuIFBCQ2FtZXJhTW9kZUFyZWEuZGVjb2RlKHJlYWRlci5idWZmZXIoKSwgcmVhZGVyLnJlbWFpbmluZ0J5dGVzKCkpO1xuICAgIH0sXG4gICAgY3JlYXRlKCkge1xuICAgICAgICAvLyBUT0RPOiB0aGlzIGlzIGEgaGFjay5cbiAgICAgICAgcmV0dXJuIFBCQ2FtZXJhTW9kZUFyZWEuZGVjb2RlKG5ldyBVaW50OEFycmF5KCkpO1xuICAgIH0sXG4gICAganNvblNjaGVtYToge1xuICAgICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgICBwcm9wZXJ0aWVzOiB7fSxcbiAgICAgICAgc2VyaWFsaXphdGlvblR5cGU6IFwicHJvdG9jb2wtYnVmZmVyXCIsXG4gICAgICAgIHByb3RvY29sQnVmZmVyOiBcIlBCQ2FtZXJhTW9kZUFyZWFcIlxuICAgIH1cbn07XG4iLCAiLyogZXNsaW50LWRpc2FibGUgKi9cbmltcG9ydCBfbTAgZnJvbSBcInByb3RvYnVmanMvbWluaW1hbFwiO1xuY29uc3QgcHJvdG9idWZQYWNrYWdlU2FyYXNhID0gXCJkZWNlbnRyYWxhbmQuc2RrLmNvbXBvbmVudHNcIjtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VQQkVuZ2luZUluZm8oKSB7XG4gICAgcmV0dXJuIHsgZnJhbWVOdW1iZXI6IDAsIHRvdGFsUnVudGltZTogMCwgdGlja051bWJlcjogMCB9O1xufVxuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB2YXIgUEJFbmdpbmVJbmZvO1xuKGZ1bmN0aW9uIChQQkVuZ2luZUluZm8pIHtcbiAgICBmdW5jdGlvbiBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gX20wLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5mcmFtZU51bWJlciAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS51aW50MzIobWVzc2FnZS5mcmFtZU51bWJlcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UudG90YWxSdW50aW1lICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDIxKS5mbG9hdChtZXNzYWdlLnRvdGFsUnVudGltZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UudGlja051bWJlciAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyNCkudWludDMyKG1lc3NhZ2UudGlja051bWJlcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9XG4gICAgUEJFbmdpbmVJbmZvLmVuY29kZSA9IGVuY29kZTtcbiAgICBmdW5jdGlvbiBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIF9tMC5SZWFkZXIgPyBpbnB1dCA6IF9tMC5SZWFkZXIuY3JlYXRlKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlUEJFbmdpbmVJbmZvKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gOCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5mcmFtZU51bWJlciA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSAyMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50b3RhbFJ1bnRpbWUgPSByZWFkZXIuZmxvYXQoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSAyNCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50aWNrTnVtYmVyID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgodGFnICYgNykgPT09IDQgfHwgdGFnID09PSAwKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIFBCRW5naW5lSW5mby5kZWNvZGUgPSBkZWNvZGU7XG59KShQQkVuZ2luZUluZm8gfHwgKFBCRW5naW5lSW5mbyA9IHt9KSk7XG4iLCAiaW1wb3J0IHsgUEJFbmdpbmVJbmZvIH0gZnJvbSAnLi9wYi9kZWNlbnRyYWxhbmQvc2RrL2NvbXBvbmVudHMvZW5naW5lX2luZm8uZ2VuJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBFbmdpbmVJbmZvU2NoZW1hID0ge1xuICAgIENPTVBPTkVOVF9JRDogMTA0OCxcbiAgICBzZXJpYWxpemUodmFsdWUsIGJ1aWxkZXIpIHtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gUEJFbmdpbmVJbmZvLmVuY29kZSh2YWx1ZSk7XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KHdyaXRlci5maW5pc2goKSwgMCwgd3JpdGVyLmxlbik7XG4gICAgICAgIGJ1aWxkZXIud3JpdGVCdWZmZXIoYnVmZmVyLCBmYWxzZSk7XG4gICAgfSxcbiAgICBkZXNlcmlhbGl6ZShyZWFkZXIpIHtcbiAgICAgICAgcmV0dXJuIFBCRW5naW5lSW5mby5kZWNvZGUocmVhZGVyLmJ1ZmZlcigpLCByZWFkZXIucmVtYWluaW5nQnl0ZXMoKSk7XG4gICAgfSxcbiAgICBjcmVhdGUoKSB7XG4gICAgICAgIC8vIFRPRE86IHRoaXMgaXMgYSBoYWNrLlxuICAgICAgICByZXR1cm4gUEJFbmdpbmVJbmZvLmRlY29kZShuZXcgVWludDhBcnJheSgpKTtcbiAgICB9LFxuICAgIGpzb25TY2hlbWE6IHtcbiAgICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgICAgcHJvcGVydGllczoge30sXG4gICAgICAgIHNlcmlhbGl6YXRpb25UeXBlOiBcInByb3RvY29sLWJ1ZmZlclwiLFxuICAgICAgICBwcm90b2NvbEJ1ZmZlcjogXCJQQkVuZ2luZUluZm9cIlxuICAgIH1cbn07XG4iLCAiLyogZXNsaW50LWRpc2FibGUgKi9cbmltcG9ydCBfbTAgZnJvbSBcInByb3RvYnVmanMvbWluaW1hbFwiO1xuY29uc3QgcHJvdG9idWZQYWNrYWdlU2FyYXNhID0gXCJkZWNlbnRyYWxhbmQuc2RrLmNvbXBvbmVudHNcIjtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VQQkdsdGZDb250YWluZXIoKSB7XG4gICAgcmV0dXJuIHsgc3JjOiBcIlwiLCB2aXNpYmxlTWVzaGVzQ29sbGlzaW9uTWFzazogdW5kZWZpbmVkLCBpbnZpc2libGVNZXNoZXNDb2xsaXNpb25NYXNrOiB1bmRlZmluZWQgfTtcbn1cbi8qKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdmFyIFBCR2x0ZkNvbnRhaW5lcjtcbihmdW5jdGlvbiAoUEJHbHRmQ29udGFpbmVyKSB7XG4gICAgZnVuY3Rpb24gZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IF9tMC5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2Uuc3JjICE9PSBcIlwiKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDEwKS5zdHJpbmcobWVzc2FnZS5zcmMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnZpc2libGVNZXNoZXNDb2xsaXNpb25NYXNrICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMzIpLnVpbnQzMihtZXNzYWdlLnZpc2libGVNZXNoZXNDb2xsaXNpb25NYXNrKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5pbnZpc2libGVNZXNoZXNDb2xsaXNpb25NYXNrICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNDApLnVpbnQzMihtZXNzYWdlLmludmlzaWJsZU1lc2hlc0NvbGxpc2lvbk1hc2spO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxuICAgIFBCR2x0ZkNvbnRhaW5lci5lbmNvZGUgPSBlbmNvZGU7XG4gICAgZnVuY3Rpb24gZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBfbTAuUmVhZGVyID8gaW5wdXQgOiBfbTAuUmVhZGVyLmNyZWF0ZShpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZVBCR2x0ZkNvbnRhaW5lcigpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDEwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnNyYyA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSAzMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS52aXNpYmxlTWVzaGVzQ29sbGlzaW9uTWFzayA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSA0MCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5pbnZpc2libGVNZXNoZXNDb2xsaXNpb25NYXNrID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgodGFnICYgNykgPT09IDQgfHwgdGFnID09PSAwKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIFBCR2x0ZkNvbnRhaW5lci5kZWNvZGUgPSBkZWNvZGU7XG59KShQQkdsdGZDb250YWluZXIgfHwgKFBCR2x0ZkNvbnRhaW5lciA9IHt9KSk7XG4iLCAiaW1wb3J0IHsgUEJHbHRmQ29udGFpbmVyIH0gZnJvbSAnLi9wYi9kZWNlbnRyYWxhbmQvc2RrL2NvbXBvbmVudHMvZ2x0Zl9jb250YWluZXIuZ2VuJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBHbHRmQ29udGFpbmVyU2NoZW1hID0ge1xuICAgIENPTVBPTkVOVF9JRDogMTA0MSxcbiAgICBzZXJpYWxpemUodmFsdWUsIGJ1aWxkZXIpIHtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gUEJHbHRmQ29udGFpbmVyLmVuY29kZSh2YWx1ZSk7XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KHdyaXRlci5maW5pc2goKSwgMCwgd3JpdGVyLmxlbik7XG4gICAgICAgIGJ1aWxkZXIud3JpdGVCdWZmZXIoYnVmZmVyLCBmYWxzZSk7XG4gICAgfSxcbiAgICBkZXNlcmlhbGl6ZShyZWFkZXIpIHtcbiAgICAgICAgcmV0dXJuIFBCR2x0ZkNvbnRhaW5lci5kZWNvZGUocmVhZGVyLmJ1ZmZlcigpLCByZWFkZXIucmVtYWluaW5nQnl0ZXMoKSk7XG4gICAgfSxcbiAgICBjcmVhdGUoKSB7XG4gICAgICAgIC8vIFRPRE86IHRoaXMgaXMgYSBoYWNrLlxuICAgICAgICByZXR1cm4gUEJHbHRmQ29udGFpbmVyLmRlY29kZShuZXcgVWludDhBcnJheSgpKTtcbiAgICB9LFxuICAgIGpzb25TY2hlbWE6IHtcbiAgICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgICAgcHJvcGVydGllczoge30sXG4gICAgICAgIHNlcmlhbGl6YXRpb25UeXBlOiBcInByb3RvY29sLWJ1ZmZlclwiLFxuICAgICAgICBwcm90b2NvbEJ1ZmZlcjogXCJQQkdsdGZDb250YWluZXJcIlxuICAgIH1cbn07XG4iLCAiLyogZXNsaW50LWRpc2FibGUgKi9cbmltcG9ydCBfbTAgZnJvbSBcInByb3RvYnVmanMvbWluaW1hbFwiO1xuY29uc3QgcHJvdG9idWZQYWNrYWdlU2FyYXNhID0gXCJkZWNlbnRyYWxhbmQuc2RrLmNvbXBvbmVudHNcIjtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VQQkdsdGZDb250YWluZXJMb2FkaW5nU3RhdGUoKSB7XG4gICAgcmV0dXJuIHsgY3VycmVudFN0YXRlOiAwIH07XG59XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHZhciBQQkdsdGZDb250YWluZXJMb2FkaW5nU3RhdGU7XG4oZnVuY3Rpb24gKFBCR2x0ZkNvbnRhaW5lckxvYWRpbmdTdGF0ZSkge1xuICAgIGZ1bmN0aW9uIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBfbTAuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLmN1cnJlbnRTdGF0ZSAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS5pbnQzMihtZXNzYWdlLmN1cnJlbnRTdGF0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9XG4gICAgUEJHbHRmQ29udGFpbmVyTG9hZGluZ1N0YXRlLmVuY29kZSA9IGVuY29kZTtcbiAgICBmdW5jdGlvbiBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIF9tMC5SZWFkZXIgPyBpbnB1dCA6IF9tMC5SZWFkZXIuY3JlYXRlKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlUEJHbHRmQ29udGFpbmVyTG9hZGluZ1N0YXRlKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gOCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5jdXJyZW50U3RhdGUgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKHRhZyAmIDcpID09PSA0IHx8IHRhZyA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBQQkdsdGZDb250YWluZXJMb2FkaW5nU3RhdGUuZGVjb2RlID0gZGVjb2RlO1xufSkoUEJHbHRmQ29udGFpbmVyTG9hZGluZ1N0YXRlIHx8IChQQkdsdGZDb250YWluZXJMb2FkaW5nU3RhdGUgPSB7fSkpO1xuIiwgImltcG9ydCB7IFBCR2x0ZkNvbnRhaW5lckxvYWRpbmdTdGF0ZSB9IGZyb20gJy4vcGIvZGVjZW50cmFsYW5kL3Nkay9jb21wb25lbnRzL2dsdGZfY29udGFpbmVyX2xvYWRpbmdfc3RhdGUuZ2VuJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBHbHRmQ29udGFpbmVyTG9hZGluZ1N0YXRlU2NoZW1hID0ge1xuICAgIENPTVBPTkVOVF9JRDogMTA0OSxcbiAgICBzZXJpYWxpemUodmFsdWUsIGJ1aWxkZXIpIHtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gUEJHbHRmQ29udGFpbmVyTG9hZGluZ1N0YXRlLmVuY29kZSh2YWx1ZSk7XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KHdyaXRlci5maW5pc2goKSwgMCwgd3JpdGVyLmxlbik7XG4gICAgICAgIGJ1aWxkZXIud3JpdGVCdWZmZXIoYnVmZmVyLCBmYWxzZSk7XG4gICAgfSxcbiAgICBkZXNlcmlhbGl6ZShyZWFkZXIpIHtcbiAgICAgICAgcmV0dXJuIFBCR2x0ZkNvbnRhaW5lckxvYWRpbmdTdGF0ZS5kZWNvZGUocmVhZGVyLmJ1ZmZlcigpLCByZWFkZXIucmVtYWluaW5nQnl0ZXMoKSk7XG4gICAgfSxcbiAgICBjcmVhdGUoKSB7XG4gICAgICAgIC8vIFRPRE86IHRoaXMgaXMgYSBoYWNrLlxuICAgICAgICByZXR1cm4gUEJHbHRmQ29udGFpbmVyTG9hZGluZ1N0YXRlLmRlY29kZShuZXcgVWludDhBcnJheSgpKTtcbiAgICB9LFxuICAgIGpzb25TY2hlbWE6IHtcbiAgICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgICAgcHJvcGVydGllczoge30sXG4gICAgICAgIHNlcmlhbGl6YXRpb25UeXBlOiBcInByb3RvY29sLWJ1ZmZlclwiLFxuICAgICAgICBwcm90b2NvbEJ1ZmZlcjogXCJQQkdsdGZDb250YWluZXJMb2FkaW5nU3RhdGVcIlxuICAgIH1cbn07XG4iLCAiLyogZXNsaW50LWRpc2FibGUgKi9cbmltcG9ydCBfbTAgZnJvbSBcInByb3RvYnVmanMvbWluaW1hbFwiO1xuaW1wb3J0IHsgQ29sb3IzLCBDb2xvcjQgfSBmcm9tIFwiLi4vLi4vY29tbW9uL2NvbG9ycy5nZW5cIjtcbmltcG9ydCB7IFRleHR1cmVVbmlvbiB9IGZyb20gXCIuLi8uLi9jb21tb24vdGV4dHVyZS5nZW5cIjtcbmNvbnN0IHByb3RvYnVmUGFja2FnZVNhcmFzYSA9IFwiZGVjZW50cmFsYW5kLnNkay5jb21wb25lbnRzXCI7XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHZhciBNYXRlcmlhbFRyYW5zcGFyZW5jeU1vZGU7XG4oZnVuY3Rpb24gKE1hdGVyaWFsVHJhbnNwYXJlbmN5TW9kZSkge1xuICAgIE1hdGVyaWFsVHJhbnNwYXJlbmN5TW9kZVtNYXRlcmlhbFRyYW5zcGFyZW5jeU1vZGVbXCJNVE1fT1BBUVVFXCJdID0gMF0gPSBcIk1UTV9PUEFRVUVcIjtcbiAgICBNYXRlcmlhbFRyYW5zcGFyZW5jeU1vZGVbTWF0ZXJpYWxUcmFuc3BhcmVuY3lNb2RlW1wiTVRNX0FMUEhBX1RFU1RcIl0gPSAxXSA9IFwiTVRNX0FMUEhBX1RFU1RcIjtcbiAgICBNYXRlcmlhbFRyYW5zcGFyZW5jeU1vZGVbTWF0ZXJpYWxUcmFuc3BhcmVuY3lNb2RlW1wiTVRNX0FMUEhBX0JMRU5EXCJdID0gMl0gPSBcIk1UTV9BTFBIQV9CTEVORFwiO1xuICAgIE1hdGVyaWFsVHJhbnNwYXJlbmN5TW9kZVtNYXRlcmlhbFRyYW5zcGFyZW5jeU1vZGVbXCJNVE1fQUxQSEFfVEVTVF9BTkRfQUxQSEFfQkxFTkRcIl0gPSAzXSA9IFwiTVRNX0FMUEhBX1RFU1RfQU5EX0FMUEhBX0JMRU5EXCI7XG4gICAgTWF0ZXJpYWxUcmFuc3BhcmVuY3lNb2RlW01hdGVyaWFsVHJhbnNwYXJlbmN5TW9kZVtcIk1UTV9BVVRPXCJdID0gNF0gPSBcIk1UTV9BVVRPXCI7XG59KShNYXRlcmlhbFRyYW5zcGFyZW5jeU1vZGUgfHwgKE1hdGVyaWFsVHJhbnNwYXJlbmN5TW9kZSA9IHt9KSk7XG5mdW5jdGlvbiBjcmVhdGVCYXNlUEJNYXRlcmlhbCgpIHtcbiAgICByZXR1cm4geyBtYXRlcmlhbDogdW5kZWZpbmVkIH07XG59XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHZhciBQQk1hdGVyaWFsO1xuKGZ1bmN0aW9uIChQQk1hdGVyaWFsKSB7XG4gICAgZnVuY3Rpb24gZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IF9tMC5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgc3dpdGNoIChtZXNzYWdlLm1hdGVyaWFsPy4kY2FzZSkge1xuICAgICAgICAgICAgY2FzZSBcInVubGl0XCI6XG4gICAgICAgICAgICAgICAgUEJNYXRlcmlhbF9VbmxpdE1hdGVyaWFsLmVuY29kZShtZXNzYWdlLm1hdGVyaWFsLnVubGl0LCB3cml0ZXIudWludDMyKDEwKS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcInBiclwiOlxuICAgICAgICAgICAgICAgIFBCTWF0ZXJpYWxfUGJyTWF0ZXJpYWwuZW5jb2RlKG1lc3NhZ2UubWF0ZXJpYWwucGJyLCB3cml0ZXIudWludDMyKDE4KS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxuICAgIFBCTWF0ZXJpYWwuZW5jb2RlID0gZW5jb2RlO1xuICAgIGZ1bmN0aW9uIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgX20wLlJlYWRlciA/IGlucHV0IDogX20wLlJlYWRlci5jcmVhdGUoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VQQk1hdGVyaWFsKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMTApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubWF0ZXJpYWwgPSB7ICRjYXNlOiBcInVubGl0XCIsIHVubGl0OiBQQk1hdGVyaWFsX1VubGl0TWF0ZXJpYWwuZGVjb2RlKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpKSB9O1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDE4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm1hdGVyaWFsID0geyAkY2FzZTogXCJwYnJcIiwgcGJyOiBQQk1hdGVyaWFsX1Bick1hdGVyaWFsLmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSkgfTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKHRhZyAmIDcpID09PSA0IHx8IHRhZyA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBQQk1hdGVyaWFsLmRlY29kZSA9IGRlY29kZTtcbn0pKFBCTWF0ZXJpYWwgfHwgKFBCTWF0ZXJpYWwgPSB7fSkpO1xuZnVuY3Rpb24gY3JlYXRlQmFzZVBCTWF0ZXJpYWxfVW5saXRNYXRlcmlhbCgpIHtcbiAgICByZXR1cm4geyB0ZXh0dXJlOiB1bmRlZmluZWQsIGFscGhhVGVzdDogdW5kZWZpbmVkLCBjYXN0U2hhZG93czogdW5kZWZpbmVkLCBkaWZmdXNlQ29sb3I6IHVuZGVmaW5lZCB9O1xufVxuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB2YXIgUEJNYXRlcmlhbF9VbmxpdE1hdGVyaWFsO1xuKGZ1bmN0aW9uIChQQk1hdGVyaWFsX1VubGl0TWF0ZXJpYWwpIHtcbiAgICBmdW5jdGlvbiBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gX20wLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS50ZXh0dXJlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIFRleHR1cmVVbmlvbi5lbmNvZGUobWVzc2FnZS50ZXh0dXJlLCB3cml0ZXIudWludDMyKDEwKS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmFscGhhVGVzdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDIxKS5mbG9hdChtZXNzYWdlLmFscGhhVGVzdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuY2FzdFNoYWRvd3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyNCkuYm9vbChtZXNzYWdlLmNhc3RTaGFkb3dzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5kaWZmdXNlQ29sb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgQ29sb3I0LmVuY29kZShtZXNzYWdlLmRpZmZ1c2VDb2xvciwgd3JpdGVyLnVpbnQzMigzNCkuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbiAgICBQQk1hdGVyaWFsX1VubGl0TWF0ZXJpYWwuZW5jb2RlID0gZW5jb2RlO1xuICAgIGZ1bmN0aW9uIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgX20wLlJlYWRlciA/IGlucHV0IDogX20wLlJlYWRlci5jcmVhdGUoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VQQk1hdGVyaWFsX1VubGl0TWF0ZXJpYWwoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSAxMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50ZXh0dXJlID0gVGV4dHVyZVVuaW9uLmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMjEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuYWxwaGFUZXN0ID0gcmVhZGVyLmZsb2F0KCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMjQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuY2FzdFNoYWRvd3MgPSByZWFkZXIuYm9vbCgpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDM0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmRpZmZ1c2VDb2xvciA9IENvbG9yNC5kZWNvZGUocmVhZGVyLCByZWFkZXIudWludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgodGFnICYgNykgPT09IDQgfHwgdGFnID09PSAwKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIFBCTWF0ZXJpYWxfVW5saXRNYXRlcmlhbC5kZWNvZGUgPSBkZWNvZGU7XG59KShQQk1hdGVyaWFsX1VubGl0TWF0ZXJpYWwgfHwgKFBCTWF0ZXJpYWxfVW5saXRNYXRlcmlhbCA9IHt9KSk7XG5mdW5jdGlvbiBjcmVhdGVCYXNlUEJNYXRlcmlhbF9QYnJNYXRlcmlhbCgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB0ZXh0dXJlOiB1bmRlZmluZWQsXG4gICAgICAgIGFscGhhVGVzdDogdW5kZWZpbmVkLFxuICAgICAgICBjYXN0U2hhZG93czogdW5kZWZpbmVkLFxuICAgICAgICBhbHBoYVRleHR1cmU6IHVuZGVmaW5lZCxcbiAgICAgICAgZW1pc3NpdmVUZXh0dXJlOiB1bmRlZmluZWQsXG4gICAgICAgIGJ1bXBUZXh0dXJlOiB1bmRlZmluZWQsXG4gICAgICAgIGFsYmVkb0NvbG9yOiB1bmRlZmluZWQsXG4gICAgICAgIGVtaXNzaXZlQ29sb3I6IHVuZGVmaW5lZCxcbiAgICAgICAgcmVmbGVjdGl2aXR5Q29sb3I6IHVuZGVmaW5lZCxcbiAgICAgICAgdHJhbnNwYXJlbmN5TW9kZTogdW5kZWZpbmVkLFxuICAgICAgICBtZXRhbGxpYzogdW5kZWZpbmVkLFxuICAgICAgICByb3VnaG5lc3M6IHVuZGVmaW5lZCxcbiAgICAgICAgc3BlY3VsYXJJbnRlbnNpdHk6IHVuZGVmaW5lZCxcbiAgICAgICAgZW1pc3NpdmVJbnRlbnNpdHk6IHVuZGVmaW5lZCxcbiAgICAgICAgZGlyZWN0SW50ZW5zaXR5OiB1bmRlZmluZWQsXG4gICAgfTtcbn1cbi8qKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdmFyIFBCTWF0ZXJpYWxfUGJyTWF0ZXJpYWw7XG4oZnVuY3Rpb24gKFBCTWF0ZXJpYWxfUGJyTWF0ZXJpYWwpIHtcbiAgICBmdW5jdGlvbiBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gX20wLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS50ZXh0dXJlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIFRleHR1cmVVbmlvbi5lbmNvZGUobWVzc2FnZS50ZXh0dXJlLCB3cml0ZXIudWludDMyKDEwKS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmFscGhhVGVzdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDIxKS5mbG9hdChtZXNzYWdlLmFscGhhVGVzdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuY2FzdFNoYWRvd3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyNCkuYm9vbChtZXNzYWdlLmNhc3RTaGFkb3dzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5hbHBoYVRleHR1cmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgVGV4dHVyZVVuaW9uLmVuY29kZShtZXNzYWdlLmFscGhhVGV4dHVyZSwgd3JpdGVyLnVpbnQzMigzNCkuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5lbWlzc2l2ZVRleHR1cmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgVGV4dHVyZVVuaW9uLmVuY29kZShtZXNzYWdlLmVtaXNzaXZlVGV4dHVyZSwgd3JpdGVyLnVpbnQzMig0MikuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5idW1wVGV4dHVyZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBUZXh0dXJlVW5pb24uZW5jb2RlKG1lc3NhZ2UuYnVtcFRleHR1cmUsIHdyaXRlci51aW50MzIoNTApLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuYWxiZWRvQ29sb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgQ29sb3I0LmVuY29kZShtZXNzYWdlLmFsYmVkb0NvbG9yLCB3cml0ZXIudWludDMyKDU4KS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmVtaXNzaXZlQ29sb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgQ29sb3IzLmVuY29kZShtZXNzYWdlLmVtaXNzaXZlQ29sb3IsIHdyaXRlci51aW50MzIoNjYpLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UucmVmbGVjdGl2aXR5Q29sb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgQ29sb3IzLmVuY29kZShtZXNzYWdlLnJlZmxlY3Rpdml0eUNvbG9yLCB3cml0ZXIudWludDMyKDc0KS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnRyYW5zcGFyZW5jeU1vZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4MCkuaW50MzIobWVzc2FnZS50cmFuc3BhcmVuY3lNb2RlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5tZXRhbGxpYyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDkzKS5mbG9hdChtZXNzYWdlLm1ldGFsbGljKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5yb3VnaG5lc3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxMDEpLmZsb2F0KG1lc3NhZ2Uucm91Z2huZXNzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5zcGVjdWxhckludGVuc2l0eSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDExNykuZmxvYXQobWVzc2FnZS5zcGVjdWxhckludGVuc2l0eSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuZW1pc3NpdmVJbnRlbnNpdHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxMjUpLmZsb2F0KG1lc3NhZ2UuZW1pc3NpdmVJbnRlbnNpdHkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmRpcmVjdEludGVuc2l0eSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDEzMykuZmxvYXQobWVzc2FnZS5kaXJlY3RJbnRlbnNpdHkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxuICAgIFBCTWF0ZXJpYWxfUGJyTWF0ZXJpYWwuZW5jb2RlID0gZW5jb2RlO1xuICAgIGZ1bmN0aW9uIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgX20wLlJlYWRlciA/IGlucHV0IDogX20wLlJlYWRlci5jcmVhdGUoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VQQk1hdGVyaWFsX1Bick1hdGVyaWFsKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMTApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudGV4dHVyZSA9IFRleHR1cmVVbmlvbi5kZWNvZGUocmVhZGVyLCByZWFkZXIudWludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDIxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmFscGhhVGVzdCA9IHJlYWRlci5mbG9hdCgpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDI0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmNhc3RTaGFkb3dzID0gcmVhZGVyLmJvb2woKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSAzNCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5hbHBoYVRleHR1cmUgPSBUZXh0dXJlVW5pb24uZGVjb2RlKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSA0Mikge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5lbWlzc2l2ZVRleHR1cmUgPSBUZXh0dXJlVW5pb24uZGVjb2RlKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSA1MCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5idW1wVGV4dHVyZSA9IFRleHR1cmVVbmlvbi5kZWNvZGUocmVhZGVyLCByZWFkZXIudWludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDU4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmFsYmVkb0NvbG9yID0gQ29sb3I0LmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gNjYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZW1pc3NpdmVDb2xvciA9IENvbG9yMy5kZWNvZGUocmVhZGVyLCByZWFkZXIudWludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDc0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnJlZmxlY3Rpdml0eUNvbG9yID0gQ29sb3IzLmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDgwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnRyYW5zcGFyZW5jeU1vZGUgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gOTMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubWV0YWxsaWMgPSByZWFkZXIuZmxvYXQoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMTAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnJvdWdobmVzcyA9IHJlYWRlci5mbG9hdCgpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDE0OlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSAxMTcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc3BlY3VsYXJJbnRlbnNpdHkgPSByZWFkZXIuZmxvYXQoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSAxNTpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMTI1KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmVtaXNzaXZlSW50ZW5zaXR5ID0gcmVhZGVyLmZsb2F0KCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgMTY6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDEzMykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5kaXJlY3RJbnRlbnNpdHkgPSByZWFkZXIuZmxvYXQoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKHRhZyAmIDcpID09PSA0IHx8IHRhZyA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBQQk1hdGVyaWFsX1Bick1hdGVyaWFsLmRlY29kZSA9IGRlY29kZTtcbn0pKFBCTWF0ZXJpYWxfUGJyTWF0ZXJpYWwgfHwgKFBCTWF0ZXJpYWxfUGJyTWF0ZXJpYWwgPSB7fSkpO1xuIiwgIi8qIGVzbGludC1kaXNhYmxlICovXG5pbXBvcnQgX20wIGZyb20gXCJwcm90b2J1ZmpzL21pbmltYWxcIjtcbmNvbnN0IHByb3RvYnVmUGFja2FnZVNhcmFzYSA9IFwiZGVjZW50cmFsYW5kLmNvbW1vblwiO1xuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB2YXIgVGV4dHVyZVdyYXBNb2RlO1xuKGZ1bmN0aW9uIChUZXh0dXJlV3JhcE1vZGUpIHtcbiAgICBUZXh0dXJlV3JhcE1vZGVbVGV4dHVyZVdyYXBNb2RlW1wiVFdNX1JFUEVBVFwiXSA9IDBdID0gXCJUV01fUkVQRUFUXCI7XG4gICAgVGV4dHVyZVdyYXBNb2RlW1RleHR1cmVXcmFwTW9kZVtcIlRXTV9DTEFNUFwiXSA9IDFdID0gXCJUV01fQ0xBTVBcIjtcbiAgICBUZXh0dXJlV3JhcE1vZGVbVGV4dHVyZVdyYXBNb2RlW1wiVFdNX01JUlJPUlwiXSA9IDJdID0gXCJUV01fTUlSUk9SXCI7XG59KShUZXh0dXJlV3JhcE1vZGUgfHwgKFRleHR1cmVXcmFwTW9kZSA9IHt9KSk7XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHZhciBUZXh0dXJlRmlsdGVyTW9kZTtcbihmdW5jdGlvbiAoVGV4dHVyZUZpbHRlck1vZGUpIHtcbiAgICBUZXh0dXJlRmlsdGVyTW9kZVtUZXh0dXJlRmlsdGVyTW9kZVtcIlRGTV9QT0lOVFwiXSA9IDBdID0gXCJURk1fUE9JTlRcIjtcbiAgICBUZXh0dXJlRmlsdGVyTW9kZVtUZXh0dXJlRmlsdGVyTW9kZVtcIlRGTV9CSUxJTkVBUlwiXSA9IDFdID0gXCJURk1fQklMSU5FQVJcIjtcbiAgICBUZXh0dXJlRmlsdGVyTW9kZVtUZXh0dXJlRmlsdGVyTW9kZVtcIlRGTV9UUklMSU5FQVJcIl0gPSAyXSA9IFwiVEZNX1RSSUxJTkVBUlwiO1xufSkoVGV4dHVyZUZpbHRlck1vZGUgfHwgKFRleHR1cmVGaWx0ZXJNb2RlID0ge30pKTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VUZXh0dXJlKCkge1xuICAgIHJldHVybiB7IHNyYzogXCJcIiwgd3JhcE1vZGU6IHVuZGVmaW5lZCwgZmlsdGVyTW9kZTogdW5kZWZpbmVkIH07XG59XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHZhciBUZXh0dXJlO1xuKGZ1bmN0aW9uIChUZXh0dXJlKSB7XG4gICAgZnVuY3Rpb24gZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IF9tMC5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2Uuc3JjICE9PSBcIlwiKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDEwKS5zdHJpbmcobWVzc2FnZS5zcmMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLndyYXBNb2RlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTYpLmludDMyKG1lc3NhZ2Uud3JhcE1vZGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmZpbHRlck1vZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyNCkuaW50MzIobWVzc2FnZS5maWx0ZXJNb2RlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbiAgICBUZXh0dXJlLmVuY29kZSA9IGVuY29kZTtcbiAgICBmdW5jdGlvbiBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIF9tMC5SZWFkZXIgPyBpbnB1dCA6IF9tMC5SZWFkZXIuY3JlYXRlKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlVGV4dHVyZSgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDEwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnNyYyA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSAxNikge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS53cmFwTW9kZSA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDI0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmZpbHRlck1vZGUgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKHRhZyAmIDcpID09PSA0IHx8IHRhZyA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBUZXh0dXJlLmRlY29kZSA9IGRlY29kZTtcbn0pKFRleHR1cmUgfHwgKFRleHR1cmUgPSB7fSkpO1xuZnVuY3Rpb24gY3JlYXRlQmFzZUF2YXRhclRleHR1cmUoKSB7XG4gICAgcmV0dXJuIHsgdXNlcklkOiBcIlwiLCB3cmFwTW9kZTogdW5kZWZpbmVkLCBmaWx0ZXJNb2RlOiB1bmRlZmluZWQgfTtcbn1cbi8qKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdmFyIEF2YXRhclRleHR1cmU7XG4oZnVuY3Rpb24gKEF2YXRhclRleHR1cmUpIHtcbiAgICBmdW5jdGlvbiBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gX20wLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS51c2VySWQgIT09IFwiXCIpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTApLnN0cmluZyhtZXNzYWdlLnVzZXJJZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2Uud3JhcE1vZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxNikuaW50MzIobWVzc2FnZS53cmFwTW9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuZmlsdGVyTW9kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDI0KS5pbnQzMihtZXNzYWdlLmZpbHRlck1vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxuICAgIEF2YXRhclRleHR1cmUuZW5jb2RlID0gZW5jb2RlO1xuICAgIGZ1bmN0aW9uIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgX20wLlJlYWRlciA/IGlucHV0IDogX20wLlJlYWRlci5jcmVhdGUoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VBdmF0YXJUZXh0dXJlKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMTApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudXNlcklkID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDE2KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLndyYXBNb2RlID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMjQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZmlsdGVyTW9kZSA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgodGFnICYgNykgPT09IDQgfHwgdGFnID09PSAwKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIEF2YXRhclRleHR1cmUuZGVjb2RlID0gZGVjb2RlO1xufSkoQXZhdGFyVGV4dHVyZSB8fCAoQXZhdGFyVGV4dHVyZSA9IHt9KSk7XG5mdW5jdGlvbiBjcmVhdGVCYXNlVmlkZW9UZXh0dXJlKCkge1xuICAgIHJldHVybiB7IHZpZGVvUGxheWVyRW50aXR5OiAwLCB3cmFwTW9kZTogdW5kZWZpbmVkLCBmaWx0ZXJNb2RlOiB1bmRlZmluZWQgfTtcbn1cbi8qKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdmFyIFZpZGVvVGV4dHVyZTtcbihmdW5jdGlvbiAoVmlkZW9UZXh0dXJlKSB7XG4gICAgZnVuY3Rpb24gZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IF9tMC5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UudmlkZW9QbGF5ZXJFbnRpdHkgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkudWludDMyKG1lc3NhZ2UudmlkZW9QbGF5ZXJFbnRpdHkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLndyYXBNb2RlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTYpLmludDMyKG1lc3NhZ2Uud3JhcE1vZGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmZpbHRlck1vZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyNCkuaW50MzIobWVzc2FnZS5maWx0ZXJNb2RlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbiAgICBWaWRlb1RleHR1cmUuZW5jb2RlID0gZW5jb2RlO1xuICAgIGZ1bmN0aW9uIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgX20wLlJlYWRlciA/IGlucHV0IDogX20wLlJlYWRlci5jcmVhdGUoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VWaWRlb1RleHR1cmUoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSA4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnZpZGVvUGxheWVyRW50aXR5ID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDE2KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLndyYXBNb2RlID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMjQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZmlsdGVyTW9kZSA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgodGFnICYgNykgPT09IDQgfHwgdGFnID09PSAwKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIFZpZGVvVGV4dHVyZS5kZWNvZGUgPSBkZWNvZGU7XG59KShWaWRlb1RleHR1cmUgfHwgKFZpZGVvVGV4dHVyZSA9IHt9KSk7XG5mdW5jdGlvbiBjcmVhdGVCYXNlVGV4dHVyZVVuaW9uKCkge1xuICAgIHJldHVybiB7IHRleDogdW5kZWZpbmVkIH07XG59XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHZhciBUZXh0dXJlVW5pb247XG4oZnVuY3Rpb24gKFRleHR1cmVVbmlvbikge1xuICAgIGZ1bmN0aW9uIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBfbTAuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIHN3aXRjaCAobWVzc2FnZS50ZXg/LiRjYXNlKSB7XG4gICAgICAgICAgICBjYXNlIFwidGV4dHVyZVwiOlxuICAgICAgICAgICAgICAgIFRleHR1cmUuZW5jb2RlKG1lc3NhZ2UudGV4LnRleHR1cmUsIHdyaXRlci51aW50MzIoMTApLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiYXZhdGFyVGV4dHVyZVwiOlxuICAgICAgICAgICAgICAgIEF2YXRhclRleHR1cmUuZW5jb2RlKG1lc3NhZ2UudGV4LmF2YXRhclRleHR1cmUsIHdyaXRlci51aW50MzIoMTgpLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwidmlkZW9UZXh0dXJlXCI6XG4gICAgICAgICAgICAgICAgVmlkZW9UZXh0dXJlLmVuY29kZShtZXNzYWdlLnRleC52aWRlb1RleHR1cmUsIHdyaXRlci51aW50MzIoMjYpLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9XG4gICAgVGV4dHVyZVVuaW9uLmVuY29kZSA9IGVuY29kZTtcbiAgICBmdW5jdGlvbiBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIF9tMC5SZWFkZXIgPyBpbnB1dCA6IF9tMC5SZWFkZXIuY3JlYXRlKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlVGV4dHVyZVVuaW9uKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMTApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudGV4ID0geyAkY2FzZTogXCJ0ZXh0dXJlXCIsIHRleHR1cmU6IFRleHR1cmUuZGVjb2RlKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpKSB9O1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDE4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnRleCA9IHsgJGNhc2U6IFwiYXZhdGFyVGV4dHVyZVwiLCBhdmF0YXJUZXh0dXJlOiBBdmF0YXJUZXh0dXJlLmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSkgfTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSAyNikge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50ZXggPSB7ICRjYXNlOiBcInZpZGVvVGV4dHVyZVwiLCB2aWRlb1RleHR1cmU6IFZpZGVvVGV4dHVyZS5kZWNvZGUocmVhZGVyLCByZWFkZXIudWludDMyKCkpIH07XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCh0YWcgJiA3KSA9PT0gNCB8fCB0YWcgPT09IDApIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgVGV4dHVyZVVuaW9uLmRlY29kZSA9IGRlY29kZTtcbn0pKFRleHR1cmVVbmlvbiB8fCAoVGV4dHVyZVVuaW9uID0ge30pKTtcbiIsICJpbXBvcnQgeyBQQk1hdGVyaWFsIH0gZnJvbSAnLi9wYi9kZWNlbnRyYWxhbmQvc2RrL2NvbXBvbmVudHMvbWF0ZXJpYWwuZ2VuJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBNYXRlcmlhbFNjaGVtYSA9IHtcbiAgICBDT01QT05FTlRfSUQ6IDEwMTcsXG4gICAgc2VyaWFsaXplKHZhbHVlLCBidWlsZGVyKSB7XG4gICAgICAgIGNvbnN0IHdyaXRlciA9IFBCTWF0ZXJpYWwuZW5jb2RlKHZhbHVlKTtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkod3JpdGVyLmZpbmlzaCgpLCAwLCB3cml0ZXIubGVuKTtcbiAgICAgICAgYnVpbGRlci53cml0ZUJ1ZmZlcihidWZmZXIsIGZhbHNlKTtcbiAgICB9LFxuICAgIGRlc2VyaWFsaXplKHJlYWRlcikge1xuICAgICAgICByZXR1cm4gUEJNYXRlcmlhbC5kZWNvZGUocmVhZGVyLmJ1ZmZlcigpLCByZWFkZXIucmVtYWluaW5nQnl0ZXMoKSk7XG4gICAgfSxcbiAgICBjcmVhdGUoKSB7XG4gICAgICAgIC8vIFRPRE86IHRoaXMgaXMgYSBoYWNrLlxuICAgICAgICByZXR1cm4gUEJNYXRlcmlhbC5kZWNvZGUobmV3IFVpbnQ4QXJyYXkoKSk7XG4gICAgfSxcbiAgICBqc29uU2NoZW1hOiB7XG4gICAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgIHByb3BlcnRpZXM6IHt9LFxuICAgICAgICBzZXJpYWxpemF0aW9uVHlwZTogXCJwcm90b2NvbC1idWZmZXJcIixcbiAgICAgICAgcHJvdG9jb2xCdWZmZXI6IFwiUEJNYXRlcmlhbFwiXG4gICAgfVxufTtcbiIsICIvKiBlc2xpbnQtZGlzYWJsZSAqL1xuaW1wb3J0IF9tMCBmcm9tIFwicHJvdG9idWZqcy9taW5pbWFsXCI7XG5jb25zdCBwcm90b2J1ZlBhY2thZ2VTYXJhc2EgPSBcImRlY2VudHJhbGFuZC5zZGsuY29tcG9uZW50c1wiO1xuLyoqIENvbGxpZGVyTGF5ZXIgZGV0ZXJtaW5lcyB0aGUga2luZCBvZiBjb2xsaXNpb24gdG8gZGV0ZWN0LCBpbiBPUi1hYmxlIGJpdCBmbGFnIGZvcm0uICovXG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHZhciBDb2xsaWRlckxheWVyO1xuKGZ1bmN0aW9uIChDb2xsaWRlckxheWVyKSB7XG4gICAgLyoqIENMX05PTkUgLSBubyBjb2xsaXNpb25zICovXG4gICAgQ29sbGlkZXJMYXllcltDb2xsaWRlckxheWVyW1wiQ0xfTk9ORVwiXSA9IDBdID0gXCJDTF9OT05FXCI7XG4gICAgLyoqIENMX1BPSU5URVIgLSBjb2xsaXNpb25zIHdpdGggdGhlIHBsYXllcidzIHBvaW50ZXIgcmF5IChlLmcuIG1vdXNlIGN1cnNvciBob3ZlcmluZykgKi9cbiAgICBDb2xsaWRlckxheWVyW0NvbGxpZGVyTGF5ZXJbXCJDTF9QT0lOVEVSXCJdID0gMV0gPSBcIkNMX1BPSU5URVJcIjtcbiAgICAvKiogQ0xfUEhZU0lDUyAtIGNvbGxpc2lvbiBhZmZlY3RpbmcgeW91ciBwbGF5ZXIncyBwaHlzaWNzIGkuZS4gd2FsbHMsIGZsb29yLCBtb3ZpbmcgcGxhdGZyb21zICovXG4gICAgQ29sbGlkZXJMYXllcltDb2xsaWRlckxheWVyW1wiQ0xfUEhZU0lDU1wiXSA9IDJdID0gXCJDTF9QSFlTSUNTXCI7XG4gICAgQ29sbGlkZXJMYXllcltDb2xsaWRlckxheWVyW1wiQ0xfUkVTRVJWRUQxXCJdID0gNF0gPSBcIkNMX1JFU0VSVkVEMVwiO1xuICAgIENvbGxpZGVyTGF5ZXJbQ29sbGlkZXJMYXllcltcIkNMX1JFU0VSVkVEMlwiXSA9IDhdID0gXCJDTF9SRVNFUlZFRDJcIjtcbiAgICBDb2xsaWRlckxheWVyW0NvbGxpZGVyTGF5ZXJbXCJDTF9SRVNFUlZFRDNcIl0gPSAxNl0gPSBcIkNMX1JFU0VSVkVEM1wiO1xuICAgIENvbGxpZGVyTGF5ZXJbQ29sbGlkZXJMYXllcltcIkNMX1JFU0VSVkVENFwiXSA9IDMyXSA9IFwiQ0xfUkVTRVJWRUQ0XCI7XG4gICAgQ29sbGlkZXJMYXllcltDb2xsaWRlckxheWVyW1wiQ0xfUkVTRVJWRUQ1XCJdID0gNjRdID0gXCJDTF9SRVNFUlZFRDVcIjtcbiAgICBDb2xsaWRlckxheWVyW0NvbGxpZGVyTGF5ZXJbXCJDTF9SRVNFUlZFRDZcIl0gPSAxMjhdID0gXCJDTF9SRVNFUlZFRDZcIjtcbiAgICBDb2xsaWRlckxheWVyW0NvbGxpZGVyTGF5ZXJbXCJDTF9DVVNUT00xXCJdID0gMjU2XSA9IFwiQ0xfQ1VTVE9NMVwiO1xuICAgIENvbGxpZGVyTGF5ZXJbQ29sbGlkZXJMYXllcltcIkNMX0NVU1RPTTJcIl0gPSA1MTJdID0gXCJDTF9DVVNUT00yXCI7XG4gICAgQ29sbGlkZXJMYXllcltDb2xsaWRlckxheWVyW1wiQ0xfQ1VTVE9NM1wiXSA9IDEwMjRdID0gXCJDTF9DVVNUT00zXCI7XG4gICAgQ29sbGlkZXJMYXllcltDb2xsaWRlckxheWVyW1wiQ0xfQ1VTVE9NNFwiXSA9IDIwNDhdID0gXCJDTF9DVVNUT000XCI7XG4gICAgQ29sbGlkZXJMYXllcltDb2xsaWRlckxheWVyW1wiQ0xfQ1VTVE9NNVwiXSA9IDQwOTZdID0gXCJDTF9DVVNUT001XCI7XG4gICAgQ29sbGlkZXJMYXllcltDb2xsaWRlckxheWVyW1wiQ0xfQ1VTVE9NNlwiXSA9IDgxOTJdID0gXCJDTF9DVVNUT002XCI7XG4gICAgQ29sbGlkZXJMYXllcltDb2xsaWRlckxheWVyW1wiQ0xfQ1VTVE9NN1wiXSA9IDE2Mzg0XSA9IFwiQ0xfQ1VTVE9NN1wiO1xuICAgIENvbGxpZGVyTGF5ZXJbQ29sbGlkZXJMYXllcltcIkNMX0NVU1RPTThcIl0gPSAzMjc2OF0gPSBcIkNMX0NVU1RPTThcIjtcbn0pKENvbGxpZGVyTGF5ZXIgfHwgKENvbGxpZGVyTGF5ZXIgPSB7fSkpO1xuZnVuY3Rpb24gY3JlYXRlQmFzZVBCTWVzaENvbGxpZGVyKCkge1xuICAgIHJldHVybiB7IGNvbGxpc2lvbk1hc2s6IHVuZGVmaW5lZCwgbWVzaDogdW5kZWZpbmVkIH07XG59XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHZhciBQQk1lc2hDb2xsaWRlcjtcbihmdW5jdGlvbiAoUEJNZXNoQ29sbGlkZXIpIHtcbiAgICBmdW5jdGlvbiBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gX20wLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5jb2xsaXNpb25NYXNrICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkudWludDMyKG1lc3NhZ2UuY29sbGlzaW9uTWFzayk7XG4gICAgICAgIH1cbiAgICAgICAgc3dpdGNoIChtZXNzYWdlLm1lc2g/LiRjYXNlKSB7XG4gICAgICAgICAgICBjYXNlIFwiYm94XCI6XG4gICAgICAgICAgICAgICAgUEJNZXNoQ29sbGlkZXJfQm94TWVzaC5lbmNvZGUobWVzc2FnZS5tZXNoLmJveCwgd3JpdGVyLnVpbnQzMigxOCkuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJzcGhlcmVcIjpcbiAgICAgICAgICAgICAgICBQQk1lc2hDb2xsaWRlcl9TcGhlcmVNZXNoLmVuY29kZShtZXNzYWdlLm1lc2guc3BoZXJlLCB3cml0ZXIudWludDMyKDI2KS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcImN5bGluZGVyXCI6XG4gICAgICAgICAgICAgICAgUEJNZXNoQ29sbGlkZXJfQ3lsaW5kZXJNZXNoLmVuY29kZShtZXNzYWdlLm1lc2guY3lsaW5kZXIsIHdyaXRlci51aW50MzIoMzQpLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwicGxhbmVcIjpcbiAgICAgICAgICAgICAgICBQQk1lc2hDb2xsaWRlcl9QbGFuZU1lc2guZW5jb2RlKG1lc3NhZ2UubWVzaC5wbGFuZSwgd3JpdGVyLnVpbnQzMig0MikuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbiAgICBQQk1lc2hDb2xsaWRlci5lbmNvZGUgPSBlbmNvZGU7XG4gICAgZnVuY3Rpb24gZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBfbTAuUmVhZGVyID8gaW5wdXQgOiBfbTAuUmVhZGVyLmNyZWF0ZShpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZVBCTWVzaENvbGxpZGVyKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gOCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5jb2xsaXNpb25NYXNrID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDE4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm1lc2ggPSB7ICRjYXNlOiBcImJveFwiLCBib3g6IFBCTWVzaENvbGxpZGVyX0JveE1lc2guZGVjb2RlKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpKSB9O1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDI2KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm1lc2ggPSB7ICRjYXNlOiBcInNwaGVyZVwiLCBzcGhlcmU6IFBCTWVzaENvbGxpZGVyX1NwaGVyZU1lc2guZGVjb2RlKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpKSB9O1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDM0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm1lc2ggPSB7ICRjYXNlOiBcImN5bGluZGVyXCIsIGN5bGluZGVyOiBQQk1lc2hDb2xsaWRlcl9DeWxpbmRlck1lc2guZGVjb2RlKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpKSB9O1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDQyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm1lc2ggPSB7ICRjYXNlOiBcInBsYW5lXCIsIHBsYW5lOiBQQk1lc2hDb2xsaWRlcl9QbGFuZU1lc2guZGVjb2RlKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpKSB9O1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgodGFnICYgNykgPT09IDQgfHwgdGFnID09PSAwKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIFBCTWVzaENvbGxpZGVyLmRlY29kZSA9IGRlY29kZTtcbn0pKFBCTWVzaENvbGxpZGVyIHx8IChQQk1lc2hDb2xsaWRlciA9IHt9KSk7XG5mdW5jdGlvbiBjcmVhdGVCYXNlUEJNZXNoQ29sbGlkZXJfQm94TWVzaCgpIHtcbiAgICByZXR1cm4ge307XG59XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHZhciBQQk1lc2hDb2xsaWRlcl9Cb3hNZXNoO1xuKGZ1bmN0aW9uIChQQk1lc2hDb2xsaWRlcl9Cb3hNZXNoKSB7XG4gICAgZnVuY3Rpb24gZW5jb2RlKF8sIHdyaXRlciA9IF9tMC5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9XG4gICAgUEJNZXNoQ29sbGlkZXJfQm94TWVzaC5lbmNvZGUgPSBlbmNvZGU7XG4gICAgZnVuY3Rpb24gZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBfbTAuUmVhZGVyID8gaW5wdXQgOiBfbTAuUmVhZGVyLmNyZWF0ZShpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZVBCTWVzaENvbGxpZGVyX0JveE1lc2goKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKHRhZyAmIDcpID09PSA0IHx8IHRhZyA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBQQk1lc2hDb2xsaWRlcl9Cb3hNZXNoLmRlY29kZSA9IGRlY29kZTtcbn0pKFBCTWVzaENvbGxpZGVyX0JveE1lc2ggfHwgKFBCTWVzaENvbGxpZGVyX0JveE1lc2ggPSB7fSkpO1xuZnVuY3Rpb24gY3JlYXRlQmFzZVBCTWVzaENvbGxpZGVyX0N5bGluZGVyTWVzaCgpIHtcbiAgICByZXR1cm4geyByYWRpdXNUb3A6IHVuZGVmaW5lZCwgcmFkaXVzQm90dG9tOiB1bmRlZmluZWQgfTtcbn1cbi8qKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdmFyIFBCTWVzaENvbGxpZGVyX0N5bGluZGVyTWVzaDtcbihmdW5jdGlvbiAoUEJNZXNoQ29sbGlkZXJfQ3lsaW5kZXJNZXNoKSB7XG4gICAgZnVuY3Rpb24gZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IF9tMC5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UucmFkaXVzVG9wICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTMpLmZsb2F0KG1lc3NhZ2UucmFkaXVzVG9wKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5yYWRpdXNCb3R0b20gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyMSkuZmxvYXQobWVzc2FnZS5yYWRpdXNCb3R0b20pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxuICAgIFBCTWVzaENvbGxpZGVyX0N5bGluZGVyTWVzaC5lbmNvZGUgPSBlbmNvZGU7XG4gICAgZnVuY3Rpb24gZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBfbTAuUmVhZGVyID8gaW5wdXQgOiBfbTAuUmVhZGVyLmNyZWF0ZShpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZVBCTWVzaENvbGxpZGVyX0N5bGluZGVyTWVzaCgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDEzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnJhZGl1c1RvcCA9IHJlYWRlci5mbG9hdCgpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDIxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnJhZGl1c0JvdHRvbSA9IHJlYWRlci5mbG9hdCgpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgodGFnICYgNykgPT09IDQgfHwgdGFnID09PSAwKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIFBCTWVzaENvbGxpZGVyX0N5bGluZGVyTWVzaC5kZWNvZGUgPSBkZWNvZGU7XG59KShQQk1lc2hDb2xsaWRlcl9DeWxpbmRlck1lc2ggfHwgKFBCTWVzaENvbGxpZGVyX0N5bGluZGVyTWVzaCA9IHt9KSk7XG5mdW5jdGlvbiBjcmVhdGVCYXNlUEJNZXNoQ29sbGlkZXJfUGxhbmVNZXNoKCkge1xuICAgIHJldHVybiB7fTtcbn1cbi8qKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdmFyIFBCTWVzaENvbGxpZGVyX1BsYW5lTWVzaDtcbihmdW5jdGlvbiAoUEJNZXNoQ29sbGlkZXJfUGxhbmVNZXNoKSB7XG4gICAgZnVuY3Rpb24gZW5jb2RlKF8sIHdyaXRlciA9IF9tMC5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9XG4gICAgUEJNZXNoQ29sbGlkZXJfUGxhbmVNZXNoLmVuY29kZSA9IGVuY29kZTtcbiAgICBmdW5jdGlvbiBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIF9tMC5SZWFkZXIgPyBpbnB1dCA6IF9tMC5SZWFkZXIuY3JlYXRlKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlUEJNZXNoQ29sbGlkZXJfUGxhbmVNZXNoKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCh0YWcgJiA3KSA9PT0gNCB8fCB0YWcgPT09IDApIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgUEJNZXNoQ29sbGlkZXJfUGxhbmVNZXNoLmRlY29kZSA9IGRlY29kZTtcbn0pKFBCTWVzaENvbGxpZGVyX1BsYW5lTWVzaCB8fCAoUEJNZXNoQ29sbGlkZXJfUGxhbmVNZXNoID0ge30pKTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VQQk1lc2hDb2xsaWRlcl9TcGhlcmVNZXNoKCkge1xuICAgIHJldHVybiB7fTtcbn1cbi8qKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdmFyIFBCTWVzaENvbGxpZGVyX1NwaGVyZU1lc2g7XG4oZnVuY3Rpb24gKFBCTWVzaENvbGxpZGVyX1NwaGVyZU1lc2gpIHtcbiAgICBmdW5jdGlvbiBlbmNvZGUoXywgd3JpdGVyID0gX20wLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbiAgICBQQk1lc2hDb2xsaWRlcl9TcGhlcmVNZXNoLmVuY29kZSA9IGVuY29kZTtcbiAgICBmdW5jdGlvbiBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIF9tMC5SZWFkZXIgPyBpbnB1dCA6IF9tMC5SZWFkZXIuY3JlYXRlKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlUEJNZXNoQ29sbGlkZXJfU3BoZXJlTWVzaCgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgodGFnICYgNykgPT09IDQgfHwgdGFnID09PSAwKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIFBCTWVzaENvbGxpZGVyX1NwaGVyZU1lc2guZGVjb2RlID0gZGVjb2RlO1xufSkoUEJNZXNoQ29sbGlkZXJfU3BoZXJlTWVzaCB8fCAoUEJNZXNoQ29sbGlkZXJfU3BoZXJlTWVzaCA9IHt9KSk7XG4iLCAiaW1wb3J0IHsgUEJNZXNoQ29sbGlkZXIgfSBmcm9tICcuL3BiL2RlY2VudHJhbGFuZC9zZGsvY29tcG9uZW50cy9tZXNoX2NvbGxpZGVyLmdlbic7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgTWVzaENvbGxpZGVyU2NoZW1hID0ge1xuICAgIENPTVBPTkVOVF9JRDogMTAxOSxcbiAgICBzZXJpYWxpemUodmFsdWUsIGJ1aWxkZXIpIHtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gUEJNZXNoQ29sbGlkZXIuZW5jb2RlKHZhbHVlKTtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkod3JpdGVyLmZpbmlzaCgpLCAwLCB3cml0ZXIubGVuKTtcbiAgICAgICAgYnVpbGRlci53cml0ZUJ1ZmZlcihidWZmZXIsIGZhbHNlKTtcbiAgICB9LFxuICAgIGRlc2VyaWFsaXplKHJlYWRlcikge1xuICAgICAgICByZXR1cm4gUEJNZXNoQ29sbGlkZXIuZGVjb2RlKHJlYWRlci5idWZmZXIoKSwgcmVhZGVyLnJlbWFpbmluZ0J5dGVzKCkpO1xuICAgIH0sXG4gICAgY3JlYXRlKCkge1xuICAgICAgICAvLyBUT0RPOiB0aGlzIGlzIGEgaGFjay5cbiAgICAgICAgcmV0dXJuIFBCTWVzaENvbGxpZGVyLmRlY29kZShuZXcgVWludDhBcnJheSgpKTtcbiAgICB9LFxuICAgIGpzb25TY2hlbWE6IHtcbiAgICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgICAgcHJvcGVydGllczoge30sXG4gICAgICAgIHNlcmlhbGl6YXRpb25UeXBlOiBcInByb3RvY29sLWJ1ZmZlclwiLFxuICAgICAgICBwcm90b2NvbEJ1ZmZlcjogXCJQQk1lc2hDb2xsaWRlclwiXG4gICAgfVxufTtcbiIsICIvKiBlc2xpbnQtZGlzYWJsZSAqL1xuaW1wb3J0IF9tMCBmcm9tIFwicHJvdG9idWZqcy9taW5pbWFsXCI7XG5jb25zdCBwcm90b2J1ZlBhY2thZ2VTYXJhc2EgPSBcImRlY2VudHJhbGFuZC5zZGsuY29tcG9uZW50c1wiO1xuZnVuY3Rpb24gY3JlYXRlQmFzZVBCTWVzaFJlbmRlcmVyKCkge1xuICAgIHJldHVybiB7IG1lc2g6IHVuZGVmaW5lZCB9O1xufVxuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB2YXIgUEJNZXNoUmVuZGVyZXI7XG4oZnVuY3Rpb24gKFBCTWVzaFJlbmRlcmVyKSB7XG4gICAgZnVuY3Rpb24gZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IF9tMC5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgc3dpdGNoIChtZXNzYWdlLm1lc2g/LiRjYXNlKSB7XG4gICAgICAgICAgICBjYXNlIFwiYm94XCI6XG4gICAgICAgICAgICAgICAgUEJNZXNoUmVuZGVyZXJfQm94TWVzaC5lbmNvZGUobWVzc2FnZS5tZXNoLmJveCwgd3JpdGVyLnVpbnQzMigxMCkuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJzcGhlcmVcIjpcbiAgICAgICAgICAgICAgICBQQk1lc2hSZW5kZXJlcl9TcGhlcmVNZXNoLmVuY29kZShtZXNzYWdlLm1lc2guc3BoZXJlLCB3cml0ZXIudWludDMyKDE4KS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcImN5bGluZGVyXCI6XG4gICAgICAgICAgICAgICAgUEJNZXNoUmVuZGVyZXJfQ3lsaW5kZXJNZXNoLmVuY29kZShtZXNzYWdlLm1lc2guY3lsaW5kZXIsIHdyaXRlci51aW50MzIoMjYpLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwicGxhbmVcIjpcbiAgICAgICAgICAgICAgICBQQk1lc2hSZW5kZXJlcl9QbGFuZU1lc2guZW5jb2RlKG1lc3NhZ2UubWVzaC5wbGFuZSwgd3JpdGVyLnVpbnQzMigzNCkuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbiAgICBQQk1lc2hSZW5kZXJlci5lbmNvZGUgPSBlbmNvZGU7XG4gICAgZnVuY3Rpb24gZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBfbTAuUmVhZGVyID8gaW5wdXQgOiBfbTAuUmVhZGVyLmNyZWF0ZShpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZVBCTWVzaFJlbmRlcmVyKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMTApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubWVzaCA9IHsgJGNhc2U6IFwiYm94XCIsIGJveDogUEJNZXNoUmVuZGVyZXJfQm94TWVzaC5kZWNvZGUocmVhZGVyLCByZWFkZXIudWludDMyKCkpIH07XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMTgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubWVzaCA9IHsgJGNhc2U6IFwic3BoZXJlXCIsIHNwaGVyZTogUEJNZXNoUmVuZGVyZXJfU3BoZXJlTWVzaC5kZWNvZGUocmVhZGVyLCByZWFkZXIudWludDMyKCkpIH07XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMjYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubWVzaCA9IHsgJGNhc2U6IFwiY3lsaW5kZXJcIiwgY3lsaW5kZXI6IFBCTWVzaFJlbmRlcmVyX0N5bGluZGVyTWVzaC5kZWNvZGUocmVhZGVyLCByZWFkZXIudWludDMyKCkpIH07XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMzQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubWVzaCA9IHsgJGNhc2U6IFwicGxhbmVcIiwgcGxhbmU6IFBCTWVzaFJlbmRlcmVyX1BsYW5lTWVzaC5kZWNvZGUocmVhZGVyLCByZWFkZXIudWludDMyKCkpIH07XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCh0YWcgJiA3KSA9PT0gNCB8fCB0YWcgPT09IDApIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgUEJNZXNoUmVuZGVyZXIuZGVjb2RlID0gZGVjb2RlO1xufSkoUEJNZXNoUmVuZGVyZXIgfHwgKFBCTWVzaFJlbmRlcmVyID0ge30pKTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VQQk1lc2hSZW5kZXJlcl9Cb3hNZXNoKCkge1xuICAgIHJldHVybiB7IHV2czogW10gfTtcbn1cbi8qKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdmFyIFBCTWVzaFJlbmRlcmVyX0JveE1lc2g7XG4oZnVuY3Rpb24gKFBCTWVzaFJlbmRlcmVyX0JveE1lc2gpIHtcbiAgICBmdW5jdGlvbiBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gX20wLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICB3cml0ZXIudWludDMyKDEwKS5mb3JrKCk7XG4gICAgICAgIGZvciAoY29uc3QgdiBvZiBtZXNzYWdlLnV2cykge1xuICAgICAgICAgICAgd3JpdGVyLmZsb2F0KHYpO1xuICAgICAgICB9XG4gICAgICAgIHdyaXRlci5sZGVsaW0oKTtcbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9XG4gICAgUEJNZXNoUmVuZGVyZXJfQm94TWVzaC5lbmNvZGUgPSBlbmNvZGU7XG4gICAgZnVuY3Rpb24gZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBfbTAuUmVhZGVyID8gaW5wdXQgOiBfbTAuUmVhZGVyLmNyZWF0ZShpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZVBCTWVzaFJlbmRlcmVyX0JveE1lc2goKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnID09PSAxMykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS51dnMucHVzaChyZWFkZXIuZmxvYXQoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnID09PSAxMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5kMiA9IHJlYWRlci51aW50MzIoKSArIHJlYWRlci5wb3M7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnV2cy5wdXNoKHJlYWRlci5mbG9hdCgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCh0YWcgJiA3KSA9PT0gNCB8fCB0YWcgPT09IDApIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgUEJNZXNoUmVuZGVyZXJfQm94TWVzaC5kZWNvZGUgPSBkZWNvZGU7XG59KShQQk1lc2hSZW5kZXJlcl9Cb3hNZXNoIHx8IChQQk1lc2hSZW5kZXJlcl9Cb3hNZXNoID0ge30pKTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VQQk1lc2hSZW5kZXJlcl9DeWxpbmRlck1lc2goKSB7XG4gICAgcmV0dXJuIHsgcmFkaXVzVG9wOiB1bmRlZmluZWQsIHJhZGl1c0JvdHRvbTogdW5kZWZpbmVkIH07XG59XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHZhciBQQk1lc2hSZW5kZXJlcl9DeWxpbmRlck1lc2g7XG4oZnVuY3Rpb24gKFBCTWVzaFJlbmRlcmVyX0N5bGluZGVyTWVzaCkge1xuICAgIGZ1bmN0aW9uIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBfbTAuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLnJhZGl1c1RvcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDEzKS5mbG9hdChtZXNzYWdlLnJhZGl1c1RvcCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UucmFkaXVzQm90dG9tICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMjEpLmZsb2F0KG1lc3NhZ2UucmFkaXVzQm90dG9tKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbiAgICBQQk1lc2hSZW5kZXJlcl9DeWxpbmRlck1lc2guZW5jb2RlID0gZW5jb2RlO1xuICAgIGZ1bmN0aW9uIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgX20wLlJlYWRlciA/IGlucHV0IDogX20wLlJlYWRlci5jcmVhdGUoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VQQk1lc2hSZW5kZXJlcl9DeWxpbmRlck1lc2goKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSAxMykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5yYWRpdXNUb3AgPSByZWFkZXIuZmxvYXQoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSAyMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5yYWRpdXNCb3R0b20gPSByZWFkZXIuZmxvYXQoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKHRhZyAmIDcpID09PSA0IHx8IHRhZyA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBQQk1lc2hSZW5kZXJlcl9DeWxpbmRlck1lc2guZGVjb2RlID0gZGVjb2RlO1xufSkoUEJNZXNoUmVuZGVyZXJfQ3lsaW5kZXJNZXNoIHx8IChQQk1lc2hSZW5kZXJlcl9DeWxpbmRlck1lc2ggPSB7fSkpO1xuZnVuY3Rpb24gY3JlYXRlQmFzZVBCTWVzaFJlbmRlcmVyX1BsYW5lTWVzaCgpIHtcbiAgICByZXR1cm4geyB1dnM6IFtdIH07XG59XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHZhciBQQk1lc2hSZW5kZXJlcl9QbGFuZU1lc2g7XG4oZnVuY3Rpb24gKFBCTWVzaFJlbmRlcmVyX1BsYW5lTWVzaCkge1xuICAgIGZ1bmN0aW9uIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBfbTAuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIHdyaXRlci51aW50MzIoMTApLmZvcmsoKTtcbiAgICAgICAgZm9yIChjb25zdCB2IG9mIG1lc3NhZ2UudXZzKSB7XG4gICAgICAgICAgICB3cml0ZXIuZmxvYXQodik7XG4gICAgICAgIH1cbiAgICAgICAgd3JpdGVyLmxkZWxpbSgpO1xuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbiAgICBQQk1lc2hSZW5kZXJlcl9QbGFuZU1lc2guZW5jb2RlID0gZW5jb2RlO1xuICAgIGZ1bmN0aW9uIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgX20wLlJlYWRlciA/IGlucHV0IDogX20wLlJlYWRlci5jcmVhdGUoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VQQk1lc2hSZW5kZXJlcl9QbGFuZU1lc2goKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnID09PSAxMykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS51dnMucHVzaChyZWFkZXIuZmxvYXQoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnID09PSAxMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5kMiA9IHJlYWRlci51aW50MzIoKSArIHJlYWRlci5wb3M7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnV2cy5wdXNoKHJlYWRlci5mbG9hdCgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCh0YWcgJiA3KSA9PT0gNCB8fCB0YWcgPT09IDApIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgUEJNZXNoUmVuZGVyZXJfUGxhbmVNZXNoLmRlY29kZSA9IGRlY29kZTtcbn0pKFBCTWVzaFJlbmRlcmVyX1BsYW5lTWVzaCB8fCAoUEJNZXNoUmVuZGVyZXJfUGxhbmVNZXNoID0ge30pKTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VQQk1lc2hSZW5kZXJlcl9TcGhlcmVNZXNoKCkge1xuICAgIHJldHVybiB7fTtcbn1cbi8qKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdmFyIFBCTWVzaFJlbmRlcmVyX1NwaGVyZU1lc2g7XG4oZnVuY3Rpb24gKFBCTWVzaFJlbmRlcmVyX1NwaGVyZU1lc2gpIHtcbiAgICBmdW5jdGlvbiBlbmNvZGUoXywgd3JpdGVyID0gX20wLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbiAgICBQQk1lc2hSZW5kZXJlcl9TcGhlcmVNZXNoLmVuY29kZSA9IGVuY29kZTtcbiAgICBmdW5jdGlvbiBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIF9tMC5SZWFkZXIgPyBpbnB1dCA6IF9tMC5SZWFkZXIuY3JlYXRlKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlUEJNZXNoUmVuZGVyZXJfU3BoZXJlTWVzaCgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgodGFnICYgNykgPT09IDQgfHwgdGFnID09PSAwKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIFBCTWVzaFJlbmRlcmVyX1NwaGVyZU1lc2guZGVjb2RlID0gZGVjb2RlO1xufSkoUEJNZXNoUmVuZGVyZXJfU3BoZXJlTWVzaCB8fCAoUEJNZXNoUmVuZGVyZXJfU3BoZXJlTWVzaCA9IHt9KSk7XG4iLCAiaW1wb3J0IHsgUEJNZXNoUmVuZGVyZXIgfSBmcm9tICcuL3BiL2RlY2VudHJhbGFuZC9zZGsvY29tcG9uZW50cy9tZXNoX3JlbmRlcmVyLmdlbic7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgTWVzaFJlbmRlcmVyU2NoZW1hID0ge1xuICAgIENPTVBPTkVOVF9JRDogMTAxOCxcbiAgICBzZXJpYWxpemUodmFsdWUsIGJ1aWxkZXIpIHtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gUEJNZXNoUmVuZGVyZXIuZW5jb2RlKHZhbHVlKTtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkod3JpdGVyLmZpbmlzaCgpLCAwLCB3cml0ZXIubGVuKTtcbiAgICAgICAgYnVpbGRlci53cml0ZUJ1ZmZlcihidWZmZXIsIGZhbHNlKTtcbiAgICB9LFxuICAgIGRlc2VyaWFsaXplKHJlYWRlcikge1xuICAgICAgICByZXR1cm4gUEJNZXNoUmVuZGVyZXIuZGVjb2RlKHJlYWRlci5idWZmZXIoKSwgcmVhZGVyLnJlbWFpbmluZ0J5dGVzKCkpO1xuICAgIH0sXG4gICAgY3JlYXRlKCkge1xuICAgICAgICAvLyBUT0RPOiB0aGlzIGlzIGEgaGFjay5cbiAgICAgICAgcmV0dXJuIFBCTWVzaFJlbmRlcmVyLmRlY29kZShuZXcgVWludDhBcnJheSgpKTtcbiAgICB9LFxuICAgIGpzb25TY2hlbWE6IHtcbiAgICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgICAgcHJvcGVydGllczoge30sXG4gICAgICAgIHNlcmlhbGl6YXRpb25UeXBlOiBcInByb3RvY29sLWJ1ZmZlclwiLFxuICAgICAgICBwcm90b2NvbEJ1ZmZlcjogXCJQQk1lc2hSZW5kZXJlclwiXG4gICAgfVxufTtcbiIsICIvKiBlc2xpbnQtZGlzYWJsZSAqL1xuaW1wb3J0IF9tMCBmcm9tIFwicHJvdG9idWZqcy9taW5pbWFsXCI7XG5pbXBvcnQgeyBDb2xvcjMgfSBmcm9tIFwiLi4vLi4vY29tbW9uL2NvbG9ycy5nZW5cIjtcbmNvbnN0IHByb3RvYnVmUGFja2FnZVNhcmFzYSA9IFwiZGVjZW50cmFsYW5kLnNkay5jb21wb25lbnRzXCI7XG4vKiogTmZ0RnJhbWVUeXBlIGlzIGEgcHJlZGVmaW5lZCBmcmFtaW5nIHN0eWxlIGZvciB0aGUgaW1hZ2UuICovXG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHZhciBOZnRGcmFtZVR5cGU7XG4oZnVuY3Rpb24gKE5mdEZyYW1lVHlwZSkge1xuICAgIE5mdEZyYW1lVHlwZVtOZnRGcmFtZVR5cGVbXCJORlRfQ0xBU1NJQ1wiXSA9IDBdID0gXCJORlRfQ0xBU1NJQ1wiO1xuICAgIE5mdEZyYW1lVHlwZVtOZnRGcmFtZVR5cGVbXCJORlRfQkFST1FVRV9PUk5BTUVOVFwiXSA9IDFdID0gXCJORlRfQkFST1FVRV9PUk5BTUVOVFwiO1xuICAgIE5mdEZyYW1lVHlwZVtOZnRGcmFtZVR5cGVbXCJORlRfRElBTU9ORF9PUk5BTUVOVFwiXSA9IDJdID0gXCJORlRfRElBTU9ORF9PUk5BTUVOVFwiO1xuICAgIE5mdEZyYW1lVHlwZVtOZnRGcmFtZVR5cGVbXCJORlRfTUlOSU1BTF9XSURFXCJdID0gM10gPSBcIk5GVF9NSU5JTUFMX1dJREVcIjtcbiAgICBOZnRGcmFtZVR5cGVbTmZ0RnJhbWVUeXBlW1wiTkZUX01JTklNQUxfR1JFWVwiXSA9IDRdID0gXCJORlRfTUlOSU1BTF9HUkVZXCI7XG4gICAgTmZ0RnJhbWVUeXBlW05mdEZyYW1lVHlwZVtcIk5GVF9CTE9DS1lcIl0gPSA1XSA9IFwiTkZUX0JMT0NLWVwiO1xuICAgIE5mdEZyYW1lVHlwZVtOZnRGcmFtZVR5cGVbXCJORlRfR09MRF9FREdFU1wiXSA9IDZdID0gXCJORlRfR09MRF9FREdFU1wiO1xuICAgIE5mdEZyYW1lVHlwZVtOZnRGcmFtZVR5cGVbXCJORlRfR09MRF9DQVJWRURcIl0gPSA3XSA9IFwiTkZUX0dPTERfQ0FSVkVEXCI7XG4gICAgTmZ0RnJhbWVUeXBlW05mdEZyYW1lVHlwZVtcIk5GVF9HT0xEX1dJREVcIl0gPSA4XSA9IFwiTkZUX0dPTERfV0lERVwiO1xuICAgIE5mdEZyYW1lVHlwZVtOZnRGcmFtZVR5cGVbXCJORlRfR09MRF9ST1VOREVEXCJdID0gOV0gPSBcIk5GVF9HT0xEX1JPVU5ERURcIjtcbiAgICBOZnRGcmFtZVR5cGVbTmZ0RnJhbWVUeXBlW1wiTkZUX01FVEFMX01FRElVTVwiXSA9IDEwXSA9IFwiTkZUX01FVEFMX01FRElVTVwiO1xuICAgIE5mdEZyYW1lVHlwZVtOZnRGcmFtZVR5cGVbXCJORlRfTUVUQUxfV0lERVwiXSA9IDExXSA9IFwiTkZUX01FVEFMX1dJREVcIjtcbiAgICBOZnRGcmFtZVR5cGVbTmZ0RnJhbWVUeXBlW1wiTkZUX01FVEFMX1NMSU1cIl0gPSAxMl0gPSBcIk5GVF9NRVRBTF9TTElNXCI7XG4gICAgTmZ0RnJhbWVUeXBlW05mdEZyYW1lVHlwZVtcIk5GVF9NRVRBTF9ST1VOREVEXCJdID0gMTNdID0gXCJORlRfTUVUQUxfUk9VTkRFRFwiO1xuICAgIE5mdEZyYW1lVHlwZVtOZnRGcmFtZVR5cGVbXCJORlRfUElOU1wiXSA9IDE0XSA9IFwiTkZUX1BJTlNcIjtcbiAgICBOZnRGcmFtZVR5cGVbTmZ0RnJhbWVUeXBlW1wiTkZUX01JTklNQUxfQkxBQ0tcIl0gPSAxNV0gPSBcIk5GVF9NSU5JTUFMX0JMQUNLXCI7XG4gICAgTmZ0RnJhbWVUeXBlW05mdEZyYW1lVHlwZVtcIk5GVF9NSU5JTUFMX1dISVRFXCJdID0gMTZdID0gXCJORlRfTUlOSU1BTF9XSElURVwiO1xuICAgIE5mdEZyYW1lVHlwZVtOZnRGcmFtZVR5cGVbXCJORlRfVEFQRVwiXSA9IDE3XSA9IFwiTkZUX1RBUEVcIjtcbiAgICBOZnRGcmFtZVR5cGVbTmZ0RnJhbWVUeXBlW1wiTkZUX1dPT0RfU0xJTVwiXSA9IDE4XSA9IFwiTkZUX1dPT0RfU0xJTVwiO1xuICAgIE5mdEZyYW1lVHlwZVtOZnRGcmFtZVR5cGVbXCJORlRfV09PRF9XSURFXCJdID0gMTldID0gXCJORlRfV09PRF9XSURFXCI7XG4gICAgTmZ0RnJhbWVUeXBlW05mdEZyYW1lVHlwZVtcIk5GVF9XT09EX1RXSUdTXCJdID0gMjBdID0gXCJORlRfV09PRF9UV0lHU1wiO1xuICAgIE5mdEZyYW1lVHlwZVtOZnRGcmFtZVR5cGVbXCJORlRfQ0FOVkFTXCJdID0gMjFdID0gXCJORlRfQ0FOVkFTXCI7XG4gICAgTmZ0RnJhbWVUeXBlW05mdEZyYW1lVHlwZVtcIk5GVF9OT05FXCJdID0gMjJdID0gXCJORlRfTk9ORVwiO1xufSkoTmZ0RnJhbWVUeXBlIHx8IChOZnRGcmFtZVR5cGUgPSB7fSkpO1xuZnVuY3Rpb24gY3JlYXRlQmFzZVBCTmZ0U2hhcGUoKSB7XG4gICAgcmV0dXJuIHsgdXJuOiBcIlwiLCBzdHlsZTogdW5kZWZpbmVkLCBjb2xvcjogdW5kZWZpbmVkIH07XG59XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHZhciBQQk5mdFNoYXBlO1xuKGZ1bmN0aW9uIChQQk5mdFNoYXBlKSB7XG4gICAgZnVuY3Rpb24gZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IF9tMC5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UudXJuICE9PSBcIlwiKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDEwKS5zdHJpbmcobWVzc2FnZS51cm4pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnN0eWxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTYpLmludDMyKG1lc3NhZ2Uuc3R5bGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmNvbG9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIENvbG9yMy5lbmNvZGUobWVzc2FnZS5jb2xvciwgd3JpdGVyLnVpbnQzMigyNikuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbiAgICBQQk5mdFNoYXBlLmVuY29kZSA9IGVuY29kZTtcbiAgICBmdW5jdGlvbiBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIF9tMC5SZWFkZXIgPyBpbnB1dCA6IF9tMC5SZWFkZXIuY3JlYXRlKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlUEJOZnRTaGFwZSgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDEwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnVybiA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSAxNikge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zdHlsZSA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDI2KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmNvbG9yID0gQ29sb3IzLmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCh0YWcgJiA3KSA9PT0gNCB8fCB0YWcgPT09IDApIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgUEJOZnRTaGFwZS5kZWNvZGUgPSBkZWNvZGU7XG59KShQQk5mdFNoYXBlIHx8IChQQk5mdFNoYXBlID0ge30pKTtcbiIsICJpbXBvcnQgeyBQQk5mdFNoYXBlIH0gZnJvbSAnLi9wYi9kZWNlbnRyYWxhbmQvc2RrL2NvbXBvbmVudHMvbmZ0X3NoYXBlLmdlbic7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgTmZ0U2hhcGVTY2hlbWEgPSB7XG4gICAgQ09NUE9ORU5UX0lEOiAxMDQwLFxuICAgIHNlcmlhbGl6ZSh2YWx1ZSwgYnVpbGRlcikge1xuICAgICAgICBjb25zdCB3cml0ZXIgPSBQQk5mdFNoYXBlLmVuY29kZSh2YWx1ZSk7XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KHdyaXRlci5maW5pc2goKSwgMCwgd3JpdGVyLmxlbik7XG4gICAgICAgIGJ1aWxkZXIud3JpdGVCdWZmZXIoYnVmZmVyLCBmYWxzZSk7XG4gICAgfSxcbiAgICBkZXNlcmlhbGl6ZShyZWFkZXIpIHtcbiAgICAgICAgcmV0dXJuIFBCTmZ0U2hhcGUuZGVjb2RlKHJlYWRlci5idWZmZXIoKSwgcmVhZGVyLnJlbWFpbmluZ0J5dGVzKCkpO1xuICAgIH0sXG4gICAgY3JlYXRlKCkge1xuICAgICAgICAvLyBUT0RPOiB0aGlzIGlzIGEgaGFjay5cbiAgICAgICAgcmV0dXJuIFBCTmZ0U2hhcGUuZGVjb2RlKG5ldyBVaW50OEFycmF5KCkpO1xuICAgIH0sXG4gICAganNvblNjaGVtYToge1xuICAgICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgICBwcm9wZXJ0aWVzOiB7fSxcbiAgICAgICAgc2VyaWFsaXphdGlvblR5cGU6IFwicHJvdG9jb2wtYnVmZmVyXCIsXG4gICAgICAgIHByb3RvY29sQnVmZmVyOiBcIlBCTmZ0U2hhcGVcIlxuICAgIH1cbn07XG4iLCAiLyogZXNsaW50LWRpc2FibGUgKi9cbmltcG9ydCBfbTAgZnJvbSBcInByb3RvYnVmanMvbWluaW1hbFwiO1xuY29uc3QgcHJvdG9idWZQYWNrYWdlU2FyYXNhID0gXCJkZWNlbnRyYWxhbmQuc2RrLmNvbXBvbmVudHNcIjtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VQQlBvaW50ZXJFdmVudHMoKSB7XG4gICAgcmV0dXJuIHsgcG9pbnRlckV2ZW50czogW10gfTtcbn1cbi8qKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdmFyIFBCUG9pbnRlckV2ZW50cztcbihmdW5jdGlvbiAoUEJQb2ludGVyRXZlbnRzKSB7XG4gICAgZnVuY3Rpb24gZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IF9tMC5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgZm9yIChjb25zdCB2IG9mIG1lc3NhZ2UucG9pbnRlckV2ZW50cykge1xuICAgICAgICAgICAgUEJQb2ludGVyRXZlbnRzX0VudHJ5LmVuY29kZSh2LCB3cml0ZXIudWludDMyKDEwKS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxuICAgIFBCUG9pbnRlckV2ZW50cy5lbmNvZGUgPSBlbmNvZGU7XG4gICAgZnVuY3Rpb24gZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBfbTAuUmVhZGVyID8gaW5wdXQgOiBfbTAuUmVhZGVyLmNyZWF0ZShpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZVBCUG9pbnRlckV2ZW50cygpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDEwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnBvaW50ZXJFdmVudHMucHVzaChQQlBvaW50ZXJFdmVudHNfRW50cnkuZGVjb2RlKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCh0YWcgJiA3KSA9PT0gNCB8fCB0YWcgPT09IDApIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgUEJQb2ludGVyRXZlbnRzLmRlY29kZSA9IGRlY29kZTtcbn0pKFBCUG9pbnRlckV2ZW50cyB8fCAoUEJQb2ludGVyRXZlbnRzID0ge30pKTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VQQlBvaW50ZXJFdmVudHNfSW5mbygpIHtcbiAgICByZXR1cm4geyBidXR0b246IHVuZGVmaW5lZCwgaG92ZXJUZXh0OiB1bmRlZmluZWQsIG1heERpc3RhbmNlOiB1bmRlZmluZWQsIHNob3dGZWVkYmFjazogdW5kZWZpbmVkIH07XG59XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHZhciBQQlBvaW50ZXJFdmVudHNfSW5mbztcbihmdW5jdGlvbiAoUEJQb2ludGVyRXZlbnRzX0luZm8pIHtcbiAgICBmdW5jdGlvbiBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gX20wLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5idXR0b24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS5pbnQzMihtZXNzYWdlLmJ1dHRvbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuaG92ZXJUZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTgpLnN0cmluZyhtZXNzYWdlLmhvdmVyVGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UubWF4RGlzdGFuY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyOSkuZmxvYXQobWVzc2FnZS5tYXhEaXN0YW5jZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2Uuc2hvd0ZlZWRiYWNrICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMzIpLmJvb2wobWVzc2FnZS5zaG93RmVlZGJhY2spO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxuICAgIFBCUG9pbnRlckV2ZW50c19JbmZvLmVuY29kZSA9IGVuY29kZTtcbiAgICBmdW5jdGlvbiBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIF9tMC5SZWFkZXIgPyBpbnB1dCA6IF9tMC5SZWFkZXIuY3JlYXRlKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlUEJQb2ludGVyRXZlbnRzX0luZm8oKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSA4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmJ1dHRvbiA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDE4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmhvdmVyVGV4dCA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSAyOSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5tYXhEaXN0YW5jZSA9IHJlYWRlci5mbG9hdCgpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDMyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnNob3dGZWVkYmFjayA9IHJlYWRlci5ib29sKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCh0YWcgJiA3KSA9PT0gNCB8fCB0YWcgPT09IDApIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgUEJQb2ludGVyRXZlbnRzX0luZm8uZGVjb2RlID0gZGVjb2RlO1xufSkoUEJQb2ludGVyRXZlbnRzX0luZm8gfHwgKFBCUG9pbnRlckV2ZW50c19JbmZvID0ge30pKTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VQQlBvaW50ZXJFdmVudHNfRW50cnkoKSB7XG4gICAgcmV0dXJuIHsgZXZlbnRUeXBlOiAwLCBldmVudEluZm86IHVuZGVmaW5lZCB9O1xufVxuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB2YXIgUEJQb2ludGVyRXZlbnRzX0VudHJ5O1xuKGZ1bmN0aW9uIChQQlBvaW50ZXJFdmVudHNfRW50cnkpIHtcbiAgICBmdW5jdGlvbiBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gX20wLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5ldmVudFR5cGUgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkuaW50MzIobWVzc2FnZS5ldmVudFR5cGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmV2ZW50SW5mbyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBQQlBvaW50ZXJFdmVudHNfSW5mby5lbmNvZGUobWVzc2FnZS5ldmVudEluZm8sIHdyaXRlci51aW50MzIoMTgpLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9XG4gICAgUEJQb2ludGVyRXZlbnRzX0VudHJ5LmVuY29kZSA9IGVuY29kZTtcbiAgICBmdW5jdGlvbiBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIF9tMC5SZWFkZXIgPyBpbnB1dCA6IF9tMC5SZWFkZXIuY3JlYXRlKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlUEJQb2ludGVyRXZlbnRzX0VudHJ5KCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gOCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5ldmVudFR5cGUgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSAxOCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5ldmVudEluZm8gPSBQQlBvaW50ZXJFdmVudHNfSW5mby5kZWNvZGUocmVhZGVyLCByZWFkZXIudWludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgodGFnICYgNykgPT09IDQgfHwgdGFnID09PSAwKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIFBCUG9pbnRlckV2ZW50c19FbnRyeS5kZWNvZGUgPSBkZWNvZGU7XG59KShQQlBvaW50ZXJFdmVudHNfRW50cnkgfHwgKFBCUG9pbnRlckV2ZW50c19FbnRyeSA9IHt9KSk7XG4iLCAiaW1wb3J0IHsgUEJQb2ludGVyRXZlbnRzIH0gZnJvbSAnLi9wYi9kZWNlbnRyYWxhbmQvc2RrL2NvbXBvbmVudHMvcG9pbnRlcl9ldmVudHMuZ2VuJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBQb2ludGVyRXZlbnRzU2NoZW1hID0ge1xuICAgIENPTVBPTkVOVF9JRDogMTA2MixcbiAgICBzZXJpYWxpemUodmFsdWUsIGJ1aWxkZXIpIHtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gUEJQb2ludGVyRXZlbnRzLmVuY29kZSh2YWx1ZSk7XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KHdyaXRlci5maW5pc2goKSwgMCwgd3JpdGVyLmxlbik7XG4gICAgICAgIGJ1aWxkZXIud3JpdGVCdWZmZXIoYnVmZmVyLCBmYWxzZSk7XG4gICAgfSxcbiAgICBkZXNlcmlhbGl6ZShyZWFkZXIpIHtcbiAgICAgICAgcmV0dXJuIFBCUG9pbnRlckV2ZW50cy5kZWNvZGUocmVhZGVyLmJ1ZmZlcigpLCByZWFkZXIucmVtYWluaW5nQnl0ZXMoKSk7XG4gICAgfSxcbiAgICBjcmVhdGUoKSB7XG4gICAgICAgIC8vIFRPRE86IHRoaXMgaXMgYSBoYWNrLlxuICAgICAgICByZXR1cm4gUEJQb2ludGVyRXZlbnRzLmRlY29kZShuZXcgVWludDhBcnJheSgpKTtcbiAgICB9LFxuICAgIGpzb25TY2hlbWE6IHtcbiAgICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgICAgcHJvcGVydGllczoge30sXG4gICAgICAgIHNlcmlhbGl6YXRpb25UeXBlOiBcInByb3RvY29sLWJ1ZmZlclwiLFxuICAgICAgICBwcm90b2NvbEJ1ZmZlcjogXCJQQlBvaW50ZXJFdmVudHNcIlxuICAgIH1cbn07XG4iLCAiLyogZXNsaW50LWRpc2FibGUgKi9cbmltcG9ydCBfbTAgZnJvbSBcInByb3RvYnVmanMvbWluaW1hbFwiO1xuaW1wb3J0IHsgUmF5Y2FzdEhpdCB9IGZyb20gXCIuL2NvbW1vbi9yYXljYXN0X2hpdC5nZW5cIjtcbmNvbnN0IHByb3RvYnVmUGFja2FnZVNhcmFzYSA9IFwiZGVjZW50cmFsYW5kLnNkay5jb21wb25lbnRzXCI7XG5mdW5jdGlvbiBjcmVhdGVCYXNlUEJQb2ludGVyRXZlbnRzUmVzdWx0KCkge1xuICAgIHJldHVybiB7IGJ1dHRvbjogMCwgaGl0OiB1bmRlZmluZWQsIHN0YXRlOiAwLCB0aW1lc3RhbXA6IDAsIGFuYWxvZzogdW5kZWZpbmVkLCB0aWNrTnVtYmVyOiAwIH07XG59XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHZhciBQQlBvaW50ZXJFdmVudHNSZXN1bHQ7XG4oZnVuY3Rpb24gKFBCUG9pbnRlckV2ZW50c1Jlc3VsdCkge1xuICAgIGZ1bmN0aW9uIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBfbTAuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLmJ1dHRvbiAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS5pbnQzMihtZXNzYWdlLmJ1dHRvbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuaGl0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIFJheWNhc3RIaXQuZW5jb2RlKG1lc3NhZ2UuaGl0LCB3cml0ZXIudWludDMyKDE4KS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnN0YXRlICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDMyKS5pbnQzMihtZXNzYWdlLnN0YXRlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS50aW1lc3RhbXAgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNDApLnVpbnQzMihtZXNzYWdlLnRpbWVzdGFtcCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuYW5hbG9nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNTMpLmZsb2F0KG1lc3NhZ2UuYW5hbG9nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS50aWNrTnVtYmVyICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDU2KS51aW50MzIobWVzc2FnZS50aWNrTnVtYmVyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbiAgICBQQlBvaW50ZXJFdmVudHNSZXN1bHQuZW5jb2RlID0gZW5jb2RlO1xuICAgIGZ1bmN0aW9uIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgX20wLlJlYWRlciA/IGlucHV0IDogX20wLlJlYWRlci5jcmVhdGUoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VQQlBvaW50ZXJFdmVudHNSZXN1bHQoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSA4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmJ1dHRvbiA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDE4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmhpdCA9IFJheWNhc3RIaXQuZGVjb2RlKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSAzMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zdGF0ZSA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDQwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnRpbWVzdGFtcCA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSA1Mykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5hbmFsb2cgPSByZWFkZXIuZmxvYXQoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSA1Nikge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50aWNrTnVtYmVyID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgodGFnICYgNykgPT09IDQgfHwgdGFnID09PSAwKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIFBCUG9pbnRlckV2ZW50c1Jlc3VsdC5kZWNvZGUgPSBkZWNvZGU7XG59KShQQlBvaW50ZXJFdmVudHNSZXN1bHQgfHwgKFBCUG9pbnRlckV2ZW50c1Jlc3VsdCA9IHt9KSk7XG4iLCAiLyogZXNsaW50LWRpc2FibGUgKi9cbmltcG9ydCBfbTAgZnJvbSBcInByb3RvYnVmanMvbWluaW1hbFwiO1xuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gXCIuLi8uLi8uLi9jb21tb24vdmVjdG9ycy5nZW5cIjtcbmNvbnN0IHByb3RvYnVmUGFja2FnZVNhcmFzYSA9IFwiZGVjZW50cmFsYW5kLnNkay5jb21wb25lbnRzLmNvbW1vblwiO1xuZnVuY3Rpb24gY3JlYXRlQmFzZVJheWNhc3RIaXQoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcG9zaXRpb246IHVuZGVmaW5lZCxcbiAgICAgICAgZ2xvYmFsT3JpZ2luOiB1bmRlZmluZWQsXG4gICAgICAgIGRpcmVjdGlvbjogdW5kZWZpbmVkLFxuICAgICAgICBub3JtYWxIaXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgbGVuZ3RoOiAwLFxuICAgICAgICBtZXNoTmFtZTogdW5kZWZpbmVkLFxuICAgICAgICBlbnRpdHlJZDogdW5kZWZpbmVkLFxuICAgIH07XG59XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHZhciBSYXljYXN0SGl0O1xuKGZ1bmN0aW9uIChSYXljYXN0SGl0KSB7XG4gICAgZnVuY3Rpb24gZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IF9tMC5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UucG9zaXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgVmVjdG9yMy5lbmNvZGUobWVzc2FnZS5wb3NpdGlvbiwgd3JpdGVyLnVpbnQzMigxMCkuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5nbG9iYWxPcmlnaW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgVmVjdG9yMy5lbmNvZGUobWVzc2FnZS5nbG9iYWxPcmlnaW4sIHdyaXRlci51aW50MzIoMTgpLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuZGlyZWN0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIFZlY3RvcjMuZW5jb2RlKG1lc3NhZ2UuZGlyZWN0aW9uLCB3cml0ZXIudWludDMyKDI2KS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLm5vcm1hbEhpdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBWZWN0b3IzLmVuY29kZShtZXNzYWdlLm5vcm1hbEhpdCwgd3JpdGVyLnVpbnQzMigzNCkuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNDUpLmZsb2F0KG1lc3NhZ2UubGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5tZXNoTmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDUwKS5zdHJpbmcobWVzc2FnZS5tZXNoTmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuZW50aXR5SWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig1NikudWludDMyKG1lc3NhZ2UuZW50aXR5SWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxuICAgIFJheWNhc3RIaXQuZW5jb2RlID0gZW5jb2RlO1xuICAgIGZ1bmN0aW9uIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgX20wLlJlYWRlciA/IGlucHV0IDogX20wLlJlYWRlci5jcmVhdGUoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VSYXljYXN0SGl0KCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMTApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucG9zaXRpb24gPSBWZWN0b3IzLmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMTgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZ2xvYmFsT3JpZ2luID0gVmVjdG9yMy5kZWNvZGUocmVhZGVyLCByZWFkZXIudWludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDI2KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmRpcmVjdGlvbiA9IFZlY3RvcjMuZGVjb2RlKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSAzNCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5ub3JtYWxIaXQgPSBWZWN0b3IzLmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gNDUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubGVuZ3RoID0gcmVhZGVyLmZsb2F0KCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gNTApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubWVzaE5hbWUgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gNTYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZW50aXR5SWQgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCh0YWcgJiA3KSA9PT0gNCB8fCB0YWcgPT09IDApIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgUmF5Y2FzdEhpdC5kZWNvZGUgPSBkZWNvZGU7XG59KShSYXljYXN0SGl0IHx8IChSYXljYXN0SGl0ID0ge30pKTtcbiIsICJpbXBvcnQgeyBQQlBvaW50ZXJFdmVudHNSZXN1bHQgfSBmcm9tICcuL3BiL2RlY2VudHJhbGFuZC9zZGsvY29tcG9uZW50cy9wb2ludGVyX2V2ZW50c19yZXN1bHQuZ2VuJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBQb2ludGVyRXZlbnRzUmVzdWx0U2NoZW1hID0ge1xuICAgIENPTVBPTkVOVF9JRDogMTA2MyxcbiAgICBzZXJpYWxpemUodmFsdWUsIGJ1aWxkZXIpIHtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gUEJQb2ludGVyRXZlbnRzUmVzdWx0LmVuY29kZSh2YWx1ZSk7XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KHdyaXRlci5maW5pc2goKSwgMCwgd3JpdGVyLmxlbik7XG4gICAgICAgIGJ1aWxkZXIud3JpdGVCdWZmZXIoYnVmZmVyLCBmYWxzZSk7XG4gICAgfSxcbiAgICBkZXNlcmlhbGl6ZShyZWFkZXIpIHtcbiAgICAgICAgcmV0dXJuIFBCUG9pbnRlckV2ZW50c1Jlc3VsdC5kZWNvZGUocmVhZGVyLmJ1ZmZlcigpLCByZWFkZXIucmVtYWluaW5nQnl0ZXMoKSk7XG4gICAgfSxcbiAgICBjcmVhdGUoKSB7XG4gICAgICAgIC8vIFRPRE86IHRoaXMgaXMgYSBoYWNrLlxuICAgICAgICByZXR1cm4gUEJQb2ludGVyRXZlbnRzUmVzdWx0LmRlY29kZShuZXcgVWludDhBcnJheSgpKTtcbiAgICB9LFxuICAgIGpzb25TY2hlbWE6IHtcbiAgICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgICAgcHJvcGVydGllczoge30sXG4gICAgICAgIHNlcmlhbGl6YXRpb25UeXBlOiBcInByb3RvY29sLWJ1ZmZlclwiLFxuICAgICAgICBwcm90b2NvbEJ1ZmZlcjogXCJQQlBvaW50ZXJFdmVudHNSZXN1bHRcIlxuICAgIH1cbn07XG4iLCAiLyogZXNsaW50LWRpc2FibGUgKi9cbmltcG9ydCBfbTAgZnJvbSBcInByb3RvYnVmanMvbWluaW1hbFwiO1xuY29uc3QgcHJvdG9idWZQYWNrYWdlU2FyYXNhID0gXCJkZWNlbnRyYWxhbmQuc2RrLmNvbXBvbmVudHNcIjtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VQQlBvaW50ZXJMb2NrKCkge1xuICAgIHJldHVybiB7IGlzUG9pbnRlckxvY2tlZDogZmFsc2UgfTtcbn1cbi8qKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdmFyIFBCUG9pbnRlckxvY2s7XG4oZnVuY3Rpb24gKFBCUG9pbnRlckxvY2spIHtcbiAgICBmdW5jdGlvbiBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gX20wLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5pc1BvaW50ZXJMb2NrZWQgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkuYm9vbChtZXNzYWdlLmlzUG9pbnRlckxvY2tlZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9XG4gICAgUEJQb2ludGVyTG9jay5lbmNvZGUgPSBlbmNvZGU7XG4gICAgZnVuY3Rpb24gZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBfbTAuUmVhZGVyID8gaW5wdXQgOiBfbTAuUmVhZGVyLmNyZWF0ZShpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZVBCUG9pbnRlckxvY2soKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSA4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmlzUG9pbnRlckxvY2tlZCA9IHJlYWRlci5ib29sKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCh0YWcgJiA3KSA9PT0gNCB8fCB0YWcgPT09IDApIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgUEJQb2ludGVyTG9jay5kZWNvZGUgPSBkZWNvZGU7XG59KShQQlBvaW50ZXJMb2NrIHx8IChQQlBvaW50ZXJMb2NrID0ge30pKTtcbiIsICJpbXBvcnQgeyBQQlBvaW50ZXJMb2NrIH0gZnJvbSAnLi9wYi9kZWNlbnRyYWxhbmQvc2RrL2NvbXBvbmVudHMvcG9pbnRlcl9sb2NrLmdlbic7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgUG9pbnRlckxvY2tTY2hlbWEgPSB7XG4gICAgQ09NUE9ORU5UX0lEOiAxMDc0LFxuICAgIHNlcmlhbGl6ZSh2YWx1ZSwgYnVpbGRlcikge1xuICAgICAgICBjb25zdCB3cml0ZXIgPSBQQlBvaW50ZXJMb2NrLmVuY29kZSh2YWx1ZSk7XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KHdyaXRlci5maW5pc2goKSwgMCwgd3JpdGVyLmxlbik7XG4gICAgICAgIGJ1aWxkZXIud3JpdGVCdWZmZXIoYnVmZmVyLCBmYWxzZSk7XG4gICAgfSxcbiAgICBkZXNlcmlhbGl6ZShyZWFkZXIpIHtcbiAgICAgICAgcmV0dXJuIFBCUG9pbnRlckxvY2suZGVjb2RlKHJlYWRlci5idWZmZXIoKSwgcmVhZGVyLnJlbWFpbmluZ0J5dGVzKCkpO1xuICAgIH0sXG4gICAgY3JlYXRlKCkge1xuICAgICAgICAvLyBUT0RPOiB0aGlzIGlzIGEgaGFjay5cbiAgICAgICAgcmV0dXJuIFBCUG9pbnRlckxvY2suZGVjb2RlKG5ldyBVaW50OEFycmF5KCkpO1xuICAgIH0sXG4gICAganNvblNjaGVtYToge1xuICAgICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgICBwcm9wZXJ0aWVzOiB7fSxcbiAgICAgICAgc2VyaWFsaXphdGlvblR5cGU6IFwicHJvdG9jb2wtYnVmZmVyXCIsXG4gICAgICAgIHByb3RvY29sQnVmZmVyOiBcIlBCUG9pbnRlckxvY2tcIlxuICAgIH1cbn07XG4iLCAiLyogZXNsaW50LWRpc2FibGUgKi9cbmltcG9ydCBfbTAgZnJvbSBcInByb3RvYnVmanMvbWluaW1hbFwiO1xuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gXCIuLi8uLi9jb21tb24vdmVjdG9ycy5nZW5cIjtcbmNvbnN0IHByb3RvYnVmUGFja2FnZVNhcmFzYSA9IFwiZGVjZW50cmFsYW5kLnNkay5jb21wb25lbnRzXCI7XG4vKiogUmF5Y2FzdFF1ZXJ5VHlwZSBpbmRpY2F0ZXMgd2hldGhlciB0aGUgcmF5IHNob3VsZCBzdG9wIG9uIHRoZSBmaXJzdCBjb2xsaXRpb24sIG9yIGNvbnRpbnVlLiAqL1xuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB2YXIgUmF5Y2FzdFF1ZXJ5VHlwZTtcbihmdW5jdGlvbiAoUmF5Y2FzdFF1ZXJ5VHlwZSkge1xuICAgIC8qKiBSUVRfSElUX0ZJUlNUIC0gUGljayB0aGUgZmlyc3QgKG5vdCBuZWNlc3NhcmlseSB0aGUgY2xvc2VzdCkgaGl0IHdpdGhpbiB0aGUgcmFuZ2UgKi9cbiAgICBSYXljYXN0UXVlcnlUeXBlW1JheWNhc3RRdWVyeVR5cGVbXCJSUVRfSElUX0ZJUlNUXCJdID0gMF0gPSBcIlJRVF9ISVRfRklSU1RcIjtcbiAgICAvKiogUlFUX1FVRVJZX0FMTCAtIFBpY2sgYWxsIGhpdHMgd2l0aGluIHRoZSByYW5nZSAqL1xuICAgIFJheWNhc3RRdWVyeVR5cGVbUmF5Y2FzdFF1ZXJ5VHlwZVtcIlJRVF9RVUVSWV9BTExcIl0gPSAxXSA9IFwiUlFUX1FVRVJZX0FMTFwiO1xuICAgIC8qKiBSUVRfTk9ORSAtIERvIG5vdCBwZXJmb3JtIHRoZSByYXljYXN0LCBvbmx5IHNldCB0aGUgcmF5Y2FzdCByZXN1bHQgd2l0aCBlbXB0eSBoaXRzICovXG4gICAgUmF5Y2FzdFF1ZXJ5VHlwZVtSYXljYXN0UXVlcnlUeXBlW1wiUlFUX05PTkVcIl0gPSAyXSA9IFwiUlFUX05PTkVcIjtcbn0pKFJheWNhc3RRdWVyeVR5cGUgfHwgKFJheWNhc3RRdWVyeVR5cGUgPSB7fSkpO1xuZnVuY3Rpb24gY3JlYXRlQmFzZVBCUmF5Y2FzdCgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB0aW1lc3RhbXA6IHVuZGVmaW5lZCxcbiAgICAgICAgb3JpZ2luT2Zmc2V0OiB1bmRlZmluZWQsXG4gICAgICAgIGRpcmVjdGlvbjogdW5kZWZpbmVkLFxuICAgICAgICBtYXhEaXN0YW5jZTogMCxcbiAgICAgICAgcXVlcnlUeXBlOiAwLFxuICAgICAgICBjb250aW51b3VzOiB1bmRlZmluZWQsXG4gICAgICAgIGNvbGxpc2lvbk1hc2s6IHVuZGVmaW5lZCxcbiAgICB9O1xufVxuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB2YXIgUEJSYXljYXN0O1xuKGZ1bmN0aW9uIChQQlJheWNhc3QpIHtcbiAgICBmdW5jdGlvbiBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gX20wLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS50aW1lc3RhbXAgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS51aW50MzIobWVzc2FnZS50aW1lc3RhbXApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLm9yaWdpbk9mZnNldCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBWZWN0b3IzLmVuY29kZShtZXNzYWdlLm9yaWdpbk9mZnNldCwgd3JpdGVyLnVpbnQzMigxOCkuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgfVxuICAgICAgICBzd2l0Y2ggKG1lc3NhZ2UuZGlyZWN0aW9uPy4kY2FzZSkge1xuICAgICAgICAgICAgY2FzZSBcImxvY2FsRGlyZWN0aW9uXCI6XG4gICAgICAgICAgICAgICAgVmVjdG9yMy5lbmNvZGUobWVzc2FnZS5kaXJlY3Rpb24ubG9jYWxEaXJlY3Rpb24sIHdyaXRlci51aW50MzIoNTApLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiZ2xvYmFsRGlyZWN0aW9uXCI6XG4gICAgICAgICAgICAgICAgVmVjdG9yMy5lbmNvZGUobWVzc2FnZS5kaXJlY3Rpb24uZ2xvYmFsRGlyZWN0aW9uLCB3cml0ZXIudWludDMyKDI2KS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcImdsb2JhbFRhcmdldFwiOlxuICAgICAgICAgICAgICAgIFZlY3RvcjMuZW5jb2RlKG1lc3NhZ2UuZGlyZWN0aW9uLmdsb2JhbFRhcmdldCwgd3JpdGVyLnVpbnQzMig1OCkuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJ0YXJnZXRFbnRpdHlcIjpcbiAgICAgICAgICAgICAgICB3cml0ZXIudWludDMyKDgwKS51aW50MzIobWVzc2FnZS5kaXJlY3Rpb24udGFyZ2V0RW50aXR5KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5tYXhEaXN0YW5jZSAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigzNykuZmxvYXQobWVzc2FnZS5tYXhEaXN0YW5jZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UucXVlcnlUeXBlICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDQwKS5pbnQzMihtZXNzYWdlLnF1ZXJ5VHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuY29udGludW91cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDY0KS5ib29sKG1lc3NhZ2UuY29udGludW91cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuY29sbGlzaW9uTWFzayAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDcyKS51aW50MzIobWVzc2FnZS5jb2xsaXNpb25NYXNrKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbiAgICBQQlJheWNhc3QuZW5jb2RlID0gZW5jb2RlO1xuICAgIGZ1bmN0aW9uIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgX20wLlJlYWRlciA/IGlucHV0IDogX20wLlJlYWRlci5jcmVhdGUoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VQQlJheWNhc3QoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSA4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnRpbWVzdGFtcCA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSAxOCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5vcmlnaW5PZmZzZXQgPSBWZWN0b3IzLmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gNTApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZGlyZWN0aW9uID0geyAkY2FzZTogXCJsb2NhbERpcmVjdGlvblwiLCBsb2NhbERpcmVjdGlvbjogVmVjdG9yMy5kZWNvZGUocmVhZGVyLCByZWFkZXIudWludDMyKCkpIH07XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMjYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZGlyZWN0aW9uID0geyAkY2FzZTogXCJnbG9iYWxEaXJlY3Rpb25cIiwgZ2xvYmFsRGlyZWN0aW9uOiBWZWN0b3IzLmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSkgfTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSA1OCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5kaXJlY3Rpb24gPSB7ICRjYXNlOiBcImdsb2JhbFRhcmdldFwiLCBnbG9iYWxUYXJnZXQ6IFZlY3RvcjMuZGVjb2RlKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpKSB9O1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSA4MCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5kaXJlY3Rpb24gPSB7ICRjYXNlOiBcInRhcmdldEVudGl0eVwiLCB0YXJnZXRFbnRpdHk6IHJlYWRlci51aW50MzIoKSB9O1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDM3KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm1heERpc3RhbmNlID0gcmVhZGVyLmZsb2F0KCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gNDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucXVlcnlUeXBlID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gNjQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuY29udGludW91cyA9IHJlYWRlci5ib29sKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gNzIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuY29sbGlzaW9uTWFzayA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKHRhZyAmIDcpID09PSA0IHx8IHRhZyA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBQQlJheWNhc3QuZGVjb2RlID0gZGVjb2RlO1xufSkoUEJSYXljYXN0IHx8IChQQlJheWNhc3QgPSB7fSkpO1xuIiwgImltcG9ydCB7IFBCUmF5Y2FzdCB9IGZyb20gJy4vcGIvZGVjZW50cmFsYW5kL3Nkay9jb21wb25lbnRzL3JheWNhc3QuZ2VuJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBSYXljYXN0U2NoZW1hID0ge1xuICAgIENPTVBPTkVOVF9JRDogMTA2NyxcbiAgICBzZXJpYWxpemUodmFsdWUsIGJ1aWxkZXIpIHtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gUEJSYXljYXN0LmVuY29kZSh2YWx1ZSk7XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KHdyaXRlci5maW5pc2goKSwgMCwgd3JpdGVyLmxlbik7XG4gICAgICAgIGJ1aWxkZXIud3JpdGVCdWZmZXIoYnVmZmVyLCBmYWxzZSk7XG4gICAgfSxcbiAgICBkZXNlcmlhbGl6ZShyZWFkZXIpIHtcbiAgICAgICAgcmV0dXJuIFBCUmF5Y2FzdC5kZWNvZGUocmVhZGVyLmJ1ZmZlcigpLCByZWFkZXIucmVtYWluaW5nQnl0ZXMoKSk7XG4gICAgfSxcbiAgICBjcmVhdGUoKSB7XG4gICAgICAgIC8vIFRPRE86IHRoaXMgaXMgYSBoYWNrLlxuICAgICAgICByZXR1cm4gUEJSYXljYXN0LmRlY29kZShuZXcgVWludDhBcnJheSgpKTtcbiAgICB9LFxuICAgIGpzb25TY2hlbWE6IHtcbiAgICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgICAgcHJvcGVydGllczoge30sXG4gICAgICAgIHNlcmlhbGl6YXRpb25UeXBlOiBcInByb3RvY29sLWJ1ZmZlclwiLFxuICAgICAgICBwcm90b2NvbEJ1ZmZlcjogXCJQQlJheWNhc3RcIlxuICAgIH1cbn07XG4iLCAiLyogZXNsaW50LWRpc2FibGUgKi9cbmltcG9ydCBfbTAgZnJvbSBcInByb3RvYnVmanMvbWluaW1hbFwiO1xuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gXCIuLi8uLi9jb21tb24vdmVjdG9ycy5nZW5cIjtcbmltcG9ydCB7IFJheWNhc3RIaXQgfSBmcm9tIFwiLi9jb21tb24vcmF5Y2FzdF9oaXQuZ2VuXCI7XG5jb25zdCBwcm90b2J1ZlBhY2thZ2VTYXJhc2EgPSBcImRlY2VudHJhbGFuZC5zZGsuY29tcG9uZW50c1wiO1xuZnVuY3Rpb24gY3JlYXRlQmFzZVBCUmF5Y2FzdFJlc3VsdCgpIHtcbiAgICByZXR1cm4geyB0aW1lc3RhbXA6IHVuZGVmaW5lZCwgZ2xvYmFsT3JpZ2luOiB1bmRlZmluZWQsIGRpcmVjdGlvbjogdW5kZWZpbmVkLCBoaXRzOiBbXSwgdGlja051bWJlcjogMCB9O1xufVxuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB2YXIgUEJSYXljYXN0UmVzdWx0O1xuKGZ1bmN0aW9uIChQQlJheWNhc3RSZXN1bHQpIHtcbiAgICBmdW5jdGlvbiBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gX20wLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS50aW1lc3RhbXAgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS51aW50MzIobWVzc2FnZS50aW1lc3RhbXApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmdsb2JhbE9yaWdpbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBWZWN0b3IzLmVuY29kZShtZXNzYWdlLmdsb2JhbE9yaWdpbiwgd3JpdGVyLnVpbnQzMigxOCkuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5kaXJlY3Rpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgVmVjdG9yMy5lbmNvZGUobWVzc2FnZS5kaXJlY3Rpb24sIHdyaXRlci51aW50MzIoMjYpLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCB2IG9mIG1lc3NhZ2UuaGl0cykge1xuICAgICAgICAgICAgUmF5Y2FzdEhpdC5lbmNvZGUodiwgd3JpdGVyLnVpbnQzMigzNCkuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS50aWNrTnVtYmVyICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDQwKS51aW50MzIobWVzc2FnZS50aWNrTnVtYmVyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbiAgICBQQlJheWNhc3RSZXN1bHQuZW5jb2RlID0gZW5jb2RlO1xuICAgIGZ1bmN0aW9uIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgX20wLlJlYWRlciA/IGlucHV0IDogX20wLlJlYWRlci5jcmVhdGUoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VQQlJheWNhc3RSZXN1bHQoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSA4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnRpbWVzdGFtcCA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSAxOCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5nbG9iYWxPcmlnaW4gPSBWZWN0b3IzLmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMjYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZGlyZWN0aW9uID0gVmVjdG9yMy5kZWNvZGUocmVhZGVyLCByZWFkZXIudWludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDM0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmhpdHMucHVzaChSYXljYXN0SGl0LmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSkpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDQwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnRpY2tOdW1iZXIgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCh0YWcgJiA3KSA9PT0gNCB8fCB0YWcgPT09IDApIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgUEJSYXljYXN0UmVzdWx0LmRlY29kZSA9IGRlY29kZTtcbn0pKFBCUmF5Y2FzdFJlc3VsdCB8fCAoUEJSYXljYXN0UmVzdWx0ID0ge30pKTtcbiIsICJpbXBvcnQgeyBQQlJheWNhc3RSZXN1bHQgfSBmcm9tICcuL3BiL2RlY2VudHJhbGFuZC9zZGsvY29tcG9uZW50cy9yYXljYXN0X3Jlc3VsdC5nZW4nO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFJheWNhc3RSZXN1bHRTY2hlbWEgPSB7XG4gICAgQ09NUE9ORU5UX0lEOiAxMDY4LFxuICAgIHNlcmlhbGl6ZSh2YWx1ZSwgYnVpbGRlcikge1xuICAgICAgICBjb25zdCB3cml0ZXIgPSBQQlJheWNhc3RSZXN1bHQuZW5jb2RlKHZhbHVlKTtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkod3JpdGVyLmZpbmlzaCgpLCAwLCB3cml0ZXIubGVuKTtcbiAgICAgICAgYnVpbGRlci53cml0ZUJ1ZmZlcihidWZmZXIsIGZhbHNlKTtcbiAgICB9LFxuICAgIGRlc2VyaWFsaXplKHJlYWRlcikge1xuICAgICAgICByZXR1cm4gUEJSYXljYXN0UmVzdWx0LmRlY29kZShyZWFkZXIuYnVmZmVyKCksIHJlYWRlci5yZW1haW5pbmdCeXRlcygpKTtcbiAgICB9LFxuICAgIGNyZWF0ZSgpIHtcbiAgICAgICAgLy8gVE9ETzogdGhpcyBpcyBhIGhhY2suXG4gICAgICAgIHJldHVybiBQQlJheWNhc3RSZXN1bHQuZGVjb2RlKG5ldyBVaW50OEFycmF5KCkpO1xuICAgIH0sXG4gICAganNvblNjaGVtYToge1xuICAgICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgICBwcm9wZXJ0aWVzOiB7fSxcbiAgICAgICAgc2VyaWFsaXphdGlvblR5cGU6IFwicHJvdG9jb2wtYnVmZmVyXCIsXG4gICAgICAgIHByb3RvY29sQnVmZmVyOiBcIlBCUmF5Y2FzdFJlc3VsdFwiXG4gICAgfVxufTtcbiIsICIvKiBlc2xpbnQtZGlzYWJsZSAqL1xuaW1wb3J0IF9tMCBmcm9tIFwicHJvdG9idWZqcy9taW5pbWFsXCI7XG5pbXBvcnQgeyBDb2xvcjMsIENvbG9yNCB9IGZyb20gXCIuLi8uLi9jb21tb24vY29sb3JzLmdlblwiO1xuY29uc3QgcHJvdG9idWZQYWNrYWdlU2FyYXNhID0gXCJkZWNlbnRyYWxhbmQuc2RrLmNvbXBvbmVudHNcIjtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VQQlRleHRTaGFwZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB0ZXh0OiBcIlwiLFxuICAgICAgICBmb250OiB1bmRlZmluZWQsXG4gICAgICAgIGZvbnRTaXplOiB1bmRlZmluZWQsXG4gICAgICAgIGZvbnRBdXRvU2l6ZTogdW5kZWZpbmVkLFxuICAgICAgICB0ZXh0QWxpZ246IHVuZGVmaW5lZCxcbiAgICAgICAgd2lkdGg6IHVuZGVmaW5lZCxcbiAgICAgICAgaGVpZ2h0OiB1bmRlZmluZWQsXG4gICAgICAgIHBhZGRpbmdUb3A6IHVuZGVmaW5lZCxcbiAgICAgICAgcGFkZGluZ1JpZ2h0OiB1bmRlZmluZWQsXG4gICAgICAgIHBhZGRpbmdCb3R0b206IHVuZGVmaW5lZCxcbiAgICAgICAgcGFkZGluZ0xlZnQ6IHVuZGVmaW5lZCxcbiAgICAgICAgbGluZVNwYWNpbmc6IHVuZGVmaW5lZCxcbiAgICAgICAgbGluZUNvdW50OiB1bmRlZmluZWQsXG4gICAgICAgIHRleHRXcmFwcGluZzogdW5kZWZpbmVkLFxuICAgICAgICBzaGFkb3dCbHVyOiB1bmRlZmluZWQsXG4gICAgICAgIHNoYWRvd09mZnNldFg6IHVuZGVmaW5lZCxcbiAgICAgICAgc2hhZG93T2Zmc2V0WTogdW5kZWZpbmVkLFxuICAgICAgICBvdXRsaW5lV2lkdGg6IHVuZGVmaW5lZCxcbiAgICAgICAgc2hhZG93Q29sb3I6IHVuZGVmaW5lZCxcbiAgICAgICAgb3V0bGluZUNvbG9yOiB1bmRlZmluZWQsXG4gICAgICAgIHRleHRDb2xvcjogdW5kZWZpbmVkLFxuICAgIH07XG59XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHZhciBQQlRleHRTaGFwZTtcbihmdW5jdGlvbiAoUEJUZXh0U2hhcGUpIHtcbiAgICBmdW5jdGlvbiBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gX20wLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS50ZXh0ICE9PSBcIlwiKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDEwKS5zdHJpbmcobWVzc2FnZS50ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5mb250ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTYpLmludDMyKG1lc3NhZ2UuZm9udCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuZm9udFNpemUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyOSkuZmxvYXQobWVzc2FnZS5mb250U2l6ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuZm9udEF1dG9TaXplICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMzIpLmJvb2wobWVzc2FnZS5mb250QXV0b1NpemUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnRleHRBbGlnbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDQwKS5pbnQzMihtZXNzYWdlLnRleHRBbGlnbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2Uud2lkdGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig1MykuZmxvYXQobWVzc2FnZS53aWR0aCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuaGVpZ2h0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNjEpLmZsb2F0KG1lc3NhZ2UuaGVpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5wYWRkaW5nVG9wICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNjkpLmZsb2F0KG1lc3NhZ2UucGFkZGluZ1RvcCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UucGFkZGluZ1JpZ2h0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNzcpLmZsb2F0KG1lc3NhZ2UucGFkZGluZ1JpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5wYWRkaW5nQm90dG9tICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoODUpLmZsb2F0KG1lc3NhZ2UucGFkZGluZ0JvdHRvbSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UucGFkZGluZ0xlZnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig5MykuZmxvYXQobWVzc2FnZS5wYWRkaW5nTGVmdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UubGluZVNwYWNpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxMDEpLmZsb2F0KG1lc3NhZ2UubGluZVNwYWNpbmcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmxpbmVDb3VudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDEwNCkuaW50MzIobWVzc2FnZS5saW5lQ291bnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnRleHRXcmFwcGluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDExMikuYm9vbChtZXNzYWdlLnRleHRXcmFwcGluZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2Uuc2hhZG93Qmx1ciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDEyNSkuZmxvYXQobWVzc2FnZS5zaGFkb3dCbHVyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5zaGFkb3dPZmZzZXRYICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTMzKS5mbG9hdChtZXNzYWdlLnNoYWRvd09mZnNldFgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnNoYWRvd09mZnNldFkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxNDEpLmZsb2F0KG1lc3NhZ2Uuc2hhZG93T2Zmc2V0WSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2Uub3V0bGluZVdpZHRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTQ5KS5mbG9hdChtZXNzYWdlLm91dGxpbmVXaWR0aCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2Uuc2hhZG93Q29sb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgQ29sb3IzLmVuY29kZShtZXNzYWdlLnNoYWRvd0NvbG9yLCB3cml0ZXIudWludDMyKDE1NCkuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5vdXRsaW5lQ29sb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgQ29sb3IzLmVuY29kZShtZXNzYWdlLm91dGxpbmVDb2xvciwgd3JpdGVyLnVpbnQzMigxNjIpLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UudGV4dENvbG9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIENvbG9yNC5lbmNvZGUobWVzc2FnZS50ZXh0Q29sb3IsIHdyaXRlci51aW50MzIoMTcwKS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxuICAgIFBCVGV4dFNoYXBlLmVuY29kZSA9IGVuY29kZTtcbiAgICBmdW5jdGlvbiBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIF9tMC5SZWFkZXIgPyBpbnB1dCA6IF9tMC5SZWFkZXIuY3JlYXRlKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlUEJUZXh0U2hhcGUoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSAxMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50ZXh0ID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDE2KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmZvbnQgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSAyOSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5mb250U2l6ZSA9IHJlYWRlci5mbG9hdCgpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDMyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmZvbnRBdXRvU2l6ZSA9IHJlYWRlci5ib29sKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gNDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudGV4dEFsaWduID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gNTMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uud2lkdGggPSByZWFkZXIuZmxvYXQoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSA2MSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5oZWlnaHQgPSByZWFkZXIuZmxvYXQoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSA2OSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5wYWRkaW5nVG9wID0gcmVhZGVyLmZsb2F0KCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gNzcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucGFkZGluZ1JpZ2h0ID0gcmVhZGVyLmZsb2F0KCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDg1KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnBhZGRpbmdCb3R0b20gPSByZWFkZXIuZmxvYXQoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gOTMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucGFkZGluZ0xlZnQgPSByZWFkZXIuZmxvYXQoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMTAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmxpbmVTcGFjaW5nID0gcmVhZGVyLmZsb2F0KCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDEwNCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5saW5lQ291bnQgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSAxNDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMTEyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnRleHRXcmFwcGluZyA9IHJlYWRlci5ib29sKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgMTU6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDEyNSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zaGFkb3dCbHVyID0gcmVhZGVyLmZsb2F0KCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgMTY6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDEzMykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zaGFkb3dPZmZzZXRYID0gcmVhZGVyLmZsb2F0KCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgMTc6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDE0MSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zaGFkb3dPZmZzZXRZID0gcmVhZGVyLmZsb2F0KCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgMTg6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDE0OSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5vdXRsaW5lV2lkdGggPSByZWFkZXIuZmxvYXQoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSAxOTpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMTU0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnNoYWRvd0NvbG9yID0gQ29sb3IzLmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgMjA6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDE2Mikge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5vdXRsaW5lQ29sb3IgPSBDb2xvcjMuZGVjb2RlKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSAyMTpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMTcwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnRleHRDb2xvciA9IENvbG9yNC5kZWNvZGUocmVhZGVyLCByZWFkZXIudWludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgodGFnICYgNykgPT09IDQgfHwgdGFnID09PSAwKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIFBCVGV4dFNoYXBlLmRlY29kZSA9IGRlY29kZTtcbn0pKFBCVGV4dFNoYXBlIHx8IChQQlRleHRTaGFwZSA9IHt9KSk7XG4iLCAiaW1wb3J0IHsgUEJUZXh0U2hhcGUgfSBmcm9tICcuL3BiL2RlY2VudHJhbGFuZC9zZGsvY29tcG9uZW50cy90ZXh0X3NoYXBlLmdlbic7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgVGV4dFNoYXBlU2NoZW1hID0ge1xuICAgIENPTVBPTkVOVF9JRDogMTAzMCxcbiAgICBzZXJpYWxpemUodmFsdWUsIGJ1aWxkZXIpIHtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gUEJUZXh0U2hhcGUuZW5jb2RlKHZhbHVlKTtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkod3JpdGVyLmZpbmlzaCgpLCAwLCB3cml0ZXIubGVuKTtcbiAgICAgICAgYnVpbGRlci53cml0ZUJ1ZmZlcihidWZmZXIsIGZhbHNlKTtcbiAgICB9LFxuICAgIGRlc2VyaWFsaXplKHJlYWRlcikge1xuICAgICAgICByZXR1cm4gUEJUZXh0U2hhcGUuZGVjb2RlKHJlYWRlci5idWZmZXIoKSwgcmVhZGVyLnJlbWFpbmluZ0J5dGVzKCkpO1xuICAgIH0sXG4gICAgY3JlYXRlKCkge1xuICAgICAgICAvLyBUT0RPOiB0aGlzIGlzIGEgaGFjay5cbiAgICAgICAgcmV0dXJuIFBCVGV4dFNoYXBlLmRlY29kZShuZXcgVWludDhBcnJheSgpKTtcbiAgICB9LFxuICAgIGpzb25TY2hlbWE6IHtcbiAgICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgICAgcHJvcGVydGllczoge30sXG4gICAgICAgIHNlcmlhbGl6YXRpb25UeXBlOiBcInByb3RvY29sLWJ1ZmZlclwiLFxuICAgICAgICBwcm90b2NvbEJ1ZmZlcjogXCJQQlRleHRTaGFwZVwiXG4gICAgfVxufTtcbiIsICIvKiBlc2xpbnQtZGlzYWJsZSAqL1xuaW1wb3J0IF9tMCBmcm9tIFwicHJvdG9idWZqcy9taW5pbWFsXCI7XG5pbXBvcnQgeyBRdWF0ZXJuaW9uLCBWZWN0b3IzIH0gZnJvbSBcIi4uLy4uL2NvbW1vbi92ZWN0b3JzLmdlblwiO1xuY29uc3QgcHJvdG9idWZQYWNrYWdlU2FyYXNhID0gXCJkZWNlbnRyYWxhbmQuc2RrLmNvbXBvbmVudHNcIjtcbi8qKlxuICogSW1wbGVtZW50YXRpb24gZ3VpZGVsaW5lcyBmb3IgdGhlc2UgZWFzaW5nIGZ1bmN0aW9ucyBjYW4gYmUgZm91bmRcbiAqIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9haS9lYXNpbmdzLm5ldC9ibG9iLzZmY2Q1Zjg1MmE0NzBiZjFhNzg5MGU4MTc4YWZhMGY0NzFkNWYyZWMvc3JjL2Vhc2luZ3MvZWFzaW5nc0Z1bmN0aW9ucy50c1xuICovXG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHZhciBFYXNpbmdGdW5jdGlvbjtcbihmdW5jdGlvbiAoRWFzaW5nRnVuY3Rpb24pIHtcbiAgICAvKiogRUZfTElORUFSIC0gZGVmYXVsdCAqL1xuICAgIEVhc2luZ0Z1bmN0aW9uW0Vhc2luZ0Z1bmN0aW9uW1wiRUZfTElORUFSXCJdID0gMF0gPSBcIkVGX0xJTkVBUlwiO1xuICAgIEVhc2luZ0Z1bmN0aW9uW0Vhc2luZ0Z1bmN0aW9uW1wiRUZfRUFTRUlOUVVBRFwiXSA9IDFdID0gXCJFRl9FQVNFSU5RVUFEXCI7XG4gICAgRWFzaW5nRnVuY3Rpb25bRWFzaW5nRnVuY3Rpb25bXCJFRl9FQVNFT1VUUVVBRFwiXSA9IDJdID0gXCJFRl9FQVNFT1VUUVVBRFwiO1xuICAgIEVhc2luZ0Z1bmN0aW9uW0Vhc2luZ0Z1bmN0aW9uW1wiRUZfRUFTRVFVQURcIl0gPSAzXSA9IFwiRUZfRUFTRVFVQURcIjtcbiAgICBFYXNpbmdGdW5jdGlvbltFYXNpbmdGdW5jdGlvbltcIkVGX0VBU0VJTlNJTkVcIl0gPSA0XSA9IFwiRUZfRUFTRUlOU0lORVwiO1xuICAgIEVhc2luZ0Z1bmN0aW9uW0Vhc2luZ0Z1bmN0aW9uW1wiRUZfRUFTRU9VVFNJTkVcIl0gPSA1XSA9IFwiRUZfRUFTRU9VVFNJTkVcIjtcbiAgICBFYXNpbmdGdW5jdGlvbltFYXNpbmdGdW5jdGlvbltcIkVGX0VBU0VTSU5FXCJdID0gNl0gPSBcIkVGX0VBU0VTSU5FXCI7XG4gICAgRWFzaW5nRnVuY3Rpb25bRWFzaW5nRnVuY3Rpb25bXCJFRl9FQVNFSU5FWFBPXCJdID0gN10gPSBcIkVGX0VBU0VJTkVYUE9cIjtcbiAgICBFYXNpbmdGdW5jdGlvbltFYXNpbmdGdW5jdGlvbltcIkVGX0VBU0VPVVRFWFBPXCJdID0gOF0gPSBcIkVGX0VBU0VPVVRFWFBPXCI7XG4gICAgRWFzaW5nRnVuY3Rpb25bRWFzaW5nRnVuY3Rpb25bXCJFRl9FQVNFRVhQT1wiXSA9IDldID0gXCJFRl9FQVNFRVhQT1wiO1xuICAgIEVhc2luZ0Z1bmN0aW9uW0Vhc2luZ0Z1bmN0aW9uW1wiRUZfRUFTRUlORUxBU1RJQ1wiXSA9IDEwXSA9IFwiRUZfRUFTRUlORUxBU1RJQ1wiO1xuICAgIEVhc2luZ0Z1bmN0aW9uW0Vhc2luZ0Z1bmN0aW9uW1wiRUZfRUFTRU9VVEVMQVNUSUNcIl0gPSAxMV0gPSBcIkVGX0VBU0VPVVRFTEFTVElDXCI7XG4gICAgRWFzaW5nRnVuY3Rpb25bRWFzaW5nRnVuY3Rpb25bXCJFRl9FQVNFRUxBU1RJQ1wiXSA9IDEyXSA9IFwiRUZfRUFTRUVMQVNUSUNcIjtcbiAgICBFYXNpbmdGdW5jdGlvbltFYXNpbmdGdW5jdGlvbltcIkVGX0VBU0VJTkJPVU5DRVwiXSA9IDEzXSA9IFwiRUZfRUFTRUlOQk9VTkNFXCI7XG4gICAgRWFzaW5nRnVuY3Rpb25bRWFzaW5nRnVuY3Rpb25bXCJFRl9FQVNFT1VUQk9VTkNFXCJdID0gMTRdID0gXCJFRl9FQVNFT1VUQk9VTkNFXCI7XG4gICAgRWFzaW5nRnVuY3Rpb25bRWFzaW5nRnVuY3Rpb25bXCJFRl9FQVNFQk9VTkNFXCJdID0gMTVdID0gXCJFRl9FQVNFQk9VTkNFXCI7XG4gICAgRWFzaW5nRnVuY3Rpb25bRWFzaW5nRnVuY3Rpb25bXCJFRl9FQVNFSU5DVUJJQ1wiXSA9IDE2XSA9IFwiRUZfRUFTRUlOQ1VCSUNcIjtcbiAgICBFYXNpbmdGdW5jdGlvbltFYXNpbmdGdW5jdGlvbltcIkVGX0VBU0VPVVRDVUJJQ1wiXSA9IDE3XSA9IFwiRUZfRUFTRU9VVENVQklDXCI7XG4gICAgRWFzaW5nRnVuY3Rpb25bRWFzaW5nRnVuY3Rpb25bXCJFRl9FQVNFQ1VCSUNcIl0gPSAxOF0gPSBcIkVGX0VBU0VDVUJJQ1wiO1xuICAgIEVhc2luZ0Z1bmN0aW9uW0Vhc2luZ0Z1bmN0aW9uW1wiRUZfRUFTRUlOUVVBUlRcIl0gPSAxOV0gPSBcIkVGX0VBU0VJTlFVQVJUXCI7XG4gICAgRWFzaW5nRnVuY3Rpb25bRWFzaW5nRnVuY3Rpb25bXCJFRl9FQVNFT1VUUVVBUlRcIl0gPSAyMF0gPSBcIkVGX0VBU0VPVVRRVUFSVFwiO1xuICAgIEVhc2luZ0Z1bmN0aW9uW0Vhc2luZ0Z1bmN0aW9uW1wiRUZfRUFTRVFVQVJUXCJdID0gMjFdID0gXCJFRl9FQVNFUVVBUlRcIjtcbiAgICBFYXNpbmdGdW5jdGlvbltFYXNpbmdGdW5jdGlvbltcIkVGX0VBU0VJTlFVSU5UXCJdID0gMjJdID0gXCJFRl9FQVNFSU5RVUlOVFwiO1xuICAgIEVhc2luZ0Z1bmN0aW9uW0Vhc2luZ0Z1bmN0aW9uW1wiRUZfRUFTRU9VVFFVSU5UXCJdID0gMjNdID0gXCJFRl9FQVNFT1VUUVVJTlRcIjtcbiAgICBFYXNpbmdGdW5jdGlvbltFYXNpbmdGdW5jdGlvbltcIkVGX0VBU0VRVUlOVFwiXSA9IDI0XSA9IFwiRUZfRUFTRVFVSU5UXCI7XG4gICAgRWFzaW5nRnVuY3Rpb25bRWFzaW5nRnVuY3Rpb25bXCJFRl9FQVNFSU5DSVJDXCJdID0gMjVdID0gXCJFRl9FQVNFSU5DSVJDXCI7XG4gICAgRWFzaW5nRnVuY3Rpb25bRWFzaW5nRnVuY3Rpb25bXCJFRl9FQVNFT1VUQ0lSQ1wiXSA9IDI2XSA9IFwiRUZfRUFTRU9VVENJUkNcIjtcbiAgICBFYXNpbmdGdW5jdGlvbltFYXNpbmdGdW5jdGlvbltcIkVGX0VBU0VDSVJDXCJdID0gMjddID0gXCJFRl9FQVNFQ0lSQ1wiO1xuICAgIEVhc2luZ0Z1bmN0aW9uW0Vhc2luZ0Z1bmN0aW9uW1wiRUZfRUFTRUlOQkFDS1wiXSA9IDI4XSA9IFwiRUZfRUFTRUlOQkFDS1wiO1xuICAgIEVhc2luZ0Z1bmN0aW9uW0Vhc2luZ0Z1bmN0aW9uW1wiRUZfRUFTRU9VVEJBQ0tcIl0gPSAyOV0gPSBcIkVGX0VBU0VPVVRCQUNLXCI7XG4gICAgRWFzaW5nRnVuY3Rpb25bRWFzaW5nRnVuY3Rpb25bXCJFRl9FQVNFQkFDS1wiXSA9IDMwXSA9IFwiRUZfRUFTRUJBQ0tcIjtcbn0pKEVhc2luZ0Z1bmN0aW9uIHx8IChFYXNpbmdGdW5jdGlvbiA9IHt9KSk7XG5mdW5jdGlvbiBjcmVhdGVCYXNlUEJUd2VlbigpIHtcbiAgICByZXR1cm4geyBkdXJhdGlvbjogMCwgZWFzaW5nRnVuY3Rpb246IDAsIG1vZGU6IHVuZGVmaW5lZCwgcGxheWluZzogdW5kZWZpbmVkLCBjdXJyZW50VGltZTogdW5kZWZpbmVkIH07XG59XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHZhciBQQlR3ZWVuO1xuKGZ1bmN0aW9uIChQQlR3ZWVuKSB7XG4gICAgZnVuY3Rpb24gZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IF9tMC5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UuZHVyYXRpb24gIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTMpLmZsb2F0KG1lc3NhZ2UuZHVyYXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmVhc2luZ0Z1bmN0aW9uICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE2KS5pbnQzMihtZXNzYWdlLmVhc2luZ0Z1bmN0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBzd2l0Y2ggKG1lc3NhZ2UubW9kZT8uJGNhc2UpIHtcbiAgICAgICAgICAgIGNhc2UgXCJtb3ZlXCI6XG4gICAgICAgICAgICAgICAgTW92ZS5lbmNvZGUobWVzc2FnZS5tb2RlLm1vdmUsIHdyaXRlci51aW50MzIoMjYpLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwicm90YXRlXCI6XG4gICAgICAgICAgICAgICAgUm90YXRlLmVuY29kZShtZXNzYWdlLm1vZGUucm90YXRlLCB3cml0ZXIudWludDMyKDM0KS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcInNjYWxlXCI6XG4gICAgICAgICAgICAgICAgU2NhbGUuZW5jb2RlKG1lc3NhZ2UubW9kZS5zY2FsZSwgd3JpdGVyLnVpbnQzMig0MikuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5wbGF5aW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNDgpLmJvb2wobWVzc2FnZS5wbGF5aW5nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5jdXJyZW50VGltZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDYxKS5mbG9hdChtZXNzYWdlLmN1cnJlbnRUaW1lKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbiAgICBQQlR3ZWVuLmVuY29kZSA9IGVuY29kZTtcbiAgICBmdW5jdGlvbiBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIF9tMC5SZWFkZXIgPyBpbnB1dCA6IF9tMC5SZWFkZXIuY3JlYXRlKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlUEJUd2VlbigpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDEzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmR1cmF0aW9uID0gcmVhZGVyLmZsb2F0KCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMTYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZWFzaW5nRnVuY3Rpb24gPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSAyNikge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5tb2RlID0geyAkY2FzZTogXCJtb3ZlXCIsIG1vdmU6IE1vdmUuZGVjb2RlKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpKSB9O1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDM0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm1vZGUgPSB7ICRjYXNlOiBcInJvdGF0ZVwiLCByb3RhdGU6IFJvdGF0ZS5kZWNvZGUocmVhZGVyLCByZWFkZXIudWludDMyKCkpIH07XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gNDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubW9kZSA9IHsgJGNhc2U6IFwic2NhbGVcIiwgc2NhbGU6IFNjYWxlLmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSkgfTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSA0OCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5wbGF5aW5nID0gcmVhZGVyLmJvb2woKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSA2MSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5jdXJyZW50VGltZSA9IHJlYWRlci5mbG9hdCgpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgodGFnICYgNykgPT09IDQgfHwgdGFnID09PSAwKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIFBCVHdlZW4uZGVjb2RlID0gZGVjb2RlO1xufSkoUEJUd2VlbiB8fCAoUEJUd2VlbiA9IHt9KSk7XG5mdW5jdGlvbiBjcmVhdGVCYXNlTW92ZSgpIHtcbiAgICByZXR1cm4geyBzdGFydDogdW5kZWZpbmVkLCBlbmQ6IHVuZGVmaW5lZCwgZmFjZURpcmVjdGlvbjogdW5kZWZpbmVkIH07XG59XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHZhciBNb3ZlO1xuKGZ1bmN0aW9uIChNb3ZlKSB7XG4gICAgZnVuY3Rpb24gZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IF9tMC5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2Uuc3RhcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgVmVjdG9yMy5lbmNvZGUobWVzc2FnZS5zdGFydCwgd3JpdGVyLnVpbnQzMigxMCkuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5lbmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgVmVjdG9yMy5lbmNvZGUobWVzc2FnZS5lbmQsIHdyaXRlci51aW50MzIoMTgpLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuZmFjZURpcmVjdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDI0KS5ib29sKG1lc3NhZ2UuZmFjZURpcmVjdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9XG4gICAgTW92ZS5lbmNvZGUgPSBlbmNvZGU7XG4gICAgZnVuY3Rpb24gZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBfbTAuUmVhZGVyID8gaW5wdXQgOiBfbTAuUmVhZGVyLmNyZWF0ZShpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZU1vdmUoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSAxMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zdGFydCA9IFZlY3RvcjMuZGVjb2RlKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSAxOCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5lbmQgPSBWZWN0b3IzLmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMjQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZmFjZURpcmVjdGlvbiA9IHJlYWRlci5ib29sKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCh0YWcgJiA3KSA9PT0gNCB8fCB0YWcgPT09IDApIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgTW92ZS5kZWNvZGUgPSBkZWNvZGU7XG59KShNb3ZlIHx8IChNb3ZlID0ge30pKTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VSb3RhdGUoKSB7XG4gICAgcmV0dXJuIHsgc3RhcnQ6IHVuZGVmaW5lZCwgZW5kOiB1bmRlZmluZWQgfTtcbn1cbi8qKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdmFyIFJvdGF0ZTtcbihmdW5jdGlvbiAoUm90YXRlKSB7XG4gICAgZnVuY3Rpb24gZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IF9tMC5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2Uuc3RhcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgUXVhdGVybmlvbi5lbmNvZGUobWVzc2FnZS5zdGFydCwgd3JpdGVyLnVpbnQzMigxMCkuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5lbmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgUXVhdGVybmlvbi5lbmNvZGUobWVzc2FnZS5lbmQsIHdyaXRlci51aW50MzIoMTgpLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9XG4gICAgUm90YXRlLmVuY29kZSA9IGVuY29kZTtcbiAgICBmdW5jdGlvbiBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIF9tMC5SZWFkZXIgPyBpbnB1dCA6IF9tMC5SZWFkZXIuY3JlYXRlKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlUm90YXRlKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMTApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc3RhcnQgPSBRdWF0ZXJuaW9uLmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMTgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZW5kID0gUXVhdGVybmlvbi5kZWNvZGUocmVhZGVyLCByZWFkZXIudWludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgodGFnICYgNykgPT09IDQgfHwgdGFnID09PSAwKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIFJvdGF0ZS5kZWNvZGUgPSBkZWNvZGU7XG59KShSb3RhdGUgfHwgKFJvdGF0ZSA9IHt9KSk7XG5mdW5jdGlvbiBjcmVhdGVCYXNlU2NhbGUoKSB7XG4gICAgcmV0dXJuIHsgc3RhcnQ6IHVuZGVmaW5lZCwgZW5kOiB1bmRlZmluZWQgfTtcbn1cbi8qKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdmFyIFNjYWxlO1xuKGZ1bmN0aW9uIChTY2FsZSkge1xuICAgIGZ1bmN0aW9uIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBfbTAuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLnN0YXJ0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIFZlY3RvcjMuZW5jb2RlKG1lc3NhZ2Uuc3RhcnQsIHdyaXRlci51aW50MzIoMTApLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuZW5kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIFZlY3RvcjMuZW5jb2RlKG1lc3NhZ2UuZW5kLCB3cml0ZXIudWludDMyKDE4KS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxuICAgIFNjYWxlLmVuY29kZSA9IGVuY29kZTtcbiAgICBmdW5jdGlvbiBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIF9tMC5SZWFkZXIgPyBpbnB1dCA6IF9tMC5SZWFkZXIuY3JlYXRlKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlU2NhbGUoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSAxMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zdGFydCA9IFZlY3RvcjMuZGVjb2RlKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSAxOCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5lbmQgPSBWZWN0b3IzLmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCh0YWcgJiA3KSA9PT0gNCB8fCB0YWcgPT09IDApIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgU2NhbGUuZGVjb2RlID0gZGVjb2RlO1xufSkoU2NhbGUgfHwgKFNjYWxlID0ge30pKTtcbiIsICJpbXBvcnQgeyBQQlR3ZWVuIH0gZnJvbSAnLi9wYi9kZWNlbnRyYWxhbmQvc2RrL2NvbXBvbmVudHMvdHdlZW4uZ2VuJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBUd2VlblNjaGVtYSA9IHtcbiAgICBDT01QT05FTlRfSUQ6IDExMDIsXG4gICAgc2VyaWFsaXplKHZhbHVlLCBidWlsZGVyKSB7XG4gICAgICAgIGNvbnN0IHdyaXRlciA9IFBCVHdlZW4uZW5jb2RlKHZhbHVlKTtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkod3JpdGVyLmZpbmlzaCgpLCAwLCB3cml0ZXIubGVuKTtcbiAgICAgICAgYnVpbGRlci53cml0ZUJ1ZmZlcihidWZmZXIsIGZhbHNlKTtcbiAgICB9LFxuICAgIGRlc2VyaWFsaXplKHJlYWRlcikge1xuICAgICAgICByZXR1cm4gUEJUd2Vlbi5kZWNvZGUocmVhZGVyLmJ1ZmZlcigpLCByZWFkZXIucmVtYWluaW5nQnl0ZXMoKSk7XG4gICAgfSxcbiAgICBjcmVhdGUoKSB7XG4gICAgICAgIC8vIFRPRE86IHRoaXMgaXMgYSBoYWNrLlxuICAgICAgICByZXR1cm4gUEJUd2Vlbi5kZWNvZGUobmV3IFVpbnQ4QXJyYXkoKSk7XG4gICAgfSxcbiAgICBqc29uU2NoZW1hOiB7XG4gICAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgIHByb3BlcnRpZXM6IHt9LFxuICAgICAgICBzZXJpYWxpemF0aW9uVHlwZTogXCJwcm90b2NvbC1idWZmZXJcIixcbiAgICAgICAgcHJvdG9jb2xCdWZmZXI6IFwiUEJUd2VlblwiXG4gICAgfVxufTtcbiIsICIvKiBlc2xpbnQtZGlzYWJsZSAqL1xuaW1wb3J0IF9tMCBmcm9tIFwicHJvdG9idWZqcy9taW5pbWFsXCI7XG5pbXBvcnQgeyBQQlR3ZWVuIH0gZnJvbSBcIi4vdHdlZW4uZ2VuXCI7XG5jb25zdCBwcm90b2J1ZlBhY2thZ2VTYXJhc2EgPSBcImRlY2VudHJhbGFuZC5zZGsuY29tcG9uZW50c1wiO1xuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB2YXIgVHdlZW5Mb29wO1xuKGZ1bmN0aW9uIChUd2Vlbkxvb3ApIHtcbiAgICBUd2Vlbkxvb3BbVHdlZW5Mb29wW1wiVExfUkVTVEFSVFwiXSA9IDBdID0gXCJUTF9SRVNUQVJUXCI7XG4gICAgVHdlZW5Mb29wW1R3ZWVuTG9vcFtcIlRMX1lPWU9cIl0gPSAxXSA9IFwiVExfWU9ZT1wiO1xufSkoVHdlZW5Mb29wIHx8IChUd2Vlbkxvb3AgPSB7fSkpO1xuZnVuY3Rpb24gY3JlYXRlQmFzZVBCVHdlZW5TZXF1ZW5jZSgpIHtcbiAgICByZXR1cm4geyBzZXF1ZW5jZTogW10sIGxvb3A6IHVuZGVmaW5lZCB9O1xufVxuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB2YXIgUEJUd2VlblNlcXVlbmNlO1xuKGZ1bmN0aW9uIChQQlR3ZWVuU2VxdWVuY2UpIHtcbiAgICBmdW5jdGlvbiBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gX20wLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBmb3IgKGNvbnN0IHYgb2YgbWVzc2FnZS5zZXF1ZW5jZSkge1xuICAgICAgICAgICAgUEJUd2Vlbi5lbmNvZGUodiwgd3JpdGVyLnVpbnQzMigxMCkuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5sb29wICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTYpLmludDMyKG1lc3NhZ2UubG9vcCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9XG4gICAgUEJUd2VlblNlcXVlbmNlLmVuY29kZSA9IGVuY29kZTtcbiAgICBmdW5jdGlvbiBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIF9tMC5SZWFkZXIgPyBpbnB1dCA6IF9tMC5SZWFkZXIuY3JlYXRlKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlUEJUd2VlblNlcXVlbmNlKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMTApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2VxdWVuY2UucHVzaChQQlR3ZWVuLmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSkpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDE2KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmxvb3AgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKHRhZyAmIDcpID09PSA0IHx8IHRhZyA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBQQlR3ZWVuU2VxdWVuY2UuZGVjb2RlID0gZGVjb2RlO1xufSkoUEJUd2VlblNlcXVlbmNlIHx8IChQQlR3ZWVuU2VxdWVuY2UgPSB7fSkpO1xuIiwgImltcG9ydCB7IFBCVHdlZW5TZXF1ZW5jZSB9IGZyb20gJy4vcGIvZGVjZW50cmFsYW5kL3Nkay9jb21wb25lbnRzL3R3ZWVuX3NlcXVlbmNlLmdlbic7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgVHdlZW5TZXF1ZW5jZVNjaGVtYSA9IHtcbiAgICBDT01QT05FTlRfSUQ6IDExMDQsXG4gICAgc2VyaWFsaXplKHZhbHVlLCBidWlsZGVyKSB7XG4gICAgICAgIGNvbnN0IHdyaXRlciA9IFBCVHdlZW5TZXF1ZW5jZS5lbmNvZGUodmFsdWUpO1xuICAgICAgICBjb25zdCBidWZmZXIgPSBuZXcgVWludDhBcnJheSh3cml0ZXIuZmluaXNoKCksIDAsIHdyaXRlci5sZW4pO1xuICAgICAgICBidWlsZGVyLndyaXRlQnVmZmVyKGJ1ZmZlciwgZmFsc2UpO1xuICAgIH0sXG4gICAgZGVzZXJpYWxpemUocmVhZGVyKSB7XG4gICAgICAgIHJldHVybiBQQlR3ZWVuU2VxdWVuY2UuZGVjb2RlKHJlYWRlci5idWZmZXIoKSwgcmVhZGVyLnJlbWFpbmluZ0J5dGVzKCkpO1xuICAgIH0sXG4gICAgY3JlYXRlKCkge1xuICAgICAgICAvLyBUT0RPOiB0aGlzIGlzIGEgaGFjay5cbiAgICAgICAgcmV0dXJuIFBCVHdlZW5TZXF1ZW5jZS5kZWNvZGUobmV3IFVpbnQ4QXJyYXkoKSk7XG4gICAgfSxcbiAgICBqc29uU2NoZW1hOiB7XG4gICAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgIHByb3BlcnRpZXM6IHt9LFxuICAgICAgICBzZXJpYWxpemF0aW9uVHlwZTogXCJwcm90b2NvbC1idWZmZXJcIixcbiAgICAgICAgcHJvdG9jb2xCdWZmZXI6IFwiUEJUd2VlblNlcXVlbmNlXCJcbiAgICB9XG59O1xuIiwgIi8qIGVzbGludC1kaXNhYmxlICovXG5pbXBvcnQgX20wIGZyb20gXCJwcm90b2J1ZmpzL21pbmltYWxcIjtcbmNvbnN0IHByb3RvYnVmUGFja2FnZVNhcmFzYSA9IFwiZGVjZW50cmFsYW5kLnNkay5jb21wb25lbnRzXCI7XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHZhciBUd2VlblN0YXRlU3RhdHVzO1xuKGZ1bmN0aW9uIChUd2VlblN0YXRlU3RhdHVzKSB7XG4gICAgVHdlZW5TdGF0ZVN0YXR1c1tUd2VlblN0YXRlU3RhdHVzW1wiVFNfQUNUSVZFXCJdID0gMF0gPSBcIlRTX0FDVElWRVwiO1xuICAgIFR3ZWVuU3RhdGVTdGF0dXNbVHdlZW5TdGF0ZVN0YXR1c1tcIlRTX0NPTVBMRVRFRFwiXSA9IDFdID0gXCJUU19DT01QTEVURURcIjtcbiAgICBUd2VlblN0YXRlU3RhdHVzW1R3ZWVuU3RhdGVTdGF0dXNbXCJUU19QQVVTRURcIl0gPSAyXSA9IFwiVFNfUEFVU0VEXCI7XG59KShUd2VlblN0YXRlU3RhdHVzIHx8IChUd2VlblN0YXRlU3RhdHVzID0ge30pKTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VQQlR3ZWVuU3RhdGUoKSB7XG4gICAgcmV0dXJuIHsgc3RhdGU6IDAsIGN1cnJlbnRUaW1lOiAwIH07XG59XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHZhciBQQlR3ZWVuU3RhdGU7XG4oZnVuY3Rpb24gKFBCVHdlZW5TdGF0ZSkge1xuICAgIGZ1bmN0aW9uIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBfbTAuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLnN0YXRlICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgpLmludDMyKG1lc3NhZ2Uuc3RhdGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmN1cnJlbnRUaW1lICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDIxKS5mbG9hdChtZXNzYWdlLmN1cnJlbnRUaW1lKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbiAgICBQQlR3ZWVuU3RhdGUuZW5jb2RlID0gZW5jb2RlO1xuICAgIGZ1bmN0aW9uIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgX20wLlJlYWRlciA/IGlucHV0IDogX20wLlJlYWRlci5jcmVhdGUoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VQQlR3ZWVuU3RhdGUoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSA4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnN0YXRlID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMjEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuY3VycmVudFRpbWUgPSByZWFkZXIuZmxvYXQoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKHRhZyAmIDcpID09PSA0IHx8IHRhZyA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBQQlR3ZWVuU3RhdGUuZGVjb2RlID0gZGVjb2RlO1xufSkoUEJUd2VlblN0YXRlIHx8IChQQlR3ZWVuU3RhdGUgPSB7fSkpO1xuIiwgImltcG9ydCB7IFBCVHdlZW5TdGF0ZSB9IGZyb20gJy4vcGIvZGVjZW50cmFsYW5kL3Nkay9jb21wb25lbnRzL3R3ZWVuX3N0YXRlLmdlbic7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgVHdlZW5TdGF0ZVNjaGVtYSA9IHtcbiAgICBDT01QT05FTlRfSUQ6IDExMDMsXG4gICAgc2VyaWFsaXplKHZhbHVlLCBidWlsZGVyKSB7XG4gICAgICAgIGNvbnN0IHdyaXRlciA9IFBCVHdlZW5TdGF0ZS5lbmNvZGUodmFsdWUpO1xuICAgICAgICBjb25zdCBidWZmZXIgPSBuZXcgVWludDhBcnJheSh3cml0ZXIuZmluaXNoKCksIDAsIHdyaXRlci5sZW4pO1xuICAgICAgICBidWlsZGVyLndyaXRlQnVmZmVyKGJ1ZmZlciwgZmFsc2UpO1xuICAgIH0sXG4gICAgZGVzZXJpYWxpemUocmVhZGVyKSB7XG4gICAgICAgIHJldHVybiBQQlR3ZWVuU3RhdGUuZGVjb2RlKHJlYWRlci5idWZmZXIoKSwgcmVhZGVyLnJlbWFpbmluZ0J5dGVzKCkpO1xuICAgIH0sXG4gICAgY3JlYXRlKCkge1xuICAgICAgICAvLyBUT0RPOiB0aGlzIGlzIGEgaGFjay5cbiAgICAgICAgcmV0dXJuIFBCVHdlZW5TdGF0ZS5kZWNvZGUobmV3IFVpbnQ4QXJyYXkoKSk7XG4gICAgfSxcbiAgICBqc29uU2NoZW1hOiB7XG4gICAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgIHByb3BlcnRpZXM6IHt9LFxuICAgICAgICBzZXJpYWxpemF0aW9uVHlwZTogXCJwcm90b2NvbC1idWZmZXJcIixcbiAgICAgICAgcHJvdG9jb2xCdWZmZXI6IFwiUEJUd2VlblN0YXRlXCJcbiAgICB9XG59O1xuIiwgIi8qIGVzbGludC1kaXNhYmxlICovXG5pbXBvcnQgX20wIGZyb20gXCJwcm90b2J1ZmpzL21pbmltYWxcIjtcbmltcG9ydCB7IEJvcmRlclJlY3QgfSBmcm9tIFwiLi4vLi4vY29tbW9uL2JvcmRlcl9yZWN0LmdlblwiO1xuaW1wb3J0IHsgQ29sb3I0IH0gZnJvbSBcIi4uLy4uL2NvbW1vbi9jb2xvcnMuZ2VuXCI7XG5pbXBvcnQgeyBUZXh0dXJlVW5pb24gfSBmcm9tIFwiLi4vLi4vY29tbW9uL3RleHR1cmUuZ2VuXCI7XG5jb25zdCBwcm90b2J1ZlBhY2thZ2VTYXJhc2EgPSBcImRlY2VudHJhbGFuZC5zZGsuY29tcG9uZW50c1wiO1xuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB2YXIgQmFja2dyb3VuZFRleHR1cmVNb2RlO1xuKGZ1bmN0aW9uIChCYWNrZ3JvdW5kVGV4dHVyZU1vZGUpIHtcbiAgICAvKipcbiAgICAgKiBOSU5FX1NMSUNFUyAtIGh0dHBzOi8vZG9jcy51bml0eTNkLmNvbS9NYW51YWwvVUlFLVVTUy1TdXBwb3J0ZWRQcm9wZXJ0aWVzLmh0bWwgKFNsaWNpbmcgc2VjdGlvbilcbiAgICAgKiBodHRwczovL2ZvcnVtLnVuaXR5LmNvbS90aHJlYWRzL2hvdy1kb2VzLXNsaWNpbmctaW4tdWktdG9va2tpdC13b3Jrcy4xMjM1ODYzL1xuICAgICAqIGh0dHBzOi8vZG9jcy51bml0eTNkLmNvbS9NYW51YWwvOVNsaWNlU3ByaXRlcy5odG1sXG4gICAgICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL2JvcmRlci1pbWFnZS1zbGljZVxuICAgICAqL1xuICAgIEJhY2tncm91bmRUZXh0dXJlTW9kZVtCYWNrZ3JvdW5kVGV4dHVyZU1vZGVbXCJOSU5FX1NMSUNFU1wiXSA9IDBdID0gXCJOSU5FX1NMSUNFU1wiO1xuICAgIC8qKlxuICAgICAqIENFTlRFUiAtIENFTlRFUiBlbmFibGVzIHRoZSB0ZXh0dXJlIHRvIGJlIHJlbmRlcmVkIGNlbnRlcmVkIGluIHJlbGF0aW9uIHRvIHRoZVxuICAgICAqIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IGlzIHNtYWxsZXIgdGhhbiB0aGUgdGV4dHVyZSB0aGVuIHRoZSBiYWNrZ3JvdW5kXG4gICAgICogc2hvdWxkIHVzZSB0aGUgZWxlbWVudCBhcyBzdGVuY2lsIHRvIGN1dCBvZmYgdGhlIG91dC1vZi1ib3VuZHMgYXJlYVxuICAgICAqL1xuICAgIEJhY2tncm91bmRUZXh0dXJlTW9kZVtCYWNrZ3JvdW5kVGV4dHVyZU1vZGVbXCJDRU5URVJcIl0gPSAxXSA9IFwiQ0VOVEVSXCI7XG4gICAgLyoqXG4gICAgICogU1RSRVRDSCAtIFNUUkVUQ0ggZW5hYmxlcyB0aGUgdGV4dHVyZSB0byBjb3ZlciBhbGwgdGhlIGFyZWEgb2YgdGhlIGNvbnRhaW5lcixcbiAgICAgKiBhZG9wdGluZyBpdHMgYXNwZWN0IHJhdGlvLlxuICAgICAqL1xuICAgIEJhY2tncm91bmRUZXh0dXJlTW9kZVtCYWNrZ3JvdW5kVGV4dHVyZU1vZGVbXCJTVFJFVENIXCJdID0gMl0gPSBcIlNUUkVUQ0hcIjtcbn0pKEJhY2tncm91bmRUZXh0dXJlTW9kZSB8fCAoQmFja2dyb3VuZFRleHR1cmVNb2RlID0ge30pKTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VQQlVpQmFja2dyb3VuZCgpIHtcbiAgICByZXR1cm4geyBjb2xvcjogdW5kZWZpbmVkLCB0ZXh0dXJlOiB1bmRlZmluZWQsIHRleHR1cmVNb2RlOiAwLCB0ZXh0dXJlU2xpY2VzOiB1bmRlZmluZWQsIHV2czogW10gfTtcbn1cbi8qKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdmFyIFBCVWlCYWNrZ3JvdW5kO1xuKGZ1bmN0aW9uIChQQlVpQmFja2dyb3VuZCkge1xuICAgIGZ1bmN0aW9uIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBfbTAuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLmNvbG9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIENvbG9yNC5lbmNvZGUobWVzc2FnZS5jb2xvciwgd3JpdGVyLnVpbnQzMigxMCkuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS50ZXh0dXJlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIFRleHR1cmVVbmlvbi5lbmNvZGUobWVzc2FnZS50ZXh0dXJlLCB3cml0ZXIudWludDMyKDE4KS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnRleHR1cmVNb2RlICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDI0KS5pbnQzMihtZXNzYWdlLnRleHR1cmVNb2RlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS50ZXh0dXJlU2xpY2VzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIEJvcmRlclJlY3QuZW5jb2RlKG1lc3NhZ2UudGV4dHVyZVNsaWNlcywgd3JpdGVyLnVpbnQzMigzNCkuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgfVxuICAgICAgICB3cml0ZXIudWludDMyKDQyKS5mb3JrKCk7XG4gICAgICAgIGZvciAoY29uc3QgdiBvZiBtZXNzYWdlLnV2cykge1xuICAgICAgICAgICAgd3JpdGVyLmZsb2F0KHYpO1xuICAgICAgICB9XG4gICAgICAgIHdyaXRlci5sZGVsaW0oKTtcbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9XG4gICAgUEJVaUJhY2tncm91bmQuZW5jb2RlID0gZW5jb2RlO1xuICAgIGZ1bmN0aW9uIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgX20wLlJlYWRlciA/IGlucHV0IDogX20wLlJlYWRlci5jcmVhdGUoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VQQlVpQmFja2dyb3VuZCgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDEwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmNvbG9yID0gQ29sb3I0LmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMTgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudGV4dHVyZSA9IFRleHR1cmVVbmlvbi5kZWNvZGUocmVhZGVyLCByZWFkZXIudWludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDI0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnRleHR1cmVNb2RlID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMzQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudGV4dHVyZVNsaWNlcyA9IEJvcmRlclJlY3QuZGVjb2RlKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnID09PSA0NSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS51dnMucHVzaChyZWFkZXIuZmxvYXQoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnID09PSA0Mikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5kMiA9IHJlYWRlci51aW50MzIoKSArIHJlYWRlci5wb3M7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnV2cy5wdXNoKHJlYWRlci5mbG9hdCgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCh0YWcgJiA3KSA9PT0gNCB8fCB0YWcgPT09IDApIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgUEJVaUJhY2tncm91bmQuZGVjb2RlID0gZGVjb2RlO1xufSkoUEJVaUJhY2tncm91bmQgfHwgKFBCVWlCYWNrZ3JvdW5kID0ge30pKTtcbiIsICIvKiBlc2xpbnQtZGlzYWJsZSAqL1xuaW1wb3J0IF9tMCBmcm9tIFwicHJvdG9idWZqcy9taW5pbWFsXCI7XG5jb25zdCBwcm90b2J1ZlBhY2thZ2VTYXJhc2EgPSBcImRlY2VudHJhbGFuZC5jb21tb25cIjtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VCb3JkZXJSZWN0KCkge1xuICAgIHJldHVybiB7IHRvcDogMCwgbGVmdDogMCwgcmlnaHQ6IDAsIGJvdHRvbTogMCB9O1xufVxuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB2YXIgQm9yZGVyUmVjdDtcbihmdW5jdGlvbiAoQm9yZGVyUmVjdCkge1xuICAgIGZ1bmN0aW9uIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBfbTAuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLnRvcCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxMykuZmxvYXQobWVzc2FnZS50b3ApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmxlZnQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMjEpLmZsb2F0KG1lc3NhZ2UubGVmdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UucmlnaHQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMjkpLmZsb2F0KG1lc3NhZ2UucmlnaHQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmJvdHRvbSAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigzNykuZmxvYXQobWVzc2FnZS5ib3R0b20pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxuICAgIEJvcmRlclJlY3QuZW5jb2RlID0gZW5jb2RlO1xuICAgIGZ1bmN0aW9uIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgX20wLlJlYWRlciA/IGlucHV0IDogX20wLlJlYWRlci5jcmVhdGUoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VCb3JkZXJSZWN0KCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMTMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudG9wID0gcmVhZGVyLmZsb2F0KCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMjEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubGVmdCA9IHJlYWRlci5mbG9hdCgpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDI5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnJpZ2h0ID0gcmVhZGVyLmZsb2F0KCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMzcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuYm90dG9tID0gcmVhZGVyLmZsb2F0KCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCh0YWcgJiA3KSA9PT0gNCB8fCB0YWcgPT09IDApIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgQm9yZGVyUmVjdC5kZWNvZGUgPSBkZWNvZGU7XG59KShCb3JkZXJSZWN0IHx8IChCb3JkZXJSZWN0ID0ge30pKTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VSZWN0KCkge1xuICAgIHJldHVybiB7IHg6IDAsIHk6IDAsIHdpZHRoOiAwLCBoZWlnaHQ6IDAgfTtcbn1cbi8qKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdmFyIFJlY3Q7XG4oZnVuY3Rpb24gKFJlY3QpIHtcbiAgICBmdW5jdGlvbiBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gX20wLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS54ICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDEzKS5mbG9hdChtZXNzYWdlLngpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnkgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMjEpLmZsb2F0KG1lc3NhZ2UueSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2Uud2lkdGggIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMjkpLmZsb2F0KG1lc3NhZ2Uud2lkdGgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmhlaWdodCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigzNykuZmxvYXQobWVzc2FnZS5oZWlnaHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxuICAgIFJlY3QuZW5jb2RlID0gZW5jb2RlO1xuICAgIGZ1bmN0aW9uIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgX20wLlJlYWRlciA/IGlucHV0IDogX20wLlJlYWRlci5jcmVhdGUoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VSZWN0KCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMTMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UueCA9IHJlYWRlci5mbG9hdCgpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDIxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnkgPSByZWFkZXIuZmxvYXQoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSAyOSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS53aWR0aCA9IHJlYWRlci5mbG9hdCgpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDM3KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmhlaWdodCA9IHJlYWRlci5mbG9hdCgpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgodGFnICYgNykgPT09IDQgfHwgdGFnID09PSAwKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIFJlY3QuZGVjb2RlID0gZGVjb2RlO1xufSkoUmVjdCB8fCAoUmVjdCA9IHt9KSk7XG4iLCAiaW1wb3J0IHsgUEJVaUJhY2tncm91bmQgfSBmcm9tICcuL3BiL2RlY2VudHJhbGFuZC9zZGsvY29tcG9uZW50cy91aV9iYWNrZ3JvdW5kLmdlbic7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgVWlCYWNrZ3JvdW5kU2NoZW1hID0ge1xuICAgIENPTVBPTkVOVF9JRDogMTA1MyxcbiAgICBzZXJpYWxpemUodmFsdWUsIGJ1aWxkZXIpIHtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gUEJVaUJhY2tncm91bmQuZW5jb2RlKHZhbHVlKTtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkod3JpdGVyLmZpbmlzaCgpLCAwLCB3cml0ZXIubGVuKTtcbiAgICAgICAgYnVpbGRlci53cml0ZUJ1ZmZlcihidWZmZXIsIGZhbHNlKTtcbiAgICB9LFxuICAgIGRlc2VyaWFsaXplKHJlYWRlcikge1xuICAgICAgICByZXR1cm4gUEJVaUJhY2tncm91bmQuZGVjb2RlKHJlYWRlci5idWZmZXIoKSwgcmVhZGVyLnJlbWFpbmluZ0J5dGVzKCkpO1xuICAgIH0sXG4gICAgY3JlYXRlKCkge1xuICAgICAgICAvLyBUT0RPOiB0aGlzIGlzIGEgaGFjay5cbiAgICAgICAgcmV0dXJuIFBCVWlCYWNrZ3JvdW5kLmRlY29kZShuZXcgVWludDhBcnJheSgpKTtcbiAgICB9LFxuICAgIGpzb25TY2hlbWE6IHtcbiAgICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgICAgcHJvcGVydGllczoge30sXG4gICAgICAgIHNlcmlhbGl6YXRpb25UeXBlOiBcInByb3RvY29sLWJ1ZmZlclwiLFxuICAgICAgICBwcm90b2NvbEJ1ZmZlcjogXCJQQlVpQmFja2dyb3VuZFwiXG4gICAgfVxufTtcbiIsICIvKiBlc2xpbnQtZGlzYWJsZSAqL1xuaW1wb3J0IF9tMCBmcm9tIFwicHJvdG9idWZqcy9taW5pbWFsXCI7XG5pbXBvcnQgeyBCb3JkZXJSZWN0IH0gZnJvbSBcIi4uLy4uL2NvbW1vbi9ib3JkZXJfcmVjdC5nZW5cIjtcbmNvbnN0IHByb3RvYnVmUGFja2FnZVNhcmFzYSA9IFwiZGVjZW50cmFsYW5kLnNkay5jb21wb25lbnRzXCI7XG5mdW5jdGlvbiBjcmVhdGVCYXNlUEJVaUNhbnZhc0luZm9ybWF0aW9uKCkge1xuICAgIHJldHVybiB7IGRldmljZVBpeGVsUmF0aW86IDAsIHdpZHRoOiAwLCBoZWlnaHQ6IDAsIGludGVyYWN0YWJsZUFyZWE6IHVuZGVmaW5lZCB9O1xufVxuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB2YXIgUEJVaUNhbnZhc0luZm9ybWF0aW9uO1xuKGZ1bmN0aW9uIChQQlVpQ2FudmFzSW5mb3JtYXRpb24pIHtcbiAgICBmdW5jdGlvbiBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gX20wLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5kZXZpY2VQaXhlbFJhdGlvICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDEzKS5mbG9hdChtZXNzYWdlLmRldmljZVBpeGVsUmF0aW8pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLndpZHRoICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE2KS5pbnQzMihtZXNzYWdlLndpZHRoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5oZWlnaHQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMjQpLmludDMyKG1lc3NhZ2UuaGVpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5pbnRlcmFjdGFibGVBcmVhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIEJvcmRlclJlY3QuZW5jb2RlKG1lc3NhZ2UuaW50ZXJhY3RhYmxlQXJlYSwgd3JpdGVyLnVpbnQzMigzNCkuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbiAgICBQQlVpQ2FudmFzSW5mb3JtYXRpb24uZW5jb2RlID0gZW5jb2RlO1xuICAgIGZ1bmN0aW9uIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgX20wLlJlYWRlciA/IGlucHV0IDogX20wLlJlYWRlci5jcmVhdGUoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VQQlVpQ2FudmFzSW5mb3JtYXRpb24oKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSAxMykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5kZXZpY2VQaXhlbFJhdGlvID0gcmVhZGVyLmZsb2F0KCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMTYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uud2lkdGggPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSAyNCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5oZWlnaHQgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSAzNCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5pbnRlcmFjdGFibGVBcmVhID0gQm9yZGVyUmVjdC5kZWNvZGUocmVhZGVyLCByZWFkZXIudWludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgodGFnICYgNykgPT09IDQgfHwgdGFnID09PSAwKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIFBCVWlDYW52YXNJbmZvcm1hdGlvbi5kZWNvZGUgPSBkZWNvZGU7XG59KShQQlVpQ2FudmFzSW5mb3JtYXRpb24gfHwgKFBCVWlDYW52YXNJbmZvcm1hdGlvbiA9IHt9KSk7XG4iLCAiaW1wb3J0IHsgUEJVaUNhbnZhc0luZm9ybWF0aW9uIH0gZnJvbSAnLi9wYi9kZWNlbnRyYWxhbmQvc2RrL2NvbXBvbmVudHMvdWlfY2FudmFzX2luZm9ybWF0aW9uLmdlbic7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgVWlDYW52YXNJbmZvcm1hdGlvblNjaGVtYSA9IHtcbiAgICBDT01QT05FTlRfSUQ6IDEwNTQsXG4gICAgc2VyaWFsaXplKHZhbHVlLCBidWlsZGVyKSB7XG4gICAgICAgIGNvbnN0IHdyaXRlciA9IFBCVWlDYW52YXNJbmZvcm1hdGlvbi5lbmNvZGUodmFsdWUpO1xuICAgICAgICBjb25zdCBidWZmZXIgPSBuZXcgVWludDhBcnJheSh3cml0ZXIuZmluaXNoKCksIDAsIHdyaXRlci5sZW4pO1xuICAgICAgICBidWlsZGVyLndyaXRlQnVmZmVyKGJ1ZmZlciwgZmFsc2UpO1xuICAgIH0sXG4gICAgZGVzZXJpYWxpemUocmVhZGVyKSB7XG4gICAgICAgIHJldHVybiBQQlVpQ2FudmFzSW5mb3JtYXRpb24uZGVjb2RlKHJlYWRlci5idWZmZXIoKSwgcmVhZGVyLnJlbWFpbmluZ0J5dGVzKCkpO1xuICAgIH0sXG4gICAgY3JlYXRlKCkge1xuICAgICAgICAvLyBUT0RPOiB0aGlzIGlzIGEgaGFjay5cbiAgICAgICAgcmV0dXJuIFBCVWlDYW52YXNJbmZvcm1hdGlvbi5kZWNvZGUobmV3IFVpbnQ4QXJyYXkoKSk7XG4gICAgfSxcbiAgICBqc29uU2NoZW1hOiB7XG4gICAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgIHByb3BlcnRpZXM6IHt9LFxuICAgICAgICBzZXJpYWxpemF0aW9uVHlwZTogXCJwcm90b2NvbC1idWZmZXJcIixcbiAgICAgICAgcHJvdG9jb2xCdWZmZXI6IFwiUEJVaUNhbnZhc0luZm9ybWF0aW9uXCJcbiAgICB9XG59O1xuIiwgIi8qIGVzbGludC1kaXNhYmxlICovXG5pbXBvcnQgX20wIGZyb20gXCJwcm90b2J1ZmpzL21pbmltYWxcIjtcbmltcG9ydCB7IENvbG9yNCB9IGZyb20gXCIuLi8uLi9jb21tb24vY29sb3JzLmdlblwiO1xuY29uc3QgcHJvdG9idWZQYWNrYWdlU2FyYXNhID0gXCJkZWNlbnRyYWxhbmQuc2RrLmNvbXBvbmVudHNcIjtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VQQlVpRHJvcGRvd24oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYWNjZXB0RW1wdHk6IGZhbHNlLFxuICAgICAgICBlbXB0eUxhYmVsOiB1bmRlZmluZWQsXG4gICAgICAgIG9wdGlvbnM6IFtdLFxuICAgICAgICBzZWxlY3RlZEluZGV4OiB1bmRlZmluZWQsXG4gICAgICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICAgICAgY29sb3I6IHVuZGVmaW5lZCxcbiAgICAgICAgdGV4dEFsaWduOiB1bmRlZmluZWQsXG4gICAgICAgIGZvbnQ6IHVuZGVmaW5lZCxcbiAgICAgICAgZm9udFNpemU6IHVuZGVmaW5lZCxcbiAgICB9O1xufVxuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB2YXIgUEJVaURyb3Bkb3duO1xuKGZ1bmN0aW9uIChQQlVpRHJvcGRvd24pIHtcbiAgICBmdW5jdGlvbiBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gX20wLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5hY2NlcHRFbXB0eSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS5ib29sKG1lc3NhZ2UuYWNjZXB0RW1wdHkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmVtcHR5TGFiZWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxOCkuc3RyaW5nKG1lc3NhZ2UuZW1wdHlMYWJlbCk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCB2IG9mIG1lc3NhZ2Uub3B0aW9ucykge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyNikuc3RyaW5nKHYpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnNlbGVjdGVkSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigzMikuaW50MzIobWVzc2FnZS5zZWxlY3RlZEluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5kaXNhYmxlZCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig0MCkuYm9vbChtZXNzYWdlLmRpc2FibGVkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5jb2xvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBDb2xvcjQuZW5jb2RlKG1lc3NhZ2UuY29sb3IsIHdyaXRlci51aW50MzIoNTApLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UudGV4dEFsaWduICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoODApLmludDMyKG1lc3NhZ2UudGV4dEFsaWduKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5mb250ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoODgpLmludDMyKG1lc3NhZ2UuZm9udCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuZm9udFNpemUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig5NikuaW50MzIobWVzc2FnZS5mb250U2l6ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9XG4gICAgUEJVaURyb3Bkb3duLmVuY29kZSA9IGVuY29kZTtcbiAgICBmdW5jdGlvbiBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIF9tMC5SZWFkZXIgPyBpbnB1dCA6IF9tMC5SZWFkZXIuY3JlYXRlKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlUEJVaURyb3Bkb3duKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gOCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5hY2NlcHRFbXB0eSA9IHJlYWRlci5ib29sKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMTgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZW1wdHlMYWJlbCA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSAyNikge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5vcHRpb25zLnB1c2gocmVhZGVyLnN0cmluZygpKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSAzMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zZWxlY3RlZEluZGV4ID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gNDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZGlzYWJsZWQgPSByZWFkZXIuYm9vbCgpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDUwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmNvbG9yID0gQ29sb3I0LmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDgwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnRleHRBbGlnbiA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDExOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSA4OCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5mb250ID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDk2KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmZvbnRTaXplID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCh0YWcgJiA3KSA9PT0gNCB8fCB0YWcgPT09IDApIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgUEJVaURyb3Bkb3duLmRlY29kZSA9IGRlY29kZTtcbn0pKFBCVWlEcm9wZG93biB8fCAoUEJVaURyb3Bkb3duID0ge30pKTtcbiIsICJpbXBvcnQgeyBQQlVpRHJvcGRvd24gfSBmcm9tICcuL3BiL2RlY2VudHJhbGFuZC9zZGsvY29tcG9uZW50cy91aV9kcm9wZG93bi5nZW4nO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFVpRHJvcGRvd25TY2hlbWEgPSB7XG4gICAgQ09NUE9ORU5UX0lEOiAxMDk0LFxuICAgIHNlcmlhbGl6ZSh2YWx1ZSwgYnVpbGRlcikge1xuICAgICAgICBjb25zdCB3cml0ZXIgPSBQQlVpRHJvcGRvd24uZW5jb2RlKHZhbHVlKTtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkod3JpdGVyLmZpbmlzaCgpLCAwLCB3cml0ZXIubGVuKTtcbiAgICAgICAgYnVpbGRlci53cml0ZUJ1ZmZlcihidWZmZXIsIGZhbHNlKTtcbiAgICB9LFxuICAgIGRlc2VyaWFsaXplKHJlYWRlcikge1xuICAgICAgICByZXR1cm4gUEJVaURyb3Bkb3duLmRlY29kZShyZWFkZXIuYnVmZmVyKCksIHJlYWRlci5yZW1haW5pbmdCeXRlcygpKTtcbiAgICB9LFxuICAgIGNyZWF0ZSgpIHtcbiAgICAgICAgLy8gVE9ETzogdGhpcyBpcyBhIGhhY2suXG4gICAgICAgIHJldHVybiBQQlVpRHJvcGRvd24uZGVjb2RlKG5ldyBVaW50OEFycmF5KCkpO1xuICAgIH0sXG4gICAganNvblNjaGVtYToge1xuICAgICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgICBwcm9wZXJ0aWVzOiB7fSxcbiAgICAgICAgc2VyaWFsaXphdGlvblR5cGU6IFwicHJvdG9jb2wtYnVmZmVyXCIsXG4gICAgICAgIHByb3RvY29sQnVmZmVyOiBcIlBCVWlEcm9wZG93blwiXG4gICAgfVxufTtcbiIsICIvKiBlc2xpbnQtZGlzYWJsZSAqL1xuaW1wb3J0IF9tMCBmcm9tIFwicHJvdG9idWZqcy9taW5pbWFsXCI7XG5jb25zdCBwcm90b2J1ZlBhY2thZ2VTYXJhc2EgPSBcImRlY2VudHJhbGFuZC5zZGsuY29tcG9uZW50c1wiO1xuZnVuY3Rpb24gY3JlYXRlQmFzZVBCVWlEcm9wZG93blJlc3VsdCgpIHtcbiAgICByZXR1cm4geyB2YWx1ZTogMCB9O1xufVxuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB2YXIgUEJVaURyb3Bkb3duUmVzdWx0O1xuKGZ1bmN0aW9uIChQQlVpRHJvcGRvd25SZXN1bHQpIHtcbiAgICBmdW5jdGlvbiBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gX20wLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS52YWx1ZSAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS5pbnQzMihtZXNzYWdlLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbiAgICBQQlVpRHJvcGRvd25SZXN1bHQuZW5jb2RlID0gZW5jb2RlO1xuICAgIGZ1bmN0aW9uIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgX20wLlJlYWRlciA/IGlucHV0IDogX20wLlJlYWRlci5jcmVhdGUoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VQQlVpRHJvcGRvd25SZXN1bHQoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSA4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnZhbHVlID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCh0YWcgJiA3KSA9PT0gNCB8fCB0YWcgPT09IDApIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgUEJVaURyb3Bkb3duUmVzdWx0LmRlY29kZSA9IGRlY29kZTtcbn0pKFBCVWlEcm9wZG93blJlc3VsdCB8fCAoUEJVaURyb3Bkb3duUmVzdWx0ID0ge30pKTtcbiIsICJpbXBvcnQgeyBQQlVpRHJvcGRvd25SZXN1bHQgfSBmcm9tICcuL3BiL2RlY2VudHJhbGFuZC9zZGsvY29tcG9uZW50cy91aV9kcm9wZG93bl9yZXN1bHQuZ2VuJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBVaURyb3Bkb3duUmVzdWx0U2NoZW1hID0ge1xuICAgIENPTVBPTkVOVF9JRDogMTA5NixcbiAgICBzZXJpYWxpemUodmFsdWUsIGJ1aWxkZXIpIHtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gUEJVaURyb3Bkb3duUmVzdWx0LmVuY29kZSh2YWx1ZSk7XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KHdyaXRlci5maW5pc2goKSwgMCwgd3JpdGVyLmxlbik7XG4gICAgICAgIGJ1aWxkZXIud3JpdGVCdWZmZXIoYnVmZmVyLCBmYWxzZSk7XG4gICAgfSxcbiAgICBkZXNlcmlhbGl6ZShyZWFkZXIpIHtcbiAgICAgICAgcmV0dXJuIFBCVWlEcm9wZG93blJlc3VsdC5kZWNvZGUocmVhZGVyLmJ1ZmZlcigpLCByZWFkZXIucmVtYWluaW5nQnl0ZXMoKSk7XG4gICAgfSxcbiAgICBjcmVhdGUoKSB7XG4gICAgICAgIC8vIFRPRE86IHRoaXMgaXMgYSBoYWNrLlxuICAgICAgICByZXR1cm4gUEJVaURyb3Bkb3duUmVzdWx0LmRlY29kZShuZXcgVWludDhBcnJheSgpKTtcbiAgICB9LFxuICAgIGpzb25TY2hlbWE6IHtcbiAgICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgICAgcHJvcGVydGllczoge30sXG4gICAgICAgIHNlcmlhbGl6YXRpb25UeXBlOiBcInByb3RvY29sLWJ1ZmZlclwiLFxuICAgICAgICBwcm90b2NvbEJ1ZmZlcjogXCJQQlVpRHJvcGRvd25SZXN1bHRcIlxuICAgIH1cbn07XG4iLCAiLyogZXNsaW50LWRpc2FibGUgKi9cbmltcG9ydCBfbTAgZnJvbSBcInByb3RvYnVmanMvbWluaW1hbFwiO1xuaW1wb3J0IHsgQ29sb3I0IH0gZnJvbSBcIi4uLy4uL2NvbW1vbi9jb2xvcnMuZ2VuXCI7XG5jb25zdCBwcm90b2J1ZlBhY2thZ2VTYXJhc2EgPSBcImRlY2VudHJhbGFuZC5zZGsuY29tcG9uZW50c1wiO1xuZnVuY3Rpb24gY3JlYXRlQmFzZVBCVWlJbnB1dCgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBwbGFjZWhvbGRlcjogXCJcIixcbiAgICAgICAgY29sb3I6IHVuZGVmaW5lZCxcbiAgICAgICAgcGxhY2Vob2xkZXJDb2xvcjogdW5kZWZpbmVkLFxuICAgICAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgICAgIHRleHRBbGlnbjogdW5kZWZpbmVkLFxuICAgICAgICBmb250OiB1bmRlZmluZWQsXG4gICAgICAgIGZvbnRTaXplOiB1bmRlZmluZWQsXG4gICAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgfTtcbn1cbi8qKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdmFyIFBCVWlJbnB1dDtcbihmdW5jdGlvbiAoUEJVaUlucHV0KSB7XG4gICAgZnVuY3Rpb24gZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IF9tMC5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UucGxhY2Vob2xkZXIgIT09IFwiXCIpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTApLnN0cmluZyhtZXNzYWdlLnBsYWNlaG9sZGVyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5jb2xvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBDb2xvcjQuZW5jb2RlKG1lc3NhZ2UuY29sb3IsIHdyaXRlci51aW50MzIoMTgpLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UucGxhY2Vob2xkZXJDb2xvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBDb2xvcjQuZW5jb2RlKG1lc3NhZ2UucGxhY2Vob2xkZXJDb2xvciwgd3JpdGVyLnVpbnQzMigyNikuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5kaXNhYmxlZCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigzMikuYm9vbChtZXNzYWdlLmRpc2FibGVkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS50ZXh0QWxpZ24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4MCkuaW50MzIobWVzc2FnZS50ZXh0QWxpZ24pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmZvbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4OCkuaW50MzIobWVzc2FnZS5mb250KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5mb250U2l6ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDk2KS5pbnQzMihtZXNzYWdlLmZvbnRTaXplKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS52YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDEwNikuc3RyaW5nKG1lc3NhZ2UudmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxuICAgIFBCVWlJbnB1dC5lbmNvZGUgPSBlbmNvZGU7XG4gICAgZnVuY3Rpb24gZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBfbTAuUmVhZGVyID8gaW5wdXQgOiBfbTAuUmVhZGVyLmNyZWF0ZShpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZVBCVWlJbnB1dCgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDEwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnBsYWNlaG9sZGVyID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDE4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmNvbG9yID0gQ29sb3I0LmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMjYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucGxhY2Vob2xkZXJDb2xvciA9IENvbG9yNC5kZWNvZGUocmVhZGVyLCByZWFkZXIudWludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDMyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmRpc2FibGVkID0gcmVhZGVyLmJvb2woKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gODApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudGV4dEFsaWduID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDg4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmZvbnQgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gOTYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZm9udFNpemUgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMTA2KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnZhbHVlID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgodGFnICYgNykgPT09IDQgfHwgdGFnID09PSAwKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIFBCVWlJbnB1dC5kZWNvZGUgPSBkZWNvZGU7XG59KShQQlVpSW5wdXQgfHwgKFBCVWlJbnB1dCA9IHt9KSk7XG4iLCAiaW1wb3J0IHsgUEJVaUlucHV0IH0gZnJvbSAnLi9wYi9kZWNlbnRyYWxhbmQvc2RrL2NvbXBvbmVudHMvdWlfaW5wdXQuZ2VuJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBVaUlucHV0U2NoZW1hID0ge1xuICAgIENPTVBPTkVOVF9JRDogMTA5MyxcbiAgICBzZXJpYWxpemUodmFsdWUsIGJ1aWxkZXIpIHtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gUEJVaUlucHV0LmVuY29kZSh2YWx1ZSk7XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KHdyaXRlci5maW5pc2goKSwgMCwgd3JpdGVyLmxlbik7XG4gICAgICAgIGJ1aWxkZXIud3JpdGVCdWZmZXIoYnVmZmVyLCBmYWxzZSk7XG4gICAgfSxcbiAgICBkZXNlcmlhbGl6ZShyZWFkZXIpIHtcbiAgICAgICAgcmV0dXJuIFBCVWlJbnB1dC5kZWNvZGUocmVhZGVyLmJ1ZmZlcigpLCByZWFkZXIucmVtYWluaW5nQnl0ZXMoKSk7XG4gICAgfSxcbiAgICBjcmVhdGUoKSB7XG4gICAgICAgIC8vIFRPRE86IHRoaXMgaXMgYSBoYWNrLlxuICAgICAgICByZXR1cm4gUEJVaUlucHV0LmRlY29kZShuZXcgVWludDhBcnJheSgpKTtcbiAgICB9LFxuICAgIGpzb25TY2hlbWE6IHtcbiAgICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgICAgcHJvcGVydGllczoge30sXG4gICAgICAgIHNlcmlhbGl6YXRpb25UeXBlOiBcInByb3RvY29sLWJ1ZmZlclwiLFxuICAgICAgICBwcm90b2NvbEJ1ZmZlcjogXCJQQlVpSW5wdXRcIlxuICAgIH1cbn07XG4iLCAiLyogZXNsaW50LWRpc2FibGUgKi9cbmltcG9ydCBfbTAgZnJvbSBcInByb3RvYnVmanMvbWluaW1hbFwiO1xuY29uc3QgcHJvdG9idWZQYWNrYWdlU2FyYXNhID0gXCJkZWNlbnRyYWxhbmQuc2RrLmNvbXBvbmVudHNcIjtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VQQlVpSW5wdXRSZXN1bHQoKSB7XG4gICAgcmV0dXJuIHsgdmFsdWU6IFwiXCIsIGlzU3VibWl0OiB1bmRlZmluZWQgfTtcbn1cbi8qKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdmFyIFBCVWlJbnB1dFJlc3VsdDtcbihmdW5jdGlvbiAoUEJVaUlucHV0UmVzdWx0KSB7XG4gICAgZnVuY3Rpb24gZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IF9tMC5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UudmFsdWUgIT09IFwiXCIpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTApLnN0cmluZyhtZXNzYWdlLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5pc1N1Ym1pdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE2KS5ib29sKG1lc3NhZ2UuaXNTdWJtaXQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxuICAgIFBCVWlJbnB1dFJlc3VsdC5lbmNvZGUgPSBlbmNvZGU7XG4gICAgZnVuY3Rpb24gZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBfbTAuUmVhZGVyID8gaW5wdXQgOiBfbTAuUmVhZGVyLmNyZWF0ZShpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZVBCVWlJbnB1dFJlc3VsdCgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDEwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnZhbHVlID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDE2KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmlzU3VibWl0ID0gcmVhZGVyLmJvb2woKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKHRhZyAmIDcpID09PSA0IHx8IHRhZyA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBQQlVpSW5wdXRSZXN1bHQuZGVjb2RlID0gZGVjb2RlO1xufSkoUEJVaUlucHV0UmVzdWx0IHx8IChQQlVpSW5wdXRSZXN1bHQgPSB7fSkpO1xuIiwgImltcG9ydCB7IFBCVWlJbnB1dFJlc3VsdCB9IGZyb20gJy4vcGIvZGVjZW50cmFsYW5kL3Nkay9jb21wb25lbnRzL3VpX2lucHV0X3Jlc3VsdC5nZW4nO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFVpSW5wdXRSZXN1bHRTY2hlbWEgPSB7XG4gICAgQ09NUE9ORU5UX0lEOiAxMDk1LFxuICAgIHNlcmlhbGl6ZSh2YWx1ZSwgYnVpbGRlcikge1xuICAgICAgICBjb25zdCB3cml0ZXIgPSBQQlVpSW5wdXRSZXN1bHQuZW5jb2RlKHZhbHVlKTtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkod3JpdGVyLmZpbmlzaCgpLCAwLCB3cml0ZXIubGVuKTtcbiAgICAgICAgYnVpbGRlci53cml0ZUJ1ZmZlcihidWZmZXIsIGZhbHNlKTtcbiAgICB9LFxuICAgIGRlc2VyaWFsaXplKHJlYWRlcikge1xuICAgICAgICByZXR1cm4gUEJVaUlucHV0UmVzdWx0LmRlY29kZShyZWFkZXIuYnVmZmVyKCksIHJlYWRlci5yZW1haW5pbmdCeXRlcygpKTtcbiAgICB9LFxuICAgIGNyZWF0ZSgpIHtcbiAgICAgICAgLy8gVE9ETzogdGhpcyBpcyBhIGhhY2suXG4gICAgICAgIHJldHVybiBQQlVpSW5wdXRSZXN1bHQuZGVjb2RlKG5ldyBVaW50OEFycmF5KCkpO1xuICAgIH0sXG4gICAganNvblNjaGVtYToge1xuICAgICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgICBwcm9wZXJ0aWVzOiB7fSxcbiAgICAgICAgc2VyaWFsaXphdGlvblR5cGU6IFwicHJvdG9jb2wtYnVmZmVyXCIsXG4gICAgICAgIHByb3RvY29sQnVmZmVyOiBcIlBCVWlJbnB1dFJlc3VsdFwiXG4gICAgfVxufTtcbiIsICIvKiBlc2xpbnQtZGlzYWJsZSAqL1xuaW1wb3J0IF9tMCBmcm9tIFwicHJvdG9idWZqcy9taW5pbWFsXCI7XG5pbXBvcnQgeyBDb2xvcjQgfSBmcm9tIFwiLi4vLi4vY29tbW9uL2NvbG9ycy5nZW5cIjtcbmNvbnN0IHByb3RvYnVmUGFja2FnZVNhcmFzYSA9IFwiZGVjZW50cmFsYW5kLnNkay5jb21wb25lbnRzXCI7XG5mdW5jdGlvbiBjcmVhdGVCYXNlUEJVaVRleHQoKSB7XG4gICAgcmV0dXJuIHsgdmFsdWU6IFwiXCIsIGNvbG9yOiB1bmRlZmluZWQsIHRleHRBbGlnbjogdW5kZWZpbmVkLCBmb250OiB1bmRlZmluZWQsIGZvbnRTaXplOiB1bmRlZmluZWQgfTtcbn1cbi8qKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdmFyIFBCVWlUZXh0O1xuKGZ1bmN0aW9uIChQQlVpVGV4dCkge1xuICAgIGZ1bmN0aW9uIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBfbTAuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLnZhbHVlICE9PSBcIlwiKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDEwKS5zdHJpbmcobWVzc2FnZS52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuY29sb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgQ29sb3I0LmVuY29kZShtZXNzYWdlLmNvbG9yLCB3cml0ZXIudWludDMyKDE4KS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnRleHRBbGlnbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDI0KS5pbnQzMihtZXNzYWdlLnRleHRBbGlnbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuZm9udCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDMyKS5pbnQzMihtZXNzYWdlLmZvbnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmZvbnRTaXplICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNDApLmludDMyKG1lc3NhZ2UuZm9udFNpemUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxuICAgIFBCVWlUZXh0LmVuY29kZSA9IGVuY29kZTtcbiAgICBmdW5jdGlvbiBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIF9tMC5SZWFkZXIgPyBpbnB1dCA6IF9tMC5SZWFkZXIuY3JlYXRlKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlUEJVaVRleHQoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSAxMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS52YWx1ZSA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSAxOCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5jb2xvciA9IENvbG9yNC5kZWNvZGUocmVhZGVyLCByZWFkZXIudWludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDI0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnRleHRBbGlnbiA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDMyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmZvbnQgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSA0MCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5mb250U2l6ZSA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgodGFnICYgNykgPT09IDQgfHwgdGFnID09PSAwKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIFBCVWlUZXh0LmRlY29kZSA9IGRlY29kZTtcbn0pKFBCVWlUZXh0IHx8IChQQlVpVGV4dCA9IHt9KSk7XG4iLCAiaW1wb3J0IHsgUEJVaVRleHQgfSBmcm9tICcuL3BiL2RlY2VudHJhbGFuZC9zZGsvY29tcG9uZW50cy91aV90ZXh0Lmdlbic7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgVWlUZXh0U2NoZW1hID0ge1xuICAgIENPTVBPTkVOVF9JRDogMTA1MixcbiAgICBzZXJpYWxpemUodmFsdWUsIGJ1aWxkZXIpIHtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gUEJVaVRleHQuZW5jb2RlKHZhbHVlKTtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkod3JpdGVyLmZpbmlzaCgpLCAwLCB3cml0ZXIubGVuKTtcbiAgICAgICAgYnVpbGRlci53cml0ZUJ1ZmZlcihidWZmZXIsIGZhbHNlKTtcbiAgICB9LFxuICAgIGRlc2VyaWFsaXplKHJlYWRlcikge1xuICAgICAgICByZXR1cm4gUEJVaVRleHQuZGVjb2RlKHJlYWRlci5idWZmZXIoKSwgcmVhZGVyLnJlbWFpbmluZ0J5dGVzKCkpO1xuICAgIH0sXG4gICAgY3JlYXRlKCkge1xuICAgICAgICAvLyBUT0RPOiB0aGlzIGlzIGEgaGFjay5cbiAgICAgICAgcmV0dXJuIFBCVWlUZXh0LmRlY29kZShuZXcgVWludDhBcnJheSgpKTtcbiAgICB9LFxuICAgIGpzb25TY2hlbWE6IHtcbiAgICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgICAgcHJvcGVydGllczoge30sXG4gICAgICAgIHNlcmlhbGl6YXRpb25UeXBlOiBcInByb3RvY29sLWJ1ZmZlclwiLFxuICAgICAgICBwcm90b2NvbEJ1ZmZlcjogXCJQQlVpVGV4dFwiXG4gICAgfVxufTtcbiIsICIvKiBlc2xpbnQtZGlzYWJsZSAqL1xuaW1wb3J0IF9tMCBmcm9tIFwicHJvdG9idWZqcy9taW5pbWFsXCI7XG5jb25zdCBwcm90b2J1ZlBhY2thZ2VTYXJhc2EgPSBcImRlY2VudHJhbGFuZC5zZGsuY29tcG9uZW50c1wiO1xuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB2YXIgWUdQb3NpdGlvblR5cGU7XG4oZnVuY3Rpb24gKFlHUG9zaXRpb25UeXBlKSB7XG4gICAgWUdQb3NpdGlvblR5cGVbWUdQb3NpdGlvblR5cGVbXCJZR1BUX1JFTEFUSVZFXCJdID0gMF0gPSBcIllHUFRfUkVMQVRJVkVcIjtcbiAgICBZR1Bvc2l0aW9uVHlwZVtZR1Bvc2l0aW9uVHlwZVtcIllHUFRfQUJTT0xVVEVcIl0gPSAxXSA9IFwiWUdQVF9BQlNPTFVURVwiO1xufSkoWUdQb3NpdGlvblR5cGUgfHwgKFlHUG9zaXRpb25UeXBlID0ge30pKTtcbi8qKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdmFyIFlHQWxpZ247XG4oZnVuY3Rpb24gKFlHQWxpZ24pIHtcbiAgICBZR0FsaWduW1lHQWxpZ25bXCJZR0FfQVVUT1wiXSA9IDBdID0gXCJZR0FfQVVUT1wiO1xuICAgIFlHQWxpZ25bWUdBbGlnbltcIllHQV9GTEVYX1NUQVJUXCJdID0gMV0gPSBcIllHQV9GTEVYX1NUQVJUXCI7XG4gICAgWUdBbGlnbltZR0FsaWduW1wiWUdBX0NFTlRFUlwiXSA9IDJdID0gXCJZR0FfQ0VOVEVSXCI7XG4gICAgWUdBbGlnbltZR0FsaWduW1wiWUdBX0ZMRVhfRU5EXCJdID0gM10gPSBcIllHQV9GTEVYX0VORFwiO1xuICAgIFlHQWxpZ25bWUdBbGlnbltcIllHQV9TVFJFVENIXCJdID0gNF0gPSBcIllHQV9TVFJFVENIXCI7XG4gICAgWUdBbGlnbltZR0FsaWduW1wiWUdBX0JBU0VMSU5FXCJdID0gNV0gPSBcIllHQV9CQVNFTElORVwiO1xuICAgIFlHQWxpZ25bWUdBbGlnbltcIllHQV9TUEFDRV9CRVRXRUVOXCJdID0gNl0gPSBcIllHQV9TUEFDRV9CRVRXRUVOXCI7XG4gICAgWUdBbGlnbltZR0FsaWduW1wiWUdBX1NQQUNFX0FST1VORFwiXSA9IDddID0gXCJZR0FfU1BBQ0VfQVJPVU5EXCI7XG59KShZR0FsaWduIHx8IChZR0FsaWduID0ge30pKTtcbi8qKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdmFyIFlHVW5pdDtcbihmdW5jdGlvbiAoWUdVbml0KSB7XG4gICAgWUdVbml0W1lHVW5pdFtcIllHVV9VTkRFRklORURcIl0gPSAwXSA9IFwiWUdVX1VOREVGSU5FRFwiO1xuICAgIFlHVW5pdFtZR1VuaXRbXCJZR1VfUE9JTlRcIl0gPSAxXSA9IFwiWUdVX1BPSU5UXCI7XG4gICAgWUdVbml0W1lHVW5pdFtcIllHVV9QRVJDRU5UXCJdID0gMl0gPSBcIllHVV9QRVJDRU5UXCI7XG4gICAgWUdVbml0W1lHVW5pdFtcIllHVV9BVVRPXCJdID0gM10gPSBcIllHVV9BVVRPXCI7XG59KShZR1VuaXQgfHwgKFlHVW5pdCA9IHt9KSk7XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHZhciBZR0ZsZXhEaXJlY3Rpb247XG4oZnVuY3Rpb24gKFlHRmxleERpcmVjdGlvbikge1xuICAgIFlHRmxleERpcmVjdGlvbltZR0ZsZXhEaXJlY3Rpb25bXCJZR0ZEX1JPV1wiXSA9IDBdID0gXCJZR0ZEX1JPV1wiO1xuICAgIFlHRmxleERpcmVjdGlvbltZR0ZsZXhEaXJlY3Rpb25bXCJZR0ZEX0NPTFVNTlwiXSA9IDFdID0gXCJZR0ZEX0NPTFVNTlwiO1xuICAgIFlHRmxleERpcmVjdGlvbltZR0ZsZXhEaXJlY3Rpb25bXCJZR0ZEX0NPTFVNTl9SRVZFUlNFXCJdID0gMl0gPSBcIllHRkRfQ09MVU1OX1JFVkVSU0VcIjtcbiAgICBZR0ZsZXhEaXJlY3Rpb25bWUdGbGV4RGlyZWN0aW9uW1wiWUdGRF9ST1dfUkVWRVJTRVwiXSA9IDNdID0gXCJZR0ZEX1JPV19SRVZFUlNFXCI7XG59KShZR0ZsZXhEaXJlY3Rpb24gfHwgKFlHRmxleERpcmVjdGlvbiA9IHt9KSk7XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHZhciBZR1dyYXA7XG4oZnVuY3Rpb24gKFlHV3JhcCkge1xuICAgIFlHV3JhcFtZR1dyYXBbXCJZR1dfTk9fV1JBUFwiXSA9IDBdID0gXCJZR1dfTk9fV1JBUFwiO1xuICAgIFlHV3JhcFtZR1dyYXBbXCJZR1dfV1JBUFwiXSA9IDFdID0gXCJZR1dfV1JBUFwiO1xuICAgIFlHV3JhcFtZR1dyYXBbXCJZR1dfV1JBUF9SRVZFUlNFXCJdID0gMl0gPSBcIllHV19XUkFQX1JFVkVSU0VcIjtcbn0pKFlHV3JhcCB8fCAoWUdXcmFwID0ge30pKTtcbi8qKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdmFyIFlHSnVzdGlmeTtcbihmdW5jdGlvbiAoWUdKdXN0aWZ5KSB7XG4gICAgWUdKdXN0aWZ5W1lHSnVzdGlmeVtcIllHSl9GTEVYX1NUQVJUXCJdID0gMF0gPSBcIllHSl9GTEVYX1NUQVJUXCI7XG4gICAgWUdKdXN0aWZ5W1lHSnVzdGlmeVtcIllHSl9DRU5URVJcIl0gPSAxXSA9IFwiWUdKX0NFTlRFUlwiO1xuICAgIFlHSnVzdGlmeVtZR0p1c3RpZnlbXCJZR0pfRkxFWF9FTkRcIl0gPSAyXSA9IFwiWUdKX0ZMRVhfRU5EXCI7XG4gICAgWUdKdXN0aWZ5W1lHSnVzdGlmeVtcIllHSl9TUEFDRV9CRVRXRUVOXCJdID0gM10gPSBcIllHSl9TUEFDRV9CRVRXRUVOXCI7XG4gICAgWUdKdXN0aWZ5W1lHSnVzdGlmeVtcIllHSl9TUEFDRV9BUk9VTkRcIl0gPSA0XSA9IFwiWUdKX1NQQUNFX0FST1VORFwiO1xuICAgIFlHSnVzdGlmeVtZR0p1c3RpZnlbXCJZR0pfU1BBQ0VfRVZFTkxZXCJdID0gNV0gPSBcIllHSl9TUEFDRV9FVkVOTFlcIjtcbn0pKFlHSnVzdGlmeSB8fCAoWUdKdXN0aWZ5ID0ge30pKTtcbi8qKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdmFyIFlHT3ZlcmZsb3c7XG4oZnVuY3Rpb24gKFlHT3ZlcmZsb3cpIHtcbiAgICBZR092ZXJmbG93W1lHT3ZlcmZsb3dbXCJZR09fVklTSUJMRVwiXSA9IDBdID0gXCJZR09fVklTSUJMRVwiO1xuICAgIFlHT3ZlcmZsb3dbWUdPdmVyZmxvd1tcIllHT19ISURERU5cIl0gPSAxXSA9IFwiWUdPX0hJRERFTlwiO1xuICAgIFlHT3ZlcmZsb3dbWUdPdmVyZmxvd1tcIllHT19TQ1JPTExcIl0gPSAyXSA9IFwiWUdPX1NDUk9MTFwiO1xufSkoWUdPdmVyZmxvdyB8fCAoWUdPdmVyZmxvdyA9IHt9KSk7XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHZhciBZR0Rpc3BsYXk7XG4oZnVuY3Rpb24gKFlHRGlzcGxheSkge1xuICAgIFlHRGlzcGxheVtZR0Rpc3BsYXlbXCJZR0RfRkxFWFwiXSA9IDBdID0gXCJZR0RfRkxFWFwiO1xuICAgIFlHRGlzcGxheVtZR0Rpc3BsYXlbXCJZR0RfTk9ORVwiXSA9IDFdID0gXCJZR0RfTk9ORVwiO1xufSkoWUdEaXNwbGF5IHx8IChZR0Rpc3BsYXkgPSB7fSkpO1xuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB2YXIgWUdFZGdlO1xuKGZ1bmN0aW9uIChZR0VkZ2UpIHtcbiAgICBZR0VkZ2VbWUdFZGdlW1wiWUdFX0xFRlRcIl0gPSAwXSA9IFwiWUdFX0xFRlRcIjtcbiAgICBZR0VkZ2VbWUdFZGdlW1wiWUdFX1RPUFwiXSA9IDFdID0gXCJZR0VfVE9QXCI7XG4gICAgWUdFZGdlW1lHRWRnZVtcIllHRV9SSUdIVFwiXSA9IDJdID0gXCJZR0VfUklHSFRcIjtcbiAgICBZR0VkZ2VbWUdFZGdlW1wiWUdFX0JPVFRPTVwiXSA9IDNdID0gXCJZR0VfQk9UVE9NXCI7XG4gICAgWUdFZGdlW1lHRWRnZVtcIllHRV9TVEFSVFwiXSA9IDRdID0gXCJZR0VfU1RBUlRcIjtcbiAgICBZR0VkZ2VbWUdFZGdlW1wiWUdFX0VORFwiXSA9IDVdID0gXCJZR0VfRU5EXCI7XG4gICAgWUdFZGdlW1lHRWRnZVtcIllHRV9IT1JJWk9OVEFMXCJdID0gNl0gPSBcIllHRV9IT1JJWk9OVEFMXCI7XG4gICAgWUdFZGdlW1lHRWRnZVtcIllHRV9WRVJUSUNBTFwiXSA9IDddID0gXCJZR0VfVkVSVElDQUxcIjtcbiAgICBZR0VkZ2VbWUdFZGdlW1wiWUdFX0FMTFwiXSA9IDhdID0gXCJZR0VfQUxMXCI7XG59KShZR0VkZ2UgfHwgKFlHRWRnZSA9IHt9KSk7XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHZhciBQb2ludGVyRmlsdGVyTW9kZTtcbihmdW5jdGlvbiAoUG9pbnRlckZpbHRlck1vZGUpIHtcbiAgICBQb2ludGVyRmlsdGVyTW9kZVtQb2ludGVyRmlsdGVyTW9kZVtcIlBGTV9OT05FXCJdID0gMF0gPSBcIlBGTV9OT05FXCI7XG4gICAgUG9pbnRlckZpbHRlck1vZGVbUG9pbnRlckZpbHRlck1vZGVbXCJQRk1fQkxPQ0tcIl0gPSAxXSA9IFwiUEZNX0JMT0NLXCI7XG59KShQb2ludGVyRmlsdGVyTW9kZSB8fCAoUG9pbnRlckZpbHRlck1vZGUgPSB7fSkpO1xuZnVuY3Rpb24gY3JlYXRlQmFzZVBCVWlUcmFuc2Zvcm0oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcGFyZW50OiAwLFxuICAgICAgICByaWdodE9mOiAwLFxuICAgICAgICBhbGlnbkNvbnRlbnQ6IHVuZGVmaW5lZCxcbiAgICAgICAgYWxpZ25JdGVtczogdW5kZWZpbmVkLFxuICAgICAgICBmbGV4V3JhcDogdW5kZWZpbmVkLFxuICAgICAgICBmbGV4U2hyaW5rOiB1bmRlZmluZWQsXG4gICAgICAgIHBvc2l0aW9uVHlwZTogMCxcbiAgICAgICAgYWxpZ25TZWxmOiAwLFxuICAgICAgICBmbGV4RGlyZWN0aW9uOiAwLFxuICAgICAgICBqdXN0aWZ5Q29udGVudDogMCxcbiAgICAgICAgb3ZlcmZsb3c6IDAsXG4gICAgICAgIGRpc3BsYXk6IDAsXG4gICAgICAgIGZsZXhCYXNpc1VuaXQ6IDAsXG4gICAgICAgIGZsZXhCYXNpczogMCxcbiAgICAgICAgZmxleEdyb3c6IDAsXG4gICAgICAgIHdpZHRoVW5pdDogMCxcbiAgICAgICAgd2lkdGg6IDAsXG4gICAgICAgIGhlaWdodFVuaXQ6IDAsXG4gICAgICAgIGhlaWdodDogMCxcbiAgICAgICAgbWluV2lkdGhVbml0OiAwLFxuICAgICAgICBtaW5XaWR0aDogMCxcbiAgICAgICAgbWluSGVpZ2h0VW5pdDogMCxcbiAgICAgICAgbWluSGVpZ2h0OiAwLFxuICAgICAgICBtYXhXaWR0aFVuaXQ6IDAsXG4gICAgICAgIG1heFdpZHRoOiAwLFxuICAgICAgICBtYXhIZWlnaHRVbml0OiAwLFxuICAgICAgICBtYXhIZWlnaHQ6IDAsXG4gICAgICAgIHBvc2l0aW9uTGVmdFVuaXQ6IDAsXG4gICAgICAgIHBvc2l0aW9uTGVmdDogMCxcbiAgICAgICAgcG9zaXRpb25Ub3BVbml0OiAwLFxuICAgICAgICBwb3NpdGlvblRvcDogMCxcbiAgICAgICAgcG9zaXRpb25SaWdodFVuaXQ6IDAsXG4gICAgICAgIHBvc2l0aW9uUmlnaHQ6IDAsXG4gICAgICAgIHBvc2l0aW9uQm90dG9tVW5pdDogMCxcbiAgICAgICAgcG9zaXRpb25Cb3R0b206IDAsXG4gICAgICAgIG1hcmdpbkxlZnRVbml0OiAwLFxuICAgICAgICBtYXJnaW5MZWZ0OiAwLFxuICAgICAgICBtYXJnaW5Ub3BVbml0OiAwLFxuICAgICAgICBtYXJnaW5Ub3A6IDAsXG4gICAgICAgIG1hcmdpblJpZ2h0VW5pdDogMCxcbiAgICAgICAgbWFyZ2luUmlnaHQ6IDAsXG4gICAgICAgIG1hcmdpbkJvdHRvbVVuaXQ6IDAsXG4gICAgICAgIG1hcmdpbkJvdHRvbTogMCxcbiAgICAgICAgcGFkZGluZ0xlZnRVbml0OiAwLFxuICAgICAgICBwYWRkaW5nTGVmdDogMCxcbiAgICAgICAgcGFkZGluZ1RvcFVuaXQ6IDAsXG4gICAgICAgIHBhZGRpbmdUb3A6IDAsXG4gICAgICAgIHBhZGRpbmdSaWdodFVuaXQ6IDAsXG4gICAgICAgIHBhZGRpbmdSaWdodDogMCxcbiAgICAgICAgcGFkZGluZ0JvdHRvbVVuaXQ6IDAsXG4gICAgICAgIHBhZGRpbmdCb3R0b206IDAsXG4gICAgICAgIHBvaW50ZXJGaWx0ZXI6IHVuZGVmaW5lZCxcbiAgICB9O1xufVxuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB2YXIgUEJVaVRyYW5zZm9ybTtcbihmdW5jdGlvbiAoUEJVaVRyYW5zZm9ybSkge1xuICAgIGZ1bmN0aW9uIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBfbTAuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLnBhcmVudCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS5pbnQzMihtZXNzYWdlLnBhcmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UucmlnaHRPZiAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxNikuaW50MzIobWVzc2FnZS5yaWdodE9mKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5hbGlnbkNvbnRlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyNCkuaW50MzIobWVzc2FnZS5hbGlnbkNvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmFsaWduSXRlbXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigzMikuaW50MzIobWVzc2FnZS5hbGlnbkl0ZW1zKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5mbGV4V3JhcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDQwKS5pbnQzMihtZXNzYWdlLmZsZXhXcmFwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5mbGV4U2hyaW5rICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNTMpLmZsb2F0KG1lc3NhZ2UuZmxleFNocmluayk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UucG9zaXRpb25UeXBlICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDU2KS5pbnQzMihtZXNzYWdlLnBvc2l0aW9uVHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuYWxpZ25TZWxmICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDY0KS5pbnQzMihtZXNzYWdlLmFsaWduU2VsZik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuZmxleERpcmVjdGlvbiAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig3MikuaW50MzIobWVzc2FnZS5mbGV4RGlyZWN0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5qdXN0aWZ5Q29udGVudCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4MCkuaW50MzIobWVzc2FnZS5qdXN0aWZ5Q29udGVudCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2Uub3ZlcmZsb3cgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoODgpLmludDMyKG1lc3NhZ2Uub3ZlcmZsb3cpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmRpc3BsYXkgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOTYpLmludDMyKG1lc3NhZ2UuZGlzcGxheSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuZmxleEJhc2lzVW5pdCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxMDQpLmludDMyKG1lc3NhZ2UuZmxleEJhc2lzVW5pdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuZmxleEJhc2lzICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDExNykuZmxvYXQobWVzc2FnZS5mbGV4QmFzaXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmZsZXhHcm93ICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDEyNSkuZmxvYXQobWVzc2FnZS5mbGV4R3Jvdyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2Uud2lkdGhVbml0ICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDEyOCkuaW50MzIobWVzc2FnZS53aWR0aFVuaXQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLndpZHRoICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE0MSkuZmxvYXQobWVzc2FnZS53aWR0aCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuaGVpZ2h0VW5pdCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxNDQpLmludDMyKG1lc3NhZ2UuaGVpZ2h0VW5pdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuaGVpZ2h0ICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE1NykuZmxvYXQobWVzc2FnZS5oZWlnaHQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLm1pbldpZHRoVW5pdCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxNjApLmludDMyKG1lc3NhZ2UubWluV2lkdGhVbml0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5taW5XaWR0aCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxNzMpLmZsb2F0KG1lc3NhZ2UubWluV2lkdGgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLm1pbkhlaWdodFVuaXQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTc2KS5pbnQzMihtZXNzYWdlLm1pbkhlaWdodFVuaXQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLm1pbkhlaWdodCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxODkpLmZsb2F0KG1lc3NhZ2UubWluSGVpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5tYXhXaWR0aFVuaXQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTkyKS5pbnQzMihtZXNzYWdlLm1heFdpZHRoVW5pdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UubWF4V2lkdGggIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMjA1KS5mbG9hdChtZXNzYWdlLm1heFdpZHRoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5tYXhIZWlnaHRVbml0ICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDIwOCkuaW50MzIobWVzc2FnZS5tYXhIZWlnaHRVbml0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5tYXhIZWlnaHQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMjIxKS5mbG9hdChtZXNzYWdlLm1heEhlaWdodCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UucG9zaXRpb25MZWZ0VW5pdCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyMjQpLmludDMyKG1lc3NhZ2UucG9zaXRpb25MZWZ0VW5pdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UucG9zaXRpb25MZWZ0ICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDIzNykuZmxvYXQobWVzc2FnZS5wb3NpdGlvbkxlZnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnBvc2l0aW9uVG9wVW5pdCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyNDApLmludDMyKG1lc3NhZ2UucG9zaXRpb25Ub3BVbml0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5wb3NpdGlvblRvcCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyNTMpLmZsb2F0KG1lc3NhZ2UucG9zaXRpb25Ub3ApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnBvc2l0aW9uUmlnaHRVbml0ICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDI1NikuaW50MzIobWVzc2FnZS5wb3NpdGlvblJpZ2h0VW5pdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UucG9zaXRpb25SaWdodCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyNjkpLmZsb2F0KG1lc3NhZ2UucG9zaXRpb25SaWdodCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UucG9zaXRpb25Cb3R0b21Vbml0ICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDI3MikuaW50MzIobWVzc2FnZS5wb3NpdGlvbkJvdHRvbVVuaXQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnBvc2l0aW9uQm90dG9tICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDI4NSkuZmxvYXQobWVzc2FnZS5wb3NpdGlvbkJvdHRvbSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UubWFyZ2luTGVmdFVuaXQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMjg4KS5pbnQzMihtZXNzYWdlLm1hcmdpbkxlZnRVbml0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5tYXJnaW5MZWZ0ICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDMwMSkuZmxvYXQobWVzc2FnZS5tYXJnaW5MZWZ0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5tYXJnaW5Ub3BVbml0ICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDMwNCkuaW50MzIobWVzc2FnZS5tYXJnaW5Ub3BVbml0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5tYXJnaW5Ub3AgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMzE3KS5mbG9hdChtZXNzYWdlLm1hcmdpblRvcCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UubWFyZ2luUmlnaHRVbml0ICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDMyMCkuaW50MzIobWVzc2FnZS5tYXJnaW5SaWdodFVuaXQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLm1hcmdpblJpZ2h0ICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDMzMykuZmxvYXQobWVzc2FnZS5tYXJnaW5SaWdodCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UubWFyZ2luQm90dG9tVW5pdCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigzMzYpLmludDMyKG1lc3NhZ2UubWFyZ2luQm90dG9tVW5pdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UubWFyZ2luQm90dG9tICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDM0OSkuZmxvYXQobWVzc2FnZS5tYXJnaW5Cb3R0b20pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnBhZGRpbmdMZWZ0VW5pdCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigzNTIpLmludDMyKG1lc3NhZ2UucGFkZGluZ0xlZnRVbml0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5wYWRkaW5nTGVmdCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigzNjUpLmZsb2F0KG1lc3NhZ2UucGFkZGluZ0xlZnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnBhZGRpbmdUb3BVbml0ICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDM2OCkuaW50MzIobWVzc2FnZS5wYWRkaW5nVG9wVW5pdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UucGFkZGluZ1RvcCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigzODEpLmZsb2F0KG1lc3NhZ2UucGFkZGluZ1RvcCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UucGFkZGluZ1JpZ2h0VW5pdCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigzODQpLmludDMyKG1lc3NhZ2UucGFkZGluZ1JpZ2h0VW5pdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UucGFkZGluZ1JpZ2h0ICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDM5NykuZmxvYXQobWVzc2FnZS5wYWRkaW5nUmlnaHQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnBhZGRpbmdCb3R0b21Vbml0ICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDQwMCkuaW50MzIobWVzc2FnZS5wYWRkaW5nQm90dG9tVW5pdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UucGFkZGluZ0JvdHRvbSAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig0MTMpLmZsb2F0KG1lc3NhZ2UucGFkZGluZ0JvdHRvbSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UucG9pbnRlckZpbHRlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDQxNikuaW50MzIobWVzc2FnZS5wb2ludGVyRmlsdGVyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbiAgICBQQlVpVHJhbnNmb3JtLmVuY29kZSA9IGVuY29kZTtcbiAgICBmdW5jdGlvbiBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIF9tMC5SZWFkZXIgPyBpbnB1dCA6IF9tMC5SZWFkZXIuY3JlYXRlKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlUEJVaVRyYW5zZm9ybSgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucGFyZW50ID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMTYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucmlnaHRPZiA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDI0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmFsaWduQ29udGVudCA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDMyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmFsaWduSXRlbXMgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSA0MCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5mbGV4V3JhcCA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDUzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmZsZXhTaHJpbmsgPSByZWFkZXIuZmxvYXQoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSA1Nikge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5wb3NpdGlvblR5cGUgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSA2NCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5hbGlnblNlbGYgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSA3Mikge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5mbGV4RGlyZWN0aW9uID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDgwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmp1c3RpZnlDb250ZW50ID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDg4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm92ZXJmbG93ID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDk2KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmRpc3BsYXkgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMTA0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmZsZXhCYXNpc1VuaXQgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSAxNDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMTE3KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmZsZXhCYXNpcyA9IHJlYWRlci5mbG9hdCgpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDE1OlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSAxMjUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZmxleEdyb3cgPSByZWFkZXIuZmxvYXQoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSAxNjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMTI4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLndpZHRoVW5pdCA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDE3OlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSAxNDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uud2lkdGggPSByZWFkZXIuZmxvYXQoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSAxODpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMTQ0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmhlaWdodFVuaXQgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSAxOTpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMTU3KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmhlaWdodCA9IHJlYWRlci5mbG9hdCgpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDIwOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSAxNjApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubWluV2lkdGhVbml0ID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgMjE6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDE3Mykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5taW5XaWR0aCA9IHJlYWRlci5mbG9hdCgpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDIyOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSAxNzYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubWluSGVpZ2h0VW5pdCA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDIzOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSAxODkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubWluSGVpZ2h0ID0gcmVhZGVyLmZsb2F0KCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgMjQ6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDE5Mikge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5tYXhXaWR0aFVuaXQgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSAyNTpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMjA1KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm1heFdpZHRoID0gcmVhZGVyLmZsb2F0KCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgMjY6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDIwOCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5tYXhIZWlnaHRVbml0ID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgMjc6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDIyMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5tYXhIZWlnaHQgPSByZWFkZXIuZmxvYXQoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSAyODpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMjI0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnBvc2l0aW9uTGVmdFVuaXQgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSAyOTpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMjM3KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnBvc2l0aW9uTGVmdCA9IHJlYWRlci5mbG9hdCgpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDMwOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSAyNDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucG9zaXRpb25Ub3BVbml0ID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgMzE6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDI1Mykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5wb3NpdGlvblRvcCA9IHJlYWRlci5mbG9hdCgpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDMyOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSAyNTYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucG9zaXRpb25SaWdodFVuaXQgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSAzMzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMjY5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnBvc2l0aW9uUmlnaHQgPSByZWFkZXIuZmxvYXQoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSAzNDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMjcyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnBvc2l0aW9uQm90dG9tVW5pdCA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDM1OlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSAyODUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucG9zaXRpb25Cb3R0b20gPSByZWFkZXIuZmxvYXQoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSAzNjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMjg4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm1hcmdpbkxlZnRVbml0ID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgMzc6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDMwMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5tYXJnaW5MZWZ0ID0gcmVhZGVyLmZsb2F0KCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgMzg6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDMwNCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5tYXJnaW5Ub3BVbml0ID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgMzk6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDMxNykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5tYXJnaW5Ub3AgPSByZWFkZXIuZmxvYXQoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSA0MDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMzIwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm1hcmdpblJpZ2h0VW5pdCA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDQxOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSAzMzMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubWFyZ2luUmlnaHQgPSByZWFkZXIuZmxvYXQoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSA0MjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMzM2KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm1hcmdpbkJvdHRvbVVuaXQgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSA0MzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMzQ5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm1hcmdpbkJvdHRvbSA9IHJlYWRlci5mbG9hdCgpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDQ0OlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSAzNTIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucGFkZGluZ0xlZnRVbml0ID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgNDU6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDM2NSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5wYWRkaW5nTGVmdCA9IHJlYWRlci5mbG9hdCgpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDQ2OlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSAzNjgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucGFkZGluZ1RvcFVuaXQgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSA0NzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMzgxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnBhZGRpbmdUb3AgPSByZWFkZXIuZmxvYXQoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSA0ODpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMzg0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnBhZGRpbmdSaWdodFVuaXQgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSA0OTpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMzk3KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnBhZGRpbmdSaWdodCA9IHJlYWRlci5mbG9hdCgpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDUwOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSA0MDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucGFkZGluZ0JvdHRvbVVuaXQgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSA1MTpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gNDEzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnBhZGRpbmdCb3R0b20gPSByZWFkZXIuZmxvYXQoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSA1MjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gNDE2KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnBvaW50ZXJGaWx0ZXIgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKHRhZyAmIDcpID09PSA0IHx8IHRhZyA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBQQlVpVHJhbnNmb3JtLmRlY29kZSA9IGRlY29kZTtcbn0pKFBCVWlUcmFuc2Zvcm0gfHwgKFBCVWlUcmFuc2Zvcm0gPSB7fSkpO1xuIiwgImltcG9ydCB7IFBCVWlUcmFuc2Zvcm0gfSBmcm9tICcuL3BiL2RlY2VudHJhbGFuZC9zZGsvY29tcG9uZW50cy91aV90cmFuc2Zvcm0uZ2VuJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBVaVRyYW5zZm9ybVNjaGVtYSA9IHtcbiAgICBDT01QT05FTlRfSUQ6IDEwNTAsXG4gICAgc2VyaWFsaXplKHZhbHVlLCBidWlsZGVyKSB7XG4gICAgICAgIGNvbnN0IHdyaXRlciA9IFBCVWlUcmFuc2Zvcm0uZW5jb2RlKHZhbHVlKTtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkod3JpdGVyLmZpbmlzaCgpLCAwLCB3cml0ZXIubGVuKTtcbiAgICAgICAgYnVpbGRlci53cml0ZUJ1ZmZlcihidWZmZXIsIGZhbHNlKTtcbiAgICB9LFxuICAgIGRlc2VyaWFsaXplKHJlYWRlcikge1xuICAgICAgICByZXR1cm4gUEJVaVRyYW5zZm9ybS5kZWNvZGUocmVhZGVyLmJ1ZmZlcigpLCByZWFkZXIucmVtYWluaW5nQnl0ZXMoKSk7XG4gICAgfSxcbiAgICBjcmVhdGUoKSB7XG4gICAgICAgIC8vIFRPRE86IHRoaXMgaXMgYSBoYWNrLlxuICAgICAgICByZXR1cm4gUEJVaVRyYW5zZm9ybS5kZWNvZGUobmV3IFVpbnQ4QXJyYXkoKSk7XG4gICAgfSxcbiAgICBqc29uU2NoZW1hOiB7XG4gICAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgIHByb3BlcnRpZXM6IHt9LFxuICAgICAgICBzZXJpYWxpemF0aW9uVHlwZTogXCJwcm90b2NvbC1idWZmZXJcIixcbiAgICAgICAgcHJvdG9jb2xCdWZmZXI6IFwiUEJVaVRyYW5zZm9ybVwiXG4gICAgfVxufTtcbiIsICIvKiBlc2xpbnQtZGlzYWJsZSAqL1xuaW1wb3J0IF9tMCBmcm9tIFwicHJvdG9idWZqcy9taW5pbWFsXCI7XG5jb25zdCBwcm90b2J1ZlBhY2thZ2VTYXJhc2EgPSBcImRlY2VudHJhbGFuZC5zZGsuY29tcG9uZW50c1wiO1xuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB2YXIgVmlkZW9TdGF0ZTtcbihmdW5jdGlvbiAoVmlkZW9TdGF0ZSkge1xuICAgIFZpZGVvU3RhdGVbVmlkZW9TdGF0ZVtcIlZTX05PTkVcIl0gPSAwXSA9IFwiVlNfTk9ORVwiO1xuICAgIFZpZGVvU3RhdGVbVmlkZW9TdGF0ZVtcIlZTX0VSUk9SXCJdID0gMV0gPSBcIlZTX0VSUk9SXCI7XG4gICAgVmlkZW9TdGF0ZVtWaWRlb1N0YXRlW1wiVlNfTE9BRElOR1wiXSA9IDJdID0gXCJWU19MT0FESU5HXCI7XG4gICAgVmlkZW9TdGF0ZVtWaWRlb1N0YXRlW1wiVlNfUkVBRFlcIl0gPSAzXSA9IFwiVlNfUkVBRFlcIjtcbiAgICBWaWRlb1N0YXRlW1ZpZGVvU3RhdGVbXCJWU19QTEFZSU5HXCJdID0gNF0gPSBcIlZTX1BMQVlJTkdcIjtcbiAgICBWaWRlb1N0YXRlW1ZpZGVvU3RhdGVbXCJWU19CVUZGRVJJTkdcIl0gPSA1XSA9IFwiVlNfQlVGRkVSSU5HXCI7XG4gICAgVmlkZW9TdGF0ZVtWaWRlb1N0YXRlW1wiVlNfU0VFS0lOR1wiXSA9IDZdID0gXCJWU19TRUVLSU5HXCI7XG4gICAgVmlkZW9TdGF0ZVtWaWRlb1N0YXRlW1wiVlNfUEFVU0VEXCJdID0gN10gPSBcIlZTX1BBVVNFRFwiO1xufSkoVmlkZW9TdGF0ZSB8fCAoVmlkZW9TdGF0ZSA9IHt9KSk7XG5mdW5jdGlvbiBjcmVhdGVCYXNlUEJWaWRlb0V2ZW50KCkge1xuICAgIHJldHVybiB7IHRpbWVzdGFtcDogMCwgdGlja051bWJlcjogMCwgY3VycmVudE9mZnNldDogMCwgdmlkZW9MZW5ndGg6IDAsIHN0YXRlOiAwIH07XG59XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHZhciBQQlZpZGVvRXZlbnQ7XG4oZnVuY3Rpb24gKFBCVmlkZW9FdmVudCkge1xuICAgIGZ1bmN0aW9uIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBfbTAuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLnRpbWVzdGFtcCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS51aW50MzIobWVzc2FnZS50aW1lc3RhbXApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnRpY2tOdW1iZXIgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTYpLnVpbnQzMihtZXNzYWdlLnRpY2tOdW1iZXIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmN1cnJlbnRPZmZzZXQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMjkpLmZsb2F0KG1lc3NhZ2UuY3VycmVudE9mZnNldCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UudmlkZW9MZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMzcpLmZsb2F0KG1lc3NhZ2UudmlkZW9MZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnN0YXRlICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDQwKS5pbnQzMihtZXNzYWdlLnN0YXRlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbiAgICBQQlZpZGVvRXZlbnQuZW5jb2RlID0gZW5jb2RlO1xuICAgIGZ1bmN0aW9uIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgX20wLlJlYWRlciA/IGlucHV0IDogX20wLlJlYWRlci5jcmVhdGUoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VQQlZpZGVvRXZlbnQoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSA4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnRpbWVzdGFtcCA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSAxNikge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50aWNrTnVtYmVyID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDI5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmN1cnJlbnRPZmZzZXQgPSByZWFkZXIuZmxvYXQoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSAzNykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS52aWRlb0xlbmd0aCA9IHJlYWRlci5mbG9hdCgpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDQwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnN0YXRlID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCh0YWcgJiA3KSA9PT0gNCB8fCB0YWcgPT09IDApIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgUEJWaWRlb0V2ZW50LmRlY29kZSA9IGRlY29kZTtcbn0pKFBCVmlkZW9FdmVudCB8fCAoUEJWaWRlb0V2ZW50ID0ge30pKTtcbiIsICJpbXBvcnQgeyBQQlZpZGVvRXZlbnQgfSBmcm9tICcuL3BiL2RlY2VudHJhbGFuZC9zZGsvY29tcG9uZW50cy92aWRlb19ldmVudC5nZW4nO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFZpZGVvRXZlbnRTY2hlbWEgPSB7XG4gICAgQ09NUE9ORU5UX0lEOiAxMDQ0LFxuICAgIHNlcmlhbGl6ZSh2YWx1ZSwgYnVpbGRlcikge1xuICAgICAgICBjb25zdCB3cml0ZXIgPSBQQlZpZGVvRXZlbnQuZW5jb2RlKHZhbHVlKTtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkod3JpdGVyLmZpbmlzaCgpLCAwLCB3cml0ZXIubGVuKTtcbiAgICAgICAgYnVpbGRlci53cml0ZUJ1ZmZlcihidWZmZXIsIGZhbHNlKTtcbiAgICB9LFxuICAgIGRlc2VyaWFsaXplKHJlYWRlcikge1xuICAgICAgICByZXR1cm4gUEJWaWRlb0V2ZW50LmRlY29kZShyZWFkZXIuYnVmZmVyKCksIHJlYWRlci5yZW1haW5pbmdCeXRlcygpKTtcbiAgICB9LFxuICAgIGNyZWF0ZSgpIHtcbiAgICAgICAgLy8gVE9ETzogdGhpcyBpcyBhIGhhY2suXG4gICAgICAgIHJldHVybiBQQlZpZGVvRXZlbnQuZGVjb2RlKG5ldyBVaW50OEFycmF5KCkpO1xuICAgIH0sXG4gICAganNvblNjaGVtYToge1xuICAgICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgICBwcm9wZXJ0aWVzOiB7fSxcbiAgICAgICAgc2VyaWFsaXphdGlvblR5cGU6IFwicHJvdG9jb2wtYnVmZmVyXCIsXG4gICAgICAgIHByb3RvY29sQnVmZmVyOiBcIlBCVmlkZW9FdmVudFwiXG4gICAgfVxufTtcbiIsICIvKiBlc2xpbnQtZGlzYWJsZSAqL1xuaW1wb3J0IF9tMCBmcm9tIFwicHJvdG9idWZqcy9taW5pbWFsXCI7XG5jb25zdCBwcm90b2J1ZlBhY2thZ2VTYXJhc2EgPSBcImRlY2VudHJhbGFuZC5zZGsuY29tcG9uZW50c1wiO1xuZnVuY3Rpb24gY3JlYXRlQmFzZVBCVmlkZW9QbGF5ZXIoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc3JjOiBcIlwiLFxuICAgICAgICBwbGF5aW5nOiB1bmRlZmluZWQsXG4gICAgICAgIHBvc2l0aW9uOiB1bmRlZmluZWQsXG4gICAgICAgIHZvbHVtZTogdW5kZWZpbmVkLFxuICAgICAgICBwbGF5YmFja1JhdGU6IHVuZGVmaW5lZCxcbiAgICAgICAgbG9vcDogdW5kZWZpbmVkLFxuICAgIH07XG59XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHZhciBQQlZpZGVvUGxheWVyO1xuKGZ1bmN0aW9uIChQQlZpZGVvUGxheWVyKSB7XG4gICAgZnVuY3Rpb24gZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IF9tMC5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2Uuc3JjICE9PSBcIlwiKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDEwKS5zdHJpbmcobWVzc2FnZS5zcmMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnBsYXlpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxNikuYm9vbChtZXNzYWdlLnBsYXlpbmcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnBvc2l0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMjkpLmZsb2F0KG1lc3NhZ2UucG9zaXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnZvbHVtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDM3KS5mbG9hdChtZXNzYWdlLnZvbHVtZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UucGxheWJhY2tSYXRlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNDUpLmZsb2F0KG1lc3NhZ2UucGxheWJhY2tSYXRlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5sb29wICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNDgpLmJvb2wobWVzc2FnZS5sb29wKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbiAgICBQQlZpZGVvUGxheWVyLmVuY29kZSA9IGVuY29kZTtcbiAgICBmdW5jdGlvbiBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIF9tMC5SZWFkZXIgPyBpbnB1dCA6IF9tMC5SZWFkZXIuY3JlYXRlKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlUEJWaWRlb1BsYXllcigpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDEwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnNyYyA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSAxNikge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5wbGF5aW5nID0gcmVhZGVyLmJvb2woKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSAyOSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5wb3NpdGlvbiA9IHJlYWRlci5mbG9hdCgpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDM3KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnZvbHVtZSA9IHJlYWRlci5mbG9hdCgpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDQ1KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnBsYXliYWNrUmF0ZSA9IHJlYWRlci5mbG9hdCgpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDQ4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmxvb3AgPSByZWFkZXIuYm9vbCgpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgodGFnICYgNykgPT09IDQgfHwgdGFnID09PSAwKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIFBCVmlkZW9QbGF5ZXIuZGVjb2RlID0gZGVjb2RlO1xufSkoUEJWaWRlb1BsYXllciB8fCAoUEJWaWRlb1BsYXllciA9IHt9KSk7XG4iLCAiaW1wb3J0IHsgUEJWaWRlb1BsYXllciB9IGZyb20gJy4vcGIvZGVjZW50cmFsYW5kL3Nkay9jb21wb25lbnRzL3ZpZGVvX3BsYXllci5nZW4nO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFZpZGVvUGxheWVyU2NoZW1hID0ge1xuICAgIENPTVBPTkVOVF9JRDogMTA0MyxcbiAgICBzZXJpYWxpemUodmFsdWUsIGJ1aWxkZXIpIHtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gUEJWaWRlb1BsYXllci5lbmNvZGUodmFsdWUpO1xuICAgICAgICBjb25zdCBidWZmZXIgPSBuZXcgVWludDhBcnJheSh3cml0ZXIuZmluaXNoKCksIDAsIHdyaXRlci5sZW4pO1xuICAgICAgICBidWlsZGVyLndyaXRlQnVmZmVyKGJ1ZmZlciwgZmFsc2UpO1xuICAgIH0sXG4gICAgZGVzZXJpYWxpemUocmVhZGVyKSB7XG4gICAgICAgIHJldHVybiBQQlZpZGVvUGxheWVyLmRlY29kZShyZWFkZXIuYnVmZmVyKCksIHJlYWRlci5yZW1haW5pbmdCeXRlcygpKTtcbiAgICB9LFxuICAgIGNyZWF0ZSgpIHtcbiAgICAgICAgLy8gVE9ETzogdGhpcyBpcyBhIGhhY2suXG4gICAgICAgIHJldHVybiBQQlZpZGVvUGxheWVyLmRlY29kZShuZXcgVWludDhBcnJheSgpKTtcbiAgICB9LFxuICAgIGpzb25TY2hlbWE6IHtcbiAgICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgICAgcHJvcGVydGllczoge30sXG4gICAgICAgIHNlcmlhbGl6YXRpb25UeXBlOiBcInByb3RvY29sLWJ1ZmZlclwiLFxuICAgICAgICBwcm90b2NvbEJ1ZmZlcjogXCJQQlZpZGVvUGxheWVyXCJcbiAgICB9XG59O1xuIiwgIi8qIGVzbGludC1kaXNhYmxlICovXG5pbXBvcnQgX20wIGZyb20gXCJwcm90b2J1ZmpzL21pbmltYWxcIjtcbmNvbnN0IHByb3RvYnVmUGFja2FnZVNhcmFzYSA9IFwiZGVjZW50cmFsYW5kLnNkay5jb21wb25lbnRzXCI7XG5mdW5jdGlvbiBjcmVhdGVCYXNlUEJWaXNpYmlsaXR5Q29tcG9uZW50KCkge1xuICAgIHJldHVybiB7IHZpc2libGU6IHVuZGVmaW5lZCB9O1xufVxuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB2YXIgUEJWaXNpYmlsaXR5Q29tcG9uZW50O1xuKGZ1bmN0aW9uIChQQlZpc2liaWxpdHlDb21wb25lbnQpIHtcbiAgICBmdW5jdGlvbiBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gX20wLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS52aXNpYmxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkuYm9vbChtZXNzYWdlLnZpc2libGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxuICAgIFBCVmlzaWJpbGl0eUNvbXBvbmVudC5lbmNvZGUgPSBlbmNvZGU7XG4gICAgZnVuY3Rpb24gZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBfbTAuUmVhZGVyID8gaW5wdXQgOiBfbTAuUmVhZGVyLmNyZWF0ZShpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZVBCVmlzaWJpbGl0eUNvbXBvbmVudCgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudmlzaWJsZSA9IHJlYWRlci5ib29sKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCh0YWcgJiA3KSA9PT0gNCB8fCB0YWcgPT09IDApIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgUEJWaXNpYmlsaXR5Q29tcG9uZW50LmRlY29kZSA9IGRlY29kZTtcbn0pKFBCVmlzaWJpbGl0eUNvbXBvbmVudCB8fCAoUEJWaXNpYmlsaXR5Q29tcG9uZW50ID0ge30pKTtcbiIsICJpbXBvcnQgeyBQQlZpc2liaWxpdHlDb21wb25lbnQgfSBmcm9tICcuL3BiL2RlY2VudHJhbGFuZC9zZGsvY29tcG9uZW50cy92aXNpYmlsaXR5X2NvbXBvbmVudC5nZW4nO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFZpc2liaWxpdHlDb21wb25lbnRTY2hlbWEgPSB7XG4gICAgQ09NUE9ORU5UX0lEOiAxMDgxLFxuICAgIHNlcmlhbGl6ZSh2YWx1ZSwgYnVpbGRlcikge1xuICAgICAgICBjb25zdCB3cml0ZXIgPSBQQlZpc2liaWxpdHlDb21wb25lbnQuZW5jb2RlKHZhbHVlKTtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkod3JpdGVyLmZpbmlzaCgpLCAwLCB3cml0ZXIubGVuKTtcbiAgICAgICAgYnVpbGRlci53cml0ZUJ1ZmZlcihidWZmZXIsIGZhbHNlKTtcbiAgICB9LFxuICAgIGRlc2VyaWFsaXplKHJlYWRlcikge1xuICAgICAgICByZXR1cm4gUEJWaXNpYmlsaXR5Q29tcG9uZW50LmRlY29kZShyZWFkZXIuYnVmZmVyKCksIHJlYWRlci5yZW1haW5pbmdCeXRlcygpKTtcbiAgICB9LFxuICAgIGNyZWF0ZSgpIHtcbiAgICAgICAgLy8gVE9ETzogdGhpcyBpcyBhIGhhY2suXG4gICAgICAgIHJldHVybiBQQlZpc2liaWxpdHlDb21wb25lbnQuZGVjb2RlKG5ldyBVaW50OEFycmF5KCkpO1xuICAgIH0sXG4gICAganNvblNjaGVtYToge1xuICAgICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgICBwcm9wZXJ0aWVzOiB7fSxcbiAgICAgICAgc2VyaWFsaXphdGlvblR5cGU6IFwicHJvdG9jb2wtYnVmZmVyXCIsXG4gICAgICAgIHByb3RvY29sQnVmZmVyOiBcIlBCVmlzaWJpbGl0eUNvbXBvbmVudFwiXG4gICAgfVxufTtcbiIsICJpbXBvcnQgeyBBbmltYXRvclNjaGVtYSB9IGZyb20gJy4vQW5pbWF0b3IuZ2VuJztcbmltcG9ydCB7IEF1ZGlvU291cmNlU2NoZW1hIH0gZnJvbSAnLi9BdWRpb1NvdXJjZS5nZW4nO1xuaW1wb3J0IHsgQXVkaW9TdHJlYW1TY2hlbWEgfSBmcm9tICcuL0F1ZGlvU3RyZWFtLmdlbic7XG5pbXBvcnQgeyBBdmF0YXJBdHRhY2hTY2hlbWEgfSBmcm9tICcuL0F2YXRhckF0dGFjaC5nZW4nO1xuaW1wb3J0IHsgQXZhdGFyTW9kaWZpZXJBcmVhU2NoZW1hIH0gZnJvbSAnLi9BdmF0YXJNb2RpZmllckFyZWEuZ2VuJztcbmltcG9ydCB7IEF2YXRhclNoYXBlU2NoZW1hIH0gZnJvbSAnLi9BdmF0YXJTaGFwZS5nZW4nO1xuaW1wb3J0IHsgQmlsbGJvYXJkU2NoZW1hIH0gZnJvbSAnLi9CaWxsYm9hcmQuZ2VuJztcbmltcG9ydCB7IENhbWVyYU1vZGVTY2hlbWEgfSBmcm9tICcuL0NhbWVyYU1vZGUuZ2VuJztcbmltcG9ydCB7IENhbWVyYU1vZGVBcmVhU2NoZW1hIH0gZnJvbSAnLi9DYW1lcmFNb2RlQXJlYS5nZW4nO1xuaW1wb3J0IHsgRW5naW5lSW5mb1NjaGVtYSB9IGZyb20gJy4vRW5naW5lSW5mby5nZW4nO1xuaW1wb3J0IHsgR2x0ZkNvbnRhaW5lclNjaGVtYSB9IGZyb20gJy4vR2x0ZkNvbnRhaW5lci5nZW4nO1xuaW1wb3J0IHsgR2x0ZkNvbnRhaW5lckxvYWRpbmdTdGF0ZVNjaGVtYSB9IGZyb20gJy4vR2x0ZkNvbnRhaW5lckxvYWRpbmdTdGF0ZS5nZW4nO1xuaW1wb3J0IHsgTWF0ZXJpYWxTY2hlbWEgfSBmcm9tICcuL01hdGVyaWFsLmdlbic7XG5pbXBvcnQgeyBNZXNoQ29sbGlkZXJTY2hlbWEgfSBmcm9tICcuL01lc2hDb2xsaWRlci5nZW4nO1xuaW1wb3J0IHsgTWVzaFJlbmRlcmVyU2NoZW1hIH0gZnJvbSAnLi9NZXNoUmVuZGVyZXIuZ2VuJztcbmltcG9ydCB7IE5mdFNoYXBlU2NoZW1hIH0gZnJvbSAnLi9OZnRTaGFwZS5nZW4nO1xuaW1wb3J0IHsgUG9pbnRlckV2ZW50c1NjaGVtYSB9IGZyb20gJy4vUG9pbnRlckV2ZW50cy5nZW4nO1xuaW1wb3J0IHsgUG9pbnRlckV2ZW50c1Jlc3VsdFNjaGVtYSB9IGZyb20gJy4vUG9pbnRlckV2ZW50c1Jlc3VsdC5nZW4nO1xuaW1wb3J0IHsgUG9pbnRlckxvY2tTY2hlbWEgfSBmcm9tICcuL1BvaW50ZXJMb2NrLmdlbic7XG5pbXBvcnQgeyBSYXljYXN0U2NoZW1hIH0gZnJvbSAnLi9SYXljYXN0Lmdlbic7XG5pbXBvcnQgeyBSYXljYXN0UmVzdWx0U2NoZW1hIH0gZnJvbSAnLi9SYXljYXN0UmVzdWx0Lmdlbic7XG5pbXBvcnQgeyBUZXh0U2hhcGVTY2hlbWEgfSBmcm9tICcuL1RleHRTaGFwZS5nZW4nO1xuaW1wb3J0IHsgVHdlZW5TY2hlbWEgfSBmcm9tICcuL1R3ZWVuLmdlbic7XG5pbXBvcnQgeyBUd2VlblNlcXVlbmNlU2NoZW1hIH0gZnJvbSAnLi9Ud2VlblNlcXVlbmNlLmdlbic7XG5pbXBvcnQgeyBUd2VlblN0YXRlU2NoZW1hIH0gZnJvbSAnLi9Ud2VlblN0YXRlLmdlbic7XG5pbXBvcnQgeyBVaUJhY2tncm91bmRTY2hlbWEgfSBmcm9tICcuL1VpQmFja2dyb3VuZC5nZW4nO1xuaW1wb3J0IHsgVWlDYW52YXNJbmZvcm1hdGlvblNjaGVtYSB9IGZyb20gJy4vVWlDYW52YXNJbmZvcm1hdGlvbi5nZW4nO1xuaW1wb3J0IHsgVWlEcm9wZG93blNjaGVtYSB9IGZyb20gJy4vVWlEcm9wZG93bi5nZW4nO1xuaW1wb3J0IHsgVWlEcm9wZG93blJlc3VsdFNjaGVtYSB9IGZyb20gJy4vVWlEcm9wZG93blJlc3VsdC5nZW4nO1xuaW1wb3J0IHsgVWlJbnB1dFNjaGVtYSB9IGZyb20gJy4vVWlJbnB1dC5nZW4nO1xuaW1wb3J0IHsgVWlJbnB1dFJlc3VsdFNjaGVtYSB9IGZyb20gJy4vVWlJbnB1dFJlc3VsdC5nZW4nO1xuaW1wb3J0IHsgVWlUZXh0U2NoZW1hIH0gZnJvbSAnLi9VaVRleHQuZ2VuJztcbmltcG9ydCB7IFVpVHJhbnNmb3JtU2NoZW1hIH0gZnJvbSAnLi9VaVRyYW5zZm9ybS5nZW4nO1xuaW1wb3J0IHsgVmlkZW9FdmVudFNjaGVtYSB9IGZyb20gJy4vVmlkZW9FdmVudC5nZW4nO1xuaW1wb3J0IHsgVmlkZW9QbGF5ZXJTY2hlbWEgfSBmcm9tICcuL1ZpZGVvUGxheWVyLmdlbic7XG5pbXBvcnQgeyBWaXNpYmlsaXR5Q29tcG9uZW50U2NoZW1hIH0gZnJvbSAnLi9WaXNpYmlsaXR5Q29tcG9uZW50Lmdlbic7XG5leHBvcnQgKiBmcm9tICcuL3BiL2RlY2VudHJhbGFuZC9zZGsvY29tcG9uZW50cy9hbmltYXRvci5nZW4nO1xuZXhwb3J0ICogZnJvbSAnLi9wYi9kZWNlbnRyYWxhbmQvc2RrL2NvbXBvbmVudHMvYXVkaW9fc291cmNlLmdlbic7XG5leHBvcnQgKiBmcm9tICcuL3BiL2RlY2VudHJhbGFuZC9zZGsvY29tcG9uZW50cy9hdWRpb19zdHJlYW0uZ2VuJztcbmV4cG9ydCAqIGZyb20gJy4vcGIvZGVjZW50cmFsYW5kL3Nkay9jb21wb25lbnRzL2F2YXRhcl9hdHRhY2guZ2VuJztcbmV4cG9ydCAqIGZyb20gJy4vcGIvZGVjZW50cmFsYW5kL3Nkay9jb21wb25lbnRzL2F2YXRhcl9tb2RpZmllcl9hcmVhLmdlbic7XG5leHBvcnQgKiBmcm9tICcuL3BiL2RlY2VudHJhbGFuZC9zZGsvY29tcG9uZW50cy9hdmF0YXJfc2hhcGUuZ2VuJztcbmV4cG9ydCAqIGZyb20gJy4vcGIvZGVjZW50cmFsYW5kL3Nkay9jb21wb25lbnRzL2JpbGxib2FyZC5nZW4nO1xuZXhwb3J0ICogZnJvbSAnLi9wYi9kZWNlbnRyYWxhbmQvc2RrL2NvbXBvbmVudHMvY2FtZXJhX21vZGUuZ2VuJztcbmV4cG9ydCAqIGZyb20gJy4vcGIvZGVjZW50cmFsYW5kL3Nkay9jb21wb25lbnRzL2NhbWVyYV9tb2RlX2FyZWEuZ2VuJztcbmV4cG9ydCAqIGZyb20gJy4vcGIvZGVjZW50cmFsYW5kL3Nkay9jb21wb25lbnRzL2VuZ2luZV9pbmZvLmdlbic7XG5leHBvcnQgKiBmcm9tICcuL3BiL2RlY2VudHJhbGFuZC9zZGsvY29tcG9uZW50cy9nbHRmX2NvbnRhaW5lci5nZW4nO1xuZXhwb3J0ICogZnJvbSAnLi9wYi9kZWNlbnRyYWxhbmQvc2RrL2NvbXBvbmVudHMvZ2x0Zl9jb250YWluZXJfbG9hZGluZ19zdGF0ZS5nZW4nO1xuZXhwb3J0ICogZnJvbSAnLi9wYi9kZWNlbnRyYWxhbmQvc2RrL2NvbXBvbmVudHMvbWF0ZXJpYWwuZ2VuJztcbmV4cG9ydCAqIGZyb20gJy4vcGIvZGVjZW50cmFsYW5kL3Nkay9jb21wb25lbnRzL21lc2hfY29sbGlkZXIuZ2VuJztcbmV4cG9ydCAqIGZyb20gJy4vcGIvZGVjZW50cmFsYW5kL3Nkay9jb21wb25lbnRzL21lc2hfcmVuZGVyZXIuZ2VuJztcbmV4cG9ydCAqIGZyb20gJy4vcGIvZGVjZW50cmFsYW5kL3Nkay9jb21wb25lbnRzL25mdF9zaGFwZS5nZW4nO1xuZXhwb3J0ICogZnJvbSAnLi9wYi9kZWNlbnRyYWxhbmQvc2RrL2NvbXBvbmVudHMvcG9pbnRlcl9ldmVudHMuZ2VuJztcbmV4cG9ydCAqIGZyb20gJy4vcGIvZGVjZW50cmFsYW5kL3Nkay9jb21wb25lbnRzL3BvaW50ZXJfZXZlbnRzX3Jlc3VsdC5nZW4nO1xuZXhwb3J0ICogZnJvbSAnLi9wYi9kZWNlbnRyYWxhbmQvc2RrL2NvbXBvbmVudHMvcG9pbnRlcl9sb2NrLmdlbic7XG5leHBvcnQgKiBmcm9tICcuL3BiL2RlY2VudHJhbGFuZC9zZGsvY29tcG9uZW50cy9yYXljYXN0Lmdlbic7XG5leHBvcnQgKiBmcm9tICcuL3BiL2RlY2VudHJhbGFuZC9zZGsvY29tcG9uZW50cy9yYXljYXN0X3Jlc3VsdC5nZW4nO1xuZXhwb3J0ICogZnJvbSAnLi9wYi9kZWNlbnRyYWxhbmQvc2RrL2NvbXBvbmVudHMvdGV4dF9zaGFwZS5nZW4nO1xuZXhwb3J0ICogZnJvbSAnLi9wYi9kZWNlbnRyYWxhbmQvc2RrL2NvbXBvbmVudHMvdHdlZW4uZ2VuJztcbmV4cG9ydCAqIGZyb20gJy4vcGIvZGVjZW50cmFsYW5kL3Nkay9jb21wb25lbnRzL3R3ZWVuX3NlcXVlbmNlLmdlbic7XG5leHBvcnQgKiBmcm9tICcuL3BiL2RlY2VudHJhbGFuZC9zZGsvY29tcG9uZW50cy90d2Vlbl9zdGF0ZS5nZW4nO1xuZXhwb3J0ICogZnJvbSAnLi9wYi9kZWNlbnRyYWxhbmQvc2RrL2NvbXBvbmVudHMvdWlfYmFja2dyb3VuZC5nZW4nO1xuZXhwb3J0ICogZnJvbSAnLi9wYi9kZWNlbnRyYWxhbmQvc2RrL2NvbXBvbmVudHMvdWlfY2FudmFzX2luZm9ybWF0aW9uLmdlbic7XG5leHBvcnQgKiBmcm9tICcuL3BiL2RlY2VudHJhbGFuZC9zZGsvY29tcG9uZW50cy91aV9kcm9wZG93bi5nZW4nO1xuZXhwb3J0ICogZnJvbSAnLi9wYi9kZWNlbnRyYWxhbmQvc2RrL2NvbXBvbmVudHMvdWlfZHJvcGRvd25fcmVzdWx0Lmdlbic7XG5leHBvcnQgKiBmcm9tICcuL3BiL2RlY2VudHJhbGFuZC9zZGsvY29tcG9uZW50cy91aV9pbnB1dC5nZW4nO1xuZXhwb3J0ICogZnJvbSAnLi9wYi9kZWNlbnRyYWxhbmQvc2RrL2NvbXBvbmVudHMvdWlfaW5wdXRfcmVzdWx0Lmdlbic7XG5leHBvcnQgKiBmcm9tICcuL3BiL2RlY2VudHJhbGFuZC9zZGsvY29tcG9uZW50cy91aV90ZXh0Lmdlbic7XG5leHBvcnQgKiBmcm9tICcuL3BiL2RlY2VudHJhbGFuZC9zZGsvY29tcG9uZW50cy91aV90cmFuc2Zvcm0uZ2VuJztcbmV4cG9ydCAqIGZyb20gJy4vcGIvZGVjZW50cmFsYW5kL3Nkay9jb21wb25lbnRzL3ZpZGVvX2V2ZW50Lmdlbic7XG5leHBvcnQgKiBmcm9tICcuL3BiL2RlY2VudHJhbGFuZC9zZGsvY29tcG9uZW50cy92aWRlb19wbGF5ZXIuZ2VuJztcbmV4cG9ydCAqIGZyb20gJy4vcGIvZGVjZW50cmFsYW5kL3Nkay9jb21wb25lbnRzL3Zpc2liaWxpdHlfY29tcG9uZW50Lmdlbic7XG4vKiogQHB1YmxpYyAqLyBleHBvcnQgY29uc3QgQW5pbWF0b3IgPSBlbmdpbmUgPT4gXG4vKiBAX19QVVJFX18gKi8gZW5naW5lLmRlZmluZUNvbXBvbmVudEZyb21TY2hlbWEoXCJjb3JlOjpBbmltYXRvclwiLCBBbmltYXRvclNjaGVtYSk7XG4vKiogQHB1YmxpYyAqLyBleHBvcnQgY29uc3QgQXVkaW9Tb3VyY2UgPSBlbmdpbmUgPT4gXG4vKiBAX19QVVJFX18gKi8gZW5naW5lLmRlZmluZUNvbXBvbmVudEZyb21TY2hlbWEoXCJjb3JlOjpBdWRpb1NvdXJjZVwiLCBBdWRpb1NvdXJjZVNjaGVtYSk7XG4vKiogQHB1YmxpYyAqLyBleHBvcnQgY29uc3QgQXVkaW9TdHJlYW0gPSBlbmdpbmUgPT4gXG4vKiBAX19QVVJFX18gKi8gZW5naW5lLmRlZmluZUNvbXBvbmVudEZyb21TY2hlbWEoXCJjb3JlOjpBdWRpb1N0cmVhbVwiLCBBdWRpb1N0cmVhbVNjaGVtYSk7XG4vKiogQHB1YmxpYyAqLyBleHBvcnQgY29uc3QgQXZhdGFyQXR0YWNoID0gZW5naW5lID0+IFxuLyogQF9fUFVSRV9fICovIGVuZ2luZS5kZWZpbmVDb21wb25lbnRGcm9tU2NoZW1hKFwiY29yZTo6QXZhdGFyQXR0YWNoXCIsIEF2YXRhckF0dGFjaFNjaGVtYSk7XG4vKiogQHB1YmxpYyAqLyBleHBvcnQgY29uc3QgQXZhdGFyTW9kaWZpZXJBcmVhID0gZW5naW5lID0+IFxuLyogQF9fUFVSRV9fICovIGVuZ2luZS5kZWZpbmVDb21wb25lbnRGcm9tU2NoZW1hKFwiY29yZTo6QXZhdGFyTW9kaWZpZXJBcmVhXCIsIEF2YXRhck1vZGlmaWVyQXJlYVNjaGVtYSk7XG4vKiogQHB1YmxpYyAqLyBleHBvcnQgY29uc3QgQXZhdGFyU2hhcGUgPSBlbmdpbmUgPT4gXG4vKiBAX19QVVJFX18gKi8gZW5naW5lLmRlZmluZUNvbXBvbmVudEZyb21TY2hlbWEoXCJjb3JlOjpBdmF0YXJTaGFwZVwiLCBBdmF0YXJTaGFwZVNjaGVtYSk7XG4vKiogQHB1YmxpYyAqLyBleHBvcnQgY29uc3QgQmlsbGJvYXJkID0gZW5naW5lID0+IFxuLyogQF9fUFVSRV9fICovIGVuZ2luZS5kZWZpbmVDb21wb25lbnRGcm9tU2NoZW1hKFwiY29yZTo6QmlsbGJvYXJkXCIsIEJpbGxib2FyZFNjaGVtYSk7XG4vKiogQHB1YmxpYyAqLyBleHBvcnQgY29uc3QgQ2FtZXJhTW9kZSA9IGVuZ2luZSA9PiBcbi8qIEBfX1BVUkVfXyAqLyBlbmdpbmUuZGVmaW5lQ29tcG9uZW50RnJvbVNjaGVtYShcImNvcmU6OkNhbWVyYU1vZGVcIiwgQ2FtZXJhTW9kZVNjaGVtYSk7XG4vKiogQHB1YmxpYyAqLyBleHBvcnQgY29uc3QgQ2FtZXJhTW9kZUFyZWEgPSBlbmdpbmUgPT4gXG4vKiBAX19QVVJFX18gKi8gZW5naW5lLmRlZmluZUNvbXBvbmVudEZyb21TY2hlbWEoXCJjb3JlOjpDYW1lcmFNb2RlQXJlYVwiLCBDYW1lcmFNb2RlQXJlYVNjaGVtYSk7XG4vKiogQHB1YmxpYyAqLyBleHBvcnQgY29uc3QgRW5naW5lSW5mbyA9IGVuZ2luZSA9PiBcbi8qIEBfX1BVUkVfXyAqLyBlbmdpbmUuZGVmaW5lQ29tcG9uZW50RnJvbVNjaGVtYShcImNvcmU6OkVuZ2luZUluZm9cIiwgRW5naW5lSW5mb1NjaGVtYSk7XG4vKiogQHB1YmxpYyAqLyBleHBvcnQgY29uc3QgR2x0ZkNvbnRhaW5lciA9IGVuZ2luZSA9PiBcbi8qIEBfX1BVUkVfXyAqLyBlbmdpbmUuZGVmaW5lQ29tcG9uZW50RnJvbVNjaGVtYShcImNvcmU6OkdsdGZDb250YWluZXJcIiwgR2x0ZkNvbnRhaW5lclNjaGVtYSk7XG4vKiogQHB1YmxpYyAqLyBleHBvcnQgY29uc3QgR2x0ZkNvbnRhaW5lckxvYWRpbmdTdGF0ZSA9IGVuZ2luZSA9PiBcbi8qIEBfX1BVUkVfXyAqLyBlbmdpbmUuZGVmaW5lQ29tcG9uZW50RnJvbVNjaGVtYShcImNvcmU6OkdsdGZDb250YWluZXJMb2FkaW5nU3RhdGVcIiwgR2x0ZkNvbnRhaW5lckxvYWRpbmdTdGF0ZVNjaGVtYSk7XG4vKiogQHB1YmxpYyAqLyBleHBvcnQgY29uc3QgTWF0ZXJpYWwgPSBlbmdpbmUgPT4gXG4vKiBAX19QVVJFX18gKi8gZW5naW5lLmRlZmluZUNvbXBvbmVudEZyb21TY2hlbWEoXCJjb3JlOjpNYXRlcmlhbFwiLCBNYXRlcmlhbFNjaGVtYSk7XG4vKiogQHB1YmxpYyAqLyBleHBvcnQgY29uc3QgTWVzaENvbGxpZGVyID0gZW5naW5lID0+IFxuLyogQF9fUFVSRV9fICovIGVuZ2luZS5kZWZpbmVDb21wb25lbnRGcm9tU2NoZW1hKFwiY29yZTo6TWVzaENvbGxpZGVyXCIsIE1lc2hDb2xsaWRlclNjaGVtYSk7XG4vKiogQHB1YmxpYyAqLyBleHBvcnQgY29uc3QgTWVzaFJlbmRlcmVyID0gZW5naW5lID0+IFxuLyogQF9fUFVSRV9fICovIGVuZ2luZS5kZWZpbmVDb21wb25lbnRGcm9tU2NoZW1hKFwiY29yZTo6TWVzaFJlbmRlcmVyXCIsIE1lc2hSZW5kZXJlclNjaGVtYSk7XG4vKiogQHB1YmxpYyAqLyBleHBvcnQgY29uc3QgTmZ0U2hhcGUgPSBlbmdpbmUgPT4gXG4vKiBAX19QVVJFX18gKi8gZW5naW5lLmRlZmluZUNvbXBvbmVudEZyb21TY2hlbWEoXCJjb3JlOjpOZnRTaGFwZVwiLCBOZnRTaGFwZVNjaGVtYSk7XG4vKiogQHB1YmxpYyAqLyBleHBvcnQgY29uc3QgUG9pbnRlckV2ZW50cyA9IGVuZ2luZSA9PiBcbi8qIEBfX1BVUkVfXyAqLyBlbmdpbmUuZGVmaW5lQ29tcG9uZW50RnJvbVNjaGVtYShcImNvcmU6OlBvaW50ZXJFdmVudHNcIiwgUG9pbnRlckV2ZW50c1NjaGVtYSk7XG4vKiogQHB1YmxpYyAqLyBleHBvcnQgY29uc3QgUG9pbnRlckV2ZW50c1Jlc3VsdCA9IChlbmdpbmUpID0+IC8qIEBfX1BVUkVfXyAqLyBlbmdpbmUuZGVmaW5lVmFsdWVTZXRDb21wb25lbnRGcm9tU2NoZW1hKFwiY29yZTo6UG9pbnRlckV2ZW50c1Jlc3VsdFwiLCBQb2ludGVyRXZlbnRzUmVzdWx0U2NoZW1hLCB7XG4gICAgdGltZXN0YW1wRnVuY3Rpb246ICh0KSA9PiB0LnRpbWVzdGFtcCxcbiAgICBtYXhFbGVtZW50czogMTAwXG59KTtcbi8qKiBAcHVibGljICovIGV4cG9ydCBjb25zdCBQb2ludGVyTG9jayA9IGVuZ2luZSA9PiBcbi8qIEBfX1BVUkVfXyAqLyBlbmdpbmUuZGVmaW5lQ29tcG9uZW50RnJvbVNjaGVtYShcImNvcmU6OlBvaW50ZXJMb2NrXCIsIFBvaW50ZXJMb2NrU2NoZW1hKTtcbi8qKiBAcHVibGljICovIGV4cG9ydCBjb25zdCBSYXljYXN0ID0gZW5naW5lID0+IFxuLyogQF9fUFVSRV9fICovIGVuZ2luZS5kZWZpbmVDb21wb25lbnRGcm9tU2NoZW1hKFwiY29yZTo6UmF5Y2FzdFwiLCBSYXljYXN0U2NoZW1hKTtcbi8qKiBAcHVibGljICovIGV4cG9ydCBjb25zdCBSYXljYXN0UmVzdWx0ID0gZW5naW5lID0+IFxuLyogQF9fUFVSRV9fICovIGVuZ2luZS5kZWZpbmVDb21wb25lbnRGcm9tU2NoZW1hKFwiY29yZTo6UmF5Y2FzdFJlc3VsdFwiLCBSYXljYXN0UmVzdWx0U2NoZW1hKTtcbi8qKiBAcHVibGljICovIGV4cG9ydCBjb25zdCBUZXh0U2hhcGUgPSBlbmdpbmUgPT4gXG4vKiBAX19QVVJFX18gKi8gZW5naW5lLmRlZmluZUNvbXBvbmVudEZyb21TY2hlbWEoXCJjb3JlOjpUZXh0U2hhcGVcIiwgVGV4dFNoYXBlU2NoZW1hKTtcbi8qKiBAcHVibGljICovIGV4cG9ydCBjb25zdCBUd2VlbiA9IGVuZ2luZSA9PiBcbi8qIEBfX1BVUkVfXyAqLyBlbmdpbmUuZGVmaW5lQ29tcG9uZW50RnJvbVNjaGVtYShcImNvcmU6OlR3ZWVuXCIsIFR3ZWVuU2NoZW1hKTtcbi8qKiBAcHVibGljICovIGV4cG9ydCBjb25zdCBUd2VlblNlcXVlbmNlID0gZW5naW5lID0+IFxuLyogQF9fUFVSRV9fICovIGVuZ2luZS5kZWZpbmVDb21wb25lbnRGcm9tU2NoZW1hKFwiY29yZTo6VHdlZW5TZXF1ZW5jZVwiLCBUd2VlblNlcXVlbmNlU2NoZW1hKTtcbi8qKiBAcHVibGljICovIGV4cG9ydCBjb25zdCBUd2VlblN0YXRlID0gZW5naW5lID0+IFxuLyogQF9fUFVSRV9fICovIGVuZ2luZS5kZWZpbmVDb21wb25lbnRGcm9tU2NoZW1hKFwiY29yZTo6VHdlZW5TdGF0ZVwiLCBUd2VlblN0YXRlU2NoZW1hKTtcbi8qKiBAcHVibGljICovIGV4cG9ydCBjb25zdCBVaUJhY2tncm91bmQgPSBlbmdpbmUgPT4gXG4vKiBAX19QVVJFX18gKi8gZW5naW5lLmRlZmluZUNvbXBvbmVudEZyb21TY2hlbWEoXCJjb3JlOjpVaUJhY2tncm91bmRcIiwgVWlCYWNrZ3JvdW5kU2NoZW1hKTtcbi8qKiBAcHVibGljICovIGV4cG9ydCBjb25zdCBVaUNhbnZhc0luZm9ybWF0aW9uID0gZW5naW5lID0+IFxuLyogQF9fUFVSRV9fICovIGVuZ2luZS5kZWZpbmVDb21wb25lbnRGcm9tU2NoZW1hKFwiY29yZTo6VWlDYW52YXNJbmZvcm1hdGlvblwiLCBVaUNhbnZhc0luZm9ybWF0aW9uU2NoZW1hKTtcbi8qKiBAcHVibGljICovIGV4cG9ydCBjb25zdCBVaURyb3Bkb3duID0gZW5naW5lID0+IFxuLyogQF9fUFVSRV9fICovIGVuZ2luZS5kZWZpbmVDb21wb25lbnRGcm9tU2NoZW1hKFwiY29yZTo6VWlEcm9wZG93blwiLCBVaURyb3Bkb3duU2NoZW1hKTtcbi8qKiBAcHVibGljICovIGV4cG9ydCBjb25zdCBVaURyb3Bkb3duUmVzdWx0ID0gZW5naW5lID0+IFxuLyogQF9fUFVSRV9fICovIGVuZ2luZS5kZWZpbmVDb21wb25lbnRGcm9tU2NoZW1hKFwiY29yZTo6VWlEcm9wZG93blJlc3VsdFwiLCBVaURyb3Bkb3duUmVzdWx0U2NoZW1hKTtcbi8qKiBAcHVibGljICovIGV4cG9ydCBjb25zdCBVaUlucHV0ID0gZW5naW5lID0+IFxuLyogQF9fUFVSRV9fICovIGVuZ2luZS5kZWZpbmVDb21wb25lbnRGcm9tU2NoZW1hKFwiY29yZTo6VWlJbnB1dFwiLCBVaUlucHV0U2NoZW1hKTtcbi8qKiBAcHVibGljICovIGV4cG9ydCBjb25zdCBVaUlucHV0UmVzdWx0ID0gZW5naW5lID0+IFxuLyogQF9fUFVSRV9fICovIGVuZ2luZS5kZWZpbmVDb21wb25lbnRGcm9tU2NoZW1hKFwiY29yZTo6VWlJbnB1dFJlc3VsdFwiLCBVaUlucHV0UmVzdWx0U2NoZW1hKTtcbi8qKiBAcHVibGljICovIGV4cG9ydCBjb25zdCBVaVRleHQgPSBlbmdpbmUgPT4gXG4vKiBAX19QVVJFX18gKi8gZW5naW5lLmRlZmluZUNvbXBvbmVudEZyb21TY2hlbWEoXCJjb3JlOjpVaVRleHRcIiwgVWlUZXh0U2NoZW1hKTtcbi8qKiBAcHVibGljICovIGV4cG9ydCBjb25zdCBVaVRyYW5zZm9ybSA9IGVuZ2luZSA9PiBcbi8qIEBfX1BVUkVfXyAqLyBlbmdpbmUuZGVmaW5lQ29tcG9uZW50RnJvbVNjaGVtYShcImNvcmU6OlVpVHJhbnNmb3JtXCIsIFVpVHJhbnNmb3JtU2NoZW1hKTtcbi8qKiBAcHVibGljICovIGV4cG9ydCBjb25zdCBWaWRlb0V2ZW50ID0gKGVuZ2luZSkgPT4gLyogQF9fUFVSRV9fICovIGVuZ2luZS5kZWZpbmVWYWx1ZVNldENvbXBvbmVudEZyb21TY2hlbWEoXCJjb3JlOjpWaWRlb0V2ZW50XCIsIFZpZGVvRXZlbnRTY2hlbWEsIHtcbiAgICB0aW1lc3RhbXBGdW5jdGlvbjogKHQpID0+IHQudGltZXN0YW1wLFxuICAgIG1heEVsZW1lbnRzOiAxMDBcbn0pO1xuLyoqIEBwdWJsaWMgKi8gZXhwb3J0IGNvbnN0IFZpZGVvUGxheWVyID0gZW5naW5lID0+IFxuLyogQF9fUFVSRV9fICovIGVuZ2luZS5kZWZpbmVDb21wb25lbnRGcm9tU2NoZW1hKFwiY29yZTo6VmlkZW9QbGF5ZXJcIiwgVmlkZW9QbGF5ZXJTY2hlbWEpO1xuLyoqIEBwdWJsaWMgKi8gZXhwb3J0IGNvbnN0IFZpc2liaWxpdHlDb21wb25lbnQgPSBlbmdpbmUgPT4gXG4vKiBAX19QVVJFX18gKi8gZW5naW5lLmRlZmluZUNvbXBvbmVudEZyb21TY2hlbWEoXCJjb3JlOjpWaXNpYmlsaXR5Q29tcG9uZW50XCIsIFZpc2liaWxpdHlDb21wb25lbnRTY2hlbWEpO1xuLyoqIHB1YmxpYyAqL1xuZXhwb3J0IGNvbnN0IGNvbXBvbmVudERlZmluaXRpb25CeU5hbWUgPSAvKiBAX19QVVJFX18gKi8ge1xuICAgIFwiY29yZTo6QW5pbWF0b3JcIjogQW5pbWF0b3IsXG4gICAgXCJjb3JlOjpBdWRpb1NvdXJjZVwiOiBBdWRpb1NvdXJjZSxcbiAgICBcImNvcmU6OkF1ZGlvU3RyZWFtXCI6IEF1ZGlvU3RyZWFtLFxuICAgIFwiY29yZTo6QXZhdGFyQXR0YWNoXCI6IEF2YXRhckF0dGFjaCxcbiAgICBcImNvcmU6OkF2YXRhck1vZGlmaWVyQXJlYVwiOiBBdmF0YXJNb2RpZmllckFyZWEsXG4gICAgXCJjb3JlOjpBdmF0YXJTaGFwZVwiOiBBdmF0YXJTaGFwZSxcbiAgICBcImNvcmU6OkJpbGxib2FyZFwiOiBCaWxsYm9hcmQsXG4gICAgXCJjb3JlOjpDYW1lcmFNb2RlXCI6IENhbWVyYU1vZGUsXG4gICAgXCJjb3JlOjpDYW1lcmFNb2RlQXJlYVwiOiBDYW1lcmFNb2RlQXJlYSxcbiAgICBcImNvcmU6OkVuZ2luZUluZm9cIjogRW5naW5lSW5mbyxcbiAgICBcImNvcmU6OkdsdGZDb250YWluZXJcIjogR2x0ZkNvbnRhaW5lcixcbiAgICBcImNvcmU6OkdsdGZDb250YWluZXJMb2FkaW5nU3RhdGVcIjogR2x0ZkNvbnRhaW5lckxvYWRpbmdTdGF0ZSxcbiAgICBcImNvcmU6Ok1hdGVyaWFsXCI6IE1hdGVyaWFsLFxuICAgIFwiY29yZTo6TWVzaENvbGxpZGVyXCI6IE1lc2hDb2xsaWRlcixcbiAgICBcImNvcmU6Ok1lc2hSZW5kZXJlclwiOiBNZXNoUmVuZGVyZXIsXG4gICAgXCJjb3JlOjpOZnRTaGFwZVwiOiBOZnRTaGFwZSxcbiAgICBcImNvcmU6OlBvaW50ZXJFdmVudHNcIjogUG9pbnRlckV2ZW50cyxcbiAgICBcImNvcmU6OlBvaW50ZXJFdmVudHNSZXN1bHRcIjogUG9pbnRlckV2ZW50c1Jlc3VsdCxcbiAgICBcImNvcmU6OlBvaW50ZXJMb2NrXCI6IFBvaW50ZXJMb2NrLFxuICAgIFwiY29yZTo6UmF5Y2FzdFwiOiBSYXljYXN0LFxuICAgIFwiY29yZTo6UmF5Y2FzdFJlc3VsdFwiOiBSYXljYXN0UmVzdWx0LFxuICAgIFwiY29yZTo6VGV4dFNoYXBlXCI6IFRleHRTaGFwZSxcbiAgICBcImNvcmU6OlR3ZWVuXCI6IFR3ZWVuLFxuICAgIFwiY29yZTo6VHdlZW5TZXF1ZW5jZVwiOiBUd2VlblNlcXVlbmNlLFxuICAgIFwiY29yZTo6VHdlZW5TdGF0ZVwiOiBUd2VlblN0YXRlLFxuICAgIFwiY29yZTo6VWlCYWNrZ3JvdW5kXCI6IFVpQmFja2dyb3VuZCxcbiAgICBcImNvcmU6OlVpQ2FudmFzSW5mb3JtYXRpb25cIjogVWlDYW52YXNJbmZvcm1hdGlvbixcbiAgICBcImNvcmU6OlVpRHJvcGRvd25cIjogVWlEcm9wZG93bixcbiAgICBcImNvcmU6OlVpRHJvcGRvd25SZXN1bHRcIjogVWlEcm9wZG93blJlc3VsdCxcbiAgICBcImNvcmU6OlVpSW5wdXRcIjogVWlJbnB1dCxcbiAgICBcImNvcmU6OlVpSW5wdXRSZXN1bHRcIjogVWlJbnB1dFJlc3VsdCxcbiAgICBcImNvcmU6OlVpVGV4dFwiOiBVaVRleHQsXG4gICAgXCJjb3JlOjpVaVRyYW5zZm9ybVwiOiBVaVRyYW5zZm9ybSxcbiAgICBcImNvcmU6OlZpZGVvRXZlbnRcIjogVmlkZW9FdmVudCxcbiAgICBcImNvcmU6OlZpZGVvUGxheWVyXCI6IFZpZGVvUGxheWVyLFxuICAgIFwiY29yZTo6VmlzaWJpbGl0eUNvbXBvbmVudFwiOiBWaXNpYmlsaXR5Q29tcG9uZW50LFxufTtcbiIsICJpbXBvcnQgeyBBbmltYXRvciB9IGZyb20gJy4uL2dlbmVyYXRlZC9pbmRleC5nZW4nO1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZUFuaW1hdG9yQ29tcG9uZW50KGVuZ2luZSkge1xuICAgIGNvbnN0IHRoZUNvbXBvbmVudCA9IEFuaW1hdG9yKGVuZ2luZSk7XG4gICAgLyoqXG4gICAgICogQHJldHVybnMgVGhlIHR1cGxlIFthbmltYXRvciwgY2xpcF1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRDbGlwQW5kQW5pbWF0b3IoZW50aXR5LCBjbGlwTmFtZSkge1xuICAgICAgICBjb25zdCBhbmltID0gdGhlQ29tcG9uZW50LmdldE11dGFibGVPck51bGwoZW50aXR5KTtcbiAgICAgICAgaWYgKCFhbmltKVxuICAgICAgICAgICAgcmV0dXJuIFtudWxsLCBudWxsXTtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSBhbmltLnN0YXRlcy5maW5kKChpdGVtKSA9PiBpdGVtLmNsaXAgPT09IGNsaXBOYW1lKTtcbiAgICAgICAgaWYgKCFzdGF0ZSlcbiAgICAgICAgICAgIHJldHVybiBbYW5pbSwgbnVsbF07XG4gICAgICAgIHJldHVybiBbYW5pbSwgc3RhdGVdO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICAuLi50aGVDb21wb25lbnQsXG4gICAgICAgIGdldENsaXBPck51bGwoZW50aXR5LCBjbGlwTmFtZSkge1xuICAgICAgICAgICAgY29uc3QgW18sIHN0YXRlXSA9IGdldENsaXBBbmRBbmltYXRvcihlbnRpdHksIGNsaXBOYW1lKTtcbiAgICAgICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0Q2xpcChlbnRpdHksIGNsaXBOYW1lKSB7XG4gICAgICAgICAgICBjb25zdCBbYW5pbWF0b3IsIHN0YXRlXSA9IGdldENsaXBBbmRBbmltYXRvcihlbnRpdHksIGNsaXBOYW1lKTtcbiAgICAgICAgICAgIGlmICghYW5pbWF0b3IpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZXJlIGlzIG5vIEFuaW1hdG9yIGZvdW5kIGluIHRoZSBlbnRpdHkgJHtlbnRpdHl9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXN0YXRlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgQW5pbWF0b3IgY29tcG9uZW50IG9mICR7ZW50aXR5fSBoYXMgbm8gdGhlIHN0YXRlICR7Y2xpcE5hbWV9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgICAgIH0sXG4gICAgICAgIHBsYXlTaW5nbGVBbmltYXRpb24oZW50aXR5LCBjbGlwTmFtZSwgc2hvdWxkUmVzZXQgPSB0cnVlKSB7XG4gICAgICAgICAgICBjb25zdCBbYW5pbWF0b3IsIHN0YXRlXSA9IGdldENsaXBBbmRBbmltYXRvcihlbnRpdHksIGNsaXBOYW1lKTtcbiAgICAgICAgICAgIGlmICghYW5pbWF0b3IgfHwgIXN0YXRlKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIC8vIFJlc2V0IGFsbCBvdGhlciBhbmltYXRpb25zXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHN0YXRlIG9mIGFuaW1hdG9yLnN0YXRlcykge1xuICAgICAgICAgICAgICAgIHN0YXRlLnBsYXlpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBzdGF0ZS5zaG91bGRSZXNldCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdGF0ZS5wbGF5aW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIHN0YXRlLnNob3VsZFJlc2V0ID0gc2hvdWxkUmVzZXQ7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSxcbiAgICAgICAgc3RvcEFsbEFuaW1hdGlvbnMoZW50aXR5LCByZXNldEN1cnNvciA9IHRydWUpIHtcbiAgICAgICAgICAgIC8vIEdldCB0aGUgbXV0YWJsZSB0byBtb2RpZnlpbmdcbiAgICAgICAgICAgIGNvbnN0IGFuaW1hdG9yID0gdGhlQ29tcG9uZW50LmdldE11dGFibGVPck51bGwoZW50aXR5KTtcbiAgICAgICAgICAgIGlmICghYW5pbWF0b3IpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgLy8gUmVzZXQgYWxsIG90aGVyIGFuaW1hdGlvbnNcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3RhdGUgb2YgYW5pbWF0b3Iuc3RhdGVzKSB7XG4gICAgICAgICAgICAgICAgc3RhdGUucGxheWluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHN0YXRlLnNob3VsZFJlc2V0ID0gcmVzZXRDdXJzb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH07XG59XG4iLCAiaW1wb3J0IHsgTWF0ZXJpYWwgfSBmcm9tICcuLi9nZW5lcmF0ZWQvaW5kZXguZ2VuJztcbmNvbnN0IFRleHR1cmVIZWxwZXIgPSB7XG4gICAgQ29tbW9uKHRleHR1cmUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRleDoge1xuICAgICAgICAgICAgICAgICRjYXNlOiAndGV4dHVyZScsXG4gICAgICAgICAgICAgICAgdGV4dHVyZVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH0sXG4gICAgQXZhdGFyKGF2YXRhclRleHR1cmUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRleDoge1xuICAgICAgICAgICAgICAgICRjYXNlOiAnYXZhdGFyVGV4dHVyZScsXG4gICAgICAgICAgICAgICAgYXZhdGFyVGV4dHVyZVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH0sXG4gICAgVmlkZW8odmlkZW9UZXh0dXJlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0ZXg6IHtcbiAgICAgICAgICAgICAgICAkY2FzZTogJ3ZpZGVvVGV4dHVyZScsXG4gICAgICAgICAgICAgICAgdmlkZW9UZXh0dXJlXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxufTtcbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVNYXRlcmlhbENvbXBvbmVudChlbmdpbmUpIHtcbiAgICBjb25zdCB0aGVDb21wb25lbnQgPSBNYXRlcmlhbChlbmdpbmUpO1xuICAgIHJldHVybiB7XG4gICAgICAgIC4uLnRoZUNvbXBvbmVudCxcbiAgICAgICAgVGV4dHVyZTogVGV4dHVyZUhlbHBlcixcbiAgICAgICAgc2V0QmFzaWNNYXRlcmlhbChlbnRpdHksIG1hdGVyaWFsKSB7XG4gICAgICAgICAgICB0aGVDb21wb25lbnQuY3JlYXRlT3JSZXBsYWNlKGVudGl0eSwge1xuICAgICAgICAgICAgICAgIG1hdGVyaWFsOiB7XG4gICAgICAgICAgICAgICAgICAgICRjYXNlOiAndW5saXQnLFxuICAgICAgICAgICAgICAgICAgICB1bmxpdDogbWF0ZXJpYWxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0UGJyTWF0ZXJpYWwoZW50aXR5LCBtYXRlcmlhbCkge1xuICAgICAgICAgICAgdGhlQ29tcG9uZW50LmNyZWF0ZU9yUmVwbGFjZShlbnRpdHksIHtcbiAgICAgICAgICAgICAgICBtYXRlcmlhbDoge1xuICAgICAgICAgICAgICAgICAgICAkY2FzZTogJ3BicicsXG4gICAgICAgICAgICAgICAgICAgIHBicjogbWF0ZXJpYWxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG59XG4iLCAiaW1wb3J0IHsgTWVzaENvbGxpZGVyIH0gZnJvbSAnLi4vZ2VuZXJhdGVkL2luZGV4Lmdlbic7XG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lTWVzaENvbGxpZGVyQ29tcG9uZW50KGVuZ2luZSkge1xuICAgIGNvbnN0IHRoZUNvbXBvbmVudCA9IE1lc2hDb2xsaWRlcihlbmdpbmUpO1xuICAgIGZ1bmN0aW9uIGdldENvbGxpc2lvbk1hc2sobGF5ZXJzKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGxheWVycykpIHtcbiAgICAgICAgICAgIHJldHVybiBsYXllcnMubWFwKChpdGVtKSA9PiBpdGVtKS5yZWR1Y2UoKHByZXYsIGl0ZW0pID0+IHByZXYgfCBpdGVtLCAwKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChsYXllcnMpIHtcbiAgICAgICAgICAgIHJldHVybiBsYXllcnM7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgLi4udGhlQ29tcG9uZW50LFxuICAgICAgICBzZXRCb3goZW50aXR5LCBjb2xsaWRlckxheWVycykge1xuICAgICAgICAgICAgdGhlQ29tcG9uZW50LmNyZWF0ZU9yUmVwbGFjZShlbnRpdHksIHtcbiAgICAgICAgICAgICAgICBtZXNoOiB7ICRjYXNlOiAnYm94JywgYm94OiB7fSB9LFxuICAgICAgICAgICAgICAgIGNvbGxpc2lvbk1hc2s6IGdldENvbGxpc2lvbk1hc2soY29sbGlkZXJMYXllcnMpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0UGxhbmUoZW50aXR5LCBjb2xsaWRlckxheWVycykge1xuICAgICAgICAgICAgdGhlQ29tcG9uZW50LmNyZWF0ZU9yUmVwbGFjZShlbnRpdHksIHtcbiAgICAgICAgICAgICAgICBtZXNoOiB7ICRjYXNlOiAncGxhbmUnLCBwbGFuZToge30gfSxcbiAgICAgICAgICAgICAgICBjb2xsaXNpb25NYXNrOiBnZXRDb2xsaXNpb25NYXNrKGNvbGxpZGVyTGF5ZXJzKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIHNldEN5bGluZGVyKGVudGl0eSwgcmFkaXVzQm90dG9tLCByYWRpdXNUb3AsIGNvbGxpZGVyTGF5ZXJzKSB7XG4gICAgICAgICAgICB0aGVDb21wb25lbnQuY3JlYXRlT3JSZXBsYWNlKGVudGl0eSwge1xuICAgICAgICAgICAgICAgIG1lc2g6IHsgJGNhc2U6ICdjeWxpbmRlcicsIGN5bGluZGVyOiB7IHJhZGl1c0JvdHRvbSwgcmFkaXVzVG9wIH0gfSxcbiAgICAgICAgICAgICAgICBjb2xsaXNpb25NYXNrOiBnZXRDb2xsaXNpb25NYXNrKGNvbGxpZGVyTGF5ZXJzKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIHNldFNwaGVyZShlbnRpdHksIGNvbGxpZGVyTGF5ZXJzKSB7XG4gICAgICAgICAgICB0aGVDb21wb25lbnQuY3JlYXRlT3JSZXBsYWNlKGVudGl0eSwge1xuICAgICAgICAgICAgICAgIG1lc2g6IHsgJGNhc2U6ICdzcGhlcmUnLCBzcGhlcmU6IHt9IH0sXG4gICAgICAgICAgICAgICAgY29sbGlzaW9uTWFzazogZ2V0Q29sbGlzaW9uTWFzayhjb2xsaWRlckxheWVycylcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbn1cbiIsICJpbXBvcnQgeyBNZXNoUmVuZGVyZXIgfSBmcm9tICcuLi9nZW5lcmF0ZWQvaW5kZXguZ2VuJztcbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVNZXNoUmVuZGVyZXJDb21wb25lbnQoZW5naW5lKSB7XG4gICAgY29uc3QgdGhlQ29tcG9uZW50ID0gTWVzaFJlbmRlcmVyKGVuZ2luZSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgLi4udGhlQ29tcG9uZW50LFxuICAgICAgICBzZXRCb3goZW50aXR5LCB1dnMpIHtcbiAgICAgICAgICAgIHRoZUNvbXBvbmVudC5jcmVhdGVPclJlcGxhY2UoZW50aXR5LCB7XG4gICAgICAgICAgICAgICAgbWVzaDogeyAkY2FzZTogJ2JveCcsIGJveDogeyB1dnM6IHV2cyB8fCBbXSB9IH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBzZXRQbGFuZShlbnRpdHksIHV2cykge1xuICAgICAgICAgICAgdGhlQ29tcG9uZW50LmNyZWF0ZU9yUmVwbGFjZShlbnRpdHksIHtcbiAgICAgICAgICAgICAgICBtZXNoOiB7ICRjYXNlOiAncGxhbmUnLCBwbGFuZTogeyB1dnM6IHV2cyB8fCBbXSB9IH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBzZXRDeWxpbmRlcihlbnRpdHksIHJhZGl1c0JvdHRvbSwgcmFkaXVzVG9wKSB7XG4gICAgICAgICAgICB0aGVDb21wb25lbnQuY3JlYXRlT3JSZXBsYWNlKGVudGl0eSwge1xuICAgICAgICAgICAgICAgIG1lc2g6IHsgJGNhc2U6ICdjeWxpbmRlcicsIGN5bGluZGVyOiB7IHJhZGl1c0JvdHRvbSwgcmFkaXVzVG9wIH0gfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIHNldFNwaGVyZShlbnRpdHkpIHtcbiAgICAgICAgICAgIHRoZUNvbXBvbmVudC5jcmVhdGVPclJlcGxhY2UoZW50aXR5LCB7XG4gICAgICAgICAgICAgICAgbWVzaDogeyAkY2FzZTogJ3NwaGVyZScsIHNwaGVyZToge30gfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuIiwgImltcG9ydCB7IFR3ZWVuIH0gZnJvbSAnLi4vZ2VuZXJhdGVkL2luZGV4Lmdlbic7XG5jb25zdCBUd2VlbkhlbHBlciA9IHtcbiAgICBNb3ZlKG1vdmUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICRjYXNlOiAnbW92ZScsXG4gICAgICAgICAgICBtb3ZlXG4gICAgICAgIH07XG4gICAgfSxcbiAgICBSb3RhdGUocm90YXRlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAkY2FzZTogJ3JvdGF0ZScsXG4gICAgICAgICAgICByb3RhdGVcbiAgICAgICAgfTtcbiAgICB9LFxuICAgIFNjYWxlKHNjYWxlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAkY2FzZTogJ3NjYWxlJyxcbiAgICAgICAgICAgIHNjYWxlXG4gICAgICAgIH07XG4gICAgfVxufTtcbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVUd2VlbkNvbXBvbmVudChlbmdpbmUpIHtcbiAgICBjb25zdCB0aGVDb21wb25lbnQgPSBUd2VlbihlbmdpbmUpO1xuICAgIHJldHVybiB7XG4gICAgICAgIC4uLnRoZUNvbXBvbmVudCxcbiAgICAgICAgTW9kZTogVHdlZW5IZWxwZXJcbiAgICB9O1xufVxuIiwgIi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBJQXJyYXkgPSAodHlwZSkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICAgIHNlcmlhbGl6ZSh2YWx1ZSwgYnVpbGRlcikge1xuICAgICAgICAgICAgYnVpbGRlci53cml0ZVVpbnQzMih2YWx1ZS5sZW5ndGgpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdHlwZS5zZXJpYWxpemUoaXRlbSwgYnVpbGRlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGRlc2VyaWFsaXplKHJlYWRlcikge1xuICAgICAgICAgICAgY29uc3QgbmV3QXJyYXkgPSBbXTtcbiAgICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IHJlYWRlci5yZWFkVWludDMyKCk7XG4gICAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgbmV3QXJyYXkucHVzaCh0eXBlLmRlc2VyaWFsaXplKHJlYWRlcikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5ld0FycmF5O1xuICAgICAgICB9LFxuICAgICAgICBjcmVhdGUoKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH0sXG4gICAgICAgIGpzb25TY2hlbWE6IHtcbiAgICAgICAgICAgIHR5cGU6ICdhcnJheScsXG4gICAgICAgICAgICBpdGVtczogdHlwZS5qc29uU2NoZW1hLFxuICAgICAgICAgICAgc2VyaWFsaXphdGlvblR5cGU6ICdhcnJheSdcbiAgICAgICAgfVxuICAgIH07XG59O1xuIiwgIi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBCb29sID0ge1xuICAgIHNlcmlhbGl6ZSh2YWx1ZSwgYnVpbGRlcikge1xuICAgICAgICBidWlsZGVyLndyaXRlSW50OCh2YWx1ZSA/IDEgOiAwKTtcbiAgICB9LFxuICAgIGRlc2VyaWFsaXplKHJlYWRlcikge1xuICAgICAgICByZXR1cm4gcmVhZGVyLnJlYWRJbnQ4KCkgPT09IDE7XG4gICAgfSxcbiAgICBjcmVhdGUoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9LFxuICAgIGpzb25TY2hlbWE6IHtcbiAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICBzZXJpYWxpemF0aW9uVHlwZTogJ2Jvb2xlYW4nXG4gICAgfVxufTtcbiIsICIvKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgSW50NjQgPSB7XG4gICAgc2VyaWFsaXplKHZhbHVlLCBidWlsZGVyKSB7XG4gICAgICAgIGJ1aWxkZXIud3JpdGVJbnQ2NChCaWdJbnQodmFsdWUpKTtcbiAgICB9LFxuICAgIGRlc2VyaWFsaXplKHJlYWRlcikge1xuICAgICAgICByZXR1cm4gTnVtYmVyKHJlYWRlci5yZWFkSW50NjQoKSk7XG4gICAgfSxcbiAgICBjcmVhdGUoKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH0sXG4gICAganNvblNjaGVtYToge1xuICAgICAgICB0eXBlOiAnaW50ZWdlcicsXG4gICAgICAgIHNlcmlhbGl6YXRpb25UeXBlOiAnaW50NjQnXG4gICAgfVxufTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBJbnQzMiA9IHtcbiAgICBzZXJpYWxpemUodmFsdWUsIGJ1aWxkZXIpIHtcbiAgICAgICAgYnVpbGRlci53cml0ZUludDMyKHZhbHVlKTtcbiAgICB9LFxuICAgIGRlc2VyaWFsaXplKHJlYWRlcikge1xuICAgICAgICByZXR1cm4gcmVhZGVyLnJlYWRJbnQzMigpO1xuICAgIH0sXG4gICAgY3JlYXRlKCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9LFxuICAgIGpzb25TY2hlbWE6IHtcbiAgICAgICAgdHlwZTogJ2ludGVnZXInLFxuICAgICAgICBzZXJpYWxpemF0aW9uVHlwZTogJ2ludDMyJ1xuICAgIH1cbn07XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IEludDE2ID0ge1xuICAgIHNlcmlhbGl6ZSh2YWx1ZSwgYnVpbGRlcikge1xuICAgICAgICBidWlsZGVyLndyaXRlSW50MTYodmFsdWUpO1xuICAgIH0sXG4gICAgZGVzZXJpYWxpemUocmVhZGVyKSB7XG4gICAgICAgIHJldHVybiByZWFkZXIucmVhZEludDE2KCk7XG4gICAgfSxcbiAgICBjcmVhdGUoKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH0sXG4gICAganNvblNjaGVtYToge1xuICAgICAgICB0eXBlOiAnaW50ZWdlcicsXG4gICAgICAgIHNlcmlhbGl6YXRpb25UeXBlOiAnaW50MTYnXG4gICAgfVxufTtcbi8qKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgSW50OCA9IHtcbiAgICBzZXJpYWxpemUodmFsdWUsIGJ1aWxkZXIpIHtcbiAgICAgICAgYnVpbGRlci53cml0ZUludDgodmFsdWUpO1xuICAgIH0sXG4gICAgZGVzZXJpYWxpemUocmVhZGVyKSB7XG4gICAgICAgIHJldHVybiByZWFkZXIucmVhZEludDgoKTtcbiAgICB9LFxuICAgIGNyZWF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfSxcbiAgICBqc29uU2NoZW1hOiB7XG4gICAgICAgIHR5cGU6ICdpbnRlZ2VyJyxcbiAgICAgICAgc2VyaWFsaXphdGlvblR5cGU6ICdpbnQ4J1xuICAgIH1cbn07XG4iLCAiLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IEZsYXRTdHJpbmcgPSB7XG4gICAgc2VyaWFsaXplKHZhbHVlLCBidWlsZGVyKSB7XG4gICAgICAgIGJ1aWxkZXIud3JpdGVVdGY4U3RyaW5nKHZhbHVlKTtcbiAgICB9LFxuICAgIGRlc2VyaWFsaXplKHJlYWRlcikge1xuICAgICAgICByZXR1cm4gcmVhZGVyLnJlYWRVdGY4U3RyaW5nKCk7XG4gICAgfSxcbiAgICBjcmVhdGUoKSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9LFxuICAgIGpzb25TY2hlbWE6IHtcbiAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgIHNlcmlhbGl6YXRpb25UeXBlOiAndXRmOC1zdHJpbmcnXG4gICAgfVxufTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBFY3NTdHJpbmcgPSBGbGF0U3RyaW5nO1xuIiwgImltcG9ydCB7IEludDMyIH0gZnJvbSAnLi9JbnRlZ2VyJztcbmltcG9ydCB7IEZsYXRTdHJpbmcgfSBmcm9tICcuL1N0cmluZyc7XG4vKipcbiAqIFZhbGlkYXRlcyB0aGUgZW51bSB0byBlbnN1cmUgYWxsIG1lbWJlciB2YWx1ZXMgYXJlIG51bWJlcnMgYW5kIHdpdGhpbiB0aGUgcmFuZ2Ugb2YgSW50MzIuXG4gKiBAcGFyYW0gZW51bVZhbHVlIFRoZSBlbnVtIHRvIGJlIGNoZWNrZWQuXG4gKiBAdGhyb3dzIElmIGFueSBtZW1iZXIgdmFsdWUgaXMgbm90IGEgbnVtYmVyIG9yIGlzIG91dHNpZGUgdGhlIHJhbmdlIG9mIEludDMyLlxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZU1lbWJlclZhbHVlc0FyZU51bWJlcnNBbmRJblJhbmdlSW50MzIoZW51bVZhbHVlKSB7XG4gICAgY29uc3QgTUlOX1ZBTFVFID0gLSgyICoqIDMxKSwgTUFYX1ZBTFVFID0gMiAqKiAzMSAtIDE7XG4gICAgbGV0IHZhbHVlQ291bnQgPSAwLCB0b3RhbENvdW50ID0gMDtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBlbnVtVmFsdWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBlbnVtVmFsdWVba2V5XSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIGlmIChlbnVtVmFsdWVba2V5XSA+IE1BWF9WQUxVRSB8fCBlbnVtVmFsdWVba2V5XSA8IE1JTl9WQUxVRSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRW51bSBtZW1iZXIgdmFsdWVzIG11c3QgYmUgbnVtYmVycyB3aXRoaW4gdGhlIHJhbmdlIG9mICR7TUlOX1ZBTFVFfSB0byAke01BWF9WQUxVRX0uYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YWx1ZUNvdW50Kys7XG4gICAgICAgIH1cbiAgICAgICAgdG90YWxDb3VudCsrO1xuICAgIH1cbiAgICBpZiAodG90YWxDb3VudCAhPT0gdmFsdWVDb3VudCAqIDIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBbGwgZW51bSBtZW1iZXIgdmFsdWVzIG11c3QgYmUgb2YgbnVtZXJpYyB0eXBlLicpO1xuICAgIH1cbn1cbi8qKlxuICogVmFsaWRhdGVzIHRoZSBlbnVtIHRvIGVuc3VyZSBhbGwgbWVtYmVyIHZhbHVlcyBhcmUgb2Ygc3RyaW5nIHR5cGUuXG4gKiBAcGFyYW0gZW51bVZhbHVlIFRoZSBlbnVtIHRvIGJlIGNoZWNrZWQuXG4gKiBAdGhyb3dzIElmIGFueSBtZW1iZXIgdmFsdWUgaXMgbm90IG9mIHN0cmluZyB0eXBlLlxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZU1lbWJlclZhbHVlc0FyZVN0cmluZ3MoZW51bVZhbHVlKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gZW51bVZhbHVlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZW51bVZhbHVlW2tleV0gIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FsbCBlbnVtIG1lbWJlciB2YWx1ZXMgbXVzdCBiZSBvZiBzdHJpbmcgdHlwZS4nKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBJbnRFbnVtUmVmbGVjdGlvblR5cGUgPSAnZW51bS1pbnQnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IEludEVudW0gPSAoZW51bU9iamVjdCwgZGVmYXVsdFZhbHVlKSA9PiB7XG4gICAgdmFsaWRhdGVNZW1iZXJWYWx1ZXNBcmVOdW1iZXJzQW5kSW5SYW5nZUludDMyKGVudW1PYmplY3QpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHNlcmlhbGl6ZSh2YWx1ZSwgYnVpbGRlcikge1xuICAgICAgICAgICAgSW50MzIuc2VyaWFsaXplKHZhbHVlLCBidWlsZGVyKTtcbiAgICAgICAgfSxcbiAgICAgICAgZGVzZXJpYWxpemUocmVhZGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gSW50MzIuZGVzZXJpYWxpemUocmVhZGVyKTtcbiAgICAgICAgfSxcbiAgICAgICAgY3JlYXRlKCkge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICAgICAgfSxcbiAgICAgICAganNvblNjaGVtYToge1xuICAgICAgICAgICAgLy8gSlNPTi1zY2hlbWFcbiAgICAgICAgICAgIHR5cGU6ICdpbnRlZ2VyJyxcbiAgICAgICAgICAgIGVudW06IE9iamVjdC52YWx1ZXMoZW51bU9iamVjdCkuZmlsdGVyKChpdGVtKSA9PiBOdW1iZXIuaXNJbnRlZ2VyKGl0ZW0pKSxcbiAgICAgICAgICAgIGRlZmF1bHQ6IGRlZmF1bHRWYWx1ZSxcbiAgICAgICAgICAgIC8vIEBkY2wvZWNzIFNjaGVtYSBTcGVjXG4gICAgICAgICAgICBzZXJpYWxpemF0aW9uVHlwZTogSW50RW51bVJlZmxlY3Rpb25UeXBlLFxuICAgICAgICAgICAgZW51bU9iamVjdFxuICAgICAgICB9XG4gICAgfTtcbn07XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgU3RyaW5nRW51bVJlZmxlY3Rpb25UeXBlID0gJ2VudW0tc3RyaW5nJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBTdHJpbmdFbnVtID0gKGVudW1PYmplY3QsIGRlZmF1bHRWYWx1ZSkgPT4ge1xuICAgIHZhbGlkYXRlTWVtYmVyVmFsdWVzQXJlU3RyaW5ncyhlbnVtT2JqZWN0KTtcbiAgICAvLyBTdHJpbmcgZW51bSBoYXMgdGhlIGV4YWN0IG1hcHBpbmcgZnJvbSBrZXkgKG91ciByZWZlcmVuY2UgaW4gY29kZSkgdG8gdmFsdWVzXG4gICAgcmV0dXJuIHtcbiAgICAgICAgc2VyaWFsaXplKHZhbHVlLCBidWlsZGVyKSB7XG4gICAgICAgICAgICBGbGF0U3RyaW5nLnNlcmlhbGl6ZSh2YWx1ZSwgYnVpbGRlcik7XG4gICAgICAgIH0sXG4gICAgICAgIGRlc2VyaWFsaXplKHJlYWRlcikge1xuICAgICAgICAgICAgcmV0dXJuIEZsYXRTdHJpbmcuZGVzZXJpYWxpemUocmVhZGVyKTtcbiAgICAgICAgfSxcbiAgICAgICAgY3JlYXRlKCkge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICAgICAgfSxcbiAgICAgICAganNvblNjaGVtYToge1xuICAgICAgICAgICAgLy8gSlNPTi1zY2hlbWFcbiAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgICAgZW51bTogT2JqZWN0LnZhbHVlcyhlbnVtT2JqZWN0KSxcbiAgICAgICAgICAgIGRlZmF1bHQ6IGRlZmF1bHRWYWx1ZSxcbiAgICAgICAgICAgIC8vIEBkY2wvZWNzIFNjaGVtYSBTcGVjXG4gICAgICAgICAgICBzZXJpYWxpemF0aW9uVHlwZTogU3RyaW5nRW51bVJlZmxlY3Rpb25UeXBlLFxuICAgICAgICAgICAgZW51bU9iamVjdFxuICAgICAgICB9XG4gICAgfTtcbn07XG4iLCAiLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IEZsb2F0MzIgPSB7XG4gICAgc2VyaWFsaXplKHZhbHVlLCBidWlsZGVyKSB7XG4gICAgICAgIGJ1aWxkZXIud3JpdGVGbG9hdDMyKHZhbHVlKTtcbiAgICB9LFxuICAgIGRlc2VyaWFsaXplKHJlYWRlcikge1xuICAgICAgICByZXR1cm4gcmVhZGVyLnJlYWRGbG9hdDMyKCk7XG4gICAgfSxcbiAgICBjcmVhdGUoKSB7XG4gICAgICAgIHJldHVybiAwLjA7XG4gICAgfSxcbiAgICBqc29uU2NoZW1hOiB7XG4gICAgICAgIHR5cGU6ICdudW1iZXInLFxuICAgICAgICBzZXJpYWxpemF0aW9uVHlwZTogJ2Zsb2F0MzInXG4gICAgfVxufTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBGbG9hdDY0ID0ge1xuICAgIHNlcmlhbGl6ZSh2YWx1ZSwgYnVpbGRlcikge1xuICAgICAgICBidWlsZGVyLndyaXRlRmxvYXQ2NCh2YWx1ZSk7XG4gICAgfSxcbiAgICBkZXNlcmlhbGl6ZShyZWFkZXIpIHtcbiAgICAgICAgcmV0dXJuIHJlYWRlci5yZWFkRmxvYXQ2NCgpO1xuICAgIH0sXG4gICAgY3JlYXRlKCkge1xuICAgICAgICByZXR1cm4gMC4wO1xuICAgIH0sXG4gICAganNvblNjaGVtYToge1xuICAgICAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICAgICAgc2VyaWFsaXphdGlvblR5cGU6ICdmbG9hdDY0J1xuICAgIH1cbn07XG4iLCAiLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IENvbG9yM1NjaGVtYSA9IHtcbiAgICBzZXJpYWxpemUodmFsdWUsIGJ1aWxkZXIpIHtcbiAgICAgICAgYnVpbGRlci53cml0ZUZsb2F0MzIodmFsdWUucik7XG4gICAgICAgIGJ1aWxkZXIud3JpdGVGbG9hdDMyKHZhbHVlLmcpO1xuICAgICAgICBidWlsZGVyLndyaXRlRmxvYXQzMih2YWx1ZS5iKTtcbiAgICB9LFxuICAgIGRlc2VyaWFsaXplKHJlYWRlcikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcjogcmVhZGVyLnJlYWRGbG9hdDMyKCksXG4gICAgICAgICAgICBnOiByZWFkZXIucmVhZEZsb2F0MzIoKSxcbiAgICAgICAgICAgIGI6IHJlYWRlci5yZWFkRmxvYXQzMigpXG4gICAgICAgIH07XG4gICAgfSxcbiAgICBjcmVhdGUoKSB7XG4gICAgICAgIHJldHVybiB7IHI6IDAsIGc6IDAsIGI6IDAgfTtcbiAgICB9LFxuICAgIGpzb25TY2hlbWE6IHtcbiAgICAgICAgdHlwZTogJ29iamVjdCcsXG4gICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIHI6IHsgdHlwZTogJ251bWJlcicgfSxcbiAgICAgICAgICAgIGc6IHsgdHlwZTogJ251bWJlcicgfSxcbiAgICAgICAgICAgIGI6IHsgdHlwZTogJ251bWJlcicgfVxuICAgICAgICB9LFxuICAgICAgICBzZXJpYWxpemF0aW9uVHlwZTogJ2NvbG9yMydcbiAgICB9XG59O1xuIiwgIi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBDb2xvcjRTY2hlbWEgPSB7XG4gICAgc2VyaWFsaXplKHZhbHVlLCBidWlsZGVyKSB7XG4gICAgICAgIGJ1aWxkZXIud3JpdGVGbG9hdDMyKHZhbHVlLnIpO1xuICAgICAgICBidWlsZGVyLndyaXRlRmxvYXQzMih2YWx1ZS5nKTtcbiAgICAgICAgYnVpbGRlci53cml0ZUZsb2F0MzIodmFsdWUuYik7XG4gICAgICAgIGJ1aWxkZXIud3JpdGVGbG9hdDMyKHZhbHVlLmEpO1xuICAgIH0sXG4gICAgZGVzZXJpYWxpemUocmVhZGVyKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByOiByZWFkZXIucmVhZEZsb2F0MzIoKSxcbiAgICAgICAgICAgIGc6IHJlYWRlci5yZWFkRmxvYXQzMigpLFxuICAgICAgICAgICAgYjogcmVhZGVyLnJlYWRGbG9hdDMyKCksXG4gICAgICAgICAgICBhOiByZWFkZXIucmVhZEZsb2F0MzIoKVxuICAgICAgICB9O1xuICAgIH0sXG4gICAgY3JlYXRlKCkge1xuICAgICAgICByZXR1cm4geyByOiAwLCBnOiAwLCBiOiAwLCBhOiAwIH07XG4gICAgfSxcbiAgICBqc29uU2NoZW1hOiB7XG4gICAgICAgIHR5cGU6ICdvYmplY3QnLFxuICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICByOiB7IHR5cGU6ICdudW1iZXInIH0sXG4gICAgICAgICAgICBnOiB7IHR5cGU6ICdudW1iZXInIH0sXG4gICAgICAgICAgICBiOiB7IHR5cGU6ICdudW1iZXInIH0sXG4gICAgICAgICAgICBhOiB7IHR5cGU6ICdudW1iZXInIH1cbiAgICAgICAgfSxcbiAgICAgICAgc2VyaWFsaXphdGlvblR5cGU6ICdjb2xvcjQnXG4gICAgfVxufTtcbiIsICIvKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgRW50aXR5U2NoZW1hID0ge1xuICAgIHNlcmlhbGl6ZSh2YWx1ZSwgYnVpbGRlcikge1xuICAgICAgICBidWlsZGVyLndyaXRlSW50MzIodmFsdWUpO1xuICAgIH0sXG4gICAgZGVzZXJpYWxpemUocmVhZGVyKSB7XG4gICAgICAgIHJldHVybiByZWFkZXIucmVhZEludDMyKCk7XG4gICAgfSxcbiAgICBjcmVhdGUoKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH0sXG4gICAganNvblNjaGVtYToge1xuICAgICAgICB0eXBlOiAnaW50ZWdlcicsXG4gICAgICAgIHNlcmlhbGl6YXRpb25UeXBlOiAnZW50aXR5J1xuICAgIH1cbn07XG4iLCAiLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFF1YXRlcm5pb25TY2hlbWEgPSB7XG4gICAgc2VyaWFsaXplKHZhbHVlLCBidWlsZGVyKSB7XG4gICAgICAgIGJ1aWxkZXIud3JpdGVGbG9hdDMyKHZhbHVlLngpO1xuICAgICAgICBidWlsZGVyLndyaXRlRmxvYXQzMih2YWx1ZS55KTtcbiAgICAgICAgYnVpbGRlci53cml0ZUZsb2F0MzIodmFsdWUueik7XG4gICAgICAgIGJ1aWxkZXIud3JpdGVGbG9hdDMyKHZhbHVlLncpO1xuICAgIH0sXG4gICAgZGVzZXJpYWxpemUocmVhZGVyKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4OiByZWFkZXIucmVhZEZsb2F0MzIoKSxcbiAgICAgICAgICAgIHk6IHJlYWRlci5yZWFkRmxvYXQzMigpLFxuICAgICAgICAgICAgejogcmVhZGVyLnJlYWRGbG9hdDMyKCksXG4gICAgICAgICAgICB3OiByZWFkZXIucmVhZEZsb2F0MzIoKVxuICAgICAgICB9O1xuICAgIH0sXG4gICAgY3JlYXRlKCkge1xuICAgICAgICByZXR1cm4geyB4OiAwLCB5OiAwLCB6OiAwLCB3OiAwIH07XG4gICAgfSxcbiAgICBqc29uU2NoZW1hOiB7XG4gICAgICAgIHR5cGU6ICdvYmplY3QnLFxuICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICB4OiB7IHR5cGU6ICdudW1iZXInIH0sXG4gICAgICAgICAgICB5OiB7IHR5cGU6ICdudW1iZXInIH0sXG4gICAgICAgICAgICB6OiB7IHR5cGU6ICdudW1iZXInIH0sXG4gICAgICAgICAgICB3OiB7IHR5cGU6ICdudW1iZXInIH1cbiAgICAgICAgfSxcbiAgICAgICAgc2VyaWFsaXphdGlvblR5cGU6ICdxdWF0ZXJuaW9uJ1xuICAgIH1cbn07XG4iLCAiLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFZlY3RvcjNTY2hlbWEgPSB7XG4gICAgc2VyaWFsaXplKHZhbHVlLCBidWlsZGVyKSB7XG4gICAgICAgIGJ1aWxkZXIud3JpdGVGbG9hdDMyKHZhbHVlLngpO1xuICAgICAgICBidWlsZGVyLndyaXRlRmxvYXQzMih2YWx1ZS55KTtcbiAgICAgICAgYnVpbGRlci53cml0ZUZsb2F0MzIodmFsdWUueik7XG4gICAgfSxcbiAgICBkZXNlcmlhbGl6ZShyZWFkZXIpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHg6IHJlYWRlci5yZWFkRmxvYXQzMigpLFxuICAgICAgICAgICAgeTogcmVhZGVyLnJlYWRGbG9hdDMyKCksXG4gICAgICAgICAgICB6OiByZWFkZXIucmVhZEZsb2F0MzIoKVxuICAgICAgICB9O1xuICAgIH0sXG4gICAgY3JlYXRlKCkge1xuICAgICAgICByZXR1cm4geyB4OiAwLCB5OiAwLCB6OiAwIH07XG4gICAgfSxcbiAgICBqc29uU2NoZW1hOiB7XG4gICAgICAgIHR5cGU6ICdvYmplY3QnLFxuICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICB4OiB7IHR5cGU6ICdudW1iZXInIH0sXG4gICAgICAgICAgICB5OiB7IHR5cGU6ICdudW1iZXInIH0sXG4gICAgICAgICAgICB6OiB7IHR5cGU6ICdudW1iZXInIH0sXG4gICAgICAgICAgICB3OiB7IHR5cGU6ICdudW1iZXInIH1cbiAgICAgICAgfSxcbiAgICAgICAgc2VyaWFsaXphdGlvblR5cGU6ICd2ZWN0b3IzJ1xuICAgIH1cbn07XG4iLCAiLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IElNYXAgPSAoc3BlYywgZGVmYXVsdFZhbHVlKSA9PiB7XG4gICAgY29uc3Qgc3BlY1JlZmxlY3Rpb24gPSBPYmplY3Qua2V5cyhzcGVjKS5yZWR1Y2UoKHNwZWNSZWZsZWN0aW9uLCBjdXJyZW50S2V5KSA9PiB7XG4gICAgICAgIHNwZWNSZWZsZWN0aW9uW2N1cnJlbnRLZXldID0gc3BlY1tjdXJyZW50S2V5XS5qc29uU2NoZW1hO1xuICAgICAgICByZXR1cm4gc3BlY1JlZmxlY3Rpb247XG4gICAgfSwge30pO1xuICAgIHJldHVybiB7XG4gICAgICAgIHNlcmlhbGl6ZSh2YWx1ZSwgYnVpbGRlcikge1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gc3BlYykge1xuICAgICAgICAgICAgICAgIHNwZWNba2V5XS5zZXJpYWxpemUodmFsdWVba2V5XSwgYnVpbGRlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGRlc2VyaWFsaXplKHJlYWRlcikge1xuICAgICAgICAgICAgY29uc3QgbmV3VmFsdWUgPSB7fTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIHNwZWMpIHtcbiAgICAgICAgICAgICAgICA7XG4gICAgICAgICAgICAgICAgbmV3VmFsdWVba2V5XSA9IHNwZWNba2V5XS5kZXNlcmlhbGl6ZShyZWFkZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5ld1ZhbHVlO1xuICAgICAgICB9LFxuICAgICAgICBjcmVhdGUoKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IHt9O1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gc3BlYykge1xuICAgICAgICAgICAgICAgIDtcbiAgICAgICAgICAgICAgICBuZXdWYWx1ZVtrZXldID0gc3BlY1trZXldLmNyZWF0ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHsgLi4ubmV3VmFsdWUsIC4uLmRlZmF1bHRWYWx1ZSB9O1xuICAgICAgICB9LFxuICAgICAgICBleHRlbmQ6IChiYXNlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IHt9O1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gc3BlYykge1xuICAgICAgICAgICAgICAgIDtcbiAgICAgICAgICAgICAgICBuZXdWYWx1ZVtrZXldID0gc3BlY1trZXldLmNyZWF0ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHsgLi4ubmV3VmFsdWUsIC4uLmRlZmF1bHRWYWx1ZSwgLi4uYmFzZSB9O1xuICAgICAgICB9LFxuICAgICAgICBqc29uU2NoZW1hOiB7XG4gICAgICAgICAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICAgICAgICAgIHByb3BlcnRpZXM6IHNwZWNSZWZsZWN0aW9uLFxuICAgICAgICAgICAgc2VyaWFsaXphdGlvblR5cGU6ICdtYXAnXG4gICAgICAgIH1cbiAgICB9O1xufTtcbiIsICIvKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgSU9wdGlvbmFsID0gKHNwZWMpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgICBzZXJpYWxpemUodmFsdWUsIGJ1aWxkZXIpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGJ1aWxkZXIud3JpdGVJbnQ4KDEpO1xuICAgICAgICAgICAgICAgIHNwZWMuc2VyaWFsaXplKHZhbHVlLCBidWlsZGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGJ1aWxkZXIud3JpdGVJbnQ4KDApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBkZXNlcmlhbGl6ZShyZWFkZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4aXN0cyA9IHJlYWRlci5yZWFkSW50OCgpO1xuICAgICAgICAgICAgaWYgKGV4aXN0cykge1xuICAgICAgICAgICAgICAgIHJldHVybiBzcGVjLmRlc2VyaWFsaXplKHJlYWRlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNyZWF0ZSgpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH0sXG4gICAgICAgIGpzb25TY2hlbWE6IHtcbiAgICAgICAgICAgIHR5cGU6IHNwZWMuanNvblNjaGVtYS50eXBlLFxuICAgICAgICAgICAgc2VyaWFsaXphdGlvblR5cGU6ICdvcHRpb25hbCcsXG4gICAgICAgICAgICBvcHRpb25hbEpzb25TY2hlbWE6IHNwZWMuanNvblNjaGVtYVxuICAgICAgICB9XG4gICAgfTtcbn07XG4iLCAiZXhwb3J0IGNvbnN0IElPbmVPZiA9IChzcGVjcykgPT4ge1xuICAgIGNvbnN0IHNwZWNLZXlzID0gT2JqZWN0LmtleXMoc3BlY3MpO1xuICAgIGNvbnN0IGtleVRvSW5kZXggPSBzcGVjS2V5cy5yZWR1Y2UoKGRpY3QsIGtleSwgaW5kZXgpID0+IHtcbiAgICAgICAgZGljdFtrZXldID0gaW5kZXg7XG4gICAgICAgIHJldHVybiBkaWN0O1xuICAgIH0sIHt9KTtcbiAgICBjb25zdCBzcGVjUmVmbGVjdGlvbiA9IHNwZWNLZXlzLnJlZHVjZSgoc3BlY1JlZmxlY3Rpb24sIGN1cnJlbnRLZXkpID0+IHtcbiAgICAgICAgc3BlY1JlZmxlY3Rpb25bY3VycmVudEtleV0gPSBzcGVjc1tjdXJyZW50S2V5XS5qc29uU2NoZW1hO1xuICAgICAgICByZXR1cm4gc3BlY1JlZmxlY3Rpb247XG4gICAgfSwge30pO1xuICAgIHJldHVybiB7XG4gICAgICAgIHNlcmlhbGl6ZSh7ICRjYXNlLCB2YWx1ZSB9LCBidWlsZGVyKSB7XG4gICAgICAgICAgICBjb25zdCBfdmFsdWUgPSBrZXlUb0luZGV4WyRjYXNlLnRvU3RyaW5nKCldICsgMTtcbiAgICAgICAgICAgIGJ1aWxkZXIud3JpdGVVaW50OChfdmFsdWUpO1xuICAgICAgICAgICAgc3BlY3NbJGNhc2VdLnNlcmlhbGl6ZSh2YWx1ZSwgYnVpbGRlcik7XG4gICAgICAgIH0sXG4gICAgICAgIGRlc2VyaWFsaXplKHJlYWRlcikge1xuICAgICAgICAgICAgY29uc3QgJGNhc2UgPSBzcGVjS2V5c1tyZWFkZXIucmVhZEludDgoKSAtIDFdO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBzcGVjc1skY2FzZV0uZGVzZXJpYWxpemUocmVhZGVyKTtcbiAgICAgICAgICAgIHJldHVybiB7ICRjYXNlLCB2YWx1ZSB9O1xuICAgICAgICB9LFxuICAgICAgICBjcmVhdGUoKSB7XG4gICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH0sXG4gICAgICAgIGpzb25TY2hlbWE6IHtcbiAgICAgICAgICAgIHR5cGU6ICdvYmplY3QnLFxuICAgICAgICAgICAgcHJvcGVydGllczogc3BlY1JlZmxlY3Rpb24sXG4gICAgICAgICAgICBzZXJpYWxpemF0aW9uVHlwZTogJ29uZS1vZidcbiAgICAgICAgfVxuICAgIH07XG59O1xuIiwgImV4cG9ydCBjb25zdCBpc1NjaGVtYVR5cGUgPSAodmFsdWUsIHR5cGVzKSA9PiB0eXBlcy5pbmNsdWRlcyh2YWx1ZS5zZXJpYWxpemF0aW9uVHlwZSk7XG5leHBvcnQgY29uc3QgaXNPbmVPZkpzb25TY2hlbWEgPSAodHlwZSkgPT4gaXNTY2hlbWFUeXBlKHR5cGUsIFsnb25lLW9mJ10pO1xuZXhwb3J0IGNvbnN0IGdldFVua25vd25TY2hlbWEgPSAoKSA9PiAoe1xuICAgIHR5cGU6IHsgdHlwZTogJ29iamVjdCcsIHNlcmlhbGl6YXRpb25UeXBlOiAndW5rbm93bicgfSxcbiAgICB2YWx1ZTogdW5kZWZpbmVkXG59KTtcbmV4cG9ydCBjb25zdCBpc0NvbXBvdW5kVHlwZSA9ICh0eXBlKSA9PiBpc1NjaGVtYVR5cGUodHlwZSwgWydhcnJheScsICdtYXAnXSk7XG5leHBvcnQgY29uc3QgZ2V0VHlwZUFuZFZhbHVlID0gKHByb3BlcnRpZXMsIHZhbHVlLCBrZXkpID0+IHtcbiAgICBjb25zdCB0eXBlID0gcHJvcGVydGllc1trZXldO1xuICAgIGNvbnN0IHZhbHVlS2V5ID0gdmFsdWVba2V5XTtcbiAgICBpZiAoaXNPbmVPZkpzb25TY2hlbWEodHlwZSkpIHtcbiAgICAgICAgY29uc3QgdHlwZWRNYXBWYWx1ZSA9IHZhbHVlS2V5O1xuICAgICAgICBpZiAoIXR5cGVkTWFwVmFsdWUuJGNhc2UpXG4gICAgICAgICAgICByZXR1cm4gZ2V0VW5rbm93blNjaGVtYSgpO1xuICAgICAgICBjb25zdCBwcm9wVHlwZSA9IHR5cGUucHJvcGVydGllc1t0eXBlZE1hcFZhbHVlLiRjYXNlXTtcbiAgICAgICAgLy8gdHJhbnNmb3JtIHsgJGNhc2U6IHN0cmluZzsgdmFsdWU6IHVua25vd24gfSA9PiB7IFskY2FzZV06IHZhbHVlIH1cbiAgICAgICAgaWYgKGlzQ29tcG91bmRUeXBlKHByb3BUeXBlKSlcbiAgICAgICAgICAgIHZhbHVlW2tleV0gPSB7IFt0eXBlZE1hcFZhbHVlLiRjYXNlXTogdHlwZWRNYXBWYWx1ZS52YWx1ZSB9O1xuICAgICAgICByZXR1cm4geyB0eXBlOiBwcm9wVHlwZSwgdmFsdWU6IHR5cGVkTWFwVmFsdWUudmFsdWUgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgdHlwZSwgdmFsdWU6IHZhbHVlS2V5IH07XG59O1xuIiwgImltcG9ydCB7IElBcnJheSB9IGZyb20gJy4uL0FycmF5JztcbmltcG9ydCB7IEJvb2wgfSBmcm9tICcuLi9iYXNpYy9Cb29sZWFuJztcbmltcG9ydCB7IEludEVudW0sIFN0cmluZ0VudW0gfSBmcm9tICcuLi9iYXNpYy9FbnVtJztcbmltcG9ydCB7IEZsb2F0MzIsIEZsb2F0NjQgfSBmcm9tICcuLi9iYXNpYy9GbG9hdCc7XG5pbXBvcnQgeyBJbnQxNiwgSW50MzIsIEludDY0LCBJbnQ4IH0gZnJvbSAnLi4vYmFzaWMvSW50ZWdlcic7XG5pbXBvcnQgeyBFY3NTdHJpbmcgfSBmcm9tICcuLi9iYXNpYy9TdHJpbmcnO1xuaW1wb3J0IHsgQ29sb3IzU2NoZW1hIH0gZnJvbSAnLi4vY3VzdG9tL0NvbG9yMyc7XG5pbXBvcnQgeyBDb2xvcjRTY2hlbWEgfSBmcm9tICcuLi9jdXN0b20vQ29sb3I0JztcbmltcG9ydCB7IEVudGl0eVNjaGVtYSB9IGZyb20gJy4uL2N1c3RvbS9FbnRpdHknO1xuaW1wb3J0IHsgUXVhdGVybmlvblNjaGVtYSB9IGZyb20gJy4uL2N1c3RvbS9RdWF0ZXJuaW9uJztcbmltcG9ydCB7IFZlY3RvcjNTY2hlbWEgfSBmcm9tICcuLi9jdXN0b20vVmVjdG9yMyc7XG5pbXBvcnQgeyBJTWFwIH0gZnJvbSAnLi4vTWFwJztcbmltcG9ydCB7IElPbmVPZiB9IGZyb20gJy4uL09uZU9mJztcbmltcG9ydCB7IElPcHRpb25hbCB9IGZyb20gJy4uL09wdGlvbmFsJztcbmltcG9ydCB7IGdldFR5cGVBbmRWYWx1ZSwgaXNDb21wb3VuZFR5cGUgfSBmcm9tICcuL3V0aWxzJztcbmNvbnN0IHByaW1pdGl2ZVNjaGVtYXMgPSB7XG4gICAgW0Jvb2wuanNvblNjaGVtYS5zZXJpYWxpemF0aW9uVHlwZV06IEJvb2wsXG4gICAgW0Vjc1N0cmluZy5qc29uU2NoZW1hLnNlcmlhbGl6YXRpb25UeXBlXTogRWNzU3RyaW5nLFxuICAgIFtGbG9hdDMyLmpzb25TY2hlbWEuc2VyaWFsaXphdGlvblR5cGVdOiBGbG9hdDMyLFxuICAgIFtGbG9hdDY0Lmpzb25TY2hlbWEuc2VyaWFsaXphdGlvblR5cGVdOiBGbG9hdDY0LFxuICAgIFtJbnQ4Lmpzb25TY2hlbWEuc2VyaWFsaXphdGlvblR5cGVdOiBJbnQ4LFxuICAgIFtJbnQxNi5qc29uU2NoZW1hLnNlcmlhbGl6YXRpb25UeXBlXTogSW50MTYsXG4gICAgW0ludDMyLmpzb25TY2hlbWEuc2VyaWFsaXphdGlvblR5cGVdOiBJbnQzMixcbiAgICBbSW50NjQuanNvblNjaGVtYS5zZXJpYWxpemF0aW9uVHlwZV06IEludDY0LFxuICAgIFtWZWN0b3IzU2NoZW1hLmpzb25TY2hlbWEuc2VyaWFsaXphdGlvblR5cGVdOiBWZWN0b3IzU2NoZW1hLFxuICAgIFtRdWF0ZXJuaW9uU2NoZW1hLmpzb25TY2hlbWEuc2VyaWFsaXphdGlvblR5cGVdOiBRdWF0ZXJuaW9uU2NoZW1hLFxuICAgIFtDb2xvcjNTY2hlbWEuanNvblNjaGVtYS5zZXJpYWxpemF0aW9uVHlwZV06IENvbG9yM1NjaGVtYSxcbiAgICBbQ29sb3I0U2NoZW1hLmpzb25TY2hlbWEuc2VyaWFsaXphdGlvblR5cGVdOiBDb2xvcjRTY2hlbWEsXG4gICAgW0VudGl0eVNjaGVtYS5qc29uU2NoZW1hLnNlcmlhbGl6YXRpb25UeXBlXTogRW50aXR5U2NoZW1hXG59O1xuLyoqXG4gKiBDcmVhdGUgYW4gSVNjaGVtYSBvYmplY3QgZnJvbSB0aGUganNvbi1zY2hlbWFcbiAqIEBwYXJhbSBqc29uU2NoZW1hXG4gKiBAcmV0dXJucyBhIElTY2hlbWEgb3IgZmFpbCBmb3IgdW5zdXBwb3J0ZWQganNvbi1zY2hlbWFcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGpzb25TY2hlbWFUb1NjaGVtYShqc29uU2NoZW1hKSB7XG4gICAgaWYgKHByaW1pdGl2ZVNjaGVtYXNbanNvblNjaGVtYS5zZXJpYWxpemF0aW9uVHlwZV0pIHtcbiAgICAgICAgcmV0dXJuIHByaW1pdGl2ZVNjaGVtYXNbanNvblNjaGVtYS5zZXJpYWxpemF0aW9uVHlwZV07XG4gICAgfVxuICAgIGlmIChqc29uU2NoZW1hLnNlcmlhbGl6YXRpb25UeXBlID09PSAnbWFwJykge1xuICAgICAgICBjb25zdCBtYXBKc29uU2NoZW1hID0ganNvblNjaGVtYTtcbiAgICAgICAgY29uc3Qgc3BlYyA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBtYXBKc29uU2NoZW1hLnByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIHNwZWNba2V5XSA9IGpzb25TY2hlbWFUb1NjaGVtYShtYXBKc29uU2NoZW1hLnByb3BlcnRpZXNba2V5XSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIElNYXAoc3BlYyk7XG4gICAgfVxuICAgIGlmIChqc29uU2NoZW1hLnNlcmlhbGl6YXRpb25UeXBlID09PSAnb3B0aW9uYWwnKSB7XG4gICAgICAgIGNvbnN0IHdpdGhJdGVtc0pzb25TY2hlbWEgPSBqc29uU2NoZW1hO1xuICAgICAgICByZXR1cm4gSU9wdGlvbmFsKGpzb25TY2hlbWFUb1NjaGVtYSh3aXRoSXRlbXNKc29uU2NoZW1hLm9wdGlvbmFsSnNvblNjaGVtYSkpO1xuICAgIH1cbiAgICBpZiAoanNvblNjaGVtYS5zZXJpYWxpemF0aW9uVHlwZSA9PT0gJ2FycmF5Jykge1xuICAgICAgICBjb25zdCB3aXRoSXRlbXNKc29uU2NoZW1hID0ganNvblNjaGVtYTtcbiAgICAgICAgcmV0dXJuIElBcnJheShqc29uU2NoZW1hVG9TY2hlbWEod2l0aEl0ZW1zSnNvblNjaGVtYS5pdGVtcykpO1xuICAgIH1cbiAgICBpZiAoanNvblNjaGVtYS5zZXJpYWxpemF0aW9uVHlwZSA9PT0gJ2VudW0taW50Jykge1xuICAgICAgICBjb25zdCBlbnVtSnNvblNjaGVtYSA9IGpzb25TY2hlbWE7XG4gICAgICAgIHJldHVybiBJbnRFbnVtKGVudW1Kc29uU2NoZW1hLmVudW1PYmplY3QsIGVudW1Kc29uU2NoZW1hLmRlZmF1bHQpO1xuICAgIH1cbiAgICBpZiAoanNvblNjaGVtYS5zZXJpYWxpemF0aW9uVHlwZSA9PT0gJ2VudW0tc3RyaW5nJykge1xuICAgICAgICBjb25zdCBlbnVtSnNvblNjaGVtYSA9IGpzb25TY2hlbWE7XG4gICAgICAgIHJldHVybiBTdHJpbmdFbnVtKGVudW1Kc29uU2NoZW1hLmVudW1PYmplY3QsIGVudW1Kc29uU2NoZW1hLmRlZmF1bHQpO1xuICAgIH1cbiAgICBpZiAoanNvblNjaGVtYS5zZXJpYWxpemF0aW9uVHlwZSA9PT0gJ29uZS1vZicpIHtcbiAgICAgICAgY29uc3Qgb25lT2ZKc29uU2NoZW1hID0ganNvblNjaGVtYTtcbiAgICAgICAgY29uc3Qgc3BlYyA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBvbmVPZkpzb25TY2hlbWEucHJvcGVydGllcykge1xuICAgICAgICAgICAgc3BlY1trZXldID0ganNvblNjaGVtYVRvU2NoZW1hKG9uZU9mSnNvblNjaGVtYS5wcm9wZXJ0aWVzW2tleV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBJT25lT2Yoc3BlYyk7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgJHtqc29uU2NoZW1hLnNlcmlhbGl6YXRpb25UeXBlfSBpcyBub3Qgc3VwcG9ydGVkIGFzIHJldmVyc2Ugc2NoZW1hIGdlbmVyYXRpb24uYCk7XG59XG5leHBvcnQgZnVuY3Rpb24gbXV0YXRlVmFsdWVzKGpzb25TY2hlbWEsIHZhbHVlLCBtdXRhdGVGbikge1xuICAgIGlmIChqc29uU2NoZW1hLnNlcmlhbGl6YXRpb25UeXBlID09PSAnbWFwJykge1xuICAgICAgICBjb25zdCB7IHByb3BlcnRpZXMgfSA9IGpzb25TY2hlbWE7XG4gICAgICAgIGNvbnN0IHR5cGVkVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gcHJvcGVydGllcykge1xuICAgICAgICAgICAgY29uc3QgeyB0eXBlLCB2YWx1ZTogbWFwVmFsdWUgfSA9IGdldFR5cGVBbmRWYWx1ZShwcm9wZXJ0aWVzLCB0eXBlZFZhbHVlLCBrZXkpO1xuICAgICAgICAgICAgaWYgKHR5cGUuc2VyaWFsaXphdGlvblR5cGUgPT09ICd1bmtub3duJylcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChpc0NvbXBvdW5kVHlwZSh0eXBlKSkge1xuICAgICAgICAgICAgICAgIG11dGF0ZVZhbHVlcyh0eXBlLCBtYXBWYWx1ZSwgbXV0YXRlRm4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3VmFsdWUgPSBtdXRhdGVGbihtYXBWYWx1ZSwgdHlwZSk7XG4gICAgICAgICAgICAgICAgaWYgKG5ld1ZhbHVlLmNoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZWRWYWx1ZVtrZXldID0gbmV3VmFsdWUudmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKGpzb25TY2hlbWEuc2VyaWFsaXphdGlvblR5cGUgPT09ICdhcnJheScpIHtcbiAgICAgICAgY29uc3QgeyBpdGVtcyB9ID0ganNvblNjaGVtYTtcbiAgICAgICAgY29uc3QgYXJyYXlWYWx1ZSA9IHZhbHVlO1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgbiA9IGFycmF5VmFsdWUubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCB7IHR5cGUsIHZhbHVlIH0gPSBnZXRUeXBlQW5kVmFsdWUoeyBpdGVtczogaXRlbXMgfSwgeyBpdGVtczogYXJyYXlWYWx1ZVtpXSB9LCAnaXRlbXMnKTtcbiAgICAgICAgICAgIGlmIChpc0NvbXBvdW5kVHlwZSh0eXBlKSkge1xuICAgICAgICAgICAgICAgIG11dGF0ZVZhbHVlcyh0eXBlLCB2YWx1ZSwgbXV0YXRlRm4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3VmFsdWUgPSBtdXRhdGVGbih2YWx1ZSwgdHlwZSk7XG4gICAgICAgICAgICAgICAgaWYgKG5ld1ZhbHVlLmNoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgYXJyYXlWYWx1ZVtpXSA9IG5ld1ZhbHVlLnZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBJQXJyYXkgfSBmcm9tICcuL0FycmF5JztcbmltcG9ydCB7IEJvb2wgfSBmcm9tICcuL2Jhc2ljL0Jvb2xlYW4nO1xuaW1wb3J0IHsgSW50RW51bSBhcyBJbnRFbnVtU2NoZW1hLCBTdHJpbmdFbnVtIGFzIFN0cmluZ0VudW1TY2hlbWEgfSBmcm9tICcuL2Jhc2ljL0VudW0nO1xuaW1wb3J0IHsgRmxvYXQzMiwgRmxvYXQ2NCB9IGZyb20gJy4vYmFzaWMvRmxvYXQnO1xuaW1wb3J0IHsgSW50MTYsIEludDMyLCBJbnQ4LCBJbnQ2NCBhcyBpSW50NjQgfSBmcm9tICcuL2Jhc2ljL0ludGVnZXInO1xuaW1wb3J0IHsgRWNzU3RyaW5nIH0gZnJvbSAnLi9iYXNpYy9TdHJpbmcnO1xuaW1wb3J0IHsgQ29sb3IzU2NoZW1hIH0gZnJvbSAnLi9jdXN0b20vQ29sb3IzJztcbmltcG9ydCB7IENvbG9yNFNjaGVtYSB9IGZyb20gJy4vY3VzdG9tL0NvbG9yNCc7XG5pbXBvcnQgeyBFbnRpdHlTY2hlbWEgfSBmcm9tICcuL2N1c3RvbS9FbnRpdHknO1xuaW1wb3J0IHsgUXVhdGVybmlvblNjaGVtYSB9IGZyb20gJy4vY3VzdG9tL1F1YXRlcm5pb24nO1xuaW1wb3J0IHsgVmVjdG9yM1NjaGVtYSB9IGZyb20gJy4vY3VzdG9tL1ZlY3RvcjMnO1xuaW1wb3J0IHsgSU1hcCB9IGZyb20gJy4vTWFwJztcbmltcG9ydCB7IElPcHRpb25hbCB9IGZyb20gJy4vT3B0aW9uYWwnO1xuaW1wb3J0IHsgSU9uZU9mIH0gZnJvbSAnLi9PbmVPZic7XG5pbXBvcnQgeyBqc29uU2NoZW1hVG9TY2hlbWEsIG11dGF0ZVZhbHVlcyB9IGZyb20gJy4vYnVpbGRTY2hlbWEnO1xuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB2YXIgU2NoZW1hcztcbihmdW5jdGlvbiAoU2NoZW1hcykge1xuICAgIC8qKiBAcHVibGljICovXG4gICAgU2NoZW1hcy5Cb29sZWFuID0gQm9vbDtcbiAgICAvKiogQHB1YmxpYyAqL1xuICAgIFNjaGVtYXMuU3RyaW5nID0gRWNzU3RyaW5nO1xuICAgIC8qKiBAcHVibGljICovXG4gICAgU2NoZW1hcy5GbG9hdCA9IEZsb2F0MzI7XG4gICAgLyoqIEBwdWJsaWMgKi9cbiAgICBTY2hlbWFzLkRvdWJsZSA9IEZsb2F0NjQ7XG4gICAgLyoqIEBwdWJsaWMgKi9cbiAgICBTY2hlbWFzLkJ5dGUgPSBJbnQ4O1xuICAgIC8qKiBAcHVibGljICovXG4gICAgU2NoZW1hcy5TaG9ydCA9IEludDE2O1xuICAgIC8qKiBAcHVibGljICovXG4gICAgU2NoZW1hcy5JbnQgPSBJbnQzMjtcbiAgICAvKiogQHB1YmxpYyAqL1xuICAgIFNjaGVtYXMuSW50NjQgPSBpSW50NjQ7XG4gICAgLyoqIEBwdWJsaWMgKi9cbiAgICBTY2hlbWFzLk51bWJlciA9IEZsb2F0MzI7XG4gICAgLyoqIEBwdWJsaWMgKi9cbiAgICBTY2hlbWFzLlZlY3RvcjMgPSBWZWN0b3IzU2NoZW1hO1xuICAgIC8qKiBAcHVibGljICovXG4gICAgU2NoZW1hcy5RdWF0ZXJuaW9uID0gUXVhdGVybmlvblNjaGVtYTtcbiAgICAvKiogQHB1YmxpYyAqL1xuICAgIFNjaGVtYXMuQ29sb3IzID0gQ29sb3IzU2NoZW1hO1xuICAgIC8qKiBAcHVibGljICovXG4gICAgU2NoZW1hcy5Db2xvcjQgPSBDb2xvcjRTY2hlbWE7XG4gICAgLyoqIEBwdWJsaWMgKi9cbiAgICBTY2hlbWFzLkVudGl0eSA9IEVudGl0eVNjaGVtYTtcbiAgICAvKiogQHB1YmxpYyAqL1xuICAgIFNjaGVtYXMuRW51bU51bWJlciA9IEludEVudW1TY2hlbWE7XG4gICAgLyoqIEBwdWJsaWMgKi9cbiAgICBTY2hlbWFzLkVudW1TdHJpbmcgPSBTdHJpbmdFbnVtU2NoZW1hO1xuICAgIC8qKiBAcHVibGljICovXG4gICAgU2NoZW1hcy5BcnJheSA9IElBcnJheTtcbiAgICAvKiogQHB1YmxpYyAqL1xuICAgIFNjaGVtYXMuTWFwID0gSU1hcDtcbiAgICAvKiogQHB1YmxpYyAqL1xuICAgIFNjaGVtYXMuT3B0aW9uYWwgPSBJT3B0aW9uYWw7XG4gICAgLyoqIEBwdWJsaWMgKi9cbiAgICBTY2hlbWFzLk9uZU9mID0gSU9uZU9mO1xuICAgIC8qKlxuICAgICAqIEBwdWJsaWMgQ3JlYXRlIGFuIElTY2hlbWEgb2JqZWN0IGZyb20gdGhlIGpzb24tc2NoZW1hXG4gICAgICogQHBhcmFtIGpzb25TY2hlbWFcbiAgICAgKiBAcmV0dXJucyBhIElTY2hlbWEgb3IgZmFpbCBmb3IgdW5zdXBwb3J0ZWQganNvbi1zY2hlbWFcbiAgICAgKi9cbiAgICBTY2hlbWFzLmZyb21Kc29uID0ganNvblNjaGVtYVRvU2NoZW1hO1xuICAgIC8qKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKlxuICAgICAqIFRyYXZlcnNlcyBhbmQgbXV0YXRlcyB2YWx1ZXMgaW4gYSBKU09OIHNjaGVtYS1iYXNlZCBzdHJ1Y3R1cmUsIGFwcGx5aW5nIHRoZSBnaXZlbiBtdXRhdGlvbiBmdW5jdGlvbiB0byBlYWNoIHZhbHVlLlxuICAgICAqIFRoZSBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byB3b3JrIHdpdGggbmVzdGVkIG1hcHMgYW5kIGFycmF5cywgcmVjdXJzaXZlbHkgcHJvY2Vzc2luZyBlYWNoIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ganNvblNjaGVtYSAtIFRoZSBKU09OIHNjaGVtYSBvYmplY3QgdGhhdCBkZXNjcmliZXMgdGhlIHN0cnVjdHVyZSBvZiB0aGUgdmFsdWUuXG4gICAgICogICAgICAgICAgICAgICAgICAgSXQgbXVzdCBoYXZlIGEgc2VyaWFsaXphdGlvblR5cGUgb2YgJ21hcCcsICdhcnJheScsIG9yIG90aGVyIGN1c3RvbSB0eXBlcyBsaWtlICdlbnRpdHknLlxuICAgICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBiZSBtdXRhdGVkLCB3aGljaCBzaG91bGQgY29uZm9ybSB0byB0aGUgcHJvdmlkZWQgSlNPTiBzY2hlbWEuXG4gICAgICogQHBhcmFtIG11dGF0ZUZuIC0gQSBmdW5jdGlvbiB0aGF0IHRha2VzIGEgdmFsdWUgYW5kIGl0cyBjb3JyZXNwb25kaW5nIHZhbHVlVHlwZSAoSnNvblNjaGVtYUV4dGVuZGVkKSBhcyBhcmd1bWVudHNcbiAgICAgKiAgICAgICAgICAgICAgICAgICBhbmQgcmV0dXJucyBhIHR1cGxlIFtib29sZWFuLCBhbnldLiBUaGUgYm9vbGVhbiBpbmRpY2F0ZXMgd2hldGhlciB0aGUgbXV0YXRpb24gc2hvdWxkIGJlIGFwcGxpZWQsXG4gICAgICogICAgICAgICAgICAgICAgICAgYW5kIHRoZSBzZWNvbmQgZWxlbWVudCBpcyB0aGUgbXV0YXRlZCB2YWx1ZS5cbiAgICAgKi9cbiAgICBTY2hlbWFzLm11dGF0ZU5lc3RlZFZhbHVlcyA9IG11dGF0ZVZhbHVlcztcbn0pKFNjaGVtYXMgfHwgKFNjaGVtYXMgPSB7fSkpO1xuIiwgImltcG9ydCB7IFNjaGVtYXMgfSBmcm9tICcuLi8uLi9zY2hlbWFzJztcbmZ1bmN0aW9uIGRlZmluZU5hbWVDb21wb25lbnQoZW5naW5lKSB7XG4gICAgY29uc3QgTmFtZSA9IGVuZ2luZS5kZWZpbmVDb21wb25lbnQoJ2NvcmUtc2NoZW1hOjpOYW1lJywge1xuICAgICAgICB2YWx1ZTogU2NoZW1hcy5TdHJpbmdcbiAgICB9KTtcbiAgICByZXR1cm4gTmFtZTtcbn1cbmV4cG9ydCBkZWZhdWx0IGRlZmluZU5hbWVDb21wb25lbnQ7XG4iLCAiaW1wb3J0IHsgU2NoZW1hcyB9IGZyb20gJy4uLy4uL3NjaGVtYXMnO1xuZnVuY3Rpb24gZGVmaW5lU3luY0NvbXBvbmVudHMoZW5naW5lKSB7XG4gICAgY29uc3QgU3luY0NvbXBvbmVudHMgPSBlbmdpbmUuZGVmaW5lQ29tcG9uZW50KCdjb3JlLXNjaGVtYTo6U3luYy1Db21wb25lbnRzJywge1xuICAgICAgICBjb21wb25lbnRJZHM6IFNjaGVtYXMuQXJyYXkoU2NoZW1hcy5JbnQ2NClcbiAgICB9KTtcbiAgICByZXR1cm4gU3luY0NvbXBvbmVudHM7XG59XG5leHBvcnQgZGVmYXVsdCBkZWZpbmVTeW5jQ29tcG9uZW50cztcbiIsICJpbXBvcnQgeyBTY2hlbWFzIH0gZnJvbSAnLi4vLi4vc2NoZW1hcyc7XG5mdW5jdGlvbiBkZWZpbmVOZXR3b3JrRW50aXR5Q29tcG9uZW50KGVuZ2luZSkge1xuICAgIGNvbnN0IEVudGl0eU5ldHdvcmsgPSBlbmdpbmUuZGVmaW5lQ29tcG9uZW50KCdjb3JlLXNjaGVtYTo6TmV0d29yay1FbnRpdHknLCB7XG4gICAgICAgIG5ldHdvcmtJZDogU2NoZW1hcy5JbnQ2NCxcbiAgICAgICAgZW50aXR5SWQ6IFNjaGVtYXMuRW50aXR5XG4gICAgfSk7XG4gICAgcmV0dXJuIEVudGl0eU5ldHdvcms7XG59XG5leHBvcnQgZGVmYXVsdCBkZWZpbmVOZXR3b3JrRW50aXR5Q29tcG9uZW50O1xuIiwgImltcG9ydCB7IFNjaGVtYXMgfSBmcm9tICcuLi8uLi9zY2hlbWFzJztcbmZ1bmN0aW9uIGRlZmluZU5ldHdvcmtQYXJlbnRDb21wb25lbnQoZW5naW5lKSB7XG4gICAgY29uc3QgRW50aXR5TmV0d29yayA9IGVuZ2luZS5kZWZpbmVDb21wb25lbnQoJ2NvcmUtc2NoZW1hOjpOZXR3b3JrLVBhcmVudCcsIHtcbiAgICAgICAgbmV0d29ya0lkOiBTY2hlbWFzLkludDY0LFxuICAgICAgICBlbnRpdHlJZDogU2NoZW1hcy5FbnRpdHlcbiAgICB9KTtcbiAgICByZXR1cm4gRW50aXR5TmV0d29yaztcbn1cbmV4cG9ydCBkZWZhdWx0IGRlZmluZU5ldHdvcmtQYXJlbnRDb21wb25lbnQ7XG4iLCAiLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IENPTVBPTkVOVF9JRCA9IDE7XG4vKiogQGludGVybmFsICovXG5leHBvcnQgY29uc3QgVFJBTlNGT1JNX0xFTkdUSCA9IDQ0O1xuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGNvbnN0IFRyYW5zZm9ybVNjaGVtYSA9IHtcbiAgICBzZXJpYWxpemUodmFsdWUsIGJ1aWxkZXIpIHtcbiAgICAgICAgY29uc3QgcHRyID0gYnVpbGRlci5pbmNyZW1lbnRXcml0ZU9mZnNldChUUkFOU0ZPUk1fTEVOR1RIKTtcbiAgICAgICAgYnVpbGRlci5zZXRGbG9hdDMyKHB0ciwgdmFsdWUucG9zaXRpb24ueCk7XG4gICAgICAgIGJ1aWxkZXIuc2V0RmxvYXQzMihwdHIgKyA0LCB2YWx1ZS5wb3NpdGlvbi55KTtcbiAgICAgICAgYnVpbGRlci5zZXRGbG9hdDMyKHB0ciArIDgsIHZhbHVlLnBvc2l0aW9uLnopO1xuICAgICAgICBidWlsZGVyLnNldEZsb2F0MzIocHRyICsgMTIsIHZhbHVlLnJvdGF0aW9uLngpO1xuICAgICAgICBidWlsZGVyLnNldEZsb2F0MzIocHRyICsgMTYsIHZhbHVlLnJvdGF0aW9uLnkpO1xuICAgICAgICBidWlsZGVyLnNldEZsb2F0MzIocHRyICsgMjAsIHZhbHVlLnJvdGF0aW9uLnopO1xuICAgICAgICBidWlsZGVyLnNldEZsb2F0MzIocHRyICsgMjQsIHZhbHVlLnJvdGF0aW9uLncpO1xuICAgICAgICBidWlsZGVyLnNldEZsb2F0MzIocHRyICsgMjgsIHZhbHVlLnNjYWxlLngpO1xuICAgICAgICBidWlsZGVyLnNldEZsb2F0MzIocHRyICsgMzIsIHZhbHVlLnNjYWxlLnkpO1xuICAgICAgICBidWlsZGVyLnNldEZsb2F0MzIocHRyICsgMzYsIHZhbHVlLnNjYWxlLnopO1xuICAgICAgICBidWlsZGVyLnNldFVpbnQzMihwdHIgKyA0MCwgdmFsdWUucGFyZW50IHx8IDApO1xuICAgIH0sXG4gICAgZGVzZXJpYWxpemUocmVhZGVyKSB7XG4gICAgICAgIGNvbnN0IHB0ciA9IHJlYWRlci5pbmNyZW1lbnRSZWFkT2Zmc2V0KFRSQU5TRk9STV9MRU5HVEgpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICAgICAgICB4OiByZWFkZXIuZ2V0RmxvYXQzMihwdHIpLFxuICAgICAgICAgICAgICAgIHk6IHJlYWRlci5nZXRGbG9hdDMyKHB0ciArIDQpLFxuICAgICAgICAgICAgICAgIHo6IHJlYWRlci5nZXRGbG9hdDMyKHB0ciArIDgpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcm90YXRpb246IHtcbiAgICAgICAgICAgICAgICB4OiByZWFkZXIuZ2V0RmxvYXQzMihwdHIgKyAxMiksXG4gICAgICAgICAgICAgICAgeTogcmVhZGVyLmdldEZsb2F0MzIocHRyICsgMTYpLFxuICAgICAgICAgICAgICAgIHo6IHJlYWRlci5nZXRGbG9hdDMyKHB0ciArIDIwKSxcbiAgICAgICAgICAgICAgICB3OiByZWFkZXIuZ2V0RmxvYXQzMihwdHIgKyAyNClcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzY2FsZToge1xuICAgICAgICAgICAgICAgIHg6IHJlYWRlci5nZXRGbG9hdDMyKHB0ciArIDI4KSxcbiAgICAgICAgICAgICAgICB5OiByZWFkZXIuZ2V0RmxvYXQzMihwdHIgKyAzMiksXG4gICAgICAgICAgICAgICAgejogcmVhZGVyLmdldEZsb2F0MzIocHRyICsgMzYpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcGFyZW50OiByZWFkZXIuZ2V0VWludDMyKHB0ciArIDQwKVxuICAgICAgICB9O1xuICAgIH0sXG4gICAgY3JlYXRlKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcG9zaXRpb246IHsgeDogMCwgeTogMCwgejogMCB9LFxuICAgICAgICAgICAgc2NhbGU6IHsgeDogMSwgeTogMSwgejogMSB9LFxuICAgICAgICAgICAgcm90YXRpb246IHsgeDogMCwgeTogMCwgejogMCwgdzogMSB9LFxuICAgICAgICAgICAgcGFyZW50OiAwXG4gICAgICAgIH07XG4gICAgfSxcbiAgICBleHRlbmQodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHBvc2l0aW9uOiB7IHg6IDAsIHk6IDAsIHo6IDAgfSxcbiAgICAgICAgICAgIHNjYWxlOiB7IHg6IDEsIHk6IDEsIHo6IDEgfSxcbiAgICAgICAgICAgIHJvdGF0aW9uOiB7IHg6IDAsIHk6IDAsIHo6IDAsIHc6IDEgfSxcbiAgICAgICAgICAgIHBhcmVudDogMCxcbiAgICAgICAgICAgIC4uLnZhbHVlXG4gICAgICAgIH07XG4gICAgfSxcbiAgICBqc29uU2NoZW1hOiB7XG4gICAgICAgIHR5cGU6ICdvYmplY3QnLFxuICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdvYmplY3QnLFxuICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgeDogeyB0eXBlOiAnbnVtYmVyJyB9LFxuICAgICAgICAgICAgICAgICAgICB5OiB7IHR5cGU6ICdudW1iZXInIH0sXG4gICAgICAgICAgICAgICAgICAgIHo6IHsgdHlwZTogJ251bWJlcicgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzY2FsZToge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdvYmplY3QnLFxuICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgeDogeyB0eXBlOiAnbnVtYmVyJyB9LFxuICAgICAgICAgICAgICAgICAgICB5OiB7IHR5cGU6ICdudW1iZXInIH0sXG4gICAgICAgICAgICAgICAgICAgIHo6IHsgdHlwZTogJ251bWJlcicgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByb3RhdGlvbjoge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdvYmplY3QnLFxuICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgeDogeyB0eXBlOiAnbnVtYmVyJyB9LFxuICAgICAgICAgICAgICAgICAgICB5OiB7IHR5cGU6ICdudW1iZXInIH0sXG4gICAgICAgICAgICAgICAgICAgIHo6IHsgdHlwZTogJ251bWJlcicgfSxcbiAgICAgICAgICAgICAgICAgICAgdzogeyB0eXBlOiAnbnVtYmVyJyB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHBhcmVudDogeyB0eXBlOiAnaW50ZWdlcicgfVxuICAgICAgICB9LFxuICAgICAgICBzZXJpYWxpemF0aW9uVHlwZTogJ3RyYW5zZm9ybSdcbiAgICB9XG59O1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZVRyYW5zZm9ybUNvbXBvbmVudChlbmdpbmUpIHtcbiAgICBjb25zdCB0cmFuc2Zvcm1EZWYgPSBlbmdpbmUuZGVmaW5lQ29tcG9uZW50RnJvbVNjaGVtYSgnY29yZTo6VHJhbnNmb3JtJywgVHJhbnNmb3JtU2NoZW1hKTtcbiAgICByZXR1cm4ge1xuICAgICAgICAuLi50cmFuc2Zvcm1EZWYsXG4gICAgICAgIGNyZWF0ZShlbnRpdHksIHZhbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybURlZi5jcmVhdGUoZW50aXR5LCBUcmFuc2Zvcm1TY2hlbWEuZXh0ZW5kKHZhbCkpO1xuICAgICAgICB9LFxuICAgICAgICBjcmVhdGVPclJlcGxhY2UoZW50aXR5LCB2YWwpIHtcbiAgICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm1EZWYuY3JlYXRlT3JSZXBsYWNlKGVudGl0eSwgVHJhbnNmb3JtU2NoZW1hLmV4dGVuZCh2YWwpKTtcbiAgICAgICAgfVxuICAgIH07XG59XG4iLCAiaW1wb3J0IHsgZGVmaW5lQW5pbWF0b3JDb21wb25lbnQgfSBmcm9tICcuL2V4dGVuZGVkL0FuaW1hdG9yJztcbmltcG9ydCB7IGRlZmluZU1hdGVyaWFsQ29tcG9uZW50IH0gZnJvbSAnLi9leHRlbmRlZC9NYXRlcmlhbCc7XG5pbXBvcnQgeyBkZWZpbmVNZXNoQ29sbGlkZXJDb21wb25lbnQgfSBmcm9tICcuL2V4dGVuZGVkL01lc2hDb2xsaWRlcic7XG5pbXBvcnQgeyBkZWZpbmVNZXNoUmVuZGVyZXJDb21wb25lbnQgfSBmcm9tICcuL2V4dGVuZGVkL01lc2hSZW5kZXJlcic7XG5pbXBvcnQgeyBkZWZpbmVUd2VlbkNvbXBvbmVudCB9IGZyb20gJy4vZXh0ZW5kZWQvVHdlZW4nO1xuaW1wb3J0IGRlZmluZU5hbWVDb21wb25lbnQgZnJvbSAnLi9tYW51YWwvTmFtZSc7XG5pbXBvcnQgZGVmaW5lU3luY0NvbXBvbmVudCBmcm9tICcuL21hbnVhbC9TeW5jQ29tcG9uZW50cyc7XG5pbXBvcnQgZGVmaW5lTmV0d29ya0VudGl0eSBmcm9tICcuL21hbnVhbC9OZXR3b3JrRW50aXR5JztcbmltcG9ydCBkZWZpbmVOZXR3b3JrUGFyZW50IGZyb20gJy4vbWFudWFsL05ldHdvcmtQYXJlbnQnO1xuaW1wb3J0IHsgZGVmaW5lVHJhbnNmb3JtQ29tcG9uZW50IH0gZnJvbSAnLi9tYW51YWwvVHJhbnNmb3JtJztcbmV4cG9ydCAqIGZyb20gJy4vZ2VuZXJhdGVkL2luZGV4Lmdlbic7XG4vKiBAX19QVVJFX18gKi9cbmV4cG9ydCBjb25zdCBUcmFuc2Zvcm0gPSAoZW5naW5lKSA9PiBkZWZpbmVUcmFuc2Zvcm1Db21wb25lbnQoZW5naW5lKTtcbi8qIEBfX1BVUkVfXyAqL1xuZXhwb3J0IGNvbnN0IE1hdGVyaWFsID0gKGVuZ2luZSkgPT4gZGVmaW5lTWF0ZXJpYWxDb21wb25lbnQoZW5naW5lKTtcbi8qIEBfX1BVUkVfXyAqL1xuZXhwb3J0IGNvbnN0IEFuaW1hdG9yID0gKGVuZ2luZSkgPT4gZGVmaW5lQW5pbWF0b3JDb21wb25lbnQoZW5naW5lKTtcbi8qIEBfX1BVUkVfXyAqL1xuZXhwb3J0IGNvbnN0IE1lc2hSZW5kZXJlciA9IChlbmdpbmUpID0+IGRlZmluZU1lc2hSZW5kZXJlckNvbXBvbmVudChlbmdpbmUpO1xuLyogQF9fUFVSRV9fICovXG5leHBvcnQgY29uc3QgTWVzaENvbGxpZGVyID0gKGVuZ2luZSkgPT4gZGVmaW5lTWVzaENvbGxpZGVyQ29tcG9uZW50KGVuZ2luZSk7XG4vKiBAX19QVVJFX18gKi9cbmV4cG9ydCBjb25zdCBUd2VlbiA9IChlbmdpbmUpID0+IGRlZmluZVR3ZWVuQ29tcG9uZW50KGVuZ2luZSk7XG4vKipcbiAqIEBhbHBoYVxuICovXG4vKiBAX19QVVJFX18gKi9cbmV4cG9ydCBjb25zdCBOYW1lID0gKGVuZ2luZSkgPT4gZGVmaW5lTmFtZUNvbXBvbmVudChlbmdpbmUpO1xuLyoqXG4gKiBAYWxwaGFcbiAqL1xuLyogQF9fUFVSRV9fICovXG5leHBvcnQgY29uc3QgU3luY0NvbXBvbmVudHMgPSAoZW5naW5lKSA9PiBkZWZpbmVTeW5jQ29tcG9uZW50KGVuZ2luZSk7XG4vKipcbiAqIEBhbHBoYVxuICovXG4vKiBAX19QVVJFX18gKi9cbmV4cG9ydCBjb25zdCBOZXR3b3JrRW50aXR5ID0gKGVuZ2luZSkgPT4gZGVmaW5lTmV0d29ya0VudGl0eShlbmdpbmUpO1xuLyoqXG4gKiBAYWxwaGFcbiAqL1xuLyogQF9fUFVSRV9fICovXG5leHBvcnQgY29uc3QgTmV0d29ya1BhcmVudCA9IChlbmdpbmUpID0+IGRlZmluZU5ldHdvcmtQYXJlbnQoZW5naW5lKTtcbiIsICIvKipcbiAqIEF1dG9nZW5lcmF0ZWQgbWFwcGluZyBvZiBjb3JlIGNvbXBvbmVudHMgdG8gdGhlaXIgY29tcG9uZW50IG51bWJlcnNcbiAqL1xuZXhwb3J0IGNvbnN0IGNvcmVDb21wb25lbnRNYXBwaW5ncyA9IHtcbiAgICBcImNvcmU6OlRyYW5zZm9ybVwiOiAxLFxuICAgIFwiY29yZTo6QW5pbWF0b3JcIjogMTA0MixcbiAgICBcImNvcmU6OkF1ZGlvU291cmNlXCI6IDEwMjAsXG4gICAgXCJjb3JlOjpBdWRpb1N0cmVhbVwiOiAxMDIxLFxuICAgIFwiY29yZTo6QXZhdGFyQXR0YWNoXCI6IDEwNzMsXG4gICAgXCJjb3JlOjpBdmF0YXJCYXNlXCI6IDEwODcsXG4gICAgXCJjb3JlOjpBdmF0YXJFbW90ZUNvbW1hbmRcIjogMTA4OCxcbiAgICBcImNvcmU6OkF2YXRhckVxdWlwcGVkRGF0YVwiOiAxMDkxLFxuICAgIFwiY29yZTo6QXZhdGFyTW9kaWZpZXJBcmVhXCI6IDEwNzAsXG4gICAgXCJjb3JlOjpBdmF0YXJTaGFwZVwiOiAxMDgwLFxuICAgIFwiY29yZTo6QmlsbGJvYXJkXCI6IDEwOTAsXG4gICAgXCJjb3JlOjpDYW1lcmFNb2RlXCI6IDEwNzIsXG4gICAgXCJjb3JlOjpDYW1lcmFNb2RlQXJlYVwiOiAxMDcxLFxuICAgIFwiY29yZTo6RW5naW5lSW5mb1wiOiAxMDQ4LFxuICAgIFwiY29yZTo6R2x0ZkNvbnRhaW5lclwiOiAxMDQxLFxuICAgIFwiY29yZTo6R2x0ZkNvbnRhaW5lckxvYWRpbmdTdGF0ZVwiOiAxMDQ5LFxuICAgIFwiY29yZTo6TWF0ZXJpYWxcIjogMTAxNyxcbiAgICBcImNvcmU6Ok1lc2hDb2xsaWRlclwiOiAxMDE5LFxuICAgIFwiY29yZTo6TWVzaFJlbmRlcmVyXCI6IDEwMTgsXG4gICAgXCJjb3JlOjpOZnRTaGFwZVwiOiAxMDQwLFxuICAgIFwiY29yZTo6UGxheWVySWRlbnRpdHlEYXRhXCI6IDEwODksXG4gICAgXCJjb3JlOjpQb2ludGVyRXZlbnRzXCI6IDEwNjIsXG4gICAgXCJjb3JlOjpQb2ludGVyRXZlbnRzUmVzdWx0XCI6IDEwNjMsXG4gICAgXCJjb3JlOjpQb2ludGVyTG9ja1wiOiAxMDc0LFxuICAgIFwiY29yZTo6UmF5Y2FzdFwiOiAxMDY3LFxuICAgIFwiY29yZTo6UmF5Y2FzdFJlc3VsdFwiOiAxMDY4LFxuICAgIFwiY29yZTo6VGV4dFNoYXBlXCI6IDEwMzAsXG4gICAgXCJjb3JlOjpUd2VlblwiOiAxMTAyLFxuICAgIFwiY29yZTo6VHdlZW5TZXF1ZW5jZVwiOiAxMTA0LFxuICAgIFwiY29yZTo6VHdlZW5TdGF0ZVwiOiAxMTAzLFxuICAgIFwiY29yZTo6VWlCYWNrZ3JvdW5kXCI6IDEwNTMsXG4gICAgXCJjb3JlOjpVaUNhbnZhc0luZm9ybWF0aW9uXCI6IDEwNTQsXG4gICAgXCJjb3JlOjpVaURyb3Bkb3duXCI6IDEwOTQsXG4gICAgXCJjb3JlOjpVaURyb3Bkb3duUmVzdWx0XCI6IDEwOTYsXG4gICAgXCJjb3JlOjpVaUlucHV0XCI6IDEwOTMsXG4gICAgXCJjb3JlOjpVaUlucHV0UmVzdWx0XCI6IDEwOTUsXG4gICAgXCJjb3JlOjpVaVRleHRcIjogMTA1MixcbiAgICBcImNvcmU6OlVpVHJhbnNmb3JtXCI6IDEwNTAsXG4gICAgXCJjb3JlOjpWaWRlb0V2ZW50XCI6IDEwNDQsXG4gICAgXCJjb3JlOjpWaWRlb1BsYXllclwiOiAxMDQzLFxuICAgIFwiY29yZTo6VmlzaWJpbGl0eUNvbXBvbmVudFwiOiAxMDgxXG59O1xuIiwgImltcG9ydCB7IGNvcmVDb21wb25lbnRNYXBwaW5ncyB9IGZyb20gJy4vZ2VuZXJhdGVkL2NvbXBvbmVudC1uYW1lcy5nZW4nO1xuaW1wb3J0ICogYXMgdXRmOCBmcm9tICdAcHJvdG9idWZqcy91dGY4JztcbmltcG9ydCB7IHVuc2lnbmVkQ1JDMzIgfSBmcm9tICcuLi9ydW50aW1lL2NyYyc7XG4vLyBNYXggcG9zc2libGUgcHJlLWRlZmluZWQgKHN0YXRpYykgY29tcG9uZW50LlxuZXhwb3J0IGNvbnN0IE1BWF9TVEFUSUNfQ09NUE9ORU5UID0gMSA8PCAxMTsgLy8gMjA0OFxuLyoqXG4gKiBBbGwgY29tcG9uZW50cyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgY29yZUNvbXBvbmVudE1hcHBpbmdzIE1VU1QgeWllbGRcbiAqIGEgY29tcG9uZW50TnVtYmVyIChjb21wb25lbnRJZCkgZ3JlYXRoZXIgdGhhbiBNQVhfU1RBVElDX0NPTVBPTkVOVC5cbiAqIEZvciB0aGF0IHJlYXNvbiwgd2Ugc2ltcGx5IGFkZCBNQVhfU1RBVElDX0NPTVBPTkVOVCBhbmQgdHJpbSB0byB0aGUgZG9tYWluIDJeMzJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBvbmVudE51bWJlckZyb21OYW1lKGNvbXBvbmVudE5hbWUpIHtcbiAgICBpZiAoY29yZUNvbXBvbmVudE1hcHBpbmdzW2NvbXBvbmVudE5hbWVdKVxuICAgICAgICByZXR1cm4gY29yZUNvbXBvbmVudE1hcHBpbmdzW2NvbXBvbmVudE5hbWVdO1xuICAgIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoMTI4KTtcbiAgICB1dGY4LndyaXRlKGNvbXBvbmVudE5hbWUsIGJ5dGVzLCAwKTtcbiAgICByZXR1cm4gKCh1bnNpZ25lZENSQzMyKGJ5dGVzKSArIE1BWF9TVEFUSUNfQ09NUE9ORU5UKSAmIDQyOTQ5NjcyOTUpID4+PiAwO1xufVxuIiwgImNvbnN0IENSQ19UQUJMRSA9IG5ldyBJbnQzMkFycmF5KFtcbiAgICAweDAwMDAwMDAwLCAweDc3MDczMDk2LCAweGVlMGU2MTJjLCAweDk5MDk1MWJhLCAweDA3NmRjNDE5LCAweDcwNmFmNDhmLCAweGU5NjNhNTM1LCAweDllNjQ5NWEzLCAweDBlZGI4ODMyLFxuICAgIDB4NzlkY2I4YTQsIDB4ZTBkNWU5MWUsIDB4OTdkMmQ5ODgsIDB4MDliNjRjMmIsIDB4N2ViMTdjYmQsIDB4ZTdiODJkMDcsIDB4OTBiZjFkOTEsIDB4MWRiNzEwNjQsIDB4NmFiMDIwZjIsXG4gICAgMHhmM2I5NzE0OCwgMHg4NGJlNDFkZSwgMHgxYWRhZDQ3ZCwgMHg2ZGRkZTRlYiwgMHhmNGQ0YjU1MSwgMHg4M2QzODVjNywgMHgxMzZjOTg1NiwgMHg2NDZiYThjMCwgMHhmZDYyZjk3YSxcbiAgICAweDhhNjVjOWVjLCAweDE0MDE1YzRmLCAweDYzMDY2Y2Q5LCAweGZhMGYzZDYzLCAweDhkMDgwZGY1LCAweDNiNmUyMGM4LCAweDRjNjkxMDVlLCAweGQ1NjA0MWU0LCAweGEyNjc3MTcyLFxuICAgIDB4M2MwM2U0ZDEsIDB4NGIwNGQ0NDcsIDB4ZDIwZDg1ZmQsIDB4YTUwYWI1NmIsIDB4MzViNWE4ZmEsIDB4NDJiMjk4NmMsIDB4ZGJiYmM5ZDYsIDB4YWNiY2Y5NDAsIDB4MzJkODZjZTMsXG4gICAgMHg0NWRmNWM3NSwgMHhkY2Q2MGRjZiwgMHhhYmQxM2Q1OSwgMHgyNmQ5MzBhYywgMHg1MWRlMDAzYSwgMHhjOGQ3NTE4MCwgMHhiZmQwNjExNiwgMHgyMWI0ZjRiNSwgMHg1NmIzYzQyMyxcbiAgICAweGNmYmE5NTk5LCAweGI4YmRhNTBmLCAweDI4MDJiODllLCAweDVmMDU4ODA4LCAweGM2MGNkOWIyLCAweGIxMGJlOTI0LCAweDJmNmY3Yzg3LCAweDU4Njg0YzExLCAweGMxNjExZGFiLFxuICAgIDB4YjY2NjJkM2QsIDB4NzZkYzQxOTAsIDB4MDFkYjcxMDYsIDB4OThkMjIwYmMsIDB4ZWZkNTEwMmEsIDB4NzFiMTg1ODksIDB4MDZiNmI1MWYsIDB4OWZiZmU0YTUsIDB4ZThiOGQ0MzMsXG4gICAgMHg3ODA3YzlhMiwgMHgwZjAwZjkzNCwgMHg5NjA5YTg4ZSwgMHhlMTBlOTgxOCwgMHg3ZjZhMGRiYiwgMHgwODZkM2QyZCwgMHg5MTY0NmM5NywgMHhlNjYzNWMwMSwgMHg2YjZiNTFmNCxcbiAgICAweDFjNmM2MTYyLCAweDg1NjUzMGQ4LCAweGYyNjIwMDRlLCAweDZjMDY5NWVkLCAweDFiMDFhNTdiLCAweDgyMDhmNGMxLCAweGY1MGZjNDU3LCAweDY1YjBkOWM2LCAweDEyYjdlOTUwLFxuICAgIDB4OGJiZWI4ZWEsIDB4ZmNiOTg4N2MsIDB4NjJkZDFkZGYsIDB4MTVkYTJkNDksIDB4OGNkMzdjZjMsIDB4ZmJkNDRjNjUsIDB4NGRiMjYxNTgsIDB4M2FiNTUxY2UsIDB4YTNiYzAwNzQsXG4gICAgMHhkNGJiMzBlMiwgMHg0YWRmYTU0MSwgMHgzZGQ4OTVkNywgMHhhNGQxYzQ2ZCwgMHhkM2Q2ZjRmYiwgMHg0MzY5ZTk2YSwgMHgzNDZlZDlmYywgMHhhZDY3ODg0NiwgMHhkYTYwYjhkMCxcbiAgICAweDQ0MDQyZDczLCAweDMzMDMxZGU1LCAweGFhMGE0YzVmLCAweGRkMGQ3Y2M5LCAweDUwMDU3MTNjLCAweDI3MDI0MWFhLCAweGJlMGIxMDEwLCAweGM5MGMyMDg2LCAweDU3NjhiNTI1LFxuICAgIDB4MjA2Zjg1YjMsIDB4Yjk2NmQ0MDksIDB4Y2U2MWU0OWYsIDB4NWVkZWY5MGUsIDB4MjlkOWM5OTgsIDB4YjBkMDk4MjIsIDB4YzdkN2E4YjQsIDB4NTliMzNkMTcsIDB4MmViNDBkODEsXG4gICAgMHhiN2JkNWMzYiwgMHhjMGJhNmNhZCwgMHhlZGI4ODMyMCwgMHg5YWJmYjNiNiwgMHgwM2I2ZTIwYywgMHg3NGIxZDI5YSwgMHhlYWQ1NDczOSwgMHg5ZGQyNzdhZiwgMHgwNGRiMjYxNSxcbiAgICAweDczZGMxNjgzLCAweGUzNjMwYjEyLCAweDk0NjQzYjg0LCAweDBkNmQ2YTNlLCAweDdhNmE1YWE4LCAweGU0MGVjZjBiLCAweDkzMDlmZjlkLCAweDBhMDBhZTI3LCAweDdkMDc5ZWIxLFxuICAgIDB4ZjAwZjkzNDQsIDB4ODcwOGEzZDIsIDB4MWUwMWYyNjgsIDB4NjkwNmMyZmUsIDB4Zjc2MjU3NWQsIDB4ODA2NTY3Y2IsIDB4MTk2YzM2NzEsIDB4NmU2YjA2ZTcsIDB4ZmVkNDFiNzYsXG4gICAgMHg4OWQzMmJlMCwgMHgxMGRhN2E1YSwgMHg2N2RkNGFjYywgMHhmOWI5ZGY2ZiwgMHg4ZWJlZWZmOSwgMHgxN2I3YmU0MywgMHg2MGIwOGVkNSwgMHhkNmQ2YTNlOCwgMHhhMWQxOTM3ZSxcbiAgICAweDM4ZDhjMmM0LCAweDRmZGZmMjUyLCAweGQxYmI2N2YxLCAweGE2YmM1NzY3LCAweDNmYjUwNmRkLCAweDQ4YjIzNjRiLCAweGQ4MGQyYmRhLCAweGFmMGExYjRjLCAweDM2MDM0YWY2LFxuICAgIDB4NDEwNDdhNjAsIDB4ZGY2MGVmYzMsIDB4YTg2N2RmNTUsIDB4MzE2ZThlZWYsIDB4NDY2OWJlNzksIDB4Y2I2MWIzOGMsIDB4YmM2NjgzMWEsIDB4MjU2ZmQyYTAsIDB4NTI2OGUyMzYsXG4gICAgMHhjYzBjNzc5NSwgMHhiYjBiNDcwMywgMHgyMjAyMTZiOSwgMHg1NTA1MjYyZiwgMHhjNWJhM2JiZSwgMHhiMmJkMGIyOCwgMHgyYmI0NWE5MiwgMHg1Y2IzNmEwNCwgMHhjMmQ3ZmZhNyxcbiAgICAweGI1ZDBjZjMxLCAweDJjZDk5ZThiLCAweDViZGVhZTFkLCAweDliNjRjMmIwLCAweGVjNjNmMjI2LCAweDc1NmFhMzljLCAweDAyNmQ5MzBhLCAweDljMDkwNmE5LCAweGViMGUzNjNmLFxuICAgIDB4NzIwNzY3ODUsIDB4MDUwMDU3MTMsIDB4OTViZjRhODIsIDB4ZTJiODdhMTQsIDB4N2JiMTJiYWUsIDB4MGNiNjFiMzgsIDB4OTJkMjhlOWIsIDB4ZTVkNWJlMGQsIDB4N2NkY2VmYjcsXG4gICAgMHgwYmRiZGYyMSwgMHg4NmQzZDJkNCwgMHhmMWQ0ZTI0MiwgMHg2OGRkYjNmOCwgMHgxZmRhODM2ZSwgMHg4MWJlMTZjZCwgMHhmNmI5MjY1YiwgMHg2ZmIwNzdlMSwgMHgxOGI3NDc3NyxcbiAgICAweDg4MDg1YWU2LCAweGZmMGY2YTcwLCAweDY2MDYzYmNhLCAweDExMDEwYjVjLCAweDhmNjU5ZWZmLCAweGY4NjJhZTY5LCAweDYxNmJmZmQzLCAweDE2NmNjZjQ1LCAweGEwMGFlMjc4LFxuICAgIDB4ZDcwZGQyZWUsIDB4NGUwNDgzNTQsIDB4MzkwM2IzYzIsIDB4YTc2NzI2NjEsIDB4ZDA2MDE2ZjcsIDB4NDk2OTQ3NGQsIDB4M2U2ZTc3ZGIsIDB4YWVkMTZhNGEsIDB4ZDlkNjVhZGMsXG4gICAgMHg0MGRmMGI2NiwgMHgzN2Q4M2JmMCwgMHhhOWJjYWU1MywgMHhkZWJiOWVjNSwgMHg0N2IyY2Y3ZiwgMHgzMGI1ZmZlOSwgMHhiZGJkZjIxYywgMHhjYWJhYzI4YSwgMHg1M2IzOTMzMCxcbiAgICAweDI0YjRhM2E2LCAweGJhZDAzNjA1LCAweGNkZDcwNjkzLCAweDU0ZGU1NzI5LCAweDIzZDk2N2JmLCAweGIzNjY3YTJlLCAweGM0NjE0YWI4LCAweDVkNjgxYjAyLCAweDJhNmYyYjk0LFxuICAgIDB4YjQwYmJlMzcsIDB4YzMwYzhlYTEsIDB4NWEwNWRmMWIsIDB4MmQwMmVmOGRcbl0pO1xuZnVuY3Rpb24gX2NyYzMyKGJ1ZiwgcHJldmlvdXMpIHtcbiAgICBsZXQgY3JjID0gfn5wcmV2aW91cyBeIC0xO1xuICAgIGZvciAobGV0IG4gPSAwOyBuIDwgYnVmLmxlbmd0aDsgbisrKSB7XG4gICAgICAgIGNyYyA9IENSQ19UQUJMRVsoY3JjIF4gYnVmW25dKSAmIDB4ZmZdIF4gKGNyYyA+Pj4gOCk7XG4gICAgfVxuICAgIHJldHVybiBjcmMgXiAtMTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB1bnNpZ25lZENSQzMyKGRhdGEsIHByZXYgPSAwKSB7XG4gICAgcmV0dXJuIF9jcmMzMihkYXRhLCBwcmV2KSA+Pj4gMDtcbn1cbiIsICIvKiBpc3RhbmJ1bCBpZ25vcmUgZmlsZSAqL1xuZXhwb3J0IGNvbnN0IF9fREVWX18gPSAodHlwZW9mIERFQlVHID09PSAnYm9vbGVhbicgJiYgREVCVUcpIHx8XG4gICAgKHR5cGVvZiBwcm9jZXNzID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAocHJvY2Vzcy5lbnY/Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgfHwgcHJvY2Vzcy5lbnY/Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnKSkgfHxcbiAgICBmYWxzZTtcbmV4cG9ydCBmdW5jdGlvbiBjaGVja05vdFRoZW5hYmxlKHQsIGVycm9yKSB7XG4gICAgaWYgKF9fREVWX18pIHtcbiAgICAgICAgaWYgKHQgJiYgdHlwZW9mIHQgPT09ICdvYmplY3QnICYmIHR5cGVvZiB0LnRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHQ7XG59XG4iLCAiLyoqXG4gKlxuICogQHJldHVybnMgYSBuZXcgR1NldFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVmVyc2lvbkdTZXQoKSB7XG4gICAgY29uc3QgbGFzdFZlcnNpb24gPSBuZXcgTWFwKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBudW1iZXJcbiAgICAgICAgICogQHBhcmFtIHZlcnNpb25cbiAgICAgICAgICogQHJldHVybnNcbiAgICAgICAgICovXG4gICAgICAgIGFkZFRvKG51bWJlciwgdmVyc2lvbikge1xuICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgICAgIGlmICh2ZXJzaW9uIDwgMCkge1xuICAgICAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gbGFzdFZlcnNpb24uZ2V0KG51bWJlcik7XG4gICAgICAgICAgICAvLyBJZiB0aGUgdmVyc2lvbiBpcyA+PSwgaXQgbWVhbnMgdGhlIHZhbHVlIGl0J3MgYWxyZWFkeSBpbiB0aGUgc2V0XG4gICAgICAgICAgICBpZiAoY3VycmVudFZhbHVlICE9PSB1bmRlZmluZWQgJiYgY3VycmVudFZhbHVlID49IHZlcnNpb24pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxhc3RWZXJzaW9uLnNldChudW1iZXIsIHZlcnNpb24pO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcmV0dXJucyB0aGUgc2V0IHdpdGggW251bWJlciwgdmVyc2lvbl0gb2YgZWFjaCB2YWx1ZVxuICAgICAgICAgKi9cbiAgICAgICAgaGFzKG4sIHYpIHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGxhc3RWZXJzaW9uLmdldChuKTtcbiAgICAgICAgICAgIC8vIElmIHRoZSB2ZXJzaW9uIGlzID49LCBpdCBtZWFucyB0aGUgdmFsdWUgaXQncyBhbHJlYWR5IGluIHRoZSBzZXRcbiAgICAgICAgICAgIGlmIChjdXJyZW50VmFsdWUgIT09IHVuZGVmaW5lZCAmJiBjdXJyZW50VmFsdWUgPj0gdikge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogV2FybmluZzogdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSByZWZlcmVuY2UgdG8gdGhlIGludGVybmFsIG1hcCxcbiAgICAgICAgICogIGlmIHlvdSBuZWVkIHRvIG11dGF0ZSBzb21lIHZhbHVlLCBtYWtlIGEgY29weS5cbiAgICAgICAgICogRm9yIG9wdGltaXphdGlvbiBwdXJwb3NlIHRoZSBjb3B5IGlzbid0IG1hZGUgaGVyZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybnMgdGhlIG1hcCBvZiBudW1iZXIgdG8gdmVyc2lvblxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0TWFwKCkge1xuICAgICAgICAgICAgcmV0dXJuIGxhc3RWZXJzaW9uO1xuICAgICAgICB9XG4gICAgfTtcbn1cbiIsICJpbXBvcnQgeyBjcmVhdGVWZXJzaW9uR1NldCB9IGZyb20gJy4uL3N5c3RlbXMvY3JkdC9nc2V0Jztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBNQVhfVTE2ID0gMHhmZmZmO1xuY29uc3QgTUFTS19VUFBFUl8xNl9PTl8zMiA9IDB4ZmZmZjAwMDA7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgQU1PVU5UX1ZFUlNJT05fQVZBSUxBQkxFID0gTUFYX1UxNiArIDE7XG4vLyBUaGlzIHR5cGUgbWF0Y2hlcyB3aXRoIEBkY2wvY3JkdCBlbnRpdHkgdHlwZS5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBNQVhfRU5USVRZX05VTUJFUiA9IE1BWF9VMTY7XG4vKipcbiAqIFRoaXMgZmlyc3QgNTEyIGVudGl0aWVzIGFyZSByZXNlcnZlZCBieSB0aGUgcmVuZGVyZXJcbiAqL1xuZXhwb3J0IGNvbnN0IFJFU0VSVkVEX1NUQVRJQ19FTlRJVElFUyA9IDUxMjtcbi8vIE1heCBhbW91bnQgb2YgbG9jYWwgZW50aXRpZXMgdGhhdCBjYW4gYmUgY3JlYXRlZFxuZXhwb3J0IGNvbnN0IFJFU0VSVkVEX0xPQ0FMX0VOVElUSUVTID0gTUFYX0VOVElUWV9OVU1CRVI7XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHZhciBFbnRpdHlVdGlscztcbihmdW5jdGlvbiAoRW50aXR5VXRpbHMpIHtcbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBbZW50aXR5TnVtYmVyLCBlbnRpdHlWZXJzaW9uXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZyb21FbnRpdHlJZChlbnRpdHlJZCkge1xuICAgICAgICByZXR1cm4gWyhlbnRpdHlJZCAmIE1BWF9VMTYpID4+PiAwLCAoKChlbnRpdHlJZCAmIE1BU0tfVVBQRVJfMTZfT05fMzIpID4+IDE2KSAmIE1BWF9VMTYpID4+PiAwXTtcbiAgICB9XG4gICAgRW50aXR5VXRpbHMuZnJvbUVudGl0eUlkID0gZnJvbUVudGl0eUlkO1xuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIGNvbXBvdW5kIG51bWJlciBmcm9tIGVudGl0eU51bWJlciBhbmQgZW50aXR5VmVyaXNvblxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvRW50aXR5SWQoZW50aXR5TnVtYmVyLCBlbnRpdHlWZXJzaW9uKSB7XG4gICAgICAgIHJldHVybiAoKChlbnRpdHlOdW1iZXIgJiBNQVhfVTE2KSB8ICgoZW50aXR5VmVyc2lvbiAmIE1BWF9VMTYpIDw8IDE2KSkgPj4+IDApO1xuICAgIH1cbiAgICBFbnRpdHlVdGlscy50b0VudGl0eUlkID0gdG9FbnRpdHlJZDtcbn0pKEVudGl0eVV0aWxzIHx8IChFbnRpdHlVdGlscyA9IHt9KSk7XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHZhciBFbnRpdHlTdGF0ZTtcbihmdW5jdGlvbiAoRW50aXR5U3RhdGUpIHtcbiAgICBFbnRpdHlTdGF0ZVtFbnRpdHlTdGF0ZVtcIlVua25vd25cIl0gPSAwXSA9IFwiVW5rbm93blwiO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbnRpdHkgd2FzIGdlbmVyYXRlZCBhbmQgYWRkZWQgdG8gdGhlIHVzZWRFbnRpdGllcyBzZXRcbiAgICAgKi9cbiAgICBFbnRpdHlTdGF0ZVtFbnRpdHlTdGF0ZVtcIlVzZWRFbnRpdHlcIl0gPSAxXSA9IFwiVXNlZEVudGl0eVwiO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbnRpdHkgd2FzIHJlbW92ZWQgZnJvbSBjdXJyZW50IGVuZ2luZSBvciByZW1vdGVseVxuICAgICAqL1xuICAgIEVudGl0eVN0YXRlW0VudGl0eVN0YXRlW1wiUmVtb3ZlZFwiXSA9IDJdID0gXCJSZW1vdmVkXCI7XG4gICAgLyoqXG4gICAgICogVGhlIGVudGl0eSBpcyByZXNlcnZlZCBudW1iZXIuXG4gICAgICovXG4gICAgRW50aXR5U3RhdGVbRW50aXR5U3RhdGVbXCJSZXNlcnZlZFwiXSA9IDNdID0gXCJSZXNlcnZlZFwiO1xufSkoRW50aXR5U3RhdGUgfHwgKEVudGl0eVN0YXRlID0ge30pKTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBFbnRpdHlDb250YWluZXIoKSB7XG4gICAgLy8gTG9jYWwgZW50aXRpZXMgY291bnRlclxuICAgIGxldCBlbnRpdHlDb3VudGVyID0gUkVTRVJWRURfU1RBVElDX0VOVElUSUVTO1xuICAgIC8vIE5ldHdvcmsgZW50aXRpZXMgY291bnRlclxuICAgIGxldCBuZXR3b3JrRW50aXR5Q291bnRlcjtcbiAgICAvLyBOZXR3b3JrIGVudGl0aWVzIHJhbmdlIHRoYXQgY2FuIGJlIGNyZWF0ZWQgYnkgdGhlIHVzZXJcbiAgICBsZXQgbmV0d29ya2VkRW50aXRpZXNSYW5nZTtcbiAgICBjb25zdCB1c2VkRW50aXRpZXMgPSBuZXcgU2V0KCk7XG4gICAgbGV0IHRvUmVtb3ZlRW50aXRpZXMgPSBbXTtcbiAgICBjb25zdCByZW1vdmVkRW50aXRpZXMgPSBjcmVhdGVWZXJzaW9uR1NldCgpO1xuICAgIGxldCBsb2NhbEVudGl0aWVzQXZhaWxhYmxlID0gUkVTRVJWRURfTE9DQUxfRU5USVRJRVM7XG4gICAgZnVuY3Rpb24gc2V0TmV0d29ya0VudGl0aWVzUmFuZ2UocmVzZXJ2ZWRMb2NhbEVudGl0aWVzLCByYW5nZSkge1xuICAgICAgICBsb2NhbEVudGl0aWVzQXZhaWxhYmxlID0gcmVzZXJ2ZWRMb2NhbEVudGl0aWVzO1xuICAgICAgICBuZXR3b3JrZWRFbnRpdGllc1JhbmdlID0gcmFuZ2U7XG4gICAgICAgIG5ldHdvcmtFbnRpdHlDb3VudGVyID0gcmFuZ2VbMF07XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdlbmVyYXRlTmV3RW50aXR5KG5ldHdvcmtlZCkge1xuICAgICAgICBpZiAoZW50aXR5Q291bnRlciA+IE1BWF9FTlRJVFlfTlVNQkVSIC0gMSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJdCBmYWlscyB0cnlpbmcgdG8gZ2VuZXJhdGUgYW4gZW50aXR5IG91dCBvZiByYW5nZSAke01BWF9FTlRJVFlfTlVNQkVSfS5gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobmV0d29ya2VkICYmIG5ldHdvcmtFbnRpdHlDb3VudGVyID4gbmV0d29ya2VkRW50aXRpZXNSYW5nZVsxXSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNYXggYW1vdW50IG9mIG5ldHdvcmsgZW50aXRpZXMgcmVhY2hlZCAke25ldHdvcmtlZEVudGl0aWVzUmFuZ2VbMV19IGApO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbmV0d29ya2VkICYmIGVudGl0eUNvdW50ZXIgPj0gbG9jYWxFbnRpdGllc0F2YWlsYWJsZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNYXggYW1vdW50IG9mIGxvY2FsIGVudGl0aWVzIHJlYWNoZWQgJHtsb2NhbEVudGl0aWVzQXZhaWxhYmxlfWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVudGl0eU51bWJlciA9IG5ldHdvcmtlZCA/IG5ldHdvcmtFbnRpdHlDb3VudGVyKysgOiBlbnRpdHlDb3VudGVyKys7XG4gICAgICAgIGNvbnN0IGVudGl0eVZlcnNpb24gPSByZW1vdmVkRW50aXRpZXMuZ2V0TWFwKCkuaGFzKGVudGl0eU51bWJlcilcbiAgICAgICAgICAgID8gcmVtb3ZlZEVudGl0aWVzLmdldE1hcCgpLmdldChlbnRpdHlOdW1iZXIpICsgMVxuICAgICAgICAgICAgOiAwO1xuICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlVdGlscy50b0VudGl0eUlkKGVudGl0eU51bWJlciwgZW50aXR5VmVyc2lvbik7XG4gICAgICAgIGlmICh1c2VkRW50aXRpZXMuaGFzKGVudGl0eSkpIHtcbiAgICAgICAgICAgIHJldHVybiBnZW5lcmF0ZU5ld0VudGl0eSgpO1xuICAgICAgICB9XG4gICAgICAgIHVzZWRFbnRpdGllcy5hZGQoZW50aXR5KTtcbiAgICAgICAgcmV0dXJuIGVudGl0eTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2VuZXJhdGVFbnRpdHkobmV0d29ya2VkKSB7XG4gICAgICAgIGlmIChuZXR3b3JrZWQgJiYgIW5ldHdvcmtlZEVudGl0aWVzUmFuZ2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTmV0d29yayBlbnRpdGllcyByYW5nZWQgbm90IGluaXRpYWxpemVkLiBDb25uZWN0IHRvIGEgQ1JEVCBTZXJ2ZXInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1c2VkTmV0d29ya1NpemUgPSAobmV0d29ya2VkRW50aXRpZXNSYW5nZSAmJlxuICAgICAgICAgICAgWy4uLnVzZWRFbnRpdGllcy52YWx1ZXMoKV0uZmlsdGVyKCgkKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgW2VudGl0eUlkXSA9IEVudGl0eVV0aWxzLmZyb21FbnRpdHlJZCgkKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW50aXR5SWQgPj0gbmV0d29ya2VkRW50aXRpZXNSYW5nZVswXSAmJiBlbnRpdHlJZCA8PSBuZXR3b3JrZWRFbnRpdGllc1JhbmdlWzFdO1xuICAgICAgICAgICAgfSkubGVuZ3RoKSA/P1xuICAgICAgICAgICAgMDtcbiAgICAgICAgY29uc3QgdXNlZFNpemUgPSB1c2VkRW50aXRpZXMuc2l6ZSAtIHVzZWROZXR3b3JrU2l6ZTtcbiAgICAgICAgLy8gSWYgYWxsIGVudGl0aWVzIHVudGlsIGBlbnRpdHlDb3VudGVyYCBhcmUgYmVpbmcgdXNlZCwgd2UgbmVlZCB0byBnZW5lcmF0ZSBhbm90aGVyIG9uZVxuICAgICAgICBpZiAoIW5ldHdvcmtlZCAmJiB1c2VkU2l6ZSArIFJFU0VSVkVEX1NUQVRJQ19FTlRJVElFUyA+PSBlbnRpdHlDb3VudGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVOZXdFbnRpdHkobmV0d29ya2VkKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiBhbGwgZW50aXRpZXMgdW50aWwgYGVudGl0eUNvdW50ZXJgIGFyZSBiZWluZyB1c2VkLCB3ZSBuZWVkIHRvIGdlbmVyYXRlIGFub3RoZXIgb25lXG4gICAgICAgIGlmIChuZXR3b3JrZWQgJiYgdXNlZE5ldHdvcmtTaXplICsgbmV0d29ya2VkRW50aXRpZXNSYW5nZVswXSA+PSBuZXR3b3JrRW50aXR5Q291bnRlcikge1xuICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlTmV3RW50aXR5KG5ldHdvcmtlZCk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBbbnVtYmVyLCB2ZXJzaW9uXSBvZiByZW1vdmVkRW50aXRpZXMuZ2V0TWFwKCkpIHtcbiAgICAgICAgICAgIGlmICh2ZXJzaW9uIDwgTUFYX1UxNikge1xuICAgICAgICAgICAgICAgIGlmIChuZXR3b3JrZWQgJiYgKG51bWJlciA8IG5ldHdvcmtlZEVudGl0aWVzUmFuZ2VbMF0gfHwgbnVtYmVyID4gbmV0d29ya2VkRW50aXRpZXNSYW5nZVsxXSkpXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGlmICghbmV0d29ya2VkICYmIG51bWJlciA+PSBsb2NhbEVudGl0aWVzQXZhaWxhYmxlKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlVdGlscy50b0VudGl0eUlkKG51bWJlciwgdmVyc2lvbiArIDEpO1xuICAgICAgICAgICAgICAgIC8vIElmIHRoZSBlbnRpdHkgaXMgbm90IGJlaW5nIHVzZWQsIHdlIGNhbiByZS11c2UgaXRcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgZW50aXR5IHdhcyByZW1vdmVkIGluIHRoaXMgdGljaywgd2UncmUgbm90IGNvdW50aW5nIGZvciB0aGUgdXNlZEVudGl0aWVzLCBidXQgd2UgaGF2ZSBpdCBpbiB0aGUgdG9SZW1vdmVFbnRpdHlBcnJheVxuICAgICAgICAgICAgICAgIGlmICghdXNlZEVudGl0aWVzLmhhcyhlbnRpdHkpICYmICF0b1JlbW92ZUVudGl0aWVzLmluY2x1ZGVzKGVudGl0eSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdXNlZEVudGl0aWVzLmFkZChlbnRpdHkpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW50aXR5O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZ2VuZXJhdGVOZXdFbnRpdHkobmV0d29ya2VkKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVtb3ZlRW50aXR5KGVudGl0eSkge1xuICAgICAgICBpZiAoZW50aXR5IDwgUkVTRVJWRURfU1RBVElDX0VOVElUSUVTKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAodXNlZEVudGl0aWVzLmhhcyhlbnRpdHkpKSB7XG4gICAgICAgICAgICB1c2VkRW50aXRpZXMuZGVsZXRlKGVudGl0eSk7XG4gICAgICAgICAgICB0b1JlbW92ZUVudGl0aWVzLnB1c2goZW50aXR5KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHVwZGF0ZVJlbW92ZWRFbnRpdHkoZW50aXR5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVsZWFzZVJlbW92ZWRFbnRpdGllcygpIHtcbiAgICAgICAgY29uc3QgYXJyID0gdG9SZW1vdmVFbnRpdGllcztcbiAgICAgICAgaWYgKGFyci5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRvUmVtb3ZlRW50aXRpZXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZW50aXR5IG9mIGFycikge1xuICAgICAgICAgICAgICAgIGNvbnN0IFtuLCB2XSA9IEVudGl0eVV0aWxzLmZyb21FbnRpdHlJZChlbnRpdHkpO1xuICAgICAgICAgICAgICAgIHJlbW92ZWRFbnRpdGllcy5hZGRUbyhuLCB2KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH1cbiAgICBmdW5jdGlvbiB1cGRhdGVSZW1vdmVkRW50aXR5KGVudGl0eSkge1xuICAgICAgICBjb25zdCBbbiwgdl0gPSBFbnRpdHlVdGlscy5mcm9tRW50aXR5SWQoZW50aXR5KTtcbiAgICAgICAgLy8gVXBkYXRlIHRoZSByZW1vdmVkIGVudGl0aWVzIG1hcFxuICAgICAgICByZW1vdmVkRW50aXRpZXMuYWRkVG8obiwgdik7XG4gICAgICAgIC8vIFJlbW92ZSB0aGUgdXNlZEVudGl0aWVzIGlmIGV4aXN0XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IHY7IGkrKykge1xuICAgICAgICAgICAgdXNlZEVudGl0aWVzLmRlbGV0ZShFbnRpdHlVdGlscy50b0VudGl0eUlkKG4sIGkpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdXBkYXRlVXNlZEVudGl0eShlbnRpdHkpIHtcbiAgICAgICAgY29uc3QgW24sIHZdID0gRW50aXR5VXRpbHMuZnJvbUVudGl0eUlkKGVudGl0eSk7XG4gICAgICAgIC8vIGlmIHRoZSBlbnRpdHkgd2FzIHJlbW92ZWQgdGhlbiBhYm9ydCBmYXN0XG4gICAgICAgIGlmIChyZW1vdmVkRW50aXRpZXMuaGFzKG4sIHYpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAvLyBVcGRhdGVcbiAgICAgICAgaWYgKHYgPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8PSB2IC0gMTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdXNlZEVudGl0aWVzLmRlbGV0ZShFbnRpdHlVdGlscy50b0VudGl0eUlkKG4sIGkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlbW92ZWRFbnRpdGllcy5hZGRUbyhuLCB2IC0gMSk7XG4gICAgICAgIH1cbiAgICAgICAgdXNlZEVudGl0aWVzLmFkZChlbnRpdHkpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0RW50aXR5U3RhdGUoZW50aXR5KSB7XG4gICAgICAgIGNvbnN0IFtuLCB2XSA9IEVudGl0eVV0aWxzLmZyb21FbnRpdHlJZChlbnRpdHkpO1xuICAgICAgICBpZiAobiA8IFJFU0VSVkVEX1NUQVRJQ19FTlRJVElFUykge1xuICAgICAgICAgICAgcmV0dXJuIEVudGl0eVN0YXRlLlJlc2VydmVkO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1c2VkRW50aXRpZXMuaGFzKGVudGl0eSkpIHtcbiAgICAgICAgICAgIHJldHVybiBFbnRpdHlTdGF0ZS5Vc2VkRW50aXR5O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlbW92ZWRWZXJzaW9uID0gcmVtb3ZlZEVudGl0aWVzLmdldE1hcCgpLmdldChuKTtcbiAgICAgICAgaWYgKHJlbW92ZWRWZXJzaW9uICE9PSB1bmRlZmluZWQgJiYgcmVtb3ZlZFZlcnNpb24gPj0gdikge1xuICAgICAgICAgICAgcmV0dXJuIEVudGl0eVN0YXRlLlJlbW92ZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEVudGl0eVN0YXRlLlVua25vd247XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHNldE5ldHdvcmtFbnRpdGllc1JhbmdlLFxuICAgICAgICBnZW5lcmF0ZUVudGl0eSxcbiAgICAgICAgcmVtb3ZlRW50aXR5LFxuICAgICAgICBnZXRFeGlzdGluZ0VudGl0aWVzKCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXQodXNlZEVudGl0aWVzKTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0RW50aXR5U3RhdGUsXG4gICAgICAgIHJlbGVhc2VSZW1vdmVkRW50aXRpZXMsXG4gICAgICAgIHVwZGF0ZVJlbW92ZWRFbnRpdHksXG4gICAgICAgIHVwZGF0ZVVzZWRFbnRpdHlcbiAgICB9O1xufVxuIiwgInZhciBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0ID0gKHRoaXMgJiYgdGhpcy5fX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KSB8fCBmdW5jdGlvbiAocmVjZWl2ZXIsIHN0YXRlLCBraW5kLCBmKSB7XG4gICAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgZ2V0dGVyXCIpO1xuICAgIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHJlYWQgcHJpdmF0ZSBtZW1iZXIgZnJvbSBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xuICAgIHJldHVybiBraW5kID09PSBcIm1cIiA/IGYgOiBraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlcikgOiBmID8gZi52YWx1ZSA6IHN0YXRlLmdldChyZWNlaXZlcik7XG59O1xudmFyIF9SZWFkV3JpdGVCeXRlQnVmZmVyX2luc3RhbmNlcywgX1JlYWRXcml0ZUJ5dGVCdWZmZXJfd29BZGQsIF9SZWFkV3JpdGVCeXRlQnVmZmVyX3JvQWRkO1xuaW1wb3J0ICogYXMgdXRmOCBmcm9tICdAcHJvdG9idWZqcy91dGY4Jztcbi8qKlxuICogVGFrZSB0aGUgbWF4IGJldHdlZW4gY3VycmVudFNpemUgYW5kIGludGVuZGVkU2l6ZSBhbmQgdGhlbiBwbHVzIDEwMjQuIFRoZW4sXG4gKiAgZmluZCB0aGUgbmV4dCBuZWFyZXIgbXVsdGlwbGUgb2YgMTAyNC5cbiAqIEBwYXJhbSBjdXJyZW50U2l6ZSAtIG51bWJlclxuICogQHBhcmFtIGludGVuZGVkU2l6ZSAtIG51bWJlclxuICogQHJldHVybnMgdGhlIGNhbGN1bGF0ZWQgbnVtYmVyXG4gKi9cbmZ1bmN0aW9uIGdldE5leHRTaXplKGN1cnJlbnRTaXplLCBpbnRlbmRlZFNpemUpIHtcbiAgICBjb25zdCBtaW5OZXdTaXplID0gTWF0aC5tYXgoY3VycmVudFNpemUsIGludGVuZGVkU2l6ZSkgKyAxMDI0O1xuICAgIHJldHVybiBNYXRoLmNlaWwobWluTmV3U2l6ZSAvIDEwMjQpICogMTAyNDtcbn1cbmNvbnN0IGRlZmF1bHRJbml0aWFsQ2FwYWNpdHkgPSAxMDI0MDtcbi8qKlxuICogQnl0ZUJ1ZmZlciBpcyBhIHdyYXBwZXIgb2YgRGF0YVZpZXcgd2hpY2ggYWxzbyBhZGRzIGEgcmVhZCBhbmQgd3JpdGUgb2Zmc2V0LlxuICogIEFsc28gaW4gYSB3cml0ZSBvcGVyYXRpb24gaXQgcmVzaXplcyB0aGUgYnVmZmVyIGlzIGJlaW5nIHVzZWQgaWYgaXQgbmVlZHMuXG4gKlxuICogLSBVc2UgcmVhZCBhbmQgd3JpdGUgZnVuY3Rpb24gdG8gZ2VuZXJhdGUgb3IgY29uc3VtZSBkYXRhLlxuICogLSBVc2Ugc2V0IGFuZCBnZXQgb25seSBpZiB5b3UgYXJlIHN1cmUgdGhhdCB5b3UncmUgZG9pbmcuXG4gKlxuICogSXQgYWx3YXlzIHBhc3NlcyBsaXR0bGVFbmRpYW4gcGFyYW0gYXMgdHJ1ZVxuICovXG5leHBvcnQgY2xhc3MgUmVhZFdyaXRlQnl0ZUJ1ZmZlciB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIGJ1ZmZlciAtIFRoZSBpbml0aWFsIGJ1ZmZlciwgcHJvdmlkZSBhIGJ1ZmZlciBpZiB5b3UgbmVlZCB0byBzZXQgXCJpbml0aWFsIGNhcGFjaXR5XCJcbiAgICAgKiBAcGFyYW0gcmVhZGluZ09mZnNldCAtIFNldCB0aGUgY3Vyc29yIHdoZXJlIGJlZ2lucyB0byByZWFkLiBEZWZhdWx0IDBcbiAgICAgKiBAcGFyYW0gd3JpdGluZ09mZnNldCAtIFNldCB0aGUgY3Vyc29yIHRvIG5vdCBzdGFydCB3cml0aW5nIGZyb20gdGhlIGJlZ2luIG9mIGl0LiBEZWZhdWx0cyB0byB0aGUgYnVmZmVyIHNpemVcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihidWZmZXIsIHJlYWRpbmdPZmZzZXQsIHdyaXRpbmdPZmZzZXQpIHtcbiAgICAgICAgX1JlYWRXcml0ZUJ5dGVCdWZmZXJfaW5zdGFuY2VzLmFkZCh0aGlzKTtcbiAgICAgICAgdGhpcy5fYnVmZmVyID0gYnVmZmVyIHx8IG5ldyBVaW50OEFycmF5KGRlZmF1bHRJbml0aWFsQ2FwYWNpdHkpO1xuICAgICAgICB0aGlzLnZpZXcgPSBuZXcgRGF0YVZpZXcodGhpcy5fYnVmZmVyLmJ1ZmZlciwgdGhpcy5fYnVmZmVyLmJ5dGVPZmZzZXQpO1xuICAgICAgICB0aGlzLndvZmZzZXQgPSB3cml0aW5nT2Zmc2V0ID8/IChidWZmZXIgPyB0aGlzLl9idWZmZXIubGVuZ3RoIDogbnVsbCkgPz8gMDtcbiAgICAgICAgdGhpcy5yb2Zmc2V0ID0gcmVhZGluZ09mZnNldCA/PyAwO1xuICAgIH1cbiAgICBidWZmZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9idWZmZXI7XG4gICAgfVxuICAgIGJ1ZmZlckxlbmd0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2J1ZmZlci5sZW5ndGg7XG4gICAgfVxuICAgIHJlc2V0QnVmZmVyKCkge1xuICAgICAgICB0aGlzLnJvZmZzZXQgPSAwO1xuICAgICAgICB0aGlzLndvZmZzZXQgPSAwO1xuICAgIH1cbiAgICBjdXJyZW50UmVhZE9mZnNldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucm9mZnNldDtcbiAgICB9XG4gICAgY3VycmVudFdyaXRlT2Zmc2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy53b2Zmc2V0O1xuICAgIH1cbiAgICBpbmNyZW1lbnRSZWFkT2Zmc2V0KGFtb3VudCkge1xuICAgICAgICByZXR1cm4gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfUmVhZFdyaXRlQnl0ZUJ1ZmZlcl9pbnN0YW5jZXMsIFwibVwiLCBfUmVhZFdyaXRlQnl0ZUJ1ZmZlcl9yb0FkZCkuY2FsbCh0aGlzLCBhbW91bnQpO1xuICAgIH1cbiAgICByZW1haW5pbmdCeXRlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud29mZnNldCAtIHRoaXMucm9mZnNldDtcbiAgICB9XG4gICAgcmVhZEZsb2F0MzIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZXcuZ2V0RmxvYXQzMihfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9SZWFkV3JpdGVCeXRlQnVmZmVyX2luc3RhbmNlcywgXCJtXCIsIF9SZWFkV3JpdGVCeXRlQnVmZmVyX3JvQWRkKS5jYWxsKHRoaXMsIDQpLCB0cnVlKTsgLy8gbGl0dGxlRW5kaWFuID0gdHJ1ZVxuICAgIH1cbiAgICByZWFkRmxvYXQ2NCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlldy5nZXRGbG9hdDY0KF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1JlYWRXcml0ZUJ5dGVCdWZmZXJfaW5zdGFuY2VzLCBcIm1cIiwgX1JlYWRXcml0ZUJ5dGVCdWZmZXJfcm9BZGQpLmNhbGwodGhpcywgOCksIHRydWUpOyAvLyBsaXR0bGVFbmRpYW4gPSB0cnVlXG4gICAgfVxuICAgIHJlYWRJbnQ4KCkge1xuICAgICAgICByZXR1cm4gdGhpcy52aWV3LmdldEludDgoX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfUmVhZFdyaXRlQnl0ZUJ1ZmZlcl9pbnN0YW5jZXMsIFwibVwiLCBfUmVhZFdyaXRlQnl0ZUJ1ZmZlcl9yb0FkZCkuY2FsbCh0aGlzLCAxKSk7XG4gICAgfVxuICAgIHJlYWRJbnQxNigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlldy5nZXRJbnQxNihfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9SZWFkV3JpdGVCeXRlQnVmZmVyX2luc3RhbmNlcywgXCJtXCIsIF9SZWFkV3JpdGVCeXRlQnVmZmVyX3JvQWRkKS5jYWxsKHRoaXMsIDIpLCB0cnVlKTsgLy8gbGl0dGxlRW5kaWFuID0gdHJ1ZVxuICAgIH1cbiAgICByZWFkSW50MzIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZXcuZ2V0SW50MzIoX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfUmVhZFdyaXRlQnl0ZUJ1ZmZlcl9pbnN0YW5jZXMsIFwibVwiLCBfUmVhZFdyaXRlQnl0ZUJ1ZmZlcl9yb0FkZCkuY2FsbCh0aGlzLCA0KSwgdHJ1ZSk7IC8vIGxpdHRsZUVuZGlhbiA9IHRydWVcbiAgICB9XG4gICAgcmVhZEludDY0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy52aWV3LmdldEJpZ0ludDY0KF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1JlYWRXcml0ZUJ5dGVCdWZmZXJfaW5zdGFuY2VzLCBcIm1cIiwgX1JlYWRXcml0ZUJ5dGVCdWZmZXJfcm9BZGQpLmNhbGwodGhpcywgOCksIHRydWUpOyAvLyBsaXR0bGVFbmRpYW4gPSB0cnVlXG4gICAgfVxuICAgIHJlYWRVaW50OCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlldy5nZXRVaW50OChfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9SZWFkV3JpdGVCeXRlQnVmZmVyX2luc3RhbmNlcywgXCJtXCIsIF9SZWFkV3JpdGVCeXRlQnVmZmVyX3JvQWRkKS5jYWxsKHRoaXMsIDEpKTtcbiAgICB9XG4gICAgcmVhZFVpbnQxNigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlldy5nZXRVaW50MTYoX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfUmVhZFdyaXRlQnl0ZUJ1ZmZlcl9pbnN0YW5jZXMsIFwibVwiLCBfUmVhZFdyaXRlQnl0ZUJ1ZmZlcl9yb0FkZCkuY2FsbCh0aGlzLCAyKSwgdHJ1ZSk7IC8vIGxpdHRsZUVuZGlhbiA9IHRydWVcbiAgICB9XG4gICAgcmVhZFVpbnQzMigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlldy5nZXRVaW50MzIoX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfUmVhZFdyaXRlQnl0ZUJ1ZmZlcl9pbnN0YW5jZXMsIFwibVwiLCBfUmVhZFdyaXRlQnl0ZUJ1ZmZlcl9yb0FkZCkuY2FsbCh0aGlzLCA0KSwgdHJ1ZSk7IC8vIGxpdHRsZUVuZGlhbiA9IHRydWVcbiAgICB9XG4gICAgcmVhZFVpbnQ2NCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlldy5nZXRCaWdVaW50NjQoX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfUmVhZFdyaXRlQnl0ZUJ1ZmZlcl9pbnN0YW5jZXMsIFwibVwiLCBfUmVhZFdyaXRlQnl0ZUJ1ZmZlcl9yb0FkZCkuY2FsbCh0aGlzLCA4KSwgdHJ1ZSk7IC8vIGxpdHRsZUVuZGlhbiA9IHRydWVcbiAgICB9XG4gICAgcmVhZEJ1ZmZlcigpIHtcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gdGhpcy52aWV3LmdldFVpbnQzMihfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9SZWFkV3JpdGVCeXRlQnVmZmVyX2luc3RhbmNlcywgXCJtXCIsIF9SZWFkV3JpdGVCeXRlQnVmZmVyX3JvQWRkKS5jYWxsKHRoaXMsIDQpLCB0cnVlKTsgLy8gbGl0dGxlRW5kaWFuID0gdHJ1ZVxuICAgICAgICByZXR1cm4gdGhpcy5fYnVmZmVyLnN1YmFycmF5KF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1JlYWRXcml0ZUJ5dGVCdWZmZXJfaW5zdGFuY2VzLCBcIm1cIiwgX1JlYWRXcml0ZUJ5dGVCdWZmZXJfcm9BZGQpLmNhbGwodGhpcywgbGVuZ3RoKSwgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfUmVhZFdyaXRlQnl0ZUJ1ZmZlcl9pbnN0YW5jZXMsIFwibVwiLCBfUmVhZFdyaXRlQnl0ZUJ1ZmZlcl9yb0FkZCkuY2FsbCh0aGlzLCAwKSk7XG4gICAgfVxuICAgIHJlYWRVdGY4U3RyaW5nKCkge1xuICAgICAgICBjb25zdCBsZW5ndGggPSB0aGlzLnZpZXcuZ2V0VWludDMyKF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1JlYWRXcml0ZUJ5dGVCdWZmZXJfaW5zdGFuY2VzLCBcIm1cIiwgX1JlYWRXcml0ZUJ5dGVCdWZmZXJfcm9BZGQpLmNhbGwodGhpcywgNCksIHRydWUpOyAvLyBsaXR0bGVFbmRpYW4gPSB0cnVlXG4gICAgICAgIHJldHVybiB1dGY4LnJlYWQodGhpcy5fYnVmZmVyLCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9SZWFkV3JpdGVCeXRlQnVmZmVyX2luc3RhbmNlcywgXCJtXCIsIF9SZWFkV3JpdGVCeXRlQnVmZmVyX3JvQWRkKS5jYWxsKHRoaXMsIGxlbmd0aCksIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1JlYWRXcml0ZUJ5dGVCdWZmZXJfaW5zdGFuY2VzLCBcIm1cIiwgX1JlYWRXcml0ZUJ5dGVCdWZmZXJfcm9BZGQpLmNhbGwodGhpcywgMCkpO1xuICAgIH1cbiAgICBpbmNyZW1lbnRXcml0ZU9mZnNldChhbW91bnQpIHtcbiAgICAgICAgcmV0dXJuIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1JlYWRXcml0ZUJ5dGVCdWZmZXJfaW5zdGFuY2VzLCBcIm1cIiwgX1JlYWRXcml0ZUJ5dGVCdWZmZXJfd29BZGQpLmNhbGwodGhpcywgYW1vdW50KTtcbiAgICB9XG4gICAgdG9CaW5hcnkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9idWZmZXIuc3ViYXJyYXkoMCwgdGhpcy53b2Zmc2V0KTtcbiAgICB9XG4gICAgdG9Db3BpZWRCaW5hcnkoKSB7XG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSh0aGlzLnRvQmluYXJ5KCkpO1xuICAgIH1cbiAgICB3cml0ZUJ1ZmZlcih2YWx1ZSwgd3JpdGVMZW5ndGggPSB0cnVlKSB7XG4gICAgICAgIGlmICh3cml0ZUxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy53cml0ZVVpbnQzMih2YWx1ZS5ieXRlTGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvID0gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfUmVhZFdyaXRlQnl0ZUJ1ZmZlcl9pbnN0YW5jZXMsIFwibVwiLCBfUmVhZFdyaXRlQnl0ZUJ1ZmZlcl93b0FkZCkuY2FsbCh0aGlzLCB2YWx1ZS5ieXRlTGVuZ3RoKTtcbiAgICAgICAgdGhpcy5fYnVmZmVyLnNldCh2YWx1ZSwgbyk7XG4gICAgfVxuICAgIHdyaXRlVXRmOFN0cmluZyh2YWx1ZSwgd3JpdGVMZW5ndGggPSB0cnVlKSB7XG4gICAgICAgIGNvbnN0IGJ5dGVMZW5ndGggPSB1dGY4Lmxlbmd0aCh2YWx1ZSk7XG4gICAgICAgIGlmICh3cml0ZUxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy53cml0ZVVpbnQzMihieXRlTGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvID0gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfUmVhZFdyaXRlQnl0ZUJ1ZmZlcl9pbnN0YW5jZXMsIFwibVwiLCBfUmVhZFdyaXRlQnl0ZUJ1ZmZlcl93b0FkZCkuY2FsbCh0aGlzLCBieXRlTGVuZ3RoKTtcbiAgICAgICAgdXRmOC53cml0ZSh2YWx1ZSwgdGhpcy5fYnVmZmVyLCBvKTtcbiAgICB9XG4gICAgd3JpdGVGbG9hdDMyKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG8gPSBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9SZWFkV3JpdGVCeXRlQnVmZmVyX2luc3RhbmNlcywgXCJtXCIsIF9SZWFkV3JpdGVCeXRlQnVmZmVyX3dvQWRkKS5jYWxsKHRoaXMsIDQpO1xuICAgICAgICB0aGlzLnZpZXcuc2V0RmxvYXQzMihvLCB2YWx1ZSwgdHJ1ZSk7IC8vIGxpdHRsZUVuZGlhbiA9IHRydWVcbiAgICB9XG4gICAgd3JpdGVGbG9hdDY0KHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG8gPSBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9SZWFkV3JpdGVCeXRlQnVmZmVyX2luc3RhbmNlcywgXCJtXCIsIF9SZWFkV3JpdGVCeXRlQnVmZmVyX3dvQWRkKS5jYWxsKHRoaXMsIDgpO1xuICAgICAgICB0aGlzLnZpZXcuc2V0RmxvYXQ2NChvLCB2YWx1ZSwgdHJ1ZSk7IC8vIGxpdHRsZUVuZGlhbiA9IHRydWVcbiAgICB9XG4gICAgd3JpdGVJbnQ4KHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG8gPSBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9SZWFkV3JpdGVCeXRlQnVmZmVyX2luc3RhbmNlcywgXCJtXCIsIF9SZWFkV3JpdGVCeXRlQnVmZmVyX3dvQWRkKS5jYWxsKHRoaXMsIDEpO1xuICAgICAgICB0aGlzLnZpZXcuc2V0SW50OChvLCB2YWx1ZSk7XG4gICAgfVxuICAgIHdyaXRlSW50MTYodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbyA9IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1JlYWRXcml0ZUJ5dGVCdWZmZXJfaW5zdGFuY2VzLCBcIm1cIiwgX1JlYWRXcml0ZUJ5dGVCdWZmZXJfd29BZGQpLmNhbGwodGhpcywgMik7XG4gICAgICAgIHRoaXMudmlldy5zZXRJbnQxNihvLCB2YWx1ZSwgdHJ1ZSk7IC8vIGxpdHRsZUVuZGlhbiA9IHRydWVcbiAgICB9XG4gICAgd3JpdGVJbnQzMih2YWx1ZSkge1xuICAgICAgICBjb25zdCBvID0gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfUmVhZFdyaXRlQnl0ZUJ1ZmZlcl9pbnN0YW5jZXMsIFwibVwiLCBfUmVhZFdyaXRlQnl0ZUJ1ZmZlcl93b0FkZCkuY2FsbCh0aGlzLCA0KTtcbiAgICAgICAgdGhpcy52aWV3LnNldEludDMyKG8sIHZhbHVlLCB0cnVlKTsgLy8gbGl0dGxlRW5kaWFuID0gdHJ1ZVxuICAgIH1cbiAgICB3cml0ZUludDY0KHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG8gPSBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9SZWFkV3JpdGVCeXRlQnVmZmVyX2luc3RhbmNlcywgXCJtXCIsIF9SZWFkV3JpdGVCeXRlQnVmZmVyX3dvQWRkKS5jYWxsKHRoaXMsIDgpO1xuICAgICAgICB0aGlzLnZpZXcuc2V0QmlnSW50NjQobywgdmFsdWUsIHRydWUpOyAvLyBsaXR0bGVFbmRpYW4gPSB0cnVlXG4gICAgfVxuICAgIHdyaXRlVWludDgodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbyA9IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1JlYWRXcml0ZUJ5dGVCdWZmZXJfaW5zdGFuY2VzLCBcIm1cIiwgX1JlYWRXcml0ZUJ5dGVCdWZmZXJfd29BZGQpLmNhbGwodGhpcywgMSk7XG4gICAgICAgIHRoaXMudmlldy5zZXRVaW50OChvLCB2YWx1ZSk7XG4gICAgfVxuICAgIHdyaXRlVWludDE2KHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG8gPSBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9SZWFkV3JpdGVCeXRlQnVmZmVyX2luc3RhbmNlcywgXCJtXCIsIF9SZWFkV3JpdGVCeXRlQnVmZmVyX3dvQWRkKS5jYWxsKHRoaXMsIDIpO1xuICAgICAgICB0aGlzLnZpZXcuc2V0VWludDE2KG8sIHZhbHVlLCB0cnVlKTsgLy8gbGl0dGxlRW5kaWFuID0gdHJ1ZVxuICAgIH1cbiAgICB3cml0ZVVpbnQzMih2YWx1ZSkge1xuICAgICAgICBjb25zdCBvID0gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfUmVhZFdyaXRlQnl0ZUJ1ZmZlcl9pbnN0YW5jZXMsIFwibVwiLCBfUmVhZFdyaXRlQnl0ZUJ1ZmZlcl93b0FkZCkuY2FsbCh0aGlzLCA0KTtcbiAgICAgICAgdGhpcy52aWV3LnNldFVpbnQzMihvLCB2YWx1ZSwgdHJ1ZSk7IC8vIGxpdHRsZUVuZGlhbiA9IHRydWVcbiAgICB9XG4gICAgd3JpdGVVaW50NjQodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbyA9IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1JlYWRXcml0ZUJ5dGVCdWZmZXJfaW5zdGFuY2VzLCBcIm1cIiwgX1JlYWRXcml0ZUJ5dGVCdWZmZXJfd29BZGQpLmNhbGwodGhpcywgOCk7XG4gICAgICAgIHRoaXMudmlldy5zZXRCaWdVaW50NjQobywgdmFsdWUsIHRydWUpOyAvLyBsaXR0bGVFbmRpYW4gPSB0cnVlXG4gICAgfVxuICAgIC8vIERhdGFWaWV3IFByb3h5XG4gICAgZ2V0RmxvYXQzMihvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlldy5nZXRGbG9hdDMyKG9mZnNldCwgdHJ1ZSk7IC8vIGxpdHRsZUVuZGlhbiA9IHRydWVcbiAgICB9XG4gICAgZ2V0RmxvYXQ2NChvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlldy5nZXRGbG9hdDY0KG9mZnNldCwgdHJ1ZSk7IC8vIGxpdHRsZUVuZGlhbiA9IHRydWVcbiAgICB9XG4gICAgZ2V0SW50OChvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlldy5nZXRJbnQ4KG9mZnNldCk7XG4gICAgfVxuICAgIGdldEludDE2KG9mZnNldCkge1xuICAgICAgICByZXR1cm4gdGhpcy52aWV3LmdldEludDE2KG9mZnNldCwgdHJ1ZSk7IC8vIGxpdHRsZUVuZGlhbiA9IHRydWVcbiAgICB9XG4gICAgZ2V0SW50MzIob2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZXcuZ2V0SW50MzIob2Zmc2V0LCB0cnVlKTsgLy8gbGl0dGxlRW5kaWFuID0gdHJ1ZVxuICAgIH1cbiAgICBnZXRJbnQ2NChvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlldy5nZXRCaWdJbnQ2NChvZmZzZXQsIHRydWUpOyAvLyBsaXR0bGVFbmRpYW4gPSB0cnVlXG4gICAgfVxuICAgIGdldFVpbnQ4KG9mZnNldCkge1xuICAgICAgICByZXR1cm4gdGhpcy52aWV3LmdldFVpbnQ4KG9mZnNldCk7XG4gICAgfVxuICAgIGdldFVpbnQxNihvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlldy5nZXRVaW50MTYob2Zmc2V0LCB0cnVlKTsgLy8gbGl0dGxlRW5kaWFuID0gdHJ1ZVxuICAgIH1cbiAgICBnZXRVaW50MzIob2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZXcuZ2V0VWludDMyKG9mZnNldCwgdHJ1ZSk7IC8vIGxpdHRsZUVuZGlhbiA9IHRydWUgPj4+IDBcbiAgICB9XG4gICAgZ2V0VWludDY0KG9mZnNldCkge1xuICAgICAgICByZXR1cm4gdGhpcy52aWV3LmdldEJpZ1VpbnQ2NChvZmZzZXQsIHRydWUpOyAvLyBsaXR0bGVFbmRpYW4gPSB0cnVlXG4gICAgfVxuICAgIHNldEZsb2F0MzIob2Zmc2V0LCB2YWx1ZSkge1xuICAgICAgICB0aGlzLnZpZXcuc2V0RmxvYXQzMihvZmZzZXQsIHZhbHVlLCB0cnVlKTsgLy8gbGl0dGxlRW5kaWFuID0gdHJ1ZVxuICAgIH1cbiAgICBzZXRGbG9hdDY0KG9mZnNldCwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy52aWV3LnNldEZsb2F0NjQob2Zmc2V0LCB2YWx1ZSwgdHJ1ZSk7IC8vIGxpdHRsZUVuZGlhbiA9IHRydWVcbiAgICB9XG4gICAgc2V0SW50OChvZmZzZXQsIHZhbHVlKSB7XG4gICAgICAgIHRoaXMudmlldy5zZXRJbnQ4KG9mZnNldCwgdmFsdWUpO1xuICAgIH1cbiAgICBzZXRJbnQxNihvZmZzZXQsIHZhbHVlKSB7XG4gICAgICAgIHRoaXMudmlldy5zZXRJbnQxNihvZmZzZXQsIHZhbHVlLCB0cnVlKTsgLy8gbGl0dGxlRW5kaWFuID0gdHJ1ZVxuICAgIH1cbiAgICBzZXRJbnQzMihvZmZzZXQsIHZhbHVlKSB7XG4gICAgICAgIHRoaXMudmlldy5zZXRJbnQzMihvZmZzZXQsIHZhbHVlLCB0cnVlKTsgLy8gbGl0dGxlRW5kaWFuID0gdHJ1ZVxuICAgIH1cbiAgICBzZXRJbnQ2NChvZmZzZXQsIHZhbHVlKSB7XG4gICAgICAgIHRoaXMudmlldy5zZXRCaWdJbnQ2NChvZmZzZXQsIHZhbHVlLCB0cnVlKTsgLy8gbGl0dGxlRW5kaWFuID0gdHJ1ZVxuICAgIH1cbiAgICBzZXRVaW50OChvZmZzZXQsIHZhbHVlKSB7XG4gICAgICAgIHRoaXMudmlldy5zZXRVaW50OChvZmZzZXQsIHZhbHVlKTtcbiAgICB9XG4gICAgc2V0VWludDE2KG9mZnNldCwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy52aWV3LnNldFVpbnQxNihvZmZzZXQsIHZhbHVlLCB0cnVlKTsgLy8gbGl0dGxlRW5kaWFuID0gdHJ1ZVxuICAgIH1cbiAgICBzZXRVaW50MzIob2Zmc2V0LCB2YWx1ZSkge1xuICAgICAgICB0aGlzLnZpZXcuc2V0VWludDMyKG9mZnNldCwgdmFsdWUsIHRydWUpOyAvLyBsaXR0bGVFbmRpYW4gPSB0cnVlXG4gICAgfVxuICAgIHNldFVpbnQ2NChvZmZzZXQsIHZhbHVlKSB7XG4gICAgICAgIHRoaXMudmlldy5zZXRCaWdVaW50NjQob2Zmc2V0LCB2YWx1ZSwgdHJ1ZSk7IC8vIGxpdHRsZUVuZGlhbiA9IHRydWVcbiAgICB9XG59XG5fUmVhZFdyaXRlQnl0ZUJ1ZmZlcl9pbnN0YW5jZXMgPSBuZXcgV2Vha1NldCgpLCBfUmVhZFdyaXRlQnl0ZUJ1ZmZlcl93b0FkZCA9IGZ1bmN0aW9uIF9SZWFkV3JpdGVCeXRlQnVmZmVyX3dvQWRkKGFtb3VudCkge1xuICAgIGlmICh0aGlzLndvZmZzZXQgKyBhbW91bnQgPiB0aGlzLl9idWZmZXIuYnl0ZUxlbmd0aCkge1xuICAgICAgICBjb25zdCBuZXdzaXplID0gZ2V0TmV4dFNpemUodGhpcy5fYnVmZmVyLmJ5dGVMZW5ndGgsIHRoaXMud29mZnNldCArIGFtb3VudCk7XG4gICAgICAgIGNvbnN0IG5ld0J1ZmZlciA9IG5ldyBVaW50OEFycmF5KG5ld3NpemUpO1xuICAgICAgICBuZXdCdWZmZXIuc2V0KHRoaXMuX2J1ZmZlcik7XG4gICAgICAgIGNvbnN0IG9sZE9mZnNldCA9IHRoaXMuX2J1ZmZlci5ieXRlT2Zmc2V0O1xuICAgICAgICB0aGlzLl9idWZmZXIgPSBuZXdCdWZmZXI7XG4gICAgICAgIHRoaXMudmlldyA9IG5ldyBEYXRhVmlldyh0aGlzLl9idWZmZXIuYnVmZmVyLCBvbGRPZmZzZXQpO1xuICAgIH1cbiAgICB0aGlzLndvZmZzZXQgKz0gYW1vdW50O1xuICAgIHJldHVybiB0aGlzLndvZmZzZXQgLSBhbW91bnQ7XG59LCBfUmVhZFdyaXRlQnl0ZUJ1ZmZlcl9yb0FkZCA9IGZ1bmN0aW9uIF9SZWFkV3JpdGVCeXRlQnVmZmVyX3JvQWRkKGFtb3VudCkge1xuICAgIGlmICh0aGlzLnJvZmZzZXQgKyBhbW91bnQgPiB0aGlzLndvZmZzZXQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdPdXRzaWRlIG9mIHRoZSBib3VuZHMgb2Ygd3JpdGVuIGRhdGEuJyk7XG4gICAgfVxuICAgIHRoaXMucm9mZnNldCArPSBhbW91bnQ7XG4gICAgcmV0dXJuIHRoaXMucm9mZnNldCAtIGFtb3VudDtcbn07XG4iLCAiLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB2YXIgQ3JkdE1lc3NhZ2VUeXBlO1xuKGZ1bmN0aW9uIChDcmR0TWVzc2FnZVR5cGUpIHtcbiAgICBDcmR0TWVzc2FnZVR5cGVbQ3JkdE1lc3NhZ2VUeXBlW1wiUkVTRVJWRURcIl0gPSAwXSA9IFwiUkVTRVJWRURcIjtcbiAgICAvLyBDb21wb25lbnQgT3BlcmF0aW9uXG4gICAgQ3JkdE1lc3NhZ2VUeXBlW0NyZHRNZXNzYWdlVHlwZVtcIlBVVF9DT01QT05FTlRcIl0gPSAxXSA9IFwiUFVUX0NPTVBPTkVOVFwiO1xuICAgIENyZHRNZXNzYWdlVHlwZVtDcmR0TWVzc2FnZVR5cGVbXCJERUxFVEVfQ09NUE9ORU5UXCJdID0gMl0gPSBcIkRFTEVURV9DT01QT05FTlRcIjtcbiAgICBDcmR0TWVzc2FnZVR5cGVbQ3JkdE1lc3NhZ2VUeXBlW1wiREVMRVRFX0VOVElUWVwiXSA9IDNdID0gXCJERUxFVEVfRU5USVRZXCI7XG4gICAgQ3JkdE1lc3NhZ2VUeXBlW0NyZHRNZXNzYWdlVHlwZVtcIkFQUEVORF9WQUxVRVwiXSA9IDRdID0gXCJBUFBFTkRfVkFMVUVcIjtcbiAgICAvLyBOZXR3b3JrIG9wZXJhdGlvbnNcbiAgICBDcmR0TWVzc2FnZVR5cGVbQ3JkdE1lc3NhZ2VUeXBlW1wiUFVUX0NPTVBPTkVOVF9ORVRXT1JLXCJdID0gNV0gPSBcIlBVVF9DT01QT05FTlRfTkVUV09SS1wiO1xuICAgIENyZHRNZXNzYWdlVHlwZVtDcmR0TWVzc2FnZVR5cGVbXCJERUxFVEVfQ09NUE9ORU5UX05FVFdPUktcIl0gPSA2XSA9IFwiREVMRVRFX0NPTVBPTkVOVF9ORVRXT1JLXCI7XG4gICAgQ3JkdE1lc3NhZ2VUeXBlW0NyZHRNZXNzYWdlVHlwZVtcIkRFTEVURV9FTlRJVFlfTkVUV09SS1wiXSA9IDddID0gXCJERUxFVEVfRU5USVRZX05FVFdPUktcIjtcbiAgICBDcmR0TWVzc2FnZVR5cGVbQ3JkdE1lc3NhZ2VUeXBlW1wiTUFYX01FU1NBR0VfVFlQRVwiXSA9IDhdID0gXCJNQVhfTUVTU0FHRV9UWVBFXCI7XG59KShDcmR0TWVzc2FnZVR5cGUgfHwgKENyZHRNZXNzYWdlVHlwZSA9IHt9KSk7XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IENSRFRfTUVTU0FHRV9IRUFERVJfTEVOR1RIID0gODtcbmV4cG9ydCB2YXIgUHJvY2Vzc01lc3NhZ2VSZXN1bHRUeXBlO1xuKGZ1bmN0aW9uIChQcm9jZXNzTWVzc2FnZVJlc3VsdFR5cGUpIHtcbiAgICAvKipcbiAgICAgKiBUeXBpY2FsIG1lc3NhZ2UgYW5kIG5ldyBzdGF0ZSBzZXQuXG4gICAgICogQHN0YXRlIENIQU5HRVxuICAgICAqIEByZWFzb24gSW5jb21pbmcgbWVzc2FnZSBoYXMgYSB0aW1lc3RhbXAgZ3JlYXRlclxuICAgICAqL1xuICAgIFByb2Nlc3NNZXNzYWdlUmVzdWx0VHlwZVtQcm9jZXNzTWVzc2FnZVJlc3VsdFR5cGVbXCJTdGF0ZVVwZGF0ZWRUaW1lc3RhbXBcIl0gPSAxXSA9IFwiU3RhdGVVcGRhdGVkVGltZXN0YW1wXCI7XG4gICAgLyoqXG4gICAgICogVHlwaWNhbCBtZXNzYWdlIHdoZW4gaXQgaXMgY29uc2lkZXJlZCBvbGQuXG4gICAgICogQHN0YXRlIGl0IGRvZXMgTk9UIENIQU5HRS5cbiAgICAgKiBAcmVhc29uIGluY29taW5nIG1lc3NhZ2UgaGFzIGEgdGltZXN0YW1wIGxvd2VyLlxuICAgICAqL1xuICAgIFByb2Nlc3NNZXNzYWdlUmVzdWx0VHlwZVtQcm9jZXNzTWVzc2FnZVJlc3VsdFR5cGVbXCJTdGF0ZU91dGRhdGVkVGltZXN0YW1wXCJdID0gMl0gPSBcIlN0YXRlT3V0ZGF0ZWRUaW1lc3RhbXBcIjtcbiAgICAvKipcbiAgICAgKiBXZWlyZCBtZXNzYWdlLCBzYW1lIHRpbWVzdGFtcCBhbmQgZGF0YS5cbiAgICAgKiBAc3RhdGUgaXQgZG9lcyBOT1QgQ0hBTkdFLlxuICAgICAqIEByZWFzb24gY29uc2lzdGVudCBzdGF0ZSBiZXR3ZWVuIHBlZXJzLlxuICAgICAqL1xuICAgIFByb2Nlc3NNZXNzYWdlUmVzdWx0VHlwZVtQcm9jZXNzTWVzc2FnZVJlc3VsdFR5cGVbXCJOb0NoYW5nZXNcIl0gPSAzXSA9IFwiTm9DaGFuZ2VzXCI7XG4gICAgLyoqXG4gICAgICogTGVzcyBidXQgdHlwaWNhbCBtZXNzYWdlLCBzYW1lIHRpbWVzdGFtcCwgcmVzb2x1dGlvbiBieSBkYXRhLlxuICAgICAqIEBzdGF0ZSBpdCBkb2VzIE5PVCBDSEFOR0UuXG4gICAgICogQHJlYXNvbiBpbmNvbWluZyBtZXNzYWdlIGhhcyBhIExPV0VSIGRhdGEuXG4gICAgICovXG4gICAgUHJvY2Vzc01lc3NhZ2VSZXN1bHRUeXBlW1Byb2Nlc3NNZXNzYWdlUmVzdWx0VHlwZVtcIlN0YXRlT3V0ZGF0ZWREYXRhXCJdID0gNF0gPSBcIlN0YXRlT3V0ZGF0ZWREYXRhXCI7XG4gICAgLyoqXG4gICAgICogTGVzcyBidXQgdHlwaWNhbCBtZXNzYWdlLCBzYW1lIHRpbWVzdGFtcCwgcmVzb2x1dGlvbiBieSBkYXRhLlxuICAgICAqIEBzdGF0ZSBDSEFOR0UuXG4gICAgICogQHJlYXNvbiBpbmNvbWluZyBtZXNzYWdlIGhhcyBhIEdSRUFURVIgZGF0YS5cbiAgICAgKi9cbiAgICBQcm9jZXNzTWVzc2FnZVJlc3VsdFR5cGVbUHJvY2Vzc01lc3NhZ2VSZXN1bHRUeXBlW1wiU3RhdGVVcGRhdGVkRGF0YVwiXSA9IDVdID0gXCJTdGF0ZVVwZGF0ZWREYXRhXCI7XG4gICAgLyoqXG4gICAgICogRW50aXR5IHdhcyBwcmV2aW91c2x5IGRlbGV0ZWQuXG4gICAgICogQHN0YXRlIGl0IGRvZXMgTk9UIENIQU5HRS5cbiAgICAgKiBAcmVhc29uIFRoZSBtZXNzYWdlIGlzIGNvbnNpZGVyZWQgb2xkLlxuICAgICAqL1xuICAgIFByb2Nlc3NNZXNzYWdlUmVzdWx0VHlwZVtQcm9jZXNzTWVzc2FnZVJlc3VsdFR5cGVbXCJFbnRpdHlXYXNEZWxldGVkXCJdID0gNl0gPSBcIkVudGl0eVdhc0RlbGV0ZWRcIjtcbiAgICAvKipcbiAgICAgKiBFbnRpdHkgc2hvdWxkIGJlIGRlbGV0ZWQuXG4gICAgICogQHN0YXRlIENIQU5HRS5cbiAgICAgKiBAcmVhc29uIHRoZSBzdGF0ZSBpcyBzdG9yaW5nIG9sZCBlbnRpdGllc1xuICAgICAqL1xuICAgIFByb2Nlc3NNZXNzYWdlUmVzdWx0VHlwZVtQcm9jZXNzTWVzc2FnZVJlc3VsdFR5cGVbXCJFbnRpdHlEZWxldGVkXCJdID0gN10gPSBcIkVudGl0eURlbGV0ZWRcIjtcbn0pKFByb2Nlc3NNZXNzYWdlUmVzdWx0VHlwZSB8fCAoUHJvY2Vzc01lc3NhZ2VSZXN1bHRUeXBlID0ge30pKTtcbi8vIHdlIHJlY2VpdmUgTFdXLCB2PTYsIHdlIGhhdmUgdj01ID0+IHdlIHJlY2VpdmUgd2l0aCBkZWxheSB0aGUgZGVsZXRlRW50aXR5KHY9NSlcbi8vICAgPT4gd2Ugc2hvdWxkIGdlbmVyYXRlIHRoZSBkZWxldGVFbnRpdHkgbWVzc2FnZSBlZmZlY3RzIGludGVybmFsbHkgd2l0aCBkZWxldGVFbnRpdHkodj01KSxcbi8vICAgICAgIGJ1dCBkb24ndCByZXNlbmQgdGhlIGRlbGV0ZUVudGl0eVxuLy8gICAgICAgICAgLSAoQ1JEVCkgYWRkRGVsZXRlZEVudGl0eVNldCB2PTUgKHdpdGggY3JkdCBzdGF0ZSBjbGVhbmluZykgYW5kIHRoZW4gTFdXIHY9NlxuLy8gICAgICAgICAgLSAoZW5naW5lKSBlbmdpbmUuZGVsZXRlRW50aXR5IHY9NVxuLy8gd2UgcmVjZWl2ZSBMV1csIHY9Nywgd2UgaGF2ZSB2PTUgPT4gd2UgcmVjZWl2ZSB3aXRoIGRlbGF5IHRoZSBkZWxldGVFbnRpdHkodj01KSwgZGVsZXRlRW50aXR5KHY9NiksIC4uLiwgTlxuLy8gICA9PiB3ZSBzaG91bGQgZ2VuZXJhdGUgdGhlIGRlbGV0ZUVudGl0eSBtZXNzYWdlIGVmZmVjdHMgaW50ZXJuYWxseSB3aXRoIGRlbGV0ZUVudGl0eSh2PTUpLFxuLy8gICAgICAgYnV0IGRvbid0IHJlc2VuZCB0aGUgZGVsZXRlRW50aXR5XG4vLyAgICAgICAgICAtIChDUkRUKSBhZGREZWxldGVkRW50aXR5U2V0IHY9NSAod2l0aCBjcmR0IHN0YXRlIGNsZWFuaW5nKSBhbmQgdGhlbiBMV1cgdj02XG4vLyAgICAgICAgICAtIChlbmdpbmUpIGVuZ2luZS5kZWxldGVFbnRpdHkgdj01XG4vLyBtc2cgZGVsZXRlIGVudGl0eTogaXQgb25seSBzaG91bGQgYmUgc2VudCBieSBkZWxldGVyXG4vL1xuIiwgImltcG9ydCB7IENSRFRfTUVTU0FHRV9IRUFERVJfTEVOR1RIIH0gZnJvbSAnLi90eXBlcyc7XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHZhciBDcmR0TWVzc2FnZVByb3RvY29sO1xuKGZ1bmN0aW9uIChDcmR0TWVzc2FnZVByb3RvY29sKSB7XG4gICAgLyoqXG4gICAgICogVmFsaWRhdGUgaWYgdGhlIG1lc3NhZ2UgaW5jb21pbmcgaXMgY29tcGxldGVkXG4gICAgICogQHBhcmFtIGJ1ZiAtIEJ5dGVCdWZmZXJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShidWYpIHtcbiAgICAgICAgY29uc3QgcmVtID0gYnVmLnJlbWFpbmluZ0J5dGVzKCk7XG4gICAgICAgIGlmIChyZW0gPCBDUkRUX01FU1NBR0VfSEVBREVSX0xFTkdUSCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1lc3NhZ2VMZW5ndGggPSBidWYuZ2V0VWludDMyKGJ1Zi5jdXJyZW50UmVhZE9mZnNldCgpKTtcbiAgICAgICAgaWYgKHJlbSA8IG1lc3NhZ2VMZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgQ3JkdE1lc3NhZ2VQcm90b2NvbC52YWxpZGF0ZSA9IHZhbGlkYXRlO1xuICAgIC8qKlxuICAgICAqIEdldCB0aGUgY3VycmVudCBoZWFkZXIsIGNvbnN1bWluZyB0aGUgYnl0ZXMgaW52b2x2ZWQuXG4gICAgICogQHBhcmFtIGJ1ZiAtIEJ5dGVCdWZmZXJcbiAgICAgKiBAcmV0dXJucyBoZWFkZXIgb3IgbnVsbCBpZiB0aGVyZSBpcyBubyB2YWxpZGF0ZWQgbWVzc2FnZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlYWRIZWFkZXIoYnVmKSB7XG4gICAgICAgIGlmICghdmFsaWRhdGUoYnVmKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGxlbmd0aDogYnVmLnJlYWRVaW50MzIoKSxcbiAgICAgICAgICAgIHR5cGU6IGJ1Zi5yZWFkVWludDMyKClcbiAgICAgICAgfTtcbiAgICB9XG4gICAgQ3JkdE1lc3NhZ2VQcm90b2NvbC5yZWFkSGVhZGVyID0gcmVhZEhlYWRlcjtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGN1cnJlbnQgaGVhZGVyLCB3aXRob3V0IGNvbnN1bWluZyB0aGUgYnl0ZXMgaW52b2x2ZWQuXG4gICAgICogQHBhcmFtIGJ1ZiAtIEJ5dGVCdWZmZXJcbiAgICAgKiBAcmV0dXJucyBoZWFkZXIgb3IgbnVsbCBpZiB0aGVyZSBpcyBubyB2YWxpZGF0ZWQgbWVzc2FnZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldEhlYWRlcihidWYpIHtcbiAgICAgICAgaWYgKCF2YWxpZGF0ZShidWYpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjdXJyZW50T2Zmc2V0ID0gYnVmLmN1cnJlbnRSZWFkT2Zmc2V0KCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsZW5ndGg6IGJ1Zi5nZXRVaW50MzIoY3VycmVudE9mZnNldCksXG4gICAgICAgICAgICB0eXBlOiBidWYuZ2V0VWludDMyKGN1cnJlbnRPZmZzZXQgKyA0KVxuICAgICAgICB9O1xuICAgIH1cbiAgICBDcmR0TWVzc2FnZVByb3RvY29sLmdldEhlYWRlciA9IGdldEhlYWRlcjtcbiAgICAvKipcbiAgICAgKiBDb25zdW1lIHRoZSBpbmNvbWluZyBtZXNzYWdlIHdpdGhvdXQgcHJvY2Vzc2luZyBpdC5cbiAgICAgKiBAcGFyYW0gYnVmIC0gQnl0ZUJ1ZmZlclxuICAgICAqIEByZXR1cm5zIHRydWUgaW4gY2FzZSBvZiBzdWNjZXNzIG9yIGZhbHNlIGlmIHRoZXJlIGlzIG5vIHZhbGlkIG1lc3NhZ2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29uc3VtZU1lc3NhZ2UoYnVmKSB7XG4gICAgICAgIGNvbnN0IGhlYWRlciA9IGdldEhlYWRlcihidWYpO1xuICAgICAgICBpZiAoIWhlYWRlcikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGJ1Zi5pbmNyZW1lbnRSZWFkT2Zmc2V0KGhlYWRlci5sZW5ndGgpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgQ3JkdE1lc3NhZ2VQcm90b2NvbC5jb25zdW1lTWVzc2FnZSA9IGNvbnN1bWVNZXNzYWdlO1xufSkoQ3JkdE1lc3NhZ2VQcm90b2NvbCB8fCAoQ3JkdE1lc3NhZ2VQcm90b2NvbCA9IHt9KSk7XG4iLCAiaW1wb3J0IHsgQ3JkdE1lc3NhZ2VQcm90b2NvbCB9IGZyb20gJy4vY3JkdE1lc3NhZ2VQcm90b2NvbCc7XG5pbXBvcnQgeyBDcmR0TWVzc2FnZVR5cGUsIENSRFRfTUVTU0FHRV9IRUFERVJfTEVOR1RIIH0gZnJvbSAnLi90eXBlcyc7XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHZhciBEZWxldGVDb21wb25lbnQ7XG4oZnVuY3Rpb24gKERlbGV0ZUNvbXBvbmVudCkge1xuICAgIERlbGV0ZUNvbXBvbmVudC5NRVNTQUdFX0hFQURFUl9MRU5HVEggPSAxMjtcbiAgICAvKipcbiAgICAgKiBXcml0ZSBEZWxldGVDb21wb25lbnQgbWVzc2FnZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdyaXRlKGVudGl0eSwgY29tcG9uZW50SWQsIHRpbWVzdGFtcCwgYnVmKSB7XG4gICAgICAgIC8vIHJlc2VydmUgdGhlIGJlZ2lubmluZ1xuICAgICAgICBjb25zdCBtZXNzYWdlTGVuZ3RoID0gQ1JEVF9NRVNTQUdFX0hFQURFUl9MRU5HVEggKyBEZWxldGVDb21wb25lbnQuTUVTU0FHRV9IRUFERVJfTEVOR1RIO1xuICAgICAgICBjb25zdCBzdGFydE1lc3NhZ2VPZmZzZXQgPSBidWYuaW5jcmVtZW50V3JpdGVPZmZzZXQobWVzc2FnZUxlbmd0aCk7XG4gICAgICAgIC8vIFdyaXRlIENyZHRNZXNzYWdlIGhlYWRlclxuICAgICAgICBidWYuc2V0VWludDMyKHN0YXJ0TWVzc2FnZU9mZnNldCwgbWVzc2FnZUxlbmd0aCk7XG4gICAgICAgIGJ1Zi5zZXRVaW50MzIoc3RhcnRNZXNzYWdlT2Zmc2V0ICsgNCwgQ3JkdE1lc3NhZ2VUeXBlLkRFTEVURV9DT01QT05FTlQpO1xuICAgICAgICAvLyBXcml0ZSBDb21wb25lbnRPcGVyYXRpb24gaGVhZGVyXG4gICAgICAgIGJ1Zi5zZXRVaW50MzIoc3RhcnRNZXNzYWdlT2Zmc2V0ICsgOCwgZW50aXR5KTtcbiAgICAgICAgYnVmLnNldFVpbnQzMihzdGFydE1lc3NhZ2VPZmZzZXQgKyAxMiwgY29tcG9uZW50SWQpO1xuICAgICAgICBidWYuc2V0VWludDMyKHN0YXJ0TWVzc2FnZU9mZnNldCArIDE2LCB0aW1lc3RhbXApO1xuICAgIH1cbiAgICBEZWxldGVDb21wb25lbnQud3JpdGUgPSB3cml0ZTtcbiAgICBmdW5jdGlvbiByZWFkKGJ1Zikge1xuICAgICAgICBjb25zdCBoZWFkZXIgPSBDcmR0TWVzc2FnZVByb3RvY29sLnJlYWRIZWFkZXIoYnVmKTtcbiAgICAgICAgaWYgKCFoZWFkZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoZWFkZXIudHlwZSAhPT0gQ3JkdE1lc3NhZ2VUeXBlLkRFTEVURV9DT01QT05FTlQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRGVsZXRlQ29tcG9uZW50T3BlcmF0aW9uIHRyaWVkIHRvIHJlYWQgYW5vdGhlciBtZXNzYWdlIHR5cGUuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbXNnID0ge1xuICAgICAgICAgICAgLi4uaGVhZGVyLFxuICAgICAgICAgICAgZW50aXR5SWQ6IGJ1Zi5yZWFkVWludDMyKCksXG4gICAgICAgICAgICBjb21wb25lbnRJZDogYnVmLnJlYWRVaW50MzIoKSxcbiAgICAgICAgICAgIHRpbWVzdGFtcDogYnVmLnJlYWRVaW50MzIoKVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gbXNnO1xuICAgIH1cbiAgICBEZWxldGVDb21wb25lbnQucmVhZCA9IHJlYWQ7XG59KShEZWxldGVDb21wb25lbnQgfHwgKERlbGV0ZUNvbXBvbmVudCA9IHt9KSk7XG4iLCAiaW1wb3J0IHsgQ3JkdE1lc3NhZ2VQcm90b2NvbCB9IGZyb20gJy4vY3JkdE1lc3NhZ2VQcm90b2NvbCc7XG5pbXBvcnQgeyBDcmR0TWVzc2FnZVR5cGUsIENSRFRfTUVTU0FHRV9IRUFERVJfTEVOR1RIIH0gZnJvbSAnLi90eXBlcyc7XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHZhciBBcHBlbmRWYWx1ZU9wZXJhdGlvbjtcbihmdW5jdGlvbiAoQXBwZW5kVmFsdWVPcGVyYXRpb24pIHtcbiAgICBBcHBlbmRWYWx1ZU9wZXJhdGlvbi5NRVNTQUdFX0hFQURFUl9MRU5HVEggPSAxNjtcbiAgICAvKipcbiAgICAgKiBDYWxsIHRoaXMgZnVuY3Rpb24gZm9yIGFuIG9wdGltYWwgd3JpdGluZyBkYXRhIHBhc3NpbmcgdGhlIEJ5dGVCdWZmZXJcbiAgICAgKiAgYWxyZWFkeSBhbGxvY2F0ZWRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3cml0ZShlbnRpdHksIHRpbWVzdGFtcCwgY29tcG9uZW50SWQsIGRhdGEsIGJ1Zikge1xuICAgICAgICAvLyByZXNlcnZlIHRoZSBiZWdpbm5pbmdcbiAgICAgICAgY29uc3Qgc3RhcnRNZXNzYWdlT2Zmc2V0ID0gYnVmLmluY3JlbWVudFdyaXRlT2Zmc2V0KENSRFRfTUVTU0FHRV9IRUFERVJfTEVOR1RIICsgQXBwZW5kVmFsdWVPcGVyYXRpb24uTUVTU0FHRV9IRUFERVJfTEVOR1RIKTtcbiAgICAgICAgLy8gd3JpdGUgYm9keVxuICAgICAgICBidWYud3JpdGVCdWZmZXIoZGF0YSwgZmFsc2UpO1xuICAgICAgICBjb25zdCBtZXNzYWdlTGVuZ3RoID0gYnVmLmN1cnJlbnRXcml0ZU9mZnNldCgpIC0gc3RhcnRNZXNzYWdlT2Zmc2V0O1xuICAgICAgICAvLyBXcml0ZSBDcmR0TWVzc2FnZSBoZWFkZXJcbiAgICAgICAgYnVmLnNldFVpbnQzMihzdGFydE1lc3NhZ2VPZmZzZXQsIG1lc3NhZ2VMZW5ndGgpO1xuICAgICAgICBidWYuc2V0VWludDMyKHN0YXJ0TWVzc2FnZU9mZnNldCArIDQsIENyZHRNZXNzYWdlVHlwZS5BUFBFTkRfVkFMVUUpO1xuICAgICAgICAvLyBXcml0ZSBDb21wb25lbnRPcGVyYXRpb24gaGVhZGVyXG4gICAgICAgIGJ1Zi5zZXRVaW50MzIoc3RhcnRNZXNzYWdlT2Zmc2V0ICsgOCwgZW50aXR5KTtcbiAgICAgICAgYnVmLnNldFVpbnQzMihzdGFydE1lc3NhZ2VPZmZzZXQgKyAxMiwgY29tcG9uZW50SWQpO1xuICAgICAgICBidWYuc2V0VWludDMyKHN0YXJ0TWVzc2FnZU9mZnNldCArIDE2LCB0aW1lc3RhbXApO1xuICAgICAgICBjb25zdCBuZXdMb2NhbCA9IG1lc3NhZ2VMZW5ndGggLSBBcHBlbmRWYWx1ZU9wZXJhdGlvbi5NRVNTQUdFX0hFQURFUl9MRU5HVEggLSBDUkRUX01FU1NBR0VfSEVBREVSX0xFTkdUSDtcbiAgICAgICAgYnVmLnNldFVpbnQzMihzdGFydE1lc3NhZ2VPZmZzZXQgKyAyMCwgbmV3TG9jYWwpO1xuICAgIH1cbiAgICBBcHBlbmRWYWx1ZU9wZXJhdGlvbi53cml0ZSA9IHdyaXRlO1xuICAgIGZ1bmN0aW9uIHJlYWQoYnVmKSB7XG4gICAgICAgIGNvbnN0IGhlYWRlciA9IENyZHRNZXNzYWdlUHJvdG9jb2wucmVhZEhlYWRlcihidWYpO1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgICAgaWYgKCFoZWFkZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICBpZiAoaGVhZGVyLnR5cGUgIT09IENyZHRNZXNzYWdlVHlwZS5BUFBFTkRfVkFMVUUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQXBwZW5kVmFsdWVPcGVyYXRpb24gdHJpZWQgdG8gcmVhZCBhbm90aGVyIG1lc3NhZ2UgdHlwZS4nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uaGVhZGVyLFxuICAgICAgICAgICAgZW50aXR5SWQ6IGJ1Zi5yZWFkVWludDMyKCksXG4gICAgICAgICAgICBjb21wb25lbnRJZDogYnVmLnJlYWRVaW50MzIoKSxcbiAgICAgICAgICAgIHRpbWVzdGFtcDogYnVmLnJlYWRVaW50MzIoKSxcbiAgICAgICAgICAgIGRhdGE6IGJ1Zi5yZWFkQnVmZmVyKClcbiAgICAgICAgfTtcbiAgICB9XG4gICAgQXBwZW5kVmFsdWVPcGVyYXRpb24ucmVhZCA9IHJlYWQ7XG59KShBcHBlbmRWYWx1ZU9wZXJhdGlvbiB8fCAoQXBwZW5kVmFsdWVPcGVyYXRpb24gPSB7fSkpO1xuIiwgImltcG9ydCB7IENyZHRNZXNzYWdlUHJvdG9jb2wgfSBmcm9tICcuL2NyZHRNZXNzYWdlUHJvdG9jb2wnO1xuaW1wb3J0IHsgQ3JkdE1lc3NhZ2VUeXBlLCBDUkRUX01FU1NBR0VfSEVBREVSX0xFTkdUSCB9IGZyb20gJy4vdHlwZXMnO1xuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB2YXIgRGVsZXRlRW50aXR5O1xuKGZ1bmN0aW9uIChEZWxldGVFbnRpdHkpIHtcbiAgICBEZWxldGVFbnRpdHkuTUVTU0FHRV9IRUFERVJfTEVOR1RIID0gNDtcbiAgICBmdW5jdGlvbiB3cml0ZShlbnRpdHksIGJ1Zikge1xuICAgICAgICAvLyBXcml0ZSBDcmR0TWVzc2FnZSBoZWFkZXJcbiAgICAgICAgYnVmLndyaXRlVWludDMyKENSRFRfTUVTU0FHRV9IRUFERVJfTEVOR1RIICsgNCk7XG4gICAgICAgIGJ1Zi53cml0ZVVpbnQzMihDcmR0TWVzc2FnZVR5cGUuREVMRVRFX0VOVElUWSk7XG4gICAgICAgIC8vIGJvZHlcbiAgICAgICAgYnVmLndyaXRlVWludDMyKGVudGl0eSk7XG4gICAgfVxuICAgIERlbGV0ZUVudGl0eS53cml0ZSA9IHdyaXRlO1xuICAgIGZ1bmN0aW9uIHJlYWQoYnVmKSB7XG4gICAgICAgIGNvbnN0IGhlYWRlciA9IENyZHRNZXNzYWdlUHJvdG9jb2wucmVhZEhlYWRlcihidWYpO1xuICAgICAgICBpZiAoIWhlYWRlcikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhlYWRlci50eXBlICE9PSBDcmR0TWVzc2FnZVR5cGUuREVMRVRFX0VOVElUWSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdEZWxldGVFbnRpdHkgdHJpZWQgdG8gcmVhZCBhbm90aGVyIG1lc3NhZ2UgdHlwZS4nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uaGVhZGVyLFxuICAgICAgICAgICAgZW50aXR5SWQ6IGJ1Zi5yZWFkVWludDMyKClcbiAgICAgICAgfTtcbiAgICB9XG4gICAgRGVsZXRlRW50aXR5LnJlYWQgPSByZWFkO1xufSkoRGVsZXRlRW50aXR5IHx8IChEZWxldGVFbnRpdHkgPSB7fSkpO1xuIiwgImltcG9ydCB7IENyZHRNZXNzYWdlUHJvdG9jb2wgfSBmcm9tICcuL2NyZHRNZXNzYWdlUHJvdG9jb2wnO1xuaW1wb3J0IHsgQ3JkdE1lc3NhZ2VUeXBlLCBDUkRUX01FU1NBR0VfSEVBREVSX0xFTkdUSCB9IGZyb20gJy4vdHlwZXMnO1xuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB2YXIgUHV0Q29tcG9uZW50T3BlcmF0aW9uO1xuKGZ1bmN0aW9uIChQdXRDb21wb25lbnRPcGVyYXRpb24pIHtcbiAgICBQdXRDb21wb25lbnRPcGVyYXRpb24uTUVTU0FHRV9IRUFERVJfTEVOR1RIID0gMTY7XG4gICAgLyoqXG4gICAgICogQ2FsbCB0aGlzIGZ1bmN0aW9uIGZvciBhbiBvcHRpbWFsIHdyaXRpbmcgZGF0YSBwYXNzaW5nIHRoZSBCeXRlQnVmZmVyXG4gICAgICogIGFscmVhZHkgYWxsb2NhdGVkXG4gICAgICovXG4gICAgZnVuY3Rpb24gd3JpdGUoZW50aXR5LCB0aW1lc3RhbXAsIGNvbXBvbmVudElkLCBkYXRhLCBidWYpIHtcbiAgICAgICAgLy8gcmVzZXJ2ZSB0aGUgYmVnaW5uaW5nXG4gICAgICAgIGNvbnN0IHN0YXJ0TWVzc2FnZU9mZnNldCA9IGJ1Zi5pbmNyZW1lbnRXcml0ZU9mZnNldChDUkRUX01FU1NBR0VfSEVBREVSX0xFTkdUSCArIFB1dENvbXBvbmVudE9wZXJhdGlvbi5NRVNTQUdFX0hFQURFUl9MRU5HVEgpO1xuICAgICAgICAvLyB3cml0ZSBib2R5XG4gICAgICAgIGJ1Zi53cml0ZUJ1ZmZlcihkYXRhLCBmYWxzZSk7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2VMZW5ndGggPSBidWYuY3VycmVudFdyaXRlT2Zmc2V0KCkgLSBzdGFydE1lc3NhZ2VPZmZzZXQ7XG4gICAgICAgIC8vIFdyaXRlIENyZHRNZXNzYWdlIGhlYWRlclxuICAgICAgICBidWYuc2V0VWludDMyKHN0YXJ0TWVzc2FnZU9mZnNldCwgbWVzc2FnZUxlbmd0aCk7XG4gICAgICAgIGJ1Zi5zZXRVaW50MzIoc3RhcnRNZXNzYWdlT2Zmc2V0ICsgNCwgQ3JkdE1lc3NhZ2VUeXBlLlBVVF9DT01QT05FTlQpO1xuICAgICAgICAvLyBXcml0ZSBDb21wb25lbnRPcGVyYXRpb24gaGVhZGVyXG4gICAgICAgIGJ1Zi5zZXRVaW50MzIoc3RhcnRNZXNzYWdlT2Zmc2V0ICsgOCwgZW50aXR5KTtcbiAgICAgICAgYnVmLnNldFVpbnQzMihzdGFydE1lc3NhZ2VPZmZzZXQgKyAxMiwgY29tcG9uZW50SWQpO1xuICAgICAgICBidWYuc2V0VWludDMyKHN0YXJ0TWVzc2FnZU9mZnNldCArIDE2LCB0aW1lc3RhbXApO1xuICAgICAgICBjb25zdCBuZXdMb2NhbCA9IG1lc3NhZ2VMZW5ndGggLSBQdXRDb21wb25lbnRPcGVyYXRpb24uTUVTU0FHRV9IRUFERVJfTEVOR1RIIC0gQ1JEVF9NRVNTQUdFX0hFQURFUl9MRU5HVEg7XG4gICAgICAgIGJ1Zi5zZXRVaW50MzIoc3RhcnRNZXNzYWdlT2Zmc2V0ICsgMjAsIG5ld0xvY2FsKTtcbiAgICB9XG4gICAgUHV0Q29tcG9uZW50T3BlcmF0aW9uLndyaXRlID0gd3JpdGU7XG4gICAgZnVuY3Rpb24gcmVhZChidWYpIHtcbiAgICAgICAgY29uc3QgaGVhZGVyID0gQ3JkdE1lc3NhZ2VQcm90b2NvbC5yZWFkSGVhZGVyKGJ1Zik7XG4gICAgICAgIGlmICghaGVhZGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGVhZGVyLnR5cGUgIT09IENyZHRNZXNzYWdlVHlwZS5QVVRfQ09NUE9ORU5UKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1B1dENvbXBvbmVudE9wZXJhdGlvbiB0cmllZCB0byByZWFkIGFub3RoZXIgbWVzc2FnZSB0eXBlLicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5oZWFkZXIsXG4gICAgICAgICAgICBlbnRpdHlJZDogYnVmLnJlYWRVaW50MzIoKSxcbiAgICAgICAgICAgIGNvbXBvbmVudElkOiBidWYucmVhZFVpbnQzMigpLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBidWYucmVhZFVpbnQzMigpLFxuICAgICAgICAgICAgZGF0YTogYnVmLnJlYWRCdWZmZXIoKVxuICAgICAgICB9O1xuICAgIH1cbiAgICBQdXRDb21wb25lbnRPcGVyYXRpb24ucmVhZCA9IHJlYWQ7XG59KShQdXRDb21wb25lbnRPcGVyYXRpb24gfHwgKFB1dENvbXBvbmVudE9wZXJhdGlvbiA9IHt9KSk7XG4iLCAiaW1wb3J0IHsgQ3JkdE1lc3NhZ2VQcm90b2NvbCB9IGZyb20gJy4uL2NyZHRNZXNzYWdlUHJvdG9jb2wnO1xuaW1wb3J0IHsgQ3JkdE1lc3NhZ2VUeXBlLCBDUkRUX01FU1NBR0VfSEVBREVSX0xFTkdUSCB9IGZyb20gJy4uL3R5cGVzJztcbi8qKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdmFyIFB1dE5ldHdvcmtDb21wb25lbnRPcGVyYXRpb247XG4oZnVuY3Rpb24gKFB1dE5ldHdvcmtDb21wb25lbnRPcGVyYXRpb24pIHtcbiAgICBQdXROZXR3b3JrQ29tcG9uZW50T3BlcmF0aW9uLk1FU1NBR0VfSEVBREVSX0xFTkdUSCA9IDIwO1xuICAgIC8qKlxuICAgICAqIENhbGwgdGhpcyBmdW5jdGlvbiBmb3IgYW4gb3B0aW1hbCB3cml0aW5nIGRhdGEgcGFzc2luZyB0aGUgQnl0ZUJ1ZmZlclxuICAgICAqICBhbHJlYWR5IGFsbG9jYXRlZFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdyaXRlKGVudGl0eSwgdGltZXN0YW1wLCBjb21wb25lbnRJZCwgbmV0d29ya0lkLCBkYXRhLCBidWYpIHtcbiAgICAgICAgLy8gcmVzZXJ2ZSB0aGUgYmVnaW5uaW5nXG4gICAgICAgIGNvbnN0IHN0YXJ0TWVzc2FnZU9mZnNldCA9IGJ1Zi5pbmNyZW1lbnRXcml0ZU9mZnNldChDUkRUX01FU1NBR0VfSEVBREVSX0xFTkdUSCArIFB1dE5ldHdvcmtDb21wb25lbnRPcGVyYXRpb24uTUVTU0FHRV9IRUFERVJfTEVOR1RIKTtcbiAgICAgICAgLy8gd3JpdGUgYm9keVxuICAgICAgICBidWYud3JpdGVCdWZmZXIoZGF0YSwgZmFsc2UpO1xuICAgICAgICBjb25zdCBtZXNzYWdlTGVuZ3RoID0gYnVmLmN1cnJlbnRXcml0ZU9mZnNldCgpIC0gc3RhcnRNZXNzYWdlT2Zmc2V0O1xuICAgICAgICAvLyBXcml0ZSBDcmR0TWVzc2FnZSBoZWFkZXJcbiAgICAgICAgYnVmLnNldFVpbnQzMihzdGFydE1lc3NhZ2VPZmZzZXQsIG1lc3NhZ2VMZW5ndGgpO1xuICAgICAgICBidWYuc2V0VWludDMyKHN0YXJ0TWVzc2FnZU9mZnNldCArIDQsIENyZHRNZXNzYWdlVHlwZS5QVVRfQ09NUE9ORU5UX05FVFdPUkspO1xuICAgICAgICAvLyBXcml0ZSBDb21wb25lbnRPcGVyYXRpb24gaGVhZGVyXG4gICAgICAgIGJ1Zi5zZXRVaW50MzIoc3RhcnRNZXNzYWdlT2Zmc2V0ICsgOCwgZW50aXR5KTtcbiAgICAgICAgYnVmLnNldFVpbnQzMihzdGFydE1lc3NhZ2VPZmZzZXQgKyAxMiwgY29tcG9uZW50SWQpO1xuICAgICAgICBidWYuc2V0VWludDMyKHN0YXJ0TWVzc2FnZU9mZnNldCArIDE2LCB0aW1lc3RhbXApO1xuICAgICAgICBidWYuc2V0VWludDMyKHN0YXJ0TWVzc2FnZU9mZnNldCArIDIwLCBuZXR3b3JrSWQpO1xuICAgICAgICBjb25zdCBkYXRhTGVuZ3RoID0gbWVzc2FnZUxlbmd0aCAtIFB1dE5ldHdvcmtDb21wb25lbnRPcGVyYXRpb24uTUVTU0FHRV9IRUFERVJfTEVOR1RIIC0gQ1JEVF9NRVNTQUdFX0hFQURFUl9MRU5HVEg7XG4gICAgICAgIGJ1Zi5zZXRVaW50MzIoc3RhcnRNZXNzYWdlT2Zmc2V0ICsgMjQsIGRhdGFMZW5ndGgpO1xuICAgIH1cbiAgICBQdXROZXR3b3JrQ29tcG9uZW50T3BlcmF0aW9uLndyaXRlID0gd3JpdGU7XG4gICAgZnVuY3Rpb24gcmVhZChidWYpIHtcbiAgICAgICAgY29uc3QgaGVhZGVyID0gQ3JkdE1lc3NhZ2VQcm90b2NvbC5yZWFkSGVhZGVyKGJ1Zik7XG4gICAgICAgIGlmICghaGVhZGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGVhZGVyLnR5cGUgIT09IENyZHRNZXNzYWdlVHlwZS5QVVRfQ09NUE9ORU5UX05FVFdPUkspIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUHV0Q29tcG9uZW50TmV0d29ya09wZXJhdGlvbiB0cmllZCB0byByZWFkIGFub3RoZXIgbWVzc2FnZSB0eXBlLicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5oZWFkZXIsXG4gICAgICAgICAgICBlbnRpdHlJZDogYnVmLnJlYWRVaW50MzIoKSxcbiAgICAgICAgICAgIGNvbXBvbmVudElkOiBidWYucmVhZFVpbnQzMigpLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBidWYucmVhZFVpbnQzMigpLFxuICAgICAgICAgICAgbmV0d29ya0lkOiBidWYucmVhZFVpbnQzMigpLFxuICAgICAgICAgICAgZGF0YTogYnVmLnJlYWRCdWZmZXIoKVxuICAgICAgICB9O1xuICAgIH1cbiAgICBQdXROZXR3b3JrQ29tcG9uZW50T3BlcmF0aW9uLnJlYWQgPSByZWFkO1xufSkoUHV0TmV0d29ya0NvbXBvbmVudE9wZXJhdGlvbiB8fCAoUHV0TmV0d29ya0NvbXBvbmVudE9wZXJhdGlvbiA9IHt9KSk7XG4iLCAiaW1wb3J0IHsgQ3JkdE1lc3NhZ2VQcm90b2NvbCB9IGZyb20gJy4uL2NyZHRNZXNzYWdlUHJvdG9jb2wnO1xuaW1wb3J0IHsgQ3JkdE1lc3NhZ2VUeXBlLCBDUkRUX01FU1NBR0VfSEVBREVSX0xFTkdUSCB9IGZyb20gJy4uL3R5cGVzJztcbi8qKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdmFyIERlbGV0ZUNvbXBvbmVudE5ldHdvcms7XG4oZnVuY3Rpb24gKERlbGV0ZUNvbXBvbmVudE5ldHdvcmspIHtcbiAgICBEZWxldGVDb21wb25lbnROZXR3b3JrLk1FU1NBR0VfSEVBREVSX0xFTkdUSCA9IDE2O1xuICAgIC8qKlxuICAgICAqIFdyaXRlIERlbGV0ZUNvbXBvbmVudCBtZXNzYWdlXG4gICAgICovXG4gICAgZnVuY3Rpb24gd3JpdGUoZW50aXR5LCBjb21wb25lbnRJZCwgdGltZXN0YW1wLCBuZXR3b3JrSWQsIGJ1Zikge1xuICAgICAgICAvLyByZXNlcnZlIHRoZSBiZWdpbm5pbmdcbiAgICAgICAgY29uc3QgbWVzc2FnZUxlbmd0aCA9IENSRFRfTUVTU0FHRV9IRUFERVJfTEVOR1RIICsgRGVsZXRlQ29tcG9uZW50TmV0d29yay5NRVNTQUdFX0hFQURFUl9MRU5HVEg7XG4gICAgICAgIGNvbnN0IHN0YXJ0TWVzc2FnZU9mZnNldCA9IGJ1Zi5pbmNyZW1lbnRXcml0ZU9mZnNldChtZXNzYWdlTGVuZ3RoKTtcbiAgICAgICAgLy8gV3JpdGUgQ3JkdE1lc3NhZ2UgaGVhZGVyXG4gICAgICAgIGJ1Zi5zZXRVaW50MzIoc3RhcnRNZXNzYWdlT2Zmc2V0LCBtZXNzYWdlTGVuZ3RoKTtcbiAgICAgICAgYnVmLnNldFVpbnQzMihzdGFydE1lc3NhZ2VPZmZzZXQgKyA0LCBDcmR0TWVzc2FnZVR5cGUuREVMRVRFX0NPTVBPTkVOVF9ORVRXT1JLKTtcbiAgICAgICAgLy8gV3JpdGUgQ29tcG9uZW50T3BlcmF0aW9uIGhlYWRlclxuICAgICAgICBidWYuc2V0VWludDMyKHN0YXJ0TWVzc2FnZU9mZnNldCArIDgsIGVudGl0eSk7XG4gICAgICAgIGJ1Zi5zZXRVaW50MzIoc3RhcnRNZXNzYWdlT2Zmc2V0ICsgMTIsIGNvbXBvbmVudElkKTtcbiAgICAgICAgYnVmLnNldFVpbnQzMihzdGFydE1lc3NhZ2VPZmZzZXQgKyAxNiwgdGltZXN0YW1wKTtcbiAgICAgICAgYnVmLnNldFVpbnQzMihzdGFydE1lc3NhZ2VPZmZzZXQgKyAyMCwgbmV0d29ya0lkKTtcbiAgICB9XG4gICAgRGVsZXRlQ29tcG9uZW50TmV0d29yay53cml0ZSA9IHdyaXRlO1xuICAgIGZ1bmN0aW9uIHJlYWQoYnVmKSB7XG4gICAgICAgIGNvbnN0IGhlYWRlciA9IENyZHRNZXNzYWdlUHJvdG9jb2wucmVhZEhlYWRlcihidWYpO1xuICAgICAgICBpZiAoIWhlYWRlcikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhlYWRlci50eXBlICE9PSBDcmR0TWVzc2FnZVR5cGUuREVMRVRFX0NPTVBPTkVOVF9ORVRXT1JLKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RlbGV0ZUNvbXBvbmVudE9wZXJhdGlvbiB0cmllZCB0byByZWFkIGFub3RoZXIgbWVzc2FnZSB0eXBlLicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5oZWFkZXIsXG4gICAgICAgICAgICBlbnRpdHlJZDogYnVmLnJlYWRVaW50MzIoKSxcbiAgICAgICAgICAgIGNvbXBvbmVudElkOiBidWYucmVhZFVpbnQzMigpLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBidWYucmVhZFVpbnQzMigpLFxuICAgICAgICAgICAgbmV0d29ya0lkOiBidWYucmVhZFVpbnQzMigpXG4gICAgICAgIH07XG4gICAgfVxuICAgIERlbGV0ZUNvbXBvbmVudE5ldHdvcmsucmVhZCA9IHJlYWQ7XG59KShEZWxldGVDb21wb25lbnROZXR3b3JrIHx8IChEZWxldGVDb21wb25lbnROZXR3b3JrID0ge30pKTtcbiIsICJpbXBvcnQgeyBDcmR0TWVzc2FnZVByb3RvY29sIH0gZnJvbSAnLi4vY3JkdE1lc3NhZ2VQcm90b2NvbCc7XG5pbXBvcnQgeyBDcmR0TWVzc2FnZVR5cGUsIENSRFRfTUVTU0FHRV9IRUFERVJfTEVOR1RIIH0gZnJvbSAnLi4vdHlwZXMnO1xuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB2YXIgRGVsZXRlRW50aXR5TmV0d29yaztcbihmdW5jdGlvbiAoRGVsZXRlRW50aXR5TmV0d29yaykge1xuICAgIERlbGV0ZUVudGl0eU5ldHdvcmsuTUVTU0FHRV9IRUFERVJfTEVOR1RIID0gODtcbiAgICBmdW5jdGlvbiB3cml0ZShlbnRpdHksIG5ldHdvcmtJZCwgYnVmKSB7XG4gICAgICAgIC8vIFdyaXRlIENyZHRNZXNzYWdlIGhlYWRlclxuICAgICAgICBidWYud3JpdGVVaW50MzIoQ1JEVF9NRVNTQUdFX0hFQURFUl9MRU5HVEggKyA0KTtcbiAgICAgICAgYnVmLndyaXRlVWludDMyKENyZHRNZXNzYWdlVHlwZS5ERUxFVEVfRU5USVRZX05FVFdPUkspO1xuICAgICAgICAvLyBib2R5XG4gICAgICAgIGJ1Zi53cml0ZVVpbnQzMihlbnRpdHkpO1xuICAgICAgICBidWYud3JpdGVVaW50MzIobmV0d29ya0lkKTtcbiAgICB9XG4gICAgRGVsZXRlRW50aXR5TmV0d29yay53cml0ZSA9IHdyaXRlO1xuICAgIGZ1bmN0aW9uIHJlYWQoYnVmKSB7XG4gICAgICAgIGNvbnN0IGhlYWRlciA9IENyZHRNZXNzYWdlUHJvdG9jb2wucmVhZEhlYWRlcihidWYpO1xuICAgICAgICBpZiAoIWhlYWRlcikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhlYWRlci50eXBlICE9PSBDcmR0TWVzc2FnZVR5cGUuREVMRVRFX0VOVElUWV9ORVRXT1JLKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RlbGV0ZUVudGl0eU5ldHdvcmsgdHJpZWQgdG8gcmVhZCBhbm90aGVyIG1lc3NhZ2UgdHlwZS4nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uaGVhZGVyLFxuICAgICAgICAgICAgZW50aXR5SWQ6IGJ1Zi5yZWFkVWludDMyKCksXG4gICAgICAgICAgICBuZXR3b3JrSWQ6IGJ1Zi5yZWFkVWludDMyKClcbiAgICAgICAgfTtcbiAgICB9XG4gICAgRGVsZXRlRW50aXR5TmV0d29yay5yZWFkID0gcmVhZDtcbn0pKERlbGV0ZUVudGl0eU5ldHdvcmsgfHwgKERlbGV0ZUVudGl0eU5ldHdvcmsgPSB7fSkpO1xuIiwgImltcG9ydCB7IFJlYWRXcml0ZUJ5dGVCdWZmZXIgfSBmcm9tICcuLi8uLi9CeXRlQnVmZmVyJztcbmltcG9ydCB7IFB1dENvbXBvbmVudE9wZXJhdGlvbiB9IGZyb20gJy4uL3B1dENvbXBvbmVudCc7XG5pbXBvcnQgeyBDcmR0TWVzc2FnZVR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBEZWxldGVDb21wb25lbnQgfSBmcm9tICcuLi9kZWxldGVDb21wb25lbnQnO1xuaW1wb3J0IHsgRGVsZXRlRW50aXR5IH0gZnJvbSAnLi4vZGVsZXRlRW50aXR5JztcbmltcG9ydCB7IFB1dE5ldHdvcmtDb21wb25lbnRPcGVyYXRpb24gfSBmcm9tICcuL3B1dENvbXBvbmVudE5ldHdvcmsnO1xuaW1wb3J0IHsgRGVsZXRlQ29tcG9uZW50TmV0d29yayB9IGZyb20gJy4vZGVsZXRlQ29tcG9uZW50TmV0d29yayc7XG5pbXBvcnQgeyBEZWxldGVFbnRpdHlOZXR3b3JrIH0gZnJvbSAnLi9kZWxldGVFbnRpdHlOZXR3b3JrJztcbmltcG9ydCB7IFRyYW5zZm9ybVNjaGVtYSB9IGZyb20gJy4uLy4uLy4uL2NvbXBvbmVudHMvbWFudWFsL1RyYW5zZm9ybSc7XG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTmV0d29ya01lc3NhZ2UobWVzc2FnZSkge1xuICAgIHJldHVybiBbXG4gICAgICAgIENyZHRNZXNzYWdlVHlwZS5ERUxFVEVfQ09NUE9ORU5UX05FVFdPUkssXG4gICAgICAgIENyZHRNZXNzYWdlVHlwZS5ERUxFVEVfRU5USVRZX05FVFdPUkssXG4gICAgICAgIENyZHRNZXNzYWdlVHlwZS5QVVRfQ09NUE9ORU5UX05FVFdPUktcbiAgICBdLmluY2x1ZGVzKG1lc3NhZ2UudHlwZSk7XG59XG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5ldHdvcmtNZXNzYWdlVG9Mb2NhbChtZXNzYWdlLCBsb2NhbEVudGl0eUlkLCBidWZmZXIsIGRlc3RpbmF0aW9uQnVmZmVyKSB7XG4gICAgY29uc3Qgb2Zmc2V0ID0gYnVmZmVyLmN1cnJlbnRXcml0ZU9mZnNldCgpO1xuICAgIGlmIChtZXNzYWdlLnR5cGUgPT09IENyZHRNZXNzYWdlVHlwZS5QVVRfQ09NUE9ORU5UX05FVFdPUkspIHtcbiAgICAgICAgUHV0Q29tcG9uZW50T3BlcmF0aW9uLndyaXRlKGxvY2FsRW50aXR5SWQsIG1lc3NhZ2UudGltZXN0YW1wLCBtZXNzYWdlLmNvbXBvbmVudElkLCBtZXNzYWdlLmRhdGEsIGJ1ZmZlcik7XG4gICAgfVxuICAgIGVsc2UgaWYgKG1lc3NhZ2UudHlwZSA9PT0gQ3JkdE1lc3NhZ2VUeXBlLkRFTEVURV9DT01QT05FTlRfTkVUV09SSykge1xuICAgICAgICBEZWxldGVDb21wb25lbnQud3JpdGUobG9jYWxFbnRpdHlJZCwgbWVzc2FnZS5jb21wb25lbnRJZCwgbWVzc2FnZS50aW1lc3RhbXAsIGJ1ZmZlcik7XG4gICAgfVxuICAgIGVsc2UgaWYgKG1lc3NhZ2UudHlwZSA9PT0gQ3JkdE1lc3NhZ2VUeXBlLkRFTEVURV9FTlRJVFlfTkVUV09SSykge1xuICAgICAgICBEZWxldGVFbnRpdHkud3JpdGUobG9jYWxFbnRpdHlJZCwgYnVmZmVyKTtcbiAgICB9XG4gICAgZGVzdGluYXRpb25CdWZmZXIud3JpdGVCdWZmZXIoYnVmZmVyLmJ1ZmZlcigpLnN1YmFycmF5KG9mZnNldCwgYnVmZmVyLmN1cnJlbnRXcml0ZU9mZnNldCgpKSwgZmFsc2UpO1xufVxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2NhbE1lc3NhZ2VUb05ldHdvcmsobWVzc2FnZSwgbmV0d29yaywgYnVmZmVyLCBkZXN0aW5hdGlvbkJ1ZmZlcikge1xuICAgIGNvbnN0IG9mZnNldCA9IGJ1ZmZlci5jdXJyZW50V3JpdGVPZmZzZXQoKTtcbiAgICBpZiAobWVzc2FnZS50eXBlID09PSBDcmR0TWVzc2FnZVR5cGUuUFVUX0NPTVBPTkVOVCkge1xuICAgICAgICBQdXROZXR3b3JrQ29tcG9uZW50T3BlcmF0aW9uLndyaXRlKG5ldHdvcmsuZW50aXR5SWQsIG1lc3NhZ2UudGltZXN0YW1wLCBtZXNzYWdlLmNvbXBvbmVudElkLCBuZXR3b3JrLm5ldHdvcmtJZCwgbWVzc2FnZS5kYXRhLCBidWZmZXIpO1xuICAgIH1cbiAgICBlbHNlIGlmIChtZXNzYWdlLnR5cGUgPT09IENyZHRNZXNzYWdlVHlwZS5ERUxFVEVfQ09NUE9ORU5UKSB7XG4gICAgICAgIERlbGV0ZUNvbXBvbmVudE5ldHdvcmsud3JpdGUobmV0d29yay5lbnRpdHlJZCwgbWVzc2FnZS5jb21wb25lbnRJZCwgbWVzc2FnZS50aW1lc3RhbXAsIG5ldHdvcmsubmV0d29ya0lkLCBidWZmZXIpO1xuICAgIH1cbiAgICBlbHNlIGlmIChtZXNzYWdlLnR5cGUgPT09IENyZHRNZXNzYWdlVHlwZS5ERUxFVEVfRU5USVRZKSB7XG4gICAgICAgIERlbGV0ZUVudGl0eU5ldHdvcmsud3JpdGUobmV0d29yay5lbnRpdHlJZCwgbmV0d29yay5uZXR3b3JrSWQsIGJ1ZmZlcik7XG4gICAgfVxuICAgIGRlc3RpbmF0aW9uQnVmZmVyLndyaXRlQnVmZmVyKGJ1ZmZlci5idWZmZXIoKS5zdWJhcnJheShvZmZzZXQsIGJ1ZmZlci5jdXJyZW50V3JpdGVPZmZzZXQoKSksIGZhbHNlKTtcbn1cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5leHBvcnQgZnVuY3Rpb24gZml4VHJhbnNmb3JtUGFyZW50KG1lc3NhZ2UsIHRyYW5zZm9ybVZhbHVlLCBwYXJlbnQpIHtcbiAgICBsZXQgdHJhbnNmb3JtID0gdHJhbnNmb3JtVmFsdWU7XG4gICAgY29uc3QgYnVmZmVyID0gbmV3IFJlYWRXcml0ZUJ5dGVCdWZmZXIoKTtcbiAgICBpZiAoIXRyYW5zZm9ybSAmJiAnZGF0YScgaW4gbWVzc2FnZSkge1xuICAgICAgICBidWZmZXIud3JpdGVCdWZmZXIobWVzc2FnZS5kYXRhKTtcbiAgICAgICAgdHJhbnNmb3JtID0gVHJhbnNmb3JtU2NoZW1hLmRlc2VyaWFsaXplKGJ1ZmZlcik7XG4gICAgICAgIGJ1ZmZlci5yZXNldEJ1ZmZlcigpO1xuICAgIH1cbiAgICBpZiAoIXRyYW5zZm9ybSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHBhcmVudCB0cmFuc2Zvcm0nKTtcbiAgICAvLyBHZW5lcmF0ZSBuZXcgdHJhbnNmb3JtIHJhdyBkYXRhIHdpdGggdGhlIHBhcmVudFxuICAgIGNvbnN0IG5ld1RyYW5zZm9ybSA9IHsgLi4udHJhbnNmb3JtLCBwYXJlbnQgfTtcbiAgICBidWZmZXIucmVzZXRCdWZmZXIoKTtcbiAgICBUcmFuc2Zvcm1TY2hlbWEuc2VyaWFsaXplKG5ld1RyYW5zZm9ybSwgYnVmZmVyKTtcbiAgICByZXR1cm4gYnVmZmVyLnRvQmluYXJ5KCk7XG59XG4iLCAiaW1wb3J0IHsgRW50aXR5U3RhdGUgfSBmcm9tICcuLi8uLi9lbmdpbmUvZW50aXR5JztcbmltcG9ydCB7IFJlYWRXcml0ZUJ5dGVCdWZmZXIgfSBmcm9tICcuLi8uLi9zZXJpYWxpemF0aW9uL0J5dGVCdWZmZXInO1xuaW1wb3J0IHsgQXBwZW5kVmFsdWVPcGVyYXRpb24sIENyZHRNZXNzYWdlUHJvdG9jb2wsIERlbGV0ZUNvbXBvbmVudE5ldHdvcmssIERlbGV0ZUVudGl0eU5ldHdvcmsgfSBmcm9tICcuLi8uLi9zZXJpYWxpemF0aW9uL2NyZHQnO1xuaW1wb3J0IHsgRGVsZXRlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vc2VyaWFsaXphdGlvbi9jcmR0L2RlbGV0ZUNvbXBvbmVudCc7XG5pbXBvcnQgeyBEZWxldGVFbnRpdHkgfSBmcm9tICcuLi8uLi9zZXJpYWxpemF0aW9uL2NyZHQvZGVsZXRlRW50aXR5JztcbmltcG9ydCB7IFB1dENvbXBvbmVudE9wZXJhdGlvbiB9IGZyb20gJy4uLy4uL3NlcmlhbGl6YXRpb24vY3JkdC9wdXRDb21wb25lbnQnO1xuaW1wb3J0IHsgQ3JkdE1lc3NhZ2VUeXBlIH0gZnJvbSAnLi4vLi4vc2VyaWFsaXphdGlvbi9jcmR0L3R5cGVzJztcbmltcG9ydCB7IFB1dE5ldHdvcmtDb21wb25lbnRPcGVyYXRpb24gfSBmcm9tICcuLi8uLi9zZXJpYWxpemF0aW9uL2NyZHQvbmV0d29yay9wdXRDb21wb25lbnROZXR3b3JrJztcbmltcG9ydCB7IE5ldHdvcmtFbnRpdHkgYXMgZGVmaW5lTmV0d29ya0VudGl0eSwgTmV0d29ya1BhcmVudCBhcyBkZWZpbmVOZXR3b3JrUGFyZW50LCBUcmFuc2Zvcm0gYXMgZGVmaW5lVHJhbnNmb3JtIH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cyc7XG5pbXBvcnQgKiBhcyBuZXR3b3JrVXRpbHMgZnJvbSAnLi4vLi4vc2VyaWFsaXphdGlvbi9jcmR0L25ldHdvcmsvdXRpbHMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZHRTY2VuZVN5c3RlbShlbmdpbmUsIG9uUHJvY2Vzc0VudGl0eUNvbXBvbmVudENoYW5nZSkge1xuICAgIGNvbnN0IHRyYW5zcG9ydHMgPSBbXTtcbiAgICAvLyBDb21wb25lbnRzIHRoYXQgd2UgdXNlZCBvbiB0aGlzIHN5c3RlbVxuICAgIGNvbnN0IE5ldHdvcmtFbnRpdHkgPSBkZWZpbmVOZXR3b3JrRW50aXR5KGVuZ2luZSk7XG4gICAgY29uc3QgTmV0d29ya1BhcmVudCA9IGRlZmluZU5ldHdvcmtQYXJlbnQoZW5naW5lKTtcbiAgICBjb25zdCBUcmFuc2Zvcm0gPSBkZWZpbmVUcmFuc2Zvcm0oZW5naW5lKTtcbiAgICAvLyBNZXNzYWdlcyB0aGF0IHdlIHJlY2VpdmVkIGF0IHRyYW5zcG9ydC5vbk1lc3NhZ2Ugd2FpdGluZyB0byBiZSBwcm9jZXNzZWRcbiAgICBjb25zdCByZWNlaXZlZE1lc3NhZ2VzID0gW107XG4gICAgLy8gTWVzc2FnZXMgYWxyZWFkeSBwcm9jZXNzZWQgYnkgdGhlIGVuZ2luZSBidXQgdGhhdCB3ZSBuZWVkIHRvIGJyb2FkY2FzdCB0byBvdGhlciB0cmFuc3BvcnRzLlxuICAgIGNvbnN0IGJyb2FkY2FzdE1lc3NhZ2VzID0gW107XG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdHJhbnNwb3J0SWQgdHJhbnBvcnQgaWQgdG8gaWRlbnRpeSBtZXNzYWdlc1xuICAgICAqIEByZXR1cm5zIGEgZnVuY3Rpb24gdG8gcHJvY2VzcyByZWNlaXZlZCBtZXNzYWdlc1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHBhcnNlQ2h1bmtNZXNzYWdlKHRyYW5zcG9ydElkKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZWNlaXZlcyBhIGNodW5rIG9mIGJpbmFyeSBtZXNzYWdlcyBhbmQgc3RvcmVzIGFsbCB0aGUgdmFsaWRcbiAgICAgICAgICogQ29tcG9uZW50IE9wZXJhdGlvbiBNZXNzYWdlcyBhdCBtZXNzYWdlcyBxdWV1ZVxuICAgICAgICAgKiBAcGFyYW0gY2h1bmtNZXNzYWdlIEEgY2h1bmsgb2YgYmluYXJ5IG1lc3NhZ2VzXG4gICAgICAgICAqL1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gcGFyc2VDaHVua01lc3NhZ2UoY2h1bmtNZXNzYWdlKSB7XG4gICAgICAgICAgICBjb25zdCBidWZmZXIgPSBuZXcgUmVhZFdyaXRlQnl0ZUJ1ZmZlcihjaHVua01lc3NhZ2UpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcjtcbiAgICAgICAgICAgIHdoaWxlICgoaGVhZGVyID0gQ3JkdE1lc3NhZ2VQcm90b2NvbC5nZXRIZWFkZXIoYnVmZmVyKSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBvZmZzZXQgPSBidWZmZXIuY3VycmVudFJlYWRPZmZzZXQoKTtcbiAgICAgICAgICAgICAgICBsZXQgbWVzc2FnZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBpZiAoaGVhZGVyLnR5cGUgPT09IENyZHRNZXNzYWdlVHlwZS5ERUxFVEVfQ09NUE9ORU5UKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBEZWxldGVDb21wb25lbnQucmVhZChidWZmZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChoZWFkZXIudHlwZSA9PT0gQ3JkdE1lc3NhZ2VUeXBlLkRFTEVURV9DT01QT05FTlRfTkVUV09SSykge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gRGVsZXRlQ29tcG9uZW50TmV0d29yay5yZWFkKGJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGhlYWRlci50eXBlID09PSBDcmR0TWVzc2FnZVR5cGUuUFVUX0NPTVBPTkVOVCkge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gUHV0Q29tcG9uZW50T3BlcmF0aW9uLnJlYWQoYnVmZmVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoaGVhZGVyLnR5cGUgPT09IENyZHRNZXNzYWdlVHlwZS5QVVRfQ09NUE9ORU5UX05FVFdPUkspIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IFB1dE5ldHdvcmtDb21wb25lbnRPcGVyYXRpb24ucmVhZChidWZmZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChoZWFkZXIudHlwZSA9PT0gQ3JkdE1lc3NhZ2VUeXBlLkRFTEVURV9FTlRJVFkpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IERlbGV0ZUVudGl0eS5yZWFkKGJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGhlYWRlci50eXBlID09PSBDcmR0TWVzc2FnZVR5cGUuREVMRVRFX0VOVElUWV9ORVRXT1JLKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBEZWxldGVFbnRpdHlOZXR3b3JrLnJlYWQoYnVmZmVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoaGVhZGVyLnR5cGUgPT09IENyZHRNZXNzYWdlVHlwZS5BUFBFTkRfVkFMVUUpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IEFwcGVuZFZhbHVlT3BlcmF0aW9uLnJlYWQoYnVmZmVyKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gVW5rbm93biBtZXNzYWdlLCB3ZSBza2lwIGl0XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zdW1lIHRoZSBtZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5pbmNyZW1lbnRSZWFkT2Zmc2V0KGhlYWRlci5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICByZWNlaXZlZE1lc3NhZ2VzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4ubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUJ1ZmZlcjogYnVmZmVyLmJ1ZmZlcigpLnN1YmFycmF5KG9mZnNldCwgYnVmZmVyLmN1cnJlbnRSZWFkT2Zmc2V0KCkpXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIGFuZCBjbGVhciB0aGUgbWVzc2FlcyBxdWV1ZVxuICAgICAqIEByZXR1cm5zIG1lc3NhZ2VzIHJlY2lldmVkIGJ5IHRoZSB0cmFuc3BvcnQgdG8gcHJvY2VzcyBvbiB0aGUgbmV4dCB0aWNrXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0TWVzc2FnZXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZXNUb1Byb2Nlc3MgPSB2YWx1ZS5zcGxpY2UoMCwgdmFsdWUubGVuZ3RoKTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2VzVG9Qcm9jZXNzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGaW5kIHRoZSBsb2NhbCBlbnRpdHlJZCBhc3NvY2lhdGVkIHRvIHRoZSBuZXR3b3JrIGNvbXBvbmVudCBtZXNzYWdlLlxuICAgICAqIEl0J3MgYSBtYXBwaW5nIE5ldHdvcmsgLT4gdG8gTG9jYWxcbiAgICAgKiBJZiBpdCdzIG5vdCBhIG5ldHdvcmsgbWVzc2FnZSwgcmV0dXJuIHRoZSBlbnRpdHlJZCByZWNlaXZlZCBieSB0aGUgbWVzc2FnZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZpbmROZXR3b3JrSWQobXNnKSB7XG4gICAgICAgIGNvbnN0IGhhc05ldHdvcmtJZCA9ICduZXR3b3JrSWQnIGluIG1zZztcbiAgICAgICAgaWYgKGhhc05ldHdvcmtJZCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBbZW50aXR5SWQsIG5ldHdvcmtdIG9mIGVuZ2luZS5nZXRFbnRpdGllc1dpdGgoTmV0d29ya0VudGl0eSkpIHtcbiAgICAgICAgICAgICAgICBpZiAobmV0d29yay5uZXR3b3JrSWQgPT09IG1zZy5uZXR3b3JrSWQgJiYgbmV0d29yay5lbnRpdHlJZCA9PT0gbXNnLmVudGl0eUlkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGVudGl0eUlkLCBuZXR3b3JrIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGVudGl0eUlkOiBtc2cuZW50aXR5SWQgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhpcyBmbiB3aWxsIGJlIGNhbGxlZCBvbiBldmVyeSB0aWNrLlxuICAgICAqIFByb2Nlc3MgYWxsIHRoZSBtZXNzYWdlcyBxdWV1ZSByZWNlaXZlZCBieSB0aGUgdHJhbnNwb3J0XG4gICAgICovXG4gICAgYXN5bmMgZnVuY3Rpb24gcmVjZWl2ZU1lc3NhZ2VzKCkge1xuICAgICAgICBjb25zdCBtZXNzYWdlc1RvUHJvY2VzcyA9IGdldE1lc3NhZ2VzKHJlY2VpdmVkTWVzc2FnZXMpO1xuICAgICAgICBjb25zdCBlbnRpdGllc1Nob3VsZEJlQ2xlYW5lZCA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IG1zZyBvZiBtZXNzYWdlc1RvUHJvY2Vzcykge1xuICAgICAgICAgICAgbGV0IHsgZW50aXR5SWQsIG5ldHdvcmsgfSA9IGZpbmROZXR3b3JrSWQobXNnKTtcbiAgICAgICAgICAgIC8vIFdlIHJlY2VpdmUgYSBuZXcgRW50aXR5LiBDcmVhdGUgdGhlIGxvY2FsRW50aXR5IGFuZCBtYXAgaXQgdG8gdGhlIE5ldHdvcmtFbnRpdHkgY29tcG9uZW50XG4gICAgICAgICAgICBpZiAobmV0d29ya1V0aWxzLmlzTmV0d29ya01lc3NhZ2UobXNnKSAmJiAhbmV0d29yaykge1xuICAgICAgICAgICAgICAgIGVudGl0eUlkID0gZW5naW5lLmFkZEVudGl0eSgpO1xuICAgICAgICAgICAgICAgIG5ldHdvcmsgPSB7IGVudGl0eUlkOiBtc2cuZW50aXR5SWQsIG5ldHdvcmtJZDogbXNnLm5ldHdvcmtJZCB9O1xuICAgICAgICAgICAgICAgIE5ldHdvcmtFbnRpdHkuY3JlYXRlT3JSZXBsYWNlKGVudGl0eUlkLCBuZXR3b3JrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtc2cudHlwZSA9PT0gQ3JkdE1lc3NhZ2VUeXBlLkRFTEVURV9FTlRJVFkgfHwgbXNnLnR5cGUgPT09IENyZHRNZXNzYWdlVHlwZS5ERUxFVEVfRU5USVRZX05FVFdPUkspIHtcbiAgICAgICAgICAgICAgICBlbnRpdGllc1Nob3VsZEJlQ2xlYW5lZC5wdXNoKGVudGl0eUlkKTtcbiAgICAgICAgICAgICAgICBicm9hZGNhc3RNZXNzYWdlcy5wdXNoKG1zZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbnRpdHlTdGF0ZSA9IGVuZ2luZS5lbnRpdHlDb250YWluZXIuZ2V0RW50aXR5U3RhdGUoZW50aXR5SWQpO1xuICAgICAgICAgICAgICAgIC8vIFNraXAgdXBkYXRlcyBmcm9tIHJlbW92ZWQgZW50aXR5ZXNcbiAgICAgICAgICAgICAgICBpZiAoZW50aXR5U3RhdGUgPT09IEVudGl0eVN0YXRlLlJlbW92ZWQpXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIC8vIEVudGl0aWVzIHdpdGggdW5rbm93biBlbnRpdGllcyBzaG91bGQgdXBkYXRlIGl0cyBlbnRpdHkgc3RhdGVcbiAgICAgICAgICAgICAgICBpZiAoZW50aXR5U3RhdGUgPT09IEVudGl0eVN0YXRlLlVua25vd24pIHtcbiAgICAgICAgICAgICAgICAgICAgZW5naW5lLmVudGl0eUNvbnRhaW5lci51cGRhdGVVc2VkRW50aXR5KGVudGl0eUlkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gZW5naW5lLmdldENvbXBvbmVudE9yTnVsbChtc2cuY29tcG9uZW50SWQpO1xuICAgICAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobXNnLnR5cGUgPT09IENyZHRNZXNzYWdlVHlwZS5QVVRfQ09NUE9ORU5UICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuY29tcG9uZW50SWQgPT09IFRyYW5zZm9ybS5jb21wb25lbnRJZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgTmV0d29ya0VudGl0eS5oYXMoZW50aXR5SWQpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBOZXR3b3JrUGFyZW50LmhhcyhlbnRpdHlJZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1zZy5kYXRhID0gbmV0d29ya1V0aWxzLmZpeFRyYW5zZm9ybVBhcmVudChtc2cpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IFtjb25mbGljdE1lc3NhZ2UsIHZhbHVlXSA9IGNvbXBvbmVudC51cGRhdGVGcm9tQ3JkdCh7IC4uLm1zZywgZW50aXR5SWQgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY29uZmxpY3RNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBZGQgbWVzc2FnZSB0byB0cmFuc3BvcnQgcXVldWUgdG8gYmUgcHJvY2Vzc2VkIGJ5IG90aGVycyB0cmFuc3BvcnRzXG4gICAgICAgICAgICAgICAgICAgICAgICBicm9hZGNhc3RNZXNzYWdlcy5wdXNoKG1zZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBvblByb2Nlc3NFbnRpdHlDb21wb25lbnRDaGFuZ2UgJiYgb25Qcm9jZXNzRW50aXR5Q29tcG9uZW50Q2hhbmdlKG1zZy5lbnRpdHlJZCwgbXNnLnR5cGUsIGNvbXBvbmVudCwgdmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiB0ZXN0IHRoaXMgbGluZSwgaXQgaXMgZnVuZGFtbWVudGFsIHRvIG1ha2UgdGhlIGVkaXRvciB3b3JrXG4gICAgICAgICAgICAgICAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzLnB1c2gobXNnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gdGhlIGxhc3Qgc3RhZ2Ugb2YgdGhlIHN5bmNyaG9uaXphdGlvbiBpcyB0byBkZWxldGUgdGhlIGVudGl0aWVzXG4gICAgICAgIGZvciAoY29uc3QgZW50aXR5IG9mIGVudGl0aWVzU2hvdWxkQmVDbGVhbmVkKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGRlZmluaXRpb24gb2YgZW5naW5lLmNvbXBvbmVudHNJdGVyKCkpIHtcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiBjaGVjayB0aGlzIHdpdGggcGF0by9wcmF2dXNcbiAgICAgICAgICAgICAgICBkZWZpbml0aW9uLmVudGl0eURlbGV0ZWQoZW50aXR5LCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVuZ2luZS5lbnRpdHlDb250YWluZXIudXBkYXRlUmVtb3ZlZEVudGl0eShlbnRpdHkpO1xuICAgICAgICAgICAgb25Qcm9jZXNzRW50aXR5Q29tcG9uZW50Q2hhbmdlICYmIG9uUHJvY2Vzc0VudGl0eUNvbXBvbmVudENoYW5nZShlbnRpdHksIENyZHRNZXNzYWdlVHlwZS5ERUxFVEVfRU5USVRZKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBJdGVyYXRlcyB0aGUgZGlydHkgbWFwIGFuZCBnZW5lcmF0ZXMgY3JkdCBtZXNzYWdlcyB0byBiZSBzZW5kXG4gICAgICovXG4gICAgYXN5bmMgZnVuY3Rpb24gc2VuZE1lc3NhZ2VzKGVudGl0aWVzRGVsZXRlZFRoaXNUaWNrKSB7XG4gICAgICAgIC8vIENSRFQgTWVzc2FnZXMgd2lsbCBiZSB0aGUgbWVyZ2UgYmV0d2VlbiB0aGUgcmVjaWV2ZWQgdHJhbnNwb3J0IG1lc3NhZ2VzIGFuZCB0aGUgbmV3IGNyZHQgbWVzc2FnZXNcbiAgICAgICAgY29uc3QgY3JkdE1lc3NhZ2VzID0gZ2V0TWVzc2FnZXMoYnJvYWRjYXN0TWVzc2FnZXMpO1xuICAgICAgICBjb25zdCBidWZmZXIgPSBuZXcgUmVhZFdyaXRlQnl0ZUJ1ZmZlcigpO1xuICAgICAgICBmb3IgKGNvbnN0IGNvbXBvbmVudCBvZiBlbmdpbmUuY29tcG9uZW50c0l0ZXIoKSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBtZXNzYWdlIG9mIGNvbXBvbmVudC5nZXRDcmR0VXBkYXRlcygpKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gYnVmZmVyLmN1cnJlbnRXcml0ZU9mZnNldCgpO1xuICAgICAgICAgICAgICAgIC8vIEF2b2lkIGNyZWF0aW5nIG1lc3NhZ2VzIGlmIHRoZXJlIGlzIG5vIHRyYW5zcG9ydCB0aGF0IHdpbGwgaGFuZGxlIGl0XG4gICAgICAgICAgICAgICAgaWYgKHRyYW5zcG9ydHMuc29tZSgodCkgPT4gdC5maWx0ZXIobWVzc2FnZSkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLnR5cGUgPT09IENyZHRNZXNzYWdlVHlwZS5QVVRfQ09NUE9ORU5UKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBQdXRDb21wb25lbnRPcGVyYXRpb24ud3JpdGUobWVzc2FnZS5lbnRpdHlJZCwgbWVzc2FnZS50aW1lc3RhbXAsIG1lc3NhZ2UuY29tcG9uZW50SWQsIG1lc3NhZ2UuZGF0YSwgYnVmZmVyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChtZXNzYWdlLnR5cGUgPT09IENyZHRNZXNzYWdlVHlwZS5ERUxFVEVfQ09NUE9ORU5UKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBEZWxldGVDb21wb25lbnQud3JpdGUobWVzc2FnZS5lbnRpdHlJZCwgY29tcG9uZW50LmNvbXBvbmVudElkLCBtZXNzYWdlLnRpbWVzdGFtcCwgYnVmZmVyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChtZXNzYWdlLnR5cGUgPT09IENyZHRNZXNzYWdlVHlwZS5BUFBFTkRfVkFMVUUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEFwcGVuZFZhbHVlT3BlcmF0aW9uLndyaXRlKG1lc3NhZ2UuZW50aXR5SWQsIG1lc3NhZ2UudGltZXN0YW1wLCBtZXNzYWdlLmNvbXBvbmVudElkLCBtZXNzYWdlLmRhdGEsIGJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY3JkdE1lc3NhZ2VzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4ubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VCdWZmZXI6IGJ1ZmZlci5idWZmZXIoKS5zdWJhcnJheShvZmZzZXQsIGJ1ZmZlci5jdXJyZW50V3JpdGVPZmZzZXQoKSlcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvblByb2Nlc3NFbnRpdHlDb21wb25lbnRDaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJhd1ZhbHVlID0gbWVzc2FnZS50eXBlID09PSBDcmR0TWVzc2FnZVR5cGUuUFVUX0NPTVBPTkVOVCB8fCBtZXNzYWdlLnR5cGUgPT09IENyZHRNZXNzYWdlVHlwZS5BUFBFTkRfVkFMVUVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGNvbXBvbmVudC5nZXQobWVzc2FnZS5lbnRpdHlJZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uUHJvY2Vzc0VudGl0eUNvbXBvbmVudENoYW5nZShtZXNzYWdlLmVudGl0eUlkLCBtZXNzYWdlLnR5cGUsIGNvbXBvbmVudCwgcmF3VmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEFmdGVyIGFsbCB1cGRhdGVzLCBJIGV4ZWN1dGUgdGhlIERlbGV0ZWRFbnRpdHkgbWVzc2FnZXNcbiAgICAgICAgZm9yIChjb25zdCBlbnRpdHlJZCBvZiBlbnRpdGllc0RlbGV0ZWRUaGlzVGljaykge1xuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gYnVmZmVyLmN1cnJlbnRXcml0ZU9mZnNldCgpO1xuICAgICAgICAgICAgRGVsZXRlRW50aXR5LndyaXRlKGVudGl0eUlkLCBidWZmZXIpO1xuICAgICAgICAgICAgY3JkdE1lc3NhZ2VzLnB1c2goe1xuICAgICAgICAgICAgICAgIHR5cGU6IENyZHRNZXNzYWdlVHlwZS5ERUxFVEVfRU5USVRZLFxuICAgICAgICAgICAgICAgIGVudGl0eUlkLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2VCdWZmZXI6IGJ1ZmZlci5idWZmZXIoKS5zdWJhcnJheShvZmZzZXQsIGJ1ZmZlci5jdXJyZW50V3JpdGVPZmZzZXQoKSlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgb25Qcm9jZXNzRW50aXR5Q29tcG9uZW50Q2hhbmdlICYmIG9uUHJvY2Vzc0VudGl0eUNvbXBvbmVudENoYW5nZShlbnRpdHlJZCwgQ3JkdE1lc3NhZ2VUeXBlLkRFTEVURV9FTlRJVFkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNlbmQgQ1JEVCBtZXNzYWdlcyB0byB0cmFuc3BvcnRzXG4gICAgICAgIGNvbnN0IHRyYW5zcG9ydEJ1ZmZlciA9IG5ldyBSZWFkV3JpdGVCeXRlQnVmZmVyKCk7XG4gICAgICAgIGZvciAoY29uc3QgaW5kZXggaW4gdHJhbnNwb3J0cykge1xuICAgICAgICAgICAgY29uc3QgdHJhbnNwb3J0SW5kZXggPSBOdW1iZXIoaW5kZXgpO1xuICAgICAgICAgICAgY29uc3QgdHJhbnNwb3J0ID0gdHJhbnNwb3J0c1t0cmFuc3BvcnRJbmRleF07XG4gICAgICAgICAgICBjb25zdCBpc1JlbmRlcmVyVHJhbnNwb3J0ID0gdHJhbnNwb3J0LnR5cGUgPT09ICdyZW5kZXJlcic7XG4gICAgICAgICAgICBjb25zdCBpc05ldHdvcmtUcmFuc3BvcnQgPSB0cmFuc3BvcnQudHlwZSA9PT0gJ25ldHdvcmsnO1xuICAgICAgICAgICAgdHJhbnNwb3J0QnVmZmVyLnJlc2V0QnVmZmVyKCk7XG4gICAgICAgICAgICBjb25zdCBidWZmZXIgPSBuZXcgUmVhZFdyaXRlQnl0ZUJ1ZmZlcigpO1xuICAgICAgICAgICAgLy8gVGhlbiB3ZSBzZW5kIGFsbCB0aGUgbmV3IGNyZHRNZXNzYWdlcyB0aGF0IHRoZSB0cmFuc3BvcnQgbmVlZHMgdG8gcHJvY2Vzc1xuICAgICAgICAgICAgZm9yIChjb25zdCBtZXNzYWdlIG9mIGNyZHRNZXNzYWdlcykge1xuICAgICAgICAgICAgICAgIC8vIEF2b2lkIGVjaG8gbWVzc2FnZXNcbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS50cmFuc3BvcnRJZCA9PT0gdHJhbnNwb3J0SW5kZXgpXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIC8vIFJlZHVuZGFudCBtZXNzYWdlIGZvciB0aGUgdHJhbnNwb3J0XG4gICAgICAgICAgICAgICAgaWYgKCF0cmFuc3BvcnQuZmlsdGVyKG1lc3NhZ2UpKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGVudGl0eUlkIH0gPSBmaW5kTmV0d29ya0lkKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRyYW5zZm9ybU5lZWRzRml4ID0gJ2NvbXBvbmVudElkJyBpbiBtZXNzYWdlICYmXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuY29tcG9uZW50SWQgPT09IFRyYW5zZm9ybS5jb21wb25lbnRJZCAmJlxuICAgICAgICAgICAgICAgICAgICBUcmFuc2Zvcm0uaGFzKGVudGl0eUlkKSAmJlxuICAgICAgICAgICAgICAgICAgICBOZXR3b3JrUGFyZW50LmhhcyhlbnRpdHlJZCkgJiZcbiAgICAgICAgICAgICAgICAgICAgTmV0d29ya0VudGl0eS5oYXMoZW50aXR5SWQpO1xuICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlIHdhcyBhIExPQ0FMIGNoYW5nZSBpbiB0aGUgdHJhbnNmb3JtLiBBZGQgdGhlIHBhcmVudCB0byB0aGF0IHRyYW5zZm9ybVxuICAgICAgICAgICAgICAgIGlmIChpc1JlbmRlcmVyVHJhbnNwb3J0ICYmIG1lc3NhZ2UudHlwZSA9PT0gQ3JkdE1lc3NhZ2VUeXBlLlBVVF9DT01QT05FTlQgJiYgdHJhbnNmb3JtTmVlZHNGaXgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyZW50ID0gZmluZE5ldHdvcmtJZChOZXR3b3JrUGFyZW50LmdldChlbnRpdHlJZCkpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0cmFuc2Zvcm1EYXRhID0gbmV0d29ya1V0aWxzLmZpeFRyYW5zZm9ybVBhcmVudChtZXNzYWdlLCBUcmFuc2Zvcm0uZ2V0KGVudGl0eUlkKSwgcGFyZW50LmVudGl0eUlkKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gYnVmZmVyLmN1cnJlbnRXcml0ZU9mZnNldCgpO1xuICAgICAgICAgICAgICAgICAgICBQdXRDb21wb25lbnRPcGVyYXRpb24ud3JpdGUoZW50aXR5SWQsIG1lc3NhZ2UudGltZXN0YW1wLCBtZXNzYWdlLmNvbXBvbmVudElkLCB0cmFuc2Zvcm1EYXRhLCBidWZmZXIpO1xuICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnRCdWZmZXIud3JpdGVCdWZmZXIoYnVmZmVyLmJ1ZmZlcigpLnN1YmFycmF5KG9mZnNldCwgYnVmZmVyLmN1cnJlbnRXcml0ZU9mZnNldCgpKSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGlzUmVuZGVyZXJUcmFuc3BvcnQgJiYgbmV0d29ya1V0aWxzLmlzTmV0d29ya01lc3NhZ2UobWVzc2FnZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgaXQncyB0aGUgcmVuZGVyZXIgdHJhbnNwb3J0IGFuZCBpdHMgYSBOZXR3b3JrTWVzc2FnZSwgd2UgbmVlZCB0byBmaXggdGhlIGVudGl0eUlkIGZpZWxkIGFuZCBjb252ZXJ0IGl0IHRvIGEga25vd24gTWVzc2FnZS5cbiAgICAgICAgICAgICAgICAgICAgLy8gUFVUX05FVFdPUktfQ09NUE9ORU5UIC0+IFBVVF9DT01QT05FTlRcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRyYW5zZm9ybURhdGEgPSAnZGF0YScgaW4gbWVzc2FnZSA/IG1lc3NhZ2UuZGF0YSA6IG5ldyBVaW50OEFycmF5KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1OZWVkc0ZpeCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyZW50ID0gZmluZE5ldHdvcmtJZChOZXR3b3JrUGFyZW50LmdldChlbnRpdHlJZCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtRGF0YSA9IG5ldHdvcmtVdGlscy5maXhUcmFuc2Zvcm1QYXJlbnQobWVzc2FnZSwgVHJhbnNmb3JtLmdldChlbnRpdHlJZCksIHBhcmVudC5lbnRpdHlJZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbmV0d29ya1V0aWxzLm5ldHdvcmtNZXNzYWdlVG9Mb2NhbCh7IC4uLm1lc3NhZ2UsIGRhdGE6IHRyYW5zZm9ybURhdGEgfSwgZW50aXR5SWQsIGJ1ZmZlciwgdHJhbnNwb3J0QnVmZmVyKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gSXRlcmF0ZSB0aGUgbmV4dCBtZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBJZiBpdHMgYSBuZXR3b3JrIHRyYW5zcG9ydCBhbmQgaXRzIGEgUFVUX0NPTVBPTkVOVCB0aGF0IGhhcyBhIE5ldHdvcmtFbnRpdHkgY29tcG9uZW50LCB3ZSBuZWVkIHRvIHNlbmQgdGhpcyBtZXNzYWdlXG4gICAgICAgICAgICAgICAgLy8gdGhyb3VnaCBjb21tcyB3aXRoIHRoZSBFbnRpdHlJRCBhbmQgTmV0d29ya0lEIGZyb20gdGhlciBOZXR3b3JrRW50aXR5IHNvIGV2ZXJ5b25lIGNhbiByZWNpZXZlIHRoaXMgbWVzc2FnZSBhbmQgbWFwIHRvIHRoZWlyIGN1c3RvbSBlbnRpdHlJRC5cbiAgICAgICAgICAgICAgICBpZiAoaXNOZXR3b3JrVHJhbnNwb3J0ICYmICFuZXR3b3JrVXRpbHMuaXNOZXR3b3JrTWVzc2FnZShtZXNzYWdlKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXR3b3JrRGF0YSA9IE5ldHdvcmtFbnRpdHkuZ2V0T3JOdWxsKG1lc3NhZ2UuZW50aXR5SWQpO1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiBpdCBoYXMgbmV0d29ya0RhdGEgY29udmVydCB0aGUgbWVzc2FnZSB0byBQVVRfTkVUV09SS19DT01QT05FTlQuXG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXR3b3JrRGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV0d29ya1V0aWxzLmxvY2FsTWVzc2FnZVRvTmV0d29yayhtZXNzYWdlLCBuZXR3b3JrRGF0YSwgYnVmZmVyLCB0cmFuc3BvcnRCdWZmZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSXRlcmF0ZSB0aGUgbmV4dCBtZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBDb21tb24gbWVzc2FnZVxuICAgICAgICAgICAgICAgIHRyYW5zcG9ydEJ1ZmZlci53cml0ZUJ1ZmZlcihtZXNzYWdlLm1lc3NhZ2VCdWZmZXIsIGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB0cmFuc3BvcnRCdWZmZXIuY3VycmVudFdyaXRlT2Zmc2V0KCkgPyB0cmFuc3BvcnRCdWZmZXIudG9CaW5hcnkoKSA6IG5ldyBVaW50OEFycmF5KFtdKTtcbiAgICAgICAgICAgIGF3YWl0IHRyYW5zcG9ydC5zZW5kKG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBBZGQgYSB0cmFuc3BvcnQgdG8gdGhlIGNyZHQgc3lzdGVtXG4gICAgICovXG4gICAgZnVuY3Rpb24gYWRkVHJhbnNwb3J0KHRyYW5zcG9ydCkge1xuICAgICAgICBjb25zdCBpZCA9IHRyYW5zcG9ydHMucHVzaCh0cmFuc3BvcnQpIC0gMTtcbiAgICAgICAgdHJhbnNwb3J0Lm9ubWVzc2FnZSA9IHBhcnNlQ2h1bmtNZXNzYWdlKGlkKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc2VuZE1lc3NhZ2VzLFxuICAgICAgICByZWNlaXZlTWVzc2FnZXMsXG4gICAgICAgIGFkZFRyYW5zcG9ydFxuICAgIH07XG59XG4iLCAiZXhwb3J0IHZhciBDcmR0VXRpbHM7XG4oZnVuY3Rpb24gKENyZHRVdGlscykge1xuICAgIGxldCBTeW5jaHJvbml6ZWRFbnRpdHlUeXBlO1xuICAgIChmdW5jdGlvbiAoU3luY2hyb25pemVkRW50aXR5VHlwZSkge1xuICAgICAgICAvLyBzeW5jaHJvbml6ZXMgZW50aXRpZXMgd2l0aCB0aGUgTmV0d29ya1N5bmNocm9uaXplZCBjb21wb25lbnQgb25seSwgdXNlZCBmb3IgbmV0d29ya2VkIGdhbWVzXG4gICAgICAgIFN5bmNocm9uaXplZEVudGl0eVR5cGVbU3luY2hyb25pemVkRW50aXR5VHlwZVtcIk5FVFdPUktFRFwiXSA9IDBdID0gXCJORVRXT1JLRURcIjtcbiAgICAgICAgLy8gc3luY2hyb25pemVzIGVudGl0aWVzIG5lZWRlZCBieSB0aGUgcmVuZGVyZXJcbiAgICAgICAgU3luY2hyb25pemVkRW50aXR5VHlwZVtTeW5jaHJvbml6ZWRFbnRpdHlUeXBlW1wiUkVOREVSRVJcIl0gPSAxXSA9IFwiUkVOREVSRVJcIjtcbiAgICB9KShTeW5jaHJvbml6ZWRFbnRpdHlUeXBlID0gQ3JkdFV0aWxzLlN5bmNocm9uaXplZEVudGl0eVR5cGUgfHwgKENyZHRVdGlscy5TeW5jaHJvbml6ZWRFbnRpdHlUeXBlID0ge30pKTtcbn0pKENyZHRVdGlscyB8fCAoQ3JkdFV0aWxzID0ge30pKTtcbmV4cG9ydCBkZWZhdWx0IENyZHRVdGlscztcbi8qKlxuICogQ29tcGFyZSByYXcgZGF0YS5cbiAqIEBwdWJsaWNcbiAqIEByZXR1cm5zIDAgaWYgaXMgdGhlIHNhbWUgZGF0YSwgMSBpZiBhID4gYiwgLTEgaWYgYiA+IGFcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRhdGFDb21wYXJlKGEsIGIpIHtcbiAgICAvLyBBdCByZWZlcmVuY2UgbGV2ZWxcbiAgICBpZiAoYSA9PT0gYilcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgaWYgKGEgPT09IG51bGwgJiYgYiAhPT0gbnVsbClcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgIGlmIChhICE9PSBudWxsICYmIGIgPT09IG51bGwpXG4gICAgICAgIHJldHVybiAxO1xuICAgIGlmIChhIGluc3RhbmNlb2YgVWludDhBcnJheSAmJiBiIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgICAgICBjb25zdCBsZW5ndGhEaWZmZXJlbmNlID0gYS5ieXRlTGVuZ3RoIC0gYi5ieXRlTGVuZ3RoO1xuICAgICAgICBpZiAobGVuZ3RoRGlmZmVyZW5jZSAhPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGxlbmd0aERpZmZlcmVuY2UgPiAwID8gMSA6IC0xO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZXM7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBuID0gYS5ieXRlTGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgICByZXMgPSBhW2ldIC0gYltpXTtcbiAgICAgICAgICAgIGlmIChyZXMgIT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzID4gMCA/IDEgOiAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyB0aGUgZGF0YSBpcyBleGFjdGx5IHRoZSBzYW1lXG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvbnN0IGxlbmd0aERpZmZlcmVuY2UgPSBhLmxlbmd0aCAtIGIubGVuZ3RoO1xuICAgICAgICBpZiAobGVuZ3RoRGlmZmVyZW5jZSAhPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGxlbmd0aERpZmZlcmVuY2UgPiAwID8gMSA6IC0xO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhLmxvY2FsZUNvbXBhcmUoYik7XG4gICAgfVxuICAgIHJldHVybiBhID4gYiA/IDEgOiAtMTtcbn1cbiIsICIvKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVlcFJlYWRvbmx5KHZhbCkge1xuICAgIHJldHVybiBPYmplY3QuZnJlZXplKHsgLi4udmFsIH0pO1xufVxuIiwgImltcG9ydCB7IFJlYWRXcml0ZUJ5dGVCdWZmZXIgfSBmcm9tICcuLi9zZXJpYWxpemF0aW9uL0J5dGVCdWZmZXInO1xuaW1wb3J0IHsgUHJvY2Vzc01lc3NhZ2VSZXN1bHRUeXBlLCBDcmR0TWVzc2FnZVR5cGUsIFB1dENvbXBvbmVudE9wZXJhdGlvbiwgRGVsZXRlQ29tcG9uZW50IH0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbi9jcmR0JztcbmltcG9ydCB7IGRhdGFDb21wYXJlIH0gZnJvbSAnLi4vc3lzdGVtcy9jcmR0L3V0aWxzJztcbmltcG9ydCB7IGRlZXBSZWFkb25seSB9IGZyb20gJy4vcmVhZG9ubHknO1xuZXhwb3J0IGZ1bmN0aW9uIGluY3JlbWVudFRpbWVzdGFtcChlbnRpdHksIHRpbWVzdGFtcHMpIHtcbiAgICBjb25zdCBuZXdUaW1lc3RhbXAgPSAodGltZXN0YW1wcy5nZXQoZW50aXR5KSB8fCAwKSArIDE7XG4gICAgdGltZXN0YW1wcy5zZXQoZW50aXR5LCBuZXdUaW1lc3RhbXApO1xuICAgIHJldHVybiBuZXdUaW1lc3RhbXA7XG59XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRHVtcEx3d0Z1bmN0aW9uRnJvbUNyZHQoY29tcG9uZW50SWQsIHRpbWVzdGFtcHMsIHNjaGVtYSwgZGF0YSkge1xuICAgIHJldHVybiBmdW5jdGlvbiBkdW1wQ3JkdFN0YXRlKGJ1ZmZlciwgZmlsdGVyRW50aXR5KSB7XG4gICAgICAgIGZvciAoY29uc3QgW2VudGl0eSwgdGltZXN0YW1wXSBvZiB0aW1lc3RhbXBzKSB7XG4gICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgICAgICAgIGlmIChmaWx0ZXJFbnRpdHkpIHtcbiAgICAgICAgICAgICAgICAvLyBJIHN3ZWFyIHRoYXQgdGhpcyBpcyBiZWluZyB0ZXN0ZWQgb24gc3RhdGUtdG8tY3JkdC5zcGVjIGJ1dCBqZXN0IGlzIHRyb2xsaW5nIG1lXG4gICAgICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgICAgICAgICBpZiAoIWZpbHRlckVudGl0eShlbnRpdHkpKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICAgICAgICBpZiAoZGF0YS5oYXMoZW50aXR5KSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ID0gZGF0YS5nZXQoZW50aXR5KTtcbiAgICAgICAgICAgICAgICBjb25zdCBidWYgPSBuZXcgUmVhZFdyaXRlQnl0ZUJ1ZmZlcigpO1xuICAgICAgICAgICAgICAgIHNjaGVtYS5zZXJpYWxpemUoaXQsIGJ1Zik7XG4gICAgICAgICAgICAgICAgUHV0Q29tcG9uZW50T3BlcmF0aW9uLndyaXRlKGVudGl0eSwgdGltZXN0YW1wLCBjb21wb25lbnRJZCwgYnVmLnRvQmluYXJ5KCksIGJ1ZmZlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBEZWxldGVDb21wb25lbnQud3JpdGUoZW50aXR5LCBjb21wb25lbnRJZCwgdGltZXN0YW1wLCBidWZmZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVVcGRhdGVMd3dGcm9tQ3JkdChjb21wb25lbnRJZCwgdGltZXN0YW1wcywgc2NoZW1hLCBkYXRhKSB7XG4gICAgLyoqXG4gICAgICogUHJvY2VzcyB0aGUgcmVjZWl2ZWQgbWVzc2FnZSBvbmx5IGlmIHRoZSBsYW1wb3J0IG51bWJlciByZWNpZXZlZCBpcyBoaWdoZXJcbiAgICAgKiB0aGFuIHRoZSBzdG9yZWQgb25lLiBJZiBpdHMgbG93ZXIsIHdlIHNwcmVhZCBpdCB0byB0aGUgbmV0d29yayB0byBjb3JyZWN0IHRoZSBwZWVyLlxuICAgICAqIElmIHRoZXkgYXJlIGVxdWFsLCB0aGUgYmlnZ2VyIHJhdyBkYXRhIHdpbnMuXG4gIFxuICAgICAgKiBSZXR1cm5zIHRoZSByZWNpZXZlZCBkYXRhIGlmIHRoZSBsYW1wb3J0IG51bWJlciB3YXMgYmlnZ2VyIHRoYW4gb3Vycy5cbiAgICAgICogSWYgaXQgd2FzIGFuIG91dGRhdGVkIG1lc3NhZ2UsIHRoZW4gd2UgcmV0dXJuIHZvaWRcbiAgICAgICogQHB1YmxpY1xuICAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmR0UnVsZUZvckN1cnJlbnRTdGF0ZShtZXNzYWdlKSB7XG4gICAgICAgIGNvbnN0IHsgZW50aXR5SWQsIHRpbWVzdGFtcCB9ID0gbWVzc2FnZTtcbiAgICAgICAgY29uc3QgY3VycmVudFRpbWVzdGFtcCA9IHRpbWVzdGFtcHMuZ2V0KGVudGl0eUlkKTtcbiAgICAgICAgLy8gVGhlIHJlY2VpdmVkIG1lc3NhZ2UgaXMgPiB0aGFuIG91ciBjdXJyZW50IHZhbHVlLCB1cGRhdGUgb3VyIHN0YXRlLmNvbXBvbmVudHMuXG4gICAgICAgIGlmIChjdXJyZW50VGltZXN0YW1wID09PSB1bmRlZmluZWQgfHwgY3VycmVudFRpbWVzdGFtcCA8IHRpbWVzdGFtcCkge1xuICAgICAgICAgICAgcmV0dXJuIFByb2Nlc3NNZXNzYWdlUmVzdWx0VHlwZS5TdGF0ZVVwZGF0ZWRUaW1lc3RhbXA7XG4gICAgICAgIH1cbiAgICAgICAgLy8gT3V0ZGF0ZWQgTWVzc2FnZS4gUmVzZW5kIG91ciBzdGF0ZSBtZXNzYWdlIHRocm91Z2ggdGhlIHdpcmUuXG4gICAgICAgIGlmIChjdXJyZW50VGltZXN0YW1wID4gdGltZXN0YW1wKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnMicsIGN1cnJlbnRUaW1lc3RhbXAsIHRpbWVzdGFtcClcbiAgICAgICAgICAgIHJldHVybiBQcm9jZXNzTWVzc2FnZVJlc3VsdFR5cGUuU3RhdGVPdXRkYXRlZFRpbWVzdGFtcDtcbiAgICAgICAgfVxuICAgICAgICAvLyBEZWxldGVzIGFyZSBpZGVtcG90ZW50XG4gICAgICAgIGlmIChtZXNzYWdlLnR5cGUgPT09IENyZHRNZXNzYWdlVHlwZS5ERUxFVEVfQ09NUE9ORU5UICYmICFkYXRhLmhhcyhlbnRpdHlJZCkpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9jZXNzTWVzc2FnZVJlc3VsdFR5cGUuTm9DaGFuZ2VzO1xuICAgICAgICB9XG4gICAgICAgIGxldCBjdXJyZW50RGF0YUdyZWF0ZXIgPSAwO1xuICAgICAgICBpZiAoZGF0YS5oYXMoZW50aXR5SWQpKSB7XG4gICAgICAgICAgICBjb25zdCB3cml0ZUJ1ZmZlciA9IG5ldyBSZWFkV3JpdGVCeXRlQnVmZmVyKCk7XG4gICAgICAgICAgICBzY2hlbWEuc2VyaWFsaXplKGRhdGEuZ2V0KGVudGl0eUlkKSwgd3JpdGVCdWZmZXIpO1xuICAgICAgICAgICAgY3VycmVudERhdGFHcmVhdGVyID0gZGF0YUNvbXBhcmUod3JpdGVCdWZmZXIudG9CaW5hcnkoKSwgbWVzc2FnZS5kYXRhIHx8IG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY3VycmVudERhdGFHcmVhdGVyID0gZGF0YUNvbXBhcmUobnVsbCwgbWVzc2FnZS5kYXRhKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTYW1lIGRhdGEsIHNhbWUgdGltZXN0YW1wLiBXZWlyZG8gZWNobyBtZXNzYWdlLlxuICAgICAgICAvLyBjb25zb2xlLmxvZygnMycsIGN1cnJlbnREYXRhR3JlYXRlciwgd3JpdGVCdWZmZXIudG9CaW5hcnkoKSwgKG1lc3NhZ2UgYXMgYW55KS5kYXRhIHx8IG51bGwpXG4gICAgICAgIGlmIChjdXJyZW50RGF0YUdyZWF0ZXIgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9jZXNzTWVzc2FnZVJlc3VsdFR5cGUuTm9DaGFuZ2VzO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGN1cnJlbnREYXRhR3JlYXRlciA+IDApIHtcbiAgICAgICAgICAgIC8vIEN1cnJlbnQgZGF0YSBpcyBncmVhdGVyXG4gICAgICAgICAgICByZXR1cm4gUHJvY2Vzc01lc3NhZ2VSZXN1bHRUeXBlLlN0YXRlT3V0ZGF0ZWREYXRhO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gQ3VyZW50IGRhdGEgaXMgbG93ZXJcbiAgICAgICAgICAgIHJldHVybiBQcm9jZXNzTWVzc2FnZVJlc3VsdFR5cGUuU3RhdGVVcGRhdGVkRGF0YTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gKG1zZykgPT4ge1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICBpZiAobXNnLnR5cGUgIT09IENyZHRNZXNzYWdlVHlwZS5QVVRfQ09NUE9ORU5UICYmXG4gICAgICAgICAgICBtc2cudHlwZSAhPT0gQ3JkdE1lc3NhZ2VUeXBlLlBVVF9DT01QT05FTlRfTkVUV09SSyAmJlxuICAgICAgICAgICAgbXNnLnR5cGUgIT09IENyZHRNZXNzYWdlVHlwZS5ERUxFVEVfQ09NUE9ORU5UICYmXG4gICAgICAgICAgICBtc2cudHlwZSAhPT0gQ3JkdE1lc3NhZ2VUeXBlLkRFTEVURV9DT01QT05FTlRfTkVUV09SSylcbiAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgICAgICByZXR1cm4gW251bGwsIGRhdGEuZ2V0KG1zZy5lbnRpdHlJZCldO1xuICAgICAgICBjb25zdCBhY3Rpb24gPSBjcmR0UnVsZUZvckN1cnJlbnRTdGF0ZShtc2cpO1xuICAgICAgICBjb25zdCBlbnRpdHkgPSBtc2cuZW50aXR5SWQ7XG4gICAgICAgIHN3aXRjaCAoYWN0aW9uKSB7XG4gICAgICAgICAgICBjYXNlIFByb2Nlc3NNZXNzYWdlUmVzdWx0VHlwZS5TdGF0ZVVwZGF0ZWREYXRhOlxuICAgICAgICAgICAgY2FzZSBQcm9jZXNzTWVzc2FnZVJlc3VsdFR5cGUuU3RhdGVVcGRhdGVkVGltZXN0YW1wOiB7XG4gICAgICAgICAgICAgICAgdGltZXN0YW1wcy5zZXQoZW50aXR5LCBtc2cudGltZXN0YW1wKTtcbiAgICAgICAgICAgICAgICBpZiAobXNnLnR5cGUgPT09IENyZHRNZXNzYWdlVHlwZS5QVVRfQ09NUE9ORU5UIHx8IG1zZy50eXBlID09PSBDcmR0TWVzc2FnZVR5cGUuUFVUX0NPTVBPTkVOVF9ORVRXT1JLKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJ1ZiA9IG5ldyBSZWFkV3JpdGVCeXRlQnVmZmVyKG1zZy5kYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5zZXQoZW50aXR5LCBzY2hlbWEuZGVzZXJpYWxpemUoYnVmKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkYXRhLmRlbGV0ZShlbnRpdHkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gW251bGwsIGRhdGEuZ2V0KGVudGl0eSldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBQcm9jZXNzTWVzc2FnZVJlc3VsdFR5cGUuU3RhdGVPdXRkYXRlZFRpbWVzdGFtcDpcbiAgICAgICAgICAgIGNhc2UgUHJvY2Vzc01lc3NhZ2VSZXN1bHRUeXBlLlN0YXRlT3V0ZGF0ZWREYXRhOiB7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGEuaGFzKGVudGl0eSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgd3JpdGVCdWZmZXIgPSBuZXcgUmVhZFdyaXRlQnl0ZUJ1ZmZlcigpO1xuICAgICAgICAgICAgICAgICAgICBzY2hlbWEuc2VyaWFsaXplKGRhdGEuZ2V0KGVudGl0eSksIHdyaXRlQnVmZmVyKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBDcmR0TWVzc2FnZVR5cGUuUFVUX0NPTVBPTkVOVCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiB3cml0ZUJ1ZmZlci50b0JpbmFyeSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eUlkOiBlbnRpdHksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wOiB0aW1lc3RhbXBzLmdldChlbnRpdHkpXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5nZXQoZW50aXR5KVxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBDcmR0TWVzc2FnZVR5cGUuREVMRVRFX0NPTVBPTkVOVCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRpdHlJZDogZW50aXR5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogdGltZXN0YW1wcy5nZXQoZW50aXR5KVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW251bGwsIGRhdGEuZ2V0KGVudGl0eSldO1xuICAgIH07XG59XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlR2V0Q3JkdE1lc3NhZ2VzRm9yTHd3KGNvbXBvbmVudElkLCB0aW1lc3RhbXBzLCBkaXJ0eUl0ZXJhdG9yLCBzY2hlbWEsIGRhdGEpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24qICgpIHtcbiAgICAgICAgZm9yIChjb25zdCBlbnRpdHkgb2YgZGlydHlJdGVyYXRvcikge1xuICAgICAgICAgICAgY29uc3QgbmV3VGltZXN0YW1wID0gaW5jcmVtZW50VGltZXN0YW1wKGVudGl0eSwgdGltZXN0YW1wcyk7XG4gICAgICAgICAgICBpZiAoZGF0YS5oYXMoZW50aXR5KSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHdyaXRlQnVmZmVyID0gbmV3IFJlYWRXcml0ZUJ5dGVCdWZmZXIoKTtcbiAgICAgICAgICAgICAgICBzY2hlbWEuc2VyaWFsaXplKGRhdGEuZ2V0KGVudGl0eSksIHdyaXRlQnVmZmVyKTtcbiAgICAgICAgICAgICAgICBjb25zdCBtc2cgPSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IENyZHRNZXNzYWdlVHlwZS5QVVRfQ09NUE9ORU5ULFxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgZW50aXR5SWQ6IGVudGl0eSxcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogd3JpdGVCdWZmZXIudG9CaW5hcnkoKSxcbiAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wOiBuZXdUaW1lc3RhbXBcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHlpZWxkIG1zZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1zZyA9IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogQ3JkdE1lc3NhZ2VUeXBlLkRFTEVURV9DT01QT05FTlQsXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudElkLFxuICAgICAgICAgICAgICAgICAgICBlbnRpdHlJZDogZW50aXR5LFxuICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXA6IG5ld1RpbWVzdGFtcFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgeWllbGQgbXNnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGRpcnR5SXRlcmF0b3IuY2xlYXIoKTtcbiAgICB9O1xufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvbXBvbmVudERlZmluaXRpb25Gcm9tU2NoZW1hKGNvbXBvbmVudE5hbWUsIGNvbXBvbmVudElkLCBzY2hlbWEpIHtcbiAgICBjb25zdCBkYXRhID0gbmV3IE1hcCgpO1xuICAgIGNvbnN0IGRpcnR5SXRlcmF0b3IgPSBuZXcgU2V0KCk7XG4gICAgY29uc3QgdGltZXN0YW1wcyA9IG5ldyBNYXAoKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBnZXQgY29tcG9uZW50SWQoKSB7XG4gICAgICAgICAgICByZXR1cm4gY29tcG9uZW50SWQ7XG4gICAgICAgIH0sXG4gICAgICAgIGdldCBjb21wb25lbnROYW1lKCkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudE5hbWU7XG4gICAgICAgIH0sXG4gICAgICAgIGdldCBjb21wb25lbnRUeXBlKCkge1xuICAgICAgICAgICAgLy8gYSBnZXR0ZXIgaXMgdXNlZCBoZXJlIHRvIHByZXZlbnQgYWNjaWRlbnRhbCBjaGFuZ2VzXG4gICAgICAgICAgICByZXR1cm4gMCAvKiBDb21wb25lbnRUeXBlLkxhc3RXcml0ZVdpbkVsZW1lbnRTZXQgKi87XG4gICAgICAgIH0sXG4gICAgICAgIHNjaGVtYSxcbiAgICAgICAgaGFzKGVudGl0eSkge1xuICAgICAgICAgICAgcmV0dXJuIGRhdGEuaGFzKGVudGl0eSk7XG4gICAgICAgIH0sXG4gICAgICAgIGRlbGV0ZUZyb20oZW50aXR5LCBtYXJrQXNEaXJ0eSA9IHRydWUpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IGRhdGEuZ2V0KGVudGl0eSk7XG4gICAgICAgICAgICBpZiAoZGF0YS5kZWxldGUoZW50aXR5KSAmJiBtYXJrQXNEaXJ0eSkge1xuICAgICAgICAgICAgICAgIGRpcnR5SXRlcmF0b3IuYWRkKGVudGl0eSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29tcG9uZW50IHx8IG51bGw7XG4gICAgICAgIH0sXG4gICAgICAgIGVudGl0eURlbGV0ZWQoZW50aXR5LCBtYXJrQXNEaXJ0eSkge1xuICAgICAgICAgICAgaWYgKGRhdGEuZGVsZXRlKGVudGl0eSkgJiYgbWFya0FzRGlydHkpIHtcbiAgICAgICAgICAgICAgICBkaXJ0eUl0ZXJhdG9yLmFkZChlbnRpdHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBnZXRPck51bGwoZW50aXR5KSB7XG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnQgPSBkYXRhLmdldChlbnRpdHkpO1xuICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudCA/IGRlZXBSZWFkb25seShjb21wb25lbnQpIDogbnVsbDtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0KGVudGl0eSkge1xuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gZGF0YS5nZXQoZW50aXR5KTtcbiAgICAgICAgICAgIGlmICghY29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBbZ2V0RnJvbV0gQ29tcG9uZW50ICR7Y29tcG9uZW50TmFtZX0gZm9yIGVudGl0eSAjJHtlbnRpdHl9IG5vdCBmb3VuZGApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGRlZXBSZWFkb25seShjb21wb25lbnQpO1xuICAgICAgICB9LFxuICAgICAgICBjcmVhdGUoZW50aXR5LCB2YWx1ZSkge1xuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gZGF0YS5nZXQoZW50aXR5KTtcbiAgICAgICAgICAgIGlmIChjb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFtjcmVhdGVdIENvbXBvbmVudCAke2NvbXBvbmVudE5hbWV9IGZvciAke2VudGl0eX0gYWxyZWFkeSBleGlzdHNgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHVzZWRWYWx1ZSA9IHZhbHVlID09PSB1bmRlZmluZWQgPyBzY2hlbWEuY3JlYXRlKCkgOiBzY2hlbWEuZXh0ZW5kID8gc2NoZW1hLmV4dGVuZCh2YWx1ZSkgOiB2YWx1ZTtcbiAgICAgICAgICAgIGRhdGEuc2V0KGVudGl0eSwgdXNlZFZhbHVlKTtcbiAgICAgICAgICAgIGRpcnR5SXRlcmF0b3IuYWRkKGVudGl0eSk7XG4gICAgICAgICAgICByZXR1cm4gdXNlZFZhbHVlO1xuICAgICAgICB9LFxuICAgICAgICBjcmVhdGVPclJlcGxhY2UoZW50aXR5LCB2YWx1ZSkge1xuICAgICAgICAgICAgY29uc3QgdXNlZFZhbHVlID0gdmFsdWUgPT09IHVuZGVmaW5lZCA/IHNjaGVtYS5jcmVhdGUoKSA6IHNjaGVtYS5leHRlbmQgPyBzY2hlbWEuZXh0ZW5kKHZhbHVlKSA6IHZhbHVlO1xuICAgICAgICAgICAgZGF0YS5zZXQoZW50aXR5LCB1c2VkVmFsdWUpO1xuICAgICAgICAgICAgZGlydHlJdGVyYXRvci5hZGQoZW50aXR5KTtcbiAgICAgICAgICAgIHJldHVybiB1c2VkVmFsdWU7XG4gICAgICAgIH0sXG4gICAgICAgIGdldE11dGFibGVPck51bGwoZW50aXR5KSB7XG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnQgPSBkYXRhLmdldChlbnRpdHkpO1xuICAgICAgICAgICAgaWYgKCFjb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRpcnR5SXRlcmF0b3IuYWRkKGVudGl0eSk7XG4gICAgICAgICAgICByZXR1cm4gY29tcG9uZW50O1xuICAgICAgICB9LFxuICAgICAgICBnZXRPckNyZWF0ZU11dGFibGUoZW50aXR5LCB2YWx1ZSkge1xuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gZGF0YS5nZXQoZW50aXR5KTtcbiAgICAgICAgICAgIGlmICghY29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlKGVudGl0eSwgdmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZGlydHlJdGVyYXRvci5hZGQoZW50aXR5KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29tcG9uZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBnZXRNdXRhYmxlKGVudGl0eSkge1xuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5nZXRNdXRhYmxlT3JOdWxsKGVudGl0eSk7XG4gICAgICAgICAgICBpZiAoY29tcG9uZW50ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBbbXV0YWJsZV0gQ29tcG9uZW50ICR7Y29tcG9uZW50TmFtZX0gZm9yICR7ZW50aXR5fSBub3QgZm91bmRgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb21wb25lbnQ7XG4gICAgICAgIH0sXG4gICAgICAgICppdGVyYXRvcigpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW2VudGl0eSwgY29tcG9uZW50XSBvZiBkYXRhKSB7XG4gICAgICAgICAgICAgICAgeWllbGQgW2VudGl0eSwgY29tcG9uZW50XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgKmRpcnR5SXRlcmF0b3IoKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVudGl0eSBvZiBkaXJ0eUl0ZXJhdG9yKSB7XG4gICAgICAgICAgICAgICAgeWllbGQgZW50aXR5O1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBnZXRDcmR0VXBkYXRlczogY3JlYXRlR2V0Q3JkdE1lc3NhZ2VzRm9yTHd3KGNvbXBvbmVudElkLCB0aW1lc3RhbXBzLCBkaXJ0eUl0ZXJhdG9yLCBzY2hlbWEsIGRhdGEpLFxuICAgICAgICB1cGRhdGVGcm9tQ3JkdDogY3JlYXRlVXBkYXRlTHd3RnJvbUNyZHQoY29tcG9uZW50SWQsIHRpbWVzdGFtcHMsIHNjaGVtYSwgZGF0YSksXG4gICAgICAgIGR1bXBDcmR0U3RhdGVUb0J1ZmZlcjogY3JlYXRlRHVtcEx3d0Z1bmN0aW9uRnJvbUNyZHQoY29tcG9uZW50SWQsIHRpbWVzdGFtcHMsIHNjaGVtYSwgZGF0YSlcbiAgICB9O1xufVxuIiwgImV4cG9ydCBjb25zdCBTWVNURU1TX1JFR1VMQVJfUFJJT1JJVFkgPSAxMDBlMztcbmV4cG9ydCBmdW5jdGlvbiBTeXN0ZW1Db250YWluZXIoKSB7XG4gICAgY29uc3Qgc3lzdGVtcyA9IFtdO1xuICAgIGZ1bmN0aW9uIHNvcnQoKSB7XG4gICAgICAgIC8vIFRPRE86IHN5c3RlbXMgd2l0aCB0aGUgc2FtZSBwcmlvcml0eSBzaG91bGQgYWx3YXlzIGhhdmUgdGhlIHNhbWUgc3RhYmxlIG9yZGVyXG4gICAgICAgIC8vICAgICAgIGFkZCBhIFwiY291bnRlclwiIHRvIHRoZSBTeXN0ZW0gdHlwZSB0byBlbnN1cmUgdGhhdCBvcmRlclxuICAgICAgICBzeXN0ZW1zLnNvcnQoKGEsIGIpID0+IGIucHJpb3JpdHkgLSBhLnByaW9yaXR5KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gYWRkKGZuLCBwcmlvcml0eSwgbmFtZSkge1xuICAgICAgICBjb25zdCBzeXN0ZW1OYW1lID0gbmFtZSA/PyBmbi5uYW1lO1xuICAgICAgICBpZiAoc3lzdGVtcy5maW5kKChpdGVtKSA9PiBpdGVtLmZuID09PSBmbikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU3lzdGVtICR7SlNPTi5zdHJpbmdpZnkoc3lzdGVtTmFtZSl9IGFscmVhZHkgYWRkZWQgdG8gdGhlIGVuZ2luZWApO1xuICAgICAgICB9XG4gICAgICAgIHN5c3RlbXMucHVzaCh7XG4gICAgICAgICAgICBmbixcbiAgICAgICAgICAgIHByaW9yaXR5LFxuICAgICAgICAgICAgbmFtZTogc3lzdGVtTmFtZVxuICAgICAgICB9KTtcbiAgICAgICAgLy8gVE9ETzogcmVwbGFjZSB0aGlzIHNvcnQgYnkgYW4gaW5zZXJ0aW9uIGluIHRoZSByaWdodCBwbGFjZVxuICAgICAgICBzb3J0KCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlbW92ZShzZWxlY3Rvcikge1xuICAgICAgICBsZXQgaW5kZXggPSAtMTtcbiAgICAgICAgaWYgKHR5cGVvZiBzZWxlY3RvciA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGluZGV4ID0gc3lzdGVtcy5maW5kSW5kZXgoKGl0ZW0pID0+IGl0ZW0ubmFtZSA9PT0gc2VsZWN0b3IpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaW5kZXggPSBzeXN0ZW1zLmZpbmRJbmRleCgoaXRlbSkgPT4gaXRlbS5mbiA9PT0gc2VsZWN0b3IpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBzeXN0ZW1zLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIHNvcnQoKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGFkZCxcbiAgICAgICAgcmVtb3ZlLFxuICAgICAgICBnZXRTeXN0ZW1zKCkge1xuICAgICAgICAgICAgcmV0dXJuIHN5c3RlbXM7XG4gICAgICAgIH1cbiAgICB9O1xufVxuIiwgImltcG9ydCB7IFJlYWRXcml0ZUJ5dGVCdWZmZXIgfSBmcm9tICcuLi9zZXJpYWxpemF0aW9uL0J5dGVCdWZmZXInO1xuaW1wb3J0IHsgQXBwZW5kVmFsdWVPcGVyYXRpb24sIENyZHRNZXNzYWdlVHlwZSB9IGZyb20gJy4uL3NlcmlhbGl6YXRpb24vY3JkdCc7XG5pbXBvcnQgeyBfX0RFVl9fIH0gZnJvbSAnLi4vcnVudGltZS9pbnZhcmlhbnQnO1xuY29uc3QgZW1wdHlSZWFkb25seVNldCA9IGZyZWV6ZVNldChuZXcgU2V0KCkpO1xuZnVuY3Rpb24gZnJvemVuRXJyb3IoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgc2V0IGlzIGZyb3plbicpO1xufVxuZnVuY3Rpb24gZnJlZXplU2V0KHNldCkge1xuICAgIDtcbiAgICBzZXQuYWRkID0gZnJvemVuRXJyb3I7XG4gICAgc2V0LmNsZWFyID0gZnJvemVuRXJyb3I7XG4gICAgcmV0dXJuIHNldDtcbn1cbmZ1bmN0aW9uIHNvcnRCeVRpbWVzdGFtcChhLCBiKSB7XG4gICAgcmV0dXJuIGEudGltZXN0YW1wID4gYi50aW1lc3RhbXAgPyAxIDogLTE7XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVmFsdWVTZXRDb21wb25lbnREZWZpbml0aW9uRnJvbVNjaGVtYShjb21wb25lbnROYW1lLCBjb21wb25lbnRJZCwgc2NoZW1hLCBvcHRpb25zKSB7XG4gICAgY29uc3QgZGF0YSA9IG5ldyBNYXAoKTtcbiAgICBjb25zdCBkaXJ0eUl0ZXJhdG9yID0gbmV3IFNldCgpO1xuICAgIGNvbnN0IHF1ZXVlZENvbW1hbmRzID0gW107XG4gICAgLy8gb25seSBzb3J0IHRoZSBhcnJheSBpZiB0aGUgbGF0ZXN0IChOKSBlbGVtZW50IGhhcyBhIHRpbWVzdGFtcCA8PSBOLTFcbiAgICBmdW5jdGlvbiBzaG91bGRTb3J0KHJvdykge1xuICAgICAgICBjb25zdCBsZW4gPSByb3cucmF3Lmxlbmd0aDtcbiAgICAgICAgaWYgKGxlbiA+IDEgJiYgcm93LnJhd1tsZW4gLSAxXS50aW1lc3RhbXAgPD0gcm93LnJhd1tsZW4gLSAyXS50aW1lc3RhbXApIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ290VXBkYXRlZChlbnRpdHkpIHtcbiAgICAgICAgY29uc3Qgcm93ID0gZGF0YS5nZXQoZW50aXR5KTtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgaWYgKHJvdykge1xuICAgICAgICAgICAgaWYgKHNob3VsZFNvcnQocm93KSkge1xuICAgICAgICAgICAgICAgIHJvdy5yYXcuc29ydChzb3J0QnlUaW1lc3RhbXApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2hpbGUgKHJvdy5yYXcubGVuZ3RoID4gb3B0aW9ucy5tYXhFbGVtZW50cykge1xuICAgICAgICAgICAgICAgIHJvdy5yYXcuc2hpZnQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGZyb3plblNldCA9IGZyZWV6ZVNldChuZXcgU2V0KHJvdz8ucmF3Lm1hcCgoJCkgPT4gJC52YWx1ZSkpKTtcbiAgICAgICAgICAgIHJvdy5mcm96ZW5TZXQgPSBmcm96ZW5TZXQ7XG4gICAgICAgICAgICByZXR1cm4gZnJvemVuU2V0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgICAgIHJldHVybiBlbXB0eVJlYWRvbmx5U2V0O1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGFwcGVuZChlbnRpdHksIHZhbHVlKSB7XG4gICAgICAgIGxldCByb3cgPSBkYXRhLmdldChlbnRpdHkpO1xuICAgICAgICBpZiAoIXJvdykge1xuICAgICAgICAgICAgcm93ID0geyByYXc6IFtdLCBmcm96ZW5TZXQ6IGVtcHR5UmVhZG9ubHlTZXQgfTtcbiAgICAgICAgICAgIGRhdGEuc2V0KGVudGl0eSwgcm93KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1c2VkVmFsdWUgPSBzY2hlbWEuZXh0ZW5kID8gc2NoZW1hLmV4dGVuZCh2YWx1ZSkgOiB2YWx1ZTtcbiAgICAgICAgY29uc3QgdGltZXN0YW1wID0gb3B0aW9ucy50aW1lc3RhbXBGdW5jdGlvbih1c2VkVmFsdWUpO1xuICAgICAgICBpZiAoX19ERVZfXykge1xuICAgICAgICAgICAgLy8gb25seSBmcmVlemUgdGhlIG9iamVjdHMgaW4gZGV2IG1vZGUgdG8gd2FybiB0aGUgZGV2ZWxvcGVycyBiZWNhdXNlXG4gICAgICAgICAgICAvLyBpdCBpcyBhbiBleHBlbnNpdmUgb3BlcmF0aW9uXG4gICAgICAgICAgICBPYmplY3QuZnJlZXplKHVzZWRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcm93LnJhdy5wdXNoKHsgdmFsdWU6IHVzZWRWYWx1ZSwgdGltZXN0YW1wIH0pO1xuICAgICAgICByZXR1cm4geyBzZXQ6IGdvdFVwZGF0ZWQoZW50aXR5KSwgdmFsdWU6IHVzZWRWYWx1ZSB9O1xuICAgIH1cbiAgICBjb25zdCByZXQgPSB7XG4gICAgICAgIGdldCBjb21wb25lbnRJZCgpIHtcbiAgICAgICAgICAgIHJldHVybiBjb21wb25lbnRJZDtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0IGNvbXBvbmVudE5hbWUoKSB7XG4gICAgICAgICAgICByZXR1cm4gY29tcG9uZW50TmFtZTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0IGNvbXBvbmVudFR5cGUoKSB7XG4gICAgICAgICAgICAvLyBhIGdldHRlciBpcyB1c2VkIGhlcmUgdG8gcHJldmVudCBhY2NpZGVudGFsIGNoYW5nZXNcbiAgICAgICAgICAgIHJldHVybiAxIC8qIENvbXBvbmVudFR5cGUuR3Jvd09ubHlWYWx1ZVNldCAqLztcbiAgICAgICAgfSxcbiAgICAgICAgc2NoZW1hLFxuICAgICAgICBoYXMoZW50aXR5KSB7XG4gICAgICAgICAgICByZXR1cm4gZGF0YS5oYXMoZW50aXR5KTtcbiAgICAgICAgfSxcbiAgICAgICAgZW50aXR5RGVsZXRlZChlbnRpdHkpIHtcbiAgICAgICAgICAgIGRhdGEuZGVsZXRlKGVudGl0eSk7XG4gICAgICAgIH0sXG4gICAgICAgIGdldChlbnRpdHkpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IGRhdGEuZ2V0KGVudGl0eSk7XG4gICAgICAgICAgICBpZiAodmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlcy5mcm96ZW5TZXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW1wdHlSZWFkb25seVNldDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgYWRkVmFsdWUoZW50aXR5LCByYXdWYWx1ZSkge1xuICAgICAgICAgICAgY29uc3QgeyBzZXQsIHZhbHVlIH0gPSBhcHBlbmQoZW50aXR5LCByYXdWYWx1ZSk7XG4gICAgICAgICAgICBkaXJ0eUl0ZXJhdG9yLmFkZChlbnRpdHkpO1xuICAgICAgICAgICAgY29uc3QgYnVmID0gbmV3IFJlYWRXcml0ZUJ5dGVCdWZmZXIoKTtcbiAgICAgICAgICAgIHNjaGVtYS5zZXJpYWxpemUodmFsdWUsIGJ1Zik7XG4gICAgICAgICAgICBxdWV1ZWRDb21tYW5kcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnRJZCxcbiAgICAgICAgICAgICAgICBkYXRhOiBidWYudG9CaW5hcnkoKSxcbiAgICAgICAgICAgICAgICBlbnRpdHlJZDogZW50aXR5LFxuICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogMCxcbiAgICAgICAgICAgICAgICB0eXBlOiBDcmR0TWVzc2FnZVR5cGUuQVBQRU5EX1ZBTFVFXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBzZXQ7XG4gICAgICAgIH0sXG4gICAgICAgICppdGVyYXRvcigpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW2VudGl0eSwgY29tcG9uZW50XSBvZiBkYXRhKSB7XG4gICAgICAgICAgICAgICAgeWllbGQgW2VudGl0eSwgY29tcG9uZW50LmZyb3plblNldF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgICpkaXJ0eUl0ZXJhdG9yKCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBlbnRpdHkgb2YgZGlydHlJdGVyYXRvcikge1xuICAgICAgICAgICAgICAgIHlpZWxkIGVudGl0eTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZ2V0Q3JkdFVwZGF0ZXMoKSB7XG4gICAgICAgICAgICAvLyByZXR1cm4gYSBjb3B5IG9mIHRoZSBjb21tYW5kcywgYW5kIHRoZW4gY2xlYXIgdGhlIGxvY2FsIGNvcHlcbiAgICAgICAgICAgIGRpcnR5SXRlcmF0b3IuY2xlYXIoKTtcbiAgICAgICAgICAgIHJldHVybiBxdWV1ZWRDb21tYW5kcy5zcGxpY2UoMCwgcXVldWVkQ29tbWFuZHMubGVuZ3RoKTtcbiAgICAgICAgfSxcbiAgICAgICAgdXBkYXRlRnJvbUNyZHQoX2JvZHkpIHtcbiAgICAgICAgICAgIGlmIChfYm9keS50eXBlID09PSBDcmR0TWVzc2FnZVR5cGUuQVBQRU5EX1ZBTFVFKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYnVmID0gbmV3IFJlYWRXcml0ZUJ5dGVCdWZmZXIoX2JvZHkuZGF0YSk7XG4gICAgICAgICAgICAgICAgYXBwZW5kKF9ib2R5LmVudGl0eUlkLCBzY2hlbWEuZGVzZXJpYWxpemUoYnVmKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gW251bGwsIHVuZGVmaW5lZF07XG4gICAgICAgIH0sXG4gICAgICAgIGR1bXBDcmR0U3RhdGVUb0J1ZmZlcjogZnVuY3Rpb24gKGJ1ZmZlciwgZmlsdGVyRW50aXR5KSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtlbnRpdHksIHsgcmF3IH1dIG9mIGRhdGEpIHtcbiAgICAgICAgICAgICAgICBpZiAoZmlsdGVyRW50aXR5ICYmICFmaWx0ZXJFbnRpdHkoZW50aXR5KSlcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBpdCBvZiByYXcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYnVmID0gbmV3IFJlYWRXcml0ZUJ5dGVCdWZmZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgc2NoZW1hLnNlcmlhbGl6ZShpdC52YWx1ZSwgYnVmKTtcbiAgICAgICAgICAgICAgICAgICAgQXBwZW5kVmFsdWVPcGVyYXRpb24ud3JpdGUoZW50aXR5LCAwLCBjb21wb25lbnRJZCwgYnVmLnRvQmluYXJ5KCksIGJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gcmV0O1xufVxuIiwgImltcG9ydCAqIGFzIGNvbXBvbmVudHMgZnJvbSAnLi4vLi4vY29tcG9uZW50cyc7XG5mdW5jdGlvbiogZ2VuRW50aXR5VHJlZShlbnRpdHksIGVudGl0aWVzKSB7XG4gICAgLy8gVGhpcyBhdm9pZCBpbmZpbml0ZSBsb29wIHdoZW4gdGhlcmUgaXMgYSBjeWNsaWMgcGFyZW50aW5nXG4gICAgaWYgKCFlbnRpdGllcy5oYXMoZW50aXR5KSlcbiAgICAgICAgcmV0dXJuO1xuICAgIGVudGl0aWVzLmRlbGV0ZShlbnRpdHkpO1xuICAgIGZvciAoY29uc3QgW19lbnRpdHksIHZhbHVlXSBvZiBlbnRpdGllcykge1xuICAgICAgICBpZiAodmFsdWUucGFyZW50ID09PSBlbnRpdHkpIHtcbiAgICAgICAgICAgIHlpZWxkKiBnZW5FbnRpdHlUcmVlKF9lbnRpdHksIGVudGl0aWVzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB5aWVsZCBlbnRpdHk7XG59XG4vKipcbiAqIEdldCBhbiBpdGVyYXRvciBvZiBlbnRpdGllcyB0aGF0IGZvbGxvdyBhIHRyZWUgc3RydWN0dXJlIGZvciBhIGNvbXBvbmVudFxuICogQHB1YmxpY1xuICogQHBhcmFtIGVuZ2luZSAtIHRoZSBlbmdpbmUgcnVubmluZyB0aGUgZW50aXRpZXNcbiAqIEBwYXJhbSBlbnRpdHkgLSB0aGUgcm9vdCBlbnRpdHkgb2YgdGhlIHRyZWVcbiAqIEBwYXJhbSBjb21wb25lbnQgLSB0aGUgcGFyZW50aW5nIGNvbXBvbmVudCB0byBmaWx0ZXIgYnlcbiAqIEByZXR1cm5zIEFuIGl0ZXJhdG9yIG9mIGFuIGFycmF5IGFzIFtlbnRpdHksIGVudGl0eTIsIC4uLl1cbiAqXG4gKiBFeGFtcGxlOlxuICogYGBgdHNcbiAqIGNvbnN0IFRyZWVDb21wb25lbnQgPSBlbmdpbmUuZGVmaW5lQ29tcG9uZW50KCdjdXN0b206OlRyZWVDb21wb25lbnQnLCB7XG4gKiAgICBsYWJlbDogU2NoZW1hcy5TdHJpbmcsXG4gKiAgICBwYXJlbnQ6IFNjaGVtYXMuRW50aXR5XG4gKiB9KVxuICpcbiAqIGZvciAoY29uc3QgZW50aXR5IG9mIGdldENvbXBvbmVudEVudGl0eVRyZWUoZW5naW5lLCBlbnRpdHksIFRyZWVDb21wb25lbnQpKSB7XG4gKiAgICAvLyBlbnRpdHkgaW4gdGhlIHRyZWVcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29tcG9uZW50RW50aXR5VHJlZShlbmdpbmUsIGVudGl0eSwgY29tcG9uZW50KSB7XG4gICAgY29uc3QgZW50aXRpZXMgPSBuZXcgTWFwKGVuZ2luZS5nZXRFbnRpdGllc1dpdGgoY29tcG9uZW50KSk7XG4gICAgcmV0dXJuIGdlbkVudGl0eVRyZWUoZW50aXR5LCBlbnRpdGllcyk7XG59XG4vLyBJIHN3ZWFyIGJ5IGFsbCB0aGUgZ29kcyB0aGF0IHRoaXMgaXMgYmVpbmcgdGVzdGVkIG9uIHRlc3Qvc2RrL25ldHdvcmsvc3luYy1lbmdpbmVzLnNwZWMudHNcbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5mdW5jdGlvbiByZW1vdmVOZXR3b3JrRW50aXR5Q2hpbGRyZW5zKGVuZ2luZSwgcGFyZW50KSB7XG4gICAgY29uc3QgTmV0d29ya1BhcmVudCA9IGNvbXBvbmVudHMuTmV0d29ya1BhcmVudChlbmdpbmUpO1xuICAgIGNvbnN0IE5ldHdvcmtFbnRpdHkgPSBjb21wb25lbnRzLk5ldHdvcmtFbnRpdHkoZW5naW5lKTtcbiAgICAvLyBSZW1vdmUgcGFyZW50XG4gICAgZW5naW5lLnJlbW92ZUVudGl0eShwYXJlbnQpO1xuICAgIC8vIFJlbW92ZSBjaGlsZHNcbiAgICBjb25zdCBuZXR3b3JrID0gTmV0d29ya0VudGl0eS5nZXRPck51bGwocGFyZW50KTtcbiAgICBpZiAobmV0d29yaykge1xuICAgICAgICBmb3IgKGNvbnN0IFtlbnRpdHksIHBhcmVudF0gb2YgZW5naW5lLmdldEVudGl0aWVzV2l0aChOZXR3b3JrUGFyZW50KSkge1xuICAgICAgICAgICAgaWYgKHBhcmVudC5lbnRpdHlJZCA9PT0gbmV0d29yay5lbnRpdHlJZCAmJiBwYXJlbnQubmV0d29ya0lkID09PSBuZXR3b3JrLm5ldHdvcmtJZCkge1xuICAgICAgICAgICAgICAgIHJlbW92ZU5ldHdvcmtFbnRpdHlDaGlsZHJlbnMoZW5naW5lLCBlbnRpdHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybjtcbn1cbi8qKlxuICogUmVtb3ZlIGFsbCBjb21wb25lbnRzIG9mIGVhY2ggZW50aXR5IGluIHRoZSB0cmVlIG1hZGUgd2l0aCBUcmFuc2Zvcm0gcGFyZW50aW5nXG4gKiBAcGFyYW0gZW5naW5lIC0gdGhlIGVuZ2luZSBydW5uaW5nIHRoZSBlbnRpdGllc1xuICogQHBhcmFtIGZpcnN0RW50aXR5IC0gdGhlIHJvb3QgZW50aXR5IG9mIHRoZSB0cmVlXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVFbnRpdHlXaXRoQ2hpbGRyZW4oZW5naW5lLCBlbnRpdHkpIHtcbiAgICBjb25zdCBUcmFuc2Zvcm0gPSBjb21wb25lbnRzLlRyYW5zZm9ybShlbmdpbmUpO1xuICAgIGNvbnN0IE5ldHdvcmtFbnRpdHkgPSBjb21wb25lbnRzLk5ldHdvcmtFbnRpdHkoZW5naW5lKTtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoTmV0d29ya0VudGl0eS5oYXMoZW50aXR5KSkge1xuICAgICAgICByZXR1cm4gcmVtb3ZlTmV0d29ya0VudGl0eUNoaWxkcmVucyhlbmdpbmUsIGVudGl0eSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgZW50IG9mIGdldENvbXBvbmVudEVudGl0eVRyZWUoZW5naW5lLCBlbnRpdHksIFRyYW5zZm9ybSkpIHtcbiAgICAgICAgZW5naW5lLnJlbW92ZUVudGl0eShlbnQpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgKiBhcyBjb21wb25lbnRzIGZyb20gJy4uL2NvbXBvbmVudHMnO1xuY29uc3QgSW5wdXRDb21tYW5kcyA9IFtcbiAgICAwIC8qIElucHV0QWN0aW9uLklBX1BPSU5URVIgKi8sXG4gICAgMSAvKiBJbnB1dEFjdGlvbi5JQV9QUklNQVJZICovLFxuICAgIDIgLyogSW5wdXRBY3Rpb24uSUFfU0VDT05EQVJZICovLFxuICAgIDQgLyogSW5wdXRBY3Rpb24uSUFfRk9SV0FSRCAqLyxcbiAgICA1IC8qIElucHV0QWN0aW9uLklBX0JBQ0tXQVJEICovLFxuICAgIDYgLyogSW5wdXRBY3Rpb24uSUFfUklHSFQgKi8sXG4gICAgNyAvKiBJbnB1dEFjdGlvbi5JQV9MRUZUICovLFxuICAgIDggLyogSW5wdXRBY3Rpb24uSUFfSlVNUCAqLyxcbiAgICA5IC8qIElucHV0QWN0aW9uLklBX1dBTEsgKi8sXG4gICAgMTAgLyogSW5wdXRBY3Rpb24uSUFfQUNUSU9OXzMgKi8sXG4gICAgMTEgLyogSW5wdXRBY3Rpb24uSUFfQUNUSU9OXzQgKi8sXG4gICAgMTIgLyogSW5wdXRBY3Rpb24uSUFfQUNUSU9OXzUgKi8sXG4gICAgMTMgLyogSW5wdXRBY3Rpb24uSUFfQUNUSU9OXzYgKi9cbl07XG5jb25zdCBJbnB1dFN0YXRlVXBkYXRlU3lzdGVtUHJpb3JpdHkgPSAxIDw8IDIwO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUlucHV0U3lzdGVtKGVuZ2luZSkge1xuICAgIGNvbnN0IFBvaW50ZXJFdmVudHNSZXN1bHQgPSBjb21wb25lbnRzLlBvaW50ZXJFdmVudHNSZXN1bHQoZW5naW5lKTtcbiAgICBjb25zdCBnbG9iYWxTdGF0ZSA9IHtcbiAgICAgICAgcHJldmlvdXNGcmFtZU1heFRpbWVzdGFtcDogMCxcbiAgICAgICAgY3VycmVudEZyYW1lTWF4VGltZXN0YW1wOiAwLFxuICAgICAgICBidXR0b25TdGF0ZTogbmV3IE1hcCgpLFxuICAgICAgICB0aGlzRnJhbWVDb21tYW5kczogW11cbiAgICB9O1xuICAgIGZ1bmN0aW9uIGZpbmRMYXN0QWN0aW9uKHBvaW50ZXJFdmVudFR5cGUsIGlucHV0QWN0aW9uLCBlbnRpdHkpIHtcbiAgICAgICAgY29uc3QgYXNjZW5kaW5nVGltZXN0YW1wSXRlcmF0b3IgPSBQb2ludGVyRXZlbnRzUmVzdWx0LmdldChlbnRpdHkpO1xuICAgICAgICBmb3IgKGNvbnN0IGNvbW1hbmQgb2YgQXJyYXkuZnJvbShhc2NlbmRpbmdUaW1lc3RhbXBJdGVyYXRvcikucmV2ZXJzZSgpKSB7XG4gICAgICAgICAgICBpZiAoY29tbWFuZC5idXR0b24gPT09IGlucHV0QWN0aW9uICYmIGNvbW1hbmQuc3RhdGUgPT09IHBvaW50ZXJFdmVudFR5cGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29tbWFuZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiogZmluZENvbW1hbmRzQnlBY3Rpb25EZXNjZW5kaW5nKGlucHV0QWN0aW9uLCBlbnRpdHkpIHtcbiAgICAgICAgY29uc3QgYXNjZW5kaW5nVGltZXN0YW1wSXRlcmF0b3IgPSBQb2ludGVyRXZlbnRzUmVzdWx0LmdldChlbnRpdHkpO1xuICAgICAgICBmb3IgKGNvbnN0IGNvbW1hbmQgb2YgQXJyYXkuZnJvbShhc2NlbmRpbmdUaW1lc3RhbXBJdGVyYXRvcikucmV2ZXJzZSgpKSB7XG4gICAgICAgICAgICBpZiAoY29tbWFuZC5idXR0b24gPT09IGlucHV0QWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgeWllbGQgY29tbWFuZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBidXR0b25TdGF0ZVVwZGF0ZVN5c3RlbSgpIHtcbiAgICAgICAgLy8gZmlyc3Qgc3RvcmUgdGhlIHByZXZpb3VzJyBmcmFtZSB0aW1lc3RhbXBcbiAgICAgICAgbGV0IG1heFRpbWVzdGFtcCA9IGdsb2JhbFN0YXRlLmN1cnJlbnRGcmFtZU1heFRpbWVzdGFtcDtcbiAgICAgICAgZ2xvYmFsU3RhdGUucHJldmlvdXNGcmFtZU1heFRpbWVzdGFtcCA9IG1heFRpbWVzdGFtcDtcbiAgICAgICAgaWYgKGdsb2JhbFN0YXRlLnRoaXNGcmFtZUNvbW1hbmRzLmxlbmd0aCkge1xuICAgICAgICAgICAgZ2xvYmFsU3RhdGUudGhpc0ZyYW1lQ29tbWFuZHMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICAvLyB0aGVuIGl0ZXJhdGUgb3ZlciBhbGwgbmV3IGNvbW1hbmRzXG4gICAgICAgIGZvciAoY29uc3QgWywgY29tbWFuZHNdIG9mIGVuZ2luZS5nZXRFbnRpdGllc1dpdGgoUG9pbnRlckV2ZW50c1Jlc3VsdCkpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IGFkYXB0IHRoZSBnc2V0IGNvbXBvbmVudCB0byBoYXZlIGEgY2FjaGVkIFwicmV2ZXJzZWRcIiBvcHRpb24gYnkgZGVmYXVsdFxuICAgICAgICAgICAgY29uc3QgYXJyYXlDb21tYW5kcyA9IEFycmF5LmZyb20oY29tbWFuZHMpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IGFycmF5Q29tbWFuZHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb21tYW5kID0gYXJyYXlDb21tYW5kc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoY29tbWFuZC50aW1lc3RhbXAgPiBtYXhUaW1lc3RhbXApIHtcbiAgICAgICAgICAgICAgICAgICAgbWF4VGltZXN0YW1wID0gY29tbWFuZC50aW1lc3RhbXA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjb21tYW5kLnRpbWVzdGFtcCA+IGdsb2JhbFN0YXRlLnByZXZpb3VzRnJhbWVNYXhUaW1lc3RhbXApIHtcbiAgICAgICAgICAgICAgICAgICAgZ2xvYmFsU3RhdGUudGhpc0ZyYW1lQ29tbWFuZHMucHVzaChjb21tYW5kKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGNvbW1hbmQuc3RhdGUgPT09IDAgLyogUG9pbnRlckV2ZW50VHlwZS5QRVRfVVAgKi8gfHwgY29tbWFuZC5zdGF0ZSA9PT0gMSAvKiBQb2ludGVyRXZlbnRUeXBlLlBFVF9ET1dOICovKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByZXZDb21tYW5kID0gZ2xvYmFsU3RhdGUuYnV0dG9uU3RhdGUuZ2V0KGNvbW1hbmQuYnV0dG9uKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwcmV2Q29tbWFuZCB8fCBjb21tYW5kLnRpbWVzdGFtcCA+IHByZXZDb21tYW5kLnRpbWVzdGFtcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsU3RhdGUuYnV0dG9uU3RhdGUuc2V0KGNvbW1hbmQuYnV0dG9uLCBjb21tYW5kKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpbmNlIHdlIGFyZSBpdGVyYXRpbmcgYSBkZXNjZW5kaW5nIGFycmF5LCB3ZSBjYW4gZWFybHkgZmluaXNoIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9vcFxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gdXBkYXRlIGN1cnJlbnQgZnJhbWUncyBtYXggdGltZXN0YW1wXG4gICAgICAgIGdsb2JhbFN0YXRlLmN1cnJlbnRGcmFtZU1heFRpbWVzdGFtcCA9IG1heFRpbWVzdGFtcDtcbiAgICB9XG4gICAgZW5naW5lLmFkZFN5c3RlbShidXR0b25TdGF0ZVVwZGF0ZVN5c3RlbSwgSW5wdXRTdGF0ZVVwZGF0ZVN5c3RlbVByaW9yaXR5LCAnQGRjbC9lY3MjaW5wdXRTeXN0ZW0nKTtcbiAgICBmdW5jdGlvbiB0aW1lc3RhbXBJc0N1cnJlbnRGcmFtZSh0aW1lc3RhbXApIHtcbiAgICAgICAgaWYgKHRpbWVzdGFtcCA+IGdsb2JhbFN0YXRlLnByZXZpb3VzRnJhbWVNYXhUaW1lc3RhbXAgJiYgdGltZXN0YW1wIDw9IGdsb2JhbFN0YXRlLmN1cnJlbnRGcmFtZU1heFRpbWVzdGFtcCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0Q2xpY2soaW5wdXRBY3Rpb24sIGVudGl0eSkge1xuICAgICAgICBpZiAoaW5wdXRBY3Rpb24gIT09IDMgLyogSW5wdXRBY3Rpb24uSUFfQU5ZICovKSB7XG4gICAgICAgICAgICByZXR1cm4gZmluZENsaWNrKGlucHV0QWN0aW9uLCBlbnRpdHkpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgaW5wdXQgb2YgSW5wdXRDb21tYW5kcykge1xuICAgICAgICAgICAgY29uc3QgY21kID0gZmluZENsaWNrKGlucHV0LCBlbnRpdHkpO1xuICAgICAgICAgICAgaWYgKGNtZClcbiAgICAgICAgICAgICAgICByZXR1cm4gY21kO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBmdW5jdGlvbiBmaW5kQ2xpY2soaW5wdXRBY3Rpb24sIGVudGl0eSkge1xuICAgICAgICBsZXQgZG93biA9IG51bGw7XG4gICAgICAgIGxldCB1cCA9IG51bGw7XG4gICAgICAgIC8vIFdlIHNlYXJjaCB0aGUgbGFzdCBVUCAmIERPV04gY29tbWFuZCBzb3J0ZWQgYnkgdGltZXN0YW1wIGRlc2NlbmRpbmdcbiAgICAgICAgZm9yIChjb25zdCBpdCBvZiBmaW5kQ29tbWFuZHNCeUFjdGlvbkRlc2NlbmRpbmcoaW5wdXRBY3Rpb24sIGVudGl0eSkpIHtcbiAgICAgICAgICAgIGlmICghdXApIHtcbiAgICAgICAgICAgICAgICBpZiAoaXQuc3RhdGUgPT09IDAgLyogUG9pbnRlckV2ZW50VHlwZS5QRVRfVVAgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgdXAgPSBpdDtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoIWRvd24pIHtcbiAgICAgICAgICAgICAgICBpZiAoaXQuc3RhdGUgPT09IDEgLyogUG9pbnRlckV2ZW50VHlwZS5QRVRfRE9XTiAqLykge1xuICAgICAgICAgICAgICAgICAgICBkb3duID0gaXQ7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIXVwIHx8ICFkb3duKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIC8vIElmIHRoZSBET1dOIGNvbW1hbmQgaGFzIGhhcHBlbiBiZWZvcmUgdGhlIFVQIGNvbW1hbmRzLCBpdCBtZWFucyB0aGF0IHRoYXQgYSBjbGlja2VkIGhhcyBoYXBwZW5cbiAgICAgICAgaWYgKGRvd24udGltZXN0YW1wIDwgdXAudGltZXN0YW1wICYmIHRpbWVzdGFtcElzQ3VycmVudEZyYW1lKHVwLnRpbWVzdGFtcCkpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHVwLCBkb3duIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldElucHV0Q29tbWFuZEZyb21FbnRpdHkoaW5wdXRBY3Rpb24sIHBvaW50ZXJFdmVudFR5cGUsIGVudGl0eSkge1xuICAgICAgICBpZiAoaW5wdXRBY3Rpb24gIT09IDMgLyogSW5wdXRBY3Rpb24uSUFfQU5ZICovKSB7XG4gICAgICAgICAgICByZXR1cm4gZmluZElucHV0Q29tbWFuZChpbnB1dEFjdGlvbiwgcG9pbnRlckV2ZW50VHlwZSwgZW50aXR5KTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGlucHV0IG9mIElucHV0Q29tbWFuZHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGNtZCA9IGZpbmRJbnB1dENvbW1hbmQoaW5wdXQsIHBvaW50ZXJFdmVudFR5cGUsIGVudGl0eSk7XG4gICAgICAgICAgICBpZiAoY21kKVxuICAgICAgICAgICAgICAgIHJldHVybiBjbWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldElucHV0Q29tbWFuZChpbnB1dEFjdGlvbiwgcG9pbnRlckV2ZW50VHlwZSwgZW50aXR5KSB7XG4gICAgICAgIGlmIChlbnRpdHkpIHtcbiAgICAgICAgICAgIHJldHVybiBnZXRJbnB1dENvbW1hbmRGcm9tRW50aXR5KGlucHV0QWN0aW9uLCBwb2ludGVyRXZlbnRUeXBlLCBlbnRpdHkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZm9yIChjb25zdCBjb21tYW5kIG9mIGdsb2JhbFN0YXRlLnRoaXNGcmFtZUNvbW1hbmRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKChjb21tYW5kLmJ1dHRvbiA9PT0gaW5wdXRBY3Rpb24gfHwgaW5wdXRBY3Rpb24gPT09IDMgLyogSW5wdXRBY3Rpb24uSUFfQU5ZICovKSAmJlxuICAgICAgICAgICAgICAgICAgICBjb21tYW5kLnN0YXRlID09PSBwb2ludGVyRXZlbnRUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21tYW5kO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGZpbmRJbnB1dENvbW1hbmQoaW5wdXRBY3Rpb24sIHBvaW50ZXJFdmVudFR5cGUsIGVudGl0eSkge1xuICAgICAgICAvLyBXZSBzZWFyY2ggdGhlIGxhc3QgcG9pbnRlciBFdmVudCBjb21tYW5kIHNvcnRlZCBieSB0aW1lc3RhbXBcbiAgICAgICAgY29uc3QgY29tbWFuZCA9IGZpbmRMYXN0QWN0aW9uKHBvaW50ZXJFdmVudFR5cGUsIGlucHV0QWN0aW9uLCBlbnRpdHkpO1xuICAgICAgICBpZiAoIWNvbW1hbmQpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKHRpbWVzdGFtcElzQ3VycmVudEZyYW1lKGNvbW1hbmQudGltZXN0YW1wKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbW1hbmQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyByZXR1cm5zIHRydWUgaWYgdGhlcmUgd2FzIGEgRE9XTiAoaW4gYW55IHBhc3QgZnJhbWUpLCBhbmQgdGhlbiBhbiBVUCBpbiB0aGUgbGFzdCBmcmFtZVxuICAgIGZ1bmN0aW9uIGlzQ2xpY2tlZChpbnB1dEFjdGlvbiwgZW50aXR5KSB7XG4gICAgICAgIHJldHVybiBnZXRDbGljayhpbnB1dEFjdGlvbiwgZW50aXR5KSAhPT0gbnVsbDtcbiAgICB9XG4gICAgLy8gcmV0dXJucyB0cnVlIGlmIHRoZSBwcm92aWRlZCBsYXN0IGFjdGlvbiB3YXMgdHJpZ2dlcmVkIGluIHRoZSBsYXN0IGZyYW1lXG4gICAgZnVuY3Rpb24gaXNUcmlnZ2VyZWQoaW5wdXRBY3Rpb24sIHBvaW50ZXJFdmVudFR5cGUsIGVudGl0eSkge1xuICAgICAgICBpZiAoZW50aXR5KSB7XG4gICAgICAgICAgICBjb25zdCBjb21tYW5kID0gZmluZExhc3RBY3Rpb24ocG9pbnRlckV2ZW50VHlwZSwgaW5wdXRBY3Rpb24sIGVudGl0eSk7XG4gICAgICAgICAgICByZXR1cm4gKGNvbW1hbmQgJiYgdGltZXN0YW1wSXNDdXJyZW50RnJhbWUoY29tbWFuZC50aW1lc3RhbXApKSB8fCBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY29tbWFuZCBvZiBnbG9iYWxTdGF0ZS50aGlzRnJhbWVDb21tYW5kcykge1xuICAgICAgICAgICAgICAgIGlmICgoY29tbWFuZC5idXR0b24gPT09IGlucHV0QWN0aW9uIHx8IGlucHV0QWN0aW9uID09PSAzIC8qIElucHV0QWN0aW9uLklBX0FOWSAqLykgJiZcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZC5zdGF0ZSA9PT0gcG9pbnRlckV2ZW50VHlwZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gcmV0dXJucyB0aGUgZ2xvYmFsIHN0YXRlIG9mIHRoZSBpbnB1dC4gVGhpcyBnbG9iYWwgc3RhdGUgaXMgdXBkYXRlZCBmcm9tIHRoZSBzeXN0ZW1cbiAgICBmdW5jdGlvbiBpc1ByZXNzZWQoaW5wdXRBY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIGdsb2JhbFN0YXRlLmJ1dHRvblN0YXRlLmdldChpbnB1dEFjdGlvbik/LnN0YXRlID09PSAxIC8qIFBvaW50ZXJFdmVudFR5cGUuUEVUX0RPV04gKi87XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGlzUHJlc3NlZCxcbiAgICAgICAgZ2V0Q2xpY2ssXG4gICAgICAgIGdldElucHV0Q29tbWFuZCxcbiAgICAgICAgaXNDbGlja2VkLFxuICAgICAgICBpc1RyaWdnZXJlZFxuICAgIH07XG59XG4iLCAiLyoqXG4gKiBDb21wb25lbnQgdHlwZXMgYXJlIHVzZWQgdG8gcGljayB0aGUgd2lyZSBwcm90b2NvbCBhbmQgdGhlIGNvbmZsaWN0IHJlc29sdXRpb24gYWxnb3JpdGhtXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB2YXIgQ29tcG9uZW50VHlwZTtcbihmdW5jdGlvbiAoQ29tcG9uZW50VHlwZSkge1xuICAgIENvbXBvbmVudFR5cGVbQ29tcG9uZW50VHlwZVtcIkxhc3RXcml0ZVdpbkVsZW1lbnRTZXRcIl0gPSAwXSA9IFwiTGFzdFdyaXRlV2luRWxlbWVudFNldFwiO1xuICAgIENvbXBvbmVudFR5cGVbQ29tcG9uZW50VHlwZVtcIkdyb3dPbmx5VmFsdWVTZXRcIl0gPSAxXSA9IFwiR3Jvd09ubHlWYWx1ZVNldFwiO1xufSkoQ29tcG9uZW50VHlwZSB8fCAoQ29tcG9uZW50VHlwZSA9IHt9KSk7XG4iLCAiaW1wb3J0ICogYXMgY29tcG9uZW50cyBmcm9tICcuLi9jb21wb25lbnRzJztcbmltcG9ydCB7IGNvbXBvbmVudE51bWJlckZyb21OYW1lIH0gZnJvbSAnLi4vY29tcG9uZW50cy9jb21wb25lbnQtbnVtYmVyJztcbmltcG9ydCB7IGNoZWNrTm90VGhlbmFibGUgfSBmcm9tICcuLi9ydW50aW1lL2ludmFyaWFudCc7XG5pbXBvcnQgeyBTY2hlbWFzIH0gZnJvbSAnLi4vc2NoZW1hcyc7XG5pbXBvcnQgeyBjcmR0U2NlbmVTeXN0ZW0gfSBmcm9tICcuLi9zeXN0ZW1zL2NyZHQnO1xuaW1wb3J0IHsgY3JlYXRlQ29tcG9uZW50RGVmaW5pdGlvbkZyb21TY2hlbWEgfSBmcm9tICcuL2x3dy1lbGVtZW50LXNldC1jb21wb25lbnQtZGVmaW5pdGlvbic7XG5pbXBvcnQgeyBFbnRpdHlDb250YWluZXIgfSBmcm9tICcuL2VudGl0eSc7XG5pbXBvcnQgeyBTeXN0ZW1Db250YWluZXIsIFNZU1RFTVNfUkVHVUxBUl9QUklPUklUWSB9IGZyb20gJy4vc3lzdGVtcyc7XG5pbXBvcnQgeyBjcmVhdGVWYWx1ZVNldENvbXBvbmVudERlZmluaXRpb25Gcm9tU2NoZW1hIH0gZnJvbSAnLi9ncm93LW9ubHktdmFsdWUtc2V0LWNvbXBvbmVudC1kZWZpbml0aW9uJztcbmltcG9ydCB7IHJlbW92ZUVudGl0eVdpdGhDaGlsZHJlbiBhcyByZW1vdmVFbnRpdHlXaXRoQ2hpbGRyZW5FbmdpbmUgfSBmcm9tICcuLi9ydW50aW1lL2hlbHBlcnMvdHJlZSc7XG5leHBvcnQgKiBmcm9tICcuL2lucHV0JztcbmV4cG9ydCAqIGZyb20gJy4vcmVhZG9ubHknO1xuZXhwb3J0ICogZnJvbSAnLi90eXBlcyc7XG5mdW5jdGlvbiBwcmVFbmdpbmUoKSB7XG4gICAgY29uc3QgZW50aXR5Q29udGFpbmVyID0gRW50aXR5Q29udGFpbmVyKCk7XG4gICAgY29uc3QgY29tcG9uZW50c0RlZmluaXRpb24gPSBuZXcgTWFwKCk7XG4gICAgY29uc3Qgc3lzdGVtcyA9IFN5c3RlbUNvbnRhaW5lcigpO1xuICAgIGxldCBzZWFsZWQgPSBmYWxzZTtcbiAgICBmdW5jdGlvbiBhZGRTeXN0ZW0oZm4sIHByaW9yaXR5ID0gU1lTVEVNU19SRUdVTEFSX1BSSU9SSVRZLCBuYW1lKSB7XG4gICAgICAgIHN5c3RlbXMuYWRkKGZuLCBwcmlvcml0eSwgbmFtZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlbW92ZVN5c3RlbShzZWxlY3Rvcikge1xuICAgICAgICByZXR1cm4gc3lzdGVtcy5yZW1vdmUoc2VsZWN0b3IpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBhZGRFbnRpdHkoKSB7XG4gICAgICAgIGNvbnN0IGVudGl0eSA9IGVudGl0eUNvbnRhaW5lci5nZW5lcmF0ZUVudGl0eSgpO1xuICAgICAgICByZXR1cm4gZW50aXR5O1xuICAgIH1cbiAgICBmdW5jdGlvbiByZW1vdmVFbnRpdHkoZW50aXR5KSB7XG4gICAgICAgIGZvciAoY29uc3QgWywgY29tcG9uZW50XSBvZiBjb21wb25lbnRzRGVmaW5pdGlvbikge1xuICAgICAgICAgICAgLy8gVE9ETzogaGFjayBmb3IgdGhlIG1vbWVudC4gSXQgc2hvdWxkIGJlIGVub3VnaCB0byBkZWxldGUgdGhlIGVudGl0eSwgYnV0IHRoZSByZW5kZXJlciBpcyBub3QgY2xlYW5pbmcgdGhlIGNvbXBvbmVudHMuXG4gICAgICAgICAgICAvLyBTbyB3ZSBzdGlsbCBuZWVkIHRoZSBOZXR3b3JrRW50aXR5IHRvIGZvcndhcmQgdGhpcyBtZXNzYWdlIHRvIHRoZSBTeW5jVHJhbnNwb3J0LlxuICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5jb21wb25lbnROYW1lID09PSAnY29yZS1zY2hlbWE6Ok5ldHdvcmstRW50aXR5JylcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGNvbXBvbmVudC5lbnRpdHlEZWxldGVkKGVudGl0eSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVudGl0eUNvbnRhaW5lci5yZW1vdmVFbnRpdHkoZW50aXR5KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVtb3ZlRW50aXR5V2l0aENoaWxkcmVuKGVudGl0eSkge1xuICAgICAgICByZXR1cm4gcmVtb3ZlRW50aXR5V2l0aENoaWxkcmVuRW5naW5lKHsgcmVtb3ZlRW50aXR5LCBkZWZpbmVDb21wb25lbnRGcm9tU2NoZW1hLCBnZXRFbnRpdGllc1dpdGgsIGRlZmluZUNvbXBvbmVudCB9LCBlbnRpdHkpO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZWdpc3RlckNvbXBvbmVudERlZmluaXRpb24oY29tcG9uZW50TmFtZSwgY29tcG9uZW50KSB7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgIGlmIChzZWFsZWQpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VuZ2luZSBpcyBhbHJlYWR5IHNlYWxlZC4gTm8gY29tcG9uZW50cyBjYW4gYmUgYWRkZWQgYXQgdGhpcyBzdGFnZScpO1xuICAgICAgICBjb25zdCBjb21wb25lbnRJZCA9IGNvbXBvbmVudE51bWJlckZyb21OYW1lKGNvbXBvbmVudE5hbWUpO1xuICAgICAgICBjb25zdCBwcmV2ID0gY29tcG9uZW50c0RlZmluaXRpb24uZ2V0KGNvbXBvbmVudElkKTtcbiAgICAgICAgaWYgKHByZXYpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ29tcG9uZW50IG51bWJlciAke2NvbXBvbmVudElkfSB3YXMgYWxyZWFkeSByZWdpc3RlcmVkLmApO1xuICAgICAgICB9XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgIGlmIChjb21wb25lbnQuY29tcG9uZW50TmFtZSAhPT0gY29tcG9uZW50TmFtZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb21wb25lbnQgbmFtZSBkb2Vzbid0IG1hdGNoIGNvbXBvbmVudERlZmluaXRpb24uY29tcG9uZW50TmFtZSAke2NvbXBvbmVudE5hbWV9ICE9ICR7Y29tcG9uZW50LmNvbXBvbmVudE5hbWV9YCk7XG4gICAgICAgIH1cbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgaWYgKGNvbXBvbmVudC5jb21wb25lbnRJZCAhPT0gY29tcG9uZW50SWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ29tcG9uZW50IG51bWJlciBkb2Vzbid0IG1hdGNoIGNvbXBvbmVudERlZmluaXRpb24uY29tcG9uZW50SWQgJHtjb21wb25lbnRJZH0gIT0gJHtjb21wb25lbnQuY29tcG9uZW50SWR9YCk7XG4gICAgICAgIH1cbiAgICAgICAgY29tcG9uZW50c0RlZmluaXRpb24uc2V0KGNvbXBvbmVudElkLCBjb21wb25lbnQpO1xuICAgICAgICByZXR1cm4gY29tcG9uZW50O1xuICAgIH1cbiAgICBmdW5jdGlvbiBkZWZpbmVDb21wb25lbnRGcm9tU2NoZW1hKGNvbXBvbmVudE5hbWUsIHNjaGVtYSkge1xuICAgICAgICBjb25zdCBjb21wb25lbnRJZCA9IGNvbXBvbmVudE51bWJlckZyb21OYW1lKGNvbXBvbmVudE5hbWUpO1xuICAgICAgICBjb25zdCBwcmV2ID0gY29tcG9uZW50c0RlZmluaXRpb24uZ2V0KGNvbXBvbmVudElkKTtcbiAgICAgICAgaWYgKHByZXYpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IGFzc2VydCBzcGVjID09PSBwcmV2LnNwZWNcbiAgICAgICAgICAgIHJldHVybiBwcmV2O1xuICAgICAgICB9XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgIGlmIChzZWFsZWQpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VuZ2luZSBpcyBhbHJlYWR5IHNlYWxlZC4gTm8gY29tcG9uZW50cyBjYW4gYmUgYWRkZWQgYXQgdGhpcyBzdGFnZScpO1xuICAgICAgICBjb25zdCBuZXdDb21wb25lbnQgPSBjcmVhdGVDb21wb25lbnREZWZpbml0aW9uRnJvbVNjaGVtYShjb21wb25lbnROYW1lLCBjb21wb25lbnRJZCwgc2NoZW1hKTtcbiAgICAgICAgY29tcG9uZW50c0RlZmluaXRpb24uc2V0KGNvbXBvbmVudElkLCBuZXdDb21wb25lbnQpO1xuICAgICAgICByZXR1cm4gbmV3Q29tcG9uZW50O1xuICAgIH1cbiAgICBmdW5jdGlvbiBkZWZpbmVWYWx1ZVNldENvbXBvbmVudEZyb21TY2hlbWEoY29tcG9uZW50TmFtZSwgc2NoZW1hLCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudElkID0gY29tcG9uZW50TnVtYmVyRnJvbU5hbWUoY29tcG9uZW50TmFtZSk7XG4gICAgICAgIGNvbnN0IHByZXYgPSBjb21wb25lbnRzRGVmaW5pdGlvbi5nZXQoY29tcG9uZW50SWQpO1xuICAgICAgICBpZiAocHJldikge1xuICAgICAgICAgICAgLy8gVE9ETzogYXNzZXJ0IHNwZWMgPT09IHByZXYuc3BlY1xuICAgICAgICAgICAgcmV0dXJuIHByZXY7XG4gICAgICAgIH1cbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgaWYgKHNlYWxlZClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRW5naW5lIGlzIGFscmVhZHkgc2VhbGVkLiBObyBjb21wb25lbnRzIGNhbiBiZSBhZGRlZCBhdCB0aGlzIHN0YWdlJyk7XG4gICAgICAgIGNvbnN0IG5ld0NvbXBvbmVudCA9IGNyZWF0ZVZhbHVlU2V0Q29tcG9uZW50RGVmaW5pdGlvbkZyb21TY2hlbWEoY29tcG9uZW50TmFtZSwgY29tcG9uZW50SWQsIHNjaGVtYSwgb3B0aW9ucyk7XG4gICAgICAgIGNvbXBvbmVudHNEZWZpbml0aW9uLnNldChjb21wb25lbnRJZCwgbmV3Q29tcG9uZW50KTtcbiAgICAgICAgcmV0dXJuIG5ld0NvbXBvbmVudDtcbiAgICB9XG4gICAgZnVuY3Rpb24gZGVmaW5lQ29tcG9uZW50KGNvbXBvbmVudE5hbWUsIG1hcFNwZWMsIGNvbnN0cnVjdG9yRGVmYXVsdCkge1xuICAgICAgICBjb25zdCBjb21wb25lbnRJZCA9IGNvbXBvbmVudE51bWJlckZyb21OYW1lKGNvbXBvbmVudE5hbWUpO1xuICAgICAgICBjb25zdCBwcmV2ID0gY29tcG9uZW50c0RlZmluaXRpb24uZ2V0KGNvbXBvbmVudElkKTtcbiAgICAgICAgaWYgKHByZXYpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IGFzc2VydCBzcGVjID09PSBwcmV2LnNwZWNcbiAgICAgICAgICAgIHJldHVybiBwcmV2O1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZWFsZWQpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VuZ2luZSBpcyBhbHJlYWR5IHNlYWxlZC4gTm8gY29tcG9uZW50cyBjYW4gYmUgYWRkZWQgYXQgdGhpcyBzdGFnZScpO1xuICAgICAgICBjb25zdCBzY2hlbWFTcGVjID0gU2NoZW1hcy5NYXAobWFwU3BlYywgY29uc3RydWN0b3JEZWZhdWx0KTtcbiAgICAgICAgY29uc3QgZGVmID0gY3JlYXRlQ29tcG9uZW50RGVmaW5pdGlvbkZyb21TY2hlbWEoY29tcG9uZW50TmFtZSwgY29tcG9uZW50SWQsIHNjaGVtYVNwZWMpO1xuICAgICAgICBjb25zdCBuZXdDb21wb25lbnQgPSB7XG4gICAgICAgICAgICAuLi5kZWYsXG4gICAgICAgICAgICBjcmVhdGUoZW50aXR5LCB2YWwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGVmLmNyZWF0ZShlbnRpdHksIHZhbCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY3JlYXRlT3JSZXBsYWNlKGVudGl0eSwgdmFsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRlZi5jcmVhdGVPclJlcGxhY2UoZW50aXR5LCB2YWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBjb21wb25lbnRzRGVmaW5pdGlvbi5zZXQoY29tcG9uZW50SWQsIG5ld0NvbXBvbmVudCk7XG4gICAgICAgIHJldHVybiBuZXdDb21wb25lbnQ7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldENvbXBvbmVudChjb21wb25lbnRJZE9yTmFtZSkge1xuICAgICAgICBjb25zdCBjb21wb25lbnRJZCA9IHR5cGVvZiBjb21wb25lbnRJZE9yTmFtZSA9PT0gJ251bWJlcicgPyBjb21wb25lbnRJZE9yTmFtZSA6IGNvbXBvbmVudE51bWJlckZyb21OYW1lKGNvbXBvbmVudElkT3JOYW1lKTtcbiAgICAgICAgY29uc3QgY29tcG9uZW50ID0gY29tcG9uZW50c0RlZmluaXRpb24uZ2V0KGNvbXBvbmVudElkKTtcbiAgICAgICAgaWYgKCFjb21wb25lbnQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ29tcG9uZW50ICR7Y29tcG9uZW50SWRPck5hbWV9IG5vdCBmb3VuZC4gWW91IG5lZWQgdG8gZGVjbGFyZSB0aGUgY29tcG9uZW50cyBhdCB0aGUgYmVnaW5uaWcgb2YgdGhlIGVuZ2luZSBkZWNsYXJhdGlvbmApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wb25lbnQ7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldENvbXBvbmVudE9yTnVsbChjb21wb25lbnRJZE9yTmFtZSkge1xuICAgICAgICBjb25zdCBjb21wb25lbnRJZCA9IHR5cGVvZiBjb21wb25lbnRJZE9yTmFtZSA9PT0gJ251bWJlcicgPyBjb21wb25lbnRJZE9yTmFtZSA6IGNvbXBvbmVudE51bWJlckZyb21OYW1lKGNvbXBvbmVudElkT3JOYW1lKTtcbiAgICAgICAgcmV0dXJuIChjb21wb25lbnRzRGVmaW5pdGlvbi5nZXQoY29tcG9uZW50SWQpID8/XG4gICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICAgICAgbnVsbCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uKiBnZXRFbnRpdGllc1dpdGgoLi4uY29tcG9uZW50cykge1xuICAgICAgICBmb3IgKGNvbnN0IFtlbnRpdHksIC4uLmdyb3VwQ29tcF0gb2YgZ2V0Q29tcG9uZW50RGVmR3JvdXAoLi4uY29tcG9uZW50cykpIHtcbiAgICAgICAgICAgIHlpZWxkIFtlbnRpdHksIC4uLmdyb3VwQ29tcC5tYXAoKGMpID0+IGMuZ2V0KGVudGl0eSkpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRFbnRpdHlPck51bGxCeU5hbWUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgTGFiZWxDb21wb25lbnQgPSBjb21wb25lbnRzLk5hbWUoeyBkZWZpbmVDb21wb25lbnQgfSk7XG4gICAgICAgIGZvciAoY29uc3QgW2VudGl0eSwgbmFtZV0gb2YgZ2V0RW50aXRpZXNXaXRoKExhYmVsQ29tcG9uZW50KSkge1xuICAgICAgICAgICAgaWYgKG5hbWUudmFsdWUgPT09IHZhbHVlKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnRpdHk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGZ1bmN0aW9uKiBnZXRDb21wb25lbnREZWZHcm91cCguLi5hcmdzKSB7XG4gICAgICAgIGNvbnN0IFtmaXJzdENvbXBvbmVudERlZiwgLi4uY29tcG9uZW50RGVmaW5pdGlvbnNdID0gYXJncztcbiAgICAgICAgZm9yIChjb25zdCBbZW50aXR5XSBvZiBmaXJzdENvbXBvbmVudERlZi5pdGVyYXRvcigpKSB7XG4gICAgICAgICAgICBsZXQgbWF0Y2hlcyA9IHRydWU7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNvbXBvbmVudERlZiBvZiBjb21wb25lbnREZWZpbml0aW9ucykge1xuICAgICAgICAgICAgICAgIGlmICghY29tcG9uZW50RGVmLmhhcyhlbnRpdHkpKSB7XG4gICAgICAgICAgICAgICAgICAgIG1hdGNoZXMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1hdGNoZXMpIHtcbiAgICAgICAgICAgICAgICB5aWVsZCBbZW50aXR5LCAuLi5hcmdzXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRTeXN0ZW1zKCkge1xuICAgICAgICByZXR1cm4gc3lzdGVtcy5nZXRTeXN0ZW1zKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbXBvbmVudHNJdGVyKCkge1xuICAgICAgICByZXR1cm4gY29tcG9uZW50c0RlZmluaXRpb24udmFsdWVzKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlbW92ZUNvbXBvbmVudERlZmluaXRpb24oY29tcG9uZW50SWRPck5hbWUpIHtcbiAgICAgICAgaWYgKHNlYWxlZClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRW5naW5lIGlzIGFscmVhZHkgc2VhbGVkLiBObyBjb21wb25lbnRzIGNhbiBiZSByZW1vdmVkIGF0IHRoaXMgc3RhZ2UnKTtcbiAgICAgICAgY29uc3QgY29tcG9uZW50SWQgPSB0eXBlb2YgY29tcG9uZW50SWRPck5hbWUgPT09ICdudW1iZXInID8gY29tcG9uZW50SWRPck5hbWUgOiBjb21wb25lbnROdW1iZXJGcm9tTmFtZShjb21wb25lbnRJZE9yTmFtZSk7XG4gICAgICAgIGNvbXBvbmVudHNEZWZpbml0aW9uLmRlbGV0ZShjb21wb25lbnRJZCk7XG4gICAgfVxuICAgIGNvbXBvbmVudHMuVHJhbnNmb3JtKHsgZGVmaW5lQ29tcG9uZW50RnJvbVNjaGVtYSB9KTtcbiAgICBmdW5jdGlvbiBzZWFsKCkge1xuICAgICAgICBpZiAoIXNlYWxlZCkge1xuICAgICAgICAgICAgc2VhbGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBhZGRFbnRpdHksXG4gICAgICAgIHJlbW92ZUVudGl0eSxcbiAgICAgICAgcmVtb3ZlRW50aXR5V2l0aENoaWxkcmVuLFxuICAgICAgICBhZGRTeXN0ZW0sXG4gICAgICAgIGdldFN5c3RlbXMsXG4gICAgICAgIHJlbW92ZVN5c3RlbSxcbiAgICAgICAgZGVmaW5lQ29tcG9uZW50LFxuICAgICAgICBkZWZpbmVDb21wb25lbnRGcm9tU2NoZW1hLFxuICAgICAgICBkZWZpbmVWYWx1ZVNldENvbXBvbmVudEZyb21TY2hlbWEsXG4gICAgICAgIGdldEVudGl0aWVzV2l0aCxcbiAgICAgICAgZ2V0Q29tcG9uZW50LFxuICAgICAgICBnZXRDb21wb25lbnRPck51bGw6IGdldENvbXBvbmVudE9yTnVsbCxcbiAgICAgICAgZ2V0RW50aXR5T3JOdWxsQnlOYW1lLFxuICAgICAgICByZW1vdmVDb21wb25lbnREZWZpbml0aW9uLFxuICAgICAgICByZWdpc3RlckNvbXBvbmVudERlZmluaXRpb24sXG4gICAgICAgIGVudGl0eUNvbnRhaW5lcixcbiAgICAgICAgY29tcG9uZW50c0l0ZXIsXG4gICAgICAgIHNlYWxcbiAgICB9O1xufVxuLyoqXG4gKiBJbnRlcm5hbCBjb25zdHJ1Y3RvciBvZiBuZXcgZW5naW5lcywgdGhpcyBpcyBhbiBpbnRlcm5hbCBBUElcbiAqIEBwdWJsaWNcbiAqIEBkZXByZWNhdGVkIFByZXZlbnQgbWFudWFsIHVzYWdlIHByZWZlciBcImVuZ2luZVwiIGZvciBzY2VuZSBkZXZlbG9wbWVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gRW5naW5lKG9wdGlvbnMpIHtcbiAgICBjb25zdCBwYXJ0aWFsRW5naW5lID0gcHJlRW5naW5lKCk7XG4gICAgY29uc3QgY3JkdFN5c3RlbSA9IGNyZHRTY2VuZVN5c3RlbShwYXJ0aWFsRW5naW5lLCBvcHRpb25zPy5vbkNoYW5nZUZ1bmN0aW9uIHx8IG51bGwpO1xuICAgIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZShkdCkge1xuICAgICAgICBhd2FpdCBjcmR0U3lzdGVtLnJlY2VpdmVNZXNzYWdlcygpO1xuICAgICAgICBmb3IgKGNvbnN0IHN5c3RlbSBvZiBwYXJ0aWFsRW5naW5lLmdldFN5c3RlbXMoKSkge1xuICAgICAgICAgICAgY29uc3QgcmV0ID0gc3lzdGVtLmZuKGR0KTtcbiAgICAgICAgICAgIGNoZWNrTm90VGhlbmFibGUocmV0LCBgQSBzeXN0ZW0gKCR7c3lzdGVtLm5hbWUgfHwgJ2Fub255bW91cyd9KSByZXR1cm5lZCBhIHRoZW5hYmxlLiBTeXN0ZW1zIGNhbm5vdCBiZSBhc3luYyBmdW5jdGlvbnMuIERvY3VtZW50YXRpb246IGh0dHBzOi8vZGNsLmdnL3Nkay9zeW5jLXN5c3RlbXNgKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBnZXQgdGhlIGRlbGV0ZWQgZW50aXRpZXMgdG8gc2VuZCB0aGUgRGVsZXRlRW50aXR5IENSRFQgY29tbWFuZHNcbiAgICAgICAgY29uc3QgZGVsZXRlZEVudGl0ZXMgPSBwYXJ0aWFsRW5naW5lLmVudGl0eUNvbnRhaW5lci5yZWxlYXNlUmVtb3ZlZEVudGl0aWVzKCk7XG4gICAgICAgIGF3YWl0IGNyZHRTeXN0ZW0uc2VuZE1lc3NhZ2VzKGRlbGV0ZWRFbnRpdGVzKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYWRkRW50aXR5OiBwYXJ0aWFsRW5naW5lLmFkZEVudGl0eSxcbiAgICAgICAgcmVtb3ZlRW50aXR5OiBwYXJ0aWFsRW5naW5lLnJlbW92ZUVudGl0eSxcbiAgICAgICAgcmVtb3ZlRW50aXR5V2l0aENoaWxkcmVuOiBwYXJ0aWFsRW5naW5lLnJlbW92ZUVudGl0eVdpdGhDaGlsZHJlbixcbiAgICAgICAgYWRkU3lzdGVtOiBwYXJ0aWFsRW5naW5lLmFkZFN5c3RlbSxcbiAgICAgICAgcmVtb3ZlU3lzdGVtOiBwYXJ0aWFsRW5naW5lLnJlbW92ZVN5c3RlbSxcbiAgICAgICAgZGVmaW5lQ29tcG9uZW50OiBwYXJ0aWFsRW5naW5lLmRlZmluZUNvbXBvbmVudCxcbiAgICAgICAgZGVmaW5lQ29tcG9uZW50RnJvbVNjaGVtYTogcGFydGlhbEVuZ2luZS5kZWZpbmVDb21wb25lbnRGcm9tU2NoZW1hLFxuICAgICAgICBkZWZpbmVWYWx1ZVNldENvbXBvbmVudEZyb21TY2hlbWE6IHBhcnRpYWxFbmdpbmUuZGVmaW5lVmFsdWVTZXRDb21wb25lbnRGcm9tU2NoZW1hLFxuICAgICAgICByZWdpc3RlckNvbXBvbmVudERlZmluaXRpb246IHBhcnRpYWxFbmdpbmUucmVnaXN0ZXJDb21wb25lbnREZWZpbml0aW9uLFxuICAgICAgICBnZXRFbnRpdGllc1dpdGg6IHBhcnRpYWxFbmdpbmUuZ2V0RW50aXRpZXNXaXRoLFxuICAgICAgICBnZXRDb21wb25lbnQ6IHBhcnRpYWxFbmdpbmUuZ2V0Q29tcG9uZW50LFxuICAgICAgICBnZXRDb21wb25lbnRPck51bGw6IHBhcnRpYWxFbmdpbmUuZ2V0Q29tcG9uZW50T3JOdWxsLFxuICAgICAgICByZW1vdmVDb21wb25lbnREZWZpbml0aW9uOiBwYXJ0aWFsRW5naW5lLnJlbW92ZUNvbXBvbmVudERlZmluaXRpb24sXG4gICAgICAgIGNvbXBvbmVudHNJdGVyOiBwYXJ0aWFsRW5naW5lLmNvbXBvbmVudHNJdGVyLFxuICAgICAgICBzZWFsOiBwYXJ0aWFsRW5naW5lLnNlYWwsXG4gICAgICAgIGdldEVudGl0eU9yTnVsbEJ5TmFtZTogcGFydGlhbEVuZ2luZS5nZXRFbnRpdHlPck51bGxCeU5hbWUsXG4gICAgICAgIHVwZGF0ZSxcbiAgICAgICAgUm9vdEVudGl0eTogMCxcbiAgICAgICAgUGxheWVyRW50aXR5OiAxLFxuICAgICAgICBDYW1lcmFFbnRpdHk6IDIsXG4gICAgICAgIGdldEVudGl0eVN0YXRlOiBwYXJ0aWFsRW5naW5lLmVudGl0eUNvbnRhaW5lci5nZXRFbnRpdHlTdGF0ZSxcbiAgICAgICAgYWRkVHJhbnNwb3J0OiBjcmR0U3lzdGVtLmFkZFRyYW5zcG9ydCxcbiAgICAgICAgZW50aXR5Q29udGFpbmVyOiBwYXJ0aWFsRW5naW5lLmVudGl0eUNvbnRhaW5lclxuICAgIH07XG59XG4iLCAiZnVuY3Rpb24gZ2V0QW5kQ2xlYW4odmFsdWUpIHtcbiAgICBjb25zdCBtZXNzYWdlc1RvUHJvY2VzcyA9IEFycmF5LmZyb20odmFsdWUpO1xuICAgIHZhbHVlLmxlbmd0aCA9IDA7XG4gICAgcmV0dXJuIG1lc3NhZ2VzVG9Qcm9jZXNzO1xufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVRhc2tTeXN0ZW0oZW5naW5lKSB7XG4gICAgY29uc3QgdGFza3MgPSBbXTtcbiAgICBhc3luYyBmdW5jdGlvbiBydW5UYXNrKHRhc2spIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCB0YXNrKCk7XG4gICAgICAgICAgICByZXR1cm4gcmVzcDtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBleGVjdXRlVGFza3MoKSB7XG4gICAgICAgIGZvciAoY29uc3QgdGFzayBvZiBnZXRBbmRDbGVhbih0YXNrcykpIHtcbiAgICAgICAgICAgIHJ1blRhc2sodGFzaykuY2F0Y2goY29uc29sZS5lcnJvcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZW5naW5lLmFkZFN5c3RlbShleGVjdXRlVGFza3MpO1xuICAgIHJldHVybiBmdW5jdGlvbiAodGFzaykge1xuICAgICAgICB0YXNrcy5wdXNoKHRhc2spO1xuICAgIH07XG59XG4iLCAiaW1wb3J0ICogYXMgY29tcG9uZW50cyBmcm9tICcuLi9jb21wb25lbnRzJztcbmltcG9ydCB7IEVudGl0eVN0YXRlIH0gZnJvbSAnLi4vZW5naW5lL2VudGl0eSc7XG5pbXBvcnQgeyBjaGVja05vdFRoZW5hYmxlIH0gZnJvbSAnLi4vcnVudGltZS9pbnZhcmlhbnQnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVBvaW50ZXJFdmVudHNTeXN0ZW0oZW5naW5lLCBpbnB1dFN5c3RlbSkge1xuICAgIGNvbnN0IFBvaW50ZXJFdmVudHMgPSBjb21wb25lbnRzLlBvaW50ZXJFdmVudHMoZW5naW5lKTtcbiAgICBsZXQgRXZlbnRUeXBlO1xuICAgIChmdW5jdGlvbiAoRXZlbnRUeXBlKSB7XG4gICAgICAgIEV2ZW50VHlwZVtFdmVudFR5cGVbXCJDbGlja1wiXSA9IDBdID0gXCJDbGlja1wiO1xuICAgICAgICBFdmVudFR5cGVbRXZlbnRUeXBlW1wiRG93blwiXSA9IDFdID0gXCJEb3duXCI7XG4gICAgICAgIEV2ZW50VHlwZVtFdmVudFR5cGVbXCJVcFwiXSA9IDJdID0gXCJVcFwiO1xuICAgIH0pKEV2ZW50VHlwZSB8fCAoRXZlbnRUeXBlID0ge30pKTtcbiAgICBjb25zdCBnZXREZWZhdWx0T3B0cyA9IChvcHRzID0ge30pID0+ICh7XG4gICAgICAgIGJ1dHRvbjogMyAvKiBJbnB1dEFjdGlvbi5JQV9BTlkgKi8sXG4gICAgICAgIC4uLm9wdHNcbiAgICB9KTtcbiAgICBjb25zdCBldmVudHNNYXAgPSBuZXcgTWFwKCk7XG4gICAgZnVuY3Rpb24gZ2V0RXZlbnQoZW50aXR5KSB7XG4gICAgICAgIHJldHVybiBldmVudHNNYXAuZ2V0KGVudGl0eSkgfHwgZXZlbnRzTWFwLnNldChlbnRpdHksIG5ldyBNYXAoKSkuZ2V0KGVudGl0eSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHNldFBvaW50ZXJFdmVudChlbnRpdHksIHR5cGUsIG9wdHMpIHtcbiAgICAgICAgaWYgKG9wdHMuaG92ZXJUZXh0IHx8IG9wdHMuc2hvd0ZlZWRiYWNrKSB7XG4gICAgICAgICAgICBjb25zdCBwb2ludGVyRXZlbnQgPSBQb2ludGVyRXZlbnRzLmdldE11dGFibGVPck51bGwoZW50aXR5KSB8fCBQb2ludGVyRXZlbnRzLmNyZWF0ZShlbnRpdHkpO1xuICAgICAgICAgICAgcG9pbnRlckV2ZW50LnBvaW50ZXJFdmVudHMucHVzaCh7XG4gICAgICAgICAgICAgICAgZXZlbnRUeXBlOiB0eXBlLFxuICAgICAgICAgICAgICAgIGV2ZW50SW5mbzoge1xuICAgICAgICAgICAgICAgICAgICBidXR0b246IG9wdHMuYnV0dG9uLFxuICAgICAgICAgICAgICAgICAgICBzaG93RmVlZGJhY2s6IG9wdHMuc2hvd0ZlZWRiYWNrLFxuICAgICAgICAgICAgICAgICAgICBob3ZlclRleHQ6IG9wdHMuaG92ZXJUZXh0LFxuICAgICAgICAgICAgICAgICAgICBtYXhEaXN0YW5jZTogb3B0cy5tYXhEaXN0YW5jZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlbW92ZVBvaW50ZXJFdmVudChlbnRpdHksIHR5cGUsIGJ1dHRvbikge1xuICAgICAgICBjb25zdCBwb2ludGVyRXZlbnQgPSBQb2ludGVyRXZlbnRzLmdldE11dGFibGVPck51bGwoZW50aXR5KTtcbiAgICAgICAgaWYgKCFwb2ludGVyRXZlbnQpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHBvaW50ZXJFdmVudC5wb2ludGVyRXZlbnRzID0gcG9pbnRlckV2ZW50LnBvaW50ZXJFdmVudHMuZmlsdGVyKChwb2ludGVyKSA9PiAhKHBvaW50ZXIuZXZlbnRJbmZvPy5idXR0b24gPT09IGJ1dHRvbiAmJiBwb2ludGVyLmV2ZW50VHlwZSA9PT0gdHlwZSkpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRQb2ludGVyRXZlbnQoZXZlbnRUeXBlKSB7XG4gICAgICAgIGlmIChldmVudFR5cGUgPT09IEV2ZW50VHlwZS5VcCkge1xuICAgICAgICAgICAgcmV0dXJuIDAgLyogUG9pbnRlckV2ZW50VHlwZS5QRVRfVVAgKi87XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDEgLyogUG9pbnRlckV2ZW50VHlwZS5QRVRfRE9XTiAqLztcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVtb3ZlRXZlbnQoZW50aXR5LCB0eXBlKSB7XG4gICAgICAgIGNvbnN0IGV2ZW50ID0gZ2V0RXZlbnQoZW50aXR5KTtcbiAgICAgICAgY29uc3QgcG9pbnRlckV2ZW50ID0gZXZlbnQuZ2V0KHR5cGUpO1xuICAgICAgICBpZiAocG9pbnRlckV2ZW50Py5vcHRzLmhvdmVyVGV4dCkge1xuICAgICAgICAgICAgcmVtb3ZlUG9pbnRlckV2ZW50KGVudGl0eSwgZ2V0UG9pbnRlckV2ZW50KHR5cGUpLCBwb2ludGVyRXZlbnQub3B0cy5idXR0b24pO1xuICAgICAgICB9XG4gICAgICAgIGV2ZW50LmRlbGV0ZSh0eXBlKTtcbiAgICB9XG4gICAgLy8gQGludGVybmFsXG4gICAgZW5naW5lLmFkZFN5c3RlbShmdW5jdGlvbiBFdmVudFN5c3RlbSgpIHtcbiAgICAgICAgZm9yIChjb25zdCBbZW50aXR5LCBldmVudF0gb2YgZXZlbnRzTWFwKSB7XG4gICAgICAgICAgICBpZiAoZW5naW5lLmdldEVudGl0eVN0YXRlKGVudGl0eSkgPT09IEVudGl0eVN0YXRlLlJlbW92ZWQpIHtcbiAgICAgICAgICAgICAgICBldmVudHNNYXAuZGVsZXRlKGVudGl0eSk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtldmVudFR5cGUsIHsgY2IsIG9wdHMgfV0gb2YgZXZlbnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnRUeXBlID09PSBFdmVudFR5cGUuQ2xpY2spIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tbWFuZCA9IGlucHV0U3lzdGVtLmdldENsaWNrKG9wdHMuYnV0dG9uLCBlbnRpdHkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29tbWFuZClcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrTm90VGhlbmFibGUoY2IoY29tbWFuZC51cCksICdDbGljayBldmVudCByZXR1cm5lZCBhIHRoZW5hYmxlLiBPbmx5IHN5bmNocm9ub3VzIGZ1bmN0aW9ucyBhcmUgYWxsb3dlZCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZXZlbnRUeXBlID09PSBFdmVudFR5cGUuRG93biB8fCBldmVudFR5cGUgPT09IEV2ZW50VHlwZS5VcCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21tYW5kID0gaW5wdXRTeXN0ZW0uZ2V0SW5wdXRDb21tYW5kKG9wdHMuYnV0dG9uLCBnZXRQb2ludGVyRXZlbnQoZXZlbnRUeXBlKSwgZW50aXR5KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbW1hbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrTm90VGhlbmFibGUoY2IoY29tbWFuZCksICdFdmVudCBoYW5kbGVyIHJldHVybmVkIGEgdGhlbmFibGUuIE9ubHkgc3luY2hyb25vdXMgZnVuY3Rpb25zIGFyZSBhbGxvd2VkJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCBvblBvaW50ZXJEb3duID0gKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgY29uc3QgW2RhdGEsIGNiLCBtYXliZU9wdHNdID0gYXJncztcbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgcmV0dXJuIG9uUG9pbnRlckRvd24oeyBlbnRpdHk6IGRhdGEsIG9wdHM6IG1heWJlT3B0cyA/PyB7fSB9LCBjYik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBlbnRpdHksIG9wdHMgfSA9IGRhdGE7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBnZXREZWZhdWx0T3B0cyhvcHRzKTtcbiAgICAgICAgcmVtb3ZlRXZlbnQoZW50aXR5LCBFdmVudFR5cGUuRG93bik7XG4gICAgICAgIGdldEV2ZW50KGVudGl0eSkuc2V0KEV2ZW50VHlwZS5Eb3duLCB7IGNiLCBvcHRzOiBvcHRpb25zIH0pO1xuICAgICAgICBzZXRQb2ludGVyRXZlbnQoZW50aXR5LCAxIC8qIFBvaW50ZXJFdmVudFR5cGUuUEVUX0RPV04gKi8sIG9wdGlvbnMpO1xuICAgIH07XG4gICAgY29uc3Qgb25Qb2ludGVyVXAgPSAoLi4uYXJncykgPT4ge1xuICAgICAgICBjb25zdCBbZGF0YSwgY2IsIG1heWJlT3B0c10gPSBhcmdzO1xuICAgICAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICByZXR1cm4gb25Qb2ludGVyVXAoeyBlbnRpdHk6IGRhdGEsIG9wdHM6IG1heWJlT3B0cyA/PyB7fSB9LCBjYik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBlbnRpdHksIG9wdHMgfSA9IGRhdGE7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBnZXREZWZhdWx0T3B0cyhvcHRzKTtcbiAgICAgICAgcmVtb3ZlRXZlbnQoZW50aXR5LCBFdmVudFR5cGUuVXApO1xuICAgICAgICBnZXRFdmVudChlbnRpdHkpLnNldChFdmVudFR5cGUuVXAsIHsgY2IsIG9wdHM6IG9wdGlvbnMgfSk7XG4gICAgICAgIHNldFBvaW50ZXJFdmVudChlbnRpdHksIDAgLyogUG9pbnRlckV2ZW50VHlwZS5QRVRfVVAgKi8sIG9wdGlvbnMpO1xuICAgIH07XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcmVtb3ZlT25DbGljayhlbnRpdHkpIHtcbiAgICAgICAgICAgIHJlbW92ZUV2ZW50KGVudGl0eSwgRXZlbnRUeXBlLkNsaWNrKTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVtb3ZlT25Qb2ludGVyRG93bihlbnRpdHkpIHtcbiAgICAgICAgICAgIHJlbW92ZUV2ZW50KGVudGl0eSwgRXZlbnRUeXBlLkRvd24pO1xuICAgICAgICB9LFxuICAgICAgICByZW1vdmVPblBvaW50ZXJVcChlbnRpdHkpIHtcbiAgICAgICAgICAgIHJlbW92ZUV2ZW50KGVudGl0eSwgRXZlbnRUeXBlLlVwKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25DbGljayh2YWx1ZSwgY2IpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgZW50aXR5IH0gPSB2YWx1ZTtcbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSBnZXREZWZhdWx0T3B0cyh2YWx1ZS5vcHRzKTtcbiAgICAgICAgICAgIC8vIENsZWFyIHByZXZpb3VzIGV2ZW50IHdpdGggb3ZlciBmZWVkYmFjayBpbmNsdWRlZFxuICAgICAgICAgICAgcmVtb3ZlRXZlbnQoZW50aXR5LCBFdmVudFR5cGUuQ2xpY2spO1xuICAgICAgICAgICAgLy8gU2V0IG5ldyBldmVudFxuICAgICAgICAgICAgZ2V0RXZlbnQoZW50aXR5KS5zZXQoRXZlbnRUeXBlLkNsaWNrLCB7IGNiLCBvcHRzOiBvcHRpb25zIH0pO1xuICAgICAgICAgICAgc2V0UG9pbnRlckV2ZW50KGVudGl0eSwgMSAvKiBQb2ludGVyRXZlbnRUeXBlLlBFVF9ET1dOICovLCBvcHRpb25zKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25Qb2ludGVyRG93bixcbiAgICAgICAgb25Qb2ludGVyVXBcbiAgICB9O1xufVxuIiwgImltcG9ydCAqIGFzIGNvbXBvbmVudHMgZnJvbSAnLi4vY29tcG9uZW50cyc7XG5pbXBvcnQgeyBSZWFkV3JpdGVCeXRlQnVmZmVyIH0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbi9CeXRlQnVmZmVyJztcbmltcG9ydCB7IGRhdGFDb21wYXJlIH0gZnJvbSAnLi9jcmR0L3V0aWxzJztcbi8qKlxuICogQGludGVybmFsXG4gKiBAcmV0dXJucyB0d2VlbiBoZWxwZXIgdG8gYmUgdXNlZCBvbiB0aGUgc2NlbmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVR3ZWVuU3lzdGVtKGVuZ2luZSkge1xuICAgIGNvbnN0IFR3ZWVuID0gY29tcG9uZW50cy5Ud2VlbihlbmdpbmUpO1xuICAgIGNvbnN0IFR3ZWVuU3RhdGUgPSBjb21wb25lbnRzLlR3ZWVuU3RhdGUoZW5naW5lKTtcbiAgICBjb25zdCBUd2VlblNlcXVlbmNlID0gY29tcG9uZW50cy5Ud2VlblNlcXVlbmNlKGVuZ2luZSk7XG4gICAgY29uc3QgY2FjaGUgPSBuZXcgTWFwKCk7XG4gICAgZnVuY3Rpb24gaXNDb21wbGV0ZWQoZW50aXR5KSB7XG4gICAgICAgIGNvbnN0IHR3ZWVuU3RhdGUgPSBUd2VlblN0YXRlLmdldE9yTnVsbChlbnRpdHkpO1xuICAgICAgICBjb25zdCB0d2VlbiA9IFR3ZWVuLmdldE9yTnVsbChlbnRpdHkpO1xuICAgICAgICBjb25zdCB0d2VlbkNhY2hlID0gY2FjaGUuZ2V0KGVudGl0eSk7XG4gICAgICAgIGlmICghdHdlZW5TdGF0ZSB8fCAhdHdlZW4pXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgIGlmIChcbiAgICAgICAgLy8gUmVuZGVyZXIgbm90aWZpZWQgdGhhdCB0aGUgdHdlZW4gaXMgY29tcGxldGVkXG4gICAgICAgICh0d2VlbkNoYW5nZWQoZW50aXR5KSB8fCB0d2VlblN0YXRlLnN0YXRlID09PSAxIC8qIFR3ZWVuU3RhdGVTdGF0dXMuVFNfQ09NUExFVEVEICovKSAmJlxuICAgICAgICAgICAgLy8gQXZvaWQgc2VuZGluZyBpc0NvbXBsZXRlZCBtdWx0aXBsZSB0aW1lc1xuICAgICAgICAgICAgIXR3ZWVuQ2FjaGU/LmNvbXBsZXRlZCAmJlxuICAgICAgICAgICAgLy8gQW1vdW50IG9mIGZyYW1lcyBuZWVkZWQgdG8gY29uc2lkZXIgYSB0d2VlbiBjb21wbGV0ZWRcbiAgICAgICAgICAgICh0d2VlbkNhY2hlPy5mcmFtZXMgPz8gMCkgPiAyKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHR3ZWVuQ2hhbmdlZChlbnRpdHkpIHtcbiAgICAgICAgY29uc3QgY3VycmVudFR3ZWVuID0gVHdlZW4uZ2V0T3JOdWxsKGVudGl0eSk7XG4gICAgICAgIGNvbnN0IHByZXZUd2VlbiA9IGNhY2hlLmdldChlbnRpdHkpPy50d2VlbjtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgaWYgKChjdXJyZW50VHdlZW4gJiYgIXByZXZUd2VlbikgfHwgKCFjdXJyZW50VHdlZW4gJiYgcHJldlR3ZWVuKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY3VycmVudEJ1ZmYgPSBuZXcgUmVhZFdyaXRlQnl0ZUJ1ZmZlcigpO1xuICAgICAgICBUd2Vlbi5zY2hlbWEuc2VyaWFsaXplKGN1cnJlbnRUd2VlbiwgY3VycmVudEJ1ZmYpO1xuICAgICAgICBjb25zdCBlcXVhbCA9IGRhdGFDb21wYXJlKGN1cnJlbnRCdWZmLnRvQmluYXJ5KCksIHByZXZUd2Vlbik7XG4gICAgICAgIHJldHVybiBlcXVhbDtcbiAgICB9XG4gICAgY29uc3QgcmVzdGFydFR3ZWVucyA9IFtdO1xuICAgIC8vIExvZ2ljIGZvciBzZXF1ZW5jZSB0d2VlbnNcbiAgICBlbmdpbmUuYWRkU3lzdGVtKCgpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCByZXN0YXJ0IG9mIHJlc3RhcnRUd2VlbnMpIHtcbiAgICAgICAgICAgIHJlc3RhcnQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXN0YXJ0VHdlZW5zLmxlbmd0aCA9IDA7XG4gICAgICAgIGZvciAoY29uc3QgW2VudGl0eSwgdHdlZW5dIG9mIGVuZ2luZS5nZXRFbnRpdGllc1dpdGgoVHdlZW4pKSB7XG4gICAgICAgICAgICBpZiAodHdlZW5DaGFuZ2VkKGVudGl0eSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBidWZmZXIgPSBuZXcgUmVhZFdyaXRlQnl0ZUJ1ZmZlcigpO1xuICAgICAgICAgICAgICAgIFR3ZWVuLnNjaGVtYS5zZXJpYWxpemUodHdlZW4sIGJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgY2FjaGUuc2V0KGVudGl0eSwge1xuICAgICAgICAgICAgICAgICAgICB0d2VlbjogYnVmZmVyLnRvQmluYXJ5KCksXG4gICAgICAgICAgICAgICAgICAgIGZyYW1lczogMCxcbiAgICAgICAgICAgICAgICAgICAgY29tcGxldGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlZDogdHJ1ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdHdlZW5DYWNoZSA9IGNhY2hlLmdldChlbnRpdHkpO1xuICAgICAgICAgICAgdHdlZW5DYWNoZS5mcmFtZXMgKz0gMTtcbiAgICAgICAgICAgIHR3ZWVuQ2FjaGUuY2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKGlzQ29tcGxldGVkKGVudGl0eSkpIHtcbiAgICAgICAgICAgICAgICAvLyBSZXNldCB0d2VlbiBmcmFtZXMuXG4gICAgICAgICAgICAgICAgdHdlZW5DYWNoZS5mcmFtZXMgPSAwO1xuICAgICAgICAgICAgICAgIC8vIHNldCB0aGUgdHdlZW4gY29tcGxldGVkIHRvIGF2b2lkIGNhbGxpbmcgdGhpcyBhZ2FpbiBmb3IgdGhlIHNhbWUgdHdlZW5cbiAgICAgICAgICAgICAgICB0d2VlbkNhY2hlLmNvbXBsZXRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgY29uc3QgdHdlZW5TZXF1ZW5jZSA9IFR3ZWVuU2VxdWVuY2UuZ2V0T3JOdWxsKGVudGl0eSk7XG4gICAgICAgICAgICAgICAgaWYgKCF0d2VlblNlcXVlbmNlKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjb25zdCB7IHNlcXVlbmNlIH0gPSB0d2VlblNlcXVlbmNlO1xuICAgICAgICAgICAgICAgIGlmIChzZXF1ZW5jZSAmJiBzZXF1ZW5jZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgW25leHRUd2VlblNlcXVlbmNlLCAuLi5vdGhlclR3ZWVuc10gPSBzZXF1ZW5jZTtcbiAgICAgICAgICAgICAgICAgICAgVHdlZW4uY3JlYXRlT3JSZXBsYWNlKGVudGl0eSwgbmV4dFR3ZWVuU2VxdWVuY2UpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtdXRhYmxlVHdlZW5IZWxwZXIgPSBUd2VlblNlcXVlbmNlLmdldE11dGFibGUoZW50aXR5KTtcbiAgICAgICAgICAgICAgICAgICAgbXV0YWJsZVR3ZWVuSGVscGVyLnNlcXVlbmNlID0gb3RoZXJUd2VlbnM7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0d2VlblNlcXVlbmNlLmxvb3AgPT09IDAgLyogVHdlZW5Mb29wLlRMX1JFU1RBUlQgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG11dGFibGVUd2VlbkhlbHBlci5zZXF1ZW5jZS5wdXNoKHR3ZWVuKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0d2VlblNlcXVlbmNlLmxvb3AgPT09IDEgLyogVHdlZW5Mb29wLlRMX1lPWU8gKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgVHdlZW4uY3JlYXRlT3JSZXBsYWNlKGVudGl0eSwgYmFja3dhcmRzVHdlZW4odHdlZW4pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodHdlZW5TZXF1ZW5jZS5sb29wID09PSAwIC8qIFR3ZWVuTG9vcC5UTF9SRVNUQVJUICovKSB7XG4gICAgICAgICAgICAgICAgICAgIFR3ZWVuLmRlbGV0ZUZyb20oZW50aXR5KTtcbiAgICAgICAgICAgICAgICAgICAgY2FjaGUuZGVsZXRlKGVudGl0eSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3RhcnRUd2VlbnMucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBUd2Vlbi5jcmVhdGVPclJlcGxhY2UoZW50aXR5LCB0d2Vlbik7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sIE51bWJlci5ORUdBVElWRV9JTkZJTklUWSk7XG4gICAgZnVuY3Rpb24gYmFja3dhcmRzVHdlZW4odHdlZW4pIHtcbiAgICAgICAgaWYgKHR3ZWVuLm1vZGU/LiRjYXNlID09PSAnbW92ZScgJiYgdHdlZW4ubW9kZS5tb3ZlKSB7XG4gICAgICAgICAgICByZXR1cm4geyAuLi50d2VlbiwgbW9kZTogeyAuLi50d2Vlbi5tb2RlLCBtb3ZlOiB7IHN0YXJ0OiB0d2Vlbi5tb2RlLm1vdmUuZW5kLCBlbmQ6IHR3ZWVuLm1vZGUubW92ZS5zdGFydCB9IH0gfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHdlZW4ubW9kZT8uJGNhc2UgPT09ICdyb3RhdGUnICYmIHR3ZWVuLm1vZGUucm90YXRlKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIC4uLnR3ZWVuLFxuICAgICAgICAgICAgICAgIG1vZGU6IHsgLi4udHdlZW4ubW9kZSwgcm90YXRlOiB7IHN0YXJ0OiB0d2Vlbi5tb2RlLnJvdGF0ZS5lbmQsIGVuZDogdHdlZW4ubW9kZS5yb3RhdGUuc3RhcnQgfSB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0d2Vlbi5tb2RlPy4kY2FzZSA9PT0gJ3NjYWxlJyAmJiB0d2Vlbi5tb2RlLnNjYWxlKSB7XG4gICAgICAgICAgICByZXR1cm4geyAuLi50d2VlbiwgbW9kZTogeyAuLi50d2Vlbi5tb2RlLCBzY2FsZTogeyBzdGFydDogdHdlZW4ubW9kZS5zY2FsZS5lbmQsIGVuZDogdHdlZW4ubW9kZS5zY2FsZS5zdGFydCB9IH0gfTtcbiAgICAgICAgfVxuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdHdlZW4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgLy8gVGhpcyBldmVudCBpcyBmaXJlZCBvbmx5IG9uY2UgcGVyIHR3ZWVuXG4gICAgICAgIHR3ZWVuQ29tcGxldGVkOiBpc0NvbXBsZXRlZFxuICAgIH07XG59XG4iLCAiLyoqXG4gKiBAYWxwaGEgKiBUaGlzIGZpbGUgaW5pdGlhbGl6YXRpb24gaXMgYW4gYWxwaGEgb25lLiBUaGlzIGlzIGJhc2VkIG9uIHRoZSBvbGQtZWNzXG4gKiBpbml0IGFuZCBpdCdsbCBiZSBjaGFuZ2luZy5cbiAqL1xuaW1wb3J0IHsgRW5naW5lIH0gZnJvbSAnLi4vLi4vZW5naW5lJztcbmltcG9ydCB7IGNyZWF0ZVRhc2tTeXN0ZW0gfSBmcm9tICcuLi8uLi9zeXN0ZW1zL2FzeW5jLXRhc2snO1xuaW1wb3J0IHsgY3JlYXRlUG9pbnRlckV2ZW50c1N5c3RlbSB9IGZyb20gJy4uLy4uL3N5c3RlbXMvZXZlbnRzJztcbmltcG9ydCB7IGNyZWF0ZUlucHV0U3lzdGVtIH0gZnJvbSAnLi8uLi8uLi9lbmdpbmUvaW5wdXQnO1xuaW1wb3J0IHsgY3JlYXRlUmF5Y2FzdFN5c3RlbSB9IGZyb20gJy4uLy4uL3N5c3RlbXMvcmF5Y2FzdCc7XG5pbXBvcnQgeyBjcmVhdGVWaWRlb0V2ZW50c1N5c3RlbSB9IGZyb20gJy4uLy4uL3N5c3RlbXMvdmlkZW9FdmVudHMnO1xuaW1wb3J0IHsgY3JlYXRlVHdlZW5TeXN0ZW0gfSBmcm9tICcuLi8uLi9zeXN0ZW1zL3R3ZWVuJztcbi8qKlxuICogQHB1YmxpY1xuICogVGhlIGVuZ2luZSBpcyB0aGUgcGFydCBvZiB0aGUgc2NlbmUgdGhhdCBzaXRzIGluIHRoZSBtaWRkbGUgYW5kIG1hbmFnZXMgYWxsIG9mIHRoZSBvdGhlciBwYXJ0cy5cbiAqIEl0IGRldGVybWluZXMgd2hhdCBlbnRpdGllcyBhcmUgcmVuZGVyZWQgYW5kIGhvdyBwbGF5ZXJzIGludGVyYWN0IHdpdGggdGhlbS5cbiAqIEl0IGFsc28gY29vcmRpbmF0ZXMgd2hhdCBmdW5jdGlvbnMgZnJvbSBzeXN0ZW1zIGFyZSBleGVjdXRlZCBhbmQgd2hlbi5cbiAqXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IHsgZW5naW5lIH0gZnJvbSAnQGRjbC9zZGsvZWNzJ1xuICogY29uc3QgZW50aXR5ID0gZW5naW5lLmFkZEVudGl0eSgpXG4gKiBlbmdpbmUuYWRkU3lzdGVtKHNvbWVTeXN0ZW1GdW5jdGlvbilcbiAqXG4gKi9cbmV4cG9ydCBjb25zdCBlbmdpbmUgPSAvKiBAX19QVVJFX18gKi8gRW5naW5lKCk7XG4vKipcbiAqIEBwdWJsaWNcbiAqIElucHV0IHN5c3RlbSBtYW5hZ2VyLiBDaGVjayBmb3IgYnV0dG9uIGV2ZW50c1xuICogQGV4YW1wbGVcbiAqIGlucHV0U3lzdGVtLmlzVHJpZ2dlcmVkOiBSZXR1cm5zIHRydWUgaWYgYW4gaW5wdXQgYWN0aW9uIG9jdXJyZWQgc2luY2UgdGhlIGxhc3QgdGljay5cbiAqIGlucHV0U3lzdGVtLmlzUHJlc3NlZDogUmV0dXJucyB0cnVlIGlmIGFuIGlucHV0IGlzIGN1cnJlbnRseSBiZWluZyBwcmVzc2VkIGRvd24uIEl0IHdpbGwgcmV0dXJuIHRydWUgb24gZXZlcnkgdGljayB1bnRpbCB0aGUgYnV0dG9uIGdvZXMgdXAgYWdhaW4uXG4gKiBpbnB1dFN5c3RlbS5nZXRJbnB1dENvbW1hbmQ6IFJldHVybnMgYW4gb2JqZWN0IHdpdGggZGF0YSBhYm91dCB0aGUgaW5wdXQgYWN0aW9uLlxuICovXG5leHBvcnQgY29uc3QgaW5wdXRTeXN0ZW0gPSAvKiBAX19QVVJFX18gKi8gY3JlYXRlSW5wdXRTeXN0ZW0oZW5naW5lKTtcbi8qKlxuICogQHB1YmxpY1xuICogUmVnaXN0ZXIgY2FsbGJhY2sgZnVuY3Rpb25zIHRvIGEgcGFydGljdWxhciBlbnRpdHkgb24gaW5wdXQgZXZlbnRzLlxuICovXG5leHBvcnQgY29uc3QgcG9pbnRlckV2ZW50c1N5c3RlbSA9IC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVQb2ludGVyRXZlbnRzU3lzdGVtKGVuZ2luZSwgaW5wdXRTeXN0ZW0pO1xuLyoqXG4gKiBAcHVibGljXG4gKiBSZWdpc3RlciBjYWxsYmFjayBmdW5jdGlvbnMgdG8gYSBwYXJ0aWN1bGFyIGVudGl0eSBvbiByYXljYXN0IHJlc3VsdHMuXG4gKi9cbmV4cG9ydCBjb25zdCByYXljYXN0U3lzdGVtID0gLyogQF9fUFVSRV9fICovIGNyZWF0ZVJheWNhc3RTeXN0ZW0oZW5naW5lKTtcbi8qKlxuICogQHB1YmxpY1xuICogUmVnaXN0ZXIgY2FsbGJhY2sgZnVuY3Rpb25zIHRvIGEgcGFydGljdWxhciBlbnRpdHkgb24gdmlkZW8gZXZlbnRzLlxuICovXG5leHBvcnQgY29uc3QgdmlkZW9FdmVudHNTeXN0ZW0gPSAvKiBAX19QVVJFX18gKi8gY3JlYXRlVmlkZW9FdmVudHNTeXN0ZW0oZW5naW5lKTtcbi8qKlxuICogQHB1YmxpY1xuICogUmVnaXN0ZXIgY2FsbGJhY2sgZnVuY3Rpb25zIHRvIGEgcGFydGljdWxhciBlbnRpdHkgb24gdmlkZW8gZXZlbnRzLlxuICovXG5leHBvcnQgY29uc3QgdHdlZW5TeXN0ZW0gPSBjcmVhdGVUd2VlblN5c3RlbShlbmdpbmUpO1xuLyoqXG4gKiBAcHVibGljXG4gKiBSdW5zIGFuIGFzeW5jIGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBleGVjdXRlVGFzayA9IC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVUYXNrU3lzdGVtKGVuZ2luZSk7XG4iLCAiaW1wb3J0IHsgZW5naW5lIH0gZnJvbSAnLi4vLi4vcnVudGltZS9pbml0aWFsaXphdGlvbic7XG5pbXBvcnQgKiBhcyBjb21wb25lbnRzIGZyb20gJy4vaW5kZXguZ2VuJztcbmV4cG9ydCAqIGZyb20gJy4vaW5kZXguZ2VuJztcbi8qKiBAcHVibGljICovIGV4cG9ydCBjb25zdCBBdWRpb1NvdXJjZSA9IC8qIEBfX1BVUkVfXyAqLyBjb21wb25lbnRzLkF1ZGlvU291cmNlKGVuZ2luZSk7XG4vKiogQHB1YmxpYyAqLyBleHBvcnQgY29uc3QgQXVkaW9TdHJlYW0gPSAvKiBAX19QVVJFX18gKi8gY29tcG9uZW50cy5BdWRpb1N0cmVhbShlbmdpbmUpO1xuLyoqIEBwdWJsaWMgKi8gZXhwb3J0IGNvbnN0IEF2YXRhckF0dGFjaCA9IC8qIEBfX1BVUkVfXyAqLyBjb21wb25lbnRzLkF2YXRhckF0dGFjaChlbmdpbmUpO1xuLyoqIEBwdWJsaWMgKi8gZXhwb3J0IGNvbnN0IEF2YXRhck1vZGlmaWVyQXJlYSA9IC8qIEBfX1BVUkVfXyAqLyBjb21wb25lbnRzLkF2YXRhck1vZGlmaWVyQXJlYShlbmdpbmUpO1xuLyoqIEBwdWJsaWMgKi8gZXhwb3J0IGNvbnN0IEF2YXRhclNoYXBlID0gLyogQF9fUFVSRV9fICovIGNvbXBvbmVudHMuQXZhdGFyU2hhcGUoZW5naW5lKTtcbi8qKiBAcHVibGljICovIGV4cG9ydCBjb25zdCBCaWxsYm9hcmQgPSAvKiBAX19QVVJFX18gKi8gY29tcG9uZW50cy5CaWxsYm9hcmQoZW5naW5lKTtcbi8qKiBAcHVibGljICovIGV4cG9ydCBjb25zdCBDYW1lcmFNb2RlID0gLyogQF9fUFVSRV9fICovIGNvbXBvbmVudHMuQ2FtZXJhTW9kZShlbmdpbmUpO1xuLyoqIEBwdWJsaWMgKi8gZXhwb3J0IGNvbnN0IENhbWVyYU1vZGVBcmVhID0gLyogQF9fUFVSRV9fICovIGNvbXBvbmVudHMuQ2FtZXJhTW9kZUFyZWEoZW5naW5lKTtcbi8qKiBAcHVibGljICovIGV4cG9ydCBjb25zdCBFbmdpbmVJbmZvID0gLyogQF9fUFVSRV9fICovIGNvbXBvbmVudHMuRW5naW5lSW5mbyhlbmdpbmUpO1xuLyoqIEBwdWJsaWMgKi8gZXhwb3J0IGNvbnN0IEdsdGZDb250YWluZXIgPSAvKiBAX19QVVJFX18gKi8gY29tcG9uZW50cy5HbHRmQ29udGFpbmVyKGVuZ2luZSk7XG4vKiogQHB1YmxpYyAqLyBleHBvcnQgY29uc3QgR2x0ZkNvbnRhaW5lckxvYWRpbmdTdGF0ZSA9IC8qIEBfX1BVUkVfXyAqLyBjb21wb25lbnRzLkdsdGZDb250YWluZXJMb2FkaW5nU3RhdGUoZW5naW5lKTtcbi8qKiBAcHVibGljICovIGV4cG9ydCBjb25zdCBOZnRTaGFwZSA9IC8qIEBfX1BVUkVfXyAqLyBjb21wb25lbnRzLk5mdFNoYXBlKGVuZ2luZSk7XG4vKiogQHB1YmxpYyAqLyBleHBvcnQgY29uc3QgUG9pbnRlckV2ZW50cyA9IC8qIEBfX1BVUkVfXyAqLyBjb21wb25lbnRzLlBvaW50ZXJFdmVudHMoZW5naW5lKTtcbi8qKiBAcHVibGljICovIGV4cG9ydCBjb25zdCBQb2ludGVyRXZlbnRzUmVzdWx0ID0gLyogQF9fUFVSRV9fICovIGNvbXBvbmVudHMuUG9pbnRlckV2ZW50c1Jlc3VsdChlbmdpbmUpO1xuLyoqIEBwdWJsaWMgKi8gZXhwb3J0IGNvbnN0IFBvaW50ZXJMb2NrID0gLyogQF9fUFVSRV9fICovIGNvbXBvbmVudHMuUG9pbnRlckxvY2soZW5naW5lKTtcbi8qKiBAcHVibGljICovIGV4cG9ydCBjb25zdCBSYXljYXN0ID0gLyogQF9fUFVSRV9fICovIGNvbXBvbmVudHMuUmF5Y2FzdChlbmdpbmUpO1xuLyoqIEBwdWJsaWMgKi8gZXhwb3J0IGNvbnN0IFJheWNhc3RSZXN1bHQgPSAvKiBAX19QVVJFX18gKi8gY29tcG9uZW50cy5SYXljYXN0UmVzdWx0KGVuZ2luZSk7XG4vKiogQHB1YmxpYyAqLyBleHBvcnQgY29uc3QgVGV4dFNoYXBlID0gLyogQF9fUFVSRV9fICovIGNvbXBvbmVudHMuVGV4dFNoYXBlKGVuZ2luZSk7XG4vKiogQHB1YmxpYyAqLyBleHBvcnQgY29uc3QgVHdlZW5TZXF1ZW5jZSA9IC8qIEBfX1BVUkVfXyAqLyBjb21wb25lbnRzLlR3ZWVuU2VxdWVuY2UoZW5naW5lKTtcbi8qKiBAcHVibGljICovIGV4cG9ydCBjb25zdCBUd2VlblN0YXRlID0gLyogQF9fUFVSRV9fICovIGNvbXBvbmVudHMuVHdlZW5TdGF0ZShlbmdpbmUpO1xuLyoqIEBwdWJsaWMgKi8gZXhwb3J0IGNvbnN0IFVpQmFja2dyb3VuZCA9IC8qIEBfX1BVUkVfXyAqLyBjb21wb25lbnRzLlVpQmFja2dyb3VuZChlbmdpbmUpO1xuLyoqIEBwdWJsaWMgKi8gZXhwb3J0IGNvbnN0IFVpQ2FudmFzSW5mb3JtYXRpb24gPSAvKiBAX19QVVJFX18gKi8gY29tcG9uZW50cy5VaUNhbnZhc0luZm9ybWF0aW9uKGVuZ2luZSk7XG4vKiogQHB1YmxpYyAqLyBleHBvcnQgY29uc3QgVWlEcm9wZG93biA9IC8qIEBfX1BVUkVfXyAqLyBjb21wb25lbnRzLlVpRHJvcGRvd24oZW5naW5lKTtcbi8qKiBAcHVibGljICovIGV4cG9ydCBjb25zdCBVaURyb3Bkb3duUmVzdWx0ID0gLyogQF9fUFVSRV9fICovIGNvbXBvbmVudHMuVWlEcm9wZG93blJlc3VsdChlbmdpbmUpO1xuLyoqIEBwdWJsaWMgKi8gZXhwb3J0IGNvbnN0IFVpSW5wdXQgPSAvKiBAX19QVVJFX18gKi8gY29tcG9uZW50cy5VaUlucHV0KGVuZ2luZSk7XG4vKiogQHB1YmxpYyAqLyBleHBvcnQgY29uc3QgVWlJbnB1dFJlc3VsdCA9IC8qIEBfX1BVUkVfXyAqLyBjb21wb25lbnRzLlVpSW5wdXRSZXN1bHQoZW5naW5lKTtcbi8qKiBAcHVibGljICovIGV4cG9ydCBjb25zdCBVaVRleHQgPSAvKiBAX19QVVJFX18gKi8gY29tcG9uZW50cy5VaVRleHQoZW5naW5lKTtcbi8qKiBAcHVibGljICovIGV4cG9ydCBjb25zdCBVaVRyYW5zZm9ybSA9IC8qIEBfX1BVUkVfXyAqLyBjb21wb25lbnRzLlVpVHJhbnNmb3JtKGVuZ2luZSk7XG4vKiogQHB1YmxpYyAqLyBleHBvcnQgY29uc3QgVmlkZW9FdmVudCA9IC8qIEBfX1BVUkVfXyAqLyBjb21wb25lbnRzLlZpZGVvRXZlbnQoZW5naW5lKTtcbi8qKiBAcHVibGljICovIGV4cG9ydCBjb25zdCBWaWRlb1BsYXllciA9IC8qIEBfX1BVUkVfXyAqLyBjb21wb25lbnRzLlZpZGVvUGxheWVyKGVuZ2luZSk7XG4vKiogQHB1YmxpYyAqLyBleHBvcnQgY29uc3QgVmlzaWJpbGl0eUNvbXBvbmVudCA9IC8qIEBfX1BVUkVfXyAqLyBjb21wb25lbnRzLlZpc2liaWxpdHlDb21wb25lbnQoZW5naW5lKTtcbiIsICIvKiBlc2xpbnQtZGlzYWJsZSAqL1xuY29uc3QgcHJvdG9idWZQYWNrYWdlU2FyYXNhID0gXCJkZWNlbnRyYWxhbmQuc2RrLmNvbXBvbmVudHMuY29tbW9uXCI7XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHZhciBDYW1lcmFUeXBlO1xuKGZ1bmN0aW9uIChDYW1lcmFUeXBlKSB7XG4gICAgQ2FtZXJhVHlwZVtDYW1lcmFUeXBlW1wiQ1RfRklSU1RfUEVSU09OXCJdID0gMF0gPSBcIkNUX0ZJUlNUX1BFUlNPTlwiO1xuICAgIENhbWVyYVR5cGVbQ2FtZXJhVHlwZVtcIkNUX1RISVJEX1BFUlNPTlwiXSA9IDFdID0gXCJDVF9USElSRF9QRVJTT05cIjtcbiAgICAvKiogQ1RfQ0lORU1BVElDIC0gY29udHJvbGxlZCBieSB0aGUgc2NlbmUgKi9cbiAgICBDYW1lcmFUeXBlW0NhbWVyYVR5cGVbXCJDVF9DSU5FTUFUSUNcIl0gPSAyXSA9IFwiQ1RfQ0lORU1BVElDXCI7XG59KShDYW1lcmFUeXBlIHx8IChDYW1lcmFUeXBlID0ge30pKTtcbiIsICIvKiBlc2xpbnQtZGlzYWJsZSAqL1xuY29uc3QgcHJvdG9idWZQYWNrYWdlU2FyYXNhID0gXCJkZWNlbnRyYWxhbmQuc2RrLmNvbXBvbmVudHMuY29tbW9uXCI7XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHZhciBJbnB1dEFjdGlvbjtcbihmdW5jdGlvbiAoSW5wdXRBY3Rpb24pIHtcbiAgICBJbnB1dEFjdGlvbltJbnB1dEFjdGlvbltcIklBX1BPSU5URVJcIl0gPSAwXSA9IFwiSUFfUE9JTlRFUlwiO1xuICAgIElucHV0QWN0aW9uW0lucHV0QWN0aW9uW1wiSUFfUFJJTUFSWVwiXSA9IDFdID0gXCJJQV9QUklNQVJZXCI7XG4gICAgSW5wdXRBY3Rpb25bSW5wdXRBY3Rpb25bXCJJQV9TRUNPTkRBUllcIl0gPSAyXSA9IFwiSUFfU0VDT05EQVJZXCI7XG4gICAgSW5wdXRBY3Rpb25bSW5wdXRBY3Rpb25bXCJJQV9BTllcIl0gPSAzXSA9IFwiSUFfQU5ZXCI7XG4gICAgSW5wdXRBY3Rpb25bSW5wdXRBY3Rpb25bXCJJQV9GT1JXQVJEXCJdID0gNF0gPSBcIklBX0ZPUldBUkRcIjtcbiAgICBJbnB1dEFjdGlvbltJbnB1dEFjdGlvbltcIklBX0JBQ0tXQVJEXCJdID0gNV0gPSBcIklBX0JBQ0tXQVJEXCI7XG4gICAgSW5wdXRBY3Rpb25bSW5wdXRBY3Rpb25bXCJJQV9SSUdIVFwiXSA9IDZdID0gXCJJQV9SSUdIVFwiO1xuICAgIElucHV0QWN0aW9uW0lucHV0QWN0aW9uW1wiSUFfTEVGVFwiXSA9IDddID0gXCJJQV9MRUZUXCI7XG4gICAgSW5wdXRBY3Rpb25bSW5wdXRBY3Rpb25bXCJJQV9KVU1QXCJdID0gOF0gPSBcIklBX0pVTVBcIjtcbiAgICBJbnB1dEFjdGlvbltJbnB1dEFjdGlvbltcIklBX1dBTEtcIl0gPSA5XSA9IFwiSUFfV0FMS1wiO1xuICAgIElucHV0QWN0aW9uW0lucHV0QWN0aW9uW1wiSUFfQUNUSU9OXzNcIl0gPSAxMF0gPSBcIklBX0FDVElPTl8zXCI7XG4gICAgSW5wdXRBY3Rpb25bSW5wdXRBY3Rpb25bXCJJQV9BQ1RJT05fNFwiXSA9IDExXSA9IFwiSUFfQUNUSU9OXzRcIjtcbiAgICBJbnB1dEFjdGlvbltJbnB1dEFjdGlvbltcIklBX0FDVElPTl81XCJdID0gMTJdID0gXCJJQV9BQ1RJT05fNVwiO1xuICAgIElucHV0QWN0aW9uW0lucHV0QWN0aW9uW1wiSUFfQUNUSU9OXzZcIl0gPSAxM10gPSBcIklBX0FDVElPTl82XCI7XG59KShJbnB1dEFjdGlvbiB8fCAoSW5wdXRBY3Rpb24gPSB7fSkpO1xuLyoqIFBvaW50ZXJFdmVudFR5cGUgaXMgYSBraW5kIG9mIGludGVyYWN0aW9uIHRoYXQgY2FuIGJlIGRldGVjdGVkLiAqL1xuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB2YXIgUG9pbnRlckV2ZW50VHlwZTtcbihmdW5jdGlvbiAoUG9pbnRlckV2ZW50VHlwZSkge1xuICAgIFBvaW50ZXJFdmVudFR5cGVbUG9pbnRlckV2ZW50VHlwZVtcIlBFVF9VUFwiXSA9IDBdID0gXCJQRVRfVVBcIjtcbiAgICBQb2ludGVyRXZlbnRUeXBlW1BvaW50ZXJFdmVudFR5cGVbXCJQRVRfRE9XTlwiXSA9IDFdID0gXCJQRVRfRE9XTlwiO1xuICAgIFBvaW50ZXJFdmVudFR5cGVbUG9pbnRlckV2ZW50VHlwZVtcIlBFVF9IT1ZFUl9FTlRFUlwiXSA9IDJdID0gXCJQRVRfSE9WRVJfRU5URVJcIjtcbiAgICBQb2ludGVyRXZlbnRUeXBlW1BvaW50ZXJFdmVudFR5cGVbXCJQRVRfSE9WRVJfTEVBVkVcIl0gPSAzXSA9IFwiUEVUX0hPVkVSX0xFQVZFXCI7XG59KShQb2ludGVyRXZlbnRUeXBlIHx8IChQb2ludGVyRXZlbnRUeXBlID0ge30pKTtcbiIsICIvKiBlc2xpbnQtZGlzYWJsZSAqL1xuY29uc3QgcHJvdG9idWZQYWNrYWdlU2FyYXNhID0gXCJkZWNlbnRyYWxhbmQuc2RrLmNvbXBvbmVudHMuY29tbW9uXCI7XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHZhciBMb2FkaW5nU3RhdGU7XG4oZnVuY3Rpb24gKExvYWRpbmdTdGF0ZSkge1xuICAgIExvYWRpbmdTdGF0ZVtMb2FkaW5nU3RhdGVbXCJVTktOT1dOXCJdID0gMF0gPSBcIlVOS05PV05cIjtcbiAgICBMb2FkaW5nU3RhdGVbTG9hZGluZ1N0YXRlW1wiTE9BRElOR1wiXSA9IDFdID0gXCJMT0FESU5HXCI7XG4gICAgTG9hZGluZ1N0YXRlW0xvYWRpbmdTdGF0ZVtcIk5PVF9GT1VORFwiXSA9IDJdID0gXCJOT1RfRk9VTkRcIjtcbiAgICBMb2FkaW5nU3RhdGVbTG9hZGluZ1N0YXRlW1wiRklOSVNIRURfV0lUSF9FUlJPUlwiXSA9IDNdID0gXCJGSU5JU0hFRF9XSVRIX0VSUk9SXCI7XG4gICAgTG9hZGluZ1N0YXRlW0xvYWRpbmdTdGF0ZVtcIkZJTklTSEVEXCJdID0gNF0gPSBcIkZJTklTSEVEXCI7XG59KShMb2FkaW5nU3RhdGUgfHwgKExvYWRpbmdTdGF0ZSA9IHt9KSk7XG4iLCAiLyogZXNsaW50LWRpc2FibGUgKi9cbmNvbnN0IHByb3RvYnVmUGFja2FnZVNhcmFzYSA9IFwiZGVjZW50cmFsYW5kLnNkay5jb21wb25lbnRzLmNvbW1vblwiO1xuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB2YXIgVGV4dEFsaWduTW9kZTtcbihmdW5jdGlvbiAoVGV4dEFsaWduTW9kZSkge1xuICAgIFRleHRBbGlnbk1vZGVbVGV4dEFsaWduTW9kZVtcIlRBTV9UT1BfTEVGVFwiXSA9IDBdID0gXCJUQU1fVE9QX0xFRlRcIjtcbiAgICBUZXh0QWxpZ25Nb2RlW1RleHRBbGlnbk1vZGVbXCJUQU1fVE9QX0NFTlRFUlwiXSA9IDFdID0gXCJUQU1fVE9QX0NFTlRFUlwiO1xuICAgIFRleHRBbGlnbk1vZGVbVGV4dEFsaWduTW9kZVtcIlRBTV9UT1BfUklHSFRcIl0gPSAyXSA9IFwiVEFNX1RPUF9SSUdIVFwiO1xuICAgIFRleHRBbGlnbk1vZGVbVGV4dEFsaWduTW9kZVtcIlRBTV9NSURETEVfTEVGVFwiXSA9IDNdID0gXCJUQU1fTUlERExFX0xFRlRcIjtcbiAgICBUZXh0QWxpZ25Nb2RlW1RleHRBbGlnbk1vZGVbXCJUQU1fTUlERExFX0NFTlRFUlwiXSA9IDRdID0gXCJUQU1fTUlERExFX0NFTlRFUlwiO1xuICAgIFRleHRBbGlnbk1vZGVbVGV4dEFsaWduTW9kZVtcIlRBTV9NSURETEVfUklHSFRcIl0gPSA1XSA9IFwiVEFNX01JRERMRV9SSUdIVFwiO1xuICAgIFRleHRBbGlnbk1vZGVbVGV4dEFsaWduTW9kZVtcIlRBTV9CT1RUT01fTEVGVFwiXSA9IDZdID0gXCJUQU1fQk9UVE9NX0xFRlRcIjtcbiAgICBUZXh0QWxpZ25Nb2RlW1RleHRBbGlnbk1vZGVbXCJUQU1fQk9UVE9NX0NFTlRFUlwiXSA9IDddID0gXCJUQU1fQk9UVE9NX0NFTlRFUlwiO1xuICAgIFRleHRBbGlnbk1vZGVbVGV4dEFsaWduTW9kZVtcIlRBTV9CT1RUT01fUklHSFRcIl0gPSA4XSA9IFwiVEFNX0JPVFRPTV9SSUdIVFwiO1xufSkoVGV4dEFsaWduTW9kZSB8fCAoVGV4dEFsaWduTW9kZSA9IHt9KSk7XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHZhciBGb250O1xuKGZ1bmN0aW9uIChGb250KSB7XG4gICAgRm9udFtGb250W1wiRl9TQU5TX1NFUklGXCJdID0gMF0gPSBcIkZfU0FOU19TRVJJRlwiO1xuICAgIEZvbnRbRm9udFtcIkZfU0VSSUZcIl0gPSAxXSA9IFwiRl9TRVJJRlwiO1xuICAgIEZvbnRbRm9udFtcIkZfTU9OT1NQQUNFXCJdID0gMl0gPSBcIkZfTU9OT1NQQUNFXCI7XG59KShGb250IHx8IChGb250ID0ge30pKTtcbiIsICJpbXBvcnQgeyBTY2hlbWFzIH0gZnJvbSAnLi4vc2NoZW1hcyc7XG4vKipcbiAqIEBwdWJsaWNcbiAqIEBkZXByZWNhdGVkIGNvbXBvc2l0ZSBpcyBub3QgYmVpbmcgc3VwcG9ydGVkIHNvIGZhciwgcGxlYXNlIGRvIG5vdCB1c2UgdGhpcyBmZWF0dXJlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb21wb3NpdGVSb290Q29tcG9uZW50KGVuZ2luZSkge1xuICAgIGNvbnN0IGNvbXBvbmVudCA9IGVuZ2luZS5nZXRDb21wb25lbnRPck51bGwoJ2NvbXBvc2l0ZTo6cm9vdCcpO1xuICAgIGlmIChjb21wb25lbnQpIHtcbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgICB9XG4gICAgcmV0dXJuIGVuZ2luZS5kZWZpbmVDb21wb25lbnQoJ2NvbXBvc2l0ZTo6cm9vdCcsIHtcbiAgICAgICAgc3JjOiBTY2hlbWFzLlN0cmluZyxcbiAgICAgICAgZW50aXRpZXM6IFNjaGVtYXMuQXJyYXkoU2NoZW1hcy5NYXAoe1xuICAgICAgICAgICAgc3JjOiBTY2hlbWFzLkVudGl0eSxcbiAgICAgICAgICAgIGRlc3Q6IFNjaGVtYXMuRW50aXR5XG4gICAgICAgIH0pKVxuICAgIH0pO1xufVxuIiwgImNvbnN0IGN1cnJlbnRXb3JraW5nRGlyID0gJy8nO1xuLyoqXG4gKiBUaGUgZnVuY3Rpb25zIGBub3JtYWxpemVTdHJpbmdQb3NpeGAsIGBkaXJuYW1lYCBhbmQgYHJlc29sdmVgXG4gKiB3ZXJlIGV4dHJhY3RlZCBmcm9tIHBhY2thZ2UgQGJyb3dzZXJpZnkvcGF0aFxuICovXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuZnVuY3Rpb24gbm9ybWFsaXplU3RyaW5nUG9zaXgocGF0aCwgYWxsb3dBYm92ZVJvb3QgPSBmYWxzZSkge1xuICAgIGxldCByZXMgPSAnJztcbiAgICBsZXQgbGFzdFNlZ21lbnRMZW5ndGggPSAwO1xuICAgIGxldCBsYXN0U2xhc2ggPSAtMTtcbiAgICBsZXQgZG90cyA9IDA7XG4gICAgbGV0IGNvZGU7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gcGF0aC5sZW5ndGg7ICsraSkge1xuICAgICAgICBpZiAoaSA8IHBhdGgubGVuZ3RoKVxuICAgICAgICAgICAgY29kZSA9IHBhdGguY2hhckNvZGVBdChpKTtcbiAgICAgICAgZWxzZSBpZiAoY29kZSA9PT0gNDcgLyovKi8pXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgY29kZSA9IDQ3OyAvKi8qL1xuICAgICAgICBpZiAoY29kZSA9PT0gNDcgLyovKi8pIHtcbiAgICAgICAgICAgIGlmIChsYXN0U2xhc2ggPT09IGkgLSAxIHx8IGRvdHMgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAvLyBOT09QXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChsYXN0U2xhc2ggIT09IGkgLSAxICYmIGRvdHMgPT09IDIpIHtcbiAgICAgICAgICAgICAgICBpZiAocmVzLmxlbmd0aCA8IDIgfHxcbiAgICAgICAgICAgICAgICAgICAgbGFzdFNlZ21lbnRMZW5ndGggIT09IDIgfHxcbiAgICAgICAgICAgICAgICAgICAgcmVzLmNoYXJDb2RlQXQocmVzLmxlbmd0aCAtIDEpICE9PSA0NiAvKi4qLyB8fFxuICAgICAgICAgICAgICAgICAgICByZXMuY2hhckNvZGVBdChyZXMubGVuZ3RoIC0gMikgIT09IDQ2IC8qLiovKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXMubGVuZ3RoID4gMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFzdFNsYXNoSW5kZXggPSByZXMubGFzdEluZGV4T2YoJy8nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYXN0U2xhc2hJbmRleCAhPT0gcmVzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFzdFNsYXNoSW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9ICcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0U2VnbWVudExlbmd0aCA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMgPSByZXMuc2xpY2UoMCwgbGFzdFNsYXNoSW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0U2VnbWVudExlbmd0aCA9IHJlcy5sZW5ndGggLSAxIC0gcmVzLmxhc3RJbmRleE9mKCcvJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RTbGFzaCA9IGk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG90cyA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocmVzLmxlbmd0aCA9PT0gMiB8fCByZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXMgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RTZWdtZW50TGVuZ3RoID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RTbGFzaCA9IGk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb3RzID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChhbGxvd0Fib3ZlUm9vdCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgICAgICByZXMgKz0gJy8uLic7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9ICcuLic7XG4gICAgICAgICAgICAgICAgICAgIGxhc3RTZWdtZW50TGVuZ3RoID0gMjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAocmVzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgIHJlcyArPSAnLycgKyBwYXRoLnNsaWNlKGxhc3RTbGFzaCArIDEsIGkpO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgcmVzID0gcGF0aC5zbGljZShsYXN0U2xhc2ggKyAxLCBpKTtcbiAgICAgICAgICAgICAgICBsYXN0U2VnbWVudExlbmd0aCA9IGkgLSBsYXN0U2xhc2ggLSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGFzdFNsYXNoID0gaTtcbiAgICAgICAgICAgIGRvdHMgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNvZGUgPT09IDQ2IC8qLiovICYmIGRvdHMgIT09IC0xKSB7XG4gICAgICAgICAgICArK2RvdHM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBkb3RzID0gLTE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZSguLi5hcmdzKSB7XG4gICAgbGV0IHJlc29sdmVkUGF0aCA9ICcnO1xuICAgIGxldCByZXNvbHZlZEFic29sdXRlID0gZmFsc2U7XG4gICAgbGV0IGN3ZDtcbiAgICBmb3IgKGxldCBpID0gYXJncy5sZW5ndGggLSAxOyBpID49IC0xICYmICFyZXNvbHZlZEFic29sdXRlOyBpLS0pIHtcbiAgICAgICAgbGV0IHBhdGg7XG4gICAgICAgIGlmIChpID49IDApXG4gICAgICAgICAgICBwYXRoID0gYXJnc1tpXTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoY3dkID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgY3dkID0gY3VycmVudFdvcmtpbmdEaXI7XG4gICAgICAgICAgICBwYXRoID0gY3dkO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNraXAgZW1wdHkgZW50cmllc1xuICAgICAgICBpZiAocGF0aC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmVkUGF0aCA9IHBhdGggKyAnLycgKyByZXNvbHZlZFBhdGg7XG4gICAgICAgIHJlc29sdmVkQWJzb2x1dGUgPSBwYXRoLmNoYXJDb2RlQXQoMCkgPT09IDQ3OyAvKi8qL1xuICAgIH1cbiAgICAvLyBBdCB0aGlzIHBvaW50IHRoZSBwYXRoIHNob3VsZCBiZSByZXNvbHZlZCB0byBhIGZ1bGwgYWJzb2x1dGUgcGF0aCwgYnV0XG4gICAgLy8gaGFuZGxlIHJlbGF0aXZlIHBhdGhzIHRvIGJlIHNhZmUgKG1pZ2h0IGhhcHBlbiB3aGVuIHByb2Nlc3MuY3dkKCkgZmFpbHMpXG4gICAgLy8gTm9ybWFsaXplIHRoZSBwYXRoXG4gICAgcmVzb2x2ZWRQYXRoID0gbm9ybWFsaXplU3RyaW5nUG9zaXgocmVzb2x2ZWRQYXRoLCAhcmVzb2x2ZWRBYnNvbHV0ZSk7XG4gICAgaWYgKHJlc29sdmVkQWJzb2x1dGUpIHtcbiAgICAgICAgaWYgKHJlc29sdmVkUGF0aC5sZW5ndGggPiAwKVxuICAgICAgICAgICAgcmV0dXJuICcvJyArIHJlc29sdmVkUGF0aDtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuICcvJztcbiAgICB9XG4gICAgZWxzZSBpZiAocmVzb2x2ZWRQYXRoLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIHJlc29sdmVkUGF0aDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiAnLic7XG4gICAgfVxufVxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmV4cG9ydCBmdW5jdGlvbiBkaXJuYW1lKHBhdGgpIHtcbiAgICBpZiAocGF0aC5sZW5ndGggPT09IDApXG4gICAgICAgIHJldHVybiAnLic7XG4gICAgbGV0IGNvZGUgPSBwYXRoLmNoYXJDb2RlQXQoMCk7XG4gICAgY29uc3QgaGFzUm9vdCA9IGNvZGUgPT09IDQ3OyAvKi8qL1xuICAgIGxldCBlbmQgPSAtMTtcbiAgICBsZXQgbWF0Y2hlZFNsYXNoID0gdHJ1ZTtcbiAgICBmb3IgKGxldCBpID0gcGF0aC5sZW5ndGggLSAxOyBpID49IDE7IC0taSkge1xuICAgICAgICBjb2RlID0gcGF0aC5jaGFyQ29kZUF0KGkpO1xuICAgICAgICBpZiAoY29kZSA9PT0gNDcgLyovKi8pIHtcbiAgICAgICAgICAgIGlmICghbWF0Y2hlZFNsYXNoKSB7XG4gICAgICAgICAgICAgICAgZW5kID0gaTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIFdlIHNhdyB0aGUgZmlyc3Qgbm9uLXBhdGggc2VwYXJhdG9yXG4gICAgICAgICAgICBtYXRjaGVkU2xhc2ggPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoZW5kID09PSAtMSlcbiAgICAgICAgcmV0dXJuIGhhc1Jvb3QgPyAnLycgOiAnLic7XG4gICAgaWYgKGhhc1Jvb3QgJiYgZW5kID09PSAxKVxuICAgICAgICByZXR1cm4gJy8vJztcbiAgICByZXR1cm4gcGF0aC5zbGljZSgwLCBlbmQpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVDb21wb3NpdGUocGF0aCwgY3dkKSB7XG4gICAgY29uc3QgYWJzb2x1dGVQYXRoID0gcGF0aC5zdGFydHNXaXRoKCcuJykgPyByZXNvbHZlKGN3ZCwgcGF0aCkgOiByZXNvbHZlKHBhdGgpO1xuICAgIHJldHVybiBhYnNvbHV0ZVBhdGguc3Vic3RyaW5nKDEpO1xufVxuIiwgImltcG9ydCB7IGNvbXBvbmVudERlZmluaXRpb25CeU5hbWUgfSBmcm9tICcuLi9jb21wb25lbnRzJztcbmltcG9ydCB7IGNvbXBvbmVudE51bWJlckZyb21OYW1lIH0gZnJvbSAnLi4vY29tcG9uZW50cy9jb21wb25lbnQtbnVtYmVyJztcbmltcG9ydCB7IFNjaGVtYXMgfSBmcm9tICcuLi9zY2hlbWFzJztcbmltcG9ydCB7IFJlYWRXcml0ZUJ5dGVCdWZmZXIgfSBmcm9tICcuLi9zZXJpYWxpemF0aW9uL0J5dGVCdWZmZXInO1xuaW1wb3J0IHsgZ2V0Q29tcG9zaXRlUm9vdENvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJy4vcGF0aCc7XG4vKiogQHB1YmxpYyAqL1xuLyogQF9fUFVSRV9fICovXG5leHBvcnQgdmFyIEVudGl0eU1hcHBpbmdNb2RlO1xuKGZ1bmN0aW9uIChFbnRpdHlNYXBwaW5nTW9kZSkge1xuICAgIEVudGl0eU1hcHBpbmdNb2RlW0VudGl0eU1hcHBpbmdNb2RlW1wiRU1NX05PTkVcIl0gPSAwXSA9IFwiRU1NX05PTkVcIjtcbiAgICBFbnRpdHlNYXBwaW5nTW9kZVtFbnRpdHlNYXBwaW5nTW9kZVtcIkVNTV9ORVhUX0FWQUlMQUJMRVwiXSA9IDFdID0gXCJFTU1fTkVYVF9BVkFJTEFCTEVcIjtcbiAgICBFbnRpdHlNYXBwaW5nTW9kZVtFbnRpdHlNYXBwaW5nTW9kZVtcIkVNTV9ESVJFQ1RfTUFQUElOR1wiXSA9IDJdID0gXCJFTU1fRElSRUNUX01BUFBJTkdcIjtcbn0pKEVudGl0eU1hcHBpbmdNb2RlIHx8IChFbnRpdHlNYXBwaW5nTW9kZSA9IHt9KSk7XG4vKipcbiAqIFJldHVybiB0aGUgY29tcG9uZW50IHZhbHVlIGZyb20gY29tcG9zaXRlIGRhdGFcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29tcG9uZW50VmFsdWUoY29tcG9uZW50RGVmaW5pdGlvbiwgY29tcG9uZW50KSB7XG4gICAgaWYgKGNvbXBvbmVudC5kYXRhPy4kY2FzZSA9PT0gJ2pzb24nKSB7XG4gICAgICAgIHJldHVybiBjb21wb25lbnQuZGF0YS5qc29uO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudERlZmluaXRpb24uc2NoZW1hLmRlc2VyaWFsaXplKG5ldyBSZWFkV3JpdGVCeXRlQnVmZmVyKGNvbXBvbmVudC5kYXRhPy5iaW5hcnkpKTtcbiAgICB9XG59XG4vKipcbiAqIFJldHVybiB0aGUgY29tcG9uZW50IGRlZmluaXRpb24gZnJvbSBjb21wb3NpdGUgaW5mb1xuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb21wb25lbnREZWZpbml0aW9uKGVuZ2luZSwgY29tcG9uZW50KSB7XG4gICAgY29uc3QgZXhpc3RpbmdDb21wb25lbnREZWZpbml0aW9uID0gZW5naW5lLmdldENvbXBvbmVudE9yTnVsbChjb21wb25lbnQubmFtZSk7XG4gICAgaWYgKCFleGlzdGluZ0NvbXBvbmVudERlZmluaXRpb24pIHtcbiAgICAgICAgaWYgKGNvbXBvbmVudC5uYW1lLnN0YXJ0c1dpdGgoJ2NvcmU6OicpKSB7XG4gICAgICAgICAgICBpZiAoY29tcG9uZW50Lm5hbWUgaW4gY29tcG9uZW50RGVmaW5pdGlvbkJ5TmFtZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb21wb25lbnREZWZpbml0aW9uQnlOYW1lW2NvbXBvbmVudC5uYW1lXShlbmdpbmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgY29yZSBjb21wb25lbnQgJHtjb21wb25lbnQubmFtZX0gd2FzIG5vdCBmb3VuZC5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjb21wb25lbnQuanNvblNjaGVtYSkge1xuICAgICAgICAgICAgcmV0dXJuIGVuZ2luZS5kZWZpbmVDb21wb25lbnRGcm9tU2NoZW1hKGNvbXBvbmVudC5uYW1lLCBTY2hlbWFzLmZyb21Kc29uKGNvbXBvbmVudC5qc29uU2NoZW1hKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7Y29tcG9uZW50Lm5hbWV9IGlzIG5vdCBkZWZpbmVkIGFuZCB0aGVyZSBpcyBubyBzY2hlbWEgdG8gZGVmaW5lIGl0LmApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gZXhpc3RpbmdDb21wb25lbnREZWZpbml0aW9uO1xuICAgIH1cbn1cbi8qKlxuICogUmV0dXJuIHRoZSBlbnRpdHkgbWFwcGluZyBvciBmYWlsIGlmIHRoZXJlIGlzIG5vIG1vcmVcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RW50aXR5TWFwcGluZyhlbmdpbmUsIGNvbXBvc2l0ZUVudGl0eSwgbWFwcGVkRW50aXRpZXMsIHsgZW50aXR5TWFwcGluZyB9KSB7XG4gICAgY29uc3QgZXhpc3RpbmdFbnRpdHkgPSBtYXBwZWRFbnRpdGllcy5nZXQoY29tcG9zaXRlRW50aXR5KTtcbiAgICBpZiAoZXhpc3RpbmdFbnRpdHkpIHtcbiAgICAgICAgcmV0dXJuIGV4aXN0aW5nRW50aXR5O1xuICAgIH1cbiAgICBpZiAoZW50aXR5TWFwcGluZz8udHlwZSA9PT0gRW50aXR5TWFwcGluZ01vZGUuRU1NX0RJUkVDVF9NQVBQSU5HKSB7XG4gICAgICAgIGNvbnN0IGVudGl0eSA9IGVudGl0eU1hcHBpbmcuZ2V0Q29tcG9zaXRlRW50aXR5KGNvbXBvc2l0ZUVudGl0eSk7XG4gICAgICAgIG1hcHBlZEVudGl0aWVzLnNldChjb21wb3NpdGVFbnRpdHksIGVudGl0eSk7XG4gICAgICAgIHJldHVybiBlbnRpdHk7XG4gICAgfVxuICAgIC8vIFRoaXMgZnVuY3Rpb24gaW4gcnVudGltZSBjYW4gYmUganVzdCBgZW5naW5lLmFkZEVudGl0eSgpYFxuICAgIGNvbnN0IG5ld0VudGl0eSA9IGVudGl0eU1hcHBpbmc/LnR5cGUgPT09IEVudGl0eU1hcHBpbmdNb2RlLkVNTV9ORVhUX0FWQUlMQUJMRVxuICAgICAgICA/IGVudGl0eU1hcHBpbmcuZ2V0TmV4dEF2YWlsYWJsZUVudGl0eSgpXG4gICAgICAgIDogZW5naW5lLmFkZEVudGl0eSgpO1xuICAgIGlmIChuZXdFbnRpdHkgPT09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGVyZSBpcyBubyBtb3JlIGVudGl0aWVzIHRvIGFsbG9jYXRlJyk7XG4gICAgfVxuICAgIG1hcHBlZEVudGl0aWVzLnNldChjb21wb3NpdGVFbnRpdHksIG5ld0VudGl0eSk7XG4gICAgcmV0dXJuIG5ld0VudGl0eTtcbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbi8qIEBfX1BVUkVfXyAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluc3RhbmNlQ29tcG9zaXRlKGVuZ2luZSwgY29tcG9zaXRlUmVzb3VyY2UsIGNvbXBvc2l0ZVByb3ZpZGVyLCBvcHRpb25zKSB7XG4gICAgY29uc3QgeyByb290RW50aXR5LCBhbHJlYWR5UmVxdWVzdGVkU3JjOiBvcHRpb25hbEFscmVhZHlSZXF1ZXN0ZWRTcmMsIGVudGl0eU1hcHBpbmcgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgYWxyZWFkeVJlcXVlc3RlZFNyYyA9IG9wdGlvbmFsQWxyZWFkeVJlcXVlc3RlZFNyYyB8fCBuZXcgU2V0KCk7XG4gICAgY29uc3QgY29tcG9zaXRlRGlyZWN0b3J5UGF0aCA9IHBhdGguZGlybmFtZShwYXRoLnJlc29sdmUoY29tcG9zaXRlUmVzb3VyY2Uuc3JjKSk7XG4gICAgY29uc3QgVHJhbnNmb3JtQ29tcG9uZW50TnVtYmVyID0gY29tcG9uZW50TnVtYmVyRnJvbU5hbWUoJ2NvcmU6OlRyYW5zZm9ybScpO1xuICAgIGNvbnN0IENvbXBvc2l0ZVJvb3RDb21wb25lbnQgPSBnZXRDb21wb3NpdGVSb290Q29tcG9uZW50KGVuZ2luZSk7XG4gICAgLy8gS2V5ID0+IEVudGl0eU51bWJlciBmcm9tIHRoZSBjb21wb3NpdGVcbiAgICAvLyBWYWx1ZSA9PiBFbnRpdHlOdW1iZXIgaW4gY3VycmVudCBlbmdpbmVcbiAgICBjb25zdCBtYXBwZWRFbnRpdGllcyA9IG5ldyBNYXAoKTtcbiAgICBjb25zdCBnZXRDb21wb3NpdGVFbnRpdHkgPSAoY29tcG9zaXRlRW50aXR5KSA9PiBnZXRFbnRpdHlNYXBwaW5nKGVuZ2luZSwgY29tcG9zaXRlRW50aXR5LCBtYXBwZWRFbnRpdGllcywgb3B0aW9ucyk7XG4gICAgLy8gIyMgMSAjI1xuICAgIC8vIEZpcnN0IGVudGl0eSB0aGF0IEkgd2FudCB0byBtYXAsIHRoZSByb290IGVudGl0eSBmcm9tIHRoZSBjb21wb3NpdGUgdG8gdGhlIHRhcmdldCBlbnRpdHkgaW4gdGhlIGVuZ2luZVxuICAgIC8vIElmIHRoZXJlIGlzIG5vIGByb290RW50aXR5YCBwYXNzZWQsIHdlIGFzc2lnbiBvbmUgZnJvbSBgZ2V0TmV4dEF2YWlsYWJsZUVudGl0eWBcbiAgICBjb25zdCBjb21wb3NpdGVSb290RW50aXR5ID0gcm9vdEVudGl0eSA/PyBnZXRDb21wb3NpdGVFbnRpdHkoMCk7XG4gICAgaWYgKHJvb3RFbnRpdHkpIHtcbiAgICAgICAgbWFwcGVkRW50aXRpZXMuc2V0KDAsIHJvb3RFbnRpdHkpO1xuICAgIH1cbiAgICAvLyAjIyAyICMjXG4gICAgLy8gSWYgdGhlcmUgYXJlIG1vcmUgY29tcG9zaXRlIGluc2lkZSB0aGlzIG9uZSwgd2UgaW5zdGFuY2UgZmlyc3QuXG4gICAgLy8gPT4gVGhpcyBpcyBub3Qgb25seSBhIGNvcHksIHdlIG5lZWQgdG8gaW5zdGFuY2UuIE90aGVyd2lzZSwgd2UnZCBiZSBtaXNzaW5nIHRoYXQgYnJhbmNoZXNcbiAgICAvLyA9PiBUT0RPOiBpbiB0aGUgZnV0dXJlLCB0aGUgaW5zdGFuY2lhdGlvbiBpcyBmaXJzdCwgdGhlbiB0aGUgb3ZlcmlkZXMgKHRvIHBhcmFtZXRlcml6ZSBDb21wb3NpdGUsIGUuZy4gaG91c2Ugd2l0aCBkaWZmZXJlbnQgd2FsbCBjb2xvcnMpXG4gICAgY29uc3QgY2hpbGRyZW5Db21wb3NpdGUgPSBjb21wb3NpdGVSZXNvdXJjZS5jb21wb3NpdGUuY29tcG9uZW50cy5maW5kKChpdGVtKSA9PiBpdGVtLm5hbWUgPT09IENvbXBvc2l0ZVJvb3RDb21wb25lbnQuY29tcG9uZW50TmFtZSk7XG4gICAgaWYgKGNoaWxkcmVuQ29tcG9zaXRlKSB7XG4gICAgICAgIGZvciAoY29uc3QgW2NoaWxkQ29tcG9zaXRlRW50aXR5LCBjb21wb3NpdGVSYXdEYXRhXSBvZiBjaGlsZHJlbkNvbXBvc2l0ZS5kYXRhKSB7XG4gICAgICAgICAgICBjb25zdCBjaGlsZENvbXBvc2l0ZSA9IGdldENvbXBvbmVudFZhbHVlKENvbXBvc2l0ZVJvb3RDb21wb25lbnQsIGNvbXBvc2l0ZVJhd0RhdGEpO1xuICAgICAgICAgICAgY29uc3QgY2hpbGRDb21wb3NpdGVQYXRoID0gcGF0aC5yZXNvbHZlQ29tcG9zaXRlKGNoaWxkQ29tcG9zaXRlLnNyYywgY29tcG9zaXRlRGlyZWN0b3J5UGF0aCk7XG4gICAgICAgICAgICBjb25zdCBjaGlsZENvbXBvc2l0ZVJlc291cmNlID0gY29tcG9zaXRlUHJvdmlkZXIuZ2V0Q29tcG9zaXRlT3JOdWxsKGNoaWxkQ29tcG9zaXRlUGF0aCk7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXRFbnRpdHkgPSBnZXRDb21wb3NpdGVFbnRpdHkoY2hpbGRDb21wb3NpdGVFbnRpdHkpO1xuICAgICAgICAgICAgaWYgKGNoaWxkQ29tcG9zaXRlUmVzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoYWxyZWFkeVJlcXVlc3RlZFNyYy5oYXMoY2hpbGRDb21wb3NpdGVSZXNvdXJjZS5zcmMpIHx8XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkQ29tcG9zaXRlUmVzb3VyY2Uuc3JjID09PSBjb21wb3NpdGVSZXNvdXJjZS5zcmMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb21wb3NpdGUgJHtjb21wb3NpdGVSZXNvdXJjZS5zcmN9IGhhcyBhIHJlY3Vyc2l2ZSBpbnN0YW5jaWF0aW9uIHdoaWxlIHRyeSB0byBpbnN0YW5jZSAke2NoaWxkQ29tcG9zaXRlUmVzb3VyY2Uuc3JjfS4gUHJldmlvdXMgaW5zdGFuY2VzOiAke2FscmVhZHlSZXF1ZXN0ZWRTcmMudG9TdHJpbmcoKX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaW5zdGFuY2VDb21wb3NpdGUoZW5naW5lLCBjaGlsZENvbXBvc2l0ZVJlc291cmNlLCBjb21wb3NpdGVQcm92aWRlciwge1xuICAgICAgICAgICAgICAgICAgICByb290RW50aXR5OiB0YXJnZXRFbnRpdHksXG4gICAgICAgICAgICAgICAgICAgIGFscmVhZHlSZXF1ZXN0ZWRTcmM6IG5ldyBTZXQoYWxyZWFkeVJlcXVlc3RlZFNyYykuYWRkKGNoaWxkQ29tcG9zaXRlUmVzb3VyY2Uuc3JjKSxcbiAgICAgICAgICAgICAgICAgICAgZW50aXR5TWFwcGluZzogZW50aXR5TWFwcGluZz8udHlwZSA9PT0gRW50aXR5TWFwcGluZ01vZGUuRU1NX05FWFRfQVZBSUxBQkxFID8gZW50aXR5TWFwcGluZyA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vICMjIDMgIyNcbiAgICAvLyBUaGVuLCB3ZSBjb3B5IHRoZSBhbGwgcmVzdCBvZiB0aGUgY29tcG9uZW50cyAoc2tpcHBpbmcgdGhlIENvbXBvc2l0ZSBvbmVzKVxuICAgIGZvciAoY29uc3QgY29tcG9uZW50IG9mIGNvbXBvc2l0ZVJlc291cmNlLmNvbXBvc2l0ZS5jb21wb25lbnRzKSB7XG4gICAgICAgIC8vIFdlIGFscmVhZHkgaW5zdGFuY2VkIHRoZSBjb21wb3NpdGVcbiAgICAgICAgaWYgKGNvbXBvbmVudC5uYW1lID09PSBDb21wb3NpdGVSb290Q29tcG9uZW50LmNvbXBvbmVudE5hbWUpXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgLy8gIyMgM2EgIyNcbiAgICAgICAgLy8gV2UgZmluZCB0aGUgY29tcG9uZW50IGRlZmluaXRpb25cbiAgICAgICAgY29uc3QgY29tcG9uZW50RGVmaW5pdGlvbiA9IGdldENvbXBvbmVudERlZmluaXRpb24oZW5naW5lLCBjb21wb25lbnQpO1xuICAgICAgICAvLyAjIyAzYiAjI1xuICAgICAgICAvLyBJdGVyYXRpbmcgb3ZlciBhbGwgdGhlIGVudGl0aWVzIHdpdGggdGhpcyBjb21wb25lbnQgYW5kIGNyZWF0ZSB0aGUgcmVwbGljYVxuICAgICAgICBmb3IgKGNvbnN0IFtlbnRpdHksIGNvbXBvc2l0ZUNvbXBvbmVudFZhbHVlXSBvZiBjb21wb25lbnQuZGF0YSkge1xuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50VmFsdWVEZXNlcmlhbGl6ZWQgPSBnZXRDb21wb25lbnRWYWx1ZShjb21wb25lbnREZWZpbml0aW9uLCBjb21wb3NpdGVDb21wb25lbnRWYWx1ZSk7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXRFbnRpdHkgPSBnZXRDb21wb3NpdGVFbnRpdHkoZW50aXR5KTtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudFZhbHVlID0gY29tcG9uZW50RGVmaW5pdGlvbi5jcmVhdGUodGFyZ2V0RW50aXR5LCBjb21wb25lbnRWYWx1ZURlc2VyaWFsaXplZCk7XG4gICAgICAgICAgICAvLyAjIyAzYyAjI1xuICAgICAgICAgICAgLy8gQWxsIGVudGl0aWVzIHJlZmVyZW5jZWQgaW4gdGhlIGNvbXBvc2l0ZSBwcm9iYWJseSBoYXMgYSBkaWZmZXJlbnQgcmVzb2x2ZWQgRW50aXR5TnVtYmVyXG4gICAgICAgICAgICAvLyBXZSdsbCBrbm93IHdpdGggdGhlIG1hcHBlZEVudGl0eWVzXG4gICAgICAgICAgICBpZiAoY29tcG9uZW50RGVmaW5pdGlvbi5jb21wb25lbnRJZCA9PT0gVHJhbnNmb3JtQ29tcG9uZW50TnVtYmVyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdHJhbnNmb3JtID0gY29tcG9uZW50VmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybS5wYXJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtLnBhcmVudCA9IGdldENvbXBvc2l0ZUVudGl0eSh0cmFuc2Zvcm0ucGFyZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybS5wYXJlbnQgPSBnZXRDb21wb3NpdGVFbnRpdHkoMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFRPRE86IGlzIGl0IGdvaW5nIHRvIGJlIG5lY2Vzc2FyeSB0byByZW1hcCBhc3NldHM/IGUuZy4gc3JjIHBhcmFtIGZyb20gQXVkaW9Tb3VyY2UgYW5kIEdsdGZDb250YWluZXJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIFNjaGVtYXMubXV0YXRlTmVzdGVkVmFsdWVzKGNvbXBvbmVudERlZmluaXRpb24uc2NoZW1hLmpzb25TY2hlbWEsIGNvbXBvbmVudFZhbHVlLCAodmFsdWUsIHZhbHVlVHlwZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWVUeXBlLnNlcmlhbGl6YXRpb25UeXBlID09PSAnZW50aXR5Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgY2hhbmdlZDogdHJ1ZSwgdmFsdWU6IGdldENvbXBvc2l0ZUVudGl0eSh2YWx1ZSkgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGNoYW5nZWQ6IGZhbHNlIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBjb21wb3NpdGUgPSBDb21wb3NpdGVSb290Q29tcG9uZW50LmdldE11dGFibGVPck51bGwoY29tcG9zaXRlUm9vdEVudGl0eSkgfHwgQ29tcG9zaXRlUm9vdENvbXBvbmVudC5jcmVhdGUoY29tcG9zaXRlUm9vdEVudGl0eSk7XG4gICAgZm9yIChjb25zdCBbZW50aXR5U291cmNlLCB0YXJnZXRFbnRpdHldIG9mIG1hcHBlZEVudGl0aWVzKSB7XG4gICAgICAgIGNvbXBvc2l0ZS5lbnRpdGllcy5wdXNoKHtcbiAgICAgICAgICAgIHNyYzogZW50aXR5U291cmNlLFxuICAgICAgICAgICAgZGVzdDogdGFyZ2V0RW50aXR5XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjb21wb3NpdGUuc3JjID0gY29tcG9zaXRlUmVzb3VyY2Uuc3JjO1xuICAgIHJldHVybiBjb21wb3NpdGVSb290RW50aXR5O1xufVxuIiwgIi8qIGVzbGludC1kaXNhYmxlICovXG5pbXBvcnQgX20wIGZyb20gXCJwcm90b2J1ZmpzL21pbmltYWxcIjtcbmltcG9ydCB7IFZhbHVlIH0gZnJvbSBcIi4vZ29vZ2xlL3Byb3RvYnVmL3N0cnVjdC5nZW5cIjtcbmNvbnN0IHByb3RvYnVmUGFja2FnZVNhcmFzYSA9IFwiXCI7XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ29tcG9uZW50RGF0YSgpIHtcbiAgICByZXR1cm4geyBkYXRhOiB1bmRlZmluZWQgfTtcbn1cbi8qKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdmFyIENvbXBvbmVudERhdGE7XG4oZnVuY3Rpb24gKENvbXBvbmVudERhdGEpIHtcbiAgICBmdW5jdGlvbiBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gX20wLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBzd2l0Y2ggKG1lc3NhZ2UuZGF0YT8uJGNhc2UpIHtcbiAgICAgICAgICAgIGNhc2UgXCJqc29uXCI6XG4gICAgICAgICAgICAgICAgVmFsdWUuZW5jb2RlKFZhbHVlLndyYXAobWVzc2FnZS5kYXRhLmpzb24pLCB3cml0ZXIudWludDMyKDEwKS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcImJpbmFyeVwiOlxuICAgICAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTgpLmJ5dGVzKG1lc3NhZ2UuZGF0YS5iaW5hcnkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxuICAgIENvbXBvbmVudERhdGEuZW5jb2RlID0gZW5jb2RlO1xuICAgIGZ1bmN0aW9uIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgX20wLlJlYWRlciA/IGlucHV0IDogX20wLlJlYWRlci5jcmVhdGUoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDb21wb25lbnREYXRhKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMTApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZGF0YSA9IHsgJGNhc2U6IFwianNvblwiLCBqc29uOiBWYWx1ZS51bndyYXAoVmFsdWUuZGVjb2RlKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpKSkgfTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSAxOCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5kYXRhID0geyAkY2FzZTogXCJiaW5hcnlcIiwgYmluYXJ5OiByZWFkZXIuYnl0ZXMoKSB9O1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgodGFnICYgNykgPT09IDQgfHwgdGFnID09PSAwKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIENvbXBvbmVudERhdGEuZGVjb2RlID0gZGVjb2RlO1xuICAgIGZ1bmN0aW9uIGZyb21KU09OKG9iamVjdCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGF0YTogaXNTZXQob2JqZWN0Lmpzb24pXG4gICAgICAgICAgICAgICAgPyB7ICRjYXNlOiBcImpzb25cIiwganNvbjogb2JqZWN0Lmpzb24gfVxuICAgICAgICAgICAgICAgIDogaXNTZXQob2JqZWN0LmJpbmFyeSlcbiAgICAgICAgICAgICAgICAgICAgPyB7ICRjYXNlOiBcImJpbmFyeVwiLCBiaW5hcnk6IGJ5dGVzRnJvbUJhc2U2NChvYmplY3QuYmluYXJ5KSB9XG4gICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBDb21wb25lbnREYXRhLmZyb21KU09OID0gZnJvbUpTT047XG4gICAgZnVuY3Rpb24gdG9KU09OKG1lc3NhZ2UpIHtcbiAgICAgICAgY29uc3Qgb2JqID0ge307XG4gICAgICAgIG1lc3NhZ2UuZGF0YT8uJGNhc2UgPT09IFwianNvblwiICYmIChvYmouanNvbiA9IG1lc3NhZ2UuZGF0YT8uanNvbik7XG4gICAgICAgIG1lc3NhZ2UuZGF0YT8uJGNhc2UgPT09IFwiYmluYXJ5XCIgJiZcbiAgICAgICAgICAgIChvYmouYmluYXJ5ID0gbWVzc2FnZS5kYXRhPy5iaW5hcnkgIT09IHVuZGVmaW5lZCA/IGJhc2U2NEZyb21CeXRlcyhtZXNzYWdlLmRhdGE/LmJpbmFyeSkgOiB1bmRlZmluZWQpO1xuICAgICAgICByZXR1cm4gb2JqO1xuICAgIH1cbiAgICBDb21wb25lbnREYXRhLnRvSlNPTiA9IHRvSlNPTjtcbn0pKENvbXBvbmVudERhdGEgfHwgKENvbXBvbmVudERhdGEgPSB7fSkpO1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNvbXBvc2l0ZUNvbXBvbmVudCgpIHtcbiAgICByZXR1cm4geyBuYW1lOiBcIlwiLCBqc29uU2NoZW1hOiB1bmRlZmluZWQsIGRhdGE6IG5ldyBNYXAoKSB9O1xufVxuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB2YXIgQ29tcG9zaXRlQ29tcG9uZW50O1xuKGZ1bmN0aW9uIChDb21wb3NpdGVDb21wb25lbnQpIHtcbiAgICBmdW5jdGlvbiBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gX20wLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5uYW1lICE9PSBcIlwiKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDEwKS5zdHJpbmcobWVzc2FnZS5uYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5qc29uU2NoZW1hICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIFZhbHVlLmVuY29kZShWYWx1ZS53cmFwKG1lc3NhZ2UuanNvblNjaGVtYSksIHdyaXRlci51aW50MzIoMTgpLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgIH1cbiAgICAgICAgKG1lc3NhZ2UuZGF0YSkuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICAgICAgQ29tcG9zaXRlQ29tcG9uZW50X0RhdGFFbnRyeS5lbmNvZGUoeyBrZXk6IGtleSwgdmFsdWUgfSwgd3JpdGVyLnVpbnQzMigyNikuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxuICAgIENvbXBvc2l0ZUNvbXBvbmVudC5lbmNvZGUgPSBlbmNvZGU7XG4gICAgZnVuY3Rpb24gZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBfbTAuUmVhZGVyID8gaW5wdXQgOiBfbTAuUmVhZGVyLmNyZWF0ZShpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNvbXBvc2l0ZUNvbXBvbmVudCgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDEwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm5hbWUgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMTgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuanNvblNjaGVtYSA9IFZhbHVlLnVud3JhcChWYWx1ZS5kZWNvZGUocmVhZGVyLCByZWFkZXIudWludDMyKCkpKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSAyNikge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW50cnkzID0gQ29tcG9zaXRlQ29tcG9uZW50X0RhdGFFbnRyeS5kZWNvZGUocmVhZGVyLCByZWFkZXIudWludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZW50cnkzLnZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZGF0YS5zZXQoZW50cnkzLmtleSwgZW50cnkzLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgodGFnICYgNykgPT09IDQgfHwgdGFnID09PSAwKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIENvbXBvc2l0ZUNvbXBvbmVudC5kZWNvZGUgPSBkZWNvZGU7XG4gICAgZnVuY3Rpb24gZnJvbUpTT04ob2JqZWN0KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiBpc1NldChvYmplY3QubmFtZSkgPyBTdHJpbmcob2JqZWN0Lm5hbWUpIDogXCJcIixcbiAgICAgICAgICAgIGpzb25TY2hlbWE6IGlzU2V0KG9iamVjdD8uanNvblNjaGVtYSkgPyBvYmplY3QuanNvblNjaGVtYSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGRhdGE6IGlzT2JqZWN0KG9iamVjdC5kYXRhKVxuICAgICAgICAgICAgICAgID8gT2JqZWN0LmVudHJpZXMob2JqZWN0LmRhdGEpLnJlZHVjZSgoYWNjLCBba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYWNjLnNldChOdW1iZXIoa2V5KSwgQ29tcG9uZW50RGF0YS5mcm9tSlNPTih2YWx1ZSkpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICAgICAgICAgIH0sIG5ldyBNYXAoKSlcbiAgICAgICAgICAgICAgICA6IG5ldyBNYXAoKSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgQ29tcG9zaXRlQ29tcG9uZW50LmZyb21KU09OID0gZnJvbUpTT047XG4gICAgZnVuY3Rpb24gdG9KU09OKG1lc3NhZ2UpIHtcbiAgICAgICAgY29uc3Qgb2JqID0ge307XG4gICAgICAgIG1lc3NhZ2UubmFtZSAhPT0gdW5kZWZpbmVkICYmIChvYmoubmFtZSA9IG1lc3NhZ2UubmFtZSk7XG4gICAgICAgIG1lc3NhZ2UuanNvblNjaGVtYSAhPT0gdW5kZWZpbmVkICYmIChvYmouanNvblNjaGVtYSA9IG1lc3NhZ2UuanNvblNjaGVtYSk7XG4gICAgICAgIG9iai5kYXRhID0ge307XG4gICAgICAgIGlmIChtZXNzYWdlLmRhdGEpIHtcbiAgICAgICAgICAgIG1lc3NhZ2UuZGF0YS5mb3JFYWNoKCh2LCBrKSA9PiB7XG4gICAgICAgICAgICAgICAgb2JqLmRhdGFba10gPSBDb21wb25lbnREYXRhLnRvSlNPTih2KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuICAgIENvbXBvc2l0ZUNvbXBvbmVudC50b0pTT04gPSB0b0pTT047XG59KShDb21wb3NpdGVDb21wb25lbnQgfHwgKENvbXBvc2l0ZUNvbXBvbmVudCA9IHt9KSk7XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ29tcG9zaXRlQ29tcG9uZW50X0RhdGFFbnRyeSgpIHtcbiAgICByZXR1cm4geyBrZXk6IDAsIHZhbHVlOiB1bmRlZmluZWQgfTtcbn1cbi8qKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdmFyIENvbXBvc2l0ZUNvbXBvbmVudF9EYXRhRW50cnk7XG4oZnVuY3Rpb24gKENvbXBvc2l0ZUNvbXBvbmVudF9EYXRhRW50cnkpIHtcbiAgICBmdW5jdGlvbiBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gX20wLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5rZXkgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkuaW50MzIobWVzc2FnZS5rZXkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIENvbXBvbmVudERhdGEuZW5jb2RlKG1lc3NhZ2UudmFsdWUsIHdyaXRlci51aW50MzIoMTgpLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9XG4gICAgQ29tcG9zaXRlQ29tcG9uZW50X0RhdGFFbnRyeS5lbmNvZGUgPSBlbmNvZGU7XG4gICAgZnVuY3Rpb24gZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBfbTAuUmVhZGVyID8gaW5wdXQgOiBfbTAuUmVhZGVyLmNyZWF0ZShpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNvbXBvc2l0ZUNvbXBvbmVudF9EYXRhRW50cnkoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSA4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmtleSA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDE4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnZhbHVlID0gQ29tcG9uZW50RGF0YS5kZWNvZGUocmVhZGVyLCByZWFkZXIudWludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgodGFnICYgNykgPT09IDQgfHwgdGFnID09PSAwKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIENvbXBvc2l0ZUNvbXBvbmVudF9EYXRhRW50cnkuZGVjb2RlID0gZGVjb2RlO1xuICAgIGZ1bmN0aW9uIGZyb21KU09OKG9iamVjdCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAga2V5OiBpc1NldChvYmplY3Qua2V5KSA/IE51bWJlcihvYmplY3Qua2V5KSA6IDAsXG4gICAgICAgICAgICB2YWx1ZTogaXNTZXQob2JqZWN0LnZhbHVlKSA/IENvbXBvbmVudERhdGEuZnJvbUpTT04ob2JqZWN0LnZhbHVlKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgQ29tcG9zaXRlQ29tcG9uZW50X0RhdGFFbnRyeS5mcm9tSlNPTiA9IGZyb21KU09OO1xuICAgIGZ1bmN0aW9uIHRvSlNPTihtZXNzYWdlKSB7XG4gICAgICAgIGNvbnN0IG9iaiA9IHt9O1xuICAgICAgICBtZXNzYWdlLmtleSAhPT0gdW5kZWZpbmVkICYmIChvYmoua2V5ID0gTWF0aC5yb3VuZChtZXNzYWdlLmtleSkpO1xuICAgICAgICBtZXNzYWdlLnZhbHVlICE9PSB1bmRlZmluZWQgJiYgKG9iai52YWx1ZSA9IG1lc3NhZ2UudmFsdWUgPyBDb21wb25lbnREYXRhLnRvSlNPTihtZXNzYWdlLnZhbHVlKSA6IHVuZGVmaW5lZCk7XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuICAgIENvbXBvc2l0ZUNvbXBvbmVudF9EYXRhRW50cnkudG9KU09OID0gdG9KU09OO1xufSkoQ29tcG9zaXRlQ29tcG9uZW50X0RhdGFFbnRyeSB8fCAoQ29tcG9zaXRlQ29tcG9uZW50X0RhdGFFbnRyeSA9IHt9KSk7XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ29tcG9zaXRlRGVmaW5pdGlvbigpIHtcbiAgICByZXR1cm4geyB2ZXJzaW9uOiAwLCBjb21wb25lbnRzOiBbXSB9O1xufVxuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB2YXIgQ29tcG9zaXRlRGVmaW5pdGlvbjtcbihmdW5jdGlvbiAoQ29tcG9zaXRlRGVmaW5pdGlvbikge1xuICAgIGZ1bmN0aW9uIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBfbTAuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLnZlcnNpb24gIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkuaW50MzIobWVzc2FnZS52ZXJzaW9uKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHYgb2YgbWVzc2FnZS5jb21wb25lbnRzKSB7XG4gICAgICAgICAgICBDb21wb3NpdGVDb21wb25lbnQuZW5jb2RlKHYsIHdyaXRlci51aW50MzIoMTgpLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9XG4gICAgQ29tcG9zaXRlRGVmaW5pdGlvbi5lbmNvZGUgPSBlbmNvZGU7XG4gICAgZnVuY3Rpb24gZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBfbTAuUmVhZGVyID8gaW5wdXQgOiBfbTAuUmVhZGVyLmNyZWF0ZShpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNvbXBvc2l0ZURlZmluaXRpb24oKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSA4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnZlcnNpb24gPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSAxOCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5jb21wb25lbnRzLnB1c2goQ29tcG9zaXRlQ29tcG9uZW50LmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSkpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgodGFnICYgNykgPT09IDQgfHwgdGFnID09PSAwKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIENvbXBvc2l0ZURlZmluaXRpb24uZGVjb2RlID0gZGVjb2RlO1xuICAgIGZ1bmN0aW9uIGZyb21KU09OKG9iamVjdCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdmVyc2lvbjogaXNTZXQob2JqZWN0LnZlcnNpb24pID8gTnVtYmVyKG9iamVjdC52ZXJzaW9uKSA6IDAsXG4gICAgICAgICAgICBjb21wb25lbnRzOiBBcnJheS5pc0FycmF5KG9iamVjdD8uY29tcG9uZW50cylcbiAgICAgICAgICAgICAgICA/IG9iamVjdC5jb21wb25lbnRzLm1hcCgoZSkgPT4gQ29tcG9zaXRlQ29tcG9uZW50LmZyb21KU09OKGUpKVxuICAgICAgICAgICAgICAgIDogW10sXG4gICAgICAgIH07XG4gICAgfVxuICAgIENvbXBvc2l0ZURlZmluaXRpb24uZnJvbUpTT04gPSBmcm9tSlNPTjtcbiAgICBmdW5jdGlvbiB0b0pTT04obWVzc2FnZSkge1xuICAgICAgICBjb25zdCBvYmogPSB7fTtcbiAgICAgICAgbWVzc2FnZS52ZXJzaW9uICE9PSB1bmRlZmluZWQgJiYgKG9iai52ZXJzaW9uID0gTWF0aC5yb3VuZChtZXNzYWdlLnZlcnNpb24pKTtcbiAgICAgICAgaWYgKG1lc3NhZ2UuY29tcG9uZW50cykge1xuICAgICAgICAgICAgb2JqLmNvbXBvbmVudHMgPSBtZXNzYWdlLmNvbXBvbmVudHMubWFwKChlKSA9PiBlID8gQ29tcG9zaXRlQ29tcG9uZW50LnRvSlNPTihlKSA6IHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvYmouY29tcG9uZW50cyA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuICAgIENvbXBvc2l0ZURlZmluaXRpb24udG9KU09OID0gdG9KU09OO1xufSkoQ29tcG9zaXRlRGVmaW5pdGlvbiB8fCAoQ29tcG9zaXRlRGVmaW5pdGlvbiA9IHt9KSk7XG5jb25zdCB0c1Byb3RvR2xvYmFsVGhpcyA9ICgoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIHJldHVybiBnbG9iYWxUaGlzO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIHJldHVybiB3aW5kb3c7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIHJldHVybiBnbG9iYWw7XG4gICAgfVxuICAgIHRocm93IFwiVW5hYmxlIHRvIGxvY2F0ZSBnbG9iYWwgb2JqZWN0XCI7XG59KSgpO1xuZnVuY3Rpb24gYnl0ZXNGcm9tQmFzZTY0KGI2NCkge1xuICAgIGlmICh0c1Byb3RvR2xvYmFsVGhpcy5CdWZmZXIpIHtcbiAgICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkuZnJvbSh0c1Byb3RvR2xvYmFsVGhpcy5CdWZmZXIuZnJvbShiNjQsIFwiYmFzZTY0XCIpKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IGJpbiA9IHRzUHJvdG9HbG9iYWxUaGlzLmF0b2IoYjY0KTtcbiAgICAgICAgY29uc3QgYXJyID0gbmV3IFVpbnQ4QXJyYXkoYmluLmxlbmd0aCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmluLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBhcnJbaV0gPSBiaW4uY2hhckNvZGVBdChpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGJhc2U2NEZyb21CeXRlcyhhcnIpIHtcbiAgICBpZiAodHNQcm90b0dsb2JhbFRoaXMuQnVmZmVyKSB7XG4gICAgICAgIHJldHVybiB0c1Byb3RvR2xvYmFsVGhpcy5CdWZmZXIuZnJvbShhcnIpLnRvU3RyaW5nKFwiYmFzZTY0XCIpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgYmluID0gW107XG4gICAgICAgIGFyci5mb3JFYWNoKChieXRlKSA9PiB7XG4gICAgICAgICAgICBiaW4ucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGUpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0c1Byb3RvR2xvYmFsVGhpcy5idG9hKGJpbi5qb2luKFwiXCIpKTtcbiAgICB9XG59XG5mdW5jdGlvbiBpc09iamVjdCh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT09IG51bGw7XG59XG5mdW5jdGlvbiBpc1NldCh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkO1xufVxuIiwgIi8qIGVzbGludC1kaXNhYmxlICovXG5pbXBvcnQgX20wIGZyb20gXCJwcm90b2J1ZmpzL21pbmltYWxcIjtcbmNvbnN0IHByb3RvYnVmUGFja2FnZVNhcmFzYSA9IFwiZ29vZ2xlLnByb3RvYnVmXCI7XG4vKipcbiAqIGBOdWxsVmFsdWVgIGlzIGEgc2luZ2xldG9uIGVudW1lcmF0aW9uIHRvIHJlcHJlc2VudCB0aGUgbnVsbCB2YWx1ZSBmb3IgdGhlXG4gKiBgVmFsdWVgIHR5cGUgdW5pb24uXG4gKlxuICogIFRoZSBKU09OIHJlcHJlc2VudGF0aW9uIGZvciBgTnVsbFZhbHVlYCBpcyBKU09OIGBudWxsYC5cbiAqL1xuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB2YXIgTnVsbFZhbHVlO1xuKGZ1bmN0aW9uIChOdWxsVmFsdWUpIHtcbiAgICAvKiogTlVMTF9WQUxVRSAtIE51bGwgdmFsdWUuICovXG4gICAgTnVsbFZhbHVlW051bGxWYWx1ZVtcIk5VTExfVkFMVUVcIl0gPSAwXSA9IFwiTlVMTF9WQUxVRVwiO1xufSkoTnVsbFZhbHVlIHx8IChOdWxsVmFsdWUgPSB7fSkpO1xuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBudWxsVmFsdWVGcm9tSlNPTihvYmplY3QpIHtcbiAgICBzd2l0Y2ggKG9iamVjdCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgIGNhc2UgXCJOVUxMX1ZBTFVFXCI6XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBOdWxsVmFsdWUuTlVMTF9WQUxVRSAqLztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IG5ldyB0c1Byb3RvR2xvYmFsVGhpcy5FcnJvcihcIlVucmVjb2duaXplZCBlbnVtIHZhbHVlIFwiICsgb2JqZWN0ICsgXCIgZm9yIGVudW0gTnVsbFZhbHVlXCIpO1xuICAgIH1cbn1cbi8qKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gbnVsbFZhbHVlVG9KU09OKG9iamVjdCkge1xuICAgIHN3aXRjaCAob2JqZWN0KSB7XG4gICAgICAgIGNhc2UgMCAvKiBOdWxsVmFsdWUuTlVMTF9WQUxVRSAqLzpcbiAgICAgICAgICAgIHJldHVybiBcIk5VTExfVkFMVUVcIjtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IG5ldyB0c1Byb3RvR2xvYmFsVGhpcy5FcnJvcihcIlVucmVjb2duaXplZCBlbnVtIHZhbHVlIFwiICsgb2JqZWN0ICsgXCIgZm9yIGVudW0gTnVsbFZhbHVlXCIpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNyZWF0ZUJhc2VTdHJ1Y3QoKSB7XG4gICAgcmV0dXJuIHsgZmllbGRzOiBuZXcgTWFwKCkgfTtcbn1cbi8qKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdmFyIFN0cnVjdDtcbihmdW5jdGlvbiAoU3RydWN0KSB7XG4gICAgZnVuY3Rpb24gZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IF9tMC5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgKG1lc3NhZ2UuZmllbGRzKS5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIFN0cnVjdF9GaWVsZHNFbnRyeS5lbmNvZGUoeyBrZXk6IGtleSwgdmFsdWUgfSwgd3JpdGVyLnVpbnQzMigxMCkuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxuICAgIFN0cnVjdC5lbmNvZGUgPSBlbmNvZGU7XG4gICAgZnVuY3Rpb24gZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBfbTAuUmVhZGVyID8gaW5wdXQgOiBfbTAuUmVhZGVyLmNyZWF0ZShpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZVN0cnVjdCgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDEwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbnRyeTEgPSBTdHJ1Y3RfRmllbGRzRW50cnkuZGVjb2RlKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5MS52YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmZpZWxkcy5zZXQoZW50cnkxLmtleSwgZW50cnkxLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgodGFnICYgNykgPT09IDQgfHwgdGFnID09PSAwKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIFN0cnVjdC5kZWNvZGUgPSBkZWNvZGU7XG4gICAgZnVuY3Rpb24gZnJvbUpTT04ob2JqZWN0KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBmaWVsZHM6IGlzT2JqZWN0KG9iamVjdC5maWVsZHMpXG4gICAgICAgICAgICAgICAgPyBPYmplY3QuZW50cmllcyhvYmplY3QuZmllbGRzKS5yZWR1Y2UoKGFjYywgW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGFjYy5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgICAgICAgICAgfSwgbmV3IE1hcCgpKVxuICAgICAgICAgICAgICAgIDogbmV3IE1hcCgpLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBTdHJ1Y3QuZnJvbUpTT04gPSBmcm9tSlNPTjtcbiAgICBmdW5jdGlvbiB0b0pTT04obWVzc2FnZSkge1xuICAgICAgICBjb25zdCBvYmogPSB7fTtcbiAgICAgICAgb2JqLmZpZWxkcyA9IHt9O1xuICAgICAgICBpZiAobWVzc2FnZS5maWVsZHMpIHtcbiAgICAgICAgICAgIG1lc3NhZ2UuZmllbGRzLmZvckVhY2goKHYsIGspID0+IHtcbiAgICAgICAgICAgICAgICBvYmouZmllbGRzW2tdID0gdjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuICAgIFN0cnVjdC50b0pTT04gPSB0b0pTT047XG4gICAgZnVuY3Rpb24gd3JhcChvYmplY3QpIHtcbiAgICAgICAgY29uc3Qgc3RydWN0ID0gY3JlYXRlQmFzZVN0cnVjdCgpO1xuICAgICAgICBpZiAob2JqZWN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKG9iamVjdCkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgc3RydWN0LmZpZWxkcy5zZXQoa2V5LCBvYmplY3Rba2V5XSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RydWN0O1xuICAgIH1cbiAgICBTdHJ1Y3Qud3JhcCA9IHdyYXA7XG4gICAgZnVuY3Rpb24gdW53cmFwKG1lc3NhZ2UpIHtcbiAgICAgICAgY29uc3Qgb2JqZWN0ID0ge307XG4gICAgICAgIFsuLi5tZXNzYWdlLmZpZWxkcy5rZXlzKCldLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgb2JqZWN0W2tleV0gPSBtZXNzYWdlLmZpZWxkcy5nZXQoa2V5KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgfVxuICAgIFN0cnVjdC51bndyYXAgPSB1bndyYXA7XG59KShTdHJ1Y3QgfHwgKFN0cnVjdCA9IHt9KSk7XG5mdW5jdGlvbiBjcmVhdGVCYXNlU3RydWN0X0ZpZWxkc0VudHJ5KCkge1xuICAgIHJldHVybiB7IGtleTogXCJcIiwgdmFsdWU6IHVuZGVmaW5lZCB9O1xufVxuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB2YXIgU3RydWN0X0ZpZWxkc0VudHJ5O1xuKGZ1bmN0aW9uIChTdHJ1Y3RfRmllbGRzRW50cnkpIHtcbiAgICBmdW5jdGlvbiBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gX20wLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5rZXkgIT09IFwiXCIpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTApLnN0cmluZyhtZXNzYWdlLmtleSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UudmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgVmFsdWUuZW5jb2RlKFZhbHVlLndyYXAobWVzc2FnZS52YWx1ZSksIHdyaXRlci51aW50MzIoMTgpLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9XG4gICAgU3RydWN0X0ZpZWxkc0VudHJ5LmVuY29kZSA9IGVuY29kZTtcbiAgICBmdW5jdGlvbiBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIF9tMC5SZWFkZXIgPyBpbnB1dCA6IF9tMC5SZWFkZXIuY3JlYXRlKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlU3RydWN0X0ZpZWxkc0VudHJ5KCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMTApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uua2V5ID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDE4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnZhbHVlID0gVmFsdWUudW53cmFwKFZhbHVlLmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSkpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgodGFnICYgNykgPT09IDQgfHwgdGFnID09PSAwKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIFN0cnVjdF9GaWVsZHNFbnRyeS5kZWNvZGUgPSBkZWNvZGU7XG4gICAgZnVuY3Rpb24gZnJvbUpTT04ob2JqZWN0KSB7XG4gICAgICAgIHJldHVybiB7IGtleTogaXNTZXQob2JqZWN0LmtleSkgPyBTdHJpbmcob2JqZWN0LmtleSkgOiBcIlwiLCB2YWx1ZTogaXNTZXQob2JqZWN0Py52YWx1ZSkgPyBvYmplY3QudmFsdWUgOiB1bmRlZmluZWQgfTtcbiAgICB9XG4gICAgU3RydWN0X0ZpZWxkc0VudHJ5LmZyb21KU09OID0gZnJvbUpTT047XG4gICAgZnVuY3Rpb24gdG9KU09OKG1lc3NhZ2UpIHtcbiAgICAgICAgY29uc3Qgb2JqID0ge307XG4gICAgICAgIG1lc3NhZ2Uua2V5ICE9PSB1bmRlZmluZWQgJiYgKG9iai5rZXkgPSBtZXNzYWdlLmtleSk7XG4gICAgICAgIG1lc3NhZ2UudmFsdWUgIT09IHVuZGVmaW5lZCAmJiAob2JqLnZhbHVlID0gbWVzc2FnZS52YWx1ZSk7XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuICAgIFN0cnVjdF9GaWVsZHNFbnRyeS50b0pTT04gPSB0b0pTT047XG59KShTdHJ1Y3RfRmllbGRzRW50cnkgfHwgKFN0cnVjdF9GaWVsZHNFbnRyeSA9IHt9KSk7XG5mdW5jdGlvbiBjcmVhdGVCYXNlVmFsdWUoKSB7XG4gICAgcmV0dXJuIHsga2luZDogdW5kZWZpbmVkIH07XG59XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHZhciBWYWx1ZTtcbihmdW5jdGlvbiAoVmFsdWUpIHtcbiAgICBmdW5jdGlvbiBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gX20wLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBzd2l0Y2ggKG1lc3NhZ2Uua2luZD8uJGNhc2UpIHtcbiAgICAgICAgICAgIGNhc2UgXCJudWxsVmFsdWVcIjpcbiAgICAgICAgICAgICAgICB3cml0ZXIudWludDMyKDgpLmludDMyKG1lc3NhZ2Uua2luZC5udWxsVmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIm51bWJlclZhbHVlXCI6XG4gICAgICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxNykuZG91YmxlKG1lc3NhZ2Uua2luZC5udW1iZXJWYWx1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwic3RyaW5nVmFsdWVcIjpcbiAgICAgICAgICAgICAgICB3cml0ZXIudWludDMyKDI2KS5zdHJpbmcobWVzc2FnZS5raW5kLnN0cmluZ1ZhbHVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJib29sVmFsdWVcIjpcbiAgICAgICAgICAgICAgICB3cml0ZXIudWludDMyKDMyKS5ib29sKG1lc3NhZ2Uua2luZC5ib29sVmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcInN0cnVjdFZhbHVlXCI6XG4gICAgICAgICAgICAgICAgU3RydWN0LmVuY29kZShTdHJ1Y3Qud3JhcChtZXNzYWdlLmtpbmQuc3RydWN0VmFsdWUpLCB3cml0ZXIudWludDMyKDQyKS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcImxpc3RWYWx1ZVwiOlxuICAgICAgICAgICAgICAgIExpc3RWYWx1ZS5lbmNvZGUoTGlzdFZhbHVlLndyYXAobWVzc2FnZS5raW5kLmxpc3RWYWx1ZSksIHdyaXRlci51aW50MzIoNTApLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9XG4gICAgVmFsdWUuZW5jb2RlID0gZW5jb2RlO1xuICAgIGZ1bmN0aW9uIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgX20wLlJlYWRlciA/IGlucHV0IDogX20wLlJlYWRlci5jcmVhdGUoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VWYWx1ZSgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uua2luZCA9IHsgJGNhc2U6IFwibnVsbFZhbHVlXCIsIG51bGxWYWx1ZTogcmVhZGVyLmludDMyKCkgfTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSAxNykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5raW5kID0geyAkY2FzZTogXCJudW1iZXJWYWx1ZVwiLCBudW1iZXJWYWx1ZTogcmVhZGVyLmRvdWJsZSgpIH07XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPT0gMjYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uua2luZCA9IHsgJGNhc2U6IFwic3RyaW5nVmFsdWVcIiwgc3RyaW5nVmFsdWU6IHJlYWRlci5zdHJpbmcoKSB9O1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT09IDMyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmtpbmQgPSB7ICRjYXNlOiBcImJvb2xWYWx1ZVwiLCBib29sVmFsdWU6IHJlYWRlci5ib29sKCkgfTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSA0Mikge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5raW5kID0geyAkY2FzZTogXCJzdHJ1Y3RWYWx1ZVwiLCBzdHJ1Y3RWYWx1ZTogU3RydWN0LnVud3JhcChTdHJ1Y3QuZGVjb2RlKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpKSkgfTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSA1MCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5raW5kID0geyAkY2FzZTogXCJsaXN0VmFsdWVcIiwgbGlzdFZhbHVlOiBMaXN0VmFsdWUudW53cmFwKExpc3RWYWx1ZS5kZWNvZGUocmVhZGVyLCByZWFkZXIudWludDMyKCkpKSB9O1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgodGFnICYgNykgPT09IDQgfHwgdGFnID09PSAwKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIFZhbHVlLmRlY29kZSA9IGRlY29kZTtcbiAgICBmdW5jdGlvbiBmcm9tSlNPTihvYmplY3QpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGtpbmQ6IGlzU2V0KG9iamVjdC5udWxsVmFsdWUpXG4gICAgICAgICAgICAgICAgPyB7ICRjYXNlOiBcIm51bGxWYWx1ZVwiLCBudWxsVmFsdWU6IG51bGxWYWx1ZUZyb21KU09OKG9iamVjdC5udWxsVmFsdWUpIH1cbiAgICAgICAgICAgICAgICA6IGlzU2V0KG9iamVjdC5udW1iZXJWYWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgPyB7ICRjYXNlOiBcIm51bWJlclZhbHVlXCIsIG51bWJlclZhbHVlOiBOdW1iZXIob2JqZWN0Lm51bWJlclZhbHVlKSB9XG4gICAgICAgICAgICAgICAgICAgIDogaXNTZXQob2JqZWN0LnN0cmluZ1ZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyB7ICRjYXNlOiBcInN0cmluZ1ZhbHVlXCIsIHN0cmluZ1ZhbHVlOiBTdHJpbmcob2JqZWN0LnN0cmluZ1ZhbHVlKSB9XG4gICAgICAgICAgICAgICAgICAgICAgICA6IGlzU2V0KG9iamVjdC5ib29sVmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB7ICRjYXNlOiBcImJvb2xWYWx1ZVwiLCBib29sVmFsdWU6IEJvb2xlYW4ob2JqZWN0LmJvb2xWYWx1ZSkgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogaXNTZXQob2JqZWN0LnN0cnVjdFZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHsgJGNhc2U6IFwic3RydWN0VmFsdWVcIiwgc3RydWN0VmFsdWU6IG9iamVjdC5zdHJ1Y3RWYWx1ZSB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogaXNTZXQob2JqZWN0Lmxpc3RWYWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8geyAkY2FzZTogXCJsaXN0VmFsdWVcIiwgbGlzdFZhbHVlOiBbLi4ub2JqZWN0Lmxpc3RWYWx1ZV0gfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIH07XG4gICAgfVxuICAgIFZhbHVlLmZyb21KU09OID0gZnJvbUpTT047XG4gICAgZnVuY3Rpb24gdG9KU09OKG1lc3NhZ2UpIHtcbiAgICAgICAgY29uc3Qgb2JqID0ge307XG4gICAgICAgIG1lc3NhZ2Uua2luZD8uJGNhc2UgPT09IFwibnVsbFZhbHVlXCIgJiZcbiAgICAgICAgICAgIChvYmoubnVsbFZhbHVlID0gbWVzc2FnZS5raW5kPy5udWxsVmFsdWUgIT09IHVuZGVmaW5lZCA/IG51bGxWYWx1ZVRvSlNPTihtZXNzYWdlLmtpbmQ/Lm51bGxWYWx1ZSkgOiB1bmRlZmluZWQpO1xuICAgICAgICBtZXNzYWdlLmtpbmQ/LiRjYXNlID09PSBcIm51bWJlclZhbHVlXCIgJiYgKG9iai5udW1iZXJWYWx1ZSA9IG1lc3NhZ2Uua2luZD8ubnVtYmVyVmFsdWUpO1xuICAgICAgICBtZXNzYWdlLmtpbmQ/LiRjYXNlID09PSBcInN0cmluZ1ZhbHVlXCIgJiYgKG9iai5zdHJpbmdWYWx1ZSA9IG1lc3NhZ2Uua2luZD8uc3RyaW5nVmFsdWUpO1xuICAgICAgICBtZXNzYWdlLmtpbmQ/LiRjYXNlID09PSBcImJvb2xWYWx1ZVwiICYmIChvYmouYm9vbFZhbHVlID0gbWVzc2FnZS5raW5kPy5ib29sVmFsdWUpO1xuICAgICAgICBtZXNzYWdlLmtpbmQ/LiRjYXNlID09PSBcInN0cnVjdFZhbHVlXCIgJiYgKG9iai5zdHJ1Y3RWYWx1ZSA9IG1lc3NhZ2Uua2luZD8uc3RydWN0VmFsdWUpO1xuICAgICAgICBtZXNzYWdlLmtpbmQ/LiRjYXNlID09PSBcImxpc3RWYWx1ZVwiICYmIChvYmoubGlzdFZhbHVlID0gbWVzc2FnZS5raW5kPy5saXN0VmFsdWUpO1xuICAgICAgICByZXR1cm4gb2JqO1xuICAgIH1cbiAgICBWYWx1ZS50b0pTT04gPSB0b0pTT047XG4gICAgZnVuY3Rpb24gd3JhcCh2YWx1ZSkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBjcmVhdGVCYXNlVmFsdWUoKTtcbiAgICAgICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXN1bHQua2luZCA9IHsgJGNhc2U6IFwibnVsbFZhbHVlXCIsIG51bGxWYWx1ZTogMCAvKiBOdWxsVmFsdWUuTlVMTF9WQUxVRSAqLyB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgICAgIHJlc3VsdC5raW5kID0geyAkY2FzZTogXCJib29sVmFsdWVcIiwgYm9vbFZhbHVlOiB2YWx1ZSB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgcmVzdWx0LmtpbmQgPSB7ICRjYXNlOiBcIm51bWJlclZhbHVlXCIsIG51bWJlclZhbHVlOiB2YWx1ZSB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgcmVzdWx0LmtpbmQgPSB7ICRjYXNlOiBcInN0cmluZ1ZhbHVlXCIsIHN0cmluZ1ZhbHVlOiB2YWx1ZSB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICByZXN1bHQua2luZCA9IHsgJGNhc2U6IFwibGlzdFZhbHVlXCIsIGxpc3RWYWx1ZTogdmFsdWUgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIHJlc3VsdC5raW5kID0geyAkY2FzZTogXCJzdHJ1Y3RWYWx1ZVwiLCBzdHJ1Y3RWYWx1ZTogdmFsdWUgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuc3VwcG9ydGVkIGFueSB2YWx1ZSB0eXBlOiBcIiArIHR5cGVvZiB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgVmFsdWUud3JhcCA9IHdyYXA7XG4gICAgZnVuY3Rpb24gdW53cmFwKG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2Uua2luZD8uJGNhc2UgPT09IFwibnVsbFZhbHVlXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG1lc3NhZ2Uua2luZD8uJGNhc2UgPT09IFwibnVtYmVyVmFsdWVcIikge1xuICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2Uua2luZD8ubnVtYmVyVmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobWVzc2FnZS5raW5kPy4kY2FzZSA9PT0gXCJzdHJpbmdWYWx1ZVwiKSB7XG4gICAgICAgICAgICByZXR1cm4gbWVzc2FnZS5raW5kPy5zdHJpbmdWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtZXNzYWdlLmtpbmQ/LiRjYXNlID09PSBcImJvb2xWYWx1ZVwiKSB7XG4gICAgICAgICAgICByZXR1cm4gbWVzc2FnZS5raW5kPy5ib29sVmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobWVzc2FnZS5raW5kPy4kY2FzZSA9PT0gXCJzdHJ1Y3RWYWx1ZVwiKSB7XG4gICAgICAgICAgICByZXR1cm4gbWVzc2FnZS5raW5kPy5zdHJ1Y3RWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtZXNzYWdlLmtpbmQ/LiRjYXNlID09PSBcImxpc3RWYWx1ZVwiKSB7XG4gICAgICAgICAgICByZXR1cm4gbWVzc2FnZS5raW5kPy5saXN0VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfVxuICAgIFZhbHVlLnVud3JhcCA9IHVud3JhcDtcbn0pKFZhbHVlIHx8IChWYWx1ZSA9IHt9KSk7XG5mdW5jdGlvbiBjcmVhdGVCYXNlTGlzdFZhbHVlKCkge1xuICAgIHJldHVybiB7IHZhbHVlczogW10gfTtcbn1cbi8qKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdmFyIExpc3RWYWx1ZTtcbihmdW5jdGlvbiAoTGlzdFZhbHVlKSB7XG4gICAgZnVuY3Rpb24gZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IF9tMC5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgZm9yIChjb25zdCB2IG9mIG1lc3NhZ2UudmFsdWVzKSB7XG4gICAgICAgICAgICBWYWx1ZS5lbmNvZGUoVmFsdWUud3JhcCh2KSwgd3JpdGVyLnVpbnQzMigxMCkuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbiAgICBMaXN0VmFsdWUuZW5jb2RlID0gZW5jb2RlO1xuICAgIGZ1bmN0aW9uIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgX20wLlJlYWRlciA/IGlucHV0IDogX20wLlJlYWRlci5jcmVhdGUoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VMaXN0VmFsdWUoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9PSAxMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS52YWx1ZXMucHVzaChWYWx1ZS51bndyYXAoVmFsdWUuZGVjb2RlKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpKSkpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgodGFnICYgNykgPT09IDQgfHwgdGFnID09PSAwKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIExpc3RWYWx1ZS5kZWNvZGUgPSBkZWNvZGU7XG4gICAgZnVuY3Rpb24gZnJvbUpTT04ob2JqZWN0KSB7XG4gICAgICAgIHJldHVybiB7IHZhbHVlczogQXJyYXkuaXNBcnJheShvYmplY3Q/LnZhbHVlcykgPyBbLi4ub2JqZWN0LnZhbHVlc10gOiBbXSB9O1xuICAgIH1cbiAgICBMaXN0VmFsdWUuZnJvbUpTT04gPSBmcm9tSlNPTjtcbiAgICBmdW5jdGlvbiB0b0pTT04obWVzc2FnZSkge1xuICAgICAgICBjb25zdCBvYmogPSB7fTtcbiAgICAgICAgaWYgKG1lc3NhZ2UudmFsdWVzKSB7XG4gICAgICAgICAgICBvYmoudmFsdWVzID0gbWVzc2FnZS52YWx1ZXMubWFwKChlKSA9PiBlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG9iai52YWx1ZXMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqO1xuICAgIH1cbiAgICBMaXN0VmFsdWUudG9KU09OID0gdG9KU09OO1xuICAgIGZ1bmN0aW9uIHdyYXAoYXJyYXkpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gY3JlYXRlQmFzZUxpc3RWYWx1ZSgpO1xuICAgICAgICByZXN1bHQudmFsdWVzID0gYXJyYXkgPz8gW107XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIExpc3RWYWx1ZS53cmFwID0gd3JhcDtcbiAgICBmdW5jdGlvbiB1bndyYXAobWVzc2FnZSkge1xuICAgICAgICBpZiAobWVzc2FnZT8uaGFzT3duUHJvcGVydHkoXCJ2YWx1ZXNcIikgJiYgQXJyYXkuaXNBcnJheShtZXNzYWdlLnZhbHVlcykpIHtcbiAgICAgICAgICAgIHJldHVybiBtZXNzYWdlLnZhbHVlcztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgICAgICB9XG4gICAgfVxuICAgIExpc3RWYWx1ZS51bndyYXAgPSB1bndyYXA7XG59KShMaXN0VmFsdWUgfHwgKExpc3RWYWx1ZSA9IHt9KSk7XG5jb25zdCB0c1Byb3RvR2xvYmFsVGhpcyA9ICgoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIHJldHVybiBnbG9iYWxUaGlzO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIHJldHVybiB3aW5kb3c7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIHJldHVybiBnbG9iYWw7XG4gICAgfVxuICAgIHRocm93IFwiVW5hYmxlIHRvIGxvY2F0ZSBnbG9iYWwgb2JqZWN0XCI7XG59KSgpO1xuZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsO1xufVxuZnVuY3Rpb24gaXNTZXQodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZDtcbn1cbiIsICJpbXBvcnQgeyBnZXRDb21wb3NpdGVSb290Q29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzJztcbmltcG9ydCB7IEVudGl0eU1hcHBpbmdNb2RlLCBpbnN0YW5jZUNvbXBvc2l0ZSB9IGZyb20gJy4vaW5zdGFuY2UnO1xuaW1wb3J0IHsgcmVzb2x2ZUNvbXBvc2l0ZSB9IGZyb20gJy4vcGF0aCc7XG5pbXBvcnQgeyBDb21wb3NpdGVEZWZpbml0aW9uIH0gZnJvbSAnLi9wcm90by9nZW4vY29tcG9zaXRlLmdlbic7XG5leHBvcnQgeyBFbnRpdHlNYXBwaW5nTW9kZSB9O1xuZXhwb3J0IHsgZ2V0Q29tcG9zaXRlUm9vdENvbXBvbmVudCB9O1xuLyoqXG4gKiBAcHVibGljXG4gKiBAZGVwcmVjYXRlZCBjb21wb3NpdGUgaXMgbm90IGJlaW5nIHN1cHBvcnRlZCBzbyBmYXIsIHBsZWFzZSBkbyBub3QgdXNlIHRoaXMgZmVhdHVyZVxuICovXG5leHBvcnQgdmFyIENvbXBvc2l0ZTtcbihmdW5jdGlvbiAoQ29tcG9zaXRlKSB7XG4gICAgLyoqIEBwdWJsaWMgKi9cbiAgICBmdW5jdGlvbiBmcm9tSnNvbihvYmplY3QpIHtcbiAgICAgICAgcmV0dXJuIENvbXBvc2l0ZURlZmluaXRpb24uZnJvbUpTT04ob2JqZWN0KTtcbiAgICB9XG4gICAgQ29tcG9zaXRlLmZyb21Kc29uID0gZnJvbUpzb247XG4gICAgLyoqIEBwdWJsaWMgKi9cbiAgICBmdW5jdGlvbiBmcm9tQmluYXJ5KGJ1ZmZlcikge1xuICAgICAgICByZXR1cm4gQ29tcG9zaXRlRGVmaW5pdGlvbi5kZWNvZGUoYnVmZmVyKTtcbiAgICB9XG4gICAgQ29tcG9zaXRlLmZyb21CaW5hcnkgPSBmcm9tQmluYXJ5O1xuICAgIC8qKiBAcHVibGljICovXG4gICAgZnVuY3Rpb24gdG9Kc29uKGNvbXBvc2l0ZSkge1xuICAgICAgICByZXR1cm4gQ29tcG9zaXRlRGVmaW5pdGlvbi50b0pTT04oY29tcG9zaXRlKTtcbiAgICB9XG4gICAgQ29tcG9zaXRlLnRvSnNvbiA9IHRvSnNvbjtcbiAgICAvKiogQHB1YmxpYyAqL1xuICAgIGZ1bmN0aW9uIHRvQmluYXJ5KGNvbXBvc2l0ZSkge1xuICAgICAgICByZXR1cm4gQ29tcG9zaXRlRGVmaW5pdGlvbi5lbmNvZGUoY29tcG9zaXRlKS5maW5pc2goKTtcbiAgICB9XG4gICAgQ29tcG9zaXRlLnRvQmluYXJ5ID0gdG9CaW5hcnk7XG4gICAgLyoqXG4gICAgICogSW5zdGFuY2UgYSBjb21wb3NpdGUgYW5kIHJldHVybnMgaXRzIHJvb3QgZW50aXR5XG4gICAgICogQHBhcmFtIGNvbXBvc2l0ZURhdGEgLSBzdGF0ZSBzZXJpYWxpemVkIGJ5IHRoZSBDUkRUIHByb3RvY29sXG4gICAgICogQHBhcmFtIGdldE5leHRBdmFpbGFibGVFbnRpdHkgLSBmdW5jdGlvbiB0aGF0IGdpdmVzIHVudXNlZCBlbnRpdGllc1xuICAgICAqIEBwYXJhbSByb290RW50aXR5IC0gKG9wdGlvbmFsKSBzdWdnZXN0ZWQgbWFwcGVkIHJvb3RFbnRpdHkgZm9yIHRoZSBjb21wb3NpdGVcbiAgICAgKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKi9cbiAgICAvKiNfX1BVUkVfXyovIGZ1bmN0aW9uIGluc3RhbmNlKGVuZ2luZSwgY29tcG9zaXRlRGF0YSwgY29tcG9zaXRlUHJvdmlkZXIsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBpbnN0YW5jZUNvbXBvc2l0ZShlbmdpbmUsIGNvbXBvc2l0ZURhdGEsIGNvbXBvc2l0ZVByb3ZpZGVyLCBvcHRpb25zKTtcbiAgICB9XG4gICAgQ29tcG9zaXRlLmluc3RhbmNlID0gaW5zdGFuY2U7XG4gICAgLyoqXG4gICAgICogUmVzb2x2ZSBhbmQgbm9ybWFsaXplIGEgY29tcG9zaXRlIHBhdGhcbiAgICAgKiBAcGFyYW0gc3JjIC0gdGhlIHNvdXJjZSBwYXRoXG4gICAgICogQHBhcmFtIGN3ZCAtIHRoZSBkaXJlY3RvcnkgZnJvbSB0aGUgcmVzb2x2ZSBzaG91bGQgc3RhcnQgdG8gcmVzb2x2ZVxuICAgICAqXG4gICAgICogQHJldHVybnMgdGhlIGFic29sdXRlIHJlc29sdmVkIHBhdGggd2l0aG91dCBzbGFzaCBhdCB0aGUgYmVnaW5uaW5nXG4gICAgICogQHB1YmxpY1xuICAgICAqL1xuICAgIC8qI19fUFVSRV9fKi8gZnVuY3Rpb24gcmVzb2x2ZUFuZE5vcm1hbGl6ZVBhdGgoc3JjLCBjd2QgPSAnLycpIHtcbiAgICAgICAgcmV0dXJuIHJlc29sdmVDb21wb3NpdGUoc3JjLCBjd2QpO1xuICAgIH1cbiAgICBDb21wb3NpdGUucmVzb2x2ZUFuZE5vcm1hbGl6ZVBhdGggPSByZXNvbHZlQW5kTm9ybWFsaXplUGF0aDtcbn0pKENvbXBvc2l0ZSB8fCAoQ29tcG9zaXRlID0ge30pKTtcbiIsICIvLyBUaGUgb3JkZXIgb2YgdGhlIGZvbGxvd2luZyBpbXBvcnRzIG1hdHRlcnMuIFBsZWFzZSBkbyBub3QgYXV0by1zb3J0XG5leHBvcnQgKiBmcm9tICcuL2VuZ2luZSc7XG5leHBvcnQgKiBmcm9tICcuL3NjaGVtYXMnO1xuZXhwb3J0ICogZnJvbSAnLi9ydW50aW1lL2luaXRpYWxpemF0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcnVudGltZS90eXBlcyc7XG5leHBvcnQgKiBmcm9tICcuL3J1bnRpbWUvaGVscGVycyc7XG5leHBvcnQgeyBjeWNsaWNQYXJlbnRpbmdDaGVja2VyIH0gZnJvbSAnLi9zeXN0ZW1zL2N5Y2xpY1BhcmVudGluZ0NoZWNrZXInO1xuZXhwb3J0ICogZnJvbSAnLi9zeXN0ZW1zL2V2ZW50cyc7XG5leHBvcnQgKiBmcm9tICcuL3N5c3RlbXMvcmF5Y2FzdCc7XG5leHBvcnQgKiBmcm9tICcuL3N5c3RlbXMvdmlkZW9FdmVudHMnO1xuZXhwb3J0ICogZnJvbSAnLi9zeXN0ZW1zL2FzeW5jLXRhc2snO1xuZXhwb3J0ICogZnJvbSAnLi9lbmdpbmUvZW50aXR5JztcbmV4cG9ydCAqIGZyb20gJy4vY29tcG9uZW50cy90eXBlcyc7XG4vLyBAaW50ZXJuYWxcbmltcG9ydCAqIGFzIGNvbXBvbmVudHMgZnJvbSAnLi9jb21wb25lbnRzJztcbi8vIEBpbnRlcm5hbFxuZXhwb3J0IHsgY29tcG9uZW50cyB9O1xuaW1wb3J0IHsgZW5naW5lIH0gZnJvbSAnLi9ydW50aW1lL2luaXRpYWxpemF0aW9uJztcbi8vIGV4cG9ydCBjb21wb25lbnRzIGZvciBnbG9iYWwgZW5naW5lXG5leHBvcnQgY29uc3QgVHJhbnNmb3JtID0gLyogQF9fUFVSRV9fKi8gY29tcG9uZW50cy5UcmFuc2Zvcm0oZW5naW5lKTtcbmV4cG9ydCBjb25zdCBBbmltYXRvciA9IC8qIEBfX1BVUkVfXyovIGNvbXBvbmVudHMuQW5pbWF0b3IoZW5naW5lKTtcbmV4cG9ydCBjb25zdCBNYXRlcmlhbCA9IC8qIEBfX1BVUkVfXyovIGNvbXBvbmVudHMuTWF0ZXJpYWwoZW5naW5lKTtcbmV4cG9ydCBjb25zdCBNZXNoUmVuZGVyZXIgPSAvKiBAX19QVVJFX18qLyBjb21wb25lbnRzLk1lc2hSZW5kZXJlcihlbmdpbmUpO1xuZXhwb3J0IGNvbnN0IE1lc2hDb2xsaWRlciA9IC8qIEBfX1BVUkVfXyovIGNvbXBvbmVudHMuTWVzaENvbGxpZGVyKGVuZ2luZSk7XG5leHBvcnQgY29uc3QgTmFtZSA9IGNvbXBvbmVudHMuTmFtZShlbmdpbmUpO1xuZXhwb3J0IGNvbnN0IFR3ZWVuID0gLyogQF9fUFVSRV9fKi8gY29tcG9uZW50cy5Ud2VlbihlbmdpbmUpO1xuLyoqXG4gKiBAYWxwaGFcbiAqIFRoaXMgaXMgZ29pbmcgdG8gYmUgdXNlZCBmb3Igc3luYyBjb21wb25lbnRzIHRocm91Z2ggYSBzZXJ2ZXIuXG4gKiBDYW4gYmUgbW9kaWZpZWQgaW4gdGhlIGZ1dHVyZSBzaW5jZSBpdCdzIHN0aWxsIGluIHJlc2VhcmNoXG4gKi9cbmV4cG9ydCBjb25zdCBTeW5jQ29tcG9uZW50cyA9IC8qIEBfX1BVUkVfXyovIGNvbXBvbmVudHMuU3luY0NvbXBvbmVudHMoZW5naW5lKTtcbi8qKlxuICogQGFscGhhXG4gKiBUYWcgYSBlbnRpdHkgdG8gYmUgc3luY3Jvbml6ZWQgdGhyb3VnaCBjb21tc1xuICovXG5leHBvcnQgY29uc3QgTmV0d29ya0VudGl0eSA9IC8qIEBfX1BVUkVfXyovIGNvbXBvbmVudHMuTmV0d29ya0VudGl0eShlbmdpbmUpO1xuLyoqXG4gKiBAYWxwaGFcbiAqIFRhZyBhIGVudGl0eSB0byBiZSBzeW5jcm9uaXplZCB0aHJvdWdoIGNvbW1zXG4gKi9cbmV4cG9ydCBjb25zdCBOZXR3b3JrUGFyZW50ID0gLyogQF9fUFVSRV9fKi8gY29tcG9uZW50cy5OZXR3b3JrUGFyZW50KGVuZ2luZSk7XG4vLyBleHBvcnQgY29tcG9uZW50cyBmb3IgZ2xvYmFsIGVuZ2luZVxuZXhwb3J0ICogZnJvbSAnLi9jb21wb25lbnRzL2dlbmVyYXRlZC9nbG9iYWwuZ2VuJztcbmV4cG9ydCAqIGZyb20gJy4vY29tcG9uZW50cy9nZW5lcmF0ZWQvdHlwZXMuZ2VuJztcbmV4cG9ydCAqIGZyb20gJy4vc2VyaWFsaXphdGlvbi9jcmR0JztcbmV4cG9ydCAqIGZyb20gJy4vY29tcG9zaXRlJztcbiIsICIvKipcbiAqIENvbnN0YW50IHVzZWQgdG8gY29udmVydCBhIHZhbHVlIHRvIGdhbW1hIHNwYWNlXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBUb0dhbW1hU3BhY2UgPSAxIC8gMi4yO1xuLyoqXG4gKiBDb25zdGFudCB1c2VkIHRvIGNvbnZlcnQgYSB2YWx1ZSB0byBsaW5lYXIgc3BhY2VcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IFRvTGluZWFyU3BhY2UgPSAyLjI7XG4vKipcbiAqIENvbnN0YW50IHVzZWQgdG8gZGVmaW5lIHRoZSBtaW5pbWFsIG51bWJlciB2YWx1ZSBpbiBCYWJ5bG9uLmpzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBFcHNpbG9uID0gMC4wMDAwMDE7XG4vKipcbiAqIENvbnN0YW50IHVzZWQgdG8gY29udmVydCBmcm9tIEV1bGVyIGRlZ3JlZXMgdG8gcmFkaWFuc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgREVHMlJBRCA9IE1hdGguUEkgLyAxODA7XG4vKipcbiAqIENvbnN0YW50IHVzZWQgdG8gY29udmVydCBmcm9tIHJhZGlhbnMgdG8gRXVsZXIgZGVncmVlc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgUkFEMkRFRyA9IDM2MCAvIChNYXRoLlBJICogMik7XG4iLCAiLyoqXG4gKiBTY2FsYXIgY29tcHV0YXRpb24gbGlicmFyeVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdmFyIFNjYWxhcjtcbihmdW5jdGlvbiAoU2NhbGFyKSB7XG4gICAgLyoqXG4gICAgICogVHdvIHBpIGNvbnN0YW50cyBjb252ZW5pZW50IGZvciBjb21wdXRhdGlvbi5cbiAgICAgKi9cbiAgICBTY2FsYXIuVHdvUGkgPSBNYXRoLlBJICogMjtcbiAgICAvKipcbiAgICAgKiBCb29sZWFuIDogdHJ1ZSBpZiB0aGUgYWJzb2x1dGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGEgYW5kIGIgaXMgbG93ZXIgdGhhbiBlcHNpbG9uIChkZWZhdWx0ID0gMS40MDEyOThFLTQ1KVxuICAgICAqIEBwYXJhbSBhIC0gbnVtYmVyXG4gICAgICogQHBhcmFtIGIgLSBudW1iZXJcbiAgICAgKiBAcGFyYW0gZXBzaWxvbiAtIChkZWZhdWx0ID0gMS40MDEyOThFLTQ1KVxuICAgICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIGFic29sdXRlIGRpZmZlcmVuY2UgYmV0d2VlbiBhIGFuZCBiIGlzIGxvd2VyIHRoYW4gZXBzaWxvbiAoZGVmYXVsdCA9IDEuNDAxMjk4RS00NSlcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3aXRoaW5FcHNpbG9uKGEsIGIsIGVwc2lsb24gPSAxLjQwMTI5OGUtNDUpIHtcbiAgICAgICAgY29uc3QgbnVtID0gYSAtIGI7XG4gICAgICAgIHJldHVybiAtZXBzaWxvbiA8PSBudW0gJiYgbnVtIDw9IGVwc2lsb247XG4gICAgfVxuICAgIFNjYWxhci53aXRoaW5FcHNpbG9uID0gd2l0aGluRXBzaWxvbjtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIDogdGhlIHVwcGVyIGNhc2UgdHJhbnNsYXRpb24gb2YgdGhlIG51bWJlciBpIHRvIGhleGFkZWNpbWFsLlxuICAgICAqIEBwYXJhbSBpIC0gbnVtYmVyXG4gICAgICogQHJldHVybnMgdGhlIHVwcGVyIGNhc2UgdHJhbnNsYXRpb24gb2YgdGhlIG51bWJlciBpIHRvIGhleGFkZWNpbWFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvSGV4KGkpIHtcbiAgICAgICAgY29uc3Qgc3RyID0gaS50b1N0cmluZygxNik7XG4gICAgICAgIGlmIChpIDw9IDE1KSB7XG4gICAgICAgICAgICByZXR1cm4gKCcwJyArIHN0cikudG9VcHBlckNhc2UoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RyLnRvVXBwZXJDYXNlKCk7XG4gICAgfVxuICAgIFNjYWxhci50b0hleCA9IHRvSGV4O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgLTEgaWYgdmFsdWUgaXMgbmVnYXRpdmUgYW5kICsxIGlzIHZhbHVlIGlzIHBvc2l0aXZlLlxuICAgICAqIEBwYXJhbSBfdmFsdWUgLSB0aGUgdmFsdWVcbiAgICAgKiBAcmV0dXJucyB0aGUgdmFsdWUgaXRzZWxmIGlmIGl0J3MgZXF1YWwgdG8gemVyby5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzaWduKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IF92YWx1ZSA9ICt2YWx1ZTsgLy8gY29udmVydCB0byBhIG51bWJlclxuICAgICAgICBpZiAoX3ZhbHVlID09PSAwIHx8IGlzTmFOKF92YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBfdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF92YWx1ZSA+IDAgPyAxIDogLTE7XG4gICAgfVxuICAgIFNjYWxhci5zaWduID0gc2lnbjtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBpdHNlbGYgaWYgaXQncyBiZXR3ZWVuIG1pbiBhbmQgbWF4LlxuICAgICAqIFJldHVybnMgbWluIGlmIHRoZSB2YWx1ZSBpcyBsb3dlciB0aGFuIG1pbi5cbiAgICAgKiBSZXR1cm5zIG1heCBpZiB0aGUgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIG1heC5cbiAgICAgKiBAcGFyYW0gdmFsdWUgLSB0aGUgdmFsdWUgdG8gY2xtYXBcbiAgICAgKiBAcGFyYW0gbWluIC0gdGhlIG1pbiB2YWx1ZSB0byBjbGFtcCB0byAoZGVmYXVsdDogMClcbiAgICAgKiBAcGFyYW0gbWF4IC0gdGhlIG1heCB2YWx1ZSB0byBjbGFtcCB0byAoZGVmYXVsdDogMSlcbiAgICAgKiBAcmV0dXJucyB0aGUgY2xhbXBlZCB2YWx1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsYW1wKHZhbHVlLCBtaW4gPSAwLCBtYXggPSAxKSB7XG4gICAgICAgIHJldHVybiBNYXRoLm1pbihtYXgsIE1hdGgubWF4KG1pbiwgdmFsdWUpKTtcbiAgICB9XG4gICAgU2NhbGFyLmNsYW1wID0gY2xhbXA7XG4gICAgLyoqXG4gICAgICogdGhlIGxvZzIgb2YgdmFsdWUuXG4gICAgICogQHBhcmFtIHZhbHVlIC0gdGhlIHZhbHVlIHRvIGNvbXB1dGUgbG9nMiBvZlxuICAgICAqIEByZXR1cm5zIHRoZSBsb2cyIG9mIHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGxvZzIodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIE1hdGgubG9nKHZhbHVlKSAqIE1hdGguTE9HMkU7XG4gICAgfVxuICAgIFNjYWxhci5sb2cyID0gbG9nMjtcbiAgICAvKipcbiAgICAgKiBMb29wcyB0aGUgdmFsdWUsIHNvIHRoYXQgaXQgaXMgbmV2ZXIgbGFyZ2VyIHRoYW4gbGVuZ3RoIGFuZCBuZXZlciBzbWFsbGVyIHRoYW4gMC5cbiAgICAgKlxuICAgICAqIFRoaXMgaXMgc2ltaWxhciB0byB0aGUgbW9kdWxvIG9wZXJhdG9yIGJ1dCBpdCB3b3JrcyB3aXRoIGZsb2F0aW5nIHBvaW50IG51bWJlcnMuXG4gICAgICogRm9yIGV4YW1wbGUsIHVzaW5nIDMuMCBmb3IgdCBhbmQgMi41IGZvciBsZW5ndGgsIHRoZSByZXN1bHQgd291bGQgYmUgMC41LlxuICAgICAqIFdpdGggdCA9IDUgYW5kIGxlbmd0aCA9IDIuNSwgdGhlIHJlc3VsdCB3b3VsZCBiZSAwLjAuXG4gICAgICogTm90ZSwgaG93ZXZlciwgdGhhdCB0aGUgYmVoYXZpb3VyIGlzIG5vdCBkZWZpbmVkIGZvciBuZWdhdGl2ZSBudW1iZXJzIGFzIGl0IGlzIGZvciB0aGUgbW9kdWxvIG9wZXJhdG9yXG4gICAgICogQHBhcmFtIHZhbHVlIC0gdGhlIHZhbHVlXG4gICAgICogQHBhcmFtIGxlbmd0aCAtIHRoZSBsZW5ndGhcbiAgICAgKiBAcmV0dXJucyB0aGUgbG9vcGVkIHZhbHVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVwZWF0KHZhbHVlLCBsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlIC0gTWF0aC5mbG9vcih2YWx1ZSAvIGxlbmd0aCkgKiBsZW5ndGg7XG4gICAgfVxuICAgIFNjYWxhci5yZXBlYXQgPSByZXBlYXQ7XG4gICAgLyoqXG4gICAgICogTm9ybWFsaXplIHRoZSB2YWx1ZSBiZXR3ZWVuIDAuMCBhbmQgMS4wIHVzaW5nIG1pbiBhbmQgbWF4IHZhbHVlc1xuICAgICAqIEBwYXJhbSB2YWx1ZSAtIHZhbHVlIHRvIG5vcm1hbGl6ZVxuICAgICAqIEBwYXJhbSBtaW4gLSBtYXggdG8gbm9ybWFsaXplIGJldHdlZW5cbiAgICAgKiBAcGFyYW0gbWF4IC0gbWluIHRvIG5vcm1hbGl6ZSBiZXR3ZWVuXG4gICAgICogQHJldHVybnMgdGhlIG5vcm1hbGl6ZWQgdmFsdWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBub3JtYWxpemUodmFsdWUsIG1pbiwgbWF4KSB7XG4gICAgICAgIHJldHVybiAodmFsdWUgLSBtaW4pIC8gKG1heCAtIG1pbik7XG4gICAgfVxuICAgIFNjYWxhci5ub3JtYWxpemUgPSBub3JtYWxpemU7XG4gICAgLyoqXG4gICAgICogRGVub3JtYWxpemUgdGhlIHZhbHVlIGZyb20gMC4wIGFuZCAxLjAgdXNpbmcgbWluIGFuZCBtYXggdmFsdWVzXG4gICAgICogQHBhcmFtIG5vcm1hbGl6ZWQgLSB2YWx1ZSB0byBkZW5vcm1hbGl6ZVxuICAgICAqIEBwYXJhbSBtaW4gLSBtYXggdG8gZGVub3JtYWxpemUgYmV0d2VlblxuICAgICAqIEBwYXJhbSBtYXggLSBtaW4gdG8gZGVub3JtYWxpemUgYmV0d2VlblxuICAgICAqIEByZXR1cm5zIHRoZSBkZW5vcm1hbGl6ZWQgdmFsdWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBkZW5vcm1hbGl6ZShub3JtYWxpemVkLCBtaW4sIG1heCkge1xuICAgICAgICByZXR1cm4gbm9ybWFsaXplZCAqIChtYXggLSBtaW4pICsgbWluO1xuICAgIH1cbiAgICBTY2FsYXIuZGVub3JtYWxpemUgPSBkZW5vcm1hbGl6ZTtcbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGVzIHRoZSBzaG9ydGVzdCBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIGdpdmVuIGFuZ2xlcyBnaXZlbiBpbiBkZWdyZWVzLlxuICAgICAqIEBwYXJhbSBjdXJyZW50IC0gY3VycmVudCBhbmdsZSBpbiBkZWdyZWVzXG4gICAgICogQHBhcmFtIHRhcmdldCAtIHRhcmdldCBhbmdsZSBpbiBkZWdyZWVzXG4gICAgICogQHJldHVybnMgdGhlIGRlbHRhXG4gICAgICovXG4gICAgZnVuY3Rpb24gZGVsdGFBbmdsZShjdXJyZW50LCB0YXJnZXQpIHtcbiAgICAgICAgbGV0IG51bSA9IHJlcGVhdCh0YXJnZXQgLSBjdXJyZW50LCAzNjAuMCk7XG4gICAgICAgIGlmIChudW0gPiAxODAuMCkge1xuICAgICAgICAgICAgbnVtIC09IDM2MC4wO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudW07XG4gICAgfVxuICAgIFNjYWxhci5kZWx0YUFuZ2xlID0gZGVsdGFBbmdsZTtcbiAgICAvKipcbiAgICAgKiBQaW5nUG9uZ3MgdGhlIHZhbHVlIHQsIHNvIHRoYXQgaXQgaXMgbmV2ZXIgbGFyZ2VyIHRoYW4gbGVuZ3RoIGFuZCBuZXZlciBzbWFsbGVyIHRoYW4gMC5cbiAgICAgKiBAcGFyYW0gdHggLSB2YWx1ZVxuICAgICAqIEBwYXJhbSBsZW5ndGggLSBsZW5ndGhcbiAgICAgKiBAcmV0dXJucyBUaGUgcmV0dXJuZWQgdmFsdWUgd2lsbCBtb3ZlIGJhY2sgYW5kIGZvcnRoIGJldHdlZW4gMCBhbmQgbGVuZ3RoXG4gICAgICovXG4gICAgZnVuY3Rpb24gcGluZ1BvbmcodHgsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCB0ID0gcmVwZWF0KHR4LCBsZW5ndGggKiAyLjApO1xuICAgICAgICByZXR1cm4gbGVuZ3RoIC0gTWF0aC5hYnModCAtIGxlbmd0aCk7XG4gICAgfVxuICAgIFNjYWxhci5waW5nUG9uZyA9IHBpbmdQb25nO1xuICAgIC8qKlxuICAgICAqIEludGVycG9sYXRlcyBiZXR3ZWVuIG1pbiBhbmQgbWF4IHdpdGggc21vb3RoaW5nIGF0IHRoZSBsaW1pdHMuXG4gICAgICpcbiAgICAgKiBUaGlzIGV4cG9ydCBmdW5jdGlvbiBpbnRlcnBvbGF0ZXMgYmV0d2VlbiBtaW4gYW5kIG1heCBpbiBhIHNpbWlsYXIgd2F5IHRvIExlcnAuIEhvd2V2ZXIsIHRoZSBpbnRlcnBvbGF0aW9uIHdpbGwgZ3JhZHVhbGx5IHNwZWVkIHVwXG4gICAgICogZnJvbSB0aGUgc3RhcnQgYW5kIHNsb3cgZG93biB0b3dhcmQgdGhlIGVuZC4gVGhpcyBpcyB1c2VmdWwgZm9yIGNyZWF0aW5nIG5hdHVyYWwtbG9va2luZyBhbmltYXRpb24sIGZhZGluZyBhbmQgb3RoZXIgdHJhbnNpdGlvbnMuXG4gICAgICogQHBhcmFtIGZyb20gLSBmcm9tXG4gICAgICogQHBhcmFtIHRvIC0gdG9cbiAgICAgKiBAcGFyYW0gdHggLSB2YWx1ZVxuICAgICAqIEByZXR1cm5zIHRoZSBzbW9vdGggc3RlcHBlZCB2YWx1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNtb290aFN0ZXAoZnJvbSwgdG8sIHR4KSB7XG4gICAgICAgIGxldCB0ID0gY2xhbXAodHgpO1xuICAgICAgICB0ID0gLTIuMCAqIHQgKiB0ICogdCArIDMuMCAqIHQgKiB0O1xuICAgICAgICByZXR1cm4gdG8gKiB0ICsgZnJvbSAqICgxLjAgLSB0KTtcbiAgICB9XG4gICAgU2NhbGFyLnNtb290aFN0ZXAgPSBzbW9vdGhTdGVwO1xuICAgIC8qKlxuICAgICAqIE1vdmVzIGEgdmFsdWUgY3VycmVudCB0b3dhcmRzIHRhcmdldC5cbiAgICAgKlxuICAgICAqIFRoaXMgaXMgZXNzZW50aWFsbHkgdGhlIHNhbWUgYXMgTWF0aGYuTGVycCBidXQgaW5zdGVhZCB0aGUgZXhwb3J0IGZ1bmN0aW9uIHdpbGwgZW5zdXJlIHRoYXQgdGhlIHNwZWVkIG5ldmVyIGV4Y2VlZHMgbWF4RGVsdGEuXG4gICAgICogTmVnYXRpdmUgdmFsdWVzIG9mIG1heERlbHRhIHB1c2hlcyB0aGUgdmFsdWUgYXdheSBmcm9tIHRhcmdldC5cbiAgICAgKiBAcGFyYW0gY3VycmVudCAtIGN1cnJlbnQgdmFsdWVcbiAgICAgKiBAcGFyYW0gdGFyZ2V0IC0gdGFyZ2V0IHZhbHVlXG4gICAgICogQHBhcmFtIG1heERlbHRhIC0gbWF4IGRpc3RhbmNlIHRvIG1vdmVcbiAgICAgKiBAcmV0dXJucyByZXN1bHRpbmcgdmFsdWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtb3ZlVG93YXJkcyhjdXJyZW50LCB0YXJnZXQsIG1heERlbHRhKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSAwO1xuICAgICAgICBpZiAoTWF0aC5hYnModGFyZ2V0IC0gY3VycmVudCkgPD0gbWF4RGVsdGEpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHRhcmdldDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGN1cnJlbnQgKyBzaWduKHRhcmdldCAtIGN1cnJlbnQpICogbWF4RGVsdGE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgU2NhbGFyLm1vdmVUb3dhcmRzID0gbW92ZVRvd2FyZHM7XG4gICAgLyoqXG4gICAgICogU2FtZSBhcyBNb3ZlVG93YXJkcyBidXQgbWFrZXMgc3VyZSB0aGUgdmFsdWVzIGludGVycG9sYXRlIGNvcnJlY3RseSB3aGVuIHRoZXkgd3JhcCBhcm91bmQgMzYwIGRlZ3JlZXMuXG4gICAgICpcbiAgICAgKiBWYXJpYWJsZXMgY3VycmVudCBhbmQgdGFyZ2V0IGFyZSBhc3N1bWVkIHRvIGJlIGluIGRlZ3JlZXMuIEZvciBvcHRpbWl6YXRpb24gcmVhc29ucywgbmVnYXRpdmUgdmFsdWVzIG9mIG1heERlbHRhXG4gICAgICogIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBtYXkgY2F1c2Ugb3NjaWxsYXRpb24uIFRvIHB1c2ggY3VycmVudCBhd2F5IGZyb20gYSB0YXJnZXQgYW5nbGUsIGFkZCAxODAgdG8gdGhhdCBhbmdsZSBpbnN0ZWFkLlxuICAgICAqIEBwYXJhbSBjdXJyZW50IC0gY3VycmVudCB2YWx1ZVxuICAgICAqIEBwYXJhbSB0YXJnZXQgLSB0YXJnZXQgdmFsdWVcbiAgICAgKiBAcGFyYW0gbWF4RGVsdGEgLSBtYXggZGlzdGFuY2UgdG8gbW92ZVxuICAgICAqIEByZXR1cm5zIHJlc3VsdGluZyBhbmdsZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1vdmVUb3dhcmRzQW5nbGUoY3VycmVudCwgdGFyZ2V0LCBtYXhEZWx0YSkge1xuICAgICAgICBjb25zdCBudW0gPSBkZWx0YUFuZ2xlKGN1cnJlbnQsIHRhcmdldCk7XG4gICAgICAgIGxldCByZXN1bHQgPSAwO1xuICAgICAgICBpZiAoLW1heERlbHRhIDwgbnVtICYmIG51bSA8IG1heERlbHRhKSB7XG4gICAgICAgICAgICByZXN1bHQgPSB0YXJnZXQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQgPSBtb3ZlVG93YXJkcyhjdXJyZW50LCBjdXJyZW50ICsgbnVtLCBtYXhEZWx0YSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgU2NhbGFyLm1vdmVUb3dhcmRzQW5nbGUgPSBtb3ZlVG93YXJkc0FuZ2xlO1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgc2NhbGFyIHdpdGggdmFsdWVzIGxpbmVhcmx5IGludGVycG9sYXRlZCBvZiBcImFtb3VudFwiIGJldHdlZW4gdGhlIHN0YXJ0IHNjYWxhciBhbmQgdGhlIGVuZCBzY2FsYXJcbiAgICAgKiBAcGFyYW0gc3RhcnQgLSBzdGFydCB2YWx1ZVxuICAgICAqIEBwYXJhbSBlbmQgLSB0YXJnZXQgdmFsdWVcbiAgICAgKiBAcGFyYW0gYW1vdW50IC0gYW1vdW50IHRvIGxlcnAgYmV0d2VlblxuICAgICAqIEByZXR1cm5zIHRoZSBsZXJwZWQgdmFsdWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsZXJwKHN0YXJ0LCBlbmQsIGFtb3VudCkge1xuICAgICAgICByZXR1cm4gc3RhcnQgKyAoZW5kIC0gc3RhcnQpICogYW1vdW50O1xuICAgIH1cbiAgICBTY2FsYXIubGVycCA9IGxlcnA7XG4gICAgLyoqXG4gICAgICogU2FtZSBhcyBMZXJwIGJ1dCBtYWtlcyBzdXJlIHRoZSB2YWx1ZXMgaW50ZXJwb2xhdGUgY29ycmVjdGx5IHdoZW4gdGhleSB3cmFwIGFyb3VuZCAzNjAgZGVncmVlcy5cbiAgICAgKiBUaGUgcGFyYW1ldGVyIHQgaXMgY2xhbXBlZCB0byB0aGUgcmFuZ2UgWzAsIDFdLiBWYXJpYWJsZXMgYSBhbmQgYiBhcmUgYXNzdW1lZCB0byBiZSBpbiBkZWdyZWVzLlxuICAgICAqIEBwYXJhbSBzdGFydCAtIHN0YXJ0IHZhbHVlXG4gICAgICogQHBhcmFtIGVuZCAtIHRhcmdldCB2YWx1ZVxuICAgICAqIEBwYXJhbSBhbW91bnQgLSBhbW91bnQgdG8gbGVycCBiZXR3ZWVuXG4gICAgICogQHJldHVybnMgdGhlIGxlcnBlZCB2YWx1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGxlcnBBbmdsZShzdGFydCwgZW5kLCBhbW91bnQpIHtcbiAgICAgICAgbGV0IG51bSA9IHJlcGVhdChlbmQgLSBzdGFydCwgMzYwLjApO1xuICAgICAgICBpZiAobnVtID4gMTgwLjApIHtcbiAgICAgICAgICAgIG51bSAtPSAzNjAuMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RhcnQgKyBudW0gKiBjbGFtcChhbW91bnQpO1xuICAgIH1cbiAgICBTY2FsYXIubGVycEFuZ2xlID0gbGVycEFuZ2xlO1xuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZXMgdGhlIGxpbmVhciBwYXJhbWV0ZXIgdCB0aGF0IHByb2R1Y2VzIHRoZSBpbnRlcnBvbGFudCB2YWx1ZSB3aXRoaW4gdGhlIHJhbmdlIFthLCBiXS5cbiAgICAgKiBAcGFyYW0gYSAtIHN0YXJ0IHZhbHVlXG4gICAgICogQHBhcmFtIGIgLSB0YXJnZXQgdmFsdWVcbiAgICAgKiBAcGFyYW0gdmFsdWUgLSB2YWx1ZSBiZXR3ZWVuIGEgYW5kIGJcbiAgICAgKiBAcmV0dXJucyB0aGUgaW52ZXJzZUxlcnAgdmFsdWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbnZlcnNlTGVycChhLCBiLCB2YWx1ZSkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gMDtcbiAgICAgICAgaWYgKGEgIT09IGIpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGNsYW1wKCh2YWx1ZSAtIGEpIC8gKGIgLSBhKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQgPSAwLjA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgU2NhbGFyLmludmVyc2VMZXJwID0gaW52ZXJzZUxlcnA7XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIG5ldyBzY2FsYXIgbG9jYXRlZCBmb3IgXCJhbW91bnRcIiAoZmxvYXQpIG9uIHRoZSBIZXJtaXRlIHNwbGluZSBkZWZpbmVkIGJ5IHRoZSBzY2FsYXJzIFwidmFsdWUxXCIsIFwidmFsdWUzXCIsIFwidGFuZ2VudDFcIiwgXCJ0YW5nZW50MlwiLlxuICAgICAqIHtAbGluayBodHRwOi8vbWF0aHdvcmxkLndvbGZyYW0uY29tL0hlcm1pdGVQb2x5bm9taWFsLmh0bWx9XG4gICAgICogQHBhcmFtIHZhbHVlMSAtIHNwbGluZSB2YWx1ZVxuICAgICAqIEBwYXJhbSB0YW5nZW50MSAtIHNwbGluZSB2YWx1ZVxuICAgICAqIEBwYXJhbSB2YWx1ZTIgLSBzcGxpbmUgdmFsdWVcbiAgICAgKiBAcGFyYW0gdGFuZ2VudDIgLSBzcGxpbmUgdmFsdWVcbiAgICAgKiBAcGFyYW0gYW1vdW50IC0gaW5wdXQgdmFsdWVcbiAgICAgKiBAcmV0dXJucyBoZXJtaXRlIHJlc3VsdFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGhlcm1pdGUodmFsdWUxLCB0YW5nZW50MSwgdmFsdWUyLCB0YW5nZW50MiwgYW1vdW50KSB7XG4gICAgICAgIGNvbnN0IHNxdWFyZWQgPSBhbW91bnQgKiBhbW91bnQ7XG4gICAgICAgIGNvbnN0IGN1YmVkID0gYW1vdW50ICogc3F1YXJlZDtcbiAgICAgICAgY29uc3QgcGFydDEgPSAyLjAgKiBjdWJlZCAtIDMuMCAqIHNxdWFyZWQgKyAxLjA7XG4gICAgICAgIGNvbnN0IHBhcnQyID0gLTIuMCAqIGN1YmVkICsgMy4wICogc3F1YXJlZDtcbiAgICAgICAgY29uc3QgcGFydDMgPSBjdWJlZCAtIDIuMCAqIHNxdWFyZWQgKyBhbW91bnQ7XG4gICAgICAgIGNvbnN0IHBhcnQ0ID0gY3ViZWQgLSBzcXVhcmVkO1xuICAgICAgICByZXR1cm4gdmFsdWUxICogcGFydDEgKyB2YWx1ZTIgKiBwYXJ0MiArIHRhbmdlbnQxICogcGFydDMgKyB0YW5nZW50MiAqIHBhcnQ0O1xuICAgIH1cbiAgICBTY2FsYXIuaGVybWl0ZSA9IGhlcm1pdGU7XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHJhbmRvbSBmbG9hdCBudW1iZXIgYmV0d2VlbiBhbmQgbWluIGFuZCBtYXggdmFsdWVzXG4gICAgICogQHBhcmFtIG1pbiAtIG1pbiB2YWx1ZSBvZiByYW5kb21cbiAgICAgKiBAcGFyYW0gbWF4IC0gbWF4IHZhbHVlIG9mIHJhbmRvbVxuICAgICAqIEByZXR1cm5zIHJhbmRvbSB2YWx1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJhbmRvbVJhbmdlKG1pbiwgbWF4KSB7XG4gICAgICAgIGlmIChtaW4gPT09IG1heCkge1xuICAgICAgICAgICAgcmV0dXJuIG1pbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4pICsgbWluO1xuICAgIH1cbiAgICBTY2FsYXIucmFuZG9tUmFuZ2UgPSByYW5kb21SYW5nZTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGV4cG9ydCBmdW5jdGlvbiByZXR1cm5zIHBlcmNlbnRhZ2Ugb2YgYSBudW1iZXIgaW4gYSBnaXZlbiByYW5nZS5cbiAgICAgKlxuICAgICAqIFJhbmdlVG9QZXJjZW50KDQwLDIwLDYwKSB3aWxsIHJldHVybiAwLjUgKDUwJSlcbiAgICAgKiBSYW5nZVRvUGVyY2VudCgzNCwwLDEwMCkgd2lsbCByZXR1cm4gMC4zNCAoMzQlKVxuICAgICAqIEBwYXJhbSBudW0gLSB0byBjb252ZXJ0IHRvIHBlcmNlbnRhZ2VcbiAgICAgKiBAcGFyYW0gbWluIC0gbWluIHJhbmdlXG4gICAgICogQHBhcmFtIG1heCAtIG1heCByYW5nZVxuICAgICAqIEByZXR1cm5zIHRoZSBwZXJjZW50YWdlXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmFuZ2VUb1BlcmNlbnQobnVtLCBtaW4sIG1heCkge1xuICAgICAgICByZXR1cm4gKG51bSAtIG1pbikgLyAobWF4IC0gbWluKTtcbiAgICB9XG4gICAgU2NhbGFyLnJhbmdlVG9QZXJjZW50ID0gcmFuZ2VUb1BlcmNlbnQ7XG4gICAgLyoqXG4gICAgICogVGhpcyBleHBvcnQgZnVuY3Rpb24gcmV0dXJucyBudW1iZXIgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgcGVyY2VudGFnZSBpbiBhIGdpdmVuIHJhbmdlLlxuICAgICAqXG4gICAgICogUGVyY2VudFRvUmFuZ2UoMC4zNCwwLDEwMCkgd2lsbCByZXR1cm4gMzQuXG4gICAgICogQHBhcmFtIHBlcmNlbnQgLSB0byBjb252ZXJ0IHRvIG51bWJlclxuICAgICAqIEBwYXJhbSBtaW4gLSBtaW4gcmFuZ2VcbiAgICAgKiBAcGFyYW0gbWF4IC0gbWF4IHJhbmdlXG4gICAgICogQHJldHVybnMgdGhlIG51bWJlclxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHBlcmNlbnRUb1JhbmdlKHBlcmNlbnQsIG1pbiwgbWF4KSB7XG4gICAgICAgIHJldHVybiAobWF4IC0gbWluKSAqIHBlcmNlbnQgKyBtaW47XG4gICAgfVxuICAgIFNjYWxhci5wZXJjZW50VG9SYW5nZSA9IHBlcmNlbnRUb1JhbmdlO1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGFuZ2xlIGNvbnZlcnRlZCB0byBlcXVpdmFsZW50IHZhbHVlIGJldHdlZW4gLU1hdGguUEkgYW5kIE1hdGguUEkgcmFkaWFucy5cbiAgICAgKiBAcGFyYW0gYW5nbGUgLSBUaGUgYW5nbGUgdG8gbm9ybWFsaXplIGluIHJhZGlhbi5cbiAgICAgKiBAcmV0dXJucyBUaGUgY29udmVydGVkIGFuZ2xlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZVJhZGlhbnMoYW5nbGUpIHtcbiAgICAgICAgLy8gTW9yZSBwcmVjaXNlIGJ1dCBzbG93ZXIgdmVyc2lvbiBrZXB0IGZvciByZWZlcmVuY2UuXG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlOm5vLWNvbW1lbnRlZC1vdXQtY29kZVxuICAgICAgICAvKlxuICAgICAgICAvLyBhbmdsZSA9IGFuZ2xlICUgVG9vbHMuVHdvUGk7XG4gICAgICAgIC8vIGFuZ2xlID0gKGFuZ2xlICsgVG9vbHMuVHdvUGkpICUgVG9vbHMuVHdvUGk7XG4gICAgXG4gICAgICAgIC8vaWYgKGFuZ2xlID4gTWF0aC5QSSkge1xuICAgICAgICAvL1x0YW5nbGUgLT0gVG9vbHMuVHdvUGk7XG4gICAgICAgIC8vfVxuICAgICAgICAgICovXG4gICAgICAgIHJldHVybiBhbmdsZSAtIFNjYWxhci5Ud29QaSAqIE1hdGguZmxvb3IoKGFuZ2xlICsgTWF0aC5QSSkgLyBTY2FsYXIuVHdvUGkpO1xuICAgIH1cbiAgICBTY2FsYXIubm9ybWFsaXplUmFkaWFucyA9IG5vcm1hbGl6ZVJhZGlhbnM7XG59KShTY2FsYXIgfHwgKFNjYWxhciA9IHt9KSk7XG4iLCAiaW1wb3J0IHsgRXBzaWxvbiB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgUXVhdGVybmlvbiB9IGZyb20gJy4vUXVhdGVybmlvbic7XG5pbXBvcnQgeyBTY2FsYXIgfSBmcm9tICcuL1NjYWxhcic7XG4vKipcbiAqIEBwdWJsaWNcbiAqIFZlY3RvcjMgaXMgYSB0eXBlIGFuZCBhIG5hbWVzcGFjZS5cbiAqIGBgYFxuICogLy8gVGhlIG5hbWVzcGFjZSBjb250YWlucyBhbGwgdHlwZXMgYW5kIGZ1bmN0aW9ucyB0byBvcGVyYXRlcyB3aXRoIFZlY3RvcjNcbiAqIGNvbnN0IG5leHQgPSBWZWN0b3IzLmFkZChwb2ludEEsIHZlbG9jaXR5QSlcbiAqIC8vIFRoZSB0eXBlIFZlY3RvcjMgaXMgYW4gYWxpYXMgdG8gVmVjdG9yMy5SZWFkb25seVZlY3RvcjNcbiAqIGNvbnN0IHJlYWRvbmx5UG9zaXRpb246IFZlY3RvcjMgPSBWZWN0b3IzLlplcm8oKVxuICogcmVhZG9ubHlQb3NpdGlvbi54ID0gMC4xIC8vIHRoaXMgRkFJTFNcbiAqXG4gKiAvLyBGb3IgbXV0YWJsZSB1c2FnZSwgdXNlIGBWZWN0b3IzLk11dGFibGVgXG4gKiBjb25zdCBwb3NpdGlvbjogVmVjdG9yMy5NdXRhYmxlID0gVmVjdG9yMy5PbmUoKVxuICogcG9zaXRpb24ueCA9IDMuMCAvLyB0aGlzIFdPUktTXG4gKiBgYGBcbiAqL1xuZXhwb3J0IHZhciBWZWN0b3IzO1xuKGZ1bmN0aW9uIChWZWN0b3IzKSB7XG4gICAgLyoqXG4gICAgICogR2V0cyBhIGJvb2xlYW4gaW5kaWNhdGluZyB0aGF0IHRoZSB2ZWN0b3IgaXMgbm9uIHVuaWZvcm0gbWVhbmluZyB4LCB5IG9yIHogYXJlIG5vdCBhbGwgdGhlIHNhbWVcbiAgICAgKiBAcGFyYW0gdmVjdG9yIC0gdmVjdG9yIHRvIGNoZWNrXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNOb25Vbmlmb3JtKHZlY3Rvcikge1xuICAgICAgICBjb25zdCBhYnNYID0gTWF0aC5hYnModmVjdG9yLngpO1xuICAgICAgICBjb25zdCBhYnNZID0gTWF0aC5hYnModmVjdG9yLnkpO1xuICAgICAgICBpZiAoYWJzWCAhPT0gYWJzWSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYWJzWiA9IE1hdGguYWJzKHZlY3Rvci56KTtcbiAgICAgICAgaWYgKGFic1ggIT09IGFic1opIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgVmVjdG9yMy5pc05vblVuaWZvcm0gPSBpc05vblVuaWZvcm07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBWZWN0b3IzIG9iamVjdCBmcm9tIHRoZSBnaXZlbiB4LCB5LCB6IChmbG9hdHMpIGNvb3JkaW5hdGVzLlxuICAgICAqIEBwYXJhbSB4IC0gZGVmaW5lcyB0aGUgZmlyc3QgY29vcmRpbmF0ZXMgKG9uIFggYXhpcylcbiAgICAgKiBAcGFyYW0geSAtIGRlZmluZXMgdGhlIHNlY29uZCBjb29yZGluYXRlcyAob24gWSBheGlzKVxuICAgICAqIEBwYXJhbSB6IC0gZGVmaW5lcyB0aGUgdGhpcmQgY29vcmRpbmF0ZXMgKG9uIFogYXhpcylcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUoXG4gICAgLyoqXG4gICAgICogRGVmaW5lcyB0aGUgZmlyc3QgY29vcmRpbmF0ZXMgKG9uIFggYXhpcylcbiAgICAgKi9cbiAgICB4ID0gMCwgXG4gICAgLyoqXG4gICAgICogRGVmaW5lcyB0aGUgc2Vjb25kIGNvb3JkaW5hdGVzIChvbiBZIGF4aXMpXG4gICAgICovXG4gICAgeSA9IDAsIFxuICAgIC8qKlxuICAgICAqIERlZmluZXMgdGhlIHRoaXJkIGNvb3JkaW5hdGVzIChvbiBaIGF4aXMpXG4gICAgICovXG4gICAgeiA9IDApIHtcbiAgICAgICAgcmV0dXJuIHsgeCwgeSwgeiB9O1xuICAgIH1cbiAgICBWZWN0b3IzLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgbmV3IFZlY3RvcjMgYXMgdGhlIHJlc3VsdCBvZiB0aGUgYWRkaXRpb24gb2YgdGhlIHR3byBnaXZlbiB2ZWN0b3JzLlxuICAgICAqIEBwYXJhbSB2ZWN0b3IxIC0gdGhlIGZpcnN0IHZlY3RvclxuICAgICAqIEBwYXJhbSB2ZWN0b3IyIC0gdGhlIHNlY29uZCB2ZWN0b3JcbiAgICAgKiBAcmV0dXJucyB0aGUgcmVzdWx0aW5nIHZlY3RvclxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFkZCh2ZWN0b3IxLCB2ZWN0b3IyKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4OiB2ZWN0b3IxLnggKyB2ZWN0b3IyLngsXG4gICAgICAgICAgICB5OiB2ZWN0b3IxLnkgKyB2ZWN0b3IyLnksXG4gICAgICAgICAgICB6OiB2ZWN0b3IxLnogKyB2ZWN0b3IyLnpcbiAgICAgICAgfTtcbiAgICB9XG4gICAgVmVjdG9yMy5hZGQgPSBhZGQ7XG4gICAgLyoqXG4gICAgICogQWRkIGNvbXBvbmVudCBieSBjb21wb25lbnQgdGhlIHZlY3RvcjIgaW50byBkZXN0XG4gICAgICogQHBhcmFtIGRlc3QgLSB0aGUgZmlyc3QgdmVjdG9yIGFuZCBkZXN0aW5hdGlvbiBvZiBhZGRpdGlvblxuICAgICAqIEBwYXJhbSB2ZWN0b3IyIC0gdGhlIHNlY29uZCB2ZWN0b3JcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhZGRUb1JlZih2ZWN0b3IxLCB2ZWN0b3IyLCByZXN1bHQpIHtcbiAgICAgICAgcmVzdWx0LnggPSB2ZWN0b3IxLnggKyB2ZWN0b3IyLng7XG4gICAgICAgIHJlc3VsdC55ID0gdmVjdG9yMS55ICsgdmVjdG9yMi55O1xuICAgICAgICByZXN1bHQueiA9IHZlY3RvcjEueiArIHZlY3RvcjIuejtcbiAgICB9XG4gICAgVmVjdG9yMy5hZGRUb1JlZiA9IGFkZFRvUmVmO1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBuZXcgVmVjdG9yMyBhcyB0aGUgcmVzdWx0IG9mIHRoZSBzdWJzdHJhY3Rpb24gb2YgdGhlIHR3byBnaXZlbiB2ZWN0b3JzLlxuICAgICAqIEByZXR1cm5zIHRoZSByZXN1bHRpbmcgdmVjdG9yXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3VidHJhY3QodmVjdG9yMSwgdmVjdG9yMikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeDogdmVjdG9yMS54IC0gdmVjdG9yMi54LFxuICAgICAgICAgICAgeTogdmVjdG9yMS55IC0gdmVjdG9yMi55LFxuICAgICAgICAgICAgejogdmVjdG9yMS56IC0gdmVjdG9yMi56XG4gICAgICAgIH07XG4gICAgfVxuICAgIFZlY3RvcjMuc3VidHJhY3QgPSBzdWJ0cmFjdDtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgbmV3IFZlY3RvcjMgYXMgdGhlIHJlc3VsdCBvZiB0aGUgc3Vic3RyYWN0aW9uIG9mIHRoZSB0d28gZ2l2ZW4gdmVjdG9ycy5cbiAgICAgKiBAcmV0dXJucyB0aGUgcmVzdWx0aW5nIHZlY3RvclxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN1YnRyYWN0VG9SZWYodmVjdG9yMSwgdmVjdG9yMiwgcmVzdWx0KSB7XG4gICAgICAgIHJlc3VsdC54ID0gdmVjdG9yMS54IC0gdmVjdG9yMi54O1xuICAgICAgICByZXN1bHQueSA9IHZlY3RvcjEueSAtIHZlY3RvcjIueTtcbiAgICAgICAgcmVzdWx0LnogPSB2ZWN0b3IxLnogLSB2ZWN0b3IyLno7XG4gICAgfVxuICAgIFZlY3RvcjMuc3VidHJhY3RUb1JlZiA9IHN1YnRyYWN0VG9SZWY7XG4gICAgLyoqXG4gICAgICogU3VidHJhY3RzIHRoZSBnaXZlbiBmbG9hdHMgZnJvbSB0aGUgY3VycmVudCBWZWN0b3IzIGNvb3JkaW5hdGVzIGFuZCBzZXQgdGhlIGdpdmVuIHZlY3RvciBcInJlc3VsdFwiIHdpdGggdGhpcyByZXN1bHRcbiAgICAgKiBAcGFyYW0geCAtIGRlZmluZXMgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgb3BlcmFuZFxuICAgICAqIEBwYXJhbSB5IC0gZGVmaW5lcyB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBvcGVyYW5kXG4gICAgICogQHBhcmFtIHogLSBkZWZpbmVzIHRoZSB6IGNvb3JkaW5hdGUgb2YgdGhlIG9wZXJhbmRcbiAgICAgKiBAcGFyYW0gcmVzdWx0IC0gZGVmaW5lcyB0aGUgVmVjdG9yMyBvYmplY3Qgd2hlcmUgdG8gc3RvcmUgdGhlIHJlc3VsdFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN1YnRyYWN0RnJvbUZsb2F0c1RvUmVmKHZlY3RvcjEsIHgsIHksIHosIHJlc3VsdCkge1xuICAgICAgICByZXN1bHQueCA9IHZlY3RvcjEueCAtIHg7XG4gICAgICAgIHJlc3VsdC55ID0gdmVjdG9yMS55IC0geTtcbiAgICAgICAgcmVzdWx0LnogPSB2ZWN0b3IxLnogLSB6O1xuICAgIH1cbiAgICBWZWN0b3IzLnN1YnRyYWN0RnJvbUZsb2F0c1RvUmVmID0gc3VidHJhY3RGcm9tRmxvYXRzVG9SZWY7XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIG5ldyBWZWN0b3IzIHdpdGggdGhlIG90aGVyIHNpZ25cbiAgICAgKiBAcmV0dXJucyB0aGUgcmVzdWx0aW5nIHZlY3RvclxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG5lZ2F0ZSh2YWx1ZSkge1xuICAgICAgICByZXR1cm4geyB4OiAtdmFsdWUueCwgeTogLXZhbHVlLnksIHo6IC12YWx1ZS56IH07XG4gICAgfVxuICAgIFZlY3RvcjMubmVnYXRlID0gbmVnYXRlO1xuICAgIC8qKlxuICAgICAqIENvcHkgc291cmNlIGludG8gZGVzdFxuICAgICAqXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29weUZyb20oc291cmNlLCBkZXN0KSB7XG4gICAgICAgIGRlc3QueCA9IHNvdXJjZS54O1xuICAgICAgICBkZXN0LnkgPSBzb3VyY2UueTtcbiAgICAgICAgZGVzdC56ID0gc291cmNlLno7XG4gICAgfVxuICAgIFZlY3RvcjMuY29weUZyb20gPSBjb3B5RnJvbTtcbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBnaXZlbiB2ZWN0b3IgXCJkZXN0XCIgd2l0aCB0aGUgZ2l2ZW4gZmxvYXRzLlxuICAgICAqIEBwYXJhbSB4IC0gZGVmaW5lcyB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBzb3VyY2VcbiAgICAgKiBAcGFyYW0geSAtIGRlZmluZXMgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc291cmNlXG4gICAgICogQHBhcmFtIHogLSBkZWZpbmVzIHRoZSB6IGNvb3JkaW5hdGUgb2YgdGhlIHNvdXJjZVxuICAgICAqIEBwYXJhbSBkZXN0IC0gZGVmaW5lcyB0aGUgVmVjdG9yMyB3aGVyZSB0byBzdG9yZSB0aGUgcmVzdWx0XG4gICAgICovXG4gICAgZnVuY3Rpb24gY29weUZyb21GbG9hdHMoeCwgeSwgeiwgZGVzdCkge1xuICAgICAgICBkZXN0LnggPSB4O1xuICAgICAgICBkZXN0LnkgPSB5O1xuICAgICAgICBkZXN0LnogPSB6O1xuICAgIH1cbiAgICBWZWN0b3IzLmNvcHlGcm9tRmxvYXRzID0gY29weUZyb21GbG9hdHM7XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIG5ldyBWZWN0b3IzIHdpdGggdGhlIHNhbWUgdmFsdWVcbiAgICAgKiBAcmV0dXJucyB0aGUgcmVzdWx0aW5nIHZlY3RvclxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lKHNvdXJjZSkge1xuICAgICAgICByZXR1cm4gY3JlYXRlKHNvdXJjZS54LCBzb3VyY2UueSwgc291cmNlLnopO1xuICAgIH1cbiAgICBWZWN0b3IzLmNsb25lID0gY2xvbmU7XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBjbGlwIGZhY3RvciBiZXR3ZWVuIHR3byB2ZWN0b3JzXG4gICAgICogQHBhcmFtIHZlY3RvcjAgLSBkZWZpbmVzIHRoZSBmaXJzdCBvcGVyYW5kXG4gICAgICogQHBhcmFtIHZlY3RvcjEgLSBkZWZpbmVzIHRoZSBzZWNvbmQgb3BlcmFuZFxuICAgICAqIEBwYXJhbSBheGlzIC0gZGVmaW5lcyB0aGUgYXhpcyB0byB1c2VcbiAgICAgKiBAcGFyYW0gc2l6ZSAtIGRlZmluZXMgdGhlIHNpemUgYWxvbmcgdGhlIGF4aXNcbiAgICAgKiBAcmV0dXJucyB0aGUgY2xpcCBmYWN0b3JcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRDbGlwRmFjdG9yKHZlY3RvcjAsIHZlY3RvcjEsIGF4aXMsIHNpemUpIHtcbiAgICAgICAgY29uc3QgZDAgPSBkb3QodmVjdG9yMCwgYXhpcykgLSBzaXplO1xuICAgICAgICBjb25zdCBkMSA9IGRvdCh2ZWN0b3IxLCBheGlzKSAtIHNpemU7XG4gICAgICAgIGNvbnN0IHMgPSBkMCAvIChkMCAtIGQxKTtcbiAgICAgICAgcmV0dXJuIHM7XG4gICAgfVxuICAgIFZlY3RvcjMuZ2V0Q2xpcEZhY3RvciA9IGdldENsaXBGYWN0b3I7XG4gICAgLyoqXG4gICAgICogR2V0IGFuZ2xlIGJldHdlZW4gdHdvIHZlY3RvcnNcbiAgICAgKiBAcGFyYW0gdmVjdG9yMCAtIGFuZ2xlIGJldHdlZW4gdmVjdG9yMCBhbmQgdmVjdG9yMVxuICAgICAqIEBwYXJhbSB2ZWN0b3IxIC0gYW5nbGUgYmV0d2VlbiB2ZWN0b3IwIGFuZCB2ZWN0b3IxXG4gICAgICogQHBhcmFtIG5vcm1hbCAtIGRpcmVjdGlvbiBvZiB0aGUgbm9ybWFsXG4gICAgICogQHJldHVybnMgdGhlIGFuZ2xlIGJldHdlZW4gdmVjdG9yMCBhbmQgdmVjdG9yMVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldEFuZ2xlQmV0d2VlblZlY3RvcnModmVjdG9yMCwgdmVjdG9yMSwgbm9ybWFsKSB7XG4gICAgICAgIGNvbnN0IHYwID0gbm9ybWFsaXplKHZlY3RvcjApO1xuICAgICAgICBjb25zdCB2MSA9IG5vcm1hbGl6ZSh2ZWN0b3IxKTtcbiAgICAgICAgY29uc3QgdjB2MWRvdCA9IGRvdCh2MCwgdjEpO1xuICAgICAgICBjb25zdCBuID0gY3JlYXRlKCk7XG4gICAgICAgIGNyb3NzVG9SZWYodjAsIHYxLCBuKTtcbiAgICAgICAgaWYgKGRvdChuLCBub3JtYWwpID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGguYWNvcyh2MHYxZG90KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gLU1hdGguYWNvcyh2MHYxZG90KTtcbiAgICB9XG4gICAgVmVjdG9yMy5nZXRBbmdsZUJldHdlZW5WZWN0b3JzID0gZ2V0QW5nbGVCZXR3ZWVuVmVjdG9ycztcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgbmV3IFZlY3RvcjMgc2V0IGZyb20gdGhlIGluZGV4IFwib2Zmc2V0XCIgb2YgdGhlIGdpdmVuIGFycmF5XG4gICAgICogQHBhcmFtIGFycmF5IC0gZGVmaW5lcyB0aGUgc291cmNlIGFycmF5XG4gICAgICogQHBhcmFtIG9mZnNldCAtIGRlZmluZXMgdGhlIG9mZnNldCBpbiB0aGUgc291cmNlIGFycmF5XG4gICAgICogQHJldHVybnMgdGhlIG5ldyBWZWN0b3IzXG4gICAgICovXG4gICAgZnVuY3Rpb24gZnJvbUFycmF5KGFycmF5LCBvZmZzZXQgPSAwKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGUoYXJyYXlbb2Zmc2V0XSwgYXJyYXlbb2Zmc2V0ICsgMV0sIGFycmF5W29mZnNldCArIDJdKTtcbiAgICB9XG4gICAgVmVjdG9yMy5mcm9tQXJyYXkgPSBmcm9tQXJyYXk7XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIG5ldyBWZWN0b3IzIHNldCBmcm9tIHRoZSBpbmRleCBcIm9mZnNldFwiIG9mIHRoZSBnaXZlbiBGbG9hdEFycmF5XG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyBkZXByZWNhdGVkLiAgVXNlIEZyb21BcnJheSBpbnN0ZWFkXG4gICAgICogQHBhcmFtIGFycmF5IC0gZGVmaW5lcyB0aGUgc291cmNlIGFycmF5XG4gICAgICogQHBhcmFtIG9mZnNldCAtIGRlZmluZXMgdGhlIG9mZnNldCBpbiB0aGUgc291cmNlIGFycmF5XG4gICAgICogQHJldHVybnMgdGhlIG5ldyBWZWN0b3IzXG4gICAgICovXG4gICAgZnVuY3Rpb24gZnJvbUZsb2F0QXJyYXkoYXJyYXksIG9mZnNldCkge1xuICAgICAgICByZXR1cm4gZnJvbUFycmF5KGFycmF5LCBvZmZzZXQpO1xuICAgIH1cbiAgICBWZWN0b3IzLmZyb21GbG9hdEFycmF5ID0gZnJvbUZsb2F0QXJyYXk7XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgZ2l2ZW4gdmVjdG9yIFwicmVzdWx0XCIgd2l0aCB0aGUgZWxlbWVudCB2YWx1ZXMgZnJvbSB0aGUgaW5kZXggXCJvZmZzZXRcIiBvZiB0aGUgZ2l2ZW4gYXJyYXlcbiAgICAgKiBAcGFyYW0gYXJyYXkgLSBkZWZpbmVzIHRoZSBzb3VyY2UgYXJyYXlcbiAgICAgKiBAcGFyYW0gb2Zmc2V0IC0gZGVmaW5lcyB0aGUgb2Zmc2V0IGluIHRoZSBzb3VyY2UgYXJyYXlcbiAgICAgKiBAcGFyYW0gcmVzdWx0IC0gZGVmaW5lcyB0aGUgVmVjdG9yMyB3aGVyZSB0byBzdG9yZSB0aGUgcmVzdWx0XG4gICAgICovXG4gICAgZnVuY3Rpb24gZnJvbUFycmF5VG9SZWYoYXJyYXksIG9mZnNldCwgcmVzdWx0KSB7XG4gICAgICAgIHJlc3VsdC54ID0gYXJyYXlbb2Zmc2V0XTtcbiAgICAgICAgcmVzdWx0LnkgPSBhcnJheVtvZmZzZXQgKyAxXTtcbiAgICAgICAgcmVzdWx0LnogPSBhcnJheVtvZmZzZXQgKyAyXTtcbiAgICB9XG4gICAgVmVjdG9yMy5mcm9tQXJyYXlUb1JlZiA9IGZyb21BcnJheVRvUmVmO1xuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGdpdmVuIHZlY3RvciBcInJlc3VsdFwiIHdpdGggdGhlIGVsZW1lbnQgdmFsdWVzIGZyb20gdGhlIGluZGV4IFwib2Zmc2V0XCIgb2YgdGhlIGdpdmVuIEZsb2F0QXJyYXlcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQuICBVc2UgRnJvbUFycmF5VG9SZWYgaW5zdGVhZC5cbiAgICAgKiBAcGFyYW0gYXJyYXkgLSBkZWZpbmVzIHRoZSBzb3VyY2UgYXJyYXlcbiAgICAgKiBAcGFyYW0gb2Zmc2V0IC0gZGVmaW5lcyB0aGUgb2Zmc2V0IGluIHRoZSBzb3VyY2UgYXJyYXlcbiAgICAgKiBAcGFyYW0gcmVzdWx0IC0gZGVmaW5lcyB0aGUgVmVjdG9yMyB3aGVyZSB0byBzdG9yZSB0aGUgcmVzdWx0XG4gICAgICovXG4gICAgZnVuY3Rpb24gZnJvbUZsb2F0QXJyYXlUb1JlZihhcnJheSwgb2Zmc2V0LCByZXN1bHQpIHtcbiAgICAgICAgcmV0dXJuIGZyb21BcnJheVRvUmVmKGFycmF5LCBvZmZzZXQsIHJlc3VsdCk7XG4gICAgfVxuICAgIFZlY3RvcjMuZnJvbUZsb2F0QXJyYXlUb1JlZiA9IGZyb21GbG9hdEFycmF5VG9SZWY7XG4gICAgLy8gUHJvcGVydGllc1xuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGxlbmd0aCBvZiB0aGUgVmVjdG9yM1xuICAgICAqIEByZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIFZlY3RvcjNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsZW5ndGgodmVjdG9yKSB7XG4gICAgICAgIHJldHVybiBNYXRoLnNxcnQodmVjdG9yLnggKiB2ZWN0b3IueCArIHZlY3Rvci55ICogdmVjdG9yLnkgKyB2ZWN0b3IueiAqIHZlY3Rvci56KTtcbiAgICB9XG4gICAgVmVjdG9yMy5sZW5ndGggPSBsZW5ndGg7XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgc3F1YXJlZCBsZW5ndGggb2YgdGhlIFZlY3RvcjNcbiAgICAgKiBAcmV0dXJucyBzcXVhcmVkIGxlbmd0aCBvZiB0aGUgVmVjdG9yM1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGxlbmd0aFNxdWFyZWQodmVjdG9yKSB7XG4gICAgICAgIHJldHVybiB2ZWN0b3IueCAqIHZlY3Rvci54ICsgdmVjdG9yLnkgKiB2ZWN0b3IueSArIHZlY3Rvci56ICogdmVjdG9yLno7XG4gICAgfVxuICAgIFZlY3RvcjMubGVuZ3RoU3F1YXJlZCA9IGxlbmd0aFNxdWFyZWQ7XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIG5ldyBWZWN0b3IzIHNldCB3aXRoIHRoZSBjdXJyZW50IFZlY3RvcjMgY29vcmRpbmF0ZXMgbXVsdGlwbGllZCBieSB0aGUgZmxvYXQgXCJzY2FsZVwiXG4gICAgICogQHBhcmFtIHNjYWxlIC0gZGVmaW5lcyB0aGUgbXVsdGlwbGllciBmYWN0b3JcbiAgICAgKiBAcmV0dXJucyBhIG5ldyBWZWN0b3IzXG4gICAgICovXG4gICAgZnVuY3Rpb24gc2NhbGVUb1JlZih2ZWN0b3IsIHNjYWxlLCByZXN1bHQpIHtcbiAgICAgICAgcmVzdWx0LnggPSB2ZWN0b3IueCAqIHNjYWxlO1xuICAgICAgICByZXN1bHQueSA9IHZlY3Rvci55ICogc2NhbGU7XG4gICAgICAgIHJlc3VsdC56ID0gdmVjdG9yLnogKiBzY2FsZTtcbiAgICB9XG4gICAgVmVjdG9yMy5zY2FsZVRvUmVmID0gc2NhbGVUb1JlZjtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgbmV3IFZlY3RvcjMgc2V0IHdpdGggdGhlIGN1cnJlbnQgVmVjdG9yMyBjb29yZGluYXRlcyBtdWx0aXBsaWVkIGJ5IHRoZSBmbG9hdCBcInNjYWxlXCJcbiAgICAgKiBAcGFyYW0gc2NhbGUgLSBkZWZpbmVzIHRoZSBtdWx0aXBsaWVyIGZhY3RvclxuICAgICAqIEByZXR1cm5zIGEgbmV3IFZlY3RvcjNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzY2FsZSh2ZWN0b3IsIHNjYWxlKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGUodmVjdG9yLnggKiBzY2FsZSwgdmVjdG9yLnkgKiBzY2FsZSwgdmVjdG9yLnogKiBzY2FsZSk7XG4gICAgfVxuICAgIFZlY3RvcjMuc2NhbGUgPSBzY2FsZTtcbiAgICAvKipcbiAgICAgKiBOb3JtYWxpemUgdGhlIGN1cnJlbnQgVmVjdG9yMyB3aXRoIHRoZSBnaXZlbiBpbnB1dCBsZW5ndGguXG4gICAgICogUGxlYXNlIG5vdGUgdGhhdCB0aGlzIGlzIGFuIGluIHBsYWNlIG9wZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0gbGVuIC0gdGhlIGxlbmd0aCBvZiB0aGUgdmVjdG9yXG4gICAgICogQHJldHVybnMgdGhlIGN1cnJlbnQgdXBkYXRlZCBWZWN0b3IzXG4gICAgICovXG4gICAgZnVuY3Rpb24gbm9ybWFsaXplRnJvbUxlbmd0aCh2ZWN0b3IsIGxlbikge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBjcmVhdGUoMCwgMCwgMCk7XG4gICAgICAgIG5vcm1hbGl6ZUZyb21MZW5ndGhUb1JlZih2ZWN0b3IsIGxlbiwgcmVzdWx0KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgVmVjdG9yMy5ub3JtYWxpemVGcm9tTGVuZ3RoID0gbm9ybWFsaXplRnJvbUxlbmd0aDtcbiAgICAvKipcbiAgICAgKiBOb3JtYWxpemUgdGhlIGN1cnJlbnQgVmVjdG9yMyB3aXRoIHRoZSBnaXZlbiBpbnB1dCBsZW5ndGguXG4gICAgICogUGxlYXNlIG5vdGUgdGhhdCB0aGlzIGlzIGFuIGluIHBsYWNlIG9wZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0gbGVuIC0gdGhlIGxlbmd0aCBvZiB0aGUgdmVjdG9yXG4gICAgICogQHJldHVybnMgdGhlIGN1cnJlbnQgdXBkYXRlZCBWZWN0b3IzXG4gICAgICovXG4gICAgZnVuY3Rpb24gbm9ybWFsaXplRnJvbUxlbmd0aFRvUmVmKHZlY3RvciwgbGVuLCByZXN1bHQpIHtcbiAgICAgICAgaWYgKGxlbiA9PT0gMCB8fCBsZW4gPT09IDEuMCkge1xuICAgICAgICAgICAgY29weUZyb20odmVjdG9yLCByZXN1bHQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHNjYWxlVG9SZWYodmVjdG9yLCAxLjAgLyBsZW4sIHJlc3VsdCk7XG4gICAgfVxuICAgIFZlY3RvcjMubm9ybWFsaXplRnJvbUxlbmd0aFRvUmVmID0gbm9ybWFsaXplRnJvbUxlbmd0aFRvUmVmO1xuICAgIC8qKlxuICAgICAqIE5vcm1hbGl6ZSB0aGUgY3VycmVudCBWZWN0b3IzLlxuICAgICAqIFBsZWFzZSBub3RlIHRoYXQgdGhpcyBpcyBhbiBpbiBwbGFjZSBvcGVyYXRpb24uXG4gICAgICogQHJldHVybnMgdGhlIGN1cnJlbnQgdXBkYXRlZCBWZWN0b3IzXG4gICAgICovXG4gICAgZnVuY3Rpb24gbm9ybWFsaXplKHZlY3Rvcikge1xuICAgICAgICByZXR1cm4gbm9ybWFsaXplRnJvbUxlbmd0aCh2ZWN0b3IsIGxlbmd0aCh2ZWN0b3IpKTtcbiAgICB9XG4gICAgVmVjdG9yMy5ub3JtYWxpemUgPSBub3JtYWxpemU7XG4gICAgLyoqXG4gICAgICogTm9ybWFsaXplIHRoZSBjdXJyZW50IFZlY3RvcjMuXG4gICAgICogUGxlYXNlIG5vdGUgdGhhdCB0aGlzIGlzIGFuIGluIHBsYWNlIG9wZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB0aGUgY3VycmVudCB1cGRhdGVkIFZlY3RvcjNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBub3JtYWxpemVUb1JlZih2ZWN0b3IsIHJlc3VsdCkge1xuICAgICAgICBub3JtYWxpemVGcm9tTGVuZ3RoVG9SZWYodmVjdG9yLCBsZW5ndGgodmVjdG9yKSwgcmVzdWx0KTtcbiAgICB9XG4gICAgVmVjdG9yMy5ub3JtYWxpemVUb1JlZiA9IG5vcm1hbGl6ZVRvUmVmO1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGRvdCBwcm9kdWN0IChmbG9hdCkgYmV0d2VlbiB0aGUgdmVjdG9ycyBcImxlZnRcIiBhbmQgXCJyaWdodFwiXG4gICAgICogQHBhcmFtIGxlZnQgLSBkZWZpbmVzIHRoZSBsZWZ0IG9wZXJhbmRcbiAgICAgKiBAcGFyYW0gcmlnaHQgLSBkZWZpbmVzIHRoZSByaWdodCBvcGVyYW5kXG4gICAgICogQHJldHVybnMgdGhlIGRvdCBwcm9kdWN0XG4gICAgICovXG4gICAgZnVuY3Rpb24gZG90KGxlZnQsIHJpZ2h0KSB7XG4gICAgICAgIHJldHVybiBsZWZ0LnggKiByaWdodC54ICsgbGVmdC55ICogcmlnaHQueSArIGxlZnQueiAqIHJpZ2h0Lno7XG4gICAgfVxuICAgIFZlY3RvcjMuZG90ID0gZG90O1xuICAgIC8qKlxuICAgICAqIE11bHRpcGxpZXMgdGhpcyB2ZWN0b3IgKHdpdGggYW4gaW1wbGljaXQgMSBpbiB0aGUgNHRoIGRpbWVuc2lvbikgYW5kIG0sIGFuZCBkaXZpZGVzIGJ5IHBlcnNwZWN0aXZlXG4gICAgICogQHBhcmFtIG1hdHJpeCAtIFRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXhcbiAgICAgKiBAcmV0dXJucyByZXN1bHQgVmVjdG9yM1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFwcGx5TWF0cml4NCh2ZWN0b3IsIG1hdHJpeCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBjbG9uZSh2ZWN0b3IpO1xuICAgICAgICBhcHBseU1hdHJpeDRUb1JlZih2ZWN0b3IsIG1hdHJpeCwgcmVzdWx0KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgVmVjdG9yMy5hcHBseU1hdHJpeDQgPSBhcHBseU1hdHJpeDQ7XG4gICAgLyoqXG4gICAgICogTXVsdGlwbGllcyB0aGlzIHZlY3RvciAod2l0aCBhbiBpbXBsaWNpdCAxIGluIHRoZSA0dGggZGltZW5zaW9uKSBhbmQgbSwgYW5kIGRpdmlkZXMgYnkgcGVyc3BlY3RpdmUgYW5kIHNldCB0aGUgZ2l2ZW4gdmVjdG9yIFwicmVzdWx0XCIgd2l0aCB0aGlzIHJlc3VsdFxuICAgICAqIEBwYXJhbSBtYXRyaXggLSBUaGUgdHJhbnNmb3JtYXRpb24gbWF0cml4XG4gICAgICogQHBhcmFtIHJlc3VsdCAtIGRlZmluZXMgdGhlIFZlY3RvcjMgb2JqZWN0IHdoZXJlIHRvIHN0b3JlIHRoZSByZXN1bHRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhcHBseU1hdHJpeDRUb1JlZih2ZWN0b3IsIG1hdHJpeCwgcmVzdWx0KSB7XG4gICAgICAgIGNvbnN0IHsgeCwgeSwgeiB9ID0gdmVjdG9yO1xuICAgICAgICBjb25zdCBtID0gbWF0cml4Ll9tO1xuICAgICAgICBjb25zdCB3ID0gMSAvIChtWzNdICogeCArIG1bN10gKiB5ICsgbVsxMV0gKiB6ICsgbVsxNV0pO1xuICAgICAgICByZXN1bHQueCA9IChtWzBdICogeCArIG1bNF0gKiB5ICsgbVs4XSAqIHogKyBtWzEyXSkgKiB3O1xuICAgICAgICByZXN1bHQueSA9IChtWzFdICogeCArIG1bNV0gKiB5ICsgbVs5XSAqIHogKyBtWzEzXSkgKiB3O1xuICAgICAgICByZXN1bHQueiA9IChtWzJdICogeCArIG1bNl0gKiB5ICsgbVsxMF0gKiB6ICsgbVsxNF0pICogdztcbiAgICB9XG4gICAgVmVjdG9yMy5hcHBseU1hdHJpeDRUb1JlZiA9IGFwcGx5TWF0cml4NFRvUmVmO1xuICAgIC8qKlxuICAgICAqIFJvdGF0ZXMgdGhlIGN1cnJlbnQgVmVjdG9yMyBiYXNlZCBvbiB0aGUgZ2l2ZW4gcXVhdGVybmlvblxuICAgICAqIEBwYXJhbSBxIC0gZGVmaW5lcyB0aGUgUXVhdGVybmlvblxuICAgICAqIEByZXR1cm5zIHRoZSBjdXJyZW50IFZlY3RvcjNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiByb3RhdGUodmVjdG9yLCBxKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGNyZWF0ZSgpO1xuICAgICAgICByb3RhdGVUb1JlZih2ZWN0b3IsIHEsIHJlc3VsdCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIFZlY3RvcjMucm90YXRlID0gcm90YXRlO1xuICAgIC8qKlxuICAgICAqIFJvdGF0ZXMgY3VycmVudCBWZWN0b3IzIGJhc2VkIG9uIHRoZSBnaXZlbiBxdWF0ZXJuaW9uLCBidXQgYXBwbGllcyB0aGUgcm90YXRpb24gdG8gdGFyZ2V0IFZlY3RvcjMuXG4gICAgICogQHBhcmFtIHEgLSBkZWZpbmVzIHRoZSBRdWF0ZXJuaW9uXG4gICAgICogQHBhcmFtIHJlc3VsdCAtIGRlZmluZXMgdGhlIHRhcmdldCBWZWN0b3IzXG4gICAgICogQHJldHVybnMgdGhlIGN1cnJlbnQgVmVjdG9yM1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJvdGF0ZVRvUmVmKHZlY3RvciwgcSwgcmVzdWx0KSB7XG4gICAgICAgIGNvbnN0IHsgeCwgeSwgeiB9ID0gdmVjdG9yO1xuICAgICAgICBjb25zdCB7IHg6IHF4LCB5OiBxeSwgejogcXosIHc6IHF3IH0gPSBxO1xuICAgICAgICAvLyBjYWxjdWxhdGUgcXVhdCAqIHZlY3RvclxuICAgICAgICBjb25zdCBpeCA9IHF3ICogeCArIHF5ICogeiAtIHF6ICogeTtcbiAgICAgICAgY29uc3QgaXkgPSBxdyAqIHkgKyBxeiAqIHggLSBxeCAqIHo7XG4gICAgICAgIGNvbnN0IGl6ID0gcXcgKiB6ICsgcXggKiB5IC0gcXkgKiB4O1xuICAgICAgICBjb25zdCBpdyA9IC1xeCAqIHggLSBxeSAqIHkgLSBxeiAqIHo7XG4gICAgICAgIC8vIGNhbGN1bGF0ZSByZXN1bHQgKiBpbnZlcnNlIHF1YXRcbiAgICAgICAgcmVzdWx0LnggPSBpeCAqIHF3ICsgaXcgKiAtcXggKyBpeSAqIC1xeiAtIGl6ICogLXF5O1xuICAgICAgICByZXN1bHQueSA9IGl5ICogcXcgKyBpdyAqIC1xeSArIGl6ICogLXF4IC0gaXggKiAtcXo7XG4gICAgICAgIHJlc3VsdC56ID0gaXogKiBxdyArIGl3ICogLXF6ICsgaXggKiAtcXkgLSBpeSAqIC1xeDtcbiAgICB9XG4gICAgVmVjdG9yMy5yb3RhdGVUb1JlZiA9IHJvdGF0ZVRvUmVmO1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBuZXcgVmVjdG9yMyBsb2NhdGVkIGZvciBcImFtb3VudFwiIChmbG9hdCkgb24gdGhlIGxpbmVhciBpbnRlcnBvbGF0aW9uIGJldHdlZW4gdGhlIHZlY3RvcnMgXCJzdGFydFwiIGFuZCBcImVuZFwiXG4gICAgICogQHBhcmFtIHN0YXJ0IC0gZGVmaW5lcyB0aGUgc3RhcnQgdmFsdWVcbiAgICAgKiBAcGFyYW0gZW5kIC0gZGVmaW5lcyB0aGUgZW5kIHZhbHVlXG4gICAgICogQHBhcmFtIGFtb3VudCAtIG1heCBkZWZpbmVzIGFtb3VudCBiZXR3ZWVuIGJvdGggKGJldHdlZW4gMCBhbmQgMSlcbiAgICAgKiBAcmV0dXJucyB0aGUgbmV3IFZlY3RvcjNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsZXJwKHN0YXJ0LCBlbmQsIGFtb3VudCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBjcmVhdGUoMCwgMCwgMCk7XG4gICAgICAgIGxlcnBUb1JlZihzdGFydCwgZW5kLCBhbW91bnQsIHJlc3VsdCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIFZlY3RvcjMubGVycCA9IGxlcnA7XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgZ2l2ZW4gdmVjdG9yIFwicmVzdWx0XCIgd2l0aCB0aGUgcmVzdWx0IG9mIHRoZSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBmcm9tIHRoZSB2ZWN0b3IgXCJzdGFydFwiIGZvciBcImFtb3VudFwiIHRvIHRoZSB2ZWN0b3IgXCJlbmRcIlxuICAgICAqIEBwYXJhbSBzdGFydCAtIGRlZmluZXMgdGhlIHN0YXJ0IHZhbHVlXG4gICAgICogQHBhcmFtIGVuZCAtIGRlZmluZXMgdGhlIGVuZCB2YWx1ZVxuICAgICAqIEBwYXJhbSBhbW91bnQgLSBtYXggZGVmaW5lcyBhbW91bnQgYmV0d2VlbiBib3RoIChiZXR3ZWVuIDAgYW5kIDEpXG4gICAgICogQHBhcmFtIHJlc3VsdCAtIGRlZmluZXMgdGhlIFZlY3RvcjMgd2hlcmUgdG8gc3RvcmUgdGhlIHJlc3VsdFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGxlcnBUb1JlZihzdGFydCwgZW5kLCBhbW91bnQsIHJlc3VsdCkge1xuICAgICAgICByZXN1bHQueCA9IHN0YXJ0LnggKyAoZW5kLnggLSBzdGFydC54KSAqIGFtb3VudDtcbiAgICAgICAgcmVzdWx0LnkgPSBzdGFydC55ICsgKGVuZC55IC0gc3RhcnQueSkgKiBhbW91bnQ7XG4gICAgICAgIHJlc3VsdC56ID0gc3RhcnQueiArIChlbmQueiAtIHN0YXJ0LnopICogYW1vdW50O1xuICAgIH1cbiAgICBWZWN0b3IzLmxlcnBUb1JlZiA9IGxlcnBUb1JlZjtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgbmV3IFZlY3RvcjMgYXMgdGhlIGNyb3NzIHByb2R1Y3Qgb2YgdGhlIHZlY3RvcnMgXCJsZWZ0XCIgYW5kIFwicmlnaHRcIlxuICAgICAqIFRoZSBjcm9zcyBwcm9kdWN0IGlzIHRoZW4gb3J0aG9nb25hbCB0byBib3RoIFwibGVmdFwiIGFuZCBcInJpZ2h0XCJcbiAgICAgKiBAcGFyYW0gbGVmdCAtIGRlZmluZXMgdGhlIGxlZnQgb3BlcmFuZFxuICAgICAqIEBwYXJhbSByaWdodCAtIGRlZmluZXMgdGhlIHJpZ2h0IG9wZXJhbmRcbiAgICAgKiBAcmV0dXJucyB0aGUgY3Jvc3MgcHJvZHVjdFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyb3NzKGxlZnQsIHJpZ2h0KSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFplcm8oKTtcbiAgICAgICAgY3Jvc3NUb1JlZihsZWZ0LCByaWdodCwgcmVzdWx0KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgVmVjdG9yMy5jcm9zcyA9IGNyb3NzO1xuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGdpdmVuIHZlY3RvciBcInJlc3VsdFwiIHdpdGggdGhlIGNyb3NzIHByb2R1Y3Qgb2YgXCJsZWZ0XCIgYW5kIFwicmlnaHRcIlxuICAgICAqIFRoZSBjcm9zcyBwcm9kdWN0IGlzIHRoZW4gb3J0aG9nb25hbCB0byBib3RoIFwibGVmdFwiIGFuZCBcInJpZ2h0XCJcbiAgICAgKiBAcGFyYW0gbGVmdCAtIGRlZmluZXMgdGhlIGxlZnQgb3BlcmFuZFxuICAgICAqIEBwYXJhbSByaWdodCAtIGRlZmluZXMgdGhlIHJpZ2h0IG9wZXJhbmRcbiAgICAgKiBAcGFyYW0gcmVzdWx0IC0gZGVmaW5lcyB0aGUgVmVjdG9yMyB3aGVyZSB0byBzdG9yZSB0aGUgcmVzdWx0XG4gICAgICovXG4gICAgZnVuY3Rpb24gY3Jvc3NUb1JlZihsZWZ0LCByaWdodCwgcmVzdWx0KSB7XG4gICAgICAgIHJlc3VsdC54ID0gbGVmdC55ICogcmlnaHQueiAtIGxlZnQueiAqIHJpZ2h0Lnk7XG4gICAgICAgIHJlc3VsdC55ID0gbGVmdC56ICogcmlnaHQueCAtIGxlZnQueCAqIHJpZ2h0Lno7XG4gICAgICAgIHJlc3VsdC56ID0gbGVmdC54ICogcmlnaHQueSAtIGxlZnQueSAqIHJpZ2h0Lng7XG4gICAgfVxuICAgIFZlY3RvcjMuY3Jvc3NUb1JlZiA9IGNyb3NzVG9SZWY7XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIG5ldyBWZWN0b3IzIHNldCB3aXRoIHRoZSByZXN1bHQgb2YgdGhlIHRyYW5zZm9ybWF0aW9uIGJ5IHRoZSBnaXZlbiBtYXRyaXggb2YgdGhlIGdpdmVuIHZlY3Rvci5cbiAgICAgKiBUaGlzIG1ldGhvZCBjb21wdXRlcyB0cmFuZm9ybWVkIGNvb3JkaW5hdGVzIG9ubHksIG5vdCB0cmFuc2Zvcm1lZCBkaXJlY3Rpb24gdmVjdG9ycyAoaWUuIGl0IHRha2VzIHRyYW5zbGF0aW9uIGluIGFjY291bnQpXG4gICAgICogQHBhcmFtIHZlY3RvciAtIGRlZmluZXMgdGhlIFZlY3RvcjMgdG8gdHJhbnNmb3JtXG4gICAgICogQHBhcmFtIHRyYW5zZm9ybWF0aW9uIC0gZGVmaW5lcyB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4XG4gICAgICogQHJldHVybnMgdGhlIHRyYW5zZm9ybWVkIFZlY3RvcjNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0cmFuc2Zvcm1Db29yZGluYXRlcyh2ZWN0b3IsIHRyYW5zZm9ybWF0aW9uKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFplcm8oKTtcbiAgICAgICAgdHJhbnNmb3JtQ29vcmRpbmF0ZXNUb1JlZih2ZWN0b3IsIHRyYW5zZm9ybWF0aW9uLCByZXN1bHQpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBWZWN0b3IzLnRyYW5zZm9ybUNvb3JkaW5hdGVzID0gdHJhbnNmb3JtQ29vcmRpbmF0ZXM7XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgZ2l2ZW4gdmVjdG9yIFwicmVzdWx0XCIgY29vcmRpbmF0ZXMgd2l0aCB0aGUgcmVzdWx0IG9mIHRoZSB0cmFuc2Zvcm1hdGlvbiBieSB0aGUgZ2l2ZW4gbWF0cml4IG9mIHRoZSBnaXZlbiB2ZWN0b3JcbiAgICAgKiBUaGlzIG1ldGhvZCBjb21wdXRlcyB0cmFuZm9ybWVkIGNvb3JkaW5hdGVzIG9ubHksIG5vdCB0cmFuc2Zvcm1lZCBkaXJlY3Rpb24gdmVjdG9ycyAoaWUuIGl0IHRha2VzIHRyYW5zbGF0aW9uIGluIGFjY291bnQpXG4gICAgICogQHBhcmFtIHZlY3RvciAtIGRlZmluZXMgdGhlIFZlY3RvcjMgdG8gdHJhbnNmb3JtXG4gICAgICogQHBhcmFtIHRyYW5zZm9ybWF0aW9uIC0gZGVmaW5lcyB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4XG4gICAgICogQHBhcmFtIHJlc3VsdCAtIGRlZmluZXMgdGhlIFZlY3RvcjMgd2hlcmUgdG8gc3RvcmUgdGhlIHJlc3VsdFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRyYW5zZm9ybUNvb3JkaW5hdGVzVG9SZWYodmVjdG9yLCB0cmFuc2Zvcm1hdGlvbiwgcmVzdWx0KSB7XG4gICAgICAgIHJldHVybiB0cmFuc2Zvcm1Db29yZGluYXRlc0Zyb21GbG9hdHNUb1JlZih2ZWN0b3IueCwgdmVjdG9yLnksIHZlY3Rvci56LCB0cmFuc2Zvcm1hdGlvbiwgcmVzdWx0KTtcbiAgICB9XG4gICAgVmVjdG9yMy50cmFuc2Zvcm1Db29yZGluYXRlc1RvUmVmID0gdHJhbnNmb3JtQ29vcmRpbmF0ZXNUb1JlZjtcbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBnaXZlbiB2ZWN0b3IgXCJyZXN1bHRcIiBjb29yZGluYXRlcyB3aXRoIHRoZSByZXN1bHQgb2YgdGhlIHRyYW5zZm9ybWF0aW9uIGJ5IHRoZSBnaXZlbiBtYXRyaXggb2YgdGhlIGdpdmVuIGZsb2F0cyAoeCwgeSwgeilcbiAgICAgKiBUaGlzIG1ldGhvZCBjb21wdXRlcyB0cmFuZm9ybWVkIGNvb3JkaW5hdGVzIG9ubHksIG5vdCB0cmFuc2Zvcm1lZCBkaXJlY3Rpb24gdmVjdG9yc1xuICAgICAqIEBwYXJhbSB4IC0gZGVmaW5lIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHNvdXJjZSB2ZWN0b3JcbiAgICAgKiBAcGFyYW0geSAtIGRlZmluZSB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBzb3VyY2UgdmVjdG9yXG4gICAgICogQHBhcmFtIHogLSBkZWZpbmUgdGhlIHogY29vcmRpbmF0ZSBvZiB0aGUgc291cmNlIHZlY3RvclxuICAgICAqIEBwYXJhbSB0cmFuc2Zvcm1hdGlvbiAtIGRlZmluZXMgdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeFxuICAgICAqIEBwYXJhbSByZXN1bHQgLSBkZWZpbmVzIHRoZSBWZWN0b3IzIHdoZXJlIHRvIHN0b3JlIHRoZSByZXN1bHRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0cmFuc2Zvcm1Db29yZGluYXRlc0Zyb21GbG9hdHNUb1JlZih4LCB5LCB6LCB0cmFuc2Zvcm1hdGlvbiwgcmVzdWx0KSB7XG4gICAgICAgIGNvbnN0IG0gPSB0cmFuc2Zvcm1hdGlvbi5fbTtcbiAgICAgICAgY29uc3QgcnggPSB4ICogbVswXSArIHkgKiBtWzRdICsgeiAqIG1bOF0gKyBtWzEyXTtcbiAgICAgICAgY29uc3QgcnkgPSB4ICogbVsxXSArIHkgKiBtWzVdICsgeiAqIG1bOV0gKyBtWzEzXTtcbiAgICAgICAgY29uc3QgcnogPSB4ICogbVsyXSArIHkgKiBtWzZdICsgeiAqIG1bMTBdICsgbVsxNF07XG4gICAgICAgIGNvbnN0IHJ3ID0gMSAvICh4ICogbVszXSArIHkgKiBtWzddICsgeiAqIG1bMTFdICsgbVsxNV0pO1xuICAgICAgICByZXN1bHQueCA9IHJ4ICogcnc7XG4gICAgICAgIHJlc3VsdC55ID0gcnkgKiBydztcbiAgICAgICAgcmVzdWx0LnogPSByeiAqIHJ3O1xuICAgIH1cbiAgICBWZWN0b3IzLnRyYW5zZm9ybUNvb3JkaW5hdGVzRnJvbUZsb2F0c1RvUmVmID0gdHJhbnNmb3JtQ29vcmRpbmF0ZXNGcm9tRmxvYXRzVG9SZWY7XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIG5ldyBWZWN0b3IzIHNldCB3aXRoIHRoZSByZXN1bHQgb2YgdGhlIG5vcm1hbCB0cmFuc2Zvcm1hdGlvbiBieSB0aGUgZ2l2ZW4gbWF0cml4IG9mIHRoZSBnaXZlbiB2ZWN0b3JcbiAgICAgKiBUaGlzIG1ldGhvZHMgY29tcHV0ZXMgdHJhbnNmb3JtZWQgbm9ybWFsaXplZCBkaXJlY3Rpb24gdmVjdG9ycyBvbmx5IChpZS4gaXQgZG9lcyBub3QgYXBwbHkgdHJhbnNsYXRpb24pXG4gICAgICogQHBhcmFtIHZlY3RvciAtIGRlZmluZXMgdGhlIFZlY3RvcjMgdG8gdHJhbnNmb3JtXG4gICAgICogQHBhcmFtIHRyYW5zZm9ybWF0aW9uIC0gZGVmaW5lcyB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4XG4gICAgICogQHJldHVybnMgdGhlIG5ldyBWZWN0b3IzXG4gICAgICovXG4gICAgZnVuY3Rpb24gdHJhbnNmb3JtTm9ybWFsKHZlY3RvciwgdHJhbnNmb3JtYXRpb24pIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gWmVybygpO1xuICAgICAgICB0cmFuc2Zvcm1Ob3JtYWxUb1JlZih2ZWN0b3IsIHRyYW5zZm9ybWF0aW9uLCByZXN1bHQpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBWZWN0b3IzLnRyYW5zZm9ybU5vcm1hbCA9IHRyYW5zZm9ybU5vcm1hbDtcbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBnaXZlbiB2ZWN0b3IgXCJyZXN1bHRcIiB3aXRoIHRoZSByZXN1bHQgb2YgdGhlIG5vcm1hbCB0cmFuc2Zvcm1hdGlvbiBieSB0aGUgZ2l2ZW4gbWF0cml4IG9mIHRoZSBnaXZlbiB2ZWN0b3JcbiAgICAgKiBUaGlzIG1ldGhvZHMgY29tcHV0ZXMgdHJhbnNmb3JtZWQgbm9ybWFsaXplZCBkaXJlY3Rpb24gdmVjdG9ycyBvbmx5IChpZS4gaXQgZG9lcyBub3QgYXBwbHkgdHJhbnNsYXRpb24pXG4gICAgICogQHBhcmFtIHZlY3RvciAtIGRlZmluZXMgdGhlIFZlY3RvcjMgdG8gdHJhbnNmb3JtXG4gICAgICogQHBhcmFtIHRyYW5zZm9ybWF0aW9uIC0gZGVmaW5lcyB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4XG4gICAgICogQHBhcmFtIHJlc3VsdCAtIGRlZmluZXMgdGhlIFZlY3RvcjMgd2hlcmUgdG8gc3RvcmUgdGhlIHJlc3VsdFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRyYW5zZm9ybU5vcm1hbFRvUmVmKHZlY3RvciwgdHJhbnNmb3JtYXRpb24sIHJlc3VsdCkge1xuICAgICAgICB0cmFuc2Zvcm1Ob3JtYWxGcm9tRmxvYXRzVG9SZWYodmVjdG9yLngsIHZlY3Rvci55LCB2ZWN0b3IueiwgdHJhbnNmb3JtYXRpb24sIHJlc3VsdCk7XG4gICAgfVxuICAgIFZlY3RvcjMudHJhbnNmb3JtTm9ybWFsVG9SZWYgPSB0cmFuc2Zvcm1Ob3JtYWxUb1JlZjtcbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBnaXZlbiB2ZWN0b3IgXCJyZXN1bHRcIiB3aXRoIHRoZSByZXN1bHQgb2YgdGhlIG5vcm1hbCB0cmFuc2Zvcm1hdGlvbiBieSB0aGUgZ2l2ZW4gbWF0cml4IG9mIHRoZSBnaXZlbiBmbG9hdHMgKHgsIHksIHopXG4gICAgICogVGhpcyBtZXRob2RzIGNvbXB1dGVzIHRyYW5zZm9ybWVkIG5vcm1hbGl6ZWQgZGlyZWN0aW9uIHZlY3RvcnMgb25seSAoaWUuIGl0IGRvZXMgbm90IGFwcGx5IHRyYW5zbGF0aW9uKVxuICAgICAqIEBwYXJhbSB4IC0gZGVmaW5lIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHNvdXJjZSB2ZWN0b3JcbiAgICAgKiBAcGFyYW0geSAtIGRlZmluZSB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBzb3VyY2UgdmVjdG9yXG4gICAgICogQHBhcmFtIHogLSBkZWZpbmUgdGhlIHogY29vcmRpbmF0ZSBvZiB0aGUgc291cmNlIHZlY3RvclxuICAgICAqIEBwYXJhbSB0cmFuc2Zvcm1hdGlvbiAtIGRlZmluZXMgdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeFxuICAgICAqIEBwYXJhbSByZXN1bHQgLSBkZWZpbmVzIHRoZSBWZWN0b3IzIHdoZXJlIHRvIHN0b3JlIHRoZSByZXN1bHRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0cmFuc2Zvcm1Ob3JtYWxGcm9tRmxvYXRzVG9SZWYoeCwgeSwgeiwgdHJhbnNmb3JtYXRpb24sIHJlc3VsdCkge1xuICAgICAgICBjb25zdCBtID0gdHJhbnNmb3JtYXRpb24uX207XG4gICAgICAgIHJlc3VsdC54ID0geCAqIG1bMF0gKyB5ICogbVs0XSArIHogKiBtWzhdO1xuICAgICAgICByZXN1bHQueSA9IHggKiBtWzFdICsgeSAqIG1bNV0gKyB6ICogbVs5XTtcbiAgICAgICAgcmVzdWx0LnogPSB4ICogbVsyXSArIHkgKiBtWzZdICsgeiAqIG1bMTBdO1xuICAgIH1cbiAgICBWZWN0b3IzLnRyYW5zZm9ybU5vcm1hbEZyb21GbG9hdHNUb1JlZiA9IHRyYW5zZm9ybU5vcm1hbEZyb21GbG9hdHNUb1JlZjtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgbmV3IFZlY3RvcjMgbG9jYXRlZCBmb3IgXCJhbW91bnRcIiBvbiB0aGUgQ2F0bXVsbFJvbSBpbnRlcnBvbGF0aW9uIHNwbGluZSBkZWZpbmVkIGJ5IHRoZSB2ZWN0b3JzIFwidmFsdWUxXCIsIFwidmFsdWUyXCIsIFwidmFsdWUzXCIsIFwidmFsdWU0XCJcbiAgICAgKiBAcGFyYW0gdmFsdWUxIC0gZGVmaW5lcyB0aGUgZmlyc3QgY29udHJvbCBwb2ludFxuICAgICAqIEBwYXJhbSB2YWx1ZTIgLSBkZWZpbmVzIHRoZSBzZWNvbmQgY29udHJvbCBwb2ludFxuICAgICAqIEBwYXJhbSB2YWx1ZTMgLSBkZWZpbmVzIHRoZSB0aGlyZCBjb250cm9sIHBvaW50XG4gICAgICogQHBhcmFtIHZhbHVlNCAtIGRlZmluZXMgdGhlIGZvdXJ0aCBjb250cm9sIHBvaW50XG4gICAgICogQHBhcmFtIGFtb3VudCAtIGRlZmluZXMgdGhlIGFtb3VudCBvbiB0aGUgc3BsaW5lIHRvIHVzZVxuICAgICAqIEByZXR1cm5zIHRoZSBuZXcgVmVjdG9yM1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNhdG11bGxSb20odmFsdWUxLCB2YWx1ZTIsIHZhbHVlMywgdmFsdWU0LCBhbW91bnQpIHtcbiAgICAgICAgY29uc3Qgc3F1YXJlZCA9IGFtb3VudCAqIGFtb3VudDtcbiAgICAgICAgY29uc3QgY3ViZWQgPSBhbW91bnQgKiBzcXVhcmVkO1xuICAgICAgICBjb25zdCB4ID0gMC41ICpcbiAgICAgICAgICAgICgyLjAgKiB2YWx1ZTIueCArXG4gICAgICAgICAgICAgICAgKC12YWx1ZTEueCArIHZhbHVlMy54KSAqIGFtb3VudCArXG4gICAgICAgICAgICAgICAgKDIuMCAqIHZhbHVlMS54IC0gNS4wICogdmFsdWUyLnggKyA0LjAgKiB2YWx1ZTMueCAtIHZhbHVlNC54KSAqXG4gICAgICAgICAgICAgICAgICAgIHNxdWFyZWQgK1xuICAgICAgICAgICAgICAgICgtdmFsdWUxLnggKyAzLjAgKiB2YWx1ZTIueCAtIDMuMCAqIHZhbHVlMy54ICsgdmFsdWU0LngpICogY3ViZWQpO1xuICAgICAgICBjb25zdCB5ID0gMC41ICpcbiAgICAgICAgICAgICgyLjAgKiB2YWx1ZTIueSArXG4gICAgICAgICAgICAgICAgKC12YWx1ZTEueSArIHZhbHVlMy55KSAqIGFtb3VudCArXG4gICAgICAgICAgICAgICAgKDIuMCAqIHZhbHVlMS55IC0gNS4wICogdmFsdWUyLnkgKyA0LjAgKiB2YWx1ZTMueSAtIHZhbHVlNC55KSAqXG4gICAgICAgICAgICAgICAgICAgIHNxdWFyZWQgK1xuICAgICAgICAgICAgICAgICgtdmFsdWUxLnkgKyAzLjAgKiB2YWx1ZTIueSAtIDMuMCAqIHZhbHVlMy55ICsgdmFsdWU0LnkpICogY3ViZWQpO1xuICAgICAgICBjb25zdCB6ID0gMC41ICpcbiAgICAgICAgICAgICgyLjAgKiB2YWx1ZTIueiArXG4gICAgICAgICAgICAgICAgKC12YWx1ZTEueiArIHZhbHVlMy56KSAqIGFtb3VudCArXG4gICAgICAgICAgICAgICAgKDIuMCAqIHZhbHVlMS56IC0gNS4wICogdmFsdWUyLnogKyA0LjAgKiB2YWx1ZTMueiAtIHZhbHVlNC56KSAqXG4gICAgICAgICAgICAgICAgICAgIHNxdWFyZWQgK1xuICAgICAgICAgICAgICAgICgtdmFsdWUxLnogKyAzLjAgKiB2YWx1ZTIueiAtIDMuMCAqIHZhbHVlMy56ICsgdmFsdWU0LnopICogY3ViZWQpO1xuICAgICAgICByZXR1cm4gY3JlYXRlKHgsIHksIHopO1xuICAgIH1cbiAgICBWZWN0b3IzLmNhdG11bGxSb20gPSBjYXRtdWxsUm9tO1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBuZXcgVmVjdG9yMyBzZXQgd2l0aCB0aGUgY29vcmRpbmF0ZXMgb2YgXCJ2YWx1ZVwiLCBpZiB0aGUgdmVjdG9yIFwidmFsdWVcIiBpcyBpbiB0aGUgY3ViZSBkZWZpbmVkIGJ5IHRoZSB2ZWN0b3JzIFwibWluXCIgYW5kIFwibWF4XCJcbiAgICAgKiBJZiBhIGNvb3JkaW5hdGUgdmFsdWUgb2YgXCJ2YWx1ZVwiIGlzIGxvd2VyIHRoYW4gb25lIG9mIHRoZSBcIm1pblwiIGNvb3JkaW5hdGUsIHRoZW4gdGhpcyBcInZhbHVlXCIgY29vcmRpbmF0ZSBpcyBzZXQgd2l0aCB0aGUgXCJtaW5cIiBvbmVcbiAgICAgKiBJZiBhIGNvb3JkaW5hdGUgdmFsdWUgb2YgXCJ2YWx1ZVwiIGlzIGdyZWF0ZXIgdGhhbiBvbmUgb2YgdGhlIFwibWF4XCIgY29vcmRpbmF0ZSwgdGhlbiB0aGlzIFwidmFsdWVcIiBjb29yZGluYXRlIGlzIHNldCB3aXRoIHRoZSBcIm1heFwiIG9uZVxuICAgICAqIEBwYXJhbSB2YWx1ZSAtIGRlZmluZXMgdGhlIGN1cnJlbnQgdmFsdWVcbiAgICAgKiBAcGFyYW0gbWluIC0gZGVmaW5lcyB0aGUgbG93ZXIgcmFuZ2UgdmFsdWVcbiAgICAgKiBAcGFyYW0gbWF4IC0gZGVmaW5lcyB0aGUgdXBwZXIgcmFuZ2UgdmFsdWVcbiAgICAgKiBAcmV0dXJucyB0aGUgbmV3IFZlY3RvcjNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjbGFtcCh2YWx1ZSwgbWluLCBtYXgpIHtcbiAgICAgICAgY29uc3QgdiA9IGNyZWF0ZSgpO1xuICAgICAgICBjbGFtcFRvUmVmKHZhbHVlLCBtaW4sIG1heCwgdik7XG4gICAgICAgIHJldHVybiB2O1xuICAgIH1cbiAgICBWZWN0b3IzLmNsYW1wID0gY2xhbXA7XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgZ2l2ZW4gdmVjdG9yIFwicmVzdWx0XCIgd2l0aCB0aGUgY29vcmRpbmF0ZXMgb2YgXCJ2YWx1ZVwiLCBpZiB0aGUgdmVjdG9yIFwidmFsdWVcIiBpcyBpbiB0aGUgY3ViZSBkZWZpbmVkIGJ5IHRoZSB2ZWN0b3JzIFwibWluXCIgYW5kIFwibWF4XCJcbiAgICAgKiBJZiBhIGNvb3JkaW5hdGUgdmFsdWUgb2YgXCJ2YWx1ZVwiIGlzIGxvd2VyIHRoYW4gb25lIG9mIHRoZSBcIm1pblwiIGNvb3JkaW5hdGUsIHRoZW4gdGhpcyBcInZhbHVlXCIgY29vcmRpbmF0ZSBpcyBzZXQgd2l0aCB0aGUgXCJtaW5cIiBvbmVcbiAgICAgKiBJZiBhIGNvb3JkaW5hdGUgdmFsdWUgb2YgXCJ2YWx1ZVwiIGlzIGdyZWF0ZXIgdGhhbiBvbmUgb2YgdGhlIFwibWF4XCIgY29vcmRpbmF0ZSwgdGhlbiB0aGlzIFwidmFsdWVcIiBjb29yZGluYXRlIGlzIHNldCB3aXRoIHRoZSBcIm1heFwiIG9uZVxuICAgICAqIEBwYXJhbSB2YWx1ZSAtIGRlZmluZXMgdGhlIGN1cnJlbnQgdmFsdWVcbiAgICAgKiBAcGFyYW0gbWluIC0gZGVmaW5lcyB0aGUgbG93ZXIgcmFuZ2UgdmFsdWVcbiAgICAgKiBAcGFyYW0gbWF4IC0gZGVmaW5lcyB0aGUgdXBwZXIgcmFuZ2UgdmFsdWVcbiAgICAgKiBAcGFyYW0gcmVzdWx0IC0gZGVmaW5lcyB0aGUgVmVjdG9yMyB3aGVyZSB0byBzdG9yZSB0aGUgcmVzdWx0XG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xhbXBUb1JlZih2YWx1ZSwgbWluLCBtYXgsIHJlc3VsdCkge1xuICAgICAgICBsZXQgeCA9IHZhbHVlLng7XG4gICAgICAgIHggPSB4ID4gbWF4LnggPyBtYXgueCA6IHg7XG4gICAgICAgIHggPSB4IDwgbWluLnggPyBtaW4ueCA6IHg7XG4gICAgICAgIGxldCB5ID0gdmFsdWUueTtcbiAgICAgICAgeSA9IHkgPiBtYXgueSA/IG1heC55IDogeTtcbiAgICAgICAgeSA9IHkgPCBtaW4ueSA/IG1pbi55IDogeTtcbiAgICAgICAgbGV0IHogPSB2YWx1ZS56O1xuICAgICAgICB6ID0geiA+IG1heC56ID8gbWF4LnogOiB6O1xuICAgICAgICB6ID0geiA8IG1pbi56ID8gbWluLnogOiB6O1xuICAgICAgICBjb3B5RnJvbUZsb2F0cyh4LCB5LCB6LCByZXN1bHQpO1xuICAgIH1cbiAgICBWZWN0b3IzLmNsYW1wVG9SZWYgPSBjbGFtcFRvUmVmO1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBuZXcgVmVjdG9yMyBsb2NhdGVkIGZvciBcImFtb3VudFwiIChmbG9hdCkgb24gdGhlIEhlcm1pdGUgaW50ZXJwb2xhdGlvbiBzcGxpbmUgZGVmaW5lZCBieSB0aGUgdmVjdG9ycyBcInZhbHVlMVwiLCBcInRhbmdlbnQxXCIsIFwidmFsdWUyXCIsIFwidGFuZ2VudDJcIlxuICAgICAqIEBwYXJhbSB2YWx1ZTEgLSBkZWZpbmVzIHRoZSBmaXJzdCBjb250cm9sIHBvaW50XG4gICAgICogQHBhcmFtIHRhbmdlbnQxIC0gZGVmaW5lcyB0aGUgZmlyc3QgdGFuZ2VudCB2ZWN0b3JcbiAgICAgKiBAcGFyYW0gdmFsdWUyIC0gZGVmaW5lcyB0aGUgc2Vjb25kIGNvbnRyb2wgcG9pbnRcbiAgICAgKiBAcGFyYW0gdGFuZ2VudDIgLSBkZWZpbmVzIHRoZSBzZWNvbmQgdGFuZ2VudCB2ZWN0b3JcbiAgICAgKiBAcGFyYW0gYW1vdW50IC0gZGVmaW5lcyB0aGUgYW1vdW50IG9uIHRoZSBpbnRlcnBvbGF0aW9uIHNwbGluZSAoYmV0d2VlbiAwIGFuZCAxKVxuICAgICAqIEByZXR1cm5zIHRoZSBuZXcgVmVjdG9yM1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGhlcm1pdGUodmFsdWUxLCB0YW5nZW50MSwgdmFsdWUyLCB0YW5nZW50MiwgYW1vdW50KSB7XG4gICAgICAgIGNvbnN0IHNxdWFyZWQgPSBhbW91bnQgKiBhbW91bnQ7XG4gICAgICAgIGNvbnN0IGN1YmVkID0gYW1vdW50ICogc3F1YXJlZDtcbiAgICAgICAgY29uc3QgcGFydDEgPSAyLjAgKiBjdWJlZCAtIDMuMCAqIHNxdWFyZWQgKyAxLjA7XG4gICAgICAgIGNvbnN0IHBhcnQyID0gLTIuMCAqIGN1YmVkICsgMy4wICogc3F1YXJlZDtcbiAgICAgICAgY29uc3QgcGFydDMgPSBjdWJlZCAtIDIuMCAqIHNxdWFyZWQgKyBhbW91bnQ7XG4gICAgICAgIGNvbnN0IHBhcnQ0ID0gY3ViZWQgLSBzcXVhcmVkO1xuICAgICAgICBjb25zdCB4ID0gdmFsdWUxLnggKiBwYXJ0MSArXG4gICAgICAgICAgICB2YWx1ZTIueCAqIHBhcnQyICtcbiAgICAgICAgICAgIHRhbmdlbnQxLnggKiBwYXJ0MyArXG4gICAgICAgICAgICB0YW5nZW50Mi54ICogcGFydDQ7XG4gICAgICAgIGNvbnN0IHkgPSB2YWx1ZTEueSAqIHBhcnQxICtcbiAgICAgICAgICAgIHZhbHVlMi55ICogcGFydDIgK1xuICAgICAgICAgICAgdGFuZ2VudDEueSAqIHBhcnQzICtcbiAgICAgICAgICAgIHRhbmdlbnQyLnkgKiBwYXJ0NDtcbiAgICAgICAgY29uc3QgeiA9IHZhbHVlMS56ICogcGFydDEgK1xuICAgICAgICAgICAgdmFsdWUyLnogKiBwYXJ0MiArXG4gICAgICAgICAgICB0YW5nZW50MS56ICogcGFydDMgK1xuICAgICAgICAgICAgdGFuZ2VudDIueiAqIHBhcnQ0O1xuICAgICAgICByZXR1cm4gY3JlYXRlKHgsIHksIHopO1xuICAgIH1cbiAgICBWZWN0b3IzLmhlcm1pdGUgPSBoZXJtaXRlO1xuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIG1pbmltYWwgY29vcmRpbmF0ZSB2YWx1ZXMgYmV0d2VlbiB0d28gVmVjdG9yM1xuICAgICAqIEBwYXJhbSBsZWZ0IC0gZGVmaW5lcyB0aGUgZmlyc3Qgb3BlcmFuZFxuICAgICAqIEBwYXJhbSByaWdodCAtIGRlZmluZXMgdGhlIHNlY29uZCBvcGVyYW5kXG4gICAgICogQHJldHVybnMgdGhlIG5ldyBWZWN0b3IzXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWluaW1pemUobGVmdCwgcmlnaHQpIHtcbiAgICAgICAgY29uc3QgbWluID0gY3JlYXRlKCk7XG4gICAgICAgIG1pbmltaXplSW5QbGFjZUZyb21GbG9hdHNUb1JlZihyaWdodCwgbGVmdC54LCBsZWZ0LnksIGxlZnQueiwgbWluKTtcbiAgICAgICAgcmV0dXJuIG1pbjtcbiAgICB9XG4gICAgVmVjdG9yMy5taW5pbWl6ZSA9IG1pbmltaXplO1xuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIG1heGltYWwgY29vcmRpbmF0ZSB2YWx1ZXMgYmV0d2VlbiB0d28gVmVjdG9yM1xuICAgICAqIEBwYXJhbSBsZWZ0IC0gZGVmaW5lcyB0aGUgZmlyc3Qgb3BlcmFuZFxuICAgICAqIEBwYXJhbSByaWdodCAtIGRlZmluZXMgdGhlIHNlY29uZCBvcGVyYW5kXG4gICAgICogQHJldHVybnMgdGhlIG5ldyBWZWN0b3IzXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWF4aW1pemUobGVmdCwgcmlnaHQpIHtcbiAgICAgICAgY29uc3QgbWF4ID0gY3JlYXRlKCk7XG4gICAgICAgIG1heGltaXplSW5QbGFjZUZyb21GbG9hdHNUb1JlZihsZWZ0LCByaWdodC54LCByaWdodC55LCByaWdodC56LCBtYXgpO1xuICAgICAgICByZXR1cm4gbWF4O1xuICAgIH1cbiAgICBWZWN0b3IzLm1heGltaXplID0gbWF4aW1pemU7XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgdmVjdG9ycyBcInZhbHVlMVwiIGFuZCBcInZhbHVlMlwiXG4gICAgICogQHBhcmFtIHZhbHVlMSAtIGRlZmluZXMgdGhlIGZpcnN0IG9wZXJhbmRcbiAgICAgKiBAcGFyYW0gdmFsdWUyIC0gZGVmaW5lcyB0aGUgc2Vjb25kIG9wZXJhbmRcbiAgICAgKiBAcmV0dXJucyB0aGUgZGlzdGFuY2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBkaXN0YW5jZSh2YWx1ZTEsIHZhbHVlMikge1xuICAgICAgICByZXR1cm4gTWF0aC5zcXJ0KGRpc3RhbmNlU3F1YXJlZCh2YWx1ZTEsIHZhbHVlMikpO1xuICAgIH1cbiAgICBWZWN0b3IzLmRpc3RhbmNlID0gZGlzdGFuY2U7XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgc3F1YXJlZCBkaXN0YW5jZSBiZXR3ZWVuIHRoZSB2ZWN0b3JzIFwidmFsdWUxXCIgYW5kIFwidmFsdWUyXCJcbiAgICAgKiBAcGFyYW0gdmFsdWUxIC0gZGVmaW5lcyB0aGUgZmlyc3Qgb3BlcmFuZFxuICAgICAqIEBwYXJhbSB2YWx1ZTIgLSBkZWZpbmVzIHRoZSBzZWNvbmQgb3BlcmFuZFxuICAgICAqIEByZXR1cm5zIHRoZSBzcXVhcmVkIGRpc3RhbmNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gZGlzdGFuY2VTcXVhcmVkKHZhbHVlMSwgdmFsdWUyKSB7XG4gICAgICAgIGNvbnN0IHggPSB2YWx1ZTEueCAtIHZhbHVlMi54O1xuICAgICAgICBjb25zdCB5ID0gdmFsdWUxLnkgLSB2YWx1ZTIueTtcbiAgICAgICAgY29uc3QgeiA9IHZhbHVlMS56IC0gdmFsdWUyLno7XG4gICAgICAgIHJldHVybiB4ICogeCArIHkgKiB5ICsgeiAqIHo7XG4gICAgfVxuICAgIFZlY3RvcjMuZGlzdGFuY2VTcXVhcmVkID0gZGlzdGFuY2VTcXVhcmVkO1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBuZXcgVmVjdG9yMyBsb2NhdGVkIGF0IHRoZSBjZW50ZXIgYmV0d2VlbiBcInZhbHVlMVwiIGFuZCBcInZhbHVlMlwiXG4gICAgICogQHBhcmFtIHZhbHVlMSAtIGRlZmluZXMgdGhlIGZpcnN0IG9wZXJhbmRcbiAgICAgKiBAcGFyYW0gdmFsdWUyIC0gZGVmaW5lcyB0aGUgc2Vjb25kIG9wZXJhbmRcbiAgICAgKiBAcmV0dXJucyB0aGUgbmV3IFZlY3RvcjNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjZW50ZXIodmFsdWUxLCB2YWx1ZTIpIHtcbiAgICAgICAgY29uc3QgY2VudGVyID0gYWRkKHZhbHVlMSwgdmFsdWUyKTtcbiAgICAgICAgc2NhbGVUb1JlZihjZW50ZXIsIDAuNSwgY2VudGVyKTtcbiAgICAgICAgcmV0dXJuIGNlbnRlcjtcbiAgICB9XG4gICAgVmVjdG9yMy5jZW50ZXIgPSBjZW50ZXI7XG4gICAgLyoqXG4gICAgICogR2l2ZW4gdGhyZWUgb3J0aG9nb25hbCBub3JtYWxpemVkIGxlZnQtaGFuZGVkIG9yaWVudGVkIFZlY3RvcjMgYXhpcyBpbiBzcGFjZSAodGFyZ2V0IHN5c3RlbSksXG4gICAgICogUm90YXRpb25Gcm9tQXhpcygpIHJldHVybnMgdGhlIHJvdGF0aW9uIEV1bGVyIGFuZ2xlcyAoZXggOiByb3RhdGlvbi54LCByb3RhdGlvbi55LCByb3RhdGlvbi56KSB0byBhcHBseVxuICAgICAqIHRvIHNvbWV0aGluZyBpbiBvcmRlciB0byByb3RhdGUgaXQgZnJvbSBpdHMgbG9jYWwgc3lzdGVtIHRvIHRoZSBnaXZlbiB0YXJnZXQgc3lzdGVtXG4gICAgICogTm90ZTogYXhpczEsIGF4aXMyIGFuZCBheGlzMyBhcmUgbm9ybWFsaXplZCBkdXJpbmcgdGhpcyBvcGVyYXRpb25cbiAgICAgKiBAcGFyYW0gYXhpczEgLSBkZWZpbmVzIHRoZSBmaXJzdCBheGlzXG4gICAgICogQHBhcmFtIGF4aXMyIC0gZGVmaW5lcyB0aGUgc2Vjb25kIGF4aXNcbiAgICAgKiBAcGFyYW0gYXhpczMgLSBkZWZpbmVzIHRoZSB0aGlyZCBheGlzXG4gICAgICogQHJldHVybnMgYSBuZXcgVmVjdG9yM1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJvdGF0aW9uRnJvbUF4aXMoYXhpczEsIGF4aXMyLCBheGlzMykge1xuICAgICAgICBjb25zdCByb3RhdGlvbiA9IFplcm8oKTtcbiAgICAgICAgcm90YXRpb25Gcm9tQXhpc1RvUmVmKGF4aXMxLCBheGlzMiwgYXhpczMsIHJvdGF0aW9uKTtcbiAgICAgICAgcmV0dXJuIHJvdGF0aW9uO1xuICAgIH1cbiAgICBWZWN0b3IzLnJvdGF0aW9uRnJvbUF4aXMgPSByb3RhdGlvbkZyb21BeGlzO1xuICAgIC8qKlxuICAgICAqIFRoZSBzYW1lIHRoYW4gUm90YXRpb25Gcm9tQXhpcyBidXQgdXBkYXRlcyB0aGUgZ2l2ZW4gcmVmIFZlY3RvcjMgcGFyYW1ldGVyIGluc3RlYWQgb2YgcmV0dXJuaW5nIGEgbmV3IFZlY3RvcjNcbiAgICAgKiBAcGFyYW0gYXhpczEgLSBkZWZpbmVzIHRoZSBmaXJzdCBheGlzXG4gICAgICogQHBhcmFtIGF4aXMyIC0gZGVmaW5lcyB0aGUgc2Vjb25kIGF4aXNcbiAgICAgKiBAcGFyYW0gYXhpczMgLSBkZWZpbmVzIHRoZSB0aGlyZCBheGlzXG4gICAgICogQHBhcmFtIHJlZiAtIGRlZmluZXMgdGhlIFZlY3RvcjMgd2hlcmUgdG8gc3RvcmUgdGhlIHJlc3VsdFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJvdGF0aW9uRnJvbUF4aXNUb1JlZihheGlzMSwgYXhpczIsIGF4aXMzLCByZXN1bHQpIHtcbiAgICAgICAgY29uc3QgcXVhdCA9IFF1YXRlcm5pb24uY3JlYXRlKCk7XG4gICAgICAgIFF1YXRlcm5pb24uZnJvbUF4aXNUb1JvdGF0aW9uUXVhdGVybmlvblRvUmVmKGF4aXMxLCBheGlzMiwgYXhpczMsIHF1YXQpO1xuICAgICAgICBjb3B5RnJvbShRdWF0ZXJuaW9uLnRvRXVsZXJBbmdsZXMocXVhdCksIHJlc3VsdCk7XG4gICAgfVxuICAgIFZlY3RvcjMucm90YXRpb25Gcm9tQXhpc1RvUmVmID0gcm90YXRpb25Gcm9tQXhpc1RvUmVmO1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIFZlY3RvcjNcbiAgICAgKiBAcmV0dXJucyBhIHN0cmluZyB3aXRoIHRoZSBWZWN0b3IzIGNvb3JkaW5hdGVzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvU3RyaW5nKHZlY3Rvcikge1xuICAgICAgICByZXR1cm4gYCgke3ZlY3Rvci54fSwgJHt2ZWN0b3IueX0sICR7dmVjdG9yLnp9KWA7XG4gICAgfVxuICAgIFZlY3RvcjMudG9TdHJpbmcgPSB0b1N0cmluZztcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBWZWN0b3IzIGhhc2ggY29kZVxuICAgICAqIEByZXR1cm5zIGEgbnVtYmVyIHdoaWNoIHRlbmRzIHRvIGJlIHVuaXF1ZSBiZXR3ZWVuIFZlY3RvcjMgaW5zdGFuY2VzXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0SGFzaENvZGUodmVjdG9yKSB7XG4gICAgICAgIGxldCBoYXNoID0gdmVjdG9yLnggfHwgMDtcbiAgICAgICAgaGFzaCA9IChoYXNoICogMzk3KSBeICh2ZWN0b3IueSB8fCAwKTtcbiAgICAgICAgaGFzaCA9IChoYXNoICogMzk3KSBeICh2ZWN0b3IueiB8fCAwKTtcbiAgICAgICAgcmV0dXJuIGhhc2g7XG4gICAgfVxuICAgIFZlY3RvcjMuZ2V0SGFzaENvZGUgPSBnZXRIYXNoQ29kZTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHZlY3RvcjEgYW5kIHRoZSB2ZWN0b3IyIGNvb3JkaW5hdGVzIGFyZSBzdHJpY3RseSBlcXVhbFxuICAgICAqIEBwYXJhbSB2ZWN0b3IxIC0gZGVmaW5lcyB0aGUgZmlyc3Qgb3BlcmFuZFxuICAgICAqIEBwYXJhbSB2ZWN0b3IyIC0gZGVmaW5lcyB0aGUgc2Vjb25kIG9wZXJhbmRcbiAgICAgKiBAcmV0dXJucyB0cnVlIGlmIGJvdGggdmVjdG9ycyBhcmUgZXF1YWxzXG4gICAgICovXG4gICAgZnVuY3Rpb24gZXF1YWxzKHZlY3RvcjEsIHZlY3RvcjIpIHtcbiAgICAgICAgcmV0dXJuICh2ZWN0b3IxLnggPT09IHZlY3RvcjIueCAmJlxuICAgICAgICAgICAgdmVjdG9yMS55ID09PSB2ZWN0b3IyLnkgJiZcbiAgICAgICAgICAgIHZlY3RvcjEueiA9PT0gdmVjdG9yMi56KTtcbiAgICB9XG4gICAgVmVjdG9yMy5lcXVhbHMgPSBlcXVhbHM7XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBjdXJyZW50IFZlY3RvcjMgYW5kIHRoZSBnaXZlbiB2ZWN0b3IgY29vcmRpbmF0ZXMgYXJlIGRpc3RhbnQgbGVzcyB0aGFuIGVwc2lsb25cbiAgICAgKiBAcGFyYW0gb3RoZXJWZWN0b3IgLSBkZWZpbmVzIHRoZSBzZWNvbmQgb3BlcmFuZFxuICAgICAqIEBwYXJhbSBlcHNpbG9uIC0gZGVmaW5lcyB0aGUgbWluaW1hbCBkaXN0YW5jZSB0byBkZWZpbmUgdmFsdWVzIGFzIGVxdWFsc1xuICAgICAqIEByZXR1cm5zIHRydWUgaWYgYm90aCB2ZWN0b3JzIGFyZSBkaXN0YW50IGxlc3MgdGhhbiBlcHNpbG9uXG4gICAgICovXG4gICAgZnVuY3Rpb24gZXF1YWxzV2l0aEVwc2lsb24odmVjdG9yMSwgdmVjdG9yMiwgZXBzaWxvbiA9IEVwc2lsb24pIHtcbiAgICAgICAgcmV0dXJuIChTY2FsYXIud2l0aGluRXBzaWxvbih2ZWN0b3IxLngsIHZlY3RvcjIueCwgZXBzaWxvbikgJiZcbiAgICAgICAgICAgIFNjYWxhci53aXRoaW5FcHNpbG9uKHZlY3RvcjEueSwgdmVjdG9yMi55LCBlcHNpbG9uKSAmJlxuICAgICAgICAgICAgU2NhbGFyLndpdGhpbkVwc2lsb24odmVjdG9yMS56LCB2ZWN0b3IyLnosIGVwc2lsb24pKTtcbiAgICB9XG4gICAgVmVjdG9yMy5lcXVhbHNXaXRoRXBzaWxvbiA9IGVxdWFsc1dpdGhFcHNpbG9uO1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY3VycmVudCBWZWN0b3IzIGNvb3JkaW5hdGVzIGVxdWFscyB0aGUgZ2l2ZW4gZmxvYXRzXG4gICAgICogQHBhcmFtIHggLSBkZWZpbmVzIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIG9wZXJhbmRcbiAgICAgKiBAcGFyYW0geSAtIGRlZmluZXMgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgb3BlcmFuZFxuICAgICAqIEBwYXJhbSB6IC0gZGVmaW5lcyB0aGUgeiBjb29yZGluYXRlIG9mIHRoZSBvcGVyYW5kXG4gICAgICogQHJldHVybnMgdHJ1ZSBpZiBib3RoIHZlY3RvcnMgYXJlIGVxdWFsc1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGVxdWFsc1RvRmxvYXRzKHZlY3RvciwgeCwgeSwgeikge1xuICAgICAgICByZXR1cm4gdmVjdG9yLnggPT09IHggJiYgdmVjdG9yLnkgPT09IHkgJiYgdmVjdG9yLnogPT09IHo7XG4gICAgfVxuICAgIFZlY3RvcjMuZXF1YWxzVG9GbG9hdHMgPSBlcXVhbHNUb0Zsb2F0cztcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgbmV3IFZlY3RvcjMsIHJlc3VsdCBvZiB0aGUgbXVsdGlwbGljYXRpb24gb2YgdmVjdG9yMSBieSB0aGUgdmVjdG9yMlxuICAgICAqIEBwYXJhbSB2ZWN0b3IxIC0gZGVmaW5lcyB0aGUgZmlyc3Qgb3BlcmFuZFxuICAgICAqIEBwYXJhbSB2ZWN0b3IyIC0gZGVmaW5lcyB0aGUgc2Vjb25kIG9wZXJhbmRcbiAgICAgKiBAcmV0dXJucyB0aGUgbmV3IFZlY3RvcjNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtdWx0aXBseSh2ZWN0b3IxLCB2ZWN0b3IyKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGNyZWF0ZSgpO1xuICAgICAgICBtdWx0aXBseVRvUmVmKHZlY3RvcjEsIHZlY3RvcjIsIHJlc3VsdCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIFZlY3RvcjMubXVsdGlwbHkgPSBtdWx0aXBseTtcbiAgICAvKipcbiAgICAgKiBNdWx0aXBsaWVzIHRoZSBjdXJyZW50IFZlY3RvcjMgYnkgdGhlIGdpdmVuIG9uZSBhbmQgc3RvcmVzIHRoZSByZXN1bHQgaW4gdGhlIGdpdmVuIHZlY3RvciBcInJlc3VsdFwiXG4gICAgICogQHBhcmFtIG90aGVyVmVjdG9yIC0gZGVmaW5lcyB0aGUgc2Vjb25kIG9wZXJhbmRcbiAgICAgKiBAcGFyYW0gcmVzdWx0IC0gZGVmaW5lcyB0aGUgVmVjdG9yMyBvYmplY3Qgd2hlcmUgdG8gc3RvcmUgdGhlIHJlc3VsdFxuICAgICAqIEByZXR1cm5zIHRoZSBjdXJyZW50IFZlY3RvcjNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtdWx0aXBseVRvUmVmKHZlY3RvcjEsIHZlY3RvcjIsIHJlc3VsdCkge1xuICAgICAgICByZXN1bHQueCA9IHZlY3RvcjEueCAqIHZlY3RvcjIueDtcbiAgICAgICAgcmVzdWx0LnkgPSB2ZWN0b3IxLnkgKiB2ZWN0b3IyLnk7XG4gICAgICAgIHJlc3VsdC56ID0gdmVjdG9yMS56ICogdmVjdG9yMi56O1xuICAgIH1cbiAgICBWZWN0b3IzLm11bHRpcGx5VG9SZWYgPSBtdWx0aXBseVRvUmVmO1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBuZXcgVmVjdG9yMyBzZXQgd2l0aCB0aGUgcmVzdWx0IG9mIHRoZSBtdWxsaXBsaWNhdGlvbiBvZiB0aGUgY3VycmVudCBWZWN0b3IzIGNvb3JkaW5hdGVzIGJ5IHRoZSBnaXZlbiBmbG9hdHNcbiAgICAgKiBAcGFyYW0geCAtIGRlZmluZXMgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgb3BlcmFuZFxuICAgICAqIEBwYXJhbSB5IC0gZGVmaW5lcyB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBvcGVyYW5kXG4gICAgICogQHBhcmFtIHogLSBkZWZpbmVzIHRoZSB6IGNvb3JkaW5hdGUgb2YgdGhlIG9wZXJhbmRcbiAgICAgKiBAcmV0dXJucyB0aGUgbmV3IFZlY3RvcjNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtdWx0aXBseUJ5RmxvYXRzVG9SZWYodmVjdG9yMSwgeCwgeSwgeiwgcmVzdWx0KSB7XG4gICAgICAgIHJlc3VsdC54ID0gdmVjdG9yMS54ICogeDtcbiAgICAgICAgcmVzdWx0LnkgPSB2ZWN0b3IxLnkgKiB5O1xuICAgICAgICByZXN1bHQueiA9IHZlY3RvcjEueiAqIHo7XG4gICAgfVxuICAgIFZlY3RvcjMubXVsdGlwbHlCeUZsb2F0c1RvUmVmID0gbXVsdGlwbHlCeUZsb2F0c1RvUmVmO1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBuZXcgVmVjdG9yMyBzZXQgd2l0aCB0aGUgcmVzdWx0IG9mIHRoZSBtdWxsaXBsaWNhdGlvbiBvZiB0aGUgY3VycmVudCBWZWN0b3IzIGNvb3JkaW5hdGVzIGJ5IHRoZSBnaXZlbiBmbG9hdHNcbiAgICAgKiBAcGFyYW0geCAtIGRlZmluZXMgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgb3BlcmFuZFxuICAgICAqIEBwYXJhbSB5IC0gZGVmaW5lcyB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBvcGVyYW5kXG4gICAgICogQHBhcmFtIHogLSBkZWZpbmVzIHRoZSB6IGNvb3JkaW5hdGUgb2YgdGhlIG9wZXJhbmRcbiAgICAgKiBAcmV0dXJucyB0aGUgbmV3IFZlY3RvcjNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtdWx0aXBseUJ5RmxvYXRzKHZlY3RvcjEsIHgsIHksIHopIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gY3JlYXRlKCk7XG4gICAgICAgIG11bHRpcGx5QnlGbG9hdHNUb1JlZih2ZWN0b3IxLCB4LCB5LCB6LCByZXN1bHQpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBWZWN0b3IzLm11bHRpcGx5QnlGbG9hdHMgPSBtdWx0aXBseUJ5RmxvYXRzO1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBuZXcgVmVjdG9yMyBzZXQgd2l0aCB0aGUgcmVzdWx0IG9mIHRoZSBkaXZpc2lvbiBvZiB0aGUgY3VycmVudCBWZWN0b3IzIGNvb3JkaW5hdGVzIGJ5IHRoZSBnaXZlbiBvbmVzXG4gICAgICogQHBhcmFtIG90aGVyVmVjdG9yIC0gZGVmaW5lcyB0aGUgc2Vjb25kIG9wZXJhbmRcbiAgICAgKiBAcmV0dXJucyB0aGUgbmV3IFZlY3RvcjNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBkaXZpZGUodmVjdG9yMSwgdmVjdG9yMikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeDogdmVjdG9yMS54IC8gdmVjdG9yMi54LFxuICAgICAgICAgICAgeTogdmVjdG9yMS55IC8gdmVjdG9yMi55LFxuICAgICAgICAgICAgejogdmVjdG9yMS56IC8gdmVjdG9yMi56XG4gICAgICAgIH07XG4gICAgfVxuICAgIFZlY3RvcjMuZGl2aWRlID0gZGl2aWRlO1xuICAgIC8qKlxuICAgICAqIERpdmlkZXMgdGhlIGN1cnJlbnQgVmVjdG9yMyBjb29yZGluYXRlcyBieSB0aGUgZ2l2ZW4gb25lcyBhbmQgc3RvcmVzIHRoZSByZXN1bHQgaW4gdGhlIGdpdmVuIHZlY3RvciBcInJlc3VsdFwiXG4gICAgICogQHBhcmFtIG90aGVyVmVjdG9yIC0gZGVmaW5lcyB0aGUgc2Vjb25kIG9wZXJhbmRcbiAgICAgKiBAcGFyYW0gcmVzdWx0IC0gZGVmaW5lcyB0aGUgVmVjdG9yMyBvYmplY3Qgd2hlcmUgdG8gc3RvcmUgdGhlIHJlc3VsdFxuICAgICAqIEByZXR1cm5zIHRoZSBjdXJyZW50IFZlY3RvcjNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBkaXZpZGVUb1JlZih2ZWN0b3IxLCB2ZWN0b3IyLCByZXN1bHQpIHtcbiAgICAgICAgcmVzdWx0LnggPSB2ZWN0b3IxLnggLyB2ZWN0b3IyLng7XG4gICAgICAgIHJlc3VsdC55ID0gdmVjdG9yMS55IC8gdmVjdG9yMi55O1xuICAgICAgICByZXN1bHQueiA9IHZlY3RvcjEueiAvIHZlY3RvcjIuejtcbiAgICB9XG4gICAgVmVjdG9yMy5kaXZpZGVUb1JlZiA9IGRpdmlkZVRvUmVmO1xuICAgIC8qKlxuICAgICAqIFNldCByZXN1bHQgVmVjdG9yMyB3aXRoIHRoZSBtYXhpbWFsIGNvb3JkaW5hdGUgdmFsdWVzIGJldHdlZW4gdmVjdG9yMSBhbmQgdGhlIGdpdmVuIGNvb3JkaW5hdGVzXG4gICAgICogQHBhcmFtIHggLSBkZWZpbmVzIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIG9wZXJhbmRcbiAgICAgKiBAcGFyYW0geSAtIGRlZmluZXMgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgb3BlcmFuZFxuICAgICAqIEBwYXJhbSB6IC0gZGVmaW5lcyB0aGUgeiBjb29yZGluYXRlIG9mIHRoZSBvcGVyYW5kXG4gICAgICogQHBhcmFtIHJlc3VsdCAtIHRoZSBzZXQgVmVjdG9yM1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1heGltaXplSW5QbGFjZUZyb21GbG9hdHNUb1JlZih2ZWN0b3IxLCB4LCB5LCB6LCByZXN1bHQpIHtcbiAgICAgICAgaWYgKHggPiB2ZWN0b3IxLngpIHtcbiAgICAgICAgICAgIHJlc3VsdC54ID0geDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdC54ID0gdmVjdG9yMS54O1xuICAgICAgICB9XG4gICAgICAgIGlmICh5ID4gdmVjdG9yMS55KSB7XG4gICAgICAgICAgICByZXN1bHQueSA9IHk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQueSA9IHZlY3RvcjEueTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoeiA+IHZlY3RvcjEueikge1xuICAgICAgICAgICAgcmVzdWx0LnogPSB6O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0LnogPSB2ZWN0b3IxLno7XG4gICAgICAgIH1cbiAgICB9XG4gICAgVmVjdG9yMy5tYXhpbWl6ZUluUGxhY2VGcm9tRmxvYXRzVG9SZWYgPSBtYXhpbWl6ZUluUGxhY2VGcm9tRmxvYXRzVG9SZWY7XG4gICAgLyoqXG4gICAgICogU2V0IHJlc3VsdCBWZWN0b3IzIHdpdGggdGhlIG1pbmltYWwgY29vcmRpbmF0ZSB2YWx1ZXMgYmV0d2VlbiB2ZWN0b3IxIGFuZCB0aGUgZ2l2ZW4gY29vcmRpbmF0ZXNcbiAgICAgKiBAcGFyYW0geCAtIGRlZmluZXMgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgb3BlcmFuZFxuICAgICAqIEBwYXJhbSB5IC0gZGVmaW5lcyB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBvcGVyYW5kXG4gICAgICogQHBhcmFtIHogLSBkZWZpbmVzIHRoZSB6IGNvb3JkaW5hdGUgb2YgdGhlIG9wZXJhbmRcbiAgICAgKiBAcGFyYW0gcmVzdWx0IC0gdGhlIHNldCBWZWN0b3IzXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWluaW1pemVJblBsYWNlRnJvbUZsb2F0c1RvUmVmKHZlY3RvcjEsIHgsIHksIHosIHJlc3VsdCkge1xuICAgICAgICBpZiAoeCA8IHZlY3RvcjEueCkge1xuICAgICAgICAgICAgcmVzdWx0LnggPSB4O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0LnggPSB2ZWN0b3IxLng7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHkgPCB2ZWN0b3IxLnkpIHtcbiAgICAgICAgICAgIHJlc3VsdC55ID0geTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdC55ID0gdmVjdG9yMS55O1xuICAgICAgICB9XG4gICAgICAgIGlmICh6IDwgdmVjdG9yMS56KSB7XG4gICAgICAgICAgICByZXN1bHQueiA9IHo7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQueiA9IHZlY3RvcjEuejtcbiAgICAgICAgfVxuICAgIH1cbiAgICBWZWN0b3IzLm1pbmltaXplSW5QbGFjZUZyb21GbG9hdHNUb1JlZiA9IG1pbmltaXplSW5QbGFjZUZyb21GbG9hdHNUb1JlZjtcbiAgICAvKipcbiAgICAgKiBHZXRzIGEgbmV3IFZlY3RvcjMgZnJvbSB2ZWN0b3IxIGZsb29yZWQgdmFsdWVzXG4gICAgICogQHJldHVybnMgYSBuZXcgVmVjdG9yM1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZsb29yKHZlY3RvcjEpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZShNYXRoLmZsb29yKHZlY3RvcjEueCksIE1hdGguZmxvb3IodmVjdG9yMS55KSwgTWF0aC5mbG9vcih2ZWN0b3IxLnopKTtcbiAgICB9XG4gICAgVmVjdG9yMy5mbG9vciA9IGZsb29yO1xuICAgIC8qKlxuICAgICAqIEdldHMgYSBuZXcgVmVjdG9yMyBmcm9tIHZlY3RvcjEgZmxvb3JlZCB2YWx1ZXNcbiAgICAgKiBAcmV0dXJucyBhIG5ldyBWZWN0b3IzXG4gICAgICovXG4gICAgZnVuY3Rpb24gZnJhY3QodmVjdG9yMSkge1xuICAgICAgICByZXR1cm4gY3JlYXRlKHZlY3RvcjEueCAtIE1hdGguZmxvb3IodmVjdG9yMS54KSwgdmVjdG9yMS55IC0gTWF0aC5mbG9vcih2ZWN0b3IxLnkpLCB2ZWN0b3IxLnogLSBNYXRoLmZsb29yKHZlY3RvcjEueikpO1xuICAgIH1cbiAgICBWZWN0b3IzLmZyYWN0ID0gZnJhY3Q7XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIG5ldyBWZWN0b3IzIHNldCB0byAoMC4wLCAwLjAsIDAuMClcbiAgICAgKiBAcmV0dXJucyBhIG5ldyBlbXB0eSBWZWN0b3IzXG4gICAgICovXG4gICAgZnVuY3Rpb24gWmVybygpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZSgwLjAsIDAuMCwgMC4wKTtcbiAgICB9XG4gICAgVmVjdG9yMy5aZXJvID0gWmVybztcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgbmV3IFZlY3RvcjMgc2V0IHRvICgxLjAsIDEuMCwgMS4wKVxuICAgICAqIEByZXR1cm5zIGEgbmV3IHVuaXQgVmVjdG9yM1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIE9uZSgpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZSgxLjAsIDEuMCwgMS4wKTtcbiAgICB9XG4gICAgVmVjdG9yMy5PbmUgPSBPbmU7XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIG5ldyBWZWN0b3IzIHNldCB0b2xlbmd0aFNxdWFyZWQgKDAuMCwgMS4wLCAwLjApXG4gICAgICogQHJldHVybnMgYSBuZXcgdXAgVmVjdG9yM1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIFVwKCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlKDAuMCwgMS4wLCAwLjApO1xuICAgIH1cbiAgICBWZWN0b3IzLlVwID0gVXA7XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIG5ldyBWZWN0b3IzIHNldCB0byAoMC4wLCAtMS4wLCAwLjApXG4gICAgICogQHJldHVybnMgYSBuZXcgZG93biBWZWN0b3IzXG4gICAgICovXG4gICAgZnVuY3Rpb24gRG93bigpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZSgwLjAsIC0xLjAsIDAuMCk7XG4gICAgfVxuICAgIFZlY3RvcjMuRG93biA9IERvd247XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIG5ldyBWZWN0b3IzIHNldCB0byAoMC4wLCAwLjAsIDEuMClcbiAgICAgKiBAcmV0dXJucyBhIG5ldyBmb3J3YXJkIFZlY3RvcjNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBGb3J3YXJkKCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlKDAuMCwgMC4wLCAxLjApO1xuICAgIH1cbiAgICBWZWN0b3IzLkZvcndhcmQgPSBGb3J3YXJkO1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBuZXcgVmVjdG9yMyBzZXQgdG8gKDAuMCwgMC4wLCAtMS4wKVxuICAgICAqIEByZXR1cm5zIGEgbmV3IGZvcndhcmQgVmVjdG9yM1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIEJhY2t3YXJkKCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlKDAuMCwgMC4wLCAtMS4wKTtcbiAgICB9XG4gICAgVmVjdG9yMy5CYWNrd2FyZCA9IEJhY2t3YXJkO1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBuZXcgVmVjdG9yMyBzZXQgdG8gKDEuMCwgMC4wLCAwLjApXG4gICAgICogQHJldHVybnMgYSBuZXcgcmlnaHQgVmVjdG9yM1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIFJpZ2h0KCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlKDEuMCwgMC4wLCAwLjApO1xuICAgIH1cbiAgICBWZWN0b3IzLlJpZ2h0ID0gUmlnaHQ7XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIG5ldyBWZWN0b3IzIHNldCB0byAoLTEuMCwgMC4wLCAwLjApXG4gICAgICogQHJldHVybnMgYSBuZXcgbGVmdCBWZWN0b3IzXG4gICAgICovXG4gICAgZnVuY3Rpb24gTGVmdCgpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZSgtMS4wLCAwLjAsIDAuMCk7XG4gICAgfVxuICAgIFZlY3RvcjMuTGVmdCA9IExlZnQ7XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIG5ldyByYW5kb20gVmVjdG9yM1xuICAgICAqIEByZXR1cm5zIGEgcmFuZG9tIFZlY3RvcjNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBSYW5kb20oKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGUoTWF0aC5yYW5kb20oKSwgTWF0aC5yYW5kb20oKSwgTWF0aC5yYW5kb20oKSk7XG4gICAgfVxuICAgIFZlY3RvcjMuUmFuZG9tID0gUmFuZG9tO1xufSkoVmVjdG9yMyB8fCAoVmVjdG9yMyA9IHt9KSk7XG4iLCAiaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4vVmVjdG9yMyc7XG5pbXBvcnQgeyBNYXRyaXggfSBmcm9tICcuL01hdHJpeCc7XG4vKipcbiAqIFJlcHJlc2VucyBhIHBsYW5lIGJ5IHRoZSBlcXVhdGlvbiBheCArIGJ5ICsgY3ogKyBkID0gMFxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdmFyIFBsYW5lO1xuKGZ1bmN0aW9uIChQbGFuZSkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBQbGFuZSBvYmplY3QgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBmbG9hdHMgYSwgYiwgYywgZCBhbmQgdGhlIHBsYW5lIGVxdWF0aW9uIDogYXggKyBieSArIGN6ICsgZCA9IDBcbiAgICAgKiBAcGFyYW0gYSAtIGEgY29tcG9uZW50IG9mIHRoZSBwbGFuZVxuICAgICAqIEBwYXJhbSBiIC0gYiBjb21wb25lbnQgb2YgdGhlIHBsYW5lXG4gICAgICogQHBhcmFtIGMgLSBjIGNvbXBvbmVudCBvZiB0aGUgcGxhbmVcbiAgICAgKiBAcGFyYW0gZCAtIGQgY29tcG9uZW50IG9mIHRoZSBwbGFuZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShhLCBiLCBjLCBkKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBub3JtYWw6IFZlY3RvcjMuY3JlYXRlKGEsIGIsIGMpLFxuICAgICAgICAgICAgZDogZFxuICAgICAgICB9O1xuICAgIH1cbiAgICBQbGFuZS5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLy8gU3RhdGljc1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBwbGFuZSBmcm9tIGFuICBhcnJheVxuICAgICAqIEBwYXJhbSBhcnJheSAtIHRoZSBhcnJheSB0byBjcmVhdGUgYSBwbGFuZSBmcm9tXG4gICAgICogQHJldHVybnMgYSBuZXcgUGxhbmUgZnJvbSB0aGUgZ2l2ZW4gYXJyYXkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZnJvbUFycmF5KGFycmF5KSB7XG4gICAgICAgIHJldHVybiBjcmVhdGUoYXJyYXlbMF0sIGFycmF5WzFdLCBhcnJheVsyXSwgYXJyYXlbM10pO1xuICAgIH1cbiAgICBQbGFuZS5mcm9tQXJyYXkgPSBmcm9tQXJyYXk7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHBsYW5lIGZyb20gdGhyZWUgcG9pbnRzXG4gICAgICogQHBhcmFtIHBvaW50MSAtIHBvaW50IHVzZWQgdG8gY3JlYXRlIHRoZSBwbGFuZVxuICAgICAqIEBwYXJhbSBwb2ludDIgLSBwb2ludCB1c2VkIHRvIGNyZWF0ZSB0aGUgcGxhbmVcbiAgICAgKiBAcGFyYW0gcG9pbnQzIC0gcG9pbnQgdXNlZCB0byBjcmVhdGUgdGhlIHBsYW5lXG4gICAgICogQHJldHVybnMgYSBuZXcgUGxhbmUgZGVmaW5lZCBieSB0aGUgdGhyZWUgZ2l2ZW4gcG9pbnRzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZyb21Qb2ludHMoX3BvaW50MSwgX3BvaW50MiwgX3BvaW50Mykge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBjcmVhdGUoMC4wLCAwLjAsIDAuMCwgMC4wKTtcbiAgICAgICAgLy8gVE9ET1xuICAgICAgICAvLyByZXN1bHQuY29weUZyb21Qb2ludHMocG9pbnQxLCBwb2ludDIsIHBvaW50MylcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgUGxhbmUuZnJvbVBvaW50cyA9IGZyb21Qb2ludHM7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHBsYW5lIGZyb20gYW4gb3JpZ2luIHBvaW50IGFuZCBhIG5vcm1hbFxuICAgICAqIEBwYXJhbSBvcmlnaW4gLSBvcmlnaW4gb2YgdGhlIHBsYW5lIHRvIGJlIGNvbnN0cnVjdGVkXG4gICAgICogQHBhcmFtIG5vcm1hbCAtIG5vcm1hbCBvZiB0aGUgcGxhbmUgdG8gYmUgY29uc3RydWN0ZWRcbiAgICAgKiBAcmV0dXJucyBhIG5ldyBQbGFuZSB0aGUgbm9ybWFsIHZlY3RvciB0byB0aGlzIHBsYW5lIGF0IHRoZSBnaXZlbiBvcmlnaW4gcG9pbnQuXG4gICAgICogTm90ZSA6IHRoZSB2ZWN0b3IgXCJub3JtYWxcIiBpcyB1cGRhdGVkIGJlY2F1c2Ugbm9ybWFsaXplZC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiByb21Qb3NpdGlvbkFuZE5vcm1hbChvcmlnaW4sIG5vcm1hbCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBjcmVhdGUoMC4wLCAwLjAsIDAuMCwgMC4wKTtcbiAgICAgICAgcmVzdWx0Lm5vcm1hbCA9IFZlY3RvcjMubm9ybWFsaXplKG5vcm1hbCk7XG4gICAgICAgIHJlc3VsdC5kID0gLShub3JtYWwueCAqIG9yaWdpbi54ICtcbiAgICAgICAgICAgIG5vcm1hbC55ICogb3JpZ2luLnkgK1xuICAgICAgICAgICAgbm9ybWFsLnogKiBvcmlnaW4ueik7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIFBsYW5lLnJvbVBvc2l0aW9uQW5kTm9ybWFsID0gcm9tUG9zaXRpb25BbmROb3JtYWw7XG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlcyB0aGUgZGlzdGFuY2UgZnJvbSBhIHBsYW5lIGFuZCBhIHBvaW50XG4gICAgICogQHBhcmFtIG9yaWdpbiAtIG9yaWdpbiBvZiB0aGUgcGxhbmUgdG8gYmUgY29uc3RydWN0ZWRcbiAgICAgKiBAcGFyYW0gbm9ybWFsIC0gbm9ybWFsIG9mIHRoZSBwbGFuZSB0byBiZSBjb25zdHJ1Y3RlZFxuICAgICAqIEBwYXJhbSBwb2ludCAtIHBvaW50IHRvIGNhbGN1bGF0ZSBkaXN0YW5jZSB0b1xuICAgICAqIEByZXR1cm5zIHRoZSBzaWduZWQgZGlzdGFuY2UgYmV0d2VlbiB0aGUgcGxhbmUgZGVmaW5lZCBieSB0aGUgbm9ybWFsIHZlY3RvciBhdCB0aGUgXCJvcmlnaW5cIlwiIHBvaW50IGFuZCB0aGUgZ2l2ZW4gb3RoZXIgcG9pbnQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gc2lnbmVkRGlzdGFuY2VUb1BsYW5lRnJvbVBvc2l0aW9uQW5kTm9ybWFsKG9yaWdpbiwgbm9ybWFsLCBwb2ludCkge1xuICAgICAgICBjb25zdCBkID0gLShub3JtYWwueCAqIG9yaWdpbi54ICsgbm9ybWFsLnkgKiBvcmlnaW4ueSArIG5vcm1hbC56ICogb3JpZ2luLnopO1xuICAgICAgICByZXR1cm4gVmVjdG9yMy5kb3QocG9pbnQsIG5vcm1hbCkgKyBkO1xuICAgIH1cbiAgICBQbGFuZS5zaWduZWREaXN0YW5jZVRvUGxhbmVGcm9tUG9zaXRpb25BbmROb3JtYWwgPSBzaWduZWREaXN0YW5jZVRvUGxhbmVGcm9tUG9zaXRpb25BbmROb3JtYWw7XG4gICAgLyoqXG4gICAgICogQHJldHVybnMgdGhlIHBsYW5lIGNvb3JkaW5hdGVzIGFzIGEgbmV3IGFycmF5IG9mIDQgZWxlbWVudHMgW2EsIGIsIGMsIGRdLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFzQXJyYXkocGxhbmUpIHtcbiAgICAgICAgcmV0dXJuIFtwbGFuZS5ub3JtYWwueCwgcGxhbmUubm9ybWFsLnksIHBsYW5lLm5vcm1hbC56LCBwbGFuZS5kXTtcbiAgICB9XG4gICAgUGxhbmUuYXNBcnJheSA9IGFzQXJyYXk7XG4gICAgLy8gTWV0aG9kc1xuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIGEgbmV3IHBsYW5lIGNvcGllZCBmcm9tIHRoZSBjdXJyZW50IFBsYW5lLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lKHBsYW5lKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGUocGxhbmUubm9ybWFsLngsIHBsYW5lLm5vcm1hbC55LCBwbGFuZS5ub3JtYWwueiwgcGxhbmUuZCk7XG4gICAgfVxuICAgIFBsYW5lLmNsb25lID0gY2xvbmU7XG4gICAgLyoqXG4gICAgICogQHJldHVybnMgdGhlIFBsYW5lIGhhc2ggY29kZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRIYXNoQ29kZShfcGxhbmUpIHtcbiAgICAgICAgLy8gVE9ET1xuICAgICAgICAvLyBsZXQgaGFzaCA9IHBsYW5lLm5vcm1hbC5nZXRIYXNoQ29kZSgpXG4gICAgICAgIC8vIGhhc2ggPSAoaGFzaCAqIDM5NykgXiAocGxhbmUuZCB8fCAwKVxuICAgICAgICAvLyByZXR1cm4gaGFzaFxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgUGxhbmUuZ2V0SGFzaENvZGUgPSBnZXRIYXNoQ29kZTtcbiAgICAvKipcbiAgICAgKiBOb3JtYWxpemUgdGhlIGN1cnJlbnQgUGxhbmUgaW4gcGxhY2UuXG4gICAgICogQHJldHVybnMgdGhlIHVwZGF0ZWQgUGxhbmUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbm9ybWFsaXplKHBsYW5lKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGNyZWF0ZSgwLCAwLCAwLCAwKTtcbiAgICAgICAgY29uc3Qgbm9ybSA9IE1hdGguc3FydChwbGFuZS5ub3JtYWwueCAqIHBsYW5lLm5vcm1hbC54ICtcbiAgICAgICAgICAgIHBsYW5lLm5vcm1hbC55ICogcGxhbmUubm9ybWFsLnkgK1xuICAgICAgICAgICAgcGxhbmUubm9ybWFsLnogKiBwbGFuZS5ub3JtYWwueik7XG4gICAgICAgIGxldCBtYWduaXR1ZGUgPSAwLjA7XG4gICAgICAgIGlmIChub3JtICE9PSAwKSB7XG4gICAgICAgICAgICBtYWduaXR1ZGUgPSAxLjAgLyBub3JtO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdC5ub3JtYWwueCA9IHBsYW5lLm5vcm1hbC54ICogbWFnbml0dWRlO1xuICAgICAgICByZXN1bHQubm9ybWFsLnkgPSBwbGFuZS5ub3JtYWwueSAqIG1hZ25pdHVkZTtcbiAgICAgICAgcmVzdWx0Lm5vcm1hbC56ID0gcGxhbmUubm9ybWFsLnogKiBtYWduaXR1ZGU7XG4gICAgICAgIHJlc3VsdC5kICo9IG1hZ25pdHVkZTtcbiAgICAgICAgcmV0dXJuIHBsYW5lO1xuICAgIH1cbiAgICBQbGFuZS5ub3JtYWxpemUgPSBub3JtYWxpemU7XG4gICAgLyoqXG4gICAgICogQXBwbGllcyBhIHRyYW5zZm9ybWF0aW9uIHRoZSBwbGFuZSBhbmQgcmV0dXJucyB0aGUgcmVzdWx0XG4gICAgICogQHBhcmFtIHRyYW5zZm9ybWF0aW9uIC0gdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCB0byBiZSBhcHBsaWVkIHRvIHRoZSBwbGFuZVxuICAgICAqIEByZXR1cm5zIGEgbmV3IFBsYW5lIGFzIHRoZSByZXN1bHQgb2YgdGhlIHRyYW5zZm9ybWF0aW9uIG9mIHRoZSBjdXJyZW50IFBsYW5lIGJ5IHRoZSBnaXZlbiBtYXRyaXguXG4gICAgICovXG4gICAgZnVuY3Rpb24gdHJhbnNmb3JtKHBsYW5lLCB0cmFuc2Zvcm1hdGlvbikge1xuICAgICAgICBjb25zdCB0cmFuc3Bvc2VkTWF0cml4ID0gTWF0cml4LmNyZWF0ZSgpO1xuICAgICAgICBNYXRyaXgudHJhbnNwb3NlVG9SZWYodHJhbnNmb3JtYXRpb24sIHRyYW5zcG9zZWRNYXRyaXgpO1xuICAgICAgICBjb25zdCBtID0gdHJhbnNwb3NlZE1hdHJpeC5fbTtcbiAgICAgICAgY29uc3QgeCA9IHBsYW5lLm5vcm1hbC54O1xuICAgICAgICBjb25zdCB5ID0gcGxhbmUubm9ybWFsLnk7XG4gICAgICAgIGNvbnN0IHogPSBwbGFuZS5ub3JtYWwuejtcbiAgICAgICAgY29uc3QgZCA9IHBsYW5lLmQ7XG4gICAgICAgIGNvbnN0IG5vcm1hbFggPSB4ICogbVswXSArIHkgKiBtWzFdICsgeiAqIG1bMl0gKyBkICogbVszXTtcbiAgICAgICAgY29uc3Qgbm9ybWFsWSA9IHggKiBtWzRdICsgeSAqIG1bNV0gKyB6ICogbVs2XSArIGQgKiBtWzddO1xuICAgICAgICBjb25zdCBub3JtYWxaID0geCAqIG1bOF0gKyB5ICogbVs5XSArIHogKiBtWzEwXSArIGQgKiBtWzExXTtcbiAgICAgICAgY29uc3QgZmluYWxEID0geCAqIG1bMTJdICsgeSAqIG1bMTNdICsgeiAqIG1bMTRdICsgZCAqIG1bMTVdO1xuICAgICAgICByZXR1cm4gY3JlYXRlKG5vcm1hbFgsIG5vcm1hbFksIG5vcm1hbFosIGZpbmFsRCk7XG4gICAgfVxuICAgIFBsYW5lLnRyYW5zZm9ybSA9IHRyYW5zZm9ybTtcbiAgICAvKipcbiAgICAgKiBDYWxjdWFsdHRlIHRoZSBkb3QgcHJvZHVjdCBiZXR3ZWVuIHRoZSBwb2ludCBhbmQgdGhlIHBsYW5lIG5vcm1hbFxuICAgICAqIEBwYXJhbSBwb2ludCAtIHBvaW50IHRvIGNhbGN1bGF0ZSB0aGUgZG90IHByb2R1Y3Qgd2l0aFxuICAgICAqIEByZXR1cm5zIHRoZSBkb3QgcHJvZHVjdCAoZmxvYXQpIG9mIHRoZSBwb2ludCBjb29yZGluYXRlcyBhbmQgdGhlIHBsYW5lIG5vcm1hbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBkb3RDb29yZGluYXRlKHBsYW5lLCBwb2ludCkge1xuICAgICAgICByZXR1cm4gKHBsYW5lLm5vcm1hbC54ICogcG9pbnQueCArXG4gICAgICAgICAgICBwbGFuZS5ub3JtYWwueSAqIHBvaW50LnkgK1xuICAgICAgICAgICAgcGxhbmUubm9ybWFsLnogKiBwb2ludC56ICtcbiAgICAgICAgICAgIHBsYW5lLmQpO1xuICAgIH1cbiAgICBQbGFuZS5kb3RDb29yZGluYXRlID0gZG90Q29vcmRpbmF0ZTtcbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHRoZSBjdXJyZW50IFBsYW5lIGZyb20gdGhlIHBsYW5lIGRlZmluZWQgYnkgdGhlIHRocmVlIGdpdmVuIHBvaW50cy5cbiAgICAgKiBAcGFyYW0gcG9pbnQxIC0gb25lIG9mIHRoZSBwb2ludHMgdXNlZCB0byBjb250cnVjdCB0aGUgcGxhbmVcbiAgICAgKiBAcGFyYW0gcG9pbnQyIC0gb25lIG9mIHRoZSBwb2ludHMgdXNlZCB0byBjb250cnVjdCB0aGUgcGxhbmVcbiAgICAgKiBAcGFyYW0gcG9pbnQzIC0gb25lIG9mIHRoZSBwb2ludHMgdXNlZCB0byBjb250cnVjdCB0aGUgcGxhbmVcbiAgICAgKiBAcmV0dXJucyB0aGUgdXBkYXRlZCBQbGFuZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb3B5RnJvbVBvaW50cyhwb2ludDEsIHBvaW50MiwgcG9pbnQzKSB7XG4gICAgICAgIGNvbnN0IHgxID0gcG9pbnQyLnggLSBwb2ludDEueDtcbiAgICAgICAgY29uc3QgeTEgPSBwb2ludDIueSAtIHBvaW50MS55O1xuICAgICAgICBjb25zdCB6MSA9IHBvaW50Mi56IC0gcG9pbnQxLno7XG4gICAgICAgIGNvbnN0IHgyID0gcG9pbnQzLnggLSBwb2ludDEueDtcbiAgICAgICAgY29uc3QgeTIgPSBwb2ludDMueSAtIHBvaW50MS55O1xuICAgICAgICBjb25zdCB6MiA9IHBvaW50My56IC0gcG9pbnQxLno7XG4gICAgICAgIGNvbnN0IHl6ID0geTEgKiB6MiAtIHoxICogeTI7XG4gICAgICAgIGNvbnN0IHh6ID0gejEgKiB4MiAtIHgxICogejI7XG4gICAgICAgIGNvbnN0IHh5ID0geDEgKiB5MiAtIHkxICogeDI7XG4gICAgICAgIGNvbnN0IHB5dGggPSBNYXRoLnNxcnQoeXogKiB5eiArIHh6ICogeHogKyB4eSAqIHh5KTtcbiAgICAgICAgbGV0IGludlB5dGg7XG4gICAgICAgIGlmIChweXRoICE9PSAwKSB7XG4gICAgICAgICAgICBpbnZQeXRoID0gMS4wIC8gcHl0aDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGludlB5dGggPSAwLjA7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgbm9ybWFsID0gVmVjdG9yMy5jcmVhdGUoeXogKiBpbnZQeXRoLCB4eiAqIGludlB5dGgsIHh5ICogaW52UHl0aCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBub3JtYWwsXG4gICAgICAgICAgICBkOiAtKG5vcm1hbC54ICogcG9pbnQxLnggKyBub3JtYWwueSAqIHBvaW50MS55ICsgbm9ybWFsLnogKiBwb2ludDEueilcbiAgICAgICAgfTtcbiAgICB9XG4gICAgUGxhbmUuY29weUZyb21Qb2ludHMgPSBjb3B5RnJvbVBvaW50cztcbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhlIHBsYW5lIGlzIGZhY2luZyBhIGdpdmVuIGRpcmVjdGlvblxuICAgICAqIEBwYXJhbSBkaXJlY3Rpb24gLSB0aGUgZGlyZWN0aW9uIHRvIGNoZWNrIGlmIHRoZSBwbGFuZSBpcyBmYWNpbmdcbiAgICAgKiBAcGFyYW0gZXBzaWxvbiAtIHZhbHVlIHRoZSBkb3QgcHJvZHVjdCBpcyBjb21wYXJlZCBhZ2FpbnN0IChyZXR1cm5zIHRydWUgaWYgZG90ICZsdDs9IGVwc2lsb24pXG4gICAgICogQHJldHVybnMgVHJ1ZSBpcyB0aGUgdmVjdG9yIFwiZGlyZWN0aW9uXCIgIGlzIHRoZSBzYW1lIHNpZGUgdGhhbiB0aGUgcGxhbmUgbm9ybWFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzRnJvbnRGYWNpbmdUbyhwbGFuZSwgZGlyZWN0aW9uLCBlcHNpbG9uKSB7XG4gICAgICAgIGNvbnN0IGRvdCA9IFZlY3RvcjMuZG90KHBsYW5lLm5vcm1hbCwgZGlyZWN0aW9uKTtcbiAgICAgICAgcmV0dXJuIGRvdCA8PSBlcHNpbG9uO1xuICAgIH1cbiAgICBQbGFuZS5pc0Zyb250RmFjaW5nVG8gPSBpc0Zyb250RmFjaW5nVG87XG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlcyB0aGUgZGlzdGFuY2UgdG8gYSBwb2ludFxuICAgICAqIEBwYXJhbSBwb2ludCAtIHBvaW50IHRvIGNhbGN1bGF0ZSBkaXN0YW5jZSB0b1xuICAgICAqIEByZXR1cm5zIHRoZSBzaWduZWQgZGlzdGFuY2UgKGZsb2F0KSBmcm9tIHRoZSBnaXZlbiBwb2ludCB0byB0aGUgUGxhbmUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gc2lnbmVkRGlzdGFuY2VUbyhwbGFuZSwgcG9pbnQpIHtcbiAgICAgICAgcmV0dXJuIFZlY3RvcjMuZG90KHBvaW50LCBwbGFuZS5ub3JtYWwpICsgcGxhbmUuZDtcbiAgICB9XG4gICAgUGxhbmUuc2lnbmVkRGlzdGFuY2VUbyA9IHNpZ25lZERpc3RhbmNlVG87XG59KShQbGFuZSB8fCAoUGxhbmUgPSB7fSkpO1xuIiwgImltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuL1ZlY3RvcjMnO1xuaW1wb3J0IHsgUXVhdGVybmlvbiB9IGZyb20gJy4vUXVhdGVybmlvbic7XG5pbXBvcnQgeyBQbGFuZSB9IGZyb20gJy4vUGxhbmUnO1xuLyoqXG4gKiBDbGFzcyB1c2VkIHRvIHN0b3JlIG1hdHJpeCBkYXRhICg0eDQpXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB2YXIgTWF0cml4O1xuKGZ1bmN0aW9uIChNYXRyaXgpIHtcbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBpbnRlcm5hbCBkYXRhIG9mIHRoZSBtYXRyaXhcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtKHNlbGYpIHtcbiAgICAgICAgcmV0dXJuIHNlbGYuX207XG4gICAgfVxuICAgIE1hdHJpeC5tID0gbTtcbiAgICBsZXQgX3VwZGF0ZUZsYWdTZWVkID0gMDtcbiAgICBjb25zdCBfaWRlbnRpdHlSZWFkb25seSA9IHt9O1xuICAgIC8qKlxuICAgICAqIEdldHMgYW4gaWRlbnRpdHkgbWF0cml4IHRoYXQgbXVzdCBub3QgYmUgdXBkYXRlZFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIElkZW50aXR5UmVhZG9ubHkoKSB7XG4gICAgICAgIHJldHVybiBfaWRlbnRpdHlSZWFkb25seTtcbiAgICB9XG4gICAgTWF0cml4LklkZW50aXR5UmVhZG9ubHkgPSBJZGVudGl0eVJlYWRvbmx5O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gZW1wdHkgbWF0cml4IChmaWxsZWQgd2l0aCB6ZXJvcylcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUoKSB7XG4gICAgICAgIGNvbnN0IG5ld01hdHJpeCA9IHtcbiAgICAgICAgICAgIHVwZGF0ZUZsYWc6IDAsXG4gICAgICAgICAgICBpc0lkZW50aXR5OiBmYWxzZSxcbiAgICAgICAgICAgIGlzSWRlbnRpdHkzeDI6IHRydWUsXG4gICAgICAgICAgICBfaXNJZGVudGl0eURpcnR5OiB0cnVlLFxuICAgICAgICAgICAgX2lzSWRlbnRpdHkzeDJEaXJ0eTogdHJ1ZSxcbiAgICAgICAgICAgIF9tOiBbMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMF1cbiAgICAgICAgfTtcbiAgICAgICAgX3VwZGF0ZUlkZW50aXR5U3RhdHVzKG5ld01hdHJpeCwgZmFsc2UpO1xuICAgICAgICByZXR1cm4gbmV3TWF0cml4O1xuICAgIH1cbiAgICBNYXRyaXguY3JlYXRlID0gY3JlYXRlO1xuICAgIC8vIFN0YXRpY3NcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gYW4gYXJyYXlcbiAgICAgKiBAcGFyYW0gYXJyYXkgLSBkZWZpbmVzIHRoZSBzb3VyY2UgYXJyYXlcbiAgICAgKiBAcGFyYW0gb2Zmc2V0IC0gZGVmaW5lcyBhbiBvZmZzZXQgaW4gdGhlIHNvdXJjZSBhcnJheVxuICAgICAqIEByZXR1cm5zIGEgbmV3IE1hdHJpeCBzZXQgZnJvbSB0aGUgc3RhcnRpbmcgaW5kZXggb2YgdGhlIGdpdmVuIGFycmF5XG4gICAgICovXG4gICAgZnVuY3Rpb24gZnJvbUFycmF5KGFycmF5LCBvZmZzZXQgPSAwKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGNyZWF0ZSgpO1xuICAgICAgICBmcm9tQXJyYXlUb1JlZihhcnJheSwgb2Zmc2V0LCByZXN1bHQpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBNYXRyaXguZnJvbUFycmF5ID0gZnJvbUFycmF5O1xuICAgIC8qKlxuICAgICAqIENvcHkgdGhlIGNvbnRlbnQgb2YgYW4gYXJyYXkgaW50byBhIGdpdmVuIG1hdHJpeFxuICAgICAqIEBwYXJhbSBhcnJheSAtIGRlZmluZXMgdGhlIHNvdXJjZSBhcnJheVxuICAgICAqIEBwYXJhbSBvZmZzZXQgLSBkZWZpbmVzIGFuIG9mZnNldCBpbiB0aGUgc291cmNlIGFycmF5XG4gICAgICogQHBhcmFtIHJlc3VsdCAtIGRlZmluZXMgdGhlIHRhcmdldCBtYXRyaXhcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmcm9tQXJyYXlUb1JlZihhcnJheSwgb2Zmc2V0LCByZXN1bHQpIHtcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IDE2OyBpbmRleCsrKSB7XG4gICAgICAgICAgICByZXN1bHQuX21baW5kZXhdID0gYXJyYXlbaW5kZXggKyBvZmZzZXRdO1xuICAgICAgICB9XG4gICAgICAgIF9tYXJrQXNVcGRhdGVkKHJlc3VsdCk7XG4gICAgfVxuICAgIE1hdHJpeC5mcm9tQXJyYXlUb1JlZiA9IGZyb21BcnJheVRvUmVmO1xuICAgIC8qKlxuICAgICAqIFN0b3JlcyBhbiBhcnJheSBpbnRvIGEgbWF0cml4IGFmdGVyIGhhdmluZyBtdWx0aXBsaWVkIGVhY2ggY29tcG9uZW50IGJ5IGEgZ2l2ZW4gZmFjdG9yXG4gICAgICogQHBhcmFtIGFycmF5IC0gZGVmaW5lcyB0aGUgc291cmNlIGFycmF5XG4gICAgICogQHBhcmFtIG9mZnNldCAtIGRlZmluZXMgdGhlIG9mZnNldCBpbiB0aGUgc291cmNlIGFycmF5XG4gICAgICogQHBhcmFtIHNjYWxlIC0gZGVmaW5lcyB0aGUgc2NhbGluZyBmYWN0b3JcbiAgICAgKiBAcGFyYW0gcmVzdWx0IC0gZGVmaW5lcyB0aGUgdGFyZ2V0IG1hdHJpeFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZyb21GbG9hdEFycmF5VG9SZWZTY2FsZWQoYXJyYXksIG9mZnNldCwgc2NhbGUsIHJlc3VsdCkge1xuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgMTY7IGluZGV4KyspIHtcbiAgICAgICAgICAgIHJlc3VsdC5fbVtpbmRleF0gPSBhcnJheVtpbmRleCArIG9mZnNldF0gKiBzY2FsZTtcbiAgICAgICAgfVxuICAgICAgICBfbWFya0FzVXBkYXRlZChyZXN1bHQpO1xuICAgIH1cbiAgICBNYXRyaXguZnJvbUZsb2F0QXJyYXlUb1JlZlNjYWxlZCA9IGZyb21GbG9hdEFycmF5VG9SZWZTY2FsZWQ7XG4gICAgLyoqXG4gICAgICogU3RvcmVzIGEgbGlzdCBvZiB2YWx1ZXMgKDE2KSBpbnNpZGUgYSBnaXZlbiBtYXRyaXhcbiAgICAgKiBAcGFyYW0gaW5pdGlhbE0xMSAtIGRlZmluZXMgMXN0IHZhbHVlIG9mIDFzdCByb3dcbiAgICAgKiBAcGFyYW0gaW5pdGlhbE0xMiAtIGRlZmluZXMgMm5kIHZhbHVlIG9mIDFzdCByb3dcbiAgICAgKiBAcGFyYW0gaW5pdGlhbE0xMyAtIGRlZmluZXMgM3JkIHZhbHVlIG9mIDFzdCByb3dcbiAgICAgKiBAcGFyYW0gaW5pdGlhbE0xNCAtIGRlZmluZXMgNHRoIHZhbHVlIG9mIDFzdCByb3dcbiAgICAgKiBAcGFyYW0gaW5pdGlhbE0yMSAtIGRlZmluZXMgMXN0IHZhbHVlIG9mIDJuZCByb3dcbiAgICAgKiBAcGFyYW0gaW5pdGlhbE0yMiAtIGRlZmluZXMgMm5kIHZhbHVlIG9mIDJuZCByb3dcbiAgICAgKiBAcGFyYW0gaW5pdGlhbE0yMyAtIGRlZmluZXMgM3JkIHZhbHVlIG9mIDJuZCByb3dcbiAgICAgKiBAcGFyYW0gaW5pdGlhbE0yNCAtIGRlZmluZXMgNHRoIHZhbHVlIG9mIDJuZCByb3dcbiAgICAgKiBAcGFyYW0gaW5pdGlhbE0zMSAtIGRlZmluZXMgMXN0IHZhbHVlIG9mIDNyZCByb3dcbiAgICAgKiBAcGFyYW0gaW5pdGlhbE0zMiAtIGRlZmluZXMgMm5kIHZhbHVlIG9mIDNyZCByb3dcbiAgICAgKiBAcGFyYW0gaW5pdGlhbE0zMyAtIGRlZmluZXMgM3JkIHZhbHVlIG9mIDNyZCByb3dcbiAgICAgKiBAcGFyYW0gaW5pdGlhbE0zNCAtIGRlZmluZXMgNHRoIHZhbHVlIG9mIDNyZCByb3dcbiAgICAgKiBAcGFyYW0gaW5pdGlhbE00MSAtIGRlZmluZXMgMXN0IHZhbHVlIG9mIDR0aCByb3dcbiAgICAgKiBAcGFyYW0gaW5pdGlhbE00MiAtIGRlZmluZXMgMm5kIHZhbHVlIG9mIDR0aCByb3dcbiAgICAgKiBAcGFyYW0gaW5pdGlhbE00MyAtIGRlZmluZXMgM3JkIHZhbHVlIG9mIDR0aCByb3dcbiAgICAgKiBAcGFyYW0gaW5pdGlhbE00NCAtIGRlZmluZXMgNHRoIHZhbHVlIG9mIDR0aCByb3dcbiAgICAgKiBAcGFyYW0gcmVzdWx0IC0gZGVmaW5lcyB0aGUgdGFyZ2V0IG1hdHJpeFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZyb21WYWx1ZXNUb1JlZihpbml0aWFsTTExLCBpbml0aWFsTTEyLCBpbml0aWFsTTEzLCBpbml0aWFsTTE0LCBpbml0aWFsTTIxLCBpbml0aWFsTTIyLCBpbml0aWFsTTIzLCBpbml0aWFsTTI0LCBpbml0aWFsTTMxLCBpbml0aWFsTTMyLCBpbml0aWFsTTMzLCBpbml0aWFsTTM0LCBpbml0aWFsTTQxLCBpbml0aWFsTTQyLCBpbml0aWFsTTQzLCBpbml0aWFsTTQ0LCByZXN1bHQpIHtcbiAgICAgICAgY29uc3QgbSA9IHJlc3VsdC5fbTtcbiAgICAgICAgbVswXSA9IGluaXRpYWxNMTE7XG4gICAgICAgIG1bMV0gPSBpbml0aWFsTTEyO1xuICAgICAgICBtWzJdID0gaW5pdGlhbE0xMztcbiAgICAgICAgbVszXSA9IGluaXRpYWxNMTQ7XG4gICAgICAgIG1bNF0gPSBpbml0aWFsTTIxO1xuICAgICAgICBtWzVdID0gaW5pdGlhbE0yMjtcbiAgICAgICAgbVs2XSA9IGluaXRpYWxNMjM7XG4gICAgICAgIG1bN10gPSBpbml0aWFsTTI0O1xuICAgICAgICBtWzhdID0gaW5pdGlhbE0zMTtcbiAgICAgICAgbVs5XSA9IGluaXRpYWxNMzI7XG4gICAgICAgIG1bMTBdID0gaW5pdGlhbE0zMztcbiAgICAgICAgbVsxMV0gPSBpbml0aWFsTTM0O1xuICAgICAgICBtWzEyXSA9IGluaXRpYWxNNDE7XG4gICAgICAgIG1bMTNdID0gaW5pdGlhbE00MjtcbiAgICAgICAgbVsxNF0gPSBpbml0aWFsTTQzO1xuICAgICAgICBtWzE1XSA9IGluaXRpYWxNNDQ7XG4gICAgICAgIF9tYXJrQXNVcGRhdGVkKHJlc3VsdCk7XG4gICAgfVxuICAgIE1hdHJpeC5mcm9tVmFsdWVzVG9SZWYgPSBmcm9tVmFsdWVzVG9SZWY7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBuZXcgbWF0cml4IGZyb20gYSBsaXN0IG9mIHZhbHVlcyAoMTYpXG4gICAgICogQHBhcmFtIGluaXRpYWxNMTEgLSBkZWZpbmVzIDFzdCB2YWx1ZSBvZiAxc3Qgcm93XG4gICAgICogQHBhcmFtIGluaXRpYWxNMTIgLSBkZWZpbmVzIDJuZCB2YWx1ZSBvZiAxc3Qgcm93XG4gICAgICogQHBhcmFtIGluaXRpYWxNMTMgLSBkZWZpbmVzIDNyZCB2YWx1ZSBvZiAxc3Qgcm93XG4gICAgICogQHBhcmFtIGluaXRpYWxNMTQgLSBkZWZpbmVzIDR0aCB2YWx1ZSBvZiAxc3Qgcm93XG4gICAgICogQHBhcmFtIGluaXRpYWxNMjEgLSBkZWZpbmVzIDFzdCB2YWx1ZSBvZiAybmQgcm93XG4gICAgICogQHBhcmFtIGluaXRpYWxNMjIgLSBkZWZpbmVzIDJuZCB2YWx1ZSBvZiAybmQgcm93XG4gICAgICogQHBhcmFtIGluaXRpYWxNMjMgLSBkZWZpbmVzIDNyZCB2YWx1ZSBvZiAybmQgcm93XG4gICAgICogQHBhcmFtIGluaXRpYWxNMjQgLSBkZWZpbmVzIDR0aCB2YWx1ZSBvZiAybmQgcm93XG4gICAgICogQHBhcmFtIGluaXRpYWxNMzEgLSBkZWZpbmVzIDFzdCB2YWx1ZSBvZiAzcmQgcm93XG4gICAgICogQHBhcmFtIGluaXRpYWxNMzIgLSBkZWZpbmVzIDJuZCB2YWx1ZSBvZiAzcmQgcm93XG4gICAgICogQHBhcmFtIGluaXRpYWxNMzMgLSBkZWZpbmVzIDNyZCB2YWx1ZSBvZiAzcmQgcm93XG4gICAgICogQHBhcmFtIGluaXRpYWxNMzQgLSBkZWZpbmVzIDR0aCB2YWx1ZSBvZiAzcmQgcm93XG4gICAgICogQHBhcmFtIGluaXRpYWxNNDEgLSBkZWZpbmVzIDFzdCB2YWx1ZSBvZiA0dGggcm93XG4gICAgICogQHBhcmFtIGluaXRpYWxNNDIgLSBkZWZpbmVzIDJuZCB2YWx1ZSBvZiA0dGggcm93XG4gICAgICogQHBhcmFtIGluaXRpYWxNNDMgLSBkZWZpbmVzIDNyZCB2YWx1ZSBvZiA0dGggcm93XG4gICAgICogQHBhcmFtIGluaXRpYWxNNDQgLSBkZWZpbmVzIDR0aCB2YWx1ZSBvZiA0dGggcm93XG4gICAgICogQHJldHVybnMgdGhlIG5ldyBtYXRyaXhcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmcm9tVmFsdWVzKGluaXRpYWxNMTEsIGluaXRpYWxNMTIsIGluaXRpYWxNMTMsIGluaXRpYWxNMTQsIGluaXRpYWxNMjEsIGluaXRpYWxNMjIsIGluaXRpYWxNMjMsIGluaXRpYWxNMjQsIGluaXRpYWxNMzEsIGluaXRpYWxNMzIsIGluaXRpYWxNMzMsIGluaXRpYWxNMzQsIGluaXRpYWxNNDEsIGluaXRpYWxNNDIsIGluaXRpYWxNNDMsIGluaXRpYWxNNDQpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gY3JlYXRlKCk7XG4gICAgICAgIGNvbnN0IG0gPSByZXN1bHQuX207XG4gICAgICAgIG1bMF0gPSBpbml0aWFsTTExO1xuICAgICAgICBtWzFdID0gaW5pdGlhbE0xMjtcbiAgICAgICAgbVsyXSA9IGluaXRpYWxNMTM7XG4gICAgICAgIG1bM10gPSBpbml0aWFsTTE0O1xuICAgICAgICBtWzRdID0gaW5pdGlhbE0yMTtcbiAgICAgICAgbVs1XSA9IGluaXRpYWxNMjI7XG4gICAgICAgIG1bNl0gPSBpbml0aWFsTTIzO1xuICAgICAgICBtWzddID0gaW5pdGlhbE0yNDtcbiAgICAgICAgbVs4XSA9IGluaXRpYWxNMzE7XG4gICAgICAgIG1bOV0gPSBpbml0aWFsTTMyO1xuICAgICAgICBtWzEwXSA9IGluaXRpYWxNMzM7XG4gICAgICAgIG1bMTFdID0gaW5pdGlhbE0zNDtcbiAgICAgICAgbVsxMl0gPSBpbml0aWFsTTQxO1xuICAgICAgICBtWzEzXSA9IGluaXRpYWxNNDI7XG4gICAgICAgIG1bMTRdID0gaW5pdGlhbE00MztcbiAgICAgICAgbVsxNV0gPSBpbml0aWFsTTQ0O1xuICAgICAgICBfbWFya0FzVXBkYXRlZChyZXN1bHQpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBNYXRyaXguZnJvbVZhbHVlcyA9IGZyb21WYWx1ZXM7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBtYXRyaXggY29tcG9zZWQgYnkgbWVyZ2luZyBzY2FsZSAodmVjdG9yMyksIHJvdGF0aW9uIChxdWF0ZXJuaW9uKSBhbmQgdHJhbnNsYXRpb24gKHZlY3RvcjMpXG4gICAgICogQHBhcmFtIHNjYWxlIC0gZGVmaW5lcyB0aGUgc2NhbGUgdmVjdG9yM1xuICAgICAqIEBwYXJhbSByb3RhdGlvbiAtIGRlZmluZXMgdGhlIHJvdGF0aW9uIHF1YXRlcm5pb25cbiAgICAgKiBAcGFyYW0gdHJhbnNsYXRpb24gLSBkZWZpbmVzIHRoZSB0cmFuc2xhdGlvbiB2ZWN0b3IzXG4gICAgICogQHJldHVybnMgYSBuZXcgbWF0cml4XG4gICAgICovXG4gICAgZnVuY3Rpb24gY29tcG9zZShzY2FsZSwgcm90YXRpb24sIHRyYW5zbGF0aW9uKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGNyZWF0ZSgpO1xuICAgICAgICBjb21wb3NlVG9SZWYoc2NhbGUsIHJvdGF0aW9uLCB0cmFuc2xhdGlvbiwgcmVzdWx0KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgTWF0cml4LmNvbXBvc2UgPSBjb21wb3NlO1xuICAgIC8qKlxuICAgICAqIFNldHMgYSBtYXRyaXggdG8gYSB2YWx1ZSBjb21wb3NlZCBieSBtZXJnaW5nIHNjYWxlICh2ZWN0b3IzKSwgcm90YXRpb24gKHF1YXRlcm5pb24pIGFuZCB0cmFuc2xhdGlvbiAodmVjdG9yMylcbiAgICAgKiBAcGFyYW0gc2NhbGUgLSBkZWZpbmVzIHRoZSBzY2FsZSB2ZWN0b3IzXG4gICAgICogQHBhcmFtIHJvdGF0aW9uIC0gZGVmaW5lcyB0aGUgcm90YXRpb24gcXVhdGVybmlvblxuICAgICAqIEBwYXJhbSB0cmFuc2xhdGlvbiAtIGRlZmluZXMgdGhlIHRyYW5zbGF0aW9uIHZlY3RvcjNcbiAgICAgKiBAcGFyYW0gcmVzdWx0IC0gZGVmaW5lcyB0aGUgdGFyZ2V0IG1hdHJpeFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvbXBvc2VUb1JlZihzY2FsZSwgcm90YXRpb24sIHRyYW5zbGF0aW9uLCByZXN1bHQpIHtcbiAgICAgICAgY29uc3QgdG1wTWF0cml4ID0gW2NyZWF0ZSgpLCBjcmVhdGUoKSwgY3JlYXRlKCldO1xuICAgICAgICBzY2FsaW5nVG9SZWYoc2NhbGUueCwgc2NhbGUueSwgc2NhbGUueiwgdG1wTWF0cml4WzFdKTtcbiAgICAgICAgZnJvbVF1YXRlcm5pb25Ub1JlZihyb3RhdGlvbiwgdG1wTWF0cml4WzBdKTtcbiAgICAgICAgbXVsdGlwbHlUb1JlZih0bXBNYXRyaXhbMV0sIHRtcE1hdHJpeFswXSwgcmVzdWx0KTtcbiAgICAgICAgc2V0VHJhbnNsYXRpb24ocmVzdWx0LCB0cmFuc2xhdGlvbik7XG4gICAgfVxuICAgIE1hdHJpeC5jb21wb3NlVG9SZWYgPSBjb21wb3NlVG9SZWY7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBpZGVudGl0eSBtYXRyaXhcbiAgICAgKiBAcmV0dXJucyBhIG5ldyBpZGVudGl0eSBtYXRyaXhcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBJZGVudGl0eSgpIHtcbiAgICAgICAgY29uc3QgaWRlbnRpdHkgPSBmcm9tVmFsdWVzKDEuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAxLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMS4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDEuMCk7XG4gICAgICAgIF91cGRhdGVJZGVudGl0eVN0YXR1cyhpZGVudGl0eSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBpZGVudGl0eTtcbiAgICB9XG4gICAgTWF0cml4LklkZW50aXR5ID0gSWRlbnRpdHk7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBpZGVudGl0eSBtYXRyaXggYW5kIHN0b3JlcyB0aGUgcmVzdWx0IGluIGEgZ2l2ZW4gbWF0cml4XG4gICAgICogQHBhcmFtIHJlc3VsdCAtIGRlZmluZXMgdGhlIHRhcmdldCBtYXRyaXhcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBJZGVudGl0eVRvUmVmKHJlc3VsdCkge1xuICAgICAgICBmcm9tVmFsdWVzVG9SZWYoMS4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDEuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAxLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMS4wLCByZXN1bHQpO1xuICAgICAgICBfdXBkYXRlSWRlbnRpdHlTdGF0dXMocmVzdWx0LCB0cnVlKTtcbiAgICB9XG4gICAgTWF0cml4LklkZW50aXR5VG9SZWYgPSBJZGVudGl0eVRvUmVmO1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgemVybyBtYXRyaXhcbiAgICAgKiBAcmV0dXJucyBhIG5ldyB6ZXJvIG1hdHJpeFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIFplcm8oKSB7XG4gICAgICAgIGNvbnN0IHplcm8gPSBmcm9tVmFsdWVzKDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCk7XG4gICAgICAgIF91cGRhdGVJZGVudGl0eVN0YXR1cyh6ZXJvLCBmYWxzZSk7XG4gICAgICAgIHJldHVybiB6ZXJvO1xuICAgIH1cbiAgICBNYXRyaXguWmVybyA9IFplcm87XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyByb3RhdGlvbiBtYXRyaXggZm9yIFwiYW5nbGVcIiByYWRpYW5zIGFyb3VuZCB0aGUgWCBheGlzXG4gICAgICogQHBhcmFtIGFuZ2xlIC0gZGVmaW5lcyB0aGUgYW5nbGUgKGluIHJhZGlhbnMpIHRvIHVzZVxuICAgICAqIEByZXR1cm5zIHRoZSBuZXcgbWF0cml4XG4gICAgICovXG4gICAgZnVuY3Rpb24gUm90YXRpb25YKGFuZ2xlKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGNyZWF0ZSgpO1xuICAgICAgICByb3RhdGlvblhUb1JlZihhbmdsZSwgcmVzdWx0KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgTWF0cml4LlJvdGF0aW9uWCA9IFJvdGF0aW9uWDtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHJvdGF0aW9uIG1hdHJpeCBmb3IgXCJhbmdsZVwiIHJhZGlhbnMgYXJvdW5kIHRoZSBYIGF4aXMgYW5kIHN0b3JlcyBpdCBpbiBhIGdpdmVuIG1hdHJpeFxuICAgICAqIEBwYXJhbSBhbmdsZSAtIGRlZmluZXMgdGhlIGFuZ2xlIChpbiByYWRpYW5zKSB0byB1c2VcbiAgICAgKiBAcGFyYW0gcmVzdWx0IC0gZGVmaW5lcyB0aGUgdGFyZ2V0IG1hdHJpeFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJvdGF0aW9uWFRvUmVmKGFuZ2xlLCByZXN1bHQpIHtcbiAgICAgICAgY29uc3QgcyA9IE1hdGguc2luKGFuZ2xlKTtcbiAgICAgICAgY29uc3QgYyA9IE1hdGguY29zKGFuZ2xlKTtcbiAgICAgICAgZnJvbVZhbHVlc1RvUmVmKDEuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCBjLCBzLCAwLjAsIDAuMCwgLXMsIGMsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMS4wLCByZXN1bHQpO1xuICAgICAgICBfdXBkYXRlSWRlbnRpdHlTdGF0dXMocmVzdWx0LCBjID09PSAxICYmIHMgPT09IDApO1xuICAgIH1cbiAgICBNYXRyaXgucm90YXRpb25YVG9SZWYgPSByb3RhdGlvblhUb1JlZjtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHJvdGF0aW9uIG1hdHJpeCBmb3IgXCJhbmdsZVwiIHJhZGlhbnMgYXJvdW5kIHRoZSBZIGF4aXNcbiAgICAgKiBAcGFyYW0gYW5nbGUgLSBkZWZpbmVzIHRoZSBhbmdsZSAoaW4gcmFkaWFucykgdG8gdXNlXG4gICAgICogQHJldHVybnMgdGhlIG5ldyBtYXRyaXhcbiAgICAgKi9cbiAgICBmdW5jdGlvbiByb3RhdGlvblkoYW5nbGUpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gY3JlYXRlKCk7XG4gICAgICAgIHJvdGF0aW9uWVRvUmVmKGFuZ2xlLCByZXN1bHQpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBNYXRyaXgucm90YXRpb25ZID0gcm90YXRpb25ZO1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgcm90YXRpb24gbWF0cml4IGZvciBcImFuZ2xlXCIgcmFkaWFucyBhcm91bmQgdGhlIFkgYXhpcyBhbmQgc3RvcmVzIGl0IGluIGEgZ2l2ZW4gbWF0cml4XG4gICAgICogQHBhcmFtIGFuZ2xlIC0gZGVmaW5lcyB0aGUgYW5nbGUgKGluIHJhZGlhbnMpIHRvIHVzZVxuICAgICAqIEBwYXJhbSByZXN1bHQgLSBkZWZpbmVzIHRoZSB0YXJnZXQgbWF0cml4XG4gICAgICovXG4gICAgZnVuY3Rpb24gcm90YXRpb25ZVG9SZWYoYW5nbGUsIHJlc3VsdCkge1xuICAgICAgICBjb25zdCBzID0gTWF0aC5zaW4oYW5nbGUpO1xuICAgICAgICBjb25zdCBjID0gTWF0aC5jb3MoYW5nbGUpO1xuICAgICAgICBmcm9tVmFsdWVzVG9SZWYoYywgMC4wLCAtcywgMC4wLCAwLjAsIDEuMCwgMC4wLCAwLjAsIHMsIDAuMCwgYywgMC4wLCAwLjAsIDAuMCwgMC4wLCAxLjAsIHJlc3VsdCk7XG4gICAgICAgIF91cGRhdGVJZGVudGl0eVN0YXR1cyhyZXN1bHQsIGMgPT09IDEgJiYgcyA9PT0gMCk7XG4gICAgfVxuICAgIE1hdHJpeC5yb3RhdGlvbllUb1JlZiA9IHJvdGF0aW9uWVRvUmVmO1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgcm90YXRpb24gbWF0cml4IGZvciBcImFuZ2xlXCIgcmFkaWFucyBhcm91bmQgdGhlIFogYXhpc1xuICAgICAqIEBwYXJhbSBhbmdsZSAtIGRlZmluZXMgdGhlIGFuZ2xlIChpbiByYWRpYW5zKSB0byB1c2VcbiAgICAgKiBAcmV0dXJucyB0aGUgbmV3IG1hdHJpeFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJvdGF0aW9uWihhbmdsZSkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBjcmVhdGUoKTtcbiAgICAgICAgcm90YXRpb25aVG9SZWYoYW5nbGUsIHJlc3VsdCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIE1hdHJpeC5yb3RhdGlvblogPSByb3RhdGlvblo7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyByb3RhdGlvbiBtYXRyaXggZm9yIFwiYW5nbGVcIiByYWRpYW5zIGFyb3VuZCB0aGUgWiBheGlzIGFuZCBzdG9yZXMgaXQgaW4gYSBnaXZlbiBtYXRyaXhcbiAgICAgKiBAcGFyYW0gYW5nbGUgLSBkZWZpbmVzIHRoZSBhbmdsZSAoaW4gcmFkaWFucykgdG8gdXNlXG4gICAgICogQHBhcmFtIHJlc3VsdCAtIGRlZmluZXMgdGhlIHRhcmdldCBtYXRyaXhcbiAgICAgKi9cbiAgICBmdW5jdGlvbiByb3RhdGlvblpUb1JlZihhbmdsZSwgcmVzdWx0KSB7XG4gICAgICAgIGNvbnN0IHMgPSBNYXRoLnNpbihhbmdsZSk7XG4gICAgICAgIGNvbnN0IGMgPSBNYXRoLmNvcyhhbmdsZSk7XG4gICAgICAgIGZyb21WYWx1ZXNUb1JlZihjLCBzLCAwLjAsIDAuMCwgLXMsIGMsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMS4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDEuMCwgcmVzdWx0KTtcbiAgICAgICAgX3VwZGF0ZUlkZW50aXR5U3RhdHVzKHJlc3VsdCwgYyA9PT0gMSAmJiBzID09PSAwKTtcbiAgICB9XG4gICAgTWF0cml4LnJvdGF0aW9uWlRvUmVmID0gcm90YXRpb25aVG9SZWY7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyByb3RhdGlvbiBtYXRyaXggZm9yIFwiYW5nbGVcIiByYWRpYW5zIGFyb3VuZCB0aGUgZ2l2ZW4gYXhpc1xuICAgICAqIEBwYXJhbSBheGlzIC0gZGVmaW5lcyB0aGUgYXhpcyB0byB1c2VcbiAgICAgKiBAcGFyYW0gYW5nbGUgLSBkZWZpbmVzIHRoZSBhbmdsZSAoaW4gcmFkaWFucykgdG8gdXNlXG4gICAgICogQHJldHVybnMgdGhlIG5ldyBtYXRyaXhcbiAgICAgKi9cbiAgICBmdW5jdGlvbiByb3RhdGlvbkF4aXMoYXhpcywgYW5nbGUpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gY3JlYXRlKCk7XG4gICAgICAgIHJvdGF0aW9uQXhpc1RvUmVmKGF4aXMsIGFuZ2xlLCByZXN1bHQpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBNYXRyaXgucm90YXRpb25BeGlzID0gcm90YXRpb25BeGlzO1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgcm90YXRpb24gbWF0cml4IGZvciBcImFuZ2xlXCIgcmFkaWFucyBhcm91bmQgdGhlIGdpdmVuIGF4aXMgYW5kIHN0b3JlcyBpdCBpbiBhIGdpdmVuIG1hdHJpeFxuICAgICAqIEBwYXJhbSBheGlzIC0gZGVmaW5lcyB0aGUgYXhpcyB0byB1c2VcbiAgICAgKiBAcGFyYW0gYW5nbGUgLSBkZWZpbmVzIHRoZSBhbmdsZSAoaW4gcmFkaWFucykgdG8gdXNlXG4gICAgICogQHBhcmFtIHJlc3VsdCAtIGRlZmluZXMgdGhlIHRhcmdldCBtYXRyaXhcbiAgICAgKi9cbiAgICBmdW5jdGlvbiByb3RhdGlvbkF4aXNUb1JlZihfYXhpcywgYW5nbGUsIHJlc3VsdCkge1xuICAgICAgICBjb25zdCBzID0gTWF0aC5zaW4oLWFuZ2xlKTtcbiAgICAgICAgY29uc3QgYyA9IE1hdGguY29zKC1hbmdsZSk7XG4gICAgICAgIGNvbnN0IGMxID0gMSAtIGM7XG4gICAgICAgIGNvbnN0IGF4aXMgPSBWZWN0b3IzLm5vcm1hbGl6ZShfYXhpcyk7XG4gICAgICAgIGNvbnN0IG0gPSByZXN1bHQuX207XG4gICAgICAgIG1bMF0gPSBheGlzLnggKiBheGlzLnggKiBjMSArIGM7XG4gICAgICAgIG1bMV0gPSBheGlzLnggKiBheGlzLnkgKiBjMSAtIGF4aXMueiAqIHM7XG4gICAgICAgIG1bMl0gPSBheGlzLnggKiBheGlzLnogKiBjMSArIGF4aXMueSAqIHM7XG4gICAgICAgIG1bM10gPSAwLjA7XG4gICAgICAgIG1bNF0gPSBheGlzLnkgKiBheGlzLnggKiBjMSArIGF4aXMueiAqIHM7XG4gICAgICAgIG1bNV0gPSBheGlzLnkgKiBheGlzLnkgKiBjMSArIGM7XG4gICAgICAgIG1bNl0gPSBheGlzLnkgKiBheGlzLnogKiBjMSAtIGF4aXMueCAqIHM7XG4gICAgICAgIG1bN10gPSAwLjA7XG4gICAgICAgIG1bOF0gPSBheGlzLnogKiBheGlzLnggKiBjMSAtIGF4aXMueSAqIHM7XG4gICAgICAgIG1bOV0gPSBheGlzLnogKiBheGlzLnkgKiBjMSArIGF4aXMueCAqIHM7XG4gICAgICAgIG1bMTBdID0gYXhpcy56ICogYXhpcy56ICogYzEgKyBjO1xuICAgICAgICBtWzExXSA9IDAuMDtcbiAgICAgICAgbVsxMl0gPSAwLjA7XG4gICAgICAgIG1bMTNdID0gMC4wO1xuICAgICAgICBtWzE0XSA9IDAuMDtcbiAgICAgICAgbVsxNV0gPSAxLjA7XG4gICAgICAgIF9tYXJrQXNVcGRhdGVkKHJlc3VsdCk7XG4gICAgfVxuICAgIE1hdHJpeC5yb3RhdGlvbkF4aXNUb1JlZiA9IHJvdGF0aW9uQXhpc1RvUmVmO1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSByb3RhdGlvbiBtYXRyaXhcbiAgICAgKiBAcGFyYW0geWF3IC0gZGVmaW5lcyB0aGUgeWF3IGFuZ2xlIGluIHJhZGlhbnMgKFkgYXhpcylcbiAgICAgKiBAcGFyYW0gcGl0Y2ggLSBkZWZpbmVzIHRoZSBwaXRjaCBhbmdsZSBpbiByYWRpYW5zIChYIGF4aXMpXG4gICAgICogQHBhcmFtIHJvbGwgLSBkZWZpbmVzIHRoZSByb2xsIGFuZ2xlIGluIHJhZGlhbnMgKFggYXhpcylcbiAgICAgKiBAcmV0dXJucyB0aGUgbmV3IHJvdGF0aW9uIG1hdHJpeFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJvdGF0aW9uWWF3UGl0Y2hSb2xsKHlhdywgcGl0Y2gsIHJvbGwpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gY3JlYXRlKCk7XG4gICAgICAgIHJvdGF0aW9uWWF3UGl0Y2hSb2xsVG9SZWYoeWF3LCBwaXRjaCwgcm9sbCwgcmVzdWx0KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgTWF0cml4LnJvdGF0aW9uWWF3UGl0Y2hSb2xsID0gcm90YXRpb25ZYXdQaXRjaFJvbGw7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHJvdGF0aW9uIG1hdHJpeCBhbmQgc3RvcmVzIGl0IGluIGEgZ2l2ZW4gbWF0cml4XG4gICAgICogQHBhcmFtIHlhdyAtIGRlZmluZXMgdGhlIHlhdyBhbmdsZSBpbiByYWRpYW5zIChZIGF4aXMpXG4gICAgICogQHBhcmFtIHBpdGNoIC0gZGVmaW5lcyB0aGUgcGl0Y2ggYW5nbGUgaW4gcmFkaWFucyAoWCBheGlzKVxuICAgICAqIEBwYXJhbSByb2xsIC0gZGVmaW5lcyB0aGUgcm9sbCBhbmdsZSBpbiByYWRpYW5zIChYIGF4aXMpXG4gICAgICogQHBhcmFtIHJlc3VsdCAtIGRlZmluZXMgdGhlIHRhcmdldCBtYXRyaXhcbiAgICAgKi9cbiAgICBmdW5jdGlvbiByb3RhdGlvbllhd1BpdGNoUm9sbFRvUmVmKHlhdywgcGl0Y2gsIHJvbGwsIHJlc3VsdCkge1xuICAgICAgICBjb25zdCBxdWF0ZXJuaW9uUmVzdWx0ID0gUXVhdGVybmlvbi5aZXJvKCk7XG4gICAgICAgIFF1YXRlcm5pb24uZnJvbVJvdGF0aW9uWWF3UGl0Y2hSb2xsVG9SZWYoeWF3LCBwaXRjaCwgcm9sbCwgcXVhdGVybmlvblJlc3VsdCk7XG4gICAgICAgIGZyb21RdWF0ZXJuaW9uVG9SZWYocXVhdGVybmlvblJlc3VsdCwgcmVzdWx0KTtcbiAgICB9XG4gICAgTWF0cml4LnJvdGF0aW9uWWF3UGl0Y2hSb2xsVG9SZWYgPSByb3RhdGlvbllhd1BpdGNoUm9sbFRvUmVmO1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzY2FsaW5nIG1hdHJpeFxuICAgICAqIEBwYXJhbSB4IC0gZGVmaW5lcyB0aGUgc2NhbGUgZmFjdG9yIG9uIFggYXhpc1xuICAgICAqIEBwYXJhbSB5IC0gZGVmaW5lcyB0aGUgc2NhbGUgZmFjdG9yIG9uIFkgYXhpc1xuICAgICAqIEBwYXJhbSB6IC0gZGVmaW5lcyB0aGUgc2NhbGUgZmFjdG9yIG9uIFogYXhpc1xuICAgICAqIEByZXR1cm5zIHRoZSBuZXcgbWF0cml4XG4gICAgICovXG4gICAgZnVuY3Rpb24gc2NhbGluZyh4LCB5LCB6KSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGNyZWF0ZSgpO1xuICAgICAgICBzY2FsaW5nVG9SZWYoeCwgeSwgeiwgcmVzdWx0KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgTWF0cml4LnNjYWxpbmcgPSBzY2FsaW5nO1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzY2FsaW5nIG1hdHJpeCBhbmQgc3RvcmVzIGl0IGluIGEgZ2l2ZW4gbWF0cml4XG4gICAgICogQHBhcmFtIHggLSBkZWZpbmVzIHRoZSBzY2FsZSBmYWN0b3Igb24gWCBheGlzXG4gICAgICogQHBhcmFtIHkgLSBkZWZpbmVzIHRoZSBzY2FsZSBmYWN0b3Igb24gWSBheGlzXG4gICAgICogQHBhcmFtIHogLSBkZWZpbmVzIHRoZSBzY2FsZSBmYWN0b3Igb24gWiBheGlzXG4gICAgICogQHBhcmFtIHJlc3VsdCAtIGRlZmluZXMgdGhlIHRhcmdldCBtYXRyaXhcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzY2FsaW5nVG9SZWYoeCwgeSwgeiwgcmVzdWx0KSB7XG4gICAgICAgIGZyb21WYWx1ZXNUb1JlZih4LCAwLjAsIDAuMCwgMC4wLCAwLjAsIHksIDAuMCwgMC4wLCAwLjAsIDAuMCwgeiwgMC4wLCAwLjAsIDAuMCwgMC4wLCAxLjAsIHJlc3VsdCk7XG4gICAgICAgIF91cGRhdGVJZGVudGl0eVN0YXR1cyhyZXN1bHQsIHggPT09IDEgJiYgeSA9PT0gMSAmJiB6ID09PSAxKTtcbiAgICB9XG4gICAgTWF0cml4LnNjYWxpbmdUb1JlZiA9IHNjYWxpbmdUb1JlZjtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgdHJhbnNsYXRpb24gbWF0cml4XG4gICAgICogQHBhcmFtIHggLSBkZWZpbmVzIHRoZSB0cmFuc2xhdGlvbiBvbiBYIGF4aXNcbiAgICAgKiBAcGFyYW0geSAtIGRlZmluZXMgdGhlIHRyYW5zbGF0aW9uIG9uIFkgYXhpc1xuICAgICAqIEBwYXJhbSB6IC0gZGVmaW5lcyB0aGUgdHJhbnNsYXRpb25vbiBaIGF4aXNcbiAgICAgKiBAcmV0dXJucyB0aGUgbmV3IG1hdHJpeFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRyYW5zbGF0aW9uKHgsIHksIHopIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gY3JlYXRlKCk7XG4gICAgICAgIHRyYW5zbGF0aW9uVG9SZWYoeCwgeSwgeiwgcmVzdWx0KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgTWF0cml4LnRyYW5zbGF0aW9uID0gdHJhbnNsYXRpb247XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHRyYW5zbGF0aW9uIG1hdHJpeCBhbmQgc3RvcmVzIGl0IGluIGEgZ2l2ZW4gbWF0cml4XG4gICAgICogQHBhcmFtIHggLSBkZWZpbmVzIHRoZSB0cmFuc2xhdGlvbiBvbiBYIGF4aXNcbiAgICAgKiBAcGFyYW0geSAtIGRlZmluZXMgdGhlIHRyYW5zbGF0aW9uIG9uIFkgYXhpc1xuICAgICAqIEBwYXJhbSB6IC0gZGVmaW5lcyB0aGUgdHJhbnNsYXRpb25vbiBaIGF4aXNcbiAgICAgKiBAcGFyYW0gcmVzdWx0IC0gZGVmaW5lcyB0aGUgdGFyZ2V0IG1hdHJpeFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRyYW5zbGF0aW9uVG9SZWYoeCwgeSwgeiwgcmVzdWx0KSB7XG4gICAgICAgIGZyb21WYWx1ZXNUb1JlZigxLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMS4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDEuMCwgMC4wLCB4LCB5LCB6LCAxLjAsIHJlc3VsdCk7XG4gICAgICAgIF91cGRhdGVJZGVudGl0eVN0YXR1cyhyZXN1bHQsIHggPT09IDAgJiYgeSA9PT0gMCAmJiB6ID09PSAwKTtcbiAgICB9XG4gICAgTWF0cml4LnRyYW5zbGF0aW9uVG9SZWYgPSB0cmFuc2xhdGlvblRvUmVmO1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBuZXcgTWF0cml4IHdob3NlIHZhbHVlcyBhcmUgdGhlIGludGVycG9sYXRlZCB2YWx1ZXMgZm9yIFwiZ3JhZGllbnRcIiAoZmxvYXQpIGJldHdlZW4gdGhlIG9uZXMgb2YgdGhlIG1hdHJpY2VzIFwic3RhcnRWYWx1ZVwiIGFuZCBcImVuZFZhbHVlXCIuXG4gICAgICogQHBhcmFtIHN0YXJ0VmFsdWUgLSBkZWZpbmVzIHRoZSBzdGFydCB2YWx1ZVxuICAgICAqIEBwYXJhbSBlbmRWYWx1ZSAtIGRlZmluZXMgdGhlIGVuZCB2YWx1ZVxuICAgICAqIEBwYXJhbSBncmFkaWVudCAtIGRlZmluZXMgdGhlIGdyYWRpZW50IGZhY3RvclxuICAgICAqIEByZXR1cm5zIHRoZSBuZXcgbWF0cml4XG4gICAgICovXG4gICAgZnVuY3Rpb24gbGVycChzdGFydFZhbHVlLCBlbmRWYWx1ZSwgZ3JhZGllbnQpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gY3JlYXRlKCk7XG4gICAgICAgIGxlcnBUb1JlZihzdGFydFZhbHVlLCBlbmRWYWx1ZSwgZ3JhZGllbnQsIHJlc3VsdCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIE1hdHJpeC5sZXJwID0gbGVycDtcbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGdpdmVuIG1hdHJpeCBcInJlc3VsdFwiIGFzIHRoZSBpbnRlcnBvbGF0ZWQgdmFsdWVzIGZvciBcImdyYWRpZW50XCIgKGZsb2F0KSBiZXR3ZWVuIHRoZSBvbmVzIG9mIHRoZSBtYXRyaWNlcyBcInN0YXJ0VmFsdWVcIiBhbmQgXCJlbmRWYWx1ZVwiLlxuICAgICAqIEBwYXJhbSBzdGFydFZhbHVlIC0gZGVmaW5lcyB0aGUgc3RhcnQgdmFsdWVcbiAgICAgKiBAcGFyYW0gZW5kVmFsdWUgLSBkZWZpbmVzIHRoZSBlbmQgdmFsdWVcbiAgICAgKiBAcGFyYW0gZ3JhZGllbnQgLSBkZWZpbmVzIHRoZSBncmFkaWVudCBmYWN0b3JcbiAgICAgKiBAcGFyYW0gcmVzdWx0IC0gZGVmaW5lcyB0aGUgTWF0cml4IG9iamVjdCB3aGVyZSB0byBzdG9yZSBkYXRhXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGVycFRvUmVmKHN0YXJ0VmFsdWUsIGVuZFZhbHVlLCBncmFkaWVudCwgcmVzdWx0KSB7XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCAxNjsgaW5kZXgrKykge1xuICAgICAgICAgICAgcmVzdWx0Ll9tW2luZGV4XSA9XG4gICAgICAgICAgICAgICAgc3RhcnRWYWx1ZS5fbVtpbmRleF0gKiAoMS4wIC0gZ3JhZGllbnQpICsgZW5kVmFsdWUuX21baW5kZXhdICogZ3JhZGllbnQ7XG4gICAgICAgIH1cbiAgICAgICAgX21hcmtBc1VwZGF0ZWQocmVzdWx0KTtcbiAgICB9XG4gICAgTWF0cml4LmxlcnBUb1JlZiA9IGxlcnBUb1JlZjtcbiAgICAvKipcbiAgICAgKiBCdWlsZHMgYSBuZXcgbWF0cml4IHdob3NlIHZhbHVlcyBhcmUgY29tcHV0ZWQgYnk6XG4gICAgICogKiBkZWNvbXBvc2luZyB0aGUgdGhlIFwic3RhcnRWYWx1ZVwiIGFuZCBcImVuZFZhbHVlXCIgbWF0cmljZXMgaW50byB0aGVpciByZXNwZWN0aXZlIHNjYWxlLCByb3RhdGlvbiBhbmQgdHJhbnNsYXRpb24gbWF0cmljZXNcbiAgICAgKiAqIGludGVycG9sYXRpbmcgZm9yIFwiZ3JhZGllbnRcIiAoZmxvYXQpIHRoZSB2YWx1ZXMgYmV0d2VlbiBlYWNoIG9mIHRoZXNlIGRlY29tcG9zZWQgbWF0cmljZXMgYmV0d2VlbiB0aGUgc3RhcnQgYW5kIHRoZSBlbmRcbiAgICAgKiAqIHJlY29tcG9zaW5nIGEgbmV3IG1hdHJpeCBmcm9tIHRoZXNlIDMgaW50ZXJwb2xhdGVkIHNjYWxlLCByb3RhdGlvbiBhbmQgdHJhbnNsYXRpb24gbWF0cmljZXNcbiAgICAgKiBAcGFyYW0gc3RhcnRWYWx1ZSAtIGRlZmluZXMgdGhlIGZpcnN0IG1hdHJpeFxuICAgICAqIEBwYXJhbSBlbmRWYWx1ZSAtIGRlZmluZXMgdGhlIHNlY29uZCBtYXRyaXhcbiAgICAgKiBAcGFyYW0gZ3JhZGllbnQgLSBkZWZpbmVzIHRoZSBncmFkaWVudCBiZXR3ZWVuIHRoZSB0d28gbWF0cmljZXNcbiAgICAgKiBAcmV0dXJucyB0aGUgbmV3IG1hdHJpeFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGRlY29tcG9zZUxlcnAoc3RhcnRWYWx1ZSwgZW5kVmFsdWUsIGdyYWRpZW50KSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGNyZWF0ZSgpO1xuICAgICAgICBkZWNvbXBvc2VMZXJwVG9SZWYoc3RhcnRWYWx1ZSwgZW5kVmFsdWUsIGdyYWRpZW50LCByZXN1bHQpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBNYXRyaXguZGVjb21wb3NlTGVycCA9IGRlY29tcG9zZUxlcnA7XG4gICAgLyoqXG4gICAgICogVXBkYXRlIGEgbWF0cml4IHRvIHZhbHVlcyB3aGljaCBhcmUgY29tcHV0ZWQgYnk6XG4gICAgICogKiBkZWNvbXBvc2luZyB0aGUgdGhlIFwic3RhcnRWYWx1ZVwiIGFuZCBcImVuZFZhbHVlXCIgbWF0cmljZXMgaW50byB0aGVpciByZXNwZWN0aXZlIHNjYWxlLCByb3RhdGlvbiBhbmQgdHJhbnNsYXRpb24gbWF0cmljZXNcbiAgICAgKiAqIGludGVycG9sYXRpbmcgZm9yIFwiZ3JhZGllbnRcIiAoZmxvYXQpIHRoZSB2YWx1ZXMgYmV0d2VlbiBlYWNoIG9mIHRoZXNlIGRlY29tcG9zZWQgbWF0cmljZXMgYmV0d2VlbiB0aGUgc3RhcnQgYW5kIHRoZSBlbmRcbiAgICAgKiAqIHJlY29tcG9zaW5nIGEgbmV3IG1hdHJpeCBmcm9tIHRoZXNlIDMgaW50ZXJwb2xhdGVkIHNjYWxlLCByb3RhdGlvbiBhbmQgdHJhbnNsYXRpb24gbWF0cmljZXNcbiAgICAgKiBAcGFyYW0gc3RhcnRWYWx1ZSAtIGRlZmluZXMgdGhlIGZpcnN0IG1hdHJpeFxuICAgICAqIEBwYXJhbSBlbmRWYWx1ZSAtIGRlZmluZXMgdGhlIHNlY29uZCBtYXRyaXhcbiAgICAgKiBAcGFyYW0gZ3JhZGllbnQgLSBkZWZpbmVzIHRoZSBncmFkaWVudCBiZXR3ZWVuIHRoZSB0d28gbWF0cmljZXNcbiAgICAgKiBAcGFyYW0gcmVzdWx0IC0gZGVmaW5lcyB0aGUgdGFyZ2V0IG1hdHJpeFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGRlY29tcG9zZUxlcnBUb1JlZihzdGFydFZhbHVlLCBlbmRWYWx1ZSwgZ3JhZGllbnQsIHJlc3VsdCkge1xuICAgICAgICBjb25zdCBzdGFydFNjYWxlID0gVmVjdG9yMy5aZXJvKCk7XG4gICAgICAgIGNvbnN0IHN0YXJ0Um90YXRpb24gPSBRdWF0ZXJuaW9uLlplcm8oKTtcbiAgICAgICAgY29uc3Qgc3RhcnRUcmFuc2xhdGlvbiA9IFZlY3RvcjMuWmVybygpO1xuICAgICAgICBkZWNvbXBvc2Uoc3RhcnRWYWx1ZSwgc3RhcnRTY2FsZSwgc3RhcnRSb3RhdGlvbiwgc3RhcnRUcmFuc2xhdGlvbik7XG4gICAgICAgIGNvbnN0IGVuZFNjYWxlID0gVmVjdG9yMy5aZXJvKCk7XG4gICAgICAgIGNvbnN0IGVuZFJvdGF0aW9uID0gUXVhdGVybmlvbi5aZXJvKCk7XG4gICAgICAgIGNvbnN0IGVuZFRyYW5zbGF0aW9uID0gVmVjdG9yMy5aZXJvKCk7XG4gICAgICAgIGRlY29tcG9zZShlbmRWYWx1ZSwgZW5kU2NhbGUsIGVuZFJvdGF0aW9uLCBlbmRUcmFuc2xhdGlvbik7XG4gICAgICAgIGNvbnN0IHJlc3VsdFNjYWxlID0gVmVjdG9yMy5aZXJvKCk7XG4gICAgICAgIFZlY3RvcjMubGVycFRvUmVmKHN0YXJ0U2NhbGUsIGVuZFNjYWxlLCBncmFkaWVudCwgcmVzdWx0U2NhbGUpO1xuICAgICAgICBjb25zdCByZXN1bHRSb3RhdGlvbiA9IFF1YXRlcm5pb24uWmVybygpO1xuICAgICAgICBRdWF0ZXJuaW9uLnNsZXJwVG9SZWYoc3RhcnRSb3RhdGlvbiwgZW5kUm90YXRpb24sIGdyYWRpZW50LCByZXN1bHRSb3RhdGlvbik7XG4gICAgICAgIGNvbnN0IHJlc3VsdFRyYW5zbGF0aW9uID0gVmVjdG9yMy5aZXJvKCk7XG4gICAgICAgIFZlY3RvcjMubGVycFRvUmVmKHN0YXJ0VHJhbnNsYXRpb24sIGVuZFRyYW5zbGF0aW9uLCBncmFkaWVudCwgcmVzdWx0VHJhbnNsYXRpb24pO1xuICAgICAgICBjb21wb3NlVG9SZWYocmVzdWx0U2NhbGUsIHJlc3VsdFJvdGF0aW9uLCByZXN1bHRUcmFuc2xhdGlvbiwgcmVzdWx0KTtcbiAgICB9XG4gICAgTWF0cml4LmRlY29tcG9zZUxlcnBUb1JlZiA9IGRlY29tcG9zZUxlcnBUb1JlZjtcbiAgICAvKipcbiAgICAgKiBHZXRzIGEgbmV3IHJvdGF0aW9uIG1hdHJpeCB1c2VkIHRvIHJvdGF0ZSBhbiBlbnRpdHkgc28gYXMgaXQgbG9va3MgYXQgdGhlIHRhcmdldCB2ZWN0b3IzLCBmcm9tIHRoZSBleWUgdmVjdG9yMyBwb3NpdGlvbiwgdGhlIHVwIHZlY3RvcjMgYmVpbmcgb3JpZW50ZWQgbGlrZSBcInVwXCJcbiAgICAgKiBzZWxmIGZ1bmN0aW9uIHdvcmtzIGluIGxlZnQgaGFuZGVkIG1vZGVcbiAgICAgKiBAcGFyYW0gZXllIC0gZGVmaW5lcyB0aGUgZmluYWwgcG9zaXRpb24gb2YgdGhlIGVudGl0eVxuICAgICAqIEBwYXJhbSB0YXJnZXQgLSBkZWZpbmVzIHdoZXJlIHRoZSBlbnRpdHkgc2hvdWxkIGxvb2sgYXRcbiAgICAgKiBAcGFyYW0gdXAgLSBkZWZpbmVzIHRoZSB1cCB2ZWN0b3IgZm9yIHRoZSBlbnRpdHlcbiAgICAgKiBAcmV0dXJucyB0aGUgbmV3IG1hdHJpeFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIExvb2tBdExIKGV5ZSwgdGFyZ2V0LCB1cCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBjcmVhdGUoKTtcbiAgICAgICAgbG9va0F0TEhUb1JlZihleWUsIHRhcmdldCwgdXAsIHJlc3VsdCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIE1hdHJpeC5Mb29rQXRMSCA9IExvb2tBdExIO1xuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGdpdmVuIFwicmVzdWx0XCIgTWF0cml4IHRvIGEgcm90YXRpb24gbWF0cml4IHVzZWQgdG8gcm90YXRlIGFuIGVudGl0eSBzbyB0aGF0IGl0IGxvb2tzIGF0IHRoZSB0YXJnZXQgdmVjdG9yMywgZnJvbSB0aGUgZXllIHZlY3RvcjMgcG9zaXRpb24sIHRoZSB1cCB2ZWN0b3IzIGJlaW5nIG9yaWVudGVkIGxpa2UgXCJ1cFwiLlxuICAgICAqIHNlbGYgZnVuY3Rpb24gd29ya3MgaW4gbGVmdCBoYW5kZWQgbW9kZVxuICAgICAqIEBwYXJhbSBleWUgLSBkZWZpbmVzIHRoZSBmaW5hbCBwb3NpdGlvbiBvZiB0aGUgZW50aXR5XG4gICAgICogQHBhcmFtIHRhcmdldCAtIGRlZmluZXMgd2hlcmUgdGhlIGVudGl0eSBzaG91bGQgbG9vayBhdFxuICAgICAqIEBwYXJhbSB1cCAtIGRlZmluZXMgdGhlIHVwIHZlY3RvciBmb3IgdGhlIGVudGl0eVxuICAgICAqIEBwYXJhbSByZXN1bHQgLSBkZWZpbmVzIHRoZSB0YXJnZXQgbWF0cml4XG4gICAgICovXG4gICAgZnVuY3Rpb24gbG9va0F0TEhUb1JlZihleWUsIHRhcmdldCwgdXAsIHJlc3VsdCkge1xuICAgICAgICBjb25zdCB4QXhpcyA9IFZlY3RvcjMuWmVybygpO1xuICAgICAgICBjb25zdCB5QXhpcyA9IFZlY3RvcjMuWmVybygpO1xuICAgICAgICBjb25zdCB6QXhpcyA9IFZlY3RvcjMuWmVybygpO1xuICAgICAgICAvLyBaIGF4aXNcbiAgICAgICAgVmVjdG9yMy5zdWJ0cmFjdFRvUmVmKHRhcmdldCwgZXllLCB6QXhpcyk7XG4gICAgICAgIFZlY3RvcjMubm9ybWFsaXplVG9SZWYoekF4aXMsIHpBeGlzKTtcbiAgICAgICAgLy8gWCBheGlzXG4gICAgICAgIFZlY3RvcjMuY3Jvc3NUb1JlZih1cCwgekF4aXMsIHhBeGlzKTtcbiAgICAgICAgY29uc3QgeFNxdWFyZUxlbmd0aCA9IFZlY3RvcjMubGVuZ3RoU3F1YXJlZCh4QXhpcyk7XG4gICAgICAgIGlmICh4U3F1YXJlTGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB4QXhpcy54ID0gMS4wO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgVmVjdG9yMy5ub3JtYWxpemVGcm9tTGVuZ3RoVG9SZWYoeEF4aXMsIE1hdGguc3FydCh4U3F1YXJlTGVuZ3RoKSwgeEF4aXMpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFkgYXhpc1xuICAgICAgICBWZWN0b3IzLmNyb3NzVG9SZWYoekF4aXMsIHhBeGlzLCB5QXhpcyk7XG4gICAgICAgIFZlY3RvcjMubm9ybWFsaXplVG9SZWYoeUF4aXMsIHlBeGlzKTtcbiAgICAgICAgLy8gRXllIGFuZ2xlc1xuICAgICAgICBjb25zdCBleCA9IC1WZWN0b3IzLmRvdCh4QXhpcywgZXllKTtcbiAgICAgICAgY29uc3QgZXkgPSAtVmVjdG9yMy5kb3QoeUF4aXMsIGV5ZSk7XG4gICAgICAgIGNvbnN0IGV6ID0gLVZlY3RvcjMuZG90KHpBeGlzLCBleWUpO1xuICAgICAgICBmcm9tVmFsdWVzVG9SZWYoeEF4aXMueCwgeUF4aXMueCwgekF4aXMueCwgMC4wLCB4QXhpcy55LCB5QXhpcy55LCB6QXhpcy55LCAwLjAsIHhBeGlzLnosIHlBeGlzLnosIHpBeGlzLnosIDAuMCwgZXgsIGV5LCBleiwgMS4wLCByZXN1bHQpO1xuICAgIH1cbiAgICBNYXRyaXgubG9va0F0TEhUb1JlZiA9IGxvb2tBdExIVG9SZWY7XG4gICAgLyoqXG4gICAgICogR2V0cyBhIG5ldyByb3RhdGlvbiBtYXRyaXggdXNlZCB0byByb3RhdGUgYW4gZW50aXR5IHNvIGFzIGl0IGxvb2tzIGF0IHRoZSB0YXJnZXQgdmVjdG9yMywgZnJvbSB0aGUgZXllIHZlY3RvcjMgcG9zaXRpb24sIHRoZSB1cCB2ZWN0b3IzIGJlaW5nIG9yaWVudGVkIGxpa2UgXCJ1cFwiXG4gICAgICogc2VsZiBmdW5jdGlvbiB3b3JrcyBpbiByaWdodCBoYW5kZWQgbW9kZVxuICAgICAqIEBwYXJhbSBleWUgLSBkZWZpbmVzIHRoZSBmaW5hbCBwb3NpdGlvbiBvZiB0aGUgZW50aXR5XG4gICAgICogQHBhcmFtIHRhcmdldCAtIGRlZmluZXMgd2hlcmUgdGhlIGVudGl0eSBzaG91bGQgbG9vayBhdFxuICAgICAqIEBwYXJhbSB1cCAtIGRlZmluZXMgdGhlIHVwIHZlY3RvciBmb3IgdGhlIGVudGl0eVxuICAgICAqIEByZXR1cm5zIHRoZSBuZXcgbWF0cml4XG4gICAgICovXG4gICAgZnVuY3Rpb24gbG9va0F0UkgoZXllLCB0YXJnZXQsIHVwKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGNyZWF0ZSgpO1xuICAgICAgICBsb29rQXRSSFRvUmVmKGV5ZSwgdGFyZ2V0LCB1cCwgcmVzdWx0KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgTWF0cml4Lmxvb2tBdFJIID0gbG9va0F0Ukg7XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgZ2l2ZW4gXCJyZXN1bHRcIiBNYXRyaXggdG8gYSByb3RhdGlvbiBtYXRyaXggdXNlZCB0byByb3RhdGUgYW4gZW50aXR5IHNvIHRoYXQgaXQgbG9va3MgYXQgdGhlIHRhcmdldCB2ZWN0b3IzLCBmcm9tIHRoZSBleWUgdmVjdG9yMyBwb3NpdGlvbiwgdGhlIHVwIHZlY3RvcjMgYmVpbmcgb3JpZW50ZWQgbGlrZSBcInVwXCIuXG4gICAgICogc2VsZiBmdW5jdGlvbiB3b3JrcyBpbiByaWdodCBoYW5kZWQgbW9kZVxuICAgICAqIEBwYXJhbSBleWUgLSBkZWZpbmVzIHRoZSBmaW5hbCBwb3NpdGlvbiBvZiB0aGUgZW50aXR5XG4gICAgICogQHBhcmFtIHRhcmdldCAtIGRlZmluZXMgd2hlcmUgdGhlIGVudGl0eSBzaG91bGQgbG9vayBhdFxuICAgICAqIEBwYXJhbSB1cCAtIGRlZmluZXMgdGhlIHVwIHZlY3RvciBmb3IgdGhlIGVudGl0eVxuICAgICAqIEBwYXJhbSByZXN1bHQgLSBkZWZpbmVzIHRoZSB0YXJnZXQgbWF0cml4XG4gICAgICovXG4gICAgZnVuY3Rpb24gbG9va0F0UkhUb1JlZihleWUsIHRhcmdldCwgdXAsIHJlc3VsdCkge1xuICAgICAgICBjb25zdCB4QXhpcyA9IFZlY3RvcjMuWmVybygpO1xuICAgICAgICBjb25zdCB5QXhpcyA9IFZlY3RvcjMuWmVybygpO1xuICAgICAgICBjb25zdCB6QXhpcyA9IFZlY3RvcjMuWmVybygpO1xuICAgICAgICAvLyBaIGF4aXNcbiAgICAgICAgVmVjdG9yMy5zdWJ0cmFjdFRvUmVmKGV5ZSwgdGFyZ2V0LCB6QXhpcyk7XG4gICAgICAgIFZlY3RvcjMubm9ybWFsaXplVG9SZWYoekF4aXMsIHpBeGlzKTtcbiAgICAgICAgLy8gWCBheGlzXG4gICAgICAgIFZlY3RvcjMuY3Jvc3NUb1JlZih1cCwgekF4aXMsIHhBeGlzKTtcbiAgICAgICAgY29uc3QgeFNxdWFyZUxlbmd0aCA9IFZlY3RvcjMubGVuZ3RoU3F1YXJlZCh4QXhpcyk7XG4gICAgICAgIGlmICh4U3F1YXJlTGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB4QXhpcy54ID0gMS4wO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgVmVjdG9yMy5ub3JtYWxpemVGcm9tTGVuZ3RoVG9SZWYoeEF4aXMsIE1hdGguc3FydCh4U3F1YXJlTGVuZ3RoKSwgeEF4aXMpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFkgYXhpc1xuICAgICAgICBWZWN0b3IzLmNyb3NzVG9SZWYoekF4aXMsIHhBeGlzLCB5QXhpcyk7XG4gICAgICAgIFZlY3RvcjMubm9ybWFsaXplVG9SZWYoeUF4aXMsIHlBeGlzKTtcbiAgICAgICAgLy8gRXllIGFuZ2xlc1xuICAgICAgICBjb25zdCBleCA9IC1WZWN0b3IzLmRvdCh4QXhpcywgZXllKTtcbiAgICAgICAgY29uc3QgZXkgPSAtVmVjdG9yMy5kb3QoeUF4aXMsIGV5ZSk7XG4gICAgICAgIGNvbnN0IGV6ID0gLVZlY3RvcjMuZG90KHpBeGlzLCBleWUpO1xuICAgICAgICBmcm9tVmFsdWVzVG9SZWYoeEF4aXMueCwgeUF4aXMueCwgekF4aXMueCwgMC4wLCB4QXhpcy55LCB5QXhpcy55LCB6QXhpcy55LCAwLjAsIHhBeGlzLnosIHlBeGlzLnosIHpBeGlzLnosIDAuMCwgZXgsIGV5LCBleiwgMS4wLCByZXN1bHQpO1xuICAgIH1cbiAgICBNYXRyaXgubG9va0F0UkhUb1JlZiA9IGxvb2tBdFJIVG9SZWY7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbGVmdC1oYW5kZWQgb3J0aG9ncmFwaGljIHByb2plY3Rpb24gbWF0cml4XG4gICAgICogQHBhcmFtIHdpZHRoIC0gZGVmaW5lcyB0aGUgdmlld3BvcnQgd2lkdGhcbiAgICAgKiBAcGFyYW0gaGVpZ2h0IC0gZGVmaW5lcyB0aGUgdmlld3BvcnQgaGVpZ2h0XG4gICAgICogQHBhcmFtIHpuZWFyIC0gZGVmaW5lcyB0aGUgbmVhciBjbGlwIHBsYW5lXG4gICAgICogQHBhcmFtIHpmYXIgLSBkZWZpbmVzIHRoZSBmYXIgY2xpcCBwbGFuZVxuICAgICAqIEByZXR1cm5zIGEgbmV3IG1hdHJpeCBhcyBhIGxlZnQtaGFuZGVkIG9ydGhvZ3JhcGhpYyBwcm9qZWN0aW9uIG1hdHJpeFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG9ydGhvTEgod2lkdGgsIGhlaWdodCwgem5lYXIsIHpmYXIpIHtcbiAgICAgICAgY29uc3QgbWF0cml4ID0gY3JlYXRlKCk7XG4gICAgICAgIG9ydGhvTEhUb1JlZih3aWR0aCwgaGVpZ2h0LCB6bmVhciwgemZhciwgbWF0cml4KTtcbiAgICAgICAgcmV0dXJuIG1hdHJpeDtcbiAgICB9XG4gICAgTWF0cml4Lm9ydGhvTEggPSBvcnRob0xIO1xuICAgIC8qKlxuICAgICAqIFN0b3JlIGEgbGVmdC1oYW5kZWQgb3J0aG9ncmFwaGljIHByb2plY3Rpb24gdG8gYSBnaXZlbiBtYXRyaXhcbiAgICAgKiBAcGFyYW0gd2lkdGggLSBkZWZpbmVzIHRoZSB2aWV3cG9ydCB3aWR0aFxuICAgICAqIEBwYXJhbSBoZWlnaHQgLSBkZWZpbmVzIHRoZSB2aWV3cG9ydCBoZWlnaHRcbiAgICAgKiBAcGFyYW0gem5lYXIgLSBkZWZpbmVzIHRoZSBuZWFyIGNsaXAgcGxhbmVcbiAgICAgKiBAcGFyYW0gemZhciAtIGRlZmluZXMgdGhlIGZhciBjbGlwIHBsYW5lXG4gICAgICogQHBhcmFtIHJlc3VsdCAtIGRlZmluZXMgdGhlIHRhcmdldCBtYXRyaXhcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBvcnRob0xIVG9SZWYod2lkdGgsIGhlaWdodCwgem5lYXIsIHpmYXIsIHJlc3VsdCkge1xuICAgICAgICBjb25zdCBuID0gem5lYXI7XG4gICAgICAgIGNvbnN0IGYgPSB6ZmFyO1xuICAgICAgICBjb25zdCBhID0gMi4wIC8gd2lkdGg7XG4gICAgICAgIGNvbnN0IGIgPSAyLjAgLyBoZWlnaHQ7XG4gICAgICAgIGNvbnN0IGMgPSAyLjAgLyAoZiAtIG4pO1xuICAgICAgICBjb25zdCBkID0gLShmICsgbikgLyAoZiAtIG4pO1xuICAgICAgICBmcm9tVmFsdWVzVG9SZWYoYSwgMC4wLCAwLjAsIDAuMCwgMC4wLCBiLCAwLjAsIDAuMCwgMC4wLCAwLjAsIGMsIDAuMCwgMC4wLCAwLjAsIGQsIDEuMCwgcmVzdWx0KTtcbiAgICAgICAgX3VwZGF0ZUlkZW50aXR5U3RhdHVzKHJlc3VsdCwgYSA9PT0gMSAmJiBiID09PSAxICYmIGMgPT09IDEgJiYgZCA9PT0gMCk7XG4gICAgfVxuICAgIE1hdHJpeC5vcnRob0xIVG9SZWYgPSBvcnRob0xIVG9SZWY7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbGVmdC1oYW5kZWQgb3J0aG9ncmFwaGljIHByb2plY3Rpb24gbWF0cml4XG4gICAgICogQHBhcmFtIGxlZnQgLSBkZWZpbmVzIHRoZSB2aWV3cG9ydCBsZWZ0IGNvb3JkaW5hdGVcbiAgICAgKiBAcGFyYW0gcmlnaHQgLSBkZWZpbmVzIHRoZSB2aWV3cG9ydCByaWdodCBjb29yZGluYXRlXG4gICAgICogQHBhcmFtIGJvdHRvbSAtIGRlZmluZXMgdGhlIHZpZXdwb3J0IGJvdHRvbSBjb29yZGluYXRlXG4gICAgICogQHBhcmFtIHRvcCAtIGRlZmluZXMgdGhlIHZpZXdwb3J0IHRvcCBjb29yZGluYXRlXG4gICAgICogQHBhcmFtIHpuZWFyIC0gZGVmaW5lcyB0aGUgbmVhciBjbGlwIHBsYW5lXG4gICAgICogQHBhcmFtIHpmYXIgLSBkZWZpbmVzIHRoZSBmYXIgY2xpcCBwbGFuZVxuICAgICAqIEByZXR1cm5zIGEgbmV3IG1hdHJpeCBhcyBhIGxlZnQtaGFuZGVkIG9ydGhvZ3JhcGhpYyBwcm9qZWN0aW9uIG1hdHJpeFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIE9ydGhvT2ZmQ2VudGVyTEgobGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCB6bmVhciwgemZhcikge1xuICAgICAgICBjb25zdCBtYXRyaXggPSBjcmVhdGUoKTtcbiAgICAgICAgb3J0aG9PZmZDZW50ZXJMSFRvUmVmKGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgem5lYXIsIHpmYXIsIG1hdHJpeCk7XG4gICAgICAgIHJldHVybiBtYXRyaXg7XG4gICAgfVxuICAgIE1hdHJpeC5PcnRob09mZkNlbnRlckxIID0gT3J0aG9PZmZDZW50ZXJMSDtcbiAgICAvKipcbiAgICAgKiBTdG9yZXMgYSBsZWZ0LWhhbmRlZCBvcnRob2dyYXBoaWMgcHJvamVjdGlvbiBpbnRvIGEgZ2l2ZW4gbWF0cml4XG4gICAgICogQHBhcmFtIGxlZnQgLSBkZWZpbmVzIHRoZSB2aWV3cG9ydCBsZWZ0IGNvb3JkaW5hdGVcbiAgICAgKiBAcGFyYW0gcmlnaHQgLSBkZWZpbmVzIHRoZSB2aWV3cG9ydCByaWdodCBjb29yZGluYXRlXG4gICAgICogQHBhcmFtIGJvdHRvbSAtIGRlZmluZXMgdGhlIHZpZXdwb3J0IGJvdHRvbSBjb29yZGluYXRlXG4gICAgICogQHBhcmFtIHRvcCAtIGRlZmluZXMgdGhlIHZpZXdwb3J0IHRvcCBjb29yZGluYXRlXG4gICAgICogQHBhcmFtIHpuZWFyIC0gZGVmaW5lcyB0aGUgbmVhciBjbGlwIHBsYW5lXG4gICAgICogQHBhcmFtIHpmYXIgLSBkZWZpbmVzIHRoZSBmYXIgY2xpcCBwbGFuZVxuICAgICAqIEBwYXJhbSByZXN1bHQgLSBkZWZpbmVzIHRoZSB0YXJnZXQgbWF0cml4XG4gICAgICovXG4gICAgZnVuY3Rpb24gb3J0aG9PZmZDZW50ZXJMSFRvUmVmKGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgem5lYXIsIHpmYXIsIHJlc3VsdCkge1xuICAgICAgICBjb25zdCBuID0gem5lYXI7XG4gICAgICAgIGNvbnN0IGYgPSB6ZmFyO1xuICAgICAgICBjb25zdCBhID0gMi4wIC8gKHJpZ2h0IC0gbGVmdCk7XG4gICAgICAgIGNvbnN0IGIgPSAyLjAgLyAodG9wIC0gYm90dG9tKTtcbiAgICAgICAgY29uc3QgYyA9IDIuMCAvIChmIC0gbik7XG4gICAgICAgIGNvbnN0IGQgPSAtKGYgKyBuKSAvIChmIC0gbik7XG4gICAgICAgIGNvbnN0IGkwID0gKGxlZnQgKyByaWdodCkgLyAobGVmdCAtIHJpZ2h0KTtcbiAgICAgICAgY29uc3QgaTEgPSAodG9wICsgYm90dG9tKSAvIChib3R0b20gLSB0b3ApO1xuICAgICAgICBmcm9tVmFsdWVzVG9SZWYoYSwgMC4wLCAwLjAsIDAuMCwgMC4wLCBiLCAwLjAsIDAuMCwgMC4wLCAwLjAsIGMsIDAuMCwgaTAsIGkxLCBkLCAxLjAsIHJlc3VsdCk7XG4gICAgICAgIF9tYXJrQXNVcGRhdGVkKHJlc3VsdCk7XG4gICAgfVxuICAgIE1hdHJpeC5vcnRob09mZkNlbnRlckxIVG9SZWYgPSBvcnRob09mZkNlbnRlckxIVG9SZWY7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHJpZ2h0LWhhbmRlZCBvcnRob2dyYXBoaWMgcHJvamVjdGlvbiBtYXRyaXhcbiAgICAgKiBAcGFyYW0gbGVmdCAtIGRlZmluZXMgdGhlIHZpZXdwb3J0IGxlZnQgY29vcmRpbmF0ZVxuICAgICAqIEBwYXJhbSByaWdodCAtIGRlZmluZXMgdGhlIHZpZXdwb3J0IHJpZ2h0IGNvb3JkaW5hdGVcbiAgICAgKiBAcGFyYW0gYm90dG9tIC0gZGVmaW5lcyB0aGUgdmlld3BvcnQgYm90dG9tIGNvb3JkaW5hdGVcbiAgICAgKiBAcGFyYW0gdG9wIC0gZGVmaW5lcyB0aGUgdmlld3BvcnQgdG9wIGNvb3JkaW5hdGVcbiAgICAgKiBAcGFyYW0gem5lYXIgLSBkZWZpbmVzIHRoZSBuZWFyIGNsaXAgcGxhbmVcbiAgICAgKiBAcGFyYW0gemZhciAtIGRlZmluZXMgdGhlIGZhciBjbGlwIHBsYW5lXG4gICAgICogQHJldHVybnMgYSBuZXcgbWF0cml4IGFzIGEgcmlnaHQtaGFuZGVkIG9ydGhvZ3JhcGhpYyBwcm9qZWN0aW9uIG1hdHJpeFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG9ydGhvT2ZmQ2VudGVyUkgobGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCB6bmVhciwgemZhcikge1xuICAgICAgICBjb25zdCBtYXRyaXggPSBjcmVhdGUoKTtcbiAgICAgICAgb3J0aG9PZmZDZW50ZXJSSFRvUmVmKGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgem5lYXIsIHpmYXIsIG1hdHJpeCk7XG4gICAgICAgIHJldHVybiBtYXRyaXg7XG4gICAgfVxuICAgIE1hdHJpeC5vcnRob09mZkNlbnRlclJIID0gb3J0aG9PZmZDZW50ZXJSSDtcbiAgICAvKipcbiAgICAgKiBTdG9yZXMgYSByaWdodC1oYW5kZWQgb3J0aG9ncmFwaGljIHByb2plY3Rpb24gaW50byBhIGdpdmVuIG1hdHJpeFxuICAgICAqIEBwYXJhbSBsZWZ0IC0gZGVmaW5lcyB0aGUgdmlld3BvcnQgbGVmdCBjb29yZGluYXRlXG4gICAgICogQHBhcmFtIHJpZ2h0IC0gZGVmaW5lcyB0aGUgdmlld3BvcnQgcmlnaHQgY29vcmRpbmF0ZVxuICAgICAqIEBwYXJhbSBib3R0b20gLSBkZWZpbmVzIHRoZSB2aWV3cG9ydCBib3R0b20gY29vcmRpbmF0ZVxuICAgICAqIEBwYXJhbSB0b3AgLSBkZWZpbmVzIHRoZSB2aWV3cG9ydCB0b3AgY29vcmRpbmF0ZVxuICAgICAqIEBwYXJhbSB6bmVhciAtIGRlZmluZXMgdGhlIG5lYXIgY2xpcCBwbGFuZVxuICAgICAqIEBwYXJhbSB6ZmFyIC0gZGVmaW5lcyB0aGUgZmFyIGNsaXAgcGxhbmVcbiAgICAgKiBAcGFyYW0gcmVzdWx0IC0gZGVmaW5lcyB0aGUgdGFyZ2V0IG1hdHJpeFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG9ydGhvT2ZmQ2VudGVyUkhUb1JlZihsZWZ0LCByaWdodCwgYm90dG9tLCB0b3AsIHpuZWFyLCB6ZmFyLCByZXN1bHQpIHtcbiAgICAgICAgb3J0aG9PZmZDZW50ZXJMSFRvUmVmKGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgem5lYXIsIHpmYXIsIHJlc3VsdCk7XG4gICAgICAgIHJlc3VsdC5fbVsxMF0gKj0gLTE7IC8vIE5vIG5lZWQgdG8gY2FsbCBfbWFya0FzVXBkYXRlZCBhcyBwcmV2aW91cyBmdW5jdGlvbiBhbHJlYWR5IGNhbGxlZCBpdCBhbmQgbGV0IF9pc0lkZW50aXR5RGlydHkgdG8gdHJ1ZVxuICAgIH1cbiAgICBNYXRyaXgub3J0aG9PZmZDZW50ZXJSSFRvUmVmID0gb3J0aG9PZmZDZW50ZXJSSFRvUmVmO1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBsZWZ0LWhhbmRlZCBwZXJzcGVjdGl2ZSBwcm9qZWN0aW9uIG1hdHJpeFxuICAgICAqIEBwYXJhbSB3aWR0aCAtIGRlZmluZXMgdGhlIHZpZXdwb3J0IHdpZHRoXG4gICAgICogQHBhcmFtIGhlaWdodCAtIGRlZmluZXMgdGhlIHZpZXdwb3J0IGhlaWdodFxuICAgICAqIEBwYXJhbSB6bmVhciAtIGRlZmluZXMgdGhlIG5lYXIgY2xpcCBwbGFuZVxuICAgICAqIEBwYXJhbSB6ZmFyIC0gZGVmaW5lcyB0aGUgZmFyIGNsaXAgcGxhbmVcbiAgICAgKiBAcmV0dXJucyBhIG5ldyBtYXRyaXggYXMgYSBsZWZ0LWhhbmRlZCBwZXJzcGVjdGl2ZSBwcm9qZWN0aW9uIG1hdHJpeFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHBlcnNwZWN0aXZlTEgod2lkdGgsIGhlaWdodCwgem5lYXIsIHpmYXIpIHtcbiAgICAgICAgY29uc3QgbWF0cml4ID0gY3JlYXRlKCk7XG4gICAgICAgIGNvbnN0IG4gPSB6bmVhcjtcbiAgICAgICAgY29uc3QgZiA9IHpmYXI7XG4gICAgICAgIGNvbnN0IGEgPSAoMi4wICogbikgLyB3aWR0aDtcbiAgICAgICAgY29uc3QgYiA9ICgyLjAgKiBuKSAvIGhlaWdodDtcbiAgICAgICAgY29uc3QgYyA9IChmICsgbikgLyAoZiAtIG4pO1xuICAgICAgICBjb25zdCBkID0gKC0yLjAgKiBmICogbikgLyAoZiAtIG4pO1xuICAgICAgICBmcm9tVmFsdWVzVG9SZWYoYSwgMC4wLCAwLjAsIDAuMCwgMC4wLCBiLCAwLjAsIDAuMCwgMC4wLCAwLjAsIGMsIDEuMCwgMC4wLCAwLjAsIGQsIDAuMCwgbWF0cml4KTtcbiAgICAgICAgX3VwZGF0ZUlkZW50aXR5U3RhdHVzKG1hdHJpeCwgZmFsc2UpO1xuICAgICAgICByZXR1cm4gbWF0cml4O1xuICAgIH1cbiAgICBNYXRyaXgucGVyc3BlY3RpdmVMSCA9IHBlcnNwZWN0aXZlTEg7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGxlZnQtaGFuZGVkIHBlcnNwZWN0aXZlIHByb2plY3Rpb24gbWF0cml4XG4gICAgICogQHBhcmFtIGZvdiAtIGRlZmluZXMgdGhlIGhvcml6b250YWwgZmllbGQgb2Ygdmlld1xuICAgICAqIEBwYXJhbSBhc3BlY3QgLSBkZWZpbmVzIHRoZSBhc3BlY3QgcmF0aW9cbiAgICAgKiBAcGFyYW0gem5lYXIgLSBkZWZpbmVzIHRoZSBuZWFyIGNsaXAgcGxhbmVcbiAgICAgKiBAcGFyYW0gemZhciAtIGRlZmluZXMgdGhlIGZhciBjbGlwIHBsYW5lXG4gICAgICogQHJldHVybnMgYSBuZXcgbWF0cml4IGFzIGEgbGVmdC1oYW5kZWQgcGVyc3BlY3RpdmUgcHJvamVjdGlvbiBtYXRyaXhcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwZXJzcGVjdGl2ZUZvdkxIKGZvdiwgYXNwZWN0LCB6bmVhciwgemZhcikge1xuICAgICAgICBjb25zdCBtYXRyaXggPSBjcmVhdGUoKTtcbiAgICAgICAgcGVyc3BlY3RpdmVGb3ZMSFRvUmVmKGZvdiwgYXNwZWN0LCB6bmVhciwgemZhciwgbWF0cml4KTtcbiAgICAgICAgcmV0dXJuIG1hdHJpeDtcbiAgICB9XG4gICAgTWF0cml4LnBlcnNwZWN0aXZlRm92TEggPSBwZXJzcGVjdGl2ZUZvdkxIO1xuICAgIC8qKlxuICAgICAqIFN0b3JlcyBhIGxlZnQtaGFuZGVkIHBlcnNwZWN0aXZlIHByb2plY3Rpb24gaW50byBhIGdpdmVuIG1hdHJpeFxuICAgICAqIEBwYXJhbSBmb3YgLSBkZWZpbmVzIHRoZSBob3Jpem9udGFsIGZpZWxkIG9mIHZpZXdcbiAgICAgKiBAcGFyYW0gYXNwZWN0IC0gZGVmaW5lcyB0aGUgYXNwZWN0IHJhdGlvXG4gICAgICogQHBhcmFtIHpuZWFyIC0gZGVmaW5lcyB0aGUgbmVhciBjbGlwIHBsYW5lXG4gICAgICogQHBhcmFtIHpmYXIgLSBkZWZpbmVzIHRoZSBmYXIgY2xpcCBwbGFuZVxuICAgICAqIEBwYXJhbSByZXN1bHQgLSBkZWZpbmVzIHRoZSB0YXJnZXQgbWF0cml4XG4gICAgICogQHBhcmFtIGlzVmVydGljYWxGb3ZGaXhlZCAtIGRlZmluZXMgaXQgdGhlIGZvdiBpcyB2ZXJ0aWNhbGx5IGZpeGVkIChkZWZhdWx0KSBvciBob3Jpem9udGFsbHlcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwZXJzcGVjdGl2ZUZvdkxIVG9SZWYoZm92LCBhc3BlY3QsIHpuZWFyLCB6ZmFyLCByZXN1bHQsIGlzVmVydGljYWxGb3ZGaXhlZCA9IHRydWUpIHtcbiAgICAgICAgY29uc3QgbiA9IHpuZWFyO1xuICAgICAgICBjb25zdCBmID0gemZhcjtcbiAgICAgICAgY29uc3QgdCA9IDEuMCAvIE1hdGgudGFuKGZvdiAqIDAuNSk7XG4gICAgICAgIGNvbnN0IGEgPSBpc1ZlcnRpY2FsRm92Rml4ZWQgPyB0IC8gYXNwZWN0IDogdDtcbiAgICAgICAgY29uc3QgYiA9IGlzVmVydGljYWxGb3ZGaXhlZCA/IHQgOiB0ICogYXNwZWN0O1xuICAgICAgICBjb25zdCBjID0gKGYgKyBuKSAvIChmIC0gbik7XG4gICAgICAgIGNvbnN0IGQgPSAoLTIuMCAqIGYgKiBuKSAvIChmIC0gbik7XG4gICAgICAgIGZyb21WYWx1ZXNUb1JlZihhLCAwLjAsIDAuMCwgMC4wLCAwLjAsIGIsIDAuMCwgMC4wLCAwLjAsIDAuMCwgYywgMS4wLCAwLjAsIDAuMCwgZCwgMC4wLCByZXN1bHQpO1xuICAgICAgICBfdXBkYXRlSWRlbnRpdHlTdGF0dXMocmVzdWx0LCBmYWxzZSk7XG4gICAgfVxuICAgIE1hdHJpeC5wZXJzcGVjdGl2ZUZvdkxIVG9SZWYgPSBwZXJzcGVjdGl2ZUZvdkxIVG9SZWY7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHJpZ2h0LWhhbmRlZCBwZXJzcGVjdGl2ZSBwcm9qZWN0aW9uIG1hdHJpeFxuICAgICAqIEBwYXJhbSBmb3YgLSBkZWZpbmVzIHRoZSBob3Jpem9udGFsIGZpZWxkIG9mIHZpZXdcbiAgICAgKiBAcGFyYW0gYXNwZWN0IC0gZGVmaW5lcyB0aGUgYXNwZWN0IHJhdGlvXG4gICAgICogQHBhcmFtIHpuZWFyIC0gZGVmaW5lcyB0aGUgbmVhciBjbGlwIHBsYW5lXG4gICAgICogQHBhcmFtIHpmYXIgLSBkZWZpbmVzIHRoZSBmYXIgY2xpcCBwbGFuZVxuICAgICAqIEByZXR1cm5zIGEgbmV3IG1hdHJpeCBhcyBhIHJpZ2h0LWhhbmRlZCBwZXJzcGVjdGl2ZSBwcm9qZWN0aW9uIG1hdHJpeFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIFBlcnNwZWN0aXZlRm92UkgoZm92LCBhc3BlY3QsIHpuZWFyLCB6ZmFyKSB7XG4gICAgICAgIGNvbnN0IG1hdHJpeCA9IGNyZWF0ZSgpO1xuICAgICAgICBwZXJzcGVjdGl2ZUZvdlJIVG9SZWYoZm92LCBhc3BlY3QsIHpuZWFyLCB6ZmFyLCBtYXRyaXgpO1xuICAgICAgICByZXR1cm4gbWF0cml4O1xuICAgIH1cbiAgICBNYXRyaXguUGVyc3BlY3RpdmVGb3ZSSCA9IFBlcnNwZWN0aXZlRm92Ukg7XG4gICAgLyoqXG4gICAgICogU3RvcmVzIGEgcmlnaHQtaGFuZGVkIHBlcnNwZWN0aXZlIHByb2plY3Rpb24gaW50byBhIGdpdmVuIG1hdHJpeFxuICAgICAqIEBwYXJhbSBmb3YgLSBkZWZpbmVzIHRoZSBob3Jpem9udGFsIGZpZWxkIG9mIHZpZXdcbiAgICAgKiBAcGFyYW0gYXNwZWN0IC0gZGVmaW5lcyB0aGUgYXNwZWN0IHJhdGlvXG4gICAgICogQHBhcmFtIHpuZWFyIC0gZGVmaW5lcyB0aGUgbmVhciBjbGlwIHBsYW5lXG4gICAgICogQHBhcmFtIHpmYXIgLSBkZWZpbmVzIHRoZSBmYXIgY2xpcCBwbGFuZVxuICAgICAqIEBwYXJhbSByZXN1bHQgLSBkZWZpbmVzIHRoZSB0YXJnZXQgbWF0cml4XG4gICAgICogQHBhcmFtIGlzVmVydGljYWxGb3ZGaXhlZCAtIGRlZmluZXMgaXQgdGhlIGZvdiBpcyB2ZXJ0aWNhbGx5IGZpeGVkIChkZWZhdWx0KSBvciBob3Jpem9udGFsbHlcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwZXJzcGVjdGl2ZUZvdlJIVG9SZWYoZm92LCBhc3BlY3QsIHpuZWFyLCB6ZmFyLCByZXN1bHQsIGlzVmVydGljYWxGb3ZGaXhlZCA9IHRydWUpIHtcbiAgICAgICAgLyogYWx0ZXJuYXRpdmVseSBzZWxmIGNvdWxkIGJlIGV4cHJlc3NlZCBhczpcbiAgICAgICAgLy8gICAgbSA9IFBlcnNwZWN0aXZlRm92TEhUb1JlZlxuICAgICAgICAvLyAgICBtWzEwXSAqPSAtMS4wO1xuICAgICAgICAvLyAgICBtWzExXSAqPSAtMS4wO1xuICAgICAgICAqL1xuICAgICAgICBjb25zdCBuID0gem5lYXI7XG4gICAgICAgIGNvbnN0IGYgPSB6ZmFyO1xuICAgICAgICBjb25zdCB0ID0gMS4wIC8gTWF0aC50YW4oZm92ICogMC41KTtcbiAgICAgICAgY29uc3QgYSA9IGlzVmVydGljYWxGb3ZGaXhlZCA/IHQgLyBhc3BlY3QgOiB0O1xuICAgICAgICBjb25zdCBiID0gaXNWZXJ0aWNhbEZvdkZpeGVkID8gdCA6IHQgKiBhc3BlY3Q7XG4gICAgICAgIGNvbnN0IGMgPSAtKGYgKyBuKSAvIChmIC0gbik7XG4gICAgICAgIGNvbnN0IGQgPSAoLTIgKiBmICogbikgLyAoZiAtIG4pO1xuICAgICAgICBmcm9tVmFsdWVzVG9SZWYoYSwgMC4wLCAwLjAsIDAuMCwgMC4wLCBiLCAwLjAsIDAuMCwgMC4wLCAwLjAsIGMsIC0xLjAsIDAuMCwgMC4wLCBkLCAwLjAsIHJlc3VsdCk7XG4gICAgICAgIF91cGRhdGVJZGVudGl0eVN0YXR1cyhyZXN1bHQsIGZhbHNlKTtcbiAgICB9XG4gICAgTWF0cml4LnBlcnNwZWN0aXZlRm92UkhUb1JlZiA9IHBlcnNwZWN0aXZlRm92UkhUb1JlZjtcbiAgICAvKipcbiAgICAgKiBTdG9yZXMgYSBwZXJzcGVjdGl2ZSBwcm9qZWN0aW9uIGZvciBXZWJWUiBpbmZvIGEgZ2l2ZW4gbWF0cml4XG4gICAgICogQHBhcmFtIGZvdiAtIGRlZmluZXMgdGhlIGZpZWxkIG9mIHZpZXdcbiAgICAgKiBAcGFyYW0gem5lYXIgLSBkZWZpbmVzIHRoZSBuZWFyIGNsaXAgcGxhbmVcbiAgICAgKiBAcGFyYW0gemZhciAtIGRlZmluZXMgdGhlIGZhciBjbGlwIHBsYW5lXG4gICAgICogQHBhcmFtIHJlc3VsdCAtIGRlZmluZXMgdGhlIHRhcmdldCBtYXRyaXhcbiAgICAgKiBAcGFyYW0gcmlnaHRIYW5kZWQgLSBkZWZpbmVzIGlmIHRoZSBtYXRyaXggbXVzdCBiZSBpbiByaWdodC1oYW5kZWQgbW9kZSAoZmFsc2UgYnkgZGVmYXVsdClcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwZXJzcGVjdGl2ZUZvdldlYlZSVG9SZWYoZm92LCB6bmVhciwgemZhciwgcmVzdWx0LCByaWdodEhhbmRlZCA9IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IHJpZ2h0SGFuZGVkRmFjdG9yID0gcmlnaHRIYW5kZWQgPyAtMSA6IDE7XG4gICAgICAgIGNvbnN0IHVwVGFuID0gTWF0aC50YW4oKGZvdi51cERlZ3JlZXMgKiBNYXRoLlBJKSAvIDE4MC4wKTtcbiAgICAgICAgY29uc3QgZG93blRhbiA9IE1hdGgudGFuKChmb3YuZG93bkRlZ3JlZXMgKiBNYXRoLlBJKSAvIDE4MC4wKTtcbiAgICAgICAgY29uc3QgbGVmdFRhbiA9IE1hdGgudGFuKChmb3YubGVmdERlZ3JlZXMgKiBNYXRoLlBJKSAvIDE4MC4wKTtcbiAgICAgICAgY29uc3QgcmlnaHRUYW4gPSBNYXRoLnRhbigoZm92LnJpZ2h0RGVncmVlcyAqIE1hdGguUEkpIC8gMTgwLjApO1xuICAgICAgICBjb25zdCB4U2NhbGUgPSAyLjAgLyAobGVmdFRhbiArIHJpZ2h0VGFuKTtcbiAgICAgICAgY29uc3QgeVNjYWxlID0gMi4wIC8gKHVwVGFuICsgZG93blRhbik7XG4gICAgICAgIGNvbnN0IG0gPSByZXN1bHQuX207XG4gICAgICAgIG1bMF0gPSB4U2NhbGU7XG4gICAgICAgIG1bMV0gPSBtWzJdID0gbVszXSA9IG1bNF0gPSAwLjA7XG4gICAgICAgIG1bNV0gPSB5U2NhbGU7XG4gICAgICAgIG1bNl0gPSBtWzddID0gMC4wO1xuICAgICAgICBtWzhdID0gKGxlZnRUYW4gLSByaWdodFRhbikgKiB4U2NhbGUgKiAwLjU7XG4gICAgICAgIG1bOV0gPSAtKCh1cFRhbiAtIGRvd25UYW4pICogeVNjYWxlICogMC41KTtcbiAgICAgICAgbVsxMF0gPSAtemZhciAvICh6bmVhciAtIHpmYXIpO1xuICAgICAgICBtWzExXSA9IDEuMCAqIHJpZ2h0SGFuZGVkRmFjdG9yO1xuICAgICAgICBtWzEyXSA9IG1bMTNdID0gbVsxNV0gPSAwLjA7XG4gICAgICAgIG1bMTRdID0gLSgyLjAgKiB6ZmFyICogem5lYXIpIC8gKHpmYXIgLSB6bmVhcik7XG4gICAgICAgIF9tYXJrQXNVcGRhdGVkKHJlc3VsdCk7XG4gICAgfVxuICAgIE1hdHJpeC5wZXJzcGVjdGl2ZUZvdldlYlZSVG9SZWYgPSBwZXJzcGVjdGl2ZUZvdldlYlZSVG9SZWY7XG4gICAgLyoqXG4gICAgICogRXh0cmFjdHMgYSAyeDIgbWF0cml4IGZyb20gYSBnaXZlbiBtYXRyaXggYW5kIHN0b3JlIHRoZSByZXN1bHQgaW4gYSBGbG9hdEFycmF5XG4gICAgICogQHBhcmFtIG1hdHJpeCAtIGRlZmluZXMgdGhlIG1hdHJpeCB0byB1c2VcbiAgICAgKiBAcmV0dXJucyBhIG5ldyBGbG9hdEFycmF5IGFycmF5IHdpdGggNCBlbGVtZW50cyA6IHRoZSAyeDIgbWF0cml4IGV4dHJhY3RlZCBmcm9tIHRoZSBnaXZlbiBtYXRyaXhcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBHZXRBc01hdHJpeDJ4MihtYXRyaXgpIHtcbiAgICAgICAgcmV0dXJuIFttYXRyaXguX21bMF0sIG1hdHJpeC5fbVsxXSwgbWF0cml4Ll9tWzRdLCBtYXRyaXguX21bNV1dO1xuICAgIH1cbiAgICBNYXRyaXguR2V0QXNNYXRyaXgyeDIgPSBHZXRBc01hdHJpeDJ4MjtcbiAgICAvKipcbiAgICAgKiBFeHRyYWN0cyBhIDN4MyBtYXRyaXggZnJvbSBhIGdpdmVuIG1hdHJpeCBhbmQgc3RvcmUgdGhlIHJlc3VsdCBpbiBhIEZsb2F0QXJyYXlcbiAgICAgKiBAcGFyYW0gbWF0cml4IC0gZGVmaW5lcyB0aGUgbWF0cml4IHRvIHVzZVxuICAgICAqIEByZXR1cm5zIGEgbmV3IEZsb2F0QXJyYXkgYXJyYXkgd2l0aCA5IGVsZW1lbnRzIDogdGhlIDN4MyBtYXRyaXggZXh0cmFjdGVkIGZyb20gdGhlIGdpdmVuIG1hdHJpeFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIEdldEFzTWF0cml4M3gzKG1hdHJpeCkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgbWF0cml4Ll9tWzBdLFxuICAgICAgICAgICAgbWF0cml4Ll9tWzFdLFxuICAgICAgICAgICAgbWF0cml4Ll9tWzJdLFxuICAgICAgICAgICAgbWF0cml4Ll9tWzRdLFxuICAgICAgICAgICAgbWF0cml4Ll9tWzVdLFxuICAgICAgICAgICAgbWF0cml4Ll9tWzZdLFxuICAgICAgICAgICAgbWF0cml4Ll9tWzhdLFxuICAgICAgICAgICAgbWF0cml4Ll9tWzldLFxuICAgICAgICAgICAgbWF0cml4Ll9tWzEwXVxuICAgICAgICBdO1xuICAgIH1cbiAgICBNYXRyaXguR2V0QXNNYXRyaXgzeDMgPSBHZXRBc01hdHJpeDN4MztcbiAgICAvKipcbiAgICAgKiBDb21wdXRlIHRoZSB0cmFuc3Bvc2Ugb2YgYSBnaXZlbiBtYXRyaXhcbiAgICAgKiBAcGFyYW0gbWF0cml4IC0gZGVmaW5lcyB0aGUgbWF0cml4IHRvIHRyYW5zcG9zZVxuICAgICAqIEByZXR1cm5zIHRoZSBuZXcgbWF0cml4XG4gICAgICovXG4gICAgZnVuY3Rpb24gdHJhbnNwb3NlKG1hdHJpeCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBjcmVhdGUoKTtcbiAgICAgICAgdHJhbnNwb3NlVG9SZWYobWF0cml4LCByZXN1bHQpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBNYXRyaXgudHJhbnNwb3NlID0gdHJhbnNwb3NlO1xuICAgIC8qKlxuICAgICAqIENvbXB1dGUgdGhlIHRyYW5zcG9zZSBvZiBhIG1hdHJpeCBhbmQgc3RvcmUgaXQgaW4gYSB0YXJnZXQgbWF0cml4XG4gICAgICogQHBhcmFtIG1hdHJpeCAtIGRlZmluZXMgdGhlIG1hdHJpeCB0byB0cmFuc3Bvc2VcbiAgICAgKiBAcGFyYW0gcmVzdWx0IC0gZGVmaW5lcyB0aGUgdGFyZ2V0IG1hdHJpeFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRyYW5zcG9zZVRvUmVmKG1hdHJpeCwgcmVzdWx0KSB7XG4gICAgICAgIGNvbnN0IHJtID0gcmVzdWx0Ll9tO1xuICAgICAgICBjb25zdCBtbSA9IG1hdHJpeC5fbTtcbiAgICAgICAgcm1bMF0gPSBtbVswXTtcbiAgICAgICAgcm1bMV0gPSBtbVs0XTtcbiAgICAgICAgcm1bMl0gPSBtbVs4XTtcbiAgICAgICAgcm1bM10gPSBtbVsxMl07XG4gICAgICAgIHJtWzRdID0gbW1bMV07XG4gICAgICAgIHJtWzVdID0gbW1bNV07XG4gICAgICAgIHJtWzZdID0gbW1bOV07XG4gICAgICAgIHJtWzddID0gbW1bMTNdO1xuICAgICAgICBybVs4XSA9IG1tWzJdO1xuICAgICAgICBybVs5XSA9IG1tWzZdO1xuICAgICAgICBybVsxMF0gPSBtbVsxMF07XG4gICAgICAgIHJtWzExXSA9IG1tWzE0XTtcbiAgICAgICAgcm1bMTJdID0gbW1bM107XG4gICAgICAgIHJtWzEzXSA9IG1tWzddO1xuICAgICAgICBybVsxNF0gPSBtbVsxMV07XG4gICAgICAgIHJtWzE1XSA9IG1tWzE1XTtcbiAgICAgICAgLy8gaWRlbnRpdHktbmVzcyBkb2VzIG5vdCBjaGFuZ2Ugd2hlbiB0cmFuc3Bvc2luZ1xuICAgICAgICBfdXBkYXRlSWRlbnRpdHlTdGF0dXMocmVzdWx0LCBtYXRyaXguaXNJZGVudGl0eSwgbWF0cml4Ll9pc0lkZW50aXR5RGlydHkpO1xuICAgIH1cbiAgICBNYXRyaXgudHJhbnNwb3NlVG9SZWYgPSB0cmFuc3Bvc2VUb1JlZjtcbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyBhIHJlZmxlY3Rpb24gbWF0cml4IGZyb20gYSBwbGFuZVxuICAgICAqIEBwYXJhbSBwbGFuZSAtIGRlZmluZXMgdGhlIHJlZmxlY3Rpb24gcGxhbmVcbiAgICAgKiBAcmV0dXJucyBhIG5ldyBtYXRyaXhcbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZWZsZWN0aW9uKHBsYW5lKSB7XG4gICAgICAgIGNvbnN0IG1hdHJpeCA9IGNyZWF0ZSgpO1xuICAgICAgICByZWZsZWN0aW9uVG9SZWYocGxhbmUsIG1hdHJpeCk7XG4gICAgICAgIHJldHVybiBtYXRyaXg7XG4gICAgfVxuICAgIE1hdHJpeC5yZWZsZWN0aW9uID0gcmVmbGVjdGlvbjtcbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyBhIHJlZmxlY3Rpb24gbWF0cml4IGZyb20gYSBwbGFuZVxuICAgICAqIEBwYXJhbSBwbGFuZSAtIGRlZmluZXMgdGhlIHJlZmxlY3Rpb24gcGxhbmVcbiAgICAgKiBAcGFyYW0gcmVzdWx0IC0gZGVmaW5lcyB0aGUgdGFyZ2V0IG1hdHJpeFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlZmxlY3Rpb25Ub1JlZihfcGxhbmUsIHJlc3VsdCkge1xuICAgICAgICBjb25zdCBwbGFuZSA9IFBsYW5lLm5vcm1hbGl6ZShfcGxhbmUpO1xuICAgICAgICBjb25zdCB4ID0gcGxhbmUubm9ybWFsLng7XG4gICAgICAgIGNvbnN0IHkgPSBwbGFuZS5ub3JtYWwueTtcbiAgICAgICAgY29uc3QgeiA9IHBsYW5lLm5vcm1hbC56O1xuICAgICAgICBjb25zdCB0ZW1wID0gLTIgKiB4O1xuICAgICAgICBjb25zdCB0ZW1wMiA9IC0yICogeTtcbiAgICAgICAgY29uc3QgdGVtcDMgPSAtMiAqIHo7XG4gICAgICAgIGZyb21WYWx1ZXNUb1JlZih0ZW1wICogeCArIDEsIHRlbXAyICogeCwgdGVtcDMgKiB4LCAwLjAsIHRlbXAgKiB5LCB0ZW1wMiAqIHkgKyAxLCB0ZW1wMyAqIHksIDAuMCwgdGVtcCAqIHosIHRlbXAyICogeiwgdGVtcDMgKiB6ICsgMSwgMC4wLCB0ZW1wICogcGxhbmUuZCwgdGVtcDIgKiBwbGFuZS5kLCB0ZW1wMyAqIHBsYW5lLmQsIDEuMCwgcmVzdWx0KTtcbiAgICB9XG4gICAgTWF0cml4LnJlZmxlY3Rpb25Ub1JlZiA9IHJlZmxlY3Rpb25Ub1JlZjtcbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBnaXZlbiBtYXRyaXggYXMgYSByb3RhdGlvbiBtYXRyaXggY29tcG9zZWQgZnJvbSB0aGUgMyBsZWZ0IGhhbmRlZCBheGVzXG4gICAgICogQHBhcmFtIHhheGlzIC0gZGVmaW5lcyB0aGUgdmFsdWUgb2YgdGhlIDFzdCBheGlzXG4gICAgICogQHBhcmFtIHlheGlzIC0gZGVmaW5lcyB0aGUgdmFsdWUgb2YgdGhlIDJuZCBheGlzXG4gICAgICogQHBhcmFtIHpheGlzIC0gZGVmaW5lcyB0aGUgdmFsdWUgb2YgdGhlIDNyZCBheGlzXG4gICAgICogQHBhcmFtIHJlc3VsdCAtIGRlZmluZXMgdGhlIHRhcmdldCBtYXRyaXhcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmcm9tWFlaQXhlc1RvUmVmKHhheGlzLCB5YXhpcywgemF4aXMsIHJlc3VsdCkge1xuICAgICAgICBmcm9tVmFsdWVzVG9SZWYoeGF4aXMueCwgeGF4aXMueSwgeGF4aXMueiwgMC4wLCB5YXhpcy54LCB5YXhpcy55LCB5YXhpcy56LCAwLjAsIHpheGlzLngsIHpheGlzLnksIHpheGlzLnosIDAuMCwgMC4wLCAwLjAsIDAuMCwgMS4wLCByZXN1bHQpO1xuICAgIH1cbiAgICBNYXRyaXguZnJvbVhZWkF4ZXNUb1JlZiA9IGZyb21YWVpBeGVzVG9SZWY7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHJvdGF0aW9uIG1hdHJpeCBmcm9tIGEgcXVhdGVybmlvbiBhbmQgc3RvcmVzIGl0IGluIGEgdGFyZ2V0IG1hdHJpeFxuICAgICAqIEBwYXJhbSBxdWF0IC0gZGVmaW5lcyB0aGUgcXVhdGVybmlvbiB0byB1c2VcbiAgICAgKiBAcGFyYW0gcmVzdWx0IC0gZGVmaW5lcyB0aGUgdGFyZ2V0IG1hdHJpeFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZyb21RdWF0ZXJuaW9uVG9SZWYocXVhdCwgcmVzdWx0KSB7XG4gICAgICAgIGNvbnN0IHh4ID0gcXVhdC54ICogcXVhdC54O1xuICAgICAgICBjb25zdCB5eSA9IHF1YXQueSAqIHF1YXQueTtcbiAgICAgICAgY29uc3QgenogPSBxdWF0LnogKiBxdWF0Lno7XG4gICAgICAgIGNvbnN0IHh5ID0gcXVhdC54ICogcXVhdC55O1xuICAgICAgICBjb25zdCB6dyA9IHF1YXQueiAqIHF1YXQudztcbiAgICAgICAgY29uc3QgenggPSBxdWF0LnogKiBxdWF0Lng7XG4gICAgICAgIGNvbnN0IHl3ID0gcXVhdC55ICogcXVhdC53O1xuICAgICAgICBjb25zdCB5eiA9IHF1YXQueSAqIHF1YXQuejtcbiAgICAgICAgY29uc3QgeHcgPSBxdWF0LnggKiBxdWF0Lnc7XG4gICAgICAgIHJlc3VsdC5fbVswXSA9IDEuMCAtIDIuMCAqICh5eSArIHp6KTtcbiAgICAgICAgcmVzdWx0Ll9tWzFdID0gMi4wICogKHh5ICsgencpO1xuICAgICAgICByZXN1bHQuX21bMl0gPSAyLjAgKiAoenggLSB5dyk7XG4gICAgICAgIHJlc3VsdC5fbVszXSA9IDAuMDtcbiAgICAgICAgcmVzdWx0Ll9tWzRdID0gMi4wICogKHh5IC0gencpO1xuICAgICAgICByZXN1bHQuX21bNV0gPSAxLjAgLSAyLjAgKiAoenogKyB4eCk7XG4gICAgICAgIHJlc3VsdC5fbVs2XSA9IDIuMCAqICh5eiArIHh3KTtcbiAgICAgICAgcmVzdWx0Ll9tWzddID0gMC4wO1xuICAgICAgICByZXN1bHQuX21bOF0gPSAyLjAgKiAoenggKyB5dyk7XG4gICAgICAgIHJlc3VsdC5fbVs5XSA9IDIuMCAqICh5eiAtIHh3KTtcbiAgICAgICAgcmVzdWx0Ll9tWzEwXSA9IDEuMCAtIDIuMCAqICh5eSArIHh4KTtcbiAgICAgICAgcmVzdWx0Ll9tWzExXSA9IDAuMDtcbiAgICAgICAgcmVzdWx0Ll9tWzEyXSA9IDAuMDtcbiAgICAgICAgcmVzdWx0Ll9tWzEzXSA9IDAuMDtcbiAgICAgICAgcmVzdWx0Ll9tWzE0XSA9IDAuMDtcbiAgICAgICAgcmVzdWx0Ll9tWzE1XSA9IDEuMDtcbiAgICAgICAgX21hcmtBc1VwZGF0ZWQocmVzdWx0KTtcbiAgICB9XG4gICAgTWF0cml4LmZyb21RdWF0ZXJuaW9uVG9SZWYgPSBmcm9tUXVhdGVybmlvblRvUmVmO1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBmdW5jdGlvbiBfbWFya0FzVXBkYXRlZChzZWxmKSB7XG4gICAgICAgIHNlbGYudXBkYXRlRmxhZyA9IF91cGRhdGVGbGFnU2VlZCsrO1xuICAgICAgICBzZWxmLmlzSWRlbnRpdHkgPSBmYWxzZTtcbiAgICAgICAgc2VsZi5pc0lkZW50aXR5M3gyID0gZmFsc2U7XG4gICAgICAgIHNlbGYuX2lzSWRlbnRpdHlEaXJ0eSA9IHRydWU7XG4gICAgICAgIHNlbGYuX2lzSWRlbnRpdHkzeDJEaXJ0eSA9IHRydWU7XG4gICAgfVxuICAgIC8vIFByb3BlcnRpZXNcbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiB0aGUgY3VycmVudCBtYXRyaXggaXMgaWRlbnRpdHlcbiAgICAgKiBAcmV0dXJucyB0cnVlIGlzIHRoZSBtYXRyaXggaXMgdGhlIGlkZW50aXR5IG1hdHJpeFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzSWRlbnRpdHlVcGRhdGUoc2VsZikge1xuICAgICAgICBpZiAoc2VsZi5faXNJZGVudGl0eURpcnR5KSB7XG4gICAgICAgICAgICBzZWxmLl9pc0lkZW50aXR5RGlydHkgPSBmYWxzZTtcbiAgICAgICAgICAgIGNvbnN0IG0gPSBzZWxmLl9tO1xuICAgICAgICAgICAgc2VsZi5pc0lkZW50aXR5ID1cbiAgICAgICAgICAgICAgICBtWzBdID09PSAxLjAgJiZcbiAgICAgICAgICAgICAgICAgICAgbVsxXSA9PT0gMC4wICYmXG4gICAgICAgICAgICAgICAgICAgIG1bMl0gPT09IDAuMCAmJlxuICAgICAgICAgICAgICAgICAgICBtWzNdID09PSAwLjAgJiZcbiAgICAgICAgICAgICAgICAgICAgbVs0XSA9PT0gMC4wICYmXG4gICAgICAgICAgICAgICAgICAgIG1bNV0gPT09IDEuMCAmJlxuICAgICAgICAgICAgICAgICAgICBtWzZdID09PSAwLjAgJiZcbiAgICAgICAgICAgICAgICAgICAgbVs3XSA9PT0gMC4wICYmXG4gICAgICAgICAgICAgICAgICAgIG1bOF0gPT09IDAuMCAmJlxuICAgICAgICAgICAgICAgICAgICBtWzldID09PSAwLjAgJiZcbiAgICAgICAgICAgICAgICAgICAgbVsxMF0gPT09IDEuMCAmJlxuICAgICAgICAgICAgICAgICAgICBtWzExXSA9PT0gMC4wICYmXG4gICAgICAgICAgICAgICAgICAgIG1bMTJdID09PSAwLjAgJiZcbiAgICAgICAgICAgICAgICAgICAgbVsxM10gPT09IDAuMCAmJlxuICAgICAgICAgICAgICAgICAgICBtWzE0XSA9PT0gMC4wICYmXG4gICAgICAgICAgICAgICAgICAgIG1bMTVdID09PSAxLjA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNlbGYuaXNJZGVudGl0eTtcbiAgICB9XG4gICAgTWF0cml4LmlzSWRlbnRpdHlVcGRhdGUgPSBpc0lkZW50aXR5VXBkYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoZSBjdXJyZW50IG1hdHJpeCBpcyBpZGVudGl0eSBhcyBhIHRleHR1cmUgbWF0cml4ICgzeDIgc3RvcmUgaW4gNHg0KVxuICAgICAqIEByZXR1cm5zIHRydWUgaXMgdGhlIG1hdHJpeCBpcyB0aGUgaWRlbnRpdHkgbWF0cml4XG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNJZGVudGl0eUFzM3gyVXBkYXRlKHNlbGYpIHtcbiAgICAgICAgaWYgKHNlbGYuX2lzSWRlbnRpdHkzeDJEaXJ0eSkge1xuICAgICAgICAgICAgc2VsZi5faXNJZGVudGl0eTN4MkRpcnR5ID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAoc2VsZi5fbVswXSAhPT0gMS4wIHx8IHNlbGYuX21bNV0gIT09IDEuMCB8fCBzZWxmLl9tWzE1XSAhPT0gMS4wKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5pc0lkZW50aXR5M3gyID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChzZWxmLl9tWzFdICE9PSAwLjAgfHxcbiAgICAgICAgICAgICAgICBzZWxmLl9tWzJdICE9PSAwLjAgfHxcbiAgICAgICAgICAgICAgICBzZWxmLl9tWzNdICE9PSAwLjAgfHxcbiAgICAgICAgICAgICAgICBzZWxmLl9tWzRdICE9PSAwLjAgfHxcbiAgICAgICAgICAgICAgICBzZWxmLl9tWzZdICE9PSAwLjAgfHxcbiAgICAgICAgICAgICAgICBzZWxmLl9tWzddICE9PSAwLjAgfHxcbiAgICAgICAgICAgICAgICBzZWxmLl9tWzhdICE9PSAwLjAgfHxcbiAgICAgICAgICAgICAgICBzZWxmLl9tWzldICE9PSAwLjAgfHxcbiAgICAgICAgICAgICAgICBzZWxmLl9tWzEwXSAhPT0gMC4wIHx8XG4gICAgICAgICAgICAgICAgc2VsZi5fbVsxMV0gIT09IDAuMCB8fFxuICAgICAgICAgICAgICAgIHNlbGYuX21bMTJdICE9PSAwLjAgfHxcbiAgICAgICAgICAgICAgICBzZWxmLl9tWzEzXSAhPT0gMC4wIHx8XG4gICAgICAgICAgICAgICAgc2VsZi5fbVsxNF0gIT09IDAuMCkge1xuICAgICAgICAgICAgICAgIHNlbGYuaXNJZGVudGl0eTN4MiA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgc2VsZi5pc0lkZW50aXR5M3gyID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2VsZi5pc0lkZW50aXR5M3gyO1xuICAgIH1cbiAgICBNYXRyaXguaXNJZGVudGl0eUFzM3gyVXBkYXRlID0gaXNJZGVudGl0eUFzM3gyVXBkYXRlO1xuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGRldGVybWluYW50IG9mIHRoZSBtYXRyaXhcbiAgICAgKiBAcmV0dXJucyB0aGUgbWF0cml4IGRldGVybWluYW50XG4gICAgICovXG4gICAgZnVuY3Rpb24gZGV0ZXJtaW5hbnQoc2VsZikge1xuICAgICAgICBpZiAoc2VsZi5pc0lkZW50aXR5ID09PSB0cnVlKSB7XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtID0gc2VsZi5fbTtcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm9uZS12YXJpYWJsZS1wZXItZGVjbGFyYXRpb25cbiAgICAgICAgY29uc3QgbTAwID0gbVswXSwgbTAxID0gbVsxXSwgbTAyID0gbVsyXSwgbTAzID0gbVszXTtcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm9uZS12YXJpYWJsZS1wZXItZGVjbGFyYXRpb25cbiAgICAgICAgY29uc3QgbTEwID0gbVs0XSwgbTExID0gbVs1XSwgbTEyID0gbVs2XSwgbTEzID0gbVs3XTtcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm9uZS12YXJpYWJsZS1wZXItZGVjbGFyYXRpb25cbiAgICAgICAgY29uc3QgbTIwID0gbVs4XSwgbTIxID0gbVs5XSwgbTIyID0gbVsxMF0sIG0yMyA9IG1bMTFdO1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6b25lLXZhcmlhYmxlLXBlci1kZWNsYXJhdGlvblxuICAgICAgICBjb25zdCBtMzAgPSBtWzEyXSwgbTMxID0gbVsxM10sIG0zMiA9IG1bMTRdLCBtMzMgPSBtWzE1XTtcbiAgICAgICAgLypcbiAgICAgICAgLy8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGFwbGFjZV9leHBhbnNpb25cbiAgICAgICAgLy8gdG8gY29tcHV0ZSB0aGUgZGV0ZXJybWluYW50IG9mIGEgNHg0IE1hdHJpeCB3ZSBjb21wdXRlIHRoZSBjb2ZhY3RvcnMgb2YgYW55IHJvdyBvciBjb2x1bW4sXG4gICAgICAgIC8vIHRoZW4gd2UgbXVsdGlwbHkgZWFjaCBDb2ZhY3RvciBieSBpdHMgY29ycmVzcG9uZGluZyBtYXRyaXggdmFsdWUgYW5kIHN1bSB0aGVtIGFsbCB0byBnZXQgdGhlIGRldGVybWluYW50XG4gICAgICAgIC8vIENvZmFjdG9yKGksIGopID0gc2lnbihpLGopICogZGV0KE1pbm9yKGksIGopKVxuICAgICAgICAvLyB3aGVyZVxuICAgICAgICAvLyAgLSBzaWduKGksaikgPSAoaStqKSAlIDIgPT09IDAgPyAxIDogLTFcbiAgICAgICAgLy8gIC0gTWlub3IoaSwgaikgaXMgdGhlIDN4MyBtYXRyaXggd2UgZ2V0IGJ5IHJlbW92aW5nIHJvdyBpIGFuZCBjb2x1bW4gaiBmcm9tIGN1cnJlbnQgTWF0cml4XG4gICAgICAgIC8vXG4gICAgICAgIC8vIEhlcmUgd2UgZG8gdGhhdCBmb3IgdGhlIDFzdCByb3cuXG4gICAgICAgICovXG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlOnZhcmlhYmxlLW5hbWVcbiAgICAgICAgY29uc3QgZGV0XzIyXzMzID0gbTIyICogbTMzIC0gbTMyICogbTIzO1xuICAgICAgICBjb25zdCBkZXRfMjFfMzMgPSBtMjEgKiBtMzMgLSBtMzEgKiBtMjM7XG4gICAgICAgIGNvbnN0IGRldF8yMV8zMiA9IG0yMSAqIG0zMiAtIG0zMSAqIG0yMjtcbiAgICAgICAgY29uc3QgZGV0XzIwXzMzID0gbTIwICogbTMzIC0gbTMwICogbTIzO1xuICAgICAgICBjb25zdCBkZXRfMjBfMzIgPSBtMjAgKiBtMzIgLSBtMjIgKiBtMzA7XG4gICAgICAgIGNvbnN0IGRldF8yMF8zMSA9IG0yMCAqIG0zMSAtIG0zMCAqIG0yMTtcbiAgICAgICAgY29uc3QgY29mYWN0XzAwID0gKyhtMTEgKiBkZXRfMjJfMzMgLSBtMTIgKiBkZXRfMjFfMzMgKyBtMTMgKiBkZXRfMjFfMzIpO1xuICAgICAgICBjb25zdCBjb2ZhY3RfMDEgPSAtKG0xMCAqIGRldF8yMl8zMyAtIG0xMiAqIGRldF8yMF8zMyArIG0xMyAqIGRldF8yMF8zMik7XG4gICAgICAgIGNvbnN0IGNvZmFjdF8wMiA9ICsobTEwICogZGV0XzIxXzMzIC0gbTExICogZGV0XzIwXzMzICsgbTEzICogZGV0XzIwXzMxKTtcbiAgICAgICAgY29uc3QgY29mYWN0XzAzID0gLShtMTAgKiBkZXRfMjFfMzIgLSBtMTEgKiBkZXRfMjBfMzIgKyBtMTIgKiBkZXRfMjBfMzEpO1xuICAgICAgICAvLyB0c2xpbnQ6ZW5hYmxlOnZhcmlhYmxlLW5hbWVcbiAgICAgICAgcmV0dXJuIG0wMCAqIGNvZmFjdF8wMCArIG0wMSAqIGNvZmFjdF8wMSArIG0wMiAqIGNvZmFjdF8wMiArIG0wMyAqIGNvZmFjdF8wMztcbiAgICB9XG4gICAgTWF0cml4LmRldGVybWluYW50ID0gZGV0ZXJtaW5hbnQ7XG4gICAgLy8gTWV0aG9kc1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG1hdHJpeCBhcyBhIEZsb2F0QXJyYXlcbiAgICAgKiBAcmV0dXJucyB0aGUgbWF0cml4IHVuZGVybHlpbmcgYXJyYXlcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b0FycmF5KHNlbGYpIHtcbiAgICAgICAgcmV0dXJuIHNlbGYuX207XG4gICAgfVxuICAgIE1hdHJpeC50b0FycmF5ID0gdG9BcnJheTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBtYXRyaXggYXMgYSBGbG9hdEFycmF5XG4gICAgICogQHJldHVybnMgdGhlIG1hdHJpeCB1bmRlcmx5aW5nIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFzQXJyYXkoc2VsZikge1xuICAgICAgICByZXR1cm4gc2VsZi5fbTtcbiAgICB9XG4gICAgTWF0cml4LmFzQXJyYXkgPSBhc0FycmF5O1xuICAgIC8qKlxuICAgICAqIFNldHMgYWxsIHRoZSBtYXRyaXggZWxlbWVudHMgdG8gemVyb1xuICAgICAqIEByZXR1cm5zIHRoZSBjdXJyZW50IG1hdHJpeFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlc2V0KHNlbGYpIHtcbiAgICAgICAgZnJvbVZhbHVlc1RvUmVmKDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgc2VsZik7XG4gICAgICAgIF91cGRhdGVJZGVudGl0eVN0YXR1cyhzZWxmLCBmYWxzZSk7XG4gICAgfVxuICAgIE1hdHJpeC5yZXNldCA9IHJlc2V0O1xuICAgIC8qKlxuICAgICAqIEFkZHMgdGhlIGN1cnJlbnQgbWF0cml4IHdpdGggYSBzZWNvbmQgb25lXG4gICAgICogQHBhcmFtIG90aGVyIC0gZGVmaW5lcyB0aGUgbWF0cml4IHRvIGFkZFxuICAgICAqIEByZXR1cm5zIGEgbmV3IG1hdHJpeCBhcyB0aGUgYWRkaXRpb24gb2YgdGhlIGN1cnJlbnQgbWF0cml4IGFuZCB0aGUgZ2l2ZW4gb25lXG4gICAgICovXG4gICAgZnVuY3Rpb24gYWRkKHNlbGYsIG90aGVyKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGNyZWF0ZSgpO1xuICAgICAgICBhZGRUb1JlZihzZWxmLCBvdGhlciwgcmVzdWx0KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgTWF0cml4LmFkZCA9IGFkZDtcbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBnaXZlbiBtYXRyaXggXCJyZXN1bHRcIiB0byB0aGUgYWRkaXRpb24gb2YgdGhlIGN1cnJlbnQgbWF0cml4IGFuZCB0aGUgZ2l2ZW4gb25lXG4gICAgICogQHBhcmFtIG90aGVyIC0gZGVmaW5lcyB0aGUgbWF0cml4IHRvIGFkZFxuICAgICAqIEBwYXJhbSByZXN1bHQgLSBkZWZpbmVzIHRoZSB0YXJnZXQgbWF0cml4XG4gICAgICogQHJldHVybnMgdGhlIGN1cnJlbnQgbWF0cml4XG4gICAgICovXG4gICAgZnVuY3Rpb24gYWRkVG9SZWYoc2VsZiwgb3RoZXIsIHJlc3VsdCkge1xuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgMTY7IGluZGV4KyspIHtcbiAgICAgICAgICAgIHJlc3VsdC5fbVtpbmRleF0gPSBzZWxmLl9tW2luZGV4XSArIG90aGVyLl9tW2luZGV4XTtcbiAgICAgICAgfVxuICAgICAgICBfbWFya0FzVXBkYXRlZChyZXN1bHQpO1xuICAgIH1cbiAgICBNYXRyaXguYWRkVG9SZWYgPSBhZGRUb1JlZjtcbiAgICAvKipcbiAgICAgKiBBZGRzIGluIHBsYWNlIHRoZSBnaXZlbiBtYXRyaXggdG8gdGhlIGN1cnJlbnQgbWF0cml4XG4gICAgICogQHBhcmFtIG90aGVyIC0gZGVmaW5lcyB0aGUgc2Vjb25kIG9wZXJhbmRcbiAgICAgKiBAcmV0dXJucyB0aGUgY3VycmVudCB1cGRhdGVkIG1hdHJpeFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFkZFRvU2VsZihzZWxmLCBvdGhlcikge1xuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgMTY7IGluZGV4KyspIHtcbiAgICAgICAgICAgIHNlbGYuX21baW5kZXhdICs9IG90aGVyLl9tW2luZGV4XTtcbiAgICAgICAgfVxuICAgICAgICBfbWFya0FzVXBkYXRlZChzZWxmKTtcbiAgICB9XG4gICAgTWF0cml4LmFkZFRvU2VsZiA9IGFkZFRvU2VsZjtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IG1hdHJpeCBhcyB0aGUgaW52ZXJ0IG9mIGEgZ2l2ZW4gbWF0cml4XG4gICAgICogQHBhcmFtIHNvdXJjZSAtIGRlZmluZXMgdGhlIHNvdXJjZSBtYXRyaXhcbiAgICAgKiBAcmV0dXJucyB0aGUgbmV3IG1hdHJpeFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGludmVydChzb3VyY2UpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gY3JlYXRlKCk7XG4gICAgICAgIGludmVydFRvUmVmKHNvdXJjZSwgcmVzdWx0KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgTWF0cml4LmludmVydCA9IGludmVydDtcbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBnaXZlbiBtYXRyaXggdG8gdGhlIGN1cnJlbnQgaW52ZXJ0ZWQgTWF0cml4XG4gICAgICogQHBhcmFtIG90aGVyIC0gZGVmaW5lcyB0aGUgdGFyZ2V0IG1hdHJpeFxuICAgICAqIEByZXR1cm5zIHRoZSB1bm1vZGlmaWVkIGN1cnJlbnQgbWF0cml4XG4gICAgICovXG4gICAgZnVuY3Rpb24gaW52ZXJ0VG9SZWYoc291cmNlLCByZXN1bHQpIHtcbiAgICAgICAgaWYgKHNvdXJjZS5pc0lkZW50aXR5ID09PSB0cnVlKSB7XG4gICAgICAgICAgICBjb3B5KHNvdXJjZSwgcmVzdWx0KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyB0aGUgaW52ZXJzZSBvZiBhIE1hdHJpeCBpcyB0aGUgdHJhbnNwb3NlIG9mIGNvZmFjdG9yIG1hdHJpeCBkaXZpZGVkIGJ5IHRoZSBkZXRlcm1pbmFudFxuICAgICAgICBjb25zdCBtID0gc291cmNlLl9tO1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZTpvbmUtdmFyaWFibGUtcGVyLWRlY2xhcmF0aW9uXG4gICAgICAgIGNvbnN0IG0wMCA9IG1bMF0sIG0wMSA9IG1bMV0sIG0wMiA9IG1bMl0sIG0wMyA9IG1bM107XG4gICAgICAgIGNvbnN0IG0xMCA9IG1bNF0sIG0xMSA9IG1bNV0sIG0xMiA9IG1bNl0sIG0xMyA9IG1bN107XG4gICAgICAgIGNvbnN0IG0yMCA9IG1bOF0sIG0yMSA9IG1bOV0sIG0yMiA9IG1bMTBdLCBtMjMgPSBtWzExXTtcbiAgICAgICAgY29uc3QgbTMwID0gbVsxMl0sIG0zMSA9IG1bMTNdLCBtMzIgPSBtWzE0XSwgbTMzID0gbVsxNV07XG4gICAgICAgIC8vIHRzbGludDplbmFibGU6b25lLXZhcmlhYmxlLXBlci1kZWNsYXJhdGlvblxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZTp2YXJpYWJsZS1uYW1lXG4gICAgICAgIGNvbnN0IGRldF8yMl8zMyA9IG0yMiAqIG0zMyAtIG0zMiAqIG0yMztcbiAgICAgICAgY29uc3QgZGV0XzIxXzMzID0gbTIxICogbTMzIC0gbTMxICogbTIzO1xuICAgICAgICBjb25zdCBkZXRfMjFfMzIgPSBtMjEgKiBtMzIgLSBtMzEgKiBtMjI7XG4gICAgICAgIGNvbnN0IGRldF8yMF8zMyA9IG0yMCAqIG0zMyAtIG0zMCAqIG0yMztcbiAgICAgICAgY29uc3QgZGV0XzIwXzMyID0gbTIwICogbTMyIC0gbTIyICogbTMwO1xuICAgICAgICBjb25zdCBkZXRfMjBfMzEgPSBtMjAgKiBtMzEgLSBtMzAgKiBtMjE7XG4gICAgICAgIGNvbnN0IGNvZmFjdF8wMCA9ICsobTExICogZGV0XzIyXzMzIC0gbTEyICogZGV0XzIxXzMzICsgbTEzICogZGV0XzIxXzMyKTtcbiAgICAgICAgY29uc3QgY29mYWN0XzAxID0gLShtMTAgKiBkZXRfMjJfMzMgLSBtMTIgKiBkZXRfMjBfMzMgKyBtMTMgKiBkZXRfMjBfMzIpO1xuICAgICAgICBjb25zdCBjb2ZhY3RfMDIgPSArKG0xMCAqIGRldF8yMV8zMyAtIG0xMSAqIGRldF8yMF8zMyArIG0xMyAqIGRldF8yMF8zMSk7XG4gICAgICAgIGNvbnN0IGNvZmFjdF8wMyA9IC0obTEwICogZGV0XzIxXzMyIC0gbTExICogZGV0XzIwXzMyICsgbTEyICogZGV0XzIwXzMxKTtcbiAgICAgICAgY29uc3QgZGV0ID0gbTAwICogY29mYWN0XzAwICsgbTAxICogY29mYWN0XzAxICsgbTAyICogY29mYWN0XzAyICsgbTAzICogY29mYWN0XzAzO1xuICAgICAgICBpZiAoZGV0ID09PSAwKSB7XG4gICAgICAgICAgICBjb3B5KHNvdXJjZSwgcmVzdWx0KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkZXRJbnYgPSAxIC8gZGV0O1xuICAgICAgICBjb25zdCBkZXRfMTJfMzMgPSBtMTIgKiBtMzMgLSBtMzIgKiBtMTM7XG4gICAgICAgIGNvbnN0IGRldF8xMV8zMyA9IG0xMSAqIG0zMyAtIG0zMSAqIG0xMztcbiAgICAgICAgY29uc3QgZGV0XzExXzMyID0gbTExICogbTMyIC0gbTMxICogbTEyO1xuICAgICAgICBjb25zdCBkZXRfMTBfMzMgPSBtMTAgKiBtMzMgLSBtMzAgKiBtMTM7XG4gICAgICAgIGNvbnN0IGRldF8xMF8zMiA9IG0xMCAqIG0zMiAtIG0zMCAqIG0xMjtcbiAgICAgICAgY29uc3QgZGV0XzEwXzMxID0gbTEwICogbTMxIC0gbTMwICogbTExO1xuICAgICAgICBjb25zdCBkZXRfMTJfMjMgPSBtMTIgKiBtMjMgLSBtMjIgKiBtMTM7XG4gICAgICAgIGNvbnN0IGRldF8xMV8yMyA9IG0xMSAqIG0yMyAtIG0yMSAqIG0xMztcbiAgICAgICAgY29uc3QgZGV0XzExXzIyID0gbTExICogbTIyIC0gbTIxICogbTEyO1xuICAgICAgICBjb25zdCBkZXRfMTBfMjMgPSBtMTAgKiBtMjMgLSBtMjAgKiBtMTM7XG4gICAgICAgIGNvbnN0IGRldF8xMF8yMiA9IG0xMCAqIG0yMiAtIG0yMCAqIG0xMjtcbiAgICAgICAgY29uc3QgZGV0XzEwXzIxID0gbTEwICogbTIxIC0gbTIwICogbTExO1xuICAgICAgICBjb25zdCBjb2ZhY3RfMTAgPSAtKG0wMSAqIGRldF8yMl8zMyAtIG0wMiAqIGRldF8yMV8zMyArIG0wMyAqIGRldF8yMV8zMik7XG4gICAgICAgIGNvbnN0IGNvZmFjdF8xMSA9ICsobTAwICogZGV0XzIyXzMzIC0gbTAyICogZGV0XzIwXzMzICsgbTAzICogZGV0XzIwXzMyKTtcbiAgICAgICAgY29uc3QgY29mYWN0XzEyID0gLShtMDAgKiBkZXRfMjFfMzMgLSBtMDEgKiBkZXRfMjBfMzMgKyBtMDMgKiBkZXRfMjBfMzEpO1xuICAgICAgICBjb25zdCBjb2ZhY3RfMTMgPSArKG0wMCAqIGRldF8yMV8zMiAtIG0wMSAqIGRldF8yMF8zMiArIG0wMiAqIGRldF8yMF8zMSk7XG4gICAgICAgIGNvbnN0IGNvZmFjdF8yMCA9ICsobTAxICogZGV0XzEyXzMzIC0gbTAyICogZGV0XzExXzMzICsgbTAzICogZGV0XzExXzMyKTtcbiAgICAgICAgY29uc3QgY29mYWN0XzIxID0gLShtMDAgKiBkZXRfMTJfMzMgLSBtMDIgKiBkZXRfMTBfMzMgKyBtMDMgKiBkZXRfMTBfMzIpO1xuICAgICAgICBjb25zdCBjb2ZhY3RfMjIgPSArKG0wMCAqIGRldF8xMV8zMyAtIG0wMSAqIGRldF8xMF8zMyArIG0wMyAqIGRldF8xMF8zMSk7XG4gICAgICAgIGNvbnN0IGNvZmFjdF8yMyA9IC0obTAwICogZGV0XzExXzMyIC0gbTAxICogZGV0XzEwXzMyICsgbTAyICogZGV0XzEwXzMxKTtcbiAgICAgICAgY29uc3QgY29mYWN0XzMwID0gLShtMDEgKiBkZXRfMTJfMjMgLSBtMDIgKiBkZXRfMTFfMjMgKyBtMDMgKiBkZXRfMTFfMjIpO1xuICAgICAgICBjb25zdCBjb2ZhY3RfMzEgPSArKG0wMCAqIGRldF8xMl8yMyAtIG0wMiAqIGRldF8xMF8yMyArIG0wMyAqIGRldF8xMF8yMik7XG4gICAgICAgIGNvbnN0IGNvZmFjdF8zMiA9IC0obTAwICogZGV0XzExXzIzIC0gbTAxICogZGV0XzEwXzIzICsgbTAzICogZGV0XzEwXzIxKTtcbiAgICAgICAgY29uc3QgY29mYWN0XzMzID0gKyhtMDAgKiBkZXRfMTFfMjIgLSBtMDEgKiBkZXRfMTBfMjIgKyBtMDIgKiBkZXRfMTBfMjEpO1xuICAgICAgICBmcm9tVmFsdWVzVG9SZWYoY29mYWN0XzAwICogZGV0SW52LCBjb2ZhY3RfMTAgKiBkZXRJbnYsIGNvZmFjdF8yMCAqIGRldEludiwgY29mYWN0XzMwICogZGV0SW52LCBjb2ZhY3RfMDEgKiBkZXRJbnYsIGNvZmFjdF8xMSAqIGRldEludiwgY29mYWN0XzIxICogZGV0SW52LCBjb2ZhY3RfMzEgKiBkZXRJbnYsIGNvZmFjdF8wMiAqIGRldEludiwgY29mYWN0XzEyICogZGV0SW52LCBjb2ZhY3RfMjIgKiBkZXRJbnYsIGNvZmFjdF8zMiAqIGRldEludiwgY29mYWN0XzAzICogZGV0SW52LCBjb2ZhY3RfMTMgKiBkZXRJbnYsIGNvZmFjdF8yMyAqIGRldEludiwgY29mYWN0XzMzICogZGV0SW52LCByZXN1bHQpO1xuICAgICAgICAvLyB0c2xpbnQ6ZW5hYmxlOnZhcmlhYmxlLW5hbWVcbiAgICB9XG4gICAgTWF0cml4LmludmVydFRvUmVmID0gaW52ZXJ0VG9SZWY7XG4gICAgLyoqXG4gICAgICogYWRkIGEgdmFsdWUgYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvbiBpbiB0aGUgY3VycmVudCBNYXRyaXhcbiAgICAgKiBAcGFyYW0gaW5kZXggLSB0aGUgaW5kZXggb2YgdGhlIHZhbHVlIHdpdGhpbiB0aGUgbWF0cml4LiBiZXR3ZWVuIDAgYW5kIDE1LlxuICAgICAqIEBwYXJhbSB2YWx1ZSAtIHRoZSB2YWx1ZSB0byBiZSBhZGRlZFxuICAgICAqIEByZXR1cm5zIHRoZSBjdXJyZW50IHVwZGF0ZWQgbWF0cml4XG4gICAgICovXG4gICAgZnVuY3Rpb24gYWRkQXRJbmRleChzZWxmLCBpbmRleCwgdmFsdWUpIHtcbiAgICAgICAgc2VsZi5fbVtpbmRleF0gKz0gdmFsdWU7XG4gICAgICAgIF9tYXJrQXNVcGRhdGVkKHNlbGYpO1xuICAgIH1cbiAgICBNYXRyaXguYWRkQXRJbmRleCA9IGFkZEF0SW5kZXg7XG4gICAgLyoqXG4gICAgICogbXV0aXBseSB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uIGluIHRoZSBjdXJyZW50IE1hdHJpeCBieSBhIHZhbHVlXG4gICAgICogQHBhcmFtIGluZGV4IC0gdGhlIGluZGV4IG9mIHRoZSB2YWx1ZSB3aXRoaW4gdGhlIG1hdHJpeC4gYmV0d2VlbiAwIGFuZCAxNS5cbiAgICAgKiBAcGFyYW0gdmFsdWUgLSB0aGUgdmFsdWUgdG8gYmUgYWRkZWRcbiAgICAgKiBAcmV0dXJucyB0aGUgY3VycmVudCB1cGRhdGVkIG1hdHJpeFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG11bHRpcGx5QXRJbmRleChzZWxmLCBpbmRleCwgdmFsdWUpIHtcbiAgICAgICAgc2VsZi5fbVtpbmRleF0gKj0gdmFsdWU7XG4gICAgICAgIF9tYXJrQXNVcGRhdGVkKHNlbGYpO1xuICAgICAgICByZXR1cm4gc2VsZjtcbiAgICB9XG4gICAgTWF0cml4Lm11bHRpcGx5QXRJbmRleCA9IG11bHRpcGx5QXRJbmRleDtcbiAgICAvKipcbiAgICAgKiBJbnNlcnRzIHRoZSB0cmFuc2xhdGlvbiB2ZWN0b3IgKHVzaW5nIDMgZmxvYXRzKSBpbiB0aGUgY3VycmVudCBtYXRyaXhcbiAgICAgKiBAcGFyYW0geCAtIGRlZmluZXMgdGhlIDFzdCBjb21wb25lbnQgb2YgdGhlIHRyYW5zbGF0aW9uXG4gICAgICogQHBhcmFtIHkgLSBkZWZpbmVzIHRoZSAybmQgY29tcG9uZW50IG9mIHRoZSB0cmFuc2xhdGlvblxuICAgICAqIEBwYXJhbSB6IC0gZGVmaW5lcyB0aGUgM3JkIGNvbXBvbmVudCBvZiB0aGUgdHJhbnNsYXRpb25cbiAgICAgKiBAcmV0dXJucyB0aGUgY3VycmVudCB1cGRhdGVkIG1hdHJpeFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNldFRyYW5zbGF0aW9uRnJvbUZsb2F0cyhzZWxmLCB4LCB5LCB6KSB7XG4gICAgICAgIHNlbGYuX21bMTJdID0geDtcbiAgICAgICAgc2VsZi5fbVsxM10gPSB5O1xuICAgICAgICBzZWxmLl9tWzE0XSA9IHo7XG4gICAgICAgIF9tYXJrQXNVcGRhdGVkKHNlbGYpO1xuICAgIH1cbiAgICBNYXRyaXguc2V0VHJhbnNsYXRpb25Gcm9tRmxvYXRzID0gc2V0VHJhbnNsYXRpb25Gcm9tRmxvYXRzO1xuICAgIC8qKlxuICAgICAqIEluc2VydHMgdGhlIHRyYW5zbGF0aW9uIHZlY3RvciBpbiB0aGUgY3VycmVudCBtYXRyaXhcbiAgICAgKiBAcGFyYW0gdmVjdG9yMyAtIGRlZmluZXMgdGhlIHRyYW5zbGF0aW9uIHRvIGluc2VydFxuICAgICAqIEByZXR1cm5zIHRoZSBjdXJyZW50IHVwZGF0ZWQgbWF0cml4XG4gICAgICovXG4gICAgZnVuY3Rpb24gc2V0VHJhbnNsYXRpb24oc2VsZiwgdmVjdG9yMykge1xuICAgICAgICBzZXRUcmFuc2xhdGlvbkZyb21GbG9hdHMoc2VsZiwgdmVjdG9yMy54LCB2ZWN0b3IzLnksIHZlY3RvcjMueik7XG4gICAgfVxuICAgIE1hdHJpeC5zZXRUcmFuc2xhdGlvbiA9IHNldFRyYW5zbGF0aW9uO1xuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHRyYW5zbGF0aW9uIHZhbHVlIG9mIHRoZSBjdXJyZW50IG1hdHJpeFxuICAgICAqIEByZXR1cm5zIGEgbmV3IFZlY3RvcjMgYXMgdGhlIGV4dHJhY3RlZCB0cmFuc2xhdGlvbiBmcm9tIHRoZSBtYXRyaXhcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRUcmFuc2xhdGlvbihzZWxmKSB7XG4gICAgICAgIHJldHVybiBWZWN0b3IzLmNyZWF0ZShzZWxmLl9tWzEyXSwgc2VsZi5fbVsxM10sIHNlbGYuX21bMTRdKTtcbiAgICB9XG4gICAgTWF0cml4LmdldFRyYW5zbGF0aW9uID0gZ2V0VHJhbnNsYXRpb247XG4gICAgLyoqXG4gICAgICogRmlsbCBhIFZlY3RvcjMgd2l0aCB0aGUgZXh0cmFjdGVkIHRyYW5zbGF0aW9uIGZyb20gdGhlIG1hdHJpeFxuICAgICAqIEBwYXJhbSByZXN1bHQgLSBkZWZpbmVzIHRoZSBWZWN0b3IzIHdoZXJlIHRvIHN0b3JlIHRoZSB0cmFuc2xhdGlvblxuICAgICAqIEByZXR1cm5zIHRoZSBjdXJyZW50IG1hdHJpeFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldFRyYW5zbGF0aW9uVG9SZWYoc2VsZiwgcmVzdWx0KSB7XG4gICAgICAgIHJlc3VsdC54ID0gc2VsZi5fbVsxMl07XG4gICAgICAgIHJlc3VsdC55ID0gc2VsZi5fbVsxM107XG4gICAgICAgIHJlc3VsdC56ID0gc2VsZi5fbVsxNF07XG4gICAgfVxuICAgIE1hdHJpeC5nZXRUcmFuc2xhdGlvblRvUmVmID0gZ2V0VHJhbnNsYXRpb25Ub1JlZjtcbiAgICAvKipcbiAgICAgKiBSZW1vdmUgcm90YXRpb24gYW5kIHNjYWxpbmcgcGFydCBmcm9tIHRoZSBtYXRyaXhcbiAgICAgKiBAcmV0dXJucyB0aGUgdXBkYXRlZCBtYXRyaXhcbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZW1vdmVSb3RhdGlvbkFuZFNjYWxpbmcoc2VsZikge1xuICAgICAgICBjb25zdCBtID0gc2VsZi5fbTtcbiAgICAgICAgZnJvbVZhbHVlc1RvUmVmKDEuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAxLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMS4wLCAwLjAsIG1bMTJdLCBtWzEzXSwgbVsxNF0sIG1bMTVdLCBzZWxmKTtcbiAgICAgICAgX3VwZGF0ZUlkZW50aXR5U3RhdHVzKHNlbGYsIG1bMTJdID09PSAwICYmIG1bMTNdID09PSAwICYmIG1bMTRdID09PSAwICYmIG1bMTVdID09PSAxKTtcbiAgICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfVxuICAgIE1hdHJpeC5yZW1vdmVSb3RhdGlvbkFuZFNjYWxpbmcgPSByZW1vdmVSb3RhdGlvbkFuZFNjYWxpbmc7XG4gICAgLyoqXG4gICAgICogTXVsdGlwbHkgdHdvIG1hdHJpY2VzXG4gICAgICogQHBhcmFtIG90aGVyIC0gZGVmaW5lcyB0aGUgc2Vjb25kIG9wZXJhbmRcbiAgICAgKiBAcmV0dXJucyBhIG5ldyBtYXRyaXggc2V0IHdpdGggdGhlIG11bHRpcGxpY2F0aW9uIHJlc3VsdCBvZiB0aGUgY3VycmVudCBNYXRyaXggYW5kIHRoZSBnaXZlbiBvbmVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtdWx0aXBseShzZWxmLCBvdGhlcikge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBjcmVhdGUoKTtcbiAgICAgICAgbXVsdGlwbHlUb1JlZihzZWxmLCBvdGhlciwgcmVzdWx0KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgTWF0cml4Lm11bHRpcGx5ID0gbXVsdGlwbHk7XG4gICAgLyoqXG4gICAgICogQ29weSB0aGUgY3VycmVudCBtYXRyaXggZnJvbSB0aGUgZ2l2ZW4gb25lXG4gICAgICogQHBhcmFtIG90aGVyIC0gZGVmaW5lcyB0aGUgc291cmNlIG1hdHJpeFxuICAgICAqIEByZXR1cm5zIHRoZSBjdXJyZW50IHVwZGF0ZWQgbWF0cml4XG4gICAgICovXG4gICAgZnVuY3Rpb24gY29weShmcm9tLCBkZXN0KSB7XG4gICAgICAgIGNvcHlUb0FycmF5KGZyb20sIGRlc3QuX20pO1xuICAgICAgICBfdXBkYXRlSWRlbnRpdHlTdGF0dXMoZGVzdCwgZnJvbS5pc0lkZW50aXR5LCBmcm9tLl9pc0lkZW50aXR5RGlydHksIGZyb20uaXNJZGVudGl0eTN4MiwgZnJvbS5faXNJZGVudGl0eTN4MkRpcnR5KTtcbiAgICB9XG4gICAgTWF0cml4LmNvcHkgPSBjb3B5O1xuICAgIC8qKlxuICAgICAqIFBvcHVsYXRlcyB0aGUgZ2l2ZW4gYXJyYXkgZnJvbSB0aGUgc3RhcnRpbmcgaW5kZXggd2l0aCB0aGUgY3VycmVudCBtYXRyaXggdmFsdWVzXG4gICAgICogQHBhcmFtIGFycmF5IC0gZGVmaW5lcyB0aGUgdGFyZ2V0IGFycmF5XG4gICAgICogQHBhcmFtIG9mZnNldCAtIGRlZmluZXMgdGhlIG9mZnNldCBpbiB0aGUgdGFyZ2V0IGFycmF5IHdoZXJlIHRvIHN0YXJ0IHN0b3JpbmcgdmFsdWVzXG4gICAgICogQHJldHVybnMgdGhlIGN1cnJlbnQgbWF0cml4XG4gICAgICovXG4gICAgZnVuY3Rpb24gY29weVRvQXJyYXkoc2VsZiwgYXJyYXlEZXN0LCBvZmZzZXREZXN0ID0gMCkge1xuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgMTY7IGluZGV4KyspIHtcbiAgICAgICAgICAgIGFycmF5RGVzdFtvZmZzZXREZXN0ICsgaW5kZXhdID0gc2VsZi5fbVtpbmRleF07XG4gICAgICAgIH1cbiAgICB9XG4gICAgTWF0cml4LmNvcHlUb0FycmF5ID0gY29weVRvQXJyYXk7XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgZ2l2ZW4gbWF0cml4IFwicmVzdWx0XCIgd2l0aCB0aGUgbXVsdGlwbGljYXRpb24gcmVzdWx0IG9mIHRoZSBjdXJyZW50IE1hdHJpeCBhbmQgdGhlIGdpdmVuIG9uZVxuICAgICAqIEBwYXJhbSBvdGhlciAtIGRlZmluZXMgdGhlIHNlY29uZCBvcGVyYW5kXG4gICAgICogQHBhcmFtIHJlc3VsdCAtIGRlZmluZXMgdGhlIG1hdHJpeCB3aGVyZSB0byBzdG9yZSB0aGUgbXVsdGlwbGljYXRpb25cbiAgICAgKiBAcmV0dXJucyB0aGUgY3VycmVudCBtYXRyaXhcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtdWx0aXBseVRvUmVmKHNlbGYsIG90aGVyLCByZXN1bHQpIHtcbiAgICAgICAgaWYgKHNlbGYuaXNJZGVudGl0eSkge1xuICAgICAgICAgICAgY29weShvdGhlciwgcmVzdWx0KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3RoZXIuaXNJZGVudGl0eSkge1xuICAgICAgICAgICAgY29weShzZWxmLCByZXN1bHQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIG11bHRpcGx5VG9BcnJheShzZWxmLCBvdGhlciwgcmVzdWx0Ll9tLCAwKTtcbiAgICAgICAgX21hcmtBc1VwZGF0ZWQocmVzdWx0KTtcbiAgICB9XG4gICAgTWF0cml4Lm11bHRpcGx5VG9SZWYgPSBtdWx0aXBseVRvUmVmO1xuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIEZsb2F0QXJyYXkgXCJyZXN1bHRcIiBmcm9tIHRoZSBnaXZlbiBpbmRleCBcIm9mZnNldFwiIHdpdGggdGhlIG11bHRpcGxpY2F0aW9uIG9mIHRoZSBjdXJyZW50IG1hdHJpeCBhbmQgdGhlIGdpdmVuIG9uZVxuICAgICAqIEBwYXJhbSBvdGhlciAtIGRlZmluZXMgdGhlIHNlY29uZCBvcGVyYW5kXG4gICAgICogQHBhcmFtIHJlc3VsdCAtIGRlZmluZXMgdGhlIGFycmF5IHdoZXJlIHRvIHN0b3JlIHRoZSBtdWx0aXBsaWNhdGlvblxuICAgICAqIEBwYXJhbSBvZmZzZXQgLSBkZWZpbmVzIHRoZSBvZmZzZXQgaW4gdGhlIHRhcmdldCBhcnJheSB3aGVyZSB0byBzdGFydCBzdG9yaW5nIHZhbHVlc1xuICAgICAqIEByZXR1cm5zIHRoZSBjdXJyZW50IG1hdHJpeFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG11bHRpcGx5VG9BcnJheShzZWxmLCBvdGhlciwgcmVzdWx0LCBvZmZzZXQpIHtcbiAgICAgICAgY29uc3QgbSA9IHNlbGYuX207XG4gICAgICAgIGNvbnN0IG90aGVyTSA9IG90aGVyLl9tO1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZTpvbmUtdmFyaWFibGUtcGVyLWRlY2xhcmF0aW9uXG4gICAgICAgIGNvbnN0IHRtMCA9IG1bMF0sIHRtMSA9IG1bMV0sIHRtMiA9IG1bMl0sIHRtMyA9IG1bM107XG4gICAgICAgIGNvbnN0IHRtNCA9IG1bNF0sIHRtNSA9IG1bNV0sIHRtNiA9IG1bNl0sIHRtNyA9IG1bN107XG4gICAgICAgIGNvbnN0IHRtOCA9IG1bOF0sIHRtOSA9IG1bOV0sIHRtMTAgPSBtWzEwXSwgdG0xMSA9IG1bMTFdO1xuICAgICAgICBjb25zdCB0bTEyID0gbVsxMl0sIHRtMTMgPSBtWzEzXSwgdG0xNCA9IG1bMTRdLCB0bTE1ID0gbVsxNV07XG4gICAgICAgIGNvbnN0IG9tMCA9IG90aGVyTVswXSwgb20xID0gb3RoZXJNWzFdLCBvbTIgPSBvdGhlck1bMl0sIG9tMyA9IG90aGVyTVszXTtcbiAgICAgICAgY29uc3Qgb200ID0gb3RoZXJNWzRdLCBvbTUgPSBvdGhlck1bNV0sIG9tNiA9IG90aGVyTVs2XSwgb203ID0gb3RoZXJNWzddO1xuICAgICAgICBjb25zdCBvbTggPSBvdGhlck1bOF0sIG9tOSA9IG90aGVyTVs5XSwgb20xMCA9IG90aGVyTVsxMF0sIG9tMTEgPSBvdGhlck1bMTFdO1xuICAgICAgICBjb25zdCBvbTEyID0gb3RoZXJNWzEyXSwgb20xMyA9IG90aGVyTVsxM10sIG9tMTQgPSBvdGhlck1bMTRdLCBvbTE1ID0gb3RoZXJNWzE1XTtcbiAgICAgICAgLy8gdHNsaW50OmVuYWJsZTpvbmUtdmFyaWFibGUtcGVyLWRlY2xhcmF0aW9uXG4gICAgICAgIHJlc3VsdFtvZmZzZXRdID0gdG0wICogb20wICsgdG0xICogb200ICsgdG0yICogb204ICsgdG0zICogb20xMjtcbiAgICAgICAgcmVzdWx0W29mZnNldCArIDFdID0gdG0wICogb20xICsgdG0xICogb201ICsgdG0yICogb205ICsgdG0zICogb20xMztcbiAgICAgICAgcmVzdWx0W29mZnNldCArIDJdID0gdG0wICogb20yICsgdG0xICogb202ICsgdG0yICogb20xMCArIHRtMyAqIG9tMTQ7XG4gICAgICAgIHJlc3VsdFtvZmZzZXQgKyAzXSA9IHRtMCAqIG9tMyArIHRtMSAqIG9tNyArIHRtMiAqIG9tMTEgKyB0bTMgKiBvbTE1O1xuICAgICAgICByZXN1bHRbb2Zmc2V0ICsgNF0gPSB0bTQgKiBvbTAgKyB0bTUgKiBvbTQgKyB0bTYgKiBvbTggKyB0bTcgKiBvbTEyO1xuICAgICAgICByZXN1bHRbb2Zmc2V0ICsgNV0gPSB0bTQgKiBvbTEgKyB0bTUgKiBvbTUgKyB0bTYgKiBvbTkgKyB0bTcgKiBvbTEzO1xuICAgICAgICByZXN1bHRbb2Zmc2V0ICsgNl0gPSB0bTQgKiBvbTIgKyB0bTUgKiBvbTYgKyB0bTYgKiBvbTEwICsgdG03ICogb20xNDtcbiAgICAgICAgcmVzdWx0W29mZnNldCArIDddID0gdG00ICogb20zICsgdG01ICogb203ICsgdG02ICogb20xMSArIHRtNyAqIG9tMTU7XG4gICAgICAgIHJlc3VsdFtvZmZzZXQgKyA4XSA9IHRtOCAqIG9tMCArIHRtOSAqIG9tNCArIHRtMTAgKiBvbTggKyB0bTExICogb20xMjtcbiAgICAgICAgcmVzdWx0W29mZnNldCArIDldID0gdG04ICogb20xICsgdG05ICogb201ICsgdG0xMCAqIG9tOSArIHRtMTEgKiBvbTEzO1xuICAgICAgICByZXN1bHRbb2Zmc2V0ICsgMTBdID0gdG04ICogb20yICsgdG05ICogb202ICsgdG0xMCAqIG9tMTAgKyB0bTExICogb20xNDtcbiAgICAgICAgcmVzdWx0W29mZnNldCArIDExXSA9IHRtOCAqIG9tMyArIHRtOSAqIG9tNyArIHRtMTAgKiBvbTExICsgdG0xMSAqIG9tMTU7XG4gICAgICAgIHJlc3VsdFtvZmZzZXQgKyAxMl0gPSB0bTEyICogb20wICsgdG0xMyAqIG9tNCArIHRtMTQgKiBvbTggKyB0bTE1ICogb20xMjtcbiAgICAgICAgcmVzdWx0W29mZnNldCArIDEzXSA9IHRtMTIgKiBvbTEgKyB0bTEzICogb201ICsgdG0xNCAqIG9tOSArIHRtMTUgKiBvbTEzO1xuICAgICAgICByZXN1bHRbb2Zmc2V0ICsgMTRdID0gdG0xMiAqIG9tMiArIHRtMTMgKiBvbTYgKyB0bTE0ICogb20xMCArIHRtMTUgKiBvbTE0O1xuICAgICAgICByZXN1bHRbb2Zmc2V0ICsgMTVdID0gdG0xMiAqIG9tMyArIHRtMTMgKiBvbTcgKyB0bTE0ICogb20xMSArIHRtMTUgKiBvbTE1O1xuICAgIH1cbiAgICBNYXRyaXgubXVsdGlwbHlUb0FycmF5ID0gbXVsdGlwbHlUb0FycmF5O1xuICAgIC8qKlxuICAgICAqIENoZWNrIGVxdWFsaXR5IGJldHdlZW4gc2VsZiBtYXRyaXggYW5kIGEgc2Vjb25kIG9uZVxuICAgICAqIEBwYXJhbSB2YWx1ZSAtIGRlZmluZXMgdGhlIHNlY29uZCBtYXRyaXggdG8gY29tcGFyZVxuICAgICAqIEByZXR1cm5zIHRydWUgaXMgdGhlIGN1cnJlbnQgbWF0cml4IGFuZCB0aGUgZ2l2ZW4gb25lIHZhbHVlcyBhcmUgc3RyaWN0bHkgZXF1YWxcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBlcXVhbHMoc2VsZiwgdmFsdWUpIHtcbiAgICAgICAgY29uc3Qgb3RoZXIgPSB2YWx1ZTtcbiAgICAgICAgaWYgKCFvdGhlcikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZWxmLmlzSWRlbnRpdHkgfHwgb3RoZXIuaXNJZGVudGl0eSkge1xuICAgICAgICAgICAgaWYgKCFzZWxmLl9pc0lkZW50aXR5RGlydHkgJiYgIW90aGVyLl9pc0lkZW50aXR5RGlydHkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5pc0lkZW50aXR5ICYmIG90aGVyLmlzSWRlbnRpdHk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbSA9IHNlbGYuX207XG4gICAgICAgIGNvbnN0IG9tID0gb3RoZXIuX207XG4gICAgICAgIHJldHVybiAobVswXSA9PT0gb21bMF0gJiZcbiAgICAgICAgICAgIG1bMV0gPT09IG9tWzFdICYmXG4gICAgICAgICAgICBtWzJdID09PSBvbVsyXSAmJlxuICAgICAgICAgICAgbVszXSA9PT0gb21bM10gJiZcbiAgICAgICAgICAgIG1bNF0gPT09IG9tWzRdICYmXG4gICAgICAgICAgICBtWzVdID09PSBvbVs1XSAmJlxuICAgICAgICAgICAgbVs2XSA9PT0gb21bNl0gJiZcbiAgICAgICAgICAgIG1bN10gPT09IG9tWzddICYmXG4gICAgICAgICAgICBtWzhdID09PSBvbVs4XSAmJlxuICAgICAgICAgICAgbVs5XSA9PT0gb21bOV0gJiZcbiAgICAgICAgICAgIG1bMTBdID09PSBvbVsxMF0gJiZcbiAgICAgICAgICAgIG1bMTFdID09PSBvbVsxMV0gJiZcbiAgICAgICAgICAgIG1bMTJdID09PSBvbVsxMl0gJiZcbiAgICAgICAgICAgIG1bMTNdID09PSBvbVsxM10gJiZcbiAgICAgICAgICAgIG1bMTRdID09PSBvbVsxNF0gJiZcbiAgICAgICAgICAgIG1bMTVdID09PSBvbVsxNV0pO1xuICAgIH1cbiAgICBNYXRyaXguZXF1YWxzID0gZXF1YWxzO1xuICAgIC8qKlxuICAgICAqIENsb25lIHRoZSBjdXJyZW50IG1hdHJpeFxuICAgICAqIEByZXR1cm5zIGEgbmV3IG1hdHJpeCBmcm9tIHRoZSBjdXJyZW50IG1hdHJpeFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lKHNlbGYpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gY3JlYXRlKCk7XG4gICAgICAgIGNvcHkoc2VsZiwgcmVzdWx0KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgTWF0cml4LmNsb25lID0gY2xvbmU7XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgaGFzaCBjb2RlIG9mIHRoZSBjdXJyZW50IG1hdHJpeFxuICAgICAqIEByZXR1cm5zIHRoZSBoYXNoIGNvZGVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRIYXNoQ29kZShzZWxmKSB7XG4gICAgICAgIGxldCBoYXNoID0gc2VsZi5fbVswXSB8fCAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IDE2OyBpKyspIHtcbiAgICAgICAgICAgIGhhc2ggPSAoaGFzaCAqIDM5NykgXiAoc2VsZi5fbVtpXSB8fCAwKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGFzaDtcbiAgICB9XG4gICAgTWF0cml4LmdldEhhc2hDb2RlID0gZ2V0SGFzaENvZGU7XG4gICAgLyoqXG4gICAgICogRGVjb21wb3NlcyB0aGUgY3VycmVudCBNYXRyaXggaW50byBhIHRyYW5zbGF0aW9uLCByb3RhdGlvbiBhbmQgc2NhbGluZyBjb21wb25lbnRzXG4gICAgICogQHBhcmFtIHNjYWxlIC0gZGVmaW5lcyB0aGUgc2NhbGUgdmVjdG9yMyBnaXZlbiBhcyBhIHJlZmVyZW5jZSB0byB1cGRhdGVcbiAgICAgKiBAcGFyYW0gcm90YXRpb24gLSBkZWZpbmVzIHRoZSByb3RhdGlvbiBxdWF0ZXJuaW9uIGdpdmVuIGFzIGEgcmVmZXJlbmNlIHRvIHVwZGF0ZVxuICAgICAqIEBwYXJhbSB0cmFuc2xhdGlvbiAtIGRlZmluZXMgdGhlIHRyYW5zbGF0aW9uIHZlY3RvcjMgZ2l2ZW4gYXMgYSByZWZlcmVuY2UgdG8gdXBkYXRlXG4gICAgICogQHJldHVybnMgdHJ1ZSBpZiBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWxcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBkZWNvbXBvc2Uoc2VsZiwgc2NhbGUsIHJvdGF0aW9uLCB0cmFuc2xhdGlvbikge1xuICAgICAgICBpZiAoc2VsZi5pc0lkZW50aXR5KSB7XG4gICAgICAgICAgICBpZiAodHJhbnNsYXRpb24pIHtcbiAgICAgICAgICAgICAgICB0cmFuc2xhdGlvbi54ID0gMDtcbiAgICAgICAgICAgICAgICB0cmFuc2xhdGlvbi55ID0gMDtcbiAgICAgICAgICAgICAgICB0cmFuc2xhdGlvbi56ID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzY2FsZSkge1xuICAgICAgICAgICAgICAgIHNjYWxlLnggPSAxO1xuICAgICAgICAgICAgICAgIHNjYWxlLnkgPSAxO1xuICAgICAgICAgICAgICAgIHNjYWxlLnogPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJvdGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgcm90YXRpb24udyA9IDE7XG4gICAgICAgICAgICAgICAgcm90YXRpb24ueCA9IDA7XG4gICAgICAgICAgICAgICAgcm90YXRpb24ueSA9IDA7XG4gICAgICAgICAgICAgICAgcm90YXRpb24ueiA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtID0gc2VsZi5fbTtcbiAgICAgICAgaWYgKHRyYW5zbGF0aW9uKSB7XG4gICAgICAgICAgICB0cmFuc2xhdGlvbi54ID0gbVsxMl07XG4gICAgICAgICAgICB0cmFuc2xhdGlvbi55ID0gbVsxM107XG4gICAgICAgICAgICB0cmFuc2xhdGlvbi56ID0gbVsxNF07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXNlZFNjYWxlID0gc2NhbGUgfHwgVmVjdG9yMy5aZXJvKCk7XG4gICAgICAgIHVzZWRTY2FsZS54ID0gTWF0aC5zcXJ0KG1bMF0gKiBtWzBdICsgbVsxXSAqIG1bMV0gKyBtWzJdICogbVsyXSk7XG4gICAgICAgIHVzZWRTY2FsZS55ID0gTWF0aC5zcXJ0KG1bNF0gKiBtWzRdICsgbVs1XSAqIG1bNV0gKyBtWzZdICogbVs2XSk7XG4gICAgICAgIHVzZWRTY2FsZS56ID0gTWF0aC5zcXJ0KG1bOF0gKiBtWzhdICsgbVs5XSAqIG1bOV0gKyBtWzEwXSAqIG1bMTBdKTtcbiAgICAgICAgaWYgKGRldGVybWluYW50KHNlbGYpIDw9IDApIHtcbiAgICAgICAgICAgIHVzZWRTY2FsZS55ICo9IC0xO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1c2VkU2NhbGUueCA9PT0gMCB8fCB1c2VkU2NhbGUueSA9PT0gMCB8fCB1c2VkU2NhbGUueiA9PT0gMCkge1xuICAgICAgICAgICAgaWYgKHJvdGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgcm90YXRpb24udyA9IDE7XG4gICAgICAgICAgICAgICAgcm90YXRpb24ueCA9IDA7XG4gICAgICAgICAgICAgICAgcm90YXRpb24ueSA9IDA7XG4gICAgICAgICAgICAgICAgcm90YXRpb24ueiA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJvdGF0aW9uKSB7XG4gICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6b25lLXZhcmlhYmxlLXBlci1kZWNsYXJhdGlvblxuICAgICAgICAgICAgY29uc3Qgc3ggPSAxIC8gdXNlZFNjYWxlLngsIHN5ID0gMSAvIHVzZWRTY2FsZS55LCBzeiA9IDEgLyB1c2VkU2NhbGUuejtcbiAgICAgICAgICAgIGNvbnN0IHRtcE1hdHJpeCA9IGNyZWF0ZSgpO1xuICAgICAgICAgICAgZnJvbVZhbHVlc1RvUmVmKG1bMF0gKiBzeCwgbVsxXSAqIHN4LCBtWzJdICogc3gsIDAuMCwgbVs0XSAqIHN5LCBtWzVdICogc3ksIG1bNl0gKiBzeSwgMC4wLCBtWzhdICogc3osIG1bOV0gKiBzeiwgbVsxMF0gKiBzeiwgMC4wLCAwLjAsIDAuMCwgMC4wLCAxLjAsIHRtcE1hdHJpeCk7XG4gICAgICAgICAgICBRdWF0ZXJuaW9uLmZyb21Sb3RhdGlvbk1hdHJpeFRvUmVmKHRtcE1hdHJpeCwgcm90YXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBNYXRyaXguZGVjb21wb3NlID0gZGVjb21wb3NlO1xuICAgIC8qKlxuICAgICAqIEdldHMgc3BlY2lmaWMgcm93IG9mIHRoZSBtYXRyaXhcbiAgICAgKiBAcGFyYW0gaW5kZXggLSBkZWZpbmVzIHRoZSBudW1iZXIgb2YgdGhlIHJvdyB0byBnZXRcbiAgICAgKiBAcmV0dXJucyB0aGUgaW5kZXgtdGggcm93IG9mIHRoZSBjdXJyZW50IG1hdHJpeCBhcyBhIG5ldyBWZWN0b3I0XG4gICAgICovXG4gICAgLy8gVE9ET1xuICAgIC8vIGV4cG9ydCBmdW5jdGlvbiBnZXRSb3coaW5kZXg6IG51bWJlcik6IE51bGxhYmxlPFZlY3RvcjQ+IHtcbiAgICAvLyAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPiAzKSB7XG4gICAgLy8gICAgIHJldHVybiBudWxsXG4gICAgLy8gICB9XG4gICAgLy8gICBjb25zdCBpID0gaW5kZXggKiA0XG4gICAgLy8gICByZXR1cm4gbmV3IFZlY3RvcjQoXG4gICAgLy8gICAgIHNlbGYuX21baSArIDBdLFxuICAgIC8vICAgICBzZWxmLl9tW2kgKyAxXSxcbiAgICAvLyAgICAgc2VsZi5fbVtpICsgMl0sXG4gICAgLy8gICAgIHNlbGYuX21baSArIDNdXG4gICAgLy8gICApXG4gICAgLy8gfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGluZGV4LXRoIHJvdyBvZiB0aGUgY3VycmVudCBtYXRyaXggdG8gdGhlIHZlY3RvcjQgdmFsdWVzXG4gICAgICogQHBhcmFtIGluZGV4IC0gZGVmaW5lcyB0aGUgbnVtYmVyIG9mIHRoZSByb3cgdG8gc2V0XG4gICAgICogQHBhcmFtIHJvdyAtIGRlZmluZXMgdGhlIHRhcmdldCB2ZWN0b3I0XG4gICAgICogQHJldHVybnMgdGhlIHVwZGF0ZWQgY3VycmVudCBtYXRyaXhcbiAgICAgKi9cbiAgICAvLyBUT0RPXG4gICAgLy8gZXhwb3J0IGZ1bmN0aW9uIHNldFJvdyhpbmRleDogbnVtYmVyLCByb3c6IFZlY3RvcjQpOiBNdXRhYmxlTWF0cml4IHtcbiAgICAvLyAgIHJldHVybiBzZXRSb3dGcm9tRmxvYXRzKGluZGV4LCByb3cueCwgcm93LnksIHJvdy56LCByb3cudylcbiAgICAvLyB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgaW5kZXgtdGggcm93IG9mIHRoZSBjdXJyZW50IG1hdHJpeCB3aXRoIHRoZSBnaXZlbiA0IHggZmxvYXQgdmFsdWVzXG4gICAgICogQHBhcmFtIGluZGV4IC0gZGVmaW5lcyB0aGUgcm93IGluZGV4XG4gICAgICogQHBhcmFtIHggLSBkZWZpbmVzIHRoZSB4IGNvbXBvbmVudCB0byBzZXRcbiAgICAgKiBAcGFyYW0geSAtIGRlZmluZXMgdGhlIHkgY29tcG9uZW50IHRvIHNldFxuICAgICAqIEBwYXJhbSB6IC0gZGVmaW5lcyB0aGUgeiBjb21wb25lbnQgdG8gc2V0XG4gICAgICogQHBhcmFtIHcgLSBkZWZpbmVzIHRoZSB3IGNvbXBvbmVudCB0byBzZXRcbiAgICAgKiBAcmV0dXJucyB0aGUgdXBkYXRlZCBjdXJyZW50IG1hdHJpeFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNldFJvd0Zyb21GbG9hdHMoc2VsZiwgaW5kZXgsIHgsIHksIHosIHcpIHtcbiAgICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+IDMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpID0gaW5kZXggKiA0O1xuICAgICAgICBzZWxmLl9tW2kgKyAwXSA9IHg7XG4gICAgICAgIHNlbGYuX21baSArIDFdID0geTtcbiAgICAgICAgc2VsZi5fbVtpICsgMl0gPSB6O1xuICAgICAgICBzZWxmLl9tW2kgKyAzXSA9IHc7XG4gICAgICAgIF9tYXJrQXNVcGRhdGVkKHNlbGYpO1xuICAgIH1cbiAgICBNYXRyaXguc2V0Um93RnJvbUZsb2F0cyA9IHNldFJvd0Zyb21GbG9hdHM7XG4gICAgLyoqXG4gICAgICogQ29tcHV0ZSBhIG5ldyBtYXRyaXggc2V0IHdpdGggdGhlIGN1cnJlbnQgbWF0cml4IHZhbHVlcyBtdWx0aXBsaWVkIGJ5IHNjYWxlIChmbG9hdClcbiAgICAgKiBAcGFyYW0gc2NhbGUgLSBkZWZpbmVzIHRoZSBzY2FsZSBmYWN0b3JcbiAgICAgKiBAcmV0dXJucyBhIG5ldyBtYXRyaXhcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzY2FsZShzZWxmLCBzY2FsZSkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBjcmVhdGUoKTtcbiAgICAgICAgc2NhbGVUb1JlZihzZWxmLCBzY2FsZSwgcmVzdWx0KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgTWF0cml4LnNjYWxlID0gc2NhbGU7XG4gICAgLyoqXG4gICAgICogU2NhbGUgdGhlIGN1cnJlbnQgbWF0cml4IHZhbHVlcyBieSBhIGZhY3RvciB0byBhIGdpdmVuIHJlc3VsdCBtYXRyaXhcbiAgICAgKiBAcGFyYW0gc2NhbGUgLSBkZWZpbmVzIHRoZSBzY2FsZSBmYWN0b3JcbiAgICAgKiBAcGFyYW0gcmVzdWx0IC0gZGVmaW5lcyB0aGUgbWF0cml4IHRvIHN0b3JlIHRoZSByZXN1bHRcbiAgICAgKiBAcmV0dXJucyB0aGUgY3VycmVudCBtYXRyaXhcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzY2FsZVRvUmVmKHNlbGYsIHNjYWxlLCByZXN1bHQpIHtcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IDE2OyBpbmRleCsrKSB7XG4gICAgICAgICAgICByZXN1bHQuX21baW5kZXhdID0gc2VsZi5fbVtpbmRleF0gKiBzY2FsZTtcbiAgICAgICAgfVxuICAgICAgICBfbWFya0FzVXBkYXRlZChyZXN1bHQpO1xuICAgIH1cbiAgICBNYXRyaXguc2NhbGVUb1JlZiA9IHNjYWxlVG9SZWY7XG4gICAgLyoqXG4gICAgICogU2NhbGUgdGhlIGN1cnJlbnQgbWF0cml4IHZhbHVlcyBieSBhIGZhY3RvciBhbmQgYWRkIHRoZSByZXN1bHQgdG8gYSBnaXZlbiBtYXRyaXhcbiAgICAgKiBAcGFyYW0gc2NhbGUgLSBkZWZpbmVzIHRoZSBzY2FsZSBmYWN0b3JcbiAgICAgKiBAcGFyYW0gcmVzdWx0IC0gZGVmaW5lcyB0aGUgTWF0cml4IHRvIHN0b3JlIHRoZSByZXN1bHRcbiAgICAgKiBAcmV0dXJucyB0aGUgY3VycmVudCBtYXRyaXhcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzY2FsZUFuZEFkZFRvUmVmKHNlbGYsIHNjYWxlLCByZXN1bHQpIHtcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IDE2OyBpbmRleCsrKSB7XG4gICAgICAgICAgICByZXN1bHQuX21baW5kZXhdICs9IHNlbGYuX21baW5kZXhdICogc2NhbGU7XG4gICAgICAgIH1cbiAgICAgICAgX21hcmtBc1VwZGF0ZWQocmVzdWx0KTtcbiAgICB9XG4gICAgTWF0cml4LnNjYWxlQW5kQWRkVG9SZWYgPSBzY2FsZUFuZEFkZFRvUmVmO1xuICAgIC8qKlxuICAgICAqIFdyaXRlcyB0byB0aGUgZ2l2ZW4gbWF0cml4IGEgbm9ybWFsIG1hdHJpeCwgY29tcHV0ZWQgZnJvbSBzZWxmIG9uZSAodXNpbmcgdmFsdWVzIGZyb20gaWRlbnRpdHkgbWF0cml4IGZvciBmb3VydGggcm93IGFuZCBjb2x1bW4pLlxuICAgICAqIEBwYXJhbSByZWYgLSBtYXRyaXggdG8gc3RvcmUgdGhlIHJlc3VsdFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG5vcm1hbE1hdHJpeFRvUmVmKHNlbGYsIHJlZikge1xuICAgICAgICBjb25zdCB0bXAgPSBjcmVhdGUoKTtcbiAgICAgICAgaW52ZXJ0VG9SZWYoc2VsZiwgdG1wKTtcbiAgICAgICAgdHJhbnNwb3NlVG9SZWYodG1wLCByZWYpO1xuICAgICAgICBjb25zdCBtID0gcmVmLl9tO1xuICAgICAgICBmcm9tVmFsdWVzVG9SZWYobVswXSwgbVsxXSwgbVsyXSwgMC4wLCBtWzRdLCBtWzVdLCBtWzZdLCAwLjAsIG1bOF0sIG1bOV0sIG1bMTBdLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDEuMCwgcmVmKTtcbiAgICB9XG4gICAgTWF0cml4Lm5vcm1hbE1hdHJpeFRvUmVmID0gbm9ybWFsTWF0cml4VG9SZWY7XG4gICAgLyoqXG4gICAgICogR2V0cyBvbmx5IHJvdGF0aW9uIHBhcnQgb2YgdGhlIGN1cnJlbnQgbWF0cml4XG4gICAgICogQHJldHVybnMgYSBuZXcgbWF0cml4IHNldHMgdG8gdGhlIGV4dHJhY3RlZCByb3RhdGlvbiBtYXRyaXggZnJvbSB0aGUgY3VycmVudCBvbmVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRSb3RhdGlvbk1hdHJpeChzZWxmKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGNyZWF0ZSgpO1xuICAgICAgICBnZXRSb3RhdGlvbk1hdHJpeFRvUmVmKHNlbGYsIHJlc3VsdCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIE1hdHJpeC5nZXRSb3RhdGlvbk1hdHJpeCA9IGdldFJvdGF0aW9uTWF0cml4O1xuICAgIC8qKlxuICAgICAqIEV4dHJhY3RzIHRoZSByb3RhdGlvbiBtYXRyaXggZnJvbSB0aGUgY3VycmVudCBvbmUgYW5kIHNldHMgaXQgYXMgdGhlIGdpdmVuIFwicmVzdWx0XCJcbiAgICAgKiBAcGFyYW0gcmVzdWx0IC0gZGVmaW5lcyB0aGUgdGFyZ2V0IG1hdHJpeCB0byBzdG9yZSBkYXRhIHRvXG4gICAgICogQHJldHVybnMgdGhlIGN1cnJlbnQgbWF0cml4XG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0Um90YXRpb25NYXRyaXhUb1JlZihzZWxmLCByZXN1bHQpIHtcbiAgICAgICAgY29uc3Qgc2NhbGUgPSBWZWN0b3IzLlplcm8oKTtcbiAgICAgICAgaWYgKCFkZWNvbXBvc2Uoc2VsZiwgc2NhbGUpKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBJZGVudGl0eSgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG0gPSBzZWxmLl9tO1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6b25lLXZhcmlhYmxlLXBlci1kZWNsYXJhdGlvblxuICAgICAgICBjb25zdCBzeCA9IDEgLyBzY2FsZS54LCBzeSA9IDEgLyBzY2FsZS55LCBzeiA9IDEgLyBzY2FsZS56O1xuICAgICAgICBmcm9tVmFsdWVzVG9SZWYobVswXSAqIHN4LCBtWzFdICogc3gsIG1bMl0gKiBzeCwgMC4wLCBtWzRdICogc3ksIG1bNV0gKiBzeSwgbVs2XSAqIHN5LCAwLjAsIG1bOF0gKiBzeiwgbVs5XSAqIHN6LCBtWzEwXSAqIHN6LCAwLjAsIDAuMCwgMC4wLCAwLjAsIDEuMCwgcmVzdWx0KTtcbiAgICB9XG4gICAgTWF0cml4LmdldFJvdGF0aW9uTWF0cml4VG9SZWYgPSBnZXRSb3RhdGlvbk1hdHJpeFRvUmVmO1xuICAgIC8qKlxuICAgICAqIFRvZ2dsZXMgbW9kZWwgbWF0cml4IGZyb20gYmVpbmcgcmlnaHQgaGFuZGVkIHRvIGxlZnQgaGFuZGVkIGluIHBsYWNlIGFuZCB2aWNlIHZlcnNhXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9nZ2xlTW9kZWxNYXRyaXhIYW5kSW5QbGFjZShzZWxmKSB7XG4gICAgICAgIHNlbGYuX21bMl0gKj0gLTE7XG4gICAgICAgIHNlbGYuX21bNl0gKj0gLTE7XG4gICAgICAgIHNlbGYuX21bOF0gKj0gLTE7XG4gICAgICAgIHNlbGYuX21bOV0gKj0gLTE7XG4gICAgICAgIHNlbGYuX21bMTRdICo9IC0xO1xuICAgICAgICBfbWFya0FzVXBkYXRlZChzZWxmKTtcbiAgICB9XG4gICAgTWF0cml4LnRvZ2dsZU1vZGVsTWF0cml4SGFuZEluUGxhY2UgPSB0b2dnbGVNb2RlbE1hdHJpeEhhbmRJblBsYWNlO1xuICAgIC8qKlxuICAgICAqIFRvZ2dsZXMgcHJvamVjdGlvbiBtYXRyaXggZnJvbSBiZWluZyByaWdodCBoYW5kZWQgdG8gbGVmdCBoYW5kZWQgaW4gcGxhY2UgYW5kIHZpY2UgdmVyc2FcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b2dnbGVQcm9qZWN0aW9uTWF0cml4SGFuZEluUGxhY2Uoc2VsZikge1xuICAgICAgICBzZWxmLl9tWzhdICo9IC0xO1xuICAgICAgICBzZWxmLl9tWzldICo9IC0xO1xuICAgICAgICBzZWxmLl9tWzEwXSAqPSAtMTtcbiAgICAgICAgc2VsZi5fbVsxMV0gKj0gLTE7XG4gICAgICAgIF9tYXJrQXNVcGRhdGVkKHNlbGYpO1xuICAgIH1cbiAgICBNYXRyaXgudG9nZ2xlUHJvamVjdGlvbk1hdHJpeEhhbmRJblBsYWNlID0gdG9nZ2xlUHJvamVjdGlvbk1hdHJpeEhhbmRJblBsYWNlO1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBmdW5jdGlvbiBfdXBkYXRlSWRlbnRpdHlTdGF0dXMoc2VsZiwgaXNJZGVudGl0eSwgaXNJZGVudGl0eURpcnR5ID0gZmFsc2UsIGlzSWRlbnRpdHkzeDIgPSBmYWxzZSwgaXNJZGVudGl0eTN4MkRpcnR5ID0gdHJ1ZSkge1xuICAgICAgICBzZWxmLnVwZGF0ZUZsYWcgPSBfdXBkYXRlRmxhZ1NlZWQrKztcbiAgICAgICAgc2VsZi5pc0lkZW50aXR5ID0gaXNJZGVudGl0eTtcbiAgICAgICAgc2VsZi5pc0lkZW50aXR5M3gyID0gaXNJZGVudGl0eSB8fCBpc0lkZW50aXR5M3gyO1xuICAgICAgICBzZWxmLl9pc0lkZW50aXR5RGlydHkgPSBzZWxmLmlzSWRlbnRpdHkgPyBmYWxzZSA6IGlzSWRlbnRpdHlEaXJ0eTtcbiAgICAgICAgc2VsZi5faXNJZGVudGl0eTN4MkRpcnR5ID0gc2VsZi5pc0lkZW50aXR5M3gyID8gZmFsc2UgOiBpc0lkZW50aXR5M3gyRGlydHk7XG4gICAgfVxufSkoTWF0cml4IHx8IChNYXRyaXggPSB7fSkpO1xuIiwgImltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuL1ZlY3RvcjMnO1xuaW1wb3J0IHsgU2NhbGFyIH0gZnJvbSAnLi9TY2FsYXInO1xuaW1wb3J0IHsgREVHMlJBRCwgUkFEMkRFRyB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgTWF0cml4IH0gZnJvbSAnLi9NYXRyaXgnO1xuLyoqXG4gKiBAcHVibGljXG4gKiBRdWF0ZXJuaW9uIGlzIGEgdHlwZSBhbmQgYSBuYW1lc3BhY2UuXG4gKiBgYGBcbiAqIC8vIFRoZSBuYW1lc3BhY2UgY29udGFpbnMgYWxsIHR5cGVzIGFuZCBmdW5jdGlvbnMgdG8gb3BlcmF0ZXMgd2l0aCBRdWF0ZXJuaW9uXG4gKiBjb25zdCBuZXh0ID0gUXVhdGVybmlvbi5hZGQocG9pbnRBLCB2ZWxvY2l0eUEpXG4gKiAvLyBUaGUgdHlwZSBRdWF0ZXJuaW9uIGlzIGFuIGFsaWFzIHRvIFF1YXRlcm5pb24uUmVhZG9ubHlRdWF0ZXJuaW9uXG4gKiBjb25zdCByZWFkb25seVJvdGF0aW9uOiBRdWF0ZXJuaW9uID0gUXVhdGVybmlvbi5aZXJvKClcbiAqIHJlYWRvbmx5Um90YXRpb24ueCA9IDAuMSAvLyB0aGlzIEZBSUxTXG4gKlxuICogLy8gRm9yIG11dGFibGUgdXNhZ2UsIHVzZSBgUXVhdGVybmlvbi5NdXRhYmxlYFxuICogY29uc3Qgcm90YXRpb246IFF1YXRlcm5pb24uTXV0YWJsZSA9IFF1YXRlcm5pb24uSWRlbnRpdHkoKVxuICogcm90YXRpb24ueCA9IDMuMCAvLyB0aGlzIFdPUktTXG4gKiBgYGBcbiAqL1xuZXhwb3J0IHZhciBRdWF0ZXJuaW9uO1xuKGZ1bmN0aW9uIChRdWF0ZXJuaW9uKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBRdWF0ZXJuaW9uIGZyb20gdGhlIGdpdmVuIGZsb2F0c1xuICAgICAqIEBwYXJhbSB4IC0gZGVmaW5lcyB0aGUgZmlyc3QgY29tcG9uZW50ICgwIGJ5IGRlZmF1bHQpXG4gICAgICogQHBhcmFtIHkgLSBkZWZpbmVzIHRoZSBzZWNvbmQgY29tcG9uZW50ICgwIGJ5IGRlZmF1bHQpXG4gICAgICogQHBhcmFtIHogLSBkZWZpbmVzIHRoZSB0aGlyZCBjb21wb25lbnQgKDAgYnkgZGVmYXVsdClcbiAgICAgKiBAcGFyYW0gdyAtIGRlZmluZXMgdGhlIGZvdXJ0aCBjb21wb25lbnQgKDEuMCBieSBkZWZhdWx0KVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShcbiAgICAvKiogZGVmaW5lcyB0aGUgZmlyc3QgY29tcG9uZW50ICgwIGJ5IGRlZmF1bHQpICovXG4gICAgeCA9IDAuMCwgXG4gICAgLyoqIGRlZmluZXMgdGhlIHNlY29uZCBjb21wb25lbnQgKDAgYnkgZGVmYXVsdCkgKi9cbiAgICB5ID0gMC4wLCBcbiAgICAvKiogZGVmaW5lcyB0aGUgdGhpcmQgY29tcG9uZW50ICgwIGJ5IGRlZmF1bHQpICovXG4gICAgeiA9IDAuMCwgXG4gICAgLyoqIGRlZmluZXMgdGhlIGZvdXJ0aCBjb21wb25lbnQgKDEuMCBieSBkZWZhdWx0KSAqL1xuICAgIHcgPSAxLjApIHtcbiAgICAgICAgcmV0dXJuIHsgeCwgeSwgeiwgdyB9O1xuICAgIH1cbiAgICBRdWF0ZXJuaW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgbmV3IFF1YXRlcm5pb24gYXMgdGhlIHJlc3VsdCBvZiB0aGUgYWRkaXRpb24gb2YgdGhlIHR3byBnaXZlbiBxdWF0ZXJuaW9ucy5cbiAgICAgKiBAcGFyYW0gcTEgLSB0aGUgZmlyc3QgcXVhdGVybmlvblxuICAgICAqIEBwYXJhbSBxMiAtIHRoZSBzZWNvbmQgcXVhdGVybmlvblxuICAgICAqIEByZXR1cm5zIHRoZSByZXN1bHRpbmcgcXVhdGVybmlvblxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFkZChxMSwgcTIpIHtcbiAgICAgICAgcmV0dXJuIHsgeDogcTEueCArIHEyLngsIHk6IHExLnkgKyBxMi55LCB6OiBxMS56ICsgcTIueiwgdzogcTEudyArIHEyLncgfTtcbiAgICB9XG4gICAgUXVhdGVybmlvbi5hZGQgPSBhZGQ7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyByb3RhdGlvbiBmcm9tIHRoZSBnaXZlbiBFdWxlciBmbG9hdCBhbmdsZXMgKHksIHgsIHopIGFuZCBzdG9yZXMgaXQgaW4gdGhlIHRhcmdldCBxdWF0ZXJuaW9uXG4gICAgICogQHBhcmFtIHlhdyAtIGRlZmluZXMgdGhlIHJvdGF0aW9uIGFyb3VuZCBZIGF4aXMgKHJhZGlhbnMpXG4gICAgICogQHBhcmFtIHBpdGNoIC0gZGVmaW5lcyB0aGUgcm90YXRpb24gYXJvdW5kIFggYXhpcyAocmFkaWFucylcbiAgICAgKiBAcGFyYW0gcm9sbCAtIGRlZmluZXMgdGhlIHJvdGF0aW9uIGFyb3VuZCBaIGF4aXMgKHJhZGlhbnMpXG4gICAgICogQHJldHVybnMgcmVzdWx0IHF1YXRlcm5pb25cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmcm9tUm90YXRpb25ZYXdQaXRjaFJvbGwoeWF3LCBwaXRjaCwgcm9sbCkge1xuICAgICAgICAvLyBJbXBsZW1lbnRlZCB1bml0eS1iYXNlZCBjYWxjdWxhdGlvbnMgZnJvbTogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzU2MDU1ODEzXG4gICAgICAgIGNvbnN0IGhhbGZQaXRjaCA9IHBpdGNoICogMC41O1xuICAgICAgICBjb25zdCBoYWxmWWF3ID0geWF3ICogMC41O1xuICAgICAgICBjb25zdCBoYWxmUm9sbCA9IHJvbGwgKiAwLjU7XG4gICAgICAgIGNvbnN0IGMxID0gTWF0aC5jb3MoaGFsZlBpdGNoKTtcbiAgICAgICAgY29uc3QgYzIgPSBNYXRoLmNvcyhoYWxmWWF3KTtcbiAgICAgICAgY29uc3QgYzMgPSBNYXRoLmNvcyhoYWxmUm9sbCk7XG4gICAgICAgIGNvbnN0IHMxID0gTWF0aC5zaW4oaGFsZlBpdGNoKTtcbiAgICAgICAgY29uc3QgczIgPSBNYXRoLnNpbihoYWxmWWF3KTtcbiAgICAgICAgY29uc3QgczMgPSBNYXRoLnNpbihoYWxmUm9sbCk7XG4gICAgICAgIHJldHVybiBjcmVhdGUoYzIgKiBzMSAqIGMzICsgczIgKiBjMSAqIHMzLCBzMiAqIGMxICogYzMgLSBjMiAqIHMxICogczMsIGMyICogYzEgKiBzMyAtIHMyICogczEgKiBjMywgYzIgKiBjMSAqIGMzICsgczIgKiBzMSAqIHMzKTtcbiAgICB9XG4gICAgUXVhdGVybmlvbi5mcm9tUm90YXRpb25ZYXdQaXRjaFJvbGwgPSBmcm9tUm90YXRpb25ZYXdQaXRjaFJvbGw7XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHJvdGF0aW9uIHRoYXQgcm90YXRlcyB6IGRlZ3JlZXMgYXJvdW5kIHRoZSB6IGF4aXMsIHggZGVncmVlcyBhcm91bmQgdGhlIHggYXhpcywgYW5kIHkgZGVncmVlcyBhcm91bmQgdGhlIHkgYXhpcy5cbiAgICAgKiBAcGFyYW0geCAtIHRoZSByb3RhdGlvbiBvbiB0aGUgeCBheGlzIGluIGV1bGVyIGRlZ3JlZXNcbiAgICAgKiBAcGFyYW0geSAtIHRoZSByb3RhdGlvbiBvbiB0aGUgeSBheGlzIGluIGV1bGVyIGRlZ3JlZXNcbiAgICAgKiBAcGFyYW0geiAtIHRoZSByb3RhdGlvbiBvbiB0aGUgeiBheGlzIGluIGV1bGVyIGRlZ3JlZXNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmcm9tRXVsZXJEZWdyZWVzKHgsIHksIHopIHtcbiAgICAgICAgcmV0dXJuIGZyb21Sb3RhdGlvbllhd1BpdGNoUm9sbCh5ICogREVHMlJBRCwgeCAqIERFRzJSQUQsIHogKiBERUcyUkFEKTtcbiAgICB9XG4gICAgUXVhdGVybmlvbi5mcm9tRXVsZXJEZWdyZWVzID0gZnJvbUV1bGVyRGVncmVlcztcbiAgICAvKipcbiAgICAgKiBHZXRzIGxlbmd0aCBvZiBjdXJyZW50IHF1YXRlcm5pb25cbiAgICAgKiBAcmV0dXJucyB0aGUgcXVhdGVybmlvbiBsZW5ndGggKGZsb2F0KVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGxlbmd0aChxKSB7XG4gICAgICAgIHJldHVybiBNYXRoLnNxcnQobGVuZ3RoU3F1YXJlZChxKSk7XG4gICAgfVxuICAgIFF1YXRlcm5pb24ubGVuZ3RoID0gbGVuZ3RoO1xuICAgIC8qKlxuICAgICAqIEdldHMgbGVuZ3RoIG9mIGN1cnJlbnQgcXVhdGVybmlvblxuICAgICAqIEByZXR1cm5zIHRoZSBxdWF0ZXJuaW9uIGxlbmd0aCAoZmxvYXQpXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGVuZ3RoU3F1YXJlZChxKSB7XG4gICAgICAgIHJldHVybiBxLnggKiBxLnggKyBxLnkgKiBxLnkgKyBxLnogKiBxLnogKyBxLncgKiBxLnc7XG4gICAgfVxuICAgIFF1YXRlcm5pb24ubGVuZ3RoU3F1YXJlZCA9IGxlbmd0aFNxdWFyZWQ7XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgZG90IHByb2R1Y3QgKGZsb2F0KSBiZXR3ZWVuIHRoZSBxdWF0ZXJuaW9ucyBcImxlZnRcIiBhbmQgXCJyaWdodFwiXG4gICAgICogQHBhcmFtIGxlZnQgLSBkZWZpbmVzIHRoZSBsZWZ0IG9wZXJhbmRcbiAgICAgKiBAcGFyYW0gcmlnaHQgLSBkZWZpbmVzIHRoZSByaWdodCBvcGVyYW5kXG4gICAgICogQHJldHVybnMgdGhlIGRvdCBwcm9kdWN0XG4gICAgICovXG4gICAgZnVuY3Rpb24gZG90KGxlZnQsIHJpZ2h0KSB7XG4gICAgICAgIHJldHVybiAobGVmdC54ICogcmlnaHQueCArIGxlZnQueSAqIHJpZ2h0LnkgKyBsZWZ0LnogKiByaWdodC56ICsgbGVmdC53ICogcmlnaHQudyk7XG4gICAgfVxuICAgIFF1YXRlcm5pb24uZG90ID0gZG90O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGFuZ2xlIGluIGRlZ3JlZXMgYmV0d2VlbiB0d28gcm90YXRpb25zIGEgYW5kIGIuXG4gICAgICogQHBhcmFtIHF1YXQxIC0gZGVmaW5lcyB0aGUgZmlyc3QgcXVhdGVybmlvblxuICAgICAqIEBwYXJhbSBxdWF0MiAtIGRlZmluZXMgdGhlIHNlY29uZCBxdWF0ZXJuaW9uXG4gICAgICogQHJldHVybnMgdGhlIGRlZ3JlZXMgYW5nbGVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhbmdsZShxdWF0MSwgcXVhdDIpIHtcbiAgICAgICAgY29uc3QgZG90VmFsID0gZG90KHF1YXQxLCBxdWF0Mik7XG4gICAgICAgIHJldHVybiBNYXRoLmFjb3MoTWF0aC5taW4oTWF0aC5hYnMoZG90VmFsKSwgMSkpICogMiAqIFJBRDJERUc7XG4gICAgfVxuICAgIFF1YXRlcm5pb24uYW5nbGUgPSBhbmdsZTtcbiAgICAvKipcbiAgICAgKiBUaGUgZnJvbSBxdWF0ZXJuaW9uIGlzIHJvdGF0ZWQgdG93YXJkcyB0byBieSBhbiBhbmd1bGFyIHN0ZXAgb2YgbWF4RGVncmVlc0RlbHRhLlxuICAgICAqIEBwYXJhbSBmcm9tIC0gZGVmaW5lcyB0aGUgZmlyc3QgcXVhdGVybmlvblxuICAgICAqIEBwYXJhbSB0byAtIGRlZmluZXMgdGhlIHNlY29uZCBxdWF0ZXJuaW9uXG4gICAgICogQHBhcmFtIG1heERlZ3JlZXNEZWx0YSAtIHRoZSBpbnRlcnZhbCBzdGVwXG4gICAgICovXG4gICAgZnVuY3Rpb24gcm90YXRlVG93YXJkcyhmcm9tLCB0bywgbWF4RGVncmVlc0RlbHRhKSB7XG4gICAgICAgIGNvbnN0IG51bSA9IGFuZ2xlKGZyb20sIHRvKTtcbiAgICAgICAgaWYgKG51bSA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRvO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHQgPSBNYXRoLm1pbigxLCBtYXhEZWdyZWVzRGVsdGEgLyBudW0pO1xuICAgICAgICByZXR1cm4gc2xlcnAoZnJvbSwgdG8sIHQpO1xuICAgIH1cbiAgICBRdWF0ZXJuaW9uLnJvdGF0ZVRvd2FyZHMgPSByb3RhdGVUb3dhcmRzO1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSByb3RhdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgZm9yd2FyZCBhbmQgdXB3YXJkcyBkaXJlY3Rpb25zLlxuICAgICAqIEBwYXJhbSBmb3J3YXJkIC0gdGhlIGRpcmVjdGlvbiB0byBsb29rIGluXG4gICAgICogQHBhcmFtIHVwIC0gdGhlIHZlY3RvciB0aGF0IGRlZmluZXMgaW4gd2hpY2ggZGlyZWN0aW9uIHVwIGlzXG4gICAgICovXG4gICAgZnVuY3Rpb24gbG9va1JvdGF0aW9uKGZvcndhcmQsIHVwID0geyB4OiAwLjAsIHk6IDEuMCwgejogMC4wIH0pIHtcbiAgICAgICAgY29uc3QgZm9yd2FyZE5ldyA9IFZlY3RvcjMubm9ybWFsaXplKGZvcndhcmQpO1xuICAgICAgICBjb25zdCByaWdodCA9IFZlY3RvcjMubm9ybWFsaXplKFZlY3RvcjMuY3Jvc3ModXAsIGZvcndhcmROZXcpKTtcbiAgICAgICAgY29uc3QgdXBOZXcgPSBWZWN0b3IzLmNyb3NzKGZvcndhcmROZXcsIHJpZ2h0KTtcbiAgICAgICAgY29uc3QgbTAwID0gcmlnaHQueDtcbiAgICAgICAgY29uc3QgbTAxID0gcmlnaHQueTtcbiAgICAgICAgY29uc3QgbTAyID0gcmlnaHQuejtcbiAgICAgICAgY29uc3QgbTEwID0gdXBOZXcueDtcbiAgICAgICAgY29uc3QgbTExID0gdXBOZXcueTtcbiAgICAgICAgY29uc3QgbTEyID0gdXBOZXcuejtcbiAgICAgICAgY29uc3QgbTIwID0gZm9yd2FyZE5ldy54O1xuICAgICAgICBjb25zdCBtMjEgPSBmb3J3YXJkTmV3Lnk7XG4gICAgICAgIGNvbnN0IG0yMiA9IGZvcndhcmROZXcuejtcbiAgICAgICAgY29uc3QgbnVtOCA9IG0wMCArIG0xMSArIG0yMjtcbiAgICAgICAgY29uc3QgcXVhdGVybmlvbiA9IGNyZWF0ZSgpO1xuICAgICAgICBpZiAobnVtOCA+IDApIHtcbiAgICAgICAgICAgIGxldCBudW0gPSBNYXRoLnNxcnQobnVtOCArIDEpO1xuICAgICAgICAgICAgcXVhdGVybmlvbi53ID0gbnVtICogMC41O1xuICAgICAgICAgICAgbnVtID0gMC41IC8gbnVtO1xuICAgICAgICAgICAgcXVhdGVybmlvbi54ID0gKG0xMiAtIG0yMSkgKiBudW07XG4gICAgICAgICAgICBxdWF0ZXJuaW9uLnkgPSAobTIwIC0gbTAyKSAqIG51bTtcbiAgICAgICAgICAgIHF1YXRlcm5pb24ueiA9IChtMDEgLSBtMTApICogbnVtO1xuICAgICAgICAgICAgcmV0dXJuIHF1YXRlcm5pb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG0wMCA+PSBtMTEgJiYgbTAwID49IG0yMikge1xuICAgICAgICAgICAgY29uc3QgbnVtNyA9IE1hdGguc3FydCgxICsgbTAwIC0gbTExIC0gbTIyKTtcbiAgICAgICAgICAgIGNvbnN0IG51bTQgPSAwLjUgLyBudW03O1xuICAgICAgICAgICAgcXVhdGVybmlvbi54ID0gMC41ICogbnVtNztcbiAgICAgICAgICAgIHF1YXRlcm5pb24ueSA9IChtMDEgKyBtMTApICogbnVtNDtcbiAgICAgICAgICAgIHF1YXRlcm5pb24ueiA9IChtMDIgKyBtMjApICogbnVtNDtcbiAgICAgICAgICAgIHF1YXRlcm5pb24udyA9IChtMTIgLSBtMjEpICogbnVtNDtcbiAgICAgICAgICAgIHJldHVybiBxdWF0ZXJuaW9uO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtMTEgPiBtMjIpIHtcbiAgICAgICAgICAgIGNvbnN0IG51bTYgPSBNYXRoLnNxcnQoMSArIG0xMSAtIG0wMCAtIG0yMik7XG4gICAgICAgICAgICBjb25zdCBudW0zID0gMC41IC8gbnVtNjtcbiAgICAgICAgICAgIHF1YXRlcm5pb24ueCA9IChtMTAgKyBtMDEpICogbnVtMztcbiAgICAgICAgICAgIHF1YXRlcm5pb24ueSA9IDAuNSAqIG51bTY7XG4gICAgICAgICAgICBxdWF0ZXJuaW9uLnogPSAobTIxICsgbTEyKSAqIG51bTM7XG4gICAgICAgICAgICBxdWF0ZXJuaW9uLncgPSAobTIwIC0gbTAyKSAqIG51bTM7XG4gICAgICAgICAgICByZXR1cm4gcXVhdGVybmlvbjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBudW01ID0gTWF0aC5zcXJ0KDEgKyBtMjIgLSBtMDAgLSBtMTEpO1xuICAgICAgICBjb25zdCBudW0yID0gMC41IC8gbnVtNTtcbiAgICAgICAgcXVhdGVybmlvbi54ID0gKG0yMCArIG0wMikgKiBudW0yO1xuICAgICAgICBxdWF0ZXJuaW9uLnkgPSAobTIxICsgbTEyKSAqIG51bTI7XG4gICAgICAgIHF1YXRlcm5pb24ueiA9IDAuNSAqIG51bTU7XG4gICAgICAgIHF1YXRlcm5pb24udyA9IChtMDEgLSBtMTApICogbnVtMjtcbiAgICAgICAgcmV0dXJuIHF1YXRlcm5pb247XG4gICAgfVxuICAgIFF1YXRlcm5pb24ubG9va1JvdGF0aW9uID0gbG9va1JvdGF0aW9uO1xuICAgIC8qKlxuICAgICAqIE5vcm1hbGl6ZSBpbiBwbGFjZSB0aGUgY3VycmVudCBxdWF0ZXJuaW9uXG4gICAgICogQHJldHVybnMgdGhlIGN1cnJlbnQgdXBkYXRlZCBxdWF0ZXJuaW9uXG4gICAgICovXG4gICAgZnVuY3Rpb24gbm9ybWFsaXplKHEpIHtcbiAgICAgICAgY29uc3QgcUxlbmd0aCA9IDEuMCAvIGxlbmd0aChxKTtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZShxLnggKiBxTGVuZ3RoLCBxLnkgKiBxTGVuZ3RoLCBxLnogKiBxTGVuZ3RoLCBxLncgKiBxTGVuZ3RoKTtcbiAgICB9XG4gICAgUXVhdGVybmlvbi5ub3JtYWxpemUgPSBub3JtYWxpemU7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHJvdGF0aW9uIHdoaWNoIHJvdGF0ZXMgZnJvbSBmcm9tRGlyZWN0aW9uIHRvIHRvRGlyZWN0aW9uLlxuICAgICAqIEBwYXJhbSBmcm9tIC0gZGVmaW5lcyB0aGUgZmlyc3QgZGlyZWN0aW9uIFZlY3RvclxuICAgICAqIEBwYXJhbSB0byAtIGRlZmluZXMgdGhlIHRhcmdldCBkaXJlY3Rpb24gVmVjdG9yXG4gICAgICovXG4gICAgZnVuY3Rpb24gZnJvbVRvUm90YXRpb24oZnJvbSwgdG8sIHVwID0gVmVjdG9yMy5VcCgpKSB7XG4gICAgICAgIC8vIFVuaXR5LWJhc2VkIGNhbGN1bGF0aW9ucyBpbXBsZW1lbnRlZCBmcm9tIGh0dHBzOi8vZm9ydW0udW5pdHkuY29tL3RocmVhZHMvcXVhdGVybmlvbi1sb29rcm90YXRpb24tYXJvdW5kLWFuLWF4aXMuNjA4NDcwLyNwb3N0LTQwNjk4ODhcbiAgICAgICAgY29uc3QgdjAgPSBWZWN0b3IzLm5vcm1hbGl6ZShmcm9tKTtcbiAgICAgICAgY29uc3QgdjEgPSBWZWN0b3IzLm5vcm1hbGl6ZSh0byk7XG4gICAgICAgIGNvbnN0IGEgPSBWZWN0b3IzLmNyb3NzKHYwLCB2MSk7XG4gICAgICAgIGNvbnN0IHcgPSBNYXRoLnNxcnQoVmVjdG9yMy5sZW5ndGhTcXVhcmVkKHYwKSAqIFZlY3RvcjMubGVuZ3RoU3F1YXJlZCh2MSkpICtcbiAgICAgICAgICAgIFZlY3RvcjMuZG90KHYwLCB2MSk7XG4gICAgICAgIGlmIChWZWN0b3IzLmxlbmd0aFNxdWFyZWQoYSkgPCAwLjAwMDEpIHtcbiAgICAgICAgICAgIC8vIHRoZSB2ZWN0b3JzIGFyZSBwYXJhbGxlbCwgY2hlY2sgdyB0byBmaW5kIGRpcmVjdGlvblxuICAgICAgICAgICAgLy8gaWYgdyBpcyAwIHRoZW4gdmFsdWVzIGFyZSBvcHBvc2l0ZSwgYW5kIHdlIHNvdWxkIHJvdGF0ZSAxODAgZGVncmVlcyBhcm91bmQgdGhlIHN1cHBsaWVkIGF4aXNcbiAgICAgICAgICAgIC8vIG90aGVyd2lzZSB0aGUgdmVjdG9ycyBpbiB0aGUgc2FtZSBkaXJlY3Rpb24gYW5kIG5vIHJvdGF0aW9uIHNob3VsZCBvY2N1clxuICAgICAgICAgICAgcmV0dXJuIE1hdGguYWJzKHcpIDwgMC4wMDAxXG4gICAgICAgICAgICAgICAgPyBub3JtYWxpemUoY3JlYXRlKHVwLngsIHVwLnksIHVwLnosIDApKVxuICAgICAgICAgICAgICAgIDogSWRlbnRpdHkoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBub3JtYWxpemUoY3JlYXRlKGEueCwgYS55LCBhLnosIHcpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBRdWF0ZXJuaW9uLmZyb21Ub1JvdGF0aW9uID0gZnJvbVRvUm90YXRpb247XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBpZGVudGl0eSBxdWF0ZXJuaW9uXG4gICAgICogQHJldHVybnMgLSB0aGUgaWRlbnRpdHkgcXVhdGVybmlvblxuICAgICAqL1xuICAgIGZ1bmN0aW9uIElkZW50aXR5KCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlKDAuMCwgMC4wLCAwLjAsIDEuMCk7XG4gICAgfVxuICAgIFF1YXRlcm5pb24uSWRlbnRpdHkgPSBJZGVudGl0eTtcbiAgICAvKipcbiAgICAgKiBHZXRzIG9yIHNldHMgdGhlIGV1bGVyIGFuZ2xlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByb3RhdGlvbi5cbiAgICAgKiBJbXBsZW1lbnRlZCB1bml0eS1iYXNlZCBjYWxjdWxhdGlvbnMgZnJvbTogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzU2MDU1ODEzXG4gICAgICogQHB1YmxpY1xuICAgICAqIEByZXR1cm5zIGEgbmV3IFZlY3RvcjMgd2l0aCBldWxlciBhbmdsZXMgZGVncmVlc1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvRXVsZXJBbmdsZXMocSkge1xuICAgICAgICBjb25zdCBvdXQgPSBWZWN0b3IzLmNyZWF0ZSgpO1xuICAgICAgICAvLyBpZiB0aGUgaW5wdXQgcXVhdGVybmlvbiBpcyBub3JtYWxpemVkLCB0aGlzIGlzIGV4YWN0bHkgb25lLiBPdGhlcndpc2UsIHRoaXMgYWN0cyBhcyBhIGNvcnJlY3Rpb24gZmFjdG9yIGZvciB0aGUgcXVhdGVybmlvbidzIG5vdC1ub3JtYWxpemVkbmVzc1xuICAgICAgICBjb25zdCB1bml0ID0gcS54ICogcS54ICsgcS55ICogcS55ICsgcS56ICogcS56ICsgcS53ICogcS53O1xuICAgICAgICAvLyBxIHdpbGwgaGF2ZSBhIG1hZ25pdHVkZSBvZiAwLjUgb3IgZ3JlYXRlciBpZiBhbmQgb25seSBpZiBxIGlzIGEgc2luZ3VsYXJpdHkgY2FzZVxuICAgICAgICBjb25zdCB0ZXN0ID0gcS54ICogcS53IC0gcS55ICogcS56O1xuICAgICAgICBpZiAodGVzdCA+IDAuNDk5NSAqIHVuaXQpIHtcbiAgICAgICAgICAgIC8vIHNpbmd1bGFyaXR5IGF0IG5vcnRoIHBvbGVcbiAgICAgICAgICAgIG91dC54ID0gTWF0aC5QSSAvIDI7XG4gICAgICAgICAgICBvdXQueSA9IDIgKiBNYXRoLmF0YW4yKHEueSwgcS54KTtcbiAgICAgICAgICAgIG91dC56ID0gMDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0ZXN0IDwgLTAuNDk5NSAqIHVuaXQpIHtcbiAgICAgICAgICAgIC8vIHNpbmd1bGFyaXR5IGF0IHNvdXRoIHBvbGVcbiAgICAgICAgICAgIG91dC54ID0gLU1hdGguUEkgLyAyO1xuICAgICAgICAgICAgb3V0LnkgPSAtMiAqIE1hdGguYXRhbjIocS55LCBxLngpO1xuICAgICAgICAgICAgb3V0LnogPSAwO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gbm8gc2luZ3VsYXJpdHkgLSBxIGlzIHRoZSBtYWpvcml0eSBvZiBjYXNlc1xuICAgICAgICAgICAgb3V0LnggPSBNYXRoLmFzaW4oMiAqIChxLncgKiBxLnggLSBxLnkgKiBxLnopKTtcbiAgICAgICAgICAgIG91dC55ID0gTWF0aC5hdGFuMigyICogcS53ICogcS55ICsgMiAqIHEueiAqIHEueCwgMSAtIDIgKiAocS54ICogcS54ICsgcS55ICogcS55KSk7XG4gICAgICAgICAgICBvdXQueiA9IE1hdGguYXRhbjIoMiAqIHEudyAqIHEueiArIDIgKiBxLnggKiBxLnksIDEgLSAyICogKHEueiAqIHEueiArIHEueCAqIHEueCkpO1xuICAgICAgICB9XG4gICAgICAgIG91dC54ICo9IFJBRDJERUc7XG4gICAgICAgIG91dC55ICo9IFJBRDJERUc7XG4gICAgICAgIG91dC56ICo9IFJBRDJERUc7XG4gICAgICAgIC8vIGVuc3VyZSB0aGUgZGVncmVlIHZhbHVlcyBhcmUgYmV0d2VlbiAwIGFuZCAzNjBcbiAgICAgICAgb3V0LnggPSBTY2FsYXIucmVwZWF0KG91dC54LCAzNjApO1xuICAgICAgICBvdXQueSA9IFNjYWxhci5yZXBlYXQob3V0LnksIDM2MCk7XG4gICAgICAgIG91dC56ID0gU2NhbGFyLnJlcGVhdChvdXQueiwgMzYwKTtcbiAgICAgICAgcmV0dXJuIG91dDtcbiAgICB9XG4gICAgUXVhdGVybmlvbi50b0V1bGVyQW5nbGVzID0gdG9FdWxlckFuZ2xlcztcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHJvdGF0aW9uIGZyb20gdGhlIGdpdmVuIEV1bGVyIGZsb2F0IGFuZ2xlcyAoeSwgeCwgeikgYW5kIHN0b3JlcyBpdCBpbiB0aGUgdGFyZ2V0IHF1YXRlcm5pb25cbiAgICAgKiBAcGFyYW0geWF3IC0gZGVmaW5lcyB0aGUgcm90YXRpb24gYXJvdW5kIFkgYXhpcyAocmFkaWFucylcbiAgICAgKiBAcGFyYW0gcGl0Y2ggLSBkZWZpbmVzIHRoZSByb3RhdGlvbiBhcm91bmQgWCBheGlzIChyYWRpYW5zKVxuICAgICAqIEBwYXJhbSByb2xsIC0gZGVmaW5lcyB0aGUgcm90YXRpb24gYXJvdW5kIFogYXhpcyAocmFkaWFucylcbiAgICAgKiBAcGFyYW0gcmVzdWx0IC0gZGVmaW5lcyB0aGUgdGFyZ2V0IHF1YXRlcm5pb25cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmcm9tUm90YXRpb25ZYXdQaXRjaFJvbGxUb1JlZih5YXcsIHBpdGNoLCByb2xsLCByZXN1bHQpIHtcbiAgICAgICAgLy8gSW1wbGVtZW50ZWQgdW5pdHktYmFzZWQgY2FsY3VsYXRpb25zIGZyb206IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS81NjA1NTgxM1xuICAgICAgICBjb25zdCBoYWxmUGl0Y2ggPSBwaXRjaCAqIDAuNTtcbiAgICAgICAgY29uc3QgaGFsZllhdyA9IHlhdyAqIDAuNTtcbiAgICAgICAgY29uc3QgaGFsZlJvbGwgPSByb2xsICogMC41O1xuICAgICAgICBjb25zdCBjMSA9IE1hdGguY29zKGhhbGZQaXRjaCk7XG4gICAgICAgIGNvbnN0IGMyID0gTWF0aC5jb3MoaGFsZllhdyk7XG4gICAgICAgIGNvbnN0IGMzID0gTWF0aC5jb3MoaGFsZlJvbGwpO1xuICAgICAgICBjb25zdCBzMSA9IE1hdGguc2luKGhhbGZQaXRjaCk7XG4gICAgICAgIGNvbnN0IHMyID0gTWF0aC5zaW4oaGFsZllhdyk7XG4gICAgICAgIGNvbnN0IHMzID0gTWF0aC5zaW4oaGFsZlJvbGwpO1xuICAgICAgICByZXN1bHQueCA9IGMyICogczEgKiBjMyArIHMyICogYzEgKiBzMztcbiAgICAgICAgcmVzdWx0LnkgPSBzMiAqIGMxICogYzMgLSBjMiAqIHMxICogczM7XG4gICAgICAgIHJlc3VsdC56ID0gYzIgKiBjMSAqIHMzIC0gczIgKiBzMSAqIGMzO1xuICAgICAgICByZXN1bHQudyA9IGMyICogYzEgKiBjMyArIHMyICogczEgKiBzMztcbiAgICB9XG4gICAgUXVhdGVybmlvbi5mcm9tUm90YXRpb25ZYXdQaXRjaFJvbGxUb1JlZiA9IGZyb21Sb3RhdGlvbllhd1BpdGNoUm9sbFRvUmVmO1xuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgdGhlIGdpdmVuIHF1YXRlcm5pb24gd2l0aCB0aGUgZ2l2ZW4gcm90YXRpb24gbWF0cml4IHZhbHVlc1xuICAgICAqIEBwYXJhbSBtYXRyaXggLSBkZWZpbmVzIHRoZSBzb3VyY2UgbWF0cml4XG4gICAgICogQHBhcmFtIHJlc3VsdCAtIGRlZmluZXMgdGhlIHRhcmdldCBxdWF0ZXJuaW9uXG4gICAgICovXG4gICAgZnVuY3Rpb24gZnJvbVJvdGF0aW9uTWF0cml4VG9SZWYobWF0cml4LCByZXN1bHQpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IG1hdHJpeC5fbTtcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGU6b25lLXZhcmlhYmxlLXBlci1kZWNsYXJhdGlvblxuICAgICAgICBjb25zdCBtMTEgPSBkYXRhWzBdLCBtMTIgPSBkYXRhWzRdLCBtMTMgPSBkYXRhWzhdO1xuICAgICAgICBjb25zdCBtMjEgPSBkYXRhWzFdLCBtMjIgPSBkYXRhWzVdLCBtMjMgPSBkYXRhWzldO1xuICAgICAgICBjb25zdCBtMzEgPSBkYXRhWzJdLCBtMzIgPSBkYXRhWzZdLCBtMzMgPSBkYXRhWzEwXTtcbiAgICAgICAgLy8gdHNsaW50OmVuYWJsZTpvbmUtdmFyaWFibGUtcGVyLWRlY2xhcmF0aW9uXG4gICAgICAgIGNvbnN0IHRyYWNlID0gbTExICsgbTIyICsgbTMzO1xuICAgICAgICBsZXQgcztcbiAgICAgICAgaWYgKHRyYWNlID4gMCkge1xuICAgICAgICAgICAgcyA9IDAuNSAvIE1hdGguc3FydCh0cmFjZSArIDEuMCk7XG4gICAgICAgICAgICByZXN1bHQudyA9IDAuMjUgLyBzO1xuICAgICAgICAgICAgcmVzdWx0LnggPSAobTMyIC0gbTIzKSAqIHM7XG4gICAgICAgICAgICByZXN1bHQueSA9IChtMTMgLSBtMzEpICogcztcbiAgICAgICAgICAgIHJlc3VsdC56ID0gKG0yMSAtIG0xMikgKiBzO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG0xMSA+IG0yMiAmJiBtMTEgPiBtMzMpIHtcbiAgICAgICAgICAgIHMgPSAyLjAgKiBNYXRoLnNxcnQoMS4wICsgbTExIC0gbTIyIC0gbTMzKTtcbiAgICAgICAgICAgIHJlc3VsdC53ID0gKG0zMiAtIG0yMykgLyBzO1xuICAgICAgICAgICAgcmVzdWx0LnggPSAwLjI1ICogcztcbiAgICAgICAgICAgIHJlc3VsdC55ID0gKG0xMiArIG0yMSkgLyBzO1xuICAgICAgICAgICAgcmVzdWx0LnogPSAobTEzICsgbTMxKSAvIHM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobTIyID4gbTMzKSB7XG4gICAgICAgICAgICBzID0gMi4wICogTWF0aC5zcXJ0KDEuMCArIG0yMiAtIG0xMSAtIG0zMyk7XG4gICAgICAgICAgICByZXN1bHQudyA9IChtMTMgLSBtMzEpIC8gcztcbiAgICAgICAgICAgIHJlc3VsdC54ID0gKG0xMiArIG0yMSkgLyBzO1xuICAgICAgICAgICAgcmVzdWx0LnkgPSAwLjI1ICogcztcbiAgICAgICAgICAgIHJlc3VsdC56ID0gKG0yMyArIG0zMikgLyBzO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcyA9IDIuMCAqIE1hdGguc3FydCgxLjAgKyBtMzMgLSBtMTEgLSBtMjIpO1xuICAgICAgICAgICAgcmVzdWx0LncgPSAobTIxIC0gbTEyKSAvIHM7XG4gICAgICAgICAgICByZXN1bHQueCA9IChtMTMgKyBtMzEpIC8gcztcbiAgICAgICAgICAgIHJlc3VsdC55ID0gKG0yMyArIG0zMikgLyBzO1xuICAgICAgICAgICAgcmVzdWx0LnogPSAwLjI1ICogcztcbiAgICAgICAgfVxuICAgIH1cbiAgICBRdWF0ZXJuaW9uLmZyb21Sb3RhdGlvbk1hdHJpeFRvUmVmID0gZnJvbVJvdGF0aW9uTWF0cml4VG9SZWY7XG4gICAgLyoqXG4gICAgICogSW50ZXJwb2xhdGVzIGJldHdlZW4gdHdvIHF1YXRlcm5pb25zXG4gICAgICogQHBhcmFtIGxlZnQgLSBkZWZpbmVzIGZpcnN0IHF1YXRlcm5pb25cbiAgICAgKiBAcGFyYW0gcmlnaHQgLSBkZWZpbmVzIHNlY29uZCBxdWF0ZXJuaW9uXG4gICAgICogQHBhcmFtIGFtb3VudCAtIGRlZmluZXMgdGhlIGdyYWRpZW50IHRvIHVzZVxuICAgICAqIEByZXR1cm5zIHRoZSBuZXcgaW50ZXJwb2xhdGVkIHF1YXRlcm5pb25cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzbGVycChsZWZ0LCByaWdodCwgYW1vdW50KSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFF1YXRlcm5pb24uSWRlbnRpdHkoKTtcbiAgICAgICAgUXVhdGVybmlvbi5zbGVycFRvUmVmKGxlZnQsIHJpZ2h0LCBhbW91bnQsIHJlc3VsdCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIFF1YXRlcm5pb24uc2xlcnAgPSBzbGVycDtcbiAgICAvKipcbiAgICAgKiBJbnRlcnBvbGF0ZXMgYmV0d2VlbiB0d28gcXVhdGVybmlvbnMgYW5kIHN0b3JlcyBpdCBpbnRvIGEgdGFyZ2V0IHF1YXRlcm5pb25cbiAgICAgKiBAcGFyYW0gbGVmdCAtIGRlZmluZXMgZmlyc3QgcXVhdGVybmlvblxuICAgICAqIEBwYXJhbSByaWdodCAtIGRlZmluZXMgc2Vjb25kIHF1YXRlcm5pb25cbiAgICAgKiBAcGFyYW0gYW1vdW50IC0gZGVmaW5lcyB0aGUgZ3JhZGllbnQgdG8gdXNlXG4gICAgICogQHBhcmFtIHJlc3VsdCAtIGRlZmluZXMgdGhlIHRhcmdldCBxdWF0ZXJuaW9uXG4gICAgICovXG4gICAgZnVuY3Rpb24gc2xlcnBUb1JlZihsZWZ0LCByaWdodCwgYW1vdW50LCByZXN1bHQpIHtcbiAgICAgICAgbGV0IG51bTI7XG4gICAgICAgIGxldCBudW0zO1xuICAgICAgICBsZXQgbnVtNCA9IGxlZnQueCAqIHJpZ2h0LnggKyBsZWZ0LnkgKiByaWdodC55ICsgbGVmdC56ICogcmlnaHQueiArIGxlZnQudyAqIHJpZ2h0Lnc7XG4gICAgICAgIGxldCBmbGFnID0gZmFsc2U7XG4gICAgICAgIGlmIChudW00IDwgMCkge1xuICAgICAgICAgICAgZmxhZyA9IHRydWU7XG4gICAgICAgICAgICBudW00ID0gLW51bTQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG51bTQgPiAwLjk5OTk5OSkge1xuICAgICAgICAgICAgbnVtMyA9IDEgLSBhbW91bnQ7XG4gICAgICAgICAgICBudW0yID0gZmxhZyA/IC1hbW91bnQgOiBhbW91bnQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBudW01ID0gTWF0aC5hY29zKG51bTQpO1xuICAgICAgICAgICAgY29uc3QgbnVtNiA9IDEuMCAvIE1hdGguc2luKG51bTUpO1xuICAgICAgICAgICAgbnVtMyA9IE1hdGguc2luKCgxLjAgLSBhbW91bnQpICogbnVtNSkgKiBudW02O1xuICAgICAgICAgICAgbnVtMiA9IGZsYWdcbiAgICAgICAgICAgICAgICA/IC1NYXRoLnNpbihhbW91bnQgKiBudW01KSAqIG51bTZcbiAgICAgICAgICAgICAgICA6IE1hdGguc2luKGFtb3VudCAqIG51bTUpICogbnVtNjtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHQueCA9IG51bTMgKiBsZWZ0LnggKyBudW0yICogcmlnaHQueDtcbiAgICAgICAgcmVzdWx0LnkgPSBudW0zICogbGVmdC55ICsgbnVtMiAqIHJpZ2h0Lnk7XG4gICAgICAgIHJlc3VsdC56ID0gbnVtMyAqIGxlZnQueiArIG51bTIgKiByaWdodC56O1xuICAgICAgICByZXN1bHQudyA9IG51bTMgKiBsZWZ0LncgKyBudW0yICogcmlnaHQudztcbiAgICB9XG4gICAgUXVhdGVybmlvbi5zbGVycFRvUmVmID0gc2xlcnBUb1JlZjtcbiAgICAvKipcbiAgICAgKiBNdWx0aXBsaWVzIHR3byBxdWF0ZXJuaW9uc1xuICAgICAqIEBwYXJhbSBzZWxmIC0gZGVmaW5lcyB0aGUgZmlyc3Qgb3BlcmFuZFxuICAgICAqIEBwYXJhbSBxMSAtIGRlZmluZXMgdGhlIHNlY29uZCBvcGVyYW5kXG4gICAgICogQHJldHVybnMgYSBuZXcgcXVhdGVybmlvbiBzZXQgYXMgdGhlIG11bHRpcGxpY2F0aW9uIHJlc3VsdCBvZiB0aGUgc2VsZiBvbmUgd2l0aCB0aGUgZ2l2ZW4gb25lIFwicTFcIlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG11bHRpcGx5KHNlbGYsIHExKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGNyZWF0ZSgwLCAwLCAwLCAxLjApO1xuICAgICAgICBtdWx0aXBseVRvUmVmKHNlbGYsIHExLCByZXN1bHQpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBRdWF0ZXJuaW9uLm11bHRpcGx5ID0gbXVsdGlwbHk7XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgZ2l2ZW4gXCJyZXN1bHRcIiBhcyB0aGUgdGhlIG11bHRpcGxpY2F0aW9uIHJlc3VsdCBvZiB0aGUgc2VsZiBvbmUgd2l0aCB0aGUgZ2l2ZW4gb25lIFwicTFcIlxuICAgICAqIEBwYXJhbSBzZWxmIC0gZGVmaW5lcyB0aGUgZmlyc3Qgb3BlcmFuZFxuICAgICAqIEBwYXJhbSBxMSAtIGRlZmluZXMgdGhlIHNlY29uZCBvcGVyYW5kXG4gICAgICogQHBhcmFtIHJlc3VsdCAtIGRlZmluZXMgdGhlIHRhcmdldCBxdWF0ZXJuaW9uXG4gICAgICogQHJldHVybnMgdGhlIGN1cnJlbnQgcXVhdGVybmlvblxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG11bHRpcGx5VG9SZWYoc2VsZiwgcTEsIHJlc3VsdCkge1xuICAgICAgICByZXN1bHQueCA9IHNlbGYueCAqIHExLncgKyBzZWxmLnkgKiBxMS56IC0gc2VsZi56ICogcTEueSArIHNlbGYudyAqIHExLng7XG4gICAgICAgIHJlc3VsdC55ID0gLXNlbGYueCAqIHExLnogKyBzZWxmLnkgKiBxMS53ICsgc2VsZi56ICogcTEueCArIHNlbGYudyAqIHExLnk7XG4gICAgICAgIHJlc3VsdC56ID0gc2VsZi54ICogcTEueSAtIHNlbGYueSAqIHExLnggKyBzZWxmLnogKiBxMS53ICsgc2VsZi53ICogcTEuejtcbiAgICAgICAgcmVzdWx0LncgPSAtc2VsZi54ICogcTEueCAtIHNlbGYueSAqIHExLnkgLSBzZWxmLnogKiBxMS56ICsgc2VsZi53ICogcTEudztcbiAgICB9XG4gICAgUXVhdGVybmlvbi5tdWx0aXBseVRvUmVmID0gbXVsdGlwbHlUb1JlZjtcbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSBkZWdyZWVzIC0gdGhlIGFuZ2xlIGRlZ3JlZXNcbiAgICAgKiBAcGFyYW0gYXhpcyAtIHZlY3RvcjNcbiAgICAgKiBAcmV0dXJucyBhIG5ldyBRdWF0ZXJuaW9uXG4gICAgICovXG4gICAgZnVuY3Rpb24gZnJvbUFuZ2xlQXhpcyhkZWdyZWVzLCBheGlzKSB7XG4gICAgICAgIGlmIChWZWN0b3IzLmxlbmd0aFNxdWFyZWQoYXhpcykgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBRdWF0ZXJuaW9uLklkZW50aXR5KCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gSWRlbnRpdHkoKTtcbiAgICAgICAgbGV0IHJhZGlhbnMgPSBkZWdyZWVzICogREVHMlJBRDtcbiAgICAgICAgcmFkaWFucyAqPSAwLjU7XG4gICAgICAgIGNvbnN0IGEyID0gVmVjdG9yMy5ub3JtYWxpemUoYXhpcyk7XG4gICAgICAgIFZlY3RvcjMuc2NhbGVUb1JlZihhMiwgTWF0aC5zaW4ocmFkaWFucyksIGEyKTtcbiAgICAgICAgcmVzdWx0LnggPSBhMi54O1xuICAgICAgICByZXN1bHQueSA9IGEyLnk7XG4gICAgICAgIHJlc3VsdC56ID0gYTIuejtcbiAgICAgICAgcmVzdWx0LncgPSBNYXRoLmNvcyhyYWRpYW5zKTtcbiAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZShyZXN1bHQpO1xuICAgIH1cbiAgICBRdWF0ZXJuaW9uLmZyb21BbmdsZUF4aXMgPSBmcm9tQW5nbGVBeGlzO1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgcXVhdGVybmlvbiBjb250YWluaW5nIHRoZSByb3RhdGlvbiB2YWx1ZSB0byByZWFjaCB0aGUgdGFyZ2V0IChheGlzMSwgYXhpczIsIGF4aXMzKSBvcmllbnRhdGlvbiBhcyBhIHJvdGF0ZWQgWFlaIHN5c3RlbSAoYXhpczEsIGF4aXMyIGFuZCBheGlzMyBhcmUgbm9ybWFsaXplZCBkdXJpbmcgdGhpcyBvcGVyYXRpb24pXG4gICAgICogQHBhcmFtIGF4aXMxIC0gZGVmaW5lcyB0aGUgZmlyc3QgYXhpc1xuICAgICAqIEBwYXJhbSBheGlzMiAtIGRlZmluZXMgdGhlIHNlY29uZCBheGlzXG4gICAgICogQHBhcmFtIGF4aXMzIC0gZGVmaW5lcyB0aGUgdGhpcmQgYXhpc1xuICAgICAqIEByZXR1cm5zIHRoZSBuZXcgcXVhdGVybmlvblxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZyb21BeGlzVG9Sb3RhdGlvblF1YXRlcm5pb24oYXhpczEsIGF4aXMyLCBheGlzMykge1xuICAgICAgICBjb25zdCBxdWF0ID0gUXVhdGVybmlvbi5jcmVhdGUoMC4wLCAwLjAsIDAuMCwgMC4wKTtcbiAgICAgICAgZnJvbUF4aXNUb1JvdGF0aW9uUXVhdGVybmlvblRvUmVmKGF4aXMxLCBheGlzMiwgYXhpczMsIHF1YXQpO1xuICAgICAgICByZXR1cm4gcXVhdDtcbiAgICB9XG4gICAgUXVhdGVybmlvbi5mcm9tQXhpc1RvUm90YXRpb25RdWF0ZXJuaW9uID0gZnJvbUF4aXNUb1JvdGF0aW9uUXVhdGVybmlvbjtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgcm90YXRpb24gdmFsdWUgdG8gcmVhY2ggdGhlIHRhcmdldCAoYXhpczEsIGF4aXMyLCBheGlzMykgb3JpZW50YXRpb24gYXMgYSByb3RhdGVkIFhZWiBzeXN0ZW0gKGF4aXMxLCBheGlzMiBhbmQgYXhpczMgYXJlIG5vcm1hbGl6ZWQgZHVyaW5nIHRoaXMgb3BlcmF0aW9uKSBhbmQgc3RvcmVzIGl0IGluIHRoZSB0YXJnZXQgcXVhdGVybmlvblxuICAgICAqIEBwYXJhbSBheGlzMSAtIGRlZmluZXMgdGhlIGZpcnN0IGF4aXNcbiAgICAgKiBAcGFyYW0gYXhpczIgLSBkZWZpbmVzIHRoZSBzZWNvbmQgYXhpc1xuICAgICAqIEBwYXJhbSBheGlzMyAtIGRlZmluZXMgdGhlIHRoaXJkIGF4aXNcbiAgICAgKiBAcGFyYW0gcmVmIC0gZGVmaW5lcyB0aGUgdGFyZ2V0IHF1YXRlcm5pb25cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmcm9tQXhpc1RvUm90YXRpb25RdWF0ZXJuaW9uVG9SZWYoYXhpczEsIGF4aXMyLCBheGlzMywgcmVmKSB7XG4gICAgICAgIGNvbnN0IHJvdE1hdCA9IE1hdHJpeC5jcmVhdGUoKTtcbiAgICAgICAgTWF0cml4LmZyb21YWVpBeGVzVG9SZWYoVmVjdG9yMy5ub3JtYWxpemUoYXhpczEpLCBWZWN0b3IzLm5vcm1hbGl6ZShheGlzMiksIFZlY3RvcjMubm9ybWFsaXplKGF4aXMzKSwgcm90TWF0KTtcbiAgICAgICAgUXVhdGVybmlvbi5mcm9tUm90YXRpb25NYXRyaXhUb1JlZihyb3RNYXQsIHJlZik7XG4gICAgfVxuICAgIFF1YXRlcm5pb24uZnJvbUF4aXNUb1JvdGF0aW9uUXVhdGVybmlvblRvUmVmID0gZnJvbUF4aXNUb1JvdGF0aW9uUXVhdGVybmlvblRvUmVmO1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSB6ZXJvIGZpbGxlZCBxdWF0ZXJuaW9uXG4gICAgICovXG4gICAgZnVuY3Rpb24gWmVybygpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZSgwLjAsIDAuMCwgMC4wLCAwLjApO1xuICAgIH1cbiAgICBRdWF0ZXJuaW9uLlplcm8gPSBaZXJvO1xuICAgIC8qKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBSb3RhdGVzIHRoZSB0cmFuc2Zvcm0gc28gdGhlIGZvcndhcmQgdmVjdG9yIHBvaW50cyBhdCB0YXJnZXQncyBjdXJyZW50IHBvc2l0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZyb21Mb29rQXQocG9zaXRpb24sIHRhcmdldCwgd29ybGRVcCA9IFZlY3RvcjMuVXAoKSkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBRdWF0ZXJuaW9uLklkZW50aXR5KCk7XG4gICAgICAgIGZyb21Mb29rQXRUb1JlZihwb3NpdGlvbiwgdGFyZ2V0LCB3b3JsZFVwLCByZXN1bHQpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBRdWF0ZXJuaW9uLmZyb21Mb29rQXQgPSBmcm9tTG9va0F0O1xuICAgIC8qKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBSb3RhdGVzIHRoZSB0cmFuc2Zvcm0gc28gdGhlIGZvcndhcmQgdmVjdG9yIHBvaW50cyBhdCB0YXJnZXQncyBjdXJyZW50IHBvc2l0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZyb21Mb29rQXRUb1JlZihwb3NpdGlvbiwgdGFyZ2V0LCB3b3JsZFVwID0gVmVjdG9yMy5VcCgpLCByZXN1bHQpIHtcbiAgICAgICAgY29uc3QgbSA9IE1hdHJpeC5JZGVudGl0eSgpO1xuICAgICAgICBNYXRyaXgubG9va0F0TEhUb1JlZihwb3NpdGlvbiwgdGFyZ2V0LCB3b3JsZFVwLCBtKTtcbiAgICAgICAgTWF0cml4LmludmVydFRvUmVmKG0sIG0pO1xuICAgICAgICBRdWF0ZXJuaW9uLmZyb21Sb3RhdGlvbk1hdHJpeFRvUmVmKG0sIHJlc3VsdCk7XG4gICAgfVxuICAgIFF1YXRlcm5pb24uZnJvbUxvb2tBdFRvUmVmID0gZnJvbUxvb2tBdFRvUmVmO1xufSkoUXVhdGVybmlvbiB8fCAoUXVhdGVybmlvbiA9IHt9KSk7XG4iLCAiaW1wb3J0IHsgU2NhbGFyIH0gZnJvbSAnLi9TY2FsYXInO1xuaW1wb3J0IHsgVG9MaW5lYXJTcGFjZSwgVG9HYW1tYVNwYWNlIH0gZnJvbSAnLi90eXBlcyc7XG4vKipcbiAqIEBwdWJsaWNcbiAqIENvbG9yNCBpcyBhIHR5cGUgYW5kIGEgbmFtZXNwYWNlLlxuICogYGBgXG4gKiAvLyBUaGUgbmFtZXNwYWNlIGNvbnRhaW5zIGFsbCB0eXBlcyBhbmQgZnVuY3Rpb25zIHRvIG9wZXJhdGVzIHdpdGggQ29sb3I0XG4gKiBDb2xvcjQuYWRkKGJsdWUsIHJlZCkgLy8gc3VtIGNvbXBvbmVudCBieSBjb21wb25lbnQgcmVzdWx0aW5nIHBpbmtcbiAqIC8vIFRoZSB0eXBlIENvbG9yNCBpcyBhbiBhbGlhcyB0byBDb2xvcjQuUmVhZG9ubHlDb2xvcjRcbiAqIGNvbnN0IHJlYWRvbmx5Qmx1ZTogQ29sb3I0ID0gQ29sb3I0LkJsdWUoKVxuICogcmVhZG9ubHlCbHVlLmEgPSAwLjEgLy8gdGhpcyBGQUlMU1xuICpcbiAqIC8vIEZvciBtdXRhYmxlIHVzYWdlLCB1c2UgYENvbG9yNC5NdXRhYmxlYFxuICogY29uc3QgYmx1ZTogQ29sb3I0Lk11dGFibGUgPSBDb2xvcjQuQmx1ZSgpXG4gKiBibHVlLmEgPSAwLjEgLy8gdGhpcyBXT1JLU1xuICogYGBgXG4gKi9cbmV4cG9ydCB2YXIgQ29sb3I0O1xuKGZ1bmN0aW9uIChDb2xvcjQpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGNyZWF0ZSBtdXRhYmxlIENvbG9yNCBmcm9tIHJlZCwgZ3JlZW4sIGJsdWUgdmFsdWVzLCBhbGwgYmV0d2VlbiAwIGFuZCAxXG4gICAgICogQHBhcmFtIHIgLSBkZWZpbmVzIHRoZSByZWQgY29tcG9uZW50IChiZXR3ZWVuIDAgYW5kIDEsIGRlZmF1bHQgaXMgMClcbiAgICAgKiBAcGFyYW0gZyAtIGRlZmluZXMgdGhlIGdyZWVuIGNvbXBvbmVudCAoYmV0d2VlbiAwIGFuZCAxLCBkZWZhdWx0IGlzIDApXG4gICAgICogQHBhcmFtIGIgLSBkZWZpbmVzIHRoZSBibHVlIGNvbXBvbmVudCAoYmV0d2VlbiAwIGFuZCAxLCBkZWZhdWx0IGlzIDApXG4gICAgICogQHBhcmFtIGEgLSBkZWZpbmVzIHRoZSBhbHBoYSBjb21wb25lbnQgKGJldHdlZW4gMCBhbmQgMSwgZGVmYXVsdCBpcyAxKVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShcbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIHRoZSByZWQgY29tcG9uZW50IChiZXR3ZWVuIDAgYW5kIDEsIGRlZmF1bHQgaXMgMClcbiAgICAgKi9cbiAgICByID0gMCwgXG4gICAgLyoqXG4gICAgICogRGVmaW5lcyB0aGUgZ3JlZW4gY29tcG9uZW50IChiZXR3ZWVuIDAgYW5kIDEsIGRlZmF1bHQgaXMgMClcbiAgICAgKi9cbiAgICBnID0gMCwgXG4gICAgLyoqXG4gICAgICogRGVmaW5lcyB0aGUgYmx1ZSBjb21wb25lbnQgKGJldHdlZW4gMCBhbmQgMSwgZGVmYXVsdCBpcyAwKVxuICAgICAqL1xuICAgIGIgPSAwLCBcbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIHRoZSBhbHBoYSBjb21wb25lbnQgKGJldHdlZW4gMCBhbmQgMSwgZGVmYXVsdCBpcyAxKVxuICAgICAqL1xuICAgIGEgPSAxKSB7XG4gICAgICAgIHJldHVybiB7IHIsIGcsIGIsIGEgfTtcbiAgICB9XG4gICAgQ29sb3I0LmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvLyBTdGF0aWNzXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIENvbG9yNCBmcm9tIHRoZSBzdHJpbmcgY29udGFpbmluZyB2YWxpZCBoZXhhZGVjaW1hbCB2YWx1ZXNcbiAgICAgKiBAcGFyYW0gaGV4IC0gZGVmaW5lcyBhIHN0cmluZyBjb250YWluaW5nIHZhbGlkIGhleGFkZWNpbWFsIHZhbHVlc1xuICAgICAqIEByZXR1cm5zIGNyZWF0ZSBtdXRhYmxlIENvbG9yNFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZyb21IZXhTdHJpbmcoaGV4KSB7XG4gICAgICAgIGlmIChoZXguc3Vic3RyaW5nKDAsIDEpICE9PSAnIycgfHwgKGhleC5sZW5ndGggIT09IDcgJiYgaGV4Lmxlbmd0aCAhPT0gOSkpIHtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGUoMC4wLCAwLjAsIDAuMCwgMS4wKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByID0gcGFyc2VJbnQoaGV4LnN1YnN0cmluZygxLCAzKSwgMTYpO1xuICAgICAgICBjb25zdCBnID0gcGFyc2VJbnQoaGV4LnN1YnN0cmluZygzLCA1KSwgMTYpO1xuICAgICAgICBjb25zdCBiID0gcGFyc2VJbnQoaGV4LnN1YnN0cmluZyg1LCA3KSwgMTYpO1xuICAgICAgICBjb25zdCBhU3RyID0gaGV4LnN1YnN0cmluZyg3LCA5KTtcbiAgICAgICAgY29uc3QgYSA9IGFTdHIgPyBwYXJzZUludChhU3RyLCAxNikgOiAyNTU7XG4gICAgICAgIHJldHVybiBDb2xvcjQuZnJvbUludHMociwgZywgYiwgYSk7XG4gICAgfVxuICAgIENvbG9yNC5mcm9tSGV4U3RyaW5nID0gZnJvbUhleFN0cmluZztcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGNyZWF0ZSBtdXRhYmxlIENvbG9yNCAgc2V0IHdpdGggdGhlIGxpbmVhcmx5IGludGVycG9sYXRlZCB2YWx1ZXMgb2YgXCJhbW91bnRcIiBiZXR3ZWVuIHRoZSBsZWZ0IENvbG9yNCBvYmplY3QgYW5kIHRoZSByaWdodCBDb2xvcjQgb2JqZWN0XG4gICAgICogQHBhcmFtIGxlZnQgLSBkZWZpbmVzIHRoZSBzdGFydCB2YWx1ZVxuICAgICAqIEBwYXJhbSByaWdodCAtIGRlZmluZXMgdGhlIGVuZCB2YWx1ZVxuICAgICAqIEBwYXJhbSBhbW91bnQgLSBkZWZpbmVzIHRoZSBncmFkaWVudCBmYWN0b3JcbiAgICAgKiBAcmV0dXJucyBjcmVhdGUgbXV0YWJsZSBDb2xvcjRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsZXJwKGxlZnQsIHJpZ2h0LCBhbW91bnQpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gY3JlYXRlKDAuMCwgMC4wLCAwLjAsIDAuMCk7XG4gICAgICAgIENvbG9yNC5sZXJwVG9SZWYobGVmdCwgcmlnaHQsIGFtb3VudCwgcmVzdWx0KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgQ29sb3I0LmxlcnAgPSBsZXJwO1xuICAgIC8qKlxuICAgICAqIFNldCB0aGUgZ2l2ZW4gXCJyZXN1bHRcIiB3aXRoIHRoZSBsaW5lYXJseSBpbnRlcnBvbGF0ZWQgdmFsdWVzIG9mIFwiYW1vdW50XCIgYmV0d2VlbiB0aGUgbGVmdCBDb2xvcjQgb2JqZWN0IGFuZCB0aGUgcmlnaHQgQ29sb3I0IG9iamVjdFxuICAgICAqIEBwYXJhbSBsZWZ0IC0gZGVmaW5lcyB0aGUgc3RhcnQgdmFsdWVcbiAgICAgKiBAcGFyYW0gcmlnaHQgLSBkZWZpbmVzIHRoZSBlbmQgdmFsdWVcbiAgICAgKiBAcGFyYW0gYW1vdW50IC0gZGVmaW5lcyB0aGUgZ3JhZGllbnQgZmFjdG9yXG4gICAgICogQHBhcmFtIHJlc3VsdCAtIGRlZmluZXMgdGhlIENvbG9yNCBvYmplY3Qgd2hlcmUgdG8gc3RvcmUgZGF0YVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGxlcnBUb1JlZihsZWZ0LCByaWdodCwgYW1vdW50LCByZXN1bHQpIHtcbiAgICAgICAgcmVzdWx0LnIgPSBsZWZ0LnIgKyAocmlnaHQuciAtIGxlZnQucikgKiBhbW91bnQ7XG4gICAgICAgIHJlc3VsdC5nID0gbGVmdC5nICsgKHJpZ2h0LmcgLSBsZWZ0LmcpICogYW1vdW50O1xuICAgICAgICByZXN1bHQuYiA9IGxlZnQuYiArIChyaWdodC5iIC0gbGVmdC5iKSAqIGFtb3VudDtcbiAgICAgICAgcmVzdWx0LmEgPSBsZWZ0LmEgKyAocmlnaHQuYSAtIGxlZnQuYSkgKiBhbW91bnQ7XG4gICAgfVxuICAgIENvbG9yNC5sZXJwVG9SZWYgPSBsZXJwVG9SZWY7XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIENvbG9yNCB2YWx1ZSBjb250YWluaW5nIGEgcmVkIGNvbG9yXG4gICAgICogQHJldHVybnMgYSBuZXcgQ29sb3I0XG4gICAgICovXG4gICAgZnVuY3Rpb24gUmVkKCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlKDEuMCwgMCwgMCwgMS4wKTtcbiAgICB9XG4gICAgQ29sb3I0LlJlZCA9IFJlZDtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgQ29sb3I0IHZhbHVlIGNvbnRhaW5pbmcgYSBncmVlbiBjb2xvclxuICAgICAqIEByZXR1cm5zIGNyZWF0ZSBtdXRhYmxlIENvbG9yNFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIEdyZWVuKCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlKDAsIDEuMCwgMCwgMS4wKTtcbiAgICB9XG4gICAgQ29sb3I0LkdyZWVuID0gR3JlZW47XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIENvbG9yNCB2YWx1ZSBjb250YWluaW5nIGEgYmx1ZSBjb2xvclxuICAgICAqIEByZXR1cm5zIGNyZWF0ZSBtdXRhYmxlIENvbG9yNFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIEJsdWUoKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGUoMCwgMCwgMS4wLCAxLjApO1xuICAgIH1cbiAgICBDb2xvcjQuQmx1ZSA9IEJsdWU7XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIENvbG9yNCB2YWx1ZSBjb250YWluaW5nIGEgYmxhY2sgY29sb3JcbiAgICAgKiBAcmV0dXJucyBjcmVhdGUgbXV0YWJsZSBDb2xvcjRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBCbGFjaygpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZSgwLCAwLCAwLCAxKTtcbiAgICB9XG4gICAgQ29sb3I0LkJsYWNrID0gQmxhY2s7XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIENvbG9yNCB2YWx1ZSBjb250YWluaW5nIGEgd2hpdGUgY29sb3JcbiAgICAgKiBAcmV0dXJucyBjcmVhdGUgbXV0YWJsZSBDb2xvcjRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBXaGl0ZSgpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZSgxLCAxLCAxLCAxKTtcbiAgICB9XG4gICAgQ29sb3I0LldoaXRlID0gV2hpdGU7XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIENvbG9yNCB2YWx1ZSBjb250YWluaW5nIGEgcHVycGxlIGNvbG9yXG4gICAgICogQHJldHVybnMgY3JlYXRlIG11dGFibGUgQ29sb3I0XG4gICAgICovXG4gICAgZnVuY3Rpb24gUHVycGxlKCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlKDAuNSwgMCwgMC41LCAxKTtcbiAgICB9XG4gICAgQ29sb3I0LlB1cnBsZSA9IFB1cnBsZTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgQ29sb3I0IHZhbHVlIGNvbnRhaW5pbmcgYSBtYWdlbnRhIGNvbG9yXG4gICAgICogQHJldHVybnMgY3JlYXRlIG11dGFibGUgQ29sb3I0XG4gICAgICovXG4gICAgZnVuY3Rpb24gTWFnZW50YSgpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZSgxLCAwLCAxLCAxKTtcbiAgICB9XG4gICAgQ29sb3I0Lk1hZ2VudGEgPSBNYWdlbnRhO1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBDb2xvcjQgdmFsdWUgY29udGFpbmluZyBhIHllbGxvdyBjb2xvclxuICAgICAqIEByZXR1cm5zIGNyZWF0ZSBtdXRhYmxlIENvbG9yNFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIFllbGxvdygpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZSgxLCAxLCAwLCAxKTtcbiAgICB9XG4gICAgQ29sb3I0LlllbGxvdyA9IFllbGxvdztcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgQ29sb3I0IHZhbHVlIGNvbnRhaW5pbmcgYSBncmF5IGNvbG9yXG4gICAgICogQHJldHVybnMgY3JlYXRlIG11dGFibGUgQ29sb3I0XG4gICAgICovXG4gICAgZnVuY3Rpb24gR3JheSgpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZSgwLjUsIDAuNSwgMC41LCAxLjApO1xuICAgIH1cbiAgICBDb2xvcjQuR3JheSA9IEdyYXk7XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIENvbG9yNCB2YWx1ZSBjb250YWluaW5nIGEgdGVhbCBjb2xvclxuICAgICAqIEByZXR1cm5zIGNyZWF0ZSBtdXRhYmxlIENvbG9yNFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIFRlYWwoKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGUoMCwgMS4wLCAxLjAsIDEuMCk7XG4gICAgfVxuICAgIENvbG9yNC5UZWFsID0gVGVhbDtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgQ29sb3I0IHZhbHVlIGNvbnRhaW5pbmcgYSB0cmFuc3BhcmVudCBjb2xvclxuICAgICAqIEByZXR1cm5zIGNyZWF0ZSBtdXRhYmxlIENvbG9yNFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIENsZWFyKCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlKDAsIDAsIDAsIDApO1xuICAgIH1cbiAgICBDb2xvcjQuQ2xlYXIgPSBDbGVhcjtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgQ29sb3I0IGZyb20gYSBDb2xvcjMgYW5kIGFuIGFscGhhIHZhbHVlXG4gICAgICogQHBhcmFtIGNvbG9yMyAtIGRlZmluZXMgdGhlIHNvdXJjZSBDb2xvcjMgdG8gcmVhZCBmcm9tXG4gICAgICogQHBhcmFtIGFscGhhIC0gZGVmaW5lcyB0aGUgYWxwaGEgY29tcG9uZW50ICgxLjAgYnkgZGVmYXVsdClcbiAgICAgKiBAcmV0dXJucyBjcmVhdGUgbXV0YWJsZSBDb2xvcjRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmcm9tQ29sb3IzKGNvbG9yMywgYWxwaGEgPSAxLjApIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZShjb2xvcjMuciwgY29sb3IzLmcsIGNvbG9yMy5iLCBhbHBoYSk7XG4gICAgfVxuICAgIENvbG9yNC5mcm9tQ29sb3IzID0gZnJvbUNvbG9yMztcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgQ29sb3I0IGZyb20gdGhlIHN0YXJ0aW5nIGluZGV4IGVsZW1lbnQgb2YgdGhlIGdpdmVuIGFycmF5XG4gICAgICogQHBhcmFtIGFycmF5IC0gZGVmaW5lcyB0aGUgc291cmNlIGFycmF5IHRvIHJlYWQgZnJvbVxuICAgICAqIEBwYXJhbSBvZmZzZXQgLSBkZWZpbmVzIHRoZSBvZmZzZXQgaW4gdGhlIHNvdXJjZSBhcnJheVxuICAgICAqIEByZXR1cm5zIGNyZWF0ZSBtdXRhYmxlIENvbG9yNFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZyb21BcnJheShhcnJheSwgb2Zmc2V0ID0gMCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlKGFycmF5W29mZnNldF0sIGFycmF5W29mZnNldCArIDFdLCBhcnJheVtvZmZzZXQgKyAyXSwgYXJyYXlbb2Zmc2V0ICsgM10pO1xuICAgIH1cbiAgICBDb2xvcjQuZnJvbUFycmF5ID0gZnJvbUFycmF5O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgQ29sb3IzIGZyb20gaW50ZWdlciB2YWx1ZXMgKGxlc3MgdGhhbiAyNTYpXG4gICAgICogQHBhcmFtIHIgLSBkZWZpbmVzIHRoZSByZWQgY29tcG9uZW50IHRvIHJlYWQgZnJvbSAodmFsdWUgYmV0d2VlbiAwIGFuZCAyNTUpXG4gICAgICogQHBhcmFtIGcgLSBkZWZpbmVzIHRoZSBncmVlbiBjb21wb25lbnQgdG8gcmVhZCBmcm9tICh2YWx1ZSBiZXR3ZWVuIDAgYW5kIDI1NSlcbiAgICAgKiBAcGFyYW0gYiAtIGRlZmluZXMgdGhlIGJsdWUgY29tcG9uZW50IHRvIHJlYWQgZnJvbSAodmFsdWUgYmV0d2VlbiAwIGFuZCAyNTUpXG4gICAgICogQHBhcmFtIGEgLSBkZWZpbmVzIHRoZSBhbHBoYSBjb21wb25lbnQgdG8gcmVhZCBmcm9tICh2YWx1ZSBiZXR3ZWVuIDAgYW5kIDI1NSlcbiAgICAgKiBAcmV0dXJucyBhIG5ldyBDb2xvcjRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmcm9tSW50cyhyLCBnLCBiLCBhKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGUociAvIDI1NS4wLCBnIC8gMjU1LjAsIGIgLyAyNTUuMCwgYSAvIDI1NS4wKTtcbiAgICB9XG4gICAgQ29sb3I0LmZyb21JbnRzID0gZnJvbUludHM7XG4gICAgLyoqXG4gICAgICogQ2hlY2sgdGhlIGNvbnRlbnQgb2YgYSBnaXZlbiBhcnJheSBhbmQgY29udmVydCBpdCB0byBhbiBhcnJheSBjb250YWluaW5nIFJHQkEgZGF0YVxuICAgICAqIElmIHRoZSBvcmlnaW5hbCBhcnJheSB3YXMgYWxyZWFkeSBjb250YWluaW5nIGNvdW50ICogNCB2YWx1ZXMgdGhlbiBpdCBpcyByZXR1cm5lZCBkaXJlY3RseVxuICAgICAqIEBwYXJhbSBjb2xvcnMgLSBkZWZpbmVzIHRoZSBhcnJheSB0byBjaGVja1xuICAgICAqIEBwYXJhbSBjb3VudCAtIGRlZmluZXMgdGhlIG51bWJlciBvZiBSR0JBIGRhdGEgdG8gZXhwZWN0XG4gICAgICogQHJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyBjb3VudCAqIDQgdmFsdWVzIChSR0JBKVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNoZWNrQ29sb3JzNChjb2xvcnMsIGNvdW50KSB7XG4gICAgICAgIC8vIENoZWNrIGlmIGNvbG9yMyB3YXMgdXNlZFxuICAgICAgICBpZiAoY29sb3JzLmxlbmd0aCA9PT0gY291bnQgKiAzKSB7XG4gICAgICAgICAgICBjb25zdCBjb2xvcnM0ID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgY29sb3JzLmxlbmd0aDsgaW5kZXggKz0gMykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld0luZGV4ID0gKGluZGV4IC8gMykgKiA0O1xuICAgICAgICAgICAgICAgIGNvbG9yczRbbmV3SW5kZXhdID0gY29sb3JzW2luZGV4XTtcbiAgICAgICAgICAgICAgICBjb2xvcnM0W25ld0luZGV4ICsgMV0gPSBjb2xvcnNbaW5kZXggKyAxXTtcbiAgICAgICAgICAgICAgICBjb2xvcnM0W25ld0luZGV4ICsgMl0gPSBjb2xvcnNbaW5kZXggKyAyXTtcbiAgICAgICAgICAgICAgICBjb2xvcnM0W25ld0luZGV4ICsgM10gPSAxLjA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29sb3JzNDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29sb3JzO1xuICAgIH1cbiAgICBDb2xvcjQuY2hlY2tDb2xvcnM0ID0gY2hlY2tDb2xvcnM0O1xuICAgIC8vIE9wZXJhdG9yc1xuICAgIC8qKlxuICAgICAqIEFkZHMgIHRoZSBnaXZlbiBDb2xvcjQgdmFsdWVzIHRvIHRoZSByZWYgQ29sb3I0IG9iamVjdFxuICAgICAqIEBwYXJhbSBhIC0gZGVmaW5lcyB0aGUgZmlyc3Qgb3BlcmFuZFxuICAgICAqIEBwYXJhbSBiIC0gZGVmaW5lcyB0aGUgc2Vjb25kIG9wZXJhbmRcbiAgICAgKiBAcGFyYW0gcmVmIC0gZGVmaW5lcyB0aGUgcmVzdWx0IHJmZXJlbmNlXG4gICAgICogQHJldHVybnNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhZGRUb1JlZihhLCBiLCByZWYpIHtcbiAgICAgICAgcmVmLnIgPSBhLnIgKyBiLnI7XG4gICAgICAgIHJlZi5nID0gYS5nICsgYi5nO1xuICAgICAgICByZWYuYiA9IGEuYiArIGIuYjtcbiAgICAgICAgcmVmLmEgPSBhLmEgKyBiLmE7XG4gICAgfVxuICAgIENvbG9yNC5hZGRUb1JlZiA9IGFkZFRvUmVmO1xuICAgIC8qKlxuICAgICAqIFN0b3JlcyBmcm9tIHRoZSBzdGFydGluZyBpbmRleCBpbiB0aGUgZ2l2ZW4gYXJyYXkgdGhlIENvbG9yNCBzdWNjZXNzaXZlIHZhbHVlc1xuICAgICAqIEBwYXJhbSBhcnJheSAtIGRlZmluZXMgdGhlIGFycmF5IHdoZXJlIHRvIHN0b3JlIHRoZSByLGcsYiBjb21wb25lbnRzXG4gICAgICogQHBhcmFtIGluZGV4IC0gZGVmaW5lcyBhbiBvcHRpb25hbCBpbmRleCBpbiB0aGUgdGFyZ2V0IGFycmF5IHRvIGRlZmluZSB3aGVyZSB0byBzdGFydCBzdG9yaW5nIHZhbHVlc1xuICAgICAqIEByZXR1cm5zIHRoZSBjdXJyZW50IENvbG9yNCBvYmplY3RcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b0FycmF5KHZhbHVlLCBhcnJheSwgaW5kZXggPSAwKSB7XG4gICAgICAgIGFycmF5W2luZGV4XSA9IHZhbHVlLnI7XG4gICAgICAgIGFycmF5W2luZGV4ICsgMV0gPSB2YWx1ZS5nO1xuICAgICAgICBhcnJheVtpbmRleCArIDJdID0gdmFsdWUuYjtcbiAgICAgICAgYXJyYXlbaW5kZXggKyAzXSA9IHZhbHVlLmE7XG4gICAgfVxuICAgIENvbG9yNC50b0FycmF5ID0gdG9BcnJheTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgQ29sb3I0IHNldCB3aXRoIHRoZSBhZGRlZCB2YWx1ZXMgb2YgdGhlIGN1cnJlbnQgQ29sb3I0IGFuZCBvZiB0aGUgZ2l2ZW4gb25lXG4gICAgICogQHBhcmFtIHJpZ2h0IC0gZGVmaW5lcyB0aGUgc2Vjb25kIG9wZXJhbmRcbiAgICAgKiBAcmV0dXJucyBjcmVhdGUgbXV0YWJsZSBDb2xvcjRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhZGQodmFsdWUsIHJpZ2h0KSB7XG4gICAgICAgIGNvbnN0IHJldCA9IENsZWFyKCk7XG4gICAgICAgIGFkZFRvUmVmKHZhbHVlLCByaWdodCwgcmV0KTtcbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG4gICAgQ29sb3I0LmFkZCA9IGFkZDtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgQ29sb3I0IHNldCB3aXRoIHRoZSBzdWJ0cmFjdGVkIHZhbHVlcyBvZiB0aGUgZ2l2ZW4gb25lIGZyb20gdGhlIGN1cnJlbnQgQ29sb3I0XG4gICAgICogQHBhcmFtIHJpZ2h0IC0gZGVmaW5lcyB0aGUgc2Vjb25kIG9wZXJhbmRcbiAgICAgKiBAcmV0dXJucyBjcmVhdGUgbXV0YWJsZSBDb2xvcjRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdWJ0cmFjdCh2YWx1ZSwgcmlnaHQpIHtcbiAgICAgICAgY29uc3QgcmV0ID0gQ2xlYXIoKTtcbiAgICAgICAgc3VidHJhY3RUb1JlZih2YWx1ZSwgcmlnaHQsIHJldCk7XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuICAgIENvbG9yNC5zdWJ0cmFjdCA9IHN1YnRyYWN0O1xuICAgIC8qKlxuICAgICAqIFN1YnRyYWN0cyB0aGUgZ2l2ZW4gb25lcyBmcm9tIHRoZSBjdXJyZW50IENvbG9yNCB2YWx1ZXMgYW5kIHN0b3JlcyB0aGUgcmVzdWx0cyBpbiBcInJlc3VsdFwiXG4gICAgICogQHBhcmFtIHJpZ2h0IC0gZGVmaW5lcyB0aGUgc2Vjb25kIG9wZXJhbmRcbiAgICAgKiBAcGFyYW0gcmVzdWx0IC0gZGVmaW5lcyB0aGUgQ29sb3I0IG9iamVjdCB3aGVyZSB0byBzdG9yZSB0aGUgcmVzdWx0XG4gICAgICogQHJldHVybnMgdGhlIGN1cnJlbnQgQ29sb3I0IG9iamVjdFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN1YnRyYWN0VG9SZWYoYSwgYiwgcmVzdWx0KSB7XG4gICAgICAgIHJlc3VsdC5yID0gYS5yIC0gYi5yO1xuICAgICAgICByZXN1bHQuZyA9IGEuZyAtIGIuZztcbiAgICAgICAgcmVzdWx0LmIgPSBhLmIgLSBiLmI7XG4gICAgICAgIHJlc3VsdC5hID0gYS5hIC0gYi5hO1xuICAgIH1cbiAgICBDb2xvcjQuc3VidHJhY3RUb1JlZiA9IHN1YnRyYWN0VG9SZWY7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIENvbG9yNCB3aXRoIHRoZSBjdXJyZW50IENvbG9yNCB2YWx1ZXMgbXVsdGlwbGllZCBieSBzY2FsZVxuICAgICAqIEBwYXJhbSBzY2FsZSAtIGRlZmluZXMgdGhlIHNjYWxpbmcgZmFjdG9yIHRvIGFwcGx5XG4gICAgICogQHJldHVybnMgY3JlYXRlIG11dGFibGUgQ29sb3I0XG4gICAgICovXG4gICAgZnVuY3Rpb24gc2NhbGUodmFsdWUsIHNjYWxlKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGUodmFsdWUuciAqIHNjYWxlLCB2YWx1ZS5nICogc2NhbGUsIHZhbHVlLmIgKiBzY2FsZSwgdmFsdWUuYSAqIHNjYWxlKTtcbiAgICB9XG4gICAgQ29sb3I0LnNjYWxlID0gc2NhbGU7XG4gICAgLyoqXG4gICAgICogTXVsdGlwbGllcyB0aGUgY3VycmVudCBDb2xvcjQgdmFsdWVzIGJ5IHNjYWxlIGFuZCBzdG9yZXMgdGhlIHJlc3VsdCBpbiBcInJlc3VsdFwiXG4gICAgICogQHBhcmFtIHNjYWxlIC0gZGVmaW5lcyB0aGUgc2NhbGluZyBmYWN0b3IgdG8gYXBwbHlcbiAgICAgKiBAcGFyYW0gcmVzdWx0IC0gZGVmaW5lcyB0aGUgQ29sb3I0IG9iamVjdCB3aGVyZSB0byBzdG9yZSB0aGUgcmVzdWx0XG4gICAgICovXG4gICAgZnVuY3Rpb24gc2NhbGVUb1JlZih2YWx1ZSwgc2NhbGUsIHJlc3VsdCkge1xuICAgICAgICByZXN1bHQuciA9IHZhbHVlLnIgKiBzY2FsZTtcbiAgICAgICAgcmVzdWx0LmcgPSB2YWx1ZS5nICogc2NhbGU7XG4gICAgICAgIHJlc3VsdC5iID0gdmFsdWUuYiAqIHNjYWxlO1xuICAgICAgICByZXN1bHQuYSA9IHZhbHVlLmEgKiBzY2FsZTtcbiAgICB9XG4gICAgQ29sb3I0LnNjYWxlVG9SZWYgPSBzY2FsZVRvUmVmO1xuICAgIC8qKlxuICAgICAqIFNjYWxlIHRoZSBjdXJyZW50IENvbG9yNCB2YWx1ZXMgYnkgYSBmYWN0b3IgYW5kIGFkZCB0aGUgcmVzdWx0IHRvIGEgZ2l2ZW4gQ29sb3I0XG4gICAgICogQHBhcmFtIHNjYWxlIC0gZGVmaW5lcyB0aGUgc2NhbGUgZmFjdG9yXG4gICAgICogQHBhcmFtIHJlc3VsdCAtIGRlZmluZXMgdGhlIENvbG9yNCBvYmplY3Qgd2hlcmUgdG8gc3RvcmUgdGhlIHJlc3VsdFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNjYWxlQW5kQWRkVG9SZWYodmFsdWUsIHNjYWxlLCByZXN1bHQpIHtcbiAgICAgICAgcmVzdWx0LnIgKz0gdmFsdWUuciAqIHNjYWxlO1xuICAgICAgICByZXN1bHQuZyArPSB2YWx1ZS5nICogc2NhbGU7XG4gICAgICAgIHJlc3VsdC5iICs9IHZhbHVlLmIgKiBzY2FsZTtcbiAgICAgICAgcmVzdWx0LmEgKz0gdmFsdWUuYSAqIHNjYWxlO1xuICAgIH1cbiAgICBDb2xvcjQuc2NhbGVBbmRBZGRUb1JlZiA9IHNjYWxlQW5kQWRkVG9SZWY7XG4gICAgLyoqXG4gICAgICogQ2xhbXBzIHRoZSByZ2IgdmFsdWVzIGJ5IHRoZSBtaW4gYW5kIG1heCB2YWx1ZXMgYW5kIHN0b3JlcyB0aGUgcmVzdWx0IGludG8gXCJyZXN1bHRcIlxuICAgICAqIEBwYXJhbSBtaW4gLSBkZWZpbmVzIG1pbmltdW0gY2xhbXBpbmcgdmFsdWUgKGRlZmF1bHQgaXMgMClcbiAgICAgKiBAcGFyYW0gbWF4IC0gZGVmaW5lcyBtYXhpbXVtIGNsYW1waW5nIHZhbHVlIChkZWZhdWx0IGlzIDEpXG4gICAgICogQHBhcmFtIHJlc3VsdCAtIGRlZmluZXMgY29sb3IgdG8gc3RvcmUgdGhlIHJlc3VsdCBpbnRvLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsYW1wVG9SZWYodmFsdWUsIG1pbiA9IDAsIG1heCA9IDEsIHJlc3VsdCkge1xuICAgICAgICByZXN1bHQuciA9IFNjYWxhci5jbGFtcCh2YWx1ZS5yLCBtaW4sIG1heCk7XG4gICAgICAgIHJlc3VsdC5nID0gU2NhbGFyLmNsYW1wKHZhbHVlLmcsIG1pbiwgbWF4KTtcbiAgICAgICAgcmVzdWx0LmIgPSBTY2FsYXIuY2xhbXAodmFsdWUuYiwgbWluLCBtYXgpO1xuICAgICAgICByZXN1bHQuYSA9IFNjYWxhci5jbGFtcCh2YWx1ZS5hLCBtaW4sIG1heCk7XG4gICAgfVxuICAgIENvbG9yNC5jbGFtcFRvUmVmID0gY2xhbXBUb1JlZjtcbiAgICAvKipcbiAgICAgKiBNdWx0aXB5IGFuIENvbG9yNCB2YWx1ZSBieSBhbm90aGVyIGFuZCByZXR1cm4gY3JlYXRlIG11dGFibGUgQ29sb3I0XG4gICAgICogQHBhcmFtIGNvbG9yIC0gZGVmaW5lcyB0aGUgQ29sb3I0IHZhbHVlIHRvIG11bHRpcGx5IGJ5XG4gICAgICogQHJldHVybnMgY3JlYXRlIG11dGFibGUgQ29sb3I0XG4gICAgICovXG4gICAgZnVuY3Rpb24gbXVsdGlwbHkodmFsdWUsIGNvbG9yKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGUodmFsdWUuciAqIGNvbG9yLnIsIHZhbHVlLmcgKiBjb2xvci5nLCB2YWx1ZS5iICogY29sb3IuYiwgdmFsdWUuYSAqIGNvbG9yLmEpO1xuICAgIH1cbiAgICBDb2xvcjQubXVsdGlwbHkgPSBtdWx0aXBseTtcbiAgICAvKipcbiAgICAgKiBNdWx0aXB5IGEgQ29sb3I0IHZhbHVlIGJ5IGFub3RoZXIgYW5kIHB1c2ggdGhlIHJlc3VsdCBpbiBhIHJlZmVyZW5jZSB2YWx1ZVxuICAgICAqIEBwYXJhbSBjb2xvciAtIGRlZmluZXMgdGhlIENvbG9yNCB2YWx1ZSB0byBtdWx0aXBseSBieVxuICAgICAqIEBwYXJhbSByZXN1bHQgLSBkZWZpbmVzIHRoZSBDb2xvcjQgdG8gZmlsbCB0aGUgcmVzdWx0IGluXG4gICAgICogQHJldHVybnMgdGhlIHJlc3VsdCBDb2xvcjRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtdWx0aXBseVRvUmVmKHZhbHVlLCBjb2xvciwgcmVzdWx0KSB7XG4gICAgICAgIHJlc3VsdC5yID0gdmFsdWUuciAqIGNvbG9yLnI7XG4gICAgICAgIHJlc3VsdC5nID0gdmFsdWUuZyAqIGNvbG9yLmc7XG4gICAgICAgIHJlc3VsdC5iID0gdmFsdWUuYiAqIGNvbG9yLmI7XG4gICAgICAgIHJlc3VsdC5hID0gdmFsdWUuYSAqIGNvbG9yLmE7XG4gICAgfVxuICAgIENvbG9yNC5tdWx0aXBseVRvUmVmID0gbXVsdGlwbHlUb1JlZjtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc3RyaW5nIHdpdGggdGhlIENvbG9yNCBjdXJyZW50IHZhbHVlc1xuICAgICAqIEByZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIENvbG9yNCBvYmplY3RcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b1N0cmluZyh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gKCd7UjogJyArXG4gICAgICAgICAgICB2YWx1ZS5yICtcbiAgICAgICAgICAgICcgRzonICtcbiAgICAgICAgICAgIHZhbHVlLmcgK1xuICAgICAgICAgICAgJyBCOicgK1xuICAgICAgICAgICAgdmFsdWUuYiArXG4gICAgICAgICAgICAnIEE6JyArXG4gICAgICAgICAgICB2YWx1ZS5hICtcbiAgICAgICAgICAgICd9Jyk7XG4gICAgfVxuICAgIENvbG9yNC50b1N0cmluZyA9IHRvU3RyaW5nO1xuICAgIC8qKlxuICAgICAqIENvbXB1dGUgdGhlIENvbG9yNCBoYXNoIGNvZGVcbiAgICAgKiBAcmV0dXJucyBhbiB1bmlxdWUgbnVtYmVyIHRoYXQgY2FuIGJlIHVzZWQgdG8gaGFzaCBDb2xvcjQgb2JqZWN0c1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldEhhc2hDb2RlKHZhbHVlKSB7XG4gICAgICAgIGxldCBoYXNoID0gdmFsdWUuciB8fCAwO1xuICAgICAgICBoYXNoID0gKGhhc2ggKiAzOTcpIF4gKHZhbHVlLmcgfHwgMCk7XG4gICAgICAgIGhhc2ggPSAoaGFzaCAqIDM5NykgXiAodmFsdWUuYiB8fCAwKTtcbiAgICAgICAgaGFzaCA9IChoYXNoICogMzk3KSBeICh2YWx1ZS5hIHx8IDApO1xuICAgICAgICByZXR1cm4gaGFzaDtcbiAgICB9XG4gICAgQ29sb3I0LmdldEhhc2hDb2RlID0gZ2V0SGFzaENvZGU7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIENvbG9yNCBjb3BpZWQgZnJvbSB0aGUgY3VycmVudCBvbmVcbiAgICAgKiBAcmV0dXJucyBjcmVhdGUgbXV0YWJsZSBDb2xvcjRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjbG9uZSh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gY3JlYXRlKHZhbHVlLnIsIHZhbHVlLmcsIHZhbHVlLmIsIHZhbHVlLmEpO1xuICAgIH1cbiAgICBDb2xvcjQuY2xvbmUgPSBjbG9uZTtcbiAgICAvKipcbiAgICAgKiBDb3BpZXMgdGhlIGdpdmVuIENvbG9yNCB2YWx1ZXMgaW50byB0aGUgZGVzdGluYXRpb25cbiAgICAgKiBAcGFyYW0gc291cmNlIC0gZGVmaW5lcyB0aGUgc291cmNlIENvbG9yNCBvYmplY3RcbiAgICAgKiBAcGFyYW0gZGVzdCAtIGRlZmluZXMgdGhlIGRlc3RpbmF0aW9uIENvbG9yNCBvYmplY3RcbiAgICAgKiBAcmV0dXJuc1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvcHlGcm9tKHNvdXJjZSwgZGVzdCkge1xuICAgICAgICBkZXN0LnIgPSBzb3VyY2UucjtcbiAgICAgICAgZGVzdC5nID0gc291cmNlLmc7XG4gICAgICAgIGRlc3QuYiA9IHNvdXJjZS5iO1xuICAgICAgICBkZXN0LmEgPSBzb3VyY2UuYTtcbiAgICB9XG4gICAgQ29sb3I0LmNvcHlGcm9tID0gY29weUZyb207XG4gICAgLyoqXG4gICAgICogQ29waWVzIHRoZSBnaXZlbiBmbG9hdCB2YWx1ZXMgaW50byB0aGUgY3VycmVudCBvbmVcbiAgICAgKiBAcGFyYW0gciAtIGRlZmluZXMgdGhlIHJlZCBjb21wb25lbnQgdG8gcmVhZCBmcm9tXG4gICAgICogQHBhcmFtIGcgLSBkZWZpbmVzIHRoZSBncmVlbiBjb21wb25lbnQgdG8gcmVhZCBmcm9tXG4gICAgICogQHBhcmFtIGIgLSBkZWZpbmVzIHRoZSBibHVlIGNvbXBvbmVudCB0byByZWFkIGZyb21cbiAgICAgKiBAcGFyYW0gYSAtIGRlZmluZXMgdGhlIGFscGhhIGNvbXBvbmVudCB0byByZWFkIGZyb21cbiAgICAgKiBAcmV0dXJucyB0aGUgY3VycmVudCB1cGRhdGVkIENvbG9yNCBvYmplY3RcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb3B5RnJvbUZsb2F0cyhyLCBnLCBiLCBhLCBkZXN0KSB7XG4gICAgICAgIGRlc3QuciA9IHI7XG4gICAgICAgIGRlc3QuZyA9IGc7XG4gICAgICAgIGRlc3QuYiA9IGI7XG4gICAgICAgIGRlc3QuYSA9IGE7XG4gICAgfVxuICAgIENvbG9yNC5jb3B5RnJvbUZsb2F0cyA9IGNvcHlGcm9tRmxvYXRzO1xuICAgIC8qKlxuICAgICAqIENvcGllcyB0aGUgZ2l2ZW4gZmxvYXQgdmFsdWVzIGludG8gdGhlIGN1cnJlbnQgb25lXG4gICAgICogQHBhcmFtIHIgLSBkZWZpbmVzIHRoZSByZWQgY29tcG9uZW50IHRvIHJlYWQgZnJvbVxuICAgICAqIEBwYXJhbSBnIC0gZGVmaW5lcyB0aGUgZ3JlZW4gY29tcG9uZW50IHRvIHJlYWQgZnJvbVxuICAgICAqIEBwYXJhbSBiIC0gZGVmaW5lcyB0aGUgYmx1ZSBjb21wb25lbnQgdG8gcmVhZCBmcm9tXG4gICAgICogQHBhcmFtIGEgLSBkZWZpbmVzIHRoZSBhbHBoYSBjb21wb25lbnQgdG8gcmVhZCBmcm9tXG4gICAgICogQHJldHVybnMgdGhlIGN1cnJlbnQgdXBkYXRlZCBDb2xvcjQgb2JqZWN0XG4gICAgICovXG4gICAgZnVuY3Rpb24gc2V0KHIsIGcsIGIsIGEsIGRlc3QpIHtcbiAgICAgICAgZGVzdC5yID0gcjtcbiAgICAgICAgZGVzdC5nID0gZztcbiAgICAgICAgZGVzdC5iID0gYjtcbiAgICAgICAgZGVzdC5hID0gYTtcbiAgICB9XG4gICAgQ29sb3I0LnNldCA9IHNldDtcbiAgICAvKipcbiAgICAgKiBDb21wdXRlIHRoZSBDb2xvcjQgaGV4YWRlY2ltYWwgY29kZSBhcyBhIHN0cmluZ1xuICAgICAqIEByZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGhleGFkZWNpbWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBDb2xvcjQgb2JqZWN0XG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9IZXhTdHJpbmcodmFsdWUpIHtcbiAgICAgICAgY29uc3QgaW50UiA9ICh2YWx1ZS5yICogMjU1KSB8IDA7XG4gICAgICAgIGNvbnN0IGludEcgPSAodmFsdWUuZyAqIDI1NSkgfCAwO1xuICAgICAgICBjb25zdCBpbnRCID0gKHZhbHVlLmIgKiAyNTUpIHwgMDtcbiAgICAgICAgY29uc3QgaW50QSA9ICh2YWx1ZS5hICogMjU1KSB8IDA7XG4gICAgICAgIHJldHVybiAoJyMnICtcbiAgICAgICAgICAgIFNjYWxhci50b0hleChpbnRSKSArXG4gICAgICAgICAgICBTY2FsYXIudG9IZXgoaW50RykgK1xuICAgICAgICAgICAgU2NhbGFyLnRvSGV4KGludEIpICtcbiAgICAgICAgICAgIFNjYWxhci50b0hleChpbnRBKSk7XG4gICAgfVxuICAgIENvbG9yNC50b0hleFN0cmluZyA9IHRvSGV4U3RyaW5nO1xuICAgIC8qKlxuICAgICAqIENvbXB1dGVzIGEgQ29sb3I0IGNvbnZlcnRlZCBmcm9tIHRoZSBjdXJyZW50IG9uZSB0byBsaW5lYXIgc3BhY2VcbiAgICAgKiBAcmV0dXJucyBjcmVhdGUgbXV0YWJsZSBDb2xvcjRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b0xpbmVhclNwYWNlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNvbnZlcnRlZENvbG9yID0gY3JlYXRlKCk7XG4gICAgICAgIHRvTGluZWFyU3BhY2VUb1JlZih2YWx1ZSwgY29udmVydGVkQ29sb3IpO1xuICAgICAgICByZXR1cm4gY29udmVydGVkQ29sb3I7XG4gICAgfVxuICAgIENvbG9yNC50b0xpbmVhclNwYWNlID0gdG9MaW5lYXJTcGFjZTtcbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyB0aGUgQ29sb3I0IHZhbHVlcyB0byBsaW5lYXIgc3BhY2UgYW5kIHN0b3JlcyB0aGUgcmVzdWx0IGluIFwiY29udmVydGVkQ29sb3JcIlxuICAgICAqIEBwYXJhbSBjb252ZXJ0ZWRDb2xvciAtIGRlZmluZXMgdGhlIENvbG9yNCBvYmplY3Qgd2hlcmUgdG8gc3RvcmUgdGhlIGxpbmVhciBzcGFjZSB2ZXJzaW9uXG4gICAgICogQHJldHVybnMgdGhlIHVubW9kaWZpZWQgQ29sb3I0XG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9MaW5lYXJTcGFjZVRvUmVmKHZhbHVlLCByZWYpIHtcbiAgICAgICAgcmVmLnIgPSBNYXRoLnBvdyh2YWx1ZS5yLCBUb0xpbmVhclNwYWNlKTtcbiAgICAgICAgcmVmLmcgPSBNYXRoLnBvdyh2YWx1ZS5nLCBUb0xpbmVhclNwYWNlKTtcbiAgICAgICAgcmVmLmIgPSBNYXRoLnBvdyh2YWx1ZS5iLCBUb0xpbmVhclNwYWNlKTtcbiAgICAgICAgcmVmLmEgPSB2YWx1ZS5hO1xuICAgIH1cbiAgICBDb2xvcjQudG9MaW5lYXJTcGFjZVRvUmVmID0gdG9MaW5lYXJTcGFjZVRvUmVmO1xuICAgIC8qKlxuICAgICAqIENvbXB1dGVzIGEgQ29sb3I0IGNvbnZlcnRlZCBmcm9tIHRoZSBjdXJyZW50IG9uZSB0byBnYW1tYSBzcGFjZVxuICAgICAqIEByZXR1cm5zIGNyZWF0ZSBtdXRhYmxlIENvbG9yNFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvR2FtbWFTcGFjZSh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjb252ZXJ0ZWRDb2xvciA9IGNyZWF0ZSgpO1xuICAgICAgICB0b0dhbW1hU3BhY2VUb1JlZih2YWx1ZSwgY29udmVydGVkQ29sb3IpO1xuICAgICAgICByZXR1cm4gY29udmVydGVkQ29sb3I7XG4gICAgfVxuICAgIENvbG9yNC50b0dhbW1hU3BhY2UgPSB0b0dhbW1hU3BhY2U7XG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhlIENvbG9yNCB2YWx1ZXMgdG8gZ2FtbWEgc3BhY2UgYW5kIHN0b3JlcyB0aGUgcmVzdWx0IGluIFwiY29udmVydGVkQ29sb3JcIlxuICAgICAqIEBwYXJhbSBjb252ZXJ0ZWRDb2xvciAtIGRlZmluZXMgdGhlIENvbG9yNCBvYmplY3Qgd2hlcmUgdG8gc3RvcmUgdGhlIGdhbW1hIHNwYWNlIHZlcnNpb25cbiAgICAgKiBAcmV0dXJucyB0aGUgdW5tb2RpZmllZCBDb2xvcjRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b0dhbW1hU3BhY2VUb1JlZih2YWx1ZSwgY29udmVydGVkQ29sb3IpIHtcbiAgICAgICAgY29udmVydGVkQ29sb3IuciA9IE1hdGgucG93KHZhbHVlLnIsIFRvR2FtbWFTcGFjZSk7XG4gICAgICAgIGNvbnZlcnRlZENvbG9yLmcgPSBNYXRoLnBvdyh2YWx1ZS5nLCBUb0dhbW1hU3BhY2UpO1xuICAgICAgICBjb252ZXJ0ZWRDb2xvci5iID0gTWF0aC5wb3codmFsdWUuYiwgVG9HYW1tYVNwYWNlKTtcbiAgICAgICAgY29udmVydGVkQ29sb3IuYSA9IHZhbHVlLmE7XG4gICAgfVxuICAgIENvbG9yNC50b0dhbW1hU3BhY2VUb1JlZiA9IHRvR2FtbWFTcGFjZVRvUmVmO1xufSkoQ29sb3I0IHx8IChDb2xvcjQgPSB7fSkpO1xuIiwgImltcG9ydCB7IFRvTGluZWFyU3BhY2UsIFRvR2FtbWFTcGFjZSB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgQ29sb3I0IH0gZnJvbSAnLi9Db2xvcjQnO1xuaW1wb3J0IHsgU2NhbGFyIH0gZnJvbSAnLi9TY2FsYXInO1xuLyoqXG4gKiBAcHVibGljXG4gKiBDb2xvcjMgaXMgYSB0eXBlIGFuZCBhIG5hbWVzcGFjZS5cbiAqIGBgYFxuICogLy8gVGhlIG5hbWVzcGFjZSBjb250YWlucyBhbGwgdHlwZXMgYW5kIGZ1bmN0aW9ucyB0byBvcGVyYXRlcyB3aXRoIENvbG9yM1xuICogQ29sb3IzLmFkZChibHVlLCByZWQpIC8vIHN1bSBjb21wb25lbnQgYnkgY29tcG9uZW50IHJlc3VsdGluZyBwaW5rXG4gKiAvLyBUaGUgdHlwZSBDb2xvcjMgaXMgYW4gYWxpYXMgdG8gQ29sb3IzLlJlYWRvbmx5Q29sb3IzXG4gKiBjb25zdCByZWFkb25seUJsdWU6IENvbG9yMyA9IENvbG9yMy5CbHVlKClcbiAqIHJlYWRvbmx5Qmx1ZS5yID0gMC4xIC8vIHRoaXMgRkFJTFNcbiAqXG4gKiAvLyBGb3IgbXV0YWJsZSB1c2FnZSwgdXNlIGBDb2xvcjMuTXV0YWJsZWBcbiAqIGNvbnN0IGJsdWU6IENvbG9yMy5NdXRhYmxlID0gQ29sb3IzLkJsdWUoKVxuICogYmx1ZS5yID0gMC4xIC8vIHRoaXMgV09SS1NcbiAqIGBgYFxuICovXG5leHBvcnQgdmFyIENvbG9yMztcbihmdW5jdGlvbiAoQ29sb3IzKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBDb2xvcjMgb2JqZWN0IGZyb20gcmVkLCBncmVlbiwgYmx1ZSB2YWx1ZXMsIGFsbCBiZXR3ZWVuIDAgYW5kIDFcbiAgICAgKiBAcGFyYW0gciAtIGRlZmluZXMgdGhlIHJlZCBjb21wb25lbnQgKGJldHdlZW4gMCBhbmQgMSwgZGVmYXVsdCBpcyAwKVxuICAgICAqIEBwYXJhbSBnIC0gZGVmaW5lcyB0aGUgZ3JlZW4gY29tcG9uZW50IChiZXR3ZWVuIDAgYW5kIDEsIGRlZmF1bHQgaXMgMClcbiAgICAgKiBAcGFyYW0gYiAtIGRlZmluZXMgdGhlIGJsdWUgY29tcG9uZW50IChiZXR3ZWVuIDAgYW5kIDEsIGRlZmF1bHQgaXMgMClcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUoXG4gICAgLyoqXG4gICAgICogRGVmaW5lcyB0aGUgcmVkIGNvbXBvbmVudCAoYmV0d2VlbiAwIGFuZCAxLCBkZWZhdWx0IGlzIDApXG4gICAgICovXG4gICAgciA9IDAsIFxuICAgIC8qKlxuICAgICAqIERlZmluZXMgdGhlIGdyZWVuIGNvbXBvbmVudCAoYmV0d2VlbiAwIGFuZCAxLCBkZWZhdWx0IGlzIDApXG4gICAgICovXG4gICAgZyA9IDAsIFxuICAgIC8qKlxuICAgICAqIERlZmluZXMgdGhlIGJsdWUgY29tcG9uZW50IChiZXR3ZWVuIDAgYW5kIDEsIGRlZmF1bHQgaXMgMClcbiAgICAgKi9cbiAgICBiID0gMCkge1xuICAgICAgICByZXR1cm4geyByLCBnLCBiIH07XG4gICAgfVxuICAgIENvbG9yMy5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIFZlY3RvcjMgZnJvbSB0aGUgc3RyaW5nIGNvbnRhaW5pbmcgdmFsaWQgaGV4YWRlY2ltYWwgdmFsdWVzXG4gICAgICogQHBhcmFtIGhleCAtIGRlZmluZXMgYSBzdHJpbmcgY29udGFpbmluZyB2YWxpZCBoZXhhZGVjaW1hbCB2YWx1ZXNcbiAgICAgKiBAcmV0dXJucyBhIG5ldyBWZWN0b3IzXG4gICAgICovXG4gICAgZnVuY3Rpb24gZnJvbUhleFN0cmluZyhoZXgpIHtcbiAgICAgICAgaWYgKGhleC5zdWJzdHJpbmcoMCwgMSkgIT09ICcjJyB8fCBoZXgubGVuZ3RoICE9PSA3KSB7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlKDAsIDAsIDApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHIgPSBwYXJzZUludChoZXguc3Vic3RyaW5nKDEsIDMpLCAxNik7XG4gICAgICAgIGNvbnN0IGcgPSBwYXJzZUludChoZXguc3Vic3RyaW5nKDMsIDUpLCAxNik7XG4gICAgICAgIGNvbnN0IGIgPSBwYXJzZUludChoZXguc3Vic3RyaW5nKDUsIDcpLCAxNik7XG4gICAgICAgIHJldHVybiBmcm9tSW50cyhyLCBnLCBiKTtcbiAgICB9XG4gICAgQ29sb3IzLmZyb21IZXhTdHJpbmcgPSBmcm9tSGV4U3RyaW5nO1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgVmVjdG9yMyBmcm9tIHRoZSBzdGFydGluZyBpbmRleCBvZiB0aGUgZ2l2ZW4gYXJyYXlcbiAgICAgKiBAcGFyYW0gYXJyYXkgLSBkZWZpbmVzIHRoZSBzb3VyY2UgYXJyYXlcbiAgICAgKiBAcGFyYW0gb2Zmc2V0IC0gZGVmaW5lcyBhbiBvZmZzZXQgaW4gdGhlIHNvdXJjZSBhcnJheVxuICAgICAqIEByZXR1cm5zIGEgbmV3IFZlY3RvcjNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmcm9tQXJyYXkoYXJyYXksIG9mZnNldCA9IDApIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZShhcnJheVtvZmZzZXRdLCBhcnJheVtvZmZzZXQgKyAxXSwgYXJyYXlbb2Zmc2V0ICsgMl0pO1xuICAgIH1cbiAgICBDb2xvcjMuZnJvbUFycmF5ID0gZnJvbUFycmF5O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBWZWN0b3IzIGZyb20gaW50ZWdlciB2YWx1ZXMgKGxlc3MgdGhhbiAyNTYpXG4gICAgICogQHBhcmFtIHIgLSBkZWZpbmVzIHRoZSByZWQgY29tcG9uZW50IHRvIHJlYWQgZnJvbSAodmFsdWUgYmV0d2VlbiAwIGFuZCAyNTUpXG4gICAgICogQHBhcmFtIGcgLSBkZWZpbmVzIHRoZSBncmVlbiBjb21wb25lbnQgdG8gcmVhZCBmcm9tICh2YWx1ZSBiZXR3ZWVuIDAgYW5kIDI1NSlcbiAgICAgKiBAcGFyYW0gYiAtIGRlZmluZXMgdGhlIGJsdWUgY29tcG9uZW50IHRvIHJlYWQgZnJvbSAodmFsdWUgYmV0d2VlbiAwIGFuZCAyNTUpXG4gICAgICogQHJldHVybnMgYSBuZXcgVmVjdG9yM1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZyb21JbnRzKHIsIGcsIGIpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZShyIC8gMjU1LjAsIGcgLyAyNTUuMCwgYiAvIDI1NS4wKTtcbiAgICB9XG4gICAgQ29sb3IzLmZyb21JbnRzID0gZnJvbUludHM7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIFZlY3RvcjMgd2l0aCB2YWx1ZXMgbGluZWFybHkgaW50ZXJwb2xhdGVkIG9mIFwiYW1vdW50XCIgYmV0d2VlbiB0aGUgc3RhcnQgQ29sb3IzIGFuZCB0aGUgZW5kIENvbG9yM1xuICAgICAqIEBwYXJhbSBzdGFydCAtIGRlZmluZXMgdGhlIHN0YXJ0IENvbG9yMyB2YWx1ZVxuICAgICAqIEBwYXJhbSBlbmQgLSBkZWZpbmVzIHRoZSBlbmQgQ29sb3IzIHZhbHVlXG4gICAgICogQHBhcmFtIGFtb3VudCAtIGRlZmluZXMgdGhlIGdyYWRpZW50IHZhbHVlIGJldHdlZW4gc3RhcnQgYW5kIGVuZFxuICAgICAqIEByZXR1cm5zIGEgbmV3IFZlY3RvcjNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsZXJwKHN0YXJ0LCBlbmQsIGFtb3VudCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBjcmVhdGUoMC4wLCAwLjAsIDAuMCk7XG4gICAgICAgIENvbG9yMy5sZXJwVG9SZWYoc3RhcnQsIGVuZCwgYW1vdW50LCByZXN1bHQpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBDb2xvcjMubGVycCA9IGxlcnA7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIFZlY3RvcjMgd2l0aCB2YWx1ZXMgbGluZWFybHkgaW50ZXJwb2xhdGVkIG9mIFwiYW1vdW50XCIgYmV0d2VlbiB0aGUgc3RhcnQgQ29sb3IzIGFuZCB0aGUgZW5kIENvbG9yM1xuICAgICAqIEBwYXJhbSBsZWZ0IC0gZGVmaW5lcyB0aGUgc3RhcnQgdmFsdWVcbiAgICAgKiBAcGFyYW0gcmlnaHQgLSBkZWZpbmVzIHRoZSBlbmQgdmFsdWVcbiAgICAgKiBAcGFyYW0gYW1vdW50IC0gZGVmaW5lcyB0aGUgZ3JhZGllbnQgZmFjdG9yXG4gICAgICogQHBhcmFtIHJlc3VsdCAtIGRlZmluZXMgdGhlIENvbG9yMyBvYmplY3Qgd2hlcmUgdG8gc3RvcmUgdGhlIHJlc3VsdFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGxlcnBUb1JlZihsZWZ0LCByaWdodCwgYW1vdW50LCByZXN1bHQpIHtcbiAgICAgICAgcmVzdWx0LnIgPSBsZWZ0LnIgKyAocmlnaHQuciAtIGxlZnQucikgKiBhbW91bnQ7XG4gICAgICAgIHJlc3VsdC5nID0gbGVmdC5nICsgKHJpZ2h0LmcgLSBsZWZ0LmcpICogYW1vdW50O1xuICAgICAgICByZXN1bHQuYiA9IGxlZnQuYiArIChyaWdodC5iIC0gbGVmdC5iKSAqIGFtb3VudDtcbiAgICB9XG4gICAgQ29sb3IzLmxlcnBUb1JlZiA9IGxlcnBUb1JlZjtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgQ29sb3IzIHZhbHVlIGNvbnRhaW5pbmcgYSByZWQgY29sb3JcbiAgICAgKiBAcmV0dXJucyBhIG5ldyBWZWN0b3IzXG4gICAgICovXG4gICAgZnVuY3Rpb24gUmVkKCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlKDEsIDAsIDApO1xuICAgIH1cbiAgICBDb2xvcjMuUmVkID0gUmVkO1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBDb2xvcjMgdmFsdWUgY29udGFpbmluZyBhIGdyZWVuIGNvbG9yXG4gICAgICogQHJldHVybnMgYSBuZXcgVmVjdG9yM1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIEdyZWVuKCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlKDAsIDEsIDApO1xuICAgIH1cbiAgICBDb2xvcjMuR3JlZW4gPSBHcmVlbjtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgQ29sb3IzIHZhbHVlIGNvbnRhaW5pbmcgYSBibHVlIGNvbG9yXG4gICAgICogQHJldHVybnMgYSBuZXcgVmVjdG9yM1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIEJsdWUoKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGUoMCwgMCwgMSk7XG4gICAgfVxuICAgIENvbG9yMy5CbHVlID0gQmx1ZTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgQ29sb3IzIHZhbHVlIGNvbnRhaW5pbmcgYSBibGFjayBjb2xvclxuICAgICAqIEByZXR1cm5zIGEgbmV3IFZlY3RvcjNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBCbGFjaygpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZSgwLCAwLCAwKTtcbiAgICB9XG4gICAgQ29sb3IzLkJsYWNrID0gQmxhY2s7XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIENvbG9yMyB2YWx1ZSBjb250YWluaW5nIGEgd2hpdGUgY29sb3JcbiAgICAgKiBAcmV0dXJucyBhIG5ldyBWZWN0b3IzXG4gICAgICovXG4gICAgZnVuY3Rpb24gV2hpdGUoKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGUoMSwgMSwgMSk7XG4gICAgfVxuICAgIENvbG9yMy5XaGl0ZSA9IFdoaXRlO1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBDb2xvcjMgdmFsdWUgY29udGFpbmluZyBhIHB1cnBsZSBjb2xvclxuICAgICAqIEByZXR1cm5zIGEgbmV3IFZlY3RvcjNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBQdXJwbGUoKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGUoMC41LCAwLCAwLjUpO1xuICAgIH1cbiAgICBDb2xvcjMuUHVycGxlID0gUHVycGxlO1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBDb2xvcjMgdmFsdWUgY29udGFpbmluZyBhIG1hZ2VudGEgY29sb3JcbiAgICAgKiBAcmV0dXJucyBhIG5ldyBWZWN0b3IzXG4gICAgICovXG4gICAgZnVuY3Rpb24gTWFnZW50YSgpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZSgxLCAwLCAxKTtcbiAgICB9XG4gICAgQ29sb3IzLk1hZ2VudGEgPSBNYWdlbnRhO1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBDb2xvcjMgdmFsdWUgY29udGFpbmluZyBhIHllbGxvdyBjb2xvclxuICAgICAqIEByZXR1cm5zIGEgbmV3IFZlY3RvcjNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBZZWxsb3coKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGUoMSwgMSwgMCk7XG4gICAgfVxuICAgIENvbG9yMy5ZZWxsb3cgPSBZZWxsb3c7XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIENvbG9yMyB2YWx1ZSBjb250YWluaW5nIGEgZ3JheSBjb2xvclxuICAgICAqIEByZXR1cm5zIGEgbmV3IFZlY3RvcjNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBHcmF5KCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlKDAuNSwgMC41LCAwLjUpO1xuICAgIH1cbiAgICBDb2xvcjMuR3JheSA9IEdyYXk7XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIENvbG9yMyB2YWx1ZSBjb250YWluaW5nIGEgdGVhbCBjb2xvclxuICAgICAqIEByZXR1cm5zIGEgbmV3IFZlY3RvcjNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBUZWFsKCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlKDAsIDEuMCwgMS4wKTtcbiAgICB9XG4gICAgQ29sb3IzLlRlYWwgPSBUZWFsO1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBDb2xvcjMgdmFsdWUgY29udGFpbmluZyBhIHJhbmRvbSBjb2xvclxuICAgICAqIEByZXR1cm5zIGEgbmV3IFZlY3RvcjNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBSYW5kb20oKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGUoTWF0aC5yYW5kb20oKSwgTWF0aC5yYW5kb20oKSwgTWF0aC5yYW5kb20oKSk7XG4gICAgfVxuICAgIENvbG9yMy5SYW5kb20gPSBSYW5kb207XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHN0cmluZyB3aXRoIHRoZSBDb2xvcjMgY3VycmVudCB2YWx1ZXNcbiAgICAgKiBAcmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBDb2xvcjMgb2JqZWN0XG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9TdHJpbmcodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuICd7UjogJyArIHZhbHVlLnIgKyAnIEc6JyArIHZhbHVlLmcgKyAnIEI6JyArIHZhbHVlLmIgKyAnfSc7XG4gICAgfVxuICAgIENvbG9yMy50b1N0cmluZyA9IHRvU3RyaW5nO1xuICAgIC8qKlxuICAgICAqIENvbXB1dGUgdGhlIENvbG9yMyBoYXNoIGNvZGVcbiAgICAgKiBAcmV0dXJucyBhbiB1bmlxdWUgbnVtYmVyIHRoYXQgY2FuIGJlIHVzZWQgdG8gaGFzaCBDb2xvcjMgb2JqZWN0c1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldEhhc2hDb2RlKHZhbHVlKSB7XG4gICAgICAgIGxldCBoYXNoID0gdmFsdWUuciB8fCAwO1xuICAgICAgICBoYXNoID0gKGhhc2ggKiAzOTcpIF4gKHZhbHVlLmcgfHwgMCk7XG4gICAgICAgIGhhc2ggPSAoaGFzaCAqIDM5NykgXiAodmFsdWUuYiB8fCAwKTtcbiAgICAgICAgcmV0dXJuIGhhc2g7XG4gICAgfVxuICAgIENvbG9yMy5nZXRIYXNoQ29kZSA9IGdldEhhc2hDb2RlO1xuICAgIC8vIE9wZXJhdG9yc1xuICAgIC8qKlxuICAgICAqIFN0b3JlcyBpbiB0aGUgZ2l2ZW4gYXJyYXkgZnJvbSB0aGUgZ2l2ZW4gc3RhcnRpbmcgaW5kZXggdGhlIHJlZCwgZ3JlZW4sIGJsdWUgdmFsdWVzIGFzIHN1Y2Nlc3NpdmUgZWxlbWVudHNcbiAgICAgKiBAcGFyYW0gYXJyYXkgLSBkZWZpbmVzIHRoZSBhcnJheSB3aGVyZSB0byBzdG9yZSB0aGUgcixnLGIgY29tcG9uZW50c1xuICAgICAqIEBwYXJhbSBpbmRleCAtIGRlZmluZXMgYW4gb3B0aW9uYWwgaW5kZXggaW4gdGhlIHRhcmdldCBhcnJheSB0byBkZWZpbmUgd2hlcmUgdG8gc3RhcnQgc3RvcmluZyB2YWx1ZXNcbiAgICAgKlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvQXJyYXkodmFsdWUsIGFycmF5LCBpbmRleCA9IDApIHtcbiAgICAgICAgYXJyYXlbaW5kZXhdID0gdmFsdWUucjtcbiAgICAgICAgYXJyYXlbaW5kZXggKyAxXSA9IHZhbHVlLmc7XG4gICAgICAgIGFycmF5W2luZGV4ICsgMl0gPSB2YWx1ZS5iO1xuICAgIH1cbiAgICBDb2xvcjMudG9BcnJheSA9IHRvQXJyYXk7XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIG5ldyBDb2xvcjQgb2JqZWN0IGZyb20gdGhlIGN1cnJlbnQgQ29sb3IzIGFuZCB0aGUgZ2l2ZW4gYWxwaGFcbiAgICAgKiBAcGFyYW0gYWxwaGEgLSBkZWZpbmVzIHRoZSBhbHBoYSBjb21wb25lbnQgb24gdGhlIG5ldyBDb2xvcjQgb2JqZWN0IChkZWZhdWx0IGlzIDEpXG4gICAgICogQHJldHVybnMgYSBuZXcgQ29sb3I0IG9iamVjdFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvQ29sb3I0KHZhbHVlLCBhbHBoYSA9IDEpIHtcbiAgICAgICAgcmV0dXJuIENvbG9yNC5jcmVhdGUodmFsdWUuciwgdmFsdWUuZywgdmFsdWUuYiwgYWxwaGEpO1xuICAgIH1cbiAgICBDb2xvcjMudG9Db2xvcjQgPSB0b0NvbG9yNDtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgbmV3IGFycmF5IHBvcHVsYXRlZCB3aXRoIDMgbnVtZXJpYyBlbGVtZW50cyA6IHJlZCwgZ3JlZW4gYW5kIGJsdWUgdmFsdWVzXG4gICAgICogQHJldHVybnMgdGhlIG5ldyBhcnJheVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFzQXJyYXkodmFsdWUpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5KCk7XG4gICAgICAgIHRvQXJyYXkodmFsdWUsIHJlc3VsdCwgMCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIENvbG9yMy5hc0FycmF5ID0gYXNBcnJheTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBsdW1pbmFuY2UgdmFsdWVcbiAgICAgKiBAcmV0dXJucyBhIGZsb2F0IHZhbHVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9MdW1pbmFuY2UodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLnIgKiAwLjMgKyB2YWx1ZS5nICogMC41OSArIHZhbHVlLmIgKiAwLjExO1xuICAgIH1cbiAgICBDb2xvcjMudG9MdW1pbmFuY2UgPSB0b0x1bWluYW5jZTtcbiAgICAvKipcbiAgICAgKiBNdWx0aXBseSBlYWNoIENvbG9yMyByZ2IgdmFsdWVzIGJ5IHRoZSBnaXZlbiBDb2xvcjMgcmdiIHZhbHVlcyBpbiBDb2xvcjMgb2JqZWN0XG4gICAgICogQHBhcmFtIG90aGVyQ29sb3IgLSBkZWZpbmVzIHRoZSBzZWNvbmQgb3BlcmFuZFxuICAgICAqIEByZXR1cm5zIHRoZSBjcmVhdGUgb2JqZWN0XG4gICAgICovXG4gICAgZnVuY3Rpb24gbXVsdGlwbHkodmFsdWUsIG90aGVyQ29sb3IpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZSh2YWx1ZS5yICogb3RoZXJDb2xvci5yLCB2YWx1ZS5nICogb3RoZXJDb2xvci5nLCB2YWx1ZS5iICogb3RoZXJDb2xvci5iKTtcbiAgICB9XG4gICAgQ29sb3IzLm11bHRpcGx5ID0gbXVsdGlwbHk7XG4gICAgLyoqXG4gICAgICogTXVsdGlwbHkgdGhlIHJnYiB2YWx1ZXMgb2YgdGhlIENvbG9yMyBhbmQgdGhlIGdpdmVuIENvbG9yMyBhbmQgc3RvcmVzIHRoZSByZXN1bHQgaW4gdGhlIG9iamVjdCBcInJlc3VsdFwiXG4gICAgICogQHBhcmFtIG90aGVyQ29sb3IgLSBkZWZpbmVzIHRoZSBzZWNvbmQgb3BlcmFuZFxuICAgICAqIEBwYXJhbSByZXN1bHQgLSBkZWZpbmVzIHRoZSBDb2xvcjMgb2JqZWN0IHdoZXJlIHRvIHN0b3JlIHRoZSByZXN1bHRcbiAgICAgKiBAcmV0dXJucyB0aGUgY3VycmVudCBDb2xvcjNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtdWx0aXBseVRvUmVmKHZhbHVlLCBvdGhlckNvbG9yLCByZXN1bHQpIHtcbiAgICAgICAgcmVzdWx0LnIgPSB2YWx1ZS5yICogb3RoZXJDb2xvci5yO1xuICAgICAgICByZXN1bHQuZyA9IHZhbHVlLmcgKiBvdGhlckNvbG9yLmc7XG4gICAgICAgIHJlc3VsdC5iID0gdmFsdWUuYiAqIG90aGVyQ29sb3IuYjtcbiAgICB9XG4gICAgQ29sb3IzLm11bHRpcGx5VG9SZWYgPSBtdWx0aXBseVRvUmVmO1xuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgZXF1YWxpdHkgYmV0d2VlbiBDb2xvcjMgb2JqZWN0c1xuICAgICAqIEBwYXJhbSBvdGhlckNvbG9yIC0gZGVmaW5lcyB0aGUgc2Vjb25kIG9wZXJhbmRcbiAgICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSByZ2IgdmFsdWVzIGFyZSBlcXVhbCB0byB0aGUgZ2l2ZW4gb25lc1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGVxdWFscyh2YWx1ZSwgb3RoZXJDb2xvcikge1xuICAgICAgICByZXR1cm4gKG90aGVyQ29sb3IgJiZcbiAgICAgICAgICAgIHZhbHVlLnIgPT09IG90aGVyQ29sb3IuciAmJlxuICAgICAgICAgICAgdmFsdWUuZyA9PT0gb3RoZXJDb2xvci5nICYmXG4gICAgICAgICAgICB2YWx1ZS5iID09PSBvdGhlckNvbG9yLmIpO1xuICAgIH1cbiAgICBDb2xvcjMuZXF1YWxzID0gZXF1YWxzO1xuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgZXF1YWxpdHkgYmV0d2VlbiB0aGUgY3VycmVudCBDb2xvcjMgb2JqZWN0IGFuZCBhIHNldCBvZiByLGIsZyB2YWx1ZXNcbiAgICAgKiBAcGFyYW0gciAtIGRlZmluZXMgdGhlIHJlZCBjb21wb25lbnQgdG8gY2hlY2tcbiAgICAgKiBAcGFyYW0gZyAtIGRlZmluZXMgdGhlIGdyZWVuIGNvbXBvbmVudCB0byBjaGVja1xuICAgICAqIEBwYXJhbSBiIC0gZGVmaW5lcyB0aGUgYmx1ZSBjb21wb25lbnQgdG8gY2hlY2tcbiAgICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSByZ2IgdmFsdWVzIGFyZSBlcXVhbCB0byB0aGUgZ2l2ZW4gb25lc1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGVxdWFsc0Zsb2F0cyh2YWx1ZSwgciwgZywgYikge1xuICAgICAgICByZXR1cm4gdmFsdWUuciA9PT0gciAmJiB2YWx1ZS5nID09PSBnICYmIHZhbHVlLmIgPT09IGI7XG4gICAgfVxuICAgIENvbG9yMy5lcXVhbHNGbG9hdHMgPSBlcXVhbHNGbG9hdHM7XG4gICAgLyoqXG4gICAgICogTXVsdGlwbGllcyBpbiBwbGFjZSBlYWNoIHJnYiB2YWx1ZSBieSBzY2FsZVxuICAgICAqIEBwYXJhbSBzY2FsZSAtIGRlZmluZXMgdGhlIHNjYWxpbmcgZmFjdG9yXG4gICAgICogQHJldHVybnMgdGhlIHVwZGF0ZWQgQ29sb3IzXG4gICAgICovXG4gICAgZnVuY3Rpb24gc2NhbGUodmFsdWUsIHNjYWxlKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGUodmFsdWUuciAqIHNjYWxlLCB2YWx1ZS5nICogc2NhbGUsIHZhbHVlLmIgKiBzY2FsZSk7XG4gICAgfVxuICAgIENvbG9yMy5zY2FsZSA9IHNjYWxlO1xuICAgIC8qKlxuICAgICAqIE11bHRpcGxpZXMgdGhlIHJnYiB2YWx1ZXMgYnkgc2NhbGUgYW5kIHN0b3JlcyB0aGUgcmVzdWx0IGludG8gXCJyZXN1bHRcIlxuICAgICAqIEBwYXJhbSBzY2FsZSAtIGRlZmluZXMgdGhlIHNjYWxpbmcgZmFjdG9yXG4gICAgICogQHBhcmFtIHJlc3VsdCAtIGRlZmluZXMgdGhlIENvbG9yMyBvYmplY3Qgd2hlcmUgdG8gc3RvcmUgdGhlIHJlc3VsdFxuICAgICAqIEByZXR1cm5zIHRoZSB1bm1vZGlmaWVkIGN1cnJlbnQgQ29sb3IzXG4gICAgICovXG4gICAgZnVuY3Rpb24gc2NhbGVUb1JlZih2YWx1ZSwgc2NhbGUsIHJlc3VsdCkge1xuICAgICAgICByZXN1bHQuciA9IHZhbHVlLnIgKiBzY2FsZTtcbiAgICAgICAgcmVzdWx0LmcgPSB2YWx1ZS5nICogc2NhbGU7XG4gICAgICAgIHJlc3VsdC5iID0gdmFsdWUuYiAqIHNjYWxlO1xuICAgIH1cbiAgICBDb2xvcjMuc2NhbGVUb1JlZiA9IHNjYWxlVG9SZWY7XG4gICAgLyoqXG4gICAgICogU2NhbGUgdGhlIGN1cnJlbnQgQ29sb3IzIHZhbHVlcyBieSBhIGZhY3RvciBhbmQgYWRkIHRoZSByZXN1bHQgdG8gYSBnaXZlbiBDb2xvcjNcbiAgICAgKiBAcGFyYW0gc2NhbGUgLSBkZWZpbmVzIHRoZSBzY2FsZSBmYWN0b3JcbiAgICAgKiBAcGFyYW0gcmVzdWx0IC0gZGVmaW5lcyBjb2xvciB0byBzdG9yZSB0aGUgcmVzdWx0IGludG9cbiAgICAgKiBAcmV0dXJucyB0aGUgdW5tb2RpZmllZCBjdXJyZW50IENvbG9yM1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNjYWxlQW5kQWRkVG9SZWYodmFsdWUsIHNjYWxlLCByZXN1bHQpIHtcbiAgICAgICAgcmVzdWx0LnIgKz0gdmFsdWUuciAqIHNjYWxlO1xuICAgICAgICByZXN1bHQuZyArPSB2YWx1ZS5nICogc2NhbGU7XG4gICAgICAgIHJlc3VsdC5iICs9IHZhbHVlLmIgKiBzY2FsZTtcbiAgICB9XG4gICAgQ29sb3IzLnNjYWxlQW5kQWRkVG9SZWYgPSBzY2FsZUFuZEFkZFRvUmVmO1xuICAgIC8qKlxuICAgICAqIENsYW1wcyB0aGUgcmdiIHZhbHVlcyBieSB0aGUgbWluIGFuZCBtYXggdmFsdWVzIGFuZCBzdG9yZXMgdGhlIHJlc3VsdCBpbnRvIFwicmVzdWx0XCJcbiAgICAgKiBAcGFyYW0gbWluIC0gZGVmaW5lcyBtaW5pbXVtIGNsYW1waW5nIHZhbHVlIChkZWZhdWx0IGlzIDApXG4gICAgICogQHBhcmFtIG1heCAtIGRlZmluZXMgbWF4aW11bSBjbGFtcGluZyB2YWx1ZSAoZGVmYXVsdCBpcyAxKVxuICAgICAqIEBwYXJhbSByZXN1bHQgLSBkZWZpbmVzIGNvbG9yIHRvIHN0b3JlIHRoZSByZXN1bHQgaW50b1xuICAgICAqIEByZXR1cm5zIHRoZSBvcmlnaW5hbCBDb2xvcjNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjbGFtcFRvUmVmKHZhbHVlLCBtaW4gPSAwLCBtYXggPSAxLCByZXN1bHQpIHtcbiAgICAgICAgcmVzdWx0LnIgPSBTY2FsYXIuY2xhbXAodmFsdWUuciwgbWluLCBtYXgpO1xuICAgICAgICByZXN1bHQuZyA9IFNjYWxhci5jbGFtcCh2YWx1ZS5nLCBtaW4sIG1heCk7XG4gICAgICAgIHJlc3VsdC5iID0gU2NhbGFyLmNsYW1wKHZhbHVlLmIsIG1pbiwgbWF4KTtcbiAgICB9XG4gICAgQ29sb3IzLmNsYW1wVG9SZWYgPSBjbGFtcFRvUmVmO1xuICAgIC8qKlxuICAgICAqIENsYW1wcyB0aGUgcmdiIHZhbHVlcyBieSB0aGUgbWluIGFuZCBtYXggdmFsdWVzIGFuZCByZXR1cm5zIHRoZSByZXN1bHRcbiAgICAgKiBAcGFyYW0gbWluIC0gZGVmaW5lcyBtaW5pbXVtIGNsYW1waW5nIHZhbHVlIChkZWZhdWx0IGlzIDApXG4gICAgICogQHBhcmFtIG1heCAtIGRlZmluZXMgbWF4aW11bSBjbGFtcGluZyB2YWx1ZSAoZGVmYXVsdCBpcyAxKVxuICAgICAqIEByZXR1cm5zIHJlc3VsdFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsYW1wKHZhbHVlLCBtaW4gPSAwLCBtYXggPSAxKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IENvbG9yMy5CbGFjaygpO1xuICAgICAgICBjbGFtcFRvUmVmKHZhbHVlLCBtaW4sIG1heCwgcmVzdWx0KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgQ29sb3IzLmNsYW1wID0gY2xhbXA7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBDb2xvcjMgc2V0IHdpdGggdGhlIGFkZGVkIHZhbHVlcyBvZiB0aGUgY3VycmVudCBDb2xvcjMgYW5kIG9mIHRoZSBnaXZlbiBvbmVcbiAgICAgKiBAcGFyYW0gb3RoZXJDb2xvciAtIGRlZmluZXMgdGhlIHNlY29uZCBvcGVyYW5kXG4gICAgICogQHJldHVybnMgdGhlIGNyZWF0ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFkZCh2YWx1ZSwgb3RoZXJDb2xvcikge1xuICAgICAgICByZXR1cm4gY3JlYXRlKHZhbHVlLnIgKyBvdGhlckNvbG9yLnIsIHZhbHVlLmcgKyBvdGhlckNvbG9yLmcsIHZhbHVlLmIgKyBvdGhlckNvbG9yLmIpO1xuICAgIH1cbiAgICBDb2xvcjMuYWRkID0gYWRkO1xuICAgIC8qKlxuICAgICAqIFN0b3JlcyB0aGUgcmVzdWx0IG9mIHRoZSBhZGRpdGlvbiBvZiB0aGUgY3VycmVudCBDb2xvcjMgYW5kIGdpdmVuIG9uZSByZ2IgdmFsdWVzIGludG8gXCJyZXN1bHRcIlxuICAgICAqIEBwYXJhbSBvdGhlckNvbG9yIC0gZGVmaW5lcyB0aGUgc2Vjb25kIG9wZXJhbmRcbiAgICAgKiBAcGFyYW0gcmVzdWx0IC0gZGVmaW5lcyBDb2xvcjMgb2JqZWN0IHRvIHN0b3JlIHRoZSByZXN1bHQgaW50b1xuICAgICAqIEByZXR1cm5zIHRoZSB1bm1vZGlmaWVkIGN1cnJlbnQgQ29sb3IzXG4gICAgICovXG4gICAgZnVuY3Rpb24gYWRkVG9SZWYodmFsdWUsIG90aGVyQ29sb3IsIHJlc3VsdCkge1xuICAgICAgICByZXN1bHQuciA9IHZhbHVlLnIgKyBvdGhlckNvbG9yLnI7XG4gICAgICAgIHJlc3VsdC5nID0gdmFsdWUuZyArIG90aGVyQ29sb3IuZztcbiAgICAgICAgcmVzdWx0LmIgPSB2YWx1ZS5iICsgb3RoZXJDb2xvci5iO1xuICAgIH1cbiAgICBDb2xvcjMuYWRkVG9SZWYgPSBhZGRUb1JlZjtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIENvbG9yMyBzZXQgd2l0aCB0aGUgc3VidHJhY3RlZCB2YWx1ZXMgb2YgdGhlIGdpdmVuIG9uZSBmcm9tIHRoZSBjdXJyZW50IENvbG9yM1xuICAgICAqIEBwYXJhbSBvdGhlckNvbG9yIC0gZGVmaW5lcyB0aGUgc2Vjb25kIG9wZXJhbmRcbiAgICAgKiBAcmV0dXJucyB0aGUgY3JlYXRlXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3VidHJhY3QodmFsdWUsIG90aGVyQ29sb3IpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZSh2YWx1ZS5yIC0gb3RoZXJDb2xvci5yLCB2YWx1ZS5nIC0gb3RoZXJDb2xvci5nLCB2YWx1ZS5iIC0gb3RoZXJDb2xvci5iKTtcbiAgICB9XG4gICAgQ29sb3IzLnN1YnRyYWN0ID0gc3VidHJhY3Q7XG4gICAgLyoqXG4gICAgICogU3RvcmVzIHRoZSByZXN1bHQgb2YgdGhlIHN1YnRyYWN0aW9uIG9mIGdpdmVuIG9uZSBmcm9tIHRoZSBjdXJyZW50IENvbG9yMyByZ2IgdmFsdWVzIGludG8gXCJyZXN1bHRcIlxuICAgICAqIEBwYXJhbSBvdGhlckNvbG9yIC0gZGVmaW5lcyB0aGUgc2Vjb25kIG9wZXJhbmRcbiAgICAgKiBAcGFyYW0gcmVzdWx0IC0gZGVmaW5lcyBDb2xvcjMgb2JqZWN0IHRvIHN0b3JlIHRoZSByZXN1bHQgaW50b1xuICAgICAqIEByZXR1cm5zIHRoZSB1bm1vZGlmaWVkIGN1cnJlbnQgQ29sb3IzXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3VidHJhY3RUb1JlZih2YWx1ZSwgb3RoZXJDb2xvciwgcmVzdWx0KSB7XG4gICAgICAgIHJlc3VsdC5yID0gdmFsdWUuciAtIG90aGVyQ29sb3IucjtcbiAgICAgICAgcmVzdWx0LmcgPSB2YWx1ZS5nIC0gb3RoZXJDb2xvci5nO1xuICAgICAgICByZXN1bHQuYiA9IHZhbHVlLmIgLSBvdGhlckNvbG9yLmI7XG4gICAgfVxuICAgIENvbG9yMy5zdWJ0cmFjdFRvUmVmID0gc3VidHJhY3RUb1JlZjtcbiAgICAvKipcbiAgICAgKiBDb3B5IHRoZSBjdXJyZW50IG9iamVjdFxuICAgICAqIEByZXR1cm5zIENvbG9yMyBjb3BpZWQgdGhlIGN1cnJlbnQgb25lXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xvbmUodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZSh2YWx1ZS5yLCB2YWx1ZS5nLCB2YWx1ZS5iKTtcbiAgICB9XG4gICAgQ29sb3IzLmNsb25lID0gY2xvbmU7XG4gICAgLyoqXG4gICAgICogQ29waWVzIHRoZSByZ2IgdmFsdWVzIGZyb20gdGhlIHNvdXJjZSBpbiB0aGUgY3VycmVudCBDb2xvcjNcbiAgICAgKiBAcGFyYW0gc291cmNlIC0gZGVmaW5lcyB0aGUgc291cmNlIENvbG9yMyBvYmplY3RcbiAgICAgKiBAcmV0dXJucyB0aGUgdXBkYXRlZCBDb2xvcjMgb2JqZWN0XG4gICAgICovXG4gICAgZnVuY3Rpb24gY29weUZyb20oc291cmNlLCBkZXN0KSB7XG4gICAgICAgIGRlc3QuciA9IHNvdXJjZS5yO1xuICAgICAgICBkZXN0LmcgPSBzb3VyY2UuZztcbiAgICAgICAgZGVzdC5iID0gc291cmNlLmI7XG4gICAgfVxuICAgIENvbG9yMy5jb3B5RnJvbSA9IGNvcHlGcm9tO1xuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgdGhlIENvbG9yMyByZ2IgdmFsdWVzIGZyb20gdGhlIGdpdmVuIGZsb2F0c1xuICAgICAqIEBwYXJhbSBkZXN0IC1cbiAgICAgKiBAcGFyYW0gciAtIGRlZmluZXMgdGhlIHJlZCBjb21wb25lbnQgdG8gcmVhZCBmcm9tXG4gICAgICogQHBhcmFtIGcgLSBkZWZpbmVzIHRoZSBncmVlbiBjb21wb25lbnQgdG8gcmVhZCBmcm9tXG4gICAgICogQHBhcmFtIGIgLSBkZWZpbmVzIHRoZSBibHVlIGNvbXBvbmVudCB0byByZWFkIGZyb21cbiAgICAgKiBAcmV0dXJuc1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNldChkZXN0LCByLCBnLCBiKSB7XG4gICAgICAgIGRlc3QuciA9IHI7XG4gICAgICAgIGRlc3QuZyA9IGc7XG4gICAgICAgIGRlc3QuYiA9IGI7XG4gICAgfVxuICAgIENvbG9yMy5zZXQgPSBzZXQ7XG4gICAgLyoqXG4gICAgICogQ29tcHV0ZSB0aGUgQ29sb3IzIGhleGFkZWNpbWFsIGNvZGUgYXMgYSBzdHJpbmdcbiAgICAgKiBAcmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIHRoZSBoZXhhZGVjaW1hbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgQ29sb3IzIG9iamVjdFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvSGV4U3RyaW5nKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGludFIgPSAodmFsdWUuciAqIDI1NSkgfCAwO1xuICAgICAgICBjb25zdCBpbnRHID0gKHZhbHVlLmcgKiAyNTUpIHwgMDtcbiAgICAgICAgY29uc3QgaW50QiA9ICh2YWx1ZS5iICogMjU1KSB8IDA7XG4gICAgICAgIHJldHVybiAnIycgKyBTY2FsYXIudG9IZXgoaW50UikgKyBTY2FsYXIudG9IZXgoaW50RykgKyBTY2FsYXIudG9IZXgoaW50Qik7XG4gICAgfVxuICAgIENvbG9yMy50b0hleFN0cmluZyA9IHRvSGV4U3RyaW5nO1xuICAgIC8qKlxuICAgICAqIENvbXB1dGVzIENvbG9yMyBjb252ZXJ0ZWQgZnJvbSB0aGUgY3VycmVudCBvbmUgdG8gbGluZWFyIHNwYWNlXG4gICAgICogQHJldHVybnMgYSBuZXcgVmVjdG9yM1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvTGluZWFyU3BhY2UodmFsdWUpIHtcbiAgICAgICAgY29uc3QgY29udmVydGVkQ29sb3IgPSBjcmVhdGUoKTtcbiAgICAgICAgdG9MaW5lYXJTcGFjZVRvUmVmKHZhbHVlLCBjb252ZXJ0ZWRDb2xvcik7XG4gICAgICAgIHJldHVybiBjb252ZXJ0ZWRDb2xvcjtcbiAgICB9XG4gICAgQ29sb3IzLnRvTGluZWFyU3BhY2UgPSB0b0xpbmVhclNwYWNlO1xuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIHRoZSBDb2xvcjMgdmFsdWVzIHRvIGxpbmVhciBzcGFjZSBhbmQgc3RvcmVzIHRoZSByZXN1bHQgaW4gXCJjb252ZXJ0ZWRDb2xvclwiXG4gICAgICogQHBhcmFtIGNvbnZlcnRlZENvbG9yIC0gZGVmaW5lcyB0aGUgQ29sb3IzIG9iamVjdCB3aGVyZSB0byBzdG9yZSB0aGUgbGluZWFyIHNwYWNlIHZlcnNpb25cbiAgICAgKiBAcmV0dXJucyB0aGUgdW5tb2RpZmllZCBDb2xvcjNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b0xpbmVhclNwYWNlVG9SZWYodmFsdWUsIGNvbnZlcnRlZENvbG9yKSB7XG4gICAgICAgIGNvbnZlcnRlZENvbG9yLnIgPSBNYXRoLnBvdyh2YWx1ZS5yLCBUb0xpbmVhclNwYWNlKTtcbiAgICAgICAgY29udmVydGVkQ29sb3IuZyA9IE1hdGgucG93KHZhbHVlLmcsIFRvTGluZWFyU3BhY2UpO1xuICAgICAgICBjb252ZXJ0ZWRDb2xvci5iID0gTWF0aC5wb3codmFsdWUuYiwgVG9MaW5lYXJTcGFjZSk7XG4gICAgfVxuICAgIENvbG9yMy50b0xpbmVhclNwYWNlVG9SZWYgPSB0b0xpbmVhclNwYWNlVG9SZWY7XG4gICAgLyoqXG4gICAgICogQ29tcHV0ZXMgQ29sb3IzIGNvbnZlcnRlZCBmcm9tIHRoZSBjdXJyZW50IG9uZSB0byBnYW1tYSBzcGFjZVxuICAgICAqIEByZXR1cm5zIGEgbmV3IFZlY3RvcjNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b0dhbW1hU3BhY2UodmFsdWUpIHtcbiAgICAgICAgY29uc3QgY29udmVydGVkQ29sb3IgPSBjcmVhdGUoKTtcbiAgICAgICAgdG9HYW1tYVNwYWNlVG9SZWYodmFsdWUsIGNvbnZlcnRlZENvbG9yKTtcbiAgICAgICAgcmV0dXJuIGNvbnZlcnRlZENvbG9yO1xuICAgIH1cbiAgICBDb2xvcjMudG9HYW1tYVNwYWNlID0gdG9HYW1tYVNwYWNlO1xuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIHRoZSBDb2xvcjMgdmFsdWVzIHRvIGdhbW1hIHNwYWNlIGFuZCBzdG9yZXMgdGhlIHJlc3VsdCBpbiBcImNvbnZlcnRlZENvbG9yXCJcbiAgICAgKiBAcGFyYW0gY29udmVydGVkQ29sb3IgLSBkZWZpbmVzIHRoZSBDb2xvcjMgb2JqZWN0IHdoZXJlIHRvIHN0b3JlIHRoZSBnYW1tYSBzcGFjZSB2ZXJzaW9uXG4gICAgICogQHJldHVybnMgdGhlIHVubW9kaWZpZWQgQ29sb3IzXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9HYW1tYVNwYWNlVG9SZWYodmFsdWUsIGNvbnZlcnRlZENvbG9yKSB7XG4gICAgICAgIGNvbnZlcnRlZENvbG9yLnIgPSBNYXRoLnBvdyh2YWx1ZS5yLCBUb0dhbW1hU3BhY2UpO1xuICAgICAgICBjb252ZXJ0ZWRDb2xvci5nID0gTWF0aC5wb3codmFsdWUuZywgVG9HYW1tYVNwYWNlKTtcbiAgICAgICAgY29udmVydGVkQ29sb3IuYiA9IE1hdGgucG93KHZhbHVlLmIsIFRvR2FtbWFTcGFjZSk7XG4gICAgfVxuICAgIENvbG9yMy50b0dhbW1hU3BhY2VUb1JlZiA9IHRvR2FtbWFTcGFjZVRvUmVmO1xufSkoQ29sb3IzIHx8IChDb2xvcjMgPSB7fSkpO1xuIiwgImltcG9ydCB7IFZlY3RvcjMsIENvbG9yNCB9IGZyb20gJ0BkY2wvc2RrL21hdGgnXG5pbXBvcnQgeyBlbmdpbmUsIFNjaGVtYXMsIH0gZnJvbSAnQGRjbC9zZGsvZWNzJ1xuLyoqXG4gKiBUeXBlc1xuICovXG5cbmV4cG9ydCBlbnVtIFN5bmNFbnRpdHlJRHMge1xuICBUQVBfUkVEID0gMSxcbiAgVEFQX0dSRUVOID0gMixcbiAgVEFQX1lFTExPVyA9IDMsXG4gIENVVFRFUjEgPSA0LFxuICBDVVRURVIyID0gNSxcbiAgUE9UMSA9IDYsXG4gIFBPVDIgPSA3LFxuICBESVNQRU5TRVJfUk9MTFMgPSA4LFxuICBESVNQRU5TRVJfTk9PRExFUyA9IDksXG4gIEdMQVNTMSA9IDEwLFxuICBHTEFTUzIgPSAxMSxcbiAgR0xBU1MzID0gMTIsXG4gIEdMQVNTNCA9IDEzLFxuICBHTEFTUzUgPSAxNCxcbiAgR0xBU1M2ID0gMTUsXG4gIEdMQVNTNyA9IDE2LFxuICBHTEFTUzggPSAxNyxcbiAgR0xBU1M5ID0gMTgsXG4gIEJFRVJfRElTUEVOU0VSID0gMTksXG4gIEdBTUVfU0VTU0lPTiA9IDIwLFxuICBTQ09SRV9URVhUID0gMjEsXG4gIE1JU1NFU19URVhUID0gMjIsXG4gIFBPVF9CVVRUT04xID0gMjMsXG4gIFBPVF9CVVRUT04yID0gMjQsXG4gIERJU1BFTlNFUl9CVVRUT04xID0gMjUsXG4gIERJU1BFTlNFUl9CVVRUT04yID0gMjYsXG4gIFJFU0VUX0JVVFRPTiA9IDI3LFxuICBCVUJCTEUxX0EgPSAyOCxcbiAgQlVCQkxFMV9CID0gMjksXG4gIEJVQkJMRTFfQyA9IDMwLFxuICBCVUJCTEUyX0EgPSAzMSxcbiAgQlVCQkxFMl9CID0gMzIsXG4gIEJVQkJMRTJfQyA9IDMzLFxuICBCVUJCTEUzX0EgPSAzNCxcbiAgQlVCQkxFM19CID0gMzUsXG4gIEJVQkJMRTNfQyA9IDM2LFxuICBCVUJCTEU0X0EgPSAzNyxcbiAgQlVCQkxFNF9CID0gMzgsXG4gIEJVQkJMRTRfQyA9IDM5LFxuICBQQkFSMV9BID0gNDAsXG4gIFBCQVIxX0IgPSA0MSxcbiAgUEJBUjJfQSA9IDQyLFxuICBQQkFSMl9CID0gNDMsXG4gIFBCQVIzX0EgPSA0NCxcbiAgUEJBUjNfQiA9IDQ1LFxuICBQQkFSNF9BID0gNDYsXG4gIFBCQVI0X0IgPSA0NyxcbiAgUEJBUjVfQSA9IDQ4LFxuICBQQkFSNV9CID0gNDksXG4gIFBCQVI2X0EgPSA1MCxcbiAgUEJBUjZfQiA9IDUxLFxuICBDVVNUT01FUjEgPSA1MixcbiAgQ1VTVE9NRVIyID0gNTMsXG4gIENVU1RPTUVSMyA9IDU0LFxuICBDVVNUT01FUjQgPSA1NSxcbiAgLy8gVEFCTEVTID0gMTlcbn1cblxuXG5leHBvcnQgZW51bSBCZWVyVHlwZSB7XG4gIE5PTkUsXG4gIFJFRCxcbiAgWUVMTE9XLFxuICBHUkVFTlxufVxuXG5leHBvcnQgdHlwZSBUYXBEYXRhVHlwZSA9IHtcbiAgbW9kZWw6IHN0cmluZ1xuICBwb3NpdGlvbjogVmVjdG9yM1xuICBuYW1lOiBzdHJpbmdcbn1cblxuXG5leHBvcnQgZW51bSBTb3VwU3RhdGUge1xuICBFbXB0eSxcbiAgUmF3LFxuICBDb29rZWQsXG4gIEJ1cm5lZCxcbn1cblxuZXhwb3J0IGVudW0gSW5ncmVkaWVudFR5cGUge1xuICBOb29kbGVzLFxuICBTdXNoaVJvbGwsXG4gIENvb2tlZE5vb2RsZXMsXG4gIFNsaWNlZFN1c2hpLFxuICBUcmFzaCxcbiAgQmVlckdsYXNzLFxuICBZZWxsb3dCZWVyLFxuICBSZWRCZWVyLFxuICBHcmVlbkJlZXIsXG59XG5cbmV4cG9ydCBlbnVtIFNwZWVjaEJ1YmJsZVR5cGUge1xuICBOZXV0cmFsLFxuICBHb29kLFxuICBCYWRcbn1cblxuXG5cblxuZXhwb3J0IGNvbnN0IFRBUF9EQVRBOiBSZWNvcmQ8c3RyaW5nLCBUYXBEYXRhVHlwZT4gPSB7XG4gIFtCZWVyVHlwZS5SRURdOiB7XG4gICAgbmFtZTogJ1JlZCcsXG4gICAgbW9kZWw6ICdhc3NldHMvbW9kZWxzL3JlZFRhcC5nbGInLFxuICAgIHBvc2l0aW9uOiBWZWN0b3IzLmNyZWF0ZSgwLjM2OCwgMCwgMC4zMSlcbiAgfSxcbiAgW0JlZXJUeXBlLllFTExPV106IHtcbiAgICBuYW1lOiAnWWVsbG93JyxcbiAgICBtb2RlbDogJ2Fzc2V0cy9tb2RlbHMveWVsbG93VGFwLmdsYicsXG4gICAgcG9zaXRpb246IFZlY3RvcjMuY3JlYXRlKDAsIDAsIDAuMzEpXG4gIH0sXG4gIFtCZWVyVHlwZS5HUkVFTl06IHtcbiAgICBuYW1lOiAnR3JlZW4nLFxuICAgIG1vZGVsOiAnYXNzZXRzL21vZGVscy9ncmVlblRhcC5nbGInLFxuICAgIHBvc2l0aW9uOiBWZWN0b3IzLmNyZWF0ZSgtMC4zNjgsIDAsIDAuMzEpXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRhcERhdGEodGFwQmVlclR5cGU6IEJlZXJUeXBlKSB7XG4gIHJldHVybiAoVEFQX0RBVEEgYXMgYW55KVt0YXBCZWVyVHlwZV0gYXMgVGFwRGF0YVR5cGVcbn1cblxuLyoqXG4gKiBDb21wb25lbnQgRGVmaW5pdGlvbnNcbiAqL1xuXG4vLyBleHBvcnQgY29uc3QgRHluYW1pY1N5bmNJZCA9IGVuZ2luZS5kZWZpbmVDb21wb25lbnQoJ0R5bmFtaWNTeW5jSWQnLCB7XG4vLyAgIGlkOiBTY2hlbWFzLk51bWJlclxuLy8gfSlcblxuZXhwb3J0IGNvbnN0IEhpZ2hlc3RJRCA9IGVuZ2luZS5kZWZpbmVDb21wb25lbnQoJ0hpZ2hlc3RJRCcsIHtcbiAgaWQ6IFNjaGVtYXMuTnVtYmVyXG59KVxuXG5cbmV4cG9ydCBjb25zdCBCZWVyR2xhc3MgPSBlbmdpbmUuZGVmaW5lQ29tcG9uZW50KCdCZWVyR2xhc3MnLCB7XG4gIC8vYmVpbmdGaWxsZWQ6IFNjaGVtYXMuQm9vbGVhbixcbiAgZmlsbGVkOiBTY2hlbWFzLkJvb2xlYW4sXG4gIGJlZXJUeXBlOiBTY2hlbWFzLkVudW1OdW1iZXI8QmVlclR5cGU+KEJlZXJUeXBlLCBCZWVyVHlwZS5OT05FKSxcbiAgZHJpbmtpbmc6IFNjaGVtYXMuQm9vbGVhblxufSlcbmV4cG9ydCBjb25zdCBQaWNrZWRVcCA9IGVuZ2luZS5kZWZpbmVDb21wb25lbnQoJ1BpY2tlZFVwJywge1xuICAvL2NoaWxkOiBTY2hlbWFzLkVudGl0eSxcbiAgYXZhdGFySWQ6IFNjaGVtYXMuU3RyaW5nXG59KVxuXG5leHBvcnQgY29uc3QgVGFwQ29tcG9uZW50ID0gZW5naW5lLmRlZmluZUNvbXBvbmVudCgnVGFwQ29tcG9uZW50Jywge1xuICBwb3VyaW5nVGltZTogU2NoZW1hcy5OdW1iZXIsXG4gIHBvdXJpbmc6IFNjaGVtYXMuQm9vbGVhbixcbiAgYmVlclR5cGU6IFNjaGVtYXMuRW51bU51bWJlcjxCZWVyVHlwZT4oQmVlclR5cGUsIEJlZXJUeXBlLk5PTkUpXG59KVxuXG5leHBvcnQgY29uc3QgVGFwQmFzZSA9IGVuZ2luZS5kZWZpbmVDb21wb25lbnQoJ1RhcEJhc2UnLCB7XG4gIGJlZXJUeXBlOiBTY2hlbWFzLkVudW1OdW1iZXI8QmVlclR5cGU+KEJlZXJUeXBlLCBCZWVyVHlwZS5OT05FKVxufSlcblxuXG4vLyBleHBvcnQgY29uc3QgR3JpZFBvc2l0aW9uID0gZW5naW5lLmRlZmluZUNvbXBvbmVudCgnR3JpZFBvc2l0aW9uJywge1xuLy8gICBvYmplY3Q6IFNjaGVtYXMuRW50aXR5LFxuLy8gICB0eXBlOiBTY2hlbWFzLkVudW1OdW1iZXI8VGlsZVR5cGU+KFRpbGVUeXBlLCBUaWxlVHlwZS5GbG9vcilcblxuLy8gfSlcblxuZXhwb3J0IGNvbnN0IFBvdERhdGEgPSBlbmdpbmUuZGVmaW5lQ29tcG9uZW50KCdQb3QnLCB7XG4gIHN0YXRlOiBTY2hlbWFzLkVudW1OdW1iZXI8U291cFN0YXRlPihTb3VwU3RhdGUsIFNvdXBTdGF0ZS5SYXcpLFxuICBoYXNJbmdyZWRpZW50OiBTY2hlbWFzLkJvb2xlYW4sXG4gIHByb2dyZXNzQmFyOiBTY2hlbWFzLkVudGl0eSxcbiAgYXR0YWNoZWRFbnRpdHk6IFNjaGVtYXMuRW50aXR5IHx8IHVuZGVmaW5lZFxufSwge1xuICBzdGF0ZTogU291cFN0YXRlLkVtcHR5LFxuICBoYXNJbmdyZWRpZW50OiBmYWxzZSxcbiAgYXR0YWNoZWRFbnRpdHk6IHVuZGVmaW5lZCxcbn0pXG5cblxuZXhwb3J0IGNvbnN0IEdyYWJhYmxlT2JqZWN0Q29tcG9uZW50ID0gZW5naW5lLmRlZmluZUNvbXBvbmVudCgnR3JhYmFibGVPYmplY3RDb21wb25lbnQnLCB7XG4gIHR5cGU6IFNjaGVtYXMuRW51bU51bWJlcjxJbmdyZWRpZW50VHlwZT4oSW5ncmVkaWVudFR5cGUsIEluZ3JlZGllbnRUeXBlLk5vb2RsZXMpLFxuICBiZWluZ1Byb2Nlc3NlZDogU2NoZW1hcy5Cb29sZWFuLFxuICBwcm9jZXNzZWQ6IFNjaGVtYXMuQm9vbGVhbixcbn0sIHtcbiAgdHlwZTogSW5ncmVkaWVudFR5cGUuTm9vZGxlcyxcbn0pXG5cbmV4cG9ydCBjb25zdCBDb29raW5nID0gZW5naW5lLmRlZmluZUNvbXBvbmVudCgnQ29va2luZycsIHtcbiAgYWN0aXZlOiBTY2hlbWFzLkJvb2xlYW4sXG4gIHRpbWU6IFNjaGVtYXMuTnVtYmVyLFxuICBwcm9ncmVzc0JhcjogU2NoZW1hcy5FbnRpdHksXG59LCB7XG4gIGFjdGl2ZTogdHJ1ZSxcbiAgdGltZTogMCxcbn0pXG5cblxuZXhwb3J0IGNvbnN0IEN1dHRpbmdCb2FyZCA9IGVuZ2luZS5kZWZpbmVDb21wb25lbnQoJ0N1dHRpbmdCb2FyZCcsIHtcbiAgaGFzUm9sbDogU2NoZW1hcy5Cb29sZWFuLFxuICBjdXR0aW5nOiBTY2hlbWFzLkJvb2xlYW4sXG4gIHJvbGxDaGlsZDogU2NoZW1hcy5FbnRpdHkgfHwgdW5kZWZpbmVkLFxuICBjdXRzOiBTY2hlbWFzLk51bWJlcixcbiAgY3V0VGltZTogU2NoZW1hcy5OdW1iZXIsXG4gIHRvdGFsQ3V0VGltZTogU2NoZW1hcy5OdW1iZXIsXG4gIG1vZGVsRW50aXR5OiBTY2hlbWFzLkVudGl0eVxufSwge1xuICBoYXNSb2xsOiBmYWxzZSxcbiAgY3V0czogMCxcbiAgcm9sbENoaWxkOiB1bmRlZmluZWQsXG4gIGN1dHRpbmc6IGZhbHNlLFxuICBjdXRUaW1lOiAwLjcsXG4gIHRvdGFsQ3V0VGltZTogMC43XG59KVxuXG5cblxuZXhwb3J0IGNvbnN0IFByb2dyZXNzQmFyID0gZW5naW5lLmRlZmluZUNvbXBvbmVudCgnUHJvZ3Jlc3NCYXInLCB7XG4gIHZpc2libGU6IFNjaGVtYXMuQm9vbGVhbixcbiAgYWN0aXZlOiBTY2hlbWFzLkJvb2xlYW4sXG4gIHJhdGlvOiBTY2hlbWFzLk51bWJlcixcbiAgeWVsbG93V2FybmluZzogU2NoZW1hcy5OdW1iZXIsXG4gIHJlZFdhcm5pbmc6IFNjaGVtYXMuTnVtYmVyLFxuICBmdWxsTGVuZ3RoOiBTY2hlbWFzLk51bWJlcixcbiAgbW92ZXNVcDogU2NoZW1hcy5Cb29sZWFuLFxuICBjb2xvcjogU2NoZW1hcy5Db2xvcjQsXG4gIHNwZWVkOiBTY2hlbWFzLk51bWJlcixcbiAgcGFyZW50OiBTY2hlbWFzLkVudGl0eVxufSwge1xuICB2aXNpYmxlOiB0cnVlLFxuICBhY3RpdmU6IHRydWUsXG4gIHJhdGlvOiAwLFxuICB5ZWxsb3dXYXJuaW5nOiAwLjUsXG4gIHJlZFdhcm5pbmc6IDAuNzUsXG4gIGZ1bGxMZW5ndGg6IDEsXG4gIG1vdmVzVXA6IHRydWUsXG4gIGNvbG9yOiBDb2xvcjQuR3JlZW4oKSxcbiAgc3BlZWQ6IDEsXG4gIC8vcGFyZW50OiBTY2hlbWFzLkVudGl0eVxufSlcblxuXG5cbmV4cG9ydCBjb25zdCBDdXN0b21lckRhdGEgPSBlbmdpbmUuZGVmaW5lQ29tcG9uZW50KCdDdXN0b21lckRhdGEnLCB7XG4gIGFjdGl2ZTogU2NoZW1hcy5Cb29sZWFuLFxuICBkaXNoOiBTY2hlbWFzLkVudW1OdW1iZXI8SW5ncmVkaWVudFR5cGU+KEluZ3JlZGllbnRUeXBlLCBJbmdyZWRpZW50VHlwZS5Ob29kbGVzKSxcbiAgbWVzc2FnZTogU2NoZW1hcy5TdHJpbmcsXG4gIHNwZWVjaEJ1YmJsZTogU2NoZW1hcy5FbnRpdHksXG4gIHJlY2VpdmVkRGlzaDogU2NoZW1hcy5Cb29sZWFuLCAvLyBUT0RPOiB0cnVlIHRvIGZvcmNlIHRoZSAxc3QgaW5pdGlhbGl6YXRpb24/P1xuICAvL3BsYXRlOiBDdXN0b21lclBsYXRlXG4gIHNlYXROdW1iZXI6IFNjaGVtYXMuTnVtYmVyLFxuICB0aW1lQmVmb3JlTGVhdmluZzogU2NoZW1hcy5OdW1iZXIsXG4gIHRpbWVCZWZvcmVFbnRlcmluZzogU2NoZW1hcy5OdW1iZXIsXG4gIHdhaXRpbmdUaW1lcjogU2NoZW1hcy5OdW1iZXIsXG4gIHByb2dyZXNzQmFyOiBTY2hlbWFzLkVudGl0eVxufSwge1xuICBhY3RpdmU6IGZhbHNlLFxuICByZWNlaXZlZERpc2g6IGZhbHNlLFxuICB0aW1lQmVmb3JlTGVhdmluZzogMzAsXG4gIHRpbWVCZWZvcmVFbnRlcmluZzogMTAsXG4gIHdhaXRpbmdUaW1lcjogMzAsXG59KVxuXG5leHBvcnQgY29uc3QgR2FtZURhdGEgPSBlbmdpbmUuZGVmaW5lQ29tcG9uZW50KCdHYW1lRGF0YScsIHtcbiAgYWN0aXZlOiBTY2hlbWFzLkJvb2xlYW4sXG4gIHBsYXllclNjb3JlOiBTY2hlbWFzLk51bWJlcixcbiAgcGxheWVyTWlzc2VzOiBTY2hlbWFzLk51bWJlcixcbiAgY3VzdG9tZXJUaW1lcjogU2NoZW1hcy5OdW1iZXIsXG4gIGN1c3RvbWVySW50ZXJ2YWw6IFNjaGVtYXMuTnVtYmVyLFxufSwge1xuICBhY3RpdmU6IHRydWUsXG4gIHBsYXllclNjb3JlOiAwLFxuICBwbGF5ZXJNaXNzZXM6IDAsXG4gIGN1c3RvbWVyVGltZXI6IDIsXG4gIGN1c3RvbWVySW50ZXJ2YWw6IDEwLFxufSlcbiIsICJpbXBvcnQgeyBUcmFuc2Zvcm0sIGVuZ2luZSwgZXhlY3V0ZVRhc2ssIEVudGl0eSwgQW5pbWF0b3IsIEF1ZGlvU291cmNlIH0gZnJvbSAnQGRjbC9zZGsvZWNzJ1xuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJ0BkY2wvc2RrL21hdGgnXG5pbXBvcnQgeyBnZXRVc2VyRGF0YSB9IGZyb20gJ35zeXN0ZW0vVXNlcklkZW50aXR5J1xuaW1wb3J0IHsgSGlnaGVzdElEIH0gZnJvbSAnLi4vZGVmaW5pdGlvbnMnXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQbGF5ZXJQb3NpdGlvbigpIHtcbiAgcmV0dXJuIFRyYW5zZm9ybS5nZXRPck51bGwoZW5naW5lLlBsYXllckVudGl0eSk/LnBvc2l0aW9uIHx8IFZlY3RvcjMuY3JlYXRlKClcbn1cblxuZXhwb3J0IGxldCBjdXJyZW50UGxheWVySWQ6IHN0cmluZ1xuXG52b2lkIGV4ZWN1dGVUYXNrKGFzeW5jICgpID0+IHtcbiAgY29uc3QgdXNlciA9IGF3YWl0IGdldFVzZXJEYXRhKHt9KVxuICBpZiAoIXVzZXIuZGF0YSkgcmV0dXJuXG4gIGN1cnJlbnRQbGF5ZXJJZCA9IHVzZXIuZGF0YT8udXNlcklkXG59KVxuXG5leHBvcnQgZnVuY3Rpb24qIGdldEVudGl0aWVzV2l0aFBhcmVudChwYXJlbnQ6IEVudGl0eSkge1xuICBmb3IgKGNvbnN0IFtlbnRpdHksIHRyYW5zZm9ybV0gb2YgZW5naW5lLmdldEVudGl0aWVzV2l0aChUcmFuc2Zvcm0pKSB7XG4gICAgaWYgKHRyYW5zZm9ybS5wYXJlbnQgPT09IHBhcmVudCkge1xuICAgICAgeWllbGQgW2VudGl0eSwgdHJhbnNmb3JtXVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RW50aXR5UGFyZW50KGVudGl0eTogRW50aXR5KSB7XG4gIHJldHVybiBUcmFuc2Zvcm0uZ2V0T3JOdWxsKGVudGl0eSk/LnBhcmVudCB8fCBlbmdpbmUuUm9vdEVudGl0eVxufVxuXG5cblxuXG5leHBvcnQgZnVuY3Rpb24gcGxheVNvdW5kKGF1ZGlvOiBzdHJpbmcsIGxvb3A6IGJvb2xlYW4gPSBmYWxzZSwgcG9zaXRpb24/OiBWZWN0b3IzKSB7XG4gIGNvbnN0IGVudGl0eSA9IGVuZ2luZS5hZGRFbnRpdHkoKVxuICBBdWRpb1NvdXJjZS5jcmVhdGUoZW50aXR5LCB7XG4gICAgYXVkaW9DbGlwVXJsOiBhdWRpbyxcbiAgICBsb29wLFxuICAgIHBsYXlpbmc6IHRydWVcbiAgfSlcblxuICBUcmFuc2Zvcm0uY3JlYXRlKGVudGl0eSwge1xuICAgIHBvc2l0aW9uXG4gIH0pXG5cbiAgcmV0dXJuIGVudGl0eVxufVxuXG4iLCAiaW1wb3J0IHsgc2VuZEJpbmFyeSB9IGZyb20gJ35zeXN0ZW0vQ29tbXVuaWNhdGlvbnNDb250cm9sbGVyJ1xuaW1wb3J0IHsgZW5naW5lIH0gZnJvbSAnQGRjbC9lY3MnXG5pbXBvcnQgeyBhZGRTeW5jVHJhbnNwb3J0IH0gZnJvbSAnLi9tZXNzYWdlLWJ1cy1zeW5jJ1xuaW1wb3J0IHsgZ2V0VXNlckRhdGEgfSBmcm9tICd+c3lzdGVtL1VzZXJJZGVudGl0eSdcblxuLy8gaW5pdGlhbGl6ZSBzeW5jIHRyYW5zcG9ydCBmb3Igc2RrIGVuZ2luZVxuY29uc3QgeyBnZXRDaGlsZHJlbiwgc3luY0VudGl0eSwgcGFyZW50RW50aXR5LCBnZXRQYXJlbnQsIG15UHJvZmlsZSwgcmVtb3ZlUGFyZW50LCBnZXRGaXJzdENoaWxkIH0gPSBhZGRTeW5jVHJhbnNwb3J0KFxuICBlbmdpbmUsXG4gIHNlbmRCaW5hcnksXG4gIGdldFVzZXJEYXRhXG4pXG5cbmV4cG9ydCB7IGdldEZpcnN0Q2hpbGQsIGdldENoaWxkcmVuLCBzeW5jRW50aXR5LCBwYXJlbnRFbnRpdHksIGdldFBhcmVudCwgbXlQcm9maWxlLCByZW1vdmVQYXJlbnQgfVxuIiwgImltcG9ydCB7XG4gIFRyYW5zcG9ydE1lc3NhZ2UsXG4gIFBvaW50ZXJFdmVudHNSZXN1bHQsXG4gIEdsdGZDb250YWluZXJMb2FkaW5nU3RhdGUsXG4gIEVudGl0eVV0aWxzLFxuICBSRVNFUlZFRF9TVEFUSUNfRU5USVRJRVMsXG4gIENyZHRNZXNzYWdlVHlwZSxcbiAgU3luY0NvbXBvbmVudHMgYXMgX1N5bmNDb21wb25lbnRzLFxuICBOZXR3b3JrRW50aXR5IGFzIF9OZXR3b3JrRW50aXR5LFxuICBOZXR3b3JrUGFyZW50IGFzIF9OZXR3b3JrUGFyZW50LFxuICBJRW5naW5lXG59IGZyb20gJ0BkY2wvZWNzJ1xuXG5leHBvcnQgZnVuY3Rpb24gc3luY0ZpbHRlcihlbmdpbmU6IElFbmdpbmUpIHtcbiAgY29uc3QgTmV0d29ya0VudGl0eSA9IGVuZ2luZS5nZXRDb21wb25lbnQoX05ldHdvcmtFbnRpdHkuY29tcG9uZW50SWQpIGFzIHR5cGVvZiBfTmV0d29ya0VudGl0eVxuICBjb25zdCBTeW5jQ29tcG9uZW50cyA9IGVuZ2luZS5nZXRDb21wb25lbnQoX1N5bmNDb21wb25lbnRzLmNvbXBvbmVudElkKSBhcyB0eXBlb2YgX1N5bmNDb21wb25lbnRzXG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChtZXNzYWdlOiBPbWl0PFRyYW5zcG9ydE1lc3NhZ2UsICdtZXNzYWdlQnVmZmVyJz4pIHtcbiAgICBjb25zdCBjb21wb25lbnRJZCA9IChtZXNzYWdlIGFzIGFueSkuY29tcG9uZW50SWRcblxuICAgIGlmIChbUG9pbnRlckV2ZW50c1Jlc3VsdC5jb21wb25lbnRJZCwgR2x0ZkNvbnRhaW5lckxvYWRpbmdTdGF0ZS5jb21wb25lbnRJZF0uaW5jbHVkZXMoY29tcG9uZW50SWQpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBjb25zdCBbZW50aXR5SWRdID0gRW50aXR5VXRpbHMuZnJvbUVudGl0eUlkKG1lc3NhZ2UuZW50aXR5SWQpXG5cbiAgICAvLyBmaWx0ZXIgbWVzc2FnZXMgZnJvbSByZXNlcnZlZCBlbnRpdGllcy5cbiAgICBpZiAoZW50aXR5SWQgPCBSRVNFUlZFRF9TVEFUSUNfRU5USVRJRVMpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGNvbnN0IG5ldHdvcmsgPSBOZXR3b3JrRW50aXR5LmdldE9yTnVsbChtZXNzYWdlLmVudGl0eUlkKVxuICAgIC8vIERlbGV0ZSBOZXR3b3JrIEVudGl0eSBBbHdheXNcbiAgICBpZiAoXG4gICAgICBtZXNzYWdlLnR5cGUgPT09IENyZHRNZXNzYWdlVHlwZS5ERUxFVEVfRU5USVRZX05FVFdPUksgfHxcbiAgICAgIChuZXR3b3JrICYmIG1lc3NhZ2UudHlwZSA9PT0gQ3JkdE1lc3NhZ2VUeXBlLkRFTEVURV9FTlRJVFkpXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIGNvbnN0IHN5bmMgPSBTeW5jQ29tcG9uZW50cy5nZXRPck51bGwobWVzc2FnZS5lbnRpdHlJZClcbiAgICBpZiAoIXN5bmMpIHJldHVybiBmYWxzZVxuXG4gICAgLy8gRmlyc3QgY29tcG9uZW50XG4gICAgaWYgKChtZXNzYWdlIGFzIGFueSkudGltZXN0YW1wIDw9IDEpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgaWYgKGNvbXBvbmVudElkID09PSBOZXR3b3JrRW50aXR5LmNvbXBvbmVudElkKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICAvLyBJZiB0aGVyZSBpcyBhIGNoYW5nZSBpbiB0aGUgbmV0d29yayBwYXJlbnQgb3Igc3luY0NvbXBvbmVudHMgd2Ugc2hvdWxkIGFsd2F5cyBzeW5jXG4gICAgaWYgKGNvbXBvbmVudElkID09PSBfTmV0d29ya1BhcmVudC5jb21wb25lbnRJZCB8fCBjb21wb25lbnRJZCA9PT0gU3luY0NvbXBvbmVudHMuY29tcG9uZW50SWQpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgaWYgKGNvbXBvbmVudElkICYmIHN5bmMuY29tcG9uZW50SWRzLmluY2x1ZGVzKGNvbXBvbmVudElkKSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuIiwgImltcG9ydCB7IFJlYWRXcml0ZUJ5dGVCdWZmZXIgfSBmcm9tICdAZGNsL2Vjcy9kaXN0L3NlcmlhbGl6YXRpb24vQnl0ZUJ1ZmZlcidcbmltcG9ydCB7XG4gIENyZHRNZXNzYWdlSGVhZGVyLFxuICBDcmR0TWVzc2FnZVByb3RvY29sLFxuICBDcmR0TWVzc2FnZVR5cGUsXG4gIElFbmdpbmUsXG4gIFB1dENvbXBvbmVudE9wZXJhdGlvbixcbiAgUHV0TmV0d29ya0NvbXBvbmVudE9wZXJhdGlvbixcbiAgU3luY0NvbXBvbmVudHMgYXMgX1N5bmNDb21wb25lbnRzLFxuICBOZXR3b3JrRW50aXR5IGFzIF9OZXR3b3JrRW50aXR5LFxuICBJU3luY0NvbXBvbmVudHMsXG4gIElOZXRvd3JrRW50aXR5XG59IGZyb20gJ0BkY2wvZWNzJ1xuXG5leHBvcnQgZnVuY3Rpb24gZW5naW5lVG9DcmR0KGVuZ2luZTogSUVuZ2luZSk6IFVpbnQ4QXJyYXkge1xuICBjb25zdCBjcmR0QnVmZmVyID0gbmV3IFJlYWRXcml0ZUJ5dGVCdWZmZXIoKVxuICBjb25zdCBuZXR3b3JrQnVmZmVyID0gbmV3IFJlYWRXcml0ZUJ5dGVCdWZmZXIoKVxuICBjb25zdCBTeW5jQ29tcG9uZW50cyA9IGVuZ2luZS5nZXRDb21wb25lbnQoX1N5bmNDb21wb25lbnRzLmNvbXBvbmVudElkKSBhcyBJU3luY0NvbXBvbmVudHNcbiAgY29uc3QgTmV0d29ya0VudGl0eSA9IGVuZ2luZS5nZXRDb21wb25lbnQoX05ldHdvcmtFbnRpdHkuY29tcG9uZW50SWQpIGFzIElOZXRvd3JrRW50aXR5XG5cbiAgZm9yIChjb25zdCBpdENvbXBvbmVudERlZmluaXRpb24gb2YgZW5naW5lLmNvbXBvbmVudHNJdGVyKCkpIHtcbiAgICBpdENvbXBvbmVudERlZmluaXRpb24uZHVtcENyZHRTdGF0ZVRvQnVmZmVyKGNyZHRCdWZmZXIsIChlbnRpdHkpID0+IHtcbiAgICAgIGNvbnN0IGlzTmV0d29ya0VudGl0eSA9IE5ldHdvcmtFbnRpdHkuaGFzKGVudGl0eSlcbiAgICAgIGlmICghaXNOZXR3b3JrRW50aXR5KSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgICAgY29uc3QgaXNEeW5hbWljRW50aXR5ID0gTmV0d29ya0VudGl0eS5nZXQoZW50aXR5KS5uZXR3b3JrSWRcbiAgICAgIGlmIChpc0R5bmFtaWNFbnRpdHkpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICAgIC8vIEZvciB0aGUgc3RhdGljIGVudGl0aWVzIHdlIG9ubHkgc2VuZCB0aGUgdXBkYXRlcyBvZiB0aGUgU3luY0NvbXBvbmVudHNcbiAgICAgIHJldHVybiBTeW5jQ29tcG9uZW50cy5nZXQoZW50aXR5KS5jb21wb25lbnRJZHMuaW5jbHVkZXMoaXRDb21wb25lbnREZWZpbml0aW9uLmNvbXBvbmVudElkKVxuICAgIH0pXG4gIH1cblxuICBsZXQgaGVhZGVyOiBDcmR0TWVzc2FnZUhlYWRlciB8IG51bGxcbiAgd2hpbGUgKChoZWFkZXIgPSBDcmR0TWVzc2FnZVByb3RvY29sLmdldEhlYWRlcihjcmR0QnVmZmVyKSkpIHtcbiAgICBpZiAoaGVhZGVyLnR5cGUgPT09IENyZHRNZXNzYWdlVHlwZS5QVVRfQ09NUE9ORU5UKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gUHV0Q29tcG9uZW50T3BlcmF0aW9uLnJlYWQoY3JkdEJ1ZmZlcikhXG4gICAgICBjb25zdCBuZXR3b3JrRW50aXR5ID0gTmV0d29ya0VudGl0eS5nZXRPck51bGwobWVzc2FnZS5lbnRpdHlJZClcbiAgICAgIGlmIChuZXR3b3JrRW50aXR5KSB7XG4gICAgICAgIFB1dE5ldHdvcmtDb21wb25lbnRPcGVyYXRpb24ud3JpdGUoXG4gICAgICAgICAgbmV0d29ya0VudGl0eS5lbnRpdHlJZCxcbiAgICAgICAgICBtZXNzYWdlLnRpbWVzdGFtcCxcbiAgICAgICAgICBtZXNzYWdlLmNvbXBvbmVudElkLFxuICAgICAgICAgIG5ldHdvcmtFbnRpdHkubmV0d29ya0lkLFxuICAgICAgICAgIG1lc3NhZ2UuZGF0YSxcbiAgICAgICAgICBuZXR3b3JrQnVmZmVyXG4gICAgICAgIClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIFB1dENvbXBvbmVudE9wZXJhdGlvbi53cml0ZShcbiAgICAgICAgICBtZXNzYWdlLmVudGl0eUlkLFxuICAgICAgICAgIG1lc3NhZ2UudGltZXN0YW1wLFxuICAgICAgICAgIG1lc3NhZ2UuY29tcG9uZW50SWQsXG4gICAgICAgICAgbWVzc2FnZS5kYXRhLFxuICAgICAgICAgIG5ldHdvcmtCdWZmZXJcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjcmR0QnVmZmVyLmluY3JlbWVudFJlYWRPZmZzZXQoaGVhZGVyLmxlbmd0aClcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV0d29ya0J1ZmZlci50b0JpbmFyeSgpXG59XG4iLCAiaW1wb3J0IHsgUmVhZFdyaXRlQnl0ZUJ1ZmZlciB9IGZyb20gJ0BkY2wvZWNzL2Rpc3Qvc2VyaWFsaXphdGlvbi9CeXRlQnVmZmVyJ1xuXG5leHBvcnQgZW51bSBDb21tc01lc3NhZ2Uge1xuICBDUkRUID0gMSxcbiAgUkVRX0NSRFRfU1RBVEUgPSAyLFxuICBSRVNfQ1JEVF9TVEFURSA9IDNcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEJpbmFyeU1lc3NhZ2VCdXM8VCBleHRlbmRzIENvbW1zTWVzc2FnZT4oc2VuZDogKG1lc3NhZ2U6IFVpbnQ4QXJyYXkpID0+IHZvaWQpIHtcbiAgY29uc3QgbWFwcGluZzogTWFwPFQsICh2YWx1ZTogVWludDhBcnJheSwgc2VuZGVyOiBzdHJpbmcpID0+IHZvaWQ+ID0gbmV3IE1hcCgpXG4gIHJldHVybiB7XG4gICAgb246IDxLIGV4dGVuZHMgVD4obWVzc2FnZTogSywgY2FsbGJhY2s6ICh2YWx1ZTogVWludDhBcnJheSwgc2VuZGVyOiBzdHJpbmcpID0+IHZvaWQpID0+IHtcbiAgICAgIG1hcHBpbmcuc2V0KG1lc3NhZ2UsIGNhbGxiYWNrKVxuICAgIH0sXG4gICAgZW1pdDogPEsgZXh0ZW5kcyBUPihtZXNzYWdlOiBLLCB2YWx1ZTogVWludDhBcnJheSkgPT4ge1xuICAgICAgc2VuZChjcmFmdENvbW1zTWVzc2FnZTxUPihtZXNzYWdlLCB2YWx1ZSkpXG4gICAgfSxcbiAgICBfX3Byb2Nlc3NNZXNzYWdlczogKG1lc3NhZ2VzOiBVaW50OEFycmF5W10pID0+IHtcbiAgICAgIGZvciAoY29uc3QgbWVzc2FnZSBvZiBtZXNzYWdlcykge1xuICAgICAgICBjb25zdCBjb21tc01zZyA9IGRlY29kZUNvbW1zTWVzc2FnZTxUPihtZXNzYWdlKVxuICAgICAgICBpZiAoIWNvbW1zTXNnKSBjb250aW51ZVxuICAgICAgICBjb25zdCB7IHNlbmRlciwgbWVzc2FnZVR5cGUsIGRhdGEgfSA9IGNvbW1zTXNnXG4gICAgICAgIGNvbnN0IGZuID0gbWFwcGluZy5nZXQobWVzc2FnZVR5cGUpXG4gICAgICAgIGlmIChmbikgZm4oZGF0YSwgc2VuZGVyKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JhZnRDb21tc01lc3NhZ2U8VCBleHRlbmRzIENvbW1zTWVzc2FnZT4obWVzc2FnZVR5cGU6IFQsIHBheWxvYWQ6IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5IHtcbiAgY29uc3QgbXNnID0gbmV3IFVpbnQ4QXJyYXkocGF5bG9hZC5ieXRlTGVuZ3RoICsgMSlcbiAgbXNnLnNldChbbWVzc2FnZVR5cGVdKVxuICBtc2cuc2V0KHBheWxvYWQsIDEpXG4gIHJldHVybiBtc2dcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZUNvbW1zTWVzc2FnZTxUIGV4dGVuZHMgQ29tbXNNZXNzYWdlPihcbiAgZGF0YTogVWludDhBcnJheVxuKTogeyBzZW5kZXI6IHN0cmluZzsgbWVzc2FnZVR5cGU6IFQ7IGRhdGE6IFVpbnQ4QXJyYXkgfSB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgbGV0IG9mZnNldCA9IDBcbiAgICBjb25zdCByID0gbmV3IFVpbnQ4QXJyYXkoZGF0YSlcbiAgICBjb25zdCB2aWV3ID0gbmV3IERhdGFWaWV3KHIuYnVmZmVyKVxuICAgIGNvbnN0IHNlbmRlckxlbmd0aCA9IHZpZXcuZ2V0VWludDgob2Zmc2V0KVxuICAgIG9mZnNldCArPSAxXG4gICAgY29uc3Qgc2VuZGVyID0gZGVjb2RlU3RyaW5nKGRhdGEuc3ViYXJyYXkoMSwgc2VuZGVyTGVuZ3RoICsgMSkpXG4gICAgb2Zmc2V0ICs9IHNlbmRlckxlbmd0aFxuICAgIGNvbnN0IG1lc3NhZ2VUeXBlID0gdmlldy5nZXRVaW50OChvZmZzZXQpIGFzIFRcbiAgICBvZmZzZXQgKz0gMVxuICAgIGNvbnN0IG1lc3NhZ2UgPSByLnN1YmFycmF5KG9mZnNldClcblxuICAgIHJldHVybiB7XG4gICAgICBzZW5kZXIsXG4gICAgICBtZXNzYWdlVHlwZSxcbiAgICAgIGRhdGE6IG1lc3NhZ2VcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zb2xlLmVycm9yKCdJbnZhbGlkIENvbW1zIG1lc3NhZ2UnLCBlKVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVTdHJpbmcoZGF0YTogVWludDhBcnJheSk6IHN0cmluZyB7XG4gIGNvbnN0IGJ1ZmZlciA9IG5ldyBSZWFkV3JpdGVCeXRlQnVmZmVyKClcbiAgYnVmZmVyLndyaXRlQnVmZmVyKGRhdGEsIHRydWUpXG4gIHJldHVybiBidWZmZXIucmVhZFV0ZjhTdHJpbmcoKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlU3RyaW5nKHM6IHN0cmluZyk6IFVpbnQ4QXJyYXkge1xuICBjb25zdCBidWZmZXIgPSBuZXcgUmVhZFdyaXRlQnl0ZUJ1ZmZlcigpXG4gIGJ1ZmZlci53cml0ZVV0ZjhTdHJpbmcocylcbiAgcmV0dXJuIGJ1ZmZlci5yZWFkQnVmZmVyKClcbn1cbiIsICJpbXBvcnQge1xuICBFbmdpbmVJbmZvIGFzIF9FbmdpbmVJbmZvLFxuICBFbnRpdHksXG4gIElFbmdpbmUsXG4gIE5ldHdvcmtFbnRpdHkgYXMgX05ldHdvcmtFbnRpdHksXG4gIFNjaGVtYXMsXG4gIExhc3RXcml0ZVdpbkVsZW1lbnRTZXRDb21wb25lbnREZWZpbml0aW9uLFxuICBQQkVuZ2luZUluZm9cbn0gZnJvbSAnQGRjbC9lY3MnXG5pbXBvcnQgeyBjb21wb25lbnROdW1iZXJGcm9tTmFtZSB9IGZyb20gJ0BkY2wvZWNzL2Rpc3QvY29tcG9uZW50cy9jb21wb25lbnQtbnVtYmVyJ1xuXG5pbXBvcnQgdHlwZSB7IEdldFVzZXJEYXRhUmVxdWVzdCwgR2V0VXNlckRhdGFSZXNwb25zZSB9IGZyb20gJ35zeXN0ZW0vVXNlcklkZW50aXR5J1xuaW1wb3J0IHsgU3luY0VudGl0eSB9IGZyb20gJy4vZW50aXRpZXMnXG5pbXBvcnQgeyBJUHJvZmlsZSB9IGZyb20gJy4vbWVzc2FnZS1idXMtc3luYydcblxuLy8gQ29tcG9uZW50IHRvIHRyYWNrIGFsbCB0aGUgcGxheWVycyBhbmQgd2hlbiB0aGV5IGVudGVyIHRvIHRoZSBzY2VuZS5cbi8vIEtub3cgd2hvIGlzIGluIGNoYXJnZSBvZiBzZW5kaW5nIHRoZSBpbml0aWFsIHN0YXRlIChvbGRlc3Qgb25lKVxuZXhwb3J0IGNvbnN0IGRlZmluZVBsYXllcnNJblNjZW5lID0gKGVuZ2luZTogSUVuZ2luZSkgPT5cbiAgZW5naW5lLmRlZmluZUNvbXBvbmVudCgncGxheWVycy1zY2VuZScsIHtcbiAgICB0aW1lc3RhbXA6IFNjaGVtYXMuTnVtYmVyLFxuICAgIHVzZXJJZDogU2NoZW1hcy5TdHJpbmdcbiAgfSlcblxuLy8gQWxyZWFkeSBpbml0aWFsaXplZCBteSBzdGF0ZS4gSWdub3JlIG5ldyBzdGF0ZXMgbWVzc2FnZXMuXG5leHBvcnQgbGV0IHN0YXRlSW5pdGlhbGl6ZWQgPSBmYWxzZVxuXG4vLyBNeSBwbGF5ZXIgZW50aXR5IHRvIGNoZWNrIGlmIEknbSB0aGUgb2xkZXN0IHBsYXllciBpbiB0aGUgc2NlbmRcbmV4cG9ydCBsZXQgcGxheWVyU2NlbmVFbnRpdHk6IEVudGl0eVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0SW5pdGlhbGl6ZWQoKSB7XG4gIHN0YXRlSW5pdGlhbGl6ZWQgPSB0cnVlXG59XG5cbi8vIEZsYWcgdG8gYXZvaWQgc2VuZGluZyBvdmVyIHRoZSB3aXJlIGFsbCB0aGUgaW5pdGlhbCBtZXNzYWdlcyB0aGF0IHRoZSBlbmdpbmUgYWRkJ3MgdG8gdGhlIHJlbmRlcmVyVHJhbnNwb3J0XG4vLyBJTklUSUFMX0NSRFRfTUVTU0FHRVMgdGhhdCBhcmUgYmVpbmcgcHJvY2Vzc2VkIG9uIHRoZSBvblN0YXJ0IGxvb3AsIGJlZm9yZSB0aGUgb25VcGRhdGUuXG5leHBvcnQgbGV0IElOSVRJQUxfQ1JEVF9SRU5ERVJFUl9NRVNTQUdFU19TRU5UID0gZmFsc2VcblxuLy8gUmV0cmlldmUgdXNlcklkIHRvIHN0YXJ0IHNlbmRpbmcgdGhpcyBpbmZvIGFzIHRoZSBuZXR3b3JrSWRcbmV4cG9ydCBmdW5jdGlvbiBmZXRjaFByb2ZpbGUoXG4gIG15UHJvZmlsZTogSVByb2ZpbGUsXG4gIGdldFVzZXJEYXRhOiAodmFsdWU6IEdldFVzZXJEYXRhUmVxdWVzdCkgPT4gUHJvbWlzZTxHZXRVc2VyRGF0YVJlc3BvbnNlPlxuKSB7XG4gIHZvaWQgZ2V0VXNlckRhdGEoe30pLnRoZW4oKHsgZGF0YSB9KSA9PiB7XG4gICAgaWYgKGRhdGE/LnVzZXJJZCkge1xuICAgICAgY29uc3QgdXNlcklkID0gZGF0YS51c2VySWRcbiAgICAgIGNvbnN0IG5ldHdvcmtJZCA9IGNvbXBvbmVudE51bWJlckZyb21OYW1lKGRhdGEudXNlcklkKVxuICAgICAgbXlQcm9maWxlLm5ldHdvcmtJZCA9IG5ldHdvcmtJZFxuICAgICAgbXlQcm9maWxlLnVzZXJJZCA9IHVzZXJJZFxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkbid0IGZldGNoIHByb2ZpbGUgZGF0YWApXG4gICAgfVxuICB9KVxufVxuXG4vKipcbiAqIEFkZCdzIHRoZSB1c2VyIGluZm9ybWF0aW9uIGFib3V0IHdoZW4gaGUgam9pbmVkIHRoZSBzY2VuZS5cbiAqIEl0J3MgdXNlZCB0byBjaGVjayB3aG8gaXMgdGhlIG9sZGVzdCBvbmUsIHRvIHN5bmMgdGhlIHN0YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQbGF5ZXJUaW1lc3RhbXBEYXRhKGVuZ2luZTogSUVuZ2luZSwgcHJvZmlsZTogSVByb2ZpbGUsIHN5bmNFbnRpdHk6IFN5bmNFbnRpdHkpIHtcbiAgaWYgKCFwcm9maWxlPy51c2VySWQpIHJldHVybiB1bmRlZmluZWRcbiAgY29uc3QgUGxheWVyc0luU2NlbmUgPSBkZWZpbmVQbGF5ZXJzSW5TY2VuZShlbmdpbmUpXG4gIGNvbnN0IGVudGl0eSA9IGVuZ2luZS5hZGRFbnRpdHkoKVxuICBQbGF5ZXJzSW5TY2VuZS5jcmVhdGUoZW50aXR5LCB7IHRpbWVzdGFtcDogRGF0ZS5ub3coKSwgdXNlcklkOiBwcm9maWxlLnVzZXJJZCB9KVxuICBzeW5jRW50aXR5KGVudGl0eSwgW1BsYXllcnNJblNjZW5lLmNvbXBvbmVudElkXSlcbiAgcGxheWVyU2NlbmVFbnRpdHkgPSBlbnRpdHlcbiAgcmV0dXJuIHBsYXllclNjZW5lRW50aXR5XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgSSdtIHRoZSBvbGRlciB1c2VyIHRvIHNlbmQgdGhlIGluaXRpYWwgc3RhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9sZGVzdFVzZXIoZW5naW5lOiBJRW5naW5lLCBwcm9maWxlOiBJUHJvZmlsZSwgc3luY0VudGl0eTogU3luY0VudGl0eSk6IGJvb2xlYW4ge1xuICBjb25zdCBQbGF5ZXJzSW5TY2VuZSA9IGRlZmluZVBsYXllcnNJblNjZW5lKGVuZ2luZSlcbiAgLy8gV2hlbiB0aGUgdXNlciBsZWF2ZXMgdGhlIHNjZW5lIGJ1dCBpdCdzIHN0aWxsIGNvbm5lY3RlZC5cbiAgaWYgKCFQbGF5ZXJzSW5TY2VuZS5oYXMocGxheWVyU2NlbmVFbnRpdHkpKSB7XG4gICAgY3JlYXRlUGxheWVyVGltZXN0YW1wRGF0YShlbmdpbmUsIHByb2ZpbGUsIHN5bmNFbnRpdHkpXG4gICAgcmV0dXJuIG9sZGVzdFVzZXIoZW5naW5lLCBwcm9maWxlLCBzeW5jRW50aXR5KVxuICB9XG4gIGNvbnN0IHsgdGltZXN0YW1wIH0gPSBQbGF5ZXJzSW5TY2VuZS5nZXQocGxheWVyU2NlbmVFbnRpdHkpXG4gIGZvciAoY29uc3QgW18sIHBsYXllcl0gb2YgZW5naW5lLmdldEVudGl0aWVzV2l0aChQbGF5ZXJzSW5TY2VuZSkpIHtcbiAgICBpZiAocGxheWVyLnRpbWVzdGFtcCA8IHRpbWVzdGFtcCkgcmV0dXJuIGZhbHNlXG4gIH1cbiAgcmV0dXJuIHRydWVcbn1cblxuLyoqXG4gKiBJZ25vcmUgQ1JEVCdzIGluaXRpYWwgbWVzc2FnZXMgZnJvbSB0aGUgcmVuZGVyZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzeW5jVHJhbnNwb3J0SXNSZWFkeShlbmdpbmU6IElFbmdpbmUpIHtcbiAgY29uc3QgRW5naW5lSW5mbyA9IGVuZ2luZS5nZXRDb21wb25lbnQoXG4gICAgX0VuZ2luZUluZm8uY29tcG9uZW50SWRcbiAgKSBhcyBMYXN0V3JpdGVXaW5FbGVtZW50U2V0Q29tcG9uZW50RGVmaW5pdGlvbjxQQkVuZ2luZUluZm8+XG4gIGlmICghSU5JVElBTF9DUkRUX1JFTkRFUkVSX01FU1NBR0VTX1NFTlQpIHtcbiAgICBjb25zdCBlbmdpbmVJbmZvID0gRW5naW5lSW5mby5nZXRPck51bGwoZW5naW5lLlJvb3RFbnRpdHkpXG4gICAgaWYgKGVuZ2luZUluZm8gJiYgZW5naW5lSW5mby50aWNrTnVtYmVyID4gMikge1xuICAgICAgSU5JVElBTF9DUkRUX1JFTkRFUkVSX01FU1NBR0VTX1NFTlQgPSB0cnVlXG4gICAgfVxuICB9XG4gIHJldHVybiBJTklUSUFMX0NSRFRfUkVOREVSRVJfTUVTU0FHRVNfU0VOVFxufVxuXG4vKipcbiAqIENoZWNrIGlmIHdlIGFyZSBhbHJlYWR5IGluaXRpYWxpemVkXG4gKiBBZGQgdGhlIHBsYXllclNjZW5lRGF0YSBjb21wb25lbnQgYW5kIHN5bmNyb25pemUgaXQgdGlsbCB3ZSByZWNlaXZlIHRoZSBzdGF0ZS5cbiAqIFRoaXMgZm4gc2hvdWxkIGJlIGFkZGVkIGFzIGEgc3lzdGVtIHNvIGl0IHJ1bnMgb24gZXZlcnkgdGlja1xuICovXG4vLyBUT0RPOiBIYWQgdG8gY29tbWVudCBhbGwgdGhlIGxvZ2ljIGJlY2F1c2UgZ2V0Q29ubmVjdGVkUGxheWVycyB3YXMgbm90IHdvcmtpbmcgYXMgZXhwZWN0ZWRcbi8vIEEgbG90IG9mIHJhaXNlIGNvbmRpdGlvbnMuIEZvciBub3cgd2Ugd2lsbCBnbyB3aXRoIHRoZSBhcHByb2FjaCB0aGF0IGV2ZXJ5IGNsaWVudCB0aGF0IGl0J3MgaW5pdGlhbGl6ZWQgd2lsbCBzZW5kIGhpcyBjcmR0IHN0YXRlLlxuZXhwb3J0IGZ1bmN0aW9uIHN0YXRlSW5pdGlhbGl6ZWRDaGVja2VyKGVuZ2luZTogSUVuZ2luZSwgX3Byb2ZpbGU6IElQcm9maWxlLCBfc3luY0VudGl0eTogU3luY0VudGl0eSkge1xuICAvLyBjb25zdCBQbGF5ZXJzSW5TY2VuZSA9IGRlZmluZVBsYXllcnNJblNjZW5lKGVuZ2luZSlcbiAgY29uc3QgRW5naW5lSW5mbyA9IGVuZ2luZS5nZXRDb21wb25lbnQoX0VuZ2luZUluZm8uY29tcG9uZW50SWQpIGFzIHR5cGVvZiBfRW5naW5lSW5mb1xuICAvLyBjb25zdCBOZXR3b3JrRW50aXR5ID0gZW5naW5lLmdldENvbXBvbmVudChfTmV0d29ya0VudGl0eS5jb21wb25lbnRJZCkgYXMgSU5ldG93cmtFbnRpdHlcbiAgYXN5bmMgZnVuY3Rpb24gZW50ZXJTY2VuZSgpIHtcbiAgICAvLyBpZiAoIXBsYXllclNjZW5lRW50aXR5KSB7XG4gICAgLy8gICBjcmVhdGVQbGF5ZXJUaW1lc3RhbXBEYXRhKGVuZ2luZSwgcHJvZmlsZSwgc3luY0VudGl0eSlcbiAgICAvLyB9XG5cbiAgICAvKipcbiAgICAgKiBLZWVwcyBQbGF5ZXJzSW5TY2VuZSB1cC10by1kYXRlIHdpdGggdGhlIGN1cnJlbnQgcGxheWVycy5cbiAgICAgKi9cbiAgICAvLyBjb25zdCBjb25uZWN0ZWRQbGF5ZXJzID0gYXdhaXQgZ2V0Q29ubmVjdGVkUGxheWVycyh7fSlcbiAgICAvLyBmb3IgKGNvbnN0IFtlbnRpdHksIHBsYXllcl0gb2YgZW5naW5lLmdldEVudGl0aWVzV2l0aChQbGF5ZXJzSW5TY2VuZSkpIHtcbiAgICAvLyAgIGlmICghY29ubmVjdGVkUGxheWVycy5wbGF5ZXJzLmZpbmQoKCQpID0+ICQudXNlcklkID09PSBwbGF5ZXIudXNlcklkKSkge1xuICAgIC8vICAgICBQbGF5ZXJzSW5TY2VuZS5kZWxldGVGcm9tKGVudGl0eSlcbiAgICAvLyAgIH1cbiAgICAvLyB9XG5cbiAgICAvLyBXYWl0IGZvciBjb21tcyB0byBiZSByZWFkeSA/PyB+MzAwMG1zXG4gICAgaWYgKChFbmdpbmVJbmZvLmdldE9yTnVsbChlbmdpbmUuUm9vdEVudGl0eSk/LnRpY2tOdW1iZXIgPz8gMCkgPiAxMDApIHtcbiAgICAgIHNldEluaXRpYWxpemVkKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIElmIHdlIGFscmVhZHkgaGF2ZSBkYXRhIGZyb20gcGxheWVycywgZG9udCBzZW5kIHRoZSBoZWFydGJlYXQgbWVzc2FnZXNcbiAgICAvLyBpZiAoY29ubmVjdGVkUGxheWVycy5wbGF5ZXJzLmxlbmd0aCkgcmV0dXJuXG5cbiAgICAvLyBpZiAoIXN0YXRlSW5pdGlhbGl6ZWQgJiYgcGxheWVyU2NlbmVFbnRpdHkpIHtcbiAgICAvLyAgIC8vIFNlbmQgdGhpcyBkYXRhIHRvIGFsbCB0aGUgcGxheWVycyBjb25uZWN0ZWQgKG5ldyBhbmQgb2xkKVxuICAgIC8vICAgLy8gU28gZXZlcnlvbmUgY2FuIGRlY2lkZSBpZiBpdCdzIHRoZSBvbGRlc3Qgb25lIG9yIG5vLlxuICAgIC8vICAgLy8gSXQncyBmb3IgdGhlIGNhc2UgdGhhdCBtdWx0aXBsZSB1c2VycyBlbnRlcnMgfiBhdCB0aGUgc2FtZSB0aW1lLlxuICAgIC8vICAgUGxheWVyc0luU2NlbmUuZ2V0TXV0YWJsZShwbGF5ZXJTY2VuZUVudGl0eSlcbiAgICAvLyB9XG4gIH1cbiAgdm9pZCBlbnRlclNjZW5lKClcbn1cbiIsICJpbXBvcnQge1xuICBFbnRpdHksXG4gIElFbmdpbmUsXG4gIE5ldHdvcmtFbnRpdHkgYXMgX05ldHdvcmtFbnRpdHksXG4gIElOZXRvd3JrRW50aXR5LFxuICBOZXR3b3JrUGFyZW50IGFzIF9OZXR3b3JrUGFyZW50LFxuICBUcmFuc2Zvcm0gYXMgX1RyYW5zZm9ybSxcbiAgU3luY0NvbXBvbmVudHMgYXMgX1N5bmNDb21wb25lbnRzLFxuICBJTmV0b3dya1BhcmVudCxcbiAgVHJhbnNmb3JtQ29tcG9uZW50LFxuICBJU3luY0NvbXBvbmVudHNcbn0gZnJvbSAnQGRjbC9lY3MnXG5pbXBvcnQgeyBJUHJvZmlsZSB9IGZyb20gJy4vbWVzc2FnZS1idXMtc3luYydcblxuZXhwb3J0IHR5cGUgU3luY0VudGl0eSA9IChlbnRpdHlJZDogRW50aXR5LCBjb21wb25lbnRJZHM6IG51bWJlcltdLCBlbnRpdHlFbnVtSWQ/OiBudW1iZXIpID0+IHZvaWRcblxuZXhwb3J0IGZ1bmN0aW9uIGVudGl0eVV0aWxzKGVuZ2luZTogSUVuZ2luZSwgcHJvZmlsZTogSVByb2ZpbGUpIHtcbiAgY29uc3QgTmV0d29ya0VudGl0eSA9IGVuZ2luZS5nZXRDb21wb25lbnQoX05ldHdvcmtFbnRpdHkuY29tcG9uZW50SWQpIGFzIElOZXRvd3JrRW50aXR5XG4gIGNvbnN0IE5ldHdvcmtQYXJlbnQgPSBlbmdpbmUuZ2V0Q29tcG9uZW50KF9OZXR3b3JrUGFyZW50LmNvbXBvbmVudElkKSBhcyBJTmV0b3dya1BhcmVudFxuICBjb25zdCBUcmFuc2Zvcm0gPSBlbmdpbmUuZ2V0Q29tcG9uZW50KF9UcmFuc2Zvcm0uY29tcG9uZW50SWQpIGFzIFRyYW5zZm9ybUNvbXBvbmVudFxuICBjb25zdCBTeW5jQ29tcG9uZW50cyA9IGVuZ2luZS5nZXRDb21wb25lbnQoX1N5bmNDb21wb25lbnRzLmNvbXBvbmVudElkKSBhcyBJU3luY0NvbXBvbmVudHNcblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV0d29yayBlbnRpdHkgKHN5bmMpIHRocm91Z2ggY29tbXMsIGFuZCBzeW5jIHRoZSByZWNlaXZlZCBjb21wb25lbnRzXG4gICAqL1xuICBmdW5jdGlvbiBzeW5jRW50aXR5KGVudGl0eUlkOiBFbnRpdHksIGNvbXBvbmVudElkczogbnVtYmVyW10sIGVudGl0eUVudW1JZD86IG51bWJlcikge1xuICAgIC8vIFByb2ZpbGUgbm90IGluaXRpYWxpemVkXG4gICAgaWYgKCFwcm9maWxlPy5uZXR3b3JrSWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUHJvZmlsZSBub3QgaW5pdGlhbGl6ZWQuIENhbGxlZCBzeW5jRW50aXR5IGluc2lkZSB0aGUgbWFpbigpIGZ1bmN0aW9uLicpXG4gICAgfVxuXG4gICAgLy8gV2UgdXNlIHRoZSBuZXR3b3JrSWQgZ2VuZXJhdGVkIGJ5IHRoZSB1c2VyIGFkZHJlc3MgdG8gaWRlbnRpZnkgdGhpcyBlbnRpdHkgdGhyb3VnaCB0aGUgbmV0d29ya1xuICAgIGNvbnN0IG5ldHdvcmtWYWx1ZSA9IHsgZW50aXR5SWQsIG5ldHdvcmtJZDogcHJvZmlsZS5uZXR3b3JrSWQgfVxuXG4gICAgLy8gSWYgdGhlcmUgaXMgYW4gZW50aXR5RW51bUlkLCBpdCBtZWFucyBpcyB0aGUgc2FtZSBlbnRpdHkgZm9yIGFsbCB0aGUgY2xpZW50cyBjcmVhdGVkIG9uIHRoZSBtYWluIGZ1bmNpdG9uLlxuICAgIC8vIFNvIHRoZSBuZXR3b3JrSWQgc2hvdWxkIGJlIHRoZSBzYW1lIGluIGFsbCB0aGUgY2xpZW50cyB0byBhdm9pZCByZS1jcmVhdGluZyB0aGlzIGVudGl0eS5cbiAgICAvLyBGb3IgdGhpcyBjYXNlIHdlIHVzZSBuZXR3b3JrSWQgPSAwLlxuICAgIGlmIChlbnRpdHlFbnVtSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbmV0d29ya1ZhbHVlLm5ldHdvcmtJZCA9IDBcbiAgICAgIG5ldHdvcmtWYWx1ZS5lbnRpdHlJZCA9IGVudGl0eUVudW1JZCBhcyBFbnRpdHlcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBlbnVtIGlzIGFscmVhZHkgdXNlZFxuICAgICAgZm9yIChjb25zdCBbXywgbmV0d29ya10gb2YgZW5naW5lLmdldEVudGl0aWVzV2l0aChOZXR3b3JrRW50aXR5KSkge1xuICAgICAgICBpZiAobmV0d29yay5uZXR3b3JrSWQgPT09IG5ldHdvcmtWYWx1ZS5uZXR3b3JrSWQgJiYgbmV0d29yay5lbnRpdHlJZCA9PT0gbmV0d29ya1ZhbHVlLmVudGl0eUlkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzeW5jRW50aXR5IGZhaWxlZCBiZWNhdXNlIHRoZSBpZCBwcm92aWRlZCBpcyBhbHJlYWR5IGluIHVzZScpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiBpcyBub3QgZGVmaW5lZCwgdGhlbiBpcyBhIGVudGl0eSBjcmVhdGVkIGluIHJ1bnRpbWUgKHdoYXQgd2UgY2FsbGVkIGR5bmFtaWMvcnVudGltZSBlbnRpdGllcykuXG4gICAgTmV0d29ya0VudGl0eS5jcmVhdGVPclJlcGxhY2UoZW50aXR5SWQsIG5ldHdvcmtWYWx1ZSlcbiAgICBTeW5jQ29tcG9uZW50cy5jcmVhdGVPclJlcGxhY2UoZW50aXR5SWQsIHsgY29tcG9uZW50SWRzIH0pXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBpdGVyYWJsZSBvZiBhbGwgdGhlIGNoaWxkcmVucyBvZiB0aGUgZ2l2ZW4gZW50aXR5LlxuICAgKiBmb3IgKGNvbnN0IGNoaWxkcmVuIG9mIGdldENoaWxkcmVuKHBhcmVudCkpIHsgY29uc29sZS5sb2coY2hpbGRyZW4pIH1cbiAgICogb3IganVzdCA9PiBjb25zdCBjaGlsZHJlbnM6IEVudGl0eVtdID0gQXJyYXkuZnJvbShnZXRDaGlsZHJlbihwYXJlbnQpKVxuICAgKi9cbiAgZnVuY3Rpb24qIGdldENoaWxkcmVuKHBhcmVudDogRW50aXR5KTogSXRlcmFibGU8RW50aXR5PiB7XG4gICAgY29uc3QgbmV0d29yayA9IE5ldHdvcmtFbnRpdHkuZ2V0T3JOdWxsKHBhcmVudClcbiAgICBpZiAobmV0d29yaykge1xuICAgICAgZm9yIChjb25zdCBbZW50aXR5LCBwYXJlbnRdIG9mIGVuZ2luZS5nZXRFbnRpdGllc1dpdGgoTmV0d29ya1BhcmVudCkpIHtcbiAgICAgICAgaWYgKHBhcmVudC5lbnRpdHlJZCA9PT0gbmV0d29yay5lbnRpdHlJZCAmJiBwYXJlbnQubmV0d29ya0lkID09PSBuZXR3b3JrLm5ldHdvcmtJZCkge1xuICAgICAgICAgIHlpZWxkIGVudGl0eVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZ2V0Rmlyc3RDaGlsZChlbnRpdHk6IEVudGl0eSkge1xuICAgIHJldHVybiBBcnJheS5mcm9tKGdldENoaWxkcmVuKGVudGl0eSkpWzBdXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcGFyZW50IGVudGl0eSBvZiB0aGUgZ2l2ZW4gZW50aXR5LlxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0UGFyZW50KGNoaWxkOiBFbnRpdHkpOiBFbnRpdHkgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHBhcmVudCA9IE5ldHdvcmtQYXJlbnQuZ2V0T3JOdWxsKGNoaWxkKVxuICAgIGlmICghcGFyZW50KSByZXR1cm4gdW5kZWZpbmVkXG4gICAgZm9yIChjb25zdCBbZW50aXR5LCBuZXR3b3JrXSBvZiBlbmdpbmUuZ2V0RW50aXRpZXNXaXRoKE5ldHdvcmtFbnRpdHkpKSB7XG4gICAgICBpZiAocGFyZW50Lm5ldHdvcmtJZCA9PT0gbmV0d29yay5uZXR3b3JrSWQgJiYgcGFyZW50LmVudGl0eUlkID09PSBuZXR3b3JrLmVudGl0eUlkKSB7XG4gICAgICAgIHJldHVybiBlbnRpdHlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgdGhlIG5ldHdvcmsgcGFyZW50aW5nIHRvIHN5bmMgZW50aXRpZXMuXG4gICAqIEVxdWl2YWxlbnQgdG8gVHJhbnNmb3JtLnBhcmVudCBmb3IgbG9jYWwgZW50aXRpZXNcbiAgICovXG4gIGZ1bmN0aW9uIHBhcmVudEVudGl0eShlbnRpdHk6IEVudGl0eSwgcGFyZW50OiBFbnRpdHkpIHtcbiAgICBjb25zdCBuZXR3b3JrID0gTmV0d29ya0VudGl0eS5nZXRPck51bGwocGFyZW50KVxuICAgIGlmICghbmV0d29yaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFbnRpdHkgaXMgbm90IHN5bmMuIENhbGwgc3luY0VudGl0eSBvbiB0aGUgcGFyZW50LicpXG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIG5ldHdvcmsgcGFyZW50IGNvbXBvbmVudFxuICAgIE5ldHdvcmtQYXJlbnQuY3JlYXRlT3JSZXBsYWNlKGVudGl0eSwgbmV0d29yaylcblxuICAgIC8vIElmIHdlIGRvbnQgaGF2ZSBhIHRyYW5zZm9ybSBmb3IgdGhpcyBlbnRpdHksIGNyZWF0ZSBhbiBlbXB0eSBvbmUgdG8gc2VuZCBpdCB0byB0aGUgcmVuZGVyZXJcbiAgICBpZiAoIVRyYW5zZm9ybS5nZXRPck51bGwoZW50aXR5KSkge1xuICAgICAgVHJhbnNmb3JtLmNyZWF0ZShlbnRpdHkpXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFdlIGZvcmNlIHRvIHNlbmQgYSB0aWNrIHVwZGF0ZSBvZiB0aGUgdHJhbnNmb3JtIHNvIHdlIGNhbiBzZW5kIHRoZSBORVcgcGFyZW50IHRvIHRoZSByZW5kZXJlclxuICAgICAgVHJhbnNmb3JtLmdldE11dGFibGUoZW50aXR5KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIHRoZSBuZXR3b3JrIHBhcmVudGluZyBmcm9tIGFuIGVudGl0eVxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlUGFyZW50KGVudGl0eTogRW50aXR5KSB7XG4gICAgY29uc3QgbmV0d29yayA9IE5ldHdvcmtFbnRpdHkuZ2V0T3JOdWxsKGVudGl0eSlcblxuICAgIGlmICghbmV0d29yaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFbnRpdHkgaXMgbm90IHN5bmMnKVxuICAgIH1cblxuICAgIE5ldHdvcmtQYXJlbnQuZGVsZXRlRnJvbShlbnRpdHkpXG4gIH1cblxuICByZXR1cm4ge1xuICAgIHN5bmNFbnRpdHksXG4gICAgZ2V0Q2hpbGRyZW4sXG4gICAgZ2V0UGFyZW50LFxuICAgIHBhcmVudEVudGl0eSxcbiAgICByZW1vdmVQYXJlbnQsXG4gICAgZ2V0Rmlyc3RDaGlsZFxuICB9XG59XG4iLCAiaW1wb3J0IHsgSUVuZ2luZSwgVHJhbnNwb3J0IH0gZnJvbSAnQGRjbC9lY3MnXG5pbXBvcnQgdHlwZSB7IFNlbmRCaW5hcnlSZXF1ZXN0LCBTZW5kQmluYXJ5UmVzcG9uc2UgfSBmcm9tICd+c3lzdGVtL0NvbW11bmljYXRpb25zQ29udHJvbGxlcidcblxuaW1wb3J0IHsgc3luY0ZpbHRlciB9IGZyb20gJy4vZmlsdGVyJ1xuaW1wb3J0IHsgZW5naW5lVG9DcmR0IH0gZnJvbSAnLi9zdGF0ZSdcbmltcG9ydCB7IHNlcmlhbGl6ZUNyZHRNZXNzYWdlcyB9IGZyb20gJy4uL2ludGVybmFsL3RyYW5zcG9ydHMvbG9nZ2VyJ1xuaW1wb3J0IHsgQmluYXJ5TWVzc2FnZUJ1cywgQ29tbXNNZXNzYWdlIH0gZnJvbSAnLi9iaW5hcnktbWVzc2FnZS1idXMnXG5pbXBvcnQge1xuICBkZWZpbmVQbGF5ZXJzSW5TY2VuZSxcbiAgZmV0Y2hQcm9maWxlLFxuICBvbGRlc3RVc2VyIGFzIF9vbGRlc3RVc2VyLFxuICBzZXRJbml0aWFsaXplZCxcbiAgc3RhdGVJbml0aWFsaXplZCxcbiAgc3RhdGVJbml0aWFsaXplZENoZWNrZXIsXG4gIHN5bmNUcmFuc3BvcnRJc1JlYWR5XG59IGZyb20gJy4vdXRpbHMnXG5pbXBvcnQgeyBlbnRpdHlVdGlscyB9IGZyb20gJy4vZW50aXRpZXMnXG5pbXBvcnQgeyBHZXRVc2VyRGF0YVJlcXVlc3QsIEdldFVzZXJEYXRhUmVzcG9uc2UgfSBmcm9tICd+c3lzdGVtL1VzZXJJZGVudGl0eSdcblxuZXhwb3J0IHR5cGUgSVByb2ZpbGUgPSB7IG5ldHdvcmtJZDogbnVtYmVyOyB1c2VySWQ6IHN0cmluZyB9XG4vLyB1c2VyIHRoYXQgd2UgYXNrZWQgZm9yIHRoZSBpbml0YWwgY3JkdCBzdGF0ZVxuZXhwb3J0IGZ1bmN0aW9uIGFkZFN5bmNUcmFuc3BvcnQoXG4gIGVuZ2luZTogSUVuZ2luZSxcbiAgc2VuZEJpbmFyeTogKG1zZzogU2VuZEJpbmFyeVJlcXVlc3QpID0+IFByb21pc2U8U2VuZEJpbmFyeVJlc3BvbnNlPixcbiAgZ2V0VXNlckRhdGE6ICh2YWx1ZTogR2V0VXNlckRhdGFSZXF1ZXN0KSA9PiBQcm9taXNlPEdldFVzZXJEYXRhUmVzcG9uc2U+XG4pIHtcbiAgZGVmaW5lUGxheWVyc0luU2NlbmUoZW5naW5lKVxuICAvLyBQcm9maWxlIEluZm9cbiAgY29uc3QgbXlQcm9maWxlOiBJUHJvZmlsZSA9IHt9IGFzIElQcm9maWxlXG4gIGZldGNoUHJvZmlsZShteVByb2ZpbGUhLCBnZXRVc2VyRGF0YSlcblxuICAvLyBFbnRpdHkgdXRpbHNcbiAgY29uc3QgZW50aXR5RGVmaW5pdGlvbnMgPSBlbnRpdHlVdGlscyhlbmdpbmUsIG15UHJvZmlsZSlcblxuICAvLyBMaXN0IG9mIE1lc3NhZ2VCdXNzIG1lc3NzYWdlcyB0byBiZSBzZW50IG9uIGV2ZXJ5IGZyYW1lIHRvIGNvbW1zXG4gIGNvbnN0IHBlbmRpbmdNZXNzYWdlQnVzTWVzc2FnZXNUb1NlbmQ6IFVpbnQ4QXJyYXlbXSA9IFtdXG4gIGNvbnN0IGJpbmFyeU1lc3NhZ2VCdXMgPSBCaW5hcnlNZXNzYWdlQnVzKChtZXNzYWdlKSA9PiBwZW5kaW5nTWVzc2FnZUJ1c01lc3NhZ2VzVG9TZW5kLnB1c2gobWVzc2FnZSkpXG4gIGZ1bmN0aW9uIGdldE1lc3NhZ2VzVG9TZW5kKCkge1xuICAgIGNvbnN0IG1lc3NhZ2VzID0gWy4uLnBlbmRpbmdNZXNzYWdlQnVzTWVzc2FnZXNUb1NlbmRdXG4gICAgcGVuZGluZ01lc3NhZ2VCdXNNZXNzYWdlc1RvU2VuZC5sZW5ndGggPSAwXG4gICAgcmV0dXJuIG1lc3NhZ2VzXG4gIH1cblxuICAvLyBBZGQgU3luYyBUcmFuc3BvcnRcbiAgY29uc3QgdHJhbnNwb3J0OiBUcmFuc3BvcnQgPSB7XG4gICAgZmlsdGVyOiBzeW5jRmlsdGVyKGVuZ2luZSksXG4gICAgc2VuZDogYXN5bmMgKG1lc3NhZ2U6IFVpbnQ4QXJyYXkpID0+IHtcbiAgICAgIGlmIChzeW5jVHJhbnNwb3J0SXNSZWFkeShlbmdpbmUpICYmIG1lc3NhZ2UuYnl0ZUxlbmd0aCkge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhBcnJheS5mcm9tKHNlcmlhbGl6ZUNyZHRNZXNzYWdlcygnW3NlbmQgQ1JEVF06ICcsIG1lc3NhZ2UsIGVuZ2luZSkpKVxuICAgICAgICBiaW5hcnlNZXNzYWdlQnVzLmVtaXQoQ29tbXNNZXNzYWdlLkNSRFQsIG1lc3NhZ2UpXG4gICAgICB9XG4gICAgICBjb25zdCBtZXNzYWdlcyA9IGdldE1lc3NhZ2VzVG9TZW5kKClcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc2VuZEJpbmFyeSh7IGRhdGE6IG1lc3NhZ2VzIH0pXG4gICAgICBiaW5hcnlNZXNzYWdlQnVzLl9fcHJvY2Vzc01lc3NhZ2VzKHJlc3BvbnNlLmRhdGEpXG4gICAgfSxcbiAgICB0eXBlOiAnbmV0d29yaydcbiAgfVxuICBlbmdpbmUuYWRkVHJhbnNwb3J0KHRyYW5zcG9ydClcbiAgLy8gRW5kIGFkZCBzeW5jIHRyYW5zcG9ydFxuXG4gIC8vIEFkZCBzdGF0ZSBpbnRpYWxpemVkIGNoZWNrZXJcbiAgZW5naW5lLmFkZFN5c3RlbSgoKSA9PiBzdGF0ZUluaXRpYWxpemVkQ2hlY2tlcihlbmdpbmUsIG15UHJvZmlsZSwgZW50aXR5RGVmaW5pdGlvbnMuc3luY0VudGl0eSkpXG5cbiAgLy8gUmVxdWVzdCBpbml0aWFsIHN0YXRlXG4gIGJpbmFyeU1lc3NhZ2VCdXMuZW1pdChDb21tc01lc3NhZ2UuUkVRX0NSRFRfU1RBVEUsIG5ldyBVaW50OEFycmF5KCkpXG5cbiAgLy8gSWYgd2UgZG9udCBoYXZlIGFueSBzdGF0ZSBpbml0aWFsaXplZCwgYW5kIHJlY2lldmUgYSBzdGF0ZSBtZXNzYWdlLlxuICBiaW5hcnlNZXNzYWdlQnVzLm9uKENvbW1zTWVzc2FnZS5SRVNfQ1JEVF9TVEFURSwgKHZhbHVlKSA9PiB7XG4gICAgLy8gY29uc29sZS5sb2coQXJyYXkuZnJvbShzZXJpYWxpemVDcmR0TWVzc2FnZXMoJ1tiaW5hcnlNZXNzYWdlQnVzXTogJywgdmFsdWUsIGVuZ2luZSkpKVxuICAgIGlmICghc3RhdGVJbml0aWFsaXplZCkge1xuICAgICAgc2V0SW5pdGlhbGl6ZWQoKVxuICAgICAgdHJhbnNwb3J0Lm9ubWVzc2FnZSEodmFsdWUpXG4gICAgfVxuICB9KVxuXG4gIC8vIElmIHdlIGFyZSB0aGUgb2xkZXN0IHVzZXIgYW5kIHdlIHJlY2lldmUgYSByZXEgb2YgYSBzdGF0ZSB3ZSBzZW5kIGl0LlxuICBiaW5hcnlNZXNzYWdlQnVzLm9uKENvbW1zTWVzc2FnZS5SRVFfQ1JEVF9TVEFURSwgKCkgPT4ge1xuICAgIC8vIFRPRE86IG9sZGVzdCBub3Qgd29ya2luZyBiZWNhdXNlIGNvbm5lY3RlZFBsYXllcnMgcmV0dXJucyBwbGF5ZXJzIHRoYXQgYXJlIG5vdCBpbiB0aGUgc2NlbmUuXG4gICAgLy8gTm90IHdvcmtpbmcgOnNhZGNhdDpcbiAgICAvLyBjb25zdCBvbGRlc3QgPSBvbGRlc3RVc2VyKGVuZ2luZSwgbXlQcm9maWxlLCBlbnRpdHlEZWZpbml0aW9ucy5zeW5jRW50aXR5KVxuICAgIGlmIChzdGF0ZUluaXRpYWxpemVkKSB7XG4gICAgICBiaW5hcnlNZXNzYWdlQnVzLmVtaXQoQ29tbXNNZXNzYWdlLlJFU19DUkRUX1NUQVRFLCBlbmdpbmVUb0NyZHQoZW5naW5lKSlcbiAgICB9XG4gIH0pXG5cbiAgLy8gUHJvY2VzcyBDUkRUIG1lc3NhZ2VzIGhlcmVcbiAgYmluYXJ5TWVzc2FnZUJ1cy5vbihDb21tc01lc3NhZ2UuQ1JEVCwgKHZhbHVlKSA9PiB7XG4gICAgLy8gY29uc29sZS5sb2coQXJyYXkuZnJvbShzZXJpYWxpemVDcmR0TWVzc2FnZXMoJ1tDUkRUIG9uXTogJywgdmFsdWUsIGVuZ2luZSkpKVxuXG4gICAgdHJhbnNwb3J0Lm9ubWVzc2FnZSEodmFsdWUpXG4gIH0pXG5cbiAgcmV0dXJuIHtcbiAgICAuLi5lbnRpdHlEZWZpbml0aW9ucyxcbiAgICBteVByb2ZpbGVcbiAgfVxufVxuIiwgImltcG9ydCB7IEVudGl0eSwgVHJhbnNmb3JtIH0gZnJvbSAnQGRjbC9zZGsvZWNzJ1xuaW1wb3J0IHsgVmVjdG9yMywgUXVhdGVybmlvbiB9IGZyb20gJ0BkY2wvc2RrL21hdGgnXG5cbi8qKlxuICogUmVtYXBzIGEgdmFsdWUgZnJvbSBvbmUgcmFuZ2Ugb2YgdmFsdWVzIHRvIGl0cyBlcXVpdmFsZW50LCBzY2FsZWQgaW4gcHJvcG9ydGlvbiB0byBhbm90aGVyIHJhbmdlIG9mIHZhbHVlcywgdXNpbmcgbWF4aW11bSBhbmQgbWluaW11bS5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSB2YWx1ZSBpbnB1dCBudW1iZXJcbiAqIEBwYXJhbSBtaW4xIC0gbWluMSBNaW5pbXVtIHZhbHVlIGluIHRoZSByYW5nZSBvZiB0aGUgaW5wdXQuXG4gKiBAcGFyYW0gbWF4MSAtIG1heDEgTWF4aW11bSB2YWx1ZSBpbiB0aGUgcmFuZ2Ugb2YgdGhlIGlucHV0LlxuICogQHBhcmFtIG1pbjIgLSBtaW4yIE1pbmltdW0gdmFsdWUgaW4gdGhlIHJhbmdlIG9mIHRoZSBvdXRwdXQuXG4gKiBAcGFyYW0gbWF4MiAtIG1heDIgTWF4aW11bSB2YWx1ZSBpbiB0aGUgcmFuZ2Ugb2YgdGhlIG91dHB1dC5cbiAqIEByZXR1cm5zIFRoZSByZXN1bHRpbmcgcmVtYXBwZWQgdmFsdWUgYmV0d2VlbiB0aGUgbmV3IG1pbiBhbmQgbWF4XG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1hcChcbiAgdmFsdWU6IG51bWJlcixcbiAgbWluMTogbnVtYmVyLFxuICBtYXgxOiBudW1iZXIsXG4gIG1pbjI6IG51bWJlcixcbiAgbWF4MjogbnVtYmVyXG4pIHtcbiAgbGV0IHJhbmdlMSA9IG1heDEgLSBtaW4xXG4gIGxldCByYW5nZTIgPSBtYXgyIC0gbWluMlxuICByZXR1cm4gKCh2YWx1ZSAtIG1pbjEpIC8gcmFuZ2UxKSAqIHJhbmdlMiArIG1pbjJcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBwb3NpdGlvbiBvZiBhbiBlbnRpdHkgdGhhdCBpcyBhIGNoaWxkIG9mIG90aGVyIGVudGl0aWVzLCByZWxhdGl2ZSB0byB0aGUgc2NlbmUgaW5zdGVhZCBvZiByZWxhdGl2ZSB0byB0aGUgcGFyZW50LiBSZXR1cm5zIGEgVmVjdG9yMy5cbiAqXG4gKiBAcGFyYW0gZW50aXR5IC0gRW50aXR5IHRvIGNhbGN1bGF0ZSBwb3NpdGlvblxuICogQHJldHVybnMgVGhlIEVudGl0eSdzIGdsb2JhbCBwb3NpdGlvbiByZWxhdGl2ZSB0byB0aGUgc2NlbmUncyBvcmlnaW5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdvcmxkUG9zaXRpb24oZW50aXR5OiBFbnRpdHkpOiBWZWN0b3IzIHtcbiAgbGV0IHRyYW5zZm9ybSA9IFRyYW5zZm9ybS5nZXRPck51bGwoZW50aXR5KVxuXG4gIGlmICghdHJhbnNmb3JtKVxuICAgIHJldHVybiBWZWN0b3IzLlplcm8oKVxuXG4gIGxldCBwYXJlbnQgPSB0cmFuc2Zvcm0ucGFyZW50XG5cbiAgaWYgKCFwYXJlbnQpIHtcbiAgICByZXR1cm4gdHJhbnNmb3JtLnBvc2l0aW9uXG4gIH0gZWxzZSB7XG4gICAgbGV0IHBhcmVudFJvdGF0aW9uID0gVHJhbnNmb3JtLmdldChwYXJlbnQpLnJvdGF0aW9uXG4gICAgcmV0dXJuIFZlY3RvcjMuYWRkKGdldFdvcmxkUG9zaXRpb24ocGFyZW50KSwgVmVjdG9yMy5yb3RhdGUodHJhbnNmb3JtLnBvc2l0aW9uLCBwYXJlbnRSb3RhdGlvbikpXG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBwb3NpdGlvbiBvZiBhbiBlbnRpdHkgdGhhdCBpcyBhIGNoaWxkIG9mIG90aGVyIGVudGl0aWVzLCByZWxhdGl2ZSB0byB0aGUgc2NlbmUgaW5zdGVhZCBvZiByZWxhdGl2ZSB0byB0aGUgcGFyZW50LiBSZXR1cm5zIGEgVmVjdG9yMy5cbiAqXG4gKiBAcGFyYW0gZW50aXR5IC0gRW50aXR5IHRvIGNhbGN1bGF0ZSBwb3NpdGlvblxuICogQHJldHVybnMgVGhlIEVudGl0eSdzIGdsb2JhbCByb3RhdGlvbiBpbiByZWZlcmVuY2UgdG8gdGhlIHNjZW5lJ3Mgb3JpZ2luXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRXb3JsZFJvdGF0aW9uKGVudGl0eTogRW50aXR5KTogUXVhdGVybmlvbiB7XG4gIGxldCB0cmFuc2Zvcm0gPSBUcmFuc2Zvcm0uZ2V0T3JOdWxsKGVudGl0eSlcblxuICBpZiAoIXRyYW5zZm9ybSlcbiAgICByZXR1cm4gUXVhdGVybmlvbi5JZGVudGl0eSgpXG5cbiAgbGV0IHBhcmVudCA9IHRyYW5zZm9ybS5wYXJlbnRcblxuICBpZiAoIXBhcmVudCkge1xuICAgIHJldHVybiB0cmFuc2Zvcm0ucm90YXRpb25cbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gUXVhdGVybmlvbi5tdWx0aXBseSh0cmFuc2Zvcm0ucm90YXRpb24sIGdldFdvcmxkUm90YXRpb24ocGFyZW50KSlcbiAgfVxufVxuXG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGVudW0gSW50ZXJwb2xhdGlvblR5cGUge1xuICBMSU5FQVIgPSAnbGluZWFyJyxcblxuICBFQVNFSU5RVUFEID0gJ2Vhc2VpbnF1YWQnLFxuICBFQVNFT1VUUVVBRCA9ICdlYXNlb3V0cXVhZCcsXG4gIEVBU0VRVUFEID0gJ2Vhc2VxdWFkJyxcblxuICBFQVNFSU5TSU5FID0gJ2Vhc2VpbnNpbmUnLFxuICBFQVNFT1VUU0lORSA9ICdlYXNlb3V0c2luZScsXG4gIEVBU0VTSU5FID0gJ2Vhc2Vpbm91dHNpbmUnLFxuXG4gIEVBU0VJTkVYUE8gPSAnZWFzZWluZXhwbycsXG4gIEVBU0VPVVRFWFBPID0gJ2Vhc2VvdXRleHBvJyxcbiAgRUFTRUVYUE8gPSAnZWFzZWlub3V0ZXhwbycsXG5cbiAgRUFTRUlORUxBU1RJQyA9ICdlYXNlaW5lbGFzdGljJyxcbiAgRUFTRU9VVEVMQVNUSUMgPSAnZWFzZW91dGVsYXN0aWMnLFxuICBFQVNFRUxBU1RJQyA9ICdlYXNlaW5vdXRlbGFzdGljJyxcblxuICBFQVNFSU5CT1VOQ0UgPSAnZWFzZWluYm91bmNlJyxcbiAgRUFTRU9VVEVCT1VOQ0UgPSAnZWFzZW91dGJvdW5jZScsXG4gIEVBU0VCT1VOQ0UgPSAnZWFzZWlub3V0Ym91bmNlJyxcbn1cblxuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnRlcnBvbGF0ZSh0eXBlOiBJbnRlcnBvbGF0aW9uVHlwZSwgdDogbnVtYmVyKTogbnVtYmVyIHtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBJbnRlcnBvbGF0aW9uVHlwZS5MSU5FQVI6XG4gICAgICByZXR1cm4gSW50ZXJwb2xhdGVMaW5lYXIodClcbiAgICBjYXNlIEludGVycG9sYXRpb25UeXBlLkVBU0VJTlFVQUQ6XG4gICAgICByZXR1cm4gSW50ZXJwb2xhdGVFYXNlSW5RdWFkKHQpXG4gICAgY2FzZSBJbnRlcnBvbGF0aW9uVHlwZS5FQVNFT1VUUVVBRDpcbiAgICAgIHJldHVybiBJbnRlcnBvbGF0ZUVhc2VPdXRRdWFkKHQpXG4gICAgY2FzZSBJbnRlcnBvbGF0aW9uVHlwZS5FQVNFUVVBRDpcbiAgICAgIHJldHVybiBJbnRlcnBvbGF0ZUVhc2VRdWFkKHQpXG5cdCAgY2FzZSBJbnRlcnBvbGF0aW9uVHlwZS5FQVNFSU5TSU5FOlxuXHRcdCAgcmV0dXJuIEludGVycG9sYXRlRWFzZUluU2luZSh0KVxuICAgIGNhc2UgSW50ZXJwb2xhdGlvblR5cGUuRUFTRU9VVFNJTkU6XG4gICAgICByZXR1cm4gSW50ZXJwb2xhdGVFYXNlT3V0U2luZSh0KVxuICAgIGNhc2UgSW50ZXJwb2xhdGlvblR5cGUuRUFTRVNJTkU6XG4gICAgICByZXR1cm4gSW50ZXJwb2xhdGVFYXNlSW5PdXRTaW5lKHQpXG4gICAgY2FzZSBJbnRlcnBvbGF0aW9uVHlwZS5FQVNFSU5FWFBPOlxuICAgICAgcmV0dXJuIEludGVycG9sYXRlRWFzZUluRXhwbyh0KVxuICAgIGNhc2UgSW50ZXJwb2xhdGlvblR5cGUuRUFTRU9VVEVYUE86XG4gICAgICByZXR1cm4gSW50ZXJwb2xhdGVFYXNlT3V0RXhwbyh0KVxuICAgIGNhc2UgSW50ZXJwb2xhdGlvblR5cGUuRUFTRUVYUE86XG4gICAgICByZXR1cm4gSW50ZXJwb2xhdGVFYXNlSW5PdXRFeHBvKHQpXG4gICAgY2FzZSBJbnRlcnBvbGF0aW9uVHlwZS5FQVNFSU5FTEFTVElDOlxuICAgICAgcmV0dXJuIEludGVycG9sYXRlRWFzZUluRWxhc3RpYyh0KVxuICAgIGNhc2UgSW50ZXJwb2xhdGlvblR5cGUuRUFTRU9VVEVMQVNUSUM6XG4gICAgICByZXR1cm4gSW50ZXJwb2xhdGVFYXNlT3V0RWxhc3RpYyh0KVxuICAgIGNhc2UgSW50ZXJwb2xhdGlvblR5cGUuRUFTRUVMQVNUSUM6XG4gICAgICByZXR1cm4gSW50ZXJwb2xhdGVFYXNlSW5PdXRFbGFzdGljKHQpXG4gICAgY2FzZSBJbnRlcnBvbGF0aW9uVHlwZS5FQVNFSU5CT1VOQ0U6XG4gICAgICByZXR1cm4gSW50ZXJwb2xhdGVFYXNlSW5Cb3VuY2UodClcbiAgICBjYXNlIEludGVycG9sYXRpb25UeXBlLkVBU0VPVVRFQk9VTkNFOlxuICAgICAgcmV0dXJuIEludGVycG9sYXRlRWFzZU91dEJvdW5jZSh0KVxuICAgIGNhc2UgSW50ZXJwb2xhdGlvblR5cGUuRUFTRUJPVU5DRTpcbiAgICAgIHJldHVybiBJbnRlcnBvbGF0ZUVhc2VJbk91dEJvdW5jZSh0KVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gSW50ZXJwb2xhdGVMaW5lYXIodClcbiAgfVxufVxuXG5mdW5jdGlvbiBJbnRlcnBvbGF0ZUxpbmVhcih0OiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gdFxufVxuXG5mdW5jdGlvbiBJbnRlcnBvbGF0ZUVhc2VJblF1YWQodDogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIHQgKiB0XG59XG5cbmZ1bmN0aW9uIEludGVycG9sYXRlRWFzZU91dFF1YWQodDogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIHQgKiAoMiAtIHQpXG59XG5cbmZ1bmN0aW9uIEludGVycG9sYXRlRWFzZVF1YWQodDogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuICh0ICogdCkgLyAoMi4wICogKHQgKiB0IC0gdCkgKyAxLjApXG59XG5cbmZ1bmN0aW9uIEludGVycG9sYXRlRWFzZUluU2luZSh0OiBudW1iZXIpOiBudW1iZXIge1xuXHRyZXR1cm4gMSAtIE1hdGguY29zKCh0ICogTWF0aC5QSSkgLyAyKVxufVxuXG5mdW5jdGlvbiBJbnRlcnBvbGF0ZUVhc2VPdXRTaW5lKHQ6IG51bWJlcik6IG51bWJlciB7XG5cdHJldHVybiBNYXRoLnNpbigodCAqIE1hdGguUEkpIC8gMilcbn1cblxuZnVuY3Rpb24gSW50ZXJwb2xhdGVFYXNlSW5PdXRTaW5lKHQ6IG51bWJlcik6IG51bWJlciB7XG5cdHJldHVybiAtKE1hdGguY29zKE1hdGguUEkgKiB0KSAtIDEpIC8gMlxufVxuXG5mdW5jdGlvbiBJbnRlcnBvbGF0ZUVhc2VJbkV4cG8odDogbnVtYmVyKTogbnVtYmVyIHtcblx0cmV0dXJuIHQgPT09IDAgPyAwIDogTWF0aC5wb3coMiwgMTAgKiB0IC0gMTApXG59XG5cbmZ1bmN0aW9uIEludGVycG9sYXRlRWFzZU91dEV4cG8odDogbnVtYmVyKTogbnVtYmVyIHtcblx0cmV0dXJuIHQgPT09IDEgPyAxIDogMSAtIE1hdGgucG93KDIsIC0xMCAqIHQpXG59XG5cbmZ1bmN0aW9uIEludGVycG9sYXRlRWFzZUluT3V0RXhwbyh0OiBudW1iZXIpOiBudW1iZXIge1xuXHRyZXR1cm4gdCA9PT0gMFxuXHRcdFx0PyAwXG5cdFx0XHQ6IHQgPT09IDFcblx0XHRcdD8gMVxuXHRcdFx0OiB0IDwgMC41XG5cdFx0XHQ/IE1hdGgucG93KDIsIDIwICogdCAtIDEwKSAvIDJcblx0XHRcdDogKDIgLSBNYXRoLnBvdygyLCAtMjAgKiB0ICsgMTApKSAvIDJcbn1cblxuXG5mdW5jdGlvbiBJbnRlcnBvbGF0ZUVhc2VJbkVsYXN0aWModDogbnVtYmVyKTogbnVtYmVyIHtcblx0Y29uc3QgYzQgPSAoMiAqIE1hdGguUEkpIC8gM1xuXHRcblx0cmV0dXJuIHQgPT09IDBcblx0XHRcdD8gMFxuXHRcdFx0OiB0ID09PSAxXG5cdFx0XHQ/IDFcblx0XHRcdDogLU1hdGgucG93KDIsIDEwICogdCAtIDEwKSAqIE1hdGguc2luKCh0ICogMTAgLSAxMC43NSkgKiBjNClcbn1cblxuZnVuY3Rpb24gSW50ZXJwb2xhdGVFYXNlT3V0RWxhc3RpYyh0OiBudW1iZXIpOiBudW1iZXIge1xuXHRjb25zdCBjNSA9ICgyICogTWF0aC5QSSkgLyAzXG5cdFxuXHRyZXR1cm4gdCA9PT0gMFxuXHRcdFx0PyAwXG5cdFx0XHQ6IHQgPT09IDFcblx0XHRcdD8gMVxuXHRcdFx0OiBNYXRoLnBvdygyLCAtMTAgKiB0KSAqIE1hdGguc2luKCh0ICogMTAgLSAwLjc1KSAqIGM1KSArIDFcbn1cblxuZnVuY3Rpb24gSW50ZXJwb2xhdGVFYXNlSW5PdXRFbGFzdGljKHQ6IG51bWJlcik6IG51bWJlciB7XG5cdGNvbnN0IGM2ID0gKDIgKiBNYXRoLlBJKSAvIDQuNVxuXHRcblx0cmV0dXJuIHQgPT09IDBcblx0XHRcdD8gMFxuXHRcdFx0OiB0ID09PSAxXG5cdFx0XHQ/IDFcblx0XHRcdDogdCA8IDAuNVxuXHRcdFx0PyAtKE1hdGgucG93KDIsIDIwICogdCAtIDEwKSAqIE1hdGguc2luKCgyMCAqIHQgLSAxMS4xMjUpICogYzYpKSAvIDJcblx0XHRcdDogKE1hdGgucG93KDIsIC0yMCAqIHQgKyAxMCkgKiBNYXRoLnNpbigoMjAgKiB0IC0gMTEuMTI1KSAqIGM2KSkgLyAyICsgMVxufVxuXG5mdW5jdGlvbiBJbnRlcnBvbGF0ZUVhc2VJbkJvdW5jZSh0OiBudW1iZXIpOiBudW1iZXIge1xuXHRyZXR1cm4gMSAtIGJvdW5jZSgxIC0gdClcbn1cblxuZnVuY3Rpb24gSW50ZXJwb2xhdGVFYXNlT3V0Qm91bmNlKHQ6IG51bWJlcik6IG51bWJlciB7XG5cdHJldHVybiBib3VuY2UodClcbn1cblxuZnVuY3Rpb24gSW50ZXJwb2xhdGVFYXNlSW5PdXRCb3VuY2UodDogbnVtYmVyKTogbnVtYmVyIHtcblx0cmV0dXJuIHQgPCAwLjUgPyAoMSAtIGJvdW5jZSgxIC0gMiAqIHQpKSAvIDIgOiAoMSArIGJvdW5jZSgyICogdCAtIDEpKSAvIDJcbn1cblxuZnVuY3Rpb24gYm91bmNlKHg6IG51bWJlcikge1xuXHRjb25zdCBuMSA9IDcuNTYyNVxuXHRjb25zdCBkMSA9IDIuNzVcblxuXHRpZiAoeCA8IDEgLyBkMSkge1xuXHRcdHJldHVybiBuMSAqIHggKiB4XG5cdH0gZWxzZSBpZiAoeCA8IDIgLyBkMSkge1xuXHRcdHJldHVybiBuMSAqICh4IC09IDEuNSAvIGQxKSAqIHggKyAwLjc1XG5cdH0gZWxzZSBpZiAoeCA8IDIuNSAvIGQxKSB7XG5cdFx0cmV0dXJuIG4xICogKHggLT0gMi4yNSAvIGQxKSAqIHggKyAwLjkzNzVcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gbjEgKiAoeCAtPSAyLjYyNSAvIGQxKSAqIHggKyAwLjk4NDM3NVxuXHR9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDYXRtdWxsUm9tU3BsaW5lKHBvaW50czogVmVjdG9yM1tdLCBuYlBvaW50czogbnVtYmVyLCBjbG9zZWQ/OiBib29sZWFuKTogVmVjdG9yM1tdIHtcblx0Y29uc3QgY2F0bXVsbFJvbSA9IG5ldyBBcnJheTxWZWN0b3IzPigpO1xuXHRjb25zdCBzdGVwID0gMS4wIC8gbmJQb2ludHM7XG5cdGxldCBhbW91bnQgPSAwLjA7XG5cdGlmIChjbG9zZWQpIHtcblx0XHRjb25zdCBwb2ludHNDb3VudCA9IHBvaW50cy5sZW5ndGg7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBwb2ludHNDb3VudDsgaSsrKSB7XG5cdFx0XHRhbW91bnQgPSAwO1xuXHRcdFx0Zm9yIChsZXQgYyA9IDA7IGMgPCBuYlBvaW50czsgYysrKSB7XG5cdFx0XHRcdGNhdG11bGxSb20ucHVzaChcblx0XHRcdFx0XHRWZWN0b3IzLmNhdG11bGxSb20ocG9pbnRzW2kgJSBwb2ludHNDb3VudF0sIHBvaW50c1soaSArIDEpICUgcG9pbnRzQ291bnRdLCBwb2ludHNbKGkgKyAyKSAlIHBvaW50c0NvdW50XSwgcG9pbnRzWyhpICsgMykgJSBwb2ludHNDb3VudF0sIGFtb3VudClcblx0XHRcdFx0KTtcblx0XHRcdFx0YW1vdW50ICs9IHN0ZXA7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGNhdG11bGxSb20ucHVzaChjYXRtdWxsUm9tWzBdKTtcblx0fSBlbHNlIHtcblx0XHRjb25zdCB0b3RhbFBvaW50cyA9IG5ldyBBcnJheTxWZWN0b3IzPigpO1xuXHRcdHRvdGFsUG9pbnRzLnB1c2goVmVjdG9yMy5jbG9uZShwb2ludHNbMF0pKTtcblx0XHRBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseSh0b3RhbFBvaW50cywgcG9pbnRzKTtcblx0XHR0b3RhbFBvaW50cy5wdXNoKFZlY3RvcjMuY2xvbmUocG9pbnRzW3BvaW50cy5sZW5ndGggLSAxXSkpO1xuXHRcdGxldCBpID0gMDtcblx0XHRmb3IgKDsgaSA8IHRvdGFsUG9pbnRzLmxlbmd0aCAtIDM7IGkrKykge1xuXHRcdFx0YW1vdW50ID0gMDtcblx0XHRcdGZvciAobGV0IGMgPSAwOyBjIDwgbmJQb2ludHM7IGMrKykge1xuXHRcdFx0XHRjYXRtdWxsUm9tLnB1c2goVmVjdG9yMy5jYXRtdWxsUm9tKHRvdGFsUG9pbnRzW2ldLCB0b3RhbFBvaW50c1tpICsgMV0sIHRvdGFsUG9pbnRzW2kgKyAyXSwgdG90YWxQb2ludHNbaSArIDNdLCBhbW91bnQpKTtcblx0XHRcdFx0YW1vdW50ICs9IHN0ZXA7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGktLTtcblx0XHRjYXRtdWxsUm9tLnB1c2goVmVjdG9yMy5jYXRtdWxsUm9tKHRvdGFsUG9pbnRzW2ldLCB0b3RhbFBvaW50c1tpICsgMV0sIHRvdGFsUG9pbnRzW2kgKyAyXSwgdG90YWxQb2ludHNbaSArIDNdLCBhbW91bnQpKTtcblx0fVxuXHRyZXR1cm4gY2F0bXVsbFJvbTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFyZUFBQkJJbnRlcnNlY3RpbmcoYU1pbjogVmVjdG9yMywgYU1heDogVmVjdG9yMywgYk1pbjogVmVjdG9yMywgYk1heDogVmVjdG9yMyk6IGJvb2xlYW4ge1xuXHRyZXR1cm4gKFxuXHRcdGFNaW4ueCA8PSBiTWF4LnggJiZcblx0XHRhTWF4LnggPj0gYk1pbi54ICYmXG5cdFx0YU1pbi55IDw9IGJNYXgueSAmJlxuXHRcdGFNYXgueSA+PSBiTWluLnkgJiZcblx0XHRhTWluLnogPD0gYk1heC56ICYmXG5cdFx0YU1heC56ID49IGJNaW4uelxuXHQpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcmVTcGhlcmVzSW50ZXJzZWN0aW5nKGFQb3M6IFZlY3RvcjMsIGFSYWRpdXM6IG51bWJlciwgYlBvczogVmVjdG9yMywgYlJhZGl1czogbnVtYmVyKTogYm9vbGVhbiB7XG4gIGNvbnN0IHNxRGlzdCA9IFZlY3RvcjMuZGlzdGFuY2VTcXVhcmVkKGFQb3MsIGJQb3MpXG4gIGNvbnN0IHJhZGl1c1N1bSA9IGFSYWRpdXMgKyBiUmFkaXVzXG4gIHJldHVybiBzcURpc3QgPCByYWRpdXNTdW0gKiByYWRpdXNTdW1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFyZUFBQkJTcGhlcmVJbnRlcnNlY3RpbmcoYm94TWluOiBWZWN0b3IzLCBib3hNYXg6IFZlY3RvcjMsIHNwaGVyZVBvczogVmVjdG9yMywgc3BoZXJlUmFkaXVzOiBudW1iZXIpOiBib29sZWFuIHtcbiAgbGV0IGRtaW4gPSAwXG5cbiAgaWYgKHNwaGVyZVBvcy54IDwgYm94TWluLngpXG4gICAgZG1pbiArPSAoYm94TWluLnggLSBzcGhlcmVQb3MueCkgKiAoYm94TWluLnggLSBzcGhlcmVQb3MueClcbiAgaWYgKHNwaGVyZVBvcy54ID4gYm94TWF4LngpXG4gICAgZG1pbiArPSAoc3BoZXJlUG9zLnggLSBib3hNYXgueCkgKiAoc3BoZXJlUG9zLnggLSBib3hNYXgueClcbiAgaWYgKHNwaGVyZVBvcy55IDwgYm94TWluLnkpXG4gICAgZG1pbiArPSAoYm94TWluLnkgLSBzcGhlcmVQb3MueSkgKiAoYm94TWluLnkgLSBzcGhlcmVQb3MueSlcbiAgaWYgKHNwaGVyZVBvcy55ID4gYm94TWF4LnkpXG4gICAgZG1pbiArPSAoc3BoZXJlUG9zLnkgLSBib3hNYXgueSkgKiAoc3BoZXJlUG9zLnkgLSBib3hNYXgueSlcbiAgaWYgKHNwaGVyZVBvcy56IDwgYm94TWluLnopXG4gICAgZG1pbiArPSAoYm94TWluLnogLSBzcGhlcmVQb3MueikgKiAoYm94TWluLnogLSBzcGhlcmVQb3MueilcbiAgaWYgKHNwaGVyZVBvcy56ID4gYm94TWF4LnopXG4gICAgZG1pbiArPSAoc3BoZXJlUG9zLnogLSBib3hNYXgueikgKiAoc3BoZXJlUG9zLnogLSBib3hNYXgueilcblxuICByZXR1cm4gZG1pbiA8IHNwaGVyZVJhZGl1cyAqIHNwaGVyZVJhZGl1c1xufVxuIiwgImNvbnN0IFJFR1VMQVJfUFJJT1JJVFkgPSAxMDBlM1xuXG5leHBvcnQgbmFtZXNwYWNlIHByaW9yaXR5IHtcbiAgZXhwb3J0IGNvbnN0IFRpbWVyU3lzdGVtUHJpb3JpdHkgPSBSRUdVTEFSX1BSSU9SSVRZICsgMjU2XG4gIGV4cG9ydCBjb25zdCBUd2VlblN5c3RlbVByaW9yaXR5ID0gUkVHVUxBUl9QUklPUklUWSArIDE5MlxuICBleHBvcnQgY29uc3QgUGVycGV0dWFsTW90aW9uU3lzdGVtUHJpb3JpdHkgPSBSRUdVTEFSX1BSSU9SSVRZICsgMTkyXG4gIGV4cG9ydCBjb25zdCBQYXRoU3lzdGVtUHJpb3JpdHkgPSBSRUdVTEFSX1BSSU9SSVRZICsgMTkyXG4gIGV4cG9ydCBjb25zdCBUcmlnZ2VyU3lzdGVtUHJpb3JpdHkgPSBSRUdVTEFSX1BSSU9SSVRZICsgMTI4XG4gIGV4cG9ydCBjb25zdCBBY3Rpb25TeXN0ZW1Qcmlvcml0eSA9IFJFR1VMQVJfUFJJT1JJVFkgKyA2NFxufVxuIiwgImltcG9ydCB7IGVuZ2luZSwgRW50aXR5LCBJRW5naW5lLCBUcmFuc2Zvcm1UeXBlLCBTY2hlbWFzLCBUcmFuc2Zvcm0gfSBmcm9tICdAZGNsL3Nkay9lY3MnXG5pbXBvcnQgeyBwcmlvcml0eSB9IGZyb20gJy4vcHJpb3JpdHknXG5cbmV4cG9ydCB0eXBlIFRpbWVycyA9IFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZVRpbWVycz5cblxuZXhwb3J0IHR5cGUgQ2FsbGJhY2sgPSAoKSA9PiB2b2lkXG5cbmV4cG9ydCB0eXBlIFRpbWVySWQgPSBudW1iZXJcblxuZnVuY3Rpb24gY3JlYXRlVGltZXJzKHRhcmdldEVuZ2luZTogSUVuZ2luZSkge1xuICB0eXBlIFRpbWVyRGF0YSA9IHtcbiAgICBhY2N1bXVsYXRlZFRpbWU6IG51bWJlcixcbiAgICBpbnRlcnZhbDogbnVtYmVyLFxuICAgIHJlY3VycmVudDogYm9vbGVhbixcbiAgICBjYWxsYmFjazogQ2FsbGJhY2tcbiAgfVxuXG4gIGNvbnN0IHRpbWVyczogTWFwPFRpbWVySWQsIFRpbWVyRGF0YT4gPSBuZXcgTWFwKClcbiAgbGV0IHRpbWVySWRDb3VudGVyID0gMFxuXG4gIGZ1bmN0aW9uIHN5c3RlbShkdDogbnVtYmVyKSB7XG4gICAgbGV0IGRlYWRUaW1lcnMgPSBbXVxuICAgIGxldCBjYWxsYmFja3MgPSBbXVxuXG4gICAgZm9yIChsZXQgW3RpbWVySWQsIHRpbWVyRGF0YV0gb2YgdGltZXJzKSB7XG4gICAgICB0aW1lckRhdGEuYWNjdW11bGF0ZWRUaW1lICs9IDEwMDAgKiBkdFxuICAgICAgaWYgKHRpbWVyRGF0YS5hY2N1bXVsYXRlZFRpbWUgPCB0aW1lckRhdGEuaW50ZXJ2YWwpXG4gICAgICAgIGNvbnRpbnVlXG5cbiAgICAgIGNhbGxiYWNrcy5wdXNoKHRpbWVyRGF0YS5jYWxsYmFjaylcblxuICAgICAgaWYgKHRpbWVyRGF0YS5yZWN1cnJlbnQpIHtcbiAgICAgICAgdGltZXJEYXRhLmFjY3VtdWxhdGVkVGltZSAtPSBNYXRoLmZsb29yKHRpbWVyRGF0YS5hY2N1bXVsYXRlZFRpbWUgLyB0aW1lckRhdGEuaW50ZXJ2YWwpICogdGltZXJEYXRhLmludGVydmFsXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWFkVGltZXJzLnB1c2godGltZXJJZClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGxldCB0aW1lcklkIG9mIGRlYWRUaW1lcnMpXG4gICAgICB0aW1lcnMuZGVsZXRlKHRpbWVySWQpXG4gICAgXG4gICAgZm9yIChsZXQgY2FsbGJhY2sgb2YgY2FsbGJhY2tzKVxuICAgICAgY2FsbGJhY2soKVxuICB9XG5cbiAgdGFyZ2V0RW5naW5lLmFkZFN5c3RlbShzeXN0ZW0sIHByaW9yaXR5LlRpbWVyU3lzdGVtUHJpb3JpdHkpXG5cbiAgcmV0dXJuIHtcbiAgICBzZXRUaW1lb3V0KGNhbGxiYWNrOiBDYWxsYmFjaywgbWlsbGlzZWNvbmRzOiBudW1iZXIpOiBUaW1lcklkIHtcbiAgICAgIGxldCB0aW1lcklkID0gdGltZXJJZENvdW50ZXIrK1xuICAgICAgdGltZXJzLnNldCh0aW1lcklkLCB7Y2FsbGJhY2s6IGNhbGxiYWNrLCBpbnRlcnZhbDogbWlsbGlzZWNvbmRzLCByZWN1cnJlbnQ6IGZhbHNlLCBhY2N1bXVsYXRlZFRpbWU6IDB9KVxuICAgICAgcmV0dXJuIHRpbWVySWRcbiAgICB9LFxuICAgIGNsZWFyVGltZW91dCh0aW1lcjogVGltZXJJZCkge1xuICAgICAgdGltZXJzLmRlbGV0ZSh0aW1lcilcbiAgICB9LFxuICAgIHNldEludGVydmFsKGNhbGxiYWNrOiBDYWxsYmFjaywgbWlsbGlzZWNvbmRzOiBudW1iZXIpOiBUaW1lcklkIHtcbiAgICAgIGxldCB0aW1lcklkID0gdGltZXJJZENvdW50ZXIrK1xuICAgICAgdGltZXJzLnNldCh0aW1lcklkLCB7Y2FsbGJhY2s6IGNhbGxiYWNrLCBpbnRlcnZhbDogbWlsbGlzZWNvbmRzLCByZWN1cnJlbnQ6IHRydWUsIGFjY3VtdWxhdGVkVGltZTogMH0pXG4gICAgICByZXR1cm4gdGltZXJJZFxuICAgIH0sXG4gICAgY2xlYXJJbnRlcnZhbCh0aW1lcjogVGltZXJJZCkge1xuICAgICAgdGltZXJzLmRlbGV0ZSh0aW1lcilcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHRpbWVycyA9IGNyZWF0ZVRpbWVycyhlbmdpbmUpXG4iLCAiaW1wb3J0IHsgZW5naW5lLCBFbnRpdHksIEVudGl0eVN0YXRlLCBJRW5naW5lLCBTY2hlbWFzIH0gZnJvbSAnQGRjbC9zZGsvZWNzJ1xuaW1wb3J0IHsgdGltZXJzLCBUaW1lcnMgfSBmcm9tICcuL3RpbWVyJztcblxuZXhwb3J0IGVudW0gVG9nZ2xlU3RhdGUge1xuICBPZmYgPSAwLFxuICBPbiA9IDFcbn1cblxuZXhwb3J0IHR5cGUgVG9nZ2xlQ2FsbGJhY2sgPSAoc3RhdGU6IFRvZ2dsZVN0YXRlKSA9PiB2b2lkXG5cbmV4cG9ydCB0eXBlIFRvZ2dsZXMgPSBSZXR1cm5UeXBlPHR5cGVvZiBjcmVhdGVUb2dnbGVzPlxuXG5mdW5jdGlvbiBjcmVhdGVUb2dnbGVzKHRhcmdldEVuZ2luZTogSUVuZ2luZSwgdGltZXJzOiBUaW1lcnMpIHtcbiAgY29uc3QgVG9nZ2xlID0gdGFyZ2V0RW5naW5lLmRlZmluZUNvbXBvbmVudCgnZGNsLnV0aWxzLlRvZ2dsZScsIHtcbiAgICBzdGF0ZTogU2NoZW1hcy5FbnVtTnVtYmVyKFRvZ2dsZVN0YXRlLCBUb2dnbGVTdGF0ZS5PZmYpXG4gIH0pXG5cbiAgbGV0IHRvZ2dsZXM6IE1hcDxFbnRpdHksIFRvZ2dsZUNhbGxiYWNrIHwgdW5kZWZpbmVkPiA9IG5ldyBNYXAoKTtcblxuICB0aW1lcnMuc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkge1xuICAgIGZvciAoY29uc3QgZW50aXR5IG9mIHRvZ2dsZXMua2V5cygpKSB7XG4gICAgICBpZiAodGFyZ2V0RW5naW5lLmdldEVudGl0eVN0YXRlKGVudGl0eSkgPT0gRW50aXR5U3RhdGUuUmVtb3ZlZCB8fCAhVG9nZ2xlLmhhcyhlbnRpdHkpKSB7XG4gICAgICAgIHRvZ2dsZXMuZGVsZXRlKGVudGl0eSlcbiAgICAgIH1cbiAgICB9XG4gIH0sIDUwMDApXG5cbiAgcmV0dXJuIHtcbiAgICBhZGRUb2dnbGUoZW50aXR5OiBFbnRpdHksIHN0YXRlOiBUb2dnbGVTdGF0ZSwgY2FsbGJhY2s/OiBUb2dnbGVDYWxsYmFjaykge1xuICAgICAgdG9nZ2xlcy5zZXQoZW50aXR5LCBjYWxsYmFjaylcbiAgICAgIFRvZ2dsZS5jcmVhdGVPclJlcGxhY2UoZW50aXR5LCB7c3RhdGU6IHN0YXRlfSlcbiAgICB9LFxuICAgIHJlbW92ZVRvZ2dsZShlbnRpdHk6IEVudGl0eSkge1xuICAgICAgdG9nZ2xlcy5kZWxldGUoZW50aXR5KVxuICAgICAgVG9nZ2xlLmRlbGV0ZUZyb20oZW50aXR5KVxuICAgIH0sXG4gICAgc2V0Q2FsbGJhY2soZW50aXR5OiBFbnRpdHksIGNhbGxiYWNrPzogVG9nZ2xlQ2FsbGJhY2spIHtcbiAgICAgIHRvZ2dsZXMuc2V0KGVudGl0eSwgY2FsbGJhY2spXG4gICAgfSxcbiAgICBzZXQoZW50aXR5OiBFbnRpdHksIHN0YXRlOiBUb2dnbGVTdGF0ZSkge1xuICAgICAgY29uc3Qgb2xkU3RhdGUgPSBUb2dnbGUuZ2V0KGVudGl0eSkuc3RhdGVcbiAgICAgIGlmIChvbGRTdGF0ZSAhPSBzdGF0ZSkge1xuICAgICAgICBUb2dnbGUuZ2V0TXV0YWJsZShlbnRpdHkpLnN0YXRlID0gc3RhdGVcbiAgICAgICAgY29uc3QgY2FsbGJhY2sgPSB0b2dnbGVzLmdldChlbnRpdHkpXG4gICAgICAgIGlmIChjYWxsYmFjaylcbiAgICAgICAgICBjYWxsYmFjayhzdGF0ZSlcbiAgICAgIH1cbiAgICB9LFxuICAgIGZsaXAoZW50aXR5OiBFbnRpdHkpIHtcbiAgICAgIHRoaXMuc2V0KGVudGl0eSwgMSAtIFRvZ2dsZS5nZXQoZW50aXR5KS5zdGF0ZSkgICAgICBcbiAgICB9LFxuICAgIGlzT24oZW50aXR5OiBFbnRpdHkpIHtcbiAgICAgIHJldHVybiBUb2dnbGUuZ2V0KGVudGl0eSkuc3RhdGUgPT0gVG9nZ2xlU3RhdGUuT25cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHRvZ2dsZXMgPSBjcmVhdGVUb2dnbGVzKGVuZ2luZSwgdGltZXJzKVxuIiwgImltcG9ydCB7IGVuZ2luZSwgRW50aXR5LCBJRW5naW5lLCBUcmFuc2Zvcm1UeXBlLCBTY2hlbWFzLCBUcmFuc2Zvcm0sIEVudGl0eVN0YXRlIH0gZnJvbSAnQGRjbC9zZGsvZWNzJ1xuaW1wb3J0IHsgU2NhbGFyLCBWZWN0b3IzLCBRdWF0ZXJuaW9uIH0gZnJvbSAnQGRjbC9zZGsvbWF0aCdcbmltcG9ydCB7IEludGVycG9sYXRpb25UeXBlLCBpbnRlcnBvbGF0ZSB9IGZyb20gJy4vbWF0aCdcbmltcG9ydCB7IHByaW9yaXR5IH0gZnJvbSAnLi9wcmlvcml0eSdcblxuZXhwb3J0IHR5cGUgT25GaW5pc2hDYWxsYmFjayA9ICgpID0+IHZvaWRcblxuZXhwb3J0IHR5cGUgVHdlZW5zID0gUmV0dXJuVHlwZTx0eXBlb2YgY3JlYXRlVHdlZW5zPlxuXG5mdW5jdGlvbiBjcmVhdGVUd2VlbnModGFyZ2V0RW5naW5lOiBJRW5naW5lKSB7XG4gIGNvbnN0IFZlY3RvcjNUd2VlblNjaGVtYSA9IHtcbiAgICBzdGFydDogU2NoZW1hcy5WZWN0b3IzLFxuICAgIGVuZDogU2NoZW1hcy5WZWN0b3IzLFxuICAgIGludGVycG9sYXRpb25UeXBlOiBTY2hlbWFzLkVudW1TdHJpbmcoSW50ZXJwb2xhdGlvblR5cGUsIEludGVycG9sYXRpb25UeXBlLkxJTkVBUiksXG4gICAgc3BlZWQ6IFNjaGVtYXMuRmxvYXQsXG4gICAgbm9ybWFsaXplZFRpbWU6IFNjaGVtYXMuRmxvYXRcbiAgfVxuICBjb25zdCBQb3NpdGlvblR3ZWVuID0gdGFyZ2V0RW5naW5lLmRlZmluZUNvbXBvbmVudCgnZGNsLnV0aWxzLlBvc2l0aW9uVHdlZW4nLCBWZWN0b3IzVHdlZW5TY2hlbWEpXG4gIGNvbnN0IFNjYWxlVHdlZW4gPSB0YXJnZXRFbmdpbmUuZGVmaW5lQ29tcG9uZW50KCdkY2wudXRpbHMuU2NhbGVUd2VlbicsIFZlY3RvcjNUd2VlblNjaGVtYSlcbiAgY29uc3QgUm90YXRpb25Ud2VlbiA9IHRhcmdldEVuZ2luZS5kZWZpbmVDb21wb25lbnQoJ2RjbC51dGlscy5Sb3RhdGlvblR3ZWVuJywge1xuICAgIHN0YXJ0OiBTY2hlbWFzLlF1YXRlcm5pb24sXG4gICAgZW5kOiBTY2hlbWFzLlF1YXRlcm5pb24sXG4gICAgaW50ZXJwb2xhdGlvblR5cGU6IFNjaGVtYXMuRW51bVN0cmluZyhJbnRlcnBvbGF0aW9uVHlwZSwgSW50ZXJwb2xhdGlvblR5cGUuTElORUFSKSxcbiAgICBzcGVlZDogU2NoZW1hcy5GbG9hdCxcbiAgICBub3JtYWxpemVkVGltZTogU2NoZW1hcy5GbG9hdFxuICB9KVxuXG4gIHR5cGUgRmluaXNoQ2FsbGJhY2tNYXAgPSBNYXA8RW50aXR5LCBPbkZpbmlzaENhbGxiYWNrIHwgdW5kZWZpbmVkPlxuXG4gIGNvbnN0IHBvc2l0aW9uRmluaXNoQ2JzOiBGaW5pc2hDYWxsYmFja01hcCA9IG5ldyBNYXAoKVxuICBjb25zdCByb3RhdGlvbkZpbmlzaENiczogRmluaXNoQ2FsbGJhY2tNYXAgPSBuZXcgTWFwKClcbiAgY29uc3Qgc2NhbGVGaW5pc2hDYnM6IEZpbmlzaENhbGxiYWNrTWFwID0gbmV3IE1hcCgpXG5cbiAgZnVuY3Rpb24gbWFrZVN5c3RlbShcbiAgICB0d2VlblR5cGU6IHR5cGVvZiBQb3NpdGlvblR3ZWVuIHwgdHlwZW9mIFJvdGF0aW9uVHdlZW4sXG4gICAgY2FsbGJhY2tzOiBGaW5pc2hDYWxsYmFja01hcCxcbiAgICB0cmFuc2Zvcm1lcjogKHRyYW5zZm9ybTogVHJhbnNmb3JtVHlwZSwgc3RhcnQ6IGFueSwgZW5kOiBhbnksIGxlcnBUaW1lOiBudW1iZXIpID0+IHZvaWQsXG4gICkge1xuICAgIHJldHVybiBmdW5jdGlvbiBzeXN0ZW0oZHQ6IG51bWJlcikge1xuICAgICAgY29uc3QgZGVhZFR3ZWVucyA9IFtdXG5cbiAgICAgIGZvciAoY29uc3QgZW50aXR5IG9mIGNhbGxiYWNrcy5rZXlzKCkpIHtcbiAgICAgICAgaWYgKHRhcmdldEVuZ2luZS5nZXRFbnRpdHlTdGF0ZShlbnRpdHkpID09IEVudGl0eVN0YXRlLlJlbW92ZWQgfHwgIXR3ZWVuVHlwZS5oYXMoZW50aXR5KSkge1xuICAgICAgICAgIGNhbGxiYWNrcy5kZWxldGUoZW50aXR5KVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0d2VlbiA9IHR3ZWVuVHlwZS5nZXRNdXRhYmxlKGVudGl0eSlcbiAgICAgICAgdHdlZW4ubm9ybWFsaXplZFRpbWUgPSBTY2FsYXIuY2xhbXAodHdlZW4ubm9ybWFsaXplZFRpbWUgKyBkdCAqIHR3ZWVuLnNwZWVkLCAwLCAxKVxuICAgICAgICBjb25zdCBsZXJwVGltZSA9IGludGVycG9sYXRlKHR3ZWVuLmludGVycG9sYXRpb25UeXBlLCB0d2Vlbi5ub3JtYWxpemVkVGltZSlcblxuICAgICAgICB0cmFuc2Zvcm1lcihUcmFuc2Zvcm0uZ2V0TXV0YWJsZShlbnRpdHkpLCB0d2Vlbi5zdGFydCwgdHdlZW4uZW5kLCBsZXJwVGltZSlcblxuICAgICAgICBpZiAodHdlZW4ubm9ybWFsaXplZFRpbWUgPj0gMSlcbiAgICAgICAgICBkZWFkVHdlZW5zLnB1c2goZW50aXR5KVxuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGVudGl0eSBvZiBkZWFkVHdlZW5zKSB7XG4gICAgICAgIGNvbnN0IGNhbGxiYWNrID0gY2FsbGJhY2tzLmdldChlbnRpdHkpXG4gICAgICAgIHR3ZWVuVHlwZS5kZWxldGVGcm9tKGVudGl0eSlcbiAgICAgICAgY2FsbGJhY2tzLmRlbGV0ZShlbnRpdHkpXG4gICAgICAgIGlmIChjYWxsYmFjaylcbiAgICAgICAgICBjYWxsYmFjaygpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gbWFrZVN0b3AodHdlZW5UeXBlOiB0eXBlb2YgUG9zaXRpb25Ud2VlbiB8IHR5cGVvZiBSb3RhdGlvblR3ZWVuLCBjYWxsYmFja3M6IEZpbmlzaENhbGxiYWNrTWFwKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGVudGl0eTogRW50aXR5KSB7XG4gICAgICB0d2VlblR5cGUuZGVsZXRlRnJvbShlbnRpdHkpXG4gICAgICBjYWxsYmFja3MuZGVsZXRlKGVudGl0eSlcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBtYWtlU3RhcnQ8Vj4odHdlZW5UeXBlOiBhbnksIGNhbGxiYWNrczogRmluaXNoQ2FsbGJhY2tNYXApIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oXG4gICAgICBlbnRpdHk6IEVudGl0eSxcbiAgICAgIHN0YXJ0OiBWLFxuICAgICAgZW5kOiBWLFxuICAgICAgZHVyYXRpb246IG51bWJlcixcbiAgICAgIGludGVycG9sYXRpb25UeXBlOiBJbnRlcnBvbGF0aW9uVHlwZSA9IEludGVycG9sYXRpb25UeXBlLkxJTkVBUixcbiAgICAgIG9uRmluaXNoPzogT25GaW5pc2hDYWxsYmFja1xuICAgICkge1xuICAgICAgY2FsbGJhY2tzLnNldChlbnRpdHksIG9uRmluaXNoKVxuICAgICAgdHdlZW5UeXBlLmNyZWF0ZU9yUmVwbGFjZShlbnRpdHksIHtcbiAgICAgICAgc3RhcnQ6IHN0YXJ0LFxuICAgICAgICBlbmQ6IGVuZCxcbiAgICAgICAgc3BlZWQ6IGR1cmF0aW9uID09IDAgPyAwIDogMSAvIGR1cmF0aW9uLFxuICAgICAgICBpbnRlcnBvbGF0aW9uVHlwZTogaW50ZXJwb2xhdGlvblR5cGUsXG4gICAgICAgIG5vcm1hbGl6ZWRUaW1lOiBkdXJhdGlvbiA9PSAwID8gMSA6IDBcbiAgICAgIH0pICAgICAgXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gbWFrZUdldE9uRmluaXNoQ2FsbGJhY2soY2FsbGJhY2tzOiBGaW5pc2hDYWxsYmFja01hcCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoZW50aXR5OiBFbnRpdHkpIHtcbiAgICAgIGlmICghY2FsbGJhY2tzLmhhcyhlbnRpdHkpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVudGl0eSAke2VudGl0eX0gaXMgbm90IHJlZ2lzdGVyZWQgd2l0aCB0d2VlbnMgc3lzdGVtYClcbiAgICAgIHJldHVybiBjYWxsYmFja3MuZ2V0KGVudGl0eSlcbiAgICB9XG4gIH1cblxuICB0YXJnZXRFbmdpbmUuYWRkU3lzdGVtKG1ha2VTeXN0ZW0oUG9zaXRpb25Ud2VlbiwgcG9zaXRpb25GaW5pc2hDYnMsIGZ1bmN0aW9uKHRyYW5zZm9ybSwgc3RhcnQsIGVuZCwgdGltZSkge1xuICAgIHRyYW5zZm9ybS5wb3NpdGlvbiA9IFZlY3RvcjMubGVycChzdGFydCwgZW5kLCB0aW1lKVxuICB9KSwgcHJpb3JpdHkuVHdlZW5TeXN0ZW1Qcmlvcml0eSlcbiAgdGFyZ2V0RW5naW5lLmFkZFN5c3RlbShtYWtlU3lzdGVtKFJvdGF0aW9uVHdlZW4sIHJvdGF0aW9uRmluaXNoQ2JzLCBmdW5jdGlvbih0cmFuc2Zvcm0sIHN0YXJ0LCBlbmQsIHRpbWUpIHtcbiAgICB0cmFuc2Zvcm0ucm90YXRpb24gPSBRdWF0ZXJuaW9uLnNsZXJwKHN0YXJ0LCBlbmQsIHRpbWUpXG4gIH0pLCBwcmlvcml0eS5Ud2VlblN5c3RlbVByaW9yaXR5KVxuICB0YXJnZXRFbmdpbmUuYWRkU3lzdGVtKG1ha2VTeXN0ZW0oU2NhbGVUd2Vlbiwgc2NhbGVGaW5pc2hDYnMsIGZ1bmN0aW9uKHRyYW5zZm9ybSwgc3RhcnQsIGVuZCwgdGltZSkge1xuICAgIHRyYW5zZm9ybS5zY2FsZSA9IFZlY3RvcjMubGVycChzdGFydCwgZW5kLCB0aW1lKVxuICB9KSwgcHJpb3JpdHkuVHdlZW5TeXN0ZW1Qcmlvcml0eSlcblxuICByZXR1cm4ge1xuICAgIHN0YXJ0VHJhbnNsYXRpb246IG1ha2VTdGFydDxWZWN0b3IzPihQb3NpdGlvblR3ZWVuLCBwb3NpdGlvbkZpbmlzaENicyksXG4gICAgc3RvcFRyYW5zbGF0aW9uOiBtYWtlU3RvcChQb3NpdGlvblR3ZWVuLCBwb3NpdGlvbkZpbmlzaENicyksXG4gICAgc3RhcnRSb3RhdGlvbjogbWFrZVN0YXJ0PFF1YXRlcm5pb24+KFJvdGF0aW9uVHdlZW4sIHJvdGF0aW9uRmluaXNoQ2JzKSxcbiAgICBzdG9wUm90YXRpb246IG1ha2VTdG9wKFJvdGF0aW9uVHdlZW4sIHJvdGF0aW9uRmluaXNoQ2JzKSxcbiAgICBzdGFydFNjYWxpbmc6IG1ha2VTdGFydDxWZWN0b3IzPihTY2FsZVR3ZWVuLCBzY2FsZUZpbmlzaENicyksXG4gICAgc3RvcFNjYWxpbmc6IG1ha2VTdG9wKFNjYWxlVHdlZW4sIHNjYWxlRmluaXNoQ2JzKSxcbiAgICBnZXRUcmFuc2xhdGlvbk9uRmluaXNoQ2FsbGJhY2s6IG1ha2VHZXRPbkZpbmlzaENhbGxiYWNrKHBvc2l0aW9uRmluaXNoQ2JzKSxcbiAgICBnZXRSb3RhdGlvbk9uRmluaXNoQ2FsbGJhY2s6IG1ha2VHZXRPbkZpbmlzaENhbGxiYWNrKHJvdGF0aW9uRmluaXNoQ2JzKSxcbiAgICBnZXRTY2FsaW5nT25GaW5pc2hDYWxsYmFjazogbWFrZUdldE9uRmluaXNoQ2FsbGJhY2soc2NhbGVGaW5pc2hDYnMpXG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHR3ZWVucyA9IGNyZWF0ZVR3ZWVucyhlbmdpbmUpXG4iLCAiaW1wb3J0IHsgZW5naW5lLCBFbnRpdHksIElFbmdpbmUsIFNjaGVtYXMsIFRyYW5zZm9ybSB9IGZyb20gJ0BkY2wvc2RrL2VjcydcbmltcG9ydCB7IFF1YXRlcm5pb24gfSBmcm9tICdAZGNsL3Nkay9tYXRoJ1xuaW1wb3J0IHsgcHJpb3JpdHkgfSBmcm9tICcuL3ByaW9yaXR5J1xuXG5leHBvcnQgdHlwZSBQZXJwZXR1YWxNb3Rpb25zID0gUmV0dXJuVHlwZTx0eXBlb2YgY3JlYXRlUGVycGV0dWFsTW90aW9ucz5cblxuZnVuY3Rpb24gY3JlYXRlUGVycGV0dWFsTW90aW9ucyh0YXJnZXRFbmdpbmU6IElFbmdpbmUpIHtcbiAgY29uc3QgUGVycGV0dWFsUm90YXRpb24gPSB0YXJnZXRFbmdpbmUuZGVmaW5lQ29tcG9uZW50KCdkY2wudXRpbHMuUGVycGV0dWFsUm90YXRpb24nLCB7XG4gICAgdmVsb2NpdHk6IFNjaGVtYXMuUXVhdGVybmlvblxuICB9KVxuXG4gIGZ1bmN0aW9uIHN5c3RlbShkdDogbnVtYmVyKSB7XG4gICAgZm9yIChjb25zdCBbZW50aXR5LCByb3RhdGlvbl0gb2YgdGFyZ2V0RW5naW5lLmdldEVudGl0aWVzV2l0aChQZXJwZXR1YWxSb3RhdGlvbiwgVHJhbnNmb3JtKSkge1xuICAgICAgY29uc3Qgcm90YXRpb25EZWx0YSA9IFF1YXRlcm5pb24uc2xlcnAoUXVhdGVybmlvbi5JZGVudGl0eSgpLCByb3RhdGlvbi52ZWxvY2l0eSwgZHQpXG4gICAgICBjb25zdCB0cmFuc2Zvcm0gPSBUcmFuc2Zvcm0uZ2V0TXV0YWJsZShlbnRpdHkpXG4gICAgICB0cmFuc2Zvcm0ucm90YXRpb24gPSBRdWF0ZXJuaW9uLm5vcm1hbGl6ZShRdWF0ZXJuaW9uLm11bHRpcGx5KHRyYW5zZm9ybS5yb3RhdGlvbiwgcm90YXRpb25EZWx0YSkpXG4gICAgfVxuICB9XG5cbiAgdGFyZ2V0RW5naW5lLmFkZFN5c3RlbShzeXN0ZW0sIHByaW9yaXR5LlBlcnBldHVhbE1vdGlvblN5c3RlbVByaW9yaXR5KVxuXG4gIHJldHVybiB7XG4gICAgc3RhcnRSb3RhdGlvbihlbnRpdHk6IEVudGl0eSwgdmVsb2NpdHk6IFF1YXRlcm5pb24pIHtcbiAgICAgIFBlcnBldHVhbFJvdGF0aW9uLmNyZWF0ZU9yUmVwbGFjZShlbnRpdHksIHt2ZWxvY2l0eTogdmVsb2NpdHl9KVxuICAgIH0sXG4gICAgc3RvcFJvdGF0aW9uKGVudGl0eTogRW50aXR5KSB7XG4gICAgICBQZXJwZXR1YWxSb3RhdGlvbi5kZWxldGVGcm9tKGVudGl0eSlcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHBlcnBldHVhbE1vdGlvbnMgPSBjcmVhdGVQZXJwZXR1YWxNb3Rpb25zKGVuZ2luZSlcbiIsICJpbXBvcnQgeyBlbmdpbmUsIEVudGl0eSwgRW50aXR5U3RhdGUsIElFbmdpbmUsIFNjaGVtYXMsIFRyYW5zZm9ybSB9IGZyb20gJ0BkY2wvc2RrL2VjcydcbmltcG9ydCB7IFNjYWxhciwgVmVjdG9yMywgUXVhdGVybmlvbiB9IGZyb20gJ0BkY2wvc2RrL21hdGgnXG5pbXBvcnQgeyBjcmVhdGVDYXRtdWxsUm9tU3BsaW5lIH0gZnJvbSAnLi9tYXRoJ1xuaW1wb3J0IHsgcHJpb3JpdHkgfSBmcm9tICcuL3ByaW9yaXR5J1xuXG5leHBvcnQgdHlwZSBQYXRocyA9IFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZVBhdGhzPlxuXG5leHBvcnQgdHlwZSBPbkZpbmlzaENhbGxiYWNrID0gKCkgPT4gdm9pZFxuZXhwb3J0IHR5cGUgT25Qb2ludFJlYWNoZWRDYWxsYmFjayA9IChwb2ludEluZGV4OiBudW1iZXIsIHBvaW50OiBWZWN0b3IzLCBuZXh0UG9pbnQ6IFZlY3RvcjMpID0+IHZvaWRcblxuZnVuY3Rpb24gY3JlYXRlUGF0aHModGFyZ2V0RW5naW5lOiBJRW5naW5lKSB7XG4gIGNvbnN0IEZvbGxvd1BhdGggPSB0YXJnZXRFbmdpbmUuZGVmaW5lQ29tcG9uZW50KCdkY2wudXRpbHMuRm9sbG93UGF0aCcsIHtcbiAgICBwb2ludHM6IFNjaGVtYXMuQXJyYXkoU2NoZW1hcy5WZWN0b3IzKSxcbiAgICBmYWNlRGlyZWN0aW9uOiBTY2hlbWFzLkJvb2xlYW4sXG4gICAgc3BlZWQ6IFNjaGVtYXMuTnVtYmVyLFxuICAgIG5vcm1hbGl6ZWRUaW1lOiBTY2hlbWFzLk51bWJlcixcbiAgICBjdXJyZW50SW5kZXg6IFNjaGVtYXMuTnVtYmVyLFxuICAgIHNlZ21lbnRUaW1lczogU2NoZW1hcy5BcnJheShTY2hlbWFzLk51bWJlciksXG4gICAgY3VydmVTZWdtZW50Q291bnQ6IFNjaGVtYXMuTnVtYmVyXG4gIH0pXG5cbiAgdHlwZSBGaW5pc2hDYWxsYmFja01hcCA9IE1hcDxFbnRpdHksIE9uRmluaXNoQ2FsbGJhY2sgfCB1bmRlZmluZWQ+XG4gIHR5cGUgT25Qb2ludFJlYWNoZWRDYWxsYmFja01hcCA9IE1hcDxFbnRpdHksIE9uUG9pbnRSZWFjaGVkQ2FsbGJhY2sgfCB1bmRlZmluZWQ+XG5cbiAgY29uc3QgZmluaXNoQ2JzOiBGaW5pc2hDYWxsYmFja01hcCA9IG5ldyBNYXAoKVxuICBjb25zdCBwb2ludFJlYWNoZWRDYnM6IE9uUG9pbnRSZWFjaGVkQ2FsbGJhY2tNYXAgPSBuZXcgTWFwKClcblxuICBmdW5jdGlvbiB1bnJlZ2lzdGVyRW50aXR5KGVudGl0eTogRW50aXR5KSB7XG4gICAgZmluaXNoQ2JzLmRlbGV0ZShlbnRpdHkpXG4gICAgcG9pbnRSZWFjaGVkQ2JzLmRlbGV0ZShlbnRpdHkpXG4gICAgRm9sbG93UGF0aC5kZWxldGVGcm9tKGVudGl0eSlcbiAgfVxuXG4gIGZ1bmN0aW9uIHN5c3RlbShkdDogbnVtYmVyKSB7XG4gICAgY29uc3QgZGVhZFBhdGhzID0gW11cbiAgICBjb25zdCBwb2ludFJlYWNoZWRQYXRocyA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IGVudGl0eSBvZiBmaW5pc2hDYnMua2V5cygpKSB7XG4gICAgICBpZiAodGFyZ2V0RW5naW5lLmdldEVudGl0eVN0YXRlKGVudGl0eSkgPT0gRW50aXR5U3RhdGUuUmVtb3ZlZCB8fCAhRm9sbG93UGF0aC5oYXMoZW50aXR5KSkge1xuICAgICAgICB1bnJlZ2lzdGVyRW50aXR5KGVudGl0eSlcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgdHJhbnNmb3JtID0gVHJhbnNmb3JtLmdldE11dGFibGUoZW50aXR5KVxuICAgICAgY29uc3QgcGF0aCA9IEZvbGxvd1BhdGguZ2V0TXV0YWJsZShlbnRpdHkpXG4gICAgICBwYXRoLm5vcm1hbGl6ZWRUaW1lID0gU2NhbGFyLmNsYW1wKHBhdGgubm9ybWFsaXplZFRpbWUgKyBkdCAqIHBhdGguc3BlZWQsIDAsIDEpXG4gICAgICBpZiAocGF0aC5ub3JtYWxpemVkVGltZSA+PSAxKVxuICAgICAgICBkZWFkUGF0aHMucHVzaChlbnRpdHkpXG5cbiAgICAgIHdoaWxlIChcbiAgICAgICAgcGF0aC5ub3JtYWxpemVkVGltZSA+PSBwYXRoLnNlZ21lbnRUaW1lc1twYXRoLmN1cnJlbnRJbmRleF0gJiZcbiAgICAgICAgcGF0aC5jdXJyZW50SW5kZXggPCBwYXRoLnBvaW50cy5sZW5ndGggLSAxXG4gICAgICApIHtcbiAgICAgICAgaWYgKHBhdGguZmFjZURpcmVjdGlvbikge1xuICAgICAgICAgIGNvbnN0IGRpcmVjdGlvbiA9IFZlY3RvcjMuc3VidHJhY3QocGF0aC5wb2ludHNbcGF0aC5jdXJyZW50SW5kZXggKyAxXSwgcGF0aC5wb2ludHNbcGF0aC5jdXJyZW50SW5kZXhdKVxuICAgICAgICAgIHRyYW5zZm9ybS5yb3RhdGlvbiA9IFF1YXRlcm5pb24ubG9va1JvdGF0aW9uKGRpcmVjdGlvbilcbiAgICAgICAgfVxuICAgICAgICBpZiAocGF0aC5jdXJyZW50SW5kZXggPiAwICYmIHBhdGguY3VycmVudEluZGV4ICUgcGF0aC5jdXJ2ZVNlZ21lbnRDb3VudCA9PSAwKSB7XG4gICAgICAgICAgY29uc3QgcG9pbnRJbmRleCA9IHBhdGguY3VycmVudEluZGV4IC8gcGF0aC5jdXJ2ZVNlZ21lbnRDb3VudFxuICAgICAgICAgIGNvbnN0IHBvaW50Q29vcmRzID0gcGF0aC5wb2ludHNbcGF0aC5jdXJyZW50SW5kZXhdXG4gICAgICAgICAgY29uc3QgbmV4dFBvaW50Q29vcmRzID0gcGF0aC5wb2ludHNbcGF0aC5jdXJyZW50SW5kZXggKyBwYXRoLmN1cnZlU2VnbWVudENvdW50XVxuICAgICAgICAgIHBvaW50UmVhY2hlZFBhdGhzLnB1c2goe2VudGl0eTogZW50aXR5LCBpbmRleDogcG9pbnRJbmRleCwgY29vcmRzOiBwb2ludENvb3JkcywgbmV4dENvb3JkczogbmV4dFBvaW50Q29vcmRzfSlcbiAgICAgICAgfVxuICAgICAgICBwYXRoLmN1cnJlbnRJbmRleCArPSAxXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRpbWVEaWZmID0gcGF0aC5zZWdtZW50VGltZXNbcGF0aC5jdXJyZW50SW5kZXhdIC0gcGF0aC5zZWdtZW50VGltZXNbcGF0aC5jdXJyZW50SW5kZXggLSAxXVxuICAgICAgY29uc3QgY29lZiA9IChwYXRoLnNlZ21lbnRUaW1lc1twYXRoLmN1cnJlbnRJbmRleF0gLSBwYXRoLm5vcm1hbGl6ZWRUaW1lKSAvIHRpbWVEaWZmXG4gICAgICB0cmFuc2Zvcm0ucG9zaXRpb24gPSBWZWN0b3IzLmxlcnAocGF0aC5wb2ludHNbcGF0aC5jdXJyZW50SW5kZXhdLCBwYXRoLnBvaW50c1twYXRoLmN1cnJlbnRJbmRleCAtIDFdLCBjb2VmKVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgcG9pbnRSZWFjaGVkIG9mIHBvaW50UmVhY2hlZFBhdGhzKSB7XG4gICAgICBjb25zdCBjYWxsYmFjayA9IHBvaW50UmVhY2hlZENicy5nZXQocG9pbnRSZWFjaGVkLmVudGl0eSlcbiAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICBjYWxsYmFjayhwb2ludFJlYWNoZWQuaW5kZXgsIHBvaW50UmVhY2hlZC5jb29yZHMsIHBvaW50UmVhY2hlZC5uZXh0Q29vcmRzKVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgZW50aXR5IG9mIGRlYWRQYXRocykge1xuICAgICAgY29uc3QgY2FsbGJhY2sgPSBmaW5pc2hDYnMuZ2V0KGVudGl0eSlcbiAgICAgIHVucmVnaXN0ZXJFbnRpdHkoZW50aXR5KVxuICAgICAgaWYgKGNhbGxiYWNrKVxuICAgICAgICBjYWxsYmFjaygpXG4gICAgfVxuICB9XG5cbiAgdGFyZ2V0RW5naW5lLmFkZFN5c3RlbShzeXN0ZW0sIHByaW9yaXR5LlBhdGhTeXN0ZW1Qcmlvcml0eSlcblxuICBmdW5jdGlvbiBzdGFydFBhdGgoXG4gICAgZW50aXR5OiBFbnRpdHksXG4gICAgcG9pbnRzOiBWZWN0b3IzW10sXG4gICAgZHVyYXRpb246IG51bWJlcixcbiAgICBmYWNlRGlyZWN0aW9uPzogYm9vbGVhbixcbiAgICBjdXJ2ZVNlZ21lbnRDb3VudD86IG51bWJlcixcbiAgICBvbkZpbmlzaENhbGxiYWNrPzogT25GaW5pc2hDYWxsYmFjayxcbiAgICBvblBvaW50UmVhY2hlZENhbGxiYWNrPzogT25Qb2ludFJlYWNoZWRDYWxsYmFja1xuICApIHtcbiAgICBpZiAocG9pbnRzLmxlbmd0aCA8IDIpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0F0IGxlYXN0IDIgcG9pbnRzIGFyZSByZXF1aXJlZCB0byBmb3JtIGEgcGF0aC4nKVxuXG4gICAgaWYgKGR1cmF0aW9uID09IDApXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhdGggZHVyYXRpb24gbXVzdCBub3QgYmUgemVybycpXG5cbiAgICBpZiAoY3VydmVTZWdtZW50Q291bnQpIHtcbiAgICAgIGNvbnN0IGxvb3AgPSBWZWN0b3IzLmVxdWFscyhwb2ludHNbMF0sIHBvaW50c1twb2ludHMubGVuZ3RoIC0gMV0pXG4gICAgICBpZiAobG9vcCkge1xuICAgICAgICBwb2ludHMucG9wKClcbiAgICAgICAgcG9pbnRzLnVuc2hpZnQocG9pbnRzLnBvcCgpISlcbiAgICAgIH1cbiAgICAgIHBvaW50cyA9IGNyZWF0ZUNhdG11bGxSb21TcGxpbmUocG9pbnRzLCBjdXJ2ZVNlZ21lbnRDb3VudCwgbG9vcClcbiAgICB9IGVsc2Uge1xuICAgICAgY3VydmVTZWdtZW50Q291bnQgPSAxXG4gICAgfVxuXG4gICAgZmluaXNoQ2JzLnNldChlbnRpdHksIG9uRmluaXNoQ2FsbGJhY2spXG4gICAgcG9pbnRSZWFjaGVkQ2JzLnNldChlbnRpdHksIG9uUG9pbnRSZWFjaGVkQ2FsbGJhY2spXG5cbiAgICBsZXQgdG90YWxMZW5ndGggPSAwXG4gICAgY29uc3Qgc2VnbWVudExlbmd0aHMgPSBbXVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgbGV0IHNxRGlzdCA9IFZlY3RvcjMuZGlzdGFuY2UocG9pbnRzW2ldLCBwb2ludHNbaSArIDFdKVxuICAgICAgdG90YWxMZW5ndGggKz0gc3FEaXN0XG4gICAgICBzZWdtZW50TGVuZ3Rocy5wdXNoKHNxRGlzdClcbiAgICB9XG5cbiAgICBjb25zdCBzZWdtZW50VGltZXMgPSBbMF1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlZ21lbnRMZW5ndGhzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBzZWdtZW50VGltZXMucHVzaChzZWdtZW50TGVuZ3Roc1tpXSAvIHRvdGFsTGVuZ3RoICsgc2VnbWVudFRpbWVzW2ldKVxuICAgIH1cblxuICAgIEZvbGxvd1BhdGguY3JlYXRlT3JSZXBsYWNlKGVudGl0eSwge1xuICAgICAgcG9pbnRzOiBwb2ludHMsXG4gICAgICBzZWdtZW50VGltZXM6IHNlZ21lbnRUaW1lcyxcbiAgICAgIGN1cnZlU2VnbWVudENvdW50OiBjdXJ2ZVNlZ21lbnRDb3VudCxcbiAgICAgIHNwZWVkOiAxIC8gZHVyYXRpb24sXG4gICAgICBub3JtYWxpemVkVGltZTogMCxcbiAgICAgIGN1cnJlbnRJbmRleDogMCxcbiAgICAgIGZhY2VEaXJlY3Rpb246IGZhY2VEaXJlY3Rpb25cbiAgICB9KVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBzdGFydFN0cmFpZ2h0UGF0aChcbiAgICAgIGVudGl0eTogRW50aXR5LFxuICAgICAgcG9pbnRzOiBWZWN0b3IzW10sXG4gICAgICBkdXJhdGlvbjogbnVtYmVyLFxuICAgICAgZmFjZURpcmVjdGlvbj86IGJvb2xlYW4sXG4gICAgICBvbkZpbmlzaENhbGxiYWNrPzogT25GaW5pc2hDYWxsYmFjayxcbiAgICAgIG9uUG9pbnRSZWFjaGVkQ2FsbGJhY2s/OiBPblBvaW50UmVhY2hlZENhbGxiYWNrXG4gICAgKSB7XG4gICAgICByZXR1cm4gc3RhcnRQYXRoKGVudGl0eSwgcG9pbnRzLCBkdXJhdGlvbiwgZmFjZURpcmVjdGlvbiwgMCwgb25GaW5pc2hDYWxsYmFjaywgb25Qb2ludFJlYWNoZWRDYWxsYmFjaylcbiAgICB9LFxuICAgIHN0YXJ0U21vb3RoUGF0aChcbiAgICAgIGVudGl0eTogRW50aXR5LFxuICAgICAgcG9pbnRzOiBWZWN0b3IzW10sXG4gICAgICBkdXJhdGlvbjogbnVtYmVyLFxuICAgICAgc2VnbWVudENvdW50OiBudW1iZXIsXG4gICAgICBmYWNlRGlyZWN0aW9uPzogYm9vbGVhbixcbiAgICAgIG9uRmluaXNoQ2FsbGJhY2s/OiBPbkZpbmlzaENhbGxiYWNrLFxuICAgICAgb25Qb2ludFJlYWNoZWRDYWxsYmFjaz86IE9uUG9pbnRSZWFjaGVkQ2FsbGJhY2tcbiAgICApIHtcbiAgICAgIGlmIChzZWdtZW50Q291bnQgPCAyIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKHNlZ21lbnRDb3VudCkpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgc2VnbWVudENvdW50IG11c3QgYmUgYW4gaW50ZWdlciB0aGF0IGlzIGdyZWF0ZXIgdGhhbiAyLCBnb3Q6ICR7c2VnbWVudENvdW50fWApXG4gICAgICByZXR1cm4gc3RhcnRQYXRoKGVudGl0eSwgcG9pbnRzLCBkdXJhdGlvbiwgZmFjZURpcmVjdGlvbiwgc2VnbWVudENvdW50LCBvbkZpbmlzaENhbGxiYWNrLCBvblBvaW50UmVhY2hlZENhbGxiYWNrKVxuICAgIH0sXG4gICAgc3RvcFBhdGgoZW50aXR5OiBFbnRpdHkpIHtcbiAgICAgIHVucmVnaXN0ZXJFbnRpdHkoZW50aXR5KVxuICAgIH0sXG4gICAgZ2V0T25GaW5pc2hDYWxsYmFjayhlbnRpdHk6IEVudGl0eSkge1xuICAgICAgaWYgKCFmaW5pc2hDYnMuaGFzKGVudGl0eSkpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRW50aXR5ICR7ZW50aXR5fSBpcyBub3QgcmVnaXN0ZXJlZCBpbiB0cmlnZ2VycyBzeXN0ZW1gKVxuICAgICAgcmV0dXJuIGZpbmlzaENicy5nZXQoZW50aXR5KVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgcGF0aHMgPSBjcmVhdGVQYXRocyhlbmdpbmUpXG4iLCAiaW1wb3J0IHsgZW5naW5lLCBFbnRpdHksIElFbmdpbmUsIE1lc2hSZW5kZXJlciwgU2NoZW1hcywgVHJhbnNmb3JtLCBNYXRlcmlhbCwgRGVlcFJlYWRvbmx5LCBFbnRpdHlTdGF0ZSB9IGZyb20gJ0BkY2wvc2RrL2VjcydcbmltcG9ydCB7IFZlY3RvcjMsIENvbG9yNCwgQ29sb3IzIH0gZnJvbSAnQGRjbC9zZGsvbWF0aCdcbmltcG9ydCB7IGdldFdvcmxkUG9zaXRpb24sIGdldFdvcmxkUm90YXRpb24sIGFyZUFBQkJJbnRlcnNlY3RpbmcsIGFyZUFBQkJTcGhlcmVJbnRlcnNlY3RpbmcsIGFyZVNwaGVyZXNJbnRlcnNlY3RpbmcgfSBmcm9tICcuL21hdGgnXG5pbXBvcnQgeyBwcmlvcml0eSB9IGZyb20gJy4vcHJpb3JpdHknXG5cbmV4cG9ydCBjb25zdCBMQVlFUl8xID0gMVxuZXhwb3J0IGNvbnN0IExBWUVSXzIgPSAyXG5leHBvcnQgY29uc3QgTEFZRVJfMyA9IDRcbmV4cG9ydCBjb25zdCBMQVlFUl80ID0gOFxuZXhwb3J0IGNvbnN0IExBWUVSXzUgPSAxNlxuZXhwb3J0IGNvbnN0IExBWUVSXzYgPSAzMlxuZXhwb3J0IGNvbnN0IExBWUVSXzcgPSA2NFxuZXhwb3J0IGNvbnN0IExBWUVSXzggPSAxMjhcbmV4cG9ydCBjb25zdCBBTExfTEFZRVJTID0gMjU1XG5leHBvcnQgY29uc3QgTk9fTEFZRVJTID0gMFxuXG5leHBvcnQgbGV0IFBMQVlFUl9MQVlFUl9JRCA9IExBWUVSXzFcblxuZXhwb3J0IHR5cGUgVHJpZ2dlckJveEFyZWFTcGVjID0ge1xuXHR0eXBlOiAnYm94Jyxcblx0cG9zaXRpb24/OiBWZWN0b3IzLFxuXHRzY2FsZT86IFZlY3RvcjNcbn1cbmV4cG9ydCB0eXBlIFRyaWdnZXJTcGhlcmVBcmVhU3BlYyA9IHtcblx0dHlwZTogJ3NwaGVyZScsXG5cdHBvc2l0aW9uPzogVmVjdG9yMyxcblx0cmFkaXVzPzogbnVtYmVyXG59XG5leHBvcnQgdHlwZSBUcmlnZ2VyQXJlYVNwZWMgPSBUcmlnZ2VyQm94QXJlYVNwZWMgfCBUcmlnZ2VyU3BoZXJlQXJlYVNwZWNcblxuZXhwb3J0IHR5cGUgVHJpZ2dlckJveEFyZWEgPSB7XG5cdHBvc2l0aW9uOiBWZWN0b3IzLFxuXHRzY2FsZTogVmVjdG9yM1xufVxuZXhwb3J0IHR5cGUgVHJpZ2dlclNwaGVyZUFyZWEgPSB7XG5cdHBvc2l0aW9uOiBWZWN0b3IzLFxuXHRyYWRpdXM6IG51bWJlclxufVxuZXhwb3J0IHR5cGUgVHJpZ2dlckFyZWEgPSB7ICRjYXNlOiAnYm94JywgdmFsdWU6IFRyaWdnZXJCb3hBcmVhIH0gfCB7ICRjYXNlOiAnc3BoZXJlJywgdmFsdWU6IFRyaWdnZXJTcGhlcmVBcmVhIH1cblxudHlwZSBPblRyaWdnZXJFbnRlckNhbGxiYWNrID0gKGVudGl0eTogRW50aXR5KSA9PiB2b2lkXG50eXBlIE9uVHJpZ2dlckV4aXRDYWxsYmFjayA9IChlbnRpdHk6IEVudGl0eSkgPT4gdm9pZFxuXG5leHBvcnQgdHlwZSBUcmlnZ2VycyA9IFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZVRyaWdnZXJzPlxuXG5mdW5jdGlvbiBjcmVhdGVUcmlnZ2Vycyh0YXJnZXRFbmdpbmU6IElFbmdpbmUpIHtcblx0Y29uc3QgVHJpZ2dlciA9IGVuZ2luZS5kZWZpbmVDb21wb25lbnQoJ2RjbC51dGlscy5UcmlnZ2VyJywge1xuXHRcdGFjdGl2ZTogU2NoZW1hcy5Cb29sZWFuLFxuXHRcdGxheWVyTWFzazogU2NoZW1hcy5JbnQsXG5cdFx0dHJpZ2dlcmVkQnlNYXNrOiBTY2hlbWFzLkludCxcblx0XHRhcmVhczogU2NoZW1hcy5BcnJheShTY2hlbWFzLk9uZU9mKHtcblx0XHRcdGJveDogU2NoZW1hcy5NYXAoe1xuXHRcdFx0XHRwb3NpdGlvbjogU2NoZW1hcy5WZWN0b3IzLFxuXHRcdFx0XHRzY2FsZTogU2NoZW1hcy5WZWN0b3IzXG5cdFx0XHR9KSxcblx0XHRcdHNwaGVyZTogU2NoZW1hcy5NYXAoe1xuXHRcdFx0XHRwb3NpdGlvbjogU2NoZW1hcy5WZWN0b3IzLFxuXHRcdFx0XHRyYWRpdXM6IFNjaGVtYXMuTnVtYmVyXG5cdFx0XHR9KVxuXHRcdH0pKSxcblx0XHRkZWJ1Z0NvbG9yOiBTY2hlbWFzLkNvbG9yM1xuXHR9KVxuXG5cdHR5cGUgVHJpZ2dlclR5cGUgPSB7XG5cdFx0YWN0aXZlOiBib29sZWFuLFxuXHRcdGxheWVyTWFzazogbnVtYmVyLFxuXHRcdHRyaWdnZXJlZEJ5TWFzazogbnVtYmVyLFxuXHRcdGFyZWFzOiBBcnJheTxUcmlnZ2VyQXJlYT4sXG5cdFx0ZGVidWdDb2xvcjogQ29sb3IzXG5cdH1cblxuXHRjb25zdCB0cmlnZ2VyRW50ZXJDYnM6IE1hcDxFbnRpdHksIE9uVHJpZ2dlckVudGVyQ2FsbGJhY2sgfCB1bmRlZmluZWQ+ID0gbmV3IE1hcCgpXG5cdGNvbnN0IHRyaWdnZXJFeGl0Q2JzOiBNYXA8RW50aXR5LCBPblRyaWdnZXJFeGl0Q2FsbGJhY2sgfCB1bmRlZmluZWQ+ID0gbmV3IE1hcCgpXG5cblx0bGV0IGRlYnVnRHJhdyA9IGZhbHNlXG5cdGNvbnN0IGFjdGl2ZUNvbGxpc2lvbnM6IE1hcDxFbnRpdHksIFNldDxFbnRpdHk+PiA9IG5ldyBNYXAoKVxuXHRjb25zdCBkZWJ1Z0VudGl0aWVzOiBNYXA8RW50aXR5LCBBcnJheTxFbnRpdHk+PiA9IG5ldyBNYXAoKVxuXG5cdGZ1bmN0aW9uIHVwZGF0ZURlYnVnRHJhdyhlbmFibGVkOiBib29sZWFuKSB7XG5cdFx0aWYgKCFlbmFibGVkKVxuXHRcdFx0cmV0dXJuXG5cblx0XHRmb3IgKGNvbnN0IFtlbnRpdHksIHRyaWdnZXJdIG9mIHRhcmdldEVuZ2luZS5nZXRFbnRpdGllc1dpdGgoVHJpZ2dlciwgVHJhbnNmb3JtKSkge1xuXHRcdFx0bGV0IHNoYXBlcyA9IGRlYnVnRW50aXRpZXMuZ2V0KGVudGl0eSkhXG5cblx0XHRcdGNvbnN0IGFyZWFDb3VudCA9IHRyaWdnZXIuYXJlYXMubGVuZ3RoXG5cdFx0XHR3aGlsZSAoc2hhcGVzLmxlbmd0aCA+IGFyZWFDb3VudCkge1xuXHRcdFx0XHR0YXJnZXRFbmdpbmUucmVtb3ZlRW50aXR5KHNoYXBlcy5wb3AoKSEpXG5cdFx0XHR9XG5cdFx0XHR3aGlsZSAoc2hhcGVzLmxlbmd0aCA8IGFyZWFDb3VudCkge1xuXHRcdFx0XHRzaGFwZXMucHVzaCh0YXJnZXRFbmdpbmUuYWRkRW50aXR5KCkpXG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IHdvcmxkUG9zaXRpb24gPSBnZXRXb3JsZFBvc2l0aW9uKGVudGl0eSlcblx0XHRcdGNvbnN0IHdvcmxkUm90YXRpb24gPSBnZXRXb3JsZFJvdGF0aW9uKGVudGl0eSlcblxuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBhcmVhQ291bnQ7ICsraSkge1xuXHRcdFx0XHRjb25zdCBzaGFwZVNwZWMgPSB0cmlnZ2VyLmFyZWFzW2ldXG5cdFx0XHRcdGNvbnN0IHNoYXBlID0gc2hhcGVzW2ldXG5cblx0XHRcdFx0bGV0IHNjYWxlXG5cdFx0XHRcdGlmIChzaGFwZVNwZWMuJGNhc2UgPT0gJ2JveCcpIHtcblx0XHRcdFx0XHRzY2FsZSA9IHNoYXBlU3BlYy52YWx1ZS5zY2FsZVxuXHRcdFx0XHRcdE1lc2hSZW5kZXJlci5zZXRCb3goc2hhcGUpXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y29uc3QgcmFkaXVzID0gc2hhcGVTcGVjLnZhbHVlLnJhZGl1c1xuXHRcdFx0XHRcdHNjYWxlID0geyB4OiByYWRpdXMsIHk6IHJhZGl1cywgejogcmFkaXVzIH1cblx0XHRcdFx0XHRNZXNoUmVuZGVyZXIuc2V0U3BoZXJlKHNoYXBlKVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0VHJhbnNmb3JtLmNyZWF0ZU9yUmVwbGFjZShzaGFwZSwge1xuXHRcdFx0XHRcdHBvc2l0aW9uOiBWZWN0b3IzLmFkZCh3b3JsZFBvc2l0aW9uLCBWZWN0b3IzLnJvdGF0ZShzaGFwZVNwZWMudmFsdWUucG9zaXRpb24sIHdvcmxkUm90YXRpb24pKSxcblx0XHRcdFx0XHRzY2FsZTogc2NhbGVcblx0XHRcdFx0fSlcblxuXHRcdFx0XHRjb25zdCBjb2xvciA9IHRyaWdnZXIuYWN0aXZlID8gdHJpZ2dlci5kZWJ1Z0NvbG9yIDogQ29sb3IzLkJsYWNrKClcblx0XHRcdFx0TWF0ZXJpYWwuc2V0UGJyTWF0ZXJpYWwoc2hhcGUsIHsgYWxiZWRvQ29sb3I6IENvbG9yNC5mcm9tSW50cygyNTUgKiBjb2xvci5yLCAyNTUgKiBjb2xvci5nLCAyNTUgKiBjb2xvci5iLCA3NSkgfSlcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRmdW5jdGlvbiBhcmVUcmlnZ2Vyc0ludGVyc2VjdGluZyhcblx0XHRzaGFwZVdvcmxkUG9zMDogQXJyYXk8VmVjdG9yMz4sXG5cdFx0dDA6IERlZXBSZWFkb25seTxUcmlnZ2VyVHlwZT4sXG5cdFx0c2hhcGVXb3JsZFBvczE6IEFycmF5PFZlY3RvcjM+LFxuXHRcdHQxOiBEZWVwUmVhZG9ubHk8VHJpZ2dlclR5cGU+XG5cdCk6IGJvb2xlYW4ge1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdDAuYXJlYXMubGVuZ3RoOyArK2kpIHtcblx0XHRcdGNvbnN0IHQwV29ybGQgPSBzaGFwZVdvcmxkUG9zMFtpXVxuXHRcdFx0Y29uc3QgdDBBcmVhID0gdDAuYXJlYXNbaV1cblxuXHRcdFx0aWYgKHQwQXJlYS4kY2FzZSA9PSAnYm94Jykge1xuXHRcdFx0XHRjb25zdCB0MEJveCA9IHQwQXJlYS52YWx1ZVxuXHRcdFx0XHRjb25zdCB0ME1pbiA9IFZlY3RvcjMuc3VidHJhY3QodDBXb3JsZCwgVmVjdG9yMy5zY2FsZSh0MEJveC5zY2FsZSwgMC41KSlcblx0XHRcdFx0Y29uc3QgdDBNYXggPSBWZWN0b3IzLmFkZCh0ME1pbiwgdDBCb3guc2NhbGUpXG5cblx0XHRcdFx0Zm9yIChsZXQgaiA9IDA7IGogPCB0MS5hcmVhcy5sZW5ndGg7ICsraikge1xuXHRcdFx0XHRcdGNvbnN0IHQxV29ybGQgPSBzaGFwZVdvcmxkUG9zMVtqXVxuXHRcdFx0XHRcdGNvbnN0IHQxQXJlYSA9IHQxLmFyZWFzW2pdXG5cblx0XHRcdFx0XHRpZiAodDFBcmVhLiRjYXNlID09ICdib3gnKSB7XG5cdFx0XHRcdFx0XHRjb25zdCB0MUJveCA9IHQxQXJlYS52YWx1ZVxuXHRcdFx0XHRcdFx0Y29uc3QgdDFNaW4gPSBWZWN0b3IzLnN1YnRyYWN0KHQxV29ybGQsIFZlY3RvcjMuc2NhbGUodDFCb3guc2NhbGUsIDAuNSkpXG5cdFx0XHRcdFx0XHRjb25zdCB0MU1heCA9IFZlY3RvcjMuYWRkKHQxTWluLCB0MUJveC5zY2FsZSlcblxuXHRcdFx0XHRcdFx0aWYgKGFyZUFBQkJJbnRlcnNlY3RpbmcodDBNaW4sIHQwTWF4LCB0MU1pbiwgdDFNYXgpKVxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZVxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRpZiAoYXJlQUFCQlNwaGVyZUludGVyc2VjdGluZyh0ME1pbiwgdDBNYXgsIHQxV29ybGQsIHQxQXJlYS52YWx1ZS5yYWRpdXMpKVxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgdDBSYWRpdXMgPSB0MEFyZWEudmFsdWUucmFkaXVzXG5cblx0XHRcdFx0Zm9yIChsZXQgaiA9IDA7IGogPCB0MS5hcmVhcy5sZW5ndGg7ICsraikge1xuXHRcdFx0XHRcdGNvbnN0IHQxV29ybGQgPSBzaGFwZVdvcmxkUG9zMVtqXVxuXHRcdFx0XHRcdGNvbnN0IHQxQXJlYSA9IHQxLmFyZWFzW2pdXG5cblx0XHRcdFx0XHRpZiAodDFBcmVhLiRjYXNlID09ICdib3gnKSB7XG5cdFx0XHRcdFx0XHRjb25zdCB0MUJveCA9IHQxQXJlYS52YWx1ZVxuXHRcdFx0XHRcdFx0Y29uc3QgdDFNaW4gPSBWZWN0b3IzLnN1YnRyYWN0KHQxV29ybGQsIFZlY3RvcjMuc2NhbGUodDFCb3guc2NhbGUsIDAuNSkpXG5cdFx0XHRcdFx0XHRjb25zdCB0MU1heCA9IFZlY3RvcjMuYWRkKHQxTWluLCB0MUJveC5zY2FsZSlcblxuXHRcdFx0XHRcdFx0aWYgKGFyZUFBQkJTcGhlcmVJbnRlcnNlY3RpbmcodDFNaW4sIHQxTWF4LCB0MFdvcmxkLCB0MFJhZGl1cykpXG5cdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlXG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGlmIChhcmVTcGhlcmVzSW50ZXJzZWN0aW5nKHQwV29ybGQsIHQwUmFkaXVzLCB0MVdvcmxkLCB0MUFyZWEudmFsdWUucmFkaXVzKSlcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWVcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gZmFsc2Vcblx0fVxuXG5cdGZ1bmN0aW9uIGNvbXB1dGVDb2xsaXNpb25zKGVudGl0eTogRW50aXR5LCBzaGFwZVdvcmxkUG9zOiBNYXA8RW50aXR5LCBBcnJheTxWZWN0b3IzPj4pIHtcblx0XHRsZXQgY29sbGlzaW9uczogU2V0PEVudGl0eT4gPSBFTVBUWV9JTU1VVEFCTEVfU0VUXG5cdFx0Y29uc3QgdHJpZ2dlciA9IFRyaWdnZXIuZ2V0KGVudGl0eSlcblxuXHRcdGlmICghdHJpZ2dlci5hY3RpdmUpXG5cdFx0XHRyZXR1cm4gY29sbGlzaW9uc1xuXG5cblx0XHRpZiAodHJpZ2dlci50cmlnZ2VyZWRCeU1hc2sgPT0gUExBWUVSX0xBWUVSX0lEKSB7XG5cdFx0XHQvLyBjaGVjayBqdXN0IHBsYXllciBcblx0XHRcdGNvbnN0IHBsYXllckVudGl0eSA9IHRhcmdldEVuZ2luZS5QbGF5ZXJFbnRpdHlcblx0XHRcdGNvbnN0IHBsYXllclRyaWdnZXIgPSBUcmlnZ2VyLmdldCh0YXJnZXRFbmdpbmUuUGxheWVyRW50aXR5KVxuXG5cdFx0XHRpZiAocGxheWVyRW50aXR5ID09IGVudGl0eSlcblx0XHRcdFx0cmV0dXJuIGNvbGxpc2lvbnNcblxuXHRcdFx0aWYgKCFwbGF5ZXJUcmlnZ2VyLmFjdGl2ZSlcblx0XHRcdFx0cmV0dXJuIGNvbGxpc2lvbnNcblxuXHRcdFx0aWYgKCEodHJpZ2dlci50cmlnZ2VyZWRCeU1hc2sgJiBwbGF5ZXJUcmlnZ2VyLmxheWVyTWFzaykpXG5cdFx0XHRcdHJldHVybiBjb2xsaXNpb25zXG5cblx0XHRcdGNvbnN0IGludGVyc2VjdGluZyA9IGFyZVRyaWdnZXJzSW50ZXJzZWN0aW5nKHNoYXBlV29ybGRQb3MuZ2V0KGVudGl0eSkhLCB0cmlnZ2VyLCBzaGFwZVdvcmxkUG9zLmdldChwbGF5ZXJFbnRpdHkpISwgcGxheWVyVHJpZ2dlcilcblx0XHRcdGlmIChpbnRlcnNlY3RpbmcpIHtcblx0XHRcdFx0aWYgKGNvbGxpc2lvbnMgPT09IEVNUFRZX0lNTVVUQUJMRV9TRVQpIGNvbGxpc2lvbnMgPSBuZXcgU2V0KClcblx0XHRcdFx0Y29sbGlzaW9ucy5hZGQocGxheWVyRW50aXR5KVxuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBpdGVyYXRlIG92ZXIgZnVsbCBsaXN0IG9mIHRyaWdnZXJzXG5cdFx0XHRmb3IgKGNvbnN0IFtvdGhlckVudGl0eSwgb3RoZXJUcmlnZ2VyXSBvZiB0YXJnZXRFbmdpbmUuZ2V0RW50aXRpZXNXaXRoKFRyaWdnZXIsIFRyYW5zZm9ybSkpIHtcblx0XHRcdFx0aWYgKG90aGVyRW50aXR5ID09IGVudGl0eSlcblx0XHRcdFx0XHRjb250aW51ZVxuXG5cdFx0XHRcdGlmICghb3RoZXJUcmlnZ2VyLmFjdGl2ZSlcblx0XHRcdFx0XHRjb250aW51ZVxuXG5cdFx0XHRcdGlmICghKHRyaWdnZXIudHJpZ2dlcmVkQnlNYXNrICYgb3RoZXJUcmlnZ2VyLmxheWVyTWFzaykpXG5cdFx0XHRcdFx0Y29udGludWVcblxuXHRcdFx0XHRjb25zdCBpbnRlcnNlY3RpbmcgPSBhcmVUcmlnZ2Vyc0ludGVyc2VjdGluZyhzaGFwZVdvcmxkUG9zLmdldChlbnRpdHkpISwgdHJpZ2dlciwgc2hhcGVXb3JsZFBvcy5nZXQob3RoZXJFbnRpdHkpISwgb3RoZXJUcmlnZ2VyKVxuXHRcdFx0XHRpZiAoaW50ZXJzZWN0aW5nKSB7XG5cdFx0XHRcdFx0aWYgKGNvbGxpc2lvbnMgPT09IEVNUFRZX0lNTVVUQUJMRV9TRVQpIGNvbGxpc2lvbnMgPSBuZXcgU2V0KClcblx0XHRcdFx0XHRjb2xsaXNpb25zLmFkZChvdGhlckVudGl0eSlcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXG5cblxuXHRcdHJldHVybiBjb2xsaXNpb25zXG5cdH1cblxuXHRmdW5jdGlvbiB1cGRhdGVDb2xsaXNpb25zKCkge1xuXHRcdGNvbnN0IGNvbGxpc2lvbnNTdGFydGVkID0gW11cblx0XHRjb25zdCBjb2xsaXNpb25zRW5kZWQgPSBbXVxuXHRcdGNvbnN0IHNoYXBlV29ybGRQb3NpdGlvbnM6IE1hcDxFbnRpdHksIEFycmF5PFZlY3RvcjM+PiA9IG5ldyBNYXAoKVxuXG5cdFx0Zm9yIChjb25zdCBlbnRpdHkgb2YgYWN0aXZlQ29sbGlzaW9ucy5rZXlzKCkpIHtcblx0XHRcdGlmICh0YXJnZXRFbmdpbmUuZ2V0RW50aXR5U3RhdGUoZW50aXR5KSA9PSBFbnRpdHlTdGF0ZS5SZW1vdmVkIHx8ICFUcmlnZ2VyLmhhcyhlbnRpdHkpKSB7XG5cdFx0XHRcdGZvciAoY29uc3QgZGVidWdFbnRpdHkgb2YgZGVidWdFbnRpdGllcy5nZXQoZW50aXR5KSEpXG5cdFx0XHRcdFx0dGFyZ2V0RW5naW5lLnJlbW92ZUVudGl0eShkZWJ1Z0VudGl0eSlcblxuXHRcdFx0XHRmb3IgKGNvbnN0IGNvbGxpc2lvbnMgb2YgYWN0aXZlQ29sbGlzaW9ucy52YWx1ZXMoKSkge1xuXHRcdFx0XHRcdGlmIChjb2xsaXNpb25zLmhhcyhlbnRpdHkpKVxuXHRcdFx0XHRcdFx0Y29sbGlzaW9ucy5kZWxldGUoZW50aXR5KVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0ZGVidWdFbnRpdGllcy5kZWxldGUoZW50aXR5KVxuXHRcdFx0XHRhY3RpdmVDb2xsaXNpb25zLmRlbGV0ZShlbnRpdHkpXG5cdFx0XHRcdHRyaWdnZXJFbnRlckNicy5kZWxldGUoZW50aXR5KVxuXHRcdFx0XHR0cmlnZ2VyRXhpdENicy5kZWxldGUoZW50aXR5KVxuXHRcdFx0XHRjb250aW51ZVxuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBwb3NpdGlvbnMgPSBbXVxuXHRcdFx0Y29uc3QgZW50aXR5V29ybGRQb3NpdGlvbiA9IGdldFdvcmxkUG9zaXRpb24oZW50aXR5KVxuXHRcdFx0Y29uc3QgZW50aXR5V29ybGRSb3RhdGlvbiA9IGdldFdvcmxkUm90YXRpb24oZW50aXR5KVxuXHRcdFx0Y29uc3QgdHJpZ2dlciA9IFRyaWdnZXIuZ2V0KGVudGl0eSlcblxuXHRcdFx0Zm9yIChjb25zdCBzaGFwZSBvZiB0cmlnZ2VyLmFyZWFzKSB7XG5cdFx0XHRcdHBvc2l0aW9ucy5wdXNoKFZlY3RvcjMuYWRkKGVudGl0eVdvcmxkUG9zaXRpb24sIFZlY3RvcjMucm90YXRlKHNoYXBlLnZhbHVlLnBvc2l0aW9uLCBlbnRpdHlXb3JsZFJvdGF0aW9uKSkpXG5cdFx0XHR9XG5cdFx0XHRzaGFwZVdvcmxkUG9zaXRpb25zLnNldChlbnRpdHksIHBvc2l0aW9ucylcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGVudGl0eSBvZiBhY3RpdmVDb2xsaXNpb25zLmtleXMoKSkge1xuXHRcdFx0Y29uc3QgbmV3Q29sbGlzaW9ucyA9IGNvbXB1dGVDb2xsaXNpb25zKGVudGl0eSwgc2hhcGVXb3JsZFBvc2l0aW9ucylcblx0XHRcdGNvbnN0IG9sZENvbGxpc2lvbnMgPSBhY3RpdmVDb2xsaXNpb25zLmdldChlbnRpdHkpIVxuXG5cdFx0XHRmb3IgKGNvbnN0IG9sZENvbGxpc2lvbiBvZiBvbGRDb2xsaXNpb25zKSB7XG5cdFx0XHRcdGlmICghbmV3Q29sbGlzaW9ucy5oYXMob2xkQ29sbGlzaW9uKSlcblx0XHRcdFx0XHRjb2xsaXNpb25zRW5kZWQucHVzaChbZW50aXR5LCBvbGRDb2xsaXNpb25dKVxuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKGNvbnN0IG5ld0NvbGxpc2lvbiBvZiBuZXdDb2xsaXNpb25zKSB7XG5cdFx0XHRcdGlmICghb2xkQ29sbGlzaW9ucy5oYXMobmV3Q29sbGlzaW9uKSlcblx0XHRcdFx0XHRjb2xsaXNpb25zU3RhcnRlZC5wdXNoKFtlbnRpdHksIG5ld0NvbGxpc2lvbl0pXG5cdFx0XHR9XG5cblx0XHRcdGFjdGl2ZUNvbGxpc2lvbnMuc2V0KGVudGl0eSwgbmV3Q29sbGlzaW9ucylcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IFtlbnRpdHksIGNvbGxpc2lvbl0gb2YgY29sbGlzaW9uc1N0YXJ0ZWQpIHtcblx0XHRcdGNvbnN0IGNhbGxiYWNrID0gdHJpZ2dlckVudGVyQ2JzLmdldChlbnRpdHkpXG5cdFx0XHRpZiAoY2FsbGJhY2spXG5cdFx0XHRcdGNhbGxiYWNrKGNvbGxpc2lvbilcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IFtlbnRpdHksIGNvbGxpc2lvbl0gb2YgY29sbGlzaW9uc0VuZGVkKSB7XG5cdFx0XHRjb25zdCBjYWxsYmFjayA9IHRyaWdnZXJFeGl0Q2JzLmdldChlbnRpdHkpXG5cdFx0XHRpZiAoY2FsbGJhY2spXG5cdFx0XHRcdGNhbGxiYWNrKGNvbGxpc2lvbilcblx0XHR9XG5cdH1cblxuXHRmdW5jdGlvbiBzeXN0ZW0oZHQ6IG51bWJlcikge1xuXHRcdHVwZGF0ZUNvbGxpc2lvbnMoKVxuXHRcdHVwZGF0ZURlYnVnRHJhdyhkZWJ1Z0RyYXcpXG5cdH1cblxuXHR0YXJnZXRFbmdpbmUuYWRkU3lzdGVtKHN5c3RlbSwgcHJpb3JpdHkuVHJpZ2dlclN5c3RlbVByaW9yaXR5KVxuXG5cdGZ1bmN0aW9uIHRyaWdnZXJBcmVhc0Zyb21TcGVjKGFyZWFzPzogQXJyYXk8VHJpZ2dlckFyZWFTcGVjPikge1xuXHRcdGlmICghYXJlYXMpXG5cdFx0XHRhcmVhcyA9IFt7IHR5cGU6ICdib3gnIH1dXG5cblx0XHRjb25zdCB0cmlnZ2VyQXJlYXM6IEFycmF5PFRyaWdnZXJBcmVhPiA9IFtdXG5cblx0XHRmb3IgKGNvbnN0IGFyZWEgb2YgYXJlYXMpIHtcblx0XHRcdGlmIChhcmVhLnR5cGUgPT0gJ2JveCcpIHtcblx0XHRcdFx0dHJpZ2dlckFyZWFzLnB1c2goe1xuXHRcdFx0XHRcdCRjYXNlOiAnYm94Jyxcblx0XHRcdFx0XHR2YWx1ZToge1xuXHRcdFx0XHRcdFx0cG9zaXRpb246IGFyZWEucG9zaXRpb24gPyBhcmVhLnBvc2l0aW9uIDogVmVjdG9yMy5aZXJvKCksXG5cdFx0XHRcdFx0XHRzY2FsZTogYXJlYS5zY2FsZSA/IGFyZWEuc2NhbGUgOiBWZWN0b3IzLk9uZSgpXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dHJpZ2dlckFyZWFzLnB1c2goe1xuXHRcdFx0XHRcdCRjYXNlOiAnc3BoZXJlJyxcblx0XHRcdFx0XHR2YWx1ZToge1xuXHRcdFx0XHRcdFx0cG9zaXRpb246IGFyZWEucG9zaXRpb24gPyBhcmVhLnBvc2l0aW9uIDogVmVjdG9yMy5aZXJvKCksXG5cdFx0XHRcdFx0XHRyYWRpdXM6IGFyZWEucmFkaXVzID8gYXJlYS5yYWRpdXMgOiAxXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KVxuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gdHJpZ2dlckFyZWFzXG5cdH1cblxuXHRjb25zdCB0cmlnZ2Vyc0ludGVyZmFjZSA9IHtcblx0XHRhZGRUcmlnZ2VyKFxuXHRcdFx0ZW50aXR5OiBFbnRpdHksXG5cdFx0XHRsYXllck1hc2s6IG51bWJlciA9IE5PX0xBWUVSUyxcblx0XHRcdHRyaWdnZXJlZEJ5TWFzazogbnVtYmVyID0gTk9fTEFZRVJTLFxuXHRcdFx0YXJlYXM/OiBBcnJheTxUcmlnZ2VyQXJlYVNwZWM+LFxuXHRcdFx0b25FbnRlckNhbGxiYWNrPzogT25UcmlnZ2VyRW50ZXJDYWxsYmFjayxcblx0XHRcdG9uRXhpdENhbGxiYWNrPzogT25UcmlnZ2VyRXhpdENhbGxiYWNrLFxuXHRcdFx0ZGVidWdDb2xvcj86IENvbG9yM1xuXHRcdCkge1xuXHRcdFx0aWYgKGxheWVyTWFzayA8IDAgfHwgbGF5ZXJNYXNrID4gQUxMX0xBWUVSUyB8fCAhTnVtYmVyLmlzSW50ZWdlcihsYXllck1hc2spKVxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYEJhZCBsYXllck1hc2s6ICR7bGF5ZXJNYXNrfS4gRXhwZWN0ZWQgYSBub24tbmVnYXRpdmUgaW50ZWdlciBubyBncmVhdGVyIHRoYW4gJHtBTExfTEFZRVJTfWApXG5cblx0XHRcdGlmICh0cmlnZ2VyZWRCeU1hc2sgPCAwIHx8IHRyaWdnZXJlZEJ5TWFzayA+IEFMTF9MQVlFUlMgfHwgIU51bWJlci5pc0ludGVnZXIodHJpZ2dlcmVkQnlNYXNrKSlcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBCYWQgdHJpZ2dlcmVkQnlNYXNrOiAke3RyaWdnZXJlZEJ5TWFza30uIEV4cGVjdGVkIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIgbm8gZ3JlYXRlciB0aGFuICR7QUxMX0xBWUVSU31gKVxuXG5cdFx0XHRkZWJ1Z0VudGl0aWVzLnNldChlbnRpdHksIFtdKVxuXHRcdFx0YWN0aXZlQ29sbGlzaW9ucy5zZXQoZW50aXR5LCBuZXcgU2V0KCkpXG5cdFx0XHR0cmlnZ2VyRW50ZXJDYnMuc2V0KGVudGl0eSwgb25FbnRlckNhbGxiYWNrKVxuXHRcdFx0dHJpZ2dlckV4aXRDYnMuc2V0KGVudGl0eSwgb25FeGl0Q2FsbGJhY2spXG5cblx0XHRcdFRyaWdnZXIuY3JlYXRlT3JSZXBsYWNlKGVudGl0eSwge1xuXHRcdFx0XHRhY3RpdmU6IHRydWUsXG5cdFx0XHRcdGxheWVyTWFzazogbGF5ZXJNYXNrLFxuXHRcdFx0XHR0cmlnZ2VyZWRCeU1hc2s6IHRyaWdnZXJlZEJ5TWFzayxcblx0XHRcdFx0YXJlYXM6IHRyaWdnZXJBcmVhc0Zyb21TcGVjKGFyZWFzKSxcblx0XHRcdFx0ZGVidWdDb2xvcjogZGVidWdDb2xvciA/IGRlYnVnQ29sb3IgOiBDb2xvcjMuUmVkKClcblx0XHRcdH0pXG5cdFx0fSxcblx0XHRyZW1vdmVUcmlnZ2VyKGVudGl0eTogRW50aXR5KSB7XG5cdFx0XHRjb25zdCBjb2xsaXNpb25zID0gYWN0aXZlQ29sbGlzaW9ucy5nZXQoZW50aXR5KSFcblx0XHRcdGNvbnN0IGNhbGxiYWNrID0gdHJpZ2dlckV4aXRDYnMuZ2V0KGVudGl0eSlcblxuXHRcdFx0Zm9yIChjb25zdCBkZWJ1Z0VudGl0eSBvZiBkZWJ1Z0VudGl0aWVzLmdldChlbnRpdHkpISlcblx0XHRcdFx0dGFyZ2V0RW5naW5lLnJlbW92ZUVudGl0eShkZWJ1Z0VudGl0eSlcblxuXHRcdFx0ZGVidWdFbnRpdGllcy5kZWxldGUoZW50aXR5KVxuXHRcdFx0YWN0aXZlQ29sbGlzaW9ucy5kZWxldGUoZW50aXR5KVxuXHRcdFx0dHJpZ2dlckVudGVyQ2JzLmRlbGV0ZShlbnRpdHkpXG5cdFx0XHR0cmlnZ2VyRXhpdENicy5kZWxldGUoZW50aXR5KVxuXHRcdFx0VHJpZ2dlci5kZWxldGVGcm9tKGVudGl0eSlcblxuXHRcdFx0Y29uc3QgY29sbGlkaW5nRW50aXRpZXMgPSBbXVxuXHRcdFx0Zm9yIChjb25zdCBbb3RoZXJFbnRpdHksIG90aGVyRW50aXR5Q29sbGlzaW9uc10gb2YgYWN0aXZlQ29sbGlzaW9ucykge1xuXHRcdFx0XHRpZiAob3RoZXJFbnRpdHlDb2xsaXNpb25zLmhhcyhlbnRpdHkpKSB7XG5cdFx0XHRcdFx0b3RoZXJFbnRpdHlDb2xsaXNpb25zLmRlbGV0ZShlbnRpdHkpXG5cdFx0XHRcdFx0Y29sbGlkaW5nRW50aXRpZXMucHVzaChvdGhlckVudGl0eSlcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoY2FsbGJhY2spIHtcblx0XHRcdFx0Zm9yIChjb25zdCBjb2xsaXNpb24gb2YgY29sbGlzaW9ucylcblx0XHRcdFx0XHRjYWxsYmFjayhjb2xsaXNpb24pXG5cdFx0XHR9XG5cblx0XHRcdGZvciAoY29uc3Qgb3RoZXJFbnRpdHkgb2YgY29sbGlkaW5nRW50aXRpZXMpIHtcblx0XHRcdFx0Y29uc3QgY2FsbGJhY2sgPSB0cmlnZ2VyRXhpdENicy5nZXQob3RoZXJFbnRpdHkpXG5cdFx0XHRcdGlmIChjYWxsYmFjaylcblx0XHRcdFx0XHRjYWxsYmFjayhlbnRpdHkpXG5cdFx0XHR9XG5cdFx0fSxcblx0XHRvbmVUaW1lVHJpZ2dlcihcblx0XHRcdGVudGl0eTogRW50aXR5LFxuXHRcdFx0bGF5ZXJNYXNrOiBudW1iZXIgPSBOT19MQVlFUlMsXG5cdFx0XHR0cmlnZ2VyZWRCeU1hc2s6IG51bWJlciA9IE5PX0xBWUVSUyxcblx0XHRcdGFyZWFzPzogQXJyYXk8VHJpZ2dlckFyZWFTcGVjPixcblx0XHRcdG9uRW50ZXJDYWxsYmFjaz86IE9uVHJpZ2dlckVudGVyQ2FsbGJhY2ssXG5cdFx0XHRkZWJ1Z0NvbG9yPzogQ29sb3IzXG5cdFx0KSB7XG5cdFx0XHR0aGlzLmFkZFRyaWdnZXIoZW50aXR5LCBsYXllck1hc2ssIHRyaWdnZXJlZEJ5TWFzaywgYXJlYXMsIGZ1bmN0aW9uIChlKSB7XG5cdFx0XHRcdHRyaWdnZXJzLnJlbW92ZVRyaWdnZXIoZW50aXR5KVxuXHRcdFx0XHRpZiAob25FbnRlckNhbGxiYWNrKVxuXHRcdFx0XHRcdG9uRW50ZXJDYWxsYmFjayhlKVxuXHRcdFx0fSwgdW5kZWZpbmVkLCBkZWJ1Z0NvbG9yKVxuXHRcdH0sXG5cdFx0ZW5hYmxlVHJpZ2dlcihlbnRpdHk6IEVudGl0eSwgZW5hYmxlZDogYm9vbGVhbikge1xuXHRcdFx0VHJpZ2dlci5nZXRNdXRhYmxlKGVudGl0eSkuYWN0aXZlID0gZW5hYmxlZFxuXHRcdH0sXG5cdFx0aXNUcmlnZ2VyRW5hYmxlZChlbnRpdHk6IEVudGl0eSkge1xuXHRcdFx0cmV0dXJuIFRyaWdnZXIuZ2V0KGVudGl0eSkuYWN0aXZlXG5cdFx0fSxcblx0XHRnZXRMYXllck1hc2soZW50aXR5OiBFbnRpdHkpIHtcblx0XHRcdHJldHVybiBUcmlnZ2VyLmdldChlbnRpdHkpLmxheWVyTWFza1xuXHRcdH0sXG5cdFx0c2V0TGF5ZXJNYXNrKGVudGl0eTogRW50aXR5LCBtYXNrOiBudW1iZXIpIHtcblx0XHRcdGlmIChtYXNrIDwgMCB8fCBtYXNrID4gQUxMX0xBWUVSUyB8fCAhTnVtYmVyLmlzSW50ZWdlcihtYXNrKSlcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBCYWQgbGF5ZXJNYXNrOiAke21hc2t9LiBFeHBlY3RlZCBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIG5vIGdyZWF0ZXIgdGhhbiAke0FMTF9MQVlFUlN9YClcblx0XHRcdFRyaWdnZXIuZ2V0TXV0YWJsZShlbnRpdHkpLmxheWVyTWFzayA9IG1hc2tcblx0XHR9LFxuXHRcdGdldFRyaWdnZXJlZEJ5TWFzayhlbnRpdHk6IEVudGl0eSkge1xuXHRcdFx0cmV0dXJuIFRyaWdnZXIuZ2V0KGVudGl0eSkudHJpZ2dlcmVkQnlNYXNrXG5cdFx0fSxcblx0XHRzZXRUcmlnZ2VyZWRCeU1hc2soZW50aXR5OiBFbnRpdHksIG1hc2s6IG51bWJlcikge1xuXHRcdFx0aWYgKG1hc2sgPCAwIHx8IG1hc2sgPiBBTExfTEFZRVJTIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKG1hc2spKVxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYEJhZCBsYXllck1hc2s6ICR7bWFza30uIEV4cGVjdGVkIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIgbm8gZ3JlYXRlciB0aGFuICR7QUxMX0xBWUVSU31gKVxuXHRcdFx0VHJpZ2dlci5nZXRNdXRhYmxlKGVudGl0eSkudHJpZ2dlcmVkQnlNYXNrID0gbWFza1xuXHRcdH0sXG5cdFx0Z2V0QXJlYXMoZW50aXR5OiBFbnRpdHkpIHtcblx0XHRcdHJldHVybiBUcmlnZ2VyLmdldChlbnRpdHkpLmFyZWFzXG5cdFx0fSxcblx0XHRzZXRBcmVhcyhlbnRpdHk6IEVudGl0eSwgYXJlYXM6IEFycmF5PFRyaWdnZXJBcmVhU3BlYz4pIHtcblx0XHRcdFRyaWdnZXIuZ2V0TXV0YWJsZShlbnRpdHkpLmFyZWFzID0gdHJpZ2dlckFyZWFzRnJvbVNwZWMoYXJlYXMpXG5cdFx0fSxcblx0XHRzZXRPbkVudGVyQ2FsbGJhY2soZW50aXR5OiBFbnRpdHksIGNhbGxiYWNrOiBPblRyaWdnZXJFbnRlckNhbGxiYWNrKSB7XG5cdFx0XHR0cmlnZ2VyRW50ZXJDYnMuc2V0KGVudGl0eSwgY2FsbGJhY2spXG5cdFx0fSxcblx0XHRzZXRPbkV4aXRDYWxsYmFjayhlbnRpdHk6IEVudGl0eSwgY2FsbGJhY2s6IE9uVHJpZ2dlckV4aXRDYWxsYmFjaykge1xuXHRcdFx0dHJpZ2dlckV4aXRDYnMuc2V0KGVudGl0eSwgY2FsbGJhY2spXG5cdFx0fSxcblx0XHRlbmFibGVEZWJ1Z0RyYXcoZW5hYmxlZDogYm9vbGVhbikge1xuXHRcdFx0ZGVidWdEcmF3ID0gZW5hYmxlZFxuXHRcdFx0aWYgKCFlbmFibGVkKSB7XG5cdFx0XHRcdGZvciAoY29uc3Qgc2hhcGVzIG9mIGRlYnVnRW50aXRpZXMudmFsdWVzKCkpIHtcblx0XHRcdFx0XHRmb3IgKGNvbnN0IHNoYXBlIG9mIHNoYXBlcylcblx0XHRcdFx0XHRcdHRhcmdldEVuZ2luZS5yZW1vdmVFbnRpdHkoc2hhcGUpXG5cdFx0XHRcdFx0c2hhcGVzLmxlbmd0aCA9IDBcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0aXNEZWJ1Z0RyYXdFbmFibGVkKCkge1xuXHRcdFx0cmV0dXJuIGRlYnVnRHJhd1xuXHRcdH1cblx0fVxuXG5cdHRyaWdnZXJzSW50ZXJmYWNlLmFkZFRyaWdnZXIoXG5cdFx0dGFyZ2V0RW5naW5lLlBsYXllckVudGl0eSwgUExBWUVSX0xBWUVSX0lELCBOT19MQVlFUlMsXG5cdFx0W3tcblx0XHRcdHR5cGU6ICdib3gnLFxuXHRcdFx0c2NhbGU6IHsgeDogMC42NSwgeTogMS45MiwgejogMC42NSB9LFxuXHRcdFx0cG9zaXRpb246IHsgeDogMCwgeTogMC4xNSwgejogMCB9XG5cdFx0fV0sXG5cdFx0dW5kZWZpbmVkLCB1bmRlZmluZWQsIENvbG9yMy5HcmVlbigpXG5cdClcblxuXHRyZXR1cm4gdHJpZ2dlcnNJbnRlcmZhY2Vcbn1cblxuZXhwb3J0IGNvbnN0IHRyaWdnZXJzID0gY3JlYXRlVHJpZ2dlcnMoZW5naW5lKVxuXG5cbmNvbnN0IEVNUFRZX0lNTVVUQUJMRV9TRVQ6IFNldDxFbnRpdHk+ID0gbmV3IFNldCgpXG5cbkVNUFRZX0lNTVVUQUJMRV9TRVQuYWRkID0gKGVudGl0eTogRW50aXR5KSA9PiB7IGRlYnVnZ2VyOyB0aHJvdyBuZXcgRXJyb3IoXCJFTVBUWV9TRVQgaXMgcmVhZCBvbmx5XCIpIH1cbkVNUFRZX0lNTVVUQUJMRV9TRVQuZGVsZXRlID0gKGVudGl0eTogRW50aXR5KSA9PiB7IHRocm93IG5ldyBFcnJvcihcIkVNUFRZX1NFVCBpcyByZWFkIG9ubHlcIikgfVxuRU1QVFlfSU1NVVRBQkxFX1NFVC5oYXMgPSAoZW50aXR5OiBFbnRpdHkpID0+IHsgcmV0dXJuIGZhbHNlIH1cbiIsICJpbXBvcnQgeyBJRW5naW5lLCBTeXN0ZW1GbiB9IGZyb20gJ0BkY2wvc2RrL2VjcydcbmltcG9ydCB7IHByaW9yaXR5IH0gZnJvbSAnLi9wcmlvcml0eSdcblxuZXhwb3J0IG5hbWVzcGFjZSBhY3Rpb25zIHtcblxuICBleHBvcnQgY2xhc3MgU2VxdWVuY2VSdW5uZXIge1xuICAgIHByaXZhdGUgYmVnaW5TZXF1ZW5jZU5vZGU6IFNlcXVlbmNlTm9kZSB8IG51bGwgPSBudWxsXG4gICAgcHJpdmF0ZSBjdXJyZW50U2VxdWVuY2VOb2RlOiBTZXF1ZW5jZU5vZGUgfCBudWxsID0gbnVsbFxuXG4gICAgcHJpdmF0ZSBlbmdpbmU6IElFbmdpbmVcbiAgICBwcml2YXRlIHN5c3RlbUZuOiBTeXN0ZW1GblxuXG4gICAgcHJpdmF0ZSBydW5uaW5nOiBib29sZWFuID0gZmFsc2VcbiAgICBwcml2YXRlIHN0YXJ0ZWQ6IGJvb2xlYW4gPSBmYWxzZVxuXG4gICAgcHJpdmF0ZSBvbkZpbmlzaENhbGxiYWNrPzogKCkgPT4gdm9pZFxuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICB0YXJnZXRFbmdpbmU6IElFbmdpbmUsXG4gICAgICBzZXF1ZW5jZUJ1aWx0PzogU2VxdWVuY2VCdWlsZGVyLFxuICAgICAgb25GaW5pc2hDYWxsYmFjaz86ICgpID0+IHZvaWRcbiAgICApIHtcbiAgICAgIHRoaXMuZW5naW5lID0gdGFyZ2V0RW5naW5lXG4gICAgICB0aGlzLnN5c3RlbUZuID0gKGR0KSA9PiB7IHRoaXMudXBkYXRlKGR0KSB9XG4gICAgICB0aGlzLmVuZ2luZS5hZGRTeXN0ZW0odGhpcy5zeXN0ZW1GbiwgcHJpb3JpdHkuQWN0aW9uU3lzdGVtUHJpb3JpdHkpXG4gICAgICBpZiAoc2VxdWVuY2VCdWlsdCkge1xuICAgICAgICB0aGlzLnN0YXJ0U2VxdWVuY2Uoc2VxdWVuY2VCdWlsdClcbiAgICAgIH1cbiAgICAgIGlmIChvbkZpbmlzaENhbGxiYWNrKVxuICAgICAgICB0aGlzLnNldE9uRmluaXNoQ2FsbGJhY2sob25GaW5pc2hDYWxsYmFjaylcbiAgICB9XG4gIFxuICAgIHN0YXJ0U2VxdWVuY2Uoc2VxdWVuY2VCdWlsdDogU2VxdWVuY2VCdWlsZGVyKSB7XG4gICAgICB0aGlzLmJlZ2luU2VxdWVuY2VOb2RlID0gc2VxdWVuY2VCdWlsdC5iZWdpblNlcXVlbmNlTm9kZVxuICAgICAgdGhpcy5jdXJyZW50U2VxdWVuY2VOb2RlID0gdGhpcy5iZWdpblNlcXVlbmNlTm9kZVxuICAgICAgdGhpcy5ydW5uaW5nID0gdHJ1ZVxuICAgICAgdGhpcy5zdGFydGVkID0gZmFsc2VcbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgdGhpcy5lbmdpbmUucmVtb3ZlU3lzdGVtKHRoaXMuc3lzdGVtRm4pXG4gICAgfVxuXG4gICAgc2V0T25GaW5pc2hDYWxsYmFjayhvbkZpbmlzaENhbGxiYWNrOiAoKSA9PiB2b2lkKSB7XG4gICAgICB0aGlzLm9uRmluaXNoQ2FsbGJhY2sgPSBvbkZpbmlzaENhbGxiYWNrXG4gICAgfVxuXG4gICAgaXNSdW5uaW5nKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMucnVubmluZ1xuICAgIH1cblxuICAgIHN0b3AoKSB7XG4gICAgICB0aGlzLnJ1bm5pbmcgPSBmYWxzZVxuICAgIH1cblxuICAgIHJlc3VtZSgpIHtcbiAgICAgIGlmICh0aGlzLmJlZ2luU2VxdWVuY2VOb2RlICE9IG51bGwpXG4gICAgICAgIHRoaXMucnVubmluZyA9IHRydWVcbiAgICB9XG5cbiAgICByZXNldCgpIHtcbiAgICAgIHRoaXMuY3VycmVudFNlcXVlbmNlTm9kZSA9IHRoaXMuYmVnaW5TZXF1ZW5jZU5vZGVcbiAgICAgIHRoaXMucnVubmluZyA9IHRydWVcbiAgICAgIHRoaXMuc3RhcnRlZCA9IGZhbHNlXG4gICAgfVxuXG4gICAgZ2V0UnVubmluZ0FjdGlvbigpOiBJQWN0aW9uIHwgbnVsbCB7XG4gICAgICBsZXQgY3VycmVudE5vZGU6IFNlcXVlbmNlTm9kZSB8IG51bGwgPSB0aGlzLmN1cnJlbnRTZXF1ZW5jZU5vZGVcblxuICAgICAgaWYgKHRoaXMuY3VycmVudFNlcXVlbmNlTm9kZSBpbnN0YW5jZW9mIFN1YlNlcXVlbmNlTm9kZSkge1xuICAgICAgICBkbyB7XG4gICAgICAgICAgY3VycmVudE5vZGUgPSAoY3VycmVudE5vZGUgYXMgU3ViU2VxdWVuY2VOb2RlKS5jdXJyZW50SW5uZXJTZXF1ZW5jZVxuICAgICAgICB9IHdoaWxlIChjdXJyZW50Tm9kZSBpbnN0YW5jZW9mIFN1YlNlcXVlbmNlTm9kZSlcbiAgICAgIH1cbiAgICAgIHJldHVybiAoY3VycmVudE5vZGUgYXMgU2VxdWVuY2VOb2RlKS5hY3Rpb25cbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZShkdDogbnVtYmVyKTogdm9pZCB7XG4gICAgICBpZiAoIXRoaXMucnVubmluZylcbiAgICAgICAgcmV0dXJuXG4gICAgICAgIFxuICAgICAgaWYgKCF0aGlzLnN0YXJ0ZWQpIHtcbiAgICAgICAgKHRoaXMuY3VycmVudFNlcXVlbmNlTm9kZSBhcyBTZXF1ZW5jZU5vZGUpLm9uU3RhcnQoKVxuICAgICAgICB0aGlzLnN0YXJ0ZWQgPSB0cnVlXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgIFxuICAgICAgaWYgKCEodGhpcy5jdXJyZW50U2VxdWVuY2VOb2RlIGFzIFNlcXVlbmNlTm9kZSkuaGFzRmluaXNoKCkpIHtcbiAgICAgICAgKHRoaXMuY3VycmVudFNlcXVlbmNlTm9kZSBhcyBTZXF1ZW5jZU5vZGUpLnVwZGF0ZShkdClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgICh0aGlzLmN1cnJlbnRTZXF1ZW5jZU5vZGUgYXMgU2VxdWVuY2VOb2RlKS5vbkZpbmlzaCgpXG4gICAgICB0aGlzLmN1cnJlbnRTZXF1ZW5jZU5vZGUgPSAodGhpcy5jdXJyZW50U2VxdWVuY2VOb2RlIGFzIFNlcXVlbmNlTm9kZSkubmV4dFxuICAgICAgaWYgKHRoaXMuY3VycmVudFNlcXVlbmNlTm9kZSkge1xuICAgICAgICB0aGlzLmN1cnJlbnRTZXF1ZW5jZU5vZGUub25TdGFydCgpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJ1bm5pbmcgPSBmYWxzZVxuICAgICAgICBpZiAodGhpcy5vbkZpbmlzaENhbGxiYWNrKSB0aGlzLm9uRmluaXNoQ2FsbGJhY2soKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGV4cG9ydCBpbnRlcmZhY2UgSUFjdGlvbiB7XG4gICAgb25TdGFydCgpOiB2b2lkXG4gICAgdXBkYXRlKGR0OiBudW1iZXIpOiB2b2lkXG4gICAgb25GaW5pc2goKTogdm9pZFxuICAgIGhhc0ZpbmlzaGVkOiBib29sZWFuXG4gIH1cblxuICBleHBvcnQgY2xhc3MgU2VxdWVuY2VCdWlsZGVyIHtcbiAgICBwcml2YXRlIGN1cnJlbnRTZXF1ZW5jZU5vZGU6IFNlcXVlbmNlTm9kZSB8IG51bGwgPSBudWxsXG4gICAgcHVibGljIGJlZ2luU2VxdWVuY2VOb2RlOiBTZXF1ZW5jZU5vZGUgfCBudWxsID0gbnVsbFxuXG4gICAgcHJpdmF0ZSB3aGlsZU5vZGVTdGFjazogV2hpbGVTZXF1ZW5jZU5vZGVbXSA9IFtdXG5cbiAgICB0aGVuKGFjdGlvbjogSUFjdGlvbik6IFNlcXVlbmNlQnVpbGRlciB7XG4gICAgICBpZiAodGhpcy5jdXJyZW50U2VxdWVuY2VOb2RlID09IG51bGwpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50U2VxdWVuY2VOb2RlID0gbmV3IFNlcXVlbmNlTm9kZSgpXG4gICAgICAgIHRoaXMuY3VycmVudFNlcXVlbmNlTm9kZS5hY3Rpb24gPSBhY3Rpb25cbiAgICAgICAgdGhpcy5iZWdpblNlcXVlbmNlTm9kZSA9IHRoaXMuY3VycmVudFNlcXVlbmNlTm9kZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IG5leHQgPSBuZXcgU2VxdWVuY2VOb2RlKClcbiAgICAgICAgbmV4dC5hY3Rpb24gPSBhY3Rpb25cbiAgICAgICAgdGhpcy5jdXJyZW50U2VxdWVuY2VOb2RlID0gdGhpcy5jdXJyZW50U2VxdWVuY2VOb2RlLnRoZW4obmV4dClcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgaWYoY29uZGl0aW9uOiAoKSA9PiBib29sZWFuKTogU2VxdWVuY2VCdWlsZGVyIHtcbiAgICAgIGxldCBpZlNlcSA9IG5ldyBJZlNlcXVlbmNlTm9kZShjb25kaXRpb24pXG4gICAgICBpZiAodGhpcy5jdXJyZW50U2VxdWVuY2VOb2RlID09IG51bGwpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50U2VxdWVuY2VOb2RlID0gaWZTZXFcbiAgICAgICAgdGhpcy5iZWdpblNlcXVlbmNlTm9kZSA9IGlmU2VxXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmN1cnJlbnRTZXF1ZW5jZU5vZGUgPSB0aGlzLmN1cnJlbnRTZXF1ZW5jZU5vZGUudGhlbihpZlNlcSlcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgZWxzZSgpOiBTZXF1ZW5jZUJ1aWxkZXIge1xuICAgICAgbGV0IHNlcSA9ICh0aGlzLmN1cnJlbnRTZXF1ZW5jZU5vZGUgYXMgU2VxdWVuY2VOb2RlKS5nZXRTZXF1ZW5jZSgpXG4gICAgICBpZiAoc2VxIGluc3RhbmNlb2YgSWZTZXF1ZW5jZU5vZGUpIHtcbiAgICAgICAgc2VxLmNsb3NlZCA9IHRydWVcbiAgICAgICAgbGV0IGVsc2VTZXEgPSBuZXcgRWxzZVNlcXVlbmNlTm9kZShzZXEpXG4gICAgICAgIHRoaXMuY3VycmVudFNlcXVlbmNlTm9kZSA9ICh0aGlzXG4gICAgICAgICAgLmN1cnJlbnRTZXF1ZW5jZU5vZGUgYXMgU2VxdWVuY2VOb2RlKS50aGVuKGVsc2VTZXEpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ0lGIHN0YXRlbWVudCBpcyBuZWVkZWQgdG8gYmUgY2FsbGVkIGJlZm9yZSBFTFNFIHN0YXRlbWVudC4nXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgZW5kSWYoKTogU2VxdWVuY2VCdWlsZGVyIHtcbiAgICAgIGxldCBzZXEgPSAodGhpcy5jdXJyZW50U2VxdWVuY2VOb2RlIGFzIFNlcXVlbmNlTm9kZSkuZ2V0U2VxdWVuY2UoKVxuICAgICAgaWYgKHNlcSBpbnN0YW5jZW9mIElmU2VxdWVuY2VOb2RlIHx8IHNlcSBpbnN0YW5jZW9mIEVsc2VTZXF1ZW5jZU5vZGUpIHtcbiAgICAgICAgc2VxLmNsb3NlZCA9IHRydWVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAnSUYgc3RhdGVtZW50IGlzIG5lZWRlZCB0byBiZSBjYWxsZWQgYmVmb3JlIEVORElGIHN0YXRlbWVudC4nXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgd2hpbGUoY29uZGl0aW9uOiAoKSA9PiBib29sZWFuKTogU2VxdWVuY2VCdWlsZGVyIHtcbiAgICAgIGxldCB3aGlsZVNlcSA9IG5ldyBXaGlsZVNlcXVlbmNlTm9kZShjb25kaXRpb24pXG4gICAgICBpZiAodGhpcy5jdXJyZW50U2VxdWVuY2VOb2RlID09IG51bGwpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50U2VxdWVuY2VOb2RlID0gd2hpbGVTZXFcbiAgICAgICAgdGhpcy5iZWdpblNlcXVlbmNlTm9kZSA9IHdoaWxlU2VxXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmN1cnJlbnRTZXF1ZW5jZU5vZGUgPSB0aGlzLmN1cnJlbnRTZXF1ZW5jZU5vZGUudGhlbih3aGlsZVNlcSlcbiAgICAgIH1cbiAgICAgIHRoaXMud2hpbGVOb2RlU3RhY2sucHVzaCh3aGlsZVNlcSlcbiAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgZW5kV2hpbGUoKTogU2VxdWVuY2VCdWlsZGVyIHtcbiAgICAgIGxldCBzZXEgPSAodGhpcy5jdXJyZW50U2VxdWVuY2VOb2RlIGFzIFNlcXVlbmNlTm9kZSkuZ2V0U2VxdWVuY2UoKVxuICAgICAgaWYgKHNlcSBpbnN0YW5jZW9mIFdoaWxlU2VxdWVuY2VOb2RlKSB7XG4gICAgICAgIHNlcS5jbG9zZWQgPSB0cnVlXG4gICAgICAgIGlmICh0aGlzLndoaWxlTm9kZVN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB0aGlzLndoaWxlTm9kZVN0YWNrLnNwbGljZSh0aGlzLndoaWxlTm9kZVN0YWNrLmxlbmd0aCAtIDEsIDEpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAnV0hJTEUgc3RhdGVtZW50IGlzIG5lZWRlZCB0byBiZSBjYWxsZWQgYmVmb3JlIEVORFdISUxFIHN0YXRlbWVudC4nXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgYnJlYWtXaGlsZSgpOiBTZXF1ZW5jZUJ1aWxkZXIge1xuICAgICAgaWYgKHRoaXMud2hpbGVOb2RlU3RhY2subGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLmN1cnJlbnRTZXF1ZW5jZU5vZGUgPSAodGhpc1xuICAgICAgICAgIC5jdXJyZW50U2VxdWVuY2VOb2RlIGFzIFNlcXVlbmNlTm9kZSkudGhlbihcbiAgICAgICAgICBuZXcgQnJlYWtXaGlsZVNlcXVlbmNlTm9kZShcbiAgICAgICAgICAgIHRoaXMud2hpbGVOb2RlU3RhY2tbdGhpcy53aGlsZU5vZGVTdGFjay5sZW5ndGggLSAxXVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdXSElMRSBzdGF0ZW1lbnQgaXMgbmVlZGVkIHRvIGJlIGNhbGxlZCBiZWZvcmUgQlJFQUtXSElMRSBzdGF0ZW1lbnQuJ1xuICAgICAgICApXG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpc1xuICAgIH1cbiAgfVxuXG4gIGV4cG9ydCBjbGFzcyBTZXF1ZW5jZU5vZGUge1xuICAgIGFjdGlvbjogSUFjdGlvbiB8IG51bGwgPSBudWxsXG4gICAgbmV4dDogU2VxdWVuY2VOb2RlIHwgbnVsbCA9IG51bGxcbiAgXG4gICAgdGhlbihuZXh0OiBTZXF1ZW5jZU5vZGUpOiBTZXF1ZW5jZU5vZGUge1xuICAgICAgdGhpcy5uZXh0ID0gbmV4dFxuICAgICAgcmV0dXJuIG5leHRcbiAgICB9XG4gIFxuICAgIG9uU3RhcnQoKSB7XG4gICAgICBpZiAodGhpcy5hY3Rpb24pIHRoaXMuYWN0aW9uLm9uU3RhcnQoKVxuICAgIH1cbiAgXG4gICAgdXBkYXRlKGR0OiBudW1iZXIpIHtcbiAgICAgIGlmICh0aGlzLmFjdGlvbikgdGhpcy5hY3Rpb24udXBkYXRlKGR0KVxuICAgIH1cbiAgXG4gICAgb25GaW5pc2goKSB7XG4gICAgICBpZiAodGhpcy5hY3Rpb24pIHRoaXMuYWN0aW9uLm9uRmluaXNoKClcbiAgICB9XG4gIFxuICAgIGhhc0ZpbmlzaCgpOiBib29sZWFuIHtcbiAgICAgIGlmICh0aGlzLmFjdGlvbikgcmV0dXJuIHRoaXMuYWN0aW9uLmhhc0ZpbmlzaGVkXG4gICAgICBlbHNlIHJldHVybiB0cnVlXG4gICAgfVxuICBcbiAgICBnZXRTZXF1ZW5jZSgpOiBTZXF1ZW5jZU5vZGUge1xuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG4gIH1cbiAgXG4gIGNsYXNzIFN1YlNlcXVlbmNlTm9kZSBleHRlbmRzIFNlcXVlbmNlTm9kZSB7XG4gICAgY3VycmVudElubmVyU2VxdWVuY2U6IFNlcXVlbmNlTm9kZSB8IG51bGwgPSBudWxsXG4gICAgc3RhcnRpbmdJbm5lclNlcXVlbmNlOiBTZXF1ZW5jZU5vZGUgfCBudWxsID0gbnVsbFxuICAgIGNsb3NlZDogYm9vbGVhbiA9IGZhbHNlXG4gIFxuICAgIHRoZW4obmV4dDogU2VxdWVuY2VOb2RlKTogU2VxdWVuY2VOb2RlIHtcbiAgICAgIGlmICh0aGlzLmN1cnJlbnRJbm5lclNlcXVlbmNlID09IG51bGwpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50SW5uZXJTZXF1ZW5jZSA9IG5leHRcbiAgICAgICAgdGhpcy5zdGFydGluZ0lubmVyU2VxdWVuY2UgPSBuZXh0XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy5jbG9zZWQpIHtcbiAgICAgICAgICB0aGlzLm5leHQgPSBuZXh0XG4gICAgICAgICAgcmV0dXJuIG5leHRcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmN1cnJlbnRJbm5lclNlcXVlbmNlID0gdGhpcy5jdXJyZW50SW5uZXJTZXF1ZW5jZS50aGVuKG5leHQpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuICBcbiAgICBvblN0YXJ0KCkge1xuICAgICAgdGhpcy5jdXJyZW50SW5uZXJTZXF1ZW5jZSA9IHRoaXMuc3RhcnRpbmdJbm5lclNlcXVlbmNlXG4gICAgICBpZiAodGhpcy5jdXJyZW50SW5uZXJTZXF1ZW5jZSkgdGhpcy5jdXJyZW50SW5uZXJTZXF1ZW5jZS5vblN0YXJ0KClcbiAgICB9XG4gIFxuICAgIHVwZGF0ZShkdDogbnVtYmVyKSB7XG4gICAgICBpZiAodGhpcy5jdXJyZW50SW5uZXJTZXF1ZW5jZSkge1xuICAgICAgICBpZiAoIXRoaXMuY3VycmVudElubmVyU2VxdWVuY2UuaGFzRmluaXNoKCkpIHtcbiAgICAgICAgICB0aGlzLmN1cnJlbnRJbm5lclNlcXVlbmNlLnVwZGF0ZShkdClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmN1cnJlbnRJbm5lclNlcXVlbmNlLm9uRmluaXNoKClcbiAgICAgICAgICB0aGlzLmN1cnJlbnRJbm5lclNlcXVlbmNlID0gdGhpcy5jdXJyZW50SW5uZXJTZXF1ZW5jZS5uZXh0XG4gICAgICAgICAgaWYgKHRoaXMuY3VycmVudElubmVyU2VxdWVuY2UpIHRoaXMuY3VycmVudElubmVyU2VxdWVuY2Uub25TdGFydCgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIFxuICAgIG9uRmluaXNoKCkge1xuICAgICAgaWYgKHRoaXMuY3VycmVudElubmVyU2VxdWVuY2UpIHRoaXMuY3VycmVudElubmVyU2VxdWVuY2Uub25GaW5pc2goKVxuICAgIH1cbiAgXG4gICAgaGFzRmluaXNoKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuY3VycmVudElubmVyU2VxdWVuY2UgPT0gbnVsbFxuICAgIH1cbiAgXG4gICAgZ2V0U2VxdWVuY2UoKTogU2VxdWVuY2VOb2RlIHtcbiAgICAgIGlmICh0aGlzLmN1cnJlbnRJbm5lclNlcXVlbmNlKSB7XG4gICAgICAgIGxldCBpbm5lclNlcSA9IHRoaXMuY3VycmVudElubmVyU2VxdWVuY2UuZ2V0U2VxdWVuY2UoKVxuICAgICAgICBpZiAoaW5uZXJTZXEgaW5zdGFuY2VvZiBTdWJTZXF1ZW5jZU5vZGUpIHtcbiAgICAgICAgICBpZiAoIWlubmVyU2VxLmNsb3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIGlubmVyU2VxXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpc1xuICAgIH1cbiAgfVxuICBcbiAgY2xhc3MgSWZTZXF1ZW5jZU5vZGUgZXh0ZW5kcyBTdWJTZXF1ZW5jZU5vZGUge1xuICAgIGNvbmRpdGlvbjogKCkgPT4gYm9vbGVhblxuICAgIHJlc3VsdDogYm9vbGVhbiA9IGZhbHNlXG4gIFxuICAgIGNvbnN0cnVjdG9yKGNvbmRpdGlvbjogKCkgPT4gYm9vbGVhbikge1xuICAgICAgc3VwZXIoKVxuICAgICAgdGhpcy5jb25kaXRpb24gPSBjb25kaXRpb25cbiAgICB9XG4gIFxuICAgIG9uU3RhcnQoKSB7XG4gICAgICB0aGlzLnJlc3VsdCA9IHRoaXMuY29uZGl0aW9uKClcbiAgICAgIGlmICh0aGlzLnJlc3VsdCkgc3VwZXIub25TdGFydCgpXG4gICAgICBlbHNlIHRoaXMuY3VycmVudElubmVyU2VxdWVuY2UgPSBudWxsXG4gICAgfVxuICB9XG4gIFxuICBjbGFzcyBFbHNlU2VxdWVuY2VOb2RlIGV4dGVuZHMgU3ViU2VxdWVuY2VOb2RlIHtcbiAgICBpZlNlcXVlbmNlOiBJZlNlcXVlbmNlTm9kZSB8IG51bGwgPSBudWxsXG4gIFxuICAgIGNvbnN0cnVjdG9yKGlmU2VxdWVuY2U6IElmU2VxdWVuY2VOb2RlKSB7XG4gICAgICBzdXBlcigpXG4gICAgICB0aGlzLmlmU2VxdWVuY2UgPSBpZlNlcXVlbmNlXG4gICAgfVxuICBcbiAgICBvblN0YXJ0KCkge1xuICAgICAgaWYgKHRoaXMuaWZTZXF1ZW5jZSAmJiAhdGhpcy5pZlNlcXVlbmNlLnJlc3VsdCkgc3VwZXIub25TdGFydCgpXG4gICAgICBlbHNlIHRoaXMuY3VycmVudElubmVyU2VxdWVuY2UgPSBudWxsXG4gICAgfVxuICB9XG4gIFxuICBjbGFzcyBXaGlsZVNlcXVlbmNlTm9kZSBleHRlbmRzIFN1YlNlcXVlbmNlTm9kZSB7XG4gICAgY29uZGl0aW9uOiAoKSA9PiBib29sZWFuXG4gICAgYnJlYWtXaGlsZTogYm9vbGVhbiA9IGZhbHNlXG4gIFxuICAgIGNvbnN0cnVjdG9yKGNvbmRpdGlvbjogKCkgPT4gYm9vbGVhbikge1xuICAgICAgc3VwZXIoKVxuICAgICAgdGhpcy5jb25kaXRpb24gPSBjb25kaXRpb25cbiAgICB9XG4gIFxuICAgIG9uU3RhcnQoKSB7XG4gICAgICB0aGlzLmJyZWFrV2hpbGUgPSBmYWxzZVxuICAgICAgaWYgKHRoaXMuY29uZGl0aW9uKCkpIHN1cGVyLm9uU3RhcnQoKVxuICAgICAgZWxzZSB0aGlzLmN1cnJlbnRJbm5lclNlcXVlbmNlID0gbnVsbFxuICAgIH1cbiAgXG4gICAgdXBkYXRlKGR0OiBudW1iZXIpIHtcbiAgICAgIGlmICh0aGlzLmN1cnJlbnRJbm5lclNlcXVlbmNlKSB7XG4gICAgICAgIGlmICghdGhpcy5jdXJyZW50SW5uZXJTZXF1ZW5jZS5oYXNGaW5pc2goKSkge1xuICAgICAgICAgIHRoaXMuY3VycmVudElubmVyU2VxdWVuY2UudXBkYXRlKGR0KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuY3VycmVudElubmVyU2VxdWVuY2Uub25GaW5pc2goKVxuICAgICAgICAgIHRoaXMuY3VycmVudElubmVyU2VxdWVuY2UgPSB0aGlzLmN1cnJlbnRJbm5lclNlcXVlbmNlLm5leHRcbiAgICAgICAgICBpZiAodGhpcy5jdXJyZW50SW5uZXJTZXF1ZW5jZSA9PSBudWxsKVxuICAgICAgICAgICAgdGhpcy5jdXJyZW50SW5uZXJTZXF1ZW5jZSA9IHRoaXMuc3RhcnRpbmdJbm5lclNlcXVlbmNlXG4gICAgICAgICAgaWYgKHRoaXMuY3VycmVudElubmVyU2VxdWVuY2UpIHRoaXMuY3VycmVudElubmVyU2VxdWVuY2Uub25TdGFydCgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIFxuICAgIGhhc0ZpbmlzaCgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLmJyZWFrV2hpbGUgfHwgIXRoaXMuY29uZGl0aW9uKClcbiAgICB9XG4gIH1cbiAgXG4gIGNsYXNzIEJyZWFrV2hpbGVTZXF1ZW5jZU5vZGUgZXh0ZW5kcyBTZXF1ZW5jZU5vZGUge1xuICAgIHdoaWxlTm9kZTogV2hpbGVTZXF1ZW5jZU5vZGVcbiAgXG4gICAgY29uc3RydWN0b3Iod2hpbGVOb2RlOiBXaGlsZVNlcXVlbmNlTm9kZSkge1xuICAgICAgc3VwZXIoKVxuICAgICAgdGhpcy53aGlsZU5vZGUgPSB3aGlsZU5vZGVcbiAgICB9XG4gIFxuICAgIG9uU3RhcnQoKSB7XG4gICAgICB0aGlzLndoaWxlTm9kZS5icmVha1doaWxlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuIiwgImltcG9ydCB7IEFuaW1hdG9yLCBFbnRpdHksIEdsdGZDb250YWluZXIsIElucHV0QWN0aW9uLCBQb2ludGVyRXZlbnRzLCBwb2ludGVyRXZlbnRzU3lzdGVtIH0gZnJvbSBcIkBkY2wvZWNzXCI7XG5pbXBvcnQgeyBDdXR0aW5nQm9hcmQsIEdyYWJhYmxlT2JqZWN0Q29tcG9uZW50LCBJbmdyZWRpZW50VHlwZSB9IGZyb20gXCIuLi9kZWZpbml0aW9uc1wiO1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnQGRjbC1zZGsvdXRpbHMnXG5cbmV4cG9ydCBmdW5jdGlvbiBjdXRTdXNoaShlbnRpdHk6IEVudGl0eSwgbW9kZWxFbnRpdHk6IEVudGl0eSkge1xuXG4gIGxldCBib2FyZERhdGEgPSBDdXR0aW5nQm9hcmQuZ2V0TXV0YWJsZShlbnRpdHkpXG5cbiAgaWYgKCFib2FyZERhdGEuaGFzUm9sbCB8fCBib2FyZERhdGEuY3V0dGluZykgcmV0dXJuXG5cbiAgbGV0IGluZ3JlZGllbnQgPSBib2FyZERhdGEucm9sbENoaWxkXG5cbiAgbGV0IGluZ3JlZGllbnREYXRhID0gR3JhYmFibGVPYmplY3RDb21wb25lbnQuZ2V0TXV0YWJsZShpbmdyZWRpZW50KVxuXG4gIGlmIChpbmdyZWRpZW50RGF0YS50eXBlICE9IEluZ3JlZGllbnRUeXBlLlN1c2hpUm9sbCkge1xuICAgIHJ1aW5Gb29kKGluZ3JlZGllbnQpXG4gIH1cblxuICBib2FyZERhdGEuY3V0dGluZyA9IHRydWVcbiAgYm9hcmREYXRhLmN1dHMgKz0gMVxuXG5cbiAgc3dpdGNoIChib2FyZERhdGEuY3V0cykge1xuICAgIGNhc2UgMTpcbiAgICAgIEFuaW1hdG9yLnBsYXlTaW5nbGVBbmltYXRpb24obW9kZWxFbnRpdHksIFwiU3RhdGUxXCIsIGZhbHNlKVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAyOlxuICAgICAgQW5pbWF0b3IucGxheVNpbmdsZUFuaW1hdGlvbihtb2RlbEVudGl0eSwgXCJTdGF0ZTJcIiwgZmFsc2UpXG4gICAgICBicmVhaztcbiAgICBjYXNlIDM6XG4gICAgICBBbmltYXRvci5wbGF5U2luZ2xlQW5pbWF0aW9uKG1vZGVsRW50aXR5LCBcIlN0YXRlM1wiLCBmYWxzZSlcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgNDpcbiAgICAgIEFuaW1hdG9yLnBsYXlTaW5nbGVBbmltYXRpb24obW9kZWxFbnRpdHksIFwiU3RhdGU0XCIsIGZhbHNlKVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSA1OlxuICAgICAgQW5pbWF0b3IucGxheVNpbmdsZUFuaW1hdGlvbihtb2RlbEVudGl0eSwgXCJTdGF0ZTVcIiwgZmFsc2UpXG4gICAgICBpZiAoaW5ncmVkaWVudERhdGEudHlwZSAhPSBJbmdyZWRpZW50VHlwZS5TdXNoaVJvbGwpIHJldHVyblxuXG4gICAgICB1dGlscy50aW1lcnMuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGluZ3JlZGllbnREYXRhLnR5cGUgPSBJbmdyZWRpZW50VHlwZS5TbGljZWRTdXNoaVxuICAgICAgICBHbHRmQ29udGFpbmVyLmdldE11dGFibGUoaW5ncmVkaWVudCkuc3JjID0gXCJhc3NldHMvbW9kZWxzL1BsYXRlU3VzaGkuZ2xiXCJcbiAgICAgIH0sIDMwMClcblxuICAgICAgYnJlYWs7XG4gICAgY2FzZSA2OlxuICAgICAgQW5pbWF0b3IucGxheVNpbmdsZUFuaW1hdGlvbihtb2RlbEVudGl0eSwgXCJTdGF0ZTVcIiwgZmFsc2UpXG4gICAgICBydWluRm9vZChpbmdyZWRpZW50KVxuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIGJyZWFrO1xuICB9XG5cblxuICB1dGlscy50aW1lcnMuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgYm9hcmREYXRhLmN1dHRpbmcgPSBmYWxzZVxuICB9LCA1MDApXG5cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN3aXRjaFRvQ3V0TW9kZShlbnRpdHk6IEVudGl0eSkge1xuXG4gIGNvbnN0IHBvaW50ZXJFdmVudCA9IFBvaW50ZXJFdmVudHMuZ2V0TXV0YWJsZShlbnRpdHkpLnBvaW50ZXJFdmVudHNbMF1cbiAgaWYgKHBvaW50ZXJFdmVudCAmJiBwb2ludGVyRXZlbnQuZXZlbnRJbmZvKSB7XG4gICAgcG9pbnRlckV2ZW50LmV2ZW50SW5mby5ob3ZlclRleHQgPSBcIkN1dFwiXG4gICAgLy8gcG9pbnRlckV2ZW50LmV2ZW50SW5mby5idXR0b24gPSBJbnB1dEFjdGlvbi5JQV9QT0lOVEVSXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN3aXRjaFRvRW1wdHkoZW50aXR5OiBFbnRpdHkpIHtcblxuICBjb25zdCBwb2ludGVyRXZlbnQgPSBQb2ludGVyRXZlbnRzLmdldE11dGFibGUoZW50aXR5KS5wb2ludGVyRXZlbnRzWzBdXG4gIGlmIChwb2ludGVyRXZlbnQgJiYgcG9pbnRlckV2ZW50LmV2ZW50SW5mbykge1xuICAgIHBvaW50ZXJFdmVudC5ldmVudEluZm8uaG92ZXJUZXh0ID0gXCJQdXRcIlxuICAgIHBvaW50ZXJFdmVudC5ldmVudEluZm8uYnV0dG9uID0gSW5wdXRBY3Rpb24uSUFfUFJJTUFSWVxuICB9XG4gIEFuaW1hdG9yLnN0b3BBbGxBbmltYXRpb25zKGVudGl0eSwgdHJ1ZSlcblxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBydWluRm9vZChlbnRpdHk6IEVudGl0eSkge1xuXG4gIGNvbnNvbGUubG9nKFwicnVpbiBmb29kXCIpXG5cbiAgbGV0IG9iamVjdERhdGEgPSBHcmFiYWJsZU9iamVjdENvbXBvbmVudC5nZXRNdXRhYmxlKGVudGl0eSlcblxuICBvYmplY3REYXRhLnR5cGUgPSBJbmdyZWRpZW50VHlwZS5UcmFzaFxuXG4gIEdsdGZDb250YWluZXIuZ2V0TXV0YWJsZShlbnRpdHkpLnNyYyA9IFwiYXNzZXRzL21vZGVscy9HYXJiYWdlRm9vZC5nbGJcIlxuXG59IiwgImltcG9ydCB7IEVudGl0eSwgVHJhbnNmb3JtLCBNZXNoUmVuZGVyZXIsIE1hdGVyaWFsLCBUcmFuc2Zvcm1UeXBlLCBlbmdpbmUsIFZpc2liaWxpdHlDb21wb25lbnQgfSBmcm9tIFwiQGRjbC9zZGsvZWNzXCI7XG5pbXBvcnQgeyBQcm9ncmVzc0JhciB9IGZyb20gXCIuLi9kZWZpbml0aW9uc1wiO1xuaW1wb3J0IHsgQ29sb3I0LCBWZWN0b3IzLCBRdWF0ZXJuaW9uLCBTY2FsYXIgfSBmcm9tIFwiQGRjbC9zZGsvbWF0aFwiO1xuaW1wb3J0IHsgZ2V0UGFyZW50LCBwYXJlbnRFbnRpdHksIHN5bmNFbnRpdHkgfSBmcm9tIFwiQGRjbC9zZGsvbmV0d29ya1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gQ3JlYXRlUHJvZ3Jlc3NCYXIocGFyZW50OiBFbnRpdHksIGhlaWdodD86IG51bWJlciwgeVJvdGF0aW9uPzogbnVtYmVyLCBtb3Zlc1VwPzogYm9vbGVhbiwgc3RhcnRIaWRkZW4/OiBib29sZWFuLCBzcGVlZD86IG51bWJlciwgaWQxPzogbnVtYmVyLCBpZDI/OiBudW1iZXIpIHtcblxuICBjb25zdCBiYWNrZ3JvdW5kID0gZW5naW5lLmFkZEVudGl0eSgpXG4gIFRyYW5zZm9ybS5jcmVhdGUoYmFja2dyb3VuZCwge1xuICAgIHBvc2l0aW9uOiBWZWN0b3IzLmNyZWF0ZSgwLCBoZWlnaHQgPyBoZWlnaHQgOiAxLCAwKSxcbiAgICBzY2FsZTogVmVjdG9yMy5jcmVhdGUoMC44MiwgMC4xNSwgMSksXG4gICAgcm90YXRpb246IFF1YXRlcm5pb24uZnJvbUV1bGVyRGVncmVlcygwLCB5Um90YXRpb24gPyB5Um90YXRpb24gOiAwLCAwKVxuICB9KVxuICBNZXNoUmVuZGVyZXIuc2V0UGxhbmUoYmFja2dyb3VuZClcblxuICBzeW5jRW50aXR5KGJhY2tncm91bmQsIFtUcmFuc2Zvcm0uY29tcG9uZW50SWQsIFZpc2liaWxpdHlDb21wb25lbnQuY29tcG9uZW50SWRdLCBpZDEpXG4gIHBhcmVudEVudGl0eShiYWNrZ3JvdW5kLCBwYXJlbnQpXG5cbiAgY29uc3QgcHJvZ3Jlc3NCYXIgPSBlbmdpbmUuYWRkRW50aXR5KClcbiAgVHJhbnNmb3JtLmNyZWF0ZShwcm9ncmVzc0Jhciwge1xuICAgIHBvc2l0aW9uOiBWZWN0b3IzLmNyZWF0ZSgwLCAwLCAtMC4wMyksXG4gICAgc2NhbGU6IFZlY3RvcjMuY3JlYXRlKDAuOTUsIDAuOCwgMSlcbiAgfSlcbiAgTWVzaFJlbmRlcmVyLnNldFBsYW5lKHByb2dyZXNzQmFyKVxuXG4gIE1hdGVyaWFsLnNldEJhc2ljTWF0ZXJpYWwocHJvZ3Jlc3NCYXIsIHsgZGlmZnVzZUNvbG9yOiBDb2xvcjQuR3JlZW4oKSB9KVxuXG4gIFByb2dyZXNzQmFyLmNyZWF0ZShwcm9ncmVzc0Jhciwge1xuICAgIHBhcmVudDogcGFyZW50LFxuICAgIGNvbG9yOiBDb2xvcjQuR3JlZW4oKSxcbiAgICBtb3Zlc1VwOiBtb3Zlc1VwLFxuICAgIHJhdGlvOiBtb3Zlc1VwID8gMCA6IDEsXG4gICAgcmVkV2FybmluZzogbW92ZXNVcCA/IDAuOCA6IDAuMixcbiAgICBzcGVlZDogc3BlZWQgPyBzcGVlZCA6IDEsXG4gICAgdmlzaWJsZTogc3RhcnRIaWRkZW4gPyBmYWxzZSA6IHRydWUsXG4gICAgYWN0aXZlOiBzdGFydEhpZGRlbiA/IGZhbHNlIDogdHJ1ZSxcbiAgfSlcblxuXG4gIHN5bmNFbnRpdHkocHJvZ3Jlc3NCYXIsIFtUcmFuc2Zvcm0uY29tcG9uZW50SWQsIE1hdGVyaWFsLmNvbXBvbmVudElkLCBWaXNpYmlsaXR5Q29tcG9uZW50LmNvbXBvbmVudElkXSwgaWQyKVxuICBwYXJlbnRFbnRpdHkocHJvZ3Jlc3NCYXIsIGJhY2tncm91bmQpXG5cbiAgaWYgKHN0YXJ0SGlkZGVuKSB7XG4gICAgVmlzaWJpbGl0eUNvbXBvbmVudC5jcmVhdGUoYmFja2dyb3VuZCwgeyB2aXNpYmxlOiBmYWxzZSB9KVxuICAgIFZpc2liaWxpdHlDb21wb25lbnQuY3JlYXRlKHByb2dyZXNzQmFyLCB7IHZpc2libGU6IGZhbHNlIH0pXG5cbiAgfVxuXG5cbiAgcmV0dXJuIHByb2dyZXNzQmFyXG5cblxufVxuXG5cblxuXG5leHBvcnQgZnVuY3Rpb24gUHJvZ3Jlc3NCYXJVcGRhdGUoZHQ6IG51bWJlcikge1xuICBmb3IgKGNvbnN0IFtlbnRpdHldIG9mIGVuZ2luZS5nZXRFbnRpdGllc1dpdGgoUHJvZ3Jlc3NCYXIpKSB7XG4gICAgY29uc3QgcHJvZ3Jlc3NCYXIgPSBQcm9ncmVzc0Jhci5nZXRNdXRhYmxlKGVudGl0eSk7XG4gICAgaWYgKHByb2dyZXNzQmFyLmFjdGl2ZSkge1xuICAgICAgaWYgKHByb2dyZXNzQmFyLm1vdmVzVXApIHtcbiAgICAgICAgcHJvZ3Jlc3NCYXIucmF0aW8gKz0gZHQgLyAxMCAqIHByb2dyZXNzQmFyLnNwZWVkXG5cbiAgICAgICAgaWYgKHByb2dyZXNzQmFyLnJhdGlvID4gcHJvZ3Jlc3NCYXIueWVsbG93V2FybmluZyAmJiBwcm9ncmVzc0Jhci5jb2xvciA9PSBDb2xvcjQuR3JlZW4oKSkge1xuICAgICAgICAgIGNoYW5nZUJhckNvbG9yKGVudGl0eSwgQ29sb3I0LlllbGxvdygpKVxuICAgICAgICB9IGVsc2UgaWYgKHByb2dyZXNzQmFyLnJhdGlvID4gcHJvZ3Jlc3NCYXIucmVkV2FybmluZyAmJiBwcm9ncmVzc0Jhci5jb2xvciAhPSBDb2xvcjQuUmVkKCkpIHtcbiAgICAgICAgICBjaGFuZ2VCYXJDb2xvcihlbnRpdHksIENvbG9yNC5SZWQoKSlcblxuICAgICAgICAgIC8vIERPIFNPTUVUSElORz9cbiAgICAgICAgICAvLyBzbW9rZSBpZiBwYXJlbnQgPSBwb3QgPz9cblxuXG4gICAgICAgIH0gZWxzZSBpZiAocHJvZ3Jlc3NCYXIucmF0aW8gPiBwcm9ncmVzc0Jhci5mdWxsTGVuZ3RoKSB7XG4gICAgICAgICAgcHJvZ3Jlc3NCYXIucmF0aW8gPSAxXG4gICAgICAgICAgcHJvZ3Jlc3NCYXIuYWN0aXZlID0gZmFsc2VcblxuICAgICAgICAgIC8vIERPIFNPTUVUSElORz9cbiAgICAgICAgfVxuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcm9ncmVzc0Jhci5yYXRpbyAtPSBkdCAvIDEwICogcHJvZ3Jlc3NCYXIuc3BlZWRcbiAgICAgICAgaWYgKHByb2dyZXNzQmFyLnJhdGlvIDwgcHJvZ3Jlc3NCYXIueWVsbG93V2FybmluZyAmJiBwcm9ncmVzc0Jhci5jb2xvciA9PSBDb2xvcjQuR3JlZW4oKSkge1xuICAgICAgICAgIGNoYW5nZUJhckNvbG9yKGVudGl0eSwgQ29sb3I0LlllbGxvdygpKVxuICAgICAgICB9IGVsc2UgaWYgKHByb2dyZXNzQmFyLnJhdGlvIDwgcHJvZ3Jlc3NCYXIucmVkV2FybmluZyAmJiBwcm9ncmVzc0Jhci5jb2xvciAhPSBDb2xvcjQuUmVkKCkpIHtcbiAgICAgICAgICBjaGFuZ2VCYXJDb2xvcihlbnRpdHksIENvbG9yNC5SZWQoKSlcblxuICAgICAgICAgIC8vIERPIFNPTUVUSElORz9cbiAgICAgICAgICAvLyBzbW9rZSBpZiBwYXJlbnQgPSBwb3QgPz9cblxuXG4gICAgICAgIH0gZWxzZSBpZiAocHJvZ3Jlc3NCYXIucmF0aW8gPD0gMCkge1xuICAgICAgICAgIHByb2dyZXNzQmFyLnJhdGlvID0gMFxuICAgICAgICAgIHByb2dyZXNzQmFyLmFjdGl2ZSA9IGZhbHNlXG5cbiAgICAgICAgICAvLyBETyBTT01FVEhJTkc/XG5cbiAgICAgICAgfVxuICAgICAgfVxuXG5cbiAgICAgIGlmIChwcm9ncmVzc0Jhci5yYXRpbyA+IHByb2dyZXNzQmFyLmZ1bGxMZW5ndGgpIHtcbiAgICAgICAgcHJvZ3Jlc3NCYXIuYWN0aXZlID0gZmFsc2U7XG5cbiAgICAgIH1cbiAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IFRyYW5zZm9ybS5nZXRNdXRhYmxlKGVudGl0eSk7XG5cbiAgICAgIGxldCB3aWR0aCA9IFNjYWxhci5sZXJwKDAsIHByb2dyZXNzQmFyLmZ1bGxMZW5ndGgsIHByb2dyZXNzQmFyLnJhdGlvKVxuICAgICAgdHJhbnNmb3JtLnNjYWxlLnggPSB3aWR0aFxuICAgICAgdHJhbnNmb3JtLnBvc2l0aW9uLnggPSAtcHJvZ3Jlc3NCYXIuZnVsbExlbmd0aCAvIDIgKyB3aWR0aCAvIDJcblxuICAgIH1cblxuICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGNoYW5nZUJhckNvbG9yKGVudGl0eTogRW50aXR5LCBjb2xvcjogQ29sb3I0KSB7XG4gIGNvbnN0IHByb2dyZXNzQmFyID0gUHJvZ3Jlc3NCYXIuZ2V0TXV0YWJsZShlbnRpdHkpXG4gIHByb2dyZXNzQmFyLmNvbG9yID0gY29sb3JcblxuICBjb25zdCBtYXRlcmlhbCA9IE1hdGVyaWFsLmdldE11dGFibGUoZW50aXR5KVxuICBNYXRlcmlhbC5zZXRCYXNpY01hdGVyaWFsKGVudGl0eSwgeyBkaWZmdXNlQ29sb3I6IGNvbG9yIH0pXG5cblxuICAvLyBDSEFOR0UgQUNUVUFMIEJBUiBNQVRFUklBTFxuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBIaWRlUHJvZ3Jlc3NCYXIoZW50aXR5OiBFbnRpdHkpIHtcbiAgY29uc3QgcHJvZ3Jlc3NCYXIgPSBQcm9ncmVzc0Jhci5nZXRNdXRhYmxlKGVudGl0eSlcbiAgcHJvZ3Jlc3NCYXIudmlzaWJsZSA9IGZhbHNlXG4gIFZpc2liaWxpdHlDb21wb25lbnQuY3JlYXRlT3JSZXBsYWNlKGVudGl0eSwgeyB2aXNpYmxlOiBmYWxzZSB9KVxuXG4gIGNvbnN0IHBhcmVudCA9IGdldFBhcmVudChlbnRpdHkpXG4gIGlmIChwYXJlbnQpIHtcbiAgICBWaXNpYmlsaXR5Q29tcG9uZW50LmNyZWF0ZU9yUmVwbGFjZShwYXJlbnQsIHsgdmlzaWJsZTogZmFsc2UgfSlcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBSZXNldFByb2dyZXNzQmFyKGVudGl0eTogRW50aXR5KSB7XG4gIC8vVE9ET1xuICBjb25zdCBwYXJlbnQgPSBnZXRQYXJlbnQoZW50aXR5KVxuXG4gIGNvbnN0IGJhckRhdGEgPSBQcm9ncmVzc0Jhci5nZXRNdXRhYmxlKGVudGl0eSlcbiAgYmFyRGF0YS5hY3RpdmUgPSB0cnVlXG4gIGlmIChiYXJEYXRhLm1vdmVzVXApIHtcbiAgICBiYXJEYXRhLnJhdGlvID0gMFxuICB9IGVsc2Uge1xuICAgIGJhckRhdGEucmF0aW8gPSAxXG4gIH1cbiAgYmFyRGF0YS5jb2xvciA9IENvbG9yNC5HcmVlbigpXG4gIGJhckRhdGEudmlzaWJsZSA9IHRydWVcblxuICBpZiAoVmlzaWJpbGl0eUNvbXBvbmVudC5oYXMoZW50aXR5KSkge1xuICAgIFZpc2liaWxpdHlDb21wb25lbnQuZGVsZXRlRnJvbShlbnRpdHkpXG4gIH1cblxuICBpZiAocGFyZW50ICYmIFZpc2liaWxpdHlDb21wb25lbnQuaGFzKHBhcmVudCkpIHtcbiAgICBWaXNpYmlsaXR5Q29tcG9uZW50LmRlbGV0ZUZyb20ocGFyZW50KVxuICB9XG5cbiAgY2hhbmdlQmFyQ29sb3IoZW50aXR5LCBDb2xvcjQuR3JlZW4oKSlcbn1cblxuLy8gZXhwb3J0IGZ1bmN0aW9uIFJlbW92ZVByb2dyZXNzQmFyKGVudGl0eTogRW50aXR5KSB7XG4vLyAgIC8vVE9ET1xuLy8gICBjb25zdCBwYXJlbnQgPSBnZXRQYXJlbnQoZW50aXR5KVxuXG4vLyAgIGlmIChwYXJlbnQpIHtcbi8vICAgICBlbmdpbmUucmVtb3ZlRW50aXR5V2l0aENoaWxkcmVuKHBhcmVudClcbi8vICAgfSBlbHNlIHtcbi8vICAgICBlbmdpbmUucmVtb3ZlRW50aXR5V2l0aENoaWxkcmVuKGVudGl0eSlcbi8vICAgfVxuXG4vLyB9IiwgImltcG9ydCB7IEVudGl0eSwgTWF0ZXJpYWwsIGVuZ2luZSwgVHJhbnNmb3JtLCBUZXh0U2hhcGUsIE1lc2hSZW5kZXJlciwgVGV4dEFsaWduTW9kZSwgVmlzaWJpbGl0eUNvbXBvbmVudCB9IGZyb20gXCJAZGNsL3Nkay9lY3NcIjtcbmltcG9ydCB7IFNwZWVjaEJ1YmJsZVR5cGUsIFN5bmNFbnRpdHlJRHMgfSBmcm9tIFwiLi4vZGVmaW5pdGlvbnNcIjtcbmltcG9ydCB7IENvbG9yNCwgVmVjdG9yMywgUXVhdGVybmlvbiB9IGZyb20gXCJAZGNsL2Vjcy1tYXRoXCI7XG5pbXBvcnQgeyBzeW5jRW50aXR5LCBwYXJlbnRFbnRpdHksIGdldENoaWxkcmVuIH0gZnJvbSAnQGRjbC9zZGsvbmV0d29yaydcblxuY29uc3QgYnViYmxlMVRleHR1cmUgPSBNYXRlcmlhbC5UZXh0dXJlLkNvbW1vbih7XG4gIHNyYzogJ2Fzc2V0cy90ZXh0dXJlcy9idWJibGUucG5nJyxcbn0pXG5cbmNvbnN0IGJ1YmJsZTNUZXh0dXJlID0gTWF0ZXJpYWwuVGV4dHVyZS5Db21tb24oe1xuICBzcmM6ICdhc3NldHMvdGV4dHVyZXMvYnViYmxlMy5wbmcnLFxufSlcblxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU3BlZWNoQnViYmxlKHBhcmVudDogRW50aXR5LCBzZWF0TnVtYmVyOiBudW1iZXIsIHRleHQ6IHN0cmluZywgaGVpZ2h0PzogbnVtYmVyLCBidWJibGVUeXBlPzogU3BlZWNoQnViYmxlVHlwZSkge1xuXG5cbiAgbGV0IGJ1YmJsZVBhcmVudElkID0gU3luY0VudGl0eUlEcy5CVUJCTEUxX0FcbiAgbGV0IGJhY2tncm91bmRJZCA9IFN5bmNFbnRpdHlJRHMuQlVCQkxFMV9CXG4gIGxldCB0ZXh0SWQgPSBTeW5jRW50aXR5SURzLkJVQkJMRTFfQ1xuXG4gIHN3aXRjaCAoc2VhdE51bWJlcikge1xuICAgIGNhc2UgMTpcbiAgICAgIGJ1YmJsZVBhcmVudElkID0gU3luY0VudGl0eUlEcy5CVUJCTEUxX0FcbiAgICAgIGJhY2tncm91bmRJZCA9IFN5bmNFbnRpdHlJRHMuQlVCQkxFMV9CXG4gICAgICB0ZXh0SWQgPSBTeW5jRW50aXR5SURzLkJVQkJMRTFfQ1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAyOlxuICAgICAgYnViYmxlUGFyZW50SWQgPSBTeW5jRW50aXR5SURzLkJVQkJMRTJfQVxuICAgICAgYmFja2dyb3VuZElkID0gU3luY0VudGl0eUlEcy5CVUJCTEUyX0JcbiAgICAgIHRleHRJZCA9IFN5bmNFbnRpdHlJRHMuQlVCQkxFMl9DXG4gICAgICBicmVhaztcbiAgICBjYXNlIDM6XG4gICAgICBidWJibGVQYXJlbnRJZCA9IFN5bmNFbnRpdHlJRHMuQlVCQkxFM19BXG4gICAgICBiYWNrZ3JvdW5kSWQgPSBTeW5jRW50aXR5SURzLkJVQkJMRTNfQlxuICAgICAgdGV4dElkID0gU3luY0VudGl0eUlEcy5CVUJCTEUzX0NcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgNDpcbiAgICAgIGJ1YmJsZVBhcmVudElkID0gU3luY0VudGl0eUlEcy5CVUJCTEU0X0FcbiAgICAgIGJhY2tncm91bmRJZCA9IFN5bmNFbnRpdHlJRHMuQlVCQkxFNF9CXG4gICAgICB0ZXh0SWQgPSBTeW5jRW50aXR5SURzLkJVQkJMRTRfQ1xuICAgICAgYnJlYWs7XG4gIH1cblxuXG4gIGNvbnN0IGJ1YmJsZVBhcmVudCA9IGVuZ2luZS5hZGRFbnRpdHkoKVxuICBUcmFuc2Zvcm0uY3JlYXRlKGJ1YmJsZVBhcmVudCwge1xuICAgIHBvc2l0aW9uOiBWZWN0b3IzLmNyZWF0ZSgtMSwgMCwgMCksXG4gICAgcm90YXRpb246IFF1YXRlcm5pb24uZnJvbUV1bGVyRGVncmVlcygwLCAxODAsIDApXG4gIH0pXG5cblxuICBjb25zdCBiYWNrZ3JvdW5kID0gZW5naW5lLmFkZEVudGl0eSgpXG4gIFRyYW5zZm9ybS5jcmVhdGUoYmFja2dyb3VuZCwge1xuICAgIHBvc2l0aW9uOiBWZWN0b3IzLmNyZWF0ZSgtMC42LCBoZWlnaHQgPyBoZWlnaHQgLSAwLjM1IDogMC42NSwgMCksXG4gICAgc2NhbGU6IFZlY3RvcjMuY3JlYXRlKDEuNCwgMS42LCAxKSxcbiAgICByb3RhdGlvbjogUXVhdGVybmlvbi5mcm9tRXVsZXJEZWdyZWVzKDAsIDAsIDApXG4gIH0pXG4gIE1lc2hSZW5kZXJlci5zZXRQbGFuZShiYWNrZ3JvdW5kKVxuXG4gIFZpc2liaWxpdHlDb21wb25lbnQuY3JlYXRlT3JSZXBsYWNlKGJhY2tncm91bmQsIHsgdmlzaWJsZTogZmFsc2UgfSlcblxuXG4gIGNvbnN0IHRleHRFbnRpdHkgPSBlbmdpbmUuYWRkRW50aXR5KClcblxuICBUcmFuc2Zvcm0uY3JlYXRlKHRleHRFbnRpdHksIHtcbiAgICBwb3NpdGlvbjogVmVjdG9yMy5jcmVhdGUoLTEsIGhlaWdodCA/IGhlaWdodCAtIDAuMSA6IDAuOSwgLTAuMDMpLFxuICAgIHNjYWxlOiBWZWN0b3IzLmNyZWF0ZSgwLjg1LCAwLjg1LCAwLjg1KSxcbiAgICByb3RhdGlvbjogUXVhdGVybmlvbi5mcm9tRXVsZXJEZWdyZWVzKDAsIDAsIDApXG4gIH0pXG5cbiAgVGV4dFNoYXBlLmNyZWF0ZSh0ZXh0RW50aXR5LCB7XG4gICAgdGV4dDogdGV4dCxcbiAgICB3aWR0aDogMS4xLFxuICAgIGhlaWdodDogMS4xLFxuICAgIHRleHRBbGlnbjogVGV4dEFsaWduTW9kZS5UQU1fTUlERExFX0xFRlQsXG4gICAgZm9udFNpemU6IDEsXG4gIH0pXG5cbiAgVmlzaWJpbGl0eUNvbXBvbmVudC5jcmVhdGVPclJlcGxhY2UodGV4dEVudGl0eSwgeyB2aXNpYmxlOiBmYWxzZSB9KVxuXG5cbiAgbGV0IHRleHR1cmUgPSBidWJibGUxVGV4dHVyZVxuICBsZXQgY29sb3IgPSBDb2xvcjQuR3JheSgpXG5cbiAgc3dpdGNoIChidWJibGVUeXBlKSB7XG4gICAgY2FzZSBTcGVlY2hCdWJibGVUeXBlLkdvb2Q6XG4gICAgICB0ZXh0dXJlID0gYnViYmxlM1RleHR1cmVcbiAgICAgIGNvbG9yID0gQ29sb3I0LkdyZWVuKClcbiAgICAgIGJyZWFrXG4gICAgY2FzZSBTcGVlY2hCdWJibGVUeXBlLkJhZDpcbiAgICAgIHRleHR1cmUgPSBidWJibGUzVGV4dHVyZVxuICAgICAgY29sb3IgPSBDb2xvcjQuUmVkKClcbiAgICAgIGJyZWFrXG4gIH1cblxuICBNYXRlcmlhbC5zZXRCYXNpY01hdGVyaWFsKGJhY2tncm91bmQsIHtcbiAgICBkaWZmdXNlQ29sb3I6IGNvbG9yLFxuICAgIHRleHR1cmU6IHRleHR1cmUsXG5cbiAgfSlcblxuXG4gIC8vcGFyZW50XG4gIHN5bmNFbnRpdHkoYnViYmxlUGFyZW50LCBbXSwgYnViYmxlUGFyZW50SWQpXG4gIHBhcmVudEVudGl0eShidWJibGVQYXJlbnQsIHBhcmVudClcblxuICAvLyBiYWNrZ3JvdW5kXG4gIHN5bmNFbnRpdHkoYmFja2dyb3VuZCwgW01hdGVyaWFsLmNvbXBvbmVudElkLCBUcmFuc2Zvcm0uY29tcG9uZW50SWQsIFZpc2liaWxpdHlDb21wb25lbnQuY29tcG9uZW50SWRdLCBiYWNrZ3JvdW5kSWQpXG4gIHBhcmVudEVudGl0eShiYWNrZ3JvdW5kLCBidWJibGVQYXJlbnQpXG5cbiAgLy8gdGV4dFxuICBzeW5jRW50aXR5KHRleHRFbnRpdHksIFtUZXh0U2hhcGUuY29tcG9uZW50SWQsIFRyYW5zZm9ybS5jb21wb25lbnRJZCwgVmlzaWJpbGl0eUNvbXBvbmVudC5jb21wb25lbnRJZF0sIHRleHRJZClcbiAgcGFyZW50RW50aXR5KHRleHRFbnRpdHksIGJ1YmJsZVBhcmVudClcblxuXG4gIHJldHVybiBidWJibGVQYXJlbnRcbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlU3BlZWNoQnViYmxlKGJ1YmJsZTogRW50aXR5LCB0ZXh0OiBzdHJpbmcsIGJ1YmJsZVR5cGU/OiBTcGVlY2hCdWJibGVUeXBlKSB7XG5cbiAgY29uc3QgY2hpbGRyZW4gPSBBcnJheS5mcm9tKGdldENoaWxkcmVuKGJ1YmJsZSkpXG4gIGxldCBiYWNrZ3JvdW5kRW50aXR5OiBFbnRpdHkgfCB1bmRlZmluZWQgPSB1bmRlZmluZWRcbiAgbGV0IHRleHRFbnRpdHk6IEVudGl0eSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZFxuXG4gIGZvciAoY29uc3QgZW50IG9mIGNoaWxkcmVuKSB7XG4gICAgVmlzaWJpbGl0eUNvbXBvbmVudC5kZWxldGVGcm9tKGVudClcbiAgICBpZiAoVGV4dFNoYXBlLmhhcyhlbnQpKSB7XG4gICAgICB0ZXh0RW50aXR5ID0gZW50XG4gICAgfVxuICAgIGlmIChNZXNoUmVuZGVyZXIuaGFzKGVudCkpIHtcbiAgICAgIGJhY2tncm91bmRFbnRpdHkgPSBlbnRcbiAgICB9XG4gIH1cblxuICBpZiAoIWJhY2tncm91bmRFbnRpdHkgfHwgIXRleHRFbnRpdHkpIHsgcmV0dXJuIH1cblxuXG4gIGxldCB0ZXh0dXJlID0gYnViYmxlMVRleHR1cmVcbiAgbGV0IGNvbG9yID0gQ29sb3I0LkdyYXkoKVxuXG4gIHN3aXRjaCAoYnViYmxlVHlwZSkge1xuICAgIGNhc2UgU3BlZWNoQnViYmxlVHlwZS5Hb29kOlxuICAgICAgdGV4dHVyZSA9IGJ1YmJsZTNUZXh0dXJlXG4gICAgICBjb2xvciA9IENvbG9yNC5HcmVlbigpXG4gICAgICBicmVha1xuICAgIGNhc2UgU3BlZWNoQnViYmxlVHlwZS5CYWQ6XG4gICAgICB0ZXh0dXJlID0gYnViYmxlM1RleHR1cmVcbiAgICAgIGNvbG9yID0gQ29sb3I0LlJlZCgpXG4gICAgICBicmVha1xuICB9XG5cbiAgTWF0ZXJpYWwuc2V0QmFzaWNNYXRlcmlhbChiYWNrZ3JvdW5kRW50aXR5LCB7XG4gICAgZGlmZnVzZUNvbG9yOiBjb2xvcixcbiAgICB0ZXh0dXJlOiB0ZXh0dXJlLFxuXG4gIH0pXG5cbiAgVGV4dFNoYXBlLmdldE11dGFibGUodGV4dEVudGl0eSkudGV4dCA9IHRleHRcblxuXG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIEhpZGVTcGVlY2hCdWJibGUoYnViYmxlOiBFbnRpdHkpIHtcblxuICBjb25zdCBjaGlsZHJlbiA9IEFycmF5LmZyb20oZ2V0Q2hpbGRyZW4oYnViYmxlKSlcblxuICBmb3IgKGNvbnN0IGVudCBvZiBjaGlsZHJlbikge1xuICAgIFZpc2liaWxpdHlDb21wb25lbnQuY3JlYXRlT3JSZXBsYWNlKGVudCwgeyB2aXNpYmxlOiBmYWxzZSB9KVxuICB9XG5cbn1cblxuXG5cblxuZXhwb3J0IGZ1bmN0aW9uIFJlbW92ZVNwZWVjaEJ1YmJsZShidWJibGU6IEVudGl0eSkge1xuXG4gIC8vIFRPRE9cbiAgZW5naW5lLnJlbW92ZUVudGl0eVdpdGhDaGlsZHJlbihidWJibGUpXG59XG4iLCAiaW1wb3J0IHsgR2x0ZkNvbnRhaW5lciwgQW5pbWF0b3IsIFRyYW5zZm9ybSwgZW5naW5lLCBFbnRpdHksIFRleHRTaGFwZSwgVmlzaWJpbGl0eUNvbXBvbmVudCB9IGZyb20gXCJAZGNsL3Nkay9lY3NcIlxuaW1wb3J0IHsgVmVjdG9yMywgU2NhbGFyLCBRdWF0ZXJuaW9uLCBDb2xvcjQgfSBmcm9tICdAZGNsL3Nkay9tYXRoJ1xuaW1wb3J0IHsgUHJvZ3Jlc3NCYXIsIEN1c3RvbWVyRGF0YSwgSW5ncmVkaWVudFR5cGUsIFNwZWVjaEJ1YmJsZVR5cGUsIEJlZXJHbGFzcywgQmVlclR5cGUsIEdhbWVEYXRhLCBTeW5jRW50aXR5SURzLCBHcmFiYWJsZU9iamVjdENvbXBvbmVudCB9IGZyb20gXCIuLi9kZWZpbml0aW9uc1wiO1xuaW1wb3J0IHsgQ3JlYXRlUHJvZ3Jlc3NCYXIsIEhpZGVQcm9ncmVzc0JhciwgUmVzZXRQcm9ncmVzc0JhciB9IGZyb20gXCIuL3Byb2dyZXNzQmFyc1wiO1xuaW1wb3J0IHsgSGlkZVNwZWVjaEJ1YmJsZSwgUmVtb3ZlU3BlZWNoQnViYmxlLCBjcmVhdGVTcGVlY2hCdWJibGUsIHVwZGF0ZVNwZWVjaEJ1YmJsZSB9IGZyb20gXCIuL3NwZWVjaEJ1YmJsZVwiO1xuaW1wb3J0IHsgc3luY0VudGl0eSwgcGFyZW50RW50aXR5IH0gZnJvbSAnQGRjbC9zZGsvbmV0d29yaydcbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJ0BkY2wtc2RrL3V0aWxzJ1xuaW1wb3J0IHsgZ2V0UGxheWVyUG9zaXRpb24sIHBsYXlTb3VuZCB9IGZyb20gXCIuL2hlbHBlcnNcIjtcblxuY29uc3QgY3VzdG9tZXJSYXdOb29kbGVNZXNzYWdlcyA9IFtcbiAgXCJNZSBsaWtlIHNvbWUgXFxubm9vZGxlcyEgTWUgbGlrZSdlbSBSQVchXCIsXG4gICdSQVcgbm9vZGxlcyBwbGVhc2UsIFxcbmFuZCBodXJyeSEnLFxuICAnTm9vZGxlcyEgQSBuaWNlIFxcbmRyeSBicmljayBvZiBSQVcgb25lcyEnLFxuICAnTm9vZGxlcyEgXFxuTk8gY29va2luZyBmb3IgbWUnLFxuICAnSEFSRCBSQVcgTk9PRExFUydcbl1cblxuY29uc3QgY3VzdG9tZXJSYXdTdXNoaU1lc3NhZ2VzID0gW1xuICAnVGhleSBzYXkgeW91IGdvdCBcXG50aGUgYmVzdCByb2xscywgXFxuZ2ltbWUhIE5PIHNsaWNpbmchJyxcbiAgJ09uZSByb2xsIHBsZWFzZS4gXFxuSW4gT05FIHBpZWNlIScsXG4gICdBIGZ1bGwgc3VzaGkgcm9sbCBcXG5JIGNhbiBzd2FsbG93IGluIG9uZSBndWxwIScsXG4gICdTVVNISS4gTk8gQ1VUVElORy4nXG5dXG5cbmNvbnN0IGN1c3RvbWVyQ29va2VkTm9vZGxlTWVzc2FnZXMgPSBbXG4gICdJIHdhbnQgY29va2VkIFxcbm5vb2RsZXMsIE5PVyEnLFxuICAnSS4uLiBuZWVkLi4uIG15Li4uIFxcbmhvdC4uLiBub29kbGVzLi4uJyxcbiAgJ1JhbWVuIE5vb2RsZXMsIHRoZXkgXFxuYmV0dGVyIGJlIGhlcmUgc29vbi4nLFxuICBcIkRlY2VudHJhbGFuZCdzIGJlc3QgXFxucmFtZW4gaHVoPyBJJ2xsIHRyeSBzb21lXCIsXG4gICdBIGJvd2wgb2Ygbm9vZGxlcywgXFxucGxlYXNlJ1xuXVxuXG5jb25zdCBjdXN0b21lclNsaWNlZFN1c2hpTWVzc2FnZXMgPSBbXG4gICdzbGljZWQgc3VzaGkhIFxcbm9uZWdhaSBzaGltYWFhc3UhJyxcbiAgJ1N1c2hpLiBUaWMgVG9jLicsXG4gICdTdXNoaSBkYW1taXQhIFxcbldoYXQgcnlhIHdhaXRpbmcgZm9yPycsXG4gICdCZWVuIGV4cGxvcmluZyBcXG5EZWNlbnRyYWxhbmQgYWxsIGRheSwgXFxuc3VzaGkgcGxlYXNlJ1xuXVxuXG5jb25zdCBjdXN0b21lclRyYXNoTWVzc2FnZXMgPSBbXG4gICdOb29kbGVzISBHaW1tZSBcXG50aGUgc3Rpbmt5IG9uZXMhJyxcbiAgJ05vb2RsZXMsIHRoZSBidXJycnJycnJudFxcbiB0aGUgYmV0dGVyIScsXG4gICdXZWxsLWNvb2tlZCBub29kbGVzLiBcXG5CdXJudCwgYXMgeW91IHBlb3BsZSBzYXkuJyxcbiAgXCJUaGV5IHNheSB5b3Ugc2VsbFxcbiBnYXJiYWdlIGZvciBmb29kLFxcbiBJJ2QgbGlrZSBzb21lXCIsXG4gIFwiR2FyYmFnZSwgZG9uJ3QgY2FyZVxcbiB3aGF0IGtpbmRcIlxuXVxuXG5jb25zdCBjdXN0b21lckVtcHR5QmVlck1lc3NhZ2VzID0gW1xuICAnQW4gZW1wdHkgYmVlciBnbGFzcy4gXFxuU28gaXQgbG9va3MgbGlrZSBJIHdhcyBcXG53YWl0aW5nIGxvbmcnLFxuICAnSnVzdCBhIGdsYXNzLCBub3RoaW5nXFxuIGluIGl0LiBcXG5GZWVsaW5nIGV4aXN0ZW50aWFsLicsXG4gICdFbXB0eSBnbGFzcy4gQWxsIElcXG4gY2FuIGFmZm9yZC4nLFxuXVxuXG5jb25zdCBjdXN0b21lclllbGxvd0JlZXJNZXNzYWdlcyA9IFtcbiAgJ0kgd2FudCBhIGNvbGQgcmVndWxhclxcbiBiZWVyIScsXG4gICdJIGhlYXJkIHlvdSBkbyBjcmFmdFxcbiBiZWVyLCBnaW1tZSBhIHllbGxvdyEnLFxuICAnQmVlciEgQSBuaWNlIGNvbGQgbm9ybWFsXFxuIG9uZSEnLFxuXVxuXG5jb25zdCBjdXN0b21lclJlZEJlZXJNZXNzYWdlcyA9IFtcbiAgJ0kgd2FudCBhIFJFRCBiZWVyIScsXG4gICdSZWQgYmVlci4gSW0gYSBcXG5iaXQgb2YgYSBoaXBzdGVyIScsXG4gICdCZWVyIHJlZCBsaWtlIHRoZSBcXG5ibG9vZCBvZiBteSBlbmVtaWVzISBcXG5sb2wnLFxuXVxuXG5cbmNvbnN0IGN1c3RvbWVyR3JlZW5CZWVyTWVzc2FnZXMgPSBbXG4gICdJIGxpa2Ugd2VpcmQgc3R1ZmYsIFxcbmdyZWVuIGJlZXIhJyxcbiAgJ0dyZWVuIEJlZXIuIERvbnQgY2FyZSBcXG5hYm91dCB0aGUgdGFzdGUsIHdhbnQgXFxuYSBjb29sIHBpYyBmb3IgaW5zYWdyYW0nLFxuICAnQmVlciEgQSBuaWNlIGNvbGQgXFxuZ3JlZW4gb25lIScsXG5dXG5cblxuY29uc3QgY3VzdG9tZXJMb29raW5nTWVzc2FnZSA9IFtcbiAgJ0ltIGp1c3QgaGVyZSB0byB3YXRjaCcsXG4gICdJIGRvbnQgd2FudCBhbnl0aGluZy4gXFxuSnVzdCBoZXJlIHRvIG1ha2UgeW91IFxcbmZlZWwgdW5jb21mb3J0YWJsZS4nLFxuICAnTWFraW5nIGEgZG9jdW1lbnRhcnksIFxcbmtlZXAgd29ya2luZyBhcyBpZiBcXG5JbSBub3QgaGVyZScsXG5dXG5cblxuXG5jb25zdCBjdXN0b21lckNvcnJlY3REaXNoTWVzc2FnZXMgPSBbXG4gICdFeGNlbGxlbnQhJyxcbiAgJ05pY2VseSBkb25lIScsXG4gICcoXHUzMDAwXHVGRjNFXHUyMjA3XHVGRjNFKScsXG4gICdJdCB3YXMgYWJvdXQgdGltZS4uLicsXG4gICdOaWNlIGpvYiEnLFxuICAnSnVzdCB3aGF0IEkgbmVlZGVkIScsXG4gICdZdW1teSEnLFxuICAnWUVTISEhJyxcbiAgJyggXHUwMkQ4IFx1MDBCM1x1MDJEOCknLFxuICBcIkl0J3MgZmluZVwiXG5dXG5cbmNvbnN0IGN1c3RvbWVyV3JvbmdEaXNoTWVzc2FnZXMgPSBbXG4gICdDdXN0b21lciBzZXJ2aWNlIFxcblNVQ0tTIGhlcmUhJyxcbiAgJ0RvIHlvdSBldmVuIHVuZGVyc3RhbmQgXFxubXkgbGFuZ3VhZ2U/JyxcbiAgJ1doYXQgYSB3YXN0ZSBvZiB0aW1lIScsXG4gICdOTyEgTk8hIE5PIScsXG4gIFwiR3Vlc3Mgd2hvJ3MgYSBcXG5yYW1lbiBzaG9wIGNyaXRpYz9cIixcbiAgXCJJJ2xsIG5ldmVyIGNvbWUgXFxuYmFjayBoZXJlXCIsXG4gIFwiSSdsbCB0YWxrIFNPIGJhZCBcXG5hYm91dCB0aGlzIHBsYWNlXCIsXG4gICdcdTA0NDkoXHUwMEJBXHUwNDE0XHUwMEJBXHUwNDQ5KScsXG4gICdAIyYqIyQhJyxcbiAgJ1x1MEI2N1x1MEYzQ1x1MENBMFx1NzZDQVx1MENBMFx1MEYzRCdcbl1cblxuY29uc3QgcG9zaXRpb24xID0gVmVjdG9yMy5jcmVhdGUoMTMuNSwgMC43NSwgMTAuNSlcbmNvbnN0IHBvc2l0aW9uMiA9IFZlY3RvcjMuY3JlYXRlKDEzLjUsIDAuNzUsIDExLjUpXG5jb25zdCBwb3NpdGlvbjMgPSBWZWN0b3IzLmNyZWF0ZSgxMy41LCAwLjc1LCAxMi41KVxuY29uc3QgcG9zaXRpb240ID0gVmVjdG9yMy5jcmVhdGUoMTMuNSwgMC43NSwgMTMuNSlcblxuXG5jb25zdCBBQ0NFTEVSQVRJT05fUkFURTogbnVtYmVyID0gMC45OVxuXG5leHBvcnQgZnVuY3Rpb24gQ3JlYXRlQ3VzdG9tZXIoc2VhdE51bWJlcjogbnVtYmVyKSB7XG5cbiAgY29uc3QgY3VzdG9tZXIgPSBlbmdpbmUuYWRkRW50aXR5KClcblxuICBsZXQgcG9zaXRpb246IFZlY3RvcjMgPSBWZWN0b3IzLlplcm8oKVxuICBsZXQgY3VzdG9tZXJTeW5jSWQ6IFN5bmNFbnRpdHlJRHMgPSBTeW5jRW50aXR5SURzLkNVU1RPTUVSMVxuXG4gIGxldCBwcm9ncmVzc0JhcklkQTogU3luY0VudGl0eUlEcyA9IFN5bmNFbnRpdHlJRHMuUEJBUjFfQVxuICBsZXQgcHJvZ3Jlc3NCYXJJZEI6IFN5bmNFbnRpdHlJRHMgPSBTeW5jRW50aXR5SURzLlBCQVIxX0JcblxuICAvLyBUT0RPOiBkaWFsb2cgSURTXG5cbiAgc3dpdGNoIChzZWF0TnVtYmVyKSB7XG4gICAgY2FzZSAxOlxuICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbjE7XG4gICAgICBjdXN0b21lclN5bmNJZCA9IFN5bmNFbnRpdHlJRHMuQ1VTVE9NRVIxXG4gICAgICBwcm9ncmVzc0JhcklkQSA9IFN5bmNFbnRpdHlJRHMuUEJBUjFfQVxuICAgICAgcHJvZ3Jlc3NCYXJJZEIgPSBTeW5jRW50aXR5SURzLlBCQVIxX0JcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMjpcbiAgICAgIHBvc2l0aW9uID0gcG9zaXRpb24yO1xuICAgICAgY3VzdG9tZXJTeW5jSWQgPSBTeW5jRW50aXR5SURzLkNVU1RPTUVSMlxuICAgICAgcHJvZ3Jlc3NCYXJJZEEgPSBTeW5jRW50aXR5SURzLlBCQVIyX0FcbiAgICAgIHByb2dyZXNzQmFySWRCID0gU3luY0VudGl0eUlEcy5QQkFSMl9CXG4gICAgICBicmVhaztcbiAgICBjYXNlIDM6XG4gICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uMztcbiAgICAgIGN1c3RvbWVyU3luY0lkID0gU3luY0VudGl0eUlEcy5DVVNUT01FUjNcbiAgICAgIHByb2dyZXNzQmFySWRBID0gU3luY0VudGl0eUlEcy5QQkFSM19BXG4gICAgICBwcm9ncmVzc0JhcklkQiA9IFN5bmNFbnRpdHlJRHMuUEJBUjNfQlxuICAgICAgYnJlYWs7XG4gICAgY2FzZSA0OlxuICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbjQ7XG4gICAgICBjdXN0b21lclN5bmNJZCA9IFN5bmNFbnRpdHlJRHMuQ1VTVE9NRVI0XG4gICAgICBwcm9ncmVzc0JhcklkQSA9IFN5bmNFbnRpdHlJRHMuUEJBUjRfQVxuICAgICAgcHJvZ3Jlc3NCYXJJZEIgPSBTeW5jRW50aXR5SURzLlBCQVI0X0JcbiAgICAgIGJyZWFrO1xuICB9XG5cblxuXG4gIFRyYW5zZm9ybS5jcmVhdGUoY3VzdG9tZXIsIHtcbiAgICBwb3NpdGlvbjogcG9zaXRpb24sXG4gICAgc2NhbGU6IFZlY3RvcjMuY3JlYXRlKDAuNzUsIDAuNzUsIDAuNzUpLFxuICAgIHJvdGF0aW9uOiBRdWF0ZXJuaW9uLmZyb21FdWxlckRlZ3JlZXMoMCwgOTAsIDApXG4gIH0pXG5cbiAgLy8gVE9ETzogQWRkIFNoYXBlIHJhbmRvbWl6YXRpb25cbiAgR2x0ZkNvbnRhaW5lci5jcmVhdGUoY3VzdG9tZXIsIHtcbiAgICBzcmM6IFwiYXNzZXRzL21vZGVscy93YWxrZXJzL0Jsb2NrRG9nLmdsYlwiLFxuICB9KVxuICBBbmltYXRvci5jcmVhdGUoY3VzdG9tZXIpXG4gIEFuaW1hdG9yLnBsYXlTaW5nbGVBbmltYXRpb24oY3VzdG9tZXIsIFwiU2l0dGluZ1wiLCBmYWxzZSlcblxuICBzeW5jRW50aXR5KGN1c3RvbWVyLCBbR2x0ZkNvbnRhaW5lci5jb21wb25lbnRJZCwgVHJhbnNmb3JtLmNvbXBvbmVudElkLCBDdXN0b21lckRhdGEuY29tcG9uZW50SWQsIEFuaW1hdG9yLmNvbXBvbmVudElkLCBWaXNpYmlsaXR5Q29tcG9uZW50LmNvbXBvbmVudElkXSwgY3VzdG9tZXJTeW5jSWQpXG5cbiAgY29uc3QgcmFuZG9tVGltZSA9IFNjYWxhci5yYW5kb21SYW5nZSgyLCA0KVxuXG4gIGNvbnN0IHByb2dyZXNzQmFyID0gQ3JlYXRlUHJvZ3Jlc3NCYXIoY3VzdG9tZXIsIDEuMywgMTgwLCBmYWxzZSwgdHJ1ZSwgMC4xLCBwcm9ncmVzc0JhcklkQSwgcHJvZ3Jlc3NCYXJJZEIpXG5cblxuICBjb25zdCBzcGVlY2hCdWJibGUgPSBjcmVhdGVTcGVlY2hCdWJibGUoY3VzdG9tZXIsIHNlYXROdW1iZXIsIFwiUGxhY2Vob2xkZXJcIiwgMi4zKVxuXG4gIEN1c3RvbWVyRGF0YS5jcmVhdGUoY3VzdG9tZXIsIHtcbiAgICBtZXNzYWdlOiBcInBsYWNlSG9sZGVyXCIsXG4gICAgc3BlZWNoQnViYmxlOiBzcGVlY2hCdWJibGUsXG4gICAgcmVjZWl2ZWREaXNoOiBmYWxzZSxcbiAgICBzZWF0TnVtYmVyOiBzZWF0TnVtYmVyLFxuICAgIC8vcGxhdGU6IEN1c3RvbWVyUGxhdGVcbiAgICB0aW1lQmVmb3JlTGVhdmluZzogU2NhbGFyLnJhbmRvbVJhbmdlKDMsIDUpLFxuICAgIC8vdGltZUJlZm9yZUVudGVyaW5nOiByYW5kb21UaW1lLFxuICAgIHdhaXRpbmdUaW1lcjogcmFuZG9tVGltZSxcbiAgICBwcm9ncmVzc0JhcjogcHJvZ3Jlc3NCYXJcbiAgfSlcblxuICBWaXNpYmlsaXR5Q29tcG9uZW50LmNyZWF0ZU9yUmVwbGFjZShjdXN0b21lciwgeyB2aXNpYmxlOiBmYWxzZSB9KVxuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdW1tb25DdXN0b21lcigpIHtcbiAgbGV0IHRha2VuU2VhdHM6IG51bWJlcltdID0gW11cblxuICBjb25zdCBbZ2FtZUVudGl0aWVzXSA9IGVuZ2luZS5nZXRFbnRpdGllc1dpdGgoR2FtZURhdGEpXG4gIGNvbnN0IGdhbWVFbnRpdHkgPSBnYW1lRW50aXRpZXNbMF1cbiAgaWYgKCFnYW1lRW50aXR5IHx8ICFHYW1lRGF0YS5oYXMoZ2FtZUVudGl0eSkpIHtcbiAgICBjb25zb2xlLmxvZyhcIk5PIEdBTUUgRU5USVRZXCIpXG4gICAgcmV0dXJuXG4gIH1cbiAgY29uc3QgZ2FtZURhdGEgPSBHYW1lRGF0YS5nZXRNdXRhYmxlKGdhbWVFbnRpdHkpXG5cblxuICBsZXQgY3VzdG9tZXJDb3VudCA9IDA7XG4gIGZvciAoY29uc3QgW2N1c3RvbWVyXSBvZiBlbmdpbmUuZ2V0RW50aXRpZXNXaXRoKEN1c3RvbWVyRGF0YSkpIHtcbiAgICBpZiAoQ3VzdG9tZXJEYXRhLmdldChjdXN0b21lcikuYWN0aXZlICYmIEN1c3RvbWVyRGF0YS5nZXQoY3VzdG9tZXIpLnJlY2VpdmVkRGlzaCA9PSBmYWxzZSkge1xuICAgICAgY3VzdG9tZXJDb3VudCsrO1xuICAgICAgdGFrZW5TZWF0cy5wdXNoKEN1c3RvbWVyRGF0YS5nZXQoY3VzdG9tZXIpLnNlYXROdW1iZXIpXG4gICAgfVxuICB9XG5cbiAgbGV0IHNlYXROdW1iZXI6IG51bWJlciA9IDBcblxuICBpZiAoY3VzdG9tZXJDb3VudCA+IDQpIHJldHVyblxuXG5cbiAgaWYgKGdhbWVEYXRhLnBsYXllclNjb3JlID49IDE1MCkge1xuICAgIGlmICghdGFrZW5TZWF0cy5pbmNsdWRlcygxKSkge1xuICAgICAgc2VhdE51bWJlciA9IDFcbiAgICB9IGVsc2UgaWYgKCF0YWtlblNlYXRzLmluY2x1ZGVzKDIpKSB7XG4gICAgICBzZWF0TnVtYmVyID0gMlxuICAgIH0gZWxzZSBpZiAoIXRha2VuU2VhdHMuaW5jbHVkZXMoMykpIHtcbiAgICAgIHNlYXROdW1iZXIgPSAzXG4gICAgfSBlbHNlIGlmICghdGFrZW5TZWF0cy5pbmNsdWRlcyg0KSkge1xuICAgICAgc2VhdE51bWJlciA9IDRcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5sb2coXCJGVUxMWSBTVEFGRkVEIFRBQkxFUywgY3VzdG9tZXIgY291bnQ6XCIsIGN1c3RvbWVyQ291bnQpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgfSBlbHNlIGlmIChnYW1lRGF0YS5wbGF5ZXJTY29yZSA+PSA1MCkge1xuICAgIGNvbnNvbGUubG9nKFwiQ1VTVE9NRVIgQ09VTlQ6IFwiLCBjdXN0b21lckNvdW50LCBcIlRBS0VOIFNFQVRTOiBcIiwgdGFrZW5TZWF0cylcbiAgICBpZiAoIXRha2VuU2VhdHMuaW5jbHVkZXMoMSkpIHtcbiAgICAgIHNlYXROdW1iZXIgPSAxXG4gICAgfSBlbHNlIGlmICghdGFrZW5TZWF0cy5pbmNsdWRlcygyKSkge1xuICAgICAgc2VhdE51bWJlciA9IDJcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5sb2coXCJGVUxMWSBTVEFGRkVEIFRBQkxFUywgY3VzdG9tZXIgY291bnQ6XCIsIGN1c3RvbWVyQ291bnQpXG4gICAgICByZXR1cm5cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGN1c3RvbWVyQ291bnQgPCAxKSB7XG4gICAgICBzZWF0TnVtYmVyID0gMVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZyhcIkZVTExZIFNUQUZGRUQgVEFCTEVTLCBjdXN0b21lciBjb3VudDpcIiwgY3VzdG9tZXJDb3VudClcbiAgICAgIHJldHVyblxuICAgIH1cbiAgfVxuXG4gIGNvbnNvbGUubG9nKFwiU1VNTU9OSU5HIE5FVyBDVVNUT01FUiwgU0VBVCBOVU1CRVI6IFwiLCBzZWF0TnVtYmVyLCBcIlRBS0VOIFNFQVRTIFwiLCB0YWtlblNlYXRzKVxuXG4gIGZvciAoY29uc3QgW2N1c3RvbWVyXSBvZiBlbmdpbmUuZ2V0RW50aXRpZXNXaXRoKEN1c3RvbWVyRGF0YSkpIHtcbiAgICBjb25zb2xlLmxvZyhcIklURVJBVElORyBPVkVSIENVU1RPTUVSU1wiKVxuICAgIGlmIChDdXN0b21lckRhdGEuZ2V0KGN1c3RvbWVyKS5zZWF0TnVtYmVyID09IHNlYXROdW1iZXIpIHtcbiAgICAgIHJlc2V0Q3VzdG9tZXIoY3VzdG9tZXIpXG4gICAgfVxuICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGhpZGVDdXN0b21lcihjdXN0b21lcjogRW50aXR5KSB7XG5cbiAgVmlzaWJpbGl0eUNvbXBvbmVudC5jcmVhdGVPclJlcGxhY2UoY3VzdG9tZXIsIHsgdmlzaWJsZTogZmFsc2UgfSlcblxuICBjb25zdCBjdXN0b21lckRhdGEgPSBDdXN0b21lckRhdGEuZ2V0TXV0YWJsZShjdXN0b21lcilcblxuICBjb25zb2xlLmxvZyhcIkhJRElORyBDVVNUT01FUjogXCIsIGN1c3RvbWVyRGF0YS5zZWF0TnVtYmVyKVxuXG5cbiAgY3VzdG9tZXJEYXRhLmFjdGl2ZSA9IGZhbHNlXG4gIGN1c3RvbWVyRGF0YS5yZWNlaXZlZERpc2ggPSBmYWxzZVxuXG4gIGlmIChjdXN0b21lckRhdGEucHJvZ3Jlc3NCYXIpIHtcbiAgICBIaWRlUHJvZ3Jlc3NCYXIoY3VzdG9tZXJEYXRhLnByb2dyZXNzQmFyKVxuICB9XG5cbiAgSGlkZVNwZWVjaEJ1YmJsZShjdXN0b21lckRhdGEuc3BlZWNoQnViYmxlKVxuXG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc2V0Q3VzdG9tZXIoY3VzdG9tZXI6IEVudGl0eSkge1xuXG4gIGNvbnN0IGN1c3RvbWVyRGF0YSA9IEN1c3RvbWVyRGF0YS5nZXRNdXRhYmxlKGN1c3RvbWVyKVxuXG4gIGN1c3RvbWVyRGF0YS5hY3RpdmUgPSB0cnVlXG4gIGN1c3RvbWVyRGF0YS53YWl0aW5nVGltZXIgPSA1XG4gIGN1c3RvbWVyRGF0YS50aW1lQmVmb3JlTGVhdmluZyA9IFNjYWxhci5yYW5kb21SYW5nZSgzLCA1KVxuICAvL2N1c3RvbWVyRGF0YS50aW1lQmVmb3JlRW50ZXJpbmcgPSAxMFxuICBjdXN0b21lckRhdGEucmVjZWl2ZWREaXNoID0gZmFsc2VcblxuICBWaXNpYmlsaXR5Q29tcG9uZW50LmRlbGV0ZUZyb20oY3VzdG9tZXIpXG4gIC8vQW5pbWF0b3IucGxheVNpbmdsZUFuaW1hdGlvbihjdXN0b21lciwgXCJTaXR0aW5nXCIsIGZhbHNlKVxuXG4gIFJlc2V0UHJvZ3Jlc3NCYXIoY3VzdG9tZXJEYXRhLnByb2dyZXNzQmFyKVxuXG4gIGNvbnN0IGRpc2ggPSBNYXRoLmZsb29yKFNjYWxhci5yYW5kb21SYW5nZSgwLCA5KSlcblxuICBjb25zb2xlLmxvZyhcIkRJU0ggU0VMRUNURUQ6IFwiLCBkaXNoKVxuXG4gIGxldCBtZXNzYWdlczogc3RyaW5nW11cbiAgc3dpdGNoIChkaXNoKSB7XG4gICAgY2FzZSAwOlxuICAgICAgbWVzc2FnZXMgPSBjdXN0b21lclJhd05vb2RsZU1lc3NhZ2VzXG4gICAgICBicmVha1xuICAgIGNhc2UgMTpcbiAgICAgIG1lc3NhZ2VzID0gY3VzdG9tZXJSYXdTdXNoaU1lc3NhZ2VzXG4gICAgICBicmVha1xuICAgIGNhc2UgMjpcbiAgICAgIG1lc3NhZ2VzID0gY3VzdG9tZXJDb29rZWROb29kbGVNZXNzYWdlc1xuICAgICAgYnJlYWtcbiAgICBjYXNlIDM6XG4gICAgICBtZXNzYWdlcyA9IGN1c3RvbWVyU2xpY2VkU3VzaGlNZXNzYWdlc1xuICAgICAgYnJlYWtcbiAgICBjYXNlIDQ6XG4gICAgICBtZXNzYWdlcyA9IGN1c3RvbWVyVHJhc2hNZXNzYWdlc1xuICAgICAgYnJlYWtcbiAgICBjYXNlIDU6XG4gICAgICBtZXNzYWdlcyA9IGN1c3RvbWVyRW1wdHlCZWVyTWVzc2FnZXNcbiAgICAgIGJyZWFrXG4gICAgY2FzZSA2OlxuICAgICAgbWVzc2FnZXMgPSBjdXN0b21lclllbGxvd0JlZXJNZXNzYWdlc1xuICAgICAgYnJlYWtcbiAgICBjYXNlIDc6XG4gICAgICBtZXNzYWdlcyA9IGN1c3RvbWVyUmVkQmVlck1lc3NhZ2VzXG4gICAgICBicmVha1xuICAgIGNhc2UgODpcbiAgICAgIG1lc3NhZ2VzID0gY3VzdG9tZXJHcmVlbkJlZXJNZXNzYWdlc1xuICAgICAgYnJlYWtcbiAgICBkZWZhdWx0OlxuICAgICAgbWVzc2FnZXMgPSBjdXN0b21lckxvb2tpbmdNZXNzYWdlXG4gICAgICBicmVha1xuICB9XG5cbiAgbGV0IHJhbmRvbUluZGV4ID0gTWF0aC5mbG9vcihTY2FsYXIucmFuZG9tUmFuZ2UoMCwgbWVzc2FnZXMubGVuZ3RoKSlcblxuICB1cGRhdGVTcGVlY2hCdWJibGUoY3VzdG9tZXJEYXRhLnNwZWVjaEJ1YmJsZSwgbWVzc2FnZXNbcmFuZG9tSW5kZXhdLCBTcGVlY2hCdWJibGVUeXBlLk5ldXRyYWwpXG5cblxuICBjb25zb2xlLmxvZyhcIk5FVyBURVhUOiBcIiwgbWVzc2FnZXNbcmFuZG9tSW5kZXhdKVxuXG4gIGN1c3RvbWVyRGF0YS5kaXNoID0gZGlzaFxuICBjdXN0b21lckRhdGEubWVzc2FnZSA9IG1lc3NhZ2VzW3JhbmRvbUluZGV4XVxuXG59XG5cblxuXG5leHBvcnQgZnVuY3Rpb24gQ3VzdG9tZXJTeXN0ZW0oZHQ6IG51bWJlcikge1xuXG4gIC8vIHVwZGF0ZSBwcm9ncmVzcyBiYXJzXG4gIGZvciAoY29uc3QgW2VudGl0eV0gb2YgZW5naW5lLmdldEVudGl0aWVzV2l0aChDdXN0b21lckRhdGEpKSB7XG5cbiAgICBjb25zdCBjdXN0b21lckRhdGEgPSBDdXN0b21lckRhdGEuZ2V0TXV0YWJsZShlbnRpdHkpXG5cbiAgICBpZiAoY3VzdG9tZXJEYXRhLmFjdGl2ZSAmJiBjdXN0b21lckRhdGEucHJvZ3Jlc3NCYXIgJiYgUHJvZ3Jlc3NCYXIuaGFzKGN1c3RvbWVyRGF0YS5wcm9ncmVzc0JhcikpIHtcblxuICAgICAgY29uc3QgcHJvZ3Jlc3NCYXIgPSBQcm9ncmVzc0Jhci5nZXRNdXRhYmxlKGN1c3RvbWVyRGF0YS5wcm9ncmVzc0JhcilcbiAgICAgIGlmIChwcm9ncmVzc0Jhci5zcGVlZCA+IDAgJiYgcHJvZ3Jlc3NCYXIucmF0aW8gPD0gMCkge1xuICAgICAgICAvLyBUaW1lJ3MgdXAgZm9yIHRoaXMgb3JkZXIgc28gd2UgZmVlZCBhIHdyb25nIGRpc2ggb24gcHVycG9zZVxuXG4gICAgICAgIGxldCB3cm9uZ0Rpc2ggPSBjdXN0b21lckRhdGEuZGlzaCArIDFcbiAgICAgICAgaWYgKHdyb25nRGlzaCA9PSBPYmplY3Qua2V5cyhJbmdyZWRpZW50VHlwZSkubGVuZ3RoKSB7XG4gICAgICAgICAgd3JvbmdEaXNoID0gMFxuICAgICAgICB9XG5cbiAgICAgICAgZGVsaXZlck9yZGVyKHdyb25nRGlzaCwgZW50aXR5KVxuXG4gICAgICAgIEhpZGVQcm9ncmVzc0JhcihjdXN0b21lckRhdGEucHJvZ3Jlc3NCYXIpXG5cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY3VzdG9tZXJEYXRhLnJlY2VpdmVkRGlzaCAmJiBjdXN0b21lckRhdGEud2FpdGluZ1RpbWVyID4gMCkge1xuICAgICAgY3VzdG9tZXJEYXRhLndhaXRpbmdUaW1lciAtPSBkdFxuXG4gICAgICBpZiAoY3VzdG9tZXJEYXRhLndhaXRpbmdUaW1lciA8PSAwKSB7XG5cbiAgICAgICAgaGlkZUN1c3RvbWVyKGVudGl0eSlcblxuICAgICAgICAvL2VuZ2luZS5yZW1vdmVFbnRpdHlXaXRoQ2hpbGRyZW4oZW50aXR5KVxuXG4gICAgICB9XG5cblxuICAgIH1cblxuXG4gIH1cblxuICAvLyBhZGQgbmV3IGN1c3RvbWVyc1xuICBmb3IgKGNvbnN0IFtlbnRpdHldIG9mIGVuZ2luZS5nZXRFbnRpdGllc1dpdGgoR2FtZURhdGEpKSB7XG5cbiAgICBjb25zdCBnYW1lRGF0YSA9IEdhbWVEYXRhLmdldE11dGFibGUoZW50aXR5KVxuXG4gICAgZ2FtZURhdGEuY3VzdG9tZXJUaW1lciAtPSBkdFxuICAgIGlmIChnYW1lRGF0YS5jdXN0b21lclRpbWVyIDw9IDApIHtcbiAgICAgIHN1bW1vbkN1c3RvbWVyKClcbiAgICAgIGdhbWVEYXRhLmN1c3RvbWVyVGltZXIgPSBnYW1lRGF0YS5jdXN0b21lckludGVydmFsXG4gICAgICBnYW1lRGF0YS5jdXN0b21lckludGVydmFsID0gZ2FtZURhdGEuY3VzdG9tZXJJbnRlcnZhbCAqIEFDQ0VMRVJBVElPTl9SQVRFXG4gICAgICBjb25zb2xlLmxvZyhcIk5FVyBDVVNUT01FUiBJTlRFUlZBTFwiLCBnYW1lRGF0YS5jdXN0b21lckludGVydmFsKVxuICAgIH1cbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBkZWxpdmVyT3JkZXIoZGlzaFR5cGU6IG51bWJlciwgY3VzdG9tZXI6IEVudGl0eSwgZGlzaD86IEVudGl0eSkge1xuXG5cbiAgY29uc3QgY3VzdG9tZXJEYXRhID0gQ3VzdG9tZXJEYXRhLmdldE11dGFibGUoY3VzdG9tZXIpXG5cbiAgaWYgKCFjdXN0b21lckRhdGEuYWN0aXZlIHx8IGN1c3RvbWVyRGF0YS5yZWNlaXZlZERpc2gpIHJldHVyblxuXG4gIGlmIChjdXN0b21lckRhdGEucHJvZ3Jlc3NCYXIpIHtcbiAgICBIaWRlUHJvZ3Jlc3NCYXIoY3VzdG9tZXJEYXRhLnByb2dyZXNzQmFyKVxuICB9XG5cblxuICAvLyBpZiAoY3VzdG9tZXJEYXRhLnNwZWVjaEJ1YmJsZSkge1xuICAvLyAgIFJlbW92ZVNwZWVjaEJ1YmJsZShjdXN0b21lckRhdGEuc3BlZWNoQnViYmxlKVxuICAvLyB9XG5cblxuICBjb25zdCBbZ2FtZUVudGl0aWVzXSA9IGVuZ2luZS5nZXRFbnRpdGllc1dpdGgoR2FtZURhdGEpXG4gIGNvbnN0IGdhbWVFbnRpdHkgPSBnYW1lRW50aXRpZXNbMF1cbiAgaWYgKCFnYW1lRW50aXR5IHx8ICFHYW1lRGF0YS5oYXMoZ2FtZUVudGl0eSkpIHJldHVyblxuICBjb25zdCBnYW1lRGF0YSA9IEdhbWVEYXRhLmdldE11dGFibGUoZ2FtZUVudGl0eSlcblxuXG4gIGlmIChjdXN0b21lckRhdGEuZGlzaCA9PSBkaXNoVHlwZSkge1xuICAgIC8vIENvcnJlY3QgZGlzaFxuICAgIGdhbWVEYXRhLnBsYXllclNjb3JlICs9IDEwXG4gICAgdXBkYXRlU2NvcmUoKVxuICAgIGNvbnN0IG1lc3NhZ2UgPSBjdXN0b21lckNvcnJlY3REaXNoTWVzc2FnZXNbTWF0aC5mbG9vcihTY2FsYXIucmFuZG9tUmFuZ2UoMCwgY3VzdG9tZXJDb3JyZWN0RGlzaE1lc3NhZ2VzLmxlbmd0aCkpXVxuICAgIGN1c3RvbWVyRGF0YS5tZXNzYWdlID0gbWVzc2FnZVxuXG4gICAgdXBkYXRlU3BlZWNoQnViYmxlKGN1c3RvbWVyRGF0YS5zcGVlY2hCdWJibGUsIG1lc3NhZ2UsIFNwZWVjaEJ1YmJsZVR5cGUuR29vZClcblxuICAgIC8vcGxheVNvdW5kKFwic291bmRzL2Vycm9yLm1wM1wiLCBmYWxzZSwgZ2V0UGxheWVyUG9zaXRpb24oKSlcblxuXG4gIH0gZWxzZSB7XG4gICAgLy8gV3JvbmcgZGlzaFxuXG4gICAgY29uc29sZS5sb2coXCJXUk9ORyBESVNIOiBcIiwgZGlzaFR5cGUsIFwiIEVYUEVDVEVEOiBcIiwgY3VzdG9tZXJEYXRhLmRpc2gpXG5cbiAgICBnYW1lRGF0YS5wbGF5ZXJNaXNzZXMgKz0gMVxuICAgIHVwZGF0ZU1pc3NlcygpXG4gICAgY29uc3QgbWVzc2FnZSA9IGN1c3RvbWVyV3JvbmdEaXNoTWVzc2FnZXNbTWF0aC5mbG9vcihTY2FsYXIucmFuZG9tUmFuZ2UoMCwgY3VzdG9tZXJXcm9uZ0Rpc2hNZXNzYWdlcy5sZW5ndGgpKV1cbiAgICBjdXN0b21lckRhdGEubWVzc2FnZSA9IG1lc3NhZ2VcblxuICAgIHVwZGF0ZVNwZWVjaEJ1YmJsZShjdXN0b21lckRhdGEuc3BlZWNoQnViYmxlLCBtZXNzYWdlLCBTcGVlY2hCdWJibGVUeXBlLkJhZClcblxuICAgIHBsYXlTb3VuZChcInNvdW5kcy9lcnJvci5tcDNcIiwgZmFsc2UsIGdldFBsYXllclBvc2l0aW9uKCkpXG5cbiAgICBpZiAoZ2FtZURhdGEucGxheWVyTWlzc2VzIDw9IDMpIHtcblxuICAgICAgdXRpbHMudGltZXJzLnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICByZXN0YXJ0R2FtZSgpXG5cbiAgICAgIH0sIDEwMDApXG5cblxuICAgIH1cblxuICAgIC8vIGNvbnN0IHNwZWVjaEJ1YmJsZSA9IGNyZWF0ZVNwZWVjaEJ1YmJsZShjdXN0b21lciwgbWVzc2FnZSwgMi4zLCBTcGVlY2hCdWJibGVUeXBlLkJhZClcbiAgICAvLyBjdXN0b21lckRhdGEuc3BlZWNoQnViYmxlID0gc3BlZWNoQnViYmxlXG4gIH1cblxuXG4gIGN1c3RvbWVyRGF0YS5yZWNlaXZlZERpc2ggPSB0cnVlXG5cbiAgaWYgKGRpc2gpIHtcbiAgICB1dGlscy50aW1lcnMuc2V0VGltZW91dCgoKSA9PiB7XG5cbiAgICAgIGlmIChCZWVyR2xhc3MuaGFzKGRpc2gpKSB7XG5cbiAgICAgICAgQmVlckdsYXNzLmdldE11dGFibGUoZGlzaCkuZmlsbGVkID0gZmFsc2VcbiAgICAgICAgQmVlckdsYXNzLmdldE11dGFibGUoZGlzaCkuYmVlclR5cGUgPSBCZWVyVHlwZS5OT05FXG4gICAgICAgIEdyYWJhYmxlT2JqZWN0Q29tcG9uZW50LmdldE11dGFibGUoZGlzaCkudHlwZSA9IEluZ3JlZGllbnRUeXBlLkJlZXJHbGFzc1xuICAgICAgICBBbmltYXRvci5wbGF5U2luZ2xlQW5pbWF0aW9uKGRpc2gsIFwiQmxhbmtcIilcbiAgICAgICAgcGxheVNvdW5kKFwic291bmRzL3N3YWxsb3cubXAzXCIsIGZhbHNlLCBnZXRQbGF5ZXJQb3NpdGlvbigpKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW5naW5lLnJlbW92ZUVudGl0eShkaXNoKVxuICAgICAgfVxuXG5cbiAgICB9LCAzMDAwKVxuXG4gIH1cblxufVxuXG5cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVNjb3JlKCkge1xuXG4gIGNvbnN0IFtnYW1lRW50aXRpZXNdID0gZW5naW5lLmdldEVudGl0aWVzV2l0aChHYW1lRGF0YSlcbiAgY29uc3QgZ2FtZUVudGl0eSA9IGdhbWVFbnRpdGllc1swXVxuICBpZiAoIWdhbWVFbnRpdHkgfHwgIUdhbWVEYXRhLmhhcyhnYW1lRW50aXR5KSkgcmV0dXJuXG4gIGNvbnN0IGdhbWVEYXRhID0gR2FtZURhdGEuZ2V0TXV0YWJsZShnYW1lRW50aXR5KVxuXG5cbiAgY29uc3Qgc2NvcmVFbnRpdHkgPSBlbmdpbmUuZ2V0RW50aXR5T3JOdWxsQnlOYW1lKFwiU2NvcmVcIilcbiAgaWYgKHNjb3JlRW50aXR5KSB7XG4gICAgY29uc3Qgc2NvcmVUZXh0ID0gVGV4dFNoYXBlLmdldE11dGFibGUoc2NvcmVFbnRpdHkpXG4gICAgc2NvcmVUZXh0LnRleHQgPSBcIlNjb3JlOiBcIiArIGdhbWVEYXRhLnBsYXllclNjb3JlLnRvU3RyaW5nKClcbiAgfVxuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVNaXNzZXMoKSB7XG5cbiAgY29uc3QgW2dhbWVFbnRpdGllc10gPSBlbmdpbmUuZ2V0RW50aXRpZXNXaXRoKEdhbWVEYXRhKVxuICBjb25zdCBnYW1lRW50aXR5ID0gZ2FtZUVudGl0aWVzWzBdXG4gIGlmICghZ2FtZUVudGl0eSB8fCAhR2FtZURhdGEuaGFzKGdhbWVFbnRpdHkpKSByZXR1cm5cbiAgY29uc3QgZ2FtZURhdGEgPSBHYW1lRGF0YS5nZXRNdXRhYmxlKGdhbWVFbnRpdHkpXG5cblxuICBjb25zdCBtaXNzZXNFbnRpdHkgPSBlbmdpbmUuZ2V0RW50aXR5T3JOdWxsQnlOYW1lKFwiTWlzc2VzXCIpXG4gIGlmIChtaXNzZXNFbnRpdHkpIHtcbiAgICBjb25zdCBtaXNzZXNUZXh0ID0gVGV4dFNoYXBlLmdldE11dGFibGUobWlzc2VzRW50aXR5KVxuICAgIG1pc3Nlc1RleHQudGV4dCA9IFwiTWlzc2VzOiBcIiArIGdhbWVEYXRhLnBsYXllck1pc3Nlcy50b1N0cmluZygpXG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gcmVzdGFydEdhbWUoKSB7XG5cbiAgY29uc3QgW2dhbWVFbnRpdGllc10gPSBlbmdpbmUuZ2V0RW50aXRpZXNXaXRoKEdhbWVEYXRhKVxuICBjb25zdCBnYW1lRW50aXR5ID0gZ2FtZUVudGl0aWVzWzBdXG4gIGlmICghZ2FtZUVudGl0eSB8fCAhR2FtZURhdGEuaGFzKGdhbWVFbnRpdHkpKSByZXR1cm5cbiAgY29uc3QgZ2FtZURhdGEgPSBHYW1lRGF0YS5nZXRNdXRhYmxlKGdhbWVFbnRpdHkpXG5cblxuICBnYW1lRGF0YS5wbGF5ZXJTY29yZSA9IDBcbiAgZ2FtZURhdGEucGxheWVyTWlzc2VzID0gMFxuICBnYW1lRGF0YS5jdXN0b21lclRpbWVyID0gMlxuICBnYW1lRGF0YS5jdXN0b21lckludGVydmFsID0gMTBcblxuICBjb25zdCBjdXN0b21lcnMgPSBlbmdpbmUuZ2V0RW50aXRpZXNXaXRoKEN1c3RvbWVyRGF0YSlcbiAgZm9yIChjb25zdCBbY3VzdG9tZXJdIG9mIGN1c3RvbWVycykge1xuICAgIGhpZGVDdXN0b21lcihjdXN0b21lcilcbiAgfVxuXG4gIHBsYXlTb3VuZChcInNvdW5kcy9lcnJvci5tcDNcIiwgZmFsc2UsIGdldFBsYXllclBvc2l0aW9uKCkpXG5cbiAgdXBkYXRlU2NvcmUoKVxuICB1cGRhdGVNaXNzZXMoKVxufSIsICJpbXBvcnQgeyBlbmdpbmUsIEFuaW1hdG9yLCBFbnRpdHksIEdsdGZDb250YWluZXIsIFBvaW50ZXJFdmVudHMsIElucHV0QWN0aW9uLCBQb2ludGVyRXZlbnRUeXBlIH0gZnJvbSBcIkBkY2wvZWNzXCI7XG5pbXBvcnQgeyBQb3REYXRhLCBTb3VwU3RhdGUsIENvb2tpbmcsIFN5bmNFbnRpdHlJRHMsIEluZ3JlZGllbnRUeXBlLCBHcmFiYWJsZU9iamVjdENvbXBvbmVudCB9IGZyb20gJy4uL2RlZmluaXRpb25zJ1xuaW1wb3J0IHsgcGlja1VwSXRlbSB9IGZyb20gXCIuL3BpY2tBbmREcm9wXCI7XG5pbXBvcnQgeyBzeW5jRW50aXR5LCBwYXJlbnRFbnRpdHkgfSBmcm9tICdAZGNsL3Nkay9uZXR3b3JrJ1xuaW1wb3J0IHsgQ3JlYXRlUHJvZ3Jlc3NCYXIsIEhpZGVQcm9ncmVzc0JhciwgUmVzZXRQcm9ncmVzc0JhciB9IGZyb20gXCIuL3Byb2dyZXNzQmFyc1wiO1xuXG5cbmNvbnN0IENPT0tFRF9BRlRFUjogbnVtYmVyID0gNVxuY29uc3QgQlVSTlRfQUZURVI6IG51bWJlciA9IDEwXG5cblxuXG5cbmV4cG9ydCBmdW5jdGlvbiBpbnN0YW5jZVBvdChwb3Q6IEVudGl0eSwgaWQ6IG51bWJlciwgcGJpZDE6IG51bWJlciwgcGJpZDI6IG51bWJlcikge1xuXG4gIHN5bmNFbnRpdHkoXG4gICAgcG90LFxuICAgIFtDb29raW5nLmNvbXBvbmVudElkLCBQb3REYXRhLmNvbXBvbmVudElkXSxcbiAgICBpZFxuICApXG5cbiAgY29uc3QgcHJvZ3Jlc3NCYXIgPSBDcmVhdGVQcm9ncmVzc0Jhcihwb3QsIDEsIDI3MCwgdHJ1ZSwgdHJ1ZSwgMSwgcGJpZDEsIHBiaWQyKVxuXG5cbiAgUG90RGF0YS5jcmVhdGUocG90LCB7XG4gICAgcHJvZ3Jlc3NCYXI6IHByb2dyZXNzQmFyLFxuICB9KVxuXG4gIFBvaW50ZXJFdmVudHMuY3JlYXRlKHBvdCwge1xuICAgIHBvaW50ZXJFdmVudHM6IFtcbiAgICAgIHtcbiAgICAgICAgZXZlbnRUeXBlOiBQb2ludGVyRXZlbnRUeXBlLlBFVF9ET1dOLFxuICAgICAgICBldmVudEluZm86IHtcbiAgICAgICAgICBob3ZlclRleHQ6ICdBZGQnLFxuICAgICAgICAgIG1heERpc3RhbmNlOiA1LFxuICAgICAgICAgIGJ1dHRvbjogSW5wdXRBY3Rpb24uSUFfUFJJTUFSWVxuICAgICAgICB9XG4gICAgICB9XG4gICAgXVxuICB9KVxuXG5cblxuXG59XG5cblxuXG5cbmV4cG9ydCBmdW5jdGlvbiBwaWNrRm9vZChwb3Q6IEVudGl0eSkge1xuXG4gIGNvbnN0IHBvdERhdGEgPSBQb3REYXRhLmdldE11dGFibGUocG90KVxuICBpZiAocG90RGF0YSAmJiBwb3REYXRhLmhhc0luZ3JlZGllbnQgJiYgcG90RGF0YS5hdHRhY2hlZEVudGl0eSAhPT0gdW5kZWZpbmVkKSB7XG5cbiAgICBjb25zb2xlLmxvZyhcIlBJQ0tJTkcgVVAgRlJPTSBQT1RcIilcbiAgICBwaWNrVXBJdGVtKHBvdERhdGEuYXR0YWNoZWRFbnRpdHkpXG4gICAgcG90RGF0YS5oYXNJbmdyZWRpZW50ID0gZmFsc2VcbiAgICAvL3BvdERhdGEuYXR0YWNoZWRFbnRpdHkgPSB1bmRlZmluZWRcbiAgICBwb3REYXRhLnN0YXRlID0gU291cFN0YXRlLlJhd1xuXG4gICAgaWYgKENvb2tpbmcuaGFzKHBvdCkpIHtcbiAgICAgIENvb2tpbmcuZGVsZXRlRnJvbShwb3QpXG4gICAgfVxuXG4gICAgSGlkZVByb2dyZXNzQmFyKHBvdERhdGEucHJvZ3Jlc3NCYXIpXG5cbiAgfVxuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdGFydENvb2tpbmcocG90OiBFbnRpdHkpIHtcblxuICBpZiAoQ29va2luZy5oYXMocG90KSAmJiBDb29raW5nLmdldChwb3QpLmFjdGl2ZSkgcmV0dXJuXG5cblxuXG4gIENvb2tpbmcuY3JlYXRlT3JSZXBsYWNlKHBvdClcblxuICBQb3REYXRhLmdldE11dGFibGUocG90KVxuXG4gIFJlc2V0UHJvZ3Jlc3NCYXIoUG90RGF0YS5nZXRNdXRhYmxlKHBvdCkucHJvZ3Jlc3NCYXIpXG5cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gY29va1N5c3RlbShkdDogbnVtYmVyKSB7XG5cbiAgZm9yIChjb25zdCBbZW50aXR5LCBfY29va2luZywgX3BvdERhdGFdIG9mIGVuZ2luZS5nZXRFbnRpdGllc1dpdGgoQ29va2luZywgUG90RGF0YSkpIHtcbiAgICBpZiAoX2Nvb2tpbmcuYWN0aXZlICYmIF9wb3REYXRhLmhhc0luZ3JlZGllbnQpIHtcblxuICAgICAgY29uc3QgY29va2luZyA9IENvb2tpbmcuZ2V0TXV0YWJsZShlbnRpdHkpXG5cblxuXG4gICAgICBjb29raW5nLnRpbWUgKz0gZHRcblxuICAgICAgaWYgKGNvb2tpbmcudGltZSA+IENPT0tFRF9BRlRFUiAmJiBfcG90RGF0YS5oYXNJbmdyZWRpZW50ICYmIF9wb3REYXRhLnN0YXRlID09PSBTb3VwU3RhdGUuUmF3KSB7XG5cbiAgICAgICAgY29uc29sZS5sb2coXCJDT09LRUQhXCIpXG5cbiAgICAgICAgY29uc3QgcG90RGF0YSA9IFBvdERhdGEuZ2V0TXV0YWJsZShlbnRpdHkpXG4gICAgICAgIHBvdERhdGEuc3RhdGUgPSBTb3VwU3RhdGUuQ29va2VkXG4gICAgICAgIGNvbnN0IGZvb2QgPSBwb3REYXRhLmF0dGFjaGVkRW50aXR5XG4gICAgICAgIGlmIChHbHRmQ29udGFpbmVyLmhhcyhmb29kKSAmJiBHcmFiYWJsZU9iamVjdENvbXBvbmVudC5oYXMoZm9vZCkpIHtcbiAgICAgICAgICBHbHRmQ29udGFpbmVyLmdldE11dGFibGUoZm9vZCkuc3JjID0gXCJhc3NldHMvbW9kZWxzL1BsYXRlTm9vZGxlcy5nbGJcIlxuICAgICAgICAgIEdyYWJhYmxlT2JqZWN0Q29tcG9uZW50LmdldE11dGFibGUoZm9vZCkudHlwZSA9IEluZ3JlZGllbnRUeXBlLkNvb2tlZE5vb2RsZXNcbiAgICAgICAgfVxuXG5cblxuICAgICAgfSBlbHNlIGlmIChjb29raW5nLnRpbWUgPiBCVVJOVF9BRlRFUiAmJiBfcG90RGF0YS5zdGF0ZSA9PT0gU291cFN0YXRlLkNvb2tlZCkge1xuXG4gICAgICAgIGNvbnNvbGUubG9nKFwiQlVSTklORyEhIVwiKVxuXG4gICAgICAgIGlmIChHbHRmQ29udGFpbmVyLmhhcyhlbnRpdHkpKSB7XG4gICAgICAgICAgR2x0ZkNvbnRhaW5lci5nZXRNdXRhYmxlKGVudGl0eSkuc3JjID0gXCJhc3NldHMvbW9kZWxzL0Nvb2tpbmdQb3REaXJ0eS5nbGJcIlxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBvdERhdGEgPSBQb3REYXRhLmdldE11dGFibGUoZW50aXR5KVxuICAgICAgICBwb3REYXRhLnN0YXRlID0gU291cFN0YXRlLkJ1cm5lZFxuICAgICAgICBjb25zdCBmb29kID0gcG90RGF0YS5hdHRhY2hlZEVudGl0eVxuICAgICAgICBpZiAoR2x0ZkNvbnRhaW5lci5oYXMoZm9vZCkgJiYgR3JhYmFibGVPYmplY3RDb21wb25lbnQuaGFzKGZvb2QpKSB7XG4gICAgICAgICAgR2x0ZkNvbnRhaW5lci5nZXRNdXRhYmxlKGZvb2QpLnNyYyA9IFwiYXNzZXRzL21vZGVscy9HYXJiYWdlRm9vZC5nbGJcIlxuICAgICAgICAgIEdyYWJhYmxlT2JqZWN0Q29tcG9uZW50LmdldE11dGFibGUoZm9vZCkudHlwZSA9IEluZ3JlZGllbnRUeXBlLlRyYXNoXG4gICAgICAgIH1cblxuICAgICAgfVxuXG4gICAgfSBlbHNlIGlmIChfY29va2luZy5hY3RpdmUgJiYgIV9wb3REYXRhLmhhc0luZ3JlZGllbnQpIHtcbiAgICAgIENvb2tpbmcuZGVsZXRlRnJvbShlbnRpdHkpXG4gICAgICBIaWRlUHJvZ3Jlc3NCYXIoX3BvdERhdGEucHJvZ3Jlc3NCYXIpXG4gICAgfVxuICB9XG59IiwgImltcG9ydCB7XG4gIGVuZ2luZSxcbiAgaW5wdXRTeXN0ZW0sXG4gIElucHV0QWN0aW9uLFxuICBQb2ludGVyRXZlbnRUeXBlLFxuICBFbnRpdHksXG4gIFRyYW5zZm9ybSxcbiAgQXZhdGFyQXR0YWNoLFxuICBBdmF0YXJBbmNob3JQb2ludFR5cGUsXG4gIEFuaW1hdG9yXG59IGZyb20gJ0BkY2wvc2RrL2VjcydcbmltcG9ydCB7IFZlY3RvcjMsIFF1YXRlcm5pb24gfSBmcm9tICdAZGNsL3Nkay9tYXRoJ1xuaW1wb3J0IHsgQmVlckdsYXNzLCBDdXR0aW5nQm9hcmQsIFBvdERhdGEsIFNvdXBTdGF0ZSwgR3JhYmFibGVPYmplY3RDb21wb25lbnQsIEluZ3JlZGllbnRUeXBlLCBQaWNrZWRVcCwgVGFwQmFzZSwgQ3VzdG9tZXJEYXRhIH0gZnJvbSAnLi4vZGVmaW5pdGlvbnMnXG5pbXBvcnQgeyBwbGF5U291bmQgfSBmcm9tICcuL2hlbHBlcnMnXG5pbXBvcnQgeyBjdXJyZW50UGxheWVySWQsIGdldFBsYXllclBvc2l0aW9uIH0gZnJvbSAnLi9oZWxwZXJzJ1xuaW1wb3J0IHsgc3luY0VudGl0eSwgcGFyZW50RW50aXR5LCBnZXRQYXJlbnQsIHJlbW92ZVBhcmVudCwgZ2V0Q2hpbGRyZW4gfSBmcm9tICdAZGNsL3Nkay9uZXR3b3JrJ1xuaW1wb3J0IHsgcnVpbkZvb2QsIHN3aXRjaFRvQ3V0TW9kZSwgc3dpdGNoVG9FbXB0eSB9IGZyb20gJy4vY3V0dGluZ0JvYXJkJ1xuaW1wb3J0IHsgZGVsaXZlck9yZGVyIH0gZnJvbSAnLi9jdXN0b21lcnMnXG5pbXBvcnQgeyBwaWNrRm9vZCB9IGZyb20gJy4vcG90J1xuaW1wb3J0IHsgSGlkZVByb2dyZXNzQmFyIH0gZnJvbSAnLi9wcm9ncmVzc0JhcnMnXG5cbmV4cG9ydCBmdW5jdGlvbiBwaWNraW5nR2xhc3NTeXN0ZW0oKSB7XG4gIC8vIERST1BcbiAgLy8gSWYgdGhlcmUgaXMgc29tZSBQaWNrZWRVcCwgc28gdGhlIGJlaHZpb3IgaXMgdG8gbGlzdGVuIHdoZW4gdGhpc1xuICAvLyAgY2FuIGJlIGRyb3BwZWRcbiAgZm9yIChjb25zdCBbZW50aXR5LCBwaWNrZWRVcF0gb2YgZW5naW5lLmdldEVudGl0aWVzV2l0aChQaWNrZWRVcCkpIHtcbiAgICBjb25zdCB0cnlUb0Ryb3BDb21tYW5kID0gaW5wdXRTeXN0ZW0uZ2V0SW5wdXRDb21tYW5kKElucHV0QWN0aW9uLklBX1BSSU1BUlksIFBvaW50ZXJFdmVudFR5cGUuUEVUX0RPV04pXG4gICAgaWYgKHRyeVRvRHJvcENvbW1hbmQpIHtcbiAgICAgIGNvbnN0IHBpY2tlZFVwQ2hpbGQgPSBBcnJheS5mcm9tKGdldENoaWxkcmVuKGVudGl0eSkpWzBdXG4gICAgICBpZiAocGlja2VkVXAuYXZhdGFySWQgIT09IGN1cnJlbnRQbGF5ZXJJZCB8fCAhcGlja2VkVXBDaGlsZCkgY29udGludWVcblxuICAgICAgbGV0IGRyb3AgPSBmYWxzZVxuICAgICAgY29uc3QgaGl0UG9zaXRpb24gPSB0cnlUb0Ryb3BDb21tYW5kLmhpdD8ucG9zaXRpb24gfHwgZ2V0UGxheWVyUG9zaXRpb24oKVxuICAgICAgY29uc3QgaGl0RW50aXR5ID0gdHJ5VG9Ecm9wQ29tbWFuZC5oaXQ/LmVudGl0eUlkIGFzIEVudGl0eVxuICAgICAgY29uc3QgaGl0UGFyZW50RW50aXR5ID0gZ2V0UGFyZW50KGhpdEVudGl0eSlcblxuXG4gICAgICAvLyBJZiB0aGVyZSBpcyBhIHRhcCBiYXNlICh0aGUgY29sbGlkZXIpXG4gICAgICBpZiAoaGl0UGFyZW50RW50aXR5ICYmIFRhcEJhc2UuZ2V0T3JOdWxsKGhpdFBhcmVudEVudGl0eSkpIHtcbiAgICAgICAgVHJhbnNmb3JtLmdldE11dGFibGUocGlja2VkVXBDaGlsZCkucm90YXRpb24gPSBRdWF0ZXJuaW9uLlplcm8oKVxuICAgICAgICBUcmFuc2Zvcm0uZ2V0TXV0YWJsZShwaWNrZWRVcENoaWxkKS5wb3NpdGlvbiA9IFZlY3RvcjMuWmVybygpXG4gICAgICAgIGNvbnNvbGUubG9nKFwiRFJPUFBFRCBPTiBUQVBcIilcbiAgICAgICAgLy9yZW1vdmVQYXJlbnQocGlja2VkVXBDaGlsZClcbiAgICAgICAgcGFyZW50RW50aXR5KHBpY2tlZFVwQ2hpbGQsIGhpdFBhcmVudEVudGl0eSlcbiAgICAgICAgZHJvcCA9IHRydWVcbiAgICAgIH0gZWxzZSBpZiAoaGl0UGFyZW50RW50aXR5ICYmIEN1dHRpbmdCb2FyZC5oYXMoaGl0UGFyZW50RW50aXR5KSkge1xuICAgICAgICAvL0lmIGN1dHRpbmcgYm9hcmRcbiAgICAgICAgY29uc29sZS5sb2coXCJEUk9QUEVEIE9OIENVVFRJTkcgQk9BUkRcIilcbiAgICAgICAgY29uc3QgYm9hcmQgPSBDdXR0aW5nQm9hcmQuZ2V0TXV0YWJsZShoaXRQYXJlbnRFbnRpdHkpXG4gICAgICAgIGlmICghYm9hcmQgfHwgIWJvYXJkLmhhc1JvbGwgfHwgIWJvYXJkLm1vZGVsRW50aXR5KSB7XG4gICAgICAgICAgLy9yZW1vdmVQYXJlbnQocGlja2VkVXBDaGlsZClcbiAgICAgICAgICBwYXJlbnRFbnRpdHkocGlja2VkVXBDaGlsZCwgaGl0UGFyZW50RW50aXR5KVxuICAgICAgICAgIGRyb3AgPSB0cnVlXG4gICAgICAgICAgVHJhbnNmb3JtLmdldE11dGFibGUocGlja2VkVXBDaGlsZCkucm90YXRpb24gPSBRdWF0ZXJuaW9uLlplcm8oKVxuICAgICAgICAgIFRyYW5zZm9ybS5nZXRNdXRhYmxlKHBpY2tlZFVwQ2hpbGQpLnBvc2l0aW9uID0gVmVjdG9yMy5aZXJvKClcblxuICAgICAgICAgIGJvYXJkLmhhc1JvbGwgPSB0cnVlXG4gICAgICAgICAgYm9hcmQucm9sbENoaWxkID0gcGlja2VkVXBDaGlsZFxuICAgICAgICAgIGJvYXJkLmN1dHRpbmcgPSBmYWxzZVxuICAgICAgICAgIGJvYXJkLmN1dHMgPSAwXG4gICAgICAgICAgQW5pbWF0b3Iuc3RvcEFsbEFuaW1hdGlvbnMoaGl0RW50aXR5LCB0cnVlKVxuXG4gICAgICAgICAgc3dpdGNoVG9DdXRNb2RlKGJvYXJkLm1vZGVsRW50aXR5KVxuXG4gICAgICAgIH1cblxuICAgICAgfSBlbHNlIGlmIChoaXRFbnRpdHkgJiYgUG90RGF0YS5oYXMoaGl0RW50aXR5KSkge1xuICAgICAgICAvL0lmIHBvdFxuICAgICAgICBjb25zb2xlLmxvZyhcIkRST1BQRUQgT04gUE9UXCIpXG4gICAgICAgIGNvbnN0IHBvdCA9IFBvdERhdGEuZ2V0TXV0YWJsZShoaXRFbnRpdHkpXG4gICAgICAgIGlmIChwb3QgJiYgIXBvdC5oYXNJbmdyZWRpZW50KSB7XG4gICAgICAgICAgLy9yZW1vdmVQYXJlbnQocGlja2VkVXBDaGlsZClcbiAgICAgICAgICBwYXJlbnRFbnRpdHkocGlja2VkVXBDaGlsZCwgaGl0RW50aXR5KVxuICAgICAgICAgIHBvdC5oYXNJbmdyZWRpZW50ID0gdHJ1ZVxuICAgICAgICAgIHBvdC5hdHRhY2hlZEVudGl0eSA9IHBpY2tlZFVwQ2hpbGRcbiAgICAgICAgICBwb3Quc3RhdGUgPSBTb3VwU3RhdGUuUmF3XG4gICAgICAgICAgZHJvcCA9IHRydWVcbiAgICAgICAgICBjb25zdCBncmFiYmFibGUgPSBHcmFiYWJsZU9iamVjdENvbXBvbmVudC5nZXQocGlja2VkVXBDaGlsZClcblxuICAgICAgICAgIGlmIChncmFiYmFibGUudHlwZSAhPT0gSW5ncmVkaWVudFR5cGUuTm9vZGxlcykge1xuICAgICAgICAgICAgcnVpbkZvb2QocGlja2VkVXBDaGlsZClcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVGFibGUgb3IgIGN1c3RvbWVyXG5cbiAgICAgICAgLy8gT25seSBpdCdzIGFsbG93ZWQgdG8gZHJvcCBpbmdyZWRpZW50cyBvbiBhIHN1cmZhY2UgcGFyYWxsZWwgdG8gdGhlIGZsb29yXG5cbiAgICAgICAgY29uc3QgZGlmZiA9IFZlY3RvcjMuc3VidHJhY3QoVmVjdG9yMy5VcCgpLCB0cnlUb0Ryb3BDb21tYW5kLmhpdD8ubm9ybWFsSGl0IHx8IFZlY3RvcjMuWmVybygpKVxuICAgICAgICBjb25zb2xlLmxvZyhcIkRST1BQRUQgT04gVEFCTEUgXCIsIFZlY3RvcjMubGVuZ3RoKGRpZmYpLCB0cnlUb0Ryb3BDb21tYW5kLmhpdD8ubm9ybWFsSGl0KVxuICAgICAgICBpZiAoVmVjdG9yMy5sZW5ndGgoZGlmZikgPCAwLjA1KSB7XG5cbiAgICAgICAgICByZW1vdmVQYXJlbnQocGlja2VkVXBDaGlsZClcbiAgICAgICAgICBUcmFuc2Zvcm0uY3JlYXRlT3JSZXBsYWNlKHBpY2tlZFVwQ2hpbGQsIHtcbiAgICAgICAgICAgIHBvc2l0aW9uOiBoaXRQb3NpdGlvbixcbiAgICAgICAgICAgIHBhcmVudDogdW5kZWZpbmVkXG4gICAgICAgICAgfSlcbiAgICAgICAgICBkcm9wID0gdHJ1ZVxuXG4gICAgICAgICAgY2hlY2tOZWFyQ3VzdG9tZXIocGlja2VkVXBDaGlsZClcbiAgICAgICAgfVxuICAgICAgfVxuXG5cblxuICAgICAgLy8gVE9ETzogVGhlc2UgbGluZSBjcmFzaGVzIHRoZSByZW5kZXJlclxuICAgICAgLy8gQXZhdGFyQXR0YWNoLmRlbGV0ZUZyb20oZW50aXR5KVxuICAgICAgLy8gZW5naW5lLnJlbW92ZUVudGl0eShlbnRpdHkpXG4gICAgICBpZiAoZHJvcCkge1xuICAgICAgICBQaWNrZWRVcC5kZWxldGVGcm9tKGVudGl0eSlcblxuICAgICAgICBwbGF5U291bmQoJ3NvdW5kcy9wdXREb3duLm1wMycsIGZhbHNlLCBoaXRQb3NpdGlvbilcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEUklOSyBCRUVSXG4gICAgLy8gaWYgKEJlZXJHbGFzcy5oYXMocGlja2VkVXAuY2hpbGQpKSB7XG4gICAgLy8gICBjb25zdCBnbGFzcyA9IEJlZXJHbGFzcy5nZXQocGlja2VkVXAuY2hpbGQpXG5cbiAgICAvLyAgIGNvbnN0IHRyeVRvRHJpbmtDb21tYW5kID0gaW5wdXRTeXN0ZW0uZ2V0SW5wdXRDb21tYW5kKElucHV0QWN0aW9uLklBX1NFQ09OREFSWSwgUG9pbnRlckV2ZW50VHlwZS5QRVRfRE9XTilcbiAgICAvLyAgIGlmIChnbGFzcy5maWxsZWQgJiYgdHJ5VG9Ecmlua0NvbW1hbmQpIHtcbiAgICAvLyAgICAgQmVlckdsYXNzLmdldE11dGFibGUocGlja2VkVXAuY2hpbGQpLmZpbGxlZCA9IGZhbHNlXG4gICAgLy8gICAgIEFuaW1hdG9yLnBsYXlTaW5nbGVBbmltYXRpb24ocGlja2VkVXAuY2hpbGQsICdCbGFuaycpXG4gICAgLy8gICAgIHBsYXlTb3VuZCgnc291bmRzL3N3YWxsb3cubXAzJywgZmFsc2UsIGdldFBsYXllclBvc2l0aW9uKCkpXG4gICAgLy8gICB9XG4gICAgLy8gICByZXR1cm5cbiAgICAvLyB9XG4gICAgcmV0dXJuXG4gIH1cblxuICAvLyBQSUNLIFVQXG4gIC8vIE9ubHkgaGFwcGVucyB3aGVuIHRoZXJlIGlzbid0IGFueSBQaWNrZWRVcCBjb21wb25lbnRcbiAgZm9yIChjb25zdCBbZW50aXR5LCBncmFiYmFibGVdIG9mIGVuZ2luZS5nZXRFbnRpdGllc1dpdGgoR3JhYmFibGVPYmplY3RDb21wb25lbnQsIFRyYW5zZm9ybSkpIHtcblxuICAgIGlmIChpbnB1dFN5c3RlbS5pc1RyaWdnZXJlZChJbnB1dEFjdGlvbi5JQV9QUklNQVJZLCBQb2ludGVyRXZlbnRUeXBlLlBFVF9ET1dOLCBlbnRpdHkpKSB7XG5cblxuICAgICAgaWYgKGdyYWJiYWJsZS5iZWluZ1Byb2Nlc3NlZCkgeyByZXR1cm4gfVxuXG4gICAgICBwaWNrVXBJdGVtKGVudGl0eSlcblxuXG5cbiAgICB9XG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gcGlja1VwSXRlbShlbnRpdHk6IEVudGl0eSkge1xuICBjb25zdCBvbGRQYXJlbnQgPSBnZXRQYXJlbnQoZW50aXR5KVxuICBjb25zdCBwYXJlbnRUb0dyYWJiZWQgPSBlbmdpbmUuYWRkRW50aXR5KClcbiAgUGlja2VkVXAuY3JlYXRlKHBhcmVudFRvR3JhYmJlZCwge1xuICAgIGF2YXRhcklkOiBjdXJyZW50UGxheWVySWRcbiAgfSlcblxuICBBdmF0YXJBdHRhY2guY3JlYXRlKHBhcmVudFRvR3JhYmJlZCwge1xuICAgIGF2YXRhcklkOiBjdXJyZW50UGxheWVySWQsXG4gICAgYW5jaG9yUG9pbnRJZDogQXZhdGFyQW5jaG9yUG9pbnRUeXBlLkFBUFRfUklHSFRfSEFORFxuICB9KVxuICBUcmFuc2Zvcm0uY3JlYXRlT3JSZXBsYWNlKGVudGl0eSwge1xuICAgIHBvc2l0aW9uOiBWZWN0b3IzLmNyZWF0ZSgwLCAwLjIyNSwgMCksXG4gICAgcm90YXRpb246IFF1YXRlcm5pb24uZnJvbUV1bGVyRGVncmVlcygxODAsIC05MCwgLTYwKSxcblxuICB9KVxuXG4gIHN5bmNFbnRpdHkocGFyZW50VG9HcmFiYmVkLCBbQXZhdGFyQXR0YWNoLmNvbXBvbmVudElkLCBUcmFuc2Zvcm0uY29tcG9uZW50SWQsIFBpY2tlZFVwLmNvbXBvbmVudElkLCBHcmFiYWJsZU9iamVjdENvbXBvbmVudC5jb21wb25lbnRJZF0pXG5cbiAgcGFyZW50RW50aXR5KGVudGl0eSwgcGFyZW50VG9HcmFiYmVkKVxuXG4gIHBsYXlTb3VuZCgnc291bmRzL3BpY2tVcC5tcDMnLCBmYWxzZSwgZ2V0UGxheWVyUG9zaXRpb24oKSlcblxuICBpZiAob2xkUGFyZW50ICYmIFBvdERhdGEuaGFzKG9sZFBhcmVudCkpIHtcbiAgICBjb25zdCBwb3QgPSBQb3REYXRhLmdldE11dGFibGUob2xkUGFyZW50KVxuICAgIGlmIChwb3QgJiYgcG90LmF0dGFjaGVkRW50aXR5ID09PSBlbnRpdHkpIHtcbiAgICAgIHBvdC5oYXNJbmdyZWRpZW50ID0gZmFsc2VcbiAgICAgIEhpZGVQcm9ncmVzc0Jhcihwb3QucHJvZ3Jlc3NCYXIpXG4gICAgICAvL3BvdC5hdHRhY2hlZEVudGl0eSA9IHVuZGVmaW5lZFxuICAgICAgcG90LnN0YXRlID0gU291cFN0YXRlLkVtcHR5XG5cbiAgICAgIHBpY2tGb29kKG9sZFBhcmVudClcblxuICAgIH1cbiAgfVxuXG4gIGlmIChvbGRQYXJlbnQgJiYgQ3V0dGluZ0JvYXJkLmhhcyhvbGRQYXJlbnQpKSB7XG4gICAgY29uc3QgYm9hcmQgPSBDdXR0aW5nQm9hcmQuZ2V0TXV0YWJsZShvbGRQYXJlbnQpXG4gICAgaWYgKGJvYXJkICYmIGJvYXJkLnJvbGxDaGlsZCA9PT0gZW50aXR5KSB7XG4gICAgICBib2FyZC5oYXNSb2xsID0gZmFsc2VcbiAgICAgIC8vYm9hcmQucm9sbENoaWxkID0gdW5kZWZpbmVkXG4gICAgICBib2FyZC5jdXR0aW5nID0gZmFsc2VcbiAgICAgIGJvYXJkLmN1dHMgPSAwXG4gICAgICBzd2l0Y2hUb0VtcHR5KGJvYXJkLm1vZGVsRW50aXR5KVxuICAgIH1cbiAgfVxuXG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrTmVhckN1c3RvbWVyKGVudGl0eTogRW50aXR5KSB7XG5cbiAgY29uc3QgaXRlbVRyYW5zZm9ybSA9IFRyYW5zZm9ybS5nZXQoZW50aXR5KVxuICBsZXQgY2xvc2VzdEN1c3RvbWVyID0gbnVsbFxuICBsZXQgY2xvc2VzdERpc3RhbmNlID0gMS41XG5cbiAgZm9yIChjb25zdCBbZW50aXR5LCBjdXN0b21lciwgY3VzdG9tZXJUcmFuc2Zvcm1dIG9mIGVuZ2luZS5nZXRFbnRpdGllc1dpdGgoQ3VzdG9tZXJEYXRhLCBUcmFuc2Zvcm0pKSB7XG4gICAgY29uc3QgZGlmZiA9IFZlY3RvcjMubGVuZ3RoKFZlY3RvcjMuc3VidHJhY3QoaXRlbVRyYW5zZm9ybS5wb3NpdGlvbiwgY3VzdG9tZXJUcmFuc2Zvcm0ucG9zaXRpb24pKVxuICAgIGlmIChkaWZmIDwgY2xvc2VzdERpc3RhbmNlKSB7XG4gICAgICBjbG9zZXN0Q3VzdG9tZXIgPSBlbnRpdHlcbiAgICAgIGNsb3Nlc3REaXN0YW5jZSA9IGRpZmZcbiAgICB9XG4gIH1cblxuICBpZiAoY2xvc2VzdEN1c3RvbWVyKSB7XG5cbiAgICBjb25zdCBpdGVtRGF0YSA9IEdyYWJhYmxlT2JqZWN0Q29tcG9uZW50LmdldChlbnRpdHkpXG5cblxuICAgIGRlbGl2ZXJPcmRlcihpdGVtRGF0YS50eXBlLCBjbG9zZXN0Q3VzdG9tZXIsIGVudGl0eSlcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmxvZyhcIk5PIENVU1RPTUVSIE5FQVJcIilcbiAgfVxufVxuXG4iLCAiaW1wb3J0IHtcbiAgZW5naW5lLFxuICBHbHRmQ29udGFpbmVyLFxuICBUcmFuc2Zvcm0sXG4gIEFuaW1hdG9yLFxuICBQb2ludGVyRXZlbnRzLFxuICBQb2ludGVyRXZlbnRUeXBlLFxuICBJbnB1dEFjdGlvbixcbiAgRW50aXR5LFxuICBNZXNoQ29sbGlkZXIsXG4gIE1lc2hSZW5kZXJlcixcbiAgQXVkaW9Tb3VyY2UsXG4gIENvbGxpZGVyTGF5ZXIsXG4gIHBvaW50ZXJFdmVudHNTeXN0ZW0sXG4gIFR3ZWVuLFxuICBFYXNpbmdGdW5jdGlvblxufSBmcm9tICdAZGNsL3Nkay9lY3MnXG5pbXBvcnQgeyBWZWN0b3IzLCBRdWF0ZXJuaW9uIH0gZnJvbSAnQGRjbC9zZGsvbWF0aCdcbmltcG9ydCB7IEJlZXJHbGFzcywgQmVlclR5cGUsIEN1dHRpbmdCb2FyZCwgZ2V0VGFwRGF0YSwgR3JhYmFibGVPYmplY3RDb21wb25lbnQsIEluZ3JlZGllbnRUeXBlLCBTeW5jRW50aXR5SURzLCBUYXBCYXNlLCBUYXBDb21wb25lbnQgfSBmcm9tICcuLi9kZWZpbml0aW9ucydcbmltcG9ydCB7IHN5bmNFbnRpdHksIHBhcmVudEVudGl0eSB9IGZyb20gJ0BkY2wvc2RrL25ldHdvcmsnXG5pbXBvcnQgeyBjdXRTdXNoaSB9IGZyb20gJy4vY3V0dGluZ0JvYXJkJ1xuXG5cblxuXG5cbi8vIEJFRVIgR0xBU1NcblxuZXhwb3J0IGZ1bmN0aW9uIGluc3RhbmNlQmVlcihlbnRpdHk6IEVudGl0eSwgaWQ6IFN5bmNFbnRpdHlJRHMpIHtcblxuICBCZWVyR2xhc3MuY3JlYXRlKGVudGl0eSlcblxuICBHcmFiYWJsZU9iamVjdENvbXBvbmVudC5jcmVhdGUoZW50aXR5LCB7IHR5cGU6IEluZ3JlZGllbnRUeXBlLkJlZXJHbGFzcyB9KVxuXG5cbiAgLy8gUG9pbnRlckV2ZW50cy5jcmVhdGUoZ2xhc3NFbnRpdHksIHtcbiAgLy8gICBwb2ludGVyRXZlbnRzOiBbXG4gIC8vICAgICB7XG4gIC8vICAgICAgIGV2ZW50VHlwZTogUG9pbnRlckV2ZW50VHlwZS5QRVRfRE9XTixcbiAgLy8gICAgICAgZXZlbnRJbmZvOiB7XG4gIC8vICAgICAgICAgaG92ZXJUZXh0OiAnUGljayB1cCcsXG4gIC8vICAgICAgICAgbWF4RGlzdGFuY2U6IDUsXG4gIC8vICAgICAgICAgYnV0dG9uOiBJbnB1dEFjdGlvbi5JQV9QUklNQVJZXG4gIC8vICAgICAgIH1cbiAgLy8gICAgIH1cbiAgLy8gICBdXG4gIC8vIH0pXG5cbiAgc3luY0VudGl0eShcbiAgICBlbnRpdHksXG4gICAgW0FuaW1hdG9yLmNvbXBvbmVudElkLCBBdWRpb1NvdXJjZS5jb21wb25lbnRJZCwgVHJhbnNmb3JtLmNvbXBvbmVudElkLCBCZWVyR2xhc3MuY29tcG9uZW50SWQsIEdyYWJhYmxlT2JqZWN0Q29tcG9uZW50LmNvbXBvbmVudElkXSxcbiAgICBpZFxuICApXG5cbn1cblxuXG4vLyBJTkdSRURJRU5UXG5cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUluZ3JlZGllbnQoaW5ncmVkaWVudDogSW5ncmVkaWVudFR5cGUsIHBvc2l0aW9uOiBWZWN0b3IzLCBmYWxsPzogYm9vbGVhbikge1xuICBjb25zdCBlbnRpdHkgPSBlbmdpbmUuYWRkRW50aXR5KClcblxuICBsZXQgbW9kZWwgPSBcIlwiXG5cbiAgc3dpdGNoIChpbmdyZWRpZW50KSB7XG4gICAgY2FzZSBJbmdyZWRpZW50VHlwZS5Ob29kbGVzOlxuICAgICAgbW9kZWwgPSBcImFzc2V0cy9tb2RlbHMvTm9vZGxlc1Jhdy5nbGJcIlxuICAgICAgYnJlYWtcbiAgICBjYXNlIEluZ3JlZGllbnRUeXBlLlN1c2hpUm9sbDpcbiAgICAgIG1vZGVsID0gXCJhc3NldHMvbW9kZWxzL1N1c2hpUm9sbC5nbGJcIlxuICAgICAgYnJlYWtcbiAgICBjYXNlIEluZ3JlZGllbnRUeXBlLkNvb2tlZE5vb2RsZXM6XG4gICAgICBtb2RlbCA9IFwiYXNzZXRzL21vZGVscy9QbGF0ZU5vb2RsZXMuZ2xiXCJcbiAgICAgIGJyZWFrXG4gICAgY2FzZSBJbmdyZWRpZW50VHlwZS5TbGljZWRTdXNoaTpcbiAgICAgIG1vZGVsID0gXCJhc3NldHMvbW9kZWxzL1BsYXRlU3VzaGkuZ2xiXCJcbiAgICAgIGJyZWFrXG4gICAgY2FzZSBJbmdyZWRpZW50VHlwZS5UcmFzaDpcbiAgICAgIG1vZGVsID0gXCJhc3NldHMvbW9kZWxzL0dhcmJhZ2VGb29kLmdsYlwiXG4gICAgICBicmVha1xuICB9XG5cbiAgR2x0ZkNvbnRhaW5lci5jcmVhdGUoZW50aXR5LCB7XG4gICAgc3JjOiBtb2RlbCxcbiAgICB2aXNpYmxlTWVzaGVzQ29sbGlzaW9uTWFzazogQ29sbGlkZXJMYXllci5DTF9QT0lOVEVSLFxuICAgIGludmlzaWJsZU1lc2hlc0NvbGxpc2lvbk1hc2s6IHVuZGVmaW5lZFxuICB9KVxuXG4gIFRyYW5zZm9ybS5jcmVhdGUoZW50aXR5LCB7IHBvc2l0aW9uIH0pXG5cbiAgR3JhYmFibGVPYmplY3RDb21wb25lbnQuY3JlYXRlKGVudGl0eSwgeyB0eXBlOiBpbmdyZWRpZW50IH0pXG5cbiAgUG9pbnRlckV2ZW50cy5jcmVhdGUoZW50aXR5LCB7XG4gICAgcG9pbnRlckV2ZW50czogW1xuICAgICAge1xuICAgICAgICBldmVudFR5cGU6IFBvaW50ZXJFdmVudFR5cGUuUEVUX0RPV04sXG4gICAgICAgIGV2ZW50SW5mbzoge1xuICAgICAgICAgIGhvdmVyVGV4dDogJ1BpY2sgdXAnLFxuICAgICAgICAgIG1heERpc3RhbmNlOiA1LFxuICAgICAgICAgIGJ1dHRvbjogSW5wdXRBY3Rpb24uSUFfUFJJTUFSWVxuICAgICAgICB9XG4gICAgICB9XG4gICAgXVxuICB9KVxuXG4gIGlmIChmYWxsKSB7XG4gICAgVHdlZW4uY3JlYXRlKGVudGl0eSwge1xuICAgICAgbW9kZTogVHdlZW4uTW9kZS5Nb3ZlKHtcbiAgICAgICAgc3RhcnQ6IHBvc2l0aW9uLFxuICAgICAgICBlbmQ6IFZlY3RvcjMuYWRkKHBvc2l0aW9uLCBWZWN0b3IzLmNyZWF0ZSgwLCAtMC43LCAwKSksXG4gICAgICB9KSxcbiAgICAgIGR1cmF0aW9uOiA1MDAsXG4gICAgICBlYXNpbmdGdW5jdGlvbjogRWFzaW5nRnVuY3Rpb24uRUZfTElORUFSXG4gICAgfSlcbiAgfVxuXG4gIHN5bmNFbnRpdHkoXG4gICAgZW50aXR5LFxuICAgIFtBdWRpb1NvdXJjZS5jb21wb25lbnRJZCwgVHJhbnNmb3JtLmNvbXBvbmVudElkLCBHcmFiYWJsZU9iamVjdENvbXBvbmVudC5jb21wb25lbnRJZCwgVHdlZW4uY29tcG9uZW50SWQsIEdsdGZDb250YWluZXIuY29tcG9uZW50SWRdXG4gIClcblxuICByZXR1cm4gaW5ncmVkaWVudFxuXG59XG5cblxuLy8gQkVFUiBUQVBcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVRhcCh0YXBCZWVyVHlwZTogQmVlclR5cGUsIGRpc3BlbnNlRW50aXR5OiBFbnRpdHksIGlkOiBTeW5jRW50aXR5SURzKSB7XG4gIGNvbnN0IHRhcEVudGl0eSA9IGVuZ2luZS5hZGRFbnRpdHkoKVxuICBjb25zdCB0YXBEYXRhID0gZ2V0VGFwRGF0YSh0YXBCZWVyVHlwZSlcblxuICBUYXBDb21wb25lbnQuY3JlYXRlKHRhcEVudGl0eSwge1xuICAgIGJlZXJUeXBlOiB0YXBCZWVyVHlwZVxuICB9KVxuICBHbHRmQ29udGFpbmVyLmNyZWF0ZSh0YXBFbnRpdHksIHtcbiAgICBzcmM6IHRhcERhdGEubW9kZWxcbiAgfSlcbiAgVHJhbnNmb3JtLmNyZWF0ZSh0YXBFbnRpdHksIHtcbiAgICAvL3BhcmVudDogZGlzcGVuc2VFbnRpdHlcbiAgfSlcbiAgcGFyZW50RW50aXR5KHRhcEVudGl0eSwgZGlzcGVuc2VFbnRpdHkpXG4gIEFuaW1hdG9yLmNyZWF0ZSh0YXBFbnRpdHksIHtcbiAgICBzdGF0ZXM6IFtcbiAgICAgIHtcbiAgICAgICAgY2xpcDogJ0JsYW5rJyxcbiAgICAgICAgcGxheWluZzogdHJ1ZSxcbiAgICAgICAgbG9vcDogZmFsc2VcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGNsaXA6ICdQb3VyJyxcbiAgICAgICAgbG9vcDogZmFsc2VcbiAgICAgIH1cbiAgICBdXG4gIH0pXG5cbiAgUG9pbnRlckV2ZW50cy5jcmVhdGUodGFwRW50aXR5LCB7XG4gICAgcG9pbnRlckV2ZW50czogW1xuICAgICAge1xuICAgICAgICBldmVudFR5cGU6IFBvaW50ZXJFdmVudFR5cGUuUEVUX0RPV04sXG4gICAgICAgIGV2ZW50SW5mbzoge1xuICAgICAgICAgIGhvdmVyVGV4dDogJ1BvdXInLFxuICAgICAgICAgIG1heERpc3RhbmNlOiA1LFxuICAgICAgICAgIGJ1dHRvbjogSW5wdXRBY3Rpb24uSUFfUFJJTUFSWVxuICAgICAgICB9XG4gICAgICB9XG4gICAgXVxuICB9KVxuXG5cbiAgc3luY0VudGl0eSh0YXBFbnRpdHksIFtBbmltYXRvci5jb21wb25lbnRJZCwgQXVkaW9Tb3VyY2UuY29tcG9uZW50SWRdLCBpZClcblxuXG4gIGNvbnN0IHRhcENvbGxpZGVyUG9zaXRpb24gPSBWZWN0b3IzLmFkZCh0YXBEYXRhLnBvc2l0aW9uLCBWZWN0b3IzLmNyZWF0ZSgwLCAwLjA1LCAwKSlcbiAgY29uc3QgY29sbGlkZXJQYXJlbnRFbnRpdHkgPSBlbmdpbmUuYWRkRW50aXR5KClcbiAgVHJhbnNmb3JtLmNyZWF0ZShjb2xsaWRlclBhcmVudEVudGl0eSwge1xuICAgIC8vcGFyZW50OiB0YXBFbnRpdHksXG4gICAgcG9zaXRpb246IHRhcENvbGxpZGVyUG9zaXRpb25cbiAgfSlcbiAgVGFwQmFzZS5jcmVhdGUoY29sbGlkZXJQYXJlbnRFbnRpdHksIHtcbiAgICBiZWVyVHlwZTogdGFwQmVlclR5cGVcbiAgfSlcbiAgc3luY0VudGl0eShjb2xsaWRlclBhcmVudEVudGl0eSwgW10sIGlkICsgMTAwKVxuICBwYXJlbnRFbnRpdHkoY29sbGlkZXJQYXJlbnRFbnRpdHksIHRhcEVudGl0eSlcblxuXG4gIGNvbnN0IGNvbGxpZGVyRW50aXR5ID0gZW5naW5lLmFkZEVudGl0eSgpXG4gIFRyYW5zZm9ybS5jcmVhdGUoY29sbGlkZXJFbnRpdHksIHtcbiAgICAvL3BhcmVudDogY29sbGlkZXJQYXJlbnRFbnRpdHksXG4gICAgc2NhbGU6IFZlY3RvcjMuc2NhbGUoVmVjdG9yMy5PbmUoKSwgMC4zMyksXG4gICAgcm90YXRpb246IFF1YXRlcm5pb24uZnJvbUV1bGVyRGVncmVlcyg5MCwgMCwgMClcbiAgfSlcblxuICBzeW5jRW50aXR5KGNvbGxpZGVyRW50aXR5LCBbXSwgaWQgKyAyMDApXG4gIHBhcmVudEVudGl0eShjb2xsaWRlckVudGl0eSwgY29sbGlkZXJQYXJlbnRFbnRpdHkpXG5cblxuICBNZXNoQ29sbGlkZXIuc2V0UGxhbmUoY29sbGlkZXJFbnRpdHkpXG4gIC8vIERlYnVnIHRvIHNlZSB0aGUgY29sbGlkZXJcbiAgLy9NZXNoUmVuZGVyZXIuc2V0UGxhbmUoY29sbGlkZXJFbnRpdHkpXG4gIFBvaW50ZXJFdmVudHMuY3JlYXRlKGNvbGxpZGVyRW50aXR5LCB7XG4gICAgcG9pbnRlckV2ZW50czogW1xuICAgICAge1xuICAgICAgICBldmVudFR5cGU6IFBvaW50ZXJFdmVudFR5cGUuUEVUX0RPV04sXG4gICAgICAgIGV2ZW50SW5mbzoge1xuICAgICAgICAgIGhvdmVyVGV4dDogJ1BsYWNlIG11ZycsXG4gICAgICAgICAgYnV0dG9uOiBJbnB1dEFjdGlvbi5JQV9QUklNQVJZXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICBdXG4gIH0pXG59XG5cbi8vIENVVFRJTkcgQk9BUkRcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUN1dHRpbmdCb2FyZChwb3NpdGlvbjogVmVjdG9yMywgaWQ6IFN5bmNFbnRpdHlJRHMpIHtcblxuXG4gIGNvbnN0IEN1dHRlclBhcmVudCA9IGVuZ2luZS5hZGRFbnRpdHkoKVxuICBUcmFuc2Zvcm0uY3JlYXRlKEN1dHRlclBhcmVudCwge1xuICAgIHBvc2l0aW9uOiBwb3NpdGlvbixcbiAgICByb3RhdGlvbjogUXVhdGVybmlvbi5mcm9tRXVsZXJEZWdyZWVzKDAsIDAsIDApXG4gIH0pXG5cbiAgc3luY0VudGl0eShDdXR0ZXJQYXJlbnQsIFtdLCBpZCArIDEwMClcblxuICBjb25zdCBib2FyZE1vZGVsID0gZW5naW5lLmFkZEVudGl0eSgpXG5cbiAgQ3V0dGluZ0JvYXJkLmNyZWF0ZShDdXR0ZXJQYXJlbnQsIHtcbiAgICBtb2RlbEVudGl0eTogYm9hcmRNb2RlbFxuICB9KVxuXG4gIEdsdGZDb250YWluZXIuY3JlYXRlKGJvYXJkTW9kZWwsIHtcbiAgICBzcmM6IFwiYXNzZXRzL21vZGVscy9DdXR0ZXIuZ2x0ZlwiLFxuICAgIHZpc2libGVNZXNoZXNDb2xsaXNpb25NYXNrOiBDb2xsaWRlckxheWVyLkNMX1BPSU5URVJcbiAgfSlcblxuICBUcmFuc2Zvcm0uY3JlYXRlKGJvYXJkTW9kZWwsIHtcbiAgICBwb3NpdGlvbjogVmVjdG9yMy5jcmVhdGUoMCwgLTAuMSwgMCksXG4gICAgc2NhbGU6IFZlY3RvcjMuY3JlYXRlKDAuMDEsIDAuMDEsIDAuMDEpLFxuICAgIHJvdGF0aW9uOiBRdWF0ZXJuaW9uLmZyb21FdWxlckRlZ3JlZXMoMCwgMTgwLCAwKVxuICB9KVxuXG5cblxuICBBbmltYXRvci5jcmVhdGUoYm9hcmRNb2RlbCwge1xuICAgIHN0YXRlczogW1xuICAgICAge1xuICAgICAgICBjbGlwOiAnU3RhdGUwJyxcbiAgICAgICAgcGxheWluZzogdHJ1ZSxcbiAgICAgICAgbG9vcDogZmFsc2VcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGNsaXA6ICdTdGF0ZTEnLFxuICAgICAgICBwbGF5aW5nOiBmYWxzZSxcbiAgICAgICAgbG9vcDogZmFsc2VcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGNsaXA6ICdTdGF0ZTInLFxuICAgICAgICBwbGF5aW5nOiBmYWxzZSxcbiAgICAgICAgbG9vcDogZmFsc2VcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGNsaXA6ICdTdGF0ZTMnLFxuICAgICAgICBwbGF5aW5nOiBmYWxzZSxcbiAgICAgICAgbG9vcDogZmFsc2VcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGNsaXA6ICdTdGF0ZTQnLFxuICAgICAgICBwbGF5aW5nOiBmYWxzZSxcbiAgICAgICAgbG9vcDogZmFsc2VcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGNsaXA6ICdTdGF0ZTUnLFxuICAgICAgICBwbGF5aW5nOiBmYWxzZSxcbiAgICAgICAgbG9vcDogZmFsc2VcbiAgICAgIH0sXG4gICAgXVxuICB9KVxuXG5cbiAgcG9pbnRlckV2ZW50c1N5c3RlbS5vblBvaW50ZXJEb3duKFxuICAgIHtcbiAgICAgIGVudGl0eTogYm9hcmRNb2RlbCxcbiAgICAgIG9wdHM6IHsgYnV0dG9uOiBJbnB1dEFjdGlvbi5JQV9QUklNQVJZLCBob3ZlclRleHQ6ICdQdXQnLCBtYXhEaXN0YW5jZTogNSwgfSxcbiAgICB9LFxuICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1dFN1c2hpKEN1dHRlclBhcmVudCwgYm9hcmRNb2RlbClcbiAgICAgIGNvbnNvbGUubG9nKCdjbGlja2VkIGVudGl0eScpXG4gICAgfVxuICApXG5cblxuXG4gIHN5bmNFbnRpdHkoYm9hcmRNb2RlbCwgW0FuaW1hdG9yLmNvbXBvbmVudElkLCBBdWRpb1NvdXJjZS5jb21wb25lbnRJZCwgQ3V0dGluZ0JvYXJkLmNvbXBvbmVudElkLCBQb2ludGVyRXZlbnRzLmNvbXBvbmVudElkXSwgaWQpXG5cbiAgcGFyZW50RW50aXR5KGJvYXJkTW9kZWwsIEN1dHRlclBhcmVudClcblxuXG5cblxuXG4gIC8vIGNvbnN0IGNvbGxpZGVyRW50aXR5ID0gZW5naW5lLmFkZEVudGl0eSgpXG4gIC8vIFRyYW5zZm9ybS5jcmVhdGUoY29sbGlkZXJFbnRpdHksIHtcbiAgLy8gICBwYXJlbnQ6IGNvbGxpZGVyUGFyZW50RW50aXR5LFxuICAvLyAgIHNjYWxlOiBWZWN0b3IzLnNjYWxlKFZlY3RvcjMuT25lKCksIDAuMzMpLFxuICAvLyAgIHJvdGF0aW9uOiBRdWF0ZXJuaW9uLmZyb21FdWxlckRlZ3JlZXMoOTAsIDAsIDApXG4gIC8vIH0pXG5cbiAgLy8gc3luY0VudGl0eShjb2xsaWRlckVudGl0eSwgW10sIGlkICsgMjAwKVxuICAvLyBwYXJlbnRFbnRpdHkoY29sbGlkZXJFbnRpdHksIGNvbGxpZGVyUGFyZW50RW50aXR5KVxuXG5cbiAgLy8gTWVzaENvbGxpZGVyLnNldFBsYW5lKGNvbGxpZGVyRW50aXR5KVxuICAvLyAvLyBEZWJ1ZyB0byBzZWUgdGhlIGNvbGxpZGVyXG4gIC8vIC8vTWVzaFJlbmRlcmVyLnNldFBsYW5lKGNvbGxpZGVyRW50aXR5KVxuICAvLyBQb2ludGVyRXZlbnRzLmNyZWF0ZShjb2xsaWRlckVudGl0eSwge1xuICAvLyAgIHBvaW50ZXJFdmVudHM6IFtcbiAgLy8gICAgIHtcbiAgLy8gICAgICAgZXZlbnRUeXBlOiBQb2ludGVyRXZlbnRUeXBlLlBFVF9ET1dOLFxuICAvLyAgICAgICBldmVudEluZm86IHtcbiAgLy8gICAgICAgICBob3ZlclRleHQ6ICdQbGFjZSBtdWcnLFxuICAvLyAgICAgICAgIGJ1dHRvbjogSW5wdXRBY3Rpb24uSUFfUFJJTUFSWVxuICAvLyAgICAgICB9XG4gIC8vICAgICB9XG4gIC8vICAgXVxuICAvLyB9KVxufVxuXG5cblxuXG4iLCAiaW1wb3J0IHsgQW5pbWF0b3IsIGVuZ2luZSwgSW5wdXRBY3Rpb24sIGlucHV0U3lzdGVtLCBQb2ludGVyRXZlbnRUeXBlLCBUcmFuc2Zvcm0gfSBmcm9tICdAZGNsL3Nkay9lY3MnXG5pbXBvcnQgeyBTY2FsYXIgfSBmcm9tICdAZGNsL3Nkay9tYXRoJ1xuaW1wb3J0IHsgQmVlckdsYXNzLCBCZWVyVHlwZSwgZ2V0VGFwRGF0YSwgR3JhYmFibGVPYmplY3RDb21wb25lbnQsIEluZ3JlZGllbnRUeXBlLCBUYXBCYXNlLCBUYXBDb21wb25lbnQgfSBmcm9tICcuLi9kZWZpbml0aW9ucydcbmltcG9ydCB7IGdldFBsYXllclBvc2l0aW9uLCBwbGF5U291bmQgfSBmcm9tICcuL2hlbHBlcnMnXG5pbXBvcnQgeyBnZXRQYXJlbnQgfSBmcm9tICdAZGNsL3Nkay9uZXR3b3JrJ1xuXG5mdW5jdGlvbiBnZXRCZWVyQmVoaW5kVGFwKGJlZXJUeXBlOiBCZWVyVHlwZSkge1xuICBmb3IgKGNvbnN0IFtnbGFzc0VudGl0eV0gb2YgZW5naW5lLmdldEVudGl0aWVzV2l0aChCZWVyR2xhc3MpKSB7XG5cbiAgICBjb25zdCBnbGFzc1BhcmVudCA9IGdldFBhcmVudChnbGFzc0VudGl0eSlcbiAgICBpZiAoZ2xhc3NQYXJlbnQgJiYgVGFwQmFzZS5nZXRPck51bGwoZ2xhc3NQYXJlbnQpPy5iZWVyVHlwZSA9PT0gYmVlclR5cGUpIHtcbiAgICAgIHJldHVybiBnbGFzc0VudGl0eVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdGFwUHVtcFN5c3RlbShkdDogbnVtYmVyKSB7XG4gIGZvciAoY29uc3QgW2VudGl0eSwgdGFwUmVhZG9ubHldIG9mIGVuZ2luZS5nZXRFbnRpdGllc1dpdGgoVGFwQ29tcG9uZW50KSkge1xuICAgIC8vIFdoaWxlIGlzIHBvdXJpbmdcbiAgICBpZiAodGFwUmVhZG9ubHkucG91cmluZykge1xuICAgICAgLy8gQXQgc3RhcnQgdGhlIHBvdXJpbmcsIHBsYXkgdGhlIHNvdW5kIGFuIGFuaW1hdGlvblxuICAgICAgaWYgKFNjYWxhci53aXRoaW5FcHNpbG9uKHRhcFJlYWRvbmx5LnBvdXJpbmdUaW1lLCAwKSkge1xuICAgICAgICBBbmltYXRvci5wbGF5U2luZ2xlQW5pbWF0aW9uKGVudGl0eSwgYFBvdXJgKVxuICAgICAgICBwbGF5U291bmQoJ3NvdW5kcy9iZWVyUHVtcC5tcDMnLCBmYWxzZSwgZ2V0UGxheWVyUG9zaXRpb24oKSlcbiAgICAgICAgY29uc3QgZ2xhc3NFbnRpdHkgPSBnZXRCZWVyQmVoaW5kVGFwKHRhcFJlYWRvbmx5LmJlZXJUeXBlKVxuICAgICAgICBpZiAoZ2xhc3NFbnRpdHkpIEFuaW1hdG9yLnBsYXlTaW5nbGVBbmltYXRpb24oZ2xhc3NFbnRpdHksIGBQb3VyJHtnZXRUYXBEYXRhKHRhcFJlYWRvbmx5LmJlZXJUeXBlKS5uYW1lfWApXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRhcCA9IFRhcENvbXBvbmVudC5nZXRNdXRhYmxlKGVudGl0eSlcbiAgICAgIHRhcC5wb3VyaW5nVGltZSArPSBkdFxuXG4gICAgICBpZiAodGFwLnBvdXJpbmdUaW1lID49IDIuNSkge1xuICAgICAgICB0YXAucG91cmluZyA9IGZhbHNlXG4gICAgICAgIHRhcC5wb3VyaW5nVGltZSA9IDBcblxuICAgICAgICBjb25zdCBnbGFzc0VudGl0eSA9IGdldEJlZXJCZWhpbmRUYXAodGFwLmJlZXJUeXBlKVxuICAgICAgICBpZiAoZ2xhc3NFbnRpdHkpIHtcbiAgICAgICAgICBjb25zdCBnbGFzcyA9IEJlZXJHbGFzcy5nZXRNdXRhYmxlKGdsYXNzRW50aXR5KVxuICAgICAgICAgIGdsYXNzLmJlZXJUeXBlID0gdGFwLmJlZXJUeXBlXG4gICAgICAgICAgLy9nbGFzcy5iZWluZ0ZpbGxlZCA9IGZhbHNlXG4gICAgICAgICAgZ2xhc3MuZmlsbGVkID0gdHJ1ZVxuICAgICAgICAgIGNvbnN0IGdyYWJiYWJsZSA9IEdyYWJhYmxlT2JqZWN0Q29tcG9uZW50LmdldE11dGFibGUoZ2xhc3NFbnRpdHkpXG4gICAgICAgICAgZ3JhYmJhYmxlLmJlaW5nUHJvY2Vzc2VkID0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBMaXN0ZW4gdGhlIGFjdGlvblxuICAgIH0gZWxzZSBpZiAoaW5wdXRTeXN0ZW0uaXNUcmlnZ2VyZWQoSW5wdXRBY3Rpb24uSUFfUFJJTUFSWSwgUG9pbnRlckV2ZW50VHlwZS5QRVRfRE9XTiwgZW50aXR5KSkge1xuICAgICAgY29uc3QgZ2xhc3NFbnRpdHkgPSBnZXRCZWVyQmVoaW5kVGFwKHRhcFJlYWRvbmx5LmJlZXJUeXBlKVxuICAgICAgaWYgKCFnbGFzc0VudGl0eSkge1xuICAgICAgICAvLyBUT0RPOiBub3RpZnkgdGhhdCB0aGVyZSBpcyBubyBnbGFzc1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgZ2xhc3MgPSBCZWVyR2xhc3MuZ2V0TXV0YWJsZShnbGFzc0VudGl0eSlcbiAgICAgIGlmIChnbGFzcy5maWxsZWQpIHtcbiAgICAgICAgLy8gVE9ETzogbm90aWZ5IHRoYXQgdGhlIGdsYXNzIGlzIGZpbGxlZFxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgdGFwID0gVGFwQ29tcG9uZW50LmdldE11dGFibGUoZW50aXR5KVxuICAgICAgdGFwLnBvdXJpbmcgPSB0cnVlXG4gICAgICB0YXAucG91cmluZ1RpbWUgPSAwXG5cbiAgICAgIC8vZ2xhc3MuYmVpbmdGaWxsZWQgPSB0cnVlXG4gICAgICBnbGFzcy5iZWVyVHlwZSA9IHRhcC5iZWVyVHlwZVxuICAgICAgY29uc3QgZ3JhYmJhYmxlID0gR3JhYmFibGVPYmplY3RDb21wb25lbnQuZ2V0TXV0YWJsZShnbGFzc0VudGl0eSlcbiAgICAgIGdyYWJiYWJsZS5iZWluZ1Byb2Nlc3NlZCA9IHRydWVcbiAgICAgIHN3aXRjaCAodGFwLmJlZXJUeXBlKSB7XG4gICAgICAgIGNhc2UgQmVlclR5cGUuWUVMTE9XOlxuICAgICAgICAgIGdyYWJiYWJsZS50eXBlID0gSW5ncmVkaWVudFR5cGUuWWVsbG93QmVlclxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgQmVlclR5cGUuUkVEOlxuICAgICAgICAgIGdyYWJiYWJsZS50eXBlID0gSW5ncmVkaWVudFR5cGUuUmVkQmVlclxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgQmVlclR5cGUuR1JFRU46XG4gICAgICAgICAgZ3JhYmJhYmxlLnR5cGUgPSBJbmdyZWRpZW50VHlwZS5HcmVlbkJlZXJcbiAgICAgICAgICBicmVha1xuXG4gICAgICB9XG5cbiAgICAgIGdyYWJiYWJsZS50eXBlXG4gICAgfVxuICB9XG59XG4iLCAiaW1wb3J0IHsgb3BlbkV4dGVybmFsVXJsIH0gZnJvbSBcIn5zeXN0ZW0vUmVzdHJpY3RlZEFjdGlvbnNcIlxuaW1wb3J0IFJlYWN0RWNzLCB7IExhYmVsLCBSZWFjdEVjc1JlbmRlcmVyLCBVaUVudGl0eSB9IGZyb20gJ0BkY2wvc2RrL3JlYWN0LWVjcydcbmltcG9ydCB7IFRleHRBbGlnbk1vZGUsIFRleHR1cmVGaWx0ZXJNb2RlLCBUZXh0dXJlV3JhcE1vZGUgfSBmcm9tIFwiQGRjbC9zZGsvZWNzXCJcbmltcG9ydCB7IENvbG9yNCB9IGZyb20gXCJAZGNsL3Nkay9tYXRoXCJcblxuXG5jb25zdCBwcm9qZWN0UGF0aCA9IFwiYmVlci1kaXNwZW5zZXJcIlxuXG5jb25zdCB1aUNvbXBvbmVudCA9ICgpID0+IChcblx0W1xuXHRcdEdpdEh1YkxpbmtVaSgpXG5cdFx0Ly8gT3RoZXIgVUkgZWxlbWVudHNcblx0XVxuKVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0dXBVaSgpIHtcblx0UmVhY3RFY3NSZW5kZXJlci5zZXRVaVJlbmRlcmVyKHVpQ29tcG9uZW50KVxufVxuXG5mdW5jdGlvbiBHaXRIdWJMaW5rVWkoKSB7XG5cblx0Y29uc3QgZnVsbFBhdGggPSBcImh0dHBzOi8vZ2l0aHViLmNvbS9kZWNlbnRyYWxhbmQvc2RrNy1nb2VybGktcGxhemEvdHJlZS9tYWluL1wiICsgcHJvamVjdFBhdGhcblxuXG5cdHJldHVybiA8VWlFbnRpdHlcblx0XHR1aVRyYW5zZm9ybT17e1xuXHRcdFx0ZmxleERpcmVjdGlvbjogJ2NvbHVtbicsXG5cdFx0XHRhbGlnbkl0ZW1zOiAnY2VudGVyJyxcblx0XHRcdGp1c3RpZnlDb250ZW50OiAnc3BhY2UtYmV0d2VlbicsXG5cdFx0XHRwb3NpdGlvblR5cGU6ICdhYnNvbHV0ZScsXG5cdFx0XHRwb3NpdGlvbjogeyByaWdodDogXCI4JVwiLCBib3R0b206ICczJScgfVxuXHRcdH19XG5cdD5cblx0XHQ8VWlFbnRpdHlcblx0XHRcdHVpVHJhbnNmb3JtPXt7XG5cdFx0XHRcdHdpZHRoOiAnMTAwJyxcblx0XHRcdFx0aGVpZ2h0OiAnMTAwJyxcblx0XHRcdH19XG5cdFx0XHR1aUJhY2tncm91bmQ9e3tcblx0XHRcdFx0dGV4dHVyZU1vZGU6ICdzdHJldGNoJyxcblx0XHRcdFx0dGV4dHVyZToge1xuXHRcdFx0XHRcdHNyYzogXCJpbWFnZXMvZ2gucG5nXCJcblx0XHRcdFx0fVxuXHRcdFx0fX1cblxuXHRcdFx0b25Nb3VzZURvd249eygpID0+IHtcblx0XHRcdFx0Y29uc29sZS5sb2coXCJPUEVOSU5HIExJTktcIilcblx0XHRcdFx0b3BlbkV4dGVybmFsVXJsKHsgdXJsOiBmdWxsUGF0aCB9KVxuXHRcdFx0fX1cblx0XHQvPlxuXHRcdDxMYWJlbFxuXHRcdFx0dmFsdWU9XCJWaWV3IGNvZGVcIlxuXHRcdFx0Y29sb3I9e0NvbG9yNC5CbGFjaygpfVxuXHRcdFx0Zm9udFNpemU9ezE4fVxuXHRcdFx0dGV4dEFsaWduPVwibWlkZGxlLWNlbnRlclwiXG5cdFx0Lz5cblx0PC9VaUVudGl0eT5cbn1cblxuIiwgImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHZhciBSZWFjdEVjcztcbihmdW5jdGlvbiAoUmVhY3RFY3MpIHtcbiAgICBSZWFjdEVjcy5jcmVhdGVFbGVtZW50ID0gUmVhY3QuY3JlYXRlRWxlbWVudDtcbn0pKFJlYWN0RWNzIHx8IChSZWFjdEVjcyA9IHt9KSk7XG4iLCAiaW1wb3J0ICogYXMgY29tcG9uZW50cyBmcm9tICdAZGNsL2Vjcy9kaXN0L2NvbXBvbmVudHMnO1xuaW1wb3J0IFJlY29uY2lsZXIgZnJvbSAncmVhY3QtcmVjb25jaWxlcic7XG5pbXBvcnQgeyBpc0xpc3RlbmVyIH0gZnJvbSAnLi4vY29tcG9uZW50cyc7XG5pbXBvcnQgeyBDQU5WQVNfUk9PVF9FTlRJVFkgfSBmcm9tICcuLi9jb21wb25lbnRzL3VpVHJhbnNmb3JtJztcbmltcG9ydCB7IGNvbXBvbmVudEtleXMsIGlzTm90VW5kZWZpbmVkLCBub29wQ29uZmlnLCBwcm9wc0NoYW5nZWQgfSBmcm9tICcuL3V0aWxzJztcbmZ1bmN0aW9uIGdldFBvaW50ZXJFbnVtKHBvaW50ZXJLZXkpIHtcbiAgICBjb25zdCBwb2ludGVycyA9IHtcbiAgICAgICAgb25Nb3VzZURvd246IDEgLyogUG9pbnRlckV2ZW50VHlwZS5QRVRfRE9XTiAqLyxcbiAgICAgICAgb25Nb3VzZVVwOiAwIC8qIFBvaW50ZXJFdmVudFR5cGUuUEVUX1VQICovXG4gICAgfTtcbiAgICByZXR1cm4gcG9pbnRlcnNbcG9pbnRlcktleV07XG59XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVjb25jaWxlcihlbmdpbmUsIHBvaW50ZXJFdmVudHMpIHtcbiAgICAvLyBTdG9yZSBhbGwgdGhlIGVudGl0aWVzIHNvIHdoZW4gd2UgZGVzdHJveSB0aGUgVUkgd2UgY2FuIGFsc28gZGVzdHJveSB0aGVtXG4gICAgY29uc3QgZW50aXRpZXMgPSBuZXcgU2V0KCk7XG4gICAgLy8gU3RvcmUgdGhlIG9uQ2hhbmdlIGNhbGxiYWNrcyB0byBiZSBydW5uZWQgZXZlcnkgdGltZSBhIFJlc3VsdCBoYXMgY2hhbmdlZFxuICAgIGNvbnN0IGNoYW5nZUV2ZW50cyA9IG5ldyBNYXAoKTtcbiAgICBjb25zdCBjbGlja0V2ZW50cyA9IG5ldyBNYXAoKTtcbiAgICAvLyBJbml0aWFsaXplIGNvbXBvbmVudHNcbiAgICBjb25zdCBVaVRyYW5zZm9ybSA9IGNvbXBvbmVudHMuVWlUcmFuc2Zvcm0oZW5naW5lKTtcbiAgICBjb25zdCBVaVRleHQgPSBjb21wb25lbnRzLlVpVGV4dChlbmdpbmUpO1xuICAgIGNvbnN0IFVpQmFja2dyb3VuZCA9IGNvbXBvbmVudHMuVWlCYWNrZ3JvdW5kKGVuZ2luZSk7XG4gICAgY29uc3QgVWlJbnB1dCA9IGNvbXBvbmVudHMuVWlJbnB1dChlbmdpbmUpO1xuICAgIGNvbnN0IFVpSW5wdXRSZXN1bHQgPSBjb21wb25lbnRzLlVpSW5wdXRSZXN1bHQoZW5naW5lKTtcbiAgICBjb25zdCBVaURyb3Bkb3duID0gY29tcG9uZW50cy5VaURyb3Bkb3duKGVuZ2luZSk7XG4gICAgY29uc3QgVWlEcm9wZG93blJlc3VsdCA9IGNvbXBvbmVudHMuVWlEcm9wZG93blJlc3VsdChlbmdpbmUpO1xuICAgIC8vIENvbXBvbmVudCBJRCBIZWxwZXJcbiAgICBjb25zdCBnZXRDb21wb25lbnRJZCA9IHtcbiAgICAgICAgdWlUcmFuc2Zvcm06IFVpVHJhbnNmb3JtLmNvbXBvbmVudElkLFxuICAgICAgICB1aVRleHQ6IFVpVGV4dC5jb21wb25lbnRJZCxcbiAgICAgICAgdWlCYWNrZ3JvdW5kOiBVaUJhY2tncm91bmQuY29tcG9uZW50SWQsXG4gICAgICAgIHVpSW5wdXQ6IFVpSW5wdXQuY29tcG9uZW50SWQsXG4gICAgICAgIHVpRHJvcGRvd246IFVpRHJvcGRvd24uY29tcG9uZW50SWRcbiAgICB9O1xuICAgIGZ1bmN0aW9uIHBvaW50ZXJFdmVudENhbGxiYWNrKGVudGl0eSwgcG9pbnRlckV2ZW50KSB7XG4gICAgICAgIGNvbnN0IGNhbGxiYWNrID0gY2xpY2tFdmVudHMuZ2V0KGVudGl0eSk/LmdldChwb2ludGVyRXZlbnQpO1xuICAgICAgICBpZiAoY2FsbGJhY2spXG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVwZGF0ZVRyZWUoaW5zdGFuY2UsIHByb3BzKSB7XG4gICAgICAgIHVwc2VydENvbXBvbmVudChpbnN0YW5jZSwgcHJvcHMsICd1aVRyYW5zZm9ybScpO1xuICAgIH1cbiAgICBmdW5jdGlvbiB1cHNlcnRMaXN0ZW5lcihpbnN0YW5jZSwgdXBkYXRlKSB7XG4gICAgICAgIGlmICh1cGRhdGUudHlwZSA9PT0gJ2RlbGV0ZScgfHwgIXVwZGF0ZS5wcm9wcykge1xuICAgICAgICAgICAgY2xpY2tFdmVudHMuZ2V0KGluc3RhbmNlLmVudGl0eSk/LmRlbGV0ZShnZXRQb2ludGVyRW51bSh1cGRhdGUuY29tcG9uZW50KSk7XG4gICAgICAgICAgICBpZiAodXBkYXRlLmNvbXBvbmVudCA9PT0gJ29uTW91c2VEb3duJykge1xuICAgICAgICAgICAgICAgIHBvaW50ZXJFdmVudHMucmVtb3ZlT25Qb2ludGVyRG93bihpbnN0YW5jZS5lbnRpdHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodXBkYXRlLmNvbXBvbmVudCA9PT0gJ29uTW91c2VVcCcpIHtcbiAgICAgICAgICAgICAgICBwb2ludGVyRXZlbnRzLnJlbW92ZU9uUG9pbnRlclVwKGluc3RhbmNlLmVudGl0eSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVwZGF0ZS5wcm9wcykge1xuICAgICAgICAgICAgY29uc3QgcG9pbnRlckV2ZW50ID0gZ2V0UG9pbnRlckVudW0odXBkYXRlLmNvbXBvbmVudCk7XG4gICAgICAgICAgICBjb25zdCBlbnRpdHlFdmVudCA9IGNsaWNrRXZlbnRzLmdldChpbnN0YW5jZS5lbnRpdHkpIHx8IGNsaWNrRXZlbnRzLnNldChpbnN0YW5jZS5lbnRpdHksIG5ldyBNYXAoKSkuZ2V0KGluc3RhbmNlLmVudGl0eSk7XG4gICAgICAgICAgICBjb25zdCBhbHJlYWR5SGFzUG9pbnRlckV2ZW50ID0gZW50aXR5RXZlbnQuZ2V0KHBvaW50ZXJFdmVudCk7XG4gICAgICAgICAgICBlbnRpdHlFdmVudC5zZXQocG9pbnRlckV2ZW50LCB1cGRhdGUucHJvcHMpO1xuICAgICAgICAgICAgaWYgKGFscmVhZHlIYXNQb2ludGVyRXZlbnQpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgY29uc3QgcG9pbnRlckV2ZW50U3lzdGVtID0gdXBkYXRlLmNvbXBvbmVudCA9PT0gJ29uTW91c2VEb3duJyA/IHBvaW50ZXJFdmVudHMub25Qb2ludGVyRG93biA6IHBvaW50ZXJFdmVudHMub25Qb2ludGVyVXA7XG4gICAgICAgICAgICBwb2ludGVyRXZlbnRTeXN0ZW0oaW5zdGFuY2UuZW50aXR5LCAoKSA9PiBwb2ludGVyRXZlbnRDYWxsYmFjayhpbnN0YW5jZS5lbnRpdHksIHBvaW50ZXJFdmVudCksIHtcbiAgICAgICAgICAgICAgICBidXR0b246IDAgLyogSW5wdXRBY3Rpb24uSUFfUE9JTlRFUiAqLyxcbiAgICAgICAgICAgICAgICAvLyBXZSBhZGQgdGhpcyBzaG93RmVlZEJhY2sgc28gdGhlIHBvaW50ZXJFdmVudFN5c3RlbSBjcmVhdGVzIGEgUG9pbnRlckV2ZW50IGNvbXBvbmVudCB3aXRoIG91ciBlbnRpdHlcbiAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIG5lZWRlZCBmb3IgdGhlIHJlbmRlcmVyIHRvIGtub3cgd2hpY2ggZW50aXRpZXMgYXJlIGNsaWNrZWFibGVzXG4gICAgICAgICAgICAgICAgc2hvd0ZlZWRiYWNrOiB0cnVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiByZW1vdmVDb21wb25lbnQoaW5zdGFuY2UsIGNvbXBvbmVudCkge1xuICAgICAgICBjb25zdCBjb21wb25lbnRJZCA9IGdldENvbXBvbmVudElkW2NvbXBvbmVudF07XG4gICAgICAgIGNvbnN0IENvbXBvbmVudCA9IGVuZ2luZS5nZXRDb21wb25lbnQoY29tcG9uZW50SWQpO1xuICAgICAgICBDb21wb25lbnQuZGVsZXRlRnJvbShpbnN0YW5jZS5lbnRpdHkpO1xuICAgIH1cbiAgICBmdW5jdGlvbiB1cHNlcnRDb21wb25lbnQoaW5zdGFuY2UsIHByb3BzID0ge30sIGNvbXBvbmVudE5hbWUpIHtcbiAgICAgICAgY29uc3QgY29tcG9uZW50SWQgPSBnZXRDb21wb25lbnRJZFtjb21wb25lbnROYW1lXTtcbiAgICAgICAgY29uc3Qgb25DaGFuZ2VFeGlzdHMgPSAnb25DaGFuZ2UnIGluIHByb3BzO1xuICAgICAgICBjb25zdCBvblN1Ym1pdEV4aXN0cyA9ICdvblN1Ym1pdCcgaW4gcHJvcHM7XG4gICAgICAgIGNvbnN0IGVudGl0eVN0YXRlID0gY2hhbmdlRXZlbnRzLmdldChpbnN0YW5jZS5lbnRpdHkpPy5nZXQoY29tcG9uZW50SWQpO1xuICAgICAgICBjb25zdCBvbkNoYW5nZSA9IG9uQ2hhbmdlRXhpc3RzXG4gICAgICAgICAgICA/IHByb3BzWydvbkNoYW5nZSddXG4gICAgICAgICAgICA6IGVudGl0eVN0YXRlPy5vbkNoYW5nZUNhbGxiYWNrO1xuICAgICAgICBjb25zdCBvblN1Ym1pdCA9IG9uU3VibWl0RXhpc3RzXG4gICAgICAgICAgICA/IHByb3BzWydvblN1Ym1pdCddXG4gICAgICAgICAgICA6IGVudGl0eVN0YXRlPy5vblN1Ym1pdENhbGxiYWNrO1xuICAgICAgICBpZiAob25DaGFuZ2VFeGlzdHMgfHwgb25TdWJtaXRFeGlzdHMpIHtcbiAgICAgICAgICAgIHVwZGF0ZU9uQ2hhbmdlKGluc3RhbmNlLmVudGl0eSwgY29tcG9uZW50SWQsIHtcbiAgICAgICAgICAgICAgICBvbkNoYW5nZUNhbGxiYWNrOiBvbkNoYW5nZSxcbiAgICAgICAgICAgICAgICBvblN1Ym1pdENhbGxiYWNrOiBvblN1Ym1pdFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBkZWxldGUgcHJvcHMub25DaGFuZ2U7XG4gICAgICAgICAgICBkZWxldGUgcHJvcHMub25TdWJtaXQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2UgY2hlY2sgaWYgdGhlcmUgaXMgYW55IGtleSBwZW5kaW5nIHRvIGJlIGNoYW5nZWQgdG8gYXZvaWQgdXBkYXRpbmcgdGhlIGV4aXN0aW5nIGNvbXBvbmVudFxuICAgICAgICBpZiAoIU9iamVjdC5rZXlzKHByb3BzKS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBDb21wb25lbnREZWYgPSBlbmdpbmUuZ2V0Q29tcG9uZW50KGNvbXBvbmVudElkKTtcbiAgICAgICAgY29uc3QgY29tcG9uZW50ID0gQ29tcG9uZW50RGVmLmdldE11dGFibGVPck51bGwoaW5zdGFuY2UuZW50aXR5KSB8fCBDb21wb25lbnREZWYuY3JlYXRlKGluc3RhbmNlLmVudGl0eSk7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHByb3BzKSB7XG4gICAgICAgICAgICBjb25zdCBrZXlQcm9wID0ga2V5O1xuICAgICAgICAgICAgY29tcG9uZW50W2tleVByb3BdID0gcHJvcHNba2V5UHJvcF07XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gcmVtb3ZlQ2hpbGRFbnRpdHkoaW5zdGFuY2UpIHtcbiAgICAgICAgY2hhbmdlRXZlbnRzLmRlbGV0ZShpbnN0YW5jZS5lbnRpdHkpO1xuICAgICAgICBlbmdpbmUucmVtb3ZlRW50aXR5KGluc3RhbmNlLmVudGl0eSk7XG4gICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgaW5zdGFuY2UuX2NoaWxkKSB7XG4gICAgICAgICAgICByZW1vdmVDaGlsZEVudGl0eShjaGlsZCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gYXBwZW5kQ2hpbGQocGFyZW50LCBjaGlsZCkge1xuICAgICAgICBpZiAoIWNoaWxkIHx8ICFPYmplY3Qua2V5cyhwYXJlbnQpLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY29uc3QgaXNSZW9yZGVyID0gcGFyZW50Ll9jaGlsZC5maW5kKChjKSA9PiBjLmVudGl0eSA9PT0gY2hpbGQuZW50aXR5KTtcbiAgICAgICAgLy8gSWYgaXRzIGEgcmVvcmRlciBpdHMgc2VlbXMgdGhhdCBpdHMgYSBtdXRhdGlvbiBvZiBhbiBhcnJheSB3aXRoIGtleSBwcm9wXG4gICAgICAgIC8vIFdlIG5lZWQgdG8gbW92ZSB0aGUgY2hpbGQgdG8gdGhlIGVuZCBvZiB0aGUgYXJyYXlcbiAgICAgICAgLy8gQW5kIHVwZGF0ZSB0aGUgb3JkZXIgb2YgdGhlIHBhcmVudF8uY2hpbGQgYXJyYXlcbiAgICAgICAgLy8gY2hpbGQucmlnaHRPZiA9PiBMYXRlc3QgZW50aXR5IG9mIHRoZSBhcnJheVxuICAgICAgICAvLyBjaGlsZFRoYXRXYXNBdFJpZ2h0T2ZFbnRpdHkgPSBjaGlsZEVudGl0eS5yaWdodE9mXG4gICAgICAgIGlmIChpc1Jlb3JkZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHJpZ2h0T2ZDaGlsZCA9IHBhcmVudC5fY2hpbGQuZmluZCgoYykgPT4gYy5yaWdodE9mID09PSBjaGlsZC5lbnRpdHkpO1xuICAgICAgICAgICAgaWYgKHJpZ2h0T2ZDaGlsZCkge1xuICAgICAgICAgICAgICAgIHJpZ2h0T2ZDaGlsZC5yaWdodE9mID0gY2hpbGQucmlnaHRPZjtcbiAgICAgICAgICAgICAgICAvLyBSZS1vcmRlciBwYXJlbnQuX2NoaWxkIGFycmF5XG4gICAgICAgICAgICAgICAgcGFyZW50Ll9jaGlsZCA9IHBhcmVudC5fY2hpbGQuZmlsdGVyKChjKSA9PiBjLmVudGl0eSAhPT0gY2hpbGQuZW50aXR5KTtcbiAgICAgICAgICAgICAgICBwYXJlbnQuX2NoaWxkLnB1c2goY2hpbGQpO1xuICAgICAgICAgICAgICAgIHVwZGF0ZVRyZWUocmlnaHRPZkNoaWxkLCB7IHJpZ2h0T2Y6IHJpZ2h0T2ZDaGlsZC5yaWdodE9mIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSXRzIGEgcmUtb3JkZXIuIFdlIGFyZSB0aGUgbGFzdCBlbGVtZW50LCBzbyB3ZSBuZWVkIHRvIGZldGNoIHRoZSBlbGVtZW50IGJlZm9yZSB1cy5cbiAgICAgICAgICAgIGNoaWxkLnJpZ2h0T2YgPSBwYXJlbnQuX2NoaWxkW3BhcmVudC5fY2hpbGQubGVuZ3RoIC0gMl0/LmVudGl0eTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIEl0cyBhbiBhcHBlbmQuIFB1dCBpdCBhdCB0aGUgZW5kXG4gICAgICAgICAgICBjaGlsZC5yaWdodE9mID0gcGFyZW50Ll9jaGlsZFtwYXJlbnQuX2NoaWxkLmxlbmd0aCAtIDFdPy5lbnRpdHk7XG4gICAgICAgICAgICBwYXJlbnQuX2NoaWxkLnB1c2goY2hpbGQpO1xuICAgICAgICB9XG4gICAgICAgIGNoaWxkLnBhcmVudCA9IHBhcmVudC5lbnRpdHk7XG4gICAgICAgIHVwZGF0ZVRyZWUoY2hpbGQsIHsgcmlnaHRPZjogY2hpbGQucmlnaHRPZiwgcGFyZW50OiBwYXJlbnQuZW50aXR5IH0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZW1vdmVDaGlsZChwYXJlbnRJbnN0YW5jZSwgY2hpbGQpIHtcbiAgICAgICAgY29uc3QgY2hpbGRJbmRleCA9IHBhcmVudEluc3RhbmNlLl9jaGlsZC5maW5kSW5kZXgoKGMpID0+IGMuZW50aXR5ID09PSBjaGlsZC5lbnRpdHkpO1xuICAgICAgICBjb25zdCBjaGlsZFRvTW9kaWZ5ID0gcGFyZW50SW5zdGFuY2UuX2NoaWxkW2NoaWxkSW5kZXggKyAxXTtcbiAgICAgICAgaWYgKGNoaWxkVG9Nb2RpZnkpIHtcbiAgICAgICAgICAgIGNoaWxkVG9Nb2RpZnkucmlnaHRPZiA9IGNoaWxkLnJpZ2h0T2Y7XG4gICAgICAgICAgICB1cGRhdGVUcmVlKGNoaWxkVG9Nb2RpZnksIHsgcmlnaHRPZjogY2hpbGQucmlnaHRPZiB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBNdXRhdGUgXHVEODNEXHVEQzgwXG4gICAgICAgIHBhcmVudEluc3RhbmNlLl9jaGlsZC5zcGxpY2UoY2hpbGRJbmRleCwgMSk7XG4gICAgICAgIHJlbW92ZUNoaWxkRW50aXR5KGNoaWxkKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdXBkYXRlT25DaGFuZ2UoZW50aXR5LCBjb21wb25lbnRJZCwgc3RhdGUpIHtcbiAgICAgICAgY29uc3QgZXZlbnQgPSBjaGFuZ2VFdmVudHMuZ2V0KGVudGl0eSkgfHwgY2hhbmdlRXZlbnRzLnNldChlbnRpdHksIG5ldyBNYXAoKSkuZ2V0KGVudGl0eSk7XG4gICAgICAgIGNvbnN0IG9sZFN0YXRlID0gZXZlbnQuZ2V0KGNvbXBvbmVudElkKTtcbiAgICAgICAgY29uc3Qgb25DaGFuZ2VDYWxsYmFjayA9IHN0YXRlPy5vbkNoYW5nZUNhbGxiYWNrO1xuICAgICAgICBjb25zdCBvblN1Ym1pdENhbGxiYWNrID0gc3RhdGU/Lm9uU3VibWl0Q2FsbGJhY2s7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gc3RhdGU/LnZhbHVlID8/IG9sZFN0YXRlPy52YWx1ZTtcbiAgICAgICAgY29uc3QgaXNTdWJtaXQgPSBzdGF0ZT8uaXNTdWJtaXQgPz8gb2xkU3RhdGU/LmlzU3VibWl0O1xuICAgICAgICBldmVudC5zZXQoY29tcG9uZW50SWQsIHsgb25DaGFuZ2VDYWxsYmFjaywgb25TdWJtaXRDYWxsYmFjaywgdmFsdWUsIGlzU3VibWl0IH0pO1xuICAgIH1cbiAgICBjb25zdCBob3N0Q29uZmlnID0ge1xuICAgICAgICAuLi5ub29wQ29uZmlnLFxuICAgICAgICBjcmVhdGVJbnN0YW5jZSh0eXBlLCBwcm9wcykge1xuICAgICAgICAgICAgY29uc3QgZW50aXR5ID0gZW5naW5lLmFkZEVudGl0eSgpO1xuICAgICAgICAgICAgZW50aXRpZXMuYWRkKGVudGl0eSk7XG4gICAgICAgICAgICBjb25zdCBpbnN0YW5jZSA9IHtcbiAgICAgICAgICAgICAgICBlbnRpdHksXG4gICAgICAgICAgICAgICAgX2NoaWxkOiBbXSxcbiAgICAgICAgICAgICAgICBwYXJlbnQ6IENBTlZBU19ST09UX0VOVElUWSxcbiAgICAgICAgICAgICAgICByaWdodE9mOiB1bmRlZmluZWRcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBwcm9wcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGtleVR5cGVkID0ga2V5O1xuICAgICAgICAgICAgICAgIGlmIChrZXlUeXBlZCA9PT0gJ2NoaWxkcmVuJyB8fCBrZXlUeXBlZCA9PT0gJ2tleScpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChpc0xpc3RlbmVyKGtleVR5cGVkKSkge1xuICAgICAgICAgICAgICAgICAgICB1cHNlcnRMaXN0ZW5lcihpbnN0YW5jZSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2FkZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wczogcHJvcHNba2V5VHlwZWRdLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50OiBrZXlUeXBlZFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHVwc2VydENvbXBvbmVudChpbnN0YW5jZSwgcHJvcHNba2V5VHlwZWRdLCBrZXlUeXBlZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgICAgICB9LFxuICAgICAgICBhcHBlbmRDaGlsZCxcbiAgICAgICAgYXBwZW5kQ2hpbGRUb0NvbnRhaW5lcjogYXBwZW5kQ2hpbGQsXG4gICAgICAgIGFwcGVuZEluaXRpYWxDaGlsZDogYXBwZW5kQ2hpbGQsXG4gICAgICAgIHJlbW92ZUNoaWxkOiByZW1vdmVDaGlsZCxcbiAgICAgICAgcHJlcGFyZVVwZGF0ZShfaW5zdGFuY2UsIF90eXBlLCBvbGRQcm9wcywgbmV3UHJvcHMpIHtcbiAgICAgICAgICAgIHJldHVybiBjb21wb25lbnRLZXlzXG4gICAgICAgICAgICAgICAgLm1hcCgoY29tcG9uZW50KSA9PiBwcm9wc0NoYW5nZWQoY29tcG9uZW50LCBvbGRQcm9wc1tjb21wb25lbnRdLCBuZXdQcm9wc1tjb21wb25lbnRdKSlcbiAgICAgICAgICAgICAgICAuZmlsdGVyKGlzTm90VW5kZWZpbmVkKTtcbiAgICAgICAgfSxcbiAgICAgICAgY29tbWl0VXBkYXRlKGluc3RhbmNlLCB1cGRhdGVQYXlsb2FkLCBfdHlwZSwgX3ByZXZQcm9wcywgX25leHRQcm9wcywgX2ludGVybmFsSGFuZGxlKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHVwZGF0ZSBvZiB1cGRhdGVQYXlsb2FkKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzTGlzdGVuZXIodXBkYXRlLmNvbXBvbmVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdXBzZXJ0TGlzdGVuZXIoaW5zdGFuY2UsIHVwZGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodXBkYXRlLnR5cGUgPT09ICdkZWxldGUnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlbW92ZUNvbXBvbmVudChpbnN0YW5jZSwgdXBkYXRlLmNvbXBvbmVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHVwZGF0ZS5wcm9wcykge1xuICAgICAgICAgICAgICAgICAgICB1cHNlcnRDb21wb25lbnQoaW5zdGFuY2UsIHVwZGF0ZS5wcm9wcywgdXBkYXRlLmNvbXBvbmVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBpbnNlcnRCZWZvcmUocGFyZW50SW5zdGFuY2UsIGNoaWxkLCBiZWZvcmVDaGlsZCkge1xuICAgICAgICAgICAgY29uc3QgYmVmb3JlQ2hpbGRJbmRleCA9IHBhcmVudEluc3RhbmNlLl9jaGlsZC5maW5kSW5kZXgoKGMpID0+IGMuZW50aXR5ID09PSBiZWZvcmVDaGlsZC5lbnRpdHkpO1xuICAgICAgICAgICAgcGFyZW50SW5zdGFuY2UuX2NoaWxkID0gW1xuICAgICAgICAgICAgICAgIC4uLnBhcmVudEluc3RhbmNlLl9jaGlsZC5zbGljZSgwLCBiZWZvcmVDaGlsZEluZGV4KSxcbiAgICAgICAgICAgICAgICBjaGlsZCxcbiAgICAgICAgICAgICAgICAuLi5wYXJlbnRJbnN0YW5jZS5fY2hpbGQuc2xpY2UoYmVmb3JlQ2hpbGRJbmRleClcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBjaGlsZC5yaWdodE9mID0gYmVmb3JlQ2hpbGQucmlnaHRPZjtcbiAgICAgICAgICAgIGJlZm9yZUNoaWxkLnJpZ2h0T2YgPSBjaGlsZC5lbnRpdHk7XG4gICAgICAgICAgICBjaGlsZC5wYXJlbnQgPSBwYXJlbnRJbnN0YW5jZS5lbnRpdHk7XG4gICAgICAgICAgICB1cGRhdGVUcmVlKGNoaWxkLCB7IHJpZ2h0T2Y6IGNoaWxkLnJpZ2h0T2YsIHBhcmVudDogY2hpbGQucGFyZW50IH0pO1xuICAgICAgICAgICAgdXBkYXRlVHJlZShiZWZvcmVDaGlsZCwgeyByaWdodE9mOiBiZWZvcmVDaGlsZC5yaWdodE9mIH0pO1xuICAgICAgICB9LFxuICAgICAgICByZW1vdmVDaGlsZEZyb21Db250YWluZXIocGFyZW5JbnN0YW5jZSwgY2hpbGQpIHtcbiAgICAgICAgICAgIHJlbW92ZUNoaWxkRW50aXR5KGNoaWxkKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgY29uc3QgcmVjb25jaWxlciA9IFJlY29uY2lsZXIoaG9zdENvbmZpZyk7XG4gICAgY29uc3Qgcm9vdCA9IHJlY29uY2lsZXIuY3JlYXRlQ29udGFpbmVyKHt9LCAwLCBudWxsLCBmYWxzZSwgbnVsbCwgJycsIFxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgZnVuY3Rpb24gKCkgeyB9LCBudWxsKTtcbiAgICAvLyBNYXliZSB0aGlzIGNvdWxkIGJlIHNvbWV0aGluZyBzaW1pbGFyIHRvIElucHV0IHN5c3RlbSwgYnV0IHNpbmNlIHdlXG4gICAgLy8gYXJlIGdvaW5nIHRvIHVzZSB0aGlzIG9ubHkgaGVyZSwgaSBwcmVmZXIgdG8gc2NvcGUgaXQgaGVyZS5cbiAgICBmdW5jdGlvbiBoYW5kbGVPbkNoYW5nZShjb21wb25lbnRJZCwgcmVzdWx0Q29tcG9uZW50KSB7XG4gICAgICAgIGZvciAoY29uc3QgW2VudGl0eSwgUmVzdWx0XSBvZiBlbmdpbmUuZ2V0RW50aXRpZXNXaXRoKHJlc3VsdENvbXBvbmVudCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGVudGl0eVN0YXRlID0gY2hhbmdlRXZlbnRzLmdldChlbnRpdHkpPy5nZXQoY29tcG9uZW50SWQpO1xuICAgICAgICAgICAgY29uc3QgaXNTdWJtaXQgPSAhIVJlc3VsdC5pc1N1Ym1pdDtcbiAgICAgICAgICAgIGlmIChlbnRpdHlTdGF0ZT8ub25DaGFuZ2VDYWxsYmFjayAmJiBSZXN1bHQudmFsdWUgIT09IGVudGl0eVN0YXRlLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgZW50aXR5U3RhdGUub25DaGFuZ2VDYWxsYmFjayhSZXN1bHQudmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVudGl0eVN0YXRlPy5vblN1Ym1pdENhbGxiYWNrICYmIGlzU3VibWl0ICYmICFlbnRpdHlTdGF0ZS5pc1N1Ym1pdCkge1xuICAgICAgICAgICAgICAgIGVudGl0eVN0YXRlLm9uU3VibWl0Q2FsbGJhY2soUmVzdWx0LnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHVwZGF0ZU9uQ2hhbmdlKGVudGl0eSwgY29tcG9uZW50SWQsIHtcbiAgICAgICAgICAgICAgICBvbkNoYW5nZUNhbGxiYWNrOiBlbnRpdHlTdGF0ZT8ub25DaGFuZ2VDYWxsYmFjayxcbiAgICAgICAgICAgICAgICBvblN1Ym1pdENhbGxiYWNrOiBlbnRpdHlTdGF0ZT8ub25TdWJtaXRDYWxsYmFjayxcbiAgICAgICAgICAgICAgICB2YWx1ZTogUmVzdWx0LnZhbHVlLFxuICAgICAgICAgICAgICAgIGlzU3VibWl0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICB1cGRhdGU6IGZ1bmN0aW9uIChjb21wb25lbnQpIHtcbiAgICAgICAgICAgIGlmIChjaGFuZ2VFdmVudHMuc2l6ZSkge1xuICAgICAgICAgICAgICAgIGhhbmRsZU9uQ2hhbmdlKFVpSW5wdXQuY29tcG9uZW50SWQsIFVpSW5wdXRSZXN1bHQpO1xuICAgICAgICAgICAgICAgIGhhbmRsZU9uQ2hhbmdlKFVpRHJvcGRvd24uY29tcG9uZW50SWQsIFVpRHJvcGRvd25SZXN1bHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlY29uY2lsZXIudXBkYXRlQ29udGFpbmVyKGNvbXBvbmVudCwgcm9vdCwgbnVsbCk7XG4gICAgICAgIH0sXG4gICAgICAgIGdldEVudGl0aWVzOiAoKSA9PiBBcnJheS5mcm9tKGVudGl0aWVzKVxuICAgIH07XG59XG4iLCAiY29uc3QgcGFyc2VGb250ID0ge1xuICAgICdzYW5zLXNlcmlmJzogMCAvKiBGb250LkZfU0FOU19TRVJJRiAqLyxcbiAgICBzZXJpZjogMSAvKiBGb250LkZfU0VSSUYgKi8sXG4gICAgbW9ub3NwYWNlOiAyIC8qIEZvbnQuRl9NT05PU1BBQ0UgKi9cbn07XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9udChmb250KSB7XG4gICAgaWYgKCFmb250KVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB7IGZvbnQ6IHBhcnNlRm9udFtmb250XSB9O1xufVxuY29uc3QgcGFyc2VUZXh0QWxpZ24gPSB7XG4gICAgJ3RvcC1sZWZ0JzogMCAvKiBUZXh0QWxpZ25Nb2RlLlRBTV9UT1BfTEVGVCAqLyxcbiAgICAndG9wLWNlbnRlcic6IDEgLyogVGV4dEFsaWduTW9kZS5UQU1fVE9QX0NFTlRFUiAqLyxcbiAgICAndG9wLXJpZ2h0JzogMiAvKiBUZXh0QWxpZ25Nb2RlLlRBTV9UT1BfUklHSFQgKi8sXG4gICAgJ21pZGRsZS1sZWZ0JzogMyAvKiBUZXh0QWxpZ25Nb2RlLlRBTV9NSURETEVfTEVGVCAqLyxcbiAgICAnbWlkZGxlLWNlbnRlcic6IDQgLyogVGV4dEFsaWduTW9kZS5UQU1fTUlERExFX0NFTlRFUiAqLyxcbiAgICAnbWlkZGxlLXJpZ2h0JzogNSAvKiBUZXh0QWxpZ25Nb2RlLlRBTV9NSURETEVfUklHSFQgKi8sXG4gICAgJ2JvdHRvbS1sZWZ0JzogNiAvKiBUZXh0QWxpZ25Nb2RlLlRBTV9CT1RUT01fTEVGVCAqLyxcbiAgICAnYm90dG9tLWNlbnRlcic6IDcgLyogVGV4dEFsaWduTW9kZS5UQU1fQk9UVE9NX0NFTlRFUiAqLyxcbiAgICAnYm90dG9tLXJpZ2h0JzogOCAvKiBUZXh0QWxpZ25Nb2RlLlRBTV9CT1RUT01fUklHSFQgKi9cbn07XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGV4dEFsaWduKHRleHRBbGlnbikge1xuICAgIGlmICghdGV4dEFsaWduKVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB7IHRleHRBbGlnbjogcGFyc2VUZXh0QWxpZ25bdGV4dEFsaWduXSB9O1xufVxuIiwgImNvbnN0IHBhcnNlVGV4dHVyZU1vZGUgPSB7XG4gICAgJ25pbmUtc2xpY2VzJzogMCAvKiBCYWNrZ3JvdW5kVGV4dHVyZU1vZGUuTklORV9TTElDRVMgKi8sXG4gICAgY2VudGVyOiAxIC8qIEJhY2tncm91bmRUZXh0dXJlTW9kZS5DRU5URVIgKi8sXG4gICAgc3RyZXRjaDogMiAvKiBCYWNrZ3JvdW5kVGV4dHVyZU1vZGUuU1RSRVRDSCAqL1xufTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUZXh0dXJlTW9kZShtb2RlKSB7XG4gICAgY29uc3QgdmFsdWUgPSBtb2RlID8gcGFyc2VUZXh0dXJlTW9kZVttb2RlXSA6IDEgLyogQmFja2dyb3VuZFRleHR1cmVNb2RlLkNFTlRFUiAqLztcbiAgICByZXR1cm4geyB0ZXh0dXJlTW9kZTogdmFsdWUgfTtcbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUZXh0dXJlKHByb3BzKSB7XG4gICAgaWYgKHByb3BzLnRleHR1cmUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRleDoge1xuICAgICAgICAgICAgICAgICRjYXNlOiAndGV4dHVyZScsXG4gICAgICAgICAgICAgICAgdGV4dHVyZTogcGFyc2VUZXh0dXJlKHByb3BzLnRleHR1cmUpXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuICAgIGlmIChwcm9wcy5hdmF0YXJUZXh0dXJlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0ZXg6IHtcbiAgICAgICAgICAgICAgICAkY2FzZTogJ2F2YXRhclRleHR1cmUnLFxuICAgICAgICAgICAgICAgIGF2YXRhclRleHR1cmU6IHBhcnNlVGV4dHVyZShwcm9wcy5hdmF0YXJUZXh0dXJlKVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xufVxuZnVuY3Rpb24gcGFyc2VUZXh0dXJlKHRleHR1cmUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICAuLi50ZXh0dXJlLFxuICAgICAgICB3cmFwTW9kZTogdGV4dHVyZS53cmFwTW9kZSA/IHBhcnNlV3JhcFt0ZXh0dXJlLndyYXBNb2RlXSA6IHVuZGVmaW5lZCxcbiAgICAgICAgZmlsdGVyTW9kZTogdGV4dHVyZS5maWx0ZXJNb2RlID8gcGFyc2VGaWx0ZXJbdGV4dHVyZS5maWx0ZXJNb2RlXSA6IHVuZGVmaW5lZFxuICAgIH07XG59XG5jb25zdCBwYXJzZVdyYXAgPSB7XG4gICAgcmVwZWF0OiAwIC8qIFRleHR1cmVXcmFwTW9kZS5UV01fUkVQRUFUICovLFxuICAgIGNsYW1wOiAxIC8qIFRleHR1cmVXcmFwTW9kZS5UV01fQ0xBTVAgKi8sXG4gICAgbWlycm9yOiAyIC8qIFRleHR1cmVXcmFwTW9kZS5UV01fTUlSUk9SICovXG59O1xuY29uc3QgcGFyc2VGaWx0ZXIgPSB7XG4gICAgcG9pbnQ6IDAgLyogVGV4dHVyZUZpbHRlck1vZGUuVEZNX1BPSU5UICovLFxuICAgICdiaS1saW5lYXInOiAxIC8qIFRleHR1cmVGaWx0ZXJNb2RlLlRGTV9CSUxJTkVBUiAqLyxcbiAgICAndHJpLWxpbmVhcic6IDIgLyogVGV4dHVyZUZpbHRlck1vZGUuVEZNX1RSSUxJTkVBUiAqL1xufTtcbiIsICJpbXBvcnQgeyBnZXRUZXh0dXJlLCBnZXRUZXh0dXJlTW9kZSB9IGZyb20gJy4vdXRpbHMnO1xuLyoqXG4gKiBAcHVibGljXG4gKi9cbi8qIEBfX1BVUkVfXyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVWlCYWNrZ3JvdW5kKHByb3BzKSB7XG4gICAgaWYgKCFwcm9wcyB8fCAhT2JqZWN0LmtleXMocHJvcHMpLmxlbmd0aClcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCB0ZXh0dXJlID0gZ2V0VGV4dHVyZShwcm9wcyk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgLi4ucHJvcHMsXG4gICAgICAgIC4uLmdldFRleHR1cmVNb2RlKHByb3BzLnRleHR1cmVNb2RlKSxcbiAgICAgICAgdXZzOiBwcm9wcy51dnMgPz8gW10sXG4gICAgICAgIHRleHR1cmVcbiAgICB9O1xufVxuIiwgImZ1bmN0aW9uIGNhcGl0YWxpemUodmFsdWUpIHtcbiAgICByZXR1cm4gYCR7dmFsdWVbMF0udG9VcHBlckNhc2UoKX0ke3ZhbHVlLnNsaWNlKDEsIHZhbHVlLmxlbmd0aCl9YDtcbn1cbmZ1bmN0aW9uIGlzUGVyY2VudCh2YWwpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgJiYgdmFsLmVuZHNXaXRoKCclJyk7XG59XG5mdW5jdGlvbiBpc1BvaW50KHZhbCkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsID09PSAnc3RyaW5nJyAmJiB2YWwuZW5kc1dpdGgoJ3B4Jyk7XG59XG5mdW5jdGlvbiBwYXJzZVBvc2l0aW9uVW5pdCh2YWwpIHtcbiAgICBmdW5jdGlvbiBnZXRWYWx1ZShrZXksIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBOdW1iZXIodmFsdWUuc2xpY2UoMCwgdmFsdWUuaW5kZXhPZihrZXkpKSk7XG4gICAgfVxuICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCB8fCB2YWwgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIFt1bmRlZmluZWQsIDAgLyogWUdVbml0LllHVV9VTkRFRklORUQgKi9dO1xuICAgIH1cbiAgICBpZiAodmFsID09PSAnYXV0bycpIHtcbiAgICAgICAgcmV0dXJuIFswLCAzIC8qIFlHVW5pdC5ZR1VfQVVUTyAqL107XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJyB8fCAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgJiYgIWlzTmFOKE51bWJlcih2YWwpKSkpIHtcbiAgICAgICAgcmV0dXJuIFtOdW1iZXIodmFsKSwgMSAvKiBZR1VuaXQuWUdVX1BPSU5UICovXTtcbiAgICB9XG4gICAgaWYgKGlzUGVyY2VudCh2YWwpKSB7XG4gICAgICAgIHJldHVybiBbZ2V0VmFsdWUoJyUnLCB2YWwpLCAyIC8qIFlHVW5pdC5ZR1VfUEVSQ0VOVCAqL107XG4gICAgfVxuICAgIGlmIChpc1BvaW50KHZhbCkpIHtcbiAgICAgICAgcmV0dXJuIFtnZXRWYWx1ZSgncHgnLCB2YWwpLCAxIC8qIFlHVW5pdC5ZR1VfUE9JTlQgKi9dO1xuICAgIH1cbiAgICByZXR1cm4gW3VuZGVmaW5lZCwgMCAvKiBZR1VuaXQuWUdVX1VOREVGSU5FRCAqL107XG59XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VQb3NpdGlvbihwb3NpdGlvbiA9IHt9LCBwcm9wKSB7XG4gICAgaWYgKHR5cGVvZiBwb3NpdGlvbiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgY29uc3Qgb2JqID0ge307XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHBvc2l0aW9uKSB7XG4gICAgICAgICAgICBjb25zdCB0eXBlZEtleSA9IGtleTtcbiAgICAgICAgICAgIGNvbnN0IHByb3BLZXkgPSBgJHtwcm9wfSR7Y2FwaXRhbGl6ZSh0eXBlZEtleSl9YDtcbiAgICAgICAgICAgIGNvbnN0IHByb3BLZXlVbml0ID0gYCR7cHJvcH0ke2NhcGl0YWxpemUodHlwZWRLZXkpfVVuaXRgO1xuICAgICAgICAgICAgY29uc3QgW3ZhbHVlLCB1bml0XSA9IHBhcnNlUG9zaXRpb25Vbml0KHBvc2l0aW9uW3R5cGVkS2V5XSk7XG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIG9ialtwcm9wS2V5VW5pdF0gPSB1bml0O1xuICAgICAgICAgICAgb2JqW3Byb3BLZXldID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9iajtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBwb3NpdGlvbiA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlUG9zaXRpb24oeyB0b3A6IHBvc2l0aW9uLCBsZWZ0OiBwb3NpdGlvbiwgcmlnaHQ6IHBvc2l0aW9uLCBib3R0b206IHBvc2l0aW9uIH0sIHByb3ApO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZXMgPSBwb3NpdGlvbi5zcGxpdCgnICcpLmZpbHRlcigoYSkgPT4gYSAhPT0gJycpO1xuICAgIGlmICh2YWx1ZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGNvbnN0IFt2YWx1ZV0gPSB2YWx1ZXM7XG4gICAgICAgIHJldHVybiBwYXJzZVBvc2l0aW9uKHsgdG9wOiB2YWx1ZSwgbGVmdDogdmFsdWUsIHJpZ2h0OiB2YWx1ZSwgYm90dG9tOiB2YWx1ZSB9LCBwcm9wKTtcbiAgICB9XG4gICAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgY29uc3QgW3RvcEJvdHRvbSwgcmlndGhMZWZ0XSA9IHZhbHVlcztcbiAgICAgICAgcmV0dXJuIHBhcnNlUG9zaXRpb24oeyB0b3A6IHRvcEJvdHRvbSwgbGVmdDogcmlndGhMZWZ0LCByaWdodDogcmlndGhMZWZ0LCBib3R0b206IHRvcEJvdHRvbSB9LCBwcm9wKTtcbiAgICB9XG4gICAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDMpIHtcbiAgICAgICAgY29uc3QgW3RvcCwgcmlndGhMZWZ0LCBib3R0b21dID0gdmFsdWVzO1xuICAgICAgICByZXR1cm4gcGFyc2VQb3NpdGlvbih7IHRvcCwgbGVmdDogcmlndGhMZWZ0LCByaWdodDogcmlndGhMZWZ0LCBib3R0b20gfSwgcHJvcCk7XG4gICAgfVxuICAgIGNvbnN0IFt0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnRdID0gdmFsdWVzO1xuICAgIHJldHVybiBwYXJzZVBvc2l0aW9uKHsgdG9wLCByaWdodCwgYm90dG9tLCBsZWZ0IH0sIHByb3ApO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU2l6ZSh2YWwsIGtleSkge1xuICAgIGNvbnN0IHVuaXRLZXkgPSBgJHtrZXl9VW5pdGA7XG4gICAgY29uc3QgW3ZhbHVlLCB1bml0XSA9IHBhcnNlUG9zaXRpb25Vbml0KHZhbCk7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiB7fTtcbiAgICByZXR1cm4ge1xuICAgICAgICBba2V5XTogdmFsdWUsXG4gICAgICAgIFt1bml0S2V5XTogdW5pdFxuICAgIH07XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGlzcGxheShkaXNwbGF5KSB7XG4gICAgY29uc3QgdmFsdWUgPSBkaXNwbGF5ID8gcGFyc2VEaXNwbGF5W2Rpc3BsYXldIDogMCAvKiBZR0Rpc3BsYXkuWUdEX0ZMRVggKi87XG4gICAgcmV0dXJuIHsgZGlzcGxheTogdmFsdWUgfTtcbn1cbmNvbnN0IHBhcnNlRGlzcGxheSA9IHtcbiAgICBmbGV4OiAwIC8qIFlHRGlzcGxheS5ZR0RfRkxFWCAqLyxcbiAgICBub25lOiAxIC8qIFlHRGlzcGxheS5ZR0RfTk9ORSAqL1xufTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRKdXN0aWZ5KGp1c3RpZnkpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGp1c3RpZnkgPyBwYXJzZUp1c3RpZnlbanVzdGlmeV0gOiAwIC8qIFlHSnVzdGlmeS5ZR0pfRkxFWF9TVEFSVCAqLztcbiAgICByZXR1cm4geyBqdXN0aWZ5Q29udGVudDogdmFsdWUgfTtcbn1cbmNvbnN0IHBhcnNlSnVzdGlmeSA9IHtcbiAgICBjZW50ZXI6IDEgLyogWUdKdXN0aWZ5LllHSl9DRU5URVIgKi8sXG4gICAgJ2ZsZXgtZW5kJzogMiAvKiBZR0p1c3RpZnkuWUdKX0ZMRVhfRU5EICovLFxuICAgICdmbGV4LXN0YXJ0JzogMCAvKiBZR0p1c3RpZnkuWUdKX0ZMRVhfU1RBUlQgKi8sXG4gICAgJ3NwYWNlLWFyb3VuZCc6IDQgLyogWUdKdXN0aWZ5LllHSl9TUEFDRV9BUk9VTkQgKi8sXG4gICAgJ3NwYWNlLWJldHdlZW4nOiAzIC8qIFlHSnVzdGlmeS5ZR0pfU1BBQ0VfQkVUV0VFTiAqLyxcbiAgICAnc3BhY2UtZXZlbmx5JzogNSAvKiBZR0p1c3RpZnkuWUdKX1NQQUNFX0VWRU5MWSAqL1xufTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRBbGlnbihwcm9wLCBhbGlnbikge1xuICAgIGNvbnN0IHZhbHVlID0gcGFyc2VBbGlnbnNbYWxpZ25dO1xuICAgIHJldHVybiB7IFtwcm9wXTogdmFsdWUgfTtcbn1cbmNvbnN0IHBhcnNlQWxpZ25zID0ge1xuICAgIGF1dG86IDAgLyogWUdBbGlnbi5ZR0FfQVVUTyAqLyxcbiAgICBiYXNlbGluZTogNSAvKiBZR0FsaWduLllHQV9CQVNFTElORSAqLyxcbiAgICBjZW50ZXI6IDIgLyogWUdBbGlnbi5ZR0FfQ0VOVEVSICovLFxuICAgICdmbGV4LWVuZCc6IDMgLyogWUdBbGlnbi5ZR0FfRkxFWF9FTkQgKi8sXG4gICAgJ2ZsZXgtc3RhcnQnOiAxIC8qIFlHQWxpZ24uWUdBX0ZMRVhfU1RBUlQgKi8sXG4gICAgc3RyZXRjaDogNCAvKiBZR0FsaWduLllHQV9TVFJFVENIICovLFxuICAgICdzcGFjZS1iZXR3ZWVuJzogNiAvKiBZR0FsaWduLllHQV9TUEFDRV9CRVRXRUVOICovLFxuICAgICdzcGFjZS1hcm91bmQnOiA3IC8qIFlHQWxpZ24uWUdBX1NQQUNFX0FST1VORCAqL1xufTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGbGV4RGlyZWN0aW9uKGZsZXhEaXJlY3Rpb24pIHtcbiAgICBjb25zdCB2YWx1ZSA9IGZsZXhEaXJlY3Rpb24gPyBwYXJzZUZsZXhEaXJlY3Rpb25bZmxleERpcmVjdGlvbl0gOiAwIC8qIFlHRmxleERpcmVjdGlvbi5ZR0ZEX1JPVyAqLztcbiAgICByZXR1cm4geyBmbGV4RGlyZWN0aW9uOiB2YWx1ZSB9O1xufVxuY29uc3QgcGFyc2VGbGV4RGlyZWN0aW9uID0ge1xuICAgIHJvdzogMCAvKiBZR0ZsZXhEaXJlY3Rpb24uWUdGRF9ST1cgKi8sXG4gICAgY29sdW1uOiAxIC8qIFlHRmxleERpcmVjdGlvbi5ZR0ZEX0NPTFVNTiAqLyxcbiAgICAncm93LXJldmVyc2UnOiAzIC8qIFlHRmxleERpcmVjdGlvbi5ZR0ZEX1JPV19SRVZFUlNFICovLFxuICAgICdjb2x1bW4tcmV2ZXJzZSc6IDIgLyogWUdGbGV4RGlyZWN0aW9uLllHRkRfQ09MVU1OX1JFVkVSU0UgKi9cbn07XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmxleFdyYXAoZmxleFdyYXApIHtcbiAgICBjb25zdCB2YWx1ZSA9IHBhcnNlRmxleFdyYXBbZmxleFdyYXBdO1xuICAgIHJldHVybiB7IGZsZXhXcmFwOiB2YWx1ZSB9O1xufVxuY29uc3QgcGFyc2VGbGV4V3JhcCA9IHtcbiAgICB3cmFwOiAxIC8qIFlHV3JhcC5ZR1dfV1JBUCAqLyxcbiAgICBub3dyYXA6IDAgLyogWUdXcmFwLllHV19OT19XUkFQICovLFxuICAgICd3cmFwLXJldmVyc2UnOiAyIC8qIFlHV3JhcC5ZR1dfV1JBUF9SRVZFUlNFICovXG59O1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE92ZXJmbG93KG92ZXJmbG93KSB7XG4gICAgY29uc3QgdmFsdWUgPSBvdmVyZmxvdyA/IHBhcnNlT3ZlcmZsb3dbb3ZlcmZsb3ddIDogMCAvKiBZR092ZXJmbG93LllHT19WSVNJQkxFICovO1xuICAgIHJldHVybiB7IG92ZXJmbG93OiB2YWx1ZSB9O1xufVxuY29uc3QgcGFyc2VPdmVyZmxvdyA9IHtcbiAgICB2aXNpYmxlOiAwIC8qIFlHT3ZlcmZsb3cuWUdPX1ZJU0lCTEUgKi8sXG4gICAgc2Nyb2xsOiAyIC8qIFlHT3ZlcmZsb3cuWUdPX1NDUk9MTCAqLyxcbiAgICBoaWRkZW46IDEgLyogWUdPdmVyZmxvdy5ZR09fSElEREVOICovXG59O1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBvc2l0aW9uVHlwZShwb3NpdGlvbikge1xuICAgIGNvbnN0IHZhbHVlID0gcG9zaXRpb24gPyBwYXJzZVBvc2l0aW9uVHlwZVtwb3NpdGlvbl0gOiAwIC8qIFlHUG9zaXRpb25UeXBlLllHUFRfUkVMQVRJVkUgKi87XG4gICAgcmV0dXJuIHsgcG9zaXRpb25UeXBlOiB2YWx1ZSB9O1xufVxuY29uc3QgcGFyc2VQb3NpdGlvblR5cGUgPSB7XG4gICAgcmVsYXRpdmU6IDAgLyogWUdQb3NpdGlvblR5cGUuWUdQVF9SRUxBVElWRSAqLyxcbiAgICBhYnNvbHV0ZTogMSAvKiBZR1Bvc2l0aW9uVHlwZS5ZR1BUX0FCU09MVVRFICovXG59O1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBvaW50ZXJGaWx0ZXIocG9pbnRlckZpbHRlcikge1xuICAgIGNvbnN0IHZhbHVlID0gcG9pbnRlckZpbHRlciA/IHBhcnNlUG9pbnRlckZpbHRlcltwb2ludGVyRmlsdGVyXSA6IDAgLyogUG9pbnRlckZpbHRlck1vZGUuUEZNX05PTkUgKi87XG4gICAgcmV0dXJuIHsgcG9pbnRlckZpbHRlcjogdmFsdWUgfTtcbn1cbmNvbnN0IHBhcnNlUG9pbnRlckZpbHRlciA9IHtcbiAgICBub25lOiAwIC8qIFBvaW50ZXJGaWx0ZXJNb2RlLlBGTV9OT05FICovLFxuICAgIGJsb2NrOiAxIC8qIFBvaW50ZXJGaWx0ZXJNb2RlLlBGTV9CTE9DSyAqL1xufTtcbiIsICJpbXBvcnQgeyBnZXRBbGlnbiwgZ2V0RGlzcGxheSwgZ2V0RmxleERpcmVjdGlvbiwgZ2V0RmxleFdyYXAsIGdldEp1c3RpZnksIGdldE92ZXJmbG93LCBnZXRQb2ludGVyRmlsdGVyLCBnZXRQb3NpdGlvblR5cGUsIHBhcnNlUG9zaXRpb24sIHBhcnNlU2l6ZSB9IGZyb20gJy4vdXRpbHMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IENBTlZBU19ST09UX0VOVElUWSA9IDA7XG5jb25zdCBkZWZhdWx0VWlUcmFuc2Zvcm0gPSB7XG4gICAgb3ZlcmZsb3c6IDAgLyogWUdPdmVyZmxvdy5ZR09fVklTSUJMRSAqLyxcbiAgICBkaXNwbGF5OiAwIC8qIFlHRGlzcGxheS5ZR0RfRkxFWCAqLyxcbiAgICBqdXN0aWZ5Q29udGVudDogMCAvKiBZR0p1c3RpZnkuWUdKX0ZMRVhfU1RBUlQgKi8sXG4gICAgYWxpZ25TZWxmOiAwIC8qIFlHQWxpZ24uWUdBX0FVVE8gKi8sXG4gICAgZmxleERpcmVjdGlvbjogMCAvKiBZR0ZsZXhEaXJlY3Rpb24uWUdGRF9ST1cgKi8sXG4gICAgcG9zaXRpb25UeXBlOiAwIC8qIFlHUG9zaXRpb25UeXBlLllHUFRfUkVMQVRJVkUgKi8sXG4gICAgcGFyZW50OiBDQU5WQVNfUk9PVF9FTlRJVFksXG4gICAgcmlnaHRPZjogMCxcbiAgICBmbGV4QmFzaXM6IDAsXG4gICAgd2lkdGg6IDAsXG4gICAgaGVpZ2h0OiAwLFxuICAgIG1pbldpZHRoOiAwLFxuICAgIG1pbkhlaWdodDogMCxcbiAgICBtYXhXaWR0aDogMCxcbiAgICBtYXhIZWlnaHQ6IDAsXG4gICAgZmxleEdyb3c6IDAsXG4gICAgbWFyZ2luQm90dG9tOiAwLFxuICAgIG1hcmdpbkJvdHRvbVVuaXQ6IDAgLyogWUdVbml0LllHVV9VTkRFRklORUQgKi8sXG4gICAgbWFyZ2luTGVmdDogMCxcbiAgICBtYXJnaW5MZWZ0VW5pdDogMCAvKiBZR1VuaXQuWUdVX1VOREVGSU5FRCAqLyxcbiAgICBtYXJnaW5SaWdodDogMCxcbiAgICBtYXJnaW5SaWdodFVuaXQ6IDAgLyogWUdVbml0LllHVV9VTkRFRklORUQgKi8sXG4gICAgbWFyZ2luVG9wOiAwLFxuICAgIG1hcmdpblRvcFVuaXQ6IDAgLyogWUdVbml0LllHVV9VTkRFRklORUQgKi8sXG4gICAgbWF4SGVpZ2h0VW5pdDogMCAvKiBZR1VuaXQuWUdVX1VOREVGSU5FRCAqLyxcbiAgICBtYXhXaWR0aFVuaXQ6IDAgLyogWUdVbml0LllHVV9VTkRFRklORUQgKi8sXG4gICAgbWluSGVpZ2h0VW5pdDogMCAvKiBZR1VuaXQuWUdVX1VOREVGSU5FRCAqLyxcbiAgICBtaW5XaWR0aFVuaXQ6IDAgLyogWUdVbml0LllHVV9VTkRFRklORUQgKi8sXG4gICAgcGFkZGluZ0JvdHRvbTogMCxcbiAgICBwYWRkaW5nQm90dG9tVW5pdDogMCAvKiBZR1VuaXQuWUdVX1VOREVGSU5FRCAqLyxcbiAgICBwYWRkaW5nTGVmdDogMCxcbiAgICBwYWRkaW5nTGVmdFVuaXQ6IDAgLyogWUdVbml0LllHVV9VTkRFRklORUQgKi8sXG4gICAgcGFkZGluZ1RvcFVuaXQ6IDAgLyogWUdVbml0LllHVV9VTkRFRklORUQgKi8sXG4gICAgcGFkZGluZ1JpZ2h0OiAwLFxuICAgIHBhZGRpbmdSaWdodFVuaXQ6IDAgLyogWUdVbml0LllHVV9VTkRFRklORUQgKi8sXG4gICAgcGFkZGluZ1RvcDogMCxcbiAgICBwb3NpdGlvbkJvdHRvbTogMCxcbiAgICBwb3NpdGlvbkJvdHRvbVVuaXQ6IDAgLyogWUdVbml0LllHVV9VTkRFRklORUQgKi8sXG4gICAgcG9zaXRpb25MZWZ0OiAwLFxuICAgIHBvc2l0aW9uTGVmdFVuaXQ6IDAgLyogWUdVbml0LllHVV9VTkRFRklORUQgKi8sXG4gICAgcG9zaXRpb25SaWdodDogMCxcbiAgICBwb3NpdGlvblJpZ2h0VW5pdDogMCAvKiBZR1VuaXQuWUdVX1VOREVGSU5FRCAqLyxcbiAgICBwb3NpdGlvblRvcDogMCxcbiAgICBwb3NpdGlvblRvcFVuaXQ6IDAgLyogWUdVbml0LllHVV9VTkRFRklORUQgKi8sXG4gICAgZmxleEJhc2lzVW5pdDogMCAvKiBZR1VuaXQuWUdVX1VOREVGSU5FRCAqLyxcbiAgICB3aWR0aFVuaXQ6IDAgLyogWUdVbml0LllHVV9VTkRFRklORUQgKi8sXG4gICAgaGVpZ2h0VW5pdDogMCAvKiBZR1VuaXQuWUdVX1VOREVGSU5FRCAqLyxcbiAgICBwb2ludGVyRmlsdGVyOiAwIC8qIFBvaW50ZXJGaWx0ZXJNb2RlLlBGTV9OT05FICovXG59O1xuLyoqXG4gKiBAcHVibGljXG4gKi9cbi8qIEBfX1BVUkVfXyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVWlUcmFuc2Zvcm0ocHJvcHMgPSB7fSkge1xuICAgIGNvbnN0IHsgaGVpZ2h0LCBtaW5IZWlnaHQsIG1heEhlaWdodCwgd2lkdGgsIG1pbldpZHRoLCBtYXhXaWR0aCwgYWxpZ25JdGVtcywgYWxpZ25Db250ZW50LCBmbGV4V3JhcCwgLi4ub3RoZXJQcm9wcyB9ID0gcHJvcHM7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgLi4uZGVmYXVsdFVpVHJhbnNmb3JtLFxuICAgICAgICAuLi5vdGhlclByb3BzLFxuICAgICAgICAuLi5wYXJzZVBvc2l0aW9uKHByb3BzLnBvc2l0aW9uLCAncG9zaXRpb24nKSxcbiAgICAgICAgLi4ucGFyc2VQb3NpdGlvbihwcm9wcy5tYXJnaW4sICdtYXJnaW4nKSxcbiAgICAgICAgLi4ucGFyc2VQb3NpdGlvbihwcm9wcy5wYWRkaW5nLCAncGFkZGluZycpLFxuICAgICAgICAuLi5wYXJzZVNpemUocHJvcHMuaGVpZ2h0LCAnaGVpZ2h0JyksXG4gICAgICAgIC4uLnBhcnNlU2l6ZShwcm9wcy5taW5IZWlnaHQsICdtaW5IZWlnaHQnKSxcbiAgICAgICAgLi4ucGFyc2VTaXplKHByb3BzLm1heEhlaWdodCwgJ21heEhlaWdodCcpLFxuICAgICAgICAuLi5wYXJzZVNpemUocHJvcHMud2lkdGgsICd3aWR0aCcpLFxuICAgICAgICAuLi5wYXJzZVNpemUocHJvcHMubWluV2lkdGgsICdtaW5XaWR0aCcpLFxuICAgICAgICAuLi5wYXJzZVNpemUocHJvcHMubWF4V2lkdGgsICdtYXhXaWR0aCcpLFxuICAgICAgICAuLi5nZXREaXNwbGF5KHByb3BzLmRpc3BsYXkpLFxuICAgICAgICAuLi5nZXRBbGlnbignYWxpZ25TZWxmJywgcHJvcHMuYWxpZ25TZWxmID8/ICdhdXRvJyksXG4gICAgICAgIC4uLmdldEp1c3RpZnkocHJvcHMuanVzdGlmeUNvbnRlbnQpLFxuICAgICAgICAuLi5nZXRGbGV4RGlyZWN0aW9uKHByb3BzLmZsZXhEaXJlY3Rpb24pLFxuICAgICAgICAuLi5nZXRPdmVyZmxvdyhwcm9wcy5vdmVyZmxvdyksXG4gICAgICAgIC4uLmdldFBvaW50ZXJGaWx0ZXIocHJvcHMucG9pbnRlckZpbHRlciksXG4gICAgICAgIC4uLmdldFBvc2l0aW9uVHlwZShwcm9wcy5wb3NpdGlvblR5cGUpLFxuICAgICAgICAvLyBPcHRpb25hbCB2YWx1ZXNcbiAgICAgICAgLi4uKGFsaWduQ29udGVudCAmJiBnZXRBbGlnbignYWxpZ25Db250ZW50JywgYWxpZ25Db250ZW50KSksXG4gICAgICAgIC4uLihhbGlnbkl0ZW1zICYmIGdldEFsaWduKCdhbGlnbkl0ZW1zJywgYWxpZ25JdGVtcykpLFxuICAgICAgICAuLi4oZmxleFdyYXAgJiYgZ2V0RmxleFdyYXAoZmxleFdyYXApKVxuICAgIH07XG59XG4iLCAiaW1wb3J0IHsgcGFyc2VVaUJhY2tncm91bmQgfSBmcm9tICcuL3VpQmFja2dyb3VuZCc7XG5pbXBvcnQgeyBwYXJzZVVpVHJhbnNmb3JtIH0gZnJvbSAnLi91aVRyYW5zZm9ybSc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VQcm9wcyhwcm9wcykge1xuICAgIGNvbnN0IHsgdWlUcmFuc2Zvcm0sIHVpQmFja2dyb3VuZCwgLi4ub3RoZXJQcm9wcyB9ID0gcHJvcHM7XG4gICAgY29uc3QgdWlUcmFuc2Zvcm1Qcm9wcyA9IHBhcnNlVWlUcmFuc2Zvcm0odWlUcmFuc2Zvcm0pO1xuICAgIGNvbnN0IHVpQmFja2dyb3VuZFByb3BzID0gdWlCYWNrZ3JvdW5kID8geyB1aUJhY2tncm91bmQ6IHBhcnNlVWlCYWNrZ3JvdW5kKHVpQmFja2dyb3VuZCkgfSA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4ge1xuICAgICAgICAuLi5vdGhlclByb3BzLFxuICAgICAgICB1aVRyYW5zZm9ybTogdWlUcmFuc2Zvcm1Qcm9wcyxcbiAgICAgICAgLi4udWlCYWNrZ3JvdW5kUHJvcHNcbiAgICB9O1xufVxuIiwgImNvbnN0IGxpc3RlbmVycyA9IHtcbiAgICBvbk1vdXNlRG93bjogdW5kZWZpbmVkLFxuICAgIG9uTW91c2VVcDogdW5kZWZpbmVkXG59O1xuY29uc3QgbGlzdGVuZXJzS2V5ID0gT2JqZWN0LmtleXMobGlzdGVuZXJzKTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBpc0xpc3RlbmVyID0gKGtleSkgPT4gbGlzdGVuZXJzS2V5LmluY2x1ZGVzKGtleSk7XG4iLCAiaW1wb3J0IHsgcGFyc2VQcm9wcyB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7IFJlYWN0RWNzIH0gZnJvbSAnLi4vLi4vcmVhY3QtZWNzJztcbmltcG9ydCB7IGdldEZvbnQsIGdldFRleHRBbGlnbiB9IGZyb20gJy4vdXRpbHMnO1xuLyoqXG4gKlxuICogQHB1YmxpY1xuICogTGFiZWwgY29tcG9uZW50XG4gKlxuICogQSBsYWJlbCBkaXNwbGF5cyB0ZXh0IGNvbnRlbnRcbiAqXG4gKiBAZXhhbXBsZVxuICogPExhYmVsIHZhbHVlPVwiU0RLIDdcIiB1aVRyYW5zZm9ybT17eyBtYXJnaW46IHsgbGVmdDogMTAgfSB9fSAvPlxuICpcbiAqIEBjYXRlZ29yeSBDb21wb25lbnRcbiAqL1xuLyogQF9fUFVSRV9fICovXG5leHBvcnQgZnVuY3Rpb24gTGFiZWwocHJvcHMpIHtcbiAgICBjb25zdCB7IHVpVHJhbnNmb3JtLCB1aUJhY2tncm91bmQsIG9uTW91c2VEb3duLCBvbk1vdXNlVXAsIC4uLnVpVGV4dFByb3BzIH0gPSBwcm9wcztcbiAgICBjb25zdCBjb21tb25Qcm9wcyA9IHBhcnNlUHJvcHMoe1xuICAgICAgICB1aVRyYW5zZm9ybSxcbiAgICAgICAgdWlCYWNrZ3JvdW5kLFxuICAgICAgICBvbk1vdXNlRG93bixcbiAgICAgICAgb25Nb3VzZVVwXG4gICAgfSk7XG4gICAgY29uc3QgeyBmb250LCB0ZXh0QWxpZ24sIC4uLnRleHRQcm9wcyB9ID0gdWlUZXh0UHJvcHM7XG4gICAgY29uc3QgdWlUZXh0ID0ge1xuICAgICAgICAuLi50ZXh0UHJvcHMsXG4gICAgICAgIC4uLmdldEZvbnQoZm9udCksXG4gICAgICAgIC4uLmdldFRleHRBbGlnbih0ZXh0QWxpZ24pXG4gICAgfTtcbiAgICByZXR1cm4gUmVhY3RFY3MuY3JlYXRlRWxlbWVudChcImVudGl0eVwiLCB7IC4uLmNvbW1vblByb3BzLCB1aVRleHQ6IHVpVGV4dCB9KTtcbn1cbiIsICJpbXBvcnQgeyBSZWFjdEVjcyB9IGZyb20gJy4uL3JlYWN0LWVjcyc7XG5pbXBvcnQgeyBnZXRGb250LCBnZXRUZXh0QWxpZ24gfSBmcm9tICcuL0xhYmVsL3V0aWxzJztcbmltcG9ydCB7IHBhcnNlUHJvcHMgfSBmcm9tICcuL3V0aWxzJztcbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMnO1xuZXhwb3J0ICogZnJvbSAnLi91aVRyYW5zZm9ybS90eXBlcyc7XG5leHBvcnQgKiBmcm9tICcuL2xpc3RlbmVycy90eXBlcyc7XG5leHBvcnQgKiBmcm9tICcuL0lucHV0L3R5cGVzJztcbmV4cG9ydCAqIGZyb20gJy4vdWlCYWNrZ3JvdW5kL3R5cGVzJztcbmV4cG9ydCAqIGZyb20gJy4vRHJvcGRvd24vdHlwZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9MYWJlbC90eXBlcyc7XG5leHBvcnQgKiBmcm9tICcuL0J1dHRvbi90eXBlcyc7XG5leHBvcnQgeyBEcm9wZG93biB9IGZyb20gJy4vRHJvcGRvd24nO1xuZXhwb3J0IHsgSW5wdXQgfSBmcm9tICcuL0lucHV0JztcbmV4cG9ydCB7IExhYmVsIH0gZnJvbSAnLi9MYWJlbCc7XG5leHBvcnQgeyBCdXR0b24gfSBmcm9tICcuL0J1dHRvbic7XG4vKipcbiAqIEBwdWJsaWNcbiAqIEBjYXRlZ29yeSBDb21wb25lbnRcbiAqL1xuLyogQF9fUFVSRV9fICovXG5leHBvcnQgZnVuY3Rpb24gVWlFbnRpdHkocHJvcHMpIHtcbiAgICBjb25zdCB1aVRleHQgPSBwcm9wcy51aVRleHQgJiYge1xuICAgICAgICB1aVRleHQ6IHtcbiAgICAgICAgICAgIC4uLnByb3BzLnVpVGV4dCxcbiAgICAgICAgICAgIC4uLmdldEZvbnQocHJvcHMudWlUZXh0LmZvbnQpLFxuICAgICAgICAgICAgLi4uZ2V0VGV4dEFsaWduKHByb3BzLnVpVGV4dC50ZXh0QWxpZ24pXG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBSZWFjdEVjcy5jcmVhdGVFbGVtZW50KFwiZW50aXR5XCIsIHsgLi4ucGFyc2VQcm9wcyhwcm9wcyksIC4uLnVpVGV4dCB9KTtcbn1cbiIsICJpbXBvcnQgeyBpc0xpc3RlbmVyIH0gZnJvbSAnLi4vY29tcG9uZW50cyc7XG5leHBvcnQgZnVuY3Rpb24gcHJvcHNDaGFuZ2VkKGNvbXBvbmVudCwgcHJldlByb3BzLCBuZXh0UHJvcHMpIHtcbiAgICBpZiAocHJldlByb3BzICYmICFuZXh0UHJvcHMpIHtcbiAgICAgICAgcmV0dXJuIHsgdHlwZTogJ2RlbGV0ZScsIGNvbXBvbmVudCB9O1xuICAgIH1cbiAgICBpZiAoIW5leHRQcm9wcykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghcHJldlByb3BzICYmIG5leHRQcm9wcykge1xuICAgICAgICByZXR1cm4geyB0eXBlOiAnYWRkJywgcHJvcHM6IG5leHRQcm9wcywgY29tcG9uZW50IH07XG4gICAgfVxuICAgIGlmIChpc0xpc3RlbmVyKGNvbXBvbmVudCkpIHtcbiAgICAgICAgaWYgKCFpc0VxdWFsKHByZXZQcm9wcywgbmV4dFByb3BzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgdHlwZTogJ3B1dCcsIGNvbXBvbmVudCwgcHJvcHM6IG5leHRQcm9wcyB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGNoYW5nZXMgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGsgaW4gcHJldlByb3BzKSB7XG4gICAgICAgIGNvbnN0IHByb3BLZXkgPSBrO1xuICAgICAgICBpZiAoIWlzRXF1YWwocHJldlByb3BzW3Byb3BLZXldLCBuZXh0UHJvcHNbcHJvcEtleV0pKSB7XG4gICAgICAgICAgICBjaGFuZ2VzW3Byb3BLZXldID0gbmV4dFByb3BzW3Byb3BLZXldO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICghT2JqZWN0LmtleXMoY2hhbmdlcykubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIHsgdHlwZTogJ3B1dCcsIHByb3BzOiBjaGFuZ2VzLCBjb21wb25lbnQgfTtcbn1cbi8vIGFzIGFueSBIQUNLIHNvIGV2ZXJ5IHRpbWUgd2UgYWRkIGEgbmV3IGNvbXBvbmVudCwgd2UgbXVzdCBhZGQgYWxzbyB0aGUgY29tcG9uZW50IGhlcmUuXG5jb25zdCBlbnRpdHlDb21wb25lbnQgPSB7XG4gICAgdWlUZXh0OiB1bmRlZmluZWQsXG4gICAgdWlCYWNrZ3JvdW5kOiB1bmRlZmluZWQsXG4gICAgdWlUcmFuc2Zvcm06IHVuZGVmaW5lZCxcbiAgICBvbk1vdXNlRG93bjogdW5kZWZpbmVkLFxuICAgIG9uTW91c2VVcDogdW5kZWZpbmVkLFxuICAgIHVpSW5wdXQ6IHVuZGVmaW5lZCxcbiAgICB1aURyb3Bkb3duOiB1bmRlZmluZWRcbn07XG5leHBvcnQgY29uc3QgY29tcG9uZW50S2V5cyA9IE9iamVjdC5rZXlzKGVudGl0eUNvbXBvbmVudCk7XG5leHBvcnQgZnVuY3Rpb24gaXNFcXVhbCh2YWwxLCB2YWwyKSB7XG4gICAgaWYgKCF2YWwxICYmICF2YWwyKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoIXZhbDEgfHwgIXZhbDIpIHtcbiAgICAgICAgcmV0dXJuIHZhbDEgPT09IHZhbDI7XG4gICAgfVxuICAgIGlmICh2YWwxID09PSB2YWwyKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbDEgIT09IHR5cGVvZiB2YWwyKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWwxICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gdmFsMSA9PT0gdmFsMjtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsMSkgJiYgQXJyYXkuaXNBcnJheSh2YWwyKSkge1xuICAgICAgICBpZiAodmFsMS5sZW5ndGggIT09IHZhbDIubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKE9iamVjdC5rZXlzKHZhbDEpLmxlbmd0aCAhPT0gT2JqZWN0LmtleXModmFsMikubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKEpTT04uc3RyaW5naWZ5KHZhbDEpID09PSBKU09OLnN0cmluZ2lmeSh2YWwyKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBrZXkgaW4gdmFsMSkge1xuICAgICAgICBpZiAoIWlzRXF1YWwodmFsMVtrZXldLCB2YWwyW2tleV0pKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmV4cG9ydCBjb25zdCBpc05vdFVuZGVmaW5lZCA9ICh2YWwpID0+IHtcbiAgICByZXR1cm4gISF2YWw7XG59O1xuZXhwb3J0IGNvbnN0IG5vb3BDb25maWcgPSB7XG4gICAgc3VwcG9ydHNNdXRhdGlvbjogdHJ1ZSxcbiAgICBzdXBwb3J0c1BlcnNpc3RlbmNlOiBmYWxzZSxcbiAgICBub1RpbWVvdXQ6IC0xLFxuICAgIGlzUHJpbWFyeVJlbmRlcmVyOiB0cnVlLFxuICAgIHN1cHBvcnRzSHlkcmF0aW9uOiBmYWxzZSxcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIGluc2VydEluQ29udGFpbmVyQmVmb3JlKF9jb250YWluZXIsIF9jaGlsZCwgX2JlZm9yZUNoaWxkKSB7IH0sXG4gICAgZGV0YWNoRGVsZXRlZEluc3RhbmNlKF9ub2RlKSB7IH0sXG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICBoaWRlSW5zdGFuY2UoX2luc3RhbmNlKSB7IH0sXG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICBoaWRlVGV4dEluc3RhbmNlKF90ZXh0SW5zdGFuY2UpIHsgfSxcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIHVuaGlkZUluc3RhbmNlKF9pbnN0YW5jZSwgX3Byb3BzKSB7IH0sXG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICB1bmhpZGVUZXh0SW5zdGFuY2UoX3RleHRJbnN0YW5jZSwgX3RleHQpIHsgfSxcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIGNsZWFyQ29udGFpbmVyKF9jb250YWluZXIpIHsgfSxcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIGdldEN1cnJlbnRFdmVudFByaW9yaXR5KCkge1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9LFxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgZ2V0SW5zdGFuY2VGcm9tTm9kZShfbm9kZSkge1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgYmVmb3JlQWN0aXZlSW5zdGFuY2VCbHVyKCkgeyB9LFxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgYWZ0ZXJBY3RpdmVJbnN0YW5jZUJsdXIoKSB7IH0sXG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICBwcmVwYXJlU2NvcGVVcGRhdGUoKSB7IH0sXG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICBnZXRJbnN0YW5jZUZyb21TY29wZSgpIHtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSxcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIGNvbW1pdE1vdW50KF9pbnN0YW5jZSwgX3R5cGUsIF9wcm9wcywgX2ludGVybmFsSW5zdGFuY2VIYW5kbGUpIHsgfSxcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIHJlc2V0VGV4dENvbnRlbnQoX2luc3RhbmNlKSB7IH0sXG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICBjb21taXRUZXh0VXBkYXRlKF90ZXh0SW5zdGFuY2UsIF9vbGRUZXh0LCBfbmV3VGV4dCkgeyB9LFxuICAgIHByZXBhcmVGb3JDb21taXQoX2NvbnRhaW5lckluZm8pIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSxcbiAgICByZXNldEFmdGVyQ29tbWl0KF9jb250YWluZXJJbmZvKSB7IH0sXG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICBwcmVwYXJlUG9ydGFsTW91bnQoX2NvbnRhaW5lckluZm8pIHsgfSxcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIGNyZWF0ZVRleHRJbnN0YW5jZShfdGV4dCwgX3Jvb3RDb250YWluZXIsIF9ob3N0Q29udGV4dCwgX2ludGVybmFsSGFuZGxlKSB7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9LFxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgc2NoZWR1bGVUaW1lb3V0KF9mbiwgX2RlbGF5KSB7IH0sXG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICBjYW5jZWxUaW1lb3V0KF9pZCkgeyB9LFxuICAgIHNob3VsZFNldFRleHRDb250ZW50KF90eXBlLCBfcHJvcHMpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0sXG4gICAgZ2V0Um9vdEhvc3RDb250ZXh0KF9yb290Q29udGFpbmVyKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH0sXG4gICAgZ2V0Q2hpbGRIb3N0Q29udGV4dChfcGFyZW50SG9zdENvbnRleHQsIF90eXBlLCBfcm9vdENvbnRhaW5lcikge1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgZ2V0UHVibGljSW5zdGFuY2UoaW5zdGFuY2UpIHtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH0sXG4gICAgZmluYWxpemVJbml0aWFsQ2hpbGRyZW4oX2luc3RhbmNlLCBfdHlwZSwgX3Byb3BzLCBfcm9vdENvbnRhaW5lciwgX2hvc3RDb250ZXh0KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59O1xuIiwgImltcG9ydCB7IGNyZWF0ZVJlY29uY2lsZXIgfSBmcm9tICcuL3JlY29uY2lsZXInO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlYWN0QmFzZWRVaVN5c3RlbShlbmdpbmUsIHBvaW50ZXJTeXN0ZW0pIHtcbiAgICBjb25zdCByZW5kZXJlciA9IGNyZWF0ZVJlY29uY2lsZXIoZW5naW5lLCBwb2ludGVyU3lzdGVtKTtcbiAgICBsZXQgdWlDb21wb25lbnQgPSB1bmRlZmluZWQ7XG4gICAgZnVuY3Rpb24gUmVhY3RCYXNlZFVpU3lzdGVtKCkge1xuICAgICAgICBpZiAodWlDb21wb25lbnQpXG4gICAgICAgICAgICByZW5kZXJlci51cGRhdGUodWlDb21wb25lbnQoKSk7XG4gICAgfVxuICAgIGVuZ2luZS5hZGRTeXN0ZW0oUmVhY3RCYXNlZFVpU3lzdGVtLCAxMDBlMywgJ0BkY2wvcmVhY3QtZWNzJyk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZGVzdHJveSgpIHtcbiAgICAgICAgICAgIGVuZ2luZS5yZW1vdmVTeXN0ZW0oUmVhY3RCYXNlZFVpU3lzdGVtKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZW50aXR5IG9mIHJlbmRlcmVyLmdldEVudGl0aWVzKCkpIHtcbiAgICAgICAgICAgICAgICBlbmdpbmUucmVtb3ZlRW50aXR5KGVudGl0eSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHNldFVpUmVuZGVyZXIodWkpIHtcbiAgICAgICAgICAgIHVpQ29tcG9uZW50ID0gdWk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuIiwgImltcG9ydCB7IGVuZ2luZSwgcG9pbnRlckV2ZW50c1N5c3RlbSB9IGZyb20gJ0BkY2wvZWNzJztcbmltcG9ydCB7IFJlYWN0RWNzIH0gZnJvbSAnLi9yZWFjdC1lY3MnO1xuaW1wb3J0IHsgY3JlYXRlUmVhY3RCYXNlZFVpU3lzdGVtIH0gZnJvbSAnLi9zeXN0ZW0nO1xuZXhwb3J0ICogZnJvbSAnLi9jb21wb25lbnRzJztcbmV4cG9ydCAqIGZyb20gJy4vc3lzdGVtJztcbmV4cG9ydCAqIGZyb20gJy4vcmVhY3QtZWNzJztcbi8qKlxuICogUmVhY3RFY3MgdmFyaWFibGUgcHJvdmlkZXMgdGhlIGZ1bmN0aW9uIHRvIHJlbmRlciAmIGRlc3Ryb3kgdGhlIHNwZWNpZmllZCBVSVxuICogQHB1YmxpY1xuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7IFJlYWN0RWNzUmVuZGVyZXIgfSBmcm9tICdAZGNsL3Nkay9yZWFjdC1lY3MnXG4gKiBSZWFjdEVjc1JlbmRlcmVyLnNldFVpUmVuZGVyZXIodWlDb21wb25lbnQpXG4gKi9cbmV4cG9ydCBjb25zdCBSZWFjdEVjc1JlbmRlcmVyID0gLyogQF9fUFVSRV9fICovIGNyZWF0ZVJlYWN0QmFzZWRVaVN5c3RlbShlbmdpbmUsIHBvaW50ZXJFdmVudHNTeXN0ZW0pO1xuZXhwb3J0IGRlZmF1bHQgUmVhY3RFY3M7XG4iLCAiLyoqXG4gKiBUaGUgbW9kdWxlIHJlYWN0LWVjcyBpcyBleHBvc2VkIGJ5IHRoZSBzZGsgaW4gdGhlIC9yZWFjdC1lY3MgcGF0aC5cbiAqXG4gKiBVSSBjb21wb25lbnRzIGFuZCBzZW1hbnRpY3MgZm9yIHRoZSBTREsgNy5cbiAqXG4gKiBKU1ggJiBGbGV4Ym94IGlzIHVzZWQgZHVlIHRvIGl0cyBtYXJrZXQgYWRvcHRpb24gYW5kIGF2YWlsYWJpbGl0eSBvZiBpbXBsZW1lbnRhdGlvbnMgYW5kIGRvY3VtZW50YXRpb24gYW5kIGV4cGVydGlzZS5cbiAqIEBleGFtcGxlXG4gKiBgYGB0c3hcbiAqIGltcG9ydCBSZWFjdEVjcywgeyBMYWJlbCwgUmVhY3RFY3NSZW5kZXJlciB9IGZyb20gJ0BkY2wvc2RrL3JlYWN0LWVjcydcbiAqIGNvbnN0IFVpID0gKCkgPT4gPExhYmVsIHZhbHVlPVwiU0RLIDdcIiAvPlxuICogUmVhY3RFY3NSZW5kZXJlci5zZXRVaVJlbmRlcmVyKHVpKVxuICogYGBgXG4gKlxuICpcbiAqIEdvIHRvIHRoZSBGdW5jdGlvbiBzZWN0aW9uIHRvIHNlZSBhbGwgdGhlIFVJIENvbXBvbmVudHMuXG4gKiBAbW9kdWxlIFJlYWN0RWNzXG4gKlxuICovXG5cbmltcG9ydCBSZWFjdEVjcyBmcm9tICdAZGNsL3JlYWN0LWVjcydcbmV4cG9ydCAqIGZyb20gJ0BkY2wvcmVhY3QtZWNzJ1xuZXhwb3J0IGRlZmF1bHQgUmVhY3RFY3NcbiIsICJpbXBvcnQgeyBJRW5naW5lLCBJU2NoZW1hLCBKc29uU2NoZW1hRXh0ZW5kZWQsIFNjaGVtYXMgfSBmcm9tICdAZGNsL3Nkay9lY3MnXG5pbXBvcnQge1xuICBBY3Rpb24sXG4gIEFjdGlvblBheWxvYWQsXG4gIEFjdGlvblR5cGUsXG4gIEFjdGlvblR5cGVzLFxuICBDb21wb25lbnROYW1lLFxuICBnZXRDb21wb25lbnQsXG59IGZyb20gJy4vZGVmaW5pdGlvbnMnXG5cbmV4cG9ydCBjb25zdCBFTVBUWTogSnNvblNjaGVtYUV4dGVuZGVkID0ge1xuICB0eXBlOiAnb2JqZWN0JyxcbiAgcHJvcGVydGllczoge30sXG4gIHNlcmlhbGl6YXRpb25UeXBlOiAnbWFwJyxcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZEFjdGlvblR5cGU8VCBleHRlbmRzIElTY2hlbWE+KFxuICBlbmdpbmU6IElFbmdpbmUsXG4gIHR5cGU6IHN0cmluZyxcbiAgc2NoZW1hPzogVCxcbikge1xuICBjb25zdCBBY3Rpb25UeXBlcyA9IGdldENvbXBvbmVudDxBY3Rpb25UeXBlcz4oXG4gICAgQ29tcG9uZW50TmFtZS5BQ1RJT05fVFlQRVMsXG4gICAgZW5naW5lLFxuICApXG4gIGNvbnN0IGFjdGlvblR5cGVzID0gQWN0aW9uVHlwZXMuZ2V0T3JDcmVhdGVNdXRhYmxlKGVuZ2luZS5Sb290RW50aXR5KVxuICBjb25zdCBhY3Rpb25UeXBlID0ge1xuICAgIHR5cGUsXG4gICAganNvblNjaGVtYTogSlNPTi5zdHJpbmdpZnkoXG4gICAgICBzY2hlbWE/Lmpzb25TY2hlbWEgfHwgU2NoZW1hcy5NYXAoe30pLmpzb25TY2hlbWEsXG4gICAgKSxcbiAgfVxuICBhY3Rpb25UeXBlcy52YWx1ZSA9IFtcbiAgICAuLi5hY3Rpb25UeXBlcy52YWx1ZS5maWx0ZXIoKCQpID0+ICQudHlwZSAhPT0gYWN0aW9uVHlwZS50eXBlKSxcbiAgICBhY3Rpb25UeXBlLFxuICBdXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBY3Rpb25TY2hlbWE8VCA9IHVua25vd24+KGVuZ2luZTogSUVuZ2luZSwgdHlwZTogc3RyaW5nKSB7XG4gIGNvbnN0IEFjdGlvblR5cGVzID0gZ2V0Q29tcG9uZW50PEFjdGlvblR5cGVzPihcbiAgICBDb21wb25lbnROYW1lLkFDVElPTl9UWVBFUyxcbiAgICBlbmdpbmUsXG4gIClcbiAgY29uc3QgYWN0aW9uVHlwZXMgPSBBY3Rpb25UeXBlcy5nZXQoZW5naW5lLlJvb3RFbnRpdHkpXG4gIGNvbnN0IGFjdGlvblR5cGUgPSBhY3Rpb25UeXBlcy52YWx1ZS5maW5kKCgkKSA9PiAkLnR5cGUgPT09IHR5cGUpXG4gIGNvbnN0IGpzb25TY2hlbWE6IEpzb25TY2hlbWFFeHRlbmRlZCA9IGFjdGlvblR5cGVcbiAgICA/IEpTT04ucGFyc2UoYWN0aW9uVHlwZS5qc29uU2NoZW1hKVxuICAgIDogRU1QVFlcbiAgcmV0dXJuIFNjaGVtYXMuZnJvbUpzb24oanNvblNjaGVtYSkgYXMgSVNjaGVtYTxUPlxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWN0aW9uVHlwZXMoZW5naW5lOiBJRW5naW5lKSB7XG4gIGNvbnN0IEFjdGlvblR5cGVzID0gZ2V0Q29tcG9uZW50PEFjdGlvblR5cGVzPihcbiAgICBDb21wb25lbnROYW1lLkFDVElPTl9UWVBFUyxcbiAgICBlbmdpbmUsXG4gIClcbiAgY29uc3QgYWN0aW9uVHlwZXMgPSBBY3Rpb25UeXBlcy5nZXQoZW5naW5lLlJvb3RFbnRpdHkpXG4gIHJldHVybiBhY3Rpb25UeXBlcy52YWx1ZS5tYXAoKCQpID0+ICQudHlwZSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFBheWxvYWQ8VCBleHRlbmRzIEFjdGlvblR5cGU+KGFjdGlvbjogQWN0aW9uKSB7XG4gIHJldHVybiBKU09OLnBhcnNlKGFjdGlvbi5qc29uUGF5bG9hZCkgYXMgQWN0aW9uUGF5bG9hZDxUPlxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SnNvbjxUIGV4dGVuZHMgQWN0aW9uVHlwZT4ocGF5bG9hZDogQWN0aW9uUGF5bG9hZDxUPikge1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocGF5bG9hZClcbn1cbiIsICJpbXBvcnQgeyBDb2xsaWRlckxheWVyLCBZR0FsaWduLCBZR0p1c3RpZnkgfSBmcm9tICdAZGNsL3Nkay9lY3MnXG5cbmV4cG9ydCBlbnVtIENvbXBvbmVudE5hbWUge1xuICBBQ1RJT05fVFlQRVMgPSAnYXNzZXQtcGFja3M6OkFjdGlvblR5cGVzJyxcbiAgQUNUSU9OUyA9ICdhc3NldC1wYWNrczo6QWN0aW9ucycsXG4gIENPVU5URVIgPSAnYXNzZXQtcGFja3M6OkNvdW50ZXInLFxuICBUUklHR0VSUyA9ICdhc3NldC1wYWNrczo6VHJpZ2dlcnMnLFxuICBTVEFURVMgPSAnYXNzZXQtcGFja3M6OlN0YXRlcycsXG59XG5cbmV4cG9ydCBlbnVtIFR3ZWVuVHlwZSB7XG4gIE1PVkVfSVRFTSA9ICdtb3ZlX2l0ZW0nLFxuICBST1RBVEVfSVRFTSA9ICdyb3RhdGVfaXRlbScsXG4gIFNDQUxFX0lURU0gPSAnc2NhbGVfaXRlbScsXG59XG5cbmV4cG9ydCBlbnVtIEludGVycG9sYXRpb25UeXBlIHtcbiAgTElORUFSID0gJ2xpbmVhcicsXG4gIEVBU0VJTlFVQUQgPSAnZWFzZWlucXVhZCcsXG4gIEVBU0VPVVRRVUFEID0gJ2Vhc2VvdXRxdWFkJyxcbiAgRUFTRVFVQUQgPSAnZWFzZXF1YWQnLFxuICBFQVNFSU5TSU5FID0gJ2Vhc2VpbnNpbmUnLFxuICBFQVNFT1VUU0lORSA9ICdlYXNlb3V0c2luZScsXG4gIEVBU0VTSU5FID0gJ2Vhc2Vpbm91dHNpbmUnLFxuICBFQVNFSU5FWFBPID0gJ2Vhc2VpbmV4cG8nLFxuICBFQVNFT1VURVhQTyA9ICdlYXNlb3V0ZXhwbycsXG4gIEVBU0VFWFBPID0gJ2Vhc2Vpbm91dGV4cG8nLFxuICBFQVNFSU5FTEFTVElDID0gJ2Vhc2VpbmVsYXN0aWMnLFxuICBFQVNFT1VURUxBU1RJQyA9ICdlYXNlb3V0ZWxhc3RpYycsXG4gIEVBU0VFTEFTVElDID0gJ2Vhc2Vpbm91dGVsYXN0aWMnLFxuICBFQVNFSU5CT1VOQ0UgPSAnZWFzZWluYm91bmNlJyxcbiAgRUFTRU9VVEVCT1VOQ0UgPSAnZWFzZW91dGJvdW5jZScsXG4gIEVBU0VCT1VOQ0UgPSAnZWFzZWlub3V0Ym91bmNlJyxcbn1cblxuZXhwb3J0IGVudW0gQWN0aW9uVHlwZSB7XG4gIFBMQVlfQU5JTUFUSU9OID0gJ3BsYXlfYW5pbWF0aW9uJyxcbiAgU1RPUF9BTklNQVRJT04gPSAnc3RvcF9hbmltYXRpb24nLFxuICBTRVRfU1RBVEUgPSAnc2V0X3N0YXRlJyxcbiAgU1RBUlRfVFdFRU4gPSAnc3RhcnRfdHdlZW4nLFxuICBTRVRfQ09VTlRFUiA9ICdzZXRfY291bnRlcicsXG4gIElOQ1JFTUVOVF9DT1VOVEVSID0gJ2luY3JlbWVudF9jb3VudGVyJyxcbiAgREVDUkVBU0VfQ09VTlRFUiA9ICdkZWNyZWFzZV9jb3VudGVyJyxcbiAgUExBWV9TT1VORCA9ICdwbGF5X3NvdW5kJyxcbiAgU1RPUF9TT1VORCA9ICdzdG9wX3NvdW5kJyxcbiAgU0VUX1ZJU0lCSUxJVFkgPSAnc2V0X3Zpc2liaWxpdHknLFxuICBBVFRBQ0hfVE9fUExBWUVSID0gJ2F0dGFjaF90b19wbGF5ZXInLFxuICBERVRBQ0hfRlJPTV9QTEFZRVIgPSAnZGV0YWNoX2Zyb21fcGxheWVyJyxcbiAgUExBWV9WSURFT19TVFJFQU0gPSAncGxheV92aWRlb19zdHJlYW0nLFxuICBTVE9QX1ZJREVPX1NUUkVBTSA9ICdzdG9wX3ZpZGVvX3N0cmVhbScsXG4gIFBMQVlfQVVESU9fU1RSRUFNID0gJ3BsYXlfYXVkaW9fc3RyZWFtJyxcbiAgU1RPUF9BVURJT19TVFJFQU0gPSAnc3RvcF9hdWRpb19zdHJlYW0nLFxuICBURUxFUE9SVF9QTEFZRVIgPSAndGVsZXBvcnRfcGxheWVyJyxcbiAgTU9WRV9QTEFZRVIgPSAnbW92ZV9wbGF5ZXInLFxuICBQTEFZX0RFRkFVTFRfRU1PVEUgPSAncGxheV9kZWZhdWx0X2Vtb3RlJyxcbiAgUExBWV9DVVNUT01fRU1PVEUgPSAncGxheV9jdXN0b21fZW1vdGUnLFxuICBPUEVOX0xJTksgPSAnb3Blbl9saW5rJyxcbiAgU0hPV19URVhUID0gJ3Nob3dfdGV4dCcsXG4gIEhJREVfVEVYVCA9ICdoaWRlX3RleHQnLFxuICBTVEFSVF9ERUxBWSA9ICdzdGFydF9kZWxheScsXG4gIFNUT1BfREVMQVkgPSAnc3RvcF9kZWxheScsXG4gIFNUQVJUX0xPT1AgPSAnc3RhcnRfbG9vcCcsXG4gIFNUT1BfTE9PUCA9ICdzdG9wX2xvb3AnLFxuICBDTE9ORV9FTlRJVFkgPSAnY2xvbmVfZW50aXR5JyxcbiAgUkVNT1ZFX0VOVElUWSA9ICdyZW1vdmVfZW50aXR5JyxcbiAgU0hPV19JTUFHRSA9ICdzaG93X2ltYWdlJyxcbiAgSElERV9JTUFHRSA9ICdoaWRlX2ltYWdlJyxcbn1cblxuZXhwb3J0IGVudW0gVHJpZ2dlclR5cGUge1xuICBPTl9DTElDSyA9ICdvbl9jbGljaycsXG4gIE9OX1NUQVRFX0NIQU5HRSA9ICdvbl9zdGF0ZV9jaGFuZ2UnLFxuICBPTl9TUEFXTiA9ICdvbl9zcGF3bicsXG4gIE9OX1RXRUVOX0VORCA9ICdvbl90d2Vlbl9lbmQnLFxuICBPTl9DT1VOVEVSX0NIQU5HRSA9ICdvbl9jb3VudGVyX2NoYW5nZScsXG4gIE9OX1BMQVlFUl9FTlRFUlNfQVJFQSA9ICdvbl9wbGF5ZXJfZW50ZXJzX2FyZWEnLFxuICBPTl9QTEFZRVJfTEVBVkVTX0FSRUEgPSAnb25fcGxheWVyX2xlYXZlc19hcmVhJyxcbiAgT05fREVMQVkgPSAnb25fZGVsYXknLFxuICBPTl9MT09QID0gJ29uX2xvb3AnLFxuICBPTl9DTE9ORSA9ICdvbl9jbG9uZScsXG4gIE9OX0NMSUNLX0lNQUdFID0gJ29uX2NsaWNrX2ltYWdlJyxcbn1cblxuZXhwb3J0IGVudW0gVHJpZ2dlckNvbmRpdGlvblR5cGUge1xuICBXSEVOX1NUQVRFX0lTID0gJ3doZW5fc3RhdGVfaXMnLFxuICBXSEVOX1NUQVRFX0lTX05PVCA9ICd3aGVuX3N0YXRlX2lzX25vdCcsXG4gIFdIRU5fQ09VTlRFUl9FUVVBTFMgPSAnd2hlbl9jb3VudGVyX2VxdWFscycsXG4gIFdIRU5fQ09VTlRFUl9JU19HUkVBVEVSX1RIQU4gPSAnd2hlbl9jb3VudGVyX2lzX2dyZWF0ZXJfdGhhbicsXG4gIFdIRU5fQ09VTlRFUl9JU19MRVNTX1RIQU4gPSAnd2hlbl9jb3VudGVyX2lzX2xlc3NfdGhhbicsXG59XG5cbmV4cG9ydCBlbnVtIFRyaWdnZXJDb25kaXRpb25PcGVyYXRpb24ge1xuICBBTkQgPSAnYW5kJyxcbiAgT1IgPSAnb3InLFxufVxuXG4vLyBEZWZpbmVkIHZhbHVlcyBpbnN0ZWFkIG9mIHVzaW5nIGZyb20gQGRjbC9lY3MgYmVjYXVzZSBTY2hlbWFzIGRvZXNuJ3Qgc3VwcG9ydCBjb25zdCBlbnVtc1xuZXhwb3J0IGVudW0gQWxpZ25Nb2RlIHtcbiAgVEFNX1RPUF9MRUZUID0gMCxcbiAgVEFNX1RPUF9DRU5URVIgPSAxLFxuICBUQU1fVE9QX1JJR0hUID0gMixcbiAgVEFNX01JRERMRV9MRUZUID0gMyxcbiAgVEFNX01JRERMRV9DRU5URVIgPSA0LFxuICBUQU1fTUlERExFX1JJR0hUID0gNSxcbiAgVEFNX0JPVFRPTV9MRUZUID0gNixcbiAgVEFNX0JPVFRPTV9DRU5URVIgPSA3LFxuICBUQU1fQk9UVE9NX1JJR0hUID0gOCxcbn1cblxuLy8gRGVmaW5lZCB2YWx1ZXMgaW5zdGVhZCBvZiB1c2luZyBmcm9tIEBkY2wvZWNzIGJlY2F1c2UgU2NoZW1hcyBkb2Vzbid0IHN1cHBvcnQgY29uc3QgZW51bXNcbmV4cG9ydCBlbnVtIEZvbnQge1xuICBGX1NBTlNfU0VSSUYgPSAwLFxuICBGX1NFUklGID0gMSxcbiAgRl9NT05PU1BBQ0UgPSAyLFxufVxuXG5leHBvcnQgdHlwZSBTY3JlZW5BbGlnbk1vZGUgPSB7XG4gIGFsaWduSXRlbXM6IFlHQWxpZ25cbiAganVzdGlmeUNvbnRlbnQ6IFlHSnVzdGlmeVxufVxuXG4vLyBEZWZpbmVkIHZhbHVlcyBpbnN0ZWFkIG9mIHVzaW5nIGZyb20gQGRjbC9lY3MgYmVjYXVzZSBTY2hlbWFzIGRvZXNuJ3Qgc3VwcG9ydCBjb25zdCBlbnVtc1xuZXhwb3J0IGVudW0gQ29sbGlkZXJzIHtcbiAgLyoqIENMX05PTkUgLSBubyBjb2xsaXNpb25zICovXG4gIENMX05PTkUgPSAwLFxuICAvKiogQ0xfUE9JTlRFUiAtIGNvbGxpc2lvbnMgd2l0aCB0aGUgcGxheWVyJ3MgcG9pbnRlciByYXkgKGUuZy4gbW91c2UgY3Vyc29yIGhvdmVyaW5nKSAqL1xuICBDTF9QT0lOVEVSID0gMSxcbiAgLyoqIENMX1BIWVNJQ1MgLSBjb2xsaXNpb24gYWZmZWN0aW5nIHlvdXIgcGxheWVyJ3MgcGh5c2ljcyBpLmUuIHdhbGxzLCBmbG9vciwgbW92aW5nIHBsYXRmcm9tcyAqL1xuICBDTF9QSFlTSUNTID0gMixcbiAgQ0xfUkVTRVJWRUQxID0gNCxcbiAgQ0xfUkVTRVJWRUQyID0gOCxcbiAgQ0xfUkVTRVJWRUQzID0gMTYsXG4gIENMX1JFU0VSVkVENCA9IDMyLFxuICBDTF9SRVNFUlZFRDUgPSA2NCxcbiAgQ0xfUkVTRVJWRUQ2ID0gMTI4LFxuICBDTF9DVVNUT00xID0gMjU2LFxuICBDTF9DVVNUT00yID0gNTEyLFxuICBDTF9DVVNUT00zID0gMTAyNCxcbiAgQ0xfQ1VTVE9NNCA9IDIwNDgsXG4gIENMX0NVU1RPTTUgPSA0MDk2LFxuICBDTF9DVVNUT002ID0gODE5MixcbiAgQ0xfQ1VTVE9NNyA9IDE2Mzg0LFxuICBDTF9DVVNUT004ID0gMzI3NjgsXG59XG4iLCAiZXhwb3J0IHR5cGUgRXZlbnRUeXBlID0gc3RyaW5nIHwgc3ltYm9sO1xuXG4vLyBBbiBldmVudCBoYW5kbGVyIGNhbiB0YWtlIGFuIG9wdGlvbmFsIGV2ZW50IGFyZ3VtZW50XG4vLyBhbmQgc2hvdWxkIG5vdCByZXR1cm4gYSB2YWx1ZVxuZXhwb3J0IHR5cGUgSGFuZGxlcjxUID0gdW5rbm93bj4gPSAoZXZlbnQ6IFQpID0+IHZvaWQ7XG5leHBvcnQgdHlwZSBXaWxkY2FyZEhhbmRsZXI8VCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+PiA9IChcblx0dHlwZToga2V5b2YgVCxcblx0ZXZlbnQ6IFRba2V5b2YgVF1cbikgPT4gdm9pZDtcblxuLy8gQW4gYXJyYXkgb2YgYWxsIGN1cnJlbnRseSByZWdpc3RlcmVkIGV2ZW50IGhhbmRsZXJzIGZvciBhIHR5cGVcbmV4cG9ydCB0eXBlIEV2ZW50SGFuZGxlckxpc3Q8VCA9IHVua25vd24+ID0gQXJyYXk8SGFuZGxlcjxUPj47XG5leHBvcnQgdHlwZSBXaWxkQ2FyZEV2ZW50SGFuZGxlckxpc3Q8VCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+PiA9IEFycmF5PFxuXHRXaWxkY2FyZEhhbmRsZXI8VD5cbj47XG5cbi8vIEEgbWFwIG9mIGV2ZW50IHR5cGVzIGFuZCB0aGVpciBjb3JyZXNwb25kaW5nIGV2ZW50IGhhbmRsZXJzLlxuZXhwb3J0IHR5cGUgRXZlbnRIYW5kbGVyTWFwPEV2ZW50cyBleHRlbmRzIFJlY29yZDxFdmVudFR5cGUsIHVua25vd24+PiA9IE1hcDxcblx0a2V5b2YgRXZlbnRzIHwgJyonLFxuXHRFdmVudEhhbmRsZXJMaXN0PEV2ZW50c1trZXlvZiBFdmVudHNdPiB8IFdpbGRDYXJkRXZlbnRIYW5kbGVyTGlzdDxFdmVudHM+XG4+O1xuXG5leHBvcnQgaW50ZXJmYWNlIEVtaXR0ZXI8RXZlbnRzIGV4dGVuZHMgUmVjb3JkPEV2ZW50VHlwZSwgdW5rbm93bj4+IHtcblx0YWxsOiBFdmVudEhhbmRsZXJNYXA8RXZlbnRzPjtcblxuXHRvbjxLZXkgZXh0ZW5kcyBrZXlvZiBFdmVudHM+KHR5cGU6IEtleSwgaGFuZGxlcjogSGFuZGxlcjxFdmVudHNbS2V5XT4pOiB2b2lkO1xuXHRvbih0eXBlOiAnKicsIGhhbmRsZXI6IFdpbGRjYXJkSGFuZGxlcjxFdmVudHM+KTogdm9pZDtcblxuXHRvZmY8S2V5IGV4dGVuZHMga2V5b2YgRXZlbnRzPihcblx0XHR0eXBlOiBLZXksXG5cdFx0aGFuZGxlcj86IEhhbmRsZXI8RXZlbnRzW0tleV0+XG5cdCk6IHZvaWQ7XG5cdG9mZih0eXBlOiAnKicsIGhhbmRsZXI6IFdpbGRjYXJkSGFuZGxlcjxFdmVudHM+KTogdm9pZDtcblxuXHRlbWl0PEtleSBleHRlbmRzIGtleW9mIEV2ZW50cz4odHlwZTogS2V5LCBldmVudDogRXZlbnRzW0tleV0pOiB2b2lkO1xuXHRlbWl0PEtleSBleHRlbmRzIGtleW9mIEV2ZW50cz4oXG5cdFx0dHlwZTogdW5kZWZpbmVkIGV4dGVuZHMgRXZlbnRzW0tleV0gPyBLZXkgOiBuZXZlclxuXHQpOiB2b2lkO1xufVxuXG4vKipcbiAqIE1pdHQ6IFRpbnkgKH4yMDBiKSBmdW5jdGlvbmFsIGV2ZW50IGVtaXR0ZXIgLyBwdWJzdWIuXG4gKiBAbmFtZSBtaXR0XG4gKiBAcmV0dXJucyB7TWl0dH1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbWl0dDxFdmVudHMgZXh0ZW5kcyBSZWNvcmQ8RXZlbnRUeXBlLCB1bmtub3duPj4oXG5cdGFsbD86IEV2ZW50SGFuZGxlck1hcDxFdmVudHM+XG4pOiBFbWl0dGVyPEV2ZW50cz4ge1xuXHR0eXBlIEdlbmVyaWNFdmVudEhhbmRsZXIgPVxuXHRcdHwgSGFuZGxlcjxFdmVudHNba2V5b2YgRXZlbnRzXT5cblx0XHR8IFdpbGRjYXJkSGFuZGxlcjxFdmVudHM+O1xuXHRhbGwgPSBhbGwgfHwgbmV3IE1hcCgpO1xuXG5cdHJldHVybiB7XG5cdFx0LyoqXG5cdFx0ICogQSBNYXAgb2YgZXZlbnQgbmFtZXMgdG8gcmVnaXN0ZXJlZCBoYW5kbGVyIGZ1bmN0aW9ucy5cblx0XHQgKi9cblx0XHRhbGwsXG5cblx0XHQvKipcblx0XHQgKiBSZWdpc3RlciBhbiBldmVudCBoYW5kbGVyIGZvciB0aGUgZ2l2ZW4gdHlwZS5cblx0XHQgKiBAcGFyYW0ge3N0cmluZ3xzeW1ib2x9IHR5cGUgVHlwZSBvZiBldmVudCB0byBsaXN0ZW4gZm9yLCBvciBgJyonYCBmb3IgYWxsIGV2ZW50c1xuXHRcdCAqIEBwYXJhbSB7RnVuY3Rpb259IGhhbmRsZXIgRnVuY3Rpb24gdG8gY2FsbCBpbiByZXNwb25zZSB0byBnaXZlbiBldmVudFxuXHRcdCAqIEBtZW1iZXJPZiBtaXR0XG5cdFx0ICovXG5cdFx0b248S2V5IGV4dGVuZHMga2V5b2YgRXZlbnRzPih0eXBlOiBLZXksIGhhbmRsZXI6IEdlbmVyaWNFdmVudEhhbmRsZXIpIHtcblx0XHRcdGNvbnN0IGhhbmRsZXJzOiBBcnJheTxHZW5lcmljRXZlbnRIYW5kbGVyPiB8IHVuZGVmaW5lZCA9IGFsbCEuZ2V0KHR5cGUpO1xuXHRcdFx0aWYgKGhhbmRsZXJzKSB7XG5cdFx0XHRcdGhhbmRsZXJzLnB1c2goaGFuZGxlcik7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRhbGwhLnNldCh0eXBlLCBbaGFuZGxlcl0gYXMgRXZlbnRIYW5kbGVyTGlzdDxFdmVudHNba2V5b2YgRXZlbnRzXT4pO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQvKipcblx0XHQgKiBSZW1vdmUgYW4gZXZlbnQgaGFuZGxlciBmb3IgdGhlIGdpdmVuIHR5cGUuXG5cdFx0ICogSWYgYGhhbmRsZXJgIGlzIG9taXR0ZWQsIGFsbCBoYW5kbGVycyBvZiB0aGUgZ2l2ZW4gdHlwZSBhcmUgcmVtb3ZlZC5cblx0XHQgKiBAcGFyYW0ge3N0cmluZ3xzeW1ib2x9IHR5cGUgVHlwZSBvZiBldmVudCB0byB1bnJlZ2lzdGVyIGBoYW5kbGVyYCBmcm9tIChgJyonYCB0byByZW1vdmUgYSB3aWxkY2FyZCBoYW5kbGVyKVxuXHRcdCAqIEBwYXJhbSB7RnVuY3Rpb259IFtoYW5kbGVyXSBIYW5kbGVyIGZ1bmN0aW9uIHRvIHJlbW92ZVxuXHRcdCAqIEBtZW1iZXJPZiBtaXR0XG5cdFx0ICovXG5cdFx0b2ZmPEtleSBleHRlbmRzIGtleW9mIEV2ZW50cz4odHlwZTogS2V5LCBoYW5kbGVyPzogR2VuZXJpY0V2ZW50SGFuZGxlcikge1xuXHRcdFx0Y29uc3QgaGFuZGxlcnM6IEFycmF5PEdlbmVyaWNFdmVudEhhbmRsZXI+IHwgdW5kZWZpbmVkID0gYWxsIS5nZXQodHlwZSk7XG5cdFx0XHRpZiAoaGFuZGxlcnMpIHtcblx0XHRcdFx0aWYgKGhhbmRsZXIpIHtcblx0XHRcdFx0XHRoYW5kbGVycy5zcGxpY2UoaGFuZGxlcnMuaW5kZXhPZihoYW5kbGVyKSA+Pj4gMCwgMSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0YWxsIS5zZXQodHlwZSwgW10pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIEludm9rZSBhbGwgaGFuZGxlcnMgZm9yIHRoZSBnaXZlbiB0eXBlLlxuXHRcdCAqIElmIHByZXNlbnQsIGAnKidgIGhhbmRsZXJzIGFyZSBpbnZva2VkIGFmdGVyIHR5cGUtbWF0Y2hlZCBoYW5kbGVycy5cblx0XHQgKlxuXHRcdCAqIE5vdGU6IE1hbnVhbGx5IGZpcmluZyAnKicgaGFuZGxlcnMgaXMgbm90IHN1cHBvcnRlZC5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfHN5bWJvbH0gdHlwZSBUaGUgZXZlbnQgdHlwZSB0byBpbnZva2Vcblx0XHQgKiBAcGFyYW0ge0FueX0gW2V2dF0gQW55IHZhbHVlIChvYmplY3QgaXMgcmVjb21tZW5kZWQgYW5kIHBvd2VyZnVsKSwgcGFzc2VkIHRvIGVhY2ggaGFuZGxlclxuXHRcdCAqIEBtZW1iZXJPZiBtaXR0XG5cdFx0ICovXG5cdFx0ZW1pdDxLZXkgZXh0ZW5kcyBrZXlvZiBFdmVudHM+KHR5cGU6IEtleSwgZXZ0PzogRXZlbnRzW0tleV0pIHtcblx0XHRcdGxldCBoYW5kbGVycyA9IGFsbCEuZ2V0KHR5cGUpO1xuXHRcdFx0aWYgKGhhbmRsZXJzKSB7XG5cdFx0XHRcdChoYW5kbGVycyBhcyBFdmVudEhhbmRsZXJMaXN0PEV2ZW50c1trZXlvZiBFdmVudHNdPilcblx0XHRcdFx0XHQuc2xpY2UoKVxuXHRcdFx0XHRcdC5tYXAoKGhhbmRsZXIpID0+IHtcblx0XHRcdFx0XHRcdGhhbmRsZXIoZXZ0ISk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cblx0XHRcdGhhbmRsZXJzID0gYWxsIS5nZXQoJyonKTtcblx0XHRcdGlmIChoYW5kbGVycykge1xuXHRcdFx0XHQoaGFuZGxlcnMgYXMgV2lsZENhcmRFdmVudEhhbmRsZXJMaXN0PEV2ZW50cz4pXG5cdFx0XHRcdFx0LnNsaWNlKClcblx0XHRcdFx0XHQubWFwKChoYW5kbGVyKSA9PiB7XG5cdFx0XHRcdFx0XHRoYW5kbGVyKHR5cGUsIGV2dCEpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcbn1cbiIsICJpbXBvcnQgbWl0dCwgeyBFbWl0dGVyIH0gZnJvbSAnbWl0dCdcbmltcG9ydCB7IEVudGl0eSB9IGZyb20gJ0BkY2wvc2RrL2VjcydcbmltcG9ydCB7IEFjdGlvblBheWxvYWQsIEFjdGlvblR5cGUsIFRyaWdnZXJUeXBlIH0gZnJvbSAnLi9kZWZpbml0aW9ucydcblxuY29uc3QgdHJpZ2dlcnMgPSBuZXcgTWFwPEVudGl0eSwgRW1pdHRlcjxSZWNvcmQ8VHJpZ2dlclR5cGUsIHZvaWQ+Pj4oKVxuXG5jb25zdCBhY3Rpb25zID0gbmV3IE1hcDxcbiAgRW50aXR5LFxuICBFbWl0dGVyPFJlY29yZDxzdHJpbmcsIEFjdGlvblBheWxvYWQ8QWN0aW9uVHlwZT4+PlxuPigpXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUcmlnZ2VyRXZlbnRzKGVudGl0eTogRW50aXR5KSB7XG4gIGlmICghdHJpZ2dlcnMuaGFzKGVudGl0eSkpIHtcbiAgICB0cmlnZ2Vycy5zZXQoZW50aXR5LCBtaXR0KCkpXG4gIH1cbiAgcmV0dXJuIHRyaWdnZXJzLmdldChlbnRpdHkpIVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWN0aW9uRXZlbnRzKGVudGl0eTogRW50aXR5KSB7XG4gIGlmICghYWN0aW9ucy5oYXMoZW50aXR5KSkge1xuICAgIGFjdGlvbnMuc2V0KGVudGl0eSwgbWl0dCgpKVxuICB9XG4gIHJldHVybiBhY3Rpb25zLmdldChlbnRpdHkpIVxufVxuIiwgImltcG9ydCB7XG4gIENvbXBvbmVudERlZmluaXRpb24sXG4gIElFbmdpbmUsXG4gIExhc3RXcml0ZVdpbkVsZW1lbnRTZXRDb21wb25lbnREZWZpbml0aW9uLFxufSBmcm9tICdAZGNsL3Nkay9lY3MnXG5pbXBvcnQgeyBDb21wb25lbnROYW1lLCBDb3VudGVyIH0gZnJvbSAnLi9kZWZpbml0aW9ucydcblxuZXhwb3J0IGNvbnN0IENPTVBPTkVOVFNfV0lUSF9JRDogc3RyaW5nW10gPSBbXG4gIENvbXBvbmVudE5hbWUuQUNUSU9OUyxcbiAgQ29tcG9uZW50TmFtZS5TVEFURVMsXG4gIENvbXBvbmVudE5hbWUuQ09VTlRFUixcbl1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvdW50ZXJDb21wb25lbnQoZW5naW5lOiBJRW5naW5lKSB7XG4gIHJldHVybiBlbmdpbmUuZ2V0Q29tcG9uZW50KFxuICAgIENvbXBvbmVudE5hbWUuQ09VTlRFUixcbiAgKSBhcyBMYXN0V3JpdGVXaW5FbGVtZW50U2V0Q29tcG9uZW50RGVmaW5pdGlvbjxDb3VudGVyPlxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TmV4dElkKGVuZ2luZTogSUVuZ2luZSkge1xuICBjb25zdCBDb3VudGVyID0gZ2V0Q291bnRlckNvbXBvbmVudChlbmdpbmUpXG4gIGNvbnN0IGNvdW50ZXIgPSBDb3VudGVyLmdldE9yQ3JlYXRlTXV0YWJsZShlbmdpbmUuUm9vdEVudGl0eSlcbiAgcmV0dXJuICsrY291bnRlci52YWx1ZVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVxdWlyZXNJZDxUIGV4dGVuZHMgeyBpZDogc3RyaW5nIH0+KFxuICBjb21wb25lbnQ6IENvbXBvbmVudERlZmluaXRpb248dW5rbm93bj4sXG4pOiBjb21wb25lbnQgaXMgQ29tcG9uZW50RGVmaW5pdGlvbjxUPiB7XG4gIHJldHVybiBDT01QT05FTlRTX1dJVEhfSUQuaW5jbHVkZXMoY29tcG9uZW50LmNvbXBvbmVudE5hbWUpXG59XG4iLCAiaW1wb3J0IHsgU3RhdGVzIH0gZnJvbSAnLi9kZWZpbml0aW9ucydcblxuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRTdGF0ZShzdGF0ZXM6IFN0YXRlcywgdmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICByZXR1cm4gISF2YWx1ZSAmJiBzdGF0ZXMudmFsdWUuaW5jbHVkZXModmFsdWUpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDdXJyZW50VmFsdWUoc3RhdGVzOiBTdGF0ZXMpIHtcbiAgaWYgKGlzVmFsaWRTdGF0ZShzdGF0ZXMsIHN0YXRlcy5jdXJyZW50VmFsdWUpKSB7XG4gICAgcmV0dXJuIHN0YXRlcy5jdXJyZW50VmFsdWUhXG4gIH1cbiAgcmV0dXJuIGdldERlZmF1bHRWYWx1ZShzdGF0ZXMpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWZhdWx0VmFsdWUoc3RhdGVzOiBTdGF0ZXMpIHtcbiAgaWYgKGlzVmFsaWRTdGF0ZShzdGF0ZXMsIHN0YXRlcy5kZWZhdWx0VmFsdWUpKSB7XG4gICAgcmV0dXJuIHN0YXRlcy5kZWZhdWx0VmFsdWUhXG4gIH1cbiAgaWYgKHN0YXRlcy52YWx1ZS5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIHN0YXRlcy52YWx1ZVswXVxuICB9XG59XG4iLCAiaW1wb3J0IHtcbiAgQ29tcG9uZW50RGVmaW5pdGlvbixcbiAgTGFzdFdyaXRlV2luRWxlbWVudFNldENvbXBvbmVudERlZmluaXRpb24sXG59IGZyb20gJ0BkY2wvc2RrL2VjcydcblxuZXhwb3J0IGZ1bmN0aW9uIGlzTGFzdFdyaXRlV2luQ29tcG9uZW50PFQgPSB1bmtub3duPihcbiAgY29tcG9uZW50OiBDb21wb25lbnREZWZpbml0aW9uPFQ+LFxuKTogY29tcG9uZW50IGlzIExhc3RXcml0ZVdpbkVsZW1lbnRTZXRDb21wb25lbnREZWZpbml0aW9uPFQ+IHtcbiAgcmV0dXJuICEhKGNvbXBvbmVudCBhcyBMYXN0V3JpdGVXaW5FbGVtZW50U2V0Q29tcG9uZW50RGVmaW5pdGlvbjxUPilcbiAgICAuY3JlYXRlT3JSZXBsYWNlXG59XG4iLCAiaW1wb3J0IHsgRW50aXR5LCBJRW5naW5lIH0gZnJvbSAnQGRjbC9zZGsvZWNzJ1xuaW1wb3J0IHsgZ2V0TmV4dElkLCByZXF1aXJlc0lkIH0gZnJvbSAnLi9pZCdcbmltcG9ydCB7IGlzTGFzdFdyaXRlV2luQ29tcG9uZW50IH0gZnJvbSAnLi9sd3cnXG5pbXBvcnQgeyBUcmlnZ2Vyc0NvbXBvbmVudCB9IGZyb20gJy4vZGVmaW5pdGlvbnMnXG5cbmV4cG9ydCBmdW5jdGlvbiBjbG9uZShcbiAgZW50aXR5OiBFbnRpdHksXG4gIGVuZ2luZTogSUVuZ2luZSxcbiAgVHJpZ2dlcnM6IFRyaWdnZXJzQ29tcG9uZW50LFxuKSB7XG4gIGNvbnN0IGNsb25lZCA9IGVuZ2luZS5hZGRFbnRpdHkoKVxuXG4gIC8vIG1hcCBpZHNcbiAgY29uc3QgbmV3SWRzID0gbmV3IE1hcDxudW1iZXIsIG51bWJlcj4oKVxuICBkZWJ1Z2dlclxuICBmb3IgKGNvbnN0IGNvbXBvbmVudCBvZiBlbmdpbmUuY29tcG9uZW50c0l0ZXIoKSkge1xuICAgIGlmIChjb21wb25lbnQuaGFzKGVudGl0eSkpIHtcbiAgICAgIGxldCBuZXdWYWx1ZSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoY29tcG9uZW50LmdldChlbnRpdHkpKSlcbiAgICAgIGlmIChyZXF1aXJlc0lkKGNvbXBvbmVudCkpIHtcbiAgICAgICAgY29tcG9uZW50XG4gICAgICAgIGNvbnN0IG9sZElkID0gbmV3VmFsdWUuaWRcbiAgICAgICAgY29uc3QgbmV3SWQgPSBnZXROZXh0SWQoZW5naW5lKVxuICAgICAgICBuZXdJZHMuc2V0KG9sZElkLCBuZXdJZClcbiAgICAgICAgbmV3VmFsdWUgPSB7XG4gICAgICAgICAgLi4ubmV3VmFsdWUsXG4gICAgICAgICAgaWQ6IG5ld0lkLFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaXNMYXN0V3JpdGVXaW5Db21wb25lbnQoY29tcG9uZW50KSkge1xuICAgICAgICBjb21wb25lbnQuY3JlYXRlT3JSZXBsYWNlKGNsb25lZCwgbmV3VmFsdWUpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gaWYgdGhlIGVudGl0eSBoYXMgdHJpZ2dlcnMsIHJlbWFwIHRoZSBvbGQgaWRzIGluIHRoZSBhY3Rpb25zIGFuZCBjb25kaXRpb25zIHRvIHRoZSBuZXcgb25lc1xuICBpZiAoVHJpZ2dlcnMuaGFzKGNsb25lZCkpIHtcbiAgICBjb25zdCB0cmlnZ2VycyA9IFRyaWdnZXJzLmdldE11dGFibGUoY2xvbmVkKVxuICAgIGZvciAoY29uc3QgdHJpZ2dlciBvZiB0cmlnZ2Vycy52YWx1ZSkge1xuICAgICAgZm9yIChjb25zdCBhY3Rpb24gb2YgdHJpZ2dlci5hY3Rpb25zKSB7XG4gICAgICAgIGlmIChhY3Rpb24uaWQpIHtcbiAgICAgICAgICBjb25zdCBuZXdJZCA9IG5ld0lkcy5nZXQoYWN0aW9uLmlkKVxuICAgICAgICAgIGlmIChuZXdJZCkge1xuICAgICAgICAgICAgYWN0aW9uLmlkID0gbmV3SWRcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0cmlnZ2VyLmNvbmRpdGlvbnMpIHtcbiAgICAgICAgZm9yIChjb25zdCBjb25kaXRpb24gb2YgdHJpZ2dlci5jb25kaXRpb25zKSB7XG4gICAgICAgICAgaWYgKGNvbmRpdGlvbi5pZCkge1xuICAgICAgICAgICAgY29uc3QgbmV3SWQgPSBuZXdJZHMuZ2V0KGNvbmRpdGlvbi5pZClcbiAgICAgICAgICAgIGlmIChuZXdJZCkge1xuICAgICAgICAgICAgICBjb25kaXRpb24uaWQgPSBuZXdJZFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjbG9uZWRcbn1cbiIsICJpbXBvcnQge1xuICBFbnRpdHksXG4gIElFbmdpbmUsXG4gIElTY2hlbWEsXG4gIE1hdGVyaWFsQ29tcG9uZW50RGVmaW5pdGlvbkV4dGVuZGVkLFxuICBQQk1hdGVyaWFsLFxuICBQQlZpZGVvUGxheWVyLFxuICBTY2hlbWFzLFxuICBWaWRlb1RleHR1cmUsXG4gIEFuaW1hdG9yQ29tcG9uZW50RGVmaW5pdGlvbkV4dGVuZGVkLFxuICBUcmFuc2Zvcm1Db21wb25lbnRFeHRlbmRlZCxcbiAgTGFzdFdyaXRlV2luRWxlbWVudFNldENvbXBvbmVudERlZmluaXRpb24sXG4gIFBCQXVkaW9Tb3VyY2UsXG4gIFBCQXZhdGFyQXR0YWNoLFxuICBQQlZpc2liaWxpdHlDb21wb25lbnQsXG4gIFBCR2x0ZkNvbnRhaW5lcixcbn0gZnJvbSAnQGRjbC9zZGsvZWNzJ1xuaW1wb3J0IHsgYWRkQWN0aW9uVHlwZSB9IGZyb20gJy4vYWN0aW9uLXR5cGVzJ1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50TmFtZSxcbiAgVHdlZW5UeXBlLFxuICBJbnRlcnBvbGF0aW9uVHlwZSxcbiAgQWN0aW9uVHlwZSxcbiAgVHJpZ2dlclR5cGUsXG4gIFRyaWdnZXJDb25kaXRpb25UeXBlLFxuICBUcmlnZ2VyQ29uZGl0aW9uT3BlcmF0aW9uLFxuICBBbGlnbk1vZGUsXG4gIEZvbnQsXG4gIENvbGxpZGVycyxcbn0gZnJvbSAnLi9lbnVtcydcblxuZXhwb3J0ICogZnJvbSAnLi9lbnVtcydcbmV4cG9ydCAqIGZyb20gJy4vYWN0aW9uLXR5cGVzJ1xuZXhwb3J0ICogZnJvbSAnLi9ldmVudHMnXG5leHBvcnQgKiBmcm9tICcuL2lkJ1xuZXhwb3J0ICogZnJvbSAnLi9zdGF0ZXMnXG5leHBvcnQgKiBmcm9tICcuL2Nsb25lJ1xuZXhwb3J0ICogZnJvbSAnLi9sd3cnXG5cbmV4cG9ydCBjb25zdCBBY3Rpb25TY2hlbWFzID0ge1xuICBbQWN0aW9uVHlwZS5QTEFZX0FOSU1BVElPTl06IFNjaGVtYXMuTWFwKHtcbiAgICBhbmltYXRpb246IFNjaGVtYXMuU3RyaW5nLFxuICAgIGxvb3A6IFNjaGVtYXMuT3B0aW9uYWwoU2NoZW1hcy5Cb29sZWFuKSxcbiAgfSksXG4gIFtBY3Rpb25UeXBlLlNUT1BfQU5JTUFUSU9OXTogU2NoZW1hcy5NYXAoe30pLFxuICBbQWN0aW9uVHlwZS5TRVRfU1RBVEVdOiBTY2hlbWFzLk1hcCh7IHN0YXRlOiBTY2hlbWFzLlN0cmluZyB9KSxcbiAgW0FjdGlvblR5cGUuU1RBUlRfVFdFRU5dOiBTY2hlbWFzLk1hcCh7XG4gICAgdHlwZTogU2NoZW1hcy5FbnVtU3RyaW5nPFR3ZWVuVHlwZT4oVHdlZW5UeXBlLCBUd2VlblR5cGUuTU9WRV9JVEVNKSxcbiAgICBlbmQ6IFNjaGVtYXMuVmVjdG9yMyxcbiAgICBpbnRlcnBvbGF0aW9uVHlwZTogU2NoZW1hcy5FbnVtU3RyaW5nKFxuICAgICAgSW50ZXJwb2xhdGlvblR5cGUsXG4gICAgICBJbnRlcnBvbGF0aW9uVHlwZS5MSU5FQVIsXG4gICAgKSxcbiAgICBkdXJhdGlvbjogU2NoZW1hcy5GbG9hdCxcbiAgICByZWxhdGl2ZTogU2NoZW1hcy5Cb29sZWFuLFxuICB9KSxcbiAgW0FjdGlvblR5cGUuU0VUX0NPVU5URVJdOiBTY2hlbWFzLk1hcCh7IGNvdW50ZXI6IFNjaGVtYXMuSW50IH0pLFxuICBbQWN0aW9uVHlwZS5JTkNSRU1FTlRfQ09VTlRFUl06IFNjaGVtYXMuTWFwKHt9KSxcbiAgW0FjdGlvblR5cGUuREVDUkVBU0VfQ09VTlRFUl06IFNjaGVtYXMuTWFwKHt9KSxcbiAgW0FjdGlvblR5cGUuUExBWV9TT1VORF06IFNjaGVtYXMuTWFwKHtcbiAgICBzcmM6IFNjaGVtYXMuU3RyaW5nLFxuICAgIGxvb3A6IFNjaGVtYXMuT3B0aW9uYWwoU2NoZW1hcy5Cb29sZWFuKSxcbiAgICB2b2x1bWU6IFNjaGVtYXMuT3B0aW9uYWwoU2NoZW1hcy5GbG9hdCksXG4gIH0pLFxuICBbQWN0aW9uVHlwZS5TVE9QX1NPVU5EXTogU2NoZW1hcy5NYXAoe30pLFxuICBbQWN0aW9uVHlwZS5TRVRfVklTSUJJTElUWV06IFNjaGVtYXMuTWFwKHtcbiAgICB2aXNpYmxlOiBTY2hlbWFzLkJvb2xlYW4sXG4gICAgLyoqIEBkZXByZWNhdGVkIHVzZSBjb2xsaWRlciBpbnN0ZWFkICovXG4gICAgcGh5c2ljc0NvbGxpZGVyOiBTY2hlbWFzLk9wdGlvbmFsKFNjaGVtYXMuQm9vbGVhbiksXG4gICAgY29sbGlkZXI6IFNjaGVtYXMuT3B0aW9uYWwoXG4gICAgICBTY2hlbWFzLkVudW1OdW1iZXIoQ29sbGlkZXJzLCBDb2xsaWRlcnMuQ0xfUE9JTlRFUiksXG4gICAgKSxcbiAgfSksXG4gIFtBY3Rpb25UeXBlLkFUVEFDSF9UT19QTEFZRVJdOiBTY2hlbWFzLk1hcCh7XG4gICAgYW5jaG9yUG9pbnRJZDogU2NoZW1hcy5JbnQsXG4gIH0pLFxuICBbQWN0aW9uVHlwZS5ERVRBQ0hfRlJPTV9QTEFZRVJdOiBTY2hlbWFzLk1hcCh7fSksXG4gIFtBY3Rpb25UeXBlLlBMQVlfVklERU9fU1RSRUFNXTogU2NoZW1hcy5NYXAoe1xuICAgIHNyYzogU2NoZW1hcy5PcHRpb25hbChTY2hlbWFzLlN0cmluZyksXG4gICAgbG9vcDogU2NoZW1hcy5PcHRpb25hbChTY2hlbWFzLkJvb2xlYW4pLFxuICAgIHZvbHVtZTogU2NoZW1hcy5PcHRpb25hbChTY2hlbWFzLkZsb2F0KSxcbiAgICBkY2xDYXN0OiBTY2hlbWFzLk9wdGlvbmFsKFNjaGVtYXMuQm9vbGVhbiksXG4gIH0pLFxuICBbQWN0aW9uVHlwZS5TVE9QX1ZJREVPX1NUUkVBTV06IFNjaGVtYXMuTWFwKHt9KSxcbiAgW0FjdGlvblR5cGUuUExBWV9BVURJT19TVFJFQU1dOiBTY2hlbWFzLk1hcCh7XG4gICAgdXJsOiBTY2hlbWFzLlN0cmluZyxcbiAgICB2b2x1bWU6IFNjaGVtYXMuT3B0aW9uYWwoU2NoZW1hcy5GbG9hdCksXG4gIH0pLFxuICBbQWN0aW9uVHlwZS5TVE9QX0FVRElPX1NUUkVBTV06IFNjaGVtYXMuTWFwKHt9KSxcbiAgW0FjdGlvblR5cGUuVEVMRVBPUlRfUExBWUVSXTogU2NoZW1hcy5NYXAoe1xuICAgIHg6IFNjaGVtYXMuSW50LFxuICAgIHk6IFNjaGVtYXMuSW50LFxuICB9KSxcbiAgW0FjdGlvblR5cGUuTU9WRV9QTEFZRVJdOiBTY2hlbWFzLk1hcCh7XG4gICAgcG9zaXRpb246IFNjaGVtYXMuVmVjdG9yMyxcbiAgICBjYW1lcmFUYXJnZXQ6IFNjaGVtYXMuT3B0aW9uYWwoU2NoZW1hcy5WZWN0b3IzKSxcbiAgfSksXG4gIFtBY3Rpb25UeXBlLlBMQVlfREVGQVVMVF9FTU9URV06IFNjaGVtYXMuTWFwKHtcbiAgICBlbW90ZTogU2NoZW1hcy5TdHJpbmcsXG4gIH0pLFxuICBbQWN0aW9uVHlwZS5QTEFZX0NVU1RPTV9FTU9URV06IFNjaGVtYXMuTWFwKHtcbiAgICBzcmM6IFNjaGVtYXMuU3RyaW5nLFxuICAgIGxvb3A6IFNjaGVtYXMuT3B0aW9uYWwoU2NoZW1hcy5Cb29sZWFuKSxcbiAgfSksXG4gIFtBY3Rpb25UeXBlLk9QRU5fTElOS106IFNjaGVtYXMuTWFwKHtcbiAgICB1cmw6IFNjaGVtYXMuU3RyaW5nLFxuICB9KSxcbiAgW0FjdGlvblR5cGUuU0hPV19URVhUXTogU2NoZW1hcy5NYXAoe1xuICAgIHRleHQ6IFNjaGVtYXMuU3RyaW5nLFxuICAgIGhpZGVBZnRlclNlY29uZHM6IFNjaGVtYXMuRmxvYXQsXG4gICAgZm9udDogU2NoZW1hcy5FbnVtTnVtYmVyKEZvbnQsIEZvbnQuRl9TQU5TX1NFUklGKSxcbiAgICBmb250U2l6ZTogU2NoZW1hcy5PcHRpb25hbChTY2hlbWFzLkZsb2F0KSxcbiAgICB0ZXh0QWxpZ246IFNjaGVtYXMuRW51bU51bWJlcihBbGlnbk1vZGUsIEFsaWduTW9kZS5UQU1fTUlERExFX0NFTlRFUiksXG4gIH0pLFxuICBbQWN0aW9uVHlwZS5ISURFX1RFWFRdOiBTY2hlbWFzLk1hcCh7fSksXG4gIFtBY3Rpb25UeXBlLlNUQVJUX0RFTEFZXTogU2NoZW1hcy5NYXAoe1xuICAgIGFjdGlvbnM6IFNjaGVtYXMuQXJyYXkoU2NoZW1hcy5TdHJpbmcpLFxuICAgIHRpbWVvdXQ6IFNjaGVtYXMuRmxvYXQsXG4gIH0pLFxuICBbQWN0aW9uVHlwZS5TVE9QX0RFTEFZXTogU2NoZW1hcy5NYXAoe1xuICAgIGFjdGlvbjogU2NoZW1hcy5TdHJpbmcsXG4gIH0pLFxuICBbQWN0aW9uVHlwZS5TVEFSVF9MT09QXTogU2NoZW1hcy5NYXAoe1xuICAgIGFjdGlvbnM6IFNjaGVtYXMuQXJyYXkoU2NoZW1hcy5TdHJpbmcpLFxuICAgIGludGVydmFsOiBTY2hlbWFzLkZsb2F0LFxuICB9KSxcbiAgW0FjdGlvblR5cGUuU1RPUF9MT09QXTogU2NoZW1hcy5NYXAoe1xuICAgIGFjdGlvbjogU2NoZW1hcy5TdHJpbmcsXG4gIH0pLFxuICBbQWN0aW9uVHlwZS5DTE9ORV9FTlRJVFldOiBTY2hlbWFzLk1hcCh7XG4gICAgcG9zaXRpb246IFNjaGVtYXMuVmVjdG9yMyxcbiAgfSksXG4gIFtBY3Rpb25UeXBlLlJFTU9WRV9FTlRJVFldOiBTY2hlbWFzLk1hcCh7fSksXG4gIFtBY3Rpb25UeXBlLlNIT1dfSU1BR0VdOiBTY2hlbWFzLk1hcCh7XG4gICAgc3JjOiBTY2hlbWFzLlN0cmluZyxcbiAgICBhbGlnbjogU2NoZW1hcy5FbnVtTnVtYmVyKEFsaWduTW9kZSwgQWxpZ25Nb2RlLlRBTV9NSURETEVfQ0VOVEVSKSxcbiAgICBoZWlnaHQ6IFNjaGVtYXMuRmxvYXQsXG4gICAgd2lkdGg6IFNjaGVtYXMuRmxvYXQsXG4gICAgaGlkZUFmdGVyU2Vjb25kczogU2NoZW1hcy5PcHRpb25hbChTY2hlbWFzLkZsb2F0KSxcbiAgICB0ZXh0OiBTY2hlbWFzLk9wdGlvbmFsKFNjaGVtYXMuU3RyaW5nKSxcbiAgICBmb250U2l6ZTogU2NoZW1hcy5PcHRpb25hbChTY2hlbWFzLkZsb2F0KSxcbiAgfSksXG4gIFtBY3Rpb25UeXBlLkhJREVfSU1BR0VdOiBTY2hlbWFzLk1hcCh7XG4gICAgaW1hZ2VFbnRpdHk6IFNjaGVtYXMuT3B0aW9uYWwoU2NoZW1hcy5JbnQpLFxuICB9KSxcbn1cblxuZXhwb3J0IHR5cGUgQWN0aW9uUGF5bG9hZDxUIGV4dGVuZHMgQWN0aW9uVHlwZSA9IGFueT4gPVxuICBUIGV4dGVuZHMga2V5b2YgdHlwZW9mIEFjdGlvblNjaGVtYXNcbiAgICA/ICh0eXBlb2YgQWN0aW9uU2NoZW1hcylbVF0gZXh0ZW5kcyBJU2NoZW1hXG4gICAgICA/IFJldHVyblR5cGU8KHR5cGVvZiBBY3Rpb25TY2hlbWFzKVtUXVsnZGVzZXJpYWxpemUnXT5cbiAgICAgIDoge31cbiAgICA6IHt9XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb21wb25lbnQ8VD4oY29tcG9uZW50TmFtZTogc3RyaW5nLCBlbmdpbmU6IElFbmdpbmUpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZW5naW5lLmdldENvbXBvbmVudChcbiAgICAgIGNvbXBvbmVudE5hbWUsXG4gICAgKSBhcyBMYXN0V3JpdGVXaW5FbGVtZW50U2V0Q29tcG9uZW50RGVmaW5pdGlvbjxUPlxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICBgRXJyb3IgdXNpbmcgZ2V0Q29tcG9uZW50IHdpdGggY29tcG9uZW50TmFtZT1cIiR7Y29tcG9uZW50TmFtZX1cImAsXG4gICAgKVxuICAgIHRocm93IGVycm9yXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbXBvbmVudHMoZW5naW5lOiBJRW5naW5lKSB7XG4gIHJldHVybiB7XG4gICAgQWN0aW9uczogZ2V0Q29tcG9uZW50PEFjdGlvbnM+KENvbXBvbmVudE5hbWUuQUNUSU9OUywgZW5naW5lKSxcbiAgICBTdGF0ZXM6IGdldENvbXBvbmVudDxTdGF0ZXM+KENvbXBvbmVudE5hbWUuU1RBVEVTLCBlbmdpbmUpLFxuICAgIENvdW50ZXI6IGdldENvbXBvbmVudDxDb3VudGVyPihDb21wb25lbnROYW1lLkNPVU5URVIsIGVuZ2luZSksXG4gICAgVHJpZ2dlcnM6IGdldENvbXBvbmVudDxUcmlnZ2Vycz4oQ29tcG9uZW50TmFtZS5UUklHR0VSUywgZW5naW5lKSxcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ29tcG9uZW50cyhlbmdpbmU6IElFbmdpbmUpIHtcbiAgY29uc3QgQWN0aW9uVHlwZXMgPSBlbmdpbmUuZGVmaW5lQ29tcG9uZW50KENvbXBvbmVudE5hbWUuQUNUSU9OX1RZUEVTLCB7XG4gICAgdmFsdWU6IFNjaGVtYXMuQXJyYXkoXG4gICAgICBTY2hlbWFzLk1hcCh7XG4gICAgICAgIHR5cGU6IFNjaGVtYXMuU3RyaW5nLFxuICAgICAgICBqc29uU2NoZW1hOiBTY2hlbWFzLlN0cmluZyxcbiAgICAgIH0pLFxuICAgICksXG4gIH0pXG5cbiAgY29uc3QgQWN0aW9ucyA9IGVuZ2luZS5kZWZpbmVDb21wb25lbnQoQ29tcG9uZW50TmFtZS5BQ1RJT05TLCB7XG4gICAgaWQ6IFNjaGVtYXMuSW50LFxuICAgIHZhbHVlOiBTY2hlbWFzLkFycmF5KFxuICAgICAgU2NoZW1hcy5NYXAoe1xuICAgICAgICBuYW1lOiBTY2hlbWFzLlN0cmluZyxcbiAgICAgICAgdHlwZTogU2NoZW1hcy5TdHJpbmcsXG4gICAgICAgIGpzb25QYXlsb2FkOiBTY2hlbWFzLlN0cmluZyxcbiAgICAgIH0pLFxuICAgICksXG4gIH0pXG5cbiAgY29uc3QgQ291bnRlciA9IGVuZ2luZS5kZWZpbmVDb21wb25lbnQoQ29tcG9uZW50TmFtZS5DT1VOVEVSLCB7XG4gICAgaWQ6IFNjaGVtYXMuTnVtYmVyLFxuICAgIHZhbHVlOiBTY2hlbWFzLkludCxcbiAgfSlcblxuICBjb25zdCBUcmlnZ2VycyA9IGVuZ2luZS5kZWZpbmVDb21wb25lbnQoQ29tcG9uZW50TmFtZS5UUklHR0VSUywge1xuICAgIHZhbHVlOiBTY2hlbWFzLkFycmF5KFxuICAgICAgU2NoZW1hcy5NYXAoe1xuICAgICAgICB0eXBlOiBTY2hlbWFzLkVudW1TdHJpbmc8VHJpZ2dlclR5cGU+KFxuICAgICAgICAgIFRyaWdnZXJUeXBlLFxuICAgICAgICAgIFRyaWdnZXJUeXBlLk9OX0NMSUNLLFxuICAgICAgICApLFxuICAgICAgICBjb25kaXRpb25zOiBTY2hlbWFzLk9wdGlvbmFsKFxuICAgICAgICAgIFNjaGVtYXMuQXJyYXkoXG4gICAgICAgICAgICBTY2hlbWFzLk1hcCh7XG4gICAgICAgICAgICAgIGlkOiBTY2hlbWFzLk9wdGlvbmFsKFNjaGVtYXMuSW50KSxcbiAgICAgICAgICAgICAgdHlwZTogU2NoZW1hcy5FbnVtU3RyaW5nPFRyaWdnZXJDb25kaXRpb25UeXBlPihcbiAgICAgICAgICAgICAgICBUcmlnZ2VyQ29uZGl0aW9uVHlwZSxcbiAgICAgICAgICAgICAgICBUcmlnZ2VyQ29uZGl0aW9uVHlwZS5XSEVOX1NUQVRFX0lTLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICB2YWx1ZTogU2NoZW1hcy5TdHJpbmcsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApLFxuICAgICAgICApLFxuICAgICAgICBvcGVyYXRpb246IFNjaGVtYXMuT3B0aW9uYWwoXG4gICAgICAgICAgU2NoZW1hcy5FbnVtU3RyaW5nPFRyaWdnZXJDb25kaXRpb25PcGVyYXRpb24+KFxuICAgICAgICAgICAgVHJpZ2dlckNvbmRpdGlvbk9wZXJhdGlvbixcbiAgICAgICAgICAgIFRyaWdnZXJDb25kaXRpb25PcGVyYXRpb24uQU5ELFxuICAgICAgICAgICksXG4gICAgICAgICksXG4gICAgICAgIGFjdGlvbnM6IFNjaGVtYXMuQXJyYXkoXG4gICAgICAgICAgU2NoZW1hcy5NYXAoe1xuICAgICAgICAgICAgaWQ6IFNjaGVtYXMuT3B0aW9uYWwoU2NoZW1hcy5JbnQpLFxuICAgICAgICAgICAgbmFtZTogU2NoZW1hcy5PcHRpb25hbChTY2hlbWFzLlN0cmluZyksXG4gICAgICAgICAgfSksXG4gICAgICAgICksXG4gICAgICB9KSxcbiAgICApLFxuICB9KVxuXG4gIGNvbnN0IFN0YXRlcyA9IGVuZ2luZS5kZWZpbmVDb21wb25lbnQoQ29tcG9uZW50TmFtZS5TVEFURVMsIHtcbiAgICBpZDogU2NoZW1hcy5OdW1iZXIsXG4gICAgdmFsdWU6IFNjaGVtYXMuQXJyYXkoU2NoZW1hcy5TdHJpbmcpLFxuICAgIGRlZmF1bHRWYWx1ZTogU2NoZW1hcy5PcHRpb25hbChTY2hlbWFzLlN0cmluZyksXG4gICAgY3VycmVudFZhbHVlOiBTY2hlbWFzLk9wdGlvbmFsKFNjaGVtYXMuU3RyaW5nKSxcbiAgfSlcblxuICByZXR1cm4ge1xuICAgIEFjdGlvblR5cGVzLFxuICAgIEFjdGlvbnMsXG4gICAgQ291bnRlcixcbiAgICBUcmlnZ2VycyxcbiAgICBTdGF0ZXMsXG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgRW5naW5lQ29tcG9uZW50cyA9IHtcbiAgQW5pbWF0b3I6IEFuaW1hdG9yQ29tcG9uZW50RGVmaW5pdGlvbkV4dGVuZGVkXG4gIFRyYW5zZm9ybTogVHJhbnNmb3JtQ29tcG9uZW50RXh0ZW5kZWRcbiAgQXVkaW9Tb3VyY2U6IExhc3RXcml0ZVdpbkVsZW1lbnRTZXRDb21wb25lbnREZWZpbml0aW9uPFBCQXVkaW9Tb3VyY2U+XG4gIEF2YXRhckF0dGFjaDogTGFzdFdyaXRlV2luRWxlbWVudFNldENvbXBvbmVudERlZmluaXRpb248UEJBdmF0YXJBdHRhY2g+XG4gIFZpc2liaWxpdHlDb21wb25lbnQ6IExhc3RXcml0ZVdpbkVsZW1lbnRTZXRDb21wb25lbnREZWZpbml0aW9uPFBCVmlzaWJpbGl0eUNvbXBvbmVudD5cbiAgR2x0ZkNvbnRhaW5lcjogTGFzdFdyaXRlV2luRWxlbWVudFNldENvbXBvbmVudERlZmluaXRpb248UEJHbHRmQ29udGFpbmVyPlxuICBNYXRlcmlhbDogTWF0ZXJpYWxDb21wb25lbnREZWZpbml0aW9uRXh0ZW5kZWRcbiAgVmlkZW9QbGF5ZXI6IExhc3RXcml0ZVdpbkVsZW1lbnRTZXRDb21wb25lbnREZWZpbml0aW9uPFBCVmlkZW9QbGF5ZXI+XG59XG5cbmV4cG9ydCB0eXBlIEFzc2V0UGFja0NvbXBvbmVudHMgPSBSZXR1cm5UeXBlPHR5cGVvZiBnZXRDb21wb25lbnRzPlxuXG5leHBvcnQgZnVuY3Rpb24gaW5pdENvbXBvbmVudHMoXG4gIGVuZ2luZTogSUVuZ2luZSxcbiAgY29tcG9uZW50cz86IFBhcnRpYWw8UmVjb3JkPGtleW9mIEVuZ2luZUNvbXBvbmVudHMsIGFueT4+LFxuKSB7XG4gIC8vIEFkZCBhY3Rpb25zIGZyb20gdGhpcyBwYWNrYWdlXG4gIGNvbnN0IGFjdGlvblR5cGVzID0gT2JqZWN0LnZhbHVlcyhBY3Rpb25UeXBlKVxuICBmb3IgKGNvbnN0IHR5cGUgb2YgYWN0aW9uVHlwZXMpIHtcbiAgICBjb25zdCBhY3Rpb25UeXBlID0gdHlwZSBhcyBBY3Rpb25UeXBlXG4gICAgYWRkQWN0aW9uVHlwZShlbmdpbmUsIGFjdGlvblR5cGUsIEFjdGlvblNjaGVtYXNbYWN0aW9uVHlwZV0pXG4gIH1cblxuICAvLyBBZGQgY291bnRlciB0byByb290IGVudGl0eVxuICBjb25zdCBDb3VudGVyID0gZW5naW5lLmdldENvbXBvbmVudChcbiAgICBDb21wb25lbnROYW1lLkNPVU5URVIsXG4gICkgYXMgTGFzdFdyaXRlV2luRWxlbWVudFNldENvbXBvbmVudERlZmluaXRpb248Q291bnRlcj5cbiAgY29uc3QgY291bnRlciA9IENvdW50ZXIuZ2V0T3JDcmVhdGVNdXRhYmxlKGVuZ2luZS5Sb290RW50aXR5KVxuICBjb3VudGVyLnZhbHVlID0gY291bnRlci52YWx1ZSB8fCAwXG5cbiAgaWYgKGNvbXBvbmVudHMgJiYgY29tcG9uZW50cy5WaWRlb1BsYXllciAmJiBjb21wb25lbnRzLk1hdGVyaWFsKSB7XG4gICAgaW5pdFZpZGVvUGxheWVyQ29tcG9uZW50cyhlbmdpbmUsIHtcbiAgICAgIFZpZGVvUGxheWVyOiBjb21wb25lbnRzLlZpZGVvUGxheWVyLFxuICAgICAgTWF0ZXJpYWw6IGNvbXBvbmVudHMuTWF0ZXJpYWwsXG4gICAgfSlcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRWaWRlb1RleHR1cmUoeyBtYXRlcmlhbCB9OiBQQk1hdGVyaWFsKTogVmlkZW9UZXh0dXJlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKFxuICAgIG1hdGVyaWFsPy4kY2FzZSA9PT0gJ3BicicgJiZcbiAgICBtYXRlcmlhbC5wYnIudGV4dHVyZT8udGV4Py4kY2FzZSA9PT0gJ3ZpZGVvVGV4dHVyZSdcbiAgKSB7XG4gICAgcmV0dXJuIG1hdGVyaWFsLnBici50ZXh0dXJlLnRleC52aWRlb1RleHR1cmVcbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluaXRWaWRlb1BsYXllckNvbXBvbmVudE1hdGVyaWFsKFxuICBlbnRpdHk6IEVudGl0eSxcbiAgeyBNYXRlcmlhbCB9OiBQaWNrPEVuZ2luZUNvbXBvbmVudHMsICdNYXRlcmlhbCc+LFxuICBtYXRlcmlhbD86IFBCTWF0ZXJpYWwgfCBudWxsLFxuKSB7XG4gIGlmICghbWF0ZXJpYWwgfHwgIW1hdGVyaWFsLm1hdGVyaWFsIHx8IG1hdGVyaWFsLm1hdGVyaWFsLiRjYXNlICE9PSAncGJyJykge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBNYXRlcmlhbC5zZXRQYnJNYXRlcmlhbChlbnRpdHksIHtcbiAgICAuLi5tYXRlcmlhbC5tYXRlcmlhbC5wYnIsXG4gICAgdGV4dHVyZTogTWF0ZXJpYWwuVGV4dHVyZS5WaWRlbyh7XG4gICAgICB2aWRlb1BsYXllckVudGl0eTogZW50aXR5LFxuICAgIH0pLFxuICB9KVxufVxuXG5mdW5jdGlvbiBpbml0VmlkZW9QbGF5ZXJDb21wb25lbnRzKFxuICBlbmdpbmU6IElFbmdpbmUsXG4gIGNvbXBvbmVudHM6IFBpY2s8RW5naW5lQ29tcG9uZW50cywgJ01hdGVyaWFsJyB8ICdWaWRlb1BsYXllcic+LFxuKSB7XG4gIGZ1bmN0aW9uIHJlcGxhY2VWaWRlb1RleHR1cmUoKSB7XG4gICAgY29uc3QgeyBNYXRlcmlhbCwgVmlkZW9QbGF5ZXIgfSA9IGNvbXBvbmVudHNcbiAgICBlbmdpbmUucmVtb3ZlU3lzdGVtKHJlcGxhY2VWaWRlb1RleHR1cmUpXG4gICAgZm9yIChjb25zdCBbZW50aXR5LCBtYXRlcmlhbF0gb2YgZW5naW5lLmdldEVudGl0aWVzV2l0aChcbiAgICAgIE1hdGVyaWFsLFxuICAgICAgVmlkZW9QbGF5ZXIsXG4gICAgKSkge1xuICAgICAgY29uc3QgdmlkZW9UZXh0dXJlID0gZ2V0VmlkZW9UZXh0dXJlKG1hdGVyaWFsKVxuICAgICAgaWYgKHZpZGVvVGV4dHVyZT8udmlkZW9QbGF5ZXJFbnRpdHkgPT09IGVuZ2luZS5Sb290RW50aXR5KSB7XG4gICAgICAgIGluaXRWaWRlb1BsYXllckNvbXBvbmVudE1hdGVyaWFsKGVudGl0eSwgY29tcG9uZW50cywgbWF0ZXJpYWwpXG4gICAgICB9XG4gICAgfVxuICB9XG4gIGVuZ2luZS5hZGRTeXN0ZW0ocmVwbGFjZVZpZGVvVGV4dHVyZSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbmRpdGlvblR5cGVzQnlDb21wb25lbnROYW1lKGNvbXBvbmVudE5hbWU6IENvbXBvbmVudE5hbWUpIHtcbiAgc3dpdGNoIChjb21wb25lbnROYW1lKSB7XG4gICAgY2FzZSBDb21wb25lbnROYW1lLlNUQVRFUzoge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgVHJpZ2dlckNvbmRpdGlvblR5cGUuV0hFTl9TVEFURV9JUyxcbiAgICAgICAgVHJpZ2dlckNvbmRpdGlvblR5cGUuV0hFTl9TVEFURV9JU19OT1QsXG4gICAgICBdXG4gICAgfVxuICAgIGNhc2UgQ29tcG9uZW50TmFtZS5DT1VOVEVSOiB7XG4gICAgICByZXR1cm4gW1xuICAgICAgICBUcmlnZ2VyQ29uZGl0aW9uVHlwZS5XSEVOX0NPVU5URVJfRVFVQUxTLFxuICAgICAgICBUcmlnZ2VyQ29uZGl0aW9uVHlwZS5XSEVOX0NPVU5URVJfSVNfR1JFQVRFUl9USEFOLFxuICAgICAgICBUcmlnZ2VyQ29uZGl0aW9uVHlwZS5XSEVOX0NPVU5URVJfSVNfTEVTU19USEFOLFxuICAgICAgXVxuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICByZXR1cm4gW11cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgQ29tcG9uZW50cyA9IFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZUNvbXBvbmVudHM+XG5cbmV4cG9ydCB0eXBlIEFjdGlvblR5cGVzQ29tcG9uZW50ID0gQ29tcG9uZW50c1snQWN0aW9uVHlwZXMnXVxuZXhwb3J0IHR5cGUgQWN0aW9uVHlwZXMgPSBSZXR1cm5UeXBlPFxuICBBY3Rpb25UeXBlc0NvbXBvbmVudFsnc2NoZW1hJ11bJ2Rlc2VyaWFsaXplJ11cbj5cblxuZXhwb3J0IHR5cGUgQWN0aW9uc0NvbXBvbmVudCA9IENvbXBvbmVudHNbJ0FjdGlvbnMnXVxuZXhwb3J0IHR5cGUgQWN0aW9ucyA9IFJldHVyblR5cGU8QWN0aW9uc0NvbXBvbmVudFsnc2NoZW1hJ11bJ2Rlc2VyaWFsaXplJ10+XG5leHBvcnQgdHlwZSBBY3Rpb24gPSBBY3Rpb25zWyd2YWx1ZSddWzBdXG5cbmV4cG9ydCB0eXBlIENvdW50ZXJDb21wb25lbnQgPSBDb21wb25lbnRzWydDb3VudGVyJ11cbmV4cG9ydCB0eXBlIENvdW50ZXIgPSBSZXR1cm5UeXBlPENvdW50ZXJDb21wb25lbnRbJ3NjaGVtYSddWydkZXNlcmlhbGl6ZSddPlxuXG5leHBvcnQgdHlwZSBUcmlnZ2Vyc0NvbXBvbmVudCA9IENvbXBvbmVudHNbJ1RyaWdnZXJzJ11cbmV4cG9ydCB0eXBlIFRyaWdnZXJzID0gUmV0dXJuVHlwZTxUcmlnZ2Vyc0NvbXBvbmVudFsnc2NoZW1hJ11bJ2Rlc2VyaWFsaXplJ10+XG5leHBvcnQgdHlwZSBUcmlnZ2VyID0gVHJpZ2dlcnNbJ3ZhbHVlJ11bMF1cbmV4cG9ydCB0eXBlIFRyaWdnZXJBY3Rpb24gPSBUcmlnZ2VyWydhY3Rpb25zJ11bMF1cbmV4cG9ydCB0eXBlIFRyaWdnZXJDb25kaXRpb24gPSBFeGNsdWRlPFRyaWdnZXJbJ2NvbmRpdGlvbnMnXSwgdW5kZWZpbmVkPlswXVxuXG5leHBvcnQgdHlwZSBTdGF0ZXNDb21wb25lbnQgPSBDb21wb25lbnRzWydTdGF0ZXMnXVxuZXhwb3J0IHR5cGUgU3RhdGVzID0gUmV0dXJuVHlwZTxTdGF0ZXNDb21wb25lbnRbJ3NjaGVtYSddWydkZXNlcmlhbGl6ZSddPlxuIiwgImltcG9ydCB7XG4gIElFbmdpbmUsXG4gIEVudGl0eSxcbiAgVmlkZW9QbGF5ZXIsXG4gIE1hdGVyaWFsLFxuICBBdWRpb1N0cmVhbSxcbiAgVWlUZXh0LFxuICBZR1VuaXQsXG4gIFRleHRBbGlnbk1vZGUsXG4gIEZvbnQsXG4gIFlHUG9zaXRpb25UeXBlLFxuICBQb2ludGVyRmlsdGVyTW9kZSxcbiAgcG9pbnRlckV2ZW50c1N5c3RlbSxcbiAgSW5wdXRBY3Rpb24sXG4gIE1lc2hDb2xsaWRlcixcbn0gZnJvbSAnQGRjbC9zZGsvZWNzJ1xuaW1wb3J0IHsgUXVhdGVybmlvbiwgVmVjdG9yMyB9IGZyb20gJ0BkY2wvc2RrL21hdGgnXG5pbXBvcnQgeyB0d2VlbnMgfSBmcm9tICdAZGNsLXNkay91dGlscy9kaXN0L3R3ZWVuJ1xuaW1wb3J0IHsgcmVxdWVzdFRlbGVwb3J0IH0gZnJvbSAnfnN5c3RlbS9Vc2VyQWN0aW9uTW9kdWxlJ1xuaW1wb3J0IHtcbiAgbW92ZVBsYXllclRvLFxuICB0cmlnZ2VyRW1vdGUsXG4gIHRyaWdnZXJTY2VuZUVtb3RlLFxuICBvcGVuRXh0ZXJuYWxVcmwsXG59IGZyb20gJ35zeXN0ZW0vUmVzdHJpY3RlZEFjdGlvbnMnXG5pbXBvcnQgeyBnZXRBY3RpdmVWaWRlb1N0cmVhbXMgfSBmcm9tICd+c3lzdGVtL0NvbW1zQXBpJ1xuaW1wb3J0IHtcbiAgQWN0aW9uUGF5bG9hZCxcbiAgQWN0aW9uVHlwZSxcbiAgRW5naW5lQ29tcG9uZW50cyxcbiAgU2NyZWVuQWxpZ25Nb2RlLFxuICBUcmlnZ2VyVHlwZSxcbiAgVHdlZW5UeXBlLFxuICBjbG9uZSxcbiAgZ2V0Q29tcG9uZW50cyxcbiAgaW5pdFZpZGVvUGxheWVyQ29tcG9uZW50TWF0ZXJpYWwsXG59IGZyb20gJy4vZGVmaW5pdGlvbnMnXG5pbXBvcnQgeyBnZXREZWZhdWx0VmFsdWUsIGlzVmFsaWRTdGF0ZSB9IGZyb20gJy4vc3RhdGVzJ1xuaW1wb3J0IHsgZ2V0QWN0aW9uRXZlbnRzLCBnZXRUcmlnZ2VyRXZlbnRzIH0gZnJvbSAnLi9ldmVudHMnXG5pbXBvcnQge1xuICBzdGFydEludGVydmFsLFxuICBzdGFydFRpbWVvdXQsXG4gIHN0b3BBbGxJbnRlcnZhbHMsXG4gIHN0b3BBbGxUaW1lb3V0cyxcbiAgc3RvcEludGVydmFsLFxuICBzdG9wVGltZW91dCxcbn0gZnJvbSAnLi90aW1lcidcbmltcG9ydCB7IGdldFBheWxvYWQgfSBmcm9tICcuL2FjdGlvbi10eXBlcydcbmltcG9ydCB7XG4gIGdldFVJQmFja2dyb3VuZCxcbiAgZ2V0VUlUZXh0LFxuICBnZXRVSVRyYW5zZm9ybSxcbiAgbWFwQWxpZ25Ub1NjcmVlbkFsaWduLFxufSBmcm9tICcuL3VpJ1xuaW1wb3J0IHsgaW5pdFRyaWdnZXJzIH0gZnJvbSAnLi90cmlnZ2VycydcblxuY29uc3QgaW5pdGVkRW50aXRpZXMgPSBuZXcgU2V0PEVudGl0eT4oKVxuY29uc3QgdWlTdGFja3MgPSBuZXcgTWFwPHN0cmluZywgRW50aXR5PigpXG5jb25zdCBsYXN0VWlFbnRpdHlDbGlja2VkID0gbmV3IE1hcDxFbnRpdHksIEVudGl0eT4oKVxuXG5sZXQgaW50ZXJuYWxJbml0QWN0aW9uczogKChlbnRpdHk6IEVudGl0eSkgPT4gdm9pZCkgfCBudWxsID0gbnVsbFxuXG5leHBvcnQgZnVuY3Rpb24gaW5pdEFjdGlvbnMoZW50aXR5OiBFbnRpdHkpIHtcbiAgaWYgKGludGVybmFsSW5pdEFjdGlvbnMpIHtcbiAgICByZXR1cm4gaW50ZXJuYWxJbml0QWN0aW9ucyhlbnRpdHkpXG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBDYW5ub3QgY2FsbCBpbml0QWN0aW9ucyB3aGlsZSBhY3Rpb25zU3lzdGVtIGhhcyBub3QgYmVlbiBjcmVhdGVkYCxcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQWN0aW9uc1N5c3RlbShcbiAgZW5naW5lOiBJRW5naW5lLFxuICBjb21wb25lbnRzOiBFbmdpbmVDb21wb25lbnRzLFxuKSB7XG4gIGNvbnN0IHtcbiAgICBBbmltYXRvcixcbiAgICBUcmFuc2Zvcm0sXG4gICAgQXVkaW9Tb3VyY2UsXG4gICAgQXZhdGFyQXR0YWNoLFxuICAgIFZpc2liaWxpdHlDb21wb25lbnQsXG4gICAgR2x0ZkNvbnRhaW5lcixcbiAgfSA9IGNvbXBvbmVudHNcbiAgY29uc3QgeyBBY3Rpb25zLCBTdGF0ZXMsIENvdW50ZXIsIFRyaWdnZXJzIH0gPSBnZXRDb21wb25lbnRzKGVuZ2luZSlcblxuICAvLyBzYXZlIGludGVybmFsIHJlZmVyZW5jZSB0byBpbml0IGZ1bmNpb25cbiAgaW50ZXJuYWxJbml0QWN0aW9ucyA9IGluaXRBY3Rpb25zXG5cbiAgcmV0dXJuIGZ1bmN0aW9uIGFjdGlvbnNTeXN0ZW0oX2R0OiBudW1iZXIpIHtcbiAgICBjb25zdCBlbnRpdGllc1dpdGhBY3Rpb25zID0gZW5naW5lLmdldEVudGl0aWVzV2l0aChBY3Rpb25zKVxuXG4gICAgZm9yIChjb25zdCBbZW50aXR5XSBvZiBlbnRpdGllc1dpdGhBY3Rpb25zKSB7XG4gICAgICBpbml0QWN0aW9ucyhlbnRpdHkpXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaW5pdEFjdGlvbnMoZW50aXR5OiBFbnRpdHkpIHtcbiAgICBpZiAoIUFjdGlvbnMuaGFzKGVudGl0eSkgfHwgaW5pdGVkRW50aXRpZXMuaGFzKGVudGl0eSkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIGdldCBhY3Rpb25zIGRhdGFcbiAgICBjb25zdCBhY3Rpb25zID0gQWN0aW9ucy5nZXQoZW50aXR5KVxuXG4gICAgLy8gaW5pdGlhbGl6ZSBhY3Rpb25zIGZvciBnaXZlbiBlbnRpdHlcbiAgICBjb25zdCB0eXBlcyA9IGFjdGlvbnMudmFsdWUucmVkdWNlKFxuICAgICAgKHR5cGVzLCBhY3Rpb24pID0+IHR5cGVzLmFkZChhY3Rpb24udHlwZSksXG4gICAgICBuZXcgU2V0PFN0cmluZz4oKSxcbiAgICApXG5cbiAgICBmb3IgKGNvbnN0IHR5cGUgb2YgdHlwZXMpIHtcbiAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlIEFjdGlvblR5cGUuUExBWV9BTklNQVRJT046IHtcbiAgICAgICAgICBpbml0UGxheUFuaW1hdGlvbihlbnRpdHkpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gYmluZCBhY3Rpb25zXG4gICAgY29uc3QgYWN0aW9uRXZlbnRzID0gZ2V0QWN0aW9uRXZlbnRzKGVudGl0eSlcbiAgICBmb3IgKGNvbnN0IGFjdGlvbiBvZiBhY3Rpb25zLnZhbHVlKSB7XG4gICAgICBhY3Rpb25FdmVudHMub24oYWN0aW9uLm5hbWUsICgpID0+IHtcbiAgICAgICAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgICAgICAgIGNhc2UgQWN0aW9uVHlwZS5QTEFZX0FOSU1BVElPTjoge1xuICAgICAgICAgICAgaGFuZGxlUGxheUFuaW1hdGlvbihcbiAgICAgICAgICAgICAgZW50aXR5LFxuICAgICAgICAgICAgICBnZXRQYXlsb2FkPEFjdGlvblR5cGUuUExBWV9BTklNQVRJT04+KGFjdGlvbiksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIEFjdGlvblR5cGUuU1RPUF9BTklNQVRJT046IHtcbiAgICAgICAgICAgIGhhbmRsZVN0b3BBbmltYXRpb24oXG4gICAgICAgICAgICAgIGVudGl0eSxcbiAgICAgICAgICAgICAgZ2V0UGF5bG9hZDxBY3Rpb25UeXBlLlNUT1BfQU5JTUFUSU9OPihhY3Rpb24pLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBBY3Rpb25UeXBlLlNFVF9TVEFURToge1xuICAgICAgICAgICAgaGFuZGxlU2V0U3RhdGUoZW50aXR5LCBnZXRQYXlsb2FkPEFjdGlvblR5cGUuU0VUX1NUQVRFPihhY3Rpb24pKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBBY3Rpb25UeXBlLlNUQVJUX1RXRUVOOiB7XG4gICAgICAgICAgICBoYW5kbGVTdGFydFR3ZWVuKGVudGl0eSwgZ2V0UGF5bG9hZDxBY3Rpb25UeXBlLlNUQVJUX1RXRUVOPihhY3Rpb24pKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBBY3Rpb25UeXBlLlNFVF9DT1VOVEVSOiB7XG4gICAgICAgICAgICBoYW5kbGVTZXRDb3VudGVyKGVudGl0eSwgZ2V0UGF5bG9hZDxBY3Rpb25UeXBlLlNFVF9DT1VOVEVSPihhY3Rpb24pKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBBY3Rpb25UeXBlLklOQ1JFTUVOVF9DT1VOVEVSOiB7XG4gICAgICAgICAgICBoYW5kbGVJbmNyZW1lbnRDb3VudGVyKFxuICAgICAgICAgICAgICBlbnRpdHksXG4gICAgICAgICAgICAgIGdldFBheWxvYWQ8QWN0aW9uVHlwZS5JTkNSRU1FTlRfQ09VTlRFUj4oYWN0aW9uKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgQWN0aW9uVHlwZS5ERUNSRUFTRV9DT1VOVEVSOiB7XG4gICAgICAgICAgICBoYW5kbGVEZWNyZWFzZUNvdW50ZXIoXG4gICAgICAgICAgICAgIGVudGl0eSxcbiAgICAgICAgICAgICAgZ2V0UGF5bG9hZDxBY3Rpb25UeXBlLkRFQ1JFQVNFX0NPVU5URVI+KGFjdGlvbiksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIEFjdGlvblR5cGUuUExBWV9TT1VORDoge1xuICAgICAgICAgICAgaGFuZGxlUGxheVNvdW5kKGVudGl0eSwgZ2V0UGF5bG9hZDxBY3Rpb25UeXBlLlBMQVlfU09VTkQ+KGFjdGlvbikpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIEFjdGlvblR5cGUuU1RPUF9TT1VORDoge1xuICAgICAgICAgICAgaGFuZGxlU3RvcFNvdW5kKGVudGl0eSwgZ2V0UGF5bG9hZDxBY3Rpb25UeXBlLlNUT1BfU09VTkQ+KGFjdGlvbikpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIEFjdGlvblR5cGUuU0VUX1ZJU0lCSUxJVFk6IHtcbiAgICAgICAgICAgIGhhbmRsZVNldFZpc2liaWxpdHkoXG4gICAgICAgICAgICAgIGVudGl0eSxcbiAgICAgICAgICAgICAgZ2V0UGF5bG9hZDxBY3Rpb25UeXBlLlNFVF9WSVNJQklMSVRZPihhY3Rpb24pLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBBY3Rpb25UeXBlLkFUVEFDSF9UT19QTEFZRVI6IHtcbiAgICAgICAgICAgIGhhbmRsZUF0dGFjaFRvUGxheWVyKFxuICAgICAgICAgICAgICBlbnRpdHksXG4gICAgICAgICAgICAgIGdldFBheWxvYWQ8QWN0aW9uVHlwZS5BVFRBQ0hfVE9fUExBWUVSPihhY3Rpb24pLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBBY3Rpb25UeXBlLkRFVEFDSF9GUk9NX1BMQVlFUjoge1xuICAgICAgICAgICAgaGFuZGxlRGV0YWNoRnJvbVBsYXllcihcbiAgICAgICAgICAgICAgZW50aXR5LFxuICAgICAgICAgICAgICBnZXRQYXlsb2FkPEFjdGlvblR5cGUuREVUQUNIX0ZST01fUExBWUVSPihhY3Rpb24pLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBBY3Rpb25UeXBlLlBMQVlfVklERU9fU1RSRUFNOiB7XG4gICAgICAgICAgICBoYW5kbGVQbGF5VmlkZW8oXG4gICAgICAgICAgICAgIGVudGl0eSxcbiAgICAgICAgICAgICAgZ2V0UGF5bG9hZDxBY3Rpb25UeXBlLlBMQVlfVklERU9fU1RSRUFNPihhY3Rpb24pLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBBY3Rpb25UeXBlLlNUT1BfVklERU9fU1RSRUFNOiB7XG4gICAgICAgICAgICBoYW5kbGVTdG9wVmlkZW8oXG4gICAgICAgICAgICAgIGVudGl0eSxcbiAgICAgICAgICAgICAgZ2V0UGF5bG9hZDxBY3Rpb25UeXBlLlNUT1BfVklERU9fU1RSRUFNPihhY3Rpb24pLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBBY3Rpb25UeXBlLlBMQVlfQVVESU9fU1RSRUFNOiB7XG4gICAgICAgICAgICBoYW5kbGVQbGF5QXVkaW9TdHJlYW0oXG4gICAgICAgICAgICAgIGVudGl0eSxcbiAgICAgICAgICAgICAgZ2V0UGF5bG9hZDxBY3Rpb25UeXBlLlBMQVlfQVVESU9fU1RSRUFNPihhY3Rpb24pLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBBY3Rpb25UeXBlLlNUT1BfQVVESU9fU1RSRUFNOiB7XG4gICAgICAgICAgICBoYW5kbGVTdG9wQXVkaW9TdHJlYW0oXG4gICAgICAgICAgICAgIGVudGl0eSxcbiAgICAgICAgICAgICAgZ2V0UGF5bG9hZDxBY3Rpb25UeXBlLlNUT1BfQVVESU9fU1RSRUFNPihhY3Rpb24pLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBBY3Rpb25UeXBlLlRFTEVQT1JUX1BMQVlFUjoge1xuICAgICAgICAgICAgaGFuZGxlVGVsZXBvcnRQbGF5ZXIoXG4gICAgICAgICAgICAgIGVudGl0eSxcbiAgICAgICAgICAgICAgZ2V0UGF5bG9hZDxBY3Rpb25UeXBlLlRFTEVQT1JUX1BMQVlFUj4oYWN0aW9uKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgQWN0aW9uVHlwZS5NT1ZFX1BMQVlFUjoge1xuICAgICAgICAgICAgaGFuZGxlTW92ZVBsYXllcihlbnRpdHksIGdldFBheWxvYWQ8QWN0aW9uVHlwZS5NT1ZFX1BMQVlFUj4oYWN0aW9uKSlcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgQWN0aW9uVHlwZS5QTEFZX0RFRkFVTFRfRU1PVEU6IHtcbiAgICAgICAgICAgIGhhbmRsZVBsYXlEZWZhdWx0RW1vdGUoXG4gICAgICAgICAgICAgIGVudGl0eSxcbiAgICAgICAgICAgICAgZ2V0UGF5bG9hZDxBY3Rpb25UeXBlLlBMQVlfREVGQVVMVF9FTU9URT4oYWN0aW9uKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgQWN0aW9uVHlwZS5QTEFZX0NVU1RPTV9FTU9URToge1xuICAgICAgICAgICAgaGFuZGxlUGxheUN1c3RvbUVtb3RlKFxuICAgICAgICAgICAgICBlbnRpdHksXG4gICAgICAgICAgICAgIGdldFBheWxvYWQ8QWN0aW9uVHlwZS5QTEFZX0NVU1RPTV9FTU9URT4oYWN0aW9uKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgQWN0aW9uVHlwZS5PUEVOX0xJTks6IHtcbiAgICAgICAgICAgIGhhbmRsZU9wZW5MaW5rKGVudGl0eSwgZ2V0UGF5bG9hZDxBY3Rpb25UeXBlLk9QRU5fTElOSz4oYWN0aW9uKSlcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgQWN0aW9uVHlwZS5TSE9XX1RFWFQ6IHtcbiAgICAgICAgICAgIGhhbmRsZVNob3dUZXh0KGVudGl0eSwgZ2V0UGF5bG9hZDxBY3Rpb25UeXBlLlNIT1dfVEVYVD4oYWN0aW9uKSlcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgQWN0aW9uVHlwZS5ISURFX1RFWFQ6IHtcbiAgICAgICAgICAgIGhhbmRsZUhpZGVUZXh0KGVudGl0eSwgZ2V0UGF5bG9hZDxBY3Rpb25UeXBlLkhJREVfVEVYVD4oYWN0aW9uKSlcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgQWN0aW9uVHlwZS5TVEFSVF9ERUxBWToge1xuICAgICAgICAgICAgaGFuZGxlU3RhcnREZWxheShlbnRpdHksIGdldFBheWxvYWQ8QWN0aW9uVHlwZS5TVEFSVF9ERUxBWT4oYWN0aW9uKSlcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgQWN0aW9uVHlwZS5TVE9QX0RFTEFZOiB7XG4gICAgICAgICAgICBoYW5kbGVTdG9wRGVsYXkoZW50aXR5LCBnZXRQYXlsb2FkPEFjdGlvblR5cGUuU1RPUF9ERUxBWT4oYWN0aW9uKSlcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgQWN0aW9uVHlwZS5TVEFSVF9MT09QOiB7XG4gICAgICAgICAgICBoYW5kbGVTdGFydExvb3AoZW50aXR5LCBnZXRQYXlsb2FkPEFjdGlvblR5cGUuU1RBUlRfTE9PUD4oYWN0aW9uKSlcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgQWN0aW9uVHlwZS5TVE9QX0xPT1A6IHtcbiAgICAgICAgICAgIGhhbmRsZVN0b3BMb29wKGVudGl0eSwgZ2V0UGF5bG9hZDxBY3Rpb25UeXBlLlNUT1BfTE9PUD4oYWN0aW9uKSlcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgQWN0aW9uVHlwZS5DTE9ORV9FTlRJVFk6IHtcbiAgICAgICAgICAgIGhhbmRsZUNsb25lRW50aXR5KFxuICAgICAgICAgICAgICBlbnRpdHksXG4gICAgICAgICAgICAgIGdldFBheWxvYWQ8QWN0aW9uVHlwZS5DTE9ORV9FTlRJVFk+KGFjdGlvbiksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIEFjdGlvblR5cGUuUkVNT1ZFX0VOVElUWToge1xuICAgICAgICAgICAgaGFuZGxlUmVtb3ZlRW50aXR5KFxuICAgICAgICAgICAgICBlbnRpdHksXG4gICAgICAgICAgICAgIGdldFBheWxvYWQ8QWN0aW9uVHlwZS5SRU1PVkVfRU5USVRZPihhY3Rpb24pLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBBY3Rpb25UeXBlLlNIT1dfSU1BR0U6IHtcbiAgICAgICAgICAgIGhhbmRsZVNob3dJbWFnZShlbnRpdHksIGdldFBheWxvYWQ8QWN0aW9uVHlwZS5TSE9XX0lNQUdFPihhY3Rpb24pKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBBY3Rpb25UeXBlLkhJREVfSU1BR0U6IHtcbiAgICAgICAgICAgIGhhbmRsZUhpZGVJbWFnZShlbnRpdHksIGdldFBheWxvYWQ8QWN0aW9uVHlwZS5ISURFX0lNQUdFPihhY3Rpb24pKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaW5pdGVkRW50aXRpZXMuYWRkKGVudGl0eSlcbiAgfVxuXG4gIC8vIFBMQVlfQU5JTUFUSU9OXG4gIGZ1bmN0aW9uIGluaXRQbGF5QW5pbWF0aW9uKGVudGl0eTogRW50aXR5KSB7XG4gICAgaWYgKCFBbmltYXRvci5oYXMoZW50aXR5KSkge1xuICAgICAgQW5pbWF0b3IuY3JlYXRlKGVudGl0eSwge1xuICAgICAgICBzdGF0ZXM6IFtdLFxuICAgICAgfSlcbiAgICAgIEFuaW1hdG9yLnN0b3BBbGxBbmltYXRpb25zKGVudGl0eSlcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVQbGF5QW5pbWF0aW9uKFxuICAgIGVudGl0eTogRW50aXR5LFxuICAgIHBheWxvYWQ6IEFjdGlvblBheWxvYWQ8QWN0aW9uVHlwZS5QTEFZX0FOSU1BVElPTj4sXG4gICkge1xuICAgIGNvbnN0IHsgYW5pbWF0aW9uLCBsb29wIH0gPSBwYXlsb2FkXG5cbiAgICBjb25zdCBhbmltYXRvciA9IEFuaW1hdG9yLmdldE11dGFibGUoZW50aXR5KVxuICAgIGlmICghYW5pbWF0b3Iuc3RhdGVzLnNvbWUoKCQpID0+ICQuY2xpcCA9PT0gYW5pbWF0aW9uKSkge1xuICAgICAgYW5pbWF0b3Iuc3RhdGVzID0gW1xuICAgICAgICAuLi5hbmltYXRvci5zdGF0ZXMsXG4gICAgICAgIHtcbiAgICAgICAgICBjbGlwOiBhbmltYXRpb24sXG4gICAgICAgIH0sXG4gICAgICBdXG4gICAgfVxuXG4gICAgQW5pbWF0b3Iuc3RvcEFsbEFuaW1hdGlvbnMoZW50aXR5KVxuICAgIGNvbnN0IGNsaXAgPSBBbmltYXRvci5nZXRDbGlwKGVudGl0eSwgYW5pbWF0aW9uKVxuICAgIGNsaXAucGxheWluZyA9IHRydWVcbiAgICBjbGlwLmxvb3AgPSBsb29wID8/IGZhbHNlXG4gIH1cblxuICAvLyBTVE9QX0FOSU1BVElPTlxuICBmdW5jdGlvbiBoYW5kbGVTdG9wQW5pbWF0aW9uKFxuICAgIGVudGl0eTogRW50aXR5LFxuICAgIF9wYXlsb2FkOiBBY3Rpb25QYXlsb2FkPEFjdGlvblR5cGUuU1RPUF9BTklNQVRJT04+LFxuICApIHtcbiAgICBpZiAoQW5pbWF0b3IuaGFzKGVudGl0eSkpIHtcbiAgICAgIEFuaW1hdG9yLnN0b3BBbGxBbmltYXRpb25zKGVudGl0eSlcbiAgICB9XG4gIH1cblxuICAvLyBTRVRfU1RBVEVcbiAgZnVuY3Rpb24gaGFuZGxlU2V0U3RhdGUoXG4gICAgZW50aXR5OiBFbnRpdHksXG4gICAgcGF5bG9hZDogQWN0aW9uUGF5bG9hZDxBY3Rpb25UeXBlLlNFVF9TVEFURT4sXG4gICkge1xuICAgIGNvbnN0IHN0YXRlcyA9IFN0YXRlcy5nZXRNdXRhYmxlT3JOdWxsKGVudGl0eSlcblxuICAgIGlmIChzdGF0ZXMpIHtcbiAgICAgIGxldCBuZXh0U3RhdGU6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHBheWxvYWQuc3RhdGVcbiAgICAgIG5leHRTdGF0ZSA9IGlzVmFsaWRTdGF0ZShzdGF0ZXMsIG5leHRTdGF0ZSlcbiAgICAgICAgPyBuZXh0U3RhdGVcbiAgICAgICAgOiBnZXREZWZhdWx0VmFsdWUoc3RhdGVzKVxuICAgICAgc3RhdGVzLmN1cnJlbnRWYWx1ZSA9IG5leHRTdGF0ZVxuXG4gICAgICBjb25zdCB0cmlnZ2VyRXZlbnRzID0gZ2V0VHJpZ2dlckV2ZW50cyhlbnRpdHkpXG4gICAgICB0cmlnZ2VyRXZlbnRzLmVtaXQoVHJpZ2dlclR5cGUuT05fU1RBVEVfQ0hBTkdFKVxuICAgIH1cbiAgfVxuXG4gIC8vIFNUQVJUX1RXRUVOXG4gIGZ1bmN0aW9uIGhhbmRsZVN0YXJ0VHdlZW4oXG4gICAgZW50aXR5OiBFbnRpdHksXG4gICAgcGF5bG9hZDogQWN0aW9uUGF5bG9hZDxBY3Rpb25UeXBlLlNUQVJUX1RXRUVOPixcbiAgKSB7XG4gICAgaWYgKHBheWxvYWQpIHtcbiAgICAgIGNvbnN0IHRyaWdnZXJFdmVudHMgPSBnZXRUcmlnZ2VyRXZlbnRzKGVudGl0eSlcbiAgICAgIGNvbnN0IG9uVHdlZW5FbmQgPSAoKSA9PiB0cmlnZ2VyRXZlbnRzLmVtaXQoVHJpZ2dlclR5cGUuT05fVFdFRU5fRU5EKVxuXG4gICAgICBzd2l0Y2ggKHBheWxvYWQudHlwZSkge1xuICAgICAgICBjYXNlIFR3ZWVuVHlwZS5NT1ZFX0lURU06IHtcbiAgICAgICAgICBoYW5kbGVNb3ZlSXRlbShlbnRpdHksIHBheWxvYWQsIG9uVHdlZW5FbmQpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFR3ZWVuVHlwZS5ST1RBVEVfSVRFTToge1xuICAgICAgICAgIGhhbmRsZVJvdGF0ZUl0ZW0oZW50aXR5LCBwYXlsb2FkLCBvblR3ZWVuRW5kKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBUd2VlblR5cGUuU0NBTEVfSVRFTToge1xuICAgICAgICAgIGhhbmRsZVNjYWxlSXRlbShlbnRpdHksIHBheWxvYWQsIG9uVHdlZW5FbmQpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHR3ZWVuIHR5cGU6ICR7cGF5bG9hZC50eXBlfWApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBNT1ZFX0lURU1cbiAgZnVuY3Rpb24gaGFuZGxlTW92ZUl0ZW0oXG4gICAgZW50aXR5OiBFbnRpdHksXG4gICAgdHdlZW46IEFjdGlvblBheWxvYWQ8QWN0aW9uVHlwZS5TVEFSVF9UV0VFTj4sXG4gICAgb25Ud2VlbkVuZDogKCkgPT4gdm9pZCxcbiAgKSB7XG4gICAgY29uc3QgdHJhbnNmb3JtID0gVHJhbnNmb3JtLmdldChlbnRpdHkpXG4gICAgY29uc3QgeyBkdXJhdGlvbiwgaW50ZXJwb2xhdGlvblR5cGUsIHJlbGF0aXZlIH0gPSB0d2VlblxuICAgIGNvbnN0IGVuZCA9IFZlY3RvcjMuY3JlYXRlKHR3ZWVuLmVuZC54LCB0d2Vlbi5lbmQueSwgdHdlZW4uZW5kLnopXG4gICAgY29uc3QgZW5kUG9zaXRpb24gPSByZWxhdGl2ZSA/IFZlY3RvcjMuYWRkKHRyYW5zZm9ybS5wb3NpdGlvbiwgZW5kKSA6IGVuZFxuXG4gICAgdHdlZW5zLnN0YXJ0VHJhbnNsYXRpb24oXG4gICAgICBlbnRpdHksXG4gICAgICB0cmFuc2Zvcm0ucG9zaXRpb24sXG4gICAgICBlbmRQb3NpdGlvbixcbiAgICAgIGR1cmF0aW9uLFxuICAgICAgaW50ZXJwb2xhdGlvblR5cGUsXG4gICAgICBvblR3ZWVuRW5kLFxuICAgIClcbiAgfVxuXG4gIC8vIFJPVEFURV9JVEVNXG4gIGZ1bmN0aW9uIGhhbmRsZVJvdGF0ZUl0ZW0oXG4gICAgZW50aXR5OiBFbnRpdHksXG4gICAgdHdlZW46IEFjdGlvblBheWxvYWQ8QWN0aW9uVHlwZS5TVEFSVF9UV0VFTj4sXG4gICAgb25Ud2VlbkVuZDogKCkgPT4gdm9pZCxcbiAgKSB7XG4gICAgY29uc3QgdHJhbnNmb3JtID0gVHJhbnNmb3JtLmdldChlbnRpdHkpXG4gICAgY29uc3QgeyBkdXJhdGlvbiwgaW50ZXJwb2xhdGlvblR5cGUsIHJlbGF0aXZlIH0gPSB0d2VlblxuICAgIGNvbnN0IGVuZCA9IFF1YXRlcm5pb24uZnJvbUV1bGVyRGVncmVlcyhcbiAgICAgIHR3ZWVuLmVuZC54LFxuICAgICAgdHdlZW4uZW5kLnksXG4gICAgICB0d2Vlbi5lbmQueixcbiAgICApXG4gICAgY29uc3QgZW5kUm90YXRpb24gPSByZWxhdGl2ZVxuICAgICAgPyBRdWF0ZXJuaW9uLm11bHRpcGx5KHRyYW5zZm9ybS5yb3RhdGlvbiwgZW5kKVxuICAgICAgOiBlbmRcblxuICAgIHR3ZWVucy5zdGFydFJvdGF0aW9uKFxuICAgICAgZW50aXR5LFxuICAgICAgdHJhbnNmb3JtLnJvdGF0aW9uLFxuICAgICAgZW5kUm90YXRpb24sXG4gICAgICBkdXJhdGlvbixcbiAgICAgIGludGVycG9sYXRpb25UeXBlLFxuICAgICAgb25Ud2VlbkVuZCxcbiAgICApXG4gIH1cblxuICAvLyBTQ0FMRV9JVEVNXG4gIGZ1bmN0aW9uIGhhbmRsZVNjYWxlSXRlbShcbiAgICBlbnRpdHk6IEVudGl0eSxcbiAgICB0d2VlbjogQWN0aW9uUGF5bG9hZDxBY3Rpb25UeXBlLlNUQVJUX1RXRUVOPixcbiAgICBvblR3ZWVuRW5kOiAoKSA9PiB2b2lkLFxuICApIHtcbiAgICBjb25zdCB0cmFuc2Zvcm0gPSBUcmFuc2Zvcm0uZ2V0KGVudGl0eSlcbiAgICBjb25zdCB7IGR1cmF0aW9uLCBpbnRlcnBvbGF0aW9uVHlwZSwgcmVsYXRpdmUgfSA9IHR3ZWVuXG4gICAgY29uc3QgZW5kID0gVmVjdG9yMy5jcmVhdGUodHdlZW4uZW5kLngsIHR3ZWVuLmVuZC55LCB0d2Vlbi5lbmQueilcbiAgICBjb25zdCBlbmRTY2FsZSA9IHJlbGF0aXZlID8gVmVjdG9yMy5hZGQodHJhbnNmb3JtLnNjYWxlLCBlbmQpIDogZW5kXG5cbiAgICB0d2VlbnMuc3RhcnRTY2FsaW5nKFxuICAgICAgZW50aXR5LFxuICAgICAgdHJhbnNmb3JtLnNjYWxlLFxuICAgICAgZW5kU2NhbGUsXG4gICAgICBkdXJhdGlvbixcbiAgICAgIGludGVycG9sYXRpb25UeXBlLFxuICAgICAgb25Ud2VlbkVuZCxcbiAgICApXG4gIH1cblxuICAvLyBTRVRfQ09VTlRFUlxuICBmdW5jdGlvbiBoYW5kbGVTZXRDb3VudGVyKFxuICAgIGVudGl0eTogRW50aXR5LFxuICAgIHBheWxvYWQ6IEFjdGlvblBheWxvYWQ8QWN0aW9uVHlwZS5TRVRfQ09VTlRFUj4sXG4gICkge1xuICAgIGNvbnN0IGNvdW50ZXIgPSBDb3VudGVyLmdldE11dGFibGVPck51bGwoZW50aXR5KVxuXG4gICAgaWYgKGNvdW50ZXIpIHtcbiAgICAgIGNvdW50ZXIudmFsdWUgPSBwYXlsb2FkLmNvdW50ZXJcblxuICAgICAgY29uc3QgdHJpZ2dlckV2ZW50cyA9IGdldFRyaWdnZXJFdmVudHMoZW50aXR5KVxuICAgICAgdHJpZ2dlckV2ZW50cy5lbWl0KFRyaWdnZXJUeXBlLk9OX0NPVU5URVJfQ0hBTkdFKVxuICAgIH1cbiAgfVxuXG4gIC8vIElOQ1JFTUVOVF9DT1VOVEVSXG4gIGZ1bmN0aW9uIGhhbmRsZUluY3JlbWVudENvdW50ZXIoXG4gICAgZW50aXR5OiBFbnRpdHksXG4gICAgX3BheWxvYWQ6IEFjdGlvblBheWxvYWQ8QWN0aW9uVHlwZS5JTkNSRU1FTlRfQ09VTlRFUj4sXG4gICkge1xuICAgIGNvbnN0IGNvdW50ZXIgPSBDb3VudGVyLmdldE11dGFibGVPck51bGwoZW50aXR5KVxuXG4gICAgaWYgKGNvdW50ZXIpIHtcbiAgICAgIGNvdW50ZXIudmFsdWUgKz0gMVxuXG4gICAgICBjb25zdCB0cmlnZ2VyRXZlbnRzID0gZ2V0VHJpZ2dlckV2ZW50cyhlbnRpdHkpXG4gICAgICB0cmlnZ2VyRXZlbnRzLmVtaXQoVHJpZ2dlclR5cGUuT05fQ09VTlRFUl9DSEFOR0UpXG4gICAgfVxuICB9XG5cbiAgLy8gREVDUkVBU0VfQ09VTlRFUlxuICBmdW5jdGlvbiBoYW5kbGVEZWNyZWFzZUNvdW50ZXIoXG4gICAgZW50aXR5OiBFbnRpdHksXG4gICAgX3BheWxvYWQ6IEFjdGlvblBheWxvYWQ8QWN0aW9uVHlwZS5JTkNSRU1FTlRfQ09VTlRFUj4sXG4gICkge1xuICAgIGNvbnN0IGNvdW50ZXIgPSBDb3VudGVyLmdldE11dGFibGVPck51bGwoZW50aXR5KVxuXG4gICAgaWYgKGNvdW50ZXIpIHtcbiAgICAgIGNvdW50ZXIudmFsdWUgLT0gMVxuXG4gICAgICBjb25zdCB0cmlnZ2VyRXZlbnRzID0gZ2V0VHJpZ2dlckV2ZW50cyhlbnRpdHkpXG4gICAgICB0cmlnZ2VyRXZlbnRzLmVtaXQoVHJpZ2dlclR5cGUuT05fQ09VTlRFUl9DSEFOR0UpXG4gICAgfVxuICB9XG5cbiAgLy8gUExBWV9TT1VORFxuICBmdW5jdGlvbiBoYW5kbGVQbGF5U291bmQoXG4gICAgZW50aXR5OiBFbnRpdHksXG4gICAgcGF5bG9hZDogQWN0aW9uUGF5bG9hZDxBY3Rpb25UeXBlLlBMQVlfU09VTkQ+LFxuICApIHtcbiAgICBjb25zdCB7IHNyYywgbG9vcCwgdm9sdW1lIH0gPSBwYXlsb2FkXG4gICAgQXVkaW9Tb3VyY2UuY3JlYXRlT3JSZXBsYWNlKGVudGl0eSwge1xuICAgICAgYXVkaW9DbGlwVXJsOiBzcmMsXG4gICAgICBsb29wLFxuICAgICAgcGxheWluZzogdHJ1ZSxcbiAgICAgIHZvbHVtZTogdm9sdW1lID8/IDEsXG4gICAgfSlcbiAgfVxuXG4gIC8vIFNUT1BfU09VTkRcbiAgZnVuY3Rpb24gaGFuZGxlU3RvcFNvdW5kKFxuICAgIGVudGl0eTogRW50aXR5LFxuICAgIF9wYXlsb2FkOiBBY3Rpb25QYXlsb2FkPEFjdGlvblR5cGUuU1RPUF9TT1VORD4sXG4gICkge1xuICAgIGNvbnN0IGF1ZGlvU291cmNlID0gQXVkaW9Tb3VyY2UuZ2V0TXV0YWJsZU9yTnVsbChlbnRpdHkpXG4gICAgaWYgKGF1ZGlvU291cmNlKSB7XG4gICAgICBhdWRpb1NvdXJjZS5wbGF5aW5nID0gZmFsc2VcbiAgICB9XG4gIH1cblxuICAvLyBTRVRfVklTSUJJTElUWVxuICBmdW5jdGlvbiBoYW5kbGVTZXRWaXNpYmlsaXR5KFxuICAgIGVudGl0eTogRW50aXR5LFxuICAgIHBheWxvYWQ6IEFjdGlvblBheWxvYWQ8QWN0aW9uVHlwZS5TRVRfVklTSUJJTElUWT4sXG4gICkge1xuICAgIGNvbnN0IHsgdmlzaWJsZSwgY29sbGlkZXIgfSA9IHBheWxvYWRcbiAgICBWaXNpYmlsaXR5Q29tcG9uZW50LmNyZWF0ZU9yUmVwbGFjZShlbnRpdHksIHsgdmlzaWJsZSB9KVxuICAgIGNvbnN0IGdsdGYgPSBHbHRmQ29udGFpbmVyLmdldE11dGFibGVPck51bGwoZW50aXR5KVxuICAgIGNvbnN0IG1lc2hDb2xsaWRlciA9IE1lc2hDb2xsaWRlci5nZXRNdXRhYmxlT3JOdWxsKGVudGl0eSlcblxuICAgIGlmIChjb2xsaWRlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoZ2x0Zikge1xuICAgICAgICBnbHRmLmludmlzaWJsZU1lc2hlc0NvbGxpc2lvbk1hc2sgPSBjb2xsaWRlclxuICAgICAgfSBlbHNlIGlmIChtZXNoQ29sbGlkZXIpIHtcbiAgICAgICAgbWVzaENvbGxpZGVyLmNvbGxpc2lvbk1hc2sgPSBjb2xsaWRlclxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEFUVEFDSF9UT19QTEFZRVJcbiAgZnVuY3Rpb24gaGFuZGxlQXR0YWNoVG9QbGF5ZXIoXG4gICAgZW50aXR5OiBFbnRpdHksXG4gICAgcGF5bG9hZDogQWN0aW9uUGF5bG9hZDxBY3Rpb25UeXBlLkFUVEFDSF9UT19QTEFZRVI+LFxuICApIHtcbiAgICBjb25zdCB7IGFuY2hvclBvaW50SWQgfSA9IHBheWxvYWRcbiAgICBBdmF0YXJBdHRhY2guY3JlYXRlT3JSZXBsYWNlKGVudGl0eSwgeyBhbmNob3JQb2ludElkIH0pXG4gIH1cblxuICAvLyBERVRBQ0hfRlJPTV9QTEFZRVJcbiAgZnVuY3Rpb24gaGFuZGxlRGV0YWNoRnJvbVBsYXllcihcbiAgICBlbnRpdHk6IEVudGl0eSxcbiAgICBfcGF5bG9hZDogQWN0aW9uUGF5bG9hZDxBY3Rpb25UeXBlLkRFVEFDSF9GUk9NX1BMQVlFUj4sXG4gICkge1xuICAgIGlmIChBdmF0YXJBdHRhY2guaGFzKGVudGl0eSkpIHtcbiAgICAgIEF2YXRhckF0dGFjaC5kZWxldGVGcm9tKGVudGl0eSlcbiAgICB9XG4gIH1cblxuICAvLyBURUxFUE9SVCBQTEFZRVJcbiAgZnVuY3Rpb24gaGFuZGxlVGVsZXBvcnRQbGF5ZXIoXG4gICAgX2VudGl0eTogRW50aXR5LFxuICAgIHBheWxvYWQ6IEFjdGlvblBheWxvYWQ8QWN0aW9uVHlwZS5URUxFUE9SVF9QTEFZRVI+LFxuICApIHtcbiAgICBjb25zdCB7IHgsIHkgfSA9IHBheWxvYWRcbiAgICByZXF1ZXN0VGVsZXBvcnQoe1xuICAgICAgZGVzdGluYXRpb246IGAke3h9LCR7eX1gLFxuICAgIH0pXG4gIH1cblxuICAvLyBNT1ZFIFBMQVlFUlxuICBmdW5jdGlvbiBoYW5kbGVNb3ZlUGxheWVyKFxuICAgIF9lbnRpdHk6IEVudGl0eSxcbiAgICBwYXlsb2FkOiBBY3Rpb25QYXlsb2FkPEFjdGlvblR5cGUuTU9WRV9QTEFZRVI+LFxuICApIHtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgbmV3UmVsYXRpdmVQb3NpdGlvbjogcGF5bG9hZC5wb3NpdGlvbixcbiAgICAgIGNhbWVyYVRhcmdldDogcGF5bG9hZC5jYW1lcmFUYXJnZXQsXG4gICAgfVxuICAgIGNvbnNvbGUubG9nKCdtb3ZlUGxheWVyVG8nLCBvcHRpb25zKVxuICAgIHZvaWQgbW92ZVBsYXllclRvKG9wdGlvbnMpXG4gIH1cblxuICAvLyBQTEFZIERFRkFVTFQgRU1PVEVcbiAgZnVuY3Rpb24gaGFuZGxlUGxheURlZmF1bHRFbW90ZShcbiAgICBfZW50aXR5OiBFbnRpdHksXG4gICAgcGF5bG9hZDogQWN0aW9uUGF5bG9hZDxBY3Rpb25UeXBlLlBMQVlfREVGQVVMVF9FTU9URT4sXG4gICkge1xuICAgIGNvbnN0IHsgZW1vdGUgfSA9IHBheWxvYWRcbiAgICB2b2lkIHRyaWdnZXJFbW90ZSh7IHByZWRlZmluZWRFbW90ZTogZW1vdGUgfSlcbiAgfVxuXG4gIC8vIFBMQVkgQ1VTVE9NIEVNT1RFXG4gIGZ1bmN0aW9uIGhhbmRsZVBsYXlDdXN0b21FbW90ZShcbiAgICBfZW50aXR5OiBFbnRpdHksXG4gICAgcGF5bG9hZDogQWN0aW9uUGF5bG9hZDxBY3Rpb25UeXBlLlBMQVlfQ1VTVE9NX0VNT1RFPixcbiAgKSB7XG4gICAgY29uc3QgeyBzcmMsIGxvb3AgfSA9IHBheWxvYWRcbiAgICB2b2lkIHRyaWdnZXJTY2VuZUVtb3RlKHsgc3JjLCBsb29wIH0pXG4gIH1cblxuICAvLyBPUEVOIExJTktcbiAgZnVuY3Rpb24gaGFuZGxlT3BlbkxpbmsoXG4gICAgX2VudGl0eTogRW50aXR5LFxuICAgIHBheWxvYWQ6IEFjdGlvblBheWxvYWQ8QWN0aW9uVHlwZS5PUEVOX0xJTks+LFxuICApIHtcbiAgICBjb25zdCB7IHVybCB9ID0gcGF5bG9hZFxuICAgIHZvaWQgb3BlbkV4dGVybmFsVXJsKHsgdXJsIH0pXG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBnZXRWaWRlb1NyYyh7XG4gICAgc3JjLFxuICAgIGRjbENhc3QsXG4gIH06IEFjdGlvblBheWxvYWQ8QWN0aW9uVHlwZS5QTEFZX1ZJREVPX1NUUkVBTT4pIHtcbiAgICBpZiAoZGNsQ2FzdCkge1xuICAgICAgY29uc3QgeyBzdHJlYW1zIH0gPSBhd2FpdCBnZXRBY3RpdmVWaWRlb1N0cmVhbXMoe30pXG4gICAgICByZXR1cm4gc3RyZWFtcy5sZW5ndGggPiAwID8gc3RyZWFtc1swXS50cmFja1NpZCA6ICcnXG4gICAgfVxuICAgIHJldHVybiBzcmMgPz8gJydcbiAgfVxuXG4gIC8vIFBMQVlfVklERU9cbiAgZnVuY3Rpb24gaGFuZGxlUGxheVZpZGVvKFxuICAgIGVudGl0eTogRW50aXR5LFxuICAgIHBheWxvYWQ6IEFjdGlvblBheWxvYWQ8QWN0aW9uVHlwZS5QTEFZX1ZJREVPX1NUUkVBTT4sXG4gICkge1xuICAgIGNvbnN0IHZpZGVvU291cmNlID0gVmlkZW9QbGF5ZXIuZ2V0TXV0YWJsZU9yTnVsbChlbnRpdHkpXG5cbiAgICBpZiAodmlkZW9Tb3VyY2UgJiYgdmlkZW9Tb3VyY2Uuc3JjKSB7XG4gICAgICB2aWRlb1NvdXJjZS5wbGF5aW5nID0gdHJ1ZVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBHZXQgdGhlIHZpZGVvIHNyYyBmcm9tIGEgcHJvbWlzZSAoVmlkZW8gRmlsZS9WaWRlbyBTdHJlYW0vRENMIENhc3QpXG4gICAgICBnZXRWaWRlb1NyYyhwYXlsb2FkKS50aGVuKChzcmMpID0+IHtcbiAgICAgICAgaWYgKCFzcmMpIHJldHVyblxuXG4gICAgICAgIFZpZGVvUGxheWVyLmNyZWF0ZU9yUmVwbGFjZShlbnRpdHksIHtcbiAgICAgICAgICBzcmMsXG4gICAgICAgICAgdm9sdW1lOiBwYXlsb2FkLnZvbHVtZSA/PyAxLFxuICAgICAgICAgIGxvb3A6IHBheWxvYWQubG9vcCA/PyBmYWxzZSxcbiAgICAgICAgICBwbGF5aW5nOiB0cnVlLFxuICAgICAgICB9KVxuXG4gICAgICAgIC8vIEluaXQgdmlkZW8gcGxheWVyIG1hdGVyaWFsIHdoZW4gdGhlIGVudGl0eSBkb2Vzbid0IGhhdmUgYSBWaWRlb1BsYXllciBjb21wb25lbnQgZGVmaW5lZFxuICAgICAgICBpbml0VmlkZW9QbGF5ZXJDb21wb25lbnRNYXRlcmlhbChcbiAgICAgICAgICBlbnRpdHksXG4gICAgICAgICAgY29tcG9uZW50cyxcbiAgICAgICAgICBNYXRlcmlhbC5nZXRPck51bGwoZW50aXR5KSxcbiAgICAgICAgKVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvLyBTVE9QX1ZJREVPXG4gIGZ1bmN0aW9uIGhhbmRsZVN0b3BWaWRlbyhcbiAgICBlbnRpdHk6IEVudGl0eSxcbiAgICBfcGF5bG9hZDogQWN0aW9uUGF5bG9hZDxBY3Rpb25UeXBlLlNUT1BfVklERU9fU1RSRUFNPixcbiAgKSB7XG4gICAgY29uc3QgdmlkZW9Tb3VyY2UgPSBWaWRlb1BsYXllci5nZXRNdXRhYmxlT3JOdWxsKGVudGl0eSlcbiAgICBpZiAodmlkZW9Tb3VyY2UpIHtcbiAgICAgIHZpZGVvU291cmNlLnBsYXlpbmcgPSBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIC8vIFBMQVlfQVVESU9fU1RSRUFNXG4gIGZ1bmN0aW9uIGhhbmRsZVBsYXlBdWRpb1N0cmVhbShcbiAgICBlbnRpdHk6IEVudGl0eSxcbiAgICBwYXlsb2FkOiBBY3Rpb25QYXlsb2FkPEFjdGlvblR5cGUuUExBWV9BVURJT19TVFJFQU0+LFxuICApIHtcbiAgICBjb25zdCB7IHVybCwgdm9sdW1lIH0gPSBwYXlsb2FkXG4gICAgQXVkaW9TdHJlYW0uY3JlYXRlT3JSZXBsYWNlKGVudGl0eSwge1xuICAgICAgdXJsLFxuICAgICAgcGxheWluZzogdHJ1ZSxcbiAgICAgIHZvbHVtZTogdm9sdW1lID8/IDEsXG4gICAgfSlcbiAgfVxuXG4gIC8vIFNUT1BfQVVESU9fU1RSRUFNXG4gIGZ1bmN0aW9uIGhhbmRsZVN0b3BBdWRpb1N0cmVhbShcbiAgICBlbnRpdHk6IEVudGl0eSxcbiAgICBfcGF5bG9hZDogQWN0aW9uUGF5bG9hZDxBY3Rpb25UeXBlLlNUT1BfQVVESU9fU1RSRUFNPixcbiAgKSB7XG4gICAgY29uc3QgYXVkaW9Tb3VyY2UgPSBBdWRpb1N0cmVhbS5nZXRNdXRhYmxlT3JOdWxsKGVudGl0eSlcbiAgICBpZiAoYXVkaW9Tb3VyY2UpIHtcbiAgICAgIGF1ZGlvU291cmNlLnBsYXlpbmcgPSBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIC8vIFNIT1dfVEVYVFxuICBmdW5jdGlvbiBoYW5kbGVTaG93VGV4dChcbiAgICBlbnRpdHk6IEVudGl0eSxcbiAgICBwYXlsb2FkOiBBY3Rpb25QYXlsb2FkPEFjdGlvblR5cGUuU0hPV19URVhUPixcbiAgKSB7XG4gICAgY29uc3QgeyB0ZXh0LCBoaWRlQWZ0ZXJTZWNvbmRzLCBmb250LCBmb250U2l6ZSwgdGV4dEFsaWduIH0gPSBwYXlsb2FkXG4gICAgY29uc3QgdWlUcmFuc2Zvcm1Db21wb25lbnQgPSBnZXRVSVRyYW5zZm9ybShlbnRpdHkpXG4gICAgaWYgKHVpVHJhbnNmb3JtQ29tcG9uZW50KSB7XG4gICAgICBVaVRleHQuY3JlYXRlT3JSZXBsYWNlKGVudGl0eSwge1xuICAgICAgICB2YWx1ZTogdGV4dCxcbiAgICAgICAgZm9udDogZm9udCBhcyB1bmtub3duIGFzIEZvbnQsXG4gICAgICAgIGZvbnRTaXplLFxuICAgICAgICB0ZXh0QWxpZ246IHRleHRBbGlnbiBhcyB1bmtub3duIGFzIFRleHRBbGlnbk1vZGUsXG4gICAgICB9KVxuICAgICAgc3RhcnRUaW1lb3V0KGVudGl0eSwgQWN0aW9uVHlwZS5ISURFX1RFWFQsIGhpZGVBZnRlclNlY29uZHMsICgpID0+XG4gICAgICAgIGhhbmRsZUhpZGVUZXh0KGVudGl0eSwge30pLFxuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIC8vIEhJREVfVEVYVFxuICBmdW5jdGlvbiBoYW5kbGVIaWRlVGV4dChcbiAgICBlbnRpdHk6IEVudGl0eSxcbiAgICBfcGF5bG9hZDogQWN0aW9uUGF5bG9hZDxBY3Rpb25UeXBlLkhJREVfVEVYVD4sXG4gICkge1xuICAgIGNvbnN0IHVpVGV4dENvbXBvbmVudCA9IFVpVGV4dC5nZXRPck51bGwoZW50aXR5KVxuICAgIGlmICh1aVRleHRDb21wb25lbnQpIHtcbiAgICAgIFVpVGV4dC5kZWxldGVGcm9tKGVudGl0eSlcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBmaW5kQWN0aW9uQnlOYW1lKGVudGl0eTogRW50aXR5LCBuYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBhY3Rpb25zID0gQWN0aW9ucy5nZXRPck51bGwoZW50aXR5KVxuICAgIHJldHVybiBhY3Rpb25zPy52YWx1ZS5maW5kKCgkKSA9PiAkLm5hbWUgPT09IG5hbWUpXG4gIH1cblxuICAvLyBTVEFSVF9ERUxBWVxuICBmdW5jdGlvbiBoYW5kbGVTdGFydERlbGF5KFxuICAgIGVudGl0eTogRW50aXR5LFxuICAgIHBheWxvYWQ6IEFjdGlvblBheWxvYWQ8QWN0aW9uVHlwZS5TVEFSVF9ERUxBWT4sXG4gICkge1xuICAgIGNvbnN0IHsgYWN0aW9ucywgdGltZW91dCB9ID0gcGF5bG9hZFxuICAgIGZvciAoY29uc3QgYWN0aW9uTmFtZSBvZiBhY3Rpb25zKSB7XG4gICAgICBjb25zdCBhY3Rpb24gPSBmaW5kQWN0aW9uQnlOYW1lKGVudGl0eSwgYWN0aW9uTmFtZSlcbiAgICAgIGlmIChhY3Rpb24pIHtcbiAgICAgICAgc3RhcnRUaW1lb3V0KGVudGl0eSwgYWN0aW9uTmFtZSwgdGltZW91dCwgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGFjdGlvbkV2ZW50cyA9IGdldEFjdGlvbkV2ZW50cyhlbnRpdHkpXG4gICAgICAgICAgYWN0aW9uRXZlbnRzLmVtaXQoYWN0aW9uLm5hbWUsIGdldFBheWxvYWQoYWN0aW9uKSlcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBTVE9QX0RFTEFZXG4gIGZ1bmN0aW9uIGhhbmRsZVN0b3BEZWxheShcbiAgICBlbnRpdHk6IEVudGl0eSxcbiAgICBwYXlsb2FkOiBBY3Rpb25QYXlsb2FkPEFjdGlvblR5cGUuU1RPUF9ERUxBWT4sXG4gICkge1xuICAgIGNvbnN0IHsgYWN0aW9uIH0gPSBwYXlsb2FkXG4gICAgc3RvcFRpbWVvdXQoZW50aXR5LCBhY3Rpb24pXG4gIH1cblxuICAvLyBTVEFSVF9MT09QXG4gIGZ1bmN0aW9uIGhhbmRsZVN0YXJ0TG9vcChcbiAgICBlbnRpdHk6IEVudGl0eSxcbiAgICBwYXlsb2FkOiBBY3Rpb25QYXlsb2FkPEFjdGlvblR5cGUuU1RBUlRfTE9PUD4sXG4gICkge1xuICAgIGNvbnN0IHsgYWN0aW9ucywgaW50ZXJ2YWwgfSA9IHBheWxvYWRcbiAgICBmb3IgKGNvbnN0IGFjdGlvbk5hbWUgb2YgYWN0aW9ucykge1xuICAgICAgY29uc3QgYWN0aW9uID0gZmluZEFjdGlvbkJ5TmFtZShlbnRpdHksIGFjdGlvbk5hbWUpXG4gICAgICBpZiAoYWN0aW9uKSB7XG4gICAgICAgIHN0YXJ0SW50ZXJ2YWwoZW50aXR5LCBhY3Rpb25OYW1lLCBpbnRlcnZhbCwgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGFjdGlvbkV2ZW50cyA9IGdldEFjdGlvbkV2ZW50cyhlbnRpdHkpXG4gICAgICAgICAgYWN0aW9uRXZlbnRzLmVtaXQoYWN0aW9uLm5hbWUsIGdldFBheWxvYWQoYWN0aW9uKSlcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBTVE9QX0xPT1BcbiAgZnVuY3Rpb24gaGFuZGxlU3RvcExvb3AoXG4gICAgZW50aXR5OiBFbnRpdHksXG4gICAgcGF5bG9hZDogQWN0aW9uUGF5bG9hZDxBY3Rpb25UeXBlLlNUT1BfTE9PUD4sXG4gICkge1xuICAgIGNvbnN0IHsgYWN0aW9uIH0gPSBwYXlsb2FkXG4gICAgc3RvcEludGVydmFsKGVudGl0eSwgYWN0aW9uKVxuICB9XG5cbiAgLy8gQ0xPTkVfRU5USVRZXG4gIGZ1bmN0aW9uIGhhbmRsZUNsb25lRW50aXR5KFxuICAgIGVudGl0eTogRW50aXR5LFxuICAgIHBheWxvYWQ6IEFjdGlvblBheWxvYWQ8QWN0aW9uVHlwZS5DTE9ORV9FTlRJVFk+LFxuICApIHtcbiAgICBjb25zdCB7IHBvc2l0aW9uIH0gPSBwYXlsb2FkXG5cbiAgICAvLyBjbG9uZSBlbnRpdHlcbiAgICBjb25zdCBjbG9uZWQgPSBjbG9uZShlbnRpdHksIGVuZ2luZSwgVHJpZ2dlcnMpXG5cbiAgICAvLyBpbml0aWFsaXplXG4gICAgaW5pdEFjdGlvbnMoY2xvbmVkKVxuICAgIGluaXRUcmlnZ2VycyhjbG9uZWQpXG5cbiAgICBjb25zdCB0cmFuc2Zvcm0gPSBUcmFuc2Zvcm0uZ2V0T3JDcmVhdGVNdXRhYmxlKGNsb25lZClcbiAgICB0cmFuc2Zvcm0ucG9zaXRpb24gPSBwb3NpdGlvblxuXG4gICAgY29uc3QgdHJpZ2dlckV2ZW50cyA9IGdldFRyaWdnZXJFdmVudHMoY2xvbmVkKVxuICAgIHRyaWdnZXJFdmVudHMuZW1pdChUcmlnZ2VyVHlwZS5PTl9DTE9ORSlcbiAgfVxuXG4gIC8vIFJFTU9WRV9FTlRJVFlcbiAgZnVuY3Rpb24gaGFuZGxlUmVtb3ZlRW50aXR5KFxuICAgIGVudGl0eTogRW50aXR5LFxuICAgIF9wYXlsb2FkOiBBY3Rpb25QYXlsb2FkPEFjdGlvblR5cGUuUkVNT1ZFX0VOVElUWT4sXG4gICkge1xuICAgIC8vIFJlbW92ZSBhbGwgdGltZXJzIGJlZm9yZSByZW1vdmUgdGhlIGVudGl0eVxuICAgIHN0b3BBbGxUaW1lb3V0cyhlbnRpdHkpXG4gICAgc3RvcEFsbEludGVydmFscyhlbnRpdHkpXG4gICAgZW5naW5lLnJlbW92ZUVudGl0eShlbnRpdHkpXG4gIH1cblxuICBmdW5jdGlvbiBnZXRVaVN0YWNrKGFsaWduOiBTY3JlZW5BbGlnbk1vZGUpIHtcbiAgICBjb25zdCBrZXkgPSBgJHthbGlnbi5hbGlnbkl0ZW1zfSwke2FsaWduLmp1c3RpZnlDb250ZW50fWBcblxuICAgIGlmICghdWlTdGFja3MuaGFzKGtleSkpIHtcbiAgICAgIHVpU3RhY2tzLnNldChrZXksIGVuZ2luZS5hZGRFbnRpdHkoKSlcbiAgICB9XG5cbiAgICByZXR1cm4gdWlTdGFja3MuZ2V0KGtleSkhXG4gIH1cblxuICAvLyBTSE9XX0lNQUdFXG4gIGZ1bmN0aW9uIGhhbmRsZVNob3dJbWFnZShcbiAgICBlbnRpdHk6IEVudGl0eSxcbiAgICBwYXlsb2FkOiBBY3Rpb25QYXlsb2FkPEFjdGlvblR5cGUuU0hPV19JTUFHRT4sXG4gICkge1xuICAgIGNvbnN0IHsgc3JjLCB0ZXh0LCBoaWRlQWZ0ZXJTZWNvbmRzLCBmb250U2l6ZSwgYWxpZ24sIGhlaWdodCwgd2lkdGggfSA9XG4gICAgICBwYXlsb2FkXG5cbiAgICAvLyBHZXQvQ3JlYXRlIGEgVUkgdHJhbnNmb3JtIGZvciB0aGUgcm9vdCBlbnRpdHlcbiAgICBnZXRVSVRyYW5zZm9ybShlbmdpbmUuUm9vdEVudGl0eSlcblxuICAgIC8vIEdldCBhIFVJIFN0YWNrIGVudGl0eVxuICAgIGNvbnN0IHNjcmVlbkFsaWduID0gbWFwQWxpZ25Ub1NjcmVlbkFsaWduKGFsaWduKVxuICAgIGNvbnN0IHVpU3RhY2sgPSBnZXRVaVN0YWNrKHNjcmVlbkFsaWduKVxuXG4gICAgLy8gVE9ETzogRml4IGl0ZW1zIHdyYXBwaW5nXG4gICAgLy8gR2V0L0NyZWF0ZSBhIFVJIFRyYW5zZm9ybSBmb3IgdGhlIFVJIHN0YWNrXG4gICAgY29uc3QgdWlTdGFja1RyYW5zZm9ybUNvbXBvbmVudCA9IGdldFVJVHJhbnNmb3JtKHVpU3RhY2spXG4gICAgdWlTdGFja1RyYW5zZm9ybUNvbXBvbmVudC5hbGlnbkl0ZW1zID0gc2NyZWVuQWxpZ24uYWxpZ25JdGVtc1xuICAgIHVpU3RhY2tUcmFuc2Zvcm1Db21wb25lbnQuanVzdGlmeUNvbnRlbnQgPSBzY3JlZW5BbGlnbi5qdXN0aWZ5Q29udGVudFxuICAgIHVpU3RhY2tUcmFuc2Zvcm1Db21wb25lbnQucG9zaXRpb25UeXBlID0gWUdQb3NpdGlvblR5cGUuWUdQVF9BQlNPTFVURVxuXG4gICAgLy8gQ3JlYXRlIGEgVUkgZW50aXR5IGFuZCBhIFRyYW5zZm9ybSBjb21wb25lbnQgZm9yIHRoZSBpbWFnZVxuICAgIGNvbnN0IGltYWdlRW50aXR5ID0gZW5naW5lLmFkZEVudGl0eSgpXG4gICAgY29uc3QgaW1hZ2VUcmFuc2Zvcm1Db21wb25lbnQgPSBnZXRVSVRyYW5zZm9ybShcbiAgICAgIGltYWdlRW50aXR5LFxuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQsXG4gICAgICBZR1VuaXQuWUdVX1BPSU5ULFxuICAgIClcbiAgICBpbWFnZVRyYW5zZm9ybUNvbXBvbmVudC5wYXJlbnQgPSB1aVN0YWNrXG4gICAgaW1hZ2VUcmFuc2Zvcm1Db21wb25lbnQucG9pbnRlckZpbHRlciA9IFBvaW50ZXJGaWx0ZXJNb2RlLlBGTV9CTE9DS1xuXG4gICAgLy8gQ3JlYXRlIEJhY2tncm91bmQgQ29tcG9uZW50XG4gICAgZ2V0VUlCYWNrZ3JvdW5kKGltYWdlRW50aXR5LCBzcmMpXG5cbiAgICBpZiAodGV4dCkge1xuICAgICAgLy8gQ3JlYXRlIFRleHQgQ29tcG9uZW50XG4gICAgICAvLyBUT0RPOiBGaXggdGV4dCB3cmFwcGluZyBhbmQgc2Nyb2xsaW5nXG4gICAgICBnZXRVSVRleHQoaW1hZ2VFbnRpdHksIHRleHQsIGZvbnRTaXplLCB3aWR0aClcbiAgICB9XG5cbiAgICBwb2ludGVyRXZlbnRzU3lzdGVtLm9uUG9pbnRlckRvd24oXG4gICAgICB7XG4gICAgICAgIGVudGl0eTogaW1hZ2VFbnRpdHksXG4gICAgICAgIG9wdHM6IHtcbiAgICAgICAgICBidXR0b246IElucHV0QWN0aW9uLklBX1BPSU5URVIsXG4gICAgICAgICAgaG92ZXJUZXh0OiAnQ2xpY2snLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgICgpID0+IHtcbiAgICAgICAgbGFzdFVpRW50aXR5Q2xpY2tlZC5zZXQoZW50aXR5LCBpbWFnZUVudGl0eSlcbiAgICAgICAgY29uc3QgdHJpZ2dlckV2ZW50cyA9IGdldFRyaWdnZXJFdmVudHMoZW50aXR5KVxuICAgICAgICB0cmlnZ2VyRXZlbnRzLmVtaXQoVHJpZ2dlclR5cGUuT05fQ0xJQ0tfSU1BR0UpXG4gICAgICB9LFxuICAgIClcblxuICAgIGlmIChoaWRlQWZ0ZXJTZWNvbmRzKSB7XG4gICAgICBzdGFydFRpbWVvdXQoZW50aXR5LCBBY3Rpb25UeXBlLkhJREVfSU1BR0UsIGhpZGVBZnRlclNlY29uZHMsICgpID0+XG4gICAgICAgIGhhbmRsZUhpZGVJbWFnZShlbnRpdHksIHsgaW1hZ2VFbnRpdHk6IGltYWdlRW50aXR5IH0pLFxuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIC8vIEhJREVfSU1BR0VcbiAgZnVuY3Rpb24gaGFuZGxlSGlkZUltYWdlKFxuICAgIGVudGl0eTogRW50aXR5LFxuICAgIHBheWxvYWQ6IEFjdGlvblBheWxvYWQ8QWN0aW9uVHlwZS5ISURFX0lNQUdFPixcbiAgKSB7XG4gICAgY29uc3QgeyBpbWFnZUVudGl0eSB9ID0gcGF5bG9hZFxuXG4gICAgaWYgKGltYWdlRW50aXR5KSB7XG4gICAgICBlbmdpbmUucmVtb3ZlRW50aXR5KGltYWdlRW50aXR5IGFzIEVudGl0eSlcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY2xpY2tlZEltYWdlID0gbGFzdFVpRW50aXR5Q2xpY2tlZC5nZXQoZW50aXR5KVxuICAgICAgaWYgKGNsaWNrZWRJbWFnZSkge1xuICAgICAgICBlbmdpbmUucmVtb3ZlRW50aXR5KGNsaWNrZWRJbWFnZSlcbiAgICAgICAgbGFzdFVpRW50aXR5Q2xpY2tlZC5kZWxldGUoZW50aXR5KVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwgImltcG9ydCB7IEVudGl0eSB9IGZyb20gJ0BkY2wvc2RrL2VjcydcbmltcG9ydCB7IGdldFRyaWdnZXJFdmVudHMgfSBmcm9tICcuL2V2ZW50cydcbmltcG9ydCB7IFRyaWdnZXJUeXBlIH0gZnJvbSAnLi9lbnVtcydcblxuaW50ZXJmYWNlIERlbGF5QWN0aW9uIHtcbiAgYWN0aW9uOiBzdHJpbmdcbiAgdGltZW91dDogbnVtYmVyXG4gIGNhbGxiYWNrOiBGdW5jdGlvblxufVxuXG5pbnRlcmZhY2UgSW50ZXJ2YWxBY3Rpb24ge1xuICBhY3Rpb246IHN0cmluZ1xuICB0aW1lb3V0OiBudW1iZXJcbiAgaW50ZXJ2YWw6IG51bWJlclxuICBjYWxsYmFjazogRnVuY3Rpb25cbn1cblxuY29uc3QgcXVldWVEZWxheSA9IG5ldyBNYXA8RW50aXR5LCBBcnJheTxEZWxheUFjdGlvbj4+KClcbmNvbnN0IHF1ZXVlSW50ZXJ2YWwgPSBuZXcgTWFwPEVudGl0eSwgQXJyYXk8SW50ZXJ2YWxBY3Rpb24+PigpXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVUaW1lclN5c3RlbSgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHRpbWVyU3lzdGVtKGR0OiBudW1iZXIpIHtcbiAgICBpbnRlcnZhbFN5c3RlbShkdClcbiAgICBkZWxheVN5c3RlbShkdClcbiAgfVxuXG4gIGZ1bmN0aW9uIGludGVydmFsU3lzdGVtKGR0OiBudW1iZXIpIHtcbiAgICBmb3IgKGNvbnN0IFtlbnRpdHksIGFjdGlvbnNdIG9mIHF1ZXVlSW50ZXJ2YWwuZW50cmllcygpKSB7XG4gICAgICBjb25zdCB0cmlnZ2VyRXZlbnRzID0gZ2V0VHJpZ2dlckV2ZW50cyhlbnRpdHkpXG5cbiAgICAgIGZvciAoY29uc3QgYWN0aW9uIG9mIGFjdGlvbnMpIHtcbiAgICAgICAgaWYgKGFjdGlvbi50aW1lb3V0ID09PSBhY3Rpb24uaW50ZXJ2YWwpIHtcbiAgICAgICAgICBhY3Rpb24uY2FsbGJhY2soKVxuICAgICAgICB9XG5cbiAgICAgICAgYWN0aW9uLnRpbWVvdXQgLT0gZHRcblxuICAgICAgICBpZiAoYWN0aW9uLnRpbWVvdXQgPD0gMCkge1xuICAgICAgICAgIGFjdGlvbi50aW1lb3V0ID0gYWN0aW9uLmludGVydmFsXG4gICAgICAgICAgdHJpZ2dlckV2ZW50cy5lbWl0KFRyaWdnZXJUeXBlLk9OX0xPT1ApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBkZWxheVN5c3RlbShkdDogbnVtYmVyKSB7XG4gICAgZm9yIChjb25zdCBbZW50aXR5LCBhY3Rpb25zXSBvZiBxdWV1ZURlbGF5LmVudHJpZXMoKSkge1xuICAgICAgY29uc3QgdHJpZ2dlckV2ZW50cyA9IGdldFRyaWdnZXJFdmVudHMoZW50aXR5KVxuICAgICAgY29uc3QgY29tcGxldGVkQWN0aW9ucyA9IFtdXG4gICAgICBsZXQgaWR4ID0gMFxuXG4gICAgICAvLyBJdGVyYXRlIGVudGl0eSBhY3Rpb25zIGFuZCB2ZXJpZnkgaXMgdGhlIHRpbWVvdXQgaXMgcmVhY2hlZCB0byBleGVjdXRlIHRoZSBjYWxsYmFja1xuICAgICAgZm9yIChjb25zdCBhY3Rpb24gb2YgYWN0aW9ucykge1xuICAgICAgICBhY3Rpb24udGltZW91dCAtPSBkdFxuXG4gICAgICAgIGlmIChhY3Rpb24udGltZW91dCA8PSAwKSB7XG4gICAgICAgICAgYWN0aW9uLmNhbGxiYWNrKClcbiAgICAgICAgICB0cmlnZ2VyRXZlbnRzLmVtaXQoVHJpZ2dlclR5cGUuT05fREVMQVkpXG4gICAgICAgICAgY29tcGxldGVkQWN0aW9ucy5wdXNoKGlkeClcbiAgICAgICAgfVxuICAgICAgICBpZHgrK1xuICAgICAgfVxuXG4gICAgICAvLyBSZW1vdmUgY29tcGxldGVkIGFjdGlvbnMgZnJvbSB0aGUgcXVldWVcbiAgICAgIGZvciAoY29uc3QgYWN0aW9uIG9mIGNvbXBsZXRlZEFjdGlvbnMpIHtcbiAgICAgICAgYWN0aW9ucy5zcGxpY2UoYWN0aW9uLCAxKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc3RhcnRUaW1lb3V0KFxuICBlbnRpdHk6IEVudGl0eSxcbiAgYWN0aW9uOiBzdHJpbmcsXG4gIHRpbWVvdXQ6IG51bWJlcixcbiAgY2FsbGJhY2s6ICgpID0+IHZvaWQsXG4pIHtcbiAgY29uc3QgYWN0aW9uQ2FsbGJhY2tzID0gcXVldWVEZWxheS5nZXQoZW50aXR5KSA/PyBbXVxuICBhY3Rpb25DYWxsYmFja3MucHVzaCh7IHRpbWVvdXQsIGFjdGlvbiwgY2FsbGJhY2sgfSlcbiAgcXVldWVEZWxheS5zZXQoZW50aXR5LCBhY3Rpb25DYWxsYmFja3MpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdG9wVGltZW91dChlbnRpdHk6IEVudGl0eSwgYWN0aW9uOiBzdHJpbmcpIHtcbiAgY29uc3QgZGVsYXlzID0gcXVldWVEZWxheS5nZXQoZW50aXR5KSA/PyBbXVxuICBxdWV1ZURlbGF5LnNldChcbiAgICBlbnRpdHksXG4gICAgZGVsYXlzLmZpbHRlcigoJCkgPT4gJC5hY3Rpb24gIT09IGFjdGlvbiksXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0b3BBbGxUaW1lb3V0cyhlbnRpdHk6IEVudGl0eSkge1xuICBxdWV1ZURlbGF5LmRlbGV0ZShlbnRpdHkpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdGFydEludGVydmFsKFxuICBlbnRpdHk6IEVudGl0eSxcbiAgYWN0aW9uOiBzdHJpbmcsXG4gIGludGVydmFsOiBudW1iZXIsXG4gIGNhbGxiYWNrOiAoKSA9PiB2b2lkLFxuKSB7XG4gIGNvbnN0IGFjdGlvbkNhbGxiYWNrcyA9IHF1ZXVlSW50ZXJ2YWwuZ2V0KGVudGl0eSkgPz8gW11cbiAgYWN0aW9uQ2FsbGJhY2tzLnB1c2goeyB0aW1lb3V0OiBpbnRlcnZhbCwgYWN0aW9uLCBjYWxsYmFjaywgaW50ZXJ2YWwgfSlcbiAgcXVldWVJbnRlcnZhbC5zZXQoZW50aXR5LCBhY3Rpb25DYWxsYmFja3MpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdG9wSW50ZXJ2YWwoZW50aXR5OiBFbnRpdHksIGFjdGlvbjogc3RyaW5nKSB7XG4gIGNvbnN0IGludGVydmFscyA9IHF1ZXVlSW50ZXJ2YWwuZ2V0KGVudGl0eSkgPz8gW11cbiAgcXVldWVJbnRlcnZhbC5zZXQoXG4gICAgZW50aXR5LFxuICAgIGludGVydmFscy5maWx0ZXIoKCQpID0+ICQuYWN0aW9uICE9PSBhY3Rpb24pLFxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdG9wQWxsSW50ZXJ2YWxzKGVudGl0eTogRW50aXR5KSB7XG4gIHF1ZXVlSW50ZXJ2YWwuZGVsZXRlKGVudGl0eSlcbn1cbiIsICJpbXBvcnQge1xuICBCYWNrZ3JvdW5kVGV4dHVyZU1vZGUsXG4gIEVudGl0eSxcbiAgVGV4dEFsaWduTW9kZSxcbiAgVGV4dHVyZVdyYXBNb2RlLFxuICBVaUJhY2tncm91bmQsXG4gIFVpVGV4dCxcbiAgVWlUcmFuc2Zvcm0sXG4gIFlHQWxpZ24sXG4gIFlHRmxleERpcmVjdGlvbixcbiAgWUdKdXN0aWZ5LFxuICBZR1Bvc2l0aW9uVHlwZSxcbiAgWUdVbml0LFxufSBmcm9tICdAZGNsL3Nkay9lY3MnXG5pbXBvcnQgeyBDb2xvcjQgfSBmcm9tICdAZGNsL3Nkay9tYXRoJ1xuaW1wb3J0IHsgQWxpZ25Nb2RlLCBGb250LCBTY3JlZW5BbGlnbk1vZGUgfSBmcm9tICcuL2VudW1zJ1xuXG5mdW5jdGlvbiBnZXRBbGlnbk1vZGUoYWxpZ246IEFsaWduTW9kZSwgaXNDb2x1bW46IGJvb2xlYW4pIHtcbiAgc3dpdGNoIChhbGlnbikge1xuICAgIGNhc2UgQWxpZ25Nb2RlLlRBTV9UT1BfTEVGVDoge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYWxpZ25JdGVtczogWUdBbGlnbi5ZR0FfRkxFWF9TVEFSVCxcbiAgICAgICAganVzdGlmeUNvbnRlbnQ6IFlHSnVzdGlmeS5ZR0pfRkxFWF9TVEFSVCxcbiAgICAgIH1cbiAgICB9XG4gICAgY2FzZSBBbGlnbk1vZGUuVEFNX1RPUF9DRU5URVI6IHtcbiAgICAgIHJldHVybiBpc0NvbHVtblxuICAgICAgICA/IHtcbiAgICAgICAgICAgIGFsaWduSXRlbXM6IFlHQWxpZ24uWUdBX0NFTlRFUixcbiAgICAgICAgICAgIGp1c3RpZnlDb250ZW50OiBZR0p1c3RpZnkuWUdKX0ZMRVhfU1RBUlQsXG4gICAgICAgICAgfVxuICAgICAgICA6IHtcbiAgICAgICAgICAgIGFsaWduSXRlbXM6IFlHQWxpZ24uWUdBX0ZMRVhfU1RBUlQsXG4gICAgICAgICAgICBqdXN0aWZ5Q29udGVudDogWUdKdXN0aWZ5LllHSl9DRU5URVIsXG4gICAgICAgICAgfVxuICAgIH1cbiAgICBjYXNlIEFsaWduTW9kZS5UQU1fVE9QX1JJR0hUOiB7XG4gICAgICByZXR1cm4gaXNDb2x1bW5cbiAgICAgICAgPyB7XG4gICAgICAgICAgICBhbGlnbkl0ZW1zOiBZR0FsaWduLllHQV9GTEVYX0VORCxcbiAgICAgICAgICAgIGp1c3RpZnlDb250ZW50OiBZR0p1c3RpZnkuWUdKX0ZMRVhfU1RBUlQsXG4gICAgICAgICAgfVxuICAgICAgICA6IHtcbiAgICAgICAgICAgIGFsaWduSXRlbXM6IFlHQWxpZ24uWUdBX0ZMRVhfU1RBUlQsXG4gICAgICAgICAgICBqdXN0aWZ5Q29udGVudDogWUdKdXN0aWZ5LllHSl9GTEVYX0VORCxcbiAgICAgICAgICB9XG4gICAgfVxuICAgIGNhc2UgQWxpZ25Nb2RlLlRBTV9NSURETEVfTEVGVDoge1xuICAgICAgcmV0dXJuIGlzQ29sdW1uXG4gICAgICAgID8ge1xuICAgICAgICAgICAgYWxpZ25JdGVtczogWUdBbGlnbi5ZR0FfRkxFWF9TVEFSVCxcbiAgICAgICAgICAgIGp1c3RpZnlDb250ZW50OiBZR0p1c3RpZnkuWUdKX0NFTlRFUixcbiAgICAgICAgICB9XG4gICAgICAgIDoge1xuICAgICAgICAgICAgYWxpZ25JdGVtczogWUdBbGlnbi5ZR0FfQ0VOVEVSLFxuICAgICAgICAgICAganVzdGlmeUNvbnRlbnQ6IFlHSnVzdGlmeS5ZR0pfRkxFWF9TVEFSVCxcbiAgICAgICAgICB9XG4gICAgfVxuICAgIGNhc2UgQWxpZ25Nb2RlLlRBTV9NSURETEVfQ0VOVEVSOiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhbGlnbkl0ZW1zOiBZR0FsaWduLllHQV9DRU5URVIsXG4gICAgICAgIGp1c3RpZnlDb250ZW50OiBZR0p1c3RpZnkuWUdKX0NFTlRFUixcbiAgICAgIH1cbiAgICB9XG4gICAgY2FzZSBBbGlnbk1vZGUuVEFNX01JRERMRV9SSUdIVDoge1xuICAgICAgcmV0dXJuIGlzQ29sdW1uXG4gICAgICAgID8ge1xuICAgICAgICAgICAgYWxpZ25JdGVtczogWUdBbGlnbi5ZR0FfRkxFWF9FTkQsXG4gICAgICAgICAgICBqdXN0aWZ5Q29udGVudDogWUdKdXN0aWZ5LllHSl9DRU5URVIsXG4gICAgICAgICAgfVxuICAgICAgICA6IHtcbiAgICAgICAgICAgIGFsaWduSXRlbXM6IFlHQWxpZ24uWUdBX0NFTlRFUixcbiAgICAgICAgICAgIGp1c3RpZnlDb250ZW50OiBZR0p1c3RpZnkuWUdKX0ZMRVhfRU5ELFxuICAgICAgICAgIH1cbiAgICB9XG4gICAgY2FzZSBBbGlnbk1vZGUuVEFNX0JPVFRPTV9MRUZUOiB7XG4gICAgICByZXR1cm4gaXNDb2x1bW5cbiAgICAgICAgPyB7XG4gICAgICAgICAgICBhbGlnbkl0ZW1zOiBZR0FsaWduLllHQV9GTEVYX1NUQVJULFxuICAgICAgICAgICAganVzdGlmeUNvbnRlbnQ6IFlHSnVzdGlmeS5ZR0pfRkxFWF9FTkQsXG4gICAgICAgICAgfVxuICAgICAgICA6IHtcbiAgICAgICAgICAgIGFsaWduSXRlbXM6IFlHSnVzdGlmeS5ZR0pfRkxFWF9FTkQsXG4gICAgICAgICAgICBqdXN0aWZ5Q29udGVudDogWUdBbGlnbi5ZR0FfRkxFWF9TVEFSVCxcbiAgICAgICAgICB9XG4gICAgfVxuICAgIGNhc2UgQWxpZ25Nb2RlLlRBTV9CT1RUT01fQ0VOVEVSOiB7XG4gICAgICByZXR1cm4gaXNDb2x1bW5cbiAgICAgICAgPyB7XG4gICAgICAgICAgICBhbGlnbkl0ZW1zOiBZR0FsaWduLllHQV9DRU5URVIsXG4gICAgICAgICAgICBqdXN0aWZ5Q29udGVudDogWUdKdXN0aWZ5LllHSl9GTEVYX0VORCxcbiAgICAgICAgICB9XG4gICAgICAgIDoge1xuICAgICAgICAgICAgYWxpZ25JdGVtczogWUdBbGlnbi5ZR0FfRkxFWF9FTkQsXG4gICAgICAgICAgICBqdXN0aWZ5Q29udGVudDogWUdKdXN0aWZ5LllHSl9DRU5URVIsXG4gICAgICAgICAgfVxuICAgIH1cbiAgICBjYXNlIEFsaWduTW9kZS5UQU1fQk9UVE9NX1JJR0hUOiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhbGlnbkl0ZW1zOiBZR0FsaWduLllHQV9GTEVYX0VORCxcbiAgICAgICAganVzdGlmeUNvbnRlbnQ6IFlHSnVzdGlmeS5ZR0pfRkxFWF9FTkQsXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXBBbGlnblRvU2NyZWVuQWxpZ24oXG4gIGFsaWduOiBBbGlnbk1vZGUsXG4gIGZsZXhEaXJlY3Rpb24gPSBZR0ZsZXhEaXJlY3Rpb24uWUdGRF9ST1csXG4pOiBTY3JlZW5BbGlnbk1vZGUge1xuICBjb25zdCBpc0NvbHVtbiA9IGZsZXhEaXJlY3Rpb24gPT09IFlHRmxleERpcmVjdGlvbi5ZR0ZEX0NPTFVNTlxuXG4gIHN3aXRjaCAoYWxpZ24pIHtcbiAgICBjYXNlIEFsaWduTW9kZS5UQU1fVE9QX0xFRlQ6XG4gICAgICByZXR1cm4gZ2V0QWxpZ25Nb2RlKGFsaWduLCBpc0NvbHVtbikgYXMgYW55XG4gICAgY2FzZSBBbGlnbk1vZGUuVEFNX1RPUF9DRU5URVI6XG4gICAgICByZXR1cm4gZ2V0QWxpZ25Nb2RlKGFsaWduLCBpc0NvbHVtbikgYXMgYW55XG4gICAgY2FzZSBBbGlnbk1vZGUuVEFNX1RPUF9SSUdIVDpcbiAgICAgIHJldHVybiBnZXRBbGlnbk1vZGUoYWxpZ24sIGlzQ29sdW1uKSBhcyBhbnlcbiAgICBjYXNlIEFsaWduTW9kZS5UQU1fTUlERExFX0xFRlQ6XG4gICAgICByZXR1cm4gZ2V0QWxpZ25Nb2RlKGFsaWduLCBpc0NvbHVtbikgYXMgYW55XG4gICAgY2FzZSBBbGlnbk1vZGUuVEFNX01JRERMRV9DRU5URVI6XG4gICAgICByZXR1cm4gZ2V0QWxpZ25Nb2RlKGFsaWduLCBpc0NvbHVtbikgYXMgYW55XG4gICAgY2FzZSBBbGlnbk1vZGUuVEFNX01JRERMRV9SSUdIVDpcbiAgICAgIHJldHVybiBnZXRBbGlnbk1vZGUoYWxpZ24sIGlzQ29sdW1uKSBhcyBhbnlcbiAgICBjYXNlIEFsaWduTW9kZS5UQU1fQk9UVE9NX0xFRlQ6XG4gICAgICByZXR1cm4gZ2V0QWxpZ25Nb2RlKGFsaWduLCBpc0NvbHVtbikgYXMgYW55XG4gICAgY2FzZSBBbGlnbk1vZGUuVEFNX0JPVFRPTV9DRU5URVI6XG4gICAgICByZXR1cm4gZ2V0QWxpZ25Nb2RlKGFsaWduLCBpc0NvbHVtbikgYXMgYW55XG4gICAgY2FzZSBBbGlnbk1vZGUuVEFNX0JPVFRPTV9SSUdIVDpcbiAgICAgIHJldHVybiBnZXRBbGlnbk1vZGUoYWxpZ24sIGlzQ29sdW1uKSBhcyBhbnlcbiAgICBkZWZhdWx0OlxuICAgICAgLy8gSGFuZGxlIGRlZmF1bHQgY2FzZSBvciB0aHJvdyBhbiBlcnJvciBpZiBuZWVkZWRcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgQWxpZ25Nb2RlOiAke2FsaWdufWApXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFVJVHJhbnNmb3JtKFxuICBlbnRpeTogRW50aXR5LFxuICBoZWlnaHQgPSAxMDAsXG4gIHdpZHRoID0gMTAwLFxuICB1bml0OiBZR1VuaXQgPSBZR1VuaXQuWUdVX1BFUkNFTlQsXG4pIHtcbiAgbGV0IHVpVHJhbnNmb3JtQ29tcG9uZW50ID0gVWlUcmFuc2Zvcm0uZ2V0TXV0YWJsZU9yTnVsbChlbnRpeSlcblxuICBpZiAoIXVpVHJhbnNmb3JtQ29tcG9uZW50KSB7XG4gICAgdWlUcmFuc2Zvcm1Db21wb25lbnQgPSBVaVRyYW5zZm9ybS5jcmVhdGUoZW50aXkpXG4gICAgdWlUcmFuc2Zvcm1Db21wb25lbnQuaGVpZ2h0VW5pdCA9IHVuaXRcbiAgICB1aVRyYW5zZm9ybUNvbXBvbmVudC53aWR0aFVuaXQgPSB1bml0XG4gICAgdWlUcmFuc2Zvcm1Db21wb25lbnQuaGVpZ2h0ID0gaGVpZ2h0XG4gICAgdWlUcmFuc2Zvcm1Db21wb25lbnQud2lkdGggPSB3aWR0aFxuICAgIHVpVHJhbnNmb3JtQ29tcG9uZW50Lm1heEhlaWdodFVuaXQgPSB1bml0XG4gICAgdWlUcmFuc2Zvcm1Db21wb25lbnQubWF4V2lkdGhVbml0ID0gdW5pdFxuICAgIHVpVHJhbnNmb3JtQ29tcG9uZW50Lm1heEhlaWdodCA9IGhlaWdodFxuICAgIHVpVHJhbnNmb3JtQ29tcG9uZW50Lm1heFdpZHRoID0gd2lkdGhcbiAgfVxuXG4gIGlmIChlbnRpeSA9PT0gMCkge1xuICAgIHVpVHJhbnNmb3JtQ29tcG9uZW50LnBvc2l0aW9uVHlwZSA9IFlHUG9zaXRpb25UeXBlLllHUFRfQUJTT0xVVEVcbiAgfVxuXG4gIHJldHVybiB1aVRyYW5zZm9ybUNvbXBvbmVudFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VUlCYWNrZ3JvdW5kKFxuICBlbnRpdHk6IEVudGl0eSxcbiAgc3JjOiBzdHJpbmcsXG4gIHRleHR1cmVNb2RlID0gQmFja2dyb3VuZFRleHR1cmVNb2RlLk5JTkVfU0xJQ0VTLFxuICB3cmFwTW9kZSA9IFRleHR1cmVXcmFwTW9kZS5UV01fQ0xBTVAsXG4pIHtcbiAgcmV0dXJuIFVpQmFja2dyb3VuZC5jcmVhdGVPclJlcGxhY2UoZW50aXR5LCB7XG4gICAgdGV4dHVyZU1vZGUsXG4gICAgdGV4dHVyZToge1xuICAgICAgdGV4OiB7XG4gICAgICAgICRjYXNlOiAndGV4dHVyZScsXG4gICAgICAgIHRleHR1cmU6IHtcbiAgICAgICAgICBzcmMsXG4gICAgICAgICAgd3JhcE1vZGUsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgdXZzOiBbXSxcbiAgfSlcbn1cblxuZnVuY3Rpb24gYnJlYWtMaW5lcyh0ZXh0OiBzdHJpbmcsIGxpbmVsZW5ndGg6IG51bWJlcikge1xuICBjb25zdCBsaW5lQnJlYWsgPSAnXFxuJ1xuICBsZXQgY291bnRlciA9IDBcbiAgbGV0IGxpbmUgPSAnJ1xuICBsZXQgcmV0dXJuVGV4dCA9ICcnXG4gIGxldCBiTWF0Y2hGb3VuZCA9IGZhbHNlXG4gIGNvbnN0IGxpbmVMZW4gPSBsaW5lbGVuZ3RoID8gbGluZWxlbmd0aCA6IDUwXG5cbiAgaWYgKCF0ZXh0KSByZXR1cm4gJydcbiAgaWYgKHRleHQubGVuZ3RoIDwgbGluZUxlbiArIDEpIHtcbiAgICByZXR1cm4gdGV4dFxuICB9XG5cbiAgd2hpbGUgKGNvdW50ZXIgPCB0ZXh0Lmxlbmd0aCkge1xuICAgIGxpbmUgPSB0ZXh0LnN1YnN0cmluZyhjb3VudGVyLCBjb3VudGVyICsgbGluZUxlbilcbiAgICBiTWF0Y2hGb3VuZCA9IGZhbHNlXG4gICAgaWYgKGxpbmUubGVuZ3RoID09IGxpbmVMZW4pIHtcbiAgICAgIGZvciAobGV0IGkgPSBsaW5lLmxlbmd0aDsgaSA+IC0xOyBpLS0pIHtcbiAgICAgICAgaWYgKGxpbmUuc3Vic3RyaW5nKGksIGkgKyAxKSA9PSAnICcpIHtcbiAgICAgICAgICBjb3VudGVyICs9IGxpbmUuc3Vic3RyaW5nKDAsIGkpLmxlbmd0aFxuICAgICAgICAgIGxpbmUgPSBsaW5lLnN1YnN0cmluZygwLCBpKSArIGxpbmVCcmVha1xuICAgICAgICAgIHJldHVyblRleHQgKz0gbGluZVxuICAgICAgICAgIGJNYXRjaEZvdW5kID0gdHJ1ZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFiTWF0Y2hGb3VuZCkge1xuICAgICAgICBjb3VudGVyICs9IGxpbmUubGVuZ3RoXG4gICAgICAgIGxpbmUgPSBsaW5lICsgbGluZUJyZWFrXG4gICAgICAgIHJldHVyblRleHQgKz0gbGluZVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm5UZXh0ICs9IGxpbmVcbiAgICAgIGJyZWFrIC8vIFdlJ3JlIGJyZWFraW5nIG91dCBvZiB0aGUgdGhlIHdoaWxlKCksIG5vdCB0aGUgZm9yKClcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmV0dXJuVGV4dFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VUlUZXh0KFxuICBlbnRpdHk6IEVudGl0eSxcbiAgdGV4dDogc3RyaW5nLFxuICBmb250U2l6ZSA9IDEwLFxuICBjb250YWluZXJXaWR0aDogbnVtYmVyLFxuICBhbGlnbjogQWxpZ25Nb2RlID0gQWxpZ25Nb2RlLlRBTV9NSURETEVfQ0VOVEVSLFxuICBjb2xvcjogQ29sb3I0ID0gQ29sb3I0LkJsYWNrKCksXG4pIHtcbiAgY29uc3QgbGluZUxlbmd0aCA9IE1hdGguZmxvb3IoY29udGFpbmVyV2lkdGggLyAoZm9udFNpemUgLyAxLjcpKVxuXG4gIHJldHVybiBVaVRleHQuY3JlYXRlT3JSZXBsYWNlKGVudGl0eSwge1xuICAgIHZhbHVlOiBicmVha0xpbmVzKHRleHQsIGxpbmVMZW5ndGgpLFxuICAgIGZvbnRTaXplLFxuICAgIGZvbnQ6IEZvbnQuRl9NT05PU1BBQ0UgYXMgYW55LFxuICAgIHRleHRBbGlnbjogYWxpZ24gYXMgdW5rbm93biBhcyBUZXh0QWxpZ25Nb2RlLFxuICAgIGNvbG9yLFxuICB9KVxufVxuIiwgImltcG9ydCB7XG4gIElFbmdpbmUsXG4gIEVudGl0eSxcbiAgUG9pbnRlckV2ZW50c1N5c3RlbSxcbiAgSW5wdXRBY3Rpb24sXG4gIExhc3RXcml0ZVdpbkVsZW1lbnRTZXRDb21wb25lbnREZWZpbml0aW9uLFxuICBEZWVwUmVhZG9ubHlPYmplY3QsXG4gIFRyYW5zZm9ybSxcbn0gZnJvbSAnQGRjbC9zZGsvZWNzJ1xuaW1wb3J0IHsgdHJpZ2dlcnMsIExBWUVSXzEsIE5PX0xBWUVSUyB9IGZyb20gJ0BkY2wtc2RrL3V0aWxzJ1xuaW1wb3J0IHtcbiAgQWN0aW9uLFxuICBDb21wb25lbnROYW1lLFxuICBUcmlnZ2VyLFxuICBUcmlnZ2VyQWN0aW9uLFxuICBUcmlnZ2VyQ29uZGl0aW9uLFxuICBUcmlnZ2VyQ29uZGl0aW9uT3BlcmF0aW9uLFxuICBUcmlnZ2VyQ29uZGl0aW9uVHlwZSxcbiAgVHJpZ2dlclR5cGUsXG4gIGdldENvbmRpdGlvblR5cGVzQnlDb21wb25lbnROYW1lLFxuICBnZXRDb21wb25lbnRzLFxufSBmcm9tICcuL2RlZmluaXRpb25zJ1xuaW1wb3J0IHsgZ2V0Q3VycmVudFZhbHVlIH0gZnJvbSAnLi9zdGF0ZXMnXG5pbXBvcnQgeyBnZXRBY3Rpb25FdmVudHMsIGdldFRyaWdnZXJFdmVudHMgfSBmcm9tICcuL2V2ZW50cydcbmltcG9ydCB7IGdldFBheWxvYWQgfSBmcm9tICcuL2FjdGlvbi10eXBlcydcblxuY29uc3QgaW5pdGVkRW50aXRpZXMgPSBuZXcgU2V0PEVudGl0eT4oKVxuY29uc3QgYWN0aW9uUXVldWU6IHsgZW50aXR5OiBFbnRpdHk7IGFjdGlvbjogQWN0aW9uIH1bXSA9IFtdXG5cbmxldCBpbnRlcm5hbEluaXRUcmlnZ2VyczogKChlbnRpdHk6IEVudGl0eSkgPT4gdm9pZCkgfCBudWxsID0gbnVsbFxuXG5leHBvcnQgZnVuY3Rpb24gaW5pdFRyaWdnZXJzKGVudGl0eTogRW50aXR5KSB7XG4gIGlmIChpbnRlcm5hbEluaXRUcmlnZ2Vycykge1xuICAgIHJldHVybiBpbnRlcm5hbEluaXRUcmlnZ2VycyhlbnRpdHkpXG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBDYW5ub3QgY2FsbCBpbml0VHJpZ2dlcnMgd2hpbGUgdHJpZ2dlcnNTeXN0ZW0gaGFzIG5vdCBiZWVuIGNyZWF0ZWRgLFxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVUcmlnZ2Vyc1N5c3RlbShcbiAgZW5naW5lOiBJRW5naW5lLFxuICBwb2ludGVyRXZlbnRzU3lzdGVtOiBQb2ludGVyRXZlbnRzU3lzdGVtLFxuKSB7XG4gIGNvbnN0IHsgQWN0aW9ucywgU3RhdGVzLCBDb3VudGVyLCBUcmlnZ2VycyB9ID0gZ2V0Q29tcG9uZW50cyhlbmdpbmUpXG5cbiAgLy8gc2F2ZSByZWZlcmVuY2UgdG8gdGhlIGluaXQgZnVuY3Rpb25cbiAgaW50ZXJuYWxJbml0VHJpZ2dlcnMgPSBpbml0RW50aXR5VHJpZ2dlcnNcblxuICByZXR1cm4gZnVuY3Rpb24gdHJpZ2dlcnNTeXN0ZW0oX2R0OiBudW1iZXIpIHtcbiAgICAvLyBwcm9jZXNzIGFjdGlvbiBxdWV1ZVxuICAgIHdoaWxlIChhY3Rpb25RdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCB7IGVudGl0eSwgYWN0aW9uIH0gPSBhY3Rpb25RdWV1ZS5zaGlmdCgpIVxuICAgICAgY29uc3QgYWN0aW9uRXZlbnRzID0gZ2V0QWN0aW9uRXZlbnRzKGVudGl0eSlcbiAgICAgIGFjdGlvbkV2ZW50cy5lbWl0KGFjdGlvbi5uYW1lLCBnZXRQYXlsb2FkKGFjdGlvbikpXG4gICAgfVxuXG4gICAgY29uc3QgZW50aXRpZXNXaXRoVHJpZ2dlcnMgPSBlbmdpbmUuZ2V0RW50aXRpZXNXaXRoKFRyaWdnZXJzKVxuICAgIGZvciAoY29uc3QgW2VudGl0eV0gb2YgZW50aXRpZXNXaXRoVHJpZ2dlcnMpIHtcbiAgICAgIGluaXRFbnRpdHlUcmlnZ2VycyhlbnRpdHkpXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaW5pdEVudGl0eVRyaWdnZXJzKGVudGl0eTogRW50aXR5KSB7XG4gICAgaWYgKCFUcmlnZ2Vycy5oYXMoZW50aXR5KSB8fCBpbml0ZWRFbnRpdGllcy5oYXMoZW50aXR5KSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gZ2V0IHRyaWdnZXJzIGRhdGFcbiAgICBjb25zdCB0cmlnZ2VycyA9IFRyaWdnZXJzLmdldChlbnRpdHkpXG5cbiAgICAvLyBpbml0aWFsaXplIHRyaWdnZXJzIGZvciBnaXZlbiBlbnRpdHlcbiAgICBjb25zdCB0eXBlcyA9IHRyaWdnZXJzLnZhbHVlLnJlZHVjZShcbiAgICAgICh0eXBlcywgdHJpZ2dlcikgPT4gdHlwZXMuYWRkKHRyaWdnZXIudHlwZSksXG4gICAgICBuZXcgU2V0PFRyaWdnZXJUeXBlPigpLFxuICAgIClcbiAgICBmb3IgKGNvbnN0IHR5cGUgb2YgdHlwZXMpIHtcbiAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlIFRyaWdnZXJUeXBlLk9OX0NMSUNLOiB7XG4gICAgICAgICAgaW5pdE9uQ2xpY2tUcmlnZ2VyKGVudGl0eSlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgVHJpZ2dlclR5cGUuT05fUExBWUVSX0VOVEVSU19BUkVBOlxuICAgICAgICBjYXNlIFRyaWdnZXJUeXBlLk9OX1BMQVlFUl9MRUFWRVNfQVJFQToge1xuICAgICAgICAgIGluaXRPblBsYXllclRyaWdnZXJBcmVhKGVudGl0eSlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gYmluZCB0cmlnZ2Vyc1xuICAgIGNvbnN0IHRyaWdnZXJFdmVudHMgPSBnZXRUcmlnZ2VyRXZlbnRzKGVudGl0eSlcbiAgICBmb3IgKGNvbnN0IHRyaWdnZXIgb2YgdHJpZ2dlcnMudmFsdWUpIHtcbiAgICAgIHRyaWdnZXJFdmVudHMub24odHJpZ2dlci50eXBlLCAoKSA9PiB7XG4gICAgICAgIGlmIChjaGVja0NvbmRpdGlvbnModHJpZ2dlcikpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IHRyaWdnZXJBY3Rpb24gb2YgdHJpZ2dlci5hY3Rpb25zKSB7XG4gICAgICAgICAgICBpZiAoaXNWYWxpZEFjdGlvbih0cmlnZ2VyQWN0aW9uKSkge1xuICAgICAgICAgICAgICBjb25zdCBlbnRpdHkgPSBnZXRFbnRpdHlCeUFjdGlvbih0cmlnZ2VyQWN0aW9uKVxuICAgICAgICAgICAgICBpZiAoZW50aXR5KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYWN0aW9ucyA9IEFjdGlvbnMuZ2V0T3JOdWxsKGVudGl0eSlcbiAgICAgICAgICAgICAgICBpZiAoYWN0aW9ucykge1xuICAgICAgICAgICAgICAgICAgY29uc3QgYWN0aW9uID0gYWN0aW9ucy52YWx1ZS5maW5kKFxuICAgICAgICAgICAgICAgICAgICAoJCkgPT4gJC5uYW1lID09PSB0cmlnZ2VyQWN0aW9uLm5hbWUsXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGFjdGlvbnMgYXJlIGVucXVldWVkIHRvIGJlIGV4ZWN1dGVkIG9uIHRoZSBuZXh0IHRpY2sgYWZ0ZXIgYWxsIHRoZSB0cmlnZ2VycyBoYXZlIGJlZW4gcHJvY2Vzc2VkLFxuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIHRvIGF2b2lkIG9uZSB0cmlnZ2VyIG1lc3Npbmcgd2l0aCBvdGhlciB0cmlnZ2VyJ3MgY29uZGl0aW9uc1xuICAgICAgICAgICAgICAgICAgICBhY3Rpb25RdWV1ZS5wdXNoKHsgZW50aXR5LCBhY3Rpb24gfSlcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICAgIHRyaWdnZXJFdmVudHMuZW1pdChUcmlnZ2VyVHlwZS5PTl9TUEFXTilcblxuICAgIGluaXRlZEVudGl0aWVzLmFkZChlbnRpdHkpXG4gIH1cblxuICBmdW5jdGlvbiBpc1ZhbGlkQWN0aW9uKGFjdGlvbjogVHJpZ2dlckFjdGlvbikge1xuICAgIGNvbnN0IHsgaWQsIG5hbWUgfSA9IGFjdGlvblxuICAgIHJldHVybiAhIWlkICYmICEhbmFtZVxuICB9XG5cbiAgZnVuY3Rpb24gY2hlY2tDb25kaXRpb25zKHRyaWdnZXI6IERlZXBSZWFkb25seU9iamVjdDxUcmlnZ2VyPikge1xuICAgIGlmICh0cmlnZ2VyLmNvbmRpdGlvbnMgJiYgdHJpZ2dlci5jb25kaXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGNvbmRpdGlvbnMgPSB0cmlnZ2VyLmNvbmRpdGlvbnMubWFwKGNoZWNrQ29uZGl0aW9uKVxuICAgICAgY29uc3QgaXNUcnVlID0gKHJlc3VsdD86IGJvb2xlYW4pID0+ICEhcmVzdWx0XG4gICAgICBjb25zdCBvcGVyYXRpb24gPSB0cmlnZ2VyLm9wZXJhdGlvbiB8fCBUcmlnZ2VyQ29uZGl0aW9uT3BlcmF0aW9uLkFORFxuICAgICAgc3dpdGNoIChvcGVyYXRpb24pIHtcbiAgICAgICAgY2FzZSBUcmlnZ2VyQ29uZGl0aW9uT3BlcmF0aW9uLkFORDoge1xuICAgICAgICAgIHJldHVybiBjb25kaXRpb25zLmV2ZXJ5KGlzVHJ1ZSlcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFRyaWdnZXJDb25kaXRpb25PcGVyYXRpb24uT1I6IHtcbiAgICAgICAgICByZXR1cm4gY29uZGl0aW9ucy5zb21lKGlzVHJ1ZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBpZiB0aGVyZSBhcmUgbm8gY29uZGl0aW9ucywgdGhlIHRyaWdnZXIgY2FuIGNvbnRpbnVlXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGZ1bmN0aW9uIGNoZWNrQ29uZGl0aW9uKGNvbmRpdGlvbjogVHJpZ2dlckNvbmRpdGlvbikge1xuICAgIGNvbnN0IGVudGl0eSA9IGdldEVudGl0eUJ5Q29uZGl0aW9uKGNvbmRpdGlvbilcbiAgICBpZiAoZW50aXR5KSB7XG4gICAgICB0cnkge1xuICAgICAgICBzd2l0Y2ggKGNvbmRpdGlvbi50eXBlKSB7XG4gICAgICAgICAgY2FzZSBUcmlnZ2VyQ29uZGl0aW9uVHlwZS5XSEVOX1NUQVRFX0lTOiB7XG4gICAgICAgICAgICBjb25zdCBzdGF0ZXMgPSBTdGF0ZXMuZ2V0T3JOdWxsKGVudGl0eSlcbiAgICAgICAgICAgIGlmIChzdGF0ZXMgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gZ2V0Q3VycmVudFZhbHVlKHN0YXRlcylcbiAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRWYWx1ZSA9PT0gY29uZGl0aW9uLnZhbHVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIFRyaWdnZXJDb25kaXRpb25UeXBlLldIRU5fU1RBVEVfSVNfTk9UOiB7XG4gICAgICAgICAgICBjb25zdCBzdGF0ZXMgPSBTdGF0ZXMuZ2V0T3JOdWxsKGVudGl0eSlcbiAgICAgICAgICAgIGlmIChzdGF0ZXMgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gZ2V0Q3VycmVudFZhbHVlKHN0YXRlcylcbiAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRWYWx1ZSAhPT0gY29uZGl0aW9uLnZhbHVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIFRyaWdnZXJDb25kaXRpb25UeXBlLldIRU5fQ09VTlRFUl9FUVVBTFM6IHtcbiAgICAgICAgICAgIGNvbnN0IGNvdW50ZXIgPSBDb3VudGVyLmdldE9yTnVsbChlbnRpdHkpXG4gICAgICAgICAgICBpZiAoY291bnRlciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICBjb25zdCBudW1lcmljID0gTnVtYmVyKGNvbmRpdGlvbi52YWx1ZSlcbiAgICAgICAgICAgICAgaWYgKCFpc05hTihudW1lcmljKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb3VudGVyLnZhbHVlID09PSBudW1lcmljXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgVHJpZ2dlckNvbmRpdGlvblR5cGUuV0hFTl9DT1VOVEVSX0lTX0dSRUFURVJfVEhBTjoge1xuICAgICAgICAgICAgY29uc3QgY291bnRlciA9IENvdW50ZXIuZ2V0T3JOdWxsKGVudGl0eSlcbiAgICAgICAgICAgIGlmIChjb3VudGVyICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIGNvbnN0IG51bWVyaWMgPSBOdW1iZXIoY29uZGl0aW9uLnZhbHVlKVxuICAgICAgICAgICAgICBpZiAoIWlzTmFOKG51bWVyaWMpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvdW50ZXIudmFsdWUgPiBudW1lcmljXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgVHJpZ2dlckNvbmRpdGlvblR5cGUuV0hFTl9DT1VOVEVSX0lTX0xFU1NfVEhBTjoge1xuICAgICAgICAgICAgY29uc3QgY291bnRlciA9IENvdW50ZXIuZ2V0T3JOdWxsKGVudGl0eSlcbiAgICAgICAgICAgIGlmIChjb3VudGVyICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIGNvbnN0IG51bWVyaWMgPSBOdW1iZXIoY29uZGl0aW9uLnZhbHVlKVxuICAgICAgICAgICAgICBpZiAoIWlzTmFOKG51bWVyaWMpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvdW50ZXIudmFsdWUgPCBudW1lcmljXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBpbiBjb25kaXRpb24nLCBjb25kaXRpb24pXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgZnVuY3Rpb24gZ2V0RW50aXR5QnlJZDxUIGV4dGVuZHMgeyBpZDogbnVtYmVyIH0+KFxuICAgIGNvbXBvbmVudE5hbWU6IHN0cmluZyxcbiAgICBpZDogbnVtYmVyLFxuICApIHtcbiAgICBjb25zdCBDb21wb25lbnQgPSBlbmdpbmUuZ2V0Q29tcG9uZW50KFxuICAgICAgY29tcG9uZW50TmFtZSxcbiAgICApIGFzIExhc3RXcml0ZVdpbkVsZW1lbnRTZXRDb21wb25lbnREZWZpbml0aW9uPFQ+XG4gICAgY29uc3QgZW50aXRpZXMgPSBBcnJheS5mcm9tKGVuZ2luZS5nZXRFbnRpdGllc1dpdGgoQ29tcG9uZW50KSlcbiAgICBjb25zdCByZXN1bHQgPSBlbnRpdGllcy5maW5kKChbX2VudGl0eSwgdmFsdWVdKSA9PiB2YWx1ZS5pZCA9PT0gaWQpXG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkocmVzdWx0KSAmJiByZXN1bHQubGVuZ3RoID4gMCA/IHJlc3VsdFswXSA6IG51bGxcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEVudGl0eUJ5QWN0aW9uKGFjdGlvbjogVHJpZ2dlckFjdGlvbikge1xuICAgIGlmIChhY3Rpb24uaWQpIHtcbiAgICAgIGNvbnN0IGVudGl0eSA9IGdldEVudGl0eUJ5SWQoQ29tcG9uZW50TmFtZS5BQ1RJT05TLCBhY3Rpb24uaWQpXG4gICAgICBpZiAoZW50aXR5KSB7XG4gICAgICAgIHJldHVybiBlbnRpdHlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEVudGl0eUJ5Q29uZGl0aW9uKGNvbmRpdGlvbjogVHJpZ2dlckNvbmRpdGlvbikge1xuICAgIGNvbnN0IGNvbXBvbmVudE5hbWUgPSBPYmplY3QudmFsdWVzKENvbXBvbmVudE5hbWUpXG4gICAgICAubWFwKChjb21wb25lbnROYW1lKSA9PiAoe1xuICAgICAgICBjb21wb25lbnROYW1lLFxuICAgICAgICBjb25kaXRpb25UeXBlczogZ2V0Q29uZGl0aW9uVHlwZXNCeUNvbXBvbmVudE5hbWUoY29tcG9uZW50TmFtZSksXG4gICAgICB9KSlcbiAgICAgIC5yZWR1Y2U8Q29tcG9uZW50TmFtZSB8IG51bGw+KFxuICAgICAgICAocmVzdWx0LCB7IGNvbXBvbmVudE5hbWUsIGNvbmRpdGlvblR5cGVzIH0pID0+XG4gICAgICAgICAgY29uZGl0aW9uVHlwZXMuaW5jbHVkZXMoY29uZGl0aW9uLnR5cGUpID8gY29tcG9uZW50TmFtZSA6IHJlc3VsdCxcbiAgICAgICAgbnVsbCxcbiAgICAgIClcbiAgICBpZiAoY29tcG9uZW50TmFtZSAmJiBjb25kaXRpb24uaWQpIHtcbiAgICAgIGNvbnN0IGVudGl0eSA9IGdldEVudGl0eUJ5SWQoY29tcG9uZW50TmFtZSwgY29uZGl0aW9uLmlkKVxuICAgICAgaWYgKGVudGl0eSkge1xuICAgICAgICByZXR1cm4gZW50aXR5XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvLyBPTl9DTElDS1xuICBmdW5jdGlvbiBpbml0T25DbGlja1RyaWdnZXIoZW50aXR5OiBFbnRpdHkpIHtcbiAgICBwb2ludGVyRXZlbnRzU3lzdGVtLm9uUG9pbnRlckRvd24oXG4gICAgICB7XG4gICAgICAgIGVudGl0eSxcbiAgICAgICAgb3B0czoge1xuICAgICAgICAgIGJ1dHRvbjogSW5wdXRBY3Rpb24uSUFfUE9JTlRFUixcbiAgICAgICAgICBob3ZlclRleHQ6ICdDbGljaycsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgKCkgPT4ge1xuICAgICAgICBjb25zdCB0cmlnZ2VyRXZlbnRzID0gZ2V0VHJpZ2dlckV2ZW50cyhlbnRpdHkpXG4gICAgICAgIHRyaWdnZXJFdmVudHMuZW1pdChUcmlnZ2VyVHlwZS5PTl9DTElDSylcbiAgICAgIH0sXG4gICAgKVxuICB9XG5cbiAgZnVuY3Rpb24gaW5pdE9uUGxheWVyVHJpZ2dlckFyZWEoZW50aXR5OiBFbnRpdHkpIHtcbiAgICBjb25zdCB7IHNjYWxlIH0gPSBUcmFuc2Zvcm0uZ2V0KGVudGl0eSlcbiAgICB0cmlnZ2Vycy5hZGRUcmlnZ2VyKFxuICAgICAgZW50aXR5LFxuICAgICAgTk9fTEFZRVJTLFxuICAgICAgTEFZRVJfMSxcbiAgICAgIFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdib3gnLFxuICAgICAgICAgIHNjYWxlLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgICgpID0+IHtcbiAgICAgICAgY29uc3QgdHJpZ2dlckV2ZW50cyA9IGdldFRyaWdnZXJFdmVudHMoZW50aXR5KVxuICAgICAgICB0cmlnZ2VyRXZlbnRzLmVtaXQoVHJpZ2dlclR5cGUuT05fUExBWUVSX0VOVEVSU19BUkVBKVxuICAgICAgfSxcbiAgICAgICgpID0+IHtcbiAgICAgICAgY29uc3QgdHJpZ2dlckV2ZW50cyA9IGdldFRyaWdnZXJFdmVudHMoZW50aXR5KVxuICAgICAgICB0cmlnZ2VyRXZlbnRzLmVtaXQoVHJpZ2dlclR5cGUuT05fUExBWUVSX0xFQVZFU19BUkVBKVxuICAgICAgfSxcbiAgICApXG4gIH1cbn1cbiIsICJpbXBvcnQgeyBJRW5naW5lLCBQb2ludGVyRXZlbnRzU3lzdGVtIH0gZnJvbSAnQGRjbC9zZGsvZWNzJ1xuaW1wb3J0IHtcbiAgRW5naW5lQ29tcG9uZW50cyxcbiAgY3JlYXRlQ29tcG9uZW50cyxcbiAgaW5pdENvbXBvbmVudHMsXG59IGZyb20gJy4vZGVmaW5pdGlvbnMnXG5pbXBvcnQgeyBjcmVhdGVBY3Rpb25zU3lzdGVtIH0gZnJvbSAnLi9hY3Rpb25zJ1xuaW1wb3J0IHsgY3JlYXRlVHJpZ2dlcnNTeXN0ZW0gfSBmcm9tICcuL3RyaWdnZXJzJ1xuaW1wb3J0IHsgY3JlYXRlVGltZXJTeXN0ZW0gfSBmcm9tICcuL3RpbWVyJ1xuXG5leHBvcnQgZnVuY3Rpb24gaW5pdEFzc2V0UGFja3MoXG4gIF9lbmdpbmU6IGFueSxcbiAgX3BvaW50ZXJFdmVudHNTeXN0ZW06IGFueSxcbiAgX2NvbXBvbmVudHM6IFJlY29yZDxrZXlvZiBFbmdpbmVDb21wb25lbnRzLCBhbnk+LFxuKSB7XG4gIGNvbnN0IGVuZ2luZSA9IF9lbmdpbmUgYXMgSUVuZ2luZVxuICBjb25zdCBwb2ludGVyRXZlbnRzU3lzdGVtID0gX3BvaW50ZXJFdmVudHNTeXN0ZW0gYXMgUG9pbnRlckV2ZW50c1N5c3RlbVxuICBjb25zdCBjb21wb25lbnRzID0gX2NvbXBvbmVudHMgYXMgRW5naW5lQ29tcG9uZW50c1xuICB0cnkge1xuICAgIGNyZWF0ZUNvbXBvbmVudHMoZW5naW5lKVxuICAgIGVuZ2luZS5hZGRTeXN0ZW0oY3JlYXRlQWN0aW9uc1N5c3RlbShlbmdpbmUsIGNvbXBvbmVudHMpKVxuICAgIGVuZ2luZS5hZGRTeXN0ZW0oY3JlYXRlVHJpZ2dlcnNTeXN0ZW0oZW5naW5lLCBwb2ludGVyRXZlbnRzU3lzdGVtKSlcbiAgICBlbmdpbmUuYWRkU3lzdGVtKGNyZWF0ZVRpbWVyU3lzdGVtKCkpXG4gICAgaW5pdENvbXBvbmVudHMoZW5naW5lLCBjb21wb25lbnRzKVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIGluaXRpYWxpemluZyBBc3NldCBQYWNrczogJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9YClcbiAgfVxufVxuIiwgImltcG9ydCB7XG4gIENvbGxpZGVyTGF5ZXIsIGVuZ2luZSwgQW5pbWF0b3IsXG4gIEF1ZGlvU291cmNlLCBWaXNpYmlsaXR5Q29tcG9uZW50LCBNYXRlcmlhbCxcbiAgVmlkZW9QbGF5ZXIsIHBvaW50ZXJFdmVudHNTeXN0ZW0sXG4gIEF2YXRhckF0dGFjaCwgR2x0ZkNvbnRhaW5lciwgUG9pbnRlckV2ZW50cywgVHdlZW4sIFBvaW50ZXJFdmVudFR5cGUsIFRleHRTaGFwZSwgVHJhbnNmb3JtLCBDYW1lcmFNb2RlQXJlYSwgQ2FtZXJhVHlwZVxufSBmcm9tICdAZGNsL3Nkay9lY3MnXG5pbXBvcnQgeyBWZWN0b3IzLCBRdWF0ZXJuaW9uIH0gZnJvbSAnQGRjbC9zZGsvbWF0aCdcbmltcG9ydCB7IEJlZXJUeXBlLCBJbmdyZWRpZW50VHlwZSwgU3luY0VudGl0eUlEcywgU3BlZWNoQnViYmxlVHlwZSwgR2FtZURhdGEsIEhpZ2hlc3RJRCB9IGZyb20gJy4vZGVmaW5pdGlvbnMnXG5pbXBvcnQgeyBwaWNraW5nR2xhc3NTeXN0ZW0gfSBmcm9tICcuL21vZHVsZXMvcGlja0FuZERyb3AnXG5pbXBvcnQgeyBjcmVhdGVDdXR0aW5nQm9hcmQsIGNyZWF0ZUluZ3JlZGllbnQsIGNyZWF0ZVRhcCwgaW5zdGFuY2VCZWVyIH0gZnJvbSAnLi9tb2R1bGVzL2ZhY3RvcnknXG5pbXBvcnQgeyB0YXBQdW1wU3lzdGVtIH0gZnJvbSAnLi9tb2R1bGVzL3RhcCdcbmltcG9ydCB7IHNldHVwVWkgfSBmcm9tICcuL3VpJ1xuaW1wb3J0IHsgaW5pdEFzc2V0UGFja3MgfSBmcm9tICdAZGNsL2Fzc2V0LXBhY2tzL2Rpc3Qvc2NlbmUtZW50cnlwb2ludCdcbmltcG9ydCB7IGluc3RhbmNlUG90LCBzdGFydENvb2tpbmcsIGNvb2tTeXN0ZW0gfSBmcm9tICcuL21vZHVsZXMvcG90J1xuaW1wb3J0IHsgZ2V0VHJpZ2dlckV2ZW50cywgZ2V0QWN0aW9uRXZlbnRzIH0gZnJvbSAnQGRjbC9hc3NldC1wYWNrcy9kaXN0L2V2ZW50cydcbmltcG9ydCB7IFRyaWdnZXJUeXBlIH0gZnJvbSAnQGRjbC9hc3NldC1wYWNrcydcbmltcG9ydCB7IHN5bmNFbnRpdHkgfSBmcm9tICdAZGNsL3Nkay9uZXR3b3JrJ1xuaW1wb3J0IHsgUHJvZ3Jlc3NCYXJVcGRhdGUgfSBmcm9tICcuL21vZHVsZXMvcHJvZ3Jlc3NCYXJzJ1xuaW1wb3J0IHsgY3JlYXRlU3BlZWNoQnViYmxlIH0gZnJvbSAnLi9tb2R1bGVzL3NwZWVjaEJ1YmJsZSdcbmltcG9ydCB7IEN1c3RvbWVyU3lzdGVtLCBDcmVhdGVDdXN0b21lciwgcmVzdGFydEdhbWUgfSBmcm9tICcuL21vZHVsZXMvY3VzdG9tZXJzJ1xuXG4vLyBZb3UgY2FuIHJlbW92ZSB0aGlzIGlmIHlvdSBkb24ndCB1c2UgYW55IGFzc2V0IHBhY2tzXG5pbml0QXNzZXRQYWNrcyhlbmdpbmUsIHBvaW50ZXJFdmVudHNTeXN0ZW0sIHtcbiAgQW5pbWF0b3IsXG4gIEF1ZGlvU291cmNlLFxuICBBdmF0YXJBdHRhY2gsXG4gIFRyYW5zZm9ybSxcbiAgVmlzaWJpbGl0eUNvbXBvbmVudCxcbiAgR2x0ZkNvbnRhaW5lcixcbiAgTWF0ZXJpYWwsXG4gIFZpZGVvUGxheWVyXG59KVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBtYWluKCkge1xuXG4gIEhpZ2hlc3RJRC5jcmVhdGUoZW5naW5lLlJvb3RFbnRpdHksIHsgaWQ6IDEwMDEgfSlcbiAgc3luY0VudGl0eShlbmdpbmUuUm9vdEVudGl0eSwgW0hpZ2hlc3RJRC5jb21wb25lbnRJZF0sIDEwMDApXG5cblxuXG4gIGNvbnN0IGdhbWVFbnRpdHkgPSBlbmdpbmUuYWRkRW50aXR5KClcbiAgR2FtZURhdGEuY3JlYXRlKGdhbWVFbnRpdHksIHt9KVxuICBzeW5jRW50aXR5KGdhbWVFbnRpdHksIFtHYW1lRGF0YS5jb21wb25lbnRJZF0sIFN5bmNFbnRpdHlJRHMuR0FNRV9TRVNTSU9OKVxuXG5cblxuICBjb25zdCBlYXN0ZXJFZ2cgPSBlbmdpbmUuYWRkRW50aXR5KClcbiAgVHJhbnNmb3JtLmNyZWF0ZShlYXN0ZXJFZ2csIHtcbiAgICBwb3NpdGlvbjogVmVjdG9yMy5jcmVhdGUoMTksIDIsIDQpLFxuICAgIHJvdGF0aW9uOiBRdWF0ZXJuaW9uLmZyb21FdWxlckRlZ3JlZXMoMCwgOTAsIDApXG4gIH0pXG4gIFRleHRTaGFwZS5jcmVhdGUoZWFzdGVyRWdnLCB7XG4gICAgdGV4dDogXCJZb3UgZG9uJ3Qgd2FudCB0byBrbm93IHdoYXQnc1xcbmJlaGluZCB0aGUga2l0Y2hlblwiLFxuICAgIGZvbnRTaXplOiAzLFxuICB9KVxuXG5cbiAgLy9JbmdyZWRpZW50IGV4cGVuZGVyc1xuICBjb25zdCBub29kbGVzX2V4cGVuZGVyID0gZW5naW5lLmdldEVudGl0eU9yTnVsbEJ5TmFtZShcIkV4cGVuZGVyTm9vZGxlc1wiKVxuICBjb25zdCByb2xsX2V4cGVuZGVyID0gZW5naW5lLmdldEVudGl0eU9yTnVsbEJ5TmFtZShcIkV4cGVuZGVyUm9sbHNcIilcbiAgY29uc3Qgbm9vZGxlc19idXR0b24gPSBlbmdpbmUuZ2V0RW50aXR5T3JOdWxsQnlOYW1lKFwiTm9vZGxlIEJ1dHRvblwiKVxuICBjb25zdCByb2xsX2J1dHRvbiA9IGVuZ2luZS5nZXRFbnRpdHlPck51bGxCeU5hbWUoXCJSb2xsIEJ1dHRvblwiKVxuXG4gIC8vIFRPRE86IEhBTkRMRSBJRFMgRk9SIE1VTFRJUExBWUVSIE1PREVcblxuICBpZiAobm9vZGxlc19leHBlbmRlciAmJiByb2xsX2V4cGVuZGVyICYmIG5vb2RsZXNfYnV0dG9uICYmIHJvbGxfYnV0dG9uKSB7XG4gICAgY29uc3Qgbm9vZGxlc19idXR0b25fZXZlbnRzID0gZ2V0VHJpZ2dlckV2ZW50cyhub29kbGVzX2J1dHRvbilcbiAgICBub29kbGVzX2J1dHRvbl9ldmVudHMub24oVHJpZ2dlclR5cGUuT05fQ0xJQ0ssICgpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKFwiQlVUVE9OIFdBUyBQUkVTU0VEISFcIilcbiAgICAgIGNvbnN0IHN0YXJ0UG9zaXRpb24gPSBWZWN0b3IzLmFkZChUcmFuc2Zvcm0uZ2V0KG5vb2RsZXNfZXhwZW5kZXIpLnBvc2l0aW9uLCBWZWN0b3IzLmNyZWF0ZSgwLCAwLjcsIDApKVxuICAgICAgY3JlYXRlSW5ncmVkaWVudChJbmdyZWRpZW50VHlwZS5Ob29kbGVzLCBzdGFydFBvc2l0aW9uLCB0cnVlKVxuXG4gICAgfSlcblxuICAgIGNvbnN0IHJvbGxfYnV0dG9uX2V2ZW50cyA9IGdldFRyaWdnZXJFdmVudHMocm9sbF9idXR0b24pXG4gICAgcm9sbF9idXR0b25fZXZlbnRzLm9uKFRyaWdnZXJUeXBlLk9OX0NMSUNLLCAoKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZyhcIkJVVFRPTiBXQVMgUFJFU1NFRCEhXCIpXG4gICAgICBjb25zdCBzdGFydFBvc2l0aW9uID0gVmVjdG9yMy5hZGQoVHJhbnNmb3JtLmdldChyb2xsX2V4cGVuZGVyKS5wb3NpdGlvbiwgVmVjdG9yMy5jcmVhdGUoMCwgMC43LCAwKSlcbiAgICAgIGNyZWF0ZUluZ3JlZGllbnQoSW5ncmVkaWVudFR5cGUuU3VzaGlSb2xsLCBzdGFydFBvc2l0aW9uLCB0cnVlKVxuXG4gICAgfSlcblxuICAgIHN5bmNFbnRpdHkobm9vZGxlc19idXR0b24sIFtBbmltYXRvci5jb21wb25lbnRJZCwgQXVkaW9Tb3VyY2UuY29tcG9uZW50SWRdLCBTeW5jRW50aXR5SURzLkRJU1BFTlNFUl9CVVRUT04xKVxuICAgIHN5bmNFbnRpdHkocm9sbF9idXR0b24sIFtBbmltYXRvci5jb21wb25lbnRJZCwgQXVkaW9Tb3VyY2UuY29tcG9uZW50SWRdLCBTeW5jRW50aXR5SURzLkRJU1BFTlNFUl9CVVRUT04yKVxuXG5cbiAgfVxuXG5cbiAgLy8gUG90c1xuICBjb25zdCBwb3QxID0gZW5naW5lLmdldEVudGl0eU9yTnVsbEJ5TmFtZShcIlBvdDFcIilcbiAgY29uc3QgcG90MiA9IGVuZ2luZS5nZXRFbnRpdHlPck51bGxCeU5hbWUoXCJQb3QyXCIpXG4gIGNvbnN0IHBvdDFfYnV0dG9uID0gZW5naW5lLmdldEVudGl0eU9yTnVsbEJ5TmFtZShcIlBvdDEgQnV0dG9uXCIpXG4gIGNvbnN0IHBvdDJfYnV0dG9uID0gZW5naW5lLmdldEVudGl0eU9yTnVsbEJ5TmFtZShcIlBvdDIgQnV0dG9uXCIpXG5cblxuICBpZiAocG90MSAmJiBwb3QyICYmIHBvdDFfYnV0dG9uICYmIHBvdDJfYnV0dG9uKSB7XG4gICAgaW5zdGFuY2VQb3QocG90MSwgU3luY0VudGl0eUlEcy5QT1QxLCBTeW5jRW50aXR5SURzLlBCQVI1X0EsIFN5bmNFbnRpdHlJRHMuUEJBUjVfQilcbiAgICBpbnN0YW5jZVBvdChwb3QyLCBTeW5jRW50aXR5SURzLlBPVDIsIFN5bmNFbnRpdHlJRHMuUEJBUjZfQSwgU3luY0VudGl0eUlEcy5QQkFSNl9CKVxuXG5cbiAgICBjb25zdCBwb3QxX2J1dHRvbl9ldmVudHMgPSBnZXRUcmlnZ2VyRXZlbnRzKHBvdDFfYnV0dG9uKVxuICAgIHBvdDFfYnV0dG9uX2V2ZW50cy5vbihUcmlnZ2VyVHlwZS5PTl9DTElDSywgKCkgPT4ge1xuICAgICAgY29uc29sZS5sb2coXCJCVVRUT04gV0FTIFBSRVNTRUQhIVwiKVxuICAgICAgc3RhcnRDb29raW5nKHBvdDEpXG4gICAgfSlcblxuICAgIGNvbnN0IHBvdDJfYnV0dG9uX2V2ZW50cyA9IGdldFRyaWdnZXJFdmVudHMocG90Ml9idXR0b24pXG4gICAgcG90Ml9idXR0b25fZXZlbnRzLm9uKFRyaWdnZXJUeXBlLk9OX0NMSUNLLCAoKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZyhcIkJVVFRPTiBXQVMgUFJFU1NFRCEhXCIpXG4gICAgICBzdGFydENvb2tpbmcocG90MilcblxuICAgICAgLy9jcmVhdGVTcGVlY2hCdWJibGUocG90MSwgXCJJJ20gYSBwb3QgTVVBSEFIQVwiLCAxLCBTcGVlY2hCdWJibGVUeXBlLkJhZClcbiAgICB9KVxuXG4gICAgc3luY0VudGl0eShwb3QxX2J1dHRvbiwgW0FuaW1hdG9yLmNvbXBvbmVudElkLCBBdWRpb1NvdXJjZS5jb21wb25lbnRJZF0sIFN5bmNFbnRpdHlJRHMuUE9UX0JVVFRPTjEpXG4gICAgc3luY0VudGl0eShwb3QyX2J1dHRvbiwgW0FuaW1hdG9yLmNvbXBvbmVudElkLCBBdWRpb1NvdXJjZS5jb21wb25lbnRJZF0sIFN5bmNFbnRpdHlJRHMuUE9UX0JVVFRPTjIpXG5cbiAgfVxuXG4gIC8vIHJlc3RhcnQgYnV0dG9uXG4gIGNvbnN0IHJlc3RhcnQgPSBlbmdpbmUuZ2V0RW50aXR5T3JOdWxsQnlOYW1lKFwiUmVzdGFydF9CdXR0b25cIilcbiAgaWYgKHJlc3RhcnQpIHtcbiAgICBjb25zdCByZXN0YXJ0X2V2ZW50ID0gZ2V0VHJpZ2dlckV2ZW50cyhyZXN0YXJ0KVxuICAgIHJlc3RhcnRfZXZlbnQub24oVHJpZ2dlclR5cGUuT05fQ0xJQ0ssICgpID0+IHtcbiAgICAgIHJlc3RhcnRHYW1lKClcbiAgICB9KVxuXG4gICAgc3luY0VudGl0eShyZXN0YXJ0LCBbQW5pbWF0b3IuY29tcG9uZW50SWQsIEF1ZGlvU291cmNlLmNvbXBvbmVudElkXSwgU3luY0VudGl0eUlEcy5SRVNFVF9CVVRUT04pXG5cbiAgfVxuXG4gIC8vIGN1c3RvbWVyc1xuICBDcmVhdGVDdXN0b21lcigxKVxuICBDcmVhdGVDdXN0b21lcigyKVxuICBDcmVhdGVDdXN0b21lcigzKVxuICBDcmVhdGVDdXN0b21lcig0KVxuXG5cblxuXG4gIC8vIEJlZXIgZGlzcGVuc2VyXG4gIGNvbnN0IGRpc3BlbnNlckVudGl0eSA9IGVuZ2luZS5hZGRFbnRpdHkoKVxuICBHbHRmQ29udGFpbmVyLmNyZWF0ZShkaXNwZW5zZXJFbnRpdHksIHtcbiAgICBzcmM6ICdhc3NldHMvbW9kZWxzL2JlZXJEaXNwZW5zZXIuZ2xiJ1xuICB9KVxuICBUcmFuc2Zvcm0uY3JlYXRlKGRpc3BlbnNlckVudGl0eSwge1xuICAgIHBvc2l0aW9uOiBWZWN0b3IzLmNyZWF0ZSgxOS41LCAxLCA4LjUpLFxuICAgIHJvdGF0aW9uOiBRdWF0ZXJuaW9uLmZyb21FdWxlckRlZ3JlZXMoMCwgMjcwLCAwKVxuICB9KVxuICBzeW5jRW50aXR5KGRpc3BlbnNlckVudGl0eSwgW10sIFN5bmNFbnRpdHlJRHMuQkVFUl9ESVNQRU5TRVIpXG5cbiAgLy8gQ3JlYXRlIHRhcHNcbiAgY3JlYXRlVGFwKEJlZXJUeXBlLlJFRCwgZGlzcGVuc2VyRW50aXR5LCBTeW5jRW50aXR5SURzLlRBUF9SRUQpXG4gIGNyZWF0ZVRhcChCZWVyVHlwZS5HUkVFTiwgZGlzcGVuc2VyRW50aXR5LCBTeW5jRW50aXR5SURzLlRBUF9ZRUxMT1cpXG4gIGNyZWF0ZVRhcChCZWVyVHlwZS5ZRUxMT1csIGRpc3BlbnNlckVudGl0eSwgU3luY0VudGl0eUlEcy5UQVBfR1JFRU4pXG5cblxuICAvL2NyZWF0ZSBjdXR0aW5nIGJvYXJkc1xuICBjcmVhdGVDdXR0aW5nQm9hcmQoVmVjdG9yMy5jcmVhdGUoMTcuNSwgMS4xLCAxNC41KSwgU3luY0VudGl0eUlEcy5DVVRURVIxKVxuICBjcmVhdGVDdXR0aW5nQm9hcmQoVmVjdG9yMy5jcmVhdGUoMTUuNSwgMS4xLCAxNC41KSwgU3luY0VudGl0eUlEcy5DVVRURVIyKVxuXG5cbiAgLy8gQmVlciBnbGFzc2VzXG5cbiAgY29uc3QgYmVlcjEgPSBlbmdpbmUuZ2V0RW50aXR5T3JOdWxsQnlOYW1lKFwiQmVlcjFcIilcbiAgY29uc3QgYmVlcjIgPSBlbmdpbmUuZ2V0RW50aXR5T3JOdWxsQnlOYW1lKFwiQmVlcjJcIilcbiAgY29uc3QgYmVlcjMgPSBlbmdpbmUuZ2V0RW50aXR5T3JOdWxsQnlOYW1lKFwiQmVlcjNcIilcbiAgY29uc3QgYmVlcjQgPSBlbmdpbmUuZ2V0RW50aXR5T3JOdWxsQnlOYW1lKFwiQmVlcjRcIilcbiAgY29uc3QgYmVlcjUgPSBlbmdpbmUuZ2V0RW50aXR5T3JOdWxsQnlOYW1lKFwiQmVlcjVcIilcbiAgY29uc3QgYmVlcjYgPSBlbmdpbmUuZ2V0RW50aXR5T3JOdWxsQnlOYW1lKFwiQmVlcjZcIilcbiAgY29uc3QgYmVlcjcgPSBlbmdpbmUuZ2V0RW50aXR5T3JOdWxsQnlOYW1lKFwiQmVlcjdcIilcbiAgY29uc3QgYmVlcjggPSBlbmdpbmUuZ2V0RW50aXR5T3JOdWxsQnlOYW1lKFwiQmVlcjhcIilcbiAgY29uc3QgYmVlcjkgPSBlbmdpbmUuZ2V0RW50aXR5T3JOdWxsQnlOYW1lKFwiQmVlcjlcIilcblxuICBpZiAoYmVlcjEgJiYgYmVlcjIgJiYgYmVlcjMgJiYgYmVlcjQgJiYgYmVlcjUgJiYgYmVlcjYgJiYgYmVlcjcgJiYgYmVlcjggJiYgYmVlcjkpIHtcblxuICAgIGluc3RhbmNlQmVlcihiZWVyMSwgU3luY0VudGl0eUlEcy5HTEFTUzEpXG4gICAgaW5zdGFuY2VCZWVyKGJlZXIyLCBTeW5jRW50aXR5SURzLkdMQVNTMilcbiAgICBpbnN0YW5jZUJlZXIoYmVlcjMsIFN5bmNFbnRpdHlJRHMuR0xBU1MzKVxuICAgIGluc3RhbmNlQmVlcihiZWVyNCwgU3luY0VudGl0eUlEcy5HTEFTUzQpXG4gICAgaW5zdGFuY2VCZWVyKGJlZXI1LCBTeW5jRW50aXR5SURzLkdMQVNTNSlcbiAgICBpbnN0YW5jZUJlZXIoYmVlcjYsIFN5bmNFbnRpdHlJRHMuR0xBU1M2KVxuICAgIGluc3RhbmNlQmVlcihiZWVyNywgU3luY0VudGl0eUlEcy5HTEFTUzcpXG4gICAgaW5zdGFuY2VCZWVyKGJlZXI4LCBTeW5jRW50aXR5SURzLkdMQVNTOClcbiAgICBpbnN0YW5jZUJlZXIoYmVlcjksIFN5bmNFbnRpdHlJRHMuR0xBU1M5KVxuXG4gIH1cblxuXG4gIC8vIEZPUiBURVNUSU5HXG4gIC8vIGNyZWF0ZUluZ3JlZGllbnQoSW5ncmVkaWVudFR5cGUuTm9vZGxlcywgVmVjdG9yMy5jcmVhdGUoNC40LCAwLjgsIDEuNSkpXG4gIC8vIGNyZWF0ZUluZ3JlZGllbnQoSW5ncmVkaWVudFR5cGUuU3VzaGlSb2xsLCBWZWN0b3IzLmNyZWF0ZSg2LjQsIDAuOCwgMS41KSlcbiAgLy8gY3JlYXRlSW5ncmVkaWVudChJbmdyZWRpZW50VHlwZS5TbGljZWRTdXNoaSwgVmVjdG9yMy5jcmVhdGUoOC40LCAwLjgsIDEuNSkpXG4gIC8vIGNyZWF0ZUluZ3JlZGllbnQoSW5ncmVkaWVudFR5cGUuQ29va2VkTm9vZGxlcywgVmVjdG9yMy5jcmVhdGUoMTAuNCwgMC44LCAxLjUpKVxuXG4gIC8vIGNhbWVyYSBtb2RpZmllcmEgYXJlYVxuICBjb25zdCBjYW1lcmFNb2QgPSBlbmdpbmUuYWRkRW50aXR5KClcblxuICBUcmFuc2Zvcm0uY3JlYXRlKGNhbWVyYU1vZCwgeyBwb3NpdGlvbjogVmVjdG9yMy5jcmVhdGUoMTcsIDIsIDEyKSB9KVxuXG4gIENhbWVyYU1vZGVBcmVhLmNyZWF0ZShjYW1lcmFNb2QsIHtcbiAgICBhcmVhOiBWZWN0b3IzLmNyZWF0ZSg2LCAyLCAxMCksXG4gICAgbW9kZTogQ2FtZXJhVHlwZS5DVF9GSVJTVF9QRVJTT04sXG4gIH0pXG5cblxuICBjb25zdCBzY29yZSA9IGVuZ2luZS5nZXRFbnRpdHlPck51bGxCeU5hbWUoXCJTY29yZVwiKVxuICBjb25zdCBtaXNzZXMgPSBlbmdpbmUuZ2V0RW50aXR5T3JOdWxsQnlOYW1lKFwiTWlzc2VzXCIpXG4gIGlmIChzY29yZSAmJiBtaXNzZXMpIHtcbiAgICBzeW5jRW50aXR5KHNjb3JlLCBbVGV4dFNoYXBlLmNvbXBvbmVudElkXSwgU3luY0VudGl0eUlEcy5TQ09SRV9URVhUKVxuICAgIHN5bmNFbnRpdHkobWlzc2VzLCBbVGV4dFNoYXBlLmNvbXBvbmVudElkXSwgU3luY0VudGl0eUlEcy5NSVNTRVNfVEVYVClcbiAgfVxuXG5cblxuICBlbmdpbmUuYWRkU3lzdGVtKHBpY2tpbmdHbGFzc1N5c3RlbSlcbiAgZW5naW5lLmFkZFN5c3RlbSh0YXBQdW1wU3lzdGVtKVxuICBlbmdpbmUuYWRkU3lzdGVtKGNvb2tTeXN0ZW0pXG4gIGVuZ2luZS5hZGRTeXN0ZW0oUHJvZ3Jlc3NCYXJVcGRhdGUpXG4gIGVuZ2luZS5hZGRTeXN0ZW0oQ3VzdG9tZXJTeXN0ZW0pXG5cbiAgLy8gVUkgd2l0aCBHaXRIdWIgbGlua1xuICBzZXR1cFVpKClcblxufVxuIiwgIi8qKiBAYWxwaGEgVEhJUyBGSUxFIElOSVRJQUxJWkVTIFRIRSBERUNFTlRSQUxBTkQgUlVOVElNRS4gV0lMTCBDSEFOR0UgU09PTiAqL1xuaW1wb3J0IHsgQ29tcG9zaXRlLCBlbmdpbmUgfSBmcm9tICdAZGNsL2VjcydcbmltcG9ydCB7IGNyZHRHZXRTdGF0ZSwgY3JkdFNlbmRUb1JlbmRlcmVyLCBzZW5kQmF0Y2ggfSBmcm9tICd+c3lzdGVtL0VuZ2luZUFwaSdcbmltcG9ydCB7IGNyZWF0ZVJlbmRlcmVyVHJhbnNwb3J0IH0gZnJvbSAnLi9pbnRlcm5hbC90cmFuc3BvcnRzL3JlbmRlcmVyVHJhbnNwb3J0J1xuaW1wb3J0IHsgcG9sbEV2ZW50cyB9IGZyb20gJy4vb2JzZXJ2YWJsZXMnXG5pbXBvcnQgeyBjb21wb3NpdGVQcm92aWRlciB9IGZyb20gJy4vY29tcG9zaXRlLXByb3ZpZGVyJ1xuXG4vLyBBdHRhY2ggQ1JEVCB0cmFuc3BvcnRcbi8vIEBpbnRlcm5hbFxuZXhwb3J0IGNvbnN0IHJlbmRlcmVyVHJhbnNwb3J0ID0gY3JlYXRlUmVuZGVyZXJUcmFuc3BvcnQoeyBjcmR0U2VuZFRvUmVuZGVyZXIgfSlcbmVuZ2luZS5hZGRUcmFuc3BvcnQocmVuZGVyZXJUcmFuc3BvcnQpXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBvblVwZGF0ZShkZWx0YVRpbWU6IG51bWJlcikge1xuICBlbmdpbmUuc2VhbCgpXG4gIGF3YWl0IGVuZ2luZS51cGRhdGUoZGVsdGFUaW1lKVxuICBhd2FpdCBwb2xsRXZlbnRzKHNlbmRCYXRjaClcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqIEZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIGJlZm9yZSB0aGUgZmlyc3QgdXBkYXRlIGFuZCBhZnRlciB0aGUgZXZhbHVhdGlvbiBvZiB0aGUgY29kZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9uU3RhcnQoKSB7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY3JkdEdldFN0YXRlKHsgZGF0YTogbmV3IFVpbnQ4QXJyYXkoKSB9KVxuXG4gIC8vIHdoZW4gdGhpcyBjb25kaXRpb24gaXMgdHJ1ZSBzb21ldGhpbmcgbGlrZSBgbWFpbi5jcmR0YCB3YXMgcHJlLWxvYWRlZCBmcm9tIHRoZSBydW50aW1lLCB3ZSBkb24ndCBuZWVkIHRvIGluc3RhbmNlIHRoZSBtYWluLmNvbXBvc2l0ZVxuICBpZiAoIXJlc3BvbnNlLmhhc0VudGl0aWVzKSB7XG4gICAgY29uc3QgbWFpbkNvbXBvc2l0ZSA9IGNvbXBvc2l0ZVByb3ZpZGVyLmdldENvbXBvc2l0ZU9yTnVsbCgnbWFpbi5jb21wb3NpdGUnKVxuICAgIGlmIChtYWluQ29tcG9zaXRlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBDb21wb3NpdGUuaW5zdGFuY2UoZW5naW5lLCBtYWluQ29tcG9zaXRlLCBjb21wb3NpdGVQcm92aWRlcilcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLmxvZyhgV2FybmluZzogbWFpbi5jb21wb3NpdGUgY291bGRuJ3QgYmUgaW5zdGFuY2VkLmApXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICghIXJlbmRlcmVyVHJhbnNwb3J0Lm9ubWVzc2FnZSkge1xuICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5kYXRhICYmIHJlc3BvbnNlLmRhdGEubGVuZ3RoKSB7XG4gICAgICBmb3IgKGNvbnN0IGJ5dGVBcnJheSBvZiByZXNwb25zZS5kYXRhKSB7XG4gICAgICAgIHJlbmRlcmVyVHJhbnNwb3J0Lm9ubWVzc2FnZShieXRlQXJyYXkpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCAiaW1wb3J0IHsgVHJhbnNwb3J0LCBUcmFuc3BvcnRNZXNzYWdlIH0gZnJvbSAnQGRjbC9lY3MnXG5pbXBvcnQgeyBNQVhfU1RBVElDX0NPTVBPTkVOVCB9IGZyb20gJ0BkY2wvZWNzL2Rpc3QvY29tcG9uZW50cy9jb21wb25lbnQtbnVtYmVyJ1xuaW1wb3J0IHR5cGUgeyBDcmR0U2VuZFRvUmVuZGVyZXJSZXF1ZXN0LCBDcmR0U2VuZFRvUmVzcG9uc2UgfSBmcm9tICd+c3lzdGVtL0VuZ2luZUFwaSdcblxuZXhwb3J0IHR5cGUgRW5naW5lQXBpRm9yVHJhbnNwb3J0ID0ge1xuICBjcmR0U2VuZFRvUmVuZGVyZXIoYm9keTogQ3JkdFNlbmRUb1JlbmRlcmVyUmVxdWVzdCk6IFByb21pc2U8Q3JkdFNlbmRUb1Jlc3BvbnNlPlxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVuZGVyZXJUcmFuc3BvcnQoZW5naW5lQXBpOiBFbmdpbmVBcGlGb3JUcmFuc3BvcnQpOiBUcmFuc3BvcnQge1xuICBhc3luYyBmdW5jdGlvbiBzZW5kVG9SZW5kZXJlcihtZXNzYWdlOiBVaW50OEFycmF5KSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBlbmdpbmVBcGkuY3JkdFNlbmRUb1JlbmRlcmVyKHtcbiAgICAgIGRhdGE6IG5ldyBVaW50OEFycmF5KG1lc3NhZ2UpXG4gICAgfSlcblxuICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5kYXRhICYmIHJlc3BvbnNlLmRhdGEubGVuZ3RoKSB7XG4gICAgICBpZiAocmVuZGVyZXJUcmFuc3BvcnQub25tZXNzYWdlKSB7XG4gICAgICAgIGZvciAoY29uc3QgYnl0ZUFycmF5IG9mIHJlc3BvbnNlLmRhdGEpIHtcbiAgICAgICAgICByZW5kZXJlclRyYW5zcG9ydC5vbm1lc3NhZ2UoYnl0ZUFycmF5KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcmVuZGVyZXJUcmFuc3BvcnQ6IFRyYW5zcG9ydCA9IHtcbiAgICBhc3luYyBzZW5kKG1lc3NhZ2UpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHNlbmRUb1JlbmRlcmVyKG1lc3NhZ2UpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyB0aGlzIGlzIHRoZSBjb25zb2xlLmVycm9yIG9mIHRoZSBzY2VuZVxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKVxuICAgICAgICBkZWJ1Z2dlclxuICAgICAgfVxuICAgIH0sXG4gICAgZmlsdGVyKG1lc3NhZ2U6IFRyYW5zcG9ydE1lc3NhZ2UpIHtcbiAgICAgIC8vIE9ubHkgc2VuZCByZW5kZXJlciBjb21wb25lbnRzIChQcm90byBHZW5lcmF0ZWQpXG4gICAgICBpZiAoXG4gICAgICAgIC8vIGZpbHRlciBvdXQgbWVzc2FnZXMgZm9yIG5vbi1jb3JlIGNvbXBvbmVudHNcbiAgICAgICAgKG1lc3NhZ2UgYXMgYW55KS5jb21wb25lbnRJZCA+IE1BWF9TVEFUSUNfQ09NUE9ORU5UXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG5cbiAgICAgIHJldHVybiAhIW1lc3NhZ2VcbiAgICB9LFxuICAgIHR5cGU6ICdyZW5kZXJlcidcbiAgfVxuXG4gIHJldHVybiByZW5kZXJlclRyYW5zcG9ydFxufVxuIiwgIi8qIGlzdGFuYnVsIGlnbm9yZSBmaWxlICovXG4vKipcbiAqIEEgY2xhc3Mgc2VydmVzIGFzIGEgbWVkaXVtIGJldHdlZW4gdGhlIG9ic2VydmFibGUgYW5kIGl0cyBvYnNlcnZlcnNcbiAqIEBkZXByZWNhdGVkIFRoaXMgZnVuY3Rpb24gaXMgYW4gaW5oZXJpdGFuY2Ugb2YgRUNTNiwgaXQncyBoZXJlIHRlbXBvcmFyeSBmb3IgdGhlIGZlYXR1cmUgcGFyaXR5LCBwbGVhc2UgcmVhZCB0aGUgbmV3cyBhbmQgZG9jcyB0byBrbm93IGhvdyBoYW5kbGUgd2hlbiBpdCdzIHJlbW92ZWRcbiAqL1xuZXhwb3J0IGNsYXNzIE9ic2VydmVyRXZlbnRTdGF0ZSB7XG4gIC8qKlxuICAgKiBBbiBPYnNlcnZlciBjYW4gc2V0IHRoaXMgcHJvcGVydHkgdG8gdHJ1ZSB0byBwcmV2ZW50IHN1YnNlcXVlbnQgb2JzZXJ2ZXJzIG9mIGJlaW5nIG5vdGlmaWVkXG4gICAqL1xuICBwdWJsaWMgc2tpcE5leHRPYnNlcnZlcnMhOiBib29sZWFuXG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbWFzayB2YWx1ZSB0aGF0IHdlcmUgdXNlZCB0byB0cmlnZ2VyIHRoZSBldmVudCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgRXZlbnRTdGF0ZSBvYmplY3RcbiAgICovXG4gIHB1YmxpYyBtYXNrITogbnVtYmVyXG5cbiAgLyoqXG4gICAqIFRoZSBvYmplY3QgdGhhdCBvcmlnaW5hbGx5IG5vdGlmaWVkIHRoZSBldmVudFxuICAgKi9cbiAgcHVibGljIHRhcmdldD86IGFueVxuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCBvYmplY3QgaW4gdGhlIGJ1YmJsaW5nIHBoYXNlXG4gICAqL1xuICBwdWJsaWMgY3VycmVudFRhcmdldD86IGFueVxuXG4gIC8qKlxuICAgKiBUaGlzIHdpbGwgYmUgcG9wdWxhdGVkIHdpdGggdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgbGFzdCBmdW5jdGlvbiB0aGF0IHdhcyBleGVjdXRlZC5cbiAgICogSWYgaXQgaXMgdGhlIGZpcnN0IGZ1bmN0aW9uIGluIHRoZSBjYWxsYmFjayBjaGFpbiBpdCB3aWxsIGJlIHRoZSBldmVudCBkYXRhLlxuICAgKi9cbiAgcHVibGljIGxhc3RSZXR1cm5WYWx1ZT86IGFueVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgRXZlbnRTdGF0ZVxuICAgKiBAcGFyYW0gbWFzayAtIGRlZmluZXMgdGhlIG1hc2sgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc3RhdGVcbiAgICogQHBhcmFtIHNraXBOZXh0T2JzZXJ2ZXJzIC0gZGVmaW5lcyBhIGZsYWcgd2hpY2ggd2lsbCBpbnN0cnVjdCB0aGUgb2JzZXJ2YWJsZSB0byBza2lwIGZvbGxvd2luZyBvYnNlcnZlcnMgd2hlbiBzZXQgdG8gdHJ1ZVxuICAgKiBAcGFyYW0gdGFyZ2V0IC0gZGVmaW5lcyB0aGUgb3JpZ2luYWwgdGFyZ2V0IG9mIHRoZSBzdGF0ZVxuICAgKiBAcGFyYW0gY3VycmVudFRhcmdldCAtIGRlZmluZXMgdGhlIGN1cnJlbnQgdGFyZ2V0IG9mIHRoZSBzdGF0ZVxuICAgKi9cbiAgY29uc3RydWN0b3IobWFzazogbnVtYmVyLCBza2lwTmV4dE9ic2VydmVycyA9IGZhbHNlLCB0YXJnZXQ/OiBhbnksIGN1cnJlbnRUYXJnZXQ/OiBhbnkpIHtcbiAgICB0aGlzLmluaXRhbGl6ZShtYXNrLCBza2lwTmV4dE9ic2VydmVycywgdGFyZ2V0LCBjdXJyZW50VGFyZ2V0KVxuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgdGhlIGN1cnJlbnQgZXZlbnQgc3RhdGVcbiAgICogQHBhcmFtIG1hc2sgLSBkZWZpbmVzIHRoZSBtYXNrIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHN0YXRlXG4gICAqIEBwYXJhbSBza2lwTmV4dE9ic2VydmVycyAtIGRlZmluZXMgYSBmbGFnIHdoaWNoIHdpbGwgaW5zdHJ1Y3QgdGhlIG9ic2VydmFibGUgdG8gc2tpcCBmb2xsb3dpbmcgb2JzZXJ2ZXJzIHdoZW4gc2V0IHRvIHRydWVcbiAgICogQHBhcmFtIHRhcmdldCAtIGRlZmluZXMgdGhlIG9yaWdpbmFsIHRhcmdldCBvZiB0aGUgc3RhdGVcbiAgICogQHBhcmFtIGN1cnJlbnRUYXJnZXQgLSBkZWZpbmVzIHRoZSBjdXJyZW50IHRhcmdldCBvZiB0aGUgc3RhdGVcbiAgICogQHJldHVybnMgdGhlIGN1cnJlbnQgZXZlbnQgc3RhdGVcbiAgICovXG4gIHB1YmxpYyBpbml0YWxpemUobWFzazogbnVtYmVyLCBza2lwTmV4dE9ic2VydmVycyA9IGZhbHNlLCB0YXJnZXQ/OiBhbnksIGN1cnJlbnRUYXJnZXQ/OiBhbnkpOiBPYnNlcnZlckV2ZW50U3RhdGUge1xuICAgIHRoaXMubWFzayA9IG1hc2tcbiAgICB0aGlzLnNraXBOZXh0T2JzZXJ2ZXJzID0gc2tpcE5leHRPYnNlcnZlcnNcbiAgICB0aGlzLnRhcmdldCA9IHRhcmdldFxuICAgIHRoaXMuY3VycmVudFRhcmdldCA9IGN1cnJlbnRUYXJnZXRcbiAgICByZXR1cm4gdGhpc1xuICB9XG59XG5cbi8qKlxuICogUmVwcmVzZW50IGFuIE9ic2VydmVyIHJlZ2lzdGVyZWQgdG8gYSBnaXZlbiBPYnNlcnZhYmxlIG9iamVjdC5cbiAqIEBkZXByZWNhdGVkIFRoaXMgZnVuY3Rpb24gaXMgYW4gaW5oZXJpdGFuY2Ugb2YgRUNTNiwgaXQncyBoZXJlIHRlbXBvcmFyeSBmb3IgdGhlIGZlYXR1cmUgcGFyaXR5LCBwbGVhc2UgcmVhZCB0aGUgbmV3cyBhbmQgZG9jcyB0byBrbm93IGhvdyBoYW5kbGUgd2hlbiBpdCdzIHJlbW92ZWRcbiAqL1xuZXhwb3J0IGNsYXNzIE9ic2VydmVyPFQ+IHtcbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyBhIHByb3BlcnR5IGRlZmluaW5nIHRoYXQgdGhlIG9ic2VydmVyIGFzIHRvIGJlIHVucmVnaXN0ZXJlZCBhZnRlciB0aGUgbmV4dCBub3RpZmljYXRpb25cbiAgICovXG4gIHB1YmxpYyB1bnJlZ2lzdGVyT25OZXh0Q2FsbCA9IGZhbHNlXG5cbiAgLyoqIEZvciBpbnRlcm5hbCB1c2FnZSAqL1xuICBwdWJsaWMgX3dpbGxCZVVucmVnaXN0ZXJlZCA9IGZhbHNlXG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgb2JzZXJ2ZXJcbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gZGVmaW5lcyB0aGUgY2FsbGJhY2sgdG8gY2FsbCB3aGVuIHRoZSBvYnNlcnZlciBpcyBub3RpZmllZFxuICAgKiBAcGFyYW0gbWFzayAtIGRlZmluZXMgdGhlIG1hc2sgb2YgdGhlIG9ic2VydmVyICh1c2VkIHRvIGZpbHRlciBub3RpZmljYXRpb25zKVxuICAgKiBAcGFyYW0gc2NvcGUgLSBkZWZpbmVzIHRoZSBjdXJyZW50IHNjb3BlIHVzZWQgdG8gcmVzdG9yZSB0aGUgSlMgY29udGV4dFxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgICogRGVmaW5lcyB0aGUgY2FsbGJhY2sgdG8gY2FsbCB3aGVuIHRoZSBvYnNlcnZlciBpcyBub3RpZmllZFxuICAgICAqL1xuICAgIHB1YmxpYyBjYWxsYmFjazogKGV2ZW50RGF0YTogVCwgZXZlbnRTdGF0ZTogT2JzZXJ2ZXJFdmVudFN0YXRlKSA9PiB2b2lkLFxuICAgIC8qKlxuICAgICAqIERlZmluZXMgdGhlIG1hc2sgb2YgdGhlIG9ic2VydmVyICh1c2VkIHRvIGZpbHRlciBub3RpZmljYXRpb25zKVxuICAgICAqL1xuICAgIHB1YmxpYyBtYXNrOiBudW1iZXIsXG4gICAgLyoqXG4gICAgICogRGVmaW5lcyB0aGUgY3VycmVudCBzY29wZSB1c2VkIHRvIHJlc3RvcmUgdGhlIEpTIGNvbnRleHRcbiAgICAgKi9cbiAgICBwdWJsaWMgc2NvcGU6IGFueSA9IG51bGxcbiAgKSB7fVxufVxuXG4vKipcbiAqIFRoZSBPYnNlcnZhYmxlIGNsYXNzIGlzIGEgc2ltcGxlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBPYnNlcnZhYmxlIHBhdHRlcm4uXG4gKlxuICogVGhlcmUncyBvbmUgc2xpZ2h0IHBhcnRpY3VsYXJpdHkgdGhvdWdoOiBhIGdpdmVuIE9ic2VydmFibGUgY2FuIG5vdGlmeSBpdHMgb2JzZXJ2ZXIgdXNpbmcgYSBwYXJ0aWN1bGFyIG1hc2sgdmFsdWUsIG9ubHkgdGhlIE9ic2VydmVycyByZWdpc3RlcmVkIHdpdGggdGhpcyBtYXNrIHZhbHVlIHdpbGwgYmUgbm90aWZpZWQuXG4gKiBUaGlzIGVuYWJsZSBhIG1vcmUgZmluZSBncmFpbmVkIGV4ZWN1dGlvbiB3aXRob3V0IGhhdmluZyB0byByZWx5IG9uIG11bHRpcGxlIGRpZmZlcmVudCBPYnNlcnZhYmxlIG9iamVjdHMuXG4gKiBGb3IgaW5zdGFuY2UgeW91IG1heSBoYXZlIGEgZ2l2ZW4gT2JzZXJ2YWJsZSB0aGF0IGhhdmUgZm91ciBkaWZmZXJlbnQgdHlwZXMgb2Ygbm90aWZpY2F0aW9uczogTW92ZSAobWFzayA9IDB4MDEpLCBTdG9wIChtYXNrID0gMHgwMiksIFR1cm4gUmlnaHQgKG1hc2sgPSAwWDA0KSwgVHVybiBMZWZ0IChtYXNrID0gMFgwOCkuXG4gKiBBIGdpdmVuIG9ic2VydmVyIGNhbiByZWdpc3RlciBpdHNlbGYgd2l0aCBvbmx5IE1vdmUgYW5kIFN0b3AgKG1hc2sgPSAweDAzKSwgdGhlbiBpdCB3aWxsIG9ubHkgYmUgbm90aWZpZWQgd2hlbiBvbmUgb2YgdGhlc2UgdHdvIG9jY3VycyBhbmQgd2lsbCBuZXZlciBiZSBmb3IgVHVybiBMZWZ0L1JpZ2h0LlxuICpcbiAqIEBkZXByZWNhdGVkIFRoaXMgZnVuY3Rpb24gaXMgYW4gaW5oZXJpdGFuY2Ugb2YgRUNTNiwgaXQncyBoZXJlIHRlbXBvcmFyeSBmb3IgdGhlIGZlYXR1cmUgcGFyaXR5LCBwbGVhc2UgcmVhZCB0aGUgbmV3cyBhbmQgZG9jcyB0byBrbm93IGhvdyBoYW5kbGUgd2hlbiBpdCdzIHJlbW92ZWRcbiAqL1xuZXhwb3J0IGNsYXNzIE9ic2VydmFibGU8VD4ge1xuICBwcml2YXRlIF9vYnNlcnZlcnMgPSBuZXcgQXJyYXk8T2JzZXJ2ZXI8VD4+KClcblxuICBwcml2YXRlIF9ldmVudFN0YXRlOiBPYnNlcnZlckV2ZW50U3RhdGVcblxuICBwcml2YXRlIF9vbk9ic2VydmVyQWRkZWQ6IG51bGwgfCAoKG9ic2VydmVyOiBPYnNlcnZlcjxUPikgPT4gdm9pZCkgPSBudWxsXG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgb2JzZXJ2YWJsZVxuICAgKiBAcGFyYW0gb25PYnNlcnZlckFkZGVkIC0gZGVmaW5lcyBhIGNhbGxiYWNrIHRvIGNhbGwgd2hlbiBhIG5ldyBvYnNlcnZlciBpcyBhZGRlZFxuICAgKi9cbiAgY29uc3RydWN0b3Iob25PYnNlcnZlckFkZGVkPzogKG9ic2VydmVyOiBPYnNlcnZlcjxUPikgPT4gdm9pZCkge1xuICAgIHRoaXMuX2V2ZW50U3RhdGUgPSBuZXcgT2JzZXJ2ZXJFdmVudFN0YXRlKDApXG5cbiAgICBpZiAob25PYnNlcnZlckFkZGVkKSB7XG4gICAgICB0aGlzLl9vbk9ic2VydmVyQWRkZWQgPSBvbk9ic2VydmVyQWRkZWRcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IE9ic2VydmVyIHdpdGggdGhlIHNwZWNpZmllZCBjYWxsYmFja1xuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSB0aGUgY2FsbGJhY2sgdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIGZvciB0aGF0IE9ic2VydmVyXG4gICAqIEBwYXJhbSBtYXNrIC0gdGhlIG1hc2sgdXNlZCB0byBmaWx0ZXIgb2JzZXJ2ZXJzXG4gICAqIEBwYXJhbSBpbnNlcnRGaXJzdCAtIGlmIHRydWUgdGhlIGNhbGxiYWNrIHdpbGwgYmUgaW5zZXJ0ZWQgYXQgdGhlIGZpcnN0IHBvc2l0aW9uLCBoZW5jZSBleGVjdXRlZCBiZWZvcmUgdGhlIG90aGVycyBvbmVzLiBJZiBmYWxzZSAoZGVmYXVsdCBiZWhhdmlvcikgdGhlIGNhbGxiYWNrIHdpbGwgYmUgaW5zZXJ0ZWQgYXQgdGhlIGxhc3QgcG9zaXRpb24sIGV4ZWN1dGVkIGFmdGVyIGFsbCB0aGUgb3RoZXJzIGFscmVhZHkgcHJlc2VudC5cbiAgICogQHBhcmFtIHNjb3BlIC0gb3B0aW9uYWwgc2NvcGUgZm9yIHRoZSBjYWxsYmFjayB0byBiZSBjYWxsZWQgZnJvbVxuICAgKiBAcGFyYW0gdW5yZWdpc3Rlck9uRmlyc3RDYWxsIC0gZGVmaW5lcyBpZiB0aGUgb2JzZXJ2ZXIgYXMgdG8gYmUgdW5yZWdpc3RlcmVkIGFmdGVyIHRoZSBuZXh0IG5vdGlmaWNhdGlvblxuICAgKiBAcmV0dXJucyB0aGUgbmV3IG9ic2VydmVyIGNyZWF0ZWQgZm9yIHRoZSBjYWxsYmFja1xuICAgKi9cbiAgcHVibGljIGFkZChcbiAgICBjYWxsYmFjazogKGV2ZW50RGF0YTogVCwgZXZlbnRTdGF0ZTogT2JzZXJ2ZXJFdmVudFN0YXRlKSA9PiB2b2lkLFxuICAgIG1hc2s6IG51bWJlciA9IC0xLFxuICAgIGluc2VydEZpcnN0ID0gZmFsc2UsXG4gICAgc2NvcGU6IGFueSA9IG51bGwsXG4gICAgdW5yZWdpc3Rlck9uRmlyc3RDYWxsID0gZmFsc2VcbiAgKTogbnVsbCB8IE9ic2VydmVyPFQ+IHtcbiAgICBpZiAoIWNhbGxiYWNrKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE9ic2VydmVyKGNhbGxiYWNrLCBtYXNrLCBzY29wZSlcbiAgICBvYnNlcnZlci51bnJlZ2lzdGVyT25OZXh0Q2FsbCA9IHVucmVnaXN0ZXJPbkZpcnN0Q2FsbFxuXG4gICAgaWYgKGluc2VydEZpcnN0KSB7XG4gICAgICB0aGlzLl9vYnNlcnZlcnMudW5zaGlmdChvYnNlcnZlcilcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fb2JzZXJ2ZXJzLnB1c2gob2JzZXJ2ZXIpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX29uT2JzZXJ2ZXJBZGRlZCkge1xuICAgICAgdGhpcy5fb25PYnNlcnZlckFkZGVkKG9ic2VydmVyKVxuICAgIH1cblxuICAgIHJldHVybiBvYnNlcnZlclxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBPYnNlcnZlciB3aXRoIHRoZSBzcGVjaWZpZWQgY2FsbGJhY2sgYW5kIHVucmVnaXN0ZXJzIGFmdGVyIHRoZSBuZXh0IG5vdGlmaWNhdGlvblxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSB0aGUgY2FsbGJhY2sgdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIGZvciB0aGF0IE9ic2VydmVyXG4gICAqIEByZXR1cm5zIHRoZSBuZXcgb2JzZXJ2ZXIgY3JlYXRlZCBmb3IgdGhlIGNhbGxiYWNrXG4gICAqL1xuICBwdWJsaWMgYWRkT25jZShjYWxsYmFjazogKGV2ZW50RGF0YTogVCwgZXZlbnRTdGF0ZTogT2JzZXJ2ZXJFdmVudFN0YXRlKSA9PiB2b2lkKTogbnVsbCB8IE9ic2VydmVyPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5hZGQoY2FsbGJhY2ssIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHRydWUpXG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGFuIE9ic2VydmVyIGZyb20gdGhlIE9ic2VydmFibGUgb2JqZWN0XG4gICAqIEBwYXJhbSBvYnNlcnZlciAtIHRoZSBpbnN0YW5jZSBvZiB0aGUgT2JzZXJ2ZXIgdG8gcmVtb3ZlXG4gICAqIEByZXR1cm5zIGZhbHNlIGlmIGl0IGRvZXNuJ3QgYmVsb25nIHRvIHRoaXMgT2JzZXJ2YWJsZVxuICAgKi9cbiAgcHVibGljIHJlbW92ZShvYnNlcnZlcjogbnVsbCB8IE9ic2VydmVyPFQ+KTogYm9vbGVhbiB7XG4gICAgaWYgKCFvYnNlcnZlcikge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLl9vYnNlcnZlcnMuaW5kZXhPZihvYnNlcnZlcilcblxuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIHRoaXMuX2RlZmVyVW5yZWdpc3RlcihvYnNlcnZlcilcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGEgY2FsbGJhY2sgZnJvbSB0aGUgT2JzZXJ2YWJsZSBvYmplY3RcbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gdGhlIGNhbGxiYWNrIHRvIHJlbW92ZVxuICAgKiBAcGFyYW0gc2NvcGUgLSBvcHRpb25hbCBzY29wZS4gSWYgdXNlZCBvbmx5IHRoZSBjYWxsYmFja3Mgd2l0aCB0aGlzIHNjb3BlIHdpbGwgYmUgcmVtb3ZlZFxuICAgKiBAcmV0dXJucyBmYWxzZSBpZiBpdCBkb2Vzbid0IGJlbG9uZyB0byB0aGlzIE9ic2VydmFibGVcbiAgICovXG4gIHB1YmxpYyByZW1vdmVDYWxsYmFjayhjYWxsYmFjazogKGV2ZW50RGF0YTogVCwgZXZlbnRTdGF0ZTogT2JzZXJ2ZXJFdmVudFN0YXRlKSA9PiB2b2lkLCBzY29wZT86IGFueSk6IGJvb2xlYW4ge1xuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLl9vYnNlcnZlcnMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBpZiAodGhpcy5fb2JzZXJ2ZXJzW2luZGV4XS5jYWxsYmFjayA9PT0gY2FsbGJhY2sgJiYgKCFzY29wZSB8fCBzY29wZSA9PT0gdGhpcy5fb2JzZXJ2ZXJzW2luZGV4XS5zY29wZSkpIHtcbiAgICAgICAgdGhpcy5fZGVmZXJVbnJlZ2lzdGVyKHRoaXMuX29ic2VydmVyc1tpbmRleF0pXG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogTm90aWZ5IGFsbCBPYnNlcnZlcnMgYnkgY2FsbGluZyB0aGVpciByZXNwZWN0aXZlIGNhbGxiYWNrIHdpdGggdGhlIGdpdmVuIGRhdGFcbiAgICogV2lsbCByZXR1cm4gdHJ1ZSBpZiBhbGwgb2JzZXJ2ZXJzIHdlcmUgZXhlY3V0ZWQsIGZhbHNlIGlmIGFuIG9ic2VydmVyIHNldCBza2lwTmV4dE9ic2VydmVycyB0byB0cnVlLCB0aGVuIHByZXZlbnQgdGhlIHN1YnNlcXVlbnQgb25lcyB0byBleGVjdXRlXG4gICAqIEBwYXJhbSBldmVudERhdGEgLSBkZWZpbmVzIHRoZSBkYXRhIHRvIHNlbmQgdG8gYWxsIG9ic2VydmVyc1xuICAgKiBAcGFyYW0gbWFzayAtIGRlZmluZXMgdGhlIG1hc2sgb2YgdGhlIGN1cnJlbnQgbm90aWZpY2F0aW9uIChvYnNlcnZlcnMgd2l0aCBpbmNvbXBhdGlibGUgbWFzayAoaWUgbWFzayAmIG9ic2VydmVyLm1hc2sgPT09IDApIHdpbGwgbm90IGJlIG5vdGlmaWVkKVxuICAgKiBAcGFyYW0gdGFyZ2V0IC0gZGVmaW5lcyB0aGUgb3JpZ2luYWwgdGFyZ2V0IG9mIHRoZSBzdGF0ZVxuICAgKiBAcGFyYW0gY3VycmVudFRhcmdldCAtIGRlZmluZXMgdGhlIGN1cnJlbnQgdGFyZ2V0IG9mIHRoZSBzdGF0ZVxuICAgKiBAcmV0dXJucyBmYWxzZSBpZiB0aGUgY29tcGxldGUgb2JzZXJ2ZXIgY2hhaW4gd2FzIG5vdCBwcm9jZXNzZWQgKGJlY2F1c2Ugb25lIG9ic2VydmVyIHNldCB0aGUgc2tpcE5leHRPYnNlcnZlcnMgdG8gdHJ1ZSlcbiAgICovXG4gIHB1YmxpYyBub3RpZnlPYnNlcnZlcnMoZXZlbnREYXRhOiBULCBtYXNrOiBudW1iZXIgPSAtMSwgdGFyZ2V0PzogYW55LCBjdXJyZW50VGFyZ2V0PzogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLl9vYnNlcnZlcnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5fZXZlbnRTdGF0ZVxuICAgIHN0YXRlLm1hc2sgPSBtYXNrXG4gICAgc3RhdGUudGFyZ2V0ID0gdGFyZ2V0XG4gICAgc3RhdGUuY3VycmVudFRhcmdldCA9IGN1cnJlbnRUYXJnZXRcbiAgICBzdGF0ZS5za2lwTmV4dE9ic2VydmVycyA9IGZhbHNlXG4gICAgc3RhdGUubGFzdFJldHVyblZhbHVlID0gZXZlbnREYXRhXG5cbiAgICBmb3IgKGNvbnN0IG9icyBvZiB0aGlzLl9vYnNlcnZlcnMpIHtcbiAgICAgIGlmIChvYnMuX3dpbGxCZVVucmVnaXN0ZXJlZCkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAob2JzLm1hc2sgJiBtYXNrKSB7XG4gICAgICAgIGlmIChvYnMuc2NvcGUpIHtcbiAgICAgICAgICBzdGF0ZS5sYXN0UmV0dXJuVmFsdWUgPSBvYnMuY2FsbGJhY2suYXBwbHkob2JzLnNjb3BlLCBbZXZlbnREYXRhLCBzdGF0ZV0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RhdGUubGFzdFJldHVyblZhbHVlID0gb2JzLmNhbGxiYWNrKGV2ZW50RGF0YSwgc3RhdGUpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAob2JzLnVucmVnaXN0ZXJPbk5leHRDYWxsKSB7XG4gICAgICAgICAgdGhpcy5fZGVmZXJVbnJlZ2lzdGVyKG9icylcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHN0YXRlLnNraXBOZXh0T2JzZXJ2ZXJzKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIENhbGxpbmcgdGhpcyB3aWxsIGV4ZWN1dGUgZWFjaCBjYWxsYmFjaywgZXhwZWN0aW5nIGl0IHRvIGJlIGEgcHJvbWlzZSBvciByZXR1cm4gYSB2YWx1ZS5cbiAgICogSWYgYXQgYW55IHBvaW50IGluIHRoZSBjaGFpbiBvbmUgZnVuY3Rpb24gZmFpbHMsIHRoZSBwcm9taXNlIHdpbGwgZmFpbCBhbmQgdGhlIGV4ZWN1dGlvbiB3aWxsIG5vdCBjb250aW51ZS5cbiAgICogVGhpcyBpcyB1c2VmdWwgd2hlbiBhIGNoYWluIG9mIGV2ZW50cyAoc29tZXRpbWVzIGFzeW5jIGV2ZW50cykgaXMgbmVlZGVkIHRvIGluaXRpYWxpemUgYSBjZXJ0YWluIG9iamVjdFxuICAgKiBhbmQgaXQgaXMgY3J1Y2lhbCB0aGF0IGFsbCBjYWxsYmFja3Mgd2lsbCBiZSBleGVjdXRlZC5cbiAgICogVGhlIG9yZGVyIG9mIHRoZSBjYWxsYmFja3MgaXMga2VwdCwgY2FsbGJhY2tzIGFyZSBub3QgZXhlY3V0ZWQgcGFyYWxsZWwuXG4gICAqXG4gICAqIEBwYXJhbSBldmVudERhdGEgLSBUaGUgZGF0YSB0byBiZSBzZW50IHRvIGVhY2ggY2FsbGJhY2tcbiAgICogQHBhcmFtIG1hc2sgLSBpcyB1c2VkIHRvIGZpbHRlciBvYnNlcnZlcnMgZGVmYXVsdHMgdG8gLTFcbiAgICogQHBhcmFtIHRhcmdldCAtIGRlZmluZXMgdGhlIGNhbGxiYWNrIHRhcmdldCAoc2VlIEV2ZW50U3RhdGUpXG4gICAqIEBwYXJhbSBjdXJyZW50VGFyZ2V0IC0gZGVmaW5lcyBoZSBjdXJyZW50IG9iamVjdCBpbiB0aGUgYnViYmxpbmcgcGhhc2VcbiAgICogQHJldHVybnMgd2lsbCByZXR1cm4gYSBQcm9taXNlIHRoYW4gcmVzb2x2ZXMgd2hlbiBhbGwgY2FsbGJhY2tzIGV4ZWN1dGVkIHN1Y2Nlc3NmdWxseS5cbiAgICovXG4gIHB1YmxpYyBub3RpZnlPYnNlcnZlcnNXaXRoUHJvbWlzZShldmVudERhdGE6IFQsIG1hc2s6IG51bWJlciA9IC0xLCB0YXJnZXQ/OiBhbnksIGN1cnJlbnRUYXJnZXQ/OiBhbnkpOiBQcm9taXNlPFQ+IHtcbiAgICAvLyBjcmVhdGUgYW4gZW1wdHkgcHJvbWlzZVxuICAgIGxldCBwOiBQcm9taXNlPGFueT4gPSBQcm9taXNlLnJlc29sdmUoZXZlbnREYXRhKVxuXG4gICAgLy8gbm8gb2JzZXJ2ZXJzPyByZXR1cm4gdGhpcyBwcm9taXNlLlxuICAgIGlmICghdGhpcy5fb2JzZXJ2ZXJzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHBcbiAgICB9XG5cbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX2V2ZW50U3RhdGVcbiAgICBzdGF0ZS5tYXNrID0gbWFza1xuICAgIHN0YXRlLnRhcmdldCA9IHRhcmdldFxuICAgIHN0YXRlLmN1cnJlbnRUYXJnZXQgPSBjdXJyZW50VGFyZ2V0XG4gICAgc3RhdGUuc2tpcE5leHRPYnNlcnZlcnMgPSBmYWxzZVxuXG4gICAgLy8gZXhlY3V0ZSBvbmUgY2FsbGJhY2sgYWZ0ZXIgYW5vdGhlciAobm90IHVzaW5nIFByb21pc2UuYWxsLCB0aGUgb3JkZXIgaXMgaW1wb3J0YW50KVxuICAgIHRoaXMuX29ic2VydmVycy5mb3JFYWNoKChvYnMpID0+IHtcbiAgICAgIGlmIChzdGF0ZS5za2lwTmV4dE9ic2VydmVycykge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGlmIChvYnMuX3dpbGxCZVVucmVnaXN0ZXJlZCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGlmIChvYnMubWFzayAmIG1hc2spIHtcbiAgICAgICAgaWYgKG9icy5zY29wZSkge1xuICAgICAgICAgIHAgPSBwLnRoZW4oKGxhc3RSZXR1cm5lZFZhbHVlKSA9PiB7XG4gICAgICAgICAgICBzdGF0ZS5sYXN0UmV0dXJuVmFsdWUgPSBsYXN0UmV0dXJuZWRWYWx1ZVxuICAgICAgICAgICAgcmV0dXJuIG9icy5jYWxsYmFjay5hcHBseShvYnMuc2NvcGUsIFtldmVudERhdGEsIHN0YXRlXSlcbiAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHAgPSBwLnRoZW4oKGxhc3RSZXR1cm5lZFZhbHVlKSA9PiB7XG4gICAgICAgICAgICBzdGF0ZS5sYXN0UmV0dXJuVmFsdWUgPSBsYXN0UmV0dXJuZWRWYWx1ZVxuICAgICAgICAgICAgcmV0dXJuIG9icy5jYWxsYmFjayhldmVudERhdGEsIHN0YXRlKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9icy51bnJlZ2lzdGVyT25OZXh0Q2FsbCkge1xuICAgICAgICAgIHRoaXMuX2RlZmVyVW5yZWdpc3RlcihvYnMpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuXG4gICAgLy8gcmV0dXJuIHRoZSBldmVudERhdGFcbiAgICByZXR1cm4gcC50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiBldmVudERhdGFcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIE5vdGlmeSBhIHNwZWNpZmljIG9ic2VydmVyXG4gICAqIEBwYXJhbSBvYnNlcnZlciAtIGRlZmluZXMgdGhlIG9ic2VydmVyIHRvIG5vdGlmeVxuICAgKiBAcGFyYW0gZXZlbnREYXRhIC0gZGVmaW5lcyB0aGUgZGF0YSB0byBiZSBzZW50IHRvIGVhY2ggY2FsbGJhY2tcbiAgICogQHBhcmFtIG1hc2sgLSBpcyB1c2VkIHRvIGZpbHRlciBvYnNlcnZlcnMgZGVmYXVsdHMgdG8gLTFcbiAgICovXG4gIHB1YmxpYyBub3RpZnlPYnNlcnZlcihvYnNlcnZlcjogT2JzZXJ2ZXI8VD4sIGV2ZW50RGF0YTogVCwgbWFzazogbnVtYmVyID0gLTEpOiB2b2lkIHtcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX2V2ZW50U3RhdGVcbiAgICBzdGF0ZS5tYXNrID0gbWFza1xuICAgIHN0YXRlLnNraXBOZXh0T2JzZXJ2ZXJzID0gZmFsc2VcblxuICAgIG9ic2VydmVyLmNhbGxiYWNrKGV2ZW50RGF0YSwgc3RhdGUpXG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIGJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGUgb2JzZXJ2YWJsZSBoYXMgYXQgbGVhc3Qgb25lIG9ic2VydmVyXG4gICAqIEByZXR1cm5zIHRydWUgaXMgdGhlIE9ic2VydmFibGUgaGFzIGF0IGxlYXN0IG9uZSBPYnNlcnZlciByZWdpc3RlcmVkXG4gICAqL1xuICBwdWJsaWMgaGFzT2JzZXJ2ZXJzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9vYnNlcnZlcnMubGVuZ3RoID4gMFxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIHRoZSBsaXN0IG9mIG9ic2VydmVyc1xuICAgKi9cbiAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuX29ic2VydmVycyA9IG5ldyBBcnJheTxPYnNlcnZlcjxUPj4oKVxuICAgIHRoaXMuX29uT2JzZXJ2ZXJBZGRlZCA9IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9uZSB0aGUgY3VycmVudCBvYnNlcnZhYmxlXG4gICAqIEByZXR1cm5zIGEgbmV3IG9ic2VydmFibGVcbiAgICovXG4gIHB1YmxpYyBjbG9uZSgpOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICBjb25zdCByZXN1bHQgPSBuZXcgT2JzZXJ2YWJsZTxUPigpXG5cbiAgICByZXN1bHQuX29ic2VydmVycyA9IHRoaXMuX29ic2VydmVycy5zbGljZSgwKVxuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgLyoqXG4gICAqIERvZXMgdGhpcyBvYnNlcnZhYmxlIGhhbmRsZXMgb2JzZXJ2ZXIgcmVnaXN0ZXJlZCB3aXRoIGEgZ2l2ZW4gbWFza1xuICAgKiBAcGFyYW0gbWFzayAtIGRlZmluZXMgdGhlIG1hc2sgdG8gYmUgdGVzdGVkXG4gICAqIEByZXR1cm5zIHdoZXRoZXIgb3Igbm90IG9uZSBvYnNlcnZlciByZWdpc3RlcmVkIHdpdGggdGhlIGdpdmVuIG1hc2sgaXMgaGFuZGVsZWRcbiAgICovXG4gIHB1YmxpYyBoYXNTcGVjaWZpY01hc2sobWFzazogbnVtYmVyID0gLTEpOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IG9icyBvZiB0aGlzLl9vYnNlcnZlcnMpIHtcbiAgICAgIGlmIChvYnMubWFzayAmIG1hc2sgfHwgb2JzLm1hc2sgPT09IG1hc2spIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBwcml2YXRlIF9kZWZlclVucmVnaXN0ZXIob2JzZXJ2ZXI6IE9ic2VydmVyPFQ+KTogdm9pZCB7XG4gICAgb2JzZXJ2ZXIudW5yZWdpc3Rlck9uTmV4dENhbGwgPSBmYWxzZVxuICAgIG9ic2VydmVyLl93aWxsQmVVbnJlZ2lzdGVyZWQgPSB0cnVlXG4gICAgUHJvbWlzZS5yZXNvbHZlKClcbiAgICAgIC50aGVuLmJpbmQoUHJvbWlzZS5yZXNvbHZlKCkpKGFzeW5jICgpID0+IHRoaXMuX3JlbW92ZShvYnNlcnZlcikpXG4gICAgICAuY2F0Y2goY29uc29sZS5lcnJvcilcbiAgfVxuXG4gIC8vIFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIHdoZW4gbm90IGl0ZXJhdGluZyBvdmVyIF9vYnNlcnZlcnMgdG8gYXZvaWQgY2FsbGJhY2sgc2tpcHBpbmcuXG4gIC8vIFJlbW92ZXMgYW4gb2JzZXJ2ZXIgZnJvbSB0aGUgX29ic2VydmVyIEFycmF5LlxuICBwcml2YXRlIF9yZW1vdmUob2JzZXJ2ZXI6IG51bGwgfCBPYnNlcnZlcjxUPik6IGJvb2xlYW4ge1xuICAgIGlmICghb2JzZXJ2ZXIpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fb2JzZXJ2ZXJzLmluZGV4T2Yob2JzZXJ2ZXIpXG5cbiAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICB0aGlzLl9vYnNlcnZlcnMuc3BsaWNlKGluZGV4LCAxKVxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuIiwgImltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICcuL2ludGVybmFsL09ic2VydmFibGUnXG5pbXBvcnQgeyBRdWF0ZXJuaW9uVHlwZSwgVmVjdG9yM1R5cGUgfSBmcm9tICdAZGNsL2VjcydcbmltcG9ydCB7IE1hbnlFbnRpdHlBY3Rpb24sIFNlbmRCYXRjaFJlc3BvbnNlLCBzdWJzY3JpYmUgfSBmcm9tICd+c3lzdGVtL0VuZ2luZUFwaSdcblxubGV0IHN1YnNjcmliZUZ1bmN0aW9uOiB0eXBlb2Ygc3Vic2NyaWJlID0gc3Vic2NyaWJlXG5cbi8qKiBAcHVibGljICovXG5leHBvcnQgdHlwZSBJbnB1dEV2ZW50UmVzdWx0ID0ge1xuICAvKiogT3JpZ2luIG9mIHRoZSByYXksIHJlbGF0aXZlIHRvIHRoZSBzY2VuZSAqL1xuICBvcmlnaW46IFZlY3RvcjNUeXBlXG4gIC8qKiBEaXJlY3Rpb24gdmVjdG9yIG9mIHRoZSByYXkgKG5vcm1hbGl6ZWQpICovXG4gIGRpcmVjdGlvbjogVmVjdG9yM1R5cGVcbiAgLyoqIElEIG9mIHRoZSBwb2ludGVyIHRoYXQgdHJpZ2dlcmVkIHRoZSBldmVudCAqL1xuICBidXR0b25JZDogbnVtYmVyXG4gIC8qKiBEb2VzIHRoaXMgcG9pbnRlciBldmVudCBoaXQgYW55IG9iamVjdD8gKi9cbiAgaGl0Pzoge1xuICAgIC8qKiBMZW5ndGggb2YgdGhlIHJheSAqL1xuICAgIGxlbmd0aDogbnVtYmVyXG4gICAgLyoqIElmIHRoZSByYXkgaGl0cyBhIG1lc2ggdGhlIGludGVyc2VjdGlvbiBwb2ludCB3aWxsIGJlIHRoaXMgKi9cbiAgICBoaXRQb2ludDogVmVjdG9yM1R5cGVcbiAgICAvKiogSWYgdGhlIG1lc2ggaGFzIGEgbmFtZSwgaXQgd2lsbCBiZSBhc3NpZ25lZCB0byBtZXNoTmFtZSAqL1xuICAgIG1lc2hOYW1lOiBzdHJpbmdcbiAgICAvKiogTm9ybWFsIG9mIHRoZSBoaXQgKi9cbiAgICBub3JtYWw6IFZlY3RvcjNUeXBlXG4gICAgLyoqIE5vcm1hbCBvZiB0aGUgaGl0LCBpbiB3b3JsZCBzcGFjZSAqL1xuICAgIHdvcmxkTm9ybWFsOiBWZWN0b3IzVHlwZVxuICAgIC8qKiBIaXQgZW50aXR5IElEIGlmIGFueSAqL1xuICAgIGVudGl0eUlkOiB1bmtub3duXG4gIH1cbn1cblxuLyoqIEBwdWJsaWMgKi9cbmV4cG9ydCB0eXBlIEdsb2JhbElucHV0RXZlbnRSZXN1bHQgPSBJbnB1dEV2ZW50UmVzdWx0ICYge1xuICAvKipcbiAgICogRE9XTiA9IDAsXG4gICAqIFVQID0gMVxuICAgKi9cbiAgdHlwZTogMCB8IDFcbn1cblxuLyoqIEBwdWJsaWMgKi9cbmV4cG9ydCB0eXBlIFJheWNhc3RSZXNwb25zZVBheWxvYWQ8VD4gPSB7XG4gIHF1ZXJ5SWQ6IHN0cmluZ1xuICBxdWVyeVR5cGU6IHN0cmluZ1xuICBwYXlsb2FkOiBUXG59XG5cbi8qKiBAcHVibGljICovXG5leHBvcnQgdHlwZSBHaXptb0RyYWdFbmRFdmVudCA9IHtcbiAgdHlwZTogJ2dpem1vRHJhZ0VuZGVkJ1xuICB0cmFuc2Zvcm1zOiBBcnJheTx7XG4gICAgcG9zaXRpb246IFZlY3RvcjNUeXBlXG4gICAgcm90YXRpb246IFF1YXRlcm5pb25UeXBlXG4gICAgc2NhbGU6IFZlY3RvcjNUeXBlXG4gICAgZW50aXR5SWQ6IHVua25vd25cbiAgfT5cbn1cblxuLyoqIEBwdWJsaWMgKi9cbmV4cG9ydCB0eXBlIEdpem1vU2VsZWN0ZWRFdmVudCA9IHtcbiAgdHlwZTogJ2dpem1vU2VsZWN0ZWQnXG4gIGdpem1vVHlwZTogJ01PVkUnIHwgJ1JPVEFURScgfCAnU0NBTEUnIHwgJ05PTkUnXG4gIGVudGl0aWVzOiBzdHJpbmdbXVxufVxuXG4vLy8gLS0tIEVWRU5UUyAtLS1cblxuLyoqIEBwdWJsaWMgKi9cbmV4cG9ydCB0eXBlIElFdmVudE5hbWVzID0ga2V5b2YgSUV2ZW50c1xuXG4vKiogQHB1YmxpYyAqL1xuZXhwb3J0IHR5cGUgRW5naW5lRXZlbnQ8VCBleHRlbmRzIElFdmVudE5hbWVzID0gSUV2ZW50TmFtZXMsIFYgPSBJRXZlbnRzW1RdPiA9IHtcbiAgLyoqIGV2ZW50TmFtZSAqL1xuICB0eXBlOiBUXG4gIGRhdGE6IFJlYWRvbmx5PFY+XG59XG5cbi8qKlxuICogQHB1YmxpY1xuICogTm90ZTogRG9uJ3QgdXNlIGBvbmAgcHJlZml4IGZvciBJRXZlbnRzIHRvIGF2b2lkIHJlZHVuZGFuY3kgd2l0aCBgZXZlbnQub24oXCJvbkV2ZW50TmFtZVwiKWAgc3ludGF4LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElFdmVudHMge1xuICAvKipcbiAgICogYHBvc2l0aW9uQ2hhbmdlZGAgaXMgdHJpZ2dlcmVkIHdoZW4gdGhlIHBvc2l0aW9uIG9mIHRoZSBjYW1lcmEgY2hhbmdlc1xuICAgKiBUaGlzIGV2ZW50IGlzIHRocm90dGxlZCB0byAxMCB0aW1lcyBwZXIgc2Vjb25kLlxuICAgKi9cbiAgcG9zaXRpb25DaGFuZ2VkOiB7XG4gICAgLyoqIENhbWVyYSBwb3NpdGlvbiByZWxhdGl2ZSB0byB0aGUgYmFzZSBwYXJjZWwgb2YgdGhlIHNjZW5lICovXG4gICAgcG9zaXRpb246IFZlY3RvcjNUeXBlXG5cbiAgICAvKiogQ2FtZXJhIHBvc2l0aW9uLCB0aGlzIGlzIGEgYWJzb2x1dGUgd29ybGQgcG9zaXRpb24gKi9cbiAgICBjYW1lcmFQb3NpdGlvbjogVmVjdG9yM1R5cGVcblxuICAgIC8qKiBFeWUgaGVpZ2h0LCBpbiBtZXRlcnMuICovXG4gICAgcGxheWVySGVpZ2h0OiBudW1iZXJcbiAgfVxuXG4gIC8qKlxuICAgKiBgcm90YXRpb25DaGFuZ2VkYCBpcyB0cmlnZ2VyZWQgd2hlbiB0aGUgcm90YXRpb24gb2YgdGhlIGNhbWVyYSBjaGFuZ2VzLlxuICAgKiBUaGlzIGV2ZW50IGlzIHRocm90dGxlZCB0byAxMCB0aW1lcyBwZXIgc2Vjb25kLlxuICAgKi9cbiAgcm90YXRpb25DaGFuZ2VkOiB7XG4gICAgLyoqIERlZ3JlZSB2ZWN0b3IuIFNhbWUgYXMgZW50aXRpZXMgKi9cbiAgICByb3RhdGlvbjogVmVjdG9yM1R5cGVcbiAgICAvKiogUm90YXRpb24gcXVhdGVybmlvbiwgdXNlZnVsIGluIHNvbWUgc2NlbmFyaW9zLiAqL1xuICAgIHF1YXRlcm5pb246IFF1YXRlcm5pb25UeXBlXG4gIH1cblxuICAvKipcbiAgICogYGNhbWVyYU1vZGVDaGFuZ2VkYCBpcyB0cmlnZ2VyZWQgd2hlbiB0aGUgdXNlciBjaGFuZ2VzIHRoZSBjYW1lcmEgbW9kZVxuICAgKi9cbiAgY2FtZXJhTW9kZUNoYW5nZWQ6IHtcbiAgICAvKipcbiAgICAgKiBGSVJTVF9QRVJTT04gPSAwLFxuICAgICAqIFRISVJEX1BFUlNPTiA9IDEsXG4gICAgICogRlJFRV9DQU1FUkEgPSAyXG4gICAgICovXG4gICAgY2FtZXJhTW9kZTogMCB8IDEgfCAyXG4gIH1cblxuICAvKipcbiAgICogYGlkbGVTdGF0ZUNoYW5nZWRgIGlzIHRyaWdnZXJlZCB3aGVuIHRoZSB1c2VyIG5vdCBtb3ZlcyBmb3IgYSBkZWZpbmVkIHBlcmlvZCBvZiB0aW1lXG4gICAqL1xuICBpZGxlU3RhdGVDaGFuZ2VkOiB7XG4gICAgaXNJZGxlOiBib29sZWFuXG4gIH1cblxuICBwbGF5ZXJFeHByZXNzaW9uOiB7XG4gICAgZXhwcmVzc2lvbklkOiBzdHJpbmdcbiAgfVxuXG4gIC8qKlxuICAgKiBgcG9pbnRlclVwYCBpcyB0cmlnZ2VyZWQgd2hlbiB0aGUgdXNlciByZWxlYXNlcyBhbiBpbnB1dCBwb2ludGVyLlxuICAgKiBJdCBjb3VsZCBiZSBhIFZSIGNvbnRyb2xsZXIsIGEgdG91Y2ggc2NyZWVuIG9yIHRoZSBtb3VzZS5cbiAgICovXG4gIHBvaW50ZXJVcDogSW5wdXRFdmVudFJlc3VsdFxuXG4gIC8qKlxuICAgKiBgcG9pbnRlckRvd25gIGlzIHRyaWdnZXJlZCB3aGVuIHRoZSB1c2VyIHByZXNzIGFuIGlucHV0IHBvaW50ZXIuXG4gICAqIEl0IGNvdWxkIGJlIGEgVlIgY29udHJvbGxlciwgYSB0b3VjaCBzY3JlZW4gb3IgdGhlIG1vdXNlLlxuICAgKi9cbiAgcG9pbnRlckRvd246IElucHV0RXZlbnRSZXN1bHRcblxuICAvKipcbiAgICogYHBvaW50ZXJFdmVudGAgaXMgdHJpZ2dlcmVkIHdoZW4gdGhlIHVzZXIgcHJlc3Mgb3IgcmVsZWFzZXMgYW4gaW5wdXQgcG9pbnRlci5cbiAgICogSXQgY291bGQgYmUgYSBWUiBjb250cm9sbGVyLCBhIHRvdWNoIHNjcmVlbiBvciB0aGUgbW91c2UuXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIHVzZSBhY3Rpb25CdXR0b25FdmVudCBpbnN0ZWFkXG4gICAqL1xuICBwb2ludGVyRXZlbnQ6IEdsb2JhbElucHV0RXZlbnRSZXN1bHRcblxuICAvKipcbiAgICogYGFjdGlvbkJ1dHRvbkV2ZW50YCBpcyB0cmlnZ2VyZWQgd2hlbiB0aGUgdXNlciBwcmVzcyBvciByZWxlYXNlcyBhbiBpbnB1dCBwb2ludGVyLlxuICAgKiBJdCBjb3VsZCBiZSBhIFZSIGNvbnRyb2xsZXIsIGEgdG91Y2ggc2NyZWVuIG9yIHRoZSBtb3VzZS5cbiAgICpcbiAgICogVGhpcyBldmVudCBpcyBleGFjdGx5IHRoZSBzYW1lIGFzIGBwb2ludGVyRXZlbnRgIGJ1dCB0aGUgbG9naWMgaW4gdGhlIEVDUyBoYWQgYW4gdW5zb2x2YWJsZVxuICAgKiBjb25kaXRpb24gdGhhdCByZXF1aXJlZCB1cyB0byBjcmVhdGUgdGhpcyBuZXcgZXZlbnQgdG8gaGFuZGxlIG1vcmUgY2FzZXMgZm9yIG5ldyBidXR0b25zLlxuICAgKi9cbiAgYWN0aW9uQnV0dG9uRXZlbnQ6IEdsb2JhbElucHV0RXZlbnRSZXN1bHRcblxuICAvKipcbiAgICogYHJheWNhc3RSZXNwb25zZWAgaXMgdHJpZ2dlcmVkIGluIHJlc3BvbnNlIHRvIGEgcmF5Y2FzdCBxdWVyeVxuICAgKi9cbiAgcmF5Y2FzdFJlc3BvbnNlOiBSYXljYXN0UmVzcG9uc2VQYXlsb2FkPGFueT5cblxuICAvKipcbiAgICogYGNoYXRNZXNzYWdlYCBpcyB0cmlnZ2VyZWQgd2hlbiB0aGUgdXNlciBzZW5kcyBhIG1lc3NhZ2UgdGhyb3VnaCBjaGF0IGVudGl0eS5cbiAgICovXG4gIGNoYXRNZXNzYWdlOiB7XG4gICAgaWQ6IHN0cmluZ1xuICAgIHNlbmRlcjogc3RyaW5nXG4gICAgbWVzc2FnZTogc3RyaW5nXG4gICAgaXNDb21tYW5kOiBib29sZWFuXG4gIH1cblxuICAvKipcbiAgICogYG9uQ2hhbmdlYCBpcyB0cmlnZ2VyZWQgd2hlbiBhbiBlbnRpdHkgY2hhbmdlcyBpdHMgb3duIGludGVybmFsIHN0YXRlLlxuICAgKiBEaXNwYXRjaGVkIGJ5IHRoZSBgdWktKmAgZW50aXRpZXMgd2hlbiB0aGVpciB2YWx1ZSBpcyBjaGFuZ2VkLiBJdCB0cmlnZ2VycyBhIGNhbGxiYWNrLlxuICAgKiBOb3RpY2U6IE9ubHkgZW50aXRpZXMgd2l0aCBJRCB3aWxsIGJlIGxpc3RlbmluZyBmb3IgY2xpY2sgZXZlbnRzLlxuICAgKi9cbiAgb25DaGFuZ2U6IHtcbiAgICB2YWx1ZT86IGFueVxuICAgIC8qKiBJRCBvZiB0aGUgcG9pbnRlciB0aGF0IHRyaWdnZXJlZCB0aGUgZXZlbnQgKi9cbiAgICBwb2ludGVySWQ/OiBudW1iZXJcbiAgfVxuXG4gIC8qKlxuICAgKiBgb25FbnRlcmAgaXMgdHJpZ2dlcmVkIHdoZW4gdGhlIHVzZXIgaGl0cyB0aGUgXCJFbnRlclwiIGtleSBmcm9tIHRoZSBrZXlib2FyZFxuICAgKiBVc2VkIHByaW5jaXBhbGx5IGJ5IHRoZSBDaGF0IGludGVybmFsIHNjZW5lXG4gICAqL1xuICBvbkVudGVyOiB1bmtub3duXG5cbiAgLyoqXG4gICAqIGBvblBvaW50ZXJMb2NrYCBpcyB0cmlnZ2VyZWQgd2hlbiB0aGUgdXNlciBjbGlja3MgdGhlIHdvcmxkIGNhbnZhcyBhbmQgdGhlXG4gICAqIHBvaW50ZXIgbG9ja3MgdG8gaXQgc28gdGhlIHBvaW50ZXIgbW92ZXMgdGhlIGNhbWVyYVxuICAgKi9cbiAgb25Qb2ludGVyTG9jazoge1xuICAgIGxvY2tlZD86IGJvb2xlYW5cbiAgfVxuXG4gIC8qKlxuICAgKiBgb25BbmltYXRpb25FbmRgIGlzIHRyaWdnZXJlZCB3aGVuIGFuIGFuaW1hdGlvbiBjbGlwIGdldHMgZmluaXNoXG4gICAqL1xuICBvbkFuaW1hdGlvbkVuZDoge1xuICAgIGNsaXBOYW1lOiBzdHJpbmdcbiAgfVxuXG4gIC8qKlxuICAgKiBgb25Gb2N1c2AgaXMgdHJpZ2dlcmVkIHdoZW4gYW4gZW50aXR5IGZvY3VzIGlzIGFjdGl2ZS5cbiAgICogRGlzcGF0Y2hlZCBieSB0aGUgYHVpLWlucHV0YCBhbmQgYHVpLXBhc3N3b3JkYCBlbnRpdGllcyB3aGVuIHRoZSB2YWx1ZSBpcyBjaGFuZ2VkLlxuICAgKiBJdCB0cmlnZ2VycyBhIGNhbGxiYWNrLlxuICAgKlxuICAgKiBOb3RpY2U6IE9ubHkgZW50aXRpZXMgd2l0aCBJRCB3aWxsIGJlIGxpc3RlbmluZyBmb3IgY2xpY2sgZXZlbnRzLlxuICAgKi9cbiAgb25Gb2N1czoge1xuICAgIC8qKiBJRCBvZiB0aGUgZW50aXRpeSBvZiB0aGUgZXZlbnQgKi9cbiAgICBlbnRpdHlJZDogdW5rbm93blxuICAgIC8qKiBJRCBvZiB0aGUgcG9pbnRlciB0aGF0IHRyaWdnZXJlZCB0aGUgZXZlbnQgKi9cbiAgICBwb2ludGVySWQ6IG51bWJlclxuICB9XG5cbiAgLyoqXG4gICAqIGBvbkJsdXJgIGlzIHRyaWdnZXJlZCB3aGVuIGFuIGVudGl0eSBsb3NlcyBpdHMgZm9jdXMuXG4gICAqIERpc3BhdGNoZWQgYnkgdGhlIGB1aS1pbnB1dGAgYW5kIGB1aS1wYXNzd29yZGAgZW50aXRpZXMgd2hlbiB0aGUgdmFsdWUgaXMgY2hhbmdlZC5cbiAgICogIEl0IHRyaWdnZXJzIGEgY2FsbGJhY2suXG4gICAqXG4gICAqIE5vdGljZTogT25seSBlbnRpdGllcyB3aXRoIElEIHdpbGwgYmUgbGlzdGVuaW5nIGZvciBjbGljayBldmVudHMuXG4gICAqL1xuICBvbkJsdXI6IHtcbiAgICAvKiogSUQgb2YgdGhlIGVudGl0aXkgb2YgdGhlIGV2ZW50ICovXG4gICAgZW50aXR5SWQ6IHVua25vd25cbiAgICAvKiogSUQgb2YgdGhlIHBvaW50ZXIgdGhhdCB0cmlnZ2VyZWQgdGhlIGV2ZW50ICovXG4gICAgcG9pbnRlcklkOiBudW1iZXJcbiAgfVxuXG4gIC8qKiBUaGUgb25DbGljayBldmVudCBpcyBvbmx5IHVzZWQgZm9yIFVJIGVsZW1lbnRzICovXG4gIG9uQ2xpY2s6IHtcbiAgICBlbnRpdHlJZDogdW5rbm93blxuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgZXZlbnQgZ2V0cyB0cmlnZ2VyZWQgd2hlbiBhbiBlbnRpdHkgbGVhdmVzIHRoZSBzY2VuZSBmZW5jZXMuXG4gICAqL1xuICBlbnRpdHlPdXRPZlNjZW5lOiB7XG4gICAgZW50aXR5SWQ6IHVua25vd25cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGV2ZW50IGdldHMgdHJpZ2dlcmVkIHdoZW4gYW4gZW50aXR5IGVudGVycyB0aGUgc2NlbmUgZmVuY2VzLlxuICAgKi9cbiAgZW50aXR5QmFja0luU2NlbmU6IHtcbiAgICBlbnRpdHlJZDogdW5rbm93blxuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgZXZlbnQgZ2V0cyB0cmlnZ2VyZWQgd2hlbiB0aGUgdXNlciBlbnRlcnMgdGhlIHNjZW5lXG4gICAqL1xuICBvbkVudGVyU2NlbmU6IHtcbiAgICB1c2VySWQ6IHN0cmluZ1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgZXZlbnQgZ2V0cyB0cmlnZ2VyZWQgd2hlbiB0aGUgdXNlciBsZWF2ZXMgdGhlIHNjZW5lXG4gICAqL1xuICBvbkxlYXZlU2NlbmU6IHtcbiAgICB1c2VySWQ6IHN0cmluZ1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgZXZlbnQgZ2V0cyB0cmlnZ2VyZWQgYWZ0ZXIgcmVjZWl2aW5nIGEgY29tbXMgbWVzc2FnZS5cbiAgICovXG4gIGNvbW1zOiB7XG4gICAgc2VuZGVyOiBzdHJpbmdcbiAgICBtZXNzYWdlOiBzdHJpbmdcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGlzIHRyaWdnZXJlZCBvbmNlIHRoZSBzY2VuZSBzaG91bGQgc3RhcnQuXG4gICAqL1xuICBzY2VuZVN0YXJ0OiB1bmtub3duXG5cbiAgLyoqXG4gICAqIFRoaXMgaXMgdHJpZ2dlcmVkIG9uY2UgdGhlIGJ1aWxkZXIgc2NlbmUgaXMgbG9hZGVkLlxuICAgKi9cbiAgYnVpbGRlclNjZW5lU3RhcnQ6IHVua25vd25cblxuICAvKipcbiAgICogVGhpcyBpcyB0cmlnZ2VyZWQgb25jZSB0aGUgYnVpbGRlciBzY2VuZSBpcyB1bmxvYWRlZC5cbiAgICovXG4gIGJ1aWxkZXJTY2VuZVVubG9hZGVkOiB1bmtub3duXG5cbiAgLyoqXG4gICAqIEFmdGVyIGNoZWNraW5nIGVudGl0aWVzIG91dHNpZGUgdGhlIGZlbmNlcywgaWYgYW55IGlzIG91dHNpZGUsIHRoaXMgZXZlbnRcbiAgICogd2lsbCBiZSB0cmlnZ2VyZWQgd2l0aCBhbGwgdGhlIGVudGl0aWVzIG91dHNpZGUgdGhlIHNjZW5lLlxuICAgKi9cbiAgZW50aXRpZXNPdXRPZkJvdW5kYXJpZXM6IHtcbiAgICBlbnRpdGllczogc3RyaW5nW11cbiAgfVxuXG4gIHV1aWRFdmVudDoge1xuICAgIHV1aWQ6IHN0cmluZ1xuICAgIHBheWxvYWQ6IGFueVxuICB9XG5cbiAgb25UZXh0U3VibWl0OiB7XG4gICAgdGV4dDogc3RyaW5nXG4gIH1cblxuICBtZXRyaWNzVXBkYXRlOiB7XG4gICAgZ2l2ZW46IFJlY29yZDxzdHJpbmcsIG51bWJlcj5cbiAgICBsaW1pdDogUmVjb3JkPHN0cmluZywgbnVtYmVyPlxuICB9XG5cbiAgbGltaXRzRXhjZWVkZWQ6IHtcbiAgICBnaXZlbjogUmVjb3JkPHN0cmluZywgbnVtYmVyPlxuICAgIGxpbWl0OiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+XG4gIH1cblxuICAvKiogRm9yIGdpem1vcyAqL1xuICBnaXptb0V2ZW50OiBHaXptb0RyYWdFbmRFdmVudCB8IEdpem1vU2VsZWN0ZWRFdmVudFxuXG4gIGV4dGVybmFsQWN0aW9uOiB7XG4gICAgdHlwZTogc3RyaW5nXG4gICAgW2tleTogc3RyaW5nXTogYW55XG4gIH1cblxuICBzdGF0ZUV2ZW50OiB7XG4gICAgdHlwZTogc3RyaW5nXG4gICAgcGF5bG9hZDogYW55XG4gIH1cblxuICAvKiogVGhpcyBpcyB0cmlnZ2VyZWQgYXQgbGVhc3QgZm9yIGVhY2ggdmlkZW9TdGF0dXMgY2hhbmdlICovXG4gIHZpZGVvRXZlbnQ6IHtcbiAgICBjb21wb25lbnRJZDogc3RyaW5nXG4gICAgdmlkZW9DbGlwSWQ6IHN0cmluZ1xuICAgIC8qKiBTdGF0dXMsIGNhbiBiZSBOT05FID0gMCwgRVJST1IgPSAxLCBMT0FESU5HID0gMiwgUkVBRFkgPSAzLCBQTEFZSU5HID0gNCxCVUZGRVJJTkcgPSA1ICovXG4gICAgdmlkZW9TdGF0dXM6IG51bWJlclxuICAgIC8qKiBDdXJyZW50IG9mZnNldCBwb3NpdGlvbiBpbiBzZWNvbmRzICovXG4gICAgY3VycmVudE9mZnNldDogbnVtYmVyXG4gICAgLyoqIFZpZGVvIGxlbmd0aCBpbiBzZWNvbmRzLiBDYW4gYmUgLTEgKi9cbiAgICB0b3RhbFZpZGVvTGVuZ3RoOiBudW1iZXJcbiAgfVxuXG4gIC8qKiBUaGlzIGlzIHRyaWdnZXIgZXZlcnl0aW1lIGEgcHJvZmlsZSBpcyBjaGFuZ2VkICovXG4gIHByb2ZpbGVDaGFuZ2VkOiB7XG4gICAgZXRoQWRkcmVzczogc3RyaW5nXG4gICAgdmVyc2lvbjogbnVtYmVyXG4gIH1cblxuICAvKiogVHJpZ2dlcmVkIHdoZW4gcGVlcidzIGF2YXRhciBpcyBjb25uZWN0ZWQgYW5kIHZpc2libGUgKi9cbiAgcGxheWVyQ29ubmVjdGVkOiB7XG4gICAgdXNlcklkOiBzdHJpbmdcbiAgfVxuXG4gIC8qKiBUcmlnZ2VyZWQgd2hlbiBwZWVyIGRpc2Nvbm5lY3QgYW5kL29yIGl0IGF2YXRhciBpcyBzZXQgaW52aXNpYmxlIGJ5IGNvbW1zICovXG4gIHBsYXllckRpc2Nvbm5lY3RlZDoge1xuICAgIHVzZXJJZDogc3RyaW5nXG4gIH1cblxuICAvKiogVHJpZ2dlcmVkIHdoZW4gY3VycmVudCByZWFsbSBvciBpc2xhbmQgY2hhbmdlcyAqL1xuICBvblJlYWxtQ2hhbmdlZDoge1xuICAgIGRvbWFpbjogc3RyaW5nXG4gICAgcm9vbTogc3RyaW5nXG4gICAgc2VydmVyTmFtZTogc3RyaW5nXG4gICAgZGlzcGxheU5hbWU6IHN0cmluZ1xuICB9XG5cbiAgLyoqIFRyaWdnZXJlZCB3aGVuIG90aGVyIHBsYXllcidzIGF2YXRhciBpcyBjbGlja2VkICovXG4gIHBsYXllckNsaWNrZWQ6IHtcbiAgICB1c2VySWQ6IHN0cmluZ1xuICAgIHJheToge1xuICAgICAgb3JpZ2luOiBWZWN0b3IzVHlwZVxuICAgICAgZGlyZWN0aW9uOiBWZWN0b3IzVHlwZVxuICAgICAgZGlzdGFuY2U6IG51bWJlclxuICAgIH1cbiAgfVxuXG4gIC8qKiBUcmlnZ2VyZWQgd2hlbiBwb2ludGVyIHN0YXJ0IGhvdmVyaW5nIGFuIGVudGl0aWVzJyBzaGFwZSAqL1xuICBwb2ludGVySG92ZXJFbnRlcjogdW5rbm93blxuXG4gIC8qKiBUcmlnZ2VyZWQgd2hlbiBwb2ludGVyIHN0b3AgaG92ZXJpbmcgYW4gZW50aXRpZXMnIHNoYXBlICovXG4gIHBvaW50ZXJIb3ZlckV4aXQ6IHVua25vd25cbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqIFRoaXMgZnVuY3Rpb24gZ2VuZXJhdGVzIGEgY2FsbGJhY2sgdGhhdCBpcyBwYXNzZWQgdG8gdGhlIE9ic2VydmFibGVcbiAqIGNvbnN0cnVjdG9yIHRvIHN1YnNjcmliZSB0byB0aGUgZXZlbnRzIG9mIHRoZSBEZWNlbnRyYWxhbmRJbnRlcmZhY2VcbiAqL1xuZnVuY3Rpb24gY3JlYXRlU3Vic2NyaWJlcihldmVudE5hbWU6IHN0cmluZykge1xuICByZXR1cm4gKCkgPT4ge1xuICAgIHN1YnNjcmliZUZ1bmN0aW9uKHsgZXZlbnRJZDogZXZlbnROYW1lIH0pLmNhdGNoKGNvbnNvbGUuZXJyb3IpXG4gIH1cbn1cblxuLyoqXG4gKiBUaGVzZSBldmVudHMgYXJlIHRyaWdnZXJlZCBhZnRlciB5b3VyIGNoYXJhY3RlciBlbnRlcnMgdGhlIHNjZW5lLlxuICogQHB1YmxpY1xuICogQGRlcHJlY2F0ZWQgVGhpcyBmdW5jdGlvbiBpcyBhbiBpbmhlcml0YW5jZSBvZiBFQ1M2LCBpdCdzIGhlcmUgdGVtcG9yYXJ5IGZvciB0aGUgZmVhdHVyZSBwYXJpdHksIHBsZWFzZSByZWFkIHRoZSBuZXdzIGFuZCBkb2NzIHRvIGtub3cgaG93IGhhbmRsZSB3aGVuIGl0J3MgcmVtb3ZlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IG9uRW50ZXJTY2VuZU9ic2VydmFibGUgPSBuZXcgT2JzZXJ2YWJsZTxJRXZlbnRzWydvbkVudGVyU2NlbmUnXT4oY3JlYXRlU3Vic2NyaWJlcignb25FbnRlclNjZW5lJykpXG4vKiogQHB1YmxpY1xuICogQGRlcHJlY2F0ZWQgVGhpcyBmdW5jdGlvbiBpcyBhbiBpbmhlcml0YW5jZSBvZiBFQ1M2LCBpdCdzIGhlcmUgdGVtcG9yYXJ5IGZvciB0aGUgZmVhdHVyZSBwYXJpdHksIHBsZWFzZSByZWFkIHRoZSBuZXdzIGFuZCBkb2NzIHRvIGtub3cgaG93IGhhbmRsZSB3aGVuIGl0J3MgcmVtb3ZlZC5cbiAqIEBkZXByZWNhdGVkIFRoaXMgZnVuY3Rpb24gaXMgYW4gaW5oZXJpdGFuY2Ugb2YgRUNTNiwgaXQncyBoZXJlIHRlbXBvcmFyeSBmb3IgdGhlIGZlYXR1cmUgcGFyaXR5LCBwbGVhc2UgcmVhZCB0aGUgbmV3cyBhbmQgZG9jcyB0byBrbm93IGhvdyBoYW5kbGUgd2hlbiBpdCdzIHJlbW92ZWQuIFVzZSBvbkVudGVyU2NlbmVPYnNlcnZhYmxlIGluc3RlYWQuICovXG5leHBvcnQgY29uc3Qgb25FbnRlclNjZW5lID0gb25FbnRlclNjZW5lT2JzZXJ2YWJsZVxuXG4vKipcbiAqIFRoZXNlIGV2ZW50cyBhcmUgdHJpZ2dlcmVkIGFmdGVyIHlvdXIgY2hhcmFjdGVyIGxlYXZlcyB0aGUgc2NlbmUuXG4gKiBAcHVibGljXG4gKiBAZGVwcmVjYXRlZCBUaGlzIGZ1bmN0aW9uIGlzIGFuIGluaGVyaXRhbmNlIG9mIEVDUzYsIGl0J3MgaGVyZSB0ZW1wb3JhcnkgZm9yIHRoZSBmZWF0dXJlIHBhcml0eSwgcGxlYXNlIHJlYWQgdGhlIG5ld3MgYW5kIGRvY3MgdG8ga25vdyBob3cgaGFuZGxlIHdoZW4gaXQncyByZW1vdmVkLlxuICovXG5leHBvcnQgY29uc3Qgb25MZWF2ZVNjZW5lT2JzZXJ2YWJsZSA9IG5ldyBPYnNlcnZhYmxlPElFdmVudHNbJ29uTGVhdmVTY2VuZSddPihjcmVhdGVTdWJzY3JpYmVyKCdvbkxlYXZlU2NlbmUnKSlcblxuLyoqIEBwdWJsaWNcbiAqIEBkZXByZWNhdGVkIFRoaXMgZnVuY3Rpb24gaXMgYW4gaW5oZXJpdGFuY2Ugb2YgRUNTNiwgaXQncyBoZXJlIHRlbXBvcmFyeSBmb3IgdGhlIGZlYXR1cmUgcGFyaXR5LCBwbGVhc2UgcmVhZCB0aGUgbmV3cyBhbmQgZG9jcyB0byBrbm93IGhvdyBoYW5kbGUgd2hlbiBpdCdzIHJlbW92ZWQuXG4gKiBAZGVwcmVjYXRlZCBUaGlzIGZ1bmN0aW9uIGlzIGFuIGluaGVyaXRhbmNlIG9mIEVDUzYsIGl0J3MgaGVyZSB0ZW1wb3JhcnkgZm9yIHRoZSBmZWF0dXJlIHBhcml0eSwgcGxlYXNlIHJlYWQgdGhlIG5ld3MgYW5kIGRvY3MgdG8ga25vdyBob3cgaGFuZGxlIHdoZW4gaXQncyByZW1vdmVkLiBVc2Ugb25MZWF2ZVNjZW5lT2JzZXJ2YWJsZSBpbnN0ZWFkLiAqL1xuZXhwb3J0IGNvbnN0IG9uTGVhdmVTY2VuZSA9IG9uTGVhdmVTY2VuZU9ic2VydmFibGVcblxuLyoqXG4gKiBUaGlzIGV2ZW50IGlzIHRyaWdnZXJlZCBhZnRlciBhbGwgdGhlIHJlc291cmNlcyBvZiB0aGUgc2NlbmUgd2VyZSBsb2FkZWQgKG1vZGVscywgdGV4dHVyZXMsIGV0Yy4uLilcbiAqIEBwdWJsaWNcbiAqIEBkZXByZWNhdGVkIFRoaXMgZnVuY3Rpb24gaXMgYW4gaW5oZXJpdGFuY2Ugb2YgRUNTNiwgaXQncyBoZXJlIHRlbXBvcmFyeSBmb3IgdGhlIGZlYXR1cmUgcGFyaXR5LCBwbGVhc2UgcmVhZCB0aGUgbmV3cyBhbmQgZG9jcyB0byBrbm93IGhvdyBoYW5kbGUgd2hlbiBpdCdzIHJlbW92ZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBvblNjZW5lUmVhZHlPYnNlcnZhYmxlID0gbmV3IE9ic2VydmFibGU8SUV2ZW50c1snc2NlbmVTdGFydCddPihjcmVhdGVTdWJzY3JpYmVyKCdzY2VuZVN0YXJ0JykpXG5cbi8qKlxuICogQHB1YmxpY1xuICogQGRlcHJlY2F0ZWQgVGhpcyBmdW5jdGlvbiBpcyBhbiBpbmhlcml0YW5jZSBvZiBFQ1M2LCBpdCdzIGhlcmUgdGVtcG9yYXJ5IGZvciB0aGUgZmVhdHVyZSBwYXJpdHksIHBsZWFzZSByZWFkIHRoZSBuZXdzIGFuZCBkb2NzIHRvIGtub3cgaG93IGhhbmRsZSB3aGVuIGl0J3MgcmVtb3ZlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IG9uUGxheWVyRXhwcmVzc2lvbk9ic2VydmFibGUgPSBuZXcgT2JzZXJ2YWJsZTxJRXZlbnRzWydwbGF5ZXJFeHByZXNzaW9uJ10+KFxuICBjcmVhdGVTdWJzY3JpYmVyKCdwbGF5ZXJFeHByZXNzaW9uJylcbilcblxuLyoqXG4gKiBAcHVibGljXG4gKiBAZGVwcmVjYXRlZCBUaGlzIGZ1bmN0aW9uIGlzIGFuIGluaGVyaXRhbmNlIG9mIEVDUzYsIGl0J3MgaGVyZSB0ZW1wb3JhcnkgZm9yIHRoZSBmZWF0dXJlIHBhcml0eSwgcGxlYXNlIHJlYWQgdGhlIG5ld3MgYW5kIGRvY3MgdG8ga25vdyBob3cgaGFuZGxlIHdoZW4gaXQncyByZW1vdmVkLlxuICovXG5leHBvcnQgY29uc3Qgb25WaWRlb0V2ZW50ID0gbmV3IE9ic2VydmFibGU8SUV2ZW50c1sndmlkZW9FdmVudCddPihjcmVhdGVTdWJzY3JpYmVyKCd2aWRlb0V2ZW50JykpXG5cbi8qKlxuICogQHB1YmxpY1xuICogQGRlcHJlY2F0ZWQgVGhpcyBmdW5jdGlvbiBpcyBhbiBpbmhlcml0YW5jZSBvZiBFQ1M2LCBpdCdzIGhlcmUgdGVtcG9yYXJ5IGZvciB0aGUgZmVhdHVyZSBwYXJpdHksIHBsZWFzZSByZWFkIHRoZSBuZXdzIGFuZCBkb2NzIHRvIGtub3cgaG93IGhhbmRsZSB3aGVuIGl0J3MgcmVtb3ZlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IG9uUHJvZmlsZUNoYW5nZWQgPSBuZXcgT2JzZXJ2YWJsZTxJRXZlbnRzWydwcm9maWxlQ2hhbmdlZCddPihjcmVhdGVTdWJzY3JpYmVyKCdwcm9maWxlQ2hhbmdlZCcpKVxuXG4vKipcbiAqIEBwdWJsaWNcbiAqIEBkZXByZWNhdGVkIFRoaXMgZnVuY3Rpb24gaXMgYW4gaW5oZXJpdGFuY2Ugb2YgRUNTNiwgaXQncyBoZXJlIHRlbXBvcmFyeSBmb3IgdGhlIGZlYXR1cmUgcGFyaXR5LCBwbGVhc2UgcmVhZCB0aGUgbmV3cyBhbmQgZG9jcyB0byBrbm93IGhvdyBoYW5kbGUgd2hlbiBpdCdzIHJlbW92ZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBvblBsYXllckNvbm5lY3RlZE9ic2VydmFibGUgPSBuZXcgT2JzZXJ2YWJsZTxJRXZlbnRzWydwbGF5ZXJDb25uZWN0ZWQnXT4oXG4gIGNyZWF0ZVN1YnNjcmliZXIoJ3BsYXllckNvbm5lY3RlZCcpXG4pXG5cbi8qKlxuICogQHB1YmxpY1xuICogQGRlcHJlY2F0ZWQgVGhpcyBmdW5jdGlvbiBpcyBhbiBpbmhlcml0YW5jZSBvZiBFQ1M2LCBpdCdzIGhlcmUgdGVtcG9yYXJ5IGZvciB0aGUgZmVhdHVyZSBwYXJpdHksIHBsZWFzZSByZWFkIHRoZSBuZXdzIGFuZCBkb2NzIHRvIGtub3cgaG93IGhhbmRsZSB3aGVuIGl0J3MgcmVtb3ZlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IG9uUGxheWVyRGlzY29ubmVjdGVkT2JzZXJ2YWJsZSA9IG5ldyBPYnNlcnZhYmxlPElFdmVudHNbJ3BsYXllckRpc2Nvbm5lY3RlZCddPihcbiAgY3JlYXRlU3Vic2NyaWJlcigncGxheWVyRGlzY29ubmVjdGVkJylcbilcblxuLyoqXG4gKiBAcHVibGljXG4gKiBAZGVwcmVjYXRlZCBUaGlzIGZ1bmN0aW9uIGlzIGFuIGluaGVyaXRhbmNlIG9mIEVDUzYsIGl0J3MgaGVyZSB0ZW1wb3JhcnkgZm9yIHRoZSBmZWF0dXJlIHBhcml0eSwgcGxlYXNlIHJlYWQgdGhlIG5ld3MgYW5kIGRvY3MgdG8ga25vdyBob3cgaGFuZGxlIHdoZW4gaXQncyByZW1vdmVkLlxuICovXG5leHBvcnQgY29uc3Qgb25SZWFsbUNoYW5nZWRPYnNlcnZhYmxlID0gbmV3IE9ic2VydmFibGU8SUV2ZW50c1snb25SZWFsbUNoYW5nZWQnXT4oY3JlYXRlU3Vic2NyaWJlcignb25SZWFsbUNoYW5nZWQnKSlcblxuLyoqXG4gKiBAcHVibGljXG4gKiBAZGVwcmVjYXRlZCBUaGlzIGZ1bmN0aW9uIGlzIGFuIGluaGVyaXRhbmNlIG9mIEVDUzYsIGl0J3MgaGVyZSB0ZW1wb3JhcnkgZm9yIHRoZSBmZWF0dXJlIHBhcml0eSwgcGxlYXNlIHJlYWQgdGhlIG5ld3MgYW5kIGRvY3MgdG8ga25vdyBob3cgaGFuZGxlIHdoZW4gaXQncyByZW1vdmVkLlxuICovXG5leHBvcnQgY29uc3Qgb25QbGF5ZXJDbGlja2VkT2JzZXJ2YWJsZSA9IG5ldyBPYnNlcnZhYmxlPElFdmVudHNbJ3BsYXllckNsaWNrZWQnXT4oY3JlYXRlU3Vic2NyaWJlcigncGxheWVyQ2xpY2tlZCcpKVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICogQGRlcHJlY2F0ZWQgVGhpcyBmdW5jdGlvbiBpcyBhbiBpbmhlcml0YW5jZSBvZiBFQ1M2LCBpdCdzIGhlcmUgdGVtcG9yYXJ5IGZvciB0aGUgZmVhdHVyZSBwYXJpdHksIHBsZWFzZSByZWFkIHRoZSBuZXdzIGFuZCBkb2NzIHRvIGtub3cgaG93IGhhbmRsZSB3aGVuIGl0J3MgcmVtb3ZlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IG9uQ29tbXNNZXNzYWdlID0gbmV3IE9ic2VydmFibGU8SUV2ZW50c1snY29tbXMnXT4oY3JlYXRlU3Vic2NyaWJlcignY29tbXMnKSlcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqIFVzZWQgZm9yIHRlc3RpbmcgcHVycG9zZVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0U3Vic2NyaWJlRnVuY3Rpb24oZm46IChldmVudDogeyBldmVudElkOiBzdHJpbmcgfSkgPT4gUHJvbWlzZTxhbnk+KSB7XG4gIHN1YnNjcmliZUZ1bmN0aW9uID0gZm5cbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqIEBkZXByZWNhdGVkIHRoaXMgaXMgYW4gT0xEIEFQSS5cbiAqIFRoaXMgZnVuY3Rpb24gdXNlcyB0aGUgU0RLNiBzZW5kQmF0Y2ggdG8gcG9sbCBldmVudHMgZnJvbSB0aGUgcmVuZGVyZXJcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBvbGxFdmVudHMoc2VuZEJhdGNoOiAoYm9keTogTWFueUVudGl0eUFjdGlvbikgPT4gUHJvbWlzZTxTZW5kQmF0Y2hSZXNwb25zZT4pIHtcbiAgY29uc3QgeyBldmVudHMgfSA9IGF3YWl0IHNlbmRCYXRjaCh7IGFjdGlvbnM6IFtdIH0pXG4gIGZvciAoY29uc3QgZSBvZiBldmVudHMpIHtcbiAgICBpZiAoZS5nZW5lcmljKSB7XG4gICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShlLmdlbmVyaWMuZXZlbnREYXRhKVxuICAgICAgc3dpdGNoIChlLmdlbmVyaWMuZXZlbnRJZCkge1xuICAgICAgICBjYXNlICdvbkVudGVyU2NlbmUnOiB7XG4gICAgICAgICAgb25FbnRlclNjZW5lT2JzZXJ2YWJsZS5ub3RpZnlPYnNlcnZlcnMoZGF0YSBhcyBJRXZlbnRzWydvbkVudGVyU2NlbmUnXSlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ29uTGVhdmVTY2VuZSc6IHtcbiAgICAgICAgICBvbkxlYXZlU2NlbmVPYnNlcnZhYmxlLm5vdGlmeU9ic2VydmVycyhkYXRhIGFzIElFdmVudHNbJ29uTGVhdmVTY2VuZSddKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnc2NlbmVTdGFydCc6IHtcbiAgICAgICAgICBvblNjZW5lUmVhZHlPYnNlcnZhYmxlLm5vdGlmeU9ic2VydmVycyhkYXRhIGFzIElFdmVudHNbJ3NjZW5lU3RhcnQnXSlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3BsYXllckV4cHJlc3Npb24nOiB7XG4gICAgICAgICAgb25QbGF5ZXJFeHByZXNzaW9uT2JzZXJ2YWJsZS5ub3RpZnlPYnNlcnZlcnMoZGF0YSBhcyBJRXZlbnRzWydwbGF5ZXJFeHByZXNzaW9uJ10pXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICd2aWRlb0V2ZW50Jzoge1xuICAgICAgICAgIGNvbnN0IHZpZGVvRGF0YSA9IGRhdGEgYXMgSUV2ZW50c1sndmlkZW9FdmVudCddXG4gICAgICAgICAgb25WaWRlb0V2ZW50Lm5vdGlmeU9ic2VydmVycyh2aWRlb0RhdGEpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdwcm9maWxlQ2hhbmdlZCc6IHtcbiAgICAgICAgICBvblByb2ZpbGVDaGFuZ2VkLm5vdGlmeU9ic2VydmVycyhkYXRhIGFzIElFdmVudHNbJ3Byb2ZpbGVDaGFuZ2VkJ10pXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdwbGF5ZXJDb25uZWN0ZWQnOiB7XG4gICAgICAgICAgb25QbGF5ZXJDb25uZWN0ZWRPYnNlcnZhYmxlLm5vdGlmeU9ic2VydmVycyhkYXRhIGFzIElFdmVudHNbJ3BsYXllckNvbm5lY3RlZCddKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAncGxheWVyRGlzY29ubmVjdGVkJzoge1xuICAgICAgICAgIG9uUGxheWVyRGlzY29ubmVjdGVkT2JzZXJ2YWJsZS5ub3RpZnlPYnNlcnZlcnMoZGF0YSBhcyBJRXZlbnRzWydwbGF5ZXJEaXNjb25uZWN0ZWQnXSlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ29uUmVhbG1DaGFuZ2VkJzoge1xuICAgICAgICAgIG9uUmVhbG1DaGFuZ2VkT2JzZXJ2YWJsZS5ub3RpZnlPYnNlcnZlcnMoZGF0YSBhcyBJRXZlbnRzWydvblJlYWxtQ2hhbmdlZCddKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAncGxheWVyQ2xpY2tlZCc6IHtcbiAgICAgICAgICBvblBsYXllckNsaWNrZWRPYnNlcnZhYmxlLm5vdGlmeU9ic2VydmVycyhkYXRhIGFzIElFdmVudHNbJ3BsYXllckNsaWNrZWQnXSlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2NvbW1zJzoge1xuICAgICAgICAgIG9uQ29tbXNNZXNzYWdlLm5vdGlmeU9ic2VydmVycyhkYXRhIGFzIElFdmVudHNbJ2NvbW1zJ10pXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwgImV4cG9ydCBjb25zdCBjb21wb3NpdGVGcm9tTG9hZGVyID0geydhc3NldHMvc2NlbmUvbWFpbi5jb21wb3NpdGUnOntcInZlcnNpb25cIjoxLFwiY29tcG9uZW50c1wiOlt7XCJuYW1lXCI6XCJjb21wb3NpdGU6OnJvb3RcIixcImpzb25TY2hlbWFcIjp7XCJ0eXBlXCI6XCJvYmplY3RcIixcInByb3BlcnRpZXNcIjp7XCJzcmNcIjp7XCJ0eXBlXCI6XCJzdHJpbmdcIixcInNlcmlhbGl6YXRpb25UeXBlXCI6XCJ1dGY4LXN0cmluZ1wifSxcImVudGl0aWVzXCI6e1widHlwZVwiOlwiYXJyYXlcIixcIml0ZW1zXCI6e1widHlwZVwiOlwib2JqZWN0XCIsXCJwcm9wZXJ0aWVzXCI6e1wic3JjXCI6e1widHlwZVwiOlwiaW50ZWdlclwiLFwic2VyaWFsaXphdGlvblR5cGVcIjpcImVudGl0eVwifSxcImRlc3RcIjp7XCJ0eXBlXCI6XCJpbnRlZ2VyXCIsXCJzZXJpYWxpemF0aW9uVHlwZVwiOlwiZW50aXR5XCJ9fSxcInNlcmlhbGl6YXRpb25UeXBlXCI6XCJtYXBcIn0sXCJzZXJpYWxpemF0aW9uVHlwZVwiOlwiYXJyYXlcIn19LFwic2VyaWFsaXphdGlvblR5cGVcIjpcIm1hcFwifSxcImRhdGFcIjp7fX0se1wibmFtZVwiOlwiY29yZTo6VHJhbnNmb3JtXCIsXCJqc29uU2NoZW1hXCI6e1widHlwZVwiOlwib2JqZWN0XCIsXCJwcm9wZXJ0aWVzXCI6e1wicG9zaXRpb25cIjp7XCJ0eXBlXCI6XCJvYmplY3RcIixcInByb3BlcnRpZXNcIjp7XCJ4XCI6e1widHlwZVwiOlwibnVtYmVyXCJ9LFwieVwiOntcInR5cGVcIjpcIm51bWJlclwifSxcInpcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIn19fSxcInNjYWxlXCI6e1widHlwZVwiOlwib2JqZWN0XCIsXCJwcm9wZXJ0aWVzXCI6e1wieFwiOntcInR5cGVcIjpcIm51bWJlclwifSxcInlcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIn0sXCJ6XCI6e1widHlwZVwiOlwibnVtYmVyXCJ9fX0sXCJyb3RhdGlvblwiOntcInR5cGVcIjpcIm9iamVjdFwiLFwicHJvcGVydGllc1wiOntcInhcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIn0sXCJ5XCI6e1widHlwZVwiOlwibnVtYmVyXCJ9LFwielwiOntcInR5cGVcIjpcIm51bWJlclwifSxcIndcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIn19fSxcInBhcmVudFwiOntcInR5cGVcIjpcImludGVnZXJcIn19LFwic2VyaWFsaXphdGlvblR5cGVcIjpcInRyYW5zZm9ybVwifSxcImRhdGFcIjp7XCI1MTNcIjp7XCJqc29uXCI6e1wicG9zaXRpb25cIjp7XCJ4XCI6MTEsXCJ5XCI6MCxcInpcIjoxMX0sXCJzY2FsZVwiOntcInhcIjoxLFwieVwiOjEsXCJ6XCI6MX0sXCJyb3RhdGlvblwiOntcInhcIjowLFwieVwiOjEsXCJ6XCI6MCxcIndcIjo2LjEyMzIzNDI2MjkyNTgzOWUtMTd9LFwicGFyZW50XCI6MH19LFwiNTE0XCI6e1wianNvblwiOntcInBvc2l0aW9uXCI6e1wieFwiOjE5LjQ2Mjk2ODgyNjI5Mzk0NSxcInlcIjoxLjAyMjQ4NTI1NjE5NTA2ODQsXCJ6XCI6MTAuNDk2MjIxNTQyMzU4Mzk4fSxcInNjYWxlXCI6e1wieFwiOjAuOTk5OTk5OTQwMzk1MzU1MixcInlcIjoxLFwielwiOjAuOTk5OTk5OTQwMzk1MzU1Mn0sXCJyb3RhdGlvblwiOntcInhcIjowLFwieVwiOi0wLjcwNzEwNjc2OTA4NDkzMDQsXCJ6XCI6MCxcIndcIjowLjcwNzEwNjc2OTA4NDkzMDR9LFwicGFyZW50XCI6MH19LFwiNTE1XCI6e1wianNvblwiOntcInBvc2l0aW9uXCI6e1wieFwiOjE5LjM1MTA1MzIzNzkxNTA0LFwieVwiOjEuMDQyNTgxNjc3NDM2ODI4NixcInpcIjoxMi4zNjQ4MzU3MzkxMzU3NDJ9LFwic2NhbGVcIjp7XCJ4XCI6MC45OTk5OTk5NDAzOTUzNTUyLFwieVwiOjEsXCJ6XCI6MC45OTk5OTk5NDAzOTUzNTUyfSxcInJvdGF0aW9uXCI6e1wieFwiOjAsXCJ5XCI6LTAuNzA3MTA2NzY5MDg0OTMwNCxcInpcIjowLFwid1wiOjAuNzA3MTA2NzY5MDg0OTMwNH0sXCJwYXJlbnRcIjowfX0sXCI1MTZcIjp7XCJqc29uXCI6e1wicG9zaXRpb25cIjp7XCJ4XCI6MTguNTEwMDAwMjI4ODgxODM2LFwieVwiOjEuMDA5OTk5OTkwNDYzMjU2OCxcInpcIjoxNC41Mzk5OTk5NjE4NTMwMjd9LFwic2NhbGVcIjp7XCJ4XCI6MSxcInlcIjoxLFwielwiOjF9LFwicm90YXRpb25cIjp7XCJ4XCI6MCxcInlcIjowLjcwNzEwNjc2OTA4NDkzMDQsXCJ6XCI6MCxcIndcIjowLjcwNzEwNjc2OTA4NDkzMDR9LFwicGFyZW50XCI6MH19LFwiNTE3XCI6e1wianNvblwiOntcInBvc2l0aW9uXCI6e1wieFwiOjE2LjQ3OTk5OTU0MjIzNjMyOCxcInlcIjoxLjAwOTk5OTk5MDQ2MzI1NjgsXCJ6XCI6MTQuNTI5OTk5NzMyOTcxMTkxfSxcInNjYWxlXCI6e1wieFwiOjEsXCJ5XCI6MSxcInpcIjoxfSxcInJvdGF0aW9uXCI6e1wieFwiOjAsXCJ5XCI6MC43MDcxMDY3NjkwODQ5MzA0LFwielwiOjAsXCJ3XCI6MC43MDcxMDY3NjkwODQ5MzA0fSxcInBhcmVudFwiOjB9fSxcIjUxOFwiOntcImpzb25cIjp7XCJwb3NpdGlvblwiOntcInhcIjoxOS4wOTY1MDYxMTg3NzQ0MTQsXCJ5XCI6MC43MDk5OTk5Nzg1NDIzMjc5LFwielwiOjEyLjV9LFwic2NhbGVcIjp7XCJ4XCI6MC45OTk5OTk5NDAzOTUzNTUyLFwieVwiOjAuOTk5OTk5OTQwMzk1MzU1MixcInpcIjoxfSxcInJvdGF0aW9uXCI6e1wieFwiOjAsXCJ5XCI6MCxcInpcIjowLjcwNzEwNjc2OTA4NDkzMDQsXCJ3XCI6MC43MDcxMDY3NjkwODQ5MzA0fSxcInBhcmVudFwiOjB9fSxcIjUxOVwiOntcImpzb25cIjp7XCJwb3NpdGlvblwiOntcInhcIjoxOS4wOTY1MDYxMTg3NzQ0MTQsXCJ5XCI6MC43MDk5OTk5Nzg1NDIzMjc5LFwielwiOjEwLjU0ODM5NTE1Njg2MDM1Mn0sXCJzY2FsZVwiOntcInhcIjowLjk5OTk5OTg4MDc5MDcxMDQsXCJ5XCI6MC45OTk5OTk4ODA3OTA3MTA0LFwielwiOjF9LFwicm90YXRpb25cIjp7XCJ4XCI6MCxcInlcIjowLFwielwiOjAuNzA3MTA2NzY5MDg0OTMwNCxcIndcIjowLjcwNzEwNjc2OTA4NDkzMDR9LFwicGFyZW50XCI6MH19LFwiNTIwXCI6e1wianNvblwiOntcInBvc2l0aW9uXCI6e1wieFwiOjE4LjQ2OTYzMTE5NTA2ODM2LFwieVwiOjAuNzA5OTk5OTc4NTQyMzI3OSxcInpcIjoxNC4wNTQ1ODkyNzE1NDU0MX0sXCJzY2FsZVwiOntcInhcIjoxLFwieVwiOjEsXCJ6XCI6MX0sXCJyb3RhdGlvblwiOntcInhcIjotMC41LFwieVwiOi0wLjUsXCJ6XCI6MC41LFwid1wiOjAuNX0sXCJwYXJlbnRcIjowfX0sXCI1MjFcIjp7XCJqc29uXCI6e1wicG9zaXRpb25cIjp7XCJ4XCI6MTYuNDY0MjQxMDI3ODMyMDMsXCJ5XCI6MC43MDk5OTk5Nzg1NDIzMjc5LFwielwiOjE0LjA1NDU4OTI3MTU0NTQxfSxcInJvdGF0aW9uXCI6e1wieFwiOi0wLjUsXCJ5XCI6LTAuNSxcInpcIjowLjUsXCJ3XCI6MC41fSxcInNjYWxlXCI6e1wieFwiOjEsXCJ5XCI6MSxcInpcIjoxfSxcInBhcmVudFwiOjB9fSxcIjUyMlwiOntcImpzb25cIjp7XCJwb3NpdGlvblwiOntcInhcIjoxNC43MDY2Mjg3OTk0Mzg0NzcsXCJ5XCI6MS4wMTI5OTIyNjI4NDAyNzEsXCJ6XCI6OS4xNzg0NTcyNjAxMzE4MzZ9LFwic2NhbGVcIjp7XCJ4XCI6MSxcInlcIjoxLFwielwiOjF9LFwicm90YXRpb25cIjp7XCJ4XCI6MCxcInlcIjowLjY0NzM5NjIwNjg1NTc3MzksXCJ6XCI6MCxcIndcIjowLjc2MjE1MzYyNTQ4ODI4MTJ9LFwicGFyZW50XCI6MH19LFwiNTIzXCI6e1wianNvblwiOntcInBvc2l0aW9uXCI6e1wieFwiOjE0LjAwMjQwMjMwNTYwMzAyNyxcInlcIjoxLjAxMjk5MjI2Mjg0MDI3MSxcInpcIjo5LjE3ODQ1NzI2MDEzMTgzNn0sXCJzY2FsZVwiOntcInhcIjoxLFwieVwiOjEsXCJ6XCI6MX0sXCJyb3RhdGlvblwiOntcInhcIjowLFwieVwiOjAuNjQ3Mzk2MTQ3MjUxMTI5MixcInpcIjowLFwid1wiOjAuNzYyMTUzNjg1MDkyOTI2fSxcInBhcmVudFwiOjB9fSxcIjUyNFwiOntcImpzb25cIjp7XCJwb3NpdGlvblwiOntcInhcIjoxOS4yMzM3ODc1MzY2MjEwOTQsXCJ5XCI6MS4wMTI5OTIyNjI4NDAyNzEsXCJ6XCI6MTEuMTg1OTg5Mzc5ODgyODEyfSxcInNjYWxlXCI6e1wieFwiOjEsXCJ5XCI6MSxcInpcIjoxfSxcInJvdGF0aW9uXCI6e1wieFwiOjAsXCJ5XCI6MC42NDczOTYxNDcyNTExMjkyLFwielwiOjAsXCJ3XCI6MC43NjIxNTM2ODUwOTI5MjZ9LFwicGFyZW50XCI6MH19LFwiNTI1XCI6e1wianNvblwiOntcInBvc2l0aW9uXCI6e1wieFwiOjE5LjIzMzc4NzUzNjYyMTA5NCxcInlcIjoxLjAxMjk5MjI2Mjg0MDI3MSxcInpcIjoxMy4xNzM4MzU3NTQzOTQ1MzF9LFwic2NhbGVcIjp7XCJ4XCI6MSxcInlcIjoxLFwielwiOjF9LFwicm90YXRpb25cIjp7XCJ4XCI6MCxcInlcIjowLjY0NzM5NjE0NzI1MTEyOTIsXCJ6XCI6MCxcIndcIjowLjc2MjE1MzY4NTA5MjkyNn0sXCJwYXJlbnRcIjowfX0sXCI1MjZcIjp7XCJqc29uXCI6e1wicG9zaXRpb25cIjp7XCJ4XCI6MTguNjQzMzE4MTc2MjY5NTMsXCJ5XCI6MC4wMjkwNDE4Mjg1ODc2NTEyNTMsXCJ6XCI6Ny4zMjQ5MTAxNjM4NzkzOTQ1fSxcInNjYWxlXCI6e1wieFwiOjEsXCJ5XCI6MSxcInpcIjoxfSxcInJvdGF0aW9uXCI6e1wieFwiOjAsXCJ5XCI6MC42NDczOTYxNDcyNTExMjkyLFwielwiOjAsXCJ3XCI6MC43NjIxNTM2ODUwOTI5MjZ9LFwicGFyZW50XCI6MH19LFwiNTI3XCI6e1wianNvblwiOntcInBvc2l0aW9uXCI6e1wieFwiOjEyLjE4NTU0MzA2MDMwMjczNCxcInlcIjowLjA3NzMxOTQ2NTU3NzYwMjM5LFwielwiOjEuOTExODk1NzUxOTUzMTI1fSxcInNjYWxlXCI6e1wieFwiOjEsXCJ5XCI6MSxcInpcIjoxfSxcInJvdGF0aW9uXCI6e1wieFwiOjAsXCJ5XCI6MC42NDczOTYxNDcyNTExMjkyLFwielwiOjAsXCJ3XCI6MC43NjIxNTM2ODUwOTI5MjZ9LFwicGFyZW50XCI6MH19LFwiNTI4XCI6e1wianNvblwiOntcInBvc2l0aW9uXCI6e1wieFwiOjEzLjMyNjI3NDg3MTgyNjE3MixcInlcIjowLjA3NzMxOTQ2NTU3NzYwMjM5LFwielwiOjExLjQ4NTY2MzQxNDAwMTQ2NX0sXCJzY2FsZVwiOntcInhcIjoxLFwieVwiOjEsXCJ6XCI6MX0sXCJyb3RhdGlvblwiOntcInhcIjowLFwieVwiOjAuMTc3Njk2Nzc5MzcwMzA3OTIsXCJ6XCI6MCxcIndcIjowLjk4NDA4NTI2MTgyMTc0Njh9LFwicGFyZW50XCI6MH19LFwiNTI5XCI6e1wianNvblwiOntcInBvc2l0aW9uXCI6e1wieFwiOjE0LjAwMjQwMjMwNTYwMzAyNyxcInlcIjoxLjAxMjk5MjI2Mjg0MDI3MSxcInpcIjoxNC42ODIyMTY2NDQyODcxMX0sXCJzY2FsZVwiOntcInhcIjoxLFwieVwiOjEsXCJ6XCI6MX0sXCJyb3RhdGlvblwiOntcInhcIjowLFwieVwiOjAuNjQ3Mzk2MTQ3MjUxMTI5MixcInpcIjowLFwid1wiOjAuNzYyMTUzNjg1MDkyOTI2fSxcInBhcmVudFwiOjB9fSxcIjUzMFwiOntcImpzb25cIjp7XCJwb3NpdGlvblwiOntcInhcIjoxNC40MDc5NjY2MTM3Njk1MzEsXCJ5XCI6MS4wMTI5OTIyNjI4NDAyNzEsXCJ6XCI6MTQuMDg1NzYyOTc3NjAwMDk4fSxcInNjYWxlXCI6e1wieFwiOjEsXCJ5XCI6MSxcInpcIjoxfSxcInJvdGF0aW9uXCI6e1wieFwiOjAsXCJ5XCI6MC42NDczOTYxNDcyNTExMjkyLFwielwiOjAsXCJ3XCI6MC43NjIxNTM2ODUwOTI5MjZ9LFwicGFyZW50XCI6MH19LFwiNTMxXCI6e1wianNvblwiOntcInBvc2l0aW9uXCI6e1wieFwiOjE2Ljg0MzIwNDQ5ODI5MTAxNixcInlcIjoyLjk5MjIzMjMyMjY5Mjg3MSxcInpcIjoxNC43NTI3NzYxNDU5MzUwNTl9LFwicm90YXRpb25cIjp7XCJ4XCI6MCxcInlcIjowLFwielwiOjAsXCJ3XCI6MX0sXCJzY2FsZVwiOntcInhcIjoxLFwieVwiOjEsXCJ6XCI6MX0sXCJwYXJlbnRcIjowfX0sXCI1MzJcIjp7XCJqc29uXCI6e1wicG9zaXRpb25cIjp7XCJ4XCI6MTYuODQzMjA0NDk4MjkxMDE2LFwieVwiOjIuNDU1MzIzNjk2MTM2NDc0NixcInpcIjoxNC43NTI3NzYxNDU5MzUwNTl9LFwicm90YXRpb25cIjp7XCJ4XCI6MCxcInlcIjowLFwielwiOjAsXCJ3XCI6MX0sXCJzY2FsZVwiOntcInhcIjoxLFwieVwiOjEsXCJ6XCI6MX0sXCJwYXJlbnRcIjowfX0sXCI1MzRcIjp7XCJqc29uXCI6e1wicG9zaXRpb25cIjp7XCJ4XCI6OCxcInlcIjotMC4wNTAwMDAwMDA3NDUwNTgwNixcInpcIjo4fSxcInJvdGF0aW9uXCI6e1wieFwiOjAsXCJ5XCI6MCxcInpcIjowLFwid1wiOjF9LFwic2NhbGVcIjp7XCJ4XCI6MSxcInlcIjoxLFwielwiOjF9LFwicGFyZW50XCI6MH19LFwiNTM1XCI6e1wianNvblwiOntcInBvc2l0aW9uXCI6e1wieFwiOjI0LFwieVwiOi0wLjA1MDAwMDAwMDc0NTA1ODA2LFwielwiOjh9LFwicm90YXRpb25cIjp7XCJ4XCI6MCxcInlcIjowLFwielwiOjAsXCJ3XCI6MX0sXCJzY2FsZVwiOntcInhcIjoxLFwieVwiOjEsXCJ6XCI6MX0sXCJwYXJlbnRcIjowfX0sXCI1MzZcIjp7XCJqc29uXCI6e1wicG9zaXRpb25cIjp7XCJ4XCI6MjQsXCJ5XCI6LTAuMDUwMDAwMDAwNzQ1MDU4MDYsXCJ6XCI6MjR9LFwicm90YXRpb25cIjp7XCJ4XCI6MCxcInlcIjowLFwielwiOjAsXCJ3XCI6MX0sXCJzY2FsZVwiOntcInhcIjoxLFwieVwiOjEsXCJ6XCI6MX0sXCJwYXJlbnRcIjowfX0sXCI1MzdcIjp7XCJqc29uXCI6e1wicG9zaXRpb25cIjp7XCJ4XCI6OCxcInlcIjotMC4wNTAwMDAwMDA3NDUwNTgwNixcInpcIjoyNH0sXCJyb3RhdGlvblwiOntcInhcIjowLFwieVwiOjAsXCJ6XCI6MCxcIndcIjoxfSxcInNjYWxlXCI6e1wieFwiOjEsXCJ5XCI6MSxcInpcIjoxfSxcInBhcmVudFwiOjB9fSxcIjUzOFwiOntcImpzb25cIjp7XCJwb3NpdGlvblwiOntcInhcIjoxNy40Nzk5OTk1NDIyMzYzMjgsXCJ5XCI6MS4yNDAwMDAwMDk1MzY3NDMyLFwielwiOjcuMDE5OTk5OTgwOTI2NTE0fSxcInJvdGF0aW9uXCI6e1wieFwiOjAuNzA3MTA2NzY5MDg0OTMwNCxcInlcIjowLFwielwiOjAsXCJ3XCI6MC43MDcxMDY3NjkwODQ5MzA0fSxcInNjYWxlXCI6e1wieFwiOjAuNzUsXCJ5XCI6MC43NSxcInpcIjowLjc1fSxcInBhcmVudFwiOjB9fSxcIjUzOVwiOntcImpzb25cIjp7XCJwb3NpdGlvblwiOntcInhcIjoxNy40NDUyMDE4NzM3NzkyOTcsXCJ5XCI6MS43NDIxNDg3NTY5ODA4OTYsXCJ6XCI6Ny4wMTAwMDAyMjg4ODE4MzZ9LFwicm90YXRpb25cIjp7XCJ4XCI6MCxcInlcIjoxLFwielwiOjAsXCJ3XCI6Ni4xMjMyMzQyNjI5MjU4MzllLTE3fSxcInNjYWxlXCI6e1wieFwiOjEsXCJ5XCI6MSxcInpcIjoxfSxcInBhcmVudFwiOjB9fSxcIjU0MFwiOntcImpzb25cIjp7XCJwb3NpdGlvblwiOntcInhcIjoxMi4wODEzMjkzNDU3MDMxMjUsXCJ5XCI6NC4zMDk5OTk5NDI3Nzk1NDEsXCJ6XCI6MS4wMTA0NzQ0NDM0MzU2Njl9LFwicm90YXRpb25cIjp7XCJ4XCI6MCxcInlcIjoxLFwielwiOjAsXCJ3XCI6Ni4xMjMyMzQyNjI5MjU4MzllLTE3fSxcInNjYWxlXCI6e1wieFwiOjEsXCJ5XCI6MSxcInpcIjoxfSxcInBhcmVudFwiOjB9fSxcIjU0MVwiOntcImpzb25cIjp7XCJwb3NpdGlvblwiOntcInhcIjowLjkzNTY5OTg4MDEyMzEzODQsXCJ5XCI6NC45NTM2MzcxMjMxMDc5MSxcInpcIjoxMi4wMTAwMDAyMjg4ODE4MzZ9LFwicm90YXRpb25cIjp7XCJ4XCI6LTAuNzA3MTA2NzY5MDg0OTMwNCxcInlcIjotNC4zMjk3ODA2MzI1ODU1MjJlLTE3LFwielwiOjAuNzA3MTA2NzY5MDg0OTMwNCxcIndcIjo0LjMyOTc4MDYzMjU4NTUyMmUtMTd9LFwic2NhbGVcIjp7XCJ4XCI6MC45OTk5OTk5NDAzOTUzNTUyLFwieVwiOjAuOTk5OTk5OTQwMzk1MzU1MixcInpcIjowLjk5OTk5OTk0MDM5NTM1NTJ9LFwicGFyZW50XCI6MH19fX0se1wibmFtZVwiOlwiY29yZTo6R2x0ZkNvbnRhaW5lclwiLFwianNvblNjaGVtYVwiOntcInR5cGVcIjpcIm9iamVjdFwiLFwicHJvcGVydGllc1wiOnt9LFwic2VyaWFsaXphdGlvblR5cGVcIjpcInByb3RvY29sLWJ1ZmZlclwiLFwicHJvdG9jb2xCdWZmZXJcIjpcIlBCR2x0ZkNvbnRhaW5lclwifSxcImRhdGFcIjp7XCI1MTNcIjp7XCJqc29uXCI6e1wic3JjXCI6XCJhc3NldHMvbW9kZWxzL0Vudmlyb25tZW50LmdsYlwiLFwidmlzaWJsZU1lc2hlc0NvbGxpc2lvbk1hc2tcIjoxLFwiaW52aXNpYmxlTWVzaGVzQ29sbGlzaW9uTWFza1wiOjJ9fSxcIjUxNFwiOntcImpzb25cIjp7XCJzcmNcIjpcImFzc2V0cy9tb2RlbHMvRXhwZW5kZXJOb29kbGVzLmdsYlwiLFwidmlzaWJsZU1lc2hlc0NvbGxpc2lvbk1hc2tcIjoxLFwiaW52aXNpYmxlTWVzaGVzQ29sbGlzaW9uTWFza1wiOjJ9fSxcIjUxNVwiOntcImpzb25cIjp7XCJzcmNcIjpcImFzc2V0cy9tb2RlbHMvRXhwZW5kZXJSb2xscy5nbGJcIixcInZpc2libGVNZXNoZXNDb2xsaXNpb25NYXNrXCI6MSxcImludmlzaWJsZU1lc2hlc0NvbGxpc2lvbk1hc2tcIjoyfX0sXCI1MTZcIjp7XCJqc29uXCI6e1wic3JjXCI6XCJhc3NldHMvbW9kZWxzL0Nvb2tpbmdQb3RDbGVhbi5nbGJcIixcInZpc2libGVNZXNoZXNDb2xsaXNpb25NYXNrXCI6MSxcImludmlzaWJsZU1lc2hlc0NvbGxpc2lvbk1hc2tcIjoyfX0sXCI1MTdcIjp7XCJqc29uXCI6e1wic3JjXCI6XCJhc3NldHMvbW9kZWxzL0Nvb2tpbmdQb3RDbGVhbi5nbGJcIixcInZpc2libGVNZXNoZXNDb2xsaXNpb25NYXNrXCI6MSxcImludmlzaWJsZU1lc2hlc0NvbGxpc2lvbk1hc2tcIjoyfX0sXCI1MThcIjp7XCJqc29uXCI6e1wic3JjXCI6XCJhc3NldHMvYnVpbGRlci9yZWRfYnV0dG9uL3JlZF9idXR0b24uZ2xiXCIsXCJ2aXNpYmxlTWVzaGVzQ29sbGlzaW9uTWFza1wiOjEsXCJpbnZpc2libGVNZXNoZXNDb2xsaXNpb25NYXNrXCI6Mn19LFwiNTE5XCI6e1wianNvblwiOntcInNyY1wiOlwiYXNzZXRzL2J1aWxkZXIvcmVkX2J1dHRvbi9yZWRfYnV0dG9uLmdsYlwiLFwidmlzaWJsZU1lc2hlc0NvbGxpc2lvbk1hc2tcIjoxLFwiaW52aXNpYmxlTWVzaGVzQ29sbGlzaW9uTWFza1wiOjJ9fSxcIjUyMFwiOntcImpzb25cIjp7XCJzcmNcIjpcImFzc2V0cy9idWlsZGVyL3JlZF9idXR0b24vcmVkX2J1dHRvbi5nbGJcIixcInZpc2libGVNZXNoZXNDb2xsaXNpb25NYXNrXCI6MSxcImludmlzaWJsZU1lc2hlc0NvbGxpc2lvbk1hc2tcIjoyfX0sXCI1MjFcIjp7XCJqc29uXCI6e1wic3JjXCI6XCJhc3NldHMvYnVpbGRlci9yZWRfYnV0dG9uL3JlZF9idXR0b24uZ2xiXCIsXCJ2aXNpYmxlTWVzaGVzQ29sbGlzaW9uTWFza1wiOjEsXCJpbnZpc2libGVNZXNoZXNDb2xsaXNpb25NYXNrXCI6Mn19LFwiNTIyXCI6e1wianNvblwiOntcInNyY1wiOlwiYXNzZXRzL21vZGVscy9iZWVyR2xhc3MuZ2xiXCIsXCJ2aXNpYmxlTWVzaGVzQ29sbGlzaW9uTWFza1wiOjEsXCJpbnZpc2libGVNZXNoZXNDb2xsaXNpb25NYXNrXCI6Mn19LFwiNTIzXCI6e1wianNvblwiOntcInNyY1wiOlwiYXNzZXRzL21vZGVscy9iZWVyR2xhc3MuZ2xiXCIsXCJ2aXNpYmxlTWVzaGVzQ29sbGlzaW9uTWFza1wiOjEsXCJpbnZpc2libGVNZXNoZXNDb2xsaXNpb25NYXNrXCI6Mn19LFwiNTI0XCI6e1wianNvblwiOntcInNyY1wiOlwiYXNzZXRzL21vZGVscy9iZWVyR2xhc3MuZ2xiXCIsXCJ2aXNpYmxlTWVzaGVzQ29sbGlzaW9uTWFza1wiOjEsXCJpbnZpc2libGVNZXNoZXNDb2xsaXNpb25NYXNrXCI6Mn19LFwiNTI1XCI6e1wianNvblwiOntcInNyY1wiOlwiYXNzZXRzL21vZGVscy9iZWVyR2xhc3MuZ2xiXCIsXCJ2aXNpYmxlTWVzaGVzQ29sbGlzaW9uTWFza1wiOjEsXCJpbnZpc2libGVNZXNoZXNDb2xsaXNpb25NYXNrXCI6Mn19LFwiNTI2XCI6e1wianNvblwiOntcInNyY1wiOlwiYXNzZXRzL21vZGVscy9iZWVyR2xhc3MuZ2xiXCIsXCJ2aXNpYmxlTWVzaGVzQ29sbGlzaW9uTWFza1wiOjEsXCJpbnZpc2libGVNZXNoZXNDb2xsaXNpb25NYXNrXCI6Mn19LFwiNTI3XCI6e1wianNvblwiOntcInNyY1wiOlwiYXNzZXRzL21vZGVscy9iZWVyR2xhc3MuZ2xiXCIsXCJ2aXNpYmxlTWVzaGVzQ29sbGlzaW9uTWFza1wiOjEsXCJpbnZpc2libGVNZXNoZXNDb2xsaXNpb25NYXNrXCI6Mn19LFwiNTI4XCI6e1wianNvblwiOntcInNyY1wiOlwiYXNzZXRzL21vZGVscy9iZWVyR2xhc3MuZ2xiXCIsXCJ2aXNpYmxlTWVzaGVzQ29sbGlzaW9uTWFza1wiOjEsXCJpbnZpc2libGVNZXNoZXNDb2xsaXNpb25NYXNrXCI6Mn19LFwiNTI5XCI6e1wianNvblwiOntcInNyY1wiOlwiYXNzZXRzL21vZGVscy9iZWVyR2xhc3MuZ2xiXCIsXCJ2aXNpYmxlTWVzaGVzQ29sbGlzaW9uTWFza1wiOjEsXCJpbnZpc2libGVNZXNoZXNDb2xsaXNpb25NYXNrXCI6Mn19LFwiNTMwXCI6e1wianNvblwiOntcInNyY1wiOlwiYXNzZXRzL21vZGVscy9iZWVyR2xhc3MuZ2xiXCIsXCJ2aXNpYmxlTWVzaGVzQ29sbGlzaW9uTWFza1wiOjEsXCJpbnZpc2libGVNZXNoZXNDb2xsaXNpb25NYXNrXCI6Mn19LFwiNTM0XCI6e1wianNvblwiOntcInNyY1wiOlwiYXNzZXRzL2J1aWxkZXIvY29uY3JldGUvRmxvb3JCYXNlQ29uY3JldGVfMDEvRmxvb3JCYXNlQ29uY3JldGVfMDEuZ2xiXCIsXCJ2aXNpYmxlTWVzaGVzQ29sbGlzaW9uTWFza1wiOjEsXCJpbnZpc2libGVNZXNoZXNDb2xsaXNpb25NYXNrXCI6Mn19LFwiNTM1XCI6e1wianNvblwiOntcInNyY1wiOlwiYXNzZXRzL2J1aWxkZXIvY29uY3JldGUvRmxvb3JCYXNlQ29uY3JldGVfMDEvRmxvb3JCYXNlQ29uY3JldGVfMDEuZ2xiXCIsXCJ2aXNpYmxlTWVzaGVzQ29sbGlzaW9uTWFza1wiOjEsXCJpbnZpc2libGVNZXNoZXNDb2xsaXNpb25NYXNrXCI6Mn19LFwiNTM2XCI6e1wianNvblwiOntcInNyY1wiOlwiYXNzZXRzL2J1aWxkZXIvY29uY3JldGUvRmxvb3JCYXNlQ29uY3JldGVfMDEvRmxvb3JCYXNlQ29uY3JldGVfMDEuZ2xiXCIsXCJ2aXNpYmxlTWVzaGVzQ29sbGlzaW9uTWFza1wiOjEsXCJpbnZpc2libGVNZXNoZXNDb2xsaXNpb25NYXNrXCI6Mn19LFwiNTM3XCI6e1wianNvblwiOntcInNyY1wiOlwiYXNzZXRzL2J1aWxkZXIvY29uY3JldGUvRmxvb3JCYXNlQ29uY3JldGVfMDEvRmxvb3JCYXNlQ29uY3JldGVfMDEuZ2xiXCIsXCJ2aXNpYmxlTWVzaGVzQ29sbGlzaW9uTWFza1wiOjEsXCJpbnZpc2libGVNZXNoZXNDb2xsaXNpb25NYXNrXCI6Mn19LFwiNTM4XCI6e1wianNvblwiOntcInNyY1wiOlwiYXNzZXRzL2J1aWxkZXIvcmVkX2xpZ2h0X2J1dHRvbi9yZWRfc2NpZmlfYnV0dG9uLmdsYlwiLFwidmlzaWJsZU1lc2hlc0NvbGxpc2lvbk1hc2tcIjoxLFwiaW52aXNpYmxlTWVzaGVzQ29sbGlzaW9uTWFza1wiOjJ9fSxcIjU0MFwiOntcImpzb25cIjp7XCJzcmNcIjpcImFzc2V0cy9idWlsZGVyL2Fycm93X3NpZ24vQXJyb3dfU2lnbi5nbGJcIixcInZpc2libGVNZXNoZXNDb2xsaXNpb25NYXNrXCI6MSxcImludmlzaWJsZU1lc2hlc0NvbGxpc2lvbk1hc2tcIjoyfX0sXCI1NDFcIjp7XCJqc29uXCI6e1wic3JjXCI6XCJhc3NldHMvYnVpbGRlci9hcnJvd19zaWduL0Fycm93X1NpZ24uZ2xiXCIsXCJ2aXNpYmxlTWVzaGVzQ29sbGlzaW9uTWFza1wiOjEsXCJpbnZpc2libGVNZXNoZXNDb2xsaXNpb25NYXNrXCI6Mn19fX0se1wibmFtZVwiOlwiY29yZS1zY2hlbWE6Ok5hbWVcIixcImpzb25TY2hlbWFcIjp7XCJ0eXBlXCI6XCJvYmplY3RcIixcInByb3BlcnRpZXNcIjp7XCJ2YWx1ZVwiOntcInR5cGVcIjpcInN0cmluZ1wiLFwic2VyaWFsaXphdGlvblR5cGVcIjpcInV0Zjgtc3RyaW5nXCJ9fSxcInNlcmlhbGl6YXRpb25UeXBlXCI6XCJtYXBcIn0sXCJkYXRhXCI6e1wiNTEzXCI6e1wianNvblwiOntcInZhbHVlXCI6XCJFbnZpcm9ubWVudC5nbGJcIn19LFwiNTE0XCI6e1wianNvblwiOntcInZhbHVlXCI6XCJFeHBlbmRlck5vb2RsZXNcIn19LFwiNTE1XCI6e1wianNvblwiOntcInZhbHVlXCI6XCJFeHBlbmRlclJvbGxzXCJ9fSxcIjUxNlwiOntcImpzb25cIjp7XCJ2YWx1ZVwiOlwiUG90MVwifX0sXCI1MTdcIjp7XCJqc29uXCI6e1widmFsdWVcIjpcIlBvdDJcIn19LFwiNTE4XCI6e1wianNvblwiOntcInZhbHVlXCI6XCJSb2xsIEJ1dHRvblwifX0sXCI1MTlcIjp7XCJqc29uXCI6e1widmFsdWVcIjpcIk5vb2RsZSBCdXR0b25cIn19LFwiNTIwXCI6e1wianNvblwiOntcInZhbHVlXCI6XCJQb3QxIEJ1dHRvblwifX0sXCI1MjFcIjp7XCJqc29uXCI6e1widmFsdWVcIjpcIlBvdDIgQnV0dG9uXCJ9fSxcIjUyMlwiOntcImpzb25cIjp7XCJ2YWx1ZVwiOlwiQmVlcjFcIn19LFwiNTIzXCI6e1wianNvblwiOntcInZhbHVlXCI6XCJCZWVyMlwifX0sXCI1MjRcIjp7XCJqc29uXCI6e1widmFsdWVcIjpcIkJlZXIzXCJ9fSxcIjUyNVwiOntcImpzb25cIjp7XCJ2YWx1ZVwiOlwiQmVlcjRcIn19LFwiNTI2XCI6e1wianNvblwiOntcInZhbHVlXCI6XCJCZWVyNVwifX0sXCI1MjdcIjp7XCJqc29uXCI6e1widmFsdWVcIjpcIkJlZXI2XCJ9fSxcIjUyOFwiOntcImpzb25cIjp7XCJ2YWx1ZVwiOlwiQmVlcjdcIn19LFwiNTI5XCI6e1wianNvblwiOntcInZhbHVlXCI6XCJCZWVyOFwifX0sXCI1MzBcIjp7XCJqc29uXCI6e1widmFsdWVcIjpcIkJlZXI5XCJ9fSxcIjUzMVwiOntcImpzb25cIjp7XCJ2YWx1ZVwiOlwiU2NvcmVcIn19LFwiNTMyXCI6e1wianNvblwiOntcInZhbHVlXCI6XCJNaXNzZXNcIn19LFwiNTM0XCI6e1wianNvblwiOntcInZhbHVlXCI6XCJDb25jcmV0ZVwifX0sXCI1MzVcIjp7XCJqc29uXCI6e1widmFsdWVcIjpcIkNvbmNyZXRlXCJ9fSxcIjUzNlwiOntcImpzb25cIjp7XCJ2YWx1ZVwiOlwiQ29uY3JldGVcIn19LFwiNTM3XCI6e1wianNvblwiOntcInZhbHVlXCI6XCJDb25jcmV0ZVwifX0sXCI1MzhcIjp7XCJqc29uXCI6e1widmFsdWVcIjpcIlJlc3RhcnRfQnV0dG9uXCJ9fSxcIjUzOVwiOntcImpzb25cIjp7XCJ2YWx1ZVwiOlwiVGV4dFwifX0sXCI1NDBcIjp7XCJqc29uXCI6e1widmFsdWVcIjpcIkFycm93IFNpZ25cIn19LFwiNTQxXCI6e1wianNvblwiOntcInZhbHVlXCI6XCJBcnJvdyBTaWduXCJ9fX19LHtcIm5hbWVcIjpcImNvcmU6OlRleHRTaGFwZVwiLFwianNvblNjaGVtYVwiOntcInR5cGVcIjpcIm9iamVjdFwiLFwicHJvcGVydGllc1wiOnt9LFwic2VyaWFsaXphdGlvblR5cGVcIjpcInByb3RvY29sLWJ1ZmZlclwiLFwicHJvdG9jb2xCdWZmZXJcIjpcIlBCVGV4dFNoYXBlXCJ9LFwiZGF0YVwiOntcIjUzMVwiOntcImpzb25cIjp7XCJ0ZXh0XCI6XCJTY29yZTogMFwiLFwiZm9udFwiOjIsXCJmb250U2l6ZVwiOjYsXCJmb250QXV0b1NpemVcIjpmYWxzZSxcInRleHRBbGlnblwiOjQsXCJ3aWR0aFwiOjEwMCxcImhlaWdodFwiOjEwMCxcInBhZGRpbmdUb3BcIjowLFwicGFkZGluZ1JpZ2h0XCI6MCxcInBhZGRpbmdCb3R0b21cIjowLFwicGFkZGluZ0xlZnRcIjowLFwibGluZVNwYWNpbmdcIjowLFwibGluZUNvdW50XCI6MSxcInRleHRXcmFwcGluZ1wiOmZhbHNlLFwic2hhZG93Qmx1clwiOjAsXCJzaGFkb3dPZmZzZXRYXCI6MCxcInNoYWRvd09mZnNldFlcIjowLFwib3V0bGluZVdpZHRoXCI6MCxcInNoYWRvd0NvbG9yXCI6e1wiclwiOjEsXCJnXCI6MSxcImJcIjoxfSxcIm91dGxpbmVDb2xvclwiOntcInJcIjoxLFwiZ1wiOjEsXCJiXCI6MX0sXCJ0ZXh0Q29sb3JcIjp7XCJyXCI6MSxcImdcIjoxLFwiYlwiOjEsXCJhXCI6MX19fSxcIjUzMlwiOntcImpzb25cIjp7XCJ0ZXh0XCI6XCJNaXNzZXM6IDBcIixcImZvbnRcIjoyLFwiZm9udFNpemVcIjo0LFwiZm9udEF1dG9TaXplXCI6ZmFsc2UsXCJ0ZXh0QWxpZ25cIjo0LFwid2lkdGhcIjoxMDAsXCJoZWlnaHRcIjoxMDAsXCJwYWRkaW5nVG9wXCI6MCxcInBhZGRpbmdSaWdodFwiOjAsXCJwYWRkaW5nQm90dG9tXCI6MCxcInBhZGRpbmdMZWZ0XCI6MCxcImxpbmVTcGFjaW5nXCI6MCxcImxpbmVDb3VudFwiOjEsXCJ0ZXh0V3JhcHBpbmdcIjpmYWxzZSxcInNoYWRvd0JsdXJcIjowLFwic2hhZG93T2Zmc2V0WFwiOjAsXCJzaGFkb3dPZmZzZXRZXCI6MCxcIm91dGxpbmVXaWR0aFwiOjAsXCJzaGFkb3dDb2xvclwiOntcInJcIjoxLFwiZ1wiOjEsXCJiXCI6MX0sXCJvdXRsaW5lQ29sb3JcIjp7XCJyXCI6MSxcImdcIjoxLFwiYlwiOjF9LFwidGV4dENvbG9yXCI6e1wiclwiOjEsXCJnXCI6MCxcImJcIjowLFwiYVwiOjF9fX0sXCI1MzlcIjp7XCJqc29uXCI6e1widGV4dFwiOlwiUmVzdGFydFwiLFwiZm9udFwiOjIsXCJmb250U2l6ZVwiOjMsXCJmb250QXV0b1NpemVcIjpmYWxzZSxcInRleHRBbGlnblwiOjQsXCJ3aWR0aFwiOjEwMCxcImhlaWdodFwiOjEwMCxcInBhZGRpbmdUb3BcIjowLFwicGFkZGluZ1JpZ2h0XCI6MCxcInBhZGRpbmdCb3R0b21cIjowLFwicGFkZGluZ0xlZnRcIjowLFwibGluZVNwYWNpbmdcIjowLFwibGluZUNvdW50XCI6MSxcInRleHRXcmFwcGluZ1wiOmZhbHNlLFwic2hhZG93Qmx1clwiOjAsXCJzaGFkb3dPZmZzZXRYXCI6MCxcInNoYWRvd09mZnNldFlcIjowLFwib3V0bGluZVdpZHRoXCI6MCxcInNoYWRvd0NvbG9yXCI6e1wiclwiOjEsXCJnXCI6MSxcImJcIjoxfSxcIm91dGxpbmVDb2xvclwiOntcInJcIjoxLFwiZ1wiOjEsXCJiXCI6MX0sXCJ0ZXh0Q29sb3JcIjp7XCJyXCI6MSxcImdcIjoxLFwiYlwiOjEsXCJhXCI6MX19fX19LHtcIm5hbWVcIjpcImNvcmU6OkFuaW1hdG9yXCIsXCJqc29uU2NoZW1hXCI6e1widHlwZVwiOlwib2JqZWN0XCIsXCJwcm9wZXJ0aWVzXCI6e30sXCJzZXJpYWxpemF0aW9uVHlwZVwiOlwicHJvdG9jb2wtYnVmZmVyXCIsXCJwcm90b2NvbEJ1ZmZlclwiOlwiUEJBbmltYXRvclwifSxcImRhdGFcIjp7XCI1MThcIjp7XCJqc29uXCI6e1wic3RhdGVzXCI6W3tcImNsaXBcIjpcInRyaWdnZXJcIixcInBsYXlpbmdcIjpmYWxzZSxcIndlaWdodFwiOjEsXCJzcGVlZFwiOjEsXCJsb29wXCI6ZmFsc2UsXCJzaG91bGRSZXNldFwiOmZhbHNlfV19fSxcIjUxOVwiOntcImpzb25cIjp7XCJzdGF0ZXNcIjpbe1wiY2xpcFwiOlwidHJpZ2dlclwiLFwicGxheWluZ1wiOmZhbHNlLFwid2VpZ2h0XCI6MSxcInNwZWVkXCI6MSxcImxvb3BcIjpmYWxzZSxcInNob3VsZFJlc2V0XCI6ZmFsc2V9XX19LFwiNTIwXCI6e1wianNvblwiOntcInN0YXRlc1wiOlt7XCJjbGlwXCI6XCJ0cmlnZ2VyXCIsXCJwbGF5aW5nXCI6ZmFsc2UsXCJ3ZWlnaHRcIjoxLFwic3BlZWRcIjoxLFwibG9vcFwiOmZhbHNlLFwic2hvdWxkUmVzZXRcIjpmYWxzZX1dfX0sXCI1MjFcIjp7XCJqc29uXCI6e1wic3RhdGVzXCI6W3tcImNsaXBcIjpcInRyaWdnZXJcIixcInBsYXlpbmdcIjpmYWxzZSxcIndlaWdodFwiOjEsXCJzcGVlZFwiOjEsXCJsb29wXCI6ZmFsc2UsXCJzaG91bGRSZXNldFwiOmZhbHNlfV19fSxcIjUyMlwiOntcImpzb25cIjp7XCJzdGF0ZXNcIjpbe1wiY2xpcFwiOlwiUG91clJlZFwiLFwicGxheWluZ1wiOmZhbHNlLFwid2VpZ2h0XCI6MSxcInNwZWVkXCI6MSxcImxvb3BcIjpmYWxzZSxcInNob3VsZFJlc2V0XCI6ZmFsc2V9LHtcImNsaXBcIjpcIkJsYW5rXCIsXCJwbGF5aW5nXCI6dHJ1ZSxcIndlaWdodFwiOjEsXCJzcGVlZFwiOjEsXCJsb29wXCI6ZmFsc2UsXCJzaG91bGRSZXNldFwiOmZhbHNlfSx7XCJjbGlwXCI6XCJQb3VyWWVsbG93XCIsXCJwbGF5aW5nXCI6ZmFsc2UsXCJ3ZWlnaHRcIjoxLFwic3BlZWRcIjoxLFwibG9vcFwiOmZhbHNlLFwic2hvdWxkUmVzZXRcIjpmYWxzZX0se1wiY2xpcFwiOlwiUG91ckdyZWVuXCIsXCJwbGF5aW5nXCI6ZmFsc2UsXCJ3ZWlnaHRcIjoxLFwic3BlZWRcIjoxLFwibG9vcFwiOmZhbHNlLFwic2hvdWxkUmVzZXRcIjpmYWxzZX1dfX0sXCI1MjNcIjp7XCJqc29uXCI6e1wic3RhdGVzXCI6W3tcImNsaXBcIjpcIlBvdXJSZWRcIixcInBsYXlpbmdcIjpmYWxzZSxcIndlaWdodFwiOjEsXCJzcGVlZFwiOjEsXCJsb29wXCI6ZmFsc2UsXCJzaG91bGRSZXNldFwiOmZhbHNlfSx7XCJjbGlwXCI6XCJCbGFua1wiLFwicGxheWluZ1wiOnRydWUsXCJ3ZWlnaHRcIjoxLFwic3BlZWRcIjoxLFwibG9vcFwiOmZhbHNlLFwic2hvdWxkUmVzZXRcIjpmYWxzZX0se1wiY2xpcFwiOlwiUG91clllbGxvd1wiLFwicGxheWluZ1wiOmZhbHNlLFwid2VpZ2h0XCI6MSxcInNwZWVkXCI6MSxcImxvb3BcIjpmYWxzZSxcInNob3VsZFJlc2V0XCI6ZmFsc2V9LHtcImNsaXBcIjpcIlBvdXJHcmVlblwiLFwicGxheWluZ1wiOmZhbHNlLFwid2VpZ2h0XCI6MSxcInNwZWVkXCI6MSxcImxvb3BcIjpmYWxzZSxcInNob3VsZFJlc2V0XCI6ZmFsc2V9XX19LFwiNTI0XCI6e1wianNvblwiOntcInN0YXRlc1wiOlt7XCJjbGlwXCI6XCJQb3VyUmVkXCIsXCJwbGF5aW5nXCI6ZmFsc2UsXCJ3ZWlnaHRcIjoxLFwic3BlZWRcIjoxLFwibG9vcFwiOmZhbHNlLFwic2hvdWxkUmVzZXRcIjpmYWxzZX0se1wiY2xpcFwiOlwiQmxhbmtcIixcInBsYXlpbmdcIjp0cnVlLFwid2VpZ2h0XCI6MSxcInNwZWVkXCI6MSxcImxvb3BcIjpmYWxzZSxcInNob3VsZFJlc2V0XCI6ZmFsc2V9LHtcImNsaXBcIjpcIlBvdXJZZWxsb3dcIixcInBsYXlpbmdcIjpmYWxzZSxcIndlaWdodFwiOjEsXCJzcGVlZFwiOjEsXCJsb29wXCI6ZmFsc2UsXCJzaG91bGRSZXNldFwiOmZhbHNlfSx7XCJjbGlwXCI6XCJQb3VyR3JlZW5cIixcInBsYXlpbmdcIjpmYWxzZSxcIndlaWdodFwiOjEsXCJzcGVlZFwiOjEsXCJsb29wXCI6ZmFsc2UsXCJzaG91bGRSZXNldFwiOmZhbHNlfV19fSxcIjUyNVwiOntcImpzb25cIjp7XCJzdGF0ZXNcIjpbe1wiY2xpcFwiOlwiUG91clJlZFwiLFwicGxheWluZ1wiOmZhbHNlLFwid2VpZ2h0XCI6MSxcInNwZWVkXCI6MSxcImxvb3BcIjpmYWxzZSxcInNob3VsZFJlc2V0XCI6ZmFsc2V9LHtcImNsaXBcIjpcIkJsYW5rXCIsXCJwbGF5aW5nXCI6dHJ1ZSxcIndlaWdodFwiOjEsXCJzcGVlZFwiOjEsXCJsb29wXCI6ZmFsc2UsXCJzaG91bGRSZXNldFwiOmZhbHNlfSx7XCJjbGlwXCI6XCJQb3VyWWVsbG93XCIsXCJwbGF5aW5nXCI6ZmFsc2UsXCJ3ZWlnaHRcIjoxLFwic3BlZWRcIjoxLFwibG9vcFwiOmZhbHNlLFwic2hvdWxkUmVzZXRcIjpmYWxzZX0se1wiY2xpcFwiOlwiUG91ckdyZWVuXCIsXCJwbGF5aW5nXCI6ZmFsc2UsXCJ3ZWlnaHRcIjoxLFwic3BlZWRcIjoxLFwibG9vcFwiOmZhbHNlLFwic2hvdWxkUmVzZXRcIjpmYWxzZX1dfX0sXCI1MjZcIjp7XCJqc29uXCI6e1wic3RhdGVzXCI6W3tcImNsaXBcIjpcIlBvdXJSZWRcIixcInBsYXlpbmdcIjpmYWxzZSxcIndlaWdodFwiOjEsXCJzcGVlZFwiOjEsXCJsb29wXCI6ZmFsc2UsXCJzaG91bGRSZXNldFwiOmZhbHNlfSx7XCJjbGlwXCI6XCJCbGFua1wiLFwicGxheWluZ1wiOnRydWUsXCJ3ZWlnaHRcIjoxLFwic3BlZWRcIjoxLFwibG9vcFwiOmZhbHNlLFwic2hvdWxkUmVzZXRcIjpmYWxzZX0se1wiY2xpcFwiOlwiUG91clllbGxvd1wiLFwicGxheWluZ1wiOmZhbHNlLFwid2VpZ2h0XCI6MSxcInNwZWVkXCI6MSxcImxvb3BcIjpmYWxzZSxcInNob3VsZFJlc2V0XCI6ZmFsc2V9LHtcImNsaXBcIjpcIlBvdXJHcmVlblwiLFwicGxheWluZ1wiOmZhbHNlLFwid2VpZ2h0XCI6MSxcInNwZWVkXCI6MSxcImxvb3BcIjpmYWxzZSxcInNob3VsZFJlc2V0XCI6ZmFsc2V9XX19LFwiNTI3XCI6e1wianNvblwiOntcInN0YXRlc1wiOlt7XCJjbGlwXCI6XCJQb3VyUmVkXCIsXCJwbGF5aW5nXCI6ZmFsc2UsXCJ3ZWlnaHRcIjoxLFwic3BlZWRcIjoxLFwibG9vcFwiOmZhbHNlLFwic2hvdWxkUmVzZXRcIjpmYWxzZX0se1wiY2xpcFwiOlwiQmxhbmtcIixcInBsYXlpbmdcIjp0cnVlLFwid2VpZ2h0XCI6MSxcInNwZWVkXCI6MSxcImxvb3BcIjpmYWxzZSxcInNob3VsZFJlc2V0XCI6ZmFsc2V9LHtcImNsaXBcIjpcIlBvdXJZZWxsb3dcIixcInBsYXlpbmdcIjpmYWxzZSxcIndlaWdodFwiOjEsXCJzcGVlZFwiOjEsXCJsb29wXCI6ZmFsc2UsXCJzaG91bGRSZXNldFwiOmZhbHNlfSx7XCJjbGlwXCI6XCJQb3VyR3JlZW5cIixcInBsYXlpbmdcIjpmYWxzZSxcIndlaWdodFwiOjEsXCJzcGVlZFwiOjEsXCJsb29wXCI6ZmFsc2UsXCJzaG91bGRSZXNldFwiOmZhbHNlfV19fSxcIjUyOFwiOntcImpzb25cIjp7XCJzdGF0ZXNcIjpbe1wiY2xpcFwiOlwiUG91clJlZFwiLFwicGxheWluZ1wiOmZhbHNlLFwid2VpZ2h0XCI6MSxcInNwZWVkXCI6MSxcImxvb3BcIjpmYWxzZSxcInNob3VsZFJlc2V0XCI6ZmFsc2V9LHtcImNsaXBcIjpcIkJsYW5rXCIsXCJwbGF5aW5nXCI6dHJ1ZSxcIndlaWdodFwiOjEsXCJzcGVlZFwiOjEsXCJsb29wXCI6ZmFsc2UsXCJzaG91bGRSZXNldFwiOmZhbHNlfSx7XCJjbGlwXCI6XCJQb3VyWWVsbG93XCIsXCJwbGF5aW5nXCI6ZmFsc2UsXCJ3ZWlnaHRcIjoxLFwic3BlZWRcIjoxLFwibG9vcFwiOmZhbHNlLFwic2hvdWxkUmVzZXRcIjpmYWxzZX0se1wiY2xpcFwiOlwiUG91ckdyZWVuXCIsXCJwbGF5aW5nXCI6ZmFsc2UsXCJ3ZWlnaHRcIjoxLFwic3BlZWRcIjoxLFwibG9vcFwiOmZhbHNlLFwic2hvdWxkUmVzZXRcIjpmYWxzZX1dfX0sXCI1MjlcIjp7XCJqc29uXCI6e1wic3RhdGVzXCI6W3tcImNsaXBcIjpcIlBvdXJSZWRcIixcInBsYXlpbmdcIjpmYWxzZSxcIndlaWdodFwiOjEsXCJzcGVlZFwiOjEsXCJsb29wXCI6ZmFsc2UsXCJzaG91bGRSZXNldFwiOmZhbHNlfSx7XCJjbGlwXCI6XCJCbGFua1wiLFwicGxheWluZ1wiOnRydWUsXCJ3ZWlnaHRcIjoxLFwic3BlZWRcIjoxLFwibG9vcFwiOmZhbHNlLFwic2hvdWxkUmVzZXRcIjpmYWxzZX0se1wiY2xpcFwiOlwiUG91clllbGxvd1wiLFwicGxheWluZ1wiOmZhbHNlLFwid2VpZ2h0XCI6MSxcInNwZWVkXCI6MSxcImxvb3BcIjpmYWxzZSxcInNob3VsZFJlc2V0XCI6ZmFsc2V9LHtcImNsaXBcIjpcIlBvdXJHcmVlblwiLFwicGxheWluZ1wiOmZhbHNlLFwid2VpZ2h0XCI6MSxcInNwZWVkXCI6MSxcImxvb3BcIjpmYWxzZSxcInNob3VsZFJlc2V0XCI6ZmFsc2V9XX19LFwiNTMwXCI6e1wianNvblwiOntcInN0YXRlc1wiOlt7XCJjbGlwXCI6XCJQb3VyUmVkXCIsXCJwbGF5aW5nXCI6ZmFsc2UsXCJ3ZWlnaHRcIjoxLFwic3BlZWRcIjoxLFwibG9vcFwiOmZhbHNlLFwic2hvdWxkUmVzZXRcIjpmYWxzZX0se1wiY2xpcFwiOlwiQmxhbmtcIixcInBsYXlpbmdcIjp0cnVlLFwid2VpZ2h0XCI6MSxcInNwZWVkXCI6MSxcImxvb3BcIjpmYWxzZSxcInNob3VsZFJlc2V0XCI6ZmFsc2V9LHtcImNsaXBcIjpcIlBvdXJZZWxsb3dcIixcInBsYXlpbmdcIjpmYWxzZSxcIndlaWdodFwiOjEsXCJzcGVlZFwiOjEsXCJsb29wXCI6ZmFsc2UsXCJzaG91bGRSZXNldFwiOmZhbHNlfSx7XCJjbGlwXCI6XCJQb3VyR3JlZW5cIixcInBsYXlpbmdcIjpmYWxzZSxcIndlaWdodFwiOjEsXCJzcGVlZFwiOjEsXCJsb29wXCI6ZmFsc2UsXCJzaG91bGRSZXNldFwiOmZhbHNlfV19fSxcIjUzOFwiOntcImpzb25cIjp7XCJzdGF0ZXNcIjpbe1wiY2xpcFwiOlwidHJpZ2dlclwiLFwicGxheWluZ1wiOmZhbHNlLFwid2VpZ2h0XCI6MSxcInNwZWVkXCI6MSxcImxvb3BcIjpmYWxzZSxcInNob3VsZFJlc2V0XCI6ZmFsc2V9XX19fX0se1wibmFtZVwiOlwiY29yZTo6UG9pbnRlckV2ZW50c1wiLFwianNvblNjaGVtYVwiOntcInR5cGVcIjpcIm9iamVjdFwiLFwicHJvcGVydGllc1wiOnt9LFwic2VyaWFsaXphdGlvblR5cGVcIjpcInByb3RvY29sLWJ1ZmZlclwiLFwicHJvdG9jb2xCdWZmZXJcIjpcIlBCUG9pbnRlckV2ZW50c1wifSxcImRhdGFcIjp7XCI1MTNcIjp7XCJqc29uXCI6e1wicG9pbnRlckV2ZW50c1wiOlt7XCJldmVudFR5cGVcIjoxLFwiZXZlbnRJbmZvXCI6e1wiYnV0dG9uXCI6MyxcImhvdmVyVGV4dFwiOlwiSW50ZXJhY3RcIixcIm1heERpc3RhbmNlXCI6MTAsXCJzaG93RmVlZGJhY2tcIjpmYWxzZX19XX19LFwiNTIyXCI6e1wianNvblwiOntcInBvaW50ZXJFdmVudHNcIjpbe1wiZXZlbnRUeXBlXCI6MSxcImV2ZW50SW5mb1wiOntcImJ1dHRvblwiOjEsXCJob3ZlclRleHRcIjpcIlBpY2sgVXBcIixcIm1heERpc3RhbmNlXCI6NSxcInNob3dGZWVkYmFja1wiOnRydWV9fV19fSxcIjUyM1wiOntcImpzb25cIjp7XCJwb2ludGVyRXZlbnRzXCI6W3tcImV2ZW50VHlwZVwiOjEsXCJldmVudEluZm9cIjp7XCJidXR0b25cIjoxLFwiaG92ZXJUZXh0XCI6XCJQaWNrIFVwXCIsXCJtYXhEaXN0YW5jZVwiOjUsXCJzaG93RmVlZGJhY2tcIjp0cnVlfX1dfX0sXCI1MjRcIjp7XCJqc29uXCI6e1wicG9pbnRlckV2ZW50c1wiOlt7XCJldmVudFR5cGVcIjoxLFwiZXZlbnRJbmZvXCI6e1wiYnV0dG9uXCI6MSxcImhvdmVyVGV4dFwiOlwiUGljayBVcFwiLFwibWF4RGlzdGFuY2VcIjo1LFwic2hvd0ZlZWRiYWNrXCI6dHJ1ZX19XX19LFwiNTI1XCI6e1wianNvblwiOntcInBvaW50ZXJFdmVudHNcIjpbe1wiZXZlbnRUeXBlXCI6MSxcImV2ZW50SW5mb1wiOntcImJ1dHRvblwiOjEsXCJob3ZlclRleHRcIjpcIlBpY2sgVXBcIixcIm1heERpc3RhbmNlXCI6NSxcInNob3dGZWVkYmFja1wiOnRydWV9fV19fSxcIjUyNlwiOntcImpzb25cIjp7XCJwb2ludGVyRXZlbnRzXCI6W3tcImV2ZW50VHlwZVwiOjEsXCJldmVudEluZm9cIjp7XCJidXR0b25cIjoxLFwiaG92ZXJUZXh0XCI6XCJQaWNrIFVwXCIsXCJtYXhEaXN0YW5jZVwiOjUsXCJzaG93RmVlZGJhY2tcIjp0cnVlfX1dfX0sXCI1MjdcIjp7XCJqc29uXCI6e1wicG9pbnRlckV2ZW50c1wiOlt7XCJldmVudFR5cGVcIjoxLFwiZXZlbnRJbmZvXCI6e1wiYnV0dG9uXCI6MSxcImhvdmVyVGV4dFwiOlwiUGljayBVcFwiLFwibWF4RGlzdGFuY2VcIjo1LFwic2hvd0ZlZWRiYWNrXCI6dHJ1ZX19XX19LFwiNTI4XCI6e1wianNvblwiOntcInBvaW50ZXJFdmVudHNcIjpbe1wiZXZlbnRUeXBlXCI6MSxcImV2ZW50SW5mb1wiOntcImJ1dHRvblwiOjEsXCJob3ZlclRleHRcIjpcIlBpY2sgVXBcIixcIm1heERpc3RhbmNlXCI6NSxcInNob3dGZWVkYmFja1wiOnRydWV9fV19fSxcIjUyOVwiOntcImpzb25cIjp7XCJwb2ludGVyRXZlbnRzXCI6W3tcImV2ZW50VHlwZVwiOjEsXCJldmVudEluZm9cIjp7XCJidXR0b25cIjoxLFwiaG92ZXJUZXh0XCI6XCJQaWNrIFVwXCIsXCJtYXhEaXN0YW5jZVwiOjUsXCJzaG93RmVlZGJhY2tcIjp0cnVlfX1dfX0sXCI1MzBcIjp7XCJqc29uXCI6e1wicG9pbnRlckV2ZW50c1wiOlt7XCJldmVudFR5cGVcIjoxLFwiZXZlbnRJbmZvXCI6e1wiYnV0dG9uXCI6MSxcImhvdmVyVGV4dFwiOlwiUGljayBVcFwiLFwibWF4RGlzdGFuY2VcIjo1LFwic2hvd0ZlZWRiYWNrXCI6dHJ1ZX19XX19LFwiNTM4XCI6e1wianNvblwiOntcInBvaW50ZXJFdmVudHNcIjpbe1wiZXZlbnRUeXBlXCI6MSxcImV2ZW50SW5mb1wiOntcImJ1dHRvblwiOjAsXCJob3ZlclRleHRcIjpcIlJlc3RhcnRcIixcIm1heERpc3RhbmNlXCI6MTAsXCJzaG93RmVlZGJhY2tcIjp0cnVlfX1dfX19fSx7XCJuYW1lXCI6XCJpbnNwZWN0b3I6OlNlbGVjdGlvblwiLFwianNvblNjaGVtYVwiOntcInR5cGVcIjpcIm9iamVjdFwiLFwicHJvcGVydGllc1wiOntcImdpem1vXCI6e1widHlwZVwiOlwiaW50ZWdlclwiLFwic2VyaWFsaXphdGlvblR5cGVcIjpcImludDMyXCJ9fSxcInNlcmlhbGl6YXRpb25UeXBlXCI6XCJtYXBcIn0sXCJkYXRhXCI6e1wiNTM4XCI6e1wianNvblwiOntcImdpem1vXCI6MH19fX0se1wibmFtZVwiOlwiaW5zcGVjdG9yOjpTY2VuZVwiLFwianNvblNjaGVtYVwiOntcInR5cGVcIjpcIm9iamVjdFwiLFwicHJvcGVydGllc1wiOntcImxheW91dFwiOntcInR5cGVcIjpcIm9iamVjdFwiLFwicHJvcGVydGllc1wiOntcImJhc2VcIjp7XCJ0eXBlXCI6XCJvYmplY3RcIixcInByb3BlcnRpZXNcIjp7XCJ4XCI6e1widHlwZVwiOlwiaW50ZWdlclwiLFwic2VyaWFsaXphdGlvblR5cGVcIjpcImludDMyXCJ9LFwieVwiOntcInR5cGVcIjpcImludGVnZXJcIixcInNlcmlhbGl6YXRpb25UeXBlXCI6XCJpbnQzMlwifX0sXCJzZXJpYWxpemF0aW9uVHlwZVwiOlwibWFwXCJ9LFwicGFyY2Vsc1wiOntcInR5cGVcIjpcImFycmF5XCIsXCJpdGVtc1wiOntcInR5cGVcIjpcIm9iamVjdFwiLFwicHJvcGVydGllc1wiOntcInhcIjp7XCJ0eXBlXCI6XCJpbnRlZ2VyXCIsXCJzZXJpYWxpemF0aW9uVHlwZVwiOlwiaW50MzJcIn0sXCJ5XCI6e1widHlwZVwiOlwiaW50ZWdlclwiLFwic2VyaWFsaXphdGlvblR5cGVcIjpcImludDMyXCJ9fSxcInNlcmlhbGl6YXRpb25UeXBlXCI6XCJtYXBcIn0sXCJzZXJpYWxpemF0aW9uVHlwZVwiOlwiYXJyYXlcIn19LFwic2VyaWFsaXphdGlvblR5cGVcIjpcIm1hcFwifX0sXCJzZXJpYWxpemF0aW9uVHlwZVwiOlwibWFwXCJ9LFwiZGF0YVwiOntcIjBcIjp7XCJqc29uXCI6e1wibGF5b3V0XCI6e1wiYmFzZVwiOntcInhcIjowLFwieVwiOjB9LFwicGFyY2Vsc1wiOlt7XCJ4XCI6MCxcInlcIjowfSx7XCJ4XCI6MCxcInlcIjoxfSx7XCJ4XCI6MSxcInlcIjowfSx7XCJ4XCI6MSxcInlcIjoxfV19fX19fSx7XCJuYW1lXCI6XCJpbnNwZWN0b3I6Ok5vZGVzXCIsXCJqc29uU2NoZW1hXCI6e1widHlwZVwiOlwib2JqZWN0XCIsXCJwcm9wZXJ0aWVzXCI6e1widmFsdWVcIjp7XCJ0eXBlXCI6XCJhcnJheVwiLFwiaXRlbXNcIjp7XCJ0eXBlXCI6XCJvYmplY3RcIixcInByb3BlcnRpZXNcIjp7XCJlbnRpdHlcIjp7XCJ0eXBlXCI6XCJpbnRlZ2VyXCIsXCJzZXJpYWxpemF0aW9uVHlwZVwiOlwiZW50aXR5XCJ9LFwib3BlblwiOntcInR5cGVcIjpcImJvb2xlYW5cIixcInNlcmlhbGl6YXRpb25UeXBlXCI6XCJvcHRpb25hbFwiLFwib3B0aW9uYWxKc29uU2NoZW1hXCI6e1widHlwZVwiOlwiYm9vbGVhblwiLFwic2VyaWFsaXphdGlvblR5cGVcIjpcImJvb2xlYW5cIn19LFwiY2hpbGRyZW5cIjp7XCJ0eXBlXCI6XCJhcnJheVwiLFwiaXRlbXNcIjp7XCJ0eXBlXCI6XCJpbnRlZ2VyXCIsXCJzZXJpYWxpemF0aW9uVHlwZVwiOlwiZW50aXR5XCJ9LFwic2VyaWFsaXphdGlvblR5cGVcIjpcImFycmF5XCJ9fSxcInNlcmlhbGl6YXRpb25UeXBlXCI6XCJtYXBcIn0sXCJzZXJpYWxpemF0aW9uVHlwZVwiOlwiYXJyYXlcIn19LFwic2VyaWFsaXphdGlvblR5cGVcIjpcIm1hcFwifSxcImRhdGFcIjp7XCIwXCI6e1wianNvblwiOntcInZhbHVlXCI6W3tcImVudGl0eVwiOjUxMixcIm9wZW5cIjp0cnVlLFwiY2hpbGRyZW5cIjpbNTEzLDUxNCw1MTUsNTE2LDUxNyw1MTgsNTE5LDUyMCw1MjEsNTIyLDUyMyw1MjQsNTI1LDUyNiw1MjcsNTI4LDUyOSw1MzAsNTMxLDUzMiw1MzMsNTM0LDUzNSw1MzYsNTM3LDUzOCw1MzksNTQwXX0se1wiZW50aXR5XCI6NTEzLFwiY2hpbGRyZW5cIjpbXX0se1wiZW50aXR5XCI6NTE0LFwiY2hpbGRyZW5cIjpbXX0se1wiZW50aXR5XCI6NTE1LFwiY2hpbGRyZW5cIjpbXX0se1wiZW50aXR5XCI6NTE2LFwiY2hpbGRyZW5cIjpbXX0se1wiZW50aXR5XCI6NTE3LFwiY2hpbGRyZW5cIjpbXX0se1wiZW50aXR5XCI6NTE4LFwiY2hpbGRyZW5cIjpbXX0se1wiZW50aXR5XCI6NTE5LFwiY2hpbGRyZW5cIjpbXX0se1wiZW50aXR5XCI6NTIwLFwiY2hpbGRyZW5cIjpbXX0se1wiZW50aXR5XCI6NTIxLFwiY2hpbGRyZW5cIjpbXX0se1wiZW50aXR5XCI6NTIyLFwiY2hpbGRyZW5cIjpbXX0se1wiZW50aXR5XCI6NTIzLFwiY2hpbGRyZW5cIjpbXX0se1wiZW50aXR5XCI6NTI0LFwiY2hpbGRyZW5cIjpbXX0se1wiZW50aXR5XCI6NTI1LFwiY2hpbGRyZW5cIjpbXX0se1wiZW50aXR5XCI6NTI2LFwiY2hpbGRyZW5cIjpbXX0se1wiZW50aXR5XCI6NTI3LFwiY2hpbGRyZW5cIjpbXX0se1wiZW50aXR5XCI6NTI4LFwiY2hpbGRyZW5cIjpbXX0se1wiZW50aXR5XCI6NTI5LFwiY2hpbGRyZW5cIjpbXX0se1wiZW50aXR5XCI6NTMwLFwiY2hpbGRyZW5cIjpbXX0se1wiZW50aXR5XCI6NTMxLFwiY2hpbGRyZW5cIjpbXX0se1wiZW50aXR5XCI6NTMyLFwiY2hpbGRyZW5cIjpbXX0se1wiZW50aXR5XCI6NTMzLFwiY2hpbGRyZW5cIjpbXX0se1wiZW50aXR5XCI6NTM0LFwiY2hpbGRyZW5cIjpbXX0se1wiZW50aXR5XCI6NTM1LFwiY2hpbGRyZW5cIjpbXX0se1wiZW50aXR5XCI6NTM2LFwiY2hpbGRyZW5cIjpbXX0se1wiZW50aXR5XCI6NTM3LFwiY2hpbGRyZW5cIjpbXX0se1wiZW50aXR5XCI6NTM4LFwiY2hpbGRyZW5cIjpbXX0se1wiZW50aXR5XCI6NTM5LFwiY2hpbGRyZW5cIjpbXX0se1wiZW50aXR5XCI6NTQwLFwiY2hpbGRyZW5cIjpbXX1dfX19fSx7XCJuYW1lXCI6XCJhc3NldC1wYWNrczo6QWN0aW9uVHlwZXNcIixcImpzb25TY2hlbWFcIjp7XCJ0eXBlXCI6XCJvYmplY3RcIixcInByb3BlcnRpZXNcIjp7XCJ2YWx1ZVwiOntcInR5cGVcIjpcImFycmF5XCIsXCJpdGVtc1wiOntcInR5cGVcIjpcIm9iamVjdFwiLFwicHJvcGVydGllc1wiOntcInR5cGVcIjp7XCJ0eXBlXCI6XCJzdHJpbmdcIixcInNlcmlhbGl6YXRpb25UeXBlXCI6XCJ1dGY4LXN0cmluZ1wifSxcImpzb25TY2hlbWFcIjp7XCJ0eXBlXCI6XCJzdHJpbmdcIixcInNlcmlhbGl6YXRpb25UeXBlXCI6XCJ1dGY4LXN0cmluZ1wifX0sXCJzZXJpYWxpemF0aW9uVHlwZVwiOlwibWFwXCJ9LFwic2VyaWFsaXphdGlvblR5cGVcIjpcImFycmF5XCJ9fSxcInNlcmlhbGl6YXRpb25UeXBlXCI6XCJtYXBcIn0sXCJkYXRhXCI6e1wiMFwiOntcImpzb25cIjp7XCJ2YWx1ZVwiOlt7XCJ0eXBlXCI6XCJwbGF5X2FuaW1hdGlvblwiLFwianNvblNjaGVtYVwiOlwie1xcXCJ0eXBlXFxcIjpcXFwib2JqZWN0XFxcIixcXFwicHJvcGVydGllc1xcXCI6e1xcXCJhbmltYXRpb25cXFwiOntcXFwidHlwZVxcXCI6XFxcInN0cmluZ1xcXCIsXFxcInNlcmlhbGl6YXRpb25UeXBlXFxcIjpcXFwidXRmOC1zdHJpbmdcXFwifSxcXFwibG9vcFxcXCI6e1xcXCJ0eXBlXFxcIjpcXFwiYm9vbGVhblxcXCIsXFxcInNlcmlhbGl6YXRpb25UeXBlXFxcIjpcXFwib3B0aW9uYWxcXFwiLFxcXCJvcHRpb25hbEpzb25TY2hlbWFcXFwiOntcXFwidHlwZVxcXCI6XFxcImJvb2xlYW5cXFwiLFxcXCJzZXJpYWxpemF0aW9uVHlwZVxcXCI6XFxcImJvb2xlYW5cXFwifX19LFxcXCJzZXJpYWxpemF0aW9uVHlwZVxcXCI6XFxcIm1hcFxcXCJ9XCJ9LHtcInR5cGVcIjpcInN0b3BfYW5pbWF0aW9uXCIsXCJqc29uU2NoZW1hXCI6XCJ7XFxcInR5cGVcXFwiOlxcXCJvYmplY3RcXFwiLFxcXCJwcm9wZXJ0aWVzXFxcIjp7fSxcXFwic2VyaWFsaXphdGlvblR5cGVcXFwiOlxcXCJtYXBcXFwifVwifSx7XCJ0eXBlXCI6XCJzZXRfc3RhdGVcIixcImpzb25TY2hlbWFcIjpcIntcXFwidHlwZVxcXCI6XFxcIm9iamVjdFxcXCIsXFxcInByb3BlcnRpZXNcXFwiOntcXFwic3RhdGVcXFwiOntcXFwidHlwZVxcXCI6XFxcInN0cmluZ1xcXCIsXFxcInNlcmlhbGl6YXRpb25UeXBlXFxcIjpcXFwidXRmOC1zdHJpbmdcXFwifX0sXFxcInNlcmlhbGl6YXRpb25UeXBlXFxcIjpcXFwibWFwXFxcIn1cIn0se1widHlwZVwiOlwic3RhcnRfdHdlZW5cIixcImpzb25TY2hlbWFcIjpcIntcXFwidHlwZVxcXCI6XFxcIm9iamVjdFxcXCIsXFxcInByb3BlcnRpZXNcXFwiOntcXFwidHlwZVxcXCI6e1xcXCJ0eXBlXFxcIjpcXFwic3RyaW5nXFxcIixcXFwiZW51bVxcXCI6W1xcXCJtb3ZlX2l0ZW1cXFwiLFxcXCJyb3RhdGVfaXRlbVxcXCIsXFxcInNjYWxlX2l0ZW1cXFwiXSxcXFwiZGVmYXVsdFxcXCI6XFxcIm1vdmVfaXRlbVxcXCIsXFxcInNlcmlhbGl6YXRpb25UeXBlXFxcIjpcXFwiZW51bS1zdHJpbmdcXFwiLFxcXCJlbnVtT2JqZWN0XFxcIjp7XFxcIk1PVkVfSVRFTVxcXCI6XFxcIm1vdmVfaXRlbVxcXCIsXFxcIlJPVEFURV9JVEVNXFxcIjpcXFwicm90YXRlX2l0ZW1cXFwiLFxcXCJTQ0FMRV9JVEVNXFxcIjpcXFwic2NhbGVfaXRlbVxcXCJ9fSxcXFwiZW5kXFxcIjp7XFxcInR5cGVcXFwiOlxcXCJvYmplY3RcXFwiLFxcXCJwcm9wZXJ0aWVzXFxcIjp7XFxcInhcXFwiOntcXFwidHlwZVxcXCI6XFxcIm51bWJlclxcXCJ9LFxcXCJ5XFxcIjp7XFxcInR5cGVcXFwiOlxcXCJudW1iZXJcXFwifSxcXFwielxcXCI6e1xcXCJ0eXBlXFxcIjpcXFwibnVtYmVyXFxcIn0sXFxcIndcXFwiOntcXFwidHlwZVxcXCI6XFxcIm51bWJlclxcXCJ9fSxcXFwic2VyaWFsaXphdGlvblR5cGVcXFwiOlxcXCJ2ZWN0b3IzXFxcIn0sXFxcImludGVycG9sYXRpb25UeXBlXFxcIjp7XFxcInR5cGVcXFwiOlxcXCJzdHJpbmdcXFwiLFxcXCJlbnVtXFxcIjpbXFxcImxpbmVhclxcXCIsXFxcImVhc2VpbnF1YWRcXFwiLFxcXCJlYXNlb3V0cXVhZFxcXCIsXFxcImVhc2VxdWFkXFxcIixcXFwiZWFzZWluc2luZVxcXCIsXFxcImVhc2VvdXRzaW5lXFxcIixcXFwiZWFzZWlub3V0c2luZVxcXCIsXFxcImVhc2VpbmV4cG9cXFwiLFxcXCJlYXNlb3V0ZXhwb1xcXCIsXFxcImVhc2Vpbm91dGV4cG9cXFwiLFxcXCJlYXNlaW5lbGFzdGljXFxcIixcXFwiZWFzZW91dGVsYXN0aWNcXFwiLFxcXCJlYXNlaW5vdXRlbGFzdGljXFxcIixcXFwiZWFzZWluYm91bmNlXFxcIixcXFwiZWFzZW91dGJvdW5jZVxcXCIsXFxcImVhc2Vpbm91dGJvdW5jZVxcXCJdLFxcXCJkZWZhdWx0XFxcIjpcXFwibGluZWFyXFxcIixcXFwic2VyaWFsaXphdGlvblR5cGVcXFwiOlxcXCJlbnVtLXN0cmluZ1xcXCIsXFxcImVudW1PYmplY3RcXFwiOntcXFwiTElORUFSXFxcIjpcXFwibGluZWFyXFxcIixcXFwiRUFTRUlOUVVBRFxcXCI6XFxcImVhc2VpbnF1YWRcXFwiLFxcXCJFQVNFT1VUUVVBRFxcXCI6XFxcImVhc2VvdXRxdWFkXFxcIixcXFwiRUFTRVFVQURcXFwiOlxcXCJlYXNlcXVhZFxcXCIsXFxcIkVBU0VJTlNJTkVcXFwiOlxcXCJlYXNlaW5zaW5lXFxcIixcXFwiRUFTRU9VVFNJTkVcXFwiOlxcXCJlYXNlb3V0c2luZVxcXCIsXFxcIkVBU0VTSU5FXFxcIjpcXFwiZWFzZWlub3V0c2luZVxcXCIsXFxcIkVBU0VJTkVYUE9cXFwiOlxcXCJlYXNlaW5leHBvXFxcIixcXFwiRUFTRU9VVEVYUE9cXFwiOlxcXCJlYXNlb3V0ZXhwb1xcXCIsXFxcIkVBU0VFWFBPXFxcIjpcXFwiZWFzZWlub3V0ZXhwb1xcXCIsXFxcIkVBU0VJTkVMQVNUSUNcXFwiOlxcXCJlYXNlaW5lbGFzdGljXFxcIixcXFwiRUFTRU9VVEVMQVNUSUNcXFwiOlxcXCJlYXNlb3V0ZWxhc3RpY1xcXCIsXFxcIkVBU0VFTEFTVElDXFxcIjpcXFwiZWFzZWlub3V0ZWxhc3RpY1xcXCIsXFxcIkVBU0VJTkJPVU5DRVxcXCI6XFxcImVhc2VpbmJvdW5jZVxcXCIsXFxcIkVBU0VPVVRFQk9VTkNFXFxcIjpcXFwiZWFzZW91dGJvdW5jZVxcXCIsXFxcIkVBU0VCT1VOQ0VcXFwiOlxcXCJlYXNlaW5vdXRib3VuY2VcXFwifX0sXFxcImR1cmF0aW9uXFxcIjp7XFxcInR5cGVcXFwiOlxcXCJudW1iZXJcXFwiLFxcXCJzZXJpYWxpemF0aW9uVHlwZVxcXCI6XFxcImZsb2F0MzJcXFwifSxcXFwicmVsYXRpdmVcXFwiOntcXFwidHlwZVxcXCI6XFxcImJvb2xlYW5cXFwiLFxcXCJzZXJpYWxpemF0aW9uVHlwZVxcXCI6XFxcImJvb2xlYW5cXFwifX0sXFxcInNlcmlhbGl6YXRpb25UeXBlXFxcIjpcXFwibWFwXFxcIn1cIn0se1widHlwZVwiOlwic2V0X2NvdW50ZXJcIixcImpzb25TY2hlbWFcIjpcIntcXFwidHlwZVxcXCI6XFxcIm9iamVjdFxcXCIsXFxcInByb3BlcnRpZXNcXFwiOntcXFwiY291bnRlclxcXCI6e1xcXCJ0eXBlXFxcIjpcXFwiaW50ZWdlclxcXCIsXFxcInNlcmlhbGl6YXRpb25UeXBlXFxcIjpcXFwiaW50MzJcXFwifX0sXFxcInNlcmlhbGl6YXRpb25UeXBlXFxcIjpcXFwibWFwXFxcIn1cIn0se1widHlwZVwiOlwiaW5jcmVtZW50X2NvdW50ZXJcIixcImpzb25TY2hlbWFcIjpcIntcXFwidHlwZVxcXCI6XFxcIm9iamVjdFxcXCIsXFxcInByb3BlcnRpZXNcXFwiOnt9LFxcXCJzZXJpYWxpemF0aW9uVHlwZVxcXCI6XFxcIm1hcFxcXCJ9XCJ9LHtcInR5cGVcIjpcImRlY3JlYXNlX2NvdW50ZXJcIixcImpzb25TY2hlbWFcIjpcIntcXFwidHlwZVxcXCI6XFxcIm9iamVjdFxcXCIsXFxcInByb3BlcnRpZXNcXFwiOnt9LFxcXCJzZXJpYWxpemF0aW9uVHlwZVxcXCI6XFxcIm1hcFxcXCJ9XCJ9LHtcInR5cGVcIjpcInBsYXlfc291bmRcIixcImpzb25TY2hlbWFcIjpcIntcXFwidHlwZVxcXCI6XFxcIm9iamVjdFxcXCIsXFxcInByb3BlcnRpZXNcXFwiOntcXFwic3JjXFxcIjp7XFxcInR5cGVcXFwiOlxcXCJzdHJpbmdcXFwiLFxcXCJzZXJpYWxpemF0aW9uVHlwZVxcXCI6XFxcInV0Zjgtc3RyaW5nXFxcIn0sXFxcImxvb3BcXFwiOntcXFwidHlwZVxcXCI6XFxcImJvb2xlYW5cXFwiLFxcXCJzZXJpYWxpemF0aW9uVHlwZVxcXCI6XFxcIm9wdGlvbmFsXFxcIixcXFwib3B0aW9uYWxKc29uU2NoZW1hXFxcIjp7XFxcInR5cGVcXFwiOlxcXCJib29sZWFuXFxcIixcXFwic2VyaWFsaXphdGlvblR5cGVcXFwiOlxcXCJib29sZWFuXFxcIn19LFxcXCJ2b2x1bWVcXFwiOntcXFwidHlwZVxcXCI6XFxcIm51bWJlclxcXCIsXFxcInNlcmlhbGl6YXRpb25UeXBlXFxcIjpcXFwib3B0aW9uYWxcXFwiLFxcXCJvcHRpb25hbEpzb25TY2hlbWFcXFwiOntcXFwidHlwZVxcXCI6XFxcIm51bWJlclxcXCIsXFxcInNlcmlhbGl6YXRpb25UeXBlXFxcIjpcXFwiZmxvYXQzMlxcXCJ9fX0sXFxcInNlcmlhbGl6YXRpb25UeXBlXFxcIjpcXFwibWFwXFxcIn1cIn0se1widHlwZVwiOlwic3RvcF9zb3VuZFwiLFwianNvblNjaGVtYVwiOlwie1xcXCJ0eXBlXFxcIjpcXFwib2JqZWN0XFxcIixcXFwicHJvcGVydGllc1xcXCI6e30sXFxcInNlcmlhbGl6YXRpb25UeXBlXFxcIjpcXFwibWFwXFxcIn1cIn0se1widHlwZVwiOlwic2V0X3Zpc2liaWxpdHlcIixcImpzb25TY2hlbWFcIjpcIntcXFwidHlwZVxcXCI6XFxcIm9iamVjdFxcXCIsXFxcInByb3BlcnRpZXNcXFwiOntcXFwidmlzaWJsZVxcXCI6e1xcXCJ0eXBlXFxcIjpcXFwiYm9vbGVhblxcXCIsXFxcInNlcmlhbGl6YXRpb25UeXBlXFxcIjpcXFwiYm9vbGVhblxcXCJ9LFxcXCJwaHlzaWNzQ29sbGlkZXJcXFwiOntcXFwidHlwZVxcXCI6XFxcImJvb2xlYW5cXFwiLFxcXCJzZXJpYWxpemF0aW9uVHlwZVxcXCI6XFxcIm9wdGlvbmFsXFxcIixcXFwib3B0aW9uYWxKc29uU2NoZW1hXFxcIjp7XFxcInR5cGVcXFwiOlxcXCJib29sZWFuXFxcIixcXFwic2VyaWFsaXphdGlvblR5cGVcXFwiOlxcXCJib29sZWFuXFxcIn19LFxcXCJjb2xsaWRlclxcXCI6e1xcXCJ0eXBlXFxcIjpcXFwiaW50ZWdlclxcXCIsXFxcInNlcmlhbGl6YXRpb25UeXBlXFxcIjpcXFwib3B0aW9uYWxcXFwiLFxcXCJvcHRpb25hbEpzb25TY2hlbWFcXFwiOntcXFwidHlwZVxcXCI6XFxcImludGVnZXJcXFwiLFxcXCJlbnVtXFxcIjpbMCwxLDIsNCw4LDE2LDMyLDY0LDEyOCwyNTYsNTEyLDEwMjQsMjA0OCw0MDk2LDgxOTIsMTYzODQsMzI3NjhdLFxcXCJkZWZhdWx0XFxcIjoxLFxcXCJzZXJpYWxpemF0aW9uVHlwZVxcXCI6XFxcImVudW0taW50XFxcIixcXFwiZW51bU9iamVjdFxcXCI6e1xcXCIwXFxcIjpcXFwiQ0xfTk9ORVxcXCIsXFxcIjFcXFwiOlxcXCJDTF9QT0lOVEVSXFxcIixcXFwiMlxcXCI6XFxcIkNMX1BIWVNJQ1NcXFwiLFxcXCI0XFxcIjpcXFwiQ0xfUkVTRVJWRUQxXFxcIixcXFwiOFxcXCI6XFxcIkNMX1JFU0VSVkVEMlxcXCIsXFxcIjE2XFxcIjpcXFwiQ0xfUkVTRVJWRUQzXFxcIixcXFwiMzJcXFwiOlxcXCJDTF9SRVNFUlZFRDRcXFwiLFxcXCI2NFxcXCI6XFxcIkNMX1JFU0VSVkVENVxcXCIsXFxcIjEyOFxcXCI6XFxcIkNMX1JFU0VSVkVENlxcXCIsXFxcIjI1NlxcXCI6XFxcIkNMX0NVU1RPTTFcXFwiLFxcXCI1MTJcXFwiOlxcXCJDTF9DVVNUT00yXFxcIixcXFwiMTAyNFxcXCI6XFxcIkNMX0NVU1RPTTNcXFwiLFxcXCIyMDQ4XFxcIjpcXFwiQ0xfQ1VTVE9NNFxcXCIsXFxcIjQwOTZcXFwiOlxcXCJDTF9DVVNUT001XFxcIixcXFwiODE5MlxcXCI6XFxcIkNMX0NVU1RPTTZcXFwiLFxcXCIxNjM4NFxcXCI6XFxcIkNMX0NVU1RPTTdcXFwiLFxcXCIzMjc2OFxcXCI6XFxcIkNMX0NVU1RPTThcXFwiLFxcXCJDTF9OT05FXFxcIjowLFxcXCJDTF9QT0lOVEVSXFxcIjoxLFxcXCJDTF9QSFlTSUNTXFxcIjoyLFxcXCJDTF9SRVNFUlZFRDFcXFwiOjQsXFxcIkNMX1JFU0VSVkVEMlxcXCI6OCxcXFwiQ0xfUkVTRVJWRUQzXFxcIjoxNixcXFwiQ0xfUkVTRVJWRUQ0XFxcIjozMixcXFwiQ0xfUkVTRVJWRUQ1XFxcIjo2NCxcXFwiQ0xfUkVTRVJWRUQ2XFxcIjoxMjgsXFxcIkNMX0NVU1RPTTFcXFwiOjI1NixcXFwiQ0xfQ1VTVE9NMlxcXCI6NTEyLFxcXCJDTF9DVVNUT00zXFxcIjoxMDI0LFxcXCJDTF9DVVNUT000XFxcIjoyMDQ4LFxcXCJDTF9DVVNUT001XFxcIjo0MDk2LFxcXCJDTF9DVVNUT002XFxcIjo4MTkyLFxcXCJDTF9DVVNUT003XFxcIjoxNjM4NCxcXFwiQ0xfQ1VTVE9NOFxcXCI6MzI3Njh9fX19LFxcXCJzZXJpYWxpemF0aW9uVHlwZVxcXCI6XFxcIm1hcFxcXCJ9XCJ9LHtcInR5cGVcIjpcImF0dGFjaF90b19wbGF5ZXJcIixcImpzb25TY2hlbWFcIjpcIntcXFwidHlwZVxcXCI6XFxcIm9iamVjdFxcXCIsXFxcInByb3BlcnRpZXNcXFwiOntcXFwiYW5jaG9yUG9pbnRJZFxcXCI6e1xcXCJ0eXBlXFxcIjpcXFwiaW50ZWdlclxcXCIsXFxcInNlcmlhbGl6YXRpb25UeXBlXFxcIjpcXFwiaW50MzJcXFwifX0sXFxcInNlcmlhbGl6YXRpb25UeXBlXFxcIjpcXFwibWFwXFxcIn1cIn0se1widHlwZVwiOlwiZGV0YWNoX2Zyb21fcGxheWVyXCIsXCJqc29uU2NoZW1hXCI6XCJ7XFxcInR5cGVcXFwiOlxcXCJvYmplY3RcXFwiLFxcXCJwcm9wZXJ0aWVzXFxcIjp7fSxcXFwic2VyaWFsaXphdGlvblR5cGVcXFwiOlxcXCJtYXBcXFwifVwifSx7XCJ0eXBlXCI6XCJwbGF5X3ZpZGVvX3N0cmVhbVwiLFwianNvblNjaGVtYVwiOlwie1xcXCJ0eXBlXFxcIjpcXFwib2JqZWN0XFxcIixcXFwicHJvcGVydGllc1xcXCI6e1xcXCJzcmNcXFwiOntcXFwidHlwZVxcXCI6XFxcInN0cmluZ1xcXCIsXFxcInNlcmlhbGl6YXRpb25UeXBlXFxcIjpcXFwib3B0aW9uYWxcXFwiLFxcXCJvcHRpb25hbEpzb25TY2hlbWFcXFwiOntcXFwidHlwZVxcXCI6XFxcInN0cmluZ1xcXCIsXFxcInNlcmlhbGl6YXRpb25UeXBlXFxcIjpcXFwidXRmOC1zdHJpbmdcXFwifX0sXFxcImxvb3BcXFwiOntcXFwidHlwZVxcXCI6XFxcImJvb2xlYW5cXFwiLFxcXCJzZXJpYWxpemF0aW9uVHlwZVxcXCI6XFxcIm9wdGlvbmFsXFxcIixcXFwib3B0aW9uYWxKc29uU2NoZW1hXFxcIjp7XFxcInR5cGVcXFwiOlxcXCJib29sZWFuXFxcIixcXFwic2VyaWFsaXphdGlvblR5cGVcXFwiOlxcXCJib29sZWFuXFxcIn19LFxcXCJ2b2x1bWVcXFwiOntcXFwidHlwZVxcXCI6XFxcIm51bWJlclxcXCIsXFxcInNlcmlhbGl6YXRpb25UeXBlXFxcIjpcXFwib3B0aW9uYWxcXFwiLFxcXCJvcHRpb25hbEpzb25TY2hlbWFcXFwiOntcXFwidHlwZVxcXCI6XFxcIm51bWJlclxcXCIsXFxcInNlcmlhbGl6YXRpb25UeXBlXFxcIjpcXFwiZmxvYXQzMlxcXCJ9fSxcXFwiZGNsQ2FzdFxcXCI6e1xcXCJ0eXBlXFxcIjpcXFwiYm9vbGVhblxcXCIsXFxcInNlcmlhbGl6YXRpb25UeXBlXFxcIjpcXFwib3B0aW9uYWxcXFwiLFxcXCJvcHRpb25hbEpzb25TY2hlbWFcXFwiOntcXFwidHlwZVxcXCI6XFxcImJvb2xlYW5cXFwiLFxcXCJzZXJpYWxpemF0aW9uVHlwZVxcXCI6XFxcImJvb2xlYW5cXFwifX19LFxcXCJzZXJpYWxpemF0aW9uVHlwZVxcXCI6XFxcIm1hcFxcXCJ9XCJ9LHtcInR5cGVcIjpcInN0b3BfdmlkZW9fc3RyZWFtXCIsXCJqc29uU2NoZW1hXCI6XCJ7XFxcInR5cGVcXFwiOlxcXCJvYmplY3RcXFwiLFxcXCJwcm9wZXJ0aWVzXFxcIjp7fSxcXFwic2VyaWFsaXphdGlvblR5cGVcXFwiOlxcXCJtYXBcXFwifVwifSx7XCJ0eXBlXCI6XCJwbGF5X2F1ZGlvX3N0cmVhbVwiLFwianNvblNjaGVtYVwiOlwie1xcXCJ0eXBlXFxcIjpcXFwib2JqZWN0XFxcIixcXFwicHJvcGVydGllc1xcXCI6e1xcXCJ1cmxcXFwiOntcXFwidHlwZVxcXCI6XFxcInN0cmluZ1xcXCIsXFxcInNlcmlhbGl6YXRpb25UeXBlXFxcIjpcXFwidXRmOC1zdHJpbmdcXFwifSxcXFwidm9sdW1lXFxcIjp7XFxcInR5cGVcXFwiOlxcXCJudW1iZXJcXFwiLFxcXCJzZXJpYWxpemF0aW9uVHlwZVxcXCI6XFxcIm9wdGlvbmFsXFxcIixcXFwib3B0aW9uYWxKc29uU2NoZW1hXFxcIjp7XFxcInR5cGVcXFwiOlxcXCJudW1iZXJcXFwiLFxcXCJzZXJpYWxpemF0aW9uVHlwZVxcXCI6XFxcImZsb2F0MzJcXFwifX19LFxcXCJzZXJpYWxpemF0aW9uVHlwZVxcXCI6XFxcIm1hcFxcXCJ9XCJ9LHtcInR5cGVcIjpcInN0b3BfYXVkaW9fc3RyZWFtXCIsXCJqc29uU2NoZW1hXCI6XCJ7XFxcInR5cGVcXFwiOlxcXCJvYmplY3RcXFwiLFxcXCJwcm9wZXJ0aWVzXFxcIjp7fSxcXFwic2VyaWFsaXphdGlvblR5cGVcXFwiOlxcXCJtYXBcXFwifVwifSx7XCJ0eXBlXCI6XCJ0ZWxlcG9ydF9wbGF5ZXJcIixcImpzb25TY2hlbWFcIjpcIntcXFwidHlwZVxcXCI6XFxcIm9iamVjdFxcXCIsXFxcInByb3BlcnRpZXNcXFwiOntcXFwieFxcXCI6e1xcXCJ0eXBlXFxcIjpcXFwiaW50ZWdlclxcXCIsXFxcInNlcmlhbGl6YXRpb25UeXBlXFxcIjpcXFwiaW50MzJcXFwifSxcXFwieVxcXCI6e1xcXCJ0eXBlXFxcIjpcXFwiaW50ZWdlclxcXCIsXFxcInNlcmlhbGl6YXRpb25UeXBlXFxcIjpcXFwiaW50MzJcXFwifX0sXFxcInNlcmlhbGl6YXRpb25UeXBlXFxcIjpcXFwibWFwXFxcIn1cIn0se1widHlwZVwiOlwibW92ZV9wbGF5ZXJcIixcImpzb25TY2hlbWFcIjpcIntcXFwidHlwZVxcXCI6XFxcIm9iamVjdFxcXCIsXFxcInByb3BlcnRpZXNcXFwiOntcXFwicG9zaXRpb25cXFwiOntcXFwidHlwZVxcXCI6XFxcIm9iamVjdFxcXCIsXFxcInByb3BlcnRpZXNcXFwiOntcXFwieFxcXCI6e1xcXCJ0eXBlXFxcIjpcXFwibnVtYmVyXFxcIn0sXFxcInlcXFwiOntcXFwidHlwZVxcXCI6XFxcIm51bWJlclxcXCJ9LFxcXCJ6XFxcIjp7XFxcInR5cGVcXFwiOlxcXCJudW1iZXJcXFwifSxcXFwid1xcXCI6e1xcXCJ0eXBlXFxcIjpcXFwibnVtYmVyXFxcIn19LFxcXCJzZXJpYWxpemF0aW9uVHlwZVxcXCI6XFxcInZlY3RvcjNcXFwifSxcXFwiY2FtZXJhVGFyZ2V0XFxcIjp7XFxcInR5cGVcXFwiOlxcXCJvYmplY3RcXFwiLFxcXCJzZXJpYWxpemF0aW9uVHlwZVxcXCI6XFxcIm9wdGlvbmFsXFxcIixcXFwib3B0aW9uYWxKc29uU2NoZW1hXFxcIjp7XFxcInR5cGVcXFwiOlxcXCJvYmplY3RcXFwiLFxcXCJwcm9wZXJ0aWVzXFxcIjp7XFxcInhcXFwiOntcXFwidHlwZVxcXCI6XFxcIm51bWJlclxcXCJ9LFxcXCJ5XFxcIjp7XFxcInR5cGVcXFwiOlxcXCJudW1iZXJcXFwifSxcXFwielxcXCI6e1xcXCJ0eXBlXFxcIjpcXFwibnVtYmVyXFxcIn0sXFxcIndcXFwiOntcXFwidHlwZVxcXCI6XFxcIm51bWJlclxcXCJ9fSxcXFwic2VyaWFsaXphdGlvblR5cGVcXFwiOlxcXCJ2ZWN0b3IzXFxcIn19fSxcXFwic2VyaWFsaXphdGlvblR5cGVcXFwiOlxcXCJtYXBcXFwifVwifSx7XCJ0eXBlXCI6XCJwbGF5X2RlZmF1bHRfZW1vdGVcIixcImpzb25TY2hlbWFcIjpcIntcXFwidHlwZVxcXCI6XFxcIm9iamVjdFxcXCIsXFxcInByb3BlcnRpZXNcXFwiOntcXFwiZW1vdGVcXFwiOntcXFwidHlwZVxcXCI6XFxcInN0cmluZ1xcXCIsXFxcInNlcmlhbGl6YXRpb25UeXBlXFxcIjpcXFwidXRmOC1zdHJpbmdcXFwifX0sXFxcInNlcmlhbGl6YXRpb25UeXBlXFxcIjpcXFwibWFwXFxcIn1cIn0se1widHlwZVwiOlwicGxheV9jdXN0b21fZW1vdGVcIixcImpzb25TY2hlbWFcIjpcIntcXFwidHlwZVxcXCI6XFxcIm9iamVjdFxcXCIsXFxcInByb3BlcnRpZXNcXFwiOntcXFwic3JjXFxcIjp7XFxcInR5cGVcXFwiOlxcXCJzdHJpbmdcXFwiLFxcXCJzZXJpYWxpemF0aW9uVHlwZVxcXCI6XFxcInV0Zjgtc3RyaW5nXFxcIn0sXFxcImxvb3BcXFwiOntcXFwidHlwZVxcXCI6XFxcImJvb2xlYW5cXFwiLFxcXCJzZXJpYWxpemF0aW9uVHlwZVxcXCI6XFxcIm9wdGlvbmFsXFxcIixcXFwib3B0aW9uYWxKc29uU2NoZW1hXFxcIjp7XFxcInR5cGVcXFwiOlxcXCJib29sZWFuXFxcIixcXFwic2VyaWFsaXphdGlvblR5cGVcXFwiOlxcXCJib29sZWFuXFxcIn19fSxcXFwic2VyaWFsaXphdGlvblR5cGVcXFwiOlxcXCJtYXBcXFwifVwifSx7XCJ0eXBlXCI6XCJvcGVuX2xpbmtcIixcImpzb25TY2hlbWFcIjpcIntcXFwidHlwZVxcXCI6XFxcIm9iamVjdFxcXCIsXFxcInByb3BlcnRpZXNcXFwiOntcXFwidXJsXFxcIjp7XFxcInR5cGVcXFwiOlxcXCJzdHJpbmdcXFwiLFxcXCJzZXJpYWxpemF0aW9uVHlwZVxcXCI6XFxcInV0Zjgtc3RyaW5nXFxcIn19LFxcXCJzZXJpYWxpemF0aW9uVHlwZVxcXCI6XFxcIm1hcFxcXCJ9XCJ9LHtcInR5cGVcIjpcInNob3dfdGV4dFwiLFwianNvblNjaGVtYVwiOlwie1xcXCJ0eXBlXFxcIjpcXFwib2JqZWN0XFxcIixcXFwicHJvcGVydGllc1xcXCI6e1xcXCJ0ZXh0XFxcIjp7XFxcInR5cGVcXFwiOlxcXCJzdHJpbmdcXFwiLFxcXCJzZXJpYWxpemF0aW9uVHlwZVxcXCI6XFxcInV0Zjgtc3RyaW5nXFxcIn0sXFxcImhpZGVBZnRlclNlY29uZHNcXFwiOntcXFwidHlwZVxcXCI6XFxcIm51bWJlclxcXCIsXFxcInNlcmlhbGl6YXRpb25UeXBlXFxcIjpcXFwiZmxvYXQzMlxcXCJ9LFxcXCJmb250XFxcIjp7XFxcInR5cGVcXFwiOlxcXCJpbnRlZ2VyXFxcIixcXFwiZW51bVxcXCI6WzAsMSwyXSxcXFwiZGVmYXVsdFxcXCI6MCxcXFwic2VyaWFsaXphdGlvblR5cGVcXFwiOlxcXCJlbnVtLWludFxcXCIsXFxcImVudW1PYmplY3RcXFwiOntcXFwiMFxcXCI6XFxcIkZfU0FOU19TRVJJRlxcXCIsXFxcIjFcXFwiOlxcXCJGX1NFUklGXFxcIixcXFwiMlxcXCI6XFxcIkZfTU9OT1NQQUNFXFxcIixcXFwiRl9TQU5TX1NFUklGXFxcIjowLFxcXCJGX1NFUklGXFxcIjoxLFxcXCJGX01PTk9TUEFDRVxcXCI6Mn19LFxcXCJmb250U2l6ZVxcXCI6e1xcXCJ0eXBlXFxcIjpcXFwibnVtYmVyXFxcIixcXFwic2VyaWFsaXphdGlvblR5cGVcXFwiOlxcXCJvcHRpb25hbFxcXCIsXFxcIm9wdGlvbmFsSnNvblNjaGVtYVxcXCI6e1xcXCJ0eXBlXFxcIjpcXFwibnVtYmVyXFxcIixcXFwic2VyaWFsaXphdGlvblR5cGVcXFwiOlxcXCJmbG9hdDMyXFxcIn19LFxcXCJ0ZXh0QWxpZ25cXFwiOntcXFwidHlwZVxcXCI6XFxcImludGVnZXJcXFwiLFxcXCJlbnVtXFxcIjpbMCwxLDIsMyw0LDUsNiw3LDhdLFxcXCJkZWZhdWx0XFxcIjo0LFxcXCJzZXJpYWxpemF0aW9uVHlwZVxcXCI6XFxcImVudW0taW50XFxcIixcXFwiZW51bU9iamVjdFxcXCI6e1xcXCIwXFxcIjpcXFwiVEFNX1RPUF9MRUZUXFxcIixcXFwiMVxcXCI6XFxcIlRBTV9UT1BfQ0VOVEVSXFxcIixcXFwiMlxcXCI6XFxcIlRBTV9UT1BfUklHSFRcXFwiLFxcXCIzXFxcIjpcXFwiVEFNX01JRERMRV9MRUZUXFxcIixcXFwiNFxcXCI6XFxcIlRBTV9NSURETEVfQ0VOVEVSXFxcIixcXFwiNVxcXCI6XFxcIlRBTV9NSURETEVfUklHSFRcXFwiLFxcXCI2XFxcIjpcXFwiVEFNX0JPVFRPTV9MRUZUXFxcIixcXFwiN1xcXCI6XFxcIlRBTV9CT1RUT01fQ0VOVEVSXFxcIixcXFwiOFxcXCI6XFxcIlRBTV9CT1RUT01fUklHSFRcXFwiLFxcXCJUQU1fVE9QX0xFRlRcXFwiOjAsXFxcIlRBTV9UT1BfQ0VOVEVSXFxcIjoxLFxcXCJUQU1fVE9QX1JJR0hUXFxcIjoyLFxcXCJUQU1fTUlERExFX0xFRlRcXFwiOjMsXFxcIlRBTV9NSURETEVfQ0VOVEVSXFxcIjo0LFxcXCJUQU1fTUlERExFX1JJR0hUXFxcIjo1LFxcXCJUQU1fQk9UVE9NX0xFRlRcXFwiOjYsXFxcIlRBTV9CT1RUT01fQ0VOVEVSXFxcIjo3LFxcXCJUQU1fQk9UVE9NX1JJR0hUXFxcIjo4fX19LFxcXCJzZXJpYWxpemF0aW9uVHlwZVxcXCI6XFxcIm1hcFxcXCJ9XCJ9LHtcInR5cGVcIjpcImhpZGVfdGV4dFwiLFwianNvblNjaGVtYVwiOlwie1xcXCJ0eXBlXFxcIjpcXFwib2JqZWN0XFxcIixcXFwicHJvcGVydGllc1xcXCI6e30sXFxcInNlcmlhbGl6YXRpb25UeXBlXFxcIjpcXFwibWFwXFxcIn1cIn0se1widHlwZVwiOlwic3RhcnRfZGVsYXlcIixcImpzb25TY2hlbWFcIjpcIntcXFwidHlwZVxcXCI6XFxcIm9iamVjdFxcXCIsXFxcInByb3BlcnRpZXNcXFwiOntcXFwiYWN0aW9uc1xcXCI6e1xcXCJ0eXBlXFxcIjpcXFwiYXJyYXlcXFwiLFxcXCJpdGVtc1xcXCI6e1xcXCJ0eXBlXFxcIjpcXFwic3RyaW5nXFxcIixcXFwic2VyaWFsaXphdGlvblR5cGVcXFwiOlxcXCJ1dGY4LXN0cmluZ1xcXCJ9LFxcXCJzZXJpYWxpemF0aW9uVHlwZVxcXCI6XFxcImFycmF5XFxcIn0sXFxcInRpbWVvdXRcXFwiOntcXFwidHlwZVxcXCI6XFxcIm51bWJlclxcXCIsXFxcInNlcmlhbGl6YXRpb25UeXBlXFxcIjpcXFwiZmxvYXQzMlxcXCJ9fSxcXFwic2VyaWFsaXphdGlvblR5cGVcXFwiOlxcXCJtYXBcXFwifVwifSx7XCJ0eXBlXCI6XCJzdG9wX2RlbGF5XCIsXCJqc29uU2NoZW1hXCI6XCJ7XFxcInR5cGVcXFwiOlxcXCJvYmplY3RcXFwiLFxcXCJwcm9wZXJ0aWVzXFxcIjp7XFxcImFjdGlvblxcXCI6e1xcXCJ0eXBlXFxcIjpcXFwic3RyaW5nXFxcIixcXFwic2VyaWFsaXphdGlvblR5cGVcXFwiOlxcXCJ1dGY4LXN0cmluZ1xcXCJ9fSxcXFwic2VyaWFsaXphdGlvblR5cGVcXFwiOlxcXCJtYXBcXFwifVwifSx7XCJ0eXBlXCI6XCJzdGFydF9sb29wXCIsXCJqc29uU2NoZW1hXCI6XCJ7XFxcInR5cGVcXFwiOlxcXCJvYmplY3RcXFwiLFxcXCJwcm9wZXJ0aWVzXFxcIjp7XFxcImFjdGlvbnNcXFwiOntcXFwidHlwZVxcXCI6XFxcImFycmF5XFxcIixcXFwiaXRlbXNcXFwiOntcXFwidHlwZVxcXCI6XFxcInN0cmluZ1xcXCIsXFxcInNlcmlhbGl6YXRpb25UeXBlXFxcIjpcXFwidXRmOC1zdHJpbmdcXFwifSxcXFwic2VyaWFsaXphdGlvblR5cGVcXFwiOlxcXCJhcnJheVxcXCJ9LFxcXCJpbnRlcnZhbFxcXCI6e1xcXCJ0eXBlXFxcIjpcXFwibnVtYmVyXFxcIixcXFwic2VyaWFsaXphdGlvblR5cGVcXFwiOlxcXCJmbG9hdDMyXFxcIn19LFxcXCJzZXJpYWxpemF0aW9uVHlwZVxcXCI6XFxcIm1hcFxcXCJ9XCJ9LHtcInR5cGVcIjpcInN0b3BfbG9vcFwiLFwianNvblNjaGVtYVwiOlwie1xcXCJ0eXBlXFxcIjpcXFwib2JqZWN0XFxcIixcXFwicHJvcGVydGllc1xcXCI6e1xcXCJhY3Rpb25cXFwiOntcXFwidHlwZVxcXCI6XFxcInN0cmluZ1xcXCIsXFxcInNlcmlhbGl6YXRpb25UeXBlXFxcIjpcXFwidXRmOC1zdHJpbmdcXFwifX0sXFxcInNlcmlhbGl6YXRpb25UeXBlXFxcIjpcXFwibWFwXFxcIn1cIn0se1widHlwZVwiOlwiY2xvbmVfZW50aXR5XCIsXCJqc29uU2NoZW1hXCI6XCJ7XFxcInR5cGVcXFwiOlxcXCJvYmplY3RcXFwiLFxcXCJwcm9wZXJ0aWVzXFxcIjp7XFxcInBvc2l0aW9uXFxcIjp7XFxcInR5cGVcXFwiOlxcXCJvYmplY3RcXFwiLFxcXCJwcm9wZXJ0aWVzXFxcIjp7XFxcInhcXFwiOntcXFwidHlwZVxcXCI6XFxcIm51bWJlclxcXCJ9LFxcXCJ5XFxcIjp7XFxcInR5cGVcXFwiOlxcXCJudW1iZXJcXFwifSxcXFwielxcXCI6e1xcXCJ0eXBlXFxcIjpcXFwibnVtYmVyXFxcIn0sXFxcIndcXFwiOntcXFwidHlwZVxcXCI6XFxcIm51bWJlclxcXCJ9fSxcXFwic2VyaWFsaXphdGlvblR5cGVcXFwiOlxcXCJ2ZWN0b3IzXFxcIn19LFxcXCJzZXJpYWxpemF0aW9uVHlwZVxcXCI6XFxcIm1hcFxcXCJ9XCJ9LHtcInR5cGVcIjpcInJlbW92ZV9lbnRpdHlcIixcImpzb25TY2hlbWFcIjpcIntcXFwidHlwZVxcXCI6XFxcIm9iamVjdFxcXCIsXFxcInByb3BlcnRpZXNcXFwiOnt9LFxcXCJzZXJpYWxpemF0aW9uVHlwZVxcXCI6XFxcIm1hcFxcXCJ9XCJ9LHtcInR5cGVcIjpcInNob3dfaW1hZ2VcIixcImpzb25TY2hlbWFcIjpcIntcXFwidHlwZVxcXCI6XFxcIm9iamVjdFxcXCIsXFxcInByb3BlcnRpZXNcXFwiOntcXFwic3JjXFxcIjp7XFxcInR5cGVcXFwiOlxcXCJzdHJpbmdcXFwiLFxcXCJzZXJpYWxpemF0aW9uVHlwZVxcXCI6XFxcInV0Zjgtc3RyaW5nXFxcIn0sXFxcImFsaWduXFxcIjp7XFxcInR5cGVcXFwiOlxcXCJpbnRlZ2VyXFxcIixcXFwiZW51bVxcXCI6WzAsMSwyLDMsNCw1LDYsNyw4XSxcXFwiZGVmYXVsdFxcXCI6NCxcXFwic2VyaWFsaXphdGlvblR5cGVcXFwiOlxcXCJlbnVtLWludFxcXCIsXFxcImVudW1PYmplY3RcXFwiOntcXFwiMFxcXCI6XFxcIlRBTV9UT1BfTEVGVFxcXCIsXFxcIjFcXFwiOlxcXCJUQU1fVE9QX0NFTlRFUlxcXCIsXFxcIjJcXFwiOlxcXCJUQU1fVE9QX1JJR0hUXFxcIixcXFwiM1xcXCI6XFxcIlRBTV9NSURETEVfTEVGVFxcXCIsXFxcIjRcXFwiOlxcXCJUQU1fTUlERExFX0NFTlRFUlxcXCIsXFxcIjVcXFwiOlxcXCJUQU1fTUlERExFX1JJR0hUXFxcIixcXFwiNlxcXCI6XFxcIlRBTV9CT1RUT01fTEVGVFxcXCIsXFxcIjdcXFwiOlxcXCJUQU1fQk9UVE9NX0NFTlRFUlxcXCIsXFxcIjhcXFwiOlxcXCJUQU1fQk9UVE9NX1JJR0hUXFxcIixcXFwiVEFNX1RPUF9MRUZUXFxcIjowLFxcXCJUQU1fVE9QX0NFTlRFUlxcXCI6MSxcXFwiVEFNX1RPUF9SSUdIVFxcXCI6MixcXFwiVEFNX01JRERMRV9MRUZUXFxcIjozLFxcXCJUQU1fTUlERExFX0NFTlRFUlxcXCI6NCxcXFwiVEFNX01JRERMRV9SSUdIVFxcXCI6NSxcXFwiVEFNX0JPVFRPTV9MRUZUXFxcIjo2LFxcXCJUQU1fQk9UVE9NX0NFTlRFUlxcXCI6NyxcXFwiVEFNX0JPVFRPTV9SSUdIVFxcXCI6OH19LFxcXCJoZWlnaHRcXFwiOntcXFwidHlwZVxcXCI6XFxcIm51bWJlclxcXCIsXFxcInNlcmlhbGl6YXRpb25UeXBlXFxcIjpcXFwiZmxvYXQzMlxcXCJ9LFxcXCJ3aWR0aFxcXCI6e1xcXCJ0eXBlXFxcIjpcXFwibnVtYmVyXFxcIixcXFwic2VyaWFsaXphdGlvblR5cGVcXFwiOlxcXCJmbG9hdDMyXFxcIn0sXFxcImhpZGVBZnRlclNlY29uZHNcXFwiOntcXFwidHlwZVxcXCI6XFxcIm51bWJlclxcXCIsXFxcInNlcmlhbGl6YXRpb25UeXBlXFxcIjpcXFwib3B0aW9uYWxcXFwiLFxcXCJvcHRpb25hbEpzb25TY2hlbWFcXFwiOntcXFwidHlwZVxcXCI6XFxcIm51bWJlclxcXCIsXFxcInNlcmlhbGl6YXRpb25UeXBlXFxcIjpcXFwiZmxvYXQzMlxcXCJ9fSxcXFwidGV4dFxcXCI6e1xcXCJ0eXBlXFxcIjpcXFwic3RyaW5nXFxcIixcXFwic2VyaWFsaXphdGlvblR5cGVcXFwiOlxcXCJvcHRpb25hbFxcXCIsXFxcIm9wdGlvbmFsSnNvblNjaGVtYVxcXCI6e1xcXCJ0eXBlXFxcIjpcXFwic3RyaW5nXFxcIixcXFwic2VyaWFsaXphdGlvblR5cGVcXFwiOlxcXCJ1dGY4LXN0cmluZ1xcXCJ9fSxcXFwiZm9udFNpemVcXFwiOntcXFwidHlwZVxcXCI6XFxcIm51bWJlclxcXCIsXFxcInNlcmlhbGl6YXRpb25UeXBlXFxcIjpcXFwib3B0aW9uYWxcXFwiLFxcXCJvcHRpb25hbEpzb25TY2hlbWFcXFwiOntcXFwidHlwZVxcXCI6XFxcIm51bWJlclxcXCIsXFxcInNlcmlhbGl6YXRpb25UeXBlXFxcIjpcXFwiZmxvYXQzMlxcXCJ9fX0sXFxcInNlcmlhbGl6YXRpb25UeXBlXFxcIjpcXFwibWFwXFxcIn1cIn0se1widHlwZVwiOlwiaGlkZV9pbWFnZVwiLFwianNvblNjaGVtYVwiOlwie1xcXCJ0eXBlXFxcIjpcXFwib2JqZWN0XFxcIixcXFwicHJvcGVydGllc1xcXCI6e1xcXCJpbWFnZUVudGl0eVxcXCI6e1xcXCJ0eXBlXFxcIjpcXFwiaW50ZWdlclxcXCIsXFxcInNlcmlhbGl6YXRpb25UeXBlXFxcIjpcXFwib3B0aW9uYWxcXFwiLFxcXCJvcHRpb25hbEpzb25TY2hlbWFcXFwiOntcXFwidHlwZVxcXCI6XFxcImludGVnZXJcXFwiLFxcXCJzZXJpYWxpemF0aW9uVHlwZVxcXCI6XFxcImludDMyXFxcIn19fSxcXFwic2VyaWFsaXphdGlvblR5cGVcXFwiOlxcXCJtYXBcXFwifVwifV19fX19LHtcIm5hbWVcIjpcImFzc2V0LXBhY2tzOjpBY3Rpb25zXCIsXCJqc29uU2NoZW1hXCI6e1widHlwZVwiOlwib2JqZWN0XCIsXCJwcm9wZXJ0aWVzXCI6e1wiaWRcIjp7XCJ0eXBlXCI6XCJpbnRlZ2VyXCIsXCJzZXJpYWxpemF0aW9uVHlwZVwiOlwiaW50MzJcIn0sXCJ2YWx1ZVwiOntcInR5cGVcIjpcImFycmF5XCIsXCJpdGVtc1wiOntcInR5cGVcIjpcIm9iamVjdFwiLFwicHJvcGVydGllc1wiOntcIm5hbWVcIjp7XCJ0eXBlXCI6XCJzdHJpbmdcIixcInNlcmlhbGl6YXRpb25UeXBlXCI6XCJ1dGY4LXN0cmluZ1wifSxcInR5cGVcIjp7XCJ0eXBlXCI6XCJzdHJpbmdcIixcInNlcmlhbGl6YXRpb25UeXBlXCI6XCJ1dGY4LXN0cmluZ1wifSxcImpzb25QYXlsb2FkXCI6e1widHlwZVwiOlwic3RyaW5nXCIsXCJzZXJpYWxpemF0aW9uVHlwZVwiOlwidXRmOC1zdHJpbmdcIn19LFwic2VyaWFsaXphdGlvblR5cGVcIjpcIm1hcFwifSxcInNlcmlhbGl6YXRpb25UeXBlXCI6XCJhcnJheVwifX0sXCJzZXJpYWxpemF0aW9uVHlwZVwiOlwibWFwXCJ9LFwiZGF0YVwiOntcIjUxOFwiOntcImpzb25cIjp7XCJpZFwiOjEsXCJ2YWx1ZVwiOlt7XCJuYW1lXCI6XCJQbGF5IEFjdGl2YXRlIEFuaW1hdGlvblwiLFwidHlwZVwiOlwicGxheV9hbmltYXRpb25cIixcImpzb25QYXlsb2FkXCI6XCJ7IFxcXCJhbmltYXRpb25cXFwiOiBcXFwidHJpZ2dlclxcXCIgfVwifSx7XCJuYW1lXCI6XCJQbGF5IFNvdW5kXCIsXCJ0eXBlXCI6XCJwbGF5X3NvdW5kXCIsXCJqc29uUGF5bG9hZFwiOlwie1xcXCJzcmNcXFwiOlxcXCJhc3NldHMvYnVpbGRlci9yZWRfYnV0dG9uL3NvdW5kLm1wM1xcXCJ9XCJ9XX19LFwiNTE5XCI6e1wianNvblwiOntcImlkXCI6MixcInZhbHVlXCI6W3tcIm5hbWVcIjpcIlBsYXkgQWN0aXZhdGUgQW5pbWF0aW9uXCIsXCJ0eXBlXCI6XCJwbGF5X2FuaW1hdGlvblwiLFwianNvblBheWxvYWRcIjpcInsgXFxcImFuaW1hdGlvblxcXCI6IFxcXCJ0cmlnZ2VyXFxcIiB9XCJ9LHtcIm5hbWVcIjpcIlBsYXkgU291bmRcIixcInR5cGVcIjpcInBsYXlfc291bmRcIixcImpzb25QYXlsb2FkXCI6XCJ7XFxcInNyY1xcXCI6XFxcImFzc2V0cy9idWlsZGVyL3JlZF9idXR0b24vc291bmQubXAzXFxcIn1cIn1dfX0sXCI1MjBcIjp7XCJqc29uXCI6e1wiaWRcIjozLFwidmFsdWVcIjpbe1wibmFtZVwiOlwiUGxheSBBY3RpdmF0ZSBBbmltYXRpb25cIixcInR5cGVcIjpcInBsYXlfYW5pbWF0aW9uXCIsXCJqc29uUGF5bG9hZFwiOlwieyBcXFwiYW5pbWF0aW9uXFxcIjogXFxcInRyaWdnZXJcXFwiIH1cIn0se1wibmFtZVwiOlwiUGxheSBTb3VuZFwiLFwidHlwZVwiOlwicGxheV9zb3VuZFwiLFwianNvblBheWxvYWRcIjpcIntcXFwic3JjXFxcIjpcXFwiYXNzZXRzL2J1aWxkZXIvcmVkX2J1dHRvbi9zb3VuZC5tcDNcXFwifVwifV19fSxcIjUyMVwiOntcImpzb25cIjp7XCJpZFwiOjQsXCJ2YWx1ZVwiOlt7XCJuYW1lXCI6XCJQbGF5IEFjdGl2YXRlIEFuaW1hdGlvblwiLFwidHlwZVwiOlwicGxheV9hbmltYXRpb25cIixcImpzb25QYXlsb2FkXCI6XCJ7IFxcXCJhbmltYXRpb25cXFwiOiBcXFwidHJpZ2dlclxcXCIgfVwifSx7XCJuYW1lXCI6XCJQbGF5IFNvdW5kXCIsXCJ0eXBlXCI6XCJwbGF5X3NvdW5kXCIsXCJqc29uUGF5bG9hZFwiOlwie1xcXCJzcmNcXFwiOlxcXCJhc3NldHMvYnVpbGRlci9yZWRfYnV0dG9uL3NvdW5kLm1wM1xcXCJ9XCJ9XX19LFwiNTM4XCI6e1wianNvblwiOntcImlkXCI6NSxcInZhbHVlXCI6W3tcIm5hbWVcIjpcIlBsYXkgQWN0aXZhdGUgQW5pbWF0aW9uXCIsXCJ0eXBlXCI6XCJwbGF5X2FuaW1hdGlvblwiLFwianNvblBheWxvYWRcIjpcInsgXFxcImFuaW1hdGlvblxcXCI6IFxcXCJ0cmlnZ2VyXFxcIiB9XCJ9LHtcIm5hbWVcIjpcIlBsYXkgU291bmRcIixcInR5cGVcIjpcInBsYXlfc291bmRcIixcImpzb25QYXlsb2FkXCI6XCJ7XFxcInNyY1xcXCI6XFxcImFzc2V0cy9idWlsZGVyL3JlZF9saWdodF9idXR0b24vc291bmQubXAzXFxcIn1cIn1dfX19fSx7XCJuYW1lXCI6XCJhc3NldC1wYWNrczo6Q291bnRlclwiLFwianNvblNjaGVtYVwiOntcInR5cGVcIjpcIm9iamVjdFwiLFwicHJvcGVydGllc1wiOntcImlkXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJzZXJpYWxpemF0aW9uVHlwZVwiOlwiZmxvYXQzMlwifSxcInZhbHVlXCI6e1widHlwZVwiOlwiaW50ZWdlclwiLFwic2VyaWFsaXphdGlvblR5cGVcIjpcImludDMyXCJ9fSxcInNlcmlhbGl6YXRpb25UeXBlXCI6XCJtYXBcIn0sXCJkYXRhXCI6e1wiMFwiOntcImpzb25cIjp7XCJpZFwiOjAsXCJ2YWx1ZVwiOjV9fX19LHtcIm5hbWVcIjpcImFzc2V0LXBhY2tzOjpUcmlnZ2Vyc1wiLFwianNvblNjaGVtYVwiOntcInR5cGVcIjpcIm9iamVjdFwiLFwicHJvcGVydGllc1wiOntcInZhbHVlXCI6e1widHlwZVwiOlwiYXJyYXlcIixcIml0ZW1zXCI6e1widHlwZVwiOlwib2JqZWN0XCIsXCJwcm9wZXJ0aWVzXCI6e1widHlwZVwiOntcInR5cGVcIjpcInN0cmluZ1wiLFwiZW51bVwiOltcIm9uX2NsaWNrXCIsXCJvbl9zdGF0ZV9jaGFuZ2VcIixcIm9uX3NwYXduXCIsXCJvbl90d2Vlbl9lbmRcIixcIm9uX2NvdW50ZXJfY2hhbmdlXCIsXCJvbl9wbGF5ZXJfZW50ZXJzX2FyZWFcIixcIm9uX3BsYXllcl9sZWF2ZXNfYXJlYVwiLFwib25fZGVsYXlcIixcIm9uX2xvb3BcIixcIm9uX2Nsb25lXCIsXCJvbl9jbGlja19pbWFnZVwiXSxcImRlZmF1bHRcIjpcIm9uX2NsaWNrXCIsXCJzZXJpYWxpemF0aW9uVHlwZVwiOlwiZW51bS1zdHJpbmdcIixcImVudW1PYmplY3RcIjp7XCJPTl9DTElDS1wiOlwib25fY2xpY2tcIixcIk9OX1NUQVRFX0NIQU5HRVwiOlwib25fc3RhdGVfY2hhbmdlXCIsXCJPTl9TUEFXTlwiOlwib25fc3Bhd25cIixcIk9OX1RXRUVOX0VORFwiOlwib25fdHdlZW5fZW5kXCIsXCJPTl9DT1VOVEVSX0NIQU5HRVwiOlwib25fY291bnRlcl9jaGFuZ2VcIixcIk9OX1BMQVlFUl9FTlRFUlNfQVJFQVwiOlwib25fcGxheWVyX2VudGVyc19hcmVhXCIsXCJPTl9QTEFZRVJfTEVBVkVTX0FSRUFcIjpcIm9uX3BsYXllcl9sZWF2ZXNfYXJlYVwiLFwiT05fREVMQVlcIjpcIm9uX2RlbGF5XCIsXCJPTl9MT09QXCI6XCJvbl9sb29wXCIsXCJPTl9DTE9ORVwiOlwib25fY2xvbmVcIixcIk9OX0NMSUNLX0lNQUdFXCI6XCJvbl9jbGlja19pbWFnZVwifX0sXCJjb25kaXRpb25zXCI6e1widHlwZVwiOlwiYXJyYXlcIixcInNlcmlhbGl6YXRpb25UeXBlXCI6XCJvcHRpb25hbFwiLFwib3B0aW9uYWxKc29uU2NoZW1hXCI6e1widHlwZVwiOlwiYXJyYXlcIixcIml0ZW1zXCI6e1widHlwZVwiOlwib2JqZWN0XCIsXCJwcm9wZXJ0aWVzXCI6e1wiaWRcIjp7XCJ0eXBlXCI6XCJpbnRlZ2VyXCIsXCJzZXJpYWxpemF0aW9uVHlwZVwiOlwib3B0aW9uYWxcIixcIm9wdGlvbmFsSnNvblNjaGVtYVwiOntcInR5cGVcIjpcImludGVnZXJcIixcInNlcmlhbGl6YXRpb25UeXBlXCI6XCJpbnQzMlwifX0sXCJ0eXBlXCI6e1widHlwZVwiOlwic3RyaW5nXCIsXCJlbnVtXCI6W1wid2hlbl9zdGF0ZV9pc1wiLFwid2hlbl9zdGF0ZV9pc19ub3RcIixcIndoZW5fY291bnRlcl9lcXVhbHNcIixcIndoZW5fY291bnRlcl9pc19ncmVhdGVyX3RoYW5cIixcIndoZW5fY291bnRlcl9pc19sZXNzX3RoYW5cIl0sXCJkZWZhdWx0XCI6XCJ3aGVuX3N0YXRlX2lzXCIsXCJzZXJpYWxpemF0aW9uVHlwZVwiOlwiZW51bS1zdHJpbmdcIixcImVudW1PYmplY3RcIjp7XCJXSEVOX1NUQVRFX0lTXCI6XCJ3aGVuX3N0YXRlX2lzXCIsXCJXSEVOX1NUQVRFX0lTX05PVFwiOlwid2hlbl9zdGF0ZV9pc19ub3RcIixcIldIRU5fQ09VTlRFUl9FUVVBTFNcIjpcIndoZW5fY291bnRlcl9lcXVhbHNcIixcIldIRU5fQ09VTlRFUl9JU19HUkVBVEVSX1RIQU5cIjpcIndoZW5fY291bnRlcl9pc19ncmVhdGVyX3RoYW5cIixcIldIRU5fQ09VTlRFUl9JU19MRVNTX1RIQU5cIjpcIndoZW5fY291bnRlcl9pc19sZXNzX3RoYW5cIn19LFwidmFsdWVcIjp7XCJ0eXBlXCI6XCJzdHJpbmdcIixcInNlcmlhbGl6YXRpb25UeXBlXCI6XCJ1dGY4LXN0cmluZ1wifX0sXCJzZXJpYWxpemF0aW9uVHlwZVwiOlwibWFwXCJ9LFwic2VyaWFsaXphdGlvblR5cGVcIjpcImFycmF5XCJ9fSxcIm9wZXJhdGlvblwiOntcInR5cGVcIjpcInN0cmluZ1wiLFwic2VyaWFsaXphdGlvblR5cGVcIjpcIm9wdGlvbmFsXCIsXCJvcHRpb25hbEpzb25TY2hlbWFcIjp7XCJ0eXBlXCI6XCJzdHJpbmdcIixcImVudW1cIjpbXCJhbmRcIixcIm9yXCJdLFwiZGVmYXVsdFwiOlwiYW5kXCIsXCJzZXJpYWxpemF0aW9uVHlwZVwiOlwiZW51bS1zdHJpbmdcIixcImVudW1PYmplY3RcIjp7XCJBTkRcIjpcImFuZFwiLFwiT1JcIjpcIm9yXCJ9fX0sXCJhY3Rpb25zXCI6e1widHlwZVwiOlwiYXJyYXlcIixcIml0ZW1zXCI6e1widHlwZVwiOlwib2JqZWN0XCIsXCJwcm9wZXJ0aWVzXCI6e1wiaWRcIjp7XCJ0eXBlXCI6XCJpbnRlZ2VyXCIsXCJzZXJpYWxpemF0aW9uVHlwZVwiOlwib3B0aW9uYWxcIixcIm9wdGlvbmFsSnNvblNjaGVtYVwiOntcInR5cGVcIjpcImludGVnZXJcIixcInNlcmlhbGl6YXRpb25UeXBlXCI6XCJpbnQzMlwifX0sXCJuYW1lXCI6e1widHlwZVwiOlwic3RyaW5nXCIsXCJzZXJpYWxpemF0aW9uVHlwZVwiOlwib3B0aW9uYWxcIixcIm9wdGlvbmFsSnNvblNjaGVtYVwiOntcInR5cGVcIjpcInN0cmluZ1wiLFwic2VyaWFsaXphdGlvblR5cGVcIjpcInV0Zjgtc3RyaW5nXCJ9fX0sXCJzZXJpYWxpemF0aW9uVHlwZVwiOlwibWFwXCJ9LFwic2VyaWFsaXphdGlvblR5cGVcIjpcImFycmF5XCJ9fSxcInNlcmlhbGl6YXRpb25UeXBlXCI6XCJtYXBcIn0sXCJzZXJpYWxpemF0aW9uVHlwZVwiOlwiYXJyYXlcIn19LFwic2VyaWFsaXphdGlvblR5cGVcIjpcIm1hcFwifSxcImRhdGFcIjp7XCI1MThcIjp7XCJqc29uXCI6e1widmFsdWVcIjpbe1widHlwZVwiOlwib25fY2xpY2tcIixcImNvbmRpdGlvbnNcIjpbXSxcImFjdGlvbnNcIjpbe1wiaWRcIjoxLFwibmFtZVwiOlwiUGxheSBBY3RpdmF0ZSBBbmltYXRpb25cIn0se1wiaWRcIjoxLFwibmFtZVwiOlwiUGxheSBTb3VuZFwifV19XX19LFwiNTE5XCI6e1wianNvblwiOntcInZhbHVlXCI6W3tcInR5cGVcIjpcIm9uX2NsaWNrXCIsXCJjb25kaXRpb25zXCI6W10sXCJhY3Rpb25zXCI6W3tcImlkXCI6MixcIm5hbWVcIjpcIlBsYXkgQWN0aXZhdGUgQW5pbWF0aW9uXCJ9LHtcImlkXCI6MixcIm5hbWVcIjpcIlBsYXkgU291bmRcIn1dfV19fSxcIjUyMFwiOntcImpzb25cIjp7XCJ2YWx1ZVwiOlt7XCJ0eXBlXCI6XCJvbl9jbGlja1wiLFwiY29uZGl0aW9uc1wiOltdLFwiYWN0aW9uc1wiOlt7XCJpZFwiOjMsXCJuYW1lXCI6XCJQbGF5IEFjdGl2YXRlIEFuaW1hdGlvblwifSx7XCJpZFwiOjMsXCJuYW1lXCI6XCJQbGF5IFNvdW5kXCJ9XX1dfX0sXCI1MjFcIjp7XCJqc29uXCI6e1widmFsdWVcIjpbe1widHlwZVwiOlwib25fY2xpY2tcIixcImNvbmRpdGlvbnNcIjpbXSxcImFjdGlvbnNcIjpbe1wiaWRcIjo0LFwibmFtZVwiOlwiUGxheSBBY3RpdmF0ZSBBbmltYXRpb25cIn0se1wiaWRcIjo0LFwibmFtZVwiOlwiUGxheSBTb3VuZFwifV19XX19LFwiNTM4XCI6e1wianNvblwiOntcInZhbHVlXCI6W3tcInR5cGVcIjpcIm9uX2NsaWNrXCIsXCJjb25kaXRpb25zXCI6W10sXCJhY3Rpb25zXCI6W3tcImlkXCI6NSxcIm5hbWVcIjpcIlBsYXkgQWN0aXZhdGUgQW5pbWF0aW9uXCJ9LHtcImlkXCI6NSxcIm5hbWVcIjpcIlBsYXkgU291bmRcIn1dfV19fX19LHtcIm5hbWVcIjpcImluc3BlY3Rvcjo6VHJhbnNmb3JtQ29uZmlnXCIsXCJqc29uU2NoZW1hXCI6e1widHlwZVwiOlwib2JqZWN0XCIsXCJwcm9wZXJ0aWVzXCI6e1wicG9ycG9ydGlvbmFsU2NhbGluZ1wiOntcInR5cGVcIjpcImJvb2xlYW5cIixcInNlcmlhbGl6YXRpb25UeXBlXCI6XCJvcHRpb25hbFwiLFwib3B0aW9uYWxKc29uU2NoZW1hXCI6e1widHlwZVwiOlwiYm9vbGVhblwiLFwic2VyaWFsaXphdGlvblR5cGVcIjpcImJvb2xlYW5cIn19fSxcInNlcmlhbGl6YXRpb25UeXBlXCI6XCJtYXBcIn0sXCJkYXRhXCI6e1wiNTEzXCI6e1wianNvblwiOnt9fSxcIjUxNFwiOntcImpzb25cIjp7fX0sXCI1MTVcIjp7XCJqc29uXCI6e319LFwiNTE2XCI6e1wianNvblwiOnt9fSxcIjUxN1wiOntcImpzb25cIjp7fX0sXCI1MThcIjp7XCJqc29uXCI6e319LFwiNTE5XCI6e1wianNvblwiOnt9fSxcIjUyMFwiOntcImpzb25cIjp7fX0sXCI1MjFcIjp7XCJqc29uXCI6e319LFwiNTIyXCI6e1wianNvblwiOnt9fSxcIjUyM1wiOntcImpzb25cIjp7fX0sXCI1MjRcIjp7XCJqc29uXCI6e319LFwiNTI1XCI6e1wianNvblwiOnt9fSxcIjUyNlwiOntcImpzb25cIjp7fX0sXCI1MjdcIjp7XCJqc29uXCI6e319LFwiNTI4XCI6e1wianNvblwiOnt9fSxcIjUyOVwiOntcImpzb25cIjp7fX0sXCI1MzBcIjp7XCJqc29uXCI6e319LFwiNTMxXCI6e1wianNvblwiOnt9fSxcIjUzMlwiOntcImpzb25cIjp7fX0sXCI1MzRcIjp7XCJqc29uXCI6e319LFwiNTM1XCI6e1wianNvblwiOnt9fSxcIjUzNlwiOntcImpzb25cIjp7fX0sXCI1MzdcIjp7XCJqc29uXCI6e319LFwiNTM4XCI6e1wianNvblwiOnt9fSxcIjUzOVwiOntcImpzb25cIjp7fX0sXCI1NDBcIjp7XCJqc29uXCI6e319LFwiNTQxXCI6e1wianNvblwiOnt9fX19LHtcIm5hbWVcIjpcImN1YmUtaWRcIixcImpzb25TY2hlbWFcIjp7XCJ0eXBlXCI6XCJvYmplY3RcIixcInByb3BlcnRpZXNcIjp7fSxcInNlcmlhbGl6YXRpb25UeXBlXCI6XCJtYXBcIn0sXCJkYXRhXCI6e1wiNTEyXCI6e1wianNvblwiOnt9fX19XX19IiwgImltcG9ydCB7IGNvbXBvc2l0ZUZyb21Mb2FkZXIgfSBmcm9tICd+c2RrL2FsbC1jb21wb3NpdGVzJ1xuaW1wb3J0IHsgQ29tcG9zaXRlIH0gZnJvbSAnQGRjbC9lY3MnXG5cbmNvbnN0IGNvbXBvc2l0ZXM6IENvbXBvc2l0ZS5SZXNvdXJjZVtdID0gW11cblxuLy8gQHB1YmxpY1xuZXhwb3J0IGNvbnN0IGNvbXBvc2l0ZVByb3ZpZGVyOiBDb21wb3NpdGUuUHJvdmlkZXIgPSB7XG4gIGdldENvbXBvc2l0ZU9yTnVsbChzcmM6IHN0cmluZywgX2N1cnJlbnRQYXRoPzogc3RyaW5nKSB7XG4gICAgLy8gVE9ETzogcmVzb2x2ZSBwYXRoIGZyb20gc3JjIGFuZCBjdXJyZW50UGF0aFxuXG4gICAgY29uc3QgZnJvbUxvYWRlciA9IGNvbXBvc2l0ZUZyb21Mb2FkZXJbc3JjXVxuICAgIGlmIChmcm9tTG9hZGVyKSB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoZnJvbUxvYWRlciBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICAgICAgICBjb25zdCBjb21wb3NpdGUgPSBDb21wb3NpdGUuZnJvbUJpbmFyeShmcm9tTG9hZGVyKVxuICAgICAgICAgIGNvbXBvc2l0ZXMucHVzaCh7IHNyYywgY29tcG9zaXRlIH0pXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGZyb21Mb2FkZXIgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgY29uc3QgY29tcG9zaXRlID0gQ29tcG9zaXRlLmZyb21Kc29uKEpTT04ucGFyc2UoZnJvbUxvYWRlcikpXG4gICAgICAgICAgY29tcG9zaXRlcy5wdXNoKHsgc3JjLCBjb21wb3NpdGUgfSlcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZnJvbUxvYWRlciA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICBjb25zdCBjb21wb3NpdGUgPSBDb21wb3NpdGUuZnJvbUpzb24oZnJvbUxvYWRlcilcbiAgICAgICAgICBjb21wb3NpdGVzLnB1c2goeyBzcmMsIGNvbXBvc2l0ZSB9KVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnIpXG4gICAgICB9XG5cbiAgICAgIGRlbGV0ZSBjb21wb3NpdGVGcm9tTG9hZGVyW3NyY11cbiAgICB9XG5cbiAgICByZXR1cm4gY29tcG9zaXRlcy5maW5kKChpdGVtKSA9PiBpdGVtLnNyYyA9PT0gc3JjKSB8fCBudWxsXG4gIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUEsZ0RBQUFBLFVBQUFDLFNBQUE7QUFBQTtBQUNBLElBQUFBLFFBQU8sVUFBVTtBQW1CakIsYUFBUyxVQUFVLElBQUksS0FBbUI7QUFDdEMsVUFBSSxTQUFVLElBQUksTUFBTSxVQUFVLFNBQVMsQ0FBQyxHQUN4QyxTQUFVLEdBQ1YsUUFBVSxHQUNWLFVBQVU7QUFDZCxhQUFPLFFBQVEsVUFBVTtBQUNyQixlQUFPLFFBQVEsSUFBSSxVQUFVLE9BQU87QUFDeEMsYUFBTyxJQUFJLFFBQVEsU0FBUyxTQUFTQyxVQUFTLFFBQVE7QUFDbEQsZUFBTyxNQUFNLElBQUksU0FBUyxTQUFTLEtBQW1CO0FBQ2xELGNBQUksU0FBUztBQUNULHNCQUFVO0FBQ1YsZ0JBQUk7QUFDQSxxQkFBTyxHQUFHO0FBQUEsaUJBQ1Q7QUFDRCxrQkFBSUMsVUFBUyxJQUFJLE1BQU0sVUFBVSxTQUFTLENBQUMsR0FDdkNDLFVBQVM7QUFDYixxQkFBT0EsVUFBU0QsUUFBTztBQUNuQixnQkFBQUEsUUFBT0MsU0FBUSxJQUFJLFVBQVVBLE9BQU07QUFDdkMsY0FBQUYsU0FBUSxNQUFNLE1BQU1DLE9BQU07QUFBQSxZQUM5QjtBQUFBLFVBQ0o7QUFBQSxRQUNKO0FBQ0Es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QTtBQUFBLFVBRUo7QUFFQSxpQkFBTztBQUFBLFFBQ1Q7QUFHQSxZQUFJO0FBQUE7QUFBQSxVQUVKO0FBQUE7QUFDQSxZQUFJO0FBQUE7QUFBQSxVQUVKO0FBQUE7QUFFQSxZQUFJO0FBQUE7QUFBQSxVQUVKO0FBQUE7QUFDQSxZQUFJO0FBQUE7QUFBQSxVQUVKO0FBQUE7QUFDQSxZQUFJO0FBQUE7QUFBQSxVQUVKO0FBQUE7QUFDQSxZQUFJO0FBQUE7QUFBQSxVQUVKO0FBQUE7QUFDQSxZQUFJO0FBQUE7QUFBQSxVQUVKO0FBQUE7QUFDQSxZQUFJO0FBQUE7QUFBQSxVQUVKO0FBQUE7QUFDQSxZQUFJO0FBQUE7QUFBQSxVQUVKO0FBQUE7QUFDQSxZQUFJO0FBQUE7QUFBQSxVQUVKO0FBQUE7QUFDQSxZQUFJO0FBQUE7QUFBQSxVQUVKO0FBQUE7QUFDQSxZQUFJO0FBQUE7QUFBQSxVQUVKO0FBQUE7QUFDQSxZQUFJO0FBQUE7QUFBQSxVQUVKO0FBQUE7QUFDQSxZQUFJO0FBQUE7QUFBQSxVQUVKO0FBQUE7QUFDQSxZQUFJO0FBQUE7QUFBQSxVQUVKO0FBQUE7QUFDQSxZQUFJLHNCQUFzQixVQUFVLFNBQVMsV0FBVyxNQUFNLFdBQVc7QUFFekUsWUFBSTtBQUFBO0FBQUEsVUFFSjtBQUFBO0FBRUEsWUFBSTtBQUFBO0FBQUEsVUFFSjtBQUFBO0FBQ0EsWUFBSTtBQUFBO0FBQUEsVUFFSjtBQUFBO0FBQ0EsWUFBSTtBQUFBO0FBQUEsVUFFSjtBQUFBO0FBQ0EsWUFBSTtBQUFBO0FBQUEsVUFFSjtBQUFBO0FBTUEsWUFBSTtBQUFBO0FBQUEsVUFFSjtBQUFBO0FBQ0EsWUFBSTtBQUFBO0FBQUEsVUFFSjtBQUFBO0FBQ0EsWUFBSTtBQUFBO0FBQUEsVUFFSjtBQUFBO0FBSUEsWUFBSTtBQUFBO0FBQUEsVUFFSjtBQUFBO0FBQ0EsWUFBSTtBQUFBO0FBQUEsVUFFSjtBQUFBO0FBR0EsWUFBSTtBQUFBO0FBQUE7QUFBQSxVQUVKLFNBQVMsV0FBYTtBQUFBO0FBQ3RCLFlBQUksZUFBZSxZQUFZLFNBQVMsZ0JB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O0FBQUEsVUFFSjtBQUFBO0FBQ0EsWUFBSTtBQUFBO0FBQUEsVUFFSjtBQUFBO0FBQ0EsWUFBSTtBQUFBO0FBQUEsVUFFSjtBQUFBO0FBQ0EsWUFBSTtBQUFBO0FBQUEsVUFFSjtBQUFBO0FBQ0EsWUFBSTtBQUFBO0FBQUEsVUFFSjtBQUFBO0FBQ0EsWUFBSTtBQUFBO0FBQUEsVUFFSjtBQUFBO0FBQ0EsWUFBSTtBQUFBO0FBQUEsVUFFSjtBQUFBO0FBQ0EsWUFBSTtBQUFBO0FBQUEsVUFFSjtBQUFBO0FBQ0EsWUFBSTtBQUFBO0FBQUEsVUFFSjtBQUFBO0FBQ0EsWUFBSTtBQUFBO0FBQUEsVUFFSjtBQUFBO0FBQ0EsWUFBSTtBQUFBO0FBQUEsVUFFSjtBQUFBO0FBQ0EsWUFBSTtBQUFBO0FBQUEsVUFFSjtBQUFBO0FBQ0EsWUFBSTtBQUFBO0FBQUEsVUFFSjtBQUFBO0FBQ0EsWUFBSTtBQUFBO0FBQUEsVUFFSjtBQUFBO0FBQ0EsWUFBSTtBQUFBO0FBQUEsVUFFSjtBQUFBO0FBQ0EsWUFBSTtBQUFBO0FBQUEsVUFFSjtBQUFBO0FBQ0EsWUFBSTtBQUFBO0FBQUEsVUFFSjtBQUFBO0FBQ0EsWUFBSTtBQUFBO0FBQUEsVUFFSjtBQUFBO0FBQ0EsWUFBSTtBQUFBO0FBQUEsVUFFSjtBQUFBO0FBQ0EsWUFBSTtBQUFBO0FBQUEsVUFFSjtBQUFBO0FBQ0EsWUFBSTtBQUFBO0FBQUEsVUFFSjtBQUFBO0FBQ0EsWUFBSTtBQUFBO0FBQUEsVUFFSjtBQUFBO0FBQ0EsWUFBSTtBQUFBO0FBQUEsVUFFSjtBQUFBO0FBQ0EsWUFBSTtBQUFBO0FBQUEsVUFFSjtBQUFBO0FBQ0EsWUFBSTtBQUFBO0FBQUEsVUFFSjtBQUFBO0FBQ0EsWUFBSTtBQUFBO0FBQUEsVUFFSjtBQUFBO0FBQ0EsWUFBSTtBQUFBO0FBQUEsVUFFSjtBQUFBO0FBQ0EsWUFBSTtBQUFBO0FBQUEsVUFFSjtBQUFBO0FBQ0EsWUFBSTtBQUFBO0FBQUEsVUFFSjtBQUFBO0FBQ0EsWUFBSSxnQkFBZ0I7QUFDcEIsWUFBSTtBQUFBO0FBQUEsVUFFSjtB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QSxJQUFJO0FBQUEsSUFBSztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQUk7QUFBQSxJQUFLO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBSTtBQUFBLElBQUs7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFJO0FBQUEsSUFBSztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQUk7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBSztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFLO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFLO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFLO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBSztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBSztBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUs7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBSztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBSztBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUs7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUs7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFLO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUs7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUs7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUs7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFLO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFLO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBSztBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFLO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFLO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFLO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBSztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBSztBQUFBLElBQUk7QUFB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O0FBQUEsRUFBWTtBQUFBLEVBQVk7QUFBQSxFQUFZO0FBQUEsRUFBWTtBQUFBLEVBQVk7QUFBQSxFQUFZO0FBQUEsRUFDaEc7QUFBQSxFQUFZO0FBQUEsRUFBWTtBQUFBLEVBQVk7QUFBQSxFQUFZO0FBQUEsRUFBWTtBQUFBLEVBQVk7QUFBQSxFQUFZO0FBQUEsRUFBWTtBQUFBLEVBQ2hHO0FBQUEsRUFBWTtBQUFBLEVBQVk7QUFBQSxFQUFZO0FBQUEsRUFBWTtBQUFBLEVBQVk7QUFBQSxFQUFZO0FBQUEsRUFBWTtBQUFBLEVBQVk7QUFBQSxFQUNoRztBQUFBLEVBQVk7QUFBQSxFQUFZO0FBQUEsRUFBWTtBQUFBLEVBQVk7QUFBQSxFQUFZO0FBQUEsRUFBWTtBQUFBLEVBQVk7QUFBQSxFQUFZO0FBQUEsRUFDaEc7QUFBQSxFQUFZO0FBQUEsRUFBWTtBQUFBLEVBQVk7QUFBQSxFQUFZO0FBQUEsRUFBWTtBQUFBLEVBQVk7QUFBQSxFQUFZO0FBQUEsRUFBWTtBQUFBLEVBQ2hHO0FBQUEsRUFBWTtBQUFBLEVBQVk7QUFBQSxFQUFZO0FBQUEsRUFBWTtBQUFBLEVBQVk7QUFBQSxFQUFZO0FBQUEsRUFBWTtBQUFBLEVBQVk7QUFBQSxFQUNoRztBQUFBLEVBQVk7QUFBQSxFQUFZO0FBQUEsRUFBWTtBQUFBLEVBQVk7QUFBQSxFQUFZO0FBQUEsRUFBWTtBQUFBLEVBQVk7QUFBQSxFQUFZO0FBQUEsRUFDaEc7QUFBQSxFQUFZO0FBQUEsRUFBWTtBQUFBLEVBQVk7QUFBQSxFQUFZO0FBQUEsRUFBWTtBQUFBLEVBQVk7QUFBQSxFQUFZO0FBQUEsRUFBWTtBQUFBLEVBQ2hHO0FBQUEsRUFBWTtBQUFBLEVBQVk7QUFBQSxFQUFZO0FBQUEsRUFBWTtBQUFBLEVBQVk7QUFBQSxFQUFZO0FBQUEsRUFBWTtBQUFBLEVBQVk7QUFBQSxFQUNoRztBQUFBLEVBQVk7QUFBQSxFQUFZO0FBQUEsRUFBWTtBQUFBLEVBQVk7QUFBQSxFQUFZO0FBQUEsRUFBWTtBQUFBLEVBQVk7QUFBQSxFQUFZO0FBQUEsRUFDaEc7QUFBQSxFQUFZO0FBQUEsRUFBWTtBQUFBLEVBQVk7QUFBQSxFQUFZO0FBQUEsRUFBWTtBQUFBLEVBQVk7QUFBQSxFQUFZO0FBQUEsRUFBWTtBQUFBLEVBQ2hHO0FBQUEsRUFBWTtBQUFBLEVBQVk7QUFBQSxFQUFZO0FBQUEsRUFBWTtBQUFBLEVBQVk7QUFBQSxFQUFZO0FBQUEsRUFBWTtBQUFBLEVBQVk7QUFBQSxFQUNoRztBQUFBLEVBQVk7QUFBQSxFQUFZO0FBQUEsRUFBWTtBQUFBLEVBQVk7QUFBQSxFQUFZO0FBQUEsRUFBWTtBQUFBLEVBQVk7QUFBQSxFQUFZO0FBQUEsRUFDaEc7QUFBQSxFQUFZO0FBQUEsRUFBWTtBQUFBLEVBQVk7QUFBQSxFQUFZO0FBQUEsRUFBWTtBQUFBLEVBQVk7QUFBQSxFQUFZO0FBQUEsRUFBWTtBQUFBLEVBQ2hHO0FBQUEsRUFBWTtBQUFBLEVBQVk7QUFBQSxFQUFZO0FBQUEsRUFBWTtBQUFBLEVBQVk7QUFBQSxFQUFZO0FBQUEsRUFBWTtBQUFBLEVBQVk7QUFBQSxFQUNoRztBQUFBLEVBQVk7QUFBQSxFQUFZO0FBQUEsRUFBWTtBQUFBLEVBQVk7QUFBQSxFQUFZO0FBQUEsRUFBWTtBQUFBLEVBQVk7QUFBQSxFQUFZO0FBQUEsRUFDaEc7QUFBQSxFQUFZO0FBQUEsRUFBWTtBQUFBLEVBQVk7QUFBQSxFQUFZO0FBQUEsRUFBWTtBQUFBLEVBQVk7QUFBQSxFQUFZO0FBQUEsRUFBWTtBQUFBLEVBQ2hHO0FBQUEsRUFBWTtBQUFBLEVBQVk7QUFBQSxFQUFZO0FBQUEsRUFBWTtBQUFBLEVBQVk7QUFBQSxFQUFZO0FBQUEsRUFBWTtBQUFBLEVBQVk7QUFBQSxFQUNoRztBQUFBLEVBQVk7QUFBQSxFQUFZO0FBQUEsRUFBWTtBQUFBLEVBQVk7QUFBQSxFQUFZO0FBQUEsRUFBWTtBQUFBLEVBQVk7QUFBQSxFQUFZO0FBQUEsRUFDaEc7QUFBQSxFQUFZO0FBQUEsRUFBWTtBQUFBLEVBQVk7QUFBQSxFQUFZO0FBQUEsRUFBWTtBQUFBLEVBQVk7QUFBQSxFQUFZO0FBQUEsRUFBWTtBQUFBLEVBQ2hHO0FBQUEsRUFBWTtBQUFBLEVBQVk7QUFBQSxFQUFZO0FBQUEsRUFBWTtBQUFBLEVBQVk7QUFBQSxFQUFZO0FBQUEsRUFBWTtBQUFBLEVBQVk7QUFBQSxFQUNoRztBQUFBLEVBQVk7QUFBQSxFQUFZO0FBQUEsRUFBWTtBQUFBLEVBQVk7QUFBQSxFQUFZO0FBQUEsRUFBWTtBQUFBLEVBQVk7QUFBQSxFQUFZO0FBQUEsRUFDaEc7QUFBQSxFQUFZO0FBQUEsRUFBWTtBQUFBLEVBQVk7QUFBQSxFQUFZO0FBQUEsRUFBWTtBQUFBLEVBQVk7QUFBQSxFQUFZO0FBQUEsRUFBWTtBQUFBLEVBQ2hHO0FBQUEsRUFBWTtBQUFBLEVBQVk7QUFBQSxFQUFZO0FBQUEsRUFBWTtBQUFBLEVBQVk7QUFBQSxFQUFZO0FBQUEsRUFBWTtBQUFBLEVBQVk7QUFBQSxFQUNoRztBQUFBLEVBQVk7QUFBQSxFQUFZO0FBQUEsRUFBWTtBQUFBLEVBQVk7QUFBQSxFQUFZO0FBQUEsRUFBWTtBQUFBLEVBQVk7QUFBQSxFQUFZO0FBQUEsRUFDaEc7QUFBQSxFQUFZO0FBQUEsRUFBWTtBQUFBLEVBQVk7QUFBQSxFQUFZO0FBQUEsRUFBWTtBQUFBLEVBQVk7QUFBQSxFQUFZO0FBQUEsRUFBWTtBQUFBLEVBQ2hHO0FBQUEsRUFBWTtBQUFBLEVBQVk7QUFBQSxFQUFZO0FBQUEsRUFBWTtBQUFBLEVBQVk7QUFBQSxFQUFZO0FBQUEsRUFBWTtBQUFBLEVBQVk7QUFBQSxFQUNoRztBQUFBLEVBQVk7QUFBQSxFQUFZO0FBQUEsRUFBWTtBQUN4QyxDQUFDO0FBQ0QsU0FBUyxPQUFPLEtBQUssVUFBVTtBQUMzQixNQUFJLE1BQU0sQ0FBQyxDQUFDLFdBQVc7QUFDdkIsV0FBUyxJQUFJLEdBQUcsSUFBSSxJQUFJLFFBQVEsS0FBSztBQUNqQyxVQUFNLFdBQVcsTUFBTSxJQUFJLENBQUMsS0FBSyxHQUFJLElBQUssUUFBUTtBQUFBLEVBQ3REO0FBQ0EsU0FBTyxNQUFNO0FBQ2pCO0FBQ08sU0FBUyxjQUFjLE1BQU0sT0FBTyxHQUFHO0FBQzFDLFNBQU8sT0FBTyxNQUFNLElBQUksTUFBTTtBQUNsQzs7O0FEcENPLElBQU0sdUJBQXVCLEtBQUs7QUFNbEMsU0FBUyx3QkFBd0IsZUFBZTtBQUNuRCxNQUFJLHNCQUFzQixhQUFhO0FBQ25DLFdBQU8sc0JBQXNCLGFBQWE7QUFDOUMsUUFBTSxRQUFRLElBQUksV0FBVyxHQUFHO0FBQ2hDLEVBQUssV0FBTSxlQUFlLE9BQU8sQ0FBQztBQUNsQyxVQUFTLGNBQWMsS0FBSyxJQUFJLHVCQUF3QixnQkFBZ0I7QUFDNUU7OztBRWZPLElBQU0sVUFBeUM7QUFJL0MsU0FBUyxpQkFBaUIsR0FBRyxPQUFPO0FBQ3ZDLE1BQUksU0FBUztBQUNULFFBQUksS0FBSyxPQUFPLE1BQU0sWUFBWSxPQUFPLEVBQUUsU0FBUyxZQUFZO0FBQzVELFlBQU0sSUFBSSxNQUFNLEtBQUs7QUFBQSxJQUN6QjtBQUFBLEVBQ0o7QUFDQSxTQUFPO0FBQ1g7OztBQ1JPLFNBQVMsb0JBQW9CO0FBQ2hDLFFBQU0sY0FBYyxvQkFBSSxJQUFJO0FBQzVCLFNBQU87QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQU9ILE1BQU0sUUFBUSxTQUFTO0FBRW5CLFVBQUksVUFBVSxHQUFHO0FBRWIsZUFBTztBQUFBLE1BQ1g7QUFDQSxZQUFNLGVBQWUsWUFBWSxJQUFJLE1BQU07QUFFM0MsVUFBSSxpQkFBaUIsVUFBYSxnQkFBZ0IsU0FBUztBQUN2RCxlQUFPO0FBQUEsTUFDWDtBQUNBLGtCQUFZLElBQUksUUFBUSxPQUFPO0FBQy9CLGFBQU87QUFBQSxJQUNYO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFJQSxJQUFJLEdBQUcsR0FBRztBQUNOLFlBQU0sZUFBZSxZQUFZLElBQUksQ0FBQztBQUV0QyxVQUFJLGlCQUFpQixVQUFhLGdCQUFnQixHQUFHO0FBQ2pELGVBQU87QUFBQSxNQUNYO0FBQ0EsYUFBTztBQUFBLElBQ1g7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBUUEsU0FBUztBQUNMLGFBQU87QUFBQSxJQUNYO0FBQUEsRUFDSjtBQUNKOzs7QUM3Q08sSUFBTSxVQUFVO0FBQ3ZCLElBQU0sc0JBQXNCO0FBSXJCLElBQU0sMkJBQTJCLFVBQVU7QUFLM0MsSUFBTSxvQkFBb0I7QUFJMUIsSUFBTSwyQkFBMkI7QUFFakMsSUFBTSwwQkFBMEI7QUFJaEMsSUFBSTtBQUFBLENBQ1YsU0FBVU0sY0FBYTtBQUlwQixXQUFTLGFBQWEsVUFBVTtBQUM1QixXQUFPLEVBQUUsV0FBVyxhQUFhLEtBQU0sV0FBVyx3QkFBd0IsS0FBTSxhQUFhLENBQUM7QUFBQSxFQUNsRztBQUNBLEVBQUFBLGFBQVksZUFBZTtBQUkzQixXQUFTLFdBQVcsY0FBYyxlQUFlO0FBQzdDLFlBQVUsZUFBZSxXQUFhLGdCQUFnQixZQUFZLFFBQVM7QUFBQSxFQUMvRTtBQUNBLEVBQUFBLGFBQVksYUFBYTtBQUM3QixHQUFHLGdCQUFnQixjQUFjLENBQUMsRUFBRTtBQUk3QixJQUFJO0FBQUEsQ0FDVixTQUFVQyxjQUFhO0FBQ3BCLEVBQUFBLGFBQVlBLGFBQVksU0FBUyxJQUFJLENBQUMsSUFBSTtBQUkxQyxFQUFBQSxhQUFZQSxhQUFZLFlBQVksSUFBSSxDQUFDLElBQUk7QUFJN0MsRUFBQUEsYUFBWUEsYUFBWSxTQUFTLElBQUksQ0FBQyxJQUFJO0FBSTFDLEVBQUFBLGFBQVlBLGFBQVksVUFBVSxJQUFJLENBQUMsSUFBSTtBQUMvQyxHQUFHLGdCQUFnQixjQUFjLENBQUMsRUFBRTtBQUk3QixTQUFTLGtCQUFrQjtBQUU5QixNQUFJLGdCQUFnQjtBQUVwQixNQUFJO0FBRUosTUFBSTtBQUNKLFFBQU0sZUFBZSxvQkFBSSxJQUFJO0FBQzdCLE1BQUksbUJBQW1CLENBQUM7QUFDeEIsUUFBTSxrQkFBa0Isa0JBQWtCO0FBQzFDLE1BQUkseUJBQXlCO0FBQzdCLFdBQVMsd0JBQXdCLHVCQUF1QixPQUFPO0FBQzNELDZCQUF5QjtBQUN6Qiw2QkFBeUI7QUFDekIsMkJBQXVCLE1BQU0sQ0FBQztBQUFBLEVBQ2xDO0FBQ0EsV0FBUyxrQkFBa0IsV0FBVztBQUNsQyxRQUFJLGdCQUFnQixvQkFBb0IsR0FBRztBQUN2QyxZQUFNLElBQUksTUFBTSxzREFBc0QsaUJBQWlCLEdBQUc7QUFBQSxJQUM5RjtBQUNBLFFBQUksYUFBYSx1QkFBdUIsdUJBQXVCLENBQUMsR0FBRztBQUMvRCxZQUFNLElBQUksTUFBTSwwQ0FBMEMsdUJBQXVCLENBQUMsQ0FBQyxHQUFHO0FBQUEsSUFDMUY7QUFDQSxRQUFJLENBQUMsYUFBYSxpQkFBaUIsd0JBQXdCO0FBQ3ZELFlBQU0sSUFBSSxNQUFNLHdDQUF3QyxzQkFBc0IsRUFBRTtBQUFBLElBQ3BGO0FBQ0EsVUFBTSxlQUFlLFlBQVkseUJBQXlCO0FBQzFELFVBQU0sZ0JBQWdCLGdCQUFnQixPQUFPLEVBQUUsSUFBSSxZQUFZLElBQ3pELGdCQUFnQixPQUFPLEVBQUUsSUFBSSxZQUFZLElBQUksSUFDN0M7QUFDTixVQUFNLFNBQVMsWUFBWSxXQUFXLGNBQWMsYUFBYTtBQUNqRSxRQUFJLGFBQWEsSUFBSSxNQUFNLEdBQUc7QUFDMUIsYUFBTyxrQkFBa0I7QUFBQSxJQUM3QjtBQUNBLGlCQUFhLElBQUksTUFBTTtBQUN2QixXQUFPO0FBQUEsRUFDWDtBQUNBLFdBQVMsZUFBZSxXQUFXO0FBQy9CLFFBQUksYUFBYSxDQUFDLHdCQUF3QjtBQUN0QyxZQUFNLElBQUksTUFBTSxtRUFBbUU7QUFBQSxJQUN2RjtBQUNBLFVBQU0sbUJBQW1CLDBCQUNyQixDQUFDLEdBQUcsYUFBYSxPQUFPLENBQUMsRUFBRSxPQUFPLENBQUMsTUFBTTtBQUNyQyxZQUFNLENBQUMsUUFBUSxJQUFJLFlBQVksYUFBYSxDQUFDO0FBQzdDLGFBQU8sWUFBWSx1QkFBdUIsQ0FBQyxLQUFLLFlBQVksdUJBQXVCLENBQUM7QUFBQSxJQUN4RixDQUFDLEVBQUUsV0FDSDtBQUNKLFVBQU0sV0FBVyxhQUFhLE9BQU87QUFFckMsUUFBSSxDQUFDLGFBQWEsV0FBVyw0QkFBNEIsZUFBZTtBQUNwRSxhQUFPLGtCQUFrQixTQUFTO0FBQUEsSUFDdEM7QUFFQSxRQUFJLGFBQWEsa0JBQWtCLHVCQUF1QixDQUFDLEtBQUssc0JBQXNCO0FBQ2xGLGFBQU8sa0JBQWtCLFNBQVM7QUFBQSxJQUN0QztBQUNBLGVBQVcsQ0FBQyxRQUFRLE9BQU8sS0FBSyxnQkFBZ0IsT0FBTyxHQUFHO0FBQ3RELFVBQUksVUFBVSxTQUFTO0FBQ25CLFlBQUksY0FBYyxTQUFTLHVCQUF1QixDQUFDLEtBQUssU0FBUyx1QkFBdUIsQ0FBQztBQUNyRjtBQUNKLFlBQUksQ0FBQyxhQUFhLFVBQVU7QUFDeEI7QUFDSixjQUFNLFNBQVMsWUFBWSxXQUFXLFFBQVEsVUFBVSxDQUFDO0FBR3pELFlBQUksQ0FBQyxhQUFhLElBQUksTUFBTSxLQUFLLENBQUMsaUJBQWlCLFNBQVMsTUFBTSxHQUFHO0FBQ2pFLHVCQUFhLElBQUksTUFBTTtBQUN2QixpQkFBTztBQUFBLFFBQ1g7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUNBLFdBQU8sa0JBQWtCLFNBQVM7QUFBQSxFQUN0QztBQUNBLFdBQVMsYUFBYSxRQUFRO0FBQzFCLFFBQUksU0FBUztBQUNULGFBQU87QUFDWCxRQUFJLGFBQWEsSUFBSSxNQUFNLEdBQUc7QUFDMUIsbUJBQWEsT0FBTyxNQUFNO0FBQzFCLHVCQUFpQixLQUFLLE1BQU07QUFBQSxJQUNoQyxPQUNLO0FBQ0QsMEJBQW9CLE1BQU07QUFBQSxJQUM5QjtBQUNBLFdBQU87QUFBQSxFQUNYO0FBQ0EsV0FBUyx5QkFBeUI7QUFDOUIsVUFBTSxNQUFNO0FBQ1osUUFBSSxJQUFJLFFBQVE7QUFDWix5QkFBbUIsQ0FBQztBQUNwQixpQkFBVyxVQUFVLEtBQUs7QUFDdEIsY0FBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLFlBQVksYUFBYSxNQUFNO0FBQzlDLHdCQUFnQixNQUFNLEdBQUcsQ0FBQztBQUFBLE1BQzlCO0FBQUEsSUFDSjtBQUNBLFdBQU87QUFBQSxFQUNYO0FBQ0EsV0FBUyxvQkFBb0IsUUFBUTtBQUNqQyxVQUFNLENBQUMsR0FBRyxDQUFDLElBQUksWUFBWSxhQUFhLE1BQU07QUFFOUMsb0JBQWdCLE1BQU0sR0FBRyxDQUFDO0FBRTFCLGFBQVMsSUFBSSxHQUFHLEtBQUssR0FBRyxLQUFLO0FBQ3pCLG1CQUFhLE9BQU8sWUFBWSxXQUFXLEdBQUcsQ0FBQyxDQUFDO0FBQUEsSUFDcEQ7QUFDQSxXQUFPO0FBQUEsRUFDWDtBQUNBLFdBQVMsaUJBQWlCLFFBQVE7QUFDOUIsVUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLFlBQVksYUFBYSxNQUFNO0FBRTlDLFFBQUksZ0JBQWdCLElBQUksR0FBRyxDQUFDO0FBQ3hCLGFBQU87QUFFWCxRQUFJLElBQUksR0FBRztBQUNQLGVBQVMsSUFBSSxHQUFHLEtBQUssSUFBSSxHQUFHLEtBQUs7QUFDN0IscUJBQWEsT0FBTyxZQUFZLFdBQVcsR0FBRyxDQUFDLENBQUM7QUFBQSxNQUNwRDtBQUNBLHNCQUFnQixNQUFNLEdBQUcsSUFBSSxDQUFDO0FBQUEsSUFDbEM7QUFDQSxpQkFBYSxJQUFJLE1BQU07QUFDdkIsV0FBTztBQUFBLEVBQ1g7QUFDQSxXQUFTLGVBQWUsUUFBUTtBQUM1QixVQUFNLENBQUMsR0FBRyxDQUFDLElBQUksWUFBWSxhQUFhLE1BQU07QUFDOUMsUUFBSSxJQUFJLDBCQUEwQjtBQUM5QixhQUFPLFlBQVk7QUFBQSxJQUN2QjtBQUNBLFFBQUksYUFBYSxJQUFJLE1BQU0sR0FBRztBQUMxQixhQUFPLFlBQVk7QUFBQSxJQUN2QjtBQUNBLFVBQU0saUJBQWlCLGdCQUFnQixPQUFPLEVBQUUsSUFBSSxDQUFDO0FBQ3JELFFBQUksbUJBQW1CLFVBQWEsa0JBQWtCLEdBQUc7QUFDckQsYUFBTyxZQUFZO0FBQUEsSUFDdkI7QUFDQSxXQUFPLFlBQVk7QUFBQSxFQUN2QjtBQUNBLFNBQU87QUFBQSxJQUNIO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBLHNCQUFzQjtBQUNsQixhQUFPLElBQUksSUFBSSxZQUFZO0FBQUEsSUFDL0I7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDSjtBQUNKOzs7QUM1TUEsSUFBQUMsUUFBc0I7QUFOdEIsSUFBSSx5QkFBa0UsU0FBVSxVQUFVLE9BQU8sTUFBTSxHQUFHO0FBQ3RHLE1BQUksU0FBUyxPQUFPLENBQUM7QUFBRyxVQUFNLElBQUksVUFBVSwrQ0FBK0M7QUFDM0YsTUFBSSxPQUFPLFVBQVUsYUFBYSxhQUFhLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLFFBQVE7QUFBRyxVQUFNLElBQUksVUFBVSwwRUFBMEU7QUFDakwsU0FBTyxTQUFTLE1BQU0sSUFBSSxTQUFTLE1BQU0sRUFBRSxLQUFLLFFBQVEsSUFBSSxJQUFJLEVBQUUsUUFBUSxNQUFNLElBQUksUUFBUTtBQUNoRztBQUNBLElBQUk7QUFBSixJQUFvQztBQUFwQyxJQUFnRTtBQVNoRSxTQUFTLFlBQVksYUFBYSxjQUFjO0FBQzVDLFFBQU0sYUFBYSxLQUFLLElBQUksYUFBYSxZQUFZLElBQUk7QUFDekQsU0FBTyxLQUFLLEtBQUssYUFBYSxJQUFJLElBQUk7QUFDMUM7QUFDQSxJQUFNLHlCQUF5QjtBQVV4QixJQUFNLHNCQUFOLE1BQTBCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTTdCLFlBQVksUUFBUSxlQUFlLGVBQWU7QUFDOUMsbUNBQStCLElBQUksSUFBSTtBQUN2QyxTQUFLLFVBQVUsVUFBVSxJQUFJLFdBQVcsc0JBQXNCO0FBQzlELFNBQUssT0FBTyxJQUFJLFNBQVMsS0FBSyxRQUFRLFFBQVEsS0FBSyxRQUFRLFVBQVU7QUFDckUsU0FBSyxVQUFVLGtCQUFrQixTQUFTLEtBQUssUUFBUSxTQUFTLFNBQVM7QUFDekUsU0FBSyxVQUFVLGlCQUFpQjtBQUFBLEVBQ3BDO0FBQUEsRUFDQSxTQUFTO0FBQ0wsV0FBTyxLQUFLO0FBQUEsRUFDaEI7QUFBQSxFQUNBLGVBQWU7QUFDWCxXQUFPLEtBQUssUUFBUTtBQUFBLEVBQ3hCO0FBQUEsRUFDQSxjQUFjO0FBQ1YsU0FBSyxVQUFVO0FBQ2YsU0FBSyxVQUFVO0FBQUEsRUFDbkI7QUFBQSxFQUNBLG9CQUFvQjtBQUNoQixXQUFPLEtBQUs7QUFBQSxFQUNoQjtBQUFBLEVBQ0EscUJBQXFCO0FBQ2pCLFdBQU8sS0FBSztBQUFBLEVBQ2hCO0FBQUEsRUFDQSxvQkFBb0IsUUFBUTtBQUN4QixXQUFPLHVCQUF1QixNQUFNLGdDQUFnQyxLQUFLLDBCQUEwQixFQUFFLEtBQUssTUFBTSxNQUFNO0FBQUEsRUFDMUg7QUFBQSxFQUNBLGlCQUFpQjtBQUNiLFdBQU8sS0FBSyxVQUFVLEtBQUs7QUFBQSxFQUMvQjtBQUFBLEVBQ0EsY0FBYztBQUNWLFdBQU8sS0FBSyxLQUFLLFdBQVcsdUJBQXVCLE1BQU0sZ0NBQWdDLEtBQUssMEJBQTBCLEVBQUUsS0FBSyxNQUFNLENBQUMsR0FBRyxJQUFJO0FBQUEsRUFDako7QUFBQSxFQUNBLGNBQWM7QUFDVixXQUFPLEtBQUssS0FBSyxXQUFXLHVCQUF1QixNQUFNLGdDQUFnQyxLQUFLLDBCQUEwQixFQUFFLEtBQUssTUFBTSxDQUFDLEdBQUcsSUFBSTtBQUFBLEVBQ2pKO0FBQUEsRUFDQSxXQUFXO0FBQ1AsV0FBTyxLQUFLLEtBQUssUUFBUSx1QkFBdUIsTUFBTSxnQ0FBZ0MsS0FBSywwQkFBMEIsRUFBRSxLQUFLLE1BQU0sQ0FBQyxDQUFDO0FBQUEsRUFDeEk7QUFBQSxFQUNBLFlBQVk7QUFDUixXQUFPLEtBQUssS0FBSyxTQUFTLHVCQUF1QixNQUFNLGdDQUFnQyxLQUFLLDBCQUEwQixFQUFFLEtBQUssTUFBTSxDQUFDLEdBQUcsSUFBSTtBQUFBLEVBQy9JO0FBQUEsRUFDQSxZQUFZO0FBQ1IsV0FBTyxLQUFLLEtBQUssU0FBUyx1QkFBdUIsTUFBTSxnQ0FBZ0MsS0FBSywwQkFBMEIsRUFBRSxLQUFLLE1BQU0sQ0FBQyxHQUFHLElBQUk7QUFBQSxFQUMvSTtBQUFBLEVBQ0EsWUFBWTtBQUNSLFdBQU8sS0FBSyxLQUFLLFlBQVksdUJBQXVCLE1BQU0sZ0NBQWdDLEtBQUssMEJBQTBCLEVBQUUsS0FBSyxNQUFNLENBQUMsR0FBRyxJQUFJO0FBQUEsRUFDbEo7QUFBQSxFQUNBLFlBQVk7QUFDUixXQUFPLEtBQUssS0FBSyxTQUFTLHVCQUF1QixNQUFNLGdDQUFnQyxLQUFLLDBCQUEwQixFQUFFLEtBQUssTUFBTSxDQUFDLENBQUM7QUFBQSxFQUN6STtBQUFBLEVBQ0EsYUFBYTtBQUNULFdBQU8sS0FBSyxLQUFLLFVBQVUsdUJBQXVCLE1BQU0sZ0NBQWdDLEtBQUssMEJBQTBCLEVBQUUsS0FBSyxNQUFNLENBQUMsR0FBRyxJQUFJO0FBQUEsRUFDaEo7QUFBQSxFQUNBLGFBQWE7QUFDVCxXQUFPLEtBQUssS0FBSyxVQUFVLHVCQUF1QixNQUFNLGdDQUFnQyxLQUFLLDBCQUEwQixFQUFFLEtBQUssTUFBTSxDQUFDLEdBQUcsSUFBSTtBQUFBLEVBQ2hKO0FBQUEsRUFDQSxhQUFhO0FBQ1QsV0FBTyxLQUFLLEtBQUssYUFBYSx1QkFBdUIsTUFBTSxnQ0FBZ0MsS0FBSywwQkFBMEIsRUFBRSxLQUFLLE1BQU0sQ0FBQyxHQUFHLElBQUk7QUFBQSxFQUNuSjtBQUFBLEVBQ0EsYUFBYTtBQUNULFVBQU1DLFVBQVMsS0FBSyxLQUFLLFVBQVUsdUJBQXVCLE1BQU0sZ0NBQWdDLEtBQUssMEJBQTBCLEVBQUUsS0FBSyxNQUFNLENBQUMsR0FBRyxJQUFJO0FBQ3BKLFdBQU8sS0FBSyxRQUFRLFNBQVMsdUJBQXVCLE1BQU0sZ0NBQWdDLEtBQUssMEJBQTBCLEVBQUUsS0FBSyxNQUFNQSxPQUFNLEdBQUcsdUJBQXVCLE1BQU0sZ0NBQWdDLEtBQUssMEJBQTBCLEVBQUUsS0FBSyxNQUFNLENBQUMsQ0FBQztBQUFBLEVBQzlQO0FBQUEsRUFDQSxpQkFBaUI7QUFDYixVQUFNQSxVQUFTLEtBQUssS0FBSyxVQUFVLHVCQUF1QixNQUFNLGdDQUFnQyxLQUFLLDBCQUEwQixFQUFFLEtBQUssTUFBTSxDQUFDLEdBQUcsSUFBSTtBQUNwSixXQUFZLFdBQUssS0FBSyxTQUFTLHVCQUF1QixNQUFNLGdDQUFnQyxLQUFLLDBCQUEwQixFQUFFLEtBQUssTUFBTUEsT0FBTSxHQUFHLHVCQUF1QixNQUFNLGdDQUFnQyxLQUFLLDBCQUEwQixFQUFFLEtBQUssTUFBTSxDQUFDLENBQUM7QUFBQSxFQUNoUTtBQUFBLEVBQ0EscUJBQXFCLFFBQVE7QUFDekIsV0FBTyx1QkFBdUIsTUFBTSxnQ0FBZ0MsS0FBSywwQkFBMEIsRUFBRSxLQUFLLE1BQU0sTUFBTTtBQUFBLEVBQzFIO0FBQUEsRUFDQSxXQUFXO0FBQ1AsV0FBTyxLQUFLLFFBQVEsU0FBUyxHQUFHLEtBQUssT0FBTztBQUFBLEVBQ2hEO0FBQUEsRUFDQSxpQkFBaUI7QUFDYixXQUFPLElBQUksV0FBVyxLQUFLLFNBQVMsQ0FBQztBQUFBLEVBQ3pDO0FBQUEsRUFDQSxZQUFZLE9BQU8sY0FBYyxNQUFNO0FBQ25DLFFBQUksYUFBYTtBQUNiLFdBQUssWUFBWSxNQUFNLFVBQVU7QUFBQSxJQUNyQztBQUNBLFVBQU0sSUFBSSx1QkFBdUIsTUFBTSxnQ0FBZ0MsS0FBSywwQkFBMEIsRUFBRSxLQUFLLE1BQU0sTUFBTSxVQUFVO0FBQ25JLFNBQUssUUFBUSxJQUFJLE9BQU8sQ0FBQztBQUFBLEVBQzdCO0FBQUEsRUFDQSxnQkFBZ0IsT0FBTyxjQUFjLE1BQU07QUFDdkMsVUFBTSxhQUFrQixhQUFPLEtBQUs7QUFDcEMsUUFBSSxhQUFhO0FBQ2IsV0FBSyxZQUFZLFVBQVU7QUFBQSxJQUMvQjtBQUNBLFVBQU0sSUFBSSx1QkFBdUIsTUFBTSxnQ0FBZ0MsS0FBSywwQkFBMEIsRUFBRSxLQUFLLE1BQU0sVUFBVTtBQUM3SCxJQUFLLFlBQU0sT0FBTyxLQUFLLFNBQVMsQ0FBQztBQUFBLEVBQ3JDO0FBQUEsRUFDQSxhQUFhLE9BQU87QUFDaEIsVUFBTSxJQUFJLHVCQUF1QixNQUFNLGdDQUFnQyxLQUFLLDBCQUEwQixFQUFFLEtBQUssTUFBTSxDQUFDO0FBQ3BILFNBQUssS0FBSyxXQUFXLEdBQUcsT0FBTyxJQUFJO0FBQUEsRUFDdkM7QUFBQSxFQUNBLGFBQWEsT0FBTztBQUNoQixVQUFNLElBQUksdUJBQXVCLE1BQU0sZ0NBQWdDLEtBQUssMEJBQTBCLEVBQUUsS0FBSyxNQUFNLENBQUM7QUFDcEgsU0FBSyxLQUFLLFdBQVcsR0FBRyxPQUFPLElBQUk7QUFBQSxFQUN2QztBQUFBLEVBQ0EsVUFBVSxPQUFPO0FBQ2IsVUFBTSxJQUFJLHVCQUF1QixNQUFNLGdDQUFnQyxLQUFLLDBCQUEwQixFQUFFLEtBQUssTUFBTSxDQUFDO0FBQ3BILFNBQUssS0FBSyxRQUFRLEdBQUcsS0FBSztBQUFBLEVBQzlCO0FBQUEsRUFDQSxXQUFXLE9BQU87QUFDZCxVQUFNLElBQUksdUJBQXVCLE1BQU0sZ0NBQWdDLEtBQUssMEJBQTBCLEVBQUUsS0FBSyxNQUFNLENBQUM7QUFDcEgsU0FBSyxLQUFLLFNBQVMsR0FBRyxPQUFPLElBQUk7QUFBQSxFQUNyQztBQUFBLEVBQ0EsV0FBVyxPQUFPO0FBQ2QsVUFBTSxJQUFJLHVCQUF1QixNQUFNLGdDQUFnQyxLQUFLLDBCQUEwQixFQUFFLEtBQUssTUFBTSxDQUFDO0FBQ3BILFNBQUssS0FBSyxTQUFTLEdBQUcsT0FBTyxJQUFJO0FBQUEsRUFDckM7QUFBQSxFQUNBLFdBQVcsT0FBTztBQUNkLFVBQU0sSUFBSSx1QkFBdUIsTUFBTSxnQ0FBZ0MsS0FBSywwQkFBMEIsRUFBRSxLQUFLLE1BQU0sQ0FBQztBQUNwSCxTQUFLLEtBQUssWUFBWSxHQUFHLE9BQU8sSUFBSTtBQUFBLEVBQ3hDO0FBQUEsRUFDQSxXQUFXLE9BQU87QUFDZCxVQUFNLElBQUksdUJBQXVCLE1BQU0sZ0NBQWdDLEtBQUssMEJBQTBCLEVBQUUsS0FBSyxNQUFNLENBQUM7QUFDcEgsU0FBSyxLQUFLLFNBQVMsR0FBRyxLQUFLO0FBQUEsRUFDL0I7QUFBQSxFQUNBLFlBQVksT0FBTztBQUNmLFVBQU0sSUFBSSx1QkFBdUIsTUFBTSxnQ0FBZ0MsS0FBSywwQkFBMEIsRUFBRSxLQUFLLE1BQU0sQ0FBQztBQUNwSCxTQUFLLEtBQUssVUFBVSxHQUFHLE9BQU8sSUFBSTtBQUFBLEVBQ3RDO0FBQUEsRUFDQSxZQUFZLE9BQU87QUFDZixVQUFNLElBQUksdUJBQXVCLE1BQU0sZ0NBQWdDLEtBQUssMEJBQTBCLEVBQUUsS0FBSyxNQUFNLENBQUM7QUFDcEgsU0FBSyxLQUFLLFVBQVUsR0FBRyxPQUFPLElBQUk7QUFBQSxFQUN0QztBQUFBLEVBQ0EsWUFBWSxPQUFPO0FBQ2YsVUFBTSxJQUFJLHVCQUF1QixNQUFNLGdDQUFnQyxLQUFLLDBCQUEwQixFQUFFLEtBQUssTUFBTSxDQUFDO0FBQ3BILFNBQUssS0FBSyxhQUFhLEdBQUcsT0FBTyxJQUFJO0FBQUEsRUFDekM7QUFBQTtBQUFBLEVBRUEsV0FBVyxRQUFRO0FBQ2YsV0FBTyxLQUFLLEtBQUssV0FBVyxRQUFRLElBQUk7QUFBQSxFQUM1QztBQUFBLEVBQ0EsV0FBVyxRQUFRO0FBQ2YsV0FBTyxLQUFLLEtBQUssV0FBVyxRQUFRLElBQUk7QUFBQSxFQUM1QztBQUFBLEVBQ0EsUUFBUSxRQUFRO0FBQ1osV0FBTyxLQUFLLEtBQUssUUFBUSxNQUFNO0FBQUEsRUFDbkM7QUFBQSxFQUNBLFNBQVMsUUFBUTtBQUNiLFdBQU8sS0FBSyxLQUFLLFNBQVMsUUFBUSxJQUFJO0FBQUEsRUFDMUM7QUFBQSxFQUNBLFNBQVMsUUFBUTtBQUNiLFdBQU8sS0FBSyxLQUFLLFNBQVMsUUFBUSxJQUFJO0FBQUEsRUFDMUM7QUFBQSxFQUNBLFNBQVMsUUFBUTtBQUNiLFdBQU8sS0FBSyxLQUFLLFlBQVksUUFBUSxJQUFJO0FBQUEsRUFDN0M7QUFBQSxFQUNBLFNBQVMsUUFBUTtBQUNiLFdBQU8sS0FBSyxLQUFLLFNBQVMsTUFBTTtBQUFBLEVBQ3BDO0FBQUEsRUFDQSxVQUFVLFFBQVE7QUFDZCxXQUFPLEtBQUssS0FBSyxVQUFVLFFBQVEsSUFBSTtBQUFBLEVBQzNDO0FBQUEsRUFDQSxVQUFVLFFBQVE7QUFDZCxXQUFPLEtBQUssS0FBSyxVQUFVLFFBQVEsSUFBSTtBQUFBLEVBQzNDO0FBQUEsRUFDQSxVQUFVLFFBQVE7QUFDZCxXQUFPLEtBQUssS0FBSyxhQUFhLFFBQVEsSUFBSTtBQUFBLEVBQzlDO0FBQUEsRUFDQSxXQUFXLFFBQVEsT0FBTztBQUN0QixTQUFLLEtBQUssV0FBVyxRQUFRLE9BQU8sSUFBSTtBQUFBLEVBQzVDO0FBQUEsRUFDQSxXQUFXLFFBQVEsT0FBTztBQUN0QixTQUFLLEtBQUssV0FBVyxRQUFRLE9BQU8sSUFBSTtBQUFBLEVBQzVDO0FBQUEsRUFDQSxRQUFRLFFBQVEsT0FBTztBQUNuQixTQUFLLEtBQUssUUFBUSxRQUFRLEtBQUs7QUFBQSxFQUNuQztBQUFBLEVBQ0EsU0FBUyxRQUFRLE9BQU87QUFDcEIsU0FBSyxLQUFLLFNBQVMsUUFBUSxPQUFPLElBQUk7QUFBQSxFQUMxQztBQUFBLEVBQ0EsU0FBUyxRQUFRLE9BQU87QUFDcEIsU0FBSyxLQUFLLFNBQVMsUUFBUSxPQUFPLElBQUk7QUFBQSxFQUMxQztBQUFBLEVBQ0EsU0FBUyxRQUFRLE9BQU87QUFDcEIsU0FBSyxLQUFLLFlBQVksUUFBUSxPQUFPLElBQUk7QUFBQSxFQUM3QztBQUFBLEVBQ0EsU0FBUyxRQUFRLE9BQU87QUFDcEIsU0FBSyxLQUFLLFNBQVMsUUFBUSxLQUFLO0FBQUEsRUFDcEM7QUFBQSxFQUNBLFVBQVUsUUFBUSxPQUFPO0FBQ3JCLFNBQUssS0FBSyxVQUFVLFFBQVEsT0FBTyxJQUFJO0FBQUEsRUFDM0M7QUFBQSxFQUNBLFVBQVUsUUFBUSxPQUFPO0FBQ3JCLFNBQUssS0FBSyxVQUFVLFFBQVEsT0FBTyxJQUFJO0FBQUEsRUFDM0M7QUFBQSxFQUNBLFVBQVUsUUFBUSxPQUFPO0FBQ3JCLFNBQUssS0FBSyxhQUFhLFFBQVEsT0FBTyxJQUFJO0FBQUEsRUFDOUM7QUFDSjtBQUNBLGlDQUFpQyxvQkFBSSxRQUFRLEdBQUcsNkJBQTZCLFNBQVNDLDRCQUEyQixRQUFRO0FBQ3JILE1BQUksS0FBSyxVQUFVLFNBQVMsS0FBSyxRQUFRLFlBQVk7QUFDakQsVUFBTSxVQUFVLFlBQVksS0FBSyxRQUFRLFlBQVksS0FBSyxVQUFVLE1BQU07QUFDMUUsVUFBTSxZQUFZLElBQUksV0FBVyxPQUFPO0FBQ3hDLGNBQVUsSUFBSSxLQUFLLE9BQU87QUFDMUIsVUFBTSxZQUFZLEtBQUssUUFBUTtBQUMvQixTQUFLLFVBQVU7QUFDZixTQUFLLE9BQU8sSUFBSSxTQUFTLEtBQUssUUFBUSxRQUFRLFNBQVM7QUFBQSxFQUMzRDtBQUNBLE9BQUssV0FBVztBQUNoQixTQUFPLEtBQUssVUFBVTtBQUMxQixHQUFHLDZCQUE2QixTQUFTQyw0QkFBMkIsUUFBUTtBQUN4RSxNQUFJLEtBQUssVUFBVSxTQUFTLEtBQUssU0FBUztBQUN0QyxVQUFNLElBQUksTUFBTSx1Q0FBdUM7QUFBQSxFQUMzRDtBQUNBLE9BQUssV0FBVztBQUNoQixTQUFPLEtBQUssVUFBVTtBQUMxQjs7O0FDalBPLElBQUk7QUFBQSxDQUNWLFNBQVVDLGtCQUFpQjtBQUN4QixFQUFBQSxpQkFBZ0JBLGlCQUFnQixVQUFVLElBQUksQ0FBQyxJQUFJO0FBRW5ELEVBQUFBLGlCQUFnQkEsaUJBQWdCLGVBQWUsSUFBSSxDQUFDLElBQUk7QUFDeEQsRUFBQUEsaUJBQWdCQSxpQkFBZ0Isa0JBQWtCLElBQUksQ0FBQyxJQUFJO0FBQzNELEVBQUFBLGlCQUFnQkEsaUJBQWdCLGVBQWUsSUFBSSxDQUFDLElBQUk7QUFDeEQsRUFBQUEsaUJBQWdCQSxpQkFBZ0IsY0FBYyxJQUFJLENBQUMsSUFBSTtBQUV2RCxFQUFBQSxpQkFBZ0JBLGlCQUFnQix1QkFBdUIsSUFBSSxDQUFDLElBQUk7QUFDaEUsRUFBQUEsaUJBQWdCQSxpQkFBZ0IsMEJBQTBCLElBQUksQ0FBQyxJQUFJO0FBQ25FLEVBQUFBLGlCQUFnQkEsaUJBQWdCLHVCQUF1QixJQUFJLENBQUMsSUFBSTtBQUNoRSxFQUFBQSxpQkFBZ0JBLGlCQUFnQixrQkFBa0IsSUFBSSxDQUFDLElBQUk7QUFDL0QsR0FBRyxvQkFBb0Isa0JBQWtCLENBQUMsRUFBRTtBQUlyQyxJQUFNLDZCQUE2QjtBQUNuQyxJQUFJO0FBQUEsQ0FDVixTQUFVQywyQkFBMEI7QUFNakMsRUFBQUEsMEJBQXlCQSwwQkFBeUIsdUJBQXVCLElBQUksQ0FBQyxJQUFJO0FBTWxGLEVBQUFBLDBCQUF5QkEsMEJBQXlCLHdCQUF3QixJQUFJLENBQUMsSUFBSTtBQU1uRixFQUFBQSwwQkFBeUJBLDBCQUF5QixXQUFXLElBQUksQ0FBQyxJQUFJO0FBTXRFLEVBQUFBLDBCQUF5QkEsMEJBQXlCLG1CQUFtQixJQUFJLENBQUMsSUFBSTtBQU05RSxFQUFBQSwwQkFBeUJBLDBCQUF5QixrQkFBa0IsSUFBSSxDQUFDLElBQUk7QUFNN0UsRUFBQUEsMEJBQXlCQSwwQkFBeUIsa0JBQWtCLElBQUksQ0FBQyxJQUFJO0FBTTdFLEVBQUFBLDBCQUF5QkEsMEJBQXlCLGVBQWUsSUFBSSxDQUFDLElBQUk7QUFDOUUsR0FBRyw2QkFBNkIsMkJBQTJCLENBQUMsRUFBRTs7O0FDN0R2RCxJQUFJO0FBQUEsQ0FDVixTQUFVQyxzQkFBcUI7QUFLNUIsV0FBUyxTQUFTLEtBQUs7QUFDbkIsVUFBTSxNQUFNLElBQUksZUFBZTtBQUMvQixRQUFJLE1BQU0sNEJBQTRCO0FBQ2xDLGFBQU87QUFBQSxJQUNYO0FBQ0EsVUFBTSxnQkFBZ0IsSUFBSSxVQUFVLElBQUksa0JBQWtCLENBQUM7QUFDM0QsUUFBSSxNQUFNLGVBQWU7QUFDckIsYUFBTztBQUFBLElBQ1g7QUFDQSxXQUFPO0FBQUEsRUFDWDtBQUNBLEVBQUFBLHFCQUFvQixXQUFXO0FBTS9CLFdBQVMsV0FBVyxLQUFLO0FBQ3JCLFFBQUksQ0FBQyxTQUFTLEdBQUcsR0FBRztBQUNoQixhQUFPO0FBQUEsSUFDWDtBQUNBLFdBQU87QUFBQSxNQUNILFFBQVEsSUFBSSxXQUFXO0FBQUEsTUFDdkIsTUFBTSxJQUFJLFdBQVc7QUFBQSxJQUN6QjtBQUFBLEVBQ0o7QUFDQSxFQUFBQSxxQkFBb0IsYUFBYTtBQU1qQyxXQUFTLFVBQVUsS0FBSztBQUNwQixRQUFJLENBQUMsU0FBUyxHQUFHLEdBQUc7QUFDaEIsYUFBTztBQUFBLElBQ1g7QUFDQSxVQUFNLGdCQUFnQixJQUFJLGtCQUFrQjtBQUM1QyxXQUFPO0FBQUEsTUFDSCxRQUFRLElBQUksVUFBVSxhQUFhO0FBQUEsTUFDbkMsTUFBTSxJQUFJLFVBQVUsZ0JBQWdCLENBQUM7QUFBQSxJQUN6QztBQUFBLEVBQ0o7QUFDQSxFQUFBQSxxQkFBb0IsWUFBWTtBQU1oQyxXQUFTLGVBQWUsS0FBSztBQUN6QixVQUFNLFNBQVMsVUFBVSxHQUFHO0FBQzVCLFFBQUksQ0FBQyxRQUFRO0FBQ1QsYUFBTztBQUFBLElBQ1g7QUFDQSxRQUFJLG9CQUFvQixPQUFPLE1BQU07QUFDckMsV0FBTztBQUFBLEVBQ1g7QUFDQSxFQUFBQSxxQkFBb0IsaUJBQWlCO0FBQ3pDLEdBQUcsd0JBQXdCLHNCQUFzQixDQUFDLEVBQUU7OztBQzlEN0MsSUFBSTtBQUFBLENBQ1YsU0FBVUMsa0JBQWlCO0FBQ3hCLEVBQUFBLGlCQUFnQix3QkFBd0I7QUFJeEMsV0FBU0MsT0FBTSxRQUFRLGFBQWEsV0FBVyxLQUFLO0FBRWhELFVBQU0sZ0JBQWdCLDZCQUE2QkQsaUJBQWdCO0FBQ25FLFVBQU0scUJBQXFCLElBQUkscUJBQXFCLGFBQWE7QUFFakUsUUFBSSxVQUFVLG9CQUFvQixhQUFhO0FBQy9DLFFBQUksVUFBVSxxQkFBcUIsR0FBRyxnQkFBZ0IsZ0JBQWdCO0FBRXRFLFFBQUksVUFBVSxxQkFBcUIsR0FBRyxNQUFNO0FBQzVDLFFBQUksVUFBVSxxQkFBcUIsSUFBSSxXQUFXO0FBQ2xELFFBQUksVUFBVSxxQkFBcUIsSUFBSSxTQUFTO0FBQUEsRUFDcEQ7QUFDQSxFQUFBQSxpQkFBZ0IsUUFBUUM7QUFDeEIsV0FBU0MsTUFBSyxLQUFLO0FBQ2YsVUFBTSxTQUFTLG9CQUFvQixXQUFXLEdBQUc7QUFDakQsUUFBSSxDQUFDLFFBQVE7QUFDVCxhQUFPO0FBQUEsSUFDWDtBQUNBLFFBQUksT0FBTyxTQUFTLGdCQUFnQixrQkFBa0I7QUFDbEQsWUFBTSxJQUFJLE1BQU0sOERBQThEO0FBQUEsSUFDbEY7QUFDQSxVQUFNLE1BQU07QUFBQSxNQUNSLEdBQUc7QUFBQSxNQUNILFVBQVUsSUFBSSxXQUFXO0FBQUEsTUFDekIsYUFBYSxJQUFJLFdBQVc7QUFBQSxNQUM1QixXQUFXLElBQUksV0FBVztBQUFBLElBQzlCO0FBQ0EsV0FBTztBQUFBLEVBQ1g7QUFDQSxFQUFBRixpQkFBZ0IsT0FBT0U7QUFDM0IsR0FBRyxvQkFBb0Isa0JBQWtCLENBQUMsRUFBRTs7O0FDcENyQyxJQUFJO0FBQUEsQ0FDVixTQUFVQyx1QkFBc0I7QUFDN0IsRUFBQUEsc0JBQXFCLHdCQUF3QjtBQUs3QyxXQUFTQyxPQUFNLFFBQVEsV0FBVyxhQUFhLE1BQU0sS0FBSztBQUV0RCxVQUFNLHFCQUFxQixJQUFJLHFCQUFxQiw2QkFBNkJELHNCQUFxQixxQkFBcUI7QUFFM0gsUUFBSSxZQUFZLE1BQU0sS0FBSztBQUMzQixVQUFNLGdCQUFnQixJQUFJLG1CQUFtQixJQUFJO0FBRWpELFFBQUksVUFBVSxvQkFBb0IsYUFBYTtBQUMvQyxRQUFJLFVBQVUscUJBQXFCLEdBQUcsZ0JBQWdCLFlBQVk7QUFFbEUsUUFBSSxVQUFVLHFCQUFxQixHQUFHLE1BQU07QUFDNUMsUUFBSSxVQUFVLHFCQUFxQixJQUFJLFdBQVc7QUFDbEQsUUFBSSxVQUFVLHFCQUFxQixJQUFJLFNBQVM7QUFDaEQsVUFBTSxXQUFXLGdCQUFnQkEsc0JBQXFCLHdCQUF3QjtBQUM5RSxRQUFJLFVBQVUscUJBQXFCLElBQUksUUFBUTtBQUFBLEVBQ25EO0FBQ0EsRUFBQUEsc0JBQXFCLFFBQVFDO0FBQzdCLFdBQVNDLE1BQUssS0FBSztBQUNmLFVBQU0sU0FBUyxvQkFBb0IsV0FBVyxHQUFHO0FBRWpELFFBQUksQ0FBQyxRQUFRO0FBQ1QsYUFBTztBQUFBLElBQ1g7QUFFQSxRQUFJLE9BQU8sU0FBUyxnQkFBZ0IsY0FBYztBQUM5QyxZQUFNLElBQUksTUFBTSwwREFBMEQ7QUFBQSxJQUM5RTtBQUNBLFdBQU87QUFBQSxNQUNILEdBQUc7QUFBQSxNQUNILFVBQVUsSUFBSSxXQUFXO0FBQUEsTUFDekIsYUFBYSxJQUFJLFdBQVc7QUFBQSxNQUM1QixXQUFXLElBQUksV0FBVztBQUFBLE1BQzFCLE1BQU0sSUFBSSxXQUFXO0FBQUEsSUFDekI7QUFBQSxFQUNKO0FBQ0EsRUFBQUYsc0JBQXFCLE9BQU9FO0FBQ2hDLEdBQUcseUJBQXlCLHVCQUF1QixDQUFDLEVBQUU7OztBQzNDL0MsSUFBSTtBQUFBLENBQ1YsU0FBVUMsZUFBYztBQUNyQixFQUFBQSxjQUFhLHdCQUF3QjtBQUNyQyxXQUFTQyxPQUFNLFFBQVEsS0FBSztBQUV4QixRQUFJLFlBQVksNkJBQTZCLENBQUM7QUFDOUMsUUFBSSxZQUFZLGdCQUFnQixhQUFhO0FBRTdDLFFBQUksWUFBWSxNQUFNO0FBQUEsRUFDMUI7QUFDQSxFQUFBRCxjQUFhLFFBQVFDO0FBQ3JCLFdBQVNDLE1BQUssS0FBSztBQUNmLFVBQU0sU0FBUyxvQkFBb0IsV0FBVyxHQUFHO0FBQ2pELFFBQUksQ0FBQyxRQUFRO0FBQ1QsYUFBTztBQUFBLElBQ1g7QUFDQSxRQUFJLE9BQU8sU0FBUyxnQkFBZ0IsZUFBZTtBQUMvQyxZQUFNLElBQUksTUFBTSxrREFBa0Q7QUFBQSxJQUN0RTtBQUNBLFdBQU87QUFBQSxNQUNILEdBQUc7QUFBQSxNQUNILFVBQVUsSUFBSSxXQUFXO0FBQUEsSUFDN0I7QUFBQSxFQUNKO0FBQ0EsRUFBQUYsY0FBYSxPQUFPRTtBQUN4QixHQUFHLGlCQUFpQixlQUFlLENBQUMsRUFBRTs7O0FDekIvQixJQUFJO0FBQUEsQ0FDVixTQUFVQyx3QkFBdUI7QUFDOUIsRUFBQUEsdUJBQXNCLHdCQUF3QjtBQUs5QyxXQUFTQyxPQUFNLFFBQVEsV0FBVyxhQUFhLE1BQU0sS0FBSztBQUV0RCxVQUFNLHFCQUFxQixJQUFJLHFCQUFxQiw2QkFBNkJELHVCQUFzQixxQkFBcUI7QUFFNUgsUUFBSSxZQUFZLE1BQU0sS0FBSztBQUMzQixVQUFNLGdCQUFnQixJQUFJLG1CQUFtQixJQUFJO0FBRWpELFFBQUksVUFBVSxvQkFBb0IsYUFBYTtBQUMvQyxRQUFJLFVBQVUscUJBQXFCLEdBQUcsZ0JBQWdCLGFBQWE7QUFFbkUsUUFBSSxVQUFVLHFCQUFxQixHQUFHLE1BQU07QUFDNUMsUUFBSSxVQUFVLHFCQUFxQixJQUFJLFdBQVc7QUFDbEQsUUFBSSxVQUFVLHFCQUFxQixJQUFJLFNBQVM7QUFDaEQsVUFBTSxXQUFXLGdCQUFnQkEsdUJBQXNCLHdCQUF3QjtBQUMvRSxRQUFJLFVBQVUscUJBQXFCLElBQUksUUFBUTtBQUFBLEVBQ25EO0FBQ0EsRUFBQUEsdUJBQXNCLFFBQVFDO0FBQzlCLFdBQVNDLE1BQUssS0FBSztBQUNmLFVBQU0sU0FBUyxvQkFBb0IsV0FBVyxHQUFHO0FBQ2pELFFBQUksQ0FBQyxRQUFRO0FBQ1QsYUFBTztBQUFBLElBQ1g7QUFDQSxRQUFJLE9BQU8sU0FBUyxnQkFBZ0IsZUFBZTtBQUMvQyxZQUFNLElBQUksTUFBTSwyREFBMkQ7QUFBQSxJQUMvRTtBQUNBLFdBQU87QUFBQSxNQUNILEdBQUc7QUFBQSxNQUNILFVBQVUsSUFBSSxXQUFXO0FBQUEsTUFDekIsYUFBYSxJQUFJLFdBQVc7QUFBQSxNQUM1QixXQUFXLElBQUksV0FBVztBQUFBLE1BQzFCLE1BQU0sSUFBSSxXQUFXO0FBQUEsSUFDekI7QUFBQSxFQUNKO0FBQ0EsRUFBQUYsdUJBQXNCLE9BQU9FO0FBQ2pDLEdBQUcsMEJBQTBCLHdCQUF3QixDQUFDLEVBQUU7OztBQ3pDakQsSUFBSTtBQUFBLENBQ1YsU0FBVUMsK0JBQThCO0FBQ3JDLEVBQUFBLDhCQUE2Qix3QkFBd0I7QUFLckQsV0FBU0MsT0FBTSxRQUFRLFdBQVcsYUFBYSxXQUFXLE1BQU0sS0FBSztBQUVqRSxVQUFNLHFCQUFxQixJQUFJLHFCQUFxQiw2QkFBNkJELDhCQUE2QixxQkFBcUI7QUFFbkksUUFBSSxZQUFZLE1BQU0sS0FBSztBQUMzQixVQUFNLGdCQUFnQixJQUFJLG1CQUFtQixJQUFJO0FBRWpELFFBQUksVUFBVSxvQkFBb0IsYUFBYTtBQUMvQyxRQUFJLFVBQVUscUJBQXFCLEdBQUcsZ0JBQWdCLHFCQUFxQjtBQUUzRSxRQUFJLFVBQVUscUJBQXFCLEdBQUcsTUFBTTtBQUM1QyxRQUFJLFVBQVUscUJBQXFCLElBQUksV0FBVztBQUNsRCxRQUFJLFVBQVUscUJBQXFCLElBQUksU0FBUztBQUNoRCxRQUFJLFVBQVUscUJBQXFCLElBQUksU0FBUztBQUNoRCxVQUFNLGFBQWEsZ0JBQWdCQSw4QkFBNkIsd0JBQXdCO0FBQ3hGLFFBQUksVUFBVSxxQkFBcUIsSUFBSSxVQUFVO0FBQUEsRUFDckQ7QUFDQSxFQUFBQSw4QkFBNkIsUUFBUUM7QUFDckMsV0FBU0MsTUFBSyxLQUFLO0FBQ2YsVUFBTSxTQUFTLG9CQUFvQixXQUFXLEdBQUc7QUFDakQsUUFBSSxDQUFDLFFBQVE7QUFDVCxhQUFPO0FBQUEsSUFDWDtBQUNBLFFBQUksT0FBTyxTQUFTLGdCQUFnQix1QkFBdUI7QUFDdkQsWUFBTSxJQUFJLE1BQU0sa0VBQWtFO0FBQUEsSUFDdEY7QUFDQSxXQUFPO0FBQUEsTUFDSCxHQUFHO0FBQUEsTUFDSCxVQUFVLElBQUksV0FBVztBQUFBLE1BQ3pCLGFBQWEsSUFBSSxXQUFXO0FBQUEsTUFDNUIsV0FBVyxJQUFJLFdBQVc7QUFBQSxNQUMxQixXQUFXLElBQUksV0FBVztBQUFBLE1BQzFCLE1BQU0sSUFBSSxXQUFXO0FBQUEsSUFDekI7QUFBQSxFQUNKO0FBQ0EsRUFBQUYsOEJBQTZCLE9BQU9FO0FBQ3hDLEdBQUcsaUNBQWlDLCtCQUErQixDQUFDLEVBQUU7OztBQzNDL0QsSUFBSTtBQUFBLENBQ1YsU0FBVUMseUJBQXdCO0FBQy9CLEVBQUFBLHdCQUF1Qix3QkFBd0I7QUFJL0MsV0FBU0MsT0FBTSxRQUFRLGFBQWEsV0FBVyxXQUFXLEtBQUs7QUFFM0QsVUFBTSxnQkFBZ0IsNkJBQTZCRCx3QkFBdUI7QUFDMUUsVUFBTSxxQkFBcUIsSUFBSSxxQkFBcUIsYUFBYTtBQUVqRSxRQUFJLFVBQVUsb0JBQW9CLGFBQWE7QUFDL0MsUUFBSSxVQUFVLHFCQUFxQixHQUFHLGdCQUFnQix3QkFBd0I7QUFFOUUsUUFBSSxVQUFVLHFCQUFxQixHQUFHLE1BQU07QUFDNUMsUUFBSSxVQUFVLHFCQUFxQixJQUFJLFdBQVc7QUFDbEQsUUFBSSxVQUFVLHFCQUFxQixJQUFJLFNBQVM7QUFDaEQsUUFBSSxVQUFVLHFCQUFxQixJQUFJLFNBQVM7QUFBQSxFQUNwRDtBQUNBLEVBQUFBLHdCQUF1QixRQUFRQztBQUMvQixXQUFTQyxNQUFLLEtBQUs7QUFDZixVQUFNLFNBQVMsb0JBQW9CLFdBQVcsR0FBRztBQUNqRCxRQUFJLENBQUMsUUFBUTtBQUNULGFBQU87QUFBQSxJQUNYO0FBQ0EsUUFBSSxPQUFPLFNBQVMsZ0JBQWdCLDBCQUEwQjtBQUMxRCxZQUFNLElBQUksTUFBTSw4REFBOEQ7QUFBQSxJQUNsRjtBQUNBLFdBQU87QUFBQSxNQUNILEdBQUc7QUFBQSxNQUNILFVBQVUsSUFBSSxXQUFXO0FBQUEsTUFDekIsYUFBYSxJQUFJLFdBQVc7QUFBQSxNQUM1QixXQUFXLElBQUksV0FBVztBQUFBLE1BQzFCLFdBQVcsSUFBSSxXQUFXO0FBQUEsSUFDOUI7QUFBQSxFQUNKO0FBQ0EsRUFBQUYsd0JBQXVCLE9BQU9FO0FBQ2xDLEdBQUcsMkJBQTJCLHlCQUF5QixDQUFDLEVBQUU7OztBQ3JDbkQsSUFBSTtBQUFBLENBQ1YsU0FBVUMsc0JBQXFCO0FBQzVCLEVBQUFBLHFCQUFvQix3QkFBd0I7QUFDNUMsV0FBU0MsT0FBTSxRQUFRLFdBQVcsS0FBSztBQUVuQyxRQUFJLFlBQVksNkJBQTZCLENBQUM7QUFDOUMsUUFBSSxZQUFZLGdCQUFnQixxQkFBcUI7QUFFckQsUUFBSSxZQUFZLE1BQU07QUFDdEIsUUFBSSxZQUFZLFNBQVM7QUFBQSxFQUM3QjtBQUNBLEVBQUFELHFCQUFvQixRQUFRQztBQUM1QixXQUFTQyxNQUFLLEtBQUs7QUFDZixVQUFNLFNBQVMsb0JBQW9CLFdBQVcsR0FBRztBQUNqRCxRQUFJLENBQUMsUUFBUTtBQUNULGFBQU87QUFBQSxJQUNYO0FBQ0EsUUFBSSxPQUFPLFNBQVMsZ0JBQWdCLHVCQUF1QjtBQUN2RCxZQUFNLElBQUksTUFBTSx5REFBeUQ7QUFBQSxJQUM3RTtBQUNBLFdBQU87QUFBQSxNQUNILEdBQUc7QUFBQSxNQUNILFVBQVUsSUFBSSxXQUFXO0FBQUEsTUFDekIsV0FBVyxJQUFJLFdBQVc7QUFBQSxJQUM5QjtBQUFBLEVBQ0o7QUFDQSxFQUFBRixxQkFBb0IsT0FBT0U7QUFDL0IsR0FBRyx3QkFBd0Isc0JBQXNCLENBQUMsRUFBRTs7O0FDdEI3QyxTQUFTLGlCQUFpQixTQUFTO0FBQ3RDLFNBQU87QUFBQSxJQUNILGdCQUFnQjtBQUFBLElBQ2hCLGdCQUFnQjtBQUFBLElBQ2hCLGdCQUFnQjtBQUFBLEVBQ3BCLEVBQUUsU0FBUyxRQUFRLElBQUk7QUFDM0I7QUFFTyxTQUFTLHNCQUFzQixTQUFTLGVBQWUsUUFBUSxtQkFBbUI7QUFDckYsUUFBTSxTQUFTLE9BQU8sbUJBQW1CO0FBQ3pDLE1BQUksUUFBUSxTQUFTLGdCQUFnQix1QkFBdUI7QUFDeEQsMEJBQXNCLE1BQU0sZUFBZSxRQUFRLFdBQVcsUUFBUSxhQUFhLFFBQVEsTUFBTSxNQUFNO0FBQUEsRUFDM0csV0FDUyxRQUFRLFNBQVMsZ0JBQWdCLDBCQUEwQjtBQUNoRSxvQkFBZ0IsTUFBTSxlQUFlLFFBQVEsYUFBYSxRQUFRLFdBQVcsTUFBTTtBQUFBLEVBQ3ZGLFdBQ1MsUUFBUSxTQUFTLGdCQUFnQix1QkFBdUI7QUFDN0QsaUJBQWEsTUFBTSxlQUFlLE1BQU07QUFBQSxFQUM1QztBQUNBLG9CQUFrQixZQUFZLE9BQU8sT0FBTyxFQUFFLFNBQVMsUUFBUSxPQUFPLG1CQUFtQixDQUFDLEdBQUcsS0FBSztBQUN0RztBQUVPLFNBQVMsc0JBQXNCLFNBQVMsU0FBUyxRQUFRLG1CQUFtQjtBQUMvRSxRQUFNLFNBQVMsT0FBTyxtQkFBbUI7QUFDekMsTUFBSSxRQUFRLFNBQVMsZ0JBQWdCLGVBQWU7QUFDaEQsaUNBQTZCLE1BQU0sUUFBUSxVQUFVLFFBQVEsV0FBVyxRQUFRLGFBQWEsUUFBUSxXQUFXLFFBQVEsTUFBTSxNQUFNO0FBQUEsRUFDeEksV0FDUyxRQUFRLFNBQVMsZ0JBQWdCLGtCQUFrQjtBQUN4RCwyQkFBdUIsTUFBTSxRQUFRLFVBQVUsUUFBUSxhQUFhLFFBQVEsV0FBVyxRQUFRLFdBQVcsTUFBTTtBQUFBLEVBQ3BILFdBQ1MsUUFBUSxTQUFTLGdCQUFnQixlQUFlO0FBQ3JELHdCQUFvQixNQUFNLFFBQVEsVUFBVSxRQUFRLFdBQVcsTUFBTTtBQUFBLEVBQ3pFO0FBQ0Esb0JBQWtCLFlBQVksT0FBTyxPQUFPLEVBQUUsU0FBUyxRQUFRLE9BQU8sbUJBQW1CLENBQUMsR0FBRyxLQUFLO0FBQ3RHO0FBRU8sU0FBUyxtQkFBbUIsU0FBUyxnQkFBZ0IsUUFBUTtBQUNoRSxNQUFJLFlBQVk7QUFDaEIsUUFBTSxTQUFTLElBQUksb0JBQW9CO0FBQ3ZDLE1BQUksQ0FBQyxhQUFhLFVBQVUsU0FBUztBQUNqQyxXQUFPLFlBQVksUUFBUSxJQUFJO0FBQy9CLGdCQUFZLGdCQUFnQixZQUFZLE1BQU07QUFDOUMsV0FBTyxZQUFZO0FBQUEsRUFDdkI7QUFDQSxNQUFJLENBQUM7QUFDRCxVQUFNLElBQUksTUFBTSwwQkFBMEI7QUFFOUMsUUFBTSxlQUFlLEVBQUUsR0FBRyxXQUFXLE9BQU87QUFDNUMsU0FBTyxZQUFZO0FBQ25CLGtCQUFnQixVQUFVLGNBQWMsTUFBTTtBQUM5QyxTQUFPLE9BQU8sU0FBUztBQUMzQjs7O0FDaERPLFNBQVMsZ0JBQWdCQyxTQUFRLGdDQUFnQztBQUNwRSxRQUFNLGFBQWEsQ0FBQztBQUVwQixRQUFNQyxpQkFBZ0IsY0FBb0JELE9BQU07QUFDaEQsUUFBTUUsaUJBQWdCLGNBQW9CRixPQUFNO0FBQ2hELFFBQU1HLGFBQVksVUFBZ0JILE9BQU07QUFFeEMsUUFBTSxtQkFBbUIsQ0FBQztBQUUxQixRQUFNLG9CQUFvQixDQUFDO0FBTTNCLFdBQVMsa0JBQWtCLGFBQWE7QUFNcEMsV0FBTyxTQUFTSSxtQkFBa0IsY0FBYztBQUM1QyxZQUFNLFNBQVMsSUFBSSxvQkFBb0IsWUFBWTtBQUNuRCxVQUFJO0FBQ0osYUFBUSxTQUFTLG9CQUFvQixVQUFVLE1BQU0sR0FBSTtBQUNyRCxjQUFNLFNBQVMsT0FBTyxrQkFBa0I7QUFDeEMsWUFBSSxVQUFVO0FBQ2QsWUFBSSxPQUFPLFNBQVMsZ0JBQWdCLGtCQUFrQjtBQUNsRCxvQkFBVSxnQkFBZ0IsS0FBSyxNQUFNO0FBQUEsUUFDekMsV0FDUyxPQUFPLFNBQVMsZ0JBQWdCLDBCQUEwQjtBQUMvRCxvQkFBVSx1QkFBdUIsS0FBSyxNQUFNO0FBQUEsUUFDaEQsV0FDUyxPQUFPLFNBQVMsZ0JBQWdCLGVBQWU7QUFDcEQsb0JBQVUsc0JBQXNCLEtBQUssTUFBTTtBQUFBLFFBQy9DLFdBQ1MsT0FBTyxTQUFTLGdCQUFnQix1QkFBdUI7QUFDNUQsb0JBQVUsNkJBQTZCLEtBQUssTUFBTTtBQUFBLFFBQ3RELFdBQ1MsT0FBTyxTQUFTLGdCQUFnQixlQUFlO0FBQ3BELG9CQUFVLGFBQWEsS0FBSyxNQUFNO0FBQUEsUUFDdEMsV0FDUyxPQUFPLFNBQVMsZ0JBQWdCLHVCQUF1QjtBQUM1RCxvQkFBVSxvQkFBb0IsS0FBSyxNQUFNO0FBQUEsUUFDN0MsV0FDUyxPQUFPLFNBQVMsZ0JBQWdCLGNBQWM7QUFDbkQsb0JBQVUscUJBQXFCLEtBQUssTUFBTTtBQUFBLFFBRTlDLE9BQ0s7QUFFRCxpQkFBTyxvQkFBb0IsT0FBTyxNQUFNO0FBQUEsUUFDNUM7QUFDQSxZQUFJLFNBQVM7QUFDVCwyQkFBaUIsS0FBSztBQUFBLFlBQ2xCLEdBQUc7QUFBQSxZQUNIO0FBQUEsWUFDQSxlQUFlLE9BQU8sT0FBTyxFQUFFLFNBQVMsUUFBUSxPQUFPLGtCQUFrQixDQUFDO0FBQUEsVUFDOUUsQ0FBQztBQUFBLFFBQ0w7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFLQSxXQUFTLFlBQVksT0FBTztBQUN4QixVQUFNLG9CQUFvQixNQUFNLE9BQU8sR0FBRyxNQUFNLE1BQU07QUFDdEQsV0FBTztBQUFBLEVBQ1g7QUFNQSxXQUFTLGNBQWMsS0FBSztBQUN4QixVQUFNLGVBQWUsZUFBZTtBQUNwQyxRQUFJLGNBQWM7QUFDZCxpQkFBVyxDQUFDLFVBQVUsT0FBTyxLQUFLSixRQUFPLGdCQUFnQkMsY0FBYSxHQUFHO0FBQ3JFLFlBQUksUUFBUSxjQUFjLElBQUksYUFBYSxRQUFRLGFBQWEsSUFBSSxVQUFVO0FBQzFFLGlCQUFPLEVBQUUsVUFBVSxRQUFRO0FBQUEsUUFDL0I7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUNBLFdBQU8sRUFBRSxVQUFVLElBQUksU0FBUztBQUFBLEVBQ3BDO0FBS0EsaUJBQWUsa0JBQWtCO0FBQzdCLFVBQU0sb0JBQW9CLFlBQVksZ0JBQWdCO0FBQ3RELFVBQU0sMEJBQTBCLENBQUM7QUFDakMsZUFBVyxPQUFPLG1CQUFtQjtBQUNqQyxVQUFJLEVBQUUsVUFBVSxRQUFRLElBQUksY0FBYyxHQUFHO0FBRTdDLFVBQWlCLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxTQUFTO0FBQ2hELG1CQUFXRCxRQUFPLFVBQVU7QUFDNUIsa0JBQVUsRUFBRSxVQUFVLElBQUksVUFBVSxXQUFXLElBQUksVUFBVTtBQUM3RCxRQUFBQyxlQUFjLGdCQUFnQixVQUFVLE9BQU87QUFBQSxNQUNuRDtBQUNBLFVBQUksSUFBSSxTQUFTLGdCQUFnQixpQkFBaUIsSUFBSSxTQUFTLGdCQUFnQix1QkFBdUI7QUFDbEcsZ0NBQXdCLEtBQUssUUFBUTtBQUNyQywwQkFBa0IsS0FBSyxHQUFHO0FBQUEsTUFDOUIsT0FDSztBQUNELGNBQU0sY0FBY0QsUUFBTyxnQkFBZ0IsZUFBZSxRQUFRO0FBRWxFLFlBQUksZ0JBQWdCLFlBQVk7QUFDNUI7QUFFSixZQUFJLGdCQUFnQixZQUFZLFNBQVM7QUFDckMsVUFBQUEsUUFBTyxnQkFBZ0IsaUJBQWlCLFFBQVE7QUFBQSxRQUNwRDtBQUNBLGNBQU0sWUFBWUEsUUFBTyxtQkFBbUIsSUFBSSxXQUFXO0FBRTNELFlBQUksV0FBVztBQUNYLGNBQUksSUFBSSxTQUFTLGdCQUFnQixpQkFDN0IsVUFBVSxnQkFBZ0JHLFdBQVUsZUFDcENGLGVBQWMsSUFBSSxRQUFRLEtBQzFCQyxlQUFjLElBQUksUUFBUSxHQUFHO0FBQzdCLGdCQUFJLE9BQW9CLG1CQUFtQixHQUFHO0FBQUEsVUFDbEQ7QUFDQSxnQkFBTSxDQUFDLGlCQUFpQixLQUFLLElBQUksVUFBVSxlQUFlLEVBQUUsR0FBRyxLQUFLLFNBQVMsQ0FBQztBQUM5RSxjQUFJLENBQUMsaUJBQWlCO0FBRWxCLDhCQUFrQixLQUFLLEdBQUc7QUFDMUIsOENBQWtDLCtCQUErQixJQUFJLFVBQVUsSUFBSSxNQUFNLFdBQVcsS0FBSztBQUFBLFVBQzdHO0FBQUEsUUFDSixPQUNLO0FBRUQsNEJBQWtCLEtBQUssR0FBRztBQUFBLFFBQzlCO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFFQSxlQUFXLFVBQVUseUJBQXlCO0FBQzFDLGlCQUFXLGNBQWNGLFFBQU8sZUFBZSxHQUFHO0FBRTlDLG1CQUFXLGNBQWMsUUFBUSxJQUFJO0FBQUEsTUFDekM7QUFDQSxNQUFBQSxRQUFPLGdCQUFnQixvQkFBb0IsTUFBTTtBQUNqRCx3Q0FBa0MsK0JBQStCLFFBQVEsZ0JBQWdCLGFBQWE7QUFBQSxJQUMxRztBQUFBLEVBQ0o7QUFJQSxpQkFBZSxhQUFhLHlCQUF5QjtBQUVqRCxVQUFNLGVBQWUsWUFBWSxpQkFBaUI7QUFDbEQsVUFBTSxTQUFTLElBQUksb0JBQW9CO0FBQ3ZDLGVBQVcsYUFBYUEsUUFBTyxlQUFlLEdBQUc7QUFDN0MsaUJBQVcsV0FBVyxVQUFVLGVBQWUsR0FBRztBQUM5QyxjQUFNLFNBQVMsT0FBTyxtQkFBbUI7QUFFekMsWUFBSSxXQUFXLEtBQUssQ0FBQyxNQUFNLEVBQUUsT0FBTyxPQUFPLENBQUMsR0FBRztBQUMzQyxjQUFJLFFBQVEsU0FBUyxnQkFBZ0IsZUFBZTtBQUNoRCxrQ0FBc0IsTUFBTSxRQUFRLFVBQVUsUUFBUSxXQUFXLFFBQVEsYUFBYSxRQUFRLE1BQU0sTUFBTTtBQUFBLFVBQzlHLFdBQ1MsUUFBUSxTQUFTLGdCQUFnQixrQkFBa0I7QUFDeEQsNEJBQWdCLE1BQU0sUUFBUSxVQUFVLFVBQVUsYUFBYSxRQUFRLFdBQVcsTUFBTTtBQUFBLFVBQzVGLFdBQ1MsUUFBUSxTQUFTLGdCQUFnQixjQUFjO0FBQ3BELGlDQUFxQixNQUFNLFFBQVEsVUFBVSxRQUFRLFdBQVcsUUFBUSxhQUFhLFFBQVEsTUFBTSxNQUFNO0FBQUEsVUFDN0c7QUFDQSx1QkFBYSxLQUFLO0FBQUEsWUFDZCxHQUFHO0FBQUEsWUFDSCxlQUFlLE9BQU8sT0FBTyxFQUFFLFNBQVMsUUFBUSxPQUFPLG1CQUFtQixDQUFDO0FBQUEsVUFDL0UsQ0FBQztBQUNELGNBQUksZ0NBQWdDO0FBQ2hDLGtCQUFNLFdBQVcsUUFBUSxTQUFTLGdCQUFnQixpQkFBaUIsUUFBUSxTQUFTLGdCQUFnQixlQUM5RixVQUFVLElBQUksUUFBUSxRQUFRLElBQzlCO0FBQ04sMkNBQStCLFFBQVEsVUFBVSxRQUFRLE1BQU0sV0FBVyxRQUFRO0FBQUEsVUFDdEY7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFFQSxlQUFXLFlBQVkseUJBQXlCO0FBQzVDLFlBQU0sU0FBUyxPQUFPLG1CQUFtQjtBQUN6QyxtQkFBYSxNQUFNLFVBQVUsTUFBTTtBQUNuQyxtQkFBYSxLQUFLO0FBQUEsUUFDZCxNQUFNLGdCQUFnQjtBQUFBLFFBQ3RCO0FBQUEsUUFDQSxlQUFlLE9BQU8sT0FBTyxFQUFFLFNBQVMsUUFBUSxPQUFPLG1CQUFtQixDQUFDO0FBQUEsTUFDL0UsQ0FBQztBQUNELHdDQUFrQywrQkFBK0IsVUFBVSxnQkFBZ0IsYUFBYTtBQUFBLElBQzVHO0FBRUEsVUFBTSxrQkFBa0IsSUFBSSxvQkFBb0I7QUFDaEQsZUFBVyxTQUFTLFlBQVk7QUFDNUIsWUFBTSxpQkFBaUIsT0FBTyxLQUFLO0FBQ25DLFlBQU0sWUFBWSxXQUFXLGNBQWM7QUFDM0MsWUFBTSxzQkFBc0IsVUFBVSxTQUFTO0FBQy9DLFlBQU0scUJBQXFCLFVBQVUsU0FBUztBQUM5QyxzQkFBZ0IsWUFBWTtBQUM1QixZQUFNSyxVQUFTLElBQUksb0JBQW9CO0FBRXZDLGlCQUFXQyxZQUFXLGNBQWM7QUFFaEMsWUFBSUEsU0FBUSxnQkFBZ0I7QUFDeEI7QUFFSixZQUFJLENBQUMsVUFBVSxPQUFPQSxRQUFPO0FBQ3pCO0FBQ0osY0FBTSxFQUFFLFNBQVMsSUFBSSxjQUFjQSxRQUFPO0FBQzFDLGNBQU0sb0JBQW9CLGlCQUFpQkEsWUFDdkNBLFNBQVEsZ0JBQWdCSCxXQUFVLGVBQ2xDQSxXQUFVLElBQUksUUFBUSxLQUN0QkQsZUFBYyxJQUFJLFFBQVEsS0FDMUJELGVBQWMsSUFBSSxRQUFRO0FBRTlCLFlBQUksdUJBQXVCSyxTQUFRLFNBQVMsZ0JBQWdCLGlCQUFpQixtQkFBbUI7QUFDNUYsZ0JBQU0sU0FBUyxjQUFjSixlQUFjLElBQUksUUFBUSxDQUFDO0FBQ3hELGdCQUFNLGdCQUE2QixtQkFBbUJJLFVBQVNILFdBQVUsSUFBSSxRQUFRLEdBQUcsT0FBTyxRQUFRO0FBQ3ZHLGdCQUFNLFNBQVNFLFFBQU8sbUJBQW1CO0FBQ3pDLGdDQUFzQixNQUFNLFVBQVVDLFNBQVEsV0FBV0EsU0FBUSxhQUFhLGVBQWVELE9BQU07QUFDbkcsMEJBQWdCLFlBQVlBLFFBQU8sT0FBTyxFQUFFLFNBQVMsUUFBUUEsUUFBTyxtQkFBbUIsQ0FBQyxHQUFHLEtBQUs7QUFDaEc7QUFBQSxRQUNKO0FBQ0EsWUFBSSx1QkFBb0MsaUJBQWlCQyxRQUFPLEdBQUc7QUFHL0QsY0FBSSxnQkFBZ0IsVUFBVUEsV0FBVUEsU0FBUSxPQUFPLElBQUksV0FBVztBQUN0RSxjQUFJLG1CQUFtQjtBQUNuQixrQkFBTSxTQUFTLGNBQWNKLGVBQWMsSUFBSSxRQUFRLENBQUM7QUFDeEQsNEJBQTZCLG1CQUFtQkksVUFBU0gsV0FBVSxJQUFJLFFBQVEsR0FBRyxPQUFPLFFBQVE7QUFBQSxVQUNyRztBQUNBLFVBQWEsc0JBQXNCLEVBQUUsR0FBR0csVUFBUyxNQUFNLGNBQWMsR0FBRyxVQUFVRCxTQUFRLGVBQWU7QUFFekc7QUFBQSxRQUNKO0FBR0EsWUFBSSxzQkFBc0IsQ0FBYyxpQkFBaUJDLFFBQU8sR0FBRztBQUMvRCxnQkFBTSxjQUFjTCxlQUFjLFVBQVVLLFNBQVEsUUFBUTtBQUU1RCxjQUFJLGFBQWE7QUFDYixZQUFhLHNCQUFzQkEsVUFBUyxhQUFhRCxTQUFRLGVBQWU7QUFFaEY7QUFBQSxVQUNKO0FBQUEsUUFDSjtBQUVBLHdCQUFnQixZQUFZQyxTQUFRLGVBQWUsS0FBSztBQUFBLE1BQzVEO0FBQ0EsWUFBTSxVQUFVLGdCQUFnQixtQkFBbUIsSUFBSSxnQkFBZ0IsU0FBUyxJQUFJLElBQUksV0FBVyxDQUFDLENBQUM7QUFDckcsWUFBTSxVQUFVLEtBQUssT0FBTztBQUFBLElBQ2hDO0FBQUEsRUFDSjtBQUtBLFdBQVMsYUFBYSxXQUFXO0FBQzdCLFVBQU0sS0FBSyxXQUFXLEtBQUssU0FBUyxJQUFJO0FBQ3hDLGNBQVUsWUFBWSxrQkFBa0IsRUFBRTtBQUFBLEVBQzlDO0FBQ0EsU0FBTztBQUFBLElBQ0g7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0o7QUFDSjs7O0FDeFJPLElBQUk7QUFBQSxDQUNWLFNBQVVDLFlBQVc7QUFDbEIsTUFBSTtBQUNKLEdBQUMsU0FBVUMseUJBQXdCO0FBRS9CLElBQUFBLHdCQUF1QkEsd0JBQXVCLFdBQVcsSUFBSSxDQUFDLElBQUk7QUFFbEUsSUFBQUEsd0JBQXVCQSx3QkFBdUIsVUFBVSxJQUFJLENBQUMsSUFBSTtBQUFBLEVBQ3JFLEdBQUcseUJBQXlCRCxXQUFVLDJCQUEyQkEsV0FBVSx5QkFBeUIsQ0FBQyxFQUFFO0FBQzNHLEdBQUcsY0FBYyxZQUFZLENBQUMsRUFBRTtBQU96QixTQUFTLFlBQVksR0FBRyxHQUFHO0FBRTlCLE1BQUksTUFBTTtBQUNOLFdBQU87QUFDWCxNQUFJLE1BQU0sUUFBUSxNQUFNO0FBQ3BCLFdBQU87QUFDWCxNQUFJLE1BQU0sUUFBUSxNQUFNO0FBQ3BCLFdBQU87QUFDWCxNQUFJLGFBQWEsY0FBYyxhQUFhLFlBQVk7QUFDcEQsVUFBTSxtQkFBbUIsRUFBRSxhQUFhLEVBQUU7QUFDMUMsUUFBSSxxQkFBcUIsR0FBRztBQUN4QixhQUFPLG1CQUFtQixJQUFJLElBQUk7QUFBQSxJQUN0QztBQUNBLFFBQUk7QUFDSixhQUFTLElBQUksR0FBRyxJQUFJLEVBQUUsWUFBWSxJQUFJLEdBQUcsS0FBSztBQUMxQyxZQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUNoQixVQUFJLFFBQVEsR0FBRztBQUNYLGVBQU8sTUFBTSxJQUFJLElBQUk7QUFBQSxNQUN6QjtBQUFBLElBQ0o7QUFFQSxXQUFPO0FBQUEsRUFDWDtBQUNBLE1BQUksT0FBTyxNQUFNLFVBQVU7QUFDdkIsVUFBTSxtQkFBbUIsRUFBRSxTQUFTLEVBQUU7QUFDdEMsUUFBSSxxQkFBcUIsR0FBRztBQUN4QixhQUFPLG1CQUFtQixJQUFJLElBQUk7QUFBQSxJQUN0QztBQUNBLFdBQU8sRUFBRSxjQUFjLENBQUM7QUFBQSxFQUM1QjtBQUNBLFNBQU8sSUFBSSxJQUFJLElBQUk7QUFDdkI7OztBQzVDTyxTQUFTLGFBQWEsS0FBSztBQUM5QixTQUFPLE9BQU8sT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQ25DOzs7QUNETyxTQUFTLG1CQUFtQixRQUFRLFlBQVk7QUFDbkQsUUFBTSxnQkFBZ0IsV0FBVyxJQUFJLE1BQU0sS0FBSyxLQUFLO0FBQ3JELGFBQVcsSUFBSSxRQUFRLFlBQVk7QUFDbkMsU0FBTztBQUNYO0FBQ08sU0FBUyw4QkFBOEIsYUFBYSxZQUFZLFFBQVEsTUFBTTtBQUNqRixTQUFPLFNBQVMsY0FBYyxRQUFRLGNBQWM7QUFDaEQsZUFBVyxDQUFDLFFBQVEsU0FBUyxLQUFLLFlBQVk7QUFFMUMsVUFBSSxjQUFjO0FBR2QsWUFBSSxDQUFDLGFBQWEsTUFBTTtBQUNwQjtBQUFBLE1BQ1I7QUFFQSxVQUFJLEtBQUssSUFBSSxNQUFNLEdBQUc7QUFDbEIsY0FBTSxLQUFLLEtBQUssSUFBSSxNQUFNO0FBQzFCLGNBQU0sTUFBTSxJQUFJLG9CQUFvQjtBQUNwQyxlQUFPLFVBQVUsSUFBSSxHQUFHO0FBQ3hCLDhCQUFzQixNQUFNLFFBQVEsV0FBVyxhQUFhLElBQUksU0FBUyxHQUFHLE1BQU07QUFBQSxNQUN0RixPQUNLO0FBQ0Qsd0JBQWdCLE1BQU0sUUFBUSxhQUFhLFdBQVcsTUFBTTtBQUFBLE1BQ2hFO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFDSjtBQUNPLFNBQVMsd0JBQXdCLGFBQWEsWUFBWSxRQUFRLE1BQU07QUFVM0UsV0FBUyx3QkFBd0IsU0FBUztBQUN0QyxVQUFNLEVBQUUsVUFBVSxVQUFVLElBQUk7QUFDaEMsVUFBTSxtQkFBbUIsV0FBVyxJQUFJLFFBQVE7QUFFaEQsUUFBSSxxQkFBcUIsVUFBYSxtQkFBbUIsV0FBVztBQUNoRSxhQUFPLHlCQUF5QjtBQUFBLElBQ3BDO0FBRUEsUUFBSSxtQkFBbUIsV0FBVztBQUU5QixhQUFPLHlCQUF5QjtBQUFBLElBQ3BDO0FBRUEsUUFBSSxRQUFRLFNBQVMsZ0JBQWdCLG9CQUFvQixDQUFDLEtBQUssSUFBSSxRQUFRLEdBQUc7QUFDMUUsYUFBTyx5QkFBeUI7QUFBQSxJQUNwQztBQUNBLFFBQUkscUJBQXFCO0FBQ3pCLFFBQUksS0FBSyxJQUFJLFFBQVEsR0FBRztBQUNwQixZQUFNLGNBQWMsSUFBSSxvQkFBb0I7QUFDNUMsYUFBTyxVQUFVLEtBQUssSUFBSSxRQUFRLEdBQUcsV0FBVztBQUNoRCwyQkFBcUIsWUFBWSxZQUFZLFNBQVMsR0FBRyxRQUFRLFFBQVEsSUFBSTtBQUFBLElBQ2pGLE9BQ0s7QUFDRCwyQkFBcUIsWUFBWSxNQUFNLFFBQVEsSUFBSTtBQUFBLElBQ3ZEO0FBR0EsUUFBSSx1QkFBdUIsR0FBRztBQUMxQixhQUFPLHlCQUF5QjtBQUFBLElBQ3BDLFdBQ1MscUJBQXFCLEdBQUc7QUFFN0IsYUFBTyx5QkFBeUI7QUFBQSxJQUNwQyxPQUNLO0FBRUQsYUFBTyx5QkFBeUI7QUFBQSxJQUNwQztBQUFBLEVBQ0o7QUFDQSxTQUFPLENBQUMsUUFBUTtBQUVaLFFBQUksSUFBSSxTQUFTLGdCQUFnQixpQkFDN0IsSUFBSSxTQUFTLGdCQUFnQix5QkFDN0IsSUFBSSxTQUFTLGdCQUFnQixvQkFDN0IsSUFBSSxTQUFTLGdCQUFnQjtBQUU3QixhQUFPLENBQUMsTUFBTSxLQUFLLElBQUksSUFBSSxRQUFRLENBQUM7QUFDeEMsVUFBTSxTQUFTLHdCQUF3QixHQUFHO0FBQzFDLFVBQU0sU0FBUyxJQUFJO0FBQ25CLFlBQVEsUUFBUTtBQUFBLE1BQ1osS0FBSyx5QkFBeUI7QUFBQSxNQUM5QixLQUFLLHlCQUF5Qix1QkFBdUI7QUFDakQsbUJBQVcsSUFBSSxRQUFRLElBQUksU0FBUztBQUNwQyxZQUFJLElBQUksU0FBUyxnQkFBZ0IsaUJBQWlCLElBQUksU0FBUyxnQkFBZ0IsdUJBQXVCO0FBQ2xHLGdCQUFNLE1BQU0sSUFBSSxvQkFBb0IsSUFBSSxJQUFJO0FBQzVDLGVBQUssSUFBSSxRQUFRLE9BQU8sWUFBWSxHQUFHLENBQUM7QUFBQSxRQUM1QyxPQUNLO0FBQ0QsZUFBSyxPQUFPLE1BQU07QUFBQSxRQUN0QjtBQUNBLGVBQU8sQ0FBQyxNQUFNLEtBQUssSUFBSSxNQUFNLENBQUM7QUFBQSxNQUNsQztBQUFBLE1BQ0EsS0FBSyx5QkFBeUI7QUFBQSxNQUM5QixLQUFLLHlCQUF5QixtQkFBbUI7QUFDN0MsWUFBSSxLQUFLLElBQUksTUFBTSxHQUFHO0FBQ2xCLGdCQUFNLGNBQWMsSUFBSSxvQkFBb0I7QUFDNUMsaUJBQU8sVUFBVSxLQUFLLElBQUksTUFBTSxHQUFHLFdBQVc7QUFDOUMsaUJBQU87QUFBQSxZQUNIO0FBQUEsY0FDSSxNQUFNLGdCQUFnQjtBQUFBLGNBQ3RCO0FBQUEsY0FDQSxNQUFNLFlBQVksU0FBUztBQUFBLGNBQzNCLFVBQVU7QUFBQSxjQUNWLFdBQVcsV0FBVyxJQUFJLE1BQU07QUFBQSxZQUNwQztBQUFBLFlBQ0EsS0FBSyxJQUFJLE1BQU07QUFBQSxVQUNuQjtBQUFBLFFBQ0osT0FDSztBQUNELGlCQUFPO0FBQUEsWUFDSDtBQUFBLGNBQ0ksTUFBTSxnQkFBZ0I7QUFBQSxjQUN0QjtBQUFBLGNBQ0EsVUFBVTtBQUFBLGNBQ1YsV0FBVyxXQUFXLElBQUksTUFBTTtBQUFBLFlBQ3BDO0FBQUEsWUFDQTtBQUFBLFVBQ0o7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFDQSxXQUFPLENBQUMsTUFBTSxLQUFLLElBQUksTUFBTSxDQUFDO0FBQUEsRUFDbEM7QUFDSjtBQUNPLFNBQVMsNEJBQTRCLGFBQWEsWUFBWSxlQUFlLFFBQVEsTUFBTTtBQUM5RixTQUFPLGFBQWE7QUFDaEIsZUFBVyxVQUFVLGVBQWU7QUFDaEMsWUFBTSxlQUFlLG1CQUFtQixRQUFRLFVBQVU7QUFDMUQsVUFBSSxLQUFLLElBQUksTUFBTSxHQUFHO0FBQ2xCLGNBQU0sY0FBYyxJQUFJLG9CQUFvQjtBQUM1QyxlQUFPLFVBQVUsS0FBSyxJQUFJLE1BQU0sR0FBRyxXQUFXO0FBQzlDLGNBQU0sTUFBTTtBQUFBLFVBQ1IsTUFBTSxnQkFBZ0I7QUFBQSxVQUN0QjtBQUFBLFVBQ0EsVUFBVTtBQUFBLFVBQ1YsTUFBTSxZQUFZLFNBQVM7QUFBQSxVQUMzQixXQUFXO0FBQUEsUUFDZjtBQUNBLGNBQU07QUFBQSxNQUNWLE9BQ0s7QUFDRCxjQUFNLE1BQU07QUFBQSxVQUNSLE1BQU0sZ0JBQWdCO0FBQUEsVUFDdEI7QUFBQSxVQUNBLFVBQVU7QUFBQSxVQUNWLFdBQVc7QUFBQSxRQUNmO0FBQ0EsY0FBTTtBQUFBLE1BQ1Y7QUFBQSxJQUNKO0FBQ0Esa0JBQWMsTUFBTTtBQUFBLEVBQ3hCO0FBQ0o7QUFJTyxTQUFTLG9DQUFvQyxlQUFlLGFBQWEsUUFBUTtBQUNwRixRQUFNLE9BQU8sb0JBQUksSUFBSTtBQUNyQixRQUFNLGdCQUFnQixvQkFBSSxJQUFJO0FBQzlCLFFBQU0sYUFBYSxvQkFBSSxJQUFJO0FBQzNCLFNBQU87QUFBQSxJQUNILElBQUksY0FBYztBQUNkLGFBQU87QUFBQSxJQUNYO0FBQUEsSUFDQSxJQUFJLGdCQUFnQjtBQUNoQixhQUFPO0FBQUEsSUFDWDtBQUFBLElBQ0EsSUFBSSxnQkFBZ0I7QUFFaEIsYUFBTztBQUFBLElBQ1g7QUFBQSxJQUNBO0FBQUEsSUFDQSxJQUFJLFFBQVE7QUFDUixhQUFPLEtBQUssSUFBSSxNQUFNO0FBQUEsSUFDMUI7QUFBQSxJQUNBLFdBQVcsUUFBUSxjQUFjLE1BQU07QUFDbkMsWUFBTSxZQUFZLEtBQUssSUFBSSxNQUFNO0FBQ2pDLFVBQUksS0FBSyxPQUFPLE1BQU0sS0FBSyxhQUFhO0FBQ3BDLHNCQUFjLElBQUksTUFBTTtBQUFBLE1BQzVCO0FBQ0EsYUFBTyxhQUFhO0FBQUEsSUFDeEI7QUFBQSxJQUNBLGNBQWMsUUFBUSxhQUFhO0FBQy9CLFVBQUksS0FBSyxPQUFPLE1BQU0sS0FBSyxhQUFhO0FBQ3BDLHNCQUFjLElBQUksTUFBTTtBQUFBLE1BQzVCO0FBQUEsSUFDSjtBQUFBLElBQ0EsVUFBVSxRQUFRO0FBQ2QsWUFBTSxZQUFZLEtBQUssSUFBSSxNQUFNO0FBQ2pDLGFBQU8sWUFBWSxhQUFhLFNBQVMsSUFBSTtBQUFBLElBQ2pEO0FBQUEsSUFDQSxJQUFJLFFBQVE7QUFDUixZQUFNLFlBQVksS0FBSyxJQUFJLE1BQU07QUFDakMsVUFBSSxDQUFDLFdBQVc7QUFDWixjQUFNLElBQUksTUFBTSx1QkFBdUIsYUFBYSxnQkFBZ0IsTUFBTSxZQUFZO0FBQUEsTUFDMUY7QUFDQSxhQUFPLGFBQWEsU0FBUztBQUFBLElBQ2pDO0FBQUEsSUFDQSxPQUFPLFFBQVEsT0FBTztBQUNsQixZQUFNLFlBQVksS0FBSyxJQUFJLE1BQU07QUFDakMsVUFBSSxXQUFXO0FBQ1gsY0FBTSxJQUFJLE1BQU0sc0JBQXNCLGFBQWEsUUFBUSxNQUFNLGlCQUFpQjtBQUFBLE1BQ3RGO0FBQ0EsWUFBTSxZQUFZLFVBQVUsU0FBWSxPQUFPLE9BQU8sSUFBSSxPQUFPLFNBQVMsT0FBTyxPQUFPLEtBQUssSUFBSTtBQUNqRyxXQUFLLElBQUksUUFBUSxTQUFTO0FBQzFCLG9CQUFjLElBQUksTUFBTTtBQUN4QixhQUFPO0FBQUEsSUFDWDtBQUFBLElBQ0EsZ0JBQWdCLFFBQVEsT0FBTztBQUMzQixZQUFNLFlBQVksVUFBVSxTQUFZLE9BQU8sT0FBTyxJQUFJLE9BQU8sU0FBUyxPQUFPLE9BQU8sS0FBSyxJQUFJO0FBQ2pHLFdBQUssSUFBSSxRQUFRLFNBQVM7QUFDMUIsb0JBQWMsSUFBSSxNQUFNO0FBQ3hCLGFBQU87QUFBQSxJQUNYO0FBQUEsSUFDQSxpQkFBaUIsUUFBUTtBQUNyQixZQUFNLFlBQVksS0FBSyxJQUFJLE1BQU07QUFDakMsVUFBSSxDQUFDLFdBQVc7QUFDWixlQUFPO0FBQUEsTUFDWDtBQUNBLG9CQUFjLElBQUksTUFBTTtBQUN4QixhQUFPO0FBQUEsSUFDWDtBQUFBLElBQ0EsbUJBQW1CLFFBQVEsT0FBTztBQUM5QixZQUFNLFlBQVksS0FBSyxJQUFJLE1BQU07QUFDakMsVUFBSSxDQUFDLFdBQVc7QUFDWixlQUFPLEtBQUssT0FBTyxRQUFRLEtBQUs7QUFBQSxNQUNwQyxPQUNLO0FBQ0Qsc0JBQWMsSUFBSSxNQUFNO0FBQ3hCLGVBQU87QUFBQSxNQUNYO0FBQUEsSUFDSjtBQUFBLElBQ0EsV0FBVyxRQUFRO0FBQ2YsWUFBTSxZQUFZLEtBQUssaUJBQWlCLE1BQU07QUFDOUMsVUFBSSxjQUFjLE1BQU07QUFDcEIsY0FBTSxJQUFJLE1BQU0sdUJBQXVCLGFBQWEsUUFBUSxNQUFNLFlBQVk7QUFBQSxNQUNsRjtBQUNBLGFBQU87QUFBQSxJQUNYO0FBQUEsSUFDQSxDQUFDLFdBQVc7QUFDUixpQkFBVyxDQUFDLFFBQVEsU0FBUyxLQUFLLE1BQU07QUFDcEMsY0FBTSxDQUFDLFFBQVEsU0FBUztBQUFBLE1BQzVCO0FBQUEsSUFDSjtBQUFBLElBQ0EsQ0FBQyxnQkFBZ0I7QUFDYixpQkFBVyxVQUFVLGVBQWU7QUFDaEMsY0FBTTtBQUFBLE1BQ1Y7QUFBQSxJQUNKO0FBQUEsSUFDQSxnQkFBZ0IsNEJBQTRCLGFBQWEsWUFBWSxlQUFlLFFBQVEsSUFBSTtBQUFBLElBQ2hHLGdCQUFnQix3QkFBd0IsYUFBYSxZQUFZLFFBQVEsSUFBSTtBQUFBLElBQzdFLHVCQUF1Qiw4QkFBOEIsYUFBYSxZQUFZLFFBQVEsSUFBSTtBQUFBLEVBQzlGO0FBQ0o7OztBQ3pRTyxJQUFNLDJCQUEyQjtBQUNqQyxTQUFTLGtCQUFrQjtBQUM5QixRQUFNLFVBQVUsQ0FBQztBQUNqQixXQUFTLE9BQU87QUFHWixZQUFRLEtBQUssQ0FBQyxHQUFHLE1BQU0sRUFBRSxXQUFXLEVBQUUsUUFBUTtBQUFBLEVBQ2xEO0FBQ0EsV0FBU0UsS0FBSSxJQUFJQyxXQUFVLE1BQU07QUFDN0IsVUFBTSxhQUFhLFFBQVEsR0FBRztBQUM5QixRQUFJLFFBQVEsS0FBSyxDQUFDLFNBQVMsS0FBSyxPQUFPLEVBQUUsR0FBRztBQUN4QyxZQUFNLElBQUksTUFBTSxVQUFVLEtBQUssVUFBVSxVQUFVLENBQUMsOEJBQThCO0FBQUEsSUFDdEY7QUFDQSxZQUFRLEtBQUs7QUFBQSxNQUNUO0FBQUEsTUFDQSxVQUFBQTtBQUFBLE1BQ0EsTUFBTTtBQUFBLElBQ1YsQ0FBQztBQUVELFNBQUs7QUFBQSxFQUNUO0FBQ0EsV0FBUyxPQUFPLFVBQVU7QUFDdEIsUUFBSSxRQUFRO0FBQ1osUUFBSSxPQUFPLGFBQWEsVUFBVTtBQUM5QixjQUFRLFFBQVEsVUFBVSxDQUFDLFNBQVMsS0FBSyxTQUFTLFFBQVE7QUFBQSxJQUM5RCxPQUNLO0FBQ0QsY0FBUSxRQUFRLFVBQVUsQ0FBQyxTQUFTLEtBQUssT0FBTyxRQUFRO0FBQUEsSUFDNUQ7QUFDQSxRQUFJLFVBQVUsSUFBSTtBQUNkLGFBQU87QUFBQSxJQUNYO0FBQ0EsWUFBUSxPQUFPLE9BQU8sQ0FBQztBQUN2QixTQUFLO0FBQ0wsV0FBTztBQUFBLEVBQ1g7QUFDQSxTQUFPO0FBQUEsSUFDSCxLQUFBRDtBQUFBLElBQ0E7QUFBQSxJQUNBLGFBQWE7QUFDVCxhQUFPO0FBQUEsSUFDWDtBQUFBLEVBQ0o7QUFDSjs7O0FDeENBLElBQU0sbUJBQW1CLFVBQVUsb0JBQUksSUFBSSxDQUFDO0FBQzVDLFNBQVMsY0FBYztBQUNuQixRQUFNLElBQUksTUFBTSxtQkFBbUI7QUFDdkM7QUFDQSxTQUFTLFVBQVUsS0FBSztBQUNwQjtBQUNBLE1BQUksTUFBTTtBQUNWLE1BQUksUUFBUTtBQUNaLFNBQU87QUFDWDtBQUNBLFNBQVMsZ0JBQWdCLEdBQUcsR0FBRztBQUMzQixTQUFPLEVBQUUsWUFBWSxFQUFFLFlBQVksSUFBSTtBQUMzQztBQUlPLFNBQVMsNENBQTRDLGVBQWUsYUFBYSxRQUFRLFNBQVM7QUFDckcsUUFBTSxPQUFPLG9CQUFJLElBQUk7QUFDckIsUUFBTSxnQkFBZ0Isb0JBQUksSUFBSTtBQUM5QixRQUFNLGlCQUFpQixDQUFDO0FBRXhCLFdBQVMsV0FBVyxLQUFLO0FBQ3JCLFVBQU0sTUFBTSxJQUFJLElBQUk7QUFDcEIsUUFBSSxNQUFNLEtBQUssSUFBSSxJQUFJLE1BQU0sQ0FBQyxFQUFFLGFBQWEsSUFBSSxJQUFJLE1BQU0sQ0FBQyxFQUFFLFdBQVc7QUFDckUsYUFBTztBQUFBLElBQ1g7QUFDQSxXQUFPO0FBQUEsRUFDWDtBQUNBLFdBQVMsV0FBVyxRQUFRO0FBQ3hCLFVBQU0sTUFBTSxLQUFLLElBQUksTUFBTTtBQUUzQixRQUFJLEtBQUs7QUFDTCxVQUFJLFdBQVcsR0FBRyxHQUFHO0FBQ2pCLFlBQUksSUFBSSxLQUFLLGVBQWU7QUFBQSxNQUNoQztBQUNBLGFBQU8sSUFBSSxJQUFJLFNBQVMsUUFBUSxhQUFhO0FBQ3pDLFlBQUksSUFBSSxNQUFNO0FBQUEsTUFDbEI7QUFDQSxZQUFNLFlBQVksVUFBVSxJQUFJLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDakUsVUFBSSxZQUFZO0FBQ2hCLGFBQU87QUFBQSxJQUNYLE9BQ0s7QUFFRCxhQUFPO0FBQUEsSUFDWDtBQUFBLEVBQ0o7QUFDQSxXQUFTLE9BQU8sUUFBUSxPQUFPO0FBQzNCLFFBQUksTUFBTSxLQUFLLElBQUksTUFBTTtBQUN6QixRQUFJLENBQUMsS0FBSztBQUNOLFlBQU0sRUFBRSxLQUFLLENBQUMsR0FBRyxXQUFXLGlCQUFpQjtBQUM3QyxXQUFLLElBQUksUUFBUSxHQUFHO0FBQUEsSUFDeEI7QUFDQSxVQUFNLFlBQVksT0FBTyxTQUFTLE9BQU8sT0FBTyxLQUFLLElBQUk7QUFDekQsVUFBTSxZQUFZLFFBQVEsa0JBQWtCLFNBQVM7QUFDckQsUUFBSSxTQUFTO0FBR1QsYUFBTyxPQUFPLFNBQVM7QUFBQSxJQUMzQjtBQUNBLFFBQUksSUFBSSxLQUFLLEVBQUUsT0FBTyxXQUFXLFVBQVUsQ0FBQztBQUM1QyxXQUFPLEVBQUUsS0FBSyxXQUFXLE1BQU0sR0FBRyxPQUFPLFVBQVU7QUFBQSxFQUN2RDtBQUNBLFFBQU0sTUFBTTtBQUFBLElBQ1IsSUFBSSxjQUFjO0FBQ2QsYUFBTztBQUFBLElBQ1g7QUFBQSxJQUNBLElBQUksZ0JBQWdCO0FBQ2hCLGFBQU87QUFBQSxJQUNYO0FBQUEsSUFDQSxJQUFJLGdCQUFnQjtBQUVoQixhQUFPO0FBQUEsSUFDWDtBQUFBLElBQ0E7QUFBQSxJQUNBLElBQUksUUFBUTtBQUNSLGFBQU8sS0FBSyxJQUFJLE1BQU07QUFBQSxJQUMxQjtBQUFBLElBQ0EsY0FBYyxRQUFRO0FBQ2xCLFdBQUssT0FBTyxNQUFNO0FBQUEsSUFDdEI7QUFBQSxJQUNBLElBQUksUUFBUTtBQUNSLFlBQU0sU0FBUyxLQUFLLElBQUksTUFBTTtBQUM5QixVQUFJLFFBQVE7QUFDUixlQUFPLE9BQU87QUFBQSxNQUNsQixPQUNLO0FBQ0QsZUFBTztBQUFBLE1BQ1g7QUFBQSxJQUNKO0FBQUEsSUFDQSxTQUFTLFFBQVEsVUFBVTtBQUN2QixZQUFNLEVBQUUsS0FBSyxNQUFNLElBQUksT0FBTyxRQUFRLFFBQVE7QUFDOUMsb0JBQWMsSUFBSSxNQUFNO0FBQ3hCLFlBQU0sTUFBTSxJQUFJLG9CQUFvQjtBQUNwQyxhQUFPLFVBQVUsT0FBTyxHQUFHO0FBQzNCLHFCQUFlLEtBQUs7QUFBQSxRQUNoQjtBQUFBLFFBQ0EsTUFBTSxJQUFJLFNBQVM7QUFBQSxRQUNuQixVQUFVO0FBQUEsUUFDVixXQUFXO0FBQUEsUUFDWCxNQUFNLGdCQUFnQjtBQUFBLE1BQzFCLENBQUM7QUFDRCxhQUFPO0FBQUEsSUFDWDtBQUFBLElBQ0EsQ0FBQyxXQUFXO0FBQ1IsaUJBQVcsQ0FBQyxRQUFRLFNBQVMsS0FBSyxNQUFNO0FBQ3BDLGNBQU0sQ0FBQyxRQUFRLFVBQVUsU0FBUztBQUFBLE1BQ3RDO0FBQUEsSUFDSjtBQUFBLElBQ0EsQ0FBQyxnQkFBZ0I7QUFDYixpQkFBVyxVQUFVLGVBQWU7QUFDaEMsY0FBTTtBQUFBLE1BQ1Y7QUFBQSxJQUNKO0FBQUEsSUFDQSxpQkFBaUI7QUFFYixvQkFBYyxNQUFNO0FBQ3BCLGFBQU8sZUFBZSxPQUFPLEdBQUcsZUFBZSxNQUFNO0FBQUEsSUFDekQ7QUFBQSxJQUNBLGVBQWUsT0FBTztBQUNsQixVQUFJLE1BQU0sU0FBUyxnQkFBZ0IsY0FBYztBQUM3QyxjQUFNLE1BQU0sSUFBSSxvQkFBb0IsTUFBTSxJQUFJO0FBQzlDLGVBQU8sTUFBTSxVQUFVLE9BQU8sWUFBWSxHQUFHLENBQUM7QUFBQSxNQUNsRDtBQUNBLGFBQU8sQ0FBQyxNQUFNLE1BQVM7QUFBQSxJQUMzQjtBQUFBLElBQ0EsdUJBQXVCLFNBQVUsUUFBUSxjQUFjO0FBQ25ELGlCQUFXLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxLQUFLLE1BQU07QUFDbEMsWUFBSSxnQkFBZ0IsQ0FBQyxhQUFhLE1BQU07QUFDcEM7QUFDSixtQkFBVyxNQUFNLEtBQUs7QUFDbEIsZ0JBQU0sTUFBTSxJQUFJLG9CQUFvQjtBQUNwQyxpQkFBTyxVQUFVLEdBQUcsT0FBTyxHQUFHO0FBQzlCLCtCQUFxQixNQUFNLFFBQVEsR0FBRyxhQUFhLElBQUksU0FBUyxHQUFHLE1BQU07QUFBQSxRQUM3RTtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLFNBQU87QUFDWDs7O0FDN0lBLFVBQVUsY0FBYyxRQUFRLFVBQVU7QUFFdEMsTUFBSSxDQUFDLFNBQVMsSUFBSSxNQUFNO0FBQ3BCO0FBQ0osV0FBUyxPQUFPLE1BQU07QUFDdEIsYUFBVyxDQUFDLFNBQVMsS0FBSyxLQUFLLFVBQVU7QUFDckMsUUFBSSxNQUFNLFdBQVcsUUFBUTtBQUN6QixhQUFPLGNBQWMsU0FBUyxRQUFRO0FBQUEsSUFDMUM7QUFBQSxFQUNKO0FBQ0EsUUFBTTtBQUNWO0FBcUJPLFNBQVMsdUJBQXVCRSxTQUFRLFFBQVEsV0FBVztBQUM5RCxRQUFNLFdBQVcsSUFBSSxJQUFJQSxRQUFPLGdCQUFnQixTQUFTLENBQUM7QUFDMUQsU0FBTyxjQUFjLFFBQVEsUUFBUTtBQUN6QztBQUdBLFNBQVMsNkJBQTZCQSxTQUFRLFFBQVE7QUFDbEQsUUFBTUMsaUJBQTJCLGNBQWNELE9BQU07QUFDckQsUUFBTUUsaUJBQTJCLGNBQWNGLE9BQU07QUFFckQsRUFBQUEsUUFBTyxhQUFhLE1BQU07QUFFMUIsUUFBTSxVQUFVRSxlQUFjLFVBQVUsTUFBTTtBQUM5QyxNQUFJLFNBQVM7QUFDVCxlQUFXLENBQUMsUUFBUUMsT0FBTSxLQUFLSCxRQUFPLGdCQUFnQkMsY0FBYSxHQUFHO0FBQ2xFLFVBQUlFLFFBQU8sYUFBYSxRQUFRLFlBQVlBLFFBQU8sY0FBYyxRQUFRLFdBQVc7QUFDaEYscUNBQTZCSCxTQUFRLE1BQU07QUFBQSxNQUMvQztBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0E7QUFDSjtBQU9PLFNBQVMseUJBQXlCQSxTQUFRLFFBQVE7QUFDckQsUUFBTUksYUFBdUIsVUFBVUosT0FBTTtBQUM3QyxRQUFNRSxpQkFBMkIsY0FBY0YsT0FBTTtBQUVyRCxNQUFJRSxlQUFjLElBQUksTUFBTSxHQUFHO0FBQzNCLFdBQU8sNkJBQTZCRixTQUFRLE1BQU07QUFBQSxFQUN0RDtBQUNBLGFBQVcsT0FBTyx1QkFBdUJBLFNBQVEsUUFBUUksVUFBUyxHQUFHO0FBQ2pFLElBQUFKLFFBQU8sYUFBYSxHQUFHO0FBQUEsRUFDM0I7QUFDSjs7O0FDdEVBLElBQU0sZ0JBQWdCO0FBQUEsRUFDbEI7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQTtBQUNKO0FBQ0EsSUFBTSxpQ0FBaUMsS0FBSztBQUlyQyxTQUFTLGtCQUFrQkssU0FBUTtBQUN0QyxRQUFNQyx1QkFBaUMsb0JBQW9CRCxPQUFNO0FBQ2pFLFFBQU0sY0FBYztBQUFBLElBQ2hCLDJCQUEyQjtBQUFBLElBQzNCLDBCQUEwQjtBQUFBLElBQzFCLGFBQWEsb0JBQUksSUFBSTtBQUFBLElBQ3JCLG1CQUFtQixDQUFDO0FBQUEsRUFDeEI7QUFDQSxXQUFTLGVBQWUsa0JBQWtCLGFBQWEsUUFBUTtBQUMzRCxVQUFNLDZCQUE2QkMscUJBQW9CLElBQUksTUFBTTtBQUNqRSxlQUFXLFdBQVcsTUFBTSxLQUFLLDBCQUEwQixFQUFFLFFBQVEsR0FBRztBQUNwRSxVQUFJLFFBQVEsV0FBVyxlQUFlLFFBQVEsVUFBVSxrQkFBa0I7QUFDdEUsZUFBTztBQUFBLE1BQ1g7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLFlBQVUsK0JBQStCLGFBQWEsUUFBUTtBQUMxRCxVQUFNLDZCQUE2QkEscUJBQW9CLElBQUksTUFBTTtBQUNqRSxlQUFXLFdBQVcsTUFBTSxLQUFLLDBCQUEwQixFQUFFLFFBQVEsR0FBRztBQUNwRSxVQUFJLFFBQVEsV0FBVyxhQUFhO0FBQ2hDLGNBQU07QUFBQSxNQUNWO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFDQSxXQUFTLDBCQUEwQjtBQUUvQixRQUFJLGVBQWUsWUFBWTtBQUMvQixnQkFBWSw0QkFBNEI7QUFDeEMsUUFBSSxZQUFZLGtCQUFrQixRQUFRO0FBQ3RDLGtCQUFZLG9CQUFvQixDQUFDO0FBQUEsSUFDckM7QUFFQSxlQUFXLENBQUMsRUFBRSxRQUFRLEtBQUtELFFBQU8sZ0JBQWdCQyxvQkFBbUIsR0FBRztBQUVwRSxZQUFNLGdCQUFnQixNQUFNLEtBQUssUUFBUTtBQUN6QyxlQUFTLElBQUksY0FBYyxTQUFTLEdBQUcsS0FBSyxHQUFHLEtBQUs7QUFDaEQsY0FBTSxVQUFVLGNBQWMsQ0FBQztBQUMvQixZQUFJLFFBQVEsWUFBWSxjQUFjO0FBQ2xDLHlCQUFlLFFBQVE7QUFBQSxRQUMzQjtBQUNBLFlBQUksUUFBUSxZQUFZLFlBQVksMkJBQTJCO0FBQzNELHNCQUFZLGtCQUFrQixLQUFLLE9BQU87QUFBQSxRQUM5QztBQUNBLFlBQUksUUFBUSxVQUFVLEtBQW1DLFFBQVEsVUFBVSxHQUFtQztBQUMxRyxnQkFBTSxjQUFjLFlBQVksWUFBWSxJQUFJLFFBQVEsTUFBTTtBQUM5RCxjQUFJLENBQUMsZUFBZSxRQUFRLFlBQVksWUFBWSxXQUFXO0FBQzNELHdCQUFZLFlBQVksSUFBSSxRQUFRLFFBQVEsT0FBTztBQUFBLFVBQ3ZELE9BQ0s7QUFHRDtBQUFBLFVBQ0o7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFFQSxnQkFBWSwyQkFBMkI7QUFBQSxFQUMzQztBQUNBLEVBQUFELFFBQU8sVUFBVSx5QkFBeUIsZ0NBQWdDLHNCQUFzQjtBQUNoRyxXQUFTLHdCQUF3QixXQUFXO0FBQ3hDLFFBQUksWUFBWSxZQUFZLDZCQUE2QixhQUFhLFlBQVksMEJBQTBCO0FBQ3hHLGFBQU87QUFBQSxJQUNYLE9BQ0s7QUFDRCxhQUFPO0FBQUEsSUFDWDtBQUFBLEVBQ0o7QUFDQSxXQUFTLFNBQVMsYUFBYSxRQUFRO0FBQ25DLFFBQUksZ0JBQWdCLEdBQTRCO0FBQzVDLGFBQU8sVUFBVSxhQUFhLE1BQU07QUFBQSxJQUN4QztBQUNBLGVBQVcsU0FBUyxlQUFlO0FBQy9CLFlBQU0sTUFBTSxVQUFVLE9BQU8sTUFBTTtBQUNuQyxVQUFJO0FBQ0EsZUFBTztBQUFBLElBQ2Y7QUFDQSxXQUFPO0FBQUEsRUFDWDtBQUNBLFdBQVMsVUFBVSxhQUFhLFFBQVE7QUFDcEMsUUFBSSxPQUFPO0FBQ1gsUUFBSSxLQUFLO0FBRVQsZUFBVyxNQUFNLCtCQUErQixhQUFhLE1BQU0sR0FBRztBQUNsRSxVQUFJLENBQUMsSUFBSTtBQUNMLFlBQUksR0FBRyxVQUFVLEdBQWlDO0FBQzlDLGVBQUs7QUFDTDtBQUFBLFFBQ0o7QUFBQSxNQUNKLFdBQ1MsQ0FBQyxNQUFNO0FBQ1osWUFBSSxHQUFHLFVBQVUsR0FBbUM7QUFDaEQsaUJBQU87QUFDUDtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUNBLFFBQUksQ0FBQyxNQUFNLENBQUM7QUFDUixhQUFPO0FBRVgsUUFBSSxLQUFLLFlBQVksR0FBRyxhQUFhLHdCQUF3QixHQUFHLFNBQVMsR0FBRztBQUN4RSxhQUFPLEVBQUUsSUFBSSxLQUFLO0FBQUEsSUFDdEI7QUFDQSxXQUFPO0FBQUEsRUFDWDtBQUNBLFdBQVMsMEJBQTBCLGFBQWEsa0JBQWtCLFFBQVE7QUFDdEUsUUFBSSxnQkFBZ0IsR0FBNEI7QUFDNUMsYUFBTyxpQkFBaUIsYUFBYSxrQkFBa0IsTUFBTTtBQUFBLElBQ2pFO0FBQ0EsZUFBVyxTQUFTLGVBQWU7QUFDL0IsWUFBTSxNQUFNLGlCQUFpQixPQUFPLGtCQUFrQixNQUFNO0FBQzVELFVBQUk7QUFDQSxlQUFPO0FBQUEsSUFDZjtBQUNBLFdBQU87QUFBQSxFQUNYO0FBQ0EsV0FBUyxnQkFBZ0IsYUFBYSxrQkFBa0IsUUFBUTtBQUM1RCxRQUFJLFFBQVE7QUFDUixhQUFPLDBCQUEwQixhQUFhLGtCQUFrQixNQUFNO0FBQUEsSUFDMUUsT0FDSztBQUNELGlCQUFXLFdBQVcsWUFBWSxtQkFBbUI7QUFDakQsYUFBSyxRQUFRLFdBQVcsZUFBZSxnQkFBZ0IsTUFDbkQsUUFBUSxVQUFVLGtCQUFrQjtBQUNwQyxpQkFBTztBQUFBLFFBQ1g7QUFBQSxNQUNKO0FBQ0EsYUFBTztBQUFBLElBQ1g7QUFBQSxFQUNKO0FBQ0EsV0FBUyxpQkFBaUIsYUFBYSxrQkFBa0IsUUFBUTtBQUU3RCxVQUFNLFVBQVUsZUFBZSxrQkFBa0IsYUFBYSxNQUFNO0FBQ3BFLFFBQUksQ0FBQztBQUNELGFBQU87QUFDWCxRQUFJLHdCQUF3QixRQUFRLFNBQVMsR0FBRztBQUM1QyxhQUFPO0FBQUEsSUFDWCxPQUNLO0FBQ0QsYUFBTztBQUFBLElBQ1g7QUFBQSxFQUNKO0FBRUEsV0FBUyxVQUFVLGFBQWEsUUFBUTtBQUNwQyxXQUFPLFNBQVMsYUFBYSxNQUFNLE1BQU07QUFBQSxFQUM3QztBQUVBLFdBQVMsWUFBWSxhQUFhLGtCQUFrQixRQUFRO0FBQ3hELFFBQUksUUFBUTtBQUNSLFlBQU0sVUFBVSxlQUFlLGtCQUFrQixhQUFhLE1BQU07QUFDcEUsYUFBUSxXQUFXLHdCQUF3QixRQUFRLFNBQVMsS0FBTTtBQUFBLElBQ3RFLE9BQ0s7QUFDRCxpQkFBVyxXQUFXLFlBQVksbUJBQW1CO0FBQ2pELGFBQUssUUFBUSxXQUFXLGVBQWUsZ0JBQWdCLE1BQ25ELFFBQVEsVUFBVSxrQkFBa0I7QUFDcEMsaUJBQU87QUFBQSxRQUNYO0FBQUEsTUFDSjtBQUNBLGFBQU87QUFBQSxJQUNYO0FBQUEsRUFDSjtBQUVBLFdBQVMsVUFBVSxhQUFhO0FBQzVCLFdBQU8sWUFBWSxZQUFZLElBQUksV0FBVyxHQUFHLFVBQVU7QUFBQSxFQUMvRDtBQUNBLFNBQU87QUFBQSxJQUNIO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0o7QUFDSjs7O0FDN0xPLElBQUk7QUFBQSxDQUNWLFNBQVVFLGdCQUFlO0FBQ3RCLEVBQUFBLGVBQWNBLGVBQWMsd0JBQXdCLElBQUksQ0FBQyxJQUFJO0FBQzdELEVBQUFBLGVBQWNBLGVBQWMsa0JBQWtCLElBQUksQ0FBQyxJQUFJO0FBQzNELEdBQUcsa0JBQWtCLGdCQUFnQixDQUFDLEVBQUU7OztBQ0t4QyxTQUFTLFlBQVk7QUFDakIsUUFBTSxrQkFBa0IsZ0JBQWdCO0FBQ3hDLFFBQU0sdUJBQXVCLG9CQUFJLElBQUk7QUFDckMsUUFBTSxVQUFVLGdCQUFnQjtBQUNoQyxNQUFJLFNBQVM7QUFDYixXQUFTLFVBQVUsSUFBSUMsWUFBVywwQkFBMEIsTUFBTTtBQUM5RCxZQUFRLElBQUksSUFBSUEsV0FBVSxJQUFJO0FBQUEsRUFDbEM7QUFDQSxXQUFTLGFBQWEsVUFBVTtBQUM1QixXQUFPLFFBQVEsT0FBTyxRQUFRO0FBQUEsRUFDbEM7QUFDQSxXQUFTLFlBQVk7QUFDakIsVUFBTSxTQUFTLGdCQUFnQixlQUFlO0FBQzlDLFdBQU87QUFBQSxFQUNYO0FBQ0EsV0FBUyxhQUFhLFFBQVE7QUFDMUIsZUFBVyxDQUFDLEVBQUUsU0FBUyxLQUFLLHNCQUFzQjtBQUc5QyxVQUFJLFVBQVUsa0JBQWtCO0FBQzVCO0FBQ0osZ0JBQVUsY0FBYyxRQUFRLElBQUk7QUFBQSxJQUN4QztBQUNBLFdBQU8sZ0JBQWdCLGFBQWEsTUFBTTtBQUFBLEVBQzlDO0FBQ0EsV0FBU0MsMEJBQXlCLFFBQVE7QUFDdEMsV0FBTyx5QkFBK0IsRUFBRSxjQUFjLDJCQUEyQixpQkFBaUIsZ0JBQWdCLEdBQUcsTUFBTTtBQUFBLEVBQy9IO0FBQ0EsV0FBUyw0QkFBNEIsZUFBZSxXQUFXO0FBRTNELFFBQUk7QUFDQSxZQUFNLElBQUksTUFBTSxvRUFBb0U7QUFDeEYsVUFBTSxjQUFjLHdCQUF3QixhQUFhO0FBQ3pELFVBQU0sT0FBTyxxQkFBcUIsSUFBSSxXQUFXO0FBQ2pELFFBQUksTUFBTTtBQUNOLFlBQU0sSUFBSSxNQUFNLG9CQUFvQixXQUFXLDBCQUEwQjtBQUFBLElBQzdFO0FBRUEsUUFBSSxVQUFVLGtCQUFrQixlQUFlO0FBQzNDLFlBQU0sSUFBSSxNQUFNLGtFQUFrRSxhQUFhLE9BQU8sVUFBVSxhQUFhLEVBQUU7QUFBQSxJQUNuSTtBQUVBLFFBQUksVUFBVSxnQkFBZ0IsYUFBYTtBQUN2QyxZQUFNLElBQUksTUFBTSxrRUFBa0UsV0FBVyxPQUFPLFVBQVUsV0FBVyxFQUFFO0FBQUEsSUFDL0g7QUFDQSx5QkFBcUIsSUFBSSxhQUFhLFNBQVM7QUFDL0MsV0FBTztBQUFBLEVBQ1g7QUFDQSxXQUFTLDBCQUEwQixlQUFlLFFBQVE7QUFDdEQsVUFBTSxjQUFjLHdCQUF3QixhQUFhO0FBQ3pELFVBQU0sT0FBTyxxQkFBcUIsSUFBSSxXQUFXO0FBQ2pELFFBQUksTUFBTTtBQUVOLGFBQU87QUFBQSxJQUNYO0FBRUEsUUFBSTtBQUNBLFlBQU0sSUFBSSxNQUFNLG9FQUFvRTtBQUN4RixVQUFNLGVBQWUsb0NBQW9DLGVBQWUsYUFBYSxNQUFNO0FBQzNGLHlCQUFxQixJQUFJLGFBQWEsWUFBWTtBQUNsRCxXQUFPO0FBQUEsRUFDWDtBQUNBLFdBQVMsa0NBQWtDLGVBQWUsUUFBUSxTQUFTO0FBQ3ZFLFVBQU0sY0FBYyx3QkFBd0IsYUFBYTtBQUN6RCxVQUFNLE9BQU8scUJBQXFCLElBQUksV0FBVztBQUNqRCxRQUFJLE1BQU07QUFFTixhQUFPO0FBQUEsSUFDWDtBQUVBLFFBQUk7QUFDQSxZQUFNLElBQUksTUFBTSxvRUFBb0U7QUFDeEYsVUFBTSxlQUFlLDRDQUE0QyxlQUFlLGFBQWEsUUFBUSxPQUFPO0FBQzVHLHlCQUFxQixJQUFJLGFBQWEsWUFBWTtBQUNsRCxXQUFPO0FBQUEsRUFDWDtBQUNBLFdBQVMsZ0JBQWdCLGVBQWUsU0FBUyxvQkFBb0I7QUFDakUsVUFBTSxjQUFjLHdCQUF3QixhQUFhO0FBQ3pELFVBQU0sT0FBTyxxQkFBcUIsSUFBSSxXQUFXO0FBQ2pELFFBQUksTUFBTTtBQUVOLGFBQU87QUFBQSxJQUNYO0FBQ0EsUUFBSTtBQUNBLFlBQU0sSUFBSSxNQUFNLG9FQUFvRTtBQUN4RixVQUFNLGFBQWEsUUFBUSxJQUFJLFNBQVMsa0JBQWtCO0FBQzFELFVBQU0sTUFBTSxvQ0FBb0MsZUFBZSxhQUFhLFVBQVU7QUFDdEYsVUFBTSxlQUFlO0FBQUEsTUFDakIsR0FBRztBQUFBLE1BQ0gsT0FBTyxRQUFRLEtBQUs7QUFDaEIsZUFBTyxJQUFJLE9BQU8sUUFBUSxHQUFHO0FBQUEsTUFDakM7QUFBQSxNQUNBLGdCQUFnQixRQUFRLEtBQUs7QUFDekIsZUFBTyxJQUFJLGdCQUFnQixRQUFRLEdBQUc7QUFBQSxNQUMxQztBQUFBLElBQ0o7QUFDQSx5QkFBcUIsSUFBSSxhQUFhLFlBQVk7QUFDbEQsV0FBTztBQUFBLEVBQ1g7QUFDQSxXQUFTQyxjQUFhLG1CQUFtQjtBQUNyQyxVQUFNLGNBQWMsT0FBTyxzQkFBc0IsV0FBVyxvQkFBb0Isd0JBQXdCLGlCQUFpQjtBQUN6SCxVQUFNLFlBQVkscUJBQXFCLElBQUksV0FBVztBQUN0RCxRQUFJLENBQUMsV0FBVztBQUNaLFlBQU0sSUFBSSxNQUFNLGFBQWEsaUJBQWlCLDBGQUEwRjtBQUFBLElBQzVJO0FBQ0EsV0FBTztBQUFBLEVBQ1g7QUFDQSxXQUFTLG1CQUFtQixtQkFBbUI7QUFDM0MsVUFBTSxjQUFjLE9BQU8sc0JBQXNCLFdBQVcsb0JBQW9CLHdCQUF3QixpQkFBaUI7QUFDekgsV0FBUSxxQkFBcUIsSUFBSSxXQUFXO0FBQUEsSUFFeEM7QUFBQSxFQUNSO0FBQ0EsWUFBVSxtQkFBbUIsWUFBWTtBQUNyQyxlQUFXLENBQUMsUUFBUSxHQUFHLFNBQVMsS0FBSyxxQkFBcUIsR0FBRyxVQUFVLEdBQUc7QUFDdEUsWUFBTSxDQUFDLFFBQVEsR0FBRyxVQUFVLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxNQUFNLENBQUMsQ0FBQztBQUFBLElBQ3pEO0FBQUEsRUFDSjtBQUNBLFdBQVMsc0JBQXNCLE9BQU87QUFDbEMsVUFBTSxpQkFBNEIsS0FBSyxFQUFFLGdCQUFnQixDQUFDO0FBQzFELGVBQVcsQ0FBQyxRQUFRLElBQUksS0FBSyxnQkFBZ0IsY0FBYyxHQUFHO0FBQzFELFVBQUksS0FBSyxVQUFVO0FBQ2YsZUFBTztBQUFBLElBQ2Y7QUFDQSxXQUFPO0FBQUEsRUFDWDtBQUNBLFlBQVUsd0JBQXdCLE1BQU07QUFDcEMsVUFBTSxDQUFDLG1CQUFtQixHQUFHLG9CQUFvQixJQUFJO0FBQ3JELGVBQVcsQ0FBQyxNQUFNLEtBQUssa0JBQWtCLFNBQVMsR0FBRztBQUNqRCxVQUFJLFVBQVU7QUFDZCxpQkFBVyxnQkFBZ0Isc0JBQXNCO0FBQzdDLFlBQUksQ0FBQyxhQUFhLElBQUksTUFBTSxHQUFHO0FBQzNCLG9CQUFVO0FBQ1Y7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUNBLFVBQUksU0FBUztBQUNULGNBQU0sQ0FBQyxRQUFRLEdBQUcsSUFBSTtBQUFBLE1BQzFCO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFDQSxXQUFTLGFBQWE7QUFDbEIsV0FBTyxRQUFRLFdBQVc7QUFBQSxFQUM5QjtBQUNBLFdBQVMsaUJBQWlCO0FBQ3RCLFdBQU8scUJBQXFCLE9BQU87QUFBQSxFQUN2QztBQUNBLFdBQVMsMEJBQTBCLG1CQUFtQjtBQUNsRCxRQUFJO0FBQ0EsWUFBTSxJQUFJLE1BQU0sc0VBQXNFO0FBQzFGLFVBQU0sY0FBYyxPQUFPLHNCQUFzQixXQUFXLG9CQUFvQix3QkFBd0IsaUJBQWlCO0FBQ3pILHlCQUFxQixPQUFPLFdBQVc7QUFBQSxFQUMzQztBQUNBLEVBQVcsVUFBVSxFQUFFLDBCQUEwQixDQUFDO0FBQ2xELFdBQVMsT0FBTztBQUNaLFFBQUksQ0FBQyxRQUFRO0FBQ1QsZUFBUztBQUFBLElBQ2I7QUFBQSxFQUNKO0FBQ0EsU0FBTztBQUFBLElBQ0g7QUFBQSxJQUNBO0FBQUEsSUFDQSwwQkFBQUQ7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQSxjQUFBQztBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNKO0FBQ0o7QUFNTyxTQUFTLE9BQU8sU0FBUztBQUM1QixRQUFNLGdCQUFnQixVQUFVO0FBQ2hDLFFBQU0sYUFBYSxnQkFBZ0IsZUFBZSxTQUFTLG9CQUFvQixJQUFJO0FBQ25GLGlCQUFlLE9BQU8sSUFBSTtBQUN0QixVQUFNLFdBQVcsZ0JBQWdCO0FBQ2pDLGVBQVcsVUFBVSxjQUFjLFdBQVcsR0FBRztBQUM3QyxZQUFNLE1BQU0sT0FBTyxHQUFHLEVBQUU7QUFDeEIsdUJBQWlCLEtBQUssYUFBYSxPQUFPLFFBQVEsV0FBVywwR0FBMEc7QUFBQSxJQUMzSztBQUVBLFVBQU0saUJBQWlCLGNBQWMsZ0JBQWdCLHVCQUF1QjtBQUM1RSxVQUFNLFdBQVcsYUFBYSxjQUFjO0FBQUEsRUFDaEQ7QUFDQSxTQUFPO0FBQUEsSUFDSCxXQUFXLGNBQWM7QUFBQSxJQUN6QixjQUFjLGNBQWM7QUFBQSxJQUM1QiwwQkFBMEIsY0FBYztBQUFBLElBQ3hDLFdBQVcsY0FBYztBQUFBLElBQ3pCLGNBQWMsY0FBYztBQUFBLElBQzVCLGlCQUFpQixjQUFjO0FBQUEsSUFDL0IsMkJBQTJCLGNBQWM7QUFBQSxJQUN6QyxtQ0FBbUMsY0FBYztBQUFBLElBQ2pELDZCQUE2QixjQUFjO0FBQUEsSUFDM0MsaUJBQWlCLGNBQWM7QUFBQSxJQUMvQixjQUFjLGNBQWM7QUFBQSxJQUM1QixvQkFBb0IsY0FBYztBQUFBLElBQ2xDLDJCQUEyQixjQUFjO0FBQUEsSUFDekMsZ0JBQWdCLGNBQWM7QUFBQSxJQUM5QixNQUFNLGNBQWM7QUFBQSxJQUNwQix1QkFBdUIsY0FBYztBQUFBLElBQ3JDO0FBQUEsSUFDQSxZQUFZO0FBQUEsSUFDWixjQUFjO0FBQUEsSUFDZCxjQUFjO0FBQUEsSUFDZCxnQkFBZ0IsY0FBYyxnQkFBZ0I7QUFBQSxJQUM5QyxjQUFjLFdBQVc7QUFBQSxJQUN6QixpQkFBaUIsY0FBYztBQUFBLEVBQ25DO0FBQ0o7OztBQzVPQSxTQUFTLFlBQVksT0FBTztBQUN4QixRQUFNLG9CQUFvQixNQUFNLEtBQUssS0FBSztBQUMxQyxRQUFNLFNBQVM7QUFDZixTQUFPO0FBQ1g7QUFJTyxTQUFTLGlCQUFpQkMsU0FBUTtBQUNyQyxRQUFNLFFBQVEsQ0FBQztBQUNmLGlCQUFlLFFBQVEsTUFBTTtBQUN6QixRQUFJO0FBQ0EsWUFBTSxPQUFPLE1BQU0sS0FBSztBQUN4QixhQUFPO0FBQUEsSUFDWCxTQUNPLEdBQUc7QUFDTixjQUFRLE1BQU0sQ0FBQztBQUFBLElBQ25CO0FBQUEsRUFDSjtBQUNBLFdBQVMsZUFBZTtBQUNwQixlQUFXLFFBQVEsWUFBWSxLQUFLLEdBQUc7QUFDbkMsY0FBUSxJQUFJLEVBQUUsTUFBTSxRQUFRLEtBQUs7QUFBQSxJQUNyQztBQUFBLEVBQ0o7QUFDQSxFQUFBQSxRQUFPLFVBQVUsWUFBWTtBQUM3QixTQUFPLFNBQVUsTUFBTTtBQUNuQixVQUFNLEtBQUssSUFBSTtBQUFBLEVBQ25CO0FBQ0o7OztBQ3RCTyxTQUFTLDBCQUEwQkMsU0FBUUMsY0FBYTtBQUMzRCxRQUFNQyxpQkFBMkIsY0FBY0YsT0FBTTtBQUNyRCxNQUFJO0FBQ0osR0FBQyxTQUFVRyxZQUFXO0FBQ2xCLElBQUFBLFdBQVVBLFdBQVUsT0FBTyxJQUFJLENBQUMsSUFBSTtBQUNwQyxJQUFBQSxXQUFVQSxXQUFVLE1BQU0sSUFBSSxDQUFDLElBQUk7QUFDbkMsSUFBQUEsV0FBVUEsV0FBVSxJQUFJLElBQUksQ0FBQyxJQUFJO0FBQUEsRUFDckMsR0FBRyxjQUFjLFlBQVksQ0FBQyxFQUFFO0FBQ2hDLFFBQU0saUJBQWlCLENBQUMsT0FBTyxDQUFDLE9BQU87QUFBQSxJQUNuQyxRQUFRO0FBQUEsSUFDUixHQUFHO0FBQUEsRUFDUDtBQUNBLFFBQU0sWUFBWSxvQkFBSSxJQUFJO0FBQzFCLFdBQVMsU0FBUyxRQUFRO0FBQ3RCLFdBQU8sVUFBVSxJQUFJLE1BQU0sS0FBSyxVQUFVLElBQUksUUFBUSxvQkFBSSxJQUFJLENBQUMsRUFBRSxJQUFJLE1BQU07QUFBQSxFQUMvRTtBQUNBLFdBQVMsZ0JBQWdCLFFBQVEsTUFBTSxNQUFNO0FBQ3pDLFFBQUksS0FBSyxhQUFhLEtBQUssY0FBYztBQUNyQyxZQUFNLGVBQWVELGVBQWMsaUJBQWlCLE1BQU0sS0FBS0EsZUFBYyxPQUFPLE1BQU07QUFDMUYsbUJBQWEsY0FBYyxLQUFLO0FBQUEsUUFDNUIsV0FBVztBQUFBLFFBQ1gsV0FBVztBQUFBLFVBQ1AsUUFBUSxLQUFLO0FBQUEsVUFDYixjQUFjLEtBQUs7QUFBQSxVQUNuQixXQUFXLEtBQUs7QUFBQSxVQUNoQixhQUFhLEtBQUs7QUFBQSxRQUN0QjtBQUFBLE1BQ0osQ0FBQztBQUFBLElBQ0w7QUFBQSxFQUNKO0FBQ0EsV0FBUyxtQkFBbUIsUUFBUSxNQUFNLFFBQVE7QUFDOUMsVUFBTSxlQUFlQSxlQUFjLGlCQUFpQixNQUFNO0FBQzFELFFBQUksQ0FBQztBQUNEO0FBQ0osaUJBQWEsZ0JBQWdCLGFBQWEsY0FBYyxPQUFPLENBQUMsWUFBWSxFQUFFLFFBQVEsV0FBVyxXQUFXLFVBQVUsUUFBUSxjQUFjLEtBQUs7QUFBQSxFQUNySjtBQUNBLFdBQVMsZ0JBQWdCLFdBQVc7QUFDaEMsUUFBSSxjQUFjLFVBQVUsSUFBSTtBQUM1QixhQUFPO0FBQUEsSUFDWDtBQUNBLFdBQU87QUFBQSxFQUNYO0FBQ0EsV0FBUyxZQUFZLFFBQVEsTUFBTTtBQUMvQixVQUFNLFFBQVEsU0FBUyxNQUFNO0FBQzdCLFVBQU0sZUFBZSxNQUFNLElBQUksSUFBSTtBQUNuQyxRQUFJLGNBQWMsS0FBSyxXQUFXO0FBQzlCLHlCQUFtQixRQUFRLGdCQUFnQixJQUFJLEdBQUcsYUFBYSxLQUFLLE1BQU07QUFBQSxJQUM5RTtBQUNBLFVBQU0sT0FBTyxJQUFJO0FBQUEsRUFDckI7QUFFQSxFQUFBRixRQUFPLFVBQVUsU0FBUyxjQUFjO0FBQ3BDLGVBQVcsQ0FBQyxRQUFRLEtBQUssS0FBSyxXQUFXO0FBQ3JDLFVBQUlBLFFBQU8sZUFBZSxNQUFNLE1BQU0sWUFBWSxTQUFTO0FBQ3ZELGtCQUFVLE9BQU8sTUFBTTtBQUN2QjtBQUFBLE1BQ0o7QUFDQSxpQkFBVyxDQUFDLFdBQVcsRUFBRSxJQUFJLEtBQUssQ0FBQyxLQUFLLE9BQU87QUFDM0MsWUFBSSxjQUFjLFVBQVUsT0FBTztBQUMvQixnQkFBTSxVQUFVQyxhQUFZLFNBQVMsS0FBSyxRQUFRLE1BQU07QUFDeEQsY0FBSTtBQUNBLDZCQUFpQixHQUFHLFFBQVEsRUFBRSxHQUFHLHlFQUF5RTtBQUFBLFFBQ2xIO0FBQ0EsWUFBSSxjQUFjLFVBQVUsUUFBUSxjQUFjLFVBQVUsSUFBSTtBQUM1RCxnQkFBTSxVQUFVQSxhQUFZLGdCQUFnQixLQUFLLFFBQVEsZ0JBQWdCLFNBQVMsR0FBRyxNQUFNO0FBQzNGLGNBQUksU0FBUztBQUNULDZCQUFpQixHQUFHLE9BQU8sR0FBRywyRUFBMkU7QUFBQSxVQUM3RztBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUFBLEVBQ0osQ0FBQztBQUNELFFBQU0sZ0JBQWdCLElBQUksU0FBUztBQUMvQixVQUFNLENBQUMsTUFBTSxJQUFJLFNBQVMsSUFBSTtBQUM5QixRQUFJLE9BQU8sU0FBUyxVQUFVO0FBQzFCLGFBQU8sY0FBYyxFQUFFLFFBQVEsTUFBTSxNQUFNLGFBQWEsQ0FBQyxFQUFFLEdBQUcsRUFBRTtBQUFBLElBQ3BFO0FBQ0EsVUFBTSxFQUFFLFFBQVEsS0FBSyxJQUFJO0FBQ3pCLFVBQU0sVUFBVSxlQUFlLElBQUk7QUFDbkMsZ0JBQVksUUFBUSxVQUFVLElBQUk7QUFDbEMsYUFBUyxNQUFNLEVBQUUsSUFBSSxVQUFVLE1BQU0sRUFBRSxJQUFJLE1BQU0sUUFBUSxDQUFDO0FBQzFELG9CQUFnQixRQUFRLEdBQW1DLE9BQU87QUFBQSxFQUN0RTtBQUNBLFFBQU0sY0FBYyxJQUFJLFNBQVM7QUFDN0IsVUFBTSxDQUFDLE1BQU0sSUFBSSxTQUFTLElBQUk7QUFDOUIsUUFBSSxPQUFPLFNBQVMsVUFBVTtBQUMxQixhQUFPLFlBQVksRUFBRSxRQUFRLE1BQU0sTUFBTSxhQUFhLENBQUMsRUFBRSxHQUFHLEVBQUU7QUFBQSxJQUNsRTtBQUNBLFVBQU0sRUFBRSxRQUFRLEtBQUssSUFBSTtBQUN6QixVQUFNLFVBQVUsZUFBZSxJQUFJO0FBQ25DLGdCQUFZLFFBQVEsVUFBVSxFQUFFO0FBQ2hDLGFBQVMsTUFBTSxFQUFFLElBQUksVUFBVSxJQUFJLEVBQUUsSUFBSSxNQUFNLFFBQVEsQ0FBQztBQUN4RCxvQkFBZ0IsUUFBUSxHQUFpQyxPQUFPO0FBQUEsRUFDcEU7QUFDQSxTQUFPO0FBQUEsSUFDSCxjQUFjLFFBQVE7QUFDbEIsa0JBQVksUUFBUSxVQUFVLEtBQUs7QUFBQSxJQUN2QztBQUFBLElBQ0Esb0JBQW9CLFFBQVE7QUFDeEIsa0JBQVksUUFBUSxVQUFVLElBQUk7QUFBQSxJQUN0QztBQUFBLElBQ0Esa0JBQWtCLFFBQVE7QUFDdEIsa0JBQVksUUFBUSxVQUFVLEVBQUU7QUFBQSxJQUNwQztBQUFBLElBQ0EsUUFBUSxPQUFPLElBQUk7QUFDZixZQUFNLEVBQUUsT0FBTyxJQUFJO0FBQ25CLFlBQU0sVUFBVSxlQUFlLE1BQU0sSUFBSTtBQUV6QyxrQkFBWSxRQUFRLFVBQVUsS0FBSztBQUVuQyxlQUFTLE1BQU0sRUFBRSxJQUFJLFVBQVUsT0FBTyxFQUFFLElBQUksTUFBTSxRQUFRLENBQUM7QUFDM0Qsc0JBQWdCLFFBQVEsR0FBbUMsT0FBTztBQUFBLElBQ3RFO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNKO0FBQ0o7OztBQ25ITyxTQUFTLGtCQUFrQkcsU0FBUTtBQUN0QyxRQUFNQyxTQUFtQkEsT0FBTUQsT0FBTTtBQUNyQyxRQUFNRSxjQUF3QixXQUFXRixPQUFNO0FBQy9DLFFBQU1HLGlCQUEyQixjQUFjSCxPQUFNO0FBQ3JELFFBQU0sUUFBUSxvQkFBSSxJQUFJO0FBQ3RCLFdBQVMsWUFBWSxRQUFRO0FBQ3pCLFVBQU0sYUFBYUUsWUFBVyxVQUFVLE1BQU07QUFDOUMsVUFBTSxRQUFRRCxPQUFNLFVBQVUsTUFBTTtBQUNwQyxVQUFNLGFBQWEsTUFBTSxJQUFJLE1BQU07QUFDbkMsUUFBSSxDQUFDLGNBQWMsQ0FBQztBQUNoQixhQUFPO0FBRVg7QUFBQTtBQUFBLE9BRUMsYUFBYSxNQUFNLEtBQUssV0FBVyxVQUFVO0FBQUEsTUFFMUMsQ0FBQyxZQUFZO0FBQUEsT0FFWixZQUFZLFVBQVUsS0FBSztBQUFBLE1BQUc7QUFDL0IsYUFBTztBQUFBLElBQ1g7QUFDQSxXQUFPO0FBQUEsRUFDWDtBQUNBLFdBQVMsYUFBYSxRQUFRO0FBQzFCLFVBQU0sZUFBZUEsT0FBTSxVQUFVLE1BQU07QUFDM0MsVUFBTSxZQUFZLE1BQU0sSUFBSSxNQUFNLEdBQUc7QUFFckMsUUFBSyxnQkFBZ0IsQ0FBQyxhQUFlLENBQUMsZ0JBQWdCLFdBQVk7QUFDOUQsYUFBTztBQUFBLElBQ1g7QUFDQSxVQUFNLGNBQWMsSUFBSSxvQkFBb0I7QUFDNUMsSUFBQUEsT0FBTSxPQUFPLFVBQVUsY0FBYyxXQUFXO0FBQ2hELFVBQU0sUUFBUSxZQUFZLFlBQVksU0FBUyxHQUFHLFNBQVM7QUFDM0QsV0FBTztBQUFBLEVBQ1g7QUFDQSxRQUFNLGdCQUFnQixDQUFDO0FBRXZCLEVBQUFELFFBQU8sVUFBVSxNQUFNO0FBQ25CLGVBQVcsV0FBVyxlQUFlO0FBQ2pDLGNBQVE7QUFBQSxJQUNaO0FBQ0Esa0JBQWMsU0FBUztBQUN2QixlQUFXLENBQUMsUUFBUSxLQUFLLEtBQUtBLFFBQU8sZ0JBQWdCQyxNQUFLLEdBQUc7QUFDekQsVUFBSSxhQUFhLE1BQU0sR0FBRztBQUN0QixjQUFNLFNBQVMsSUFBSSxvQkFBb0I7QUFDdkMsUUFBQUEsT0FBTSxPQUFPLFVBQVUsT0FBTyxNQUFNO0FBQ3BDLGNBQU0sSUFBSSxRQUFRO0FBQUEsVUFDZCxPQUFPLE9BQU8sU0FBUztBQUFBLFVBQ3ZCLFFBQVE7QUFBQSxVQUNSLFdBQVc7QUFBQSxVQUNYLFNBQVM7QUFBQSxRQUNiLENBQUM7QUFDRDtBQUFBLE1BQ0o7QUFDQSxZQUFNLGFBQWEsTUFBTSxJQUFJLE1BQU07QUFDbkMsaUJBQVcsVUFBVTtBQUNyQixpQkFBVyxVQUFVO0FBQ3JCLFVBQUksWUFBWSxNQUFNLEdBQUc7QUFFckIsbUJBQVcsU0FBUztBQUVwQixtQkFBVyxZQUFZO0FBQ3ZCLGNBQU0sZ0JBQWdCRSxlQUFjLFVBQVUsTUFBTTtBQUNwRCxZQUFJLENBQUM7QUFDRDtBQUNKLGNBQU0sRUFBRSxTQUFTLElBQUk7QUFDckIsWUFBSSxZQUFZLFNBQVMsUUFBUTtBQUM3QixnQkFBTSxDQUFDLG1CQUFtQixHQUFHLFdBQVcsSUFBSTtBQUM1QyxVQUFBRixPQUFNLGdCQUFnQixRQUFRLGlCQUFpQjtBQUMvQyxnQkFBTSxxQkFBcUJFLGVBQWMsV0FBVyxNQUFNO0FBQzFELDZCQUFtQixXQUFXO0FBQzlCLGNBQUksY0FBYyxTQUFTLEdBQThCO0FBQ3JELCtCQUFtQixTQUFTLEtBQUssS0FBSztBQUFBLFVBQzFDO0FBQUEsUUFDSixXQUNTLGNBQWMsU0FBUyxHQUEyQjtBQUN2RCxVQUFBRixPQUFNLGdCQUFnQixRQUFRLGVBQWUsS0FBSyxDQUFDO0FBQUEsUUFDdkQsV0FDUyxjQUFjLFNBQVMsR0FBOEI7QUFDMUQsVUFBQUEsT0FBTSxXQUFXLE1BQU07QUFDdkIsZ0JBQU0sT0FBTyxNQUFNO0FBQ25CLHdCQUFjLEtBQUssTUFBTTtBQUNyQixZQUFBQSxPQUFNLGdCQUFnQixRQUFRLEtBQUs7QUFBQSxVQUN2QyxDQUFDO0FBQUEsUUFDTDtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsRUFDSixHQUFHLE9BQU8saUJBQWlCO0FBQzNCLFdBQVMsZUFBZSxPQUFPO0FBQzNCLFFBQUksTUFBTSxNQUFNLFVBQVUsVUFBVSxNQUFNLEtBQUssTUFBTTtBQUNqRCxhQUFPLEVBQUUsR0FBRyxPQUFPLE1BQU0sRUFBRSxHQUFHLE1BQU0sTUFBTSxNQUFNLEVBQUUsT0FBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssTUFBTSxLQUFLLEtBQUssTUFBTSxFQUFFLEVBQUU7QUFBQSxJQUNqSDtBQUNBLFFBQUksTUFBTSxNQUFNLFVBQVUsWUFBWSxNQUFNLEtBQUssUUFBUTtBQUNyRCxhQUFPO0FBQUEsUUFDSCxHQUFHO0FBQUEsUUFDSCxNQUFNLEVBQUUsR0FBRyxNQUFNLE1BQU0sUUFBUSxFQUFFLE9BQU8sTUFBTSxLQUFLLE9BQU8sS0FBSyxLQUFLLE1BQU0sS0FBSyxPQUFPLE1BQU0sRUFBRTtBQUFBLE1BQ2xHO0FBQUEsSUFDSjtBQUNBLFFBQUksTUFBTSxNQUFNLFVBQVUsV0FBVyxNQUFNLEtBQUssT0FBTztBQUNuRCxhQUFPLEVBQUUsR0FBRyxPQUFPLE1BQU0sRUFBRSxHQUFHLE1BQU0sTUFBTSxPQUFPLEVBQUUsT0FBTyxNQUFNLEtBQUssTUFBTSxLQUFLLEtBQUssTUFBTSxLQUFLLE1BQU0sTUFBTSxFQUFFLEVBQUU7QUFBQSxJQUNwSDtBQUVBLFVBQU0sSUFBSSxNQUFNLGVBQWU7QUFBQSxFQUNuQztBQUNBLFNBQU87QUFBQTtBQUFBLElBRUgsZ0JBQWdCO0FBQUEsRUFDcEI7QUFDSjs7O0FDNUZPLElBQU0sU0FBeUIsdUJBQU87QUFTdEMsSUFBTSxjQUE4QixrQ0FBa0IsTUFBTTtBQUs1RCxJQUFNLHNCQUFzQywwQ0FBMEIsUUFBUSxXQUFXO0FBZXpGLElBQU0sY0FBYyxrQkFBa0IsTUFBTTtBQUs1QyxJQUFNLGNBQThCLGlDQUFpQixNQUFNOzs7QUN0RDVDLElBQU1HLGVBQThCLGdCQUFXLFlBQVksTUFBTTtBQUNqRSxJQUFNQyxlQUE4QixnQkFBVyxZQUFZLE1BQU07QUFDakUsSUFBTUMsZ0JBQStCLGdCQUFXLGFBQWEsTUFBTTtBQUtuRSxJQUFNQyxrQkFBaUMsZ0JBQVcsZUFBZSxNQUFNO0FBQ3ZFLElBQU1DLGNBQTZCLGdCQUFXLFdBQVcsTUFBTTtBQUMvRCxJQUFNQyxpQkFBZ0MsZ0JBQVcsY0FBYyxNQUFNO0FBQ3JFLElBQU1DLDZCQUE0QyxnQkFBVywwQkFBMEIsTUFBTTtBQUU3RixJQUFNQyxpQkFBZ0MsZ0JBQVcsY0FBYyxNQUFNO0FBQ3JFLElBQU1DLHVCQUFzQyxnQkFBVyxvQkFBb0IsTUFBTTtBQUlqRixJQUFNQyxhQUE0QixnQkFBVyxVQUFVLE1BQU07QUFHN0QsSUFBTUMsZ0JBQStCLGdCQUFXLGFBQWEsTUFBTTtBQU1uRSxJQUFNQyxVQUF5QixnQkFBVyxPQUFPLE1BQU07QUFDdkQsSUFBTUMsZUFBOEIsZ0JBQVcsWUFBWSxNQUFNO0FBRWpFLElBQU1DLGVBQThCLGdCQUFXLFlBQVksTUFBTTtBQUNqRSxJQUFNQyx1QkFBc0MsZ0JBQVcsb0JBQW9CLE1BQU07OztBQzVCaEcsSUFBSTtBQUFBLENBQ1YsU0FBVUMsYUFBWTtBQUNuQixFQUFBQSxZQUFXQSxZQUFXLGlCQUFpQixJQUFJLENBQUMsSUFBSTtBQUNoRCxFQUFBQSxZQUFXQSxZQUFXLGlCQUFpQixJQUFJLENBQUMsSUFBSTtBQUVoRCxFQUFBQSxZQUFXQSxZQUFXLGNBQWMsSUFBSSxDQUFDLElBQUk7QUFDakQsR0FBRyxlQUFlLGFBQWEsQ0FBQyxFQUFFOzs7QUNOM0IsSUFBSTtBQUFBLENBQ1YsU0FBVUMsY0FBYTtBQUNwQixFQUFBQSxhQUFZQSxhQUFZLFlBQVksSUFBSSxDQUFDLElBQUk7QUFDN0MsRUFBQUEsYUFBWUEsYUFBWSxZQUFZLElBQUksQ0FBQyxJQUFJO0FBQzdDLEVBQUFBLGFBQVlBLGFBQVksY0FBYyxJQUFJLENBQUMsSUFBSTtBQUMvQyxFQUFBQSxhQUFZQSxhQUFZLFFBQVEsSUFBSSxDQUFDLElBQUk7QUFDekMsRUFBQUEsYUFBWUEsYUFBWSxZQUFZLElBQUksQ0FBQyxJQUFJO0FBQzdDLEVBQUFBLGFBQVlBLGFBQVksYUFBYSxJQUFJLENBQUMsSUFBSTtBQUM5QyxFQUFBQSxhQUFZQSxhQUFZLFVBQVUsSUFBSSxDQUFDLElBQUk7QUFDM0MsRUFBQUEsYUFBWUEsYUFBWSxTQUFTLElBQUksQ0FBQyxJQUFJO0FBQzFDLEVBQUFBLGFBQVlBLGFBQVksU0FBUyxJQUFJLENBQUMsSUFBSTtBQUMxQyxFQUFBQSxhQUFZQSxhQUFZLFNBQVMsSUFBSSxDQUFDLElBQUk7QUFDMUMsRUFBQUEsYUFBWUEsYUFBWSxhQUFhLElBQUksRUFBRSxJQUFJO0FBQy9DLEVBQUFBLGFBQVlBLGFBQVksYUFBYSxJQUFJLEVBQUUsSUFBSTtBQUMvQyxFQUFBQSxhQUFZQSxhQUFZLGFBQWEsSUFBSSxFQUFFLElBQUk7QUFDL0MsRUFBQUEsYUFBWUEsYUFBWSxhQUFhLElBQUksRUFBRSxJQUFJO0FBQ25ELEdBQUcsZ0JBQWdCLGNBQWMsQ0FBQyxFQUFFO0FBSzdCLElBQUk7QUFBQSxDQUNWLFNBQVVDLG1CQUFrQjtBQUN6QixFQUFBQSxrQkFBaUJBLGtCQUFpQixRQUFRLElBQUksQ0FBQyxJQUFJO0FBQ25ELEVBQUFBLGtCQUFpQkEsa0JBQWlCLFVBQVUsSUFBSSxDQUFDLElBQUk7QUFDckQsRUFBQUEsa0JBQWlCQSxrQkFBaUIsaUJBQWlCLElBQUksQ0FBQyxJQUFJO0FBQzVELEVBQUFBLGtCQUFpQkEsa0JBQWlCLGlCQUFpQixJQUFJLENBQUMsSUFBSTtBQUNoRSxHQUFHLHFCQUFxQixtQkFBbUIsQ0FBQyxFQUFFOzs7QUMzQnZDLElBQUk7QUFBQSxDQUNWLFNBQVVDLGVBQWM7QUFDckIsRUFBQUEsY0FBYUEsY0FBYSxTQUFTLElBQUksQ0FBQyxJQUFJO0FBQzVDLEVBQUFBLGNBQWFBLGNBQWEsU0FBUyxJQUFJLENBQUMsSUFBSTtBQUM1QyxFQUFBQSxjQUFhQSxjQUFhLFdBQVcsSUFBSSxDQUFDLElBQUk7QUFDOUMsRUFBQUEsY0FBYUEsY0FBYSxxQkFBcUIsSUFBSSxDQUFDLElBQUk7QUFDeEQsRUFBQUEsY0FBYUEsY0FBYSxVQUFVLElBQUksQ0FBQyxJQUFJO0FBQ2pELEdBQUcsaUJBQWlCLGVBQWUsQ0FBQyxFQUFFOzs7QUNQL0IsSUFBSTtBQUFBLENBQ1YsU0FBVUMsZ0JBQWU7QUFDdEIsRUFBQUEsZUFBY0EsZUFBYyxjQUFjLElBQUksQ0FBQyxJQUFJO0FBQ25ELEVBQUFBLGVBQWNBLGVBQWMsZ0JBQWdCLElBQUksQ0FBQyxJQUFJO0FBQ3JELEVBQUFBLGVBQWNBLGVBQWMsZUFBZSxJQUFJLENBQUMsSUFBSTtBQUNwRCxFQUFBQSxlQUFjQSxlQUFjLGlCQUFpQixJQUFJLENBQUMsSUFBSTtBQUN0RCxFQUFBQSxlQUFjQSxlQUFjLG1CQUFtQixJQUFJLENBQUMsSUFBSTtBQUN4RCxFQUFBQSxlQUFjQSxlQUFjLGtCQUFrQixJQUFJLENBQUMsSUFBSTtBQUN2RCxFQUFBQSxlQUFjQSxlQUFjLGlCQUFpQixJQUFJLENBQUMsSUFBSTtBQUN0RCxFQUFBQSxlQUFjQSxlQUFjLG1CQUFtQixJQUFJLENBQUMsSUFBSTtBQUN4RCxFQUFBQSxlQUFjQSxlQUFjLGtCQUFrQixJQUFJLENBQUMsSUFBSTtBQUMzRCxHQUFHLGtCQUFrQixnQkFBZ0IsQ0FBQyxFQUFFO0FBSWpDLElBQUk7QUFBQSxDQUNWLFNBQVVDLE9BQU07QUFDYixFQUFBQSxNQUFLQSxNQUFLLGNBQWMsSUFBSSxDQUFDLElBQUk7QUFDakMsRUFBQUEsTUFBS0EsTUFBSyxTQUFTLElBQUksQ0FBQyxJQUFJO0FBQzVCLEVBQUFBLE1BQUtBLE1BQUssYUFBYSxJQUFJLENBQUMsSUFBSTtBQUNwQyxHQUFHLFNBQVMsT0FBTyxDQUFDLEVBQUU7OztBQ3BCZixTQUFTLDBCQUEwQkMsU0FBUTtBQUM5QyxRQUFNLFlBQVlBLFFBQU8sbUJBQW1CLGlCQUFpQjtBQUM3RCxNQUFJLFdBQVc7QUFDWCxXQUFPO0FBQUEsRUFDWDtBQUNBLFNBQU9BLFFBQU8sZ0JBQWdCLG1CQUFtQjtBQUFBLElBQzdDLEtBQUssUUFBUTtBQUFBLElBQ2IsVUFBVSxRQUFRLE1BQU0sUUFBUSxJQUFJO0FBQUEsTUFDaEMsS0FBSyxRQUFRO0FBQUEsTUFDYixNQUFNLFFBQVE7QUFBQSxJQUNsQixDQUFDLENBQUM7QUFBQSxFQUNOLENBQUM7QUFDTDs7O0FDakJBLElBQU0sb0JBQW9CO0FBTTFCLFNBQVMscUJBQXFCLE1BQU0saUJBQWlCLE9BQU87QUFDeEQsTUFBSSxNQUFNO0FBQ1YsTUFBSSxvQkFBb0I7QUFDeEIsTUFBSSxZQUFZO0FBQ2hCLE1BQUksT0FBTztBQUNYLE1BQUk7QUFDSixXQUFTLElBQUksR0FBRyxLQUFLLEtBQUssUUFBUSxFQUFFLEdBQUc7QUFDbkMsUUFBSSxJQUFJLEtBQUs7QUFDVCxhQUFPLEtBQUssV0FBVyxDQUFDO0FBQUEsYUFDbkIsU0FBUztBQUNkO0FBQUE7QUFFQSxhQUFPO0FBQ1gsUUFBSSxTQUFTLElBQVU7QUFDbkIsVUFBSSxjQUFjLElBQUksS0FBSyxTQUFTLEdBQUc7QUFBQSxNQUV2QyxXQUNTLGNBQWMsSUFBSSxLQUFLLFNBQVMsR0FBRztBQUN4QyxZQUFJLElBQUksU0FBUyxLQUNiLHNCQUFzQixLQUN0QixJQUFJLFdBQVcsSUFBSSxTQUFTLENBQUMsTUFBTSxNQUNuQyxJQUFJLFdBQVcsSUFBSSxTQUFTLENBQUMsTUFBTSxJQUFVO0FBQzdDLGNBQUksSUFBSSxTQUFTLEdBQUc7QUFDaEIsa0JBQU0saUJBQWlCLElBQUksWUFBWSxHQUFHO0FBQzFDLGdCQUFJLG1CQUFtQixJQUFJLFNBQVMsR0FBRztBQUNuQyxrQkFBSSxtQkFBbUIsSUFBSTtBQUN2QixzQkFBTTtBQUNOLG9DQUFvQjtBQUFBLGNBQ3hCLE9BQ0s7QUFDRCxzQkFBTSxJQUFJLE1BQU0sR0FBRyxjQUFjO0FBQ2pDLG9DQUFvQixJQUFJLFNBQVMsSUFBSSxJQUFJLFlBQVksR0FBRztBQUFBLGNBQzVEO0FBQ0EsMEJBQVk7QUFDWixxQkFBTztBQUNQO0FBQUEsWUFDSjtBQUFBLFVBQ0osV0FDUyxJQUFJLFdBQVcsS0FBSyxJQUFJLFdBQVcsR0FBRztBQUMzQyxrQkFBTTtBQUNOLGdDQUFvQjtBQUNwQix3QkFBWTtBQUNaLG1CQUFPO0FBQ1A7QUFBQSxVQUNKO0FBQUEsUUFDSjtBQUNBLFlBQUksZ0JBQWdCO0FBQ2hCLGNBQUksSUFBSSxTQUFTO0FBQ2IsbUJBQU87QUFBQTtBQUVQLGtCQUFNO0FBQ1YsOEJBQW9CO0FBQUEsUUFDeEI7QUFBQSxNQUNKLE9BQ0s7QUFDRCxZQUFJLElBQUksU0FBUztBQUNiLGlCQUFPLE1BQU0sS0FBSyxNQUFNLFlBQVksR0FBRyxDQUFDO0FBQUE7QUFFeEMsZ0JBQU0sS0FBSyxNQUFNLFlBQVksR0FBRyxDQUFDO0FBQ3JDLDRCQUFvQixJQUFJLFlBQVk7QUFBQSxNQUN4QztBQUNBLGtCQUFZO0FBQ1osYUFBTztBQUFBLElBQ1gsV0FDUyxTQUFTLE1BQVksU0FBUyxJQUFJO0FBQ3ZDLFFBQUU7QUFBQSxJQUNOLE9BQ0s7QUFDRCxhQUFPO0FBQUEsSUFDWDtBQUFBLEVBQ0o7QUFDQSxTQUFPO0FBQ1g7QUFFTyxTQUFTLFdBQVcsTUFBTTtBQUM3QixNQUFJLGVBQWU7QUFDbkIsTUFBSSxtQkFBbUI7QUFDdkIsTUFBSTtBQUNKLFdBQVMsSUFBSSxLQUFLLFNBQVMsR0FBRyxLQUFLLE1BQU0sQ0FBQyxrQkFBa0IsS0FBSztBQUM3RCxRQUFJO0FBQ0osUUFBSSxLQUFLO0FBQ0wsYUFBTyxLQUFLLENBQUM7QUFBQSxTQUNaO0FBQ0QsVUFBSSxRQUFRO0FBQ1IsY0FBTTtBQUNWLGFBQU87QUFBQSxJQUNYO0FBRUEsUUFBSSxLQUFLLFdBQVcsR0FBRztBQUNuQjtBQUFBLElBQ0o7QUFDQSxtQkFBZSxPQUFPLE1BQU07QUFDNUIsdUJBQW1CLEtBQUssV0FBVyxDQUFDLE1BQU07QUFBQSxFQUM5QztBQUlBLGlCQUFlLHFCQUFxQixjQUFjLENBQUMsZ0JBQWdCO0FBQ25FLE1BQUksa0JBQWtCO0FBQ2xCLFFBQUksYUFBYSxTQUFTO0FBQ3RCLGFBQU8sTUFBTTtBQUFBO0FBRWIsYUFBTztBQUFBLEVBQ2YsV0FDUyxhQUFhLFNBQVMsR0FBRztBQUM5QixXQUFPO0FBQUEsRUFDWCxPQUNLO0FBQ0QsV0FBTztBQUFBLEVBQ1g7QUFDSjtBQUVPLFNBQVMsUUFBUSxNQUFNO0FBQzFCLE1BQUksS0FBSyxXQUFXO0FBQ2hCLFdBQU87QUFDWCxNQUFJLE9BQU8sS0FBSyxXQUFXLENBQUM7QUFDNUIsUUFBTSxVQUFVLFNBQVM7QUFDekIsTUFBSSxNQUFNO0FBQ1YsTUFBSSxlQUFlO0FBQ25CLFdBQVMsSUFBSSxLQUFLLFNBQVMsR0FBRyxLQUFLLEdBQUcsRUFBRSxHQUFHO0FBQ3ZDLFdBQU8sS0FBSyxXQUFXLENBQUM7QUFDeEIsUUFBSSxTQUFTLElBQVU7QUFDbkIsVUFBSSxDQUFDLGNBQWM7QUFDZixjQUFNO0FBQ047QUFBQSxNQUNKO0FBQUEsSUFDSixPQUNLO0FBRUQscUJBQWU7QUFBQSxJQUNuQjtBQUFBLEVBQ0o7QUFDQSxNQUFJLFFBQVE7QUFDUixXQUFPLFVBQVUsTUFBTTtBQUMzQixNQUFJLFdBQVcsUUFBUTtBQUNuQixXQUFPO0FBQ1gsU0FBTyxLQUFLLE1BQU0sR0FBRyxHQUFHO0FBQzVCO0FBQ08sU0FBUyxpQkFBaUIsTUFBTSxLQUFLO0FBQ3hDLFFBQU0sZUFBZSxLQUFLLFdBQVcsR0FBRyxJQUFJLFFBQVEsS0FBSyxJQUFJLElBQUksUUFBUSxJQUFJO0FBQzdFLFNBQU8sYUFBYSxVQUFVLENBQUM7QUFDbkM7OztBQzNJTyxJQUFJO0FBQUEsQ0FDVixTQUFVQyxvQkFBbUI7QUFDMUIsRUFBQUEsbUJBQWtCQSxtQkFBa0IsVUFBVSxJQUFJLENBQUMsSUFBSTtBQUN2RCxFQUFBQSxtQkFBa0JBLG1CQUFrQixvQkFBb0IsSUFBSSxDQUFDLElBQUk7QUFDakUsRUFBQUEsbUJBQWtCQSxtQkFBa0Isb0JBQW9CLElBQUksQ0FBQyxJQUFJO0FBQ3JFLEdBQUcsc0JBQXNCLG9CQUFvQixDQUFDLEVBQUU7QUFLekMsU0FBUyxrQkFBa0IscUJBQXFCLFdBQVc7QUFDOUQsTUFBSSxVQUFVLE1BQU0sVUFBVSxRQUFRO0FBQ2xDLFdBQU8sVUFBVSxLQUFLO0FBQUEsRUFDMUIsT0FDSztBQUNELFdBQU8sb0JBQW9CLE9BQU8sWUFBWSxJQUFJLG9CQUFvQixVQUFVLE1BQU0sTUFBTSxDQUFDO0FBQUEsRUFDakc7QUFDSjtBQUtPLFNBQVMsdUJBQXVCQyxTQUFRLFdBQVc7QUFDdEQsUUFBTSw4QkFBOEJBLFFBQU8sbUJBQW1CLFVBQVUsSUFBSTtBQUM1RSxNQUFJLENBQUMsNkJBQTZCO0FBQzlCLFFBQUksVUFBVSxLQUFLLFdBQVcsUUFBUSxHQUFHO0FBQ3JDLFVBQUksVUFBVSxRQUFRLDJCQUEyQjtBQUM3QyxlQUFPLDBCQUEwQixVQUFVLElBQUksRUFBRUEsT0FBTTtBQUFBLE1BQzNELE9BQ0s7QUFDRCxjQUFNLElBQUksTUFBTSxzQkFBc0IsVUFBVSxJQUFJLGlCQUFpQjtBQUFBLE1BQ3pFO0FBQUEsSUFDSixXQUNTLFVBQVUsWUFBWTtBQUMzQixhQUFPQSxRQUFPLDBCQUEwQixVQUFVLE1BQU0sUUFBUSxTQUFTLFVBQVUsVUFBVSxDQUFDO0FBQUEsSUFDbEcsT0FDSztBQUNELFlBQU0sSUFBSSxNQUFNLEdBQUcsVUFBVSxJQUFJLHNEQUFzRDtBQUFBLElBQzNGO0FBQUEsRUFDSixPQUNLO0FBQ0QsV0FBTztBQUFBLEVBQ1g7QUFDSjtBQUtPLFNBQVMsaUJBQWlCQSxTQUFRLGlCQUFpQixnQkFBZ0IsRUFBRSxjQUFjLEdBQUc7QUFDekYsUUFBTSxpQkFBaUIsZUFBZSxJQUFJLGVBQWU7QUFDekQsTUFBSSxnQkFBZ0I7QUFDaEIsV0FBTztBQUFBLEVBQ1g7QUFDQSxNQUFJLGVBQWUsU0FBUyxrQkFBa0Isb0JBQW9CO0FBQzlELFVBQU0sU0FBUyxjQUFjLG1CQUFtQixlQUFlO0FBQy9ELG1CQUFlLElBQUksaUJBQWlCLE1BQU07QUFDMUMsV0FBTztBQUFBLEVBQ1g7QUFFQSxRQUFNLFlBQVksZUFBZSxTQUFTLGtCQUFrQixxQkFDdEQsY0FBYyx1QkFBdUIsSUFDckNBLFFBQU8sVUFBVTtBQUN2QixNQUFJLGNBQWMsTUFBTTtBQUNwQixVQUFNLElBQUksTUFBTSx1Q0FBdUM7QUFBQSxFQUMzRDtBQUNBLGlCQUFlLElBQUksaUJBQWlCLFNBQVM7QUFDN0MsU0FBTztBQUNYO0FBS08sU0FBUyxrQkFBa0JBLFNBQVEsbUJBQW1CQyxvQkFBbUIsU0FBUztBQUNyRixRQUFNLEVBQUUsWUFBWSxxQkFBcUIsNkJBQTZCLGNBQWMsSUFBSTtBQUN4RixRQUFNLHNCQUFzQiwrQkFBK0Isb0JBQUksSUFBSTtBQUNuRSxRQUFNLHlCQUE4QixRQUFhLFFBQVEsa0JBQWtCLEdBQUcsQ0FBQztBQUMvRSxRQUFNLDJCQUEyQix3QkFBd0IsaUJBQWlCO0FBQzFFLFFBQU0seUJBQXlCLDBCQUEwQkQsT0FBTTtBQUcvRCxRQUFNLGlCQUFpQixvQkFBSSxJQUFJO0FBQy9CLFFBQU0scUJBQXFCLENBQUMsb0JBQW9CLGlCQUFpQkEsU0FBUSxpQkFBaUIsZ0JBQWdCLE9BQU87QUFJakgsUUFBTSxzQkFBc0IsY0FBYyxtQkFBbUIsQ0FBQztBQUM5RCxNQUFJLFlBQVk7QUFDWixtQkFBZSxJQUFJLEdBQUcsVUFBVTtBQUFBLEVBQ3BDO0FBS0EsUUFBTSxvQkFBb0Isa0JBQWtCLFVBQVUsV0FBVyxLQUFLLENBQUMsU0FBUyxLQUFLLFNBQVMsdUJBQXVCLGFBQWE7QUFDbEksTUFBSSxtQkFBbUI7QUFDbkIsZUFBVyxDQUFDLHNCQUFzQixnQkFBZ0IsS0FBSyxrQkFBa0IsTUFBTTtBQUMzRSxZQUFNLGlCQUFpQixrQkFBa0Isd0JBQXdCLGdCQUFnQjtBQUNqRixZQUFNLHFCQUEwQixpQkFBaUIsZUFBZSxLQUFLLHNCQUFzQjtBQUMzRixZQUFNLHlCQUF5QkMsbUJBQWtCLG1CQUFtQixrQkFBa0I7QUFDdEYsWUFBTSxlQUFlLG1CQUFtQixvQkFBb0I7QUFDNUQsVUFBSSx3QkFBd0I7QUFDeEIsWUFBSSxvQkFBb0IsSUFBSSx1QkFBdUIsR0FBRyxLQUNsRCx1QkFBdUIsUUFBUSxrQkFBa0IsS0FBSztBQUN0RCxnQkFBTSxJQUFJLE1BQU0sYUFBYSxrQkFBa0IsR0FBRyx3REFBd0QsdUJBQXVCLEdBQUcseUJBQXlCLG9CQUFvQixTQUFTLENBQUMsRUFBRTtBQUFBLFFBQ2pNO0FBQ0EsMEJBQWtCRCxTQUFRLHdCQUF3QkMsb0JBQW1CO0FBQUEsVUFDakUsWUFBWTtBQUFBLFVBQ1oscUJBQXFCLElBQUksSUFBSSxtQkFBbUIsRUFBRSxJQUFJLHVCQUF1QixHQUFHO0FBQUEsVUFDaEYsZUFBZSxlQUFlLFNBQVMsa0JBQWtCLHFCQUFxQixnQkFBZ0I7QUFBQSxRQUNsRyxDQUFDO0FBQUEsTUFDTDtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBR0EsYUFBVyxhQUFhLGtCQUFrQixVQUFVLFlBQVk7QUFFNUQsUUFBSSxVQUFVLFNBQVMsdUJBQXVCO0FBQzFDO0FBR0osVUFBTSxzQkFBc0IsdUJBQXVCRCxTQUFRLFNBQVM7QUFHcEUsZUFBVyxDQUFDLFFBQVEsdUJBQXVCLEtBQUssVUFBVSxNQUFNO0FBQzVELFlBQU0sNkJBQTZCLGtCQUFrQixxQkFBcUIsdUJBQXVCO0FBQ2pHLFlBQU0sZUFBZSxtQkFBbUIsTUFBTTtBQUM5QyxZQUFNLGlCQUFpQixvQkFBb0IsT0FBTyxjQUFjLDBCQUEwQjtBQUkxRixVQUFJLG9CQUFvQixnQkFBZ0IsMEJBQTBCO0FBQzlELGNBQU0sWUFBWTtBQUNsQixZQUFJLFVBQVUsUUFBUTtBQUNsQixvQkFBVSxTQUFTLG1CQUFtQixVQUFVLE1BQU07QUFBQSxRQUMxRCxPQUNLO0FBQ0Qsb0JBQVUsU0FBUyxtQkFBbUIsQ0FBQztBQUFBLFFBQzNDO0FBQUEsTUFFSixPQUNLO0FBQ0QsZ0JBQVEsbUJBQW1CLG9CQUFvQixPQUFPLFlBQVksZ0JBQWdCLENBQUMsT0FBTyxjQUFjO0FBQ3BHLGNBQUksVUFBVSxzQkFBc0IsVUFBVTtBQUMxQyxtQkFBTyxFQUFFLFNBQVMsTUFBTSxPQUFPLG1CQUFtQixLQUFLLEVBQUU7QUFBQSxVQUM3RCxPQUNLO0FBQ0QsbUJBQU8sRUFBRSxTQUFTLE1BQU07QUFBQSxVQUM1QjtBQUFBLFFBQ0osQ0FBQztBQUFBLE1BQ0w7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLFFBQU0sWUFBWSx1QkFBdUIsaUJBQWlCLG1CQUFtQixLQUFLLHVCQUF1QixPQUFPLG1CQUFtQjtBQUNuSSxhQUFXLENBQUMsY0FBYyxZQUFZLEtBQUssZ0JBQWdCO0FBQ3ZELGNBQVUsU0FBUyxLQUFLO0FBQUEsTUFDcEIsS0FBSztBQUFBLE1BQ0wsTUFBTTtBQUFBLElBQ1YsQ0FBQztBQUFBLEVBQ0w7QUFDQSxZQUFVLE1BQU0sa0JBQWtCO0FBQ2xDLFNBQU87QUFDWDs7O0FDektBLElBQUFFLG1CQUFnQjs7O0FDQWhCLElBQUFDLG1CQUFnQjtBQVdULElBQUk7QUFBQSxDQUNWLFNBQVVDLFlBQVc7QUFFbEIsRUFBQUEsV0FBVUEsV0FBVSxZQUFZLElBQUksQ0FBQyxJQUFJO0FBQzdDLEdBQUcsY0FBYyxZQUFZLENBQUMsRUFBRTtBQUl6QixTQUFTLGtCQUFrQixRQUFRO0FBQ3RDLFVBQVEsUUFBUTtBQUFBLElBQ1osS0FBSztBQUFBLElBQ0wsS0FBSztBQUNELGFBQU87QUFBQSxJQUNYO0FBQ0ksWUFBTSxJQUFJQyxtQkFBa0IsTUFBTSw2QkFBNkIsU0FBUyxxQkFBcUI7QUFBQSxFQUNyRztBQUNKO0FBSU8sU0FBUyxnQkFBZ0IsUUFBUTtBQUNwQyxVQUFRLFFBQVE7QUFBQSxJQUNaLEtBQUs7QUFDRCxhQUFPO0FBQUEsSUFDWDtBQUNJLFlBQU0sSUFBSUEsbUJBQWtCLE1BQU0sNkJBQTZCLFNBQVMscUJBQXFCO0FBQUEsRUFDckc7QUFDSjtBQUNBLFNBQVMsbUJBQW1CO0FBQ3hCLFNBQU8sRUFBRSxRQUFRLG9CQUFJLElBQUksRUFBRTtBQUMvQjtBQUlPLElBQUk7QUFBQSxDQUNWLFNBQVVDLFNBQVE7QUFDZixXQUFTLE9BQU8sU0FBUyxTQUFTLGlCQUFBQyxRQUFJLE9BQU8sT0FBTyxHQUFHO0FBQ25ELElBQUMsUUFBUSxPQUFRLFFBQVEsQ0FBQyxPQUFPLFFBQVE7QUFDckMsVUFBSSxVQUFVLFFBQVc7QUFDckIsMkJBQW1CLE9BQU8sRUFBRSxLQUFVLE1BQU0sR0FBRyxPQUFPLE9BQU8sRUFBRSxFQUFFLEtBQUssQ0FBQyxFQUFFLE9BQU87QUFBQSxNQUNwRjtBQUFBLElBQ0osQ0FBQztBQUNELFdBQU87QUFBQSxFQUNYO0FBQ0EsRUFBQUQsUUFBTyxTQUFTO0FBQ2hCLFdBQVMsT0FBTyxPQUFPRSxTQUFRO0FBQzNCLFVBQU0sU0FBUyxpQkFBaUIsaUJBQUFELFFBQUksU0FBUyxRQUFRLGlCQUFBQSxRQUFJLE9BQU8sT0FBTyxLQUFLO0FBQzVFLFFBQUksTUFBTUMsWUFBVyxTQUFZLE9BQU8sTUFBTSxPQUFPLE1BQU1BO0FBQzNELFVBQU0sVUFBVSxpQkFBaUI7QUFDakMsV0FBTyxPQUFPLE1BQU0sS0FBSztBQUNyQixZQUFNLE1BQU0sT0FBTyxPQUFPO0FBQzFCLGNBQVEsUUFBUSxHQUFHO0FBQUEsUUFDZixLQUFLO0FBQ0QsY0FBSSxRQUFRLElBQUk7QUFDWjtBQUFBLFVBQ0o7QUFDQSxnQkFBTSxTQUFTLG1CQUFtQixPQUFPLFFBQVEsT0FBTyxPQUFPLENBQUM7QUFDaEUsY0FBSSxPQUFPLFVBQVUsUUFBVztBQUM1QixvQkFBUSxPQUFPLElBQUksT0FBTyxLQUFLLE9BQU8sS0FBSztBQUFBLFVBQy9DO0FBQ0E7QUFBQSxNQUNSO0FBQ0EsV0FBSyxNQUFNLE9BQU8sS0FBSyxRQUFRLEdBQUc7QUFDOUI7QUFBQSxNQUNKO0FBQ0EsYUFBTyxTQUFTLE1BQU0sQ0FBQztBQUFBLElBQzNCO0FBQ0EsV0FBTztBQUFBLEVBQ1g7QUFDQSxFQUFBRixRQUFPLFNBQVM7QUFDaEIsV0FBUyxTQUFTLFFBQVE7QUFDdEIsV0FBTztBQUFBLE1BQ0gsUUFBUSxTQUFTLE9BQU8sTUFBTSxJQUN4QixPQUFPLFFBQVEsT0FBTyxNQUFNLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLEtBQUssTUFBTTtBQUMxRCxZQUFJLElBQUksS0FBSyxLQUFLO0FBQ2xCLGVBQU87QUFBQSxNQUNYLEdBQUcsb0JBQUksSUFBSSxDQUFDLElBQ1Ysb0JBQUksSUFBSTtBQUFBLElBQ2xCO0FBQUEsRUFDSjtBQUNBLEVBQUFBLFFBQU8sV0FBVztBQUNsQixXQUFTLE9BQU8sU0FBUztBQUNyQixVQUFNLE1BQU0sQ0FBQztBQUNiLFFBQUksU0FBUyxDQUFDO0FBQ2QsUUFBSSxRQUFRLFFBQVE7QUFDaEIsY0FBUSxPQUFPLFFBQVEsQ0FBQyxHQUFHLE1BQU07QUFDN0IsWUFBSSxPQUFPLENBQUMsSUFBSTtBQUFBLE1BQ3BCLENBQUM7QUFBQSxJQUNMO0FBQ0EsV0FBTztBQUFBLEVBQ1g7QUFDQSxFQUFBQSxRQUFPLFNBQVM7QUFDaEIsV0FBUyxLQUFLLFFBQVE7QUFDbEIsVUFBTSxTQUFTLGlCQUFpQjtBQUNoQyxRQUFJLFdBQVcsUUFBVztBQUN0QixhQUFPLEtBQUssTUFBTSxFQUFFLFFBQVEsQ0FBQyxRQUFRO0FBQ2pDLGVBQU8sT0FBTyxJQUFJLEtBQUssT0FBTyxHQUFHLENBQUM7QUFBQSxNQUN0QyxDQUFDO0FBQUEsSUFDTDtBQUNBLFdBQU87QUFBQSxFQUNYO0FBQ0EsRUFBQUEsUUFBTyxPQUFPO0FBQ2QsV0FBUyxPQUFPLFNBQVM7QUFDckIsVUFBTSxTQUFTLENBQUM7QUFDaEIsS0FBQyxHQUFHLFFBQVEsT0FBTyxLQUFLLENBQUMsRUFBRSxRQUFRLENBQUMsUUFBUTtBQUN4QyxhQUFPLEdBQUcsSUFBSSxRQUFRLE9BQU8sSUFBSSxHQUFHO0FBQUEsSUFDeEMsQ0FBQztBQUNELFdBQU87QUFBQSxFQUNYO0FBQ0EsRUFBQUEsUUFBTyxTQUFTO0FBQ3BCLEdBQUcsV0FBVyxTQUFTLENBQUMsRUFBRTtBQUMxQixTQUFTLCtCQUErQjtBQUNwQyxTQUFPLEVBQUUsS0FBSyxJQUFJLE9BQU8sT0FBVTtBQUN2QztBQUlPLElBQUk7QUFBQSxDQUNWLFNBQVVHLHFCQUFvQjtBQUMzQixXQUFTLE9BQU8sU0FBUyxTQUFTLGlCQUFBRixRQUFJLE9BQU8sT0FBTyxHQUFHO0FBQ25ELFFBQUksUUFBUSxRQUFRLElBQUk7QUFDcEIsYUFBTyxPQUFPLEVBQUUsRUFBRSxPQUFPLFFBQVEsR0FBRztBQUFBLElBQ3hDO0FBQ0EsUUFBSSxRQUFRLFVBQVUsUUFBVztBQUM3QixZQUFNLE9BQU8sTUFBTSxLQUFLLFFBQVEsS0FBSyxHQUFHLE9BQU8sT0FBTyxFQUFFLEVBQUUsS0FBSyxDQUFDLEVBQUUsT0FBTztBQUFBLElBQzdFO0FBQ0EsV0FBTztBQUFBLEVBQ1g7QUFDQSxFQUFBRSxvQkFBbUIsU0FBUztBQUM1QixXQUFTLE9BQU8sT0FBT0QsU0FBUTtBQUMzQixVQUFNLFNBQVMsaUJBQWlCLGlCQUFBRCxRQUFJLFNBQVMsUUFBUSxpQkFBQUEsUUFBSSxPQUFPLE9BQU8sS0FBSztBQUM1RSxRQUFJLE1BQU1DLFlBQVcsU0FBWSxPQUFPLE1BQU0sT0FBTyxNQUFNQTtBQUMzRCxVQUFNLFVBQVUsNkJBQTZCO0FBQzdDLFdBQU8sT0FBTyxNQUFNLEtBQUs7QUFDckIsWUFBTSxNQUFNLE9BQU8sT0FBTztBQUMxQixjQUFRLFFBQVEsR0FBRztBQUFBLFFBQ2YsS0FBSztBQUNELGNBQUksUUFBUSxJQUFJO0FBQ1o7QUFBQSxVQUNKO0FBQ0Esa0JBQVEsTUFBTSxPQUFPLE9BQU87QUFDNUI7QUFBQSxRQUNKLEtBQUs7QUFDRCxjQUFJLFFBQVEsSUFBSTtBQUNaO0FBQUEsVUFDSjtBQUNBLGtCQUFRLFFBQVEsTUFBTSxPQUFPLE1BQU0sT0FBTyxRQUFRLE9BQU8sT0FBTyxDQUFDLENBQUM7QUFDbEU7QUFBQSxNQUNSO0FBQ0EsV0FBSyxNQUFNLE9BQU8sS0FBSyxRQUFRLEdBQUc7QUFDOUI7QUFBQSxNQUNKO0FBQ0EsYUFBTyxTQUFTLE1BQU0sQ0FBQztBQUFBLElBQzNCO0FBQ0EsV0FBTztBQUFBLEVBQ1g7QUFDQSxFQUFBQyxvQkFBbUIsU0FBUztBQUM1QixXQUFTLFNBQVMsUUFBUTtBQUN0QixXQUFPLEVBQUUsS0FBSyxNQUFNLE9BQU8sR0FBRyxJQUFJLE9BQU8sT0FBTyxHQUFHLElBQUksSUFBSSxPQUFPLE1BQU0sUUFBUSxLQUFLLElBQUksT0FBTyxRQUFRLE9BQVU7QUFBQSxFQUN0SDtBQUNBLEVBQUFBLG9CQUFtQixXQUFXO0FBQzlCLFdBQVMsT0FBTyxTQUFTO0FBQ3JCLFVBQU0sTUFBTSxDQUFDO0FBQ2IsWUFBUSxRQUFRLFdBQWMsSUFBSSxNQUFNLFFBQVE7QUFDaEQsWUFBUSxVQUFVLFdBQWMsSUFBSSxRQUFRLFFBQVE7QUFDcEQsV0FBTztBQUFBLEVBQ1g7QUFDQSxFQUFBQSxvQkFBbUIsU0FBUztBQUNoQyxHQUFHLHVCQUF1QixxQkFBcUIsQ0FBQyxFQUFFO0FBQ2xELFNBQVMsa0JBQWtCO0FBQ3ZCLFNBQU8sRUFBRSxNQUFNLE9BQVU7QUFDN0I7QUFJTyxJQUFJO0FBQUEsQ0FDVixTQUFVQyxRQUFPO0FBQ2QsV0FBUyxPQUFPLFNBQVMsU0FBUyxpQkFBQUgsUUFBSSxPQUFPLE9BQU8sR0FBRztBQUNuRCxZQUFRLFFBQVEsTUFBTSxPQUFPO0FBQUEsTUFDekIsS0FBSztBQUNELGVBQU8sT0FBTyxDQUFDLEVBQUUsTUFBTSxRQUFRLEtBQUssU0FBUztBQUM3QztBQUFBLE1BQ0osS0FBSztBQUNELGVBQU8sT0FBTyxFQUFFLEVBQUUsT0FBTyxRQUFRLEtBQUssV0FBVztBQUNqRDtBQUFBLE1BQ0osS0FBSztBQUNELGVBQU8sT0FBTyxFQUFFLEVBQUUsT0FBTyxRQUFRLEtBQUssV0FBVztBQUNqRDtBQUFBLE1BQ0osS0FBSztBQUNELGVBQU8sT0FBTyxFQUFFLEVBQUUsS0FBSyxRQUFRLEtBQUssU0FBUztBQUM3QztBQUFBLE1BQ0osS0FBSztBQUNELGVBQU8sT0FBTyxPQUFPLEtBQUssUUFBUSxLQUFLLFdBQVcsR0FBRyxPQUFPLE9BQU8sRUFBRSxFQUFFLEtBQUssQ0FBQyxFQUFFLE9BQU87QUFDdEY7QUFBQSxNQUNKLEtBQUs7QUFDRCxrQkFBVSxPQUFPLFVBQVUsS0FBSyxRQUFRLEtBQUssU0FBUyxHQUFHLE9BQU8sT0FBTyxFQUFFLEVBQUUsS0FBSyxDQUFDLEVBQUUsT0FBTztBQUMxRjtBQUFBLElBQ1I7QUFDQSxXQUFPO0FBQUEsRUFDWDtBQUNBLEVBQUFHLE9BQU0sU0FBUztBQUNmLFdBQVMsT0FBTyxPQUFPRixTQUFRO0FBQzNCLFVBQU0sU0FBUyxpQkFBaUIsaUJBQUFELFFBQUksU0FBUyxRQUFRLGlCQUFBQSxRQUFJLE9BQU8sT0FBTyxLQUFLO0FBQzVFLFFBQUksTUFBTUMsWUFBVyxTQUFZLE9BQU8sTUFBTSxPQUFPLE1BQU1BO0FBQzNELFVBQU0sVUFBVSxnQkFBZ0I7QUFDaEMsV0FBTyxPQUFPLE1BQU0sS0FBSztBQUNyQixZQUFNLE1BQU0sT0FBTyxPQUFPO0FBQzFCLGNBQVEsUUFBUSxHQUFHO0FBQUEsUUFDZixLQUFLO0FBQ0QsY0FBSSxRQUFRLEdBQUc7QUFDWDtBQUFBLFVBQ0o7QUFDQSxrQkFBUSxPQUFPLEVBQUUsT0FBTyxhQUFhLFdBQVcsT0FBTyxNQUFNLEVBQUU7QUFDL0Q7QUFBQSxRQUNKLEtBQUs7QUFDRCxjQUFJLFFBQVEsSUFBSTtBQUNaO0FBQUEsVUFDSjtBQUNBLGtCQUFRLE9BQU8sRUFBRSxPQUFPLGVBQWUsYUFBYSxPQUFPLE9BQU8sRUFBRTtBQUNwRTtBQUFBLFFBQ0osS0FBSztBQUNELGNBQUksUUFBUSxJQUFJO0FBQ1o7QUFBQSxVQUNKO0FBQ0Esa0JBQVEsT0FBTyxFQUFFLE9BQU8sZUFBZSxhQUFhLE9BQU8sT0FBTyxFQUFFO0FBQ3BFO0FBQUEsUUFDSixLQUFLO0FBQ0QsY0FBSSxRQUFRLElBQUk7QUFDWjtBQUFBLFVBQ0o7QUFDQSxrQkFBUSxPQUFPLEVBQUUsT0FBTyxhQUFhLFdBQVcsT0FBTyxLQUFLLEVBQUU7QUFDOUQ7QUFBQSxRQUNKLEtBQUs7QUFDRCxjQUFJLFFBQVEsSUFBSTtBQUNaO0FBQUEsVUFDSjtBQUNBLGtCQUFRLE9BQU8sRUFBRSxPQUFPLGVBQWUsYUFBYSxPQUFPLE9BQU8sT0FBTyxPQUFPLFFBQVEsT0FBTyxPQUFPLENBQUMsQ0FBQyxFQUFFO0FBQzFHO0FBQUEsUUFDSixLQUFLO0FBQ0QsY0FBSSxRQUFRLElBQUk7QUFDWjtBQUFBLFVBQ0o7QUFDQSxrQkFBUSxPQUFPLEVBQUUsT0FBTyxhQUFhLFdBQVcsVUFBVSxPQUFPLFVBQVUsT0FBTyxRQUFRLE9BQU8sT0FBTyxDQUFDLENBQUMsRUFBRTtBQUM1RztBQUFBLE1BQ1I7QUFDQSxXQUFLLE1BQU0sT0FBTyxLQUFLLFFBQVEsR0FBRztBQUM5QjtBQUFBLE1BQ0o7QUFDQSxhQUFPLFNBQVMsTUFBTSxDQUFDO0FBQUEsSUFDM0I7QUFDQSxXQUFPO0FBQUEsRUFDWDtBQUNBLEVBQUFFLE9BQU0sU0FBUztBQUNmLFdBQVMsU0FBUyxRQUFRO0FBQ3RCLFdBQU87QUFBQSxNQUNILE1BQU0sTUFBTSxPQUFPLFNBQVMsSUFDdEIsRUFBRSxPQUFPLGFBQWEsV0FBVyxrQkFBa0IsT0FBTyxTQUFTLEVBQUUsSUFDckUsTUFBTSxPQUFPLFdBQVcsSUFDcEIsRUFBRSxPQUFPLGVBQWUsYUFBYSxPQUFPLE9BQU8sV0FBVyxFQUFFLElBQ2hFLE1BQU0sT0FBTyxXQUFXLElBQ3BCLEVBQUUsT0FBTyxlQUFlLGFBQWEsT0FBTyxPQUFPLFdBQVcsRUFBRSxJQUNoRSxNQUFNLE9BQU8sU0FBUyxJQUNsQixFQUFFLE9BQU8sYUFBYSxXQUFXLFFBQVEsT0FBTyxTQUFTLEVBQUUsSUFDM0QsTUFBTSxPQUFPLFdBQVcsSUFDcEIsRUFBRSxPQUFPLGVBQWUsYUFBYSxPQUFPLFlBQVksSUFDeEQsTUFBTSxPQUFPLFNBQVMsSUFDbEIsRUFBRSxPQUFPLGFBQWEsV0FBVyxDQUFDLEdBQUcsT0FBTyxTQUFTLEVBQUUsSUFDdkQ7QUFBQSxJQUM5QjtBQUFBLEVBQ0o7QUFDQSxFQUFBQSxPQUFNLFdBQVc7QUFDakIsV0FBUyxPQUFPLFNBQVM7QUFDckIsVUFBTSxNQUFNLENBQUM7QUFDYixZQUFRLE1BQU0sVUFBVSxnQkFDbkIsSUFBSSxZQUFZLFFBQVEsTUFBTSxjQUFjLFNBQVksZ0JBQWdCLFFBQVEsTUFBTSxTQUFTLElBQUk7QUFDeEcsWUFBUSxNQUFNLFVBQVUsa0JBQWtCLElBQUksY0FBYyxRQUFRLE1BQU07QUFDMUUsWUFBUSxNQUFNLFVBQVUsa0JBQWtCLElBQUksY0FBYyxRQUFRLE1BQU07QUFDMUUsWUFBUSxNQUFNLFVBQVUsZ0JBQWdCLElBQUksWUFBWSxRQUFRLE1BQU07QUFDdEUsWUFBUSxNQUFNLFVBQVUsa0JBQWtCLElBQUksY0FBYyxRQUFRLE1BQU07QUFDMUUsWUFBUSxNQUFNLFVBQVUsZ0JBQWdCLElBQUksWUFBWSxRQUFRLE1BQU07QUFDdEUsV0FBTztBQUFBLEVBQ1g7QUFDQSxFQUFBQSxPQUFNLFNBQVM7QUFDZixXQUFTLEtBQUssT0FBTztBQUNqQixVQUFNLFNBQVMsZ0JBQWdCO0FBQy9CLFFBQUksVUFBVSxNQUFNO0FBQ2hCLGFBQU8sT0FBTztBQUFBLFFBQUUsT0FBTztBQUFBLFFBQWEsV0FBVztBQUFBO0FBQUEsTUFBNkI7QUFBQSxJQUNoRixXQUNTLE9BQU8sVUFBVSxXQUFXO0FBQ2pDLGFBQU8sT0FBTyxFQUFFLE9BQU8sYUFBYSxXQUFXLE1BQU07QUFBQSxJQUN6RCxXQUNTLE9BQU8sVUFBVSxVQUFVO0FBQ2hDLGFBQU8sT0FBTyxFQUFFLE9BQU8sZUFBZSxhQUFhLE1BQU07QUFBQSxJQUM3RCxXQUNTLE9BQU8sVUFBVSxVQUFVO0FBQ2hDLGFBQU8sT0FBTyxFQUFFLE9BQU8sZUFBZSxhQUFhLE1BQU07QUFBQSxJQUM3RCxXQUNTLE1BQU0sUUFBUSxLQUFLLEdBQUc7QUFDM0IsYUFBTyxPQUFPLEVBQUUsT0FBTyxhQUFhLFdBQVcsTUFBTTtBQUFBLElBQ3pELFdBQ1MsT0FBTyxVQUFVLFVBQVU7QUFDaEMsYUFBTyxPQUFPLEVBQUUsT0FBTyxlQUFlLGFBQWEsTUFBTTtBQUFBLElBQzdELFdBQ1MsT0FBTyxVQUFVLGFBQWE7QUFDbkMsWUFBTSxJQUFJLE1BQU0saUNBQWlDLE9BQU8sS0FBSztBQUFBLElBQ2pFO0FBQ0EsV0FBTztBQUFBLEVBQ1g7QUFDQSxFQUFBQSxPQUFNLE9BQU87QUFDYixXQUFTLE9BQU8sU0FBUztBQUNyQixRQUFJLFFBQVEsTUFBTSxVQUFVLGFBQWE7QUFDckMsYUFBTztBQUFBLElBQ1gsV0FDUyxRQUFRLE1BQU0sVUFBVSxlQUFlO0FBQzVDLGFBQU8sUUFBUSxNQUFNO0FBQUEsSUFDekIsV0FDUyxRQUFRLE1BQU0sVUFBVSxlQUFlO0FBQzVDLGFBQU8sUUFBUSxNQUFNO0FBQUEsSUFDekIsV0FDUyxRQUFRLE1BQU0sVUFBVSxhQUFhO0FBQzFDLGFBQU8sUUFBUSxNQUFNO0FBQUEsSUFDekIsV0FDUyxRQUFRLE1BQU0sVUFBVSxlQUFlO0FBQzVDLGFBQU8sUUFBUSxNQUFNO0FBQUEsSUFDekIsV0FDUyxRQUFRLE1BQU0sVUFBVSxhQUFhO0FBQzFDLGFBQU8sUUFBUSxNQUFNO0FBQUEsSUFDekIsT0FDSztBQUNELGFBQU87QUFBQSxJQUNYO0FBQUEsRUFDSjtBQUNBLEVBQUFBLE9BQU0sU0FBUztBQUNuQixHQUFHLFVBQVUsUUFBUSxDQUFDLEVBQUU7QUFDeEIsU0FBUyxzQkFBc0I7QUFDM0IsU0FBTyxFQUFFLFFBQVEsQ0FBQyxFQUFFO0FBQ3hCO0FBSU8sSUFBSTtBQUFBLENBQ1YsU0FBVUMsWUFBVztBQUNsQixXQUFTLE9BQU8sU0FBUyxTQUFTLGlCQUFBSixRQUFJLE9BQU8sT0FBTyxHQUFHO0FBQ25ELGVBQVcsS0FBSyxRQUFRLFFBQVE7QUFDNUIsWUFBTSxPQUFPLE1BQU0sS0FBSyxDQUFDLEdBQUcsT0FBTyxPQUFPLEVBQUUsRUFBRSxLQUFLLENBQUMsRUFBRSxPQUFPO0FBQUEsSUFDakU7QUFDQSxXQUFPO0FBQUEsRUFDWDtBQUNBLEVBQUFJLFdBQVUsU0FBUztBQUNuQixXQUFTLE9BQU8sT0FBT0gsU0FBUTtBQUMzQixVQUFNLFNBQVMsaUJBQWlCLGlCQUFBRCxRQUFJLFNBQVMsUUFBUSxpQkFBQUEsUUFBSSxPQUFPLE9BQU8sS0FBSztBQUM1RSxRQUFJLE1BQU1DLFlBQVcsU0FBWSxPQUFPLE1BQU0sT0FBTyxNQUFNQTtBQUMzRCxVQUFNLFVBQVUsb0JBQW9CO0FBQ3BDLFdBQU8sT0FBTyxNQUFNLEtBQUs7QUFDckIsWUFBTSxNQUFNLE9BQU8sT0FBTztBQUMxQixjQUFRLFFBQVEsR0FBRztBQUFBLFFBQ2YsS0FBSztBQUNELGNBQUksUUFBUSxJQUFJO0FBQ1o7QUFBQSxVQUNKO0FBQ0Esa0JBQVEsT0FBTyxLQUFLLE1BQU0sT0FBTyxNQUFNLE9BQU8sUUFBUSxPQUFPLE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFDdkU7QUFBQSxNQUNSO0FBQ0EsV0FBSyxNQUFNLE9BQU8sS0FBSyxRQUFRLEdBQUc7QUFDOUI7QUFBQSxNQUNKO0FBQ0EsYUFBTyxTQUFTLE1BQU0sQ0FBQztBQUFBLElBQzNCO0FBQ0EsV0FBTztBQUFBLEVBQ1g7QUFDQSxFQUFBRyxXQUFVLFNBQVM7QUFDbkIsV0FBUyxTQUFTLFFBQVE7QUFDdEIsV0FBTyxFQUFFLFFBQVEsTUFBTSxRQUFRLFFBQVEsTUFBTSxJQUFJLENBQUMsR0FBRyxPQUFPLE1BQU0sSUFBSSxDQUFDLEVBQUU7QUFBQSxFQUM3RTtBQUNBLEVBQUFBLFdBQVUsV0FBVztBQUNyQixXQUFTLE9BQU8sU0FBUztBQUNyQixVQUFNLE1BQU0sQ0FBQztBQUNiLFFBQUksUUFBUSxRQUFRO0FBQ2hCLFVBQUksU0FBUyxRQUFRLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztBQUFBLElBQzVDLE9BQ0s7QUFDRCxVQUFJLFNBQVMsQ0FBQztBQUFBLElBQ2xCO0FBQ0EsV0FBTztBQUFBLEVBQ1g7QUFDQSxFQUFBQSxXQUFVLFNBQVM7QUFDbkIsV0FBUyxLQUFLLE9BQU87QUFDakIsVUFBTSxTQUFTLG9CQUFvQjtBQUNuQyxXQUFPLFNBQVMsU0FBUyxDQUFDO0FBQzFCLFdBQU87QUFBQSxFQUNYO0FBQ0EsRUFBQUEsV0FBVSxPQUFPO0FBQ2pCLFdBQVMsT0FBTyxTQUFTO0FBQ3JCLFFBQUksU0FBUyxlQUFlLFFBQVEsS0FBSyxNQUFNLFFBQVEsUUFBUSxNQUFNLEdBQUc7QUFDcEUsYUFBTyxRQUFRO0FBQUEsSUFDbkIsT0FDSztBQUNELGFBQU87QUFBQSxJQUNYO0FBQUEsRUFDSjtBQUNBLEVBQUFBLFdBQVUsU0FBUztBQUN2QixHQUFHLGNBQWMsWUFBWSxDQUFDLEVBQUU7QUFDaEMsSUFBTU4sc0JBQXFCLE1BQU07QUFDN0IsTUFBSSxPQUFPLGVBQWUsYUFBYTtBQUNuQyxXQUFPO0FBQUEsRUFDWDtBQUNBLE1BQUksT0FBTyxTQUFTLGFBQWE7QUFDN0IsV0FBTztBQUFBLEVBQ1g7QUFDQSxNQUFJLE9BQStCO0FBQy9CLFdBQU87QUFBQSxFQUNYO0FBQ0EsTUFBSSxPQUFPLFdBQVcsYUFBYTtBQUMvQixXQUFPO0FBQUEsRUFDWDtBQUNBLFFBQU07QUFDVixHQUFHO0FBQ0gsU0FBUyxTQUFTLE9BQU87QUFDckIsU0FBTyxPQUFPLFVBQVUsWUFBWSxVQUFVO0FBQ2xEO0FBQ0EsU0FBUyxNQUFNLE9BQU87QUFDbEIsU0FBTyxVQUFVLFFBQVEsVUFBVTtBQUN2Qzs7O0FEOWFBLFNBQVMsMEJBQTBCO0FBQy9CLFNBQU8sRUFBRSxNQUFNLE9BQVU7QUFDN0I7QUFJTyxJQUFJO0FBQUEsQ0FDVixTQUFVTyxnQkFBZTtBQUN0QixXQUFTLE9BQU8sU0FBUyxTQUFTLGlCQUFBQyxRQUFJLE9BQU8sT0FBTyxHQUFHO0FBQ25ELFlBQVEsUUFBUSxNQUFNLE9BQU87QUFBQSxNQUN6QixLQUFLO0FBQ0QsY0FBTSxPQUFPLE1BQU0sS0FBSyxRQUFRLEtBQUssSUFBSSxHQUFHLE9BQU8sT0FBTyxFQUFFLEVBQUUsS0FBSyxDQUFDLEVBQUUsT0FBTztBQUM3RTtBQUFBLE1BQ0osS0FBSztBQUNELGVBQU8sT0FBTyxFQUFFLEVBQUUsTUFBTSxRQUFRLEtBQUssTUFBTTtBQUMzQztBQUFBLElBQ1I7QUFDQSxXQUFPO0FBQUEsRUFDWDtBQUNBLEVBQUFELGVBQWMsU0FBUztBQUN2QixXQUFTLE9BQU8sT0FBT0UsU0FBUTtBQUMzQixVQUFNLFNBQVMsaUJBQWlCLGlCQUFBRCxRQUFJLFNBQVMsUUFBUSxpQkFBQUEsUUFBSSxPQUFPLE9BQU8sS0FBSztBQUM1RSxRQUFJLE1BQU1DLFlBQVcsU0FBWSxPQUFPLE1BQU0sT0FBTyxNQUFNQTtBQUMzRCxVQUFNLFVBQVUsd0JBQXdCO0FBQ3hDLFdBQU8sT0FBTyxNQUFNLEtBQUs7QUFDckIsWUFBTSxNQUFNLE9BQU8sT0FBTztBQUMxQixjQUFRLFFBQVEsR0FBRztBQUFBLFFBQ2YsS0FBSztBQUNELGNBQUksUUFBUSxJQUFJO0FBQ1o7QUFBQSxVQUNKO0FBQ0Esa0JBQVEsT0FBTyxFQUFFLE9BQU8sUUFBUSxNQUFNLE1BQU0sT0FBTyxNQUFNLE9BQU8sUUFBUSxPQUFPLE9BQU8sQ0FBQyxDQUFDLEVBQUU7QUFDMUY7QUFBQSxRQUNKLEtBQUs7QUFDRCxjQUFJLFFBQVEsSUFBSTtBQUNaO0FBQUEsVUFDSjtBQUNBLGtCQUFRLE9BQU8sRUFBRSxPQUFPLFVBQVUsUUFBUSxPQUFPLE1BQU0sRUFBRTtBQUN6RDtBQUFBLE1BQ1I7QUFDQSxXQUFLLE1BQU0sT0FBTyxLQUFLLFFBQVEsR0FBRztBQUM5QjtBQUFBLE1BQ0o7QUFDQSxhQUFPLFNBQVMsTUFBTSxDQUFDO0FBQUEsSUFDM0I7QUFDQSxXQUFPO0FBQUEsRUFDWDtBQUNBLEVBQUFGLGVBQWMsU0FBUztBQUN2QixXQUFTLFNBQVMsUUFBUTtBQUN0QixXQUFPO0FBQUEsTUFDSCxNQUFNRyxPQUFNLE9BQU8sSUFBSSxJQUNqQixFQUFFLE9BQU8sUUFBUSxNQUFNLE9BQU8sS0FBSyxJQUNuQ0EsT0FBTSxPQUFPLE1BQU0sSUFDZixFQUFFLE9BQU8sVUFBVSxRQUFRLGdCQUFnQixPQUFPLE1BQU0sRUFBRSxJQUMxRDtBQUFBLElBQ2Q7QUFBQSxFQUNKO0FBQ0EsRUFBQUgsZUFBYyxXQUFXO0FBQ3pCLFdBQVMsT0FBTyxTQUFTO0FBQ3JCLFVBQU0sTUFBTSxDQUFDO0FBQ2IsWUFBUSxNQUFNLFVBQVUsV0FBVyxJQUFJLE9BQU8sUUFBUSxNQUFNO0FBQzVELFlBQVEsTUFBTSxVQUFVLGFBQ25CLElBQUksU0FBUyxRQUFRLE1BQU0sV0FBVyxTQUFZLGdCQUFnQixRQUFRLE1BQU0sTUFBTSxJQUFJO0FBQy9GLFdBQU87QUFBQSxFQUNYO0FBQ0EsRUFBQUEsZUFBYyxTQUFTO0FBQzNCLEdBQUcsa0JBQWtCLGdCQUFnQixDQUFDLEVBQUU7QUFDeEMsU0FBUywrQkFBK0I7QUFDcEMsU0FBTyxFQUFFLE1BQU0sSUFBSSxZQUFZLFFBQVcsTUFBTSxvQkFBSSxJQUFJLEVBQUU7QUFDOUQ7QUFJTyxJQUFJO0FBQUEsQ0FDVixTQUFVSSxxQkFBb0I7QUFDM0IsV0FBUyxPQUFPLFNBQVMsU0FBUyxpQkFBQUgsUUFBSSxPQUFPLE9BQU8sR0FBRztBQUNuRCxRQUFJLFFBQVEsU0FBUyxJQUFJO0FBQ3JCLGFBQU8sT0FBTyxFQUFFLEVBQUUsT0FBTyxRQUFRLElBQUk7QUFBQSxJQUN6QztBQUNBLFFBQUksUUFBUSxlQUFlLFFBQVc7QUFDbEMsWUFBTSxPQUFPLE1BQU0sS0FBSyxRQUFRLFVBQVUsR0FBRyxPQUFPLE9BQU8sRUFBRSxFQUFFLEtBQUssQ0FBQyxFQUFFLE9BQU87QUFBQSxJQUNsRjtBQUNBLElBQUMsUUFBUSxLQUFNLFFBQVEsQ0FBQyxPQUFPLFFBQVE7QUFDbkMsbUNBQTZCLE9BQU8sRUFBRSxLQUFVLE1BQU0sR0FBRyxPQUFPLE9BQU8sRUFBRSxFQUFFLEtBQUssQ0FBQyxFQUFFLE9BQU87QUFBQSxJQUM5RixDQUFDO0FBQ0QsV0FBTztBQUFBLEVBQ1g7QUFDQSxFQUFBRyxvQkFBbUIsU0FBUztBQUM1QixXQUFTLE9BQU8sT0FBT0YsU0FBUTtBQUMzQixVQUFNLFNBQVMsaUJBQWlCLGlCQUFBRCxRQUFJLFNBQVMsUUFBUSxpQkFBQUEsUUFBSSxPQUFPLE9BQU8sS0FBSztBQUM1RSxRQUFJLE1BQU1DLFlBQVcsU0FBWSxPQUFPLE1BQU0sT0FBTyxNQUFNQTtBQUMzRCxVQUFNLFVBQVUsNkJBQTZCO0FBQzdDLFdBQU8sT0FBTyxNQUFNLEtBQUs7QUFDckIsWUFBTSxNQUFNLE9BQU8sT0FBTztBQUMxQixjQUFRLFFBQVEsR0FBRztBQUFBLFFBQ2YsS0FBSztBQUNELGNBQUksUUFBUSxJQUFJO0FBQ1o7QUFBQSxVQUNKO0FBQ0Esa0JBQVEsT0FBTyxPQUFPLE9BQU87QUFDN0I7QUFBQSxRQUNKLEtBQUs7QUFDRCxjQUFJLFFBQVEsSUFBSTtBQUNaO0FBQUEsVUFDSjtBQUNBLGtCQUFRLGFBQWEsTUFBTSxPQUFPLE1BQU0sT0FBTyxRQUFRLE9BQU8sT0FBTyxDQUFDLENBQUM7QUFDdkU7QUFBQSxRQUNKLEtBQUs7QUFDRCxjQUFJLFFBQVEsSUFBSTtBQUNaO0FBQUEsVUFDSjtBQUNBLGdCQUFNLFNBQVMsNkJBQTZCLE9BQU8sUUFBUSxPQUFPLE9BQU8sQ0FBQztBQUMxRSxjQUFJLE9BQU8sVUFBVSxRQUFXO0FBQzVCLG9CQUFRLEtBQUssSUFBSSxPQUFPLEtBQUssT0FBTyxLQUFLO0FBQUEsVUFDN0M7QUFDQTtBQUFBLE1BQ1I7QUFDQSxXQUFLLE1BQU0sT0FBTyxLQUFLLFFBQVEsR0FBRztBQUM5QjtBQUFBLE1BQ0o7QUFDQSxhQUFPLFNBQVMsTUFBTSxDQUFDO0FBQUEsSUFDM0I7QUFDQSxXQUFPO0FBQUEsRUFDWDtBQUNBLEVBQUFFLG9CQUFtQixTQUFTO0FBQzVCLFdBQVMsU0FBUyxRQUFRO0FBQ3RCLFdBQU87QUFBQSxNQUNILE1BQU1ELE9BQU0sT0FBTyxJQUFJLElBQUksT0FBTyxPQUFPLElBQUksSUFBSTtBQUFBLE1BQ2pELFlBQVlBLE9BQU0sUUFBUSxVQUFVLElBQUksT0FBTyxhQUFhO0FBQUEsTUFDNUQsTUFBTUUsVUFBUyxPQUFPLElBQUksSUFDcEIsT0FBTyxRQUFRLE9BQU8sSUFBSSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxLQUFLLE1BQU07QUFDeEQsWUFBSSxJQUFJLE9BQU8sR0FBRyxHQUFHLGNBQWMsU0FBUyxLQUFLLENBQUM7QUFDbEQsZUFBTztBQUFBLE1BQ1gsR0FBRyxvQkFBSSxJQUFJLENBQUMsSUFDVixvQkFBSSxJQUFJO0FBQUEsSUFDbEI7QUFBQSxFQUNKO0FBQ0EsRUFBQUQsb0JBQW1CLFdBQVc7QUFDOUIsV0FBUyxPQUFPLFNBQVM7QUFDckIsVUFBTSxNQUFNLENBQUM7QUFDYixZQUFRLFNBQVMsV0FBYyxJQUFJLE9BQU8sUUFBUTtBQUNsRCxZQUFRLGVBQWUsV0FBYyxJQUFJLGFBQWEsUUFBUTtBQUM5RCxRQUFJLE9BQU8sQ0FBQztBQUNaLFFBQUksUUFBUSxNQUFNO0FBQ2QsY0FBUSxLQUFLLFFBQVEsQ0FBQyxHQUFHLE1BQU07QUFDM0IsWUFBSSxLQUFLLENBQUMsSUFBSSxjQUFjLE9BQU8sQ0FBQztBQUFBLE1BQ3hDLENBQUM7QUFBQSxJQUNMO0FBQ0EsV0FBTztBQUFBLEVBQ1g7QUFDQSxFQUFBQSxvQkFBbUIsU0FBUztBQUNoQyxHQUFHLHVCQUF1QixxQkFBcUIsQ0FBQyxFQUFFO0FBQ2xELFNBQVMseUNBQXlDO0FBQzlDLFNBQU8sRUFBRSxLQUFLLEdBQUcsT0FBTyxPQUFVO0FBQ3RDO0FBSU8sSUFBSTtBQUFBLENBQ1YsU0FBVUUsK0JBQThCO0FBQ3JDLFdBQVMsT0FBTyxTQUFTLFNBQVMsaUJBQUFMLFFBQUksT0FBTyxPQUFPLEdBQUc7QUFDbkQsUUFBSSxRQUFRLFFBQVEsR0FBRztBQUNuQixhQUFPLE9BQU8sQ0FBQyxFQUFFLE1BQU0sUUFBUSxHQUFHO0FBQUEsSUFDdEM7QUFDQSxRQUFJLFFBQVEsVUFBVSxRQUFXO0FBQzdCLG9CQUFjLE9BQU8sUUFBUSxPQUFPLE9BQU8sT0FBTyxFQUFFLEVBQUUsS0FBSyxDQUFDLEVBQUUsT0FBTztBQUFBLElBQ3pFO0FBQ0EsV0FBTztBQUFBLEVBQ1g7QUFDQSxFQUFBSyw4QkFBNkIsU0FBUztBQUN0QyxXQUFTLE9BQU8sT0FBT0osU0FBUTtBQUMzQixVQUFNLFNBQVMsaUJBQWlCLGlCQUFBRCxRQUFJLFNBQVMsUUFBUSxpQkFBQUEsUUFBSSxPQUFPLE9BQU8sS0FBSztBQUM1RSxRQUFJLE1BQU1DLFlBQVcsU0FBWSxPQUFPLE1BQU0sT0FBTyxNQUFNQTtBQUMzRCxVQUFNLFVBQVUsdUNBQXVDO0FBQ3ZELFdBQU8sT0FBTyxNQUFNLEtBQUs7QUFDckIsWUFBTSxNQUFNLE9BQU8sT0FBTztBQUMxQixjQUFRLFFBQVEsR0FBRztBQUFBLFFBQ2YsS0FBSztBQUNELGNBQUksUUFBUSxHQUFHO0FBQ1g7QUFBQSxVQUNKO0FBQ0Esa0JBQVEsTUFBTSxPQUFPLE1BQU07QUFDM0I7QUFBQSxRQUNKLEtBQUs7QUFDRCxjQUFJLFFBQVEsSUFBSTtBQUNaO0FBQUEsVUFDSjtBQUNBLGtCQUFRLFFBQVEsY0FBYyxPQUFPLFFBQVEsT0FBTyxPQUFPLENBQUM7QUFDNUQ7QUFBQSxNQUNSO0FBQ0EsV0FBSyxNQUFNLE9BQU8sS0FBSyxRQUFRLEdBQUc7QUFDOUI7QUFBQSxNQUNKO0FBQ0EsYUFBTyxTQUFTLE1BQU0sQ0FBQztBQUFBLElBQzNCO0FBQ0EsV0FBTztBQUFBLEVBQ1g7QUFDQSxFQUFBSSw4QkFBNkIsU0FBUztBQUN0QyxXQUFTLFNBQVMsUUFBUTtBQUN0QixXQUFPO0FBQUEsTUFDSCxLQUFLSCxPQUFNLE9BQU8sR0FBRyxJQUFJLE9BQU8sT0FBTyxHQUFHLElBQUk7QUFBQSxNQUM5QyxPQUFPQSxPQUFNLE9BQU8sS0FBSyxJQUFJLGNBQWMsU0FBUyxPQUFPLEtBQUssSUFBSTtBQUFBLElBQ3hFO0FBQUEsRUFDSjtBQUNBLEVBQUFHLDhCQUE2QixXQUFXO0FBQ3hDLFdBQVMsT0FBTyxTQUFTO0FBQ3JCLFVBQU0sTUFBTSxDQUFDO0FBQ2IsWUFBUSxRQUFRLFdBQWMsSUFBSSxNQUFNLEtBQUssTUFBTSxRQUFRLEdBQUc7QUFDOUQsWUFBUSxVQUFVLFdBQWMsSUFBSSxRQUFRLFFBQVEsUUFBUSxjQUFjLE9BQU8sUUFBUSxLQUFLLElBQUk7QUFDbEcsV0FBTztBQUFBLEVBQ1g7QUFDQSxFQUFBQSw4QkFBNkIsU0FBUztBQUMxQyxHQUFHLGlDQUFpQywrQkFBK0IsQ0FBQyxFQUFFO0FBQ3RFLFNBQVMsZ0NBQWdDO0FBQ3JDLFNBQU8sRUFBRSxTQUFTLEdBQUcsWUFBWSxDQUFDLEVBQUU7QUFDeEM7QUFJTyxJQUFJO0FBQUEsQ0FDVixTQUFVQyxzQkFBcUI7QUFDNUIsV0FBUyxPQUFPLFNBQVMsU0FBUyxpQkFBQU4sUUFBSSxPQUFPLE9BQU8sR0FBRztBQUNuRCxRQUFJLFFBQVEsWUFBWSxHQUFHO0FBQ3ZCLGFBQU8sT0FBTyxDQUFDLEVBQUUsTUFBTSxRQUFRLE9BQU87QUFBQSxJQUMxQztBQUNBLGVBQVcsS0FBSyxRQUFRLFlBQVk7QUFDaEMseUJBQW1CLE9BQU8sR0FBRyxPQUFPLE9BQU8sRUFBRSxFQUFFLEtBQUssQ0FBQyxFQUFFLE9BQU87QUFBQSxJQUNsRTtBQUNBLFdBQU87QUFBQSxFQUNYO0FBQ0EsRUFBQU0scUJBQW9CLFNBQVM7QUFDN0IsV0FBUyxPQUFPLE9BQU9MLFNBQVE7QUFDM0IsVUFBTSxTQUFTLGlCQUFpQixpQkFBQUQsUUFBSSxTQUFTLFFBQVEsaUJBQUFBLFFBQUksT0FBTyxPQUFPLEtBQUs7QUFDNUUsUUFBSSxNQUFNQyxZQUFXLFNBQVksT0FBTyxNQUFNLE9BQU8sTUFBTUE7QUFDM0QsVUFBTSxVQUFVLDhCQUE4QjtBQUM5QyxXQUFPLE9BQU8sTUFBTSxLQUFLO0FBQ3JCLFlBQU0sTUFBTSxPQUFPLE9BQU87QUFDMUIsY0FBUSxRQUFRLEdBQUc7QUFBQSxRQUNmLEtBQUs7QUFDRCxjQUFJLFFBQVEsR0FBRztBQUNYO0FBQUEsVUFDSjtBQUNBLGtCQUFRLFVBQVUsT0FBTyxNQUFNO0FBQy9CO0FBQUEsUUFDSixLQUFLO0FBQ0QsY0FBSSxRQUFRLElBQUk7QUFDWjtBQUFBLFVBQ0o7QUFDQSxrQkFBUSxXQUFXLEtBQUssbUJBQW1CLE9BQU8sUUFBUSxPQUFPLE9BQU8sQ0FBQyxDQUFDO0FBQzFFO0FBQUEsTUFDUjtBQUNBLFdBQUssTUFBTSxPQUFPLEtBQUssUUFBUSxHQUFHO0FBQzlCO0FBQUEsTUFDSjtBQUNBLGFBQU8sU0FBUyxNQUFNLENBQUM7QUFBQSxJQUMzQjtBQUNBLFdBQU87QUFBQSxFQUNYO0FBQ0EsRUFBQUsscUJBQW9CLFNBQVM7QUFDN0IsV0FBUyxTQUFTLFFBQVE7QUFDdEIsV0FBTztBQUFBLE1BQ0gsU0FBU0osT0FBTSxPQUFPLE9BQU8sSUFBSSxPQUFPLE9BQU8sT0FBTyxJQUFJO0FBQUEsTUFDMUQsWUFBWSxNQUFNLFFBQVEsUUFBUSxVQUFVLElBQ3RDLE9BQU8sV0FBVyxJQUFJLENBQUMsTUFBTSxtQkFBbUIsU0FBUyxDQUFDLENBQUMsSUFDM0QsQ0FBQztBQUFBLElBQ1g7QUFBQSxFQUNKO0FBQ0EsRUFBQUkscUJBQW9CLFdBQVc7QUFDL0IsV0FBUyxPQUFPLFNBQVM7QUFDckIsVUFBTSxNQUFNLENBQUM7QUFDYixZQUFRLFlBQVksV0FBYyxJQUFJLFVBQVUsS0FBSyxNQUFNLFFBQVEsT0FBTztBQUMxRSxRQUFJLFFBQVEsWUFBWTtBQUNwQixVQUFJLGFBQWEsUUFBUSxXQUFXLElBQUksQ0FBQyxNQUFNLElBQUksbUJBQW1CLE9BQU8sQ0FBQyxJQUFJLE1BQVM7QUFBQSxJQUMvRixPQUNLO0FBQ0QsVUFBSSxhQUFhLENBQUM7QUFBQSxJQUN0QjtBQUNBLFdBQU87QUFBQSxFQUNYO0FBQ0EsRUFBQUEscUJBQW9CLFNBQVM7QUFDakMsR0FBRyx3QkFBd0Isc0JBQXNCLENBQUMsRUFBRTtBQUNwRCxJQUFNQyxzQkFBcUIsTUFBTTtBQUM3QixNQUFJLE9BQU8sZUFBZSxhQUFhO0FBQ25DLFdBQU87QUFBQSxFQUNYO0FBQ0EsTUFBSSxPQUFPLFNBQVMsYUFBYTtBQUM3QixXQUFPO0FBQUEsRUFDWDtBQUNBLE1BQUksT0FBK0I7QUFDL0IsV0FBTztBQUFBLEVBQ1g7QUFDQSxNQUFJLE9BQU8sV0FBVyxhQUFhO0FBQy9CLFdBQU87QUFBQSxFQUNYO0FBQ0EsUUFBTTtBQUNWLEdBQUc7QUFDSCxTQUFTLGdCQUFnQixLQUFLO0FBQzFCLE1BQUlBLG1CQUFrQixRQUFRO0FBQzFCLFdBQU8sV0FBVyxLQUFLQSxtQkFBa0IsT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDO0FBQUEsRUFDdkUsT0FDSztBQUNELFVBQU0sTUFBTUEsbUJBQWtCLEtBQUssR0FBRztBQUN0QyxVQUFNLE1BQU0sSUFBSSxXQUFXLElBQUksTUFBTTtBQUNyQyxhQUFTLElBQUksR0FBRyxJQUFJLElBQUksUUFBUSxFQUFFLEdBQUc7QUFDakMsVUFBSSxDQUFDLElBQUksSUFBSSxXQUFXLENBQUM7QUFBQSxJQUM3QjtBQUNBLFdBQU87QUFBQSxFQUNYO0FBQ0o7QUFDQSxTQUFTLGdCQUFnQixLQUFLO0FBQzFCLE1BQUlBLG1CQUFrQixRQUFRO0FBQzFCLFdBQU9BLG1CQUFrQixPQUFPLEtBQUssR0FBRyxFQUFFLFNBQVMsUUFBUTtBQUFBLEVBQy9ELE9BQ0s7QUFDRCxVQUFNLE1BQU0sQ0FBQztBQUNiLFFBQUksUUFBUSxDQUFDLFNBQVM7QUFDbEIsVUFBSSxLQUFLLE9BQU8sYUFBYSxJQUFJLENBQUM7QUFBQSxJQUN0QyxDQUFDO0FBQ0QsV0FBT0EsbUJBQWtCLEtBQUssSUFBSSxLQUFLLEVBQUUsQ0FBQztBQUFBLEVBQzlDO0FBQ0o7QUFDQSxTQUFTSCxVQUFTLE9BQU87QUFDckIsU0FBTyxPQUFPLFVBQVUsWUFBWSxVQUFVO0FBQ2xEO0FBQ0EsU0FBU0YsT0FBTSxPQUFPO0FBQ2xCLFNBQU8sVUFBVSxRQUFRLFVBQVU7QUFDdkM7OztBRWhVTyxJQUFJO0FBQUEsQ0FDVixTQUFVTSxZQUFXO0FBRWxCLFdBQVMsU0FBUyxRQUFRO0FBQ3RCLFdBQU8sb0JBQW9CLFNBQVMsTUFBTTtBQUFBLEVBQzlDO0FBQ0EsRUFBQUEsV0FBVSxXQUFXO0FBRXJCLFdBQVMsV0FBVyxRQUFRO0FBQ3hCLFdBQU8sb0JBQW9CLE9BQU8sTUFBTTtBQUFBLEVBQzVDO0FBQ0EsRUFBQUEsV0FBVSxhQUFhO0FBRXZCLFdBQVMsT0FBTyxXQUFXO0FBQ3ZCLFdBQU8sb0JBQW9CLE9BQU8sU0FBUztBQUFBLEVBQy9DO0FBQ0EsRUFBQUEsV0FBVSxTQUFTO0FBRW5CLFdBQVMsU0FBUyxXQUFXO0FBQ3pCLFdBQU8sb0JBQW9CLE9BQU8sU0FBUyxFQUFFLE9BQU87QUFBQSxFQUN4RDtBQUNBLEVBQUFBLFdBQVUsV0FBVztBQVNQLFdBQVMsU0FBU0MsU0FBUSxlQUFlQyxvQkFBbUIsVUFBVSxDQUFDLEdBQUc7QUFDcEYsc0JBQWtCRCxTQUFRLGVBQWVDLG9CQUFtQixPQUFPO0FBQUEsRUFDdkU7QUFDQSxFQUFBRixXQUFVLFdBQVc7QUFTUCxXQUFTLHdCQUF3QixLQUFLLE1BQU0sS0FBSztBQUMzRCxXQUFPLGlCQUFpQixLQUFLLEdBQUc7QUFBQSxFQUNwQztBQUNBLEVBQUFBLFdBQVUsMEJBQTBCO0FBQ3hDLEdBQUcsY0FBYyxZQUFZLENBQUMsRUFBRTs7O0FDckN6QixJQUFNRyxhQUEyQixnQkFBVyxVQUFVLE1BQU07QUFDNUQsSUFBTUMsWUFBMEIsZ0JBQVdBLFVBQVMsTUFBTTtBQUMxRCxJQUFNQyxZQUEwQixnQkFBV0EsVUFBUyxNQUFNO0FBQzFELElBQU1DLGdCQUE4QixnQkFBV0EsY0FBYSxNQUFNO0FBQ2xFLElBQU1DLGdCQUE4QixnQkFBV0EsY0FBYSxNQUFNO0FBQ2xFLElBQU1DLFFBQWtCLEtBQUssTUFBTTtBQUNuQyxJQUFNQyxTQUF1QixnQkFBV0EsT0FBTSxNQUFNO0FBTXBELElBQU1DLGtCQUFnQyxnQkFBVyxlQUFlLE1BQU07QUFLdEUsSUFBTUMsaUJBQStCLGdCQUFXLGNBQWMsTUFBTTtBQUtwRSxJQUFNQyxpQkFBK0IsZ0JBQVcsY0FBYyxNQUFNOzs7QUNyQ3BFLElBQU0sZUFBZSxJQUFJO0FBS3pCLElBQU0sZ0JBQWdCO0FBS3RCLElBQU0sVUFBVTtBQUtoQixJQUFNLFVBQVUsS0FBSyxLQUFLO0FBSzFCLElBQU0sVUFBVSxPQUFPLEtBQUssS0FBSzs7O0FDcEJqQyxJQUFJO0FBQUEsQ0FDVixTQUFVQyxTQUFRO0FBSWYsRUFBQUEsUUFBTyxRQUFRLEtBQUssS0FBSztBQVF6QixXQUFTLGNBQWMsR0FBRyxHQUFHLFVBQVUsYUFBYztBQUNqRCxVQUFNLE1BQU0sSUFBSTtBQUNoQixXQUFPLENBQUMsV0FBVyxPQUFPLE9BQU87QUFBQSxFQUNyQztBQUNBLEVBQUFBLFFBQU8sZ0JBQWdCO0FBTXZCLFdBQVMsTUFBTSxHQUFHO0FBQ2QsVUFBTSxNQUFNLEVBQUUsU0FBUyxFQUFFO0FBQ3pCLFFBQUksS0FBSyxJQUFJO0FBQ1QsY0FBUSxNQUFNLEtBQUssWUFBWTtBQUFBLElBQ25DO0FBQ0EsV0FBTyxJQUFJLFlBQVk7QUFBQSxFQUMzQjtBQUNBLEVBQUFBLFFBQU8sUUFBUTtBQU1mLFdBQVMsS0FBSyxPQUFPO0FBQ2pCLFVBQU0sU0FBUyxDQUFDO0FBQ2hCLFFBQUksV0FBVyxLQUFLLE1BQU0sTUFBTSxHQUFHO0FBQy9CLGFBQU87QUFBQSxJQUNYO0FBQ0EsV0FBTyxTQUFTLElBQUksSUFBSTtBQUFBLEVBQzVCO0FBQ0EsRUFBQUEsUUFBTyxPQUFPO0FBVWQsV0FBUyxNQUFNLE9BQU8sTUFBTSxHQUFHLE1BQU0sR0FBRztBQUNwQyxXQUFPLEtBQUssSUFBSSxLQUFLLEtBQUssSUFBSSxLQUFLLEtBQUssQ0FBQztBQUFBLEVBQzdDO0FBQ0EsRUFBQUEsUUFBTyxRQUFRO0FBTWYsV0FBUyxLQUFLLE9BQU87QUFDakIsV0FBTyxLQUFLLElBQUksS0FBSyxJQUFJLEtBQUs7QUFBQSxFQUNsQztBQUNBLEVBQUFBLFFBQU8sT0FBTztBQVlkLFdBQVMsT0FBTyxPQUFPQyxTQUFRO0FBQzNCLFdBQU8sUUFBUSxLQUFLLE1BQU0sUUFBUUEsT0FBTSxJQUFJQTtBQUFBLEVBQ2hEO0FBQ0EsRUFBQUQsUUFBTyxTQUFTO0FBUWhCLFdBQVMsVUFBVSxPQUFPLEtBQUssS0FBSztBQUNoQyxZQUFRLFFBQVEsUUFBUSxNQUFNO0FBQUEsRUFDbEM7QUFDQSxFQUFBQSxRQUFPLFlBQVk7QUFRbkIsV0FBUyxZQUFZLFlBQVksS0FBSyxLQUFLO0FBQ3ZDLFdBQU8sY0FBYyxNQUFNLE9BQU87QUFBQSxFQUN0QztBQUNBLEVBQUFBLFFBQU8sY0FBYztBQU9yQixXQUFTLFdBQVcsU0FBUyxRQUFRO0FBQ2pDLFFBQUksTUFBTSxPQUFPLFNBQVMsU0FBUyxHQUFLO0FBQ3hDLFFBQUksTUFBTSxLQUFPO0FBQ2IsYUFBTztBQUFBLElBQ1g7QUFDQSxXQUFPO0FBQUEsRUFDWDtBQUNBLEVBQUFBLFFBQU8sYUFBYTtBQU9wQixXQUFTLFNBQVMsSUFBSUMsU0FBUTtBQUMxQixVQUFNLElBQUksT0FBTyxJQUFJQSxVQUFTLENBQUc7QUFDakMsV0FBT0EsVUFBUyxLQUFLLElBQUksSUFBSUEsT0FBTTtBQUFBLEVBQ3ZDO0FBQ0EsRUFBQUQsUUFBTyxXQUFXO0FBV2xCLFdBQVMsV0FBVyxNQUFNLElBQUksSUFBSTtBQUM5QixRQUFJLElBQUksTUFBTSxFQUFFO0FBQ2hCLFFBQUksS0FBTyxJQUFJLElBQUksSUFBSSxJQUFNLElBQUk7QUFDakMsV0FBTyxLQUFLLElBQUksUUFBUSxJQUFNO0FBQUEsRUFDbEM7QUFDQSxFQUFBQSxRQUFPLGFBQWE7QUFXcEIsV0FBUyxZQUFZLFNBQVMsUUFBUSxVQUFVO0FBQzVDLFFBQUksU0FBUztBQUNiLFFBQUksS0FBSyxJQUFJLFNBQVMsT0FBTyxLQUFLLFVBQVU7QUFDeEMsZUFBUztBQUFBLElBQ2IsT0FDSztBQUNELGVBQVMsVUFBVSxLQUFLLFNBQVMsT0FBTyxJQUFJO0FBQUEsSUFDaEQ7QUFDQSxXQUFPO0FBQUEsRUFDWDtBQUNBLEVBQUFBLFFBQU8sY0FBYztBQVdyQixXQUFTLGlCQUFpQixTQUFTLFFBQVEsVUFBVTtBQUNqRCxVQUFNLE1BQU0sV0FBVyxTQUFTLE1BQU07QUFDdEMsUUFBSSxTQUFTO0FBQ2IsUUFBSSxDQUFDLFdBQVcsT0FBTyxNQUFNLFVBQVU7QUFDbkMsZUFBUztBQUFBLElBQ2IsT0FDSztBQUNELGVBQVMsWUFBWSxTQUFTLFVBQVUsS0FBSyxRQUFRO0FBQUEsSUFDekQ7QUFDQSxXQUFPO0FBQUEsRUFDWDtBQUNBLEVBQUFBLFFBQU8sbUJBQW1CO0FBUTFCLFdBQVMsS0FBSyxPQUFPLEtBQUssUUFBUTtBQUM5QixXQUFPLFNBQVMsTUFBTSxTQUFTO0FBQUEsRUFDbkM7QUFDQSxFQUFBQSxRQUFPLE9BQU87QUFTZCxXQUFTLFVBQVUsT0FBTyxLQUFLLFFBQVE7QUFDbkMsUUFBSSxNQUFNLE9BQU8sTUFBTSxPQUFPLEdBQUs7QUFDbkMsUUFBSSxNQUFNLEtBQU87QUFDYixhQUFPO0FBQUEsSUFDWDtBQUNBLFdBQU8sUUFBUSxNQUFNLE1BQU0sTUFBTTtBQUFBLEVBQ3JDO0FBQ0EsRUFBQUEsUUFBTyxZQUFZO0FBUW5CLFdBQVMsWUFBWSxHQUFHLEdBQUcsT0FBTztBQUM5QixRQUFJLFNBQVM7QUFDYixRQUFJLE1BQU0sR0FBRztBQUNULGVBQVMsT0FBTyxRQUFRLE1BQU0sSUFBSSxFQUFFO0FBQUEsSUFDeEMsT0FDSztBQUNELGVBQVM7QUFBQSxJQUNiO0FBQ0EsV0FBTztBQUFBLEVBQ1g7QUFDQSxFQUFBQSxRQUFPLGNBQWM7QUFXckIsV0FBUyxRQUFRLFFBQVEsVUFBVSxRQUFRLFVBQVUsUUFBUTtBQUN6RCxVQUFNLFVBQVUsU0FBUztBQUN6QixVQUFNLFFBQVEsU0FBUztBQUN2QixVQUFNLFFBQVEsSUFBTSxRQUFRLElBQU0sVUFBVTtBQUM1QyxVQUFNLFFBQVEsS0FBTyxRQUFRLElBQU07QUFDbkMsVUFBTSxRQUFRLFFBQVEsSUFBTSxVQUFVO0FBQ3RDLFVBQU0sUUFBUSxRQUFRO0FBQ3RCLFdBQU8sU0FBUyxRQUFRLFNBQVMsUUFBUSxXQUFXLFFBQVEsV0FBVztBQUFBLEVBQzNFO0FBQ0EsRUFBQUEsUUFBTyxVQUFVO0FBT2pCLFdBQVMsWUFBWSxLQUFLLEtBQUs7QUFDM0IsUUFBSSxRQUFRLEtBQUs7QUFDYixhQUFPO0FBQUEsSUFDWDtBQUNBLFdBQU8sS0FBSyxPQUFPLEtBQUssTUFBTSxPQUFPO0FBQUEsRUFDekM7QUFDQSxFQUFBQSxRQUFPLGNBQWM7QUFXckIsV0FBUyxlQUFlLEtBQUssS0FBSyxLQUFLO0FBQ25DLFlBQVEsTUFBTSxRQUFRLE1BQU07QUFBQSxFQUNoQztBQUNBLEVBQUFBLFFBQU8saUJBQWlCO0FBVXhCLFdBQVMsZUFBZSxTQUFTLEtBQUssS0FBSztBQUN2QyxZQUFRLE1BQU0sT0FBTyxVQUFVO0FBQUEsRUFDbkM7QUFDQSxFQUFBQSxRQUFPLGlCQUFpQjtBQU14QixXQUFTLGlCQUFpQixPQUFPO0FBVzdCLFdBQU8sUUFBUUEsUUFBTyxRQUFRLEtBQUssT0FBTyxRQUFRLEtBQUssTUFBTUEsUUFBTyxLQUFLO0FBQUEsRUFDN0U7QUFDQSxFQUFBQSxRQUFPLG1CQUFtQjtBQUM5QixHQUFHLFdBQVcsU0FBUyxDQUFDLEVBQUU7OztBQ3pTbkIsSUFBSUU7QUFBQSxDQUNWLFNBQVVBLFVBQVM7QUFLaEIsV0FBUyxhQUFhLFFBQVE7QUFDMUIsVUFBTSxPQUFPLEtBQUssSUFBSSxPQUFPLENBQUM7QUFDOUIsVUFBTSxPQUFPLEtBQUssSUFBSSxPQUFPLENBQUM7QUFDOUIsUUFBSSxTQUFTLE1BQU07QUFDZixhQUFPO0FBQUEsSUFDWDtBQUNBLFVBQU0sT0FBTyxLQUFLLElBQUksT0FBTyxDQUFDO0FBQzlCLFFBQUksU0FBUyxNQUFNO0FBQ2YsYUFBTztBQUFBLElBQ1g7QUFDQSxXQUFPO0FBQUEsRUFDWDtBQUNBLEVBQUFBLFNBQVEsZUFBZTtBQU92QixXQUFTLE9BSVQsSUFBSSxHQUlKLElBQUksR0FJSixJQUFJLEdBQUc7QUFDSCxXQUFPLEVBQUUsR0FBRyxHQUFHLEVBQUU7QUFBQSxFQUNyQjtBQUNBLEVBQUFBLFNBQVEsU0FBUztBQU9qQixXQUFTQyxLQUFJLFNBQVMsU0FBUztBQUMzQixXQUFPO0FBQUEsTUFDSCxHQUFHLFFBQVEsSUFBSSxRQUFRO0FBQUEsTUFDdkIsR0FBRyxRQUFRLElBQUksUUFBUTtBQUFBLE1BQ3ZCLEdBQUcsUUFBUSxJQUFJLFFBQVE7QUFBQSxJQUMzQjtBQUFBLEVBQ0o7QUFDQSxFQUFBRCxTQUFRLE1BQU1DO0FBTWQsV0FBUyxTQUFTLFNBQVMsU0FBUyxRQUFRO0FBQ3hDLFdBQU8sSUFBSSxRQUFRLElBQUksUUFBUTtBQUMvQixXQUFPLElBQUksUUFBUSxJQUFJLFFBQVE7QUFDL0IsV0FBTyxJQUFJLFFBQVEsSUFBSSxRQUFRO0FBQUEsRUFDbkM7QUFDQSxFQUFBRCxTQUFRLFdBQVc7QUFLbkIsV0FBU0UsVUFBUyxTQUFTLFNBQVM7QUFDaEMsV0FBTztBQUFBLE1BQ0gsR0FBRyxRQUFRLElBQUksUUFBUTtBQUFBLE1BQ3ZCLEdBQUcsUUFBUSxJQUFJLFFBQVE7QUFBQSxNQUN2QixHQUFHLFFBQVEsSUFBSSxRQUFRO0FBQUEsSUFDM0I7QUFBQSxFQUNKO0FBQ0EsRUFBQUYsU0FBUSxXQUFXRTtBQUtuQixXQUFTLGNBQWMsU0FBUyxTQUFTLFFBQVE7QUFDN0MsV0FBTyxJQUFJLFFBQVEsSUFBSSxRQUFRO0FBQy9CLFdBQU8sSUFBSSxRQUFRLElBQUksUUFBUTtBQUMvQixXQUFPLElBQUksUUFBUSxJQUFJLFFBQVE7QUFBQSxFQUNuQztBQUNBLEVBQUFGLFNBQVEsZ0JBQWdCO0FBUXhCLFdBQVMsd0JBQXdCLFNBQVMsR0FBRyxHQUFHLEdBQUcsUUFBUTtBQUN2RCxXQUFPLElBQUksUUFBUSxJQUFJO0FBQ3ZCLFdBQU8sSUFBSSxRQUFRLElBQUk7QUFDdkIsV0FBTyxJQUFJLFFBQVEsSUFBSTtBQUFBLEVBQzNCO0FBQ0EsRUFBQUEsU0FBUSwwQkFBMEI7QUFLbEMsV0FBU0csUUFBTyxPQUFPO0FBQ25CLFdBQU8sRUFBRSxHQUFHLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRTtBQUFBLEVBQ25EO0FBQ0EsRUFBQUgsU0FBUSxTQUFTRztBQUtqQixXQUFTLFNBQVMsUUFBUSxNQUFNO0FBQzVCLFNBQUssSUFBSSxPQUFPO0FBQ2hCLFNBQUssSUFBSSxPQUFPO0FBQ2hCLFNBQUssSUFBSSxPQUFPO0FBQUEsRUFDcEI7QUFDQSxFQUFBSCxTQUFRLFdBQVc7QUFRbkIsV0FBUyxlQUFlLEdBQUcsR0FBRyxHQUFHLE1BQU07QUFDbkMsU0FBSyxJQUFJO0FBQ1QsU0FBSyxJQUFJO0FBQ1QsU0FBSyxJQUFJO0FBQUEsRUFDYjtBQUNBLEVBQUFBLFNBQVEsaUJBQWlCO0FBS3pCLFdBQVNJLE9BQU0sUUFBUTtBQUNuQixXQUFPLE9BQU8sT0FBTyxHQUFHLE9BQU8sR0FBRyxPQUFPLENBQUM7QUFBQSxFQUM5QztBQUNBLEVBQUFKLFNBQVEsUUFBUUk7QUFTaEIsV0FBUyxjQUFjLFNBQVMsU0FBUyxNQUFNLE1BQU07QUFDakQsVUFBTSxLQUFLLElBQUksU0FBUyxJQUFJLElBQUk7QUFDaEMsVUFBTSxLQUFLLElBQUksU0FBUyxJQUFJLElBQUk7QUFDaEMsVUFBTSxJQUFJLE1BQU0sS0FBSztBQUNyQixXQUFPO0FBQUEsRUFDWDtBQUNBLEVBQUFKLFNBQVEsZ0JBQWdCO0FBUXhCLFdBQVMsdUJBQXVCLFNBQVMsU0FBUyxRQUFRO0FBQ3RELFVBQU0sS0FBSyxVQUFVLE9BQU87QUFDNUIsVUFBTSxLQUFLLFVBQVUsT0FBTztBQUM1QixVQUFNLFVBQVUsSUFBSSxJQUFJLEVBQUU7QUFDMUIsVUFBTSxJQUFJLE9BQU87QUFDakIsZUFBVyxJQUFJLElBQUksQ0FBQztBQUNwQixRQUFJLElBQUksR0FBRyxNQUFNLElBQUksR0FBRztBQUNwQixhQUFPLEtBQUssS0FBSyxPQUFPO0FBQUEsSUFDNUI7QUFDQSxXQUFPLENBQUMsS0FBSyxLQUFLLE9BQU87QUFBQSxFQUM3QjtBQUNBLEVBQUFBLFNBQVEseUJBQXlCO0FBT2pDLFdBQVMsVUFBVSxPQUFPLFNBQVMsR0FBRztBQUNsQyxXQUFPLE9BQU8sTUFBTSxNQUFNLEdBQUcsTUFBTSxTQUFTLENBQUMsR0FBRyxNQUFNLFNBQVMsQ0FBQyxDQUFDO0FBQUEsRUFDckU7QUFDQSxFQUFBQSxTQUFRLFlBQVk7QUFRcEIsV0FBUyxlQUFlLE9BQU8sUUFBUTtBQUNuQyxXQUFPLFVBQVUsT0FBTyxNQUFNO0FBQUEsRUFDbEM7QUFDQSxFQUFBQSxTQUFRLGlCQUFpQjtBQU96QixXQUFTLGVBQWUsT0FBTyxRQUFRLFFBQVE7QUFDM0MsV0FBTyxJQUFJLE1BQU0sTUFBTTtBQUN2QixXQUFPLElBQUksTUFBTSxTQUFTLENBQUM7QUFDM0IsV0FBTyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBQUEsRUFDL0I7QUFDQSxFQUFBQSxTQUFRLGlCQUFpQjtBQVF6QixXQUFTLG9CQUFvQixPQUFPLFFBQVEsUUFBUTtBQUNoRCxXQUFPLGVBQWUsT0FBTyxRQUFRLE1BQU07QUFBQSxFQUMvQztBQUNBLEVBQUFBLFNBQVEsc0JBQXNCO0FBTTlCLFdBQVNLLFFBQU8sUUFBUTtBQUNwQixXQUFPLEtBQUssS0FBSyxPQUFPLElBQUksT0FBTyxJQUFJLE9BQU8sSUFBSSxPQUFPLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQztBQUFBLEVBQ3BGO0FBQ0EsRUFBQUwsU0FBUSxTQUFTSztBQUtqQixXQUFTLGNBQWMsUUFBUTtBQUMzQixXQUFPLE9BQU8sSUFBSSxPQUFPLElBQUksT0FBTyxJQUFJLE9BQU8sSUFBSSxPQUFPLElBQUksT0FBTztBQUFBLEVBQ3pFO0FBQ0EsRUFBQUwsU0FBUSxnQkFBZ0I7QUFNeEIsV0FBUyxXQUFXLFFBQVFNLFFBQU8sUUFBUTtBQUN2QyxXQUFPLElBQUksT0FBTyxJQUFJQTtBQUN0QixXQUFPLElBQUksT0FBTyxJQUFJQTtBQUN0QixXQUFPLElBQUksT0FBTyxJQUFJQTtBQUFBLEVBQzFCO0FBQ0EsRUFBQU4sU0FBUSxhQUFhO0FBTXJCLFdBQVMsTUFBTSxRQUFRTSxRQUFPO0FBQzFCLFdBQU8sT0FBTyxPQUFPLElBQUlBLFFBQU8sT0FBTyxJQUFJQSxRQUFPLE9BQU8sSUFBSUEsTUFBSztBQUFBLEVBQ3RFO0FBQ0EsRUFBQU4sU0FBUSxRQUFRO0FBT2hCLFdBQVMsb0JBQW9CLFFBQVEsS0FBSztBQUN0QyxVQUFNLFNBQVMsT0FBTyxHQUFHLEdBQUcsQ0FBQztBQUM3Qiw2QkFBeUIsUUFBUSxLQUFLLE1BQU07QUFDNUMsV0FBTztBQUFBLEVBQ1g7QUFDQSxFQUFBQSxTQUFRLHNCQUFzQjtBQU85QixXQUFTLHlCQUF5QixRQUFRLEtBQUssUUFBUTtBQUNuRCxRQUFJLFFBQVEsS0FBSyxRQUFRLEdBQUs7QUFDMUIsZUFBUyxRQUFRLE1BQU07QUFDdkI7QUFBQSxJQUNKO0FBQ0EsZUFBVyxRQUFRLElBQU0sS0FBSyxNQUFNO0FBQUEsRUFDeEM7QUFDQSxFQUFBQSxTQUFRLDJCQUEyQjtBQU1uQyxXQUFTLFVBQVUsUUFBUTtBQUN2QixXQUFPLG9CQUFvQixRQUFRSyxRQUFPLE1BQU0sQ0FBQztBQUFBLEVBQ3JEO0FBQ0EsRUFBQUwsU0FBUSxZQUFZO0FBTXBCLFdBQVMsZUFBZSxRQUFRLFFBQVE7QUFDcEMsNkJBQXlCLFFBQVFLLFFBQU8sTUFBTSxHQUFHLE1BQU07QUFBQSxFQUMzRDtBQUNBLEVBQUFMLFNBQVEsaUJBQWlCO0FBT3pCLFdBQVMsSUFBSSxNQUFNLE9BQU87QUFDdEIsV0FBTyxLQUFLLElBQUksTUFBTSxJQUFJLEtBQUssSUFBSSxNQUFNLElBQUksS0FBSyxJQUFJLE1BQU07QUFBQSxFQUNoRTtBQUNBLEVBQUFBLFNBQVEsTUFBTTtBQU1kLFdBQVMsYUFBYSxRQUFRLFFBQVE7QUFDbEMsVUFBTSxTQUFTSSxPQUFNLE1BQU07QUFDM0Isc0JBQWtCLFFBQVEsUUFBUSxNQUFNO0FBQ3hDLFdBQU87QUFBQSxFQUNYO0FBQ0EsRUFBQUosU0FBUSxlQUFlO0FBTXZCLFdBQVMsa0JBQWtCLFFBQVEsUUFBUSxRQUFRO0FBQy9DLFVBQU0sRUFBRSxHQUFHLEdBQUcsRUFBRSxJQUFJO0FBQ3BCLFVBQU0sSUFBSSxPQUFPO0FBQ2pCLFVBQU0sSUFBSSxLQUFLLEVBQUUsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLElBQUksSUFBSSxFQUFFLEVBQUUsSUFBSSxJQUFJLEVBQUUsRUFBRTtBQUNyRCxXQUFPLEtBQUssRUFBRSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxJQUFJLElBQUksRUFBRSxFQUFFLEtBQUs7QUFDdEQsV0FBTyxLQUFLLEVBQUUsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsSUFBSSxJQUFJLEVBQUUsRUFBRSxLQUFLO0FBQ3RELFdBQU8sS0FBSyxFQUFFLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxJQUFJLElBQUksRUFBRSxFQUFFLElBQUksSUFBSSxFQUFFLEVBQUUsS0FBSztBQUFBLEVBQzNEO0FBQ0EsRUFBQUEsU0FBUSxvQkFBb0I7QUFNNUIsV0FBUyxPQUFPLFFBQVEsR0FBRztBQUN2QixVQUFNLFNBQVMsT0FBTztBQUN0QixnQkFBWSxRQUFRLEdBQUcsTUFBTTtBQUM3QixXQUFPO0FBQUEsRUFDWDtBQUNBLEVBQUFBLFNBQVEsU0FBUztBQU9qQixXQUFTLFlBQVksUUFBUSxHQUFHLFFBQVE7QUFDcEMsVUFBTSxFQUFFLEdBQUcsR0FBRyxFQUFFLElBQUk7QUFDcEIsVUFBTSxFQUFFLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsR0FBRyxJQUFJO0FBRXZDLFVBQU0sS0FBSyxLQUFLLElBQUksS0FBSyxJQUFJLEtBQUs7QUFDbEMsVUFBTSxLQUFLLEtBQUssSUFBSSxLQUFLLElBQUksS0FBSztBQUNsQyxVQUFNLEtBQUssS0FBSyxJQUFJLEtBQUssSUFBSSxLQUFLO0FBQ2xDLFVBQU0sS0FBSyxDQUFDLEtBQUssSUFBSSxLQUFLLElBQUksS0FBSztBQUVuQyxXQUFPLElBQUksS0FBSyxLQUFLLEtBQUssQ0FBQyxLQUFLLEtBQUssQ0FBQyxLQUFLLEtBQUssQ0FBQztBQUNqRCxXQUFPLElBQUksS0FBSyxLQUFLLEtBQUssQ0FBQyxLQUFLLEtBQUssQ0FBQyxLQUFLLEtBQUssQ0FBQztBQUNqRCxXQUFPLElBQUksS0FBSyxLQUFLLEtBQUssQ0FBQyxLQUFLLEtBQUssQ0FBQyxLQUFLLEtBQUssQ0FBQztBQUFBLEVBQ3JEO0FBQ0EsRUFBQUEsU0FBUSxjQUFjO0FBUXRCLFdBQVMsS0FBSyxPQUFPLEtBQUssUUFBUTtBQUM5QixVQUFNLFNBQVMsT0FBTyxHQUFHLEdBQUcsQ0FBQztBQUM3QixjQUFVLE9BQU8sS0FBSyxRQUFRLE1BQU07QUFDcEMsV0FBTztBQUFBLEVBQ1g7QUFDQSxFQUFBQSxTQUFRLE9BQU87QUFRZixXQUFTLFVBQVUsT0FBTyxLQUFLLFFBQVEsUUFBUTtBQUMzQyxXQUFPLElBQUksTUFBTSxLQUFLLElBQUksSUFBSSxNQUFNLEtBQUs7QUFDekMsV0FBTyxJQUFJLE1BQU0sS0FBSyxJQUFJLElBQUksTUFBTSxLQUFLO0FBQ3pDLFdBQU8sSUFBSSxNQUFNLEtBQUssSUFBSSxJQUFJLE1BQU0sS0FBSztBQUFBLEVBQzdDO0FBQ0EsRUFBQUEsU0FBUSxZQUFZO0FBUXBCLFdBQVMsTUFBTSxNQUFNLE9BQU87QUFDeEIsVUFBTSxTQUFTLEtBQUs7QUFDcEIsZUFBVyxNQUFNLE9BQU8sTUFBTTtBQUM5QixXQUFPO0FBQUEsRUFDWDtBQUNBLEVBQUFBLFNBQVEsUUFBUTtBQVFoQixXQUFTLFdBQVcsTUFBTSxPQUFPLFFBQVE7QUFDckMsV0FBTyxJQUFJLEtBQUssSUFBSSxNQUFNLElBQUksS0FBSyxJQUFJLE1BQU07QUFDN0MsV0FBTyxJQUFJLEtBQUssSUFBSSxNQUFNLElBQUksS0FBSyxJQUFJLE1BQU07QUFDN0MsV0FBTyxJQUFJLEtBQUssSUFBSSxNQUFNLElBQUksS0FBSyxJQUFJLE1BQU07QUFBQSxFQUNqRDtBQUNBLEVBQUFBLFNBQVEsYUFBYTtBQVFyQixXQUFTLHFCQUFxQixRQUFRLGdCQUFnQjtBQUNsRCxVQUFNLFNBQVMsS0FBSztBQUNwQiw4QkFBMEIsUUFBUSxnQkFBZ0IsTUFBTTtBQUN4RCxXQUFPO0FBQUEsRUFDWDtBQUNBLEVBQUFBLFNBQVEsdUJBQXVCO0FBUS9CLFdBQVMsMEJBQTBCLFFBQVEsZ0JBQWdCLFFBQVE7QUFDL0QsV0FBTyxvQ0FBb0MsT0FBTyxHQUFHLE9BQU8sR0FBRyxPQUFPLEdBQUcsZ0JBQWdCLE1BQU07QUFBQSxFQUNuRztBQUNBLEVBQUFBLFNBQVEsNEJBQTRCO0FBVXBDLFdBQVMsb0NBQW9DLEdBQUcsR0FBRyxHQUFHLGdCQUFnQixRQUFRO0FBQzFFLFVBQU0sSUFBSSxlQUFlO0FBQ3pCLFVBQU0sS0FBSyxJQUFJLEVBQUUsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUU7QUFDaEQsVUFBTSxLQUFLLElBQUksRUFBRSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRTtBQUNoRCxVQUFNLEtBQUssSUFBSSxFQUFFLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxJQUFJLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFO0FBQ2pELFVBQU0sS0FBSyxLQUFLLElBQUksRUFBRSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsSUFBSSxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRTtBQUN0RCxXQUFPLElBQUksS0FBSztBQUNoQixXQUFPLElBQUksS0FBSztBQUNoQixXQUFPLElBQUksS0FBSztBQUFBLEVBQ3BCO0FBQ0EsRUFBQUEsU0FBUSxzQ0FBc0M7QUFROUMsV0FBUyxnQkFBZ0IsUUFBUSxnQkFBZ0I7QUFDN0MsVUFBTSxTQUFTLEtBQUs7QUFDcEIseUJBQXFCLFFBQVEsZ0JBQWdCLE1BQU07QUFDbkQsV0FBTztBQUFBLEVBQ1g7QUFDQSxFQUFBQSxTQUFRLGtCQUFrQjtBQVExQixXQUFTLHFCQUFxQixRQUFRLGdCQUFnQixRQUFRO0FBQzFELG1DQUErQixPQUFPLEdBQUcsT0FBTyxHQUFHLE9BQU8sR0FBRyxnQkFBZ0IsTUFBTTtBQUFBLEVBQ3ZGO0FBQ0EsRUFBQUEsU0FBUSx1QkFBdUI7QUFVL0IsV0FBUywrQkFBK0IsR0FBRyxHQUFHLEdBQUcsZ0JBQWdCLFFBQVE7QUFDckUsVUFBTSxJQUFJLGVBQWU7QUFDekIsV0FBTyxJQUFJLElBQUksRUFBRSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztBQUN4QyxXQUFPLElBQUksSUFBSSxFQUFFLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDO0FBQ3hDLFdBQU8sSUFBSSxJQUFJLEVBQUUsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLElBQUksSUFBSSxFQUFFLEVBQUU7QUFBQSxFQUM3QztBQUNBLEVBQUFBLFNBQVEsaUNBQWlDO0FBVXpDLFdBQVMsV0FBVyxRQUFRLFFBQVEsUUFBUSxRQUFRLFFBQVE7QUFDeEQsVUFBTSxVQUFVLFNBQVM7QUFDekIsVUFBTSxRQUFRLFNBQVM7QUFDdkIsVUFBTSxJQUFJLE9BQ0wsSUFBTSxPQUFPLEtBQ1QsQ0FBQyxPQUFPLElBQUksT0FBTyxLQUFLLFVBQ3hCLElBQU0sT0FBTyxJQUFJLElBQU0sT0FBTyxJQUFJLElBQU0sT0FBTyxJQUFJLE9BQU8sS0FDdkQsV0FDSCxDQUFDLE9BQU8sSUFBSSxJQUFNLE9BQU8sSUFBSSxJQUFNLE9BQU8sSUFBSSxPQUFPLEtBQUs7QUFDbkUsVUFBTSxJQUFJLE9BQ0wsSUFBTSxPQUFPLEtBQ1QsQ0FBQyxPQUFPLElBQUksT0FBTyxLQUFLLFVBQ3hCLElBQU0sT0FBTyxJQUFJLElBQU0sT0FBTyxJQUFJLElBQU0sT0FBTyxJQUFJLE9BQU8sS0FDdkQsV0FDSCxDQUFDLE9BQU8sSUFBSSxJQUFNLE9BQU8sSUFBSSxJQUFNLE9BQU8sSUFBSSxPQUFPLEtBQUs7QUFDbkUsVUFBTSxJQUFJLE9BQ0wsSUFBTSxPQUFPLEtBQ1QsQ0FBQyxPQUFPLElBQUksT0FBTyxLQUFLLFVBQ3hCLElBQU0sT0FBTyxJQUFJLElBQU0sT0FBTyxJQUFJLElBQU0sT0FBTyxJQUFJLE9BQU8sS0FDdkQsV0FDSCxDQUFDLE9BQU8sSUFBSSxJQUFNLE9BQU8sSUFBSSxJQUFNLE9BQU8sSUFBSSxPQUFPLEtBQUs7QUFDbkUsV0FBTyxPQUFPLEdBQUcsR0FBRyxDQUFDO0FBQUEsRUFDekI7QUFDQSxFQUFBQSxTQUFRLGFBQWE7QUFVckIsV0FBUyxNQUFNLE9BQU8sS0FBSyxLQUFLO0FBQzVCLFVBQU0sSUFBSSxPQUFPO0FBQ2pCLGVBQVcsT0FBTyxLQUFLLEtBQUssQ0FBQztBQUM3QixXQUFPO0FBQUEsRUFDWDtBQUNBLEVBQUFBLFNBQVEsUUFBUTtBQVVoQixXQUFTLFdBQVcsT0FBTyxLQUFLLEtBQUssUUFBUTtBQUN6QyxRQUFJLElBQUksTUFBTTtBQUNkLFFBQUksSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJO0FBQ3hCLFFBQUksSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJO0FBQ3hCLFFBQUksSUFBSSxNQUFNO0FBQ2QsUUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLElBQUk7QUFDeEIsUUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLElBQUk7QUFDeEIsUUFBSSxJQUFJLE1BQU07QUFDZCxRQUFJLElBQUksSUFBSSxJQUFJLElBQUksSUFBSTtBQUN4QixRQUFJLElBQUksSUFBSSxJQUFJLElBQUksSUFBSTtBQUN4QixtQkFBZSxHQUFHLEdBQUcsR0FBRyxNQUFNO0FBQUEsRUFDbEM7QUFDQSxFQUFBQSxTQUFRLGFBQWE7QUFVckIsV0FBUyxRQUFRLFFBQVEsVUFBVSxRQUFRLFVBQVUsUUFBUTtBQUN6RCxVQUFNLFVBQVUsU0FBUztBQUN6QixVQUFNLFFBQVEsU0FBUztBQUN2QixVQUFNLFFBQVEsSUFBTSxRQUFRLElBQU0sVUFBVTtBQUM1QyxVQUFNLFFBQVEsS0FBTyxRQUFRLElBQU07QUFDbkMsVUFBTSxRQUFRLFFBQVEsSUFBTSxVQUFVO0FBQ3RDLFVBQU0sUUFBUSxRQUFRO0FBQ3RCLFVBQU0sSUFBSSxPQUFPLElBQUksUUFDakIsT0FBTyxJQUFJLFFBQ1gsU0FBUyxJQUFJLFFBQ2IsU0FBUyxJQUFJO0FBQ2pCLFVBQU0sSUFBSSxPQUFPLElBQUksUUFDakIsT0FBTyxJQUFJLFFBQ1gsU0FBUyxJQUFJLFFBQ2IsU0FBUyxJQUFJO0FBQ2pCLFVBQU0sSUFBSSxPQUFPLElBQUksUUFDakIsT0FBTyxJQUFJLFFBQ1gsU0FBUyxJQUFJLFFBQ2IsU0FBUyxJQUFJO0FBQ2pCLFdBQU8sT0FBTyxHQUFHLEdBQUcsQ0FBQztBQUFBLEVBQ3pCO0FBQ0EsRUFBQUEsU0FBUSxVQUFVO0FBT2xCLFdBQVMsU0FBUyxNQUFNLE9BQU87QUFDM0IsVUFBTSxNQUFNLE9BQU87QUFDbkIsbUNBQStCLE9BQU8sS0FBSyxHQUFHLEtBQUssR0FBRyxLQUFLLEdBQUcsR0FBRztBQUNqRSxXQUFPO0FBQUEsRUFDWDtBQUNBLEVBQUFBLFNBQVEsV0FBVztBQU9uQixXQUFTLFNBQVMsTUFBTSxPQUFPO0FBQzNCLFVBQU0sTUFBTSxPQUFPO0FBQ25CLG1DQUErQixNQUFNLE1BQU0sR0FBRyxNQUFNLEdBQUcsTUFBTSxHQUFHLEdBQUc7QUFDbkUsV0FBTztBQUFBLEVBQ1g7QUFDQSxFQUFBQSxTQUFRLFdBQVc7QUFPbkIsV0FBUyxTQUFTLFFBQVEsUUFBUTtBQUM5QixXQUFPLEtBQUssS0FBSyxnQkFBZ0IsUUFBUSxNQUFNLENBQUM7QUFBQSxFQUNwRDtBQUNBLEVBQUFBLFNBQVEsV0FBVztBQU9uQixXQUFTLGdCQUFnQixRQUFRLFFBQVE7QUFDckMsVUFBTSxJQUFJLE9BQU8sSUFBSSxPQUFPO0FBQzVCLFVBQU0sSUFBSSxPQUFPLElBQUksT0FBTztBQUM1QixVQUFNLElBQUksT0FBTyxJQUFJLE9BQU87QUFDNUIsV0FBTyxJQUFJLElBQUksSUFBSSxJQUFJLElBQUk7QUFBQSxFQUMvQjtBQUNBLEVBQUFBLFNBQVEsa0JBQWtCO0FBTzFCLFdBQVMsT0FBTyxRQUFRLFFBQVE7QUFDNUIsVUFBTU8sVUFBU04sS0FBSSxRQUFRLE1BQU07QUFDakMsZUFBV00sU0FBUSxLQUFLQSxPQUFNO0FBQzlCLFdBQU9BO0FBQUEsRUFDWDtBQUNBLEVBQUFQLFNBQVEsU0FBUztBQVdqQixXQUFTLGlCQUFpQixPQUFPLE9BQU8sT0FBTztBQUMzQyxVQUFNLFdBQVcsS0FBSztBQUN0QiwwQkFBc0IsT0FBTyxPQUFPLE9BQU8sUUFBUTtBQUNuRCxXQUFPO0FBQUEsRUFDWDtBQUNBLEVBQUFBLFNBQVEsbUJBQW1CO0FBUTNCLFdBQVMsc0JBQXNCLE9BQU8sT0FBTyxPQUFPLFFBQVE7QUFDeEQsVUFBTSxPQUFPUSxZQUFXLE9BQU87QUFDL0IsSUFBQUEsWUFBVyxrQ0FBa0MsT0FBTyxPQUFPLE9BQU8sSUFBSTtBQUN0RSxhQUFTQSxZQUFXLGNBQWMsSUFBSSxHQUFHLE1BQU07QUFBQSxFQUNuRDtBQUNBLEVBQUFSLFNBQVEsd0JBQXdCO0FBS2hDLFdBQVNTLFVBQVMsUUFBUTtBQUN0QixXQUFPLElBQUksT0FBTyxDQUFDLEtBQUssT0FBTyxDQUFDLEtBQUssT0FBTyxDQUFDO0FBQUEsRUFDakQ7QUFDQSxFQUFBVCxTQUFRLFdBQVdTO0FBS25CLFdBQVMsWUFBWSxRQUFRO0FBQ3pCLFFBQUksT0FBTyxPQUFPLEtBQUs7QUFDdkIsV0FBUSxPQUFPLE9BQVEsT0FBTyxLQUFLO0FBQ25DLFdBQVEsT0FBTyxPQUFRLE9BQU8sS0FBSztBQUNuQyxXQUFPO0FBQUEsRUFDWDtBQUNBLEVBQUFULFNBQVEsY0FBYztBQU90QixXQUFTVSxRQUFPLFNBQVMsU0FBUztBQUM5QixXQUFRLFFBQVEsTUFBTSxRQUFRLEtBQzFCLFFBQVEsTUFBTSxRQUFRLEtBQ3RCLFFBQVEsTUFBTSxRQUFRO0FBQUEsRUFDOUI7QUFDQSxFQUFBVixTQUFRLFNBQVNVO0FBT2pCLFdBQVMsa0JBQWtCLFNBQVMsU0FBUyxVQUFVLFNBQVM7QUFDNUQsV0FBUSxPQUFPLGNBQWMsUUFBUSxHQUFHLFFBQVEsR0FBRyxPQUFPLEtBQ3RELE9BQU8sY0FBYyxRQUFRLEdBQUcsUUFBUSxHQUFHLE9BQU8sS0FDbEQsT0FBTyxjQUFjLFFBQVEsR0FBRyxRQUFRLEdBQUcsT0FBTztBQUFBLEVBQzFEO0FBQ0EsRUFBQVYsU0FBUSxvQkFBb0I7QUFRNUIsV0FBUyxlQUFlLFFBQVEsR0FBRyxHQUFHLEdBQUc7QUFDckMsV0FBTyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU07QUFBQSxFQUM1RDtBQUNBLEVBQUFBLFNBQVEsaUJBQWlCO0FBT3pCLFdBQVNXLFVBQVMsU0FBUyxTQUFTO0FBQ2hDLFVBQU0sU0FBUyxPQUFPO0FBQ3RCLGtCQUFjLFNBQVMsU0FBUyxNQUFNO0FBQ3RDLFdBQU87QUFBQSxFQUNYO0FBQ0EsRUFBQVgsU0FBUSxXQUFXVztBQU9uQixXQUFTLGNBQWMsU0FBUyxTQUFTLFFBQVE7QUFDN0MsV0FBTyxJQUFJLFFBQVEsSUFBSSxRQUFRO0FBQy9CLFdBQU8sSUFBSSxRQUFRLElBQUksUUFBUTtBQUMvQixXQUFPLElBQUksUUFBUSxJQUFJLFFBQVE7QUFBQSxFQUNuQztBQUNBLEVBQUFYLFNBQVEsZ0JBQWdCO0FBUXhCLFdBQVMsc0JBQXNCLFNBQVMsR0FBRyxHQUFHLEdBQUcsUUFBUTtBQUNyRCxXQUFPLElBQUksUUFBUSxJQUFJO0FBQ3ZCLFdBQU8sSUFBSSxRQUFRLElBQUk7QUFDdkIsV0FBTyxJQUFJLFFBQVEsSUFBSTtBQUFBLEVBQzNCO0FBQ0EsRUFBQUEsU0FBUSx3QkFBd0I7QUFRaEMsV0FBUyxpQkFBaUIsU0FBUyxHQUFHLEdBQUcsR0FBRztBQUN4QyxVQUFNLFNBQVMsT0FBTztBQUN0QiwwQkFBc0IsU0FBUyxHQUFHLEdBQUcsR0FBRyxNQUFNO0FBQzlDLFdBQU87QUFBQSxFQUNYO0FBQ0EsRUFBQUEsU0FBUSxtQkFBbUI7QUFNM0IsV0FBU1ksUUFBTyxTQUFTLFNBQVM7QUFDOUIsV0FBTztBQUFBLE1BQ0gsR0FBRyxRQUFRLElBQUksUUFBUTtBQUFBLE1BQ3ZCLEdBQUcsUUFBUSxJQUFJLFFBQVE7QUFBQSxNQUN2QixHQUFHLFFBQVEsSUFBSSxRQUFRO0FBQUEsSUFDM0I7QUFBQSxFQUNKO0FBQ0EsRUFBQVosU0FBUSxTQUFTWTtBQU9qQixXQUFTLFlBQVksU0FBUyxTQUFTLFFBQVE7QUFDM0MsV0FBTyxJQUFJLFFBQVEsSUFBSSxRQUFRO0FBQy9CLFdBQU8sSUFBSSxRQUFRLElBQUksUUFBUTtBQUMvQixXQUFPLElBQUksUUFBUSxJQUFJLFFBQVE7QUFBQSxFQUNuQztBQUNBLEVBQUFaLFNBQVEsY0FBYztBQVF0QixXQUFTLCtCQUErQixTQUFTLEdBQUcsR0FBRyxHQUFHLFFBQVE7QUFDOUQsUUFBSSxJQUFJLFFBQVEsR0FBRztBQUNmLGFBQU8sSUFBSTtBQUFBLElBQ2YsT0FDSztBQUNELGFBQU8sSUFBSSxRQUFRO0FBQUEsSUFDdkI7QUFDQSxRQUFJLElBQUksUUFBUSxHQUFHO0FBQ2YsYUFBTyxJQUFJO0FBQUEsSUFDZixPQUNLO0FBQ0QsYUFBTyxJQUFJLFFBQVE7QUFBQSxJQUN2QjtBQUNBLFFBQUksSUFBSSxRQUFRLEdBQUc7QUFDZixhQUFPLElBQUk7QUFBQSxJQUNmLE9BQ0s7QUFDRCxhQUFPLElBQUksUUFBUTtBQUFBLElBQ3ZCO0FBQUEsRUFDSjtBQUNBLEVBQUFBLFNBQVEsaUNBQWlDO0FBUXpDLFdBQVMsK0JBQStCLFNBQVMsR0FBRyxHQUFHLEdBQUcsUUFBUTtBQUM5RCxRQUFJLElBQUksUUFBUSxHQUFHO0FBQ2YsYUFBTyxJQUFJO0FBQUEsSUFDZixPQUNLO0FBQ0QsYUFBTyxJQUFJLFFBQVE7QUFBQSxJQUN2QjtBQUNBLFFBQUksSUFBSSxRQUFRLEdBQUc7QUFDZixhQUFPLElBQUk7QUFBQSxJQUNmLE9BQ0s7QUFDRCxhQUFPLElBQUksUUFBUTtBQUFBLElBQ3ZCO0FBQ0EsUUFBSSxJQUFJLFFBQVEsR0FBRztBQUNmLGFBQU8sSUFBSTtBQUFBLElBQ2YsT0FDSztBQUNELGFBQU8sSUFBSSxRQUFRO0FBQUEsSUFDdkI7QUFBQSxFQUNKO0FBQ0EsRUFBQUEsU0FBUSxpQ0FBaUM7QUFLekMsV0FBUyxNQUFNLFNBQVM7QUFDcEIsV0FBTyxPQUFPLEtBQUssTUFBTSxRQUFRLENBQUMsR0FBRyxLQUFLLE1BQU0sUUFBUSxDQUFDLEdBQUcsS0FBSyxNQUFNLFFBQVEsQ0FBQyxDQUFDO0FBQUEsRUFDckY7QUFDQSxFQUFBQSxTQUFRLFFBQVE7QUFLaEIsV0FBUyxNQUFNLFNBQVM7QUFDcEIsV0FBTyxPQUFPLFFBQVEsSUFBSSxLQUFLLE1BQU0sUUFBUSxDQUFDLEdBQUcsUUFBUSxJQUFJLEtBQUssTUFBTSxRQUFRLENBQUMsR0FBRyxRQUFRLElBQUksS0FBSyxNQUFNLFFBQVEsQ0FBQyxDQUFDO0FBQUEsRUFDekg7QUFDQSxFQUFBQSxTQUFRLFFBQVE7QUFLaEIsV0FBUyxPQUFPO0FBQ1osV0FBTyxPQUFPLEdBQUssR0FBSyxDQUFHO0FBQUEsRUFDL0I7QUFDQSxFQUFBQSxTQUFRLE9BQU87QUFLZixXQUFTLE1BQU07QUFDWCxXQUFPLE9BQU8sR0FBSyxHQUFLLENBQUc7QUFBQSxFQUMvQjtBQUNBLEVBQUFBLFNBQVEsTUFBTTtBQUtkLFdBQVMsS0FBSztBQUNWLFdBQU8sT0FBTyxHQUFLLEdBQUssQ0FBRztBQUFBLEVBQy9CO0FBQ0EsRUFBQUEsU0FBUSxLQUFLO0FBS2IsV0FBUyxPQUFPO0FBQ1osV0FBTyxPQUFPLEdBQUssSUFBTSxDQUFHO0FBQUEsRUFDaEM7QUFDQSxFQUFBQSxTQUFRLE9BQU87QUFLZixXQUFTLFVBQVU7QUFDZixXQUFPLE9BQU8sR0FBSyxHQUFLLENBQUc7QUFBQSxFQUMvQjtBQUNBLEVBQUFBLFNBQVEsVUFBVTtBQUtsQixXQUFTLFdBQVc7QUFDaEIsV0FBTyxPQUFPLEdBQUssR0FBSyxFQUFJO0FBQUEsRUFDaEM7QUFDQSxFQUFBQSxTQUFRLFdBQVc7QUFLbkIsV0FBUyxRQUFRO0FBQ2IsV0FBTyxPQUFPLEdBQUssR0FBSyxDQUFHO0FBQUEsRUFDL0I7QUFDQSxFQUFBQSxTQUFRLFFBQVE7QUFLaEIsV0FBUyxPQUFPO0FBQ1osV0FBTyxPQUFPLElBQU0sR0FBSyxDQUFHO0FBQUEsRUFDaEM7QUFDQSxFQUFBQSxTQUFRLE9BQU87QUFLZixXQUFTLFNBQVM7QUFDZCxXQUFPLE9BQU8sS0FBSyxPQUFPLEdBQUcsS0FBSyxPQUFPLEdBQUcsS0FBSyxPQUFPLENBQUM7QUFBQSxFQUM3RDtBQUNBLEVBQUFBLFNBQVEsU0FBUztBQUNyQixHQUFHQSxhQUFZQSxXQUFVLENBQUMsRUFBRTs7O0FDLzhCckIsSUFBSTtBQUFBLENBQ1YsU0FBVWEsUUFBTztBQVFkLFdBQVMsT0FBTyxHQUFHLEdBQUcsR0FBRyxHQUFHO0FBQ3hCLFdBQU87QUFBQSxNQUNILFFBQVFDLFNBQVEsT0FBTyxHQUFHLEdBQUcsQ0FBQztBQUFBLE1BQzlCO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFDQSxFQUFBRCxPQUFNLFNBQVM7QUFPZixXQUFTLFVBQVUsT0FBTztBQUN0QixXQUFPLE9BQU8sTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUM7QUFBQSxFQUN4RDtBQUNBLEVBQUFBLE9BQU0sWUFBWTtBQVFsQixXQUFTLFdBQVcsU0FBUyxTQUFTLFNBQVM7QUFDM0MsVUFBTSxTQUFTLE9BQU8sR0FBSyxHQUFLLEdBQUssQ0FBRztBQUd4QyxXQUFPO0FBQUEsRUFDWDtBQUNBLEVBQUFBLE9BQU0sYUFBYTtBQVFuQixXQUFTLHFCQUFxQixRQUFRLFFBQVE7QUFDMUMsVUFBTSxTQUFTLE9BQU8sR0FBSyxHQUFLLEdBQUssQ0FBRztBQUN4QyxXQUFPLFNBQVNDLFNBQVEsVUFBVSxNQUFNO0FBQ3hDLFdBQU8sSUFBSSxFQUFFLE9BQU8sSUFBSSxPQUFPLElBQzNCLE9BQU8sSUFBSSxPQUFPLElBQ2xCLE9BQU8sSUFBSSxPQUFPO0FBQ3RCLFdBQU87QUFBQSxFQUNYO0FBQ0EsRUFBQUQsT0FBTSx1QkFBdUI7QUFRN0IsV0FBUywyQ0FBMkMsUUFBUSxRQUFRLE9BQU87QUFDdkUsVUFBTSxJQUFJLEVBQUUsT0FBTyxJQUFJLE9BQU8sSUFBSSxPQUFPLElBQUksT0FBTyxJQUFJLE9BQU8sSUFBSSxPQUFPO0FBQzFFLFdBQU9DLFNBQVEsSUFBSSxPQUFPLE1BQU0sSUFBSTtBQUFBLEVBQ3hDO0FBQ0EsRUFBQUQsT0FBTSw2Q0FBNkM7QUFJbkQsV0FBUyxRQUFRLE9BQU87QUFDcEIsV0FBTyxDQUFDLE1BQU0sT0FBTyxHQUFHLE1BQU0sT0FBTyxHQUFHLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQztBQUFBLEVBQ25FO0FBQ0EsRUFBQUEsT0FBTSxVQUFVO0FBS2hCLFdBQVNFLE9BQU0sT0FBTztBQUNsQixXQUFPLE9BQU8sTUFBTSxPQUFPLEdBQUcsTUFBTSxPQUFPLEdBQUcsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDO0FBQUEsRUFDekU7QUFDQSxFQUFBRixPQUFNLFFBQVFFO0FBSWQsV0FBUyxZQUFZLFFBQVE7QUFLekIsV0FBTztBQUFBLEVBQ1g7QUFDQSxFQUFBRixPQUFNLGNBQWM7QUFLcEIsV0FBUyxVQUFVLE9BQU87QUFDdEIsVUFBTSxTQUFTLE9BQU8sR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNoQyxVQUFNLE9BQU8sS0FBSyxLQUFLLE1BQU0sT0FBTyxJQUFJLE1BQU0sT0FBTyxJQUNqRCxNQUFNLE9BQU8sSUFBSSxNQUFNLE9BQU8sSUFDOUIsTUFBTSxPQUFPLElBQUksTUFBTSxPQUFPLENBQUM7QUFDbkMsUUFBSSxZQUFZO0FBQ2hCLFFBQUksU0FBUyxHQUFHO0FBQ1osa0JBQVksSUFBTTtBQUFBLElBQ3RCO0FBQ0EsV0FBTyxPQUFPLElBQUksTUFBTSxPQUFPLElBQUk7QUFDbkMsV0FBTyxPQUFPLElBQUksTUFBTSxPQUFPLElBQUk7QUFDbkMsV0FBTyxPQUFPLElBQUksTUFBTSxPQUFPLElBQUk7QUFDbkMsV0FBTyxLQUFLO0FBQ1osV0FBTztBQUFBLEVBQ1g7QUFDQSxFQUFBQSxPQUFNLFlBQVk7QUFNbEIsV0FBUyxVQUFVLE9BQU8sZ0JBQWdCO0FBQ3RDLFVBQU0sbUJBQW1CLE9BQU8sT0FBTztBQUN2QyxXQUFPLGVBQWUsZ0JBQWdCLGdCQUFnQjtBQUN0RCxVQUFNLElBQUksaUJBQWlCO0FBQzNCLFVBQU0sSUFBSSxNQUFNLE9BQU87QUFDdkIsVUFBTSxJQUFJLE1BQU0sT0FBTztBQUN2QixVQUFNLElBQUksTUFBTSxPQUFPO0FBQ3ZCLFVBQU0sSUFBSSxNQUFNO0FBQ2hCLFVBQU0sVUFBVSxJQUFJLEVBQUUsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztBQUN4RCxVQUFNLFVBQVUsSUFBSSxFQUFFLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7QUFDeEQsVUFBTSxVQUFVLElBQUksRUFBRSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsSUFBSSxJQUFJLEVBQUUsRUFBRSxJQUFJLElBQUksRUFBRSxFQUFFO0FBQzFELFVBQU0sU0FBUyxJQUFJLEVBQUUsRUFBRSxJQUFJLElBQUksRUFBRSxFQUFFLElBQUksSUFBSSxFQUFFLEVBQUUsSUFBSSxJQUFJLEVBQUUsRUFBRTtBQUMzRCxXQUFPLE9BQU8sU0FBUyxTQUFTLFNBQVMsTUFBTTtBQUFBLEVBQ25EO0FBQ0EsRUFBQUEsT0FBTSxZQUFZO0FBTWxCLFdBQVMsY0FBYyxPQUFPLE9BQU87QUFDakMsV0FBUSxNQUFNLE9BQU8sSUFBSSxNQUFNLElBQzNCLE1BQU0sT0FBTyxJQUFJLE1BQU0sSUFDdkIsTUFBTSxPQUFPLElBQUksTUFBTSxJQUN2QixNQUFNO0FBQUEsRUFDZDtBQUNBLEVBQUFBLE9BQU0sZ0JBQWdCO0FBUXRCLFdBQVMsZUFBZSxRQUFRLFFBQVEsUUFBUTtBQUM1QyxVQUFNLEtBQUssT0FBTyxJQUFJLE9BQU87QUFDN0IsVUFBTSxLQUFLLE9BQU8sSUFBSSxPQUFPO0FBQzdCLFVBQU0sS0FBSyxPQUFPLElBQUksT0FBTztBQUM3QixVQUFNLEtBQUssT0FBTyxJQUFJLE9BQU87QUFDN0IsVUFBTSxLQUFLLE9BQU8sSUFBSSxPQUFPO0FBQzdCLFVBQU0sS0FBSyxPQUFPLElBQUksT0FBTztBQUM3QixVQUFNLEtBQUssS0FBSyxLQUFLLEtBQUs7QUFDMUIsVUFBTSxLQUFLLEtBQUssS0FBSyxLQUFLO0FBQzFCLFVBQU0sS0FBSyxLQUFLLEtBQUssS0FBSztBQUMxQixVQUFNLE9BQU8sS0FBSyxLQUFLLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxFQUFFO0FBQ2xELFFBQUk7QUFDSixRQUFJLFNBQVMsR0FBRztBQUNaLGdCQUFVLElBQU07QUFBQSxJQUNwQixPQUNLO0FBQ0QsZ0JBQVU7QUFBQSxJQUNkO0FBQ0EsVUFBTSxTQUFTQyxTQUFRLE9BQU8sS0FBSyxTQUFTLEtBQUssU0FBUyxLQUFLLE9BQU87QUFDdEUsV0FBTztBQUFBLE1BQ0g7QUFBQSxNQUNBLEdBQUcsRUFBRSxPQUFPLElBQUksT0FBTyxJQUFJLE9BQU8sSUFBSSxPQUFPLElBQUksT0FBTyxJQUFJLE9BQU87QUFBQSxJQUN2RTtBQUFBLEVBQ0o7QUFDQSxFQUFBRCxPQUFNLGlCQUFpQjtBQU92QixXQUFTLGdCQUFnQixPQUFPLFdBQVcsU0FBUztBQUNoRCxVQUFNLE1BQU1DLFNBQVEsSUFBSSxNQUFNLFFBQVEsU0FBUztBQUMvQyxXQUFPLE9BQU87QUFBQSxFQUNsQjtBQUNBLEVBQUFELE9BQU0sa0JBQWtCO0FBTXhCLFdBQVMsaUJBQWlCLE9BQU8sT0FBTztBQUNwQyxXQUFPQyxTQUFRLElBQUksT0FBTyxNQUFNLE1BQU0sSUFBSSxNQUFNO0FBQUEsRUFDcEQ7QUFDQSxFQUFBRCxPQUFNLG1CQUFtQjtBQUM3QixHQUFHLFVBQVUsUUFBUSxDQUFDLEVBQUU7OztBQ3JNakIsSUFBSTtBQUFBLENBQ1YsU0FBVUcsU0FBUTtBQUlmLFdBQVMsRUFBRUMsT0FBTTtBQUNiLFdBQU9BLE1BQUs7QUFBQSxFQUNoQjtBQUNBLEVBQUFELFFBQU8sSUFBSTtBQUNYLE1BQUksa0JBQWtCO0FBQ3RCLFFBQU0sb0JBQW9CLENBQUM7QUFJM0IsV0FBUyxtQkFBbUI7QUFDeEIsV0FBTztBQUFBLEVBQ1g7QUFDQSxFQUFBQSxRQUFPLG1CQUFtQjtBQUkxQixXQUFTLFNBQVM7QUFDZCxVQUFNLFlBQVk7QUFBQSxNQUNkLFlBQVk7QUFBQSxNQUNaLFlBQVk7QUFBQSxNQUNaLGVBQWU7QUFBQSxNQUNmLGtCQUFrQjtBQUFBLE1BQ2xCLHFCQUFxQjtBQUFBLE1BQ3JCLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQUEsSUFDdkQ7QUFDQSwwQkFBc0IsV0FBVyxLQUFLO0FBQ3RDLFdBQU87QUFBQSxFQUNYO0FBQ0EsRUFBQUEsUUFBTyxTQUFTO0FBUWhCLFdBQVMsVUFBVSxPQUFPLFNBQVMsR0FBRztBQUNsQyxVQUFNLFNBQVMsT0FBTztBQUN0QixtQkFBZSxPQUFPLFFBQVEsTUFBTTtBQUNwQyxXQUFPO0FBQUEsRUFDWDtBQUNBLEVBQUFBLFFBQU8sWUFBWTtBQU9uQixXQUFTLGVBQWUsT0FBTyxRQUFRLFFBQVE7QUFDM0MsYUFBUyxRQUFRLEdBQUcsUUFBUSxJQUFJLFNBQVM7QUFDckMsYUFBTyxHQUFHLEtBQUssSUFBSSxNQUFNLFFBQVEsTUFBTTtBQUFBLElBQzNDO0FBQ0EsbUJBQWUsTUFBTTtBQUFBLEVBQ3pCO0FBQ0EsRUFBQUEsUUFBTyxpQkFBaUI7QUFReEIsV0FBUywwQkFBMEIsT0FBTyxRQUFRRSxRQUFPLFFBQVE7QUFDN0QsYUFBUyxRQUFRLEdBQUcsUUFBUSxJQUFJLFNBQVM7QUFDckMsYUFBTyxHQUFHLEtBQUssSUFBSSxNQUFNLFFBQVEsTUFBTSxJQUFJQTtBQUFBLElBQy9DO0FBQ0EsbUJBQWUsTUFBTTtBQUFBLEVBQ3pCO0FBQ0EsRUFBQUYsUUFBTyw0QkFBNEI7QUFxQm5DLFdBQVMsZ0JBQWdCLFlBQVksWUFBWSxZQUFZLFlBQVksWUFBWSxZQUFZLFlBQVksWUFBWSxZQUFZLFlBQVksWUFBWSxZQUFZLFlBQVksWUFBWSxZQUFZLFlBQVksUUFBUTtBQUM3TixVQUFNRyxLQUFJLE9BQU87QUFDakIsSUFBQUEsR0FBRSxDQUFDLElBQUk7QUFDUCxJQUFBQSxHQUFFLENBQUMsSUFBSTtBQUNQLElBQUFBLEdBQUUsQ0FBQyxJQUFJO0FBQ1AsSUFBQUEsR0FBRSxDQUFDLElBQUk7QUFDUCxJQUFBQSxHQUFFLENBQUMsSUFBSTtBQUNQLElBQUFBLEdBQUUsQ0FBQyxJQUFJO0FBQ1AsSUFBQUEsR0FBRSxDQUFDLElBQUk7QUFDUCxJQUFBQSxHQUFFLENBQUMsSUFBSTtBQUNQLElBQUFBLEdBQUUsQ0FBQyxJQUFJO0FBQ1AsSUFBQUEsR0FBRSxDQUFDLElBQUk7QUFDUCxJQUFBQSxHQUFFLEVBQUUsSUFBSTtBQUNSLElBQUFBLEdBQUUsRUFBRSxJQUFJO0FBQ1IsSUFBQUEsR0FBRSxFQUFFLElBQUk7QUFDUixJQUFBQSxHQUFFLEVBQUUsSUFBSTtBQUNSLElBQUFBLEdBQUUsRUFBRSxJQUFJO0FBQ1IsSUFBQUEsR0FBRSxFQUFFLElBQUk7QUFDUixtQkFBZSxNQUFNO0FBQUEsRUFDekI7QUFDQSxFQUFBSCxRQUFPLGtCQUFrQjtBQXFCekIsV0FBUyxXQUFXLFlBQVksWUFBWSxZQUFZLFlBQVksWUFBWSxZQUFZLFlBQVksWUFBWSxZQUFZLFlBQVksWUFBWSxZQUFZLFlBQVksWUFBWSxZQUFZLFlBQVk7QUFDaE4sVUFBTSxTQUFTLE9BQU87QUFDdEIsVUFBTUcsS0FBSSxPQUFPO0FBQ2pCLElBQUFBLEdBQUUsQ0FBQyxJQUFJO0FBQ1AsSUFBQUEsR0FBRSxDQUFDLElBQUk7QUFDUCxJQUFBQSxHQUFFLENBQUMsSUFBSTtBQUNQLElBQUFBLEdBQUUsQ0FBQyxJQUFJO0FBQ1AsSUFBQUEsR0FBRSxDQUFDLElBQUk7QUFDUCxJQUFBQSxHQUFFLENBQUMsSUFBSTtBQUNQLElBQUFBLEdBQUUsQ0FBQyxJQUFJO0FBQ1AsSUFBQUEsR0FBRSxDQUFDLElBQUk7QUFDUCxJQUFBQSxHQUFFLENBQUMsSUFBSTtBQUNQLElBQUFBLEdBQUUsQ0FBQyxJQUFJO0FBQ1AsSUFBQUEsR0FBRSxFQUFFLElBQUk7QUFDUixJQUFBQSxHQUFFLEVBQUUsSUFBSTtBQUNSLElBQUFBLEdBQUUsRUFBRSxJQUFJO0FBQ1IsSUFBQUEsR0FBRSxFQUFFLElBQUk7QUFDUixJQUFBQSxHQUFFLEVBQUUsSUFBSTtBQUNSLElBQUFBLEdBQUUsRUFBRSxJQUFJO0FBQ1IsbUJBQWUsTUFBTTtBQUNyQixXQUFPO0FBQUEsRUFDWDtBQUNBLEVBQUFILFFBQU8sYUFBYTtBQVFwQixXQUFTLFFBQVFFLFFBQU8sVUFBVUUsY0FBYTtBQUMzQyxVQUFNLFNBQVMsT0FBTztBQUN0QixpQkFBYUYsUUFBTyxVQUFVRSxjQUFhLE1BQU07QUFDakQsV0FBTztBQUFBLEVBQ1g7QUFDQSxFQUFBSixRQUFPLFVBQVU7QUFRakIsV0FBUyxhQUFhRSxRQUFPLFVBQVVFLGNBQWEsUUFBUTtBQUN4RCxVQUFNLFlBQVksQ0FBQyxPQUFPLEdBQUcsT0FBTyxHQUFHLE9BQU8sQ0FBQztBQUMvQyxpQkFBYUYsT0FBTSxHQUFHQSxPQUFNLEdBQUdBLE9BQU0sR0FBRyxVQUFVLENBQUMsQ0FBQztBQUNwRCx3QkFBb0IsVUFBVSxVQUFVLENBQUMsQ0FBQztBQUMxQyxrQkFBYyxVQUFVLENBQUMsR0FBRyxVQUFVLENBQUMsR0FBRyxNQUFNO0FBQ2hELG1CQUFlLFFBQVFFLFlBQVc7QUFBQSxFQUN0QztBQUNBLEVBQUFKLFFBQU8sZUFBZTtBQUt0QixXQUFTLFdBQVc7QUFDaEIsVUFBTSxXQUFXLFdBQVcsR0FBSyxHQUFLLEdBQUssR0FBSyxHQUFLLEdBQUssR0FBSyxHQUFLLEdBQUssR0FBSyxHQUFLLEdBQUssR0FBSyxHQUFLLEdBQUssQ0FBRztBQUMxRywwQkFBc0IsVUFBVSxJQUFJO0FBQ3BDLFdBQU87QUFBQSxFQUNYO0FBQ0EsRUFBQUEsUUFBTyxXQUFXO0FBS2xCLFdBQVMsY0FBYyxRQUFRO0FBQzNCLG9CQUFnQixHQUFLLEdBQUssR0FBSyxHQUFLLEdBQUssR0FBSyxHQUFLLEdBQUssR0FBSyxHQUFLLEdBQUssR0FBSyxHQUFLLEdBQUssR0FBSyxHQUFLLE1BQU07QUFDdEcsMEJBQXNCLFFBQVEsSUFBSTtBQUFBLEVBQ3RDO0FBQ0EsRUFBQUEsUUFBTyxnQkFBZ0I7QUFLdkIsV0FBUyxPQUFPO0FBQ1osVUFBTSxPQUFPLFdBQVcsR0FBSyxHQUFLLEdBQUssR0FBSyxHQUFLLEdBQUssR0FBSyxHQUFLLEdBQUssR0FBSyxHQUFLLEdBQUssR0FBSyxHQUFLLEdBQUssQ0FBRztBQUN0RywwQkFBc0IsTUFBTSxLQUFLO0FBQ2pDLFdBQU87QUFBQSxFQUNYO0FBQ0EsRUFBQUEsUUFBTyxPQUFPO0FBTWQsV0FBUyxVQUFVLE9BQU87QUFDdEIsVUFBTSxTQUFTLE9BQU87QUFDdEIsbUJBQWUsT0FBTyxNQUFNO0FBQzVCLFdBQU87QUFBQSxFQUNYO0FBQ0EsRUFBQUEsUUFBTyxZQUFZO0FBTW5CLFdBQVMsZUFBZSxPQUFPLFFBQVE7QUFDbkMsVUFBTSxJQUFJLEtBQUssSUFBSSxLQUFLO0FBQ3hCLFVBQU0sSUFBSSxLQUFLLElBQUksS0FBSztBQUN4QixvQkFBZ0IsR0FBSyxHQUFLLEdBQUssR0FBSyxHQUFLLEdBQUcsR0FBRyxHQUFLLEdBQUssQ0FBQyxHQUFHLEdBQUcsR0FBSyxHQUFLLEdBQUssR0FBSyxHQUFLLE1BQU07QUFDL0YsMEJBQXNCLFFBQVEsTUFBTSxLQUFLLE1BQU0sQ0FBQztBQUFBLEVBQ3BEO0FBQ0EsRUFBQUEsUUFBTyxpQkFBaUI7QUFNeEIsV0FBUyxVQUFVLE9BQU87QUFDdEIsVUFBTSxTQUFTLE9BQU87QUFDdEIsbUJBQWUsT0FBTyxNQUFNO0FBQzVCLFdBQU87QUFBQSxFQUNYO0FBQ0EsRUFBQUEsUUFBTyxZQUFZO0FBTW5CLFdBQVMsZUFBZSxPQUFPLFFBQVE7QUFDbkMsVUFBTSxJQUFJLEtBQUssSUFBSSxLQUFLO0FBQ3hCLFVBQU0sSUFBSSxLQUFLLElBQUksS0FBSztBQUN4QixvQkFBZ0IsR0FBRyxHQUFLLENBQUMsR0FBRyxHQUFLLEdBQUssR0FBSyxHQUFLLEdBQUssR0FBRyxHQUFLLEdBQUcsR0FBSyxHQUFLLEdBQUssR0FBSyxHQUFLLE1BQU07QUFDL0YsMEJBQXNCLFFBQVEsTUFBTSxLQUFLLE1BQU0sQ0FBQztBQUFBLEVBQ3BEO0FBQ0EsRUFBQUEsUUFBTyxpQkFBaUI7QUFNeEIsV0FBUyxVQUFVLE9BQU87QUFDdEIsVUFBTSxTQUFTLE9BQU87QUFDdEIsbUJBQWUsT0FBTyxNQUFNO0FBQzVCLFdBQU87QUFBQSxFQUNYO0FBQ0EsRUFBQUEsUUFBTyxZQUFZO0FBTW5CLFdBQVMsZUFBZSxPQUFPLFFBQVE7QUFDbkMsVUFBTSxJQUFJLEtBQUssSUFBSSxLQUFLO0FBQ3hCLFVBQU0sSUFBSSxLQUFLLElBQUksS0FBSztBQUN4QixvQkFBZ0IsR0FBRyxHQUFHLEdBQUssR0FBSyxDQUFDLEdBQUcsR0FBRyxHQUFLLEdBQUssR0FBSyxHQUFLLEdBQUssR0FBSyxHQUFLLEdBQUssR0FBSyxHQUFLLE1BQU07QUFDL0YsMEJBQXNCLFFBQVEsTUFBTSxLQUFLLE1BQU0sQ0FBQztBQUFBLEVBQ3BEO0FBQ0EsRUFBQUEsUUFBTyxpQkFBaUI7QUFPeEIsV0FBUyxhQUFhLE1BQU0sT0FBTztBQUMvQixVQUFNLFNBQVMsT0FBTztBQUN0QixzQkFBa0IsTUFBTSxPQUFPLE1BQU07QUFDckMsV0FBTztBQUFBLEVBQ1g7QUFDQSxFQUFBQSxRQUFPLGVBQWU7QUFPdEIsV0FBUyxrQkFBa0IsT0FBTyxPQUFPLFFBQVE7QUFDN0MsVUFBTSxJQUFJLEtBQUssSUFBSSxDQUFDLEtBQUs7QUFDekIsVUFBTSxJQUFJLEtBQUssSUFBSSxDQUFDLEtBQUs7QUFDekIsVUFBTSxLQUFLLElBQUk7QUFDZixVQUFNLE9BQU9LLFNBQVEsVUFBVSxLQUFLO0FBQ3BDLFVBQU1GLEtBQUksT0FBTztBQUNqQixJQUFBQSxHQUFFLENBQUMsSUFBSSxLQUFLLElBQUksS0FBSyxJQUFJLEtBQUs7QUFDOUIsSUFBQUEsR0FBRSxDQUFDLElBQUksS0FBSyxJQUFJLEtBQUssSUFBSSxLQUFLLEtBQUssSUFBSTtBQUN2QyxJQUFBQSxHQUFFLENBQUMsSUFBSSxLQUFLLElBQUksS0FBSyxJQUFJLEtBQUssS0FBSyxJQUFJO0FBQ3ZDLElBQUFBLEdBQUUsQ0FBQyxJQUFJO0FBQ1AsSUFBQUEsR0FBRSxDQUFDLElBQUksS0FBSyxJQUFJLEtBQUssSUFBSSxLQUFLLEtBQUssSUFBSTtBQUN2QyxJQUFBQSxHQUFFLENBQUMsSUFBSSxLQUFLLElBQUksS0FBSyxJQUFJLEtBQUs7QUFDOUIsSUFBQUEsR0FBRSxDQUFDLElBQUksS0FBSyxJQUFJLEtBQUssSUFBSSxLQUFLLEtBQUssSUFBSTtBQUN2QyxJQUFBQSxHQUFFLENBQUMsSUFBSTtBQUNQLElBQUFBLEdBQUUsQ0FBQyxJQUFJLEtBQUssSUFBSSxLQUFLLElBQUksS0FBSyxLQUFLLElBQUk7QUFDdkMsSUFBQUEsR0FBRSxDQUFDLElBQUksS0FBSyxJQUFJLEtBQUssSUFBSSxLQUFLLEtBQUssSUFBSTtBQUN2QyxJQUFBQSxHQUFFLEVBQUUsSUFBSSxLQUFLLElBQUksS0FBSyxJQUFJLEtBQUs7QUFDL0IsSUFBQUEsR0FBRSxFQUFFLElBQUk7QUFDUixJQUFBQSxHQUFFLEVBQUUsSUFBSTtBQUNSLElBQUFBLEdBQUUsRUFBRSxJQUFJO0FBQ1IsSUFBQUEsR0FBRSxFQUFFLElBQUk7QUFDUixJQUFBQSxHQUFFLEVBQUUsSUFBSTtBQUNSLG1CQUFlLE1BQU07QUFBQSxFQUN6QjtBQUNBLEVBQUFILFFBQU8sb0JBQW9CO0FBUTNCLFdBQVMscUJBQXFCLEtBQUssT0FBTyxNQUFNO0FBQzVDLFVBQU0sU0FBUyxPQUFPO0FBQ3RCLDhCQUEwQixLQUFLLE9BQU8sTUFBTSxNQUFNO0FBQ2xELFdBQU87QUFBQSxFQUNYO0FBQ0EsRUFBQUEsUUFBTyx1QkFBdUI7QUFROUIsV0FBUywwQkFBMEIsS0FBSyxPQUFPLE1BQU0sUUFBUTtBQUN6RCxVQUFNLG1CQUFtQk0sWUFBVyxLQUFLO0FBQ3pDLElBQUFBLFlBQVcsOEJBQThCLEtBQUssT0FBTyxNQUFNLGdCQUFnQjtBQUMzRSx3QkFBb0Isa0JBQWtCLE1BQU07QUFBQSxFQUNoRDtBQUNBLEVBQUFOLFFBQU8sNEJBQTRCO0FBUW5DLFdBQVMsUUFBUSxHQUFHLEdBQUcsR0FBRztBQUN0QixVQUFNLFNBQVMsT0FBTztBQUN0QixpQkFBYSxHQUFHLEdBQUcsR0FBRyxNQUFNO0FBQzVCLFdBQU87QUFBQSxFQUNYO0FBQ0EsRUFBQUEsUUFBTyxVQUFVO0FBUWpCLFdBQVMsYUFBYSxHQUFHLEdBQUcsR0FBRyxRQUFRO0FBQ25DLG9CQUFnQixHQUFHLEdBQUssR0FBSyxHQUFLLEdBQUssR0FBRyxHQUFLLEdBQUssR0FBSyxHQUFLLEdBQUcsR0FBSyxHQUFLLEdBQUssR0FBSyxHQUFLLE1BQU07QUFDaEcsMEJBQXNCLFFBQVEsTUFBTSxLQUFLLE1BQU0sS0FBSyxNQUFNLENBQUM7QUFBQSxFQUMvRDtBQUNBLEVBQUFBLFFBQU8sZUFBZTtBQVF0QixXQUFTLFlBQVksR0FBRyxHQUFHLEdBQUc7QUFDMUIsVUFBTSxTQUFTLE9BQU87QUFDdEIscUJBQWlCLEdBQUcsR0FBRyxHQUFHLE1BQU07QUFDaEMsV0FBTztBQUFBLEVBQ1g7QUFDQSxFQUFBQSxRQUFPLGNBQWM7QUFRckIsV0FBUyxpQkFBaUIsR0FBRyxHQUFHLEdBQUcsUUFBUTtBQUN2QyxvQkFBZ0IsR0FBSyxHQUFLLEdBQUssR0FBSyxHQUFLLEdBQUssR0FBSyxHQUFLLEdBQUssR0FBSyxHQUFLLEdBQUssR0FBRyxHQUFHLEdBQUcsR0FBSyxNQUFNO0FBQ2hHLDBCQUFzQixRQUFRLE1BQU0sS0FBSyxNQUFNLEtBQUssTUFBTSxDQUFDO0FBQUEsRUFDL0Q7QUFDQSxFQUFBQSxRQUFPLG1CQUFtQjtBQVExQixXQUFTLEtBQUssWUFBWSxVQUFVLFVBQVU7QUFDMUMsVUFBTSxTQUFTLE9BQU87QUFDdEIsY0FBVSxZQUFZLFVBQVUsVUFBVSxNQUFNO0FBQ2hELFdBQU87QUFBQSxFQUNYO0FBQ0EsRUFBQUEsUUFBTyxPQUFPO0FBUWQsV0FBUyxVQUFVLFlBQVksVUFBVSxVQUFVLFFBQVE7QUFDdkQsYUFBUyxRQUFRLEdBQUcsUUFBUSxJQUFJLFNBQVM7QUFDckMsYUFBTyxHQUFHLEtBQUssSUFDWCxXQUFXLEdBQUcsS0FBSyxLQUFLLElBQU0sWUFBWSxTQUFTLEdBQUcsS0FBSyxJQUFJO0FBQUEsSUFDdkU7QUFDQSxtQkFBZSxNQUFNO0FBQUEsRUFDekI7QUFDQSxFQUFBQSxRQUFPLFlBQVk7QUFXbkIsV0FBUyxjQUFjLFlBQVksVUFBVSxVQUFVO0FBQ25ELFVBQU0sU0FBUyxPQUFPO0FBQ3RCLHVCQUFtQixZQUFZLFVBQVUsVUFBVSxNQUFNO0FBQ3pELFdBQU87QUFBQSxFQUNYO0FBQ0EsRUFBQUEsUUFBTyxnQkFBZ0I7QUFXdkIsV0FBUyxtQkFBbUIsWUFBWSxVQUFVLFVBQVUsUUFBUTtBQUNoRSxVQUFNLGFBQWFLLFNBQVEsS0FBSztBQUNoQyxVQUFNLGdCQUFnQkMsWUFBVyxLQUFLO0FBQ3RDLFVBQU0sbUJBQW1CRCxTQUFRLEtBQUs7QUFDdEMsY0FBVSxZQUFZLFlBQVksZUFBZSxnQkFBZ0I7QUFDakUsVUFBTSxXQUFXQSxTQUFRLEtBQUs7QUFDOUIsVUFBTSxjQUFjQyxZQUFXLEtBQUs7QUFDcEMsVUFBTSxpQkFBaUJELFNBQVEsS0FBSztBQUNwQyxjQUFVLFVBQVUsVUFBVSxhQUFhLGNBQWM7QUFDekQsVUFBTSxjQUFjQSxTQUFRLEtBQUs7QUFDakMsSUFBQUEsU0FBUSxVQUFVLFlBQVksVUFBVSxVQUFVLFdBQVc7QUFDN0QsVUFBTSxpQkFBaUJDLFlBQVcsS0FBSztBQUN2QyxJQUFBQSxZQUFXLFdBQVcsZUFBZSxhQUFhLFVBQVUsY0FBYztBQUMxRSxVQUFNLG9CQUFvQkQsU0FBUSxLQUFLO0FBQ3ZDLElBQUFBLFNBQVEsVUFBVSxrQkFBa0IsZ0JBQWdCLFVBQVUsaUJBQWlCO0FBQy9FLGlCQUFhLGFBQWEsZ0JBQWdCLG1CQUFtQixNQUFNO0FBQUEsRUFDdkU7QUFDQSxFQUFBTCxRQUFPLHFCQUFxQjtBQVM1QixXQUFTLFNBQVMsS0FBSyxRQUFRLElBQUk7QUFDL0IsVUFBTSxTQUFTLE9BQU87QUFDdEIsa0JBQWMsS0FBSyxRQUFRLElBQUksTUFBTTtBQUNyQyxXQUFPO0FBQUEsRUFDWDtBQUNBLEVBQUFBLFFBQU8sV0FBVztBQVNsQixXQUFTLGNBQWMsS0FBSyxRQUFRLElBQUksUUFBUTtBQUM1QyxVQUFNLFFBQVFLLFNBQVEsS0FBSztBQUMzQixVQUFNLFFBQVFBLFNBQVEsS0FBSztBQUMzQixVQUFNLFFBQVFBLFNBQVEsS0FBSztBQUUzQixJQUFBQSxTQUFRLGNBQWMsUUFBUSxLQUFLLEtBQUs7QUFDeEMsSUFBQUEsU0FBUSxlQUFlLE9BQU8sS0FBSztBQUVuQyxJQUFBQSxTQUFRLFdBQVcsSUFBSSxPQUFPLEtBQUs7QUFDbkMsVUFBTSxnQkFBZ0JBLFNBQVEsY0FBYyxLQUFLO0FBQ2pELFFBQUksa0JBQWtCLEdBQUc7QUFDckIsWUFBTSxJQUFJO0FBQUEsSUFDZCxPQUNLO0FBQ0QsTUFBQUEsU0FBUSx5QkFBeUIsT0FBTyxLQUFLLEtBQUssYUFBYSxHQUFHLEtBQUs7QUFBQSxJQUMzRTtBQUVBLElBQUFBLFNBQVEsV0FBVyxPQUFPLE9BQU8sS0FBSztBQUN0QyxJQUFBQSxTQUFRLGVBQWUsT0FBTyxLQUFLO0FBRW5DLFVBQU0sS0FBSyxDQUFDQSxTQUFRLElBQUksT0FBTyxHQUFHO0FBQ2xDLFVBQU0sS0FBSyxDQUFDQSxTQUFRLElBQUksT0FBTyxHQUFHO0FBQ2xDLFVBQU0sS0FBSyxDQUFDQSxTQUFRLElBQUksT0FBTyxHQUFHO0FBQ2xDLG9CQUFnQixNQUFNLEdBQUcsTUFBTSxHQUFHLE1BQU0sR0FBRyxHQUFLLE1BQU0sR0FBRyxNQUFNLEdBQUcsTUFBTSxHQUFHLEdBQUssTUFBTSxHQUFHLE1BQU0sR0FBRyxNQUFNLEdBQUcsR0FBSyxJQUFJLElBQUksSUFBSSxHQUFLLE1BQU07QUFBQSxFQUMzSTtBQUNBLEVBQUFMLFFBQU8sZ0JBQWdCO0FBU3ZCLFdBQVMsU0FBUyxLQUFLLFFBQVEsSUFBSTtBQUMvQixVQUFNLFNBQVMsT0FBTztBQUN0QixrQkFBYyxLQUFLLFFBQVEsSUFBSSxNQUFNO0FBQ3JDLFdBQU87QUFBQSxFQUNYO0FBQ0EsRUFBQUEsUUFBTyxXQUFXO0FBU2xCLFdBQVMsY0FBYyxLQUFLLFFBQVEsSUFBSSxRQUFRO0FBQzVDLFVBQU0sUUFBUUssU0FBUSxLQUFLO0FBQzNCLFVBQU0sUUFBUUEsU0FBUSxLQUFLO0FBQzNCLFVBQU0sUUFBUUEsU0FBUSxLQUFLO0FBRTNCLElBQUFBLFNBQVEsY0FBYyxLQUFLLFFBQVEsS0FBSztBQUN4QyxJQUFBQSxTQUFRLGVBQWUsT0FBTyxLQUFLO0FBRW5DLElBQUFBLFNBQVEsV0FBVyxJQUFJLE9BQU8sS0FBSztBQUNuQyxVQUFNLGdCQUFnQkEsU0FBUSxjQUFjLEtBQUs7QUFDakQsUUFBSSxrQkFBa0IsR0FBRztBQUNyQixZQUFNLElBQUk7QUFBQSxJQUNkLE9BQ0s7QUFDRCxNQUFBQSxTQUFRLHlCQUF5QixPQUFPLEtBQUssS0FBSyxhQUFhLEdBQUcsS0FBSztBQUFBLElBQzNFO0FBRUEsSUFBQUEsU0FBUSxXQUFXLE9BQU8sT0FBTyxLQUFLO0FBQ3RDLElBQUFBLFNBQVEsZUFBZSxPQUFPLEtBQUs7QUFFbkMsVUFBTSxLQUFLLENBQUNBLFNBQVEsSUFBSSxPQUFPLEdBQUc7QUFDbEMsVUFBTSxLQUFLLENBQUNBLFNBQVEsSUFBSSxPQUFPLEdBQUc7QUFDbEMsVUFBTSxLQUFLLENBQUNBLFNBQVEsSUFBSSxPQUFPLEdBQUc7QUFDbEMsb0JBQWdCLE1BQU0sR0FBRyxNQUFNLEdBQUcsTUFBTSxHQUFHLEdBQUssTUFBTSxHQUFHLE1BQU0sR0FBRyxNQUFNLEdBQUcsR0FBSyxNQUFNLEdBQUcsTUFBTSxHQUFHLE1BQU0sR0FBRyxHQUFLLElBQUksSUFBSSxJQUFJLEdBQUssTUFBTTtBQUFBLEVBQzNJO0FBQ0EsRUFBQUwsUUFBTyxnQkFBZ0I7QUFTdkIsV0FBUyxRQUFRLE9BQU8sUUFBUSxPQUFPLE1BQU07QUFDekMsVUFBTSxTQUFTLE9BQU87QUFDdEIsaUJBQWEsT0FBTyxRQUFRLE9BQU8sTUFBTSxNQUFNO0FBQy9DLFdBQU87QUFBQSxFQUNYO0FBQ0EsRUFBQUEsUUFBTyxVQUFVO0FBU2pCLFdBQVMsYUFBYSxPQUFPLFFBQVEsT0FBTyxNQUFNLFFBQVE7QUFDdEQsVUFBTSxJQUFJO0FBQ1YsVUFBTSxJQUFJO0FBQ1YsVUFBTSxJQUFJLElBQU07QUFDaEIsVUFBTSxJQUFJLElBQU07QUFDaEIsVUFBTSxJQUFJLEtBQU8sSUFBSTtBQUNyQixVQUFNLElBQUksRUFBRSxJQUFJLE1BQU0sSUFBSTtBQUMxQixvQkFBZ0IsR0FBRyxHQUFLLEdBQUssR0FBSyxHQUFLLEdBQUcsR0FBSyxHQUFLLEdBQUssR0FBSyxHQUFHLEdBQUssR0FBSyxHQUFLLEdBQUcsR0FBSyxNQUFNO0FBQzlGLDBCQUFzQixRQUFRLE1BQU0sS0FBSyxNQUFNLEtBQUssTUFBTSxLQUFLLE1BQU0sQ0FBQztBQUFBLEVBQzFFO0FBQ0EsRUFBQUEsUUFBTyxlQUFlO0FBV3RCLFdBQVMsaUJBQWlCLE1BQU0sT0FBTyxRQUFRLEtBQUssT0FBTyxNQUFNO0FBQzdELFVBQU0sU0FBUyxPQUFPO0FBQ3RCLDBCQUFzQixNQUFNLE9BQU8sUUFBUSxLQUFLLE9BQU8sTUFBTSxNQUFNO0FBQ25FLFdBQU87QUFBQSxFQUNYO0FBQ0EsRUFBQUEsUUFBTyxtQkFBbUI7QUFXMUIsV0FBUyxzQkFBc0IsTUFBTSxPQUFPLFFBQVEsS0FBSyxPQUFPLE1BQU0sUUFBUTtBQUMxRSxVQUFNLElBQUk7QUFDVixVQUFNLElBQUk7QUFDVixVQUFNLElBQUksS0FBTyxRQUFRO0FBQ3pCLFVBQU0sSUFBSSxLQUFPLE1BQU07QUFDdkIsVUFBTSxJQUFJLEtBQU8sSUFBSTtBQUNyQixVQUFNLElBQUksRUFBRSxJQUFJLE1BQU0sSUFBSTtBQUMxQixVQUFNLE1BQU0sT0FBTyxVQUFVLE9BQU87QUFDcEMsVUFBTSxNQUFNLE1BQU0sV0FBVyxTQUFTO0FBQ3RDLG9CQUFnQixHQUFHLEdBQUssR0FBSyxHQUFLLEdBQUssR0FBRyxHQUFLLEdBQUssR0FBSyxHQUFLLEdBQUcsR0FBSyxJQUFJLElBQUksR0FBRyxHQUFLLE1BQU07QUFDNUYsbUJBQWUsTUFBTTtBQUFBLEVBQ3pCO0FBQ0EsRUFBQUEsUUFBTyx3QkFBd0I7QUFXL0IsV0FBUyxpQkFBaUIsTUFBTSxPQUFPLFFBQVEsS0FBSyxPQUFPLE1BQU07QUFDN0QsVUFBTSxTQUFTLE9BQU87QUFDdEIsMEJBQXNCLE1BQU0sT0FBTyxRQUFRLEtBQUssT0FBTyxNQUFNLE1BQU07QUFDbkUsV0FBTztBQUFBLEVBQ1g7QUFDQSxFQUFBQSxRQUFPLG1CQUFtQjtBQVcxQixXQUFTLHNCQUFzQixNQUFNLE9BQU8sUUFBUSxLQUFLLE9BQU8sTUFBTSxRQUFRO0FBQzFFLDBCQUFzQixNQUFNLE9BQU8sUUFBUSxLQUFLLE9BQU8sTUFBTSxNQUFNO0FBQ25FLFdBQU8sR0FBRyxFQUFFLEtBQUs7QUFBQSxFQUNyQjtBQUNBLEVBQUFBLFFBQU8sd0JBQXdCO0FBUy9CLFdBQVMsY0FBYyxPQUFPLFFBQVEsT0FBTyxNQUFNO0FBQy9DLFVBQU0sU0FBUyxPQUFPO0FBQ3RCLFVBQU0sSUFBSTtBQUNWLFVBQU0sSUFBSTtBQUNWLFVBQU0sSUFBSyxJQUFNLElBQUs7QUFDdEIsVUFBTSxJQUFLLElBQU0sSUFBSztBQUN0QixVQUFNLEtBQUssSUFBSSxNQUFNLElBQUk7QUFDekIsVUFBTSxJQUFLLEtBQU8sSUFBSSxLQUFNLElBQUk7QUFDaEMsb0JBQWdCLEdBQUcsR0FBSyxHQUFLLEdBQUssR0FBSyxHQUFHLEdBQUssR0FBSyxHQUFLLEdBQUssR0FBRyxHQUFLLEdBQUssR0FBSyxHQUFHLEdBQUssTUFBTTtBQUM5RiwwQkFBc0IsUUFBUSxLQUFLO0FBQ25DLFdBQU87QUFBQSxFQUNYO0FBQ0EsRUFBQUEsUUFBTyxnQkFBZ0I7QUFTdkIsV0FBUyxpQkFBaUIsS0FBSyxRQUFRLE9BQU8sTUFBTTtBQUNoRCxVQUFNLFNBQVMsT0FBTztBQUN0QiwwQkFBc0IsS0FBSyxRQUFRLE9BQU8sTUFBTSxNQUFNO0FBQ3RELFdBQU87QUFBQSxFQUNYO0FBQ0EsRUFBQUEsUUFBTyxtQkFBbUI7QUFVMUIsV0FBUyxzQkFBc0IsS0FBSyxRQUFRLE9BQU8sTUFBTSxRQUFRLHFCQUFxQixNQUFNO0FBQ3hGLFVBQU0sSUFBSTtBQUNWLFVBQU0sSUFBSTtBQUNWLFVBQU0sSUFBSSxJQUFNLEtBQUssSUFBSSxNQUFNLEdBQUc7QUFDbEMsVUFBTSxJQUFJLHFCQUFxQixJQUFJLFNBQVM7QUFDNUMsVUFBTSxJQUFJLHFCQUFxQixJQUFJLElBQUk7QUFDdkMsVUFBTSxLQUFLLElBQUksTUFBTSxJQUFJO0FBQ3pCLFVBQU0sSUFBSyxLQUFPLElBQUksS0FBTSxJQUFJO0FBQ2hDLG9CQUFnQixHQUFHLEdBQUssR0FBSyxHQUFLLEdBQUssR0FBRyxHQUFLLEdBQUssR0FBSyxHQUFLLEdBQUcsR0FBSyxHQUFLLEdBQUssR0FBRyxHQUFLLE1BQU07QUFDOUYsMEJBQXNCLFFBQVEsS0FBSztBQUFBLEVBQ3ZDO0FBQ0EsRUFBQUEsUUFBTyx3QkFBd0I7QUFTL0IsV0FBUyxpQkFBaUIsS0FBSyxRQUFRLE9BQU8sTUFBTTtBQUNoRCxVQUFNLFNBQVMsT0FBTztBQUN0QiwwQkFBc0IsS0FBSyxRQUFRLE9BQU8sTUFBTSxNQUFNO0FBQ3RELFdBQU87QUFBQSxFQUNYO0FBQ0EsRUFBQUEsUUFBTyxtQkFBbUI7QUFVMUIsV0FBUyxzQkFBc0IsS0FBSyxRQUFRLE9BQU8sTUFBTSxRQUFRLHFCQUFxQixNQUFNO0FBTXhGLFVBQU0sSUFBSTtBQUNWLFVBQU0sSUFBSTtBQUNWLFVBQU0sSUFBSSxJQUFNLEtBQUssSUFBSSxNQUFNLEdBQUc7QUFDbEMsVUFBTSxJQUFJLHFCQUFxQixJQUFJLFNBQVM7QUFDNUMsVUFBTSxJQUFJLHFCQUFxQixJQUFJLElBQUk7QUFDdkMsVUFBTSxJQUFJLEVBQUUsSUFBSSxNQUFNLElBQUk7QUFDMUIsVUFBTSxJQUFLLEtBQUssSUFBSSxLQUFNLElBQUk7QUFDOUIsb0JBQWdCLEdBQUcsR0FBSyxHQUFLLEdBQUssR0FBSyxHQUFHLEdBQUssR0FBSyxHQUFLLEdBQUssR0FBRyxJQUFNLEdBQUssR0FBSyxHQUFHLEdBQUssTUFBTTtBQUMvRiwwQkFBc0IsUUFBUSxLQUFLO0FBQUEsRUFDdkM7QUFDQSxFQUFBQSxRQUFPLHdCQUF3QjtBQVMvQixXQUFTLHlCQUF5QixLQUFLLE9BQU8sTUFBTSxRQUFRLGNBQWMsT0FBTztBQUM3RSxVQUFNLG9CQUFvQixjQUFjLEtBQUs7QUFDN0MsVUFBTSxRQUFRLEtBQUssSUFBSyxJQUFJLFlBQVksS0FBSyxLQUFNLEdBQUs7QUFDeEQsVUFBTSxVQUFVLEtBQUssSUFBSyxJQUFJLGNBQWMsS0FBSyxLQUFNLEdBQUs7QUFDNUQsVUFBTSxVQUFVLEtBQUssSUFBSyxJQUFJLGNBQWMsS0FBSyxLQUFNLEdBQUs7QUFDNUQsVUFBTSxXQUFXLEtBQUssSUFBSyxJQUFJLGVBQWUsS0FBSyxLQUFNLEdBQUs7QUFDOUQsVUFBTSxTQUFTLEtBQU8sVUFBVTtBQUNoQyxVQUFNLFNBQVMsS0FBTyxRQUFRO0FBQzlCLFVBQU1HLEtBQUksT0FBTztBQUNqQixJQUFBQSxHQUFFLENBQUMsSUFBSTtBQUNQLElBQUFBLEdBQUUsQ0FBQyxJQUFJQSxHQUFFLENBQUMsSUFBSUEsR0FBRSxDQUFDLElBQUlBLEdBQUUsQ0FBQyxJQUFJO0FBQzVCLElBQUFBLEdBQUUsQ0FBQyxJQUFJO0FBQ1AsSUFBQUEsR0FBRSxDQUFDLElBQUlBLEdBQUUsQ0FBQyxJQUFJO0FBQ2QsSUFBQUEsR0FBRSxDQUFDLEtBQUssVUFBVSxZQUFZLFNBQVM7QUFDdkMsSUFBQUEsR0FBRSxDQUFDLElBQUksR0FBRyxRQUFRLFdBQVcsU0FBUztBQUN0QyxJQUFBQSxHQUFFLEVBQUUsSUFBSSxDQUFDLFFBQVEsUUFBUTtBQUN6QixJQUFBQSxHQUFFLEVBQUUsSUFBSSxJQUFNO0FBQ2QsSUFBQUEsR0FBRSxFQUFFLElBQUlBLEdBQUUsRUFBRSxJQUFJQSxHQUFFLEVBQUUsSUFBSTtBQUN4QixJQUFBQSxHQUFFLEVBQUUsSUFBSSxFQUFFLElBQU0sT0FBTyxVQUFVLE9BQU87QUFDeEMsbUJBQWUsTUFBTTtBQUFBLEVBQ3pCO0FBQ0EsRUFBQUgsUUFBTywyQkFBMkI7QUFNbEMsV0FBUyxlQUFlLFFBQVE7QUFDNUIsV0FBTyxDQUFDLE9BQU8sR0FBRyxDQUFDLEdBQUcsT0FBTyxHQUFHLENBQUMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUM7QUFBQSxFQUNsRTtBQUNBLEVBQUFBLFFBQU8saUJBQWlCO0FBTXhCLFdBQVMsZUFBZSxRQUFRO0FBQzVCLFdBQU87QUFBQSxNQUNILE9BQU8sR0FBRyxDQUFDO0FBQUEsTUFDWCxPQUFPLEdBQUcsQ0FBQztBQUFBLE1BQ1gsT0FBTyxHQUFHLENBQUM7QUFBQSxNQUNYLE9BQU8sR0FBRyxDQUFDO0FBQUEsTUFDWCxPQUFPLEdBQUcsQ0FBQztBQUFBLE1BQ1gsT0FBTyxHQUFHLENBQUM7QUFBQSxNQUNYLE9BQU8sR0FBRyxDQUFDO0FBQUEsTUFDWCxPQUFPLEdBQUcsQ0FBQztBQUFBLE1BQ1gsT0FBTyxHQUFHLEVBQUU7QUFBQSxJQUNoQjtBQUFBLEVBQ0o7QUFDQSxFQUFBQSxRQUFPLGlCQUFpQjtBQU14QixXQUFTLFVBQVUsUUFBUTtBQUN2QixVQUFNLFNBQVMsT0FBTztBQUN0QixtQkFBZSxRQUFRLE1BQU07QUFDN0IsV0FBTztBQUFBLEVBQ1g7QUFDQSxFQUFBQSxRQUFPLFlBQVk7QUFNbkIsV0FBUyxlQUFlLFFBQVEsUUFBUTtBQUNwQyxVQUFNLEtBQUssT0FBTztBQUNsQixVQUFNLEtBQUssT0FBTztBQUNsQixPQUFHLENBQUMsSUFBSSxHQUFHLENBQUM7QUFDWixPQUFHLENBQUMsSUFBSSxHQUFHLENBQUM7QUFDWixPQUFHLENBQUMsSUFBSSxHQUFHLENBQUM7QUFDWixPQUFHLENBQUMsSUFBSSxHQUFHLEVBQUU7QUFDYixPQUFHLENBQUMsSUFBSSxHQUFHLENBQUM7QUFDWixPQUFHLENBQUMsSUFBSSxHQUFHLENBQUM7QUFDWixPQUFHLENBQUMsSUFBSSxHQUFHLENBQUM7QUFDWixPQUFHLENBQUMsSUFBSSxHQUFHLEVBQUU7QUFDYixPQUFHLENBQUMsSUFBSSxHQUFHLENBQUM7QUFDWixPQUFHLENBQUMsSUFBSSxHQUFHLENBQUM7QUFDWixPQUFHLEVBQUUsSUFBSSxHQUFHLEVBQUU7QUFDZCxPQUFHLEVBQUUsSUFBSSxHQUFHLEVBQUU7QUFDZCxPQUFHLEVBQUUsSUFBSSxHQUFHLENBQUM7QUFDYixPQUFHLEVBQUUsSUFBSSxHQUFHLENBQUM7QUFDYixPQUFHLEVBQUUsSUFBSSxHQUFHLEVBQUU7QUFDZCxPQUFHLEVBQUUsSUFBSSxHQUFHLEVBQUU7QUFFZCwwQkFBc0IsUUFBUSxPQUFPLFlBQVksT0FBTyxnQkFBZ0I7QUFBQSxFQUM1RTtBQUNBLEVBQUFBLFFBQU8saUJBQWlCO0FBTXhCLFdBQVMsV0FBVyxPQUFPO0FBQ3ZCLFVBQU0sU0FBUyxPQUFPO0FBQ3RCLG9CQUFnQixPQUFPLE1BQU07QUFDN0IsV0FBTztBQUFBLEVBQ1g7QUFDQSxFQUFBQSxRQUFPLGFBQWE7QUFNcEIsV0FBUyxnQkFBZ0IsUUFBUSxRQUFRO0FBQ3JDLFVBQU0sUUFBUSxNQUFNLFVBQVUsTUFBTTtBQUNwQyxVQUFNLElBQUksTUFBTSxPQUFPO0FBQ3ZCLFVBQU0sSUFBSSxNQUFNLE9BQU87QUFDdkIsVUFBTSxJQUFJLE1BQU0sT0FBTztBQUN2QixVQUFNLE9BQU8sS0FBSztBQUNsQixVQUFNLFFBQVEsS0FBSztBQUNuQixVQUFNLFFBQVEsS0FBSztBQUNuQixvQkFBZ0IsT0FBTyxJQUFJLEdBQUcsUUFBUSxHQUFHLFFBQVEsR0FBRyxHQUFLLE9BQU8sR0FBRyxRQUFRLElBQUksR0FBRyxRQUFRLEdBQUcsR0FBSyxPQUFPLEdBQUcsUUFBUSxHQUFHLFFBQVEsSUFBSSxHQUFHLEdBQUssT0FBTyxNQUFNLEdBQUcsUUFBUSxNQUFNLEdBQUcsUUFBUSxNQUFNLEdBQUcsR0FBSyxNQUFNO0FBQUEsRUFDNU07QUFDQSxFQUFBQSxRQUFPLGtCQUFrQjtBQVF6QixXQUFTLGlCQUFpQixPQUFPLE9BQU8sT0FBTyxRQUFRO0FBQ25ELG9CQUFnQixNQUFNLEdBQUcsTUFBTSxHQUFHLE1BQU0sR0FBRyxHQUFLLE1BQU0sR0FBRyxNQUFNLEdBQUcsTUFBTSxHQUFHLEdBQUssTUFBTSxHQUFHLE1BQU0sR0FBRyxNQUFNLEdBQUcsR0FBSyxHQUFLLEdBQUssR0FBSyxHQUFLLE1BQU07QUFBQSxFQUM5STtBQUNBLEVBQUFBLFFBQU8sbUJBQW1CO0FBTTFCLFdBQVMsb0JBQW9CLE1BQU0sUUFBUTtBQUN2QyxVQUFNLEtBQUssS0FBSyxJQUFJLEtBQUs7QUFDekIsVUFBTSxLQUFLLEtBQUssSUFBSSxLQUFLO0FBQ3pCLFVBQU0sS0FBSyxLQUFLLElBQUksS0FBSztBQUN6QixVQUFNLEtBQUssS0FBSyxJQUFJLEtBQUs7QUFDekIsVUFBTSxLQUFLLEtBQUssSUFBSSxLQUFLO0FBQ3pCLFVBQU0sS0FBSyxLQUFLLElBQUksS0FBSztBQUN6QixVQUFNLEtBQUssS0FBSyxJQUFJLEtBQUs7QUFDekIsVUFBTSxLQUFLLEtBQUssSUFBSSxLQUFLO0FBQ3pCLFVBQU0sS0FBSyxLQUFLLElBQUksS0FBSztBQUN6QixXQUFPLEdBQUcsQ0FBQyxJQUFJLElBQU0sS0FBTyxLQUFLO0FBQ2pDLFdBQU8sR0FBRyxDQUFDLElBQUksS0FBTyxLQUFLO0FBQzNCLFdBQU8sR0FBRyxDQUFDLElBQUksS0FBTyxLQUFLO0FBQzNCLFdBQU8sR0FBRyxDQUFDLElBQUk7QUFDZixXQUFPLEdBQUcsQ0FBQyxJQUFJLEtBQU8sS0FBSztBQUMzQixXQUFPLEdBQUcsQ0FBQyxJQUFJLElBQU0sS0FBTyxLQUFLO0FBQ2pDLFdBQU8sR0FBRyxDQUFDLElBQUksS0FBTyxLQUFLO0FBQzNCLFdBQU8sR0FBRyxDQUFDLElBQUk7QUFDZixXQUFPLEdBQUcsQ0FBQyxJQUFJLEtBQU8sS0FBSztBQUMzQixXQUFPLEdBQUcsQ0FBQyxJQUFJLEtBQU8sS0FBSztBQUMzQixXQUFPLEdBQUcsRUFBRSxJQUFJLElBQU0sS0FBTyxLQUFLO0FBQ2xDLFdBQU8sR0FBRyxFQUFFLElBQUk7QUFDaEIsV0FBTyxHQUFHLEVBQUUsSUFBSTtBQUNoQixXQUFPLEdBQUcsRUFBRSxJQUFJO0FBQ2hCLFdBQU8sR0FBRyxFQUFFLElBQUk7QUFDaEIsV0FBTyxHQUFHLEVBQUUsSUFBSTtBQUNoQixtQkFBZSxNQUFNO0FBQUEsRUFDekI7QUFDQSxFQUFBQSxRQUFPLHNCQUFzQjtBQUU3QixXQUFTLGVBQWVDLE9BQU07QUFDMUIsSUFBQUEsTUFBSyxhQUFhO0FBQ2xCLElBQUFBLE1BQUssYUFBYTtBQUNsQixJQUFBQSxNQUFLLGdCQUFnQjtBQUNyQixJQUFBQSxNQUFLLG1CQUFtQjtBQUN4QixJQUFBQSxNQUFLLHNCQUFzQjtBQUFBLEVBQy9CO0FBTUEsV0FBUyxpQkFBaUJBLE9BQU07QUFDNUIsUUFBSUEsTUFBSyxrQkFBa0I7QUFDdkIsTUFBQUEsTUFBSyxtQkFBbUI7QUFDeEIsWUFBTUUsS0FBSUYsTUFBSztBQUNmLE1BQUFBLE1BQUssYUFDREUsR0FBRSxDQUFDLE1BQU0sS0FDTEEsR0FBRSxDQUFDLE1BQU0sS0FDVEEsR0FBRSxDQUFDLE1BQU0sS0FDVEEsR0FBRSxDQUFDLE1BQU0sS0FDVEEsR0FBRSxDQUFDLE1BQU0sS0FDVEEsR0FBRSxDQUFDLE1BQU0sS0FDVEEsR0FBRSxDQUFDLE1BQU0sS0FDVEEsR0FBRSxDQUFDLE1BQU0sS0FDVEEsR0FBRSxDQUFDLE1BQU0sS0FDVEEsR0FBRSxDQUFDLE1BQU0sS0FDVEEsR0FBRSxFQUFFLE1BQU0sS0FDVkEsR0FBRSxFQUFFLE1BQU0sS0FDVkEsR0FBRSxFQUFFLE1BQU0sS0FDVkEsR0FBRSxFQUFFLE1BQU0sS0FDVkEsR0FBRSxFQUFFLE1BQU0sS0FDVkEsR0FBRSxFQUFFLE1BQU07QUFBQSxJQUN0QjtBQUNBLFdBQU9GLE1BQUs7QUFBQSxFQUNoQjtBQUNBLEVBQUFELFFBQU8sbUJBQW1CO0FBSzFCLFdBQVMsc0JBQXNCQyxPQUFNO0FBQ2pDLFFBQUlBLE1BQUsscUJBQXFCO0FBQzFCLE1BQUFBLE1BQUssc0JBQXNCO0FBQzNCLFVBQUlBLE1BQUssR0FBRyxDQUFDLE1BQU0sS0FBT0EsTUFBSyxHQUFHLENBQUMsTUFBTSxLQUFPQSxNQUFLLEdBQUcsRUFBRSxNQUFNLEdBQUs7QUFDakUsUUFBQUEsTUFBSyxnQkFBZ0I7QUFBQSxNQUN6QixXQUNTQSxNQUFLLEdBQUcsQ0FBQyxNQUFNLEtBQ3BCQSxNQUFLLEdBQUcsQ0FBQyxNQUFNLEtBQ2ZBLE1BQUssR0FBRyxDQUFDLE1BQU0sS0FDZkEsTUFBSyxHQUFHLENBQUMsTUFBTSxLQUNmQSxNQUFLLEdBQUcsQ0FBQyxNQUFNLEtBQ2ZBLE1BQUssR0FBRyxDQUFDLE1BQU0sS0FDZkEsTUFBSyxHQUFHLENBQUMsTUFBTSxLQUNmQSxNQUFLLEdBQUcsQ0FBQyxNQUFNLEtBQ2ZBLE1BQUssR0FBRyxFQUFFLE1BQU0sS0FDaEJBLE1BQUssR0FBRyxFQUFFLE1BQU0sS0FDaEJBLE1BQUssR0FBRyxFQUFFLE1BQU0sS0FDaEJBLE1BQUssR0FBRyxFQUFFLE1BQU0sS0FDaEJBLE1BQUssR0FBRyxFQUFFLE1BQU0sR0FBSztBQUNyQixRQUFBQSxNQUFLLGdCQUFnQjtBQUFBLE1BQ3pCLE9BQ0s7QUFDRCxRQUFBQSxNQUFLLGdCQUFnQjtBQUFBLE1BQ3pCO0FBQUEsSUFDSjtBQUNBLFdBQU9BLE1BQUs7QUFBQSxFQUNoQjtBQUNBLEVBQUFELFFBQU8sd0JBQXdCO0FBSy9CLFdBQVMsWUFBWUMsT0FBTTtBQUN2QixRQUFJQSxNQUFLLGVBQWUsTUFBTTtBQUMxQixhQUFPO0FBQUEsSUFDWDtBQUNBLFVBQU1FLEtBQUlGLE1BQUs7QUFFZixVQUFNLE1BQU1FLEdBQUUsQ0FBQyxHQUFHLE1BQU1BLEdBQUUsQ0FBQyxHQUFHLE1BQU1BLEdBQUUsQ0FBQyxHQUFHLE1BQU1BLEdBQUUsQ0FBQztBQUVuRCxVQUFNLE1BQU1BLEdBQUUsQ0FBQyxHQUFHLE1BQU1BLEdBQUUsQ0FBQyxHQUFHLE1BQU1BLEdBQUUsQ0FBQyxHQUFHLE1BQU1BLEdBQUUsQ0FBQztBQUVuRCxVQUFNLE1BQU1BLEdBQUUsQ0FBQyxHQUFHLE1BQU1BLEdBQUUsQ0FBQyxHQUFHLE1BQU1BLEdBQUUsRUFBRSxHQUFHLE1BQU1BLEdBQUUsRUFBRTtBQUVyRCxVQUFNLE1BQU1BLEdBQUUsRUFBRSxHQUFHLE1BQU1BLEdBQUUsRUFBRSxHQUFHLE1BQU1BLEdBQUUsRUFBRSxHQUFHLE1BQU1BLEdBQUUsRUFBRTtBQWF2RCxVQUFNLFlBQVksTUFBTSxNQUFNLE1BQU07QUFDcEMsVUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNO0FBQ3BDLFVBQU0sWUFBWSxNQUFNLE1BQU0sTUFBTTtBQUNwQyxVQUFNLFlBQVksTUFBTSxNQUFNLE1BQU07QUFDcEMsVUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNO0FBQ3BDLFVBQU0sWUFBWSxNQUFNLE1BQU0sTUFBTTtBQUNwQyxVQUFNLFlBQVksRUFBRSxNQUFNLFlBQVksTUFBTSxZQUFZLE1BQU07QUFDOUQsVUFBTSxZQUFZLEVBQUUsTUFBTSxZQUFZLE1BQU0sWUFBWSxNQUFNO0FBQzlELFVBQU0sWUFBWSxFQUFFLE1BQU0sWUFBWSxNQUFNLFlBQVksTUFBTTtBQUM5RCxVQUFNLFlBQVksRUFBRSxNQUFNLFlBQVksTUFBTSxZQUFZLE1BQU07QUFFOUQsV0FBTyxNQUFNLFlBQVksTUFBTSxZQUFZLE1BQU0sWUFBWSxNQUFNO0FBQUEsRUFDdkU7QUFDQSxFQUFBSCxRQUFPLGNBQWM7QUFNckIsV0FBUyxRQUFRQyxPQUFNO0FBQ25CLFdBQU9BLE1BQUs7QUFBQSxFQUNoQjtBQUNBLEVBQUFELFFBQU8sVUFBVTtBQUtqQixXQUFTLFFBQVFDLE9BQU07QUFDbkIsV0FBT0EsTUFBSztBQUFBLEVBQ2hCO0FBQ0EsRUFBQUQsUUFBTyxVQUFVO0FBS2pCLFdBQVMsTUFBTUMsT0FBTTtBQUNqQixvQkFBZ0IsR0FBSyxHQUFLLEdBQUssR0FBSyxHQUFLLEdBQUssR0FBSyxHQUFLLEdBQUssR0FBSyxHQUFLLEdBQUssR0FBSyxHQUFLLEdBQUssR0FBS0EsS0FBSTtBQUNwRywwQkFBc0JBLE9BQU0sS0FBSztBQUFBLEVBQ3JDO0FBQ0EsRUFBQUQsUUFBTyxRQUFRO0FBTWYsV0FBU08sS0FBSU4sT0FBTSxPQUFPO0FBQ3RCLFVBQU0sU0FBUyxPQUFPO0FBQ3RCLGFBQVNBLE9BQU0sT0FBTyxNQUFNO0FBQzVCLFdBQU87QUFBQSxFQUNYO0FBQ0EsRUFBQUQsUUFBTyxNQUFNTztBQU9iLFdBQVMsU0FBU04sT0FBTSxPQUFPLFFBQVE7QUFDbkMsYUFBUyxRQUFRLEdBQUcsUUFBUSxJQUFJLFNBQVM7QUFDckMsYUFBTyxHQUFHLEtBQUssSUFBSUEsTUFBSyxHQUFHLEtBQUssSUFBSSxNQUFNLEdBQUcsS0FBSztBQUFBLElBQ3REO0FBQ0EsbUJBQWUsTUFBTTtBQUFBLEVBQ3pCO0FBQ0EsRUFBQUQsUUFBTyxXQUFXO0FBTWxCLFdBQVMsVUFBVUMsT0FBTSxPQUFPO0FBQzVCLGFBQVMsUUFBUSxHQUFHLFFBQVEsSUFBSSxTQUFTO0FBQ3JDLE1BQUFBLE1BQUssR0FBRyxLQUFLLEtBQUssTUFBTSxHQUFHLEtBQUs7QUFBQSxJQUNwQztBQUNBLG1CQUFlQSxLQUFJO0FBQUEsRUFDdkI7QUFDQSxFQUFBRCxRQUFPLFlBQVk7QUFNbkIsV0FBUyxPQUFPLFFBQVE7QUFDcEIsVUFBTSxTQUFTLE9BQU87QUFDdEIsZ0JBQVksUUFBUSxNQUFNO0FBQzFCLFdBQU87QUFBQSxFQUNYO0FBQ0EsRUFBQUEsUUFBTyxTQUFTO0FBTWhCLFdBQVMsWUFBWSxRQUFRLFFBQVE7QUFDakMsUUFBSSxPQUFPLGVBQWUsTUFBTTtBQUM1QixXQUFLLFFBQVEsTUFBTTtBQUNuQjtBQUFBLElBQ0o7QUFFQSxVQUFNRyxLQUFJLE9BQU87QUFFakIsVUFBTSxNQUFNQSxHQUFFLENBQUMsR0FBRyxNQUFNQSxHQUFFLENBQUMsR0FBRyxNQUFNQSxHQUFFLENBQUMsR0FBRyxNQUFNQSxHQUFFLENBQUM7QUFDbkQsVUFBTSxNQUFNQSxHQUFFLENBQUMsR0FBRyxNQUFNQSxHQUFFLENBQUMsR0FBRyxNQUFNQSxHQUFFLENBQUMsR0FBRyxNQUFNQSxHQUFFLENBQUM7QUFDbkQsVUFBTSxNQUFNQSxHQUFFLENBQUMsR0FBRyxNQUFNQSxHQUFFLENBQUMsR0FBRyxNQUFNQSxHQUFFLEVBQUUsR0FBRyxNQUFNQSxHQUFFLEVBQUU7QUFDckQsVUFBTSxNQUFNQSxHQUFFLEVBQUUsR0FBRyxNQUFNQSxHQUFFLEVBQUUsR0FBRyxNQUFNQSxHQUFFLEVBQUUsR0FBRyxNQUFNQSxHQUFFLEVBQUU7QUFHdkQsVUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNO0FBQ3BDLFVBQU0sWUFBWSxNQUFNLE1BQU0sTUFBTTtBQUNwQyxVQUFNLFlBQVksTUFBTSxNQUFNLE1BQU07QUFDcEMsVUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNO0FBQ3BDLFVBQU0sWUFBWSxNQUFNLE1BQU0sTUFBTTtBQUNwQyxVQUFNLFlBQVksTUFBTSxNQUFNLE1BQU07QUFDcEMsVUFBTSxZQUFZLEVBQUUsTUFBTSxZQUFZLE1BQU0sWUFBWSxNQUFNO0FBQzlELFVBQU0sWUFBWSxFQUFFLE1BQU0sWUFBWSxNQUFNLFlBQVksTUFBTTtBQUM5RCxVQUFNLFlBQVksRUFBRSxNQUFNLFlBQVksTUFBTSxZQUFZLE1BQU07QUFDOUQsVUFBTSxZQUFZLEVBQUUsTUFBTSxZQUFZLE1BQU0sWUFBWSxNQUFNO0FBQzlELFVBQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxZQUFZLE1BQU0sWUFBWSxNQUFNO0FBQ3hFLFFBQUksUUFBUSxHQUFHO0FBQ1gsV0FBSyxRQUFRLE1BQU07QUFDbkI7QUFBQSxJQUNKO0FBQ0EsVUFBTSxTQUFTLElBQUk7QUFDbkIsVUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNO0FBQ3BDLFVBQU0sWUFBWSxNQUFNLE1BQU0sTUFBTTtBQUNwQyxVQUFNLFlBQVksTUFBTSxNQUFNLE1BQU07QUFDcEMsVUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNO0FBQ3BDLFVBQU0sWUFBWSxNQUFNLE1BQU0sTUFBTTtBQUNwQyxVQUFNLFlBQVksTUFBTSxNQUFNLE1BQU07QUFDcEMsVUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNO0FBQ3BDLFVBQU0sWUFBWSxNQUFNLE1BQU0sTUFBTTtBQUNwQyxVQUFNLFlBQVksTUFBTSxNQUFNLE1BQU07QUFDcEMsVUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNO0FBQ3BDLFVBQU0sWUFBWSxNQUFNLE1BQU0sTUFBTTtBQUNwQyxVQUFNLFlBQVksTUFBTSxNQUFNLE1BQU07QUFDcEMsVUFBTSxZQUFZLEVBQUUsTUFBTSxZQUFZLE1BQU0sWUFBWSxNQUFNO0FBQzlELFVBQU0sWUFBWSxFQUFFLE1BQU0sWUFBWSxNQUFNLFlBQVksTUFBTTtBQUM5RCxVQUFNLFlBQVksRUFBRSxNQUFNLFlBQVksTUFBTSxZQUFZLE1BQU07QUFDOUQsVUFBTSxZQUFZLEVBQUUsTUFBTSxZQUFZLE1BQU0sWUFBWSxNQUFNO0FBQzlELFVBQU0sWUFBWSxFQUFFLE1BQU0sWUFBWSxNQUFNLFlBQVksTUFBTTtBQUM5RCxVQUFNLFlBQVksRUFBRSxNQUFNLFlBQVksTUFBTSxZQUFZLE1BQU07QUFDOUQsVUFBTSxZQUFZLEVBQUUsTUFBTSxZQUFZLE1BQU0sWUFBWSxNQUFNO0FBQzlELFVBQU0sWUFBWSxFQUFFLE1BQU0sWUFBWSxNQUFNLFlBQVksTUFBTTtBQUM5RCxVQUFNLFlBQVksRUFBRSxNQUFNLFlBQVksTUFBTSxZQUFZLE1BQU07QUFDOUQsVUFBTSxZQUFZLEVBQUUsTUFBTSxZQUFZLE1BQU0sWUFBWSxNQUFNO0FBQzlELFVBQU0sWUFBWSxFQUFFLE1BQU0sWUFBWSxNQUFNLFlBQVksTUFBTTtBQUM5RCxVQUFNLFlBQVksRUFBRSxNQUFNLFlBQVksTUFBTSxZQUFZLE1BQU07QUFDOUQsb0JBQWdCLFlBQVksUUFBUSxZQUFZLFFBQVEsWUFBWSxRQUFRLFlBQVksUUFBUSxZQUFZLFFBQVEsWUFBWSxRQUFRLFlBQVks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QTtBQUNBLEVBQUFBLFlBQUEsa0JBQUEsSUFBQTtBQUNBLEVBQUFBLFlBQUEsWUFBQSxJQUFBO0FBQ0EsRUFBQUEsWUFBQSxZQUFBLElBQUE7QUFDQSxFQUFBQSxZQUFBLGdCQUFBLElBQUE7QUFDQSxFQUFBQSxZQUFBLGtCQUFBLElBQUE7QUFDQSxFQUFBQSxZQUFBLG9CQUFBLElBQUE7QUFDQSxFQUFBQSxZQUFBLG1CQUFBLElBQUE7QUFDQSxFQUFBQSxZQUFBLG1CQUFBLElBQUE7QUFDQSxFQUFBQSxZQUFBLG1CQUFBLElBQUE7QUFDQSxFQUFBQSxZQUFBLG1CQUFBLElBQUE7QUFDQSxFQUFBQSxZQUFBLGlCQUFBLElBQUE7QUFDQSxFQUFBQSxZQUFBLGFBQUEsSUFBQTtBQUNBLEVBQUFBLFlBQUEsb0JBQUEsSUFBQTtBQUNBLEVBQUFBLFlBQUEsbUJBQUEsSUFBQTtBQUNBLEVBQUFBLFlBQUEsV0FBQSxJQUFBO0FBQ0EsRUFBQUEsWUFBQSxXQUFBLElBQUE7QUFDQSxFQUFBQSxZQUFBLFdBQUEsSUFBQTtBQUNBLEVBQUFBLFlBQUEsYUFBQSxJQUFBO0FBQ0EsRUFBQUEsWUFBQSxZQUFBLElBQUE7QUFDQSxFQUFBQSxZQUFBLFlBQUEsSUFBQTtBQUNBLEVBQUFBLFlBQUEsV0FBQSxJQUFBO0FBQ0EsRUFBQUEsWUFBQSxjQUFBLElBQUE7QUFDQSxFQUFBQSxZQUFBLGVBQUEsSUFBQTtBQUNBLEVBQUFBLFlBQUEsWUFBQSxJQUFBO0FBQ0EsRUFBQUEsWUFBQSxZQUFBLElBQUE7QUFDRixHQWhDWSxlQUFBLGFBQVUsQ0FBQSxFQUFBO0FBa0N0QixJQUFZO0NBQVosU0FBWUMsY0FBVztBQUNyQixFQUFBQSxhQUFBLFVBQUEsSUFBQTtBQUNBLEVBQUFBLGFBQUEsaUJBQUEsSUFBQTtBQUNBLEVBQUFBLGFBQUEsVUFBQSxJQUFBO0FBQ0EsRUFBQUEsYUFBQSxjQUFBLElBQUE7QUFDQSxFQUFBQSxhQUFBLG1CQUFBLElBQUE7QUFDQSxFQUFBQSxhQUFBLHVCQUFBLElBQUE7QUFDQSxFQUFBQSxhQUFBLHVCQUFBLElBQUE7QUFDQSxFQUFBQSxhQUFBLFVBQUEsSUFBQTtBQUNBLEVBQUFBLGFBQUEsU0FBQSxJQUFBO0FBQ0EsRUFBQUEsYUFBQSxVQUFBLElBQUE7QUFDQSxFQUFBQSxhQUFBLGdCQUFBLElBQUE7QUFDRixHQVpZLGdCQUFBLGNBQVcsQ0FBQSxFQUFBO0FBY3ZCLElBQVk7Q0FBWixTQUFZQyx1QkFBb0I7QUFDOUIsRUFBQUEsc0JBQUEsZUFBQSxJQUFBO0FBQ0EsRUFBQUEsc0JBQUEsbUJBQUEsSUFBQTtBQUNBLEVBQUFBLHNCQUFBLHFCQUFBLElBQUE7QUFDQSxFQUFBQSxzQkFBQSw4QkFBQSxJQUFBO0FBQ0EsRUFBQUEsc0JBQUEsMkJBQUEsSUFBQTtBQUNGLEdBTlkseUJBQUEsdUJBQW9CLENBQUEsRUFBQTtBQVFoQyxJQUFZO0NBQVosU0FBWUMsNEJBQXlCO0FBQ25DLEVBQUFBLDJCQUFBLEtBQUEsSUFBQTtBQUNBLEVBQUFBLDJCQUFBLElBQUEsSUFBQTtBQUNGLEdBSFksOEJBQUEsNEJBQXlCLENBQUEsRUFBQTtBQU1yQyxJQUFZO0NBQVosU0FBWUMsWUFBUztBQUNuQixFQUFBQSxXQUFBQSxXQUFBLGNBQUEsSUFBQSxDQUFBLElBQUE7QUFDQSxFQUFBQSxXQUFBQSxXQUFBLGdCQUFBLElBQUEsQ0FBQSxJQUFBO0FBQ0EsRUFBQUEsV0FBQUEsV0FBQSxlQUFBLElBQUEsQ0FBQSxJQUFBO0FBQ0EsRUFBQUEsV0FBQUEsV0FBQSxpQkFBQSxJQUFBLENBQUEsSUFBQTtBQUNBLEVBQUFBLFdBQUFBLFdBQUEsbUJBQUEsSUFBQSxDQUFBLElBQUE7QUFDQSxFQUFBQSxXQUFBQSxXQUFBLGtCQUFBLElBQUEsQ0FBQSxJQUFBO0FBQ0EsRUFBQUEsV0FBQUEsV0FBQSxpQkFBQSxJQUFBLENBQUEsSUFBQTtBQUNBLEVBQUFBLFdBQUFBLFdBQUEsbUJBQUEsSUFBQSxDQUFBLElBQUE7QUFDQSxFQUFBQSxXQUFBQSxXQUFBLGtCQUFBLElBQUEsQ0FBQSxJQUFBO0FBQ0YsR0FWWSxjQUFBLFlBQVMsQ0FBQSxFQUFBO0FBYXJCLElBQVlDO0NBQVosU0FBWUEsT0FBSTtBQUNkLEVBQUFBLE1BQUFBLE1BQUEsY0FBQSxJQUFBLENBQUEsSUFBQTtBQUNBLEVBQUFBLE1BQUFBLE1BQUEsU0FBQSxJQUFBLENBQUEsSUFBQTtBQUNBLEVBQUFBLE1BQUFBLE1BQUEsYUFBQSxJQUFBLENBQUEsSUFBQTtBQUNGLEdBSllBLFVBQUFBLFFBQUksQ0FBQSxFQUFBO0FBWWhCLElBQVk7Q0FBWixTQUFZQyxZQUFTO0FBRW5CLEVBQUFBLFdBQUFBLFdBQUEsU0FBQSxJQUFBLENBQUEsSUFBQTtBQUVBLEVBQUFBLFdBQUFBLFdBQUEsWUFBQSxJQUFBLENBQUEsSUFBQTtBQUVBLEVBQUFBLFdBQUFBLFdBQUEsWUFBQSxJQUFBLENBQUEsSUFBQTtBQUNBLEVBQUFBLFdBQUFBLFdBQUEsY0FBQSxJQUFBLENBQUEsSUFBQTtBQUNBLEVBQUFBLFdBQUFBLFdBQUEsY0FBQSxJQUFBLENBQUEsSUFBQTtBQUNBLEVBQUFBLFdBQUFBLFdBQUEsY0FBQSxJQUFBLEVBQUEsSUFBQTtBQUNBLEVBQUFBLFdBQUFBLFdBQUEsY0FBQSxJQUFBLEVBQUEsSUFBQTtBQUNBLEVBQUFBLFdBQUFBLFdBQUEsY0FBQSxJQUFBLEVBQUEsSUFBQTtBQUNBLEVBQUFBLFdBQUFBLFdBQUEsY0FBQSxJQUFBLEdBQUEsSUFBQTtBQUNBLEVBQUFBLFdBQUFBLFdBQUEsWUFBQSxJQUFBLEdBQUEsSUFBQTtBQUNBLEVBQUFBLFdBQUFBLFdBQUEsWUFBQSxJQUFBLEdBQUEsSUFBQTtBQUNBLEVBQUFBLFdBQUFBLFdBQUEsWUFBQSxJQUFBLElBQUEsSUFBQTtBQUNBLEVBQUFBLFdBQUFBLFdBQUEsWUFBQSxJQUFBLElBQUEsSUFBQTtBQUNBLEVBQUFBLFdBQUFBLFdBQUEsWUFBQSxJQUFBLElBQUEsSUFBQTtBQUNBLEVBQUFBLFdBQUFBLFdBQUEsWUFBQSxJQUFBLElBQUEsSUFBQTtBQUNBLEVBQUFBLFdBQUFBLFdBQUEsWUFBQSxJQUFBLEtBQUEsSUFBQTtBQUNBLEVB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QUFFLEtBQUksR0FBRSxLQUFJLEVBQUMsR0FBRSxZQUFXLEVBQUMsS0FBSSxHQUFFLEtBQUksR0FBRSxLQUFJLEdBQUUsS0FBSSxxQkFBcUIsR0FBRSxVQUFTLEVBQUMsRUFBQyxHQUFFLE9BQU0sRUFBQyxRQUFPLEVBQUMsWUFBVyxFQUFDLEtBQUksb0JBQW1CLEtBQUksb0JBQW1CLEtBQUksbUJBQWtCLEdBQUUsU0FBUSxFQUFDLEtBQUksb0JBQW1CLEtBQUksR0FBRSxLQUFJLG1CQUFrQixHQUFFLFlBQVcsRUFBQyxLQUFJLEdBQUUsS0FBSSxxQkFBb0IsS0FBSSxHQUFFLEtBQUksbUJBQWtCLEdBQUUsVUFBUyxFQUFDLEVBQUMsR0FBRSxPQUFNLEVBQUMsUUFBTyxFQUFDLFlBQVcsRUFBQyxLQUFJLG1CQUFrQixLQUFJLG9CQUFtQixLQUFJLG1CQUFrQixHQUFFLFNBQVEsRUFBQyxLQUFJLG9CQUFtQixLQUFJLEdBQUUsS0FBSSxtQkFBa0IsR0FBRSxZQUFXLEVBQUMsS0FBSSxHQUFFLEtBQUkscUJBQW9CLEtBQUksR0FBRSxLQUFJLG1CQUFrQixHQUFFLFVBQVMsRUFBQyxFQUFDLEdBQUUsT0FBTSxFQUFDLFFBQU8sRUFBQyxZQUFXLEVBQUMsS0FBSSxvQkFBbUIsS0FBSSxvQkFBbUIsS0FBSSxtQkFBa0IsR0FBRSxTQUFRLEVBQUMsS0FBSSxHQUFFLEtBQUksR0FBRSxLQUFJLEVBQUMsR0FBRSxZQUFXLEVBQUMsS0FBSSxHQUFFLEtBQUksb0JBQW1CLEtBQUksR0FBRSxLQUFJLG1CQUFrQixHQUFFLFVBQVMsRUFBQyxFQUFDLEdBQUUsT0FBTSxFQUFDLFFBQU8sRUFBQyxZQUFXLEVBQUMsS0FBSSxvQkFBbUIsS0FBSSxvQkFBbUIsS0FBSSxtQkFBa0IsR0FBRSxTQUFRLEVBQUMsS0FBSSxHQUFFLEtBQUksR0FBRSxLQUFJLEVBQUMsR0FBRSxZQUFXLEVBQUMsS0FBSSxHQUFFLEtBQUksb0JBQW1CLEtBQUksR0FBRSxLQUFJLG1CQUFrQixHQUFFLFVBQVMsRUFBQyxFQUFDLEdBQUUsT0FBTSxFQUFDLFFBQU8sRUFBQyxZQUFXLEVBQUMsS0FBSSxvQkFBbUIsS0FBSSxvQkFBbUIsS0FBSSxLQUFJLEdBQUUsU0FBUSxFQUFDLEtBQUksb0JBQW1CLEtBQUksb0JBQW1CLEtBQUksRUFBQyxHQUFFLFlBQVcsRUFBQyxLQUFJLEdBQUUsS0FBSSxHQUFFLEtBQUksb0JBQW1CLEtBQUksbUJBQWtCLEdBQUUsVUFBUyxFQUFDLEVBQUMsR0FBRSxPQUFNLEVBQUMsUUFBTyxFQUFDLFlBQVcsRUFBQyxLQUFJLG9CQUFtQixLQUFJLG9CQUFtQixLQUFJLG1CQUFrQixHQUFFLFNBQVEsRUFBQyxLQUFJLG9CQUFtQixLQUFJLG9CQUFtQixLQUFJLEVBQUMsR0FBRSxZQUFXLEVBQUMsS0FBSSxHQUFFLEtBQUksR0FBRSxLQUFJLG9CQUFtQixLQUFJLG1CQUFrQixHQUFFLFVBQVMsRUFBQyxFQUFDLEdBQUUsT0FBTSxFQUFDLFFBQU8sRUFBQyxZQUFXLEVBQUMsS0FBSSxtQkFBa0IsS0FBSSxvQkFBbUIsS0FBSSxrQkFBaUIsR0FBRSxTQUFRLEVBQUMsS0FBSSxHQUFFLEtBQUksR0FBRSxLQUFJLEVBQUMsR0FBRSxZQUFXLEVBQUMsS0FBSSxNQUFLLEtBQUksTUFBSyxLQUFJLEtBQUksS0FBSSxJQUFHLEdBQUUsVUFBUyxFQUFDLEVBQUMsR0FBRSxPQUFNLEVBQUMsUUFBTyxFQUFDLFlBQVcsRUFBQyxLQUFJLG1CQUFrQixLQUFJLG9CQUFtQixLQUFJLGtCQUFpQixHQUFFLFlBQVcsRUFBQyxLQUFJLE1BQUssS0FBSSxNQUFLLEtBQUksS0FBSSxLQUFJLElBQUcsR0FBRSxTQUFRLEVBQUMsS0FBSSxHQUFFLEtBQUksR0FBRSxLQUFJLEVBQUMsR0FBRSxVQUFTLEVBQUMsRUFBQyxHQUFFLE9BQU0sRUFBQyxRQUFPLEVBQUMsWUFBVyxFQUFDLEtBQUksb0JBQW1CLEtBQUksbUJBQWtCLEtBQUksa0JBQWlCLEdBQUUsU0FBUSxFQUFDLEtBQUksR0FBRSxLQUFJLEdBQUUsS0FBSSxFQUFDLEdBQUUsWUFBVyxFQUFDLEtBQUksR0FBRSxLQUFJLG9CQUFtQixLQUFJLEdBQUUsS0FBSSxtQkFBa0IsR0FBRSxVQUFTLEVBQUMsRUFBQyxHQUFFLE9BQU0sRUFBQyxRQUFPLEVBQUMsWUFBVyxFQUFDLEtBQUksb0JBQW1CLEtBQUksbUJBQWtCLEtBQUksa0JBQWlCLEdBQUUsU0FBUSxFQUFDLEtBQUksR0FBRSxLQUFJLEdBQUUsS0FBSSxFQUFDLEdBQUUsWUFBVyxFQUFDLEtBQUksR0FBRSxLQUFJLG9CQUFtQixLQUFJLEdBQUUsS0FBSSxrQkFBaUIsR0FBRSxVQUFTLEVBQUMsRUFBQyxHQUFFLE9BQU0sRUFBQyxRQUFPLEVBQUMsWUFBVyxFQUFDLEtBQUksb0JBQW1CLEtBQUksbUJBQWtCLEtBQUksbUJBQWtCLEdBQUUsU0FBUSxFQUFDLEtBQUksR0FBRSxLQUFJLEdBQUUsS0FBSSxFQUFDLEdBQUUsWUFBVyxFQUFDLEtBQUksR0FBRSxLQUFJLG9CQUFtQixLQUFJLEdBQUUsS0FBSSxrQkFBaUIsR0FBRSxVQUFTLEVBQUMsRUFBQyxHQUFFLE9BQU0sRUFBQyxRQUFPLEVBQUMsWUFBVyxFQUFDLEtBQUksb0JBQW1CLEtBQUksbUJBQWtCLEtBQUksbUJBQWtCLEdBQUUsU0FBUSxFQUFDLEtBQUksR0FBRSxLQUFJLEdBQUUsS0FBSSxFQUFDLEdBQUUsWUFBVyxFQUFDLEtBQUksR0FBRSxLQUFJLG9CQUFtQixLQUFJLEdBQUUsS0FBSSxrQkFBaUIsR0FBRSxVQUFTLEVBQUMsRUFBQyxHQUFFLE9BQU0sRUFBQyxRQUFPLEVBQUMsWUFBVyxFQUFDLEtBQUksbUJBQWtCLEtBQUksc0JBQXFCLEtBQUksbUJBQWtCLEdBQUUsU0FBUSxFQUFDLEtBQUksR0FBRSxLQUFJLEdBQUUsS0FBSSxFQUFDLEdBQUUsWUFBVyxFQUFDLEtBQUksR0FBRSxLQUFJLG9CQUFtQixLQUFJLEdBQUUsS0FBSSxrQkFBaUIsR0FBRSxVQUFTLEVBQUMsRUFBQyxHQUFFLE9BQU0sRUFBQyxRQUFPLEVBQUMsWUFBVyxFQUFDLEtBQUksb0JBQW1CLEtBQUkscUJBQW9CLEtBQUksa0JBQWlCLEdBQUUsU0FBUSxFQUFDLEtBQUksR0FBRSxLQUFJLEdBQUUsS0FBSSxFQUFDLEdBQUUsWUFBVyxFQUFDLEtBQUksR0FBRSxLQUFJLG9CQUFtQixLQUFJLEdBQUUsS0FBSSxrQkFBaUIsR0FBRSxVQUFTLEVBQUMsRUFBQyxHQUFFLE9BQU0sRUFBQyxRQUFPLEVBQUMsWUFBVyxFQUFDLEtBQUksb0JBQW1CLEtBQUkscUJBQW9CLEtBQUksbUJBQWtCLEdBQUUsU0FBUSxFQUFDLEtBQUksR0FBRSxLQUFJLEdBQUUsS0FBSSxFQUFDLEdBQUUsWUFBVyxFQUFDLEtBQUksR0FBRSxLQUFJLHFCQUFvQixLQUFJLEdBQUUsS0FBSSxtQkFBa0IsR0FBRSxVQUFTLEVBQUMsRUFBQyxHQUFFLE9BQU0sRUFBQyxRQUFPLEVBQUMsWUFBVyxFQUFDLEtBQUksb0JBQW1CLEtBQUksbUJBQWtCLEtBQUksa0JBQWlCLEdBQUUsU0FBUSxFQUFDLEtBQUksR0FBRSxLQUFJLEdBQUUsS0FBSSxFQUFDLEdBQUUsWUFBVyxFQUFDLEtBQUksR0FBRSxLQUFJLG9CQUFtQixLQUFJLEdBQUUsS0FBSSxrQkFBaUIsR0FBRSxVQUFTLEVBQUMsRUFBQyxHQUFFLE9BQU0sRUFBQyxRQUFPLEVBQUMsWUFBVyxFQUFDLEtBQUksb0JBQW1CLEtBQUksbUJBQWtCLEtBQUksbUJBQWtCLEdBQUUsU0FBUSxFQUFDLEtBQUksR0FBRSxLQUFJLEdBQUUsS0FBSSxFQUFDLEdBQUUsWUFBVyxFQUFDLEtBQUksR0FBRSxLQUFJLG9CQUFtQixLQUFJLEdBQUUsS0FBSSxrQkFBaUIsR0FBRSxVQUFTLEVBQUMsRUFBQyxHQUFFLE9BQU0sRUFBQyxRQUFPLEVBQUMsWUFBVyxFQUFDLEtBQUksb0JBQW1CLEtBQUksbUJBQWtCLEtBQUksbUJBQWtCLEdBQUUsWUFBVyxFQUFDLEtBQUksR0FBRSxLQUFJLEdBQUUsS0FBSSxHQUFFLEtBQUksRUFBQyxHQUFFLFNBQVEsRUFBQyxLQUFJLEdBQUUsS0FBSSxHQUFFLEtBQUksRUFBQyxHQUFFLFVBQVMsRUFBQyxFQUFDLEdBQUUsT0FBTSxFQUFDLFFBQU8sRUFBQyxZQUFXLEVBQUMsS0FBSSxvQkFBbUIsS0FBSSxvQkFBbUIsS0FBSSxtQkFBa0IsR0FBRSxZQUFXLEVBQUMsS0FBSSxHQUFFLEtBQUksR0FBRSxLQUFJLEdBQUUsS0FBSSxFQUFDLEdBQUUsU0FBUSxFQUFDLEtBQUksR0FBRSxLQUFJLEdBQUUsS0FBSSxFQUFDLEdBQUUsVUFBUyxFQUFDLEVBQUMsR0FBRSxPQUFNLEVBQUMsUUFBTyxFQUFDLFlBQVcsRUFBQyxLQUFJLEdBQUUsS0FBSSxzQkFBcUIsS0FBSSxFQUFDLEdBQUUsWUFBVyxFQUFDLEtBQUksR0FBRSxLQUFJLEdBQUUsS0FBSSxHQUFFLEtBQUksRUFBQyxHQUFFLFNBQVEsRUFBQyxLQUFJLEdBQUUsS0FBSSxHQUFFLEtBQUksRUFBQyxHQUFFLFVBQVMsRUFBQyxFQUFDLEdBQUUsT0FBTSxFQUFDLFFBQU8sRUFBQyxZQUFXLEVBQUMsS0FBSSxJQUFHLEtBQUksc0JBQXFCLEtBQUksRUFBQyxHQUFFLFlBQVcsRUFBQyxLQUFJLEdBQUUsS0FBSSxHQUFFLEtBQUksR0FBRSxLQUFJLEVBQUMsR0FBRSxTQUFRLEVBQUMsS0FBSSxHQUFFLEtBQUksR0FBRSxLQUFJLEVBQUMsR0FBRSxVQUFTLEVBQUMsRUFBQyxHQUFFLE9BQU0sRUFBQyxRQUFPLEVBQUMsWUFBVyxFQUFDLEtBQUksSUFBRyxLQUFJLHNCQUFxQixLQUFJLEdBQUUsR0FBRSxZQUFXLEVBQUMsS0FBSSxHQUFFLEtBQUksR0FBRSxLQUFJLEdBQUUsS0FBSSxFQUFDLEdBQUUsU0FBUSxFQUFDLEtBQUksR0FBRSxLQUFJLEdBQUUsS0FBSSxFQUFDLEdBQUUsVUFBUyxFQUFDLEVBQUMsR0FBRSxPQUFNLEVBQUMsUUFBTyxFQUFDLFlBQVcsRUFBQyxLQUFJLEdBQUUsS0FBSSxzQkFBcUIsS0FBSSxHQUFFLEdBQUUsWUFBVyxFQUFDLEtBQUksR0FBRSxLQUFJLEdBQUUsS0FBSSxHQUFFLEtBQUksRUFBQyxHQUFFLFNBQVEsRUFB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LEdBQUUsT0FBTSxFQUFDLFFBQU8sRUFBQyxPQUFNLCtCQUE4Qiw4QkFBNkIsR0FBRSxnQ0FBK0IsRUFBQyxFQUFDLEdBQUUsT0FBTSxFQUFDLFFBQU8sRUFBQyxPQUFNLCtCQUE4Qiw4QkFBNkIsR0FBRSxnQ0FBK0IsRUFBQyxFQUFDLEdBQUUsT0FBTSxFQUFDLFFBQU8sRUFBQyxPQUFNLCtCQUE4Qiw4QkFBNkIsR0FBRSxnQ0FBK0IsRUFBQyxFQUFDLEdBQUUsT0FBTSxFQUFDLFFBQU8sRUFBQyxPQUFNLCtCQUE4Qiw4QkFBNkIsR0FBRSxnQ0FBK0IsRUFBQyxFQUFDLEdBQUUsT0FBTSxFQUFDLFFBQU8sRUFBQyxPQUFNLCtCQUE4Qiw4QkFBNkIsR0FBRSxnQ0FBK0IsRUFBQyxFQUFDLEdBQUUsT0FBTSxFQUFDLFFBQU8sRUFBQyxPQUFNLHlFQUF3RSw4QkFBNkIsR0FBRSxnQ0FBK0IsRUFBQyxFQUFDLEdBQUUsT0FBTSxFQUFDLFFBQU8sRUFBQyxPQUFNLHlFQUF3RSw4QkFBNkIsR0FBRSxnQ0FBK0IsRUFBQyxFQUFDLEdBQUUsT0FBTSxFQUFDLFFBQU8sRUFBQyxPQUFNLHlFQUF3RSw4QkFBNkIsR0FBRSxnQ0FBK0IsRUFBQyxFQUFDLEdBQUUsT0FBTSxFQUFDLFFBQU8sRUFBQyxPQUFNLHlFQUF3RSw4QkFBNkIsR0FBRSxnQ0FBK0IsRUFBQyxFQUFDLEdBQUUsT0FBTSxFQUFDLFFBQU8sRUFBQyxPQUFNLHdEQUF1RCw4QkFBNkIsR0FBRSxnQ0FBK0IsRUFBQyxFQUFDLEdBQUUsT0FBTSxFQUFDLFFBQU8sRUFBQyxPQUFNLDRDQUEyQyw4QkFBNkIsR0FBRSxnQ0FBK0IsRUFBQyxFQUFDLEdBQUUsT0FBTSxFQUFDLFFBQU8sRUFBQyxPQUFNLDRDQUEyQyw4QkFBNkIsR0FBRSxnQ0FBK0IsRUFBQyxFQUFDLEVBQUMsRUFBQyxHQUFFLEVBQUMsUUFBTyxxQkFBb0IsY0FBYSxFQUFDLFFBQU8sVUFBUyxjQUFhLEVBQUMsU0FBUSxFQUFDLFFBQU8sVUFBUyxxQkFBb0IsY0FBYSxFQUFDLEdBQUUscUJBQW9CLE1BQUssR0FBRSxRQUFPLEVBQUMsT0FBTSxFQUFDLFFBQU8sRUFBQyxTQUFRLGtCQUFpQixFQUFDLEdBQUUsT0FBTSxFQUFDLFFBQU8sRUFBQyxTQUFRLGtCQUFpQixFQUFDLEdBQUUsT0FBTSxFQUFDLFFBQU8sRUFBQyxTQUFRLGdCQUFlLEVBQUMsR0FBRSxPQUFNLEVBQUMsUUFBTyxFQUFDLFNBQVEsT0FBTSxFQUFDLEdBQUUsT0FBTSxFQUFDLFFBQU8sRUFBQyxTQUFRLE9BQU0sRUFBQyxHQUFFLE9BQU0sRUFBQyxRQUFPLEVBQUMsU0FBUSxjQUFhLEVBQUMsR0FBRSxPQUFNLEVBQUMsUUFBTyxFQUFDLFNBQVEsZ0JBQWUsRUFBQyxHQUFFLE9BQU0sRUFBQyxRQUFPLEVBQUMsU0FBUSxjQUFhLEVBQUMsR0FBRSxPQUFNLEVBQUMsUUFBTyxFQUFDLFNBQVEsY0FBYSxFQUFDLEdBQUUsT0FBTSxFQUFDLFFBQU8sRUFBQyxTQUFRLFFBQU8sRUFBQyxHQUFFLE9BQU0sRUFBQyxRQUFPLEVBQUMsU0FBUSxRQUFPLEVBQUMsR0FBRSxPQUFNLEVBQUMsUUFBTyxFQUFDLFNBQVEsUUFBTyxFQUFDLEdBQUUsT0FBTSxFQUFDLFFBQU8sRUFBQyxTQUFRLFFBQU8sRUFBQyxHQUFFLE9BQU0sRUFBQyxRQUFPLEVBQUMsU0FBUSxRQUFPLEVBQUMsR0FBRSxPQUFNLEVBQUMsUUFBTyxFQUFDLFNBQVEsUUFBTyxFQUFDLEdBQUUsT0FBTSxFQUFDLFFBQU8sRUFBQyxTQUFRLFFBQU8sRUFBQyxHQUFFLE9BQU0sRUFBQyxRQUFPLEVBQUMsU0FBUSxRQUFPLEVBQUMsR0FBRSxPQUFNLEVBQUMsUUFBTyxFQUFDLFNBQVEsUUFBTyxFQUFDLEdBQUUsT0FBTSxFQUFDLFFBQU8sRUFBQyxTQUFRLFFBQU8sRUFBQyxHQUFFLE9BQU0sRUFBQyxRQUFPLEVBQUMsU0FBUSxTQUFRLEVBQUMsR0FBRSxPQUFNLEVBQUMsUUFBTyxFQUFDLFNBQVEsV0FBVSxFQUFDLEdBQUUsT0FBTSxFQUFDLFFBQU8sRUFBQyxTQUFRLFdBQVUs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LEVBQUMsVUFBUyxDQUFDLEVBQUMsUUFBTyxXQUFVLFdBQVUsT0FBTSxVQUFTLEdBQUUsU0FBUSxHQUFFLFFBQU8sT0FBTSxlQUFjLE1BQUssQ0FBQyxFQUFDLEVBQUMsR0FBRSxPQUFNLEVBQUMsUUFBTyxFQUFDLFVBQVMsQ0FBQyxFQUFDLFFBQU8sV0FBVSxXQUFVLE9BQU0sVUFBUyxHQUFFLFNBQVEsR0FBRSxRQUFPLE9BQU0sZUFBYyxNQUFLLENBQUMsRUFBQyxFQUFDLEdBQUUsT0FBTSxFQUFDLFFBQU8sRUFBQyxVQUFTLENBQUMsRUFBQyxRQUFPLFdBQVUsV0FBVSxPQUFNLFVBQVMsR0FBRSxTQUFRLEdBQUUsUUFBTyxPQUFNLGVBQWMsTUFBSyxHQUFFLEVBQUMsUUFBTyxTQUFRLFdBQVUsTUFBSyxVQUFTLEdBQUUsU0FBUSxHQUFFLFFBQU8sT0FBTSxlQUFjLE1BQUssR0FBRSxFQUFDLFFBQU8sY0FBYSxXQUFVLE9BQU0sVUFBUyxHQUFFLFNBQVEsR0FBRSxRQUFPLE9BQU0sZUFBYyxNQUFLLEdBQUUsRUFBQyxRQUFPLGFBQVksV0FBVSxPQUFNLFVBQVMsR0FBRSxTQUFRLEdBQUUsUUFBTyxPQUFNLGVBQWMsTUFBSyxDQUFDLEVBQUMsRUFBQyxHQUFFLE9BQU0sRUFBQyxRQUFPLEVBQUMsVUFBUyxDQUFDLEVBQUMsUUFBTyxXQUFVLFdBQVUsT0FBTSxVQUFTLEdBQUUsU0FBUSxHQUFFLFFBQU8sT0FBTSxlQUFjLE1BQUssR0FBRSxFQUFDLFFBQU8sU0FBUSxXQUFVLE1BQUssVUFBUyxHQUFFLFNBQVEsR0FBRSxRQUFPLE9BQU0sZUFBYyxNQUFLLEdBQUUsRUFBQyxRQUFPLGNBQWEsV0FBVSxPQUFNLFVBQVMsR0FBRSxTQUFRLEdBQUUsUUFBTyxPQUFNLGVBQWMsTUFBSyxHQUFFLEVBQUMsUUFBTyxhQUFZLFdBQVUsT0FBTSxVQUFTLEdBQUUsU0FBUSxHQUFFLFFBQU8sT0FBTSxlQUFjLE1BQUssQ0FBQyxFQUFDLEVBQUMsR0FBRSxPQUFNLEVBQUMsUUFBTyxFQUFDLFVBQVMsQ0FBQyxFQUFDLFFBQU8sV0FBVSxXQUFVLE9BQU0sVUFBUyxHQUFFLFNBQVEsR0FBRSxRQUFPLE9BQU0sZUFBYyxNQUFLLEdBQUUsRUFBQyxRQUFPLFNBQVEsV0FBVSxNQUFLLFVBQVMsR0FBRSxTQUFRLEdBQUUsUUFBTyxPQUFNLGVBQWMsTUFBSyxHQUFFLEVBQUMsUUFBTyxjQUFhLFdBQVUsT0FBTSxVQUFTLEdBQUUsU0FBUSxHQUFFLFFBQU8sT0FBTSxlQUFjLE1BQUssR0FBRSxFQUFDLFFBQU8sYUFBWSxXQUFVLE9BQU0sVUFBUyxHQUFFLFNBQVEsR0FBRSxRQUFPLE9BQU0sZUFBYyxNQUFLLENBQUMsRUFBQyxFQUFDLEdBQUUsT0FBTSxFQUFDLFFBQU8sRUFBQyxVQUFTLENBQUMsRUFBQyxRQUFPLFdBQVUsV0FBVSxPQUFNLFVBQVMsR0FBRSxTQUFRLEdBQUUsUUFBTyxPQUFNLGVBQWMsTUFBSyxHQUFFLEVBQUMsUUFBTyxTQUFRLFdBQVUsTUFBSyxVQUFTLEdBQUUsU0FBUSxHQUFFLFFBQU8sT0FBTSxlQUFjLE1BQUssR0FBRSxFQUFDLFFBQU8sY0FBYSxXQUFVLE9BQU0sVUFBUyxHQUFFLFNBQVEsR0FBRSxRQUFPLE9BQU0sZUFBYyxNQUFLLEdBQUUsRUFBQyxRQUFPLGFBQVksV0FBVSxPQUFNLFVBQVMsR0FBRSxTQUFRLEdBQUUsUUFBTyxPQUFNLGVBQWMsTUFBSyxDQUFDLEVBQUMsRUFBQyxHQUFFLE9BQU0sRUFBQyxRQUFPLEVBQUMsVUFBUyxDQUFDLEVBQUMsUUFBTyxXQUFVLFdBQVUsT0FBTSxVQUFTLEdBQUUsU0FBUSxHQUFFLFFBQU8sT0FBTSxlQUFjLE1BQUssR0FBRSxFQUFDLFFBQU8sU0FBUSxXQUFVLE1BQUssVUFBUyxHQUFFLFNBQVEsR0FBRSxRQUFPLE9BQU0sZUFBYyxNQUFLLEdBQUUsRUFBQyxRQUFPLGNBQWEsV0FBVSxPQUFNLFVBQVMsR0FBRSxTQUFRLEdBQUUsUUFBTyxPQUFNLGVBQWMsTUFBSyxHQUFFLEVBQUMsUUFBTyxhQUFZLFdBQVUsT0FBTSxVQUFTLEdBQUUsU0FBUSxHQUFFLFFBQU8sT0FBTSxlQUFjLE1BQUssQ0FBQyxFQUFDLEVBQUMsR0FBRSxPQUFNLEVBQUMsUUFBTyxFQUFDLFVBQVMsQ0FBQyxFQUFDLFFBQU8sV0FBVSxXQUFVLE9BQU0sVUFBUyxHQUFFLFNBQVEsR0FBRSxRQUFPLE9BQU0sZUFBYyxNQUFLLEdBQUUsRUFBQyxRQUFPLFNBQVEsV0FBVSxNQUFLLFVBQVMsR0FBRSxTQUFRLEdBQUUsUUFBTyxPQUFNLGVBQWMsTUFBSyxHQUFFLEVBQUMsUUFBTyxjQUFhLFdBQVUsT0FBTSxVQUFTLEdBQUUsU0FBUSxHQUFFLFFBQU8sT0FBTSxlQUFjLE1BQUssR0FBRSxFQUFDLFFBQU8sYUFBWSxXQUFVLE9BQU0sVUFBUyxHQUFFLFNBQVEsR0FBRSxRQUFPLE9BQU0sZUFBYyxNQUFLLENBQUMsRUFBQyxFQUFDLEdBQUUsT0FBTSxFQUFDLFFBQU8sRUFBQyxVQUFTLENBQUMsRUFBQyxRQUFPLFdBQVUsV0FBVSxPQUFNLFVBQVMsR0FBRSxTQUFRLEdBQUUsUUFBTyxPQUFNLGVBQWMsTUFBSyxHQUFFLEVBQUMsUUFBTyxTQUFRLFdBQVUsTUFBSyxVQUFTLEdBQUUsU0FBUSxHQUFFLFFBQU8sT0FBTSxlQUFjLE1BQUssR0FBRSxFQUFDLFFBQU8sY0FBYSxXQUFVLE9BQU0sVUFBUyxHQUFFLFNBQVEsR0FBRSxRQUFPLE9BQU0sZUFBYyxNQUFLLEdBQUUsRUFBQyxRQUFPLGFBQVksV0FBVSxPQUFNLFVBQVMsR0FBRSxTQUFRLEdBQUUsUUFBTyxPQUFNLGVBQWMsTUFBSyxDQUFDLEVBQUMsRUFBQyxHQUFFLE9BQU0sRUFBQyxRQUFPLEVBQUMsVUFBUyxDQUFDLEVBQUMsUUFBTyxXQUFVLFdBQVUsT0FBTSxVQUFTLEdBQUUsU0FBUSxHQUFFLFFBQU8sT0FBTSxlQUFjLE1BQUssR0FBRSxFQUFDLFFBQU8sU0FBUSxXQUFVLE1BQUssVUFBUyxHQUFFLFNBQVEsR0FBRSxRQUFPLE9BQU0sZUFBYyxNQUFLLEdBQUUsRUFBQyxRQUFPLGNBQWEsV0FBVSxPQUFNLFVBQVMsR0FBRSxTQUFRLEdBQUUsUUFBTyxPQUFNLGVBQWMsTUFBSyxHQUFFLEVBQUMsUUFBTyxhQUFZLFdBQVUsT0FBTSxVQUFTLEdBQUUsU0FBUSxHQUFFLFFBQU8sT0FBTSxlQUFjLE1BQUssQ0FBQyxFQUFDLEVBQUMsR0FBRSxPQUFNLEVBQUMsUUFBTyxFQUFDLFVBQVMsQ0FBQyxFQUFDLFFBQU8sV0FBVSxXQUFVLE9BQU0sVUFBUyxHQUFFLFNBQVEsR0FBRSxRQUFPLE9BQU0sZUFBYyxNQUFLLEdBQUUsRUFBQyxRQUFPLFNBQVEsV0FBVSxNQUFLLFVBQVMsR0FBRSxTQUFRLEdBQUUsUUFBTyxPQUFNLGVBQWMsTUFBSyxHQUFFLEVBQUMsUUFBTyxjQUFhLFdBQVUsT0FBTSxVQUFTLEdBQUUsU0FBUSxHQUFFLFFBQU8sT0FBTSxlQUFjLE1BQUssR0FBRSxFQUFDLFFBQU8sYUFBWSxXQUFVLE9BQU0sVUFBUyxHQUFFLFNBQVEsR0FBRSxRQUFPLE9BQU0sZUFBYyxNQUFLLENBQUMsRUFBQyxFQUFDLEdBQUUsT0FBTSxFQUFDLFFBQU8sRUFBQyxVQUFTLENBQUMsRUFBQyxRQUFPLFdBQVUsV0FBVSxPQUFNLFVBQVMsR0FBRSxTQUFRLEdBQUUsUUFBTyxPQUFNLGVBQWMsTUFBSyxDQUFDLEVBQUMsRUFBQyxFQUFDLEVBQUMsR0FBRSxFQUFDLFFBQU8sdUJBQXNCLGNBQWEsRUFBQyxRQUFPLFVBQVMsY0FBYSxDQUFDLEdBQUUscUJBQW9CLG1CQUFrQixrQkFBaUIsa0JBQWlCLEdBQUUsUUFBTyxFQUFDLE9BQU0sRUFBQyxRQUFPLEVBQUMsaUJBQWdCLENBQUMsRUFBQyxhQUFZLEdBQUUsYUFBWSxFQUFDLFVBQVMsR0FBRSxhQUFZLFlBQVcsZUFBYyxJQUFHLGdCQUFlLE1BQUssRUFBQyxDQUFDLEVBQUMsRUFBQyxHQUFFLE9BQU0sRUFBQyxRQUFPLEVBQUMsaUJBQWdCLENBQUMsRUFBQyxhQUFZLEdBQUUsYUFBWSxFQUFDLFVBQVMsR0FBRSxhQUFZLFdBQVUsZUFBYyxHQUFFLGdCQUFlLEtBQUksRUFBQyxDQUFDLEVBQUMsRUFBQyxHQUFFLE9BQU0sRUFBQyxRQUFPLEVBQUMsaUJBQWdCLENBQUMsRUFBQyxhQUFZLEdBQUUsYUFBWSxFQUFDLFVBQVMsR0FBRSxhQUFZLFdBQVUsZUFBYyxHQUFFLGdCQUFlLEtBQUksRUFBQyxDQUFDLEVBQUMsRUFBQyxHQUFFLE9BQU0sRUFBQyxRQUFPLEVBQUMsaUJBQWdCLENBQUMsRUFBQyxhQUFZLEdBQUUsYUFBWSxFQUFDLFVBQVMsR0FBRSxhQUFZLFdBQVUsZUFBYyxHQUFFLGdCQUFlLEtBQUksRUFBQyxDQUFDLEVBQUMsRUFBQyxHQUFFLE9BQU0sRUFBQyxRQUFPLEVBQUMsaUJBQWdCLENBQUMsRUFBQyxhQUFZLEdBQUUsYUFBWSxFQUFDLFVBQVMsR0FBRSxhQUFZLFdBQVUsZUFBYyxHQUFFLGdCQUFlLEtBQUksRUFBQyxDQUFDLEVBQUMsRUFBQyxHQUFFLE9BQU0sRUFBQyxRQUFPLEVBQUMsaUJBQWdCLENBQUMsRUFBQyxhQUFZLEdBQUUsYUFBWSxFQUFDLFVBQVMsR0FBRSxhQUFZLFdBQVUsZUFBYyxHQUFFLGdCQUFlLEtBQUksRUFBQyxDQUFDLEVBQUMsRUFBQyxHQUFFLE9BQU0sRUFBQyxRQUFPLEVBQUMsaUJBQWdCLENBQUMsRUFBQyxhQUFZLEdBQUUsYUFBWSxFQUFDLFVBQVMsR0FBRSxhQUFZLFdBQVUsZUFBYyxHQUFFLGdCQUFlLEtBQUksRUFBQyxDQUFDLEVBQUMsRUFBQyxHQUFFLE9BQU0sRUFBQyxRQUFPLEVBQUMsaUJBQWdCLENBQUMsRUFBQyxhQUFZLEdBQUUsYUFBWSxFQUFDLFVBQVMsR0FBRSxhQUFZLFdBQVUsZUFBYyxHQUFFLGdCQUFlLEtBQUksRUFBQyxDQUFDLEVBQUMsRUFBQyxHQUFFLE9BQU0sRUFBQyxRQUFPLEVBQUMsaUJBQWdCLENBQUMsRUFBQyxhQUFZLEdBQUUsYUFBWSxFQUFDLFVBQVMsR0FBRSxhQUFZLFdBQVUsZUFBYyxHQUFFLGdCQUFlLEtBQUksRUFBQyxDQUFDLEVBQUMsRUFBQyxHQUFFLE9BQU0sRUFBQyxRQUFPLEVBQUMsaUJBQWdCLENBQUMsRUFBQyxhQUFZLEdBQUUsYUFBWSxFQUFDLFVBQVMsR0FBRSxhQUFZLFdBQVUsZUFBYyxHQUFFLGdCQUFlLEtBQUksRUFBQyxDQUFDLEVBQUMsRUFBQyxHQUFFLE9BQU0sRUFBQyxRQUFPLEVBQUMsaUJBQWdCLENBQUMsRUFBQyxhQUFZLEdBQUUsYUFBWSxFQUFDLFVBQVMsR0FBRSxhQUFZLFdBQVUsZUFBYyxJQUFHLGdCQUFlLEtBQUksRUFBQyxDQUFDLEVBQUMsRUFBQyxFQUFDLEVBQUMsR0FBRSxFQUFDLFFBQU8sd0JBQXVCLGNBQWEsRUFBQyxRQUFPLFVBQVMsY0FBYSxFQUFDLFNBQVEsRUFBQyxRQUFPLFdBQVUscUJBQW9CLFFBQU8sRUFBQyxHQUFFLHFCQUFvQixNQUFLLEdBQUUsUUFBTyxFQUFDLE9BQU0sRUFBQyxRQUFPLEVBQUMsU0FBUSxFQUFDLEVBQUMsRUFBQyxFQUFDLEdBQUUsRUFBQyxRQUFPLG9CQUFtQixjQUFhLEVBQUMsUUFBTyxVQUFTLGNBQWEsRUFBQyxVQUFTLEVBQUMsUUFBTyxVQUFTLGNBQWEsRUFBQyxRQUFPLEVBQUMsUUFBTyxVQUFTLGNBQWEsRUFBQyxLQUFJLEVBQUMsUUFBTyxXQUFVLHFCQUFvQixRQUFPLEdBQUUsS0FBSSxFQUFDLFFBQU8sV0FBVSxxQkFBb0IsUUFBTyxFQUFDLEdBQUUscUJBQW9CLE1BQUssR0FBRSxXQUFVLEVBQUMsUUFBTyxTQUFRLFNBQVEsRUFBQyxRQUFPLFVBQVMsY0FBYSxFQUFDLEtBQUksRUFBQyxRQUFPLFdBQVUscUJBQW9CLFFBQU8sR0FBRSxLQUFJLEVBQUMsUUFBTyxXQUFVLHFCQUFvQixRQUFPLEVBQUMsR0FBRSxxQkFBb0IsTUFBSyxHQUFFLHFCQUFvQixRQUFPLEVBQUMsR0FBRSxxQkFBb0IsTUFBSyxFQUFDLEdBQUUscUJBQW9CLE1BQUssR0FBRSxRQUFPLEVBQUMsS0FBSSxFQUFDLFFBQU8sRUFBQyxVQUFTLEVBQUMsUUFBTyxFQUFDLEtBQUksR0FBRSxLQUFJLEVBQUMsR0FBRSxXQUFVLENBQUMsRUFBQyxLQUFJLEdBQUUsS0FBSSxFQUFDLEdBQUUsRUFBQyxLQUFJLEdBQUUsS0FBSSxFQUFDLEdBQUUsRUFBQyxLQUFJLEdBQUUsS0FBSSxFQUFDLEdBQUUsRUFBQyxLQUFJLEdBQUUsS0FBSSxFQUFDLENBQUMsRUFBQyxFQUFDLEVBQUMsRUFBQyxFQUFDLEdBQUUsRUFBQyxRQUFPLG9CQUFtQixjQUFhLEVBQUMsUUFBTyxVQUFTLGNBQWEsRUFBQyxTQUFRLEVBQUMsUUFBTyxTQUFRLFNBQVEsRUFBQyxRQUFPLFVBQVMsY0FBYSxFQUFDLFVBQVMsRUFBQyxRQUFPLFdBQVUscUJBQW9CLFNBQVEsR0FBRSxRQUFPLEVBQUMsUUFBTyxXQUFVLHFCQUFvQixZQUFXLHNCQUFxQixFQUFDLFFBQU8sV0FBVSxxQkFBb0IsVUFBUyxFQUFDLEdBQUUsWUFBVyxFQUFDLFFBQU8sU0FBUSxTQUFRLEVBQUMsUUFBTyxXQUFVLHFCQUFvQixTQUFRLEdBQUUscUJBQW9CLFFBQU8sRUFBQyxHQUFFLHFCQUFvQixNQUFLLEdBQUUscUJBQW9CLFFBQU8sRUFBQyxHQUFFLHFCQUFvQixNQUFLLEdBQUUsUUFBTyxFQUFDLEtBQUksRUFBQyxRQUFPLEVBQUMsU0FBUSxDQUFDLEVBQUMsVUFBUyxLQUFJLFFBQU8sTUFBSyxZQUFXLENBQUMsS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksR0FBRyxFQUFDLEdBQUUsRUFBQyxVQUFTLEtBQUksWUFBVyxDQUFDLEVBQUMsR0FBRSxFQUFDLFVBQVMsS0FBSSxZQUFXLENBQUMsRUFBQyxHQUFFLEVBQUMsVUFBUyxLQUFJLFlBQVcsQ0FBQyxFQUFDLEdBQUUsRUFBQyxVQUFTLEtBQUksWUFBVyxDQUFDLEVBQUMsR0FBRSxFQUFDLFVBQVMsS0FBSSxZQUFXLENBQUMsRUFBQyxHQUFFLEVBQUMsVUFBUyxLQUFJLFlBQVcsQ0FBQyxFQUFDLEdBQUUsRUFBQyxVQUFTLEtBQUksWUFBVyxDQUFDLEVBQUMsR0FBRSxFQUFDLFVBQVMsS0FBSSxZQUFXLENBQUMsRUFBQyxHQUFFLEVBQUMsVUFBUyxLQUFJLFlBQVcsQ0FBQyxFQUFDLEdBQUUsRUFBQyxVQUFTLEtBQUksWUFBVyxDQUFDLEVBQUMsR0FBRSxFQUFDLFVBQVMsS0FBSSxZQUFXLENBQUMsRUFBQyxHQUFFLEVBQUMsVUFBUyxLQUFJLFlBQVcsQ0FBQyxFQUFDLEdBQUUsRUFBQyxVQUFTLEtBQUksWUFBVyxDQUFDLEVBQUMsR0FBRSxFQUFDLFVBQVMsS0FBSSxZQUFXLENBQUMsRUFBQyxHQUFFLEVBQUMsVUFBUyxLQUFJLFlBQVcsQ0FBQyxFQUFDLEdBQUUsRUFBQyxVQUFTLEtBQUksWUFBVyxDQUFDLEVBQUMsR0FBRSxFQUFDLFVBQVMsS0FBSSxZQUFXLENBQUMsRUFBQyxHQUFFLEVBQUMsVUFBUyxLQUFJLFlBQVcsQ0FBQyxFQUFDLEdBQUUsRUFBQyxVQUFTLEtBQUksWUFBVyxDQUFDLEVBQUMsR0FBRSxFQUFDLFVBQVMsS0FBSSxZQUFXLENBQUMsRUFBQyxHQUFFLEVBQUMsVUFBUyxLQUFJLFlBQVcsQ0FBQyxFQUFDLEdBQUUsRUFBQyxVQUFTLEtBQUksWUFBVyxDQUFDLEVBQUMsR0FBRSxFQUFDLFVBQVMsS0FBSSxZQUFXLENBQUMsRUFBQyxHQUFFLEVBQUMsVUFBUyxLQUFJLFlBQVcsQ0FBQyxFQUFDLEdBQUUsRUFBQyxVQUFTLEtBQUksWUFBVyxDQUFDLEVBQUMsR0FBRSxFQUFDLFVBQVMsS0FBSSxZQUFXLENBQUMsRUFBQyxHQUFFLEVBQUMsVUFBUyxLQUFJLFlBQVcsQ0FBQyxFQUFDLEdBQUUsRUFBQyxVQUFTLEtBQUksWUFBVyxDQUFDLEVBQUMsQ0FBQyxFQUFDLEVBQUMsRUFBQyxFQUFDLEdBQUUsRUFBQyxRQUFPLDRCQUEyQixjQUFhLEVBQUMsUUFBTyxVQUFTLGNBQWEsRUFBQyxTQUFRLEVBQUMsUUFBTyxTQUFRLFNBQVEsRUFBQyxRQUFPLFVBQVMsY0FB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YUFBWSxDQUFDLEVBQUMsQ0FBQyxFQUFDLEVBQUMsRUFBQyxFQUFDLEdBQUUsRUFBQyxRQUFPLDhCQUE2QixjQUFhLEVBQUMsUUFBTyxVQUFTLGNBQWEsRUFBQyx1QkFBc0IsRUFBQyxRQUFPLFdBQVUscUJBQW9CLFlBQVcsc0JBQXFCLEVBQUMsUUFBTyxXQUFVLHFCQUFvQixVQUFTLEVBQUMsRUFBQyxHQUFFLHFCQUFvQixNQUFLLEdBQUUsUUFBTyxFQUFDLE9BQU0sRUFBQyxRQUFPLENBQUMsRUFBQyxHQUFFLE9BQU0sRUFBQyxRQUFPLENBQUMsRUFBQyxHQUFFLE9BQU0sRUFBQyxRQUFPLENBQUMsRUFBQyxHQUFFLE9BQU0sRUFBQyxRQUFPLENBQUMsRUFBQyxHQUFFLE9BQU0sRUFBQyxRQUFPLENBQUMsRUFBQyxHQUFFLE9BQU0sRUFBQyxRQUFPLENBQUMsRUFBQyxHQUFFLE9BQU0sRUFBQyxRQUFPLENBQUMsRUFBQyxHQUFFLE9BQU0sRUFBQyxRQUFPLENBQUMsRUFBQyxHQUFFLE9BQU0sRUFBQyxRQUFPLENBQUMsRUFBQyxHQUFFLE9BQU0sRUFBQyxRQUFPLENBQUMsRUFBQyxHQUFFLE9BQU0sRUFBQyxRQUFPLENBQUMsRUFBQyxHQUFFLE9BQU0sRUFBQyxRQUFPLENBQUMsRUFBQyxHQUFFLE9BQU0sRUFBQyxRQUFPLENBQUMsRUFBQyxHQUFFLE9BQU0sRUFBQyxRQUFPLENBQUMsRUFBQyxHQUFFLE9BQU0sRUFBQyxRQUFPLENBQUMsRUFBQyxHQUFFLE9BQU0sRUFBQyxRQUFPLENBQUMsRUFBQyxHQUFFLE9BQU0sRUFBQyxRQUFPLENBQUMsRUFBQyxHQUFFLE9BQU0sRUFBQyxRQUFPLENBQUMsRUFBQyxHQUFFLE9BQU0sRUFBQyxRQUFPLENBQUMsRUFBQyxHQUFFLE9BQU0sRUFBQyxRQUFPLENBQUMsRUFBQyxHQUFFLE9BQU0sRUFBQyxRQUFPLENBQUMsRUFBQyxHQUFFLE9BQU0sRUFBQyxRQUFPLENBQUMsRUFBQyxHQUFFLE9BQU0sRUFBQyxRQUFPLENBQUMsRUFBQyxHQUFFLE9BQU0sRUFBQyxRQUFPLENBQUMsRUFBQyxHQUFFLE9BQU0sRUFBQyxRQUFPLENBQUMsRUFBQyxHQUFFLE9BQU0sRUFBQyxRQUFPLENBQUMsRUFBQyxHQUFFLE9BQU0sRUFBQyxRQUFPLENBQUMsRUFBQyxHQUFFLE9BQU0sRUFBQyxRQUFPLENBQUMsRUFBQyxFQUFDLEVBQUMsR0FBRSxFQUFDLFFBQU8sV0FBVSxjQUFhLEVBQUMsUUFBTyxVQUFTLGNBQWEsQ0FBQyxHQUFFLHFCQUFvQixNQUFLLEdBQUUsUUFBTyxFQUFDLE9BQU0sRUFBQyxRQUFPLENBQUMsRUFBQyxFQUFDLEVBQUMsQ0FBQyxFQUFDLEVBQUM7OztBQ0dyN3JDLElBQU0sYUFBbUMsQ0FBQTtBQUdsQyxJQUFNLG9CQUF3QztFQUNuRCxtQkFBbUIsS0FBYSxjQUFxQjtBQUduRCxVQUFNLGFBQWEsb0JBQW9CLEdBQUc7QUFDMUMsUUFBSSxZQUFZO0FBQ2QsVUFBSTtBQUNGLFlBQUksc0JBQXNCLFlBQVk7QUFDcEMsZ0JBQU0sWUFBWSxVQUFVLFdBQVcsVUFBVTtBQUNqRCxxQkFBVyxLQUFLLEVBQUUsS0FBSyxVQUFTLENBQUU7bUJBQ3pCLE9BQU8sZUFBZSxVQUFVO0FBQ3pDLGdCQUFNLFlBQVksVUFBVSxTQUFTLEtBQUssTUFBTSxVQUFVLENBQUM7QUFDM0QscUJBQVcsS0FBSyxFQUFFLEtBQUssVUFBUyxDQUFFO21CQUN6QixPQUFPLGVBQWUsVUFBVTtBQUN6QyxnQkFBTSxZQUFZLFVBQVUsU0FBUyxVQUFVO0FBQy9DLHFCQUFXLEtBQUssRUFBRSxLQUFLLFVBQVMsQ0FBRTs7ZUFFN0IsS0FBSztBQUNaLGdCQUFRLE1BQU0sR0FBRzs7QUFHbkIsYUFBTyxvQkFBb0IsR0FBRzs7QUFHaEMsV0FBTyxXQUFXLEtBQUssQ0FBQyxTQUFTLEtBQUssUUFBUSxHQUFHLEtBQUs7RUFDeEQ7Ozs7QUx0QkssSUFBTSxvQkFBb0Isd0JBQXdCLEVBQUUseURBQWtCLENBQUU7QUFDL0UsT0FBTyxhQUFhLGlCQUFpQjtBQUVyQyxlQUFzQixTQUFTLFdBQWlCO0FBQzlDLFNBQU8sS0FBSTtBQUNYLFFBQU0sT0FBTyxPQUFPLFNBQVM7QUFDN0IsUUFBTSxXQUFXLDJCQUFTO0FBQzVCO0FBTUEsZUFBc0IsVUFBTztBQUMzQixRQUFNLFdBQVcsVUFBTSxnQ0FBYSxFQUFFLE1BQU0sSUFBSSxXQUFVLEVBQUUsQ0FBRTtBQUc5RCxNQUFJLENBQUMsU0FBUyxhQUFhO0FBQ3pCLFVBQU0sZ0JBQWdCLGtCQUFrQixtQkFBbUIsZ0JBQWdCO0FBQzNFLFFBQUksZUFBZTtBQUNqQixVQUFJO0FBQ0Ysa0JBQVUsU0FBUyxRQUFRLGVBQWUsaUJBQWlCO2VBQ3BELEtBQUs7QUFDWixnQkFBUSxJQUFJLGdEQUFnRDtBQUM1RCxnQkFBUSxNQUFNLEdBQUc7Ozs7QUFLdkIsTUFBSSxDQUFDLENBQUMsa0JBQWtCLFdBQVc7QUFDakMsUUFBSSxZQUFZLFNBQVMsUUFBUSxTQUFTLEtBQUssUUFBUTtBQUNyRCxpQkFBVyxhQUFhLFNBQVMsTUFBTTtBQUNyQywwQkFBa0IsVUFBVSxTQUFTOzs7O0FBSTdDOzs7QXhOdkNBLElBQXdCLFNBQVMsUUFBVztBQUMxQyxNQUFTLDJCQUFULFdBQW9DO0FBQ2xDLFVBQU0sZUFBbUMsS0FBSztBQUM5QyxRQUFJLGdCQUFnQixPQUFPLGlCQUFpQixZQUFZLE9BQVEsYUFBNkMsU0FBUyxZQUFZO0FBQ2hJLG1CQUFhLE1BQU0sUUFBUSxLQUFLO0FBQUEsSUFDbEM7QUFDQSxXQUFPLGFBQWEsd0JBQXdCO0FBQUEsRUFDOUM7QUFDQSxTQUFPLFVBQVUsMEJBQTBCLFFBQVE7QUFDckQ7IiwKICAibmFtZXMiOiBbImV4cG9ydHMiLCAibW9kdWxlIiwgInJlc29sdmUiLCAicGFyYW1zIiwgIm9mZnNldCIsICJleHBvcnRzIiwgImxlbmd0aCIsICJpIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImxpc3RlbmVycyIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgInV0ZjgiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAic2l6ZSIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJmcm9tTnVtYmVyIiwgInRvTnVtYmVyIiwgImxlbmd0aCIsICJleHBvcnRzIiwgImlzT2JqZWN0IiwgImlzU2V0IiwgIkJ1ZmZlciIsICJpIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgInV0ZjgiLCAiY3JlYXRlIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgInV0ZjgiLCAiY3JlYXRlX2FycmF5IiwgImNyZWF0ZSIsICJidWZmZXIiLCAibGVuZ3RoIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgInNlbGYiLCAiZXJyIiwgImV4cG9ydHMiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJyZXF1aXJlX21pbmltYWwiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSIsICJzZWxmIiwgIm1vZHVsZU9iamVjdCIsICJlcnJvciIsICJjb21wYXJlIiwgInN1YnNjcmliZSIsICJDb21wb25lbnQiLCAicmVzb2x2ZSIsICJyZXR1cm5WYWx1ZSIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgImNvbXBhcmUiLCAibGVuZ3RoIiwgImluaXRpYWxUaW1lIiwgInN0YXJ0VGltZSIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJSZWFjdCIsICJSZWFjdERlYnVnQ3VycmVudEZyYW1lIiwgIndvcmtJblByb2dyZXNzIiwgImluZGV4IiwgInNldCIsICJyZW5kZXJMYW5lcyIsICJwcmlvcml0eSIsICJlcnJvciIsICJsZW5ndGgiLCAiY3VycmVudCIsICJjbG9uZSIsICJ1cGRhdGVGcmFnbWVudCIsICJjaGlsZCIsICJyZWNvbmNpbGVDaGlsZEZpYmVycyIsICJzdWJzY3JpYmUiLCAiaXNIeWRyYXRpbmciLCAiZXJyb3IkMSIsICJjb21wYXJlIiwgInN1YnRyZWVSZW5kZXJMYW5lcyIsICJoYXNDb250ZXh0Q2hhbmdlZCIsICJjYWxsQ2FsbGJhY2siLCAiY29tbWl0VGltZSIsICJzaG91bGRGaXJlQWZ0ZXJBY3RpdmVJbnN0YW5jZUJsdXIiLCAicm9vdCIsICJjdXJyZW50SG9vayIsICJSZWFjdEN1cnJlbnREaXNwYXRjaGVyIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgIlBCQW5pbWF0b3IiLCAiX20wIiwgImxlbmd0aCIsICJQQkFuaW1hdGlvblN0YXRlIiwgImltcG9ydF9taW5pbWFsIiwgIlBCQXVkaW9Tb3VyY2UiLCAiX20wIiwgImxlbmd0aCIsICJpbXBvcnRfbWluaW1hbCIsICJQQkF1ZGlvU3RyZWFtIiwgIl9tMCIsICJsZW5ndGgiLCAiaW1wb3J0X21pbmltYWwiLCAiQXZhdGFyQW5jaG9yUG9pbnRUeXBlIiwgIlBCQXZhdGFyQXR0YWNoIiwgIl9tMCIsICJsZW5ndGgiLCAiaW1wb3J0X21pbmltYWwiLCAiaW1wb3J0X21pbmltYWwiLCAiUG9zaXRpb24iLCAiX20wIiwgImxlbmd0aCIsICJWZWN0b3IzIiwgIlZlY3RvcjIiLCAiUXVhdGVybmlvbiIsICJBdmF0YXJNb2RpZmllclR5cGUiLCAiUEJBdmF0YXJNb2RpZmllckFyZWEiLCAiX20wIiwgImxlbmd0aCIsICJpbXBvcnRfbWluaW1hbCIsICJpbXBvcnRfbWluaW1hbCIsICJDb2xvcjMiLCAiX20wIiwgImxlbmd0aCIsICJDb2xvcjQiLCAiUEJBdmF0YXJTaGFwZSIsICJfbTAiLCAibGVuZ3RoIiwgImltcG9ydF9taW5pbWFsIiwgIkJpbGxib2FyZE1vZGUiLCAiUEJCaWxsYm9hcmQiLCAiX20wIiwgImxlbmd0aCIsICJpbXBvcnRfbWluaW1hbCIsICJQQkNhbWVyYU1vZGUiLCAiX20wIiwgImxlbmd0aCIsICJpbXBvcnRfbWluaW1hbCIsICJQQkNhbWVyYU1vZGVBcmVhIiwgIl9tMCIsICJsZW5ndGgiLCAiaW1wb3J0X21pbmltYWwiLCAiUEJFbmdpbmVJbmZvIiwgIl9tMCIsICJsZW5ndGgiLCAiaW1wb3J0X21pbmltYWwiLCAiUEJHbHRmQ29udGFpbmVyIiwgIl9tMCIsICJsZW5ndGgiLCAiaW1wb3J0X21pbmltYWwiLCAiUEJHbHRmQ29udGFpbmVyTG9hZGluZ1N0YXRlIiwgIl9tMCIsICJsZW5ndGgiLCAiaW1wb3J0X21pbmltYWwiLCAiaW1wb3J0X21pbmltYWwiLCAiVGV4dHVyZVdyYXBNb2RlIiwgIlRleHR1cmVGaWx0ZXJNb2RlIiwgIlRleHR1cmUiLCAiX20wIiwgImxlbmd0aCIsICJBdmF0YXJUZXh0dXJlIiwgIlZpZGVvVGV4dHVyZSIsICJUZXh0dXJlVW5pb24iLCAiTWF0ZXJpYWxUcmFuc3BhcmVuY3lNb2RlIiwgIlBCTWF0ZXJpYWwiLCAiX20wIiwgImxlbmd0aCIsICJQQk1hdGVyaWFsX1VubGl0TWF0ZXJpYWwiLCAiUEJNYXRlcmlhbF9QYnJNYXRlcmlhbCIsICJpbXBvcnRfbWluaW1hbCIsICJDb2xsaWRlckxheWVyIiwgIlBCTWVzaENvbGxpZGVyIiwgIl9tMCIsICJsZW5ndGgiLCAiUEJNZXNoQ29sbGlkZXJfQm94TWVzaCIsICJQQk1lc2hDb2xsaWRlcl9DeWxpbmRlck1lc2giLCAiUEJNZXNoQ29sbGlkZXJfUGxhbmVNZXNoIiwgIlBCTWVzaENvbGxpZGVyX1NwaGVyZU1lc2giLCAiaW1wb3J0X21pbmltYWwiLCAiUEJNZXNoUmVuZGVyZXIiLCAiX20wIiwgImxlbmd0aCIsICJQQk1lc2hSZW5kZXJlcl9Cb3hNZXNoIiwgIlBCTWVzaFJlbmRlcmVyX0N5bGluZGVyTWVzaCIsICJQQk1lc2hSZW5kZXJlcl9QbGFuZU1lc2giLCAiUEJNZXNoUmVuZGVyZXJfU3BoZXJlTWVzaCIsICJpbXBvcnRfbWluaW1hbCIsICJOZnRGcmFtZVR5cGUiLCAiUEJOZnRTaGFwZSIsICJfbTAiLCAibGVuZ3RoIiwgImltcG9ydF9taW5pbWFsIiwgIlBCUG9pbnRlckV2ZW50cyIsICJfbTAiLCAibGVuZ3RoIiwgIlBCUG9pbnRlckV2ZW50c19JbmZvIiwgIlBCUG9pbnRlckV2ZW50c19FbnRyeSIsICJpbXBvcnRfbWluaW1hbCIsICJpbXBvcnRfbWluaW1hbCIsICJSYXljYXN0SGl0IiwgIl9tMCIsICJsZW5ndGgiLCAiUEJQb2ludGVyRXZlbnRzUmVzdWx0IiwgIl9tMCIsICJsZW5ndGgiLCAiaW1wb3J0X21pbmltYWwiLCAiUEJQb2ludGVyTG9jayIsICJfbTAiLCAibGVuZ3RoIiwgImltcG9ydF9taW5pbWFsIiwgIlJheWNhc3RRdWVyeVR5cGUiLCAiUEJSYXljYXN0IiwgIl9tMCIsICJsZW5ndGgiLCAiaW1wb3J0X21pbmltYWwiLCAiUEJSYXljYXN0UmVzdWx0IiwgIl9tMCIsICJsZW5ndGgiLCAiaW1wb3J0X21pbmltYWwiLCAiUEJUZXh0U2hhcGUiLCAiX20wIiwgImxlbmd0aCIsICJpbXBvcnRfbWluaW1hbCIsICJFYXNpbmdGdW5jdGlvbiIsICJQQlR3ZWVuIiwgIl9tMCIsICJsZW5ndGgiLCAiTW92ZSIsICJSb3RhdGUiLCAiU2NhbGUiLCAiaW1wb3J0X21pbmltYWwiLCAiVHdlZW5Mb29wIiwgIlBCVHdlZW5TZXF1ZW5jZSIsICJfbTAiLCAibGVuZ3RoIiwgImltcG9ydF9taW5pbWFsIiwgIlR3ZWVuU3RhdGVTdGF0dXMiLCAiUEJUd2VlblN0YXRlIiwgIl9tMCIsICJsZW5ndGgiLCAiaW1wb3J0X21pbmltYWwiLCAiaW1wb3J0X21pbmltYWwiLCAiQm9yZGVyUmVjdCIsICJfbTAiLCAibGVuZ3RoIiwgIlJlY3QiLCAiQmFja2dyb3VuZFRleHR1cmVNb2RlIiwgIlBCVWlCYWNrZ3JvdW5kIiwgIl9tMCIsICJsZW5ndGgiLCAiaW1wb3J0X21pbmltYWwiLCAiUEJVaUNhbnZhc0luZm9ybWF0aW9uIiwgIl9tMCIsICJsZW5ndGgiLCAiaW1wb3J0X21pbmltYWwiLCAiUEJVaURyb3Bkb3duIiwgIl9tMCIsICJsZW5ndGgiLCAiaW1wb3J0X21pbmltYWwiLCAiUEJVaURyb3Bkb3duUmVzdWx0IiwgIl9tMCIsICJsZW5ndGgiLCAiaW1wb3J0X21pbmltYWwiLCAiUEJVaUlucHV0IiwgIl9tMCIsICJsZW5ndGgiLCAiaW1wb3J0X21pbmltYWwiLCAiUEJVaUlucHV0UmVzdWx0IiwgIl9tMCIsICJsZW5ndGgiLCAiaW1wb3J0X21pbmltYWwiLCAiUEJVaVRleHQiLCAiX20wIiwgImxlbmd0aCIsICJpbXBvcnRfbWluaW1hbCIsICJZR1Bvc2l0aW9uVHlwZSIsICJZR0FsaWduIiwgIllHVW5pdCIsICJZR0ZsZXhEaXJlY3Rpb24iLCAiWUdXcmFwIiwgIllHSnVzdGlmeSIsICJZR092ZXJmbG93IiwgIllHRGlzcGxheSIsICJZR0VkZ2UiLCAiUG9pbnRlckZpbHRlck1vZGUiLCAiUEJVaVRyYW5zZm9ybSIsICJfbTAiLCAibGVuZ3RoIiwgImltcG9ydF9taW5pbWFsIiwgIlZpZGVvU3RhdGUiLCAiUEJWaWRlb0V2ZW50IiwgIl9tMCIsICJsZW5ndGgiLCAiaW1wb3J0X21pbmltYWwiLCAiUEJWaWRlb1BsYXllciIsICJfbTAiLCAibGVuZ3RoIiwgImltcG9ydF9taW5pbWFsIiwgIlBCVmlzaWJpbGl0eUNvbXBvbmVudCIsICJfbTAiLCAibGVuZ3RoIiwgImVuZ2luZSIsICJlbmdpbmUiLCAic3RhdGUiLCAiZW5naW5lIiwgImVuZ2luZSIsICJlbmdpbmUiLCAiZW5naW5lIiwgImxlbmd0aCIsICJNSU5fVkFMVUUiLCAiTUFYX1ZBTFVFIiwgInNwZWNSZWZsZWN0aW9uIiwgInNwZWNSZWZsZWN0aW9uIiwgInZhbHVlIiwgIlNjaGVtYXMiLCAiZW5naW5lIiwgIk5hbWUiLCAiZW5naW5lIiwgIlN5bmNDb21wb25lbnRzIiwgImVuZ2luZSIsICJlbmdpbmUiLCAiZW5naW5lIiwgImVuZ2luZSIsICJNYXRlcmlhbCIsICJBbmltYXRvciIsICJNZXNoUmVuZGVyZXIiLCAiTWVzaENvbGxpZGVyIiwgIlR3ZWVuIiwgIkVudGl0eVV0aWxzIiwgIkVudGl0eVN0YXRlIiwgInV0ZjgiLCAibGVuZ3RoIiwgIl9SZWFkV3JpdGVCeXRlQnVmZmVyX3dvQWRkIiwgIl9SZWFkV3JpdGVCeXRlQnVmZmVyX3JvQWRkIiwgIkNyZHRNZXNzYWdlVHlwZSIsICJQcm9jZXNzTWVzc2FnZVJlc3VsdFR5cGUiLCAiQ3JkdE1lc3NhZ2VQcm90b2NvbCIsICJEZWxldGVDb21wb25lbnQiLCAid3JpdGUiLCAicmVhZCIsICJBcHBlbmRWYWx1ZU9wZXJhdGlvbiIsICJ3cml0ZSIsICJyZWFkIiwgIkRlbGV0ZUVudGl0eSIsICJ3cml0ZSIsICJyZWFkIiwgIlB1dENvbXBvbmVudE9wZXJhdGlvbiIsICJ3cml0ZSIsICJyZWFkIiwgIlB1dE5ldHdvcmtDb21wb25lbnRPcGVyYXRpb24iLCAid3JpdGUiLCAicmVhZCIsICJEZWxldGVDb21wb25lbnROZXR3b3JrIiwgIndyaXRlIiwgInJlYWQiLCAiRGVsZXRlRW50aXR5TmV0d29yayIsICJ3cml0ZSIsICJyZWFkIiwgImVuZ2luZSIsICJOZXR3b3JrRW50aXR5IiwgIk5ldHdvcmtQYXJlbnQiLCAiVHJhbnNmb3JtIiwgInBhcnNlQ2h1bmtNZXNzYWdlIiwgImJ1ZmZlciIsICJtZXNzYWdlIiwgIkNyZHRVdGlscyIsICJTeW5jaHJvbml6ZWRFbnRpdHlUeXBlIiwgImFkZCIsICJwcmlvcml0eSIsICJlbmdpbmUiLCAiTmV0d29ya1BhcmVudCIsICJOZXR3b3JrRW50aXR5IiwgInBhcmVudCIsICJUcmFuc2Zvcm0iLCAiZW5naW5lIiwgIlBvaW50ZXJFdmVudHNSZXN1bHQiLCAiQ29tcG9uZW50VHlwZSIsICJwcmlvcml0eSIsICJyZW1vdmVFbnRpdHlXaXRoQ2hpbGRyZW4iLCAiZ2V0Q29tcG9uZW50IiwgImVuZ2luZSIsICJlbmdpbmUiLCAiaW5wdXRTeXN0ZW0iLCAiUG9pbnRlckV2ZW50cyIsICJFdmVudFR5cGUiLCAiZW5naW5lIiwgIlR3ZWVuIiwgIlR3ZWVuU3RhdGUiLCAiVHdlZW5TZXF1ZW5jZSIsICJBdWRpb1NvdXJjZSIsICJBdWRpb1N0cmVhbSIsICJBdmF0YXJBdHRhY2giLCAiQ2FtZXJhTW9kZUFyZWEiLCAiRW5naW5lSW5mbyIsICJHbHRmQ29udGFpbmVyIiwgIkdsdGZDb250YWluZXJMb2FkaW5nU3RhdGUiLCAiUG9pbnRlckV2ZW50cyIsICJQb2ludGVyRXZlbnRzUmVzdWx0IiwgIlRleHRTaGFwZSIsICJVaUJhY2tncm91bmQiLCAiVWlUZXh0IiwgIlVpVHJhbnNmb3JtIiwgIlZpZGVvUGxheWVyIiwgIlZpc2liaWxpdHlDb21wb25lbnQiLCAiQ2FtZXJhVHlwZSIsICJJbnB1dEFjdGlvbiIsICJQb2ludGVyRXZlbnRUeXBlIiwgIkxvYWRpbmdTdGF0ZSIsICJUZXh0QWxpZ25Nb2RlIiwgIkZvbnQiLCAiZW5naW5lIiwgIkVudGl0eU1hcHBpbmdNb2RlIiwgImVuZ2luZSIsICJjb21wb3NpdGVQcm92aWRlciIsICJpbXBvcnRfbWluaW1hbCIsICJpbXBvcnRfbWluaW1hbCIsICJOdWxsVmFsdWUiLCAidHNQcm90b0dsb2JhbFRoaXMiLCAiU3RydWN0IiwgIl9tMCIsICJsZW5ndGgiLCAiU3RydWN0X0ZpZWxkc0VudHJ5IiwgIlZhbHVlIiwgIkxpc3RWYWx1ZSIsICJDb21wb25lbnREYXRhIiwgIl9tMCIsICJsZW5ndGgiLCAiaXNTZXQiLCAiQ29tcG9zaXRlQ29tcG9uZW50IiwgImlzT2JqZWN0IiwgIkNvbXBvc2l0ZUNvbXBvbmVudF9EYXRhRW50cnkiLCAiQ29tcG9zaXRlRGVmaW5pdGlvbiIsICJ0c1Byb3RvR2xvYmFsVGhpcyIsICJDb21wb3NpdGUiLCAiZW5naW5lIiwgImNvbXBvc2l0ZVByb3ZpZGVyIiwgIlRyYW5zZm9ybSIsICJBbmltYXRvciIsICJNYXRlcmlhbCIsICJNZXNoUmVuZGVyZXIiLCAiTWVzaENvbGxpZGVyIiwgIk5hbWUiLCAiVHdlZW4iLCAiU3luY0NvbXBvbmVudHMiLCAiTmV0d29ya0VudGl0eSIsICJOZXR3b3JrUGFyZW50IiwgIlNjYWxhciIsICJsZW5ndGgiLCAiVmVjdG9yMyIsICJhZGQiLCAic3VidHJhY3QiLCAibmVnYXRlIiwgImNsb25lIiwgImxlbmd0aCIsICJzY2FsZSIsICJjZW50ZXIiLCAiUXVhdGVybmlvbiIsICJ0b1N0cmluZyIsICJlcXVhbHMiLCAibXVsdGlwbHkiLCAiZGl2aWRlIiwgIlBsYW5lIiwgIlZlY3RvcjMiLCAiY2xvbmUiLCAiTWF0cml4IiwgInNlbGYiLCAic2NhbGUiLCAibSIsICJ0cmFuc2xhdGlvbiIsICJWZWN0b3IzIiwgIlF1YXRlcm5pb24iLCAiYWRkIiwgIm11bHRpcGx5IiwgImVxdWFscyIsICJjbG9uZSIsICJRdWF0ZXJuaW9uIiwgImFkZCIsICJsZW5ndGgiLCAiVmVjdG9yMyIsICJtdWx0aXBseSIsICJzZWxmIiwgIkNvbG9yNCIsICJhZGQiLCAic3VidHJhY3QiLCAic2NhbGUiLCAibXVsdGlwbHkiLCAidG9TdHJpbmciLCAiY2xvbmUiLCAiQ29sb3IzIiwgInRvU3RyaW5nIiwgIkNvbG9yNCIsICJtdWx0aXBseSIsICJlcXVhbHMiLCAic2NhbGUiLCAiYWRkIiwgInN1YnRyYWN0IiwgImNsb25lIiwgIkJlZXJUeXBlIiwgIlNvdXBTdGF0ZSIsICJJbmdyZWRpZW50VHlwZSIsICJWZWN0b3IzIiwgIkNvbG9yNCIsICJUcmFuc2Zvcm0iLCAiVmVjdG9yMyIsICJBdWRpb1NvdXJjZSIsICJUcmFuc2Zvcm0iLCAiZW5naW5lIiwgIk5ldHdvcmtFbnRpdHkiLCAiU3luY0NvbXBvbmVudHMiLCAiUG9pbnRlckV2ZW50c1Jlc3VsdCIsICJHbHRmQ29udGFpbmVyTG9hZGluZ1N0YXRlIiwgIk5ldHdvcmtQYXJlbnQiLCAiZW5naW5lIiwgIlN5bmNDb21wb25lbnRzIiwgIk5ldHdvcmtFbnRpdHkiLCAiQ29tbXNNZXNzYWdlIiwgImVuZ2luZSIsICJteVByb2ZpbGUiLCAiZ2V0VXNlckRhdGEiLCAiZW5naW5lIiwgIkVuZ2luZUluZm8iLCAiZW5naW5lIiwgIk5ldHdvcmtFbnRpdHkiLCAiTmV0d29ya1BhcmVudCIsICJUcmFuc2Zvcm0iLCAiU3luY0NvbXBvbmVudHMiLCAic3luY0VudGl0eSIsICJnZXRDaGlsZHJlbiIsICJwYXJlbnQiLCAiZ2V0Rmlyc3RDaGlsZCIsICJnZXRQYXJlbnQiLCAicGFyZW50RW50aXR5IiwgInJlbW92ZVBhcmVudCIsICJlbmdpbmUiLCAic2VuZEJpbmFyeSIsICJnZXRVc2VyRGF0YSIsICJteVByb2ZpbGUiLCAiaW1wb3J0X1VzZXJJZGVudGl0eSIsICJUcmFuc2Zvcm0iLCAiVmVjdG9yMyIsICJRdWF0ZXJuaW9uIiwgIkludGVycG9sYXRpb25UeXBlIiwgInByaW9yaXR5IiwgInRpbWVycyIsICJUb2dnbGVTdGF0ZSIsICJ0aW1lcnMiLCAidG9nZ2xlcyIsICJUcmFuc2Zvcm0iLCAiVmVjdG9yMyIsICJRdWF0ZXJuaW9uIiwgIlRyYW5zZm9ybSIsICJRdWF0ZXJuaW9uIiwgIlRyYW5zZm9ybSIsICJWZWN0b3IzIiwgIlF1YXRlcm5pb24iLCAiVHJhbnNmb3JtIiwgIk1lc2hSZW5kZXJlciIsICJWZWN0b3IzIiwgIkNvbG9yMyIsICJNYXRlcmlhbCIsICJDb2xvcjQiLCAiY2FsbGJhY2siLCAiYWN0aW9ucyIsICJBbmltYXRvciIsICJHbHRmQ29udGFpbmVyIiwgIlBvaW50ZXJFdmVudHMiLCAiVHJhbnNmb3JtIiwgIlZlY3RvcjMiLCAiUXVhdGVybmlvbiIsICJNZXNoUmVuZGVyZXIiLCAiVmlzaWJpbGl0eUNvbXBvbmVudCIsICJNYXRlcmlhbCIsICJDb2xvcjQiLCAiTWF0ZXJpYWwiLCAiVHJhbnNmb3JtIiwgIlZlY3RvcjMiLCAiUXVhdGVybmlvbiIsICJNZXNoUmVuZGVyZXIiLCAiVmlzaWJpbGl0eUNvbXBvbmVudCIsICJUZXh0U2hhcGUiLCAiQ29sb3I0IiwgIlZlY3RvcjMiLCAiVHJhbnNmb3JtIiwgIlF1YXRlcm5pb24iLCAiR2x0ZkNvbnRhaW5lciIsICJBbmltYXRvciIsICJWaXNpYmlsaXR5Q29tcG9uZW50IiwgIlRleHRTaGFwZSIsICJQb2ludGVyRXZlbnRzIiwgIkdsdGZDb250YWluZXIiLCAiVHJhbnNmb3JtIiwgIlF1YXRlcm5pb24iLCAiVmVjdG9yMyIsICJBbmltYXRvciIsICJBdmF0YXJBdHRhY2giLCAiZW50aXR5IiwgIkFuaW1hdG9yIiwgIkF1ZGlvU291cmNlIiwgIlRyYW5zZm9ybSIsICJHbHRmQ29udGFpbmVyIiwgIlBvaW50ZXJFdmVudHMiLCAiVHdlZW4iLCAiVmVjdG9yMyIsICJRdWF0ZXJuaW9uIiwgIk1lc2hDb2xsaWRlciIsICJBbmltYXRvciIsICJSZWFjdEVjcyIsICJSZWFjdCIsICJ0b3AiLCAiYm90dG9tIiwgImVuZ2luZSIsICJVaVRyYW5zZm9ybSIsICJVaVRleHQiLCAiVWlCYWNrZ3JvdW5kIiwgIlVpSW5wdXQiLCAiVWlJbnB1dFJlc3VsdCIsICJVaURyb3Bkb3duIiwgIlVpRHJvcGRvd25SZXN1bHQiLCAiUmVjb25jaWxlciIsICJlbmdpbmUiLCAidWlDb21wb25lbnQiLCAiQ29sb3I0IiwgImVuZ2luZSIsICJDb21wb25lbnROYW1lIiwgIlR3ZWVuVHlwZSIsICJJbnRlcnBvbGF0aW9uVHlwZSIsICJBY3Rpb25UeXBlIiwgIlRyaWdnZXJUeXBlIiwgIlRyaWdnZXJDb25kaXRpb25UeXBlIiwgIlRyaWdnZXJDb25kaXRpb25PcGVyYXRpb24iLCAiQWxpZ25Nb2RlIiwgIkZvbnQiLCAiQ29sbGlkZXJzIiwgImFsbCIsICJNYXAiLCAib24iLCAidHlwZSIsICJoYW5kbGVyIiwgImhhbmRsZXJzIiwgImdldCIsICJwdXNoIiwgInNldCIsICJvZmYiLCAic3BsaWNlIiwgImluZGV4T2YiLCAiZW1pdCIsICJldnQiLCAic2xpY2UiLCAibWFwIiwgInRyaWdnZXJzIiwgImFjdGlvbnMiLCAiZW5naW5lIiwgImVuZ2luZSIsICJ0cmlnZ2VycyIsICJJbnRlcnBvbGF0aW9uVHlwZSIsICJGb250IiwgImVuZ2luZSIsICJNYXRlcmlhbCIsICJWaWRlb1BsYXllciIsICJpbXBvcnRfUmVzdHJpY3RlZEFjdGlvbnMiLCAiYWN0aW9ucyIsICJVaVRyYW5zZm9ybSIsICJVaUJhY2tncm91bmQiLCAiQ29sb3I0IiwgIlVpVGV4dCIsICJGb250IiwgImVuZ2luZSIsICJwb2ludGVyRXZlbnRzU3lzdGVtIiwgInRyaWdnZXJzIiwgInR5cGVzIiwgImVudGl0eSIsICJhY3Rpb25zIiwgImNvbXBvbmVudE5hbWUiLCAiVHJhbnNmb3JtIiwgImluaXRlZEVudGl0aWVzIiwgImVuZ2luZSIsICJBbmltYXRvciIsICJUcmFuc2Zvcm0iLCAiQXVkaW9Tb3VyY2UiLCAiQXZhdGFyQXR0YWNoIiwgIlZpc2liaWxpdHlDb21wb25lbnQiLCAiR2x0ZkNvbnRhaW5lciIsICJpbml0ZWRFbnRpdGllcyIsICJhY3Rpb25zIiwgInR5cGVzIiwgIlZlY3RvcjMiLCAiUXVhdGVybmlvbiIsICJNZXNoQ29sbGlkZXIiLCAiVmlkZW9QbGF5ZXIiLCAiTWF0ZXJpYWwiLCAiQXVkaW9TdHJlYW0iLCAiVWlUZXh0IiwgImVuZ2luZSIsICJwb2ludGVyRXZlbnRzU3lzdGVtIiwgIkFuaW1hdG9yIiwgIkF1ZGlvU291cmNlIiwgIkF2YXRhckF0dGFjaCIsICJUcmFuc2Zvcm0iLCAiVmlzaWJpbGl0eUNvbXBvbmVudCIsICJHbHRmQ29udGFpbmVyIiwgIk1hdGVyaWFsIiwgIlZpZGVvUGxheWVyIiwgIlZlY3RvcjMiLCAiUXVhdGVybmlvbiIsICJUZXh0U2hhcGUiLCAiQ2FtZXJhTW9kZUFyZWEiLCAiaW1wb3J0X0VuZ2luZUFwaSIsICJyZW5kZXJlclRyYW5zcG9ydCIsICJzZW5kQmF0Y2giXQp9Cg== diff --git a/images/thumb.png b/images/thumb.png new file mode 100644 index 0000000000000000000000000000000000000000..bed2fb357d7c1a55df71a189b8c933731c3085e5 GIT binary patch literal 1076180 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�WM(RU-UfJz)~B@c&GiXZ8+z8c3)XB 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⪚l_%8~M;Y~k+5xd9>4_6~7R+TIE~}l;6Uvv% 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%0A|q< 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 z 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%0D^IqgXgp7?Z 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

n!wnM>sNtaYb?Af-)5_?bBb=bv(y4TW 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

0)_nHKNA?@KT10aoc0_G_6P71B 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

-e%QSCT%j*bFj+J_Cqu;IPC`bm6lJOkLYU; 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 z

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%0DX1Di&wxZPUwEpEF0jOXT4+06) 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 z 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

FaH+Js2Iyo3aJHs|mNE%L13<4a;cg-d9> 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 z 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 og4S`h-

H!Ek$nKKelZpvVeDqzj>)P;2-~w~kM{dF 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