1)?d[p-2]>>this.F2:0);var A=this.FV/o,z=(1<=0){g[g.t++]=1;g.subTo(f,g)}BigInteger.ONE.dlShiftTo(p,f);f.subTo(d,d);while(d.t=0){var c=(g[--u]==b)?this.DM:Math.floor(g[u]*A+(g[u-1]+x)*z);if((g[u]+=d.am(0,c,g,s,0,p))0){g.rShiftTo(v,g)}if(a<0){BigInteger.ZERO.subTo(g,g)}}function bnMod(b){var c=nbi();this.abs().divRemTo(b,null,c);if(this.s<0&&c.compareTo(BigInteger.ZERO)>0){b.subTo(c,c)}return c}function Classic(a){this.m=a}function cConvert(a){if(a.s<0||a.compareTo(this.m)>=0){return a.mod(this.m)}else{return a}}function cRevert(a){return a}function cReduce(a){a.divRemTo(this.m,null,a)}function cMulTo(a,c,b){a.multiplyTo(c,b);this.reduce(b)}function cSqrTo(a,b){a.squareTo(b);this.reduce(b)}Classic.prototype.convert=cConvert;Classic.prototype.revert=cRevert;Classic.prototype.reduce=cReduce;Classic.prototype.mulTo=cMulTo;Classic.prototype.sqrTo=cSqrTo;function bnpInvDigit(){if(this.t<1){return 0}var a=this[0];if((a&1)==0){return 0}var b=a&3;b=(b*(2-(a&15)*b))&15;b=(b*(2-(a&255)*b))&255;b=(b*(2-(((a&65535)*b)&65535)))&65535;b=(b*(2-a*b%this.DV))%this.DV;return(b>0)?this.DV-b:-b}function Montgomery(a){this.m=a;this.mp=a.invDigit();this.mpl=this.mp&32767;this.mph=this.mp>>15;this.um=(1<<(a.DB-15))-1;this.mt2=2*a.t}function montConvert(a){var b=nbi();a.abs().dlShiftTo(this.m.t,b);b.divRemTo(this.m,null,b);if(a.s<0&&b.compareTo(BigInteger.ZERO)>0){this.m.subTo(b,b)}return b}function montRevert(a){var b=nbi();a.copyTo(b);this.reduce(b);return b}function montReduce(a){while(a.t<=this.mt2){a[a.t++]=0}for(var c=0;c>15)*this.mpl)&this.um)<<15))&a.DM;b=c+this.m.t;a[b]+=this.m.am(0,d,a,c,0,this.m.t);while(a[b]>=a.DV){a[b]-=a.DV;a[++b]++}}a.clamp();a.drShiftTo(this.m.t,a);if(a.compareTo(this.m)>=0){a.subTo(this.m,a)}}function montSqrTo(a,b){a.squareTo(b);this.reduce(b)}function montMulTo(a,c,b){a.multiplyTo(c,b);this.reduce(b)}Montgomery.prototype.convert=montConvert;Montgomery.prototype.revert=montRevert;Montgomery.prototype.reduce=montReduce;Montgomery.prototype.mulTo=montMulTo;Montgomery.prototype.sqrTo=montSqrTo;function bnpIsEven(){return((this.t>0)?(this[0]&1):this.s)==0}function bnpExp(h,j){if(h>4294967295||h<1){return BigInteger.ONE}var f=nbi(),a=nbi(),d=j.convert(this),c=nbits(h)-1;d.copyTo(f);while(--c>=0){j.sqrTo(f,a);if((h&(1<0){j.mulTo(a,d,f)}else{var b=f;f=a;a=b}}return j.revert(f)}function bnModPowInt(b,a){var c;if(b<256||a.isEven()){c=new Classic(a)}else{c=new Montgomery(a)}return this.exp(b,c)}BigInteger.prototype.copyTo=bnpCopyTo;BigInteger.prototype.fromInt=bnpFromInt;BigInteger.prototype.fromString=bnpFromString;BigInteger.prototype.clamp=bnpClamp;BigInteger.prototype.dlShiftTo=bnpDLShiftTo;BigInteger.prototype.drShiftTo=bnpDRShiftTo;BigInteger.prototype.lShiftTo=bnpLShiftTo;BigInteger.prototype.rShiftTo=bnpRShiftTo;BigInteger.prototype.subTo=bnpSubTo;BigInteger.prototype.multiplyTo=bnpMultiplyTo;BigInteger.prototype.squareTo=bnpSquareTo;BigInteger.prototype.divRemTo=bnpDivRemTo;BigInteger.prototype.invDigit=bnpInvDigit;BigInteger.prototype.isEven=bnpIsEven;BigInteger.prototype.exp=bnpExp;BigInteger.prototype.toString=bnToString;BigInteger.prototype.negate=bnNegate;BigInteger.prototype.abs=bnAbs;BigInteger.prototype.compareTo=bnCompareTo;BigInteger.prototype.bitLength=bnBitLength;BigInteger.prototype.mod=bnMod;BigInteger.prototype.modPowInt=bnModPowInt;BigInteger.ZERO=nbv(0);BigInteger.ONE=nbv(1);
/*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/
*/
function bnClone(){var a=nbi();this.copyTo(a);return a}function bnIntValue(){if(this.s<0){if(this.t==1){return this[0]-this.DV}else{if(this.t==0){return -1}}}else{if(this.t==1){return this[0]}else{if(this.t==0){return 0}}}return((this[1]&((1<<(32-this.DB))-1))<>24}function bnShortValue(){return(this.t==0)?this.s:(this[0]<<16)>>16}function bnpChunkSize(a){return Math.floor(Math.LN2*this.DB/Math.log(a))}function bnSigNum(){if(this.s<0){return -1}else{if(this.t<=0||(this.t==1&&this[0]<=0)){return 0}else{return 1}}}function bnpToRadix(c){if(c==null){c=10}if(this.signum()==0||c<2||c>36){return"0"}var f=this.chunkSize(c);var e=Math.pow(c,f);var i=nbv(e),j=nbi(),h=nbi(),g="";this.divRemTo(i,j,h);while(j.signum()>0){g=(e+h.intValue()).toString(c).substr(1)+g;j.divRemTo(i,j,h)}return h.intValue().toString(c)+g}function bnpFromRadix(m,h){this.fromInt(0);if(h==null){h=10}var f=this.chunkSize(h);var g=Math.pow(h,f),e=false,a=0,l=0;for(var c=0;c=f){this.dMultiply(g);this.dAddOffset(l,0);a=0;l=0}}if(a>0){this.dMultiply(Math.pow(h,a));this.dAddOffset(l,0)}if(e){BigInteger.ZERO.subTo(this,this)}}function bnpFromNumber(f,e,h){if("number"==typeof e){if(f<2){this.fromInt(1)}else{this.fromNumber(f,h);if(!this.testBit(f-1)){this.bitwiseTo(BigInteger.ONE.shiftLeft(f-1),op_or,this)}if(this.isEven()){this.dAddOffset(1,0)}while(!this.isProbablePrime(e)){this.dAddOffset(2,0);if(this.bitLength()>f){this.subTo(BigInteger.ONE.shiftLeft(f-1),this)}}}}else{var d=new Array(),g=f&7;d.length=(f>>3)+1;e.nextBytes(d);if(g>0){d[0]&=((1<0){if(e>e)!=(this.s&this.DM)>>e){c[a++]=f|(this.s<<(this.DB-e))}while(b>=0){if(e<8){f=(this[b]&((1<>(e+=this.DB-8)}else{f=(this[b]>>(e-=8))&255;if(e<=0){e+=this.DB;--b}}if((f&128)!=0){f|=-256}if(a==0&&(this.s&128)!=(f&128)){++a}if(a>0||f!=this.s){c[a++]=f}}}return c}function bnEquals(b){return(this.compareTo(b)==0)}function bnMin(b){return(this.compareTo(b)<0)?this:b}function bnMax(b){return(this.compareTo(b)>0)?this:b}function bnpBitwiseTo(c,h,e){var d,g,b=Math.min(c.t,this.t);for(d=0;d>=16;b+=16}if((a&255)==0){a>>=8;b+=8}if((a&15)==0){a>>=4;b+=4}if((a&3)==0){a>>=2;b+=2}if((a&1)==0){++b}return b}function bnGetLowestSetBit(){for(var a=0;a=this.t){return(this.s!=0)}return((this[a]&(1<<(b%this.DB)))!=0)}function bnpChangeBit(c,b){var a=BigInteger.ONE.shiftLeft(c);this.bitwiseTo(a,b,a);return a}function bnSetBit(a){return this.changeBit(a,op_or)}function bnClearBit(a){return this.changeBit(a,op_andnot)}function bnFlipBit(a){return this.changeBit(a,op_xor)}function bnpAddTo(d,f){var e=0,g=0,b=Math.min(d.t,this.t);while(e>=this.DB}if(d.t>=this.DB}g+=this.s}else{g+=this.s;while(e>=this.DB}g+=d.s}f.s=(g<0)?-1:0;if(g>0){f[e++]=g}else{if(g<-1){f[e++]=this.DV+g}}f.t=e;f.clamp()}function bnAdd(b){var c=nbi();this.addTo(b,c);return c}function bnSubtract(b){var c=nbi();this.subTo(b,c);return c}function bnMultiply(b){var c=nbi();this.multiplyTo(b,c);return c}function bnSquare(){var a=nbi();this.squareTo(a);return a}function bnDivide(b){var c=nbi();this.divRemTo(b,c,null);return c}function bnRemainder(b){var c=nbi();this.divRemTo(b,null,c);return c}function bnDivideAndRemainder(b){var d=nbi(),c=nbi();this.divRemTo(b,d,c);return new Array(d,c)}function bnpDMultiply(a){this[this.t]=this.am(0,a-1,this,0,0,this.t);++this.t;this.clamp()}function bnpDAddOffset(b,a){if(b==0){return}while(this.t<=a){this[this.t++]=0}this[a]+=b;while(this[a]>=this.DV){this[a]-=this.DV;if(++a>=this.t){this[this.t++]=0}++this[a]}}function NullExp(){}function nNop(a){return a}function nMulTo(a,c,b){a.multiplyTo(c,b)}function nSqrTo(a,b){a.squareTo(b)}NullExp.prototype.convert=nNop;NullExp.prototype.revert=nNop;NullExp.prototype.mulTo=nMulTo;NullExp.prototype.sqrTo=nSqrTo;function bnPow(a){return this.exp(a,new NullExp())}function bnpMultiplyLowerTo(b,f,e){var d=Math.min(this.t+b.t,f);e.s=0;e.t=d;while(d>0){e[--d]=0}var c;for(c=e.t-this.t;d=0){d[c]=0}for(c=Math.max(e-this.t,0);c2*this.m.t){return a.mod(this.m)}else{if(a.compareTo(this.m)<0){return a}else{var b=nbi();a.copyTo(b);this.reduce(b);return b}}}function barrettRevert(a){return a}function barrettReduce(a){a.drShiftTo(this.m.t-1,this.r2);if(a.t>this.m.t+1){a.t=this.m.t+1;a.clamp()}this.mu.multiplyUpperTo(this.r2,this.m.t+1,this.q3);this.m.multiplyLowerTo(this.q3,this.m.t+1,this.r2);while(a.compareTo(this.r2)<0){a.dAddOffset(1,this.m.t+1)}a.subTo(this.r2,a);while(a.compareTo(this.m)>=0){a.subTo(this.m,a)}}function barrettSqrTo(a,b){a.squareTo(b);this.reduce(b)}function barrettMulTo(a,c,b){a.multiplyTo(c,b);this.reduce(b)}Barrett.prototype.convert=barrettConvert;Barrett.prototype.revert=barrettRevert;Barrett.prototype.reduce=barrettReduce;Barrett.prototype.mulTo=barrettMulTo;Barrett.prototype.sqrTo=barrettSqrTo;function bnModPow(q,f){var o=q.bitLength(),h,b=nbv(1),v;if(o<=0){return b}else{if(o<18){h=1}else{if(o<48){h=3}else{if(o<144){h=4}else{if(o<768){h=5}else{h=6}}}}}if(o<8){v=new Classic(f)}else{if(f.isEven()){v=new Barrett(f)}else{v=new Montgomery(f)}}var p=new Array(),d=3,s=h-1,a=(1<1){var A=nbi();v.sqrTo(p[1],A);while(d<=a){p[d]=nbi();v.mulTo(A,p[d-2],p[d]);d+=2}}var l=q.t-1,x,u=true,c=nbi(),y;o=nbits(q[l])-1;while(l>=0){if(o>=s){x=(q[l]>>(o-s))&a}else{x=(q[l]&((1<<(o+1))-1))<<(s-o);if(l>0){x|=q[l-1]>>(this.DB+o-s)}}d=h;while((x&1)==0){x>>=1;--d}if((o-=d)<0){o+=this.DB;--l}if(u){p[x].copyTo(b);u=false}else{while(d>1){v.sqrTo(b,c);v.sqrTo(c,b);d-=2}if(d>0){v.sqrTo(b,c)}else{y=b;b=c;c=y}v.mulTo(c,p[x],b)}while(l>=0&&(q[l]&(1<0){b.rShiftTo(f,b);h.rShiftTo(f,h)}while(b.signum()>0){if((d=b.getLowestSetBit())>0){b.rShiftTo(d,b)}if((d=h.getLowestSetBit())>0){h.rShiftTo(d,h)}if(b.compareTo(h)>=0){b.subTo(h,b);b.rShiftTo(1,b)}else{h.subTo(b,h);h.rShiftTo(1,h)}}if(f>0){h.lShiftTo(f,h)}return h}function bnpModInt(e){if(e<=0){return 0}var c=this.DV%e,b=(this.s<0)?e-1:0;if(this.t>0){if(c==0){b=this[0]%e}else{for(var a=this.t-1;a>=0;--a){b=(c*b+this[a])%e}}}return b}function bnModInverse(f){var j=f.isEven();if((this.isEven()&&j)||f.signum()==0){return BigInteger.ZERO}var i=f.clone(),h=this.clone();var g=nbv(1),e=nbv(0),l=nbv(0),k=nbv(1);while(i.signum()!=0){while(i.isEven()){i.rShiftTo(1,i);if(j){if(!g.isEven()||!e.isEven()){g.addTo(this,g);e.subTo(f,e)}g.rShiftTo(1,g)}else{if(!e.isEven()){e.subTo(f,e)}}e.rShiftTo(1,e)}while(h.isEven()){h.rShiftTo(1,h);if(j){if(!l.isEven()||!k.isEven()){l.addTo(this,l);k.subTo(f,k)}l.rShiftTo(1,l)}else{if(!k.isEven()){k.subTo(f,k)}}k.rShiftTo(1,k)}if(i.compareTo(h)>=0){i.subTo(h,i);if(j){g.subTo(l,g)}e.subTo(k,e)}else{h.subTo(i,h);if(j){l.subTo(g,l)}k.subTo(e,k)}}if(h.compareTo(BigInteger.ONE)!=0){return BigInteger.ZERO}if(k.compareTo(f)>=0){return k.subtract(f)}if(k.signum()<0){k.addTo(f,k)}else{return k}if(k.signum()<0){return k.add(f)}else{return k}}var lowprimes=[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587,593,599,601,607,613,617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853,857,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997];var lplim=(1<<26)/lowprimes[lowprimes.length-1];function bnIsProbablePrime(e){var d,b=this.abs();if(b.t==1&&b[0]<=lowprimes[lowprimes.length-1]){for(d=0;d>1;if(f>lowprimes.length){f=lowprimes.length}var b=nbi();for(var e=0;e>8)&255;rng_pool[rng_pptr++]^=(a>>16)&255;rng_pool[rng_pptr++]^=(a>>24)&255;if(rng_pptr>=rng_psize){rng_pptr-=rng_psize}}function rng_seed_time(){rng_seed_int(new Date().getTime())}if(rng_pool==null){rng_pool=new Array();rng_pptr=0;var t;if(navigator.appName=="Netscape"&&navigator.appVersion<"5"&&window.crypto){var z=window.crypto.random(32);for(t=0;t>>8;rng_pool[rng_pptr++]=t&255}rng_pptr=0;rng_seed_time()}function rng_get_byte(){if(rng_state==null){rng_seed_time();rng_state=prng_newstate();rng_state.init(rng_pool);for(rng_pptr=0;rng_pptr=0&&h>0){var f=e.charCodeAt(d--);if(f<128){g[--h]=f}else{if((f>127)&&(f<2048)){g[--h]=(f&63)|128;g[--h]=(f>>6)|192}else{g[--h]=(f&63)|128;g[--h]=((f>>6)&63)|128;g[--h]=(f>>12)|224}}}g[--h]=0;var b=new SecureRandom();var a=new Array();while(h>2){a[0]=0;while(a[0]==0){b.nextBytes(a)}g[--h]=a[0]}g[--h]=2;g[--h]=0;return new BigInteger(g)}function oaep_mgf1_arr(c,a,e){var b="",d=0;while(b.length>24,(d&16711680)>>16,(d&65280)>>8,d&255])));d+=1}return b}var SHA1_SIZE=20;function oaep_pad(l,a,c){if(l.length+2*SHA1_SIZE+2>a){throw"Message too long for RSA"}var h="",d;for(d=0;d0&&a.length>0){this.n=parseBigInt(b,16);this.e=parseInt(a,16)}else{alert("Invalid RSA public key")}}}function RSADoPublic(a){return a.modPowInt(this.e,this.n)}function RSAEncrypt(d){var a=pkcs1pad2(d,(this.n.bitLength()+7)>>3);if(a==null){return null}var e=this.doPublic(a);if(e==null){return null}var b=e.toString(16);if((b.length&1)==0){return b}else{return"0"+b}}function RSAEncryptOAEP(e,d){var a=oaep_pad(e,(this.n.bitLength()+7)>>3,d);if(a==null){return null}var f=this.doPublic(a);if(f==null){return null}var b=f.toString(16);if((b.length&1)==0){return b}else{return"0"+b}}RSAKey.prototype.doPublic=RSADoPublic;RSAKey.prototype.setPublic=RSASetPublic;RSAKey.prototype.encrypt=RSAEncrypt;RSAKey.prototype.encryptOAEP=RSAEncryptOAEP;RSAKey.prototype.type="RSA";
/*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/
*/
function pkcs1unpad2(g,j){var a=g.toByteArray();var f=0;while(f=a.length){return null}}var e="";while(++f191)&&(h<224)){e+=String.fromCharCode(((h&31)<<6)|(a[f+1]&63));++f}else{e+=String.fromCharCode(((h&15)<<12)|((a[f+1]&63)<<6)|(a[f+2]&63));f+=2}}}return e}function oaep_mgf1_str(c,a,e){var b="",d=0;while(b.length>24,(d&16711680)>>16,(d&65280)>>8,d&255]));d+=1}return b}var SHA1_SIZE=20;function oaep_unpad(l,b,e){l=l.toByteArray();var f;for(f=0;f0&&a.length>0){this.n=parseBigInt(c,16);this.e=parseInt(a,16);this.d=parseBigInt(b,16)}else{alert("Invalid RSA private key")}}}function RSASetPrivateEx(g,d,e,c,b,a,h,f){this.isPrivate=true;if(g==null){throw"RSASetPrivateEx N == null"}if(d==null){throw"RSASetPrivateEx E == null"}if(g.length==0){throw"RSASetPrivateEx N.length == 0"}if(d.length==0){throw"RSASetPrivateEx E.length == 0"}if(g!=null&&d!=null&&g.length>0&&d.length>0){this.n=parseBigInt(g,16);this.e=parseInt(d,16);this.d=parseBigInt(e,16);this.p=parseBigInt(c,16);this.q=parseBigInt(b,16);this.dmp1=parseBigInt(a,16);this.dmq1=parseBigInt(h,16);this.coeff=parseBigInt(f,16)}else{alert("Invalid RSA private key in RSASetPrivateEx")}}function RSAGenerate(b,i){var a=new SecureRandom();var f=b>>1;this.e=parseInt(i,16);var c=new BigInteger(i,16);for(;;){for(;;){this.p=new BigInteger(b-f,1,a);if(this.p.subtract(BigInteger.ONE).gcd(c).compareTo(BigInteger.ONE)==0&&this.p.isProbablePrime(10)){break}}for(;;){this.q=new BigInteger(f,1,a);if(this.q.subtract(BigInteger.ONE).gcd(c).compareTo(BigInteger.ONE)==0&&this.q.isProbablePrime(10)){break}}if(this.p.compareTo(this.q)<=0){var h=this.p;this.p=this.q;this.q=h}var g=this.p.subtract(BigInteger.ONE);var d=this.q.subtract(BigInteger.ONE);var e=g.multiply(d);if(e.gcd(c).compareTo(BigInteger.ONE)==0){this.n=this.p.multiply(this.q);this.d=c.modInverse(e);this.dmp1=this.d.mod(g);this.dmq1=this.d.mod(d);this.coeff=this.q.modInverse(this.p);break}}}function RSADoPrivate(a){if(this.p==null||this.q==null){return a.modPow(this.d,this.n)}var c=a.mod(this.p).modPow(this.dmp1,this.p);var b=a.mod(this.q).modPow(this.dmq1,this.q);while(c.compareTo(b)<0){c=c.add(this.p)}return c.subtract(b).multiply(this.coeff).mod(this.p).multiply(this.q).add(b)}function RSADecrypt(b){var d=parseBigInt(b,16);var a=this.doPrivate(d);if(a==null){return null}return pkcs1unpad2(a,(this.n.bitLength()+7)>>3)}function RSADecryptOAEP(d,b){var e=parseBigInt(d,16);var a=this.doPrivate(e);if(a==null){return null}return oaep_unpad(a,(this.n.bitLength()+7)>>3,b)}RSAKey.prototype.doPrivate=RSADoPrivate;RSAKey.prototype.setPrivate=RSASetPrivate;RSAKey.prototype.setPrivateEx=RSASetPrivateEx;RSAKey.prototype.generate=RSAGenerate;RSAKey.prototype.decrypt=RSADecrypt;RSAKey.prototype.decryptOAEP=RSADecryptOAEP;
/*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/
*/
function ECFieldElementFp(b,a){this.x=a;this.q=b}function feFpEquals(a){if(a==this){return true}return(this.q.equals(a.q)&&this.x.equals(a.x))}function feFpToBigInteger(){return this.x}function feFpNegate(){return new ECFieldElementFp(this.q,this.x.negate().mod(this.q))}function feFpAdd(a){return new ECFieldElementFp(this.q,this.x.add(a.toBigInteger()).mod(this.q))}function feFpSubtract(a){return new ECFieldElementFp(this.q,this.x.subtract(a.toBigInteger()).mod(this.q))}function feFpMultiply(a){return new ECFieldElementFp(this.q,this.x.multiply(a.toBigInteger()).mod(this.q))}function feFpSquare(){return new ECFieldElementFp(this.q,this.x.square().mod(this.q))}function feFpDivide(a){return new ECFieldElementFp(this.q,this.x.multiply(a.toBigInteger().modInverse(this.q)).mod(this.q))}ECFieldElementFp.prototype.equals=feFpEquals;ECFieldElementFp.prototype.toBigInteger=feFpToBigInteger;ECFieldElementFp.prototype.negate=feFpNegate;ECFieldElementFp.prototype.add=feFpAdd;ECFieldElementFp.prototype.subtract=feFpSubtract;ECFieldElementFp.prototype.multiply=feFpMultiply;ECFieldElementFp.prototype.square=feFpSquare;ECFieldElementFp.prototype.divide=feFpDivide;function ECPointFp(c,a,d,b){this.curve=c;this.x=a;this.y=d;if(b==null){this.z=BigInteger.ONE}else{this.z=b}this.zinv=null}function pointFpGetX(){if(this.zinv==null){this.zinv=this.z.modInverse(this.curve.q)}return this.curve.fromBigInteger(this.x.toBigInteger().multiply(this.zinv).mod(this.curve.q))}function pointFpGetY(){if(this.zinv==null){this.zinv=this.z.modInverse(this.curve.q)}return this.curve.fromBigInteger(this.y.toBigInteger().multiply(this.zinv).mod(this.curve.q))}function pointFpEquals(a){if(a==this){return true}if(this.isInfinity()){return a.isInfinity()}if(a.isInfinity()){return this.isInfinity()}var c,b;c=a.y.toBigInteger().multiply(this.z).subtract(this.y.toBigInteger().multiply(a.z)).mod(this.curve.q);if(!c.equals(BigInteger.ZERO)){return false}b=a.x.toBigInteger().multiply(this.z).subtract(this.x.toBigInteger().multiply(a.z)).mod(this.curve.q);return b.equals(BigInteger.ZERO)}function pointFpIsInfinity(){if((this.x==null)&&(this.y==null)){return true}return this.z.equals(BigInteger.ZERO)&&!this.y.toBigInteger().equals(BigInteger.ZERO)}function pointFpNegate(){return new ECPointFp(this.curve,this.x,this.y.negate(),this.z)}function pointFpAdd(l){if(this.isInfinity()){return l}if(l.isInfinity()){return this}var p=l.y.toBigInteger().multiply(this.z).subtract(this.y.toBigInteger().multiply(l.z)).mod(this.curve.q);var o=l.x.toBigInteger().multiply(this.z).subtract(this.x.toBigInteger().multiply(l.z)).mod(this.curve.q);if(BigInteger.ZERO.equals(o)){if(BigInteger.ZERO.equals(p)){return this.twice()}return this.curve.getInfinity()}var j=new BigInteger("3");var e=this.x.toBigInteger();var n=this.y.toBigInteger();var c=l.x.toBigInteger();var k=l.y.toBigInteger();var m=o.square();var i=m.multiply(o);var d=e.multiply(m);var g=p.square().multiply(this.z);var a=g.subtract(d.shiftLeft(1)).multiply(l.z).subtract(i).multiply(o).mod(this.curve.q);var h=d.multiply(j).multiply(p).subtract(n.multiply(i)).subtract(g.multiply(p)).multiply(l.z).add(p.multiply(i)).mod(this.curve.q);var f=i.multiply(this.z).multiply(l.z).mod(this.curve.q);return new ECPointFp(this.curve,this.curve.fromBigInteger(a),this.curve.fromBigInteger(h),f)}function pointFpTwice(){if(this.isInfinity()){return this}if(this.y.toBigInteger().signum()==0){return this.curve.getInfinity()}var g=new BigInteger("3");var c=this.x.toBigInteger();var h=this.y.toBigInteger();var e=h.multiply(this.z);var j=e.multiply(h).mod(this.curve.q);var i=this.curve.a.toBigInteger();var k=c.square().multiply(g);if(!BigInteger.ZERO.equals(i)){k=k.add(this.z.square().multiply(i))}k=k.mod(this.curve.q);var b=k.square().subtract(c.shiftLeft(3).multiply(j)).shiftLeft(1).multiply(e).mod(this.curve.q);var f=k.multiply(g).multiply(c).subtract(j.shiftLeft(1)).shiftLeft(2).multiply(j).subtract(k.square().multiply(k)).mod(this.curve.q);var d=e.square().multiply(e).shiftLeft(3).mod(this.curve.q);return new ECPointFp(this.curve,this.curve.fromBigInteger(b),this.curve.fromBigInteger(f),d)}function pointFpMultiply(b){if(this.isInfinity()){return this}if(b.signum()==0){return this.curve.getInfinity()}var g=b;var f=g.multiply(new BigInteger("3"));var l=this.negate();var d=this;var c;for(c=f.bitLength()-2;c>0;--c){d=d.twice();var a=f.testBit(c);var j=g.testBit(c);if(a!=j){d=d.add(a?this:l)}}return d}function pointFpMultiplyTwo(c,a,b){var d;if(c.bitLength()>b.bitLength()){d=c.bitLength()-1}else{d=b.bitLength()-1}var f=this.curve.getInfinity();var e=this.add(a);while(d>=0){f=f.twice();if(c.testBit(d)){if(b.testBit(d)){f=f.add(e)}else{f=f.add(this)}}else{if(b.testBit(d)){f=f.add(a)}}--d}return f}ECPointFp.prototype.getX=pointFpGetX;ECPointFp.prototype.getY=pointFpGetY;ECPointFp.prototype.equals=pointFpEquals;ECPointFp.prototype.isInfinity=pointFpIsInfinity;ECPointFp.prototype.negate=pointFpNegate;ECPointFp.prototype.add=pointFpAdd;ECPointFp.prototype.twice=pointFpTwice;ECPointFp.prototype.multiply=pointFpMultiply;ECPointFp.prototype.multiplyTwo=pointFpMultiplyTwo;function ECCurveFp(e,d,c){this.q=e;this.a=this.fromBigInteger(d);this.b=this.fromBigInteger(c);this.infinity=new ECPointFp(this,null,null)}function curveFpGetQ(){return this.q}function curveFpGetA(){return this.a}function curveFpGetB(){return this.b}function curveFpEquals(a){if(a==this){return true}return(this.q.equals(a.q)&&this.a.equals(a.a)&&this.b.equals(a.b))}function curveFpGetInfinity(){return this.infinity}function curveFpFromBigInteger(a){return new ECFieldElementFp(this.q,a)}function curveFpDecodePointHex(d){switch(parseInt(d.substr(0,2),16)){case 0:return this.infinity;case 2:case 3:return null;case 4:case 6:case 7:var a=(d.length-2)/2;var c=d.substr(2,a);var b=d.substr(a+2,a);return new ECPointFp(this,this.fromBigInteger(new BigInteger(c,16)),this.fromBigInteger(new BigInteger(b,16)));default:return null}}ECCurveFp.prototype.getQ=curveFpGetQ;ECCurveFp.prototype.getA=curveFpGetA;ECCurveFp.prototype.getB=curveFpGetB;ECCurveFp.prototype.equals=curveFpEquals;ECCurveFp.prototype.getInfinity=curveFpGetInfinity;ECCurveFp.prototype.fromBigInteger=curveFpFromBigInteger;ECCurveFp.prototype.decodePointHex=curveFpDecodePointHex;
/*! (c) Stefan Thomas | https://github.com/bitcoinjs/bitcoinjs-lib
*/
ECFieldElementFp.prototype.getByteLength=function(){return Math.floor((this.toBigInteger().bitLength()+7)/8)};ECPointFp.prototype.getEncoded=function(c){var d=function(h,f){var g=h.toByteArrayUnsigned();if(fg.length){g.unshift(0)}}return g};var a=this.getX().toBigInteger();var e=this.getY().toBigInteger();var b=d(a,32);if(c){if(e.isEven()){b.unshift(2)}else{b.unshift(3)}}else{b.unshift(4);b=b.concat(d(e,32))}return b};ECPointFp.decodeFrom=function(g,c){var f=c[0];var e=c.length-1;var d=c.slice(1,1+e/2);var b=c.slice(1+e/2,1+e);d.unshift(0);b.unshift(0);var a=new BigInteger(d);var h=new BigInteger(b);return new ECPointFp(g,g.fromBigInteger(a),g.fromBigInteger(h))};ECPointFp.decodeFromHex=function(g,c){var f=c.substr(0,2);var e=c.length-2;var d=c.substr(2,e/2);var b=c.substr(2+e/2,e/2);var a=new BigInteger(d,16);var h=new BigInteger(b,16);return new ECPointFp(g,g.fromBigInteger(a),g.fromBigInteger(h))};ECPointFp.prototype.add2D=function(c){if(this.isInfinity()){return c}if(c.isInfinity()){return this}if(this.x.equals(c.x)){if(this.y.equals(c.y)){return this.twice()}return this.curve.getInfinity()}var g=c.x.subtract(this.x);var e=c.y.subtract(this.y);var a=e.divide(g);var d=a.square().subtract(this.x).subtract(c.x);var f=a.multiply(this.x.subtract(d)).subtract(this.y);return new ECPointFp(this.curve,d,f)};ECPointFp.prototype.twice2D=function(){if(this.isInfinity()){return this}if(this.y.toBigInteger().signum()==0){return this.curve.getInfinity()}var b=this.curve.fromBigInteger(BigInteger.valueOf(2));var e=this.curve.fromBigInteger(BigInteger.valueOf(3));var a=this.x.square().multiply(e).add(this.curve.a).divide(this.y.multiply(b));var c=a.square().subtract(this.x.multiply(b));var d=a.multiply(this.x.subtract(c)).subtract(this.y);return new ECPointFp(this.curve,c,d)};ECPointFp.prototype.multiply2D=function(b){if(this.isInfinity()){return this}if(b.signum()==0){return this.curve.getInfinity()}var g=b;var f=g.multiply(new BigInteger("3"));var l=this.negate();var d=this;var c;for(c=f.bitLength()-2;c>0;--c){d=d.twice();var a=f.testBit(c);var j=g.testBit(c);if(a!=j){d=d.add2D(a?this:l)}}return d};ECPointFp.prototype.isOnCurve=function(){var d=this.getX().toBigInteger();var i=this.getY().toBigInteger();var f=this.curve.getA().toBigInteger();var c=this.curve.getB().toBigInteger();var h=this.curve.getQ();var e=i.multiply(i).mod(h);var g=d.multiply(d).multiply(d).add(f.multiply(d)).add(c).mod(h);return e.equals(g)};ECPointFp.prototype.toString=function(){return"("+this.getX().toBigInteger().toString()+","+this.getY().toBigInteger().toString()+")"};ECPointFp.prototype.validate=function(){var c=this.curve.getQ();if(this.isInfinity()){throw new Error("Point is at infinity.")}var a=this.getX().toBigInteger();var b=this.getY().toBigInteger();if(a.compareTo(BigInteger.ONE)<0||a.compareTo(c.subtract(BigInteger.ONE))>0){throw new Error("x coordinate out of bounds")}if(b.compareTo(BigInteger.ONE)<0||b.compareTo(c.subtract(BigInteger.ONE))>0){throw new Error("y coordinate out of bounds")}if(!this.isOnCurve()){throw new Error("Point is not on the curve.")}if(this.multiply(c).isInfinity()){throw new Error("Point is not a scalar multiple of G.")}return true};
/*! asn1-1.0.9.js (c) 2013-2015 Kenji Urushima | kjur.github.com/jsrsasign/license
*/
if(typeof KJUR=="undefined"||!KJUR){KJUR={}}if(typeof KJUR.asn1=="undefined"||!KJUR.asn1){KJUR.asn1={}}KJUR.asn1.ASN1Util=new function(){this.integerToByteHex=function(a){var b=a.toString(16);if((b.length%2)==1){b="0"+b}return b};this.bigIntToMinTwosComplementsHex=function(j){var f=j.toString(16);if(f.substr(0,1)!="-"){if(f.length%2==1){f="0"+f}else{if(!f.match(/^[0-7]/)){f="00"+f}}}else{var a=f.substr(1);var e=a.length;if(e%2==1){e+=1}else{if(!f.match(/^[0-7]/)){e+=2}}var g="";for(var d=0;d15){throw"ASN.1 length too long to represent by 8x: n = "+i.toString(16)}var f=128+g;return f.toString(16)+h}};this.getEncodedHex=function(){if(this.hTLV==null||this.isModified){this.hV=this.getFreshValueHex();this.hL=this.getLengthHexFromValue();this.hTLV=this.hT+this.hL+this.hV;this.isModified=false}return this.hTLV};this.getValueHex=function(){this.getEncodedHex();return this.hV};this.getFreshValueHex=function(){return""}};KJUR.asn1.DERAbstractString=function(c){KJUR.asn1.DERAbstractString.superclass.constructor.call(this);var b=null;var a=null;this.getString=function(){return this.s};this.setString=function(d){this.hTLV=null;this.isModified=true;this.s=d;this.hV=stohex(this.s)};this.setStringHex=function(d){this.hTLV=null;this.isModified=true;this.s=null;this.hV=d};this.getFreshValueHex=function(){return this.hV};if(typeof c!="undefined"){if(typeof c=="string"){this.setString(c)}else{if(typeof c.str!="undefined"){this.setString(c.str)}else{if(typeof c.hex!="undefined"){this.setStringHex(c.hex)}}}}};YAHOO.lang.extend(KJUR.asn1.DERAbstractString,KJUR.asn1.ASN1Object);KJUR.asn1.DERAbstractTime=function(c){KJUR.asn1.DERAbstractTime.superclass.constructor.call(this);var b=null;var a=null;this.localDateToUTC=function(f){utc=f.getTime()+(f.getTimezoneOffset()*60000);var e=new Date(utc);return e};this.formatDate=function(m,o,e){var g=this.zeroPadding;var n=this.localDateToUTC(m);var p=String(n.getFullYear());if(o=="utc"){p=p.substr(2,2)}var l=g(String(n.getMonth()+1),2);var q=g(String(n.getDate()),2);var h=g(String(n.getHours()),2);var i=g(String(n.getMinutes()),2);var j=g(String(n.getSeconds()),2);var r=p+l+q+h+i+j;if(e===true){var f=n.getMilliseconds();if(f!=0){var k=g(String(f),3);k=k.replace(/[0]+$/,"");r=r+"."+k}}return r+"Z"};this.zeroPadding=function(e,d){if(e.length>=d){return e}return new Array(d-e.length+1).join("0")+e};this.getString=function(){return this.s};this.setString=function(d){this.hTLV=null;this.isModified=true;this.s=d;this.hV=stohex(d)};this.setByDateValue=function(h,j,e,d,f,g){var i=new Date(Date.UTC(h,j-1,e,d,f,g,0));this.setByDate(i)};this.getFreshValueHex=function(){return this.hV}};YAHOO.lang.extend(KJUR.asn1.DERAbstractTime,KJUR.asn1.ASN1Object);KJUR.asn1.DERAbstractStructured=function(b){KJUR.asn1.DERAbstractString.superclass.constructor.call(this);var a=null;this.setByASN1ObjectArray=function(c){this.hTLV=null;this.isModified=true;this.asn1Array=c};this.appendASN1Object=function(c){this.hTLV=null;this.isModified=true;this.asn1Array.push(c)};this.asn1Array=new Array();if(typeof b!="undefined"){if(typeof b.array!="undefined"){this.asn1Array=b.array}}};YAHOO.lang.extend(KJUR.asn1.DERAbstractStructured,KJUR.asn1.ASN1Object);KJUR.asn1.DERBoolean=function(){KJUR.asn1.DERBoolean.superclass.constructor.call(this);this.hT="01";this.hTLV="0101ff"};YAHOO.lang.extend(KJUR.asn1.DERBoolean,KJUR.asn1.ASN1Object);KJUR.asn1.DERInteger=function(a){KJUR.asn1.DERInteger.superclass.constructor.call(this);this.hT="02";this.setByBigInteger=function(b){this.hTLV=null;this.isModified=true;this.hV=KJUR.asn1.ASN1Util.bigIntToMinTwosComplementsHex(b)};this.setByInteger=function(c){var b=new BigInteger(String(c),10);this.setByBigInteger(b)};this.setValueHex=function(b){this.hV=b};this.getFreshValueHex=function(){return this.hV};if(typeof a!="undefined"){if(typeof a.bigint!="undefined"){this.setByBigInteger(a.bigint)}else{if(typeof a["int"]!="undefined"){this.setByInteger(a["int"])}else{if(typeof a=="number"){this.setByInteger(a)}else{if(typeof a.hex!="undefined"){this.setValueHex(a.hex)}}}}}};YAHOO.lang.extend(KJUR.asn1.DERInteger,KJUR.asn1.ASN1Object);KJUR.asn1.DERBitString=function(a){KJUR.asn1.DERBitString.superclass.constructor.call(this);this.hT="03";this.setHexValueIncludingUnusedBits=function(b){this.hTLV=null;this.isModified=true;this.hV=b};this.setUnusedBitsAndHexValue=function(b,d){if(b<0||7=(b*2))){break}if(d>=200){break}c.push(e);g=e;d++}return c};this.getNthChildIndex_AtObj=function(d,b,e){var c=this.getPosArrayOfChildren_AtObj(d,b);return c[e]};this.getDecendantIndexByNthList=function(e,d,c){if(c.length==0){return d}var f=c.shift();var b=this.getPosArrayOfChildren_AtObj(e,d);return this.getDecendantIndexByNthList(e,b[f],c)};this.getDecendantHexTLVByNthList=function(d,c,b){var a=this.getDecendantIndexByNthList(d,c,b);return this.getHexOfTLV_AtObj(d,a)};this.getDecendantHexVByNthList=function(d,c,b){var a=this.getDecendantIndexByNthList(d,c,b);return this.getHexOfV_AtObj(d,a)}};ASN1HEX.getVbyList=function(d,c,b,e){var a=this.getDecendantIndexByNthList(d,c,b);if(a===undefined){throw"can't find nthList object"}if(e!==undefined){if(d.substr(a,2)!=e){throw"checking tag doesn't match: "+d.substr(a,2)+"!="+e}}return this.getHexOfV_AtObj(d,a)};ASN1HEX.hextooidstr=function(e){var h=function(b,a){if(b.length>=a){return b}return new Array(a-b.length+1).join("0")+b};var l=[];var o=e.substr(0,2);var f=parseInt(o,16);l[0]=new String(Math.floor(f/40));l[1]=new String(f%40);var m=e.substr(2);var k=[];for(var g=0;g0){n=n+"."+j.join(".")}return n};ASN1HEX.dump=function(e,c,k,g){var o=function(w,i){if(w.length<=i*2){return w}else{var v=w.substr(0,i)+"..(total "+w.length/2+"bytes).."+w.substr(w.length-i,i);return v}};if(c===undefined){c={ommit_long_octet:32}}if(k===undefined){k=0}if(g===undefined){g=""}var r=c.ommit_long_octet;if(e.substr(k,2)=="01"){var h=ASN1HEX.getHexOfV_AtObj(e,k);if(h=="00"){return g+"BOOLEAN FALSE\n"}else{return g+"BOOLEAN TRUE\n"}}if(e.substr(k,2)=="02"){var h=ASN1HEX.getHexOfV_AtObj(e,k);return g+"INTEGER "+o(h,r)+"\n"}if(e.substr(k,2)=="03"){var h=ASN1HEX.getHexOfV_AtObj(e,k);return g+"BITSTRING "+o(h,r)+"\n"}if(e.substr(k,2)=="04"){var h=ASN1HEX.getHexOfV_AtObj(e,k);if(ASN1HEX.isASN1HEX(h)){var j=g+"OCTETSTRING, encapsulates\n";j=j+ASN1HEX.dump(h,c,0,g+" ");return j}else{return g+"OCTETSTRING "+o(h,r)+"\n"}}if(e.substr(k,2)=="05"){return g+"NULL\n"}if(e.substr(k,2)=="06"){var l=ASN1HEX.getHexOfV_AtObj(e,k);var a=KJUR.asn1.ASN1Util.oidHexToInt(l);var n=KJUR.asn1.x509.OID.oid2name(a);var b=a.replace(/\./g," ");if(n!=""){return g+"ObjectIdentifier "+n+" ("+b+")\n"}else{return g+"ObjectIdentifier ("+b+")\n"}}if(e.substr(k,2)=="0c"){return g+"UTF8String '"+hextoutf8(ASN1HEX.getHexOfV_AtObj(e,k))+"'\n"}if(e.substr(k,2)=="13"){return g+"PrintableString '"+hextoutf8(ASN1HEX.getHexOfV_AtObj(e,k))+"'\n"}if(e.substr(k,2)=="14"){return g+"TeletexString '"+hextoutf8(ASN1HEX.getHexOfV_AtObj(e,k))+"'\n"}if(e.substr(k,2)=="16"){return g+"IA5String '"+hextoutf8(ASN1HEX.getHexOfV_AtObj(e,k))+"'\n"}if(e.substr(k,2)=="17"){return g+"UTCTime "+hextoutf8(ASN1HEX.getHexOfV_AtObj(e,k))+"\n"}if(e.substr(k,2)=="18"){return g+"GeneralizedTime "+hextoutf8(ASN1HEX.getHexOfV_AtObj(e,k))+"\n"}if(e.substr(k,2)=="30"){if(e.substr(k,4)=="3000"){return g+"SEQUENCE {}\n"}var j=g+"SEQUENCE\n";var d=ASN1HEX.getPosArrayOfChildren_AtObj(e,k);var f=c;if((d.length==2||d.length==3)&&e.substr(d[0],2)=="06"&&e.substr(d[d.length-1],2)=="04"){var t=ASN1HEX.getHexOfV_AtObj(e,d[0]);var a=KJUR.asn1.ASN1Util.oidHexToInt(t);var n=KJUR.asn1.x509.OID.oid2name(a);var p=JSON.parse(JSON.stringify(c));p.x509ExtName=n;f=p}for(var q=0;q0){var d=new KJUR.asn1.DERSequence({array:this.extensionsArray});var b=new KJUR.asn1.DERTaggedObject({explicit:true,tag:"a3",obj:d});this.asn1Array.push(b)}var e=new KJUR.asn1.DERSequence({array:this.asn1Array});this.hTLV=e.getEncodedHex();this.isModified=false;return this.hTLV};this._initialize()};YAHOO.lang.extend(KJUR.asn1.x509.TBSCertificate,KJUR.asn1.ASN1Object);KJUR.asn1.x509.Extension=function(b){KJUR.asn1.x509.Extension.superclass.constructor.call(this);var a=null;this.getEncodedHex=function(){var f=new KJUR.asn1.DERObjectIdentifier({oid:this.oid});var e=new KJUR.asn1.DEROctetString({hex:this.getExtnValueHex()});var d=new Array();d.push(f);if(this.critical){d.push(new KJUR.asn1.DERBoolean())}d.push(e);var c=new KJUR.asn1.DERSequence({array:d});return c.getEncodedHex()};this.critical=false;if(typeof b!="undefined"){if(typeof b.critical!="undefined"){this.critical=b.critical}}};YAHOO.lang.extend(KJUR.asn1.x509.Extension,KJUR.asn1.ASN1Object);KJUR.asn1.x509.KeyUsage=function(a){KJUR.asn1.x509.KeyUsage.superclass.constructor.call(this,a);this.getExtnValueHex=function(){return this.asn1ExtnValue.getEncodedHex()};this.oid="2.5.29.15";if(typeof a!="undefined"){if(typeof a.bin!="undefined"){this.asn1ExtnValue=new KJUR.asn1.DERBitString(a)}}};YAHOO.lang.extend(KJUR.asn1.x509.KeyUsage,KJUR.asn1.x509.Extension);KJUR.asn1.x509.BasicConstraints=function(c){KJUR.asn1.x509.BasicConstraints.superclass.constructor.call(this,c);var a=false;var b=-1;this.getExtnValueHex=function(){var e=new Array();if(this.cA){e.push(new KJUR.asn1.DERBoolean())}if(this.pathLen>-1){e.push(new KJUR.asn1.DERInteger({"int":this.pathLen}))}var d=new KJUR.asn1.DERSequence({array:e});this.asn1ExtnValue=d;return this.asn1ExtnValue.getEncodedHex()};this.oid="2.5.29.19";this.cA=false;this.pathLen=-1;if(typeof c!="undefined"){if(typeof c.cA!="undefined"){this.cA=c.cA}if(typeof c.pathLen!="undefined"){this.pathLen=c.pathLen}}};YAHOO.lang.extend(KJUR.asn1.x509.BasicConstraints,KJUR.asn1.x509.Extension);KJUR.asn1.x509.CRLDistributionPoints=function(a){KJUR.asn1.x509.CRLDistributionPoints.superclass.constructor.call(this,a);this.getExtnValueHex=function(){return this.asn1ExtnValue.getEncodedHex()};this.setByDPArray=function(b){this.asn1ExtnValue=new KJUR.asn1.DERSequence({array:b})};this.setByOneURI=function(e){var b=new KJUR.asn1.x509.GeneralNames([{uri:e}]);var d=new KJUR.asn1.x509.DistributionPointName(b);var c=new KJUR.asn1.x509.DistributionPoint({dpobj:d});this.setByDPArray([c])};this.oid="2.5.29.31";if(typeof a!="undefined"){if(typeof a.array!="undefined"){this.setByDPArray(a.array)}else{if(typeof a.uri!="undefined"){this.setByOneURI(a.uri)}}}};YAHOO.lang.extend(KJUR.asn1.x509.CRLDistributionPoints,KJUR.asn1.x509.Extension);KJUR.asn1.x509.ExtKeyUsage=function(a){KJUR.asn1.x509.ExtKeyUsage.superclass.constructor.call(this,a);this.setPurposeArray=function(b){this.asn1ExtnValue=new KJUR.asn1.DERSequence();for(var c=0;c0){var c=new KJUR.asn1.DERSequence({array:this.aRevokedCert});this.asn1Array.push(c)}var d=new KJUR.asn1.DERSequence({array:this.asn1Array});this.hTLV=d.getEncodedHex();this.isModified=false;return this.hTLV};this._initialize=function(){this.asn1Version=null;this.asn1SignatureAlg=null;this.asn1Issuer=null;this.asn1ThisUpdate=null;this.asn1NextUpdate=null;this.aRevokedCert=new Array()};this._initialize()};YAHOO.lang.extend(KJUR.asn1.x509.TBSCertList,KJUR.asn1.ASN1Object);KJUR.asn1.x509.CRLEntry=function(c){KJUR.asn1.x509.CRLEntry.superclass.constructor.call(this);var b=null;var a=null;this.setCertSerial=function(d){this.sn=new KJUR.asn1.DERInteger(d)};this.setRevocationDate=function(d){this.time=new KJUR.asn1.x509.Time(d)};this.getEncodedHex=function(){var d=new KJUR.asn1.DERSequence({array:[this.sn,this.time]});this.TLV=d.getEncodedHex();return this.TLV};if(typeof c!="undefined"){if(typeof c.time!="undefined"){this.setRevocationDate(c.time)}if(typeof c.sn!="undefined"){this.setCertSerial(c.sn)}}};YAHOO.lang.extend(KJUR.asn1.x509.CRLEntry,KJUR.asn1.ASN1Object);KJUR.asn1.x509.X500Name=function(b){KJUR.asn1.x509.X500Name.superclass.constructor.call(this);this.asn1Array=new Array();this.setByString=function(c){var d=c.split("/");d.shift();for(var e=0;e0){h=new a.DERTaggedObject({obj:this.dUnsignedAttrs,tag:"a1",explicit:false})}var g=[this.dCMSVersion,this.dSignerIdentifier,this.dDigestAlgorithm,e,this.dSigAlg,this.dSig,];if(h!=null){g.push(h)}var f=new a.DERSequence({array:g});this.hTLV=f.getEncodedHex();return this.hTLV}};YAHOO.lang.extend(KJUR.asn1.cms.SignerInfo,KJUR.asn1.ASN1Object);KJUR.asn1.cms.EncapsulatedContentInfo=function(c){KJUR.asn1.cms.EncapsulatedContentInfo.superclass.constructor.call(this);var a=KJUR.asn1;var b=KJUR.asn1.cms;var d=KJUR.asn1.x509;this.dEContentType=new a.DERObjectIdentifier({name:"data"});this.dEContent=null;this.isDetached=false;this.eContentValueHex=null;this.setContentType=function(e){if(e.match(/^[0-2][.][0-9.]+$/)){this.dEContentType=new a.DERObjectIdentifier({oid:e})}else{this.dEContentType=new a.DERObjectIdentifier({name:e})}};this.setContentValue=function(e){if(typeof e!="undefined"){if(typeof e.hex=="string"){this.eContentValueHex=e.hex}else{if(typeof e.str=="string"){this.eContentValueHex=utf8tohex(e.str)}}}};this.setContentValueHex=function(e){this.eContentValueHex=e};this.setContentValueStr=function(e){this.eContentValueHex=utf8tohex(e)};this.getEncodedHex=function(){if(typeof this.eContentValueHex!="string"){throw"eContentValue not yet set"}var g=new a.DEROctetString({hex:this.eContentValueHex});this.dEContent=new a.DERTaggedObject({obj:g,tag:"a0",explicit:true});var e=[this.dEContentType];if(!this.isDetached){e.push(this.dEContent)}var f=new a.DERSequence({array:e});this.hTLV=f.getEncodedHex();return this.hTLV}};YAHOO.lang.extend(KJUR.asn1.cms.EncapsulatedContentInfo,KJUR.asn1.ASN1Object);KJUR.asn1.cms.ContentInfo=function(c){KJUR.asn1.cms.ContentInfo.superclass.constructor.call(this);var a=KJUR.asn1;var b=KJUR.asn1.cms;var d=KJUR.asn1.x509;this.dContentType=null;this.dContent=null;this.setContentType=function(e){if(typeof e=="string"){this.dContentType=d.OID.name2obj(e)}};this.getEncodedHex=function(){var f=new a.DERTaggedObject({obj:this.dContent,tag:"a0",explicit:true});var e=new a.DERSequence({array:[this.dContentType,f]});this.hTLV=e.getEncodedHex();return this.hTLV};if(typeof c!="undefined"){if(c.type){this.setContentType(c.type)}if(c.obj&&c.obj instanceof a.ASN1Object){this.dContent=c.obj}}};YAHOO.lang.extend(KJUR.asn1.cms.ContentInfo,KJUR.asn1.ASN1Object);KJUR.asn1.cms.SignedData=function(c){KJUR.asn1.cms.SignedData.superclass.constructor.call(this);var a=KJUR.asn1;var b=KJUR.asn1.cms;var d=KJUR.asn1.x509;this.dCMSVersion=new a.DERInteger({"int":1});this.dDigestAlgs=null;this.digestAlgNameList=[];this.dEncapContentInfo=new b.EncapsulatedContentInfo();this.dCerts=null;this.certificateList=[];this.crlList=[];this.signerInfoList=[new b.SignerInfo()];this.addCertificatesByPEM=function(e){var f=KEYUTIL.getHexFromPEM(e);var g=new a.ASN1Object();g.hTLV=f;this.certificateList.push(g)};this.getEncodedHex=function(){if(typeof this.hTLV=="string"){return this.hTLV}if(this.dDigestAlgs==null){var k=[];for(var j=0;j0){var l=new a.DERSet({array:this.certificateList});this.dCerts=new a.DERTaggedObject({obj:l,tag:"a0",explicit:false})}}if(this.dCerts!=null){e.push(this.dCerts)}var g=new a.DERSet({array:this.signerInfoList});e.push(g);var f=new a.DERSequence({array:e});this.hTLV=f.getEncodedHex();return this.hTLV};this.getContentInfo=function(){this.getEncodedHex();var e=new b.ContentInfo({type:"signed-data",obj:this});return e};this.getContentInfoEncodedHex=function(){var e=this.getContentInfo();var f=e.getEncodedHex();return f};this.getPEM=function(){var e=this.getContentInfoEncodedHex();var f=a.ASN1Util.getPEMStringFromHex(e,"CMS");return f}};YAHOO.lang.extend(KJUR.asn1.cms.SignedData,KJUR.asn1.ASN1Object);KJUR.asn1.cms.CMSUtil=new function(){};KJUR.asn1.cms.CMSUtil.newSignedData=function(a){var h=KJUR.asn1.cms;var g=KJUR.asn1.cades;var f=new h.SignedData();f.dEncapContentInfo.setContentValue(a.content);if(typeof a.certs=="object"){for(var b=0;ba.length){d=a.length}for(var b=0;bd){throw"key is too short for SigAlg: keylen="+j+","+a}var b="0001";var k="00"+c;var g="";var l=d-b.length-k.length;for(var f=0;f=0;--p){q=q.twice2D();q.z=BigInteger.ONE;if(o.testBit(p)){if(n.testBit(p)){q=q.add2D(t)}else{q=q.add2D(s)}}else{if(n.testBit(p)){q=q.add2D(r)}}}return q}this.getBigRandom=function(i){return new BigInteger(i.bitLength(),a).mod(i.subtract(BigInteger.ONE)).add(BigInteger.ONE)};this.setNamedCurve=function(i){this.ecparams=KJUR.crypto.ECParameterDB.getByName(i);this.prvKeyHex=null;this.pubKeyHex=null;this.curveName=i};this.setPrivateKeyHex=function(i){this.isPrivate=true;this.prvKeyHex=i};this.setPublicKeyHex=function(i){this.isPublic=true;this.pubKeyHex=i};this.generateKeyPairHex=function(){var k=this.ecparams.n;var n=this.getBigRandom(k);var l=this.ecparams.G.multiply(n);var q=l.getX().toBigInteger();var o=l.getY().toBigInteger();var i=this.ecparams.keylen/4;var m=("0000000000"+n.toString(16)).slice(-i);var r=("0000000000"+q.toString(16)).slice(-i);var p=("0000000000"+o.toString(16)).slice(-i);var j="04"+r+p;this.setPrivateKeyHex(m);this.setPublicKeyHex(j);return{ecprvhex:m,ecpubhex:j}};this.signWithMessageHash=function(i){return this.signHex(i,this.prvKeyHex)};this.signHex=function(o,j){var t=new BigInteger(j,16);var l=this.ecparams.n;var q=new BigInteger(o,16);do{var m=this.getBigRandom(l);var u=this.ecparams.G;var p=u.multiply(m);var i=p.getX().toBigInteger().mod(l)}while(i.compareTo(BigInteger.ZERO)<=0);var v=m.modInverse(l).multiply(q.add(t.multiply(i))).mod(l);return KJUR.crypto.ECDSA.biRSSigToASN1Sig(i,v)};this.sign=function(m,u){var q=u;var j=this.ecparams.n;var p=BigInteger.fromByteArrayUnsigned(m);do{var l=this.getBigRandom(j);var t=this.ecparams.G;var o=t.multiply(l);var i=o.getX().toBigInteger().mod(j)}while(i.compareTo(BigInteger.ZERO)<=0);var v=l.modInverse(j).multiply(p.add(q.multiply(i))).mod(j);return this.serializeSig(i,v)};this.verifyWithMessageHash=function(j,i){return this.verifyHex(j,i,this.pubKeyHex)};this.verifyHex=function(m,i,p){var l,j;var o=KJUR.crypto.ECDSA.parseSigHex(i);l=o.r;j=o.s;var k;k=ECPointFp.decodeFromHex(this.ecparams.curve,p);var n=new BigInteger(m,16);return this.verifyRaw(n,l,j,k)};this.verify=function(o,p,j){var l,i;if(Bitcoin.Util.isArray(p)){var n=this.parseSig(p);l=n.r;i=n.s}else{if("object"===typeof p&&p.r&&p.s){l=p.r;i=p.s}else{throw"Invalid value for signature"}}var k;if(j instanceof ECPointFp){k=j}else{if(Bitcoin.Util.isArray(j)){k=ECPointFp.decodeFrom(this.ecparams.curve,j)}else{throw"Invalid format for pubkey value, must be byte array or ECPointFp"}}var m=BigInteger.fromByteArrayUnsigned(o);return this.verifyRaw(m,l,i,k)};this.verifyRaw=function(o,i,w,m){var l=this.ecparams.n;var u=this.ecparams.G;if(i.compareTo(BigInteger.ONE)<0||i.compareTo(l)>=0){return false}if(w.compareTo(BigInteger.ONE)<0||w.compareTo(l)>=0){return false}var p=w.modInverse(l);var k=o.multiply(p).mod(l);var j=i.multiply(p).mod(l);var q=u.multiply(k).add(m.multiply(j));var t=q.getX().toBigInteger().mod(l);return t.equals(i)};this.serializeSig=function(k,j){var l=k.toByteArraySigned();var i=j.toByteArraySigned();var m=[];m.push(2);m.push(l.length);m=m.concat(l);m.push(2);m.push(i.length);m=m.concat(i);m.unshift(m.length);m.unshift(48);return m};this.parseSig=function(n){var m;if(n[0]!=48){throw new Error("Signature not a valid DERSequence")}m=2;if(n[m]!=2){throw new Error("First element in signature must be a DERInteger")}var l=n.slice(m+2,m+2+n[m+1]);m+=2+n[m+1];if(n[m]!=2){throw new Error("Second element in signature must be a DERInteger")}var i=n.slice(m+2,m+2+n[m+1]);m+=2+n[m+1];var k=BigInteger.fromByteArrayUnsigned(l);var j=BigInteger.fromByteArrayUnsigned(i);return{r:k,s:j}};this.parseSigCompact=function(m){if(m.length!==65){throw"Signature has the wrong length"}var j=m[0]-27;if(j<0||j>7){throw"Invalid signature type"}var o=this.ecparams.n;var l=BigInteger.fromByteArrayUnsigned(m.slice(1,33)).mod(o);var k=BigInteger.fromByteArrayUnsigned(m.slice(33,65)).mod(o);return{r:l,s:k,i:j}};if(h!==undefined){if(h.curve!==undefined){this.curveName=h.curve}}if(this.curveName===undefined){this.curveName=e}this.setNamedCurve(this.curveName);if(h!==undefined){if(h.prv!==undefined){this.setPrivateKeyHex(h.prv)}if(h.pub!==undefined){this.setPublicKeyHex(h.pub)}}};KJUR.crypto.ECDSA.parseSigHex=function(a){var b=KJUR.crypto.ECDSA.parseSigHexInHexRS(a);var d=new BigInteger(b.r,16);var c=new BigInteger(b.s,16);return{r:d,s:c}};KJUR.crypto.ECDSA.parseSigHexInHexRS=function(c){if(c.substr(0,2)!="30"){throw"signature is not a ASN.1 sequence"}var b=ASN1HEX.getPosArrayOfChildren_AtObj(c,0);if(b.length!=2){throw"number of signature ASN.1 sequence elements seem wrong"}var g=b[0];var f=b[1];if(c.substr(g,2)!="02"){throw"1st item of sequene of signature is not ASN.1 integer"}if(c.substr(f,2)!="02"){throw"2nd item of sequene of signature is not ASN.1 integer"}var e=ASN1HEX.getHexOfV_AtObj(c,g);var d=ASN1HEX.getHexOfV_AtObj(c,f);return{r:e,s:d}};KJUR.crypto.ECDSA.asn1SigToConcatSig=function(c){var d=KJUR.crypto.ECDSA.parseSigHexInHexRS(c);var b=d.r;var a=d.s;if(b.substr(0,2)=="00"&&(((b.length/2)*8)%(16*8))==8){b=b.substr(2)}if(a.substr(0,2)=="00"&&(((a.length/2)*8)%(16*8))==8){a=a.substr(2)}if((((b.length/2)*8)%(16*8))!=0){throw"unknown ECDSA sig r length error"}if((((a.length/2)*8)%(16*8))!=0){throw"unknown ECDSA sig s length error"}return b+a};KJUR.crypto.ECDSA.concatSigToASN1Sig=function(a){if((((a.length/2)*8)%(16*8))!=0){throw"unknown ECDSA concatinated r-s sig length error"}var c=a.substr(0,a.length/2);var b=a.substr(a.length/2);return KJUR.crypto.ECDSA.hexRSSigToASN1Sig(c,b)};KJUR.crypto.ECDSA.hexRSSigToASN1Sig=function(b,a){var d=new BigInteger(b,16);var c=new BigInteger(a,16);return KJUR.crypto.ECDSA.biRSSigToASN1Sig(d,c)};KJUR.crypto.ECDSA.biRSSigToASN1Sig=function(e,c){var b=new KJUR.asn1.DERInteger({bigint:e});var a=new KJUR.asn1.DERInteger({bigint:c});var d=new KJUR.asn1.DERSequence({array:[b,a]});return d.getEncodedHex()};
/*! ecparam-1.0.0.js (c) 2013 Kenji Urushima | kjur.github.com/jsrsasign/license
*/
if(typeof KJUR=="undefined"||!KJUR){KJUR={}}if(typeof KJUR.crypto=="undefined"||!KJUR.crypto){KJUR.crypto={}}KJUR.crypto.ECParameterDB=new function(){var b={};var c={};function a(d){return new BigInteger(d,16)}this.getByName=function(e){var d=e;if(typeof c[d]!="undefined"){d=c[e]}if(typeof b[d]!="undefined"){return b[d]}throw"unregistered EC curve name: "+d};this.regist=function(A,l,o,g,m,e,j,f,k,u,d,x){b[A]={};var s=a(o);var z=a(g);var y=a(m);var t=a(e);var w=a(j);var r=new ECCurveFp(s,z,y);var q=r.decodePointHex("04"+f+k);b[A]["name"]=A;b[A]["keylen"]=l;b[A]["curve"]=r;b[A]["G"]=q;b[A]["n"]=t;b[A]["h"]=w;b[A]["oid"]=d;b[A]["info"]=x;for(var v=0;v0||K.compareTo(u)>0||BigInteger.ZERO.compareTo(J)>0||J.compareTo(u)>0){throw"invalid DSA signature"}var I=J.modInverse(u);var A=D.multiply(I).mod(u);var v=K.multiply(I).mod(u);var F=G.modPow(A,z).multiply(H.modPow(v,z)).mod(z).mod(u);return F.compareTo(K)==0};this.parseASN1Signature=function(u){try{var y=new BigInteger(ASN1HEX.getVbyList(u,0,[0],"02"),16);var v=new BigInteger(ASN1HEX.getVbyList(u,0,[1],"02"),16);return[y,v]}catch(w){throw"malformed DSA signature"}};function d(E,w,B,v,u,C){var z=KJUR.crypto.Util.hashString(w,E.toLowerCase());var z=z.substr(0,u.bitLength()/4);var A=new BigInteger(z,16);var y=n(BigInteger.ONE.add(BigInteger.ONE),u.subtract(BigInteger.ONE));var F=(B.modPow(y,v)).mod(u);var D=(y.modInverse(u).multiply(A.add(C.multiply(F)))).mod(u);var G=new Array();G[0]=F;G[1]=D;return G}function r(v){var u=openpgp.config.config.prefer_hash_algorithm;switch(Math.round(v.bitLength()/8)){case 20:if(u!=2&&u>11&&u!=10&&u<8){return 2}return u;case 28:if(u>11&&u<8){return 11}return u;case 32:if(u>10&&u<8){return 8}return u;default:util.print_debug("DSA select hash algorithm: returning null for an unknown length of q");return null}}this.select_hash_algorithm=r;function m(I,K,J,B,z,u,F,G){var C=KJUR.crypto.Util.hashString(B,I.toLowerCase());var C=C.substr(0,u.bitLength()/4);var D=new BigInteger(C,16);if(BigInteger.ZERO.compareTo(K)>0||K.compareTo(u)>0||BigInteger.ZERO.compareTo(J)>0||J.compareTo(u)>0){util.print_error("invalid DSA Signature");return null}var H=J.modInverse(u);var A=D.multiply(H).mod(u);var v=K.multiply(H).mod(u);var E=F.modPow(A,z).multiply(G.modPow(v,z)).mod(z).mod(u);return E.compareTo(K)==0}function a(z){var A=new BigInteger(z,primeCenterie);var y=j(q,512);var u=t(p,q,z);var v;do{v=new BigInteger(q.bitCount(),rand)}while(x.compareTo(BigInteger.ZERO)!=1&&x.compareTo(q)!=-1);var w=g.modPow(x,p);return{x:v,q:A,p:y,g:u,y:w}}function j(y,z,w){if(z%64!=0){return false}var u;var v;do{u=w(bitcount,true);v=u.subtract(BigInteger.ONE);u=u.subtract(v.remainder(y))}while(!u.isProbablePrime(primeCenterie)||u.bitLength()!=l);return u}function t(B,z,A,w){var u=B.subtract(BigInteger.ONE);var y=u.divide(z);var v;do{v=w(A)}while(v.compareTo(u)!=-1&&v.compareTo(BigInteger.ONE)!=1);return v.modPow(y,B)}function o(w,y,u){var v;do{v=u(y,false)}while(v.compareTo(w)!=-1&&v.compareTo(BigInteger.ZERO)!=1);return v}function i(v,w){k=o(v);var u=g.modPow(k,w).mod(v);return u}function h(B,w,y,v,z,u){var A=B(v);s=(w.modInverse(z).multiply(A.add(u.multiply(y)))).mod(z);return s}this.sign=d;this.verify=m;function n(w,u){if(u.compareTo(w)<=0){return}var v=u.subtract(w);var y=e(v.bitLength());while(y>v){y=e(v.bitLength())}return w.add(y)}function e(w){if(w<0){return null}var u=Math.floor((w+7)/8);var v=c(u);if(w%8>0){v=String.fromCharCode((Math.pow(2,w%8)-1)&v.charCodeAt(0))+v.substring(1)}return new BigInteger(f(v),16)}function c(w){var u="";for(var v=0;v=s*2){break}}var x={};x.keyhex=v.substr(0,g[o]["keylen"]*2);x.ivhex=v.substr(g[o]["keylen"]*2,g[o]["ivlen"]*2);return x};var a=function(n,t,p,u){var q=CryptoJS.enc.Base64.parse(n);var o=CryptoJS.enc.Hex.stringify(q);var s=g[t]["proc"];var r=s(o,p,u);return r};var f=function(n,q,o,s){var p=g[q]["eproc"];var r=p(n,o,s);return r};return{version:"1.0.5",getHexFromPEM:function(o,r){var p=o;if(p.indexOf("BEGIN "+r)==-1){throw"can't find PEM header: "+r}p=p.replace("-----BEGIN "+r+"-----","");p=p.replace("-----END "+r+"-----","");var q=p.replace(/\s+/g,"");var n=b64tohex(q);return n},getDecryptedKeyHexByKeyIV:function(o,r,q,p){var n=b(r);return n(o,q,p)},parsePKCS5PEM:function(n){return l(n)},getKeyAndUnusedIvByPasscodeAndIvsalt:function(o,n,p){return h(o,n,p)},decryptKeyB64:function(n,p,o,q){return a(n,p,o,q)},getDecryptedKeyHex:function(w,v){var o=l(w);var r=o.type;var p=o.cipher;var n=o.ivsalt;var q=o.data;var u=h(p,v,n);var t=u.keyhex;var s=a(q,p,t,n);return s},getRSAKeyFromEncryptedPKCS5PEM:function(p,o){var q=this.getDecryptedKeyHex(p,o);var n=new RSAKey();n.readPrivateKeyFromASN1HexString(q);return n},getEryptedPKCS5PEMFromPrvKeyHex:function(q,x,r,p){var n="";if(typeof r=="undefined"||r==null){r="AES-256-CBC"}if(typeof g[r]=="undefined"){throw"PKCS5PKEY unsupported algorithm: "+r}if(typeof p=="undefined"||p==null){var t=g[r]["ivlen"];var s=k(t);p=s.toUpperCase()}var w=h(r,x,p);var v=w.keyhex;var u=f(q,r,v,p);var o=u.replace(/(.{64})/g,"$1\r\n");var n="-----BEGIN RSA PRIVATE KEY-----\r\n";n+="Proc-Type: 4,ENCRYPTED\r\n";n+="DEK-Info: "+r+","+p+"\r\n";n+="\r\n";n+=o;n+="\r\n-----END RSA PRIVATE KEY-----\r\n";return n},getEryptedPKCS5PEMFromRSAKey:function(C,D,o,s){var A=new KJUR.asn1.DERInteger({"int":0});var v=new KJUR.asn1.DERInteger({bigint:C.n});var z=new KJUR.asn1.DERInteger({"int":C.e});var B=new KJUR.asn1.DERInteger({bigint:C.d});var t=new KJUR.asn1.DERInteger({bigint:C.p});var r=new KJUR.asn1.DERInteger({bigint:C.q});var y=new KJUR.asn1.DERInteger({bigint:C.dmp1});var u=new KJUR.asn1.DERInteger({bigint:C.dmq1});var x=new KJUR.asn1.DERInteger({bigint:C.coeff});var E=new KJUR.asn1.DERSequence({array:[A,v,z,B,t,r,y,u,x]});var w=E.getEncodedHex();return this.getEryptedPKCS5PEMFromPrvKeyHex(w,D,o,s)},newEncryptedPKCS5PEM:function(n,o,r,s){if(typeof o=="undefined"||o==null){o=1024}if(typeof r=="undefined"||r==null){r="10001"}var p=new RSAKey();p.generate(o,r);var q=null;if(typeof s=="undefined"||s==null){q=this.getEncryptedPKCS5PEMFromRSAKey(pkey,n)}else{q=this.getEncryptedPKCS5PEMFromRSAKey(pkey,n,s)}return q},getRSAKeyFromPlainPKCS8PEM:function(p){if(p.match(/ENCRYPTED/)){throw"pem shall be not ENCRYPTED"}var o=this.getHexFromPEM(p,"PRIVATE KEY");var n=this.getRSAKeyFromPlainPKCS8Hex(o);return n},getRSAKeyFromPlainPKCS8Hex:function(q){var p=ASN1HEX.getPosArrayOfChildren_AtObj(q,0);if(p.length!=3){throw"outer DERSequence shall have 3 elements: "+p.length}var o=ASN1HEX.getHexOfTLV_AtObj(q,p[1]);if(o!="300d06092a864886f70d0101010500"){throw"PKCS8 AlgorithmIdentifier is not rsaEnc: "+o}var o=ASN1HEX.getHexOfTLV_AtObj(q,p[1]);var r=ASN1HEX.getHexOfTLV_AtObj(q,p[2]);var s=ASN1HEX.getHexOfV_AtObj(r,0);var n=new RSAKey();n.readPrivateKeyFromASN1HexString(s);return n},parseHexOfEncryptedPKCS8:function(u){var q={};var p=ASN1HEX.getPosArrayOfChildren_AtObj(u,0);if(p.length!=2){throw"malformed format: SEQUENCE(0).items != 2: "+p.length}q.ciphertext=ASN1HEX.getHexOfV_AtObj(u,p[1]);var w=ASN1HEX.getPosArrayOfChildren_AtObj(u,p[0]);if(w.length!=2){throw"malformed format: SEQUENCE(0.0).items != 2: "+w.length}if(ASN1HEX.getHexOfV_AtObj(u,w[0])!="2a864886f70d01050d"){throw"this only supports pkcs5PBES2"}var n=ASN1HEX.getPosArrayOfChildren_AtObj(u,w[1]);if(w.length!=2){throw"malformed format: SEQUENCE(0.0.1).items != 2: "+n.length}var o=ASN1HEX.getPosArrayOfChildren_AtObj(u,n[1]);if(o.length!=2){throw"malformed format: SEQUENCE(0.0.1.1).items != 2: "+o.length}if(ASN1HEX.getHexOfV_AtObj(u,o[0])!="2a864886f70d0307"){throw"this only supports TripleDES"}q.encryptionSchemeAlg="TripleDES";q.encryptionSchemeIV=ASN1HEX.getHexOfV_AtObj(u,o[1]);var r=ASN1HEX.getPosArrayOfChildren_AtObj(u,n[0]);if(r.length!=2){throw"malformed format: SEQUENCE(0.0.1.0).items != 2: "+r.length}if(ASN1HEX.getHexOfV_AtObj(u,r[0])!="2a864886f70d01050c"){throw"this only supports pkcs5PBKDF2"}var v=ASN1HEX.getPosArrayOfChildren_AtObj(u,r[1]);if(v.length<2){throw"malformed format: SEQUENCE(0.0.1.0.1).items < 2: "+v.length}q.pbkdf2Salt=ASN1HEX.getHexOfV_AtObj(u,v[0]);var s=ASN1HEX.getHexOfV_AtObj(u,v[1]);try{q.pbkdf2Iter=parseInt(s,16)}catch(t){throw"malformed format pbkdf2Iter: "+s}return q},getPBKDF2KeyHexFromParam:function(s,n){var r=CryptoJS.enc.Hex.parse(s.pbkdf2Salt);var o=s.pbkdf2Iter;var q=CryptoJS.PBKDF2(n,r,{keySize:192/32,iterations:o});var p=CryptoJS.enc.Hex.stringify(q);return p},getPlainPKCS8HexFromEncryptedPKCS8PEM:function(v,w){var p=this.getHexFromPEM(v,"ENCRYPTED PRIVATE KEY");var n=this.parseHexOfEncryptedPKCS8(p);var s=PKCS5PKEY.getPBKDF2KeyHexFromParam(n,w);var t={};t.ciphertext=CryptoJS.enc.Hex.parse(n.ciphertext);var r=CryptoJS.enc.Hex.parse(s);var q=CryptoJS.enc.Hex.parse(n.encryptionSchemeIV);var u=CryptoJS.TripleDES.decrypt(t,r,{iv:q});var o=CryptoJS.enc.Hex.stringify(u);return o},getRSAKeyFromEncryptedPKCS8PEM:function(q,p){var o=this.getPlainPKCS8HexFromEncryptedPKCS8PEM(q,p);var n=this.getRSAKeyFromPlainPKCS8Hex(o);return n},getKeyFromEncryptedPKCS8PEM:function(q,o){var n=this.getPlainPKCS8HexFromEncryptedPKCS8PEM(q,o);var p=this.getKeyFromPlainPrivatePKCS8Hex(n);return p},parsePlainPrivatePKCS8Hex:function(q){var o={};o.algparam=null;if(q.substr(0,2)!="30"){throw"malformed plain PKCS8 private key(code:001)"}var p=ASN1HEX.getPosArrayOfChildren_AtObj(q,0);if(p.length!=3){throw"malformed plain PKCS8 private key(code:002)"}if(q.substr(p[1],2)!="30"){throw"malformed PKCS8 private key(code:003)"}var n=ASN1HEX.getPosArrayOfChildren_AtObj(q,p[1]);if(n.length!=2){throw"malformed PKCS8 private key(code:004)"}if(q.substr(n[0],2)!="06"){throw"malformed PKCS8 private key(code:005)"}o.algoid=ASN1HEX.getHexOfV_AtObj(q,n[0]);if(q.substr(n[1],2)=="06"){o.algparam=ASN1HEX.getHexOfV_AtObj(q,n[1])}if(q.substr(p[2],2)!="04"){throw"malformed PKCS8 private key(code:006)"}o.keyidx=ASN1HEX.getStartPosOfV_AtObj(q,p[2]);return o},getKeyFromPlainPrivatePKCS8PEM:function(o){var n=this.getHexFromPEM(o,"PRIVATE KEY");var p=this.getKeyFromPlainPrivatePKCS8Hex(n);return p},getKeyFromPlainPrivatePKCS8Hex:function(n){var p=this.parsePlainPrivatePKCS8Hex(n);if(p.algoid=="2a864886f70d010101"){this.parsePrivateRawRSAKeyHexAtObj(n,p);var o=p.key;var q=new RSAKey();q.setPrivateEx(o.n,o.e,o.d,o.p,o.q,o.dp,o.dq,o.co);return q}else{if(p.algoid=="2a8648ce3d0201"){this.parsePrivateRawECKeyHexAtObj(n,p);if(KJUR.crypto.OID.oidhex2name[p.algparam]===undefined){throw"KJUR.crypto.OID.oidhex2name undefined: "+p.algparam}var r=KJUR.crypto.OID.oidhex2name[p.algparam];var q=new KJUR.crypto.ECDSA({curve:r,prv:p.key});return q}else{throw"unsupported private key algorithm"}}},getRSAKeyFromPublicPKCS8PEM:function(o){var p=this.getHexFromPEM(o,"PUBLIC KEY");var n=this.getRSAKeyFromPublicPKCS8Hex(p);return n},getKeyFromPublicPKCS8PEM:function(o){var p=this.getHexFromPEM(o,"PUBLIC KEY");var n=this.getKeyFromPublicPKCS8Hex(p);return n},getKeyFromPublicPKCS8Hex:function(o){var n=this.parsePublicPKCS8Hex(o);if(n.algoid=="2a864886f70d010101"){var r=this.parsePublicRawRSAKeyHex(n.key);var p=new RSAKey();p.setPublic(r.n,r.e);return p}else{if(n.algoid=="2a8648ce3d0201"){if(KJUR.crypto.OID.oidhex2name[n.algparam]===undefined){throw"KJUR.crypto.OID.oidhex2name undefined: "+n.algparam}var q=KJUR.crypto.OID.oidhex2name[n.algparam];var p=new KJUR.crypto.ECDSA({curve:q,pub:n.key});return p}else{throw"unsupported public key algorithm"}}},parsePublicRawRSAKeyHex:function(p){var n={};if(p.substr(0,2)!="30"){throw"malformed RSA key(code:001)"}var o=ASN1HEX.getPosArrayOfChildren_AtObj(p,0);if(o.length!=2){throw"malformed RSA key(code:002)"}if(p.substr(o[0],2)!="02"){throw"malformed RSA key(code:003)"}n.n=ASN1HEX.getHexOfV_AtObj(p,o[0]);if(p.substr(o[1],2)!="02"){throw"malformed RSA key(code:004)"}n.e=ASN1HEX.getHexOfV_AtObj(p,o[1]);return n},parsePrivateRawRSAKeyHexAtObj:function(o,q){var p=q.keyidx;if(o.substr(p,2)!="30"){throw"malformed RSA private key(code:001)"}var n=ASN1HEX.getPosArrayOfChildren_AtObj(o,p);if(n.length!=9){throw"malformed RSA private key(code:002)"}q.key={};q.key.n=ASN1HEX.getHexOfV_AtObj(o,n[1]);q.key.e=ASN1HEX.getHexOfV_AtObj(o,n[2]);q.key.d=ASN1HEX.getHexOfV_AtObj(o,n[3]);q.key.p=ASN1HEX.getHexOfV_AtObj(o,n[4]);q.key.q=ASN1HEX.getHexOfV_AtObj(o,n[5]);q.key.dp=ASN1HEX.getHexOfV_AtObj(o,n[6]);q.key.dq=ASN1HEX.getHexOfV_AtObj(o,n[7]);q.key.co=ASN1HEX.getHexOfV_AtObj(o,n[8])},parsePrivateRawECKeyHexAtObj:function(o,q){var p=q.keyidx;if(o.substr(p,2)!="30"){throw"malformed ECC private key(code:001)"}var n=ASN1HEX.getPosArrayOfChildren_AtObj(o,p);if(n.length!=3){throw"malformed ECC private key(code:002)"}if(o.substr(n[1],2)!="04"){throw"malformed ECC private key(code:003)"}q.key=ASN1HEX.getHexOfV_AtObj(o,n[1])},parsePublicPKCS8Hex:function(q){var o={};o.algparam=null;var p=ASN1HEX.getPosArrayOfChildren_AtObj(q,0);if(p.length!=2){throw"outer DERSequence shall have 2 elements: "+p.length}var r=p[0];if(q.substr(r,2)!="30"){throw"malformed PKCS8 public key(code:001)"}var n=ASN1HEX.getPosArrayOfChildren_AtObj(q,r);if(n.length!=2){throw"malformed PKCS8 public key(code:002)"}if(q.substr(n[0],2)!="06"){throw"malformed PKCS8 public key(code:003)"}o.algoid=ASN1HEX.getHexOfV_AtObj(q,n[0]);if(q.substr(n[1],2)=="06"){o.algparam=ASN1HEX.getHexOfV_AtObj(q,n[1])}if(q.substr(p[1],2)!="03"){throw"malformed PKCS8 public key(code:004)"}o.key=ASN1HEX.getHexOfV_AtObj(q,p[1]).substr(2);return o},getRSAKeyFromPublicPKCS8Hex:function(r){var q=ASN1HEX.getPosArrayOfChildren_AtObj(r,0);if(q.length!=2){throw"outer DERSequence shall have 2 elements: "+q.length}var p=ASN1HEX.getHexOfTLV_AtObj(r,q[0]);if(p!="300d06092a864886f70d0101010500"){throw"PKCS8 AlgorithmId is not rsaEncryption"}if(r.substr(q[1],2)!="03"){throw"PKCS8 Public Key is not BITSTRING encapslated."}var t=ASN1HEX.getStartPosOfV_AtObj(r,q[1])+2;if(r.substr(t,2)!="30"){throw"PKCS8 Public Key is not SEQUENCE."}var n=ASN1HEX.getPosArrayOfChildren_AtObj(r,t);if(n.length!=2){throw"inner DERSequence shall have 2 elements: "+n.length}if(r.substr(n[0],2)!="02"){throw"N is not ASN.1 INTEGER"}if(r.substr(n[1],2)!="02"){throw"E is not ASN.1 INTEGER"}var u=ASN1HEX.getHexOfV_AtObj(r,n[0]);var s=ASN1HEX.getHexOfV_AtObj(r,n[1]);var o=new RSAKey();o.setPublic(u,s);return o},}}();
/*! keyutil-1.0.12.js (c) 2013-2015 Kenji Urushima | kjur.github.com/jsrsasign/license
*/
var KEYUTIL=function(){var d=function(p,r,q){return k(CryptoJS.AES,p,r,q)};var e=function(p,r,q){return k(CryptoJS.TripleDES,p,r,q)};var a=function(p,r,q){return k(CryptoJS.DES,p,r,q)};var k=function(s,x,u,q){var r=CryptoJS.enc.Hex.parse(x);var w=CryptoJS.enc.Hex.parse(u);var p=CryptoJS.enc.Hex.parse(q);var t={};t.key=w;t.iv=p;t.ciphertext=r;var v=s.decrypt(t,w,{iv:p});return CryptoJS.enc.Hex.stringify(v)};var l=function(p,r,q){return g(CryptoJS.AES,p,r,q)};var o=function(p,r,q){return g(CryptoJS.TripleDES,p,r,q)};var f=function(p,r,q){return g(CryptoJS.DES,p,r,q)};var g=function(t,y,v,q){var s=CryptoJS.enc.Hex.parse(y);var x=CryptoJS.enc.Hex.parse(v);var p=CryptoJS.enc.Hex.parse(q);var w=t.encrypt(s,x,{iv:p});var r=CryptoJS.enc.Hex.parse(w.toString());var u=CryptoJS.enc.Base64.stringify(r);return u};var i={"AES-256-CBC":{proc:d,eproc:l,keylen:32,ivlen:16},"AES-192-CBC":{proc:d,eproc:l,keylen:24,ivlen:16},"AES-128-CBC":{proc:d,eproc:l,keylen:16,ivlen:16},"DES-EDE3-CBC":{proc:e,eproc:o,keylen:24,ivlen:8},"DES-CBC":{proc:a,eproc:f,keylen:8,ivlen:8}};var c=function(p){return i[p]["proc"]};var m=function(p){var r=CryptoJS.lib.WordArray.random(p);var q=CryptoJS.enc.Hex.stringify(r);return q};var n=function(t){var u={};if(t.match(new RegExp("DEK-Info: ([^,]+),([0-9A-Fa-f]+)","m"))){u.cipher=RegExp.$1;u.ivsalt=RegExp.$2}if(t.match(new RegExp("-----BEGIN ([A-Z]+) PRIVATE KEY-----"))){u.type=RegExp.$1}var r=-1;var v=0;if(t.indexOf("\r\n\r\n")!=-1){r=t.indexOf("\r\n\r\n");v=2}if(t.indexOf("\n\n")!=-1){r=t.indexOf("\n\n");v=1}var q=t.indexOf("-----END");if(r!=-1&&q!=-1){var p=t.substring(r+v*2,q-v);p=p.replace(/\s+/g,"");u.data=p}return u};var j=function(q,y,p){var v=p.substring(0,16);var t=CryptoJS.enc.Hex.parse(v);var r=CryptoJS.enc.Utf8.parse(y);var u=i[q]["keylen"]+i[q]["ivlen"];var x="";var w=null;for(;;){var s=CryptoJS.algo.MD5.create();if(w!=null){s.update(w)}s.update(r);s.update(t);w=s.finalize();x=x+CryptoJS.enc.Hex.stringify(w);if(x.length>=u*2){break}}var z={};z.keyhex=x.substr(0,i[q]["keylen"]*2);z.ivhex=x.substr(i[q]["keylen"]*2,i[q]["ivlen"]*2);return z};var b=function(p,v,r,w){var s=CryptoJS.enc.Base64.parse(p);var q=CryptoJS.enc.Hex.stringify(s);var u=i[v]["proc"];var t=u(q,r,w);return t};var h=function(p,s,q,u){var r=i[s]["eproc"];var t=r(p,q,u);return t};return{version:"1.0.0",getHexFromPEM:function(q,u){var r=q;if(r.indexOf("-----BEGIN ")==-1){throw"can't find PEM header: "+u}if(typeof u=="string"&&u!=""){r=r.replace("-----BEGIN "+u+"-----","");r=r.replace("-----END "+u+"-----","")}else{r=r.replace(/-----BEGIN [^-]+-----/,"");r=r.replace(/-----END [^-]+-----/,"")}var t=r.replace(/\s+/g,"");var p=b64tohex(t);return p},getDecryptedKeyHexByKeyIV:function(q,t,s,r){var p=c(t);return p(q,s,r)},parsePKCS5PEM:function(p){return n(p)},getKeyAndUnusedIvByPasscodeAndIvsalt:function(q,p,r){return j(q,p,r)},decryptKeyB64:function(p,r,q,s){return b(p,r,q,s)},getDecryptedKeyHex:function(y,x){var q=n(y);var t=q.type;var r=q.cipher;var p=q.ivsalt;var s=q.data;var w=j(r,x,p);var v=w.keyhex;var u=b(s,r,v,p);return u},getRSAKeyFromEncryptedPKCS5PEM:function(r,q){var s=this.getDecryptedKeyHex(r,q);var p=new RSAKey();p.readPrivateKeyFromASN1HexString(s);return p},getEncryptedPKCS5PEMFromPrvKeyHex:function(x,s,A,t,r){var p="";if(typeof t=="undefined"||t==null){t="AES-256-CBC"}if(typeof i[t]=="undefined"){throw"KEYUTIL unsupported algorithm: "+t}if(typeof r=="undefined"||r==null){var v=i[t]["ivlen"];var u=m(v);r=u.toUpperCase()}var z=j(t,A,r);var y=z.keyhex;var w=h(s,t,y,r);var q=w.replace(/(.{64})/g,"$1\r\n");var p="-----BEGIN "+x+" PRIVATE KEY-----\r\n";p+="Proc-Type: 4,ENCRYPTED\r\n";p+="DEK-Info: "+t+","+r+"\r\n";p+="\r\n";p+=q;p+="\r\n-----END "+x+" PRIVATE KEY-----\r\n";return p},getEncryptedPKCS5PEMFromRSAKey:function(D,E,r,t){var B=new KJUR.asn1.DERInteger({"int":0});var w=new KJUR.asn1.DERInteger({bigint:D.n});var A=new KJUR.asn1.DERInteger({"int":D.e});var C=new KJUR.asn1.DERInteger({bigint:D.d});var u=new KJUR.asn1.DERInteger({bigint:D.p});var s=new KJUR.asn1.DERInteger({bigint:D.q});var z=new KJUR.asn1.DERInteger({bigint:D.dmp1});var v=new KJUR.asn1.DERInteger({bigint:D.dmq1});var y=new KJUR.asn1.DERInteger({bigint:D.coeff});var F=new KJUR.asn1.DERSequence({array:[B,w,A,C,u,s,z,v,y]});var x=F.getEncodedHex();return this.getEncryptedPKCS5PEMFromPrvKeyHex("RSA",x,E,r,t)},newEncryptedPKCS5PEM:function(p,q,t,u){if(typeof q=="undefined"||q==null){q=1024}if(typeof t=="undefined"||t==null){t="10001"}var r=new RSAKey();r.generate(q,t);var s=null;if(typeof u=="undefined"||u==null){s=this.getEncryptedPKCS5PEMFromRSAKey(r,p)}else{s=this.getEncryptedPKCS5PEMFromRSAKey(r,p,u)}return s},getRSAKeyFromPlainPKCS8PEM:function(r){if(r.match(/ENCRYPTED/)){throw"pem shall be not ENCRYPTED"}var q=this.getHexFromPEM(r,"PRIVATE KEY");var p=this.getRSAKeyFromPlainPKCS8Hex(q);return p},getRSAKeyFromPlainPKCS8Hex:function(s){var r=ASN1HEX.getPosArrayOfChildren_AtObj(s,0);if(r.length!=3){throw"outer DERSequence shall have 3 elements: "+r.length}var q=ASN1HEX.getHexOfTLV_AtObj(s,r[1]);if(q!="300d06092a864886f70d0101010500"){throw"PKCS8 AlgorithmIdentifier is not rsaEnc: "+q}var q=ASN1HEX.getHexOfTLV_AtObj(s,r[1]);var t=ASN1HEX.getHexOfTLV_AtObj(s,r[2]);var u=ASN1HEX.getHexOfV_AtObj(t,0);var p=new RSAKey();p.readPrivateKeyFromASN1HexString(u);return p},parseHexOfEncryptedPKCS8:function(w){var s={};var r=ASN1HEX.getPosArrayOfChildren_AtObj(w,0);if(r.length!=2){throw"malformed format: SEQUENCE(0).items != 2: "+r.length}s.ciphertext=ASN1HEX.getHexOfV_AtObj(w,r[1]);var y=ASN1HEX.getPosArrayOfChildren_AtObj(w,r[0]);if(y.length!=2){throw"malformed format: SEQUENCE(0.0).items != 2: "+y.length}if(ASN1HEX.getHexOfV_AtObj(w,y[0])!="2a864886f70d01050d"){throw"this only supports pkcs5PBES2"}var p=ASN1HEX.getPosArrayOfChildren_AtObj(w,y[1]);if(y.length!=2){throw"malformed format: SEQUENCE(0.0.1).items != 2: "+p.length}var q=ASN1HEX.getPosArrayOfChildren_AtObj(w,p[1]);if(q.length!=2){throw"malformed format: SEQUENCE(0.0.1.1).items != 2: "+q.length}if(ASN1HEX.getHexOfV_AtObj(w,q[0])!="2a864886f70d0307"){throw"this only supports TripleDES"}s.encryptionSchemeAlg="TripleDES";s.encryptionSchemeIV=ASN1HEX.getHexOfV_AtObj(w,q[1]);var t=ASN1HEX.getPosArrayOfChildren_AtObj(w,p[0]);if(t.length!=2){throw"malformed format: SEQUENCE(0.0.1.0).items != 2: "+t.length}if(ASN1HEX.getHexOfV_AtObj(w,t[0])!="2a864886f70d01050c"){throw"this only supports pkcs5PBKDF2"}var x=ASN1HEX.getPosArrayOfChildren_AtObj(w,t[1]);if(x.length<2){throw"malformed format: SEQUENCE(0.0.1.0.1).items < 2: "+x.length}s.pbkdf2Salt=ASN1HEX.getHexOfV_AtObj(w,x[0]);var u=ASN1HEX.getHexOfV_AtObj(w,x[1]);try{s.pbkdf2Iter=parseInt(u,16)}catch(v){throw"malformed format pbkdf2Iter: "+u}return s},getPBKDF2KeyHexFromParam:function(u,p){var t=CryptoJS.enc.Hex.parse(u.pbkdf2Salt);var q=u.pbkdf2Iter;var s=CryptoJS.PBKDF2(p,t,{keySize:192/32,iterations:q});var r=CryptoJS.enc.Hex.stringify(s);return r},getPlainPKCS8HexFromEncryptedPKCS8PEM:function(x,y){var r=this.getHexFromPEM(x,"ENCRYPTED PRIVATE KEY");var p=this.parseHexOfEncryptedPKCS8(r);var u=KEYUTIL.getPBKDF2KeyHexFromParam(p,y);var v={};v.ciphertext=CryptoJS.enc.Hex.parse(p.ciphertext);var t=CryptoJS.enc.Hex.parse(u);var s=CryptoJS.enc.Hex.parse(p.encryptionSchemeIV);var w=CryptoJS.TripleDES.decrypt(v,t,{iv:s});var q=CryptoJS.enc.Hex.stringify(w);return q},getRSAKeyFromEncryptedPKCS8PEM:function(s,r){var q=this.getPlainPKCS8HexFromEncryptedPKCS8PEM(s,r);var p=this.getRSAKeyFromPlainPKCS8Hex(q);return p},getKeyFromEncryptedPKCS8PEM:function(s,q){var p=this.getPlainPKCS8HexFromEncryptedPKCS8PEM(s,q);var r=this.getKeyFromPlainPrivatePKCS8Hex(p);return r},parsePlainPrivatePKCS8Hex:function(s){var q={};q.algparam=null;if(s.substr(0,2)!="30"){throw"malformed plain PKCS8 private key(code:001)"}var r=ASN1HEX.getPosArrayOfChildren_AtObj(s,0);if(r.length!=3){throw"malformed plain PKCS8 private key(code:002)"}if(s.substr(r[1],2)!="30"){throw"malformed PKCS8 private key(code:003)"}var p=ASN1HEX.getPosArrayOfChildren_AtObj(s,r[1]);if(p.length!=2){throw"malformed PKCS8 private key(code:004)"}if(s.substr(p[0],2)!="06"){throw"malformed PKCS8 private key(code:005)"}q.algoid=ASN1HEX.getHexOfV_AtObj(s,p[0]);if(s.substr(p[1],2)=="06"){q.algparam=ASN1HEX.getHexOfV_AtObj(s,p[1])}if(s.substr(r[2],2)!="04"){throw"malformed PKCS8 private key(code:006)"}q.keyidx=ASN1HEX.getStartPosOfV_AtObj(s,r[2]);return q},getKeyFromPlainPrivatePKCS8PEM:function(q){var p=this.getHexFromPEM(q,"PRIVATE KEY");var r=this.getKeyFromPlainPrivatePKCS8Hex(p);return r},getKeyFromPlainPrivatePKCS8Hex:function(p){var w=this.parsePlainPrivatePKCS8Hex(p);if(w.algoid=="2a864886f70d010101"){this.parsePrivateRawRSAKeyHexAtObj(p,w);var u=w.key;var z=new RSAKey();z.setPrivateEx(u.n,u.e,u.d,u.p,u.q,u.dp,u.dq,u.co);return z}else{if(w.algoid=="2a8648ce3d0201"){this.parsePrivateRawECKeyHexAtObj(p,w);if(KJUR.crypto.OID.oidhex2name[w.algparam]===undefined){throw"KJUR.crypto.OID.oidhex2name undefined: "+w.algparam}var v=KJUR.crypto.OID.oidhex2name[w.algparam];var z=new KJUR.crypto.ECDSA({curve:v});z.setPublicKeyHex(w.pubkey);z.setPrivateKeyHex(w.key);z.isPublic=false;return z}else{if(w.algoid=="2a8648ce380401"){var t=ASN1HEX.getVbyList(p,0,[1,1,0],"02");var s=ASN1HEX.getVbyList(p,0,[1,1,1],"02");var y=ASN1HEX.getVbyList(p,0,[1,1,2],"02");var B=ASN1HEX.getVbyList(p,0,[2,0],"02");var r=new BigInteger(t,16);var q=new BigInteger(s,16);var x=new BigInteger(y,16);var A=new BigInteger(B,16);var z=new KJUR.crypto.DSA();z.setPrivate(r,q,x,null,A);return z}else{throw"unsupported private key algorithm"}}}},getRSAKeyFromPublicPKCS8PEM:function(q){var r=this.getHexFromPEM(q,"PUBLIC KEY");var p=this.getRSAKeyFromPublicPKCS8Hex(r);return p},getKeyFromPublicPKCS8PEM:function(q){var r=this.getHexFromPEM(q,"PUBLIC KEY");var p=this.getKeyFromPublicPKCS8Hex(r);return p},getKeyFromPublicPKCS8Hex:function(q){var p=this.parsePublicPKCS8Hex(q);if(p.algoid=="2a864886f70d010101"){var u=this.parsePublicRawRSAKeyHex(p.key);var r=new RSAKey();r.setPublic(u.n,u.e);return r}else{if(p.algoid=="2a8648ce3d0201"){if(KJUR.crypto.OID.oidhex2name[p.algparam]===undefined){throw"KJUR.crypto.OID.oidhex2name undefined: "+p.algparam}var s=KJUR.crypto.OID.oidhex2name[p.algparam];var r=new KJUR.crypto.ECDSA({curve:s,pub:p.key});return r}else{if(p.algoid=="2a8648ce380401"){var t=p.algparam;var v=ASN1HEX.getHexOfV_AtObj(p.key,0);var r=new KJUR.crypto.DSA();r.setPublic(new BigInteger(t.p,16),new BigInteger(t.q,16),new BigInteger(t.g,16),new BigInteger(v,16));return r}else{throw"unsupported public key algorithm"}}}},parsePublicRawRSAKeyHex:function(r){var p={};if(r.substr(0,2)!="30"){throw"malformed RSA key(code:001)"}var q=ASN1HEX.getPosArrayOfChildren_AtObj(r,0);if(q.length!=2){throw"malformed RSA key(code:002)"}if(r.substr(q[0],2)!="02"){throw"malformed RSA key(code:003)"}p.n=ASN1HEX.getHexOfV_AtObj(r,q[0]);if(r.substr(q[1],2)!="02"){throw"malformed RSA key(code:004)"}p.e=ASN1HEX.getHexOfV_AtObj(r,q[1]);return p},parsePrivateRawRSAKeyHexAtObj:function(q,s){var r=s.keyidx;if(q.substr(r,2)!="30"){throw"malformed RSA private key(code:001)"}var p=ASN1HEX.getPosArrayOfChildren_AtObj(q,r);if(p.length!=9){throw"malformed RSA private key(code:002)"}s.key={};s.key.n=ASN1HEX.getHexOfV_AtObj(q,p[1]);s.key.e=ASN1HEX.getHexOfV_AtObj(q,p[2]);s.key.d=ASN1HEX.getHexOfV_AtObj(q,p[3]);s.key.p=ASN1HEX.getHexOfV_AtObj(q,p[4]);s.key.q=ASN1HEX.getHexOfV_AtObj(q,p[5]);s.key.dp=ASN1HEX.getHexOfV_AtObj(q,p[6]);s.key.dq=ASN1HEX.getHexOfV_AtObj(q,p[7]);s.key.co=ASN1HEX.getHexOfV_AtObj(q,p[8])},parsePrivateRawECKeyHexAtObj:function(p,t){var q=t.keyidx;var r=ASN1HEX.getVbyList(p,q,[1],"04");var s=ASN1HEX.getVbyList(p,q,[2,0],"03").substr(2);t.key=r;t.pubkey=s},parsePublicPKCS8Hex:function(s){var q={};q.algparam=null;var r=ASN1HEX.getPosArrayOfChildren_AtObj(s,0);if(r.length!=2){throw"outer DERSequence shall have 2 elements: "+r.length}var t=r[0];if(s.substr(t,2)!="30"){throw"malformed PKCS8 public key(code:001)"}var p=ASN1HEX.getPosArrayOfChildren_AtObj(s,t);if(p.length!=2){throw"malformed PKCS8 public key(code:002)"}if(s.substr(p[0],2)!="06"){throw"malformed PKCS8 public key(code:003)"}q.algoid=ASN1HEX.getHexOfV_AtObj(s,p[0]);if(s.substr(p[1],2)=="06"){q.algparam=ASN1HEX.getHexOfV_AtObj(s,p[1])}else{if(s.substr(p[1],2)=="30"){q.algparam={};q.algparam.p=ASN1HEX.getVbyList(s,p[1],[0],"02");q.algparam.q=ASN1HEX.getVbyList(s,p[1],[1],"02");q.algparam.g=ASN1HEX.getVbyList(s,p[1],[2],"02")}}if(s.substr(r[1],2)!="03"){throw"malformed PKCS8 public key(code:004)"}q.key=ASN1HEX.getHexOfV_AtObj(s,r[1]).substr(2);return q},getRSAKeyFromPublicPKCS8Hex:function(t){var s=ASN1HEX.getPosArrayOfChildren_AtObj(t,0);if(s.length!=2){throw"outer DERSequence shall have 2 elements: "+s.length}var r=ASN1HEX.getHexOfTLV_AtObj(t,s[0]);if(r!="300d06092a864886f70d0101010500"){throw"PKCS8 AlgorithmId is not rsaEncryption"}if(t.substr(s[1],2)!="03"){throw"PKCS8 Public Key is not BITSTRING encapslated."}var v=ASN1HEX.getStartPosOfV_AtObj(t,s[1])+2;if(t.substr(v,2)!="30"){throw"PKCS8 Public Key is not SEQUENCE."}var p=ASN1HEX.getPosArrayOfChildren_AtObj(t,v);if(p.length!=2){throw"inner DERSequence shall have 2 elements: "+p.length}if(t.substr(p[0],2)!="02"){throw"N is not ASN.1 INTEGER"}if(t.substr(p[1],2)!="02"){throw"E is not ASN.1 INTEGER"}var w=ASN1HEX.getHexOfV_AtObj(t,p[0]);var u=ASN1HEX.getHexOfV_AtObj(t,p[1]);var q=new RSAKey();q.setPublic(w,u);return q},}}();KEYUTIL.getKey=function(f,e,h){if(typeof RSAKey!="undefined"&&f instanceof RSAKey){return f}if(typeof KJUR.crypto.ECDSA!="undefined"&&f instanceof KJUR.crypto.ECDSA){return f}if(typeof KJUR.crypto.DSA!="undefined"&&f instanceof KJUR.crypto.DSA){return f}if(f.curve!==undefined&&f.xy!==undefined&&f.d===undefined){return new KJUR.crypto.ECDSA({pub:f.xy,curve:f.curve})}if(f.curve!==undefined&&f.d!==undefined){return new KJUR.crypto.ECDSA({prv:f.d,curve:f.curve})}if(f.kty===undefined&&f.n!==undefined&&f.e!==undefined&&f.d===undefined){var w=new RSAKey();w.setPublic(f.n,f.e);return w}if(f.kty===undefined&&f.n!==undefined&&f.e!==undefined&&f.d!==undefined&&f.p!==undefined&&f.q!==undefined&&f.dp!==undefined&&f.dq!==undefined&&f.co!==undefined&&f.qi===undefined){var w=new RSAKey();w.setPrivateEx(f.n,f.e,f.d,f.p,f.q,f.dp,f.dq,f.co);return w}if(f.kty===undefined&&f.n!==undefined&&f.e!==undefined&&f.d!==undefined&&f.p===undefined){var w=new RSAKey();w.setPrivate(f.n,f.e,f.d);return w}if(f.p!==undefined&&f.q!==undefined&&f.g!==undefined&&f.y!==undefined&&f.x===undefined){var w=new KJUR.crypto.DSA();w.setPublic(f.p,f.q,f.g,f.y);return w}if(f.p!==undefined&&f.q!==undefined&&f.g!==undefined&&f.y!==undefined&&f.x!==undefined){var w=new KJUR.crypto.DSA();w.setPrivate(f.p,f.q,f.g,f.y,f.x);return w}if(f.kty==="RSA"&&f.n!==undefined&&f.e!==undefined&&f.d===undefined){var w=new RSAKey();w.setPublic(b64utohex(f.n),b64utohex(f.e));return w}if(f.kty==="RSA"&&f.n!==undefined&&f.e!==undefined&&f.d!==undefined&&f.p!==undefined&&f.q!==undefined&&f.dp!==undefined&&f.dq!==undefined&&f.qi!==undefined){var w=new RSAKey();w.setPrivateEx(b64utohex(f.n),b64utohex(f.e),b64utohex(f.d),b64utohex(f.p),b64utohex(f.q),b64utohex(f.dp),b64utohex(f.dq),b64utohex(f.qi));return w}if(f.kty==="RSA"&&f.n!==undefined&&f.e!==undefined&&f.d!==undefined){var w=new RSAKey();w.setPrivate(b64utohex(f.n),b64utohex(f.e),b64utohex(f.d));return w}if(f.kty==="EC"&&f.crv!==undefined&&f.x!==undefined&&f.y!==undefined&&f.d===undefined){var d=new KJUR.crypto.ECDSA({curve:f.crv});var l=d.ecparams.keylen/4;var r=("0000000000"+b64utohex(f.x)).slice(-l);var n=("0000000000"+b64utohex(f.y)).slice(-l);var m="04"+r+n;d.setPublicKeyHex(m);return d}if(f.kty==="EC"&&f.crv!==undefined&&f.x!==undefined&&f.y!==undefined&&f.d!==undefined){var d=new KJUR.crypto.ECDSA({curve:f.crv});var l=d.ecparams.keylen/4;var a=("0000000000"+b64utohex(f.d)).slice(-l);d.setPrivateKeyHex(a);return d}if(f.indexOf("-END CERTIFICATE-",0)!=-1||f.indexOf("-END X509 CERTIFICATE-",0)!=-1||f.indexOf("-END TRUSTED CERTIFICATE-",0)!=-1){return X509.getPublicKeyFromCertPEM(f)}if(h==="pkcs8pub"){return KEYUTIL.getKeyFromPublicPKCS8Hex(f)}if(f.indexOf("-END PUBLIC KEY-")!=-1){return KEYUTIL.getKeyFromPublicPKCS8PEM(f)}if(h==="pkcs5prv"){var w=new RSAKey();w.readPrivateKeyFromASN1HexString(f);return w}if(h==="pkcs5prv"){var w=new RSAKey();w.readPrivateKeyFromASN1HexString(f);return w}if(f.indexOf("-END RSA PRIVATE KEY-")!=-1&&f.indexOf("4,ENCRYPTED")==-1){var i=KEYUTIL.getHexFromPEM(f,"RSA PRIVATE KEY");return KEYUTIL.getKey(i,null,"pkcs5prv")}if(f.indexOf("-END DSA PRIVATE KEY-")!=-1&&f.indexOf("4,ENCRYPTED")==-1){var u=this.getHexFromPEM(f,"DSA PRIVATE KEY");var t=ASN1HEX.getVbyList(u,0,[1],"02");var s=ASN1HEX.getVbyList(u,0,[2],"02");var v=ASN1HEX.getVbyList(u,0,[3],"02");var j=ASN1HEX.getVbyList(u,0,[4],"02");var k=ASN1HEX.getVbyList(u,0,[5],"02");var w=new KJUR.crypto.DSA();w.setPrivate(new BigInteger(t,16),new BigInteger(s,16),new BigInteger(v,16),new BigInteger(j,16),new BigInteger(k,16));return w}if(f.indexOf("-END PRIVATE KEY-")!=-1){return KEYUTIL.getKeyFromPlainPrivatePKCS8PEM(f)}if(f.indexOf("-END RSA PRIVATE KEY-")!=-1&&f.indexOf("4,ENCRYPTED")!=-1){return KEYUTIL.getRSAKeyFromEncryptedPKCS5PEM(f,e)}if(f.indexOf("-END EC PRIVATE KEY-")!=-1&&f.indexOf("4,ENCRYPTED")!=-1){var u=KEYUTIL.getDecryptedKeyHex(f,e);var w=ASN1HEX.getVbyList(u,0,[1],"04");var c=ASN1HEX.getVbyList(u,0,[2,0],"06");var o=ASN1HEX.getVbyList(u,0,[3,0],"03").substr(2);var b="";if(KJUR.crypto.OID.oidhex2name[c]!==undefined){b=KJUR.crypto.OID.oidhex2name[c]}else{throw"undefined OID(hex) in KJUR.crypto.OID: "+c}var d=new KJUR.crypto.ECDSA({name:b});d.setPublicKeyHex(o);d.setPrivateKeyHex(w);d.isPublic=false;return d}if(f.indexOf("-END DSA PRIVATE KEY-")!=-1&&f.indexOf("4,ENCRYPTED")!=-1){var u=KEYUTIL.getDecryptedKeyHex(f,e);var t=ASN1HEX.getVbyList(u,0,[1],"02");var s=ASN1HEX.getVbyList(u,0,[2],"02");var v=ASN1HEX.getVbyList(u,0,[3],"02");var j=ASN1HEX.getVbyList(u,0,[4],"02");var k=ASN1HEX.getVbyList(u,0,[5],"02");var w=new KJUR.crypto.DSA();w.setPrivate(new BigInteger(t,16),new BigInteger(s,16),new BigInteger(v,16),new BigInteger(j,16),new BigInteger(k,16));return w}if(f.indexOf("-END ENCRYPTED PRIVATE KEY-")!=-1){return KEYUTIL.getKeyFromEncryptedPKCS8PEM(f,e)}throw"not supported argument"};KEYUTIL.generateKeypair=function(a,c){if(a=="RSA"){var b=c;var h=new RSAKey();h.generate(b,"10001");h.isPrivate=true;h.isPublic=true;var f=new RSAKey();var e=h.n.toString(16);var i=h.e.toString(16);f.setPublic(e,i);f.isPrivate=false;f.isPublic=true;var k={};k.prvKeyObj=h;k.pubKeyObj=f;return k}else{if(a=="EC"){var d=c;var g=new KJUR.crypto.ECDSA({curve:d});var j=g.generateKeyPairHex();var h=new KJUR.crypto.ECDSA({curve:d});h.setPrivateKeyHex(j.ecprvhex);h.isPrivate=true;h.isPublic=false;var f=new KJUR.crypto.ECDSA({curve:d});f.setPublicKeyHex(j.ecpubhex);f.isPrivate=false;f.isPublic=true;var k={};k.prvKeyObj=h;k.pubKeyObj=f;return k}else{throw"unknown algorithm: "+a}}};KEYUTIL.getPEM=function(a,r,o,g,j){var v=KJUR.asn1;var u=KJUR.crypto;function p(s){var w=KJUR.asn1.ASN1Util.newObject({seq:[{"int":0},{"int":{bigint:s.n}},{"int":s.e},{"int":{bigint:s.d}},{"int":{bigint:s.p}},{"int":{bigint:s.q}},{"int":{bigint:s.dmp1}},{"int":{bigint:s.dmq1}},{"int":{bigint:s.coeff}}]});return w}function q(w){var s=KJUR.asn1.ASN1Util.newObject({seq:[{"int":1},{octstr:{hex:w.prvKeyHex}},{tag:["a0",true,{oid:{name:w.curveName}}]},{tag:["a1",true,{bitstr:{hex:"00"+w.pubKeyHex}}]}]});return s}function n(s){var w=KJUR.asn1.ASN1Util.newObject({seq:[{"int":0},{"int":{bigint:s.p}},{"int":{bigint:s.q}},{"int":{bigint:s.g}},{"int":{bigint:s.y}},{"int":{bigint:s.x}}]});return w}if(((typeof RSAKey!="undefined"&&a instanceof RSAKey)||(typeof u.DSA!="undefined"&&a instanceof u.DSA)||(typeof u.ECDSA!="undefined"&&a instanceof u.ECDSA))&&a.isPublic==true&&(r===undefined||r=="PKCS8PUB")){var t=new KJUR.asn1.x509.SubjectPublicKeyInfo(a);var m=t.getEncodedHex();return v.ASN1Util.getPEMStringFromHex(m,"PUBLIC KEY")}if(r=="PKCS1PRV"&&typeof RSAKey!="undefined"&&a instanceof RSAKey&&(o===undefined||o==null)&&a.isPrivate==true){var t=p(a);var m=t.getEncodedHex();return v.ASN1Util.getPEMStringFromHex(m,"RSA PRIVATE KEY")}if(r=="PKCS1PRV"&&typeof RSAKey!="undefined"&&a instanceof KJUR.crypto.ECDSA&&(o===undefined||o==null)&&a.isPrivate==true){var f=new KJUR.asn1.DERObjectIdentifier({name:a.curveName});var l=f.getEncodedHex();var e=q(a);var k=e.getEncodedHex();var i="";i+=v.ASN1Util.getPEMStringFromHex(l,"EC PARAMETERS");i+=v.ASN1Util.getPEMStringFromHex(k,"EC PRIVATE KEY");return i}if(r=="PKCS1PRV"&&typeof KJUR.crypto.DSA!="undefined"&&a instanceof KJUR.crypto.DSA&&(o===undefined||o==null)&&a.isPrivate==true){var t=n(a);var m=t.getEncodedHex();return v.ASN1Util.getPEMStringFromHex(m,"DSA PRIVATE KEY")}if(r=="PKCS5PRV"&&typeof RSAKey!="undefined"&&a instanceof RSAKey&&(o!==undefined&&o!=null)&&a.isPrivate==true){var t=p(a);var m=t.getEncodedHex();if(g===undefined){g="DES-EDE3-CBC"}return this.getEncryptedPKCS5PEMFromPrvKeyHex("RSA",m,o,g)}if(r=="PKCS5PRV"&&typeof KJUR.crypto.ECDSA!="undefined"&&a instanceof KJUR.crypto.ECDSA&&(o!==undefined&&o!=null)&&a.isPrivate==true){var t=q(a);var m=t.getEncodedHex();if(g===undefined){g="DES-EDE3-CBC"}return this.getEncryptedPKCS5PEMFromPrvKeyHex("EC",m,o,g)}if(r=="PKCS5PRV"&&typeof KJUR.crypto.DSA!="undefined"&&a instanceof KJUR.crypto.DSA&&(o!==undefined&&o!=null)&&a.isPrivate==true){var t=n(a);var m=t.getEncodedHex();if(g===undefined){g="DES-EDE3-CBC"}return this.getEncryptedPKCS5PEMFromPrvKeyHex("DSA",m,o,g)}var h=function(w,s){var y=b(w,s);var x=new KJUR.asn1.ASN1Util.newObject({seq:[{seq:[{oid:{name:"pkcs5PBES2"}},{seq:[{seq:[{oid:{name:"pkcs5PBKDF2"}},{seq:[{octstr:{hex:y.pbkdf2Salt}},{"int":y.pbkdf2Iter}]}]},{seq:[{oid:{name:"des-EDE3-CBC"}},{octstr:{hex:y.encryptionSchemeIV}}]}]}]},{octstr:{hex:y.ciphertext}}]});return x.getEncodedHex()};var b=function(D,E){var x=100;var C=CryptoJS.lib.WordArray.random(8);var B="DES-EDE3-CBC";var s=CryptoJS.lib.WordArray.random(8);var y=CryptoJS.PBKDF2(E,C,{keySize:192/32,iterations:x});var z=CryptoJS.enc.Hex.parse(D);var A=CryptoJS.TripleDES.encrypt(z,y,{iv:s})+"";var w={};w.ciphertext=A;w.pbkdf2Salt=CryptoJS.enc.Hex.stringify(C);w.pbkdf2Iter=x;w.encryptionSchemeAlg=B;w.encryptionSchemeIV=CryptoJS.enc.Hex.stringify(s);return w};if(r=="PKCS8PRV"&&typeof RSAKey!="undefined"&&a instanceof RSAKey&&a.isPrivate==true){var d=p(a);var c=d.getEncodedHex();var t=KJUR.asn1.ASN1Util.newObject({seq:[{"int":0},{seq:[{oid:{name:"rsaEncryption"}},{"null":true}]},{octstr:{hex:c}}]});var m=t.getEncodedHex();if(o===undefined||o==null){return v.ASN1Util.getPEMStringFromHex(m,"PRIVATE KEY")}else{var k=h(m,o);return v.ASN1Util.getPEMStringFromHex(k,"ENCRYPTED PRIVATE KEY")}}if(r=="PKCS8PRV"&&typeof KJUR.crypto.ECDSA!="undefined"&&a instanceof KJUR.crypto.ECDSA&&a.isPrivate==true){var d=new KJUR.asn1.ASN1Util.newObject({seq:[{"int":1},{octstr:{hex:a.prvKeyHex}},{tag:["a1",true,{bitstr:{hex:"00"+a.pubKeyHex}}]}]});var c=d.getEncodedHex();var t=KJUR.asn1.ASN1Util.newObject({seq:[{"int":0},{seq:[{oid:{name:"ecPublicKey"}},{oid:{name:a.curveName}}]},{octstr:{hex:c}}]});var m=t.getEncodedHex();if(o===undefined||o==null){return v.ASN1Util.getPEMStringFromHex(m,"PRIVATE KEY")}else{var k=h(m,o);return v.ASN1Util.getPEMStringFromHex(k,"ENCRYPTED PRIVATE KEY")}}if(r=="PKCS8PRV"&&typeof KJUR.crypto.DSA!="undefined"&&a instanceof KJUR.crypto.DSA&&a.isPrivate==true){var d=new KJUR.asn1.DERInteger({bigint:a.x});var c=d.getEncodedHex();var t=KJUR.asn1.ASN1Util.newObject({seq:[{"int":0},{seq:[{oid:{name:"dsa"}},{seq:[{"int":{bigint:a.p}},{"int":{bigint:a.q}},{"int":{bigint:a.g}}]}]},{octstr:{hex:c}}]});var m=t.getEncodedHex();if(o===undefined||o==null){return v.ASN1Util.getPEMStringFromHex(m,"PRIVATE KEY")}else{var k=h(m,o);return v.ASN1Util.getPEMStringFromHex(k,"ENCRYPTED PRIVATE KEY")}}throw"unsupported object nor format"};KEYUTIL.getKeyFromCSRPEM=function(b){var a=KEYUTIL.getHexFromPEM(b,"CERTIFICATE REQUEST");var c=KEYUTIL.getKeyFromCSRHex(a);return c};KEYUTIL.getKeyFromCSRHex=function(a){var c=KEYUTIL.parseCSRHex(a);var b=KEYUTIL.getKey(c.p8pubkeyhex,null,"pkcs8pub");return b};KEYUTIL.parseCSRHex=function(c){var b={};var e=c;if(e.substr(0,2)!="30"){throw"malformed CSR(code:001)"}var d=ASN1HEX.getPosArrayOfChildren_AtObj(e,0);if(d.length<1){throw"malformed CSR(code:002)"}if(e.substr(d[0],2)!="30"){throw"malformed CSR(code:003)"}var a=ASN1HEX.getPosArrayOfChildren_AtObj(e,d[0]);if(a.length<3){throw"malformed CSR(code:004)"}b.p8pubkeyhex=ASN1HEX.getHexOfTLV_AtObj(e,a[2]);return b};
/*! rsapem-1.1.js (c) 2012 Kenji Urushima | kjur.github.com/jsrsasign/license
*/
function _rsapem_pemToBase64(b){var a=b;a=a.replace("-----BEGIN RSA PRIVATE KEY-----","");a=a.replace("-----END RSA PRIVATE KEY-----","");a=a.replace(/[ \n]+/g,"");return a}function _rsapem_getPosArrayOfChildrenFromHex(d){var j=new Array();var k=ASN1HEX.getStartPosOfV_AtObj(d,0);var f=ASN1HEX.getPosOfNextSibling_AtObj(d,k);var h=ASN1HEX.getPosOfNextSibling_AtObj(d,f);var b=ASN1HEX.getPosOfNextSibling_AtObj(d,h);var l=ASN1HEX.getPosOfNextSibling_AtObj(d,b);var e=ASN1HEX.getPosOfNextSibling_AtObj(d,l);var g=ASN1HEX.getPosOfNextSibling_AtObj(d,e);var c=ASN1HEX.getPosOfNextSibling_AtObj(d,g);var i=ASN1HEX.getPosOfNextSibling_AtObj(d,c);j.push(k,f,h,b,l,e,g,c,i);return j}function _rsapem_getHexValueArrayOfChildrenFromHex(i){var o=_rsapem_getPosArrayOfChildrenFromHex(i);var r=ASN1HEX.getHexOfV_AtObj(i,o[0]);var f=ASN1HEX.getHexOfV_AtObj(i,o[1]);var j=ASN1HEX.getHexOfV_AtObj(i,o[2]);var k=ASN1HEX.getHexOfV_AtObj(i,o[3]);var c=ASN1HEX.getHexOfV_AtObj(i,o[4]);var b=ASN1HEX.getHexOfV_AtObj(i,o[5]);var h=ASN1HEX.getHexOfV_AtObj(i,o[6]);var g=ASN1HEX.getHexOfV_AtObj(i,o[7]);var l=ASN1HEX.getHexOfV_AtObj(i,o[8]);var m=new Array();m.push(r,f,j,k,c,b,h,g,l);return m}function _rsapem_readPrivateKeyFromASN1HexString(c){var b=_rsapem_getHexValueArrayOfChildrenFromHex(c);this.setPrivateEx(b[1],b[2],b[3],b[4],b[5],b[6],b[7],b[8])}function _rsapem_readPrivateKeyFromPEMString(e){var c=_rsapem_pemToBase64(e);var d=b64tohex(c);var b=_rsapem_getHexValueArrayOfChildrenFromHex(d);this.setPrivateEx(b[1],b[2],b[3],b[4],b[5],b[6],b[7],b[8])}RSAKey.prototype.readPrivateKeyFromPEMString=_rsapem_readPrivateKeyFromPEMString;RSAKey.prototype.readPrivateKeyFromASN1HexString=_rsapem_readPrivateKeyFromASN1HexString;
/*! rsasign-1.2.7.js (c) 2012 Kenji Urushima | kjur.github.com/jsrsasign/license
*/
var _RE_HEXDECONLY=new RegExp("");_RE_HEXDECONLY.compile("[^0-9a-f]","gi");function _rsasign_getHexPaddedDigestInfoForString(d,e,a){var b=function(f){return KJUR.crypto.Util.hashString(f,a)};var c=b(d);return KJUR.crypto.Util.getPaddedDigestInfoHex(c,a,e)}function _zeroPaddingOfSignature(e,d){var c="";var a=d/4-e.length;for(var b=0;b>24,(d&16711680)>>16,(d&65280)>>8,d&255]))));d+=1}return b}function _rsasign_signStringPSS(e,a,d){var c=function(f){return KJUR.crypto.Util.hashHex(f,a)};var b=c(rstrtohex(e));if(d===undefined){d=-1}return this.signWithMessageHashPSS(b,a,d)}function _rsasign_signWithMessageHashPSS(l,a,k){var b=hextorstr(l);var g=b.length;var m=this.n.bitLength()-1;var c=Math.ceil(m/8);var d;var o=function(i){return KJUR.crypto.Util.hashHex(i,a)};if(k===-1||k===undefined){k=g}else{if(k===-2){k=c-g-2}else{if(k<-2){throw"invalid salt length"}}}if(c<(g+k+2)){throw"data too long"}var f="";if(k>0){f=new Array(k);new SecureRandom().nextBytes(f);f=String.fromCharCode.apply(String,f)}var n=hextorstr(o(rstrtohex("\x00\x00\x00\x00\x00\x00\x00\x00"+b+f)));var j=[];for(d=0;d>(8*c-m))&255;q[0]&=~p;for(d=0;dthis.n.bitLength()){return 0}var i=this.doPublic(b);var e=i.toString(16).replace(/^1f+00/,"");var g=_rsasign_getAlgNameAndHashFromHexDisgestInfo(e);if(g.length==0){return false}var d=g[0];var h=g[1];var a=function(k){return KJUR.crypto.Util.hashString(k,d)};var c=a(f);return(h==c)}function _rsasign_verifyWithMessageHash(e,a){a=a.replace(_RE_HEXDECONLY,"");a=a.replace(/[ \n]+/g,"");var b=parseBigInt(a,16);if(b.bitLength()>this.n.bitLength()){return 0}var h=this.doPublic(b);var g=h.toString(16).replace(/^1f+00/,"");var c=_rsasign_getAlgNameAndHashFromHexDisgestInfo(g);if(c.length==0){return false}var d=c[0];var f=c[1];return(f==e)}function _rsasign_verifyStringPSS(c,b,a,f){var e=function(g){return KJUR.crypto.Util.hashHex(g,a)};var d=e(rstrtohex(c));if(f===undefined){f=-1}return this.verifyWithMessageHashPSS(d,b,a,f)}function _rsasign_verifyWithMessageHashPSS(f,s,l,c){var k=new BigInteger(s,16);if(k.bitLength()>this.n.bitLength()){return false}var r=function(i){return KJUR.crypto.Util.hashHex(i,l)};var j=hextorstr(f);var h=j.length;var g=this.n.bitLength()-1;var m=Math.ceil(g/8);var q;if(c===-1||c===undefined){c=h}else{if(c===-2){c=m-h-2}else{if(c<-2){throw"invalid salt length"}}}if(m<(h+c+2)){throw"data too long"}var a=this.doPublic(k).toByteArray();for(q=0;q>(8*m-g))&255;if((d.charCodeAt(0)&p)!==0){throw"bits beyond keysize not zero"}var n=pss_mgf1_str(e,d.length,r);var o=[];for(q=0;q=0;){delete D[n[A]]}}}return q.call(C,B,D)};x=s({"":x},"")}return x}})();
/*! jws-3.3.3 (c) 2013-2015 Kenji Urushima | kjur.github.com/jsrsasign/license
*/
if(typeof KJUR=="undefined"||!KJUR){KJUR={}}if(typeof KJUR.jws=="undefined"||!KJUR.jws){KJUR.jws={}}KJUR.jws.JWS=function(){var a=KJUR.jws.JWS;this.parseJWS=function(e,g){if((this.parsedJWS!==undefined)&&(g||(this.parsedJWS.sigvalH!==undefined))){return}if(e.match(/^([^.]+)\.([^.]+)\.([^.]+)$/)==null){throw"JWS signature is not a form of 'Head.Payload.SigValue'."}var h=RegExp.$1;var c=RegExp.$2;var i=RegExp.$3;var k=h+"."+c;this.parsedJWS={};this.parsedJWS.headB64U=h;this.parsedJWS.payloadB64U=c;this.parsedJWS.sigvalB64U=i;this.parsedJWS.si=k;if(!g){var f=b64utohex(i);var d=parseBigInt(f,16);this.parsedJWS.sigvalH=f;this.parsedJWS.sigvalBI=d}var b=b64utoutf8(h);var j=b64utoutf8(c);this.parsedJWS.headS=b;this.parsedJWS.payloadS=j;if(!a.isSafeJSONString(b,this.parsedJWS,"headP")){throw"malformed JSON string for JWS Head: "+b}}};KJUR.jws.JWS.sign=function(a,i,c,m,l){var k=KJUR.jws.JWS;var q,e,j;if(typeof i!="string"&&typeof i!="object"){throw"spHeader must be JSON string or object: "+i}if(typeof i=="object"){e=i;q=JSON.stringify(e)}if(typeof i=="string"){q=i;if(!k.isSafeJSONString(q)){throw"JWS Head is not safe JSON string: "+q}e=k.readSafeJSONString(q)}j=c;if(typeof c=="object"){j=JSON.stringify(c)}if((a==""||a==null)&&e.alg!==undefined){a=e.alg}if((a!=""&&a!=null)&&e.alg===undefined){e.alg=a;q=JSON.stringify(e)}if(a!==e.alg){throw"alg and sHeader.alg doesn't match: "+a+"!="+e.alg}var d=null;if(k.jwsalg2sigalg[a]===undefined){throw"unsupported alg name: "+a}else{d=k.jwsalg2sigalg[a]}var b=utf8tob64u(q);var g=utf8tob64u(j);var o=b+"."+g;var n="";if(d.substr(0,4)=="Hmac"){if(m===undefined){throw"mac key shall be specified for HS* alg"}var h=new KJUR.crypto.Mac({alg:d,prov:"cryptojs",pass:m});h.updateString(o);n=h.doFinal()}else{if(d.indexOf("withECDSA")!=-1){var p=new KJUR.crypto.Signature({alg:d});p.init(m,l);p.updateString(o);hASN1Sig=p.sign();n=KJUR.crypto.ECDSA.asn1SigToConcatSig(hASN1Sig)}else{if(d!="none"){var p=new KJUR.crypto.Signature({alg:d});p.init(m,l);p.updateString(o);n=p.sign()}}}var f=hextob64u(n);return o+"."+f};KJUR.jws.JWS.verify=function(p,t,j){var m=KJUR.jws.JWS;var q=p.split(".");var d=q[0];var l=q[1];var b=d+"."+l;var r=b64utohex(q[2]);var i=m.readSafeJSONString(b64utoutf8(q[0]));var h=null;var s=null;if(i.alg===undefined){throw"algorithm not specified in header"}else{h=i.alg;s=h.substr(0,2)}if(j!=null&&Object.prototype.toString.call(j)==="[object Array]"&&j.length>0){var c=":"+j.join(":")+":";if(c.indexOf(":"+h+":")==-1){throw"algorithm '"+h+"' not accepted in the list"}}if(h!="none"&&t===null){throw"key shall be specified to verify."}if(typeof t=="string"&&t.indexOf("-----BEGIN ")!=-1){t=KEYUTIL.getKey(t)}if(s=="RS"||s=="PS"){if(!(t instanceof RSAKey)){throw"key shall be a RSAKey obj for RS* and PS* algs"}}if(s=="ES"){if(!(t instanceof KJUR.crypto.ECDSA)){throw"key shall be a ECDSA obj for ES* algs"}}if(h=="none"){}var n=null;if(m.jwsalg2sigalg[i.alg]===undefined){throw"unsupported alg name: "+h}else{n=m.jwsalg2sigalg[h]}if(n=="none"){throw"not supported"}else{if(n.substr(0,4)=="Hmac"){var k=null;if(t===undefined){throw"hexadecimal key shall be specified for HMAC"}var g=new KJUR.crypto.Mac({alg:n,pass:t});g.updateString(b);k=g.doFinal();return r==k}else{if(n.indexOf("withECDSA")!=-1){var f=null;try{f=KJUR.crypto.ECDSA.concatSigToASN1Sig(r)}catch(o){return false}var e=new KJUR.crypto.Signature({alg:n});e.init(t);e.updateString(b);return e.verify(f)}else{var e=new KJUR.crypto.Signature({alg:n});e.init(t);e.updateString(b);return e.verify(r)}}}};KJUR.jws.JWS.parse=function(g){var c=g.split(".");var b={};var f,e,d;if(c.length!=2&&c.length!=3){throw"malformed sJWS: wrong number of '.' splitted elements"}f=c[0];e=c[1];if(c.length==3){d=c[2]}b.headerObj=KJUR.jws.JWS.readSafeJSONString(b64utoutf8(f));b.payloadObj=KJUR.jws.JWS.readSafeJSONString(b64utoutf8(e));b.headerPP=JSON.stringify(b.headerObj,null," ");if(b.payloadObj==null){b.payloadPP=b64utoutf8(e)}else{b.payloadPP=JSON.stringify(b.payloadObj,null," ")}if(d!==undefined){b.sigHex=b64utohex(d)}return b};KJUR.jws.JWS.verifyJWT=function(d,j,l){var h=KJUR.jws.JWS;var i=d.split(".");var c=i[0];var g=i[1];var m=c+"."+g;var k=b64utohex(i[2]);var f=h.readSafeJSONString(b64utoutf8(c));var e=h.readSafeJSONString(b64utoutf8(g));if(f.alg===undefined){return false}if(l.alg===undefined){throw"acceptField.alg shall be specified"}if(!h.inArray(f.alg,l.alg)){return false}if(e.iss!==undefined&&typeof l.iss==="object"){if(!h.inArray(e.iss,l.iss)){return false}}if(e.sub!==undefined&&typeof l.sub==="object"){if(!h.inArray(e.sub,l.sub)){return false}}if(e.aud!==undefined&&typeof l.aud==="object"){if(typeof e.aud=="string"){if(!h.inArray(e.aud,l.aud)){return false}}else{if(typeof e.aud=="object"){if(!h.includedArray(e.aud,l.aud)){return false}}}}var b=KJUR.jws.IntDate.getNow();if(l.verifyAt!==undefined&&typeof l.verifyAt=="number"){b=l.verifyAt}if(e.exp!==undefined&&typeof e.exp=="number"){if(e.exp
* @license MIT
*/
/* eslint-disable no-proto */
'use strict'
var base64 = __webpack_require__(305)
var ieee754 = __webpack_require__(306)
var isArray = __webpack_require__(307)
exports.Buffer = Buffer
exports.SlowBuffer = SlowBuffer
exports.INSPECT_MAX_BYTES = 50
Buffer.poolSize = 8192 // not used by this implementation
var rootParent = {}
/**
* If `Buffer.TYPED_ARRAY_SUPPORT`:
* === true Use Uint8Array implementation (fastest)
* === false Use Object implementation (most compatible, even IE6)
*
* Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,
* Opera 11.6+, iOS 4.2+.
*
* Due to various browser bugs, sometimes the Object implementation will be used even
* when the browser supports typed arrays.
*
* Note:
*
* - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances,
* See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438.
*
* - Safari 5-7 lacks support for changing the `Object.prototype.constructor` property
* on objects.
*
* - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function.
*
* - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of
* incorrect length in some situations.
* We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they
* get the Object implementation, which is slower but behaves correctly.
*/
Buffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined
? global.TYPED_ARRAY_SUPPORT
: typedArraySupport()
function typedArraySupport () {
function Bar () {}
try {
var arr = new Uint8Array(1)
arr.foo = function () { return 42 }
arr.constructor = Bar
return arr.foo() === 42 && // typed array instances can be augmented
arr.constructor === Bar && // constructor can be set
typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray`
arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray`
} catch (e) {
return false
}
}
function kMaxLength () {
return Buffer.TYPED_ARRAY_SUPPORT
? 0x7fffffff
: 0x3fffffff
}
/**
* Class: Buffer
* =============
*
* The Buffer constructor returns instances of `Uint8Array` that are augmented
* with function properties for all the node `Buffer` API functions. We use
* `Uint8Array` so that square bracket notation works as expected -- it returns
* a single octet.
*
* By augmenting the instances, we can avoid modifying the `Uint8Array`
* prototype.
*/
function Buffer (arg) {
if (!(this instanceof Buffer)) {
// Avoid going through an ArgumentsAdaptorTrampoline in the common case.
if (arguments.length > 1) return new Buffer(arg, arguments[1])
return new Buffer(arg)
}
if (!Buffer.TYPED_ARRAY_SUPPORT) {
this.length = 0
this.parent = undefined
}
// Common case.
if (typeof arg === 'number') {
return fromNumber(this, arg)
}
// Slightly less common case.
if (typeof arg === 'string') {
return fromString(this, arg, arguments.length > 1 ? arguments[1] : 'utf8')
}
// Unusual.
return fromObject(this, arg)
}
function fromNumber (that, length) {
that = allocate(that, length < 0 ? 0 : checked(length) | 0)
if (!Buffer.TYPED_ARRAY_SUPPORT) {
for (var i = 0; i < length; i++) {
that[i] = 0
}
}
return that
}
function fromString (that, string, encoding) {
if (typeof encoding !== 'string' || encoding === '') encoding = 'utf8'
// Assumption: byteLength() return value is always < kMaxLength.
var length = byteLength(string, encoding) | 0
that = allocate(that, length)
that.write(string, encoding)
return that
}
function fromObject (that, object) {
if (Buffer.isBuffer(object)) return fromBuffer(that, object)
if (isArray(object)) return fromArray(that, object)
if (object == null) {
throw new TypeError('must start with number, buffer, array or string')
}
if (typeof ArrayBuffer !== 'undefined') {
if (object.buffer instanceof ArrayBuffer) {
return fromTypedArray(that, object)
}
if (object instanceof ArrayBuffer) {
return fromArrayBuffer(that, object)
}
}
if (object.length) return fromArrayLike(that, object)
return fromJsonObject(that, object)
}
function fromBuffer (that, buffer) {
var length = checked(buffer.length) | 0
that = allocate(that, length)
buffer.copy(that, 0, 0, length)
return that
}
function fromArray (that, array) {
var length = checked(array.length) | 0
that = allocate(that, length)
for (var i = 0; i < length; i += 1) {
that[i] = array[i] & 255
}
return that
}
// Duplicate of fromArray() to keep fromArray() monomorphic.
function fromTypedArray (that, array) {
var length = checked(array.length) | 0
that = allocate(that, length)
// Truncating the elements is probably not what people expect from typed
// arrays with BYTES_PER_ELEMENT > 1 but it's compatible with the behavior
// of the old Buffer constructor.
for (var i = 0; i < length; i += 1) {
that[i] = array[i] & 255
}
return that
}
function fromArrayBuffer (that, array) {
if (Buffer.TYPED_ARRAY_SUPPORT) {
// Return an augmented `Uint8Array` instance, for best performance
array.byteLength
that = Buffer._augment(new Uint8Array(array))
} else {
// Fallback: Return an object instance of the Buffer class
that = fromTypedArray(that, new Uint8Array(array))
}
return that
}
function fromArrayLike (that, array) {
var length = checked(array.length) | 0
that = allocate(that, length)
for (var i = 0; i < length; i += 1) {
that[i] = array[i] & 255
}
return that
}
// Deserialize { type: 'Buffer', data: [1,2,3,...] } into a Buffer object.
// Returns a zero-length buffer for inputs that don't conform to the spec.
function fromJsonObject (that, object) {
var array
var length = 0
if (object.type === 'Buffer' && isArray(object.data)) {
array = object.data
length = checked(array.length) | 0
}
that = allocate(that, length)
for (var i = 0; i < length; i += 1) {
that[i] = array[i] & 255
}
return that
}
if (Buffer.TYPED_ARRAY_SUPPORT) {
Buffer.prototype.__proto__ = Uint8Array.prototype
Buffer.__proto__ = Uint8Array
} else {
// pre-set for values that may exist in the future
Buffer.prototype.length = undefined
Buffer.prototype.parent = undefined
}
function allocate (that, length) {
if (Buffer.TYPED_ARRAY_SUPPORT) {
// Return an augmented `Uint8Array` instance, for best performance
that = Buffer._augment(new Uint8Array(length))
that.__proto__ = Buffer.prototype
} else {
// Fallback: Return an object instance of the Buffer class
that.length = length
that._isBuffer = true
}
var fromPool = length !== 0 && length <= Buffer.poolSize >>> 1
if (fromPool) that.parent = rootParent
return that
}
function checked (length) {
// Note: cannot use `length < kMaxLength` here because that fails when
// length is NaN (which is otherwise coerced to zero.)
if (length >= kMaxLength()) {
throw new RangeError('Attempt to allocate Buffer larger than maximum ' +
'size: 0x' + kMaxLength().toString(16) + ' bytes')
}
return length | 0
}
function SlowBuffer (subject, encoding) {
if (!(this instanceof SlowBuffer)) return new SlowBuffer(subject, encoding)
var buf = new Buffer(subject, encoding)
delete buf.parent
return buf
}
Buffer.isBuffer = function isBuffer (b) {
return !!(b != null && b._isBuffer)
}
Buffer.compare = function compare (a, b) {
if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {
throw new TypeError('Arguments must be Buffers')
}
if (a === b) return 0
var x = a.length
var y = b.length
var i = 0
var len = Math.min(x, y)
while (i < len) {
if (a[i] !== b[i]) break
++i
}
if (i !== len) {
x = a[i]
y = b[i]
}
if (x < y) return -1
if (y < x) return 1
return 0
}
Buffer.isEncoding = function isEncoding (encoding) {
switch (String(encoding).toLowerCase()) {
case 'hex':
case 'utf8':
case 'utf-8':
case 'ascii':
case 'binary':
case 'base64':
case 'raw':
case 'ucs2':
case 'ucs-2':
case 'utf16le':
case 'utf-16le':
return true
default:
return false
}
}
Buffer.concat = function concat (list, length) {
if (!isArray(list)) throw new TypeError('list argument must be an Array of Buffers.')
if (list.length === 0) {
return new Buffer(0)
}
var i
if (length === undefined) {
length = 0
for (i = 0; i < list.length; i++) {
length += list[i].length
}
}
var buf = new Buffer(length)
var pos = 0
for (i = 0; i < list.length; i++) {
var item = list[i]
item.copy(buf, pos)
pos += item.length
}
return buf
}
function byteLength (string, encoding) {
if (typeof string !== 'string') string = '' + string
var len = string.length
if (len === 0) return 0
// Use a for loop to avoid recursion
var loweredCase = false
for (;;) {
switch (encoding) {
case 'ascii':
case 'binary':
// Deprecated
case 'raw':
case 'raws':
return len
case 'utf8':
case 'utf-8':
return utf8ToBytes(string).length
case 'ucs2':
case 'ucs-2':
case 'utf16le':
case 'utf-16le':
return len * 2
case 'hex':
return len >>> 1
case 'base64':
return base64ToBytes(string).length
default:
if (loweredCase) return utf8ToBytes(string).length // assume utf8
encoding = ('' + encoding).toLowerCase()
loweredCase = true
}
}
}
Buffer.byteLength = byteLength
function slowToString (encoding, start, end) {
var loweredCase = false
start = start | 0
end = end === undefined || end === Infinity ? this.length : end | 0
if (!encoding) encoding = 'utf8'
if (start < 0) start = 0
if (end > this.length) end = this.length
if (end <= start) return ''
while (true) {
switch (encoding) {
case 'hex':
return hexSlice(this, start, end)
case 'utf8':
case 'utf-8':
return utf8Slice(this, start, end)
case 'ascii':
return asciiSlice(this, start, end)
case 'binary':
return binarySlice(this, start, end)
case 'base64':
return base64Slice(this, start, end)
case 'ucs2':
case 'ucs-2':
case 'utf16le':
case 'utf-16le':
return utf16leSlice(this, start, end)
default:
if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
encoding = (encoding + '').toLowerCase()
loweredCase = true
}
}
}
Buffer.prototype.toString = function toString () {
var length = this.length | 0
if (length === 0) return ''
if (arguments.length === 0) return utf8Slice(this, 0, length)
return slowToString.apply(this, arguments)
}
Buffer.prototype.equals = function equals (b) {
if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')
if (this === b) return true
return Buffer.compare(this, b) === 0
}
Buffer.prototype.inspect = function inspect () {
var str = ''
var max = exports.INSPECT_MAX_BYTES
if (this.length > 0) {
str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')
if (this.length > max) str += ' ... '
}
return ''
}
Buffer.prototype.compare = function compare (b) {
if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')
if (this === b) return 0
return Buffer.compare(this, b)
}
Buffer.prototype.indexOf = function indexOf (val, byteOffset) {
if (byteOffset > 0x7fffffff) byteOffset = 0x7fffffff
else if (byteOffset < -0x80000000) byteOffset = -0x80000000
byteOffset >>= 0
if (this.length === 0) return -1
if (byteOffset >= this.length) return -1
// Negative offsets start from the end of the buffer
if (byteOffset < 0) byteOffset = Math.max(this.length + byteOffset, 0)
if (typeof val === 'string') {
if (val.length === 0) return -1 // special case: looking for empty string always fails
return String.prototype.indexOf.call(this, val, byteOffset)
}
if (Buffer.isBuffer(val)) {
return arrayIndexOf(this, val, byteOffset)
}
if (typeof val === 'number') {
if (Buffer.TYPED_ARRAY_SUPPORT && Uint8Array.prototype.indexOf === 'function') {
return Uint8Array.prototype.indexOf.call(this, val, byteOffset)
}
return arrayIndexOf(this, [ val ], byteOffset)
}
function arrayIndexOf (arr, val, byteOffset) {
var foundIndex = -1
for (var i = 0; byteOffset + i < arr.length; i++) {
if (arr[byteOffset + i] === val[foundIndex === -1 ? 0 : i - foundIndex]) {
if (foundIndex === -1) foundIndex = i
if (i - foundIndex + 1 === val.length) return byteOffset + foundIndex
} else {
foundIndex = -1
}
}
return -1
}
throw new TypeError('val must be string, number or Buffer')
}
// `get` is deprecated
Buffer.prototype.get = function get (offset) {
console.log('.get() is deprecated. Access using array indexes instead.')
return this.readUInt8(offset)
}
// `set` is deprecated
Buffer.prototype.set = function set (v, offset) {
console.log('.set() is deprecated. Access using array indexes instead.')
return this.writeUInt8(v, offset)
}
function hexWrite (buf, string, offset, length) {
offset = Number(offset) || 0
var remaining = buf.length - offset
if (!length) {
length = remaining
} else {
length = Number(length)
if (length > remaining) {
length = remaining
}
}
// must be an even number of digits
var strLen = string.length
if (strLen % 2 !== 0) throw new Error('Invalid hex string')
if (length > strLen / 2) {
length = strLen / 2
}
for (var i = 0; i < length; i++) {
var parsed = parseInt(string.substr(i * 2, 2), 16)
if (isNaN(parsed)) throw new Error('Invalid hex string')
buf[offset + i] = parsed
}
return i
}
function utf8Write (buf, string, offset, length) {
return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)
}
function asciiWrite (buf, string, offset, length) {
return blitBuffer(asciiToBytes(string), buf, offset, length)
}
function binaryWrite (buf, string, offset, length) {
return asciiWrite(buf, string, offset, length)
}
function base64Write (buf, string, offset, length) {
return blitBuffer(base64ToBytes(string), buf, offset, length)
}
function ucs2Write (buf, string, offset, length) {
return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)
}
Buffer.prototype.write = function write (string, offset, length, encoding) {
// Buffer#write(string)
if (offset === undefined) {
encoding = 'utf8'
length = this.length
offset = 0
// Buffer#write(string, encoding)
} else if (length === undefined && typeof offset === 'string') {
encoding = offset
length = this.length
offset = 0
// Buffer#write(string, offset[, length][, encoding])
} else if (isFinite(offset)) {
offset = offset | 0
if (isFinite(length)) {
length = length | 0
if (encoding === undefined) encoding = 'utf8'
} else {
encoding = length
length = undefined
}
// legacy write(string, encoding, offset, length) - remove in v0.13
} else {
var swap = encoding
encoding = offset
offset = length | 0
length = swap
}
var remaining = this.length - offset
if (length === undefined || length > remaining) length = remaining
if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {
throw new RangeError('attempt to write outside buffer bounds')
}
if (!encoding) encoding = 'utf8'
var loweredCase = false
for (;;) {
switch (encoding) {
case 'hex':
return hexWrite(this, string, offset, length)
case 'utf8':
case 'utf-8':
return utf8Write(this, string, offset, length)
case 'ascii':
return asciiWrite(this, string, offset, length)
case 'binary':
return binaryWrite(this, string, offset, length)
case 'base64':
// Warning: maxLength not taken into account in base64Write
return base64Write(this, string, offset, length)
case 'ucs2':
case 'ucs-2':
case 'utf16le':
case 'utf-16le':
return ucs2Write(this, string, offset, length)
default:
if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
encoding = ('' + encoding).toLowerCase()
loweredCase = true
}
}
}
Buffer.prototype.toJSON = function toJSON () {
return {
type: 'Buffer',
data: Array.prototype.slice.call(this._arr || this, 0)
}
}
function base64Slice (buf, start, end) {
if (start === 0 && end === buf.length) {
return base64.fromByteArray(buf)
} else {
return base64.fromByteArray(buf.slice(start, end))
}
}
function utf8Slice (buf, start, end) {
end = Math.min(buf.length, end)
var res = []
var i = start
while (i < end) {
var firstByte = buf[i]
var codePoint = null
var bytesPerSequence = (firstByte > 0xEF) ? 4
: (firstByte > 0xDF) ? 3
: (firstByte > 0xBF) ? 2
: 1
if (i + bytesPerSequence <= end) {
var secondByte, thirdByte, fourthByte, tempCodePoint
switch (bytesPerSequence) {
case 1:
if (firstByte < 0x80) {
codePoint = firstByte
}
break
case 2:
secondByte = buf[i + 1]
if ((secondByte & 0xC0) === 0x80) {
tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)
if (tempCodePoint > 0x7F) {
codePoint = tempCodePoint
}
}
break
case 3:
secondByte = buf[i + 1]
thirdByte = buf[i + 2]
if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {
tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)
if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {
codePoint = tempCodePoint
}
}
break
case 4:
secondByte = buf[i + 1]
thirdByte = buf[i + 2]
fourthByte = buf[i + 3]
if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {
tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)
if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {
codePoint = tempCodePoint
}
}
}
}
if (codePoint === null) {
// we did not generate a valid codePoint so insert a
// replacement char (U+FFFD) and advance only 1 byte
codePoint = 0xFFFD
bytesPerSequence = 1
} else if (codePoint > 0xFFFF) {
// encode to utf16 (surrogate pair dance)
codePoint -= 0x10000
res.push(codePoint >>> 10 & 0x3FF | 0xD800)
codePoint = 0xDC00 | codePoint & 0x3FF
}
res.push(codePoint)
i += bytesPerSequence
}
return decodeCodePointsArray(res)
}
// Based on http://stackoverflow.com/a/22747272/680742, the browser with
// the lowest limit is Chrome, with 0x10000 args.
// We go 1 magnitude less, for safety
var MAX_ARGUMENTS_LENGTH = 0x1000
function decodeCodePointsArray (codePoints) {
var len = codePoints.length
if (len <= MAX_ARGUMENTS_LENGTH) {
return String.fromCharCode.apply(String, codePoints) // avoid extra slice()
}
// Decode in chunks to avoid "call stack size exceeded".
var res = ''
var i = 0
while (i < len) {
res += String.fromCharCode.apply(
String,
codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)
)
}
return res
}
function asciiSlice (buf, start, end) {
var ret = ''
end = Math.min(buf.length, end)
for (var i = start; i < end; i++) {
ret += String.fromCharCode(buf[i] & 0x7F)
}
return ret
}
function binarySlice (buf, start, end) {
var ret = ''
end = Math.min(buf.length, end)
for (var i = start; i < end; i++) {
ret += String.fromCharCode(buf[i])
}
return ret
}
function hexSlice (buf, start, end) {
var len = buf.length
if (!start || start < 0) start = 0
if (!end || end < 0 || end > len) end = len
var out = ''
for (var i = start; i < end; i++) {
out += toHex(buf[i])
}
return out
}
function utf16leSlice (buf, start, end) {
var bytes = buf.slice(start, end)
var res = ''
for (var i = 0; i < bytes.length; i += 2) {
res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256)
}
return res
}
Buffer.prototype.slice = function slice (start, end) {
var len = this.length
start = ~~start
end = end === undefined ? len : ~~end
if (start < 0) {
start += len
if (start < 0) start = 0
} else if (start > len) {
start = len
}
if (end < 0) {
end += len
if (end < 0) end = 0
} else if (end > len) {
end = len
}
if (end < start) end = start
var newBuf
if (Buffer.TYPED_ARRAY_SUPPORT) {
newBuf = Buffer._augment(this.subarray(start, end))
} else {
var sliceLen = end - start
newBuf = new Buffer(sliceLen, undefined)
for (var i = 0; i < sliceLen; i++) {
newBuf[i] = this[i + start]
}
}
if (newBuf.length) newBuf.parent = this.parent || this
return newBuf
}
/*
* Need to make sure that buffer isn't trying to write out of bounds.
*/
function checkOffset (offset, ext, length) {
if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')
if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')
}
Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {
offset = offset | 0
byteLength = byteLength | 0
if (!noAssert) checkOffset(offset, byteLength, this.length)
var val = this[offset]
var mul = 1
var i = 0
while (++i < byteLength && (mul *= 0x100)) {
val += this[offset + i] * mul
}
return val
}
Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {
offset = offset | 0
byteLength = byteLength | 0
if (!noAssert) {
checkOffset(offset, byteLength, this.length)
}
var val = this[offset + --byteLength]
var mul = 1
while (byteLength > 0 && (mul *= 0x100)) {
val += this[offset + --byteLength] * mul
}
return val
}
Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {
if (!noAssert) checkOffset(offset, 1, this.length)
return this[offset]
}
Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {
if (!noAssert) checkOffset(offset, 2, this.length)
return this[offset] | (this[offset + 1] << 8)
}
Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {
if (!noAssert) checkOffset(offset, 2, this.length)
return (this[offset] << 8) | this[offset + 1]
}
Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {
if (!noAssert) checkOffset(offset, 4, this.length)
return ((this[offset]) |
(this[offset + 1] << 8) |
(this[offset + 2] << 16)) +
(this[offset + 3] * 0x1000000)
}
Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {
if (!noAssert) checkOffset(offset, 4, this.length)
return (this[offset] * 0x1000000) +
((this[offset + 1] << 16) |
(this[offset + 2] << 8) |
this[offset + 3])
}
Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {
offset = offset | 0
byteLength = byteLength | 0
if (!noAssert) checkOffset(offset, byteLength, this.length)
var val = this[offset]
var mul = 1
var i = 0
while (++i < byteLength && (mul *= 0x100)) {
val += this[offset + i] * mul
}
mul *= 0x80
if (val >= mul) val -= Math.pow(2, 8 * byteLength)
return val
}
Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {
offset = offset | 0
byteLength = byteLength | 0
if (!noAssert) checkOffset(offset, byteLength, this.length)
var i = byteLength
var mul = 1
var val = this[offset + --i]
while (i > 0 && (mul *= 0x100)) {
val += this[offset + --i] * mul
}
mul *= 0x80
if (val >= mul) val -= Math.pow(2, 8 * byteLength)
return val
}
Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) {
if (!noAssert) checkOffset(offset, 1, this.length)
if (!(this[offset] & 0x80)) return (this[offset])
return ((0xff - this[offset] + 1) * -1)
}
Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {
if (!noAssert) checkOffset(offset, 2, this.length)
var val = this[offset] | (this[offset + 1] << 8)
return (val & 0x8000) ? val | 0xFFFF0000 : val
}
Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {
if (!noAssert) checkOffset(offset, 2, this.length)
var val = this[offset + 1] | (this[offset] << 8)
return (val & 0x8000) ? val | 0xFFFF0000 : val
}
Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {
if (!noAssert) checkOffset(offset, 4, this.length)
return (this[offset]) |
(this[offset + 1] << 8) |
(this[offset + 2] << 16) |
(this[offset + 3] << 24)
}
Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {
if (!noAssert) checkOffset(offset, 4, this.length)
return (this[offset] << 24) |
(this[offset + 1] << 16) |
(this[offset + 2] << 8) |
(this[offset + 3])
}
Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {
if (!noAssert) checkOffset(offset, 4, this.length)
return ieee754.read(this, offset, true, 23, 4)
}
Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {
if (!noAssert) checkOffset(offset, 4, this.length)
return ieee754.read(this, offset, false, 23, 4)
}
Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {
if (!noAssert) checkOffset(offset, 8, this.length)
return ieee754.read(this, offset, true, 52, 8)
}
Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {
if (!noAssert) checkOffset(offset, 8, this.length)
return ieee754.read(this, offset, false, 52, 8)
}
function checkInt (buf, value, offset, ext, max, min) {
if (!Buffer.isBuffer(buf)) throw new TypeError('buffer must be a Buffer instance')
if (value > max || value < min) throw new RangeError('value is out of bounds')
if (offset + ext > buf.length) throw new RangeError('index out of range')
}
Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {
value = +value
offset = offset | 0
byteLength = byteLength | 0
if (!noAssert) checkInt(this, value, offset, byteLength, Math.pow(2, 8 * byteLength), 0)
var mul = 1
var i = 0
this[offset] = value & 0xFF
while (++i < byteLength && (mul *= 0x100)) {
this[offset + i] = (value / mul) & 0xFF
}
return offset + byteLength
}
Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {
value = +value
offset = offset | 0
byteLength = byteLength | 0
if (!noAssert) checkInt(this, value, offset, byteLength, Math.pow(2, 8 * byteLength), 0)
var i = byteLength - 1
var mul = 1
this[offset + i] = value & 0xFF
while (--i >= 0 && (mul *= 0x100)) {
this[offset + i] = (value / mul) & 0xFF
}
return offset + byteLength
}
Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {
value = +value
offset = offset | 0
if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)
if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)
this[offset] = (value & 0xff)
return offset + 1
}
function objectWriteUInt16 (buf, value, offset, littleEndian) {
if (value < 0) value = 0xffff + value + 1
for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; i++) {
buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>>
(littleEndian ? i : 1 - i) * 8
}
}
Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {
value = +value
offset = offset | 0
if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
if (Buffer.TYPED_ARRAY_SUPPORT) {
this[offset] = (value & 0xff)
this[offset + 1] = (value >>> 8)
} else {
objectWriteUInt16(this, value, offset, true)
}
return offset + 2
}
Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {
value = +value
offset = offset | 0
if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
if (Buffer.TYPED_ARRAY_SUPPORT) {
this[offset] = (value >>> 8)
this[offset + 1] = (value & 0xff)
} else {
objectWriteUInt16(this, value, offset, false)
}
return offset + 2
}
function objectWriteUInt32 (buf, value, offset, littleEndian) {
if (value < 0) value = 0xffffffff + value + 1
for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; i++) {
buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff
}
}
Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {
value = +value
offset = offset | 0
if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
if (Buffer.TYPED_ARRAY_SUPPORT) {
this[offset + 3] = (value >>> 24)
this[offset + 2] = (value >>> 16)
this[offset + 1] = (value >>> 8)
this[offset] = (value & 0xff)
} else {
objectWriteUInt32(this, value, offset, true)
}
return offset + 4
}
Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {
value = +value
offset = offset | 0
if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
if (Buffer.TYPED_ARRAY_SUPPORT) {
this[offset] = (value >>> 24)
this[offset + 1] = (value >>> 16)
this[offset + 2] = (value >>> 8)
this[offset + 3] = (value & 0xff)
} else {
objectWriteUInt32(this, value, offset, false)
}
return offset + 4
}
Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {
value = +value
offset = offset | 0
if (!noAssert) {
var limit = Math.pow(2, 8 * byteLength - 1)
checkInt(this, value, offset, byteLength, limit - 1, -limit)
}
var i = 0
var mul = 1
var sub = value < 0 ? 1 : 0
this[offset] = value & 0xFF
while (++i < byteLength && (mul *= 0x100)) {
this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
}
return offset + byteLength
}
Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {
value = +value
offset = offset | 0
if (!noAssert) {
var limit = Math.pow(2, 8 * byteLength - 1)
checkInt(this, value, offset, byteLength, limit - 1, -limit)
}
var i = byteLength - 1
var mul = 1
var sub = value < 0 ? 1 : 0
this[offset + i] = value & 0xFF
while (--i >= 0 && (mul *= 0x100)) {
this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
}
return offset + byteLength
}
Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {
value = +value
offset = offset | 0
if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)
if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)
if (value < 0) value = 0xff + value + 1
this[offset] = (value & 0xff)
return offset + 1
}
Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {
value = +value
offset = offset | 0
if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
if (Buffer.TYPED_ARRAY_SUPPORT) {
this[offset] = (value & 0xff)
this[offset + 1] = (value >>> 8)
} else {
objectWriteUInt16(this, value, offset, true)
}
return offset + 2
}
Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {
value = +value
offset = offset | 0
if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
if (Buffer.TYPED_ARRAY_SUPPORT) {
this[offset] = (value >>> 8)
this[offset + 1] = (value & 0xff)
} else {
objectWriteUInt16(this, value, offset, false)
}
return offset + 2
}
Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {
value = +value
offset = offset | 0
if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
if (Buffer.TYPED_ARRAY_SUPPORT) {
this[offset] = (value & 0xff)
this[offset + 1] = (value >>> 8)
this[offset + 2] = (value >>> 16)
this[offset + 3] = (value >>> 24)
} else {
objectWriteUInt32(this, value, offset, true)
}
return offset + 4
}
Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {
value = +value
offset = offset | 0
if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
if (value < 0) value = 0xffffffff + value + 1
if (Buffer.TYPED_ARRAY_SUPPORT) {
this[offset] = (value >>> 24)
this[offset + 1] = (value >>> 16)
this[offset + 2] = (value >>> 8)
this[offset + 3] = (value & 0xff)
} else {
objectWriteUInt32(this, value, offset, false)
}
return offset + 4
}
function checkIEEE754 (buf, value, offset, ext, max, min) {
if (value > max || value < min) throw new RangeError('value is out of bounds')
if (offset + ext > buf.length) throw new RangeError('index out of range')
if (offset < 0) throw new RangeError('index out of range')
}
function writeFloat (buf, value, offset, littleEndian, noAssert) {
if (!noAssert) {
checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)
}
ieee754.write(buf, value, offset, littleEndian, 23, 4)
return offset + 4
}
Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {
return writeFloat(this, value, offset, true, noAssert)
}
Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {
return writeFloat(this, value, offset, false, noAssert)
}
function writeDouble (buf, value, offset, littleEndian, noAssert) {
if (!noAssert) {
checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)
}
ieee754.write(buf, value, offset, littleEndian, 52, 8)
return offset + 8
}
Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {
return writeDouble(this, value, offset, true, noAssert)
}
Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {
return writeDouble(this, value, offset, false, noAssert)
}
// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)
Buffer.prototype.copy = function copy (target, targetStart, start, end) {
if (!start) start = 0
if (!end && end !== 0) end = this.length
if (targetStart >= target.length) targetStart = target.length
if (!targetStart) targetStart = 0
if (end > 0 && end < start) end = start
// Copy 0 bytes; we're done
if (end === start) return 0
if (target.length === 0 || this.length === 0) return 0
// Fatal error conditions
if (targetStart < 0) {
throw new RangeError('targetStart out of bounds')
}
if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds')
if (end < 0) throw new RangeError('sourceEnd out of bounds')
// Are we oob?
if (end > this.length) end = this.length
if (target.length - targetStart < end - start) {
end = target.length - targetStart + start
}
var len = end - start
var i
if (this === target && start < targetStart && targetStart < end) {
// descending copy from end
for (i = len - 1; i >= 0; i--) {
target[i + targetStart] = this[i + start]
}
} else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {
// ascending copy from start
for (i = 0; i < len; i++) {
target[i + targetStart] = this[i + start]
}
} else {
target._set(this.subarray(start, start + len), targetStart)
}
return len
}
// fill(value, start=0, end=buffer.length)
Buffer.prototype.fill = function fill (value, start, end) {
if (!value) value = 0
if (!start) start = 0
if (!end) end = this.length
if (end < start) throw new RangeError('end < start')
// Fill 0 bytes; we're done
if (end === start) return
if (this.length === 0) return
if (start < 0 || start >= this.length) throw new RangeError('start out of bounds')
if (end < 0 || end > this.length) throw new RangeError('end out of bounds')
var i
if (typeof value === 'number') {
for (i = start; i < end; i++) {
this[i] = value
}
} else {
var bytes = utf8ToBytes(value.toString())
var len = bytes.length
for (i = start; i < end; i++) {
this[i] = bytes[i % len]
}
}
return this
}
/**
* Creates a new `ArrayBuffer` with the *copied* memory of the buffer instance.
* Added in Node 0.12. Only available in browsers that support ArrayBuffer.
*/
Buffer.prototype.toArrayBuffer = function toArrayBuffer () {
if (typeof Uint8Array !== 'undefined') {
if (Buffer.TYPED_ARRAY_SUPPORT) {
return (new Buffer(this)).buffer
} else {
var buf = new Uint8Array(this.length)
for (var i = 0, len = buf.length; i < len; i += 1) {
buf[i] = this[i]
}
return buf.buffer
}
} else {
throw new TypeError('Buffer.toArrayBuffer not supported in this browser')
}
}
// HELPER FUNCTIONS
// ================
var BP = Buffer.prototype
/**
* Augment a Uint8Array *instance* (not the Uint8Array class!) with Buffer methods
*/
Buffer._augment = function _augment (arr) {
arr.constructor = Buffer
arr._isBuffer = true
// save reference to original Uint8Array set method before overwriting
arr._set = arr.set
// deprecated
arr.get = BP.get
arr.set = BP.set
arr.write = BP.write
arr.toString = BP.toString
arr.toLocaleString = BP.toString
arr.toJSON = BP.toJSON
arr.equals = BP.equals
arr.compare = BP.compare
arr.indexOf = BP.indexOf
arr.copy = BP.copy
arr.slice = BP.slice
arr.readUIntLE = BP.readUIntLE
arr.readUIntBE = BP.readUIntBE
arr.readUInt8 = BP.readUInt8
arr.readUInt16LE = BP.readUInt16LE
arr.readUInt16BE = BP.readUInt16BE
arr.readUInt32LE = BP.readUInt32LE
arr.readUInt32BE = BP.readUInt32BE
arr.readIntLE = BP.readIntLE
arr.readIntBE = BP.readIntBE
arr.readInt8 = BP.readInt8
arr.readInt16LE = BP.readInt16LE
arr.readInt16BE = BP.readInt16BE
arr.readInt32LE = BP.readInt32LE
arr.readInt32BE = BP.readInt32BE
arr.readFloatLE = BP.readFloatLE
arr.readFloatBE = BP.readFloatBE
arr.readDoubleLE = BP.readDoubleLE
arr.readDoubleBE = BP.readDoubleBE
arr.writeUInt8 = BP.writeUInt8
arr.writeUIntLE = BP.writeUIntLE
arr.writeUIntBE = BP.writeUIntBE
arr.writeUInt16LE = BP.writeUInt16LE
arr.writeUInt16BE = BP.writeUInt16BE
arr.writeUInt32LE = BP.writeUInt32LE
arr.writeUInt32BE = BP.writeUInt32BE
arr.writeIntLE = BP.writeIntLE
arr.writeIntBE = BP.writeIntBE
arr.writeInt8 = BP.writeInt8
arr.writeInt16LE = BP.writeInt16LE
arr.writeInt16BE = BP.writeInt16BE
arr.writeInt32LE = BP.writeInt32LE
arr.writeInt32BE = BP.writeInt32BE
arr.writeFloatLE = BP.writeFloatLE
arr.writeFloatBE = BP.writeFloatBE
arr.writeDoubleLE = BP.writeDoubleLE
arr.writeDoubleBE = BP.writeDoubleBE
arr.fill = BP.fill
arr.inspect = BP.inspect
arr.toArrayBuffer = BP.toArrayBuffer
return arr
}
var INVALID_BASE64_RE = /[^+\/0-9A-Za-z-_]/g
function base64clean (str) {
// Node strips out invalid characters like \n and \t from the string, base64-js does not
str = stringtrim(str).replace(INVALID_BASE64_RE, '')
// Node converts strings with length < 2 to ''
if (str.length < 2) return ''
// Node allows for non-padded base64 strings (missing trailing ===), base64-js does not
while (str.length % 4 !== 0) {
str = str + '='
}
return str
}
function stringtrim (str) {
if (str.trim) return str.trim()
return str.replace(/^\s+|\s+$/g, '')
}
function toHex (n) {
if (n < 16) return '0' + n.toString(16)
return n.toString(16)
}
function utf8ToBytes (string, units) {
units = units || Infinity
var codePoint
var length = string.length
var leadSurrogate = null
var bytes = []
for (var i = 0; i < length; i++) {
codePoint = string.charCodeAt(i)
// is surrogate component
if (codePoint > 0xD7FF && codePoint < 0xE000) {
// last char was a lead
if (!leadSurrogate) {
// no lead yet
if (codePoint > 0xDBFF) {
// unexpected trail
if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
continue
} else if (i + 1 === length) {
// unpaired lead
if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
continue
}
// valid lead
leadSurrogate = codePoint
continue
}
// 2 leads in a row
if (codePoint < 0xDC00) {
if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
leadSurrogate = codePoint
continue
}
// valid surrogate pair
codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000
} else if (leadSurrogate) {
// valid bmp char, but last char was a lead
if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
}
leadSurrogate = null
// encode utf8
if (codePoint < 0x80) {
if ((units -= 1) < 0) break
bytes.push(codePoint)
} else if (codePoint < 0x800) {
if ((units -= 2) < 0) break
bytes.push(
codePoint >> 0x6 | 0xC0,
codePoint & 0x3F | 0x80
)
} else if (codePoint < 0x10000) {
if ((units -= 3) < 0) break
bytes.push(
codePoint >> 0xC | 0xE0,
codePoint >> 0x6 & 0x3F | 0x80,
codePoint & 0x3F | 0x80
)
} else if (codePoint < 0x110000) {
if ((units -= 4) < 0) break
bytes.push(
codePoint >> 0x12 | 0xF0,
codePoint >> 0xC & 0x3F | 0x80,
codePoint >> 0x6 & 0x3F | 0x80,
codePoint & 0x3F | 0x80
)
} else {
throw new Error('Invalid code point')
}
}
return bytes
}
function asciiToBytes (str) {
var byteArray = []
for (var i = 0; i < str.length; i++) {
// Node's code seems to be doing this and not & 0x7F..
byteArray.push(str.charCodeAt(i) & 0xFF)
}
return byteArray
}
function utf16leToBytes (str, units) {
var c, hi, lo
var byteArray = []
for (var i = 0; i < str.length; i++) {
if ((units -= 2) < 0) break
c = str.charCodeAt(i)
hi = c >> 8
lo = c % 256
byteArray.push(lo)
byteArray.push(hi)
}
return byteArray
}
function base64ToBytes (str) {
return base64.toByteArray(base64clean(str))
}
function blitBuffer (src, dst, offset, length) {
for (var i = 0; i < length; i++) {
if ((i + offset >= dst.length) || (i >= src.length)) break
dst[i + offset] = src[i]
}
return i
}
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(304).Buffer, (function() { return this; }())))
/***/ },
/* 305 */
/***/ function(module, exports, __webpack_require__) {
var lookup = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
;(function (exports) {
'use strict';
var Arr = (typeof Uint8Array !== 'undefined')
? Uint8Array
: Array
var PLUS = '+'.charCodeAt(0)
var SLASH = '/'.charCodeAt(0)
var NUMBER = '0'.charCodeAt(0)
var LOWER = 'a'.charCodeAt(0)
var UPPER = 'A'.charCodeAt(0)
var PLUS_URL_SAFE = '-'.charCodeAt(0)
var SLASH_URL_SAFE = '_'.charCodeAt(0)
function decode (elt) {
var code = elt.charCodeAt(0)
if (code === PLUS ||
code === PLUS_URL_SAFE)
return 62 // '+'
if (code === SLASH ||
code === SLASH_URL_SAFE)
return 63 // '/'
if (code < NUMBER)
return -1 //no match
if (code < NUMBER + 10)
return code - NUMBER + 26 + 26
if (code < UPPER + 26)
return code - UPPER
if (code < LOWER + 26)
return code - LOWER + 26
}
function b64ToByteArray (b64) {
var i, j, l, tmp, placeHolders, arr
if (b64.length % 4 > 0) {
throw new Error('Invalid string. Length must be a multiple of 4')
}
// the number of equal signs (place holders)
// if there are two placeholders, than the two characters before it
// represent one byte
// if there is only one, then the three characters before it represent 2 bytes
// this is just a cheap hack to not do indexOf twice
var len = b64.length
placeHolders = '=' === b64.charAt(len - 2) ? 2 : '=' === b64.charAt(len - 1) ? 1 : 0
// base64 is 4/3 + up to two characters of the original data
arr = new Arr(b64.length * 3 / 4 - placeHolders)
// if there are placeholders, only get up to the last complete 4 chars
l = placeHolders > 0 ? b64.length - 4 : b64.length
var L = 0
function push (v) {
arr[L++] = v
}
for (i = 0, j = 0; i < l; i += 4, j += 3) {
tmp = (decode(b64.charAt(i)) << 18) | (decode(b64.charAt(i + 1)) << 12) | (decode(b64.charAt(i + 2)) << 6) | decode(b64.charAt(i + 3))
push((tmp & 0xFF0000) >> 16)
push((tmp & 0xFF00) >> 8)
push(tmp & 0xFF)
}
if (placeHolders === 2) {
tmp = (decode(b64.charAt(i)) << 2) | (decode(b64.charAt(i + 1)) >> 4)
push(tmp & 0xFF)
} else if (placeHolders === 1) {
tmp = (decode(b64.charAt(i)) << 10) | (decode(b64.charAt(i + 1)) << 4) | (decode(b64.charAt(i + 2)) >> 2)
push((tmp >> 8) & 0xFF)
push(tmp & 0xFF)
}
return arr
}
function uint8ToBase64 (uint8) {
var i,
extraBytes = uint8.length % 3, // if we have 1 byte left, pad 2 bytes
output = "",
temp, length
function encode (num) {
return lookup.charAt(num)
}
function tripletToBase64 (num) {
return encode(num >> 18 & 0x3F) + encode(num >> 12 & 0x3F) + encode(num >> 6 & 0x3F) + encode(num & 0x3F)
}
// go through the array every three bytes, we'll deal with trailing stuff later
for (i = 0, length = uint8.length - extraBytes; i < length; i += 3) {
temp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2])
output += tripletToBase64(temp)
}
// pad the end with zeros, but make sure to not forget the extra bytes
switch (extraBytes) {
case 1:
temp = uint8[uint8.length - 1]
output += encode(temp >> 2)
output += encode((temp << 4) & 0x3F)
output += '=='
break
case 2:
temp = (uint8[uint8.length - 2] << 8) + (uint8[uint8.length - 1])
output += encode(temp >> 10)
output += encode((temp >> 4) & 0x3F)
output += encode((temp << 2) & 0x3F)
output += '='
break
}
return output
}
exports.toByteArray = b64ToByteArray
exports.fromByteArray = uint8ToBase64
}( false ? (this.base64js = {}) : exports))
/***/ },
/* 306 */
/***/ function(module, exports) {
exports.read = function (buffer, offset, isLE, mLen, nBytes) {
var e, m
var eLen = nBytes * 8 - mLen - 1
var eMax = (1 << eLen) - 1
var eBias = eMax >> 1
var nBits = -7
var i = isLE ? (nBytes - 1) : 0
var d = isLE ? -1 : 1
var s = buffer[offset + i]
i += d
e = s & ((1 << (-nBits)) - 1)
s >>= (-nBits)
nBits += eLen
for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {}
m = e & ((1 << (-nBits)) - 1)
e >>= (-nBits)
nBits += mLen
for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {}
if (e === 0) {
e = 1 - eBias
} else if (e === eMax) {
return m ? NaN : ((s ? -1 : 1) * Infinity)
} else {
m = m + Math.pow(2, mLen)
e = e - eBias
}
return (s ? -1 : 1) * m * Math.pow(2, e - mLen)
}
exports.write = function (buffer, value, offset, isLE, mLen, nBytes) {
var e, m, c
var eLen = nBytes * 8 - mLen - 1
var eMax = (1 << eLen) - 1
var eBias = eMax >> 1
var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)
var i = isLE ? 0 : (nBytes - 1)
var d = isLE ? 1 : -1
var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0
value = Math.abs(value)
if (isNaN(value) || value === Infinity) {
m = isNaN(value) ? 1 : 0
e = eMax
} else {
e = Math.floor(Math.log(value) / Math.LN2)
if (value * (c = Math.pow(2, -e)) < 1) {
e--
c *= 2
}
if (e + eBias >= 1) {
value += rt / c
} else {
value += rt * Math.pow(2, 1 - eBias)
}
if (value * c >= 2) {
e++
c /= 2
}
if (e + eBias >= eMax) {
m = 0
e = eMax
} else if (e + eBias >= 1) {
m = (value * c - 1) * Math.pow(2, mLen)
e = e + eBias
} else {
m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)
e = 0
}
}
for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}
e = (e << mLen) | m
eLen += mLen
for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}
buffer[offset + i - d] |= s * 128
}
/***/ },
/* 307 */
/***/ function(module, exports) {
var toString = {}.toString;
module.exports = Array.isArray || function (arr) {
return toString.call(arr) == '[object Array]';
};
/***/ },
/* 308 */
/***/ function(module, exports) {
/***/ },
/* 309 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _Log = __webpack_require__(292);
var _Log2 = _interopRequireDefault(_Log);
var _UrlUtility = __webpack_require__(310);
var _UrlUtility2 = _interopRequireDefault(_UrlUtility);
var _SigninState = __webpack_require__(311);
var _SigninState2 = _interopRequireDefault(_SigninState);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var SigninRequest = function () {
function SigninRequest(_ref) {
var
// mandatory
url = _ref.url;
var client_id = _ref.client_id;
var redirect_uri = _ref.redirect_uri;
var response_type = _ref.response_type;
var scope = _ref.scope;
var authority = _ref.authority;
var
// optional
data = _ref.data;
var prompt = _ref.prompt;
var display = _ref.display;
var max_age = _ref.max_age;
var ui_locales = _ref.ui_locales;
var id_token_hint = _ref.id_token_hint;
var login_hint = _ref.login_hint;
var acr_values = _ref.acr_values;
_classCallCheck(this, SigninRequest);
if (!url) {
_Log2.default.error("No url passed to SigninRequest");
throw new Error("url");
}
if (!client_id) {
_Log2.default.error("No client_id passed to SigninRequest");
throw new Error("client_id");
}
if (!redirect_uri) {
_Log2.default.error("No redirect_uri passed to SigninRequest");
throw new Error("redirect_uri");
}
if (!response_type) {
_Log2.default.error("No response_type passed to SigninRequest");
throw new Error("response_type");
}
if (!scope) {
_Log2.default.error("No scope passed to SigninRequest");
throw new Error("scope");
}
if (!authority) {
_Log2.default.error("No authority passed to SigninRequest");
throw new Error("authority");
}
var oidc = SigninRequest.isOidc(response_type);
this.state = new _SigninState2.default({ nonce: oidc, data: data, client_id: client_id, authority: authority });
url = _UrlUtility2.default.addQueryParam(url, "client_id", client_id);
url = _UrlUtility2.default.addQueryParam(url, "redirect_uri", redirect_uri);
url = _UrlUtility2.default.addQueryParam(url, "response_type", response_type);
url = _UrlUtility2.default.addQueryParam(url, "scope", scope);
url = _UrlUtility2.default.addQueryParam(url, "state", this.state.id);
if (oidc) {
url = _UrlUtility2.default.addQueryParam(url, "nonce", this.state.nonce);
}
var optional = { prompt: prompt, display: display, max_age: max_age, ui_locales: ui_locales, id_token_hint: id_token_hint, login_hint: login_hint, acr_values: acr_values };
for (var key in optional) {
if (optional[key]) {
url = _UrlUtility2.default.addQueryParam(url, key, optional[key]);
}
}
this.url = url;
}
SigninRequest.isOidc = function isOidc(response_type) {
var result = response_type.split(/\s+/g).filter(function (item) {
return item === "id_token";
});
return !!result[0];
};
SigninRequest.isOAuth = function isOAuth(response_type) {
var result = response_type.split(/\s+/g).filter(function (item) {
return item === "token";
});
return !!result[0];
};
return SigninRequest;
}();
exports.default = SigninRequest;
module.exports = exports['default'];
/***/ },
/* 310 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _Log = __webpack_require__(292);
var _Log2 = _interopRequireDefault(_Log);
var _Global = __webpack_require__(296);
var _Global2 = _interopRequireDefault(_Global);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var UrlUtility = function () {
function UrlUtility() {
_classCallCheck(this, UrlUtility);
}
UrlUtility.addQueryParam = function addQueryParam(url, name, value) {
if (url.indexOf('?') < 0) {
url += "?";
}
if (url[url.length - 1] !== "?") {
url += "&";
}
url += encodeURIComponent(name);
url += "=";
url += encodeURIComponent(value);
return url;
};
UrlUtility.parseUrlFragment = function parseUrlFragment(value) {
var delimiter = arguments.length <= 1 || arguments[1] === undefined ? "#" : arguments[1];
var global = arguments.length <= 2 || arguments[2] === undefined ? _Global2.default : arguments[2];
_Log2.default.info("UrlUtility.parseUrlFragment");
if (typeof value !== 'string') {
value = global.location.href;
}
var idx = value.lastIndexOf(delimiter);
if (idx >= 0) {
value = value.substr(idx + 1);
}
var params = {},
regex = /([^&=]+)=([^&]*)/g,
m;
var counter = 0;
while (m = regex.exec(value)) {
params[decodeURIComponent(m[1])] = decodeURIComponent(m[2]);
if (counter++ > 50) {
_Log2.default.error("response exceeded expected number of parameters", value);
return {
error: "Response exceeded expected number of parameters"
};
}
}
for (var prop in params) {
return params;
}
return {};
};
return UrlUtility;
}();
exports.default = UrlUtility;
module.exports = exports['default'];
/***/ },
/* 311 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _Log = __webpack_require__(292);
var _Log2 = _interopRequireDefault(_Log);
var _State2 = __webpack_require__(312);
var _State3 = _interopRequireDefault(_State2);
var _random = __webpack_require__(313);
var _random2 = _interopRequireDefault(_random);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var SigninState = function (_State) {
_inherits(SigninState, _State);
function SigninState() {
var _ref = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
var nonce = _ref.nonce;
var authority = _ref.authority;
var client_id = _ref.client_id;
_classCallCheck(this, SigninState);
var _this = _possibleConstructorReturn(this, _State.call(this, arguments[0]));
if (nonce === true) {
_this._nonce = (0, _random2.default)();
} else if (nonce) {
_this._nonce = nonce;
}
_this._authority = authority;
_this._client_id = client_id;
return _this;
}
SigninState.prototype.toStorageString = function toStorageString() {
_Log2.default.info("SigninState.toStorageString");
return JSON.stringify({
id: this.id,
data: this.data,
created: this.created,
nonce: this.nonce,
authority: this.authority,
client_id: this.client_id
});
};
SigninState.fromStorageString = function fromStorageString(storageString) {
_Log2.default.info("SigninState.fromStorageString");
var data = JSON.parse(storageString);
return new SigninState(data);
};
_createClass(SigninState, [{
key: 'nonce',
get: function get() {
return this._nonce;
}
}, {
key: 'authority',
get: function get() {
return this._authority;
}
}, {
key: 'client_id',
get: function get() {
return this._client_id;
}
}]);
return SigninState;
}(_State3.default);
exports.default = SigninState;
module.exports = exports['default'];
/***/ },
/* 312 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var _Log = __webpack_require__(292);
var _Log2 = _interopRequireDefault(_Log);
var _random = __webpack_require__(313);
var _random2 = _interopRequireDefault(_random);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var State = function () {
function State() {
var _ref = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
var id = _ref.id;
var data = _ref.data;
var created = _ref.created;
_classCallCheck(this, State);
this._id = id || (0, _random2.default)();
this._data = data;
if (typeof created === 'number' && created > 0) {
this._created = created;
} else {
this._created = parseInt(Date.now() / 1000);
}
}
State.prototype.toStorageString = function toStorageString() {
_Log2.default.info("State.toStorageString");
return JSON.stringify({
id: this.id,
data: this.data,
created: this.created
});
};
State.fromStorageString = function fromStorageString(storageString) {
_Log2.default.info("State.fromStorageString");
return new State(JSON.parse(storageString));
};
State.clearStaleState = function clearStaleState(storage, age) {
_Log2.default.info("State.clearStaleState");
var cutoff = Date.now() / 1000 - age;
return storage.getAllKeys().then(function (keys) {
_Log2.default.info("got keys", keys);
var promises = [];
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
var _loop = function _loop() {
var key = _step.value;
p = storage.get(key).then(function (item) {
var remove = false;
if (item) {
try {
var state = State.fromStorageString(item);
_Log2.default.info("got item from key: ", key, state.created);
if (state.created <= cutoff) {
remove = true;
}
} catch (e) {
_Log2.default.error("Error parsing state for key", key, e.message);
remove = true;
}
} else {
_Log2.default.info("no item in storage for key: ", key);
remove = true;
}
if (remove) {
_Log2.default.info("removed item for key: ", key);
return storage.remove(key);
}
});
promises.push(p);
};
for (var _iterator = keys[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var p;
_loop();
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
_Log2.default.info("waiting on promise count:", promises.length);
return Promise.all(promises);
});
};
_createClass(State, [{
key: 'id',
get: function get() {
return this._id;
}
}, {
key: 'data',
get: function get() {
return this._data;
}
}, {
key: 'created',
get: function get() {
return this._created;
}
}]);
return State;
}();
exports.default = State;
module.exports = exports['default'];
/***/ },
/* 313 */
/***/ function(module, exports) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = random;
//----------------------------------------------------------------------
// AdalJS v1.0.8
// @preserve Copyright (c) Microsoft Open Technologies, Inc.
// All Rights Reserved
// Apache License 2.0
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//----------------------------------------------------------------------
// NOTICE: the code in this file originally developed by Microsoft
// original source: https://github.com/AzureAD/azure-activedirectory-library-for-js/blob/master/lib/adal.js#L1029
function random() {
var guidHolder = 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx';
var hex = '0123456789abcdef';
var r = 0;
var guidResponse = "";
for (var i = 0; i < guidHolder.length; i++) {
if (guidHolder[i] !== '-' && guidHolder[i] !== '4') {
// each x and y needs to be random
r = Math.random() * 16 | 0;
}
if (guidHolder[i] === 'x') {
guidResponse += hex[r];
} else if (guidHolder[i] === 'y') {
// clock-seq-and-reserved first hex is filtered and remaining hex values are random
r &= 0x3; // bit and with 0011 to set pos 2 to zero ?0??
r |= 0x8; // set pos 3 to 1 as 1???
guidResponse += hex[r];
} else {
guidResponse += guidHolder[i];
}
}
return guidResponse;
}
module.exports = exports['default'];
/***/ },
/* 314 */
/***/ function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var _UrlUtility = __webpack_require__(310);
var _UrlUtility2 = _interopRequireDefault(_UrlUtility);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var OidcScope = "openid";
var SigninResponse = function () {
function SigninResponse(url) {
_classCallCheck(this, SigninResponse);
var values = _UrlUtility2.default.parseUrlFragment(url, "#");
this.error = values.error;
this.error_description = values.error_description;
this.error_uri = values.error_uri;
this.state = values.state;
this.id_token = values.id_token;
this.session_state = values.session_state;
this.access_token = values.access_token;
this.token_type = values.token_type;
this.scope = values.scope;
this.profile = undefined; // will be set from ResponseValidator
var expires_in = parseInt(values.expires_in);
if (typeof expires_in === 'number' && expires_in > 0) {
var now = parseInt(Date.now() / 1000);
this.expires_at = now + expires_in;
}
}
_createClass(SigninResponse, [{
key: "expires_in",
get: function get() {
if (this.expires_at) {
var now = parseInt(Date.now() / 1000);
return this.expires_at - now;
}
return undefined;
}
}, {
key: "expired",
get: function get() {
var expires_in = this.expires_in;
if (expires_in !== undefined) {
return expires_in <= 0;
}
return undefined;
}
}, {
key: "scopes",
get: function get() {
return (this.scope || "").split(" ");
}
}, {
key: "isOpenIdConnect",
get: function get() {
return this.scopes.indexOf(OidcScope) >= 0;
}
}]);
return SigninResponse;
}();
exports.default = SigninResponse;
module.exports = exports['default'];
/***/ },
/* 315 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _Log = __webpack_require__(292);
var _Log2 = _interopRequireDefault(_Log);
var _UrlUtility = __webpack_require__(310);
var _UrlUtility2 = _interopRequireDefault(_UrlUtility);
var _State = __webpack_require__(312);
var _State2 = _interopRequireDefault(_State);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var SignoutRequest = function SignoutRequest(_ref) {
var url = _ref.url;
var id_token_hint = _ref.id_token_hint;
var post_logout_redirect_uri = _ref.post_logout_redirect_uri;
var data = _ref.data;
_classCallCheck(this, SignoutRequest);
if (!url) {
_Log2.default.error("No url passed to SignoutRequest");
throw new Error("url");
}
if (id_token_hint) {
url = _UrlUtility2.default.addQueryParam(url, "id_token_hint", id_token_hint);
if (post_logout_redirect_uri) {
url = _UrlUtility2.default.addQueryParam(url, "post_logout_redirect_uri", post_logout_redirect_uri);
if (data) {
this.state = new _State2.default({ data: data });
url = _UrlUtility2.default.addQueryParam(url, "state", this.state.id);
}
}
}
this.url = url;
};
exports.default = SignoutRequest;
module.exports = exports['default'];
/***/ },
/* 316 */
/***/ function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _UrlUtility = __webpack_require__(310);
var _UrlUtility2 = _interopRequireDefault(_UrlUtility);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var SignoutResponse = function SignoutResponse(url) {
_classCallCheck(this, SignoutResponse);
var values = _UrlUtility2.default.parseUrlFragment(url, "?");
this.error = values.error;
this.error_description = values.error_description;
this.error_uri = values.error_uri;
this.state = values.state;
};
exports.default = SignoutResponse;
module.exports = exports['default'];
/***/ },
/* 317 */
/***/ function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var _Log = __webpack_require__(292);
var _Log2 = _interopRequireDefault(_Log);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var InMemoryWebStorage = function () {
function InMemoryWebStorage() {
_classCallCheck(this, InMemoryWebStorage);
this._data = {};
}
InMemoryWebStorage.prototype.getItem = function getItem(key) {
_Log2.default.info("InMemoryWebStorage.getItem", key);
return this._data[key];
};
InMemoryWebStorage.prototype.setItem = function setItem(key, value) {
_Log2.default.info("InMemoryWebStorage.setItem", key);
this._data[key] = value;
};
InMemoryWebStorage.prototype.removeItem = function removeItem(key) {
_Log2.default.info("InMemoryWebStorage.removeItem", key);
delete this._data[key];
};
InMemoryWebStorage.prototype.key = function key(index) {
return Object.getOwnPropertyNames(this._data)[index];
};
_createClass(InMemoryWebStorage, [{
key: "length",
get: function get() {
return Object.getOwnPropertyNames(this._data).length;
}
}]);
return InMemoryWebStorage;
}();
exports.default = InMemoryWebStorage;
module.exports = exports['default'];
/***/ },
/* 318 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _Log = __webpack_require__(292);
var _Log2 = _interopRequireDefault(_Log);
var _OidcClient2 = __webpack_require__(293);
var _OidcClient3 = _interopRequireDefault(_OidcClient2);
var _UserManagerSettings = __webpack_require__(319);
var _UserManagerSettings2 = _interopRequireDefault(_UserManagerSettings);
var _User = __webpack_require__(325);
var _User2 = _interopRequireDefault(_User);
var _UserManagerEvents = __webpack_require__(326);
var _UserManagerEvents2 = _interopRequireDefault(_UserManagerEvents);
var _SilentRenewService = __webpack_require__(330);
var _SilentRenewService2 = _interopRequireDefault(_SilentRenewService);
var _SessionMonitor = __webpack_require__(331);
var _SessionMonitor2 = _interopRequireDefault(_SessionMonitor);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var UserManager = function (_OidcClient) {
_inherits(UserManager, _OidcClient);
function UserManager() {
var settings = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
var SilentRenewServiceCtor = arguments.length <= 1 || arguments[1] === undefined ? _SilentRenewService2.default : arguments[1];
var SessionMonitorCtor = arguments.length <= 2 || arguments[2] === undefined ? _SessionMonitor2.default : arguments[2];
_classCallCheck(this, UserManager);
if (!(settings instanceof _UserManagerSettings2.default)) {
settings = new _UserManagerSettings2.default(settings);
}
var _this = _possibleConstructorReturn(this, _OidcClient.call(this, settings));
_this._events = new _UserManagerEvents2.default(settings);
// order is important for the following properties; these services depend upon the events.
if (_this.settings.automaticSilentRenew) {
_Log2.default.info("automaticSilentRenew is configured, setting up silent renew");
_this._silentRenewService = new SilentRenewServiceCtor(_this);
}
if (_this.settings.monitorSession) {
_Log2.default.info("monitorSession is configured, setting up session monitor");
_this._sessionMonitor = new SessionMonitorCtor(_this);
}
return _this;
}
UserManager.prototype.getUser = function getUser() {
var _this2 = this;
_Log2.default.info("UserManager.getUser");
return this._loadUser().then(function (user) {
if (user) {
_Log2.default.info("user loaded");
_this2._events.load(user, false);
return user;
} else {
_Log2.default.info("user not found in storage");
return null;
}
});
};
UserManager.prototype.removeUser = function removeUser() {
var _this3 = this;
_Log2.default.info("UserManager.removeUser");
return this._storeUser(null).then(function () {
_Log2.default.info("user removed from storage");
_this3._events.unload();
});
};
UserManager.prototype.signinPopup = function signinPopup() {
var args = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
_Log2.default.info("UserManager.signinPopup");
var url = args.redirect_uri || this.settings.popup_redirect_uri || this.settings.redirect_uri;
if (!url) {
_Log2.default.error("No popup_redirect_uri or redirect_uri configured");
return Promise.reject(new Error("No popup_redirect_uri or redirect_uri configured"));
}
args.redirect_uri = url;
args.display = "popup";
return this._signin(args, this._popupNavigator, {
startUrl: url,
popupWindowFeatures: args.popupWindowFeatures || this.settings.popupWindowFeatures,
popupWindowTarget: args.popupWindowTarget || this.settings.popupWindowTarget
});
};
UserManager.prototype.signinPopupCallback = function signinPopupCallback(url) {
_Log2.default.info("UserManager.signinPopupCallback");
return this._signinCallback(url, this._popupNavigator);
};
UserManager.prototype.signinSilent = function signinSilent() {
var args = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
_Log2.default.info("UserManager.signinSilent");
var url = args.redirect_uri || this.settings.silent_redirect_uri;
if (!url) {
_Log2.default.error("No silent_redirect_uri configured");
return Promise.reject(new Error("No silent_redirect_uri configured"));
}
args.redirect_uri = url;
args.prompt = "none";
return this._signin(args, this._iframeNavigator, {
startUrl: url,
silentRequestTimeout: args.silentRequestTimeout || this.settings.silentRequestTimeout
});
};
UserManager.prototype.signinSilentCallback = function signinSilentCallback(url) {
_Log2.default.info("UserManager.signinSilentCallback");
return this._signinCallback(url, this._iframeNavigator);
};
UserManager.prototype.querySessionStatus = function querySessionStatus() {
var _this4 = this;
var args = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
_Log2.default.info("UserManager.querySessionStatus");
var url = args.redirect_uri || this.settings.silent_redirect_uri;
if (!url) {
_Log2.default.error("No silent_redirect_uri configured");
return Promise.reject(new Error("No silent_redirect_uri configured"));
}
args.redirect_uri = url;
args.prompt = "none";
args.response_type = "id_token";
args.scope = "openid";
return this._signinStart(args, this._iframeNavigator, {
startUrl: url,
silentRequestTimeout: args.silentRequestTimeout || this.settings.silentRequestTimeout
}).then(function (navResponse) {
return _this4.processSigninResponse(navResponse.url).then(function (signinResponse) {
_Log2.default.info("got signin response");
if (signinResponse.session_state && signinResponse.profile.sub) {
return {
session_state: signinResponse.session_state,
sub: signinResponse.profile.sub
};
}
});
});
};
UserManager.prototype._signin = function _signin(args, navigator) {
var _this5 = this;
var navigatorParams = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2];
_Log2.default.info("_signin");
return this._signinStart(args, navigator, navigatorParams).then(function (navResponse) {
return _this5._signinEnd(navResponse.url);
});
};
UserManager.prototype._signinCallback = function _signinCallback(url, navigator) {
_Log2.default.info("_signinCallback");
return navigator.callback(url);
};
UserManager.prototype._signout = function _signout(args, navigator) {
var _this6 = this;
var navigatorParams = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2];
_Log2.default.info("_signout");
return this._signoutStart(args, navigator, navigatorParams).then(function (navResponse) {
return _this6._signoutEnd(navResponse.url);
});
};
UserManager.prototype._signoutCallback = function _signoutCallback(url, navigator) {
_Log2.default.info("_signoutCallback");
return navigator.callback(url);
};
UserManager.prototype.signinRedirect = function signinRedirect(args) {
_Log2.default.info("UserManager.signinRedirect");
return this._signinStart(args, this._redirectNavigator);
};
UserManager.prototype.signinRedirectCallback = function signinRedirectCallback(url) {
_Log2.default.info("UserManager.signinRedirectCallback");
return this._signinEnd(url || this._redirectNavigator.url);
};
UserManager.prototype.signoutRedirect = function signoutRedirect(args) {
_Log2.default.info("UserManager.signoutRedirect");
return this._signoutStart(args, this._redirectNavigator);
};
UserManager.prototype.signoutPopup = function signoutPopup() {
var args = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
_Log2.default.info("UserManager.signoutPopup");
var url = args.redirect_uri || this.settings.popup_redirect_uri || this.settings.redirect_uri;
if (!url) {
_Log2.default.error("No popup_redirect_uri or redirect_uri configured");
return Promise.reject(new Error("No popup_redirect_uri or redirect_uri configured"));
}
return this._signout(args, this._popupNavigator, {
startUrl: url,
popupWindowFeatures: args.popupWindowFeatures || this.settings.popupWindowFeatures,
popupWindowTarget: args.popupWindowTarget || this.settings.popupWindowTarget
});
};
UserManager.prototype.signoutRedirectCallback = function signoutRedirectCallback(url) {
_Log2.default.info("UserManager.signoutRedirectCallback");
return this._signoutEnd(url || this._redirectNavigator.url);
};
UserManager.prototype._signinStart = function _signinStart(args, navigator) {
var _this7 = this;
var navigatorParams = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2];
_Log2.default.info("_signinStart");
return navigator.prepare(navigatorParams).then(function (handle) {
_Log2.default.info("got navigator window handle");
return _this7.createSigninRequest(args).then(function (signinRequest) {
_Log2.default.info("got signin request");
navigatorParams.url = signinRequest.url;
return handle.navigate(navigatorParams);
});
});
};
UserManager.prototype._signinEnd = function _signinEnd(url) {
var _this8 = this;
_Log2.default.info("_signinEnd");
return this.processSigninResponse(url).then(function (signinResponse) {
_Log2.default.info("got signin response");
var user = new _User2.default(signinResponse);
return _this8._storeUser(user).then(function () {
_Log2.default.info("user stored");
_this8._events.load(user);
return user;
});
});
};
UserManager.prototype._signoutStart = function _signoutStart() {
var args = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
var _this9 = this;
var navigator = arguments[1];
var navigatorParams = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2];
_Log2.default.info("_signoutStart");
return navigator.prepare(navigatorParams).then(function (handle) {
_Log2.default.info("got navigator window handle");
return _this9.getUser().then(function (user) {
_Log2.default.info("loaded current user from storage");
var id_token = args.id_token_hint || user && user.id_token;
if (id_token) {
_Log2.default.info("Setting id_token into signout request");
args.id_token_hint = id_token;
}
return _this9.removeUser().then(function () {
_Log2.default.info("user removed, creating signout request");
return _this9.createSignoutRequest(args).then(function (signoutRequest) {
_Log2.default.info("got signout request");
navigatorParams.url = signoutRequest.url;
return handle.navigate(navigatorParams);
});
});
});
});
};
UserManager.prototype._signoutEnd = function _signoutEnd(url) {
_Log2.default.info("_signoutEnd");
return this.processSignoutResponse(url).then(function (signoutResponse) {
_Log2.default.info("got signout response");
return signoutResponse;
});
};
UserManager.prototype._loadUser = function _loadUser() {
_Log2.default.info("_loadUser");
return this._userStore.get(this._userStoreKey).then(function (storageString) {
if (storageString) {
_Log2.default.info("user storageString loaded");
return _User2.default.fromStorageString(storageString);
}
_Log2.default.info("no user storageString");
return null;
});
};
UserManager.prototype._storeUser = function _storeUser(user) {
if (user) {
_Log2.default.info("_storeUser storing user");
var storageString = user.toStorageString();
return this._userStore.set(this._userStoreKey, storageString);
} else {
_Log2.default.info("_storeUser removing user storage");
return this._userStore.remove(this._userStoreKey);
}
};
_createClass(UserManager, [{
key: '_redirectNavigator',
get: function get() {
return this.settings.redirectNavigator;
}
}, {
key: '_popupNavigator',
get: function get() {
return this.settings.popupNavigator;
}
}, {
key: '_iframeNavigator',
get: function get() {
return this.settings.iframeNavigator;
}
}, {
key: '_userStore',
get: function get() {
return this.settings.userStore;
}
}, {
key: 'events',
get: function get() {
return this._events;
}
}, {
key: '_userStoreKey',
get: function get() {
return 'user:' + this.settings.authority + ':' + this.settings.client_id;
}
}]);
return UserManager;
}(_OidcClient3.default);
exports.default = UserManager;
module.exports = exports['default'];
/***/ },
/* 319 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _Log = __webpack_require__(292);
var _Log2 = _interopRequireDefault(_Log);
var _OidcClientSettings2 = __webpack_require__(294);
var _OidcClientSettings3 = _interopRequireDefault(_OidcClientSettings2);
var _RedirectNavigator = __webpack_require__(320);
var _RedirectNavigator2 = _interopRequireDefault(_RedirectNavigator);
var _PopupNavigator = __webpack_require__(321);
var _PopupNavigator2 = _interopRequireDefault(_PopupNavigator);
var _IFrameNavigator = __webpack_require__(323);
var _IFrameNavigator2 = _interopRequireDefault(_IFrameNavigator);
var _WebStorageStateStore = __webpack_require__(295);
var _WebStorageStateStore2 = _interopRequireDefault(_WebStorageStateStore);
var _Global = __webpack_require__(296);
var _Global2 = _interopRequireDefault(_Global);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var DefaultAccessTokenExpiringNotificationTime = 60;
var UserManagerSettings = function (_OidcClientSettings) {
_inherits(UserManagerSettings, _OidcClientSettings);
function UserManagerSettings() {
var _ref = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
var popup_redirect_uri = _ref.popup_redirect_uri;
var popupWindowFeatures = _ref.popupWindowFeatures;
var popupWindowTarget = _ref.popupWindowTarget;
var silent_redirect_uri = _ref.silent_redirect_uri;
var silentRequestTimeout = _ref.silentRequestTimeout;
var _ref$automaticSilentR = _ref.automaticSilentRenew;
var automaticSilentRenew = _ref$automaticSilentR === undefined ? false : _ref$automaticSilentR;
var _ref$monitorSession = _ref.monitorSession;
var monitorSession = _ref$monitorSession === undefined ? true : _ref$monitorSession;
var _ref$accessTokenExpir = _ref.accessTokenExpiringNotificationTime;
var accessTokenExpiringNotificationTime = _ref$accessTokenExpir === undefined ? DefaultAccessTokenExpiringNotificationTime : _ref$accessTokenExpir;
var _ref$redirectNavigato = _ref.redirectNavigator;
var redirectNavigator = _ref$redirectNavigato === undefined ? new _RedirectNavigator2.default() : _ref$redirectNavigato;
var _ref$popupNavigator = _ref.popupNavigator;
var popupNavigator = _ref$popupNavigator === undefined ? new _PopupNavigator2.default() : _ref$popupNavigator;
var _ref$iframeNavigator = _ref.iframeNavigator;
var iframeNavigator = _ref$iframeNavigator === undefined ? new _IFrameNavigator2.default() : _ref$iframeNavigator;
var _ref$userStore = _ref.userStore;
var userStore = _ref$userStore === undefined ? new _WebStorageStateStore2.default({ store: _Global2.default.sessionStorage }) : _ref$userStore;
_classCallCheck(this, UserManagerSettings);
var _this = _possibleConstructorReturn(this, _OidcClientSettings.call(this, arguments[0]));
_this._popup_redirect_uri = popup_redirect_uri;
_this._popupWindowFeatures = popupWindowFeatures;
_this._popupWindowTarget = popupWindowTarget;
_this._silent_redirect_uri = silent_redirect_uri;
_this._silentRequestTimeout = silentRequestTimeout;
_this._automaticSilentRenew = !!automaticSilentRenew;
_this._accessTokenExpiringNotificationTime = accessTokenExpiringNotificationTime;
_this._monitorSession = monitorSession;
_this._redirectNavigator = redirectNavigator;
_this._popupNavigator = popupNavigator;
_this._iframeNavigator = iframeNavigator;
_this._userStore = userStore;
return _this;
}
_createClass(UserManagerSettings, [{
key: 'popup_redirect_uri',
get: function get() {
return this._popup_redirect_uri;
}
}, {
key: 'popupWindowFeatures',
get: function get() {
return this._popupWindowFeatures;
}
}, {
key: 'popupWindowTarget',
get: function get() {
return this._popupWindowTarget;
}
}, {
key: 'silent_redirect_uri',
get: function get() {
return this._silent_redirect_uri;
}
}, {
key: 'silentRequestTimeout',
get: function get() {
return this._silentRequestTimeout;
}
}, {
key: 'automaticSilentRenew',
get: function get() {
return !!(this.silent_redirect_uri && this._automaticSilentRenew);
}
}, {
key: 'accessTokenExpiringNotificationTime',
get: function get() {
return this._accessTokenExpiringNotificationTime;
}
}, {
key: 'monitorSession',
get: function get() {
return this._monitorSession;
}
}, {
key: 'redirectNavigator',
get: function get() {
return this._redirectNavigator;
}
}, {
key: 'popupNavigator',
get: function get() {
return this._popupNavigator;
}
}, {
key: 'iframeNavigator',
get: function get() {
return this._iframeNavigator;
}
}, {
key: 'userStore',
get: function get() {
return this._userStore;
}
}]);
return UserManagerSettings;
}(_OidcClientSettings3.default);
exports.default = UserManagerSettings;
module.exports = exports['default'];
/***/ },
/* 320 */
/***/ function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var _Log = __webpack_require__(292);
var _Log2 = _interopRequireDefault(_Log);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var RedirectNavigator = function () {
function RedirectNavigator() {
_classCallCheck(this, RedirectNavigator);
}
RedirectNavigator.prototype.prepare = function prepare() {
return Promise.resolve(this);
};
RedirectNavigator.prototype.navigate = function navigate(params) {
_Log2.default.info("RedirectNavigator.navigate");
if (!params || !params.url) {
_Log2.default.error("No url provided");
return Promise.reject(new Error("No url provided"));
}
window.location = params.url;
return Promise.resolve();
};
_createClass(RedirectNavigator, [{
key: "url",
get: function get() {
_Log2.default.info("RedirectNavigator.url");
return window.location.href;
}
}]);
return RedirectNavigator;
}();
exports.default = RedirectNavigator;
module.exports = exports['default'];
/***/ },
/* 321 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _Log = __webpack_require__(292);
var _Log2 = _interopRequireDefault(_Log);
var _PopupWindow = __webpack_require__(322);
var _PopupWindow2 = _interopRequireDefault(_PopupWindow);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var PopupNavigator = function () {
function PopupNavigator() {
_classCallCheck(this, PopupNavigator);
}
PopupNavigator.prototype.prepare = function prepare(params) {
var popup = new _PopupWindow2.default(params);
return Promise.resolve(popup);
};
PopupNavigator.prototype.callback = function callback(url) {
_Log2.default.info("PopupNavigator.callback");
try {
_PopupWindow2.default.notifyOpener(url);
return Promise.resolve();
} catch (e) {
return Promise.reject(e);
}
};
return PopupNavigator;
}();
exports.default = PopupNavigator;
module.exports = exports['default'];
/***/ },
/* 322 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var _Log = __webpack_require__(292);
var _Log2 = _interopRequireDefault(_Log);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var CheckForPopupClosedInterval = 500;
var DefaultPopupFeatures = 'location=no,toolbar=no,width=500,height=500,left=100,top=100';
var DefaultPopupTarget = "_blank";
var PopupWindow = function () {
function PopupWindow(params) {
var _this = this;
_classCallCheck(this, PopupWindow);
_Log2.default.info("PopupWindow.ctor");
this._promise = new Promise(function (resolve, reject) {
_this._resolve = resolve;
_this._reject = reject;
});
this._boundMessageEvent = this._message.bind(this);
window.addEventListener("message", this._boundMessageEvent, false);
var features = params.popupWindowFeatures || DefaultPopupFeatures;
var target = params.popupWindowTarget || DefaultPopupTarget;
this._popup = window.open('', target, features);
if (this._popup) {
_Log2.default.info("popup successfully created");
this._checkForPopupClosedTimer = window.setInterval(this._checkForPopupClosed.bind(this), CheckForPopupClosedInterval);
}
}
PopupWindow.prototype.navigate = function navigate(params) {
_Log2.default.info("PopupWindow.navigate");
if (!this._popup) {
this._error("Error opening popup window");
} else if (!params || !params.url) {
this._error("No url provided");
} else {
_Log2.default.info("Setting URL in popup");
this._popup.focus();
this._popup.window.location = params.url;
}
return this.promise;
};
PopupWindow.prototype._success = function _success(data) {
this._cleanup();
_Log2.default.info("Successful response from popup window");
this._resolve(data);
};
PopupWindow.prototype._error = function _error(message) {
this._cleanup();
_Log2.default.error(message);
this._reject(new Error(message));
};
PopupWindow.prototype._cleanup = function _cleanup() {
_Log2.default.info("PopupWindow._cleanup");
window.removeEventListener("message", this._boundMessageEvent, false);
window.clearInterval(this._checkForPopupClosedTimer);
this._checkForPopupClosedTimer = null;
this._boundMessageEventssage = null;
if (this._popup) {
this._popup.close();
}
this._popup = null;
};
PopupWindow.prototype._checkForPopupClosed = function _checkForPopupClosed() {
_Log2.default.info("PopupWindow._checkForPopupClosed");
if (!this._popup || this._popup.closed) {
this._error("Popup window closed");
}
};
PopupWindow.prototype._message = function _message(e) {
_Log2.default.info("PopupWindow._message");
if (e.origin === this._origin && e.source === this._popup.window) {
_Log2.default.info("processing message");
var url = e.data || e.source.location.href; // for IE9
this._cleanup();
if (url) {
this._success({ url: url });
} else {
this._error("Invalid response from popup");
}
}
};
PopupWindow.notifyOpener = function notifyOpener(url) {
_Log2.default.info("PopupWindow.notifyOpener");
if (window.opener) {
url = url || window.location.href;
if (url) {
_Log2.default.info("posting url message to opener");
window.opener.postMessage(url, location.protocol + "//" + location.host);
}
}
};
_createClass(PopupWindow, [{
key: 'promise',
get: function get() {
return this._promise;
}
}, {
key: '_origin',
get: function get() {
return location.protocol + "//" + location.host;
}
}]);
return PopupWindow;
}();
exports.default = PopupWindow;
module.exports = exports['default'];
/***/ },
/* 323 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _Log = __webpack_require__(292);
var _Log2 = _interopRequireDefault(_Log);
var _IFrameWindow = __webpack_require__(324);
var _IFrameWindow2 = _interopRequireDefault(_IFrameWindow);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var IFrameNavigator = function () {
function IFrameNavigator() {
_classCallCheck(this, IFrameNavigator);
}
IFrameNavigator.prototype.prepare = function prepare(params) {
var frame = new _IFrameWindow2.default(params);
return Promise.resolve(frame);
};
IFrameNavigator.prototype.callback = function callback(url) {
_Log2.default.info("IFrameNavigator.callback");
try {
_IFrameWindow2.default.notifyParent(url);
return Promise.resolve();
} catch (e) {
return Promise.reject(e);
}
};
return IFrameNavigator;
}();
exports.default = IFrameNavigator;
module.exports = exports['default'];
/***/ },
/* 324 */
/***/ function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var _Log = __webpack_require__(292);
var _Log2 = _interopRequireDefault(_Log);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var DefaultTimeout = 5000;
var IFrameWindow = function () {
function IFrameWindow(params) {
var _this = this;
_classCallCheck(this, IFrameWindow);
_Log2.default.info("IFrameWindow.ctor");
this._promise = new Promise(function (resolve, reject) {
_this._resolve = resolve;
_this._reject = reject;
});
this._boundMessageEvent = this._message.bind(this);
window.addEventListener("message", this._boundMessageEvent, false);
this._frame = window.document.createElement("iframe");
this._frame.style.display = "none";
window.document.body.appendChild(this._frame);
}
IFrameWindow.prototype.navigate = function navigate(params) {
_Log2.default.info("IFrameWindow.navigate");
if (!params || !params.url) {
this._error("No url provided");
} else {
var timeout = params.silentRequestTimeout || DefaultTimeout;
_Log2.default.info("Using timeout of:", timeout);
this._timer = window.setTimeout(this._timeout.bind(this), timeout);
this._frame.src = params.url;
}
return this.promise;
};
IFrameWindow.prototype._success = function _success(data) {
this._cleanup();
_Log2.default.info("Successful response from frame window");
this._resolve(data);
};
IFrameWindow.prototype._error = function _error(message) {
this._cleanup();
_Log2.default.error(message);
this._reject(new Error(message));
};
IFrameWindow.prototype._cleanup = function _cleanup() {
_Log2.default.info("IFrameWindow._cleanup");
window.removeEventListener("message", this._boundMessageEvent, false);
window.clearTimeout(this._timer);
window.document.body.removeChild(this._frame);
this._timer = null;
this._frame = null;
this._boundMessageEvent = null;
};
IFrameWindow.prototype._timeout = function _timeout() {
_Log2.default.info("IFrameWindow._timeout");
this._error("Frame window timed out");
};
IFrameWindow.prototype._message = function _message(e) {
_Log2.default.info("IFrameWindow._message");
if (this._timer && e.origin === this._origin && e.source === this._frame.contentWindow) {
var url = e.data;
if (url) {
this._success({ url: url });
} else {
this._error("Invalid response from frame");
}
}
};
IFrameWindow.notifyParent = function notifyParent(url) {
_Log2.default.info("IFrameWindow.notifyParent");
if (window.parent && window !== window.parent) {
url = url || window.location.href;
if (url) {
_Log2.default.info("posting url message to parent");
window.parent.postMessage(url, location.protocol + "//" + location.host);
}
}
};
_createClass(IFrameWindow, [{
key: "promise",
get: function get() {
return this._promise;
}
}, {
key: "_origin",
get: function get() {
return location.protocol + "//" + location.host;
}
}]);
return IFrameWindow;
}();
exports.default = IFrameWindow;
module.exports = exports['default'];
/***/ },
/* 325 */
/***/ function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var _Log = __webpack_require__(292);
var _Log2 = _interopRequireDefault(_Log);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var User = function () {
function User(_ref) {
var id_token = _ref.id_token;
var session_state = _ref.session_state;
var access_token = _ref.access_token;
var token_type = _ref.token_type;
var scope = _ref.scope;
var profile = _ref.profile;
var expires_at = _ref.expires_at;
var state = _ref.state;
_classCallCheck(this, User);
this.id_token = id_token;
this.session_state = session_state;
this.access_token = access_token;
this.token_type = token_type;
this.scope = scope;
this.profile = profile;
this.expires_at = expires_at;
this.state = state;
}
User.prototype.toStorageString = function toStorageString() {
_Log2.default.info("User.toStorageString");
return JSON.stringify({
id_token: this.id_token,
session_state: this.session_state,
access_token: this.access_token,
token_type: this.token_type,
scope: this.scope,
profile: this.profile,
expires_at: this.expires_at
});
};
User.fromStorageString = function fromStorageString(storageString) {
_Log2.default.info("User.fromStorageString");
return new User(JSON.parse(storageString));
};
_createClass(User, [{
key: "expires_in",
get: function get() {
if (this.expires_at) {
var now = parseInt(Date.now() / 1000);
return this.expires_at - now;
}
return undefined;
}
}, {
key: "expired",
get: function get() {
var expires_in = this.expires_in;
if (expires_in !== undefined) {
return expires_in <= 0;
}
return undefined;
}
}, {
key: "scopes",
get: function get() {
return (this.scope || "").split(" ");
}
}]);
return User;
}();
exports.default = User;
module.exports = exports['default'];
/***/ },
/* 326 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _Log = __webpack_require__(292);
var _Log2 = _interopRequireDefault(_Log);
var _AccessTokenEvents2 = __webpack_require__(327);
var _AccessTokenEvents3 = _interopRequireDefault(_AccessTokenEvents2);
var _Event = __webpack_require__(329);
var _Event2 = _interopRequireDefault(_Event);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var UserManagerEvents = function (_AccessTokenEvents) {
_inherits(UserManagerEvents, _AccessTokenEvents);
function UserManagerEvents(settings) {
_classCallCheck(this, UserManagerEvents);
var _this = _possibleConstructorReturn(this, _AccessTokenEvents.call(this, settings));
_this._userLoaded = new _Event2.default("User loaded");
_this._userUnloaded = new _Event2.default("User unloaded");
_this._silentRenewError = new _Event2.default("Silent renew error");
_this._userSignedOut = new _Event2.default("User signed out");
return _this;
}
UserManagerEvents.prototype.load = function load(user) {
var raiseEvent = arguments.length <= 1 || arguments[1] === undefined ? true : arguments[1];
_Log2.default.info("UserManagerEvents.load");
_AccessTokenEvents.prototype.load.call(this, user);
if (raiseEvent) {
this._userLoaded.raise(user);
}
};
UserManagerEvents.prototype.unload = function unload() {
_Log2.default.info("UserManagerEvents.unload");
_AccessTokenEvents.prototype.unload.call(this);
this._userUnloaded.raise();
};
UserManagerEvents.prototype.addUserLoaded = function addUserLoaded(cb) {
this._userLoaded.addHandler(cb);
};
UserManagerEvents.prototype.removeUserLoaded = function removeUserLoaded(cb) {
this._userLoaded.removeHandler(cb);
};
UserManagerEvents.prototype.addUserUnloaded = function addUserUnloaded(cb) {
this._userUnloaded.addHandler(cb);
};
UserManagerEvents.prototype.removeUserUnloaded = function removeUserUnloaded(cb) {
this._userUnloaded.removeHandler(cb);
};
UserManagerEvents.prototype.addSilentRenewError = function addSilentRenewError(cb) {
this._silentRenewError.addHandler(cb);
};
UserManagerEvents.prototype.removeSilentRenewError = function removeSilentRenewError(cb) {
this._silentRenewError.removeHandler(cb);
};
UserManagerEvents.prototype._raiseSilentRenewError = function _raiseSilentRenewError(e) {
_Log2.default.info("UserManagerEvents._raiseSilentRenewError", e.message);
this._silentRenewError.raise(e);
};
UserManagerEvents.prototype.addUserSignedOut = function addUserSignedOut(cb) {
this._userSignedOut.addHandler(cb);
};
UserManagerEvents.prototype.removeUserSignedOut = function removeUserSignedOut(cb) {
this._userSignedOut.removeHandler(cb);
};
UserManagerEvents.prototype._raiseUserSignedOut = function _raiseUserSignedOut(e) {
_Log2.default.info("UserManagerEvents._raiseUserSignedOut");
this._userSignedOut.raise(e);
};
return UserManagerEvents;
}(_AccessTokenEvents3.default);
exports.default = UserManagerEvents;
module.exports = exports['default'];
/***/ },
/* 327 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _Log = __webpack_require__(292);
var _Log2 = _interopRequireDefault(_Log);
var _Timer = __webpack_require__(328);
var _Timer2 = _interopRequireDefault(_Timer);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var DefaultAccessTokenExpiringNotificationTime = 60;
var AccessTokenEvents = function () {
function AccessTokenEvents() {
var _ref = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
var _ref$accessTokenExpir = _ref.accessTokenExpiringNotificationTime;
var accessTokenExpiringNotificationTime = _ref$accessTokenExpir === undefined ? DefaultAccessTokenExpiringNotificationTime : _ref$accessTokenExpir;
var _ref$accessTokenExpir2 = _ref.accessTokenExpiringTimer;
var accessTokenExpiringTimer = _ref$accessTokenExpir2 === undefined ? new _Timer2.default("Access token expiring") : _ref$accessTokenExpir2;
var _ref$accessTokenExpir3 = _ref.accessTokenExpiredTimer;
var accessTokenExpiredTimer = _ref$accessTokenExpir3 === undefined ? new _Timer2.default("Access token expired") : _ref$accessTokenExpir3;
_classCallCheck(this, AccessTokenEvents);
this._accessTokenExpiringNotificationTime = accessTokenExpiringNotificationTime;
this._accessTokenExpiring = accessTokenExpiringTimer;
this._accessTokenExpired = accessTokenExpiredTimer;
}
AccessTokenEvents.prototype.load = function load(container) {
_Log2.default.info("AccessTokenEvents.load");
this._cancelTimers();
// only register events if there's an access token where we care about expiration
if (container.access_token) {
var duration = container.expires_in;
_Log2.default.info("access token present, remaining duration:", duration);
if (duration > 0) {
// only register expiring if we still have time
var expiring = duration - this._accessTokenExpiringNotificationTime;
if (expiring <= 0) {
expiring = 1;
}
_Log2.default.info("registering expiring timer in:", expiring);
this._accessTokenExpiring.init(expiring);
}
// always register expired. if it's negative, it will still fire
var expired = duration + 1;
_Log2.default.info("registering expired timer in:", expired);
this._accessTokenExpired.init(expired);
}
};
AccessTokenEvents.prototype.unload = function unload() {
_Log2.default.info("AccessTokenEvents.unload");
this._cancelTimers();
};
AccessTokenEvents.prototype._cancelTimers = function _cancelTimers() {
_Log2.default.info("canceling existing access token timers");
this._accessTokenExpiring.cancel();
this._accessTokenExpired.cancel();
};
AccessTokenEvents.prototype.addAccessTokenExpiring = function addAccessTokenExpiring(cb) {
this._accessTokenExpiring.addHandler(cb);
};
AccessTokenEvents.prototype.removeAccessTokenExpiring = function removeAccessTokenExpiring(cb) {
this._accessTokenExpiring.removeHandler(cb);
};
AccessTokenEvents.prototype.addAccessTokenExpired = function addAccessTokenExpired(cb) {
this._accessTokenExpired.addHandler(cb);
};
AccessTokenEvents.prototype.removeAccessTokenExpired = function removeAccessTokenExpired(cb) {
this._accessTokenExpired.removeHandler(cb);
};
return AccessTokenEvents;
}();
exports.default = AccessTokenEvents;
module.exports = exports['default'];
/***/ },
/* 328 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _Log = __webpack_require__(292);
var _Log2 = _interopRequireDefault(_Log);
var _Global = __webpack_require__(296);
var _Global2 = _interopRequireDefault(_Global);
var _Event2 = __webpack_require__(329);
var _Event3 = _interopRequireDefault(_Event2);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var Timer = function (_Event) {
_inherits(Timer, _Event);
function Timer(name) {
var timer = arguments.length <= 1 || arguments[1] === undefined ? _Global2.default.timer : arguments[1];
_classCallCheck(this, Timer);
var _this = _possibleConstructorReturn(this, _Event.call(this, name));
_this._timer = timer;
return _this;
}
Timer.prototype.init = function init(duration) {
this.cancel();
if (duration <= 0) {
duration = 1;
}
this._timerHandle = this._timer.setTimeout(this._callback.bind(this), duration * 1000);
};
Timer.prototype.cancel = function cancel() {
if (this._timerHandle) {
this._timer.clearTimeout(this._timerHandle);
this._timerHandle = null;
}
};
Timer.prototype._callback = function _callback() {
this._timerHandle = null;
_Event.prototype.raise.call(this);
};
return Timer;
}(_Event3.default);
exports.default = Timer;
module.exports = exports['default'];
/***/ },
/* 329 */
/***/ function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _Log = __webpack_require__(292);
var _Log2 = _interopRequireDefault(_Log);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var Event = function () {
function Event(name) {
_classCallCheck(this, Event);
this._name = name;
this._callbacks = [];
}
Event.prototype.addHandler = function addHandler(cb) {
this._callbacks.push(cb);
};
Event.prototype.removeHandler = function removeHandler(cb) {
var idx = this._callbacks.findIndex(function (item) {
return item === cb;
});
if (idx >= 0) {
this._callbacks.splice(idx, 1);
}
};
Event.prototype.raise = function raise() {
_Log2.default.info("Raising event: " + this._name);
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
for (var _iterator = this._callbacks[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var cb = _step.value;
cb.apply(undefined, arguments);
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
};
return Event;
}();
exports.default = Event;
module.exports = exports['default'];
/***/ },
/* 330 */
/***/ function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _Log = __webpack_require__(292);
var _Log2 = _interopRequireDefault(_Log);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var SilentRenewService = function () {
function SilentRenewService(userManager) {
_classCallCheck(this, SilentRenewService);
this._userManager = userManager;
this._userManager.events.addAccessTokenExpiring(this._tokenExpiring.bind(this));
// this will trigger loading of the user so the expiring events can be initialized
this._userManager.getUser().then(function (user) {
// deliberate nop
}).catch(function (err) {
// catch to suppress errors since we're in a ctor
_Log2.default.error("Error from getUser:", err.message);
});
}
SilentRenewService.prototype._tokenExpiring = function _tokenExpiring() {
var _this = this;
_Log2.default.info("SilentRenewService automatically renewing access token");
this._userManager.signinSilent().then(function (user) {
_Log2.default.info("Silent token renewal successful");
}, function (err) {
_Log2.default.error("Error from signinSilent:", err.message);
_this._userManager.events._raiseSilentRenewError(err);
});
};
return SilentRenewService;
}();
exports.default = SilentRenewService;
module.exports = exports['default'];
/***/ },
/* 331 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var _Log = __webpack_require__(292);
var _Log2 = _interopRequireDefault(_Log);
var _CheckSessionIFrame = __webpack_require__(332);
var _CheckSessionIFrame2 = _interopRequireDefault(_CheckSessionIFrame);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var SessionMonitor = function () {
function SessionMonitor(userManager) {
var _this = this;
var CheckSessionIFrameCtor = arguments.length <= 1 || arguments[1] === undefined ? _CheckSessionIFrame2.default : arguments[1];
_classCallCheck(this, SessionMonitor);
if (!userManager) {
_Log2.default.error("No user manager passed to SessionMonitor");
throw new Error("userManager");
}
this._userManager = userManager;
this._CheckSessionIFrameCtor = CheckSessionIFrameCtor;
this._userManager.events.addUserLoaded(this._start.bind(this));
this._userManager.events.addUserUnloaded(this._stop.bind(this));
this._userManager.getUser().then(function (user) {
if (user) {
_this._start(user);
}
}).catch(function (err) {
// catch to suppress errors since we're in a ctor
_Log2.default.error("SessionMonitor ctor; error from getUser:", err.message);
});
}
SessionMonitor.prototype._start = function _start(user) {
var _this2 = this;
var session_state = user.session_state;
if (session_state) {
this._sub = user.profile.sub;
_Log2.default.info("SessionMonitor._start; session_state:", session_state, ", sub:", this._sub);
if (!this._checkSessionIFrame) {
this._metadataService.getCheckSessionIframe().then(function (url) {
if (url) {
_Log2.default.info("Initializing check session iframe");
var client_id = _this2._client_id;
var interval = _this2._checkSessionInterval;
_this2._checkSessionIFrame = new _this2._CheckSessionIFrameCtor(_this2._callback.bind(_this2), client_id, url, interval);
_this2._checkSessionIFrame.start(session_state);
} else {
_Log2.default.warn("No check session iframe found in the metadata");
}
}).catch(function (err) {
// catch to suppress errors since we're in non-promise callback
_Log2.default.error("Error from getCheckSessionIframe:", err.message);
});
} else {
this._checkSessionIFrame.start(session_state);
}
}
};
SessionMonitor.prototype._stop = function _stop() {
_Log2.default.info("SessionMonitor._stop");
this._sub = null;
if (this._checkSessionIFrame) {
this._checkSessionIFrame.stop();
}
};
SessionMonitor.prototype._callback = function _callback() {
var _this3 = this;
_Log2.default.info("SessionMonitor._callback");
this._userManager.querySessionStatus().then(function (session) {
var raiseEvent = true;
if (session) {
if (session.sub === _this3._sub) {
_Log2.default.info("Same sub still logged in at OP, restarting check session iframe; session_state:", session.session_state);
_this3._checkSessionIFrame.start(session.session_state);
raiseEvent = false;
} else if (session) {
_Log2.default.info("Different subject signed into OP:", session.sub);
}
} else {
_Log2.default.info("Subject no longer signed into OP");
}
if (raiseEvent) {
_Log2.default.info("SessionMonitor._callback; raising signed out event");
_this3._userManager.events._raiseUserSignedOut();
}
}).catch(function (err) {
_Log2.default.info("Error calling queryCurrentSigninSession; raising signed out event", err.message);
_this3._userManager.events._raiseUserSignedOut();
});
};
_createClass(SessionMonitor, [{
key: '_settings',
get: function get() {
return this._userManager.settings;
}
}, {
key: '_metadataService',
get: function get() {
return this._userManager.metadataService;
}
}, {
key: '_client_id',
get: function get() {
return this._settings.client_id;
}
}, {
key: '_checkSessionInterval',
get: function get() {
return this._settings.checkSessionInterval;
}
}]);
return SessionMonitor;
}();
exports.default = SessionMonitor;
module.exports = exports['default'];
/***/ },
/* 332 */
/***/ function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _Log = __webpack_require__(292);
var _Log2 = _interopRequireDefault(_Log);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var DefaultInterval = 2000;
var CheckSessionIFrame = function () {
function CheckSessionIFrame(callback, client_id, url, interval) {
_classCallCheck(this, CheckSessionIFrame);
this._callback = callback;
this._client_id = client_id;
this._url = url;
this._interval = interval || DefaultInterval;
var idx = url.indexOf("/", url.indexOf("//") + 2);
this._frame_origin = url.substr(0, idx);
this._frame = window.document.createElement("iframe");
this._frame.style.display = "none";
this._frame.src = url;
window.document.body.appendChild(this._frame);
this._boundMessageEvent = this._message.bind(this);
window.addEventListener("message", this._boundMessageEvent, false);
}
CheckSessionIFrame.prototype._message = function _message(e) {
if (e.origin === this._frame_origin && e.source === this._frame.contentWindow) {
if (e.data === "error") {
_Log2.default.error("error message from check session op iframe");
this.stop();
} else if (e.data === "changed") {
_Log2.default.info("changed message from check session op iframe");
this.stop();
this._callback();
} else {
_Log2.default.info(e.data + " message from check session op iframe");
}
}
};
CheckSessionIFrame.prototype.start = function start(session_state) {
var _this = this;
if (this._session_state !== session_state) {
_Log2.default.info("CheckSessionIFrame.start");
this.stop();
this._session_state = session_state;
this._timer = window.setInterval(function () {
_this._frame.contentWindow.postMessage(_this._client_id + " " + _this._session_state, _this._frame_origin);
}, this._interval);
}
};
CheckSessionIFrame.prototype.stop = function stop() {
_Log2.default.info("CheckSessionIFrame.stop");
this._session_state = null;
if (this._timer) {
window.clearInterval(this._timer);
this._timer = null;
}
};
return CheckSessionIFrame;
}();
exports.default = CheckSessionIFrame;
module.exports = exports['default'];
/***/ },
/* 333 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _Log = __webpack_require__(292);
var _Log2 = _interopRequireDefault(_Log);
var _CordovaPopupWindow = __webpack_require__(334);
var _CordovaPopupWindow2 = _interopRequireDefault(_CordovaPopupWindow);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var CordovaPopupNavigator = function () {
function CordovaPopupNavigator() {
_classCallCheck(this, CordovaPopupNavigator);
}
CordovaPopupNavigator.prototype.prepare = function prepare(params) {
var popup = new _CordovaPopupWindow2.default(params);
return Promise.resolve(popup);
};
return CordovaPopupNavigator;
}();
exports.default = CordovaPopupNavigator;
module.exports = exports['default'];
/***/ },
/* 334 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var _Log = __webpack_require__(292);
var _Log2 = _interopRequireDefault(_Log);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var DefaultPopupFeatures = 'location=no,toolbar=no,zoom=no';
var DefaultPopupTarget = "_blank";
var CordovaPopupWindow = function () {
function CordovaPopupWindow(params) {
var _this = this;
_classCallCheck(this, CordovaPopupWindow);
_Log2.default.info("CordovaPopupWindow.ctor");
this._promise = new Promise(function (resolve, reject) {
_this._resolve = resolve;
_this._reject = reject;
});
this.features = params.popupWindowFeatures || DefaultPopupFeatures;
this.target = params.popupWindowTarget || DefaultPopupTarget;
this.redirect_uri = params.startUrl;
_Log2.default.info("redirect_uri: " + this.redirect_uri);
}
CordovaPopupWindow.prototype._isInAppBrowserInstalled = function _isInAppBrowserInstalled(cordovaMetadata) {
return ["cordova-plugin-inappbrowser", "cordova-plugin-inappbrowser.inappbrowser", "org.apache.cordova.inappbrowser"].some(function (name) {
return cordovaMetadata.hasOwnProperty(name);
});
};
CordovaPopupWindow.prototype.navigate = function navigate(params) {
_Log2.default.info("CordovaPopupWindow.navigate");
if (!params || !params.url) {
this._error("No url provided");
} else {
if (!window.cordova) {
return this._error("cordova is undefined");
}
var cordovaMetadata = window.cordova.require("cordova/plugin_list").metadata;
if (this._isInAppBrowserInstalled(cordovaMetadata) === false) {
return this._error("InAppBrowser plugin not found");
}
this._popup = cordova.InAppBrowser.open(params.url, this.target, this.features);
if (this._popup) {
_Log2.default.info("popup successfully created");
this._exitCallbackEvent = this._exitCallback.bind(this);
this._loadStartCallbackEvent = this._loadStartCallback.bind(this);
this._popup.addEventListener("exit", this._exitCallbackEvent, false);
this._popup.addEventListener("loadstart", this._loadStartCallbackEvent, false);
} else {
this._error("Error opening popup window");
}
}
return this.promise;
};
CordovaPopupWindow.prototype._loadStartCallback = function _loadStartCallback(event) {
if (event.url.indexOf(this.redirect_uri) === 0) {
this._success({ url: event.url });
}
};
CordovaPopupWindow.prototype._exitCallback = function _exitCallback(message) {
this._error(message);
};
CordovaPopupWindow.prototype._success = function _success(data) {
this._cleanup();
_Log2.default.info("Successful response from cordova popup window");
this._resolve(data);
};
CordovaPopupWindow.prototype._error = function _error(message) {
this._cleanup();
_Log2.default.error(message);
this._reject(new Error(message));
};
CordovaPopupWindow.prototype._cleanup = function _cleanup() {
_Log2.default.info("CordovaPopupWindow._cleanup");
if (this._popup) {
this._popup.removeEventListener("exit", this._exitCallbackEvent, false);
this._popup.removeEventListener("loadstart", this._loadStartCallbackEvent, false);
this._popup.close();
}
this._popup = null;
};
_createClass(CordovaPopupWindow, [{
key: 'promise',
get: function get() {
return this._promise;
}
}]);
return CordovaPopupWindow;
}();
exports.default = CordovaPopupWindow;
module.exports = exports['default'];
/***/ },
/* 335 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _Log = __webpack_require__(292);
var _Log2 = _interopRequireDefault(_Log);
var _CordovaPopupWindow = __webpack_require__(334);
var _CordovaPopupWindow2 = _interopRequireDefault(_CordovaPopupWindow);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var CordovaIFrameNavigator = function () {
function CordovaIFrameNavigator() {
_classCallCheck(this, CordovaIFrameNavigator);
}
CordovaIFrameNavigator.prototype.prepare = function prepare(params) {
params.popupWindowFeatures = 'hidden=yes';
var popup = new _CordovaPopupWindow2.default(params);
return Promise.resolve(popup);
};
return CordovaIFrameNavigator;
}();
exports.default = CordovaIFrameNavigator;
module.exports = exports['default'];
/***/ }
/******/ ]);
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAgMzU5MzM2NWMyODlmYWZjOGI2NmYiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9saWIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvc2hpbS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zeW1ib2wuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fZ2xvYmFsLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2NvcmUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9faGFzLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2Rlc2NyaXB0b3JzLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2ZhaWxzLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2V4cG9ydC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19oaWRlLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1kcC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19hbi1vYmplY3QuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9faXMtb2JqZWN0LmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2llOC1kb20tZGVmaW5lLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2RvbS1jcmVhdGUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fdG8tcHJpbWl0aXZlLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX3Byb3BlcnR5LWRlc2MuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fcmVkZWZpbmUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fdWlkLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2N0eC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19hLWZ1bmN0aW9uLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX21ldGEuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fc2hhcmVkLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX3NldC10by1zdHJpbmctdGFnLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX3drcy5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19rZXlvZi5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19vYmplY3Qta2V5cy5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19vYmplY3Qta2V5cy1pbnRlcm5hbC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL190by1pb2JqZWN0LmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2lvYmplY3QuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fY29mLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2RlZmluZWQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fYXJyYXktaW5jbHVkZXMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fdG8tbGVuZ3RoLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX3RvLWludGVnZXIuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fdG8taW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fc2hhcmVkLWtleS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19lbnVtLWJ1Zy1rZXlzLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2VudW0ta2V5cy5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZ29wcy5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19vYmplY3QtcGllLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2lzLWFycmF5LmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1jcmVhdGUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWRwcy5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19odG1sLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1nb3BuLWV4dC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZ29wbi5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZ29wZC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19saWJyYXJ5LmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5jcmVhdGUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmRlZmluZS1wcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QuZGVmaW5lLXByb3BlcnRpZXMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvci5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19vYmplY3Qtc2FwLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5nZXQtcHJvdG90eXBlLW9mLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX3RvLW9iamVjdC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZ3BvLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5rZXlzLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5nZXQtb3duLXByb3BlcnR5LW5hbWVzLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5mcmVlemUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LnNlYWwuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LnByZXZlbnQtZXh0ZW5zaW9ucy5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QuaXMtZnJvemVuLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5pcy1zZWFsZWQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmlzLWV4dGVuc2libGUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmFzc2lnbi5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19vYmplY3QtYXNzaWduLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5pcy5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19zYW1lLXZhbHVlLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5zZXQtcHJvdG90eXBlLW9mLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX3NldC1wcm90by5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QudG8tc3RyaW5nLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2NsYXNzb2YuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuZnVuY3Rpb24uYmluZC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19iaW5kLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2ludm9rZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5mdW5jdGlvbi5uYW1lLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LmZ1bmN0aW9uLmhhcy1pbnN0YW5jZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5wYXJzZS1pbnQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fcGFyc2UtaW50LmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX3N0cmluZy10cmltLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX3N0cmluZy13cy5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5wYXJzZS1mbG9hdC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19wYXJzZS1mbG9hdC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIuY29uc3RydWN0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9faW5oZXJpdC1pZi1yZXF1aXJlZC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIudG8tZml4ZWQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fYW4taW5zdGFuY2UuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fYS1udW1iZXItdmFsdWUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fc3RyaW5nLXJlcGVhdC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIudG8tcHJlY2lzaW9uLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5lcHNpbG9uLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5pcy1maW5pdGUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLmlzLWludGVnZXIuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9faXMtaW50ZWdlci5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIuaXMtbmFuLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5pcy1zYWZlLWludGVnZXIuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLm1heC1zYWZlLWludGVnZXIuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLm1pbi1zYWZlLWludGVnZXIuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLnBhcnNlLWZsb2F0LmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5wYXJzZS1pbnQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5hY29zaC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19tYXRoLWxvZzFwLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguYXNpbmguanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5hdGFuaC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLmNicnQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fbWF0aC1zaWduLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguY2x6MzIuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5jb3NoLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguZXhwbTEuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fbWF0aC1leHBtMS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLmZyb3VuZC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLmh5cG90LmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguaW11bC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLmxvZzEwLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGgubG9nMXAuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5sb2cyLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguc2lnbi5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLnNpbmguanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC50YW5oLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGgudHJ1bmMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmZyb20tY29kZS1wb2ludC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcucmF3LmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy50cmltLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19zdHJpbmctYXQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9faXRlci1kZWZpbmUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9faXRlcmF0b3JzLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2l0ZXItY3JlYXRlLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5jb2RlLXBvaW50LWF0LmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5lbmRzLXdpdGguanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fc3RyaW5nLWNvbnRleHQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9faXMtcmVnZXhwLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2ZhaWxzLWlzLXJlZ2V4cC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuaW5jbHVkZXMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLnJlcGVhdC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuc3RhcnRzLXdpdGguanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmFuY2hvci5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19zdHJpbmctaHRtbC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuYmlnLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5ibGluay5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuYm9sZC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuZml4ZWQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmZvbnRjb2xvci5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuZm9udHNpemUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLml0YWxpY3MuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmxpbmsuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLnNtYWxsLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5zdHJpa2UuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLnN1Yi5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuc3VwLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LmRhdGUubm93LmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LmRhdGUudG8tanNvbi5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5kYXRlLnRvLWlzby1zdHJpbmcuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuZGF0ZS50by1zdHJpbmcuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuZGF0ZS50by1wcmltaXRpdmUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fZGF0ZS10by1wcmltaXRpdmUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuaXMtYXJyYXkuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuZnJvbS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19pdGVyLWNhbGwuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9faXMtYXJyYXktaXRlci5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2NvcmUuZ2V0LWl0ZXJhdG9yLW1ldGhvZC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19pdGVyLWRldGVjdC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5vZi5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5qb2luLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX3N0cmljdC1tZXRob2QuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuc2xpY2UuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuc29ydC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5mb3ItZWFjaC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19hcnJheS1tZXRob2RzLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2FycmF5LXNwZWNpZXMtY3JlYXRlLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5Lm1hcC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5maWx0ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuc29tZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5ldmVyeS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5yZWR1Y2UuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fYXJyYXktcmVkdWNlLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LnJlZHVjZS1yaWdodC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5pbmRleC1vZi5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5sYXN0LWluZGV4LW9mLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LmNvcHktd2l0aGluLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2FycmF5LWNvcHktd2l0aGluLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2FkZC10by11bnNjb3BhYmxlcy5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5maWxsLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2FycmF5LWZpbGwuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuZmluZC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5maW5kLWluZGV4LmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LnNwZWNpZXMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fc2V0LXNwZWNpZXMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9faXRlci1zdGVwLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZ2V4cC5jb25zdHJ1Y3Rvci5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19mbGFncy5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWdleHAudG8tc3RyaW5nLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZ2V4cC5mbGFncy5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWdleHAubWF0Y2guanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fZml4LXJlLXdrcy5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWdleHAucmVwbGFjZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWdleHAuc2VhcmNoLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZ2V4cC5zcGxpdC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5wcm9taXNlLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2Zvci1vZi5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19zcGVjaWVzLWNvbnN0cnVjdG9yLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX3Rhc2suanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fbWljcm90YXNrLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX3JlZGVmaW5lLWFsbC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5tYXAuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fY29sbGVjdGlvbi1zdHJvbmcuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fY29sbGVjdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zZXQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYud2Vhay1tYXAuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fY29sbGVjdGlvbi13ZWFrLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LndlYWstc2V0LmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnR5cGVkLmFycmF5LWJ1ZmZlci5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL190eXBlZC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL190eXBlZC1idWZmZXIuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYudHlwZWQuZGF0YS12aWV3LmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnR5cGVkLmludDgtYXJyYXkuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fdHlwZWQtYXJyYXkuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9jb3JlLmlzLWl0ZXJhYmxlLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnR5cGVkLnVpbnQ4LWFycmF5LmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnR5cGVkLnVpbnQ4LWNsYW1wZWQtYXJyYXkuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYudHlwZWQuaW50MTYtYXJyYXkuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYudHlwZWQudWludDE2LWFycmF5LmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnR5cGVkLmludDMyLWFycmF5LmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnR5cGVkLnVpbnQzMi1hcnJheS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi50eXBlZC5mbG9hdDMyLWFycmF5LmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnR5cGVkLmZsb2F0NjQtYXJyYXkuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5hcHBseS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0LmNvbnN0cnVjdC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0LmRlZmluZS1wcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0LmRlbGV0ZS1wcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0LmVudW1lcmF0ZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0LmdldC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0LmdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvci5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0LmdldC1wcm90b3R5cGUtb2YuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5oYXMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5pcy1leHRlbnNpYmxlLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3Qub3duLWtleXMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fb3duLWtleXMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5wcmV2ZW50LWV4dGVuc2lvbnMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5zZXQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5zZXQtcHJvdG90eXBlLW9mLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM3LmFycmF5LmluY2x1ZGVzLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM3LnN0cmluZy5hdC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNy5zdHJpbmcucGFkLXN0YXJ0LmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX3N0cmluZy1wYWQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczcuc3RyaW5nLnBhZC1lbmQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczcuc3RyaW5nLnRyaW0tbGVmdC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNy5zdHJpbmcudHJpbS1yaWdodC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNy5zdHJpbmcubWF0Y2gtYWxsLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM3Lm9iamVjdC5nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3JzLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM3Lm9iamVjdC52YWx1ZXMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LXRvLWFycmF5LmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM3Lm9iamVjdC5lbnRyaWVzLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM3Lm9iamVjdC5kZWZpbmUtZ2V0dGVyLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1mb3JjZWQtcGFtLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM3Lm9iamVjdC5kZWZpbmUtc2V0dGVyLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM3Lm9iamVjdC5sb29rdXAtZ2V0dGVyLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM3Lm9iamVjdC5sb29rdXAtc2V0dGVyLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM3Lm1hcC50by1qc29uLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2NvbGxlY3Rpb24tdG8tanNvbi5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19hcnJheS1mcm9tLWl0ZXJhYmxlLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM3LnNldC50by1qc29uLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM3LnN5c3RlbS5nbG9iYWwuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczcuZXJyb3IuaXMtZXJyb3IuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczcubWF0aC5pYWRkaC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNy5tYXRoLmlzdWJoLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM3Lm1hdGguaW11bGguanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczcubWF0aC51bXVsaC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNy5yZWZsZWN0LmRlZmluZS1tZXRhZGF0YS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19tZXRhZGF0YS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNy5yZWZsZWN0LmRlbGV0ZS1tZXRhZGF0YS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNy5yZWZsZWN0LmdldC1tZXRhZGF0YS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNy5yZWZsZWN0LmdldC1tZXRhZGF0YS1rZXlzLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM3LnJlZmxlY3QuZ2V0LW93bi1tZXRhZGF0YS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNy5yZWZsZWN0LmdldC1vd24tbWV0YWRhdGEta2V5cy5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNy5yZWZsZWN0Lmhhcy1tZXRhZGF0YS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNy5yZWZsZWN0Lmhhcy1vd24tbWV0YWRhdGEuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczcucmVmbGVjdC5tZXRhZGF0YS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL3dlYi50aW1lcnMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fcGFydGlhbC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19wYXRoLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvd2ViLmltbWVkaWF0ZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL3dlYi5kb20uaXRlcmFibGUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2JhYmVsLXJlZ2VuZXJhdG9yLXJ1bnRpbWUvcnVudGltZS5qcyIsIndlYnBhY2s6Ly8vKHdlYnBhY2spL34vbm9kZS1saWJzLWJyb3dzZXIvfi9wcm9jZXNzL2Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvZm4vcmVnZXhwL2VzY2FwZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2NvcmUucmVnZXhwLmVzY2FwZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19yZXBsYWNlci5qcyIsIndlYnBhY2s6Ly8vLi9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvTG9nLmpzIiwid2VicGFjazovLy8uL3NyYy9PaWRjQ2xpZW50LmpzIiwid2VicGFjazovLy8uL3NyYy9PaWRjQ2xpZW50U2V0dGluZ3MuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1dlYlN0b3JhZ2VTdGF0ZVN0b3JlLmpzIiwid2VicGFjazovLy8uL3NyYy9HbG9iYWwuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1Jlc3BvbnNlVmFsaWRhdG9yLmpzIiwid2VicGFjazovLy8uL3NyYy9NZXRhZGF0YVNlcnZpY2UuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL0pzb25TZXJ2aWNlLmpzIiwid2VicGFjazovLy8uL3NyYy9Vc2VySW5mb1NlcnZpY2UuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL0Vycm9yUmVzcG9uc2UuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL0pvc2VVdGlsLmpzIiwid2VicGFjazovLy8uL34vanNyc2FzaWduL2xpYi9qc3JzYXNpZ24uanMiLCJ3ZWJwYWNrOi8vLyh3ZWJwYWNrKS9+L25vZGUtbGlicy1icm93c2VyL34vYnVmZmVyL2luZGV4LmpzIiwid2VicGFjazovLy8od2VicGFjaykvfi9ub2RlLWxpYnMtYnJvd3Nlci9+L2J1ZmZlci9+L2Jhc2U2NC1qcy9saWIvYjY0LmpzIiwid2VicGFjazovLy8od2VicGFjaykvfi9ub2RlLWxpYnMtYnJvd3Nlci9+L2J1ZmZlci9+L2llZWU3NTQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLyh3ZWJwYWNrKS9+L25vZGUtbGlicy1icm93c2VyL34vYnVmZmVyL34vaXNhcnJheS9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvU2lnbmluUmVxdWVzdC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvVXJsVXRpbGl0eS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvU2lnbmluU3RhdGUuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1N0YXRlLmpzIiwid2VicGFjazovLy8uL3NyYy9yYW5kb20uanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1NpZ25pblJlc3BvbnNlLmpzIiwid2VicGFjazovLy8uL3NyYy9TaWdub3V0UmVxdWVzdC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvU2lnbm91dFJlc3BvbnNlLmpzIiwid2VicGFjazovLy8uL3NyYy9Jbk1lbW9yeVdlYlN0b3JhZ2UuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1VzZXJNYW5hZ2VyLmpzIiwid2VicGFjazovLy8uL3NyYy9Vc2VyTWFuYWdlclNldHRpbmdzLmpzIiwid2VicGFjazovLy8uL3NyYy9SZWRpcmVjdE5hdmlnYXRvci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvUG9wdXBOYXZpZ2F0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1BvcHVwV2luZG93LmpzIiwid2VicGFjazovLy8uL3NyYy9JRnJhbWVOYXZpZ2F0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL0lGcmFtZVdpbmRvdy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvVXNlci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvVXNlck1hbmFnZXJFdmVudHMuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL0FjY2Vzc1Rva2VuRXZlbnRzLmpzIiwid2VicGFjazovLy8uL3NyYy9UaW1lci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvRXZlbnQuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1NpbGVudFJlbmV3U2VydmljZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvU2Vzc2lvbk1vbml0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL0NoZWNrU2Vzc2lvbklGcmFtZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvQ29yZG92YVBvcHVwTmF2aWdhdG9yLmpzIiwid2VicGFjazovLy8uL3NyYy9Db3Jkb3ZhUG9wdXBXaW5kb3cuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL0NvcmRvdmFJRnJhbWVOYXZpZ2F0b3IuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx1QkFBZTtBQUNmO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7QUN0Q0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBRztBQUNIOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEVBQUMsRTs7Ozs7OztBQy9CRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Qzs7Ozs7O0FDM0tBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFDLEU7Ozs7OztBQ25CRCx1QkFBc0I7QUFDdEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHOzs7Ozs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEc7Ozs7OztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsTUFBSyxVQUFVO0FBQ2YsSUFBRztBQUNILEc7Ozs7OztBQ1hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUMsRTs7Ozs7O0FDWEQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBQyxFOzs7Ozs7QUNMRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFDLEU7Ozs7OztBQ2pCRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFDLEU7Ozs7OztBQ05EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5RkFBd0Y7QUFDeEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSCxHOzs7Ozs7QUNsQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQyxFOzs7Ozs7QUNORDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFDLEU7Ozs7OztBQ05EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUMsRTs7Ozs7O0FDTkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQyxFOzs7Ozs7QUNORDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFDLEU7Ozs7OztBQ05EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUMsRTs7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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBLEVBQUM7O0FBRUQsd0M7Ozs7OztBQzlDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRzs7Ozs7O0FDekJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBTyxXQUFXO0FBQ2xCO0FBQ0E7QUFDQSxRQUFPLFVBQVU7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFPLFdBQVc7QUFDbEI7QUFDQTtBQUNBO0FBQ0EsUUFBTyxXQUFXO0FBQ2xCO0FBQ0E7QUFDQSxJQUFHO0FBQ0g7QUFDQSxJQUFHO0FBQ0g7QUFDQTtBQUNBLElBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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O0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHdEQUF1RCw2Q0FBNkMsRUFBRTs7QUFFdEc7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0EsTUFBSztBQUNMLGtEQUFpRDtBQUNqRDtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0EsTUFBSztBQUNMLG9DQUFtQztBQUNuQztBQUNBLE1BQUs7QUFDTCx1RUFBc0U7QUFDdEU7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBLE1BQUs7QUFDTCw2REFBNEQ7QUFDNUQ7QUFDQSxNQUFLO0FBQ0wsdUVBQXNFO0FBQ3RFO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBTztBQUNQLE1BQUs7QUFDTDtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBRzs7QUFFSCx1QkFBc0Isc0JBQXNCLEVBQUUsRUFBRTtBQUNoRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw2Q0FBNEM7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUErQixhQUFhO0FBQzVDO0FBQ0E7QUFDQSxJQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFvQiwwQkFBMEI7QUFDOUMsSUFBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVM7QUFDVDtBQUNBO0FBQ0EsVUFBUztBQUNUO0FBQ0EsUUFBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFTO0FBQ1Q7QUFDQSxVQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVM7QUFDVDtBQUNBLFFBQU87QUFDUDtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQSw0QkFBMkI7QUFDM0IsNEJBQTJCO0FBQzNCLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFPO0FBQ1A7QUFDQTtBQUNBLFFBQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EseUJBQXdCLGFBQWE7QUFDckMsUUFBTztBQUNQOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSzs7QUFFTDs7QUFFQTs7QUFFQTs7QUFFQSx3REFBdUQsVUFBVTs7QUFFakU7O0FBRUEsNkZBQTRGLHdCQUF3Qjs7QUFFcEg7QUFDQTtBQUNBLE1BQUssVUFBVSxjQUFjOztBQUU3QjtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0EsTUFBSyxXQUFXLGdDQUFnQzs7QUFFaEQ7QUFDQTtBQUNBO0FBQ0EsRUFBQyxrQ0FBa0MsZTs7Ozs7O0FDaGVuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRzs7Ozs7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFDLEU7Ozs7OztBQ0pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQyxROzs7Ozs7QUNKRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUMsRTs7Ozs7O0FDSkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFDLEU7Ozs7OztBQ0pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQyxFOzs7Ozs7QUNKRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUMsRTs7Ozs7O0FDSkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFDLEU7Ozs7OztBQ0pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQyxFOzs7Ozs7QUNKRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFDLEU7Ozs7OztBQ1JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQXlDO0FBQ3pDLEVBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQyxFOzs7Ozs7QUNyQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsaUNBQWdDLE1BQU0sU0FBUyxPQUFPLFNBQVM7QUFDL0QsRUFBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEVBQUMsRTs7Ozs7O0FDckJEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFDLEU7Ozs7OztBQ1ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBK0I7QUFDL0IsZUFBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUFzQztBQUN0QyxJQUFHO0FBQ0gsV0FBVTtBQUNWLEVBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFDLEU7Ozs7OztBQ3pCRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGdDQUErQixTQUFTLEU7Ozs7OztBQ3BCeEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFDLEU7Ozs7OztBQ1REO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQyxFOzs7Ozs7QUNURDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQyxFOzs7Ozs7QUNQRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQyxFOzs7Ozs7QUNWRDtBQUNBOztBQUVBLGdDQUErQixrQ0FBZ0MsRTs7Ozs7O0FDSC9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEc7Ozs7OztBQ1RBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxFQUFDLEU7Ozs7OztBQ2ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxnQ0FBK0IsU0FBUyxFOzs7Ozs7QUM5QnhDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsRUFBQyxFOzs7Ozs7QUNkRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUM7O0FBRUQsc0M7Ozs7OztBQ1hBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQyxFOzs7Ozs7QUNURDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUMsRTs7Ozs7O0FDVEQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7O0FDaEJBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQyxFOzs7Ozs7QUNURDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFDLGU7Ozs7OztBQ05EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUMsYTs7Ozs7O0FDTkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVTtBQUNWLEVBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFDLEU7Ozs7OztBQzdCRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQSxFQUFDLEU7Ozs7OztBQ3RCRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFDLEU7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QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFjO0FBQ2QsTUFBSztBQUNMLGVBQWM7QUFDZDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQ0FBMEMsV0FBVztBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFXO0FBQ1g7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSw0QkFBMkI7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVM7QUFDVDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVc7QUFDWDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxZQUFXO0FBQ1g7QUFDQTtBQUNBLFVBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsVUFBUztBQUNUO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBVztBQUNYO0FBQ0E7O0FBRUEsVUFBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxrQ0FBaUMsa0JBQWtCO0FBQ25EO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtCQUFpQjs7QUFFakI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXdCLGlCQUFpQjtBQUN6QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGFBQVk7QUFDWjtBQUNBOztBQUVBO0FBQ0EsYUFBWTtBQUNaOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLCtDQUE4QyxRQUFRO0FBQ3REO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxjQUFhO0FBQ2I7QUFDQTs7QUFFQSxZQUFXO0FBQ1g7QUFDQTtBQUNBOztBQUVBLFlBQVc7QUFDWDtBQUNBO0FBQ0E7O0FBRUEsWUFBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSzs7QUFFTDtBQUNBLCtDQUE4QyxRQUFRO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQSxNQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7O0FDMVZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esb0JBQW1CLFlBQVk7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrQkFBaUIsWUFBWTtBQUM3QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFpQixZQUFZO0FBQzdCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrQkFBaUIsWUFBWTtBQUM3QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxpQkFBZ0Isb0NBQW9DO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsa0JBQWlCLFlBQVk7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBQztBQUNEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGdCQUFlLGlCQUFpQjtBQUNoQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGNBQWEsaUJBQWlCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFVBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaURBQWdELEVBQUU7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG9CQUFtQiw2QkFBNkI7QUFDaEQ7QUFDQTtBQUNBO0FBQ0EsUUFBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrQkFBaUIsWUFBWTtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsVUFBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsc0JBQXFCLFNBQVM7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHNCQUFxQixTQUFTO0FBQzlCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLHNCQUFxQixTQUFTO0FBQzlCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGtCQUFpQixrQkFBa0I7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBRztBQUNIO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBRztBQUNIO0FBQ0E7QUFDQSxvQkFBbUIsY0FBYztBQUNqQztBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esd0RBQXVELE9BQU87QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHdEQUF1RCxPQUFPO0FBQzlEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsbUJBQWtCO0FBQ2xCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esc0JBQXFCLFFBQVE7QUFDN0I7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBLGdCQUFlLFNBQVM7QUFDeEI7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxtQkFBa0I7QUFDbEI7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxvQkFBbUIsU0FBUztBQUM1QjtBQUNBO0FBQ0EsSUFBRztBQUNIO0FBQ0E7QUFDQSxvQkFBbUIsU0FBUztBQUM1QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0Esd0NBQXVDLFNBQVM7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGtCQUFpQixZQUFZO0FBQzdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FB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Q0FFakIsMkJBQVEsUUFBUTtBQUNaLGdCQUFPLG1CQUFQLEdBQTZCLFlBQTdCLENBRFk7QUFFWixhQUFJLFFBQVEsaUNBQXVCLE1BQXZCLENBQVIsQ0FGUTtBQUdaLGdCQUFPLFFBQVEsT0FBUixDQUFnQixLQUFoQixDQUFQLENBSFk7Ozs7OzttQkFGQyIsImZpbGUiOiJvaWRjLWNsaWVudC5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKVxuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuXG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRleHBvcnRzOiB7fSxcbiBcdFx0XHRpZDogbW9kdWxlSWQsXG4gXHRcdFx0bG9hZGVkOiBmYWxzZVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sb2FkZWQgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogd2VicGFjay9ib290c3RyYXAgMzU5MzM2NWMyODlmYWZjOGI2NmZcbiAqKi8iLCIvKiBlc2xpbnQgbWF4LWxlbjogMCAqL1xuXG5cInVzZSBzdHJpY3RcIjtcblxucmVxdWlyZShcImNvcmUtanMvc2hpbVwiKTtcblxucmVxdWlyZShcImJhYmVsLXJlZ2VuZXJhdG9yLXJ1bnRpbWVcIik7XG5cbi8vIFNob3VsZCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHJlbGVhc2U6XG5cbnJlcXVpcmUoXCJjb3JlLWpzL2ZuL3JlZ2V4cC9lc2NhcGVcIik7XG5cbmlmIChnbG9iYWwuX2JhYmVsUG9seWZpbGwpIHtcbiAgdGhyb3cgbmV3IEVycm9yKFwib25seSBvbmUgaW5zdGFuY2Ugb2YgYmFiZWwtcG9seWZpbGwgaXMgYWxsb3dlZFwiKTtcbn1cbmdsb2JhbC5fYmFiZWxQb2x5ZmlsbCA9IHRydWU7XG5cbnZhciBERUZJTkVfUFJPUEVSVFkgPSBcImRlZmluZVByb3BlcnR5XCI7XG5mdW5jdGlvbiBkZWZpbmUoTywga2V5LCB2YWx1ZSkge1xuICBPW2tleV0gfHwgT2JqZWN0W0RFRklORV9QUk9QRVJUWV0oTywga2V5LCB7XG4gICAgd3JpdGFibGU6IHRydWUsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIHZhbHVlOiB2YWx1ZVxuICB9KTtcbn1cblxuZGVmaW5lKFN0cmluZy5wcm90b3R5cGUsIFwicGFkTGVmdFwiLCBcIlwiLnBhZFN0YXJ0KTtcbmRlZmluZShTdHJpbmcucHJvdG90eXBlLCBcInBhZFJpZ2h0XCIsIFwiXCIucGFkRW5kKTtcblxuXCJwb3AscmV2ZXJzZSxzaGlmdCxrZXlzLHZhbHVlcyxlbnRyaWVzLGluZGV4T2YsZXZlcnksc29tZSxmb3JFYWNoLG1hcCxmaWx0ZXIsZmluZCxmaW5kSW5kZXgsaW5jbHVkZXMsam9pbixzbGljZSxjb25jYXQscHVzaCxzcGxpY2UsdW5zaGlmdCxzb3J0LGxhc3RJbmRleE9mLHJlZHVjZSxyZWR1Y2VSaWdodCxjb3B5V2l0aGluLGZpbGxcIi5zcGxpdChcIixcIikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gIFtdW2tleV0gJiYgZGVmaW5lKEFycmF5LCBrZXksIEZ1bmN0aW9uLmNhbGwuYmluZChbXVtrZXldKSk7XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9saWIvaW5kZXguanNcbiAqKiBtb2R1bGUgaWQgPSAxXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJyZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN5bWJvbCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3QuY3JlYXRlJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm9iamVjdC5kZWZpbmUtcHJvcGVydHknKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYub2JqZWN0LmRlZmluZS1wcm9wZXJ0aWVzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm9iamVjdC5nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYub2JqZWN0LmdldC1wcm90b3R5cGUtb2YnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYub2JqZWN0LmtleXMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYub2JqZWN0LmdldC1vd24tcHJvcGVydHktbmFtZXMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYub2JqZWN0LmZyZWV6ZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3Quc2VhbCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3QucHJldmVudC1leHRlbnNpb25zJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm9iamVjdC5pcy1mcm96ZW4nKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYub2JqZWN0LmlzLXNlYWxlZCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3QuaXMtZXh0ZW5zaWJsZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3QuYXNzaWduJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm9iamVjdC5pcycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3Quc2V0LXByb3RvdHlwZS1vZicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3QudG8tc3RyaW5nJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmZ1bmN0aW9uLmJpbmQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuZnVuY3Rpb24ubmFtZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5mdW5jdGlvbi5oYXMtaW5zdGFuY2UnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucGFyc2UtaW50Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnBhcnNlLWZsb2F0Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm51bWJlci5jb25zdHJ1Y3RvcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5udW1iZXIudG8tZml4ZWQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubnVtYmVyLnRvLXByZWNpc2lvbicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5udW1iZXIuZXBzaWxvbicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5udW1iZXIuaXMtZmluaXRlJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm51bWJlci5pcy1pbnRlZ2VyJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm51bWJlci5pcy1uYW4nKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubnVtYmVyLmlzLXNhZmUtaW50ZWdlcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5udW1iZXIubWF4LXNhZmUtaW50ZWdlcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5udW1iZXIubWluLXNhZmUtaW50ZWdlcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5udW1iZXIucGFyc2UtZmxvYXQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubnVtYmVyLnBhcnNlLWludCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLmFjb3NoJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hdGguYXNpbmgnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC5hdGFuaCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLmNicnQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC5jbHozMicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLmNvc2gnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC5leHBtMScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLmZyb3VuZCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLmh5cG90Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hdGguaW11bCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLmxvZzEwJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hdGgubG9nMXAnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC5sb2cyJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hdGguc2lnbicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLnNpbmgnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC50YW5oJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hdGgudHJ1bmMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3RyaW5nLmZyb20tY29kZS1wb2ludCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcucmF3Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy50cmltJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5pdGVyYXRvcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcuY29kZS1wb2ludC1hdCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcuZW5kcy13aXRoJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5pbmNsdWRlcycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcucmVwZWF0Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5zdGFydHMtd2l0aCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcuYW5jaG9yJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5iaWcnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3RyaW5nLmJsaW5rJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5ib2xkJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5maXhlZCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcuZm9udGNvbG9yJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5mb250c2l6ZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcuaXRhbGljcycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcubGluaycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcuc21hbGwnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3RyaW5nLnN0cmlrZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcuc3ViJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5zdXAnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuZGF0ZS5ub3cnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuZGF0ZS50by1qc29uJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmRhdGUudG8taXNvLXN0cmluZycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5kYXRlLnRvLXN0cmluZycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5kYXRlLnRvLXByaW1pdGl2ZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5pcy1hcnJheScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5mcm9tJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5Lm9mJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5LmpvaW4nKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkuc2xpY2UnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkuc29ydCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5mb3ItZWFjaCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5tYXAnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkuZmlsdGVyJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5LnNvbWUnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkuZXZlcnknKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkucmVkdWNlJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5LnJlZHVjZS1yaWdodCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5pbmRleC1vZicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5sYXN0LWluZGV4LW9mJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5LmNvcHktd2l0aGluJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5LmZpbGwnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkuZmluZCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5maW5kLWluZGV4Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5LnNwZWNpZXMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVnZXhwLmNvbnN0cnVjdG9yJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZ2V4cC50by1zdHJpbmcnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVnZXhwLmZsYWdzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZ2V4cC5tYXRjaCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWdleHAucmVwbGFjZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWdleHAuc2VhcmNoJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZ2V4cC5zcGxpdCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5wcm9taXNlJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hcCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zZXQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYud2Vhay1tYXAnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYud2Vhay1zZXQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYudHlwZWQuYXJyYXktYnVmZmVyJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnR5cGVkLmRhdGEtdmlldycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi50eXBlZC5pbnQ4LWFycmF5Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnR5cGVkLnVpbnQ4LWFycmF5Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnR5cGVkLnVpbnQ4LWNsYW1wZWQtYXJyYXknKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYudHlwZWQuaW50MTYtYXJyYXknKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYudHlwZWQudWludDE2LWFycmF5Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnR5cGVkLmludDMyLWFycmF5Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnR5cGVkLnVpbnQzMi1hcnJheScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi50eXBlZC5mbG9hdDMyLWFycmF5Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnR5cGVkLmZsb2F0NjQtYXJyYXknKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVmbGVjdC5hcHBseScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWZsZWN0LmNvbnN0cnVjdCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWZsZWN0LmRlZmluZS1wcm9wZXJ0eScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWZsZWN0LmRlbGV0ZS1wcm9wZXJ0eScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWZsZWN0LmVudW1lcmF0ZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWZsZWN0LmdldCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWZsZWN0LmdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWZsZWN0LmdldC1wcm90b3R5cGUtb2YnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVmbGVjdC5oYXMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVmbGVjdC5pcy1leHRlbnNpYmxlJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZmxlY3Qub3duLWtleXMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVmbGVjdC5wcmV2ZW50LWV4dGVuc2lvbnMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVmbGVjdC5zZXQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVmbGVjdC5zZXQtcHJvdG90eXBlLW9mJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LmFycmF5LmluY2x1ZGVzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnN0cmluZy5hdCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5zdHJpbmcucGFkLXN0YXJ0Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnN0cmluZy5wYWQtZW5kJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnN0cmluZy50cmltLWxlZnQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcuc3RyaW5nLnRyaW0tcmlnaHQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcuc3RyaW5nLm1hdGNoLWFsbCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5vYmplY3QuZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9ycycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5vYmplY3QudmFsdWVzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm9iamVjdC5lbnRyaWVzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm9iamVjdC5kZWZpbmUtZ2V0dGVyJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm9iamVjdC5kZWZpbmUtc2V0dGVyJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm9iamVjdC5sb29rdXAtZ2V0dGVyJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm9iamVjdC5sb29rdXAtc2V0dGVyJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm1hcC50by1qc29uJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnNldC50by1qc29uJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnN5c3RlbS5nbG9iYWwnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcuZXJyb3IuaXMtZXJyb3InKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcubWF0aC5pYWRkaCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5tYXRoLmlzdWJoJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm1hdGguaW11bGgnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcubWF0aC51bXVsaCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5yZWZsZWN0LmRlZmluZS1tZXRhZGF0YScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5yZWZsZWN0LmRlbGV0ZS1tZXRhZGF0YScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5yZWZsZWN0LmdldC1tZXRhZGF0YScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5yZWZsZWN0LmdldC1tZXRhZGF0YS1rZXlzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnJlZmxlY3QuZ2V0LW93bi1tZXRhZGF0YScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5yZWZsZWN0LmdldC1vd24tbWV0YWRhdGEta2V5cycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5yZWZsZWN0Lmhhcy1tZXRhZGF0YScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5yZWZsZWN0Lmhhcy1vd24tbWV0YWRhdGEnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcucmVmbGVjdC5tZXRhZGF0YScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL3dlYi50aW1lcnMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy93ZWIuaW1tZWRpYXRlJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvd2ViLmRvbS5pdGVyYWJsZScpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL21vZHVsZXMvX2NvcmUnKTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvc2hpbS5qc1xuICoqIG1vZHVsZSBpZCA9IDJcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0Jztcbi8vIEVDTUFTY3JpcHQgNiBzeW1ib2xzIHNoaW1cbnZhciBnbG9iYWwgICAgICAgICA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpXG4gICwgY29yZSAgICAgICAgICAgPSByZXF1aXJlKCcuL19jb3JlJylcbiAgLCBoYXMgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2hhcycpXG4gICwgREVTQ1JJUFRPUlMgICAgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpXG4gICwgJGV4cG9ydCAgICAgICAgPSByZXF1aXJlKCcuL19leHBvcnQnKVxuICAsIHJlZGVmaW5lICAgICAgID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUnKVxuICAsIE1FVEEgICAgICAgICAgID0gcmVxdWlyZSgnLi9fbWV0YScpLktFWVxuICAsICRmYWlscyAgICAgICAgID0gcmVxdWlyZSgnLi9fZmFpbHMnKVxuICAsIHNoYXJlZCAgICAgICAgID0gcmVxdWlyZSgnLi9fc2hhcmVkJylcbiAgLCBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4vX3NldC10by1zdHJpbmctdGFnJylcbiAgLCB1aWQgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX3VpZCcpXG4gICwgd2tzICAgICAgICAgICAgPSByZXF1aXJlKCcuL193a3MnKVxuICAsIGtleU9mICAgICAgICAgID0gcmVxdWlyZSgnLi9fa2V5b2YnKVxuICAsIGVudW1LZXlzICAgICAgID0gcmVxdWlyZSgnLi9fZW51bS1rZXlzJylcbiAgLCBpc0FycmF5ICAgICAgICA9IHJlcXVpcmUoJy4vX2lzLWFycmF5JylcbiAgLCBhbk9iamVjdCAgICAgICA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpXG4gICwgdG9JT2JqZWN0ICAgICAgPSByZXF1aXJlKCcuL190by1pb2JqZWN0JylcbiAgLCB0b1ByaW1pdGl2ZSAgICA9IHJlcXVpcmUoJy4vX3RvLXByaW1pdGl2ZScpXG4gICwgY3JlYXRlRGVzYyAgICAgPSByZXF1aXJlKCcuL19wcm9wZXJ0eS1kZXNjJylcbiAgLCBfY3JlYXRlICAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1jcmVhdGUnKVxuICAsIGdPUE5FeHQgICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcG4tZXh0JylcbiAgLCAkR09QRCAgICAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJylcbiAgLCAkRFAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpXG4gICwgZ09QRCAgICAgICAgICAgPSAkR09QRC5mXG4gICwgZFAgICAgICAgICAgICAgPSAkRFAuZlxuICAsIGdPUE4gICAgICAgICAgID0gZ09QTkV4dC5mXG4gICwgJFN5bWJvbCAgICAgICAgPSBnbG9iYWwuU3ltYm9sXG4gICwgJEpTT04gICAgICAgICAgPSBnbG9iYWwuSlNPTlxuICAsIF9zdHJpbmdpZnkgICAgID0gJEpTT04gJiYgJEpTT04uc3RyaW5naWZ5XG4gICwgc2V0dGVyICAgICAgICAgPSBmYWxzZVxuICAsIFBST1RPVFlQRSAgICAgID0gJ3Byb3RvdHlwZSdcbiAgLCBISURERU4gICAgICAgICA9IHdrcygnX2hpZGRlbicpXG4gICwgVE9fUFJJTUlUSVZFICAgPSB3a3MoJ3RvUHJpbWl0aXZlJylcbiAgLCBpc0VudW0gICAgICAgICA9IHt9LnByb3BlcnR5SXNFbnVtZXJhYmxlXG4gICwgU3ltYm9sUmVnaXN0cnkgPSBzaGFyZWQoJ3N5bWJvbC1yZWdpc3RyeScpXG4gICwgQWxsU3ltYm9scyAgICAgPSBzaGFyZWQoJ3N5bWJvbHMnKVxuICAsIE9iamVjdFByb3RvICAgID0gT2JqZWN0W1BST1RPVFlQRV1cbiAgLCBVU0VfTkFUSVZFICAgICA9IHR5cGVvZiAkU3ltYm9sID09ICdmdW5jdGlvbidcbiAgLCBRT2JqZWN0ICAgICAgICA9IGdsb2JhbC5RT2JqZWN0O1xuXG4vLyBmYWxsYmFjayBmb3Igb2xkIEFuZHJvaWQsIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvdjgvaXNzdWVzL2RldGFpbD9pZD02ODdcbnZhciBzZXRTeW1ib2xEZXNjID0gREVTQ1JJUFRPUlMgJiYgJGZhaWxzKGZ1bmN0aW9uKCl7XG4gIHJldHVybiBfY3JlYXRlKGRQKHt9LCAnYScsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uKCl7IHJldHVybiBkUCh0aGlzLCAnYScsIHt2YWx1ZTogN30pLmE7IH1cbiAgfSkpLmEgIT0gNztcbn0pID8gZnVuY3Rpb24oaXQsIGtleSwgRCl7XG4gIHZhciBwcm90b0Rlc2MgPSBnT1BEKE9iamVjdFByb3RvLCBrZXkpO1xuICBpZihwcm90b0Rlc2MpZGVsZXRlIE9iamVjdFByb3RvW2tleV07XG4gIGRQKGl0LCBrZXksIEQpO1xuICBpZihwcm90b0Rlc2MgJiYgaXQgIT09IE9iamVjdFByb3RvKWRQKE9iamVjdFByb3RvLCBrZXksIHByb3RvRGVzYyk7XG59IDogZFA7XG5cbnZhciB3cmFwID0gZnVuY3Rpb24odGFnKXtcbiAgdmFyIHN5bSA9IEFsbFN5bWJvbHNbdGFnXSA9IF9jcmVhdGUoJFN5bWJvbFtQUk9UT1RZUEVdKTtcbiAgc3ltLl9rID0gdGFnO1xuICBERVNDUklQVE9SUyAmJiBzZXR0ZXIgJiYgc2V0U3ltYm9sRGVzYyhPYmplY3RQcm90bywgdGFnLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIHNldDogZnVuY3Rpb24odmFsdWUpe1xuICAgICAgaWYoaGFzKHRoaXMsIEhJRERFTikgJiYgaGFzKHRoaXNbSElEREVOXSwgdGFnKSl0aGlzW0hJRERFTl1bdGFnXSA9IGZhbHNlO1xuICAgICAgc2V0U3ltYm9sRGVzYyh0aGlzLCB0YWcsIGNyZWF0ZURlc2MoMSwgdmFsdWUpKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gc3ltO1xufTtcblxudmFyIGlzU3ltYm9sID0gVVNFX05BVElWRSAmJiB0eXBlb2YgJFN5bWJvbC5pdGVyYXRvciA9PSAnc3ltYm9sJyA/IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIHR5cGVvZiBpdCA9PSAnc3ltYm9sJztcbn0gOiBmdW5jdGlvbihpdCl7XG4gIHJldHVybiBpdCBpbnN0YW5jZW9mICRTeW1ib2w7XG59O1xuXG52YXIgJGRlZmluZVByb3BlcnR5ID0gZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoaXQsIGtleSwgRCl7XG4gIGFuT2JqZWN0KGl0KTtcbiAga2V5ID0gdG9QcmltaXRpdmUoa2V5LCB0cnVlKTtcbiAgYW5PYmplY3QoRCk7XG4gIGlmKGhhcyhBbGxTeW1ib2xzLCBrZXkpKXtcbiAgICBpZighRC5lbnVtZXJhYmxlKXtcbiAgICAgIGlmKCFoYXMoaXQsIEhJRERFTikpZFAoaXQsIEhJRERFTiwgY3JlYXRlRGVzYygxLCB7fSkpO1xuICAgICAgaXRbSElEREVOXVtrZXldID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYoaGFzKGl0LCBISURERU4pICYmIGl0W0hJRERFTl1ba2V5XSlpdFtISURERU5dW2tleV0gPSBmYWxzZTtcbiAgICAgIEQgPSBfY3JlYXRlKEQsIHtlbnVtZXJhYmxlOiBjcmVhdGVEZXNjKDAsIGZhbHNlKX0pO1xuICAgIH0gcmV0dXJuIHNldFN5bWJvbERlc2MoaXQsIGtleSwgRCk7XG4gIH0gcmV0dXJuIGRQKGl0LCBrZXksIEQpO1xufTtcbnZhciAkZGVmaW5lUHJvcGVydGllcyA9IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXMoaXQsIFApe1xuICBhbk9iamVjdChpdCk7XG4gIHZhciBrZXlzID0gZW51bUtleXMoUCA9IHRvSU9iamVjdChQKSlcbiAgICAsIGkgICAgPSAwXG4gICAgLCBsID0ga2V5cy5sZW5ndGhcbiAgICAsIGtleTtcbiAgd2hpbGUobCA+IGkpJGRlZmluZVByb3BlcnR5KGl0LCBrZXkgPSBrZXlzW2krK10sIFBba2V5XSk7XG4gIHJldHVybiBpdDtcbn07XG52YXIgJGNyZWF0ZSA9IGZ1bmN0aW9uIGNyZWF0ZShpdCwgUCl7XG4gIHJldHVybiBQID09PSB1bmRlZmluZWQgPyBfY3JlYXRlKGl0KSA6ICRkZWZpbmVQcm9wZXJ0aWVzKF9jcmVhdGUoaXQpLCBQKTtcbn07XG52YXIgJHByb3BlcnR5SXNFbnVtZXJhYmxlID0gZnVuY3Rpb24gcHJvcGVydHlJc0VudW1lcmFibGUoa2V5KXtcbiAgdmFyIEUgPSBpc0VudW0uY2FsbCh0aGlzLCBrZXkgPSB0b1ByaW1pdGl2ZShrZXksIHRydWUpKTtcbiAgcmV0dXJuIEUgfHwgIWhhcyh0aGlzLCBrZXkpIHx8ICFoYXMoQWxsU3ltYm9scywga2V5KSB8fCBoYXModGhpcywgSElEREVOKSAmJiB0aGlzW0hJRERFTl1ba2V5XSA/IEUgOiB0cnVlO1xufTtcbnZhciAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGl0LCBrZXkpe1xuICB2YXIgRCA9IGdPUEQoaXQgPSB0b0lPYmplY3QoaXQpLCBrZXkgPSB0b1ByaW1pdGl2ZShrZXksIHRydWUpKTtcbiAgaWYoRCAmJiBoYXMoQWxsU3ltYm9scywga2V5KSAmJiAhKGhhcyhpdCwgSElEREVOKSAmJiBpdFtISURERU5dW2tleV0pKUQuZW51bWVyYWJsZSA9IHRydWU7XG4gIHJldHVybiBEO1xufTtcbnZhciAkZ2V0T3duUHJvcGVydHlOYW1lcyA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMoaXQpe1xuICB2YXIgbmFtZXMgID0gZ09QTih0b0lPYmplY3QoaXQpKVxuICAgICwgcmVzdWx0ID0gW11cbiAgICAsIGkgICAgICA9IDBcbiAgICAsIGtleTtcbiAgd2hpbGUobmFtZXMubGVuZ3RoID4gaSlpZighaGFzKEFsbFN5bWJvbHMsIGtleSA9IG5hbWVzW2krK10pICYmIGtleSAhPSBISURERU4gJiYga2V5ICE9IE1FVEEpcmVzdWx0LnB1c2goa2V5KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG52YXIgJGdldE93blByb3BlcnR5U3ltYm9scyA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5U3ltYm9scyhpdCl7XG4gIHZhciBuYW1lcyAgPSBnT1BOKHRvSU9iamVjdChpdCkpXG4gICAgLCByZXN1bHQgPSBbXVxuICAgICwgaSAgICAgID0gMFxuICAgICwga2V5O1xuICB3aGlsZShuYW1lcy5sZW5ndGggPiBpKWlmKGhhcyhBbGxTeW1ib2xzLCBrZXkgPSBuYW1lc1tpKytdKSlyZXN1bHQucHVzaChBbGxTeW1ib2xzW2tleV0pO1xuICByZXR1cm4gcmVzdWx0O1xufTtcbnZhciAkc3RyaW5naWZ5ID0gZnVuY3Rpb24gc3RyaW5naWZ5KGl0KXtcbiAgaWYoaXQgPT09IHVuZGVmaW5lZCB8fCBpc1N5bWJvbChpdCkpcmV0dXJuOyAvLyBJRTggcmV0dXJucyBzdHJpbmcgb24gdW5kZWZpbmVkXG4gIHZhciBhcmdzID0gW2l0XVxuICAgICwgaSAgICA9IDFcbiAgICAsIHJlcGxhY2VyLCAkcmVwbGFjZXI7XG4gIHdoaWxlKGFyZ3VtZW50cy5sZW5ndGggPiBpKWFyZ3MucHVzaChhcmd1bWVudHNbaSsrXSk7XG4gIHJlcGxhY2VyID0gYXJnc1sxXTtcbiAgaWYodHlwZW9mIHJlcGxhY2VyID09ICdmdW5jdGlvbicpJHJlcGxhY2VyID0gcmVwbGFjZXI7XG4gIGlmKCRyZXBsYWNlciB8fCAhaXNBcnJheShyZXBsYWNlcikpcmVwbGFjZXIgPSBmdW5jdGlvbihrZXksIHZhbHVlKXtcbiAgICBpZigkcmVwbGFjZXIpdmFsdWUgPSAkcmVwbGFjZXIuY2FsbCh0aGlzLCBrZXksIHZhbHVlKTtcbiAgICBpZighaXNTeW1ib2wodmFsdWUpKXJldHVybiB2YWx1ZTtcbiAgfTtcbiAgYXJnc1sxXSA9IHJlcGxhY2VyO1xuICByZXR1cm4gX3N0cmluZ2lmeS5hcHBseSgkSlNPTiwgYXJncyk7XG59O1xudmFyIEJVR0dZX0pTT04gPSAkZmFpbHMoZnVuY3Rpb24oKXtcbiAgdmFyIFMgPSAkU3ltYm9sKCk7XG4gIC8vIE1TIEVkZ2UgY29udmVydHMgc3ltYm9sIHZhbHVlcyB0byBKU09OIGFzIHt9XG4gIC8vIFdlYktpdCBjb252ZXJ0cyBzeW1ib2wgdmFsdWVzIHRvIEpTT04gYXMgbnVsbFxuICAvLyBWOCB0aHJvd3Mgb24gYm94ZWQgc3ltYm9sc1xuICByZXR1cm4gX3N0cmluZ2lmeShbU10pICE9ICdbbnVsbF0nIHx8IF9zdHJpbmdpZnkoe2E6IFN9KSAhPSAne30nIHx8IF9zdHJpbmdpZnkoT2JqZWN0KFMpKSAhPSAne30nO1xufSk7XG5cbi8vIDE5LjQuMS4xIFN5bWJvbChbZGVzY3JpcHRpb25dKVxuaWYoIVVTRV9OQVRJVkUpe1xuICAkU3ltYm9sID0gZnVuY3Rpb24gU3ltYm9sKCl7XG4gICAgaWYodGhpcyBpbnN0YW5jZW9mICRTeW1ib2wpdGhyb3cgVHlwZUVycm9yKCdTeW1ib2wgaXMgbm90IGEgY29uc3RydWN0b3IhJyk7XG4gICAgcmV0dXJuIHdyYXAodWlkKGFyZ3VtZW50cy5sZW5ndGggPiAwID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKSk7XG4gIH07XG4gIHJlZGVmaW5lKCRTeW1ib2xbUFJPVE9UWVBFXSwgJ3RvU3RyaW5nJywgZnVuY3Rpb24gdG9TdHJpbmcoKXtcbiAgICByZXR1cm4gdGhpcy5faztcbiAgfSk7XG5cbiAgJEdPUEQuZiA9ICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG4gICREUC5mICAgPSAkZGVmaW5lUHJvcGVydHk7XG4gIHJlcXVpcmUoJy4vX29iamVjdC1nb3BuJykuZiA9IGdPUE5FeHQuZiA9ICRnZXRPd25Qcm9wZXJ0eU5hbWVzO1xuICByZXF1aXJlKCcuL19vYmplY3QtcGllJykuZiAgPSAkcHJvcGVydHlJc0VudW1lcmFibGVcbiAgcmVxdWlyZSgnLi9fb2JqZWN0LWdvcHMnKS5mID0gJGdldE93blByb3BlcnR5U3ltYm9scztcblxuICBpZihERVNDUklQVE9SUyAmJiAhcmVxdWlyZSgnLi9fbGlicmFyeScpKXtcbiAgICByZWRlZmluZShPYmplY3RQcm90bywgJ3Byb3BlcnR5SXNFbnVtZXJhYmxlJywgJHByb3BlcnR5SXNFbnVtZXJhYmxlLCB0cnVlKTtcbiAgfVxufVxuXG4kZXhwb3J0KCRleHBvcnQuRyArICRleHBvcnQuVyArICRleHBvcnQuRiAqICFVU0VfTkFUSVZFLCB7U3ltYm9sOiAkU3ltYm9sfSk7XG5cbi8vIDE5LjQuMi4yIFN5bWJvbC5oYXNJbnN0YW5jZVxuLy8gMTkuNC4yLjMgU3ltYm9sLmlzQ29uY2F0U3ByZWFkYWJsZVxuLy8gMTkuNC4yLjQgU3ltYm9sLml0ZXJhdG9yXG4vLyAxOS40LjIuNiBTeW1ib2wubWF0Y2hcbi8vIDE5LjQuMi44IFN5bWJvbC5yZXBsYWNlXG4vLyAxOS40LjIuOSBTeW1ib2wuc2VhcmNoXG4vLyAxOS40LjIuMTAgU3ltYm9sLnNwZWNpZXNcbi8vIDE5LjQuMi4xMSBTeW1ib2wuc3BsaXRcbi8vIDE5LjQuMi4xMiBTeW1ib2wudG9QcmltaXRpdmVcbi8vIDE5LjQuMi4xMyBTeW1ib2wudG9TdHJpbmdUYWdcbi8vIDE5LjQuMi4xNCBTeW1ib2wudW5zY29wYWJsZXNcbmZvcih2YXIgc3ltYm9scyA9IChcbiAgJ2hhc0luc3RhbmNlLGlzQ29uY2F0U3ByZWFkYWJsZSxpdGVyYXRvcixtYXRjaCxyZXBsYWNlLHNlYXJjaCxzcGVjaWVzLHNwbGl0LHRvUHJpbWl0aXZlLHRvU3RyaW5nVGFnLHVuc2NvcGFibGVzJ1xuKS5zcGxpdCgnLCcpLCBpID0gMDsgc3ltYm9scy5sZW5ndGggPiBpOyApe1xuICB2YXIga2V5ICAgICA9IHN5bWJvbHNbaSsrXVxuICAgICwgV3JhcHBlciA9IGNvcmUuU3ltYm9sXG4gICAgLCBzeW0gICAgID0gd2tzKGtleSk7XG4gIGlmKCEoa2V5IGluIFdyYXBwZXIpKWRQKFdyYXBwZXIsIGtleSwge3ZhbHVlOiBVU0VfTkFUSVZFID8gc3ltIDogd3JhcChzeW0pfSk7XG59O1xuXG4vLyBEb24ndCB1c2Ugc2V0dGVycyBpbiBRdCBTY3JpcHQsIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy8xNzNcbmlmKCFRT2JqZWN0IHx8ICFRT2JqZWN0W1BST1RPVFlQRV0gfHwgIVFPYmplY3RbUFJPVE9UWVBFXS5maW5kQ2hpbGQpc2V0dGVyID0gdHJ1ZTtcblxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhVVNFX05BVElWRSwgJ1N5bWJvbCcsIHtcbiAgLy8gMTkuNC4yLjEgU3ltYm9sLmZvcihrZXkpXG4gICdmb3InOiBmdW5jdGlvbihrZXkpe1xuICAgIHJldHVybiBoYXMoU3ltYm9sUmVnaXN0cnksIGtleSArPSAnJylcbiAgICAgID8gU3ltYm9sUmVnaXN0cnlba2V5XVxuICAgICAgOiBTeW1ib2xSZWdpc3RyeVtrZXldID0gJFN5bWJvbChrZXkpO1xuICB9LFxuICAvLyAxOS40LjIuNSBTeW1ib2wua2V5Rm9yKHN5bSlcbiAga2V5Rm9yOiBmdW5jdGlvbiBrZXlGb3Ioa2V5KXtcbiAgICBpZihpc1N5bWJvbChrZXkpKXJldHVybiBrZXlPZihTeW1ib2xSZWdpc3RyeSwga2V5KTtcbiAgICB0aHJvdyBUeXBlRXJyb3Ioa2V5ICsgJyBpcyBub3QgYSBzeW1ib2whJyk7XG4gIH0sXG4gIHVzZVNldHRlcjogZnVuY3Rpb24oKXsgc2V0dGVyID0gdHJ1ZTsgfSxcbiAgdXNlU2ltcGxlOiBmdW5jdGlvbigpeyBzZXR0ZXIgPSBmYWxzZTsgfVxufSk7XG5cbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIVVTRV9OQVRJVkUsICdPYmplY3QnLCB7XG4gIC8vIDE5LjEuMi4yIE9iamVjdC5jcmVhdGUoTyBbLCBQcm9wZXJ0aWVzXSlcbiAgY3JlYXRlOiAkY3JlYXRlLFxuICAvLyAxOS4xLjIuNCBPYmplY3QuZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcylcbiAgZGVmaW5lUHJvcGVydHk6ICRkZWZpbmVQcm9wZXJ0eSxcbiAgLy8gMTkuMS4yLjMgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoTywgUHJvcGVydGllcylcbiAgZGVmaW5lUHJvcGVydGllczogJGRlZmluZVByb3BlcnRpZXMsXG4gIC8vIDE5LjEuMi42IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUClcbiAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLFxuICAvLyAxOS4xLjIuNyBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhPKVxuICBnZXRPd25Qcm9wZXJ0eU5hbWVzOiAkZ2V0T3duUHJvcGVydHlOYW1lcyxcbiAgLy8gMTkuMS4yLjggT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhPKVxuICBnZXRPd25Qcm9wZXJ0eVN5bWJvbHM6ICRnZXRPd25Qcm9wZXJ0eVN5bWJvbHNcbn0pO1xuXG4vLyAyNC4zLjIgSlNPTi5zdHJpbmdpZnkodmFsdWUgWywgcmVwbGFjZXIgWywgc3BhY2VdXSlcbiRKU09OICYmICRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogKCFVU0VfTkFUSVZFIHx8IEJVR0dZX0pTT04pLCAnSlNPTicsIHtzdHJpbmdpZnk6ICRzdHJpbmdpZnl9KTtcblxuLy8gMTkuNC4zLjQgU3ltYm9sLnByb3RvdHlwZVtAQHRvUHJpbWl0aXZlXShoaW50KVxuJFN5bWJvbFtQUk9UT1RZUEVdW1RPX1BSSU1JVElWRV0gfHwgcmVxdWlyZSgnLi9faGlkZScpKCRTeW1ib2xbUFJPVE9UWVBFXSwgVE9fUFJJTUlUSVZFLCAkU3ltYm9sW1BST1RPVFlQRV0udmFsdWVPZik7XG4vLyAxOS40LjMuNSBTeW1ib2wucHJvdG90eXBlW0BAdG9TdHJpbmdUYWddXG5zZXRUb1N0cmluZ1RhZygkU3ltYm9sLCAnU3ltYm9sJyk7XG4vLyAyMC4yLjEuOSBNYXRoW0BAdG9TdHJpbmdUYWddXG5zZXRUb1N0cmluZ1RhZyhNYXRoLCAnTWF0aCcsIHRydWUpO1xuLy8gMjQuMy4zIEpTT05bQEB0b1N0cmluZ1RhZ11cbnNldFRvU3RyaW5nVGFnKGdsb2JhbC5KU09OLCAnSlNPTicsIHRydWUpO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zeW1ib2wuanNcbiAqKiBtb2R1bGUgaWQgPSAzXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvODYjaXNzdWVjb21tZW50LTExNTc1OTAyOFxudmFyIGdsb2JhbCA9IG1vZHVsZS5leHBvcnRzID0gdHlwZW9mIHdpbmRvdyAhPSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuTWF0aCA9PSBNYXRoXG4gID8gd2luZG93IDogdHlwZW9mIHNlbGYgIT0gJ3VuZGVmaW5lZCcgJiYgc2VsZi5NYXRoID09IE1hdGggPyBzZWxmIDogRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcbmlmKHR5cGVvZiBfX2cgPT0gJ251bWJlcicpX19nID0gZ2xvYmFsOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2dsb2JhbC5qc1xuICoqIG1vZHVsZSBpZCA9IDRcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBjb3JlID0gbW9kdWxlLmV4cG9ydHMgPSB7dmVyc2lvbjogJzIuMi4xJ307XG5pZih0eXBlb2YgX19lID09ICdudW1iZXInKV9fZSA9IGNvcmU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fY29yZS5qc1xuICoqIG1vZHVsZSBpZCA9IDVcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBoYXNPd25Qcm9wZXJ0eSA9IHt9Lmhhc093blByb3BlcnR5O1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCwga2V5KXtcbiAgcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwoaXQsIGtleSk7XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19oYXMuanNcbiAqKiBtb2R1bGUgaWQgPSA2XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyBUaGFuaydzIElFOCBmb3IgaGlzIGZ1bm55IGRlZmluZVByb3BlcnR5XG5tb2R1bGUuZXhwb3J0cyA9ICFyZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uKCl7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICdhJywge2dldDogZnVuY3Rpb24oKXsgcmV0dXJuIDc7IH19KS5hICE9IDc7XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fZGVzY3JpcHRvcnMuanNcbiAqKiBtb2R1bGUgaWQgPSA3XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGV4ZWMpe1xuICB0cnkge1xuICAgIHJldHVybiAhIWV4ZWMoKTtcbiAgfSBjYXRjaChlKXtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fZmFpbHMuanNcbiAqKiBtb2R1bGUgaWQgPSA4XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgZ2xvYmFsICAgID0gcmVxdWlyZSgnLi9fZ2xvYmFsJylcbiAgLCBjb3JlICAgICAgPSByZXF1aXJlKCcuL19jb3JlJylcbiAgLCBoaWRlICAgICAgPSByZXF1aXJlKCcuL19oaWRlJylcbiAgLCByZWRlZmluZSAgPSByZXF1aXJlKCcuL19yZWRlZmluZScpXG4gICwgY3R4ICAgICAgID0gcmVxdWlyZSgnLi9fY3R4JylcbiAgLCBQUk9UT1RZUEUgPSAncHJvdG90eXBlJztcblxudmFyICRleHBvcnQgPSBmdW5jdGlvbih0eXBlLCBuYW1lLCBzb3VyY2Upe1xuICB2YXIgSVNfRk9SQ0VEID0gdHlwZSAmICRleHBvcnQuRlxuICAgICwgSVNfR0xPQkFMID0gdHlwZSAmICRleHBvcnQuR1xuICAgICwgSVNfU1RBVElDID0gdHlwZSAmICRleHBvcnQuU1xuICAgICwgSVNfUFJPVE8gID0gdHlwZSAmICRleHBvcnQuUFxuICAgICwgSVNfQklORCAgID0gdHlwZSAmICRleHBvcnQuQlxuICAgICwgdGFyZ2V0ICAgID0gSVNfR0xPQkFMID8gZ2xvYmFsIDogSVNfU1RBVElDID8gZ2xvYmFsW25hbWVdIHx8IChnbG9iYWxbbmFtZV0gPSB7fSkgOiAoZ2xvYmFsW25hbWVdIHx8IHt9KVtQUk9UT1RZUEVdXG4gICAgLCBleHBvcnRzICAgPSBJU19HTE9CQUwgPyBjb3JlIDogY29yZVtuYW1lXSB8fCAoY29yZVtuYW1lXSA9IHt9KVxuICAgICwgZXhwUHJvdG8gID0gZXhwb3J0c1tQUk9UT1RZUEVdIHx8IChleHBvcnRzW1BST1RPVFlQRV0gPSB7fSlcbiAgICAsIGtleSwgb3duLCBvdXQsIGV4cDtcbiAgaWYoSVNfR0xPQkFMKXNvdXJjZSA9IG5hbWU7XG4gIGZvcihrZXkgaW4gc291cmNlKXtcbiAgICAvLyBjb250YWlucyBpbiBuYXRpdmVcbiAgICBvd24gPSAhSVNfRk9SQ0VEICYmIHRhcmdldCAmJiB0YXJnZXRba2V5XSAhPT0gdW5kZWZpbmVkO1xuICAgIC8vIGV4cG9ydCBuYXRpdmUgb3IgcGFzc2VkXG4gICAgb3V0ID0gKG93biA/IHRhcmdldCA6IHNvdXJjZSlba2V5XTtcbiAgICAvLyBiaW5kIHRpbWVycyB0byBnbG9iYWwgZm9yIGNhbGwgZnJvbSBleHBvcnQgY29udGV4dFxuICAgIGV4cCA9IElTX0JJTkQgJiYgb3duID8gY3R4KG91dCwgZ2xvYmFsKSA6IElTX1BST1RPICYmIHR5cGVvZiBvdXQgPT0gJ2Z1bmN0aW9uJyA/IGN0eChGdW5jdGlvbi5jYWxsLCBvdXQpIDogb3V0O1xuICAgIC8vIGV4dGVuZCBnbG9iYWxcbiAgICBpZih0YXJnZXQpcmVkZWZpbmUodGFyZ2V0LCBrZXksIG91dCwgdHlwZSAmICRleHBvcnQuVSk7XG4gICAgLy8gZXhwb3J0XG4gICAgaWYoZXhwb3J0c1trZXldICE9IG91dCloaWRlKGV4cG9ydHMsIGtleSwgZXhwKTtcbiAgICBpZihJU19QUk9UTyAmJiBleHBQcm90b1trZXldICE9IG91dClleHBQcm90b1trZXldID0gb3V0O1xuICB9XG59O1xuZ2xvYmFsLmNvcmUgPSBjb3JlO1xuLy8gdHlwZSBiaXRtYXBcbiRleHBvcnQuRiA9IDE7ICAgLy8gZm9yY2VkXG4kZXhwb3J0LkcgPSAyOyAgIC8vIGdsb2JhbFxuJGV4cG9ydC5TID0gNDsgICAvLyBzdGF0aWNcbiRleHBvcnQuUCA9IDg7ICAgLy8gcHJvdG9cbiRleHBvcnQuQiA9IDE2OyAgLy8gYmluZFxuJGV4cG9ydC5XID0gMzI7ICAvLyB3cmFwXG4kZXhwb3J0LlUgPSA2NDsgIC8vIHNhZmVcbiRleHBvcnQuUiA9IDEyODsgLy8gcmVhbCBwcm90byBtZXRob2QgZm9yIGBsaWJyYXJ5YCBcbm1vZHVsZS5leHBvcnRzID0gJGV4cG9ydDtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fZXhwb3J0LmpzXG4gKiogbW9kdWxlIGlkID0gOVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwidmFyIGRQICAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKVxuICAsIGNyZWF0ZURlc2MgPSByZXF1aXJlKCcuL19wcm9wZXJ0eS1kZXNjJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgPyBmdW5jdGlvbihvYmplY3QsIGtleSwgdmFsdWUpe1xuICByZXR1cm4gZFAuZihvYmplY3QsIGtleSwgY3JlYXRlRGVzYygxLCB2YWx1ZSkpO1xufSA6IGZ1bmN0aW9uKG9iamVjdCwga2V5LCB2YWx1ZSl7XG4gIG9iamVjdFtrZXldID0gdmFsdWU7XG4gIHJldHVybiBvYmplY3Q7XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19oaWRlLmpzXG4gKiogbW9kdWxlIGlkID0gMTBcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBhbk9iamVjdCAgICAgICA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpXG4gICwgSUU4X0RPTV9ERUZJTkUgPSByZXF1aXJlKCcuL19pZTgtZG9tLWRlZmluZScpXG4gICwgdG9QcmltaXRpdmUgICAgPSByZXF1aXJlKCcuL190by1wcmltaXRpdmUnKVxuICAsIGRQICAgICAgICAgICAgID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xuXG5leHBvcnRzLmYgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpID8gT2JqZWN0LmRlZmluZVByb3BlcnR5IDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcyl7XG4gIGFuT2JqZWN0KE8pO1xuICBQID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7XG4gIGFuT2JqZWN0KEF0dHJpYnV0ZXMpO1xuICBpZihJRThfRE9NX0RFRklORSl0cnkge1xuICAgIHJldHVybiBkUChPLCBQLCBBdHRyaWJ1dGVzKTtcbiAgfSBjYXRjaChlKXsgLyogZW1wdHkgKi8gfVxuICBpZignZ2V0JyBpbiBBdHRyaWJ1dGVzIHx8ICdzZXQnIGluIEF0dHJpYnV0ZXMpdGhyb3cgVHlwZUVycm9yKCdBY2Nlc3NvcnMgbm90IHN1cHBvcnRlZCEnKTtcbiAgaWYoJ3ZhbHVlJyBpbiBBdHRyaWJ1dGVzKU9bUF0gPSBBdHRyaWJ1dGVzLnZhbHVlO1xuICByZXR1cm4gTztcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1kcC5qc1xuICoqIG1vZHVsZSBpZCA9IDExXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICBpZighaXNPYmplY3QoaXQpKXRocm93IFR5cGVFcnJvcihpdCArICcgaXMgbm90IGFuIG9iamVjdCEnKTtcbiAgcmV0dXJuIGl0O1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fYW4tb2JqZWN0LmpzXG4gKiogbW9kdWxlIGlkID0gMTJcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gdHlwZW9mIGl0ID09PSAnb2JqZWN0JyA/IGl0ICE9PSBudWxsIDogdHlwZW9mIGl0ID09PSAnZnVuY3Rpb24nO1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9faXMtb2JqZWN0LmpzXG4gKiogbW9kdWxlIGlkID0gMTNcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIm1vZHVsZS5leHBvcnRzID0gIXJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgJiYgIXJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24oKXtcclxuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlcXVpcmUoJy4vX2RvbS1jcmVhdGUnKSgnZGl2JyksICdhJywge2dldDogZnVuY3Rpb24oKXsgcmV0dXJuIDc7IH19KS5hICE9IDc7XHJcbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19pZTgtZG9tLWRlZmluZS5qc1xuICoqIG1vZHVsZSBpZCA9IDE0XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKVxuICAsIGRvY3VtZW50ID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykuZG9jdW1lbnRcbiAgLy8gaW4gb2xkIElFIHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFbGVtZW50IGlzICdvYmplY3QnXG4gICwgaXMgPSBpc09iamVjdChkb2N1bWVudCkgJiYgaXNPYmplY3QoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIGlzID8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChpdCkgOiB7fTtcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2RvbS1jcmVhdGUuanNcbiAqKiBtb2R1bGUgaWQgPSAxNVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gNy4xLjEgVG9QcmltaXRpdmUoaW5wdXQgWywgUHJlZmVycmVkVHlwZV0pXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbi8vIGluc3RlYWQgb2YgdGhlIEVTNiBzcGVjIHZlcnNpb24sIHdlIGRpZG4ndCBpbXBsZW1lbnQgQEB0b1ByaW1pdGl2ZSBjYXNlXG4vLyBhbmQgdGhlIHNlY29uZCBhcmd1bWVudCAtIGZsYWcgLSBwcmVmZXJyZWQgdHlwZSBpcyBhIHN0cmluZ1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCwgUyl7XG4gIGlmKCFpc09iamVjdChpdCkpcmV0dXJuIGl0O1xuICB2YXIgZm4sIHZhbDtcbiAgaWYoUyAmJiB0eXBlb2YgKGZuID0gaXQudG9TdHJpbmcpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSlyZXR1cm4gdmFsO1xuICBpZih0eXBlb2YgKGZuID0gaXQudmFsdWVPZikgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKXJldHVybiB2YWw7XG4gIGlmKCFTICYmIHR5cGVvZiAoZm4gPSBpdC50b1N0cmluZykgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKXJldHVybiB2YWw7XG4gIHRocm93IFR5cGVFcnJvcihcIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZVwiKTtcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX3RvLXByaW1pdGl2ZS5qc1xuICoqIG1vZHVsZSBpZCA9IDE2XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGJpdG1hcCwgdmFsdWUpe1xuICByZXR1cm4ge1xuICAgIGVudW1lcmFibGUgIDogIShiaXRtYXAgJiAxKSxcbiAgICBjb25maWd1cmFibGU6ICEoYml0bWFwICYgMiksXG4gICAgd3JpdGFibGUgICAgOiAhKGJpdG1hcCAmIDQpLFxuICAgIHZhbHVlICAgICAgIDogdmFsdWVcbiAgfTtcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX3Byb3BlcnR5LWRlc2MuanNcbiAqKiBtb2R1bGUgaWQgPSAxN1xuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwidmFyIGdsb2JhbCAgICA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpXG4gICwgaGlkZSAgICAgID0gcmVxdWlyZSgnLi9faGlkZScpXG4gICwgaGFzICAgICAgID0gcmVxdWlyZSgnLi9faGFzJylcbiAgLCBTUkMgICAgICAgPSByZXF1aXJlKCcuL191aWQnKSgnc3JjJylcbiAgLCBUT19TVFJJTkcgPSAndG9TdHJpbmcnXG4gICwgJHRvU3RyaW5nID0gRnVuY3Rpb25bVE9fU1RSSU5HXVxuICAsIFRQTCAgICAgICA9ICgnJyArICR0b1N0cmluZykuc3BsaXQoVE9fU1RSSU5HKTtcblxucmVxdWlyZSgnLi9fY29yZScpLmluc3BlY3RTb3VyY2UgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiAkdG9TdHJpbmcuY2FsbChpdCk7XG59O1xuXG4obW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihPLCBrZXksIHZhbCwgc2FmZSl7XG4gIHZhciBpc0Z1bmN0aW9uID0gdHlwZW9mIHZhbCA9PSAnZnVuY3Rpb24nO1xuICBpZihpc0Z1bmN0aW9uKWhhcyh2YWwsICduYW1lJykgfHwgaGlkZSh2YWwsICduYW1lJywga2V5KTtcbiAgaWYoT1trZXldID09PSB2YWwpcmV0dXJuO1xuICBpZihpc0Z1bmN0aW9uKWhhcyh2YWwsIFNSQykgfHwgaGlkZSh2YWwsIFNSQywgT1trZXldID8gJycgKyBPW2tleV0gOiBUUEwuam9pbihTdHJpbmcoa2V5KSkpO1xuICBpZihPID09PSBnbG9iYWwpe1xuICAgIE9ba2V5XSA9IHZhbDtcbiAgfSBlbHNlIHtcbiAgICBpZighc2FmZSl7XG4gICAgICBkZWxldGUgT1trZXldO1xuICAgICAgaGlkZShPLCBrZXksIHZhbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmKE9ba2V5XSlPW2tleV0gPSB2YWw7XG4gICAgICBlbHNlIGhpZGUoTywga2V5LCB2YWwpO1xuICAgIH1cbiAgfVxuLy8gYWRkIGZha2UgRnVuY3Rpb24jdG9TdHJpbmcgZm9yIGNvcnJlY3Qgd29yayB3cmFwcGVkIG1ldGhvZHMgLyBjb25zdHJ1Y3RvcnMgd2l0aCBtZXRob2RzIGxpa2UgTG9EYXNoIGlzTmF0aXZlXG59KShGdW5jdGlvbi5wcm90b3R5cGUsIFRPX1NUUklORywgZnVuY3Rpb24gdG9TdHJpbmcoKXtcbiAgcmV0dXJuIHR5cGVvZiB0aGlzID09ICdmdW5jdGlvbicgJiYgdGhpc1tTUkNdIHx8ICR0b1N0cmluZy5jYWxsKHRoaXMpO1xufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX3JlZGVmaW5lLmpzXG4gKiogbW9kdWxlIGlkID0gMThcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBpZCA9IDBcbiAgLCBweCA9IE1hdGgucmFuZG9tKCk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGtleSl7XG4gIHJldHVybiAnU3ltYm9sKCcuY29uY2F0KGtleSA9PT0gdW5kZWZpbmVkID8gJycgOiBrZXksICcpXycsICgrK2lkICsgcHgpLnRvU3RyaW5nKDM2KSk7XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL191aWQuanNcbiAqKiBtb2R1bGUgaWQgPSAxOVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gb3B0aW9uYWwgLyBzaW1wbGUgY29udGV4dCBiaW5kaW5nXG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihmbiwgdGhhdCwgbGVuZ3RoKXtcbiAgYUZ1bmN0aW9uKGZuKTtcbiAgaWYodGhhdCA9PT0gdW5kZWZpbmVkKXJldHVybiBmbjtcbiAgc3dpdGNoKGxlbmd0aCl7XG4gICAgY2FzZSAxOiByZXR1cm4gZnVuY3Rpb24oYSl7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhKTtcbiAgICB9O1xuICAgIGNhc2UgMjogcmV0dXJuIGZ1bmN0aW9uKGEsIGIpe1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSwgYik7XG4gICAgfTtcbiAgICBjYXNlIDM6IHJldHVybiBmdW5jdGlvbihhLCBiLCBjKXtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIsIGMpO1xuICAgIH07XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uKC8qIC4uLmFyZ3MgKi8pe1xuICAgIHJldHVybiBmbi5hcHBseSh0aGF0LCBhcmd1bWVudHMpO1xuICB9O1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fY3R4LmpzXG4gKiogbW9kdWxlIGlkID0gMjBcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICBpZih0eXBlb2YgaXQgIT0gJ2Z1bmN0aW9uJyl0aHJvdyBUeXBlRXJyb3IoaXQgKyAnIGlzIG5vdCBhIGZ1bmN0aW9uIScpO1xuICByZXR1cm4gaXQ7XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19hLWZ1bmN0aW9uLmpzXG4gKiogbW9kdWxlIGlkID0gMjFcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBNRVRBICAgICA9IHJlcXVpcmUoJy4vX3VpZCcpKCdtZXRhJylcbiAgLCBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpXG4gICwgaGFzICAgICAgPSByZXF1aXJlKCcuL19oYXMnKVxuICAsIHNldERlc2MgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZlxuICAsIGlkICAgICAgID0gMDtcbnZhciBpc0V4dGVuc2libGUgPSBPYmplY3QuaXNFeHRlbnNpYmxlIHx8IGZ1bmN0aW9uKCl7XG4gIHJldHVybiB0cnVlO1xufTtcbnZhciBGUkVFWkUgPSAhcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbigpe1xuICByZXR1cm4gaXNFeHRlbnNpYmxlKE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyh7fSkpO1xufSk7XG52YXIgc2V0TWV0YSA9IGZ1bmN0aW9uKGl0KXtcbiAgc2V0RGVzYyhpdCwgTUVUQSwge3ZhbHVlOiB7XG4gICAgaTogJ08nICsgKytpZCwgLy8gb2JqZWN0IElEXG4gICAgdzoge30gICAgICAgICAgLy8gd2VhayBjb2xsZWN0aW9ucyBJRHNcbiAgfX0pO1xufTtcbnZhciBmYXN0S2V5ID0gZnVuY3Rpb24oaXQsIGNyZWF0ZSl7XG4gIC8vIHJldHVybiBwcmltaXRpdmUgd2l0aCBwcmVmaXhcbiAgaWYoIWlzT2JqZWN0KGl0KSlyZXR1cm4gdHlwZW9mIGl0ID09ICdzeW1ib2wnID8gaXQgOiAodHlwZW9mIGl0ID09ICdzdHJpbmcnID8gJ1MnIDogJ1AnKSArIGl0O1xuICBpZighaGFzKGl0LCBNRVRBKSl7XG4gICAgLy8gY2FuJ3Qgc2V0IG1ldGFkYXRhIHRvIHVuY2F1Z2h0IGZyb3plbiBvYmplY3RcbiAgICBpZighaXNFeHRlbnNpYmxlKGl0KSlyZXR1cm4gJ0YnO1xuICAgIC8vIG5vdCBuZWNlc3NhcnkgdG8gYWRkIG1ldGFkYXRhXG4gICAgaWYoIWNyZWF0ZSlyZXR1cm4gJ0UnO1xuICAgIC8vIGFkZCBtaXNzaW5nIG1ldGFkYXRhXG4gICAgc2V0TWV0YShpdCk7XG4gIC8vIHJldHVybiBvYmplY3QgSURcbiAgfSByZXR1cm4gaXRbTUVUQV0uaTtcbn07XG52YXIgZ2V0V2VhayA9IGZ1bmN0aW9uKGl0LCBjcmVhdGUpe1xuICBpZighaGFzKGl0LCBNRVRBKSl7XG4gICAgLy8gY2FuJ3Qgc2V0IG1ldGFkYXRhIHRvIHVuY2F1Z2h0IGZyb3plbiBvYmplY3RcbiAgICBpZighaXNFeHRlbnNpYmxlKGl0KSlyZXR1cm4gdHJ1ZTtcbiAgICAvLyBub3QgbmVjZXNzYXJ5IHRvIGFkZCBtZXRhZGF0YVxuICAgIGlmKCFjcmVhdGUpcmV0dXJuIGZhbHNlO1xuICAgIC8vIGFkZCBtaXNzaW5nIG1ldGFkYXRhXG4gICAgc2V0TWV0YShpdCk7XG4gIC8vIHJldHVybiBoYXNoIHdlYWsgY29sbGVjdGlvbnMgSURzXG4gIH0gcmV0dXJuIGl0W01FVEFdLnc7XG59O1xuLy8gYWRkIG1ldGFkYXRhIG9uIGZyZWV6ZS1mYW1pbHkgbWV0aG9kcyBjYWxsaW5nXG52YXIgb25GcmVlemUgPSBmdW5jdGlvbihpdCl7XG4gIGlmKEZSRUVaRSAmJiBtZXRhLk5FRUQgJiYgaXNFeHRlbnNpYmxlKGl0KSAmJiAhaGFzKGl0LCBNRVRBKSlzZXRNZXRhKGl0KTtcbiAgcmV0dXJuIGl0O1xufTtcbnZhciBtZXRhID0gbW9kdWxlLmV4cG9ydHMgPSB7XG4gIEtFWTogICAgICBNRVRBLFxuICBORUVEOiAgICAgZmFsc2UsXG4gIGZhc3RLZXk6ICBmYXN0S2V5LFxuICBnZXRXZWFrOiAgZ2V0V2VhayxcbiAgb25GcmVlemU6IG9uRnJlZXplXG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19tZXRhLmpzXG4gKiogbW9kdWxlIGlkID0gMjJcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKVxuICAsIFNIQVJFRCA9ICdfX2NvcmUtanNfc2hhcmVkX18nXG4gICwgc3RvcmUgID0gZ2xvYmFsW1NIQVJFRF0gfHwgKGdsb2JhbFtTSEFSRURdID0ge30pO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihrZXkpe1xuICByZXR1cm4gc3RvcmVba2V5XSB8fCAoc3RvcmVba2V5XSA9IHt9KTtcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX3NoYXJlZC5qc1xuICoqIG1vZHVsZSBpZCA9IDIzXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgZGVmID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZlxuICAsIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpXG4gICwgVEFHID0gcmVxdWlyZSgnLi9fd2tzJykoJ3RvU3RyaW5nVGFnJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQsIHRhZywgc3RhdCl7XG4gIGlmKGl0ICYmICFoYXMoaXQgPSBzdGF0ID8gaXQgOiBpdC5wcm90b3R5cGUsIFRBRykpZGVmKGl0LCBUQUcsIHtjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiB0YWd9KTtcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX3NldC10by1zdHJpbmctdGFnLmpzXG4gKiogbW9kdWxlIGlkID0gMjRcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBzdG9yZSAgICAgID0gcmVxdWlyZSgnLi9fc2hhcmVkJykoJ3drcycpXG4gICwgdWlkICAgICAgICA9IHJlcXVpcmUoJy4vX3VpZCcpXG4gICwgU3ltYm9sICAgICA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpLlN5bWJvbFxuICAsIFVTRV9TWU1CT0wgPSB0eXBlb2YgU3ltYm9sID09ICdmdW5jdGlvbic7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG5hbWUpe1xuICByZXR1cm4gc3RvcmVbbmFtZV0gfHwgKHN0b3JlW25hbWVdID1cbiAgICBVU0VfU1lNQk9MICYmIFN5bWJvbFtuYW1lXSB8fCAoVVNFX1NZTUJPTCA/IFN5bWJvbCA6IHVpZCkoJ1N5bWJvbC4nICsgbmFtZSkpO1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fd2tzLmpzXG4gKiogbW9kdWxlIGlkID0gMjVcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBnZXRLZXlzICAgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpXG4gICwgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihvYmplY3QsIGVsKXtcbiAgdmFyIE8gICAgICA9IHRvSU9iamVjdChvYmplY3QpXG4gICAgLCBrZXlzICAgPSBnZXRLZXlzKE8pXG4gICAgLCBsZW5ndGggPSBrZXlzLmxlbmd0aFxuICAgICwgaW5kZXggID0gMFxuICAgICwga2V5O1xuICB3aGlsZShsZW5ndGggPiBpbmRleClpZihPW2tleSA9IGtleXNbaW5kZXgrK11dID09PSBlbClyZXR1cm4ga2V5O1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fa2V5b2YuanNcbiAqKiBtb2R1bGUgaWQgPSAyNlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gMTkuMS4yLjE0IC8gMTUuMi4zLjE0IE9iamVjdC5rZXlzKE8pXHJcbnZhciAka2V5cyAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzLWludGVybmFsJylcclxuICAsIGVudW1CdWdLZXlzID0gcmVxdWlyZSgnLi9fZW51bS1idWcta2V5cycpO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbiBrZXlzKE8pe1xyXG4gIHJldHVybiAka2V5cyhPLCBlbnVtQnVnS2V5cyk7XHJcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1rZXlzLmpzXG4gKiogbW9kdWxlIGlkID0gMjdcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBoYXMgICAgICAgICAgPSByZXF1aXJlKCcuL19oYXMnKVxyXG4gICwgdG9JT2JqZWN0ICAgID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpXHJcbiAgLCBhcnJheUluZGV4T2YgPSByZXF1aXJlKCcuL19hcnJheS1pbmNsdWRlcycpKGZhbHNlKVxyXG4gICwgSUVfUFJPVE8gICAgID0gcmVxdWlyZSgnLi9fc2hhcmVkLWtleScpKCdJRV9QUk9UTycpO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihvYmplY3QsIG5hbWVzKXtcclxuICB2YXIgTyAgICAgID0gdG9JT2JqZWN0KG9iamVjdClcclxuICAgICwgaSAgICAgID0gMFxyXG4gICAgLCByZXN1bHQgPSBbXVxyXG4gICAgLCBrZXk7XHJcbiAgZm9yKGtleSBpbiBPKWlmKGtleSAhPSBJRV9QUk9UTyloYXMoTywga2V5KSAmJiByZXN1bHQucHVzaChrZXkpO1xyXG4gIC8vIERvbid0IGVudW0gYnVnICYgaGlkZGVuIGtleXNcclxuICB3aGlsZShuYW1lcy5sZW5ndGggPiBpKWlmKGhhcyhPLCBrZXkgPSBuYW1lc1tpKytdKSl7XHJcbiAgICB+YXJyYXlJbmRleE9mKHJlc3VsdCwga2V5KSB8fCByZXN1bHQucHVzaChrZXkpO1xyXG4gIH1cclxuICByZXR1cm4gcmVzdWx0O1xyXG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19vYmplY3Qta2V5cy1pbnRlcm5hbC5qc1xuICoqIG1vZHVsZSBpZCA9IDI4XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyB0byBpbmRleGVkIG9iamVjdCwgdG9PYmplY3Qgd2l0aCBmYWxsYmFjayBmb3Igbm9uLWFycmF5LWxpa2UgRVMzIHN0cmluZ3NcbnZhciBJT2JqZWN0ID0gcmVxdWlyZSgnLi9faW9iamVjdCcpXG4gICwgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gSU9iamVjdChkZWZpbmVkKGl0KSk7XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL190by1pb2JqZWN0LmpzXG4gKiogbW9kdWxlIGlkID0gMjlcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgYW5kIG5vbi1lbnVtZXJhYmxlIG9sZCBWOCBzdHJpbmdzXG52YXIgY29mID0gcmVxdWlyZSgnLi9fY29mJyk7XG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdCgneicpLnByb3BlcnR5SXNFbnVtZXJhYmxlKDApID8gT2JqZWN0IDogZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gY29mKGl0KSA9PSAnU3RyaW5nJyA/IGl0LnNwbGl0KCcnKSA6IE9iamVjdChpdCk7XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19pb2JqZWN0LmpzXG4gKiogbW9kdWxlIGlkID0gMzBcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciB0b1N0cmluZyA9IHt9LnRvU3RyaW5nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwoaXQpLnNsaWNlKDgsIC0xKTtcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2NvZi5qc1xuICoqIG1vZHVsZSBpZCA9IDMxXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyA3LjIuMSBSZXF1aXJlT2JqZWN0Q29lcmNpYmxlKGFyZ3VtZW50KVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIGlmKGl0ID09IHVuZGVmaW5lZCl0aHJvdyBUeXBlRXJyb3IoXCJDYW4ndCBjYWxsIG1ldGhvZCBvbiAgXCIgKyBpdCk7XG4gIHJldHVybiBpdDtcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2RlZmluZWQuanNcbiAqKiBtb2R1bGUgaWQgPSAzMlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gZmFsc2UgLT4gQXJyYXkjaW5kZXhPZlxuLy8gdHJ1ZSAgLT4gQXJyYXkjaW5jbHVkZXNcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0JylcbiAgLCB0b0xlbmd0aCAgPSByZXF1aXJlKCcuL190by1sZW5ndGgnKVxuICAsIHRvSW5kZXggICA9IHJlcXVpcmUoJy4vX3RvLWluZGV4Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKElTX0lOQ0xVREVTKXtcbiAgcmV0dXJuIGZ1bmN0aW9uKCR0aGlzLCBlbCwgZnJvbUluZGV4KXtcbiAgICB2YXIgTyAgICAgID0gdG9JT2JqZWN0KCR0aGlzKVxuICAgICAgLCBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aClcbiAgICAgICwgaW5kZXggID0gdG9JbmRleChmcm9tSW5kZXgsIGxlbmd0aClcbiAgICAgICwgdmFsdWU7XG4gICAgLy8gQXJyYXkjaW5jbHVkZXMgdXNlcyBTYW1lVmFsdWVaZXJvIGVxdWFsaXR5IGFsZ29yaXRobVxuICAgIGlmKElTX0lOQ0xVREVTICYmIGVsICE9IGVsKXdoaWxlKGxlbmd0aCA+IGluZGV4KXtcbiAgICAgIHZhbHVlID0gT1tpbmRleCsrXTtcbiAgICAgIGlmKHZhbHVlICE9IHZhbHVlKXJldHVybiB0cnVlO1xuICAgIC8vIEFycmF5I3RvSW5kZXggaWdub3JlcyBob2xlcywgQXJyYXkjaW5jbHVkZXMgLSBub3RcbiAgICB9IGVsc2UgZm9yKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKylpZihJU19JTkNMVURFUyB8fCBpbmRleCBpbiBPKXtcbiAgICAgIGlmKE9baW5kZXhdID09PSBlbClyZXR1cm4gSVNfSU5DTFVERVMgfHwgaW5kZXg7XG4gICAgfSByZXR1cm4gIUlTX0lOQ0xVREVTICYmIC0xO1xuICB9O1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fYXJyYXktaW5jbHVkZXMuanNcbiAqKiBtb2R1bGUgaWQgPSAzM1xuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gNy4xLjE1IFRvTGVuZ3RoXG52YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpXG4gICwgbWluICAgICAgID0gTWF0aC5taW47XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIGl0ID4gMCA/IG1pbih0b0ludGVnZXIoaXQpLCAweDFmZmZmZmZmZmZmZmZmKSA6IDA7IC8vIHBvdygyLCA1MykgLSAxID09IDkwMDcxOTkyNTQ3NDA5OTFcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX3RvLWxlbmd0aC5qc1xuICoqIG1vZHVsZSBpZCA9IDM0XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyA3LjEuNCBUb0ludGVnZXJcbnZhciBjZWlsICA9IE1hdGguY2VpbFxuICAsIGZsb29yID0gTWF0aC5mbG9vcjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gaXNOYU4oaXQgPSAraXQpID8gMCA6IChpdCA+IDAgPyBmbG9vciA6IGNlaWwpKGl0KTtcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX3RvLWludGVnZXIuanNcbiAqKiBtb2R1bGUgaWQgPSAzNVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwidmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4vX3RvLWludGVnZXInKVxuICAsIG1heCAgICAgICA9IE1hdGgubWF4XG4gICwgbWluICAgICAgID0gTWF0aC5taW47XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGluZGV4LCBsZW5ndGgpe1xuICBpbmRleCA9IHRvSW50ZWdlcihpbmRleCk7XG4gIHJldHVybiBpbmRleCA8IDAgPyBtYXgoaW5kZXggKyBsZW5ndGgsIDApIDogbWluKGluZGV4LCBsZW5ndGgpO1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fdG8taW5kZXguanNcbiAqKiBtb2R1bGUgaWQgPSAzNlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwidmFyIHNoYXJlZCA9IHJlcXVpcmUoJy4vX3NoYXJlZCcpKCdrZXlzJylcclxuICAsIHVpZCAgICA9IHJlcXVpcmUoJy4vX3VpZCcpO1xyXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGtleSl7XHJcbiAgcmV0dXJuIHNoYXJlZFtrZXldIHx8IChzaGFyZWRba2V5XSA9IHVpZChrZXkpKTtcclxufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fc2hhcmVkLWtleS5qc1xuICoqIG1vZHVsZSBpZCA9IDM3XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyBJRSA4LSBkb24ndCBlbnVtIGJ1ZyBrZXlzXHJcbm1vZHVsZS5leHBvcnRzID0gKFxyXG4gICdjb25zdHJ1Y3RvcixoYXNPd25Qcm9wZXJ0eSxpc1Byb3RvdHlwZU9mLHByb3BlcnR5SXNFbnVtZXJhYmxlLHRvTG9jYWxlU3RyaW5nLHRvU3RyaW5nLHZhbHVlT2YnXHJcbikuc3BsaXQoJywnKTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fZW51bS1idWcta2V5cy5qc1xuICoqIG1vZHVsZSBpZCA9IDM4XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyBhbGwgZW51bWVyYWJsZSBvYmplY3Qga2V5cywgaW5jbHVkZXMgc3ltYm9sc1xudmFyIGdldEtleXMgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpXG4gICwgZ09QUyAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BzJylcbiAgLCBwSUUgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LXBpZScpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHZhciByZXN1bHQgICAgID0gZ2V0S2V5cyhpdClcbiAgICAsIGdldFN5bWJvbHMgPSBnT1BTLmY7XG4gIGlmKGdldFN5bWJvbHMpe1xuICAgIHZhciBzeW1ib2xzID0gZ2V0U3ltYm9scyhpdClcbiAgICAgICwgaXNFbnVtICA9IHBJRS5mXG4gICAgICAsIGkgICAgICAgPSAwXG4gICAgICAsIGtleTtcbiAgICB3aGlsZShzeW1ib2xzLmxlbmd0aCA+IGkpaWYoaXNFbnVtLmNhbGwoaXQsIGtleSA9IHN5bWJvbHNbaSsrXSkpcmVzdWx0LnB1c2goa2V5KTtcbiAgfSByZXR1cm4gcmVzdWx0O1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fZW51bS1rZXlzLmpzXG4gKiogbW9kdWxlIGlkID0gMzlcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsImV4cG9ydHMuZiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1nb3BzLmpzXG4gKiogbW9kdWxlIGlkID0gNDBcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsImV4cG9ydHMuZiA9IHt9LnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19vYmplY3QtcGllLmpzXG4gKiogbW9kdWxlIGlkID0gNDFcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDcuMi4yIElzQXJyYXkoYXJndW1lbnQpXG52YXIgY29mID0gcmVxdWlyZSgnLi9fY29mJyk7XG5tb2R1bGUuZXhwb3J0cyA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gaXNBcnJheShhcmcpe1xuICByZXR1cm4gY29mKGFyZykgPT0gJ0FycmF5Jztcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2lzLWFycmF5LmpzXG4gKiogbW9kdWxlIGlkID0gNDJcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDE5LjEuMi4yIC8gMTUuMi4zLjUgT2JqZWN0LmNyZWF0ZShPIFssIFByb3BlcnRpZXNdKVxyXG52YXIgYW5PYmplY3QgICAgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKVxyXG4gICwgZFBzICAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZHBzJylcclxuICAsIGVudW1CdWdLZXlzID0gcmVxdWlyZSgnLi9fZW51bS1idWcta2V5cycpXHJcbiAgLCBJRV9QUk9UTyAgICA9IHJlcXVpcmUoJy4vX3NoYXJlZC1rZXknKSgnSUVfUFJPVE8nKVxyXG4gICwgRW1wdHkgICAgICAgPSBmdW5jdGlvbigpeyAvKiBlbXB0eSAqLyB9XHJcbiAgLCBQUk9UT1RZUEUgICA9ICdwcm90b3R5cGUnO1xyXG5cclxuLy8gQ3JlYXRlIG9iamVjdCB3aXRoIGZha2UgYG51bGxgIHByb3RvdHlwZTogdXNlIGlmcmFtZSBPYmplY3Qgd2l0aCBjbGVhcmVkIHByb3RvdHlwZVxyXG52YXIgY3JlYXRlRGljdCA9IGZ1bmN0aW9uKCl7XHJcbiAgLy8gVGhyYXNoLCB3YXN0ZSBhbmQgc29kb215OiBJRSBHQyBidWdcclxuICB2YXIgaWZyYW1lID0gcmVxdWlyZSgnLi9fZG9tLWNyZWF0ZScpKCdpZnJhbWUnKVxyXG4gICAgLCBpICAgICAgPSBlbnVtQnVnS2V5cy5sZW5ndGhcclxuICAgICwgZ3QgICAgID0gJz4nXHJcbiAgICAsIGlmcmFtZURvY3VtZW50O1xyXG4gIGlmcmFtZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gIHJlcXVpcmUoJy4vX2h0bWwnKS5hcHBlbmRDaGlsZChpZnJhbWUpO1xyXG4gIGlmcmFtZS5zcmMgPSAnamF2YXNjcmlwdDonOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNjcmlwdC11cmxcclxuICAvLyBjcmVhdGVEaWN0ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuT2JqZWN0O1xyXG4gIC8vIGh0bWwucmVtb3ZlQ2hpbGQoaWZyYW1lKTtcclxuICBpZnJhbWVEb2N1bWVudCA9IGlmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50O1xyXG4gIGlmcmFtZURvY3VtZW50Lm9wZW4oKTtcclxuICBpZnJhbWVEb2N1bWVudC53cml0ZSgnPHNjcmlwdD5kb2N1bWVudC5GPU9iamVjdDwvc2NyaXB0JyArIGd0KTtcclxuICBpZnJhbWVEb2N1bWVudC5jbG9zZSgpO1xyXG4gIGNyZWF0ZURpY3QgPSBpZnJhbWVEb2N1bWVudC5GO1xyXG4gIHdoaWxlKGktLSlkZWxldGUgY3JlYXRlRGljdFtQUk9UT1RZUEVdW2VudW1CdWdLZXlzW2ldXTtcclxuICByZXR1cm4gY3JlYXRlRGljdCgpO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuY3JlYXRlIHx8IGZ1bmN0aW9uIGNyZWF0ZShPLCBQcm9wZXJ0aWVzKXtcclxuICB2YXIgcmVzdWx0O1xyXG4gIGlmKE8gIT09IG51bGwpe1xyXG4gICAgRW1wdHlbUFJPVE9UWVBFXSA9IGFuT2JqZWN0KE8pO1xyXG4gICAgcmVzdWx0ID0gbmV3IEVtcHR5O1xyXG4gICAgRW1wdHlbUFJPVE9UWVBFXSA9IG51bGw7XHJcbiAgICAvLyBhZGQgXCJfX3Byb3RvX19cIiBmb3IgT2JqZWN0LmdldFByb3RvdHlwZU9mIHBvbHlmaWxsXHJcbiAgICByZXN1bHRbSUVfUFJPVE9dID0gTztcclxuICB9IGVsc2UgcmVzdWx0ID0gY3JlYXRlRGljdCgpO1xyXG4gIHJldHVybiBQcm9wZXJ0aWVzID09PSB1bmRlZmluZWQgPyByZXN1bHQgOiBkUHMocmVzdWx0LCBQcm9wZXJ0aWVzKTtcclxufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWNyZWF0ZS5qc1xuICoqIG1vZHVsZSBpZCA9IDQzXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgZFAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKVxyXG4gICwgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKVxyXG4gICwgZ2V0S2V5cyAgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKE8sIFByb3BlcnRpZXMpe1xyXG4gIGFuT2JqZWN0KE8pO1xyXG4gIHZhciBrZXlzICAgPSBnZXRLZXlzKFByb3BlcnRpZXMpXHJcbiAgICAsIGxlbmd0aCA9IGtleXMubGVuZ3RoXHJcbiAgICAsIGkgPSAwXHJcbiAgICAsIFA7XHJcbiAgd2hpbGUobGVuZ3RoID4gaSlkUC5mKE8sIFAgPSBrZXlzW2krK10sIFByb3BlcnRpZXNbUF0pO1xyXG4gIHJldHVybiBPO1xyXG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZHBzLmpzXG4gKiogbW9kdWxlIGlkID0gNDRcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykuZG9jdW1lbnQgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19odG1sLmpzXG4gKiogbW9kdWxlIGlkID0gNDVcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIGZhbGxiYWNrIGZvciBJRTExIGJ1Z2d5IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzIHdpdGggaWZyYW1lIGFuZCB3aW5kb3dcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0JylcbiAgLCBnT1BOICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wbicpLmZcbiAgLCB0b1N0cmluZyAgPSB7fS50b1N0cmluZztcblxudmFyIHdpbmRvd05hbWVzID0gdHlwZW9mIHdpbmRvdyA9PSAnb2JqZWN0JyAmJiB3aW5kb3cgJiYgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXNcbiAgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh3aW5kb3cpIDogW107XG5cbnZhciBnZXRXaW5kb3dOYW1lcyA9IGZ1bmN0aW9uKGl0KXtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZ09QTihpdCk7XG4gIH0gY2F0Y2goZSl7XG4gICAgcmV0dXJuIHdpbmRvd05hbWVzLnNsaWNlKCk7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzLmYgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKGl0KXtcbiAgcmV0dXJuIHdpbmRvd05hbWVzICYmIHRvU3RyaW5nLmNhbGwoaXQpID09ICdbb2JqZWN0IFdpbmRvd10nID8gZ2V0V2luZG93TmFtZXMoaXQpIDogZ09QTih0b0lPYmplY3QoaXQpKTtcbn07XG5cblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWdvcG4tZXh0LmpzXG4gKiogbW9kdWxlIGlkID0gNDZcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDE5LjEuMi43IC8gMTUuMi4zLjQgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoTylcclxudmFyICRrZXlzICAgICAgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cy1pbnRlcm5hbCcpXHJcbiAgLCBoaWRkZW5LZXlzID0gcmVxdWlyZSgnLi9fZW51bS1idWcta2V5cycpLmNvbmNhdCgnbGVuZ3RoJywgJ3Byb3RvdHlwZScpO1xyXG5cclxuZXhwb3J0cy5mID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgfHwgZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhPKXtcclxuICByZXR1cm4gJGtleXMoTywgaGlkZGVuS2V5cyk7XHJcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1nb3BuLmpzXG4gKiogbW9kdWxlIGlkID0gNDdcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBwSUUgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1waWUnKVxyXG4gICwgY3JlYXRlRGVzYyAgICAgPSByZXF1aXJlKCcuL19wcm9wZXJ0eS1kZXNjJylcclxuICAsIHRvSU9iamVjdCAgICAgID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpXHJcbiAgLCB0b1ByaW1pdGl2ZSAgICA9IHJlcXVpcmUoJy4vX3RvLXByaW1pdGl2ZScpXHJcbiAgLCBoYXMgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2hhcycpXHJcbiAgLCBJRThfRE9NX0RFRklORSA9IHJlcXVpcmUoJy4vX2llOC1kb20tZGVmaW5lJylcclxuICAsIGdPUEQgICAgICAgICAgID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcclxuXHJcbmV4cG9ydHMuZiA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgPyBnT1BEIDogZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIFApe1xyXG4gIE8gPSB0b0lPYmplY3QoTyk7XHJcbiAgUCA9IHRvUHJpbWl0aXZlKFAsIHRydWUpO1xyXG4gIGlmKElFOF9ET01fREVGSU5FKXRyeSB7XHJcbiAgICByZXR1cm4gZ09QRChPLCBQKTtcclxuICB9IGNhdGNoKGUpeyAvKiBlbXB0eSAqLyB9XHJcbiAgaWYoaGFzKE8sIFApKXJldHVybiBjcmVhdGVEZXNjKCFwSUUuZi5jYWxsKE8sIFApLCBPW1BdKTtcclxufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWdvcGQuanNcbiAqKiBtb2R1bGUgaWQgPSA0OFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwibW9kdWxlLmV4cG9ydHMgPSBmYWxzZTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fbGlicmFyeS5qc1xuICoqIG1vZHVsZSBpZCA9IDQ5XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXHJcbi8vIDE5LjEuMi4yIC8gMTUuMi4zLjUgT2JqZWN0LmNyZWF0ZShPIFssIFByb3BlcnRpZXNdKVxyXG4kZXhwb3J0KCRleHBvcnQuUywgJ09iamVjdCcsIHtjcmVhdGU6IHJlcXVpcmUoJy4vX29iamVjdC1jcmVhdGUnKX0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QuY3JlYXRlLmpzXG4gKiogbW9kdWxlIGlkID0gNTBcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XHJcbi8vIDE5LjEuMi40IC8gMTUuMi4zLjYgT2JqZWN0LmRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpXHJcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIXJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJyksICdPYmplY3QnLCB7ZGVmaW5lUHJvcGVydHk6IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpLmZ9KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmRlZmluZS1wcm9wZXJ0eS5qc1xuICoqIG1vZHVsZSBpZCA9IDUxXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xyXG4vLyAxOS4xLjIuMyAvIDE1LjIuMy43IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKE8sIFByb3BlcnRpZXMpXHJcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIXJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJyksICdPYmplY3QnLCB7ZGVmaW5lUHJvcGVydGllczogcmVxdWlyZSgnLi9fb2JqZWN0LWRwcycpfSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5kZWZpbmUtcHJvcGVydGllcy5qc1xuICoqIG1vZHVsZSBpZCA9IDUyXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyAxOS4xLjIuNiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIFApXG52YXIgdG9JT2JqZWN0ICAgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKVxuICAsICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wZCcpLmY7XG5cbnJlcXVpcmUoJy4vX29iamVjdC1zYXAnKSgnZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yJywgZnVuY3Rpb24oKXtcbiAgcmV0dXJuIGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihpdCwga2V5KXtcbiAgICByZXR1cm4gJGdldE93blByb3BlcnR5RGVzY3JpcHRvcih0b0lPYmplY3QoaXQpLCBrZXkpO1xuICB9O1xufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IuanNcbiAqKiBtb2R1bGUgaWQgPSA1M1xuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gbW9zdCBPYmplY3QgbWV0aG9kcyBieSBFUzYgc2hvdWxkIGFjY2VwdCBwcmltaXRpdmVzXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICwgY29yZSAgICA9IHJlcXVpcmUoJy4vX2NvcmUnKVxuICAsIGZhaWxzICAgPSByZXF1aXJlKCcuL19mYWlscycpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihLRVksIGV4ZWMpe1xuICB2YXIgZm4gID0gKGNvcmUuT2JqZWN0IHx8IHt9KVtLRVldIHx8IE9iamVjdFtLRVldXG4gICAgLCBleHAgPSB7fTtcbiAgZXhwW0tFWV0gPSBleGVjKGZuKTtcbiAgJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiBmYWlscyhmdW5jdGlvbigpeyBmbigxKTsgfSksICdPYmplY3QnLCBleHApO1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LXNhcC5qc1xuICoqIG1vZHVsZSBpZCA9IDU0XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyAxOS4xLjIuOSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoTylcbnZhciB0b09iamVjdCAgICAgICAgPSByZXF1aXJlKCcuL190by1vYmplY3QnKVxuICAsICRnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4vX29iamVjdC1ncG8nKTtcblxucmVxdWlyZSgnLi9fb2JqZWN0LXNhcCcpKCdnZXRQcm90b3R5cGVPZicsIGZ1bmN0aW9uKCl7XG4gIHJldHVybiBmdW5jdGlvbiBnZXRQcm90b3R5cGVPZihpdCl7XG4gICAgcmV0dXJuICRnZXRQcm90b3R5cGVPZih0b09iamVjdChpdCkpO1xuICB9O1xufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5nZXQtcHJvdG90eXBlLW9mLmpzXG4gKiogbW9kdWxlIGlkID0gNTVcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDcuMS4xMyBUb09iamVjdChhcmd1bWVudClcbnZhciBkZWZpbmVkID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiBPYmplY3QoZGVmaW5lZChpdCkpO1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fdG8tb2JqZWN0LmpzXG4gKiogbW9kdWxlIGlkID0gNTZcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDE5LjEuMi45IC8gMTUuMi4zLjIgT2JqZWN0LmdldFByb3RvdHlwZU9mKE8pXHJcbnZhciBoYXMgICAgICAgICA9IHJlcXVpcmUoJy4vX2hhcycpXHJcbiAgLCB0b09iamVjdCAgICA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpXHJcbiAgLCBJRV9QUk9UTyAgICA9IHJlcXVpcmUoJy4vX3NoYXJlZC1rZXknKSgnSUVfUFJPVE8nKVxyXG4gICwgT2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24oTyl7XHJcbiAgTyA9IHRvT2JqZWN0KE8pO1xyXG4gIGlmKGhhcyhPLCBJRV9QUk9UTykpcmV0dXJuIE9bSUVfUFJPVE9dO1xyXG4gIGlmKHR5cGVvZiBPLmNvbnN0cnVjdG9yID09ICdmdW5jdGlvbicgJiYgTyBpbnN0YW5jZW9mIE8uY29uc3RydWN0b3Ipe1xyXG4gICAgcmV0dXJuIE8uY29uc3RydWN0b3IucHJvdG90eXBlO1xyXG4gIH0gcmV0dXJuIE8gaW5zdGFuY2VvZiBPYmplY3QgPyBPYmplY3RQcm90byA6IG51bGw7XHJcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1ncG8uanNcbiAqKiBtb2R1bGUgaWQgPSA1N1xuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gMTkuMS4yLjE0IE9iamVjdC5rZXlzKE8pXG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKVxuICAsICRrZXlzICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMnKTtcblxucmVxdWlyZSgnLi9fb2JqZWN0LXNhcCcpKCdrZXlzJywgZnVuY3Rpb24oKXtcbiAgcmV0dXJuIGZ1bmN0aW9uIGtleXMoaXQpe1xuICAgIHJldHVybiAka2V5cyh0b09iamVjdChpdCkpO1xuICB9O1xufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5rZXlzLmpzXG4gKiogbW9kdWxlIGlkID0gNThcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDE5LjEuMi43IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKE8pXG5yZXF1aXJlKCcuL19vYmplY3Qtc2FwJykoJ2dldE93blByb3BlcnR5TmFtZXMnLCBmdW5jdGlvbigpe1xuICByZXR1cm4gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcG4tZXh0JykuZjtcbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QuZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcy5qc1xuICoqIG1vZHVsZSBpZCA9IDU5XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyAxOS4xLjIuNSBPYmplY3QuZnJlZXplKE8pXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKVxuICAsIG1ldGEgICAgID0gcmVxdWlyZSgnLi9fbWV0YScpLm9uRnJlZXplO1xuXG5yZXF1aXJlKCcuL19vYmplY3Qtc2FwJykoJ2ZyZWV6ZScsIGZ1bmN0aW9uKCRmcmVlemUpe1xuICByZXR1cm4gZnVuY3Rpb24gZnJlZXplKGl0KXtcbiAgICByZXR1cm4gJGZyZWV6ZSAmJiBpc09iamVjdChpdCkgPyAkZnJlZXplKG1ldGEoaXQpKSA6IGl0O1xuICB9O1xufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5mcmVlemUuanNcbiAqKiBtb2R1bGUgaWQgPSA2MFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gMTkuMS4yLjE3IE9iamVjdC5zZWFsKE8pXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKVxuICAsIG1ldGEgICAgID0gcmVxdWlyZSgnLi9fbWV0YScpLm9uRnJlZXplO1xuXG5yZXF1aXJlKCcuL19vYmplY3Qtc2FwJykoJ3NlYWwnLCBmdW5jdGlvbigkc2VhbCl7XG4gIHJldHVybiBmdW5jdGlvbiBzZWFsKGl0KXtcbiAgICByZXR1cm4gJHNlYWwgJiYgaXNPYmplY3QoaXQpID8gJHNlYWwobWV0YShpdCkpIDogaXQ7XG4gIH07XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LnNlYWwuanNcbiAqKiBtb2R1bGUgaWQgPSA2MVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gMTkuMS4yLjE1IE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyhPKVxudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0JylcbiAgLCBtZXRhICAgICA9IHJlcXVpcmUoJy4vX21ldGEnKS5vbkZyZWV6ZTtcblxucmVxdWlyZSgnLi9fb2JqZWN0LXNhcCcpKCdwcmV2ZW50RXh0ZW5zaW9ucycsIGZ1bmN0aW9uKCRwcmV2ZW50RXh0ZW5zaW9ucyl7XG4gIHJldHVybiBmdW5jdGlvbiBwcmV2ZW50RXh0ZW5zaW9ucyhpdCl7XG4gICAgcmV0dXJuICRwcmV2ZW50RXh0ZW5zaW9ucyAmJiBpc09iamVjdChpdCkgPyAkcHJldmVudEV4dGVuc2lvbnMobWV0YShpdCkpIDogaXQ7XG4gIH07XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LnByZXZlbnQtZXh0ZW5zaW9ucy5qc1xuICoqIG1vZHVsZSBpZCA9IDYyXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyAxOS4xLjIuMTIgT2JqZWN0LmlzRnJvemVuKE8pXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcblxucmVxdWlyZSgnLi9fb2JqZWN0LXNhcCcpKCdpc0Zyb3plbicsIGZ1bmN0aW9uKCRpc0Zyb3plbil7XG4gIHJldHVybiBmdW5jdGlvbiBpc0Zyb3plbihpdCl7XG4gICAgcmV0dXJuIGlzT2JqZWN0KGl0KSA/ICRpc0Zyb3plbiA/ICRpc0Zyb3plbihpdCkgOiBmYWxzZSA6IHRydWU7XG4gIH07XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmlzLWZyb3plbi5qc1xuICoqIG1vZHVsZSBpZCA9IDYzXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyAxOS4xLjIuMTMgT2JqZWN0LmlzU2VhbGVkKE8pXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcblxucmVxdWlyZSgnLi9fb2JqZWN0LXNhcCcpKCdpc1NlYWxlZCcsIGZ1bmN0aW9uKCRpc1NlYWxlZCl7XG4gIHJldHVybiBmdW5jdGlvbiBpc1NlYWxlZChpdCl7XG4gICAgcmV0dXJuIGlzT2JqZWN0KGl0KSA/ICRpc1NlYWxlZCA/ICRpc1NlYWxlZChpdCkgOiBmYWxzZSA6IHRydWU7XG4gIH07XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmlzLXNlYWxlZC5qc1xuICoqIG1vZHVsZSBpZCA9IDY0XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyAxOS4xLjIuMTEgT2JqZWN0LmlzRXh0ZW5zaWJsZShPKVxudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG5cbnJlcXVpcmUoJy4vX29iamVjdC1zYXAnKSgnaXNFeHRlbnNpYmxlJywgZnVuY3Rpb24oJGlzRXh0ZW5zaWJsZSl7XG4gIHJldHVybiBmdW5jdGlvbiBpc0V4dGVuc2libGUoaXQpe1xuICAgIHJldHVybiBpc09iamVjdChpdCkgPyAkaXNFeHRlbnNpYmxlID8gJGlzRXh0ZW5zaWJsZShpdCkgOiB0cnVlIDogZmFsc2U7XG4gIH07XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmlzLWV4dGVuc2libGUuanNcbiAqKiBtb2R1bGUgaWQgPSA2NVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gMTkuMS4zLjEgT2JqZWN0LmFzc2lnbih0YXJnZXQsIHNvdXJjZSlcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GLCAnT2JqZWN0Jywge2Fzc2lnbjogcmVxdWlyZSgnLi9fb2JqZWN0LWFzc2lnbicpfSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5hc3NpZ24uanNcbiAqKiBtb2R1bGUgaWQgPSA2NlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xuLy8gMTkuMS4yLjEgT2JqZWN0LmFzc2lnbih0YXJnZXQsIHNvdXJjZSwgLi4uKVxudmFyIGdldEtleXMgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMnKVxuICAsIGdPUFMgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcHMnKVxuICAsIHBJRSAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LXBpZScpXG4gICwgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKVxuICAsIElPYmplY3QgID0gcmVxdWlyZSgnLi9faW9iamVjdCcpXG4gICwgJGFzc2lnbiAgPSBPYmplY3QuYXNzaWduO1xuXG4vLyBzaG91bGQgd29yayB3aXRoIHN5bWJvbHMgYW5kIHNob3VsZCBoYXZlIGRldGVybWluaXN0aWMgcHJvcGVydHkgb3JkZXIgKFY4IGJ1Zylcbm1vZHVsZS5leHBvcnRzID0gISRhc3NpZ24gfHwgcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbigpe1xuICB2YXIgQSA9IHt9XG4gICAgLCBCID0ge31cbiAgICAsIFMgPSBTeW1ib2woKVxuICAgICwgSyA9ICdhYmNkZWZnaGlqa2xtbm9wcXJzdCc7XG4gIEFbU10gPSA3O1xuICBLLnNwbGl0KCcnKS5mb3JFYWNoKGZ1bmN0aW9uKGspeyBCW2tdID0gazsgfSk7XG4gIHJldHVybiAkYXNzaWduKHt9LCBBKVtTXSAhPSA3IHx8IE9iamVjdC5rZXlzKCRhc3NpZ24oe30sIEIpKS5qb2luKCcnKSAhPSBLO1xufSkgPyBmdW5jdGlvbiBhc3NpZ24odGFyZ2V0LCBzb3VyY2UpeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gIHZhciBUICAgICA9IHRvT2JqZWN0KHRhcmdldClcbiAgICAsIGFMZW4gID0gYXJndW1lbnRzLmxlbmd0aFxuICAgICwgaW5kZXggPSAxXG4gICAgLCBnZXRTeW1ib2xzID0gZ09QUy5mXG4gICAgLCBpc0VudW0gICAgID0gcElFLmY7XG4gIHdoaWxlKGFMZW4gPiBpbmRleCl7XG4gICAgdmFyIFMgICAgICA9IElPYmplY3QoYXJndW1lbnRzW2luZGV4KytdKVxuICAgICAgLCBrZXlzICAgPSBnZXRTeW1ib2xzID8gZ2V0S2V5cyhTKS5jb25jYXQoZ2V0U3ltYm9scyhTKSkgOiBnZXRLZXlzKFMpXG4gICAgICAsIGxlbmd0aCA9IGtleXMubGVuZ3RoXG4gICAgICAsIGogICAgICA9IDBcbiAgICAgICwga2V5O1xuICAgIHdoaWxlKGxlbmd0aCA+IGopaWYoaXNFbnVtLmNhbGwoUywga2V5ID0ga2V5c1tqKytdKSlUW2tleV0gPSBTW2tleV07XG4gIH0gcmV0dXJuIFQ7XG59IDogJGFzc2lnbjtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWFzc2lnbi5qc1xuICoqIG1vZHVsZSBpZCA9IDY3XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyAxOS4xLjMuMTAgT2JqZWN0LmlzKHZhbHVlMSwgdmFsdWUyKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbiRleHBvcnQoJGV4cG9ydC5TLCAnT2JqZWN0Jywge2lzOiByZXF1aXJlKCcuL19zYW1lLXZhbHVlJyl9KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmlzLmpzXG4gKiogbW9kdWxlIGlkID0gNjhcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDcuMi45IFNhbWVWYWx1ZSh4LCB5KVxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuaXMgfHwgZnVuY3Rpb24gaXMoeCwgeSl7XG4gIHJldHVybiB4ID09PSB5ID8geCAhPT0gMCB8fCAxIC8geCA9PT0gMSAvIHkgOiB4ICE9IHggJiYgeSAhPSB5O1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fc2FtZS12YWx1ZS5qc1xuICoqIG1vZHVsZSBpZCA9IDY5XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyAxOS4xLjMuMTkgT2JqZWN0LnNldFByb3RvdHlwZU9mKE8sIHByb3RvKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbiRleHBvcnQoJGV4cG9ydC5TLCAnT2JqZWN0Jywge3NldFByb3RvdHlwZU9mOiByZXF1aXJlKCcuL19zZXQtcHJvdG8nKS5zZXR9KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LnNldC1wcm90b3R5cGUtb2YuanNcbiAqKiBtb2R1bGUgaWQgPSA3MFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gV29ya3Mgd2l0aCBfX3Byb3RvX18gb25seS4gT2xkIHY4IGNhbid0IHdvcmsgd2l0aCBudWxsIHByb3RvIG9iamVjdHMuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1wcm90byAqL1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0JylcbiAgLCBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIGNoZWNrID0gZnVuY3Rpb24oTywgcHJvdG8pe1xuICBhbk9iamVjdChPKTtcbiAgaWYoIWlzT2JqZWN0KHByb3RvKSAmJiBwcm90byAhPT0gbnVsbCl0aHJvdyBUeXBlRXJyb3IocHJvdG8gKyBcIjogY2FuJ3Qgc2V0IGFzIHByb3RvdHlwZSFcIik7XG59O1xubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHNldDogT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8ICgnX19wcm90b19fJyBpbiB7fSA/IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICBmdW5jdGlvbih0ZXN0LCBidWdneSwgc2V0KXtcbiAgICAgIHRyeSB7XG4gICAgICAgIHNldCA9IHJlcXVpcmUoJy4vX2N0eCcpKEZ1bmN0aW9uLmNhbGwsIHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJykuZihPYmplY3QucHJvdG90eXBlLCAnX19wcm90b19fJykuc2V0LCAyKTtcbiAgICAgICAgc2V0KHRlc3QsIFtdKTtcbiAgICAgICAgYnVnZ3kgPSAhKHRlc3QgaW5zdGFuY2VvZiBBcnJheSk7XG4gICAgICB9IGNhdGNoKGUpeyBidWdneSA9IHRydWU7IH1cbiAgICAgIHJldHVybiBmdW5jdGlvbiBzZXRQcm90b3R5cGVPZihPLCBwcm90byl7XG4gICAgICAgIGNoZWNrKE8sIHByb3RvKTtcbiAgICAgICAgaWYoYnVnZ3kpTy5fX3Byb3RvX18gPSBwcm90bztcbiAgICAgICAgZWxzZSBzZXQoTywgcHJvdG8pO1xuICAgICAgICByZXR1cm4gTztcbiAgICAgIH07XG4gICAgfSh7fSwgZmFsc2UpIDogdW5kZWZpbmVkKSxcbiAgY2hlY2s6IGNoZWNrXG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19zZXQtcHJvdG8uanNcbiAqKiBtb2R1bGUgaWQgPSA3MVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xuLy8gMTkuMS4zLjYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZygpXG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4vX2NsYXNzb2YnKVxuICAsIHRlc3QgICAgPSB7fTtcbnRlc3RbcmVxdWlyZSgnLi9fd2tzJykoJ3RvU3RyaW5nVGFnJyldID0gJ3onO1xuaWYodGVzdCArICcnICE9ICdbb2JqZWN0IHpdJyl7XG4gIHJlcXVpcmUoJy4vX3JlZGVmaW5lJykoT2JqZWN0LnByb3RvdHlwZSwgJ3RvU3RyaW5nJywgZnVuY3Rpb24gdG9TdHJpbmcoKXtcbiAgICByZXR1cm4gJ1tvYmplY3QgJyArIGNsYXNzb2YodGhpcykgKyAnXSc7XG4gIH0sIHRydWUpO1xufVxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QudG8tc3RyaW5nLmpzXG4gKiogbW9kdWxlIGlkID0gNzJcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIGdldHRpbmcgdGFnIGZyb20gMTkuMS4zLjYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZygpXG52YXIgY29mID0gcmVxdWlyZSgnLi9fY29mJylcbiAgLCBUQUcgPSByZXF1aXJlKCcuL193a3MnKSgndG9TdHJpbmdUYWcnKVxuICAvLyBFUzMgd3JvbmcgaGVyZVxuICAsIEFSRyA9IGNvZihmdW5jdGlvbigpeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpID09ICdBcmd1bWVudHMnO1xuXG4vLyBmYWxsYmFjayBmb3IgSUUxMSBTY3JpcHQgQWNjZXNzIERlbmllZCBlcnJvclxudmFyIHRyeUdldCA9IGZ1bmN0aW9uKGl0LCBrZXkpe1xuICB0cnkge1xuICAgIHJldHVybiBpdFtrZXldO1xuICB9IGNhdGNoKGUpeyAvKiBlbXB0eSAqLyB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgdmFyIE8sIFQsIEI7XG4gIHJldHVybiBpdCA9PT0gdW5kZWZpbmVkID8gJ1VuZGVmaW5lZCcgOiBpdCA9PT0gbnVsbCA/ICdOdWxsJ1xuICAgIC8vIEBAdG9TdHJpbmdUYWcgY2FzZVxuICAgIDogdHlwZW9mIChUID0gdHJ5R2V0KE8gPSBPYmplY3QoaXQpLCBUQUcpKSA9PSAnc3RyaW5nJyA/IFRcbiAgICAvLyBidWlsdGluVGFnIGNhc2VcbiAgICA6IEFSRyA/IGNvZihPKVxuICAgIC8vIEVTMyBhcmd1bWVudHMgZmFsbGJhY2tcbiAgICA6IChCID0gY29mKE8pKSA9PSAnT2JqZWN0JyAmJiB0eXBlb2YgTy5jYWxsZWUgPT0gJ2Z1bmN0aW9uJyA/ICdBcmd1bWVudHMnIDogQjtcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2NsYXNzb2YuanNcbiAqKiBtb2R1bGUgaWQgPSA3M1xuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gMTkuMi4zLjIgLyAxNS4zLjQuNSBGdW5jdGlvbi5wcm90b3R5cGUuYmluZCh0aGlzQXJnLCBhcmdzLi4uKVxyXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xyXG5cclxuJGV4cG9ydCgkZXhwb3J0LlAsICdGdW5jdGlvbicsIHtiaW5kOiByZXF1aXJlKCcuL19iaW5kJyl9KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuZnVuY3Rpb24uYmluZC5qc1xuICoqIG1vZHVsZSBpZCA9IDc0XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG52YXIgYUZ1bmN0aW9uICA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKVxuICAsIGlzT2JqZWN0ICAgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKVxuICAsIGludm9rZSAgICAgPSByZXF1aXJlKCcuL19pbnZva2UnKVxuICAsIGFycmF5U2xpY2UgPSBbXS5zbGljZVxuICAsIGZhY3RvcmllcyAgPSB7fTtcblxudmFyIGNvbnN0cnVjdCA9IGZ1bmN0aW9uKEYsIGxlbiwgYXJncyl7XG4gIGlmKCEobGVuIGluIGZhY3Rvcmllcykpe1xuICAgIGZvcih2YXIgbiA9IFtdLCBpID0gMDsgaSA8IGxlbjsgaSsrKW5baV0gPSAnYVsnICsgaSArICddJztcbiAgICBmYWN0b3JpZXNbbGVuXSA9IEZ1bmN0aW9uKCdGLGEnLCAncmV0dXJuIG5ldyBGKCcgKyBuLmpvaW4oJywnKSArICcpJyk7XG4gIH0gcmV0dXJuIGZhY3Rvcmllc1tsZW5dKEYsIGFyZ3MpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBGdW5jdGlvbi5iaW5kIHx8IGZ1bmN0aW9uIGJpbmQodGhhdCAvKiwgYXJncy4uLiAqLyl7XG4gIHZhciBmbiAgICAgICA9IGFGdW5jdGlvbih0aGlzKVxuICAgICwgcGFydEFyZ3MgPSBhcnJheVNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgdmFyIGJvdW5kID0gZnVuY3Rpb24oLyogYXJncy4uLiAqLyl7XG4gICAgdmFyIGFyZ3MgPSBwYXJ0QXJncy5jb25jYXQoYXJyYXlTbGljZS5jYWxsKGFyZ3VtZW50cykpO1xuICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgYm91bmQgPyBjb25zdHJ1Y3QoZm4sIGFyZ3MubGVuZ3RoLCBhcmdzKSA6IGludm9rZShmbiwgYXJncywgdGhhdCk7XG4gIH07XG4gIGlmKGlzT2JqZWN0KGZuLnByb3RvdHlwZSkpYm91bmQucHJvdG90eXBlID0gZm4ucHJvdG90eXBlO1xuICByZXR1cm4gYm91bmQ7XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19iaW5kLmpzXG4gKiogbW9kdWxlIGlkID0gNzVcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIGZhc3QgYXBwbHksIGh0dHA6Ly9qc3BlcmYubG5raXQuY29tL2Zhc3QtYXBwbHkvNVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihmbiwgYXJncywgdGhhdCl7XG4gIHZhciB1biA9IHRoYXQgPT09IHVuZGVmaW5lZDtcbiAgc3dpdGNoKGFyZ3MubGVuZ3RoKXtcbiAgICBjYXNlIDA6IHJldHVybiB1biA/IGZuKClcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCk7XG4gICAgY2FzZSAxOiByZXR1cm4gdW4gPyBmbihhcmdzWzBdKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0LCBhcmdzWzBdKTtcbiAgICBjYXNlIDI6IHJldHVybiB1biA/IGZuKGFyZ3NbMF0sIGFyZ3NbMV0pXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQsIGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgIGNhc2UgMzogcmV0dXJuIHVuID8gZm4oYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSlcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCwgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gICAgY2FzZSA0OiByZXR1cm4gdW4gPyBmbihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0LCBhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdKTtcbiAgfSByZXR1cm4gICAgICAgICAgICAgIGZuLmFwcGx5KHRoYXQsIGFyZ3MpO1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9faW52b2tlLmpzXG4gKiogbW9kdWxlIGlkID0gNzZcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBkUCAgICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZlxuICAsIGNyZWF0ZURlc2MgPSByZXF1aXJlKCcuL19wcm9wZXJ0eS1kZXNjJylcbiAgLCBoYXMgICAgICAgID0gcmVxdWlyZSgnLi9faGFzJylcbiAgLCBGUHJvdG8gICAgID0gRnVuY3Rpb24ucHJvdG90eXBlXG4gICwgbmFtZVJFICAgICA9IC9eXFxzKmZ1bmN0aW9uIChbXiAoXSopL1xuICAsIE5BTUUgICAgICAgPSAnbmFtZSc7XG4vLyAxOS4yLjQuMiBuYW1lXG5OQU1FIGluIEZQcm90byB8fCByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpICYmIGRQKEZQcm90bywgTkFNRSwge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24oKXtcbiAgICB2YXIgbWF0Y2ggPSAoJycgKyB0aGlzKS5tYXRjaChuYW1lUkUpXG4gICAgICAsIG5hbWUgID0gbWF0Y2ggPyBtYXRjaFsxXSA6ICcnO1xuICAgIGhhcyh0aGlzLCBOQU1FKSB8fCBkUCh0aGlzLCBOQU1FLCBjcmVhdGVEZXNjKDUsIG5hbWUpKTtcbiAgICByZXR1cm4gbmFtZTtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LmZ1bmN0aW9uLm5hbWUuanNcbiAqKiBtb2R1bGUgaWQgPSA3N1xuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGlzT2JqZWN0ICAgICAgID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0JylcbiAgLCBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4vX29iamVjdC1ncG8nKVxuICAsIEhBU19JTlNUQU5DRSAgID0gcmVxdWlyZSgnLi9fd2tzJykoJ2hhc0luc3RhbmNlJylcbiAgLCBGdW5jdGlvblByb3RvICA9IEZ1bmN0aW9uLnByb3RvdHlwZTtcbi8vIDE5LjIuMy42IEZ1bmN0aW9uLnByb3RvdHlwZVtAQGhhc0luc3RhbmNlXShWKVxuaWYoIShIQVNfSU5TVEFOQ0UgaW4gRnVuY3Rpb25Qcm90bykpcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZihGdW5jdGlvblByb3RvLCBIQVNfSU5TVEFOQ0UsIHt2YWx1ZTogZnVuY3Rpb24oTyl7XG4gIGlmKHR5cGVvZiB0aGlzICE9ICdmdW5jdGlvbicgfHwgIWlzT2JqZWN0KE8pKXJldHVybiBmYWxzZTtcbiAgaWYoIWlzT2JqZWN0KHRoaXMucHJvdG90eXBlKSlyZXR1cm4gTyBpbnN0YW5jZW9mIHRoaXM7XG4gIC8vIGZvciBlbnZpcm9ubWVudCB3L28gbmF0aXZlIGBAQGhhc0luc3RhbmNlYCBsb2dpYyBlbm91Z2ggYGluc3RhbmNlb2ZgLCBidXQgYWRkIHRoaXM6XG4gIHdoaWxlKE8gPSBnZXRQcm90b3R5cGVPZihPKSlpZih0aGlzLnByb3RvdHlwZSA9PT0gTylyZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIGZhbHNlO1xufX0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5mdW5jdGlvbi5oYXMtaW5zdGFuY2UuanNcbiAqKiBtb2R1bGUgaWQgPSA3OFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwidmFyICRleHBvcnQgICA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXHJcbiAgLCAkcGFyc2VJbnQgPSByZXF1aXJlKCcuL19wYXJzZS1pbnQnKTtcclxuLy8gMTguMi41IHBhcnNlSW50KHN0cmluZywgcmFkaXgpXHJcbiRleHBvcnQoJGV4cG9ydC5HICsgJGV4cG9ydC5GICogKHBhcnNlSW50ICE9ICRwYXJzZUludCksIHtwYXJzZUludDogJHBhcnNlSW50fSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnBhcnNlLWludC5qc1xuICoqIG1vZHVsZSBpZCA9IDc5XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgJHBhcnNlSW50ID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykucGFyc2VJbnRcbiAgLCAkdHJpbSAgICAgPSByZXF1aXJlKCcuL19zdHJpbmctdHJpbScpLnRyaW1cbiAgLCB3cyAgICAgICAgPSByZXF1aXJlKCcuL19zdHJpbmctd3MnKVxuICAsIGhleCAgICAgICA9IC9eW1xcLStdPzBbeFhdLztcblxubW9kdWxlLmV4cG9ydHMgPSAkcGFyc2VJbnQod3MgKyAnMDgnKSAhPT0gOCB8fCAkcGFyc2VJbnQod3MgKyAnMHgxNicpICE9PSAyMiA/IGZ1bmN0aW9uIHBhcnNlSW50KHN0ciwgcmFkaXgpe1xuICB2YXIgc3RyaW5nID0gJHRyaW0oU3RyaW5nKHN0ciksIDMpO1xuICByZXR1cm4gJHBhcnNlSW50KHN0cmluZywgKHJhZGl4ID4+PiAwKSB8fCAoaGV4LnRlc3Qoc3RyaW5nKSA/IDE2IDogMTApKTtcbn0gOiAkcGFyc2VJbnQ7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX3BhcnNlLWludC5qc1xuICoqIG1vZHVsZSBpZCA9IDgwXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICwgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKVxuICAsIGZhaWxzICAgPSByZXF1aXJlKCcuL19mYWlscycpXG4gICwgc3BhY2VzICA9IHJlcXVpcmUoJy4vX3N0cmluZy13cycpXG4gICwgc3BhY2UgICA9ICdbJyArIHNwYWNlcyArICddJ1xuICAsIG5vbiAgICAgPSAnXFx1MjAwYlxcdTAwODUnXG4gICwgbHRyaW0gICA9IFJlZ0V4cCgnXicgKyBzcGFjZSArIHNwYWNlICsgJyonKVxuICAsIHJ0cmltICAgPSBSZWdFeHAoc3BhY2UgKyBzcGFjZSArICcqJCcpO1xuXG52YXIgZXhwb3J0ZXIgPSBmdW5jdGlvbihLRVksIGV4ZWMsIEFMSUFTKXtcbiAgdmFyIGV4cCAgID0ge307XG4gIHZhciBGT1JDRSA9IGZhaWxzKGZ1bmN0aW9uKCl7XG4gICAgcmV0dXJuICEhc3BhY2VzW0tFWV0oKSB8fCBub25bS0VZXSgpICE9IG5vbjtcbiAgfSk7XG4gIHZhciBmbiA9IGV4cFtLRVldID0gRk9SQ0UgPyBleGVjKHRyaW0pIDogc3BhY2VzW0tFWV07XG4gIGlmKEFMSUFTKWV4cFtBTElBU10gPSBmbjtcbiAgJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiBGT1JDRSwgJ1N0cmluZycsIGV4cCk7XG59O1xuXG4vLyAxIC0+IFN0cmluZyN0cmltTGVmdFxuLy8gMiAtPiBTdHJpbmcjdHJpbVJpZ2h0XG4vLyAzIC0+IFN0cmluZyN0cmltXG52YXIgdHJpbSA9IGV4cG9ydGVyLnRyaW0gPSBmdW5jdGlvbihzdHJpbmcsIFRZUEUpe1xuICBzdHJpbmcgPSBTdHJpbmcoZGVmaW5lZChzdHJpbmcpKTtcbiAgaWYoVFlQRSAmIDEpc3RyaW5nID0gc3RyaW5nLnJlcGxhY2UobHRyaW0sICcnKTtcbiAgaWYoVFlQRSAmIDIpc3RyaW5nID0gc3RyaW5nLnJlcGxhY2UocnRyaW0sICcnKTtcbiAgcmV0dXJuIHN0cmluZztcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0ZXI7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX3N0cmluZy10cmltLmpzXG4gKiogbW9kdWxlIGlkID0gODFcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIm1vZHVsZS5leHBvcnRzID0gJ1xceDA5XFx4MEFcXHgwQlxceDBDXFx4MERcXHgyMFxceEEwXFx1MTY4MFxcdTE4MEVcXHUyMDAwXFx1MjAwMVxcdTIwMDJcXHUyMDAzJyArXHJcbiAgJ1xcdTIwMDRcXHUyMDA1XFx1MjAwNlxcdTIwMDdcXHUyMDA4XFx1MjAwOVxcdTIwMEFcXHUyMDJGXFx1MjA1RlxcdTMwMDBcXHUyMDI4XFx1MjAyOVxcdUZFRkYnO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19zdHJpbmctd3MuanNcbiAqKiBtb2R1bGUgaWQgPSA4MlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwidmFyICRleHBvcnQgICAgID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcclxuICAsICRwYXJzZUZsb2F0ID0gcmVxdWlyZSgnLi9fcGFyc2UtZmxvYXQnKTtcclxuLy8gMTguMi40IHBhcnNlRmxvYXQoc3RyaW5nKVxyXG4kZXhwb3J0KCRleHBvcnQuRyArICRleHBvcnQuRiAqIChwYXJzZUZsb2F0ICE9ICRwYXJzZUZsb2F0KSwge3BhcnNlRmxvYXQ6ICRwYXJzZUZsb2F0fSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnBhcnNlLWZsb2F0LmpzXG4gKiogbW9kdWxlIGlkID0gODNcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciAkcGFyc2VGbG9hdCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpLnBhcnNlRmxvYXRcbiAgLCAkdHJpbSAgICAgICA9IHJlcXVpcmUoJy4vX3N0cmluZy10cmltJykudHJpbTtcblxubW9kdWxlLmV4cG9ydHMgPSAxIC8gJHBhcnNlRmxvYXQocmVxdWlyZSgnLi9fc3RyaW5nLXdzJykgKyAnLTAnKSAhPT0gLUluZmluaXR5ID8gZnVuY3Rpb24gcGFyc2VGbG9hdChzdHIpe1xuICB2YXIgc3RyaW5nID0gJHRyaW0oU3RyaW5nKHN0ciksIDMpXG4gICAgLCByZXN1bHQgPSAkcGFyc2VGbG9hdChzdHJpbmcpO1xuICByZXR1cm4gcmVzdWx0ID09PSAwICYmIHN0cmluZy5jaGFyQXQoMCkgPT0gJy0nID8gLTAgOiByZXN1bHQ7XG59IDogJHBhcnNlRmxvYXQ7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX3BhcnNlLWZsb2F0LmpzXG4gKiogbW9kdWxlIGlkID0gODRcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0JztcbnZhciBnbG9iYWwgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpXG4gICwgaGFzICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19oYXMnKVxuICAsIGNvZiAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fY29mJylcbiAgLCBpbmhlcml0SWZSZXF1aXJlZCA9IHJlcXVpcmUoJy4vX2luaGVyaXQtaWYtcmVxdWlyZWQnKVxuICAsIHRvUHJpbWl0aXZlICAgICAgID0gcmVxdWlyZSgnLi9fdG8tcHJpbWl0aXZlJylcbiAgLCBmYWlscyAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2ZhaWxzJylcbiAgLCBnT1BOICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BuJykuZlxuICAsIGdPUEQgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcGQnKS5mXG4gICwgZFAgICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mXG4gICwgJHRyaW0gICAgICAgICAgICAgPSByZXF1aXJlKCcuL19zdHJpbmctdHJpbScpLnRyaW1cbiAgLCBOVU1CRVIgICAgICAgICAgICA9ICdOdW1iZXInXG4gICwgJE51bWJlciAgICAgICAgICAgPSBnbG9iYWxbTlVNQkVSXVxuICAsIEJhc2UgICAgICAgICAgICAgID0gJE51bWJlclxuICAsIHByb3RvICAgICAgICAgICAgID0gJE51bWJlci5wcm90b3R5cGVcbiAgLy8gT3BlcmEgfjEyIGhhcyBicm9rZW4gT2JqZWN0I3RvU3RyaW5nXG4gICwgQlJPS0VOX0NPRiAgICAgICAgPSBjb2YocmVxdWlyZSgnLi9fb2JqZWN0LWNyZWF0ZScpKHByb3RvKSkgPT0gTlVNQkVSXG4gICwgVFJJTSAgICAgICAgICAgICAgPSAndHJpbScgaW4gU3RyaW5nLnByb3RvdHlwZTtcblxuLy8gNy4xLjMgVG9OdW1iZXIoYXJndW1lbnQpXG52YXIgdG9OdW1iZXIgPSBmdW5jdGlvbihhcmd1bWVudCl7XG4gIHZhciBpdCA9IHRvUHJpbWl0aXZlKGFyZ3VtZW50LCBmYWxzZSk7XG4gIGlmKHR5cGVvZiBpdCA9PSAnc3RyaW5nJyAmJiBpdC5sZW5ndGggPiAyKXtcbiAgICBpdCA9IFRSSU0gPyBpdC50cmltKCkgOiAkdHJpbShpdCwgMyk7XG4gICAgdmFyIGZpcnN0ID0gaXQuY2hhckNvZGVBdCgwKVxuICAgICAgLCB0aGlyZCwgcmFkaXgsIG1heENvZGU7XG4gICAgaWYoZmlyc3QgPT09IDQzIHx8IGZpcnN0ID09PSA0NSl7XG4gICAgICB0aGlyZCA9IGl0LmNoYXJDb2RlQXQoMik7XG4gICAgICBpZih0aGlyZCA9PT0gODggfHwgdGhpcmQgPT09IDEyMClyZXR1cm4gTmFOOyAvLyBOdW1iZXIoJysweDEnKSBzaG91bGQgYmUgTmFOLCBvbGQgVjggZml4XG4gICAgfSBlbHNlIGlmKGZpcnN0ID09PSA0OCl7XG4gICAgICBzd2l0Y2goaXQuY2hhckNvZGVBdCgxKSl7XG4gICAgICAgIGNhc2UgNjYgOiBjYXNlIDk4ICA6IHJhZGl4ID0gMjsgbWF4Q29kZSA9IDQ5OyBicmVhazsgLy8gZmFzdCBlcXVhbCAvXjBiWzAxXSskL2lcbiAgICAgICAgY2FzZSA3OSA6IGNhc2UgMTExIDogcmFkaXggPSA4OyBtYXhDb2RlID0gNTU7IGJyZWFrOyAvLyBmYXN0IGVxdWFsIC9eMG9bMC03XSskL2lcbiAgICAgICAgZGVmYXVsdCA6IHJldHVybiAraXQ7XG4gICAgICB9XG4gICAgICBmb3IodmFyIGRpZ2l0cyA9IGl0LnNsaWNlKDIpLCBpID0gMCwgbCA9IGRpZ2l0cy5sZW5ndGgsIGNvZGU7IGkgPCBsOyBpKyspe1xuICAgICAgICBjb2RlID0gZGlnaXRzLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgIC8vIHBhcnNlSW50IHBhcnNlcyBhIHN0cmluZyB0byBhIGZpcnN0IHVuYXZhaWxhYmxlIHN5bWJvbFxuICAgICAgICAvLyBidXQgVG9OdW1iZXIgc2hvdWxkIHJldHVybiBOYU4gaWYgYSBzdHJpbmcgY29udGFpbnMgdW5hdmFpbGFibGUgc3ltYm9sc1xuICAgICAgICBpZihjb2RlIDwgNDggfHwgY29kZSA+IG1heENvZGUpcmV0dXJuIE5hTjtcbiAgICAgIH0gcmV0dXJuIHBhcnNlSW50KGRpZ2l0cywgcmFkaXgpO1xuICAgIH1cbiAgfSByZXR1cm4gK2l0O1xufTtcblxuaWYoISROdW1iZXIoJyAwbzEnKSB8fCAhJE51bWJlcignMGIxJykgfHwgJE51bWJlcignKzB4MScpKXtcbiAgJE51bWJlciA9IGZ1bmN0aW9uIE51bWJlcih2YWx1ZSl7XG4gICAgdmFyIGl0ID0gYXJndW1lbnRzLmxlbmd0aCA8IDEgPyAwIDogdmFsdWVcbiAgICAgICwgdGhhdCA9IHRoaXM7XG4gICAgcmV0dXJuIHRoYXQgaW5zdGFuY2VvZiAkTnVtYmVyXG4gICAgICAvLyBjaGVjayBvbiAxLi5jb25zdHJ1Y3Rvcihmb28pIGNhc2VcbiAgICAgICYmIChCUk9LRU5fQ09GID8gZmFpbHMoZnVuY3Rpb24oKXsgcHJvdG8udmFsdWVPZi5jYWxsKHRoYXQpOyB9KSA6IGNvZih0aGF0KSAhPSBOVU1CRVIpXG4gICAgICAgID8gaW5oZXJpdElmUmVxdWlyZWQobmV3IEJhc2UodG9OdW1iZXIoaXQpKSwgdGhhdCwgJE51bWJlcikgOiB0b051bWJlcihpdCk7XG4gIH07XG4gIGZvcih2YXIga2V5cyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgPyBnT1BOKEJhc2UpIDogKFxuICAgIC8vIEVTMzpcbiAgICAnTUFYX1ZBTFVFLE1JTl9WQUxVRSxOYU4sTkVHQVRJVkVfSU5GSU5JVFksUE9TSVRJVkVfSU5GSU5JVFksJyArXG4gICAgLy8gRVM2IChpbiBjYXNlLCBpZiBtb2R1bGVzIHdpdGggRVM2IE51bWJlciBzdGF0aWNzIHJlcXVpcmVkIGJlZm9yZSk6XG4gICAgJ0VQU0lMT04saXNGaW5pdGUsaXNJbnRlZ2VyLGlzTmFOLGlzU2FmZUludGVnZXIsTUFYX1NBRkVfSU5URUdFUiwnICtcbiAgICAnTUlOX1NBRkVfSU5URUdFUixwYXJzZUZsb2F0LHBhcnNlSW50LGlzSW50ZWdlcidcbiAgKS5zcGxpdCgnLCcpLCBqID0gMCwga2V5OyBrZXlzLmxlbmd0aCA+IGo7IGorKyl7XG4gICAgaWYoaGFzKEJhc2UsIGtleSA9IGtleXNbal0pICYmICFoYXMoJE51bWJlciwga2V5KSl7XG4gICAgICBkUCgkTnVtYmVyLCBrZXksIGdPUEQoQmFzZSwga2V5KSk7XG4gICAgfVxuICB9XG4gICROdW1iZXIucHJvdG90eXBlID0gcHJvdG87XG4gIHByb3RvLmNvbnN0cnVjdG9yID0gJE51bWJlcjtcbiAgcmVxdWlyZSgnLi9fcmVkZWZpbmUnKShnbG9iYWwsIE5VTUJFUiwgJE51bWJlcik7XG59XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5jb25zdHJ1Y3Rvci5qc1xuICoqIG1vZHVsZSBpZCA9IDg1XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgaXNPYmplY3QgICAgICAgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKVxyXG4gICwgc2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuL19zZXQtcHJvdG8nKS5zZXQ7XHJcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24odGhhdCwgdGFyZ2V0LCBDKXtcclxuICB2YXIgUCwgUyA9IHRhcmdldC5jb25zdHJ1Y3RvcjtcclxuICBpZihTICE9PSBDICYmIHR5cGVvZiBTID09ICdmdW5jdGlvbicgJiYgKFAgPSBTLnByb3RvdHlwZSkgIT09IEMucHJvdG90eXBlICYmIGlzT2JqZWN0KFApICYmIHNldFByb3RvdHlwZU9mKXtcclxuICAgIHNldFByb3RvdHlwZU9mKHRoYXQsIFApO1xyXG4gIH0gcmV0dXJuIHRoYXQ7XHJcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2luaGVyaXQtaWYtcmVxdWlyZWQuanNcbiAqKiBtb2R1bGUgaWQgPSA4NlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xyXG52YXIgJGV4cG9ydCAgICAgID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcclxuICAsIGFuSW5zdGFuY2UgICA9IHJlcXVpcmUoJy4vX2FuLWluc3RhbmNlJylcclxuICAsIHRvSW50ZWdlciAgICA9IHJlcXVpcmUoJy4vX3RvLWludGVnZXInKVxyXG4gICwgYU51bWJlclZhbHVlID0gcmVxdWlyZSgnLi9fYS1udW1iZXItdmFsdWUnKVxyXG4gICwgcmVwZWF0ICAgICAgID0gcmVxdWlyZSgnLi9fc3RyaW5nLXJlcGVhdCcpXHJcbiAgLCAkdG9GaXhlZCAgICAgPSAxLi50b0ZpeGVkXHJcbiAgLCBmbG9vciAgICAgICAgPSBNYXRoLmZsb29yXHJcbiAgLCBkYXRhICAgICAgICAgPSBbMCwgMCwgMCwgMCwgMCwgMF1cclxuICAsIEVSUk9SICAgICAgICA9ICdOdW1iZXIudG9GaXhlZDogaW5jb3JyZWN0IGludm9jYXRpb24hJ1xyXG4gICwgWkVSTyAgICAgICAgID0gJzAnO1xyXG5cclxudmFyIG11bHRpcGx5ID0gZnVuY3Rpb24obiwgYyl7XHJcbiAgdmFyIGkgID0gLTFcclxuICAgICwgYzIgPSBjO1xyXG4gIHdoaWxlKCsraSA8IDYpe1xyXG4gICAgYzIgKz0gbiAqIGRhdGFbaV07XHJcbiAgICBkYXRhW2ldID0gYzIgJSAxZTc7XHJcbiAgICBjMiA9IGZsb29yKGMyIC8gMWU3KTtcclxuICB9XHJcbn07XHJcbnZhciBkaXZpZGUgPSBmdW5jdGlvbihuKXtcclxuICB2YXIgaSA9IDZcclxuICAgICwgYyA9IDA7XHJcbiAgd2hpbGUoLS1pID49IDApe1xyXG4gICAgYyArPSBkYXRhW2ldO1xyXG4gICAgZGF0YVtpXSA9IGZsb29yKGMgLyBuKTtcclxuICAgIGMgPSAoYyAlIG4pICogMWU3O1xyXG4gIH1cclxufTtcclxudmFyIG51bVRvU3RyaW5nID0gZnVuY3Rpb24oKXtcclxuICB2YXIgaSA9IDZcclxuICAgICwgcyA9ICcnO1xyXG4gIHdoaWxlKC0taSA+PSAwKXtcclxuICAgIGlmKHMgIT09ICcnIHx8IGkgPT09IDAgfHwgZGF0YVtpXSAhPT0gMCl7XHJcbiAgICAgIHZhciB0ID0gU3RyaW5nKGRhdGFbaV0pO1xyXG4gICAgICBzID0gcyA9PT0gJycgPyB0IDogcyArIHJlcGVhdC5jYWxsKFpFUk8sIDcgLSB0Lmxlbmd0aCkgKyB0O1xyXG4gICAgfVxyXG4gIH0gcmV0dXJuIHM7XHJcbn07XHJcbnZhciBwb3cgPSBmdW5jdGlvbih4LCBuLCBhY2Mpe1xyXG4gIHJldHVybiBuID09PSAwID8gYWNjIDogbiAlIDIgPT09IDEgPyBwb3coeCwgbiAtIDEsIGFjYyAqIHgpIDogcG93KHggKiB4LCBuIC8gMiwgYWNjKTtcclxufTtcclxudmFyIGxvZyA9IGZ1bmN0aW9uKHgpe1xyXG4gIHZhciBuICA9IDBcclxuICAgICwgeDIgPSB4O1xyXG4gIHdoaWxlKHgyID49IDQwOTYpe1xyXG4gICAgbiArPSAxMjtcclxuICAgIHgyIC89IDQwOTY7XHJcbiAgfVxyXG4gIHdoaWxlKHgyID49IDIpe1xyXG4gICAgbiAgKz0gMTtcclxuICAgIHgyIC89IDI7XHJcbiAgfSByZXR1cm4gbjtcclxufTtcclxuXHJcbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogKCEhJHRvRml4ZWQgJiYgKFxyXG4gIDAuMDAwMDgudG9GaXhlZCgzKSAhPT0gJzAuMDAwJyB8fFxyXG4gIDAuOS50b0ZpeGVkKDApICE9PSAnMScgfHxcclxuICAxLjI1NS50b0ZpeGVkKDIpICE9PSAnMS4yNScgfHxcclxuICAxMDAwMDAwMDAwMDAwMDAwMTI4Li50b0ZpeGVkKDApICE9PSAnMTAwMDAwMDAwMDAwMDAwMDEyOCdcclxuKSB8fCAhcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbigpe1xyXG4gIC8vIFY4IH4gQW5kcm9pZCA0LjMtXHJcbiAgJHRvRml4ZWQuY2FsbCh7fSk7XHJcbn0pKSwgJ051bWJlcicsIHtcclxuICB0b0ZpeGVkOiBmdW5jdGlvbiB0b0ZpeGVkKGZyYWN0aW9uRGlnaXRzKXtcclxuICAgIHZhciB4ID0gYU51bWJlclZhbHVlKHRoaXMsIEVSUk9SKVxyXG4gICAgICAsIGYgPSB0b0ludGVnZXIoZnJhY3Rpb25EaWdpdHMpXHJcbiAgICAgICwgcyA9ICcnXHJcbiAgICAgICwgbSA9IFpFUk9cclxuICAgICAgLCBlLCB6LCBqLCBrO1xyXG4gICAgaWYoZiA8IDAgfHwgZiA+IDIwKXRocm93IFJhbmdlRXJyb3IoRVJST1IpO1xyXG4gICAgaWYoeCAhPSB4KXJldHVybiAnTmFOJztcclxuICAgIGlmKHggPD0gLTFlMjEgfHwgeCA+PSAxZTIxKXJldHVybiBTdHJpbmcoeCk7XHJcbiAgICBpZih4IDwgMCl7XHJcbiAgICAgIHMgPSAnLSc7XHJcbiAgICAgIHggPSAteDtcclxuICAgIH1cclxuICAgIGlmKHggPiAxZS0yMSl7XHJcbiAgICAgIGUgPSBsb2coeCAqIHBvdygyLCA2OSwgMSkpIC0gNjk7XHJcbiAgICAgIHogPSBlIDwgMCA/IHggKiBwb3coMiwgLWUsIDEpIDogeCAvIHBvdygyLCBlLCAxKTtcclxuICAgICAgeiAqPSAweDEwMDAwMDAwMDAwMDAwO1xyXG4gICAgICBlID0gNTIgLSBlO1xyXG4gICAgICBpZihlID4gMCl7XHJcbiAgICAgICAgbXVsdGlwbHkoMCwgeik7XHJcbiAgICAgICAgaiA9IGY7XHJcbiAgICAgICAgd2hpbGUoaiA+PSA3KXtcclxuICAgICAgICAgIG11bHRpcGx5KDFlNywgMCk7XHJcbiAgICAgICAgICBqIC09IDc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG11bHRpcGx5KHBvdygxMCwgaiwgMSksIDApO1xyXG4gICAgICAgIGogPSBlIC0gMTtcclxuICAgICAgICB3aGlsZShqID49IDIzKXtcclxuICAgICAgICAgIGRpdmlkZSgxIDw8IDIzKTtcclxuICAgICAgICAgIGogLT0gMjM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGRpdmlkZSgxIDw8IGopO1xyXG4gICAgICAgIG11bHRpcGx5KDEsIDEpO1xyXG4gICAgICAgIGRpdmlkZSgyKTtcclxuICAgICAgICBtID0gbnVtVG9TdHJpbmcoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBtdWx0aXBseSgwLCB6KTtcclxuICAgICAgICBtdWx0aXBseSgxIDw8IC1lLCAwKTtcclxuICAgICAgICBtID0gbnVtVG9TdHJpbmcoKSArIHJlcGVhdC5jYWxsKFpFUk8sIGYpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZihmID4gMCl7XHJcbiAgICAgIGsgPSBtLmxlbmd0aDtcclxuICAgICAgbSA9IHMgKyAoayA8PSBmID8gJzAuJyArIHJlcGVhdC5jYWxsKFpFUk8sIGYgLSBrKSArIG0gOiBtLnNsaWNlKDAsIGsgLSBmKSArICcuJyArIG0uc2xpY2UoayAtIGYpKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIG0gPSBzICsgbTtcclxuICAgIH0gcmV0dXJuIG07XHJcbiAgfVxyXG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLnRvLWZpeGVkLmpzXG4gKiogbW9kdWxlIGlkID0gODdcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQsIENvbnN0cnVjdG9yLCBuYW1lLCBmb3JiaWRkZW5GaWVsZCl7XG4gIGlmKCEoaXQgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikgfHwgKGZvcmJpZGRlbkZpZWxkICE9PSB1bmRlZmluZWQgJiYgZm9yYmlkZGVuRmllbGQgaW4gaXQpKXtcbiAgICB0aHJvdyBUeXBlRXJyb3IobmFtZSArICc6IGluY29ycmVjdCBpbnZvY2F0aW9uIScpO1xuICB9IHJldHVybiBpdDtcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2FuLWluc3RhbmNlLmpzXG4gKiogbW9kdWxlIGlkID0gODhcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBjb2YgPSByZXF1aXJlKCcuL19jb2YnKTtcclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCwgbXNnKXtcclxuICBpZih0eXBlb2YgaXQgIT0gJ251bWJlcicgJiYgY29mKGl0KSAhPSAnTnVtYmVyJyl0aHJvdyBUeXBlRXJyb3IobXNnKTtcclxuICByZXR1cm4gK2l0O1xyXG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19hLW51bWJlci12YWx1ZS5qc1xuICoqIG1vZHVsZSBpZCA9IDg5XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG52YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpXG4gICwgZGVmaW5lZCAgID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHJlcGVhdChjb3VudCl7XG4gIHZhciBzdHIgPSBTdHJpbmcoZGVmaW5lZCh0aGlzKSlcbiAgICAsIHJlcyA9ICcnXG4gICAgLCBuICAgPSB0b0ludGVnZXIoY291bnQpO1xuICBpZihuIDwgMCB8fCBuID09IEluZmluaXR5KXRocm93IFJhbmdlRXJyb3IoXCJDb3VudCBjYW4ndCBiZSBuZWdhdGl2ZVwiKTtcbiAgZm9yKDtuID4gMDsgKG4gPj4+PSAxKSAmJiAoc3RyICs9IHN0cikpaWYobiAmIDEpcmVzICs9IHN0cjtcbiAgcmV0dXJuIHJlcztcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX3N0cmluZy1yZXBlYXQuanNcbiAqKiBtb2R1bGUgaWQgPSA5MFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xyXG52YXIgJGV4cG9ydCAgICAgID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcclxuICAsICRmYWlscyAgICAgICA9IHJlcXVpcmUoJy4vX2ZhaWxzJylcclxuICAsIGFOdW1iZXJWYWx1ZSA9IHJlcXVpcmUoJy4vX2EtbnVtYmVyLXZhbHVlJylcclxuICAsICR0b1ByZWNpc2lvbiA9IDEuLnRvUHJlY2lzaW9uO1xyXG5cclxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAoJGZhaWxzKGZ1bmN0aW9uKCl7XHJcbiAgLy8gSUU3LVxyXG4gIHJldHVybiAkdG9QcmVjaXNpb24uY2FsbCgxLCB1bmRlZmluZWQpICE9PSAnMSc7XHJcbn0pIHx8ICEkZmFpbHMoZnVuY3Rpb24oKXtcclxuICAvLyBWOCB+IEFuZHJvaWQgNC4zLVxyXG4gICR0b1ByZWNpc2lvbi5jYWxsKHt9KTtcclxufSkpLCAnTnVtYmVyJywge1xyXG4gIHRvUHJlY2lzaW9uOiBmdW5jdGlvbiB0b1ByZWNpc2lvbihwcmVjaXNpb24pe1xyXG4gICAgdmFyIHRoYXQgPSBhTnVtYmVyVmFsdWUodGhpcywgJ051bWJlciN0b1ByZWNpc2lvbjogaW5jb3JyZWN0IGludm9jYXRpb24hJyk7XHJcbiAgICByZXR1cm4gcHJlY2lzaW9uID09PSB1bmRlZmluZWQgPyAkdG9QcmVjaXNpb24uY2FsbCh0aGF0KSA6ICR0b1ByZWNpc2lvbi5jYWxsKHRoYXQsIHByZWNpc2lvbik7IFxyXG4gIH1cclxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci50by1wcmVjaXNpb24uanNcbiAqKiBtb2R1bGUgaWQgPSA5MVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gMjAuMS4yLjEgTnVtYmVyLkVQU0lMT05cbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTnVtYmVyJywge0VQU0lMT046IE1hdGgucG93KDIsIC01Mil9KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLmVwc2lsb24uanNcbiAqKiBtb2R1bGUgaWQgPSA5MlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gMjAuMS4yLjIgTnVtYmVyLmlzRmluaXRlKG51bWJlcilcbnZhciAkZXhwb3J0ICAgPSByZXF1aXJlKCcuL19leHBvcnQnKVxuICAsIF9pc0Zpbml0ZSA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpLmlzRmluaXRlO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ051bWJlcicsIHtcbiAgaXNGaW5pdGU6IGZ1bmN0aW9uIGlzRmluaXRlKGl0KXtcbiAgICByZXR1cm4gdHlwZW9mIGl0ID09ICdudW1iZXInICYmIF9pc0Zpbml0ZShpdCk7XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIuaXMtZmluaXRlLmpzXG4gKiogbW9kdWxlIGlkID0gOTNcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDIwLjEuMi4zIE51bWJlci5pc0ludGVnZXIobnVtYmVyKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdOdW1iZXInLCB7aXNJbnRlZ2VyOiByZXF1aXJlKCcuL19pcy1pbnRlZ2VyJyl9KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLmlzLWludGVnZXIuanNcbiAqKiBtb2R1bGUgaWQgPSA5NFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gMjAuMS4yLjMgTnVtYmVyLmlzSW50ZWdlcihudW1iZXIpXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKVxuICAsIGZsb29yICAgID0gTWF0aC5mbG9vcjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNJbnRlZ2VyKGl0KXtcbiAgcmV0dXJuICFpc09iamVjdChpdCkgJiYgaXNGaW5pdGUoaXQpICYmIGZsb29yKGl0KSA9PT0gaXQ7XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19pcy1pbnRlZ2VyLmpzXG4gKiogbW9kdWxlIGlkID0gOTVcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDIwLjEuMi40IE51bWJlci5pc05hTihudW1iZXIpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ051bWJlcicsIHtcbiAgaXNOYU46IGZ1bmN0aW9uIGlzTmFOKG51bWJlcil7XG4gICAgcmV0dXJuIG51bWJlciAhPSBudW1iZXI7XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIuaXMtbmFuLmpzXG4gKiogbW9kdWxlIGlkID0gOTZcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDIwLjEuMi41IE51bWJlci5pc1NhZmVJbnRlZ2VyKG51bWJlcilcbnZhciAkZXhwb3J0ICAgPSByZXF1aXJlKCcuL19leHBvcnQnKVxuICAsIGlzSW50ZWdlciA9IHJlcXVpcmUoJy4vX2lzLWludGVnZXInKVxuICAsIGFicyAgICAgICA9IE1hdGguYWJzO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ051bWJlcicsIHtcbiAgaXNTYWZlSW50ZWdlcjogZnVuY3Rpb24gaXNTYWZlSW50ZWdlcihudW1iZXIpe1xuICAgIHJldHVybiBpc0ludGVnZXIobnVtYmVyKSAmJiBhYnMobnVtYmVyKSA8PSAweDFmZmZmZmZmZmZmZmZmO1xuICB9XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLmlzLXNhZmUtaW50ZWdlci5qc1xuICoqIG1vZHVsZSBpZCA9IDk3XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyAyMC4xLjIuNiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUlxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdOdW1iZXInLCB7TUFYX1NBRkVfSU5URUdFUjogMHgxZmZmZmZmZmZmZmZmZn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIubWF4LXNhZmUtaW50ZWdlci5qc1xuICoqIG1vZHVsZSBpZCA9IDk4XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyAyMC4xLjIuMTAgTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVJcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTnVtYmVyJywge01JTl9TQUZFX0lOVEVHRVI6IC0weDFmZmZmZmZmZmZmZmZmfSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5taW4tc2FmZS1pbnRlZ2VyLmpzXG4gKiogbW9kdWxlIGlkID0gOTlcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciAkZXhwb3J0ICAgICA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICwgJHBhcnNlRmxvYXQgPSByZXF1aXJlKCcuL19wYXJzZS1mbG9hdCcpO1xuLy8gMjAuMS4yLjEyIE51bWJlci5wYXJzZUZsb2F0KHN0cmluZylcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogKE51bWJlci5wYXJzZUZsb2F0ICE9ICRwYXJzZUZsb2F0KSwgJ051bWJlcicsIHtwYXJzZUZsb2F0OiAkcGFyc2VGbG9hdH0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIucGFyc2UtZmxvYXQuanNcbiAqKiBtb2R1bGUgaWQgPSAxMDBcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciAkZXhwb3J0ICAgPSByZXF1aXJlKCcuL19leHBvcnQnKVxuICAsICRwYXJzZUludCA9IHJlcXVpcmUoJy4vX3BhcnNlLWludCcpO1xuLy8gMjAuMS4yLjEzIE51bWJlci5wYXJzZUludChzdHJpbmcsIHJhZGl4KVxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAoTnVtYmVyLnBhcnNlSW50ICE9ICRwYXJzZUludCksICdOdW1iZXInLCB7cGFyc2VJbnQ6ICRwYXJzZUludH0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIucGFyc2UtaW50LmpzXG4gKiogbW9kdWxlIGlkID0gMTAxXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyAyMC4yLjIuMyBNYXRoLmFjb3NoKHgpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICwgbG9nMXAgICA9IHJlcXVpcmUoJy4vX21hdGgtbG9nMXAnKVxuICAsIHNxcnQgICAgPSBNYXRoLnNxcnRcbiAgLCAkYWNvc2ggID0gTWF0aC5hY29zaDtcblxuLy8gVjggYnVnIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0zNTA5XG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICEoJGFjb3NoICYmIE1hdGguZmxvb3IoJGFjb3NoKE51bWJlci5NQVhfVkFMVUUpKSA9PSA3MTApLCAnTWF0aCcsIHtcbiAgYWNvc2g6IGZ1bmN0aW9uIGFjb3NoKHgpe1xuICAgIHJldHVybiAoeCA9ICt4KSA8IDEgPyBOYU4gOiB4ID4gOTQ5MDYyNjUuNjI0MjUxNTZcbiAgICAgID8gTWF0aC5sb2coeCkgKyBNYXRoLkxOMlxuICAgICAgOiBsb2cxcCh4IC0gMSArIHNxcnQoeCAtIDEpICogc3FydCh4ICsgMSkpO1xuICB9XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5hY29zaC5qc1xuICoqIG1vZHVsZSBpZCA9IDEwMlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gMjAuMi4yLjIwIE1hdGgubG9nMXAoeClcbm1vZHVsZS5leHBvcnRzID0gTWF0aC5sb2cxcCB8fCBmdW5jdGlvbiBsb2cxcCh4KXtcbiAgcmV0dXJuICh4ID0gK3gpID4gLTFlLTggJiYgeCA8IDFlLTggPyB4IC0geCAqIHggLyAyIDogTWF0aC5sb2coMSArIHgpO1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fbWF0aC1sb2cxcC5qc1xuICoqIG1vZHVsZSBpZCA9IDEwM1xuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gMjAuMi4yLjUgTWF0aC5hc2luaCh4KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuZnVuY3Rpb24gYXNpbmgoeCl7XG4gIHJldHVybiAhaXNGaW5pdGUoeCA9ICt4KSB8fCB4ID09IDAgPyB4IDogeCA8IDAgPyAtYXNpbmgoLXgpIDogTWF0aC5sb2coeCArIE1hdGguc3FydCh4ICogeCArIDEpKTtcbn1cblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywge2FzaW5oOiBhc2luaH0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLmFzaW5oLmpzXG4gKiogbW9kdWxlIGlkID0gMTA0XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyAyMC4yLjIuNyBNYXRoLmF0YW5oKHgpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7XG4gIGF0YW5oOiBmdW5jdGlvbiBhdGFuaCh4KXtcbiAgICByZXR1cm4gKHggPSAreCkgPT0gMCA/IHggOiBNYXRoLmxvZygoMSArIHgpIC8gKDEgLSB4KSkgLyAyO1xuICB9XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5hdGFuaC5qc1xuICoqIG1vZHVsZSBpZCA9IDEwNVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gMjAuMi4yLjkgTWF0aC5jYnJ0KHgpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICwgc2lnbiAgICA9IHJlcXVpcmUoJy4vX21hdGgtc2lnbicpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7XG4gIGNicnQ6IGZ1bmN0aW9uIGNicnQoeCl7XG4gICAgcmV0dXJuIHNpZ24oeCA9ICt4KSAqIE1hdGgucG93KE1hdGguYWJzKHgpLCAxIC8gMyk7XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLmNicnQuanNcbiAqKiBtb2R1bGUgaWQgPSAxMDZcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDIwLjIuMi4yOCBNYXRoLnNpZ24oeClcbm1vZHVsZS5leHBvcnRzID0gTWF0aC5zaWduIHx8IGZ1bmN0aW9uIHNpZ24oeCl7XG4gIHJldHVybiAoeCA9ICt4KSA9PSAwIHx8IHggIT0geCA/IHggOiB4IDwgMCA/IC0xIDogMTtcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX21hdGgtc2lnbi5qc1xuICoqIG1vZHVsZSBpZCA9IDEwN1xuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gMjAuMi4yLjExIE1hdGguY2x6MzIoeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHtcbiAgY2x6MzI6IGZ1bmN0aW9uIGNsejMyKHgpe1xuICAgIHJldHVybiAoeCA+Pj49IDApID8gMzEgLSBNYXRoLmZsb29yKE1hdGgubG9nKHggKyAwLjUpICogTWF0aC5MT0cyRSkgOiAzMjtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguY2x6MzIuanNcbiAqKiBtb2R1bGUgaWQgPSAxMDhcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDIwLjIuMi4xMiBNYXRoLmNvc2goeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCBleHAgICAgID0gTWF0aC5leHA7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHtcbiAgY29zaDogZnVuY3Rpb24gY29zaCh4KXtcbiAgICByZXR1cm4gKGV4cCh4ID0gK3gpICsgZXhwKC14KSkgLyAyO1xuICB9XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5jb3NoLmpzXG4gKiogbW9kdWxlIGlkID0gMTA5XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyAyMC4yLjIuMTQgTWF0aC5leHBtMSh4KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywge2V4cG0xOiByZXF1aXJlKCcuL19tYXRoLWV4cG0xJyl9KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5leHBtMS5qc1xuICoqIG1vZHVsZSBpZCA9IDExMFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gMjAuMi4yLjE0IE1hdGguZXhwbTEoeClcbm1vZHVsZS5leHBvcnRzID0gTWF0aC5leHBtMSB8fCBmdW5jdGlvbiBleHBtMSh4KXtcbiAgcmV0dXJuICh4ID0gK3gpID09IDAgPyB4IDogeCA+IC0xZS02ICYmIHggPCAxZS02ID8geCArIHggKiB4IC8gMiA6IE1hdGguZXhwKHgpIC0gMTtcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX21hdGgtZXhwbTEuanNcbiAqKiBtb2R1bGUgaWQgPSAxMTFcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDIwLjIuMi4xNiBNYXRoLmZyb3VuZCh4KVxudmFyICRleHBvcnQgICA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICwgc2lnbiAgICAgID0gcmVxdWlyZSgnLi9fbWF0aC1zaWduJylcbiAgLCBwb3cgICAgICAgPSBNYXRoLnBvd1xuICAsIEVQU0lMT04gICA9IHBvdygyLCAtNTIpXG4gICwgRVBTSUxPTjMyID0gcG93KDIsIC0yMylcbiAgLCBNQVgzMiAgICAgPSBwb3coMiwgMTI3KSAqICgyIC0gRVBTSUxPTjMyKVxuICAsIE1JTjMyICAgICA9IHBvdygyLCAtMTI2KTtcblxudmFyIHJvdW5kVGllc1RvRXZlbiA9IGZ1bmN0aW9uKG4pe1xuICByZXR1cm4gbiArIDEgLyBFUFNJTE9OIC0gMSAvIEVQU0lMT047XG59O1xuXG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHtcbiAgZnJvdW5kOiBmdW5jdGlvbiBmcm91bmQoeCl7XG4gICAgdmFyICRhYnMgID0gTWF0aC5hYnMoeClcbiAgICAgICwgJHNpZ24gPSBzaWduKHgpXG4gICAgICAsIGEsIHJlc3VsdDtcbiAgICBpZigkYWJzIDwgTUlOMzIpcmV0dXJuICRzaWduICogcm91bmRUaWVzVG9FdmVuKCRhYnMgLyBNSU4zMiAvIEVQU0lMT04zMikgKiBNSU4zMiAqIEVQU0lMT04zMjtcbiAgICBhID0gKDEgKyBFUFNJTE9OMzIgLyBFUFNJTE9OKSAqICRhYnM7XG4gICAgcmVzdWx0ID0gYSAtIChhIC0gJGFicyk7XG4gICAgaWYocmVzdWx0ID4gTUFYMzIgfHwgcmVzdWx0ICE9IHJlc3VsdClyZXR1cm4gJHNpZ24gKiBJbmZpbml0eTtcbiAgICByZXR1cm4gJHNpZ24gKiByZXN1bHQ7XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLmZyb3VuZC5qc1xuICoqIG1vZHVsZSBpZCA9IDExMlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gMjAuMi4yLjE3IE1hdGguaHlwb3QoW3ZhbHVlMVssIHZhbHVlMlssIOKApiBdXV0pXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICwgYWJzICAgICA9IE1hdGguYWJzO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7XG4gIGh5cG90OiBmdW5jdGlvbiBoeXBvdCh2YWx1ZTEsIHZhbHVlMil7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICB2YXIgc3VtICA9IDBcbiAgICAgICwgaSAgICA9IDBcbiAgICAgICwgYUxlbiA9IGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgICwgbGFyZyA9IDBcbiAgICAgICwgYXJnLCBkaXY7XG4gICAgd2hpbGUoaSA8IGFMZW4pe1xuICAgICAgYXJnID0gYWJzKGFyZ3VtZW50c1tpKytdKTtcbiAgICAgIGlmKGxhcmcgPCBhcmcpe1xuICAgICAgICBkaXYgID0gbGFyZyAvIGFyZztcbiAgICAgICAgc3VtICA9IHN1bSAqIGRpdiAqIGRpdiArIDE7XG4gICAgICAgIGxhcmcgPSBhcmc7XG4gICAgICB9IGVsc2UgaWYoYXJnID4gMCl7XG4gICAgICAgIGRpdiAgPSBhcmcgLyBsYXJnO1xuICAgICAgICBzdW0gKz0gZGl2ICogZGl2O1xuICAgICAgfSBlbHNlIHN1bSArPSBhcmc7XG4gICAgfVxuICAgIHJldHVybiBsYXJnID09PSBJbmZpbml0eSA/IEluZmluaXR5IDogbGFyZyAqIE1hdGguc3FydChzdW0pO1xuICB9XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5oeXBvdC5qc1xuICoqIG1vZHVsZSBpZCA9IDExM1xuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gMjAuMi4yLjE4IE1hdGguaW11bCh4LCB5KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKVxuICAsICRpbXVsICAgPSBNYXRoLmltdWw7XG5cbi8vIHNvbWUgV2ViS2l0IHZlcnNpb25zIGZhaWxzIHdpdGggYmlnIG51bWJlcnMsIHNvbWUgaGFzIHdyb25nIGFyaXR5XG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqIHJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24oKXtcbiAgcmV0dXJuICRpbXVsKDB4ZmZmZmZmZmYsIDUpICE9IC01IHx8ICRpbXVsLmxlbmd0aCAhPSAyO1xufSksICdNYXRoJywge1xuICBpbXVsOiBmdW5jdGlvbiBpbXVsKHgsIHkpe1xuICAgIHZhciBVSU5UMTYgPSAweGZmZmZcbiAgICAgICwgeG4gPSAreFxuICAgICAgLCB5biA9ICt5XG4gICAgICAsIHhsID0gVUlOVDE2ICYgeG5cbiAgICAgICwgeWwgPSBVSU5UMTYgJiB5bjtcbiAgICByZXR1cm4gMCB8IHhsICogeWwgKyAoKFVJTlQxNiAmIHhuID4+PiAxNikgKiB5bCArIHhsICogKFVJTlQxNiAmIHluID4+PiAxNikgPDwgMTYgPj4+IDApO1xuICB9XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5pbXVsLmpzXG4gKiogbW9kdWxlIGlkID0gMTE0XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyAyMC4yLjIuMjEgTWF0aC5sb2cxMCh4KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywge1xuICBsb2cxMDogZnVuY3Rpb24gbG9nMTAoeCl7XG4gICAgcmV0dXJuIE1hdGgubG9nKHgpIC8gTWF0aC5MTjEwO1xuICB9XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5sb2cxMC5qc1xuICoqIG1vZHVsZSBpZCA9IDExNVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gMjAuMi4yLjIwIE1hdGgubG9nMXAoeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHtsb2cxcDogcmVxdWlyZSgnLi9fbWF0aC1sb2cxcCcpfSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGgubG9nMXAuanNcbiAqKiBtb2R1bGUgaWQgPSAxMTZcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDIwLjIuMi4yMiBNYXRoLmxvZzIoeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHtcbiAgbG9nMjogZnVuY3Rpb24gbG9nMih4KXtcbiAgICByZXR1cm4gTWF0aC5sb2coeCkgLyBNYXRoLkxOMjtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGgubG9nMi5qc1xuICoqIG1vZHVsZSBpZCA9IDExN1xuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gMjAuMi4yLjI4IE1hdGguc2lnbih4KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywge3NpZ246IHJlcXVpcmUoJy4vX21hdGgtc2lnbicpfSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguc2lnbi5qc1xuICoqIG1vZHVsZSBpZCA9IDExOFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gMjAuMi4yLjMwIE1hdGguc2luaCh4KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKVxuICAsIGV4cG0xICAgPSByZXF1aXJlKCcuL19tYXRoLWV4cG0xJylcbiAgLCBleHAgICAgID0gTWF0aC5leHA7XG5cbi8vIFY4IG5lYXIgQ2hyb21pdW0gMzggaGFzIGEgcHJvYmxlbSB3aXRoIHZlcnkgc21hbGwgbnVtYmVyc1xuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiByZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uKCl7XG4gIHJldHVybiAhTWF0aC5zaW5oKC0yZS0xNykgIT0gLTJlLTE3O1xufSksICdNYXRoJywge1xuICBzaW5oOiBmdW5jdGlvbiBzaW5oKHgpe1xuICAgIHJldHVybiBNYXRoLmFicyh4ID0gK3gpIDwgMVxuICAgICAgPyAoZXhwbTEoeCkgLSBleHBtMSgteCkpIC8gMlxuICAgICAgOiAoZXhwKHggLSAxKSAtIGV4cCgteCAtIDEpKSAqIChNYXRoLkUgLyAyKTtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguc2luaC5qc1xuICoqIG1vZHVsZSBpZCA9IDExOVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gMjAuMi4yLjMzIE1hdGgudGFuaCh4KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKVxuICAsIGV4cG0xICAgPSByZXF1aXJlKCcuL19tYXRoLWV4cG0xJylcbiAgLCBleHAgICAgID0gTWF0aC5leHA7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHtcbiAgdGFuaDogZnVuY3Rpb24gdGFuaCh4KXtcbiAgICB2YXIgYSA9IGV4cG0xKHggPSAreClcbiAgICAgICwgYiA9IGV4cG0xKC14KTtcbiAgICByZXR1cm4gYSA9PSBJbmZpbml0eSA/IDEgOiBiID09IEluZmluaXR5ID8gLTEgOiAoYSAtIGIpIC8gKGV4cCh4KSArIGV4cCgteCkpO1xuICB9XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC50YW5oLmpzXG4gKiogbW9kdWxlIGlkID0gMTIwXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyAyMC4yLjIuMzQgTWF0aC50cnVuYyh4KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywge1xuICB0cnVuYzogZnVuY3Rpb24gdHJ1bmMoaXQpe1xuICAgIHJldHVybiAoaXQgPiAwID8gTWF0aC5mbG9vciA6IE1hdGguY2VpbCkoaXQpO1xuICB9XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC50cnVuYy5qc1xuICoqIG1vZHVsZSBpZCA9IDEyMVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwidmFyICRleHBvcnQgICAgICAgID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCB0b0luZGV4ICAgICAgICA9IHJlcXVpcmUoJy4vX3RvLWluZGV4JylcbiAgLCBmcm9tQ2hhckNvZGUgICA9IFN0cmluZy5mcm9tQ2hhckNvZGVcbiAgLCAkZnJvbUNvZGVQb2ludCA9IFN0cmluZy5mcm9tQ29kZVBvaW50O1xuXG4vLyBsZW5ndGggc2hvdWxkIGJlIDEsIG9sZCBGRiBwcm9ibGVtXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICghISRmcm9tQ29kZVBvaW50ICYmICRmcm9tQ29kZVBvaW50Lmxlbmd0aCAhPSAxKSwgJ1N0cmluZycsIHtcbiAgLy8gMjEuMS4yLjIgU3RyaW5nLmZyb21Db2RlUG9pbnQoLi4uY29kZVBvaW50cylcbiAgZnJvbUNvZGVQb2ludDogZnVuY3Rpb24gZnJvbUNvZGVQb2ludCh4KXsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgIHZhciByZXMgID0gW11cbiAgICAgICwgYUxlbiA9IGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgICwgaSAgICA9IDBcbiAgICAgICwgY29kZTtcbiAgICB3aGlsZShhTGVuID4gaSl7XG4gICAgICBjb2RlID0gK2FyZ3VtZW50c1tpKytdO1xuICAgICAgaWYodG9JbmRleChjb2RlLCAweDEwZmZmZikgIT09IGNvZGUpdGhyb3cgUmFuZ2VFcnJvcihjb2RlICsgJyBpcyBub3QgYSB2YWxpZCBjb2RlIHBvaW50Jyk7XG4gICAgICByZXMucHVzaChjb2RlIDwgMHgxMDAwMFxuICAgICAgICA/IGZyb21DaGFyQ29kZShjb2RlKVxuICAgICAgICA6IGZyb21DaGFyQ29kZSgoKGNvZGUgLT0gMHgxMDAwMCkgPj4gMTApICsgMHhkODAwLCBjb2RlICUgMHg0MDAgKyAweGRjMDApXG4gICAgICApO1xuICAgIH0gcmV0dXJuIHJlcy5qb2luKCcnKTtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5mcm9tLWNvZGUtcG9pbnQuanNcbiAqKiBtb2R1bGUgaWQgPSAxMjJcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciAkZXhwb3J0ICAgPSByZXF1aXJlKCcuL19leHBvcnQnKVxuICAsIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKVxuICAsIHRvTGVuZ3RoICA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1N0cmluZycsIHtcbiAgLy8gMjEuMS4yLjQgU3RyaW5nLnJhdyhjYWxsU2l0ZSwgLi4uc3Vic3RpdHV0aW9ucylcbiAgcmF3OiBmdW5jdGlvbiByYXcoY2FsbFNpdGUpe1xuICAgIHZhciB0cGwgID0gdG9JT2JqZWN0KGNhbGxTaXRlLnJhdylcbiAgICAgICwgbGVuICA9IHRvTGVuZ3RoKHRwbC5sZW5ndGgpXG4gICAgICAsIGFMZW4gPSBhcmd1bWVudHMubGVuZ3RoXG4gICAgICAsIHJlcyAgPSBbXVxuICAgICAgLCBpICAgID0gMDtcbiAgICB3aGlsZShsZW4gPiBpKXtcbiAgICAgIHJlcy5wdXNoKFN0cmluZyh0cGxbaSsrXSkpO1xuICAgICAgaWYoaSA8IGFMZW4pcmVzLnB1c2goU3RyaW5nKGFyZ3VtZW50c1tpXSkpO1xuICAgIH0gcmV0dXJuIHJlcy5qb2luKCcnKTtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5yYXcuanNcbiAqKiBtb2R1bGUgaWQgPSAxMjNcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0Jztcbi8vIDIxLjEuMy4yNSBTdHJpbmcucHJvdG90eXBlLnRyaW0oKVxucmVxdWlyZSgnLi9fc3RyaW5nLXRyaW0nKSgndHJpbScsIGZ1bmN0aW9uKCR0cmltKXtcbiAgcmV0dXJuIGZ1bmN0aW9uIHRyaW0oKXtcbiAgICByZXR1cm4gJHRyaW0odGhpcywgMyk7XG4gIH07XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLnRyaW0uanNcbiAqKiBtb2R1bGUgaWQgPSAxMjRcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0JztcbnZhciAkYXQgID0gcmVxdWlyZSgnLi9fc3RyaW5nLWF0JykodHJ1ZSk7XG5cbi8vIDIxLjEuMy4yNyBTdHJpbmcucHJvdG90eXBlW0BAaXRlcmF0b3JdKClcbnJlcXVpcmUoJy4vX2l0ZXItZGVmaW5lJykoU3RyaW5nLCAnU3RyaW5nJywgZnVuY3Rpb24oaXRlcmF0ZWQpe1xuICB0aGlzLl90ID0gU3RyaW5nKGl0ZXJhdGVkKTsgLy8gdGFyZ2V0XG4gIHRoaXMuX2kgPSAwOyAgICAgICAgICAgICAgICAvLyBuZXh0IGluZGV4XG4vLyAyMS4xLjUuMi4xICVTdHJpbmdJdGVyYXRvclByb3RvdHlwZSUubmV4dCgpXG59LCBmdW5jdGlvbigpe1xuICB2YXIgTyAgICAgPSB0aGlzLl90XG4gICAgLCBpbmRleCA9IHRoaXMuX2lcbiAgICAsIHBvaW50O1xuICBpZihpbmRleCA+PSBPLmxlbmd0aClyZXR1cm4ge3ZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWV9O1xuICBwb2ludCA9ICRhdChPLCBpbmRleCk7XG4gIHRoaXMuX2kgKz0gcG9pbnQubGVuZ3RoO1xuICByZXR1cm4ge3ZhbHVlOiBwb2ludCwgZG9uZTogZmFsc2V9O1xufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5pdGVyYXRvci5qc1xuICoqIG1vZHVsZSBpZCA9IDEyNVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwidmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4vX3RvLWludGVnZXInKVxuICAsIGRlZmluZWQgICA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbi8vIHRydWUgIC0+IFN0cmluZyNhdFxuLy8gZmFsc2UgLT4gU3RyaW5nI2NvZGVQb2ludEF0XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKFRPX1NUUklORyl7XG4gIHJldHVybiBmdW5jdGlvbih0aGF0LCBwb3Mpe1xuICAgIHZhciBzID0gU3RyaW5nKGRlZmluZWQodGhhdCkpXG4gICAgICAsIGkgPSB0b0ludGVnZXIocG9zKVxuICAgICAgLCBsID0gcy5sZW5ndGhcbiAgICAgICwgYSwgYjtcbiAgICBpZihpIDwgMCB8fCBpID49IGwpcmV0dXJuIFRPX1NUUklORyA/ICcnIDogdW5kZWZpbmVkO1xuICAgIGEgPSBzLmNoYXJDb2RlQXQoaSk7XG4gICAgcmV0dXJuIGEgPCAweGQ4MDAgfHwgYSA+IDB4ZGJmZiB8fCBpICsgMSA9PT0gbCB8fCAoYiA9IHMuY2hhckNvZGVBdChpICsgMSkpIDwgMHhkYzAwIHx8IGIgPiAweGRmZmZcbiAgICAgID8gVE9fU1RSSU5HID8gcy5jaGFyQXQoaSkgOiBhXG4gICAgICA6IFRPX1NUUklORyA/IHMuc2xpY2UoaSwgaSArIDIpIDogKGEgLSAweGQ4MDAgPDwgMTApICsgKGIgLSAweGRjMDApICsgMHgxMDAwMDtcbiAgfTtcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX3N0cmluZy1hdC5qc1xuICoqIG1vZHVsZSBpZCA9IDEyNlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xudmFyIExJQlJBUlkgICAgICAgID0gcmVxdWlyZSgnLi9fbGlicmFyeScpXG4gICwgJGV4cG9ydCAgICAgICAgPSByZXF1aXJlKCcuL19leHBvcnQnKVxuICAsIHJlZGVmaW5lICAgICAgID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUnKVxuICAsIGhpZGUgICAgICAgICAgID0gcmVxdWlyZSgnLi9faGlkZScpXG4gICwgaGFzICAgICAgICAgICAgPSByZXF1aXJlKCcuL19oYXMnKVxuICAsIEl0ZXJhdG9ycyAgICAgID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJylcbiAgLCAkaXRlckNyZWF0ZSAgICA9IHJlcXVpcmUoJy4vX2l0ZXItY3JlYXRlJylcbiAgLCBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4vX3NldC10by1zdHJpbmctdGFnJylcbiAgLCBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4vX29iamVjdC1ncG8nKVxuICAsIElURVJBVE9SICAgICAgID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJylcbiAgLCBCVUdHWSAgICAgICAgICA9ICEoW10ua2V5cyAmJiAnbmV4dCcgaW4gW10ua2V5cygpKSAvLyBTYWZhcmkgaGFzIGJ1Z2d5IGl0ZXJhdG9ycyB3L28gYG5leHRgXG4gICwgRkZfSVRFUkFUT1IgICAgPSAnQEBpdGVyYXRvcidcbiAgLCBLRVlTICAgICAgICAgICA9ICdrZXlzJ1xuICAsIFZBTFVFUyAgICAgICAgID0gJ3ZhbHVlcyc7XG5cbnZhciByZXR1cm5UaGlzID0gZnVuY3Rpb24oKXsgcmV0dXJuIHRoaXM7IH07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oQmFzZSwgTkFNRSwgQ29uc3RydWN0b3IsIG5leHQsIERFRkFVTFQsIElTX1NFVCwgRk9SQ0VEKXtcbiAgJGl0ZXJDcmVhdGUoQ29uc3RydWN0b3IsIE5BTUUsIG5leHQpO1xuICB2YXIgZ2V0TWV0aG9kID0gZnVuY3Rpb24oa2luZCl7XG4gICAgaWYoIUJVR0dZICYmIGtpbmQgaW4gcHJvdG8pcmV0dXJuIHByb3RvW2tpbmRdO1xuICAgIHN3aXRjaChraW5kKXtcbiAgICAgIGNhc2UgS0VZUzogcmV0dXJuIGZ1bmN0aW9uIGtleXMoKXsgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcih0aGlzLCBraW5kKTsgfTtcbiAgICAgIGNhc2UgVkFMVUVTOiByZXR1cm4gZnVuY3Rpb24gdmFsdWVzKCl7IHJldHVybiBuZXcgQ29uc3RydWN0b3IodGhpcywga2luZCk7IH07XG4gICAgfSByZXR1cm4gZnVuY3Rpb24gZW50cmllcygpeyByZXR1cm4gbmV3IENvbnN0cnVjdG9yKHRoaXMsIGtpbmQpOyB9O1xuICB9O1xuICB2YXIgVEFHICAgICAgICA9IE5BTUUgKyAnIEl0ZXJhdG9yJ1xuICAgICwgREVGX1ZBTFVFUyA9IERFRkFVTFQgPT0gVkFMVUVTXG4gICAgLCBWQUxVRVNfQlVHID0gZmFsc2VcbiAgICAsIHByb3RvICAgICAgPSBCYXNlLnByb3RvdHlwZVxuICAgICwgJG5hdGl2ZSAgICA9IHByb3RvW0lURVJBVE9SXSB8fCBwcm90b1tGRl9JVEVSQVRPUl0gfHwgREVGQVVMVCAmJiBwcm90b1tERUZBVUxUXVxuICAgICwgJGRlZmF1bHQgICA9ICRuYXRpdmUgfHwgZ2V0TWV0aG9kKERFRkFVTFQpXG4gICAgLCAkZW50cmllcyAgID0gREVGQVVMVCA/ICFERUZfVkFMVUVTID8gJGRlZmF1bHQgOiBnZXRNZXRob2QoJ2VudHJpZXMnKSA6IHVuZGVmaW5lZFxuICAgICwgJGFueU5hdGl2ZSA9IE5BTUUgPT0gJ0FycmF5JyA/IHByb3RvLmVudHJpZXMgfHwgJG5hdGl2ZSA6ICRuYXRpdmVcbiAgICAsIG1ldGhvZHMsIGtleSwgSXRlcmF0b3JQcm90b3R5cGU7XG4gIC8vIEZpeCBuYXRpdmVcbiAgaWYoJGFueU5hdGl2ZSl7XG4gICAgSXRlcmF0b3JQcm90b3R5cGUgPSBnZXRQcm90b3R5cGVPZigkYW55TmF0aXZlLmNhbGwobmV3IEJhc2UpKTtcbiAgICBpZihJdGVyYXRvclByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSl7XG4gICAgICAvLyBTZXQgQEB0b1N0cmluZ1RhZyB0byBuYXRpdmUgaXRlcmF0b3JzXG4gICAgICBzZXRUb1N0cmluZ1RhZyhJdGVyYXRvclByb3RvdHlwZSwgVEFHLCB0cnVlKTtcbiAgICAgIC8vIGZpeCBmb3Igc29tZSBvbGQgZW5naW5lc1xuICAgICAgaWYoIUxJQlJBUlkgJiYgIWhhcyhJdGVyYXRvclByb3RvdHlwZSwgSVRFUkFUT1IpKWhpZGUoSXRlcmF0b3JQcm90b3R5cGUsIElURVJBVE9SLCByZXR1cm5UaGlzKTtcbiAgICB9XG4gIH1cbiAgLy8gZml4IEFycmF5I3t2YWx1ZXMsIEBAaXRlcmF0b3J9Lm5hbWUgaW4gVjggLyBGRlxuICBpZihERUZfVkFMVUVTICYmICRuYXRpdmUgJiYgJG5hdGl2ZS5uYW1lICE9PSBWQUxVRVMpe1xuICAgIFZBTFVFU19CVUcgPSB0cnVlO1xuICAgICRkZWZhdWx0ID0gZnVuY3Rpb24gdmFsdWVzKCl7IHJldHVybiAkbmF0aXZlLmNhbGwodGhpcyk7IH07XG4gIH1cbiAgLy8gRGVmaW5lIGl0ZXJhdG9yXG4gIGlmKCghTElCUkFSWSB8fCBGT1JDRUQpICYmIChCVUdHWSB8fCBWQUxVRVNfQlVHIHx8ICFwcm90b1tJVEVSQVRPUl0pKXtcbiAgICBoaWRlKHByb3RvLCBJVEVSQVRPUiwgJGRlZmF1bHQpO1xuICB9XG4gIC8vIFBsdWcgZm9yIGxpYnJhcnlcbiAgSXRlcmF0b3JzW05BTUVdID0gJGRlZmF1bHQ7XG4gIEl0ZXJhdG9yc1tUQUddICA9IHJldHVyblRoaXM7XG4gIGlmKERFRkFVTFQpe1xuICAgIG1ldGhvZHMgPSB7XG4gICAgICB2YWx1ZXM6ICBERUZfVkFMVUVTID8gJGRlZmF1bHQgOiBnZXRNZXRob2QoVkFMVUVTKSxcbiAgICAgIGtleXM6ICAgIElTX1NFVCAgICAgPyAkZGVmYXVsdCA6IGdldE1ldGhvZChLRVlTKSxcbiAgICAgIGVudHJpZXM6ICRlbnRyaWVzXG4gICAgfTtcbiAgICBpZihGT1JDRUQpZm9yKGtleSBpbiBtZXRob2RzKXtcbiAgICAgIGlmKCEoa2V5IGluIHByb3RvKSlyZWRlZmluZShwcm90bywga2V5LCBtZXRob2RzW2tleV0pO1xuICAgIH0gZWxzZSAkZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIChCVUdHWSB8fCBWQUxVRVNfQlVHKSwgTkFNRSwgbWV0aG9kcyk7XG4gIH1cbiAgcmV0dXJuIG1ldGhvZHM7XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19pdGVyLWRlZmluZS5qc1xuICoqIG1vZHVsZSBpZCA9IDEyN1xuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwibW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9faXRlcmF0b3JzLmpzXG4gKiogbW9kdWxlIGlkID0gMTI4XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG52YXIgY3JlYXRlICAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtY3JlYXRlJylcbiAgLCBkZXNjcmlwdG9yICAgICA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKVxuICAsIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi9fc2V0LXRvLXN0cmluZy10YWcnKVxuICAsIEl0ZXJhdG9yUHJvdG90eXBlID0ge307XG5cbi8vIDI1LjEuMi4xLjEgJUl0ZXJhdG9yUHJvdG90eXBlJVtAQGl0ZXJhdG9yXSgpXG5yZXF1aXJlKCcuL19oaWRlJykoSXRlcmF0b3JQcm90b3R5cGUsIHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpLCBmdW5jdGlvbigpeyByZXR1cm4gdGhpczsgfSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oQ29uc3RydWN0b3IsIE5BTUUsIG5leHQpe1xuICBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBjcmVhdGUoSXRlcmF0b3JQcm90b3R5cGUsIHtuZXh0OiBkZXNjcmlwdG9yKDEsIG5leHQpfSk7XG4gIHNldFRvU3RyaW5nVGFnKENvbnN0cnVjdG9yLCBOQU1FICsgJyBJdGVyYXRvcicpO1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9faXRlci1jcmVhdGUuanNcbiAqKiBtb2R1bGUgaWQgPSAxMjlcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCAkYXQgICAgID0gcmVxdWlyZSgnLi9fc3RyaW5nLWF0JykoZmFsc2UpO1xuJGV4cG9ydCgkZXhwb3J0LlAsICdTdHJpbmcnLCB7XG4gIC8vIDIxLjEuMy4zIFN0cmluZy5wcm90b3R5cGUuY29kZVBvaW50QXQocG9zKVxuICBjb2RlUG9pbnRBdDogZnVuY3Rpb24gY29kZVBvaW50QXQocG9zKXtcbiAgICByZXR1cm4gJGF0KHRoaXMsIHBvcyk7XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuY29kZS1wb2ludC1hdC5qc1xuICoqIG1vZHVsZSBpZCA9IDEzMFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gMjEuMS4zLjYgU3RyaW5nLnByb3RvdHlwZS5lbmRzV2l0aChzZWFyY2hTdHJpbmcgWywgZW5kUG9zaXRpb25dKVxuJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgICA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICwgdG9MZW5ndGggID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJylcbiAgLCBjb250ZXh0ICAgPSByZXF1aXJlKCcuL19zdHJpbmctY29udGV4dCcpXG4gICwgRU5EU19XSVRIID0gJ2VuZHNXaXRoJ1xuICAsICRlbmRzV2l0aCA9ICcnW0VORFNfV0lUSF07XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogcmVxdWlyZSgnLi9fZmFpbHMtaXMtcmVnZXhwJykoRU5EU19XSVRIKSwgJ1N0cmluZycsIHtcbiAgZW5kc1dpdGg6IGZ1bmN0aW9uIGVuZHNXaXRoKHNlYXJjaFN0cmluZyAvKiwgZW5kUG9zaXRpb24gPSBAbGVuZ3RoICovKXtcbiAgICB2YXIgdGhhdCA9IGNvbnRleHQodGhpcywgc2VhcmNoU3RyaW5nLCBFTkRTX1dJVEgpXG4gICAgICAsIGVuZFBvc2l0aW9uID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWRcbiAgICAgICwgbGVuICAgID0gdG9MZW5ndGgodGhhdC5sZW5ndGgpXG4gICAgICAsIGVuZCAgICA9IGVuZFBvc2l0aW9uID09PSB1bmRlZmluZWQgPyBsZW4gOiBNYXRoLm1pbih0b0xlbmd0aChlbmRQb3NpdGlvbiksIGxlbilcbiAgICAgICwgc2VhcmNoID0gU3RyaW5nKHNlYXJjaFN0cmluZyk7XG4gICAgcmV0dXJuICRlbmRzV2l0aFxuICAgICAgPyAkZW5kc1dpdGguY2FsbCh0aGF0LCBzZWFyY2gsIGVuZClcbiAgICAgIDogdGhhdC5zbGljZShlbmQgLSBzZWFyY2gubGVuZ3RoLCBlbmQpID09PSBzZWFyY2g7XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuZW5kcy13aXRoLmpzXG4gKiogbW9kdWxlIGlkID0gMTMxXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyBoZWxwZXIgZm9yIFN0cmluZyN7c3RhcnRzV2l0aCwgZW5kc1dpdGgsIGluY2x1ZGVzfVxudmFyIGlzUmVnRXhwID0gcmVxdWlyZSgnLi9faXMtcmVnZXhwJylcbiAgLCBkZWZpbmVkICA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbih0aGF0LCBzZWFyY2hTdHJpbmcsIE5BTUUpe1xuICBpZihpc1JlZ0V4cChzZWFyY2hTdHJpbmcpKXRocm93IFR5cGVFcnJvcignU3RyaW5nIycgKyBOQU1FICsgXCIgZG9lc24ndCBhY2NlcHQgcmVnZXghXCIpO1xuICByZXR1cm4gU3RyaW5nKGRlZmluZWQodGhhdCkpO1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fc3RyaW5nLWNvbnRleHQuanNcbiAqKiBtb2R1bGUgaWQgPSAxMzJcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDcuMi44IElzUmVnRXhwKGFyZ3VtZW50KVxudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0JylcbiAgLCBjb2YgICAgICA9IHJlcXVpcmUoJy4vX2NvZicpXG4gICwgTUFUQ0ggICAgPSByZXF1aXJlKCcuL193a3MnKSgnbWF0Y2gnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICB2YXIgaXNSZWdFeHA7XG4gIHJldHVybiBpc09iamVjdChpdCkgJiYgKChpc1JlZ0V4cCA9IGl0W01BVENIXSkgIT09IHVuZGVmaW5lZCA/ICEhaXNSZWdFeHAgOiBjb2YoaXQpID09ICdSZWdFeHAnKTtcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2lzLXJlZ2V4cC5qc1xuICoqIG1vZHVsZSBpZCA9IDEzM1xuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwidmFyIE1BVENIID0gcmVxdWlyZSgnLi9fd2tzJykoJ21hdGNoJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKEtFWSl7XG4gIHZhciByZSA9IC8uLztcbiAgdHJ5IHtcbiAgICAnLy4vJ1tLRVldKHJlKTtcbiAgfSBjYXRjaChlKXtcbiAgICB0cnkge1xuICAgICAgcmVbTUFUQ0hdID0gZmFsc2U7XG4gICAgICByZXR1cm4gIScvLi8nW0tFWV0ocmUpO1xuICAgIH0gY2F0Y2goZil7IC8qIGVtcHR5ICovIH1cbiAgfSByZXR1cm4gdHJ1ZTtcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2ZhaWxzLWlzLXJlZ2V4cC5qc1xuICoqIG1vZHVsZSBpZCA9IDEzNFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gMjEuMS4zLjcgU3RyaW5nLnByb3RvdHlwZS5pbmNsdWRlcyhzZWFyY2hTdHJpbmcsIHBvc2l0aW9uID0gMClcbid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ICA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICwgY29udGV4dCAgPSByZXF1aXJlKCcuL19zdHJpbmctY29udGV4dCcpXG4gICwgSU5DTFVERVMgPSAnaW5jbHVkZXMnO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIHJlcXVpcmUoJy4vX2ZhaWxzLWlzLXJlZ2V4cCcpKElOQ0xVREVTKSwgJ1N0cmluZycsIHtcbiAgaW5jbHVkZXM6IGZ1bmN0aW9uIGluY2x1ZGVzKHNlYXJjaFN0cmluZyAvKiwgcG9zaXRpb24gPSAwICovKXtcbiAgICByZXR1cm4gISF+Y29udGV4dCh0aGlzLCBzZWFyY2hTdHJpbmcsIElOQ0xVREVTKVxuICAgICAgLmluZGV4T2Yoc2VhcmNoU3RyaW5nLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuaW5jbHVkZXMuanNcbiAqKiBtb2R1bGUgaWQgPSAxMzVcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QLCAnU3RyaW5nJywge1xuICAvLyAyMS4xLjMuMTMgU3RyaW5nLnByb3RvdHlwZS5yZXBlYXQoY291bnQpXG4gIHJlcGVhdDogcmVxdWlyZSgnLi9fc3RyaW5nLXJlcGVhdCcpXG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLnJlcGVhdC5qc1xuICoqIG1vZHVsZSBpZCA9IDEzNlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gMjEuMS4zLjE4IFN0cmluZy5wcm90b3R5cGUuc3RhcnRzV2l0aChzZWFyY2hTdHJpbmcgWywgcG9zaXRpb24gXSlcbid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ICAgICA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICwgdG9MZW5ndGggICAgPSByZXF1aXJlKCcuL190by1sZW5ndGgnKVxuICAsIGNvbnRleHQgICAgID0gcmVxdWlyZSgnLi9fc3RyaW5nLWNvbnRleHQnKVxuICAsIFNUQVJUU19XSVRIID0gJ3N0YXJ0c1dpdGgnXG4gICwgJHN0YXJ0c1dpdGggPSAnJ1tTVEFSVFNfV0lUSF07XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogcmVxdWlyZSgnLi9fZmFpbHMtaXMtcmVnZXhwJykoU1RBUlRTX1dJVEgpLCAnU3RyaW5nJywge1xuICBzdGFydHNXaXRoOiBmdW5jdGlvbiBzdGFydHNXaXRoKHNlYXJjaFN0cmluZyAvKiwgcG9zaXRpb24gPSAwICovKXtcbiAgICB2YXIgdGhhdCAgID0gY29udGV4dCh0aGlzLCBzZWFyY2hTdHJpbmcsIFNUQVJUU19XSVRIKVxuICAgICAgLCBpbmRleCAgPSB0b0xlbmd0aChNYXRoLm1pbihhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCwgdGhhdC5sZW5ndGgpKVxuICAgICAgLCBzZWFyY2ggPSBTdHJpbmcoc2VhcmNoU3RyaW5nKTtcbiAgICByZXR1cm4gJHN0YXJ0c1dpdGhcbiAgICAgID8gJHN0YXJ0c1dpdGguY2FsbCh0aGF0LCBzZWFyY2gsIGluZGV4KVxuICAgICAgOiB0aGF0LnNsaWNlKGluZGV4LCBpbmRleCArIHNlYXJjaC5sZW5ndGgpID09PSBzZWFyY2g7XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuc3RhcnRzLXdpdGguanNcbiAqKiBtb2R1bGUgaWQgPSAxMzdcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0Jztcbi8vIEIuMi4zLjIgU3RyaW5nLnByb3RvdHlwZS5hbmNob3IobmFtZSlcbnJlcXVpcmUoJy4vX3N0cmluZy1odG1sJykoJ2FuY2hvcicsIGZ1bmN0aW9uKGNyZWF0ZUhUTUwpe1xuICByZXR1cm4gZnVuY3Rpb24gYW5jaG9yKG5hbWUpe1xuICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICdhJywgJ25hbWUnLCBuYW1lKTtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5hbmNob3IuanNcbiAqKiBtb2R1bGUgaWQgPSAxMzhcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCBmYWlscyAgID0gcmVxdWlyZSgnLi9fZmFpbHMnKVxuICAsIGRlZmluZWQgPSByZXF1aXJlKCcuL19kZWZpbmVkJylcbiAgLCBxdW90ICAgID0gL1wiL2c7XG4vLyBCLjIuMy4yLjEgQ3JlYXRlSFRNTChzdHJpbmcsIHRhZywgYXR0cmlidXRlLCB2YWx1ZSlcbnZhciBjcmVhdGVIVE1MID0gZnVuY3Rpb24oc3RyaW5nLCB0YWcsIGF0dHJpYnV0ZSwgdmFsdWUpIHtcbiAgdmFyIFMgID0gU3RyaW5nKGRlZmluZWQoc3RyaW5nKSlcbiAgICAsIHAxID0gJzwnICsgdGFnO1xuICBpZihhdHRyaWJ1dGUgIT09ICcnKXAxICs9ICcgJyArIGF0dHJpYnV0ZSArICc9XCInICsgU3RyaW5nKHZhbHVlKS5yZXBsYWNlKHF1b3QsICcmcXVvdDsnKSArICdcIic7XG4gIHJldHVybiBwMSArICc+JyArIFMgKyAnPC8nICsgdGFnICsgJz4nO1xufTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oTkFNRSwgZXhlYyl7XG4gIHZhciBPID0ge307XG4gIE9bTkFNRV0gPSBleGVjKGNyZWF0ZUhUTUwpO1xuICAkZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIGZhaWxzKGZ1bmN0aW9uKCl7XG4gICAgdmFyIHRlc3QgPSAnJ1tOQU1FXSgnXCInKTtcbiAgICByZXR1cm4gdGVzdCAhPT0gdGVzdC50b0xvd2VyQ2FzZSgpIHx8IHRlc3Quc3BsaXQoJ1wiJykubGVuZ3RoID4gMztcbiAgfSksICdTdHJpbmcnLCBPKTtcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX3N0cmluZy1odG1sLmpzXG4gKiogbW9kdWxlIGlkID0gMTM5XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG4vLyBCLjIuMy4zIFN0cmluZy5wcm90b3R5cGUuYmlnKClcbnJlcXVpcmUoJy4vX3N0cmluZy1odG1sJykoJ2JpZycsIGZ1bmN0aW9uKGNyZWF0ZUhUTUwpe1xuICByZXR1cm4gZnVuY3Rpb24gYmlnKCl7XG4gICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ2JpZycsICcnLCAnJyk7XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuYmlnLmpzXG4gKiogbW9kdWxlIGlkID0gMTQwXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG4vLyBCLjIuMy40IFN0cmluZy5wcm90b3R5cGUuYmxpbmsoKVxucmVxdWlyZSgnLi9fc3RyaW5nLWh0bWwnKSgnYmxpbmsnLCBmdW5jdGlvbihjcmVhdGVIVE1MKXtcbiAgcmV0dXJuIGZ1bmN0aW9uIGJsaW5rKCl7XG4gICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ2JsaW5rJywgJycsICcnKTtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5ibGluay5qc1xuICoqIG1vZHVsZSBpZCA9IDE0MVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xuLy8gQi4yLjMuNSBTdHJpbmcucHJvdG90eXBlLmJvbGQoKVxucmVxdWlyZSgnLi9fc3RyaW5nLWh0bWwnKSgnYm9sZCcsIGZ1bmN0aW9uKGNyZWF0ZUhUTUwpe1xuICByZXR1cm4gZnVuY3Rpb24gYm9sZCgpe1xuICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICdiJywgJycsICcnKTtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5ib2xkLmpzXG4gKiogbW9kdWxlIGlkID0gMTQyXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG4vLyBCLjIuMy42IFN0cmluZy5wcm90b3R5cGUuZml4ZWQoKVxucmVxdWlyZSgnLi9fc3RyaW5nLWh0bWwnKSgnZml4ZWQnLCBmdW5jdGlvbihjcmVhdGVIVE1MKXtcbiAgcmV0dXJuIGZ1bmN0aW9uIGZpeGVkKCl7XG4gICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ3R0JywgJycsICcnKTtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5maXhlZC5qc1xuICoqIG1vZHVsZSBpZCA9IDE0M1xuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xuLy8gQi4yLjMuNyBTdHJpbmcucHJvdG90eXBlLmZvbnRjb2xvcihjb2xvcilcbnJlcXVpcmUoJy4vX3N0cmluZy1odG1sJykoJ2ZvbnRjb2xvcicsIGZ1bmN0aW9uKGNyZWF0ZUhUTUwpe1xuICByZXR1cm4gZnVuY3Rpb24gZm9udGNvbG9yKGNvbG9yKXtcbiAgICByZXR1cm4gY3JlYXRlSFRNTCh0aGlzLCAnZm9udCcsICdjb2xvcicsIGNvbG9yKTtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5mb250Y29sb3IuanNcbiAqKiBtb2R1bGUgaWQgPSAxNDRcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0Jztcbi8vIEIuMi4zLjggU3RyaW5nLnByb3RvdHlwZS5mb250c2l6ZShzaXplKVxucmVxdWlyZSgnLi9fc3RyaW5nLWh0bWwnKSgnZm9udHNpemUnLCBmdW5jdGlvbihjcmVhdGVIVE1MKXtcbiAgcmV0dXJuIGZ1bmN0aW9uIGZvbnRzaXplKHNpemUpe1xuICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICdmb250JywgJ3NpemUnLCBzaXplKTtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5mb250c2l6ZS5qc1xuICoqIG1vZHVsZSBpZCA9IDE0NVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xuLy8gQi4yLjMuOSBTdHJpbmcucHJvdG90eXBlLml0YWxpY3MoKVxucmVxdWlyZSgnLi9fc3RyaW5nLWh0bWwnKSgnaXRhbGljcycsIGZ1bmN0aW9uKGNyZWF0ZUhUTUwpe1xuICByZXR1cm4gZnVuY3Rpb24gaXRhbGljcygpe1xuICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICdpJywgJycsICcnKTtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5pdGFsaWNzLmpzXG4gKiogbW9kdWxlIGlkID0gMTQ2XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG4vLyBCLjIuMy4xMCBTdHJpbmcucHJvdG90eXBlLmxpbmsodXJsKVxucmVxdWlyZSgnLi9fc3RyaW5nLWh0bWwnKSgnbGluaycsIGZ1bmN0aW9uKGNyZWF0ZUhUTUwpe1xuICByZXR1cm4gZnVuY3Rpb24gbGluayh1cmwpe1xuICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICdhJywgJ2hyZWYnLCB1cmwpO1xuICB9XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmxpbmsuanNcbiAqKiBtb2R1bGUgaWQgPSAxNDdcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0Jztcbi8vIEIuMi4zLjExIFN0cmluZy5wcm90b3R5cGUuc21hbGwoKVxucmVxdWlyZSgnLi9fc3RyaW5nLWh0bWwnKSgnc21hbGwnLCBmdW5jdGlvbihjcmVhdGVIVE1MKXtcbiAgcmV0dXJuIGZ1bmN0aW9uIHNtYWxsKCl7XG4gICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ3NtYWxsJywgJycsICcnKTtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5zbWFsbC5qc1xuICoqIG1vZHVsZSBpZCA9IDE0OFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xuLy8gQi4yLjMuMTIgU3RyaW5nLnByb3RvdHlwZS5zdHJpa2UoKVxucmVxdWlyZSgnLi9fc3RyaW5nLWh0bWwnKSgnc3RyaWtlJywgZnVuY3Rpb24oY3JlYXRlSFRNTCl7XG4gIHJldHVybiBmdW5jdGlvbiBzdHJpa2UoKXtcbiAgICByZXR1cm4gY3JlYXRlSFRNTCh0aGlzLCAnc3RyaWtlJywgJycsICcnKTtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5zdHJpa2UuanNcbiAqKiBtb2R1bGUgaWQgPSAxNDlcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0Jztcbi8vIEIuMi4zLjEzIFN0cmluZy5wcm90b3R5cGUuc3ViKClcbnJlcXVpcmUoJy4vX3N0cmluZy1odG1sJykoJ3N1YicsIGZ1bmN0aW9uKGNyZWF0ZUhUTUwpe1xuICByZXR1cm4gZnVuY3Rpb24gc3ViKCl7XG4gICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ3N1YicsICcnLCAnJyk7XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuc3ViLmpzXG4gKiogbW9kdWxlIGlkID0gMTUwXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG4vLyBCLjIuMy4xNCBTdHJpbmcucHJvdG90eXBlLnN1cCgpXG5yZXF1aXJlKCcuL19zdHJpbmctaHRtbCcpKCdzdXAnLCBmdW5jdGlvbihjcmVhdGVIVE1MKXtcbiAgcmV0dXJuIGZ1bmN0aW9uIHN1cCgpe1xuICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICdzdXAnLCAnJywgJycpO1xuICB9XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLnN1cC5qc1xuICoqIG1vZHVsZSBpZCA9IDE1MVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gMjAuMy4zLjEgLyAxNS45LjQuNCBEYXRlLm5vdygpXHJcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XHJcblxyXG4kZXhwb3J0KCRleHBvcnQuUywgJ0RhdGUnLCB7bm93OiBmdW5jdGlvbigpeyByZXR1cm4gbmV3IERhdGUoKS5nZXRUaW1lKCk7IH19KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuZGF0ZS5ub3cuanNcbiAqKiBtb2R1bGUgaWQgPSAxNTJcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ICAgICA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICwgdG9PYmplY3QgICAgPSByZXF1aXJlKCcuL190by1vYmplY3QnKVxuICAsIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi9fdG8tcHJpbWl0aXZlJyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbigpe1xuICByZXR1cm4gbmV3IERhdGUoTmFOKS50b0pTT04oKSAhPT0gbnVsbCB8fCBEYXRlLnByb3RvdHlwZS50b0pTT04uY2FsbCh7dG9JU09TdHJpbmc6IGZ1bmN0aW9uKCl7IHJldHVybiAxOyB9fSkgIT09IDE7XG59KSwgJ0RhdGUnLCB7XG4gIHRvSlNPTjogZnVuY3Rpb24gdG9KU09OKGtleSl7XG4gICAgdmFyIE8gID0gdG9PYmplY3QodGhpcylcbiAgICAgICwgcHYgPSB0b1ByaW1pdGl2ZShPKTtcbiAgICByZXR1cm4gdHlwZW9mIHB2ID09ICdudW1iZXInICYmICFpc0Zpbml0ZShwdikgPyBudWxsIDogTy50b0lTT1N0cmluZygpO1xuICB9XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuZGF0ZS50by1qc29uLmpzXG4gKiogbW9kdWxlIGlkID0gMTUzXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XHJcbi8vIDIwLjMuNC4zNiAvIDE1LjkuNS40MyBEYXRlLnByb3RvdHlwZS50b0lTT1N0cmluZygpXHJcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcclxuICAsIGZhaWxzICAgPSByZXF1aXJlKCcuL19mYWlscycpXHJcbiAgLCBnZXRUaW1lID0gRGF0ZS5wcm90b3R5cGUuZ2V0VGltZTtcclxuXHJcbnZhciBseiA9IGZ1bmN0aW9uKG51bSl7XHJcbiAgcmV0dXJuIG51bSA+IDkgPyBudW0gOiAnMCcgKyBudW07XHJcbn07XHJcblxyXG4vLyBQaGFudG9tSlMgLyBvbGQgV2ViS2l0IGhhcyBhIGJyb2tlbiBpbXBsZW1lbnRhdGlvbnNcclxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAoZmFpbHMoZnVuY3Rpb24oKXtcclxuICByZXR1cm4gbmV3IERhdGUoLTVlMTMgLSAxKS50b0lTT1N0cmluZygpICE9ICcwMzg1LTA3LTI1VDA3OjA2OjM5Ljk5OVonO1xyXG59KSB8fCAhZmFpbHMoZnVuY3Rpb24oKXtcclxuICBuZXcgRGF0ZShOYU4pLnRvSVNPU3RyaW5nKCk7XHJcbn0pKSwgJ0RhdGUnLCB7XHJcbiAgdG9JU09TdHJpbmc6IGZ1bmN0aW9uIHRvSVNPU3RyaW5nKCl7XHJcbiAgICBpZighaXNGaW5pdGUoZ2V0VGltZS5jYWxsKHRoaXMpKSl0aHJvdyBSYW5nZUVycm9yKCdJbnZhbGlkIHRpbWUgdmFsdWUnKTtcclxuICAgIHZhciBkID0gdGhpc1xyXG4gICAgICAsIHkgPSBkLmdldFVUQ0Z1bGxZZWFyKClcclxuICAgICAgLCBtID0gZC5nZXRVVENNaWxsaXNlY29uZHMoKVxyXG4gICAgICAsIHMgPSB5IDwgMCA/ICctJyA6IHkgPiA5OTk5ID8gJysnIDogJyc7XHJcbiAgICByZXR1cm4gcyArICgnMDAwMDAnICsgTWF0aC5hYnMoeSkpLnNsaWNlKHMgPyAtNiA6IC00KSArXHJcbiAgICAgICctJyArIGx6KGQuZ2V0VVRDTW9udGgoKSArIDEpICsgJy0nICsgbHooZC5nZXRVVENEYXRlKCkpICtcclxuICAgICAgJ1QnICsgbHooZC5nZXRVVENIb3VycygpKSArICc6JyArIGx6KGQuZ2V0VVRDTWludXRlcygpKSArXHJcbiAgICAgICc6JyArIGx6KGQuZ2V0VVRDU2Vjb25kcygpKSArICcuJyArIChtID4gOTkgPyBtIDogJzAnICsgbHoobSkpICsgJ1onO1xyXG4gIH1cclxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LmRhdGUudG8taXNvLXN0cmluZy5qc1xuICoqIG1vZHVsZSBpZCA9IDE1NFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwidmFyIERhdGVQcm90byAgICA9IERhdGUucHJvdG90eXBlXG4gICwgSU5WQUxJRF9EQVRFID0gJ0ludmFsaWQgRGF0ZSdcbiAgLCBUT19TVFJJTkcgICAgPSAndG9TdHJpbmcnXG4gICwgJHRvU3RyaW5nICAgID0gRGF0ZVByb3RvW1RPX1NUUklOR11cbiAgLCBnZXRUaW1lICAgICAgPSBEYXRlUHJvdG8uZ2V0VGltZTtcbmlmKG5ldyBEYXRlKE5hTikgKyAnJyAhPSBJTlZBTElEX0RBVEUpe1xuICByZXF1aXJlKCcuL19yZWRlZmluZScpKERhdGVQcm90bywgVE9fU1RSSU5HLCBmdW5jdGlvbiB0b1N0cmluZygpe1xuICAgIHZhciB2YWx1ZSA9IGdldFRpbWUuY2FsbCh0aGlzKTtcbiAgICByZXR1cm4gdmFsdWUgPT09IHZhbHVlID8gJHRvU3RyaW5nLmNhbGwodGhpcykgOiBJTlZBTElEX0RBVEU7XG4gIH0pO1xufVxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5kYXRlLnRvLXN0cmluZy5qc1xuICoqIG1vZHVsZSBpZCA9IDE1NVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwidmFyIFRPX1BSSU1JVElWRSA9IHJlcXVpcmUoJy4vX3drcycpKCd0b1ByaW1pdGl2ZScpXHJcbiAgLCBwcm90byAgICAgICAgPSBEYXRlLnByb3RvdHlwZTtcclxuXHJcbmlmKCEoVE9fUFJJTUlUSVZFIGluIHByb3RvKSlyZXF1aXJlKCcuL19oaWRlJykocHJvdG8sIFRPX1BSSU1JVElWRSwgcmVxdWlyZSgnLi9fZGF0ZS10by1wcmltaXRpdmUnKSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LmRhdGUudG8tcHJpbWl0aXZlLmpzXG4gKiogbW9kdWxlIGlkID0gMTU2XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XHJcbnZhciBhbk9iamVjdCAgICA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpXHJcbiAgLCB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4vX3RvLXByaW1pdGl2ZScpXHJcbiAgLCBOVU1CRVIgICAgICA9ICdudW1iZXInO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihoaW50KXtcclxuICBpZihoaW50ICE9PSAnc3RyaW5nJyAmJiBoaW50ICE9PSBOVU1CRVIgJiYgaGludCAhPT0gJ2RlZmF1bHQnKXRocm93IFR5cGVFcnJvcignSW5jb3JyZWN0IGhpbnQnKTtcclxuICByZXR1cm4gdG9QcmltaXRpdmUoYW5PYmplY3QodGhpcyksIGhpbnQgIT0gTlVNQkVSKTtcclxufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fZGF0ZS10by1wcmltaXRpdmUuanNcbiAqKiBtb2R1bGUgaWQgPSAxNTdcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDIyLjEuMi4yIC8gMTUuNC4zLjIgQXJyYXkuaXNBcnJheShhcmcpXHJcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XHJcblxyXG4kZXhwb3J0KCRleHBvcnQuUywgJ0FycmF5Jywge2lzQXJyYXk6IHJlcXVpcmUoJy4vX2lzLWFycmF5Jyl9KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuaXMtYXJyYXkuanNcbiAqKiBtb2R1bGUgaWQgPSAxNThcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0JztcbnZhciBjdHggICAgICAgICA9IHJlcXVpcmUoJy4vX2N0eCcpXG4gICwgJGV4cG9ydCAgICAgPSByZXF1aXJlKCcuL19leHBvcnQnKVxuICAsIHRvT2JqZWN0ICAgID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0JylcbiAgLCBjYWxsICAgICAgICA9IHJlcXVpcmUoJy4vX2l0ZXItY2FsbCcpXG4gICwgaXNBcnJheUl0ZXIgPSByZXF1aXJlKCcuL19pcy1hcnJheS1pdGVyJylcbiAgLCB0b0xlbmd0aCAgICA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpXG4gICwgZ2V0SXRlckZuICAgPSByZXF1aXJlKCcuL2NvcmUuZ2V0LWl0ZXJhdG9yLW1ldGhvZCcpO1xuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhcmVxdWlyZSgnLi9faXRlci1kZXRlY3QnKShmdW5jdGlvbihpdGVyKXsgQXJyYXkuZnJvbShpdGVyKTsgfSksICdBcnJheScsIHtcbiAgLy8gMjIuMS4yLjEgQXJyYXkuZnJvbShhcnJheUxpa2UsIG1hcGZuID0gdW5kZWZpbmVkLCB0aGlzQXJnID0gdW5kZWZpbmVkKVxuICBmcm9tOiBmdW5jdGlvbiBmcm9tKGFycmF5TGlrZS8qLCBtYXBmbiA9IHVuZGVmaW5lZCwgdGhpc0FyZyA9IHVuZGVmaW5lZCovKXtcbiAgICB2YXIgTyAgICAgICA9IHRvT2JqZWN0KGFycmF5TGlrZSlcbiAgICAgICwgQyAgICAgICA9IHR5cGVvZiB0aGlzID09ICdmdW5jdGlvbicgPyB0aGlzIDogQXJyYXlcbiAgICAgICwgYUxlbiAgICA9IGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgICwgbWFwZm4gICA9IGFMZW4gPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkXG4gICAgICAsIG1hcHBpbmcgPSBtYXBmbiAhPT0gdW5kZWZpbmVkXG4gICAgICAsIGluZGV4ICAgPSAwXG4gICAgICAsIGl0ZXJGbiAgPSBnZXRJdGVyRm4oTylcbiAgICAgICwgbGVuZ3RoLCByZXN1bHQsIHN0ZXAsIGl0ZXJhdG9yO1xuICAgIGlmKG1hcHBpbmcpbWFwZm4gPSBjdHgobWFwZm4sIGFMZW4gPiAyID8gYXJndW1lbnRzWzJdIDogdW5kZWZpbmVkLCAyKTtcbiAgICAvLyBpZiBvYmplY3QgaXNuJ3QgaXRlcmFibGUgb3IgaXQncyBhcnJheSB3aXRoIGRlZmF1bHQgaXRlcmF0b3IgLSB1c2Ugc2ltcGxlIGNhc2VcbiAgICBpZihpdGVyRm4gIT0gdW5kZWZpbmVkICYmICEoQyA9PSBBcnJheSAmJiBpc0FycmF5SXRlcihpdGVyRm4pKSl7XG4gICAgICBmb3IoaXRlcmF0b3IgPSBpdGVyRm4uY2FsbChPKSwgcmVzdWx0ID0gbmV3IEM7ICEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZTsgaW5kZXgrKyl7XG4gICAgICAgIHJlc3VsdFtpbmRleF0gPSBtYXBwaW5nID8gY2FsbChpdGVyYXRvciwgbWFwZm4sIFtzdGVwLnZhbHVlLCBpbmRleF0sIHRydWUpIDogc3RlcC52YWx1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbGVuZ3RoID0gdG9MZW5ndGgoTy5sZW5ndGgpO1xuICAgICAgZm9yKHJlc3VsdCA9IG5ldyBDKGxlbmd0aCk7IGxlbmd0aCA+IGluZGV4OyBpbmRleCsrKXtcbiAgICAgICAgcmVzdWx0W2luZGV4XSA9IG1hcHBpbmcgPyBtYXBmbihPW2luZGV4XSwgaW5kZXgpIDogT1tpbmRleF07XG4gICAgICB9XG4gICAgfVxuICAgIHJlc3VsdC5sZW5ndGggPSBpbmRleDtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59KTtcblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5mcm9tLmpzXG4gKiogbW9kdWxlIGlkID0gMTU5XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyBjYWxsIHNvbWV0aGluZyBvbiBpdGVyYXRvciBzdGVwIHdpdGggc2FmZSBjbG9zaW5nIG9uIGVycm9yXG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXRlcmF0b3IsIGZuLCB2YWx1ZSwgZW50cmllcyl7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGVudHJpZXMgPyBmbihhbk9iamVjdCh2YWx1ZSlbMF0sIHZhbHVlWzFdKSA6IGZuKHZhbHVlKTtcbiAgLy8gNy40LjYgSXRlcmF0b3JDbG9zZShpdGVyYXRvciwgY29tcGxldGlvbilcbiAgfSBjYXRjaChlKXtcbiAgICB2YXIgcmV0ID0gaXRlcmF0b3JbJ3JldHVybiddO1xuICAgIGlmKHJldCAhPT0gdW5kZWZpbmVkKWFuT2JqZWN0KHJldC5jYWxsKGl0ZXJhdG9yKSk7XG4gICAgdGhyb3cgZTtcbiAgfVxufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9faXRlci1jYWxsLmpzXG4gKiogbW9kdWxlIGlkID0gMTYwXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyBjaGVjayBvbiBkZWZhdWx0IEFycmF5IGl0ZXJhdG9yXG52YXIgSXRlcmF0b3JzICA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpXG4gICwgSVRFUkFUT1IgICA9IHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpXG4gICwgQXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiBpdCAhPT0gdW5kZWZpbmVkICYmIChJdGVyYXRvcnMuQXJyYXkgPT09IGl0IHx8IEFycmF5UHJvdG9bSVRFUkFUT1JdID09PSBpdCk7XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19pcy1hcnJheS1pdGVyLmpzXG4gKiogbW9kdWxlIGlkID0gMTYxXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgY2xhc3NvZiAgID0gcmVxdWlyZSgnLi9fY2xhc3NvZicpXG4gICwgSVRFUkFUT1IgID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJylcbiAgLCBJdGVyYXRvcnMgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fY29yZScpLmdldEl0ZXJhdG9yTWV0aG9kID0gZnVuY3Rpb24oaXQpe1xuICBpZihpdCAhPSB1bmRlZmluZWQpcmV0dXJuIGl0W0lURVJBVE9SXVxuICAgIHx8IGl0WydAQGl0ZXJhdG9yJ11cbiAgICB8fCBJdGVyYXRvcnNbY2xhc3NvZihpdCldO1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9jb3JlLmdldC1pdGVyYXRvci1tZXRob2QuanNcbiAqKiBtb2R1bGUgaWQgPSAxNjJcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBJVEVSQVRPUiAgICAgPSByZXF1aXJlKCcuL193a3MnKSgnaXRlcmF0b3InKVxuICAsIFNBRkVfQ0xPU0lORyA9IGZhbHNlO1xuXG50cnkge1xuICB2YXIgcml0ZXIgPSBbN11bSVRFUkFUT1JdKCk7XG4gIHJpdGVyWydyZXR1cm4nXSA9IGZ1bmN0aW9uKCl7IFNBRkVfQ0xPU0lORyA9IHRydWU7IH07XG4gIEFycmF5LmZyb20ocml0ZXIsIGZ1bmN0aW9uKCl7IHRocm93IDI7IH0pO1xufSBjYXRjaChlKXsgLyogZW1wdHkgKi8gfVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGV4ZWMsIHNraXBDbG9zaW5nKXtcbiAgaWYoIXNraXBDbG9zaW5nICYmICFTQUZFX0NMT1NJTkcpcmV0dXJuIGZhbHNlO1xuICB2YXIgc2FmZSA9IGZhbHNlO1xuICB0cnkge1xuICAgIHZhciBhcnIgID0gWzddXG4gICAgICAsIGl0ZXIgPSBhcnJbSVRFUkFUT1JdKCk7XG4gICAgaXRlci5uZXh0ID0gZnVuY3Rpb24oKXsgc2FmZSA9IHRydWU7IH07XG4gICAgYXJyW0lURVJBVE9SXSA9IGZ1bmN0aW9uKCl7IHJldHVybiBpdGVyOyB9O1xuICAgIGV4ZWMoYXJyKTtcbiAgfSBjYXRjaChlKXsgLyogZW1wdHkgKi8gfVxuICByZXR1cm4gc2FmZTtcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2l0ZXItZGV0ZWN0LmpzXG4gKiogbW9kdWxlIGlkID0gMTYzXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4vLyBXZWJLaXQgQXJyYXkub2YgaXNuJ3QgZ2VuZXJpY1xuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiByZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uKCl7XG4gIGZ1bmN0aW9uIEYoKXt9XG4gIHJldHVybiAhKEFycmF5Lm9mLmNhbGwoRikgaW5zdGFuY2VvZiBGKTtcbn0pLCAnQXJyYXknLCB7XG4gIC8vIDIyLjEuMi4zIEFycmF5Lm9mKCAuLi5pdGVtcylcbiAgb2Y6IGZ1bmN0aW9uIG9mKC8qIC4uLmFyZ3MgKi8pe1xuICAgIHZhciBpbmRleCAgPSAwXG4gICAgICAsIGFMZW4gICA9IGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgICwgcmVzdWx0ID0gbmV3ICh0eXBlb2YgdGhpcyA9PSAnZnVuY3Rpb24nID8gdGhpcyA6IEFycmF5KShhTGVuKTtcbiAgICB3aGlsZShhTGVuID4gaW5kZXgpcmVzdWx0W2luZGV4XSA9IGFyZ3VtZW50c1tpbmRleCsrXTtcbiAgICByZXN1bHQubGVuZ3RoID0gYUxlbjtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkub2YuanNcbiAqKiBtb2R1bGUgaWQgPSAxNjRcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0JztcclxuLy8gMjIuMS4zLjEzIEFycmF5LnByb3RvdHlwZS5qb2luKHNlcGFyYXRvcilcclxudmFyICRleHBvcnQgICA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXHJcbiAgLCB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0JylcclxuICAsIGFycmF5Sm9pbiA9IFtdLmpvaW47XHJcblxyXG4vLyBmYWxsYmFjayBmb3Igbm90IGFycmF5LWxpa2Ugc3RyaW5nc1xyXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIChyZXF1aXJlKCcuL19pb2JqZWN0JykgIT0gT2JqZWN0IHx8ICFyZXF1aXJlKCcuL19zdHJpY3QtbWV0aG9kJykoYXJyYXlKb2luKSksICdBcnJheScsIHtcclxuICBqb2luOiBmdW5jdGlvbiBqb2luKHNlcGFyYXRvcil7XHJcbiAgICByZXR1cm4gYXJyYXlKb2luLmNhbGwodG9JT2JqZWN0KHRoaXMpLCBzZXBhcmF0b3IgPT09IHVuZGVmaW5lZCA/ICcsJyA6IHNlcGFyYXRvcik7XHJcbiAgfVxyXG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuam9pbi5qc1xuICoqIG1vZHVsZSBpZCA9IDE2NVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwidmFyIGZhaWxzID0gcmVxdWlyZSgnLi9fZmFpbHMnKTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24obWV0aG9kLCBhcmcpe1xyXG4gIHJldHVybiAhIW1ldGhvZCAmJiBmYWlscyhmdW5jdGlvbigpe1xyXG4gICAgYXJnID8gbWV0aG9kLmNhbGwobnVsbCwgZnVuY3Rpb24oKXt9LCAxKSA6IG1ldGhvZC5jYWxsKG51bGwpO1xyXG4gIH0pO1xyXG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19zdHJpY3QtbWV0aG9kLmpzXG4gKiogbW9kdWxlIGlkID0gMTY2XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XHJcbnZhciAkZXhwb3J0ICAgID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcclxuICAsIGh0bWwgICAgICAgPSByZXF1aXJlKCcuL19odG1sJylcclxuICAsIGNvZiAgICAgICAgPSByZXF1aXJlKCcuL19jb2YnKVxyXG4gICwgdG9JbmRleCAgICA9IHJlcXVpcmUoJy4vX3RvLWluZGV4JylcclxuICAsIHRvTGVuZ3RoICAgPSByZXF1aXJlKCcuL190by1sZW5ndGgnKVxyXG4gICwgYXJyYXlTbGljZSA9IFtdLnNsaWNlO1xyXG5cclxuLy8gZmFsbGJhY2sgZm9yIG5vdCBhcnJheS1saWtlIEVTMyBzdHJpbmdzIGFuZCBET00gb2JqZWN0c1xyXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIHJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24oKXtcclxuICBpZihodG1sKWFycmF5U2xpY2UuY2FsbChodG1sKTtcclxufSksICdBcnJheScsIHtcclxuICBzbGljZTogZnVuY3Rpb24gc2xpY2UoYmVnaW4sIGVuZCl7XHJcbiAgICB2YXIgbGVuICAgPSB0b0xlbmd0aCh0aGlzLmxlbmd0aClcclxuICAgICAgLCBrbGFzcyA9IGNvZih0aGlzKTtcclxuICAgIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuIDogZW5kO1xyXG4gICAgaWYoa2xhc3MgPT0gJ0FycmF5JylyZXR1cm4gYXJyYXlTbGljZS5jYWxsKHRoaXMsIGJlZ2luLCBlbmQpO1xyXG4gICAgdmFyIHN0YXJ0ICA9IHRvSW5kZXgoYmVnaW4sIGxlbilcclxuICAgICAgLCB1cFRvICAgPSB0b0luZGV4KGVuZCwgbGVuKVxyXG4gICAgICAsIHNpemUgICA9IHRvTGVuZ3RoKHVwVG8gLSBzdGFydClcclxuICAgICAgLCBjbG9uZWQgPSBBcnJheShzaXplKVxyXG4gICAgICAsIGkgICAgICA9IDA7XHJcbiAgICBmb3IoOyBpIDwgc2l6ZTsgaSsrKWNsb25lZFtpXSA9IGtsYXNzID09ICdTdHJpbmcnXHJcbiAgICAgID8gdGhpcy5jaGFyQXQoc3RhcnQgKyBpKVxyXG4gICAgICA6IHRoaXNbc3RhcnQgKyBpXTtcclxuICAgIHJldHVybiBjbG9uZWQ7XHJcbiAgfVxyXG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuc2xpY2UuanNcbiAqKiBtb2R1bGUgaWQgPSAxNjdcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0JztcclxudmFyICRleHBvcnQgICA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXHJcbiAgLCBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJylcclxuICAsIHRvT2JqZWN0ICA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpXHJcbiAgLCBmYWlscyAgICAgPSByZXF1aXJlKCcuL19mYWlscycpXHJcbiAgLCAkc29ydCAgICAgPSBbXS5zb3J0XHJcbiAgLCB0ZXN0ICAgICAgPSBbMSwgMiwgM107XHJcblxyXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIChmYWlscyhmdW5jdGlvbigpe1xyXG4gIC8vIElFOC1cclxuICB0ZXN0LnNvcnQodW5kZWZpbmVkKTtcclxufSkgfHwgIWZhaWxzKGZ1bmN0aW9uKCl7XHJcbiAgLy8gVjggYnVnXHJcbiAgdGVzdC5zb3J0KG51bGwpO1xyXG4gIC8vIE9sZCBXZWJLaXRcclxufSkgfHwgIXJlcXVpcmUoJy4vX3N0cmljdC1tZXRob2QnKSgkc29ydCkpLCAnQXJyYXknLCB7XHJcbiAgLy8gMjIuMS4zLjI1IEFycmF5LnByb3RvdHlwZS5zb3J0KGNvbXBhcmVmbilcclxuICBzb3J0OiBmdW5jdGlvbiBzb3J0KGNvbXBhcmVmbil7XHJcbiAgICByZXR1cm4gY29tcGFyZWZuID09PSB1bmRlZmluZWRcclxuICAgICAgPyAkc29ydC5jYWxsKHRvT2JqZWN0KHRoaXMpKVxyXG4gICAgICA6ICRzb3J0LmNhbGwodG9PYmplY3QodGhpcyksIGFGdW5jdGlvbihjb21wYXJlZm4pKTtcclxuICB9XHJcbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5zb3J0LmpzXG4gKiogbW9kdWxlIGlkID0gMTY4XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XHJcbnZhciAkZXhwb3J0ICA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXHJcbiAgLCAkZm9yRWFjaCA9IHJlcXVpcmUoJy4vX2FycmF5LW1ldGhvZHMnKSgwKVxyXG4gICwgU1RSSUNUICAgPSByZXF1aXJlKCcuL19zdHJpY3QtbWV0aG9kJykoW10uZm9yRWFjaCwgdHJ1ZSk7XHJcblxyXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqICFTVFJJQ1QsICdBcnJheScsIHtcclxuICAvLyAyMi4xLjMuMTAgLyAxNS40LjQuMTggQXJyYXkucHJvdG90eXBlLmZvckVhY2goY2FsbGJhY2tmbiBbLCB0aGlzQXJnXSlcclxuICBmb3JFYWNoOiBmdW5jdGlvbiBmb3JFYWNoKGNhbGxiYWNrZm4gLyogLCB0aGlzQXJnICovKXtcclxuICAgIHJldHVybiAkZm9yRWFjaCh0aGlzLCBjYWxsYmFja2ZuLCBhcmd1bWVudHNbMV0pO1xyXG4gIH1cclxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LmZvci1lYWNoLmpzXG4gKiogbW9kdWxlIGlkID0gMTY5XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyAwIC0+IEFycmF5I2ZvckVhY2hcbi8vIDEgLT4gQXJyYXkjbWFwXG4vLyAyIC0+IEFycmF5I2ZpbHRlclxuLy8gMyAtPiBBcnJheSNzb21lXG4vLyA0IC0+IEFycmF5I2V2ZXJ5XG4vLyA1IC0+IEFycmF5I2ZpbmRcbi8vIDYgLT4gQXJyYXkjZmluZEluZGV4XG52YXIgY3R4ICAgICAgPSByZXF1aXJlKCcuL19jdHgnKVxuICAsIElPYmplY3QgID0gcmVxdWlyZSgnLi9faW9iamVjdCcpXG4gICwgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKVxuICAsIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJylcbiAgLCBhc2MgICAgICA9IHJlcXVpcmUoJy4vX2FycmF5LXNwZWNpZXMtY3JlYXRlJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKFRZUEUsICRjcmVhdGUpe1xuICB2YXIgSVNfTUFQICAgICAgICA9IFRZUEUgPT0gMVxuICAgICwgSVNfRklMVEVSICAgICA9IFRZUEUgPT0gMlxuICAgICwgSVNfU09NRSAgICAgICA9IFRZUEUgPT0gM1xuICAgICwgSVNfRVZFUlkgICAgICA9IFRZUEUgPT0gNFxuICAgICwgSVNfRklORF9JTkRFWCA9IFRZUEUgPT0gNlxuICAgICwgTk9fSE9MRVMgICAgICA9IFRZUEUgPT0gNSB8fCBJU19GSU5EX0lOREVYXG4gICAgLCBjcmVhdGUgICAgICAgID0gJGNyZWF0ZSB8fCBhc2M7XG4gIHJldHVybiBmdW5jdGlvbigkdGhpcywgY2FsbGJhY2tmbiwgdGhhdCl7XG4gICAgdmFyIE8gICAgICA9IHRvT2JqZWN0KCR0aGlzKVxuICAgICAgLCBzZWxmICAgPSBJT2JqZWN0KE8pXG4gICAgICAsIGYgICAgICA9IGN0eChjYWxsYmFja2ZuLCB0aGF0LCAzKVxuICAgICAgLCBsZW5ndGggPSB0b0xlbmd0aChzZWxmLmxlbmd0aClcbiAgICAgICwgaW5kZXggID0gMFxuICAgICAgLCByZXN1bHQgPSBJU19NQVAgPyBjcmVhdGUoJHRoaXMsIGxlbmd0aCkgOiBJU19GSUxURVIgPyBjcmVhdGUoJHRoaXMsIDApIDogdW5kZWZpbmVkXG4gICAgICAsIHZhbCwgcmVzO1xuICAgIGZvcig7bGVuZ3RoID4gaW5kZXg7IGluZGV4KyspaWYoTk9fSE9MRVMgfHwgaW5kZXggaW4gc2VsZil7XG4gICAgICB2YWwgPSBzZWxmW2luZGV4XTtcbiAgICAgIHJlcyA9IGYodmFsLCBpbmRleCwgTyk7XG4gICAgICBpZihUWVBFKXtcbiAgICAgICAgaWYoSVNfTUFQKXJlc3VsdFtpbmRleF0gPSByZXM7ICAgICAgICAgICAgLy8gbWFwXG4gICAgICAgIGVsc2UgaWYocmVzKXN3aXRjaChUWVBFKXtcbiAgICAgICAgICBjYXNlIDM6IHJldHVybiB0cnVlOyAgICAgICAgICAgICAgICAgICAgLy8gc29tZVxuICAgICAgICAgIGNhc2UgNTogcmV0dXJuIHZhbDsgICAgICAgICAgICAgICAgICAgICAvLyBmaW5kXG4gICAgICAgICAgY2FzZSA2OiByZXR1cm4gaW5kZXg7ICAgICAgICAgICAgICAgICAgIC8vIGZpbmRJbmRleFxuICAgICAgICAgIGNhc2UgMjogcmVzdWx0LnB1c2godmFsKTsgICAgICAgICAgICAgICAvLyBmaWx0ZXJcbiAgICAgICAgfSBlbHNlIGlmKElTX0VWRVJZKXJldHVybiBmYWxzZTsgICAgICAgICAgLy8gZXZlcnlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIElTX0ZJTkRfSU5ERVggPyAtMSA6IElTX1NPTUUgfHwgSVNfRVZFUlkgPyBJU19FVkVSWSA6IHJlc3VsdDtcbiAgfTtcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2FycmF5LW1ldGhvZHMuanNcbiAqKiBtb2R1bGUgaWQgPSAxNzBcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDkuNC4yLjMgQXJyYXlTcGVjaWVzQ3JlYXRlKG9yaWdpbmFsQXJyYXksIGxlbmd0aClcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpXG4gICwgaXNBcnJheSAgPSByZXF1aXJlKCcuL19pcy1hcnJheScpXG4gICwgU1BFQ0lFUyAgPSByZXF1aXJlKCcuL193a3MnKSgnc3BlY2llcycpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihvcmlnaW5hbCwgbGVuZ3RoKXtcbiAgdmFyIEM7XG4gIGlmKGlzQXJyYXkob3JpZ2luYWwpKXtcbiAgICBDID0gb3JpZ2luYWwuY29uc3RydWN0b3I7XG4gICAgLy8gY3Jvc3MtcmVhbG0gZmFsbGJhY2tcbiAgICBpZih0eXBlb2YgQyA9PSAnZnVuY3Rpb24nICYmIChDID09PSBBcnJheSB8fCBpc0FycmF5KEMucHJvdG90eXBlKSkpQyA9IHVuZGVmaW5lZDtcbiAgICBpZihpc09iamVjdChDKSl7XG4gICAgICBDID0gQ1tTUEVDSUVTXTtcbiAgICAgIGlmKEMgPT09IG51bGwpQyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH0gcmV0dXJuIG5ldyAoQyA9PT0gdW5kZWZpbmVkID8gQXJyYXkgOiBDKShsZW5ndGgpO1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fYXJyYXktc3BlY2llcy1jcmVhdGUuanNcbiAqKiBtb2R1bGUgaWQgPSAxNzFcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0JztcclxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKVxyXG4gICwgJG1hcCAgICA9IHJlcXVpcmUoJy4vX2FycmF5LW1ldGhvZHMnKSgxKTtcclxuXHJcbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogIXJlcXVpcmUoJy4vX3N0cmljdC1tZXRob2QnKShbXS5tYXAsIHRydWUpLCAnQXJyYXknLCB7XHJcbiAgLy8gMjIuMS4zLjE1IC8gMTUuNC40LjE5IEFycmF5LnByb3RvdHlwZS5tYXAoY2FsbGJhY2tmbiBbLCB0aGlzQXJnXSlcclxuICBtYXA6IGZ1bmN0aW9uIG1hcChjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLyl7XHJcbiAgICByZXR1cm4gJG1hcCh0aGlzLCBjYWxsYmFja2ZuLCBhcmd1bWVudHNbMV0pO1xyXG4gIH1cclxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5Lm1hcC5qc1xuICoqIG1vZHVsZSBpZCA9IDE3MlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xyXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXHJcbiAgLCAkZmlsdGVyID0gcmVxdWlyZSgnLi9fYXJyYXktbWV0aG9kcycpKDIpO1xyXG5cclxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAhcmVxdWlyZSgnLi9fc3RyaWN0LW1ldGhvZCcpKFtdLmZpbHRlciwgdHJ1ZSksICdBcnJheScsIHtcclxuICAvLyAyMi4xLjMuNyAvIDE1LjQuNC4yMCBBcnJheS5wcm90b3R5cGUuZmlsdGVyKGNhbGxiYWNrZm4gWywgdGhpc0FyZ10pXHJcbiAgZmlsdGVyOiBmdW5jdGlvbiBmaWx0ZXIoY2FsbGJhY2tmbiAvKiAsIHRoaXNBcmcgKi8pe1xyXG4gICAgcmV0dXJuICRmaWx0ZXIodGhpcywgY2FsbGJhY2tmbiwgYXJndW1lbnRzWzFdKTtcclxuICB9XHJcbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5maWx0ZXIuanNcbiAqKiBtb2R1bGUgaWQgPSAxNzNcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0JztcclxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKVxyXG4gICwgJHNvbWUgICA9IHJlcXVpcmUoJy4vX2FycmF5LW1ldGhvZHMnKSgzKTtcclxuXHJcbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogIXJlcXVpcmUoJy4vX3N0cmljdC1tZXRob2QnKShbXS5zb21lLCB0cnVlKSwgJ0FycmF5Jywge1xyXG4gIC8vIDIyLjEuMy4yMyAvIDE1LjQuNC4xNyBBcnJheS5wcm90b3R5cGUuc29tZShjYWxsYmFja2ZuIFssIHRoaXNBcmddKVxyXG4gIHNvbWU6IGZ1bmN0aW9uIHNvbWUoY2FsbGJhY2tmbiAvKiAsIHRoaXNBcmcgKi8pe1xyXG4gICAgcmV0dXJuICRzb21lKHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50c1sxXSk7XHJcbiAgfVxyXG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuc29tZS5qc1xuICoqIG1vZHVsZSBpZCA9IDE3NFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xyXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXHJcbiAgLCAkZXZlcnkgID0gcmVxdWlyZSgnLi9fYXJyYXktbWV0aG9kcycpKDQpO1xyXG5cclxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAhcmVxdWlyZSgnLi9fc3RyaWN0LW1ldGhvZCcpKFtdLmV2ZXJ5LCB0cnVlKSwgJ0FycmF5Jywge1xyXG4gIC8vIDIyLjEuMy41IC8gMTUuNC40LjE2IEFycmF5LnByb3RvdHlwZS5ldmVyeShjYWxsYmFja2ZuIFssIHRoaXNBcmddKVxyXG4gIGV2ZXJ5OiBmdW5jdGlvbiBldmVyeShjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLyl7XHJcbiAgICByZXR1cm4gJGV2ZXJ5KHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50c1sxXSk7XHJcbiAgfVxyXG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuZXZlcnkuanNcbiAqKiBtb2R1bGUgaWQgPSAxNzVcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0JztcclxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKVxyXG4gICwgJHJlZHVjZSA9IHJlcXVpcmUoJy4vX2FycmF5LXJlZHVjZScpO1xyXG5cclxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAhcmVxdWlyZSgnLi9fc3RyaWN0LW1ldGhvZCcpKFtdLnJlZHVjZSwgdHJ1ZSksICdBcnJheScsIHtcclxuICAvLyAyMi4xLjMuMTggLyAxNS40LjQuMjEgQXJyYXkucHJvdG90eXBlLnJlZHVjZShjYWxsYmFja2ZuIFssIGluaXRpYWxWYWx1ZV0pXHJcbiAgcmVkdWNlOiBmdW5jdGlvbiByZWR1Y2UoY2FsbGJhY2tmbiAvKiAsIGluaXRpYWxWYWx1ZSAqLyl7XHJcbiAgICByZXR1cm4gJHJlZHVjZSh0aGlzLCBjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoLCBhcmd1bWVudHNbMV0sIGZhbHNlKTtcclxuICB9XHJcbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5yZWR1Y2UuanNcbiAqKiBtb2R1bGUgaWQgPSAxNzZcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJylcclxuICAsIHRvT2JqZWN0ICA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpXHJcbiAgLCBJT2JqZWN0ICAgPSByZXF1aXJlKCcuL19pb2JqZWN0JylcclxuICAsIHRvTGVuZ3RoICA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbih0aGF0LCBjYWxsYmFja2ZuLCBhTGVuLCBtZW1vLCBpc1JpZ2h0KXtcclxuICBhRnVuY3Rpb24oY2FsbGJhY2tmbik7XHJcbiAgdmFyIE8gICAgICA9IHRvT2JqZWN0KHRoYXQpXHJcbiAgICAsIHNlbGYgICA9IElPYmplY3QoTylcclxuICAgICwgbGVuZ3RoID0gdG9MZW5ndGgoTy5sZW5ndGgpXHJcbiAgICAsIGluZGV4ICA9IGlzUmlnaHQgPyBsZW5ndGggLSAxIDogMFxyXG4gICAgLCBpICAgICAgPSBpc1JpZ2h0ID8gLTEgOiAxO1xyXG4gIGlmKGFMZW4gPCAyKWZvcig7Oyl7XHJcbiAgICBpZihpbmRleCBpbiBzZWxmKXtcclxuICAgICAgbWVtbyA9IHNlbGZbaW5kZXhdO1xyXG4gICAgICBpbmRleCArPSBpO1xyXG4gICAgICBicmVhaztcclxuICAgIH1cclxuICAgIGluZGV4ICs9IGk7XHJcbiAgICBpZihpc1JpZ2h0ID8gaW5kZXggPCAwIDogbGVuZ3RoIDw9IGluZGV4KXtcclxuICAgICAgdGhyb3cgVHlwZUVycm9yKCdSZWR1Y2Ugb2YgZW1wdHkgYXJyYXkgd2l0aCBubyBpbml0aWFsIHZhbHVlJyk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGZvcig7aXNSaWdodCA/IGluZGV4ID49IDAgOiBsZW5ndGggPiBpbmRleDsgaW5kZXggKz0gaSlpZihpbmRleCBpbiBzZWxmKXtcclxuICAgIG1lbW8gPSBjYWxsYmFja2ZuKG1lbW8sIHNlbGZbaW5kZXhdLCBpbmRleCwgTyk7XHJcbiAgfVxyXG4gIHJldHVybiBtZW1vO1xyXG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19hcnJheS1yZWR1Y2UuanNcbiAqKiBtb2R1bGUgaWQgPSAxNzdcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0JztcclxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKVxyXG4gICwgJHJlZHVjZSA9IHJlcXVpcmUoJy4vX2FycmF5LXJlZHVjZScpO1xyXG5cclxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAhcmVxdWlyZSgnLi9fc3RyaWN0LW1ldGhvZCcpKFtdLnJlZHVjZVJpZ2h0LCB0cnVlKSwgJ0FycmF5Jywge1xyXG4gIC8vIDIyLjEuMy4xOSAvIDE1LjQuNC4yMiBBcnJheS5wcm90b3R5cGUucmVkdWNlUmlnaHQoY2FsbGJhY2tmbiBbLCBpbml0aWFsVmFsdWVdKVxyXG4gIHJlZHVjZVJpZ2h0OiBmdW5jdGlvbiByZWR1Y2VSaWdodChjYWxsYmFja2ZuIC8qICwgaW5pdGlhbFZhbHVlICovKXtcclxuICAgIHJldHVybiAkcmVkdWNlKHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3VtZW50c1sxXSwgdHJ1ZSk7XHJcbiAgfVxyXG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkucmVkdWNlLXJpZ2h0LmpzXG4gKiogbW9kdWxlIGlkID0gMTc4XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XHJcbnZhciAkZXhwb3J0ICA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXHJcbiAgLCAkaW5kZXhPZiA9IHJlcXVpcmUoJy4vX2FycmF5LWluY2x1ZGVzJykoZmFsc2UpO1xyXG5cclxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAhcmVxdWlyZSgnLi9fc3RyaWN0LW1ldGhvZCcpKFtdLmluZGV4T2YpLCAnQXJyYXknLCB7XHJcbiAgLy8gMjIuMS4zLjExIC8gMTUuNC40LjE0IEFycmF5LnByb3RvdHlwZS5pbmRleE9mKHNlYXJjaEVsZW1lbnQgWywgZnJvbUluZGV4XSlcclxuICBpbmRleE9mOiBmdW5jdGlvbiBpbmRleE9mKHNlYXJjaEVsZW1lbnQgLyosIGZyb21JbmRleCA9IDAgKi8pe1xyXG4gICAgcmV0dXJuICRpbmRleE9mKHRoaXMsIHNlYXJjaEVsZW1lbnQsIGFyZ3VtZW50c1sxXSk7XHJcbiAgfVxyXG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuaW5kZXgtb2YuanNcbiAqKiBtb2R1bGUgaWQgPSAxNzlcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0JztcclxudmFyICRleHBvcnQgICA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXHJcbiAgLCB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0JylcclxuICAsIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4vX3RvLWludGVnZXInKVxyXG4gICwgdG9MZW5ndGggID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XHJcblxyXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqICFyZXF1aXJlKCcuL19zdHJpY3QtbWV0aG9kJykoW10ubGFzdEluZGV4T2YpLCAnQXJyYXknLCB7XHJcbiAgLy8gMjIuMS4zLjE0IC8gMTUuNC40LjE1IEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZihzZWFyY2hFbGVtZW50IFssIGZyb21JbmRleF0pXHJcbiAgbGFzdEluZGV4T2Y6IGZ1bmN0aW9uIGxhc3RJbmRleE9mKHNlYXJjaEVsZW1lbnQgLyosIGZyb21JbmRleCA9IEBbKi0xXSAqLyl7XHJcbiAgICB2YXIgTyAgICAgID0gdG9JT2JqZWN0KHRoaXMpXHJcbiAgICAgICwgbGVuZ3RoID0gdG9MZW5ndGgoTy5sZW5ndGgpXHJcbiAgICAgICwgaW5kZXggID0gbGVuZ3RoIC0gMTtcclxuICAgIGlmKGFyZ3VtZW50cy5sZW5ndGggPiAxKWluZGV4ID0gTWF0aC5taW4oaW5kZXgsIHRvSW50ZWdlcihhcmd1bWVudHNbMV0pKTtcclxuICAgIGlmKGluZGV4IDwgMClpbmRleCA9IGxlbmd0aCArIGluZGV4O1xyXG4gICAgZm9yKDtpbmRleCA+PSAwOyBpbmRleC0tKWlmKGluZGV4IGluIE8paWYoT1tpbmRleF0gPT09IHNlYXJjaEVsZW1lbnQpcmV0dXJuIGluZGV4O1xyXG4gICAgcmV0dXJuIC0xO1xyXG4gIH1cclxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5Lmxhc3QtaW5kZXgtb2YuanNcbiAqKiBtb2R1bGUgaWQgPSAxODBcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDIyLjEuMy4zIEFycmF5LnByb3RvdHlwZS5jb3B5V2l0aGluKHRhcmdldCwgc3RhcnQsIGVuZCA9IHRoaXMubGVuZ3RoKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlAsICdBcnJheScsIHtjb3B5V2l0aGluOiByZXF1aXJlKCcuL19hcnJheS1jb3B5LXdpdGhpbicpfSk7XG5cbnJlcXVpcmUoJy4vX2FkZC10by11bnNjb3BhYmxlcycpKCdjb3B5V2l0aGluJyk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LmNvcHktd2l0aGluLmpzXG4gKiogbW9kdWxlIGlkID0gMTgxXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyAyMi4xLjMuMyBBcnJheS5wcm90b3R5cGUuY29weVdpdGhpbih0YXJnZXQsIHN0YXJ0LCBlbmQgPSB0aGlzLmxlbmd0aClcbid1c2Ugc3RyaWN0JztcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpXG4gICwgdG9JbmRleCAgPSByZXF1aXJlKCcuL190by1pbmRleCcpXG4gICwgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBbXS5jb3B5V2l0aGluIHx8IGZ1bmN0aW9uIGNvcHlXaXRoaW4odGFyZ2V0Lyo9IDAqLywgc3RhcnQvKj0gMCwgZW5kID0gQGxlbmd0aCovKXtcbiAgdmFyIE8gICAgID0gdG9PYmplY3QodGhpcylcbiAgICAsIGxlbiAgID0gdG9MZW5ndGgoTy5sZW5ndGgpXG4gICAgLCB0byAgICA9IHRvSW5kZXgodGFyZ2V0LCBsZW4pXG4gICAgLCBmcm9tICA9IHRvSW5kZXgoc3RhcnQsIGxlbilcbiAgICAsIGVuZCAgID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiB1bmRlZmluZWRcbiAgICAsIGNvdW50ID0gTWF0aC5taW4oKGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuIDogdG9JbmRleChlbmQsIGxlbikpIC0gZnJvbSwgbGVuIC0gdG8pXG4gICAgLCBpbmMgICA9IDE7XG4gIGlmKGZyb20gPCB0byAmJiB0byA8IGZyb20gKyBjb3VudCl7XG4gICAgaW5jICA9IC0xO1xuICAgIGZyb20gKz0gY291bnQgLSAxO1xuICAgIHRvICAgKz0gY291bnQgLSAxO1xuICB9XG4gIHdoaWxlKGNvdW50LS0gPiAwKXtcbiAgICBpZihmcm9tIGluIE8pT1t0b10gPSBPW2Zyb21dO1xuICAgIGVsc2UgZGVsZXRlIE9bdG9dO1xuICAgIHRvICAgKz0gaW5jO1xuICAgIGZyb20gKz0gaW5jO1xuICB9IHJldHVybiBPO1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fYXJyYXktY29weS13aXRoaW4uanNcbiAqKiBtb2R1bGUgaWQgPSAxODJcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDIyLjEuMy4zMSBBcnJheS5wcm90b3R5cGVbQEB1bnNjb3BhYmxlc11cbnZhciBVTlNDT1BBQkxFUyA9IHJlcXVpcmUoJy4vX3drcycpKCd1bnNjb3BhYmxlcycpXG4gICwgQXJyYXlQcm90byAgPSBBcnJheS5wcm90b3R5cGU7XG5pZihBcnJheVByb3RvW1VOU0NPUEFCTEVTXSA9PSB1bmRlZmluZWQpcmVxdWlyZSgnLi9faGlkZScpKEFycmF5UHJvdG8sIFVOU0NPUEFCTEVTLCB7fSk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGtleSl7XG4gIEFycmF5UHJvdG9bVU5TQ09QQUJMRVNdW2tleV0gPSB0cnVlO1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fYWRkLXRvLXVuc2NvcGFibGVzLmpzXG4gKiogbW9kdWxlIGlkID0gMTgzXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyAyMi4xLjMuNiBBcnJheS5wcm90b3R5cGUuZmlsbCh2YWx1ZSwgc3RhcnQgPSAwLCBlbmQgPSB0aGlzLmxlbmd0aClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QLCAnQXJyYXknLCB7ZmlsbDogcmVxdWlyZSgnLi9fYXJyYXktZmlsbCcpfSk7XG5cbnJlcXVpcmUoJy4vX2FkZC10by11bnNjb3BhYmxlcycpKCdmaWxsJyk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LmZpbGwuanNcbiAqKiBtb2R1bGUgaWQgPSAxODRcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDIyLjEuMy42IEFycmF5LnByb3RvdHlwZS5maWxsKHZhbHVlLCBzdGFydCA9IDAsIGVuZCA9IHRoaXMubGVuZ3RoKVxuJ3VzZSBzdHJpY3QnO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0JylcbiAgLCB0b0luZGV4ICA9IHJlcXVpcmUoJy4vX3RvLWluZGV4JylcbiAgLCB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBmaWxsKHZhbHVlIC8qLCBzdGFydCA9IDAsIGVuZCA9IEBsZW5ndGggKi8pe1xuICB2YXIgTyAgICAgID0gdG9PYmplY3QodGhpcylcbiAgICAsIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKVxuICAgICwgYUxlbiAgID0gYXJndW1lbnRzLmxlbmd0aFxuICAgICwgaW5kZXggID0gdG9JbmRleChhTGVuID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCwgbGVuZ3RoKVxuICAgICwgZW5kICAgID0gYUxlbiA+IDIgPyBhcmd1bWVudHNbMl0gOiB1bmRlZmluZWRcbiAgICAsIGVuZFBvcyA9IGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuZ3RoIDogdG9JbmRleChlbmQsIGxlbmd0aCk7XG4gIHdoaWxlKGVuZFBvcyA+IGluZGV4KU9baW5kZXgrK10gPSB2YWx1ZTtcbiAgcmV0dXJuIE87XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19hcnJheS1maWxsLmpzXG4gKiogbW9kdWxlIGlkID0gMTg1XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG4vLyAyMi4xLjMuOCBBcnJheS5wcm90b3R5cGUuZmluZChwcmVkaWNhdGUsIHRoaXNBcmcgPSB1bmRlZmluZWQpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICwgJGZpbmQgICA9IHJlcXVpcmUoJy4vX2FycmF5LW1ldGhvZHMnKSg1KVxuICAsIEtFWSAgICAgPSAnZmluZCdcbiAgLCBmb3JjZWQgID0gdHJ1ZTtcbi8vIFNob3VsZG4ndCBza2lwIGhvbGVzXG5pZihLRVkgaW4gW10pQXJyYXkoMSlbS0VZXShmdW5jdGlvbigpeyBmb3JjZWQgPSBmYWxzZTsgfSk7XG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIGZvcmNlZCwgJ0FycmF5Jywge1xuICBmaW5kOiBmdW5jdGlvbiBmaW5kKGNhbGxiYWNrZm4vKiwgdGhhdCA9IHVuZGVmaW5lZCAqLyl7XG4gICAgcmV0dXJuICRmaW5kKHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgfVxufSk7XG5yZXF1aXJlKCcuL19hZGQtdG8tdW5zY29wYWJsZXMnKShLRVkpO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5maW5kLmpzXG4gKiogbW9kdWxlIGlkID0gMTg2XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG4vLyAyMi4xLjMuOSBBcnJheS5wcm90b3R5cGUuZmluZEluZGV4KHByZWRpY2F0ZSwgdGhpc0FyZyA9IHVuZGVmaW5lZClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCAkZmluZCAgID0gcmVxdWlyZSgnLi9fYXJyYXktbWV0aG9kcycpKDYpXG4gICwgS0VZICAgICA9ICdmaW5kSW5kZXgnXG4gICwgZm9yY2VkICA9IHRydWU7XG4vLyBTaG91bGRuJ3Qgc2tpcCBob2xlc1xuaWYoS0VZIGluIFtdKUFycmF5KDEpW0tFWV0oZnVuY3Rpb24oKXsgZm9yY2VkID0gZmFsc2U7IH0pO1xuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiBmb3JjZWQsICdBcnJheScsIHtcbiAgZmluZEluZGV4OiBmdW5jdGlvbiBmaW5kSW5kZXgoY2FsbGJhY2tmbi8qLCB0aGF0ID0gdW5kZWZpbmVkICovKXtcbiAgICByZXR1cm4gJGZpbmQodGhpcywgY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICB9XG59KTtcbnJlcXVpcmUoJy4vX2FkZC10by11bnNjb3BhYmxlcycpKEtFWSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LmZpbmQtaW5kZXguanNcbiAqKiBtb2R1bGUgaWQgPSAxODdcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInJlcXVpcmUoJy4vX3NldC1zcGVjaWVzJykoJ0FycmF5Jyk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LnNwZWNpZXMuanNcbiAqKiBtb2R1bGUgaWQgPSAxODhcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0JztcbnZhciBnbG9iYWwgICAgICA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpXG4gICwgZFAgICAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKVxuICAsIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKVxuICAsIFNQRUNJRVMgICAgID0gcmVxdWlyZSgnLi9fd2tzJykoJ3NwZWNpZXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihLRVkpe1xuICB2YXIgQyA9IGdsb2JhbFtLRVldO1xuICBpZihERVNDUklQVE9SUyAmJiBDICYmICFDW1NQRUNJRVNdKWRQLmYoQywgU1BFQ0lFUywge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGZ1bmN0aW9uKCl7IHJldHVybiB0aGlzOyB9XG4gIH0pO1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fc2V0LXNwZWNpZXMuanNcbiAqKiBtb2R1bGUgaWQgPSAxODlcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0JztcbnZhciBhZGRUb1Vuc2NvcGFibGVzID0gcmVxdWlyZSgnLi9fYWRkLXRvLXVuc2NvcGFibGVzJylcbiAgLCBzdGVwICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9faXRlci1zdGVwJylcbiAgLCBJdGVyYXRvcnMgICAgICAgID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJylcbiAgLCB0b0lPYmplY3QgICAgICAgID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xuXG4vLyAyMi4xLjMuNCBBcnJheS5wcm90b3R5cGUuZW50cmllcygpXG4vLyAyMi4xLjMuMTMgQXJyYXkucHJvdG90eXBlLmtleXMoKVxuLy8gMjIuMS4zLjI5IEFycmF5LnByb3RvdHlwZS52YWx1ZXMoKVxuLy8gMjIuMS4zLjMwIEFycmF5LnByb3RvdHlwZVtAQGl0ZXJhdG9yXSgpXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2l0ZXItZGVmaW5lJykoQXJyYXksICdBcnJheScsIGZ1bmN0aW9uKGl0ZXJhdGVkLCBraW5kKXtcbiAgdGhpcy5fdCA9IHRvSU9iamVjdChpdGVyYXRlZCk7IC8vIHRhcmdldFxuICB0aGlzLl9pID0gMDsgICAgICAgICAgICAgICAgICAgLy8gbmV4dCBpbmRleFxuICB0aGlzLl9rID0ga2luZDsgICAgICAgICAgICAgICAgLy8ga2luZFxuLy8gMjIuMS41LjIuMSAlQXJyYXlJdGVyYXRvclByb3RvdHlwZSUubmV4dCgpXG59LCBmdW5jdGlvbigpe1xuICB2YXIgTyAgICAgPSB0aGlzLl90XG4gICAgLCBraW5kICA9IHRoaXMuX2tcbiAgICAsIGluZGV4ID0gdGhpcy5faSsrO1xuICBpZighTyB8fCBpbmRleCA+PSBPLmxlbmd0aCl7XG4gICAgdGhpcy5fdCA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gc3RlcCgxKTtcbiAgfVxuICBpZihraW5kID09ICdrZXlzJyAgKXJldHVybiBzdGVwKDAsIGluZGV4KTtcbiAgaWYoa2luZCA9PSAndmFsdWVzJylyZXR1cm4gc3RlcCgwLCBPW2luZGV4XSk7XG4gIHJldHVybiBzdGVwKDAsIFtpbmRleCwgT1tpbmRleF1dKTtcbn0sICd2YWx1ZXMnKTtcblxuLy8gYXJndW1lbnRzTGlzdFtAQGl0ZXJhdG9yXSBpcyAlQXJyYXlQcm90b192YWx1ZXMlICg5LjQuNC42LCA5LjQuNC43KVxuSXRlcmF0b3JzLkFyZ3VtZW50cyA9IEl0ZXJhdG9ycy5BcnJheTtcblxuYWRkVG9VbnNjb3BhYmxlcygna2V5cycpO1xuYWRkVG9VbnNjb3BhYmxlcygndmFsdWVzJyk7XG5hZGRUb1Vuc2NvcGFibGVzKCdlbnRyaWVzJyk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5Lml0ZXJhdG9yLmpzXG4gKiogbW9kdWxlIGlkID0gMTkwXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGRvbmUsIHZhbHVlKXtcbiAgcmV0dXJuIHt2YWx1ZTogdmFsdWUsIGRvbmU6ICEhZG9uZX07XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19pdGVyLXN0ZXAuanNcbiAqKiBtb2R1bGUgaWQgPSAxOTFcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBnbG9iYWwgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpXG4gICwgaW5oZXJpdElmUmVxdWlyZWQgPSByZXF1aXJlKCcuL19pbmhlcml0LWlmLXJlcXVpcmVkJylcbiAgLCBkUCAgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpLmZcbiAgLCBnT1BOICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BuJykuZlxuICAsIGlzUmVnRXhwICAgICAgICAgID0gcmVxdWlyZSgnLi9faXMtcmVnZXhwJylcbiAgLCAkZmxhZ3MgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2ZsYWdzJylcbiAgLCAkUmVnRXhwICAgICAgICAgICA9IGdsb2JhbC5SZWdFeHBcbiAgLCBCYXNlICAgICAgICAgICAgICA9ICRSZWdFeHBcbiAgLCBwcm90byAgICAgICAgICAgICA9ICRSZWdFeHAucHJvdG90eXBlXG4gICwgcmUxICAgICAgICAgICAgICAgPSAvYS9nXG4gICwgcmUyICAgICAgICAgICAgICAgPSAvYS9nXG4gIC8vIFwibmV3XCIgY3JlYXRlcyBhIG5ldyBvYmplY3QsIG9sZCB3ZWJraXQgYnVnZ3kgaGVyZVxuICAsIENPUlJFQ1RfTkVXICAgICAgID0gbmV3ICRSZWdFeHAocmUxKSAhPT0gcmUxO1xuXG5pZihyZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpICYmICghQ09SUkVDVF9ORVcgfHwgcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbigpe1xuICByZTJbcmVxdWlyZSgnLi9fd2tzJykoJ21hdGNoJyldID0gZmFsc2U7XG4gIC8vIFJlZ0V4cCBjb25zdHJ1Y3RvciBjYW4gYWx0ZXIgZmxhZ3MgYW5kIElzUmVnRXhwIHdvcmtzIGNvcnJlY3Qgd2l0aCBAQG1hdGNoXG4gIHJldHVybiAkUmVnRXhwKHJlMSkgIT0gcmUxIHx8ICRSZWdFeHAocmUyKSA9PSByZTIgfHwgJFJlZ0V4cChyZTEsICdpJykgIT0gJy9hL2knO1xufSkpKXtcbiAgJFJlZ0V4cCA9IGZ1bmN0aW9uIFJlZ0V4cChwLCBmKXtcbiAgICB2YXIgdGlSRSA9IHRoaXMgaW5zdGFuY2VvZiAkUmVnRXhwXG4gICAgICAsIHBpUkUgPSBpc1JlZ0V4cChwKVxuICAgICAgLCBmaVUgID0gZiA9PT0gdW5kZWZpbmVkO1xuICAgIHJldHVybiAhdGlSRSAmJiBwaVJFICYmIHAuY29uc3RydWN0b3IgPT09ICRSZWdFeHAgJiYgZmlVID8gcFxuICAgICAgOiBpbmhlcml0SWZSZXF1aXJlZChDT1JSRUNUX05FV1xuICAgICAgICA/IG5ldyBCYXNlKHBpUkUgJiYgIWZpVSA/IHAuc291cmNlIDogcCwgZilcbiAgICAgICAgOiBCYXNlKChwaVJFID0gcCBpbnN0YW5jZW9mICRSZWdFeHApID8gcC5zb3VyY2UgOiBwLCBwaVJFICYmIGZpVSA/ICRmbGFncy5jYWxsKHApIDogZilcbiAgICAgICwgdGlSRSA/IHRoaXMgOiBwcm90bywgJFJlZ0V4cCk7XG4gIH07XG4gIHZhciBwcm94eSA9IGZ1bmN0aW9uKGtleSl7XG4gICAga2V5IGluICRSZWdFeHAgfHwgZFAoJFJlZ0V4cCwga2V5LCB7XG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBnZXQ6IGZ1bmN0aW9uKCl7IHJldHVybiBCYXNlW2tleV07IH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uKGl0KXsgQmFzZVtrZXldID0gaXQ7IH1cbiAgICB9KTtcbiAgfTtcbiAgZm9yKHZhciBrZXlzID0gZ09QTihCYXNlKSwgaSA9IDA7IGtleXMubGVuZ3RoID4gaTsgKXByb3h5KGtleXNbaSsrXSk7XG4gIHByb3RvLmNvbnN0cnVjdG9yID0gJFJlZ0V4cDtcbiAgJFJlZ0V4cC5wcm90b3R5cGUgPSBwcm90bztcbiAgcmVxdWlyZSgnLi9fcmVkZWZpbmUnKShnbG9iYWwsICdSZWdFeHAnLCAkUmVnRXhwKTtcbn1cblxucmVxdWlyZSgnLi9fc2V0LXNwZWNpZXMnKSgnUmVnRXhwJyk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZ2V4cC5jb25zdHJ1Y3Rvci5qc1xuICoqIG1vZHVsZSBpZCA9IDE5MlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xuLy8gMjEuMi41LjMgZ2V0IFJlZ0V4cC5wcm90b3R5cGUuZmxhZ3NcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpe1xuICB2YXIgdGhhdCAgID0gYW5PYmplY3QodGhpcylcbiAgICAsIHJlc3VsdCA9ICcnO1xuICBpZih0aGF0Lmdsb2JhbCkgICAgIHJlc3VsdCArPSAnZyc7XG4gIGlmKHRoYXQuaWdub3JlQ2FzZSkgcmVzdWx0ICs9ICdpJztcbiAgaWYodGhhdC5tdWx0aWxpbmUpICByZXN1bHQgKz0gJ20nO1xuICBpZih0aGF0LnVuaWNvZGUpICAgIHJlc3VsdCArPSAndSc7XG4gIGlmKHRoYXQuc3RpY2t5KSAgICAgcmVzdWx0ICs9ICd5JztcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2ZsYWdzLmpzXG4gKiogbW9kdWxlIGlkID0gMTkzXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XHJcbnJlcXVpcmUoJy4vZXM2LnJlZ2V4cC5mbGFncycpO1xyXG52YXIgYW5PYmplY3QgICAgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKVxyXG4gICwgJGZsYWdzICAgICAgPSByZXF1aXJlKCcuL19mbGFncycpXHJcbiAgLCBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJylcclxuICAsIFRPX1NUUklORyAgID0gJ3RvU3RyaW5nJ1xyXG4gICwgJHRvU3RyaW5nICAgPSAvLi9bVE9fU1RSSU5HXTtcclxuXHJcbnZhciBkZWZpbmUgPSBmdW5jdGlvbihmbil7XHJcbiAgcmVxdWlyZSgnLi9fcmVkZWZpbmUnKShSZWdFeHAucHJvdG90eXBlLCBUT19TVFJJTkcsIGZuLCB0cnVlKTtcclxufTtcclxuXHJcbi8vIDIxLjIuNS4xNCBSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nKClcclxuaWYocmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbigpeyByZXR1cm4gJHRvU3RyaW5nLmNhbGwoe3NvdXJjZTogJ2EnLCBmbGFnczogJ2InfSkgIT0gJy9hL2InOyB9KSl7XHJcbiAgZGVmaW5lKGZ1bmN0aW9uIHRvU3RyaW5nKCl7XHJcbiAgICB2YXIgUiA9IGFuT2JqZWN0KHRoaXMpO1xyXG4gICAgcmV0dXJuICcvJy5jb25jYXQoUi5zb3VyY2UsICcvJyxcclxuICAgICAgJ2ZsYWdzJyBpbiBSID8gUi5mbGFncyA6ICFERVNDUklQVE9SUyAmJiBSIGluc3RhbmNlb2YgUmVnRXhwID8gJGZsYWdzLmNhbGwoUikgOiB1bmRlZmluZWQpO1xyXG4gIH0pO1xyXG4vLyBGRjQ0LSBSZWdFeHAjdG9TdHJpbmcgaGFzIGEgd3JvbmcgbmFtZVxyXG59IGVsc2UgaWYoJHRvU3RyaW5nLm5hbWUgIT0gVE9fU1RSSU5HKXtcclxuICBkZWZpbmUoZnVuY3Rpb24gdG9TdHJpbmcoKXtcclxuICAgIHJldHVybiAkdG9TdHJpbmcuY2FsbCh0aGlzKTtcclxuICB9KTtcclxufVxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWdleHAudG8tc3RyaW5nLmpzXG4gKiogbW9kdWxlIGlkID0gMTk0XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyAyMS4yLjUuMyBnZXQgUmVnRXhwLnByb3RvdHlwZS5mbGFncygpXG5pZihyZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpICYmIC8uL2cuZmxhZ3MgIT0gJ2cnKXJlcXVpcmUoJy4vX29iamVjdC1kcCcpLmYoUmVnRXhwLnByb3RvdHlwZSwgJ2ZsYWdzJywge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGdldDogcmVxdWlyZSgnLi9fZmxhZ3MnKVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZ2V4cC5mbGFncy5qc1xuICoqIG1vZHVsZSBpZCA9IDE5NVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gQEBtYXRjaCBsb2dpY1xucmVxdWlyZSgnLi9fZml4LXJlLXdrcycpKCdtYXRjaCcsIDEsIGZ1bmN0aW9uKGRlZmluZWQsIE1BVENILCAkbWF0Y2gpe1xuICAvLyAyMS4xLjMuMTEgU3RyaW5nLnByb3RvdHlwZS5tYXRjaChyZWdleHApXG4gIHJldHVybiBbZnVuY3Rpb24gbWF0Y2gocmVnZXhwKXtcbiAgICAndXNlIHN0cmljdCc7XG4gICAgdmFyIE8gID0gZGVmaW5lZCh0aGlzKVxuICAgICAgLCBmbiA9IHJlZ2V4cCA9PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiByZWdleHBbTUFUQ0hdO1xuICAgIHJldHVybiBmbiAhPT0gdW5kZWZpbmVkID8gZm4uY2FsbChyZWdleHAsIE8pIDogbmV3IFJlZ0V4cChyZWdleHApW01BVENIXShTdHJpbmcoTykpO1xuICB9LCAkbWF0Y2hdO1xufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZ2V4cC5tYXRjaC5qc1xuICoqIG1vZHVsZSBpZCA9IDE5NlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGhpZGUgICAgID0gcmVxdWlyZSgnLi9faGlkZScpXG4gICwgcmVkZWZpbmUgPSByZXF1aXJlKCcuL19yZWRlZmluZScpXG4gICwgZmFpbHMgICAgPSByZXF1aXJlKCcuL19mYWlscycpXG4gICwgZGVmaW5lZCAgPSByZXF1aXJlKCcuL19kZWZpbmVkJylcbiAgLCB3a3MgICAgICA9IHJlcXVpcmUoJy4vX3drcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKEtFWSwgbGVuZ3RoLCBleGVjKXtcbiAgdmFyIFNZTUJPTCAgID0gd2tzKEtFWSlcbiAgICAsIGZucyAgICAgID0gZXhlYyhkZWZpbmVkLCBTWU1CT0wsICcnW0tFWV0pXG4gICAgLCBzdHJmbiAgICA9IGZuc1swXVxuICAgICwgcnhmbiAgICAgPSBmbnNbMV07XG4gIGlmKGZhaWxzKGZ1bmN0aW9uKCl7XG4gICAgdmFyIE8gPSB7fTtcbiAgICBPW1NZTUJPTF0gPSBmdW5jdGlvbigpeyByZXR1cm4gNzsgfTtcbiAgICByZXR1cm4gJydbS0VZXShPKSAhPSA3O1xuICB9KSl7XG4gICAgcmVkZWZpbmUoU3RyaW5nLnByb3RvdHlwZSwgS0VZLCBzdHJmbik7XG4gICAgaGlkZShSZWdFeHAucHJvdG90eXBlLCBTWU1CT0wsIGxlbmd0aCA9PSAyXG4gICAgICAvLyAyMS4yLjUuOCBSZWdFeHAucHJvdG90eXBlW0BAcmVwbGFjZV0oc3RyaW5nLCByZXBsYWNlVmFsdWUpXG4gICAgICAvLyAyMS4yLjUuMTEgUmVnRXhwLnByb3RvdHlwZVtAQHNwbGl0XShzdHJpbmcsIGxpbWl0KVxuICAgICAgPyBmdW5jdGlvbihzdHJpbmcsIGFyZyl7IHJldHVybiByeGZuLmNhbGwoc3RyaW5nLCB0aGlzLCBhcmcpOyB9XG4gICAgICAvLyAyMS4yLjUuNiBSZWdFeHAucHJvdG90eXBlW0BAbWF0Y2hdKHN0cmluZylcbiAgICAgIC8vIDIxLjIuNS45IFJlZ0V4cC5wcm90b3R5cGVbQEBzZWFyY2hdKHN0cmluZylcbiAgICAgIDogZnVuY3Rpb24oc3RyaW5nKXsgcmV0dXJuIHJ4Zm4uY2FsbChzdHJpbmcsIHRoaXMpOyB9XG4gICAgKTtcbiAgfVxufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fZml4LXJlLXdrcy5qc1xuICoqIG1vZHVsZSBpZCA9IDE5N1xuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gQEByZXBsYWNlIGxvZ2ljXG5yZXF1aXJlKCcuL19maXgtcmUtd2tzJykoJ3JlcGxhY2UnLCAyLCBmdW5jdGlvbihkZWZpbmVkLCBSRVBMQUNFLCAkcmVwbGFjZSl7XG4gIC8vIDIxLjEuMy4xNCBTdHJpbmcucHJvdG90eXBlLnJlcGxhY2Uoc2VhcmNoVmFsdWUsIHJlcGxhY2VWYWx1ZSlcbiAgcmV0dXJuIFtmdW5jdGlvbiByZXBsYWNlKHNlYXJjaFZhbHVlLCByZXBsYWNlVmFsdWUpe1xuICAgICd1c2Ugc3RyaWN0JztcbiAgICB2YXIgTyAgPSBkZWZpbmVkKHRoaXMpXG4gICAgICAsIGZuID0gc2VhcmNoVmFsdWUgPT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogc2VhcmNoVmFsdWVbUkVQTEFDRV07XG4gICAgcmV0dXJuIGZuICE9PSB1bmRlZmluZWRcbiAgICAgID8gZm4uY2FsbChzZWFyY2hWYWx1ZSwgTywgcmVwbGFjZVZhbHVlKVxuICAgICAgOiAkcmVwbGFjZS5jYWxsKFN0cmluZyhPKSwgc2VhcmNoVmFsdWUsIHJlcGxhY2VWYWx1ZSk7XG4gIH0sICRyZXBsYWNlXTtcbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWdleHAucmVwbGFjZS5qc1xuICoqIG1vZHVsZSBpZCA9IDE5OFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gQEBzZWFyY2ggbG9naWNcbnJlcXVpcmUoJy4vX2ZpeC1yZS13a3MnKSgnc2VhcmNoJywgMSwgZnVuY3Rpb24oZGVmaW5lZCwgU0VBUkNILCAkc2VhcmNoKXtcbiAgLy8gMjEuMS4zLjE1IFN0cmluZy5wcm90b3R5cGUuc2VhcmNoKHJlZ2V4cClcbiAgcmV0dXJuIFtmdW5jdGlvbiBzZWFyY2gocmVnZXhwKXtcbiAgICAndXNlIHN0cmljdCc7XG4gICAgdmFyIE8gID0gZGVmaW5lZCh0aGlzKVxuICAgICAgLCBmbiA9IHJlZ2V4cCA9PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiByZWdleHBbU0VBUkNIXTtcbiAgICByZXR1cm4gZm4gIT09IHVuZGVmaW5lZCA/IGZuLmNhbGwocmVnZXhwLCBPKSA6IG5ldyBSZWdFeHAocmVnZXhwKVtTRUFSQ0hdKFN0cmluZyhPKSk7XG4gIH0sICRzZWFyY2hdO1xufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZ2V4cC5zZWFyY2guanNcbiAqKiBtb2R1bGUgaWQgPSAxOTlcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIEBAc3BsaXQgbG9naWNcbnJlcXVpcmUoJy4vX2ZpeC1yZS13a3MnKSgnc3BsaXQnLCAyLCBmdW5jdGlvbihkZWZpbmVkLCBTUExJVCwgJHNwbGl0KXtcbiAgJ3VzZSBzdHJpY3QnO1xuICB2YXIgaXNSZWdFeHAgICA9IHJlcXVpcmUoJy4vX2lzLXJlZ2V4cCcpXG4gICAgLCBfc3BsaXQgICAgID0gJHNwbGl0XG4gICAgLCAkcHVzaCAgICAgID0gW10ucHVzaFxuICAgICwgJFNQTElUICAgICA9ICdzcGxpdCdcbiAgICAsIExFTkdUSCAgICAgPSAnbGVuZ3RoJ1xuICAgICwgTEFTVF9JTkRFWCA9ICdsYXN0SW5kZXgnO1xuICBpZihcbiAgICAnYWJiYydbJFNQTElUXSgvKGIpKi8pWzFdID09ICdjJyB8fFxuICAgICd0ZXN0J1skU1BMSVRdKC8oPzopLywgLTEpW0xFTkdUSF0gIT0gNCB8fFxuICAgICdhYidbJFNQTElUXSgvKD86YWIpKi8pW0xFTkdUSF0gIT0gMiB8fFxuICAgICcuJ1skU1BMSVRdKC8oLj8pKC4/KS8pW0xFTkdUSF0gIT0gNCB8fFxuICAgICcuJ1skU1BMSVRdKC8oKSgpLylbTEVOR1RIXSA+IDEgfHxcbiAgICAnJ1skU1BMSVRdKC8uPy8pW0xFTkdUSF1cbiAgKXtcbiAgICB2YXIgTlBDRyA9IC8oKT8/Ly5leGVjKCcnKVsxXSA9PT0gdW5kZWZpbmVkOyAvLyBub25wYXJ0aWNpcGF0aW5nIGNhcHR1cmluZyBncm91cFxuICAgIC8vIGJhc2VkIG9uIGVzNS1zaGltIGltcGxlbWVudGF0aW9uLCBuZWVkIHRvIHJld29yayBpdFxuICAgICRzcGxpdCA9IGZ1bmN0aW9uKHNlcGFyYXRvciwgbGltaXQpe1xuICAgICAgdmFyIHN0cmluZyA9IFN0cmluZyh0aGlzKTtcbiAgICAgIGlmKHNlcGFyYXRvciA9PT0gdW5kZWZpbmVkICYmIGxpbWl0ID09PSAwKXJldHVybiBbXTtcbiAgICAgIC8vIElmIGBzZXBhcmF0b3JgIGlzIG5vdCBhIHJlZ2V4LCB1c2UgbmF0aXZlIHNwbGl0XG4gICAgICBpZighaXNSZWdFeHAoc2VwYXJhdG9yKSlyZXR1cm4gX3NwbGl0LmNhbGwoc3RyaW5nLCBzZXBhcmF0b3IsIGxpbWl0KTtcbiAgICAgIHZhciBvdXRwdXQgPSBbXTtcbiAgICAgIHZhciBmbGFncyA9IChzZXBhcmF0b3IuaWdub3JlQ2FzZSA/ICdpJyA6ICcnKSArXG4gICAgICAgICAgICAgICAgICAoc2VwYXJhdG9yLm11bHRpbGluZSA/ICdtJyA6ICcnKSArXG4gICAgICAgICAgICAgICAgICAoc2VwYXJhdG9yLnVuaWNvZGUgPyAndScgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgKHNlcGFyYXRvci5zdGlja3kgPyAneScgOiAnJyk7XG4gICAgICB2YXIgbGFzdExhc3RJbmRleCA9IDA7XG4gICAgICB2YXIgc3BsaXRMaW1pdCA9IGxpbWl0ID09PSB1bmRlZmluZWQgPyA0Mjk0OTY3Mjk1IDogbGltaXQgPj4+IDA7XG4gICAgICAvLyBNYWtlIGBnbG9iYWxgIGFuZCBhdm9pZCBgbGFzdEluZGV4YCBpc3N1ZXMgYnkgd29ya2luZyB3aXRoIGEgY29weVxuICAgICAgdmFyIHNlcGFyYXRvckNvcHkgPSBuZXcgUmVnRXhwKHNlcGFyYXRvci5zb3VyY2UsIGZsYWdzICsgJ2cnKTtcbiAgICAgIHZhciBzZXBhcmF0b3IyLCBtYXRjaCwgbGFzdEluZGV4LCBsYXN0TGVuZ3RoLCBpO1xuICAgICAgLy8gRG9lc24ndCBuZWVkIGZsYWdzIGd5LCBidXQgdGhleSBkb24ndCBodXJ0XG4gICAgICBpZighTlBDRylzZXBhcmF0b3IyID0gbmV3IFJlZ0V4cCgnXicgKyBzZXBhcmF0b3JDb3B5LnNvdXJjZSArICckKD8hXFxcXHMpJywgZmxhZ3MpO1xuICAgICAgd2hpbGUobWF0Y2ggPSBzZXBhcmF0b3JDb3B5LmV4ZWMoc3RyaW5nKSl7XG4gICAgICAgIC8vIGBzZXBhcmF0b3JDb3B5Lmxhc3RJbmRleGAgaXMgbm90IHJlbGlhYmxlIGNyb3NzLWJyb3dzZXJcbiAgICAgICAgbGFzdEluZGV4ID0gbWF0Y2guaW5kZXggKyBtYXRjaFswXVtMRU5HVEhdO1xuICAgICAgICBpZihsYXN0SW5kZXggPiBsYXN0TGFzdEluZGV4KXtcbiAgICAgICAgICBvdXRwdXQucHVzaChzdHJpbmcuc2xpY2UobGFzdExhc3RJbmRleCwgbWF0Y2guaW5kZXgpKTtcbiAgICAgICAgICAvLyBGaXggYnJvd3NlcnMgd2hvc2UgYGV4ZWNgIG1ldGhvZHMgZG9uJ3QgY29uc2lzdGVudGx5IHJldHVybiBgdW5kZWZpbmVkYCBmb3IgTlBDR1xuICAgICAgICAgIGlmKCFOUENHICYmIG1hdGNoW0xFTkdUSF0gPiAxKW1hdGNoWzBdLnJlcGxhY2Uoc2VwYXJhdG9yMiwgZnVuY3Rpb24oKXtcbiAgICAgICAgICAgIGZvcihpID0gMTsgaSA8IGFyZ3VtZW50c1tMRU5HVEhdIC0gMjsgaSsrKWlmKGFyZ3VtZW50c1tpXSA9PT0gdW5kZWZpbmVkKW1hdGNoW2ldID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmKG1hdGNoW0xFTkdUSF0gPiAxICYmIG1hdGNoLmluZGV4IDwgc3RyaW5nW0xFTkdUSF0pJHB1c2guYXBwbHkob3V0cHV0LCBtYXRjaC5zbGljZSgxKSk7XG4gICAgICAgICAgbGFzdExlbmd0aCA9IG1hdGNoWzBdW0xFTkdUSF07XG4gICAgICAgICAgbGFzdExhc3RJbmRleCA9IGxhc3RJbmRleDtcbiAgICAgICAgICBpZihvdXRwdXRbTEVOR1RIXSA+PSBzcGxpdExpbWl0KWJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmKHNlcGFyYXRvckNvcHlbTEFTVF9JTkRFWF0gPT09IG1hdGNoLmluZGV4KXNlcGFyYXRvckNvcHlbTEFTVF9JTkRFWF0rKzsgLy8gQXZvaWQgYW4gaW5maW5pdGUgbG9vcFxuICAgICAgfVxuICAgICAgaWYobGFzdExhc3RJbmRleCA9PT0gc3RyaW5nW0xFTkdUSF0pe1xuICAgICAgICBpZihsYXN0TGVuZ3RoIHx8ICFzZXBhcmF0b3JDb3B5LnRlc3QoJycpKW91dHB1dC5wdXNoKCcnKTtcbiAgICAgIH0gZWxzZSBvdXRwdXQucHVzaChzdHJpbmcuc2xpY2UobGFzdExhc3RJbmRleCkpO1xuICAgICAgcmV0dXJuIG91dHB1dFtMRU5HVEhdID4gc3BsaXRMaW1pdCA/IG91dHB1dC5zbGljZSgwLCBzcGxpdExpbWl0KSA6IG91dHB1dDtcbiAgICB9O1xuICAvLyBDaGFrcmEsIFY4XG4gIH0gZWxzZSBpZignMCdbJFNQTElUXSh1bmRlZmluZWQsIDApW0xFTkdUSF0pe1xuICAgICRzcGxpdCA9IGZ1bmN0aW9uKHNlcGFyYXRvciwgbGltaXQpe1xuICAgICAgcmV0dXJuIHNlcGFyYXRvciA9PT0gdW5kZWZpbmVkICYmIGxpbWl0ID09PSAwID8gW10gOiBfc3BsaXQuY2FsbCh0aGlzLCBzZXBhcmF0b3IsIGxpbWl0KTtcbiAgICB9O1xuICB9XG4gIC8vIDIxLjEuMy4xNyBTdHJpbmcucHJvdG90eXBlLnNwbGl0KHNlcGFyYXRvciwgbGltaXQpXG4gIHJldHVybiBbZnVuY3Rpb24gc3BsaXQoc2VwYXJhdG9yLCBsaW1pdCl7XG4gICAgdmFyIE8gID0gZGVmaW5lZCh0aGlzKVxuICAgICAgLCBmbiA9IHNlcGFyYXRvciA9PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBzZXBhcmF0b3JbU1BMSVRdO1xuICAgIHJldHVybiBmbiAhPT0gdW5kZWZpbmVkID8gZm4uY2FsbChzZXBhcmF0b3IsIE8sIGxpbWl0KSA6ICRzcGxpdC5jYWxsKFN0cmluZyhPKSwgc2VwYXJhdG9yLCBsaW1pdCk7XG4gIH0sICRzcGxpdF07XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVnZXhwLnNwbGl0LmpzXG4gKiogbW9kdWxlIGlkID0gMjAwXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG52YXIgTElCUkFSWSAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fbGlicmFyeScpXG4gICwgZ2xvYmFsICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fZ2xvYmFsJylcbiAgLCBjdHggICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19jdHgnKVxuICAsIGNsYXNzb2YgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2NsYXNzb2YnKVxuICAsICRleHBvcnQgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICwgaXNPYmplY3QgICAgICAgICAgID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0JylcbiAgLCBhbk9iamVjdCAgICAgICAgICAgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKVxuICAsIGFGdW5jdGlvbiAgICAgICAgICA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKVxuICAsIGFuSW5zdGFuY2UgICAgICAgICA9IHJlcXVpcmUoJy4vX2FuLWluc3RhbmNlJylcbiAgLCBmb3JPZiAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19mb3Itb2YnKVxuICAsIHNldFByb3RvICAgICAgICAgICA9IHJlcXVpcmUoJy4vX3NldC1wcm90bycpLnNldFxuICAsIHNwZWNpZXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4vX3NwZWNpZXMtY29uc3RydWN0b3InKVxuICAsIHRhc2sgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX3Rhc2snKS5zZXRcbiAgLCBtaWNyb3Rhc2sgICAgICAgICAgPSByZXF1aXJlKCcuL19taWNyb3Rhc2snKVxuICAsIFBST01JU0UgICAgICAgICAgICA9ICdQcm9taXNlJ1xuICAsIFR5cGVFcnJvciAgICAgICAgICA9IGdsb2JhbC5UeXBlRXJyb3JcbiAgLCBwcm9jZXNzICAgICAgICAgICAgPSBnbG9iYWwucHJvY2Vzc1xuICAsICRQcm9taXNlICAgICAgICAgICA9IGdsb2JhbFtQUk9NSVNFXVxuICAsIHByb2Nlc3MgICAgICAgICAgICA9IGdsb2JhbC5wcm9jZXNzXG4gICwgaXNOb2RlICAgICAgICAgICAgID0gY2xhc3NvZihwcm9jZXNzKSA9PSAncHJvY2VzcydcbiAgLCBlbXB0eSAgICAgICAgICAgICAgPSBmdW5jdGlvbigpeyAvKiBlbXB0eSAqLyB9XG4gICwgSW50ZXJuYWwsIEdlbmVyaWNQcm9taXNlQ2FwYWJpbGl0eSwgV3JhcHBlcjtcblxudmFyIFVTRV9OQVRJVkUgPSAhIWZ1bmN0aW9uKCl7XG4gIHRyeSB7XG4gICAgLy8gY29ycmVjdCBzdWJjbGFzc2luZyB3aXRoIEBAc3BlY2llcyBzdXBwb3J0XG4gICAgdmFyIHByb21pc2UgICAgID0gJFByb21pc2UucmVzb2x2ZSgxKVxuICAgICAgLCBGYWtlUHJvbWlzZSA9IChwcm9taXNlLmNvbnN0cnVjdG9yID0ge30pW3JlcXVpcmUoJy4vX3drcycpKCdzcGVjaWVzJyldID0gZnVuY3Rpb24oZXhlYyl7IGV4ZWMoZW1wdHksIGVtcHR5KTsgfTtcbiAgICAvLyB1bmhhbmRsZWQgcmVqZWN0aW9ucyB0cmFja2luZyBzdXBwb3J0LCBOb2RlSlMgUHJvbWlzZSB3aXRob3V0IGl0IGZhaWxzIEBAc3BlY2llcyB0ZXN0XG4gICAgcmV0dXJuIChpc05vZGUgfHwgdHlwZW9mIFByb21pc2VSZWplY3Rpb25FdmVudCA9PSAnZnVuY3Rpb24nKSAmJiBwcm9taXNlLnRoZW4oZW1wdHkpIGluc3RhbmNlb2YgRmFrZVByb21pc2U7XG4gIH0gY2F0Y2goZSl7IC8qIGVtcHR5ICovIH1cbn0oKTtcblxuLy8gaGVscGVyc1xudmFyIHNhbWVDb25zdHJ1Y3RvciA9IGZ1bmN0aW9uKGEsIGIpe1xuICAvLyB3aXRoIGxpYnJhcnkgd3JhcHBlciBzcGVjaWFsIGNhc2VcbiAgcmV0dXJuIGEgPT09IGIgfHwgYSA9PT0gJFByb21pc2UgJiYgYiA9PT0gV3JhcHBlcjtcbn07XG52YXIgaXNUaGVuYWJsZSA9IGZ1bmN0aW9uKGl0KXtcbiAgdmFyIHRoZW47XG4gIHJldHVybiBpc09iamVjdChpdCkgJiYgdHlwZW9mICh0aGVuID0gaXQudGhlbikgPT0gJ2Z1bmN0aW9uJyA/IHRoZW4gOiBmYWxzZTtcbn07XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHkgPSBmdW5jdGlvbihDKXtcbiAgcmV0dXJuIHNhbWVDb25zdHJ1Y3RvcigkUHJvbWlzZSwgQylcbiAgICA/IG5ldyBQcm9taXNlQ2FwYWJpbGl0eShDKVxuICAgIDogbmV3IEdlbmVyaWNQcm9taXNlQ2FwYWJpbGl0eShDKTtcbn07XG52YXIgUHJvbWlzZUNhcGFiaWxpdHkgPSBHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHkgPSBmdW5jdGlvbihDKXtcbiAgdmFyIHJlc29sdmUsIHJlamVjdDtcbiAgdGhpcy5wcm9taXNlID0gbmV3IEMoZnVuY3Rpb24oJCRyZXNvbHZlLCAkJHJlamVjdCl7XG4gICAgaWYocmVzb2x2ZSAhPT0gdW5kZWZpbmVkIHx8IHJlamVjdCAhPT0gdW5kZWZpbmVkKXRocm93IFR5cGVFcnJvcignQmFkIFByb21pc2UgY29uc3RydWN0b3InKTtcbiAgICByZXNvbHZlID0gJCRyZXNvbHZlO1xuICAgIHJlamVjdCAgPSAkJHJlamVjdDtcbiAgfSk7XG4gIHRoaXMucmVzb2x2ZSA9IGFGdW5jdGlvbihyZXNvbHZlKTtcbiAgdGhpcy5yZWplY3QgID0gYUZ1bmN0aW9uKHJlamVjdCk7XG59O1xudmFyIHBlcmZvcm0gPSBmdW5jdGlvbihleGVjKXtcbiAgdHJ5IHtcbiAgICBleGVjKCk7XG4gIH0gY2F0Y2goZSl7XG4gICAgcmV0dXJuIHtlcnJvcjogZX07XG4gIH1cbn07XG52YXIgbm90aWZ5ID0gZnVuY3Rpb24ocHJvbWlzZSwgaXNSZWplY3Qpe1xuICBpZihwcm9taXNlLl9uKXJldHVybjtcbiAgcHJvbWlzZS5fbiA9IHRydWU7XG4gIHZhciBjaGFpbiA9IHByb21pc2UuX2M7XG4gIG1pY3JvdGFzayhmdW5jdGlvbigpe1xuICAgIHZhciB2YWx1ZSA9IHByb21pc2UuX3ZcbiAgICAgICwgb2sgICAgPSBwcm9taXNlLl9zID09IDFcbiAgICAgICwgaSAgICAgPSAwO1xuICAgIHZhciBydW4gPSBmdW5jdGlvbihyZWFjdGlvbil7XG4gICAgICB2YXIgaGFuZGxlciA9IG9rID8gcmVhY3Rpb24ub2sgOiByZWFjdGlvbi5mYWlsXG4gICAgICAgICwgcmVzb2x2ZSA9IHJlYWN0aW9uLnJlc29sdmVcbiAgICAgICAgLCByZWplY3QgID0gcmVhY3Rpb24ucmVqZWN0XG4gICAgICAgICwgZG9tYWluICA9IHJlYWN0aW9uLmRvbWFpblxuICAgICAgICAsIHJlc3VsdCwgdGhlbjtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmKGhhbmRsZXIpe1xuICAgICAgICAgIGlmKCFvayl7XG4gICAgICAgICAgICBpZihwcm9taXNlLl9oID09IDIpb25IYW5kbGVVbmhhbmRsZWQocHJvbWlzZSk7XG4gICAgICAgICAgICBwcm9taXNlLl9oID0gMTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYoaGFuZGxlciA9PT0gdHJ1ZSlyZXN1bHQgPSB2YWx1ZTtcbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmKGRvbWFpbilkb21haW4uZW50ZXIoKTtcbiAgICAgICAgICAgIHJlc3VsdCA9IGhhbmRsZXIodmFsdWUpO1xuICAgICAgICAgICAgaWYoZG9tYWluKWRvbWFpbi5leGl0KCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKHJlc3VsdCA9PT0gcmVhY3Rpb24ucHJvbWlzZSl7XG4gICAgICAgICAgICByZWplY3QoVHlwZUVycm9yKCdQcm9taXNlLWNoYWluIGN5Y2xlJykpO1xuICAgICAgICAgIH0gZWxzZSBpZih0aGVuID0gaXNUaGVuYWJsZShyZXN1bHQpKXtcbiAgICAgICAgICAgIHRoZW4uY2FsbChyZXN1bHQsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSBlbHNlIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgfSBlbHNlIHJlamVjdCh2YWx1ZSk7XG4gICAgICB9IGNhdGNoKGUpe1xuICAgICAgICByZWplY3QoZSk7XG4gICAgICB9XG4gICAgfTtcbiAgICB3aGlsZShjaGFpbi5sZW5ndGggPiBpKXJ1bihjaGFpbltpKytdKTsgLy8gdmFyaWFibGUgbGVuZ3RoIC0gY2FuJ3QgdXNlIGZvckVhY2hcbiAgICBwcm9taXNlLl9jID0gW107XG4gICAgcHJvbWlzZS5fbiA9IGZhbHNlO1xuICAgIGlmKGlzUmVqZWN0ICYmICFwcm9taXNlLl9oKW9uVW5oYW5kbGVkKHByb21pc2UpO1xuICB9KTtcbn07XG52YXIgb25VbmhhbmRsZWQgPSBmdW5jdGlvbihwcm9taXNlKXtcbiAgdGFzay5jYWxsKGdsb2JhbCwgZnVuY3Rpb24oKXtcbiAgICB2YXIgdmFsdWUgPSBwcm9taXNlLl92XG4gICAgICAsIGFicnVwdCwgaGFuZGxlciwgY29uc29sZTtcbiAgICBpZihpc1VuaGFuZGxlZChwcm9taXNlKSl7XG4gICAgICBhYnJ1cHQgPSBwZXJmb3JtKGZ1bmN0aW9uKCl7XG4gICAgICAgIGlmKGlzTm9kZSl7XG4gICAgICAgICAgcHJvY2Vzcy5lbWl0KCd1bmhhbmRsZWRSZWplY3Rpb24nLCB2YWx1ZSwgcHJvbWlzZSk7XG4gICAgICAgIH0gZWxzZSBpZihoYW5kbGVyID0gZ2xvYmFsLm9udW5oYW5kbGVkcmVqZWN0aW9uKXtcbiAgICAgICAgICBoYW5kbGVyKHtwcm9taXNlOiBwcm9taXNlLCByZWFzb246IHZhbHVlfSk7XG4gICAgICAgIH0gZWxzZSBpZigoY29uc29sZSA9IGdsb2JhbC5jb25zb2xlKSAmJiBjb25zb2xlLmVycm9yKXtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdVbmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb24nLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgLy8gQnJvd3NlcnMgc2hvdWxkIG5vdCB0cmlnZ2VyIGByZWplY3Rpb25IYW5kbGVkYCBldmVudCBpZiBpdCB3YXMgaGFuZGxlZCBoZXJlLCBOb2RlSlMgLSBzaG91bGRcbiAgICAgIHByb21pc2UuX2ggPSBpc05vZGUgfHwgaXNVbmhhbmRsZWQocHJvbWlzZSkgPyAyIDogMTtcbiAgICB9IHByb21pc2UuX2EgPSB1bmRlZmluZWQ7XG4gICAgaWYoYWJydXB0KXRocm93IGFicnVwdC5lcnJvcjtcbiAgfSk7XG59O1xudmFyIGlzVW5oYW5kbGVkID0gZnVuY3Rpb24ocHJvbWlzZSl7XG4gIGlmKHByb21pc2UuX2ggPT0gMSlyZXR1cm4gZmFsc2U7XG4gIHZhciBjaGFpbiA9IHByb21pc2UuX2EgfHwgcHJvbWlzZS5fY1xuICAgICwgaSAgICAgPSAwXG4gICAgLCByZWFjdGlvbjtcbiAgd2hpbGUoY2hhaW4ubGVuZ3RoID4gaSl7XG4gICAgcmVhY3Rpb24gPSBjaGFpbltpKytdO1xuICAgIGlmKHJlYWN0aW9uLmZhaWwgfHwgIWlzVW5oYW5kbGVkKHJlYWN0aW9uLnByb21pc2UpKXJldHVybiBmYWxzZTtcbiAgfSByZXR1cm4gdHJ1ZTtcbn07XG52YXIgb25IYW5kbGVVbmhhbmRsZWQgPSBmdW5jdGlvbihwcm9taXNlKXtcbiAgdGFzay5jYWxsKGdsb2JhbCwgZnVuY3Rpb24oKXtcbiAgICB2YXIgaGFuZGxlcjtcbiAgICBpZihpc05vZGUpe1xuICAgICAgcHJvY2Vzcy5lbWl0KCdyZWplY3Rpb25IYW5kbGVkJywgcHJvbWlzZSk7XG4gICAgfSBlbHNlIGlmKGhhbmRsZXIgPSBnbG9iYWwub25yZWplY3Rpb25oYW5kbGVkKXtcbiAgICAgIGhhbmRsZXIoe3Byb21pc2U6IHByb21pc2UsIHJlYXNvbjogcHJvbWlzZS5fdn0pO1xuICAgIH1cbiAgfSk7XG59O1xudmFyICRyZWplY3QgPSBmdW5jdGlvbih2YWx1ZSl7XG4gIHZhciBwcm9taXNlID0gdGhpcztcbiAgaWYocHJvbWlzZS5fZClyZXR1cm47XG4gIHByb21pc2UuX2QgPSB0cnVlO1xuICBwcm9taXNlID0gcHJvbWlzZS5fdyB8fCBwcm9taXNlOyAvLyB1bndyYXBcbiAgcHJvbWlzZS5fdiA9IHZhbHVlO1xuICBwcm9taXNlLl9zID0gMjtcbiAgaWYoIXByb21pc2UuX2EpcHJvbWlzZS5fYSA9IHByb21pc2UuX2Muc2xpY2UoKTtcbiAgbm90aWZ5KHByb21pc2UsIHRydWUpO1xufTtcbnZhciAkcmVzb2x2ZSA9IGZ1bmN0aW9uKHZhbHVlKXtcbiAgdmFyIHByb21pc2UgPSB0aGlzXG4gICAgLCB0aGVuO1xuICBpZihwcm9taXNlLl9kKXJldHVybjtcbiAgcHJvbWlzZS5fZCA9IHRydWU7XG4gIHByb21pc2UgPSBwcm9taXNlLl93IHx8IHByb21pc2U7IC8vIHVud3JhcFxuICB0cnkge1xuICAgIGlmKHByb21pc2UgPT09IHZhbHVlKXRocm93IFR5cGVFcnJvcihcIlByb21pc2UgY2FuJ3QgYmUgcmVzb2x2ZWQgaXRzZWxmXCIpO1xuICAgIGlmKHRoZW4gPSBpc1RoZW5hYmxlKHZhbHVlKSl7XG4gICAgICBtaWNyb3Rhc2soZnVuY3Rpb24oKXtcbiAgICAgICAgdmFyIHdyYXBwZXIgPSB7X3c6IHByb21pc2UsIF9kOiBmYWxzZX07IC8vIHdyYXBcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGVuLmNhbGwodmFsdWUsIGN0eCgkcmVzb2x2ZSwgd3JhcHBlciwgMSksIGN0eCgkcmVqZWN0LCB3cmFwcGVyLCAxKSk7XG4gICAgICAgIH0gY2F0Y2goZSl7XG4gICAgICAgICAgJHJlamVjdC5jYWxsKHdyYXBwZXIsIGUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvbWlzZS5fdiA9IHZhbHVlO1xuICAgICAgcHJvbWlzZS5fcyA9IDE7XG4gICAgICBub3RpZnkocHJvbWlzZSwgZmFsc2UpO1xuICAgIH1cbiAgfSBjYXRjaChlKXtcbiAgICAkcmVqZWN0LmNhbGwoe193OiBwcm9taXNlLCBfZDogZmFsc2V9LCBlKTsgLy8gd3JhcFxuICB9XG59O1xuXG4vLyBjb25zdHJ1Y3RvciBwb2x5ZmlsbFxuaWYoIVVTRV9OQVRJVkUpe1xuICAvLyAyNS40LjMuMSBQcm9taXNlKGV4ZWN1dG9yKVxuICAkUHJvbWlzZSA9IGZ1bmN0aW9uIFByb21pc2UoZXhlY3V0b3Ipe1xuICAgIGFuSW5zdGFuY2UodGhpcywgJFByb21pc2UsIFBST01JU0UsICdfaCcpO1xuICAgIGFGdW5jdGlvbihleGVjdXRvcik7XG4gICAgSW50ZXJuYWwuY2FsbCh0aGlzKTtcbiAgICB0cnkge1xuICAgICAgZXhlY3V0b3IoY3R4KCRyZXNvbHZlLCB0aGlzLCAxKSwgY3R4KCRyZWplY3QsIHRoaXMsIDEpKTtcbiAgICB9IGNhdGNoKGVycil7XG4gICAgICAkcmVqZWN0LmNhbGwodGhpcywgZXJyKTtcbiAgICB9XG4gIH07XG4gIEludGVybmFsID0gZnVuY3Rpb24gUHJvbWlzZShleGVjdXRvcil7XG4gICAgdGhpcy5fYyA9IFtdOyAgICAgICAgICAgICAvLyA8LSBhd2FpdGluZyByZWFjdGlvbnNcbiAgICB0aGlzLl9hID0gdW5kZWZpbmVkOyAgICAgIC8vIDwtIGNoZWNrZWQgaW4gaXNVbmhhbmRsZWQgcmVhY3Rpb25zXG4gICAgdGhpcy5fcyA9IDA7ICAgICAgICAgICAgICAvLyA8LSBzdGF0ZVxuICAgIHRoaXMuX2QgPSBmYWxzZTsgICAgICAgICAgLy8gPC0gZG9uZVxuICAgIHRoaXMuX3YgPSB1bmRlZmluZWQ7ICAgICAgLy8gPC0gdmFsdWVcbiAgICB0aGlzLl9oID0gMDsgICAgICAgICAgICAgIC8vIDwtIHJlamVjdGlvbiBzdGF0ZSwgMCAtIGRlZmF1bHQsIDEgLSBoYW5kbGVkLCAyIC0gdW5oYW5kbGVkXG4gICAgdGhpcy5fbiA9IGZhbHNlOyAgICAgICAgICAvLyA8LSBub3RpZnlcbiAgfTtcbiAgSW50ZXJuYWwucHJvdG90eXBlID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUtYWxsJykoJFByb21pc2UucHJvdG90eXBlLCB7XG4gICAgLy8gMjUuNC41LjMgUHJvbWlzZS5wcm90b3R5cGUudGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZClcbiAgICB0aGVuOiBmdW5jdGlvbiB0aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKXtcbiAgICAgIHZhciByZWFjdGlvbiAgICA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KHNwZWNpZXNDb25zdHJ1Y3Rvcih0aGlzLCAkUHJvbWlzZSkpO1xuICAgICAgcmVhY3Rpb24ub2sgICAgID0gdHlwZW9mIG9uRnVsZmlsbGVkID09ICdmdW5jdGlvbicgPyBvbkZ1bGZpbGxlZCA6IHRydWU7XG4gICAgICByZWFjdGlvbi5mYWlsICAgPSB0eXBlb2Ygb25SZWplY3RlZCA9PSAnZnVuY3Rpb24nICYmIG9uUmVqZWN0ZWQ7XG4gICAgICByZWFjdGlvbi5kb21haW4gPSBpc05vZGUgPyBwcm9jZXNzLmRvbWFpbiA6IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2MucHVzaChyZWFjdGlvbik7XG4gICAgICBpZih0aGlzLl9hKXRoaXMuX2EucHVzaChyZWFjdGlvbik7XG4gICAgICBpZih0aGlzLl9zKW5vdGlmeSh0aGlzLCBmYWxzZSk7XG4gICAgICByZXR1cm4gcmVhY3Rpb24ucHJvbWlzZTtcbiAgICB9LFxuICAgIC8vIDI1LjQuNS4xIFByb21pc2UucHJvdG90eXBlLmNhdGNoKG9uUmVqZWN0ZWQpXG4gICAgJ2NhdGNoJzogZnVuY3Rpb24ob25SZWplY3RlZCl7XG4gICAgICByZXR1cm4gdGhpcy50aGVuKHVuZGVmaW5lZCwgb25SZWplY3RlZCk7XG4gICAgfVxuICB9KTtcbiAgUHJvbWlzZUNhcGFiaWxpdHkgPSBmdW5jdGlvbigpe1xuICAgIHZhciBwcm9taXNlICA9IG5ldyBJbnRlcm5hbDtcbiAgICB0aGlzLnByb21pc2UgPSBwcm9taXNlO1xuICAgIHRoaXMucmVzb2x2ZSA9IGN0eCgkcmVzb2x2ZSwgcHJvbWlzZSwgMSk7XG4gICAgdGhpcy5yZWplY3QgID0gY3R4KCRyZWplY3QsIHByb21pc2UsIDEpO1xuICB9O1xufVxuXG4kZXhwb3J0KCRleHBvcnQuRyArICRleHBvcnQuVyArICRleHBvcnQuRiAqICFVU0VfTkFUSVZFLCB7UHJvbWlzZTogJFByb21pc2V9KTtcbnJlcXVpcmUoJy4vX3NldC10by1zdHJpbmctdGFnJykoJFByb21pc2UsIFBST01JU0UpO1xucmVxdWlyZSgnLi9fc2V0LXNwZWNpZXMnKShQUk9NSVNFKTtcbldyYXBwZXIgPSByZXF1aXJlKCcuL19jb3JlJylbUFJPTUlTRV07XG5cbi8vIHN0YXRpY3NcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIVVTRV9OQVRJVkUsIFBST01JU0UsIHtcbiAgLy8gMjUuNC40LjUgUHJvbWlzZS5yZWplY3QocilcbiAgcmVqZWN0OiBmdW5jdGlvbiByZWplY3Qocil7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eSh0aGlzKVxuICAgICAgLCAkJHJlamVjdCAgID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgJCRyZWplY3Qocik7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxufSk7XG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqIChMSUJSQVJZIHx8ICFVU0VfTkFUSVZFKSwgUFJPTUlTRSwge1xuICAvLyAyNS40LjQuNiBQcm9taXNlLnJlc29sdmUoeClcbiAgcmVzb2x2ZTogZnVuY3Rpb24gcmVzb2x2ZSh4KXtcbiAgICAvLyBpbnN0YW5jZW9mIGluc3RlYWQgb2YgaW50ZXJuYWwgc2xvdCBjaGVjayBiZWNhdXNlIHdlIHNob3VsZCBmaXggaXQgd2l0aG91dCByZXBsYWNlbWVudCBuYXRpdmUgUHJvbWlzZSBjb3JlXG4gICAgaWYoeCBpbnN0YW5jZW9mICRQcm9taXNlICYmIHNhbWVDb25zdHJ1Y3Rvcih4LmNvbnN0cnVjdG9yLCB0aGlzKSlyZXR1cm4geDtcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KHRoaXMpXG4gICAgICAsICQkcmVzb2x2ZSAgPSBjYXBhYmlsaXR5LnJlc29sdmU7XG4gICAgJCRyZXNvbHZlKHgpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pO1xuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhKFVTRV9OQVRJVkUgJiYgcmVxdWlyZSgnLi9faXRlci1kZXRlY3QnKShmdW5jdGlvbihpdGVyKXtcbiAgJFByb21pc2UuYWxsKGl0ZXIpWydjYXRjaCddKGVtcHR5KTtcbn0pKSwgUFJPTUlTRSwge1xuICAvLyAyNS40LjQuMSBQcm9taXNlLmFsbChpdGVyYWJsZSlcbiAgYWxsOiBmdW5jdGlvbiBhbGwoaXRlcmFibGUpe1xuICAgIHZhciBDICAgICAgICAgID0gdGhpc1xuICAgICAgLCBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoQylcbiAgICAgICwgcmVzb2x2ZSAgICA9IGNhcGFiaWxpdHkucmVzb2x2ZVxuICAgICAgLCByZWplY3QgICAgID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgdmFyIGFicnVwdCA9IHBlcmZvcm0oZnVuY3Rpb24oKXtcbiAgICAgIHZhciB2YWx1ZXMgICAgPSBbXVxuICAgICAgICAsIGluZGV4ICAgICA9IDBcbiAgICAgICAgLCByZW1haW5pbmcgPSAxO1xuICAgICAgZm9yT2YoaXRlcmFibGUsIGZhbHNlLCBmdW5jdGlvbihwcm9taXNlKXtcbiAgICAgICAgdmFyICRpbmRleCAgICAgICAgPSBpbmRleCsrXG4gICAgICAgICAgLCBhbHJlYWR5Q2FsbGVkID0gZmFsc2U7XG4gICAgICAgIHZhbHVlcy5wdXNoKHVuZGVmaW5lZCk7XG4gICAgICAgIHJlbWFpbmluZysrO1xuICAgICAgICBDLnJlc29sdmUocHJvbWlzZSkudGhlbihmdW5jdGlvbih2YWx1ZSl7XG4gICAgICAgICAgaWYoYWxyZWFkeUNhbGxlZClyZXR1cm47XG4gICAgICAgICAgYWxyZWFkeUNhbGxlZCAgPSB0cnVlO1xuICAgICAgICAgIHZhbHVlc1skaW5kZXhdID0gdmFsdWU7XG4gICAgICAgICAgLS1yZW1haW5pbmcgfHwgcmVzb2x2ZSh2YWx1ZXMpO1xuICAgICAgICB9LCByZWplY3QpO1xuICAgICAgfSk7XG4gICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgfSk7XG4gICAgaWYoYWJydXB0KXJlamVjdChhYnJ1cHQuZXJyb3IpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH0sXG4gIC8vIDI1LjQuNC40IFByb21pc2UucmFjZShpdGVyYWJsZSlcbiAgcmFjZTogZnVuY3Rpb24gcmFjZShpdGVyYWJsZSl7XG4gICAgdmFyIEMgICAgICAgICAgPSB0aGlzXG4gICAgICAsIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShDKVxuICAgICAgLCByZWplY3QgICAgID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgdmFyIGFicnVwdCA9IHBlcmZvcm0oZnVuY3Rpb24oKXtcbiAgICAgIGZvck9mKGl0ZXJhYmxlLCBmYWxzZSwgZnVuY3Rpb24ocHJvbWlzZSl7XG4gICAgICAgIEMucmVzb2x2ZShwcm9taXNlKS50aGVuKGNhcGFiaWxpdHkucmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGlmKGFicnVwdClyZWplY3QoYWJydXB0LmVycm9yKTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYucHJvbWlzZS5qc1xuICoqIG1vZHVsZSBpZCA9IDIwMVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwidmFyIGN0eCAgICAgICAgID0gcmVxdWlyZSgnLi9fY3R4JylcbiAgLCBjYWxsICAgICAgICA9IHJlcXVpcmUoJy4vX2l0ZXItY2FsbCcpXG4gICwgaXNBcnJheUl0ZXIgPSByZXF1aXJlKCcuL19pcy1hcnJheS1pdGVyJylcbiAgLCBhbk9iamVjdCAgICA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpXG4gICwgdG9MZW5ndGggICAgPSByZXF1aXJlKCcuL190by1sZW5ndGgnKVxuICAsIGdldEl0ZXJGbiAgID0gcmVxdWlyZSgnLi9jb3JlLmdldC1pdGVyYXRvci1tZXRob2QnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXRlcmFibGUsIGVudHJpZXMsIGZuLCB0aGF0LCBJVEVSQVRPUil7XG4gIHZhciBpdGVyRm4gPSBJVEVSQVRPUiA/IGZ1bmN0aW9uKCl7IHJldHVybiBpdGVyYWJsZTsgfSA6IGdldEl0ZXJGbihpdGVyYWJsZSlcbiAgICAsIGYgICAgICA9IGN0eChmbiwgdGhhdCwgZW50cmllcyA/IDIgOiAxKVxuICAgICwgaW5kZXggID0gMFxuICAgICwgbGVuZ3RoLCBzdGVwLCBpdGVyYXRvcjtcbiAgaWYodHlwZW9mIGl0ZXJGbiAhPSAnZnVuY3Rpb24nKXRocm93IFR5cGVFcnJvcihpdGVyYWJsZSArICcgaXMgbm90IGl0ZXJhYmxlIScpO1xuICAvLyBmYXN0IGNhc2UgZm9yIGFycmF5cyB3aXRoIGRlZmF1bHQgaXRlcmF0b3JcbiAgaWYoaXNBcnJheUl0ZXIoaXRlckZuKSlmb3IobGVuZ3RoID0gdG9MZW5ndGgoaXRlcmFibGUubGVuZ3RoKTsgbGVuZ3RoID4gaW5kZXg7IGluZGV4Kyspe1xuICAgIGVudHJpZXMgPyBmKGFuT2JqZWN0KHN0ZXAgPSBpdGVyYWJsZVtpbmRleF0pWzBdLCBzdGVwWzFdKSA6IGYoaXRlcmFibGVbaW5kZXhdKTtcbiAgfSBlbHNlIGZvcihpdGVyYXRvciA9IGl0ZXJGbi5jYWxsKGl0ZXJhYmxlKTsgIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lOyApe1xuICAgIGNhbGwoaXRlcmF0b3IsIGYsIHN0ZXAudmFsdWUsIGVudHJpZXMpO1xuICB9XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19mb3Itb2YuanNcbiAqKiBtb2R1bGUgaWQgPSAyMDJcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDcuMy4yMCBTcGVjaWVzQ29uc3RydWN0b3IoTywgZGVmYXVsdENvbnN0cnVjdG9yKVxudmFyIGFuT2JqZWN0ICA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpXG4gICwgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpXG4gICwgU1BFQ0lFUyAgID0gcmVxdWlyZSgnLi9fd2tzJykoJ3NwZWNpZXMnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oTywgRCl7XG4gIHZhciBDID0gYW5PYmplY3QoTykuY29uc3RydWN0b3IsIFM7XG4gIHJldHVybiBDID09PSB1bmRlZmluZWQgfHwgKFMgPSBhbk9iamVjdChDKVtTUEVDSUVTXSkgPT0gdW5kZWZpbmVkID8gRCA6IGFGdW5jdGlvbihTKTtcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX3NwZWNpZXMtY29uc3RydWN0b3IuanNcbiAqKiBtb2R1bGUgaWQgPSAyMDNcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBjdHggICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19jdHgnKVxuICAsIGludm9rZSAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2ludm9rZScpXG4gICwgaHRtbCAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9faHRtbCcpXG4gICwgY2VsICAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fZG9tLWNyZWF0ZScpXG4gICwgZ2xvYmFsICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fZ2xvYmFsJylcbiAgLCBwcm9jZXNzICAgICAgICAgICAgPSBnbG9iYWwucHJvY2Vzc1xuICAsIHNldFRhc2sgICAgICAgICAgICA9IGdsb2JhbC5zZXRJbW1lZGlhdGVcbiAgLCBjbGVhclRhc2sgICAgICAgICAgPSBnbG9iYWwuY2xlYXJJbW1lZGlhdGVcbiAgLCBNZXNzYWdlQ2hhbm5lbCAgICAgPSBnbG9iYWwuTWVzc2FnZUNoYW5uZWxcbiAgLCBjb3VudGVyICAgICAgICAgICAgPSAwXG4gICwgcXVldWUgICAgICAgICAgICAgID0ge31cbiAgLCBPTlJFQURZU1RBVEVDSEFOR0UgPSAnb25yZWFkeXN0YXRlY2hhbmdlJ1xuICAsIGRlZmVyLCBjaGFubmVsLCBwb3J0O1xudmFyIHJ1biA9IGZ1bmN0aW9uKCl7XG4gIHZhciBpZCA9ICt0aGlzO1xuICBpZihxdWV1ZS5oYXNPd25Qcm9wZXJ0eShpZCkpe1xuICAgIHZhciBmbiA9IHF1ZXVlW2lkXTtcbiAgICBkZWxldGUgcXVldWVbaWRdO1xuICAgIGZuKCk7XG4gIH1cbn07XG52YXIgbGlzdGVuZXIgPSBmdW5jdGlvbihldmVudCl7XG4gIHJ1bi5jYWxsKGV2ZW50LmRhdGEpO1xufTtcbi8vIE5vZGUuanMgMC45KyAmIElFMTArIGhhcyBzZXRJbW1lZGlhdGUsIG90aGVyd2lzZTpcbmlmKCFzZXRUYXNrIHx8ICFjbGVhclRhc2spe1xuICBzZXRUYXNrID0gZnVuY3Rpb24gc2V0SW1tZWRpYXRlKGZuKXtcbiAgICB2YXIgYXJncyA9IFtdLCBpID0gMTtcbiAgICB3aGlsZShhcmd1bWVudHMubGVuZ3RoID4gaSlhcmdzLnB1c2goYXJndW1lbnRzW2krK10pO1xuICAgIHF1ZXVlWysrY291bnRlcl0gPSBmdW5jdGlvbigpe1xuICAgICAgaW52b2tlKHR5cGVvZiBmbiA9PSAnZnVuY3Rpb24nID8gZm4gOiBGdW5jdGlvbihmbiksIGFyZ3MpO1xuICAgIH07XG4gICAgZGVmZXIoY291bnRlcik7XG4gICAgcmV0dXJuIGNvdW50ZXI7XG4gIH07XG4gIGNsZWFyVGFzayA9IGZ1bmN0aW9uIGNsZWFySW1tZWRpYXRlKGlkKXtcbiAgICBkZWxldGUgcXVldWVbaWRdO1xuICB9O1xuICAvLyBOb2RlLmpzIDAuOC1cbiAgaWYocmVxdWlyZSgnLi9fY29mJykocHJvY2VzcykgPT0gJ3Byb2Nlc3MnKXtcbiAgICBkZWZlciA9IGZ1bmN0aW9uKGlkKXtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soY3R4KHJ1biwgaWQsIDEpKTtcbiAgICB9O1xuICAvLyBCcm93c2VycyB3aXRoIE1lc3NhZ2VDaGFubmVsLCBpbmNsdWRlcyBXZWJXb3JrZXJzXG4gIH0gZWxzZSBpZihNZXNzYWdlQ2hhbm5lbCl7XG4gICAgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbDtcbiAgICBwb3J0ICAgID0gY2hhbm5lbC5wb3J0MjtcbiAgICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IGxpc3RlbmVyO1xuICAgIGRlZmVyID0gY3R4KHBvcnQucG9zdE1lc3NhZ2UsIHBvcnQsIDEpO1xuICAvLyBCcm93c2VycyB3aXRoIHBvc3RNZXNzYWdlLCBza2lwIFdlYldvcmtlcnNcbiAgLy8gSUU4IGhhcyBwb3N0TWVzc2FnZSwgYnV0IGl0J3Mgc3luYyAmIHR5cGVvZiBpdHMgcG9zdE1lc3NhZ2UgaXMgJ29iamVjdCdcbiAgfSBlbHNlIGlmKGdsb2JhbC5hZGRFdmVudExpc3RlbmVyICYmIHR5cGVvZiBwb3N0TWVzc2FnZSA9PSAnZnVuY3Rpb24nICYmICFnbG9iYWwuaW1wb3J0U2NyaXB0cyl7XG4gICAgZGVmZXIgPSBmdW5jdGlvbihpZCl7XG4gICAgICBnbG9iYWwucG9zdE1lc3NhZ2UoaWQgKyAnJywgJyonKTtcbiAgICB9O1xuICAgIGdsb2JhbC5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgbGlzdGVuZXIsIGZhbHNlKTtcbiAgLy8gSUU4LVxuICB9IGVsc2UgaWYoT05SRUFEWVNUQVRFQ0hBTkdFIGluIGNlbCgnc2NyaXB0Jykpe1xuICAgIGRlZmVyID0gZnVuY3Rpb24oaWQpe1xuICAgICAgaHRtbC5hcHBlbmRDaGlsZChjZWwoJ3NjcmlwdCcpKVtPTlJFQURZU1RBVEVDSEFOR0VdID0gZnVuY3Rpb24oKXtcbiAgICAgICAgaHRtbC5yZW1vdmVDaGlsZCh0aGlzKTtcbiAgICAgICAgcnVuLmNhbGwoaWQpO1xuICAgICAgfTtcbiAgICB9O1xuICAvLyBSZXN0IG9sZCBicm93c2Vyc1xuICB9IGVsc2Uge1xuICAgIGRlZmVyID0gZnVuY3Rpb24oaWQpe1xuICAgICAgc2V0VGltZW91dChjdHgocnVuLCBpZCwgMSksIDApO1xuICAgIH07XG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0ge1xuICBzZXQ6ICAgc2V0VGFzayxcbiAgY2xlYXI6IGNsZWFyVGFza1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fdGFzay5qc1xuICoqIG1vZHVsZSBpZCA9IDIwNFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwidmFyIGdsb2JhbCAgICA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpXG4gICwgbWFjcm90YXNrID0gcmVxdWlyZSgnLi9fdGFzaycpLnNldFxuICAsIE9ic2VydmVyICA9IGdsb2JhbC5NdXRhdGlvbk9ic2VydmVyIHx8IGdsb2JhbC5XZWJLaXRNdXRhdGlvbk9ic2VydmVyXG4gICwgcHJvY2VzcyAgID0gZ2xvYmFsLnByb2Nlc3NcbiAgLCBQcm9taXNlICAgPSBnbG9iYWwuUHJvbWlzZVxuICAsIGlzTm9kZSAgICA9IHJlcXVpcmUoJy4vX2NvZicpKHByb2Nlc3MpID09ICdwcm9jZXNzJ1xuICAsIGhlYWQsIGxhc3QsIG5vdGlmeTtcblxudmFyIGZsdXNoID0gZnVuY3Rpb24oKXtcbiAgdmFyIHBhcmVudCwgZm47XG4gIGlmKGlzTm9kZSAmJiAocGFyZW50ID0gcHJvY2Vzcy5kb21haW4pKXBhcmVudC5leGl0KCk7XG4gIHdoaWxlKGhlYWQpe1xuICAgIGZuID0gaGVhZC5mbjtcbiAgICBmbigpOyAvLyA8LSBjdXJyZW50bHkgd2UgdXNlIGl0IG9ubHkgZm9yIFByb21pc2UgLSB0cnkgLyBjYXRjaCBub3QgcmVxdWlyZWRcbiAgICBoZWFkID0gaGVhZC5uZXh0O1xuICB9IGxhc3QgPSB1bmRlZmluZWQ7XG4gIGlmKHBhcmVudClwYXJlbnQuZW50ZXIoKTtcbn07XG5cbi8vIE5vZGUuanNcbmlmKGlzTm9kZSl7XG4gIG5vdGlmeSA9IGZ1bmN0aW9uKCl7XG4gICAgcHJvY2Vzcy5uZXh0VGljayhmbHVzaCk7XG4gIH07XG4vLyBicm93c2VycyB3aXRoIE11dGF0aW9uT2JzZXJ2ZXJcbn0gZWxzZSBpZihPYnNlcnZlcil7XG4gIHZhciB0b2dnbGUgPSB0cnVlXG4gICAgLCBub2RlICAgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnJyk7XG4gIG5ldyBPYnNlcnZlcihmbHVzaCkub2JzZXJ2ZShub2RlLCB7Y2hhcmFjdGVyRGF0YTogdHJ1ZX0pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ld1xuICBub3RpZnkgPSBmdW5jdGlvbigpe1xuICAgIG5vZGUuZGF0YSA9IHRvZ2dsZSA9ICF0b2dnbGU7XG4gIH07XG4vLyBlbnZpcm9ubWVudHMgd2l0aCBtYXliZSBub24tY29tcGxldGVseSBjb3JyZWN0LCBidXQgZXhpc3RlbnQgUHJvbWlzZVxufSBlbHNlIGlmKFByb21pc2UgJiYgUHJvbWlzZS5yZXNvbHZlKXtcbiAgbm90aWZ5ID0gZnVuY3Rpb24oKXtcbiAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKGZsdXNoKTtcbiAgfTtcbi8vIGZvciBvdGhlciBlbnZpcm9ubWVudHMgLSBtYWNyb3Rhc2sgYmFzZWQgb246XG4vLyAtIHNldEltbWVkaWF0ZVxuLy8gLSBNZXNzYWdlQ2hhbm5lbFxuLy8gLSB3aW5kb3cucG9zdE1lc3NhZ1xuLy8gLSBvbnJlYWR5c3RhdGVjaGFuZ2Vcbi8vIC0gc2V0VGltZW91dFxufSBlbHNlIHtcbiAgbm90aWZ5ID0gZnVuY3Rpb24oKXtcbiAgICAvLyBzdHJhbmdlIElFICsgd2VicGFjayBkZXYgc2VydmVyIGJ1ZyAtIHVzZSAuY2FsbChnbG9iYWwpXG4gICAgbWFjcm90YXNrLmNhbGwoZ2xvYmFsLCBmbHVzaCk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oZm4pe1xuICB2YXIgdGFzayA9IHtmbjogZm4sIG5leHQ6IHVuZGVmaW5lZH07XG4gIGlmKGxhc3QpbGFzdC5uZXh0ID0gdGFzaztcbiAgaWYoIWhlYWQpe1xuICAgIGhlYWQgPSB0YXNrO1xuICAgIG5vdGlmeSgpO1xuICB9IGxhc3QgPSB0YXNrO1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fbWljcm90YXNrLmpzXG4gKiogbW9kdWxlIGlkID0gMjA1XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuL19yZWRlZmluZScpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbih0YXJnZXQsIHNyYywgc2FmZSl7XG4gIGZvcih2YXIga2V5IGluIHNyYylyZWRlZmluZSh0YXJnZXQsIGtleSwgc3JjW2tleV0sIHNhZmUpO1xuICByZXR1cm4gdGFyZ2V0O1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fcmVkZWZpbmUtYWxsLmpzXG4gKiogbW9kdWxlIGlkID0gMjA2XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG52YXIgc3Ryb25nID0gcmVxdWlyZSgnLi9fY29sbGVjdGlvbi1zdHJvbmcnKTtcblxuLy8gMjMuMSBNYXAgT2JqZWN0c1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19jb2xsZWN0aW9uJykoJ01hcCcsIGZ1bmN0aW9uKGdldCl7XG4gIHJldHVybiBmdW5jdGlvbiBNYXAoKXsgcmV0dXJuIGdldCh0aGlzLCBhcmd1bWVudHMubGVuZ3RoID4gMCA/IGFyZ3VtZW50c1swXSA6IHVuZGVmaW5lZCk7IH07XG59LCB7XG4gIC8vIDIzLjEuMy42IE1hcC5wcm90b3R5cGUuZ2V0KGtleSlcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoa2V5KXtcbiAgICB2YXIgZW50cnkgPSBzdHJvbmcuZ2V0RW50cnkodGhpcywga2V5KTtcbiAgICByZXR1cm4gZW50cnkgJiYgZW50cnkudjtcbiAgfSxcbiAgLy8gMjMuMS4zLjkgTWFwLnByb3RvdHlwZS5zZXQoa2V5LCB2YWx1ZSlcbiAgc2V0OiBmdW5jdGlvbiBzZXQoa2V5LCB2YWx1ZSl7XG4gICAgcmV0dXJuIHN0cm9uZy5kZWYodGhpcywga2V5ID09PSAwID8gMCA6IGtleSwgdmFsdWUpO1xuICB9XG59LCBzdHJvbmcsIHRydWUpO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5tYXAuanNcbiAqKiBtb2R1bGUgaWQgPSAyMDdcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0JztcbnZhciBkUCAgICAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpLmZcbiAgLCBjcmVhdGUgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1jcmVhdGUnKVxuICAsIGhpZGUgICAgICAgID0gcmVxdWlyZSgnLi9faGlkZScpXG4gICwgcmVkZWZpbmVBbGwgPSByZXF1aXJlKCcuL19yZWRlZmluZS1hbGwnKVxuICAsIGN0eCAgICAgICAgID0gcmVxdWlyZSgnLi9fY3R4JylcbiAgLCBhbkluc3RhbmNlICA9IHJlcXVpcmUoJy4vX2FuLWluc3RhbmNlJylcbiAgLCBkZWZpbmVkICAgICA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKVxuICAsIGZvck9mICAgICAgID0gcmVxdWlyZSgnLi9fZm9yLW9mJylcbiAgLCAkaXRlckRlZmluZSA9IHJlcXVpcmUoJy4vX2l0ZXItZGVmaW5lJylcbiAgLCBzdGVwICAgICAgICA9IHJlcXVpcmUoJy4vX2l0ZXItc3RlcCcpXG4gICwgc2V0U3BlY2llcyAgPSByZXF1aXJlKCcuL19zZXQtc3BlY2llcycpXG4gICwgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpXG4gICwgZmFzdEtleSAgICAgPSByZXF1aXJlKCcuL19tZXRhJykuZmFzdEtleVxuICAsIFNJWkUgICAgICAgID0gREVTQ1JJUFRPUlMgPyAnX3MnIDogJ3NpemUnO1xuXG52YXIgZ2V0RW50cnkgPSBmdW5jdGlvbih0aGF0LCBrZXkpe1xuICAvLyBmYXN0IGNhc2VcbiAgdmFyIGluZGV4ID0gZmFzdEtleShrZXkpLCBlbnRyeTtcbiAgaWYoaW5kZXggIT09ICdGJylyZXR1cm4gdGhhdC5faVtpbmRleF07XG4gIC8vIGZyb3plbiBvYmplY3QgY2FzZVxuICBmb3IoZW50cnkgPSB0aGF0Ll9mOyBlbnRyeTsgZW50cnkgPSBlbnRyeS5uKXtcbiAgICBpZihlbnRyeS5rID09IGtleSlyZXR1cm4gZW50cnk7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBnZXRDb25zdHJ1Y3RvcjogZnVuY3Rpb24od3JhcHBlciwgTkFNRSwgSVNfTUFQLCBBRERFUil7XG4gICAgdmFyIEMgPSB3cmFwcGVyKGZ1bmN0aW9uKHRoYXQsIGl0ZXJhYmxlKXtcbiAgICAgIGFuSW5zdGFuY2UodGhhdCwgQywgTkFNRSwgJ19pJyk7XG4gICAgICB0aGF0Ll9pID0gY3JlYXRlKG51bGwpOyAvLyBpbmRleFxuICAgICAgdGhhdC5fZiA9IHVuZGVmaW5lZDsgICAgLy8gZmlyc3QgZW50cnlcbiAgICAgIHRoYXQuX2wgPSB1bmRlZmluZWQ7ICAgIC8vIGxhc3QgZW50cnlcbiAgICAgIHRoYXRbU0laRV0gPSAwOyAgICAgICAgIC8vIHNpemVcbiAgICAgIGlmKGl0ZXJhYmxlICE9IHVuZGVmaW5lZClmb3JPZihpdGVyYWJsZSwgSVNfTUFQLCB0aGF0W0FEREVSXSwgdGhhdCk7XG4gICAgfSk7XG4gICAgcmVkZWZpbmVBbGwoQy5wcm90b3R5cGUsIHtcbiAgICAgIC8vIDIzLjEuMy4xIE1hcC5wcm90b3R5cGUuY2xlYXIoKVxuICAgICAgLy8gMjMuMi4zLjIgU2V0LnByb3RvdHlwZS5jbGVhcigpXG4gICAgICBjbGVhcjogZnVuY3Rpb24gY2xlYXIoKXtcbiAgICAgICAgZm9yKHZhciB0aGF0ID0gdGhpcywgZGF0YSA9IHRoYXQuX2ksIGVudHJ5ID0gdGhhdC5fZjsgZW50cnk7IGVudHJ5ID0gZW50cnkubil7XG4gICAgICAgICAgZW50cnkuciA9IHRydWU7XG4gICAgICAgICAgaWYoZW50cnkucCllbnRyeS5wID0gZW50cnkucC5uID0gdW5kZWZpbmVkO1xuICAgICAgICAgIGRlbGV0ZSBkYXRhW2VudHJ5LmldO1xuICAgICAgICB9XG4gICAgICAgIHRoYXQuX2YgPSB0aGF0Ll9sID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGF0W1NJWkVdID0gMDtcbiAgICAgIH0sXG4gICAgICAvLyAyMy4xLjMuMyBNYXAucHJvdG90eXBlLmRlbGV0ZShrZXkpXG4gICAgICAvLyAyMy4yLjMuNCBTZXQucHJvdG90eXBlLmRlbGV0ZSh2YWx1ZSlcbiAgICAgICdkZWxldGUnOiBmdW5jdGlvbihrZXkpe1xuICAgICAgICB2YXIgdGhhdCAgPSB0aGlzXG4gICAgICAgICAgLCBlbnRyeSA9IGdldEVudHJ5KHRoYXQsIGtleSk7XG4gICAgICAgIGlmKGVudHJ5KXtcbiAgICAgICAgICB2YXIgbmV4dCA9IGVudHJ5Lm5cbiAgICAgICAgICAgICwgcHJldiA9IGVudHJ5LnA7XG4gICAgICAgICAgZGVsZXRlIHRoYXQuX2lbZW50cnkuaV07XG4gICAgICAgICAgZW50cnkuciA9IHRydWU7XG4gICAgICAgICAgaWYocHJldilwcmV2Lm4gPSBuZXh0O1xuICAgICAgICAgIGlmKG5leHQpbmV4dC5wID0gcHJldjtcbiAgICAgICAgICBpZih0aGF0Ll9mID09IGVudHJ5KXRoYXQuX2YgPSBuZXh0O1xuICAgICAgICAgIGlmKHRoYXQuX2wgPT0gZW50cnkpdGhhdC5fbCA9IHByZXY7XG4gICAgICAgICAgdGhhdFtTSVpFXS0tO1xuICAgICAgICB9IHJldHVybiAhIWVudHJ5O1xuICAgICAgfSxcbiAgICAgIC8vIDIzLjIuMy42IFNldC5wcm90b3R5cGUuZm9yRWFjaChjYWxsYmFja2ZuLCB0aGlzQXJnID0gdW5kZWZpbmVkKVxuICAgICAgLy8gMjMuMS4zLjUgTWFwLnByb3RvdHlwZS5mb3JFYWNoKGNhbGxiYWNrZm4sIHRoaXNBcmcgPSB1bmRlZmluZWQpXG4gICAgICBmb3JFYWNoOiBmdW5jdGlvbiBmb3JFYWNoKGNhbGxiYWNrZm4gLyosIHRoYXQgPSB1bmRlZmluZWQgKi8pe1xuICAgICAgICBhbkluc3RhbmNlKHRoaXMsIEMsICdmb3JFYWNoJyk7XG4gICAgICAgIHZhciBmID0gY3R4KGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkLCAzKVxuICAgICAgICAgICwgZW50cnk7XG4gICAgICAgIHdoaWxlKGVudHJ5ID0gZW50cnkgPyBlbnRyeS5uIDogdGhpcy5fZil7XG4gICAgICAgICAgZihlbnRyeS52LCBlbnRyeS5rLCB0aGlzKTtcbiAgICAgICAgICAvLyByZXZlcnQgdG8gdGhlIGxhc3QgZXhpc3RpbmcgZW50cnlcbiAgICAgICAgICB3aGlsZShlbnRyeSAmJiBlbnRyeS5yKWVudHJ5ID0gZW50cnkucDtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8vIDIzLjEuMy43IE1hcC5wcm90b3R5cGUuaGFzKGtleSlcbiAgICAgIC8vIDIzLjIuMy43IFNldC5wcm90b3R5cGUuaGFzKHZhbHVlKVxuICAgICAgaGFzOiBmdW5jdGlvbiBoYXMoa2V5KXtcbiAgICAgICAgcmV0dXJuICEhZ2V0RW50cnkodGhpcywga2V5KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZihERVNDUklQVE9SUylkUChDLnByb3RvdHlwZSwgJ3NpemUnLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uKCl7XG4gICAgICAgIHJldHVybiBkZWZpbmVkKHRoaXNbU0laRV0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBDO1xuICB9LFxuICBkZWY6IGZ1bmN0aW9uKHRoYXQsIGtleSwgdmFsdWUpe1xuICAgIHZhciBlbnRyeSA9IGdldEVudHJ5KHRoYXQsIGtleSlcbiAgICAgICwgcHJldiwgaW5kZXg7XG4gICAgLy8gY2hhbmdlIGV4aXN0aW5nIGVudHJ5XG4gICAgaWYoZW50cnkpe1xuICAgICAgZW50cnkudiA9IHZhbHVlO1xuICAgIC8vIGNyZWF0ZSBuZXcgZW50cnlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhhdC5fbCA9IGVudHJ5ID0ge1xuICAgICAgICBpOiBpbmRleCA9IGZhc3RLZXkoa2V5LCB0cnVlKSwgLy8gPC0gaW5kZXhcbiAgICAgICAgazoga2V5LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIDwtIGtleVxuICAgICAgICB2OiB2YWx1ZSwgICAgICAgICAgICAgICAgICAgICAgLy8gPC0gdmFsdWVcbiAgICAgICAgcDogcHJldiA9IHRoYXQuX2wsICAgICAgICAgICAgIC8vIDwtIHByZXZpb3VzIGVudHJ5XG4gICAgICAgIG46IHVuZGVmaW5lZCwgICAgICAgICAgICAgICAgICAvLyA8LSBuZXh0IGVudHJ5XG4gICAgICAgIHI6IGZhbHNlICAgICAgICAgICAgICAgICAgICAgICAvLyA8LSByZW1vdmVkXG4gICAgICB9O1xuICAgICAgaWYoIXRoYXQuX2YpdGhhdC5fZiA9IGVudHJ5O1xuICAgICAgaWYocHJldilwcmV2Lm4gPSBlbnRyeTtcbiAgICAgIHRoYXRbU0laRV0rKztcbiAgICAgIC8vIGFkZCB0byBpbmRleFxuICAgICAgaWYoaW5kZXggIT09ICdGJyl0aGF0Ll9pW2luZGV4XSA9IGVudHJ5O1xuICAgIH0gcmV0dXJuIHRoYXQ7XG4gIH0sXG4gIGdldEVudHJ5OiBnZXRFbnRyeSxcbiAgc2V0U3Ryb25nOiBmdW5jdGlvbihDLCBOQU1FLCBJU19NQVApe1xuICAgIC8vIGFkZCAua2V5cywgLnZhbHVlcywgLmVudHJpZXMsIFtAQGl0ZXJhdG9yXVxuICAgIC8vIDIzLjEuMy40LCAyMy4xLjMuOCwgMjMuMS4zLjExLCAyMy4xLjMuMTIsIDIzLjIuMy41LCAyMy4yLjMuOCwgMjMuMi4zLjEwLCAyMy4yLjMuMTFcbiAgICAkaXRlckRlZmluZShDLCBOQU1FLCBmdW5jdGlvbihpdGVyYXRlZCwga2luZCl7XG4gICAgICB0aGlzLl90ID0gaXRlcmF0ZWQ7ICAvLyB0YXJnZXRcbiAgICAgIHRoaXMuX2sgPSBraW5kOyAgICAgIC8vIGtpbmRcbiAgICAgIHRoaXMuX2wgPSB1bmRlZmluZWQ7IC8vIHByZXZpb3VzXG4gICAgfSwgZnVuY3Rpb24oKXtcbiAgICAgIHZhciB0aGF0ICA9IHRoaXNcbiAgICAgICAgLCBraW5kICA9IHRoYXQuX2tcbiAgICAgICAgLCBlbnRyeSA9IHRoYXQuX2w7XG4gICAgICAvLyByZXZlcnQgdG8gdGhlIGxhc3QgZXhpc3RpbmcgZW50cnlcbiAgICAgIHdoaWxlKGVudHJ5ICYmIGVudHJ5LnIpZW50cnkgPSBlbnRyeS5wO1xuICAgICAgLy8gZ2V0IG5leHQgZW50cnlcbiAgICAgIGlmKCF0aGF0Ll90IHx8ICEodGhhdC5fbCA9IGVudHJ5ID0gZW50cnkgPyBlbnRyeS5uIDogdGhhdC5fdC5fZikpe1xuICAgICAgICAvLyBvciBmaW5pc2ggdGhlIGl0ZXJhdGlvblxuICAgICAgICB0aGF0Ll90ID0gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gc3RlcCgxKTtcbiAgICAgIH1cbiAgICAgIC8vIHJldHVybiBzdGVwIGJ5IGtpbmRcbiAgICAgIGlmKGtpbmQgPT0gJ2tleXMnICApcmV0dXJuIHN0ZXAoMCwgZW50cnkuayk7XG4gICAgICBpZihraW5kID09ICd2YWx1ZXMnKXJldHVybiBzdGVwKDAsIGVudHJ5LnYpO1xuICAgICAgcmV0dXJuIHN0ZXAoMCwgW2VudHJ5LmssIGVudHJ5LnZdKTtcbiAgICB9LCBJU19NQVAgPyAnZW50cmllcycgOiAndmFsdWVzJyAsICFJU19NQVAsIHRydWUpO1xuXG4gICAgLy8gYWRkIFtAQHNwZWNpZXNdLCAyMy4xLjIuMiwgMjMuMi4yLjJcbiAgICBzZXRTcGVjaWVzKE5BTUUpO1xuICB9XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19jb2xsZWN0aW9uLXN0cm9uZy5qc1xuICoqIG1vZHVsZSBpZCA9IDIwOFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbCAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fZ2xvYmFsJylcbiAgLCAkZXhwb3J0ICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICwgcmVkZWZpbmUgICAgICAgICAgPSByZXF1aXJlKCcuL19yZWRlZmluZScpXG4gICwgcmVkZWZpbmVBbGwgICAgICAgPSByZXF1aXJlKCcuL19yZWRlZmluZS1hbGwnKVxuICAsIG1ldGEgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fbWV0YScpXG4gICwgZm9yT2YgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19mb3Itb2YnKVxuICAsIGFuSW5zdGFuY2UgICAgICAgID0gcmVxdWlyZSgnLi9fYW4taW5zdGFuY2UnKVxuICAsIGlzT2JqZWN0ICAgICAgICAgID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0JylcbiAgLCBmYWlscyAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2ZhaWxzJylcbiAgLCAkaXRlckRldGVjdCAgICAgICA9IHJlcXVpcmUoJy4vX2l0ZXItZGV0ZWN0JylcbiAgLCBzZXRUb1N0cmluZ1RhZyAgICA9IHJlcXVpcmUoJy4vX3NldC10by1zdHJpbmctdGFnJylcbiAgLCBpbmhlcml0SWZSZXF1aXJlZCA9IHJlcXVpcmUoJy4vX2luaGVyaXQtaWYtcmVxdWlyZWQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihOQU1FLCB3cmFwcGVyLCBtZXRob2RzLCBjb21tb24sIElTX01BUCwgSVNfV0VBSyl7XG4gIHZhciBCYXNlICA9IGdsb2JhbFtOQU1FXVxuICAgICwgQyAgICAgPSBCYXNlXG4gICAgLCBBRERFUiA9IElTX01BUCA/ICdzZXQnIDogJ2FkZCdcbiAgICAsIHByb3RvID0gQyAmJiBDLnByb3RvdHlwZVxuICAgICwgTyAgICAgPSB7fTtcbiAgdmFyIGZpeE1ldGhvZCA9IGZ1bmN0aW9uKEtFWSl7XG4gICAgdmFyIGZuID0gcHJvdG9bS0VZXTtcbiAgICByZWRlZmluZShwcm90bywgS0VZLFxuICAgICAgS0VZID09ICdkZWxldGUnID8gZnVuY3Rpb24oYSl7XG4gICAgICAgIHJldHVybiBJU19XRUFLICYmICFpc09iamVjdChhKSA/IGZhbHNlIDogZm4uY2FsbCh0aGlzLCBhID09PSAwID8gMCA6IGEpO1xuICAgICAgfSA6IEtFWSA9PSAnaGFzJyA/IGZ1bmN0aW9uIGhhcyhhKXtcbiAgICAgICAgcmV0dXJuIElTX1dFQUsgJiYgIWlzT2JqZWN0KGEpID8gZmFsc2UgOiBmbi5jYWxsKHRoaXMsIGEgPT09IDAgPyAwIDogYSk7XG4gICAgICB9IDogS0VZID09ICdnZXQnID8gZnVuY3Rpb24gZ2V0KGEpe1xuICAgICAgICByZXR1cm4gSVNfV0VBSyAmJiAhaXNPYmplY3QoYSkgPyB1bmRlZmluZWQgOiBmbi5jYWxsKHRoaXMsIGEgPT09IDAgPyAwIDogYSk7XG4gICAgICB9IDogS0VZID09ICdhZGQnID8gZnVuY3Rpb24gYWRkKGEpeyBmbi5jYWxsKHRoaXMsIGEgPT09IDAgPyAwIDogYSk7IHJldHVybiB0aGlzOyB9XG4gICAgICAgIDogZnVuY3Rpb24gc2V0KGEsIGIpeyBmbi5jYWxsKHRoaXMsIGEgPT09IDAgPyAwIDogYSwgYik7IHJldHVybiB0aGlzOyB9XG4gICAgKTtcbiAgfTtcbiAgaWYodHlwZW9mIEMgIT0gJ2Z1bmN0aW9uJyB8fCAhKElTX1dFQUsgfHwgcHJvdG8uZm9yRWFjaCAmJiAhZmFpbHMoZnVuY3Rpb24oKXtcbiAgICBuZXcgQygpLmVudHJpZXMoKS5uZXh0KCk7XG4gIH0pKSl7XG4gICAgLy8gY3JlYXRlIGNvbGxlY3Rpb24gY29uc3RydWN0b3JcbiAgICBDID0gY29tbW9uLmdldENvbnN0cnVjdG9yKHdyYXBwZXIsIE5BTUUsIElTX01BUCwgQURERVIpO1xuICAgIHJlZGVmaW5lQWxsKEMucHJvdG90eXBlLCBtZXRob2RzKTtcbiAgICBtZXRhLk5FRUQgPSB0cnVlO1xuICB9IGVsc2Uge1xuICAgIHZhciBpbnN0YW5jZSAgICAgICAgICAgICA9IG5ldyBDXG4gICAgICAvLyBlYXJseSBpbXBsZW1lbnRhdGlvbnMgbm90IHN1cHBvcnRzIGNoYWluaW5nXG4gICAgICAsIEhBU05UX0NIQUlOSU5HICAgICAgID0gaW5zdGFuY2VbQURERVJdKElTX1dFQUsgPyB7fSA6IC0wLCAxKSAhPSBpbnN0YW5jZVxuICAgICAgLy8gVjggfiAgQ2hyb21pdW0gNDAtIHdlYWstY29sbGVjdGlvbnMgdGhyb3dzIG9uIHByaW1pdGl2ZXMsIGJ1dCBzaG91bGQgcmV0dXJuIGZhbHNlXG4gICAgICAsIFRIUk9XU19PTl9QUklNSVRJVkVTID0gZmFpbHMoZnVuY3Rpb24oKXsgaW5zdGFuY2UuaGFzKDEpOyB9KVxuICAgICAgLy8gbW9zdCBlYXJseSBpbXBsZW1lbnRhdGlvbnMgZG9lc24ndCBzdXBwb3J0cyBpdGVyYWJsZXMsIG1vc3QgbW9kZXJuIC0gbm90IGNsb3NlIGl0IGNvcnJlY3RseVxuICAgICAgLCBBQ0NFUFRfSVRFUkFCTEVTICAgICA9ICRpdGVyRGV0ZWN0KGZ1bmN0aW9uKGl0ZXIpeyBuZXcgQyhpdGVyKTsgfSkgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXdcbiAgICAgIC8vIGZvciBlYXJseSBpbXBsZW1lbnRhdGlvbnMgLTAgYW5kICswIG5vdCB0aGUgc2FtZVxuICAgICAgLCBCVUdHWV9aRVJPID0gIUlTX1dFQUsgJiYgZmFpbHMoZnVuY3Rpb24oKXtcbiAgICAgICAgLy8gVjggfiBDaHJvbWl1bSA0Mi0gZmFpbHMgb25seSB3aXRoIDUrIGVsZW1lbnRzXG4gICAgICAgIHZhciAkaW5zdGFuY2UgPSBuZXcgQygpXG4gICAgICAgICAgLCBpbmRleCAgICAgPSA1O1xuICAgICAgICB3aGlsZShpbmRleC0tKSRpbnN0YW5jZVtBRERFUl0oaW5kZXgsIGluZGV4KTtcbiAgICAgICAgcmV0dXJuICEkaW5zdGFuY2UuaGFzKC0wKTtcbiAgICAgIH0pO1xuICAgIGlmKCFBQ0NFUFRfSVRFUkFCTEVTKXsgXG4gICAgICBDID0gd3JhcHBlcihmdW5jdGlvbih0YXJnZXQsIGl0ZXJhYmxlKXtcbiAgICAgICAgYW5JbnN0YW5jZSh0YXJnZXQsIEMsIE5BTUUpO1xuICAgICAgICB2YXIgdGhhdCA9IGluaGVyaXRJZlJlcXVpcmVkKG5ldyBCYXNlLCB0YXJnZXQsIEMpO1xuICAgICAgICBpZihpdGVyYWJsZSAhPSB1bmRlZmluZWQpZm9yT2YoaXRlcmFibGUsIElTX01BUCwgdGhhdFtBRERFUl0sIHRoYXQpO1xuICAgICAgICByZXR1cm4gdGhhdDtcbiAgICAgIH0pO1xuICAgICAgQy5wcm90b3R5cGUgPSBwcm90bztcbiAgICAgIHByb3RvLmNvbnN0cnVjdG9yID0gQztcbiAgICB9XG4gICAgaWYoVEhST1dTX09OX1BSSU1JVElWRVMgfHwgQlVHR1lfWkVSTyl7XG4gICAgICBmaXhNZXRob2QoJ2RlbGV0ZScpO1xuICAgICAgZml4TWV0aG9kKCdoYXMnKTtcbiAgICAgIElTX01BUCAmJiBmaXhNZXRob2QoJ2dldCcpO1xuICAgIH1cbiAgICBpZihCVUdHWV9aRVJPIHx8IEhBU05UX0NIQUlOSU5HKWZpeE1ldGhvZChBRERFUik7XG4gICAgLy8gd2VhayBjb2xsZWN0aW9ucyBzaG91bGQgbm90IGNvbnRhaW5zIC5jbGVhciBtZXRob2RcbiAgICBpZihJU19XRUFLICYmIHByb3RvLmNsZWFyKWRlbGV0ZSBwcm90by5jbGVhcjtcbiAgfVxuXG4gIHNldFRvU3RyaW5nVGFnKEMsIE5BTUUpO1xuXG4gIE9bTkFNRV0gPSBDO1xuICAkZXhwb3J0KCRleHBvcnQuRyArICRleHBvcnQuVyArICRleHBvcnQuRiAqIChDICE9IEJhc2UpLCBPKTtcblxuICBpZighSVNfV0VBSyljb21tb24uc2V0U3Ryb25nKEMsIE5BTUUsIElTX01BUCk7XG5cbiAgcmV0dXJuIEM7XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19jb2xsZWN0aW9uLmpzXG4gKiogbW9kdWxlIGlkID0gMjA5XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG52YXIgc3Ryb25nID0gcmVxdWlyZSgnLi9fY29sbGVjdGlvbi1zdHJvbmcnKTtcblxuLy8gMjMuMiBTZXQgT2JqZWN0c1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19jb2xsZWN0aW9uJykoJ1NldCcsIGZ1bmN0aW9uKGdldCl7XG4gIHJldHVybiBmdW5jdGlvbiBTZXQoKXsgcmV0dXJuIGdldCh0aGlzLCBhcmd1bWVudHMubGVuZ3RoID4gMCA/IGFyZ3VtZW50c1swXSA6IHVuZGVmaW5lZCk7IH07XG59LCB7XG4gIC8vIDIzLjIuMy4xIFNldC5wcm90b3R5cGUuYWRkKHZhbHVlKVxuICBhZGQ6IGZ1bmN0aW9uIGFkZCh2YWx1ZSl7XG4gICAgcmV0dXJuIHN0cm9uZy5kZWYodGhpcywgdmFsdWUgPSB2YWx1ZSA9PT0gMCA/IDAgOiB2YWx1ZSwgdmFsdWUpO1xuICB9XG59LCBzdHJvbmcpO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zZXQuanNcbiAqKiBtb2R1bGUgaWQgPSAyMTBcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0JztcbnZhciBlYWNoICAgICAgICAgPSByZXF1aXJlKCcuL19hcnJheS1tZXRob2RzJykoMClcbiAgLCByZWRlZmluZSAgICAgPSByZXF1aXJlKCcuL19yZWRlZmluZScpXG4gICwgbWV0YSAgICAgICAgID0gcmVxdWlyZSgnLi9fbWV0YScpXG4gICwgYXNzaWduICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWFzc2lnbicpXG4gICwgd2VhayAgICAgICAgID0gcmVxdWlyZSgnLi9fY29sbGVjdGlvbi13ZWFrJylcbiAgLCBpc09iamVjdCAgICAgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKVxuICAsIGhhcyAgICAgICAgICA9IHJlcXVpcmUoJy4vX2hhcycpXG4gICwgZ2V0V2VhayAgICAgID0gbWV0YS5nZXRXZWFrXG4gICwgaXNFeHRlbnNpYmxlID0gT2JqZWN0LmlzRXh0ZW5zaWJsZVxuICAsIHVuY2F1Z2h0RnJvemVuU3RvcmUgPSB3ZWFrLnVmc3RvcmVcbiAgLCB0bXAgICAgICAgICAgPSB7fVxuICAsIEludGVybmFsTWFwO1xuXG52YXIgd3JhcHBlciA9IGZ1bmN0aW9uKGdldCl7XG4gIHJldHVybiBmdW5jdGlvbiBXZWFrTWFwKCl7XG4gICAgcmV0dXJuIGdldCh0aGlzLCBhcmd1bWVudHMubGVuZ3RoID4gMCA/IGFyZ3VtZW50c1swXSA6IHVuZGVmaW5lZCk7XG4gIH07XG59O1xuXG52YXIgbWV0aG9kcyA9IHtcbiAgLy8gMjMuMy4zLjMgV2Vha01hcC5wcm90b3R5cGUuZ2V0KGtleSlcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoa2V5KXtcbiAgICBpZihpc09iamVjdChrZXkpKXtcbiAgICAgIHZhciBkYXRhID0gZ2V0V2VhayhrZXkpO1xuICAgICAgaWYoZGF0YSA9PT0gdHJ1ZSlyZXR1cm4gdW5jYXVnaHRGcm96ZW5TdG9yZSh0aGlzKS5nZXQoa2V5KTtcbiAgICAgIHJldHVybiBkYXRhID8gZGF0YVt0aGlzLl9pXSA6IHVuZGVmaW5lZDtcbiAgICB9XG4gIH0sXG4gIC8vIDIzLjMuMy41IFdlYWtNYXAucHJvdG90eXBlLnNldChrZXksIHZhbHVlKVxuICBzZXQ6IGZ1bmN0aW9uIHNldChrZXksIHZhbHVlKXtcbiAgICByZXR1cm4gd2Vhay5kZWYodGhpcywga2V5LCB2YWx1ZSk7XG4gIH1cbn07XG5cbi8vIDIzLjMgV2Vha01hcCBPYmplY3RzXG52YXIgJFdlYWtNYXAgPSBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2NvbGxlY3Rpb24nKSgnV2Vha01hcCcsIHdyYXBwZXIsIG1ldGhvZHMsIHdlYWssIHRydWUsIHRydWUpO1xuXG4vLyBJRTExIFdlYWtNYXAgZnJvemVuIGtleXMgZml4XG5pZihuZXcgJFdlYWtNYXAoKS5zZXQoKE9iamVjdC5mcmVlemUgfHwgT2JqZWN0KSh0bXApLCA3KS5nZXQodG1wKSAhPSA3KXtcbiAgSW50ZXJuYWxNYXAgPSB3ZWFrLmdldENvbnN0cnVjdG9yKHdyYXBwZXIpO1xuICBhc3NpZ24oSW50ZXJuYWxNYXAucHJvdG90eXBlLCBtZXRob2RzKTtcbiAgbWV0YS5ORUVEID0gdHJ1ZTtcbiAgZWFjaChbJ2RlbGV0ZScsICdoYXMnLCAnZ2V0JywgJ3NldCddLCBmdW5jdGlvbihrZXkpe1xuICAgIHZhciBwcm90byAgPSAkV2Vha01hcC5wcm90b3R5cGVcbiAgICAgICwgbWV0aG9kID0gcHJvdG9ba2V5XTtcbiAgICByZWRlZmluZShwcm90bywga2V5LCBmdW5jdGlvbihhLCBiKXtcbiAgICAgIC8vIHN0b3JlIGZyb3plbiBvYmplY3RzIG9uIGludGVybmFsIHdlYWttYXAgc2hpbVxuICAgICAgaWYoaXNPYmplY3QoYSkgJiYgIWlzRXh0ZW5zaWJsZShhKSl7XG4gICAgICAgIGlmKCF0aGlzLl9mKXRoaXMuX2YgPSBuZXcgSW50ZXJuYWxNYXA7XG4gICAgICAgIHZhciByZXN1bHQgPSB0aGlzLl9mW2tleV0oYSwgYik7XG4gICAgICAgIHJldHVybiBrZXkgPT0gJ3NldCcgPyB0aGlzIDogcmVzdWx0O1xuICAgICAgLy8gc3RvcmUgYWxsIHRoZSByZXN0IG9uIG5hdGl2ZSB3ZWFrbWFwXG4gICAgICB9IHJldHVybiBtZXRob2QuY2FsbCh0aGlzLCBhLCBiKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LndlYWstbWFwLmpzXG4gKiogbW9kdWxlIGlkID0gMjExXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG52YXIgcmVkZWZpbmVBbGwgICAgICAgPSByZXF1aXJlKCcuL19yZWRlZmluZS1hbGwnKVxuICAsIGdldFdlYWsgICAgICAgICAgID0gcmVxdWlyZSgnLi9fbWV0YScpLmdldFdlYWtcbiAgLCBhbk9iamVjdCAgICAgICAgICA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpXG4gICwgaXNPYmplY3QgICAgICAgICAgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKVxuICAsIGFuSW5zdGFuY2UgICAgICAgID0gcmVxdWlyZSgnLi9fYW4taW5zdGFuY2UnKVxuICAsIGZvck9mICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fZm9yLW9mJylcbiAgLCBjcmVhdGVBcnJheU1ldGhvZCA9IHJlcXVpcmUoJy4vX2FycmF5LW1ldGhvZHMnKVxuICAsICRoYXMgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9faGFzJylcbiAgLCBhcnJheUZpbmQgICAgICAgICA9IGNyZWF0ZUFycmF5TWV0aG9kKDUpXG4gICwgYXJyYXlGaW5kSW5kZXggICAgPSBjcmVhdGVBcnJheU1ldGhvZCg2KVxuICAsIGlkICAgICAgICAgICAgICAgID0gMDtcblxuLy8gZmFsbGJhY2sgZm9yIHVuY2F1Z2h0IGZyb3plbiBrZXlzXG52YXIgdW5jYXVnaHRGcm96ZW5TdG9yZSA9IGZ1bmN0aW9uKHRoYXQpe1xuICByZXR1cm4gdGhhdC5fbCB8fCAodGhhdC5fbCA9IG5ldyBVbmNhdWdodEZyb3plblN0b3JlKTtcbn07XG52YXIgVW5jYXVnaHRGcm96ZW5TdG9yZSA9IGZ1bmN0aW9uKCl7XG4gIHRoaXMuYSA9IFtdO1xufTtcbnZhciBmaW5kVW5jYXVnaHRGcm96ZW4gPSBmdW5jdGlvbihzdG9yZSwga2V5KXtcbiAgcmV0dXJuIGFycmF5RmluZChzdG9yZS5hLCBmdW5jdGlvbihpdCl7XG4gICAgcmV0dXJuIGl0WzBdID09PSBrZXk7XG4gIH0pO1xufTtcblVuY2F1Z2h0RnJvemVuU3RvcmUucHJvdG90eXBlID0ge1xuICBnZXQ6IGZ1bmN0aW9uKGtleSl7XG4gICAgdmFyIGVudHJ5ID0gZmluZFVuY2F1Z2h0RnJvemVuKHRoaXMsIGtleSk7XG4gICAgaWYoZW50cnkpcmV0dXJuIGVudHJ5WzFdO1xuICB9LFxuICBoYXM6IGZ1bmN0aW9uKGtleSl7XG4gICAgcmV0dXJuICEhZmluZFVuY2F1Z2h0RnJvemVuKHRoaXMsIGtleSk7XG4gIH0sXG4gIHNldDogZnVuY3Rpb24oa2V5LCB2YWx1ZSl7XG4gICAgdmFyIGVudHJ5ID0gZmluZFVuY2F1Z2h0RnJvemVuKHRoaXMsIGtleSk7XG4gICAgaWYoZW50cnkpZW50cnlbMV0gPSB2YWx1ZTtcbiAgICBlbHNlIHRoaXMuYS5wdXNoKFtrZXksIHZhbHVlXSk7XG4gIH0sXG4gICdkZWxldGUnOiBmdW5jdGlvbihrZXkpe1xuICAgIHZhciBpbmRleCA9IGFycmF5RmluZEluZGV4KHRoaXMuYSwgZnVuY3Rpb24oaXQpe1xuICAgICAgcmV0dXJuIGl0WzBdID09PSBrZXk7XG4gICAgfSk7XG4gICAgaWYofmluZGV4KXRoaXMuYS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIHJldHVybiAhIX5pbmRleDtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGdldENvbnN0cnVjdG9yOiBmdW5jdGlvbih3cmFwcGVyLCBOQU1FLCBJU19NQVAsIEFEREVSKXtcbiAgICB2YXIgQyA9IHdyYXBwZXIoZnVuY3Rpb24odGhhdCwgaXRlcmFibGUpe1xuICAgICAgYW5JbnN0YW5jZSh0aGF0LCBDLCBOQU1FLCAnX2knKTtcbiAgICAgIHRoYXQuX2kgPSBpZCsrOyAgICAgIC8vIGNvbGxlY3Rpb24gaWRcbiAgICAgIHRoYXQuX2wgPSB1bmRlZmluZWQ7IC8vIGxlYWsgc3RvcmUgZm9yIHVuY2F1Z2h0IGZyb3plbiBvYmplY3RzXG4gICAgICBpZihpdGVyYWJsZSAhPSB1bmRlZmluZWQpZm9yT2YoaXRlcmFibGUsIElTX01BUCwgdGhhdFtBRERFUl0sIHRoYXQpO1xuICAgIH0pO1xuICAgIHJlZGVmaW5lQWxsKEMucHJvdG90eXBlLCB7XG4gICAgICAvLyAyMy4zLjMuMiBXZWFrTWFwLnByb3RvdHlwZS5kZWxldGUoa2V5KVxuICAgICAgLy8gMjMuNC4zLjMgV2Vha1NldC5wcm90b3R5cGUuZGVsZXRlKHZhbHVlKVxuICAgICAgJ2RlbGV0ZSc6IGZ1bmN0aW9uKGtleSl7XG4gICAgICAgIGlmKCFpc09iamVjdChrZXkpKXJldHVybiBmYWxzZTtcbiAgICAgICAgdmFyIGRhdGEgPSBnZXRXZWFrKGtleSk7XG4gICAgICAgIGlmKGRhdGEgPT09IHRydWUpcmV0dXJuIHVuY2F1Z2h0RnJvemVuU3RvcmUodGhpcylbJ2RlbGV0ZSddKGtleSk7XG4gICAgICAgIHJldHVybiBkYXRhICYmICRoYXMoZGF0YSwgdGhpcy5faSkgJiYgZGVsZXRlIGRhdGFbdGhpcy5faV07XG4gICAgICB9LFxuICAgICAgLy8gMjMuMy4zLjQgV2Vha01hcC5wcm90b3R5cGUuaGFzKGtleSlcbiAgICAgIC8vIDIzLjQuMy40IFdlYWtTZXQucHJvdG90eXBlLmhhcyh2YWx1ZSlcbiAgICAgIGhhczogZnVuY3Rpb24gaGFzKGtleSl7XG4gICAgICAgIGlmKCFpc09iamVjdChrZXkpKXJldHVybiBmYWxzZTtcbiAgICAgICAgdmFyIGRhdGEgPSBnZXRXZWFrKGtleSk7XG4gICAgICAgIGlmKGRhdGEgPT09IHRydWUpcmV0dXJuIHVuY2F1Z2h0RnJvemVuU3RvcmUodGhpcykuaGFzKGtleSk7XG4gICAgICAgIHJldHVybiBkYXRhICYmICRoYXMoZGF0YSwgdGhpcy5faSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIEM7XG4gIH0sXG4gIGRlZjogZnVuY3Rpb24odGhhdCwga2V5LCB2YWx1ZSl7XG4gICAgdmFyIGRhdGEgPSBnZXRXZWFrKGFuT2JqZWN0KGtleSksIHRydWUpO1xuICAgIGlmKGRhdGEgPT09IHRydWUpdW5jYXVnaHRGcm96ZW5TdG9yZSh0aGF0KS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgZWxzZSBkYXRhW3RoYXQuX2ldID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoYXQ7XG4gIH0sXG4gIHVmc3RvcmU6IHVuY2F1Z2h0RnJvemVuU3RvcmVcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2NvbGxlY3Rpb24td2Vhay5qc1xuICoqIG1vZHVsZSBpZCA9IDIxMlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHdlYWsgPSByZXF1aXJlKCcuL19jb2xsZWN0aW9uLXdlYWsnKTtcblxuLy8gMjMuNCBXZWFrU2V0IE9iamVjdHNcbnJlcXVpcmUoJy4vX2NvbGxlY3Rpb24nKSgnV2Vha1NldCcsIGZ1bmN0aW9uKGdldCl7XG4gIHJldHVybiBmdW5jdGlvbiBXZWFrU2V0KCl7IHJldHVybiBnZXQodGhpcywgYXJndW1lbnRzLmxlbmd0aCA+IDAgPyBhcmd1bWVudHNbMF0gOiB1bmRlZmluZWQpOyB9O1xufSwge1xuICAvLyAyMy40LjMuMSBXZWFrU2V0LnByb3RvdHlwZS5hZGQodmFsdWUpXG4gIGFkZDogZnVuY3Rpb24gYWRkKHZhbHVlKXtcbiAgICByZXR1cm4gd2Vhay5kZWYodGhpcywgdmFsdWUsIHRydWUpO1xuICB9XG59LCB3ZWFrLCBmYWxzZSwgdHJ1ZSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LndlYWstc2V0LmpzXG4gKiogbW9kdWxlIGlkID0gMjEzXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCAgICAgID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCAkdHlwZWQgICAgICAgPSByZXF1aXJlKCcuL190eXBlZCcpXG4gICwgYnVmZmVyICAgICAgID0gcmVxdWlyZSgnLi9fdHlwZWQtYnVmZmVyJylcbiAgLCBhbk9iamVjdCAgICAgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKVxuICAsIHRvSW5kZXggICAgICA9IHJlcXVpcmUoJy4vX3RvLWluZGV4JylcbiAgLCB0b0xlbmd0aCAgICAgPSByZXF1aXJlKCcuL190by1sZW5ndGgnKVxuICAsIGlzT2JqZWN0ICAgICA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpXG4gICwgVFlQRURfQVJSQVkgID0gcmVxdWlyZSgnLi9fd2tzJykoJ3R5cGVkX2FycmF5JylcbiAgLCBBcnJheUJ1ZmZlciAgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5BcnJheUJ1ZmZlclxuICAsIHNwZWNpZXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4vX3NwZWNpZXMtY29uc3RydWN0b3InKVxuICAsICRBcnJheUJ1ZmZlciA9IGJ1ZmZlci5BcnJheUJ1ZmZlclxuICAsICREYXRhVmlldyAgICA9IGJ1ZmZlci5EYXRhVmlld1xuICAsICRpc1ZpZXcgICAgICA9ICR0eXBlZC5BQlYgJiYgQXJyYXlCdWZmZXIuaXNWaWV3XG4gICwgJHNsaWNlICAgICAgID0gJEFycmF5QnVmZmVyLnByb3RvdHlwZS5zbGljZVxuICAsIFZJRVcgICAgICAgICA9ICR0eXBlZC5WSUVXXG4gICwgQVJSQVlfQlVGRkVSID0gJ0FycmF5QnVmZmVyJztcblxuJGV4cG9ydCgkZXhwb3J0LkcgKyAkZXhwb3J0LlcgKyAkZXhwb3J0LkYgKiAoQXJyYXlCdWZmZXIgIT09ICRBcnJheUJ1ZmZlciksIHtBcnJheUJ1ZmZlcjogJEFycmF5QnVmZmVyfSk7XG5cbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogISR0eXBlZC5DT05TVFIsIEFSUkFZX0JVRkZFUiwge1xuICAvLyAyNC4xLjMuMSBBcnJheUJ1ZmZlci5pc1ZpZXcoYXJnKVxuICBpc1ZpZXc6IGZ1bmN0aW9uIGlzVmlldyhpdCl7XG4gICAgcmV0dXJuICRpc1ZpZXcgJiYgJGlzVmlldyhpdCkgfHwgaXNPYmplY3QoaXQpICYmIFZJRVcgaW4gaXQ7XG4gIH1cbn0pO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuVSArICRleHBvcnQuRiAqIHJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24oKXtcbiAgcmV0dXJuICFuZXcgJEFycmF5QnVmZmVyKDIpLnNsaWNlKDEsIHVuZGVmaW5lZCkuYnl0ZUxlbmd0aDtcbn0pLCBBUlJBWV9CVUZGRVIsIHtcbiAgLy8gMjQuMS40LjMgQXJyYXlCdWZmZXIucHJvdG90eXBlLnNsaWNlKHN0YXJ0LCBlbmQpXG4gIHNsaWNlOiBmdW5jdGlvbiBzbGljZShzdGFydCwgZW5kKXtcbiAgICBpZigkc2xpY2UgIT09IHVuZGVmaW5lZCAmJiBlbmQgPT09IHVuZGVmaW5lZClyZXR1cm4gJHNsaWNlLmNhbGwoYW5PYmplY3QodGhpcyksIHN0YXJ0KTsgLy8gRkYgZml4XG4gICAgdmFyIGxlbiAgICA9IGFuT2JqZWN0KHRoaXMpLmJ5dGVMZW5ndGhcbiAgICAgICwgZmlyc3QgID0gdG9JbmRleChzdGFydCwgbGVuKVxuICAgICAgLCBmaW5hbCAgPSB0b0luZGV4KGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuIDogZW5kLCBsZW4pXG4gICAgICAsIHJlc3VsdCA9IG5ldyAoc3BlY2llc0NvbnN0cnVjdG9yKHRoaXMsICRBcnJheUJ1ZmZlcikpKHRvTGVuZ3RoKGZpbmFsIC0gZmlyc3QpKVxuICAgICAgLCB2aWV3UyAgPSBuZXcgJERhdGFWaWV3KHRoaXMpXG4gICAgICAsIHZpZXdUICA9IG5ldyAkRGF0YVZpZXcocmVzdWx0KVxuICAgICAgLCBpbmRleCAgPSAwO1xuICAgIHdoaWxlKGZpcnN0IDwgZmluYWwpe1xuICAgICAgdmlld1Quc2V0VWludDgoaW5kZXgrKywgdmlld1MuZ2V0VWludDgoZmlyc3QrKykpO1xuICAgIH0gcmV0dXJuIHJlc3VsdDtcbiAgfVxufSk7XG5cbnJlcXVpcmUoJy4vX3NldC1zcGVjaWVzJykoQVJSQVlfQlVGRkVSKTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYudHlwZWQuYXJyYXktYnVmZmVyLmpzXG4gKiogbW9kdWxlIGlkID0gMjE0XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJylcbiAgLCBoaWRlICAgPSByZXF1aXJlKCcuL19oaWRlJylcbiAgLCB1aWQgICAgPSByZXF1aXJlKCcuL191aWQnKVxuICAsIFRZUEVEICA9IHVpZCgndHlwZWRfYXJyYXknKVxuICAsIFZJRVcgICA9IHVpZCgndmlldycpXG4gICwgQUJWICAgID0gISEoZ2xvYmFsLkFycmF5QnVmZmVyICYmIGdsb2JhbC5EYXRhVmlldylcbiAgLCBDT05TVFIgPSBBQlZcbiAgLCBpID0gMCwgbCA9IDksIFR5cGVkO1xuXG52YXIgVHlwZWRBcnJheUNvbnN0cnVjdG9ycyA9IChcbiAgJ0ludDhBcnJheSxVaW50OEFycmF5LFVpbnQ4Q2xhbXBlZEFycmF5LEludDE2QXJyYXksVWludDE2QXJyYXksSW50MzJBcnJheSxVaW50MzJBcnJheSxGbG9hdDMyQXJyYXksRmxvYXQ2NEFycmF5J1xuKS5zcGxpdCgnLCcpO1xuXG53aGlsZShpIDwgbCl7XG4gIGlmKFR5cGVkID0gZ2xvYmFsW1R5cGVkQXJyYXlDb25zdHJ1Y3RvcnNbaSsrXV0pe1xuICAgIGhpZGUoVHlwZWQucHJvdG90eXBlLCBUWVBFRCwgdHJ1ZSk7XG4gICAgaGlkZShUeXBlZC5wcm90b3R5cGUsIFZJRVcsIHRydWUpO1xuICB9IGVsc2UgQ09OU1RSID0gZmFsc2U7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBBQlY6ICAgIEFCVixcbiAgQ09OU1RSOiBDT05TVFIsXG4gIFRZUEVEOiAgVFlQRUQsXG4gIFZJRVc6ICAgVklFV1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fdHlwZWQuanNcbiAqKiBtb2R1bGUgaWQgPSAyMTVcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0JztcbnZhciBnbG9iYWwgICAgICAgICA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpXG4gICwgREVTQ1JJUFRPUlMgICAgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpXG4gICwgTElCUkFSWSAgICAgICAgPSByZXF1aXJlKCcuL19saWJyYXJ5JylcbiAgLCAkdHlwZWQgICAgICAgICA9IHJlcXVpcmUoJy4vX3R5cGVkJylcbiAgLCBoaWRlICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2hpZGUnKVxuICAsIHJlZGVmaW5lQWxsICAgID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUtYWxsJylcbiAgLCBmYWlscyAgICAgICAgICA9IHJlcXVpcmUoJy4vX2ZhaWxzJylcbiAgLCBhbkluc3RhbmNlICAgICA9IHJlcXVpcmUoJy4vX2FuLWluc3RhbmNlJylcbiAgLCB0b0ludGVnZXIgICAgICA9IHJlcXVpcmUoJy4vX3RvLWludGVnZXInKVxuICAsIHRvTGVuZ3RoICAgICAgID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJylcbiAgLCBnT1BOICAgICAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BuJykuZlxuICAsIGRQICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZlxuICAsIGFycmF5RmlsbCAgICAgID0gcmVxdWlyZSgnLi9fYXJyYXktZmlsbCcpXG4gICwgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpXG4gICwgQVJSQVlfQlVGRkVSICAgPSAnQXJyYXlCdWZmZXInXG4gICwgREFUQV9WSUVXICAgICAgPSAnRGF0YVZpZXcnXG4gICwgUFJPVE9UWVBFICAgICAgPSAncHJvdG90eXBlJ1xuICAsIFdST05HX0xFTkdUSCAgID0gJ1dyb25nIGxlbmd0aCEnXG4gICwgV1JPTkdfSU5ERVggICAgPSAnV3JvbmcgaW5kZXghJ1xuICAsICRBcnJheUJ1ZmZlciAgID0gZ2xvYmFsW0FSUkFZX0JVRkZFUl1cbiAgLCAkRGF0YVZpZXcgICAgICA9IGdsb2JhbFtEQVRBX1ZJRVddXG4gICwgTWF0aCAgICAgICAgICAgPSBnbG9iYWwuTWF0aFxuICAsIHBhcnNlSW50ICAgICAgID0gZ2xvYmFsLnBhcnNlSW50XG4gICwgUmFuZ2VFcnJvciAgICAgPSBnbG9iYWwuUmFuZ2VFcnJvclxuICAsIEluZmluaXR5ICAgICAgID0gZ2xvYmFsLkluZmluaXR5XG4gICwgQmFzZUJ1ZmZlciAgICAgPSAkQXJyYXlCdWZmZXJcbiAgLCBhYnMgICAgICAgICAgICA9IE1hdGguYWJzXG4gICwgcG93ICAgICAgICAgICAgPSBNYXRoLnBvd1xuICAsIG1pbiAgICAgICAgICAgID0gTWF0aC5taW5cbiAgLCBmbG9vciAgICAgICAgICA9IE1hdGguZmxvb3JcbiAgLCBsb2cgICAgICAgICAgICA9IE1hdGgubG9nXG4gICwgTE4yICAgICAgICAgICAgPSBNYXRoLkxOMlxuICAsIEJVRkZFUiAgICAgICAgID0gJ2J1ZmZlcidcbiAgLCBCWVRFX0xFTkdUSCAgICA9ICdieXRlTGVuZ3RoJ1xuICAsIEJZVEVfT0ZGU0VUICAgID0gJ2J5dGVPZmZzZXQnXG4gICwgJEJVRkZFUiAgICAgICAgPSBERVNDUklQVE9SUyA/ICdfYicgOiBCVUZGRVJcbiAgLCAkTEVOR1RIICAgICAgICA9IERFU0NSSVBUT1JTID8gJ19sJyA6IEJZVEVfTEVOR1RIXG4gICwgJE9GRlNFVCAgICAgICAgPSBERVNDUklQVE9SUyA/ICdfbycgOiBCWVRFX09GRlNFVDtcblxuLy8gSUVFRTc1NCBjb252ZXJzaW9ucyBiYXNlZCBvbiBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2llZWU3NTRcbnZhciBwYWNrSUVFRTc1NCA9IGZ1bmN0aW9uKHZhbHVlLCBtTGVuLCBuQnl0ZXMpe1xuICB2YXIgYnVmZmVyID0gQXJyYXkobkJ5dGVzKVxuICAgICwgZUxlbiAgID0gbkJ5dGVzICogOCAtIG1MZW4gLSAxXG4gICAgLCBlTWF4ICAgPSAoMSA8PCBlTGVuKSAtIDFcbiAgICAsIGVCaWFzICA9IGVNYXggPj4gMVxuICAgICwgcnQgICAgID0gbUxlbiA9PT0gMjMgPyBwb3coMiwgLTI0KSAtIHBvdygyLCAtNzcpIDogMFxuICAgICwgaSAgICAgID0gMFxuICAgICwgcyAgICAgID0gdmFsdWUgPCAwIHx8IHZhbHVlID09PSAwICYmIDEgLyB2YWx1ZSA8IDAgPyAxIDogMFxuICAgICwgZSwgbSwgYztcbiAgdmFsdWUgPSBhYnModmFsdWUpXG4gIGlmKHZhbHVlICE9IHZhbHVlIHx8IHZhbHVlID09PSBJbmZpbml0eSl7XG4gICAgbSA9IHZhbHVlICE9IHZhbHVlID8gMSA6IDA7XG4gICAgZSA9IGVNYXg7XG4gIH0gZWxzZSB7XG4gICAgZSA9IGZsb29yKGxvZyh2YWx1ZSkgLyBMTjIpO1xuICAgIGlmKHZhbHVlICogKGMgPSBwb3coMiwgLWUpKSA8IDEpe1xuICAgICAgZS0tO1xuICAgICAgYyAqPSAyO1xuICAgIH1cbiAgICBpZihlICsgZUJpYXMgPj0gMSl7XG4gICAgICB2YWx1ZSArPSBydCAvIGM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlICs9IHJ0ICogcG93KDIsIDEgLSBlQmlhcyk7XG4gICAgfVxuICAgIGlmKHZhbHVlICogYyA+PSAyKXtcbiAgICAgIGUrKztcbiAgICAgIGMgLz0gMjtcbiAgICB9XG4gICAgaWYoZSArIGVCaWFzID49IGVNYXgpe1xuICAgICAgbSA9IDA7XG4gICAgICBlID0gZU1heDtcbiAgICB9IGVsc2UgaWYoZSArIGVCaWFzID49IDEpe1xuICAgICAgbSA9ICh2YWx1ZSAqIGMgLSAxKSAqIHBvdygyLCBtTGVuKTtcbiAgICAgIGUgPSBlICsgZUJpYXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIG0gPSB2YWx1ZSAqIHBvdygyLCBlQmlhcyAtIDEpICogcG93KDIsIG1MZW4pO1xuICAgICAgZSA9IDA7XG4gICAgfVxuICB9XG4gIGZvcig7IG1MZW4gPj0gODsgYnVmZmVyW2krK10gPSBtICYgMjU1LCBtIC89IDI1NiwgbUxlbiAtPSA4KTtcbiAgZSA9IGUgPDwgbUxlbiB8IG07XG4gIGVMZW4gKz0gbUxlbjtcbiAgZm9yKDsgZUxlbiA+IDA7IGJ1ZmZlcltpKytdID0gZSAmIDI1NSwgZSAvPSAyNTYsIGVMZW4gLT0gOCk7XG4gIGJ1ZmZlclstLWldIHw9IHMgKiAxMjg7XG4gIHJldHVybiBidWZmZXI7XG59O1xudmFyIHVucGFja0lFRUU3NTQgPSBmdW5jdGlvbihidWZmZXIsIG1MZW4sIG5CeXRlcyl7XG4gIHZhciBlTGVuICA9IG5CeXRlcyAqIDggLSBtTGVuIC0gMVxuICAgICwgZU1heCAgPSAoMSA8PCBlTGVuKSAtIDFcbiAgICAsIGVCaWFzID0gZU1heCA+PiAxXG4gICAgLCBuQml0cyA9IGVMZW4gLSA3XG4gICAgLCBpICAgICA9IG5CeXRlcyAtIDFcbiAgICAsIHMgICAgID0gYnVmZmVyW2ktLV1cbiAgICAsIGUgICAgID0gcyAmIDEyN1xuICAgICwgbTtcbiAgcyA+Pj0gNztcbiAgZm9yKDsgbkJpdHMgPiAwOyBlID0gZSAqIDI1NiArIGJ1ZmZlcltpXSwgaS0tLCBuQml0cyAtPSA4KTtcbiAgbSA9IGUgJiAoMSA8PCAtbkJpdHMpIC0gMTtcbiAgZSA+Pj0gLW5CaXRzO1xuICBuQml0cyArPSBtTGVuO1xuICBmb3IoOyBuQml0cyA+IDA7IG0gPSBtICogMjU2ICsgYnVmZmVyW2ldLCBpLS0sIG5CaXRzIC09IDgpO1xuICBpZihlID09PSAwKXtcbiAgICBlID0gMSAtIGVCaWFzO1xuICB9IGVsc2UgaWYoZSA9PT0gZU1heCl7XG4gICAgcmV0dXJuIG0gPyBOYU4gOiBzID8gLUluZmluaXR5IDogSW5maW5pdHk7XG4gIH0gZWxzZSB7XG4gICAgbSA9IG0gKyBwb3coMiwgbUxlbik7XG4gICAgZSA9IGUgLSBlQmlhcztcbiAgfSByZXR1cm4gKHMgPyAtMSA6IDEpICogbSAqIHBvdygyLCBlIC0gbUxlbik7XG59O1xuXG52YXIgdW5wYWNrSTMyID0gZnVuY3Rpb24oYnl0ZXMpe1xuICByZXR1cm4gYnl0ZXNbM10gPDwgMjQgfCBieXRlc1syXSA8PCAxNiB8IGJ5dGVzWzFdIDw8IDggfCBieXRlc1swXTtcbn07XG52YXIgcGFja0k4ID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gW2l0ICYgMHhmZl07XG59O1xudmFyIHBhY2tJMTYgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiBbaXQgJiAweGZmLCBpdCA+PiA4ICYgMHhmZl07XG59O1xudmFyIHBhY2tJMzIgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiBbaXQgJiAweGZmLCBpdCA+PiA4ICYgMHhmZiwgaXQgPj4gMTYgJiAweGZmLCBpdCA+PiAyNCAmIDB4ZmZdO1xufTtcbnZhciBwYWNrRjY0ID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gcGFja0lFRUU3NTQoaXQsIDUyLCA4KTtcbn07XG52YXIgcGFja0YzMiA9IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIHBhY2tJRUVFNzU0KGl0LCAyMywgNCk7XG59O1xuXG52YXIgYWRkR2V0dGVyID0gZnVuY3Rpb24oQywga2V5LCBpbnRlcm5hbCl7XG4gIGRQKENbUFJPVE9UWVBFXSwga2V5LCB7Z2V0OiBmdW5jdGlvbigpeyByZXR1cm4gdGhpc1tpbnRlcm5hbF07IH19KTtcbn07XG5cbnZhciBnZXQgPSBmdW5jdGlvbih2aWV3LCBieXRlcywgaW5kZXgsIGlzTGl0dGxlRW5kaWFuKXtcbiAgdmFyIG51bUluZGV4ID0gK2luZGV4XG4gICAgLCBpbnRJbmRleCA9IHRvSW50ZWdlcihudW1JbmRleCk7XG4gIGlmKG51bUluZGV4ICE9IGludEluZGV4IHx8IGludEluZGV4IDwgMCB8fCBpbnRJbmRleCArIGJ5dGVzID4gdmlld1skTEVOR1RIXSl0aHJvdyBSYW5nZUVycm9yKFdST05HX0lOREVYKTtcbiAgdmFyIHN0b3JlID0gdmlld1skQlVGRkVSXS5fYlxuICAgICwgc3RhcnQgPSBpbnRJbmRleCArIHZpZXdbJE9GRlNFVF1cbiAgICAsIHBhY2sgID0gc3RvcmUuc2xpY2Uoc3RhcnQsIHN0YXJ0ICsgYnl0ZXMpO1xuICByZXR1cm4gaXNMaXR0bGVFbmRpYW4gPyBwYWNrIDogcGFjay5yZXZlcnNlKCk7XG59O1xudmFyIHNldCA9IGZ1bmN0aW9uKHZpZXcsIGJ5dGVzLCBpbmRleCwgY29udmVyc2lvbiwgdmFsdWUsIGlzTGl0dGxlRW5kaWFuKXtcbiAgdmFyIG51bUluZGV4ID0gK2luZGV4XG4gICAgLCBpbnRJbmRleCA9IHRvSW50ZWdlcihudW1JbmRleCk7XG4gIGlmKG51bUluZGV4ICE9IGludEluZGV4IHx8IGludEluZGV4IDwgMCB8fCBpbnRJbmRleCArIGJ5dGVzID4gdmlld1skTEVOR1RIXSl0aHJvdyBSYW5nZUVycm9yKFdST05HX0lOREVYKTtcbiAgdmFyIHN0b3JlID0gdmlld1skQlVGRkVSXS5fYlxuICAgICwgc3RhcnQgPSBpbnRJbmRleCArIHZpZXdbJE9GRlNFVF1cbiAgICAsIHBhY2sgID0gY29udmVyc2lvbigrdmFsdWUpO1xuICBmb3IodmFyIGkgPSAwOyBpIDwgYnl0ZXM7IGkrKylzdG9yZVtzdGFydCArIGldID0gcGFja1tpc0xpdHRsZUVuZGlhbiA/IGkgOiBieXRlcyAtIGkgLSAxXTtcbn07XG5cbnZhciB2YWxpZGF0ZUFycmF5QnVmZmVyQXJndW1lbnRzID0gZnVuY3Rpb24odGhhdCwgbGVuZ3RoKXtcbiAgYW5JbnN0YW5jZSh0aGF0LCAkQXJyYXlCdWZmZXIsIEFSUkFZX0JVRkZFUik7XG4gIHZhciBudW1iZXJMZW5ndGggPSArbGVuZ3RoXG4gICAgLCBieXRlTGVuZ3RoICAgPSB0b0xlbmd0aChudW1iZXJMZW5ndGgpO1xuICBpZihudW1iZXJMZW5ndGggIT0gYnl0ZUxlbmd0aCl0aHJvdyBSYW5nZUVycm9yKFdST05HX0xFTkdUSCk7XG4gIHJldHVybiBieXRlTGVuZ3RoO1xufTtcblxuaWYoISR0eXBlZC5BQlYpe1xuICAkQXJyYXlCdWZmZXIgPSBmdW5jdGlvbiBBcnJheUJ1ZmZlcihsZW5ndGgpe1xuICAgIHZhciBieXRlTGVuZ3RoID0gdmFsaWRhdGVBcnJheUJ1ZmZlckFyZ3VtZW50cyh0aGlzLCBsZW5ndGgpO1xuICAgIHRoaXMuX2IgICAgICAgPSBhcnJheUZpbGwuY2FsbChBcnJheShieXRlTGVuZ3RoKSwgMCk7XG4gICAgdGhpc1skTEVOR1RIXSA9IGJ5dGVMZW5ndGg7XG4gIH07XG5cbiAgJERhdGFWaWV3ID0gZnVuY3Rpb24gRGF0YVZpZXcoYnVmZmVyLCBieXRlT2Zmc2V0LCBieXRlTGVuZ3RoKXtcbiAgICBhbkluc3RhbmNlKHRoaXMsICREYXRhVmlldywgREFUQV9WSUVXKTtcbiAgICBhbkluc3RhbmNlKGJ1ZmZlciwgJEFycmF5QnVmZmVyLCBEQVRBX1ZJRVcpO1xuICAgIHZhciBidWZmZXJMZW5ndGggPSBidWZmZXJbJExFTkdUSF1cbiAgICAgICwgb2Zmc2V0ICAgICAgID0gdG9JbnRlZ2VyKGJ5dGVPZmZzZXQpO1xuICAgIGlmKG9mZnNldCA8IDAgfHwgb2Zmc2V0ID4gYnVmZmVyTGVuZ3RoKXRocm93IFJhbmdlRXJyb3IoJ1dyb25nIG9mZnNldCEnKTtcbiAgICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCA9PT0gdW5kZWZpbmVkID8gYnVmZmVyTGVuZ3RoIC0gb2Zmc2V0IDogdG9MZW5ndGgoYnl0ZUxlbmd0aCk7XG4gICAgaWYob2Zmc2V0ICsgYnl0ZUxlbmd0aCA+IGJ1ZmZlckxlbmd0aCl0aHJvdyBSYW5nZUVycm9yKFdST05HX0xFTkdUSCk7XG4gICAgdGhpc1skQlVGRkVSXSA9IGJ1ZmZlcjtcbiAgICB0aGlzWyRPRkZTRVRdID0gb2Zmc2V0O1xuICAgIHRoaXNbJExFTkdUSF0gPSBieXRlTGVuZ3RoO1xuICB9O1xuXG4gIGlmKERFU0NSSVBUT1JTKXtcbiAgICBhZGRHZXR0ZXIoJEFycmF5QnVmZmVyLCBCWVRFX0xFTkdUSCwgJ19sJyk7XG4gICAgYWRkR2V0dGVyKCREYXRhVmlldywgQlVGRkVSLCAnX2InKTtcbiAgICBhZGRHZXR0ZXIoJERhdGFWaWV3LCBCWVRFX0xFTkdUSCwgJ19sJyk7XG4gICAgYWRkR2V0dGVyKCREYXRhVmlldywgQllURV9PRkZTRVQsICdfbycpO1xuICB9XG5cbiAgcmVkZWZpbmVBbGwoJERhdGFWaWV3W1BST1RPVFlQRV0sIHtcbiAgICBnZXRJbnQ4OiBmdW5jdGlvbiBnZXRJbnQ4KGJ5dGVPZmZzZXQpe1xuICAgICAgcmV0dXJuIGdldCh0aGlzLCAxLCBieXRlT2Zmc2V0KVswXSA8PCAyNCA+PiAyNDtcbiAgICB9LFxuICAgIGdldFVpbnQ4OiBmdW5jdGlvbiBnZXRVaW50OChieXRlT2Zmc2V0KXtcbiAgICAgIHJldHVybiBnZXQodGhpcywgMSwgYnl0ZU9mZnNldClbMF07XG4gICAgfSxcbiAgICBnZXRJbnQxNjogZnVuY3Rpb24gZ2V0SW50MTYoYnl0ZU9mZnNldCAvKiwgbGl0dGxlRW5kaWFuICovKXtcbiAgICAgIHZhciBieXRlcyA9IGdldCh0aGlzLCAyLCBieXRlT2Zmc2V0LCBhcmd1bWVudHNbMV0pO1xuICAgICAgcmV0dXJuIChieXRlc1sxXSA8PCA4IHwgYnl0ZXNbMF0pIDw8IDE2ID4+IDE2O1xuICAgIH0sXG4gICAgZ2V0VWludDE2OiBmdW5jdGlvbiBnZXRVaW50MTYoYnl0ZU9mZnNldCAvKiwgbGl0dGxlRW5kaWFuICovKXtcbiAgICAgIHZhciBieXRlcyA9IGdldCh0aGlzLCAyLCBieXRlT2Zmc2V0LCBhcmd1bWVudHNbMV0pO1xuICAgICAgcmV0dXJuIGJ5dGVzWzFdIDw8IDggfCBieXRlc1swXTtcbiAgICB9LFxuICAgIGdldEludDMyOiBmdW5jdGlvbiBnZXRJbnQzMihieXRlT2Zmc2V0IC8qLCBsaXR0bGVFbmRpYW4gKi8pe1xuICAgICAgcmV0dXJuIHVucGFja0kzMihnZXQodGhpcywgNCwgYnl0ZU9mZnNldCwgYXJndW1lbnRzWzFdKSk7XG4gICAgfSxcbiAgICBnZXRVaW50MzI6IGZ1bmN0aW9uIGdldFVpbnQzMihieXRlT2Zmc2V0IC8qLCBsaXR0bGVFbmRpYW4gKi8pe1xuICAgICAgcmV0dXJuIHVucGFja0kzMihnZXQodGhpcywgNCwgYnl0ZU9mZnNldCwgYXJndW1lbnRzWzFdKSkgPj4+IDA7XG4gICAgfSxcbiAgICBnZXRGbG9hdDMyOiBmdW5jdGlvbiBnZXRGbG9hdDMyKGJ5dGVPZmZzZXQgLyosIGxpdHRsZUVuZGlhbiAqLyl7XG4gICAgICByZXR1cm4gdW5wYWNrSUVFRTc1NChnZXQodGhpcywgNCwgYnl0ZU9mZnNldCwgYXJndW1lbnRzWzFdKSwgMjMsIDQpO1xuICAgIH0sXG4gICAgZ2V0RmxvYXQ2NDogZnVuY3Rpb24gZ2V0RmxvYXQ2NChieXRlT2Zmc2V0IC8qLCBsaXR0bGVFbmRpYW4gKi8pe1xuICAgICAgcmV0dXJuIHVucGFja0lFRUU3NTQoZ2V0KHRoaXMsIDgsIGJ5dGVPZmZzZXQsIGFyZ3VtZW50c1sxXSksIDUyLCA4KTtcbiAgICB9LFxuICAgIHNldEludDg6IGZ1bmN0aW9uIHNldEludDgoYnl0ZU9mZnNldCwgdmFsdWUpe1xuICAgICAgc2V0KHRoaXMsIDEsIGJ5dGVPZmZzZXQsIHBhY2tJOCwgdmFsdWUpO1xuICAgIH0sXG4gICAgc2V0VWludDg6IGZ1bmN0aW9uIHNldFVpbnQ4KGJ5dGVPZmZzZXQsIHZhbHVlKXtcbiAgICAgIHNldCh0aGlzLCAxLCBieXRlT2Zmc2V0LCBwYWNrSTgsIHZhbHVlKTtcbiAgICB9LFxuICAgIHNldEludDE2OiBmdW5jdGlvbiBzZXRJbnQxNihieXRlT2Zmc2V0LCB2YWx1ZSAvKiwgbGl0dGxlRW5kaWFuICovKXtcbiAgICAgIHNldCh0aGlzLCAyLCBieXRlT2Zmc2V0LCBwYWNrSTE2LCB2YWx1ZSwgYXJndW1lbnRzWzJdKTtcbiAgICB9LFxuICAgIHNldFVpbnQxNjogZnVuY3Rpb24gc2V0VWludDE2KGJ5dGVPZmZzZXQsIHZhbHVlIC8qLCBsaXR0bGVFbmRpYW4gKi8pe1xuICAgICAgc2V0KHRoaXMsIDIsIGJ5dGVPZmZzZXQsIHBhY2tJMTYsIHZhbHVlLCBhcmd1bWVudHNbMl0pO1xuICAgIH0sXG4gICAgc2V0SW50MzI6IGZ1bmN0aW9uIHNldEludDMyKGJ5dGVPZmZzZXQsIHZhbHVlIC8qLCBsaXR0bGVFbmRpYW4gKi8pe1xuICAgICAgc2V0KHRoaXMsIDQsIGJ5dGVPZmZzZXQsIHBhY2tJMzIsIHZhbHVlLCBhcmd1bWVudHNbMl0pO1xuICAgIH0sXG4gICAgc2V0VWludDMyOiBmdW5jdGlvbiBzZXRVaW50MzIoYnl0ZU9mZnNldCwgdmFsdWUgLyosIGxpdHRsZUVuZGlhbiAqLyl7XG4gICAgICBzZXQodGhpcywgNCwgYnl0ZU9mZnNldCwgcGFja0kzMiwgdmFsdWUsIGFyZ3VtZW50c1syXSk7XG4gICAgfSxcbiAgICBzZXRGbG9hdDMyOiBmdW5jdGlvbiBzZXRGbG9hdDMyKGJ5dGVPZmZzZXQsIHZhbHVlIC8qLCBsaXR0bGVFbmRpYW4gKi8pe1xuICAgICAgc2V0KHRoaXMsIDQsIGJ5dGVPZmZzZXQsIHBhY2tGMzIsIHZhbHVlLCBhcmd1bWVudHNbMl0pO1xuICAgIH0sXG4gICAgc2V0RmxvYXQ2NDogZnVuY3Rpb24gc2V0RmxvYXQ2NChieXRlT2Zmc2V0LCB2YWx1ZSAvKiwgbGl0dGxlRW5kaWFuICovKXtcbiAgICAgIHNldCh0aGlzLCA4LCBieXRlT2Zmc2V0LCBwYWNrRjY0LCB2YWx1ZSwgYXJndW1lbnRzWzJdKTtcbiAgICB9XG4gIH0pO1xufSBlbHNlIHtcbiAgaWYoIWZhaWxzKGZ1bmN0aW9uKCl7XG4gICAgbmV3ICRBcnJheUJ1ZmZlcjsgICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3XG4gIH0pIHx8ICFmYWlscyhmdW5jdGlvbigpe1xuICAgIG5ldyAkQXJyYXlCdWZmZXIoLjUpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ld1xuICB9KSl7XG4gICAgJEFycmF5QnVmZmVyID0gZnVuY3Rpb24gQXJyYXlCdWZmZXIobGVuZ3RoKXtcbiAgICAgIHJldHVybiBuZXcgQmFzZUJ1ZmZlcih2YWxpZGF0ZUFycmF5QnVmZmVyQXJndW1lbnRzKHRoaXMsIGxlbmd0aCkpO1xuICAgIH07XG4gICAgdmFyIEFycmF5QnVmZmVyUHJvdG8gPSAkQXJyYXlCdWZmZXJbUFJPVE9UWVBFXSA9IEJhc2VCdWZmZXJbUFJPVE9UWVBFXTtcbiAgICBmb3IodmFyIGtleXMgPSBnT1BOKEJhc2VCdWZmZXIpLCBqID0gMCwga2V5OyBrZXlzLmxlbmd0aCA+IGo7ICl7XG4gICAgICBpZighKChrZXkgPSBrZXlzW2orK10pIGluICRBcnJheUJ1ZmZlcikpaGlkZSgkQXJyYXlCdWZmZXIsIGtleSwgQmFzZUJ1ZmZlcltrZXldKTtcbiAgICB9O1xuICAgIGlmKCFMSUJSQVJZKUFycmF5QnVmZmVyUHJvdG8uY29uc3RydWN0b3IgPSAkQXJyYXlCdWZmZXI7XG4gIH1cbiAgLy8gaU9TIFNhZmFyaSA3LnggYnVnXG4gIHZhciB2aWV3ID0gbmV3ICREYXRhVmlldyhuZXcgJEFycmF5QnVmZmVyKDIpKVxuICAgICwgJHNldEludDggPSAkRGF0YVZpZXdbUFJPVE9UWVBFXS5zZXRJbnQ4O1xuICB2aWV3LnNldEludDgoMCwgMjE0NzQ4MzY0OCk7XG4gIHZpZXcuc2V0SW50OCgxLCAyMTQ3NDgzNjQ5KTtcbiAgaWYodmlldy5nZXRJbnQ4KDApIHx8ICF2aWV3LmdldEludDgoMSkpcmVkZWZpbmVBbGwoJERhdGFWaWV3W1BST1RPVFlQRV0sIHtcbiAgICBzZXRJbnQ4OiBmdW5jdGlvbiBzZXRJbnQ4KGJ5dGVPZmZzZXQsIHZhbHVlKXtcbiAgICAgICRzZXRJbnQ4LmNhbGwodGhpcywgYnl0ZU9mZnNldCwgdmFsdWUgPDwgMjQgPj4gMjQpO1xuICAgIH0sXG4gICAgc2V0VWludDg6IGZ1bmN0aW9uIHNldFVpbnQ4KGJ5dGVPZmZzZXQsIHZhbHVlKXtcbiAgICAgICRzZXRJbnQ4LmNhbGwodGhpcywgYnl0ZU9mZnNldCwgdmFsdWUgPDwgMjQgPj4gMjQpO1xuICAgIH1cbiAgfSwgdHJ1ZSk7XG59XG5zZXRUb1N0cmluZ1RhZygkQXJyYXlCdWZmZXIsIEFSUkFZX0JVRkZFUik7XG5zZXRUb1N0cmluZ1RhZygkRGF0YVZpZXcsIERBVEFfVklFVyk7XG5oaWRlKCREYXRhVmlld1tQUk9UT1RZUEVdLCAkdHlwZWQuVklFVywgdHJ1ZSk7XG5leHBvcnRzW0FSUkFZX0JVRkZFUl0gPSAkQXJyYXlCdWZmZXI7XG5leHBvcnRzW0RBVEFfVklFV10gPSAkRGF0YVZpZXc7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX3R5cGVkLWJ1ZmZlci5qc1xuICoqIG1vZHVsZSBpZCA9IDIxNlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwidmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbiRleHBvcnQoJGV4cG9ydC5HICsgJGV4cG9ydC5XICsgJGV4cG9ydC5GICogIXJlcXVpcmUoJy4vX3R5cGVkJykuQUJWLCB7XG4gIERhdGFWaWV3OiByZXF1aXJlKCcuL190eXBlZC1idWZmZXInKS5EYXRhVmlld1xufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnR5cGVkLmRhdGEtdmlldy5qc1xuICoqIG1vZHVsZSBpZCA9IDIxN1xuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwicmVxdWlyZSgnLi9fdHlwZWQtYXJyYXknKSgnSW50OCcsIDEsIGZ1bmN0aW9uKGluaXQpe1xuICByZXR1cm4gZnVuY3Rpb24gSW50OEFycmF5KGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCl7XG4gICAgcmV0dXJuIGluaXQodGhpcywgZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKTtcbiAgfTtcbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi50eXBlZC5pbnQ4LWFycmF5LmpzXG4gKiogbW9kdWxlIGlkID0gMjE4XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG5pZihyZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpKXtcbiAgdmFyIExJQlJBUlkgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19saWJyYXJ5JylcbiAgICAsIGdsb2JhbCAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19nbG9iYWwnKVxuICAgICwgZmFpbHMgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2ZhaWxzJylcbiAgICAsICRleHBvcnQgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19leHBvcnQnKVxuICAgICwgJHR5cGVkICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX3R5cGVkJylcbiAgICAsICRidWZmZXIgICAgICAgICAgICAgPSByZXF1aXJlKCcuL190eXBlZC1idWZmZXInKVxuICAgICwgY3R4ICAgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2N0eCcpXG4gICAgLCBhbkluc3RhbmNlICAgICAgICAgID0gcmVxdWlyZSgnLi9fYW4taW5zdGFuY2UnKVxuICAgICwgcHJvcGVydHlEZXNjICAgICAgICA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKVxuICAgICwgaGlkZSAgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2hpZGUnKVxuICAgICwgcmVkZWZpbmVBbGwgICAgICAgICA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lLWFsbCcpXG4gICAgLCBpc0ludGVnZXIgICAgICAgICAgID0gcmVxdWlyZSgnLi9faXMtaW50ZWdlcicpXG4gICAgLCB0b0ludGVnZXIgICAgICAgICAgID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpXG4gICAgLCB0b0xlbmd0aCAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJylcbiAgICAsIHRvSW5kZXggICAgICAgICAgICAgPSByZXF1aXJlKCcuL190by1pbmRleCcpXG4gICAgLCB0b1ByaW1pdGl2ZSAgICAgICAgID0gcmVxdWlyZSgnLi9fdG8tcHJpbWl0aXZlJylcbiAgICAsIGhhcyAgICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19oYXMnKVxuICAgICwgc2FtZSAgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX3NhbWUtdmFsdWUnKVxuICAgICwgY2xhc3NvZiAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2NsYXNzb2YnKVxuICAgICwgaXNPYmplY3QgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpXG4gICAgLCB0b09iamVjdCAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0JylcbiAgICAsIGlzQXJyYXlJdGVyICAgICAgICAgPSByZXF1aXJlKCcuL19pcy1hcnJheS1pdGVyJylcbiAgICAsIGNyZWF0ZSAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtY3JlYXRlJylcbiAgICAsIGdldFByb3RvdHlwZU9mICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZ3BvJylcbiAgICAsIGdPUE4gICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wbicpLmZcbiAgICAsIGlzSXRlcmFibGUgICAgICAgICAgPSByZXF1aXJlKCcuL2NvcmUuaXMtaXRlcmFibGUnKVxuICAgICwgZ2V0SXRlckZuICAgICAgICAgICA9IHJlcXVpcmUoJy4vY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kJylcbiAgICAsIHVpZCAgICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL191aWQnKVxuICAgICwgd2tzICAgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX3drcycpXG4gICAgLCBjcmVhdGVBcnJheU1ldGhvZCAgID0gcmVxdWlyZSgnLi9fYXJyYXktbWV0aG9kcycpXG4gICAgLCBjcmVhdGVBcnJheUluY2x1ZGVzID0gcmVxdWlyZSgnLi9fYXJyYXktaW5jbHVkZXMnKVxuICAgICwgc3BlY2llc0NvbnN0cnVjdG9yICA9IHJlcXVpcmUoJy4vX3NwZWNpZXMtY29uc3RydWN0b3InKVxuICAgICwgQXJyYXlJdGVyYXRvcnMgICAgICA9IHJlcXVpcmUoJy4vZXM2LmFycmF5Lml0ZXJhdG9yJylcbiAgICAsIEl0ZXJhdG9ycyAgICAgICAgICAgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKVxuICAgICwgJGl0ZXJEZXRlY3QgICAgICAgICA9IHJlcXVpcmUoJy4vX2l0ZXItZGV0ZWN0JylcbiAgICAsIHNldFNwZWNpZXMgICAgICAgICAgPSByZXF1aXJlKCcuL19zZXQtc3BlY2llcycpXG4gICAgLCBhcnJheUZpbGwgICAgICAgICAgID0gcmVxdWlyZSgnLi9fYXJyYXktZmlsbCcpXG4gICAgLCBhcnJheUNvcHlXaXRoaW4gICAgID0gcmVxdWlyZSgnLi9fYXJyYXktY29weS13aXRoaW4nKVxuICAgICwgJERQICAgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpXG4gICAgLCAkR09QRCAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcGQnKVxuICAgICwgZFAgICAgICAgICAgICAgICAgICA9ICREUC5mXG4gICAgLCBnT1BEICAgICAgICAgICAgICAgID0gJEdPUEQuZlxuICAgICwgUmFuZ2VFcnJvciAgICAgICAgICA9IGdsb2JhbC5SYW5nZUVycm9yXG4gICAgLCBUeXBlRXJyb3IgICAgICAgICAgID0gZ2xvYmFsLlR5cGVFcnJvclxuICAgICwgVWludDhBcnJheSAgICAgICAgICA9IGdsb2JhbC5VaW50OEFycmF5XG4gICAgLCBBUlJBWV9CVUZGRVIgICAgICAgID0gJ0FycmF5QnVmZmVyJ1xuICAgICwgU0hBUkVEX0JVRkZFUiAgICAgICA9ICdTaGFyZWQnICsgQVJSQVlfQlVGRkVSXG4gICAgLCBCWVRFU19QRVJfRUxFTUVOVCAgID0gJ0JZVEVTX1BFUl9FTEVNRU5UJ1xuICAgICwgUFJPVE9UWVBFICAgICAgICAgICA9ICdwcm90b3R5cGUnXG4gICAgLCBBcnJheVByb3RvICAgICAgICAgID0gQXJyYXlbUFJPVE9UWVBFXVxuICAgICwgJEFycmF5QnVmZmVyICAgICAgICA9ICRidWZmZXIuQXJyYXlCdWZmZXJcbiAgICAsICREYXRhVmlldyAgICAgICAgICAgPSAkYnVmZmVyLkRhdGFWaWV3XG4gICAgLCBhcnJheUZvckVhY2ggICAgICAgID0gY3JlYXRlQXJyYXlNZXRob2QoMClcbiAgICAsIGFycmF5RmlsdGVyICAgICAgICAgPSBjcmVhdGVBcnJheU1ldGhvZCgyKVxuICAgICwgYXJyYXlTb21lICAgICAgICAgICA9IGNyZWF0ZUFycmF5TWV0aG9kKDMpXG4gICAgLCBhcnJheUV2ZXJ5ICAgICAgICAgID0gY3JlYXRlQXJyYXlNZXRob2QoNClcbiAgICAsIGFycmF5RmluZCAgICAgICAgICAgPSBjcmVhdGVBcnJheU1ldGhvZCg1KVxuICAgICwgYXJyYXlGaW5kSW5kZXggICAgICA9IGNyZWF0ZUFycmF5TWV0aG9kKDYpXG4gICAgLCBhcnJheUluY2x1ZGVzICAgICAgID0gY3JlYXRlQXJyYXlJbmNsdWRlcyh0cnVlKVxuICAgICwgYXJyYXlJbmRleE9mICAgICAgICA9IGNyZWF0ZUFycmF5SW5jbHVkZXMoZmFsc2UpXG4gICAgLCBhcnJheVZhbHVlcyAgICAgICAgID0gQXJyYXlJdGVyYXRvcnMudmFsdWVzXG4gICAgLCBhcnJheUtleXMgICAgICAgICAgID0gQXJyYXlJdGVyYXRvcnMua2V5c1xuICAgICwgYXJyYXlFbnRyaWVzICAgICAgICA9IEFycmF5SXRlcmF0b3JzLmVudHJpZXNcbiAgICAsIGFycmF5TGFzdEluZGV4T2YgICAgPSBBcnJheVByb3RvLmxhc3RJbmRleE9mXG4gICAgLCBhcnJheVJlZHVjZSAgICAgICAgID0gQXJyYXlQcm90by5yZWR1Y2VcbiAgICAsIGFycmF5UmVkdWNlUmlnaHQgICAgPSBBcnJheVByb3RvLnJlZHVjZVJpZ2h0XG4gICAgLCBhcnJheUpvaW4gICAgICAgICAgID0gQXJyYXlQcm90by5qb2luXG4gICAgLCBhcnJheVNvcnQgICAgICAgICAgID0gQXJyYXlQcm90by5zb3J0XG4gICAgLCBhcnJheVNsaWNlICAgICAgICAgID0gQXJyYXlQcm90by5zbGljZVxuICAgICwgYXJyYXlUb1N0cmluZyAgICAgICA9IEFycmF5UHJvdG8udG9TdHJpbmdcbiAgICAsIGFycmF5VG9Mb2NhbGVTdHJpbmcgPSBBcnJheVByb3RvLnRvTG9jYWxlU3RyaW5nXG4gICAgLCBJVEVSQVRPUiAgICAgICAgICAgID0gd2tzKCdpdGVyYXRvcicpXG4gICAgLCBUQUcgICAgICAgICAgICAgICAgID0gd2tzKCd0b1N0cmluZ1RhZycpXG4gICAgLCBUWVBFRF9DT05TVFJVQ1RPUiAgID0gdWlkKCd0eXBlZF9jb25zdHJ1Y3RvcicpXG4gICAgLCBERUZfQ09OU1RSVUNUT1IgICAgID0gdWlkKCdkZWZfY29uc3RydWN0b3InKVxuICAgICwgQUxMX0NPTlNUUlVDVE9SUyAgICA9ICR0eXBlZC5DT05TVFJcbiAgICAsIFRZUEVEX0FSUkFZICAgICAgICAgPSAkdHlwZWQuVFlQRURcbiAgICAsIFZJRVcgICAgICAgICAgICAgICAgPSAkdHlwZWQuVklFV1xuICAgICwgV1JPTkdfTEVOR1RIICAgICAgICA9ICdXcm9uZyBsZW5ndGghJztcblxuICB2YXIgJG1hcCA9IGNyZWF0ZUFycmF5TWV0aG9kKDEsIGZ1bmN0aW9uKE8sIGxlbmd0aCl7XG4gICAgcmV0dXJuIGFsbG9jYXRlKHNwZWNpZXNDb25zdHJ1Y3RvcihPLCBPW0RFRl9DT05TVFJVQ1RPUl0pLCBsZW5ndGgpO1xuICB9KTtcblxuICB2YXIgTElUVExFX0VORElBTiA9IGZhaWxzKGZ1bmN0aW9uKCl7XG4gICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KG5ldyBVaW50MTZBcnJheShbMV0pLmJ1ZmZlcilbMF0gPT09IDE7XG4gIH0pO1xuXG4gIHZhciBGT1JDRURfU0VUID0gISFVaW50OEFycmF5ICYmICEhVWludDhBcnJheVtQUk9UT1RZUEVdLnNldCAmJiBmYWlscyhmdW5jdGlvbigpe1xuICAgIG5ldyBVaW50OEFycmF5KDEpLnNldCh7fSk7XG4gIH0pO1xuXG4gIHZhciBzdHJpY3RUb0xlbmd0aCA9IGZ1bmN0aW9uKGl0LCBTQU1FKXtcbiAgICBpZihpdCA9PT0gdW5kZWZpbmVkKXRocm93IFR5cGVFcnJvcihXUk9OR19MRU5HVEgpO1xuICAgIHZhciBudW1iZXIgPSAraXRcbiAgICAgICwgbGVuZ3RoID0gdG9MZW5ndGgoaXQpO1xuICAgIGlmKFNBTUUgJiYgIXNhbWUobnVtYmVyLCBsZW5ndGgpKXRocm93IFJhbmdlRXJyb3IoV1JPTkdfTEVOR1RIKTtcbiAgICByZXR1cm4gbGVuZ3RoO1xuICB9O1xuXG4gIHZhciB0b09mZnNldCA9IGZ1bmN0aW9uKGl0LCBCWVRFUyl7XG4gICAgdmFyIG9mZnNldCA9IHRvSW50ZWdlcihpdCk7XG4gICAgaWYob2Zmc2V0IDwgMCB8fCBvZmZzZXQgJSBCWVRFUyl0aHJvdyBSYW5nZUVycm9yKCdXcm9uZyBvZmZzZXQhJyk7XG4gICAgcmV0dXJuIG9mZnNldDtcbiAgfTtcblxuICB2YXIgdmFsaWRhdGUgPSBmdW5jdGlvbihpdCl7XG4gICAgaWYoaXNPYmplY3QoaXQpICYmIFRZUEVEX0FSUkFZIGluIGl0KXJldHVybiBpdDtcbiAgICB0aHJvdyBUeXBlRXJyb3IoaXQgKyAnIGlzIG5vdCBhIHR5cGVkIGFycmF5IScpO1xuICB9O1xuXG4gIHZhciBhbGxvY2F0ZSA9IGZ1bmN0aW9uKEMsIGxlbmd0aCl7XG4gICAgaWYoIShpc09iamVjdChDKSAmJiBUWVBFRF9DT05TVFJVQ1RPUiBpbiBDKSl7XG4gICAgICB0aHJvdyBUeXBlRXJyb3IoJ0l0IGlzIG5vdCBhIHR5cGVkIGFycmF5IGNvbnN0cnVjdG9yIScpO1xuICAgIH0gcmV0dXJuIG5ldyBDKGxlbmd0aCk7XG4gIH07XG5cbiAgdmFyIHNwZWNpZXNGcm9tTGlzdCA9IGZ1bmN0aW9uKE8sIGxpc3Qpe1xuICAgIHJldHVybiBmcm9tTGlzdChzcGVjaWVzQ29uc3RydWN0b3IoTywgT1tERUZfQ09OU1RSVUNUT1JdKSwgbGlzdCk7XG4gIH07XG5cbiAgdmFyIGZyb21MaXN0ID0gZnVuY3Rpb24oQywgbGlzdCl7XG4gICAgdmFyIGluZGV4ICA9IDBcbiAgICAgICwgbGVuZ3RoID0gbGlzdC5sZW5ndGhcbiAgICAgICwgcmVzdWx0ID0gYWxsb2NhdGUoQywgbGVuZ3RoKTtcbiAgICB3aGlsZShsZW5ndGggPiBpbmRleClyZXN1bHRbaW5kZXhdID0gbGlzdFtpbmRleCsrXTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIHZhciBhZGRHZXR0ZXIgPSBmdW5jdGlvbihpdCwga2V5LCBpbnRlcm5hbCl7XG4gICAgZFAoaXQsIGtleSwge2dldDogZnVuY3Rpb24oKXsgcmV0dXJuIHRoaXMuX2RbaW50ZXJuYWxdOyB9fSk7XG4gIH07XG5cbiAgdmFyICRmcm9tID0gZnVuY3Rpb24gZnJvbShzb3VyY2UgLyosIG1hcGZuLCB0aGlzQXJnICovKXtcbiAgICB2YXIgTyAgICAgICA9IHRvT2JqZWN0KHNvdXJjZSlcbiAgICAgICwgYUxlbiAgICA9IGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgICwgbWFwZm4gICA9IGFMZW4gPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkXG4gICAgICAsIG1hcHBpbmcgPSBtYXBmbiAhPT0gdW5kZWZpbmVkXG4gICAgICAsIGl0ZXJGbiAgPSBnZXRJdGVyRm4oTylcbiAgICAgICwgaSwgbGVuZ3RoLCB2YWx1ZXMsIHJlc3VsdCwgc3RlcCwgaXRlcmF0b3I7XG4gICAgaWYoaXRlckZuICE9IHVuZGVmaW5lZCAmJiAhaXNBcnJheUl0ZXIoaXRlckZuKSl7XG4gICAgICBmb3IoaXRlcmF0b3IgPSBpdGVyRm4uY2FsbChPKSwgdmFsdWVzID0gW10sIGkgPSAwOyAhKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmU7IGkrKyl7XG4gICAgICAgIHZhbHVlcy5wdXNoKHN0ZXAudmFsdWUpO1xuICAgICAgfSBPID0gdmFsdWVzO1xuICAgIH1cbiAgICBpZihtYXBwaW5nICYmIGFMZW4gPiAyKW1hcGZuID0gY3R4KG1hcGZuLCBhcmd1bWVudHNbMl0sIDIpO1xuICAgIGZvcihpID0gMCwgbGVuZ3RoID0gdG9MZW5ndGgoTy5sZW5ndGgpLCByZXN1bHQgPSBhbGxvY2F0ZSh0aGlzLCBsZW5ndGgpOyBsZW5ndGggPiBpOyBpKyspe1xuICAgICAgcmVzdWx0W2ldID0gbWFwcGluZyA/IG1hcGZuKE9baV0sIGkpIDogT1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICB2YXIgJG9mID0gZnVuY3Rpb24gb2YoLyouLi5pdGVtcyovKXtcbiAgICB2YXIgaW5kZXggID0gMFxuICAgICAgLCBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoXG4gICAgICAsIHJlc3VsdCA9IGFsbG9jYXRlKHRoaXMsIGxlbmd0aCk7XG4gICAgd2hpbGUobGVuZ3RoID4gaW5kZXgpcmVzdWx0W2luZGV4XSA9IGFyZ3VtZW50c1tpbmRleCsrXTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIC8vIGlPUyBTYWZhcmkgNi54IGZhaWxzIGhlcmVcbiAgdmFyIFRPX0xPQ0FMRV9CVUcgPSAhIVVpbnQ4QXJyYXkgJiYgZmFpbHMoZnVuY3Rpb24oKXsgYXJyYXlUb0xvY2FsZVN0cmluZy5jYWxsKG5ldyBVaW50OEFycmF5KDEpKTsgfSk7XG5cbiAgdmFyICR0b0xvY2FsZVN0cmluZyA9IGZ1bmN0aW9uIHRvTG9jYWxlU3RyaW5nKCl7XG4gICAgcmV0dXJuIGFycmF5VG9Mb2NhbGVTdHJpbmcuYXBwbHkoVE9fTE9DQUxFX0JVRyA/IGFycmF5U2xpY2UuY2FsbCh2YWxpZGF0ZSh0aGlzKSkgOiB2YWxpZGF0ZSh0aGlzKSwgYXJndW1lbnRzKTtcbiAgfTtcblxuICB2YXIgcHJvdG8gPSB7XG4gICAgY29weVdpdGhpbjogZnVuY3Rpb24gY29weVdpdGhpbih0YXJnZXQsIHN0YXJ0IC8qLCBlbmQgKi8pe1xuICAgICAgcmV0dXJuIGFycmF5Q29weVdpdGhpbi5jYWxsKHZhbGlkYXRlKHRoaXMpLCB0YXJnZXQsIHN0YXJ0LCBhcmd1bWVudHMubGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IHVuZGVmaW5lZCk7XG4gICAgfSxcbiAgICBldmVyeTogZnVuY3Rpb24gZXZlcnkoY2FsbGJhY2tmbiAvKiwgdGhpc0FyZyAqLyl7XG4gICAgICByZXR1cm4gYXJyYXlFdmVyeSh2YWxpZGF0ZSh0aGlzKSwgY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICAgIH0sXG4gICAgZmlsbDogZnVuY3Rpb24gZmlsbCh2YWx1ZSAvKiwgc3RhcnQsIGVuZCAqLyl7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICAgIHJldHVybiBhcnJheUZpbGwuYXBwbHkodmFsaWRhdGUodGhpcyksIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICBmaWx0ZXI6IGZ1bmN0aW9uIGZpbHRlcihjYWxsYmFja2ZuIC8qLCB0aGlzQXJnICovKXtcbiAgICAgIHJldHVybiBzcGVjaWVzRnJvbUxpc3QodGhpcywgYXJyYXlGaWx0ZXIodmFsaWRhdGUodGhpcyksIGNhbGxiYWNrZm4sXG4gICAgICAgIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKSk7XG4gICAgfSxcbiAgICBmaW5kOiBmdW5jdGlvbiBmaW5kKHByZWRpY2F0ZSAvKiwgdGhpc0FyZyAqLyl7XG4gICAgICByZXR1cm4gYXJyYXlGaW5kKHZhbGlkYXRlKHRoaXMpLCBwcmVkaWNhdGUsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgICB9LFxuICAgIGZpbmRJbmRleDogZnVuY3Rpb24gZmluZEluZGV4KHByZWRpY2F0ZSAvKiwgdGhpc0FyZyAqLyl7XG4gICAgICByZXR1cm4gYXJyYXlGaW5kSW5kZXgodmFsaWRhdGUodGhpcyksIHByZWRpY2F0ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICAgIH0sXG4gICAgZm9yRWFjaDogZnVuY3Rpb24gZm9yRWFjaChjYWxsYmFja2ZuIC8qLCB0aGlzQXJnICovKXtcbiAgICAgIGFycmF5Rm9yRWFjaCh2YWxpZGF0ZSh0aGlzKSwgY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICAgIH0sXG4gICAgaW5kZXhPZjogZnVuY3Rpb24gaW5kZXhPZihzZWFyY2hFbGVtZW50IC8qLCBmcm9tSW5kZXggKi8pe1xuICAgICAgcmV0dXJuIGFycmF5SW5kZXhPZih2YWxpZGF0ZSh0aGlzKSwgc2VhcmNoRWxlbWVudCwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICAgIH0sXG4gICAgaW5jbHVkZXM6IGZ1bmN0aW9uIGluY2x1ZGVzKHNlYXJjaEVsZW1lbnQgLyosIGZyb21JbmRleCAqLyl7XG4gICAgICByZXR1cm4gYXJyYXlJbmNsdWRlcyh2YWxpZGF0ZSh0aGlzKSwgc2VhcmNoRWxlbWVudCwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICAgIH0sXG4gICAgam9pbjogZnVuY3Rpb24gam9pbihzZXBhcmF0b3IpeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgICByZXR1cm4gYXJyYXlKb2luLmFwcGx5KHZhbGlkYXRlKHRoaXMpLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgbGFzdEluZGV4T2Y6IGZ1bmN0aW9uIGxhc3RJbmRleE9mKHNlYXJjaEVsZW1lbnQgLyosIGZyb21JbmRleCAqLyl7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICAgIHJldHVybiBhcnJheUxhc3RJbmRleE9mLmFwcGx5KHZhbGlkYXRlKHRoaXMpLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgbWFwOiBmdW5jdGlvbiBtYXAobWFwZm4gLyosIHRoaXNBcmcgKi8pe1xuICAgICAgcmV0dXJuICRtYXAodmFsaWRhdGUodGhpcyksIG1hcGZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gICAgfSxcbiAgICByZWR1Y2U6IGZ1bmN0aW9uIHJlZHVjZShjYWxsYmFja2ZuIC8qLCBpbml0aWFsVmFsdWUgKi8peyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgICByZXR1cm4gYXJyYXlSZWR1Y2UuYXBwbHkodmFsaWRhdGUodGhpcyksIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICByZWR1Y2VSaWdodDogZnVuY3Rpb24gcmVkdWNlUmlnaHQoY2FsbGJhY2tmbiAvKiwgaW5pdGlhbFZhbHVlICovKXsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgICAgcmV0dXJuIGFycmF5UmVkdWNlUmlnaHQuYXBwbHkodmFsaWRhdGUodGhpcyksIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICByZXZlcnNlOiBmdW5jdGlvbiByZXZlcnNlKCl7XG4gICAgICB2YXIgdGhhdCAgID0gdGhpc1xuICAgICAgICAsIGxlbmd0aCA9IHZhbGlkYXRlKHRoYXQpLmxlbmd0aFxuICAgICAgICAsIG1pZGRsZSA9IE1hdGguZmxvb3IobGVuZ3RoIC8gMilcbiAgICAgICAgLCBpbmRleCAgPSAwXG4gICAgICAgICwgdmFsdWU7XG4gICAgICB3aGlsZShpbmRleCA8IG1pZGRsZSl7XG4gICAgICAgIHZhbHVlICAgICAgICAgPSB0aGF0W2luZGV4XTtcbiAgICAgICAgdGhhdFtpbmRleCsrXSA9IHRoYXRbLS1sZW5ndGhdO1xuICAgICAgICB0aGF0W2xlbmd0aF0gID0gdmFsdWU7XG4gICAgICB9IHJldHVybiB0aGF0O1xuICAgIH0sXG4gICAgc29tZTogZnVuY3Rpb24gc29tZShjYWxsYmFja2ZuIC8qLCB0aGlzQXJnICovKXtcbiAgICAgIHJldHVybiBhcnJheVNvbWUodmFsaWRhdGUodGhpcyksIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgICB9LFxuICAgIHNvcnQ6IGZ1bmN0aW9uIHNvcnQoY29tcGFyZWZuKXtcbiAgICAgIHJldHVybiBhcnJheVNvcnQuY2FsbCh2YWxpZGF0ZSh0aGlzKSwgY29tcGFyZWZuKTtcbiAgICB9LFxuICAgIHN1YmFycmF5OiBmdW5jdGlvbiBzdWJhcnJheShiZWdpbiwgZW5kKXtcbiAgICAgIHZhciBPICAgICAgPSB2YWxpZGF0ZSh0aGlzKVxuICAgICAgICAsIGxlbmd0aCA9IE8ubGVuZ3RoXG4gICAgICAgICwgJGJlZ2luID0gdG9JbmRleChiZWdpbiwgbGVuZ3RoKTtcbiAgICAgIHJldHVybiBuZXcgKHNwZWNpZXNDb25zdHJ1Y3RvcihPLCBPW0RFRl9DT05TVFJVQ1RPUl0pKShcbiAgICAgICAgTy5idWZmZXIsXG4gICAgICAgIE8uYnl0ZU9mZnNldCArICRiZWdpbiAqIE8uQllURVNfUEVSX0VMRU1FTlQsXG4gICAgICAgIHRvTGVuZ3RoKChlbmQgPT09IHVuZGVmaW5lZCA/IGxlbmd0aCA6IHRvSW5kZXgoZW5kLCBsZW5ndGgpKSAtICRiZWdpbilcbiAgICAgICk7XG4gICAgfVxuICB9O1xuXG4gIHZhciAkc2xpY2UgPSBmdW5jdGlvbiBzbGljZShzdGFydCwgZW5kKXtcbiAgICByZXR1cm4gc3BlY2llc0Zyb21MaXN0KHRoaXMsIGFycmF5U2xpY2UuY2FsbCh2YWxpZGF0ZSh0aGlzKSwgc3RhcnQsIGVuZCkpO1xuICB9O1xuXG4gIHZhciAkc2V0ID0gZnVuY3Rpb24gc2V0KGFycmF5TGlrZSAvKiwgb2Zmc2V0ICovKXtcbiAgICB2YWxpZGF0ZSh0aGlzKTtcbiAgICB2YXIgb2Zmc2V0ID0gdG9PZmZzZXQoYXJndW1lbnRzWzFdLCAxKVxuICAgICAgLCBsZW5ndGggPSB0aGlzLmxlbmd0aFxuICAgICAgLCBzcmMgICAgPSB0b09iamVjdChhcnJheUxpa2UpXG4gICAgICAsIGxlbiAgICA9IHRvTGVuZ3RoKHNyYy5sZW5ndGgpXG4gICAgICAsIGluZGV4ICA9IDA7XG4gICAgaWYobGVuICsgb2Zmc2V0ID4gbGVuZ3RoKXRocm93IFJhbmdlRXJyb3IoV1JPTkdfTEVOR1RIKTtcbiAgICB3aGlsZShpbmRleCA8IGxlbil0aGlzW29mZnNldCArIGluZGV4XSA9IHNyY1tpbmRleCsrXTtcbiAgfTtcblxuICB2YXIgJGl0ZXJhdG9ycyA9IHtcbiAgICBlbnRyaWVzOiBmdW5jdGlvbiBlbnRyaWVzKCl7XG4gICAgICByZXR1cm4gYXJyYXlFbnRyaWVzLmNhbGwodmFsaWRhdGUodGhpcykpO1xuICAgIH0sXG4gICAga2V5czogZnVuY3Rpb24ga2V5cygpe1xuICAgICAgcmV0dXJuIGFycmF5S2V5cy5jYWxsKHZhbGlkYXRlKHRoaXMpKTtcbiAgICB9LFxuICAgIHZhbHVlczogZnVuY3Rpb24gdmFsdWVzKCl7XG4gICAgICByZXR1cm4gYXJyYXlWYWx1ZXMuY2FsbCh2YWxpZGF0ZSh0aGlzKSk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBpc1RBSW5kZXggPSBmdW5jdGlvbih0YXJnZXQsIGtleSl7XG4gICAgcmV0dXJuIGlzT2JqZWN0KHRhcmdldClcbiAgICAgICYmIHRhcmdldFtUWVBFRF9BUlJBWV1cbiAgICAgICYmIHR5cGVvZiBrZXkgIT0gJ3N5bWJvbCdcbiAgICAgICYmIGtleSBpbiB0YXJnZXRcbiAgICAgICYmIFN0cmluZygra2V5KSA9PSBTdHJpbmcoa2V5KTtcbiAgfTtcbiAgdmFyICRnZXREZXNjID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KXtcbiAgICByZXR1cm4gaXNUQUluZGV4KHRhcmdldCwga2V5ID0gdG9QcmltaXRpdmUoa2V5LCB0cnVlKSlcbiAgICAgID8gcHJvcGVydHlEZXNjKDIsIHRhcmdldFtrZXldKVxuICAgICAgOiBnT1BEKHRhcmdldCwga2V5KTtcbiAgfTtcbiAgdmFyICRzZXREZXNjID0gZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIGRlc2Mpe1xuICAgIGlmKGlzVEFJbmRleCh0YXJnZXQsIGtleSA9IHRvUHJpbWl0aXZlKGtleSwgdHJ1ZSkpXG4gICAgICAmJiBpc09iamVjdChkZXNjKVxuICAgICAgJiYgaGFzKGRlc2MsICd2YWx1ZScpXG4gICAgICAmJiAhaGFzKGRlc2MsICdnZXQnKVxuICAgICAgJiYgIWhhcyhkZXNjLCAnc2V0JylcbiAgICAgIC8vIFRPRE86IGFkZCB2YWxpZGF0aW9uIGRlc2NyaXB0b3Igdy9vIGNhbGxpbmcgYWNjZXNzb3JzXG4gICAgICAmJiAhZGVzYy5jb25maWd1cmFibGVcbiAgICAgICYmICghaGFzKGRlc2MsICd3cml0YWJsZScpIHx8IGRlc2Mud3JpdGFibGUpXG4gICAgICAmJiAoIWhhcyhkZXNjLCAnZW51bWVyYWJsZScpIHx8IGRlc2MuZW51bWVyYWJsZSlcbiAgICApe1xuICAgICAgdGFyZ2V0W2tleV0gPSBkZXNjLnZhbHVlO1xuICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9IGVsc2UgcmV0dXJuIGRQKHRhcmdldCwga2V5LCBkZXNjKTtcbiAgfTtcblxuICBpZighQUxMX0NPTlNUUlVDVE9SUyl7XG4gICAgJEdPUEQuZiA9ICRnZXREZXNjO1xuICAgICREUC5mICAgPSAkc2V0RGVzYztcbiAgfVxuXG4gICRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIUFMTF9DT05TVFJVQ1RPUlMsICdPYmplY3QnLCB7XG4gICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiAkZ2V0RGVzYyxcbiAgICBkZWZpbmVQcm9wZXJ0eTogICAgICAgICAgICRzZXREZXNjXG4gIH0pO1xuXG4gIGlmKGZhaWxzKGZ1bmN0aW9uKCl7IGFycmF5VG9TdHJpbmcuY2FsbCh7fSk7IH0pKXtcbiAgICBhcnJheVRvU3RyaW5nID0gYXJyYXlUb0xvY2FsZVN0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKCl7XG4gICAgICByZXR1cm4gYXJyYXlKb2luLmNhbGwodGhpcyk7XG4gICAgfVxuICB9XG5cbiAgdmFyICRUeXBlZEFycmF5UHJvdG90eXBlJCA9IHJlZGVmaW5lQWxsKHt9LCBwcm90byk7XG4gIHJlZGVmaW5lQWxsKCRUeXBlZEFycmF5UHJvdG90eXBlJCwgJGl0ZXJhdG9ycyk7XG4gIGhpZGUoJFR5cGVkQXJyYXlQcm90b3R5cGUkLCBJVEVSQVRPUiwgJGl0ZXJhdG9ycy52YWx1ZXMpO1xuICByZWRlZmluZUFsbCgkVHlwZWRBcnJheVByb3RvdHlwZSQsIHtcbiAgICBzbGljZTogICAgICAgICAgJHNsaWNlLFxuICAgIHNldDogICAgICAgICAgICAkc2V0LFxuICAgIGNvbnN0cnVjdG9yOiAgICBmdW5jdGlvbigpeyAvKiBub29wICovIH0sXG4gICAgdG9TdHJpbmc6ICAgICAgIGFycmF5VG9TdHJpbmcsXG4gICAgdG9Mb2NhbGVTdHJpbmc6ICR0b0xvY2FsZVN0cmluZ1xuICB9KTtcbiAgYWRkR2V0dGVyKCRUeXBlZEFycmF5UHJvdG90eXBlJCwgJ2J1ZmZlcicsICdiJyk7XG4gIGFkZEdldHRlcigkVHlwZWRBcnJheVByb3RvdHlwZSQsICdieXRlT2Zmc2V0JywgJ28nKTtcbiAgYWRkR2V0dGVyKCRUeXBlZEFycmF5UHJvdG90eXBlJCwgJ2J5dGVMZW5ndGgnLCAnbCcpO1xuICBhZGRHZXR0ZXIoJFR5cGVkQXJyYXlQcm90b3R5cGUkLCAnbGVuZ3RoJywgJ2UnKTtcbiAgZFAoJFR5cGVkQXJyYXlQcm90b3R5cGUkLCBUQUcsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uKCl7IHJldHVybiB0aGlzW1RZUEVEX0FSUkFZXTsgfVxuICB9KTtcblxuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKEtFWSwgQllURVMsIHdyYXBwZXIsIENMQU1QRUQpe1xuICAgIENMQU1QRUQgPSAhIUNMQU1QRUQ7XG4gICAgdmFyIE5BTUUgICAgICAgPSBLRVkgKyAoQ0xBTVBFRCA/ICdDbGFtcGVkJyA6ICcnKSArICdBcnJheSdcbiAgICAgICwgSVNOVF9VSU5UOCA9IE5BTUUgIT0gJ1VpbnQ4QXJyYXknXG4gICAgICAsIEdFVFRFUiAgICAgPSAnZ2V0JyArIEtFWVxuICAgICAgLCBTRVRURVIgICAgID0gJ3NldCcgKyBLRVlcbiAgICAgICwgVHlwZWRBcnJheSA9IGdsb2JhbFtOQU1FXVxuICAgICAgLCBCYXNlICAgICAgID0gVHlwZWRBcnJheSB8fCB7fVxuICAgICAgLCBUQUMgICAgICAgID0gVHlwZWRBcnJheSAmJiBnZXRQcm90b3R5cGVPZihUeXBlZEFycmF5KVxuICAgICAgLCBGT1JDRUQgICAgID0gIVR5cGVkQXJyYXkgfHwgISR0eXBlZC5BQlZcbiAgICAgICwgTyAgICAgICAgICA9IHt9XG4gICAgICAsIFR5cGVkQXJyYXlQcm90b3R5cGUgPSBUeXBlZEFycmF5ICYmIFR5cGVkQXJyYXlbUFJPVE9UWVBFXTtcbiAgICB2YXIgZ2V0dGVyID0gZnVuY3Rpb24odGhhdCwgaW5kZXgpe1xuICAgICAgdmFyIGRhdGEgPSB0aGF0Ll9kO1xuICAgICAgcmV0dXJuIGRhdGEudltHRVRURVJdKGluZGV4ICogQllURVMgKyBkYXRhLm8sIExJVFRMRV9FTkRJQU4pO1xuICAgIH07XG4gICAgdmFyIHNldHRlciA9IGZ1bmN0aW9uKHRoYXQsIGluZGV4LCB2YWx1ZSl7XG4gICAgICB2YXIgZGF0YSA9IHRoYXQuX2Q7XG4gICAgICBpZihDTEFNUEVEKXZhbHVlID0gKHZhbHVlID0gTWF0aC5yb3VuZCh2YWx1ZSkpIDwgMCA/IDAgOiB2YWx1ZSA+IDB4ZmYgPyAweGZmIDogdmFsdWUgJiAweGZmO1xuICAgICAgZGF0YS52W1NFVFRFUl0oaW5kZXggKiBCWVRFUyArIGRhdGEubywgdmFsdWUsIExJVFRMRV9FTkRJQU4pO1xuICAgIH07XG4gICAgdmFyIGFkZEVsZW1lbnQgPSBmdW5jdGlvbih0aGF0LCBpbmRleCl7XG4gICAgICBkUCh0aGF0LCBpbmRleCwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uKCl7XG4gICAgICAgICAgcmV0dXJuIGdldHRlcih0aGlzLCBpbmRleCk7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24odmFsdWUpe1xuICAgICAgICAgIHJldHVybiBzZXR0ZXIodGhpcywgaW5kZXgsIHZhbHVlKTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgfTtcbiAgICBpZihGT1JDRUQpe1xuICAgICAgVHlwZWRBcnJheSA9IHdyYXBwZXIoZnVuY3Rpb24odGhhdCwgZGF0YSwgJG9mZnNldCwgJGxlbmd0aCl7XG4gICAgICAgIGFuSW5zdGFuY2UodGhhdCwgVHlwZWRBcnJheSwgTkFNRSwgJ19kJyk7XG4gICAgICAgIHZhciBpbmRleCAgPSAwXG4gICAgICAgICAgLCBvZmZzZXQgPSAwXG4gICAgICAgICAgLCBidWZmZXIsIGJ5dGVMZW5ndGgsIGxlbmd0aCwga2xhc3M7XG4gICAgICAgIGlmKCFpc09iamVjdChkYXRhKSl7XG4gICAgICAgICAgbGVuZ3RoICAgICA9IHN0cmljdFRvTGVuZ3RoKGRhdGEsIHRydWUpXG4gICAgICAgICAgYnl0ZUxlbmd0aCA9IGxlbmd0aCAqIEJZVEVTO1xuICAgICAgICAgIGJ1ZmZlciAgICAgPSBuZXcgJEFycmF5QnVmZmVyKGJ5dGVMZW5ndGgpO1xuICAgICAgICB9IGVsc2UgaWYoZGF0YSBpbnN0YW5jZW9mICRBcnJheUJ1ZmZlciB8fCAoa2xhc3MgPSBjbGFzc29mKGRhdGEpKSA9PSBBUlJBWV9CVUZGRVIgfHwga2xhc3MgPT0gU0hBUkVEX0JVRkZFUil7XG4gICAgICAgICAgYnVmZmVyID0gZGF0YTtcbiAgICAgICAgICBvZmZzZXQgPSB0b09mZnNldCgkb2Zmc2V0LCBCWVRFUyk7XG4gICAgICAgICAgdmFyICRsZW4gPSBkYXRhLmJ5dGVMZW5ndGg7XG4gICAgICAgICAgaWYoJGxlbmd0aCA9PT0gdW5kZWZpbmVkKXtcbiAgICAgICAgICAgIGlmKCRsZW4gJSBCWVRFUyl0aHJvdyBSYW5nZUVycm9yKFdST05HX0xFTkdUSCk7XG4gICAgICAgICAgICBieXRlTGVuZ3RoID0gJGxlbiAtIG9mZnNldDtcbiAgICAgICAgICAgIGlmKGJ5dGVMZW5ndGggPCAwKXRocm93IFJhbmdlRXJyb3IoV1JPTkdfTEVOR1RIKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYnl0ZUxlbmd0aCA9IHRvTGVuZ3RoKCRsZW5ndGgpICogQllURVM7XG4gICAgICAgICAgICBpZihieXRlTGVuZ3RoICsgb2Zmc2V0ID4gJGxlbil0aHJvdyBSYW5nZUVycm9yKFdST05HX0xFTkdUSCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxlbmd0aCA9IGJ5dGVMZW5ndGggLyBCWVRFUztcbiAgICAgICAgfSBlbHNlIGlmKFRZUEVEX0FSUkFZIGluIGRhdGEpe1xuICAgICAgICAgIHJldHVybiBmcm9tTGlzdChUeXBlZEFycmF5LCBkYXRhKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gJGZyb20uY2FsbChUeXBlZEFycmF5LCBkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBoaWRlKHRoYXQsICdfZCcsIHtcbiAgICAgICAgICBiOiBidWZmZXIsXG4gICAgICAgICAgbzogb2Zmc2V0LFxuICAgICAgICAgIGw6IGJ5dGVMZW5ndGgsXG4gICAgICAgICAgZTogbGVuZ3RoLFxuICAgICAgICAgIHY6IG5ldyAkRGF0YVZpZXcoYnVmZmVyKVxuICAgICAgICB9KTtcbiAgICAgICAgd2hpbGUoaW5kZXggPCBsZW5ndGgpYWRkRWxlbWVudCh0aGF0LCBpbmRleCsrKTtcbiAgICAgIH0pO1xuICAgICAgVHlwZWRBcnJheVByb3RvdHlwZSA9IFR5cGVkQXJyYXlbUFJPVE9UWVBFXSA9IGNyZWF0ZSgkVHlwZWRBcnJheVByb3RvdHlwZSQpO1xuICAgICAgaGlkZShUeXBlZEFycmF5UHJvdG90eXBlLCAnY29uc3RydWN0b3InLCBUeXBlZEFycmF5KTtcbiAgICB9IGVsc2UgaWYoISRpdGVyRGV0ZWN0KGZ1bmN0aW9uKGl0ZXIpe1xuICAgICAgLy8gVjggd29ya3Mgd2l0aCBpdGVyYXRvcnMsIGJ1dCBmYWlscyBpbiBtYW55IG90aGVyIGNhc2VzXG4gICAgICAvLyBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9NDU1MlxuICAgICAgbmV3IFR5cGVkQXJyYXkobnVsbCk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3XG4gICAgICBuZXcgVHlwZWRBcnJheShpdGVyKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXdcbiAgICB9LCB0cnVlKSl7XG4gICAgICBUeXBlZEFycmF5ID0gd3JhcHBlcihmdW5jdGlvbih0aGF0LCBkYXRhLCAkb2Zmc2V0LCAkbGVuZ3RoKXtcbiAgICAgICAgYW5JbnN0YW5jZSh0aGF0LCBUeXBlZEFycmF5LCBOQU1FKTtcbiAgICAgICAgdmFyIGtsYXNzO1xuICAgICAgICAvLyBgd3NgIG1vZHVsZSBidWcsIHRlbXBvcmFyaWx5IHJlbW92ZSB2YWxpZGF0aW9uIGxlbmd0aCBmb3IgVWludDhBcnJheVxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vd2Vic29ja2V0cy93cy9wdWxsLzY0NVxuICAgICAgICBpZighaXNPYmplY3QoZGF0YSkpcmV0dXJuIG5ldyBCYXNlKHN0cmljdFRvTGVuZ3RoKGRhdGEsIElTTlRfVUlOVDgpKTtcbiAgICAgICAgaWYoZGF0YSBpbnN0YW5jZW9mICRBcnJheUJ1ZmZlciB8fCAoa2xhc3MgPSBjbGFzc29mKGRhdGEpKSA9PSBBUlJBWV9CVUZGRVIgfHwga2xhc3MgPT0gU0hBUkVEX0JVRkZFUil7XG4gICAgICAgICAgcmV0dXJuICRsZW5ndGggIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyBuZXcgQmFzZShkYXRhLCB0b09mZnNldCgkb2Zmc2V0LCBCWVRFUyksICRsZW5ndGgpXG4gICAgICAgICAgICA6ICRvZmZzZXQgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICA/IG5ldyBCYXNlKGRhdGEsIHRvT2Zmc2V0KCRvZmZzZXQsIEJZVEVTKSlcbiAgICAgICAgICAgICAgOiBuZXcgQmFzZShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBpZihUWVBFRF9BUlJBWSBpbiBkYXRhKXJldHVybiBmcm9tTGlzdChUeXBlZEFycmF5LCBkYXRhKTtcbiAgICAgICAgcmV0dXJuICRmcm9tLmNhbGwoVHlwZWRBcnJheSwgZGF0YSk7XG4gICAgICB9KTtcbiAgICAgIGFycmF5Rm9yRWFjaChUQUMgIT09IEZ1bmN0aW9uLnByb3RvdHlwZSA/IGdPUE4oQmFzZSkuY29uY2F0KGdPUE4oVEFDKSkgOiBnT1BOKEJhc2UpLCBmdW5jdGlvbihrZXkpe1xuICAgICAgICBpZighKGtleSBpbiBUeXBlZEFycmF5KSloaWRlKFR5cGVkQXJyYXksIGtleSwgQmFzZVtrZXldKTtcbiAgICAgIH0pO1xuICAgICAgVHlwZWRBcnJheVtQUk9UT1RZUEVdID0gVHlwZWRBcnJheVByb3RvdHlwZTtcbiAgICAgIGlmKCFMSUJSQVJZKVR5cGVkQXJyYXlQcm90b3R5cGUuY29uc3RydWN0b3IgPSBUeXBlZEFycmF5O1xuICAgIH1cbiAgICB2YXIgJG5hdGl2ZUl0ZXJhdG9yICAgPSBUeXBlZEFycmF5UHJvdG90eXBlW0lURVJBVE9SXVxuICAgICAgLCBDT1JSRUNUX0lURVJfTkFNRSA9ICEhJG5hdGl2ZUl0ZXJhdG9yICYmICgkbmF0aXZlSXRlcmF0b3IubmFtZSA9PSAndmFsdWVzJyB8fCAkbmF0aXZlSXRlcmF0b3IubmFtZSA9PSB1bmRlZmluZWQpXG4gICAgICAsICRpdGVyYXRvciAgICAgICAgID0gJGl0ZXJhdG9ycy52YWx1ZXM7XG4gICAgaGlkZShUeXBlZEFycmF5LCBUWVBFRF9DT05TVFJVQ1RPUiwgdHJ1ZSk7XG4gICAgaGlkZShUeXBlZEFycmF5UHJvdG90eXBlLCBUWVBFRF9BUlJBWSwgTkFNRSk7XG4gICAgaGlkZShUeXBlZEFycmF5UHJvdG90eXBlLCBWSUVXLCB0cnVlKTtcbiAgICBoaWRlKFR5cGVkQXJyYXlQcm90b3R5cGUsIERFRl9DT05TVFJVQ1RPUiwgVHlwZWRBcnJheSk7XG5cbiAgICBpZihDTEFNUEVEID8gbmV3IFR5cGVkQXJyYXkoMSlbVEFHXSAhPSBOQU1FIDogIShUQUcgaW4gVHlwZWRBcnJheVByb3RvdHlwZSkpe1xuICAgICAgZFAoVHlwZWRBcnJheVByb3RvdHlwZSwgVEFHLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24oKXsgcmV0dXJuIE5BTUU7IH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIE9bTkFNRV0gPSBUeXBlZEFycmF5O1xuXG4gICAgJGV4cG9ydCgkZXhwb3J0LkcgKyAkZXhwb3J0LlcgKyAkZXhwb3J0LkYgKiAoVHlwZWRBcnJheSAhPSBCYXNlKSwgTyk7XG5cbiAgICAkZXhwb3J0KCRleHBvcnQuUywgTkFNRSwge1xuICAgICAgQllURVNfUEVSX0VMRU1FTlQ6IEJZVEVTLFxuICAgICAgZnJvbTogJGZyb20sXG4gICAgICBvZjogJG9mXG4gICAgfSk7XG5cbiAgICBpZighKEJZVEVTX1BFUl9FTEVNRU5UIGluIFR5cGVkQXJyYXlQcm90b3R5cGUpKWhpZGUoVHlwZWRBcnJheVByb3RvdHlwZSwgQllURVNfUEVSX0VMRU1FTlQsIEJZVEVTKTtcblxuICAgICRleHBvcnQoJGV4cG9ydC5QLCBOQU1FLCBwcm90byk7XG5cbiAgICBzZXRTcGVjaWVzKE5BTUUpO1xuXG4gICAgJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiBGT1JDRURfU0VULCBOQU1FLCB7c2V0OiAkc2V0fSk7XG5cbiAgICAkZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqICFDT1JSRUNUX0lURVJfTkFNRSwgTkFNRSwgJGl0ZXJhdG9ycyk7XG5cbiAgICAkZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIChUeXBlZEFycmF5UHJvdG90eXBlLnRvU3RyaW5nICE9IGFycmF5VG9TdHJpbmcpLCBOQU1FLCB7dG9TdHJpbmc6IGFycmF5VG9TdHJpbmd9KTtcblxuICAgICRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogZmFpbHMoZnVuY3Rpb24oKXtcbiAgICAgIG5ldyBUeXBlZEFycmF5KDEpLnNsaWNlKCk7XG4gICAgfSksIE5BTUUsIHtzbGljZTogJHNsaWNlfSk7XG5cbiAgICAkZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIChmYWlscyhmdW5jdGlvbigpe1xuICAgICAgcmV0dXJuIFsxLCAyXS50b0xvY2FsZVN0cmluZygpICE9IG5ldyBUeXBlZEFycmF5KFsxLCAyXSkudG9Mb2NhbGVTdHJpbmcoKVxuICAgIH0pIHx8ICFmYWlscyhmdW5jdGlvbigpe1xuICAgICAgVHlwZWRBcnJheVByb3RvdHlwZS50b0xvY2FsZVN0cmluZy5jYWxsKFsxLCAyXSk7XG4gICAgfSkpLCBOQU1FLCB7dG9Mb2NhbGVTdHJpbmc6ICR0b0xvY2FsZVN0cmluZ30pO1xuXG4gICAgSXRlcmF0b3JzW05BTUVdID0gQ09SUkVDVF9JVEVSX05BTUUgPyAkbmF0aXZlSXRlcmF0b3IgOiAkaXRlcmF0b3I7XG4gICAgaWYoIUxJQlJBUlkgJiYgIUNPUlJFQ1RfSVRFUl9OQU1FKWhpZGUoVHlwZWRBcnJheVByb3RvdHlwZSwgSVRFUkFUT1IsICRpdGVyYXRvcik7XG4gIH07XG59IGVsc2UgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpeyAvKiBlbXB0eSAqLyB9O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL190eXBlZC1hcnJheS5qc1xuICoqIG1vZHVsZSBpZCA9IDIxOVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwidmFyIGNsYXNzb2YgICA9IHJlcXVpcmUoJy4vX2NsYXNzb2YnKVxuICAsIElURVJBVE9SICA9IHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpXG4gICwgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2NvcmUnKS5pc0l0ZXJhYmxlID0gZnVuY3Rpb24oaXQpe1xuICB2YXIgTyA9IE9iamVjdChpdCk7XG4gIHJldHVybiBPW0lURVJBVE9SXSAhPT0gdW5kZWZpbmVkXG4gICAgfHwgJ0BAaXRlcmF0b3InIGluIE9cbiAgICB8fCBJdGVyYXRvcnMuaGFzT3duUHJvcGVydHkoY2xhc3NvZihPKSk7XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2NvcmUuaXMtaXRlcmFibGUuanNcbiAqKiBtb2R1bGUgaWQgPSAyMjBcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInJlcXVpcmUoJy4vX3R5cGVkLWFycmF5JykoJ1VpbnQ4JywgMSwgZnVuY3Rpb24oaW5pdCl7XG4gIHJldHVybiBmdW5jdGlvbiBVaW50OEFycmF5KGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCl7XG4gICAgcmV0dXJuIGluaXQodGhpcywgZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKTtcbiAgfTtcbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi50eXBlZC51aW50OC1hcnJheS5qc1xuICoqIG1vZHVsZSBpZCA9IDIyMVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwicmVxdWlyZSgnLi9fdHlwZWQtYXJyYXknKSgnVWludDgnLCAxLCBmdW5jdGlvbihpbml0KXtcbiAgcmV0dXJuIGZ1bmN0aW9uIFVpbnQ4Q2xhbXBlZEFycmF5KGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCl7XG4gICAgcmV0dXJuIGluaXQodGhpcywgZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKTtcbiAgfTtcbn0sIHRydWUpO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi50eXBlZC51aW50OC1jbGFtcGVkLWFycmF5LmpzXG4gKiogbW9kdWxlIGlkID0gMjIyXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJyZXF1aXJlKCcuL190eXBlZC1hcnJheScpKCdJbnQxNicsIDIsIGZ1bmN0aW9uKGluaXQpe1xuICByZXR1cm4gZnVuY3Rpb24gSW50MTZBcnJheShkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpe1xuICAgIHJldHVybiBpbml0KHRoaXMsIGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCk7XG4gIH07XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYudHlwZWQuaW50MTYtYXJyYXkuanNcbiAqKiBtb2R1bGUgaWQgPSAyMjNcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInJlcXVpcmUoJy4vX3R5cGVkLWFycmF5JykoJ1VpbnQxNicsIDIsIGZ1bmN0aW9uKGluaXQpe1xuICByZXR1cm4gZnVuY3Rpb24gVWludDE2QXJyYXkoZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKXtcbiAgICByZXR1cm4gaW5pdCh0aGlzLCBkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpO1xuICB9O1xufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnR5cGVkLnVpbnQxNi1hcnJheS5qc1xuICoqIG1vZHVsZSBpZCA9IDIyNFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwicmVxdWlyZSgnLi9fdHlwZWQtYXJyYXknKSgnSW50MzInLCA0LCBmdW5jdGlvbihpbml0KXtcbiAgcmV0dXJuIGZ1bmN0aW9uIEludDMyQXJyYXkoZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKXtcbiAgICByZXR1cm4gaW5pdCh0aGlzLCBkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpO1xuICB9O1xufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnR5cGVkLmludDMyLWFycmF5LmpzXG4gKiogbW9kdWxlIGlkID0gMjI1XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJyZXF1aXJlKCcuL190eXBlZC1hcnJheScpKCdVaW50MzInLCA0LCBmdW5jdGlvbihpbml0KXtcbiAgcmV0dXJuIGZ1bmN0aW9uIFVpbnQzMkFycmF5KGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCl7XG4gICAgcmV0dXJuIGluaXQodGhpcywgZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKTtcbiAgfTtcbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi50eXBlZC51aW50MzItYXJyYXkuanNcbiAqKiBtb2R1bGUgaWQgPSAyMjZcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInJlcXVpcmUoJy4vX3R5cGVkLWFycmF5JykoJ0Zsb2F0MzInLCA0LCBmdW5jdGlvbihpbml0KXtcbiAgcmV0dXJuIGZ1bmN0aW9uIEZsb2F0MzJBcnJheShkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpe1xuICAgIHJldHVybiBpbml0KHRoaXMsIGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCk7XG4gIH07XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYudHlwZWQuZmxvYXQzMi1hcnJheS5qc1xuICoqIG1vZHVsZSBpZCA9IDIyN1xuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwicmVxdWlyZSgnLi9fdHlwZWQtYXJyYXknKSgnRmxvYXQ2NCcsIDgsIGZ1bmN0aW9uKGluaXQpe1xuICByZXR1cm4gZnVuY3Rpb24gRmxvYXQ2NEFycmF5KGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCl7XG4gICAgcmV0dXJuIGluaXQodGhpcywgZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKTtcbiAgfTtcbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi50eXBlZC5mbG9hdDY0LWFycmF5LmpzXG4gKiogbW9kdWxlIGlkID0gMjI4XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyAyNi4xLjEgUmVmbGVjdC5hcHBseSh0YXJnZXQsIHRoaXNBcmd1bWVudCwgYXJndW1lbnRzTGlzdClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCBfYXBwbHkgID0gRnVuY3Rpb24uYXBwbHk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnUmVmbGVjdCcsIHtcbiAgYXBwbHk6IGZ1bmN0aW9uIGFwcGx5KHRhcmdldCwgdGhpc0FyZ3VtZW50LCBhcmd1bWVudHNMaXN0KXtcbiAgICByZXR1cm4gX2FwcGx5LmNhbGwodGFyZ2V0LCB0aGlzQXJndW1lbnQsIGFyZ3VtZW50c0xpc3QpO1xuICB9XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5hcHBseS5qc1xuICoqIG1vZHVsZSBpZCA9IDIyOVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gMjYuMS4yIFJlZmxlY3QuY29uc3RydWN0KHRhcmdldCwgYXJndW1lbnRzTGlzdCBbLCBuZXdUYXJnZXRdKVxudmFyICRleHBvcnQgICA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICwgY3JlYXRlICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWNyZWF0ZScpXG4gICwgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpXG4gICwgYW5PYmplY3QgID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0JylcbiAgLCBpc09iamVjdCAgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKVxuICAsIGJpbmQgICAgICA9IHJlcXVpcmUoJy4vX2JpbmQnKTtcblxuLy8gTVMgRWRnZSBzdXBwb3J0cyBvbmx5IDIgYXJndW1lbnRzXG4vLyBGRiBOaWdodGx5IHNldHMgdGhpcmQgYXJndW1lbnQgYXMgYG5ldy50YXJnZXRgLCBidXQgZG9lcyBub3QgY3JlYXRlIGB0aGlzYCBmcm9tIGl0XG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqIHJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24oKXtcbiAgZnVuY3Rpb24gRigpe31cbiAgcmV0dXJuICEoUmVmbGVjdC5jb25zdHJ1Y3QoZnVuY3Rpb24oKXt9LCBbXSwgRikgaW5zdGFuY2VvZiBGKTtcbn0pLCAnUmVmbGVjdCcsIHtcbiAgY29uc3RydWN0OiBmdW5jdGlvbiBjb25zdHJ1Y3QoVGFyZ2V0LCBhcmdzIC8qLCBuZXdUYXJnZXQqLyl7XG4gICAgYUZ1bmN0aW9uKFRhcmdldCk7XG4gICAgdmFyIG5ld1RhcmdldCA9IGFyZ3VtZW50cy5sZW5ndGggPCAzID8gVGFyZ2V0IDogYUZ1bmN0aW9uKGFyZ3VtZW50c1syXSk7XG4gICAgaWYoVGFyZ2V0ID09IG5ld1RhcmdldCl7XG4gICAgICAvLyB3L28gYWx0ZXJlZCBuZXdUYXJnZXQsIG9wdGltaXphdGlvbiBmb3IgMC00IGFyZ3VtZW50c1xuICAgICAgaWYoYXJncyAhPSB1bmRlZmluZWQpc3dpdGNoKGFuT2JqZWN0KGFyZ3MpLmxlbmd0aCl7XG4gICAgICAgIGNhc2UgMDogcmV0dXJuIG5ldyBUYXJnZXQ7XG4gICAgICAgIGNhc2UgMTogcmV0dXJuIG5ldyBUYXJnZXQoYXJnc1swXSk7XG4gICAgICAgIGNhc2UgMjogcmV0dXJuIG5ldyBUYXJnZXQoYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgICAgIGNhc2UgMzogcmV0dXJuIG5ldyBUYXJnZXQoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gICAgICAgIGNhc2UgNDogcmV0dXJuIG5ldyBUYXJnZXQoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSk7XG4gICAgICB9XG4gICAgICAvLyB3L28gYWx0ZXJlZCBuZXdUYXJnZXQsIGxvdCBvZiBhcmd1bWVudHMgY2FzZVxuICAgICAgdmFyICRhcmdzID0gW251bGxdO1xuICAgICAgJGFyZ3MucHVzaC5hcHBseSgkYXJncywgYXJncyk7XG4gICAgICByZXR1cm4gbmV3IChiaW5kLmFwcGx5KFRhcmdldCwgJGFyZ3MpKTtcbiAgICB9XG4gICAgLy8gd2l0aCBhbHRlcmVkIG5ld1RhcmdldCwgbm90IHN1cHBvcnQgYnVpbHQtaW4gY29uc3RydWN0b3JzXG4gICAgdmFyIHByb3RvICAgID0gbmV3VGFyZ2V0LnByb3RvdHlwZVxuICAgICAgLCBpbnN0YW5jZSA9IGNyZWF0ZShpc09iamVjdChwcm90bykgPyBwcm90byA6IE9iamVjdC5wcm90b3R5cGUpXG4gICAgICAsIHJlc3VsdCAgID0gRnVuY3Rpb24uYXBwbHkuY2FsbChUYXJnZXQsIGluc3RhbmNlLCBhcmdzKTtcbiAgICByZXR1cm4gaXNPYmplY3QocmVzdWx0KSA/IHJlc3VsdCA6IGluc3RhbmNlO1xuICB9XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5jb25zdHJ1Y3QuanNcbiAqKiBtb2R1bGUgaWQgPSAyMzBcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDI2LjEuMyBSZWZsZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXksIGF0dHJpYnV0ZXMpXG52YXIgZFAgICAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKVxuICAsICRleHBvcnQgICAgID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCBhbk9iamVjdCAgICA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpXG4gICwgdG9QcmltaXRpdmUgPSByZXF1aXJlKCcuL190by1wcmltaXRpdmUnKTtcblxuLy8gTVMgRWRnZSBoYXMgYnJva2VuIFJlZmxlY3QuZGVmaW5lUHJvcGVydHkgLSB0aHJvd2luZyBpbnN0ZWFkIG9mIHJldHVybmluZyBmYWxzZVxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiByZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uKCl7XG4gIFJlZmxlY3QuZGVmaW5lUHJvcGVydHkoZFAuZih7fSwgMSwge3ZhbHVlOiAxfSksIDEsIHt2YWx1ZTogMn0pO1xufSksICdSZWZsZWN0Jywge1xuICBkZWZpbmVQcm9wZXJ0eTogZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eUtleSwgYXR0cmlidXRlcyl7XG4gICAgYW5PYmplY3QodGFyZ2V0KTtcbiAgICBwcm9wZXJ0eUtleSA9IHRvUHJpbWl0aXZlKHByb3BlcnR5S2V5LCB0cnVlKTtcbiAgICBhbk9iamVjdChhdHRyaWJ1dGVzKTtcbiAgICB0cnkge1xuICAgICAgZFAuZih0YXJnZXQsIHByb3BlcnR5S2V5LCBhdHRyaWJ1dGVzKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2goZSl7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5kZWZpbmUtcHJvcGVydHkuanNcbiAqKiBtb2R1bGUgaWQgPSAyMzFcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDI2LjEuNCBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXkpXG52YXIgJGV4cG9ydCAgPSByZXF1aXJlKCcuL19leHBvcnQnKVxuICAsIGdPUEQgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcGQnKS5mXG4gICwgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdSZWZsZWN0Jywge1xuICBkZWxldGVQcm9wZXJ0eTogZnVuY3Rpb24gZGVsZXRlUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eUtleSl7XG4gICAgdmFyIGRlc2MgPSBnT1BEKGFuT2JqZWN0KHRhcmdldCksIHByb3BlcnR5S2V5KTtcbiAgICByZXR1cm4gZGVzYyAmJiAhZGVzYy5jb25maWd1cmFibGUgPyBmYWxzZSA6IGRlbGV0ZSB0YXJnZXRbcHJvcGVydHlLZXldO1xuICB9XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5kZWxldGUtcHJvcGVydHkuanNcbiAqKiBtb2R1bGUgaWQgPSAyMzJcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0Jztcbi8vIDI2LjEuNSBSZWZsZWN0LmVudW1lcmF0ZSh0YXJnZXQpXG52YXIgJGV4cG9ydCAgPSByZXF1aXJlKCcuL19leHBvcnQnKVxuICAsIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgRW51bWVyYXRlID0gZnVuY3Rpb24oaXRlcmF0ZWQpe1xuICB0aGlzLl90ID0gYW5PYmplY3QoaXRlcmF0ZWQpOyAvLyB0YXJnZXRcbiAgdGhpcy5faSA9IDA7ICAgICAgICAgICAgICAgICAgLy8gbmV4dCBpbmRleFxuICB2YXIga2V5cyA9IHRoaXMuX2sgPSBbXSAgICAgICAvLyBrZXlzXG4gICAgLCBrZXk7XG4gIGZvcihrZXkgaW4gaXRlcmF0ZWQpa2V5cy5wdXNoKGtleSk7XG59O1xucmVxdWlyZSgnLi9faXRlci1jcmVhdGUnKShFbnVtZXJhdGUsICdPYmplY3QnLCBmdW5jdGlvbigpe1xuICB2YXIgdGhhdCA9IHRoaXNcbiAgICAsIGtleXMgPSB0aGF0Ll9rXG4gICAgLCBrZXk7XG4gIGRvIHtcbiAgICBpZih0aGF0Ll9pID49IGtleXMubGVuZ3RoKXJldHVybiB7dmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZX07XG4gIH0gd2hpbGUoISgoa2V5ID0ga2V5c1t0aGF0Ll9pKytdKSBpbiB0aGF0Ll90KSk7XG4gIHJldHVybiB7dmFsdWU6IGtleSwgZG9uZTogZmFsc2V9O1xufSk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnUmVmbGVjdCcsIHtcbiAgZW51bWVyYXRlOiBmdW5jdGlvbiBlbnVtZXJhdGUodGFyZ2V0KXtcbiAgICByZXR1cm4gbmV3IEVudW1lcmF0ZSh0YXJnZXQpO1xuICB9XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5lbnVtZXJhdGUuanNcbiAqKiBtb2R1bGUgaWQgPSAyMzNcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDI2LjEuNiBSZWZsZWN0LmdldCh0YXJnZXQsIHByb3BlcnR5S2V5IFssIHJlY2VpdmVyXSlcbnZhciBnT1BEICAgICAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJylcbiAgLCBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4vX29iamVjdC1ncG8nKVxuICAsIGhhcyAgICAgICAgICAgID0gcmVxdWlyZSgnLi9faGFzJylcbiAgLCAkZXhwb3J0ICAgICAgICA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICwgaXNPYmplY3QgICAgICAgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKVxuICAsIGFuT2JqZWN0ICAgICAgID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG5cbmZ1bmN0aW9uIGdldCh0YXJnZXQsIHByb3BlcnR5S2V5LyosIHJlY2VpdmVyKi8pe1xuICB2YXIgcmVjZWl2ZXIgPSBhcmd1bWVudHMubGVuZ3RoIDwgMyA/IHRhcmdldCA6IGFyZ3VtZW50c1syXVxuICAgICwgZGVzYywgcHJvdG87XG4gIGlmKGFuT2JqZWN0KHRhcmdldCkgPT09IHJlY2VpdmVyKXJldHVybiB0YXJnZXRbcHJvcGVydHlLZXldO1xuICBpZihkZXNjID0gZ09QRC5mKHRhcmdldCwgcHJvcGVydHlLZXkpKXJldHVybiBoYXMoZGVzYywgJ3ZhbHVlJylcbiAgICA/IGRlc2MudmFsdWVcbiAgICA6IGRlc2MuZ2V0ICE9PSB1bmRlZmluZWRcbiAgICAgID8gZGVzYy5nZXQuY2FsbChyZWNlaXZlcilcbiAgICAgIDogdW5kZWZpbmVkO1xuICBpZihpc09iamVjdChwcm90byA9IGdldFByb3RvdHlwZU9mKHRhcmdldCkpKXJldHVybiBnZXQocHJvdG8sIHByb3BlcnR5S2V5LCByZWNlaXZlcik7XG59XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnUmVmbGVjdCcsIHtnZXQ6IGdldH0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0LmdldC5qc1xuICoqIG1vZHVsZSBpZCA9IDIzNFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gMjYuMS43IFJlZmxlY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgcHJvcGVydHlLZXkpXG52YXIgZ09QRCAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wZCcpXG4gICwgJGV4cG9ydCAgPSByZXF1aXJlKCcuL19leHBvcnQnKVxuICAsIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnUmVmbGVjdCcsIHtcbiAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBwcm9wZXJ0eUtleSl7XG4gICAgcmV0dXJuIGdPUEQuZihhbk9iamVjdCh0YXJnZXQpLCBwcm9wZXJ0eUtleSk7XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0LmdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvci5qc1xuICoqIG1vZHVsZSBpZCA9IDIzNVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gMjYuMS44IFJlZmxlY3QuZ2V0UHJvdG90eXBlT2YodGFyZ2V0KVxudmFyICRleHBvcnQgID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCBnZXRQcm90byA9IHJlcXVpcmUoJy4vX29iamVjdC1ncG8nKVxuICAsIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnUmVmbGVjdCcsIHtcbiAgZ2V0UHJvdG90eXBlT2Y6IGZ1bmN0aW9uIGdldFByb3RvdHlwZU9mKHRhcmdldCl7XG4gICAgcmV0dXJuIGdldFByb3RvKGFuT2JqZWN0KHRhcmdldCkpO1xuICB9XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5nZXQtcHJvdG90eXBlLW9mLmpzXG4gKiogbW9kdWxlIGlkID0gMjM2XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyAyNi4xLjkgUmVmbGVjdC5oYXModGFyZ2V0LCBwcm9wZXJ0eUtleSlcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnUmVmbGVjdCcsIHtcbiAgaGFzOiBmdW5jdGlvbiBoYXModGFyZ2V0LCBwcm9wZXJ0eUtleSl7XG4gICAgcmV0dXJuIHByb3BlcnR5S2V5IGluIHRhcmdldDtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3QuaGFzLmpzXG4gKiogbW9kdWxlIGlkID0gMjM3XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyAyNi4xLjEwIFJlZmxlY3QuaXNFeHRlbnNpYmxlKHRhcmdldClcbnZhciAkZXhwb3J0ICAgICAgID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCBhbk9iamVjdCAgICAgID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0JylcbiAgLCAkaXNFeHRlbnNpYmxlID0gT2JqZWN0LmlzRXh0ZW5zaWJsZTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdSZWZsZWN0Jywge1xuICBpc0V4dGVuc2libGU6IGZ1bmN0aW9uIGlzRXh0ZW5zaWJsZSh0YXJnZXQpe1xuICAgIGFuT2JqZWN0KHRhcmdldCk7XG4gICAgcmV0dXJuICRpc0V4dGVuc2libGUgPyAkaXNFeHRlbnNpYmxlKHRhcmdldCkgOiB0cnVlO1xuICB9XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5pcy1leHRlbnNpYmxlLmpzXG4gKiogbW9kdWxlIGlkID0gMjM4XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyAyNi4xLjExIFJlZmxlY3Qub3duS2V5cyh0YXJnZXQpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1JlZmxlY3QnLCB7b3duS2V5czogcmVxdWlyZSgnLi9fb3duLWtleXMnKX0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0Lm93bi1rZXlzLmpzXG4gKiogbW9kdWxlIGlkID0gMjM5XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyBhbGwgb2JqZWN0IGtleXMsIGluY2x1ZGVzIG5vbi1lbnVtZXJhYmxlIGFuZCBzeW1ib2xzXG52YXIgZ09QTiAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wbicpXG4gICwgZ09QUyAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wcycpXG4gICwgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKVxuICAsIFJlZmxlY3QgID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykuUmVmbGVjdDtcbm1vZHVsZS5leHBvcnRzID0gUmVmbGVjdCAmJiBSZWZsZWN0Lm93bktleXMgfHwgZnVuY3Rpb24gb3duS2V5cyhpdCl7XG4gIHZhciBrZXlzICAgICAgID0gZ09QTi5mKGFuT2JqZWN0KGl0KSlcbiAgICAsIGdldFN5bWJvbHMgPSBnT1BTLmY7XG4gIHJldHVybiBnZXRTeW1ib2xzID8ga2V5cy5jb25jYXQoZ2V0U3ltYm9scyhpdCkpIDoga2V5cztcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX293bi1rZXlzLmpzXG4gKiogbW9kdWxlIGlkID0gMjQwXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyAyNi4xLjEyIFJlZmxlY3QucHJldmVudEV4dGVuc2lvbnModGFyZ2V0KVxudmFyICRleHBvcnQgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICwgYW5PYmplY3QgICAgICAgICAgID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0JylcbiAgLCAkcHJldmVudEV4dGVuc2lvbnMgPSBPYmplY3QucHJldmVudEV4dGVuc2lvbnM7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnUmVmbGVjdCcsIHtcbiAgcHJldmVudEV4dGVuc2lvbnM6IGZ1bmN0aW9uIHByZXZlbnRFeHRlbnNpb25zKHRhcmdldCl7XG4gICAgYW5PYmplY3QodGFyZ2V0KTtcbiAgICB0cnkge1xuICAgICAgaWYoJHByZXZlbnRFeHRlbnNpb25zKSRwcmV2ZW50RXh0ZW5zaW9ucyh0YXJnZXQpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaChlKXtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0LnByZXZlbnQtZXh0ZW5zaW9ucy5qc1xuICoqIG1vZHVsZSBpZCA9IDI0MVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gMjYuMS4xMyBSZWZsZWN0LnNldCh0YXJnZXQsIHByb3BlcnR5S2V5LCBWIFssIHJlY2VpdmVyXSlcbnZhciBkUCAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpXG4gICwgZ09QRCAgICAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wZCcpXG4gICwgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuL19vYmplY3QtZ3BvJylcbiAgLCBoYXMgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2hhcycpXG4gICwgJGV4cG9ydCAgICAgICAgPSByZXF1aXJlKCcuL19leHBvcnQnKVxuICAsIGNyZWF0ZURlc2MgICAgID0gcmVxdWlyZSgnLi9fcHJvcGVydHktZGVzYycpXG4gICwgYW5PYmplY3QgICAgICAgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKVxuICAsIGlzT2JqZWN0ICAgICAgID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG5cbmZ1bmN0aW9uIHNldCh0YXJnZXQsIHByb3BlcnR5S2V5LCBWLyosIHJlY2VpdmVyKi8pe1xuICB2YXIgcmVjZWl2ZXIgPSBhcmd1bWVudHMubGVuZ3RoIDwgNCA/IHRhcmdldCA6IGFyZ3VtZW50c1szXVxuICAgICwgb3duRGVzYyAgPSBnT1BELmYoYW5PYmplY3QodGFyZ2V0KSwgcHJvcGVydHlLZXkpXG4gICAgLCBleGlzdGluZ0Rlc2NyaXB0b3IsIHByb3RvO1xuICBpZighb3duRGVzYyl7XG4gICAgaWYoaXNPYmplY3QocHJvdG8gPSBnZXRQcm90b3R5cGVPZih0YXJnZXQpKSl7XG4gICAgICByZXR1cm4gc2V0KHByb3RvLCBwcm9wZXJ0eUtleSwgViwgcmVjZWl2ZXIpO1xuICAgIH1cbiAgICBvd25EZXNjID0gY3JlYXRlRGVzYygwKTtcbiAgfVxuICBpZihoYXMob3duRGVzYywgJ3ZhbHVlJykpe1xuICAgIGlmKG93bkRlc2Mud3JpdGFibGUgPT09IGZhbHNlIHx8ICFpc09iamVjdChyZWNlaXZlcikpcmV0dXJuIGZhbHNlO1xuICAgIGV4aXN0aW5nRGVzY3JpcHRvciA9IGdPUEQuZihyZWNlaXZlciwgcHJvcGVydHlLZXkpIHx8IGNyZWF0ZURlc2MoMCk7XG4gICAgZXhpc3RpbmdEZXNjcmlwdG9yLnZhbHVlID0gVjtcbiAgICBkUC5mKHJlY2VpdmVyLCBwcm9wZXJ0eUtleSwgZXhpc3RpbmdEZXNjcmlwdG9yKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gb3duRGVzYy5zZXQgPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogKG93bkRlc2Muc2V0LmNhbGwocmVjZWl2ZXIsIFYpLCB0cnVlKTtcbn1cblxuJGV4cG9ydCgkZXhwb3J0LlMsICdSZWZsZWN0Jywge3NldDogc2V0fSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3Quc2V0LmpzXG4gKiogbW9kdWxlIGlkID0gMjQyXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyAyNi4xLjE0IFJlZmxlY3Quc2V0UHJvdG90eXBlT2YodGFyZ2V0LCBwcm90bylcbnZhciAkZXhwb3J0ICA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICwgc2V0UHJvdG8gPSByZXF1aXJlKCcuL19zZXQtcHJvdG8nKTtcblxuaWYoc2V0UHJvdG8pJGV4cG9ydCgkZXhwb3J0LlMsICdSZWZsZWN0Jywge1xuICBzZXRQcm90b3R5cGVPZjogZnVuY3Rpb24gc2V0UHJvdG90eXBlT2YodGFyZ2V0LCBwcm90byl7XG4gICAgc2V0UHJvdG8uY2hlY2sodGFyZ2V0LCBwcm90byk7XG4gICAgdHJ5IHtcbiAgICAgIHNldFByb3RvLnNldCh0YXJnZXQsIHByb3RvKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2goZSl7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5zZXQtcHJvdG90eXBlLW9mLmpzXG4gKiogbW9kdWxlIGlkID0gMjQzXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9BcnJheS5wcm90b3R5cGUuaW5jbHVkZXNcbnZhciAkZXhwb3J0ICAgPSByZXF1aXJlKCcuL19leHBvcnQnKVxuICAsICRpbmNsdWRlcyA9IHJlcXVpcmUoJy4vX2FycmF5LWluY2x1ZGVzJykodHJ1ZSk7XG5cbiRleHBvcnQoJGV4cG9ydC5QLCAnQXJyYXknLCB7XG4gIGluY2x1ZGVzOiBmdW5jdGlvbiBpbmNsdWRlcyhlbCAvKiwgZnJvbUluZGV4ID0gMCAqLyl7XG4gICAgcmV0dXJuICRpbmNsdWRlcyh0aGlzLCBlbCwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICB9XG59KTtcblxucmVxdWlyZSgnLi9fYWRkLXRvLXVuc2NvcGFibGVzJykoJ2luY2x1ZGVzJyk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM3LmFycmF5LmluY2x1ZGVzLmpzXG4gKiogbW9kdWxlIGlkID0gMjQ0XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG4vLyBodHRwczovL2dpdGh1Yi5jb20vbWF0aGlhc2J5bmVucy9TdHJpbmcucHJvdG90eXBlLmF0XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICwgJGF0ICAgICA9IHJlcXVpcmUoJy4vX3N0cmluZy1hdCcpKHRydWUpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCwgJ1N0cmluZycsIHtcbiAgYXQ6IGZ1bmN0aW9uIGF0KHBvcyl7XG4gICAgcmV0dXJuICRhdCh0aGlzLCBwb3MpO1xuICB9XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczcuc3RyaW5nLmF0LmpzXG4gKiogbW9kdWxlIGlkID0gMjQ1XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1zdHJpbmctcGFkLXN0YXJ0LWVuZFxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKVxuICAsICRwYWQgICAgPSByZXF1aXJlKCcuL19zdHJpbmctcGFkJyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QLCAnU3RyaW5nJywge1xuICBwYWRTdGFydDogZnVuY3Rpb24gcGFkU3RhcnQobWF4TGVuZ3RoIC8qLCBmaWxsU3RyaW5nID0gJyAnICovKXtcbiAgICByZXR1cm4gJHBhZCh0aGlzLCBtYXhMZW5ndGgsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkLCB0cnVlKTtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM3LnN0cmluZy5wYWQtc3RhcnQuanNcbiAqKiBtb2R1bGUgaWQgPSAyNDZcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXN0cmluZy1wYWQtc3RhcnQtZW5kXG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKVxuICAsIHJlcGVhdCAgID0gcmVxdWlyZSgnLi9fc3RyaW5nLXJlcGVhdCcpXG4gICwgZGVmaW5lZCAgPSByZXF1aXJlKCcuL19kZWZpbmVkJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24odGhhdCwgbWF4TGVuZ3RoLCBmaWxsU3RyaW5nLCBsZWZ0KXtcbiAgdmFyIFMgICAgICAgICAgICA9IFN0cmluZyhkZWZpbmVkKHRoYXQpKVxuICAgICwgc3RyaW5nTGVuZ3RoID0gUy5sZW5ndGhcbiAgICAsIGZpbGxTdHIgICAgICA9IGZpbGxTdHJpbmcgPT09IHVuZGVmaW5lZCA/ICcgJyA6IFN0cmluZyhmaWxsU3RyaW5nKVxuICAgICwgaW50TWF4TGVuZ3RoID0gdG9MZW5ndGgobWF4TGVuZ3RoKTtcbiAgaWYoaW50TWF4TGVuZ3RoIDw9IHN0cmluZ0xlbmd0aClyZXR1cm4gUztcbiAgaWYoZmlsbFN0ciA9PSAnJylmaWxsU3RyID0gJyAnO1xuICB2YXIgZmlsbExlbiA9IGludE1heExlbmd0aCAtIHN0cmluZ0xlbmd0aFxuICAgICwgc3RyaW5nRmlsbGVyID0gcmVwZWF0LmNhbGwoZmlsbFN0ciwgTWF0aC5jZWlsKGZpbGxMZW4gLyBmaWxsU3RyLmxlbmd0aCkpO1xuICBpZihzdHJpbmdGaWxsZXIubGVuZ3RoID4gZmlsbExlbilzdHJpbmdGaWxsZXIgPSBzdHJpbmdGaWxsZXIuc2xpY2UoMCwgZmlsbExlbik7XG4gIHJldHVybiBsZWZ0ID8gc3RyaW5nRmlsbGVyICsgUyA6IFMgKyBzdHJpbmdGaWxsZXI7XG59O1xuXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX3N0cmluZy1wYWQuanNcbiAqKiBtb2R1bGUgaWQgPSAyNDdcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0Jztcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXN0cmluZy1wYWQtc3RhcnQtZW5kXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICwgJHBhZCAgICA9IHJlcXVpcmUoJy4vX3N0cmluZy1wYWQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlAsICdTdHJpbmcnLCB7XG4gIHBhZEVuZDogZnVuY3Rpb24gcGFkRW5kKG1heExlbmd0aCAvKiwgZmlsbFN0cmluZyA9ICcgJyAqLyl7XG4gICAgcmV0dXJuICRwYWQodGhpcywgbWF4TGVuZ3RoLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCwgZmFsc2UpO1xuICB9XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczcuc3RyaW5nLnBhZC1lbmQuanNcbiAqKiBtb2R1bGUgaWQgPSAyNDhcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0Jztcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9zZWJtYXJrYmFnZS9lY21hc2NyaXB0LXN0cmluZy1sZWZ0LXJpZ2h0LXRyaW1cbnJlcXVpcmUoJy4vX3N0cmluZy10cmltJykoJ3RyaW1MZWZ0JywgZnVuY3Rpb24oJHRyaW0pe1xuICByZXR1cm4gZnVuY3Rpb24gdHJpbUxlZnQoKXtcbiAgICByZXR1cm4gJHRyaW0odGhpcywgMSk7XG4gIH07XG59LCAndHJpbVN0YXJ0Jyk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM3LnN0cmluZy50cmltLWxlZnQuanNcbiAqKiBtb2R1bGUgaWQgPSAyNDlcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0Jztcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9zZWJtYXJrYmFnZS9lY21hc2NyaXB0LXN0cmluZy1sZWZ0LXJpZ2h0LXRyaW1cbnJlcXVpcmUoJy4vX3N0cmluZy10cmltJykoJ3RyaW1SaWdodCcsIGZ1bmN0aW9uKCR0cmltKXtcbiAgcmV0dXJuIGZ1bmN0aW9uIHRyaW1SaWdodCgpe1xuICAgIHJldHVybiAkdHJpbSh0aGlzLCAyKTtcbiAgfTtcbn0sICd0cmltRW5kJyk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM3LnN0cmluZy50cmltLXJpZ2h0LmpzXG4gKiogbW9kdWxlIGlkID0gMjUwXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XHJcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vU3RyaW5nLnByb3RvdHlwZS5tYXRjaEFsbC9cclxudmFyICRleHBvcnQgICAgID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcclxuICAsIGRlZmluZWQgICAgID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpXHJcbiAgLCB0b0xlbmd0aCAgICA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpXHJcbiAgLCBpc1JlZ0V4cCAgICA9IHJlcXVpcmUoJy4vX2lzLXJlZ2V4cCcpXHJcbiAgLCBnZXRGbGFncyAgICA9IHJlcXVpcmUoJy4vX2ZsYWdzJylcclxuICAsIFJlZ0V4cFByb3RvID0gUmVnRXhwLnByb3RvdHlwZTtcclxuXHJcbnZhciAkUmVnRXhwU3RyaW5nSXRlcmF0b3IgPSBmdW5jdGlvbihyZWdleHAsIHN0cmluZyl7XHJcbiAgdGhpcy5fciA9IHJlZ2V4cDtcclxuICB0aGlzLl9zID0gc3RyaW5nO1xyXG59O1xyXG5cclxucmVxdWlyZSgnLi9faXRlci1jcmVhdGUnKSgkUmVnRXhwU3RyaW5nSXRlcmF0b3IsICdSZWdFeHAgU3RyaW5nJywgZnVuY3Rpb24gbmV4dCgpe1xyXG4gIHZhciBtYXRjaCA9IHRoaXMuX3IuZXhlYyh0aGlzLl9zKTtcclxuICByZXR1cm4ge3ZhbHVlOiBtYXRjaCwgZG9uZTogbWF0Y2ggPT09IG51bGx9O1xyXG59KTtcclxuXHJcbiRleHBvcnQoJGV4cG9ydC5QLCAnU3RyaW5nJywge1xyXG4gIG1hdGNoQWxsOiBmdW5jdGlvbiBtYXRjaEFsbChyZWdleHApe1xyXG4gICAgZGVmaW5lZCh0aGlzKTtcclxuICAgIGlmKCFpc1JlZ0V4cChyZWdleHApKXRocm93IFR5cGVFcnJvcihyZWdleHAgKyAnIGlzIG5vdCBhIHJlZ2V4cCEnKTtcclxuICAgIHZhciBTICAgICA9IFN0cmluZyh0aGlzKVxyXG4gICAgICAsIGZsYWdzID0gJ2ZsYWdzJyBpbiBSZWdFeHBQcm90byA/IFN0cmluZyhyZWdleHAuZmxhZ3MpIDogZ2V0RmxhZ3MuY2FsbChyZWdleHApXHJcbiAgICAgICwgcnggICAgPSBuZXcgUmVnRXhwKHJlZ2V4cC5zb3VyY2UsIH5mbGFncy5pbmRleE9mKCdnJykgPyBmbGFncyA6ICdnJyArIGZsYWdzKTtcclxuICAgIHJ4Lmxhc3RJbmRleCA9IHRvTGVuZ3RoKHJlZ2V4cC5sYXN0SW5kZXgpO1xyXG4gICAgcmV0dXJuIG5ldyAkUmVnRXhwU3RyaW5nSXRlcmF0b3IocngsIFMpO1xyXG4gIH1cclxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM3LnN0cmluZy5tYXRjaC1hbGwuanNcbiAqKiBtb2R1bGUgaWQgPSAyNTFcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLW9iamVjdC1nZXRvd25wcm9wZXJ0eWRlc2NyaXB0b3JzXG52YXIgJGV4cG9ydCAgICA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICwgb3duS2V5cyAgICA9IHJlcXVpcmUoJy4vX293bi1rZXlzJylcbiAgLCB0b0lPYmplY3QgID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpXG4gICwgY3JlYXRlRGVzYyA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKVxuICAsIGdPUEQgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wZCcpXG4gICwgZFAgICAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ09iamVjdCcsIHtcbiAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yczogZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3Qpe1xuICAgIHZhciBPICAgICAgID0gdG9JT2JqZWN0KG9iamVjdClcbiAgICAgICwgZ2V0RGVzYyA9IGdPUEQuZlxuICAgICAgLCBrZXlzICAgID0gb3duS2V5cyhPKVxuICAgICAgLCByZXN1bHQgID0ge31cbiAgICAgICwgaSAgICAgICA9IDBcbiAgICAgICwga2V5LCBEO1xuICAgIHdoaWxlKGtleXMubGVuZ3RoID4gaSl7XG4gICAgICBEID0gZ2V0RGVzYyhPLCBrZXkgPSBrZXlzW2krK10pO1xuICAgICAgaWYoa2V5IGluIHJlc3VsdClkUC5mKHJlc3VsdCwga2V5LCBjcmVhdGVEZXNjKDAsIEQpKTtcbiAgICAgIGVsc2UgcmVzdWx0W2tleV0gPSBEO1xuICAgIH0gcmV0dXJuIHJlc3VsdDtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM3Lm9iamVjdC5nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3JzLmpzXG4gKiogbW9kdWxlIGlkID0gMjUyXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1vYmplY3QtdmFsdWVzLWVudHJpZXNcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCAkdmFsdWVzID0gcmVxdWlyZSgnLi9fb2JqZWN0LXRvLWFycmF5JykoZmFsc2UpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ09iamVjdCcsIHtcbiAgdmFsdWVzOiBmdW5jdGlvbiB2YWx1ZXMoaXQpe1xuICAgIHJldHVybiAkdmFsdWVzKGl0KTtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM3Lm9iamVjdC52YWx1ZXMuanNcbiAqKiBtb2R1bGUgaWQgPSAyNTNcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBnZXRLZXlzICAgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpXG4gICwgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpXG4gICwgaXNFbnVtICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LXBpZScpLmY7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGlzRW50cmllcyl7XG4gIHJldHVybiBmdW5jdGlvbihpdCl7XG4gICAgdmFyIE8gICAgICA9IHRvSU9iamVjdChpdClcbiAgICAgICwga2V5cyAgID0gZ2V0S2V5cyhPKVxuICAgICAgLCBsZW5ndGggPSBrZXlzLmxlbmd0aFxuICAgICAgLCBpICAgICAgPSAwXG4gICAgICAsIHJlc3VsdCA9IFtdXG4gICAgICAsIGtleTtcbiAgICB3aGlsZShsZW5ndGggPiBpKWlmKGlzRW51bS5jYWxsKE8sIGtleSA9IGtleXNbaSsrXSkpe1xuICAgICAgcmVzdWx0LnB1c2goaXNFbnRyaWVzID8gW2tleSwgT1trZXldXSA6IE9ba2V5XSk7XG4gICAgfSByZXR1cm4gcmVzdWx0O1xuICB9O1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LXRvLWFycmF5LmpzXG4gKiogbW9kdWxlIGlkID0gMjU0XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1vYmplY3QtdmFsdWVzLWVudHJpZXNcbnZhciAkZXhwb3J0ICA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICwgJGVudHJpZXMgPSByZXF1aXJlKCcuL19vYmplY3QtdG8tYXJyYXknKSh0cnVlKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdPYmplY3QnLCB7XG4gIGVudHJpZXM6IGZ1bmN0aW9uIGVudHJpZXMoaXQpe1xuICAgIHJldHVybiAkZW50cmllcyhpdCk7XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNy5vYmplY3QuZW50cmllcy5qc1xuICoqIG1vZHVsZSBpZCA9IDI1NVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xyXG52YXIgJGV4cG9ydCAgICAgICAgID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcclxuICAsIHRvT2JqZWN0ICAgICAgICA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpXHJcbiAgLCBhRnVuY3Rpb24gICAgICAgPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJylcclxuICAsICRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpO1xyXG5cclxuLy8gQi4yLjIuMiBPYmplY3QucHJvdG90eXBlLl9fZGVmaW5lR2V0dGVyX18oUCwgZ2V0dGVyKVxyXG5yZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpICYmICRleHBvcnQoJGV4cG9ydC5QICsgcmVxdWlyZSgnLi9fb2JqZWN0LWZvcmNlZC1wYW0nKSwgJ09iamVjdCcsIHtcclxuICBfX2RlZmluZUdldHRlcl9fOiBmdW5jdGlvbiBfX2RlZmluZUdldHRlcl9fKFAsIGdldHRlcil7XHJcbiAgICAkZGVmaW5lUHJvcGVydHkuZih0b09iamVjdCh0aGlzKSwgUCwge2dldDogYUZ1bmN0aW9uKGdldHRlciksIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZX0pO1xyXG4gIH1cclxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM3Lm9iamVjdC5kZWZpbmUtZ2V0dGVyLmpzXG4gKiogbW9kdWxlIGlkID0gMjU2XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyBGb3JjZWQgcmVwbGFjZW1lbnQgcHJvdG90eXBlIGFjY2Vzc29ycyBtZXRob2RzXHJcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fbGlicmFyeScpfHwgIXJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24oKXtcclxuICB2YXIgSyA9IE1hdGgucmFuZG9tKCk7XHJcbiAgLy8gSW4gRkYgdGhyb3dzIG9ubHkgZGVmaW5lIG1ldGhvZHNcclxuICBfX2RlZmluZVNldHRlcl9fLmNhbGwobnVsbCwgSywgZnVuY3Rpb24oKXsgLyogZW1wdHkgKi99KTtcclxuICBkZWxldGUgcmVxdWlyZSgnLi9fZ2xvYmFsJylbS107XHJcbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZm9yY2VkLXBhbS5qc1xuICoqIG1vZHVsZSBpZCA9IDI1N1xuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xyXG52YXIgJGV4cG9ydCAgICAgICAgID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcclxuICAsIHRvT2JqZWN0ICAgICAgICA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpXHJcbiAgLCBhRnVuY3Rpb24gICAgICAgPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJylcclxuICAsICRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpO1xyXG5cclxuLy8gQi4yLjIuMyBPYmplY3QucHJvdG90eXBlLl9fZGVmaW5lU2V0dGVyX18oUCwgc2V0dGVyKVxyXG5yZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpICYmICRleHBvcnQoJGV4cG9ydC5QICsgcmVxdWlyZSgnLi9fb2JqZWN0LWZvcmNlZC1wYW0nKSwgJ09iamVjdCcsIHtcclxuICBfX2RlZmluZVNldHRlcl9fOiBmdW5jdGlvbiBfX2RlZmluZVNldHRlcl9fKFAsIHNldHRlcil7XHJcbiAgICAkZGVmaW5lUHJvcGVydHkuZih0b09iamVjdCh0aGlzKSwgUCwge3NldDogYUZ1bmN0aW9uKHNldHRlciksIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZX0pO1xyXG4gIH1cclxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM3Lm9iamVjdC5kZWZpbmUtc2V0dGVyLmpzXG4gKiogbW9kdWxlIGlkID0gMjU4XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XHJcbnZhciAkZXhwb3J0ICAgICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19leHBvcnQnKVxyXG4gICwgdG9PYmplY3QgICAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0JylcclxuICAsIHRvUHJpbWl0aXZlICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX3RvLXByaW1pdGl2ZScpXHJcbiAgLCBnZXRQcm90b3R5cGVPZiAgICAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZ3BvJylcclxuICAsIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJykuZjtcclxuXHJcbi8vIEIuMi4yLjQgT2JqZWN0LnByb3RvdHlwZS5fX2xvb2t1cEdldHRlcl9fKFApXHJcbnJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgJiYgJGV4cG9ydCgkZXhwb3J0LlAgKyByZXF1aXJlKCcuL19vYmplY3QtZm9yY2VkLXBhbScpLCAnT2JqZWN0Jywge1xyXG4gIF9fbG9va3VwR2V0dGVyX186IGZ1bmN0aW9uIF9fbG9va3VwR2V0dGVyX18oUCl7XHJcbiAgICB2YXIgTyA9IHRvT2JqZWN0KHRoaXMpXHJcbiAgICAgICwgSyA9IHRvUHJpbWl0aXZlKFAsIHRydWUpXHJcbiAgICAgICwgRDtcclxuICAgIGRvIHtcclxuICAgICAgaWYoRCA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBLKSlyZXR1cm4gRC5nZXQ7XHJcbiAgICB9IHdoaWxlKE8gPSBnZXRQcm90b3R5cGVPZihPKSk7XHJcbiAgfVxyXG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczcub2JqZWN0Lmxvb2t1cC1nZXR0ZXIuanNcbiAqKiBtb2R1bGUgaWQgPSAyNTlcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0JztcclxudmFyICRleHBvcnQgICAgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXHJcbiAgLCB0b09iamVjdCAgICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL190by1vYmplY3QnKVxyXG4gICwgdG9QcmltaXRpdmUgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fdG8tcHJpbWl0aXZlJylcclxuICAsIGdldFByb3RvdHlwZU9mICAgICAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1ncG8nKVxyXG4gICwgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcGQnKS5mO1xyXG5cclxuLy8gQi4yLjIuNSBPYmplY3QucHJvdG90eXBlLl9fbG9va3VwU2V0dGVyX18oUClcclxucmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSAmJiAkZXhwb3J0KCRleHBvcnQuUCArIHJlcXVpcmUoJy4vX29iamVjdC1mb3JjZWQtcGFtJyksICdPYmplY3QnLCB7XHJcbiAgX19sb29rdXBTZXR0ZXJfXzogZnVuY3Rpb24gX19sb29rdXBTZXR0ZXJfXyhQKXtcclxuICAgIHZhciBPID0gdG9PYmplY3QodGhpcylcclxuICAgICAgLCBLID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSlcclxuICAgICAgLCBEO1xyXG4gICAgZG8ge1xyXG4gICAgICBpZihEID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIEspKXJldHVybiBELnNldDtcclxuICAgIH0gd2hpbGUoTyA9IGdldFByb3RvdHlwZU9mKE8pKTtcclxuICB9XHJcbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNy5vYmplY3QubG9va3VwLXNldHRlci5qc1xuICoqIG1vZHVsZSBpZCA9IDI2MFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL0RhdmlkQnJ1YW50L01hcC1TZXQucHJvdG90eXBlLnRvSlNPTlxudmFyICRleHBvcnQgID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5SLCAnTWFwJywge3RvSlNPTjogcmVxdWlyZSgnLi9fY29sbGVjdGlvbi10by1qc29uJykoJ01hcCcpfSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM3Lm1hcC50by1qc29uLmpzXG4gKiogbW9kdWxlIGlkID0gMjYxXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyBodHRwczovL2dpdGh1Yi5jb20vRGF2aWRCcnVhbnQvTWFwLVNldC5wcm90b3R5cGUudG9KU09OXG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4vX2NsYXNzb2YnKVxuICAsIGZyb20gICAgPSByZXF1aXJlKCcuL19hcnJheS1mcm9tLWl0ZXJhYmxlJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKE5BTUUpe1xuICByZXR1cm4gZnVuY3Rpb24gdG9KU09OKCl7XG4gICAgaWYoY2xhc3NvZih0aGlzKSAhPSBOQU1FKXRocm93IFR5cGVFcnJvcihOQU1FICsgXCIjdG9KU09OIGlzbid0IGdlbmVyaWNcIik7XG4gICAgcmV0dXJuIGZyb20odGhpcyk7XG4gIH07XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19jb2xsZWN0aW9uLXRvLWpzb24uanNcbiAqKiBtb2R1bGUgaWQgPSAyNjJcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBmb3JPZiA9IHJlcXVpcmUoJy4vX2Zvci1vZicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0ZXIsIElURVJBVE9SKXtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICBmb3JPZihpdGVyLCBmYWxzZSwgcmVzdWx0LnB1c2gsIHJlc3VsdCwgSVRFUkFUT1IpO1xuICByZXR1cm4gcmVzdWx0O1xufTtcblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19hcnJheS1mcm9tLWl0ZXJhYmxlLmpzXG4gKiogbW9kdWxlIGlkID0gMjYzXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyBodHRwczovL2dpdGh1Yi5jb20vRGF2aWRCcnVhbnQvTWFwLVNldC5wcm90b3R5cGUudG9KU09OXG52YXIgJGV4cG9ydCAgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LlIsICdTZXQnLCB7dG9KU09OOiByZXF1aXJlKCcuL19jb2xsZWN0aW9uLXRvLWpzb24nKSgnU2V0Jyl9KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczcuc2V0LnRvLWpzb24uanNcbiAqKiBtb2R1bGUgaWQgPSAyNjRcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9samhhcmIvcHJvcG9zYWwtZ2xvYmFsXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1N5c3RlbScsIHtnbG9iYWw6IHJlcXVpcmUoJy4vX2dsb2JhbCcpfSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM3LnN5c3RlbS5nbG9iYWwuanNcbiAqKiBtb2R1bGUgaWQgPSAyNjVcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9samhhcmIvcHJvcG9zYWwtaXMtZXJyb3JcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCBjb2YgICAgID0gcmVxdWlyZSgnLi9fY29mJyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnRXJyb3InLCB7XG4gIGlzRXJyb3I6IGZ1bmN0aW9uIGlzRXJyb3IoaXQpe1xuICAgIHJldHVybiBjb2YoaXQpID09PSAnRXJyb3InO1xuICB9XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczcuZXJyb3IuaXMtZXJyb3IuanNcbiAqKiBtb2R1bGUgaWQgPSAyNjZcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL0JyZW5kYW5FaWNoLzQyOTRkNWMyMTJhNmQyMjU0NzAzXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7XG4gIGlhZGRoOiBmdW5jdGlvbiBpYWRkaCh4MCwgeDEsIHkwLCB5MSl7XG4gICAgdmFyICR4MCA9IHgwID4+PiAwXG4gICAgICAsICR4MSA9IHgxID4+PiAwXG4gICAgICAsICR5MCA9IHkwID4+PiAwO1xuICAgIHJldHVybiAkeDEgKyAoeTEgPj4+IDApICsgKCgkeDAgJiAkeTAgfCAoJHgwIHwgJHkwKSAmIH4oJHgwICsgJHkwID4+PiAwKSkgPj4+IDMxKSB8IDA7XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNy5tYXRoLmlhZGRoLmpzXG4gKiogbW9kdWxlIGlkID0gMjY3XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9CcmVuZGFuRWljaC80Mjk0ZDVjMjEyYTZkMjI1NDcwM1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywge1xuICBpc3ViaDogZnVuY3Rpb24gaXN1YmgoeDAsIHgxLCB5MCwgeTEpe1xuICAgIHZhciAkeDAgPSB4MCA+Pj4gMFxuICAgICAgLCAkeDEgPSB4MSA+Pj4gMFxuICAgICAgLCAkeTAgPSB5MCA+Pj4gMDtcbiAgICByZXR1cm4gJHgxIC0gKHkxID4+PiAwKSAtICgofiR4MCAmICR5MCB8IH4oJHgwIF4gJHkwKSAmICR4MCAtICR5MCA+Pj4gMCkgPj4+IDMxKSB8IDA7XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNy5tYXRoLmlzdWJoLmpzXG4gKiogbW9kdWxlIGlkID0gMjY4XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9CcmVuZGFuRWljaC80Mjk0ZDVjMjEyYTZkMjI1NDcwM1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywge1xuICBpbXVsaDogZnVuY3Rpb24gaW11bGgodSwgdil7XG4gICAgdmFyIFVJTlQxNiA9IDB4ZmZmZlxuICAgICAgLCAkdSA9ICt1XG4gICAgICAsICR2ID0gK3ZcbiAgICAgICwgdTAgPSAkdSAmIFVJTlQxNlxuICAgICAgLCB2MCA9ICR2ICYgVUlOVDE2XG4gICAgICAsIHUxID0gJHUgPj4gMTZcbiAgICAgICwgdjEgPSAkdiA+PiAxNlxuICAgICAgLCB0ICA9ICh1MSAqIHYwID4+PiAwKSArICh1MCAqIHYwID4+PiAxNik7XG4gICAgcmV0dXJuIHUxICogdjEgKyAodCA+PiAxNikgKyAoKHUwICogdjEgPj4+IDApICsgKHQgJiBVSU5UMTYpID4+IDE2KTtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM3Lm1hdGguaW11bGguanNcbiAqKiBtb2R1bGUgaWQgPSAyNjlcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL0JyZW5kYW5FaWNoLzQyOTRkNWMyMTJhNmQyMjU0NzAzXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7XG4gIHVtdWxoOiBmdW5jdGlvbiB1bXVsaCh1LCB2KXtcbiAgICB2YXIgVUlOVDE2ID0gMHhmZmZmXG4gICAgICAsICR1ID0gK3VcbiAgICAgICwgJHYgPSArdlxuICAgICAgLCB1MCA9ICR1ICYgVUlOVDE2XG4gICAgICAsIHYwID0gJHYgJiBVSU5UMTZcbiAgICAgICwgdTEgPSAkdSA+Pj4gMTZcbiAgICAgICwgdjEgPSAkdiA+Pj4gMTZcbiAgICAgICwgdCAgPSAodTEgKiB2MCA+Pj4gMCkgKyAodTAgKiB2MCA+Pj4gMTYpO1xuICAgIHJldHVybiB1MSAqIHYxICsgKHQgPj4+IDE2KSArICgodTAgKiB2MSA+Pj4gMCkgKyAodCAmIFVJTlQxNikgPj4+IDE2KTtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM3Lm1hdGgudW11bGguanNcbiAqKiBtb2R1bGUgaWQgPSAyNzBcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBtZXRhZGF0YSAgICAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fbWV0YWRhdGEnKVxuICAsIGFuT2JqZWN0ICAgICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKVxuICAsIHRvTWV0YUtleSAgICAgICAgICAgICAgICAgPSBtZXRhZGF0YS5rZXlcbiAgLCBvcmRpbmFyeURlZmluZU93bk1ldGFkYXRhID0gbWV0YWRhdGEuc2V0O1xuXG5tZXRhZGF0YS5leHAoe2RlZmluZU1ldGFkYXRhOiBmdW5jdGlvbiBkZWZpbmVNZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSwgdGFyZ2V0LCB0YXJnZXRLZXkpe1xuICBvcmRpbmFyeURlZmluZU93bk1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlLCBhbk9iamVjdCh0YXJnZXQpLCB0b01ldGFLZXkodGFyZ2V0S2V5KSk7XG59fSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM3LnJlZmxlY3QuZGVmaW5lLW1ldGFkYXRhLmpzXG4gKiogbW9kdWxlIGlkID0gMjcxXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgTWFwICAgICA9IHJlcXVpcmUoJy4vZXM2Lm1hcCcpXG4gICwgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICwgc2hhcmVkICA9IHJlcXVpcmUoJy4vX3NoYXJlZCcpKCdtZXRhZGF0YScpXG4gICwgc3RvcmUgICA9IHNoYXJlZC5zdG9yZSB8fCAoc2hhcmVkLnN0b3JlID0gbmV3IChyZXF1aXJlKCcuL2VzNi53ZWFrLW1hcCcpKSk7XG5cbnZhciBnZXRPckNyZWF0ZU1ldGFkYXRhTWFwID0gZnVuY3Rpb24odGFyZ2V0LCB0YXJnZXRLZXksIGNyZWF0ZSl7XG4gIHZhciB0YXJnZXRNZXRhZGF0YSA9IHN0b3JlLmdldCh0YXJnZXQpO1xuICBpZighdGFyZ2V0TWV0YWRhdGEpe1xuICAgIGlmKCFjcmVhdGUpcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBzdG9yZS5zZXQodGFyZ2V0LCB0YXJnZXRNZXRhZGF0YSA9IG5ldyBNYXApO1xuICB9XG4gIHZhciBrZXlNZXRhZGF0YSA9IHRhcmdldE1ldGFkYXRhLmdldCh0YXJnZXRLZXkpO1xuICBpZigha2V5TWV0YWRhdGEpe1xuICAgIGlmKCFjcmVhdGUpcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB0YXJnZXRNZXRhZGF0YS5zZXQodGFyZ2V0S2V5LCBrZXlNZXRhZGF0YSA9IG5ldyBNYXApO1xuICB9IHJldHVybiBrZXlNZXRhZGF0YTtcbn07XG52YXIgb3JkaW5hcnlIYXNPd25NZXRhZGF0YSA9IGZ1bmN0aW9uKE1ldGFkYXRhS2V5LCBPLCBQKXtcbiAgdmFyIG1ldGFkYXRhTWFwID0gZ2V0T3JDcmVhdGVNZXRhZGF0YU1hcChPLCBQLCBmYWxzZSk7XG4gIHJldHVybiBtZXRhZGF0YU1hcCA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiBtZXRhZGF0YU1hcC5oYXMoTWV0YWRhdGFLZXkpO1xufTtcbnZhciBvcmRpbmFyeUdldE93bk1ldGFkYXRhID0gZnVuY3Rpb24oTWV0YWRhdGFLZXksIE8sIFApe1xuICB2YXIgbWV0YWRhdGFNYXAgPSBnZXRPckNyZWF0ZU1ldGFkYXRhTWFwKE8sIFAsIGZhbHNlKTtcbiAgcmV0dXJuIG1ldGFkYXRhTWFwID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBtZXRhZGF0YU1hcC5nZXQoTWV0YWRhdGFLZXkpO1xufTtcbnZhciBvcmRpbmFyeURlZmluZU93bk1ldGFkYXRhID0gZnVuY3Rpb24oTWV0YWRhdGFLZXksIE1ldGFkYXRhVmFsdWUsIE8sIFApe1xuICBnZXRPckNyZWF0ZU1ldGFkYXRhTWFwKE8sIFAsIHRydWUpLnNldChNZXRhZGF0YUtleSwgTWV0YWRhdGFWYWx1ZSk7XG59O1xudmFyIG9yZGluYXJ5T3duTWV0YWRhdGFLZXlzID0gZnVuY3Rpb24odGFyZ2V0LCB0YXJnZXRLZXkpe1xuICB2YXIgbWV0YWRhdGFNYXAgPSBnZXRPckNyZWF0ZU1ldGFkYXRhTWFwKHRhcmdldCwgdGFyZ2V0S2V5LCBmYWxzZSlcbiAgICAsIGtleXMgICAgICAgID0gW107XG4gIGlmKG1ldGFkYXRhTWFwKW1ldGFkYXRhTWFwLmZvckVhY2goZnVuY3Rpb24oXywga2V5KXsga2V5cy5wdXNoKGtleSk7IH0pO1xuICByZXR1cm4ga2V5cztcbn07XG52YXIgdG9NZXRhS2V5ID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gaXQgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgaXQgPT0gJ3N5bWJvbCcgPyBpdCA6IFN0cmluZyhpdCk7XG59O1xudmFyIGV4cCA9IGZ1bmN0aW9uKE8pe1xuICAkZXhwb3J0KCRleHBvcnQuUywgJ1JlZmxlY3QnLCBPKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBzdG9yZTogc3RvcmUsXG4gIG1hcDogZ2V0T3JDcmVhdGVNZXRhZGF0YU1hcCxcbiAgaGFzOiBvcmRpbmFyeUhhc093bk1ldGFkYXRhLFxuICBnZXQ6IG9yZGluYXJ5R2V0T3duTWV0YWRhdGEsXG4gIHNldDogb3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YSxcbiAga2V5czogb3JkaW5hcnlPd25NZXRhZGF0YUtleXMsXG4gIGtleTogdG9NZXRhS2V5LFxuICBleHA6IGV4cFxufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fbWV0YWRhdGEuanNcbiAqKiBtb2R1bGUgaWQgPSAyNzJcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBtZXRhZGF0YSAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fbWV0YWRhdGEnKVxuICAsIGFuT2JqZWN0ICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKVxuICAsIHRvTWV0YUtleSAgICAgICAgICAgICAgPSBtZXRhZGF0YS5rZXlcbiAgLCBnZXRPckNyZWF0ZU1ldGFkYXRhTWFwID0gbWV0YWRhdGEubWFwXG4gICwgc3RvcmUgICAgICAgICAgICAgICAgICA9IG1ldGFkYXRhLnN0b3JlO1xuXG5tZXRhZGF0YS5leHAoe2RlbGV0ZU1ldGFkYXRhOiBmdW5jdGlvbiBkZWxldGVNZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0IC8qLCB0YXJnZXRLZXkgKi8pe1xuICB2YXIgdGFyZ2V0S2V5ICAgPSBhcmd1bWVudHMubGVuZ3RoIDwgMyA/IHVuZGVmaW5lZCA6IHRvTWV0YUtleShhcmd1bWVudHNbMl0pXG4gICAgLCBtZXRhZGF0YU1hcCA9IGdldE9yQ3JlYXRlTWV0YWRhdGFNYXAoYW5PYmplY3QodGFyZ2V0KSwgdGFyZ2V0S2V5LCBmYWxzZSk7XG4gIGlmKG1ldGFkYXRhTWFwID09PSB1bmRlZmluZWQgfHwgIW1ldGFkYXRhTWFwWydkZWxldGUnXShtZXRhZGF0YUtleSkpcmV0dXJuIGZhbHNlO1xuICBpZihtZXRhZGF0YU1hcC5zaXplKXJldHVybiB0cnVlO1xuICB2YXIgdGFyZ2V0TWV0YWRhdGEgPSBzdG9yZS5nZXQodGFyZ2V0KTtcbiAgdGFyZ2V0TWV0YWRhdGFbJ2RlbGV0ZSddKHRhcmdldEtleSk7XG4gIHJldHVybiAhIXRhcmdldE1ldGFkYXRhLnNpemUgfHwgc3RvcmVbJ2RlbGV0ZSddKHRhcmdldCk7XG59fSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM3LnJlZmxlY3QuZGVsZXRlLW1ldGFkYXRhLmpzXG4gKiogbW9kdWxlIGlkID0gMjczXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgbWV0YWRhdGEgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX21ldGFkYXRhJylcbiAgLCBhbk9iamVjdCAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0JylcbiAgLCBnZXRQcm90b3R5cGVPZiAgICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdwbycpXG4gICwgb3JkaW5hcnlIYXNPd25NZXRhZGF0YSA9IG1ldGFkYXRhLmhhc1xuICAsIG9yZGluYXJ5R2V0T3duTWV0YWRhdGEgPSBtZXRhZGF0YS5nZXRcbiAgLCB0b01ldGFLZXkgICAgICAgICAgICAgID0gbWV0YWRhdGEua2V5O1xuXG52YXIgb3JkaW5hcnlHZXRNZXRhZGF0YSA9IGZ1bmN0aW9uKE1ldGFkYXRhS2V5LCBPLCBQKXtcbiAgdmFyIGhhc093biA9IG9yZGluYXJ5SGFzT3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApO1xuICBpZihoYXNPd24pcmV0dXJuIG9yZGluYXJ5R2V0T3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApO1xuICB2YXIgcGFyZW50ID0gZ2V0UHJvdG90eXBlT2YoTyk7XG4gIHJldHVybiBwYXJlbnQgIT09IG51bGwgPyBvcmRpbmFyeUdldE1ldGFkYXRhKE1ldGFkYXRhS2V5LCBwYXJlbnQsIFApIDogdW5kZWZpbmVkO1xufTtcblxubWV0YWRhdGEuZXhwKHtnZXRNZXRhZGF0YTogZnVuY3Rpb24gZ2V0TWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCAvKiwgdGFyZ2V0S2V5ICovKXtcbiAgcmV0dXJuIG9yZGluYXJ5R2V0TWV0YWRhdGEobWV0YWRhdGFLZXksIGFuT2JqZWN0KHRhcmdldCksIGFyZ3VtZW50cy5sZW5ndGggPCAzID8gdW5kZWZpbmVkIDogdG9NZXRhS2V5KGFyZ3VtZW50c1syXSkpO1xufX0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNy5yZWZsZWN0LmdldC1tZXRhZGF0YS5qc1xuICoqIG1vZHVsZSBpZCA9IDI3NFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwidmFyIFNldCAgICAgICAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9lczYuc2V0JylcbiAgLCBmcm9tICAgICAgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2FycmF5LWZyb20taXRlcmFibGUnKVxuICAsIG1ldGFkYXRhICAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fbWV0YWRhdGEnKVxuICAsIGFuT2JqZWN0ICAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0JylcbiAgLCBnZXRQcm90b3R5cGVPZiAgICAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1ncG8nKVxuICAsIG9yZGluYXJ5T3duTWV0YWRhdGFLZXlzID0gbWV0YWRhdGEua2V5c1xuICAsIHRvTWV0YUtleSAgICAgICAgICAgICAgID0gbWV0YWRhdGEua2V5O1xuXG52YXIgb3JkaW5hcnlNZXRhZGF0YUtleXMgPSBmdW5jdGlvbihPLCBQKXtcbiAgdmFyIG9LZXlzICA9IG9yZGluYXJ5T3duTWV0YWRhdGFLZXlzKE8sIFApXG4gICAgLCBwYXJlbnQgPSBnZXRQcm90b3R5cGVPZihPKTtcbiAgaWYocGFyZW50ID09PSBudWxsKXJldHVybiBvS2V5cztcbiAgdmFyIHBLZXlzICA9IG9yZGluYXJ5TWV0YWRhdGFLZXlzKHBhcmVudCwgUCk7XG4gIHJldHVybiBwS2V5cy5sZW5ndGggPyBvS2V5cy5sZW5ndGggPyBmcm9tKG5ldyBTZXQob0tleXMuY29uY2F0KHBLZXlzKSkpIDogcEtleXMgOiBvS2V5cztcbn07XG5cbm1ldGFkYXRhLmV4cCh7Z2V0TWV0YWRhdGFLZXlzOiBmdW5jdGlvbiBnZXRNZXRhZGF0YUtleXModGFyZ2V0IC8qLCB0YXJnZXRLZXkgKi8pe1xuICByZXR1cm4gb3JkaW5hcnlNZXRhZGF0YUtleXMoYW5PYmplY3QodGFyZ2V0KSwgYXJndW1lbnRzLmxlbmd0aCA8IDIgPyB1bmRlZmluZWQgOiB0b01ldGFLZXkoYXJndW1lbnRzWzFdKSk7XG59fSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM3LnJlZmxlY3QuZ2V0LW1ldGFkYXRhLWtleXMuanNcbiAqKiBtb2R1bGUgaWQgPSAyNzVcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBtZXRhZGF0YSAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fbWV0YWRhdGEnKVxuICAsIGFuT2JqZWN0ICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKVxuICAsIG9yZGluYXJ5R2V0T3duTWV0YWRhdGEgPSBtZXRhZGF0YS5nZXRcbiAgLCB0b01ldGFLZXkgICAgICAgICAgICAgID0gbWV0YWRhdGEua2V5O1xuXG5tZXRhZGF0YS5leHAoe2dldE93bk1ldGFkYXRhOiBmdW5jdGlvbiBnZXRPd25NZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0IC8qLCB0YXJnZXRLZXkgKi8pe1xuICByZXR1cm4gb3JkaW5hcnlHZXRPd25NZXRhZGF0YShtZXRhZGF0YUtleSwgYW5PYmplY3QodGFyZ2V0KVxuICAgICwgYXJndW1lbnRzLmxlbmd0aCA8IDMgPyB1bmRlZmluZWQgOiB0b01ldGFLZXkoYXJndW1lbnRzWzJdKSk7XG59fSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM3LnJlZmxlY3QuZ2V0LW93bi1tZXRhZGF0YS5qc1xuICoqIG1vZHVsZSBpZCA9IDI3NlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwidmFyIG1ldGFkYXRhICAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fbWV0YWRhdGEnKVxuICAsIGFuT2JqZWN0ICAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0JylcbiAgLCBvcmRpbmFyeU93bk1ldGFkYXRhS2V5cyA9IG1ldGFkYXRhLmtleXNcbiAgLCB0b01ldGFLZXkgICAgICAgICAgICAgICA9IG1ldGFkYXRhLmtleTtcblxubWV0YWRhdGEuZXhwKHtnZXRPd25NZXRhZGF0YUtleXM6IGZ1bmN0aW9uIGdldE93bk1ldGFkYXRhS2V5cyh0YXJnZXQgLyosIHRhcmdldEtleSAqLyl7XG4gIHJldHVybiBvcmRpbmFyeU93bk1ldGFkYXRhS2V5cyhhbk9iamVjdCh0YXJnZXQpLCBhcmd1bWVudHMubGVuZ3RoIDwgMiA/IHVuZGVmaW5lZCA6IHRvTWV0YUtleShhcmd1bWVudHNbMV0pKTtcbn19KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczcucmVmbGVjdC5nZXQtb3duLW1ldGFkYXRhLWtleXMuanNcbiAqKiBtb2R1bGUgaWQgPSAyNzdcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBtZXRhZGF0YSAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fbWV0YWRhdGEnKVxuICAsIGFuT2JqZWN0ICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKVxuICAsIGdldFByb3RvdHlwZU9mICAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZ3BvJylcbiAgLCBvcmRpbmFyeUhhc093bk1ldGFkYXRhID0gbWV0YWRhdGEuaGFzXG4gICwgdG9NZXRhS2V5ICAgICAgICAgICAgICA9IG1ldGFkYXRhLmtleTtcblxudmFyIG9yZGluYXJ5SGFzTWV0YWRhdGEgPSBmdW5jdGlvbihNZXRhZGF0YUtleSwgTywgUCl7XG4gIHZhciBoYXNPd24gPSBvcmRpbmFyeUhhc093bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKTtcbiAgaWYoaGFzT3duKXJldHVybiB0cnVlO1xuICB2YXIgcGFyZW50ID0gZ2V0UHJvdG90eXBlT2YoTyk7XG4gIHJldHVybiBwYXJlbnQgIT09IG51bGwgPyBvcmRpbmFyeUhhc01ldGFkYXRhKE1ldGFkYXRhS2V5LCBwYXJlbnQsIFApIDogZmFsc2U7XG59O1xuXG5tZXRhZGF0YS5leHAoe2hhc01ldGFkYXRhOiBmdW5jdGlvbiBoYXNNZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0IC8qLCB0YXJnZXRLZXkgKi8pe1xuICByZXR1cm4gb3JkaW5hcnlIYXNNZXRhZGF0YShtZXRhZGF0YUtleSwgYW5PYmplY3QodGFyZ2V0KSwgYXJndW1lbnRzLmxlbmd0aCA8IDMgPyB1bmRlZmluZWQgOiB0b01ldGFLZXkoYXJndW1lbnRzWzJdKSk7XG59fSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM3LnJlZmxlY3QuaGFzLW1ldGFkYXRhLmpzXG4gKiogbW9kdWxlIGlkID0gMjc4XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgbWV0YWRhdGEgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX21ldGFkYXRhJylcbiAgLCBhbk9iamVjdCAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0JylcbiAgLCBvcmRpbmFyeUhhc093bk1ldGFkYXRhID0gbWV0YWRhdGEuaGFzXG4gICwgdG9NZXRhS2V5ICAgICAgICAgICAgICA9IG1ldGFkYXRhLmtleTtcblxubWV0YWRhdGEuZXhwKHtoYXNPd25NZXRhZGF0YTogZnVuY3Rpb24gaGFzT3duTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCAvKiwgdGFyZ2V0S2V5ICovKXtcbiAgcmV0dXJuIG9yZGluYXJ5SGFzT3duTWV0YWRhdGEobWV0YWRhdGFLZXksIGFuT2JqZWN0KHRhcmdldClcbiAgICAsIGFyZ3VtZW50cy5sZW5ndGggPCAzID8gdW5kZWZpbmVkIDogdG9NZXRhS2V5KGFyZ3VtZW50c1syXSkpO1xufX0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNy5yZWZsZWN0Lmhhcy1vd24tbWV0YWRhdGEuanNcbiAqKiBtb2R1bGUgaWQgPSAyNzlcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBtZXRhZGF0YSAgICAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fbWV0YWRhdGEnKVxuICAsIGFuT2JqZWN0ICAgICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKVxuICAsIGFGdW5jdGlvbiAgICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJylcbiAgLCB0b01ldGFLZXkgICAgICAgICAgICAgICAgID0gbWV0YWRhdGEua2V5XG4gICwgb3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YSA9IG1ldGFkYXRhLnNldDtcblxubWV0YWRhdGEuZXhwKHttZXRhZGF0YTogZnVuY3Rpb24gbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpe1xuICByZXR1cm4gZnVuY3Rpb24gZGVjb3JhdG9yKHRhcmdldCwgdGFyZ2V0S2V5KXtcbiAgICBvcmRpbmFyeURlZmluZU93bk1ldGFkYXRhKFxuICAgICAgbWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUsXG4gICAgICAodGFyZ2V0S2V5ICE9PSB1bmRlZmluZWQgPyBhbk9iamVjdCA6IGFGdW5jdGlvbikodGFyZ2V0KSxcbiAgICAgIHRvTWV0YUtleSh0YXJnZXRLZXkpXG4gICAgKTtcbiAgfTtcbn19KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczcucmVmbGVjdC5tZXRhZGF0YS5qc1xuICoqIG1vZHVsZSBpZCA9IDI4MFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gaWU5LSBzZXRUaW1lb3V0ICYgc2V0SW50ZXJ2YWwgYWRkaXRpb25hbCBwYXJhbWV0ZXJzIGZpeFxudmFyIGdsb2JhbCAgICAgPSByZXF1aXJlKCcuL19nbG9iYWwnKVxuICAsICRleHBvcnQgICAgPSByZXF1aXJlKCcuL19leHBvcnQnKVxuICAsIGludm9rZSAgICAgPSByZXF1aXJlKCcuL19pbnZva2UnKVxuICAsIHBhcnRpYWwgICAgPSByZXF1aXJlKCcuL19wYXJ0aWFsJylcbiAgLCBuYXZpZ2F0b3IgID0gZ2xvYmFsLm5hdmlnYXRvclxuICAsIE1TSUUgICAgICAgPSAhIW5hdmlnYXRvciAmJiAvTVNJRSAuXFwuLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpOyAvLyA8LSBkaXJ0eSBpZTktIGNoZWNrXG52YXIgd3JhcCA9IGZ1bmN0aW9uKHNldCl7XG4gIHJldHVybiBNU0lFID8gZnVuY3Rpb24oZm4sIHRpbWUgLyosIC4uLmFyZ3MgKi8pe1xuICAgIHJldHVybiBzZXQoaW52b2tlKFxuICAgICAgcGFydGlhbCxcbiAgICAgIFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAyKSxcbiAgICAgIHR5cGVvZiBmbiA9PSAnZnVuY3Rpb24nID8gZm4gOiBGdW5jdGlvbihmbilcbiAgICApLCB0aW1lKTtcbiAgfSA6IHNldDtcbn07XG4kZXhwb3J0KCRleHBvcnQuRyArICRleHBvcnQuQiArICRleHBvcnQuRiAqIE1TSUUsIHtcbiAgc2V0VGltZW91dDogIHdyYXAoZ2xvYmFsLnNldFRpbWVvdXQpLFxuICBzZXRJbnRlcnZhbDogd3JhcChnbG9iYWwuc2V0SW50ZXJ2YWwpXG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy93ZWIudGltZXJzLmpzXG4gKiogbW9kdWxlIGlkID0gMjgxXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG52YXIgcGF0aCAgICAgID0gcmVxdWlyZSgnLi9fcGF0aCcpXG4gICwgaW52b2tlICAgID0gcmVxdWlyZSgnLi9faW52b2tlJylcbiAgLCBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKC8qIC4uLnBhcmdzICovKXtcbiAgdmFyIGZuICAgICA9IGFGdW5jdGlvbih0aGlzKVxuICAgICwgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aFxuICAgICwgcGFyZ3MgID0gQXJyYXkobGVuZ3RoKVxuICAgICwgaSAgICAgID0gMFxuICAgICwgXyAgICAgID0gcGF0aC5fXG4gICAgLCBob2xkZXIgPSBmYWxzZTtcbiAgd2hpbGUobGVuZ3RoID4gaSlpZigocGFyZ3NbaV0gPSBhcmd1bWVudHNbaSsrXSkgPT09IF8paG9sZGVyID0gdHJ1ZTtcbiAgcmV0dXJuIGZ1bmN0aW9uKC8qIC4uLmFyZ3MgKi8pe1xuICAgIHZhciB0aGF0ID0gdGhpc1xuICAgICAgLCBhTGVuID0gYXJndW1lbnRzLmxlbmd0aFxuICAgICAgLCBqID0gMCwgayA9IDAsIGFyZ3M7XG4gICAgaWYoIWhvbGRlciAmJiAhYUxlbilyZXR1cm4gaW52b2tlKGZuLCBwYXJncywgdGhhdCk7XG4gICAgYXJncyA9IHBhcmdzLnNsaWNlKCk7XG4gICAgaWYoaG9sZGVyKWZvcig7bGVuZ3RoID4gajsgaisrKWlmKGFyZ3Nbal0gPT09IF8pYXJnc1tqXSA9IGFyZ3VtZW50c1trKytdO1xuICAgIHdoaWxlKGFMZW4gPiBrKWFyZ3MucHVzaChhcmd1bWVudHNbaysrXSk7XG4gICAgcmV0dXJuIGludm9rZShmbiwgYXJncywgdGhhdCk7XG4gIH07XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19wYXJ0aWFsLmpzXG4gKiogbW9kdWxlIGlkID0gMjgyXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19wYXRoLmpzXG4gKiogbW9kdWxlIGlkID0gMjgzXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICwgJHRhc2sgICA9IHJlcXVpcmUoJy4vX3Rhc2snKTtcbiRleHBvcnQoJGV4cG9ydC5HICsgJGV4cG9ydC5CLCB7XG4gIHNldEltbWVkaWF0ZTogICAkdGFzay5zZXQsXG4gIGNsZWFySW1tZWRpYXRlOiAkdGFzay5jbGVhclxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvd2ViLmltbWVkaWF0ZS5qc1xuICoqIG1vZHVsZSBpZCA9IDI4NFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwidmFyICRpdGVyYXRvcnMgICAgPSByZXF1aXJlKCcuL2VzNi5hcnJheS5pdGVyYXRvcicpXG4gICwgcmVkZWZpbmUgICAgICA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJylcbiAgLCBnbG9iYWwgICAgICAgID0gcmVxdWlyZSgnLi9fZ2xvYmFsJylcbiAgLCBoaWRlICAgICAgICAgID0gcmVxdWlyZSgnLi9faGlkZScpXG4gICwgSXRlcmF0b3JzICAgICA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpXG4gICwgd2tzICAgICAgICAgICA9IHJlcXVpcmUoJy4vX3drcycpXG4gICwgSVRFUkFUT1IgICAgICA9IHdrcygnaXRlcmF0b3InKVxuICAsIFRPX1NUUklOR19UQUcgPSB3a3MoJ3RvU3RyaW5nVGFnJylcbiAgLCBBcnJheVZhbHVlcyAgID0gSXRlcmF0b3JzLkFycmF5O1xuXG5mb3IodmFyIGNvbGxlY3Rpb25zID0gWydOb2RlTGlzdCcsICdET01Ub2tlbkxpc3QnLCAnTWVkaWFMaXN0JywgJ1N0eWxlU2hlZXRMaXN0JywgJ0NTU1J1bGVMaXN0J10sIGkgPSAwOyBpIDwgNTsgaSsrKXtcbiAgdmFyIE5BTUUgICAgICAgPSBjb2xsZWN0aW9uc1tpXVxuICAgICwgQ29sbGVjdGlvbiA9IGdsb2JhbFtOQU1FXVxuICAgICwgcHJvdG8gICAgICA9IENvbGxlY3Rpb24gJiYgQ29sbGVjdGlvbi5wcm90b3R5cGVcbiAgICAsIGtleTtcbiAgaWYocHJvdG8pe1xuICAgIGlmKCFwcm90b1tJVEVSQVRPUl0paGlkZShwcm90bywgSVRFUkFUT1IsIEFycmF5VmFsdWVzKTtcbiAgICBpZighcHJvdG9bVE9fU1RSSU5HX1RBR10paGlkZShwcm90bywgVE9fU1RSSU5HX1RBRywgTkFNRSk7XG4gICAgSXRlcmF0b3JzW05BTUVdID0gQXJyYXlWYWx1ZXM7XG4gICAgZm9yKGtleSBpbiAkaXRlcmF0b3JzKWlmKCFwcm90b1trZXldKXJlZGVmaW5lKHByb3RvLCBrZXksICRpdGVyYXRvcnNba2V5XSwgdHJ1ZSk7XG4gIH1cbn1cblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy93ZWIuZG9tLml0ZXJhYmxlLmpzXG4gKiogbW9kdWxlIGlkID0gMjg1XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBodHRwczovL3Jhdy5naXRodWIuY29tL2ZhY2Vib29rL3JlZ2VuZXJhdG9yL21hc3Rlci9MSUNFTlNFIGZpbGUuIEFuXG4gKiBhZGRpdGlvbmFsIGdyYW50IG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW5cbiAqIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqL1xuXG4hKGZ1bmN0aW9uKGdsb2JhbCkge1xuICBcInVzZSBzdHJpY3RcIjtcblxuICB2YXIgaGFzT3duID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbiAgdmFyIHVuZGVmaW5lZDsgLy8gTW9yZSBjb21wcmVzc2libGUgdGhhbiB2b2lkIDAuXG4gIHZhciBpdGVyYXRvclN5bWJvbCA9XG4gICAgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5pdGVyYXRvciB8fCBcIkBAaXRlcmF0b3JcIjtcblxuICB2YXIgaW5Nb2R1bGUgPSB0eXBlb2YgbW9kdWxlID09PSBcIm9iamVjdFwiO1xuICB2YXIgcnVudGltZSA9IGdsb2JhbC5yZWdlbmVyYXRvclJ1bnRpbWU7XG4gIGlmIChydW50aW1lKSB7XG4gICAgaWYgKGluTW9kdWxlKSB7XG4gICAgICAvLyBJZiByZWdlbmVyYXRvclJ1bnRpbWUgaXMgZGVmaW5lZCBnbG9iYWxseSBhbmQgd2UncmUgaW4gYSBtb2R1bGUsXG4gICAgICAvLyBtYWtlIHRoZSBleHBvcnRzIG9iamVjdCBpZGVudGljYWwgdG8gcmVnZW5lcmF0b3JSdW50aW1lLlxuICAgICAgbW9kdWxlLmV4cG9ydHMgPSBydW50aW1lO1xuICAgIH1cbiAgICAvLyBEb24ndCBib3RoZXIgZXZhbHVhdGluZyB0aGUgcmVzdCBvZiB0aGlzIGZpbGUgaWYgdGhlIHJ1bnRpbWUgd2FzXG4gICAgLy8gYWxyZWFkeSBkZWZpbmVkIGdsb2JhbGx5LlxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIERlZmluZSB0aGUgcnVudGltZSBnbG9iYWxseSAoYXMgZXhwZWN0ZWQgYnkgZ2VuZXJhdGVkIGNvZGUpIGFzIGVpdGhlclxuICAvLyBtb2R1bGUuZXhwb3J0cyAoaWYgd2UncmUgaW4gYSBtb2R1bGUpIG9yIGEgbmV3LCBlbXB0eSBvYmplY3QuXG4gIHJ1bnRpbWUgPSBnbG9iYWwucmVnZW5lcmF0b3JSdW50aW1lID0gaW5Nb2R1bGUgPyBtb2R1bGUuZXhwb3J0cyA6IHt9O1xuXG4gIGZ1bmN0aW9uIHdyYXAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpIHtcbiAgICAvLyBJZiBvdXRlckZuIHByb3ZpZGVkLCB0aGVuIG91dGVyRm4ucHJvdG90eXBlIGluc3RhbmNlb2YgR2VuZXJhdG9yLlxuICAgIHZhciBnZW5lcmF0b3IgPSBPYmplY3QuY3JlYXRlKChvdXRlckZuIHx8IEdlbmVyYXRvcikucHJvdG90eXBlKTtcbiAgICB2YXIgY29udGV4dCA9IG5ldyBDb250ZXh0KHRyeUxvY3NMaXN0IHx8IFtdKTtcblxuICAgIC8vIFRoZSAuX2ludm9rZSBtZXRob2QgdW5pZmllcyB0aGUgaW1wbGVtZW50YXRpb25zIG9mIHRoZSAubmV4dCxcbiAgICAvLyAudGhyb3csIGFuZCAucmV0dXJuIG1ldGhvZHMuXG4gICAgZ2VuZXJhdG9yLl9pbnZva2UgPSBtYWtlSW52b2tlTWV0aG9kKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpO1xuXG4gICAgcmV0dXJuIGdlbmVyYXRvcjtcbiAgfVxuICBydW50aW1lLndyYXAgPSB3cmFwO1xuXG4gIC8vIFRyeS9jYXRjaCBoZWxwZXIgdG8gbWluaW1pemUgZGVvcHRpbWl6YXRpb25zLiBSZXR1cm5zIGEgY29tcGxldGlvblxuICAvLyByZWNvcmQgbGlrZSBjb250ZXh0LnRyeUVudHJpZXNbaV0uY29tcGxldGlvbi4gVGhpcyBpbnRlcmZhY2UgY291bGRcbiAgLy8gaGF2ZSBiZWVuIChhbmQgd2FzIHByZXZpb3VzbHkpIGRlc2lnbmVkIHRvIHRha2UgYSBjbG9zdXJlIHRvIGJlXG4gIC8vIGludm9rZWQgd2l0aG91dCBhcmd1bWVudHMsIGJ1dCBpbiBhbGwgdGhlIGNhc2VzIHdlIGNhcmUgYWJvdXQgd2VcbiAgLy8gYWxyZWFkeSBoYXZlIGFuIGV4aXN0aW5nIG1ldGhvZCB3ZSB3YW50IHRvIGNhbGwsIHNvIHRoZXJlJ3Mgbm8gbmVlZFxuICAvLyB0byBjcmVhdGUgYSBuZXcgZnVuY3Rpb24gb2JqZWN0LiBXZSBjYW4gZXZlbiBnZXQgYXdheSB3aXRoIGFzc3VtaW5nXG4gIC8vIHRoZSBtZXRob2QgdGFrZXMgZXhhY3RseSBvbmUgYXJndW1lbnQsIHNpbmNlIHRoYXQgaGFwcGVucyB0byBiZSB0cnVlXG4gIC8vIGluIGV2ZXJ5IGNhc2UsIHNvIHdlIGRvbid0IGhhdmUgdG8gdG91Y2ggdGhlIGFyZ3VtZW50cyBvYmplY3QuIFRoZVxuICAvLyBvbmx5IGFkZGl0aW9uYWwgYWxsb2NhdGlvbiByZXF1aXJlZCBpcyB0aGUgY29tcGxldGlvbiByZWNvcmQsIHdoaWNoXG4gIC8vIGhhcyBhIHN0YWJsZSBzaGFwZSBhbmQgc28gaG9wZWZ1bGx5IHNob3VsZCBiZSBjaGVhcCB0byBhbGxvY2F0ZS5cbiAgZnVuY3Rpb24gdHJ5Q2F0Y2goZm4sIG9iaiwgYXJnKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB7IHR5cGU6IFwibm9ybWFsXCIsIGFyZzogZm4uY2FsbChvYmosIGFyZykgfTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6IFwidGhyb3dcIiwgYXJnOiBlcnIgfTtcbiAgICB9XG4gIH1cblxuICB2YXIgR2VuU3RhdGVTdXNwZW5kZWRTdGFydCA9IFwic3VzcGVuZGVkU3RhcnRcIjtcbiAgdmFyIEdlblN0YXRlU3VzcGVuZGVkWWllbGQgPSBcInN1c3BlbmRlZFlpZWxkXCI7XG4gIHZhciBHZW5TdGF0ZUV4ZWN1dGluZyA9IFwiZXhlY3V0aW5nXCI7XG4gIHZhciBHZW5TdGF0ZUNvbXBsZXRlZCA9IFwiY29tcGxldGVkXCI7XG5cbiAgLy8gUmV0dXJuaW5nIHRoaXMgb2JqZWN0IGZyb20gdGhlIGlubmVyRm4gaGFzIHRoZSBzYW1lIGVmZmVjdCBhc1xuICAvLyBicmVha2luZyBvdXQgb2YgdGhlIGRpc3BhdGNoIHN3aXRjaCBzdGF0ZW1lbnQuXG4gIHZhciBDb250aW51ZVNlbnRpbmVsID0ge307XG5cbiAgLy8gRHVtbXkgY29uc3RydWN0b3IgZnVuY3Rpb25zIHRoYXQgd2UgdXNlIGFzIHRoZSAuY29uc3RydWN0b3IgYW5kXG4gIC8vIC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcyBmb3IgZnVuY3Rpb25zIHRoYXQgcmV0dXJuIEdlbmVyYXRvclxuICAvLyBvYmplY3RzLiBGb3IgZnVsbCBzcGVjIGNvbXBsaWFuY2UsIHlvdSBtYXkgd2lzaCB0byBjb25maWd1cmUgeW91clxuICAvLyBtaW5pZmllciBub3QgdG8gbWFuZ2xlIHRoZSBuYW1lcyBvZiB0aGVzZSB0d28gZnVuY3Rpb25zLlxuICBmdW5jdGlvbiBHZW5lcmF0b3IoKSB7fVxuICBmdW5jdGlvbiBHZW5lcmF0b3JGdW5jdGlvbigpIHt9XG4gIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKCkge31cblxuICB2YXIgR3AgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZS5wcm90b3R5cGUgPSBHZW5lcmF0b3IucHJvdG90eXBlO1xuICBHZW5lcmF0b3JGdW5jdGlvbi5wcm90b3R5cGUgPSBHcC5jb25zdHJ1Y3RvciA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlO1xuICBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEdlbmVyYXRvckZ1bmN0aW9uO1xuICBHZW5lcmF0b3JGdW5jdGlvbi5kaXNwbGF5TmFtZSA9IFwiR2VuZXJhdG9yRnVuY3Rpb25cIjtcblxuICAvLyBIZWxwZXIgZm9yIGRlZmluaW5nIHRoZSAubmV4dCwgLnRocm93LCBhbmQgLnJldHVybiBtZXRob2RzIG9mIHRoZVxuICAvLyBJdGVyYXRvciBpbnRlcmZhY2UgaW4gdGVybXMgb2YgYSBzaW5nbGUgLl9pbnZva2UgbWV0aG9kLlxuICBmdW5jdGlvbiBkZWZpbmVJdGVyYXRvck1ldGhvZHMocHJvdG90eXBlKSB7XG4gICAgW1wibmV4dFwiLCBcInRocm93XCIsIFwicmV0dXJuXCJdLmZvckVhY2goZnVuY3Rpb24obWV0aG9kKSB7XG4gICAgICBwcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uKGFyZykge1xuICAgICAgICByZXR1cm4gdGhpcy5faW52b2tlKG1ldGhvZCwgYXJnKTtcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBydW50aW1lLmlzR2VuZXJhdG9yRnVuY3Rpb24gPSBmdW5jdGlvbihnZW5GdW4pIHtcbiAgICB2YXIgY3RvciA9IHR5cGVvZiBnZW5GdW4gPT09IFwiZnVuY3Rpb25cIiAmJiBnZW5GdW4uY29uc3RydWN0b3I7XG4gICAgcmV0dXJuIGN0b3JcbiAgICAgID8gY3RvciA9PT0gR2VuZXJhdG9yRnVuY3Rpb24gfHxcbiAgICAgICAgLy8gRm9yIHRoZSBuYXRpdmUgR2VuZXJhdG9yRnVuY3Rpb24gY29uc3RydWN0b3IsIHRoZSBiZXN0IHdlIGNhblxuICAgICAgICAvLyBkbyBpcyB0byBjaGVjayBpdHMgLm5hbWUgcHJvcGVydHkuXG4gICAgICAgIChjdG9yLmRpc3BsYXlOYW1lIHx8IGN0b3IubmFtZSkgPT09IFwiR2VuZXJhdG9yRnVuY3Rpb25cIlxuICAgICAgOiBmYWxzZTtcbiAgfTtcblxuICBydW50aW1lLm1hcmsgPSBmdW5jdGlvbihnZW5GdW4pIHtcbiAgICBpZiAoT2JqZWN0LnNldFByb3RvdHlwZU9mKSB7XG4gICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YoZ2VuRnVuLCBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdlbkZ1bi5fX3Byb3RvX18gPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZTtcbiAgICB9XG4gICAgZ2VuRnVuLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoR3ApO1xuICAgIHJldHVybiBnZW5GdW47XG4gIH07XG5cbiAgLy8gV2l0aGluIHRoZSBib2R5IG9mIGFueSBhc3luYyBmdW5jdGlvbiwgYGF3YWl0IHhgIGlzIHRyYW5zZm9ybWVkIHRvXG4gIC8vIGB5aWVsZCByZWdlbmVyYXRvclJ1bnRpbWUuYXdyYXAoeClgLCBzbyB0aGF0IHRoZSBydW50aW1lIGNhbiB0ZXN0XG4gIC8vIGB2YWx1ZSBpbnN0YW5jZW9mIEF3YWl0QXJndW1lbnRgIHRvIGRldGVybWluZSBpZiB0aGUgeWllbGRlZCB2YWx1ZSBpc1xuICAvLyBtZWFudCB0byBiZSBhd2FpdGVkLiBTb21lIG1heSBjb25zaWRlciB0aGUgbmFtZSBvZiB0aGlzIG1ldGhvZCB0b29cbiAgLy8gY3V0ZXN5LCBidXQgdGhleSBhcmUgY3VybXVkZ2VvbnMuXG4gIHJ1bnRpbWUuYXdyYXAgPSBmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4gbmV3IEF3YWl0QXJndW1lbnQoYXJnKTtcbiAgfTtcblxuICBmdW5jdGlvbiBBd2FpdEFyZ3VtZW50KGFyZykge1xuICAgIHRoaXMuYXJnID0gYXJnO1xuICB9XG5cbiAgZnVuY3Rpb24gQXN5bmNJdGVyYXRvcihnZW5lcmF0b3IpIHtcbiAgICAvLyBUaGlzIGludm9rZSBmdW5jdGlvbiBpcyB3cml0dGVuIGluIGEgc3R5bGUgdGhhdCBhc3N1bWVzIHNvbWVcbiAgICAvLyBjYWxsaW5nIGZ1bmN0aW9uIChvciBQcm9taXNlKSB3aWxsIGhhbmRsZSBleGNlcHRpb25zLlxuICAgIGZ1bmN0aW9uIGludm9rZShtZXRob2QsIGFyZykge1xuICAgICAgdmFyIHJlc3VsdCA9IGdlbmVyYXRvclttZXRob2RdKGFyZyk7XG4gICAgICB2YXIgdmFsdWUgPSByZXN1bHQudmFsdWU7XG4gICAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBBd2FpdEFyZ3VtZW50XG4gICAgICAgID8gUHJvbWlzZS5yZXNvbHZlKHZhbHVlLmFyZykudGhlbihpbnZva2VOZXh0LCBpbnZva2VUaHJvdylcbiAgICAgICAgOiBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4oZnVuY3Rpb24odW53cmFwcGVkKSB7XG4gICAgICAgICAgICAvLyBXaGVuIGEgeWllbGRlZCBQcm9taXNlIGlzIHJlc29sdmVkLCBpdHMgZmluYWwgdmFsdWUgYmVjb21lc1xuICAgICAgICAgICAgLy8gdGhlIC52YWx1ZSBvZiB0aGUgUHJvbWlzZTx7dmFsdWUsZG9uZX0+IHJlc3VsdCBmb3IgdGhlXG4gICAgICAgICAgICAvLyBjdXJyZW50IGl0ZXJhdGlvbi4gSWYgdGhlIFByb21pc2UgaXMgcmVqZWN0ZWQsIGhvd2V2ZXIsIHRoZVxuICAgICAgICAgICAgLy8gcmVzdWx0IGZvciB0aGlzIGl0ZXJhdGlvbiB3aWxsIGJlIHJlamVjdGVkIHdpdGggdGhlIHNhbWVcbiAgICAgICAgICAgIC8vIHJlYXNvbi4gTm90ZSB0aGF0IHJlamVjdGlvbnMgb2YgeWllbGRlZCBQcm9taXNlcyBhcmUgbm90XG4gICAgICAgICAgICAvLyB0aHJvd24gYmFjayBpbnRvIHRoZSBnZW5lcmF0b3IgZnVuY3Rpb24sIGFzIGlzIHRoZSBjYXNlXG4gICAgICAgICAgICAvLyB3aGVuIGFuIGF3YWl0ZWQgUHJvbWlzZSBpcyByZWplY3RlZC4gVGhpcyBkaWZmZXJlbmNlIGluXG4gICAgICAgICAgICAvLyBiZWhhdmlvciBiZXR3ZWVuIHlpZWxkIGFuZCBhd2FpdCBpcyBpbXBvcnRhbnQsIGJlY2F1c2UgaXRcbiAgICAgICAgICAgIC8vIGFsbG93cyB0aGUgY29uc3VtZXIgdG8gZGVjaWRlIHdoYXQgdG8gZG8gd2l0aCB0aGUgeWllbGRlZFxuICAgICAgICAgICAgLy8gcmVqZWN0aW9uIChzd2FsbG93IGl0IGFuZCBjb250aW51ZSwgbWFudWFsbHkgLnRocm93IGl0IGJhY2tcbiAgICAgICAgICAgIC8vIGludG8gdGhlIGdlbmVyYXRvciwgYWJhbmRvbiBpdGVyYXRpb24sIHdoYXRldmVyKS4gV2l0aFxuICAgICAgICAgICAgLy8gYXdhaXQsIGJ5IGNvbnRyYXN0LCB0aGVyZSBpcyBubyBvcHBvcnR1bml0eSB0byBleGFtaW5lIHRoZVxuICAgICAgICAgICAgLy8gcmVqZWN0aW9uIHJlYXNvbiBvdXRzaWRlIHRoZSBnZW5lcmF0b3IgZnVuY3Rpb24sIHNvIHRoZVxuICAgICAgICAgICAgLy8gb25seSBvcHRpb24gaXMgdG8gdGhyb3cgaXQgZnJvbSB0aGUgYXdhaXQgZXhwcmVzc2lvbiwgYW5kXG4gICAgICAgICAgICAvLyBsZXQgdGhlIGdlbmVyYXRvciBmdW5jdGlvbiBoYW5kbGUgdGhlIGV4Y2VwdGlvbi5cbiAgICAgICAgICAgIHJlc3VsdC52YWx1ZSA9IHVud3JhcHBlZDtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBwcm9jZXNzID09PSBcIm9iamVjdFwiICYmIHByb2Nlc3MuZG9tYWluKSB7XG4gICAgICBpbnZva2UgPSBwcm9jZXNzLmRvbWFpbi5iaW5kKGludm9rZSk7XG4gICAgfVxuXG4gICAgdmFyIGludm9rZU5leHQgPSBpbnZva2UuYmluZChnZW5lcmF0b3IsIFwibmV4dFwiKTtcbiAgICB2YXIgaW52b2tlVGhyb3cgPSBpbnZva2UuYmluZChnZW5lcmF0b3IsIFwidGhyb3dcIik7XG4gICAgdmFyIGludm9rZVJldHVybiA9IGludm9rZS5iaW5kKGdlbmVyYXRvciwgXCJyZXR1cm5cIik7XG4gICAgdmFyIHByZXZpb3VzUHJvbWlzZTtcblxuICAgIGZ1bmN0aW9uIGVucXVldWUobWV0aG9kLCBhcmcpIHtcbiAgICAgIGZ1bmN0aW9uIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKCkge1xuICAgICAgICByZXR1cm4gaW52b2tlKG1ldGhvZCwgYXJnKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHByZXZpb3VzUHJvbWlzZSA9XG4gICAgICAgIC8vIElmIGVucXVldWUgaGFzIGJlZW4gY2FsbGVkIGJlZm9yZSwgdGhlbiB3ZSB3YW50IHRvIHdhaXQgdW50aWxcbiAgICAgICAgLy8gYWxsIHByZXZpb3VzIFByb21pc2VzIGhhdmUgYmVlbiByZXNvbHZlZCBiZWZvcmUgY2FsbGluZyBpbnZva2UsXG4gICAgICAgIC8vIHNvIHRoYXQgcmVzdWx0cyBhcmUgYWx3YXlzIGRlbGl2ZXJlZCBpbiB0aGUgY29ycmVjdCBvcmRlci4gSWZcbiAgICAgICAgLy8gZW5xdWV1ZSBoYXMgbm90IGJlZW4gY2FsbGVkIGJlZm9yZSwgdGhlbiBpdCBpcyBpbXBvcnRhbnQgdG9cbiAgICAgICAgLy8gY2FsbCBpbnZva2UgaW1tZWRpYXRlbHksIHdpdGhvdXQgd2FpdGluZyBvbiBhIGNhbGxiYWNrIHRvIGZpcmUsXG4gICAgICAgIC8vIHNvIHRoYXQgdGhlIGFzeW5jIGdlbmVyYXRvciBmdW5jdGlvbiBoYXMgdGhlIG9wcG9ydHVuaXR5IHRvIGRvXG4gICAgICAgIC8vIGFueSBuZWNlc3Nhcnkgc2V0dXAgaW4gYSBwcmVkaWN0YWJsZSB3YXkuIFRoaXMgcHJlZGljdGFiaWxpdHlcbiAgICAgICAgLy8gaXMgd2h5IHRoZSBQcm9taXNlIGNvbnN0cnVjdG9yIHN5bmNocm9ub3VzbHkgaW52b2tlcyBpdHNcbiAgICAgICAgLy8gZXhlY3V0b3IgY2FsbGJhY2ssIGFuZCB3aHkgYXN5bmMgZnVuY3Rpb25zIHN5bmNocm9ub3VzbHlcbiAgICAgICAgLy8gZXhlY3V0ZSBjb2RlIGJlZm9yZSB0aGUgZmlyc3QgYXdhaXQuIFNpbmNlIHdlIGltcGxlbWVudCBzaW1wbGVcbiAgICAgICAgLy8gYXN5bmMgZnVuY3Rpb25zIGluIHRlcm1zIG9mIGFzeW5jIGdlbmVyYXRvcnMsIGl0IGlzIGVzcGVjaWFsbHlcbiAgICAgICAgLy8gaW1wb3J0YW50IHRvIGdldCB0aGlzIHJpZ2h0LCBldmVuIHRob3VnaCBpdCByZXF1aXJlcyBjYXJlLlxuICAgICAgICBwcmV2aW91c1Byb21pc2UgPyBwcmV2aW91c1Byb21pc2UudGhlbihcbiAgICAgICAgICBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZyxcbiAgICAgICAgICAvLyBBdm9pZCBwcm9wYWdhdGluZyBmYWlsdXJlcyB0byBQcm9taXNlcyByZXR1cm5lZCBieSBsYXRlclxuICAgICAgICAgIC8vIGludm9jYXRpb25zIG9mIHRoZSBpdGVyYXRvci5cbiAgICAgICAgICBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZ1xuICAgICAgICApIDogbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgICByZXNvbHZlKGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKCkpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBEZWZpbmUgdGhlIHVuaWZpZWQgaGVscGVyIG1ldGhvZCB0aGF0IGlzIHVzZWQgdG8gaW1wbGVtZW50IC5uZXh0LFxuICAgIC8vIC50aHJvdywgYW5kIC5yZXR1cm4gKHNlZSBkZWZpbmVJdGVyYXRvck1ldGhvZHMpLlxuICAgIHRoaXMuX2ludm9rZSA9IGVucXVldWU7XG4gIH1cblxuICBkZWZpbmVJdGVyYXRvck1ldGhvZHMoQXN5bmNJdGVyYXRvci5wcm90b3R5cGUpO1xuXG4gIC8vIE5vdGUgdGhhdCBzaW1wbGUgYXN5bmMgZnVuY3Rpb25zIGFyZSBpbXBsZW1lbnRlZCBvbiB0b3Agb2ZcbiAgLy8gQXN5bmNJdGVyYXRvciBvYmplY3RzOyB0aGV5IGp1c3QgcmV0dXJuIGEgUHJvbWlzZSBmb3IgdGhlIHZhbHVlIG9mXG4gIC8vIHRoZSBmaW5hbCByZXN1bHQgcHJvZHVjZWQgYnkgdGhlIGl0ZXJhdG9yLlxuICBydW50aW1lLmFzeW5jID0gZnVuY3Rpb24oaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpIHtcbiAgICB2YXIgaXRlciA9IG5ldyBBc3luY0l0ZXJhdG9yKFxuICAgICAgd3JhcChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdClcbiAgICApO1xuXG4gICAgcmV0dXJuIHJ1bnRpbWUuaXNHZW5lcmF0b3JGdW5jdGlvbihvdXRlckZuKVxuICAgICAgPyBpdGVyIC8vIElmIG91dGVyRm4gaXMgYSBnZW5lcmF0b3IsIHJldHVybiB0aGUgZnVsbCBpdGVyYXRvci5cbiAgICAgIDogaXRlci5uZXh0KCkudGhlbihmdW5jdGlvbihyZXN1bHQpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0LmRvbmUgPyByZXN1bHQudmFsdWUgOiBpdGVyLm5leHQoKTtcbiAgICAgICAgfSk7XG4gIH07XG5cbiAgZnVuY3Rpb24gbWFrZUludm9rZU1ldGhvZChpbm5lckZuLCBzZWxmLCBjb250ZXh0KSB7XG4gICAgdmFyIHN0YXRlID0gR2VuU3RhdGVTdXNwZW5kZWRTdGFydDtcblxuICAgIHJldHVybiBmdW5jdGlvbiBpbnZva2UobWV0aG9kLCBhcmcpIHtcbiAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVFeGVjdXRpbmcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgcnVubmluZ1wiKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZUNvbXBsZXRlZCkge1xuICAgICAgICBpZiAobWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICB0aHJvdyBhcmc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCZSBmb3JnaXZpbmcsIHBlciAyNS4zLjMuMy4zIG9mIHRoZSBzcGVjOlxuICAgICAgICAvLyBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtZ2VuZXJhdG9ycmVzdW1lXG4gICAgICAgIHJldHVybiBkb25lUmVzdWx0KCk7XG4gICAgICB9XG5cbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIHZhciBkZWxlZ2F0ZSA9IGNvbnRleHQuZGVsZWdhdGU7XG4gICAgICAgIGlmIChkZWxlZ2F0ZSkge1xuICAgICAgICAgIGlmIChtZXRob2QgPT09IFwicmV0dXJuXCIgfHxcbiAgICAgICAgICAgICAgKG1ldGhvZCA9PT0gXCJ0aHJvd1wiICYmIGRlbGVnYXRlLml0ZXJhdG9yW21ldGhvZF0gPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgIC8vIEEgcmV0dXJuIG9yIHRocm93ICh3aGVuIHRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBoYXMgbm8gdGhyb3dcbiAgICAgICAgICAgIC8vIG1ldGhvZCkgYWx3YXlzIHRlcm1pbmF0ZXMgdGhlIHlpZWxkKiBsb29wLlxuICAgICAgICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG5cbiAgICAgICAgICAgIC8vIElmIHRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBoYXMgYSByZXR1cm4gbWV0aG9kLCBnaXZlIGl0IGFcbiAgICAgICAgICAgIC8vIGNoYW5jZSB0byBjbGVhbiB1cC5cbiAgICAgICAgICAgIHZhciByZXR1cm5NZXRob2QgPSBkZWxlZ2F0ZS5pdGVyYXRvcltcInJldHVyblwiXTtcbiAgICAgICAgICAgIGlmIChyZXR1cm5NZXRob2QpIHtcbiAgICAgICAgICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKHJldHVybk1ldGhvZCwgZGVsZWdhdGUuaXRlcmF0b3IsIGFyZyk7XG4gICAgICAgICAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIHJldHVybiBtZXRob2QgdGhyZXcgYW4gZXhjZXB0aW9uLCBsZXQgdGhhdFxuICAgICAgICAgICAgICAgIC8vIGV4Y2VwdGlvbiBwcmV2YWlsIG92ZXIgdGhlIG9yaWdpbmFsIHJldHVybiBvciB0aHJvdy5cbiAgICAgICAgICAgICAgICBtZXRob2QgPSBcInRocm93XCI7XG4gICAgICAgICAgICAgICAgYXJnID0gcmVjb3JkLmFyZztcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobWV0aG9kID09PSBcInJldHVyblwiKSB7XG4gICAgICAgICAgICAgIC8vIENvbnRpbnVlIHdpdGggdGhlIG91dGVyIHJldHVybiwgbm93IHRoYXQgdGhlIGRlbGVnYXRlXG4gICAgICAgICAgICAgIC8vIGl0ZXJhdG9yIGhhcyBiZWVuIHRlcm1pbmF0ZWQuXG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChcbiAgICAgICAgICAgIGRlbGVnYXRlLml0ZXJhdG9yW21ldGhvZF0sXG4gICAgICAgICAgICBkZWxlZ2F0ZS5pdGVyYXRvcixcbiAgICAgICAgICAgIGFyZ1xuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG5cbiAgICAgICAgICAgIC8vIExpa2UgcmV0dXJuaW5nIGdlbmVyYXRvci50aHJvdyh1bmNhdWdodCksIGJ1dCB3aXRob3V0IHRoZVxuICAgICAgICAgICAgLy8gb3ZlcmhlYWQgb2YgYW4gZXh0cmEgZnVuY3Rpb24gY2FsbC5cbiAgICAgICAgICAgIG1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgICAgICAgIGFyZyA9IHJlY29yZC5hcmc7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBEZWxlZ2F0ZSBnZW5lcmF0b3IgcmFuIGFuZCBoYW5kbGVkIGl0cyBvd24gZXhjZXB0aW9ucyBzb1xuICAgICAgICAgIC8vIHJlZ2FyZGxlc3Mgb2Ygd2hhdCB0aGUgbWV0aG9kIHdhcywgd2UgY29udGludWUgYXMgaWYgaXQgaXNcbiAgICAgICAgICAvLyBcIm5leHRcIiB3aXRoIGFuIHVuZGVmaW5lZCBhcmcuXG4gICAgICAgICAgbWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICAgICAgYXJnID0gdW5kZWZpbmVkO1xuXG4gICAgICAgICAgdmFyIGluZm8gPSByZWNvcmQuYXJnO1xuICAgICAgICAgIGlmIChpbmZvLmRvbmUpIHtcbiAgICAgICAgICAgIGNvbnRleHRbZGVsZWdhdGUucmVzdWx0TmFtZV0gPSBpbmZvLnZhbHVlO1xuICAgICAgICAgICAgY29udGV4dC5uZXh0ID0gZGVsZWdhdGUubmV4dExvYztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3RhdGUgPSBHZW5TdGF0ZVN1c3BlbmRlZFlpZWxkO1xuICAgICAgICAgICAgcmV0dXJuIGluZm87XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWV0aG9kID09PSBcIm5leHRcIikge1xuICAgICAgICAgIGNvbnRleHQuX3NlbnQgPSBhcmc7XG5cbiAgICAgICAgICBpZiAoc3RhdGUgPT09IEdlblN0YXRlU3VzcGVuZGVkWWllbGQpIHtcbiAgICAgICAgICAgIGNvbnRleHQuc2VudCA9IGFyZztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29udGV4dC5zZW50ID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChtZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVTdXNwZW5kZWRTdGFydCkge1xuICAgICAgICAgICAgc3RhdGUgPSBHZW5TdGF0ZUNvbXBsZXRlZDtcbiAgICAgICAgICAgIHRocm93IGFyZztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoY29udGV4dC5kaXNwYXRjaEV4Y2VwdGlvbihhcmcpKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGUgZGlzcGF0Y2hlZCBleGNlcHRpb24gd2FzIGNhdWdodCBieSBhIGNhdGNoIGJsb2NrLFxuICAgICAgICAgICAgLy8gdGhlbiBsZXQgdGhhdCBjYXRjaCBibG9jayBoYW5kbGUgdGhlIGV4Y2VwdGlvbiBub3JtYWxseS5cbiAgICAgICAgICAgIG1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICAgICAgYXJnID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cblxuICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZCA9PT0gXCJyZXR1cm5cIikge1xuICAgICAgICAgIGNvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIGFyZyk7XG4gICAgICAgIH1cblxuICAgICAgICBzdGF0ZSA9IEdlblN0YXRlRXhlY3V0aW5nO1xuXG4gICAgICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChpbm5lckZuLCBzZWxmLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcIm5vcm1hbFwiKSB7XG4gICAgICAgICAgLy8gSWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biBmcm9tIGlubmVyRm4sIHdlIGxlYXZlIHN0YXRlID09PVxuICAgICAgICAgIC8vIEdlblN0YXRlRXhlY3V0aW5nIGFuZCBsb29wIGJhY2sgZm9yIGFub3RoZXIgaW52b2NhdGlvbi5cbiAgICAgICAgICBzdGF0ZSA9IGNvbnRleHQuZG9uZVxuICAgICAgICAgICAgPyBHZW5TdGF0ZUNvbXBsZXRlZFxuICAgICAgICAgICAgOiBHZW5TdGF0ZVN1c3BlbmRlZFlpZWxkO1xuXG4gICAgICAgICAgdmFyIGluZm8gPSB7XG4gICAgICAgICAgICB2YWx1ZTogcmVjb3JkLmFyZyxcbiAgICAgICAgICAgIGRvbmU6IGNvbnRleHQuZG9uZVxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBpZiAocmVjb3JkLmFyZyA9PT0gQ29udGludWVTZW50aW5lbCkge1xuICAgICAgICAgICAgaWYgKGNvbnRleHQuZGVsZWdhdGUgJiYgbWV0aG9kID09PSBcIm5leHRcIikge1xuICAgICAgICAgICAgICAvLyBEZWxpYmVyYXRlbHkgZm9yZ2V0IHRoZSBsYXN0IHNlbnQgdmFsdWUgc28gdGhhdCB3ZSBkb24ndFxuICAgICAgICAgICAgICAvLyBhY2NpZGVudGFsbHkgcGFzcyBpdCBvbiB0byB0aGUgZGVsZWdhdGUuXG4gICAgICAgICAgICAgIGFyZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGluZm87XG4gICAgICAgICAgfVxuXG4gICAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgIHN0YXRlID0gR2VuU3RhdGVDb21wbGV0ZWQ7XG4gICAgICAgICAgLy8gRGlzcGF0Y2ggdGhlIGV4Y2VwdGlvbiBieSBsb29waW5nIGJhY2sgYXJvdW5kIHRvIHRoZVxuICAgICAgICAgIC8vIGNvbnRleHQuZGlzcGF0Y2hFeGNlcHRpb24oYXJnKSBjYWxsIGFib3ZlLlxuICAgICAgICAgIG1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgICAgICBhcmcgPSByZWNvcmQuYXJnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8vIERlZmluZSBHZW5lcmF0b3IucHJvdG90eXBlLntuZXh0LHRocm93LHJldHVybn0gaW4gdGVybXMgb2YgdGhlXG4gIC8vIHVuaWZpZWQgLl9pbnZva2UgaGVscGVyIG1ldGhvZC5cbiAgZGVmaW5lSXRlcmF0b3JNZXRob2RzKEdwKTtcblxuICBHcFtpdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBHcC50b1N0cmluZyA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBcIltvYmplY3QgR2VuZXJhdG9yXVwiO1xuICB9O1xuXG4gIGZ1bmN0aW9uIHB1c2hUcnlFbnRyeShsb2NzKSB7XG4gICAgdmFyIGVudHJ5ID0geyB0cnlMb2M6IGxvY3NbMF0gfTtcblxuICAgIGlmICgxIGluIGxvY3MpIHtcbiAgICAgIGVudHJ5LmNhdGNoTG9jID0gbG9jc1sxXTtcbiAgICB9XG5cbiAgICBpZiAoMiBpbiBsb2NzKSB7XG4gICAgICBlbnRyeS5maW5hbGx5TG9jID0gbG9jc1syXTtcbiAgICAgIGVudHJ5LmFmdGVyTG9jID0gbG9jc1szXTtcbiAgICB9XG5cbiAgICB0aGlzLnRyeUVudHJpZXMucHVzaChlbnRyeSk7XG4gIH1cblxuICBmdW5jdGlvbiByZXNldFRyeUVudHJ5KGVudHJ5KSB7XG4gICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb24gfHwge307XG4gICAgcmVjb3JkLnR5cGUgPSBcIm5vcm1hbFwiO1xuICAgIGRlbGV0ZSByZWNvcmQuYXJnO1xuICAgIGVudHJ5LmNvbXBsZXRpb24gPSByZWNvcmQ7XG4gIH1cblxuICBmdW5jdGlvbiBDb250ZXh0KHRyeUxvY3NMaXN0KSB7XG4gICAgLy8gVGhlIHJvb3QgZW50cnkgb2JqZWN0IChlZmZlY3RpdmVseSBhIHRyeSBzdGF0ZW1lbnQgd2l0aG91dCBhIGNhdGNoXG4gICAgLy8gb3IgYSBmaW5hbGx5IGJsb2NrKSBnaXZlcyB1cyBhIHBsYWNlIHRvIHN0b3JlIHZhbHVlcyB0aHJvd24gZnJvbVxuICAgIC8vIGxvY2F0aW9ucyB3aGVyZSB0aGVyZSBpcyBubyBlbmNsb3NpbmcgdHJ5IHN0YXRlbWVudC5cbiAgICB0aGlzLnRyeUVudHJpZXMgPSBbeyB0cnlMb2M6IFwicm9vdFwiIH1dO1xuICAgIHRyeUxvY3NMaXN0LmZvckVhY2gocHVzaFRyeUVudHJ5LCB0aGlzKTtcbiAgICB0aGlzLnJlc2V0KHRydWUpO1xuICB9XG5cbiAgcnVudGltZS5rZXlzID0gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgdmFyIGtleXMgPSBbXTtcbiAgICBmb3IgKHZhciBrZXkgaW4gb2JqZWN0KSB7XG4gICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICB9XG4gICAga2V5cy5yZXZlcnNlKCk7XG5cbiAgICAvLyBSYXRoZXIgdGhhbiByZXR1cm5pbmcgYW4gb2JqZWN0IHdpdGggYSBuZXh0IG1ldGhvZCwgd2Uga2VlcFxuICAgIC8vIHRoaW5ncyBzaW1wbGUgYW5kIHJldHVybiB0aGUgbmV4dCBmdW5jdGlvbiBpdHNlbGYuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICB3aGlsZSAoa2V5cy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGtleSA9IGtleXMucG9wKCk7XG4gICAgICAgIGlmIChrZXkgaW4gb2JqZWN0KSB7XG4gICAgICAgICAgbmV4dC52YWx1ZSA9IGtleTtcbiAgICAgICAgICBuZXh0LmRvbmUgPSBmYWxzZTtcbiAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUbyBhdm9pZCBjcmVhdGluZyBhbiBhZGRpdGlvbmFsIG9iamVjdCwgd2UganVzdCBoYW5nIHRoZSAudmFsdWVcbiAgICAgIC8vIGFuZCAuZG9uZSBwcm9wZXJ0aWVzIG9mZiB0aGUgbmV4dCBmdW5jdGlvbiBvYmplY3QgaXRzZWxmLiBUaGlzXG4gICAgICAvLyBhbHNvIGVuc3VyZXMgdGhhdCB0aGUgbWluaWZpZXIgd2lsbCBub3QgYW5vbnltaXplIHRoZSBmdW5jdGlvbi5cbiAgICAgIG5leHQuZG9uZSA9IHRydWU7XG4gICAgICByZXR1cm4gbmV4dDtcbiAgICB9O1xuICB9O1xuXG4gIGZ1bmN0aW9uIHZhbHVlcyhpdGVyYWJsZSkge1xuICAgIGlmIChpdGVyYWJsZSkge1xuICAgICAgdmFyIGl0ZXJhdG9yTWV0aG9kID0gaXRlcmFibGVbaXRlcmF0b3JTeW1ib2xdO1xuICAgICAgaWYgKGl0ZXJhdG9yTWV0aG9kKSB7XG4gICAgICAgIHJldHVybiBpdGVyYXRvck1ldGhvZC5jYWxsKGl0ZXJhYmxlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBpdGVyYWJsZS5uZXh0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhYmxlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWlzTmFOKGl0ZXJhYmxlLmxlbmd0aCkpIHtcbiAgICAgICAgdmFyIGkgPSAtMSwgbmV4dCA9IGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICAgICAgd2hpbGUgKCsraSA8IGl0ZXJhYmxlLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKGhhc093bi5jYWxsKGl0ZXJhYmxlLCBpKSkge1xuICAgICAgICAgICAgICBuZXh0LnZhbHVlID0gaXRlcmFibGVbaV07XG4gICAgICAgICAgICAgIG5leHQuZG9uZSA9IGZhbHNlO1xuICAgICAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBuZXh0LnZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICAgIG5leHQuZG9uZSA9IHRydWU7XG5cbiAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gbmV4dC5uZXh0ID0gbmV4dDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gYW4gaXRlcmF0b3Igd2l0aCBubyB2YWx1ZXMuXG4gICAgcmV0dXJuIHsgbmV4dDogZG9uZVJlc3VsdCB9O1xuICB9XG4gIHJ1bnRpbWUudmFsdWVzID0gdmFsdWVzO1xuXG4gIGZ1bmN0aW9uIGRvbmVSZXN1bHQoKSB7XG4gICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICB9XG5cbiAgQ29udGV4dC5wcm90b3R5cGUgPSB7XG4gICAgY29uc3RydWN0b3I6IENvbnRleHQsXG5cbiAgICByZXNldDogZnVuY3Rpb24oc2tpcFRlbXBSZXNldCkge1xuICAgICAgdGhpcy5wcmV2ID0gMDtcbiAgICAgIHRoaXMubmV4dCA9IDA7XG4gICAgICB0aGlzLnNlbnQgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmRvbmUgPSBmYWxzZTtcbiAgICAgIHRoaXMuZGVsZWdhdGUgPSBudWxsO1xuXG4gICAgICB0aGlzLnRyeUVudHJpZXMuZm9yRWFjaChyZXNldFRyeUVudHJ5KTtcblxuICAgICAgaWYgKCFza2lwVGVtcFJlc2V0KSB7XG4gICAgICAgIGZvciAodmFyIG5hbWUgaW4gdGhpcykge1xuICAgICAgICAgIC8vIE5vdCBzdXJlIGFib3V0IHRoZSBvcHRpbWFsIG9yZGVyIG9mIHRoZXNlIGNvbmRpdGlvbnM6XG4gICAgICAgICAgaWYgKG5hbWUuY2hhckF0KDApID09PSBcInRcIiAmJlxuICAgICAgICAgICAgICBoYXNPd24uY2FsbCh0aGlzLCBuYW1lKSAmJlxuICAgICAgICAgICAgICAhaXNOYU4oK25hbWUuc2xpY2UoMSkpKSB7XG4gICAgICAgICAgICB0aGlzW25hbWVdID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBzdG9wOiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMuZG9uZSA9IHRydWU7XG5cbiAgICAgIHZhciByb290RW50cnkgPSB0aGlzLnRyeUVudHJpZXNbMF07XG4gICAgICB2YXIgcm9vdFJlY29yZCA9IHJvb3RFbnRyeS5jb21wbGV0aW9uO1xuICAgICAgaWYgKHJvb3RSZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHRocm93IHJvb3RSZWNvcmQuYXJnO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5ydmFsO1xuICAgIH0sXG5cbiAgICBkaXNwYXRjaEV4Y2VwdGlvbjogZnVuY3Rpb24oZXhjZXB0aW9uKSB7XG4gICAgICBpZiAodGhpcy5kb25lKSB7XG4gICAgICAgIHRocm93IGV4Y2VwdGlvbjtcbiAgICAgIH1cblxuICAgICAgdmFyIGNvbnRleHQgPSB0aGlzO1xuICAgICAgZnVuY3Rpb24gaGFuZGxlKGxvYywgY2F1Z2h0KSB7XG4gICAgICAgIHJlY29yZC50eXBlID0gXCJ0aHJvd1wiO1xuICAgICAgICByZWNvcmQuYXJnID0gZXhjZXB0aW9uO1xuICAgICAgICBjb250ZXh0Lm5leHQgPSBsb2M7XG4gICAgICAgIHJldHVybiAhIWNhdWdodDtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uO1xuXG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPT09IFwicm9vdFwiKSB7XG4gICAgICAgICAgLy8gRXhjZXB0aW9uIHRocm93biBvdXRzaWRlIG9mIGFueSB0cnkgYmxvY2sgdGhhdCBjb3VsZCBoYW5kbGVcbiAgICAgICAgICAvLyBpdCwgc28gc2V0IHRoZSBjb21wbGV0aW9uIHZhbHVlIG9mIHRoZSBlbnRpcmUgZnVuY3Rpb24gdG9cbiAgICAgICAgICAvLyB0aHJvdyB0aGUgZXhjZXB0aW9uLlxuICAgICAgICAgIHJldHVybiBoYW5kbGUoXCJlbmRcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldikge1xuICAgICAgICAgIHZhciBoYXNDYXRjaCA9IGhhc093bi5jYWxsKGVudHJ5LCBcImNhdGNoTG9jXCIpO1xuICAgICAgICAgIHZhciBoYXNGaW5hbGx5ID0gaGFzT3duLmNhbGwoZW50cnksIFwiZmluYWxseUxvY1wiKTtcblxuICAgICAgICAgIGlmIChoYXNDYXRjaCAmJiBoYXNGaW5hbGx5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5jYXRjaExvYywgdHJ1ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSBpZiAoaGFzQ2F0Y2gpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5jYXRjaExvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmNhdGNoTG9jLCB0cnVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSBpZiAoaGFzRmluYWxseSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ0cnkgc3RhdGVtZW50IHdpdGhvdXQgY2F0Y2ggb3IgZmluYWxseVwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYWJydXB0OiBmdW5jdGlvbih0eXBlLCBhcmcpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldiAmJlxuICAgICAgICAgICAgaGFzT3duLmNhbGwoZW50cnksIFwiZmluYWxseUxvY1wiKSAmJlxuICAgICAgICAgICAgdGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAgIHZhciBmaW5hbGx5RW50cnkgPSBlbnRyeTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZmluYWxseUVudHJ5ICYmXG4gICAgICAgICAgKHR5cGUgPT09IFwiYnJlYWtcIiB8fFxuICAgICAgICAgICB0eXBlID09PSBcImNvbnRpbnVlXCIpICYmXG4gICAgICAgICAgZmluYWxseUVudHJ5LnRyeUxvYyA8PSBhcmcgJiZcbiAgICAgICAgICBhcmcgPD0gZmluYWxseUVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgLy8gSWdub3JlIHRoZSBmaW5hbGx5IGVudHJ5IGlmIGNvbnRyb2wgaXMgbm90IGp1bXBpbmcgdG8gYVxuICAgICAgICAvLyBsb2NhdGlvbiBvdXRzaWRlIHRoZSB0cnkvY2F0Y2ggYmxvY2suXG4gICAgICAgIGZpbmFsbHlFbnRyeSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIHZhciByZWNvcmQgPSBmaW5hbGx5RW50cnkgPyBmaW5hbGx5RW50cnkuY29tcGxldGlvbiA6IHt9O1xuICAgICAgcmVjb3JkLnR5cGUgPSB0eXBlO1xuICAgICAgcmVjb3JkLmFyZyA9IGFyZztcblxuICAgICAgaWYgKGZpbmFsbHlFbnRyeSkge1xuICAgICAgICB0aGlzLm5leHQgPSBmaW5hbGx5RW50cnkuZmluYWxseUxvYztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY29tcGxldGUocmVjb3JkKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfSxcblxuICAgIGNvbXBsZXRlOiBmdW5jdGlvbihyZWNvcmQsIGFmdGVyTG9jKSB7XG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICB0aHJvdyByZWNvcmQuYXJnO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwiYnJlYWtcIiB8fFxuICAgICAgICAgIHJlY29yZC50eXBlID09PSBcImNvbnRpbnVlXCIpIHtcbiAgICAgICAgdGhpcy5uZXh0ID0gcmVjb3JkLmFyZztcbiAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgdGhpcy5ydmFsID0gcmVjb3JkLmFyZztcbiAgICAgICAgdGhpcy5uZXh0ID0gXCJlbmRcIjtcbiAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09IFwibm9ybWFsXCIgJiYgYWZ0ZXJMb2MpIHtcbiAgICAgICAgdGhpcy5uZXh0ID0gYWZ0ZXJMb2M7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGZpbmlzaDogZnVuY3Rpb24oZmluYWxseUxvYykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS5maW5hbGx5TG9jID09PSBmaW5hbGx5TG9jKSB7XG4gICAgICAgICAgdGhpcy5jb21wbGV0ZShlbnRyeS5jb21wbGV0aW9uLCBlbnRyeS5hZnRlckxvYyk7XG4gICAgICAgICAgcmVzZXRUcnlFbnRyeShlbnRyeSk7XG4gICAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgXCJjYXRjaFwiOiBmdW5jdGlvbih0cnlMb2MpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkudHJ5TG9jID09PSB0cnlMb2MpIHtcbiAgICAgICAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbjtcbiAgICAgICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgICAgdmFyIHRocm93biA9IHJlY29yZC5hcmc7XG4gICAgICAgICAgICByZXNldFRyeUVudHJ5KGVudHJ5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRocm93bjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUaGUgY29udGV4dC5jYXRjaCBtZXRob2QgbXVzdCBvbmx5IGJlIGNhbGxlZCB3aXRoIGEgbG9jYXRpb25cbiAgICAgIC8vIGFyZ3VtZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gYSBrbm93biBjYXRjaCBibG9jay5cbiAgICAgIHRocm93IG5ldyBFcnJvcihcImlsbGVnYWwgY2F0Y2ggYXR0ZW1wdFwiKTtcbiAgICB9LFxuXG4gICAgZGVsZWdhdGVZaWVsZDogZnVuY3Rpb24oaXRlcmFibGUsIHJlc3VsdE5hbWUsIG5leHRMb2MpIHtcbiAgICAgIHRoaXMuZGVsZWdhdGUgPSB7XG4gICAgICAgIGl0ZXJhdG9yOiB2YWx1ZXMoaXRlcmFibGUpLFxuICAgICAgICByZXN1bHROYW1lOiByZXN1bHROYW1lLFxuICAgICAgICBuZXh0TG9jOiBuZXh0TG9jXG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG4gIH07XG59KShcbiAgLy8gQW1vbmcgdGhlIHZhcmlvdXMgdHJpY2tzIGZvciBvYnRhaW5pbmcgYSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbFxuICAvLyBvYmplY3QsIHRoaXMgc2VlbXMgdG8gYmUgdGhlIG1vc3QgcmVsaWFibGUgdGVjaG5pcXVlIHRoYXQgZG9lcyBub3RcbiAgLy8gdXNlIGluZGlyZWN0IGV2YWwgKHdoaWNoIHZpb2xhdGVzIENvbnRlbnQgU2VjdXJpdHkgUG9saWN5KS5cbiAgdHlwZW9mIGdsb2JhbCA9PT0gXCJvYmplY3RcIiA/IGdsb2JhbCA6XG4gIHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIgPyB3aW5kb3cgOlxuICB0eXBlb2Ygc2VsZiA9PT0gXCJvYmplY3RcIiA/IHNlbGYgOiB0aGlzXG4pO1xuXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9iYWJlbC1yZWdlbmVyYXRvci1ydW50aW1lL3J1bnRpbWUuanNcbiAqKiBtb2R1bGUgaWQgPSAyODZcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIHNoaW0gZm9yIHVzaW5nIHByb2Nlc3MgaW4gYnJvd3NlclxuXG52YXIgcHJvY2VzcyA9IG1vZHVsZS5leHBvcnRzID0ge307XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgIH1cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIGRyYWluUXVldWUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVvdXQgPSBzZXRUaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG59XG5cbnByb2Nlc3MubmV4dFRpY2sgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcbiAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuICAgICAgICBzZXRUaW1lb3V0KGRyYWluUXVldWUsIDApO1xuICAgIH1cbn07XG5cbi8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcbmZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuICAgIHRoaXMuZnVuID0gZnVuO1xuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcbn07XG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcbnByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xucHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxucHJvY2Vzcy5vbiA9IG5vb3A7XG5wcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3Mub25jZSA9IG5vb3A7XG5wcm9jZXNzLm9mZiA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbnByb2Nlc3MuZW1pdCA9IG5vb3A7XG5cbnByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcblxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5wcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAod2VicGFjaykvfi9ub2RlLWxpYnMtYnJvd3Nlci9+L3Byb2Nlc3MvYnJvd3Nlci5qc1xuICoqIG1vZHVsZSBpZCA9IDI4N1xuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9jb3JlLnJlZ2V4cC5lc2NhcGUnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9fY29yZScpLlJlZ0V4cC5lc2NhcGU7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL2ZuL3JlZ2V4cC9lc2NhcGUuanNcbiAqKiBtb2R1bGUgaWQgPSAyODhcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9iZW5qYW1pbmdyL1JleEV4cC5lc2NhcGVcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCAkcmUgICAgID0gcmVxdWlyZSgnLi9fcmVwbGFjZXInKSgvW1xcXFxeJCorPy4oKXxbXFxde31dL2csICdcXFxcJCYnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdSZWdFeHAnLCB7ZXNjYXBlOiBmdW5jdGlvbiBlc2NhcGUoaXQpeyByZXR1cm4gJHJlKGl0KTsgfX0pO1xuXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvY29yZS5yZWdleHAuZXNjYXBlLmpzXG4gKiogbW9kdWxlIGlkID0gMjg5XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKHJlZ0V4cCwgcmVwbGFjZSl7XG4gIHZhciByZXBsYWNlciA9IHJlcGxhY2UgPT09IE9iamVjdChyZXBsYWNlKSA/IGZ1bmN0aW9uKHBhcnQpe1xuICAgIHJldHVybiByZXBsYWNlW3BhcnRdO1xuICB9IDogcmVwbGFjZTtcbiAgcmV0dXJuIGZ1bmN0aW9uKGl0KXtcbiAgICByZXR1cm4gU3RyaW5nKGl0KS5yZXBsYWNlKHJlZ0V4cCwgcmVwbGFjZXIpO1xuICB9O1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fcmVwbGFjZXIuanNcbiAqKiBtb2R1bGUgaWQgPSAyOTBcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cclxuXHJcbmV4cG9ydCBjb25zdCBMb2cgPSByZXF1aXJlKCcuL3NyYy9Mb2cnKTtcclxuZXhwb3J0IGNvbnN0IE9pZGNDbGllbnQgPSByZXF1aXJlKCcuL3NyYy9PaWRjQ2xpZW50Jyk7XHJcbmV4cG9ydCBjb25zdCBXZWJTdG9yYWdlU3RhdGVTdG9yZSA9IHJlcXVpcmUoJy4vc3JjL1dlYlN0b3JhZ2VTdGF0ZVN0b3JlJyk7XHJcbmV4cG9ydCBjb25zdCBJbk1lbW9yeVdlYlN0b3JhZ2UgPSByZXF1aXJlKCcuL3NyYy9Jbk1lbW9yeVdlYlN0b3JhZ2UnKTtcclxuZXhwb3J0IGNvbnN0IFVzZXJNYW5hZ2VyID0gcmVxdWlyZSgnLi9zcmMvVXNlck1hbmFnZXInKTtcclxuZXhwb3J0IGNvbnN0IEFjY2Vzc1Rva2VuRXZlbnRzID0gcmVxdWlyZSgnLi9zcmMvQWNjZXNzVG9rZW5FdmVudHMnKTtcclxuZXhwb3J0IGNvbnN0IE1ldGFkYXRhU2VydmljZSA9IHJlcXVpcmUoJy4vc3JjL01ldGFkYXRhU2VydmljZScpO1xyXG5leHBvcnQgY29uc3QgQ29yZG92YVBvcHVwTmF2aWdhdG9yID0gcmVxdWlyZSgnLi9zcmMvQ29yZG92YVBvcHVwTmF2aWdhdG9yJyk7XHJcbmV4cG9ydCBjb25zdCBDb3Jkb3ZhSUZyYW1lTmF2aWdhdG9yID0gcmVxdWlyZSgnLi9zcmMvQ29yZG92YUlGcmFtZU5hdmlnYXRvcicpO1xyXG5leHBvcnQgY29uc3QgQ2hlY2tTZXNzaW9uSUZyYW1lID0gcmVxdWlyZSgnLi9zcmMvQ2hlY2tTZXNzaW9uSUZyYW1lJyk7XHJcblxyXG5leHBvcnQgZGVmYXVsdCB7XHJcbiAgICBMb2csXHJcbiAgICBPaWRjQ2xpZW50LFxyXG4gICAgV2ViU3RvcmFnZVN0YXRlU3RvcmUsXHJcbiAgICBJbk1lbW9yeVdlYlN0b3JhZ2UsXHJcbiAgICBVc2VyTWFuYWdlcixcclxuICAgIEFjY2Vzc1Rva2VuRXZlbnRzLFxyXG4gICAgTWV0YWRhdGFTZXJ2aWNlLFxyXG4gICAgQ29yZG92YVBvcHVwTmF2aWdhdG9yLFxyXG4gICAgQ29yZG92YUlGcmFtZU5hdmlnYXRvcixcclxuICAgIENoZWNrU2Vzc2lvbklGcmFtZVxyXG59O1xyXG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL2luZGV4LmpzXG4gKiovIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5cclxubGV0IG5vcExvZ2dlciA9IHtcclxuICAgIGluZm8oKXt9LFxyXG4gICAgd2Fybigpe30sXHJcbiAgICBlcnJvcigpe31cclxufTtcclxuXHJcbmNvbnN0IE5PTkUgPSAwO1xyXG5jb25zdCBFUlJPUiA9IDE7XHJcbmNvbnN0IFdBUk4gPSAyO1xyXG5jb25zdCBJTkZPID0gMztcclxuXHJcbmxldCBsb2dnZXI7XHJcbmxldCBsZXZlbDtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExvZyB7XHJcbiAgICBzdGF0aWMgZ2V0IE5PTkUoKSB7cmV0dXJuIE5PTkV9O1xyXG4gICAgc3RhdGljIGdldCBFUlJPUigpIHtyZXR1cm4gRVJST1J9O1xyXG4gICAgc3RhdGljIGdldCBXQVJOKCkge3JldHVybiBXQVJOfTtcclxuICAgIHN0YXRpYyBnZXQgSU5GTygpIHtyZXR1cm4gSU5GT307XHJcbiAgICBcclxuICAgIHN0YXRpYyByZXNldCgpe1xyXG4gICAgICAgIGxldmVsID0gSU5GTztcclxuICAgICAgICBsb2dnZXIgPSBub3BMb2dnZXI7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHN0YXRpYyBnZXQgbGV2ZWwoKXtcclxuICAgICAgICByZXR1cm4gbGV2ZWw7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgc2V0IGxldmVsKHZhbHVlKXtcclxuICAgICAgICBpZiAoTk9ORSA8PSB2YWx1ZSAmJiB2YWx1ZSA8PSBJTkZPKXtcclxuICAgICAgICAgICAgbGV2ZWwgPSB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgbG9nIGxldmVsXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIFxyXG4gICAgc3RhdGljIGdldCBsb2dnZXIoKXtcclxuICAgICAgICByZXR1cm4gbG9nZ2VyO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIHNldCBsb2dnZXIodmFsdWUpe1xyXG4gICAgICAgIGlmICh2YWx1ZS5pbmZvICYmIHZhbHVlLndhcm4gJiYgdmFsdWUuZXJyb3Ipe1xyXG4gICAgICAgICAgICBsb2dnZXIgPSB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgbG9nZ2VyXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIFxyXG4gICAgc3RhdGljIGluZm8oLi4uYXJncyl7XHJcbiAgICAgICAgaWYgKGxldmVsID49IElORk8pe1xyXG4gICAgICAgICAgICBsb2dnZXIuaW5mby5hcHBseShsb2dnZXIsIEFycmF5LmZyb20oYXJncykpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHN0YXRpYyB3YXJuKC4uLmFyZ3Mpe1xyXG4gICAgICAgIGlmIChsZXZlbCA+PSBXQVJOKXtcclxuICAgICAgICAgICAgbG9nZ2VyLndhcm4uYXBwbHkobG9nZ2VyLCBBcnJheS5mcm9tKGFyZ3MpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgZXJyb3IoLi4uYXJncyl7XHJcbiAgICAgICAgaWYgKGxldmVsID49IEVSUk9SKXtcclxuICAgICAgICAgICAgbG9nZ2VyLmVycm9yLmFwcGx5KGxvZ2dlciwgQXJyYXkuZnJvbShhcmdzKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG5Mb2cucmVzZXQoKTtcblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9Mb2cuanNcbiAqKi8iLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcblxyXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcclxuaW1wb3J0IE9pZGNDbGllbnRTZXR0aW5ncyBmcm9tICcuL09pZGNDbGllbnRTZXR0aW5ncyc7XHJcbmltcG9ydCBFcnJvclJlc3BvbnNlIGZyb20gJy4vRXJyb3JSZXNwb25zZSc7XHJcbmltcG9ydCBTaWduaW5SZXF1ZXN0IGZyb20gJy4vU2lnbmluUmVxdWVzdCc7XHJcbmltcG9ydCBTaWduaW5SZXNwb25zZSBmcm9tICcuL1NpZ25pblJlc3BvbnNlJztcclxuaW1wb3J0IFNpZ25vdXRSZXF1ZXN0IGZyb20gJy4vU2lnbm91dFJlcXVlc3QnO1xyXG5pbXBvcnQgU2lnbm91dFJlc3BvbnNlIGZyb20gJy4vU2lnbm91dFJlc3BvbnNlJztcclxuaW1wb3J0IFNpZ25pblN0YXRlIGZyb20gJy4vU2lnbmluU3RhdGUnO1xyXG5pbXBvcnQgU3RhdGUgZnJvbSAnLi9TdGF0ZSc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBPaWRjQ2xpZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHNldHRpbmdzID0ge30pIHtcclxuICAgICAgICBpZiAoc2V0dGluZ3MgaW5zdGFuY2VvZiBPaWRjQ2xpZW50U2V0dGluZ3MpIHtcclxuICAgICAgICAgICAgdGhpcy5fc2V0dGluZ3MgPSBzZXR0aW5ncztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3NldHRpbmdzID0gbmV3IE9pZGNDbGllbnRTZXR0aW5ncyhzZXR0aW5ncyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBfc3RhdGVTdG9yZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zZXR0aW5ncy5zdGF0ZVN0b3JlO1xyXG4gICAgfVxyXG4gICAgZ2V0IF92YWxpZGF0b3IoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MudmFsaWRhdG9yO1xyXG4gICAgfVxyXG4gICAgZ2V0IF9tZXRhZGF0YVNlcnZpY2UoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MubWV0YWRhdGFTZXJ2aWNlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBzZXR0aW5ncygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc2V0dGluZ3M7XHJcbiAgICB9XHJcbiAgICBnZXQgbWV0YWRhdGFTZXJ2aWNlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9tZXRhZGF0YVNlcnZpY2U7XHJcbiAgICB9XHJcblxyXG4gICAgY3JlYXRlU2lnbmluUmVxdWVzdCh7XHJcbiAgICAgICAgcmVzcG9uc2VfdHlwZSwgc2NvcGUsIHJlZGlyZWN0X3VyaSwgZGF0YSxcclxuICAgICAgICBwcm9tcHQsIGRpc3BsYXksIG1heF9hZ2UsIHVpX2xvY2FsZXMsIGlkX3Rva2VuX2hpbnQsIGxvZ2luX2hpbnQsIGFjcl92YWx1ZXN9ID0ge30sXHJcbiAgICAgICAgc3RhdGVTdG9yZVxyXG4gICAgKSB7XHJcbiAgICAgICAgTG9nLmluZm8oXCJPaWRjQ2xpZW50LmNyZWF0ZVNpZ25pblJlcXVlc3RcIik7XHJcblxyXG4gICAgICAgIGxldCBjbGllbnRfaWQgPSB0aGlzLl9zZXR0aW5ncy5jbGllbnRfaWQ7XHJcbiAgICAgICAgcmVzcG9uc2VfdHlwZSA9IHJlc3BvbnNlX3R5cGUgfHwgdGhpcy5fc2V0dGluZ3MucmVzcG9uc2VfdHlwZTtcclxuICAgICAgICBzY29wZSA9IHNjb3BlIHx8IHRoaXMuX3NldHRpbmdzLnNjb3BlO1xyXG4gICAgICAgIHJlZGlyZWN0X3VyaSA9IHJlZGlyZWN0X3VyaSB8fCB0aGlzLl9zZXR0aW5ncy5yZWRpcmVjdF91cmk7XHJcblxyXG4gICAgICAgIC8vIGlkX3Rva2VuX2hpbnQsIGxvZ2luX2hpbnQgYXJlbid0IGFsbG93ZWQgb24gX3NldHRpbmdzXHJcbiAgICAgICAgcHJvbXB0ID0gcHJvbXB0IHx8IHRoaXMuX3NldHRpbmdzLnByb21wdDtcclxuICAgICAgICBkaXNwbGF5ID0gZGlzcGxheSB8fCB0aGlzLl9zZXR0aW5ncy5kaXNwbGF5O1xyXG4gICAgICAgIG1heF9hZ2UgPSBtYXhfYWdlIHx8IHRoaXMuX3NldHRpbmdzLm1heF9hZ2U7XHJcbiAgICAgICAgdWlfbG9jYWxlcyA9IHVpX2xvY2FsZXMgfHwgdGhpcy5fc2V0dGluZ3MudWlfbG9jYWxlcztcclxuICAgICAgICBhY3JfdmFsdWVzID0gYWNyX3ZhbHVlcyB8fCB0aGlzLl9zZXR0aW5ncy5hY3JfdmFsdWVzO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGxldCBhdXRob3JpdHkgPSB0aGlzLl9zZXR0aW5ncy5hdXRob3JpdHk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLl9tZXRhZGF0YVNlcnZpY2UuZ2V0QXV0aG9yaXphdGlvbkVuZHBvaW50KCkudGhlbih1cmwgPT4ge1xyXG4gICAgICAgICAgICBMb2cuaW5mbyhcIlJlY2VpdmVkIGF1dGhvcml6YXRpb24gZW5kcG9pbnRcIiwgdXJsKTtcclxuXHJcbiAgICAgICAgICAgIGxldCByZXF1ZXN0ID0gbmV3IFNpZ25pblJlcXVlc3Qoe1xyXG4gICAgICAgICAgICAgICAgdXJsLFxyXG4gICAgICAgICAgICAgICAgY2xpZW50X2lkLFxyXG4gICAgICAgICAgICAgICAgcmVkaXJlY3RfdXJpLFxyXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VfdHlwZSxcclxuICAgICAgICAgICAgICAgIHNjb3BlLFxyXG4gICAgICAgICAgICAgICAgZGF0YSxcclxuICAgICAgICAgICAgICAgIGF1dGhvcml0eSxcclxuICAgICAgICAgICAgICAgIHByb21wdCwgZGlzcGxheSwgbWF4X2FnZSwgdWlfbG9jYWxlcywgaWRfdG9rZW5faGludCwgbG9naW5faGludCwgYWNyX3ZhbHVlc1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHZhciBzdGF0ZSA9IHJlcXVlc3Quc3RhdGU7XHJcbiAgICAgICAgICAgIHN0YXRlU3RvcmUgPSBzdGF0ZVN0b3JlIHx8IHRoaXMuX3N0YXRlU3RvcmU7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gc3RhdGVTdG9yZS5zZXQoc3RhdGUuaWQsIHN0YXRlLnRvU3RvcmFnZVN0cmluZygpKS50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXF1ZXN0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcm9jZXNzU2lnbmluUmVzcG9uc2UodXJsLCBzdGF0ZVN0b3JlKSB7XHJcbiAgICAgICAgTG9nLmluZm8oXCJPaWRjQ2xpZW50LnByb2Nlc3NTaWduaW5SZXNwb25zZVwiKTtcclxuXHJcbiAgICAgICAgdmFyIHJlc3BvbnNlID0gbmV3IFNpZ25pblJlc3BvbnNlKHVybCk7XHJcblxyXG4gICAgICAgIGlmICghcmVzcG9uc2Uuc3RhdGUpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gc3RhdGUgaW4gcmVzcG9uc2VcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJObyBzdGF0ZSBpbiByZXNwb25zZVwiKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzdGF0ZVN0b3JlID0gc3RhdGVTdG9yZSB8fCB0aGlzLl9zdGF0ZVN0b3JlO1xyXG5cclxuICAgICAgICByZXR1cm4gc3RhdGVTdG9yZS5yZW1vdmUocmVzcG9uc2Uuc3RhdGUpLnRoZW4oc3RvcmVkU3RhdGVTdHJpbmcgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIXN0b3JlZFN0YXRlU3RyaW5nKSB7XHJcbiAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJObyBtYXRjaGluZyBzdGF0ZSBmb3VuZCBpbiBzdG9yYWdlXCIpO1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gbWF0Y2hpbmcgc3RhdGUgZm91bmQgaW4gc3RvcmFnZVwiKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IHN0YXRlID0gU2lnbmluU3RhdGUuZnJvbVN0b3JhZ2VTdHJpbmcoc3RvcmVkU3RhdGVTdHJpbmcpO1xyXG5cclxuICAgICAgICAgICAgTG9nLmluZm8oXCJSZWNlaXZlZCBzdGF0ZSBmcm9tIHN0b3JhZ2U7IHZhbGlkYXRpbmcgcmVzcG9uc2VcIik7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl92YWxpZGF0b3IudmFsaWRhdGVTaWduaW5SZXNwb25zZShzdGF0ZSwgcmVzcG9uc2UpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNyZWF0ZVNpZ25vdXRSZXF1ZXN0KHtpZF90b2tlbl9oaW50LCBkYXRhLCBwb3N0X2xvZ291dF9yZWRpcmVjdF91cml9ID0ge30sXHJcbiAgICAgICAgc3RhdGVTdG9yZVxyXG4gICAgKSB7XHJcbiAgICAgICAgTG9nLmluZm8oXCJPaWRjQ2xpZW50LmNyZWF0ZVNpZ25vdXRSZXF1ZXN0XCIpO1xyXG5cclxuICAgICAgICBwb3N0X2xvZ291dF9yZWRpcmVjdF91cmkgPSBwb3N0X2xvZ291dF9yZWRpcmVjdF91cmkgfHwgdGhpcy5fc2V0dGluZ3MucG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5fbWV0YWRhdGFTZXJ2aWNlLmdldEVuZFNlc3Npb25FbmRwb2ludCgpLnRoZW4odXJsID0+IHtcclxuICAgICAgICAgICAgaWYgKCF1cmwpIHtcclxuICAgICAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIGVuZCBzZXNzaW9uIGVuZHBvaW50IHVybCByZXR1cm5lZFwiKTtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIm5vIGVuZCBzZXNzaW9uIGVuZHBvaW50XCIpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBMb2cuaW5mbyhcIlJlY2VpdmVkIGVuZCBzZXNzaW9uIGVuZHBvaW50XCIsIHVybCk7XHJcblxyXG4gICAgICAgICAgICBsZXQgcmVxdWVzdCA9IG5ldyBTaWdub3V0UmVxdWVzdCh7XHJcbiAgICAgICAgICAgICAgICB1cmwsXHJcbiAgICAgICAgICAgICAgICBpZF90b2tlbl9oaW50LFxyXG4gICAgICAgICAgICAgICAgcG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpLFxyXG4gICAgICAgICAgICAgICAgZGF0YVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHZhciBzdGF0ZSA9IHJlcXVlc3Quc3RhdGU7XHJcbiAgICAgICAgICAgIGlmIChzdGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgTG9nLmluZm8oXCJTaWdub3V0IHJlcXVlc3QgaGFzIHN0YXRlIHRvIHBlcnNpc3RcIik7XHJcblxyXG4gICAgICAgICAgICAgICAgc3RhdGVTdG9yZSA9IHN0YXRlU3RvcmUgfHwgdGhpcy5fc3RhdGVTdG9yZTtcclxuICAgICAgICAgICAgICAgIHN0YXRlU3RvcmUuc2V0KHN0YXRlLmlkLCBzdGF0ZS50b1N0b3JhZ2VTdHJpbmcoKSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiByZXF1ZXN0O1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByb2Nlc3NTaWdub3V0UmVzcG9uc2UodXJsLCBzdGF0ZVN0b3JlKSB7XHJcbiAgICAgICAgTG9nLmluZm8oXCJPaWRjQ2xpZW50LnByb2Nlc3NTaWdub3V0UmVzcG9uc2VcIik7XHJcblxyXG4gICAgICAgIHZhciByZXNwb25zZSA9IG5ldyBTaWdub3V0UmVzcG9uc2UodXJsKTtcclxuICAgICAgICBpZiAoIXJlc3BvbnNlLnN0YXRlKSB7XHJcbiAgICAgICAgICAgIExvZy5pbmZvKFwiTm8gc3RhdGUgaW4gcmVzcG9uc2VcIik7XHJcblxyXG4gICAgICAgICAgICBpZiAocmVzcG9uc2UuZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgIExvZy53YXJuKFwiUmVzcG9uc2Ugd2FzIGVycm9yXCIsIHJlc3BvbnNlLmVycm9yKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3JSZXNwb25zZShyZXNwb25zZSkpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3BvbnNlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBzdGF0ZUtleSA9IHJlc3BvbnNlLnN0YXRlO1xyXG5cclxuICAgICAgICBzdGF0ZVN0b3JlID0gc3RhdGVTdG9yZSB8fCB0aGlzLl9zdGF0ZVN0b3JlO1xyXG5cclxuICAgICAgICByZXR1cm4gc3RhdGVTdG9yZS5yZW1vdmUoc3RhdGVLZXkpLnRoZW4oc3RvcmVkU3RhdGVTdHJpbmcgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIXN0b3JlZFN0YXRlU3RyaW5nKSB7XHJcbiAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJObyBtYXRjaGluZyBzdGF0ZSBmb3VuZCBpbiBzdG9yYWdlXCIpO1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gbWF0Y2hpbmcgc3RhdGUgZm91bmQgaW4gc3RvcmFnZVwiKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IHN0YXRlID0gU3RhdGUuZnJvbVN0b3JhZ2VTdHJpbmcoc3RvcmVkU3RhdGVTdHJpbmcpO1xyXG5cclxuICAgICAgICAgICAgTG9nLmluZm8oXCJSZWNlaXZlZCBzdGF0ZSBmcm9tIHN0b3JhZ2U7IHZhbGlkYXRpbmcgcmVzcG9uc2VcIik7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl92YWxpZGF0b3IudmFsaWRhdGVTaWdub3V0UmVzcG9uc2Uoc3RhdGUsIHJlc3BvbnNlKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBjbGVhclN0YWxlU3RhdGUoc3RhdGVTdG9yZSkge1xyXG4gICAgICAgIExvZy5pbmZvKFwiT2lkY0NsaWVudC5jbGVhclN0YWxlU3RhdGVcIik7XHJcblxyXG4gICAgICAgIHN0YXRlU3RvcmUgPSBzdGF0ZVN0b3JlIHx8IHRoaXMuX3N0YXRlU3RvcmU7XHJcblxyXG4gICAgICAgIHJldHVybiBTdGF0ZS5jbGVhclN0YWxlU3RhdGUoc3RhdGVTdG9yZSwgdGhpcy5zZXR0aW5ncy5zdGFsZVN0YXRlQWdlKTtcclxuICAgIH1cclxufVxyXG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9PaWRjQ2xpZW50LmpzXG4gKiovIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5cclxuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XHJcbmltcG9ydCBXZWJTdG9yYWdlU3RhdGVTdG9yZSBmcm9tICcuL1dlYlN0b3JhZ2VTdGF0ZVN0b3JlJztcclxuaW1wb3J0IFJlc3BvbnNlVmFsaWRhdG9yIGZyb20gJy4vUmVzcG9uc2VWYWxpZGF0b3InO1xyXG5pbXBvcnQgTWV0YWRhdGFTZXJ2aWNlIGZyb20gJy4vTWV0YWRhdGFTZXJ2aWNlJztcclxuXHJcbmNvbnN0IE9pZGNNZXRhZGF0YVVybFBhdGggPSAnLndlbGwta25vd24vb3BlbmlkLWNvbmZpZ3VyYXRpb24nO1xyXG5cclxuY29uc3QgRGVmYXVsdFJlc3BvbnNlVHlwZSA9IFwiaWRfdG9rZW5cIjtcclxuY29uc3QgRGVmYXVsdFNjb3BlID0gXCJvcGVuaWRcIjtcclxuY29uc3QgRGVmYXVsdFN0YWxlU3RhdGVBZ2UgPSA2MDsgLy8gc2Vjb25kc1xyXG5jb25zdCBEZWZhdWx0Q2xvY2tTa2V3SW5TZWNvbmRzID0gNjAgKiA1O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgT2lkY0NsaWVudFNldHRpbmdzIHtcclxuICAgIGNvbnN0cnVjdG9yKHtcclxuICAgICAgICAvLyBtZXRhZGF0YSByZWxhdGVkXHJcbiAgICAgICAgYXV0aG9yaXR5LCBtZXRhZGF0YVVybCwgbWV0YWRhdGEsIHNpZ25pbmdLZXlzLFxyXG4gICAgICAgIC8vIGNsaWVudCByZWxhdGVkXHJcbiAgICAgICAgY2xpZW50X2lkLCByZXNwb25zZV90eXBlID0gRGVmYXVsdFJlc3BvbnNlVHlwZSwgc2NvcGUgPSBEZWZhdWx0U2NvcGUsXHJcbiAgICAgICAgcmVkaXJlY3RfdXJpLCBwb3N0X2xvZ291dF9yZWRpcmVjdF91cmksXHJcbiAgICAgICAgLy8gb3B0aW9uYWwgcHJvdG9jb2xcclxuICAgICAgICBwcm9tcHQsIGRpc3BsYXksIG1heF9hZ2UsIHVpX2xvY2FsZXMsIGFjcl92YWx1ZXMsXHJcbiAgICAgICAgLy8gYmVoYXZpb3IgZmxhZ3NcclxuICAgICAgICBmaWx0ZXJQcm90b2NvbENsYWltcyA9IHRydWUsIGxvYWRVc2VySW5mbyA9IHRydWUsXHJcbiAgICAgICAgc3RhbGVTdGF0ZUFnZSA9IERlZmF1bHRTdGFsZVN0YXRlQWdlLCBjbG9ja1NrZXcgPSBEZWZhdWx0Q2xvY2tTa2V3SW5TZWNvbmRzLFxyXG4gICAgICAgIC8vIG90aGVyIGJlaGF2aW9yXHJcbiAgICAgICAgc3RhdGVTdG9yZSA9IG5ldyBXZWJTdG9yYWdlU3RhdGVTdG9yZSgpLFxyXG4gICAgICAgIFJlc3BvbnNlVmFsaWRhdG9yQ3RvciA9IFJlc3BvbnNlVmFsaWRhdG9yLFxyXG4gICAgICAgIE1ldGFkYXRhU2VydmljZUN0b3IgPSBNZXRhZGF0YVNlcnZpY2VcclxuICAgIH0gPSB7fSkge1xyXG5cclxuICAgICAgICB0aGlzLl9hdXRob3JpdHkgPSBhdXRob3JpdHk7XHJcbiAgICAgICAgdGhpcy5fbWV0YWRhdGFVcmwgPSBtZXRhZGF0YVVybDtcclxuICAgICAgICB0aGlzLl9tZXRhZGF0YSA9IG1ldGFkYXRhO1xyXG4gICAgICAgIHRoaXMuX3NpZ25pbmdLZXlzID0gc2lnbmluZ0tleXM7XHJcblxyXG4gICAgICAgIHRoaXMuX2NsaWVudF9pZCA9IGNsaWVudF9pZDtcclxuICAgICAgICB0aGlzLl9yZXNwb25zZV90eXBlID0gcmVzcG9uc2VfdHlwZTtcclxuICAgICAgICB0aGlzLl9zY29wZSA9IHNjb3BlO1xyXG4gICAgICAgIHRoaXMuX3JlZGlyZWN0X3VyaSA9IHJlZGlyZWN0X3VyaTtcclxuICAgICAgICB0aGlzLl9wb3N0X2xvZ291dF9yZWRpcmVjdF91cmkgPSBwb3N0X2xvZ291dF9yZWRpcmVjdF91cmk7XHJcblxyXG4gICAgICAgIHRoaXMuX3Byb21wdCA9IHByb21wdDtcclxuICAgICAgICB0aGlzLl9kaXNwbGF5ID0gZGlzcGxheTtcclxuICAgICAgICB0aGlzLl9tYXhfYWdlID0gbWF4X2FnZTtcclxuICAgICAgICB0aGlzLl91aV9sb2NhbGVzID0gdWlfbG9jYWxlcztcclxuICAgICAgICB0aGlzLl9hY3JfdmFsdWVzID0gYWNyX3ZhbHVlcztcclxuXHJcbiAgICAgICAgdGhpcy5fZmlsdGVyUHJvdG9jb2xDbGFpbXMgPSAhIWZpbHRlclByb3RvY29sQ2xhaW1zO1xyXG4gICAgICAgIHRoaXMuX2xvYWRVc2VySW5mbyA9ICEhbG9hZFVzZXJJbmZvO1xyXG4gICAgICAgIHRoaXMuX3N0YWxlU3RhdGVBZ2UgPSBzdGFsZVN0YXRlQWdlO1xyXG4gICAgICAgIHRoaXMuX2Nsb2NrU2tldyA9IGNsb2NrU2tldztcclxuXHJcbiAgICAgICAgdGhpcy5fc3RhdGVTdG9yZSA9IHN0YXRlU3RvcmU7XHJcbiAgICAgICAgdGhpcy5fdmFsaWRhdG9yID0gbmV3IFJlc3BvbnNlVmFsaWRhdG9yQ3Rvcih0aGlzKTtcclxuICAgICAgICB0aGlzLl9tZXRhZGF0YVNlcnZpY2UgPSBuZXcgTWV0YWRhdGFTZXJ2aWNlQ3Rvcih0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBjbGllbnQgY29uZmlnXHJcbiAgICBnZXQgY2xpZW50X2lkKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9jbGllbnRfaWQ7XHJcbiAgICB9XHJcbiAgICBzZXQgY2xpZW50X2lkKHZhbHVlKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9jbGllbnRfaWQpIHtcclxuICAgICAgICAgICAgLy8gb25lLXRpbWUgc2V0IG9ubHlcclxuICAgICAgICAgICAgdGhpcy5fY2xpZW50X2lkID0gdmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJjbGllbnRfaWQgaGFzIGFscmVhZHkgYmVlbiBhc3NpZ25lZC5cIilcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiY2xpZW50X2lkIGhhcyBhbHJlYWR5IGJlZW4gYXNzaWduZWQuXCIpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZ2V0IHJlc3BvbnNlX3R5cGUoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jlc3BvbnNlX3R5cGU7XHJcbiAgICB9XHJcbiAgICBnZXQgc2NvcGUoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Njb3BlO1xyXG4gICAgfVxyXG4gICAgZ2V0IHJlZGlyZWN0X3VyaSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcmVkaXJlY3RfdXJpO1xyXG4gICAgfVxyXG4gICAgZ2V0IHBvc3RfbG9nb3V0X3JlZGlyZWN0X3VyaSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLyBvcHRpb25hbCBwcm90b2NvbCBwYXJhbXNcclxuICAgIGdldCBwcm9tcHQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Byb21wdDtcclxuICAgIH1cclxuICAgIGdldCBkaXNwbGF5KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kaXNwbGF5O1xyXG4gICAgfVxyXG4gICAgZ2V0IG1heF9hZ2UoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX21heF9hZ2U7XHJcbiAgICB9XHJcbiAgICBnZXQgdWlfbG9jYWxlcygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fdWlfbG9jYWxlcztcclxuICAgIH1cclxuICAgIGdldCBhY3JfdmFsdWVzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9hY3JfdmFsdWVzO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLyBtZXRhZGF0YVxyXG4gICAgZ2V0IGF1dGhvcml0eSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fYXV0aG9yaXR5O1xyXG4gICAgfVxyXG4gICAgc2V0IGF1dGhvcml0eSh2YWx1ZSkge1xyXG4gICAgICAgIGlmICghdGhpcy5fYXV0aG9yaXR5KSB7XHJcbiAgICAgICAgICAgIC8vIG9uZS10aW1lIHNldCBvbmx5XHJcbiAgICAgICAgICAgIHRoaXMuX2F1dGhvcml0eSA9IHZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiYXV0aG9yaXR5IGhhcyBhbHJlYWR5IGJlZW4gYXNzaWduZWQuXCIpXHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImF1dGhvcml0eSBoYXMgYWxyZWFkeSBiZWVuIGFzc2lnbmVkLlwiKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGdldCBtZXRhZGF0YVVybCgpIHtcclxuICAgICAgICBpZiAoIXRoaXMuX21ldGFkYXRhVXJsKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX21ldGFkYXRhVXJsID0gdGhpcy5hdXRob3JpdHk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5fbWV0YWRhdGFVcmwgJiYgdGhpcy5fbWV0YWRhdGFVcmwuaW5kZXhPZihPaWRjTWV0YWRhdGFVcmxQYXRoKSA8IDApIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9tZXRhZGF0YVVybFt0aGlzLl9tZXRhZGF0YVVybC5sZW5ndGggLSAxXSAhPT0gJy8nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWV0YWRhdGFVcmwgKz0gJy8nO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWV0YWRhdGFVcmwgKz0gT2lkY01ldGFkYXRhVXJsUGF0aDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX21ldGFkYXRhVXJsO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHNldHRhYmxlL2NhY2hhYmxlIG1ldGFkYXRhIHZhbHVlc1xyXG4gICAgZ2V0IG1ldGFkYXRhKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9tZXRhZGF0YTtcclxuICAgIH1cclxuICAgIHNldCBtZXRhZGF0YSh2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMuX21ldGFkYXRhID0gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHNpZ25pbmdLZXlzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zaWduaW5nS2V5cztcclxuICAgIH1cclxuICAgIHNldCBzaWduaW5nS2V5cyh2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMuX3NpZ25pbmdLZXlzID0gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gYmVoYXZpb3IgZmxhZ3NcclxuICAgIGdldCBmaWx0ZXJQcm90b2NvbENsYWltcygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZmlsdGVyUHJvdG9jb2xDbGFpbXM7XHJcbiAgICB9XHJcbiAgICBnZXQgbG9hZFVzZXJJbmZvKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9sb2FkVXNlckluZm87XHJcbiAgICB9XHJcbiAgICBnZXQgc3RhbGVTdGF0ZUFnZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc3RhbGVTdGF0ZUFnZTtcclxuICAgIH1cclxuICAgIGdldCBjbG9ja1NrZXcoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Nsb2NrU2tldztcclxuICAgIH1cclxuXHJcbiAgICBnZXQgc3RhdGVTdG9yZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc3RhdGVTdG9yZTtcclxuICAgIH1cclxuICAgIGdldCB2YWxpZGF0b3IoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbGlkYXRvcjtcclxuICAgIH1cclxuICAgIGdldCBtZXRhZGF0YVNlcnZpY2UoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX21ldGFkYXRhU2VydmljZTtcclxuICAgIH1cclxufVxyXG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9PaWRjQ2xpZW50U2V0dGluZ3MuanNcbiAqKi8iLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcblxyXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcclxuaW1wb3J0IEdsb2JhbCBmcm9tICcuL0dsb2JhbCc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBXZWJTdG9yYWdlU3RhdGVTdG9yZSB7XHJcbiAgICBjb25zdHJ1Y3Rvcih7cHJlZml4ID0gXCJvaWRjLlwiLCBzdG9yZSA9IEdsb2JhbC5sb2NhbFN0b3JhZ2V9ID0ge30pIHtcclxuICAgICAgICB0aGlzLl9zdG9yZSA9IHN0b3JlO1xyXG4gICAgICAgIHRoaXMuX3ByZWZpeCA9IHByZWZpeDtcclxuICAgIH1cclxuXHJcbiAgICBzZXQoa2V5LCB2YWx1ZSkge1xyXG4gICAgICAgIExvZy5pbmZvKFwiV2ViU3RvcmFnZVN0YXRlU3RvcmUuc2V0XCIsIGtleSk7XHJcblxyXG4gICAgICAgIGtleSA9IHRoaXMuX3ByZWZpeCArIGtleTtcclxuXHJcbiAgICAgICAgdGhpcy5fc3RvcmUuc2V0SXRlbShrZXksIHZhbHVlKTtcclxuICAgICAgICBcclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0KGtleSkge1xyXG4gICAgICAgIExvZy5pbmZvKFwiV2ViU3RvcmFnZVN0YXRlU3RvcmUuZ2V0XCIsIGtleSk7XHJcblxyXG4gICAgICAgIGtleSA9IHRoaXMuX3ByZWZpeCArIGtleTtcclxuXHJcbiAgICAgICAgbGV0IGl0ZW0gPSB0aGlzLl9zdG9yZS5nZXRJdGVtKGtleSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShpdGVtKTtcclxuICAgIH1cclxuXHJcbiAgICByZW1vdmUoa2V5KSB7XHJcbiAgICAgICAgTG9nLmluZm8oXCJXZWJTdG9yYWdlU3RhdGVTdG9yZS5yZW1vdmVcIiwga2V5KTtcclxuXHJcbiAgICAgICAga2V5ID0gdGhpcy5fcHJlZml4ICsga2V5O1xyXG5cclxuICAgICAgICBsZXQgaXRlbSA9IHRoaXMuX3N0b3JlLmdldEl0ZW0oa2V5KTtcclxuICAgICAgICB0aGlzLl9zdG9yZS5yZW1vdmVJdGVtKGtleSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShpdGVtKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRBbGxLZXlzKCkge1xyXG4gICAgICAgIExvZy5pbmZvKFwiV2ViU3RvcmFnZVN0YXRlU3RvcmUuZ2V0QWxsS2V5c1wiKTtcclxuXHJcbiAgICAgICAgdmFyIGtleXMgPSBbXTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMuX3N0b3JlLmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICAgICAgICBsZXQga2V5ID0gdGhpcy5fc3RvcmUua2V5KGluZGV4KTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmIChrZXkuaW5kZXhPZih0aGlzLl9wcmVmaXgpID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICBrZXlzLnB1c2goa2V5LnN1YnN0cih0aGlzLl9wcmVmaXgubGVuZ3RoKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShrZXlzKTtcclxuICAgIH1cclxufVxyXG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9XZWJTdG9yYWdlU3RhdGVTdG9yZS5qc1xuICoqLyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cclxuXHJcbmNvbnN0IHRpbWVyID0ge1xyXG4gICAgc2V0VGltZW91dDogZnVuY3Rpb24gKGNiLCBkdXJhdGlvbikge1xyXG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGNiLCBkdXJhdGlvbik7XHJcbiAgICB9LFxyXG4gICAgY2xlYXJUaW1lb3V0OiBmdW5jdGlvbiAoaGFuZGxlKSB7XHJcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChoYW5kbGUpO1xyXG4gICAgfVxyXG59O1xyXG5cclxubGV0IHRlc3RpbmcgPSBmYWxzZTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEdsb2JhbCB7XHJcblxyXG4gICAgc3RhdGljIF90ZXN0aW5nKCkge1xyXG4gICAgICAgIHRlc3RpbmcgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBnZXQgbG9jYXRpb24oKSB7XHJcbiAgICAgICAgaWYgKCF0ZXN0aW5nKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBsb2NhdGlvbjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgZ2V0IGxvY2FsU3RvcmFnZSgpIHtcclxuICAgICAgICBpZiAoIXRlc3RpbmcpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGxvY2FsU3RvcmFnZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgZ2V0IHNlc3Npb25TdG9yYWdlKCkge1xyXG4gICAgICAgIGlmICghdGVzdGluZykge1xyXG4gICAgICAgICAgICByZXR1cm4gc2Vzc2lvblN0b3JhZ2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgc3RhdGljIGdldCBYTUxIdHRwUmVxdWVzdCgpIHtcclxuICAgICAgICBpZiAoIXRlc3RpbmcpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFhNTEh0dHBSZXF1ZXN0O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHN0YXRpYyBnZXQgdGltZXIoKSB7XHJcbiAgICAgICAgaWYgKCF0ZXN0aW5nKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aW1lcjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn07XHJcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL0dsb2JhbC5qc1xuICoqLyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cclxuXHJcbmltcG9ydCBMb2cgZnJvbSAnLi9Mb2cnO1xyXG5pbXBvcnQgTWV0YWRhdGFTZXJ2aWNlIGZyb20gJy4vTWV0YWRhdGFTZXJ2aWNlJztcclxuaW1wb3J0IFVzZXJJbmZvU2VydmljZSBmcm9tICcuL1VzZXJJbmZvU2VydmljZSc7XHJcbmltcG9ydCBFcnJvclJlc3BvbnNlIGZyb20gJy4vRXJyb3JSZXNwb25zZSc7XHJcbmltcG9ydCBKb3NlVXRpbCBmcm9tICcuL0pvc2VVdGlsJztcclxuXHJcbmNvbnN0IFByb3RvY29sQ2xhaW1zID0gW1wibm9uY2VcIiwgXCJhdF9oYXNoXCIsIFwiaWF0XCIsIFwibmJmXCIsIFwiZXhwXCIsIFwiYXVkXCIsIFwiaXNzXCIsIFwiY19oYXNoXCJdO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVzcG9uc2VWYWxpZGF0b3Ige1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHNldHRpbmdzLCBNZXRhZGF0YVNlcnZpY2VDdG9yID0gTWV0YWRhdGFTZXJ2aWNlLCBVc2VySW5mb1NlcnZpY2VDdG9yID0gVXNlckluZm9TZXJ2aWNlLCBqb3NlVXRpbCA9IEpvc2VVdGlsKSB7XHJcbiAgICAgICAgaWYgKCFzZXR0aW5ncykge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJObyBzZXR0aW5ncyBwYXNzZWQgdG8gUmVzcG9uc2VWYWxpZGF0b3JcIik7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInNldHRpbmdzXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fc2V0dGluZ3MgPSBzZXR0aW5ncztcclxuICAgICAgICB0aGlzLl9tZXRhZGF0YVNlcnZpY2UgPSBuZXcgTWV0YWRhdGFTZXJ2aWNlQ3Rvcih0aGlzLl9zZXR0aW5ncyk7XHJcbiAgICAgICAgdGhpcy5fdXNlckluZm9TZXJ2aWNlID0gbmV3IFVzZXJJbmZvU2VydmljZUN0b3IodGhpcy5fc2V0dGluZ3MpO1xyXG4gICAgICAgIHRoaXMuX2pvc2VVdGlsID0gam9zZVV0aWw7XHJcbiAgICB9XHJcblxyXG4gICAgdmFsaWRhdGVTaWduaW5SZXNwb25zZShzdGF0ZSwgcmVzcG9uc2UpIHtcclxuICAgICAgICBMb2cuaW5mbyhcIlJlc3BvbnNlVmFsaWRhdG9yLnZhbGlkYXRlU2lnbmluUmVzcG9uc2VcIik7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLl9wcm9jZXNzU2lnbmluUGFyYW1zKHN0YXRlLCByZXNwb25zZSkudGhlbihyZXNwb25zZSA9PiB7XHJcbiAgICAgICAgICAgIExvZy5pbmZvKFwic3RhdGUgcHJvY2Vzc2VkXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdmFsaWRhdGVUb2tlbnMoc3RhdGUsIHJlc3BvbnNlKS50aGVuKHJlc3BvbnNlID0+IHtcclxuICAgICAgICAgICAgICAgIExvZy5pbmZvKFwidG9rZW5zIHZhbGlkYXRlZFwiKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcm9jZXNzQ2xhaW1zKHJlc3BvbnNlKS50aGVuKHJlc3BvbnNlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBMb2cuaW5mbyhcImNsYWltcyBwcm9jZXNzZWRcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHZhbGlkYXRlU2lnbm91dFJlc3BvbnNlKHN0YXRlLCByZXNwb25zZSkge1xyXG4gICAgICAgIExvZy5pbmZvKFwiUmVzcG9uc2VWYWxpZGF0b3IudmFsaWRhdGVTaWdub3V0UmVzcG9uc2VcIik7XHJcblxyXG4gICAgICAgIGlmIChzdGF0ZS5pZCAhPT0gcmVzcG9uc2Uuc3RhdGUpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiU3RhdGUgZG9lcyBub3QgbWF0Y2hcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJTdGF0ZSBkb2VzIG5vdCBtYXRjaFwiKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBub3cgdGhhdCB3ZSBrbm93IHRoZSBzdGF0ZSBtYXRjaGVzLCB0YWtlIHRoZSBzdG9yZWQgZGF0YVxyXG4gICAgICAgIC8vIGFuZCBzZXQgaXQgaW50byB0aGUgcmVzcG9uc2Ugc28gY2FsbGVycyBjYW4gZ2V0IHRoZWlyIHN0YXRlXHJcbiAgICAgICAgLy8gdGhpcyBpcyBpbXBvcnRhbnQgZm9yIGJvdGggc3VjY2VzcyAmIGVycm9yIG91dGNvbWVzXHJcbiAgICAgICAgTG9nLmluZm8oXCJzdGF0ZSB2YWxpZGF0ZWRcIik7XHJcbiAgICAgICAgcmVzcG9uc2Uuc3RhdGUgPSBzdGF0ZS5kYXRhO1xyXG5cclxuICAgICAgICBpZiAocmVzcG9uc2UuZXJyb3IpIHtcclxuICAgICAgICAgICAgTG9nLndhcm4oXCJSZXNwb25zZSB3YXMgZXJyb3JcIiwgcmVzcG9uc2UuZXJyb3IpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yUmVzcG9uc2UocmVzcG9uc2UpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzcG9uc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIF9wcm9jZXNzU2lnbmluUGFyYW1zKHN0YXRlLCByZXNwb25zZSkge1xyXG4gICAgICAgIExvZy5pbmZvKFwiUmVzcG9uc2VWYWxpZGF0b3IuX3Byb2Nlc3NTaWduaW5QYXJhbXNcIik7XHJcblxyXG4gICAgICAgIGlmIChzdGF0ZS5pZCAhPT0gcmVzcG9uc2Uuc3RhdGUpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiU3RhdGUgZG9lcyBub3QgbWF0Y2hcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJTdGF0ZSBkb2VzIG5vdCBtYXRjaFwiKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGlmICghc3RhdGUuY2xpZW50X2lkKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIGNsaWVudF9pZCBvbiBzdGF0ZVwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIk5vIGNsaWVudF9pZCBvbiBzdGF0ZVwiKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGlmICghc3RhdGUuYXV0aG9yaXR5KSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIGF1dGhvcml0eSBvbiBzdGF0ZVwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIk5vIGF1dGhvcml0eSBvbiBzdGF0ZVwiKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIHRoaXMgYWxsb3dzIHRoZSBhdXRob3JpdHkgdG8gYmUgbG9hZGVkIGZyb20gdGhlIHNpZ25pbiBzdGF0ZVxyXG4gICAgICAgIGlmICghdGhpcy5fc2V0dGluZ3MuYXV0aG9yaXR5KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3NldHRpbmdzLmF1dGhvcml0eSA9IHN0YXRlLmF1dGhvcml0eTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gZW5zdXJlIHdlJ3JlIHVzaW5nIHRoZSBjb3JyZWN0IGF1dGhvcml0eSBpZiB0aGUgYXV0aG9yaXR5IGlzIG5vdCBsb2FkZWQgZnJvbSBzaWduaW4gc3RhdGVcclxuICAgICAgICBlbHNlIGlmICh0aGlzLl9zZXR0aW5ncy5hdXRob3JpdHkgJiYgdGhpcy5fc2V0dGluZ3MuYXV0aG9yaXR5ICE9PSBzdGF0ZS5hdXRob3JpdHkpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiYXV0aG9yaXR5IG1pc21hdGNoIG9uIHNldHRpbmdzIHZzLiBzaWduaW4gc3RhdGVcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJhdXRob3JpdHkgbWlzbWF0Y2ggb24gc2V0dGluZ3MgdnMuIHNpZ25pbiBzdGF0ZVwiKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHRoaXMgYWxsb3dzIHRoZSBjbGllbnRfaWQgdG8gYmUgbG9hZGVkIGZyb20gdGhlIHNpZ25pbiBzdGF0ZVxyXG4gICAgICAgIGlmICghdGhpcy5fc2V0dGluZ3MuY2xpZW50X2lkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3NldHRpbmdzLmNsaWVudF9pZCA9IHN0YXRlLmNsaWVudF9pZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gZW5zdXJlIHdlJ3JlIHVzaW5nIHRoZSBjb3JyZWN0IGNsaWVudF9pZCBpZiB0aGUgY2xpZW50X2lkIGlzIG5vdCBsb2FkZWQgZnJvbSBzaWduaW4gc3RhdGVcclxuICAgICAgICBlbHNlIGlmICh0aGlzLl9zZXR0aW5ncy5jbGllbnRfaWQgJiYgdGhpcy5fc2V0dGluZ3MuY2xpZW50X2lkICE9PSBzdGF0ZS5jbGllbnRfaWQpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiY2xpZW50X2lkIG1pc21hdGNoIG9uIHNldHRpbmdzIHZzLiBzaWduaW4gc3RhdGVcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJjbGllbnRfaWQgbWlzbWF0Y2ggb24gc2V0dGluZ3MgdnMuIHNpZ25pbiBzdGF0ZVwiKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIG5vdyB0aGF0IHdlIGtub3cgdGhlIHN0YXRlIG1hdGNoZXMsIHRha2UgdGhlIHN0b3JlZCBkYXRhXHJcbiAgICAgICAgLy8gYW5kIHNldCBpdCBpbnRvIHRoZSByZXNwb25zZSBzbyBjYWxsZXJzIGNhbiBnZXQgdGhlaXIgc3RhdGVcclxuICAgICAgICAvLyB0aGlzIGlzIGltcG9ydGFudCBmb3IgYm90aCBzdWNjZXNzICYgZXJyb3Igb3V0Y29tZXNcclxuICAgICAgICBMb2cuaW5mbyhcInN0YXRlIHZhbGlkYXRlZFwiKTtcclxuICAgICAgICByZXNwb25zZS5zdGF0ZSA9IHN0YXRlLmRhdGE7XHJcblxyXG4gICAgICAgIGlmIChyZXNwb25zZS5lcnJvcikge1xyXG4gICAgICAgICAgICBMb2cud2FybihcIlJlc3BvbnNlIHdhcyBlcnJvclwiLCByZXNwb25zZS5lcnJvcik7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3JSZXNwb25zZShyZXNwb25zZSkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHN0YXRlLm5vbmNlICYmICFyZXNwb25zZS5pZF90b2tlbikge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJFeHBlY3RpbmcgaWRfdG9rZW4gaW4gcmVzcG9uc2VcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJObyBpZF90b2tlbiBpbiByZXNwb25zZVwiKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXN0YXRlLm5vbmNlICYmIHJlc3BvbnNlLmlkX3Rva2VuKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk5vdCBleHBlY3RpbmcgaWRfdG9rZW4gaW4gcmVzcG9uc2VcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJVbmV4cGVjdGVkIGlkX3Rva2VuIGluIHJlc3BvbnNlXCIpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzcG9uc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIF9wcm9jZXNzQ2xhaW1zKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgTG9nLmluZm8oXCJSZXNwb25zZVZhbGlkYXRvci5fcHJvY2Vzc0NsYWltc1wiKTtcclxuXHJcbiAgICAgICAgaWYgKHJlc3BvbnNlLmlzT3BlbklkQ29ubmVjdCkge1xyXG4gICAgICAgICAgICBMb2cuaW5mbyhcInJlc3BvbnNlIGlzIE9JREMsIHByb2Nlc3NpbmcgY2xhaW1zXCIpO1xyXG5cclxuICAgICAgICAgICAgcmVzcG9uc2UucHJvZmlsZSA9IHRoaXMuX2ZpbHRlclByb3RvY29sQ2xhaW1zKHJlc3BvbnNlLnByb2ZpbGUpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX3NldHRpbmdzLmxvYWRVc2VySW5mbyAmJiByZXNwb25zZS5hY2Nlc3NfdG9rZW4pIHtcclxuICAgICAgICAgICAgICAgIExvZy5pbmZvKFwibG9hZGluZyB1c2VyIGluZm9cIik7XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3VzZXJJbmZvU2VydmljZS5nZXRDbGFpbXMocmVzcG9uc2UuYWNjZXNzX3Rva2VuKS50aGVuKGNsYWltcyA9PiB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnByb2ZpbGUgPSB0aGlzLl9tZXJnZUNsYWltcyhyZXNwb25zZS5wcm9maWxlLCBjbGFpbXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIExvZy5pbmZvKFwidXNlciBpbmZvIGNsYWltcyByZWNlaXZlZCwgdXBkYXRlZCBwcm9maWxlOlwiLCByZXNwb25zZS5wcm9maWxlKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBMb2cuaW5mbyhcIm5vdCBsb2FkaW5nIHVzZXIgaW5mb1wiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgTG9nLmluZm8oXCJyZXNwb25zZSBpcyBub3QgT0lEQywgbm90IHByb2Nlc3NpbmcgY2xhaW1zXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXNwb25zZSk7XHJcbiAgICB9XHJcblxyXG4gICAgX21lcmdlQ2xhaW1zKGNsYWltczEsIGNsYWltczIpIHtcclxuICAgICAgICB2YXIgcmVzdWx0ID0gT2JqZWN0LmFzc2lnbih7fSwgY2xhaW1zMSk7XHJcblxyXG4gICAgICAgIGZvciAobGV0IG5hbWUgaW4gY2xhaW1zMikge1xyXG4gICAgICAgICAgICB2YXIgdmFsdWVzID0gY2xhaW1zMltuYW1lXTtcclxuICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlcykpIHtcclxuICAgICAgICAgICAgICAgIHZhbHVlcyA9IFt2YWx1ZXNdO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCB2YWx1ZSBvZiB2YWx1ZXMpIHtcclxuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0W25hbWVdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0W25hbWVdID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdFtuYW1lXSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0W25hbWVdLmluZGV4T2YodmFsdWUpIDwgMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbbmFtZV0ucHVzaCh2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocmVzdWx0W25hbWVdICE9PSB2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtuYW1lXSA9IFtyZXN1bHRbbmFtZV0sIHZhbHVlXTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBfZmlsdGVyUHJvdG9jb2xDbGFpbXMoY2xhaW1zKSB7XHJcbiAgICAgICAgTG9nLmluZm8oXCJSZXNwb25zZVZhbGlkYXRvci5fZmlsdGVyUHJvdG9jb2xDbGFpbXMsIGluY29taW5nIGNsYWltczpcIiwgY2xhaW1zKTtcclxuXHJcbiAgICAgICAgdmFyIHJlc3VsdCA9IE9iamVjdC5hc3NpZ24oe30sIGNsYWltcyk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9zZXR0aW5ncy5fZmlsdGVyUHJvdG9jb2xDbGFpbXMpIHtcclxuICAgICAgICAgICAgUHJvdG9jb2xDbGFpbXMuZm9yRWFjaCh0eXBlID0+IHtcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSByZXN1bHRbdHlwZV07XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgTG9nLmluZm8oXCJwcm90b2NvbCBjbGFpbXMgZmlsdGVyZWRcIiwgcmVzdWx0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIExvZy5pbmZvKFwicHJvdG9jb2wgY2xhaW1zIG5vdCBmaWx0ZXJlZFwiKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBfdmFsaWRhdGVUb2tlbnMoc3RhdGUsIHJlc3BvbnNlKSB7XHJcbiAgICAgICAgTG9nLmluZm8oXCJSZXNwb25zZVZhbGlkYXRvci5fdmFsaWRhdGVUb2tlbnNcIik7XHJcblxyXG4gICAgICAgIGlmIChyZXNwb25zZS5pZF90b2tlbikge1xyXG5cclxuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmFjY2Vzc190b2tlbikge1xyXG4gICAgICAgICAgICAgICAgTG9nLmluZm8oXCJWYWxpZGF0aW5nIGlkX3Rva2VuIGFuZCBhY2Nlc3NfdG9rZW5cIik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fdmFsaWRhdGVJZFRva2VuQW5kQWNjZXNzVG9rZW4oc3RhdGUsIHJlc3BvbnNlKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgTG9nLmluZm8oXCJWYWxpZGF0aW5nIGlkX3Rva2VuXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdmFsaWRhdGVJZFRva2VuKHN0YXRlLCByZXNwb25zZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBMb2cuaW5mbyhcIk5vIGlkX3Rva2VuIHRvIHZhbGlkYXRlXCIpO1xyXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzcG9uc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIF92YWxpZGF0ZUlkVG9rZW5BbmRBY2Nlc3NUb2tlbihzdGF0ZSwgcmVzcG9uc2UpIHtcclxuICAgICAgICBMb2cuaW5mbyhcIlJlc3BvbnNlVmFsaWRhdG9yLl92YWxpZGF0ZUlkVG9rZW5BbmRBY2Nlc3NUb2tlblwiKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbGlkYXRlSWRUb2tlbihzdGF0ZSwgcmVzcG9uc2UpLnRoZW4ocmVzcG9uc2UgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdmFsaWRhdGVBY2Nlc3NUb2tlbihyZXNwb25zZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgX3ZhbGlkYXRlSWRUb2tlbihzdGF0ZSwgcmVzcG9uc2UpIHtcclxuICAgICAgICBMb2cuaW5mbyhcIlJlc3BvbnNlVmFsaWRhdG9yLl92YWxpZGF0ZUlkVG9rZW5cIik7XHJcblxyXG4gICAgICAgIGlmICghc3RhdGUubm9uY2UpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gbm9uY2Ugb24gc3RhdGVcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJObyBub25jZSBvbiBzdGF0ZVwiKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGxldCBqd3QgPSB0aGlzLl9qb3NlVXRpbC5wYXJzZUp3dChyZXNwb25zZS5pZF90b2tlbik7XHJcbiAgICAgICAgaWYgKCFqd3QgfHwgIWp3dC5oZWFkZXIgfHwgIWp3dC5wYXlsb2FkKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIkZhaWxlZCB0byBwYXJzZSBpZF90b2tlblwiLCBqd3QpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiRmFpbGVkIHRvIHBhcnNlIGlkX3Rva2VuXCIpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChzdGF0ZS5ub25jZSAhPT0gand0LnBheWxvYWQubm9uY2UpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiSW52YWxpZCBub25jZSBpbiBpZF90b2tlblwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkludmFsaWQgbm9uY2UgaW4gaWRfdG9rZW5cIikpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGtpZCA9IGp3dC5oZWFkZXIua2lkO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5fbWV0YWRhdGFTZXJ2aWNlLmdldElzc3VlcigpLnRoZW4oaXNzdWVyID0+IHtcclxuICAgICAgICAgICAgTG9nLmluZm8oXCJSZWNlaXZlZCBpc3N1ZXJcIik7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbWV0YWRhdGFTZXJ2aWNlLmdldFNpZ25pbmdLZXlzKCkudGhlbihrZXlzID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICgha2V5cykge1xyXG4gICAgICAgICAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIHNpZ25pbmcga2V5cyBmcm9tIG1ldGFkYXRhXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJObyBzaWduaW5nIGtleXMgZnJvbSBtZXRhZGF0YVwiKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgTG9nLmluZm8oXCJSZWNlaXZlZCBzaWduaW5nIGtleXNcIik7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWtpZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChrZXlzLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8ga2lkIGZvdW5kIGluIGlkX3Rva2VuXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiTm8ga2lkIGZvdW5kIGluIGlkX3Rva2VuXCIpKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBraWQgaXMgbWFuZGF0b3J5IG9ubHkgd2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUga2V5cyBpbiB0aGUgcmVmZXJlbmNlZCBKV0sgU2V0IGRvY3VtZW50XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlZSBodHRwOi8vb3BlbmlkLm5ldC9zcGVjcy9vcGVuaWQtY29ubmVjdC1jb3JlLTFfMC5odG1sI1NpZ25pbmdcclxuICAgICAgICAgICAgICAgICAgICAgICAga2lkID0ga2V5c1swXS5raWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGxldCBrZXkgPSBrZXlzLmZpbHRlcihrZXkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBrZXkua2lkID09PSBraWQ7XHJcbiAgICAgICAgICAgICAgICB9KVswXTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoIWtleSkge1xyXG4gICAgICAgICAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIGtleSBtYXRjaGluZyBraWQgZm91bmQgaW4gc2lnbmluZyBrZXlzXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJObyBrZXkgbWF0Y2hpbmcga2lkIGZvdW5kIGluIHNpZ25pbmcga2V5c1wiKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IGF1ZGllbmNlID0gc3RhdGUuY2xpZW50X2lkO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBsZXQgY2xvY2tTa2V3SW5TZWNvbmRzID0gdGhpcy5fc2V0dGluZ3MuY2xvY2tTa2V3O1xyXG4gICAgICAgICAgICAgICAgTG9nLmluZm8oXCJWYWxpZGFpbmcgSldUOyB1c2luZyBjbG9jayBza2V3IChpbiBzZWNvbmRzKSBvZjogXCIsIGNsb2NrU2tld0luU2Vjb25kcyk7XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2pvc2VVdGlsLnZhbGlkYXRlSnd0KHJlc3BvbnNlLmlkX3Rva2VuLCBrZXksIGlzc3VlciwgYXVkaWVuY2UsIGNsb2NrU2tld0luU2Vjb25kcykudGhlbigoKT0+e1xyXG4gICAgICAgICAgICAgICAgICAgIExvZy5pbmZvKFwiSldUIHZhbGlkYXRpb24gc3VjY2Vzc2Z1bFwiKTtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5wcm9maWxlID0gand0LnBheWxvYWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIF92YWxpZGF0ZUFjY2Vzc1Rva2VuKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgTG9nLmluZm8oXCJSZXNwb25zZVZhbGlkYXRvci5fdmFsaWRhdGVBY2Nlc3NUb2tlblwiKTtcclxuXHJcbiAgICAgICAgaWYgKCFyZXNwb25zZS5wcm9maWxlKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIHByb2ZpbGUgbG9hZGVkIGZyb20gaWRfdG9rZW5cIik7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJObyBwcm9maWxlIGxvYWRlZCBmcm9tIGlkX3Rva2VuXCIpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghcmVzcG9uc2UucHJvZmlsZS5hdF9oYXNoKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIGF0X2hhc2ggaW4gaWRfdG9rZW5cIik7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJObyBhdF9oYXNoIGluIGlkX3Rva2VuXCIpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghcmVzcG9uc2UuaWRfdG9rZW4pIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gaWRfdG9rZW5cIik7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJObyBpZF90b2tlblwiKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgand0ID0gdGhpcy5fam9zZVV0aWwucGFyc2VKd3QocmVzcG9uc2UuaWRfdG9rZW4pO1xyXG4gICAgICAgIGlmICghand0IHx8ICFqd3QuaGVhZGVyKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIkZhaWxlZCB0byBwYXJzZSBpZF90b2tlblwiLCBqd3QpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiRmFpbGVkIHRvIHBhcnNlIGlkX3Rva2VuXCIpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBoYXNoQWxnID0gand0LmhlYWRlci5hbGc7XHJcbiAgICAgICAgaWYgKCFoYXNoQWxnIHx8IGhhc2hBbGcubGVuZ3RoICE9PSA1KSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIlVuc3VwcG9ydGVkIGFsZzpcIiwgaGFzaEFsZyk7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJVbnN1cHBvcnRlZCBhbGc6IFwiICsgaGFzaEFsZykpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGhhc2hCaXRzID0gaGFzaEFsZy5zdWJzdHIoMiwgMyk7XHJcbiAgICAgICAgaWYgKCFoYXNoQml0cykge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJVbnN1cHBvcnRlZCBhbGc6XCIsIGhhc2hBbGcsIGhhc2hCaXRzKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIlVuc3VwcG9ydGVkIGFsZzogXCIgKyBoYXNoQWxnKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBoYXNoQml0cyA9IHBhcnNlSW50KGhhc2hCaXRzKTtcclxuICAgICAgICBpZiAoaGFzaEJpdHMgIT09IDI1NiAmJiBoYXNoQml0cyAhPT0gMzg0ICYmIGhhc2hCaXRzICE9PSA1MTIpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiVW5zdXBwb3J0ZWQgYWxnOlwiLCBoYXNoQWxnLCBoYXNoQml0cyk7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJVbnN1cHBvcnRlZCBhbGc6IFwiICsgaGFzaEFsZykpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHNoYSA9IFwic2hhXCIgKyBoYXNoQml0cztcclxuICAgICAgICB2YXIgaGFzaCA9IHRoaXMuX2pvc2VVdGlsLmhhc2hTdHJpbmcocmVzcG9uc2UuYWNjZXNzX3Rva2VuLCBzaGEpO1xyXG4gICAgICAgIGlmICghaGFzaCkge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJhY2Nlc3NfdG9rZW4gaGFzaCBmYWlsZWQ6XCIsIHNoYSk7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJGYWlsZWQgdG8gdmFsaWRhdGUgYXRfaGFzaFwiKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgbGVmdCA9IGhhc2guc3Vic3RyKDAsIGhhc2gubGVuZ3RoIC8gMik7XHJcbiAgICAgICAgdmFyIGxlZnRfYjY0dSA9IHRoaXMuX2pvc2VVdGlsLmhleFRvQmFzZTY0VXJsKGxlZnQpO1xyXG4gICAgICAgIGlmIChsZWZ0X2I2NHUgIT09IHJlc3BvbnNlLnByb2ZpbGUuYXRfaGFzaCkge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJGYWlsZWQgdG8gdmFsaWRhdGUgYXRfaGFzaFwiLCBsZWZ0X2I2NHUsIHJlc3BvbnNlLnByb2ZpbGUuYXRfaGFzaCk7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJGYWlsZWQgdG8gdmFsaWRhdGUgYXRfaGFzaFwiKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3BvbnNlKTtcclxuICAgIH1cclxufVxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL1Jlc3BvbnNlVmFsaWRhdG9yLmpzXG4gKiovIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5cclxuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XHJcbmltcG9ydCBKc29uU2VydmljZSBmcm9tICcuL0pzb25TZXJ2aWNlJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1ldGFkYXRhU2VydmljZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihzZXR0aW5ncywgSnNvblNlcnZpY2VDdG9yID0gSnNvblNlcnZpY2UpIHtcclxuICAgICAgICBpZiAoIXNldHRpbmdzKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIHNldHRpbmdzIHBhc3NlZCB0byBNZXRhZGF0YVNlcnZpY2VcIik7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInNldHRpbmdzXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fc2V0dGluZ3MgPSBzZXR0aW5ncztcclxuICAgICAgICB0aGlzLl9qc29uU2VydmljZSA9IG5ldyBKc29uU2VydmljZUN0b3IoKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRNZXRhZGF0YSgpIHtcclxuICAgICAgICBMb2cuaW5mbyhcIk1ldGFkYXRhU2VydmljZS5nZXRNZXRhZGF0YVwiKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX3NldHRpbmdzLm1ldGFkYXRhKSB7XHJcbiAgICAgICAgICAgIExvZy5pbmZvKFwiUmV0dXJuaW5nIG1ldGFkYXRhIGZyb20gc2V0dGluZ3NcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fc2V0dGluZ3MubWV0YWRhdGEpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9zZXR0aW5ncy5tZXRhZGF0YVVybCkge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJObyBtZXRhZGF0YVVybCBjb25maWd1cmVkIG9uIHNldHRpbmdzXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiTm8gbWV0YWRhdGFVcmwgY29uZmlndXJlZCBvbiBzZXR0aW5nc1wiKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBMb2cuaW5mbyhcImdldHRpbmcgbWV0YWRhdGEgZnJvbVwiLCB0aGlzLl9zZXR0aW5ncy5tZXRhZGF0YVVybCk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLl9qc29uU2VydmljZS5nZXRKc29uKHRoaXMuX3NldHRpbmdzLm1ldGFkYXRhVXJsKVxyXG4gICAgICAgICAgICAudGhlbihtZXRhZGF0YSA9PiB7XHJcbiAgICAgICAgICAgICAgICBMb2cuaW5mbyhcImpzb24gcmVjZWl2ZWRcIik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zZXR0aW5ncy5tZXRhZGF0YSA9IG1ldGFkYXRhO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG1ldGFkYXRhO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgZ2V0SXNzdWVyKCkge1xyXG4gICAgICAgIExvZy5pbmZvKFwiTWV0YWRhdGFTZXJ2aWNlLmdldElzc3VlclwiKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0TWV0YWRhdGFQcm9wZXJ0eShcImlzc3VlclwiKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRBdXRob3JpemF0aW9uRW5kcG9pbnQoKSB7XHJcbiAgICAgICAgTG9nLmluZm8oXCJNZXRhZGF0YVNlcnZpY2UuZ2V0QXV0aG9yaXphdGlvbkVuZHBvaW50XCIpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRNZXRhZGF0YVByb3BlcnR5KFwiYXV0aG9yaXphdGlvbl9lbmRwb2ludFwiKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRVc2VySW5mb0VuZHBvaW50KCkge1xyXG4gICAgICAgIExvZy5pbmZvKFwiTWV0YWRhdGFTZXJ2aWNlLmdldFVzZXJJbmZvRW5kcG9pbnRcIik7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldE1ldGFkYXRhUHJvcGVydHkoXCJ1c2VyaW5mb19lbmRwb2ludFwiKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgZ2V0Q2hlY2tTZXNzaW9uSWZyYW1lKCkge1xyXG4gICAgICAgIExvZy5pbmZvKFwiTWV0YWRhdGFTZXJ2aWNlLmdldENoZWNrU2Vzc2lvbklmcmFtZVwiKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0TWV0YWRhdGFQcm9wZXJ0eShcImNoZWNrX3Nlc3Npb25faWZyYW1lXCIsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEVuZFNlc3Npb25FbmRwb2ludCgpIHtcclxuICAgICAgICBMb2cuaW5mbyhcIk1ldGFkYXRhU2VydmljZS5nZXRFbmRTZXNzaW9uRW5kcG9pbnRcIik7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldE1ldGFkYXRhUHJvcGVydHkoXCJlbmRfc2Vzc2lvbl9lbmRwb2ludFwiLCB0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBfZ2V0TWV0YWRhdGFQcm9wZXJ0eShuYW1lLCBvcHRpb25hbD1mYWxzZSkge1xyXG4gICAgICAgIExvZy5pbmZvKFwiTWV0YWRhdGFTZXJ2aWNlLl9nZXRNZXRhZGF0YVByb3BlcnR5XCIsIG5hbWUpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRNZXRhZGF0YSgpLnRoZW4obWV0YWRhdGEgPT4ge1xyXG4gICAgICAgICAgICBMb2cuaW5mbyhcIm1ldGFkYXRhIHJlY2lldmVkXCIpO1xyXG5cclxuICAgICAgICAgICAgaWYgKG1ldGFkYXRhW25hbWVdID09PSB1bmRlZmluZWQpIHtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9uYWwgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBMb2cud2FybihcIk1ldGFkYXRhIGRvZXMgbm90IGNvbnRhaW4gb3B0aW9uYWwgcHJvcGVydHkgXCIgKyBuYW1lKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgTG9nLmVycm9yKFwiTWV0YWRhdGEgZG9lcyBub3QgY29udGFpbiBwcm9wZXJ0eSBcIiArIG5hbWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1ldGFkYXRhIGRvZXMgbm90IGNvbnRhaW4gcHJvcGVydHkgXCIgKyBuYW1lKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIG1ldGFkYXRhW25hbWVdO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFNpZ25pbmdLZXlzKCkge1xyXG4gICAgICAgIExvZy5pbmZvKFwiTWV0YWRhdGFTZXJ2aWNlLmdldFNpZ25pbmdLZXlzXCIpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fc2V0dGluZ3Muc2lnbmluZ0tleXMpIHtcclxuICAgICAgICAgICAgTG9nLmluZm8oXCJSZXR1cm5pbmcgc2lnbmluZ0tleXMgZnJvbSBzZXR0aW5nc1wiKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9zZXR0aW5ncy5zaWduaW5nS2V5cyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0TWV0YWRhdGFQcm9wZXJ0eShcImp3a3NfdXJpXCIpLnRoZW4oandrc191cmkgPT4ge1xyXG4gICAgICAgICAgICBMb2cuaW5mbyhcImp3a3NfdXJpIHJlY2VpdmVkXCIsIGp3a3NfdXJpKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9qc29uU2VydmljZS5nZXRKc29uKGp3a3NfdXJpKS50aGVuKGtleVNldCA9PiB7XHJcbiAgICAgICAgICAgICAgICBMb2cuaW5mbyhcImtleSBzZXQgcmVjZWl2ZWRcIiwga2V5U2V0KTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoIWtleVNldC5rZXlzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgTG9nLmVycm9yKFwiTWlzc2luZyBrZXlzIG9uIGtleXNldFwiKTtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIGtleXMgb24ga2V5c2V0XCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHZhciBmaWx0ZXJlZEtleXMgPSB0aGlzLl9maWx0ZXJTaWduaW5nS2V5cyhrZXlTZXQua2V5cyk7XHJcbiAgICAgICAgICAgICAgICBMb2cuaW5mbyhcImZpbHRlcmVkIGtleXNcIiwgZmlsdGVyZWRLZXlzKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zZXR0aW5ncy5zaWduaW5nS2V5cyA9IGZpbHRlcmVkS2V5cztcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9zZXR0aW5ncy5zaWduaW5nS2V5cztcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgX2ZpbHRlclNpZ25pbmdLZXlzKGtleXMpIHtcclxuICAgICAgICBMb2cuaW5mbyhcIk1ldGFkYXRhU2VydmljZS5fZmlsdGVyU2lnbmluZ0tleXNcIiwga2V5cyk7XHJcblxyXG4gICAgICAgIHJldHVybiBrZXlzLmZpbHRlcihpdGVtID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIGl0ZW0udXNlID09PSBcInNpZ1wiO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL01ldGFkYXRhU2VydmljZS5qc1xuICoqLyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cclxuXHJcbmltcG9ydCBMb2cgZnJvbSAnLi9Mb2cnO1xyXG5pbXBvcnQgR2xvYmFsIGZyb20gJy4vR2xvYmFsJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEpzb25TZXJ2aWNlIHtcclxuICAgIGNvbnN0cnVjdG9yKFhNTEh0dHBSZXF1ZXN0Q3RvciA9IEdsb2JhbC5YTUxIdHRwUmVxdWVzdCkge1xyXG4gICAgICAgIHRoaXMuX1hNTEh0dHBSZXF1ZXN0ID0gWE1MSHR0cFJlcXVlc3RDdG9yO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBnZXRKc29uKHVybCwgdG9rZW4pIHtcclxuICAgICAgICBMb2cuaW5mbyhcIkpzb25TZXJ2aWNlLmdldEpzb25cIiwgdXJsKTtcclxuICAgICAgICBcclxuICAgICAgICBpZiAoIXVybCl7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIHVybCBwYXNzZWRcIik7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInVybFwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHZhciByZXEgPSBuZXcgdGhpcy5fWE1MSHR0cFJlcXVlc3QoKTtcclxuICAgICAgICAgICAgcmVxLm9wZW4oJ0dFVCcsIHVybCk7XHJcblxyXG4gICAgICAgICAgICByZXEub25sb2FkID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICBMb2cuaW5mbyhcIkhUVFAgcmVzcG9uc2UgcmVjZWl2ZWQsIHN0YXR1c1wiLCByZXEuc3RhdHVzKTtcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgaWYgKHJlcS5zdGF0dXMgPT09IDIwMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoSlNPTi5wYXJzZShyZXEucmVzcG9uc2VUZXh0KSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZWplY3QoRXJyb3IocmVxLnN0YXR1c1RleHQgKyBcIiAoXCIgKyByZXEuc3RhdHVzICsgXCIpXCIpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIHJlcS5vbmVycm9yID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJuZXR3b3JrIGVycm9yXCIpO1xyXG4gICAgICAgICAgICAgICAgcmVqZWN0KEVycm9yKFwiTmV0d29yayBFcnJvclwiKSk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBpZiAodG9rZW4pIHtcclxuICAgICAgICAgICAgICAgIExvZy5pbmZvKFwidG9rZW4gcGFzc2VkLCBzZXR0aW5nIEF1dGhvcml6YXRpb24gaGVhZGVyXCIpO1xyXG4gICAgICAgICAgICAgICAgcmVxLnNldFJlcXVlc3RIZWFkZXIoXCJBdXRob3JpemF0aW9uXCIsIFwiQmVhcmVyIFwiICsgdG9rZW4pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXEuc2VuZCgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvSnNvblNlcnZpY2UuanNcbiAqKi8iLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcblxyXG5pbXBvcnQgSnNvblNlcnZpY2UgZnJvbSAnLi9Kc29uU2VydmljZSc7XHJcbmltcG9ydCBNZXRhZGF0YVNlcnZpY2UgZnJvbSAnLi9NZXRhZGF0YVNlcnZpY2UnO1xyXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFVzZXJJbmZvU2VydmljZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihzZXR0aW5ncywgSnNvblNlcnZpY2VDdG9yID0gSnNvblNlcnZpY2UsIE1ldGFkYXRhU2VydmljZUN0b3IgPSBNZXRhZGF0YVNlcnZpY2UpIHtcclxuICAgICAgICBpZiAoIXNldHRpbmdzKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIHNldHRpbmdzIHBhc3NlZCB0byBVc2VySW5mb1NlcnZpY2VcIik7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInNldHRpbmdzXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fc2V0dGluZ3MgPSBzZXR0aW5ncztcclxuICAgICAgICB0aGlzLl9qc29uU2VydmljZSA9IG5ldyBKc29uU2VydmljZUN0b3IoKTtcclxuICAgICAgICB0aGlzLl9tZXRhZGF0YVNlcnZpY2UgPSBuZXcgTWV0YWRhdGFTZXJ2aWNlQ3Rvcih0aGlzLl9zZXR0aW5ncyk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q2xhaW1zKHRva2VuKSB7XHJcbiAgICAgICAgTG9nLmluZm8oXCJVc2VySW5mb1NlcnZpY2UuZ2V0Q2xhaW1zXCIpO1xyXG5cclxuICAgICAgICBpZiAoIXRva2VuKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIHRva2VuIHBhc3NlZFwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkEgdG9rZW4gaXMgcmVxdWlyZWRcIikpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX21ldGFkYXRhU2VydmljZS5nZXRVc2VySW5mb0VuZHBvaW50KCkudGhlbih1cmwgPT4ge1xyXG4gICAgICAgICAgICBMb2cuaW5mbyhcInJlY2VpdmVkIHVzZXJpbmZvIHVybFwiLCB1cmwpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2pzb25TZXJ2aWNlLmdldEpzb24odXJsLCB0b2tlbikudGhlbihjbGFpbXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgTG9nLmluZm8oXCJjbGFpbXMgcmVjZWl2ZWRcIiwgY2xhaW1zKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjbGFpbXM7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL1VzZXJJbmZvU2VydmljZS5qc1xuICoqLyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cclxuXHJcbmltcG9ydCBMb2cgZnJvbSAnLi9Mb2cnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRXJyb3JSZXNwb25zZSBleHRlbmRzIEVycm9yIHtcclxuICAgIGNvbnN0cnVjdG9yKHtlcnJvciwgZXJyb3JfZGVzY3JpcHRpb24sIGVycm9yX3VyaSwgc3RhdGV9PXt9XHJcbiAgICApIHtcclxuICAgICAgICAgaWYgKCFlcnJvcil7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIGVycm9yIHBhc3NlZCB0byBFcnJvclJlc3BvbnNlXCIpO1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJlcnJvclwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgc3VwZXIoZXJyb3JfZGVzY3JpcHRpb24gfHwgZXJyb3IpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMubmFtZSA9IFwiRXJyb3JSZXNwb25zZVwiOyBcclxuICAgICAgICBcclxuICAgICAgICB0aGlzLmVycm9yID0gZXJyb3I7XHJcbiAgICAgICAgdGhpcy5lcnJvcl9kZXNjcmlwdGlvbiA9IGVycm9yX2Rlc2NyaXB0aW9uO1xyXG4gICAgICAgIHRoaXMuZXJyb3JfdXJpID0gZXJyb3JfdXJpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcclxuICAgIH1cclxufVxyXG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9FcnJvclJlc3BvbnNlLmpzXG4gKiovIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5cclxuaW1wb3J0IHsgandzLCBLRVlVVElMIGFzIEtleVV0aWwsIFg1MDksIGNyeXB0bywgaGV4dG9iNjR1IH0gZnJvbSAnanNyc2FzaWduJztcclxuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XHJcblxyXG5jb25zdCBBbGxvd2VkU2lnbmluZ0FsZ3MgPSBbJ1JTMjU2JywgJ1JTMzg0JywgJ1JTNTEyJywgJ1BTMjU2JywgJ1BTMzg0JywgJ1BTNTEyJywgJ0VTMjU2JywgJ0VTMzg0JywgJ0VTNTEyJ107XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBKb3NlVXRpbCB7XHJcblxyXG4gICAgc3RhdGljIHBhcnNlSnd0KGp3dCkge1xyXG4gICAgICAgIExvZy5pbmZvKFwiSm9zZVV0aWwucGFyc2VKd3RcIik7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIHRva2VuID0gandzLkpXUy5wYXJzZShqd3QpO1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgaGVhZGVyOiB0b2tlbi5oZWFkZXJPYmosXHJcbiAgICAgICAgICAgICAgICBwYXlsb2FkOiB0b2tlbi5wYXlsb2FkT2JqXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgdmFsaWRhdGVKd3Qoand0LCBrZXksIGlzc3VlciwgYXVkaWVuY2UsIGNsb2NrU2tldywgbm93KSB7XHJcbiAgICAgICAgTG9nLmluZm8oXCJKb3NlVXRpbC52YWxpZGF0ZUp3dFwiKTtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGtleS5rdHkgPT09IFwiUlNBXCIpIHtcclxuICAgICAgICAgICAgICAgIGlmIChrZXkuZSAmJiBrZXkubikge1xyXG4gICAgICAgICAgICAgICAgICAgIGtleSA9IEtleVV0aWwuZ2V0S2V5KGtleSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChrZXkueDVjICYmIGtleS54NWMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAga2V5ID0gS2V5VXRpbC5nZXRLZXkoWDUwOS5nZXRQdWJsaWNLZXlGcm9tQ2VydFBFTShrZXkueDVjWzBdKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJSU0Ega2V5IG1pc3Npbmcga2V5IG1hdGVyaWFsXCIsIGtleSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIlJTQSBrZXkgbWlzc2luZyBrZXkgbWF0ZXJpYWxcIikpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGtleS5rdHkgPT09IFwiRUNcIikge1xyXG4gICAgICAgICAgICAgICAgaWYgKGtleS5jcnYgJiYga2V5LnggJiYga2V5LnkpIHtcclxuICAgICAgICAgICAgICAgICAgICBrZXkgPSBLZXlVdGlsLmdldEtleShrZXkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgTG9nLmVycm9yKFwiRUMga2V5IG1pc3Npbmcga2V5IG1hdGVyaWFsXCIsIGtleSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkVDIGtleSBtaXNzaW5nIGtleSBtYXRlcmlhbFwiKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJVbnN1cHBvcnRlZCBrZXkgdHlwZVwiLCBrZXkgJiYga2V5Lmt0eSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiVW5zdXBwb3J0ZWQga2V5IHR5cGU6IFwiICsga2V5ICYmIGtleS5rdHkpKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIEpvc2VVdGlsLl92YWxpZGF0ZUp3dChqd3QsIGtleSwgaXNzdWVyLCBhdWRpZW5jZSwgY2xvY2tTa2V3LCBub3cpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoZSAmJiBlLm1lc3NhZ2UgfHwgZSk7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcIkpXVCB2YWxpZGF0aW9uIGZhaWxlZFwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIF92YWxpZGF0ZUp3dChqd3QsIGtleSwgaXNzdWVyLCBhdWRpZW5jZSwgY2xvY2tTa2V3LCBub3cpIHtcclxuICAgICAgICBMb2cuaW5mbyhcIkpvc2VVdGlsLl92YWxpZGF0ZUp3dFwiKTtcclxuXHJcbiAgICAgICAgaWYgKCFjbG9ja1NrZXcpIHtcclxuICAgICAgICAgICAgY2xvY2tTa2V3ID0gMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghbm93KSB7XHJcbiAgICAgICAgICAgIG5vdyA9IHBhcnNlSW50KERhdGUubm93KCkgLyAxMDAwKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBwYXlsb2FkID0gSm9zZVV0aWwucGFyc2VKd3Qoand0KS5wYXlsb2FkO1xyXG5cclxuICAgICAgICBpZiAocGF5bG9hZC5pc3MgIT09IGlzc3Vlcikge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJJbnZhbGlkIGlzc3VlciBpbiB0b2tlblwiLCBwYXlsb2FkLmlzcyk7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJJbnZhbGlkIGlzc3VlciBpbiB0b2tlbjogXCIgKyBwYXlsb2FkLmlzcykpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHBheWxvYWQuYXVkICE9PSBhdWRpZW5jZSkge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJJbnZhbGlkIGF1ZGllbmNlIGluIHRva2VuXCIsIHBheWxvYWQuYXVkKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkludmFsaWQgYXVkaWVuY2UgaW4gdG9rZW46IFwiICsgcGF5bG9hZC5hdWQpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBsb3dlck5vdyA9IG5vdyArIGNsb2NrU2tldztcclxuICAgICAgICB2YXIgdXBwZXJOb3cgPSBub3cgLSBjbG9ja1NrZXc7XHJcblxyXG4gICAgICAgIGlmIChsb3dlck5vdyA8IHBheWxvYWQuaWF0KSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcImlhdCBpcyBpbiB0aGUgZnV0dXJlXCIsIHBheWxvYWQuaWF0KTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcImlhdCBpcyBpbiB0aGUgZnV0dXJlOiBcIiArIHBheWxvYWQuaWF0KSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAobG93ZXJOb3cgPCBwYXlsb2FkLm5iZikge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJuYmYgaXMgaW4gdGhlIGZ1dHVyZVwiLCBwYXlsb2FkLm5iZik7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJuYmYgaXMgaW4gdGhlIGZ1dHVyZTogXCIgKyBwYXlsb2FkLm5iZikpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHBheWxvYWQuZXhwIDwgdXBwZXJOb3cpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiZXhwIGlzIGluIHRoZSBwYXN0XCIsIHBheWxvYWQuZXhwKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcImV4cCBpcyBpbiB0aGUgcGFzdDpcIiArIHBheWxvYWQuZXhwKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAoIWp3cy5KV1MudmVyaWZ5KGp3dCwga2V5LCBBbGxvd2VkU2lnbmluZ0FsZ3MpKSB7XHJcbiAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJzaWduYXR1cmUgdmFsaWRhdGlvbiBmYWlsZWRcIik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwic2lnbmF0dXJlIHZhbGlkYXRpb24gZmFpbGVkXCIpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoZSAmJiBlLm1lc3NhZ2UgfHwgZSk7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJzaWduYXR1cmUgdmFsaWRhdGlvbiBmYWlsZWRcIikpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBoYXNoU3RyaW5nKHZhbHVlLCBhbGcpIHtcclxuICAgICAgICBMb2cuaW5mbyhcIkpvc2VVdGlsLmhhc2hTdHJpbmdcIiwgdmFsdWUsIGFsZyk7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmV0dXJuIGNyeXB0by5VdGlsLmhhc2hTdHJpbmcodmFsdWUsIGFsZyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGhleFRvQmFzZTY0VXJsKHZhbHVlKSB7XHJcbiAgICAgICAgTG9nLmluZm8oXCJKb3NlVXRpbC5oZXhUb0Jhc2U2NFVybFwiLCB2YWx1ZSk7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmV0dXJuIGhleHRvYjY0dSh2YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvSm9zZVV0aWwuanNcbiAqKi8iLCJcbnZhciBuYXZpZ2F0b3IgPSB7fTtcbm5hdmlnYXRvci51c2VyQWdlbnQgPSBmYWxzZTtcblxudmFyIHdpbmRvdyA9IHt9O1xuLypcbiAqIGpzcnNhc2lnbiA1LjAuNyAoYykgMjAxMC0yMDE2IEtlbmppIFVydXNoaW1hIHwga2p1ci5naXRodWIuY29tL2pzcnNhc2lnbi9saWNlbnNlXG4gKi9cblxuLypcbnlhaG9vLW1pbi5qc1xuQ29weXJpZ2h0IChjKSAyMDExLCBZYWhvbyEgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuQ29kZSBsaWNlbnNlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2U6XG5odHRwOi8vZGV2ZWxvcGVyLnlhaG9vLmNvbS95dWkvbGljZW5zZS5odG1sXG52ZXJzaW9uOiAyLjkuMFxuKi9cbmlmKHR5cGVvZiBZQUhPTz09XCJ1bmRlZmluZWRcInx8IVlBSE9PKXt2YXIgWUFIT089e307fVlBSE9PLm5hbWVzcGFjZT1mdW5jdGlvbigpe3ZhciBiPWFyZ3VtZW50cyxnPW51bGwsZSxjLGY7Zm9yKGU9MDtlPGIubGVuZ3RoO2U9ZSsxKXtmPShcIlwiK2JbZV0pLnNwbGl0KFwiLlwiKTtnPVlBSE9PO2ZvcihjPShmWzBdPT1cIllBSE9PXCIpPzE6MDtjPGYubGVuZ3RoO2M9YysxKXtnW2ZbY11dPWdbZltjXV18fHt9O2c9Z1tmW2NdXTt9fXJldHVybiBnO307WUFIT08ubG9nPWZ1bmN0aW9uKGQsYSxjKXt2YXIgYj1ZQUhPTy53aWRnZXQuTG9nZ2VyO2lmKGImJmIubG9nKXtyZXR1cm4gYi5sb2coZCxhLGMpO31lbHNle3JldHVybiBmYWxzZTt9fTtZQUhPTy5yZWdpc3Rlcj1mdW5jdGlvbihhLGYsZSl7dmFyIGs9WUFIT08uZW52Lm1vZHVsZXMsYyxqLGgsZyxkO2lmKCFrW2FdKXtrW2FdPXt2ZXJzaW9uczpbXSxidWlsZHM6W119O31jPWtbYV07aj1lLnZlcnNpb247aD1lLmJ1aWxkO2c9WUFIT08uZW52Lmxpc3RlbmVycztjLm5hbWU9YTtjLnZlcnNpb249ajtjLmJ1aWxkPWg7Yy52ZXJzaW9ucy5wdXNoKGopO2MuYnVpbGRzLnB1c2goaCk7Yy5tYWluQ2xhc3M9Zjtmb3IoZD0wO2Q8Zy5sZW5ndGg7ZD1kKzEpe2dbZF0oYyk7fWlmKGYpe2YuVkVSU0lPTj1qO2YuQlVJTEQ9aDt9ZWxzZXtZQUhPTy5sb2coXCJtYWluQ2xhc3MgaXMgdW5kZWZpbmVkIGZvciBtb2R1bGUgXCIrYSxcIndhcm5cIik7fX07WUFIT08uZW52PVlBSE9PLmVudnx8e21vZHVsZXM6W10sbGlzdGVuZXJzOltdfTtZQUhPTy5lbnYuZ2V0VmVyc2lvbj1mdW5jdGlvbihhKXtyZXR1cm4gWUFIT08uZW52Lm1vZHVsZXNbYV18fG51bGw7fTtZQUhPTy5lbnYucGFyc2VVQT1mdW5jdGlvbihkKXt2YXIgZT1mdW5jdGlvbihpKXt2YXIgaj0wO3JldHVybiBwYXJzZUZsb2F0KGkucmVwbGFjZSgvXFwuL2csZnVuY3Rpb24oKXtyZXR1cm4oaisrPT0xKT9cIlwiOlwiLlwiO30pKTt9LGg9bmF2aWdhdG9yLGc9e2llOjAsb3BlcmE6MCxnZWNrbzowLHdlYmtpdDowLGNocm9tZTowLG1vYmlsZTpudWxsLGFpcjowLGlwYWQ6MCxpcGhvbmU6MCxpcG9kOjAsaW9zOm51bGwsYW5kcm9pZDowLHdlYm9zOjAsY2FqYTpoJiZoLmNhamFWZXJzaW9uLHNlY3VyZTpmYWxzZSxvczpudWxsfSxjPWR8fChuYXZpZ2F0b3ImJm5hdmlnYXRvci51c2VyQWdlbnQpLGY9d2luZG93JiZ3aW5kb3cubG9jYXRpb24sYj1mJiZmLmhyZWYsYTtnLnNlY3VyZT1iJiYoYi50b0xvd2VyQ2FzZSgpLmluZGV4T2YoXCJodHRwc1wiKT09PTApO2lmKGMpe2lmKCgvd2luZG93c3x3aW4zMi9pKS50ZXN0KGMpKXtnLm9zPVwid2luZG93c1wiO31lbHNle2lmKCgvbWFjaW50b3NoL2kpLnRlc3QoYykpe2cub3M9XCJtYWNpbnRvc2hcIjt9ZWxzZXtpZigoL3JoaW5vL2kpLnRlc3QoYykpe2cub3M9XCJyaGlub1wiO319fWlmKCgvS0hUTUwvKS50ZXN0KGMpKXtnLndlYmtpdD0xO31hPWMubWF0Y2goL0FwcGxlV2ViS2l0XFwvKFteXFxzXSopLyk7aWYoYSYmYVsxXSl7Zy53ZWJraXQ9ZShhWzFdKTtpZigvIE1vYmlsZVxcLy8udGVzdChjKSl7Zy5tb2JpbGU9XCJBcHBsZVwiO2E9Yy5tYXRjaCgvT1MgKFteXFxzXSopLyk7aWYoYSYmYVsxXSl7YT1lKGFbMV0ucmVwbGFjZShcIl9cIixcIi5cIikpO31nLmlvcz1hO2cuaXBhZD1nLmlwb2Q9Zy5pcGhvbmU9MDthPWMubWF0Y2goL2lQYWR8aVBvZHxpUGhvbmUvKTtpZihhJiZhWzBdKXtnW2FbMF0udG9Mb3dlckNhc2UoKV09Zy5pb3M7fX1lbHNle2E9Yy5tYXRjaCgvTm9raWFOW15cXC9dKnxBbmRyb2lkIFxcZFxcLlxcZHx3ZWJPU1xcL1xcZFxcLlxcZC8pO2lmKGEpe2cubW9iaWxlPWFbMF07fWlmKC93ZWJPUy8udGVzdChjKSl7Zy5tb2JpbGU9XCJXZWJPU1wiO2E9Yy5tYXRjaCgvd2ViT1NcXC8oW15cXHNdKik7Lyk7aWYoYSYmYVsxXSl7Zy53ZWJvcz1lKGFbMV0pO319aWYoLyBBbmRyb2lkLy50ZXN0KGMpKXtnLm1vYmlsZT1cIkFuZHJvaWRcIjthPWMubWF0Y2goL0FuZHJvaWQgKFteXFxzXSopOy8pO2lmKGEmJmFbMV0pe2cuYW5kcm9pZD1lKGFbMV0pO319fWE9Yy5tYXRjaCgvQ2hyb21lXFwvKFteXFxzXSopLyk7aWYoYSYmYVsxXSl7Zy5jaHJvbWU9ZShhWzFdKTt9ZWxzZXthPWMubWF0Y2goL0Fkb2JlQUlSXFwvKFteXFxzXSopLyk7aWYoYSl7Zy5haXI9YVswXTt9fX1pZighZy53ZWJraXQpe2E9Yy5tYXRjaCgvT3BlcmFbXFxzXFwvXShbXlxcc10qKS8pO2lmKGEmJmFbMV0pe2cub3BlcmE9ZShhWzFdKTthPWMubWF0Y2goL1ZlcnNpb25cXC8oW15cXHNdKikvKTtpZihhJiZhWzFdKXtnLm9wZXJhPWUoYVsxXSk7fWE9Yy5tYXRjaCgvT3BlcmEgTWluaVteO10qLyk7aWYoYSl7Zy5tb2JpbGU9YVswXTt9fWVsc2V7YT1jLm1hdGNoKC9NU0lFXFxzKFteO10qKS8pO2lmKGEmJmFbMV0pe2cuaWU9ZShhWzFdKTt9ZWxzZXthPWMubWF0Y2goL0dlY2tvXFwvKFteXFxzXSopLyk7aWYoYSl7Zy5nZWNrbz0xO2E9Yy5tYXRjaCgvcnY6KFteXFxzXFwpXSopLyk7aWYoYSYmYVsxXSl7Zy5nZWNrbz1lKGFbMV0pO319fX19fXJldHVybiBnO307WUFIT08uZW52LnVhPVlBSE9PLmVudi5wYXJzZVVBKCk7KGZ1bmN0aW9uKCl7WUFIT08ubmFtZXNwYWNlKFwidXRpbFwiLFwid2lkZ2V0XCIsXCJleGFtcGxlXCIpO2lmKFwidW5kZWZpbmVkXCIhPT10eXBlb2YgWUFIT09fY29uZmlnKXt2YXIgYj1ZQUhPT19jb25maWcubGlzdGVuZXIsYT1ZQUhPTy5lbnYubGlzdGVuZXJzLGQ9dHJ1ZSxjO2lmKGIpe2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspe2lmKGFbY109PWIpe2Q9ZmFsc2U7YnJlYWs7fX1pZihkKXthLnB1c2goYik7fX19fSkoKTtZQUhPTy5sYW5nPVlBSE9PLmxhbmd8fHt9OyhmdW5jdGlvbigpe3ZhciBmPVlBSE9PLmxhbmcsYT1PYmplY3QucHJvdG90eXBlLGM9XCJbb2JqZWN0IEFycmF5XVwiLGg9XCJbb2JqZWN0IEZ1bmN0aW9uXVwiLGk9XCJbb2JqZWN0IE9iamVjdF1cIixiPVtdLGc9e1wiJlwiOlwiJmFtcDtcIixcIjxcIjpcIiZsdDtcIixcIj5cIjpcIiZndDtcIiwnXCInOlwiJnF1b3Q7XCIsXCInXCI6XCImI3gyNztcIixcIi9cIjpcIiYjeDJGO1wiLFwiYFwiOlwiJiN4NjA7XCJ9LGQ9W1widG9TdHJpbmdcIixcInZhbHVlT2ZcIl0sZT17aXNBcnJheTpmdW5jdGlvbihqKXtyZXR1cm4gYS50b1N0cmluZy5hcHBseShqKT09PWM7fSxpc0Jvb2xlYW46ZnVuY3Rpb24oail7cmV0dXJuIHR5cGVvZiBqPT09XCJib29sZWFuXCI7fSxpc0Z1bmN0aW9uOmZ1bmN0aW9uKGope3JldHVybih0eXBlb2Ygaj09PVwiZnVuY3Rpb25cIil8fGEudG9TdHJpbmcuYXBwbHkoaik9PT1oO30saXNOdWxsOmZ1bmN0aW9uKGope3JldHVybiBqPT09bnVsbDt9LGlzTnVtYmVyOmZ1bmN0aW9uKGope3JldHVybiB0eXBlb2Ygaj09PVwibnVtYmVyXCImJmlzRmluaXRlKGopO30saXNPYmplY3Q6ZnVuY3Rpb24oail7cmV0dXJuKGomJih0eXBlb2Ygaj09PVwib2JqZWN0XCJ8fGYuaXNGdW5jdGlvbihqKSkpfHxmYWxzZTt9LGlzU3RyaW5nOmZ1bmN0aW9uKGope3JldHVybiB0eXBlb2Ygaj09PVwic3RyaW5nXCI7fSxpc1VuZGVmaW5lZDpmdW5jdGlvbihqKXtyZXR1cm4gdHlwZW9mIGo9PT1cInVuZGVmaW5lZFwiO30sX0lFRW51bUZpeDooWUFIT08uZW52LnVhLmllKT9mdW5jdGlvbihsLGspe3ZhciBqLG4sbTtmb3Ioaj0wO2o8ZC5sZW5ndGg7aj1qKzEpe249ZFtqXTttPWtbbl07aWYoZi5pc0Z1bmN0aW9uKG0pJiZtIT1hW25dKXtsW25dPW07fX19OmZ1bmN0aW9uKCl7fSxlc2NhcGVIVE1MOmZ1bmN0aW9uKGope3JldHVybiBqLnJlcGxhY2UoL1smPD5cIidcXC9gXS9nLGZ1bmN0aW9uKGspe3JldHVybiBnW2tdO30pO30sZXh0ZW5kOmZ1bmN0aW9uKG0sbixsKXtpZighbnx8IW0pe3Rocm93IG5ldyBFcnJvcihcImV4dGVuZCBmYWlsZWQsIHBsZWFzZSBjaGVjayB0aGF0IFwiK1wiYWxsIGRlcGVuZGVuY2llcyBhcmUgaW5jbHVkZWQuXCIpO312YXIgaz1mdW5jdGlvbigpe30sajtrLnByb3RvdHlwZT1uLnByb3RvdHlwZTttLnByb3RvdHlwZT1uZXcgaygpO20ucHJvdG90eXBlLmNvbnN0cnVjdG9yPW07bS5zdXBlcmNsYXNzPW4ucHJvdG90eXBlO2lmKG4ucHJvdG90eXBlLmNvbnN0cnVjdG9yPT1hLmNvbnN0cnVjdG9yKXtuLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1uO31pZihsKXtmb3IoaiBpbiBsKXtpZihmLmhhc093blByb3BlcnR5KGwsaikpe20ucHJvdG90eXBlW2pdPWxbal07fX1mLl9JRUVudW1GaXgobS5wcm90b3R5cGUsbCk7fX0sYXVnbWVudE9iamVjdDpmdW5jdGlvbihuLG0pe2lmKCFtfHwhbil7dGhyb3cgbmV3IEVycm9yKFwiQWJzb3JiIGZhaWxlZCwgdmVyaWZ5IGRlcGVuZGVuY2llcy5cIik7fXZhciBqPWFyZ3VtZW50cyxsLG8saz1qWzJdO2lmKGsmJmshPT10cnVlKXtmb3IobD0yO2w8ai5sZW5ndGg7bD1sKzEpe25baltsXV09bVtqW2xdXTt9fWVsc2V7Zm9yKG8gaW4gbSl7aWYoa3x8IShvIGluIG4pKXtuW29dPW1bb107fX1mLl9JRUVudW1GaXgobixtKTt9cmV0dXJuIG47fSxhdWdtZW50UHJvdG86ZnVuY3Rpb24obSxsKXtpZighbHx8IW0pe3Rocm93IG5ldyBFcnJvcihcIkF1Z21lbnQgZmFpbGVkLCB2ZXJpZnkgZGVwZW5kZW5jaWVzLlwiKTt9dmFyIGo9W20ucHJvdG90eXBlLGwucHJvdG90eXBlXSxrO2ZvcihrPTI7azxhcmd1bWVudHMubGVuZ3RoO2s9aysxKXtqLnB1c2goYXJndW1lbnRzW2tdKTt9Zi5hdWdtZW50T2JqZWN0LmFwcGx5KHRoaXMsaik7cmV0dXJuIG07fSxkdW1wOmZ1bmN0aW9uKGoscCl7dmFyIGwsbixyPVtdLHQ9XCJ7Li4ufVwiLGs9XCJmKCl7Li4ufVwiLHE9XCIsIFwiLG09XCIgPT4gXCI7aWYoIWYuaXNPYmplY3Qoaikpe3JldHVybiBqK1wiXCI7fWVsc2V7aWYoaiBpbnN0YW5jZW9mIERhdGV8fChcIm5vZGVUeXBlXCIgaW4gaiYmXCJ0YWdOYW1lXCIgaW4gaikpe3JldHVybiBqO31lbHNle2lmKGYuaXNGdW5jdGlvbihqKSl7cmV0dXJuIGs7fX19cD0oZi5pc051bWJlcihwKSk/cDozO2lmKGYuaXNBcnJheShqKSl7ci5wdXNoKFwiW1wiKTtmb3IobD0wLG49ai5sZW5ndGg7bDxuO2w9bCsxKXtpZihmLmlzT2JqZWN0KGpbbF0pKXtyLnB1c2goKHA+MCk/Zi5kdW1wKGpbbF0scC0xKTp0KTt9ZWxzZXtyLnB1c2goaltsXSk7fXIucHVzaChxKTt9aWYoci5sZW5ndGg+MSl7ci5wb3AoKTt9ci5wdXNoKFwiXVwiKTt9ZWxzZXtyLnB1c2goXCJ7XCIpO2ZvcihsIGluIGope2lmKGYuaGFzT3duUHJvcGVydHkoaixsKSl7ci5wdXNoKGwrbSk7aWYoZi5pc09iamVjdChqW2xdKSl7ci5wdXNoKChwPjApP2YuZHVtcChqW2xdLHAtMSk6dCk7fWVsc2V7ci5wdXNoKGpbbF0pO31yLnB1c2gocSk7fX1pZihyLmxlbmd0aD4xKXtyLnBvcCgpO31yLnB1c2goXCJ9XCIpO31yZXR1cm4gci5qb2luKFwiXCIpO30sc3Vic3RpdHV0ZTpmdW5jdGlvbih4LHksRSxsKXt2YXIgRCxDLEIsRyx0LHUsRj1bXSxwLHo9eC5sZW5ndGgsQT1cImR1bXBcIixyPVwiIFwiLHE9XCJ7XCIsbT1cIn1cIixuLHc7Zm9yKDs7KXtEPXgubGFzdEluZGV4T2YocSx6KTtpZihEPDApe2JyZWFrO31DPXguaW5kZXhPZihtLEQpO2lmKEQrMT5DKXticmVhazt9cD14LnN1YnN0cmluZyhEKzEsQyk7Rz1wO3U9bnVsbDtCPUcuaW5kZXhPZihyKTtpZihCPi0xKXt1PUcuc3Vic3RyaW5nKEIrMSk7Rz1HLnN1YnN0cmluZygwLEIpO310PXlbR107aWYoRSl7dD1FKEcsdCx1KTt9aWYoZi5pc09iamVjdCh0KSl7aWYoZi5pc0FycmF5KHQpKXt0PWYuZHVtcCh0LHBhcnNlSW50KHUsMTApKTt9ZWxzZXt1PXV8fFwiXCI7bj11LmluZGV4T2YoQSk7aWYobj4tMSl7dT11LnN1YnN0cmluZyg0KTt9dz10LnRvU3RyaW5nKCk7aWYodz09PWl8fG4+LTEpe3Q9Zi5kdW1wKHQscGFyc2VJbnQodSwxMCkpO31lbHNle3Q9dzt9fX1lbHNle2lmKCFmLmlzU3RyaW5nKHQpJiYhZi5pc051bWJlcih0KSl7dD1cIn4tXCIrRi5sZW5ndGgrXCItflwiO0ZbRi5sZW5ndGhdPXA7fX14PXguc3Vic3RyaW5nKDAsRCkrdCt4LnN1YnN0cmluZyhDKzEpO2lmKGw9PT1mYWxzZSl7ej1ELTE7fX1mb3IoRD1GLmxlbmd0aC0xO0Q+PTA7RD1ELTEpe3g9eC5yZXBsYWNlKG5ldyBSZWdFeHAoXCJ+LVwiK0QrXCItflwiKSxcIntcIitGW0RdK1wifVwiLFwiZ1wiKTt9cmV0dXJuIHg7fSx0cmltOmZ1bmN0aW9uKGope3RyeXtyZXR1cm4gai5yZXBsYWNlKC9eXFxzK3xcXHMrJC9nLFwiXCIpO31jYXRjaChrKXtyZXR1cm4gajtcbn19LG1lcmdlOmZ1bmN0aW9uKCl7dmFyIG49e30saz1hcmd1bWVudHMsaj1rLmxlbmd0aCxtO2ZvcihtPTA7bTxqO209bSsxKXtmLmF1Z21lbnRPYmplY3QobixrW21dLHRydWUpO31yZXR1cm4gbjt9LGxhdGVyOmZ1bmN0aW9uKHQsayx1LG4scCl7dD10fHwwO2s9a3x8e307dmFyIGw9dSxzPW4scSxqO2lmKGYuaXNTdHJpbmcodSkpe2w9a1t1XTt9aWYoIWwpe3Rocm93IG5ldyBUeXBlRXJyb3IoXCJtZXRob2QgdW5kZWZpbmVkXCIpO31pZighZi5pc1VuZGVmaW5lZChuKSYmIWYuaXNBcnJheShzKSl7cz1bbl07fXE9ZnVuY3Rpb24oKXtsLmFwcGx5KGssc3x8Yik7fTtqPShwKT9zZXRJbnRlcnZhbChxLHQpOnNldFRpbWVvdXQocSx0KTtyZXR1cm57aW50ZXJ2YWw6cCxjYW5jZWw6ZnVuY3Rpb24oKXtpZih0aGlzLmludGVydmFsKXtjbGVhckludGVydmFsKGopO31lbHNle2NsZWFyVGltZW91dChqKTt9fX07fSxpc1ZhbHVlOmZ1bmN0aW9uKGope3JldHVybihmLmlzT2JqZWN0KGopfHxmLmlzU3RyaW5nKGopfHxmLmlzTnVtYmVyKGopfHxmLmlzQm9vbGVhbihqKSk7fX07Zi5oYXNPd25Qcm9wZXJ0eT0oYS5oYXNPd25Qcm9wZXJ0eSk/ZnVuY3Rpb24oaixrKXtyZXR1cm4gaiYmai5oYXNPd25Qcm9wZXJ0eSYmai5oYXNPd25Qcm9wZXJ0eShrKTt9OmZ1bmN0aW9uKGosayl7cmV0dXJuICFmLmlzVW5kZWZpbmVkKGpba10pJiZqLmNvbnN0cnVjdG9yLnByb3RvdHlwZVtrXSE9PWpba107fTtlLmF1Z21lbnRPYmplY3QoZixlLHRydWUpO1lBSE9PLnV0aWwuTGFuZz1mO2YuYXVnbWVudD1mLmF1Z21lbnRQcm90bztZQUhPTy5hdWdtZW50PWYuYXVnbWVudFByb3RvO1lBSE9PLmV4dGVuZD1mLmV4dGVuZDt9KSgpO1lBSE9PLnJlZ2lzdGVyKFwieWFob29cIixZQUhPTyx7dmVyc2lvbjpcIjIuOS4wXCIsYnVpbGQ6XCIyODAwXCJ9KTtcblxuLyohIENyeXB0b0pTIHYzLjEuMiBjb3JlLWZpeC5qc1xuICogY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzXG4gKiAoYykgMjAwOS0yMDEzIGJ5IEplZmYgTW90dC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIGNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qcy93aWtpL0xpY2Vuc2VcbiAqIFRISVMgSVMgRklYIG9mICdjb3JlLmpzJyB0byBmaXggSG1hYyBpc3N1ZS5cbiAqIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzL2lzc3Vlcy9kZXRhaWw/aWQ9ODRcbiAqIGh0dHBzOi8vY3J5cHRvLWpzLmdvb2dsZWNvZGUuY29tL3N2bi1oaXN0b3J5L3I2NjcvYnJhbmNoZXMvMy54L3NyYy9jb3JlLmpzXG4gKi9cbnZhciBDcnlwdG9KUz1DcnlwdG9KU3x8KGZ1bmN0aW9uKGUsZyl7dmFyIGE9e307dmFyIGI9YS5saWI9e307dmFyIGo9Yi5CYXNlPShmdW5jdGlvbigpe2Z1bmN0aW9uIG4oKXt9cmV0dXJue2V4dGVuZDpmdW5jdGlvbihwKXtuLnByb3RvdHlwZT10aGlzO3ZhciBvPW5ldyBuKCk7aWYocCl7by5taXhJbihwKX1pZighby5oYXNPd25Qcm9wZXJ0eShcImluaXRcIikpe28uaW5pdD1mdW5jdGlvbigpe28uJHN1cGVyLmluaXQuYXBwbHkodGhpcyxhcmd1bWVudHMpfX1vLmluaXQucHJvdG90eXBlPW87by4kc3VwZXI9dGhpcztyZXR1cm4gb30sY3JlYXRlOmZ1bmN0aW9uKCl7dmFyIG89dGhpcy5leHRlbmQoKTtvLmluaXQuYXBwbHkobyxhcmd1bWVudHMpO3JldHVybiBvfSxpbml0OmZ1bmN0aW9uKCl7fSxtaXhJbjpmdW5jdGlvbihwKXtmb3IodmFyIG8gaW4gcCl7aWYocC5oYXNPd25Qcm9wZXJ0eShvKSl7dGhpc1tvXT1wW29dfX1pZihwLmhhc093blByb3BlcnR5KFwidG9TdHJpbmdcIikpe3RoaXMudG9TdHJpbmc9cC50b1N0cmluZ319LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW5pdC5wcm90b3R5cGUuZXh0ZW5kKHRoaXMpfX19KCkpO3ZhciBsPWIuV29yZEFycmF5PWouZXh0ZW5kKHtpbml0OmZ1bmN0aW9uKG8sbil7bz10aGlzLndvcmRzPW98fFtdO2lmKG4hPWcpe3RoaXMuc2lnQnl0ZXM9bn1lbHNle3RoaXMuc2lnQnl0ZXM9by5sZW5ndGgqNH19LHRvU3RyaW5nOmZ1bmN0aW9uKG4pe3JldHVybihufHxoKS5zdHJpbmdpZnkodGhpcyl9LGNvbmNhdDpmdW5jdGlvbih0KXt2YXIgcT10aGlzLndvcmRzO3ZhciBwPXQud29yZHM7dmFyIG49dGhpcy5zaWdCeXRlczt2YXIgcz10LnNpZ0J5dGVzO3RoaXMuY2xhbXAoKTtpZihuJTQpe2Zvcih2YXIgcj0wO3I8cztyKyspe3ZhciBvPShwW3I+Pj4yXT4+PigyNC0ociU0KSo4KSkmMjU1O3FbKG4rcik+Pj4yXXw9bzw8KDI0LSgobityKSU0KSo4KX19ZWxzZXtmb3IodmFyIHI9MDtyPHM7cis9NCl7cVsobityKT4+PjJdPXBbcj4+PjJdfX10aGlzLnNpZ0J5dGVzKz1zO3JldHVybiB0aGlzfSxjbGFtcDpmdW5jdGlvbigpe3ZhciBvPXRoaXMud29yZHM7dmFyIG49dGhpcy5zaWdCeXRlcztvW24+Pj4yXSY9NDI5NDk2NzI5NTw8KDMyLShuJTQpKjgpO28ubGVuZ3RoPWUuY2VpbChuLzQpfSxjbG9uZTpmdW5jdGlvbigpe3ZhciBuPWouY2xvbmUuY2FsbCh0aGlzKTtuLndvcmRzPXRoaXMud29yZHMuc2xpY2UoMCk7cmV0dXJuIG59LHJhbmRvbTpmdW5jdGlvbihwKXt2YXIgbz1bXTtmb3IodmFyIG49MDtuPHA7bis9NCl7by5wdXNoKChlLnJhbmRvbSgpKjQyOTQ5NjcyOTYpfDApfXJldHVybiBuZXcgbC5pbml0KG8scCl9fSk7dmFyIG09YS5lbmM9e307dmFyIGg9bS5IZXg9e3N0cmluZ2lmeTpmdW5jdGlvbihwKXt2YXIgcj1wLndvcmRzO3ZhciBvPXAuc2lnQnl0ZXM7dmFyIHE9W107Zm9yKHZhciBuPTA7bjxvO24rKyl7dmFyIHM9KHJbbj4+PjJdPj4+KDI0LShuJTQpKjgpKSYyNTU7cS5wdXNoKChzPj4+NCkudG9TdHJpbmcoMTYpKTtxLnB1c2goKHMmMTUpLnRvU3RyaW5nKDE2KSl9cmV0dXJuIHEuam9pbihcIlwiKX0scGFyc2U6ZnVuY3Rpb24ocCl7dmFyIG49cC5sZW5ndGg7dmFyIHE9W107Zm9yKHZhciBvPTA7bzxuO28rPTIpe3Fbbz4+PjNdfD1wYXJzZUludChwLnN1YnN0cihvLDIpLDE2KTw8KDI0LShvJTgpKjQpfXJldHVybiBuZXcgbC5pbml0KHEsbi8yKX19O3ZhciBkPW0uTGF0aW4xPXtzdHJpbmdpZnk6ZnVuY3Rpb24ocSl7dmFyIHI9cS53b3Jkczt2YXIgcD1xLnNpZ0J5dGVzO3ZhciBuPVtdO2Zvcih2YXIgbz0wO288cDtvKyspe3ZhciBzPShyW28+Pj4yXT4+PigyNC0obyU0KSo4KSkmMjU1O24ucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKHMpKX1yZXR1cm4gbi5qb2luKFwiXCIpfSxwYXJzZTpmdW5jdGlvbihwKXt2YXIgbj1wLmxlbmd0aDt2YXIgcT1bXTtmb3IodmFyIG89MDtvPG47bysrKXtxW28+Pj4yXXw9KHAuY2hhckNvZGVBdChvKSYyNTUpPDwoMjQtKG8lNCkqOCl9cmV0dXJuIG5ldyBsLmluaXQocSxuKX19O3ZhciBjPW0uVXRmOD17c3RyaW5naWZ5OmZ1bmN0aW9uKG4pe3RyeXtyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGVzY2FwZShkLnN0cmluZ2lmeShuKSkpfWNhdGNoKG8pe3Rocm93IG5ldyBFcnJvcihcIk1hbGZvcm1lZCBVVEYtOCBkYXRhXCIpfX0scGFyc2U6ZnVuY3Rpb24obil7cmV0dXJuIGQucGFyc2UodW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KG4pKSl9fTt2YXIgaT1iLkJ1ZmZlcmVkQmxvY2tBbGdvcml0aG09ai5leHRlbmQoe3Jlc2V0OmZ1bmN0aW9uKCl7dGhpcy5fZGF0YT1uZXcgbC5pbml0KCk7dGhpcy5fbkRhdGFCeXRlcz0wfSxfYXBwZW5kOmZ1bmN0aW9uKG4pe2lmKHR5cGVvZiBuPT1cInN0cmluZ1wiKXtuPWMucGFyc2Uobil9dGhpcy5fZGF0YS5jb25jYXQobik7dGhpcy5fbkRhdGFCeXRlcys9bi5zaWdCeXRlc30sX3Byb2Nlc3M6ZnVuY3Rpb24odyl7dmFyIHE9dGhpcy5fZGF0YTt2YXIgeD1xLndvcmRzO3ZhciBuPXEuc2lnQnl0ZXM7dmFyIHQ9dGhpcy5ibG9ja1NpemU7dmFyIHY9dCo0O3ZhciB1PW4vdjtpZih3KXt1PWUuY2VpbCh1KX1lbHNle3U9ZS5tYXgoKHV8MCktdGhpcy5fbWluQnVmZmVyU2l6ZSwwKX12YXIgcz11KnQ7dmFyIHI9ZS5taW4ocyo0LG4pO2lmKHMpe2Zvcih2YXIgcD0wO3A8cztwKz10KXt0aGlzLl9kb1Byb2Nlc3NCbG9jayh4LHApfXZhciBvPXguc3BsaWNlKDAscyk7cS5zaWdCeXRlcy09cn1yZXR1cm4gbmV3IGwuaW5pdChvLHIpfSxjbG9uZTpmdW5jdGlvbigpe3ZhciBuPWouY2xvbmUuY2FsbCh0aGlzKTtuLl9kYXRhPXRoaXMuX2RhdGEuY2xvbmUoKTtyZXR1cm4gbn0sX21pbkJ1ZmZlclNpemU6MH0pO3ZhciBmPWIuSGFzaGVyPWkuZXh0ZW5kKHtjZmc6ai5leHRlbmQoKSxpbml0OmZ1bmN0aW9uKG4pe3RoaXMuY2ZnPXRoaXMuY2ZnLmV4dGVuZChuKTt0aGlzLnJlc2V0KCl9LHJlc2V0OmZ1bmN0aW9uKCl7aS5yZXNldC5jYWxsKHRoaXMpO3RoaXMuX2RvUmVzZXQoKX0sdXBkYXRlOmZ1bmN0aW9uKG4pe3RoaXMuX2FwcGVuZChuKTt0aGlzLl9wcm9jZXNzKCk7cmV0dXJuIHRoaXN9LGZpbmFsaXplOmZ1bmN0aW9uKG4pe2lmKG4pe3RoaXMuX2FwcGVuZChuKX12YXIgbz10aGlzLl9kb0ZpbmFsaXplKCk7cmV0dXJuIG99LGJsb2NrU2l6ZTo1MTIvMzIsX2NyZWF0ZUhlbHBlcjpmdW5jdGlvbihuKXtyZXR1cm4gZnVuY3Rpb24ocCxvKXtyZXR1cm4gbmV3IG4uaW5pdChvKS5maW5hbGl6ZShwKX19LF9jcmVhdGVIbWFjSGVscGVyOmZ1bmN0aW9uKG4pe3JldHVybiBmdW5jdGlvbihwLG8pe3JldHVybiBuZXcgay5ITUFDLmluaXQobixvKS5maW5hbGl6ZShwKX19fSk7dmFyIGs9YS5hbGdvPXt9O3JldHVybiBhfShNYXRoKSk7XG4vKlxuQ3J5cHRvSlMgdjMuMS4yIHg2NC1jb3JlLW1pbi5qc1xuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzXG4oYykgMjAwOS0yMDEzIGJ5IEplZmYgTW90dC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qcy93aWtpL0xpY2Vuc2VcbiovXG4oZnVuY3Rpb24oZyl7dmFyIGE9Q3J5cHRvSlMsZj1hLmxpYixlPWYuQmFzZSxoPWYuV29yZEFycmF5LGE9YS54NjQ9e307YS5Xb3JkPWUuZXh0ZW5kKHtpbml0OmZ1bmN0aW9uKGIsYyl7dGhpcy5oaWdoPWI7dGhpcy5sb3c9Y319KTthLldvcmRBcnJheT1lLmV4dGVuZCh7aW5pdDpmdW5jdGlvbihiLGMpe2I9dGhpcy53b3Jkcz1ifHxbXTt0aGlzLnNpZ0J5dGVzPWMhPWc/Yzo4KmIubGVuZ3RofSx0b1gzMjpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLndvcmRzLGM9Yi5sZW5ndGgsYT1bXSxkPTA7ZDxjO2QrKyl7dmFyIGU9YltkXTthLnB1c2goZS5oaWdoKTthLnB1c2goZS5sb3cpfXJldHVybiBoLmNyZWF0ZShhLHRoaXMuc2lnQnl0ZXMpfSxjbG9uZTpmdW5jdGlvbigpe2Zvcih2YXIgYj1lLmNsb25lLmNhbGwodGhpcyksYz1iLndvcmRzPXRoaXMud29yZHMuc2xpY2UoMCksYT1jLmxlbmd0aCxkPTA7ZDxhO2QrKyljW2RdPWNbZF0uY2xvbmUoKTtyZXR1cm4gYn19KX0pKCk7XG5cbi8qXG5DcnlwdG9KUyB2My4xLjIgY2lwaGVyLWNvcmUtbWluLmpzXG5jb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanNcbihjKSAyMDA5LTIwMTMgYnkgSmVmZiBNb3R0LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzL3dpa2kvTGljZW5zZVxuKi9cbkNyeXB0b0pTLmxpYi5DaXBoZXJ8fGZ1bmN0aW9uKHUpe3ZhciBnPUNyeXB0b0pTLGY9Zy5saWIsaz1mLkJhc2UsbD1mLldvcmRBcnJheSxxPWYuQnVmZmVyZWRCbG9ja0FsZ29yaXRobSxyPWcuZW5jLkJhc2U2NCx2PWcuYWxnby5FdnBLREYsbj1mLkNpcGhlcj1xLmV4dGVuZCh7Y2ZnOmsuZXh0ZW5kKCksY3JlYXRlRW5jcnlwdG9yOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuY3JlYXRlKHRoaXMuX0VOQ19YRk9STV9NT0RFLGEsYil9LGNyZWF0ZURlY3J5cHRvcjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmNyZWF0ZSh0aGlzLl9ERUNfWEZPUk1fTU9ERSxhLGIpfSxpbml0OmZ1bmN0aW9uKGEsYixjKXt0aGlzLmNmZz10aGlzLmNmZy5leHRlbmQoYyk7dGhpcy5feGZvcm1Nb2RlPWE7dGhpcy5fa2V5PWI7dGhpcy5yZXNldCgpfSxyZXNldDpmdW5jdGlvbigpe3EucmVzZXQuY2FsbCh0aGlzKTt0aGlzLl9kb1Jlc2V0KCl9LHByb2Nlc3M6ZnVuY3Rpb24oYSl7dGhpcy5fYXBwZW5kKGEpO1xucmV0dXJuIHRoaXMuX3Byb2Nlc3MoKX0sZmluYWxpemU6ZnVuY3Rpb24oYSl7YSYmdGhpcy5fYXBwZW5kKGEpO3JldHVybiB0aGlzLl9kb0ZpbmFsaXplKCl9LGtleVNpemU6NCxpdlNpemU6NCxfRU5DX1hGT1JNX01PREU6MSxfREVDX1hGT1JNX01PREU6MixfY3JlYXRlSGVscGVyOmZ1bmN0aW9uKGEpe3JldHVybntlbmNyeXB0OmZ1bmN0aW9uKGIsYyxkKXtyZXR1cm4oXCJzdHJpbmdcIj09dHlwZW9mIGM/czpqKS5lbmNyeXB0KGEsYixjLGQpfSxkZWNyeXB0OmZ1bmN0aW9uKGIsYyxkKXtyZXR1cm4oXCJzdHJpbmdcIj09dHlwZW9mIGM/czpqKS5kZWNyeXB0KGEsYixjLGQpfX19fSk7Zi5TdHJlYW1DaXBoZXI9bi5leHRlbmQoe19kb0ZpbmFsaXplOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Byb2Nlc3MoITApfSxibG9ja1NpemU6MX0pO3ZhciBtPWcubW9kZT17fSx0PWZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzLl9pdjtkP3RoaXMuX2l2PXU6ZD10aGlzLl9wcmV2QmxvY2s7Zm9yKHZhciBlPVxuMDtlPGM7ZSsrKWFbYitlXV49ZFtlXX0saD0oZi5CbG9ja0NpcGhlck1vZGU9ay5leHRlbmQoe2NyZWF0ZUVuY3J5cHRvcjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLkVuY3J5cHRvci5jcmVhdGUoYSxiKX0sY3JlYXRlRGVjcnlwdG9yOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuRGVjcnlwdG9yLmNyZWF0ZShhLGIpfSxpbml0OmZ1bmN0aW9uKGEsYil7dGhpcy5fY2lwaGVyPWE7dGhpcy5faXY9Yn19KSkuZXh0ZW5kKCk7aC5FbmNyeXB0b3I9aC5leHRlbmQoe3Byb2Nlc3NCbG9jazpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuX2NpcGhlcixkPWMuYmxvY2tTaXplO3QuY2FsbCh0aGlzLGEsYixkKTtjLmVuY3J5cHRCbG9jayhhLGIpO3RoaXMuX3ByZXZCbG9jaz1hLnNsaWNlKGIsYitkKX19KTtoLkRlY3J5cHRvcj1oLmV4dGVuZCh7cHJvY2Vzc0Jsb2NrOmZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5fY2lwaGVyLGQ9Yy5ibG9ja1NpemUsZT1hLnNsaWNlKGIsYitkKTtjLmRlY3J5cHRCbG9jayhhLFxuYik7dC5jYWxsKHRoaXMsYSxiLGQpO3RoaXMuX3ByZXZCbG9jaz1lfX0pO209bS5DQkM9aDtoPShnLnBhZD17fSkuUGtjczc9e3BhZDpmdW5jdGlvbihhLGIpe2Zvcih2YXIgYz00KmIsYz1jLWEuc2lnQnl0ZXMlYyxkPWM8PDI0fGM8PDE2fGM8PDh8YyxlPVtdLGY9MDtmPGM7Zis9NCllLnB1c2goZCk7Yz1sLmNyZWF0ZShlLGMpO2EuY29uY2F0KGMpfSx1bnBhZDpmdW5jdGlvbihhKXthLnNpZ0J5dGVzLT1hLndvcmRzW2Euc2lnQnl0ZXMtMT4+PjJdJjI1NX19O2YuQmxvY2tDaXBoZXI9bi5leHRlbmQoe2NmZzpuLmNmZy5leHRlbmQoe21vZGU6bSxwYWRkaW5nOmh9KSxyZXNldDpmdW5jdGlvbigpe24ucmVzZXQuY2FsbCh0aGlzKTt2YXIgYT10aGlzLmNmZyxiPWEuaXYsYT1hLm1vZGU7aWYodGhpcy5feGZvcm1Nb2RlPT10aGlzLl9FTkNfWEZPUk1fTU9ERSl2YXIgYz1hLmNyZWF0ZUVuY3J5cHRvcjtlbHNlIGM9YS5jcmVhdGVEZWNyeXB0b3IsdGhpcy5fbWluQnVmZmVyU2l6ZT0xO1xudGhpcy5fbW9kZT1jLmNhbGwoYSx0aGlzLGImJmIud29yZHMpfSxfZG9Qcm9jZXNzQmxvY2s6ZnVuY3Rpb24oYSxiKXt0aGlzLl9tb2RlLnByb2Nlc3NCbG9jayhhLGIpfSxfZG9GaW5hbGl6ZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuY2ZnLnBhZGRpbmc7aWYodGhpcy5feGZvcm1Nb2RlPT10aGlzLl9FTkNfWEZPUk1fTU9ERSl7YS5wYWQodGhpcy5fZGF0YSx0aGlzLmJsb2NrU2l6ZSk7dmFyIGI9dGhpcy5fcHJvY2VzcyghMCl9ZWxzZSBiPXRoaXMuX3Byb2Nlc3MoITApLGEudW5wYWQoYik7cmV0dXJuIGJ9LGJsb2NrU2l6ZTo0fSk7dmFyIHA9Zi5DaXBoZXJQYXJhbXM9ay5leHRlbmQoe2luaXQ6ZnVuY3Rpb24oYSl7dGhpcy5taXhJbihhKX0sdG9TdHJpbmc6ZnVuY3Rpb24oYSl7cmV0dXJuKGF8fHRoaXMuZm9ybWF0dGVyKS5zdHJpbmdpZnkodGhpcyl9fSksbT0oZy5mb3JtYXQ9e30pLk9wZW5TU0w9e3N0cmluZ2lmeTpmdW5jdGlvbihhKXt2YXIgYj1hLmNpcGhlcnRleHQ7YT1hLnNhbHQ7XG5yZXR1cm4oYT9sLmNyZWF0ZShbMTM5ODg5MzY4NCwxNzAxMDc2ODMxXSkuY29uY2F0KGEpLmNvbmNhdChiKTpiKS50b1N0cmluZyhyKX0scGFyc2U6ZnVuY3Rpb24oYSl7YT1yLnBhcnNlKGEpO3ZhciBiPWEud29yZHM7aWYoMTM5ODg5MzY4ND09YlswXSYmMTcwMTA3NjgzMT09YlsxXSl7dmFyIGM9bC5jcmVhdGUoYi5zbGljZSgyLDQpKTtiLnNwbGljZSgwLDQpO2Euc2lnQnl0ZXMtPTE2fXJldHVybiBwLmNyZWF0ZSh7Y2lwaGVydGV4dDphLHNhbHQ6Y30pfX0saj1mLlNlcmlhbGl6YWJsZUNpcGhlcj1rLmV4dGVuZCh7Y2ZnOmsuZXh0ZW5kKHtmb3JtYXQ6bX0pLGVuY3J5cHQ6ZnVuY3Rpb24oYSxiLGMsZCl7ZD10aGlzLmNmZy5leHRlbmQoZCk7dmFyIGU9YS5jcmVhdGVFbmNyeXB0b3IoYyxkKTtiPWUuZmluYWxpemUoYik7ZT1lLmNmZztyZXR1cm4gcC5jcmVhdGUoe2NpcGhlcnRleHQ6YixrZXk6YyxpdjplLml2LGFsZ29yaXRobTphLG1vZGU6ZS5tb2RlLHBhZGRpbmc6ZS5wYWRkaW5nLFxuYmxvY2tTaXplOmEuYmxvY2tTaXplLGZvcm1hdHRlcjpkLmZvcm1hdH0pfSxkZWNyeXB0OmZ1bmN0aW9uKGEsYixjLGQpe2Q9dGhpcy5jZmcuZXh0ZW5kKGQpO2I9dGhpcy5fcGFyc2UoYixkLmZvcm1hdCk7cmV0dXJuIGEuY3JlYXRlRGVjcnlwdG9yKGMsZCkuZmluYWxpemUoYi5jaXBoZXJ0ZXh0KX0sX3BhcnNlOmZ1bmN0aW9uKGEsYil7cmV0dXJuXCJzdHJpbmdcIj09dHlwZW9mIGE/Yi5wYXJzZShhLHRoaXMpOmF9fSksZz0oZy5rZGY9e30pLk9wZW5TU0w9e2V4ZWN1dGU6ZnVuY3Rpb24oYSxiLGMsZCl7ZHx8KGQ9bC5yYW5kb20oOCkpO2E9di5jcmVhdGUoe2tleVNpemU6YitjfSkuY29tcHV0ZShhLGQpO2M9bC5jcmVhdGUoYS53b3Jkcy5zbGljZShiKSw0KmMpO2Euc2lnQnl0ZXM9NCpiO3JldHVybiBwLmNyZWF0ZSh7a2V5OmEsaXY6YyxzYWx0OmR9KX19LHM9Zi5QYXNzd29yZEJhc2VkQ2lwaGVyPWouZXh0ZW5kKHtjZmc6ai5jZmcuZXh0ZW5kKHtrZGY6Z30pLGVuY3J5cHQ6ZnVuY3Rpb24oYSxcbmIsYyxkKXtkPXRoaXMuY2ZnLmV4dGVuZChkKTtjPWQua2RmLmV4ZWN1dGUoYyxhLmtleVNpemUsYS5pdlNpemUpO2QuaXY9Yy5pdjthPWouZW5jcnlwdC5jYWxsKHRoaXMsYSxiLGMua2V5LGQpO2EubWl4SW4oYyk7cmV0dXJuIGF9LGRlY3J5cHQ6ZnVuY3Rpb24oYSxiLGMsZCl7ZD10aGlzLmNmZy5leHRlbmQoZCk7Yj10aGlzLl9wYXJzZShiLGQuZm9ybWF0KTtjPWQua2RmLmV4ZWN1dGUoYyxhLmtleVNpemUsYS5pdlNpemUsYi5zYWx0KTtkLml2PWMuaXY7cmV0dXJuIGouZGVjcnlwdC5jYWxsKHRoaXMsYSxiLGMua2V5LGQpfX0pfSgpO1xuXG4vKlxuQ3J5cHRvSlMgdjMuMS4yIGFlcy1taW4uanNcbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qc1xuKGMpIDIwMDktMjAxMyBieSBKZWZmIE1vdHQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5jb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanMvd2lraS9MaWNlbnNlXG4qL1xuKGZ1bmN0aW9uKCl7Zm9yKHZhciBxPUNyeXB0b0pTLHg9cS5saWIuQmxvY2tDaXBoZXIscj1xLmFsZ28saj1bXSx5PVtdLHo9W10sQT1bXSxCPVtdLEM9W10scz1bXSx1PVtdLHY9W10sdz1bXSxnPVtdLGs9MDsyNTY+aztrKyspZ1trXT0xMjg+az9rPDwxOms8PDFeMjgzO2Zvcih2YXIgbj0wLGw9MCxrPTA7MjU2Pms7aysrKXt2YXIgZj1sXmw8PDFebDw8Ml5sPDwzXmw8PDQsZj1mPj4+OF5mJjI1NV45OTtqW25dPWY7eVtmXT1uO3ZhciB0PWdbbl0sRD1nW3RdLEU9Z1tEXSxiPTI1NypnW2ZdXjE2ODQzMDA4KmY7eltuXT1iPDwyNHxiPj4+ODtBW25dPWI8PDE2fGI+Pj4xNjtCW25dPWI8PDh8Yj4+PjI0O0Nbbl09YjtiPTE2ODQzMDA5KkVeNjU1MzcqRF4yNTcqdF4xNjg0MzAwOCpuO3NbZl09Yjw8MjR8Yj4+Pjg7dVtmXT1iPDwxNnxiPj4+MTY7dltmXT1iPDw4fGI+Pj4yNDt3W2ZdPWI7bj8obj10XmdbZ1tnW0VedF1dXSxsXj1nW2dbbF1dKTpuPWw9MX12YXIgRj1bMCwxLDIsNCw4LFxuMTYsMzIsNjQsMTI4LDI3LDU0XSxyPXIuQUVTPXguZXh0ZW5kKHtfZG9SZXNldDpmdW5jdGlvbigpe2Zvcih2YXIgYz10aGlzLl9rZXksZT1jLndvcmRzLGE9Yy5zaWdCeXRlcy80LGM9NCooKHRoaXMuX25Sb3VuZHM9YSs2KSsxKSxiPXRoaXMuX2tleVNjaGVkdWxlPVtdLGg9MDtoPGM7aCsrKWlmKGg8YSliW2hdPWVbaF07ZWxzZXt2YXIgZD1iW2gtMV07aCVhPzY8YSYmND09aCVhJiYoZD1qW2Q+Pj4yNF08PDI0fGpbZD4+PjE2JjI1NV08PDE2fGpbZD4+PjgmMjU1XTw8OHxqW2QmMjU1XSk6KGQ9ZDw8OHxkPj4+MjQsZD1qW2Q+Pj4yNF08PDI0fGpbZD4+PjE2JjI1NV08PDE2fGpbZD4+PjgmMjU1XTw8OHxqW2QmMjU1XSxkXj1GW2gvYXwwXTw8MjQpO2JbaF09YltoLWFdXmR9ZT10aGlzLl9pbnZLZXlTY2hlZHVsZT1bXTtmb3IoYT0wO2E8YzthKyspaD1jLWEsZD1hJTQ/YltoXTpiW2gtNF0sZVthXT00PmF8fDQ+PWg/ZDpzW2pbZD4+PjI0XV1edVtqW2Q+Pj4xNiYyNTVdXV52W2pbZD4+PlxuOCYyNTVdXV53W2pbZCYyNTVdXX0sZW5jcnlwdEJsb2NrOmZ1bmN0aW9uKGMsZSl7dGhpcy5fZG9DcnlwdEJsb2NrKGMsZSx0aGlzLl9rZXlTY2hlZHVsZSx6LEEsQixDLGopfSxkZWNyeXB0QmxvY2s6ZnVuY3Rpb24oYyxlKXt2YXIgYT1jW2UrMV07Y1tlKzFdPWNbZSszXTtjW2UrM109YTt0aGlzLl9kb0NyeXB0QmxvY2soYyxlLHRoaXMuX2ludktleVNjaGVkdWxlLHMsdSx2LHcseSk7YT1jW2UrMV07Y1tlKzFdPWNbZSszXTtjW2UrM109YX0sX2RvQ3J5cHRCbG9jazpmdW5jdGlvbihjLGUsYSxiLGgsZCxqLG0pe2Zvcih2YXIgbj10aGlzLl9uUm91bmRzLGY9Y1tlXV5hWzBdLGc9Y1tlKzFdXmFbMV0saz1jW2UrMl1eYVsyXSxwPWNbZSszXV5hWzNdLGw9NCx0PTE7dDxuO3QrKyl2YXIgcT1iW2Y+Pj4yNF1eaFtnPj4+MTYmMjU1XV5kW2s+Pj44JjI1NV1ealtwJjI1NV1eYVtsKytdLHI9YltnPj4+MjRdXmhbaz4+PjE2JjI1NV1eZFtwPj4+OCYyNTVdXmpbZiYyNTVdXmFbbCsrXSxzPVxuYltrPj4+MjRdXmhbcD4+PjE2JjI1NV1eZFtmPj4+OCYyNTVdXmpbZyYyNTVdXmFbbCsrXSxwPWJbcD4+PjI0XV5oW2Y+Pj4xNiYyNTVdXmRbZz4+PjgmMjU1XV5qW2smMjU1XV5hW2wrK10sZj1xLGc9cixrPXM7cT0obVtmPj4+MjRdPDwyNHxtW2c+Pj4xNiYyNTVdPDwxNnxtW2s+Pj44JjI1NV08PDh8bVtwJjI1NV0pXmFbbCsrXTtyPShtW2c+Pj4yNF08PDI0fG1baz4+PjE2JjI1NV08PDE2fG1bcD4+PjgmMjU1XTw8OHxtW2YmMjU1XSleYVtsKytdO3M9KG1baz4+PjI0XTw8MjR8bVtwPj4+MTYmMjU1XTw8MTZ8bVtmPj4+OCYyNTVdPDw4fG1bZyYyNTVdKV5hW2wrK107cD0obVtwPj4+MjRdPDwyNHxtW2Y+Pj4xNiYyNTVdPDwxNnxtW2c+Pj44JjI1NV08PDh8bVtrJjI1NV0pXmFbbCsrXTtjW2VdPXE7Y1tlKzFdPXI7Y1tlKzJdPXM7Y1tlKzNdPXB9LGtleVNpemU6OH0pO3EuQUVTPXguX2NyZWF0ZUhlbHBlcihyKX0pKCk7XG5cbi8qXG5DcnlwdG9KUyB2My4xLjIgdHJpcGxlZGVzLW1pbi5qc1xuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzXG4oYykgMjAwOS0yMDEzIGJ5IEplZmYgTW90dC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qcy93aWtpL0xpY2Vuc2VcbiovXG4oZnVuY3Rpb24oKXtmdW5jdGlvbiBqKGIsYyl7dmFyIGE9KHRoaXMuX2xCbG9jaz4+PmJedGhpcy5fckJsb2NrKSZjO3RoaXMuX3JCbG9ja149YTt0aGlzLl9sQmxvY2tePWE8PGJ9ZnVuY3Rpb24gbChiLGMpe3ZhciBhPSh0aGlzLl9yQmxvY2s+Pj5iXnRoaXMuX2xCbG9jaykmYzt0aGlzLl9sQmxvY2tePWE7dGhpcy5fckJsb2NrXj1hPDxifXZhciBoPUNyeXB0b0pTLGU9aC5saWIsbj1lLldvcmRBcnJheSxlPWUuQmxvY2tDaXBoZXIsZz1oLmFsZ28scT1bNTcsNDksNDEsMzMsMjUsMTcsOSwxLDU4LDUwLDQyLDM0LDI2LDE4LDEwLDIsNTksNTEsNDMsMzUsMjcsMTksMTEsMyw2MCw1Miw0NCwzNiw2Myw1NSw0NywzOSwzMSwyMywxNSw3LDYyLDU0LDQ2LDM4LDMwLDIyLDE0LDYsNjEsNTMsNDUsMzcsMjksMjEsMTMsNSwyOCwyMCwxMiw0XSxwPVsxNCwxNywxMSwyNCwxLDUsMywyOCwxNSw2LDIxLDEwLDIzLDE5LDEyLDQsMjYsOCwxNiw3LDI3LDIwLDEzLDIsNDEsNTIsMzEsMzcsNDcsXG41NSwzMCw0MCw1MSw0NSwzMyw0OCw0NCw0OSwzOSw1NiwzNCw1Myw0Niw0Miw1MCwzNiwyOSwzMl0scj1bMSwyLDQsNiw4LDEwLDEyLDE0LDE1LDE3LDE5LDIxLDIzLDI1LDI3LDI4XSxzPVt7XCIwXCI6ODQyMTg4OCwyNjg0MzU0NTY6MzI3NjgsNTM2ODcwOTEyOjg0MjEzNzgsODA1MzA2MzY4OjIsMTA3Mzc0MTgyNDo1MTIsMTM0MjE3NzI4MDo4NDIxODkwLDE2MTA2MTI3MzY6ODM4OTEyMiwxODc5MDQ4MTkyOjgzODg2MDgsMjE0NzQ4MzY0ODo1MTQsMjQxNTkxOTEwNDo4Mzg5MTIwLDI2ODQzNTQ1NjA6MzMyODAsMjk1Mjc5MDAxNjo4NDIxMzc2LDMyMjEyMjU0NzI6MzI3NzAsMzQ4OTY2MDkyODo4Mzg4NjEwLDM3NTgwOTYzODQ6MCw0MDI2NTMxODQwOjMzMjgyLDEzNDIxNzcyODowLDQwMjY1MzE4NDo4NDIxODkwLDY3MTA4ODY0MDozMzI4Miw5Mzk1MjQwOTY6MzI3NjgsMTIwNzk1OTU1Mjo4NDIxODg4LDE0NzYzOTUwMDg6NTEyLDE3NDQ4MzA0NjQ6ODQyMTM3OCwyMDEzMjY1OTIwOjIsXG4yMjgxNzAxMzc2OjgzODkxMjAsMjU1MDEzNjgzMjozMzI4MCwyODE4NTcyMjg4Ojg0MjEzNzYsMzA4NzAwNzc0NDo4Mzg5MTIyLDMzNTU0NDMyMDA6ODM4ODYxMCwzNjIzODc4NjU2OjMyNzcwLDM4OTIzMTQxMTI6NTE0LDQxNjA3NDk1Njg6ODM4ODYwOCwxOjMyNzY4LDI2ODQzNTQ1NzoyLDUzNjg3MDkxMzo4NDIxODg4LDgwNTMwNjM2OTo4Mzg4NjA4LDEwNzM3NDE4MjU6ODQyMTM3OCwxMzQyMTc3MjgxOjMzMjgwLDE2MTA2MTI3Mzc6NTEyLDE4NzkwNDgxOTM6ODM4OTEyMiwyMTQ3NDgzNjQ5Ojg0MjE4OTAsMjQxNTkxOTEwNTo4NDIxMzc2LDI2ODQzNTQ1NjE6ODM4ODYxMCwyOTUyNzkwMDE3OjMzMjgyLDMyMjEyMjU0NzM6NTE0LDM0ODk2NjA5Mjk6ODM4OTEyMCwzNzU4MDk2Mzg1OjMyNzcwLDQwMjY1MzE4NDE6MCwxMzQyMTc3Mjk6ODQyMTg5MCw0MDI2NTMxODU6ODQyMTM3Niw2NzEwODg2NDE6ODM4ODYwOCw5Mzk1MjQwOTc6NTEyLDEyMDc5NTk1NTM6MzI3NjgsMTQ3NjM5NTAwOTo4Mzg4NjEwLFxuMTc0NDgzMDQ2NToyLDIwMTMyNjU5MjE6MzMyODIsMjI4MTcwMTM3NzozMjc3MCwyNTUwMTM2ODMzOjgzODkxMjIsMjgxODU3MjI4OTo1MTQsMzA4NzAwNzc0NTo4NDIxODg4LDMzNTU0NDMyMDE6ODM4OTEyMCwzNjIzODc4NjU3OjAsMzg5MjMxNDExMzozMzI4MCw0MTYwNzQ5NTY5Ojg0MjEzNzh9LHtcIjBcIjoxMDc0MjgyNTEyLDE2Nzc3MjE2OjE2Mzg0LDMzNTU0NDMyOjUyNDI4OCw1MDMzMTY0ODoxMDc0MjY2MTI4LDY3MTA4ODY0OjEwNzM3NDE4NDAsODM4ODYwODA6MTA3NDI4MjQ5NiwxMDA2NjMyOTY6MTA3Mzc1ODIwOCwxMTc0NDA1MTI6MTYsMTM0MjE3NzI4OjU0MDY3MiwxNTA5OTQ5NDQ6MTA3Mzc1ODIyNCwxNjc3NzIxNjA6MTA3Mzc0MTgyNCwxODQ1NDkzNzY6NTQwNjg4LDIwMTMyNjU5Mjo1MjQzMDQsMjE4MTAzODA4OjAsMjM0ODgxMDI0OjE2NDAwLDI1MTY1ODI0MDoxMDc0MjY2MTEyLDgzODg2MDg6MTA3Mzc1ODIwOCwyNTE2NTgyNDo1NDA2ODgsNDE5NDMwNDA6MTYsNTg3MjAyNTY6MTA3Mzc1ODIyNCxcbjc1NDk3NDcyOjEwNzQyODI1MTIsOTIyNzQ2ODg6MTA3Mzc0MTgyNCwxMDkwNTE5MDQ6NTI0Mjg4LDEyNTgyOTEyMDoxMDc0MjY2MTI4LDE0MjYwNjMzNjo1MjQzMDQsMTU5MzgzNTUyOjAsMTc2MTYwNzY4OjE2Mzg0LDE5MjkzNzk4NDoxMDc0MjY2MTEyLDIwOTcxNTIwMDoxMDczNzQxODQwLDIyNjQ5MjQxNjo1NDA2NzIsMjQzMjY5NjMyOjEwNzQyODI0OTYsMjYwMDQ2ODQ4OjE2NDAwLDI2ODQzNTQ1NjowLDI4NTIxMjY3MjoxMDc0MjY2MTI4LDMwMTk4OTg4ODoxMDczNzU4MjI0LDMxODc2NzEwNDoxMDc0MjgyNDk2LDMzNTU0NDMyMDoxMDc0MjY2MTEyLDM1MjMyMTUzNjoxNiwzNjkwOTg3NTI6NTQwNjg4LDM4NTg3NTk2ODoxNjM4NCw0MDI2NTMxODQ6MTY0MDAsNDE5NDMwNDAwOjUyNDI4OCw0MzYyMDc2MTY6NTI0MzA0LDQ1Mjk4NDgzMjoxMDczNzQxODQwLDQ2OTc2MjA0ODo1NDA2NzIsNDg2NTM5MjY0OjEwNzM3NTgyMDgsNTAzMzE2NDgwOjEwNzM3NDE4MjQsNTIwMDkzNjk2OjEwNzQyODI1MTIsXG4yNzY4MjQwNjQ6NTQwNjg4LDI5MzYwMTI4MDo1MjQyODgsMzEwMzc4NDk2OjEwNzQyNjYxMTIsMzI3MTU1NzEyOjE2Mzg0LDM0MzkzMjkyODoxMDczNzU4MjA4LDM2MDcxMDE0NDoxMDc0MjgyNTEyLDM3NzQ4NzM2MDoxNiwzOTQyNjQ1NzY6MTA3Mzc0MTgyNCw0MTEwNDE3OTI6MTA3NDI4MjQ5Niw0Mjc4MTkwMDg6MTA3Mzc0MTg0MCw0NDQ1OTYyMjQ6MTA3Mzc1ODIyNCw0NjEzNzM0NDA6NTI0MzA0LDQ3ODE1MDY1NjowLDQ5NDkyNzg3MjoxNjQwMCw1MTE3MDUwODg6MTA3NDI2NjEyOCw1Mjg0ODIzMDQ6NTQwNjcyfSx7XCIwXCI6MjYwLDEwNDg1NzY6MCwyMDk3MTUyOjY3MTA5MTIwLDMxNDU3Mjg6NjU3OTYsNDE5NDMwNDo2NTU0MCw1MjQyODgwOjY3MTA4ODY4LDYyOTE0NTY6NjcxNzQ2NjAsNzM0MDAzMjo2NzE3NDQwMCw4Mzg4NjA4OjY3MTA4ODY0LDk0MzcxODQ6NjcxNzQ2NTYsMTA0ODU3NjA6NjU3OTIsMTE1MzQzMzY6NjcxNzQ0MDQsMTI1ODI5MTI6NjcxMDkxMjQsMTM2MzE0ODg6NjU1MzYsXG4xNDY4MDA2NDo0LDE1NzI4NjQwOjI1Niw1MjQyODg6NjcxNzQ2NTYsMTU3Mjg2NDo2NzE3NDQwNCwyNjIxNDQwOjAsMzY3MDAxNjo2NzEwOTEyMCw0NzE4NTkyOjY3MTA4ODY4LDU3NjcxNjg6NjU1MzYsNjgxNTc0NDo2NTU0MCw3ODY0MzIwOjI2MCw4OTEyODk2OjQsOTk2MTQ3MjoyNTYsMTEwMTAwNDg6NjcxNzQ0MDAsMTIwNTg2MjQ6NjU3OTYsMTMxMDcyMDA6NjU3OTIsMTQxNTU3NzY6NjcxMDkxMjQsMTUyMDQzNTI6NjcxNzQ2NjAsMTYyNTI5Mjg6NjcxMDg4NjQsMTY3NzcyMTY6NjcxNzQ2NTYsMTc4MjU3OTI6NjU1NDAsMTg4NzQzNjg6NjU1MzYsMTk5MjI5NDQ6NjcxMDkxMjAsMjA5NzE1MjA6MjU2LDIyMDIwMDk2OjY3MTc0NjYwLDIzMDY4NjcyOjY3MTA4ODY4LDI0MTE3MjQ4OjAsMjUxNjU4MjQ6NjcxMDkxMjQsMjYyMTQ0MDA6NjcxMDg4NjQsMjcyNjI5NzY6NCwyODMxMTU1Mjo2NTc5MiwyOTM2MDEyODo2NzE3NDQwMCwzMDQwODcwNDoyNjAsMzE0NTcyODA6NjU3OTYsMzI1MDU4NTY6NjcxNzQ0MDQsXG4xNzMwMTUwNDo2NzEwODg2NCwxODM1MDA4MDoyNjAsMTkzOTg2NTY6NjcxNzQ2NTYsMjA0NDcyMzI6MCwyMTQ5NTgwODo2NTU0MCwyMjU0NDM4NDo2NzEwOTEyMCwyMzU5Mjk2MDoyNTYsMjQ2NDE1MzY6NjcxNzQ0MDQsMjU2OTAxMTI6NjU1MzYsMjY3Mzg2ODg6NjcxNzQ2NjAsMjc3ODcyNjQ6NjU3OTYsMjg4MzU4NDA6NjcxMDg4NjgsMjk4ODQ0MTY6NjcxMDkxMjQsMzA5MzI5OTI6NjcxNzQ0MDAsMzE5ODE1Njg6NCwzMzAzMDE0NDo2NTc5Mn0se1wiMFwiOjIxNTE2ODIwNDgsNjU1MzY6MjE0NzQ4NzgwOCwxMzEwNzI6NDE5ODQ2NCwxOTY2MDg6MjE1MTY3Nzk1MiwyNjIxNDQ6MCwzMjc2ODA6NDE5ODQwMCwzOTMyMTY6MjE0NzQ4MzcxMiw0NTg3NTI6NDE5NDM2OCw1MjQyODg6MjE0NzQ4MzY0OCw1ODk4MjQ6NDE5NDMwNCw2NTUzNjA6NjQsNzIwODk2OjIxNDc0ODc3NDQsNzg2NDMyOjIxNTE2NzgwMTYsODUxOTY4OjQxNjAsOTE3NTA0OjQwOTYsOTgzMDQwOjIxNTE2ODIxMTIsMzI3Njg6MjE0NzQ4NzgwOCxcbjk4MzA0OjY0LDE2Mzg0MDoyMTUxNjc4MDE2LDIyOTM3NjoyMTQ3NDg3NzQ0LDI5NDkxMjo0MTk4NDAwLDM2MDQ0ODoyMTUxNjgyMTEyLDQyNTk4NDowLDQ5MTUyMDoyMTUxNjc3OTUyLDU1NzA1Njo0MDk2LDYyMjU5MjoyMTUxNjgyMDQ4LDY4ODEyODo0MTk0MzA0LDc1MzY2NDo0MTYwLDgxOTIwMDoyMTQ3NDgzNjQ4LDg4NDczNjo0MTk0MzY4LDk1MDI3Mjo0MTk4NDY0LDEwMTU4MDg6MjE0NzQ4MzcxMiwxMDQ4NTc2OjQxOTQzNjgsMTExNDExMjo0MTk4NDAwLDExNzk2NDg6MjE0NzQ4MzcxMiwxMjQ1MTg0OjAsMTMxMDcyMDo0MTYwLDEzNzYyNTY6MjE1MTY3ODAxNiwxNDQxNzkyOjIxNTE2ODIwNDgsMTUwNzMyODoyMTQ3NDg3ODA4LDE1NzI4NjQ6MjE1MTY4MjExMiwxNjM4NDAwOjIxNDc0ODM2NDgsMTcwMzkzNjoyMTUxNjc3OTUyLDE3Njk0NzI6NDE5ODQ2NCwxODM1MDA4OjIxNDc0ODc3NDQsMTkwMDU0NDo0MTk0MzA0LDE5NjYwODA6NjQsMjAzMTYxNjo0MDk2LDEwODEzNDQ6MjE1MTY3Nzk1MixcbjExNDY4ODA6MjE1MTY4MjExMiwxMjEyNDE2OjAsMTI3Nzk1Mjo0MTk4NDAwLDEzNDM0ODg6NDE5NDM2OCwxNDA5MDI0OjIxNDc0ODM2NDgsMTQ3NDU2MDoyMTQ3NDg3ODA4LDE1NDAwOTY6NjQsMTYwNTYzMjoyMTQ3NDgzNzEyLDE2NzExNjg6NDA5NiwxNzM2NzA0OjIxNDc0ODc3NDQsMTgwMjI0MDoyMTUxNjc4MDE2LDE4Njc3NzY6NDE2MCwxOTMzMzEyOjIxNTE2ODIwNDgsMTk5ODg0ODo0MTk0MzA0LDIwNjQzODQ6NDE5ODQ2NH0se1wiMFwiOjEyOCw0MDk2OjE3MDM5MzYwLDgxOTI6MjYyMTQ0LDEyMjg4OjUzNjg3MDkxMiwxNjM4NDo1MzcxMzMxODQsMjA0ODA6MTY3NzczNDQsMjQ1NzY6NTUzNjQ4MjU2LDI4NjcyOjI2MjI3MiwzMjc2ODoxNjc3NzIxNiwzNjg2NDo1MzcxMzMwNTYsNDA5NjA6NTM2ODcxMDQwLDQ1MDU2OjU1MzkxMDQwMCw0OTE1Mjo1NTM5MTAyNzIsNTMyNDg6MCw1NzM0NDoxNzAzOTQ4OCw2MTQ0MDo1NTM2NDgxMjgsMjA0ODoxNzAzOTQ4OCw2MTQ0OjU1MzY0ODI1NixcbjEwMjQwOjEyOCwxNDMzNjoxNzAzOTM2MCwxODQzMjoyNjIxNDQsMjI1Mjg6NTM3MTMzMTg0LDI2NjI0OjU1MzkxMDI3MiwzMDcyMDo1MzY4NzA5MTIsMzQ4MTY6NTM3MTMzMDU2LDM4OTEyOjAsNDMwMDg6NTUzOTEwNDAwLDQ3MTA0OjE2Nzc3MzQ0LDUxMjAwOjUzNjg3MTA0MCw1NTI5Njo1NTM2NDgxMjgsNTkzOTI6MTY3NzcyMTYsNjM0ODg6MjYyMjcyLDY1NTM2OjI2MjE0NCw2OTYzMjoxMjgsNzM3Mjg6NTM2ODcwOTEyLDc3ODI0OjU1MzY0ODI1Niw4MTkyMDoxNjc3NzM0NCw4NjAxNjo1NTM5MTAyNzIsOTAxMTI6NTM3MTMzMTg0LDk0MjA4OjE2Nzc3MjE2LDk4MzA0OjU1MzkxMDQwMCwxMDI0MDA6NTUzNjQ4MTI4LDEwNjQ5NjoxNzAzOTM2MCwxMTA1OTI6NTM3MTMzMDU2LDExNDY4ODoyNjIyNzIsMTE4Nzg0OjUzNjg3MTA0MCwxMjI4ODA6MCwxMjY5NzY6MTcwMzk0ODgsNjc1ODQ6NTUzNjQ4MjU2LDcxNjgwOjE2Nzc3MjE2LDc1Nzc2OjE3MDM5MzYwLDc5ODcyOjUzNzEzMzE4NCxcbjgzOTY4OjUzNjg3MDkxMiw4ODA2NDoxNzAzOTQ4OCw5MjE2MDoxMjgsOTYyNTY6NTUzOTEwMjcyLDEwMDM1MjoyNjIyNzIsMTA0NDQ4OjU1MzkxMDQwMCwxMDg1NDQ6MCwxMTI2NDA6NTUzNjQ4MTI4LDExNjczNjoxNjc3NzM0NCwxMjA4MzI6MjYyMTQ0LDEyNDkyODo1MzcxMzMwNTYsMTI5MDI0OjUzNjg3MTA0MH0se1wiMFwiOjI2ODQzNTQ2NCwyNTY6ODE5Miw1MTI6MjcwNTMyNjA4LDc2ODoyNzA1NDA4MDgsMTAyNDoyNjg0NDM2NDgsMTI4MDoyMDk3MTUyLDE1MzY6MjA5NzE2MCwxNzkyOjI2ODQzNTQ1NiwyMDQ4OjAsMjMwNDoyNjg0NDM2NTYsMjU2MDoyMTA1MzQ0LDI4MTY6OCwzMDcyOjI3MDUzMjYxNiwzMzI4OjIxMDUzNTIsMzU4NDo4MjAwLDM4NDA6MjcwNTQwODAwLDEyODoyNzA1MzI2MDgsMzg0OjI3MDU0MDgwOCw2NDA6OCw4OTY6MjA5NzE1MiwxMTUyOjIxMDUzNTIsMTQwODoyNjg0MzU0NjQsMTY2NDoyNjg0NDM2NDgsMTkyMDo4MjAwLDIxNzY6MjA5NzE2MCwyNDMyOjgxOTIsXG4yNjg4OjI2ODQ0MzY1NiwyOTQ0OjI3MDUzMjYxNiwzMjAwOjAsMzQ1NjoyNzA1NDA4MDAsMzcxMjoyMTA1MzQ0LDM5Njg6MjY4NDM1NDU2LDQwOTY6MjY4NDQzNjQ4LDQzNTI6MjcwNTMyNjE2LDQ2MDg6MjcwNTQwODA4LDQ4NjQ6ODIwMCw1MTIwOjIwOTcxNTIsNTM3NjoyNjg0MzU0NTYsNTYzMjoyNjg0MzU0NjQsNTg4ODoyMTA1MzQ0LDYxNDQ6MjEwNTM1Miw2NDAwOjAsNjY1Njo4LDY5MTI6MjcwNTMyNjA4LDcxNjg6ODE5Miw3NDI0OjI2ODQ0MzY1Niw3NjgwOjI3MDU0MDgwMCw3OTM2OjIwOTcxNjAsNDIyNDo4LDQ0ODA6MjEwNTM0NCw0NzM2OjIwOTcxNTIsNDk5MjoyNjg0MzU0NjQsNTI0ODoyNjg0NDM2NDgsNTUwNDo4MjAwLDU3NjA6MjcwNTQwODA4LDYwMTY6MjcwNTMyNjA4LDYyNzI6MjcwNTQwODAwLDY1Mjg6MjcwNTMyNjE2LDY3ODQ6ODE5Miw3MDQwOjIxMDUzNTIsNzI5NjoyMDk3MTYwLDc1NTI6MCw3ODA4OjI2ODQzNTQ1Niw4MDY0OjI2ODQ0MzY1Nn0se1wiMFwiOjEwNDg1NzYsXG4xNjozMzU1NTQ1NywzMjoxMDI0LDQ4OjEwNDk2MDEsNjQ6MzQ2MDQwMzMsODA6MCw5NjoxLDExMjozNDYwMzAwOSwxMjg6MzM1NTU0NTYsMTQ0OjEwNDg1NzcsMTYwOjMzNTU0NDMzLDE3NjozNDYwNDAzMiwxOTI6MzQ2MDMwMDgsMjA4OjEwMjUsMjI0OjEwNDk2MDAsMjQwOjMzNTU0NDMyLDg6MzQ2MDMwMDksMjQ6MCw0MDozMzU1NTQ1Nyw1NjozNDYwNDAzMiw3MjoxMDQ4NTc2LDg4OjMzNTU0NDMzLDEwNDozMzU1NDQzMiwxMjA6MTAyNSwxMzY6MTA0OTYwMSwxNTI6MzM1NTU0NTYsMTY4OjM0NjAzMDA4LDE4NDoxMDQ4NTc3LDIwMDoxMDI0LDIxNjozNDYwNDAzMywyMzI6MSwyNDg6MTA0OTYwMCwyNTY6MzM1NTQ0MzIsMjcyOjEwNDg1NzYsMjg4OjMzNTU1NDU3LDMwNDozNDYwMzAwOSwzMjA6MTA0ODU3NywzMzY6MzM1NTU0NTYsMzUyOjM0NjA0MDMyLDM2ODoxMDQ5NjAxLDM4NDoxMDI1LDQwMDozNDYwNDAzMyw0MTY6MTA0OTYwMCw0MzI6MSw0NDg6MCw0NjQ6MzQ2MDMwMDgsNDgwOjMzNTU0NDMzLFxuNDk2OjEwMjQsMjY0OjEwNDk2MDAsMjgwOjMzNTU1NDU3LDI5NjozNDYwMzAwOSwzMTI6MSwzMjg6MzM1NTQ0MzIsMzQ0OjEwNDg1NzYsMzYwOjEwMjUsMzc2OjM0NjA0MDMyLDM5MjozMzU1NDQzMyw0MDg6MzQ2MDMwMDgsNDI0OjAsNDQwOjM0NjA0MDMzLDQ1NjoxMDQ5NjAxLDQ3MjoxMDI0LDQ4ODozMzU1NTQ1Niw1MDQ6MTA0ODU3N30se1wiMFwiOjEzNDIxOTgwOCwxOjEzMTA3MiwyOjEzNDIxNzcyOCwzOjMyLDQ6MTMxMTA0LDU6MTM0MzUwODgwLDY6MTM0MzUwODQ4LDc6MjA0OCw4OjEzNDM0ODgwMCw5OjEzNDIxOTc3NiwxMDoxMzMxMjAsMTE6MTM0MzQ4ODMyLDEyOjIwODAsMTM6MCwxNDoxMzQyMTc3NjAsMTU6MTMzMTUyLDIxNDc0ODM2NDg6MjA0OCwyMTQ3NDgzNjQ5OjEzNDM1MDg4MCwyMTQ3NDgzNjUwOjEzNDIxOTgwOCwyMTQ3NDgzNjUxOjEzNDIxNzcyOCwyMTQ3NDgzNjUyOjEzNDM0ODgwMCwyMTQ3NDgzNjUzOjEzMzEyMCwyMTQ3NDgzNjU0OjEzMzE1MiwyMTQ3NDgzNjU1OjMyLFxuMjE0NzQ4MzY1NjoxMzQyMTc3NjAsMjE0NzQ4MzY1NzoyMDgwLDIxNDc0ODM2NTg6MTMxMTA0LDIxNDc0ODM2NTk6MTM0MzUwODQ4LDIxNDc0ODM2NjA6MCwyMTQ3NDgzNjYxOjEzNDM0ODgzMiwyMTQ3NDgzNjYyOjEzNDIxOTc3NiwyMTQ3NDgzNjYzOjEzMTA3MiwxNjoxMzMxNTIsMTc6MTM0MzUwODQ4LDE4OjMyLDE5OjIwNDgsMjA6MTM0MjE5Nzc2LDIxOjEzNDIxNzc2MCwyMjoxMzQzNDg4MzIsMjM6MTMxMDcyLDI0OjAsMjU6MTMxMTA0LDI2OjEzNDM0ODgwMCwyNzoxMzQyMTk4MDgsMjg6MTM0MzUwODgwLDI5OjEzMzEyMCwzMDoyMDgwLDMxOjEzNDIxNzcyOCwyMTQ3NDgzNjY0OjEzMTA3MiwyMTQ3NDgzNjY1OjIwNDgsMjE0NzQ4MzY2NjoxMzQzNDg4MzIsMjE0NzQ4MzY2NzoxMzMxNTIsMjE0NzQ4MzY2ODozMiwyMTQ3NDgzNjY5OjEzNDM0ODgwMCwyMTQ3NDgzNjcwOjEzNDIxNzcyOCwyMTQ3NDgzNjcxOjEzNDIxOTgwOCwyMTQ3NDgzNjcyOjEzNDM1MDg4MCwyMTQ3NDgzNjczOjEzNDIxNzc2MCxcbjIxNDc0ODM2NzQ6MTM0MjE5Nzc2LDIxNDc0ODM2NzU6MCwyMTQ3NDgzNjc2OjEzMzEyMCwyMTQ3NDgzNjc3OjIwODAsMjE0NzQ4MzY3ODoxMzExMDQsMjE0NzQ4MzY3OToxMzQzNTA4NDh9XSx0PVs0MTYwNzQ5NTY5LDUyODQ4MjMwNCwzMzAzMDE0NCwyMDY0Mzg0LDEyOTAyNCw4MDY0LDUwNCwyMTQ3NDgzNjc5XSxtPWcuREVTPWUuZXh0ZW5kKHtfZG9SZXNldDpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLl9rZXkud29yZHMsYz1bXSxhPTA7NTY+YTthKyspe3ZhciBmPXFbYV0tMTtjW2FdPWJbZj4+PjVdPj4+MzEtZiUzMiYxfWI9dGhpcy5fc3ViS2V5cz1bXTtmb3IoZj0wOzE2PmY7ZisrKXtmb3IodmFyIGQ9YltmXT1bXSxlPXJbZl0sYT0wOzI0PmE7YSsrKWRbYS82fDBdfD1jWyhwW2FdLTErZSklMjhdPDwzMS1hJTYsZFs0KyhhLzZ8MCldfD1jWzI4KyhwW2ErMjRdLTErZSklMjhdPDwzMS1hJTY7ZFswXT1kWzBdPDwxfGRbMF0+Pj4zMTtmb3IoYT0xOzc+YTthKyspZFthXT4+Pj1cbjQqKGEtMSkrMztkWzddPWRbN108PDV8ZFs3XT4+PjI3fWM9dGhpcy5faW52U3ViS2V5cz1bXTtmb3IoYT0wOzE2PmE7YSsrKWNbYV09YlsxNS1hXX0sZW5jcnlwdEJsb2NrOmZ1bmN0aW9uKGIsYyl7dGhpcy5fZG9DcnlwdEJsb2NrKGIsYyx0aGlzLl9zdWJLZXlzKX0sZGVjcnlwdEJsb2NrOmZ1bmN0aW9uKGIsYyl7dGhpcy5fZG9DcnlwdEJsb2NrKGIsYyx0aGlzLl9pbnZTdWJLZXlzKX0sX2RvQ3J5cHRCbG9jazpmdW5jdGlvbihiLGMsYSl7dGhpcy5fbEJsb2NrPWJbY107dGhpcy5fckJsb2NrPWJbYysxXTtqLmNhbGwodGhpcyw0LDI1MjY0NTEzNSk7ai5jYWxsKHRoaXMsMTYsNjU1MzUpO2wuY2FsbCh0aGlzLDIsODU4OTkzNDU5KTtsLmNhbGwodGhpcyw4LDE2NzExOTM1KTtqLmNhbGwodGhpcywxLDE0MzE2NTU3NjUpO2Zvcih2YXIgZj0wOzE2PmY7ZisrKXtmb3IodmFyIGQ9YVtmXSxlPXRoaXMuX2xCbG9jayxoPXRoaXMuX3JCbG9jayxnPTAsaz0wOzg+aztrKyspZ3w9c1trXVsoKGheXG5kW2tdKSZ0W2tdKT4+PjBdO3RoaXMuX2xCbG9jaz1oO3RoaXMuX3JCbG9jaz1lXmd9YT10aGlzLl9sQmxvY2s7dGhpcy5fbEJsb2NrPXRoaXMuX3JCbG9jazt0aGlzLl9yQmxvY2s9YTtqLmNhbGwodGhpcywxLDE0MzE2NTU3NjUpO2wuY2FsbCh0aGlzLDgsMTY3MTE5MzUpO2wuY2FsbCh0aGlzLDIsODU4OTkzNDU5KTtqLmNhbGwodGhpcywxNiw2NTUzNSk7ai5jYWxsKHRoaXMsNCwyNTI2NDUxMzUpO2JbY109dGhpcy5fbEJsb2NrO2JbYysxXT10aGlzLl9yQmxvY2t9LGtleVNpemU6MixpdlNpemU6MixibG9ja1NpemU6Mn0pO2guREVTPWUuX2NyZWF0ZUhlbHBlcihtKTtnPWcuVHJpcGxlREVTPWUuZXh0ZW5kKHtfZG9SZXNldDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuX2tleS53b3Jkczt0aGlzLl9kZXMxPW0uY3JlYXRlRW5jcnlwdG9yKG4uY3JlYXRlKGIuc2xpY2UoMCwyKSkpO3RoaXMuX2RlczI9bS5jcmVhdGVFbmNyeXB0b3Iobi5jcmVhdGUoYi5zbGljZSgyLDQpKSk7dGhpcy5fZGVzMz1cbm0uY3JlYXRlRW5jcnlwdG9yKG4uY3JlYXRlKGIuc2xpY2UoNCw2KSkpfSxlbmNyeXB0QmxvY2s6ZnVuY3Rpb24oYixjKXt0aGlzLl9kZXMxLmVuY3J5cHRCbG9jayhiLGMpO3RoaXMuX2RlczIuZGVjcnlwdEJsb2NrKGIsYyk7dGhpcy5fZGVzMy5lbmNyeXB0QmxvY2soYixjKX0sZGVjcnlwdEJsb2NrOmZ1bmN0aW9uKGIsYyl7dGhpcy5fZGVzMy5kZWNyeXB0QmxvY2soYixjKTt0aGlzLl9kZXMyLmVuY3J5cHRCbG9jayhiLGMpO3RoaXMuX2RlczEuZGVjcnlwdEJsb2NrKGIsYyl9LGtleVNpemU6NixpdlNpemU6MixibG9ja1NpemU6Mn0pO2guVHJpcGxlREVTPWUuX2NyZWF0ZUhlbHBlcihnKX0pKCk7XG5cbi8qXG5DcnlwdG9KUyB2My4xLjIgZW5jLWJhc2U2NC1taW4uanNcbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qc1xuKGMpIDIwMDktMjAxMyBieSBKZWZmIE1vdHQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5jb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanMvd2lraS9MaWNlbnNlXG4qL1xuKGZ1bmN0aW9uKCl7dmFyIGg9Q3J5cHRvSlMsaj1oLmxpYi5Xb3JkQXJyYXk7aC5lbmMuQmFzZTY0PXtzdHJpbmdpZnk6ZnVuY3Rpb24oYil7dmFyIGU9Yi53b3JkcyxmPWIuc2lnQnl0ZXMsYz10aGlzLl9tYXA7Yi5jbGFtcCgpO2I9W107Zm9yKHZhciBhPTA7YTxmO2ErPTMpZm9yKHZhciBkPShlW2E+Pj4yXT4+PjI0LTgqKGElNCkmMjU1KTw8MTZ8KGVbYSsxPj4+Ml0+Pj4yNC04KigoYSsxKSU0KSYyNTUpPDw4fGVbYSsyPj4+Ml0+Pj4yNC04KigoYSsyKSU0KSYyNTUsZz0wOzQ+ZyYmYSswLjc1Kmc8ZjtnKyspYi5wdXNoKGMuY2hhckF0KGQ+Pj42KigzLWcpJjYzKSk7aWYoZT1jLmNoYXJBdCg2NCkpZm9yKDtiLmxlbmd0aCU0OyliLnB1c2goZSk7cmV0dXJuIGIuam9pbihcIlwiKX0scGFyc2U6ZnVuY3Rpb24oYil7dmFyIGU9Yi5sZW5ndGgsZj10aGlzLl9tYXAsYz1mLmNoYXJBdCg2NCk7YyYmKGM9Yi5pbmRleE9mKGMpLC0xIT1jJiYoZT1jKSk7Zm9yKHZhciBjPVtdLGE9MCxkPTA7ZDxcbmU7ZCsrKWlmKGQlNCl7dmFyIGc9Zi5pbmRleE9mKGIuY2hhckF0KGQtMSkpPDwyKihkJTQpLGg9Zi5pbmRleE9mKGIuY2hhckF0KGQpKT4+PjYtMiooZCU0KTtjW2E+Pj4yXXw9KGd8aCk8PDI0LTgqKGElNCk7YSsrfXJldHVybiBqLmNyZWF0ZShjLGEpfSxfbWFwOlwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz1cIn19KSgpO1xuXG4vKlxuQ3J5cHRvSlMgdjMuMS4yIG1kNS1taW4uanNcbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qc1xuKGMpIDIwMDktMjAxMyBieSBKZWZmIE1vdHQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5jb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanMvd2lraS9MaWNlbnNlXG4qL1xuKGZ1bmN0aW9uKEUpe2Z1bmN0aW9uIGgoYSxmLGcsaixwLGgsayl7YT1hKyhmJmd8fmYmaikrcCtrO3JldHVybihhPDxofGE+Pj4zMi1oKStmfWZ1bmN0aW9uIGsoYSxmLGcsaixwLGgsayl7YT1hKyhmJmp8ZyZ+aikrcCtrO3JldHVybihhPDxofGE+Pj4zMi1oKStmfWZ1bmN0aW9uIGwoYSxmLGcsaixoLGssbCl7YT1hKyhmXmdeaikraCtsO3JldHVybihhPDxrfGE+Pj4zMi1rKStmfWZ1bmN0aW9uIG4oYSxmLGcsaixoLGssbCl7YT1hKyhnXihmfH5qKSkraCtsO3JldHVybihhPDxrfGE+Pj4zMi1rKStmfWZvcih2YXIgcj1DcnlwdG9KUyxxPXIubGliLEY9cS5Xb3JkQXJyYXkscz1xLkhhc2hlcixxPXIuYWxnbyxhPVtdLHQ9MDs2ND50O3QrKylhW3RdPTQyOTQ5NjcyOTYqRS5hYnMoRS5zaW4odCsxKSl8MDtxPXEuTUQ1PXMuZXh0ZW5kKHtfZG9SZXNldDpmdW5jdGlvbigpe3RoaXMuX2hhc2g9bmV3IEYuaW5pdChbMTczMjU4NDE5Myw0MDIzMjMzNDE3LDI1NjIzODMxMDIsMjcxNzMzODc4XSl9LFxuX2RvUHJvY2Vzc0Jsb2NrOmZ1bmN0aW9uKG0sZil7Zm9yKHZhciBnPTA7MTY+ZztnKyspe3ZhciBqPWYrZyxwPW1bal07bVtqXT0ocDw8OHxwPj4+MjQpJjE2NzExOTM1fChwPDwyNHxwPj4+OCkmNDI3ODI1NTM2MH12YXIgZz10aGlzLl9oYXNoLndvcmRzLGo9bVtmKzBdLHA9bVtmKzFdLHE9bVtmKzJdLHI9bVtmKzNdLHM9bVtmKzRdLHQ9bVtmKzVdLHU9bVtmKzZdLHY9bVtmKzddLHc9bVtmKzhdLHg9bVtmKzldLHk9bVtmKzEwXSx6PW1bZisxMV0sQT1tW2YrMTJdLEI9bVtmKzEzXSxDPW1bZisxNF0sRD1tW2YrMTVdLGI9Z1swXSxjPWdbMV0sZD1nWzJdLGU9Z1szXSxiPWgoYixjLGQsZSxqLDcsYVswXSksZT1oKGUsYixjLGQscCwxMixhWzFdKSxkPWgoZCxlLGIsYyxxLDE3LGFbMl0pLGM9aChjLGQsZSxiLHIsMjIsYVszXSksYj1oKGIsYyxkLGUscyw3LGFbNF0pLGU9aChlLGIsYyxkLHQsMTIsYVs1XSksZD1oKGQsZSxiLGMsdSwxNyxhWzZdKSxjPWgoYyxkLGUsYix2LDIyLGFbN10pLFxuYj1oKGIsYyxkLGUsdyw3LGFbOF0pLGU9aChlLGIsYyxkLHgsMTIsYVs5XSksZD1oKGQsZSxiLGMseSwxNyxhWzEwXSksYz1oKGMsZCxlLGIseiwyMixhWzExXSksYj1oKGIsYyxkLGUsQSw3LGFbMTJdKSxlPWgoZSxiLGMsZCxCLDEyLGFbMTNdKSxkPWgoZCxlLGIsYyxDLDE3LGFbMTRdKSxjPWgoYyxkLGUsYixELDIyLGFbMTVdKSxiPWsoYixjLGQsZSxwLDUsYVsxNl0pLGU9ayhlLGIsYyxkLHUsOSxhWzE3XSksZD1rKGQsZSxiLGMseiwxNCxhWzE4XSksYz1rKGMsZCxlLGIsaiwyMCxhWzE5XSksYj1rKGIsYyxkLGUsdCw1LGFbMjBdKSxlPWsoZSxiLGMsZCx5LDksYVsyMV0pLGQ9ayhkLGUsYixjLEQsMTQsYVsyMl0pLGM9ayhjLGQsZSxiLHMsMjAsYVsyM10pLGI9ayhiLGMsZCxlLHgsNSxhWzI0XSksZT1rKGUsYixjLGQsQyw5LGFbMjVdKSxkPWsoZCxlLGIsYyxyLDE0LGFbMjZdKSxjPWsoYyxkLGUsYix3LDIwLGFbMjddKSxiPWsoYixjLGQsZSxCLDUsYVsyOF0pLGU9ayhlLGIsXG5jLGQscSw5LGFbMjldKSxkPWsoZCxlLGIsYyx2LDE0LGFbMzBdKSxjPWsoYyxkLGUsYixBLDIwLGFbMzFdKSxiPWwoYixjLGQsZSx0LDQsYVszMl0pLGU9bChlLGIsYyxkLHcsMTEsYVszM10pLGQ9bChkLGUsYixjLHosMTYsYVszNF0pLGM9bChjLGQsZSxiLEMsMjMsYVszNV0pLGI9bChiLGMsZCxlLHAsNCxhWzM2XSksZT1sKGUsYixjLGQscywxMSxhWzM3XSksZD1sKGQsZSxiLGMsdiwxNixhWzM4XSksYz1sKGMsZCxlLGIseSwyMyxhWzM5XSksYj1sKGIsYyxkLGUsQiw0LGFbNDBdKSxlPWwoZSxiLGMsZCxqLDExLGFbNDFdKSxkPWwoZCxlLGIsYyxyLDE2LGFbNDJdKSxjPWwoYyxkLGUsYix1LDIzLGFbNDNdKSxiPWwoYixjLGQsZSx4LDQsYVs0NF0pLGU9bChlLGIsYyxkLEEsMTEsYVs0NV0pLGQ9bChkLGUsYixjLEQsMTYsYVs0Nl0pLGM9bChjLGQsZSxiLHEsMjMsYVs0N10pLGI9bihiLGMsZCxlLGosNixhWzQ4XSksZT1uKGUsYixjLGQsdiwxMCxhWzQ5XSksZD1uKGQsZSxiLGMsXG5DLDE1LGFbNTBdKSxjPW4oYyxkLGUsYix0LDIxLGFbNTFdKSxiPW4oYixjLGQsZSxBLDYsYVs1Ml0pLGU9bihlLGIsYyxkLHIsMTAsYVs1M10pLGQ9bihkLGUsYixjLHksMTUsYVs1NF0pLGM9bihjLGQsZSxiLHAsMjEsYVs1NV0pLGI9bihiLGMsZCxlLHcsNixhWzU2XSksZT1uKGUsYixjLGQsRCwxMCxhWzU3XSksZD1uKGQsZSxiLGMsdSwxNSxhWzU4XSksYz1uKGMsZCxlLGIsQiwyMSxhWzU5XSksYj1uKGIsYyxkLGUscyw2LGFbNjBdKSxlPW4oZSxiLGMsZCx6LDEwLGFbNjFdKSxkPW4oZCxlLGIsYyxxLDE1LGFbNjJdKSxjPW4oYyxkLGUsYix4LDIxLGFbNjNdKTtnWzBdPWdbMF0rYnwwO2dbMV09Z1sxXStjfDA7Z1syXT1nWzJdK2R8MDtnWzNdPWdbM10rZXwwfSxfZG9GaW5hbGl6ZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuX2RhdGEsZj1hLndvcmRzLGc9OCp0aGlzLl9uRGF0YUJ5dGVzLGo9OCphLnNpZ0J5dGVzO2Zbaj4+PjVdfD0xMjg8PDI0LWolMzI7dmFyIGg9RS5mbG9vcihnL1xuNDI5NDk2NzI5Nik7Zlsoais2ND4+Pjk8PDQpKzE1XT0oaDw8OHxoPj4+MjQpJjE2NzExOTM1fChoPDwyNHxoPj4+OCkmNDI3ODI1NTM2MDtmWyhqKzY0Pj4+OTw8NCkrMTRdPShnPDw4fGc+Pj4yNCkmMTY3MTE5MzV8KGc8PDI0fGc+Pj44KSY0Mjc4MjU1MzYwO2Euc2lnQnl0ZXM9NCooZi5sZW5ndGgrMSk7dGhpcy5fcHJvY2VzcygpO2E9dGhpcy5faGFzaDtmPWEud29yZHM7Zm9yKGc9MDs0Pmc7ZysrKWo9ZltnXSxmW2ddPShqPDw4fGo+Pj4yNCkmMTY3MTE5MzV8KGo8PDI0fGo+Pj44KSY0Mjc4MjU1MzYwO3JldHVybiBhfSxjbG9uZTpmdW5jdGlvbigpe3ZhciBhPXMuY2xvbmUuY2FsbCh0aGlzKTthLl9oYXNoPXRoaXMuX2hhc2guY2xvbmUoKTtyZXR1cm4gYX19KTtyLk1ENT1zLl9jcmVhdGVIZWxwZXIocSk7ci5IbWFjTUQ1PXMuX2NyZWF0ZUhtYWNIZWxwZXIocSl9KShNYXRoKTtcblxuLypcbkNyeXB0b0pTIHYzLjEuMiBzaGExLW1pbi5qc1xuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzXG4oYykgMjAwOS0yMDEzIGJ5IEplZmYgTW90dC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qcy93aWtpL0xpY2Vuc2VcbiovXG4oZnVuY3Rpb24oKXt2YXIgaz1DcnlwdG9KUyxiPWsubGliLG09Yi5Xb3JkQXJyYXksbD1iLkhhc2hlcixkPVtdLGI9ay5hbGdvLlNIQTE9bC5leHRlbmQoe19kb1Jlc2V0OmZ1bmN0aW9uKCl7dGhpcy5faGFzaD1uZXcgbS5pbml0KFsxNzMyNTg0MTkzLDQwMjMyMzM0MTcsMjU2MjM4MzEwMiwyNzE3MzM4NzgsMzI4NTM3NzUyMF0pfSxfZG9Qcm9jZXNzQmxvY2s6ZnVuY3Rpb24obixwKXtmb3IodmFyIGE9dGhpcy5faGFzaC53b3JkcyxlPWFbMF0sZj1hWzFdLGg9YVsyXSxqPWFbM10sYj1hWzRdLGM9MDs4MD5jO2MrKyl7aWYoMTY+YylkW2NdPW5bcCtjXXwwO2Vsc2V7dmFyIGc9ZFtjLTNdXmRbYy04XV5kW2MtMTRdXmRbYy0xNl07ZFtjXT1nPDwxfGc+Pj4zMX1nPShlPDw1fGU+Pj4yNykrYitkW2NdO2c9MjA+Yz9nKygoZiZofH5mJmopKzE1MTg1MDAyNDkpOjQwPmM/ZysoKGZeaF5qKSsxODU5Nzc1MzkzKTo2MD5jP2crKChmJmh8ZiZqfGgmaiktMTg5NDAwNzU4OCk6ZysoKGZeaF5cbmopLTg5OTQ5NzUxNCk7Yj1qO2o9aDtoPWY8PDMwfGY+Pj4yO2Y9ZTtlPWd9YVswXT1hWzBdK2V8MDthWzFdPWFbMV0rZnwwO2FbMl09YVsyXStofDA7YVszXT1hWzNdK2p8MDthWzRdPWFbNF0rYnwwfSxfZG9GaW5hbGl6ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuX2RhdGEsZD1iLndvcmRzLGE9OCp0aGlzLl9uRGF0YUJ5dGVzLGU9OCpiLnNpZ0J5dGVzO2RbZT4+PjVdfD0xMjg8PDI0LWUlMzI7ZFsoZSs2ND4+Pjk8PDQpKzE0XT1NYXRoLmZsb29yKGEvNDI5NDk2NzI5Nik7ZFsoZSs2ND4+Pjk8PDQpKzE1XT1hO2Iuc2lnQnl0ZXM9NCpkLmxlbmd0aDt0aGlzLl9wcm9jZXNzKCk7cmV0dXJuIHRoaXMuX2hhc2h9LGNsb25lOmZ1bmN0aW9uKCl7dmFyIGI9bC5jbG9uZS5jYWxsKHRoaXMpO2IuX2hhc2g9dGhpcy5faGFzaC5jbG9uZSgpO3JldHVybiBifX0pO2suU0hBMT1sLl9jcmVhdGVIZWxwZXIoYik7ay5IbWFjU0hBMT1sLl9jcmVhdGVIbWFjSGVscGVyKGIpfSkoKTtcblxuLypcbkNyeXB0b0pTIHYzLjEuMiBzaGEyNTYtbWluLmpzXG5jb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanNcbihjKSAyMDA5LTIwMTMgYnkgSmVmZiBNb3R0LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzL3dpa2kvTGljZW5zZVxuKi9cbihmdW5jdGlvbihrKXtmb3IodmFyIGc9Q3J5cHRvSlMsaD1nLmxpYix2PWguV29yZEFycmF5LGo9aC5IYXNoZXIsaD1nLmFsZ28scz1bXSx0PVtdLHU9ZnVuY3Rpb24ocSl7cmV0dXJuIDQyOTQ5NjcyOTYqKHEtKHF8MCkpfDB9LGw9MixiPTA7NjQ+Yjspe3ZhciBkO2E6e2Q9bDtmb3IodmFyIHc9ay5zcXJ0KGQpLHI9MjtyPD13O3IrKylpZighKGQlcikpe2Q9ITE7YnJlYWsgYX1kPSEwfWQmJig4PmImJihzW2JdPXUoay5wb3cobCwwLjUpKSksdFtiXT11KGsucG93KGwsMS8zKSksYisrKTtsKyt9dmFyIG49W10saD1oLlNIQTI1Nj1qLmV4dGVuZCh7X2RvUmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLl9oYXNoPW5ldyB2LmluaXQocy5zbGljZSgwKSl9LF9kb1Byb2Nlc3NCbG9jazpmdW5jdGlvbihxLGgpe2Zvcih2YXIgYT10aGlzLl9oYXNoLndvcmRzLGM9YVswXSxkPWFbMV0sYj1hWzJdLGs9YVszXSxmPWFbNF0sZz1hWzVdLGo9YVs2XSxsPWFbN10sZT0wOzY0PmU7ZSsrKXtpZigxNj5lKW5bZV09XG5xW2grZV18MDtlbHNle3ZhciBtPW5bZS0xNV0scD1uW2UtMl07bltlXT0oKG08PDI1fG0+Pj43KV4obTw8MTR8bT4+PjE4KV5tPj4+MykrbltlLTddKygocDw8MTV8cD4+PjE3KV4ocDw8MTN8cD4+PjE5KV5wPj4+MTApK25bZS0xNl19bT1sKygoZjw8MjZ8Zj4+PjYpXihmPDwyMXxmPj4+MTEpXihmPDw3fGY+Pj4yNSkpKyhmJmdefmYmaikrdFtlXStuW2VdO3A9KChjPDwzMHxjPj4+MileKGM8PDE5fGM+Pj4xMyleKGM8PDEwfGM+Pj4yMikpKyhjJmReYyZiXmQmYik7bD1qO2o9ZztnPWY7Zj1rK218MDtrPWI7Yj1kO2Q9YztjPW0rcHwwfWFbMF09YVswXStjfDA7YVsxXT1hWzFdK2R8MDthWzJdPWFbMl0rYnwwO2FbM109YVszXStrfDA7YVs0XT1hWzRdK2Z8MDthWzVdPWFbNV0rZ3wwO2FbNl09YVs2XStqfDA7YVs3XT1hWzddK2x8MH0sX2RvRmluYWxpemU6ZnVuY3Rpb24oKXt2YXIgZD10aGlzLl9kYXRhLGI9ZC53b3JkcyxhPTgqdGhpcy5fbkRhdGFCeXRlcyxjPTgqZC5zaWdCeXRlcztcbmJbYz4+PjVdfD0xMjg8PDI0LWMlMzI7YlsoYys2ND4+Pjk8PDQpKzE0XT1rLmZsb29yKGEvNDI5NDk2NzI5Nik7YlsoYys2ND4+Pjk8PDQpKzE1XT1hO2Quc2lnQnl0ZXM9NCpiLmxlbmd0aDt0aGlzLl9wcm9jZXNzKCk7cmV0dXJuIHRoaXMuX2hhc2h9LGNsb25lOmZ1bmN0aW9uKCl7dmFyIGI9ai5jbG9uZS5jYWxsKHRoaXMpO2IuX2hhc2g9dGhpcy5faGFzaC5jbG9uZSgpO3JldHVybiBifX0pO2cuU0hBMjU2PWouX2NyZWF0ZUhlbHBlcihoKTtnLkhtYWNTSEEyNTY9ai5fY3JlYXRlSG1hY0hlbHBlcihoKX0pKE1hdGgpO1xuXG4vKlxuQ3J5cHRvSlMgdjMuMS4yIHNoYTIyNC1taW4uanNcbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qc1xuKGMpIDIwMDktMjAxMyBieSBKZWZmIE1vdHQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5jb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanMvd2lraS9MaWNlbnNlXG4qL1xuKGZ1bmN0aW9uKCl7dmFyIGI9Q3J5cHRvSlMsZD1iLmxpYi5Xb3JkQXJyYXksYT1iLmFsZ28sYz1hLlNIQTI1NixhPWEuU0hBMjI0PWMuZXh0ZW5kKHtfZG9SZXNldDpmdW5jdGlvbigpe3RoaXMuX2hhc2g9bmV3IGQuaW5pdChbMzIzODM3MTAzMiw5MTQxNTA2NjMsODEyNzAyOTk5LDQxNDQ5MTI2OTcsNDI5MDc3NTg1NywxNzUwNjAzMDI1LDE2OTQwNzY4MzksMzIwNDA3NTQyOF0pfSxfZG9GaW5hbGl6ZTpmdW5jdGlvbigpe3ZhciBhPWMuX2RvRmluYWxpemUuY2FsbCh0aGlzKTthLnNpZ0J5dGVzLT00O3JldHVybiBhfX0pO2IuU0hBMjI0PWMuX2NyZWF0ZUhlbHBlcihhKTtiLkhtYWNTSEEyMjQ9Yy5fY3JlYXRlSG1hY0hlbHBlcihhKX0pKCk7XG5cbi8qXG5DcnlwdG9KUyB2My4xLjIgc2hhNTEyLW1pbi5qc1xuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzXG4oYykgMjAwOS0yMDEzIGJ5IEplZmYgTW90dC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qcy93aWtpL0xpY2Vuc2VcbiovXG4oZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7cmV0dXJuIGQuY3JlYXRlLmFwcGx5KGQsYXJndW1lbnRzKX1mb3IodmFyIG49Q3J5cHRvSlMscj1uLmxpYi5IYXNoZXIsZT1uLng2NCxkPWUuV29yZCxUPWUuV29yZEFycmF5LGU9bi5hbGdvLGVhPVthKDExMTYzNTI0MDgsMzYwOTc2NzQ1OCksYSgxODk5NDQ3NDQxLDYwMjg5MTcyNSksYSgzMDQ5MzIzNDcxLDM5NjQ0ODQzOTkpLGEoMzkyMTAwOTU3MywyMTczMjk1NTQ4KSxhKDk2MTk4NzE2Myw0MDgxNjI4NDcyKSxhKDE1MDg5NzA5OTMsMzA1MzgzNDI2NSksYSgyNDUzNjM1NzQ4LDI5Mzc2NzE1NzkpLGEoMjg3MDc2MzIyMSwzNjY0NjA5NTYwKSxhKDM2MjQzODEwODAsMjczNDg4MzM5NCksYSgzMTA1OTg0MDEsMTE2NDk5NjU0MiksYSg2MDcyMjUyNzgsMTMyMzYxMDc2NCksYSgxNDI2ODgxOTg3LDM1OTAzMDQ5OTQpLGEoMTkyNTA3ODM4OCw0MDY4MTgyMzgzKSxhKDIxNjIwNzgyMDYsOTkxMzM2MTEzKSxhKDI2MTQ4ODgxMDMsNjMzODAzMzE3KSxcbmEoMzI0ODIyMjU4MCwzNDc5Nzc0ODY4KSxhKDM4MzUzOTA0MDEsMjY2NjYxMzQ1OCksYSg0MDIyMjI0Nzc0LDk0NDcxMTEzOSksYSgyNjQzNDcwNzgsMjM0MTI2Mjc3MyksYSg2MDQ4MDc2MjgsMjAwNzgwMDkzMyksYSg3NzAyNTU5ODMsMTQ5NTk5MDkwMSksYSgxMjQ5MTUwMTIyLDE4NTY0MzEyMzUpLGEoMTU1NTA4MTY5MiwzMTc1MjE4MTMyKSxhKDE5OTYwNjQ5ODYsMjE5ODk1MDgzNyksYSgyNTU0MjIwODgyLDM5OTk3MTkzMzkpLGEoMjgyMTgzNDM0OSw3NjY3ODQwMTYpLGEoMjk1Mjk5NjgwOCwyNTY2NTk0ODc5KSxhKDMyMTAzMTM2NzEsMzIwMzMzNzk1NiksYSgzMzM2NTcxODkxLDEwMzQ0NTcwMjYpLGEoMzU4NDUyODcxMSwyNDY2OTQ4OTAxKSxhKDExMzkyNjk5MywzNzU4MzI2MzgzKSxhKDMzODI0MTg5NSwxNjg3MTc5MzYpLGEoNjY2MzA3MjA1LDExODgxNzk5NjQpLGEoNzczNTI5OTEyLDE1NDYwNDU3MzQpLGEoMTI5NDc1NzM3MiwxNTIyODA1NDg1KSxhKDEzOTYxODIyOTEsXG4yNjQzODMzODIzKSxhKDE2OTUxODM3MDAsMjM0MzUyNzM5MCksYSgxOTg2NjYxMDUxLDEwMTQ0Nzc0ODApLGEoMjE3NzAyNjM1MCwxMjA2NzU5MTQyKSxhKDI0NTY5NTYwMzcsMzQ0MDc3NjI3KSxhKDI3MzA0ODU5MjEsMTI5MDg2MzQ2MCksYSgyODIwMzAyNDExLDMxNTg0NTQyNzMpLGEoMzI1OTczMDgwMCwzNTA1OTUyNjU3KSxhKDMzNDU3NjQ3NzEsMTA2MjE3MDA4KSxhKDM1MTYwNjU4MTcsMzYwNjAwODM0NCksYSgzNjAwMzUyODA0LDE0MzI3MjU3NzYpLGEoNDA5NDU3MTkwOSwxNDY3MDMxNTk0KSxhKDI3NTQyMzM0NCw4NTExNjk3MjApLGEoNDMwMjI3NzM0LDMxMDA4MjM3NTIpLGEoNTA2OTQ4NjE2LDEzNjMyNTgxOTUpLGEoNjU5MDYwNTU2LDM3NTA2ODU1OTMpLGEoODgzOTk3ODc3LDM3ODUwNTAyODApLGEoOTU4MTM5NTcxLDMzMTgzMDc0MjcpLGEoMTMyMjgyMjIxOCwzODEyNzIzNDAzKSxhKDE1MzcwMDIwNjMsMjAwMzAzNDk5NSksYSgxNzQ3ODczNzc5LDM2MDIwMzY4OTkpLFxuYSgxOTU1NTYyMjIyLDE1NzU5OTAwMTIpLGEoMjAyNDEwNDgxNSwxMTI1NTkyOTI4KSxhKDIyMjc3MzA0NTIsMjcxNjkwNDMwNiksYSgyMzYxODUyNDI0LDQ0Mjc3NjA0NCksYSgyNDI4NDM2NDc0LDU5MzY5ODM0NCksYSgyNzU2NzM0MTg3LDM3MzMxMTAyNDkpLGEoMzIwNDAzMTQ3OSwyOTk5MzUxNTczKSxhKDMzMjkzMjUyOTgsMzgxNTkyMDQyNyksYSgzMzkxNTY5NjE0LDM5MjgzODM5MDApLGEoMzUxNTI2NzI3MSw1NjYyODA3MTEpLGEoMzk0MDE4NzYwNiwzNDU0MDY5NTM0KSxhKDQxMTg2MzAyNzEsNDAwMDIzOTk5MiksYSgxMTY0MTg0NzQsMTkxNDEzODU1NCksYSgxNzQyOTI0MjEsMjczMTA1NTI3MCksYSgyODkzODAzNTYsMzIwMzk5MzAwNiksYSg0NjAzOTMyNjksMzIwNjIwMzE1KSxhKDY4NTQ3MTczMyw1ODc0OTY4MzYpLGEoODUyMTQyOTcxLDEwODY3OTI4NTEpLGEoMTAxNzAzNjI5OCwzNjU1NDMxMDApLGEoMTEyNjAwMDU4MCwyNjE4Mjk3Njc2KSxhKDEyODgwMzM0NzAsXG4zNDA5ODU1MTU4KSxhKDE1MDE1MDU5NDgsNDIzNDUwOTg2NiksYSgxNjA3MTY3OTE1LDk4NzE2NzQ2OCksYSgxODE2NDAyMzE2LDEyNDYxODk1OTEpXSx2PVtdLHc9MDs4MD53O3crKyl2W3ddPWEoKTtlPWUuU0hBNTEyPXIuZXh0ZW5kKHtfZG9SZXNldDpmdW5jdGlvbigpe3RoaXMuX2hhc2g9bmV3IFQuaW5pdChbbmV3IGQuaW5pdCgxNzc5MDMzNzAzLDQwODkyMzU3MjApLG5ldyBkLmluaXQoMzE0NDEzNDI3NywyMjI3ODczNTk1KSxuZXcgZC5pbml0KDEwMTM5MDQyNDIsNDI3MTE3NTcyMyksbmV3IGQuaW5pdCgyNzczNDgwNzYyLDE1OTU3NTAxMjkpLG5ldyBkLmluaXQoMTM1OTg5MzExOSwyOTE3NTY1MTM3KSxuZXcgZC5pbml0KDI2MDA4MjI5MjQsNzI1NTExMTk5KSxuZXcgZC5pbml0KDUyODczNDYzNSw0MjE1Mzg5NTQ3KSxuZXcgZC5pbml0KDE1NDE0NTkyMjUsMzI3MDMzMjA5KV0pfSxfZG9Qcm9jZXNzQmxvY2s6ZnVuY3Rpb24oYSxkKXtmb3IodmFyIGY9dGhpcy5faGFzaC53b3JkcyxcbkY9ZlswXSxlPWZbMV0sbj1mWzJdLHI9ZlszXSxHPWZbNF0sSD1mWzVdLEk9Zls2XSxmPWZbN10sdz1GLmhpZ2gsSj1GLmxvdyxYPWUuaGlnaCxLPWUubG93LFk9bi5oaWdoLEw9bi5sb3csWj1yLmhpZ2gsTT1yLmxvdywkPUcuaGlnaCxOPUcubG93LGFhPUguaGlnaCxPPUgubG93LGJhPUkuaGlnaCxQPUkubG93LGNhPWYuaGlnaCxRPWYubG93LGs9dyxnPUosej1YLHg9SyxBPVkseT1MLFU9WixCPU0sbD0kLGg9TixSPWFhLEM9TyxTPWJhLEQ9UCxWPWNhLEU9USxtPTA7ODA+bTttKyspe3ZhciBzPXZbbV07aWYoMTY+bSl2YXIgaj1zLmhpZ2g9YVtkKzIqbV18MCxiPXMubG93PWFbZCsyKm0rMV18MDtlbHNle3ZhciBqPXZbbS0xNV0sYj1qLmhpZ2gscD1qLmxvdyxqPShiPj4+MXxwPDwzMSleKGI+Pj44fHA8PDI0KV5iPj4+NyxwPShwPj4+MXxiPDwzMSleKHA+Pj44fGI8PDI0KV4ocD4+Pjd8Yjw8MjUpLHU9dlttLTJdLGI9dS5oaWdoLGM9dS5sb3csdT0oYj4+PjE5fGM8PDEzKV4oYjw8XG4zfGM+Pj4yOSleYj4+PjYsYz0oYz4+PjE5fGI8PDEzKV4oYzw8M3xiPj4+MjkpXihjPj4+NnxiPDwyNiksYj12W20tN10sVz1iLmhpZ2gsdD12W20tMTZdLHE9dC5oaWdoLHQ9dC5sb3csYj1wK2IubG93LGo9aitXKyhiPj4+MDxwPj4+MD8xOjApLGI9YitjLGo9ait1KyhiPj4+MDxjPj4+MD8xOjApLGI9Yit0LGo9aitxKyhiPj4+MDx0Pj4+MD8xOjApO3MuaGlnaD1qO3MubG93PWJ9dmFyIFc9bCZSXn5sJlMsdD1oJkNefmgmRCxzPWsmel5rJkFeeiZBLFQ9ZyZ4XmcmeV54JnkscD0oaz4+PjI4fGc8PDQpXihrPDwzMHxnPj4+MileKGs8PDI1fGc+Pj43KSx1PShnPj4+Mjh8azw8NCleKGc8PDMwfGs+Pj4yKV4oZzw8MjV8az4+PjcpLGM9ZWFbbV0sZmE9Yy5oaWdoLGRhPWMubG93LGM9RSsoKGg+Pj4xNHxsPDwxOCleKGg+Pj4xOHxsPDwxNCleKGg8PDIzfGw+Pj45KSkscT1WKygobD4+PjE0fGg8PDE4KV4obD4+PjE4fGg8PDE0KV4obDw8MjN8aD4+PjkpKSsoYz4+PjA8RT4+PjA/MTpcbjApLGM9Yyt0LHE9cStXKyhjPj4+MDx0Pj4+MD8xOjApLGM9YytkYSxxPXErZmErKGM+Pj4wPGRhPj4+MD8xOjApLGM9YytiLHE9cStqKyhjPj4+MDxiPj4+MD8xOjApLGI9dStULHM9cCtzKyhiPj4+MDx1Pj4+MD8xOjApLFY9UyxFPUQsUz1SLEQ9QyxSPWwsQz1oLGg9QitjfDAsbD1VK3ErKGg+Pj4wPEI+Pj4wPzE6MCl8MCxVPUEsQj15LEE9eix5PXgsej1rLHg9ZyxnPWMrYnwwLGs9cStzKyhnPj4+MDxjPj4+MD8xOjApfDB9Sj1GLmxvdz1KK2c7Ri5oaWdoPXcraysoSj4+PjA8Zz4+PjA/MTowKTtLPWUubG93PUsreDtlLmhpZ2g9WCt6KyhLPj4+MDx4Pj4+MD8xOjApO0w9bi5sb3c9TCt5O24uaGlnaD1ZK0ErKEw+Pj4wPHk+Pj4wPzE6MCk7TT1yLmxvdz1NK0I7ci5oaWdoPVorVSsoTT4+PjA8Qj4+PjA/MTowKTtOPUcubG93PU4raDtHLmhpZ2g9JCtsKyhOPj4+MDxoPj4+MD8xOjApO089SC5sb3c9TytDO0guaGlnaD1hYStSKyhPPj4+MDxDPj4+MD8xOjApO1A9SS5sb3c9UCtEO1xuSS5oaWdoPWJhK1MrKFA+Pj4wPEQ+Pj4wPzE6MCk7UT1mLmxvdz1RK0U7Zi5oaWdoPWNhK1YrKFE+Pj4wPEU+Pj4wPzE6MCl9LF9kb0ZpbmFsaXplOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5fZGF0YSxkPWEud29yZHMsZj04KnRoaXMuX25EYXRhQnl0ZXMsZT04KmEuc2lnQnl0ZXM7ZFtlPj4+NV18PTEyODw8MjQtZSUzMjtkWyhlKzEyOD4+PjEwPDw1KSszMF09TWF0aC5mbG9vcihmLzQyOTQ5NjcyOTYpO2RbKGUrMTI4Pj4+MTA8PDUpKzMxXT1mO2Euc2lnQnl0ZXM9NCpkLmxlbmd0aDt0aGlzLl9wcm9jZXNzKCk7cmV0dXJuIHRoaXMuX2hhc2gudG9YMzIoKX0sY2xvbmU6ZnVuY3Rpb24oKXt2YXIgYT1yLmNsb25lLmNhbGwodGhpcyk7YS5faGFzaD10aGlzLl9oYXNoLmNsb25lKCk7cmV0dXJuIGF9LGJsb2NrU2l6ZTozMn0pO24uU0hBNTEyPXIuX2NyZWF0ZUhlbHBlcihlKTtuLkhtYWNTSEE1MTI9ci5fY3JlYXRlSG1hY0hlbHBlcihlKX0pKCk7XG5cbi8qXG5DcnlwdG9KUyB2My4xLjIgc2hhMzg0LW1pbi5qc1xuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzXG4oYykgMjAwOS0yMDEzIGJ5IEplZmYgTW90dC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qcy93aWtpL0xpY2Vuc2VcbiovXG4oZnVuY3Rpb24oKXt2YXIgYz1DcnlwdG9KUyxhPWMueDY0LGI9YS5Xb3JkLGU9YS5Xb3JkQXJyYXksYT1jLmFsZ28sZD1hLlNIQTUxMixhPWEuU0hBMzg0PWQuZXh0ZW5kKHtfZG9SZXNldDpmdW5jdGlvbigpe3RoaXMuX2hhc2g9bmV3IGUuaW5pdChbbmV3IGIuaW5pdCgzNDE4MDcwMzY1LDMyMzgzNzEwMzIpLG5ldyBiLmluaXQoMTY1NDI3MDI1MCw5MTQxNTA2NjMpLG5ldyBiLmluaXQoMjQzODUyOTM3MCw4MTI3MDI5OTkpLG5ldyBiLmluaXQoMzU1NDYyMzYwLDQxNDQ5MTI2OTcpLG5ldyBiLmluaXQoMTczMTQwNTQxNSw0MjkwNzc1ODU3KSxuZXcgYi5pbml0KDIzOTQxODAyMzEsMTc1MDYwMzAyNSksbmV3IGIuaW5pdCgzNjc1MDA4NTI1LDE2OTQwNzY4MzkpLG5ldyBiLmluaXQoMTIwMzA2MjgxMywzMjA0MDc1NDI4KV0pfSxfZG9GaW5hbGl6ZTpmdW5jdGlvbigpe3ZhciBhPWQuX2RvRmluYWxpemUuY2FsbCh0aGlzKTthLnNpZ0J5dGVzLT0xNjtyZXR1cm4gYX19KTtjLlNIQTM4ND1cbmQuX2NyZWF0ZUhlbHBlcihhKTtjLkhtYWNTSEEzODQ9ZC5fY3JlYXRlSG1hY0hlbHBlcihhKX0pKCk7XG5cbi8qXG5DcnlwdG9KUyB2My4xLjIgcmlwZW1kMTYwLW1pbi5qc1xuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzXG4oYykgMjAwOS0yMDEzIGJ5IEplZmYgTW90dC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qcy93aWtpL0xpY2Vuc2VcbiovXG4vKlxuXG4oYykgMjAxMiBieSBDZWRyaWMgTWVzbmlsLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXG5SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG5cbiAgICAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAgICAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cblxuVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cbihmdW5jdGlvbigpe3ZhciBxPUNyeXB0b0pTLGQ9cS5saWIsbj1kLldvcmRBcnJheSxwPWQuSGFzaGVyLGQ9cS5hbGdvLHg9bi5jcmVhdGUoWzAsMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMTUsNyw0LDEzLDEsMTAsNiwxNSwzLDEyLDAsOSw1LDIsMTQsMTEsOCwzLDEwLDE0LDQsOSwxNSw4LDEsMiw3LDAsNiwxMywxMSw1LDEyLDEsOSwxMSwxMCwwLDgsMTIsNCwxMywzLDcsMTUsMTQsNSw2LDIsNCwwLDUsOSw3LDEyLDIsMTAsMTQsMSwzLDgsMTEsNiwxNSwxM10pLHk9bi5jcmVhdGUoWzUsMTQsNywwLDksMiwxMSw0LDEzLDYsMTUsOCwxLDEwLDMsMTIsNiwxMSwzLDcsMCwxMyw1LDEwLDE0LDE1LDgsMTIsNCw5LDEsMiwxNSw1LDEsMyw3LDE0LDYsOSwxMSw4LDEyLDIsMTAsMCw0LDEzLDgsNiw0LDEsMywxMSwxNSwwLDUsMTIsMiwxMyw5LDcsMTAsMTQsMTIsMTUsMTAsNCwxLDUsOCw3LDYsMiwxMywxNCwwLDMsOSwxMV0pLHo9bi5jcmVhdGUoWzExLDE0LDE1LDEyLFxuNSw4LDcsOSwxMSwxMywxNCwxNSw2LDcsOSw4LDcsNiw4LDEzLDExLDksNywxNSw3LDEyLDE1LDksMTEsNywxMywxMiwxMSwxMyw2LDcsMTQsOSwxMywxNSwxNCw4LDEzLDYsNSwxMiw3LDUsMTEsMTIsMTQsMTUsMTQsMTUsOSw4LDksMTQsNSw2LDgsNiw1LDEyLDksMTUsNSwxMSw2LDgsMTMsMTIsNSwxMiwxMywxNCwxMSw4LDUsNl0pLEE9bi5jcmVhdGUoWzgsOSw5LDExLDEzLDE1LDE1LDUsNyw3LDgsMTEsMTQsMTQsMTIsNiw5LDEzLDE1LDcsMTIsOCw5LDExLDcsNywxMiw3LDYsMTUsMTMsMTEsOSw3LDE1LDExLDgsNiw2LDE0LDEyLDEzLDUsMTQsMTMsMTMsNyw1LDE1LDUsOCwxMSwxNCwxNCw2LDE0LDYsOSwxMiw5LDEyLDUsMTUsOCw4LDUsMTIsOSwxMiw1LDE0LDYsOCwxMyw2LDUsMTUsMTMsMTEsMTFdKSxCPW4uY3JlYXRlKFswLDE1MTg1MDAyNDksMTg1OTc3NTM5MywyNDAwOTU5NzA4LDI4NDA4NTM4MzhdKSxDPW4uY3JlYXRlKFsxMzUyODI5OTI2LDE1NDg2MDM2ODQsMTgzNjA3MjY5MSxcbjIwNTM5OTQyMTcsMF0pLGQ9ZC5SSVBFTUQxNjA9cC5leHRlbmQoe19kb1Jlc2V0OmZ1bmN0aW9uKCl7dGhpcy5faGFzaD1uLmNyZWF0ZShbMTczMjU4NDE5Myw0MDIzMjMzNDE3LDI1NjIzODMxMDIsMjcxNzMzODc4LDMyODUzNzc1MjBdKX0sX2RvUHJvY2Vzc0Jsb2NrOmZ1bmN0aW9uKGUsdil7Zm9yKHZhciBiPTA7MTY+YjtiKyspe3ZhciBjPXYrYixmPWVbY107ZVtjXT0oZjw8OHxmPj4+MjQpJjE2NzExOTM1fChmPDwyNHxmPj4+OCkmNDI3ODI1NTM2MH12YXIgYz10aGlzLl9oYXNoLndvcmRzLGY9Qi53b3JkcyxkPUMud29yZHMsbj14LndvcmRzLHE9eS53b3JkcyxwPXoud29yZHMsdz1BLndvcmRzLHQsZyxoLGoscix1LGssbCxtLHM7dT10PWNbMF07az1nPWNbMV07bD1oPWNbMl07bT1qPWNbM107cz1yPWNbNF07Zm9yKHZhciBhLGI9MDs4MD5iO2IrPTEpYT10K2VbdituW2JdXXwwLGE9MTY+Yj9hKygoZ15oXmopK2ZbMF0pOjMyPmI/YSsoKGcmaHx+ZyZqKStmWzFdKTo0OD5iP1xuYSsoKChnfH5oKV5qKStmWzJdKTo2ND5iP2ErKChnJmp8aCZ+aikrZlszXSk6YSsoKGdeKGh8fmopKStmWzRdKSxhfD0wLGE9YTw8cFtiXXxhPj4+MzItcFtiXSxhPWErcnwwLHQ9cixyPWosaj1oPDwxMHxoPj4+MjIsaD1nLGc9YSxhPXUrZVt2K3FbYl1dfDAsYT0xNj5iP2ErKChrXihsfH5tKSkrZFswXSk6MzI+Yj9hKygoayZtfGwmfm0pK2RbMV0pOjQ4PmI/YSsoKChrfH5sKV5tKStkWzJdKTo2ND5iP2ErKChrJmx8fmsmbSkrZFszXSk6YSsoKGtebF5tKStkWzRdKSxhfD0wLGE9YTw8d1tiXXxhPj4+MzItd1tiXSxhPWErc3wwLHU9cyxzPW0sbT1sPDwxMHxsPj4+MjIsbD1rLGs9YTthPWNbMV0raCttfDA7Y1sxXT1jWzJdK2orc3wwO2NbMl09Y1szXStyK3V8MDtjWzNdPWNbNF0rdCtrfDA7Y1s0XT1jWzBdK2crbHwwO2NbMF09YX0sX2RvRmluYWxpemU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9kYXRhLGQ9ZS53b3JkcyxiPTgqdGhpcy5fbkRhdGFCeXRlcyxjPTgqZS5zaWdCeXRlcztcbmRbYz4+PjVdfD0xMjg8PDI0LWMlMzI7ZFsoYys2ND4+Pjk8PDQpKzE0XT0oYjw8OHxiPj4+MjQpJjE2NzExOTM1fChiPDwyNHxiPj4+OCkmNDI3ODI1NTM2MDtlLnNpZ0J5dGVzPTQqKGQubGVuZ3RoKzEpO3RoaXMuX3Byb2Nlc3MoKTtlPXRoaXMuX2hhc2g7ZD1lLndvcmRzO2ZvcihiPTA7NT5iO2IrKyljPWRbYl0sZFtiXT0oYzw8OHxjPj4+MjQpJjE2NzExOTM1fChjPDwyNHxjPj4+OCkmNDI3ODI1NTM2MDtyZXR1cm4gZX0sY2xvbmU6ZnVuY3Rpb24oKXt2YXIgZD1wLmNsb25lLmNhbGwodGhpcyk7ZC5faGFzaD10aGlzLl9oYXNoLmNsb25lKCk7cmV0dXJuIGR9fSk7cS5SSVBFTUQxNjA9cC5fY3JlYXRlSGVscGVyKGQpO3EuSG1hY1JJUEVNRDE2MD1wLl9jcmVhdGVIbWFjSGVscGVyKGQpfSkoTWF0aCk7XG5cbi8qXG5DcnlwdG9KUyB2My4xLjIgaG1hYy1taW4uanNcbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qc1xuKGMpIDIwMDktMjAxMyBieSBKZWZmIE1vdHQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5jb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanMvd2lraS9MaWNlbnNlXG4qL1xuKGZ1bmN0aW9uKCl7dmFyIGM9Q3J5cHRvSlMsaz1jLmVuYy5VdGY4O2MuYWxnby5ITUFDPWMubGliLkJhc2UuZXh0ZW5kKHtpbml0OmZ1bmN0aW9uKGEsYil7YT10aGlzLl9oYXNoZXI9bmV3IGEuaW5pdDtcInN0cmluZ1wiPT10eXBlb2YgYiYmKGI9ay5wYXJzZShiKSk7dmFyIGM9YS5ibG9ja1NpemUsZT00KmM7Yi5zaWdCeXRlcz5lJiYoYj1hLmZpbmFsaXplKGIpKTtiLmNsYW1wKCk7Zm9yKHZhciBmPXRoaXMuX29LZXk9Yi5jbG9uZSgpLGc9dGhpcy5faUtleT1iLmNsb25lKCksaD1mLndvcmRzLGo9Zy53b3JkcyxkPTA7ZDxjO2QrKyloW2RdXj0xNTQ5NTU2ODI4LGpbZF1ePTkwOTUyMjQ4NjtmLnNpZ0J5dGVzPWcuc2lnQnl0ZXM9ZTt0aGlzLnJlc2V0KCl9LHJlc2V0OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5faGFzaGVyO2EucmVzZXQoKTthLnVwZGF0ZSh0aGlzLl9pS2V5KX0sdXBkYXRlOmZ1bmN0aW9uKGEpe3RoaXMuX2hhc2hlci51cGRhdGUoYSk7cmV0dXJuIHRoaXN9LGZpbmFsaXplOmZ1bmN0aW9uKGEpe3ZhciBiPVxudGhpcy5faGFzaGVyO2E9Yi5maW5hbGl6ZShhKTtiLnJlc2V0KCk7cmV0dXJuIGIuZmluYWxpemUodGhpcy5fb0tleS5jbG9uZSgpLmNvbmNhdChhKSl9fSl9KSgpO1xuXG4vKlxuQ3J5cHRvSlMgdjMuMS4yIHBia2RmMi1taW4uanNcbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qc1xuKGMpIDIwMDktMjAxMyBieSBKZWZmIE1vdHQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5jb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanMvd2lraS9MaWNlbnNlXG4qL1xuKGZ1bmN0aW9uKCl7dmFyIGI9Q3J5cHRvSlMsYT1iLmxpYixkPWEuQmFzZSxtPWEuV29yZEFycmF5LGE9Yi5hbGdvLHE9YS5ITUFDLGw9YS5QQktERjI9ZC5leHRlbmQoe2NmZzpkLmV4dGVuZCh7a2V5U2l6ZTo0LGhhc2hlcjphLlNIQTEsaXRlcmF0aW9uczoxfSksaW5pdDpmdW5jdGlvbihhKXt0aGlzLmNmZz10aGlzLmNmZy5leHRlbmQoYSl9LGNvbXB1dGU6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9dGhpcy5jZmcsZj1xLmNyZWF0ZShjLmhhc2hlcixhKSxnPW0uY3JlYXRlKCksZD1tLmNyZWF0ZShbMV0pLGw9Zy53b3JkcyxyPWQud29yZHMsbj1jLmtleVNpemUsYz1jLml0ZXJhdGlvbnM7bC5sZW5ndGg8bjspe3ZhciBoPWYudXBkYXRlKGIpLmZpbmFsaXplKGQpO2YucmVzZXQoKTtmb3IodmFyIGo9aC53b3JkcyxzPWoubGVuZ3RoLGs9aCxwPTE7cDxjO3ArKyl7az1mLmZpbmFsaXplKGspO2YucmVzZXQoKTtmb3IodmFyIHQ9ay53b3JkcyxlPTA7ZTxzO2UrKylqW2VdXj10W2VdfWcuY29uY2F0KGgpO1xuclswXSsrfWcuc2lnQnl0ZXM9NCpuO3JldHVybiBnfX0pO2IuUEJLREYyPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbC5jcmVhdGUoYykuY29tcHV0ZShhLGIpfX0pKCk7XG5cbi8qISAoYykgVG9tIFd1IHwgaHR0cDovL3d3dy1jcy1zdHVkZW50cy5zdGFuZm9yZC5lZHUvfnRqdy9qc2JuL1xuICovXG52YXIgYjY0bWFwPVwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrL1wiO3ZhciBiNjRwYWQ9XCI9XCI7ZnVuY3Rpb24gaGV4MmI2NChkKXt2YXIgYjt2YXIgZTt2YXIgYT1cIlwiO2ZvcihiPTA7YiszPD1kLmxlbmd0aDtiKz0zKXtlPXBhcnNlSW50KGQuc3Vic3RyaW5nKGIsYiszKSwxNik7YSs9YjY0bWFwLmNoYXJBdChlPj42KStiNjRtYXAuY2hhckF0KGUmNjMpfWlmKGIrMT09ZC5sZW5ndGgpe2U9cGFyc2VJbnQoZC5zdWJzdHJpbmcoYixiKzEpLDE2KTthKz1iNjRtYXAuY2hhckF0KGU8PDIpfWVsc2V7aWYoYisyPT1kLmxlbmd0aCl7ZT1wYXJzZUludChkLnN1YnN0cmluZyhiLGIrMiksMTYpO2ErPWI2NG1hcC5jaGFyQXQoZT4+MikrYjY0bWFwLmNoYXJBdCgoZSYzKTw8NCl9fWlmKGI2NHBhZCl7d2hpbGUoKGEubGVuZ3RoJjMpPjApe2ErPWI2NHBhZH19cmV0dXJuIGF9ZnVuY3Rpb24gYjY0dG9oZXgoZil7dmFyIGQ9XCJcIjt2YXIgZTt2YXIgYj0wO3ZhciBjO3ZhciBhO2ZvcihlPTA7ZTxmLmxlbmd0aDsrK2Upe2lmKGYuY2hhckF0KGUpPT1iNjRwYWQpe2JyZWFrfWE9YjY0bWFwLmluZGV4T2YoZi5jaGFyQXQoZSkpO2lmKGE8MCl7Y29udGludWV9aWYoYj09MCl7ZCs9aW50MmNoYXIoYT4+Mik7Yz1hJjM7Yj0xfWVsc2V7aWYoYj09MSl7ZCs9aW50MmNoYXIoKGM8PDIpfChhPj40KSk7Yz1hJjE1O2I9Mn1lbHNle2lmKGI9PTIpe2QrPWludDJjaGFyKGMpO2QrPWludDJjaGFyKGE+PjIpO2M9YSYzO2I9M31lbHNle2QrPWludDJjaGFyKChjPDwyKXwoYT4+NCkpO2QrPWludDJjaGFyKGEmMTUpO2I9MH19fX1pZihiPT0xKXtkKz1pbnQyY2hhcihjPDwyKX1yZXR1cm4gZH1mdW5jdGlvbiBiNjR0b0JBKGUpe3ZhciBkPWI2NHRvaGV4KGUpO3ZhciBjO3ZhciBiPW5ldyBBcnJheSgpO2ZvcihjPTA7MipjPGQubGVuZ3RoOysrYyl7YltjXT1wYXJzZUludChkLnN1YnN0cmluZygyKmMsMipjKzIpLDE2KX1yZXR1cm4gYn07XG4vKiEgKGMpIFRvbSBXdSB8IGh0dHA6Ly93d3ctY3Mtc3R1ZGVudHMuc3RhbmZvcmQuZWR1L350ancvanNibi9cbiAqL1xudmFyIGRiaXRzO3ZhciBjYW5hcnk9MjQ0ODM3ODE0MDk0NTkwO3ZhciBqX2xtPSgoY2FuYXJ5JjE2Nzc3MjE1KT09MTU3MTUwNzApO2Z1bmN0aW9uIEJpZ0ludGVnZXIoZSxkLGYpe2lmKGUhPW51bGwpe2lmKFwibnVtYmVyXCI9PXR5cGVvZiBlKXt0aGlzLmZyb21OdW1iZXIoZSxkLGYpfWVsc2V7aWYoZD09bnVsbCYmXCJzdHJpbmdcIiE9dHlwZW9mIGUpe3RoaXMuZnJvbVN0cmluZyhlLDI1Nil9ZWxzZXt0aGlzLmZyb21TdHJpbmcoZSxkKX19fX1mdW5jdGlvbiBuYmkoKXtyZXR1cm4gbmV3IEJpZ0ludGVnZXIobnVsbCl9ZnVuY3Rpb24gYW0xKGYsYSxiLGUsaCxnKXt3aGlsZSgtLWc+PTApe3ZhciBkPWEqdGhpc1tmKytdK2JbZV0raDtoPU1hdGguZmxvb3IoZC82NzEwODg2NCk7YltlKytdPWQmNjcxMDg4NjN9cmV0dXJuIGh9ZnVuY3Rpb24gYW0yKGYscSxyLGUsbyxhKXt2YXIgaz1xJjMyNzY3LHA9cT4+MTU7d2hpbGUoLS1hPj0wKXt2YXIgZD10aGlzW2ZdJjMyNzY3O3ZhciBnPXRoaXNbZisrXT4+MTU7dmFyIGI9cCpkK2cqaztkPWsqZCsoKGImMzI3NjcpPDwxNSkrcltlXSsobyYxMDczNzQxODIzKTtvPShkPj4+MzApKyhiPj4+MTUpK3AqZysobz4+PjMwKTtyW2UrK109ZCYxMDczNzQxODIzfXJldHVybiBvfWZ1bmN0aW9uIGFtMyhmLHEscixlLG8sYSl7dmFyIGs9cSYxNjM4MyxwPXE+PjE0O3doaWxlKC0tYT49MCl7dmFyIGQ9dGhpc1tmXSYxNjM4Mzt2YXIgZz10aGlzW2YrK10+PjE0O3ZhciBiPXAqZCtnKms7ZD1rKmQrKChiJjE2MzgzKTw8MTQpK3JbZV0rbztvPShkPj4yOCkrKGI+PjE0KStwKmc7cltlKytdPWQmMjY4NDM1NDU1fXJldHVybiBvfWlmKGpfbG0mJihuYXZpZ2F0b3IuYXBwTmFtZT09XCJNaWNyb3NvZnQgSW50ZXJuZXQgRXhwbG9yZXJcIikpe0JpZ0ludGVnZXIucHJvdG90eXBlLmFtPWFtMjtkYml0cz0zMH1lbHNle2lmKGpfbG0mJihuYXZpZ2F0b3IuYXBwTmFtZSE9XCJOZXRzY2FwZVwiKSl7QmlnSW50ZWdlci5wcm90b3R5cGUuYW09YW0xO2RiaXRzPTI2fWVsc2V7QmlnSW50ZWdlci5wcm90b3R5cGUuYW09YW0zO2RiaXRzPTI4fX1CaWdJbnRlZ2VyLnByb3RvdHlwZS5EQj1kYml0cztCaWdJbnRlZ2VyLnByb3RvdHlwZS5ETT0oKDE8PGRiaXRzKS0xKTtCaWdJbnRlZ2VyLnByb3RvdHlwZS5EVj0oMTw8ZGJpdHMpO3ZhciBCSV9GUD01MjtCaWdJbnRlZ2VyLnByb3RvdHlwZS5GVj1NYXRoLnBvdygyLEJJX0ZQKTtCaWdJbnRlZ2VyLnByb3RvdHlwZS5GMT1CSV9GUC1kYml0cztCaWdJbnRlZ2VyLnByb3RvdHlwZS5GMj0yKmRiaXRzLUJJX0ZQO3ZhciBCSV9STT1cIjAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5elwiO3ZhciBCSV9SQz1uZXcgQXJyYXkoKTt2YXIgcnIsdnY7cnI9XCIwXCIuY2hhckNvZGVBdCgwKTtmb3IodnY9MDt2djw9OTsrK3Z2KXtCSV9SQ1tycisrXT12dn1ycj1cImFcIi5jaGFyQ29kZUF0KDApO2Zvcih2dj0xMDt2djwzNjsrK3Z2KXtCSV9SQ1tycisrXT12dn1ycj1cIkFcIi5jaGFyQ29kZUF0KDApO2Zvcih2dj0xMDt2djwzNjsrK3Z2KXtCSV9SQ1tycisrXT12dn1mdW5jdGlvbiBpbnQyY2hhcihhKXtyZXR1cm4gQklfUk0uY2hhckF0KGEpfWZ1bmN0aW9uIGludEF0KGIsYSl7dmFyIGQ9QklfUkNbYi5jaGFyQ29kZUF0KGEpXTtyZXR1cm4oZD09bnVsbCk/LTE6ZH1mdW5jdGlvbiBibnBDb3B5VG8oYil7Zm9yKHZhciBhPXRoaXMudC0xO2E+PTA7LS1hKXtiW2FdPXRoaXNbYV19Yi50PXRoaXMudDtiLnM9dGhpcy5zfWZ1bmN0aW9uIGJucEZyb21JbnQoYSl7dGhpcy50PTE7dGhpcy5zPShhPDApPy0xOjA7aWYoYT4wKXt0aGlzWzBdPWF9ZWxzZXtpZihhPC0xKXt0aGlzWzBdPWErdGhpcy5EVn1lbHNle3RoaXMudD0wfX19ZnVuY3Rpb24gbmJ2KGEpe3ZhciBiPW5iaSgpO2IuZnJvbUludChhKTtyZXR1cm4gYn1mdW5jdGlvbiBibnBGcm9tU3RyaW5nKGgsYyl7dmFyIGU7aWYoYz09MTYpe2U9NH1lbHNle2lmKGM9PTgpe2U9M31lbHNle2lmKGM9PTI1Nil7ZT04fWVsc2V7aWYoYz09Mil7ZT0xfWVsc2V7aWYoYz09MzIpe2U9NX1lbHNle2lmKGM9PTQpe2U9Mn1lbHNle3RoaXMuZnJvbVJhZGl4KGgsYyk7cmV0dXJufX19fX19dGhpcy50PTA7dGhpcy5zPTA7dmFyIGc9aC5sZW5ndGgsZD1mYWxzZSxmPTA7d2hpbGUoLS1nPj0wKXt2YXIgYT0oZT09OCk/aFtnXSYyNTU6aW50QXQoaCxnKTtpZihhPDApe2lmKGguY2hhckF0KGcpPT1cIi1cIil7ZD10cnVlfWNvbnRpbnVlfWQ9ZmFsc2U7aWYoZj09MCl7dGhpc1t0aGlzLnQrK109YX1lbHNle2lmKGYrZT50aGlzLkRCKXt0aGlzW3RoaXMudC0xXXw9KGEmKCgxPDwodGhpcy5EQi1mKSktMSkpPDxmO3RoaXNbdGhpcy50KytdPShhPj4odGhpcy5EQi1mKSl9ZWxzZXt0aGlzW3RoaXMudC0xXXw9YTw8Zn19Zis9ZTtpZihmPj10aGlzLkRCKXtmLT10aGlzLkRCfX1pZihlPT04JiYoaFswXSYxMjgpIT0wKXt0aGlzLnM9LTE7aWYoZj4wKXt0aGlzW3RoaXMudC0xXXw9KCgxPDwodGhpcy5EQi1mKSktMSk8PGZ9fXRoaXMuY2xhbXAoKTtpZihkKXtCaWdJbnRlZ2VyLlpFUk8uc3ViVG8odGhpcyx0aGlzKX19ZnVuY3Rpb24gYm5wQ2xhbXAoKXt2YXIgYT10aGlzLnMmdGhpcy5ETTt3aGlsZSh0aGlzLnQ+MCYmdGhpc1t0aGlzLnQtMV09PWEpey0tdGhpcy50fX1mdW5jdGlvbiBiblRvU3RyaW5nKGMpe2lmKHRoaXMuczwwKXtyZXR1cm5cIi1cIit0aGlzLm5lZ2F0ZSgpLnRvU3RyaW5nKGMpfXZhciBlO2lmKGM9PTE2KXtlPTR9ZWxzZXtpZihjPT04KXtlPTN9ZWxzZXtpZihjPT0yKXtlPTF9ZWxzZXtpZihjPT0zMil7ZT01fWVsc2V7aWYoYz09NCl7ZT0yfWVsc2V7cmV0dXJuIHRoaXMudG9SYWRpeChjKX19fX19dmFyIGc9KDE8PGUpLTEsbCxhPWZhbHNlLGg9XCJcIixmPXRoaXMudDt2YXIgaj10aGlzLkRCLShmKnRoaXMuREIpJWU7aWYoZi0tPjApe2lmKGo8dGhpcy5EQiYmKGw9dGhpc1tmXT4+aik+MCl7YT10cnVlO2g9aW50MmNoYXIobCl9d2hpbGUoZj49MCl7aWYoajxlKXtsPSh0aGlzW2ZdJigoMTw8aiktMSkpPDwoZS1qKTtsfD10aGlzWy0tZl0+PihqKz10aGlzLkRCLWUpfWVsc2V7bD0odGhpc1tmXT4+KGotPWUpKSZnO2lmKGo8PTApe2orPXRoaXMuREI7LS1mfX1pZihsPjApe2E9dHJ1ZX1pZihhKXtoKz1pbnQyY2hhcihsKX19fXJldHVybiBhP2g6XCIwXCJ9ZnVuY3Rpb24gYm5OZWdhdGUoKXt2YXIgYT1uYmkoKTtCaWdJbnRlZ2VyLlpFUk8uc3ViVG8odGhpcyxhKTtyZXR1cm4gYX1mdW5jdGlvbiBibkFicygpe3JldHVybih0aGlzLnM8MCk/dGhpcy5uZWdhdGUoKTp0aGlzfWZ1bmN0aW9uIGJuQ29tcGFyZVRvKGIpe3ZhciBkPXRoaXMucy1iLnM7aWYoZCE9MCl7cmV0dXJuIGR9dmFyIGM9dGhpcy50O2Q9Yy1iLnQ7aWYoZCE9MCl7cmV0dXJuKHRoaXMuczwwKT8tZDpkfXdoaWxlKC0tYz49MCl7aWYoKGQ9dGhpc1tjXS1iW2NdKSE9MCl7cmV0dXJuIGR9fXJldHVybiAwfWZ1bmN0aW9uIG5iaXRzKGEpe3ZhciBjPTEsYjtpZigoYj1hPj4+MTYpIT0wKXthPWI7Yys9MTZ9aWYoKGI9YT4+OCkhPTApe2E9YjtjKz04fWlmKChiPWE+PjQpIT0wKXthPWI7Yys9NH1pZigoYj1hPj4yKSE9MCl7YT1iO2MrPTJ9aWYoKGI9YT4+MSkhPTApe2E9YjtjKz0xfXJldHVybiBjfWZ1bmN0aW9uIGJuQml0TGVuZ3RoKCl7aWYodGhpcy50PD0wKXtyZXR1cm4gMH1yZXR1cm4gdGhpcy5EQioodGhpcy50LTEpK25iaXRzKHRoaXNbdGhpcy50LTFdXih0aGlzLnMmdGhpcy5ETSkpfWZ1bmN0aW9uIGJucERMU2hpZnRUbyhjLGIpe3ZhciBhO2ZvcihhPXRoaXMudC0xO2E+PTA7LS1hKXtiW2ErY109dGhpc1thXX1mb3IoYT1jLTE7YT49MDstLWEpe2JbYV09MH1iLnQ9dGhpcy50K2M7Yi5zPXRoaXMuc31mdW5jdGlvbiBibnBEUlNoaWZ0VG8oYyxiKXtmb3IodmFyIGE9YzthPHRoaXMudDsrK2Epe2JbYS1jXT10aGlzW2FdfWIudD1NYXRoLm1heCh0aGlzLnQtYywwKTtiLnM9dGhpcy5zfWZ1bmN0aW9uIGJucExTaGlmdFRvKGosZSl7dmFyIGI9aiV0aGlzLkRCO3ZhciBhPXRoaXMuREItYjt2YXIgZz0oMTw8YSktMTt2YXIgZj1NYXRoLmZsb29yKGovdGhpcy5EQiksaD0odGhpcy5zPDxiKSZ0aGlzLkRNLGQ7Zm9yKGQ9dGhpcy50LTE7ZD49MDstLWQpe2VbZCtmKzFdPSh0aGlzW2RdPj5hKXxoO2g9KHRoaXNbZF0mZyk8PGJ9Zm9yKGQ9Zi0xO2Q+PTA7LS1kKXtlW2RdPTB9ZVtmXT1oO2UudD10aGlzLnQrZisxO2Uucz10aGlzLnM7ZS5jbGFtcCgpfWZ1bmN0aW9uIGJucFJTaGlmdFRvKGcsZCl7ZC5zPXRoaXMuczt2YXIgZT1NYXRoLmZsb29yKGcvdGhpcy5EQik7aWYoZT49dGhpcy50KXtkLnQ9MDtyZXR1cm59dmFyIGI9ZyV0aGlzLkRCO3ZhciBhPXRoaXMuREItYjt2YXIgZj0oMTw8YiktMTtkWzBdPXRoaXNbZV0+PmI7Zm9yKHZhciBjPWUrMTtjPHRoaXMudDsrK2Mpe2RbYy1lLTFdfD0odGhpc1tjXSZmKTw8YTtkW2MtZV09dGhpc1tjXT4+Yn1pZihiPjApe2RbdGhpcy50LWUtMV18PSh0aGlzLnMmZik8PGF9ZC50PXRoaXMudC1lO2QuY2xhbXAoKX1mdW5jdGlvbiBibnBTdWJUbyhkLGYpe3ZhciBlPTAsZz0wLGI9TWF0aC5taW4oZC50LHRoaXMudCk7d2hpbGUoZTxiKXtnKz10aGlzW2VdLWRbZV07ZltlKytdPWcmdGhpcy5ETTtnPj49dGhpcy5EQn1pZihkLnQ8dGhpcy50KXtnLT1kLnM7d2hpbGUoZTx0aGlzLnQpe2crPXRoaXNbZV07ZltlKytdPWcmdGhpcy5ETTtnPj49dGhpcy5EQn1nKz10aGlzLnN9ZWxzZXtnKz10aGlzLnM7d2hpbGUoZTxkLnQpe2ctPWRbZV07ZltlKytdPWcmdGhpcy5ETTtnPj49dGhpcy5EQn1nLT1kLnN9Zi5zPShnPDApPy0xOjA7aWYoZzwtMSl7ZltlKytdPXRoaXMuRFYrZ31lbHNle2lmKGc+MCl7ZltlKytdPWd9fWYudD1lO2YuY2xhbXAoKX1mdW5jdGlvbiBibnBNdWx0aXBseVRvKGMsZSl7dmFyIGI9dGhpcy5hYnMoKSxmPWMuYWJzKCk7dmFyIGQ9Yi50O2UudD1kK2YudDt3aGlsZSgtLWQ+PTApe2VbZF09MH1mb3IoZD0wO2Q8Zi50OysrZCl7ZVtkK2IudF09Yi5hbSgwLGZbZF0sZSxkLDAsYi50KX1lLnM9MDtlLmNsYW1wKCk7aWYodGhpcy5zIT1jLnMpe0JpZ0ludGVnZXIuWkVSTy5zdWJUbyhlLGUpfX1mdW5jdGlvbiBibnBTcXVhcmVUbyhkKXt2YXIgYT10aGlzLmFicygpO3ZhciBiPWQudD0yKmEudDt3aGlsZSgtLWI+PTApe2RbYl09MH1mb3IoYj0wO2I8YS50LTE7KytiKXt2YXIgZT1hLmFtKGIsYVtiXSxkLDIqYiwwLDEpO2lmKChkW2IrYS50XSs9YS5hbShiKzEsMiphW2JdLGQsMipiKzEsZSxhLnQtYi0xKSk+PWEuRFYpe2RbYithLnRdLT1hLkRWO2RbYithLnQrMV09MX19aWYoZC50PjApe2RbZC50LTFdKz1hLmFtKGIsYVtiXSxkLDIqYiwwLDEpfWQucz0wO2QuY2xhbXAoKX1mdW5jdGlvbiBibnBEaXZSZW1UbyhuLGgsZyl7dmFyIHc9bi5hYnMoKTtpZih3LnQ8PTApe3JldHVybn12YXIgaz10aGlzLmFicygpO2lmKGsudDx3LnQpe2lmKGghPW51bGwpe2guZnJvbUludCgwKX1pZihnIT1udWxsKXt0aGlzLmNvcHlUbyhnKX1yZXR1cm59aWYoZz09bnVsbCl7Zz1uYmkoKX12YXIgZD1uYmkoKSxhPXRoaXMucyxsPW4uczt2YXIgdj10aGlzLkRCLW5iaXRzKHdbdy50LTFdKTtpZih2PjApe3cubFNoaWZ0VG8odixkKTtrLmxTaGlmdFRvKHYsZyl9ZWxzZXt3LmNvcHlUbyhkKTtrLmNvcHlUbyhnKX12YXIgcD1kLnQ7dmFyIGI9ZFtwLTFdO2lmKGI9PTApe3JldHVybn12YXIgbz1iKigxPDx0aGlzLkYxKSsoKHA+MSk/ZFtwLTJdPj50aGlzLkYyOjApO3ZhciBBPXRoaXMuRlYvbyx6PSgxPDx0aGlzLkYxKS9vLHg9MTw8dGhpcy5GMjt2YXIgdT1nLnQscz11LXAsZj0oaD09bnVsbCk/bmJpKCk6aDtkLmRsU2hpZnRUbyhzLGYpO2lmKGcuY29tcGFyZVRvKGYpPj0wKXtnW2cudCsrXT0xO2cuc3ViVG8oZixnKX1CaWdJbnRlZ2VyLk9ORS5kbFNoaWZ0VG8ocCxmKTtmLnN1YlRvKGQsZCk7d2hpbGUoZC50PHApe2RbZC50KytdPTB9d2hpbGUoLS1zPj0wKXt2YXIgYz0oZ1stLXVdPT1iKT90aGlzLkRNOk1hdGguZmxvb3IoZ1t1XSpBKyhnW3UtMV0reCkqeik7aWYoKGdbdV0rPWQuYW0oMCxjLGcscywwLHApKTxjKXtkLmRsU2hpZnRUbyhzLGYpO2cuc3ViVG8oZixnKTt3aGlsZShnW3VdPC0tYyl7Zy5zdWJUbyhmLGcpfX19aWYoaCE9bnVsbCl7Zy5kclNoaWZ0VG8ocCxoKTtpZihhIT1sKXtCaWdJbnRlZ2VyLlpFUk8uc3ViVG8oaCxoKX19Zy50PXA7Zy5jbGFtcCgpO2lmKHY+MCl7Zy5yU2hpZnRUbyh2LGcpfWlmKGE8MCl7QmlnSW50ZWdlci5aRVJPLnN1YlRvKGcsZyl9fWZ1bmN0aW9uIGJuTW9kKGIpe3ZhciBjPW5iaSgpO3RoaXMuYWJzKCkuZGl2UmVtVG8oYixudWxsLGMpO2lmKHRoaXMuczwwJiZjLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLlpFUk8pPjApe2Iuc3ViVG8oYyxjKX1yZXR1cm4gY31mdW5jdGlvbiBDbGFzc2ljKGEpe3RoaXMubT1hfWZ1bmN0aW9uIGNDb252ZXJ0KGEpe2lmKGEuczwwfHxhLmNvbXBhcmVUbyh0aGlzLm0pPj0wKXtyZXR1cm4gYS5tb2QodGhpcy5tKX1lbHNle3JldHVybiBhfX1mdW5jdGlvbiBjUmV2ZXJ0KGEpe3JldHVybiBhfWZ1bmN0aW9uIGNSZWR1Y2UoYSl7YS5kaXZSZW1Ubyh0aGlzLm0sbnVsbCxhKX1mdW5jdGlvbiBjTXVsVG8oYSxjLGIpe2EubXVsdGlwbHlUbyhjLGIpO3RoaXMucmVkdWNlKGIpfWZ1bmN0aW9uIGNTcXJUbyhhLGIpe2Euc3F1YXJlVG8oYik7dGhpcy5yZWR1Y2UoYil9Q2xhc3NpYy5wcm90b3R5cGUuY29udmVydD1jQ29udmVydDtDbGFzc2ljLnByb3RvdHlwZS5yZXZlcnQ9Y1JldmVydDtDbGFzc2ljLnByb3RvdHlwZS5yZWR1Y2U9Y1JlZHVjZTtDbGFzc2ljLnByb3RvdHlwZS5tdWxUbz1jTXVsVG87Q2xhc3NpYy5wcm90b3R5cGUuc3FyVG89Y1NxclRvO2Z1bmN0aW9uIGJucEludkRpZ2l0KCl7aWYodGhpcy50PDEpe3JldHVybiAwfXZhciBhPXRoaXNbMF07aWYoKGEmMSk9PTApe3JldHVybiAwfXZhciBiPWEmMztiPShiKigyLShhJjE1KSpiKSkmMTU7Yj0oYiooMi0oYSYyNTUpKmIpKSYyNTU7Yj0oYiooMi0oKChhJjY1NTM1KSpiKSY2NTUzNSkpKSY2NTUzNTtiPShiKigyLWEqYiV0aGlzLkRWKSkldGhpcy5EVjtyZXR1cm4oYj4wKT90aGlzLkRWLWI6LWJ9ZnVuY3Rpb24gTW9udGdvbWVyeShhKXt0aGlzLm09YTt0aGlzLm1wPWEuaW52RGlnaXQoKTt0aGlzLm1wbD10aGlzLm1wJjMyNzY3O3RoaXMubXBoPXRoaXMubXA+PjE1O3RoaXMudW09KDE8PChhLkRCLTE1KSktMTt0aGlzLm10Mj0yKmEudH1mdW5jdGlvbiBtb250Q29udmVydChhKXt2YXIgYj1uYmkoKTthLmFicygpLmRsU2hpZnRUbyh0aGlzLm0udCxiKTtiLmRpdlJlbVRvKHRoaXMubSxudWxsLGIpO2lmKGEuczwwJiZiLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLlpFUk8pPjApe3RoaXMubS5zdWJUbyhiLGIpfXJldHVybiBifWZ1bmN0aW9uIG1vbnRSZXZlcnQoYSl7dmFyIGI9bmJpKCk7YS5jb3B5VG8oYik7dGhpcy5yZWR1Y2UoYik7cmV0dXJuIGJ9ZnVuY3Rpb24gbW9udFJlZHVjZShhKXt3aGlsZShhLnQ8PXRoaXMubXQyKXthW2EudCsrXT0wfWZvcih2YXIgYz0wO2M8dGhpcy5tLnQ7KytjKXt2YXIgYj1hW2NdJjMyNzY3O3ZhciBkPShiKnRoaXMubXBsKygoKGIqdGhpcy5tcGgrKGFbY10+PjE1KSp0aGlzLm1wbCkmdGhpcy51bSk8PDE1KSkmYS5ETTtiPWMrdGhpcy5tLnQ7YVtiXSs9dGhpcy5tLmFtKDAsZCxhLGMsMCx0aGlzLm0udCk7d2hpbGUoYVtiXT49YS5EVil7YVtiXS09YS5EVjthWysrYl0rK319YS5jbGFtcCgpO2EuZHJTaGlmdFRvKHRoaXMubS50LGEpO2lmKGEuY29tcGFyZVRvKHRoaXMubSk+PTApe2Euc3ViVG8odGhpcy5tLGEpfX1mdW5jdGlvbiBtb250U3FyVG8oYSxiKXthLnNxdWFyZVRvKGIpO3RoaXMucmVkdWNlKGIpfWZ1bmN0aW9uIG1vbnRNdWxUbyhhLGMsYil7YS5tdWx0aXBseVRvKGMsYik7dGhpcy5yZWR1Y2UoYil9TW9udGdvbWVyeS5wcm90b3R5cGUuY29udmVydD1tb250Q29udmVydDtNb250Z29tZXJ5LnByb3RvdHlwZS5yZXZlcnQ9bW9udFJldmVydDtNb250Z29tZXJ5LnByb3RvdHlwZS5yZWR1Y2U9bW9udFJlZHVjZTtNb250Z29tZXJ5LnByb3RvdHlwZS5tdWxUbz1tb250TXVsVG87TW9udGdvbWVyeS5wcm90b3R5cGUuc3FyVG89bW9udFNxclRvO2Z1bmN0aW9uIGJucElzRXZlbigpe3JldHVybigodGhpcy50PjApPyh0aGlzWzBdJjEpOnRoaXMucyk9PTB9ZnVuY3Rpb24gYm5wRXhwKGgsail7aWYoaD40Mjk0OTY3Mjk1fHxoPDEpe3JldHVybiBCaWdJbnRlZ2VyLk9ORX12YXIgZj1uYmkoKSxhPW5iaSgpLGQ9ai5jb252ZXJ0KHRoaXMpLGM9bmJpdHMoaCktMTtkLmNvcHlUbyhmKTt3aGlsZSgtLWM+PTApe2ouc3FyVG8oZixhKTtpZigoaCYoMTw8YykpPjApe2oubXVsVG8oYSxkLGYpfWVsc2V7dmFyIGI9ZjtmPWE7YT1ifX1yZXR1cm4gai5yZXZlcnQoZil9ZnVuY3Rpb24gYm5Nb2RQb3dJbnQoYixhKXt2YXIgYztpZihiPDI1Nnx8YS5pc0V2ZW4oKSl7Yz1uZXcgQ2xhc3NpYyhhKX1lbHNle2M9bmV3IE1vbnRnb21lcnkoYSl9cmV0dXJuIHRoaXMuZXhwKGIsYyl9QmlnSW50ZWdlci5wcm90b3R5cGUuY29weVRvPWJucENvcHlUbztCaWdJbnRlZ2VyLnByb3RvdHlwZS5mcm9tSW50PWJucEZyb21JbnQ7QmlnSW50ZWdlci5wcm90b3R5cGUuZnJvbVN0cmluZz1ibnBGcm9tU3RyaW5nO0JpZ0ludGVnZXIucHJvdG90eXBlLmNsYW1wPWJucENsYW1wO0JpZ0ludGVnZXIucHJvdG90eXBlLmRsU2hpZnRUbz1ibnBETFNoaWZ0VG87QmlnSW50ZWdlci5wcm90b3R5cGUuZHJTaGlmdFRvPWJucERSU2hpZnRUbztCaWdJbnRlZ2VyLnByb3RvdHlwZS5sU2hpZnRUbz1ibnBMU2hpZnRUbztCaWdJbnRlZ2VyLnByb3RvdHlwZS5yU2hpZnRUbz1ibnBSU2hpZnRUbztCaWdJbnRlZ2VyLnByb3RvdHlwZS5zdWJUbz1ibnBTdWJUbztCaWdJbnRlZ2VyLnByb3RvdHlwZS5tdWx0aXBseVRvPWJucE11bHRpcGx5VG87QmlnSW50ZWdlci5wcm90b3R5cGUuc3F1YXJlVG89Ym5wU3F1YXJlVG87QmlnSW50ZWdlci5wcm90b3R5cGUuZGl2UmVtVG89Ym5wRGl2UmVtVG87QmlnSW50ZWdlci5wcm90b3R5cGUuaW52RGlnaXQ9Ym5wSW52RGlnaXQ7QmlnSW50ZWdlci5wcm90b3R5cGUuaXNFdmVuPWJucElzRXZlbjtCaWdJbnRlZ2VyLnByb3RvdHlwZS5leHA9Ym5wRXhwO0JpZ0ludGVnZXIucHJvdG90eXBlLnRvU3RyaW5nPWJuVG9TdHJpbmc7QmlnSW50ZWdlci5wcm90b3R5cGUubmVnYXRlPWJuTmVnYXRlO0JpZ0ludGVnZXIucHJvdG90eXBlLmFicz1ibkFicztCaWdJbnRlZ2VyLnByb3RvdHlwZS5jb21wYXJlVG89Ym5Db21wYXJlVG87QmlnSW50ZWdlci5wcm90b3R5cGUuYml0TGVuZ3RoPWJuQml0TGVuZ3RoO0JpZ0ludGVnZXIucHJvdG90eXBlLm1vZD1ibk1vZDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5tb2RQb3dJbnQ9Ym5Nb2RQb3dJbnQ7QmlnSW50ZWdlci5aRVJPPW5idigwKTtCaWdJbnRlZ2VyLk9ORT1uYnYoMSk7XG4vKiEgKGMpIFRvbSBXdSB8IGh0dHA6Ly93d3ctY3Mtc3R1ZGVudHMuc3RhbmZvcmQuZWR1L350ancvanNibi9cbiAqL1xuZnVuY3Rpb24gYm5DbG9uZSgpe3ZhciBhPW5iaSgpO3RoaXMuY29weVRvKGEpO3JldHVybiBhfWZ1bmN0aW9uIGJuSW50VmFsdWUoKXtpZih0aGlzLnM8MCl7aWYodGhpcy50PT0xKXtyZXR1cm4gdGhpc1swXS10aGlzLkRWfWVsc2V7aWYodGhpcy50PT0wKXtyZXR1cm4gLTF9fX1lbHNle2lmKHRoaXMudD09MSl7cmV0dXJuIHRoaXNbMF19ZWxzZXtpZih0aGlzLnQ9PTApe3JldHVybiAwfX19cmV0dXJuKCh0aGlzWzFdJigoMTw8KDMyLXRoaXMuREIpKS0xKSk8PHRoaXMuREIpfHRoaXNbMF19ZnVuY3Rpb24gYm5CeXRlVmFsdWUoKXtyZXR1cm4odGhpcy50PT0wKT90aGlzLnM6KHRoaXNbMF08PDI0KT4+MjR9ZnVuY3Rpb24gYm5TaG9ydFZhbHVlKCl7cmV0dXJuKHRoaXMudD09MCk/dGhpcy5zOih0aGlzWzBdPDwxNik+PjE2fWZ1bmN0aW9uIGJucENodW5rU2l6ZShhKXtyZXR1cm4gTWF0aC5mbG9vcihNYXRoLkxOMip0aGlzLkRCL01hdGgubG9nKGEpKX1mdW5jdGlvbiBiblNpZ051bSgpe2lmKHRoaXMuczwwKXtyZXR1cm4gLTF9ZWxzZXtpZih0aGlzLnQ8PTB8fCh0aGlzLnQ9PTEmJnRoaXNbMF08PTApKXtyZXR1cm4gMH1lbHNle3JldHVybiAxfX19ZnVuY3Rpb24gYm5wVG9SYWRpeChjKXtpZihjPT1udWxsKXtjPTEwfWlmKHRoaXMuc2lnbnVtKCk9PTB8fGM8Mnx8Yz4zNil7cmV0dXJuXCIwXCJ9dmFyIGY9dGhpcy5jaHVua1NpemUoYyk7dmFyIGU9TWF0aC5wb3coYyxmKTt2YXIgaT1uYnYoZSksaj1uYmkoKSxoPW5iaSgpLGc9XCJcIjt0aGlzLmRpdlJlbVRvKGksaixoKTt3aGlsZShqLnNpZ251bSgpPjApe2c9KGUraC5pbnRWYWx1ZSgpKS50b1N0cmluZyhjKS5zdWJzdHIoMSkrZztqLmRpdlJlbVRvKGksaixoKX1yZXR1cm4gaC5pbnRWYWx1ZSgpLnRvU3RyaW5nKGMpK2d9ZnVuY3Rpb24gYm5wRnJvbVJhZGl4KG0saCl7dGhpcy5mcm9tSW50KDApO2lmKGg9PW51bGwpe2g9MTB9dmFyIGY9dGhpcy5jaHVua1NpemUoaCk7dmFyIGc9TWF0aC5wb3coaCxmKSxlPWZhbHNlLGE9MCxsPTA7Zm9yKHZhciBjPTA7YzxtLmxlbmd0aDsrK2Mpe3ZhciBrPWludEF0KG0sYyk7aWYoazwwKXtpZihtLmNoYXJBdChjKT09XCItXCImJnRoaXMuc2lnbnVtKCk9PTApe2U9dHJ1ZX1jb250aW51ZX1sPWgqbCtrO2lmKCsrYT49Zil7dGhpcy5kTXVsdGlwbHkoZyk7dGhpcy5kQWRkT2Zmc2V0KGwsMCk7YT0wO2w9MH19aWYoYT4wKXt0aGlzLmRNdWx0aXBseShNYXRoLnBvdyhoLGEpKTt0aGlzLmRBZGRPZmZzZXQobCwwKX1pZihlKXtCaWdJbnRlZ2VyLlpFUk8uc3ViVG8odGhpcyx0aGlzKX19ZnVuY3Rpb24gYm5wRnJvbU51bWJlcihmLGUsaCl7aWYoXCJudW1iZXJcIj09dHlwZW9mIGUpe2lmKGY8Mil7dGhpcy5mcm9tSW50KDEpfWVsc2V7dGhpcy5mcm9tTnVtYmVyKGYsaCk7aWYoIXRoaXMudGVzdEJpdChmLTEpKXt0aGlzLmJpdHdpc2VUbyhCaWdJbnRlZ2VyLk9ORS5zaGlmdExlZnQoZi0xKSxvcF9vcix0aGlzKX1pZih0aGlzLmlzRXZlbigpKXt0aGlzLmRBZGRPZmZzZXQoMSwwKX13aGlsZSghdGhpcy5pc1Byb2JhYmxlUHJpbWUoZSkpe3RoaXMuZEFkZE9mZnNldCgyLDApO2lmKHRoaXMuYml0TGVuZ3RoKCk+Zil7dGhpcy5zdWJUbyhCaWdJbnRlZ2VyLk9ORS5zaGlmdExlZnQoZi0xKSx0aGlzKX19fX1lbHNle3ZhciBkPW5ldyBBcnJheSgpLGc9ZiY3O2QubGVuZ3RoPShmPj4zKSsxO2UubmV4dEJ5dGVzKGQpO2lmKGc+MCl7ZFswXSY9KCgxPDxnKS0xKX1lbHNle2RbMF09MH10aGlzLmZyb21TdHJpbmcoZCwyNTYpfX1mdW5jdGlvbiBiblRvQnl0ZUFycmF5KCl7dmFyIGI9dGhpcy50LGM9bmV3IEFycmF5KCk7Y1swXT10aGlzLnM7dmFyIGU9dGhpcy5EQi0oYip0aGlzLkRCKSU4LGYsYT0wO2lmKGItLT4wKXtpZihlPHRoaXMuREImJihmPXRoaXNbYl0+PmUpIT0odGhpcy5zJnRoaXMuRE0pPj5lKXtjW2ErK109ZnwodGhpcy5zPDwodGhpcy5EQi1lKSl9d2hpbGUoYj49MCl7aWYoZTw4KXtmPSh0aGlzW2JdJigoMTw8ZSktMSkpPDwoOC1lKTtmfD10aGlzWy0tYl0+PihlKz10aGlzLkRCLTgpfWVsc2V7Zj0odGhpc1tiXT4+KGUtPTgpKSYyNTU7aWYoZTw9MCl7ZSs9dGhpcy5EQjstLWJ9fWlmKChmJjEyOCkhPTApe2Z8PS0yNTZ9aWYoYT09MCYmKHRoaXMucyYxMjgpIT0oZiYxMjgpKXsrK2F9aWYoYT4wfHxmIT10aGlzLnMpe2NbYSsrXT1mfX19cmV0dXJuIGN9ZnVuY3Rpb24gYm5FcXVhbHMoYil7cmV0dXJuKHRoaXMuY29tcGFyZVRvKGIpPT0wKX1mdW5jdGlvbiBibk1pbihiKXtyZXR1cm4odGhpcy5jb21wYXJlVG8oYik8MCk/dGhpczpifWZ1bmN0aW9uIGJuTWF4KGIpe3JldHVybih0aGlzLmNvbXBhcmVUbyhiKT4wKT90aGlzOmJ9ZnVuY3Rpb24gYm5wQml0d2lzZVRvKGMsaCxlKXt2YXIgZCxnLGI9TWF0aC5taW4oYy50LHRoaXMudCk7Zm9yKGQ9MDtkPGI7KytkKXtlW2RdPWgodGhpc1tkXSxjW2RdKX1pZihjLnQ8dGhpcy50KXtnPWMucyZ0aGlzLkRNO2ZvcihkPWI7ZDx0aGlzLnQ7KytkKXtlW2RdPWgodGhpc1tkXSxnKX1lLnQ9dGhpcy50fWVsc2V7Zz10aGlzLnMmdGhpcy5ETTtmb3IoZD1iO2Q8Yy50OysrZCl7ZVtkXT1oKGcsY1tkXSl9ZS50PWMudH1lLnM9aCh0aGlzLnMsYy5zKTtlLmNsYW1wKCl9ZnVuY3Rpb24gb3BfYW5kKGEsYil7cmV0dXJuIGEmYn1mdW5jdGlvbiBibkFuZChiKXt2YXIgYz1uYmkoKTt0aGlzLmJpdHdpc2VUbyhiLG9wX2FuZCxjKTtyZXR1cm4gY31mdW5jdGlvbiBvcF9vcihhLGIpe3JldHVybiBhfGJ9ZnVuY3Rpb24gYm5PcihiKXt2YXIgYz1uYmkoKTt0aGlzLmJpdHdpc2VUbyhiLG9wX29yLGMpO3JldHVybiBjfWZ1bmN0aW9uIG9wX3hvcihhLGIpe3JldHVybiBhXmJ9ZnVuY3Rpb24gYm5Yb3IoYil7dmFyIGM9bmJpKCk7dGhpcy5iaXR3aXNlVG8oYixvcF94b3IsYyk7cmV0dXJuIGN9ZnVuY3Rpb24gb3BfYW5kbm90KGEsYil7cmV0dXJuIGEmfmJ9ZnVuY3Rpb24gYm5BbmROb3QoYil7dmFyIGM9bmJpKCk7dGhpcy5iaXR3aXNlVG8oYixvcF9hbmRub3QsYyk7cmV0dXJuIGN9ZnVuY3Rpb24gYm5Ob3QoKXt2YXIgYj1uYmkoKTtmb3IodmFyIGE9MDthPHRoaXMudDsrK2Epe2JbYV09dGhpcy5ETSZ+dGhpc1thXX1iLnQ9dGhpcy50O2Iucz1+dGhpcy5zO3JldHVybiBifWZ1bmN0aW9uIGJuU2hpZnRMZWZ0KGIpe3ZhciBhPW5iaSgpO2lmKGI8MCl7dGhpcy5yU2hpZnRUbygtYixhKX1lbHNle3RoaXMubFNoaWZ0VG8oYixhKX1yZXR1cm4gYX1mdW5jdGlvbiBiblNoaWZ0UmlnaHQoYil7dmFyIGE9bmJpKCk7aWYoYjwwKXt0aGlzLmxTaGlmdFRvKC1iLGEpfWVsc2V7dGhpcy5yU2hpZnRUbyhiLGEpfXJldHVybiBhfWZ1bmN0aW9uIGxiaXQoYSl7aWYoYT09MCl7cmV0dXJuIC0xfXZhciBiPTA7aWYoKGEmNjU1MzUpPT0wKXthPj49MTY7Yis9MTZ9aWYoKGEmMjU1KT09MCl7YT4+PTg7Yis9OH1pZigoYSYxNSk9PTApe2E+Pj00O2IrPTR9aWYoKGEmMyk9PTApe2E+Pj0yO2IrPTJ9aWYoKGEmMSk9PTApeysrYn1yZXR1cm4gYn1mdW5jdGlvbiBibkdldExvd2VzdFNldEJpdCgpe2Zvcih2YXIgYT0wO2E8dGhpcy50OysrYSl7aWYodGhpc1thXSE9MCl7cmV0dXJuIGEqdGhpcy5EQitsYml0KHRoaXNbYV0pfX1pZih0aGlzLnM8MCl7cmV0dXJuIHRoaXMudCp0aGlzLkRCfXJldHVybiAtMX1mdW5jdGlvbiBjYml0KGEpe3ZhciBiPTA7d2hpbGUoYSE9MCl7YSY9YS0xOysrYn1yZXR1cm4gYn1mdW5jdGlvbiBibkJpdENvdW50KCl7dmFyIGM9MCxhPXRoaXMucyZ0aGlzLkRNO2Zvcih2YXIgYj0wO2I8dGhpcy50OysrYil7Yys9Y2JpdCh0aGlzW2JdXmEpfXJldHVybiBjfWZ1bmN0aW9uIGJuVGVzdEJpdChiKXt2YXIgYT1NYXRoLmZsb29yKGIvdGhpcy5EQik7aWYoYT49dGhpcy50KXtyZXR1cm4odGhpcy5zIT0wKX1yZXR1cm4oKHRoaXNbYV0mKDE8PChiJXRoaXMuREIpKSkhPTApfWZ1bmN0aW9uIGJucENoYW5nZUJpdChjLGIpe3ZhciBhPUJpZ0ludGVnZXIuT05FLnNoaWZ0TGVmdChjKTt0aGlzLmJpdHdpc2VUbyhhLGIsYSk7cmV0dXJuIGF9ZnVuY3Rpb24gYm5TZXRCaXQoYSl7cmV0dXJuIHRoaXMuY2hhbmdlQml0KGEsb3Bfb3IpfWZ1bmN0aW9uIGJuQ2xlYXJCaXQoYSl7cmV0dXJuIHRoaXMuY2hhbmdlQml0KGEsb3BfYW5kbm90KX1mdW5jdGlvbiBibkZsaXBCaXQoYSl7cmV0dXJuIHRoaXMuY2hhbmdlQml0KGEsb3BfeG9yKX1mdW5jdGlvbiBibnBBZGRUbyhkLGYpe3ZhciBlPTAsZz0wLGI9TWF0aC5taW4oZC50LHRoaXMudCk7d2hpbGUoZTxiKXtnKz10aGlzW2VdK2RbZV07ZltlKytdPWcmdGhpcy5ETTtnPj49dGhpcy5EQn1pZihkLnQ8dGhpcy50KXtnKz1kLnM7d2hpbGUoZTx0aGlzLnQpe2crPXRoaXNbZV07ZltlKytdPWcmdGhpcy5ETTtnPj49dGhpcy5EQn1nKz10aGlzLnN9ZWxzZXtnKz10aGlzLnM7d2hpbGUoZTxkLnQpe2crPWRbZV07ZltlKytdPWcmdGhpcy5ETTtnPj49dGhpcy5EQn1nKz1kLnN9Zi5zPShnPDApPy0xOjA7aWYoZz4wKXtmW2UrK109Z31lbHNle2lmKGc8LTEpe2ZbZSsrXT10aGlzLkRWK2d9fWYudD1lO2YuY2xhbXAoKX1mdW5jdGlvbiBibkFkZChiKXt2YXIgYz1uYmkoKTt0aGlzLmFkZFRvKGIsYyk7cmV0dXJuIGN9ZnVuY3Rpb24gYm5TdWJ0cmFjdChiKXt2YXIgYz1uYmkoKTt0aGlzLnN1YlRvKGIsYyk7cmV0dXJuIGN9ZnVuY3Rpb24gYm5NdWx0aXBseShiKXt2YXIgYz1uYmkoKTt0aGlzLm11bHRpcGx5VG8oYixjKTtyZXR1cm4gY31mdW5jdGlvbiBiblNxdWFyZSgpe3ZhciBhPW5iaSgpO3RoaXMuc3F1YXJlVG8oYSk7cmV0dXJuIGF9ZnVuY3Rpb24gYm5EaXZpZGUoYil7dmFyIGM9bmJpKCk7dGhpcy5kaXZSZW1UbyhiLGMsbnVsbCk7cmV0dXJuIGN9ZnVuY3Rpb24gYm5SZW1haW5kZXIoYil7dmFyIGM9bmJpKCk7dGhpcy5kaXZSZW1UbyhiLG51bGwsYyk7cmV0dXJuIGN9ZnVuY3Rpb24gYm5EaXZpZGVBbmRSZW1haW5kZXIoYil7dmFyIGQ9bmJpKCksYz1uYmkoKTt0aGlzLmRpdlJlbVRvKGIsZCxjKTtyZXR1cm4gbmV3IEFycmF5KGQsYyl9ZnVuY3Rpb24gYm5wRE11bHRpcGx5KGEpe3RoaXNbdGhpcy50XT10aGlzLmFtKDAsYS0xLHRoaXMsMCwwLHRoaXMudCk7Kyt0aGlzLnQ7dGhpcy5jbGFtcCgpfWZ1bmN0aW9uIGJucERBZGRPZmZzZXQoYixhKXtpZihiPT0wKXtyZXR1cm59d2hpbGUodGhpcy50PD1hKXt0aGlzW3RoaXMudCsrXT0wfXRoaXNbYV0rPWI7d2hpbGUodGhpc1thXT49dGhpcy5EVil7dGhpc1thXS09dGhpcy5EVjtpZigrK2E+PXRoaXMudCl7dGhpc1t0aGlzLnQrK109MH0rK3RoaXNbYV19fWZ1bmN0aW9uIE51bGxFeHAoKXt9ZnVuY3Rpb24gbk5vcChhKXtyZXR1cm4gYX1mdW5jdGlvbiBuTXVsVG8oYSxjLGIpe2EubXVsdGlwbHlUbyhjLGIpfWZ1bmN0aW9uIG5TcXJUbyhhLGIpe2Euc3F1YXJlVG8oYil9TnVsbEV4cC5wcm90b3R5cGUuY29udmVydD1uTm9wO051bGxFeHAucHJvdG90eXBlLnJldmVydD1uTm9wO051bGxFeHAucHJvdG90eXBlLm11bFRvPW5NdWxUbztOdWxsRXhwLnByb3RvdHlwZS5zcXJUbz1uU3FyVG87ZnVuY3Rpb24gYm5Qb3coYSl7cmV0dXJuIHRoaXMuZXhwKGEsbmV3IE51bGxFeHAoKSl9ZnVuY3Rpb24gYm5wTXVsdGlwbHlMb3dlclRvKGIsZixlKXt2YXIgZD1NYXRoLm1pbih0aGlzLnQrYi50LGYpO2Uucz0wO2UudD1kO3doaWxlKGQ+MCl7ZVstLWRdPTB9dmFyIGM7Zm9yKGM9ZS50LXRoaXMudDtkPGM7KytkKXtlW2QrdGhpcy50XT10aGlzLmFtKDAsYltkXSxlLGQsMCx0aGlzLnQpfWZvcihjPU1hdGgubWluKGIudCxmKTtkPGM7KytkKXt0aGlzLmFtKDAsYltkXSxlLGQsMCxmLWQpfWUuY2xhbXAoKX1mdW5jdGlvbiBibnBNdWx0aXBseVVwcGVyVG8oYixlLGQpey0tZTt2YXIgYz1kLnQ9dGhpcy50K2IudC1lO2Qucz0wO3doaWxlKC0tYz49MCl7ZFtjXT0wfWZvcihjPU1hdGgubWF4KGUtdGhpcy50LDApO2M8Yi50OysrYyl7ZFt0aGlzLnQrYy1lXT10aGlzLmFtKGUtYyxiW2NdLGQsMCwwLHRoaXMudCtjLWUpfWQuY2xhbXAoKTtkLmRyU2hpZnRUbygxLGQpfWZ1bmN0aW9uIEJhcnJldHQoYSl7dGhpcy5yMj1uYmkoKTt0aGlzLnEzPW5iaSgpO0JpZ0ludGVnZXIuT05FLmRsU2hpZnRUbygyKmEudCx0aGlzLnIyKTt0aGlzLm11PXRoaXMucjIuZGl2aWRlKGEpO3RoaXMubT1hfWZ1bmN0aW9uIGJhcnJldHRDb252ZXJ0KGEpe2lmKGEuczwwfHxhLnQ+Mip0aGlzLm0udCl7cmV0dXJuIGEubW9kKHRoaXMubSl9ZWxzZXtpZihhLmNvbXBhcmVUbyh0aGlzLm0pPDApe3JldHVybiBhfWVsc2V7dmFyIGI9bmJpKCk7YS5jb3B5VG8oYik7dGhpcy5yZWR1Y2UoYik7cmV0dXJuIGJ9fX1mdW5jdGlvbiBiYXJyZXR0UmV2ZXJ0KGEpe3JldHVybiBhfWZ1bmN0aW9uIGJhcnJldHRSZWR1Y2UoYSl7YS5kclNoaWZ0VG8odGhpcy5tLnQtMSx0aGlzLnIyKTtpZihhLnQ+dGhpcy5tLnQrMSl7YS50PXRoaXMubS50KzE7YS5jbGFtcCgpfXRoaXMubXUubXVsdGlwbHlVcHBlclRvKHRoaXMucjIsdGhpcy5tLnQrMSx0aGlzLnEzKTt0aGlzLm0ubXVsdGlwbHlMb3dlclRvKHRoaXMucTMsdGhpcy5tLnQrMSx0aGlzLnIyKTt3aGlsZShhLmNvbXBhcmVUbyh0aGlzLnIyKTwwKXthLmRBZGRPZmZzZXQoMSx0aGlzLm0udCsxKX1hLnN1YlRvKHRoaXMucjIsYSk7d2hpbGUoYS5jb21wYXJlVG8odGhpcy5tKT49MCl7YS5zdWJUbyh0aGlzLm0sYSl9fWZ1bmN0aW9uIGJhcnJldHRTcXJUbyhhLGIpe2Euc3F1YXJlVG8oYik7dGhpcy5yZWR1Y2UoYil9ZnVuY3Rpb24gYmFycmV0dE11bFRvKGEsYyxiKXthLm11bHRpcGx5VG8oYyxiKTt0aGlzLnJlZHVjZShiKX1CYXJyZXR0LnByb3RvdHlwZS5jb252ZXJ0PWJhcnJldHRDb252ZXJ0O0JhcnJldHQucHJvdG90eXBlLnJldmVydD1iYXJyZXR0UmV2ZXJ0O0JhcnJldHQucHJvdG90eXBlLnJlZHVjZT1iYXJyZXR0UmVkdWNlO0JhcnJldHQucHJvdG90eXBlLm11bFRvPWJhcnJldHRNdWxUbztCYXJyZXR0LnByb3RvdHlwZS5zcXJUbz1iYXJyZXR0U3FyVG87ZnVuY3Rpb24gYm5Nb2RQb3cocSxmKXt2YXIgbz1xLmJpdExlbmd0aCgpLGgsYj1uYnYoMSksdjtpZihvPD0wKXtyZXR1cm4gYn1lbHNle2lmKG88MTgpe2g9MX1lbHNle2lmKG88NDgpe2g9M31lbHNle2lmKG88MTQ0KXtoPTR9ZWxzZXtpZihvPDc2OCl7aD01fWVsc2V7aD02fX19fX1pZihvPDgpe3Y9bmV3IENsYXNzaWMoZil9ZWxzZXtpZihmLmlzRXZlbigpKXt2PW5ldyBCYXJyZXR0KGYpfWVsc2V7dj1uZXcgTW9udGdvbWVyeShmKX19dmFyIHA9bmV3IEFycmF5KCksZD0zLHM9aC0xLGE9KDE8PGgpLTE7cFsxXT12LmNvbnZlcnQodGhpcyk7aWYoaD4xKXt2YXIgQT1uYmkoKTt2LnNxclRvKHBbMV0sQSk7d2hpbGUoZDw9YSl7cFtkXT1uYmkoKTt2Lm11bFRvKEEscFtkLTJdLHBbZF0pO2QrPTJ9fXZhciBsPXEudC0xLHgsdT10cnVlLGM9bmJpKCkseTtvPW5iaXRzKHFbbF0pLTE7d2hpbGUobD49MCl7aWYobz49cyl7eD0ocVtsXT4+KG8tcykpJmF9ZWxzZXt4PShxW2xdJigoMTw8KG8rMSkpLTEpKTw8KHMtbyk7aWYobD4wKXt4fD1xW2wtMV0+Pih0aGlzLkRCK28tcyl9fWQ9aDt3aGlsZSgoeCYxKT09MCl7eD4+PTE7LS1kfWlmKChvLT1kKTwwKXtvKz10aGlzLkRCOy0tbH1pZih1KXtwW3hdLmNvcHlUbyhiKTt1PWZhbHNlfWVsc2V7d2hpbGUoZD4xKXt2LnNxclRvKGIsYyk7di5zcXJUbyhjLGIpO2QtPTJ9aWYoZD4wKXt2LnNxclRvKGIsYyl9ZWxzZXt5PWI7Yj1jO2M9eX12Lm11bFRvKGMscFt4XSxiKX13aGlsZShsPj0wJiYocVtsXSYoMTw8bykpPT0wKXt2LnNxclRvKGIsYyk7eT1iO2I9YztjPXk7aWYoLS1vPDApe289dGhpcy5EQi0xOy0tbH19fXJldHVybiB2LnJldmVydChiKX1mdW5jdGlvbiBibkdDRChjKXt2YXIgYj0odGhpcy5zPDApP3RoaXMubmVnYXRlKCk6dGhpcy5jbG9uZSgpO3ZhciBoPShjLnM8MCk/Yy5uZWdhdGUoKTpjLmNsb25lKCk7aWYoYi5jb21wYXJlVG8oaCk8MCl7dmFyIGU9YjtiPWg7aD1lfXZhciBkPWIuZ2V0TG93ZXN0U2V0Qml0KCksZj1oLmdldExvd2VzdFNldEJpdCgpO2lmKGY8MCl7cmV0dXJuIGJ9aWYoZDxmKXtmPWR9aWYoZj4wKXtiLnJTaGlmdFRvKGYsYik7aC5yU2hpZnRUbyhmLGgpfXdoaWxlKGIuc2lnbnVtKCk+MCl7aWYoKGQ9Yi5nZXRMb3dlc3RTZXRCaXQoKSk+MCl7Yi5yU2hpZnRUbyhkLGIpfWlmKChkPWguZ2V0TG93ZXN0U2V0Qml0KCkpPjApe2guclNoaWZ0VG8oZCxoKX1pZihiLmNvbXBhcmVUbyhoKT49MCl7Yi5zdWJUbyhoLGIpO2IuclNoaWZ0VG8oMSxiKX1lbHNle2guc3ViVG8oYixoKTtoLnJTaGlmdFRvKDEsaCl9fWlmKGY+MCl7aC5sU2hpZnRUbyhmLGgpfXJldHVybiBofWZ1bmN0aW9uIGJucE1vZEludChlKXtpZihlPD0wKXtyZXR1cm4gMH12YXIgYz10aGlzLkRWJWUsYj0odGhpcy5zPDApP2UtMTowO2lmKHRoaXMudD4wKXtpZihjPT0wKXtiPXRoaXNbMF0lZX1lbHNle2Zvcih2YXIgYT10aGlzLnQtMTthPj0wOy0tYSl7Yj0oYypiK3RoaXNbYV0pJWV9fX1yZXR1cm4gYn1mdW5jdGlvbiBibk1vZEludmVyc2UoZil7dmFyIGo9Zi5pc0V2ZW4oKTtpZigodGhpcy5pc0V2ZW4oKSYmail8fGYuc2lnbnVtKCk9PTApe3JldHVybiBCaWdJbnRlZ2VyLlpFUk99dmFyIGk9Zi5jbG9uZSgpLGg9dGhpcy5jbG9uZSgpO3ZhciBnPW5idigxKSxlPW5idigwKSxsPW5idigwKSxrPW5idigxKTt3aGlsZShpLnNpZ251bSgpIT0wKXt3aGlsZShpLmlzRXZlbigpKXtpLnJTaGlmdFRvKDEsaSk7aWYoail7aWYoIWcuaXNFdmVuKCl8fCFlLmlzRXZlbigpKXtnLmFkZFRvKHRoaXMsZyk7ZS5zdWJUbyhmLGUpfWcuclNoaWZ0VG8oMSxnKX1lbHNle2lmKCFlLmlzRXZlbigpKXtlLnN1YlRvKGYsZSl9fWUuclNoaWZ0VG8oMSxlKX13aGlsZShoLmlzRXZlbigpKXtoLnJTaGlmdFRvKDEsaCk7aWYoail7aWYoIWwuaXNFdmVuKCl8fCFrLmlzRXZlbigpKXtsLmFkZFRvKHRoaXMsbCk7ay5zdWJUbyhmLGspfWwuclNoaWZ0VG8oMSxsKX1lbHNle2lmKCFrLmlzRXZlbigpKXtrLnN1YlRvKGYsayl9fWsuclNoaWZ0VG8oMSxrKX1pZihpLmNvbXBhcmVUbyhoKT49MCl7aS5zdWJUbyhoLGkpO2lmKGope2cuc3ViVG8obCxnKX1lLnN1YlRvKGssZSl9ZWxzZXtoLnN1YlRvKGksaCk7aWYoail7bC5zdWJUbyhnLGwpfWsuc3ViVG8oZSxrKX19aWYoaC5jb21wYXJlVG8oQmlnSW50ZWdlci5PTkUpIT0wKXtyZXR1cm4gQmlnSW50ZWdlci5aRVJPfWlmKGsuY29tcGFyZVRvKGYpPj0wKXtyZXR1cm4gay5zdWJ0cmFjdChmKX1pZihrLnNpZ251bSgpPDApe2suYWRkVG8oZixrKX1lbHNle3JldHVybiBrfWlmKGsuc2lnbnVtKCk8MCl7cmV0dXJuIGsuYWRkKGYpfWVsc2V7cmV0dXJuIGt9fXZhciBsb3dwcmltZXM9WzIsMyw1LDcsMTEsMTMsMTcsMTksMjMsMjksMzEsMzcsNDEsNDMsNDcsNTMsNTksNjEsNjcsNzEsNzMsNzksODMsODksOTcsMTAxLDEwMywxMDcsMTA5LDExMywxMjcsMTMxLDEzNywxMzksMTQ5LDE1MSwxNTcsMTYzLDE2NywxNzMsMTc5LDE4MSwxOTEsMTkzLDE5NywxOTksMjExLDIyMywyMjcsMjI5LDIzMywyMzksMjQxLDI1MSwyNTcsMjYzLDI2OSwyNzEsMjc3LDI4MSwyODMsMjkzLDMwNywzMTEsMzEzLDMxNywzMzEsMzM3LDM0NywzNDksMzUzLDM1OSwzNjcsMzczLDM3OSwzODMsMzg5LDM5Nyw0MDEsNDA5LDQxOSw0MjEsNDMxLDQzMyw0MzksNDQzLDQ0OSw0NTcsNDYxLDQ2Myw0NjcsNDc5LDQ4Nyw0OTEsNDk5LDUwMyw1MDksNTIxLDUyMyw1NDEsNTQ3LDU1Nyw1NjMsNTY5LDU3MSw1NzcsNTg3LDU5Myw1OTksNjAxLDYwNyw2MTMsNjE3LDYxOSw2MzEsNjQxLDY0Myw2NDcsNjUzLDY1OSw2NjEsNjczLDY3Nyw2ODMsNjkxLDcwMSw3MDksNzE5LDcyNyw3MzMsNzM5LDc0Myw3NTEsNzU3LDc2MSw3NjksNzczLDc4Nyw3OTcsODA5LDgxMSw4MjEsODIzLDgyNyw4MjksODM5LDg1Myw4NTcsODU5LDg2Myw4NzcsODgxLDg4Myw4ODcsOTA3LDkxMSw5MTksOTI5LDkzNyw5NDEsOTQ3LDk1Myw5NjcsOTcxLDk3Nyw5ODMsOTkxLDk5N107dmFyIGxwbGltPSgxPDwyNikvbG93cHJpbWVzW2xvd3ByaW1lcy5sZW5ndGgtMV07ZnVuY3Rpb24gYm5Jc1Byb2JhYmxlUHJpbWUoZSl7dmFyIGQsYj10aGlzLmFicygpO2lmKGIudD09MSYmYlswXTw9bG93cHJpbWVzW2xvd3ByaW1lcy5sZW5ndGgtMV0pe2ZvcihkPTA7ZDxsb3dwcmltZXMubGVuZ3RoOysrZCl7aWYoYlswXT09bG93cHJpbWVzW2RdKXtyZXR1cm4gdHJ1ZX19cmV0dXJuIGZhbHNlfWlmKGIuaXNFdmVuKCkpe3JldHVybiBmYWxzZX1kPTE7d2hpbGUoZDxsb3dwcmltZXMubGVuZ3RoKXt2YXIgYT1sb3dwcmltZXNbZF0sYz1kKzE7d2hpbGUoYzxsb3dwcmltZXMubGVuZ3RoJiZhPGxwbGltKXthKj1sb3dwcmltZXNbYysrXX1hPWIubW9kSW50KGEpO3doaWxlKGQ8Yyl7aWYoYSVsb3dwcmltZXNbZCsrXT09MCl7cmV0dXJuIGZhbHNlfX19cmV0dXJuIGIubWlsbGVyUmFiaW4oZSl9ZnVuY3Rpb24gYm5wTWlsbGVyUmFiaW4oZil7dmFyIGc9dGhpcy5zdWJ0cmFjdChCaWdJbnRlZ2VyLk9ORSk7dmFyIGM9Zy5nZXRMb3dlc3RTZXRCaXQoKTtpZihjPD0wKXtyZXR1cm4gZmFsc2V9dmFyIGg9Zy5zaGlmdFJpZ2h0KGMpO2Y9KGYrMSk+PjE7aWYoZj5sb3dwcmltZXMubGVuZ3RoKXtmPWxvd3ByaW1lcy5sZW5ndGh9dmFyIGI9bmJpKCk7Zm9yKHZhciBlPTA7ZTxmOysrZSl7Yi5mcm9tSW50KGxvd3ByaW1lc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqbG93cHJpbWVzLmxlbmd0aCldKTt2YXIgbD1iLm1vZFBvdyhoLHRoaXMpO2lmKGwuY29tcGFyZVRvKEJpZ0ludGVnZXIuT05FKSE9MCYmbC5jb21wYXJlVG8oZykhPTApe3ZhciBkPTE7d2hpbGUoZCsrPGMmJmwuY29tcGFyZVRvKGcpIT0wKXtsPWwubW9kUG93SW50KDIsdGhpcyk7aWYobC5jb21wYXJlVG8oQmlnSW50ZWdlci5PTkUpPT0wKXtyZXR1cm4gZmFsc2V9fWlmKGwuY29tcGFyZVRvKGcpIT0wKXtyZXR1cm4gZmFsc2V9fX1yZXR1cm4gdHJ1ZX1CaWdJbnRlZ2VyLnByb3RvdHlwZS5jaHVua1NpemU9Ym5wQ2h1bmtTaXplO0JpZ0ludGVnZXIucHJvdG90eXBlLnRvUmFkaXg9Ym5wVG9SYWRpeDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5mcm9tUmFkaXg9Ym5wRnJvbVJhZGl4O0JpZ0ludGVnZXIucHJvdG90eXBlLmZyb21OdW1iZXI9Ym5wRnJvbU51bWJlcjtCaWdJbnRlZ2VyLnByb3RvdHlwZS5iaXR3aXNlVG89Ym5wQml0d2lzZVRvO0JpZ0ludGVnZXIucHJvdG90eXBlLmNoYW5nZUJpdD1ibnBDaGFuZ2VCaXQ7QmlnSW50ZWdlci5wcm90b3R5cGUuYWRkVG89Ym5wQWRkVG87QmlnSW50ZWdlci5wcm90b3R5cGUuZE11bHRpcGx5PWJucERNdWx0aXBseTtCaWdJbnRlZ2VyLnByb3RvdHlwZS5kQWRkT2Zmc2V0PWJucERBZGRPZmZzZXQ7QmlnSW50ZWdlci5wcm90b3R5cGUubXVsdGlwbHlMb3dlclRvPWJucE11bHRpcGx5TG93ZXJUbztCaWdJbnRlZ2VyLnByb3RvdHlwZS5tdWx0aXBseVVwcGVyVG89Ym5wTXVsdGlwbHlVcHBlclRvO0JpZ0ludGVnZXIucHJvdG90eXBlLm1vZEludD1ibnBNb2RJbnQ7QmlnSW50ZWdlci5wcm90b3R5cGUubWlsbGVyUmFiaW49Ym5wTWlsbGVyUmFiaW47QmlnSW50ZWdlci5wcm90b3R5cGUuY2xvbmU9Ym5DbG9uZTtCaWdJbnRlZ2VyLnByb3RvdHlwZS5pbnRWYWx1ZT1ibkludFZhbHVlO0JpZ0ludGVnZXIucHJvdG90eXBlLmJ5dGVWYWx1ZT1ibkJ5dGVWYWx1ZTtCaWdJbnRlZ2VyLnByb3RvdHlwZS5zaG9ydFZhbHVlPWJuU2hvcnRWYWx1ZTtCaWdJbnRlZ2VyLnByb3RvdHlwZS5zaWdudW09Ym5TaWdOdW07QmlnSW50ZWdlci5wcm90b3R5cGUudG9CeXRlQXJyYXk9Ym5Ub0J5dGVBcnJheTtCaWdJbnRlZ2VyLnByb3RvdHlwZS5lcXVhbHM9Ym5FcXVhbHM7QmlnSW50ZWdlci5wcm90b3R5cGUubWluPWJuTWluO0JpZ0ludGVnZXIucHJvdG90eXBlLm1heD1ibk1heDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5hbmQ9Ym5BbmQ7QmlnSW50ZWdlci5wcm90b3R5cGUub3I9Ym5PcjtCaWdJbnRlZ2VyLnByb3RvdHlwZS54b3I9Ym5Yb3I7QmlnSW50ZWdlci5wcm90b3R5cGUuYW5kTm90PWJuQW5kTm90O0JpZ0ludGVnZXIucHJvdG90eXBlLm5vdD1ibk5vdDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5zaGlmdExlZnQ9Ym5TaGlmdExlZnQ7QmlnSW50ZWdlci5wcm90b3R5cGUuc2hpZnRSaWdodD1iblNoaWZ0UmlnaHQ7QmlnSW50ZWdlci5wcm90b3R5cGUuZ2V0TG93ZXN0U2V0Qml0PWJuR2V0TG93ZXN0U2V0Qml0O0JpZ0ludGVnZXIucHJvdG90eXBlLmJpdENvdW50PWJuQml0Q291bnQ7QmlnSW50ZWdlci5wcm90b3R5cGUudGVzdEJpdD1iblRlc3RCaXQ7QmlnSW50ZWdlci5wcm90b3R5cGUuc2V0Qml0PWJuU2V0Qml0O0JpZ0ludGVnZXIucHJvdG90eXBlLmNsZWFyQml0PWJuQ2xlYXJCaXQ7QmlnSW50ZWdlci5wcm90b3R5cGUuZmxpcEJpdD1ibkZsaXBCaXQ7QmlnSW50ZWdlci5wcm90b3R5cGUuYWRkPWJuQWRkO0JpZ0ludGVnZXIucHJvdG90eXBlLnN1YnRyYWN0PWJuU3VidHJhY3Q7QmlnSW50ZWdlci5wcm90b3R5cGUubXVsdGlwbHk9Ym5NdWx0aXBseTtCaWdJbnRlZ2VyLnByb3RvdHlwZS5kaXZpZGU9Ym5EaXZpZGU7QmlnSW50ZWdlci5wcm90b3R5cGUucmVtYWluZGVyPWJuUmVtYWluZGVyO0JpZ0ludGVnZXIucHJvdG90eXBlLmRpdmlkZUFuZFJlbWFpbmRlcj1ibkRpdmlkZUFuZFJlbWFpbmRlcjtCaWdJbnRlZ2VyLnByb3RvdHlwZS5tb2RQb3c9Ym5Nb2RQb3c7QmlnSW50ZWdlci5wcm90b3R5cGUubW9kSW52ZXJzZT1ibk1vZEludmVyc2U7QmlnSW50ZWdlci5wcm90b3R5cGUucG93PWJuUG93O0JpZ0ludGVnZXIucHJvdG90eXBlLmdjZD1ibkdDRDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5pc1Byb2JhYmxlUHJpbWU9Ym5Jc1Byb2JhYmxlUHJpbWU7QmlnSW50ZWdlci5wcm90b3R5cGUuc3F1YXJlPWJuU3F1YXJlO1xuLyohIChjKSBUb20gV3UgfCBodHRwOi8vd3d3LWNzLXN0dWRlbnRzLnN0YW5mb3JkLmVkdS9+dGp3L2pzYm4vXG4gKi9cbmZ1bmN0aW9uIEFyY2ZvdXIoKXt0aGlzLmk9MDt0aGlzLmo9MDt0aGlzLlM9bmV3IEFycmF5KCl9ZnVuY3Rpb24gQVJDNGluaXQoZCl7dmFyIGMsYSxiO2ZvcihjPTA7YzwyNTY7KytjKXt0aGlzLlNbY109Y31hPTA7Zm9yKGM9MDtjPDI1NjsrK2Mpe2E9KGErdGhpcy5TW2NdK2RbYyVkLmxlbmd0aF0pJjI1NTtiPXRoaXMuU1tjXTt0aGlzLlNbY109dGhpcy5TW2FdO3RoaXMuU1thXT1ifXRoaXMuaT0wO3RoaXMuaj0wfWZ1bmN0aW9uIEFSQzRuZXh0KCl7dmFyIGE7dGhpcy5pPSh0aGlzLmkrMSkmMjU1O3RoaXMuaj0odGhpcy5qK3RoaXMuU1t0aGlzLmldKSYyNTU7YT10aGlzLlNbdGhpcy5pXTt0aGlzLlNbdGhpcy5pXT10aGlzLlNbdGhpcy5qXTt0aGlzLlNbdGhpcy5qXT1hO3JldHVybiB0aGlzLlNbKGErdGhpcy5TW3RoaXMuaV0pJjI1NV19QXJjZm91ci5wcm90b3R5cGUuaW5pdD1BUkM0aW5pdDtBcmNmb3VyLnByb3RvdHlwZS5uZXh0PUFSQzRuZXh0O2Z1bmN0aW9uIHBybmdfbmV3c3RhdGUoKXtyZXR1cm4gbmV3IEFyY2ZvdXIoKX12YXIgcm5nX3BzaXplPTI1Njtcbi8qISAoYykgVG9tIFd1IHwgaHR0cDovL3d3dy1jcy1zdHVkZW50cy5zdGFuZm9yZC5lZHUvfnRqdy9qc2JuL1xuICovXG52YXIgcm5nX3N0YXRlO3ZhciBybmdfcG9vbDt2YXIgcm5nX3BwdHI7ZnVuY3Rpb24gcm5nX3NlZWRfaW50KGEpe3JuZ19wb29sW3JuZ19wcHRyKytdXj1hJjI1NTtybmdfcG9vbFtybmdfcHB0cisrXV49KGE+PjgpJjI1NTtybmdfcG9vbFtybmdfcHB0cisrXV49KGE+PjE2KSYyNTU7cm5nX3Bvb2xbcm5nX3BwdHIrK11ePShhPj4yNCkmMjU1O2lmKHJuZ19wcHRyPj1ybmdfcHNpemUpe3JuZ19wcHRyLT1ybmdfcHNpemV9fWZ1bmN0aW9uIHJuZ19zZWVkX3RpbWUoKXtybmdfc2VlZF9pbnQobmV3IERhdGUoKS5nZXRUaW1lKCkpfWlmKHJuZ19wb29sPT1udWxsKXtybmdfcG9vbD1uZXcgQXJyYXkoKTtybmdfcHB0cj0wO3ZhciB0O2lmKG5hdmlnYXRvci5hcHBOYW1lPT1cIk5ldHNjYXBlXCImJm5hdmlnYXRvci5hcHBWZXJzaW9uPFwiNVwiJiZ3aW5kb3cuY3J5cHRvKXt2YXIgej13aW5kb3cuY3J5cHRvLnJhbmRvbSgzMik7Zm9yKHQ9MDt0PHoubGVuZ3RoOysrdCl7cm5nX3Bvb2xbcm5nX3BwdHIrK109ei5jaGFyQ29kZUF0KHQpJjI1NX19d2hpbGUocm5nX3BwdHI8cm5nX3BzaXplKXt0PU1hdGguZmxvb3IoNjU1MzYqTWF0aC5yYW5kb20oKSk7cm5nX3Bvb2xbcm5nX3BwdHIrK109dD4+Pjg7cm5nX3Bvb2xbcm5nX3BwdHIrK109dCYyNTV9cm5nX3BwdHI9MDtybmdfc2VlZF90aW1lKCl9ZnVuY3Rpb24gcm5nX2dldF9ieXRlKCl7aWYocm5nX3N0YXRlPT1udWxsKXtybmdfc2VlZF90aW1lKCk7cm5nX3N0YXRlPXBybmdfbmV3c3RhdGUoKTtybmdfc3RhdGUuaW5pdChybmdfcG9vbCk7Zm9yKHJuZ19wcHRyPTA7cm5nX3BwdHI8cm5nX3Bvb2wubGVuZ3RoOysrcm5nX3BwdHIpe3JuZ19wb29sW3JuZ19wcHRyXT0wfXJuZ19wcHRyPTB9cmV0dXJuIHJuZ19zdGF0ZS5uZXh0KCl9ZnVuY3Rpb24gcm5nX2dldF9ieXRlcyhiKXt2YXIgYTtmb3IoYT0wO2E8Yi5sZW5ndGg7KythKXtiW2FdPXJuZ19nZXRfYnl0ZSgpfX1mdW5jdGlvbiBTZWN1cmVSYW5kb20oKXt9U2VjdXJlUmFuZG9tLnByb3RvdHlwZS5uZXh0Qnl0ZXM9cm5nX2dldF9ieXRlcztcbi8qISAoYykgVG9tIFd1IHwgaHR0cDovL3d3dy1jcy1zdHVkZW50cy5zdGFuZm9yZC5lZHUvfnRqdy9qc2JuL1xuICovXG5mdW5jdGlvbiBwYXJzZUJpZ0ludChiLGEpe3JldHVybiBuZXcgQmlnSW50ZWdlcihiLGEpfWZ1bmN0aW9uIGxpbmVicmsoYyxkKXt2YXIgYT1cIlwiO3ZhciBiPTA7d2hpbGUoYitkPGMubGVuZ3RoKXthKz1jLnN1YnN0cmluZyhiLGIrZCkrXCJcXG5cIjtiKz1kfXJldHVybiBhK2Muc3Vic3RyaW5nKGIsYy5sZW5ndGgpfWZ1bmN0aW9uIGJ5dGUySGV4KGEpe2lmKGE8MTYpe3JldHVyblwiMFwiK2EudG9TdHJpbmcoMTYpfWVsc2V7cmV0dXJuIGEudG9TdHJpbmcoMTYpfX1mdW5jdGlvbiBwa2NzMXBhZDIoZSxoKXtpZihoPGUubGVuZ3RoKzExKXthbGVydChcIk1lc3NhZ2UgdG9vIGxvbmcgZm9yIFJTQVwiKTtyZXR1cm4gbnVsbH12YXIgZz1uZXcgQXJyYXkoKTt2YXIgZD1lLmxlbmd0aC0xO3doaWxlKGQ+PTAmJmg+MCl7dmFyIGY9ZS5jaGFyQ29kZUF0KGQtLSk7aWYoZjwxMjgpe2dbLS1oXT1mfWVsc2V7aWYoKGY+MTI3KSYmKGY8MjA0OCkpe2dbLS1oXT0oZiY2Myl8MTI4O2dbLS1oXT0oZj4+Nil8MTkyfWVsc2V7Z1stLWhdPShmJjYzKXwxMjg7Z1stLWhdPSgoZj4+NikmNjMpfDEyODtnWy0taF09KGY+PjEyKXwyMjR9fX1nWy0taF09MDt2YXIgYj1uZXcgU2VjdXJlUmFuZG9tKCk7dmFyIGE9bmV3IEFycmF5KCk7d2hpbGUoaD4yKXthWzBdPTA7d2hpbGUoYVswXT09MCl7Yi5uZXh0Qnl0ZXMoYSl9Z1stLWhdPWFbMF19Z1stLWhdPTI7Z1stLWhdPTA7cmV0dXJuIG5ldyBCaWdJbnRlZ2VyKGcpfWZ1bmN0aW9uIG9hZXBfbWdmMV9hcnIoYyxhLGUpe3ZhciBiPVwiXCIsZD0wO3doaWxlKGIubGVuZ3RoPGEpe2IrPWUoU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsYy5jb25jYXQoWyhkJjQyNzgxOTAwODApPj4yNCwoZCYxNjcxMTY4MCk+PjE2LChkJjY1MjgwKT4+OCxkJjI1NV0pKSk7ZCs9MX1yZXR1cm4gYn12YXIgU0hBMV9TSVpFPTIwO2Z1bmN0aW9uIG9hZXBfcGFkKGwsYSxjKXtpZihsLmxlbmd0aCsyKlNIQTFfU0laRSsyPmEpe3Rocm93XCJNZXNzYWdlIHRvbyBsb25nIGZvciBSU0FcIn12YXIgaD1cIlwiLGQ7Zm9yKGQ9MDtkPGEtbC5sZW5ndGgtMipTSEExX1NJWkUtMjtkKz0xKXtoKz1cIlxceDAwXCJ9dmFyIGU9cnN0cl9zaGExKFwiXCIpK2grXCJcXHgwMVwiK2w7dmFyIGY9bmV3IEFycmF5KFNIQTFfU0laRSk7bmV3IFNlY3VyZVJhbmRvbSgpLm5leHRCeXRlcyhmKTt2YXIgZz1vYWVwX21nZjFfYXJyKGYsZS5sZW5ndGgsY3x8cnN0cl9zaGExKTt2YXIgaz1bXTtmb3IoZD0wO2Q8ZS5sZW5ndGg7ZCs9MSl7a1tkXT1lLmNoYXJDb2RlQXQoZCleZy5jaGFyQ29kZUF0KGQpfXZhciBqPW9hZXBfbWdmMV9hcnIoayxmLmxlbmd0aCxyc3RyX3NoYTEpO3ZhciBiPVswXTtmb3IoZD0wO2Q8Zi5sZW5ndGg7ZCs9MSl7YltkKzFdPWZbZF1eai5jaGFyQ29kZUF0KGQpfXJldHVybiBuZXcgQmlnSW50ZWdlcihiLmNvbmNhdChrKSl9ZnVuY3Rpb24gUlNBS2V5KCl7dGhpcy5uPW51bGw7dGhpcy5lPTA7dGhpcy5kPW51bGw7dGhpcy5wPW51bGw7dGhpcy5xPW51bGw7dGhpcy5kbXAxPW51bGw7dGhpcy5kbXExPW51bGw7dGhpcy5jb2VmZj1udWxsfWZ1bmN0aW9uIFJTQVNldFB1YmxpYyhiLGEpe3RoaXMuaXNQdWJsaWM9dHJ1ZTtpZih0eXBlb2YgYiE9PVwic3RyaW5nXCIpe3RoaXMubj1iO3RoaXMuZT1hfWVsc2V7aWYoYiE9bnVsbCYmYSE9bnVsbCYmYi5sZW5ndGg+MCYmYS5sZW5ndGg+MCl7dGhpcy5uPXBhcnNlQmlnSW50KGIsMTYpO3RoaXMuZT1wYXJzZUludChhLDE2KX1lbHNle2FsZXJ0KFwiSW52YWxpZCBSU0EgcHVibGljIGtleVwiKX19fWZ1bmN0aW9uIFJTQURvUHVibGljKGEpe3JldHVybiBhLm1vZFBvd0ludCh0aGlzLmUsdGhpcy5uKX1mdW5jdGlvbiBSU0FFbmNyeXB0KGQpe3ZhciBhPXBrY3MxcGFkMihkLCh0aGlzLm4uYml0TGVuZ3RoKCkrNyk+PjMpO2lmKGE9PW51bGwpe3JldHVybiBudWxsfXZhciBlPXRoaXMuZG9QdWJsaWMoYSk7aWYoZT09bnVsbCl7cmV0dXJuIG51bGx9dmFyIGI9ZS50b1N0cmluZygxNik7aWYoKGIubGVuZ3RoJjEpPT0wKXtyZXR1cm4gYn1lbHNle3JldHVyblwiMFwiK2J9fWZ1bmN0aW9uIFJTQUVuY3J5cHRPQUVQKGUsZCl7dmFyIGE9b2FlcF9wYWQoZSwodGhpcy5uLmJpdExlbmd0aCgpKzcpPj4zLGQpO2lmKGE9PW51bGwpe3JldHVybiBudWxsfXZhciBmPXRoaXMuZG9QdWJsaWMoYSk7aWYoZj09bnVsbCl7cmV0dXJuIG51bGx9dmFyIGI9Zi50b1N0cmluZygxNik7aWYoKGIubGVuZ3RoJjEpPT0wKXtyZXR1cm4gYn1lbHNle3JldHVyblwiMFwiK2J9fVJTQUtleS5wcm90b3R5cGUuZG9QdWJsaWM9UlNBRG9QdWJsaWM7UlNBS2V5LnByb3RvdHlwZS5zZXRQdWJsaWM9UlNBU2V0UHVibGljO1JTQUtleS5wcm90b3R5cGUuZW5jcnlwdD1SU0FFbmNyeXB0O1JTQUtleS5wcm90b3R5cGUuZW5jcnlwdE9BRVA9UlNBRW5jcnlwdE9BRVA7UlNBS2V5LnByb3RvdHlwZS50eXBlPVwiUlNBXCI7XG4vKiEgKGMpIFRvbSBXdSB8IGh0dHA6Ly93d3ctY3Mtc3R1ZGVudHMuc3RhbmZvcmQuZWR1L350ancvanNibi9cbiAqL1xuZnVuY3Rpb24gcGtjczF1bnBhZDIoZyxqKXt2YXIgYT1nLnRvQnl0ZUFycmF5KCk7dmFyIGY9MDt3aGlsZShmPGEubGVuZ3RoJiZhW2ZdPT0wKXsrK2Z9aWYoYS5sZW5ndGgtZiE9ai0xfHxhW2ZdIT0yKXtyZXR1cm4gbnVsbH0rK2Y7d2hpbGUoYVtmXSE9MCl7aWYoKytmPj1hLmxlbmd0aCl7cmV0dXJuIG51bGx9fXZhciBlPVwiXCI7d2hpbGUoKytmPGEubGVuZ3RoKXt2YXIgaD1hW2ZdJjI1NTtpZihoPDEyOCl7ZSs9U3RyaW5nLmZyb21DaGFyQ29kZShoKX1lbHNle2lmKChoPjE5MSkmJihoPDIyNCkpe2UrPVN0cmluZy5mcm9tQ2hhckNvZGUoKChoJjMxKTw8Nil8KGFbZisxXSY2MykpOysrZn1lbHNle2UrPVN0cmluZy5mcm9tQ2hhckNvZGUoKChoJjE1KTw8MTIpfCgoYVtmKzFdJjYzKTw8Nil8KGFbZisyXSY2MykpO2YrPTJ9fX1yZXR1cm4gZX1mdW5jdGlvbiBvYWVwX21nZjFfc3RyKGMsYSxlKXt2YXIgYj1cIlwiLGQ9MDt3aGlsZShiLmxlbmd0aDxhKXtiKz1lKGMrU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsWyhkJjQyNzgxOTAwODApPj4yNCwoZCYxNjcxMTY4MCk+PjE2LChkJjY1MjgwKT4+OCxkJjI1NV0pKTtkKz0xfXJldHVybiBifXZhciBTSEExX1NJWkU9MjA7ZnVuY3Rpb24gb2FlcF91bnBhZChsLGIsZSl7bD1sLnRvQnl0ZUFycmF5KCk7dmFyIGY7Zm9yKGY9MDtmPGwubGVuZ3RoO2YrPTEpe2xbZl0mPTI1NX13aGlsZShsLmxlbmd0aDxiKXtsLnVuc2hpZnQoMCl9bD1TdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxsKTtpZihsLmxlbmd0aDwyKlNIQTFfU0laRSsyKXt0aHJvd1wiQ2lwaGVyIHRvbyBzaG9ydFwifXZhciBjPWwuc3Vic3RyKDEsU0hBMV9TSVpFKTt2YXIgbz1sLnN1YnN0cihTSEExX1NJWkUrMSk7dmFyIG09b2FlcF9tZ2YxX3N0cihvLFNIQTFfU0laRSxlfHxyc3RyX3NoYTEpO3ZhciBoPVtdLGY7Zm9yKGY9MDtmPGMubGVuZ3RoO2YrPTEpe2hbZl09Yy5jaGFyQ29kZUF0KGYpXm0uY2hhckNvZGVBdChmKX12YXIgaj1vYWVwX21nZjFfc3RyKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLGgpLGwubGVuZ3RoLVNIQTFfU0laRSxyc3RyX3NoYTEpO3ZhciBnPVtdO2ZvcihmPTA7ZjxvLmxlbmd0aDtmKz0xKXtnW2ZdPW8uY2hhckNvZGVBdChmKV5qLmNoYXJDb2RlQXQoZil9Zz1TdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxnKTtpZihnLnN1YnN0cigwLFNIQTFfU0laRSkhPT1yc3RyX3NoYTEoXCJcIikpe3Rocm93XCJIYXNoIG1pc21hdGNoXCJ9Zz1nLnN1YnN0cihTSEExX1NJWkUpO3ZhciBhPWcuaW5kZXhPZihcIlxceDAxXCIpO3ZhciBrPShhIT0tMSk/Zy5zdWJzdHIoMCxhKS5sYXN0SW5kZXhPZihcIlxceDAwXCIpOi0xO2lmKGsrMSE9YSl7dGhyb3dcIk1hbGZvcm1lZCBkYXRhXCJ9cmV0dXJuIGcuc3Vic3RyKGErMSl9ZnVuY3Rpb24gUlNBU2V0UHJpdmF0ZShjLGEsYil7dGhpcy5pc1ByaXZhdGU9dHJ1ZTtpZih0eXBlb2YgYyE9PVwic3RyaW5nXCIpe3RoaXMubj1jO3RoaXMuZT1hO3RoaXMuZD1ifWVsc2V7aWYoYyE9bnVsbCYmYSE9bnVsbCYmYy5sZW5ndGg+MCYmYS5sZW5ndGg+MCl7dGhpcy5uPXBhcnNlQmlnSW50KGMsMTYpO3RoaXMuZT1wYXJzZUludChhLDE2KTt0aGlzLmQ9cGFyc2VCaWdJbnQoYiwxNil9ZWxzZXthbGVydChcIkludmFsaWQgUlNBIHByaXZhdGUga2V5XCIpfX19ZnVuY3Rpb24gUlNBU2V0UHJpdmF0ZUV4KGcsZCxlLGMsYixhLGgsZil7dGhpcy5pc1ByaXZhdGU9dHJ1ZTtpZihnPT1udWxsKXt0aHJvd1wiUlNBU2V0UHJpdmF0ZUV4IE4gPT0gbnVsbFwifWlmKGQ9PW51bGwpe3Rocm93XCJSU0FTZXRQcml2YXRlRXggRSA9PSBudWxsXCJ9aWYoZy5sZW5ndGg9PTApe3Rocm93XCJSU0FTZXRQcml2YXRlRXggTi5sZW5ndGggPT0gMFwifWlmKGQubGVuZ3RoPT0wKXt0aHJvd1wiUlNBU2V0UHJpdmF0ZUV4IEUubGVuZ3RoID09IDBcIn1pZihnIT1udWxsJiZkIT1udWxsJiZnLmxlbmd0aD4wJiZkLmxlbmd0aD4wKXt0aGlzLm49cGFyc2VCaWdJbnQoZywxNik7dGhpcy5lPXBhcnNlSW50KGQsMTYpO3RoaXMuZD1wYXJzZUJpZ0ludChlLDE2KTt0aGlzLnA9cGFyc2VCaWdJbnQoYywxNik7dGhpcy5xPXBhcnNlQmlnSW50KGIsMTYpO3RoaXMuZG1wMT1wYXJzZUJpZ0ludChhLDE2KTt0aGlzLmRtcTE9cGFyc2VCaWdJbnQoaCwxNik7dGhpcy5jb2VmZj1wYXJzZUJpZ0ludChmLDE2KX1lbHNle2FsZXJ0KFwiSW52YWxpZCBSU0EgcHJpdmF0ZSBrZXkgaW4gUlNBU2V0UHJpdmF0ZUV4XCIpfX1mdW5jdGlvbiBSU0FHZW5lcmF0ZShiLGkpe3ZhciBhPW5ldyBTZWN1cmVSYW5kb20oKTt2YXIgZj1iPj4xO3RoaXMuZT1wYXJzZUludChpLDE2KTt2YXIgYz1uZXcgQmlnSW50ZWdlcihpLDE2KTtmb3IoOzspe2Zvcig7Oyl7dGhpcy5wPW5ldyBCaWdJbnRlZ2VyKGItZiwxLGEpO2lmKHRoaXMucC5zdWJ0cmFjdChCaWdJbnRlZ2VyLk9ORSkuZ2NkKGMpLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLk9ORSk9PTAmJnRoaXMucC5pc1Byb2JhYmxlUHJpbWUoMTApKXticmVha319Zm9yKDs7KXt0aGlzLnE9bmV3IEJpZ0ludGVnZXIoZiwxLGEpO2lmKHRoaXMucS5zdWJ0cmFjdChCaWdJbnRlZ2VyLk9ORSkuZ2NkKGMpLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLk9ORSk9PTAmJnRoaXMucS5pc1Byb2JhYmxlUHJpbWUoMTApKXticmVha319aWYodGhpcy5wLmNvbXBhcmVUbyh0aGlzLnEpPD0wKXt2YXIgaD10aGlzLnA7dGhpcy5wPXRoaXMucTt0aGlzLnE9aH12YXIgZz10aGlzLnAuc3VidHJhY3QoQmlnSW50ZWdlci5PTkUpO3ZhciBkPXRoaXMucS5zdWJ0cmFjdChCaWdJbnRlZ2VyLk9ORSk7dmFyIGU9Zy5tdWx0aXBseShkKTtpZihlLmdjZChjKS5jb21wYXJlVG8oQmlnSW50ZWdlci5PTkUpPT0wKXt0aGlzLm49dGhpcy5wLm11bHRpcGx5KHRoaXMucSk7dGhpcy5kPWMubW9kSW52ZXJzZShlKTt0aGlzLmRtcDE9dGhpcy5kLm1vZChnKTt0aGlzLmRtcTE9dGhpcy5kLm1vZChkKTt0aGlzLmNvZWZmPXRoaXMucS5tb2RJbnZlcnNlKHRoaXMucCk7YnJlYWt9fX1mdW5jdGlvbiBSU0FEb1ByaXZhdGUoYSl7aWYodGhpcy5wPT1udWxsfHx0aGlzLnE9PW51bGwpe3JldHVybiBhLm1vZFBvdyh0aGlzLmQsdGhpcy5uKX12YXIgYz1hLm1vZCh0aGlzLnApLm1vZFBvdyh0aGlzLmRtcDEsdGhpcy5wKTt2YXIgYj1hLm1vZCh0aGlzLnEpLm1vZFBvdyh0aGlzLmRtcTEsdGhpcy5xKTt3aGlsZShjLmNvbXBhcmVUbyhiKTwwKXtjPWMuYWRkKHRoaXMucCl9cmV0dXJuIGMuc3VidHJhY3QoYikubXVsdGlwbHkodGhpcy5jb2VmZikubW9kKHRoaXMucCkubXVsdGlwbHkodGhpcy5xKS5hZGQoYil9ZnVuY3Rpb24gUlNBRGVjcnlwdChiKXt2YXIgZD1wYXJzZUJpZ0ludChiLDE2KTt2YXIgYT10aGlzLmRvUHJpdmF0ZShkKTtpZihhPT1udWxsKXtyZXR1cm4gbnVsbH1yZXR1cm4gcGtjczF1bnBhZDIoYSwodGhpcy5uLmJpdExlbmd0aCgpKzcpPj4zKX1mdW5jdGlvbiBSU0FEZWNyeXB0T0FFUChkLGIpe3ZhciBlPXBhcnNlQmlnSW50KGQsMTYpO3ZhciBhPXRoaXMuZG9Qcml2YXRlKGUpO2lmKGE9PW51bGwpe3JldHVybiBudWxsfXJldHVybiBvYWVwX3VucGFkKGEsKHRoaXMubi5iaXRMZW5ndGgoKSs3KT4+MyxiKX1SU0FLZXkucHJvdG90eXBlLmRvUHJpdmF0ZT1SU0FEb1ByaXZhdGU7UlNBS2V5LnByb3RvdHlwZS5zZXRQcml2YXRlPVJTQVNldFByaXZhdGU7UlNBS2V5LnByb3RvdHlwZS5zZXRQcml2YXRlRXg9UlNBU2V0UHJpdmF0ZUV4O1JTQUtleS5wcm90b3R5cGUuZ2VuZXJhdGU9UlNBR2VuZXJhdGU7UlNBS2V5LnByb3RvdHlwZS5kZWNyeXB0PVJTQURlY3J5cHQ7UlNBS2V5LnByb3RvdHlwZS5kZWNyeXB0T0FFUD1SU0FEZWNyeXB0T0FFUDtcbi8qISAoYykgVG9tIFd1IHwgaHR0cDovL3d3dy1jcy1zdHVkZW50cy5zdGFuZm9yZC5lZHUvfnRqdy9qc2JuL1xuICovXG5mdW5jdGlvbiBFQ0ZpZWxkRWxlbWVudEZwKGIsYSl7dGhpcy54PWE7dGhpcy5xPWJ9ZnVuY3Rpb24gZmVGcEVxdWFscyhhKXtpZihhPT10aGlzKXtyZXR1cm4gdHJ1ZX1yZXR1cm4odGhpcy5xLmVxdWFscyhhLnEpJiZ0aGlzLnguZXF1YWxzKGEueCkpfWZ1bmN0aW9uIGZlRnBUb0JpZ0ludGVnZXIoKXtyZXR1cm4gdGhpcy54fWZ1bmN0aW9uIGZlRnBOZWdhdGUoKXtyZXR1cm4gbmV3IEVDRmllbGRFbGVtZW50RnAodGhpcy5xLHRoaXMueC5uZWdhdGUoKS5tb2QodGhpcy5xKSl9ZnVuY3Rpb24gZmVGcEFkZChhKXtyZXR1cm4gbmV3IEVDRmllbGRFbGVtZW50RnAodGhpcy5xLHRoaXMueC5hZGQoYS50b0JpZ0ludGVnZXIoKSkubW9kKHRoaXMucSkpfWZ1bmN0aW9uIGZlRnBTdWJ0cmFjdChhKXtyZXR1cm4gbmV3IEVDRmllbGRFbGVtZW50RnAodGhpcy5xLHRoaXMueC5zdWJ0cmFjdChhLnRvQmlnSW50ZWdlcigpKS5tb2QodGhpcy5xKSl9ZnVuY3Rpb24gZmVGcE11bHRpcGx5KGEpe3JldHVybiBuZXcgRUNGaWVsZEVsZW1lbnRGcCh0aGlzLnEsdGhpcy54Lm11bHRpcGx5KGEudG9CaWdJbnRlZ2VyKCkpLm1vZCh0aGlzLnEpKX1mdW5jdGlvbiBmZUZwU3F1YXJlKCl7cmV0dXJuIG5ldyBFQ0ZpZWxkRWxlbWVudEZwKHRoaXMucSx0aGlzLnguc3F1YXJlKCkubW9kKHRoaXMucSkpfWZ1bmN0aW9uIGZlRnBEaXZpZGUoYSl7cmV0dXJuIG5ldyBFQ0ZpZWxkRWxlbWVudEZwKHRoaXMucSx0aGlzLngubXVsdGlwbHkoYS50b0JpZ0ludGVnZXIoKS5tb2RJbnZlcnNlKHRoaXMucSkpLm1vZCh0aGlzLnEpKX1FQ0ZpZWxkRWxlbWVudEZwLnByb3RvdHlwZS5lcXVhbHM9ZmVGcEVxdWFscztFQ0ZpZWxkRWxlbWVudEZwLnByb3RvdHlwZS50b0JpZ0ludGVnZXI9ZmVGcFRvQmlnSW50ZWdlcjtFQ0ZpZWxkRWxlbWVudEZwLnByb3RvdHlwZS5uZWdhdGU9ZmVGcE5lZ2F0ZTtFQ0ZpZWxkRWxlbWVudEZwLnByb3RvdHlwZS5hZGQ9ZmVGcEFkZDtFQ0ZpZWxkRWxlbWVudEZwLnByb3RvdHlwZS5zdWJ0cmFjdD1mZUZwU3VidHJhY3Q7RUNGaWVsZEVsZW1lbnRGcC5wcm90b3R5cGUubXVsdGlwbHk9ZmVGcE11bHRpcGx5O0VDRmllbGRFbGVtZW50RnAucHJvdG90eXBlLnNxdWFyZT1mZUZwU3F1YXJlO0VDRmllbGRFbGVtZW50RnAucHJvdG90eXBlLmRpdmlkZT1mZUZwRGl2aWRlO2Z1bmN0aW9uIEVDUG9pbnRGcChjLGEsZCxiKXt0aGlzLmN1cnZlPWM7dGhpcy54PWE7dGhpcy55PWQ7aWYoYj09bnVsbCl7dGhpcy56PUJpZ0ludGVnZXIuT05FfWVsc2V7dGhpcy56PWJ9dGhpcy56aW52PW51bGx9ZnVuY3Rpb24gcG9pbnRGcEdldFgoKXtpZih0aGlzLnppbnY9PW51bGwpe3RoaXMuemludj10aGlzLnoubW9kSW52ZXJzZSh0aGlzLmN1cnZlLnEpfXJldHVybiB0aGlzLmN1cnZlLmZyb21CaWdJbnRlZ2VyKHRoaXMueC50b0JpZ0ludGVnZXIoKS5tdWx0aXBseSh0aGlzLnppbnYpLm1vZCh0aGlzLmN1cnZlLnEpKX1mdW5jdGlvbiBwb2ludEZwR2V0WSgpe2lmKHRoaXMuemludj09bnVsbCl7dGhpcy56aW52PXRoaXMuei5tb2RJbnZlcnNlKHRoaXMuY3VydmUucSl9cmV0dXJuIHRoaXMuY3VydmUuZnJvbUJpZ0ludGVnZXIodGhpcy55LnRvQmlnSW50ZWdlcigpLm11bHRpcGx5KHRoaXMuemludikubW9kKHRoaXMuY3VydmUucSkpfWZ1bmN0aW9uIHBvaW50RnBFcXVhbHMoYSl7aWYoYT09dGhpcyl7cmV0dXJuIHRydWV9aWYodGhpcy5pc0luZmluaXR5KCkpe3JldHVybiBhLmlzSW5maW5pdHkoKX1pZihhLmlzSW5maW5pdHkoKSl7cmV0dXJuIHRoaXMuaXNJbmZpbml0eSgpfXZhciBjLGI7Yz1hLnkudG9CaWdJbnRlZ2VyKCkubXVsdGlwbHkodGhpcy56KS5zdWJ0cmFjdCh0aGlzLnkudG9CaWdJbnRlZ2VyKCkubXVsdGlwbHkoYS56KSkubW9kKHRoaXMuY3VydmUucSk7aWYoIWMuZXF1YWxzKEJpZ0ludGVnZXIuWkVSTykpe3JldHVybiBmYWxzZX1iPWEueC50b0JpZ0ludGVnZXIoKS5tdWx0aXBseSh0aGlzLnopLnN1YnRyYWN0KHRoaXMueC50b0JpZ0ludGVnZXIoKS5tdWx0aXBseShhLnopKS5tb2QodGhpcy5jdXJ2ZS5xKTtyZXR1cm4gYi5lcXVhbHMoQmlnSW50ZWdlci5aRVJPKX1mdW5jdGlvbiBwb2ludEZwSXNJbmZpbml0eSgpe2lmKCh0aGlzLng9PW51bGwpJiYodGhpcy55PT1udWxsKSl7cmV0dXJuIHRydWV9cmV0dXJuIHRoaXMuei5lcXVhbHMoQmlnSW50ZWdlci5aRVJPKSYmIXRoaXMueS50b0JpZ0ludGVnZXIoKS5lcXVhbHMoQmlnSW50ZWdlci5aRVJPKX1mdW5jdGlvbiBwb2ludEZwTmVnYXRlKCl7cmV0dXJuIG5ldyBFQ1BvaW50RnAodGhpcy5jdXJ2ZSx0aGlzLngsdGhpcy55Lm5lZ2F0ZSgpLHRoaXMueil9ZnVuY3Rpb24gcG9pbnRGcEFkZChsKXtpZih0aGlzLmlzSW5maW5pdHkoKSl7cmV0dXJuIGx9aWYobC5pc0luZmluaXR5KCkpe3JldHVybiB0aGlzfXZhciBwPWwueS50b0JpZ0ludGVnZXIoKS5tdWx0aXBseSh0aGlzLnopLnN1YnRyYWN0KHRoaXMueS50b0JpZ0ludGVnZXIoKS5tdWx0aXBseShsLnopKS5tb2QodGhpcy5jdXJ2ZS5xKTt2YXIgbz1sLngudG9CaWdJbnRlZ2VyKCkubXVsdGlwbHkodGhpcy56KS5zdWJ0cmFjdCh0aGlzLngudG9CaWdJbnRlZ2VyKCkubXVsdGlwbHkobC56KSkubW9kKHRoaXMuY3VydmUucSk7aWYoQmlnSW50ZWdlci5aRVJPLmVxdWFscyhvKSl7aWYoQmlnSW50ZWdlci5aRVJPLmVxdWFscyhwKSl7cmV0dXJuIHRoaXMudHdpY2UoKX1yZXR1cm4gdGhpcy5jdXJ2ZS5nZXRJbmZpbml0eSgpfXZhciBqPW5ldyBCaWdJbnRlZ2VyKFwiM1wiKTt2YXIgZT10aGlzLngudG9CaWdJbnRlZ2VyKCk7dmFyIG49dGhpcy55LnRvQmlnSW50ZWdlcigpO3ZhciBjPWwueC50b0JpZ0ludGVnZXIoKTt2YXIgaz1sLnkudG9CaWdJbnRlZ2VyKCk7dmFyIG09by5zcXVhcmUoKTt2YXIgaT1tLm11bHRpcGx5KG8pO3ZhciBkPWUubXVsdGlwbHkobSk7dmFyIGc9cC5zcXVhcmUoKS5tdWx0aXBseSh0aGlzLnopO3ZhciBhPWcuc3VidHJhY3QoZC5zaGlmdExlZnQoMSkpLm11bHRpcGx5KGwueikuc3VidHJhY3QoaSkubXVsdGlwbHkobykubW9kKHRoaXMuY3VydmUucSk7dmFyIGg9ZC5tdWx0aXBseShqKS5tdWx0aXBseShwKS5zdWJ0cmFjdChuLm11bHRpcGx5KGkpKS5zdWJ0cmFjdChnLm11bHRpcGx5KHApKS5tdWx0aXBseShsLnopLmFkZChwLm11bHRpcGx5KGkpKS5tb2QodGhpcy5jdXJ2ZS5xKTt2YXIgZj1pLm11bHRpcGx5KHRoaXMueikubXVsdGlwbHkobC56KS5tb2QodGhpcy5jdXJ2ZS5xKTtyZXR1cm4gbmV3IEVDUG9pbnRGcCh0aGlzLmN1cnZlLHRoaXMuY3VydmUuZnJvbUJpZ0ludGVnZXIoYSksdGhpcy5jdXJ2ZS5mcm9tQmlnSW50ZWdlcihoKSxmKX1mdW5jdGlvbiBwb2ludEZwVHdpY2UoKXtpZih0aGlzLmlzSW5maW5pdHkoKSl7cmV0dXJuIHRoaXN9aWYodGhpcy55LnRvQmlnSW50ZWdlcigpLnNpZ251bSgpPT0wKXtyZXR1cm4gdGhpcy5jdXJ2ZS5nZXRJbmZpbml0eSgpfXZhciBnPW5ldyBCaWdJbnRlZ2VyKFwiM1wiKTt2YXIgYz10aGlzLngudG9CaWdJbnRlZ2VyKCk7dmFyIGg9dGhpcy55LnRvQmlnSW50ZWdlcigpO3ZhciBlPWgubXVsdGlwbHkodGhpcy56KTt2YXIgaj1lLm11bHRpcGx5KGgpLm1vZCh0aGlzLmN1cnZlLnEpO3ZhciBpPXRoaXMuY3VydmUuYS50b0JpZ0ludGVnZXIoKTt2YXIgaz1jLnNxdWFyZSgpLm11bHRpcGx5KGcpO2lmKCFCaWdJbnRlZ2VyLlpFUk8uZXF1YWxzKGkpKXtrPWsuYWRkKHRoaXMuei5zcXVhcmUoKS5tdWx0aXBseShpKSl9az1rLm1vZCh0aGlzLmN1cnZlLnEpO3ZhciBiPWsuc3F1YXJlKCkuc3VidHJhY3QoYy5zaGlmdExlZnQoMykubXVsdGlwbHkoaikpLnNoaWZ0TGVmdCgxKS5tdWx0aXBseShlKS5tb2QodGhpcy5jdXJ2ZS5xKTt2YXIgZj1rLm11bHRpcGx5KGcpLm11bHRpcGx5KGMpLnN1YnRyYWN0KGouc2hpZnRMZWZ0KDEpKS5zaGlmdExlZnQoMikubXVsdGlwbHkoaikuc3VidHJhY3Qoay5zcXVhcmUoKS5tdWx0aXBseShrKSkubW9kKHRoaXMuY3VydmUucSk7dmFyIGQ9ZS5zcXVhcmUoKS5tdWx0aXBseShlKS5zaGlmdExlZnQoMykubW9kKHRoaXMuY3VydmUucSk7cmV0dXJuIG5ldyBFQ1BvaW50RnAodGhpcy5jdXJ2ZSx0aGlzLmN1cnZlLmZyb21CaWdJbnRlZ2VyKGIpLHRoaXMuY3VydmUuZnJvbUJpZ0ludGVnZXIoZiksZCl9ZnVuY3Rpb24gcG9pbnRGcE11bHRpcGx5KGIpe2lmKHRoaXMuaXNJbmZpbml0eSgpKXtyZXR1cm4gdGhpc31pZihiLnNpZ251bSgpPT0wKXtyZXR1cm4gdGhpcy5jdXJ2ZS5nZXRJbmZpbml0eSgpfXZhciBnPWI7dmFyIGY9Zy5tdWx0aXBseShuZXcgQmlnSW50ZWdlcihcIjNcIikpO3ZhciBsPXRoaXMubmVnYXRlKCk7dmFyIGQ9dGhpczt2YXIgYztmb3IoYz1mLmJpdExlbmd0aCgpLTI7Yz4wOy0tYyl7ZD1kLnR3aWNlKCk7dmFyIGE9Zi50ZXN0Qml0KGMpO3ZhciBqPWcudGVzdEJpdChjKTtpZihhIT1qKXtkPWQuYWRkKGE/dGhpczpsKX19cmV0dXJuIGR9ZnVuY3Rpb24gcG9pbnRGcE11bHRpcGx5VHdvKGMsYSxiKXt2YXIgZDtpZihjLmJpdExlbmd0aCgpPmIuYml0TGVuZ3RoKCkpe2Q9Yy5iaXRMZW5ndGgoKS0xfWVsc2V7ZD1iLmJpdExlbmd0aCgpLTF9dmFyIGY9dGhpcy5jdXJ2ZS5nZXRJbmZpbml0eSgpO3ZhciBlPXRoaXMuYWRkKGEpO3doaWxlKGQ+PTApe2Y9Zi50d2ljZSgpO2lmKGMudGVzdEJpdChkKSl7aWYoYi50ZXN0Qml0KGQpKXtmPWYuYWRkKGUpfWVsc2V7Zj1mLmFkZCh0aGlzKX19ZWxzZXtpZihiLnRlc3RCaXQoZCkpe2Y9Zi5hZGQoYSl9fS0tZH1yZXR1cm4gZn1FQ1BvaW50RnAucHJvdG90eXBlLmdldFg9cG9pbnRGcEdldFg7RUNQb2ludEZwLnByb3RvdHlwZS5nZXRZPXBvaW50RnBHZXRZO0VDUG9pbnRGcC5wcm90b3R5cGUuZXF1YWxzPXBvaW50RnBFcXVhbHM7RUNQb2ludEZwLnByb3RvdHlwZS5pc0luZmluaXR5PXBvaW50RnBJc0luZmluaXR5O0VDUG9pbnRGcC5wcm90b3R5cGUubmVnYXRlPXBvaW50RnBOZWdhdGU7RUNQb2ludEZwLnByb3RvdHlwZS5hZGQ9cG9pbnRGcEFkZDtFQ1BvaW50RnAucHJvdG90eXBlLnR3aWNlPXBvaW50RnBUd2ljZTtFQ1BvaW50RnAucHJvdG90eXBlLm11bHRpcGx5PXBvaW50RnBNdWx0aXBseTtFQ1BvaW50RnAucHJvdG90eXBlLm11bHRpcGx5VHdvPXBvaW50RnBNdWx0aXBseVR3bztmdW5jdGlvbiBFQ0N1cnZlRnAoZSxkLGMpe3RoaXMucT1lO3RoaXMuYT10aGlzLmZyb21CaWdJbnRlZ2VyKGQpO3RoaXMuYj10aGlzLmZyb21CaWdJbnRlZ2VyKGMpO3RoaXMuaW5maW5pdHk9bmV3IEVDUG9pbnRGcCh0aGlzLG51bGwsbnVsbCl9ZnVuY3Rpb24gY3VydmVGcEdldFEoKXtyZXR1cm4gdGhpcy5xfWZ1bmN0aW9uIGN1cnZlRnBHZXRBKCl7cmV0dXJuIHRoaXMuYX1mdW5jdGlvbiBjdXJ2ZUZwR2V0Qigpe3JldHVybiB0aGlzLmJ9ZnVuY3Rpb24gY3VydmVGcEVxdWFscyhhKXtpZihhPT10aGlzKXtyZXR1cm4gdHJ1ZX1yZXR1cm4odGhpcy5xLmVxdWFscyhhLnEpJiZ0aGlzLmEuZXF1YWxzKGEuYSkmJnRoaXMuYi5lcXVhbHMoYS5iKSl9ZnVuY3Rpb24gY3VydmVGcEdldEluZmluaXR5KCl7cmV0dXJuIHRoaXMuaW5maW5pdHl9ZnVuY3Rpb24gY3VydmVGcEZyb21CaWdJbnRlZ2VyKGEpe3JldHVybiBuZXcgRUNGaWVsZEVsZW1lbnRGcCh0aGlzLnEsYSl9ZnVuY3Rpb24gY3VydmVGcERlY29kZVBvaW50SGV4KGQpe3N3aXRjaChwYXJzZUludChkLnN1YnN0cigwLDIpLDE2KSl7Y2FzZSAwOnJldHVybiB0aGlzLmluZmluaXR5O2Nhc2UgMjpjYXNlIDM6cmV0dXJuIG51bGw7Y2FzZSA0OmNhc2UgNjpjYXNlIDc6dmFyIGE9KGQubGVuZ3RoLTIpLzI7dmFyIGM9ZC5zdWJzdHIoMixhKTt2YXIgYj1kLnN1YnN0cihhKzIsYSk7cmV0dXJuIG5ldyBFQ1BvaW50RnAodGhpcyx0aGlzLmZyb21CaWdJbnRlZ2VyKG5ldyBCaWdJbnRlZ2VyKGMsMTYpKSx0aGlzLmZyb21CaWdJbnRlZ2VyKG5ldyBCaWdJbnRlZ2VyKGIsMTYpKSk7ZGVmYXVsdDpyZXR1cm4gbnVsbH19RUNDdXJ2ZUZwLnByb3RvdHlwZS5nZXRRPWN1cnZlRnBHZXRRO0VDQ3VydmVGcC5wcm90b3R5cGUuZ2V0QT1jdXJ2ZUZwR2V0QTtFQ0N1cnZlRnAucHJvdG90eXBlLmdldEI9Y3VydmVGcEdldEI7RUNDdXJ2ZUZwLnByb3RvdHlwZS5lcXVhbHM9Y3VydmVGcEVxdWFscztFQ0N1cnZlRnAucHJvdG90eXBlLmdldEluZmluaXR5PWN1cnZlRnBHZXRJbmZpbml0eTtFQ0N1cnZlRnAucHJvdG90eXBlLmZyb21CaWdJbnRlZ2VyPWN1cnZlRnBGcm9tQmlnSW50ZWdlcjtFQ0N1cnZlRnAucHJvdG90eXBlLmRlY29kZVBvaW50SGV4PWN1cnZlRnBEZWNvZGVQb2ludEhleDtcbi8qISAoYykgU3RlZmFuIFRob21hcyB8IGh0dHBzOi8vZ2l0aHViLmNvbS9iaXRjb2luanMvYml0Y29pbmpzLWxpYlxuICovXG5FQ0ZpZWxkRWxlbWVudEZwLnByb3RvdHlwZS5nZXRCeXRlTGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguZmxvb3IoKHRoaXMudG9CaWdJbnRlZ2VyKCkuYml0TGVuZ3RoKCkrNykvOCl9O0VDUG9pbnRGcC5wcm90b3R5cGUuZ2V0RW5jb2RlZD1mdW5jdGlvbihjKXt2YXIgZD1mdW5jdGlvbihoLGYpe3ZhciBnPWgudG9CeXRlQXJyYXlVbnNpZ25lZCgpO2lmKGY8Zy5sZW5ndGgpe2c9Zy5zbGljZShnLmxlbmd0aC1mKX1lbHNle3doaWxlKGY+Zy5sZW5ndGgpe2cudW5zaGlmdCgwKX19cmV0dXJuIGd9O3ZhciBhPXRoaXMuZ2V0WCgpLnRvQmlnSW50ZWdlcigpO3ZhciBlPXRoaXMuZ2V0WSgpLnRvQmlnSW50ZWdlcigpO3ZhciBiPWQoYSwzMik7aWYoYyl7aWYoZS5pc0V2ZW4oKSl7Yi51bnNoaWZ0KDIpfWVsc2V7Yi51bnNoaWZ0KDMpfX1lbHNle2IudW5zaGlmdCg0KTtiPWIuY29uY2F0KGQoZSwzMikpfXJldHVybiBifTtFQ1BvaW50RnAuZGVjb2RlRnJvbT1mdW5jdGlvbihnLGMpe3ZhciBmPWNbMF07dmFyIGU9Yy5sZW5ndGgtMTt2YXIgZD1jLnNsaWNlKDEsMStlLzIpO3ZhciBiPWMuc2xpY2UoMStlLzIsMStlKTtkLnVuc2hpZnQoMCk7Yi51bnNoaWZ0KDApO3ZhciBhPW5ldyBCaWdJbnRlZ2VyKGQpO3ZhciBoPW5ldyBCaWdJbnRlZ2VyKGIpO3JldHVybiBuZXcgRUNQb2ludEZwKGcsZy5mcm9tQmlnSW50ZWdlcihhKSxnLmZyb21CaWdJbnRlZ2VyKGgpKX07RUNQb2ludEZwLmRlY29kZUZyb21IZXg9ZnVuY3Rpb24oZyxjKXt2YXIgZj1jLnN1YnN0cigwLDIpO3ZhciBlPWMubGVuZ3RoLTI7dmFyIGQ9Yy5zdWJzdHIoMixlLzIpO3ZhciBiPWMuc3Vic3RyKDIrZS8yLGUvMik7dmFyIGE9bmV3IEJpZ0ludGVnZXIoZCwxNik7dmFyIGg9bmV3IEJpZ0ludGVnZXIoYiwxNik7cmV0dXJuIG5ldyBFQ1BvaW50RnAoZyxnLmZyb21CaWdJbnRlZ2VyKGEpLGcuZnJvbUJpZ0ludGVnZXIoaCkpfTtFQ1BvaW50RnAucHJvdG90eXBlLmFkZDJEPWZ1bmN0aW9uKGMpe2lmKHRoaXMuaXNJbmZpbml0eSgpKXtyZXR1cm4gY31pZihjLmlzSW5maW5pdHkoKSl7cmV0dXJuIHRoaXN9aWYodGhpcy54LmVxdWFscyhjLngpKXtpZih0aGlzLnkuZXF1YWxzKGMueSkpe3JldHVybiB0aGlzLnR3aWNlKCl9cmV0dXJuIHRoaXMuY3VydmUuZ2V0SW5maW5pdHkoKX12YXIgZz1jLnguc3VidHJhY3QodGhpcy54KTt2YXIgZT1jLnkuc3VidHJhY3QodGhpcy55KTt2YXIgYT1lLmRpdmlkZShnKTt2YXIgZD1hLnNxdWFyZSgpLnN1YnRyYWN0KHRoaXMueCkuc3VidHJhY3QoYy54KTt2YXIgZj1hLm11bHRpcGx5KHRoaXMueC5zdWJ0cmFjdChkKSkuc3VidHJhY3QodGhpcy55KTtyZXR1cm4gbmV3IEVDUG9pbnRGcCh0aGlzLmN1cnZlLGQsZil9O0VDUG9pbnRGcC5wcm90b3R5cGUudHdpY2UyRD1mdW5jdGlvbigpe2lmKHRoaXMuaXNJbmZpbml0eSgpKXtyZXR1cm4gdGhpc31pZih0aGlzLnkudG9CaWdJbnRlZ2VyKCkuc2lnbnVtKCk9PTApe3JldHVybiB0aGlzLmN1cnZlLmdldEluZmluaXR5KCl9dmFyIGI9dGhpcy5jdXJ2ZS5mcm9tQmlnSW50ZWdlcihCaWdJbnRlZ2VyLnZhbHVlT2YoMikpO3ZhciBlPXRoaXMuY3VydmUuZnJvbUJpZ0ludGVnZXIoQmlnSW50ZWdlci52YWx1ZU9mKDMpKTt2YXIgYT10aGlzLnguc3F1YXJlKCkubXVsdGlwbHkoZSkuYWRkKHRoaXMuY3VydmUuYSkuZGl2aWRlKHRoaXMueS5tdWx0aXBseShiKSk7dmFyIGM9YS5zcXVhcmUoKS5zdWJ0cmFjdCh0aGlzLngubXVsdGlwbHkoYikpO3ZhciBkPWEubXVsdGlwbHkodGhpcy54LnN1YnRyYWN0KGMpKS5zdWJ0cmFjdCh0aGlzLnkpO3JldHVybiBuZXcgRUNQb2ludEZwKHRoaXMuY3VydmUsYyxkKX07RUNQb2ludEZwLnByb3RvdHlwZS5tdWx0aXBseTJEPWZ1bmN0aW9uKGIpe2lmKHRoaXMuaXNJbmZpbml0eSgpKXtyZXR1cm4gdGhpc31pZihiLnNpZ251bSgpPT0wKXtyZXR1cm4gdGhpcy5jdXJ2ZS5nZXRJbmZpbml0eSgpfXZhciBnPWI7dmFyIGY9Zy5tdWx0aXBseShuZXcgQmlnSW50ZWdlcihcIjNcIikpO3ZhciBsPXRoaXMubmVnYXRlKCk7dmFyIGQ9dGhpczt2YXIgYztmb3IoYz1mLmJpdExlbmd0aCgpLTI7Yz4wOy0tYyl7ZD1kLnR3aWNlKCk7dmFyIGE9Zi50ZXN0Qml0KGMpO3ZhciBqPWcudGVzdEJpdChjKTtpZihhIT1qKXtkPWQuYWRkMkQoYT90aGlzOmwpfX1yZXR1cm4gZH07RUNQb2ludEZwLnByb3RvdHlwZS5pc09uQ3VydmU9ZnVuY3Rpb24oKXt2YXIgZD10aGlzLmdldFgoKS50b0JpZ0ludGVnZXIoKTt2YXIgaT10aGlzLmdldFkoKS50b0JpZ0ludGVnZXIoKTt2YXIgZj10aGlzLmN1cnZlLmdldEEoKS50b0JpZ0ludGVnZXIoKTt2YXIgYz10aGlzLmN1cnZlLmdldEIoKS50b0JpZ0ludGVnZXIoKTt2YXIgaD10aGlzLmN1cnZlLmdldFEoKTt2YXIgZT1pLm11bHRpcGx5KGkpLm1vZChoKTt2YXIgZz1kLm11bHRpcGx5KGQpLm11bHRpcGx5KGQpLmFkZChmLm11bHRpcGx5KGQpKS5hZGQoYykubW9kKGgpO3JldHVybiBlLmVxdWFscyhnKX07RUNQb2ludEZwLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVyblwiKFwiK3RoaXMuZ2V0WCgpLnRvQmlnSW50ZWdlcigpLnRvU3RyaW5nKCkrXCIsXCIrdGhpcy5nZXRZKCkudG9CaWdJbnRlZ2VyKCkudG9TdHJpbmcoKStcIilcIn07RUNQb2ludEZwLnByb3RvdHlwZS52YWxpZGF0ZT1mdW5jdGlvbigpe3ZhciBjPXRoaXMuY3VydmUuZ2V0USgpO2lmKHRoaXMuaXNJbmZpbml0eSgpKXt0aHJvdyBuZXcgRXJyb3IoXCJQb2ludCBpcyBhdCBpbmZpbml0eS5cIil9dmFyIGE9dGhpcy5nZXRYKCkudG9CaWdJbnRlZ2VyKCk7dmFyIGI9dGhpcy5nZXRZKCkudG9CaWdJbnRlZ2VyKCk7aWYoYS5jb21wYXJlVG8oQmlnSW50ZWdlci5PTkUpPDB8fGEuY29tcGFyZVRvKGMuc3VidHJhY3QoQmlnSW50ZWdlci5PTkUpKT4wKXt0aHJvdyBuZXcgRXJyb3IoXCJ4IGNvb3JkaW5hdGUgb3V0IG9mIGJvdW5kc1wiKX1pZihiLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLk9ORSk8MHx8Yi5jb21wYXJlVG8oYy5zdWJ0cmFjdChCaWdJbnRlZ2VyLk9ORSkpPjApe3Rocm93IG5ldyBFcnJvcihcInkgY29vcmRpbmF0ZSBvdXQgb2YgYm91bmRzXCIpfWlmKCF0aGlzLmlzT25DdXJ2ZSgpKXt0aHJvdyBuZXcgRXJyb3IoXCJQb2ludCBpcyBub3Qgb24gdGhlIGN1cnZlLlwiKX1pZih0aGlzLm11bHRpcGx5KGMpLmlzSW5maW5pdHkoKSl7dGhyb3cgbmV3IEVycm9yKFwiUG9pbnQgaXMgbm90IGEgc2NhbGFyIG11bHRpcGxlIG9mIEcuXCIpfXJldHVybiB0cnVlfTtcbi8qISBhc24xLTEuMC45LmpzIChjKSAyMDEzLTIwMTUgS2VuamkgVXJ1c2hpbWEgfCBranVyLmdpdGh1Yi5jb20vanNyc2FzaWduL2xpY2Vuc2VcbiAqL1xuaWYodHlwZW9mIEtKVVI9PVwidW5kZWZpbmVkXCJ8fCFLSlVSKXtLSlVSPXt9fWlmKHR5cGVvZiBLSlVSLmFzbjE9PVwidW5kZWZpbmVkXCJ8fCFLSlVSLmFzbjEpe0tKVVIuYXNuMT17fX1LSlVSLmFzbjEuQVNOMVV0aWw9bmV3IGZ1bmN0aW9uKCl7dGhpcy5pbnRlZ2VyVG9CeXRlSGV4PWZ1bmN0aW9uKGEpe3ZhciBiPWEudG9TdHJpbmcoMTYpO2lmKChiLmxlbmd0aCUyKT09MSl7Yj1cIjBcIitifXJldHVybiBifTt0aGlzLmJpZ0ludFRvTWluVHdvc0NvbXBsZW1lbnRzSGV4PWZ1bmN0aW9uKGope3ZhciBmPWoudG9TdHJpbmcoMTYpO2lmKGYuc3Vic3RyKDAsMSkhPVwiLVwiKXtpZihmLmxlbmd0aCUyPT0xKXtmPVwiMFwiK2Z9ZWxzZXtpZighZi5tYXRjaCgvXlswLTddLykpe2Y9XCIwMFwiK2Z9fX1lbHNle3ZhciBhPWYuc3Vic3RyKDEpO3ZhciBlPWEubGVuZ3RoO2lmKGUlMj09MSl7ZSs9MX1lbHNle2lmKCFmLm1hdGNoKC9eWzAtN10vKSl7ZSs9Mn19dmFyIGc9XCJcIjtmb3IodmFyIGQ9MDtkPGU7ZCsrKXtnKz1cImZcIn12YXIgYz1uZXcgQmlnSW50ZWdlcihnLDE2KTt2YXIgYj1jLnhvcihqKS5hZGQoQmlnSW50ZWdlci5PTkUpO2Y9Yi50b1N0cmluZygxNikucmVwbGFjZSgvXi0vLFwiXCIpfXJldHVybiBmfTt0aGlzLmdldFBFTVN0cmluZ0Zyb21IZXg9ZnVuY3Rpb24oYSxiKXt2YXIgYz1LSlVSLmFzbjE7dmFyIGY9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZShhKTt2YXIgZD1DcnlwdG9KUy5lbmMuQmFzZTY0LnN0cmluZ2lmeShmKTt2YXIgZT1kLnJlcGxhY2UoLyguezY0fSkvZyxcIiQxXFxyXFxuXCIpO2U9ZS5yZXBsYWNlKC9cXHJcXG4kLyxcIlwiKTtyZXR1cm5cIi0tLS0tQkVHSU4gXCIrYitcIi0tLS0tXFxyXFxuXCIrZStcIlxcclxcbi0tLS0tRU5EIFwiK2IrXCItLS0tLVxcclxcblwifTt0aGlzLm5ld09iamVjdD1mdW5jdGlvbihiKXt2YXIgZz1LSlVSLmFzbjE7dmFyIGs9T2JqZWN0LmtleXMoYik7aWYoay5sZW5ndGghPTEpe3Rocm93XCJrZXkgb2YgcGFyYW0gc2hhbGwgYmUgb25seSBvbmUuXCJ9dmFyIGo9a1swXTtpZihcIjpib29sOmludDpiaXRzdHI6b2N0c3RyOm51bGw6b2lkOmVudW06dXRmOHN0cjpudW1zdHI6cHJuc3RyOnRlbHN0cjppYTVzdHI6dXRjdGltZTpnZW50aW1lOnNlcTpzZXQ6dGFnOlwiLmluZGV4T2YoXCI6XCIraitcIjpcIik9PS0xKXt0aHJvd1widW5kZWZpbmVkIGtleTogXCIran1pZihqPT1cImJvb2xcIil7cmV0dXJuIG5ldyBnLkRFUkJvb2xlYW4oYltqXSl9aWYoaj09XCJpbnRcIil7cmV0dXJuIG5ldyBnLkRFUkludGVnZXIoYltqXSl9aWYoaj09XCJiaXRzdHJcIil7cmV0dXJuIG5ldyBnLkRFUkJpdFN0cmluZyhiW2pdKX1pZihqPT1cIm9jdHN0clwiKXtyZXR1cm4gbmV3IGcuREVST2N0ZXRTdHJpbmcoYltqXSl9aWYoaj09XCJudWxsXCIpe3JldHVybiBuZXcgZy5ERVJOdWxsKGJbal0pfWlmKGo9PVwib2lkXCIpe3JldHVybiBuZXcgZy5ERVJPYmplY3RJZGVudGlmaWVyKGJbal0pfWlmKGo9PVwiZW51bVwiKXtyZXR1cm4gbmV3IGcuREVSRW51bWVyYXRlZChiW2pdKX1pZihqPT1cInV0ZjhzdHJcIil7cmV0dXJuIG5ldyBnLkRFUlVURjhTdHJpbmcoYltqXSl9aWYoaj09XCJudW1zdHJcIil7cmV0dXJuIG5ldyBnLkRFUk51bWVyaWNTdHJpbmcoYltqXSl9aWYoaj09XCJwcm5zdHJcIil7cmV0dXJuIG5ldyBnLkRFUlByaW50YWJsZVN0cmluZyhiW2pdKX1pZihqPT1cInRlbHN0clwiKXtyZXR1cm4gbmV3IGcuREVSVGVsZXRleFN0cmluZyhiW2pdKX1pZihqPT1cImlhNXN0clwiKXtyZXR1cm4gbmV3IGcuREVSSUE1U3RyaW5nKGJbal0pfWlmKGo9PVwidXRjdGltZVwiKXtyZXR1cm4gbmV3IGcuREVSVVRDVGltZShiW2pdKX1pZihqPT1cImdlbnRpbWVcIil7cmV0dXJuIG5ldyBnLkRFUkdlbmVyYWxpemVkVGltZShiW2pdKX1pZihqPT1cInNlcVwiKXt2YXIgbT1iW2pdO3ZhciBoPVtdO2Zvcih2YXIgZT0wO2U8bS5sZW5ndGg7ZSsrKXt2YXIgbD1nLkFTTjFVdGlsLm5ld09iamVjdChtW2VdKTtoLnB1c2gobCl9cmV0dXJuIG5ldyBnLkRFUlNlcXVlbmNlKHthcnJheTpofSl9aWYoaj09XCJzZXRcIil7dmFyIG09YltqXTt2YXIgaD1bXTtmb3IodmFyIGU9MDtlPG0ubGVuZ3RoO2UrKyl7dmFyIGw9Zy5BU04xVXRpbC5uZXdPYmplY3QobVtlXSk7aC5wdXNoKGwpfXJldHVybiBuZXcgZy5ERVJTZXQoe2FycmF5Omh9KX1pZihqPT1cInRhZ1wiKXt2YXIgYz1iW2pdO2lmKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChjKT09PVwiW29iamVjdCBBcnJheV1cIiYmYy5sZW5ndGg9PTMpe3ZhciBkPWcuQVNOMVV0aWwubmV3T2JqZWN0KGNbMl0pO3JldHVybiBuZXcgZy5ERVJUYWdnZWRPYmplY3Qoe3RhZzpjWzBdLGV4cGxpY2l0OmNbMV0sb2JqOmR9KX1lbHNle3ZhciBmPXt9O2lmKGMuZXhwbGljaXQhPT11bmRlZmluZWQpe2YuZXhwbGljaXQ9Yy5leHBsaWNpdH1pZihjLnRhZyE9PXVuZGVmaW5lZCl7Zi50YWc9Yy50YWd9aWYoYy5vYmo9PT11bmRlZmluZWQpe3Rocm93XCJvYmogc2hhbGwgYmUgc3BlY2lmaWVkIGZvciAndGFnJy5cIn1mLm9iaj1nLkFTTjFVdGlsLm5ld09iamVjdChjLm9iaik7cmV0dXJuIG5ldyBnLkRFUlRhZ2dlZE9iamVjdChmKX19fTt0aGlzLmpzb25Ub0FTTjFIRVg9ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5uZXdPYmplY3QoYik7cmV0dXJuIGEuZ2V0RW5jb2RlZEhleCgpfX07S0pVUi5hc24xLkFTTjFVdGlsLm9pZEhleFRvSW50PWZ1bmN0aW9uKGEpe3ZhciBqPVwiXCI7dmFyIGs9cGFyc2VJbnQoYS5zdWJzdHIoMCwyKSwxNik7dmFyIGQ9TWF0aC5mbG9vcihrLzQwKTt2YXIgYz1rJTQwO3ZhciBqPWQrXCIuXCIrYzt2YXIgZT1cIlwiO2Zvcih2YXIgZj0yO2Y8YS5sZW5ndGg7Zis9Mil7dmFyIGc9cGFyc2VJbnQoYS5zdWJzdHIoZiwyKSwxNik7dmFyIGg9KFwiMDAwMDAwMDBcIitnLnRvU3RyaW5nKDIpKS5zbGljZSgtOCk7ZT1lK2guc3Vic3RyKDEsNyk7aWYoaC5zdWJzdHIoMCwxKT09XCIwXCIpe3ZhciBiPW5ldyBCaWdJbnRlZ2VyKGUsMik7aj1qK1wiLlwiK2IudG9TdHJpbmcoMTApO2U9XCJcIn19cmV0dXJuIGp9O0tKVVIuYXNuMS5BU04xVXRpbC5vaWRJbnRUb0hleD1mdW5jdGlvbihmKXt2YXIgZT1mdW5jdGlvbihhKXt2YXIgaz1hLnRvU3RyaW5nKDE2KTtpZihrLmxlbmd0aD09MSl7az1cIjBcIitrfXJldHVybiBrfTt2YXIgZD1mdW5jdGlvbihvKXt2YXIgbj1cIlwiO3ZhciBrPW5ldyBCaWdJbnRlZ2VyKG8sMTApO3ZhciBhPWsudG9TdHJpbmcoMik7dmFyIGw9Ny1hLmxlbmd0aCU3O2lmKGw9PTcpe2w9MH12YXIgcT1cIlwiO2Zvcih2YXIgbT0wO208bDttKyspe3ErPVwiMFwifWE9cSthO2Zvcih2YXIgbT0wO208YS5sZW5ndGgtMTttKz03KXt2YXIgcD1hLnN1YnN0cihtLDcpO2lmKG0hPWEubGVuZ3RoLTcpe3A9XCIxXCIrcH1uKz1lKHBhcnNlSW50KHAsMikpfXJldHVybiBufTtpZighZi5tYXRjaCgvXlswLTkuXSskLykpe3Rocm93XCJtYWxmb3JtZWQgb2lkIHN0cmluZzogXCIrZn12YXIgZz1cIlwiO3ZhciBiPWYuc3BsaXQoXCIuXCIpO3ZhciBqPXBhcnNlSW50KGJbMF0pKjQwK3BhcnNlSW50KGJbMV0pO2crPWUoaik7Yi5zcGxpY2UoMCwyKTtmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl7Zys9ZChiW2NdKX1yZXR1cm4gZ307S0pVUi5hc24xLkFTTjFPYmplY3Q9ZnVuY3Rpb24oKXt2YXIgYz10cnVlO3ZhciBiPW51bGw7dmFyIGQ9XCIwMFwiO3ZhciBlPVwiMDBcIjt2YXIgYT1cIlwiO3RoaXMuZ2V0TGVuZ3RoSGV4RnJvbVZhbHVlPWZ1bmN0aW9uKCl7aWYodHlwZW9mIHRoaXMuaFY9PVwidW5kZWZpbmVkXCJ8fHRoaXMuaFY9PW51bGwpe3Rocm93XCJ0aGlzLmhWIGlzIG51bGwgb3IgdW5kZWZpbmVkLlwifWlmKHRoaXMuaFYubGVuZ3RoJTI9PTEpe3Rocm93XCJ2YWx1ZSBoZXggbXVzdCBiZSBldmVuIGxlbmd0aDogbj1cIithLmxlbmd0aCtcIix2PVwiK3RoaXMuaFZ9dmFyIGk9dGhpcy5oVi5sZW5ndGgvMjt2YXIgaD1pLnRvU3RyaW5nKDE2KTtpZihoLmxlbmd0aCUyPT0xKXtoPVwiMFwiK2h9aWYoaTwxMjgpe3JldHVybiBofWVsc2V7dmFyIGc9aC5sZW5ndGgvMjtpZihnPjE1KXt0aHJvd1wiQVNOLjEgbGVuZ3RoIHRvbyBsb25nIHRvIHJlcHJlc2VudCBieSA4eDogbiA9IFwiK2kudG9TdHJpbmcoMTYpfXZhciBmPTEyOCtnO3JldHVybiBmLnRvU3RyaW5nKDE2KStofX07dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7aWYodGhpcy5oVExWPT1udWxsfHx0aGlzLmlzTW9kaWZpZWQpe3RoaXMuaFY9dGhpcy5nZXRGcmVzaFZhbHVlSGV4KCk7dGhpcy5oTD10aGlzLmdldExlbmd0aEhleEZyb21WYWx1ZSgpO3RoaXMuaFRMVj10aGlzLmhUK3RoaXMuaEwrdGhpcy5oVjt0aGlzLmlzTW9kaWZpZWQ9ZmFsc2V9cmV0dXJuIHRoaXMuaFRMVn07dGhpcy5nZXRWYWx1ZUhleD1mdW5jdGlvbigpe3RoaXMuZ2V0RW5jb2RlZEhleCgpO3JldHVybiB0aGlzLmhWfTt0aGlzLmdldEZyZXNoVmFsdWVIZXg9ZnVuY3Rpb24oKXtyZXR1cm5cIlwifX07S0pVUi5hc24xLkRFUkFic3RyYWN0U3RyaW5nPWZ1bmN0aW9uKGMpe0tKVVIuYXNuMS5ERVJBYnN0cmFjdFN0cmluZy5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGI9bnVsbDt2YXIgYT1udWxsO3RoaXMuZ2V0U3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc307dGhpcy5zZXRTdHJpbmc9ZnVuY3Rpb24oZCl7dGhpcy5oVExWPW51bGw7dGhpcy5pc01vZGlmaWVkPXRydWU7dGhpcy5zPWQ7dGhpcy5oVj1zdG9oZXgodGhpcy5zKX07dGhpcy5zZXRTdHJpbmdIZXg9ZnVuY3Rpb24oZCl7dGhpcy5oVExWPW51bGw7dGhpcy5pc01vZGlmaWVkPXRydWU7dGhpcy5zPW51bGw7dGhpcy5oVj1kfTt0aGlzLmdldEZyZXNoVmFsdWVIZXg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oVn07aWYodHlwZW9mIGMhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBjPT1cInN0cmluZ1wiKXt0aGlzLnNldFN0cmluZyhjKX1lbHNle2lmKHR5cGVvZiBjLnN0ciE9XCJ1bmRlZmluZWRcIil7dGhpcy5zZXRTdHJpbmcoYy5zdHIpfWVsc2V7aWYodHlwZW9mIGMuaGV4IT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldFN0cmluZ0hleChjLmhleCl9fX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVSQWJzdHJhY3RTdHJpbmcsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS5ERVJBYnN0cmFjdFRpbWU9ZnVuY3Rpb24oYyl7S0pVUi5hc24xLkRFUkFic3RyYWN0VGltZS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGI9bnVsbDt2YXIgYT1udWxsO3RoaXMubG9jYWxEYXRlVG9VVEM9ZnVuY3Rpb24oZil7dXRjPWYuZ2V0VGltZSgpKyhmLmdldFRpbWV6b25lT2Zmc2V0KCkqNjAwMDApO3ZhciBlPW5ldyBEYXRlKHV0Yyk7cmV0dXJuIGV9O3RoaXMuZm9ybWF0RGF0ZT1mdW5jdGlvbihtLG8sZSl7dmFyIGc9dGhpcy56ZXJvUGFkZGluZzt2YXIgbj10aGlzLmxvY2FsRGF0ZVRvVVRDKG0pO3ZhciBwPVN0cmluZyhuLmdldEZ1bGxZZWFyKCkpO2lmKG89PVwidXRjXCIpe3A9cC5zdWJzdHIoMiwyKX12YXIgbD1nKFN0cmluZyhuLmdldE1vbnRoKCkrMSksMik7dmFyIHE9ZyhTdHJpbmcobi5nZXREYXRlKCkpLDIpO3ZhciBoPWcoU3RyaW5nKG4uZ2V0SG91cnMoKSksMik7dmFyIGk9ZyhTdHJpbmcobi5nZXRNaW51dGVzKCkpLDIpO3ZhciBqPWcoU3RyaW5nKG4uZ2V0U2Vjb25kcygpKSwyKTt2YXIgcj1wK2wrcStoK2krajtpZihlPT09dHJ1ZSl7dmFyIGY9bi5nZXRNaWxsaXNlY29uZHMoKTtpZihmIT0wKXt2YXIgaz1nKFN0cmluZyhmKSwzKTtrPWsucmVwbGFjZSgvWzBdKyQvLFwiXCIpO3I9citcIi5cIitrfX1yZXR1cm4gcitcIlpcIn07dGhpcy56ZXJvUGFkZGluZz1mdW5jdGlvbihlLGQpe2lmKGUubGVuZ3RoPj1kKXtyZXR1cm4gZX1yZXR1cm4gbmV3IEFycmF5KGQtZS5sZW5ndGgrMSkuam9pbihcIjBcIikrZX07dGhpcy5nZXRTdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zfTt0aGlzLnNldFN0cmluZz1mdW5jdGlvbihkKXt0aGlzLmhUTFY9bnVsbDt0aGlzLmlzTW9kaWZpZWQ9dHJ1ZTt0aGlzLnM9ZDt0aGlzLmhWPXN0b2hleChkKX07dGhpcy5zZXRCeURhdGVWYWx1ZT1mdW5jdGlvbihoLGosZSxkLGYsZyl7dmFyIGk9bmV3IERhdGUoRGF0ZS5VVEMoaCxqLTEsZSxkLGYsZywwKSk7dGhpcy5zZXRCeURhdGUoaSl9O3RoaXMuZ2V0RnJlc2hWYWx1ZUhleD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmhWfX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLkRFUkFic3RyYWN0VGltZSxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLkRFUkFic3RyYWN0U3RydWN0dXJlZD1mdW5jdGlvbihiKXtLSlVSLmFzbjEuREVSQWJzdHJhY3RTdHJpbmcuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBhPW51bGw7dGhpcy5zZXRCeUFTTjFPYmplY3RBcnJheT1mdW5jdGlvbihjKXt0aGlzLmhUTFY9bnVsbDt0aGlzLmlzTW9kaWZpZWQ9dHJ1ZTt0aGlzLmFzbjFBcnJheT1jfTt0aGlzLmFwcGVuZEFTTjFPYmplY3Q9ZnVuY3Rpb24oYyl7dGhpcy5oVExWPW51bGw7dGhpcy5pc01vZGlmaWVkPXRydWU7dGhpcy5hc24xQXJyYXkucHVzaChjKX07dGhpcy5hc24xQXJyYXk9bmV3IEFycmF5KCk7aWYodHlwZW9mIGIhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBiLmFycmF5IT1cInVuZGVmaW5lZFwiKXt0aGlzLmFzbjFBcnJheT1iLmFycmF5fX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5ERVJBYnN0cmFjdFN0cnVjdHVyZWQsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS5ERVJCb29sZWFuPWZ1bmN0aW9uKCl7S0pVUi5hc24xLkRFUkJvb2xlYW4uc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3RoaXMuaFQ9XCIwMVwiO3RoaXMuaFRMVj1cIjAxMDFmZlwifTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVSQm9vbGVhbixLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLkRFUkludGVnZXI9ZnVuY3Rpb24oYSl7S0pVUi5hc24xLkRFUkludGVnZXIuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3RoaXMuaFQ9XCIwMlwiO3RoaXMuc2V0QnlCaWdJbnRlZ2VyPWZ1bmN0aW9uKGIpe3RoaXMuaFRMVj1udWxsO3RoaXMuaXNNb2RpZmllZD10cnVlO3RoaXMuaFY9S0pVUi5hc24xLkFTTjFVdGlsLmJpZ0ludFRvTWluVHdvc0NvbXBsZW1lbnRzSGV4KGIpfTt0aGlzLnNldEJ5SW50ZWdlcj1mdW5jdGlvbihjKXt2YXIgYj1uZXcgQmlnSW50ZWdlcihTdHJpbmcoYyksMTApO3RoaXMuc2V0QnlCaWdJbnRlZ2VyKGIpfTt0aGlzLnNldFZhbHVlSGV4PWZ1bmN0aW9uKGIpe3RoaXMuaFY9Yn07dGhpcy5nZXRGcmVzaFZhbHVlSGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaFZ9O2lmKHR5cGVvZiBhIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYS5iaWdpbnQhPVwidW5kZWZpbmVkXCIpe3RoaXMuc2V0QnlCaWdJbnRlZ2VyKGEuYmlnaW50KX1lbHNle2lmKHR5cGVvZiBhW1wiaW50XCJdIT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldEJ5SW50ZWdlcihhW1wiaW50XCJdKX1lbHNle2lmKHR5cGVvZiBhPT1cIm51bWJlclwiKXt0aGlzLnNldEJ5SW50ZWdlcihhKX1lbHNle2lmKHR5cGVvZiBhLmhleCE9XCJ1bmRlZmluZWRcIil7dGhpcy5zZXRWYWx1ZUhleChhLmhleCl9fX19fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLkRFUkludGVnZXIsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS5ERVJCaXRTdHJpbmc9ZnVuY3Rpb24oYSl7S0pVUi5hc24xLkRFUkJpdFN0cmluZy5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dGhpcy5oVD1cIjAzXCI7dGhpcy5zZXRIZXhWYWx1ZUluY2x1ZGluZ1VudXNlZEJpdHM9ZnVuY3Rpb24oYil7dGhpcy5oVExWPW51bGw7dGhpcy5pc01vZGlmaWVkPXRydWU7dGhpcy5oVj1ifTt0aGlzLnNldFVudXNlZEJpdHNBbmRIZXhWYWx1ZT1mdW5jdGlvbihiLGQpe2lmKGI8MHx8NzxiKXt0aHJvd1widW51c2VkIGJpdHMgc2hhbGwgYmUgZnJvbSAwIHRvIDc6IHUgPSBcIitifXZhciBjPVwiMFwiK2I7dGhpcy5oVExWPW51bGw7dGhpcy5pc01vZGlmaWVkPXRydWU7dGhpcy5oVj1jK2R9O3RoaXMuc2V0QnlCaW5hcnlTdHJpbmc9ZnVuY3Rpb24oZSl7ZT1lLnJlcGxhY2UoLzArJC8sXCJcIik7dmFyIGY9OC1lLmxlbmd0aCU4O2lmKGY9PTgpe2Y9MH1mb3IodmFyIGc9MDtnPD1mO2crKyl7ZSs9XCIwXCJ9dmFyIGo9XCJcIjtmb3IodmFyIGc9MDtnPGUubGVuZ3RoLTE7Zys9OCl7dmFyIGQ9ZS5zdWJzdHIoZyw4KTt2YXIgYz1wYXJzZUludChkLDIpLnRvU3RyaW5nKDE2KTtpZihjLmxlbmd0aD09MSl7Yz1cIjBcIitjfWorPWN9dGhpcy5oVExWPW51bGw7dGhpcy5pc01vZGlmaWVkPXRydWU7dGhpcy5oVj1cIjBcIitmK2p9O3RoaXMuc2V0QnlCb29sZWFuQXJyYXk9ZnVuY3Rpb24oZCl7dmFyIGM9XCJcIjtmb3IodmFyIGI9MDtiPGQubGVuZ3RoO2IrKyl7aWYoZFtiXT09dHJ1ZSl7Yys9XCIxXCJ9ZWxzZXtjKz1cIjBcIn19dGhpcy5zZXRCeUJpbmFyeVN0cmluZyhjKX07dGhpcy5uZXdGYWxzZUFycmF5PWZ1bmN0aW9uKGQpe3ZhciBiPW5ldyBBcnJheShkKTtmb3IodmFyIGM9MDtjPGQ7YysrKXtiW2NdPWZhbHNlfXJldHVybiBifTt0aGlzLmdldEZyZXNoVmFsdWVIZXg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oVn07aWYodHlwZW9mIGEhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBhPT1cInN0cmluZ1wiJiZhLnRvTG93ZXJDYXNlKCkubWF0Y2goL15bMC05YS1mXSskLykpe3RoaXMuc2V0SGV4VmFsdWVJbmNsdWRpbmdVbnVzZWRCaXRzKGEpfWVsc2V7aWYodHlwZW9mIGEuaGV4IT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldEhleFZhbHVlSW5jbHVkaW5nVW51c2VkQml0cyhhLmhleCl9ZWxzZXtpZih0eXBlb2YgYS5iaW4hPVwidW5kZWZpbmVkXCIpe3RoaXMuc2V0QnlCaW5hcnlTdHJpbmcoYS5iaW4pfWVsc2V7aWYodHlwZW9mIGEuYXJyYXkhPVwidW5kZWZpbmVkXCIpe3RoaXMuc2V0QnlCb29sZWFuQXJyYXkoYS5hcnJheSl9fX19fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLkRFUkJpdFN0cmluZyxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLkRFUk9jdGV0U3RyaW5nPWZ1bmN0aW9uKGEpe0tKVVIuYXNuMS5ERVJPY3RldFN0cmluZy5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxhKTt0aGlzLmhUPVwiMDRcIn07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLkRFUk9jdGV0U3RyaW5nLEtKVVIuYXNuMS5ERVJBYnN0cmFjdFN0cmluZyk7S0pVUi5hc24xLkRFUk51bGw9ZnVuY3Rpb24oKXtLSlVSLmFzbjEuREVSTnVsbC5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dGhpcy5oVD1cIjA1XCI7dGhpcy5oVExWPVwiMDUwMFwifTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVSTnVsbCxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLkRFUk9iamVjdElkZW50aWZpZXI9ZnVuY3Rpb24oYyl7dmFyIGI9ZnVuY3Rpb24oZCl7dmFyIGU9ZC50b1N0cmluZygxNik7aWYoZS5sZW5ndGg9PTEpe2U9XCIwXCIrZX1yZXR1cm4gZX07dmFyIGE9ZnVuY3Rpb24oayl7dmFyIGo9XCJcIjt2YXIgZT1uZXcgQmlnSW50ZWdlcihrLDEwKTt2YXIgZD1lLnRvU3RyaW5nKDIpO3ZhciBmPTctZC5sZW5ndGglNztpZihmPT03KXtmPTB9dmFyIG09XCJcIjtmb3IodmFyIGc9MDtnPGY7ZysrKXttKz1cIjBcIn1kPW0rZDtmb3IodmFyIGc9MDtnPGQubGVuZ3RoLTE7Zys9Nyl7dmFyIGw9ZC5zdWJzdHIoZyw3KTtpZihnIT1kLmxlbmd0aC03KXtsPVwiMVwiK2x9ais9YihwYXJzZUludChsLDIpKX1yZXR1cm4gan07S0pVUi5hc24xLkRFUk9iamVjdElkZW50aWZpZXIuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3RoaXMuaFQ9XCIwNlwiO3RoaXMuc2V0VmFsdWVIZXg9ZnVuY3Rpb24oZCl7dGhpcy5oVExWPW51bGw7dGhpcy5pc01vZGlmaWVkPXRydWU7dGhpcy5zPW51bGw7dGhpcy5oVj1kfTt0aGlzLnNldFZhbHVlT2lkU3RyaW5nPWZ1bmN0aW9uKGYpe2lmKCFmLm1hdGNoKC9eWzAtOS5dKyQvKSl7dGhyb3dcIm1hbGZvcm1lZCBvaWQgc3RyaW5nOiBcIitmfXZhciBnPVwiXCI7dmFyIGQ9Zi5zcGxpdChcIi5cIik7dmFyIGo9cGFyc2VJbnQoZFswXSkqNDArcGFyc2VJbnQoZFsxXSk7Zys9YihqKTtkLnNwbGljZSgwLDIpO2Zvcih2YXIgZT0wO2U8ZC5sZW5ndGg7ZSsrKXtnKz1hKGRbZV0pfXRoaXMuaFRMVj1udWxsO3RoaXMuaXNNb2RpZmllZD10cnVlO3RoaXMucz1udWxsO3RoaXMuaFY9Z307dGhpcy5zZXRWYWx1ZU5hbWU9ZnVuY3Rpb24oZSl7aWYodHlwZW9mIEtKVVIuYXNuMS54NTA5Lk9JRC5uYW1lMm9pZExpc3RbZV0hPVwidW5kZWZpbmVkXCIpe3ZhciBkPUtKVVIuYXNuMS54NTA5Lk9JRC5uYW1lMm9pZExpc3RbZV07dGhpcy5zZXRWYWx1ZU9pZFN0cmluZyhkKX1lbHNle3Rocm93XCJERVJPYmplY3RJZGVudGlmaWVyIG9pZE5hbWUgdW5kZWZpbmVkOiBcIitlfX07dGhpcy5nZXRGcmVzaFZhbHVlSGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaFZ9O2lmKHR5cGVvZiBjIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYz09XCJzdHJpbmdcIiYmYy5tYXRjaCgvXlswLTJdLlswLTkuXSskLykpe3RoaXMuc2V0VmFsdWVPaWRTdHJpbmcoYyl9ZWxzZXtpZihLSlVSLmFzbjEueDUwOS5PSUQubmFtZTJvaWRMaXN0W2NdIT09dW5kZWZpbmVkKXt0aGlzLnNldFZhbHVlT2lkU3RyaW5nKEtKVVIuYXNuMS54NTA5Lk9JRC5uYW1lMm9pZExpc3RbY10pfWVsc2V7aWYodHlwZW9mIGMub2lkIT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldFZhbHVlT2lkU3RyaW5nKGMub2lkKX1lbHNle2lmKHR5cGVvZiBjLmhleCE9XCJ1bmRlZmluZWRcIil7dGhpcy5zZXRWYWx1ZUhleChjLmhleCl9ZWxzZXtpZih0eXBlb2YgYy5uYW1lIT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldFZhbHVlTmFtZShjLm5hbWUpfX19fX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVST2JqZWN0SWRlbnRpZmllcixLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLkRFUkVudW1lcmF0ZWQ9ZnVuY3Rpb24oYSl7S0pVUi5hc24xLkRFUkVudW1lcmF0ZWQuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3RoaXMuaFQ9XCIwYVwiO3RoaXMuc2V0QnlCaWdJbnRlZ2VyPWZ1bmN0aW9uKGIpe3RoaXMuaFRMVj1udWxsO3RoaXMuaXNNb2RpZmllZD10cnVlO3RoaXMuaFY9S0pVUi5hc24xLkFTTjFVdGlsLmJpZ0ludFRvTWluVHdvc0NvbXBsZW1lbnRzSGV4KGIpfTt0aGlzLnNldEJ5SW50ZWdlcj1mdW5jdGlvbihjKXt2YXIgYj1uZXcgQmlnSW50ZWdlcihTdHJpbmcoYyksMTApO3RoaXMuc2V0QnlCaWdJbnRlZ2VyKGIpfTt0aGlzLnNldFZhbHVlSGV4PWZ1bmN0aW9uKGIpe3RoaXMuaFY9Yn07dGhpcy5nZXRGcmVzaFZhbHVlSGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaFZ9O2lmKHR5cGVvZiBhIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYVtcImludFwiXSE9XCJ1bmRlZmluZWRcIil7dGhpcy5zZXRCeUludGVnZXIoYVtcImludFwiXSl9ZWxzZXtpZih0eXBlb2YgYT09XCJudW1iZXJcIil7dGhpcy5zZXRCeUludGVnZXIoYSl9ZWxzZXtpZih0eXBlb2YgYS5oZXghPVwidW5kZWZpbmVkXCIpe3RoaXMuc2V0VmFsdWVIZXgoYS5oZXgpfX19fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLkRFUkVudW1lcmF0ZWQsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS5ERVJVVEY4U3RyaW5nPWZ1bmN0aW9uKGEpe0tKVVIuYXNuMS5ERVJVVEY4U3RyaW5nLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLGEpO3RoaXMuaFQ9XCIwY1wifTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVSVVRGOFN0cmluZyxLSlVSLmFzbjEuREVSQWJzdHJhY3RTdHJpbmcpO0tKVVIuYXNuMS5ERVJOdW1lcmljU3RyaW5nPWZ1bmN0aW9uKGEpe0tKVVIuYXNuMS5ERVJOdW1lcmljU3RyaW5nLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLGEpO3RoaXMuaFQ9XCIxMlwifTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVSTnVtZXJpY1N0cmluZyxLSlVSLmFzbjEuREVSQWJzdHJhY3RTdHJpbmcpO0tKVVIuYXNuMS5ERVJQcmludGFibGVTdHJpbmc9ZnVuY3Rpb24oYSl7S0pVUi5hc24xLkRFUlByaW50YWJsZVN0cmluZy5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxhKTt0aGlzLmhUPVwiMTNcIn07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLkRFUlByaW50YWJsZVN0cmluZyxLSlVSLmFzbjEuREVSQWJzdHJhY3RTdHJpbmcpO0tKVVIuYXNuMS5ERVJUZWxldGV4U3RyaW5nPWZ1bmN0aW9uKGEpe0tKVVIuYXNuMS5ERVJUZWxldGV4U3RyaW5nLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLGEpO3RoaXMuaFQ9XCIxNFwifTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVSVGVsZXRleFN0cmluZyxLSlVSLmFzbjEuREVSQWJzdHJhY3RTdHJpbmcpO0tKVVIuYXNuMS5ERVJJQTVTdHJpbmc9ZnVuY3Rpb24oYSl7S0pVUi5hc24xLkRFUklBNVN0cmluZy5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxhKTt0aGlzLmhUPVwiMTZcIn07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLkRFUklBNVN0cmluZyxLSlVSLmFzbjEuREVSQWJzdHJhY3RTdHJpbmcpO0tKVVIuYXNuMS5ERVJVVENUaW1lPWZ1bmN0aW9uKGEpe0tKVVIuYXNuMS5ERVJVVENUaW1lLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLGEpO3RoaXMuaFQ9XCIxN1wiO3RoaXMuc2V0QnlEYXRlPWZ1bmN0aW9uKGIpe3RoaXMuaFRMVj1udWxsO3RoaXMuaXNNb2RpZmllZD10cnVlO3RoaXMuZGF0ZT1iO3RoaXMucz10aGlzLmZvcm1hdERhdGUodGhpcy5kYXRlLFwidXRjXCIpO3RoaXMuaFY9c3RvaGV4KHRoaXMucyl9O3RoaXMuZ2V0RnJlc2hWYWx1ZUhleD1mdW5jdGlvbigpe2lmKHR5cGVvZiB0aGlzLmRhdGU9PVwidW5kZWZpbmVkXCImJnR5cGVvZiB0aGlzLnM9PVwidW5kZWZpbmVkXCIpe3RoaXMuZGF0ZT1uZXcgRGF0ZSgpO3RoaXMucz10aGlzLmZvcm1hdERhdGUodGhpcy5kYXRlLFwidXRjXCIpO3RoaXMuaFY9c3RvaGV4KHRoaXMucyl9cmV0dXJuIHRoaXMuaFZ9O2lmKGEhPT11bmRlZmluZWQpe2lmKGEuc3RyIT09dW5kZWZpbmVkKXt0aGlzLnNldFN0cmluZyhhLnN0cil9ZWxzZXtpZih0eXBlb2YgYT09XCJzdHJpbmdcIiYmYS5tYXRjaCgvXlswLTldezEyfVokLykpe3RoaXMuc2V0U3RyaW5nKGEpfWVsc2V7aWYoYS5oZXghPT11bmRlZmluZWQpe3RoaXMuc2V0U3RyaW5nSGV4KGEuaGV4KX1lbHNle2lmKGEuZGF0ZSE9PXVuZGVmaW5lZCl7dGhpcy5zZXRCeURhdGUoYS5kYXRlKX19fX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVSVVRDVGltZSxLSlVSLmFzbjEuREVSQWJzdHJhY3RUaW1lKTtLSlVSLmFzbjEuREVSR2VuZXJhbGl6ZWRUaW1lPWZ1bmN0aW9uKGEpe0tKVVIuYXNuMS5ERVJHZW5lcmFsaXplZFRpbWUuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsYSk7dGhpcy5oVD1cIjE4XCI7dGhpcy53aXRoTWlsbGlzPWZhbHNlO3RoaXMuc2V0QnlEYXRlPWZ1bmN0aW9uKGIpe3RoaXMuaFRMVj1udWxsO3RoaXMuaXNNb2RpZmllZD10cnVlO3RoaXMuZGF0ZT1iO3RoaXMucz10aGlzLmZvcm1hdERhdGUodGhpcy5kYXRlLFwiZ2VuXCIsdGhpcy53aXRoTWlsbGlzKTt0aGlzLmhWPXN0b2hleCh0aGlzLnMpfTt0aGlzLmdldEZyZXNoVmFsdWVIZXg9ZnVuY3Rpb24oKXtpZih0aGlzLmRhdGU9PT11bmRlZmluZWQmJnRoaXMucz09PXVuZGVmaW5lZCl7dGhpcy5kYXRlPW5ldyBEYXRlKCk7dGhpcy5zPXRoaXMuZm9ybWF0RGF0ZSh0aGlzLmRhdGUsXCJnZW5cIix0aGlzLndpdGhNaWxsaXMpO3RoaXMuaFY9c3RvaGV4KHRoaXMucyl9cmV0dXJuIHRoaXMuaFZ9O2lmKGEhPT11bmRlZmluZWQpe2lmKGEuc3RyIT09dW5kZWZpbmVkKXt0aGlzLnNldFN0cmluZyhhLnN0cil9ZWxzZXtpZih0eXBlb2YgYT09XCJzdHJpbmdcIiYmYS5tYXRjaCgvXlswLTldezE0fVokLykpe3RoaXMuc2V0U3RyaW5nKGEpfWVsc2V7aWYoYS5oZXghPT11bmRlZmluZWQpe3RoaXMuc2V0U3RyaW5nSGV4KGEuaGV4KX1lbHNle2lmKGEuZGF0ZSE9PXVuZGVmaW5lZCl7dGhpcy5zZXRCeURhdGUoYS5kYXRlKX19fX1pZihhLm1pbGxpcz09PXRydWUpe3RoaXMud2l0aE1pbGxpcz10cnVlfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5ERVJHZW5lcmFsaXplZFRpbWUsS0pVUi5hc24xLkRFUkFic3RyYWN0VGltZSk7S0pVUi5hc24xLkRFUlNlcXVlbmNlPWZ1bmN0aW9uKGEpe0tKVVIuYXNuMS5ERVJTZXF1ZW5jZS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxhKTt0aGlzLmhUPVwiMzBcIjt0aGlzLmdldEZyZXNoVmFsdWVIZXg9ZnVuY3Rpb24oKXt2YXIgYz1cIlwiO2Zvcih2YXIgYj0wO2I8dGhpcy5hc24xQXJyYXkubGVuZ3RoO2IrKyl7dmFyIGQ9dGhpcy5hc24xQXJyYXlbYl07Yys9ZC5nZXRFbmNvZGVkSGV4KCl9dGhpcy5oVj1jO3JldHVybiB0aGlzLmhWfX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLkRFUlNlcXVlbmNlLEtKVVIuYXNuMS5ERVJBYnN0cmFjdFN0cnVjdHVyZWQpO0tKVVIuYXNuMS5ERVJTZXQ9ZnVuY3Rpb24oYSl7S0pVUi5hc24xLkRFUlNldC5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxhKTt0aGlzLmhUPVwiMzFcIjt0aGlzLnNvcnRGbGFnPXRydWU7dGhpcy5nZXRGcmVzaFZhbHVlSGV4PWZ1bmN0aW9uKCl7dmFyIGI9bmV3IEFycmF5KCk7Zm9yKHZhciBjPTA7Yzx0aGlzLmFzbjFBcnJheS5sZW5ndGg7YysrKXt2YXIgZD10aGlzLmFzbjFBcnJheVtjXTtiLnB1c2goZC5nZXRFbmNvZGVkSGV4KCkpfWlmKHRoaXMuc29ydEZsYWc9PXRydWUpe2Iuc29ydCgpfXRoaXMuaFY9Yi5qb2luKFwiXCIpO3JldHVybiB0aGlzLmhWfTtpZih0eXBlb2YgYSE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGEuc29ydGZsYWchPVwidW5kZWZpbmVkXCImJmEuc29ydGZsYWc9PWZhbHNlKXt0aGlzLnNvcnRGbGFnPWZhbHNlfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5ERVJTZXQsS0pVUi5hc24xLkRFUkFic3RyYWN0U3RydWN0dXJlZCk7S0pVUi5hc24xLkRFUlRhZ2dlZE9iamVjdD1mdW5jdGlvbihhKXtLSlVSLmFzbjEuREVSVGFnZ2VkT2JqZWN0LnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt0aGlzLmhUPVwiYTBcIjt0aGlzLmhWPVwiXCI7dGhpcy5pc0V4cGxpY2l0PXRydWU7dGhpcy5hc24xT2JqZWN0PW51bGw7dGhpcy5zZXRBU04xT2JqZWN0PWZ1bmN0aW9uKGIsYyxkKXt0aGlzLmhUPWM7dGhpcy5pc0V4cGxpY2l0PWI7dGhpcy5hc24xT2JqZWN0PWQ7aWYodGhpcy5pc0V4cGxpY2l0KXt0aGlzLmhWPXRoaXMuYXNuMU9iamVjdC5nZXRFbmNvZGVkSGV4KCk7dGhpcy5oVExWPW51bGw7dGhpcy5pc01vZGlmaWVkPXRydWV9ZWxzZXt0aGlzLmhWPW51bGw7dGhpcy5oVExWPWQuZ2V0RW5jb2RlZEhleCgpO3RoaXMuaFRMVj10aGlzLmhUTFYucmVwbGFjZSgvXi4uLyxjKTt0aGlzLmlzTW9kaWZpZWQ9ZmFsc2V9fTt0aGlzLmdldEZyZXNoVmFsdWVIZXg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oVn07aWYodHlwZW9mIGEhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBhLnRhZyE9XCJ1bmRlZmluZWRcIil7dGhpcy5oVD1hLnRhZ31pZih0eXBlb2YgYS5leHBsaWNpdCE9XCJ1bmRlZmluZWRcIil7dGhpcy5pc0V4cGxpY2l0PWEuZXhwbGljaXR9aWYodHlwZW9mIGEub2JqIT1cInVuZGVmaW5lZFwiKXt0aGlzLmFzbjFPYmplY3Q9YS5vYmo7dGhpcy5zZXRBU04xT2JqZWN0KHRoaXMuaXNFeHBsaWNpdCx0aGlzLmhULHRoaXMuYXNuMU9iamVjdCl9fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLkRFUlRhZ2dlZE9iamVjdCxLSlVSLmFzbjEuQVNOMU9iamVjdCk7XG4vKiEgYXNuMWhleC0xLjEuNi5qcyAoYykgMjAxMi0yMDE1IEtlbmppIFVydXNoaW1hIHwga2p1ci5naXRodWIuY29tL2pzcnNhc2lnbi9saWNlbnNlXG4gKi9cbnZhciBBU04xSEVYPW5ldyBmdW5jdGlvbigpe3RoaXMuZ2V0Qnl0ZUxlbmd0aE9mTF9BdE9iaj1mdW5jdGlvbihiLGMpe2lmKGIuc3Vic3RyaW5nKGMrMixjKzMpIT1cIjhcIil7cmV0dXJuIDF9dmFyIGE9cGFyc2VJbnQoYi5zdWJzdHJpbmcoYyszLGMrNCkpO2lmKGE9PTApe3JldHVybiAtMX1pZigwPGEmJmE8MTApe3JldHVybiBhKzF9cmV0dXJuIC0yfTt0aGlzLmdldEhleE9mTF9BdE9iaj1mdW5jdGlvbihiLGMpe3ZhciBhPXRoaXMuZ2V0Qnl0ZUxlbmd0aE9mTF9BdE9iaihiLGMpO2lmKGE8MSl7cmV0dXJuXCJcIn1yZXR1cm4gYi5zdWJzdHJpbmcoYysyLGMrMithKjIpfTt0aGlzLmdldEludE9mTF9BdE9iaj1mdW5jdGlvbihjLGQpe3ZhciBiPXRoaXMuZ2V0SGV4T2ZMX0F0T2JqKGMsZCk7aWYoYj09XCJcIil7cmV0dXJuIC0xfXZhciBhO2lmKHBhcnNlSW50KGIuc3Vic3RyaW5nKDAsMSkpPDgpe2E9bmV3IEJpZ0ludGVnZXIoYiwxNil9ZWxzZXthPW5ldyBCaWdJbnRlZ2VyKGIuc3Vic3RyaW5nKDIpLDE2KX1yZXR1cm4gYS5pbnRWYWx1ZSgpfTt0aGlzLmdldFN0YXJ0UG9zT2ZWX0F0T2JqPWZ1bmN0aW9uKGIsYyl7dmFyIGE9dGhpcy5nZXRCeXRlTGVuZ3RoT2ZMX0F0T2JqKGIsYyk7aWYoYTwwKXtyZXR1cm4gYX1yZXR1cm4gYysoYSsxKSoyfTt0aGlzLmdldEhleE9mVl9BdE9iaj1mdW5jdGlvbihjLGQpe3ZhciBiPXRoaXMuZ2V0U3RhcnRQb3NPZlZfQXRPYmooYyxkKTt2YXIgYT10aGlzLmdldEludE9mTF9BdE9iaihjLGQpO3JldHVybiBjLnN1YnN0cmluZyhiLGIrYSoyKX07dGhpcy5nZXRIZXhPZlRMVl9BdE9iaj1mdW5jdGlvbihjLGUpe3ZhciBiPWMuc3Vic3RyKGUsMik7dmFyIGQ9dGhpcy5nZXRIZXhPZkxfQXRPYmooYyxlKTt2YXIgYT10aGlzLmdldEhleE9mVl9BdE9iaihjLGUpO3JldHVybiBiK2QrYX07dGhpcy5nZXRQb3NPZk5leHRTaWJsaW5nX0F0T2JqPWZ1bmN0aW9uKGMsZCl7dmFyIGI9dGhpcy5nZXRTdGFydFBvc09mVl9BdE9iaihjLGQpO3ZhciBhPXRoaXMuZ2V0SW50T2ZMX0F0T2JqKGMsZCk7cmV0dXJuIGIrYSoyfTt0aGlzLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaj1mdW5jdGlvbihmLGope3ZhciBjPW5ldyBBcnJheSgpO3ZhciBpPXRoaXMuZ2V0U3RhcnRQb3NPZlZfQXRPYmooZixqKTtjLnB1c2goaSk7dmFyIGI9dGhpcy5nZXRJbnRPZkxfQXRPYmooZixqKTt2YXIgZz1pO3ZhciBkPTA7d2hpbGUoMSl7dmFyIGU9dGhpcy5nZXRQb3NPZk5leHRTaWJsaW5nX0F0T2JqKGYsZyk7aWYoZT09bnVsbHx8KGUtaT49KGIqMikpKXticmVha31pZihkPj0yMDApe2JyZWFrfWMucHVzaChlKTtnPWU7ZCsrfXJldHVybiBjfTt0aGlzLmdldE50aENoaWxkSW5kZXhfQXRPYmo9ZnVuY3Rpb24oZCxiLGUpe3ZhciBjPXRoaXMuZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGQsYik7cmV0dXJuIGNbZV19O3RoaXMuZ2V0RGVjZW5kYW50SW5kZXhCeU50aExpc3Q9ZnVuY3Rpb24oZSxkLGMpe2lmKGMubGVuZ3RoPT0wKXtyZXR1cm4gZH12YXIgZj1jLnNoaWZ0KCk7dmFyIGI9dGhpcy5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooZSxkKTtyZXR1cm4gdGhpcy5nZXREZWNlbmRhbnRJbmRleEJ5TnRoTGlzdChlLGJbZl0sYyl9O3RoaXMuZ2V0RGVjZW5kYW50SGV4VExWQnlOdGhMaXN0PWZ1bmN0aW9uKGQsYyxiKXt2YXIgYT10aGlzLmdldERlY2VuZGFudEluZGV4QnlOdGhMaXN0KGQsYyxiKTtyZXR1cm4gdGhpcy5nZXRIZXhPZlRMVl9BdE9iaihkLGEpfTt0aGlzLmdldERlY2VuZGFudEhleFZCeU50aExpc3Q9ZnVuY3Rpb24oZCxjLGIpe3ZhciBhPXRoaXMuZ2V0RGVjZW5kYW50SW5kZXhCeU50aExpc3QoZCxjLGIpO3JldHVybiB0aGlzLmdldEhleE9mVl9BdE9iaihkLGEpfX07QVNOMUhFWC5nZXRWYnlMaXN0PWZ1bmN0aW9uKGQsYyxiLGUpe3ZhciBhPXRoaXMuZ2V0RGVjZW5kYW50SW5kZXhCeU50aExpc3QoZCxjLGIpO2lmKGE9PT11bmRlZmluZWQpe3Rocm93XCJjYW4ndCBmaW5kIG50aExpc3Qgb2JqZWN0XCJ9aWYoZSE9PXVuZGVmaW5lZCl7aWYoZC5zdWJzdHIoYSwyKSE9ZSl7dGhyb3dcImNoZWNraW5nIHRhZyBkb2Vzbid0IG1hdGNoOiBcIitkLnN1YnN0cihhLDIpK1wiIT1cIitlfX1yZXR1cm4gdGhpcy5nZXRIZXhPZlZfQXRPYmooZCxhKX07QVNOMUhFWC5oZXh0b29pZHN0cj1mdW5jdGlvbihlKXt2YXIgaD1mdW5jdGlvbihiLGEpe2lmKGIubGVuZ3RoPj1hKXtyZXR1cm4gYn1yZXR1cm4gbmV3IEFycmF5KGEtYi5sZW5ndGgrMSkuam9pbihcIjBcIikrYn07dmFyIGw9W107dmFyIG89ZS5zdWJzdHIoMCwyKTt2YXIgZj1wYXJzZUludChvLDE2KTtsWzBdPW5ldyBTdHJpbmcoTWF0aC5mbG9vcihmLzQwKSk7bFsxXT1uZXcgU3RyaW5nKGYlNDApO3ZhciBtPWUuc3Vic3RyKDIpO3ZhciBrPVtdO2Zvcih2YXIgZz0wO2c8bS5sZW5ndGgvMjtnKyspe2sucHVzaChwYXJzZUludChtLnN1YnN0cihnKjIsMiksMTYpKX12YXIgaj1bXTt2YXIgZD1cIlwiO2Zvcih2YXIgZz0wO2c8ay5sZW5ndGg7ZysrKXtpZihrW2ddJjEyOCl7ZD1kK2goKGtbZ10mMTI3KS50b1N0cmluZygyKSw3KX1lbHNle2Q9ZCtoKChrW2ddJjEyNykudG9TdHJpbmcoMiksNyk7ai5wdXNoKG5ldyBTdHJpbmcocGFyc2VJbnQoZCwyKSkpO2Q9XCJcIn19dmFyIG49bC5qb2luKFwiLlwiKTtpZihqLmxlbmd0aD4wKXtuPW4rXCIuXCIrai5qb2luKFwiLlwiKX1yZXR1cm4gbn07QVNOMUhFWC5kdW1wPWZ1bmN0aW9uKGUsYyxrLGcpe3ZhciBvPWZ1bmN0aW9uKHcsaSl7aWYody5sZW5ndGg8PWkqMil7cmV0dXJuIHd9ZWxzZXt2YXIgdj13LnN1YnN0cigwLGkpK1wiLi4odG90YWwgXCIrdy5sZW5ndGgvMitcImJ5dGVzKS4uXCIrdy5zdWJzdHIody5sZW5ndGgtaSxpKTtyZXR1cm4gdn19O2lmKGM9PT11bmRlZmluZWQpe2M9e29tbWl0X2xvbmdfb2N0ZXQ6MzJ9fWlmKGs9PT11bmRlZmluZWQpe2s9MH1pZihnPT09dW5kZWZpbmVkKXtnPVwiXCJ9dmFyIHI9Yy5vbW1pdF9sb25nX29jdGV0O2lmKGUuc3Vic3RyKGssMik9PVwiMDFcIil7dmFyIGg9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZSxrKTtpZihoPT1cIjAwXCIpe3JldHVybiBnK1wiQk9PTEVBTiBGQUxTRVxcblwifWVsc2V7cmV0dXJuIGcrXCJCT09MRUFOIFRSVUVcXG5cIn19aWYoZS5zdWJzdHIoaywyKT09XCIwMlwiKXt2YXIgaD1BU04xSEVYLmdldEhleE9mVl9BdE9iaihlLGspO3JldHVybiBnK1wiSU5URUdFUiBcIitvKGgscikrXCJcXG5cIn1pZihlLnN1YnN0cihrLDIpPT1cIjAzXCIpe3ZhciBoPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGUsayk7cmV0dXJuIGcrXCJCSVRTVFJJTkcgXCIrbyhoLHIpK1wiXFxuXCJ9aWYoZS5zdWJzdHIoaywyKT09XCIwNFwiKXt2YXIgaD1BU04xSEVYLmdldEhleE9mVl9BdE9iaihlLGspO2lmKEFTTjFIRVguaXNBU04xSEVYKGgpKXt2YXIgaj1nK1wiT0NURVRTVFJJTkcsIGVuY2Fwc3VsYXRlc1xcblwiO2o9aitBU04xSEVYLmR1bXAoaCxjLDAsZytcIiAgXCIpO3JldHVybiBqfWVsc2V7cmV0dXJuIGcrXCJPQ1RFVFNUUklORyBcIitvKGgscikrXCJcXG5cIn19aWYoZS5zdWJzdHIoaywyKT09XCIwNVwiKXtyZXR1cm4gZytcIk5VTExcXG5cIn1pZihlLnN1YnN0cihrLDIpPT1cIjA2XCIpe3ZhciBsPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGUsayk7dmFyIGE9S0pVUi5hc24xLkFTTjFVdGlsLm9pZEhleFRvSW50KGwpO3ZhciBuPUtKVVIuYXNuMS54NTA5Lk9JRC5vaWQybmFtZShhKTt2YXIgYj1hLnJlcGxhY2UoL1xcLi9nLFwiIFwiKTtpZihuIT1cIlwiKXtyZXR1cm4gZytcIk9iamVjdElkZW50aWZpZXIgXCIrbitcIiAoXCIrYitcIilcXG5cIn1lbHNle3JldHVybiBnK1wiT2JqZWN0SWRlbnRpZmllciAoXCIrYitcIilcXG5cIn19aWYoZS5zdWJzdHIoaywyKT09XCIwY1wiKXtyZXR1cm4gZytcIlVURjhTdHJpbmcgJ1wiK2hleHRvdXRmOChBU04xSEVYLmdldEhleE9mVl9BdE9iaihlLGspKStcIidcXG5cIn1pZihlLnN1YnN0cihrLDIpPT1cIjEzXCIpe3JldHVybiBnK1wiUHJpbnRhYmxlU3RyaW5nICdcIitoZXh0b3V0ZjgoQVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZSxrKSkrXCInXFxuXCJ9aWYoZS5zdWJzdHIoaywyKT09XCIxNFwiKXtyZXR1cm4gZytcIlRlbGV0ZXhTdHJpbmcgJ1wiK2hleHRvdXRmOChBU04xSEVYLmdldEhleE9mVl9BdE9iaihlLGspKStcIidcXG5cIn1pZihlLnN1YnN0cihrLDIpPT1cIjE2XCIpe3JldHVybiBnK1wiSUE1U3RyaW5nICdcIitoZXh0b3V0ZjgoQVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZSxrKSkrXCInXFxuXCJ9aWYoZS5zdWJzdHIoaywyKT09XCIxN1wiKXtyZXR1cm4gZytcIlVUQ1RpbWUgXCIraGV4dG91dGY4KEFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGUsaykpK1wiXFxuXCJ9aWYoZS5zdWJzdHIoaywyKT09XCIxOFwiKXtyZXR1cm4gZytcIkdlbmVyYWxpemVkVGltZSBcIitoZXh0b3V0ZjgoQVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZSxrKSkrXCJcXG5cIn1pZihlLnN1YnN0cihrLDIpPT1cIjMwXCIpe2lmKGUuc3Vic3RyKGssNCk9PVwiMzAwMFwiKXtyZXR1cm4gZytcIlNFUVVFTkNFIHt9XFxuXCJ9dmFyIGo9ZytcIlNFUVVFTkNFXFxuXCI7dmFyIGQ9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooZSxrKTt2YXIgZj1jO2lmKChkLmxlbmd0aD09Mnx8ZC5sZW5ndGg9PTMpJiZlLnN1YnN0cihkWzBdLDIpPT1cIjA2XCImJmUuc3Vic3RyKGRbZC5sZW5ndGgtMV0sMik9PVwiMDRcIil7dmFyIHQ9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZSxkWzBdKTt2YXIgYT1LSlVSLmFzbjEuQVNOMVV0aWwub2lkSGV4VG9JbnQodCk7dmFyIG49S0pVUi5hc24xLng1MDkuT0lELm9pZDJuYW1lKGEpO3ZhciBwPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoYykpO3AueDUwOUV4dE5hbWU9bjtmPXB9Zm9yKHZhciBxPTA7cTxkLmxlbmd0aDtxKyspe2o9aitBU04xSEVYLmR1bXAoZSxmLGRbcV0sZytcIiAgXCIpfXJldHVybiBqfWlmKGUuc3Vic3RyKGssMik9PVwiMzFcIil7dmFyIGo9ZytcIlNFVFxcblwiO3ZhciBkPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGUsayk7Zm9yKHZhciBxPTA7cTxkLmxlbmd0aDtxKyspe2o9aitBU04xSEVYLmR1bXAoZSxjLGRbcV0sZytcIiAgXCIpfXJldHVybiBqfXZhciB1PXBhcnNlSW50KGUuc3Vic3RyKGssMiksMTYpO2lmKCh1JjEyOCkhPTApe3ZhciBtPXUmMzE7aWYoKHUmMzIpIT0wKXt2YXIgaj1nK1wiW1wiK20rXCJdXFxuXCI7dmFyIGQ9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooZSxrKTtmb3IodmFyIHE9MDtxPGQubGVuZ3RoO3ErKyl7aj1qK0FTTjFIRVguZHVtcChlLGMsZFtxXSxnK1wiICBcIil9cmV0dXJuIGp9ZWxzZXt2YXIgaD1BU04xSEVYLmdldEhleE9mVl9BdE9iaihlLGspO2lmKGguc3Vic3RyKDAsOCk9PVwiNjg3NDc0NzBcIil7aD1oZXh0b3V0ZjgoaCl9aWYoYy54NTA5RXh0TmFtZT09PVwic3ViamVjdEFsdE5hbWVcIiYmbT09Mil7aD1oZXh0b3V0ZjgoaCl9dmFyIGo9ZytcIltcIittK1wiXSBcIitoK1wiXFxuXCI7cmV0dXJuIGp9fXJldHVybiBnK1wiVU5LTk9XTihcIitlLnN1YnN0cihrLDIpK1wiKSBcIitBU04xSEVYLmdldEhleE9mVl9BdE9iaihlLGspK1wiXFxuXCJ9O0FTTjFIRVguaXNBU04xSEVYPWZ1bmN0aW9uKGQpe2lmKGQubGVuZ3RoJTI9PTEpe3JldHVybiBmYWxzZX12YXIgYz1BU04xSEVYLmdldEludE9mTF9BdE9iaihkLDApO3ZhciBiPWQuc3Vic3RyKDAsMik7dmFyIGU9QVNOMUhFWC5nZXRIZXhPZkxfQXRPYmooZCwwKTt2YXIgYT1kLmxlbmd0aC1iLmxlbmd0aC1lLmxlbmd0aDtpZihhPT1jKjIpe3JldHVybiB0cnVlfXJldHVybiBmYWxzZX07XG4vKiEgYXNuMXg1MDktMS4wLjEzLmpzIChjKSAyMDEzLTIwMTUgS2VuamkgVXJ1c2hpbWEgfCBranVyLmdpdGh1Yi5jb20vanNyc2FzaWduL2xpY2Vuc2VcbiAqL1xuaWYodHlwZW9mIEtKVVI9PVwidW5kZWZpbmVkXCJ8fCFLSlVSKXtLSlVSPXt9fWlmKHR5cGVvZiBLSlVSLmFzbjE9PVwidW5kZWZpbmVkXCJ8fCFLSlVSLmFzbjEpe0tKVVIuYXNuMT17fX1pZih0eXBlb2YgS0pVUi5hc24xLng1MDk9PVwidW5kZWZpbmVkXCJ8fCFLSlVSLmFzbjEueDUwOSl7S0pVUi5hc24xLng1MDk9e319S0pVUi5hc24xLng1MDkuQ2VydGlmaWNhdGU9ZnVuY3Rpb24oZyl7S0pVUi5hc24xLng1MDkuQ2VydGlmaWNhdGUuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBiPW51bGw7dmFyIGQ9bnVsbDt2YXIgZj1udWxsO3ZhciBjPW51bGw7dmFyIGE9bnVsbDt2YXIgZT1udWxsO3RoaXMuc2V0UnNhUHJ2S2V5QnlQRU1hbmRQYXNzPWZ1bmN0aW9uKGksayl7dmFyIGg9UEtDUzVQS0VZLmdldERlY3J5cHRlZEtleUhleChpLGspO3ZhciBqPW5ldyBSU0FLZXkoKTtqLnJlYWRQcml2YXRlS2V5RnJvbUFTTjFIZXhTdHJpbmcoaCk7dGhpcy5wcnZLZXk9an07dGhpcy5zaWduPWZ1bmN0aW9uKCl7dGhpcy5hc24xU2lnbmF0dXJlQWxnPXRoaXMuYXNuMVRCU0NlcnQuYXNuMVNpZ25hdHVyZUFsZztzaWc9bmV3IEtKVVIuY3J5cHRvLlNpZ25hdHVyZSh7YWxnOlwiU0hBMXdpdGhSU0FcIn0pO3NpZy5pbml0KHRoaXMucHJ2S2V5KTtzaWcudXBkYXRlSGV4KHRoaXMuYXNuMVRCU0NlcnQuZ2V0RW5jb2RlZEhleCgpKTt0aGlzLmhleFNpZz1zaWcuc2lnbigpO3RoaXMuYXNuMVNpZz1uZXcgS0pVUi5hc24xLkRFUkJpdFN0cmluZyh7aGV4OlwiMDBcIit0aGlzLmhleFNpZ30pO3ZhciBoPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5Olt0aGlzLmFzbjFUQlNDZXJ0LHRoaXMuYXNuMVNpZ25hdHVyZUFsZyx0aGlzLmFzbjFTaWddfSk7dGhpcy5oVExWPWguZ2V0RW5jb2RlZEhleCgpO3RoaXMuaXNNb2RpZmllZD1mYWxzZX07dGhpcy5zZXRTaWduYXR1cmVIZXg9ZnVuY3Rpb24oaCl7dGhpcy5hc24xU2lnbmF0dXJlQWxnPXRoaXMuYXNuMVRCU0NlcnQuYXNuMVNpZ25hdHVyZUFsZzt0aGlzLmhleFNpZz1oO3RoaXMuYXNuMVNpZz1uZXcgS0pVUi5hc24xLkRFUkJpdFN0cmluZyh7aGV4OlwiMDBcIit0aGlzLmhleFNpZ30pO3ZhciBpPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5Olt0aGlzLmFzbjFUQlNDZXJ0LHRoaXMuYXNuMVNpZ25hdHVyZUFsZyx0aGlzLmFzbjFTaWddfSk7dGhpcy5oVExWPWkuZ2V0RW5jb2RlZEhleCgpO3RoaXMuaXNNb2RpZmllZD1mYWxzZX07dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7aWYodGhpcy5pc01vZGlmaWVkPT1mYWxzZSYmdGhpcy5oVExWIT1udWxsKXtyZXR1cm4gdGhpcy5oVExWfXRocm93XCJub3Qgc2lnbmVkIHlldFwifTt0aGlzLmdldFBFTVN0cmluZz1mdW5jdGlvbigpe3ZhciBqPXRoaXMuZ2V0RW5jb2RlZEhleCgpO3ZhciBoPUNyeXB0b0pTLmVuYy5IZXgucGFyc2Uoaik7dmFyIGk9Q3J5cHRvSlMuZW5jLkJhc2U2NC5zdHJpbmdpZnkoaCk7dmFyIGs9aS5yZXBsYWNlKC8oLns2NH0pL2csXCIkMVxcclxcblwiKTtyZXR1cm5cIi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLVxcclxcblwiK2srXCJcXHJcXG4tLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tXFxyXFxuXCJ9O2lmKHR5cGVvZiBnIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgZy50YnNjZXJ0b2JqIT1cInVuZGVmaW5lZFwiKXt0aGlzLmFzbjFUQlNDZXJ0PWcudGJzY2VydG9ian1pZih0eXBlb2YgZy5wcnZrZXlvYmohPVwidW5kZWZpbmVkXCIpe3RoaXMucHJ2S2V5PWcucHJ2a2V5b2JqfWVsc2V7aWYodHlwZW9mIGcucnNhcHJ2a2V5IT1cInVuZGVmaW5lZFwiKXt0aGlzLnBydktleT1nLnJzYXBydmtleX1lbHNle2lmKCh0eXBlb2YgZy5yc2FwcnZwZW0hPVwidW5kZWZpbmVkXCIpJiYodHlwZW9mIGcucnNhcHJ2cGFzIT1cInVuZGVmaW5lZFwiKSl7dGhpcy5zZXRSc2FQcnZLZXlCeVBFTWFuZFBhc3MoZy5yc2FwcnZwZW0sZy5yc2FwcnZwYXMpfX19fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLng1MDkuQ2VydGlmaWNhdGUsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS54NTA5LlRCU0NlcnRpZmljYXRlPWZ1bmN0aW9uKGEpe0tKVVIuYXNuMS54NTA5LlRCU0NlcnRpZmljYXRlLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt0aGlzLl9pbml0aWFsaXplPWZ1bmN0aW9uKCl7dGhpcy5hc24xQXJyYXk9bmV3IEFycmF5KCk7dGhpcy5hc24xVmVyc2lvbj1uZXcgS0pVUi5hc24xLkRFUlRhZ2dlZE9iamVjdCh7b2JqOm5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7XCJpbnRcIjoyfSl9KTt0aGlzLmFzbjFTZXJpYWxOdW1iZXI9bnVsbDt0aGlzLmFzbjFTaWduYXR1cmVBbGc9bnVsbDt0aGlzLmFzbjFJc3N1ZXI9bnVsbDt0aGlzLmFzbjFOb3RCZWZvcmU9bnVsbDt0aGlzLmFzbjFOb3RBZnRlcj1udWxsO3RoaXMuYXNuMVN1YmplY3Q9bnVsbDt0aGlzLmFzbjFTdWJqUEtleT1udWxsO3RoaXMuZXh0ZW5zaW9uc0FycmF5PW5ldyBBcnJheSgpfTt0aGlzLnNldFNlcmlhbE51bWJlckJ5UGFyYW09ZnVuY3Rpb24oYil7dGhpcy5hc24xU2VyaWFsTnVtYmVyPW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcihiKX07dGhpcy5zZXRTaWduYXR1cmVBbGdCeVBhcmFtPWZ1bmN0aW9uKGIpe3RoaXMuYXNuMVNpZ25hdHVyZUFsZz1uZXcgS0pVUi5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllcihiKX07dGhpcy5zZXRJc3N1ZXJCeVBhcmFtPWZ1bmN0aW9uKGIpe3RoaXMuYXNuMUlzc3Vlcj1uZXcgS0pVUi5hc24xLng1MDkuWDUwME5hbWUoYil9O3RoaXMuc2V0Tm90QmVmb3JlQnlQYXJhbT1mdW5jdGlvbihiKXt0aGlzLmFzbjFOb3RCZWZvcmU9bmV3IEtKVVIuYXNuMS54NTA5LlRpbWUoYil9O3RoaXMuc2V0Tm90QWZ0ZXJCeVBhcmFtPWZ1bmN0aW9uKGIpe3RoaXMuYXNuMU5vdEFmdGVyPW5ldyBLSlVSLmFzbjEueDUwOS5UaW1lKGIpfTt0aGlzLnNldFN1YmplY3RCeVBhcmFtPWZ1bmN0aW9uKGIpe3RoaXMuYXNuMVN1YmplY3Q9bmV3IEtKVVIuYXNuMS54NTA5Llg1MDBOYW1lKGIpfTt0aGlzLnNldFN1YmplY3RQdWJsaWNLZXlCeVBhcmFtPWZ1bmN0aW9uKGIpe3RoaXMuYXNuMVN1YmpQS2V5PW5ldyBLSlVSLmFzbjEueDUwOS5TdWJqZWN0UHVibGljS2V5SW5mbyhiKX07dGhpcy5zZXRTdWJqZWN0UHVibGljS2V5QnlHZXRLZXk9ZnVuY3Rpb24oYyl7dmFyIGI9S0VZVVRJTC5nZXRLZXkoYyk7dGhpcy5hc24xU3VialBLZXk9bmV3IEtKVVIuYXNuMS54NTA5LlN1YmplY3RQdWJsaWNLZXlJbmZvKGIpfTt0aGlzLmFwcGVuZEV4dGVuc2lvbj1mdW5jdGlvbihiKXt0aGlzLmV4dGVuc2lvbnNBcnJheS5wdXNoKGIpfTt0aGlzLmFwcGVuZEV4dGVuc2lvbkJ5TmFtZT1mdW5jdGlvbihkLGIpe2lmKGQudG9Mb3dlckNhc2UoKT09XCJiYXNpY2NvbnN0cmFpbnRzXCIpe3ZhciBjPW5ldyBLSlVSLmFzbjEueDUwOS5CYXNpY0NvbnN0cmFpbnRzKGIpO3RoaXMuYXBwZW5kRXh0ZW5zaW9uKGMpfWVsc2V7aWYoZC50b0xvd2VyQ2FzZSgpPT1cImtleXVzYWdlXCIpe3ZhciBjPW5ldyBLSlVSLmFzbjEueDUwOS5LZXlVc2FnZShiKTt0aGlzLmFwcGVuZEV4dGVuc2lvbihjKX1lbHNle2lmKGQudG9Mb3dlckNhc2UoKT09XCJjcmxkaXN0cmlidXRpb25wb2ludHNcIil7dmFyIGM9bmV3IEtKVVIuYXNuMS54NTA5LkNSTERpc3RyaWJ1dGlvblBvaW50cyhiKTt0aGlzLmFwcGVuZEV4dGVuc2lvbihjKX1lbHNle2lmKGQudG9Mb3dlckNhc2UoKT09XCJleHRrZXl1c2FnZVwiKXt2YXIgYz1uZXcgS0pVUi5hc24xLng1MDkuRXh0S2V5VXNhZ2UoYik7dGhpcy5hcHBlbmRFeHRlbnNpb24oYyl9ZWxzZXtpZihkLnRvTG93ZXJDYXNlKCk9PVwiYXV0aG9yaXR5a2V5aWRlbnRpZmllclwiKXt2YXIgYz1uZXcgS0pVUi5hc24xLng1MDkuQXV0aG9yaXR5S2V5SWRlbnRpZmllcihiKTt0aGlzLmFwcGVuZEV4dGVuc2lvbihjKX1lbHNle3Rocm93XCJ1bnN1cHBvcnRlZCBleHRlbnNpb24gbmFtZTogXCIrZH19fX19fTt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXtpZih0aGlzLmFzbjFOb3RCZWZvcmU9PW51bGx8fHRoaXMuYXNuMU5vdEFmdGVyPT1udWxsKXt0aHJvd1wibm90QmVmb3JlIGFuZC9vciBub3RBZnRlciBub3Qgc2V0XCJ9dmFyIGM9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7YXJyYXk6W3RoaXMuYXNuMU5vdEJlZm9yZSx0aGlzLmFzbjFOb3RBZnRlcl19KTt0aGlzLmFzbjFBcnJheT1uZXcgQXJyYXkoKTt0aGlzLmFzbjFBcnJheS5wdXNoKHRoaXMuYXNuMVZlcnNpb24pO3RoaXMuYXNuMUFycmF5LnB1c2godGhpcy5hc24xU2VyaWFsTnVtYmVyKTt0aGlzLmFzbjFBcnJheS5wdXNoKHRoaXMuYXNuMVNpZ25hdHVyZUFsZyk7dGhpcy5hc24xQXJyYXkucHVzaCh0aGlzLmFzbjFJc3N1ZXIpO3RoaXMuYXNuMUFycmF5LnB1c2goYyk7dGhpcy5hc24xQXJyYXkucHVzaCh0aGlzLmFzbjFTdWJqZWN0KTt0aGlzLmFzbjFBcnJheS5wdXNoKHRoaXMuYXNuMVN1YmpQS2V5KTtpZih0aGlzLmV4dGVuc2lvbnNBcnJheS5sZW5ndGg+MCl7dmFyIGQ9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7YXJyYXk6dGhpcy5leHRlbnNpb25zQXJyYXl9KTt2YXIgYj1uZXcgS0pVUi5hc24xLkRFUlRhZ2dlZE9iamVjdCh7ZXhwbGljaXQ6dHJ1ZSx0YWc6XCJhM1wiLG9iajpkfSk7dGhpcy5hc24xQXJyYXkucHVzaChiKX12YXIgZT1uZXcgS0pVUi5hc24xLkRFUlNlcXVlbmNlKHthcnJheTp0aGlzLmFzbjFBcnJheX0pO3RoaXMuaFRMVj1lLmdldEVuY29kZWRIZXgoKTt0aGlzLmlzTW9kaWZpZWQ9ZmFsc2U7cmV0dXJuIHRoaXMuaFRMVn07dGhpcy5faW5pdGlhbGl6ZSgpfTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEueDUwOS5UQlNDZXJ0aWZpY2F0ZSxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLng1MDkuRXh0ZW5zaW9uPWZ1bmN0aW9uKGIpe0tKVVIuYXNuMS54NTA5LkV4dGVuc2lvbi5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGE9bnVsbDt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXt2YXIgZj1uZXcgS0pVUi5hc24xLkRFUk9iamVjdElkZW50aWZpZXIoe29pZDp0aGlzLm9pZH0pO3ZhciBlPW5ldyBLSlVSLmFzbjEuREVST2N0ZXRTdHJpbmcoe2hleDp0aGlzLmdldEV4dG5WYWx1ZUhleCgpfSk7dmFyIGQ9bmV3IEFycmF5KCk7ZC5wdXNoKGYpO2lmKHRoaXMuY3JpdGljYWwpe2QucHVzaChuZXcgS0pVUi5hc24xLkRFUkJvb2xlYW4oKSl9ZC5wdXNoKGUpO3ZhciBjPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5OmR9KTtyZXR1cm4gYy5nZXRFbmNvZGVkSGV4KCl9O3RoaXMuY3JpdGljYWw9ZmFsc2U7aWYodHlwZW9mIGIhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBiLmNyaXRpY2FsIT1cInVuZGVmaW5lZFwiKXt0aGlzLmNyaXRpY2FsPWIuY3JpdGljYWx9fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLng1MDkuRXh0ZW5zaW9uLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEueDUwOS5LZXlVc2FnZT1mdW5jdGlvbihhKXtLSlVSLmFzbjEueDUwOS5LZXlVc2FnZS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxhKTt0aGlzLmdldEV4dG5WYWx1ZUhleD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmFzbjFFeHRuVmFsdWUuZ2V0RW5jb2RlZEhleCgpfTt0aGlzLm9pZD1cIjIuNS4yOS4xNVwiO2lmKHR5cGVvZiBhIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYS5iaW4hPVwidW5kZWZpbmVkXCIpe3RoaXMuYXNuMUV4dG5WYWx1ZT1uZXcgS0pVUi5hc24xLkRFUkJpdFN0cmluZyhhKX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEueDUwOS5LZXlVc2FnZSxLSlVSLmFzbjEueDUwOS5FeHRlbnNpb24pO0tKVVIuYXNuMS54NTA5LkJhc2ljQ29uc3RyYWludHM9ZnVuY3Rpb24oYyl7S0pVUi5hc24xLng1MDkuQmFzaWNDb25zdHJhaW50cy5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxjKTt2YXIgYT1mYWxzZTt2YXIgYj0tMTt0aGlzLmdldEV4dG5WYWx1ZUhleD1mdW5jdGlvbigpe3ZhciBlPW5ldyBBcnJheSgpO2lmKHRoaXMuY0Epe2UucHVzaChuZXcgS0pVUi5hc24xLkRFUkJvb2xlYW4oKSl9aWYodGhpcy5wYXRoTGVuPi0xKXtlLnB1c2gobmV3IEtKVVIuYXNuMS5ERVJJbnRlZ2VyKHtcImludFwiOnRoaXMucGF0aExlbn0pKX12YXIgZD1uZXcgS0pVUi5hc24xLkRFUlNlcXVlbmNlKHthcnJheTplfSk7dGhpcy5hc24xRXh0blZhbHVlPWQ7cmV0dXJuIHRoaXMuYXNuMUV4dG5WYWx1ZS5nZXRFbmNvZGVkSGV4KCl9O3RoaXMub2lkPVwiMi41LjI5LjE5XCI7dGhpcy5jQT1mYWxzZTt0aGlzLnBhdGhMZW49LTE7aWYodHlwZW9mIGMhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBjLmNBIT1cInVuZGVmaW5lZFwiKXt0aGlzLmNBPWMuY0F9aWYodHlwZW9mIGMucGF0aExlbiE9XCJ1bmRlZmluZWRcIil7dGhpcy5wYXRoTGVuPWMucGF0aExlbn19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEueDUwOS5CYXNpY0NvbnN0cmFpbnRzLEtKVVIuYXNuMS54NTA5LkV4dGVuc2lvbik7S0pVUi5hc24xLng1MDkuQ1JMRGlzdHJpYnV0aW9uUG9pbnRzPWZ1bmN0aW9uKGEpe0tKVVIuYXNuMS54NTA5LkNSTERpc3RyaWJ1dGlvblBvaW50cy5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxhKTt0aGlzLmdldEV4dG5WYWx1ZUhleD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmFzbjFFeHRuVmFsdWUuZ2V0RW5jb2RlZEhleCgpfTt0aGlzLnNldEJ5RFBBcnJheT1mdW5jdGlvbihiKXt0aGlzLmFzbjFFeHRuVmFsdWU9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7YXJyYXk6Yn0pfTt0aGlzLnNldEJ5T25lVVJJPWZ1bmN0aW9uKGUpe3ZhciBiPW5ldyBLSlVSLmFzbjEueDUwOS5HZW5lcmFsTmFtZXMoW3t1cmk6ZX1dKTt2YXIgZD1uZXcgS0pVUi5hc24xLng1MDkuRGlzdHJpYnV0aW9uUG9pbnROYW1lKGIpO3ZhciBjPW5ldyBLSlVSLmFzbjEueDUwOS5EaXN0cmlidXRpb25Qb2ludCh7ZHBvYmo6ZH0pO3RoaXMuc2V0QnlEUEFycmF5KFtjXSl9O3RoaXMub2lkPVwiMi41LjI5LjMxXCI7aWYodHlwZW9mIGEhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBhLmFycmF5IT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldEJ5RFBBcnJheShhLmFycmF5KX1lbHNle2lmKHR5cGVvZiBhLnVyaSE9XCJ1bmRlZmluZWRcIil7dGhpcy5zZXRCeU9uZVVSSShhLnVyaSl9fX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS54NTA5LkNSTERpc3RyaWJ1dGlvblBvaW50cyxLSlVSLmFzbjEueDUwOS5FeHRlbnNpb24pO0tKVVIuYXNuMS54NTA5LkV4dEtleVVzYWdlPWZ1bmN0aW9uKGEpe0tKVVIuYXNuMS54NTA5LkV4dEtleVVzYWdlLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLGEpO3RoaXMuc2V0UHVycG9zZUFycmF5PWZ1bmN0aW9uKGIpe3RoaXMuYXNuMUV4dG5WYWx1ZT1uZXcgS0pVUi5hc24xLkRFUlNlcXVlbmNlKCk7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe3ZhciBkPW5ldyBLSlVSLmFzbjEuREVST2JqZWN0SWRlbnRpZmllcihiW2NdKTt0aGlzLmFzbjFFeHRuVmFsdWUuYXBwZW5kQVNOMU9iamVjdChkKX19O3RoaXMuZ2V0RXh0blZhbHVlSGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYXNuMUV4dG5WYWx1ZS5nZXRFbmNvZGVkSGV4KCl9O3RoaXMub2lkPVwiMi41LjI5LjM3XCI7aWYodHlwZW9mIGEhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBhLmFycmF5IT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldFB1cnBvc2VBcnJheShhLmFycmF5KX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEueDUwOS5FeHRLZXlVc2FnZSxLSlVSLmFzbjEueDUwOS5FeHRlbnNpb24pO0tKVVIuYXNuMS54NTA5LkF1dGhvcml0eUtleUlkZW50aWZpZXI9ZnVuY3Rpb24oYSl7S0pVUi5hc24xLng1MDkuQXV0aG9yaXR5S2V5SWRlbnRpZmllci5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxhKTt0aGlzLmFzbjFLSUQ9bnVsbDt0aGlzLmFzbjFDZXJ0SXNzdWVyPW51bGw7dGhpcy5hc24xQ2VydFNOPW51bGw7dGhpcy5nZXRFeHRuVmFsdWVIZXg9ZnVuY3Rpb24oKXt2YXIgYz1uZXcgQXJyYXkoKTtpZih0aGlzLmFzbjFLSUQpe2MucHVzaChuZXcgS0pVUi5hc24xLkRFUlRhZ2dlZE9iamVjdCh7ZXhwbGljaXQ6ZmFsc2UsdGFnOlwiODBcIixvYmo6dGhpcy5hc24xS0lEfSkpfWlmKHRoaXMuYXNuMUNlcnRJc3N1ZXIpe2MucHVzaChuZXcgS0pVUi5hc24xLkRFUlRhZ2dlZE9iamVjdCh7ZXhwbGljaXQ6ZmFsc2UsdGFnOlwiYTFcIixvYmo6dGhpcy5hc24xQ2VydElzc3Vlcn0pKX1pZih0aGlzLmFzbjFDZXJ0U04pe2MucHVzaChuZXcgS0pVUi5hc24xLkRFUlRhZ2dlZE9iamVjdCh7ZXhwbGljaXQ6ZmFsc2UsdGFnOlwiODJcIixvYmo6dGhpcy5hc24xQ2VydFNOfSkpfXZhciBiPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5OmN9KTt0aGlzLmFzbjFFeHRuVmFsdWU9YjtyZXR1cm4gdGhpcy5hc24xRXh0blZhbHVlLmdldEVuY29kZWRIZXgoKX07dGhpcy5zZXRLSURCeVBhcmFtPWZ1bmN0aW9uKGIpe3RoaXMuYXNuMUtJRD1uZXcgS0pVUi5hc24xLkRFUk9jdGV0U3RyaW5nKGIpfTt0aGlzLnNldENlcnRJc3N1ZXJCeVBhcmFtPWZ1bmN0aW9uKGIpe3RoaXMuYXNuMUNlcnRJc3N1ZXI9bmV3IEtKVVIuYXNuMS54NTA5Llg1MDBOYW1lKGIpfTt0aGlzLnNldENlcnRTTkJ5UGFyYW09ZnVuY3Rpb24oYil7dGhpcy5hc24xQ2VydFNOPW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcihiKX07dGhpcy5vaWQ9XCIyLjUuMjkuMzVcIjtpZih0eXBlb2YgYSE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGEua2lkIT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldEtJREJ5UGFyYW0oYS5raWQpfWlmKHR5cGVvZiBhLmlzc3VlciE9XCJ1bmRlZmluZWRcIil7dGhpcy5zZXRDZXJ0SXNzdWVyQnlQYXJhbShhLmlzc3Vlcil9aWYodHlwZW9mIGEuc24hPVwidW5kZWZpbmVkXCIpe3RoaXMuc2V0Q2VydFNOQnlQYXJhbShhLnNuKX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEueDUwOS5BdXRob3JpdHlLZXlJZGVudGlmaWVyLEtKVVIuYXNuMS54NTA5LkV4dGVuc2lvbik7S0pVUi5hc24xLng1MDkuQ1JMPWZ1bmN0aW9uKGYpe0tKVVIuYXNuMS54NTA5LkNSTC5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGE9bnVsbDt2YXIgYz1udWxsO3ZhciBlPW51bGw7dmFyIGI9bnVsbDt2YXIgZD1udWxsO3RoaXMuc2V0UnNhUHJ2S2V5QnlQRU1hbmRQYXNzPWZ1bmN0aW9uKGgsail7dmFyIGc9UEtDUzVQS0VZLmdldERlY3J5cHRlZEtleUhleChoLGopO3ZhciBpPW5ldyBSU0FLZXkoKTtpLnJlYWRQcml2YXRlS2V5RnJvbUFTTjFIZXhTdHJpbmcoZyk7dGhpcy5yc2FQcnZLZXk9aX07dGhpcy5zaWduPWZ1bmN0aW9uKCl7dGhpcy5hc24xU2lnbmF0dXJlQWxnPXRoaXMuYXNuMVRCU0NlcnRMaXN0LmFzbjFTaWduYXR1cmVBbGc7c2lnPW5ldyBLSlVSLmNyeXB0by5TaWduYXR1cmUoe2FsZzpcIlNIQTF3aXRoUlNBXCIscHJvdjpcImNyeXB0b2pzL2pzcnNhXCJ9KTtzaWcuaW5pdFNpZ24odGhpcy5yc2FQcnZLZXkpO3NpZy51cGRhdGVIZXgodGhpcy5hc24xVEJTQ2VydExpc3QuZ2V0RW5jb2RlZEhleCgpKTt0aGlzLmhleFNpZz1zaWcuc2lnbigpO3RoaXMuYXNuMVNpZz1uZXcgS0pVUi5hc24xLkRFUkJpdFN0cmluZyh7aGV4OlwiMDBcIit0aGlzLmhleFNpZ30pO3ZhciBnPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5Olt0aGlzLmFzbjFUQlNDZXJ0TGlzdCx0aGlzLmFzbjFTaWduYXR1cmVBbGcsdGhpcy5hc24xU2lnXX0pO3RoaXMuaFRMVj1nLmdldEVuY29kZWRIZXgoKTt0aGlzLmlzTW9kaWZpZWQ9ZmFsc2V9O3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe2lmKHRoaXMuaXNNb2RpZmllZD09ZmFsc2UmJnRoaXMuaFRMViE9bnVsbCl7cmV0dXJuIHRoaXMuaFRMVn10aHJvd1wibm90IHNpZ25lZCB5ZXRcIn07dGhpcy5nZXRQRU1TdHJpbmc9ZnVuY3Rpb24oKXt2YXIgaT10aGlzLmdldEVuY29kZWRIZXgoKTt2YXIgZz1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKGkpO3ZhciBoPUNyeXB0b0pTLmVuYy5CYXNlNjQuc3RyaW5naWZ5KGcpO3ZhciBqPWgucmVwbGFjZSgvKC57NjR9KS9nLFwiJDFcXHJcXG5cIik7cmV0dXJuXCItLS0tLUJFR0lOIFg1MDkgQ1JMLS0tLS1cXHJcXG5cIitqK1wiXFxyXFxuLS0tLS1FTkQgWDUwOSBDUkwtLS0tLVxcclxcblwifTtpZih0eXBlb2YgZiE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGYudGJzb2JqIT1cInVuZGVmaW5lZFwiKXt0aGlzLmFzbjFUQlNDZXJ0TGlzdD1mLnRic29ian1pZih0eXBlb2YgZi5yc2FwcnZrZXkhPVwidW5kZWZpbmVkXCIpe3RoaXMucnNhUHJ2S2V5PWYucnNhcHJ2a2V5fWlmKCh0eXBlb2YgZi5yc2FwcnZwZW0hPVwidW5kZWZpbmVkXCIpJiYodHlwZW9mIGYucnNhcHJ2cGFzIT1cInVuZGVmaW5lZFwiKSl7dGhpcy5zZXRSc2FQcnZLZXlCeVBFTWFuZFBhc3MoZi5yc2FwcnZwZW0sZi5yc2FwcnZwYXMpfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS54NTA5LkNSTCxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLng1MDkuVEJTQ2VydExpc3Q9ZnVuY3Rpb24oYil7S0pVUi5hc24xLng1MDkuVEJTQ2VydExpc3Quc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBhPW51bGw7dGhpcy5zZXRTaWduYXR1cmVBbGdCeVBhcmFtPWZ1bmN0aW9uKGMpe3RoaXMuYXNuMVNpZ25hdHVyZUFsZz1uZXcgS0pVUi5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllcihjKX07dGhpcy5zZXRJc3N1ZXJCeVBhcmFtPWZ1bmN0aW9uKGMpe3RoaXMuYXNuMUlzc3Vlcj1uZXcgS0pVUi5hc24xLng1MDkuWDUwME5hbWUoYyl9O3RoaXMuc2V0VGhpc1VwZGF0ZUJ5UGFyYW09ZnVuY3Rpb24oYyl7dGhpcy5hc24xVGhpc1VwZGF0ZT1uZXcgS0pVUi5hc24xLng1MDkuVGltZShjKX07dGhpcy5zZXROZXh0VXBkYXRlQnlQYXJhbT1mdW5jdGlvbihjKXt0aGlzLmFzbjFOZXh0VXBkYXRlPW5ldyBLSlVSLmFzbjEueDUwOS5UaW1lKGMpfTt0aGlzLmFkZFJldm9rZWRDZXJ0PWZ1bmN0aW9uKGMsZCl7dmFyIGY9e307aWYoYyE9dW5kZWZpbmVkJiZjIT1udWxsKXtmLnNuPWN9aWYoZCE9dW5kZWZpbmVkJiZkIT1udWxsKXtmLnRpbWU9ZH12YXIgZT1uZXcgS0pVUi5hc24xLng1MDkuQ1JMRW50cnkoZik7dGhpcy5hUmV2b2tlZENlcnQucHVzaChlKX07dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7dGhpcy5hc24xQXJyYXk9bmV3IEFycmF5KCk7aWYodGhpcy5hc24xVmVyc2lvbiE9bnVsbCl7dGhpcy5hc24xQXJyYXkucHVzaCh0aGlzLmFzbjFWZXJzaW9uKX10aGlzLmFzbjFBcnJheS5wdXNoKHRoaXMuYXNuMVNpZ25hdHVyZUFsZyk7dGhpcy5hc24xQXJyYXkucHVzaCh0aGlzLmFzbjFJc3N1ZXIpO3RoaXMuYXNuMUFycmF5LnB1c2godGhpcy5hc24xVGhpc1VwZGF0ZSk7aWYodGhpcy5hc24xTmV4dFVwZGF0ZSE9bnVsbCl7dGhpcy5hc24xQXJyYXkucHVzaCh0aGlzLmFzbjFOZXh0VXBkYXRlKX1pZih0aGlzLmFSZXZva2VkQ2VydC5sZW5ndGg+MCl7dmFyIGM9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7YXJyYXk6dGhpcy5hUmV2b2tlZENlcnR9KTt0aGlzLmFzbjFBcnJheS5wdXNoKGMpfXZhciBkPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5OnRoaXMuYXNuMUFycmF5fSk7dGhpcy5oVExWPWQuZ2V0RW5jb2RlZEhleCgpO3RoaXMuaXNNb2RpZmllZD1mYWxzZTtyZXR1cm4gdGhpcy5oVExWfTt0aGlzLl9pbml0aWFsaXplPWZ1bmN0aW9uKCl7dGhpcy5hc24xVmVyc2lvbj1udWxsO3RoaXMuYXNuMVNpZ25hdHVyZUFsZz1udWxsO3RoaXMuYXNuMUlzc3Vlcj1udWxsO3RoaXMuYXNuMVRoaXNVcGRhdGU9bnVsbDt0aGlzLmFzbjFOZXh0VXBkYXRlPW51bGw7dGhpcy5hUmV2b2tlZENlcnQ9bmV3IEFycmF5KCl9O3RoaXMuX2luaXRpYWxpemUoKX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLng1MDkuVEJTQ2VydExpc3QsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS54NTA5LkNSTEVudHJ5PWZ1bmN0aW9uKGMpe0tKVVIuYXNuMS54NTA5LkNSTEVudHJ5LnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYj1udWxsO3ZhciBhPW51bGw7dGhpcy5zZXRDZXJ0U2VyaWFsPWZ1bmN0aW9uKGQpe3RoaXMuc249bmV3IEtKVVIuYXNuMS5ERVJJbnRlZ2VyKGQpfTt0aGlzLnNldFJldm9jYXRpb25EYXRlPWZ1bmN0aW9uKGQpe3RoaXMudGltZT1uZXcgS0pVUi5hc24xLng1MDkuVGltZShkKX07dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7dmFyIGQ9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7YXJyYXk6W3RoaXMuc24sdGhpcy50aW1lXX0pO3RoaXMuVExWPWQuZ2V0RW5jb2RlZEhleCgpO3JldHVybiB0aGlzLlRMVn07aWYodHlwZW9mIGMhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBjLnRpbWUhPVwidW5kZWZpbmVkXCIpe3RoaXMuc2V0UmV2b2NhdGlvbkRhdGUoYy50aW1lKX1pZih0eXBlb2YgYy5zbiE9XCJ1bmRlZmluZWRcIil7dGhpcy5zZXRDZXJ0U2VyaWFsKGMuc24pfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS54NTA5LkNSTEVudHJ5LEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEueDUwOS5YNTAwTmFtZT1mdW5jdGlvbihiKXtLSlVSLmFzbjEueDUwOS5YNTAwTmFtZS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dGhpcy5hc24xQXJyYXk9bmV3IEFycmF5KCk7dGhpcy5zZXRCeVN0cmluZz1mdW5jdGlvbihjKXt2YXIgZD1jLnNwbGl0KFwiL1wiKTtkLnNoaWZ0KCk7Zm9yKHZhciBlPTA7ZTxkLmxlbmd0aDtlKyspe3RoaXMuYXNuMUFycmF5LnB1c2gobmV3IEtKVVIuYXNuMS54NTA5LlJETih7c3RyOmRbZV19KSl9fTt0aGlzLnNldEJ5T2JqZWN0PWZ1bmN0aW9uKGUpe2Zvcih2YXIgYyBpbiBlKXtpZihlLmhhc093blByb3BlcnR5KGMpKXt2YXIgZD1uZXcgS0pVUi5hc24xLng1MDkuUkROKHtzdHI6YytcIj1cIitlW2NdfSk7dGhpcy5hc24xQXJyYXk/dGhpcy5hc24xQXJyYXkucHVzaChkKTp0aGlzLmFzbjFBcnJheT1bZF19fX07dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7aWYodHlwZW9mIHRoaXMuaFRMVj09XCJzdHJpbmdcIil7cmV0dXJuIHRoaXMuaFRMVn12YXIgYz1uZXcgS0pVUi5hc24xLkRFUlNlcXVlbmNlKHthcnJheTp0aGlzLmFzbjFBcnJheX0pO3RoaXMuaFRMVj1jLmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdGhpcy5oVExWfTtpZih0eXBlb2YgYiE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGIuc3RyIT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldEJ5U3RyaW5nKGIuc3RyKX1lbHNle2lmKHR5cGVvZiBiPT09XCJvYmplY3RcIil7dGhpcy5zZXRCeU9iamVjdChiKX19aWYodHlwZW9mIGIuY2VydGlzc3VlciE9XCJ1bmRlZmluZWRcIil7dmFyIGE9bmV3IFg1MDkoKTthLmhleD1YNTA5LnBlbVRvSGV4KGIuY2VydGlzc3Vlcik7dGhpcy5oVExWPWEuZ2V0SXNzdWVySGV4KCl9aWYodHlwZW9mIGIuY2VydHN1YmplY3QhPVwidW5kZWZpbmVkXCIpe3ZhciBhPW5ldyBYNTA5KCk7YS5oZXg9WDUwOS5wZW1Ub0hleChiLmNlcnRzdWJqZWN0KTt0aGlzLmhUTFY9YS5nZXRTdWJqZWN0SGV4KCl9fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLng1MDkuWDUwME5hbWUsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS54NTA5LlJETj1mdW5jdGlvbihhKXtLSlVSLmFzbjEueDUwOS5SRE4uc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3RoaXMuYXNuMUFycmF5PW5ldyBBcnJheSgpO3RoaXMuYWRkQnlTdHJpbmc9ZnVuY3Rpb24oYil7dGhpcy5hc24xQXJyYXkucHVzaChuZXcgS0pVUi5hc24xLng1MDkuQXR0cmlidXRlVHlwZUFuZFZhbHVlKHtzdHI6Yn0pKX07dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7dmFyIGI9bmV3IEtKVVIuYXNuMS5ERVJTZXQoe2FycmF5OnRoaXMuYXNuMUFycmF5fSk7dGhpcy5UTFY9Yi5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHRoaXMuVExWfTtpZih0eXBlb2YgYSE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGEuc3RyIT1cInVuZGVmaW5lZFwiKXt0aGlzLmFkZEJ5U3RyaW5nKGEuc3RyKX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEueDUwOS5SRE4sS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS54NTA5LkF0dHJpYnV0ZVR5cGVBbmRWYWx1ZT1mdW5jdGlvbihiKXtLSlVSLmFzbjEueDUwOS5BdHRyaWJ1dGVUeXBlQW5kVmFsdWUuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBkPW51bGw7dmFyIGM9bnVsbDt2YXIgYT1cInV0ZjhcIjt0aGlzLnNldEJ5U3RyaW5nPWZ1bmN0aW9uKGUpe2lmKGUubWF0Y2goL14oW149XSspPSguKykkLykpe3RoaXMuc2V0QnlBdHRyVHlwZUFuZFZhbHVlU3RyKFJlZ0V4cC4kMSxSZWdFeHAuJDIpfWVsc2V7dGhyb3dcIm1hbGZvcm1lZCBhdHRyVHlwZUFuZFZhbHVlU3RyOiBcIitlfX07dGhpcy5zZXRCeUF0dHJUeXBlQW5kVmFsdWVTdHI9ZnVuY3Rpb24oZyxmKXt0aGlzLnR5cGVPYmo9S0pVUi5hc24xLng1MDkuT0lELmF0eXBlMm9iaihnKTt2YXIgZT1hO2lmKGc9PVwiQ1wiKXtlPVwicHJuXCJ9dGhpcy52YWx1ZU9iaj10aGlzLmdldFZhbHVlT2JqKGUsZil9O3RoaXMuZ2V0VmFsdWVPYmo9ZnVuY3Rpb24oZixlKXtpZihmPT1cInV0ZjhcIil7cmV0dXJuIG5ldyBLSlVSLmFzbjEuREVSVVRGOFN0cmluZyh7c3RyOmV9KX1pZihmPT1cInByblwiKXtyZXR1cm4gbmV3IEtKVVIuYXNuMS5ERVJQcmludGFibGVTdHJpbmcoe3N0cjplfSl9aWYoZj09XCJ0ZWxcIil7cmV0dXJuIG5ldyBLSlVSLmFzbjEuREVSVGVsZXRleFN0cmluZyh7c3RyOmV9KX1pZihmPT1cImlhNVwiKXtyZXR1cm4gbmV3IEtKVVIuYXNuMS5ERVJJQTVTdHJpbmcoe3N0cjplfSl9dGhyb3dcInVuc3VwcG9ydGVkIGRpcmVjdG9yeSBzdHJpbmcgdHlwZTogdHlwZT1cIitmK1wiIHZhbHVlPVwiK2V9O3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe3ZhciBlPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5Olt0aGlzLnR5cGVPYmosdGhpcy52YWx1ZU9ial19KTt0aGlzLlRMVj1lLmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdGhpcy5UTFZ9O2lmKHR5cGVvZiBiIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYi5zdHIhPVwidW5kZWZpbmVkXCIpe3RoaXMuc2V0QnlTdHJpbmcoYi5zdHIpfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS54NTA5LkF0dHJpYnV0ZVR5cGVBbmRWYWx1ZSxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLng1MDkuU3ViamVjdFB1YmxpY0tleUluZm89ZnVuY3Rpb24oZCl7S0pVUi5hc24xLng1MDkuU3ViamVjdFB1YmxpY0tleUluZm8uc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBiPW51bGw7dmFyIGM9bnVsbDt2YXIgYT1udWxsO3RoaXMuc2V0UlNBS2V5PWZ1bmN0aW9uKGUpe2lmKCFSU0FLZXkucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoZSkpe3Rocm93XCJhcmd1bWVudCBpcyBub3QgUlNBS2V5IGluc3RhbmNlXCJ9dGhpcy5yc2FLZXk9ZTt2YXIgZz1uZXcgS0pVUi5hc24xLkRFUkludGVnZXIoe2JpZ2ludDplLm59KTt2YXIgZj1uZXcgS0pVUi5hc24xLkRFUkludGVnZXIoe1wiaW50XCI6ZS5lfSk7dmFyIGk9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7YXJyYXk6W2csZl19KTt2YXIgaD1pLmdldEVuY29kZWRIZXgoKTt0aGlzLmFzbjFBbGdJZD1uZXcgS0pVUi5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllcih7bmFtZTpcInJzYUVuY3J5cHRpb25cIn0pO3RoaXMuYXNuMVN1YmpQS2V5PW5ldyBLSlVSLmFzbjEuREVSQml0U3RyaW5nKHtoZXg6XCIwMFwiK2h9KX07dGhpcy5zZXRSU0FQRU09ZnVuY3Rpb24oZyl7aWYoZy5tYXRjaCgvLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0vKSl7dmFyIG49ZztuPW4ucmVwbGFjZSgvXi0tLS0tW14tXSstLS0tLS8sXCJcIik7bj1uLnJlcGxhY2UoLy0tLS0tW14tXSstLS0tLVxccyokLyxcIlwiKTt2YXIgbT1uLnJlcGxhY2UoL1xccysvZyxcIlwiKTt2YXIgZj1DcnlwdG9KUy5lbmMuQmFzZTY0LnBhcnNlKG0pO3ZhciBpPUNyeXB0b0pTLmVuYy5IZXguc3RyaW5naWZ5KGYpO3ZhciBrPV9yc2FwZW1fZ2V0SGV4VmFsdWVBcnJheU9mQ2hpbGRyZW5Gcm9tSGV4KGkpO3ZhciBoPWtbMV07dmFyIGw9aC5zdWJzdHIoMik7dmFyIGU9X3JzYXBlbV9nZXRIZXhWYWx1ZUFycmF5T2ZDaGlsZHJlbkZyb21IZXgobCk7dmFyIGo9bmV3IFJTQUtleSgpO2ouc2V0UHVibGljKGVbMF0sZVsxXSk7dGhpcy5zZXRSU0FLZXkoail9ZWxzZXt0aHJvd1wia2V5IG5vdCBzdXBwb3J0ZWRcIn19O3RoaXMuZ2V0QVNOMU9iamVjdD1mdW5jdGlvbigpe2lmKHRoaXMuYXNuMUFsZ0lkPT1udWxsfHx0aGlzLmFzbjFTdWJqUEtleT09bnVsbCl7dGhyb3dcImFsZ0lkIGFuZC9vciBzdWJqUHViS2V5IG5vdCBzZXRcIn12YXIgZT1uZXcgS0pVUi5hc24xLkRFUlNlcXVlbmNlKHthcnJheTpbdGhpcy5hc24xQWxnSWQsdGhpcy5hc24xU3VialBLZXldfSk7cmV0dXJuIGV9O3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0QVNOMU9iamVjdCgpO3RoaXMuaFRMVj1lLmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdGhpcy5oVExWfTt0aGlzLl9zZXRSU0FLZXk9ZnVuY3Rpb24oZSl7dmFyIGc9S0pVUi5hc24xLkFTTjFVdGlsLm5ld09iamVjdCh7c2VxOlt7XCJpbnRcIjp7YmlnaW50OmUubn19LHtcImludFwiOntcImludFwiOmUuZX19XX0pO3ZhciBmPWcuZ2V0RW5jb2RlZEhleCgpO3RoaXMuYXNuMUFsZ0lkPW5ldyBLSlVSLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyKHtuYW1lOlwicnNhRW5jcnlwdGlvblwifSk7dGhpcy5hc24xU3VialBLZXk9bmV3IEtKVVIuYXNuMS5ERVJCaXRTdHJpbmcoe2hleDpcIjAwXCIrZn0pfTt0aGlzLl9zZXRFQz1mdW5jdGlvbihlKXt2YXIgZj1uZXcgS0pVUi5hc24xLkRFUk9iamVjdElkZW50aWZpZXIoe25hbWU6ZS5jdXJ2ZU5hbWV9KTt0aGlzLmFzbjFBbGdJZD1uZXcgS0pVUi5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllcih7bmFtZTpcImVjUHVibGljS2V5XCIsYXNuMXBhcmFtczpmfSk7dGhpcy5hc24xU3VialBLZXk9bmV3IEtKVVIuYXNuMS5ERVJCaXRTdHJpbmcoe2hleDpcIjAwXCIrZS5wdWJLZXlIZXh9KX07dGhpcy5fc2V0RFNBPWZ1bmN0aW9uKGUpe3ZhciBmPW5ldyBLSlVSLmFzbjEuQVNOMVV0aWwubmV3T2JqZWN0KHtzZXE6W3tcImludFwiOntiaWdpbnQ6ZS5wfX0se1wiaW50XCI6e2JpZ2ludDplLnF9fSx7XCJpbnRcIjp7YmlnaW50OmUuZ319XX0pO3RoaXMuYXNuMUFsZ0lkPW5ldyBLSlVSLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyKHtuYW1lOlwiZHNhXCIsYXNuMXBhcmFtczpmfSk7dmFyIGc9bmV3IEtKVVIuYXNuMS5ERVJJbnRlZ2VyKHtiaWdpbnQ6ZS55fSk7dGhpcy5hc24xU3VialBLZXk9bmV3IEtKVVIuYXNuMS5ERVJCaXRTdHJpbmcoe2hleDpcIjAwXCIrZy5nZXRFbmNvZGVkSGV4KCl9KX07aWYodHlwZW9mIGQhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBSU0FLZXkhPVwidW5kZWZpbmVkXCImJmQgaW5zdGFuY2VvZiBSU0FLZXkpe3RoaXMuX3NldFJTQUtleShkKX1lbHNle2lmKHR5cGVvZiBLSlVSLmNyeXB0by5FQ0RTQSE9XCJ1bmRlZmluZWRcIiYmZCBpbnN0YW5jZW9mIEtKVVIuY3J5cHRvLkVDRFNBKXt0aGlzLl9zZXRFQyhkKX1lbHNle2lmKHR5cGVvZiBLSlVSLmNyeXB0by5EU0EhPVwidW5kZWZpbmVkXCImJmQgaW5zdGFuY2VvZiBLSlVSLmNyeXB0by5EU0Epe3RoaXMuX3NldERTQShkKX1lbHNle2lmKHR5cGVvZiBkLnJzYWtleSE9XCJ1bmRlZmluZWRcIil7dGhpcy5zZXRSU0FLZXkoZC5yc2FrZXkpfWVsc2V7aWYodHlwZW9mIGQucnNhcGVtIT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldFJTQVBFTShkLnJzYXBlbSl9fX19fX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS54NTA5LlN1YmplY3RQdWJsaWNLZXlJbmZvLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEueDUwOS5UaW1lPWZ1bmN0aW9uKGMpe0tKVVIuYXNuMS54NTA5LlRpbWUuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBiPW51bGw7dmFyIGE9bnVsbDt0aGlzLnNldFRpbWVQYXJhbXM9ZnVuY3Rpb24oZCl7dGhpcy50aW1lUGFyYW1zPWR9O3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe3ZhciBkPW51bGw7aWYodGhpcy50aW1lUGFyYW1zIT1udWxsKXtpZih0aGlzLnR5cGU9PVwidXRjXCIpe2Q9bmV3IEtKVVIuYXNuMS5ERVJVVENUaW1lKHRoaXMudGltZVBhcmFtcyl9ZWxzZXtkPW5ldyBLSlVSLmFzbjEuREVSR2VuZXJhbGl6ZWRUaW1lKHRoaXMudGltZVBhcmFtcyl9fWVsc2V7aWYodGhpcy50eXBlPT1cInV0Y1wiKXtkPW5ldyBLSlVSLmFzbjEuREVSVVRDVGltZSgpfWVsc2V7ZD1uZXcgS0pVUi5hc24xLkRFUkdlbmVyYWxpemVkVGltZSgpfX10aGlzLlRMVj1kLmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdGhpcy5UTFZ9O3RoaXMudHlwZT1cInV0Y1wiO2lmKHR5cGVvZiBjIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYy50eXBlIT1cInVuZGVmaW5lZFwiKXt0aGlzLnR5cGU9Yy50eXBlfWVsc2V7aWYodHlwZW9mIGMuc3RyIT1cInVuZGVmaW5lZFwiKXtpZihjLnN0ci5tYXRjaCgvXlswLTldezEyfVokLykpe3RoaXMudHlwZT1cInV0Y1wifWlmKGMuc3RyLm1hdGNoKC9eWzAtOV17MTR9WiQvKSl7dGhpcy50eXBlPVwiZ2VuXCJ9fX10aGlzLnRpbWVQYXJhbXM9Y319O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS54NTA5LlRpbWUsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXI9ZnVuY3Rpb24oZSl7S0pVUi5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllci5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGE9bnVsbDt2YXIgZD1udWxsO3ZhciBiPW51bGw7dmFyIGM9ZmFsc2U7dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7aWYodGhpcy5uYW1lQWxnPT1udWxsJiZ0aGlzLmFzbjFBbGc9PW51bGwpe3Rocm93XCJhbGdvcml0aG0gbm90IHNwZWNpZmllZFwifWlmKHRoaXMubmFtZUFsZyE9bnVsbCYmdGhpcy5hc24xQWxnPT1udWxsKXt0aGlzLmFzbjFBbGc9S0pVUi5hc24xLng1MDkuT0lELm5hbWUyb2JqKHRoaXMubmFtZUFsZyl9dmFyIGY9W3RoaXMuYXNuMUFsZ107aWYoIXRoaXMucGFyYW1FbXB0eSl7Zi5wdXNoKHRoaXMuYXNuMVBhcmFtcyl9dmFyIGc9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7YXJyYXk6Zn0pO3RoaXMuaFRMVj1nLmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdGhpcy5oVExWfTtpZih0eXBlb2YgZSE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGUubmFtZSE9XCJ1bmRlZmluZWRcIil7dGhpcy5uYW1lQWxnPWUubmFtZX1pZih0eXBlb2YgZS5hc24xcGFyYW1zIT1cInVuZGVmaW5lZFwiKXt0aGlzLmFzbjFQYXJhbXM9ZS5hc24xcGFyYW1zfWlmKHR5cGVvZiBlLnBhcmFtZW1wdHkhPVwidW5kZWZpbmVkXCIpe3RoaXMucGFyYW1FbXB0eT1lLnBhcmFtZW1wdHl9fWlmKHRoaXMuYXNuMVBhcmFtcz09bnVsbCl7dGhpcy5hc24xUGFyYW1zPW5ldyBLSlVSLmFzbjEuREVSTnVsbCgpfX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllcixLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLng1MDkuR2VuZXJhbE5hbWU9ZnVuY3Rpb24oZCl7S0pVUi5hc24xLng1MDkuR2VuZXJhbE5hbWUuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBjPW51bGw7dmFyIGI9bnVsbDt2YXIgYT17cmZjODIyOlwiODFcIixkbnM6XCI4MlwiLGRuOlwiYTRcIix1cmk6XCI4NlwifTt0aGlzLmV4cGxpY2l0PWZhbHNlO3RoaXMuc2V0QnlQYXJhbT1mdW5jdGlvbihrKXt2YXIgaj1udWxsO3ZhciBnPW51bGw7aWYodHlwZW9mIGs9PVwidW5kZWZpbmVkXCIpe3JldHVybn1pZih0eXBlb2Ygay5yZmM4MjIhPVwidW5kZWZpbmVkXCIpe3RoaXMudHlwZT1cInJmYzgyMlwiO2c9bmV3IEtKVVIuYXNuMS5ERVJJQTVTdHJpbmcoe3N0cjprW3RoaXMudHlwZV19KX1pZih0eXBlb2Ygay5kbnMhPVwidW5kZWZpbmVkXCIpe3RoaXMudHlwZT1cImRuc1wiO2c9bmV3IEtKVVIuYXNuMS5ERVJJQTVTdHJpbmcoe3N0cjprW3RoaXMudHlwZV19KX1pZih0eXBlb2Ygay51cmkhPVwidW5kZWZpbmVkXCIpe3RoaXMudHlwZT1cInVyaVwiO2c9bmV3IEtKVVIuYXNuMS5ERVJJQTVTdHJpbmcoe3N0cjprW3RoaXMudHlwZV19KX1pZih0eXBlb2Ygay5jZXJ0aXNzdWVyIT1cInVuZGVmaW5lZFwiKXt0aGlzLnR5cGU9XCJkblwiO3RoaXMuZXhwbGljaXQ9dHJ1ZTt2YXIgaD1rLmNlcnRpc3N1ZXI7dmFyIGY9bnVsbDtpZihoLm1hdGNoKC9eWzAtOUEtRmEtZl0rJC8pKXtmPT1ofWlmKGguaW5kZXhPZihcIi0tLS0tQkVHSU4gXCIpIT0tMSl7Zj1YNTA5LnBlbVRvSGV4KGgpfWlmKGY9PW51bGwpe3Rocm93XCJjZXJ0aXNzdWVyIHBhcmFtIG5vdCBjZXJ0XCJ9dmFyIGU9bmV3IFg1MDkoKTtlLmhleD1mO3ZhciBpPWUuZ2V0SXNzdWVySGV4KCk7Zz1uZXcgS0pVUi5hc24xLkFTTjFPYmplY3QoKTtnLmhUTFY9aX1pZih0eXBlb2Ygay5jZXJ0c3ViaiE9XCJ1bmRlZmluZWRcIil7dGhpcy50eXBlPVwiZG5cIjt0aGlzLmV4cGxpY2l0PXRydWU7dmFyIGg9ay5jZXJ0c3Viajt2YXIgZj1udWxsO2lmKGgubWF0Y2goL15bMC05QS1GYS1mXSskLykpe2Y9PWh9aWYoaC5pbmRleE9mKFwiLS0tLS1CRUdJTiBcIikhPS0xKXtmPVg1MDkucGVtVG9IZXgoaCl9aWYoZj09bnVsbCl7dGhyb3dcImNlcnRzdWJqIHBhcmFtIG5vdCBjZXJ0XCJ9dmFyIGU9bmV3IFg1MDkoKTtlLmhleD1mO3ZhciBpPWUuZ2V0U3ViamVjdEhleCgpO2c9bmV3IEtKVVIuYXNuMS5BU04xT2JqZWN0KCk7Zy5oVExWPWl9aWYodGhpcy50eXBlPT1udWxsKXt0aHJvd1widW5zdXBwb3J0ZWQgdHlwZSBpbiBwYXJhbXM9XCIra310aGlzLmFzbjFPYmo9bmV3IEtKVVIuYXNuMS5ERVJUYWdnZWRPYmplY3Qoe2V4cGxpY2l0OnRoaXMuZXhwbGljaXQsdGFnOmFbdGhpcy50eXBlXSxvYmo6Z30pfTt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hc24xT2JqLmdldEVuY29kZWRIZXgoKX07aWYodHlwZW9mIGQhPVwidW5kZWZpbmVkXCIpe3RoaXMuc2V0QnlQYXJhbShkKX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS54NTA5LkdlbmVyYWxOYW1lLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEueDUwOS5HZW5lcmFsTmFtZXM9ZnVuY3Rpb24oYil7S0pVUi5hc24xLng1MDkuR2VuZXJhbE5hbWVzLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYT1udWxsO3RoaXMuc2V0QnlQYXJhbUFycmF5PWZ1bmN0aW9uKGUpe2Zvcih2YXIgYz0wO2M8ZS5sZW5ndGg7YysrKXt2YXIgZD1uZXcgS0pVUi5hc24xLng1MDkuR2VuZXJhbE5hbWUoZVtjXSk7dGhpcy5hc24xQXJyYXkucHVzaChkKX19O3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe3ZhciBjPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5OnRoaXMuYXNuMUFycmF5fSk7cmV0dXJuIGMuZ2V0RW5jb2RlZEhleCgpfTt0aGlzLmFzbjFBcnJheT1uZXcgQXJyYXkoKTtpZih0eXBlb2YgYiE9XCJ1bmRlZmluZWRcIil7dGhpcy5zZXRCeVBhcmFtQXJyYXkoYil9fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEueDUwOS5HZW5lcmFsTmFtZXMsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS54NTA5LkRpc3RyaWJ1dGlvblBvaW50TmFtZT1mdW5jdGlvbihiKXtLSlVSLmFzbjEueDUwOS5EaXN0cmlidXRpb25Qb2ludE5hbWUuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBlPW51bGw7dmFyIGM9bnVsbDt2YXIgYT1udWxsO3ZhciBkPW51bGw7dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7aWYodGhpcy50eXBlIT1cImZ1bGxcIil7dGhyb3dcImN1cnJlbnRseSB0eXBlIHNoYWxsIGJlICdmdWxsJzogXCIrdGhpcy50eXBlfXRoaXMuYXNuMU9iaj1uZXcgS0pVUi5hc24xLkRFUlRhZ2dlZE9iamVjdCh7ZXhwbGljaXQ6ZmFsc2UsdGFnOnRoaXMudGFnLG9iajp0aGlzLmFzbjFWfSk7dGhpcy5oVExWPXRoaXMuYXNuMU9iai5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHRoaXMuaFRMVn07aWYodHlwZW9mIGIhPVwidW5kZWZpbmVkXCIpe2lmKEtKVVIuYXNuMS54NTA5LkdlbmVyYWxOYW1lcy5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihiKSl7dGhpcy50eXBlPVwiZnVsbFwiO3RoaXMudGFnPVwiYTBcIjt0aGlzLmFzbjFWPWJ9ZWxzZXt0aHJvd1wiVGhpcyBjbGFzcyBzdXBwb3J0cyBHZW5lcmFsTmFtZXMgb25seSBhcyBhcmd1bWVudFwifX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS54NTA5LkRpc3RyaWJ1dGlvblBvaW50TmFtZSxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLng1MDkuRGlzdHJpYnV0aW9uUG9pbnQ9ZnVuY3Rpb24oYil7S0pVUi5hc24xLng1MDkuRGlzdHJpYnV0aW9uUG9pbnQuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBhPW51bGw7dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7dmFyIGM9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSgpO2lmKHRoaXMuYXNuMURQIT1udWxsKXt2YXIgZD1uZXcgS0pVUi5hc24xLkRFUlRhZ2dlZE9iamVjdCh7ZXhwbGljaXQ6dHJ1ZSx0YWc6XCJhMFwiLG9iajp0aGlzLmFzbjFEUH0pO2MuYXBwZW5kQVNOMU9iamVjdChkKX10aGlzLmhUTFY9Yy5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHRoaXMuaFRMVn07aWYodHlwZW9mIGIhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBiLmRwb2JqIT1cInVuZGVmaW5lZFwiKXt0aGlzLmFzbjFEUD1iLmRwb2JqfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS54NTA5LkRpc3RyaWJ1dGlvblBvaW50LEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEueDUwOS5PSUQ9bmV3IGZ1bmN0aW9uKGEpe3RoaXMuYXR5cGUyb2lkTGlzdD17QzpcIjIuNS40LjZcIixPOlwiMi41LjQuMTBcIixPVTpcIjIuNS40LjExXCIsU1Q6XCIyLjUuNC44XCIsTDpcIjIuNS40LjdcIixDTjpcIjIuNS40LjNcIixETjpcIjIuNS40LjQ5XCIsREM6XCIwLjkuMjM0Mi4xOTIwMDMwMC4xMDAuMS4yNVwiLH07dGhpcy5uYW1lMm9pZExpc3Q9e3NoYTE6XCIxLjMuMTQuMy4yLjI2XCIsc2hhMjU2OlwiMi4xNi44NDAuMS4xMDEuMy40LjIuMVwiLHNoYTM4NDpcIjIuMTYuODQwLjEuMTAxLjMuNC4yLjJcIixzaGE1MTI6XCIyLjE2Ljg0MC4xLjEwMS4zLjQuMi4zXCIsc2hhMjI0OlwiMi4xNi44NDAuMS4xMDEuMy40LjIuNFwiLG1kNTpcIjEuMi44NDAuMTEzNTQ5LjIuNVwiLG1kMjpcIjEuMy4xNC43LjIuMi4xXCIscmlwZW1kMTYwOlwiMS4zLjM2LjMuMi4xXCIsTUQyd2l0aFJTQTpcIjEuMi44NDAuMTEzNTQ5LjEuMS4yXCIsTUQ0d2l0aFJTQTpcIjEuMi44NDAuMTEzNTQ5LjEuMS4zXCIsTUQ1d2l0aFJTQTpcIjEuMi44NDAuMTEzNTQ5LjEuMS40XCIsU0hBMXdpdGhSU0E6XCIxLjIuODQwLjExMzU0OS4xLjEuNVwiLFNIQTIyNHdpdGhSU0E6XCIxLjIuODQwLjExMzU0OS4xLjEuMTRcIixTSEEyNTZ3aXRoUlNBOlwiMS4yLjg0MC4xMTM1NDkuMS4xLjExXCIsU0hBMzg0d2l0aFJTQTpcIjEuMi44NDAuMTEzNTQ5LjEuMS4xMlwiLFNIQTUxMndpdGhSU0E6XCIxLjIuODQwLjExMzU0OS4xLjEuMTNcIixTSEExd2l0aEVDRFNBOlwiMS4yLjg0MC4xMDA0NS40LjFcIixTSEEyMjR3aXRoRUNEU0E6XCIxLjIuODQwLjEwMDQ1LjQuMy4xXCIsU0hBMjU2d2l0aEVDRFNBOlwiMS4yLjg0MC4xMDA0NS40LjMuMlwiLFNIQTM4NHdpdGhFQ0RTQTpcIjEuMi44NDAuMTAwNDUuNC4zLjNcIixTSEE1MTJ3aXRoRUNEU0E6XCIxLjIuODQwLjEwMDQ1LjQuMy40XCIsZHNhOlwiMS4yLjg0MC4xMDA0MC40LjFcIixTSEExd2l0aERTQTpcIjEuMi44NDAuMTAwNDAuNC4zXCIsU0hBMjI0d2l0aERTQTpcIjIuMTYuODQwLjEuMTAxLjMuNC4zLjFcIixTSEEyNTZ3aXRoRFNBOlwiMi4xNi44NDAuMS4xMDEuMy40LjMuMlwiLHJzYUVuY3J5cHRpb246XCIxLjIuODQwLjExMzU0OS4xLjEuMVwiLGNvdW50cnlOYW1lOlwiMi41LjQuNlwiLG9yZ2FuaXphdGlvbjpcIjIuNS40LjEwXCIsb3JnYW5pemF0aW9uYWxVbml0OlwiMi41LjQuMTFcIixzdGF0ZU9yUHJvdmluY2VOYW1lOlwiMi41LjQuOFwiLGxvY2FsaXR5OlwiMi41LjQuN1wiLGNvbW1vbk5hbWU6XCIyLjUuNC4zXCIsc3ViamVjdEtleUlkZW50aWZpZXI6XCIyLjUuMjkuMTRcIixrZXlVc2FnZTpcIjIuNS4yOS4xNVwiLHN1YmplY3RBbHROYW1lOlwiMi41LjI5LjE3XCIsYmFzaWNDb25zdHJhaW50czpcIjIuNS4yOS4xOVwiLG5hbWVDb25zdHJhaW50czpcIjIuNS4yOS4zMFwiLGNSTERpc3RyaWJ1dGlvblBvaW50czpcIjIuNS4yOS4zMVwiLGNlcnRpZmljYXRlUG9saWNpZXM6XCIyLjUuMjkuMzJcIixhdXRob3JpdHlLZXlJZGVudGlmaWVyOlwiMi41LjI5LjM1XCIscG9saWN5Q29uc3RyYWludHM6XCIyLjUuMjkuMzZcIixleHRLZXlVc2FnZTpcIjIuNS4yOS4zN1wiLGF1dGhvcml0eUluZm9BY2Nlc3M6XCIxLjMuNi4xLjUuNS43LjEuMVwiLGFueUV4dGVuZGVkS2V5VXNhZ2U6XCIyLjUuMjkuMzcuMFwiLHNlcnZlckF1dGg6XCIxLjMuNi4xLjUuNS43LjMuMVwiLGNsaWVudEF1dGg6XCIxLjMuNi4xLjUuNS43LjMuMlwiLGNvZGVTaWduaW5nOlwiMS4zLjYuMS41LjUuNy4zLjNcIixlbWFpbFByb3RlY3Rpb246XCIxLjMuNi4xLjUuNS43LjMuNFwiLHRpbWVTdGFtcGluZzpcIjEuMy42LjEuNS41LjcuMy44XCIsb2NzcFNpZ25pbmc6XCIxLjMuNi4xLjUuNS43LjMuOVwiLGVjUHVibGljS2V5OlwiMS4yLjg0MC4xMDA0NS4yLjFcIixzZWNwMjU2cjE6XCIxLjIuODQwLjEwMDQ1LjMuMS43XCIsc2VjcDI1NmsxOlwiMS4zLjEzMi4wLjEwXCIsc2VjcDM4NHIxOlwiMS4zLjEzMi4wLjM0XCIscGtjczVQQkVTMjpcIjEuMi44NDAuMTEzNTQ5LjEuNS4xM1wiLHBrY3M1UEJLREYyOlwiMS4yLjg0MC4xMTM1NDkuMS41LjEyXCIsXCJkZXMtRURFMy1DQkNcIjpcIjEuMi44NDAuMTEzNTQ5LjMuN1wiLGRhdGE6XCIxLjIuODQwLjExMzU0OS4xLjcuMVwiLFwic2lnbmVkLWRhdGFcIjpcIjEuMi44NDAuMTEzNTQ5LjEuNy4yXCIsXCJlbnZlbG9wZWQtZGF0YVwiOlwiMS4yLjg0MC4xMTM1NDkuMS43LjNcIixcImRpZ2VzdGVkLWRhdGFcIjpcIjEuMi44NDAuMTEzNTQ5LjEuNy41XCIsXCJlbmNyeXB0ZWQtZGF0YVwiOlwiMS4yLjg0MC4xMTM1NDkuMS43LjZcIixcImF1dGhlbnRpY2F0ZWQtZGF0YVwiOlwiMS4yLjg0MC4xMTM1NDkuMS45LjE2LjEuMlwiLHRzdGluZm86XCIxLjIuODQwLjExMzU0OS4xLjkuMTYuMS40XCIsfTt0aGlzLm9iakNhY2hlPXt9O3RoaXMubmFtZTJvYmo9ZnVuY3Rpb24oYil7aWYodHlwZW9mIHRoaXMub2JqQ2FjaGVbYl0hPVwidW5kZWZpbmVkXCIpe3JldHVybiB0aGlzLm9iakNhY2hlW2JdfWlmKHR5cGVvZiB0aGlzLm5hbWUyb2lkTGlzdFtiXT09XCJ1bmRlZmluZWRcIil7dGhyb3dcIk5hbWUgb2YgT2JqZWN0SWRlbnRpZmllciBub3QgZGVmaW5lZDogXCIrYn12YXIgYz10aGlzLm5hbWUyb2lkTGlzdFtiXTt2YXIgZD1uZXcgS0pVUi5hc24xLkRFUk9iamVjdElkZW50aWZpZXIoe29pZDpjfSk7dGhpcy5vYmpDYWNoZVtiXT1kO3JldHVybiBkfTt0aGlzLmF0eXBlMm9iaj1mdW5jdGlvbihiKXtpZih0eXBlb2YgdGhpcy5vYmpDYWNoZVtiXSE9XCJ1bmRlZmluZWRcIil7cmV0dXJuIHRoaXMub2JqQ2FjaGVbYl19aWYodHlwZW9mIHRoaXMuYXR5cGUyb2lkTGlzdFtiXT09XCJ1bmRlZmluZWRcIil7dGhyb3dcIkF0dHJpYnV0ZVR5cGUgbmFtZSB1bmRlZmluZWQ6IFwiK2J9dmFyIGM9dGhpcy5hdHlwZTJvaWRMaXN0W2JdO3ZhciBkPW5ldyBLSlVSLmFzbjEuREVST2JqZWN0SWRlbnRpZmllcih7b2lkOmN9KTt0aGlzLm9iakNhY2hlW2JdPWQ7cmV0dXJuIGR9fTtLSlVSLmFzbjEueDUwOS5PSUQub2lkMm5hbWU9ZnVuY3Rpb24oYil7dmFyIGM9S0pVUi5hc24xLng1MDkuT0lELm5hbWUyb2lkTGlzdDtmb3IodmFyIGEgaW4gYyl7aWYoY1thXT09Yil7cmV0dXJuIGF9fXJldHVyblwiXCJ9O0tKVVIuYXNuMS54NTA5Lk9JRC5uYW1lMm9pZD1mdW5jdGlvbihhKXt2YXIgYj1LSlVSLmFzbjEueDUwOS5PSUQubmFtZTJvaWRMaXN0O2lmKGJbYV09PT11bmRlZmluZWQpe3JldHVyblwiXCJ9cmV0dXJuIGJbYV19O0tKVVIuYXNuMS54NTA5Llg1MDlVdGlsPW5ldyBmdW5jdGlvbigpe3RoaXMuZ2V0UEtDUzhQdWJLZXlQRU1mcm9tUlNBS2V5PWZ1bmN0aW9uKGkpe3ZhciBoPW51bGw7dmFyIGY9S0pVUi5hc24xLkFTTjFVdGlsLmJpZ0ludFRvTWluVHdvc0NvbXBsZW1lbnRzSGV4KGkubik7dmFyIGo9S0pVUi5hc24xLkFTTjFVdGlsLmludGVnZXJUb0J5dGVIZXgoaS5lKTt2YXIgYT1uZXcgS0pVUi5hc24xLkRFUkludGVnZXIoe2hleDpmfSk7dmFyIGc9bmV3IEtKVVIuYXNuMS5ERVJJbnRlZ2VyKHtoZXg6an0pO3ZhciBsPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5OlthLGddfSk7dmFyIGM9bC5nZXRFbmNvZGVkSGV4KCk7dmFyIGQ9bmV3IEtKVVIuYXNuMS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIoe25hbWU6XCJyc2FFbmNyeXB0aW9uXCJ9KTt2YXIgYj1uZXcgS0pVUi5hc24xLkRFUkJpdFN0cmluZyh7aGV4OlwiMDBcIitjfSk7dmFyIGs9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7YXJyYXk6W2QsYl19KTt2YXIgZT1rLmdldEVuY29kZWRIZXgoKTt2YXIgaD1LSlVSLmFzbjEuQVNOMVV0aWwuZ2V0UEVNU3RyaW5nRnJvbUhleChlLFwiUFVCTElDIEtFWVwiKTtyZXR1cm4gaH19O0tKVVIuYXNuMS54NTA5Llg1MDlVdGlsLm5ld0NlcnRQRU09ZnVuY3Rpb24oZil7dmFyIGM9S0pVUi5hc24xLng1MDk7dmFyIGU9bmV3IGMuVEJTQ2VydGlmaWNhdGUoKTtpZihmLnNlcmlhbCE9PXVuZGVmaW5lZCl7ZS5zZXRTZXJpYWxOdW1iZXJCeVBhcmFtKGYuc2VyaWFsKX1lbHNle3Rocm93XCJzZXJpYWwgbnVtYmVyIHVuZGVmaW5lZC5cIn1pZih0eXBlb2YgZi5zaWdhbGcubmFtZT09XCJzdHJpbmdcIil7ZS5zZXRTaWduYXR1cmVBbGdCeVBhcmFtKGYuc2lnYWxnKX1lbHNle3Rocm93XCJ1bnByb3BlciBzaWduYXR1cmUgYWxnb3JpdGhtIG5hbWVcIn1pZihmLmlzc3VlciE9PXVuZGVmaW5lZCl7ZS5zZXRJc3N1ZXJCeVBhcmFtKGYuaXNzdWVyKX1lbHNle3Rocm93XCJpc3N1ZXIgbmFtZSB1bmRlZmluZWQuXCJ9aWYoZi5ub3RiZWZvcmUhPT11bmRlZmluZWQpe2Uuc2V0Tm90QmVmb3JlQnlQYXJhbShmLm5vdGJlZm9yZSl9ZWxzZXt0aHJvd1wibm90YmVmb3JlIHVuZGVmaW5lZC5cIn1pZihmLm5vdGFmdGVyIT09dW5kZWZpbmVkKXtlLnNldE5vdEFmdGVyQnlQYXJhbShmLm5vdGFmdGVyKX1lbHNle3Rocm93XCJub3RhZnRlciB1bmRlZmluZWQuXCJ9aWYoZi5zdWJqZWN0IT09dW5kZWZpbmVkKXtlLnNldFN1YmplY3RCeVBhcmFtKGYuc3ViamVjdCl9ZWxzZXt0aHJvd1wic3ViamVjdCBuYW1lIHVuZGVmaW5lZC5cIn1pZihmLnNianB1YmtleSE9PXVuZGVmaW5lZCl7ZS5zZXRTdWJqZWN0UHVibGljS2V5QnlHZXRLZXkoZi5zYmpwdWJrZXkpfWVsc2V7dGhyb3dcInN1YmplY3QgcHVibGljIGtleSB1bmRlZmluZWQuXCJ9aWYoZi5leHQhPT11bmRlZmluZWQmJmYuZXh0Lmxlbmd0aCE9PXVuZGVmaW5lZCl7Zm9yKHZhciBiPTA7YjxmLmV4dC5sZW5ndGg7YisrKXtmb3Ioa2V5IGluIGYuZXh0W2JdKXtlLmFwcGVuZEV4dGVuc2lvbkJ5TmFtZShrZXksZi5leHRbYl1ba2V5XSl9fX1pZihmLmNha2V5PT09dW5kZWZpbmVkJiZmLnNpZ2hleD09PXVuZGVmaW5lZCl7dGhyb3dcInBhcmFtIGNha2V5IGFuZCBzaWdoZXggdW5kZWZpbmVkLlwifXZhciBkPW51bGw7dmFyIGE9bnVsbDtpZihmLmNha2V5KXtkPUtFWVVUSUwuZ2V0S2V5LmFwcGx5KG51bGwsZi5jYWtleSk7YT1uZXcgYy5DZXJ0aWZpY2F0ZSh7dGJzY2VydG9iajplLHBydmtleW9iajpkfSk7YS5zaWduKCl9aWYoZi5zaWdoZXgpe2E9bmV3IGMuQ2VydGlmaWNhdGUoe3Ric2NlcnRvYmo6ZX0pO2Euc2V0U2lnbmF0dXJlSGV4KGYuc2lnaGV4KX1yZXR1cm4gYS5nZXRQRU1TdHJpbmcoKX07XG4vKiEgYXNuMWNtcy0xLjAuMi5qcyAoYykgMjAxMy0yMDE0IEtlbmppIFVydXNoaW1hIHwga2p1ci5naXRodWIuY29tL2pzcnNhc2lnbi9saWNlbnNlXG4gKi9cbmlmKHR5cGVvZiBLSlVSPT1cInVuZGVmaW5lZFwifHwhS0pVUil7S0pVUj17fX1pZih0eXBlb2YgS0pVUi5hc24xPT1cInVuZGVmaW5lZFwifHwhS0pVUi5hc24xKXtLSlVSLmFzbjE9e319aWYodHlwZW9mIEtKVVIuYXNuMS5jbXM9PVwidW5kZWZpbmVkXCJ8fCFLSlVSLmFzbjEuY21zKXtLSlVSLmFzbjEuY21zPXt9fUtKVVIuYXNuMS5jbXMuQXR0cmlidXRlPWZ1bmN0aW9uKGIpe0tKVVIuYXNuMS5jbXMuQXR0cmlidXRlLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYT1bXTt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXt2YXIgZixlLGM7Zj1uZXcgS0pVUi5hc24xLkRFUk9iamVjdElkZW50aWZpZXIoe29pZDp0aGlzLmF0dHJUeXBlT2lkfSk7ZT1uZXcgS0pVUi5hc24xLkRFUlNldCh7YXJyYXk6dGhpcy52YWx1ZUxpc3R9KTt0cnl7ZS5nZXRFbmNvZGVkSGV4KCl9Y2F0Y2goZCl7dGhyb3dcImZhaWwgdmFsdWVTZXQuZ2V0RW5jb2RlZEhleCBpbiBBdHRyaWJ1dGUoMSkvXCIrZH1jPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5OltmLGVdfSk7dHJ5e3RoaXMuaFRMVj1jLmdldEVuY29kZWRIZXgoKX1jYXRjaChkKXt0aHJvd1wiZmFpbGVkIHNlcS5nZXRFbmNvZGVkSGV4IGluIEF0dHJpYnV0ZSgyKS9cIitkfXJldHVybiB0aGlzLmhUTFZ9fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuY21zLkF0dHJpYnV0ZSxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLmNtcy5Db250ZW50VHlwZT1mdW5jdGlvbihiKXtLSlVSLmFzbjEuY21zLkNvbnRlbnRUeXBlLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt0aGlzLmF0dHJUeXBlT2lkPVwiMS4yLjg0MC4xMTM1NDkuMS45LjNcIjt2YXIgYT1udWxsO2lmKHR5cGVvZiBiIT1cInVuZGVmaW5lZFwiKXt2YXIgYT1uZXcgS0pVUi5hc24xLkRFUk9iamVjdElkZW50aWZpZXIoYik7dGhpcy52YWx1ZUxpc3Q9W2FdfX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLmNtcy5Db250ZW50VHlwZSxLSlVSLmFzbjEuY21zLkF0dHJpYnV0ZSk7S0pVUi5hc24xLmNtcy5NZXNzYWdlRGlnZXN0PWZ1bmN0aW9uKGUpe0tKVVIuYXNuMS5jbXMuTWVzc2FnZURpZ2VzdC5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dGhpcy5hdHRyVHlwZU9pZD1cIjEuMi44NDAuMTEzNTQ5LjEuOS40XCI7aWYodHlwZW9mIGUhPVwidW5kZWZpbmVkXCIpe2lmKGUuZWNpT2JqIGluc3RhbmNlb2YgS0pVUi5hc24xLmNtcy5FbmNhcHN1bGF0ZWRDb250ZW50SW5mbyYmdHlwZW9mIGUuaGFzaEFsZz09XCJzdHJpbmdcIil7dmFyIGI9ZS5lY2lPYmouZUNvbnRlbnRWYWx1ZUhleDt2YXIgYT1lLmhhc2hBbGc7dmFyIGM9S0pVUi5jcnlwdG8uVXRpbC5oYXNoSGV4KGIsYSk7dmFyIGQ9bmV3IEtKVVIuYXNuMS5ERVJPY3RldFN0cmluZyh7aGV4OmN9KTtkLmdldEVuY29kZWRIZXgoKTt0aGlzLnZhbHVlTGlzdD1bZF19ZWxzZXt2YXIgZD1uZXcgS0pVUi5hc24xLkRFUk9jdGV0U3RyaW5nKGUpO2QuZ2V0RW5jb2RlZEhleCgpO3RoaXMudmFsdWVMaXN0PVtkXX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuY21zLk1lc3NhZ2VEaWdlc3QsS0pVUi5hc24xLmNtcy5BdHRyaWJ1dGUpO0tKVVIuYXNuMS5jbXMuU2lnbmluZ1RpbWU9ZnVuY3Rpb24oYyl7S0pVUi5hc24xLmNtcy5TaWduaW5nVGltZS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dGhpcy5hdHRyVHlwZU9pZD1cIjEuMi44NDAuMTEzNTQ5LjEuOS41XCI7aWYodHlwZW9mIGMhPVwidW5kZWZpbmVkXCIpe3ZhciBhPW5ldyBLSlVSLmFzbjEueDUwOS5UaW1lKGMpO3RyeXthLmdldEVuY29kZWRIZXgoKX1jYXRjaChiKXt0aHJvd1wiU2lnbmluZ1RpbWUuZ2V0RW5jb2RlZEhleCgpIGZhaWxlZC9cIitifXRoaXMudmFsdWVMaXN0PVthXX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5jbXMuU2lnbmluZ1RpbWUsS0pVUi5hc24xLmNtcy5BdHRyaWJ1dGUpO0tKVVIuYXNuMS5jbXMuU2lnbmluZ0NlcnRpZmljYXRlPWZ1bmN0aW9uKGQpe0tKVVIuYXNuMS5jbXMuU2lnbmluZ0NlcnRpZmljYXRlLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt0aGlzLmF0dHJUeXBlT2lkPVwiMS4yLjg0MC4xMTM1NDkuMS45LjE2LjIuMTJcIjt2YXIgYT1LSlVSLmFzbjE7dmFyIGM9S0pVUi5hc24xLmNtczt2YXIgYj1LSlVSLmNyeXB0bzt0aGlzLnNldENlcnRzPWZ1bmN0aW9uKGwpe3ZhciBqPVtdO2Zvcih2YXIgaD0wO2g8bC5sZW5ndGg7aCsrKXt2YXIgZj1LRVlVVElMLmdldEhleEZyb21QRU0obFtoXSk7dmFyIGU9Yi5VdGlsLmhhc2hIZXgoZixcInNoYTFcIik7dmFyIG09bmV3IGEuREVST2N0ZXRTdHJpbmcoe2hleDplfSk7bS5nZXRFbmNvZGVkSGV4KCk7dmFyIGs9bmV3IGMuSXNzdWVyQW5kU2VyaWFsTnVtYmVyKHtjZXJ0OmxbaF19KTtrLmdldEVuY29kZWRIZXgoKTt2YXIgbj1uZXcgYS5ERVJTZXF1ZW5jZSh7YXJyYXk6W20sa119KTtuLmdldEVuY29kZWRIZXgoKTtqLnB1c2gobil9dmFyIGc9bmV3IGEuREVSU2VxdWVuY2Uoe2FycmF5Omp9KTtnLmdldEVuY29kZWRIZXgoKTt0aGlzLnZhbHVlTGlzdD1bZ119O2lmKHR5cGVvZiBkIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgZC5hcnJheT09XCJvYmplY3RcIil7dGhpcy5zZXRDZXJ0cyhkLmFycmF5KX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuY21zLlNpZ25pbmdDZXJ0aWZpY2F0ZSxLSlVSLmFzbjEuY21zLkF0dHJpYnV0ZSk7S0pVUi5hc24xLmNtcy5TaWduaW5nQ2VydGlmaWNhdGVWMj1mdW5jdGlvbihlKXtLSlVSLmFzbjEuY21zLlNpZ25pbmdDZXJ0aWZpY2F0ZVYyLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt0aGlzLmF0dHJUeXBlT2lkPVwiMS4yLjg0MC4xMTM1NDkuMS45LjE2LjIuNDdcIjt2YXIgYj1LSlVSLmFzbjE7dmFyIGY9S0pVUi5hc24xLng1MDk7dmFyIGQ9S0pVUi5hc24xLmNtczt2YXIgYz1LSlVSLmNyeXB0bzt0aGlzLnNldENlcnRzPWZ1bmN0aW9uKHAsaCl7dmFyIG49W107Zm9yKHZhciBsPTA7bDxwLmxlbmd0aDtsKyspe3ZhciBqPUtFWVVUSUwuZ2V0SGV4RnJvbVBFTShwW2xdKTt2YXIgcj1bXTtpZihoIT1cInNoYTI1NlwiKXtyLnB1c2gobmV3IGYuQWxnb3JpdGhtSWRlbnRpZmllcih7bmFtZTpofSkpfXZhciBnPWMuVXRpbC5oYXNoSGV4KGosaCk7dmFyIHE9bmV3IGIuREVST2N0ZXRTdHJpbmcoe2hleDpnfSk7cS5nZXRFbmNvZGVkSGV4KCk7ci5wdXNoKHEpO3ZhciBtPW5ldyBkLklzc3VlckFuZFNlcmlhbE51bWJlcih7Y2VydDpwW2xdfSk7bS5nZXRFbmNvZGVkSGV4KCk7ci5wdXNoKG0pO3ZhciBvPW5ldyBiLkRFUlNlcXVlbmNlKHthcnJheTpyfSk7by5nZXRFbmNvZGVkSGV4KCk7bi5wdXNoKG8pfXZhciBrPW5ldyBiLkRFUlNlcXVlbmNlKHthcnJheTpufSk7ay5nZXRFbmNvZGVkSGV4KCk7dGhpcy52YWx1ZUxpc3Q9W2tdfTtpZih0eXBlb2YgZSE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGUuYXJyYXk9PVwib2JqZWN0XCIpe3ZhciBhPVwic2hhMjU2XCI7aWYodHlwZW9mIGUuaGFzaEFsZz09XCJzdHJpbmdcIil7YT1lLmhhc2hBbGd9dGhpcy5zZXRDZXJ0cyhlLmFycmF5LGEpfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5jbXMuU2lnbmluZ0NlcnRpZmljYXRlVjIsS0pVUi5hc24xLmNtcy5BdHRyaWJ1dGUpO0tKVVIuYXNuMS5jbXMuSXNzdWVyQW5kU2VyaWFsTnVtYmVyPWZ1bmN0aW9uKGMpe0tKVVIuYXNuMS5jbXMuSXNzdWVyQW5kU2VyaWFsTnVtYmVyLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgZT1udWxsO3ZhciBiPW51bGw7dmFyIGE9S0pVUi5hc24xO3ZhciBkPWEueDUwOTt0aGlzLnNldEJ5Q2VydFBFTT1mdW5jdGlvbihpKXt2YXIgZz1LRVlVVElMLmdldEhleEZyb21QRU0oaSk7dmFyIGY9bmV3IFg1MDkoKTtmLmhleD1nO3ZhciBqPWYuZ2V0SXNzdWVySGV4KCk7dGhpcy5kSXNzdWVyPW5ldyBkLlg1MDBOYW1lKCk7dGhpcy5kSXNzdWVyLmhUTFY9ajt2YXIgaD1mLmdldFNlcmlhbE51bWJlckhleCgpO3RoaXMuZFNlcmlhbD1uZXcgYS5ERVJJbnRlZ2VyKHtoZXg6aH0pfTt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXt2YXIgZj1uZXcgS0pVUi5hc24xLkRFUlNlcXVlbmNlKHthcnJheTpbdGhpcy5kSXNzdWVyLHRoaXMuZFNlcmlhbF19KTt0aGlzLmhUTFY9Zi5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHRoaXMuaFRMVn07aWYodHlwZW9mIGMhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBjPT1cInN0cmluZ1wiJiZjLmluZGV4T2YoXCItLS0tLUJFR0lOIFwiKSE9LTEpe3RoaXMuc2V0QnlDZXJ0UEVNKGMpfWlmKGMuaXNzdWVyJiZjLnNlcmlhbCl7aWYoYy5pc3N1ZXIgaW5zdGFuY2VvZiBLSlVSLmFzbjEueDUwOS5YNTAwTmFtZSl7dGhpcy5kSXNzdWVyPWMuaXNzdWVyfWVsc2V7dGhpcy5kSXNzdWVyPW5ldyBLSlVSLmFzbjEueDUwOS5YNTAwTmFtZShjLmlzc3Vlcil9aWYoYy5zZXJpYWwgaW5zdGFuY2VvZiBLSlVSLmFzbjEuREVSSW50ZWdlcil7dGhpcy5kU2VyaWFsPWMuc2VyaWFsfWVsc2V7dGhpcy5kU2VyaWFsPW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcihjLnNlcmlhbCl9fWlmKHR5cGVvZiBjLmNlcnQ9PVwic3RyaW5nXCIpe3RoaXMuc2V0QnlDZXJ0UEVNKGMuY2VydCl9fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLmNtcy5Jc3N1ZXJBbmRTZXJpYWxOdW1iZXIsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS5jbXMuQXR0cmlidXRlTGlzdD1mdW5jdGlvbihhKXtLSlVSLmFzbjEuY21zLkF0dHJpYnV0ZUxpc3Quc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3RoaXMubGlzdD1uZXcgQXJyYXkoKTt0aGlzLnNvcnRGbGFnPXRydWU7dGhpcy5hZGQ9ZnVuY3Rpb24oYil7aWYoYiBpbnN0YW5jZW9mIEtKVVIuYXNuMS5jbXMuQXR0cmlidXRlKXt0aGlzLmxpc3QucHVzaChiKX19O3RoaXMubGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGlzdC5sZW5ndGh9O3RoaXMuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLmxpc3Q9bmV3IEFycmF5KCk7dGhpcy5oVExWPW51bGw7dGhpcy5oVj1udWxsfTt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXtpZih0eXBlb2YgdGhpcy5oVExWPT1cInN0cmluZ1wiKXtyZXR1cm4gdGhpcy5oVExWfXZhciBiPW5ldyBLSlVSLmFzbjEuREVSU2V0KHthcnJheTp0aGlzLmxpc3Qsc29ydGZsYWc6dGhpcy5zb3J0RmxhZ30pO3RoaXMuaFRMVj1iLmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdGhpcy5oVExWfTtpZih0eXBlb2YgYSE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGEuc29ydGZsYWchPVwidW5kZWZpbmVkXCImJmEuc29ydGZsYWc9PWZhbHNlKXt0aGlzLnNvcnRGbGFnPWZhbHNlfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5jbXMuQXR0cmlidXRlTGlzdCxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLmNtcy5TaWduZXJJbmZvPWZ1bmN0aW9uKGMpe0tKVVIuYXNuMS5jbXMuU2lnbmVySW5mby5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGE9S0pVUi5hc24xO3ZhciBiPUtKVVIuYXNuMS5jbXM7dmFyIGQ9S0pVUi5hc24xLng1MDk7dGhpcy5kQ01TVmVyc2lvbj1uZXcgYS5ERVJJbnRlZ2VyKHtcImludFwiOjF9KTt0aGlzLmRTaWduZXJJZGVudGlmaWVyPW51bGw7dGhpcy5kRGlnZXN0QWxnb3JpdGhtPW51bGw7dGhpcy5kU2lnbmVkQXR0cnM9bmV3IGIuQXR0cmlidXRlTGlzdCgpO3RoaXMuZFNpZ0FsZz1udWxsO3RoaXMuZFNpZz1udWxsO3RoaXMuZFVuc2lnbmVkQXR0cnM9bmV3IGIuQXR0cmlidXRlTGlzdCgpO3RoaXMuc2V0U2lnbmVySWRlbnRpZmllcj1mdW5jdGlvbihmKXtpZih0eXBlb2YgZj09XCJzdHJpbmdcIiYmZi5pbmRleE9mKFwiQ0VSVElGSUNBVEVcIikhPS0xJiZmLmluZGV4T2YoXCJCRUdJTlwiKSE9LTEmJmYuaW5kZXhPZihcIkVORFwiKSE9LTEpe3ZhciBlPWY7dGhpcy5kU2lnbmVySWRlbnRpZmllcj1uZXcgYi5Jc3N1ZXJBbmRTZXJpYWxOdW1iZXIoe2NlcnQ6Zn0pfX07dGhpcy5zZXRGb3JDb250ZW50QW5kSGFzaD1mdW5jdGlvbihlKXtpZih0eXBlb2YgZSE9XCJ1bmRlZmluZWRcIil7aWYoZS5lY2lPYmogaW5zdGFuY2VvZiBLSlVSLmFzbjEuY21zLkVuY2Fwc3VsYXRlZENvbnRlbnRJbmZvKXt0aGlzLmRTaWduZWRBdHRycy5hZGQobmV3IGIuQ29udGVudFR5cGUoe29pZDpcIjEuMi44NDAuMTEzNTQ5LjEuNy4xXCJ9KSk7dGhpcy5kU2lnbmVkQXR0cnMuYWRkKG5ldyBiLk1lc3NhZ2VEaWdlc3Qoe2VjaU9iajplLmVjaU9iaixoYXNoQWxnOmUuaGFzaEFsZ30pKX1pZih0eXBlb2YgZS5zZE9iaiE9XCJ1bmRlZmluZWRcIiYmZS5zZE9iaiBpbnN0YW5jZW9mIEtKVVIuYXNuMS5jbXMuU2lnbmVkRGF0YSl7aWYoZS5zZE9iai5kaWdlc3RBbGdOYW1lTGlzdC5qb2luKFwiOlwiKS5pbmRleE9mKGUuaGFzaEFsZyk9PS0xKXtlLnNkT2JqLmRpZ2VzdEFsZ05hbWVMaXN0LnB1c2goZS5oYXNoQWxnKX19aWYodHlwZW9mIGUuaGFzaEFsZz09XCJzdHJpbmdcIil7dGhpcy5kRGlnZXN0QWxnb3JpdGhtPW5ldyBkLkFsZ29yaXRobUlkZW50aWZpZXIoe25hbWU6ZS5oYXNoQWxnfSl9fX07dGhpcy5zaWduPWZ1bmN0aW9uKGosZil7dGhpcy5kU2lnQWxnPW5ldyBkLkFsZ29yaXRobUlkZW50aWZpZXIoe25hbWU6Zn0pO3ZhciBnPXRoaXMuZFNpZ25lZEF0dHJzLmdldEVuY29kZWRIZXgoKTt2YXIgZT1LRVlVVElMLmdldEtleShqKTt2YXIgaT1uZXcgS0pVUi5jcnlwdG8uU2lnbmF0dXJlKHthbGc6Zn0pO2kuaW5pdChlKTtpLnVwZGF0ZUhleChnKTt2YXIgaD1pLnNpZ24oKTt0aGlzLmRTaWc9bmV3IGEuREVST2N0ZXRTdHJpbmcoe2hleDpofSl9O3RoaXMuYWRkVW5zaWduZWQ9ZnVuY3Rpb24oZSl7dGhpcy5oVExWPW51bGw7dGhpcy5kVW5zaWduZWRBdHRycy5oVExWPW51bGw7dGhpcy5kVW5zaWduZWRBdHRycy5hZGQoZSl9O3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe2lmKHRoaXMuZFNpZ25lZEF0dHJzIGluc3RhbmNlb2YgS0pVUi5hc24xLmNtcy5BdHRyaWJ1dGVMaXN0JiZ0aGlzLmRTaWduZWRBdHRycy5sZW5ndGgoKT09MCl7dGhyb3dcIlNpZ25lZEF0dHJzIGxlbmd0aCA9IDAgKGVtcHR5KVwifXZhciBlPW5ldyBhLkRFUlRhZ2dlZE9iamVjdCh7b2JqOnRoaXMuZFNpZ25lZEF0dHJzLHRhZzpcImEwXCIsZXhwbGljaXQ6ZmFsc2V9KTt2YXIgaD1udWxsO2lmKHRoaXMuZFVuc2lnbmVkQXR0cnMubGVuZ3RoKCk+MCl7aD1uZXcgYS5ERVJUYWdnZWRPYmplY3Qoe29iajp0aGlzLmRVbnNpZ25lZEF0dHJzLHRhZzpcImExXCIsZXhwbGljaXQ6ZmFsc2V9KX12YXIgZz1bdGhpcy5kQ01TVmVyc2lvbix0aGlzLmRTaWduZXJJZGVudGlmaWVyLHRoaXMuZERpZ2VzdEFsZ29yaXRobSxlLHRoaXMuZFNpZ0FsZyx0aGlzLmRTaWcsXTtpZihoIT1udWxsKXtnLnB1c2goaCl9dmFyIGY9bmV3IGEuREVSU2VxdWVuY2Uoe2FycmF5Omd9KTt0aGlzLmhUTFY9Zi5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHRoaXMuaFRMVn19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5jbXMuU2lnbmVySW5mbyxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLmNtcy5FbmNhcHN1bGF0ZWRDb250ZW50SW5mbz1mdW5jdGlvbihjKXtLSlVSLmFzbjEuY21zLkVuY2Fwc3VsYXRlZENvbnRlbnRJbmZvLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYT1LSlVSLmFzbjE7dmFyIGI9S0pVUi5hc24xLmNtczt2YXIgZD1LSlVSLmFzbjEueDUwOTt0aGlzLmRFQ29udGVudFR5cGU9bmV3IGEuREVST2JqZWN0SWRlbnRpZmllcih7bmFtZTpcImRhdGFcIn0pO3RoaXMuZEVDb250ZW50PW51bGw7dGhpcy5pc0RldGFjaGVkPWZhbHNlO3RoaXMuZUNvbnRlbnRWYWx1ZUhleD1udWxsO3RoaXMuc2V0Q29udGVudFR5cGU9ZnVuY3Rpb24oZSl7aWYoZS5tYXRjaCgvXlswLTJdWy5dWzAtOS5dKyQvKSl7dGhpcy5kRUNvbnRlbnRUeXBlPW5ldyBhLkRFUk9iamVjdElkZW50aWZpZXIoe29pZDplfSl9ZWxzZXt0aGlzLmRFQ29udGVudFR5cGU9bmV3IGEuREVST2JqZWN0SWRlbnRpZmllcih7bmFtZTplfSl9fTt0aGlzLnNldENvbnRlbnRWYWx1ZT1mdW5jdGlvbihlKXtpZih0eXBlb2YgZSE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGUuaGV4PT1cInN0cmluZ1wiKXt0aGlzLmVDb250ZW50VmFsdWVIZXg9ZS5oZXh9ZWxzZXtpZih0eXBlb2YgZS5zdHI9PVwic3RyaW5nXCIpe3RoaXMuZUNvbnRlbnRWYWx1ZUhleD11dGY4dG9oZXgoZS5zdHIpfX19fTt0aGlzLnNldENvbnRlbnRWYWx1ZUhleD1mdW5jdGlvbihlKXt0aGlzLmVDb250ZW50VmFsdWVIZXg9ZX07dGhpcy5zZXRDb250ZW50VmFsdWVTdHI9ZnVuY3Rpb24oZSl7dGhpcy5lQ29udGVudFZhbHVlSGV4PXV0Zjh0b2hleChlKX07dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7aWYodHlwZW9mIHRoaXMuZUNvbnRlbnRWYWx1ZUhleCE9XCJzdHJpbmdcIil7dGhyb3dcImVDb250ZW50VmFsdWUgbm90IHlldCBzZXRcIn12YXIgZz1uZXcgYS5ERVJPY3RldFN0cmluZyh7aGV4OnRoaXMuZUNvbnRlbnRWYWx1ZUhleH0pO3RoaXMuZEVDb250ZW50PW5ldyBhLkRFUlRhZ2dlZE9iamVjdCh7b2JqOmcsdGFnOlwiYTBcIixleHBsaWNpdDp0cnVlfSk7dmFyIGU9W3RoaXMuZEVDb250ZW50VHlwZV07aWYoIXRoaXMuaXNEZXRhY2hlZCl7ZS5wdXNoKHRoaXMuZEVDb250ZW50KX12YXIgZj1uZXcgYS5ERVJTZXF1ZW5jZSh7YXJyYXk6ZX0pO3RoaXMuaFRMVj1mLmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdGhpcy5oVExWfX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLmNtcy5FbmNhcHN1bGF0ZWRDb250ZW50SW5mbyxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLmNtcy5Db250ZW50SW5mbz1mdW5jdGlvbihjKXtLSlVSLmFzbjEuY21zLkNvbnRlbnRJbmZvLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYT1LSlVSLmFzbjE7dmFyIGI9S0pVUi5hc24xLmNtczt2YXIgZD1LSlVSLmFzbjEueDUwOTt0aGlzLmRDb250ZW50VHlwZT1udWxsO3RoaXMuZENvbnRlbnQ9bnVsbDt0aGlzLnNldENvbnRlbnRUeXBlPWZ1bmN0aW9uKGUpe2lmKHR5cGVvZiBlPT1cInN0cmluZ1wiKXt0aGlzLmRDb250ZW50VHlwZT1kLk9JRC5uYW1lMm9iaihlKX19O3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe3ZhciBmPW5ldyBhLkRFUlRhZ2dlZE9iamVjdCh7b2JqOnRoaXMuZENvbnRlbnQsdGFnOlwiYTBcIixleHBsaWNpdDp0cnVlfSk7dmFyIGU9bmV3IGEuREVSU2VxdWVuY2Uoe2FycmF5Olt0aGlzLmRDb250ZW50VHlwZSxmXX0pO3RoaXMuaFRMVj1lLmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdGhpcy5oVExWfTtpZih0eXBlb2YgYyE9XCJ1bmRlZmluZWRcIil7aWYoYy50eXBlKXt0aGlzLnNldENvbnRlbnRUeXBlKGMudHlwZSl9aWYoYy5vYmomJmMub2JqIGluc3RhbmNlb2YgYS5BU04xT2JqZWN0KXt0aGlzLmRDb250ZW50PWMub2JqfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5jbXMuQ29udGVudEluZm8sS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS5jbXMuU2lnbmVkRGF0YT1mdW5jdGlvbihjKXtLSlVSLmFzbjEuY21zLlNpZ25lZERhdGEuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBhPUtKVVIuYXNuMTt2YXIgYj1LSlVSLmFzbjEuY21zO3ZhciBkPUtKVVIuYXNuMS54NTA5O3RoaXMuZENNU1ZlcnNpb249bmV3IGEuREVSSW50ZWdlcih7XCJpbnRcIjoxfSk7dGhpcy5kRGlnZXN0QWxncz1udWxsO3RoaXMuZGlnZXN0QWxnTmFtZUxpc3Q9W107dGhpcy5kRW5jYXBDb250ZW50SW5mbz1uZXcgYi5FbmNhcHN1bGF0ZWRDb250ZW50SW5mbygpO3RoaXMuZENlcnRzPW51bGw7dGhpcy5jZXJ0aWZpY2F0ZUxpc3Q9W107dGhpcy5jcmxMaXN0PVtdO3RoaXMuc2lnbmVySW5mb0xpc3Q9W25ldyBiLlNpZ25lckluZm8oKV07dGhpcy5hZGRDZXJ0aWZpY2F0ZXNCeVBFTT1mdW5jdGlvbihlKXt2YXIgZj1LRVlVVElMLmdldEhleEZyb21QRU0oZSk7dmFyIGc9bmV3IGEuQVNOMU9iamVjdCgpO2cuaFRMVj1mO3RoaXMuY2VydGlmaWNhdGVMaXN0LnB1c2goZyl9O3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe2lmKHR5cGVvZiB0aGlzLmhUTFY9PVwic3RyaW5nXCIpe3JldHVybiB0aGlzLmhUTFZ9aWYodGhpcy5kRGlnZXN0QWxncz09bnVsbCl7dmFyIGs9W107Zm9yKHZhciBqPTA7ajx0aGlzLmRpZ2VzdEFsZ05hbWVMaXN0Lmxlbmd0aDtqKyspe3ZhciBoPXRoaXMuZGlnZXN0QWxnTmFtZUxpc3Rbal07dmFyIG09bmV3IGQuQWxnb3JpdGhtSWRlbnRpZmllcih7bmFtZTpofSk7ay5wdXNoKG0pfXRoaXMuZERpZ2VzdEFsZ3M9bmV3IGEuREVSU2V0KHthcnJheTprfSl9dmFyIGU9W3RoaXMuZENNU1ZlcnNpb24sdGhpcy5kRGlnZXN0QWxncyx0aGlzLmRFbmNhcENvbnRlbnRJbmZvXTtpZih0aGlzLmRDZXJ0cz09bnVsbCl7aWYodGhpcy5jZXJ0aWZpY2F0ZUxpc3QubGVuZ3RoPjApe3ZhciBsPW5ldyBhLkRFUlNldCh7YXJyYXk6dGhpcy5jZXJ0aWZpY2F0ZUxpc3R9KTt0aGlzLmRDZXJ0cz1uZXcgYS5ERVJUYWdnZWRPYmplY3Qoe29iajpsLHRhZzpcImEwXCIsZXhwbGljaXQ6ZmFsc2V9KX19aWYodGhpcy5kQ2VydHMhPW51bGwpe2UucHVzaCh0aGlzLmRDZXJ0cyl9dmFyIGc9bmV3IGEuREVSU2V0KHthcnJheTp0aGlzLnNpZ25lckluZm9MaXN0fSk7ZS5wdXNoKGcpO3ZhciBmPW5ldyBhLkRFUlNlcXVlbmNlKHthcnJheTplfSk7dGhpcy5oVExWPWYuZ2V0RW5jb2RlZEhleCgpO3JldHVybiB0aGlzLmhUTFZ9O3RoaXMuZ2V0Q29udGVudEluZm89ZnVuY3Rpb24oKXt0aGlzLmdldEVuY29kZWRIZXgoKTt2YXIgZT1uZXcgYi5Db250ZW50SW5mbyh7dHlwZTpcInNpZ25lZC1kYXRhXCIsb2JqOnRoaXN9KTtyZXR1cm4gZX07dGhpcy5nZXRDb250ZW50SW5mb0VuY29kZWRIZXg9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdldENvbnRlbnRJbmZvKCk7dmFyIGY9ZS5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIGZ9O3RoaXMuZ2V0UEVNPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5nZXRDb250ZW50SW5mb0VuY29kZWRIZXgoKTt2YXIgZj1hLkFTTjFVdGlsLmdldFBFTVN0cmluZ0Zyb21IZXgoZSxcIkNNU1wiKTtyZXR1cm4gZn19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5jbXMuU2lnbmVkRGF0YSxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLmNtcy5DTVNVdGlsPW5ldyBmdW5jdGlvbigpe307S0pVUi5hc24xLmNtcy5DTVNVdGlsLm5ld1NpZ25lZERhdGE9ZnVuY3Rpb24oYSl7dmFyIGg9S0pVUi5hc24xLmNtczt2YXIgZz1LSlVSLmFzbjEuY2FkZXM7dmFyIGY9bmV3IGguU2lnbmVkRGF0YSgpO2YuZEVuY2FwQ29udGVudEluZm8uc2V0Q29udGVudFZhbHVlKGEuY29udGVudCk7aWYodHlwZW9mIGEuY2VydHM9PVwib2JqZWN0XCIpe2Zvcih2YXIgYj0wO2I8YS5jZXJ0cy5sZW5ndGg7YisrKXtmLmFkZENlcnRpZmljYXRlc0J5UEVNKGEuY2VydHNbYl0pfX1mLnNpZ25lckluZm9MaXN0PVtdO2Zvcih2YXIgYj0wO2I8YS5zaWduZXJJbmZvcy5sZW5ndGg7YisrKXt2YXIgZD1hLnNpZ25lckluZm9zW2JdO3ZhciBjPW5ldyBoLlNpZ25lckluZm8oKTtjLnNldFNpZ25lcklkZW50aWZpZXIoZC5zaWduZXJDZXJ0KTtjLnNldEZvckNvbnRlbnRBbmRIYXNoKHtzZE9iajpmLGVjaU9iajpmLmRFbmNhcENvbnRlbnRJbmZvLGhhc2hBbGc6ZC5oYXNoQWxnfSk7Zm9yKGF0dHJOYW1lIGluIGQuc0F0dHIpe3ZhciBqPWQuc0F0dHJbYXR0ck5hbWVdO2lmKGF0dHJOYW1lPT1cIlNpZ25pbmdUaW1lXCIpe3ZhciBlPW5ldyBoLlNpZ25pbmdUaW1lKGopO2MuZFNpZ25lZEF0dHJzLmFkZChlKX1pZihhdHRyTmFtZT09XCJTaWduaW5nQ2VydGlmaWNhdGVcIil7dmFyIGU9bmV3IGguU2lnbmluZ0NlcnRpZmljYXRlKGopO2MuZFNpZ25lZEF0dHJzLmFkZChlKX1pZihhdHRyTmFtZT09XCJTaWduaW5nQ2VydGlmaWNhdGVWMlwiKXt2YXIgZT1uZXcgaC5TaWduaW5nQ2VydGlmaWNhdGVWMihqKTtjLmRTaWduZWRBdHRycy5hZGQoZSl9aWYoYXR0ck5hbWU9PVwiU2lnbmF0dXJlUG9saWN5SWRlbnRpZmllclwiKXt2YXIgZT1uZXcgZy5TaWduYXR1cmVQb2xpY3lJZGVudGlmaWVyKGopO2MuZFNpZ25lZEF0dHJzLmFkZChlKX19Yy5zaWduKGQuc2lnbmVyUHJ2S2V5LGQuc2lnQWxnKTtmLnNpZ25lckluZm9MaXN0LnB1c2goYyl9cmV0dXJuIGZ9O1xuLyohIGFzbjF0c3AtMS4wLjEuanMgKGMpIDIwMTQgS2VuamkgVXJ1c2hpbWEgfCBranVyLmdpdGh1Yi5jb20vanNyc2FzaWduL2xpY2Vuc2VcbiAqL1xuaWYodHlwZW9mIEtKVVI9PVwidW5kZWZpbmVkXCJ8fCFLSlVSKXtLSlVSPXt9fWlmKHR5cGVvZiBLSlVSLmFzbjE9PVwidW5kZWZpbmVkXCJ8fCFLSlVSLmFzbjEpe0tKVVIuYXNuMT17fX1pZih0eXBlb2YgS0pVUi5hc24xLnRzcD09XCJ1bmRlZmluZWRcInx8IUtKVVIuYXNuMS50c3Ape0tKVVIuYXNuMS50c3A9e319S0pVUi5hc24xLnRzcC5BY2N1cmFjeT1mdW5jdGlvbihiKXtLSlVSLmFzbjEudHNwLkFjY3VyYWN5LnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYT1LSlVSLmFzbjE7dGhpcy5zZWNvbmRzPW51bGw7dGhpcy5taWxsaXM9bnVsbDt0aGlzLm1pY3Jvcz1udWxsO3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe3ZhciBlPW51bGw7dmFyIGc9bnVsbDt2YXIgaT1udWxsO3ZhciBjPVtdO2lmKHRoaXMuc2Vjb25kcyE9bnVsbCl7ZT1uZXcgYS5ERVJJbnRlZ2VyKHtcImludFwiOnRoaXMuc2Vjb25kc30pO2MucHVzaChlKX1pZih0aGlzLm1pbGxpcyE9bnVsbCl7dmFyIGg9bmV3IGEuREVSSW50ZWdlcih7XCJpbnRcIjp0aGlzLm1pbGxpc30pO2c9bmV3IGEuREVSVGFnZ2VkT2JqZWN0KHtvYmo6aCx0YWc6XCI4MFwiLGV4cGxpY2l0OmZhbHNlfSk7Yy5wdXNoKGcpfWlmKHRoaXMubWljcm9zIT1udWxsKXt2YXIgZj1uZXcgYS5ERVJJbnRlZ2VyKHtcImludFwiOnRoaXMubWljcm9zfSk7aT1uZXcgYS5ERVJUYWdnZWRPYmplY3Qoe29iajpmLHRhZzpcIjgxXCIsZXhwbGljaXQ6ZmFsc2V9KTtjLnB1c2goaSl9dmFyIGQ9bmV3IGEuREVSU2VxdWVuY2Uoe2FycmF5OmN9KTt0aGlzLmhUTFY9ZC5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHRoaXMuaFRMVn07aWYodHlwZW9mIGIhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBiLnNlY29uZHM9PVwibnVtYmVyXCIpe3RoaXMuc2Vjb25kcz1iLnNlY29uZHN9aWYodHlwZW9mIGIubWlsbGlzPT1cIm51bWJlclwiKXt0aGlzLm1pbGxpcz1iLm1pbGxpc31pZih0eXBlb2YgYi5taWNyb3M9PVwibnVtYmVyXCIpe3RoaXMubWljcm9zPWIubWljcm9zfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS50c3AuQWNjdXJhY3ksS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS50c3AuTWVzc2FnZUltcHJpbnQ9ZnVuY3Rpb24oYil7S0pVUi5hc24xLnRzcC5NZXNzYWdlSW1wcmludC5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGE9S0pVUi5hc24xO3ZhciBjPUtKVVIuYXNuMS54NTA5O3RoaXMuZEhhc2hBbGc9bnVsbDt0aGlzLmRIYXNoVmFsdWU9bnVsbDt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXtpZih0eXBlb2YgdGhpcy5oVExWPT1cInN0cmluZ1wiKXtyZXR1cm4gdGhpcy5oVExWfXZhciBkPW5ldyBhLkRFUlNlcXVlbmNlKHthcnJheTpbdGhpcy5kSGFzaEFsZyx0aGlzLmRIYXNoVmFsdWVdfSk7cmV0dXJuIGQuZ2V0RW5jb2RlZEhleCgpfTtpZih0eXBlb2YgYiE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGIuaGFzaEFsZz09XCJzdHJpbmdcIil7dGhpcy5kSGFzaEFsZz1uZXcgYy5BbGdvcml0aG1JZGVudGlmaWVyKHtuYW1lOmIuaGFzaEFsZ30pfWlmKHR5cGVvZiBiLmhhc2hWYWx1ZT09XCJzdHJpbmdcIil7dGhpcy5kSGFzaFZhbHVlPW5ldyBhLkRFUk9jdGV0U3RyaW5nKHtoZXg6Yi5oYXNoVmFsdWV9KX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEudHNwLk1lc3NhZ2VJbXByaW50LEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEudHNwLlRpbWVTdGFtcFJlcT1mdW5jdGlvbihjKXtLSlVSLmFzbjEudHNwLlRpbWVTdGFtcFJlcS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGE9S0pVUi5hc24xO3ZhciBiPUtKVVIuYXNuMS50c3A7dGhpcy5kVmVyc2lvbj1uZXcgYS5ERVJJbnRlZ2VyKHtcImludFwiOjF9KTt0aGlzLmRNZXNzYWdlSW1wcmludD1udWxsO3RoaXMuZFBvbGljeT1udWxsO3RoaXMuZE5vbmNlPW51bGw7dGhpcy5jZXJ0UmVxPXRydWU7dGhpcy5zZXRNZXNzYWdlSW1wcmludD1mdW5jdGlvbihkKXtpZihkIGluc3RhbmNlb2YgS0pVUi5hc24xLnRzcC5NZXNzYWdlSW1wcmludCl7dGhpcy5kTWVzc2FnZUltcHJpbnQ9ZDtyZXR1cm59aWYodHlwZW9mIGQ9PVwib2JqZWN0XCIpe3RoaXMuZE1lc3NhZ2VJbXByaW50PW5ldyBiLk1lc3NhZ2VJbXByaW50KGQpfX07dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7aWYodGhpcy5kTWVzc2FnZUltcHJpbnQ9PW51bGwpe3Rocm93XCJtZXNzYWdlSW1wcmludCBzaGFsbCBiZSBzcGVjaWZpZWRcIn12YXIgZD1bdGhpcy5kVmVyc2lvbix0aGlzLmRNZXNzYWdlSW1wcmludF07aWYodGhpcy5kUG9saWN5IT1udWxsKXtkLnB1c2godGhpcy5kUG9saWN5KX1pZih0aGlzLmROb25jZSE9bnVsbCl7ZC5wdXNoKHRoaXMuZE5vbmNlKX1pZih0aGlzLmNlcnRSZXEpe2QucHVzaChuZXcgYS5ERVJCb29sZWFuKCkpfXZhciBlPW5ldyBhLkRFUlNlcXVlbmNlKHthcnJheTpkfSk7dGhpcy5oVExWPWUuZ2V0RW5jb2RlZEhleCgpO3JldHVybiB0aGlzLmhUTFZ9O2lmKHR5cGVvZiBjIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYy5taT09XCJvYmplY3RcIil7dGhpcy5zZXRNZXNzYWdlSW1wcmludChjLm1pKX1pZih0eXBlb2YgYy5wb2xpY3k9PVwib2JqZWN0XCIpe3RoaXMuZFBvbGljeT1uZXcgYS5ERVJPYmplY3RJZGVudGlmaWVyKGMucG9saWN5KX1pZih0eXBlb2YgYy5ub25jZT09XCJvYmplY3RcIil7dGhpcy5kTm9uY2U9bmV3IGEuREVSSW50ZWdlcihjLm5vbmNlKX1pZih0eXBlb2YgYy5jZXJ0cmVxPT1cImJvb2xlYW5cIil7dGhpcy5jZXJ0UmVxPWMuY2VydHJlcX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEudHNwLlRpbWVTdGFtcFJlcSxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLnRzcC5UU1RJbmZvPWZ1bmN0aW9uKGMpe0tKVVIuYXNuMS50c3AuVFNUSW5mby5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGE9S0pVUi5hc24xO3ZhciBkPUtKVVIuYXNuMS54NTA5O3ZhciBiPUtKVVIuYXNuMS50c3A7dGhpcy5kVmVyc2lvbj1uZXcgYS5ERVJJbnRlZ2VyKHtcImludFwiOjF9KTt0aGlzLmRQb2xpY3k9bnVsbDt0aGlzLmRNZXNzYWdlSW1wcmludD1udWxsO3RoaXMuZFNlcmlhbE51bWJlcj1udWxsO3RoaXMuZEdlblRpbWU9bnVsbDt0aGlzLmRBY2N1cmFjeT1udWxsO3RoaXMuZE9yZGVyaW5nPW51bGw7dGhpcy5kTm9uY2U9bnVsbDt0aGlzLmRUc2E9bnVsbDt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXt2YXIgZT1bdGhpcy5kVmVyc2lvbl07aWYodGhpcy5kUG9saWN5PT1udWxsKXt0aHJvd1wicG9saWN5IHNoYWxsIGJlIHNwZWNpZmllZC5cIn1lLnB1c2godGhpcy5kUG9saWN5KTtpZih0aGlzLmRNZXNzYWdlSW1wcmludD09bnVsbCl7dGhyb3dcIm1lc3NhZ2VJbXByaW50IHNoYWxsIGJlIHNwZWNpZmllZC5cIn1lLnB1c2godGhpcy5kTWVzc2FnZUltcHJpbnQpO2lmKHRoaXMuZFNlcmlhbE51bWJlcj09bnVsbCl7dGhyb3dcInNlcmlhbE51bWJlciBzaGFsbCBiZSBzcGVjaWZpZWQuXCJ9ZS5wdXNoKHRoaXMuZFNlcmlhbE51bWJlcik7aWYodGhpcy5kR2VuVGltZT09bnVsbCl7dGhyb3dcImdlblRpbWUgc2hhbGwgYmUgc3BlY2lmaWVkLlwifWUucHVzaCh0aGlzLmRHZW5UaW1lKTtpZih0aGlzLmRBY2N1cmFjeSE9bnVsbCl7ZS5wdXNoKHRoaXMuZEFjY3VyYWN5KX1pZih0aGlzLmRPcmRlcmluZyE9bnVsbCl7ZS5wdXNoKHRoaXMuZE9yZGVyaW5nKX1pZih0aGlzLmROb25jZSE9bnVsbCl7ZS5wdXNoKHRoaXMuZE5vbmNlKX1pZih0aGlzLmRUc2EhPW51bGwpe2UucHVzaCh0aGlzLmRUc2EpfXZhciBmPW5ldyBhLkRFUlNlcXVlbmNlKHthcnJheTplfSk7dGhpcy5oVExWPWYuZ2V0RW5jb2RlZEhleCgpO3JldHVybiB0aGlzLmhUTFZ9O2lmKHR5cGVvZiBjIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYy5wb2xpY3k9PVwic3RyaW5nXCIpe2lmKCFjLnBvbGljeS5tYXRjaCgvXlswLTkuXSskLykpe3Rocm93XCJwb2xpY3kgc2hhbGwgYmUgb2lkIGxpa2UgMC4xLjQuMTM0XCJ9dGhpcy5kUG9saWN5PW5ldyBhLkRFUk9iamVjdElkZW50aWZpZXIoe29pZDpjLnBvbGljeX0pfWlmKHR5cGVvZiBjLm1lc3NhZ2VJbXByaW50IT1cInVuZGVmaW5lZFwiKXt0aGlzLmRNZXNzYWdlSW1wcmludD1uZXcgYi5NZXNzYWdlSW1wcmludChjLm1lc3NhZ2VJbXByaW50KX1pZih0eXBlb2YgYy5zZXJpYWxOdW1iZXIhPVwidW5kZWZpbmVkXCIpe3RoaXMuZFNlcmlhbE51bWJlcj1uZXcgYS5ERVJJbnRlZ2VyKGMuc2VyaWFsTnVtYmVyKX1pZih0eXBlb2YgYy5nZW5UaW1lIT1cInVuZGVmaW5lZFwiKXt0aGlzLmRHZW5UaW1lPW5ldyBhLkRFUkdlbmVyYWxpemVkVGltZShjLmdlblRpbWUpfWlmKHR5cGVvZiBjLmFjY3VyYWN5IT1cInVuZGVmaW5kXCIpe3RoaXMuZEFjY3VyYWN5PW5ldyBiLkFjY3VyYWN5KGMuYWNjdXJhY3kpfWlmKHR5cGVvZiBjLm9yZGVyaW5nIT1cInVuZGVmaW5lZFwiJiZjLm9yZGVyaW5nPT10cnVlKXt0aGlzLmRPcmRlcmluZz1uZXcgYS5ERVJCb29sZWFuKCl9aWYodHlwZW9mIGMubm9uY2UhPVwidW5kZWZpbmVkXCIpe3RoaXMuZE5vbmNlPW5ldyBhLkRFUkludGVnZXIoYy5ub25jZSl9aWYodHlwZW9mIGMudHNhIT1cInVuZGVmaW5lZFwiKXt0aGlzLmRUc2E9bmV3IGQuWDUwME5hbWUoYy50c2EpfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS50c3AuVFNUSW5mbyxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLnRzcC5UaW1lU3RhbXBSZXNwPWZ1bmN0aW9uKGMpe0tKVVIuYXNuMS50c3AuVGltZVN0YW1wUmVzcC5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGE9S0pVUi5hc24xO3ZhciBiPUtKVVIuYXNuMS50c3A7dGhpcy5kU3RhdHVzPW51bGw7dGhpcy5kVFNUPW51bGw7dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7aWYodGhpcy5kU3RhdHVzPT1udWxsKXt0aHJvd1wic3RhdHVzIHNoYWxsIGJlIHNwZWNpZmllZFwifXZhciBkPVt0aGlzLmRTdGF0dXNdO2lmKHRoaXMuZFRTVCE9bnVsbCl7ZC5wdXNoKHRoaXMuZFRTVCl9dmFyIGU9bmV3IGEuREVSU2VxdWVuY2Uoe2FycmF5OmR9KTt0aGlzLmhUTFY9ZS5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHRoaXMuaFRMVn07aWYodHlwZW9mIGMhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBjLnN0YXR1cz09XCJvYmplY3RcIil7dGhpcy5kU3RhdHVzPW5ldyBiLlBLSVN0YXR1c0luZm8oYy5zdGF0dXMpfWlmKHR5cGVvZiBjLnRzdCE9XCJ1bmRlZmluZWRcIiYmYy50c3QgaW5zdGFuY2VvZiBLSlVSLmFzbjEuQVNOMU9iamVjdCl7dGhpcy5kVFNUPWMudHN0LmdldENvbnRlbnRJbmZvKCl9fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLnRzcC5UaW1lU3RhbXBSZXNwLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEudHNwLlBLSVN0YXR1c0luZm89ZnVuY3Rpb24oYyl7S0pVUi5hc24xLnRzcC5QS0lTdGF0dXNJbmZvLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYT1LSlVSLmFzbjE7dmFyIGI9S0pVUi5hc24xLnRzcDt0aGlzLmRTdGF0dXM9bnVsbDt0aGlzLmRTdGF0dXNTdHJpbmc9bnVsbDt0aGlzLmRGYWlsdXJlSW5mbz1udWxsO3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe2lmKHRoaXMuZFN0YXR1cz09bnVsbCl7dGhyb3dcInN0YXR1cyBzaGFsbCBiZSBzcGVjaWZpZWRcIn12YXIgZD1bdGhpcy5kU3RhdHVzXTtpZih0aGlzLmRTdGF0dXNTdHJpbmchPW51bGwpe2QucHVzaCh0aGlzLmRTdGF0dXNTdHJpbmcpfWlmKHRoaXMuZEZhaWx1cmVJbmZvIT1udWxsKXtkLnB1c2godGhpcy5kRmFpbHVyZUluZm8pfXZhciBlPW5ldyBhLkRFUlNlcXVlbmNlKHthcnJheTpkfSk7dGhpcy5oVExWPWUuZ2V0RW5jb2RlZEhleCgpO3JldHVybiB0aGlzLmhUTFZ9O2lmKHR5cGVvZiBjIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYy5zdGF0dXM9PVwib2JqZWN0XCIpe3RoaXMuZFN0YXR1cz1uZXcgYi5QS0lTdGF0dXMoYy5zdGF0dXMpfWlmKHR5cGVvZiBjLnN0YXRzdHI9PVwib2JqZWN0XCIpe3RoaXMuZFN0YXR1c1N0cmluZz1uZXcgYi5QS0lGcmVlVGV4dCh7YXJyYXk6Yy5zdGF0c3RyfSl9aWYodHlwZW9mIGMuZmFpbGluZm89PVwib2JqZWN0XCIpe3RoaXMuZEZhaWx1cmVJbmZvPW5ldyBiLlBLSUZhaWx1cmVJbmZvKGMuZmFpbGluZm8pfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS50c3AuUEtJU3RhdHVzSW5mbyxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLnRzcC5QS0lTdGF0dXM9ZnVuY3Rpb24oZSl7S0pVUi5hc24xLnRzcC5QS0lTdGF0dXMuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBhPUtKVVIuYXNuMTt2YXIgYj1LSlVSLmFzbjEudHNwO3ZhciBkPW51bGw7dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7dGhpcy5oVExWPXRoaXMuZFN0YXR1cy5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHRoaXMuaFRMVn07aWYodHlwZW9mIGUhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBlLm5hbWUhPVwidW5kZWZpbmVkXCIpe3ZhciBjPWIuUEtJU3RhdHVzLnZhbHVlTGlzdDtpZih0eXBlb2YgY1tlLm5hbWVdPT1cInVuZGVmaW5lZFwiKXt0aHJvd1wibmFtZSB1bmRlZmluZWQ6IFwiK2UubmFtZX10aGlzLmRTdGF0dXM9bmV3IGEuREVSSW50ZWdlcih7XCJpbnRcIjpjW2UubmFtZV19KX1lbHNle3RoaXMuZFN0YXR1cz1uZXcgYS5ERVJJbnRlZ2VyKGUpfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS50c3AuUEtJU3RhdHVzLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEudHNwLlBLSVN0YXR1cy52YWx1ZUxpc3Q9e2dyYW50ZWQ6MCxncmFudGVkV2l0aE1vZHM6MSxyZWplY3Rpb246Mix3YWl0aW5nOjMscmV2b2NhdGlvbldhcm5pbmc6NCxyZXZvY2F0aW9uTm90aWZpY2F0aW9uOjV9O0tKVVIuYXNuMS50c3AuUEtJRnJlZVRleHQ9ZnVuY3Rpb24oYil7S0pVUi5hc24xLnRzcC5QS0lGcmVlVGV4dC5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGE9S0pVUi5hc24xO3RoaXMudGV4dExpc3Q9W107dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7dmFyIGM9W107Zm9yKHZhciBlPTA7ZTx0aGlzLnRleHRMaXN0Lmxlbmd0aDtlKyspe2MucHVzaChuZXcgYS5ERVJVVEY4U3RyaW5nKHtzdHI6dGhpcy50ZXh0TGlzdFtlXX0pKX12YXIgZD1uZXcgYS5ERVJTZXF1ZW5jZSh7YXJyYXk6Y30pO3RoaXMuaFRMVj1kLmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdGhpcy5oVExWfTtpZih0eXBlb2YgYiE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGIuYXJyYXk9PVwib2JqZWN0XCIpe3RoaXMudGV4dExpc3Q9Yi5hcnJheX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEudHNwLlBLSUZyZWVUZXh0LEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEudHNwLlBLSUZhaWx1cmVJbmZvPWZ1bmN0aW9uKGQpe0tKVVIuYXNuMS50c3AuUEtJRmFpbHVyZUluZm8uc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBhPUtKVVIuYXNuMTt2YXIgYj1LSlVSLmFzbjEudHNwO3RoaXMudmFsdWU9bnVsbDt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXtpZih0aGlzLnZhbHVlPT1udWxsKXt0aHJvd1widmFsdWUgc2hhbGwgYmUgc3BlY2lmaWVkXCJ9dmFyIGU9bmV3IE51bWJlcih0aGlzLnZhbHVlKS50b1N0cmluZygyKTt2YXIgZj1uZXcgYS5ERVJCaXRTdHJpbmcoKTtmLnNldEJ5QmluYXJ5U3RyaW5nKGUpO3RoaXMuaFRMVj1mLmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdGhpcy5oVExWfTtpZih0eXBlb2YgZCE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGQubmFtZT09XCJzdHJpbmdcIil7dmFyIGM9Yi5QS0lGYWlsdXJlSW5mby52YWx1ZUxpc3Q7aWYodHlwZW9mIGNbZC5uYW1lXT09XCJ1bmRlZmluZWRcIil7dGhyb3dcIm5hbWUgdW5kZWZpbmVkOiBcIitkLm5hbWV9dGhpcy52YWx1ZT1jW2QubmFtZV19ZWxzZXtpZih0eXBlb2YgZFtcImludFwiXT09XCJudW1iZXJcIil7dGhpcy52YWx1ZT1kW1wiaW50XCJdfX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEudHNwLlBLSUZhaWx1cmVJbmZvLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEudHNwLlBLSUZhaWx1cmVJbmZvLnZhbHVlTGlzdD17YmFkQWxnOjAsYmFkUmVxdWVzdDoyLGJhZERhdGFGb3JtYXQ6NSx0aW1lTm90QXZhaWxhYmxlOjE0LHVuYWNjZXB0ZWRQb2xpY3k6MTUsdW5hY2NlcHRlZEV4dGVuc2lvbjoxNixhZGRJbmZvTm90QXZhaWxhYmxlOjE3LHN5c3RlbUZhaWx1cmU6MjV9O0tKVVIuYXNuMS50c3AuQWJzdHJhY3RUU0FBZGFwdGVyPWZ1bmN0aW9uKGEpe3RoaXMuZ2V0VFNUSGV4PWZ1bmN0aW9uKGMsYil7dGhyb3dcIm5vdCBpbXBsZW1lbnRlZCB5ZXRcIn19O0tKVVIuYXNuMS50c3AuU2ltcGxlVFNBQWRhcHRlcj1mdW5jdGlvbihhKXtLSlVSLmFzbjEudHNwLlNpbXBsZVRTQUFkYXB0ZXIuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3RoaXMucGFyYW1zPW51bGw7dGhpcy5zZXJpYWw9MDt0aGlzLmdldFRTVEhleD1mdW5jdGlvbihjLGIpe3ZhciBlPUtKVVIuY3J5cHRvLlV0aWwuaGFzaEhleChjLGIpO3RoaXMucGFyYW1zLnRzdEluZm8ubWVzc2FnZUltcHJpbnQ9e2hhc2hBbGc6YixoYXNoVmFsdWU6ZX07dGhpcy5wYXJhbXMudHN0SW5mby5zZXJpYWxOdW1iZXI9e1wiaW50XCI6dGhpcy5zZXJpYWwrK307dmFyIGQ9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKjEwMDAwMDAwMDApO3RoaXMucGFyYW1zLnRzdEluZm8ubm9uY2U9e1wiaW50XCI6ZH07dmFyIGY9S0pVUi5hc24xLnRzcC5UU1BVdGlsLm5ld1RpbWVTdGFtcFRva2VuKHRoaXMucGFyYW1zKTtyZXR1cm4gZi5nZXRDb250ZW50SW5mb0VuY29kZWRIZXgoKX07aWYodHlwZW9mIGEhPVwidW5kZWZpbmVkXCIpe3RoaXMucGFyYW1zPWF9fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEudHNwLlNpbXBsZVRTQUFkYXB0ZXIsS0pVUi5hc24xLnRzcC5BYnN0cmFjdFRTQUFkYXB0ZXIpO0tKVVIuYXNuMS50c3AuRml4ZWRUU0FBZGFwdGVyPWZ1bmN0aW9uKGEpe0tKVVIuYXNuMS50c3AuRml4ZWRUU0FBZGFwdGVyLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt0aGlzLnBhcmFtcz1udWxsO3RoaXMuZ2V0VFNUSGV4PWZ1bmN0aW9uKGMsYil7dmFyIGQ9S0pVUi5jcnlwdG8uVXRpbC5oYXNoSGV4KGMsYik7dGhpcy5wYXJhbXMudHN0SW5mby5tZXNzYWdlSW1wcmludD17aGFzaEFsZzpiLGhhc2hWYWx1ZTpkfTt2YXIgZT1LSlVSLmFzbjEudHNwLlRTUFV0aWwubmV3VGltZVN0YW1wVG9rZW4odGhpcy5wYXJhbXMpO3JldHVybiBlLmdldENvbnRlbnRJbmZvRW5jb2RlZEhleCgpfTtpZih0eXBlb2YgYSE9XCJ1bmRlZmluZWRcIil7dGhpcy5wYXJhbXM9YX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS50c3AuRml4ZWRUU0FBZGFwdGVyLEtKVVIuYXNuMS50c3AuQWJzdHJhY3RUU0FBZGFwdGVyKTtLSlVSLmFzbjEudHNwLlRTUFV0aWw9bmV3IGZ1bmN0aW9uKCl7fTtLSlVSLmFzbjEudHNwLlRTUFV0aWwubmV3VGltZVN0YW1wVG9rZW49ZnVuY3Rpb24oYil7dmFyIGo9S0pVUi5hc24xLmNtczt2YXIgYT1LSlVSLmFzbjEudHNwO3ZhciBnPW5ldyBqLlNpZ25lZERhdGEoKTt2YXIgZT1uZXcgYS5UU1RJbmZvKGIudHN0SW5mbyk7dmFyIGY9ZS5nZXRFbmNvZGVkSGV4KCk7Zy5kRW5jYXBDb250ZW50SW5mby5zZXRDb250ZW50VmFsdWUoe2hleDpmfSk7Zy5kRW5jYXBDb250ZW50SW5mby5zZXRDb250ZW50VHlwZShcInRzdGluZm9cIik7aWYodHlwZW9mIGIuY2VydHM9PVwib2JqZWN0XCIpe2Zvcih2YXIgYz0wO2M8Yi5jZXJ0cy5sZW5ndGg7YysrKXtnLmFkZENlcnRpZmljYXRlc0J5UEVNKGIuY2VydHNbY10pfX12YXIgZD1nLnNpZ25lckluZm9MaXN0WzBdO2Quc2V0U2lnbmVySWRlbnRpZmllcihiLnNpZ25lckNlcnQpO2Quc2V0Rm9yQ29udGVudEFuZEhhc2goe3NkT2JqOmcsZWNpT2JqOmcuZEVuY2FwQ29udGVudEluZm8saGFzaEFsZzpiLmhhc2hBbGd9KTt2YXIgaD1uZXcgai5TaWduaW5nQ2VydGlmaWNhdGUoe2FycmF5OltiLnNpZ25lckNlcnRdfSk7ZC5kU2lnbmVkQXR0cnMuYWRkKGgpO2Quc2lnbihiLnNpZ25lclBydktleSxiLnNpZ0FsZyk7cmV0dXJuIGd9O0tKVVIuYXNuMS50c3AuVFNQVXRpbC5wYXJzZVRpbWVTdGFtcFJlcT1mdW5jdGlvbihkKXt2YXIgZj17fTtmLmNlcnRyZXE9ZmFsc2U7dmFyIGg9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooZCwwKTtpZihoLmxlbmd0aDwyKXt0aHJvd1wiVGltZVN0YW1wUmVxIG11c3QgaGF2ZSBhdCBsZWFzdCAyIGl0ZW1zXCJ9dmFyIGM9QVNOMUhFWC5nZXRIZXhPZlRMVl9BdE9iaihkLGhbMV0pO2YubWk9S0pVUi5hc24xLnRzcC5UU1BVdGlsLnBhcnNlTWVzc2FnZUltcHJpbnQoYyk7Zm9yKHZhciBlPTI7ZTxoLmxlbmd0aDtlKyspe3ZhciBiPWhbZV07dmFyIGE9ZC5zdWJzdHIoYiwyKTtpZihhPT1cIjA2XCIpe3ZhciBnPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGQsYik7Zi5wb2xpY3k9QVNOMUhFWC5oZXh0b29pZHN0cihnKX1pZihhPT1cIjAyXCIpe2Yubm9uY2U9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZCxiKX1pZihhPT1cIjAxXCIpe2YuY2VydHJlcT10cnVlfX1yZXR1cm4gZn07S0pVUi5hc24xLnRzcC5UU1BVdGlsLnBhcnNlTWVzc2FnZUltcHJpbnQ9ZnVuY3Rpb24oYyl7dmFyIGg9e307aWYoYy5zdWJzdHIoMCwyKSE9XCIzMFwiKXt0aHJvd1wiaGVhZCBvZiBtZXNzYWdlSW1wcmludCBoZXggc2hhbGwgYmUgJzMwJ1wifXZhciBhPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGMsMCk7dmFyIGk9QVNOMUhFWC5nZXREZWNlbmRhbnRJbmRleEJ5TnRoTGlzdChjLDAsWzAsMF0pO3ZhciBkPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGMsaSk7dmFyIGU9QVNOMUhFWC5oZXh0b29pZHN0cihkKTt2YXIgZz1LSlVSLmFzbjEueDUwOS5PSUQub2lkMm5hbWUoZSk7aWYoZz09XCJcIil7dGhyb3dcImhhc2hBbGcgbmFtZSB1bmRlZmluZWQ6IFwiK2V9dmFyIGI9Zzt2YXIgZj1BU04xSEVYLmdldERlY2VuZGFudEluZGV4QnlOdGhMaXN0KGMsMCxbMV0pO2guaGFzaEFsZz1iO2guaGFzaFZhbHVlPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGMsZik7cmV0dXJuIGh9O1xuLyohIGFzbjFjYWRlcy0xLjAuMC5qcyAoYykgMjAxMy0yMDE0IEtlbmppIFVydXNoaW1hIHwga2p1ci5naXRodWIuY29tL2pzcnNhc2lnbi9saWNlbnNlXG4gKi9cbmlmKHR5cGVvZiBLSlVSPT1cInVuZGVmaW5lZFwifHwhS0pVUil7S0pVUj17fX1pZih0eXBlb2YgS0pVUi5hc24xPT1cInVuZGVmaW5lZFwifHwhS0pVUi5hc24xKXtLSlVSLmFzbjE9e319aWYodHlwZW9mIEtKVVIuYXNuMS5jYWRlcz09XCJ1bmRlZmluZWRcInx8IUtKVVIuYXNuMS5jYWRlcyl7S0pVUi5hc24xLmNhZGVzPXt9fUtKVVIuYXNuMS5jYWRlcy5TaWduYXR1cmVQb2xpY3lJZGVudGlmaWVyPWZ1bmN0aW9uKGUpe0tKVVIuYXNuMS5jYWRlcy5TaWduYXR1cmVQb2xpY3lJZGVudGlmaWVyLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt0aGlzLmF0dHJUeXBlT2lkPVwiMS4yLjg0MC4xMTM1NDkuMS45LjE2LjIuMTVcIjt2YXIgYj1LSlVSLmFzbjE7dmFyIGQ9S0pVUi5hc24xLmNhZGVzO2lmKHR5cGVvZiBlIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgZS5vaWQ9PVwic3RyaW5nXCImJnR5cGVvZiBlLmhhc2g9PVwib2JqZWN0XCIpe3ZhciBmPW5ldyBiLkRFUk9iamVjdElkZW50aWZpZXIoe29pZDplLm9pZH0pO3ZhciBhPW5ldyBkLk90aGVySGFzaEFsZ0FuZFZhbHVlKGUuaGFzaCk7dmFyIGM9bmV3IGIuREVSU2VxdWVuY2Uoe2FycmF5OltmLGFdfSk7dGhpcy52YWx1ZUxpc3Q9W2NdfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5jYWRlcy5TaWduYXR1cmVQb2xpY3lJZGVudGlmaWVyLEtKVVIuYXNuMS5jbXMuQXR0cmlidXRlKTtLSlVSLmFzbjEuY2FkZXMuT3RoZXJIYXNoQWxnQW5kVmFsdWU9ZnVuY3Rpb24oYil7S0pVUi5hc24xLmNhZGVzLk90aGVySGFzaEFsZ0FuZFZhbHVlLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYT1LSlVSLmFzbjE7dmFyIGM9S0pVUi5hc24xLng1MDk7dGhpcy5kQWxnPW51bGw7dGhpcy5kSGFzaD1udWxsO3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe3ZhciBkPW5ldyBhLkRFUlNlcXVlbmNlKHthcnJheTpbdGhpcy5kQWxnLHRoaXMuZEhhc2hdfSk7dGhpcy5oVExWPWQuZ2V0RW5jb2RlZEhleCgpO3JldHVybiB0aGlzLmhUTFZ9O2lmKHR5cGVvZiBiIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYi5hbGc9PVwic3RyaW5nXCImJnR5cGVvZiBiLmhhc2g9PVwic3RyaW5nXCIpe3RoaXMuZEFsZz1uZXcgYy5BbGdvcml0aG1JZGVudGlmaWVyKHtuYW1lOmIuYWxnfSk7dGhpcy5kSGFzaD1uZXcgYS5ERVJPY3RldFN0cmluZyh7aGV4OmIuaGFzaH0pfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5jYWRlcy5PdGhlckhhc2hBbGdBbmRWYWx1ZSxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLmNhZGVzLlNpZ25hdHVyZVRpbWVTdGFtcD1mdW5jdGlvbihjKXtLSlVSLmFzbjEuY2FkZXMuU2lnbmF0dXJlVGltZVN0YW1wLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt0aGlzLmF0dHJUeXBlT2lkPVwiMS4yLjg0MC4xMTM1NDkuMS45LjE2LjIuMTRcIjt0aGlzLnRzdEhleD1udWxsO3ZhciBhPUtKVVIuYXNuMTtpZih0eXBlb2YgYyE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGMucmVzIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYy5yZXM9PVwic3RyaW5nXCImJmMucmVzLm1hdGNoKC9eWzAtOUEtRmEtZl0rJC8pKXt9ZWxzZXtpZihjLnJlcyBpbnN0YW5jZW9mIEtKVVIuYXNuMS5BU04xT2JqZWN0KXt9ZWxzZXt0aHJvd1wicmVzIHBhcmFtIHNoYWxsIGJlIEFTTjFPYmplY3Qgb3IgaGV4IHN0cmluZ1wifX19aWYodHlwZW9mIGMudHN0IT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYy50c3Q9PVwic3RyaW5nXCImJmMudHN0Lm1hdGNoKC9eWzAtOUEtRmEtZl0rJC8pKXt2YXIgYj1uZXcgYS5BU04xT2JqZWN0KCk7dGhpcy50c3RIZXg9Yy50c3Q7Yi5oVExWPXRoaXMudHN0SGV4O2IuZ2V0RW5jb2RlZEhleCgpO3RoaXMudmFsdWVMaXN0PVtiXX1lbHNle2lmKGMudHN0IGluc3RhbmNlb2YgS0pVUi5hc24xLkFTTjFPYmplY3Qpe31lbHNle3Rocm93XCJ0c3QgcGFyYW0gc2hhbGwgYmUgQVNOMU9iamVjdCBvciBoZXggc3RyaW5nXCJ9fX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuY2FkZXMuU2lnbmF0dXJlVGltZVN0YW1wLEtKVVIuYXNuMS5jbXMuQXR0cmlidXRlKTtLSlVSLmFzbjEuY2FkZXMuQ29tcGxldGVDZXJ0aWZpY2F0ZVJlZnM9ZnVuY3Rpb24oYyl7S0pVUi5hc24xLmNhZGVzLkNvbXBsZXRlQ2VydGlmaWNhdGVSZWZzLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt0aGlzLmF0dHJUeXBlT2lkPVwiMS4yLjg0MC4xMTM1NDkuMS45LjE2LjIuMjFcIjt2YXIgYT1LSlVSLmFzbjE7dmFyIGI9S0pVUi5hc24xLmNhZGVzO3RoaXMuc2V0QnlBcnJheT1mdW5jdGlvbihkKXt0aGlzLnZhbHVlTGlzdD1bXTtmb3IodmFyIGU9MDtlPGQubGVuZ3RoO2UrKyl7dmFyIGY9bmV3IGIuT3RoZXJDZXJ0SUQoZFtlXSk7dGhpcy52YWx1ZUxpc3QucHVzaChmKX19O2lmKHR5cGVvZiBjIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYz09XCJvYmplY3RcIiYmdHlwZW9mIGMubGVuZ3RoPT1cIm51bWJlclwiKXt0aGlzLnNldEJ5QXJyYXkoYyl9fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLmNhZGVzLkNvbXBsZXRlQ2VydGlmaWNhdGVSZWZzLEtKVVIuYXNuMS5jbXMuQXR0cmlidXRlKTtLSlVSLmFzbjEuY2FkZXMuT3RoZXJDZXJ0SUQ9ZnVuY3Rpb24oZCl7S0pVUi5hc24xLmNhZGVzLk90aGVyQ2VydElELnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYT1LSlVSLmFzbjE7dmFyIGM9S0pVUi5hc24xLmNtczt2YXIgYj1LSlVSLmFzbjEuY2FkZXM7dGhpcy5oYXNJc3N1ZXJTZXJpYWw9dHJ1ZTt0aGlzLmRPdGhlckNlcnRIYXNoPW51bGw7dGhpcy5kSXNzdWVyU2VyaWFsPW51bGw7dGhpcy5zZXRCeUNlcnRQRU09ZnVuY3Rpb24oZSl7dGhpcy5kT3RoZXJDZXJ0SGFzaD1uZXcgYi5PdGhlckhhc2goZSk7aWYodGhpcy5oYXNJc3N1ZXJTZXJpYWwpe3RoaXMuZElzc3VlclNlcmlhbD1uZXcgYy5Jc3N1ZXJBbmRTZXJpYWxOdW1iZXIoZSl9fTt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXtpZih0aGlzLmhUTFYhPW51bGwpe3JldHVybiB0aGlzLmhUTFZ9aWYodGhpcy5kT3RoZXJDZXJ0SGFzaD09bnVsbCl7dGhyb3dcIm90aGVyQ2VydEhhc2ggbm90IHNldFwifXZhciBlPVt0aGlzLmRPdGhlckNlcnRIYXNoXTtpZih0aGlzLmRJc3N1ZXJTZXJpYWwhPW51bGwpe2UucHVzaCh0aGlzLmRJc3N1ZXJTZXJpYWwpfXZhciBmPW5ldyBhLkRFUlNlcXVlbmNlKHthcnJheTplfSk7dGhpcy5oVExWPWYuZ2V0RW5jb2RlZEhleCgpO3JldHVybiB0aGlzLmhUTFZ9O2lmKHR5cGVvZiBkIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgZD09XCJzdHJpbmdcIiYmZC5pbmRleE9mKFwiLS0tLS1CRUdJTiBcIikhPS0xKXt0aGlzLnNldEJ5Q2VydFBFTShkKX1pZih0eXBlb2YgZD09XCJvYmplY3RcIil7aWYoZC5oYXNpcz09PWZhbHNlKXt0aGlzLmhhc0lzc3VlclNlcmlhbD1mYWxzZX1pZih0eXBlb2YgZC5jZXJ0PT1cInN0cmluZ1wiKXt0aGlzLnNldEJ5Q2VydFBFTShkLmNlcnQpfX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuY2FkZXMuT3RoZXJDZXJ0SUQsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS5jYWRlcy5PdGhlckhhc2g9ZnVuY3Rpb24oYyl7S0pVUi5hc24xLmNhZGVzLk90aGVySGFzaC5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGE9S0pVUi5hc24xO3ZhciBiPUtKVVIuYXNuMS5jYWRlczt0aGlzLmFsZz1cInNoYTI1NlwiO3RoaXMuZE90aGVySGFzaD1udWxsO3RoaXMuc2V0QnlDZXJ0UEVNPWZ1bmN0aW9uKGQpe2lmKGQuaW5kZXhPZihcIi0tLS0tQkVHSU4gXCIpPT0tMSl7dGhyb3dcImNlcnRQRU0gbm90IHRvIHNlZW0gUEVNIGZvcm1hdFwifXZhciBlPVg1MDkucGVtVG9IZXgoZCk7dmFyIGY9S0pVUi5jcnlwdG8uVXRpbC5oYXNoSGV4KGUsdGhpcy5hbGcpO3RoaXMuZE90aGVySGFzaD1uZXcgYi5PdGhlckhhc2hBbGdBbmRWYWx1ZSh7YWxnOnRoaXMuYWxnLGhhc2g6Zn0pfTt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXtpZih0aGlzLmRPdGhlckhhc2g9PW51bGwpe3Rocm93XCJPdGhlckhhc2ggbm90IHNldFwifXJldHVybiB0aGlzLmRPdGhlckhhc2guZ2V0RW5jb2RlZEhleCgpfTtpZih0eXBlb2YgYyE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGM9PVwic3RyaW5nXCIpe2lmKGMuaW5kZXhPZihcIi0tLS0tQkVHSU4gXCIpIT0tMSl7dGhpcy5zZXRCeUNlcnRQRU0oYyl9ZWxzZXtpZihjLm1hdGNoKC9eWzAtOUEtRmEtZl0rJC8pKXt0aGlzLmRPdGhlckhhc2g9bmV3IGEuREVST2N0ZXRTdHJpbmcoe2hleDpjfSl9ZWxzZXt0aHJvd1widW5zdXBwb3J0ZWQgc3RyaW5nIHZhbHVlIGZvciBwYXJhbXNcIn19fWVsc2V7aWYodHlwZW9mIGM9PVwib2JqZWN0XCIpe2lmKHR5cGVvZiBjLmNlcnQ9PVwic3RyaW5nXCIpe2lmKHR5cGVvZiBjLmFsZz09XCJzdHJpbmdcIil7dGhpcy5hbGc9Yy5hbGd9dGhpcy5zZXRCeUNlcnRQRU0oYy5jZXJ0KX1lbHNle3RoaXMuZE90aGVySGFzaD1uZXcgYi5PdGhlckhhc2hBbGdBbmRWYWx1ZShjKX19fX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5jYWRlcy5PdGhlckhhc2gsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS5jYWRlcy5DQWRFU1V0aWw9bmV3IGZ1bmN0aW9uKCl7fTtLSlVSLmFzbjEuY2FkZXMuQ0FkRVNVdGlsLmFkZFNpZ1RTPWZ1bmN0aW9uKGMsYixhKXt9O0tKVVIuYXNuMS5jYWRlcy5DQWRFU1V0aWwucGFyc2VTaWduZWREYXRhRm9yQWRkaW5nVW5zaWduZWQ9ZnVuY3Rpb24oZCl7dmFyIHE9S0pVUi5hc24xO3ZhciBwPUtKVVIuYXNuMS5jbXM7dmFyIGM9S0pVUi5hc24xLmNhZGVzLkNBZEVTVXRpbDt2YXIgYT17fTtpZihBU04xSEVYLmdldERlY2VuZGFudEhleFRMVkJ5TnRoTGlzdChkLDAsWzBdKSE9XCIwNjA5MmE4NjQ4ODZmNzBkMDEwNzAyXCIpe3Rocm93XCJoZXggaXMgbm90IENNUyBTaWduZWREYXRhXCJ9dmFyIHM9QVNOMUhFWC5nZXREZWNlbmRhbnRJbmRleEJ5TnRoTGlzdChkLDAsWzEsMF0pO3ZhciBiPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGQscyk7aWYoYi5sZW5ndGg8NCl7dGhyb3dcIm51bSBvZiBTaWduZWREYXRhIGVsZW0gc2hhbGwgYmUgNCBhdCBsZWFzdFwifXZhciBmPWIuc2hpZnQoKTthLnZlcnNpb249QVNOMUhFWC5nZXRIZXhPZlRMVl9BdE9iaihkLGYpO3ZhciBsPWIuc2hpZnQoKTthLmFsZ3M9QVNOMUhFWC5nZXRIZXhPZlRMVl9BdE9iaihkLGwpO3ZhciBtPWIuc2hpZnQoKTthLmVuY2FwY29udGVudD1BU04xSEVYLmdldEhleE9mVExWX0F0T2JqKGQsbSk7YS5jZXJ0cz1udWxsO2EucmV2cz1udWxsO2Euc2k9W107dmFyIG49Yi5zaGlmdCgpO2lmKGQuc3Vic3RyKG4sMik9PVwiYTBcIil7YS5jZXJ0cz1BU04xSEVYLmdldEhleE9mVExWX0F0T2JqKGQsbik7bj1iLnNoaWZ0KCl9aWYoZC5zdWJzdHIobiwyKT09XCJhMVwiKXthLnJldnM9QVNOMUhFWC5nZXRIZXhPZlRMVl9BdE9iaihkLG4pO249Yi5zaGlmdCgpfXZhciBrPW47aWYoZC5zdWJzdHIoaywyKSE9XCIzMVwiKXt0aHJvd1wiQ2FuJ3QgZmluZCBzaWduZXJJbmZvc1wifXZhciBqPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGQsayk7Zm9yKHZhciBoPTA7aDxqLmxlbmd0aDtoKyspe3ZhciBvPWpbaF07dmFyIGU9Yy5wYXJzZVNpZ25lckluZm9Gb3JBZGRpbmdVbnNpZ25lZChkLG8saCk7YS5zaVtoXT1lfXZhciBnPW51bGw7YS5vYmo9bmV3IHAuU2lnbmVkRGF0YSgpO2c9bmV3IHEuQVNOMU9iamVjdCgpO2cuaFRMVj1hLnZlcnNpb247YS5vYmouZENNU1ZlcnNpb249ZztnPW5ldyBxLkFTTjFPYmplY3QoKTtnLmhUTFY9YS5hbGdzO2Eub2JqLmREaWdlc3RBbGdzPWc7Zz1uZXcgcS5BU04xT2JqZWN0KCk7Zy5oVExWPWEuZW5jYXBjb250ZW50O2Eub2JqLmRFbmNhcENvbnRlbnRJbmZvPWc7Zz1uZXcgcS5BU04xT2JqZWN0KCk7Zy5oVExWPWEuY2VydHM7YS5vYmouZENlcnRzPWc7YS5vYmouc2lnbmVySW5mb0xpc3Q9W107Zm9yKHZhciBoPTA7aDxhLnNpLmxlbmd0aDtoKyspe2Eub2JqLnNpZ25lckluZm9MaXN0LnB1c2goYS5zaVtoXS5vYmopfXJldHVybiBhfTtLSlVSLmFzbjEuY2FkZXMuQ0FkRVNVdGlsLnBhcnNlU2lnbmVySW5mb0ZvckFkZGluZ1Vuc2lnbmVkPWZ1bmN0aW9uKGQsayxhKXt2YXIgbT1LSlVSLmFzbjE7dmFyIGw9S0pVUi5hc24xLmNtczt2YXIgYj17fTt2YXIgZT1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihkLGspO2lmKGUubGVuZ3RoIT02KXt0aHJvd1wibm90IHN1cHBvcnRlZCBpdGVtcyBmb3IgU2lnbmVySW5mbyAoIT02KVwifXZhciBmPWUuc2hpZnQoKTtiLnZlcnNpb249QVNOMUhFWC5nZXRIZXhPZlRMVl9BdE9iaihkLGYpO3ZhciBuPWUuc2hpZnQoKTtiLnNpPUFTTjFIRVguZ2V0SGV4T2ZUTFZfQXRPYmooZCxuKTt2YXIgaD1lLnNoaWZ0KCk7Yi5kaWdhbGc9QVNOMUhFWC5nZXRIZXhPZlRMVl9BdE9iaihkLGgpO3ZhciBjPWUuc2hpZnQoKTtiLnNhdHRycz1BU04xSEVYLmdldEhleE9mVExWX0F0T2JqKGQsYyk7dmFyIGk9ZS5zaGlmdCgpO2Iuc2lnYWxnPUFTTjFIRVguZ2V0SGV4T2ZUTFZfQXRPYmooZCxpKTt2YXIgaj1lLnNoaWZ0KCk7Yi5zaWc9QVNOMUhFWC5nZXRIZXhPZlRMVl9BdE9iaihkLGopO2Iuc2lndmFsPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGQsaik7dmFyIGc9bnVsbDtiLm9iaj1uZXcgbC5TaWduZXJJbmZvKCk7Zz1uZXcgbS5BU04xT2JqZWN0KCk7Zy5oVExWPWIudmVyc2lvbjtiLm9iai5kQ01TVmVyc2lvbj1nO2c9bmV3IG0uQVNOMU9iamVjdCgpO2cuaFRMVj1iLnNpO2Iub2JqLmRTaWduZXJJZGVudGlmaWVyPWc7Zz1uZXcgbS5BU04xT2JqZWN0KCk7Zy5oVExWPWIuZGlnYWxnO2Iub2JqLmREaWdlc3RBbGdvcml0aG09ZztnPW5ldyBtLkFTTjFPYmplY3QoKTtnLmhUTFY9Yi5zYXR0cnM7Yi5vYmouZFNpZ25lZEF0dHJzPWc7Zz1uZXcgbS5BU04xT2JqZWN0KCk7Zy5oVExWPWIuc2lnYWxnO2Iub2JqLmRTaWdBbGc9ZztnPW5ldyBtLkFTTjFPYmplY3QoKTtnLmhUTFY9Yi5zaWc7Yi5vYmouZFNpZz1nO2Iub2JqLmRVbnNpZ25lZEF0dHJzPW5ldyBsLkF0dHJpYnV0ZUxpc3QoKTtyZXR1cm4gYn07XG4vKiEgYXNuMWNzci0xLjAuMC5qcyAoYykgMjAxNSBLZW5qaSBVcnVzaGltYSB8IGtqdXIuZ2l0aHViLmNvbS9qc3JzYXNpZ24vbGljZW5zZVxuICovXG5pZih0eXBlb2YgS0pVUi5hc24xLmNzcj09XCJ1bmRlZmluZWRcInx8IUtKVVIuYXNuMS5jc3Ipe0tKVVIuYXNuMS5jc3I9e319S0pVUi5hc24xLmNzci5DZXJ0aWZpY2F0aW9uUmVxdWVzdD1mdW5jdGlvbihmKXtLSlVSLmFzbjEuY3NyLkNlcnRpZmljYXRpb25SZXF1ZXN0LnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYj1udWxsO3ZhciBkPW51bGw7dmFyIGU9bnVsbDt2YXIgYz1udWxsO3ZhciBhPW51bGw7dGhpcy5zaWduPWZ1bmN0aW9uKGksaCl7aWYodGhpcy5wcnZLZXk9PW51bGwpe3RoaXMucHJ2S2V5PWh9dGhpcy5hc24xU2lnbmF0dXJlQWxnPW5ldyBLSlVSLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyKHtuYW1lOml9KTtzaWc9bmV3IEtKVVIuY3J5cHRvLlNpZ25hdHVyZSh7YWxnOml9KTtzaWcuaW5pdFNpZ24odGhpcy5wcnZLZXkpO3NpZy51cGRhdGVIZXgodGhpcy5hc24xQ1NSSW5mby5nZXRFbmNvZGVkSGV4KCkpO3RoaXMuaGV4U2lnPXNpZy5zaWduKCk7dGhpcy5hc24xU2lnPW5ldyBLSlVSLmFzbjEuREVSQml0U3RyaW5nKHtoZXg6XCIwMFwiK3RoaXMuaGV4U2lnfSk7dmFyIGc9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7YXJyYXk6W3RoaXMuYXNuMUNTUkluZm8sdGhpcy5hc24xU2lnbmF0dXJlQWxnLHRoaXMuYXNuMVNpZ119KTt0aGlzLmhUTFY9Zy5nZXRFbmNvZGVkSGV4KCk7dGhpcy5pc01vZGlmaWVkPWZhbHNlfTt0aGlzLmdldFBFTVN0cmluZz1mdW5jdGlvbigpe3ZhciBnPUtKVVIuYXNuMS5BU04xVXRpbC5nZXRQRU1TdHJpbmdGcm9tSGV4KHRoaXMuZ2V0RW5jb2RlZEhleCgpLFwiQ0VSVElGSUNBVEUgUkVRVUVTVFwiKTtyZXR1cm4gZ307dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7aWYodGhpcy5pc01vZGlmaWVkPT1mYWxzZSYmdGhpcy5oVExWIT1udWxsKXtyZXR1cm4gdGhpcy5oVExWfXRocm93XCJub3Qgc2lnbmVkIHlldFwifTtpZih0eXBlb2YgZiE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGYuY3NyaW5mbyE9XCJ1bmRlZmluZWRcIil7dGhpcy5hc24xQ1NSSW5mbz1mLmNzcmluZm99fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLmNzci5DZXJ0aWZpY2F0aW9uUmVxdWVzdCxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLmNzci5DZXJ0aWZpY2F0aW9uUmVxdWVzdEluZm89ZnVuY3Rpb24oYSl7S0pVUi5hc24xLmNzci5DZXJ0aWZpY2F0aW9uUmVxdWVzdEluZm8uc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3RoaXMuX2luaXRpYWxpemU9ZnVuY3Rpb24oKXt0aGlzLmFzbjFBcnJheT1uZXcgQXJyYXkoKTt0aGlzLmFzbjFWZXJzaW9uPW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7XCJpbnRcIjowfSk7dGhpcy5hc24xU3ViamVjdD1udWxsO3RoaXMuYXNuMVN1YmpQS2V5PW51bGw7dGhpcy5leHRlbnNpb25zQXJyYXk9bmV3IEFycmF5KCl9O3RoaXMuc2V0U3ViamVjdEJ5UGFyYW09ZnVuY3Rpb24oYil7dGhpcy5hc24xU3ViamVjdD1uZXcgS0pVUi5hc24xLng1MDkuWDUwME5hbWUoYil9O3RoaXMuc2V0U3ViamVjdFB1YmxpY0tleUJ5R2V0S2V5PWZ1bmN0aW9uKGMpe3ZhciBiPUtFWVVUSUwuZ2V0S2V5KGMpO3RoaXMuYXNuMVN1YmpQS2V5PW5ldyBLSlVSLmFzbjEueDUwOS5TdWJqZWN0UHVibGljS2V5SW5mbyhiKX07dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7dGhpcy5hc24xQXJyYXk9bmV3IEFycmF5KCk7dGhpcy5hc24xQXJyYXkucHVzaCh0aGlzLmFzbjFWZXJzaW9uKTt0aGlzLmFzbjFBcnJheS5wdXNoKHRoaXMuYXNuMVN1YmplY3QpO3RoaXMuYXNuMUFycmF5LnB1c2godGhpcy5hc24xU3VialBLZXkpO3ZhciBjPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5OnRoaXMuZXh0ZW5zaW9uc0FycmF5fSk7dmFyIGI9bmV3IEtKVVIuYXNuMS5ERVJUYWdnZWRPYmplY3Qoe2V4cGxpY2l0OmZhbHNlLHRhZzpcImEwXCIsb2JqOmN9KTt0aGlzLmFzbjFBcnJheS5wdXNoKGIpO3ZhciBkPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5OnRoaXMuYXNuMUFycmF5fSk7dGhpcy5oVExWPWQuZ2V0RW5jb2RlZEhleCgpO3RoaXMuaXNNb2RpZmllZD1mYWxzZTtyZXR1cm4gdGhpcy5oVExWfTt0aGlzLl9pbml0aWFsaXplKCl9O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5jc3IuQ2VydGlmaWNhdGlvblJlcXVlc3RJbmZvLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEuY3NyLkNTUlV0aWw9bmV3IGZ1bmN0aW9uKCl7fTtLSlVSLmFzbjEuY3NyLkNTUlV0aWwubmV3Q1NSUEVNPWZ1bmN0aW9uKGYpe3ZhciBjPUtKVVIuYXNuMS5jc3I7aWYoZi5zdWJqZWN0PT09dW5kZWZpbmVkKXt0aHJvd1wicGFyYW1ldGVyIHN1YmplY3QgdW5kZWZpbmVkXCJ9aWYoZi5zYmpwdWJrZXk9PT11bmRlZmluZWQpe3Rocm93XCJwYXJhbWV0ZXIgc2JqcHVia2V5IHVuZGVmaW5lZFwifWlmKGYuc2lnYWxnPT09dW5kZWZpbmVkKXt0aHJvd1wicGFyYW1ldGVyIHNpZ2FsZyB1bmRlZmluZWRcIn1pZihmLnNianBydmtleT09PXVuZGVmaW5lZCl7dGhyb3dcInBhcmFtZXRlciBzYmpwdWJrZXkgdW5kZWZpbmVkXCJ9dmFyIGI9bmV3IGMuQ2VydGlmaWNhdGlvblJlcXVlc3RJbmZvKCk7Yi5zZXRTdWJqZWN0QnlQYXJhbShmLnN1YmplY3QpO2Iuc2V0U3ViamVjdFB1YmxpY0tleUJ5R2V0S2V5KGYuc2JqcHVia2V5KTt2YXIgZD1uZXcgYy5DZXJ0aWZpY2F0aW9uUmVxdWVzdCh7Y3NyaW5mbzpifSk7dmFyIGE9S0VZVVRJTC5nZXRLZXkoZi5zYmpwcnZrZXkpO2Quc2lnbihmLnNpZ2FsZyxhKTt2YXIgZT1kLmdldFBFTVN0cmluZygpO3JldHVybiBlfTtcbi8qISBiYXNlNjR4LTEuMS42IChjKSAyMDEyLTIwMTUgS2VuamkgVXJ1c2hpbWEgfCBranVyLmdpdGh1Yi5jb20vanNyc2FzaWduL2xpY2Vuc2VcbiAqL1xuZnVuY3Rpb24gQmFzZTY0eCgpe31mdW5jdGlvbiBzdG9CQShkKXt2YXIgYj1uZXcgQXJyYXkoKTtmb3IodmFyIGM9MDtjPGQubGVuZ3RoO2MrKyl7YltjXT1kLmNoYXJDb2RlQXQoYyl9cmV0dXJuIGJ9ZnVuY3Rpb24gQkF0b3MoYil7dmFyIGQ9XCJcIjtmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl7ZD1kK1N0cmluZy5mcm9tQ2hhckNvZGUoYltjXSl9cmV0dXJuIGR9ZnVuY3Rpb24gQkF0b2hleChiKXt2YXIgZT1cIlwiO2Zvcih2YXIgZD0wO2Q8Yi5sZW5ndGg7ZCsrKXt2YXIgYz1iW2RdLnRvU3RyaW5nKDE2KTtpZihjLmxlbmd0aD09MSl7Yz1cIjBcIitjfWU9ZStjfXJldHVybiBlfWZ1bmN0aW9uIHN0b2hleChhKXtyZXR1cm4gQkF0b2hleChzdG9CQShhKSl9ZnVuY3Rpb24gc3RvYjY0KGEpe3JldHVybiBoZXgyYjY0KHN0b2hleChhKSl9ZnVuY3Rpb24gc3RvYjY0dShhKXtyZXR1cm4gYjY0dG9iNjR1KGhleDJiNjQoc3RvaGV4KGEpKSl9ZnVuY3Rpb24gYjY0dXRvcyhhKXtyZXR1cm4gQkF0b3MoYjY0dG9CQShiNjR1dG9iNjQoYSkpKX1mdW5jdGlvbiBiNjR0b2I2NHUoYSl7YT1hLnJlcGxhY2UoL1xcPS9nLFwiXCIpO2E9YS5yZXBsYWNlKC9cXCsvZyxcIi1cIik7YT1hLnJlcGxhY2UoL1xcLy9nLFwiX1wiKTtyZXR1cm4gYX1mdW5jdGlvbiBiNjR1dG9iNjQoYSl7aWYoYS5sZW5ndGglND09Mil7YT1hK1wiPT1cIn1lbHNle2lmKGEubGVuZ3RoJTQ9PTMpe2E9YStcIj1cIn19YT1hLnJlcGxhY2UoLy0vZyxcIitcIik7YT1hLnJlcGxhY2UoL18vZyxcIi9cIik7cmV0dXJuIGF9ZnVuY3Rpb24gaGV4dG9iNjR1KGEpe2lmKGEubGVuZ3RoJTI9PTEpe2E9XCIwXCIrYX1yZXR1cm4gYjY0dG9iNjR1KGhleDJiNjQoYSkpfWZ1bmN0aW9uIGI2NHV0b2hleChhKXtyZXR1cm4gYjY0dG9oZXgoYjY0dXRvYjY0KGEpKX12YXIgdXRmOHRvYjY0dSxiNjR1dG91dGY4O2lmKHR5cGVvZiBCdWZmZXI9PT1cImZ1bmN0aW9uXCIpe3V0Zjh0b2I2NHU9ZnVuY3Rpb24oYSl7cmV0dXJuIGI2NHRvYjY0dShuZXcgQnVmZmVyKGEsXCJ1dGY4XCIpLnRvU3RyaW5nKFwiYmFzZTY0XCIpKX07YjY0dXRvdXRmOD1mdW5jdGlvbihhKXtyZXR1cm4gbmV3IEJ1ZmZlcihiNjR1dG9iNjQoYSksXCJiYXNlNjRcIikudG9TdHJpbmcoXCJ1dGY4XCIpfX1lbHNle3V0Zjh0b2I2NHU9ZnVuY3Rpb24oYSl7cmV0dXJuIGhleHRvYjY0dSh1cmljbXB0b2hleChlbmNvZGVVUklDb21wb25lbnRBbGwoYSkpKX07YjY0dXRvdXRmOD1mdW5jdGlvbihhKXtyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGhleHRvdXJpY21wKGI2NHV0b2hleChhKSkpfX1mdW5jdGlvbiB1dGY4dG9iNjQoYSl7cmV0dXJuIGhleDJiNjQodXJpY21wdG9oZXgoZW5jb2RlVVJJQ29tcG9uZW50QWxsKGEpKSl9ZnVuY3Rpb24gYjY0dG91dGY4KGEpe3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoaGV4dG91cmljbXAoYjY0dG9oZXgoYSkpKX1mdW5jdGlvbiB1dGY4dG9oZXgoYSl7cmV0dXJuIHVyaWNtcHRvaGV4KGVuY29kZVVSSUNvbXBvbmVudEFsbChhKSl9ZnVuY3Rpb24gaGV4dG91dGY4KGEpe3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoaGV4dG91cmljbXAoYSkpfWZ1bmN0aW9uIGhleHRvcnN0cihjKXt2YXIgYj1cIlwiO2Zvcih2YXIgYT0wO2E8Yy5sZW5ndGgtMTthKz0yKXtiKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KGMuc3Vic3RyKGEsMiksMTYpKX1yZXR1cm4gYn1mdW5jdGlvbiByc3RydG9oZXgoYyl7dmFyIGE9XCJcIjtmb3IodmFyIGI9MDtiPGMubGVuZ3RoO2IrKyl7YSs9KFwiMFwiK2MuY2hhckNvZGVBdChiKS50b1N0cmluZygxNikpLnNsaWNlKC0yKX1yZXR1cm4gYX1mdW5jdGlvbiBoZXh0b2I2NChhKXtyZXR1cm4gaGV4MmI2NChhKX1mdW5jdGlvbiBoZXh0b2I2NG5sKGIpe3ZhciBhPWhleHRvYjY0KGIpO3ZhciBjPWEucmVwbGFjZSgvKC57NjR9KS9nLFwiJDFcXHJcXG5cIik7Yz1jLnJlcGxhY2UoL1xcclxcbiQvLFwiXCIpO3JldHVybiBjfWZ1bmN0aW9uIGI2NG5sdG9oZXgoYil7dmFyIGE9Yi5yZXBsYWNlKC9bXjAtOUEtWmEtelxcLys9XSovZyxcIlwiKTt2YXIgYz1iNjR0b2hleChhKTtyZXR1cm4gY31mdW5jdGlvbiB1cmljbXB0b2hleChhKXtyZXR1cm4gYS5yZXBsYWNlKC8lL2csXCJcIil9ZnVuY3Rpb24gaGV4dG91cmljbXAoYSl7cmV0dXJuIGEucmVwbGFjZSgvKC4uKS9nLFwiJSQxXCIpfWZ1bmN0aW9uIGVuY29kZVVSSUNvbXBvbmVudEFsbChhKXt2YXIgZD1lbmNvZGVVUklDb21wb25lbnQoYSk7dmFyIGI9XCJcIjtmb3IodmFyIGM9MDtjPGQubGVuZ3RoO2MrKyl7aWYoZFtjXT09XCIlXCIpe2I9YitkLnN1YnN0cihjLDMpO2M9YysyfWVsc2V7Yj1iK1wiJVwiK3N0b2hleChkW2NdKX19cmV0dXJuIGJ9ZnVuY3Rpb24gbmV3bGluZV90b1VuaXgoYSl7YT1hLnJlcGxhY2UoL1xcclxcbi9tZyxcIlxcblwiKTtyZXR1cm4gYX1mdW5jdGlvbiBuZXdsaW5lX3RvRG9zKGEpe2E9YS5yZXBsYWNlKC9cXHJcXG4vbWcsXCJcXG5cIik7YT1hLnJlcGxhY2UoL1xcbi9tZyxcIlxcclxcblwiKTtyZXR1cm4gYX1mdW5jdGlvbiBpbnRhcnlzdHJ0b2hleChiKXtiPWIucmVwbGFjZSgvXlxccypcXFtcXHMqLyxcIlwiKTtiPWIucmVwbGFjZSgvXFxzKlxcXVxccyokLyxcIlwiKTtiPWIucmVwbGFjZSgvXFxzKi9nLFwiXCIpO3RyeXt2YXIgYz1iLnNwbGl0KC8sLykubWFwKGZ1bmN0aW9uKGcsZSxoKXt2YXIgZj1wYXJzZUludChnKTtpZihmPDB8fDI1NTxmKXt0aHJvd1wiaW50ZWdlciBub3QgaW4gcmFuZ2UgMC0yNTVcIn12YXIgZD0oXCIwMFwiK2YudG9TdHJpbmcoMTYpKS5zbGljZSgtMik7cmV0dXJuIGR9KS5qb2luKFwiXCIpO3JldHVybiBjfWNhdGNoKGEpe3Rocm93XCJtYWxmb3JtZWQgaW50ZWdlciBhcnJheSBzdHJpbmc6IFwiK2F9fXZhciBzdHJkaWZmaWR4PWZ1bmN0aW9uKGMsYSl7dmFyIGQ9Yy5sZW5ndGg7aWYoYy5sZW5ndGg+YS5sZW5ndGgpe2Q9YS5sZW5ndGh9Zm9yKHZhciBiPTA7YjxkO2IrKyl7aWYoYy5jaGFyQ29kZUF0KGIpIT1hLmNoYXJDb2RlQXQoYikpe3JldHVybiBifX1pZihjLmxlbmd0aCE9YS5sZW5ndGgpe3JldHVybiBkfXJldHVybiAtMX07XG4vKiEgY3J5cHRvLTEuMS44LmpzIChjKSAyMDEzLTIwMTYgS2VuamkgVXJ1c2hpbWEgfCBranVyLmdpdGh1Yi5jb20vanNyc2FzaWduL2xpY2Vuc2VcbiAqL1xuaWYodHlwZW9mIEtKVVI9PVwidW5kZWZpbmVkXCJ8fCFLSlVSKXtLSlVSPXt9fWlmKHR5cGVvZiBLSlVSLmNyeXB0bz09XCJ1bmRlZmluZWRcInx8IUtKVVIuY3J5cHRvKXtLSlVSLmNyeXB0bz17fX1LSlVSLmNyeXB0by5VdGlsPW5ldyBmdW5jdGlvbigpe3RoaXMuRElHRVNUSU5GT0hFQUQ9e3NoYTE6XCIzMDIxMzAwOTA2MDUyYjBlMDMwMjFhMDUwMDA0MTRcIixzaGEyMjQ6XCIzMDJkMzAwZDA2MDk2MDg2NDgwMTY1MDMwNDAyMDQwNTAwMDQxY1wiLHNoYTI1NjpcIjMwMzEzMDBkMDYwOTYwODY0ODAxNjUwMzA0MDIwMTA1MDAwNDIwXCIsc2hhMzg0OlwiMzA0MTMwMGQwNjA5NjA4NjQ4MDE2NTAzMDQwMjAyMDUwMDA0MzBcIixzaGE1MTI6XCIzMDUxMzAwZDA2MDk2MDg2NDgwMTY1MDMwNDAyMDMwNTAwMDQ0MFwiLG1kMjpcIjMwMjAzMDBjMDYwODJhODY0ODg2ZjcwZDAyMDIwNTAwMDQxMFwiLG1kNTpcIjMwMjAzMDBjMDYwODJhODY0ODg2ZjcwZDAyMDUwNTAwMDQxMFwiLHJpcGVtZDE2MDpcIjMwMjEzMDA5MDYwNTJiMjQwMzAyMDEwNTAwMDQxNFwiLH07dGhpcy5ERUZBVUxUUFJPVklERVI9e21kNTpcImNyeXB0b2pzXCIsc2hhMTpcImNyeXB0b2pzXCIsc2hhMjI0OlwiY3J5cHRvanNcIixzaGEyNTY6XCJjcnlwdG9qc1wiLHNoYTM4NDpcImNyeXB0b2pzXCIsc2hhNTEyOlwiY3J5cHRvanNcIixyaXBlbWQxNjA6XCJjcnlwdG9qc1wiLGhtYWNtZDU6XCJjcnlwdG9qc1wiLGhtYWNzaGExOlwiY3J5cHRvanNcIixobWFjc2hhMjI0OlwiY3J5cHRvanNcIixobWFjc2hhMjU2OlwiY3J5cHRvanNcIixobWFjc2hhMzg0OlwiY3J5cHRvanNcIixobWFjc2hhNTEyOlwiY3J5cHRvanNcIixobWFjcmlwZW1kMTYwOlwiY3J5cHRvanNcIixNRDV3aXRoUlNBOlwiY3J5cHRvanMvanNyc2FcIixTSEExd2l0aFJTQTpcImNyeXB0b2pzL2pzcnNhXCIsU0hBMjI0d2l0aFJTQTpcImNyeXB0b2pzL2pzcnNhXCIsU0hBMjU2d2l0aFJTQTpcImNyeXB0b2pzL2pzcnNhXCIsU0hBMzg0d2l0aFJTQTpcImNyeXB0b2pzL2pzcnNhXCIsU0hBNTEyd2l0aFJTQTpcImNyeXB0b2pzL2pzcnNhXCIsUklQRU1EMTYwd2l0aFJTQTpcImNyeXB0b2pzL2pzcnNhXCIsTUQ1d2l0aEVDRFNBOlwiY3J5cHRvanMvanNyc2FcIixTSEExd2l0aEVDRFNBOlwiY3J5cHRvanMvanNyc2FcIixTSEEyMjR3aXRoRUNEU0E6XCJjcnlwdG9qcy9qc3JzYVwiLFNIQTI1NndpdGhFQ0RTQTpcImNyeXB0b2pzL2pzcnNhXCIsU0hBMzg0d2l0aEVDRFNBOlwiY3J5cHRvanMvanNyc2FcIixTSEE1MTJ3aXRoRUNEU0E6XCJjcnlwdG9qcy9qc3JzYVwiLFJJUEVNRDE2MHdpdGhFQ0RTQTpcImNyeXB0b2pzL2pzcnNhXCIsU0hBMXdpdGhEU0E6XCJjcnlwdG9qcy9qc3JzYVwiLFNIQTIyNHdpdGhEU0E6XCJjcnlwdG9qcy9qc3JzYVwiLFNIQTI1NndpdGhEU0E6XCJjcnlwdG9qcy9qc3JzYVwiLE1ENXdpdGhSU0FhbmRNR0YxOlwiY3J5cHRvanMvanNyc2FcIixTSEExd2l0aFJTQWFuZE1HRjE6XCJjcnlwdG9qcy9qc3JzYVwiLFNIQTIyNHdpdGhSU0FhbmRNR0YxOlwiY3J5cHRvanMvanNyc2FcIixTSEEyNTZ3aXRoUlNBYW5kTUdGMTpcImNyeXB0b2pzL2pzcnNhXCIsU0hBMzg0d2l0aFJTQWFuZE1HRjE6XCJjcnlwdG9qcy9qc3JzYVwiLFNIQTUxMndpdGhSU0FhbmRNR0YxOlwiY3J5cHRvanMvanNyc2FcIixSSVBFTUQxNjB3aXRoUlNBYW5kTUdGMTpcImNyeXB0b2pzL2pzcnNhXCIsfTt0aGlzLkNSWVBUT0pTTUVTU0FHRURJR0VTVE5BTUU9e21kNTpDcnlwdG9KUy5hbGdvLk1ENSxzaGExOkNyeXB0b0pTLmFsZ28uU0hBMSxzaGEyMjQ6Q3J5cHRvSlMuYWxnby5TSEEyMjQsc2hhMjU2OkNyeXB0b0pTLmFsZ28uU0hBMjU2LHNoYTM4NDpDcnlwdG9KUy5hbGdvLlNIQTM4NCxzaGE1MTI6Q3J5cHRvSlMuYWxnby5TSEE1MTIscmlwZW1kMTYwOkNyeXB0b0pTLmFsZ28uUklQRU1EMTYwfTt0aGlzLmdldERpZ2VzdEluZm9IZXg9ZnVuY3Rpb24oYSxiKXtpZih0eXBlb2YgdGhpcy5ESUdFU1RJTkZPSEVBRFtiXT09XCJ1bmRlZmluZWRcIil7dGhyb3dcImFsZyBub3Qgc3VwcG9ydGVkIGluIFV0aWwuRElHRVNUSU5GT0hFQUQ6IFwiK2J9cmV0dXJuIHRoaXMuRElHRVNUSU5GT0hFQURbYl0rYX07dGhpcy5nZXRQYWRkZWREaWdlc3RJbmZvSGV4PWZ1bmN0aW9uKGgsYSxqKXt2YXIgYz10aGlzLmdldERpZ2VzdEluZm9IZXgoaCxhKTt2YXIgZD1qLzQ7aWYoYy5sZW5ndGgrMjI+ZCl7dGhyb3dcImtleSBpcyB0b28gc2hvcnQgZm9yIFNpZ0FsZzoga2V5bGVuPVwiK2orXCIsXCIrYX12YXIgYj1cIjAwMDFcIjt2YXIgaz1cIjAwXCIrYzt2YXIgZz1cIlwiO3ZhciBsPWQtYi5sZW5ndGgtay5sZW5ndGg7Zm9yKHZhciBmPTA7ZjxsO2YrPTIpe2crPVwiZmZcIn12YXIgZT1iK2craztyZXR1cm4gZX07dGhpcy5oYXNoU3RyaW5nPWZ1bmN0aW9uKGEsYyl7dmFyIGI9bmV3IEtKVVIuY3J5cHRvLk1lc3NhZ2VEaWdlc3Qoe2FsZzpjfSk7cmV0dXJuIGIuZGlnZXN0U3RyaW5nKGEpfTt0aGlzLmhhc2hIZXg9ZnVuY3Rpb24oYixjKXt2YXIgYT1uZXcgS0pVUi5jcnlwdG8uTWVzc2FnZURpZ2VzdCh7YWxnOmN9KTtyZXR1cm4gYS5kaWdlc3RIZXgoYil9O3RoaXMuc2hhMT1mdW5jdGlvbihhKXt2YXIgYj1uZXcgS0pVUi5jcnlwdG8uTWVzc2FnZURpZ2VzdCh7YWxnOlwic2hhMVwiLHByb3Y6XCJjcnlwdG9qc1wifSk7cmV0dXJuIGIuZGlnZXN0U3RyaW5nKGEpfTt0aGlzLnNoYTI1Nj1mdW5jdGlvbihhKXt2YXIgYj1uZXcgS0pVUi5jcnlwdG8uTWVzc2FnZURpZ2VzdCh7YWxnOlwic2hhMjU2XCIscHJvdjpcImNyeXB0b2pzXCJ9KTtyZXR1cm4gYi5kaWdlc3RTdHJpbmcoYSl9O3RoaXMuc2hhMjU2SGV4PWZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBLSlVSLmNyeXB0by5NZXNzYWdlRGlnZXN0KHthbGc6XCJzaGEyNTZcIixwcm92OlwiY3J5cHRvanNcIn0pO3JldHVybiBiLmRpZ2VzdEhleChhKX07dGhpcy5zaGE1MTI9ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IEtKVVIuY3J5cHRvLk1lc3NhZ2VEaWdlc3Qoe2FsZzpcInNoYTUxMlwiLHByb3Y6XCJjcnlwdG9qc1wifSk7cmV0dXJuIGIuZGlnZXN0U3RyaW5nKGEpfTt0aGlzLnNoYTUxMkhleD1mdW5jdGlvbihhKXt2YXIgYj1uZXcgS0pVUi5jcnlwdG8uTWVzc2FnZURpZ2VzdCh7YWxnOlwic2hhNTEyXCIscHJvdjpcImNyeXB0b2pzXCJ9KTtyZXR1cm4gYi5kaWdlc3RIZXgoYSl9O3RoaXMubWQ1PWZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBLSlVSLmNyeXB0by5NZXNzYWdlRGlnZXN0KHthbGc6XCJtZDVcIixwcm92OlwiY3J5cHRvanNcIn0pO3JldHVybiBiLmRpZ2VzdFN0cmluZyhhKX07dGhpcy5yaXBlbWQxNjA9ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IEtKVVIuY3J5cHRvLk1lc3NhZ2VEaWdlc3Qoe2FsZzpcInJpcGVtZDE2MFwiLHByb3Y6XCJjcnlwdG9qc1wifSk7cmV0dXJuIGIuZGlnZXN0U3RyaW5nKGEpfTt0aGlzLmdldENyeXB0b0pTTURCeU5hbWU9ZnVuY3Rpb24oYSl7fX07S0pVUi5jcnlwdG8uTWVzc2FnZURpZ2VzdD1mdW5jdGlvbihjKXt2YXIgYj1udWxsO3ZhciBhPW51bGw7dmFyIGQ9bnVsbDt0aGlzLnNldEFsZ0FuZFByb3ZpZGVyPWZ1bmN0aW9uKGcsZil7aWYoZyE9bnVsbCYmZj09PXVuZGVmaW5lZCl7Zj1LSlVSLmNyeXB0by5VdGlsLkRFRkFVTFRQUk9WSURFUltnXX1pZihcIjptZDU6c2hhMTpzaGEyMjQ6c2hhMjU2OnNoYTM4NDpzaGE1MTI6cmlwZW1kMTYwOlwiLmluZGV4T2YoZykhPS0xJiZmPT1cImNyeXB0b2pzXCIpe3RyeXt0aGlzLm1kPUtKVVIuY3J5cHRvLlV0aWwuQ1JZUFRPSlNNRVNTQUdFRElHRVNUTkFNRVtnXS5jcmVhdGUoKX1jYXRjaChlKXt0aHJvd1wic2V0QWxnQW5kUHJvdmlkZXIgaGFzaCBhbGcgc2V0IGZhaWwgYWxnPVwiK2crXCIvXCIrZX10aGlzLnVwZGF0ZVN0cmluZz1mdW5jdGlvbihoKXt0aGlzLm1kLnVwZGF0ZShoKX07dGhpcy51cGRhdGVIZXg9ZnVuY3Rpb24oaCl7dmFyIGk9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZShoKTt0aGlzLm1kLnVwZGF0ZShpKX07dGhpcy5kaWdlc3Q9ZnVuY3Rpb24oKXt2YXIgaD10aGlzLm1kLmZpbmFsaXplKCk7cmV0dXJuIGgudG9TdHJpbmcoQ3J5cHRvSlMuZW5jLkhleCl9O3RoaXMuZGlnZXN0U3RyaW5nPWZ1bmN0aW9uKGgpe3RoaXMudXBkYXRlU3RyaW5nKGgpO3JldHVybiB0aGlzLmRpZ2VzdCgpfTt0aGlzLmRpZ2VzdEhleD1mdW5jdGlvbihoKXt0aGlzLnVwZGF0ZUhleChoKTtyZXR1cm4gdGhpcy5kaWdlc3QoKX19aWYoXCI6c2hhMjU2OlwiLmluZGV4T2YoZykhPS0xJiZmPT1cInNqY2xcIil7dHJ5e3RoaXMubWQ9bmV3IHNqY2wuaGFzaC5zaGEyNTYoKX1jYXRjaChlKXt0aHJvd1wic2V0QWxnQW5kUHJvdmlkZXIgaGFzaCBhbGcgc2V0IGZhaWwgYWxnPVwiK2crXCIvXCIrZX10aGlzLnVwZGF0ZVN0cmluZz1mdW5jdGlvbihoKXt0aGlzLm1kLnVwZGF0ZShoKX07dGhpcy51cGRhdGVIZXg9ZnVuY3Rpb24oaSl7dmFyIGg9c2pjbC5jb2RlYy5oZXgudG9CaXRzKGkpO3RoaXMubWQudXBkYXRlKGgpfTt0aGlzLmRpZ2VzdD1mdW5jdGlvbigpe3ZhciBoPXRoaXMubWQuZmluYWxpemUoKTtyZXR1cm4gc2pjbC5jb2RlYy5oZXguZnJvbUJpdHMoaCl9O3RoaXMuZGlnZXN0U3RyaW5nPWZ1bmN0aW9uKGgpe3RoaXMudXBkYXRlU3RyaW5nKGgpO3JldHVybiB0aGlzLmRpZ2VzdCgpfTt0aGlzLmRpZ2VzdEhleD1mdW5jdGlvbihoKXt0aGlzLnVwZGF0ZUhleChoKTtyZXR1cm4gdGhpcy5kaWdlc3QoKX19fTt0aGlzLnVwZGF0ZVN0cmluZz1mdW5jdGlvbihlKXt0aHJvd1widXBkYXRlU3RyaW5nKHN0cikgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBhbGcvcHJvdjogXCIrdGhpcy5hbGdOYW1lK1wiL1wiK3RoaXMucHJvdk5hbWV9O3RoaXMudXBkYXRlSGV4PWZ1bmN0aW9uKGUpe3Rocm93XCJ1cGRhdGVIZXgoaGV4KSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGFsZy9wcm92OiBcIit0aGlzLmFsZ05hbWUrXCIvXCIrdGhpcy5wcm92TmFtZX07dGhpcy5kaWdlc3Q9ZnVuY3Rpb24oKXt0aHJvd1wiZGlnZXN0KCkgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBhbGcvcHJvdjogXCIrdGhpcy5hbGdOYW1lK1wiL1wiK3RoaXMucHJvdk5hbWV9O3RoaXMuZGlnZXN0U3RyaW5nPWZ1bmN0aW9uKGUpe3Rocm93XCJkaWdlc3RTdHJpbmcoc3RyKSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGFsZy9wcm92OiBcIit0aGlzLmFsZ05hbWUrXCIvXCIrdGhpcy5wcm92TmFtZX07dGhpcy5kaWdlc3RIZXg9ZnVuY3Rpb24oZSl7dGhyb3dcImRpZ2VzdEhleChoZXgpIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgYWxnL3Byb3Y6IFwiK3RoaXMuYWxnTmFtZStcIi9cIit0aGlzLnByb3ZOYW1lfTtpZihjIT09dW5kZWZpbmVkKXtpZihjLmFsZyE9PXVuZGVmaW5lZCl7dGhpcy5hbGdOYW1lPWMuYWxnO2lmKGMucHJvdj09PXVuZGVmaW5lZCl7dGhpcy5wcm92TmFtZT1LSlVSLmNyeXB0by5VdGlsLkRFRkFVTFRQUk9WSURFUlt0aGlzLmFsZ05hbWVdfXRoaXMuc2V0QWxnQW5kUHJvdmlkZXIodGhpcy5hbGdOYW1lLHRoaXMucHJvdk5hbWUpfX19O0tKVVIuY3J5cHRvLk1hYz1mdW5jdGlvbihkKXt2YXIgZj1udWxsO3ZhciBjPW51bGw7dmFyIGE9bnVsbDt2YXIgZT1udWxsO3ZhciBiPW51bGw7dGhpcy5zZXRBbGdBbmRQcm92aWRlcj1mdW5jdGlvbihrLGkpe2s9ay50b0xvd2VyQ2FzZSgpO2lmKGs9PW51bGwpe2s9XCJobWFjc2hhMVwifWs9ay50b0xvd2VyQ2FzZSgpO2lmKGsuc3Vic3RyKDAsNCkhPVwiaG1hY1wiKXt0aHJvd1wic2V0QWxnQW5kUHJvdmlkZXIgdW5zdXBwb3J0ZWQgSE1BQyBhbGc6IFwiK2t9aWYoaT09PXVuZGVmaW5lZCl7aT1LSlVSLmNyeXB0by5VdGlsLkRFRkFVTFRQUk9WSURFUltrXX10aGlzLmFsZ1Byb3Y9aytcIi9cIitpO3ZhciBnPWsuc3Vic3RyKDQpO2lmKFwiOm1kNTpzaGExOnNoYTIyNDpzaGEyNTY6c2hhMzg0OnNoYTUxMjpyaXBlbWQxNjA6XCIuaW5kZXhPZihnKSE9LTEmJmk9PVwiY3J5cHRvanNcIil7dHJ5e3ZhciBqPUtKVVIuY3J5cHRvLlV0aWwuQ1JZUFRPSlNNRVNTQUdFRElHRVNUTkFNRVtnXTt0aGlzLm1hYz1DcnlwdG9KUy5hbGdvLkhNQUMuY3JlYXRlKGosdGhpcy5wYXNzKX1jYXRjaChoKXt0aHJvd1wic2V0QWxnQW5kUHJvdmlkZXIgaGFzaCBhbGcgc2V0IGZhaWwgaGFzaEFsZz1cIitnK1wiL1wiK2h9dGhpcy51cGRhdGVTdHJpbmc9ZnVuY3Rpb24obCl7dGhpcy5tYWMudXBkYXRlKGwpfTt0aGlzLnVwZGF0ZUhleD1mdW5jdGlvbihsKXt2YXIgbT1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKGwpO3RoaXMubWFjLnVwZGF0ZShtKX07dGhpcy5kb0ZpbmFsPWZ1bmN0aW9uKCl7dmFyIGw9dGhpcy5tYWMuZmluYWxpemUoKTtyZXR1cm4gbC50b1N0cmluZyhDcnlwdG9KUy5lbmMuSGV4KX07dGhpcy5kb0ZpbmFsU3RyaW5nPWZ1bmN0aW9uKGwpe3RoaXMudXBkYXRlU3RyaW5nKGwpO3JldHVybiB0aGlzLmRvRmluYWwoKX07dGhpcy5kb0ZpbmFsSGV4PWZ1bmN0aW9uKGwpe3RoaXMudXBkYXRlSGV4KGwpO3JldHVybiB0aGlzLmRvRmluYWwoKX19fTt0aGlzLnVwZGF0ZVN0cmluZz1mdW5jdGlvbihnKXt0aHJvd1widXBkYXRlU3RyaW5nKHN0cikgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBhbGcvcHJvdjogXCIrdGhpcy5hbGdQcm92fTt0aGlzLnVwZGF0ZUhleD1mdW5jdGlvbihnKXt0aHJvd1widXBkYXRlSGV4KGhleCkgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBhbGcvcHJvdjogXCIrdGhpcy5hbGdQcm92fTt0aGlzLmRvRmluYWw9ZnVuY3Rpb24oKXt0aHJvd1wiZGlnZXN0KCkgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBhbGcvcHJvdjogXCIrdGhpcy5hbGdQcm92fTt0aGlzLmRvRmluYWxTdHJpbmc9ZnVuY3Rpb24oZyl7dGhyb3dcImRpZ2VzdFN0cmluZyhzdHIpIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgYWxnL3Byb3Y6IFwiK3RoaXMuYWxnUHJvdn07dGhpcy5kb0ZpbmFsSGV4PWZ1bmN0aW9uKGcpe3Rocm93XCJkaWdlc3RIZXgoaGV4KSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGFsZy9wcm92OiBcIit0aGlzLmFsZ1Byb3Z9O3RoaXMuc2V0UGFzc3dvcmQ9ZnVuY3Rpb24oaCl7aWYodHlwZW9mIGg9PVwic3RyaW5nXCIpe3ZhciBnPWg7aWYoaC5sZW5ndGglMj09MXx8IWgubWF0Y2goL15bMC05QS1GYS1mXSskLykpe2c9cnN0cnRvaGV4KGgpfXRoaXMucGFzcz1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKGcpO3JldHVybn1pZih0eXBlb2YgaCE9XCJvYmplY3RcIil7dGhyb3dcIktKVVIuY3J5cHRvLk1hYyB1bnN1cHBvcnRlZCBwYXNzd29yZCB0eXBlOiBcIitofXZhciBnPW51bGw7aWYoaC5oZXghPT11bmRlZmluZWQpe2lmKGguaGV4Lmxlbmd0aCUyIT0wfHwhaC5oZXgubWF0Y2goL15bMC05QS1GYS1mXSskLykpe3Rocm93XCJNYWM6IHdyb25nIGhleCBwYXNzd29yZDogXCIraC5oZXh9Zz1oLmhleH1pZihoLnV0ZjghPT11bmRlZmluZWQpe2c9dXRmOHRvaGV4KGgudXRmOCl9aWYoaC5yc3RyIT09dW5kZWZpbmVkKXtnPXJzdHJ0b2hleChoLnJzdHIpfWlmKGguYjY0IT09dW5kZWZpbmVkKXtnPWI2NHRvaGV4KGguYjY0KX1pZihoLmI2NHUhPT11bmRlZmluZWQpe2c9YjY0dXRvaGV4KGguYjY0dSl9aWYoZz09bnVsbCl7dGhyb3dcIktKVVIuY3J5cHRvLk1hYyB1bnN1cHBvcnRlZCBwYXNzd29yZCB0eXBlOiBcIitofXRoaXMucGFzcz1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKGcpfTtpZihkIT09dW5kZWZpbmVkKXtpZihkLnBhc3MhPT11bmRlZmluZWQpe3RoaXMuc2V0UGFzc3dvcmQoZC5wYXNzKX1pZihkLmFsZyE9PXVuZGVmaW5lZCl7dGhpcy5hbGdOYW1lPWQuYWxnO2lmKGQucHJvdj09PXVuZGVmaW5lZCl7dGhpcy5wcm92TmFtZT1LSlVSLmNyeXB0by5VdGlsLkRFRkFVTFRQUk9WSURFUlt0aGlzLmFsZ05hbWVdfXRoaXMuc2V0QWxnQW5kUHJvdmlkZXIodGhpcy5hbGdOYW1lLHRoaXMucHJvdk5hbWUpfX19O0tKVVIuY3J5cHRvLlNpZ25hdHVyZT1mdW5jdGlvbihvKXt2YXIgcT1udWxsO3ZhciBuPW51bGw7dmFyIHI9bnVsbDt2YXIgYz1udWxsO3ZhciBsPW51bGw7dmFyIGQ9bnVsbDt2YXIgaz1udWxsO3ZhciBoPW51bGw7dmFyIHA9bnVsbDt2YXIgZT1udWxsO3ZhciBiPS0xO3ZhciBnPW51bGw7dmFyIGo9bnVsbDt2YXIgYT1udWxsO3ZhciBpPW51bGw7dmFyIGY9bnVsbDt0aGlzLl9zZXRBbGdOYW1lcz1mdW5jdGlvbigpe2lmKHRoaXMuYWxnTmFtZS5tYXRjaCgvXiguKyl3aXRoKC4rKSQvKSl7dGhpcy5tZEFsZ05hbWU9UmVnRXhwLiQxLnRvTG93ZXJDYXNlKCk7dGhpcy5wdWJrZXlBbGdOYW1lPVJlZ0V4cC4kMi50b0xvd2VyQ2FzZSgpfX07dGhpcy5femVyb1BhZGRpbmdPZlNpZ25hdHVyZT1mdW5jdGlvbih4LHcpe3ZhciB2PVwiXCI7dmFyIHQ9dy80LXgubGVuZ3RoO2Zvcih2YXIgdT0wO3U8dDt1Kyspe3Y9ditcIjBcIn1yZXR1cm4gdit4fTt0aGlzLnNldEFsZ0FuZFByb3ZpZGVyPWZ1bmN0aW9uKHUsdCl7dGhpcy5fc2V0QWxnTmFtZXMoKTtpZih0IT1cImNyeXB0b2pzL2pzcnNhXCIpe3Rocm93XCJwcm92aWRlciBub3Qgc3VwcG9ydGVkOiBcIit0fWlmKFwiOm1kNTpzaGExOnNoYTIyNDpzaGEyNTY6c2hhMzg0OnNoYTUxMjpyaXBlbWQxNjA6XCIuaW5kZXhPZih0aGlzLm1kQWxnTmFtZSkhPS0xKXt0cnl7dGhpcy5tZD1uZXcgS0pVUi5jcnlwdG8uTWVzc2FnZURpZ2VzdCh7YWxnOnRoaXMubWRBbGdOYW1lfSl9Y2F0Y2gocyl7dGhyb3dcInNldEFsZ0FuZFByb3ZpZGVyIGhhc2ggYWxnIHNldCBmYWlsIGFsZz1cIit0aGlzLm1kQWxnTmFtZStcIi9cIitzfXRoaXMuaW5pdD1mdW5jdGlvbih3LHgpe3ZhciB5PW51bGw7dHJ5e2lmKHg9PT11bmRlZmluZWQpe3k9S0VZVVRJTC5nZXRLZXkodyl9ZWxzZXt5PUtFWVVUSUwuZ2V0S2V5KHcseCl9fWNhdGNoKHYpe3Rocm93XCJpbml0IGZhaWxlZDpcIit2fWlmKHkuaXNQcml2YXRlPT09dHJ1ZSl7dGhpcy5wcnZLZXk9eTt0aGlzLnN0YXRlPVwiU0lHTlwifWVsc2V7aWYoeS5pc1B1YmxpYz09PXRydWUpe3RoaXMucHViS2V5PXk7dGhpcy5zdGF0ZT1cIlZFUklGWVwifWVsc2V7dGhyb3dcImluaXQgZmFpbGVkLjpcIit5fX19O3RoaXMuaW5pdFNpZ249ZnVuY3Rpb24odil7aWYodHlwZW9mIHYuZWNwcnZoZXg9PVwic3RyaW5nXCImJnR5cGVvZiB2LmVjY3VydmVuYW1lPT1cInN0cmluZ1wiKXt0aGlzLmVjcHJ2aGV4PXYuZWNwcnZoZXg7dGhpcy5lY2N1cnZlbmFtZT12LmVjY3VydmVuYW1lfWVsc2V7dGhpcy5wcnZLZXk9dn10aGlzLnN0YXRlPVwiU0lHTlwifTt0aGlzLmluaXRWZXJpZnlCeVB1YmxpY0tleT1mdW5jdGlvbih2KXtpZih0eXBlb2Ygdi5lY3B1YmhleD09XCJzdHJpbmdcIiYmdHlwZW9mIHYuZWNjdXJ2ZW5hbWU9PVwic3RyaW5nXCIpe3RoaXMuZWNwdWJoZXg9di5lY3B1YmhleDt0aGlzLmVjY3VydmVuYW1lPXYuZWNjdXJ2ZW5hbWV9ZWxzZXtpZih2IGluc3RhbmNlb2YgS0pVUi5jcnlwdG8uRUNEU0Epe3RoaXMucHViS2V5PXZ9ZWxzZXtpZih2IGluc3RhbmNlb2YgUlNBS2V5KXt0aGlzLnB1YktleT12fX19dGhpcy5zdGF0ZT1cIlZFUklGWVwifTt0aGlzLmluaXRWZXJpZnlCeUNlcnRpZmljYXRlUEVNPWZ1bmN0aW9uKHYpe3ZhciB3PW5ldyBYNTA5KCk7dy5yZWFkQ2VydFBFTSh2KTt0aGlzLnB1YktleT13LnN1YmplY3RQdWJsaWNLZXlSU0E7dGhpcy5zdGF0ZT1cIlZFUklGWVwifTt0aGlzLnVwZGF0ZVN0cmluZz1mdW5jdGlvbih2KXt0aGlzLm1kLnVwZGF0ZVN0cmluZyh2KX07dGhpcy51cGRhdGVIZXg9ZnVuY3Rpb24odil7dGhpcy5tZC51cGRhdGVIZXgodil9O3RoaXMuc2lnbj1mdW5jdGlvbigpe3RoaXMuc0hhc2hIZXg9dGhpcy5tZC5kaWdlc3QoKTtpZih0eXBlb2YgdGhpcy5lY3BydmhleCE9XCJ1bmRlZmluZWRcIiYmdHlwZW9mIHRoaXMuZWNjdXJ2ZW5hbWUhPVwidW5kZWZpbmVkXCIpe3ZhciB2PW5ldyBLSlVSLmNyeXB0by5FQ0RTQSh7Y3VydmU6dGhpcy5lY2N1cnZlbmFtZX0pO3RoaXMuaFNpZ249di5zaWduSGV4KHRoaXMuc0hhc2hIZXgsdGhpcy5lY3BydmhleCl9ZWxzZXtpZih0aGlzLnBydktleSBpbnN0YW5jZW9mIFJTQUtleSYmdGhpcy5wdWJrZXlBbGdOYW1lPT1cInJzYWFuZG1nZjFcIil7dGhpcy5oU2lnbj10aGlzLnBydktleS5zaWduV2l0aE1lc3NhZ2VIYXNoUFNTKHRoaXMuc0hhc2hIZXgsdGhpcy5tZEFsZ05hbWUsdGhpcy5wc3NTYWx0TGVuKX1lbHNle2lmKHRoaXMucHJ2S2V5IGluc3RhbmNlb2YgUlNBS2V5JiZ0aGlzLnB1YmtleUFsZ05hbWU9PVwicnNhXCIpe3RoaXMuaFNpZ249dGhpcy5wcnZLZXkuc2lnbldpdGhNZXNzYWdlSGFzaCh0aGlzLnNIYXNoSGV4LHRoaXMubWRBbGdOYW1lKX1lbHNle2lmKHRoaXMucHJ2S2V5IGluc3RhbmNlb2YgS0pVUi5jcnlwdG8uRUNEU0Epe3RoaXMuaFNpZ249dGhpcy5wcnZLZXkuc2lnbldpdGhNZXNzYWdlSGFzaCh0aGlzLnNIYXNoSGV4KX1lbHNle2lmKHRoaXMucHJ2S2V5IGluc3RhbmNlb2YgS0pVUi5jcnlwdG8uRFNBKXt0aGlzLmhTaWduPXRoaXMucHJ2S2V5LnNpZ25XaXRoTWVzc2FnZUhhc2godGhpcy5zSGFzaEhleCl9ZWxzZXt0aHJvd1wiU2lnbmF0dXJlOiB1bnN1cHBvcnRlZCBwdWJsaWMga2V5IGFsZzogXCIrdGhpcy5wdWJrZXlBbGdOYW1lfX19fX1yZXR1cm4gdGhpcy5oU2lnbn07dGhpcy5zaWduU3RyaW5nPWZ1bmN0aW9uKHYpe3RoaXMudXBkYXRlU3RyaW5nKHYpO3JldHVybiB0aGlzLnNpZ24oKX07dGhpcy5zaWduSGV4PWZ1bmN0aW9uKHYpe3RoaXMudXBkYXRlSGV4KHYpO3JldHVybiB0aGlzLnNpZ24oKX07dGhpcy52ZXJpZnk9ZnVuY3Rpb24odil7dGhpcy5zSGFzaEhleD10aGlzLm1kLmRpZ2VzdCgpO2lmKHR5cGVvZiB0aGlzLmVjcHViaGV4IT1cInVuZGVmaW5lZFwiJiZ0eXBlb2YgdGhpcy5lY2N1cnZlbmFtZSE9XCJ1bmRlZmluZWRcIil7dmFyIHc9bmV3IEtKVVIuY3J5cHRvLkVDRFNBKHtjdXJ2ZTp0aGlzLmVjY3VydmVuYW1lfSk7cmV0dXJuIHcudmVyaWZ5SGV4KHRoaXMuc0hhc2hIZXgsdix0aGlzLmVjcHViaGV4KX1lbHNle2lmKHRoaXMucHViS2V5IGluc3RhbmNlb2YgUlNBS2V5JiZ0aGlzLnB1YmtleUFsZ05hbWU9PVwicnNhYW5kbWdmMVwiKXtyZXR1cm4gdGhpcy5wdWJLZXkudmVyaWZ5V2l0aE1lc3NhZ2VIYXNoUFNTKHRoaXMuc0hhc2hIZXgsdix0aGlzLm1kQWxnTmFtZSx0aGlzLnBzc1NhbHRMZW4pfWVsc2V7aWYodGhpcy5wdWJLZXkgaW5zdGFuY2VvZiBSU0FLZXkmJnRoaXMucHVia2V5QWxnTmFtZT09XCJyc2FcIil7cmV0dXJuIHRoaXMucHViS2V5LnZlcmlmeVdpdGhNZXNzYWdlSGFzaCh0aGlzLnNIYXNoSGV4LHYpfWVsc2V7aWYodGhpcy5wdWJLZXkgaW5zdGFuY2VvZiBLSlVSLmNyeXB0by5FQ0RTQSl7cmV0dXJuIHRoaXMucHViS2V5LnZlcmlmeVdpdGhNZXNzYWdlSGFzaCh0aGlzLnNIYXNoSGV4LHYpfWVsc2V7aWYodGhpcy5wdWJLZXkgaW5zdGFuY2VvZiBLSlVSLmNyeXB0by5EU0Epe3JldHVybiB0aGlzLnB1YktleS52ZXJpZnlXaXRoTWVzc2FnZUhhc2godGhpcy5zSGFzaEhleCx2KX1lbHNle3Rocm93XCJTaWduYXR1cmU6IHVuc3VwcG9ydGVkIHB1YmxpYyBrZXkgYWxnOiBcIit0aGlzLnB1YmtleUFsZ05hbWV9fX19fX19fTt0aGlzLmluaXQ9ZnVuY3Rpb24ocyx0KXt0aHJvd1wiaW5pdChrZXksIHBhc3MpIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgYWxnOnByb3Y9XCIrdGhpcy5hbGdQcm92TmFtZX07dGhpcy5pbml0VmVyaWZ5QnlQdWJsaWNLZXk9ZnVuY3Rpb24ocyl7dGhyb3dcImluaXRWZXJpZnlCeVB1YmxpY0tleShyc2FQdWJLZXl5KSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGFsZzpwcm92PVwiK3RoaXMuYWxnUHJvdk5hbWV9O3RoaXMuaW5pdFZlcmlmeUJ5Q2VydGlmaWNhdGVQRU09ZnVuY3Rpb24ocyl7dGhyb3dcImluaXRWZXJpZnlCeUNlcnRpZmljYXRlUEVNKGNlcnRQRU0pIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgYWxnOnByb3Y9XCIrdGhpcy5hbGdQcm92TmFtZX07dGhpcy5pbml0U2lnbj1mdW5jdGlvbihzKXt0aHJvd1wiaW5pdFNpZ24ocHJ2S2V5KSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGFsZzpwcm92PVwiK3RoaXMuYWxnUHJvdk5hbWV9O3RoaXMudXBkYXRlU3RyaW5nPWZ1bmN0aW9uKHMpe3Rocm93XCJ1cGRhdGVTdHJpbmcoc3RyKSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGFsZzpwcm92PVwiK3RoaXMuYWxnUHJvdk5hbWV9O3RoaXMudXBkYXRlSGV4PWZ1bmN0aW9uKHMpe3Rocm93XCJ1cGRhdGVIZXgoaGV4KSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGFsZzpwcm92PVwiK3RoaXMuYWxnUHJvdk5hbWV9O3RoaXMuc2lnbj1mdW5jdGlvbigpe3Rocm93XCJzaWduKCkgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBhbGc6cHJvdj1cIit0aGlzLmFsZ1Byb3ZOYW1lfTt0aGlzLnNpZ25TdHJpbmc9ZnVuY3Rpb24ocyl7dGhyb3dcImRpZ2VzdFN0cmluZyhzdHIpIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgYWxnOnByb3Y9XCIrdGhpcy5hbGdQcm92TmFtZX07dGhpcy5zaWduSGV4PWZ1bmN0aW9uKHMpe3Rocm93XCJkaWdlc3RIZXgoaGV4KSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGFsZzpwcm92PVwiK3RoaXMuYWxnUHJvdk5hbWV9O3RoaXMudmVyaWZ5PWZ1bmN0aW9uKHMpe3Rocm93XCJ2ZXJpZnkoaFNpZ1ZhbCkgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBhbGc6cHJvdj1cIit0aGlzLmFsZ1Byb3ZOYW1lfTt0aGlzLmluaXRQYXJhbXM9bztpZihvIT09dW5kZWZpbmVkKXtpZihvLmFsZyE9PXVuZGVmaW5lZCl7dGhpcy5hbGdOYW1lPW8uYWxnO2lmKG8ucHJvdj09PXVuZGVmaW5lZCl7dGhpcy5wcm92TmFtZT1LSlVSLmNyeXB0by5VdGlsLkRFRkFVTFRQUk9WSURFUlt0aGlzLmFsZ05hbWVdfWVsc2V7dGhpcy5wcm92TmFtZT1vLnByb3Z9dGhpcy5hbGdQcm92TmFtZT10aGlzLmFsZ05hbWUrXCI6XCIrdGhpcy5wcm92TmFtZTt0aGlzLnNldEFsZ0FuZFByb3ZpZGVyKHRoaXMuYWxnTmFtZSx0aGlzLnByb3ZOYW1lKTt0aGlzLl9zZXRBbGdOYW1lcygpfWlmKG8ucHNzc2FsdGxlbiE9PXVuZGVmaW5lZCl7dGhpcy5wc3NTYWx0TGVuPW8ucHNzc2FsdGxlbn1pZihvLnBydmtleXBlbSE9PXVuZGVmaW5lZCl7aWYoby5wcnZrZXlwYXMhPT11bmRlZmluZWQpe3Rocm93XCJib3RoIHBydmtleXBlbSBhbmQgcHJ2a2V5cGFzIHBhcmFtZXRlcnMgbm90IHN1cHBvcnRlZFwifWVsc2V7dHJ5e3ZhciBxPW5ldyBSU0FLZXkoKTtxLnJlYWRQcml2YXRlS2V5RnJvbVBFTVN0cmluZyhvLnBydmtleXBlbSk7dGhpcy5pbml0U2lnbihxKX1jYXRjaChtKXt0aHJvd1wiZmF0YWwgZXJyb3IgdG8gbG9hZCBwZW0gcHJpdmF0ZSBrZXk6IFwiK219fX19fTtLSlVSLmNyeXB0by5PSUQ9bmV3IGZ1bmN0aW9uKCl7dGhpcy5vaWRoZXgybmFtZT17XCIyYTg2NDg4NmY3MGQwMTAxMDFcIjpcInJzYUVuY3J5cHRpb25cIixcIjJhODY0OGNlM2QwMjAxXCI6XCJlY1B1YmxpY0tleVwiLFwiMmE4NjQ4Y2UzODA0MDFcIjpcImRzYVwiLFwiMmE4NjQ4Y2UzZDAzMDEwN1wiOlwic2VjcDI1NnIxXCIsXCIyYjgxMDQwMDFmXCI6XCJzZWNwMTkyazFcIixcIjJiODEwNDAwMjFcIjpcInNlY3AyMjRyMVwiLFwiMmI4MTA0MDAwYVwiOlwic2VjcDI1NmsxXCIsXCIyYjgxMDQwMDIzXCI6XCJzZWNwNTIxcjFcIixcIjJiODEwNDAwMjJcIjpcInNlY3AzODRyMVwiLFwiMmE4NjQ4Y2UzODA0MDNcIjpcIlNIQTF3aXRoRFNBXCIsXCI2MDg2NDgwMTY1MDMwNDAzMDFcIjpcIlNIQTIyNHdpdGhEU0FcIixcIjYwODY0ODAxNjUwMzA0MDMwMlwiOlwiU0hBMjU2d2l0aERTQVwiLH19O1xuLyohIGVjZHNhLW1vZGlmaWVkLTEuMC40LmpzIChjKSBTdGVwaGFuIFRob21hcywgS2VuamkgVXJ1c2hpbWEgfCBnaXRodWIuY29tL2JpdGNvaW5qcy9iaXRjb2luanMtbGliL2Jsb2IvbWFzdGVyL0xJQ0VOU0VcbiAqL1xuaWYodHlwZW9mIEtKVVI9PVwidW5kZWZpbmVkXCJ8fCFLSlVSKXtLSlVSPXt9fWlmKHR5cGVvZiBLSlVSLmNyeXB0bz09XCJ1bmRlZmluZWRcInx8IUtKVVIuY3J5cHRvKXtLSlVSLmNyeXB0bz17fX1LSlVSLmNyeXB0by5FQ0RTQT1mdW5jdGlvbihoKXt2YXIgZT1cInNlY3AyNTZyMVwiO3ZhciBnPW51bGw7dmFyIGI9bnVsbDt2YXIgZj1udWxsO3ZhciBhPW5ldyBTZWN1cmVSYW5kb20oKTt2YXIgZD1udWxsO3RoaXMudHlwZT1cIkVDXCI7ZnVuY3Rpb24gYyhzLG8scixuKXt2YXIgaj1NYXRoLm1heChvLmJpdExlbmd0aCgpLG4uYml0TGVuZ3RoKCkpO3ZhciB0PXMuYWRkMkQocik7dmFyIHE9cy5jdXJ2ZS5nZXRJbmZpbml0eSgpO2Zvcih2YXIgcD1qLTE7cD49MDstLXApe3E9cS50d2ljZTJEKCk7cS56PUJpZ0ludGVnZXIuT05FO2lmKG8udGVzdEJpdChwKSl7aWYobi50ZXN0Qml0KHApKXtxPXEuYWRkMkQodCl9ZWxzZXtxPXEuYWRkMkQocyl9fWVsc2V7aWYobi50ZXN0Qml0KHApKXtxPXEuYWRkMkQocil9fX1yZXR1cm4gcX10aGlzLmdldEJpZ1JhbmRvbT1mdW5jdGlvbihpKXtyZXR1cm4gbmV3IEJpZ0ludGVnZXIoaS5iaXRMZW5ndGgoKSxhKS5tb2QoaS5zdWJ0cmFjdChCaWdJbnRlZ2VyLk9ORSkpLmFkZChCaWdJbnRlZ2VyLk9ORSl9O3RoaXMuc2V0TmFtZWRDdXJ2ZT1mdW5jdGlvbihpKXt0aGlzLmVjcGFyYW1zPUtKVVIuY3J5cHRvLkVDUGFyYW1ldGVyREIuZ2V0QnlOYW1lKGkpO3RoaXMucHJ2S2V5SGV4PW51bGw7dGhpcy5wdWJLZXlIZXg9bnVsbDt0aGlzLmN1cnZlTmFtZT1pfTt0aGlzLnNldFByaXZhdGVLZXlIZXg9ZnVuY3Rpb24oaSl7dGhpcy5pc1ByaXZhdGU9dHJ1ZTt0aGlzLnBydktleUhleD1pfTt0aGlzLnNldFB1YmxpY0tleUhleD1mdW5jdGlvbihpKXt0aGlzLmlzUHVibGljPXRydWU7dGhpcy5wdWJLZXlIZXg9aX07dGhpcy5nZW5lcmF0ZUtleVBhaXJIZXg9ZnVuY3Rpb24oKXt2YXIgaz10aGlzLmVjcGFyYW1zLm47dmFyIG49dGhpcy5nZXRCaWdSYW5kb20oayk7dmFyIGw9dGhpcy5lY3BhcmFtcy5HLm11bHRpcGx5KG4pO3ZhciBxPWwuZ2V0WCgpLnRvQmlnSW50ZWdlcigpO3ZhciBvPWwuZ2V0WSgpLnRvQmlnSW50ZWdlcigpO3ZhciBpPXRoaXMuZWNwYXJhbXMua2V5bGVuLzQ7dmFyIG09KFwiMDAwMDAwMDAwMFwiK24udG9TdHJpbmcoMTYpKS5zbGljZSgtaSk7dmFyIHI9KFwiMDAwMDAwMDAwMFwiK3EudG9TdHJpbmcoMTYpKS5zbGljZSgtaSk7dmFyIHA9KFwiMDAwMDAwMDAwMFwiK28udG9TdHJpbmcoMTYpKS5zbGljZSgtaSk7dmFyIGo9XCIwNFwiK3IrcDt0aGlzLnNldFByaXZhdGVLZXlIZXgobSk7dGhpcy5zZXRQdWJsaWNLZXlIZXgoaik7cmV0dXJue2VjcHJ2aGV4Om0sZWNwdWJoZXg6an19O3RoaXMuc2lnbldpdGhNZXNzYWdlSGFzaD1mdW5jdGlvbihpKXtyZXR1cm4gdGhpcy5zaWduSGV4KGksdGhpcy5wcnZLZXlIZXgpfTt0aGlzLnNpZ25IZXg9ZnVuY3Rpb24obyxqKXt2YXIgdD1uZXcgQmlnSW50ZWdlcihqLDE2KTt2YXIgbD10aGlzLmVjcGFyYW1zLm47dmFyIHE9bmV3IEJpZ0ludGVnZXIobywxNik7ZG97dmFyIG09dGhpcy5nZXRCaWdSYW5kb20obCk7dmFyIHU9dGhpcy5lY3BhcmFtcy5HO3ZhciBwPXUubXVsdGlwbHkobSk7dmFyIGk9cC5nZXRYKCkudG9CaWdJbnRlZ2VyKCkubW9kKGwpfXdoaWxlKGkuY29tcGFyZVRvKEJpZ0ludGVnZXIuWkVSTyk8PTApO3ZhciB2PW0ubW9kSW52ZXJzZShsKS5tdWx0aXBseShxLmFkZCh0Lm11bHRpcGx5KGkpKSkubW9kKGwpO3JldHVybiBLSlVSLmNyeXB0by5FQ0RTQS5iaVJTU2lnVG9BU04xU2lnKGksdil9O3RoaXMuc2lnbj1mdW5jdGlvbihtLHUpe3ZhciBxPXU7dmFyIGo9dGhpcy5lY3BhcmFtcy5uO3ZhciBwPUJpZ0ludGVnZXIuZnJvbUJ5dGVBcnJheVVuc2lnbmVkKG0pO2Rve3ZhciBsPXRoaXMuZ2V0QmlnUmFuZG9tKGopO3ZhciB0PXRoaXMuZWNwYXJhbXMuRzt2YXIgbz10Lm11bHRpcGx5KGwpO3ZhciBpPW8uZ2V0WCgpLnRvQmlnSW50ZWdlcigpLm1vZChqKX13aGlsZShpLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLlpFUk8pPD0wKTt2YXIgdj1sLm1vZEludmVyc2UoaikubXVsdGlwbHkocC5hZGQocS5tdWx0aXBseShpKSkpLm1vZChqKTtyZXR1cm4gdGhpcy5zZXJpYWxpemVTaWcoaSx2KX07dGhpcy52ZXJpZnlXaXRoTWVzc2FnZUhhc2g9ZnVuY3Rpb24oaixpKXtyZXR1cm4gdGhpcy52ZXJpZnlIZXgoaixpLHRoaXMucHViS2V5SGV4KX07dGhpcy52ZXJpZnlIZXg9ZnVuY3Rpb24obSxpLHApe3ZhciBsLGo7dmFyIG89S0pVUi5jcnlwdG8uRUNEU0EucGFyc2VTaWdIZXgoaSk7bD1vLnI7aj1vLnM7dmFyIGs7az1FQ1BvaW50RnAuZGVjb2RlRnJvbUhleCh0aGlzLmVjcGFyYW1zLmN1cnZlLHApO3ZhciBuPW5ldyBCaWdJbnRlZ2VyKG0sMTYpO3JldHVybiB0aGlzLnZlcmlmeVJhdyhuLGwsaixrKX07dGhpcy52ZXJpZnk9ZnVuY3Rpb24obyxwLGope3ZhciBsLGk7aWYoQml0Y29pbi5VdGlsLmlzQXJyYXkocCkpe3ZhciBuPXRoaXMucGFyc2VTaWcocCk7bD1uLnI7aT1uLnN9ZWxzZXtpZihcIm9iamVjdFwiPT09dHlwZW9mIHAmJnAuciYmcC5zKXtsPXAucjtpPXAuc31lbHNle3Rocm93XCJJbnZhbGlkIHZhbHVlIGZvciBzaWduYXR1cmVcIn19dmFyIGs7aWYoaiBpbnN0YW5jZW9mIEVDUG9pbnRGcCl7az1qfWVsc2V7aWYoQml0Y29pbi5VdGlsLmlzQXJyYXkoaikpe2s9RUNQb2ludEZwLmRlY29kZUZyb20odGhpcy5lY3BhcmFtcy5jdXJ2ZSxqKX1lbHNle3Rocm93XCJJbnZhbGlkIGZvcm1hdCBmb3IgcHVia2V5IHZhbHVlLCBtdXN0IGJlIGJ5dGUgYXJyYXkgb3IgRUNQb2ludEZwXCJ9fXZhciBtPUJpZ0ludGVnZXIuZnJvbUJ5dGVBcnJheVVuc2lnbmVkKG8pO3JldHVybiB0aGlzLnZlcmlmeVJhdyhtLGwsaSxrKX07dGhpcy52ZXJpZnlSYXc9ZnVuY3Rpb24obyxpLHcsbSl7dmFyIGw9dGhpcy5lY3BhcmFtcy5uO3ZhciB1PXRoaXMuZWNwYXJhbXMuRztpZihpLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLk9ORSk8MHx8aS5jb21wYXJlVG8obCk+PTApe3JldHVybiBmYWxzZX1pZih3LmNvbXBhcmVUbyhCaWdJbnRlZ2VyLk9ORSk8MHx8dy5jb21wYXJlVG8obCk+PTApe3JldHVybiBmYWxzZX12YXIgcD13Lm1vZEludmVyc2UobCk7dmFyIGs9by5tdWx0aXBseShwKS5tb2QobCk7dmFyIGo9aS5tdWx0aXBseShwKS5tb2QobCk7dmFyIHE9dS5tdWx0aXBseShrKS5hZGQobS5tdWx0aXBseShqKSk7dmFyIHQ9cS5nZXRYKCkudG9CaWdJbnRlZ2VyKCkubW9kKGwpO3JldHVybiB0LmVxdWFscyhpKX07dGhpcy5zZXJpYWxpemVTaWc9ZnVuY3Rpb24oayxqKXt2YXIgbD1rLnRvQnl0ZUFycmF5U2lnbmVkKCk7dmFyIGk9ai50b0J5dGVBcnJheVNpZ25lZCgpO3ZhciBtPVtdO20ucHVzaCgyKTttLnB1c2gobC5sZW5ndGgpO209bS5jb25jYXQobCk7bS5wdXNoKDIpO20ucHVzaChpLmxlbmd0aCk7bT1tLmNvbmNhdChpKTttLnVuc2hpZnQobS5sZW5ndGgpO20udW5zaGlmdCg0OCk7cmV0dXJuIG19O3RoaXMucGFyc2VTaWc9ZnVuY3Rpb24obil7dmFyIG07aWYoblswXSE9NDgpe3Rocm93IG5ldyBFcnJvcihcIlNpZ25hdHVyZSBub3QgYSB2YWxpZCBERVJTZXF1ZW5jZVwiKX1tPTI7aWYoblttXSE9Mil7dGhyb3cgbmV3IEVycm9yKFwiRmlyc3QgZWxlbWVudCBpbiBzaWduYXR1cmUgbXVzdCBiZSBhIERFUkludGVnZXJcIil9dmFyIGw9bi5zbGljZShtKzIsbSsyK25bbSsxXSk7bSs9MituW20rMV07aWYoblttXSE9Mil7dGhyb3cgbmV3IEVycm9yKFwiU2Vjb25kIGVsZW1lbnQgaW4gc2lnbmF0dXJlIG11c3QgYmUgYSBERVJJbnRlZ2VyXCIpfXZhciBpPW4uc2xpY2UobSsyLG0rMituW20rMV0pO20rPTIrblttKzFdO3ZhciBrPUJpZ0ludGVnZXIuZnJvbUJ5dGVBcnJheVVuc2lnbmVkKGwpO3ZhciBqPUJpZ0ludGVnZXIuZnJvbUJ5dGVBcnJheVVuc2lnbmVkKGkpO3JldHVybntyOmssczpqfX07dGhpcy5wYXJzZVNpZ0NvbXBhY3Q9ZnVuY3Rpb24obSl7aWYobS5sZW5ndGghPT02NSl7dGhyb3dcIlNpZ25hdHVyZSBoYXMgdGhlIHdyb25nIGxlbmd0aFwifXZhciBqPW1bMF0tMjc7aWYoajwwfHxqPjcpe3Rocm93XCJJbnZhbGlkIHNpZ25hdHVyZSB0eXBlXCJ9dmFyIG89dGhpcy5lY3BhcmFtcy5uO3ZhciBsPUJpZ0ludGVnZXIuZnJvbUJ5dGVBcnJheVVuc2lnbmVkKG0uc2xpY2UoMSwzMykpLm1vZChvKTt2YXIgaz1CaWdJbnRlZ2VyLmZyb21CeXRlQXJyYXlVbnNpZ25lZChtLnNsaWNlKDMzLDY1KSkubW9kKG8pO3JldHVybntyOmwsczprLGk6an19O2lmKGghPT11bmRlZmluZWQpe2lmKGguY3VydmUhPT11bmRlZmluZWQpe3RoaXMuY3VydmVOYW1lPWguY3VydmV9fWlmKHRoaXMuY3VydmVOYW1lPT09dW5kZWZpbmVkKXt0aGlzLmN1cnZlTmFtZT1lfXRoaXMuc2V0TmFtZWRDdXJ2ZSh0aGlzLmN1cnZlTmFtZSk7aWYoaCE9PXVuZGVmaW5lZCl7aWYoaC5wcnYhPT11bmRlZmluZWQpe3RoaXMuc2V0UHJpdmF0ZUtleUhleChoLnBydil9aWYoaC5wdWIhPT11bmRlZmluZWQpe3RoaXMuc2V0UHVibGljS2V5SGV4KGgucHViKX19fTtLSlVSLmNyeXB0by5FQ0RTQS5wYXJzZVNpZ0hleD1mdW5jdGlvbihhKXt2YXIgYj1LSlVSLmNyeXB0by5FQ0RTQS5wYXJzZVNpZ0hleEluSGV4UlMoYSk7dmFyIGQ9bmV3IEJpZ0ludGVnZXIoYi5yLDE2KTt2YXIgYz1uZXcgQmlnSW50ZWdlcihiLnMsMTYpO3JldHVybntyOmQsczpjfX07S0pVUi5jcnlwdG8uRUNEU0EucGFyc2VTaWdIZXhJbkhleFJTPWZ1bmN0aW9uKGMpe2lmKGMuc3Vic3RyKDAsMikhPVwiMzBcIil7dGhyb3dcInNpZ25hdHVyZSBpcyBub3QgYSBBU04uMSBzZXF1ZW5jZVwifXZhciBiPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGMsMCk7aWYoYi5sZW5ndGghPTIpe3Rocm93XCJudW1iZXIgb2Ygc2lnbmF0dXJlIEFTTi4xIHNlcXVlbmNlIGVsZW1lbnRzIHNlZW0gd3JvbmdcIn12YXIgZz1iWzBdO3ZhciBmPWJbMV07aWYoYy5zdWJzdHIoZywyKSE9XCIwMlwiKXt0aHJvd1wiMXN0IGl0ZW0gb2Ygc2VxdWVuZSBvZiBzaWduYXR1cmUgaXMgbm90IEFTTi4xIGludGVnZXJcIn1pZihjLnN1YnN0cihmLDIpIT1cIjAyXCIpe3Rocm93XCIybmQgaXRlbSBvZiBzZXF1ZW5lIG9mIHNpZ25hdHVyZSBpcyBub3QgQVNOLjEgaW50ZWdlclwifXZhciBlPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGMsZyk7dmFyIGQ9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooYyxmKTtyZXR1cm57cjplLHM6ZH19O0tKVVIuY3J5cHRvLkVDRFNBLmFzbjFTaWdUb0NvbmNhdFNpZz1mdW5jdGlvbihjKXt2YXIgZD1LSlVSLmNyeXB0by5FQ0RTQS5wYXJzZVNpZ0hleEluSGV4UlMoYyk7dmFyIGI9ZC5yO3ZhciBhPWQucztpZihiLnN1YnN0cigwLDIpPT1cIjAwXCImJigoKGIubGVuZ3RoLzIpKjgpJSgxNio4KSk9PTgpe2I9Yi5zdWJzdHIoMil9aWYoYS5zdWJzdHIoMCwyKT09XCIwMFwiJiYoKChhLmxlbmd0aC8yKSo4KSUoMTYqOCkpPT04KXthPWEuc3Vic3RyKDIpfWlmKCgoKGIubGVuZ3RoLzIpKjgpJSgxNio4KSkhPTApe3Rocm93XCJ1bmtub3duIEVDRFNBIHNpZyByIGxlbmd0aCBlcnJvclwifWlmKCgoKGEubGVuZ3RoLzIpKjgpJSgxNio4KSkhPTApe3Rocm93XCJ1bmtub3duIEVDRFNBIHNpZyBzIGxlbmd0aCBlcnJvclwifXJldHVybiBiK2F9O0tKVVIuY3J5cHRvLkVDRFNBLmNvbmNhdFNpZ1RvQVNOMVNpZz1mdW5jdGlvbihhKXtpZigoKChhLmxlbmd0aC8yKSo4KSUoMTYqOCkpIT0wKXt0aHJvd1widW5rbm93biBFQ0RTQSBjb25jYXRpbmF0ZWQgci1zIHNpZyAgbGVuZ3RoIGVycm9yXCJ9dmFyIGM9YS5zdWJzdHIoMCxhLmxlbmd0aC8yKTt2YXIgYj1hLnN1YnN0cihhLmxlbmd0aC8yKTtyZXR1cm4gS0pVUi5jcnlwdG8uRUNEU0EuaGV4UlNTaWdUb0FTTjFTaWcoYyxiKX07S0pVUi5jcnlwdG8uRUNEU0EuaGV4UlNTaWdUb0FTTjFTaWc9ZnVuY3Rpb24oYixhKXt2YXIgZD1uZXcgQmlnSW50ZWdlcihiLDE2KTt2YXIgYz1uZXcgQmlnSW50ZWdlcihhLDE2KTtyZXR1cm4gS0pVUi5jcnlwdG8uRUNEU0EuYmlSU1NpZ1RvQVNOMVNpZyhkLGMpfTtLSlVSLmNyeXB0by5FQ0RTQS5iaVJTU2lnVG9BU04xU2lnPWZ1bmN0aW9uKGUsYyl7dmFyIGI9bmV3IEtKVVIuYXNuMS5ERVJJbnRlZ2VyKHtiaWdpbnQ6ZX0pO3ZhciBhPW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7YmlnaW50OmN9KTt2YXIgZD1uZXcgS0pVUi5hc24xLkRFUlNlcXVlbmNlKHthcnJheTpbYixhXX0pO3JldHVybiBkLmdldEVuY29kZWRIZXgoKX07XG4vKiEgZWNwYXJhbS0xLjAuMC5qcyAoYykgMjAxMyBLZW5qaSBVcnVzaGltYSB8IGtqdXIuZ2l0aHViLmNvbS9qc3JzYXNpZ24vbGljZW5zZVxuICovXG5pZih0eXBlb2YgS0pVUj09XCJ1bmRlZmluZWRcInx8IUtKVVIpe0tKVVI9e319aWYodHlwZW9mIEtKVVIuY3J5cHRvPT1cInVuZGVmaW5lZFwifHwhS0pVUi5jcnlwdG8pe0tKVVIuY3J5cHRvPXt9fUtKVVIuY3J5cHRvLkVDUGFyYW1ldGVyREI9bmV3IGZ1bmN0aW9uKCl7dmFyIGI9e307dmFyIGM9e307ZnVuY3Rpb24gYShkKXtyZXR1cm4gbmV3IEJpZ0ludGVnZXIoZCwxNil9dGhpcy5nZXRCeU5hbWU9ZnVuY3Rpb24oZSl7dmFyIGQ9ZTtpZih0eXBlb2YgY1tkXSE9XCJ1bmRlZmluZWRcIil7ZD1jW2VdfWlmKHR5cGVvZiBiW2RdIT1cInVuZGVmaW5lZFwiKXtyZXR1cm4gYltkXX10aHJvd1widW5yZWdpc3RlcmVkIEVDIGN1cnZlIG5hbWU6IFwiK2R9O3RoaXMucmVnaXN0PWZ1bmN0aW9uKEEsbCxvLGcsbSxlLGosZixrLHUsZCx4KXtiW0FdPXt9O3ZhciBzPWEobyk7dmFyIHo9YShnKTt2YXIgeT1hKG0pO3ZhciB0PWEoZSk7dmFyIHc9YShqKTt2YXIgcj1uZXcgRUNDdXJ2ZUZwKHMseix5KTt2YXIgcT1yLmRlY29kZVBvaW50SGV4KFwiMDRcIitmK2spO2JbQV1bXCJuYW1lXCJdPUE7YltBXVtcImtleWxlblwiXT1sO2JbQV1bXCJjdXJ2ZVwiXT1yO2JbQV1bXCJHXCJdPXE7YltBXVtcIm5cIl09dDtiW0FdW1wiaFwiXT13O2JbQV1bXCJvaWRcIl09ZDtiW0FdW1wiaW5mb1wiXT14O2Zvcih2YXIgdj0wO3Y8dS5sZW5ndGg7disrKXtjW3Vbdl1dPUF9fX07S0pVUi5jcnlwdG8uRUNQYXJhbWV0ZXJEQi5yZWdpc3QoXCJzZWNwMTI4cjFcIiwxMjgsXCJGRkZGRkZGREZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRlwiLFwiRkZGRkZGRkRGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkNcIixcIkU4NzU3OUMxMTA3OUY0M0REODI0OTkzQzJDRUU1RUQzXCIsXCJGRkZGRkZGRTAwMDAwMDAwNzVBMzBEMUI5MDM4QTExNVwiLFwiMVwiLFwiMTYxRkY3NTI4Qjg5OUIyRDBDMjg2MDdDQTUyQzVCODZcIixcIkNGNUFDODM5NUJBRkVCMTNDMDJEQTI5MkRERUQ3QTgzXCIsW10sXCJcIixcInNlY3AxMjhyMSA6IFNFQ0cgY3VydmUgb3ZlciBhIDEyOCBiaXQgcHJpbWUgZmllbGRcIik7S0pVUi5jcnlwdG8uRUNQYXJhbWV0ZXJEQi5yZWdpc3QoXCJzZWNwMTYwazFcIiwxNjAsXCJGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRUZGRkZBQzczXCIsXCIwXCIsXCI3XCIsXCIwMTAwMDAwMDAwMDAwMDAwMDAwMDAxQjhGQTE2REZBQjlBQ0ExNkI2QjNcIixcIjFcIixcIjNCNEMzODJDRTM3QUExOTJBNDAxOUU3NjMwMzZGNEY1REQ0RDdFQkJcIixcIjkzOENGOTM1MzE4RkRDRUQ2QkMyODI4NjUzMTczM0MzRjAzQzRGRUVcIixbXSxcIlwiLFwic2VjcDE2MGsxIDogU0VDRyBjdXJ2ZSBvdmVyIGEgMTYwIGJpdCBwcmltZSBmaWVsZFwiKTtLSlVSLmNyeXB0by5FQ1BhcmFtZXRlckRCLnJlZ2lzdChcInNlY3AxNjByMVwiLDE2MCxcIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGN0ZGRkZGRkZcIixcIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGN0ZGRkZGRkNcIixcIjFDOTdCRUZDNTRCRDdBOEI2NUFDRjg5RjgxRDRENEFEQzU2NUZBNDVcIixcIjAxMDAwMDAwMDAwMDAwMDAwMDAwMDFGNEM4RjkyN0FFRDNDQTc1MjI1N1wiLFwiMVwiLFwiNEE5NkI1Njg4RUY1NzMyODQ2NjQ2OTg5NjhDMzhCQjkxM0NCRkM4MlwiLFwiMjNBNjI4NTUzMTY4OTQ3RDU5RENDOTEyMDQyMzUxMzc3QUM1RkIzMlwiLFtdLFwiXCIsXCJzZWNwMTYwcjEgOiBTRUNHIGN1cnZlIG92ZXIgYSAxNjAgYml0IHByaW1lIGZpZWxkXCIpO0tKVVIuY3J5cHRvLkVDUGFyYW1ldGVyREIucmVnaXN0KFwic2VjcDE5MmsxXCIsMTkyLFwiRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRUZGRkZFRTM3XCIsXCIwXCIsXCIzXCIsXCJGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkUyNkYyRkMxNzBGNjk0NjZBNzRERUZEOERcIixcIjFcIixcIkRCNEZGMTBFQzA1N0U5QUUyNkIwN0QwMjgwQjdGNDM0MURBNUQxQjFFQUUwNkM3RFwiLFwiOUIyRjJGNkQ5QzU2MjhBNzg0NDE2M0QwMTVCRTg2MzQ0MDgyQUE4OEQ5NUUyRjlEXCIsW10pO0tKVVIuY3J5cHRvLkVDUGFyYW1ldGVyREIucmVnaXN0KFwic2VjcDE5MnIxXCIsMTkyLFwiRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkVGRkZGRkZGRkZGRkZGRkZGXCIsXCJGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRUZGRkZGRkZGRkZGRkZGRkNcIixcIjY0MjEwNTE5RTU5QzgwRTcwRkE3RTlBQjcyMjQzMDQ5RkVCOERFRUNDMTQ2QjlCMVwiLFwiRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGOTlERUY4MzYxNDZCQzlCMUI0RDIyODMxXCIsXCIxXCIsXCIxODhEQTgwRUIwMzA5MEY2N0NCRjIwRUI0M0ExODgwMEY0RkYwQUZEODJGRjEwMTJcIixcIjA3MTkyQjk1RkZDOERBNzg2MzEwMTFFRDZCMjRDREQ1NzNGOTc3QTExRTc5NDgxMVwiLFtdKTtLSlVSLmNyeXB0by5FQ1BhcmFtZXRlckRCLnJlZ2lzdChcInNlY3AyMjRyMVwiLDIyNCxcIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxXCIsXCJGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRUZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRVwiLFwiQjQwNTBBODUwQzA0QjNBQkY1NDEzMjU2NTA0NEIwQjdEN0JGRDhCQTI3MEIzOTQzMjM1NUZGQjRcIixcIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYxNkEyRTBCOEYwM0UxM0REMjk0NTVDNUMyQTNEXCIsXCIxXCIsXCJCNzBFMENCRDZCQjRCRjdGMzIxMzkwQjk0QTAzQzFEMzU2QzIxMTIyMzQzMjgwRDYxMTVDMUQyMVwiLFwiQkQzNzYzODhCNUY3MjNGQjRDMjJERkU2Q0Q0Mzc1QTA1QTA3NDc2NDQ0RDU4MTk5ODUwMDdFMzRcIixbXSk7S0pVUi5jcnlwdG8uRUNQYXJhbWV0ZXJEQi5yZWdpc3QoXCJzZWNwMjU2azFcIiwyNTYsXCJGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRUZGRkZGQzJGXCIsXCIwXCIsXCI3XCIsXCJGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRUJBQUVEQ0U2QUY0OEEwM0JCRkQyNUU4Q0QwMzY0MTQxXCIsXCIxXCIsXCI3OUJFNjY3RUY5RENCQkFDNTVBMDYyOTVDRTg3MEIwNzAyOUJGQ0RCMkRDRTI4RDk1OUYyODE1QjE2RjgxNzk4XCIsXCI0ODNBREE3NzI2QTNDNDY1NURBNEZCRkMwRTExMDhBOEZEMTdCNDQ4QTY4NTU0MTk5QzQ3RDA4RkZCMTBENEI4XCIsW10pO0tKVVIuY3J5cHRvLkVDUGFyYW1ldGVyREIucmVnaXN0KFwic2VjcDI1NnIxXCIsMjU2LFwiRkZGRkZGRkYwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRlwiLFwiRkZGRkZGRkYwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGQ1wiLFwiNUFDNjM1RDhBQTNBOTNFN0IzRUJCRDU1NzY5ODg2QkM2NTFEMDZCMENDNTNCMEY2M0JDRTNDM0UyN0QyNjA0QlwiLFwiRkZGRkZGRkYwMDAwMDAwMEZGRkZGRkZGRkZGRkZGRkZCQ0U2RkFBREE3MTc5RTg0RjNCOUNBQzJGQzYzMjU1MVwiLFwiMVwiLFwiNkIxN0QxRjJFMTJDNDI0N0Y4QkNFNkU1NjNBNDQwRjI3NzAzN0Q4MTJERUIzM0EwRjRBMTM5NDVEODk4QzI5NlwiLFwiNEZFMzQyRTJGRTFBN0Y5QjhFRTdFQjRBN0MwRjlFMTYyQkNFMzM1NzZCMzE1RUNFQ0JCNjQwNjgzN0JGNTFGNVwiLFtcIk5JU1QgUC0yNTZcIixcIlAtMjU2XCIsXCJwcmltZTI1NnYxXCJdKTtLSlVSLmNyeXB0by5FQ1BhcmFtZXRlckRCLnJlZ2lzdChcInNlY3AzODRyMVwiLDM4NCxcIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkVGRkZGRkZGRjAwMDAwMDAwMDAwMDAwMDBGRkZGRkZGRlwiLFwiRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRUZGRkZGRkZGMDAwMDAwMDAwMDAwMDAwMEZGRkZGRkZDXCIsXCJCMzMxMkZBN0UyM0VFN0U0OTg4RTA1NkJFM0Y4MkQxOTE4MUQ5QzZFRkU4MTQxMTIwMzE0MDg4RjUwMTM4NzVBQzY1NjM5OEQ4QTJFRDE5RDJBODVDOEVERDNFQzJBRUZcIixcIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkM3NjM0RDgxRjQzNzJEREY1ODFBMERCMjQ4QjBBNzdBRUNFQzE5NkFDQ0M1Mjk3M1wiLFwiMVwiLFwiQUE4N0NBMjJCRThCMDUzNzhFQjFDNzFFRjMyMEFENzQ2RTFEM0I2MjhCQTc5Qjk4NTlGNzQxRTA4MjU0MkEzODU1MDJGMjVEQkY1NTI5NkMzQTU0NUUzODcyNzYwQUI3XCIsXCIzNjE3ZGU0YTk2MjYyYzZmNWQ5ZTk4YmY5MjkyZGMyOWY4ZjQxZGJkMjg5YTE0N2NlOWRhMzExM2I1ZjBiOGMwMGE2MGIxY2UxZDdlODE5ZDdhNDMxZDdjOTBlYTBlNWZcIixbXCJOSVNUIFAtMzg0XCIsXCJQLTM4NFwiXSk7S0pVUi5jcnlwdG8uRUNQYXJhbWV0ZXJEQi5yZWdpc3QoXCJzZWNwNTIxcjFcIiw1MjEsXCIxRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRlwiLFwiMUZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkNcIixcIjA1MTk1M0VCOTYxOEUxQzlBMUY5MjlBMjFBMEI2ODU0MEVFQTJEQTcyNUI5OUIzMTVGM0I4QjQ4OTkxOEVGMTA5RTE1NjE5Mzk1MUVDN0U5MzdCMTY1MkMwQkQzQkIxQkYwNzM1NzNERjg4M0QyQzM0RjFFRjQ1MUZENDZCNTAzRjAwXCIsXCIxRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZBNTE4Njg3ODNCRjJGOTY2QjdGQ0MwMTQ4RjcwOUE1RDAzQkI1QzlCODg5OUM0N0FFQkI2RkI3MUU5MTM4NjQwOVwiLFwiMVwiLFwiQzY4NThFMDZCNzA0MDRFOUNEOUUzRUNCNjYyMzk1QjQ0MjlDNjQ4MTM5MDUzRkI1MjFGODI4QUY2MDZCNEQzREJBQTE0QjVFNzdFRkU3NTkyOEZFMURDMTI3QTJGRkE4REUzMzQ4QjNDMTg1NkE0MjlCRjk3RTdFMzFDMkU1QkQ2NlwiLFwiMDExODM5Mjk2YTc4OWEzYmMwMDQ1YzhhNWZiNDJjN2QxYmQ5OThmNTQ0NDk1NzliNDQ2ODE3YWZiZDE3MjczZTY2MmM5N2VlNzI5OTVlZjQyNjQwYzU1MGI5MDEzZmFkMDc2MTM1M2M3MDg2YTI3MmMyNDA4OGJlOTQ3NjlmZDE2NjUwXCIsW1wiTklTVCBQLTUyMVwiLFwiUC01MjFcIl0pO1xuLyohIGRzYS1tb2RpZmllZC0xLjAuMS5qcyAoYykgUmVjdXJpdHkgTGFicyBHbWJILCBLZW5qaSBVcnVzaGltbWEgfCBnaXRodWIuY29tL29wZW5wZ3Bqcy9vcGVucGdwanMvYmxvYi9tYXN0ZXIvTElDRU5TRVxuICovXG5pZih0eXBlb2YgS0pVUj09XCJ1bmRlZmluZWRcInx8IUtKVVIpe0tKVVI9e319aWYodHlwZW9mIEtKVVIuY3J5cHRvPT1cInVuZGVmaW5lZFwifHwhS0pVUi5jcnlwdG8pe0tKVVIuY3J5cHRvPXt9fUtKVVIuY3J5cHRvLkRTQT1mdW5jdGlvbigpe3RoaXMucD1udWxsO3RoaXMucT1udWxsO3RoaXMuZz1udWxsO3RoaXMueT1udWxsO3RoaXMueD1udWxsO3RoaXMudHlwZT1cIkRTQVwiO3RoaXMuc2V0UHJpdmF0ZT1mdW5jdGlvbih6LHcsdixBLHUpe3RoaXMuaXNQcml2YXRlPXRydWU7dGhpcy5wPXo7dGhpcy5xPXc7dGhpcy5nPXY7dGhpcy55PUE7dGhpcy54PXV9O3RoaXMuc2V0UHVibGljPWZ1bmN0aW9uKHcsdix1LHope3RoaXMuaXNQdWJsaWM9dHJ1ZTt0aGlzLnA9dzt0aGlzLnE9djt0aGlzLmc9dTt0aGlzLnk9ejt0aGlzLng9bnVsbH07dGhpcy5zaWduV2l0aE1lc3NhZ2VIYXNoPWZ1bmN0aW9uKHope3ZhciB2PXRoaXMucDt2YXIgdT10aGlzLnE7dmFyIEM9dGhpcy5nO3ZhciBEPXRoaXMueTt2YXIgRT10aGlzLng7dmFyIEE9ei5zdWJzdHIoMCx1LmJpdExlbmd0aCgpLzQpO3ZhciBCPW5ldyBCaWdJbnRlZ2VyKHosMTYpO3ZhciB3PW4oQmlnSW50ZWdlci5PTkUuYWRkKEJpZ0ludGVnZXIuT05FKSx1LnN1YnRyYWN0KEJpZ0ludGVnZXIuT05FKSk7dmFyIEc9KEMubW9kUG93KHcsdikpLm1vZCh1KTt2YXIgRj0ody5tb2RJbnZlcnNlKHUpLm11bHRpcGx5KEIuYWRkKEUubXVsdGlwbHkoRykpKSkubW9kKHUpO3ZhciBIPUtKVVIuYXNuMS5BU04xVXRpbC5qc29uVG9BU04xSEVYKHtzZXE6W3tcImludFwiOntiaWdpbnQ6R319LHtcImludFwiOntiaWdpbnQ6Rn19XX0pO3JldHVybiBIfTt0aGlzLnZlcmlmeVdpdGhNZXNzYWdlSGFzaD1mdW5jdGlvbihDLEIpe3ZhciB6PXRoaXMucDt2YXIgdT10aGlzLnE7dmFyIEc9dGhpcy5nO3ZhciBIPXRoaXMueTt2YXIgRT10aGlzLnBhcnNlQVNOMVNpZ25hdHVyZShCKTt2YXIgSz1FWzBdO3ZhciBKPUVbMV07dmFyIEM9Qy5zdWJzdHIoMCx1LmJpdExlbmd0aCgpLzQpO3ZhciBEPW5ldyBCaWdJbnRlZ2VyKEMsMTYpO2lmKEJpZ0ludGVnZXIuWkVSTy5jb21wYXJlVG8oSyk+MHx8Sy5jb21wYXJlVG8odSk+MHx8QmlnSW50ZWdlci5aRVJPLmNvbXBhcmVUbyhKKT4wfHxKLmNvbXBhcmVUbyh1KT4wKXt0aHJvd1wiaW52YWxpZCBEU0Egc2lnbmF0dXJlXCJ9dmFyIEk9Si5tb2RJbnZlcnNlKHUpO3ZhciBBPUQubXVsdGlwbHkoSSkubW9kKHUpO3ZhciB2PUsubXVsdGlwbHkoSSkubW9kKHUpO3ZhciBGPUcubW9kUG93KEEseikubXVsdGlwbHkoSC5tb2RQb3codix6KSkubW9kKHopLm1vZCh1KTtyZXR1cm4gRi5jb21wYXJlVG8oSyk9PTB9O3RoaXMucGFyc2VBU04xU2lnbmF0dXJlPWZ1bmN0aW9uKHUpe3RyeXt2YXIgeT1uZXcgQmlnSW50ZWdlcihBU04xSEVYLmdldFZieUxpc3QodSwwLFswXSxcIjAyXCIpLDE2KTt2YXIgdj1uZXcgQmlnSW50ZWdlcihBU04xSEVYLmdldFZieUxpc3QodSwwLFsxXSxcIjAyXCIpLDE2KTtyZXR1cm5beSx2XX1jYXRjaCh3KXt0aHJvd1wibWFsZm9ybWVkIERTQSBzaWduYXR1cmVcIn19O2Z1bmN0aW9uIGQoRSx3LEIsdix1LEMpe3ZhciB6PUtKVVIuY3J5cHRvLlV0aWwuaGFzaFN0cmluZyh3LEUudG9Mb3dlckNhc2UoKSk7dmFyIHo9ei5zdWJzdHIoMCx1LmJpdExlbmd0aCgpLzQpO3ZhciBBPW5ldyBCaWdJbnRlZ2VyKHosMTYpO3ZhciB5PW4oQmlnSW50ZWdlci5PTkUuYWRkKEJpZ0ludGVnZXIuT05FKSx1LnN1YnRyYWN0KEJpZ0ludGVnZXIuT05FKSk7dmFyIEY9KEIubW9kUG93KHksdikpLm1vZCh1KTt2YXIgRD0oeS5tb2RJbnZlcnNlKHUpLm11bHRpcGx5KEEuYWRkKEMubXVsdGlwbHkoRikpKSkubW9kKHUpO3ZhciBHPW5ldyBBcnJheSgpO0dbMF09RjtHWzFdPUQ7cmV0dXJuIEd9ZnVuY3Rpb24gcih2KXt2YXIgdT1vcGVucGdwLmNvbmZpZy5jb25maWcucHJlZmVyX2hhc2hfYWxnb3JpdGhtO3N3aXRjaChNYXRoLnJvdW5kKHYuYml0TGVuZ3RoKCkvOCkpe2Nhc2UgMjA6aWYodSE9MiYmdT4xMSYmdSE9MTAmJnU8OCl7cmV0dXJuIDJ9cmV0dXJuIHU7Y2FzZSAyODppZih1PjExJiZ1PDgpe3JldHVybiAxMX1yZXR1cm4gdTtjYXNlIDMyOmlmKHU+MTAmJnU8OCl7cmV0dXJuIDh9cmV0dXJuIHU7ZGVmYXVsdDp1dGlsLnByaW50X2RlYnVnKFwiRFNBIHNlbGVjdCBoYXNoIGFsZ29yaXRobTogcmV0dXJuaW5nIG51bGwgZm9yIGFuIHVua25vd24gbGVuZ3RoIG9mIHFcIik7cmV0dXJuIG51bGx9fXRoaXMuc2VsZWN0X2hhc2hfYWxnb3JpdGhtPXI7ZnVuY3Rpb24gbShJLEssSixCLHosdSxGLEcpe3ZhciBDPUtKVVIuY3J5cHRvLlV0aWwuaGFzaFN0cmluZyhCLEkudG9Mb3dlckNhc2UoKSk7dmFyIEM9Qy5zdWJzdHIoMCx1LmJpdExlbmd0aCgpLzQpO3ZhciBEPW5ldyBCaWdJbnRlZ2VyKEMsMTYpO2lmKEJpZ0ludGVnZXIuWkVSTy5jb21wYXJlVG8oSyk+MHx8Sy5jb21wYXJlVG8odSk+MHx8QmlnSW50ZWdlci5aRVJPLmNvbXBhcmVUbyhKKT4wfHxKLmNvbXBhcmVUbyh1KT4wKXt1dGlsLnByaW50X2Vycm9yKFwiaW52YWxpZCBEU0EgU2lnbmF0dXJlXCIpO3JldHVybiBudWxsfXZhciBIPUoubW9kSW52ZXJzZSh1KTt2YXIgQT1ELm11bHRpcGx5KEgpLm1vZCh1KTt2YXIgdj1LLm11bHRpcGx5KEgpLm1vZCh1KTt2YXIgRT1GLm1vZFBvdyhBLHopLm11bHRpcGx5KEcubW9kUG93KHYseikpLm1vZCh6KS5tb2QodSk7cmV0dXJuIEUuY29tcGFyZVRvKEspPT0wfWZ1bmN0aW9uIGEoeil7dmFyIEE9bmV3IEJpZ0ludGVnZXIoeixwcmltZUNlbnRlcmllKTt2YXIgeT1qKHEsNTEyKTt2YXIgdT10KHAscSx6KTt2YXIgdjtkb3t2PW5ldyBCaWdJbnRlZ2VyKHEuYml0Q291bnQoKSxyYW5kKX13aGlsZSh4LmNvbXBhcmVUbyhCaWdJbnRlZ2VyLlpFUk8pIT0xJiZ4LmNvbXBhcmVUbyhxKSE9LTEpO3ZhciB3PWcubW9kUG93KHgscCk7cmV0dXJue3g6dixxOkEscDp5LGc6dSx5Ond9fWZ1bmN0aW9uIGooeSx6LHcpe2lmKHolNjQhPTApe3JldHVybiBmYWxzZX12YXIgdTt2YXIgdjtkb3t1PXcoYml0Y291bnQsdHJ1ZSk7dj11LnN1YnRyYWN0KEJpZ0ludGVnZXIuT05FKTt1PXUuc3VidHJhY3Qodi5yZW1haW5kZXIoeSkpfXdoaWxlKCF1LmlzUHJvYmFibGVQcmltZShwcmltZUNlbnRlcmllKXx8dS5iaXRMZW5ndGgoKSE9bCk7cmV0dXJuIHV9ZnVuY3Rpb24gdChCLHosQSx3KXt2YXIgdT1CLnN1YnRyYWN0KEJpZ0ludGVnZXIuT05FKTt2YXIgeT11LmRpdmlkZSh6KTt2YXIgdjtkb3t2PXcoQSl9d2hpbGUodi5jb21wYXJlVG8odSkhPS0xJiZ2LmNvbXBhcmVUbyhCaWdJbnRlZ2VyLk9ORSkhPTEpO3JldHVybiB2Lm1vZFBvdyh5LEIpfWZ1bmN0aW9uIG8odyx5LHUpe3ZhciB2O2Rve3Y9dSh5LGZhbHNlKX13aGlsZSh2LmNvbXBhcmVUbyh3KSE9LTEmJnYuY29tcGFyZVRvKEJpZ0ludGVnZXIuWkVSTykhPTEpO3JldHVybiB2fWZ1bmN0aW9uIGkodix3KXtrPW8odik7dmFyIHU9Zy5tb2RQb3coayx3KS5tb2Qodik7cmV0dXJuIHV9ZnVuY3Rpb24gaChCLHcseSx2LHosdSl7dmFyIEE9Qih2KTtzPSh3Lm1vZEludmVyc2UoeikubXVsdGlwbHkoQS5hZGQodS5tdWx0aXBseSh5KSkpKS5tb2Qoeik7cmV0dXJuIHN9dGhpcy5zaWduPWQ7dGhpcy52ZXJpZnk9bTtmdW5jdGlvbiBuKHcsdSl7aWYodS5jb21wYXJlVG8odyk8PTApe3JldHVybn12YXIgdj11LnN1YnRyYWN0KHcpO3ZhciB5PWUodi5iaXRMZW5ndGgoKSk7d2hpbGUoeT52KXt5PWUodi5iaXRMZW5ndGgoKSl9cmV0dXJuIHcuYWRkKHkpfWZ1bmN0aW9uIGUodyl7aWYodzwwKXtyZXR1cm4gbnVsbH12YXIgdT1NYXRoLmZsb29yKCh3KzcpLzgpO3ZhciB2PWModSk7aWYodyU4PjApe3Y9U3RyaW5nLmZyb21DaGFyQ29kZSgoTWF0aC5wb3coMix3JTgpLTEpJnYuY2hhckNvZGVBdCgwKSkrdi5zdWJzdHJpbmcoMSl9cmV0dXJuIG5ldyBCaWdJbnRlZ2VyKGYodiksMTYpfWZ1bmN0aW9uIGModyl7dmFyIHU9XCJcIjtmb3IodmFyIHY9MDt2PHc7disrKXt1Kz1TdHJpbmcuZnJvbUNoYXJDb2RlKGIoKSl9cmV0dXJuIHV9ZnVuY3Rpb24gYigpe3ZhciB1PW5ldyBVaW50MzJBcnJheSgxKTt3aW5kb3cuY3J5cHRvLmdldFJhbmRvbVZhbHVlcyh1KTtyZXR1cm4gdVswXSYyNTV9ZnVuY3Rpb24gZih5KXtpZih5PT1udWxsKXtyZXR1cm5cIlwifXZhciB2PVtdO3ZhciB3PXkubGVuZ3RoO3ZhciB6PTA7dmFyIHU7d2hpbGUoejx3KXt1PXlbeisrXS5jaGFyQ29kZUF0KCkudG9TdHJpbmcoMTYpO3doaWxlKHUubGVuZ3RoPDIpe3U9XCIwXCIrdX12LnB1c2goXCJcIit1KX1yZXR1cm4gdi5qb2luKFwiXCIpfXRoaXMuZ2V0UmFuZG9tQmlnSW50ZWdlckluUmFuZ2U9bjt0aGlzLmdldFJhbmRvbUJpZ0ludGVnZXI9ZTt0aGlzLmdldFJhbmRvbUJ5dGVzPWN9O1xuLyohIHBrY3M1cGtleS0xLjAuNi5qcyAoYykgMjAxMy0yMDE0IEtlbmppIFVydXNoaW1hIHwga2p1ci5naXRodWIuY29tL2pzcnNhc2lnbi9saWNlbnNlXG4gKi9cbnZhciBQS0NTNVBLRVk9ZnVuY3Rpb24oKXt2YXIgYz1mdW5jdGlvbihuLHAsbyl7cmV0dXJuIGkoQ3J5cHRvSlMuQUVTLG4scCxvKX07dmFyIGQ9ZnVuY3Rpb24obixwLG8pe3JldHVybiBpKENyeXB0b0pTLlRyaXBsZURFUyxuLHAsbyl9O3ZhciBpPWZ1bmN0aW9uKHEsdixzLG8pe3ZhciBwPUNyeXB0b0pTLmVuYy5IZXgucGFyc2Uodik7dmFyIHU9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZShzKTt2YXIgbj1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKG8pO3ZhciByPXt9O3Iua2V5PXU7ci5pdj1uO3IuY2lwaGVydGV4dD1wO3ZhciB0PXEuZGVjcnlwdChyLHUse2l2Om59KTtyZXR1cm4gQ3J5cHRvSlMuZW5jLkhleC5zdHJpbmdpZnkodCl9O3ZhciBqPWZ1bmN0aW9uKG4scCxvKXtyZXR1cm4gZShDcnlwdG9KUy5BRVMsbixwLG8pfTt2YXIgbT1mdW5jdGlvbihuLHAsbyl7cmV0dXJuIGUoQ3J5cHRvSlMuVHJpcGxlREVTLG4scCxvKX07dmFyIGU9ZnVuY3Rpb24ocyx4LHYscCl7dmFyIHI9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZSh4KTt2YXIgdz1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKHYpO3ZhciBvPUNyeXB0b0pTLmVuYy5IZXgucGFyc2UocCk7dmFyIG49e307dmFyIHU9cy5lbmNyeXB0KHIsdyx7aXY6b30pO3ZhciBxPUNyeXB0b0pTLmVuYy5IZXgucGFyc2UodS50b1N0cmluZygpKTt2YXIgdD1DcnlwdG9KUy5lbmMuQmFzZTY0LnN0cmluZ2lmeShxKTtyZXR1cm4gdH07dmFyIGc9e1wiQUVTLTI1Ni1DQkNcIjp7cHJvYzpjLGVwcm9jOmosa2V5bGVuOjMyLGl2bGVuOjE2fSxcIkFFUy0xOTItQ0JDXCI6e3Byb2M6YyxlcHJvYzpqLGtleWxlbjoyNCxpdmxlbjoxNn0sXCJBRVMtMTI4LUNCQ1wiOntwcm9jOmMsZXByb2M6aixrZXlsZW46MTYsaXZsZW46MTZ9LFwiREVTLUVERTMtQ0JDXCI6e3Byb2M6ZCxlcHJvYzptLGtleWxlbjoyNCxpdmxlbjo4fX07dmFyIGI9ZnVuY3Rpb24obil7cmV0dXJuIGdbbl1bXCJwcm9jXCJdfTt2YXIgaz1mdW5jdGlvbihuKXt2YXIgcD1DcnlwdG9KUy5saWIuV29yZEFycmF5LnJhbmRvbShuKTt2YXIgbz1DcnlwdG9KUy5lbmMuSGV4LnN0cmluZ2lmeShwKTtyZXR1cm4gb307dmFyIGw9ZnVuY3Rpb24ocSl7dmFyIHI9e307aWYocS5tYXRjaChuZXcgUmVnRXhwKFwiREVLLUluZm86IChbXixdKyksKFswLTlBLUZhLWZdKylcIixcIm1cIikpKXtyLmNpcGhlcj1SZWdFeHAuJDE7ci5pdnNhbHQ9UmVnRXhwLiQyfWlmKHEubWF0Y2gobmV3IFJlZ0V4cChcIi0tLS0tQkVHSU4gKFtBLVpdKykgUFJJVkFURSBLRVktLS0tLVwiKSkpe3IudHlwZT1SZWdFeHAuJDF9dmFyIHA9LTE7dmFyIHQ9MDtpZihxLmluZGV4T2YoXCJcXHJcXG5cXHJcXG5cIikhPS0xKXtwPXEuaW5kZXhPZihcIlxcclxcblxcclxcblwiKTt0PTJ9aWYocS5pbmRleE9mKFwiXFxuXFxuXCIpIT0tMSl7cD1xLmluZGV4T2YoXCJcXG5cXG5cIik7dD0xfXZhciBvPXEuaW5kZXhPZihcIi0tLS0tRU5EXCIpO2lmKHAhPS0xJiZvIT0tMSl7dmFyIG49cS5zdWJzdHJpbmcocCt0KjIsby10KTtuPW4ucmVwbGFjZSgvXFxzKy9nLFwiXCIpO3IuZGF0YT1ufXJldHVybiByfTt2YXIgaD1mdW5jdGlvbihvLHcsbil7dmFyIHQ9bi5zdWJzdHJpbmcoMCwxNik7dmFyIHI9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZSh0KTt2YXIgcD1DcnlwdG9KUy5lbmMuVXRmOC5wYXJzZSh3KTt2YXIgcz1nW29dW1wia2V5bGVuXCJdK2dbb11bXCJpdmxlblwiXTt2YXIgdj1cIlwiO3ZhciB1PW51bGw7Zm9yKDs7KXt2YXIgcT1DcnlwdG9KUy5hbGdvLk1ENS5jcmVhdGUoKTtpZih1IT1udWxsKXtxLnVwZGF0ZSh1KX1xLnVwZGF0ZShwKTtxLnVwZGF0ZShyKTt1PXEuZmluYWxpemUoKTt2PXYrQ3J5cHRvSlMuZW5jLkhleC5zdHJpbmdpZnkodSk7aWYodi5sZW5ndGg+PXMqMil7YnJlYWt9fXZhciB4PXt9O3gua2V5aGV4PXYuc3Vic3RyKDAsZ1tvXVtcImtleWxlblwiXSoyKTt4Lml2aGV4PXYuc3Vic3RyKGdbb11bXCJrZXlsZW5cIl0qMixnW29dW1wiaXZsZW5cIl0qMik7cmV0dXJuIHh9O3ZhciBhPWZ1bmN0aW9uKG4sdCxwLHUpe3ZhciBxPUNyeXB0b0pTLmVuYy5CYXNlNjQucGFyc2Uobik7dmFyIG89Q3J5cHRvSlMuZW5jLkhleC5zdHJpbmdpZnkocSk7dmFyIHM9Z1t0XVtcInByb2NcIl07dmFyIHI9cyhvLHAsdSk7cmV0dXJuIHJ9O3ZhciBmPWZ1bmN0aW9uKG4scSxvLHMpe3ZhciBwPWdbcV1bXCJlcHJvY1wiXTt2YXIgcj1wKG4sbyxzKTtyZXR1cm4gcn07cmV0dXJue3ZlcnNpb246XCIxLjAuNVwiLGdldEhleEZyb21QRU06ZnVuY3Rpb24obyxyKXt2YXIgcD1vO2lmKHAuaW5kZXhPZihcIkJFR0lOIFwiK3IpPT0tMSl7dGhyb3dcImNhbid0IGZpbmQgUEVNIGhlYWRlcjogXCIrcn1wPXAucmVwbGFjZShcIi0tLS0tQkVHSU4gXCIrcitcIi0tLS0tXCIsXCJcIik7cD1wLnJlcGxhY2UoXCItLS0tLUVORCBcIityK1wiLS0tLS1cIixcIlwiKTt2YXIgcT1wLnJlcGxhY2UoL1xccysvZyxcIlwiKTt2YXIgbj1iNjR0b2hleChxKTtyZXR1cm4gbn0sZ2V0RGVjcnlwdGVkS2V5SGV4QnlLZXlJVjpmdW5jdGlvbihvLHIscSxwKXt2YXIgbj1iKHIpO3JldHVybiBuKG8scSxwKX0scGFyc2VQS0NTNVBFTTpmdW5jdGlvbihuKXtyZXR1cm4gbChuKX0sZ2V0S2V5QW5kVW51c2VkSXZCeVBhc3Njb2RlQW5kSXZzYWx0OmZ1bmN0aW9uKG8sbixwKXtyZXR1cm4gaChvLG4scCl9LGRlY3J5cHRLZXlCNjQ6ZnVuY3Rpb24obixwLG8scSl7cmV0dXJuIGEobixwLG8scSl9LGdldERlY3J5cHRlZEtleUhleDpmdW5jdGlvbih3LHYpe3ZhciBvPWwodyk7dmFyIHI9by50eXBlO3ZhciBwPW8uY2lwaGVyO3ZhciBuPW8uaXZzYWx0O3ZhciBxPW8uZGF0YTt2YXIgdT1oKHAsdixuKTt2YXIgdD11LmtleWhleDt2YXIgcz1hKHEscCx0LG4pO3JldHVybiBzfSxnZXRSU0FLZXlGcm9tRW5jcnlwdGVkUEtDUzVQRU06ZnVuY3Rpb24ocCxvKXt2YXIgcT10aGlzLmdldERlY3J5cHRlZEtleUhleChwLG8pO3ZhciBuPW5ldyBSU0FLZXkoKTtuLnJlYWRQcml2YXRlS2V5RnJvbUFTTjFIZXhTdHJpbmcocSk7cmV0dXJuIG59LGdldEVyeXB0ZWRQS0NTNVBFTUZyb21QcnZLZXlIZXg6ZnVuY3Rpb24ocSx4LHIscCl7dmFyIG49XCJcIjtpZih0eXBlb2Ygcj09XCJ1bmRlZmluZWRcInx8cj09bnVsbCl7cj1cIkFFUy0yNTYtQ0JDXCJ9aWYodHlwZW9mIGdbcl09PVwidW5kZWZpbmVkXCIpe3Rocm93XCJQS0NTNVBLRVkgdW5zdXBwb3J0ZWQgYWxnb3JpdGhtOiBcIityfWlmKHR5cGVvZiBwPT1cInVuZGVmaW5lZFwifHxwPT1udWxsKXt2YXIgdD1nW3JdW1wiaXZsZW5cIl07dmFyIHM9ayh0KTtwPXMudG9VcHBlckNhc2UoKX12YXIgdz1oKHIseCxwKTt2YXIgdj13LmtleWhleDt2YXIgdT1mKHEscix2LHApO3ZhciBvPXUucmVwbGFjZSgvKC57NjR9KS9nLFwiJDFcXHJcXG5cIik7dmFyIG49XCItLS0tLUJFR0lOIFJTQSBQUklWQVRFIEtFWS0tLS0tXFxyXFxuXCI7bis9XCJQcm9jLVR5cGU6IDQsRU5DUllQVEVEXFxyXFxuXCI7bis9XCJERUstSW5mbzogXCIrcitcIixcIitwK1wiXFxyXFxuXCI7bis9XCJcXHJcXG5cIjtuKz1vO24rPVwiXFxyXFxuLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS1cXHJcXG5cIjtyZXR1cm4gbn0sZ2V0RXJ5cHRlZFBLQ1M1UEVNRnJvbVJTQUtleTpmdW5jdGlvbihDLEQsbyxzKXt2YXIgQT1uZXcgS0pVUi5hc24xLkRFUkludGVnZXIoe1wiaW50XCI6MH0pO3ZhciB2PW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7YmlnaW50OkMubn0pO3ZhciB6PW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7XCJpbnRcIjpDLmV9KTt2YXIgQj1uZXcgS0pVUi5hc24xLkRFUkludGVnZXIoe2JpZ2ludDpDLmR9KTt2YXIgdD1uZXcgS0pVUi5hc24xLkRFUkludGVnZXIoe2JpZ2ludDpDLnB9KTt2YXIgcj1uZXcgS0pVUi5hc24xLkRFUkludGVnZXIoe2JpZ2ludDpDLnF9KTt2YXIgeT1uZXcgS0pVUi5hc24xLkRFUkludGVnZXIoe2JpZ2ludDpDLmRtcDF9KTt2YXIgdT1uZXcgS0pVUi5hc24xLkRFUkludGVnZXIoe2JpZ2ludDpDLmRtcTF9KTt2YXIgeD1uZXcgS0pVUi5hc24xLkRFUkludGVnZXIoe2JpZ2ludDpDLmNvZWZmfSk7dmFyIEU9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7YXJyYXk6W0Esdix6LEIsdCxyLHksdSx4XX0pO3ZhciB3PUUuZ2V0RW5jb2RlZEhleCgpO3JldHVybiB0aGlzLmdldEVyeXB0ZWRQS0NTNVBFTUZyb21QcnZLZXlIZXgodyxELG8scyl9LG5ld0VuY3J5cHRlZFBLQ1M1UEVNOmZ1bmN0aW9uKG4sbyxyLHMpe2lmKHR5cGVvZiBvPT1cInVuZGVmaW5lZFwifHxvPT1udWxsKXtvPTEwMjR9aWYodHlwZW9mIHI9PVwidW5kZWZpbmVkXCJ8fHI9PW51bGwpe3I9XCIxMDAwMVwifXZhciBwPW5ldyBSU0FLZXkoKTtwLmdlbmVyYXRlKG8scik7dmFyIHE9bnVsbDtpZih0eXBlb2Ygcz09XCJ1bmRlZmluZWRcInx8cz09bnVsbCl7cT10aGlzLmdldEVuY3J5cHRlZFBLQ1M1UEVNRnJvbVJTQUtleShwa2V5LG4pfWVsc2V7cT10aGlzLmdldEVuY3J5cHRlZFBLQ1M1UEVNRnJvbVJTQUtleShwa2V5LG4scyl9cmV0dXJuIHF9LGdldFJTQUtleUZyb21QbGFpblBLQ1M4UEVNOmZ1bmN0aW9uKHApe2lmKHAubWF0Y2goL0VOQ1JZUFRFRC8pKXt0aHJvd1wicGVtIHNoYWxsIGJlIG5vdCBFTkNSWVBURURcIn12YXIgbz10aGlzLmdldEhleEZyb21QRU0ocCxcIlBSSVZBVEUgS0VZXCIpO3ZhciBuPXRoaXMuZ2V0UlNBS2V5RnJvbVBsYWluUEtDUzhIZXgobyk7cmV0dXJuIG59LGdldFJTQUtleUZyb21QbGFpblBLQ1M4SGV4OmZ1bmN0aW9uKHEpe3ZhciBwPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKHEsMCk7aWYocC5sZW5ndGghPTMpe3Rocm93XCJvdXRlciBERVJTZXF1ZW5jZSBzaGFsbCBoYXZlIDMgZWxlbWVudHM6IFwiK3AubGVuZ3RofXZhciBvPUFTTjFIRVguZ2V0SGV4T2ZUTFZfQXRPYmoocSxwWzFdKTtpZihvIT1cIjMwMGQwNjA5MmE4NjQ4ODZmNzBkMDEwMTAxMDUwMFwiKXt0aHJvd1wiUEtDUzggQWxnb3JpdGhtSWRlbnRpZmllciBpcyBub3QgcnNhRW5jOiBcIitvfXZhciBvPUFTTjFIRVguZ2V0SGV4T2ZUTFZfQXRPYmoocSxwWzFdKTt2YXIgcj1BU04xSEVYLmdldEhleE9mVExWX0F0T2JqKHEscFsyXSk7dmFyIHM9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoociwwKTt2YXIgbj1uZXcgUlNBS2V5KCk7bi5yZWFkUHJpdmF0ZUtleUZyb21BU04xSGV4U3RyaW5nKHMpO3JldHVybiBufSxwYXJzZUhleE9mRW5jcnlwdGVkUEtDUzg6ZnVuY3Rpb24odSl7dmFyIHE9e307dmFyIHA9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoodSwwKTtpZihwLmxlbmd0aCE9Mil7dGhyb3dcIm1hbGZvcm1lZCBmb3JtYXQ6IFNFUVVFTkNFKDApLml0ZW1zICE9IDI6IFwiK3AubGVuZ3RofXEuY2lwaGVydGV4dD1BU04xSEVYLmdldEhleE9mVl9BdE9iaih1LHBbMV0pO3ZhciB3PUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKHUscFswXSk7aWYody5sZW5ndGghPTIpe3Rocm93XCJtYWxmb3JtZWQgZm9ybWF0OiBTRVFVRU5DRSgwLjApLml0ZW1zICE9IDI6IFwiK3cubGVuZ3RofWlmKEFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHUsd1swXSkhPVwiMmE4NjQ4ODZmNzBkMDEwNTBkXCIpe3Rocm93XCJ0aGlzIG9ubHkgc3VwcG9ydHMgcGtjczVQQkVTMlwifXZhciBuPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKHUsd1sxXSk7aWYody5sZW5ndGghPTIpe3Rocm93XCJtYWxmb3JtZWQgZm9ybWF0OiBTRVFVRU5DRSgwLjAuMSkuaXRlbXMgIT0gMjogXCIrbi5sZW5ndGh9dmFyIG89QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoodSxuWzFdKTtpZihvLmxlbmd0aCE9Mil7dGhyb3dcIm1hbGZvcm1lZCBmb3JtYXQ6IFNFUVVFTkNFKDAuMC4xLjEpLml0ZW1zICE9IDI6IFwiK28ubGVuZ3RofWlmKEFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHUsb1swXSkhPVwiMmE4NjQ4ODZmNzBkMDMwN1wiKXt0aHJvd1widGhpcyBvbmx5IHN1cHBvcnRzIFRyaXBsZURFU1wifXEuZW5jcnlwdGlvblNjaGVtZUFsZz1cIlRyaXBsZURFU1wiO3EuZW5jcnlwdGlvblNjaGVtZUlWPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHUsb1sxXSk7dmFyIHI9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoodSxuWzBdKTtpZihyLmxlbmd0aCE9Mil7dGhyb3dcIm1hbGZvcm1lZCBmb3JtYXQ6IFNFUVVFTkNFKDAuMC4xLjApLml0ZW1zICE9IDI6IFwiK3IubGVuZ3RofWlmKEFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHUsclswXSkhPVwiMmE4NjQ4ODZmNzBkMDEwNTBjXCIpe3Rocm93XCJ0aGlzIG9ubHkgc3VwcG9ydHMgcGtjczVQQktERjJcIn12YXIgdj1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaih1LHJbMV0pO2lmKHYubGVuZ3RoPDIpe3Rocm93XCJtYWxmb3JtZWQgZm9ybWF0OiBTRVFVRU5DRSgwLjAuMS4wLjEpLml0ZW1zIDwgMjogXCIrdi5sZW5ndGh9cS5wYmtkZjJTYWx0PUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHUsdlswXSk7dmFyIHM9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoodSx2WzFdKTt0cnl7cS5wYmtkZjJJdGVyPXBhcnNlSW50KHMsMTYpfWNhdGNoKHQpe3Rocm93XCJtYWxmb3JtZWQgZm9ybWF0IHBia2RmMkl0ZXI6IFwiK3N9cmV0dXJuIHF9LGdldFBCS0RGMktleUhleEZyb21QYXJhbTpmdW5jdGlvbihzLG4pe3ZhciByPUNyeXB0b0pTLmVuYy5IZXgucGFyc2Uocy5wYmtkZjJTYWx0KTt2YXIgbz1zLnBia2RmMkl0ZXI7dmFyIHE9Q3J5cHRvSlMuUEJLREYyKG4scix7a2V5U2l6ZToxOTIvMzIsaXRlcmF0aW9uczpvfSk7dmFyIHA9Q3J5cHRvSlMuZW5jLkhleC5zdHJpbmdpZnkocSk7cmV0dXJuIHB9LGdldFBsYWluUEtDUzhIZXhGcm9tRW5jcnlwdGVkUEtDUzhQRU06ZnVuY3Rpb24odix3KXt2YXIgcD10aGlzLmdldEhleEZyb21QRU0odixcIkVOQ1JZUFRFRCBQUklWQVRFIEtFWVwiKTt2YXIgbj10aGlzLnBhcnNlSGV4T2ZFbmNyeXB0ZWRQS0NTOChwKTt2YXIgcz1QS0NTNVBLRVkuZ2V0UEJLREYyS2V5SGV4RnJvbVBhcmFtKG4sdyk7dmFyIHQ9e307dC5jaXBoZXJ0ZXh0PUNyeXB0b0pTLmVuYy5IZXgucGFyc2Uobi5jaXBoZXJ0ZXh0KTt2YXIgcj1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKHMpO3ZhciBxPUNyeXB0b0pTLmVuYy5IZXgucGFyc2Uobi5lbmNyeXB0aW9uU2NoZW1lSVYpO3ZhciB1PUNyeXB0b0pTLlRyaXBsZURFUy5kZWNyeXB0KHQscix7aXY6cX0pO3ZhciBvPUNyeXB0b0pTLmVuYy5IZXguc3RyaW5naWZ5KHUpO3JldHVybiBvfSxnZXRSU0FLZXlGcm9tRW5jcnlwdGVkUEtDUzhQRU06ZnVuY3Rpb24ocSxwKXt2YXIgbz10aGlzLmdldFBsYWluUEtDUzhIZXhGcm9tRW5jcnlwdGVkUEtDUzhQRU0ocSxwKTt2YXIgbj10aGlzLmdldFJTQUtleUZyb21QbGFpblBLQ1M4SGV4KG8pO3JldHVybiBufSxnZXRLZXlGcm9tRW5jcnlwdGVkUEtDUzhQRU06ZnVuY3Rpb24ocSxvKXt2YXIgbj10aGlzLmdldFBsYWluUEtDUzhIZXhGcm9tRW5jcnlwdGVkUEtDUzhQRU0ocSxvKTt2YXIgcD10aGlzLmdldEtleUZyb21QbGFpblByaXZhdGVQS0NTOEhleChuKTtyZXR1cm4gcH0scGFyc2VQbGFpblByaXZhdGVQS0NTOEhleDpmdW5jdGlvbihxKXt2YXIgbz17fTtvLmFsZ3BhcmFtPW51bGw7aWYocS5zdWJzdHIoMCwyKSE9XCIzMFwiKXt0aHJvd1wibWFsZm9ybWVkIHBsYWluIFBLQ1M4IHByaXZhdGUga2V5KGNvZGU6MDAxKVwifXZhciBwPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKHEsMCk7aWYocC5sZW5ndGghPTMpe3Rocm93XCJtYWxmb3JtZWQgcGxhaW4gUEtDUzggcHJpdmF0ZSBrZXkoY29kZTowMDIpXCJ9aWYocS5zdWJzdHIocFsxXSwyKSE9XCIzMFwiKXt0aHJvd1wibWFsZm9ybWVkIFBLQ1M4IHByaXZhdGUga2V5KGNvZGU6MDAzKVwifXZhciBuPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKHEscFsxXSk7aWYobi5sZW5ndGghPTIpe3Rocm93XCJtYWxmb3JtZWQgUEtDUzggcHJpdmF0ZSBrZXkoY29kZTowMDQpXCJ9aWYocS5zdWJzdHIoblswXSwyKSE9XCIwNlwiKXt0aHJvd1wibWFsZm9ybWVkIFBLQ1M4IHByaXZhdGUga2V5KGNvZGU6MDA1KVwifW8uYWxnb2lkPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHEsblswXSk7aWYocS5zdWJzdHIoblsxXSwyKT09XCIwNlwiKXtvLmFsZ3BhcmFtPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHEsblsxXSl9aWYocS5zdWJzdHIocFsyXSwyKSE9XCIwNFwiKXt0aHJvd1wibWFsZm9ybWVkIFBLQ1M4IHByaXZhdGUga2V5KGNvZGU6MDA2KVwifW8ua2V5aWR4PUFTTjFIRVguZ2V0U3RhcnRQb3NPZlZfQXRPYmoocSxwWzJdKTtyZXR1cm4gb30sZ2V0S2V5RnJvbVBsYWluUHJpdmF0ZVBLQ1M4UEVNOmZ1bmN0aW9uKG8pe3ZhciBuPXRoaXMuZ2V0SGV4RnJvbVBFTShvLFwiUFJJVkFURSBLRVlcIik7dmFyIHA9dGhpcy5nZXRLZXlGcm9tUGxhaW5Qcml2YXRlUEtDUzhIZXgobik7cmV0dXJuIHB9LGdldEtleUZyb21QbGFpblByaXZhdGVQS0NTOEhleDpmdW5jdGlvbihuKXt2YXIgcD10aGlzLnBhcnNlUGxhaW5Qcml2YXRlUEtDUzhIZXgobik7aWYocC5hbGdvaWQ9PVwiMmE4NjQ4ODZmNzBkMDEwMTAxXCIpe3RoaXMucGFyc2VQcml2YXRlUmF3UlNBS2V5SGV4QXRPYmoobixwKTt2YXIgbz1wLmtleTt2YXIgcT1uZXcgUlNBS2V5KCk7cS5zZXRQcml2YXRlRXgoby5uLG8uZSxvLmQsby5wLG8ucSxvLmRwLG8uZHEsby5jbyk7cmV0dXJuIHF9ZWxzZXtpZihwLmFsZ29pZD09XCIyYTg2NDhjZTNkMDIwMVwiKXt0aGlzLnBhcnNlUHJpdmF0ZVJhd0VDS2V5SGV4QXRPYmoobixwKTtpZihLSlVSLmNyeXB0by5PSUQub2lkaGV4Mm5hbWVbcC5hbGdwYXJhbV09PT11bmRlZmluZWQpe3Rocm93XCJLSlVSLmNyeXB0by5PSUQub2lkaGV4Mm5hbWUgdW5kZWZpbmVkOiBcIitwLmFsZ3BhcmFtfXZhciByPUtKVVIuY3J5cHRvLk9JRC5vaWRoZXgybmFtZVtwLmFsZ3BhcmFtXTt2YXIgcT1uZXcgS0pVUi5jcnlwdG8uRUNEU0Eoe2N1cnZlOnIscHJ2OnAua2V5fSk7cmV0dXJuIHF9ZWxzZXt0aHJvd1widW5zdXBwb3J0ZWQgcHJpdmF0ZSBrZXkgYWxnb3JpdGhtXCJ9fX0sZ2V0UlNBS2V5RnJvbVB1YmxpY1BLQ1M4UEVNOmZ1bmN0aW9uKG8pe3ZhciBwPXRoaXMuZ2V0SGV4RnJvbVBFTShvLFwiUFVCTElDIEtFWVwiKTt2YXIgbj10aGlzLmdldFJTQUtleUZyb21QdWJsaWNQS0NTOEhleChwKTtyZXR1cm4gbn0sZ2V0S2V5RnJvbVB1YmxpY1BLQ1M4UEVNOmZ1bmN0aW9uKG8pe3ZhciBwPXRoaXMuZ2V0SGV4RnJvbVBFTShvLFwiUFVCTElDIEtFWVwiKTt2YXIgbj10aGlzLmdldEtleUZyb21QdWJsaWNQS0NTOEhleChwKTtyZXR1cm4gbn0sZ2V0S2V5RnJvbVB1YmxpY1BLQ1M4SGV4OmZ1bmN0aW9uKG8pe3ZhciBuPXRoaXMucGFyc2VQdWJsaWNQS0NTOEhleChvKTtpZihuLmFsZ29pZD09XCIyYTg2NDg4NmY3MGQwMTAxMDFcIil7dmFyIHI9dGhpcy5wYXJzZVB1YmxpY1Jhd1JTQUtleUhleChuLmtleSk7dmFyIHA9bmV3IFJTQUtleSgpO3Auc2V0UHVibGljKHIubixyLmUpO3JldHVybiBwfWVsc2V7aWYobi5hbGdvaWQ9PVwiMmE4NjQ4Y2UzZDAyMDFcIil7aWYoS0pVUi5jcnlwdG8uT0lELm9pZGhleDJuYW1lW24uYWxncGFyYW1dPT09dW5kZWZpbmVkKXt0aHJvd1wiS0pVUi5jcnlwdG8uT0lELm9pZGhleDJuYW1lIHVuZGVmaW5lZDogXCIrbi5hbGdwYXJhbX12YXIgcT1LSlVSLmNyeXB0by5PSUQub2lkaGV4Mm5hbWVbbi5hbGdwYXJhbV07dmFyIHA9bmV3IEtKVVIuY3J5cHRvLkVDRFNBKHtjdXJ2ZTpxLHB1YjpuLmtleX0pO3JldHVybiBwfWVsc2V7dGhyb3dcInVuc3VwcG9ydGVkIHB1YmxpYyBrZXkgYWxnb3JpdGhtXCJ9fX0scGFyc2VQdWJsaWNSYXdSU0FLZXlIZXg6ZnVuY3Rpb24ocCl7dmFyIG49e307aWYocC5zdWJzdHIoMCwyKSE9XCIzMFwiKXt0aHJvd1wibWFsZm9ybWVkIFJTQSBrZXkoY29kZTowMDEpXCJ9dmFyIG89QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoocCwwKTtpZihvLmxlbmd0aCE9Mil7dGhyb3dcIm1hbGZvcm1lZCBSU0Ega2V5KGNvZGU6MDAyKVwifWlmKHAuc3Vic3RyKG9bMF0sMikhPVwiMDJcIil7dGhyb3dcIm1hbGZvcm1lZCBSU0Ega2V5KGNvZGU6MDAzKVwifW4ubj1BU04xSEVYLmdldEhleE9mVl9BdE9iaihwLG9bMF0pO2lmKHAuc3Vic3RyKG9bMV0sMikhPVwiMDJcIil7dGhyb3dcIm1hbGZvcm1lZCBSU0Ega2V5KGNvZGU6MDA0KVwifW4uZT1BU04xSEVYLmdldEhleE9mVl9BdE9iaihwLG9bMV0pO3JldHVybiBufSxwYXJzZVByaXZhdGVSYXdSU0FLZXlIZXhBdE9iajpmdW5jdGlvbihvLHEpe3ZhciBwPXEua2V5aWR4O2lmKG8uc3Vic3RyKHAsMikhPVwiMzBcIil7dGhyb3dcIm1hbGZvcm1lZCBSU0EgcHJpdmF0ZSBrZXkoY29kZTowMDEpXCJ9dmFyIG49QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoobyxwKTtpZihuLmxlbmd0aCE9OSl7dGhyb3dcIm1hbGZvcm1lZCBSU0EgcHJpdmF0ZSBrZXkoY29kZTowMDIpXCJ9cS5rZXk9e307cS5rZXkubj1BU04xSEVYLmdldEhleE9mVl9BdE9iaihvLG5bMV0pO3Eua2V5LmU9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoobyxuWzJdKTtxLmtleS5kPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKG8sblszXSk7cS5rZXkucD1BU04xSEVYLmdldEhleE9mVl9BdE9iaihvLG5bNF0pO3Eua2V5LnE9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoobyxuWzVdKTtxLmtleS5kcD1BU04xSEVYLmdldEhleE9mVl9BdE9iaihvLG5bNl0pO3Eua2V5LmRxPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKG8sbls3XSk7cS5rZXkuY289QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoobyxuWzhdKX0scGFyc2VQcml2YXRlUmF3RUNLZXlIZXhBdE9iajpmdW5jdGlvbihvLHEpe3ZhciBwPXEua2V5aWR4O2lmKG8uc3Vic3RyKHAsMikhPVwiMzBcIil7dGhyb3dcIm1hbGZvcm1lZCBFQ0MgcHJpdmF0ZSBrZXkoY29kZTowMDEpXCJ9dmFyIG49QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoobyxwKTtpZihuLmxlbmd0aCE9Myl7dGhyb3dcIm1hbGZvcm1lZCBFQ0MgcHJpdmF0ZSBrZXkoY29kZTowMDIpXCJ9aWYoby5zdWJzdHIoblsxXSwyKSE9XCIwNFwiKXt0aHJvd1wibWFsZm9ybWVkIEVDQyBwcml2YXRlIGtleShjb2RlOjAwMylcIn1xLmtleT1BU04xSEVYLmdldEhleE9mVl9BdE9iaihvLG5bMV0pfSxwYXJzZVB1YmxpY1BLQ1M4SGV4OmZ1bmN0aW9uKHEpe3ZhciBvPXt9O28uYWxncGFyYW09bnVsbDt2YXIgcD1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihxLDApO2lmKHAubGVuZ3RoIT0yKXt0aHJvd1wib3V0ZXIgREVSU2VxdWVuY2Ugc2hhbGwgaGF2ZSAyIGVsZW1lbnRzOiBcIitwLmxlbmd0aH12YXIgcj1wWzBdO2lmKHEuc3Vic3RyKHIsMikhPVwiMzBcIil7dGhyb3dcIm1hbGZvcm1lZCBQS0NTOCBwdWJsaWMga2V5KGNvZGU6MDAxKVwifXZhciBuPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKHEscik7aWYobi5sZW5ndGghPTIpe3Rocm93XCJtYWxmb3JtZWQgUEtDUzggcHVibGljIGtleShjb2RlOjAwMilcIn1pZihxLnN1YnN0cihuWzBdLDIpIT1cIjA2XCIpe3Rocm93XCJtYWxmb3JtZWQgUEtDUzggcHVibGljIGtleShjb2RlOjAwMylcIn1vLmFsZ29pZD1BU04xSEVYLmdldEhleE9mVl9BdE9iaihxLG5bMF0pO2lmKHEuc3Vic3RyKG5bMV0sMik9PVwiMDZcIil7by5hbGdwYXJhbT1BU04xSEVYLmdldEhleE9mVl9BdE9iaihxLG5bMV0pfWlmKHEuc3Vic3RyKHBbMV0sMikhPVwiMDNcIil7dGhyb3dcIm1hbGZvcm1lZCBQS0NTOCBwdWJsaWMga2V5KGNvZGU6MDA0KVwifW8ua2V5PUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHEscFsxXSkuc3Vic3RyKDIpO3JldHVybiBvfSxnZXRSU0FLZXlGcm9tUHVibGljUEtDUzhIZXg6ZnVuY3Rpb24ocil7dmFyIHE9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoociwwKTtpZihxLmxlbmd0aCE9Mil7dGhyb3dcIm91dGVyIERFUlNlcXVlbmNlIHNoYWxsIGhhdmUgMiBlbGVtZW50czogXCIrcS5sZW5ndGh9dmFyIHA9QVNOMUhFWC5nZXRIZXhPZlRMVl9BdE9iaihyLHFbMF0pO2lmKHAhPVwiMzAwZDA2MDkyYTg2NDg4NmY3MGQwMTAxMDEwNTAwXCIpe3Rocm93XCJQS0NTOCBBbGdvcml0aG1JZCBpcyBub3QgcnNhRW5jcnlwdGlvblwifWlmKHIuc3Vic3RyKHFbMV0sMikhPVwiMDNcIil7dGhyb3dcIlBLQ1M4IFB1YmxpYyBLZXkgaXMgbm90IEJJVFNUUklORyBlbmNhcHNsYXRlZC5cIn12YXIgdD1BU04xSEVYLmdldFN0YXJ0UG9zT2ZWX0F0T2JqKHIscVsxXSkrMjtpZihyLnN1YnN0cih0LDIpIT1cIjMwXCIpe3Rocm93XCJQS0NTOCBQdWJsaWMgS2V5IGlzIG5vdCBTRVFVRU5DRS5cIn12YXIgbj1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihyLHQpO2lmKG4ubGVuZ3RoIT0yKXt0aHJvd1wiaW5uZXIgREVSU2VxdWVuY2Ugc2hhbGwgaGF2ZSAyIGVsZW1lbnRzOiBcIituLmxlbmd0aH1pZihyLnN1YnN0cihuWzBdLDIpIT1cIjAyXCIpe3Rocm93XCJOIGlzIG5vdCBBU04uMSBJTlRFR0VSXCJ9aWYoci5zdWJzdHIoblsxXSwyKSE9XCIwMlwiKXt0aHJvd1wiRSBpcyBub3QgQVNOLjEgSU5URUdFUlwifXZhciB1PUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHIsblswXSk7dmFyIHM9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoocixuWzFdKTt2YXIgbz1uZXcgUlNBS2V5KCk7by5zZXRQdWJsaWModSxzKTtyZXR1cm4gb30sfX0oKTtcbi8qISBrZXl1dGlsLTEuMC4xMi5qcyAoYykgMjAxMy0yMDE1IEtlbmppIFVydXNoaW1hIHwga2p1ci5naXRodWIuY29tL2pzcnNhc2lnbi9saWNlbnNlXG4gKi9cbnZhciBLRVlVVElMPWZ1bmN0aW9uKCl7dmFyIGQ9ZnVuY3Rpb24ocCxyLHEpe3JldHVybiBrKENyeXB0b0pTLkFFUyxwLHIscSl9O3ZhciBlPWZ1bmN0aW9uKHAscixxKXtyZXR1cm4gayhDcnlwdG9KUy5UcmlwbGVERVMscCxyLHEpfTt2YXIgYT1mdW5jdGlvbihwLHIscSl7cmV0dXJuIGsoQ3J5cHRvSlMuREVTLHAscixxKX07dmFyIGs9ZnVuY3Rpb24ocyx4LHUscSl7dmFyIHI9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZSh4KTt2YXIgdz1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKHUpO3ZhciBwPUNyeXB0b0pTLmVuYy5IZXgucGFyc2UocSk7dmFyIHQ9e307dC5rZXk9dzt0Lml2PXA7dC5jaXBoZXJ0ZXh0PXI7dmFyIHY9cy5kZWNyeXB0KHQsdyx7aXY6cH0pO3JldHVybiBDcnlwdG9KUy5lbmMuSGV4LnN0cmluZ2lmeSh2KX07dmFyIGw9ZnVuY3Rpb24ocCxyLHEpe3JldHVybiBnKENyeXB0b0pTLkFFUyxwLHIscSl9O3ZhciBvPWZ1bmN0aW9uKHAscixxKXtyZXR1cm4gZyhDcnlwdG9KUy5UcmlwbGVERVMscCxyLHEpfTt2YXIgZj1mdW5jdGlvbihwLHIscSl7cmV0dXJuIGcoQ3J5cHRvSlMuREVTLHAscixxKX07dmFyIGc9ZnVuY3Rpb24odCx5LHYscSl7dmFyIHM9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZSh5KTt2YXIgeD1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKHYpO3ZhciBwPUNyeXB0b0pTLmVuYy5IZXgucGFyc2UocSk7dmFyIHc9dC5lbmNyeXB0KHMseCx7aXY6cH0pO3ZhciByPUNyeXB0b0pTLmVuYy5IZXgucGFyc2Uody50b1N0cmluZygpKTt2YXIgdT1DcnlwdG9KUy5lbmMuQmFzZTY0LnN0cmluZ2lmeShyKTtyZXR1cm4gdX07dmFyIGk9e1wiQUVTLTI1Ni1DQkNcIjp7cHJvYzpkLGVwcm9jOmwsa2V5bGVuOjMyLGl2bGVuOjE2fSxcIkFFUy0xOTItQ0JDXCI6e3Byb2M6ZCxlcHJvYzpsLGtleWxlbjoyNCxpdmxlbjoxNn0sXCJBRVMtMTI4LUNCQ1wiOntwcm9jOmQsZXByb2M6bCxrZXlsZW46MTYsaXZsZW46MTZ9LFwiREVTLUVERTMtQ0JDXCI6e3Byb2M6ZSxlcHJvYzpvLGtleWxlbjoyNCxpdmxlbjo4fSxcIkRFUy1DQkNcIjp7cHJvYzphLGVwcm9jOmYsa2V5bGVuOjgsaXZsZW46OH19O3ZhciBjPWZ1bmN0aW9uKHApe3JldHVybiBpW3BdW1wicHJvY1wiXX07dmFyIG09ZnVuY3Rpb24ocCl7dmFyIHI9Q3J5cHRvSlMubGliLldvcmRBcnJheS5yYW5kb20ocCk7dmFyIHE9Q3J5cHRvSlMuZW5jLkhleC5zdHJpbmdpZnkocik7cmV0dXJuIHF9O3ZhciBuPWZ1bmN0aW9uKHQpe3ZhciB1PXt9O2lmKHQubWF0Y2gobmV3IFJlZ0V4cChcIkRFSy1JbmZvOiAoW14sXSspLChbMC05QS1GYS1mXSspXCIsXCJtXCIpKSl7dS5jaXBoZXI9UmVnRXhwLiQxO3UuaXZzYWx0PVJlZ0V4cC4kMn1pZih0Lm1hdGNoKG5ldyBSZWdFeHAoXCItLS0tLUJFR0lOIChbQS1aXSspIFBSSVZBVEUgS0VZLS0tLS1cIikpKXt1LnR5cGU9UmVnRXhwLiQxfXZhciByPS0xO3ZhciB2PTA7aWYodC5pbmRleE9mKFwiXFxyXFxuXFxyXFxuXCIpIT0tMSl7cj10LmluZGV4T2YoXCJcXHJcXG5cXHJcXG5cIik7dj0yfWlmKHQuaW5kZXhPZihcIlxcblxcblwiKSE9LTEpe3I9dC5pbmRleE9mKFwiXFxuXFxuXCIpO3Y9MX12YXIgcT10LmluZGV4T2YoXCItLS0tLUVORFwiKTtpZihyIT0tMSYmcSE9LTEpe3ZhciBwPXQuc3Vic3RyaW5nKHIrdioyLHEtdik7cD1wLnJlcGxhY2UoL1xccysvZyxcIlwiKTt1LmRhdGE9cH1yZXR1cm4gdX07dmFyIGo9ZnVuY3Rpb24ocSx5LHApe3ZhciB2PXAuc3Vic3RyaW5nKDAsMTYpO3ZhciB0PUNyeXB0b0pTLmVuYy5IZXgucGFyc2Uodik7dmFyIHI9Q3J5cHRvSlMuZW5jLlV0ZjgucGFyc2UoeSk7dmFyIHU9aVtxXVtcImtleWxlblwiXStpW3FdW1wiaXZsZW5cIl07dmFyIHg9XCJcIjt2YXIgdz1udWxsO2Zvcig7Oyl7dmFyIHM9Q3J5cHRvSlMuYWxnby5NRDUuY3JlYXRlKCk7aWYodyE9bnVsbCl7cy51cGRhdGUodyl9cy51cGRhdGUocik7cy51cGRhdGUodCk7dz1zLmZpbmFsaXplKCk7eD14K0NyeXB0b0pTLmVuYy5IZXguc3RyaW5naWZ5KHcpO2lmKHgubGVuZ3RoPj11KjIpe2JyZWFrfX12YXIgej17fTt6LmtleWhleD14LnN1YnN0cigwLGlbcV1bXCJrZXlsZW5cIl0qMik7ei5pdmhleD14LnN1YnN0cihpW3FdW1wia2V5bGVuXCJdKjIsaVtxXVtcIml2bGVuXCJdKjIpO3JldHVybiB6fTt2YXIgYj1mdW5jdGlvbihwLHYscix3KXt2YXIgcz1DcnlwdG9KUy5lbmMuQmFzZTY0LnBhcnNlKHApO3ZhciBxPUNyeXB0b0pTLmVuYy5IZXguc3RyaW5naWZ5KHMpO3ZhciB1PWlbdl1bXCJwcm9jXCJdO3ZhciB0PXUocSxyLHcpO3JldHVybiB0fTt2YXIgaD1mdW5jdGlvbihwLHMscSx1KXt2YXIgcj1pW3NdW1wiZXByb2NcIl07dmFyIHQ9cihwLHEsdSk7cmV0dXJuIHR9O3JldHVybnt2ZXJzaW9uOlwiMS4wLjBcIixnZXRIZXhGcm9tUEVNOmZ1bmN0aW9uKHEsdSl7dmFyIHI9cTtpZihyLmluZGV4T2YoXCItLS0tLUJFR0lOIFwiKT09LTEpe3Rocm93XCJjYW4ndCBmaW5kIFBFTSBoZWFkZXI6IFwiK3V9aWYodHlwZW9mIHU9PVwic3RyaW5nXCImJnUhPVwiXCIpe3I9ci5yZXBsYWNlKFwiLS0tLS1CRUdJTiBcIit1K1wiLS0tLS1cIixcIlwiKTtyPXIucmVwbGFjZShcIi0tLS0tRU5EIFwiK3UrXCItLS0tLVwiLFwiXCIpfWVsc2V7cj1yLnJlcGxhY2UoLy0tLS0tQkVHSU4gW14tXSstLS0tLS8sXCJcIik7cj1yLnJlcGxhY2UoLy0tLS0tRU5EIFteLV0rLS0tLS0vLFwiXCIpfXZhciB0PXIucmVwbGFjZSgvXFxzKy9nLFwiXCIpO3ZhciBwPWI2NHRvaGV4KHQpO3JldHVybiBwfSxnZXREZWNyeXB0ZWRLZXlIZXhCeUtleUlWOmZ1bmN0aW9uKHEsdCxzLHIpe3ZhciBwPWModCk7cmV0dXJuIHAocSxzLHIpfSxwYXJzZVBLQ1M1UEVNOmZ1bmN0aW9uKHApe3JldHVybiBuKHApfSxnZXRLZXlBbmRVbnVzZWRJdkJ5UGFzc2NvZGVBbmRJdnNhbHQ6ZnVuY3Rpb24ocSxwLHIpe3JldHVybiBqKHEscCxyKX0sZGVjcnlwdEtleUI2NDpmdW5jdGlvbihwLHIscSxzKXtyZXR1cm4gYihwLHIscSxzKX0sZ2V0RGVjcnlwdGVkS2V5SGV4OmZ1bmN0aW9uKHkseCl7dmFyIHE9bih5KTt2YXIgdD1xLnR5cGU7dmFyIHI9cS5jaXBoZXI7dmFyIHA9cS5pdnNhbHQ7dmFyIHM9cS5kYXRhO3ZhciB3PWoocix4LHApO3ZhciB2PXcua2V5aGV4O3ZhciB1PWIocyxyLHYscCk7cmV0dXJuIHV9LGdldFJTQUtleUZyb21FbmNyeXB0ZWRQS0NTNVBFTTpmdW5jdGlvbihyLHEpe3ZhciBzPXRoaXMuZ2V0RGVjcnlwdGVkS2V5SGV4KHIscSk7dmFyIHA9bmV3IFJTQUtleSgpO3AucmVhZFByaXZhdGVLZXlGcm9tQVNOMUhleFN0cmluZyhzKTtyZXR1cm4gcH0sZ2V0RW5jcnlwdGVkUEtDUzVQRU1Gcm9tUHJ2S2V5SGV4OmZ1bmN0aW9uKHgscyxBLHQscil7dmFyIHA9XCJcIjtpZih0eXBlb2YgdD09XCJ1bmRlZmluZWRcInx8dD09bnVsbCl7dD1cIkFFUy0yNTYtQ0JDXCJ9aWYodHlwZW9mIGlbdF09PVwidW5kZWZpbmVkXCIpe3Rocm93XCJLRVlVVElMIHVuc3VwcG9ydGVkIGFsZ29yaXRobTogXCIrdH1pZih0eXBlb2Ygcj09XCJ1bmRlZmluZWRcInx8cj09bnVsbCl7dmFyIHY9aVt0XVtcIml2bGVuXCJdO3ZhciB1PW0odik7cj11LnRvVXBwZXJDYXNlKCl9dmFyIHo9aih0LEEscik7dmFyIHk9ei5rZXloZXg7dmFyIHc9aChzLHQseSxyKTt2YXIgcT13LnJlcGxhY2UoLyguezY0fSkvZyxcIiQxXFxyXFxuXCIpO3ZhciBwPVwiLS0tLS1CRUdJTiBcIit4K1wiIFBSSVZBVEUgS0VZLS0tLS1cXHJcXG5cIjtwKz1cIlByb2MtVHlwZTogNCxFTkNSWVBURURcXHJcXG5cIjtwKz1cIkRFSy1JbmZvOiBcIit0K1wiLFwiK3IrXCJcXHJcXG5cIjtwKz1cIlxcclxcblwiO3ArPXE7cCs9XCJcXHJcXG4tLS0tLUVORCBcIit4K1wiIFBSSVZBVEUgS0VZLS0tLS1cXHJcXG5cIjtyZXR1cm4gcH0sZ2V0RW5jcnlwdGVkUEtDUzVQRU1Gcm9tUlNBS2V5OmZ1bmN0aW9uKEQsRSxyLHQpe3ZhciBCPW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7XCJpbnRcIjowfSk7dmFyIHc9bmV3IEtKVVIuYXNuMS5ERVJJbnRlZ2VyKHtiaWdpbnQ6RC5ufSk7dmFyIEE9bmV3IEtKVVIuYXNuMS5ERVJJbnRlZ2VyKHtcImludFwiOkQuZX0pO3ZhciBDPW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7YmlnaW50OkQuZH0pO3ZhciB1PW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7YmlnaW50OkQucH0pO3ZhciBzPW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7YmlnaW50OkQucX0pO3ZhciB6PW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7YmlnaW50OkQuZG1wMX0pO3ZhciB2PW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7YmlnaW50OkQuZG1xMX0pO3ZhciB5PW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7YmlnaW50OkQuY29lZmZ9KTt2YXIgRj1uZXcgS0pVUi5hc24xLkRFUlNlcXVlbmNlKHthcnJheTpbQix3LEEsQyx1LHMseix2LHldfSk7dmFyIHg9Ri5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHRoaXMuZ2V0RW5jcnlwdGVkUEtDUzVQRU1Gcm9tUHJ2S2V5SGV4KFwiUlNBXCIseCxFLHIsdCl9LG5ld0VuY3J5cHRlZFBLQ1M1UEVNOmZ1bmN0aW9uKHAscSx0LHUpe2lmKHR5cGVvZiBxPT1cInVuZGVmaW5lZFwifHxxPT1udWxsKXtxPTEwMjR9aWYodHlwZW9mIHQ9PVwidW5kZWZpbmVkXCJ8fHQ9PW51bGwpe3Q9XCIxMDAwMVwifXZhciByPW5ldyBSU0FLZXkoKTtyLmdlbmVyYXRlKHEsdCk7dmFyIHM9bnVsbDtpZih0eXBlb2YgdT09XCJ1bmRlZmluZWRcInx8dT09bnVsbCl7cz10aGlzLmdldEVuY3J5cHRlZFBLQ1M1UEVNRnJvbVJTQUtleShyLHApfWVsc2V7cz10aGlzLmdldEVuY3J5cHRlZFBLQ1M1UEVNRnJvbVJTQUtleShyLHAsdSl9cmV0dXJuIHN9LGdldFJTQUtleUZyb21QbGFpblBLQ1M4UEVNOmZ1bmN0aW9uKHIpe2lmKHIubWF0Y2goL0VOQ1JZUFRFRC8pKXt0aHJvd1wicGVtIHNoYWxsIGJlIG5vdCBFTkNSWVBURURcIn12YXIgcT10aGlzLmdldEhleEZyb21QRU0ocixcIlBSSVZBVEUgS0VZXCIpO3ZhciBwPXRoaXMuZ2V0UlNBS2V5RnJvbVBsYWluUEtDUzhIZXgocSk7cmV0dXJuIHB9LGdldFJTQUtleUZyb21QbGFpblBLQ1M4SGV4OmZ1bmN0aW9uKHMpe3ZhciByPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKHMsMCk7aWYoci5sZW5ndGghPTMpe3Rocm93XCJvdXRlciBERVJTZXF1ZW5jZSBzaGFsbCBoYXZlIDMgZWxlbWVudHM6IFwiK3IubGVuZ3RofXZhciBxPUFTTjFIRVguZ2V0SGV4T2ZUTFZfQXRPYmoocyxyWzFdKTtpZihxIT1cIjMwMGQwNjA5MmE4NjQ4ODZmNzBkMDEwMTAxMDUwMFwiKXt0aHJvd1wiUEtDUzggQWxnb3JpdGhtSWRlbnRpZmllciBpcyBub3QgcnNhRW5jOiBcIitxfXZhciBxPUFTTjFIRVguZ2V0SGV4T2ZUTFZfQXRPYmoocyxyWzFdKTt2YXIgdD1BU04xSEVYLmdldEhleE9mVExWX0F0T2JqKHMsclsyXSk7dmFyIHU9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoodCwwKTt2YXIgcD1uZXcgUlNBS2V5KCk7cC5yZWFkUHJpdmF0ZUtleUZyb21BU04xSGV4U3RyaW5nKHUpO3JldHVybiBwfSxwYXJzZUhleE9mRW5jcnlwdGVkUEtDUzg6ZnVuY3Rpb24odyl7dmFyIHM9e307dmFyIHI9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoodywwKTtpZihyLmxlbmd0aCE9Mil7dGhyb3dcIm1hbGZvcm1lZCBmb3JtYXQ6IFNFUVVFTkNFKDApLml0ZW1zICE9IDI6IFwiK3IubGVuZ3RofXMuY2lwaGVydGV4dD1BU04xSEVYLmdldEhleE9mVl9BdE9iaih3LHJbMV0pO3ZhciB5PUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKHcsclswXSk7aWYoeS5sZW5ndGghPTIpe3Rocm93XCJtYWxmb3JtZWQgZm9ybWF0OiBTRVFVRU5DRSgwLjApLml0ZW1zICE9IDI6IFwiK3kubGVuZ3RofWlmKEFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHcseVswXSkhPVwiMmE4NjQ4ODZmNzBkMDEwNTBkXCIpe3Rocm93XCJ0aGlzIG9ubHkgc3VwcG9ydHMgcGtjczVQQkVTMlwifXZhciBwPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKHcseVsxXSk7aWYoeS5sZW5ndGghPTIpe3Rocm93XCJtYWxmb3JtZWQgZm9ybWF0OiBTRVFVRU5DRSgwLjAuMSkuaXRlbXMgIT0gMjogXCIrcC5sZW5ndGh9dmFyIHE9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoodyxwWzFdKTtpZihxLmxlbmd0aCE9Mil7dGhyb3dcIm1hbGZvcm1lZCBmb3JtYXQ6IFNFUVVFTkNFKDAuMC4xLjEpLml0ZW1zICE9IDI6IFwiK3EubGVuZ3RofWlmKEFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHcscVswXSkhPVwiMmE4NjQ4ODZmNzBkMDMwN1wiKXt0aHJvd1widGhpcyBvbmx5IHN1cHBvcnRzIFRyaXBsZURFU1wifXMuZW5jcnlwdGlvblNjaGVtZUFsZz1cIlRyaXBsZURFU1wiO3MuZW5jcnlwdGlvblNjaGVtZUlWPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHcscVsxXSk7dmFyIHQ9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoodyxwWzBdKTtpZih0Lmxlbmd0aCE9Mil7dGhyb3dcIm1hbGZvcm1lZCBmb3JtYXQ6IFNFUVVFTkNFKDAuMC4xLjApLml0ZW1zICE9IDI6IFwiK3QubGVuZ3RofWlmKEFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHcsdFswXSkhPVwiMmE4NjQ4ODZmNzBkMDEwNTBjXCIpe3Rocm93XCJ0aGlzIG9ubHkgc3VwcG9ydHMgcGtjczVQQktERjJcIn12YXIgeD1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaih3LHRbMV0pO2lmKHgubGVuZ3RoPDIpe3Rocm93XCJtYWxmb3JtZWQgZm9ybWF0OiBTRVFVRU5DRSgwLjAuMS4wLjEpLml0ZW1zIDwgMjogXCIreC5sZW5ndGh9cy5wYmtkZjJTYWx0PUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHcseFswXSk7dmFyIHU9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoodyx4WzFdKTt0cnl7cy5wYmtkZjJJdGVyPXBhcnNlSW50KHUsMTYpfWNhdGNoKHYpe3Rocm93XCJtYWxmb3JtZWQgZm9ybWF0IHBia2RmMkl0ZXI6IFwiK3V9cmV0dXJuIHN9LGdldFBCS0RGMktleUhleEZyb21QYXJhbTpmdW5jdGlvbih1LHApe3ZhciB0PUNyeXB0b0pTLmVuYy5IZXgucGFyc2UodS5wYmtkZjJTYWx0KTt2YXIgcT11LnBia2RmMkl0ZXI7dmFyIHM9Q3J5cHRvSlMuUEJLREYyKHAsdCx7a2V5U2l6ZToxOTIvMzIsaXRlcmF0aW9uczpxfSk7dmFyIHI9Q3J5cHRvSlMuZW5jLkhleC5zdHJpbmdpZnkocyk7cmV0dXJuIHJ9LGdldFBsYWluUEtDUzhIZXhGcm9tRW5jcnlwdGVkUEtDUzhQRU06ZnVuY3Rpb24oeCx5KXt2YXIgcj10aGlzLmdldEhleEZyb21QRU0oeCxcIkVOQ1JZUFRFRCBQUklWQVRFIEtFWVwiKTt2YXIgcD10aGlzLnBhcnNlSGV4T2ZFbmNyeXB0ZWRQS0NTOChyKTt2YXIgdT1LRVlVVElMLmdldFBCS0RGMktleUhleEZyb21QYXJhbShwLHkpO3ZhciB2PXt9O3YuY2lwaGVydGV4dD1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKHAuY2lwaGVydGV4dCk7dmFyIHQ9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZSh1KTt2YXIgcz1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKHAuZW5jcnlwdGlvblNjaGVtZUlWKTt2YXIgdz1DcnlwdG9KUy5UcmlwbGVERVMuZGVjcnlwdCh2LHQse2l2OnN9KTt2YXIgcT1DcnlwdG9KUy5lbmMuSGV4LnN0cmluZ2lmeSh3KTtyZXR1cm4gcX0sZ2V0UlNBS2V5RnJvbUVuY3J5cHRlZFBLQ1M4UEVNOmZ1bmN0aW9uKHMscil7dmFyIHE9dGhpcy5nZXRQbGFpblBLQ1M4SGV4RnJvbUVuY3J5cHRlZFBLQ1M4UEVNKHMscik7dmFyIHA9dGhpcy5nZXRSU0FLZXlGcm9tUGxhaW5QS0NTOEhleChxKTtyZXR1cm4gcH0sZ2V0S2V5RnJvbUVuY3J5cHRlZFBLQ1M4UEVNOmZ1bmN0aW9uKHMscSl7dmFyIHA9dGhpcy5nZXRQbGFpblBLQ1M4SGV4RnJvbUVuY3J5cHRlZFBLQ1M4UEVNKHMscSk7dmFyIHI9dGhpcy5nZXRLZXlGcm9tUGxhaW5Qcml2YXRlUEtDUzhIZXgocCk7cmV0dXJuIHJ9LHBhcnNlUGxhaW5Qcml2YXRlUEtDUzhIZXg6ZnVuY3Rpb24ocyl7dmFyIHE9e307cS5hbGdwYXJhbT1udWxsO2lmKHMuc3Vic3RyKDAsMikhPVwiMzBcIil7dGhyb3dcIm1hbGZvcm1lZCBwbGFpbiBQS0NTOCBwcml2YXRlIGtleShjb2RlOjAwMSlcIn12YXIgcj1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihzLDApO2lmKHIubGVuZ3RoIT0zKXt0aHJvd1wibWFsZm9ybWVkIHBsYWluIFBLQ1M4IHByaXZhdGUga2V5KGNvZGU6MDAyKVwifWlmKHMuc3Vic3RyKHJbMV0sMikhPVwiMzBcIil7dGhyb3dcIm1hbGZvcm1lZCBQS0NTOCBwcml2YXRlIGtleShjb2RlOjAwMylcIn12YXIgcD1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihzLHJbMV0pO2lmKHAubGVuZ3RoIT0yKXt0aHJvd1wibWFsZm9ybWVkIFBLQ1M4IHByaXZhdGUga2V5KGNvZGU6MDA0KVwifWlmKHMuc3Vic3RyKHBbMF0sMikhPVwiMDZcIil7dGhyb3dcIm1hbGZvcm1lZCBQS0NTOCBwcml2YXRlIGtleShjb2RlOjAwNSlcIn1xLmFsZ29pZD1BU04xSEVYLmdldEhleE9mVl9BdE9iaihzLHBbMF0pO2lmKHMuc3Vic3RyKHBbMV0sMik9PVwiMDZcIil7cS5hbGdwYXJhbT1BU04xSEVYLmdldEhleE9mVl9BdE9iaihzLHBbMV0pfWlmKHMuc3Vic3RyKHJbMl0sMikhPVwiMDRcIil7dGhyb3dcIm1hbGZvcm1lZCBQS0NTOCBwcml2YXRlIGtleShjb2RlOjAwNilcIn1xLmtleWlkeD1BU04xSEVYLmdldFN0YXJ0UG9zT2ZWX0F0T2JqKHMsclsyXSk7cmV0dXJuIHF9LGdldEtleUZyb21QbGFpblByaXZhdGVQS0NTOFBFTTpmdW5jdGlvbihxKXt2YXIgcD10aGlzLmdldEhleEZyb21QRU0ocSxcIlBSSVZBVEUgS0VZXCIpO3ZhciByPXRoaXMuZ2V0S2V5RnJvbVBsYWluUHJpdmF0ZVBLQ1M4SGV4KHApO3JldHVybiByfSxnZXRLZXlGcm9tUGxhaW5Qcml2YXRlUEtDUzhIZXg6ZnVuY3Rpb24ocCl7dmFyIHc9dGhpcy5wYXJzZVBsYWluUHJpdmF0ZVBLQ1M4SGV4KHApO2lmKHcuYWxnb2lkPT1cIjJhODY0ODg2ZjcwZDAxMDEwMVwiKXt0aGlzLnBhcnNlUHJpdmF0ZVJhd1JTQUtleUhleEF0T2JqKHAsdyk7dmFyIHU9dy5rZXk7dmFyIHo9bmV3IFJTQUtleSgpO3ouc2V0UHJpdmF0ZUV4KHUubix1LmUsdS5kLHUucCx1LnEsdS5kcCx1LmRxLHUuY28pO3JldHVybiB6fWVsc2V7aWYody5hbGdvaWQ9PVwiMmE4NjQ4Y2UzZDAyMDFcIil7dGhpcy5wYXJzZVByaXZhdGVSYXdFQ0tleUhleEF0T2JqKHAsdyk7aWYoS0pVUi5jcnlwdG8uT0lELm9pZGhleDJuYW1lW3cuYWxncGFyYW1dPT09dW5kZWZpbmVkKXt0aHJvd1wiS0pVUi5jcnlwdG8uT0lELm9pZGhleDJuYW1lIHVuZGVmaW5lZDogXCIrdy5hbGdwYXJhbX12YXIgdj1LSlVSLmNyeXB0by5PSUQub2lkaGV4Mm5hbWVbdy5hbGdwYXJhbV07dmFyIHo9bmV3IEtKVVIuY3J5cHRvLkVDRFNBKHtjdXJ2ZTp2fSk7ei5zZXRQdWJsaWNLZXlIZXgody5wdWJrZXkpO3ouc2V0UHJpdmF0ZUtleUhleCh3LmtleSk7ei5pc1B1YmxpYz1mYWxzZTtyZXR1cm4gen1lbHNle2lmKHcuYWxnb2lkPT1cIjJhODY0OGNlMzgwNDAxXCIpe3ZhciB0PUFTTjFIRVguZ2V0VmJ5TGlzdChwLDAsWzEsMSwwXSxcIjAyXCIpO3ZhciBzPUFTTjFIRVguZ2V0VmJ5TGlzdChwLDAsWzEsMSwxXSxcIjAyXCIpO3ZhciB5PUFTTjFIRVguZ2V0VmJ5TGlzdChwLDAsWzEsMSwyXSxcIjAyXCIpO3ZhciBCPUFTTjFIRVguZ2V0VmJ5TGlzdChwLDAsWzIsMF0sXCIwMlwiKTt2YXIgcj1uZXcgQmlnSW50ZWdlcih0LDE2KTt2YXIgcT1uZXcgQmlnSW50ZWdlcihzLDE2KTt2YXIgeD1uZXcgQmlnSW50ZWdlcih5LDE2KTt2YXIgQT1uZXcgQmlnSW50ZWdlcihCLDE2KTt2YXIgej1uZXcgS0pVUi5jcnlwdG8uRFNBKCk7ei5zZXRQcml2YXRlKHIscSx4LG51bGwsQSk7cmV0dXJuIHp9ZWxzZXt0aHJvd1widW5zdXBwb3J0ZWQgcHJpdmF0ZSBrZXkgYWxnb3JpdGhtXCJ9fX19LGdldFJTQUtleUZyb21QdWJsaWNQS0NTOFBFTTpmdW5jdGlvbihxKXt2YXIgcj10aGlzLmdldEhleEZyb21QRU0ocSxcIlBVQkxJQyBLRVlcIik7dmFyIHA9dGhpcy5nZXRSU0FLZXlGcm9tUHVibGljUEtDUzhIZXgocik7cmV0dXJuIHB9LGdldEtleUZyb21QdWJsaWNQS0NTOFBFTTpmdW5jdGlvbihxKXt2YXIgcj10aGlzLmdldEhleEZyb21QRU0ocSxcIlBVQkxJQyBLRVlcIik7dmFyIHA9dGhpcy5nZXRLZXlGcm9tUHVibGljUEtDUzhIZXgocik7cmV0dXJuIHB9LGdldEtleUZyb21QdWJsaWNQS0NTOEhleDpmdW5jdGlvbihxKXt2YXIgcD10aGlzLnBhcnNlUHVibGljUEtDUzhIZXgocSk7aWYocC5hbGdvaWQ9PVwiMmE4NjQ4ODZmNzBkMDEwMTAxXCIpe3ZhciB1PXRoaXMucGFyc2VQdWJsaWNSYXdSU0FLZXlIZXgocC5rZXkpO3ZhciByPW5ldyBSU0FLZXkoKTtyLnNldFB1YmxpYyh1Lm4sdS5lKTtyZXR1cm4gcn1lbHNle2lmKHAuYWxnb2lkPT1cIjJhODY0OGNlM2QwMjAxXCIpe2lmKEtKVVIuY3J5cHRvLk9JRC5vaWRoZXgybmFtZVtwLmFsZ3BhcmFtXT09PXVuZGVmaW5lZCl7dGhyb3dcIktKVVIuY3J5cHRvLk9JRC5vaWRoZXgybmFtZSB1bmRlZmluZWQ6IFwiK3AuYWxncGFyYW19dmFyIHM9S0pVUi5jcnlwdG8uT0lELm9pZGhleDJuYW1lW3AuYWxncGFyYW1dO3ZhciByPW5ldyBLSlVSLmNyeXB0by5FQ0RTQSh7Y3VydmU6cyxwdWI6cC5rZXl9KTtyZXR1cm4gcn1lbHNle2lmKHAuYWxnb2lkPT1cIjJhODY0OGNlMzgwNDAxXCIpe3ZhciB0PXAuYWxncGFyYW07dmFyIHY9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoocC5rZXksMCk7dmFyIHI9bmV3IEtKVVIuY3J5cHRvLkRTQSgpO3Iuc2V0UHVibGljKG5ldyBCaWdJbnRlZ2VyKHQucCwxNiksbmV3IEJpZ0ludGVnZXIodC5xLDE2KSxuZXcgQmlnSW50ZWdlcih0LmcsMTYpLG5ldyBCaWdJbnRlZ2VyKHYsMTYpKTtyZXR1cm4gcn1lbHNle3Rocm93XCJ1bnN1cHBvcnRlZCBwdWJsaWMga2V5IGFsZ29yaXRobVwifX19fSxwYXJzZVB1YmxpY1Jhd1JTQUtleUhleDpmdW5jdGlvbihyKXt2YXIgcD17fTtpZihyLnN1YnN0cigwLDIpIT1cIjMwXCIpe3Rocm93XCJtYWxmb3JtZWQgUlNBIGtleShjb2RlOjAwMSlcIn12YXIgcT1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihyLDApO2lmKHEubGVuZ3RoIT0yKXt0aHJvd1wibWFsZm9ybWVkIFJTQSBrZXkoY29kZTowMDIpXCJ9aWYoci5zdWJzdHIocVswXSwyKSE9XCIwMlwiKXt0aHJvd1wibWFsZm9ybWVkIFJTQSBrZXkoY29kZTowMDMpXCJ9cC5uPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHIscVswXSk7aWYoci5zdWJzdHIocVsxXSwyKSE9XCIwMlwiKXt0aHJvd1wibWFsZm9ybWVkIFJTQSBrZXkoY29kZTowMDQpXCJ9cC5lPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHIscVsxXSk7cmV0dXJuIHB9LHBhcnNlUHJpdmF0ZVJhd1JTQUtleUhleEF0T2JqOmZ1bmN0aW9uKHEscyl7dmFyIHI9cy5rZXlpZHg7aWYocS5zdWJzdHIociwyKSE9XCIzMFwiKXt0aHJvd1wibWFsZm9ybWVkIFJTQSBwcml2YXRlIGtleShjb2RlOjAwMSlcIn12YXIgcD1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihxLHIpO2lmKHAubGVuZ3RoIT05KXt0aHJvd1wibWFsZm9ybWVkIFJTQSBwcml2YXRlIGtleShjb2RlOjAwMilcIn1zLmtleT17fTtzLmtleS5uPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHEscFsxXSk7cy5rZXkuZT1BU04xSEVYLmdldEhleE9mVl9BdE9iaihxLHBbMl0pO3Mua2V5LmQ9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoocSxwWzNdKTtzLmtleS5wPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHEscFs0XSk7cy5rZXkucT1BU04xSEVYLmdldEhleE9mVl9BdE9iaihxLHBbNV0pO3Mua2V5LmRwPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHEscFs2XSk7cy5rZXkuZHE9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoocSxwWzddKTtzLmtleS5jbz1BU04xSEVYLmdldEhleE9mVl9BdE9iaihxLHBbOF0pfSxwYXJzZVByaXZhdGVSYXdFQ0tleUhleEF0T2JqOmZ1bmN0aW9uKHAsdCl7dmFyIHE9dC5rZXlpZHg7dmFyIHI9QVNOMUhFWC5nZXRWYnlMaXN0KHAscSxbMV0sXCIwNFwiKTt2YXIgcz1BU04xSEVYLmdldFZieUxpc3QocCxxLFsyLDBdLFwiMDNcIikuc3Vic3RyKDIpO3Qua2V5PXI7dC5wdWJrZXk9c30scGFyc2VQdWJsaWNQS0NTOEhleDpmdW5jdGlvbihzKXt2YXIgcT17fTtxLmFsZ3BhcmFtPW51bGw7dmFyIHI9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoocywwKTtpZihyLmxlbmd0aCE9Mil7dGhyb3dcIm91dGVyIERFUlNlcXVlbmNlIHNoYWxsIGhhdmUgMiBlbGVtZW50czogXCIrci5sZW5ndGh9dmFyIHQ9clswXTtpZihzLnN1YnN0cih0LDIpIT1cIjMwXCIpe3Rocm93XCJtYWxmb3JtZWQgUEtDUzggcHVibGljIGtleShjb2RlOjAwMSlcIn12YXIgcD1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihzLHQpO2lmKHAubGVuZ3RoIT0yKXt0aHJvd1wibWFsZm9ybWVkIFBLQ1M4IHB1YmxpYyBrZXkoY29kZTowMDIpXCJ9aWYocy5zdWJzdHIocFswXSwyKSE9XCIwNlwiKXt0aHJvd1wibWFsZm9ybWVkIFBLQ1M4IHB1YmxpYyBrZXkoY29kZTowMDMpXCJ9cS5hbGdvaWQ9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoocyxwWzBdKTtpZihzLnN1YnN0cihwWzFdLDIpPT1cIjA2XCIpe3EuYWxncGFyYW09QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoocyxwWzFdKX1lbHNle2lmKHMuc3Vic3RyKHBbMV0sMik9PVwiMzBcIil7cS5hbGdwYXJhbT17fTtxLmFsZ3BhcmFtLnA9QVNOMUhFWC5nZXRWYnlMaXN0KHMscFsxXSxbMF0sXCIwMlwiKTtxLmFsZ3BhcmFtLnE9QVNOMUhFWC5nZXRWYnlMaXN0KHMscFsxXSxbMV0sXCIwMlwiKTtxLmFsZ3BhcmFtLmc9QVNOMUhFWC5nZXRWYnlMaXN0KHMscFsxXSxbMl0sXCIwMlwiKX19aWYocy5zdWJzdHIoclsxXSwyKSE9XCIwM1wiKXt0aHJvd1wibWFsZm9ybWVkIFBLQ1M4IHB1YmxpYyBrZXkoY29kZTowMDQpXCJ9cS5rZXk9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoocyxyWzFdKS5zdWJzdHIoMik7cmV0dXJuIHF9LGdldFJTQUtleUZyb21QdWJsaWNQS0NTOEhleDpmdW5jdGlvbih0KXt2YXIgcz1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaih0LDApO2lmKHMubGVuZ3RoIT0yKXt0aHJvd1wib3V0ZXIgREVSU2VxdWVuY2Ugc2hhbGwgaGF2ZSAyIGVsZW1lbnRzOiBcIitzLmxlbmd0aH12YXIgcj1BU04xSEVYLmdldEhleE9mVExWX0F0T2JqKHQsc1swXSk7aWYociE9XCIzMDBkMDYwOTJhODY0ODg2ZjcwZDAxMDEwMTA1MDBcIil7dGhyb3dcIlBLQ1M4IEFsZ29yaXRobUlkIGlzIG5vdCByc2FFbmNyeXB0aW9uXCJ9aWYodC5zdWJzdHIoc1sxXSwyKSE9XCIwM1wiKXt0aHJvd1wiUEtDUzggUHVibGljIEtleSBpcyBub3QgQklUU1RSSU5HIGVuY2Fwc2xhdGVkLlwifXZhciB2PUFTTjFIRVguZ2V0U3RhcnRQb3NPZlZfQXRPYmoodCxzWzFdKSsyO2lmKHQuc3Vic3RyKHYsMikhPVwiMzBcIil7dGhyb3dcIlBLQ1M4IFB1YmxpYyBLZXkgaXMgbm90IFNFUVVFTkNFLlwifXZhciBwPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKHQsdik7aWYocC5sZW5ndGghPTIpe3Rocm93XCJpbm5lciBERVJTZXF1ZW5jZSBzaGFsbCBoYXZlIDIgZWxlbWVudHM6IFwiK3AubGVuZ3RofWlmKHQuc3Vic3RyKHBbMF0sMikhPVwiMDJcIil7dGhyb3dcIk4gaXMgbm90IEFTTi4xIElOVEVHRVJcIn1pZih0LnN1YnN0cihwWzFdLDIpIT1cIjAyXCIpe3Rocm93XCJFIGlzIG5vdCBBU04uMSBJTlRFR0VSXCJ9dmFyIHc9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoodCxwWzBdKTt2YXIgdT1BU04xSEVYLmdldEhleE9mVl9BdE9iaih0LHBbMV0pO3ZhciBxPW5ldyBSU0FLZXkoKTtxLnNldFB1YmxpYyh3LHUpO3JldHVybiBxfSx9fSgpO0tFWVVUSUwuZ2V0S2V5PWZ1bmN0aW9uKGYsZSxoKXtpZih0eXBlb2YgUlNBS2V5IT1cInVuZGVmaW5lZFwiJiZmIGluc3RhbmNlb2YgUlNBS2V5KXtyZXR1cm4gZn1pZih0eXBlb2YgS0pVUi5jcnlwdG8uRUNEU0EhPVwidW5kZWZpbmVkXCImJmYgaW5zdGFuY2VvZiBLSlVSLmNyeXB0by5FQ0RTQSl7cmV0dXJuIGZ9aWYodHlwZW9mIEtKVVIuY3J5cHRvLkRTQSE9XCJ1bmRlZmluZWRcIiYmZiBpbnN0YW5jZW9mIEtKVVIuY3J5cHRvLkRTQSl7cmV0dXJuIGZ9aWYoZi5jdXJ2ZSE9PXVuZGVmaW5lZCYmZi54eSE9PXVuZGVmaW5lZCYmZi5kPT09dW5kZWZpbmVkKXtyZXR1cm4gbmV3IEtKVVIuY3J5cHRvLkVDRFNBKHtwdWI6Zi54eSxjdXJ2ZTpmLmN1cnZlfSl9aWYoZi5jdXJ2ZSE9PXVuZGVmaW5lZCYmZi5kIT09dW5kZWZpbmVkKXtyZXR1cm4gbmV3IEtKVVIuY3J5cHRvLkVDRFNBKHtwcnY6Zi5kLGN1cnZlOmYuY3VydmV9KX1pZihmLmt0eT09PXVuZGVmaW5lZCYmZi5uIT09dW5kZWZpbmVkJiZmLmUhPT11bmRlZmluZWQmJmYuZD09PXVuZGVmaW5lZCl7dmFyIHc9bmV3IFJTQUtleSgpO3cuc2V0UHVibGljKGYubixmLmUpO3JldHVybiB3fWlmKGYua3R5PT09dW5kZWZpbmVkJiZmLm4hPT11bmRlZmluZWQmJmYuZSE9PXVuZGVmaW5lZCYmZi5kIT09dW5kZWZpbmVkJiZmLnAhPT11bmRlZmluZWQmJmYucSE9PXVuZGVmaW5lZCYmZi5kcCE9PXVuZGVmaW5lZCYmZi5kcSE9PXVuZGVmaW5lZCYmZi5jbyE9PXVuZGVmaW5lZCYmZi5xaT09PXVuZGVmaW5lZCl7dmFyIHc9bmV3IFJTQUtleSgpO3cuc2V0UHJpdmF0ZUV4KGYubixmLmUsZi5kLGYucCxmLnEsZi5kcCxmLmRxLGYuY28pO3JldHVybiB3fWlmKGYua3R5PT09dW5kZWZpbmVkJiZmLm4hPT11bmRlZmluZWQmJmYuZSE9PXVuZGVmaW5lZCYmZi5kIT09dW5kZWZpbmVkJiZmLnA9PT11bmRlZmluZWQpe3ZhciB3PW5ldyBSU0FLZXkoKTt3LnNldFByaXZhdGUoZi5uLGYuZSxmLmQpO3JldHVybiB3fWlmKGYucCE9PXVuZGVmaW5lZCYmZi5xIT09dW5kZWZpbmVkJiZmLmchPT11bmRlZmluZWQmJmYueSE9PXVuZGVmaW5lZCYmZi54PT09dW5kZWZpbmVkKXt2YXIgdz1uZXcgS0pVUi5jcnlwdG8uRFNBKCk7dy5zZXRQdWJsaWMoZi5wLGYucSxmLmcsZi55KTtyZXR1cm4gd31pZihmLnAhPT11bmRlZmluZWQmJmYucSE9PXVuZGVmaW5lZCYmZi5nIT09dW5kZWZpbmVkJiZmLnkhPT11bmRlZmluZWQmJmYueCE9PXVuZGVmaW5lZCl7dmFyIHc9bmV3IEtKVVIuY3J5cHRvLkRTQSgpO3cuc2V0UHJpdmF0ZShmLnAsZi5xLGYuZyxmLnksZi54KTtyZXR1cm4gd31pZihmLmt0eT09PVwiUlNBXCImJmYubiE9PXVuZGVmaW5lZCYmZi5lIT09dW5kZWZpbmVkJiZmLmQ9PT11bmRlZmluZWQpe3ZhciB3PW5ldyBSU0FLZXkoKTt3LnNldFB1YmxpYyhiNjR1dG9oZXgoZi5uKSxiNjR1dG9oZXgoZi5lKSk7cmV0dXJuIHd9aWYoZi5rdHk9PT1cIlJTQVwiJiZmLm4hPT11bmRlZmluZWQmJmYuZSE9PXVuZGVmaW5lZCYmZi5kIT09dW5kZWZpbmVkJiZmLnAhPT11bmRlZmluZWQmJmYucSE9PXVuZGVmaW5lZCYmZi5kcCE9PXVuZGVmaW5lZCYmZi5kcSE9PXVuZGVmaW5lZCYmZi5xaSE9PXVuZGVmaW5lZCl7dmFyIHc9bmV3IFJTQUtleSgpO3cuc2V0UHJpdmF0ZUV4KGI2NHV0b2hleChmLm4pLGI2NHV0b2hleChmLmUpLGI2NHV0b2hleChmLmQpLGI2NHV0b2hleChmLnApLGI2NHV0b2hleChmLnEpLGI2NHV0b2hleChmLmRwKSxiNjR1dG9oZXgoZi5kcSksYjY0dXRvaGV4KGYucWkpKTtyZXR1cm4gd31pZihmLmt0eT09PVwiUlNBXCImJmYubiE9PXVuZGVmaW5lZCYmZi5lIT09dW5kZWZpbmVkJiZmLmQhPT11bmRlZmluZWQpe3ZhciB3PW5ldyBSU0FLZXkoKTt3LnNldFByaXZhdGUoYjY0dXRvaGV4KGYubiksYjY0dXRvaGV4KGYuZSksYjY0dXRvaGV4KGYuZCkpO3JldHVybiB3fWlmKGYua3R5PT09XCJFQ1wiJiZmLmNydiE9PXVuZGVmaW5lZCYmZi54IT09dW5kZWZpbmVkJiZmLnkhPT11bmRlZmluZWQmJmYuZD09PXVuZGVmaW5lZCl7dmFyIGQ9bmV3IEtKVVIuY3J5cHRvLkVDRFNBKHtjdXJ2ZTpmLmNydn0pO3ZhciBsPWQuZWNwYXJhbXMua2V5bGVuLzQ7dmFyIHI9KFwiMDAwMDAwMDAwMFwiK2I2NHV0b2hleChmLngpKS5zbGljZSgtbCk7dmFyIG49KFwiMDAwMDAwMDAwMFwiK2I2NHV0b2hleChmLnkpKS5zbGljZSgtbCk7dmFyIG09XCIwNFwiK3IrbjtkLnNldFB1YmxpY0tleUhleChtKTtyZXR1cm4gZH1pZihmLmt0eT09PVwiRUNcIiYmZi5jcnYhPT11bmRlZmluZWQmJmYueCE9PXVuZGVmaW5lZCYmZi55IT09dW5kZWZpbmVkJiZmLmQhPT11bmRlZmluZWQpe3ZhciBkPW5ldyBLSlVSLmNyeXB0by5FQ0RTQSh7Y3VydmU6Zi5jcnZ9KTt2YXIgbD1kLmVjcGFyYW1zLmtleWxlbi80O3ZhciBhPShcIjAwMDAwMDAwMDBcIitiNjR1dG9oZXgoZi5kKSkuc2xpY2UoLWwpO2Quc2V0UHJpdmF0ZUtleUhleChhKTtyZXR1cm4gZH1pZihmLmluZGV4T2YoXCItRU5EIENFUlRJRklDQVRFLVwiLDApIT0tMXx8Zi5pbmRleE9mKFwiLUVORCBYNTA5IENFUlRJRklDQVRFLVwiLDApIT0tMXx8Zi5pbmRleE9mKFwiLUVORCBUUlVTVEVEIENFUlRJRklDQVRFLVwiLDApIT0tMSl7cmV0dXJuIFg1MDkuZ2V0UHVibGljS2V5RnJvbUNlcnRQRU0oZil9aWYoaD09PVwicGtjczhwdWJcIil7cmV0dXJuIEtFWVVUSUwuZ2V0S2V5RnJvbVB1YmxpY1BLQ1M4SGV4KGYpfWlmKGYuaW5kZXhPZihcIi1FTkQgUFVCTElDIEtFWS1cIikhPS0xKXtyZXR1cm4gS0VZVVRJTC5nZXRLZXlGcm9tUHVibGljUEtDUzhQRU0oZil9aWYoaD09PVwicGtjczVwcnZcIil7dmFyIHc9bmV3IFJTQUtleSgpO3cucmVhZFByaXZhdGVLZXlGcm9tQVNOMUhleFN0cmluZyhmKTtyZXR1cm4gd31pZihoPT09XCJwa2NzNXBydlwiKXt2YXIgdz1uZXcgUlNBS2V5KCk7dy5yZWFkUHJpdmF0ZUtleUZyb21BU04xSGV4U3RyaW5nKGYpO3JldHVybiB3fWlmKGYuaW5kZXhPZihcIi1FTkQgUlNBIFBSSVZBVEUgS0VZLVwiKSE9LTEmJmYuaW5kZXhPZihcIjQsRU5DUllQVEVEXCIpPT0tMSl7dmFyIGk9S0VZVVRJTC5nZXRIZXhGcm9tUEVNKGYsXCJSU0EgUFJJVkFURSBLRVlcIik7cmV0dXJuIEtFWVVUSUwuZ2V0S2V5KGksbnVsbCxcInBrY3M1cHJ2XCIpfWlmKGYuaW5kZXhPZihcIi1FTkQgRFNBIFBSSVZBVEUgS0VZLVwiKSE9LTEmJmYuaW5kZXhPZihcIjQsRU5DUllQVEVEXCIpPT0tMSl7dmFyIHU9dGhpcy5nZXRIZXhGcm9tUEVNKGYsXCJEU0EgUFJJVkFURSBLRVlcIik7dmFyIHQ9QVNOMUhFWC5nZXRWYnlMaXN0KHUsMCxbMV0sXCIwMlwiKTt2YXIgcz1BU04xSEVYLmdldFZieUxpc3QodSwwLFsyXSxcIjAyXCIpO3ZhciB2PUFTTjFIRVguZ2V0VmJ5TGlzdCh1LDAsWzNdLFwiMDJcIik7dmFyIGo9QVNOMUhFWC5nZXRWYnlMaXN0KHUsMCxbNF0sXCIwMlwiKTt2YXIgaz1BU04xSEVYLmdldFZieUxpc3QodSwwLFs1XSxcIjAyXCIpO3ZhciB3PW5ldyBLSlVSLmNyeXB0by5EU0EoKTt3LnNldFByaXZhdGUobmV3IEJpZ0ludGVnZXIodCwxNiksbmV3IEJpZ0ludGVnZXIocywxNiksbmV3IEJpZ0ludGVnZXIodiwxNiksbmV3IEJpZ0ludGVnZXIoaiwxNiksbmV3IEJpZ0ludGVnZXIoaywxNikpO3JldHVybiB3fWlmKGYuaW5kZXhPZihcIi1FTkQgUFJJVkFURSBLRVktXCIpIT0tMSl7cmV0dXJuIEtFWVVUSUwuZ2V0S2V5RnJvbVBsYWluUHJpdmF0ZVBLQ1M4UEVNKGYpfWlmKGYuaW5kZXhPZihcIi1FTkQgUlNBIFBSSVZBVEUgS0VZLVwiKSE9LTEmJmYuaW5kZXhPZihcIjQsRU5DUllQVEVEXCIpIT0tMSl7cmV0dXJuIEtFWVVUSUwuZ2V0UlNBS2V5RnJvbUVuY3J5cHRlZFBLQ1M1UEVNKGYsZSl9aWYoZi5pbmRleE9mKFwiLUVORCBFQyBQUklWQVRFIEtFWS1cIikhPS0xJiZmLmluZGV4T2YoXCI0LEVOQ1JZUFRFRFwiKSE9LTEpe3ZhciB1PUtFWVVUSUwuZ2V0RGVjcnlwdGVkS2V5SGV4KGYsZSk7dmFyIHc9QVNOMUhFWC5nZXRWYnlMaXN0KHUsMCxbMV0sXCIwNFwiKTt2YXIgYz1BU04xSEVYLmdldFZieUxpc3QodSwwLFsyLDBdLFwiMDZcIik7dmFyIG89QVNOMUhFWC5nZXRWYnlMaXN0KHUsMCxbMywwXSxcIjAzXCIpLnN1YnN0cigyKTt2YXIgYj1cIlwiO2lmKEtKVVIuY3J5cHRvLk9JRC5vaWRoZXgybmFtZVtjXSE9PXVuZGVmaW5lZCl7Yj1LSlVSLmNyeXB0by5PSUQub2lkaGV4Mm5hbWVbY119ZWxzZXt0aHJvd1widW5kZWZpbmVkIE9JRChoZXgpIGluIEtKVVIuY3J5cHRvLk9JRDogXCIrY312YXIgZD1uZXcgS0pVUi5jcnlwdG8uRUNEU0Eoe25hbWU6Yn0pO2Quc2V0UHVibGljS2V5SGV4KG8pO2Quc2V0UHJpdmF0ZUtleUhleCh3KTtkLmlzUHVibGljPWZhbHNlO3JldHVybiBkfWlmKGYuaW5kZXhPZihcIi1FTkQgRFNBIFBSSVZBVEUgS0VZLVwiKSE9LTEmJmYuaW5kZXhPZihcIjQsRU5DUllQVEVEXCIpIT0tMSl7dmFyIHU9S0VZVVRJTC5nZXREZWNyeXB0ZWRLZXlIZXgoZixlKTt2YXIgdD1BU04xSEVYLmdldFZieUxpc3QodSwwLFsxXSxcIjAyXCIpO3ZhciBzPUFTTjFIRVguZ2V0VmJ5TGlzdCh1LDAsWzJdLFwiMDJcIik7dmFyIHY9QVNOMUhFWC5nZXRWYnlMaXN0KHUsMCxbM10sXCIwMlwiKTt2YXIgaj1BU04xSEVYLmdldFZieUxpc3QodSwwLFs0XSxcIjAyXCIpO3ZhciBrPUFTTjFIRVguZ2V0VmJ5TGlzdCh1LDAsWzVdLFwiMDJcIik7dmFyIHc9bmV3IEtKVVIuY3J5cHRvLkRTQSgpO3cuc2V0UHJpdmF0ZShuZXcgQmlnSW50ZWdlcih0LDE2KSxuZXcgQmlnSW50ZWdlcihzLDE2KSxuZXcgQmlnSW50ZWdlcih2LDE2KSxuZXcgQmlnSW50ZWdlcihqLDE2KSxuZXcgQmlnSW50ZWdlcihrLDE2KSk7cmV0dXJuIHd9aWYoZi5pbmRleE9mKFwiLUVORCBFTkNSWVBURUQgUFJJVkFURSBLRVktXCIpIT0tMSl7cmV0dXJuIEtFWVVUSUwuZ2V0S2V5RnJvbUVuY3J5cHRlZFBLQ1M4UEVNKGYsZSl9dGhyb3dcIm5vdCBzdXBwb3J0ZWQgYXJndW1lbnRcIn07S0VZVVRJTC5nZW5lcmF0ZUtleXBhaXI9ZnVuY3Rpb24oYSxjKXtpZihhPT1cIlJTQVwiKXt2YXIgYj1jO3ZhciBoPW5ldyBSU0FLZXkoKTtoLmdlbmVyYXRlKGIsXCIxMDAwMVwiKTtoLmlzUHJpdmF0ZT10cnVlO2guaXNQdWJsaWM9dHJ1ZTt2YXIgZj1uZXcgUlNBS2V5KCk7dmFyIGU9aC5uLnRvU3RyaW5nKDE2KTt2YXIgaT1oLmUudG9TdHJpbmcoMTYpO2Yuc2V0UHVibGljKGUsaSk7Zi5pc1ByaXZhdGU9ZmFsc2U7Zi5pc1B1YmxpYz10cnVlO3ZhciBrPXt9O2sucHJ2S2V5T2JqPWg7ay5wdWJLZXlPYmo9ZjtyZXR1cm4ga31lbHNle2lmKGE9PVwiRUNcIil7dmFyIGQ9Yzt2YXIgZz1uZXcgS0pVUi5jcnlwdG8uRUNEU0Eoe2N1cnZlOmR9KTt2YXIgaj1nLmdlbmVyYXRlS2V5UGFpckhleCgpO3ZhciBoPW5ldyBLSlVSLmNyeXB0by5FQ0RTQSh7Y3VydmU6ZH0pO2guc2V0UHJpdmF0ZUtleUhleChqLmVjcHJ2aGV4KTtoLmlzUHJpdmF0ZT10cnVlO2guaXNQdWJsaWM9ZmFsc2U7dmFyIGY9bmV3IEtKVVIuY3J5cHRvLkVDRFNBKHtjdXJ2ZTpkfSk7Zi5zZXRQdWJsaWNLZXlIZXgoai5lY3B1YmhleCk7Zi5pc1ByaXZhdGU9ZmFsc2U7Zi5pc1B1YmxpYz10cnVlO3ZhciBrPXt9O2sucHJ2S2V5T2JqPWg7ay5wdWJLZXlPYmo9ZjtyZXR1cm4ga31lbHNle3Rocm93XCJ1bmtub3duIGFsZ29yaXRobTogXCIrYX19fTtLRVlVVElMLmdldFBFTT1mdW5jdGlvbihhLHIsbyxnLGope3ZhciB2PUtKVVIuYXNuMTt2YXIgdT1LSlVSLmNyeXB0bztmdW5jdGlvbiBwKHMpe3ZhciB3PUtKVVIuYXNuMS5BU04xVXRpbC5uZXdPYmplY3Qoe3NlcTpbe1wiaW50XCI6MH0se1wiaW50XCI6e2JpZ2ludDpzLm59fSx7XCJpbnRcIjpzLmV9LHtcImludFwiOntiaWdpbnQ6cy5kfX0se1wiaW50XCI6e2JpZ2ludDpzLnB9fSx7XCJpbnRcIjp7YmlnaW50OnMucX19LHtcImludFwiOntiaWdpbnQ6cy5kbXAxfX0se1wiaW50XCI6e2JpZ2ludDpzLmRtcTF9fSx7XCJpbnRcIjp7YmlnaW50OnMuY29lZmZ9fV19KTtyZXR1cm4gd31mdW5jdGlvbiBxKHcpe3ZhciBzPUtKVVIuYXNuMS5BU04xVXRpbC5uZXdPYmplY3Qoe3NlcTpbe1wiaW50XCI6MX0se29jdHN0cjp7aGV4OncucHJ2S2V5SGV4fX0se3RhZzpbXCJhMFwiLHRydWUse29pZDp7bmFtZTp3LmN1cnZlTmFtZX19XX0se3RhZzpbXCJhMVwiLHRydWUse2JpdHN0cjp7aGV4OlwiMDBcIit3LnB1YktleUhleH19XX1dfSk7cmV0dXJuIHN9ZnVuY3Rpb24gbihzKXt2YXIgdz1LSlVSLmFzbjEuQVNOMVV0aWwubmV3T2JqZWN0KHtzZXE6W3tcImludFwiOjB9LHtcImludFwiOntiaWdpbnQ6cy5wfX0se1wiaW50XCI6e2JpZ2ludDpzLnF9fSx7XCJpbnRcIjp7YmlnaW50OnMuZ319LHtcImludFwiOntiaWdpbnQ6cy55fX0se1wiaW50XCI6e2JpZ2ludDpzLnh9fV19KTtyZXR1cm4gd31pZigoKHR5cGVvZiBSU0FLZXkhPVwidW5kZWZpbmVkXCImJmEgaW5zdGFuY2VvZiBSU0FLZXkpfHwodHlwZW9mIHUuRFNBIT1cInVuZGVmaW5lZFwiJiZhIGluc3RhbmNlb2YgdS5EU0EpfHwodHlwZW9mIHUuRUNEU0EhPVwidW5kZWZpbmVkXCImJmEgaW5zdGFuY2VvZiB1LkVDRFNBKSkmJmEuaXNQdWJsaWM9PXRydWUmJihyPT09dW5kZWZpbmVkfHxyPT1cIlBLQ1M4UFVCXCIpKXt2YXIgdD1uZXcgS0pVUi5hc24xLng1MDkuU3ViamVjdFB1YmxpY0tleUluZm8oYSk7dmFyIG09dC5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHYuQVNOMVV0aWwuZ2V0UEVNU3RyaW5nRnJvbUhleChtLFwiUFVCTElDIEtFWVwiKX1pZihyPT1cIlBLQ1MxUFJWXCImJnR5cGVvZiBSU0FLZXkhPVwidW5kZWZpbmVkXCImJmEgaW5zdGFuY2VvZiBSU0FLZXkmJihvPT09dW5kZWZpbmVkfHxvPT1udWxsKSYmYS5pc1ByaXZhdGU9PXRydWUpe3ZhciB0PXAoYSk7dmFyIG09dC5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHYuQVNOMVV0aWwuZ2V0UEVNU3RyaW5nRnJvbUhleChtLFwiUlNBIFBSSVZBVEUgS0VZXCIpfWlmKHI9PVwiUEtDUzFQUlZcIiYmdHlwZW9mIFJTQUtleSE9XCJ1bmRlZmluZWRcIiYmYSBpbnN0YW5jZW9mIEtKVVIuY3J5cHRvLkVDRFNBJiYobz09PXVuZGVmaW5lZHx8bz09bnVsbCkmJmEuaXNQcml2YXRlPT10cnVlKXt2YXIgZj1uZXcgS0pVUi5hc24xLkRFUk9iamVjdElkZW50aWZpZXIoe25hbWU6YS5jdXJ2ZU5hbWV9KTt2YXIgbD1mLmdldEVuY29kZWRIZXgoKTt2YXIgZT1xKGEpO3ZhciBrPWUuZ2V0RW5jb2RlZEhleCgpO3ZhciBpPVwiXCI7aSs9di5BU04xVXRpbC5nZXRQRU1TdHJpbmdGcm9tSGV4KGwsXCJFQyBQQVJBTUVURVJTXCIpO2krPXYuQVNOMVV0aWwuZ2V0UEVNU3RyaW5nRnJvbUhleChrLFwiRUMgUFJJVkFURSBLRVlcIik7cmV0dXJuIGl9aWYocj09XCJQS0NTMVBSVlwiJiZ0eXBlb2YgS0pVUi5jcnlwdG8uRFNBIT1cInVuZGVmaW5lZFwiJiZhIGluc3RhbmNlb2YgS0pVUi5jcnlwdG8uRFNBJiYobz09PXVuZGVmaW5lZHx8bz09bnVsbCkmJmEuaXNQcml2YXRlPT10cnVlKXt2YXIgdD1uKGEpO3ZhciBtPXQuZ2V0RW5jb2RlZEhleCgpO3JldHVybiB2LkFTTjFVdGlsLmdldFBFTVN0cmluZ0Zyb21IZXgobSxcIkRTQSBQUklWQVRFIEtFWVwiKX1pZihyPT1cIlBLQ1M1UFJWXCImJnR5cGVvZiBSU0FLZXkhPVwidW5kZWZpbmVkXCImJmEgaW5zdGFuY2VvZiBSU0FLZXkmJihvIT09dW5kZWZpbmVkJiZvIT1udWxsKSYmYS5pc1ByaXZhdGU9PXRydWUpe3ZhciB0PXAoYSk7dmFyIG09dC5nZXRFbmNvZGVkSGV4KCk7aWYoZz09PXVuZGVmaW5lZCl7Zz1cIkRFUy1FREUzLUNCQ1wifXJldHVybiB0aGlzLmdldEVuY3J5cHRlZFBLQ1M1UEVNRnJvbVBydktleUhleChcIlJTQVwiLG0sbyxnKX1pZihyPT1cIlBLQ1M1UFJWXCImJnR5cGVvZiBLSlVSLmNyeXB0by5FQ0RTQSE9XCJ1bmRlZmluZWRcIiYmYSBpbnN0YW5jZW9mIEtKVVIuY3J5cHRvLkVDRFNBJiYobyE9PXVuZGVmaW5lZCYmbyE9bnVsbCkmJmEuaXNQcml2YXRlPT10cnVlKXt2YXIgdD1xKGEpO3ZhciBtPXQuZ2V0RW5jb2RlZEhleCgpO2lmKGc9PT11bmRlZmluZWQpe2c9XCJERVMtRURFMy1DQkNcIn1yZXR1cm4gdGhpcy5nZXRFbmNyeXB0ZWRQS0NTNVBFTUZyb21QcnZLZXlIZXgoXCJFQ1wiLG0sbyxnKX1pZihyPT1cIlBLQ1M1UFJWXCImJnR5cGVvZiBLSlVSLmNyeXB0by5EU0EhPVwidW5kZWZpbmVkXCImJmEgaW5zdGFuY2VvZiBLSlVSLmNyeXB0by5EU0EmJihvIT09dW5kZWZpbmVkJiZvIT1udWxsKSYmYS5pc1ByaXZhdGU9PXRydWUpe3ZhciB0PW4oYSk7dmFyIG09dC5nZXRFbmNvZGVkSGV4KCk7aWYoZz09PXVuZGVmaW5lZCl7Zz1cIkRFUy1FREUzLUNCQ1wifXJldHVybiB0aGlzLmdldEVuY3J5cHRlZFBLQ1M1UEVNRnJvbVBydktleUhleChcIkRTQVwiLG0sbyxnKX12YXIgaD1mdW5jdGlvbih3LHMpe3ZhciB5PWIodyxzKTt2YXIgeD1uZXcgS0pVUi5hc24xLkFTTjFVdGlsLm5ld09iamVjdCh7c2VxOlt7c2VxOlt7b2lkOntuYW1lOlwicGtjczVQQkVTMlwifX0se3NlcTpbe3NlcTpbe29pZDp7bmFtZTpcInBrY3M1UEJLREYyXCJ9fSx7c2VxOlt7b2N0c3RyOntoZXg6eS5wYmtkZjJTYWx0fX0se1wiaW50XCI6eS5wYmtkZjJJdGVyfV19XX0se3NlcTpbe29pZDp7bmFtZTpcImRlcy1FREUzLUNCQ1wifX0se29jdHN0cjp7aGV4OnkuZW5jcnlwdGlvblNjaGVtZUlWfX1dfV19XX0se29jdHN0cjp7aGV4OnkuY2lwaGVydGV4dH19XX0pO3JldHVybiB4LmdldEVuY29kZWRIZXgoKX07dmFyIGI9ZnVuY3Rpb24oRCxFKXt2YXIgeD0xMDA7dmFyIEM9Q3J5cHRvSlMubGliLldvcmRBcnJheS5yYW5kb20oOCk7dmFyIEI9XCJERVMtRURFMy1DQkNcIjt2YXIgcz1DcnlwdG9KUy5saWIuV29yZEFycmF5LnJhbmRvbSg4KTt2YXIgeT1DcnlwdG9KUy5QQktERjIoRSxDLHtrZXlTaXplOjE5Mi8zMixpdGVyYXRpb25zOnh9KTt2YXIgej1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKEQpO3ZhciBBPUNyeXB0b0pTLlRyaXBsZURFUy5lbmNyeXB0KHoseSx7aXY6c30pK1wiXCI7dmFyIHc9e307dy5jaXBoZXJ0ZXh0PUE7dy5wYmtkZjJTYWx0PUNyeXB0b0pTLmVuYy5IZXguc3RyaW5naWZ5KEMpO3cucGJrZGYySXRlcj14O3cuZW5jcnlwdGlvblNjaGVtZUFsZz1CO3cuZW5jcnlwdGlvblNjaGVtZUlWPUNyeXB0b0pTLmVuYy5IZXguc3RyaW5naWZ5KHMpO3JldHVybiB3fTtpZihyPT1cIlBLQ1M4UFJWXCImJnR5cGVvZiBSU0FLZXkhPVwidW5kZWZpbmVkXCImJmEgaW5zdGFuY2VvZiBSU0FLZXkmJmEuaXNQcml2YXRlPT10cnVlKXt2YXIgZD1wKGEpO3ZhciBjPWQuZ2V0RW5jb2RlZEhleCgpO3ZhciB0PUtKVVIuYXNuMS5BU04xVXRpbC5uZXdPYmplY3Qoe3NlcTpbe1wiaW50XCI6MH0se3NlcTpbe29pZDp7bmFtZTpcInJzYUVuY3J5cHRpb25cIn19LHtcIm51bGxcIjp0cnVlfV19LHtvY3RzdHI6e2hleDpjfX1dfSk7dmFyIG09dC5nZXRFbmNvZGVkSGV4KCk7aWYobz09PXVuZGVmaW5lZHx8bz09bnVsbCl7cmV0dXJuIHYuQVNOMVV0aWwuZ2V0UEVNU3RyaW5nRnJvbUhleChtLFwiUFJJVkFURSBLRVlcIil9ZWxzZXt2YXIgaz1oKG0sbyk7cmV0dXJuIHYuQVNOMVV0aWwuZ2V0UEVNU3RyaW5nRnJvbUhleChrLFwiRU5DUllQVEVEIFBSSVZBVEUgS0VZXCIpfX1pZihyPT1cIlBLQ1M4UFJWXCImJnR5cGVvZiBLSlVSLmNyeXB0by5FQ0RTQSE9XCJ1bmRlZmluZWRcIiYmYSBpbnN0YW5jZW9mIEtKVVIuY3J5cHRvLkVDRFNBJiZhLmlzUHJpdmF0ZT09dHJ1ZSl7dmFyIGQ9bmV3IEtKVVIuYXNuMS5BU04xVXRpbC5uZXdPYmplY3Qoe3NlcTpbe1wiaW50XCI6MX0se29jdHN0cjp7aGV4OmEucHJ2S2V5SGV4fX0se3RhZzpbXCJhMVwiLHRydWUse2JpdHN0cjp7aGV4OlwiMDBcIithLnB1YktleUhleH19XX1dfSk7dmFyIGM9ZC5nZXRFbmNvZGVkSGV4KCk7dmFyIHQ9S0pVUi5hc24xLkFTTjFVdGlsLm5ld09iamVjdCh7c2VxOlt7XCJpbnRcIjowfSx7c2VxOlt7b2lkOntuYW1lOlwiZWNQdWJsaWNLZXlcIn19LHtvaWQ6e25hbWU6YS5jdXJ2ZU5hbWV9fV19LHtvY3RzdHI6e2hleDpjfX1dfSk7dmFyIG09dC5nZXRFbmNvZGVkSGV4KCk7aWYobz09PXVuZGVmaW5lZHx8bz09bnVsbCl7cmV0dXJuIHYuQVNOMVV0aWwuZ2V0UEVNU3RyaW5nRnJvbUhleChtLFwiUFJJVkFURSBLRVlcIil9ZWxzZXt2YXIgaz1oKG0sbyk7cmV0dXJuIHYuQVNOMVV0aWwuZ2V0UEVNU3RyaW5nRnJvbUhleChrLFwiRU5DUllQVEVEIFBSSVZBVEUgS0VZXCIpfX1pZihyPT1cIlBLQ1M4UFJWXCImJnR5cGVvZiBLSlVSLmNyeXB0by5EU0EhPVwidW5kZWZpbmVkXCImJmEgaW5zdGFuY2VvZiBLSlVSLmNyeXB0by5EU0EmJmEuaXNQcml2YXRlPT10cnVlKXt2YXIgZD1uZXcgS0pVUi5hc24xLkRFUkludGVnZXIoe2JpZ2ludDphLnh9KTt2YXIgYz1kLmdldEVuY29kZWRIZXgoKTt2YXIgdD1LSlVSLmFzbjEuQVNOMVV0aWwubmV3T2JqZWN0KHtzZXE6W3tcImludFwiOjB9LHtzZXE6W3tvaWQ6e25hbWU6XCJkc2FcIn19LHtzZXE6W3tcImludFwiOntiaWdpbnQ6YS5wfX0se1wiaW50XCI6e2JpZ2ludDphLnF9fSx7XCJpbnRcIjp7YmlnaW50OmEuZ319XX1dfSx7b2N0c3RyOntoZXg6Y319XX0pO3ZhciBtPXQuZ2V0RW5jb2RlZEhleCgpO2lmKG89PT11bmRlZmluZWR8fG89PW51bGwpe3JldHVybiB2LkFTTjFVdGlsLmdldFBFTVN0cmluZ0Zyb21IZXgobSxcIlBSSVZBVEUgS0VZXCIpfWVsc2V7dmFyIGs9aChtLG8pO3JldHVybiB2LkFTTjFVdGlsLmdldFBFTVN0cmluZ0Zyb21IZXgoayxcIkVOQ1JZUFRFRCBQUklWQVRFIEtFWVwiKX19dGhyb3dcInVuc3VwcG9ydGVkIG9iamVjdCBub3IgZm9ybWF0XCJ9O0tFWVVUSUwuZ2V0S2V5RnJvbUNTUlBFTT1mdW5jdGlvbihiKXt2YXIgYT1LRVlVVElMLmdldEhleEZyb21QRU0oYixcIkNFUlRJRklDQVRFIFJFUVVFU1RcIik7dmFyIGM9S0VZVVRJTC5nZXRLZXlGcm9tQ1NSSGV4KGEpO3JldHVybiBjfTtLRVlVVElMLmdldEtleUZyb21DU1JIZXg9ZnVuY3Rpb24oYSl7dmFyIGM9S0VZVVRJTC5wYXJzZUNTUkhleChhKTt2YXIgYj1LRVlVVElMLmdldEtleShjLnA4cHVia2V5aGV4LG51bGwsXCJwa2NzOHB1YlwiKTtyZXR1cm4gYn07S0VZVVRJTC5wYXJzZUNTUkhleD1mdW5jdGlvbihjKXt2YXIgYj17fTt2YXIgZT1jO2lmKGUuc3Vic3RyKDAsMikhPVwiMzBcIil7dGhyb3dcIm1hbGZvcm1lZCBDU1IoY29kZTowMDEpXCJ9dmFyIGQ9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooZSwwKTtpZihkLmxlbmd0aDwxKXt0aHJvd1wibWFsZm9ybWVkIENTUihjb2RlOjAwMilcIn1pZihlLnN1YnN0cihkWzBdLDIpIT1cIjMwXCIpe3Rocm93XCJtYWxmb3JtZWQgQ1NSKGNvZGU6MDAzKVwifXZhciBhPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGUsZFswXSk7aWYoYS5sZW5ndGg8Myl7dGhyb3dcIm1hbGZvcm1lZCBDU1IoY29kZTowMDQpXCJ9Yi5wOHB1YmtleWhleD1BU04xSEVYLmdldEhleE9mVExWX0F0T2JqKGUsYVsyXSk7cmV0dXJuIGJ9O1xuLyohIHJzYXBlbS0xLjEuanMgKGMpIDIwMTIgS2VuamkgVXJ1c2hpbWEgfCBranVyLmdpdGh1Yi5jb20vanNyc2FzaWduL2xpY2Vuc2VcbiAqL1xuZnVuY3Rpb24gX3JzYXBlbV9wZW1Ub0Jhc2U2NChiKXt2YXIgYT1iO2E9YS5yZXBsYWNlKFwiLS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLVwiLFwiXCIpO2E9YS5yZXBsYWNlKFwiLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS1cIixcIlwiKTthPWEucmVwbGFjZSgvWyBcXG5dKy9nLFwiXCIpO3JldHVybiBhfWZ1bmN0aW9uIF9yc2FwZW1fZ2V0UG9zQXJyYXlPZkNoaWxkcmVuRnJvbUhleChkKXt2YXIgaj1uZXcgQXJyYXkoKTt2YXIgaz1BU04xSEVYLmdldFN0YXJ0UG9zT2ZWX0F0T2JqKGQsMCk7dmFyIGY9QVNOMUhFWC5nZXRQb3NPZk5leHRTaWJsaW5nX0F0T2JqKGQsayk7dmFyIGg9QVNOMUhFWC5nZXRQb3NPZk5leHRTaWJsaW5nX0F0T2JqKGQsZik7dmFyIGI9QVNOMUhFWC5nZXRQb3NPZk5leHRTaWJsaW5nX0F0T2JqKGQsaCk7dmFyIGw9QVNOMUhFWC5nZXRQb3NPZk5leHRTaWJsaW5nX0F0T2JqKGQsYik7dmFyIGU9QVNOMUhFWC5nZXRQb3NPZk5leHRTaWJsaW5nX0F0T2JqKGQsbCk7dmFyIGc9QVNOMUhFWC5nZXRQb3NPZk5leHRTaWJsaW5nX0F0T2JqKGQsZSk7dmFyIGM9QVNOMUhFWC5nZXRQb3NPZk5leHRTaWJsaW5nX0F0T2JqKGQsZyk7dmFyIGk9QVNOMUhFWC5nZXRQb3NPZk5leHRTaWJsaW5nX0F0T2JqKGQsYyk7ai5wdXNoKGssZixoLGIsbCxlLGcsYyxpKTtyZXR1cm4gan1mdW5jdGlvbiBfcnNhcGVtX2dldEhleFZhbHVlQXJyYXlPZkNoaWxkcmVuRnJvbUhleChpKXt2YXIgbz1fcnNhcGVtX2dldFBvc0FycmF5T2ZDaGlsZHJlbkZyb21IZXgoaSk7dmFyIHI9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooaSxvWzBdKTt2YXIgZj1BU04xSEVYLmdldEhleE9mVl9BdE9iaihpLG9bMV0pO3ZhciBqPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGksb1syXSk7dmFyIGs9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooaSxvWzNdKTt2YXIgYz1BU04xSEVYLmdldEhleE9mVl9BdE9iaihpLG9bNF0pO3ZhciBiPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGksb1s1XSk7dmFyIGg9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooaSxvWzZdKTt2YXIgZz1BU04xSEVYLmdldEhleE9mVl9BdE9iaihpLG9bN10pO3ZhciBsPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGksb1s4XSk7dmFyIG09bmV3IEFycmF5KCk7bS5wdXNoKHIsZixqLGssYyxiLGgsZyxsKTtyZXR1cm4gbX1mdW5jdGlvbiBfcnNhcGVtX3JlYWRQcml2YXRlS2V5RnJvbUFTTjFIZXhTdHJpbmcoYyl7dmFyIGI9X3JzYXBlbV9nZXRIZXhWYWx1ZUFycmF5T2ZDaGlsZHJlbkZyb21IZXgoYyk7dGhpcy5zZXRQcml2YXRlRXgoYlsxXSxiWzJdLGJbM10sYls0XSxiWzVdLGJbNl0sYls3XSxiWzhdKX1mdW5jdGlvbiBfcnNhcGVtX3JlYWRQcml2YXRlS2V5RnJvbVBFTVN0cmluZyhlKXt2YXIgYz1fcnNhcGVtX3BlbVRvQmFzZTY0KGUpO3ZhciBkPWI2NHRvaGV4KGMpO3ZhciBiPV9yc2FwZW1fZ2V0SGV4VmFsdWVBcnJheU9mQ2hpbGRyZW5Gcm9tSGV4KGQpO3RoaXMuc2V0UHJpdmF0ZUV4KGJbMV0sYlsyXSxiWzNdLGJbNF0sYls1XSxiWzZdLGJbN10sYls4XSl9UlNBS2V5LnByb3RvdHlwZS5yZWFkUHJpdmF0ZUtleUZyb21QRU1TdHJpbmc9X3JzYXBlbV9yZWFkUHJpdmF0ZUtleUZyb21QRU1TdHJpbmc7UlNBS2V5LnByb3RvdHlwZS5yZWFkUHJpdmF0ZUtleUZyb21BU04xSGV4U3RyaW5nPV9yc2FwZW1fcmVhZFByaXZhdGVLZXlGcm9tQVNOMUhleFN0cmluZztcbi8qISByc2FzaWduLTEuMi43LmpzIChjKSAyMDEyIEtlbmppIFVydXNoaW1hIHwga2p1ci5naXRodWIuY29tL2pzcnNhc2lnbi9saWNlbnNlXG4gKi9cbnZhciBfUkVfSEVYREVDT05MWT1uZXcgUmVnRXhwKFwiXCIpO19SRV9IRVhERUNPTkxZLmNvbXBpbGUoXCJbXjAtOWEtZl1cIixcImdpXCIpO2Z1bmN0aW9uIF9yc2FzaWduX2dldEhleFBhZGRlZERpZ2VzdEluZm9Gb3JTdHJpbmcoZCxlLGEpe3ZhciBiPWZ1bmN0aW9uKGYpe3JldHVybiBLSlVSLmNyeXB0by5VdGlsLmhhc2hTdHJpbmcoZixhKX07dmFyIGM9YihkKTtyZXR1cm4gS0pVUi5jcnlwdG8uVXRpbC5nZXRQYWRkZWREaWdlc3RJbmZvSGV4KGMsYSxlKX1mdW5jdGlvbiBfemVyb1BhZGRpbmdPZlNpZ25hdHVyZShlLGQpe3ZhciBjPVwiXCI7dmFyIGE9ZC80LWUubGVuZ3RoO2Zvcih2YXIgYj0wO2I8YTtiKyspe2M9YytcIjBcIn1yZXR1cm4gYytlfWZ1bmN0aW9uIF9yc2FzaWduX3NpZ25TdHJpbmcoZCxhKXt2YXIgYj1mdW5jdGlvbihlKXtyZXR1cm4gS0pVUi5jcnlwdG8uVXRpbC5oYXNoU3RyaW5nKGUsYSl9O3ZhciBjPWIoZCk7cmV0dXJuIHRoaXMuc2lnbldpdGhNZXNzYWdlSGFzaChjLGEpfWZ1bmN0aW9uIF9yc2FzaWduX3NpZ25XaXRoTWVzc2FnZUhhc2goZSxjKXt2YXIgZj1LSlVSLmNyeXB0by5VdGlsLmdldFBhZGRlZERpZ2VzdEluZm9IZXgoZSxjLHRoaXMubi5iaXRMZW5ndGgoKSk7dmFyIGI9cGFyc2VCaWdJbnQoZiwxNik7dmFyIGQ9dGhpcy5kb1ByaXZhdGUoYik7dmFyIGE9ZC50b1N0cmluZygxNik7cmV0dXJuIF96ZXJvUGFkZGluZ09mU2lnbmF0dXJlKGEsdGhpcy5uLmJpdExlbmd0aCgpKX1mdW5jdGlvbiBfcnNhc2lnbl9zaWduU3RyaW5nV2l0aFNIQTEoYSl7cmV0dXJuIF9yc2FzaWduX3NpZ25TdHJpbmcuY2FsbCh0aGlzLGEsXCJzaGExXCIpfWZ1bmN0aW9uIF9yc2FzaWduX3NpZ25TdHJpbmdXaXRoU0hBMjU2KGEpe3JldHVybiBfcnNhc2lnbl9zaWduU3RyaW5nLmNhbGwodGhpcyxhLFwic2hhMjU2XCIpfWZ1bmN0aW9uIHBzc19tZ2YxX3N0cihjLGEsZSl7dmFyIGI9XCJcIixkPTA7d2hpbGUoYi5sZW5ndGg8YSl7Yis9aGV4dG9yc3RyKGUocnN0cnRvaGV4KGMrU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsWyhkJjQyNzgxOTAwODApPj4yNCwoZCYxNjcxMTY4MCk+PjE2LChkJjY1MjgwKT4+OCxkJjI1NV0pKSkpO2QrPTF9cmV0dXJuIGJ9ZnVuY3Rpb24gX3JzYXNpZ25fc2lnblN0cmluZ1BTUyhlLGEsZCl7dmFyIGM9ZnVuY3Rpb24oZil7cmV0dXJuIEtKVVIuY3J5cHRvLlV0aWwuaGFzaEhleChmLGEpfTt2YXIgYj1jKHJzdHJ0b2hleChlKSk7aWYoZD09PXVuZGVmaW5lZCl7ZD0tMX1yZXR1cm4gdGhpcy5zaWduV2l0aE1lc3NhZ2VIYXNoUFNTKGIsYSxkKX1mdW5jdGlvbiBfcnNhc2lnbl9zaWduV2l0aE1lc3NhZ2VIYXNoUFNTKGwsYSxrKXt2YXIgYj1oZXh0b3JzdHIobCk7dmFyIGc9Yi5sZW5ndGg7dmFyIG09dGhpcy5uLmJpdExlbmd0aCgpLTE7dmFyIGM9TWF0aC5jZWlsKG0vOCk7dmFyIGQ7dmFyIG89ZnVuY3Rpb24oaSl7cmV0dXJuIEtKVVIuY3J5cHRvLlV0aWwuaGFzaEhleChpLGEpfTtpZihrPT09LTF8fGs9PT11bmRlZmluZWQpe2s9Z31lbHNle2lmKGs9PT0tMil7az1jLWctMn1lbHNle2lmKGs8LTIpe3Rocm93XCJpbnZhbGlkIHNhbHQgbGVuZ3RoXCJ9fX1pZihjPChnK2srMikpe3Rocm93XCJkYXRhIHRvbyBsb25nXCJ9dmFyIGY9XCJcIjtpZihrPjApe2Y9bmV3IEFycmF5KGspO25ldyBTZWN1cmVSYW5kb20oKS5uZXh0Qnl0ZXMoZik7Zj1TdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxmKX12YXIgbj1oZXh0b3JzdHIobyhyc3RydG9oZXgoXCJcXHgwMFxceDAwXFx4MDBcXHgwMFxceDAwXFx4MDBcXHgwMFxceDAwXCIrYitmKSkpO3ZhciBqPVtdO2ZvcihkPTA7ZDxjLWstZy0yO2QrPTEpe2pbZF09MH12YXIgZT1TdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxqKStcIlxceDAxXCIrZjt2YXIgaD1wc3NfbWdmMV9zdHIobixlLmxlbmd0aCxvKTt2YXIgcT1bXTtmb3IoZD0wO2Q8ZS5sZW5ndGg7ZCs9MSl7cVtkXT1lLmNoYXJDb2RlQXQoZCleaC5jaGFyQ29kZUF0KGQpfXZhciBwPSg2NTI4MD4+KDgqYy1tKSkmMjU1O3FbMF0mPX5wO2ZvcihkPTA7ZDxnO2QrKyl7cS5wdXNoKG4uY2hhckNvZGVBdChkKSl9cS5wdXNoKDE4OCk7cmV0dXJuIF96ZXJvUGFkZGluZ09mU2lnbmF0dXJlKHRoaXMuZG9Qcml2YXRlKG5ldyBCaWdJbnRlZ2VyKHEpKS50b1N0cmluZygxNiksdGhpcy5uLmJpdExlbmd0aCgpKX1mdW5jdGlvbiBfcnNhc2lnbl9nZXREZWNyeXB0U2lnbmF0dXJlQkkoYSxkLGMpe3ZhciBiPW5ldyBSU0FLZXkoKTtiLnNldFB1YmxpYyhkLGMpO3ZhciBlPWIuZG9QdWJsaWMoYSk7cmV0dXJuIGV9ZnVuY3Rpb24gX3JzYXNpZ25fZ2V0SGV4RGlnZXN0SW5mb0Zyb21TaWcoYSxjLGIpe3ZhciBlPV9yc2FzaWduX2dldERlY3J5cHRTaWduYXR1cmVCSShhLGMsYik7dmFyIGQ9ZS50b1N0cmluZygxNikucmVwbGFjZSgvXjFmKzAwLyxcIlwiKTtyZXR1cm4gZH1mdW5jdGlvbiBfcnNhc2lnbl9nZXRBbGdOYW1lQW5kSGFzaEZyb21IZXhEaXNnZXN0SW5mbyhmKXtmb3IodmFyIGUgaW4gS0pVUi5jcnlwdG8uVXRpbC5ESUdFU1RJTkZPSEVBRCl7dmFyIGQ9S0pVUi5jcnlwdG8uVXRpbC5ESUdFU1RJTkZPSEVBRFtlXTt2YXIgYj1kLmxlbmd0aDtpZihmLnN1YnN0cmluZygwLGIpPT1kKXt2YXIgYz1bZSxmLnN1YnN0cmluZyhiKV07cmV0dXJuIGN9fXJldHVybltdfWZ1bmN0aW9uIF9yc2FzaWduX3ZlcmlmeVNpZ25hdHVyZVdpdGhBcmdzKGYsYixnLGope3ZhciBlPV9yc2FzaWduX2dldEhleERpZ2VzdEluZm9Gcm9tU2lnKGIsZyxqKTt2YXIgaD1fcnNhc2lnbl9nZXRBbGdOYW1lQW5kSGFzaEZyb21IZXhEaXNnZXN0SW5mbyhlKTtpZihoLmxlbmd0aD09MCl7cmV0dXJuIGZhbHNlfXZhciBkPWhbMF07dmFyIGk9aFsxXTt2YXIgYT1mdW5jdGlvbihrKXtyZXR1cm4gS0pVUi5jcnlwdG8uVXRpbC5oYXNoU3RyaW5nKGssZCl9O3ZhciBjPWEoZik7cmV0dXJuKGk9PWMpfWZ1bmN0aW9uIF9yc2FzaWduX3ZlcmlmeUhleFNpZ25hdHVyZUZvck1lc3NhZ2UoYyxiKXt2YXIgZD1wYXJzZUJpZ0ludChjLDE2KTt2YXIgYT1fcnNhc2lnbl92ZXJpZnlTaWduYXR1cmVXaXRoQXJncyhiLGQsdGhpcy5uLnRvU3RyaW5nKDE2KSx0aGlzLmUudG9TdHJpbmcoMTYpKTtyZXR1cm4gYX1mdW5jdGlvbiBfcnNhc2lnbl92ZXJpZnlTdHJpbmcoZixqKXtqPWoucmVwbGFjZShfUkVfSEVYREVDT05MWSxcIlwiKTtqPWoucmVwbGFjZSgvWyBcXG5dKy9nLFwiXCIpO3ZhciBiPXBhcnNlQmlnSW50KGosMTYpO2lmKGIuYml0TGVuZ3RoKCk+dGhpcy5uLmJpdExlbmd0aCgpKXtyZXR1cm4gMH12YXIgaT10aGlzLmRvUHVibGljKGIpO3ZhciBlPWkudG9TdHJpbmcoMTYpLnJlcGxhY2UoL14xZiswMC8sXCJcIik7dmFyIGc9X3JzYXNpZ25fZ2V0QWxnTmFtZUFuZEhhc2hGcm9tSGV4RGlzZ2VzdEluZm8oZSk7aWYoZy5sZW5ndGg9PTApe3JldHVybiBmYWxzZX12YXIgZD1nWzBdO3ZhciBoPWdbMV07dmFyIGE9ZnVuY3Rpb24oayl7cmV0dXJuIEtKVVIuY3J5cHRvLlV0aWwuaGFzaFN0cmluZyhrLGQpfTt2YXIgYz1hKGYpO3JldHVybihoPT1jKX1mdW5jdGlvbiBfcnNhc2lnbl92ZXJpZnlXaXRoTWVzc2FnZUhhc2goZSxhKXthPWEucmVwbGFjZShfUkVfSEVYREVDT05MWSxcIlwiKTthPWEucmVwbGFjZSgvWyBcXG5dKy9nLFwiXCIpO3ZhciBiPXBhcnNlQmlnSW50KGEsMTYpO2lmKGIuYml0TGVuZ3RoKCk+dGhpcy5uLmJpdExlbmd0aCgpKXtyZXR1cm4gMH12YXIgaD10aGlzLmRvUHVibGljKGIpO3ZhciBnPWgudG9TdHJpbmcoMTYpLnJlcGxhY2UoL14xZiswMC8sXCJcIik7dmFyIGM9X3JzYXNpZ25fZ2V0QWxnTmFtZUFuZEhhc2hGcm9tSGV4RGlzZ2VzdEluZm8oZyk7aWYoYy5sZW5ndGg9PTApe3JldHVybiBmYWxzZX12YXIgZD1jWzBdO3ZhciBmPWNbMV07cmV0dXJuKGY9PWUpfWZ1bmN0aW9uIF9yc2FzaWduX3ZlcmlmeVN0cmluZ1BTUyhjLGIsYSxmKXt2YXIgZT1mdW5jdGlvbihnKXtyZXR1cm4gS0pVUi5jcnlwdG8uVXRpbC5oYXNoSGV4KGcsYSl9O3ZhciBkPWUocnN0cnRvaGV4KGMpKTtpZihmPT09dW5kZWZpbmVkKXtmPS0xfXJldHVybiB0aGlzLnZlcmlmeVdpdGhNZXNzYWdlSGFzaFBTUyhkLGIsYSxmKX1mdW5jdGlvbiBfcnNhc2lnbl92ZXJpZnlXaXRoTWVzc2FnZUhhc2hQU1MoZixzLGwsYyl7dmFyIGs9bmV3IEJpZ0ludGVnZXIocywxNik7aWYoay5iaXRMZW5ndGgoKT50aGlzLm4uYml0TGVuZ3RoKCkpe3JldHVybiBmYWxzZX12YXIgcj1mdW5jdGlvbihpKXtyZXR1cm4gS0pVUi5jcnlwdG8uVXRpbC5oYXNoSGV4KGksbCl9O3ZhciBqPWhleHRvcnN0cihmKTt2YXIgaD1qLmxlbmd0aDt2YXIgZz10aGlzLm4uYml0TGVuZ3RoKCktMTt2YXIgbT1NYXRoLmNlaWwoZy84KTt2YXIgcTtpZihjPT09LTF8fGM9PT11bmRlZmluZWQpe2M9aH1lbHNle2lmKGM9PT0tMil7Yz1tLWgtMn1lbHNle2lmKGM8LTIpe3Rocm93XCJpbnZhbGlkIHNhbHQgbGVuZ3RoXCJ9fX1pZihtPChoK2MrMikpe3Rocm93XCJkYXRhIHRvbyBsb25nXCJ9dmFyIGE9dGhpcy5kb1B1YmxpYyhrKS50b0J5dGVBcnJheSgpO2ZvcihxPTA7cTxhLmxlbmd0aDtxKz0xKXthW3FdJj0yNTV9d2hpbGUoYS5sZW5ndGg8bSl7YS51bnNoaWZ0KDApfWlmKGFbbS0xXSE9PTE4OCl7dGhyb3dcImVuY29kZWQgbWVzc2FnZSBkb2VzIG5vdCBlbmQgaW4gMHhiY1wifWE9U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsYSk7dmFyIGQ9YS5zdWJzdHIoMCxtLWgtMSk7dmFyIGU9YS5zdWJzdHIoZC5sZW5ndGgsaCk7dmFyIHA9KDY1MjgwPj4oOCptLWcpKSYyNTU7aWYoKGQuY2hhckNvZGVBdCgwKSZwKSE9PTApe3Rocm93XCJiaXRzIGJleW9uZCBrZXlzaXplIG5vdCB6ZXJvXCJ9dmFyIG49cHNzX21nZjFfc3RyKGUsZC5sZW5ndGgscik7dmFyIG89W107Zm9yKHE9MDtxPGQubGVuZ3RoO3ErPTEpe29bcV09ZC5jaGFyQ29kZUF0KHEpXm4uY2hhckNvZGVBdChxKX1vWzBdJj1+cDt2YXIgYj1tLWgtYy0yO2ZvcihxPTA7cTxiO3ErPTEpe2lmKG9bcV0hPT0wKXt0aHJvd1wibGVmdG1vc3Qgb2N0ZXRzIG5vdCB6ZXJvXCJ9fWlmKG9bYl0hPT0xKXt0aHJvd1wiMHgwMSBtYXJrZXIgbm90IGZvdW5kXCJ9cmV0dXJuIGU9PT1oZXh0b3JzdHIocihyc3RydG9oZXgoXCJcXHgwMFxceDAwXFx4MDBcXHgwMFxceDAwXFx4MDBcXHgwMFxceDAwXCIraitTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxvLnNsaWNlKC1jKSkpKSl9UlNBS2V5LnByb3RvdHlwZS5zaWduV2l0aE1lc3NhZ2VIYXNoPV9yc2FzaWduX3NpZ25XaXRoTWVzc2FnZUhhc2g7UlNBS2V5LnByb3RvdHlwZS5zaWduU3RyaW5nPV9yc2FzaWduX3NpZ25TdHJpbmc7UlNBS2V5LnByb3RvdHlwZS5zaWduU3RyaW5nV2l0aFNIQTE9X3JzYXNpZ25fc2lnblN0cmluZ1dpdGhTSEExO1JTQUtleS5wcm90b3R5cGUuc2lnblN0cmluZ1dpdGhTSEEyNTY9X3JzYXNpZ25fc2lnblN0cmluZ1dpdGhTSEEyNTY7UlNBS2V5LnByb3RvdHlwZS5zaWduPV9yc2FzaWduX3NpZ25TdHJpbmc7UlNBS2V5LnByb3RvdHlwZS5zaWduV2l0aFNIQTE9X3JzYXNpZ25fc2lnblN0cmluZ1dpdGhTSEExO1JTQUtleS5wcm90b3R5cGUuc2lnbldpdGhTSEEyNTY9X3JzYXNpZ25fc2lnblN0cmluZ1dpdGhTSEEyNTY7UlNBS2V5LnByb3RvdHlwZS5zaWduV2l0aE1lc3NhZ2VIYXNoUFNTPV9yc2FzaWduX3NpZ25XaXRoTWVzc2FnZUhhc2hQU1M7UlNBS2V5LnByb3RvdHlwZS5zaWduU3RyaW5nUFNTPV9yc2FzaWduX3NpZ25TdHJpbmdQU1M7UlNBS2V5LnByb3RvdHlwZS5zaWduUFNTPV9yc2FzaWduX3NpZ25TdHJpbmdQU1M7UlNBS2V5LlNBTFRfTEVOX0hMRU49LTE7UlNBS2V5LlNBTFRfTEVOX01BWD0tMjtSU0FLZXkucHJvdG90eXBlLnZlcmlmeVdpdGhNZXNzYWdlSGFzaD1fcnNhc2lnbl92ZXJpZnlXaXRoTWVzc2FnZUhhc2g7UlNBS2V5LnByb3RvdHlwZS52ZXJpZnlTdHJpbmc9X3JzYXNpZ25fdmVyaWZ5U3RyaW5nO1JTQUtleS5wcm90b3R5cGUudmVyaWZ5SGV4U2lnbmF0dXJlRm9yTWVzc2FnZT1fcnNhc2lnbl92ZXJpZnlIZXhTaWduYXR1cmVGb3JNZXNzYWdlO1JTQUtleS5wcm90b3R5cGUudmVyaWZ5PV9yc2FzaWduX3ZlcmlmeVN0cmluZztSU0FLZXkucHJvdG90eXBlLnZlcmlmeUhleFNpZ25hdHVyZUZvckJ5dGVBcnJheU1lc3NhZ2U9X3JzYXNpZ25fdmVyaWZ5SGV4U2lnbmF0dXJlRm9yTWVzc2FnZTtSU0FLZXkucHJvdG90eXBlLnZlcmlmeVdpdGhNZXNzYWdlSGFzaFBTUz1fcnNhc2lnbl92ZXJpZnlXaXRoTWVzc2FnZUhhc2hQU1M7UlNBS2V5LnByb3RvdHlwZS52ZXJpZnlTdHJpbmdQU1M9X3JzYXNpZ25fdmVyaWZ5U3RyaW5nUFNTO1JTQUtleS5wcm90b3R5cGUudmVyaWZ5UFNTPV9yc2FzaWduX3ZlcmlmeVN0cmluZ1BTUztSU0FLZXkuU0FMVF9MRU5fUkVDT1ZFUj0tMjtcbi8qISB4NTA5LTEuMS42LmpzIChjKSAyMDEyLTIwMTUgS2VuamkgVXJ1c2hpbWEgfCBranVyLmdpdGh1Yi5jb20vanNyc2FzaWduL2xpY2Vuc2VcbiAqL1xuZnVuY3Rpb24gWDUwOSgpe3RoaXMuc3ViamVjdFB1YmxpY0tleVJTQT1udWxsO3RoaXMuc3ViamVjdFB1YmxpY0tleVJTQV9oTj1udWxsO3RoaXMuc3ViamVjdFB1YmxpY0tleVJTQV9oRT1udWxsO3RoaXMuaGV4PW51bGw7dGhpcy5nZXRTZXJpYWxOdW1iZXJIZXg9ZnVuY3Rpb24oKXtyZXR1cm4gQVNOMUhFWC5nZXREZWNlbmRhbnRIZXhWQnlOdGhMaXN0KHRoaXMuaGV4LDAsWzAsMV0pfTt0aGlzLmdldElzc3VlckhleD1mdW5jdGlvbigpe3JldHVybiBBU04xSEVYLmdldERlY2VuZGFudEhleFRMVkJ5TnRoTGlzdCh0aGlzLmhleCwwLFswLDNdKX07dGhpcy5nZXRJc3N1ZXJTdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gWDUwOS5oZXgyZG4oQVNOMUhFWC5nZXREZWNlbmRhbnRIZXhUTFZCeU50aExpc3QodGhpcy5oZXgsMCxbMCwzXSkpfTt0aGlzLmdldFN1YmplY3RIZXg9ZnVuY3Rpb24oKXtyZXR1cm4gQVNOMUhFWC5nZXREZWNlbmRhbnRIZXhUTFZCeU50aExpc3QodGhpcy5oZXgsMCxbMCw1XSl9O3RoaXMuZ2V0U3ViamVjdFN0cmluZz1mdW5jdGlvbigpe3JldHVybiBYNTA5LmhleDJkbihBU04xSEVYLmdldERlY2VuZGFudEhleFRMVkJ5TnRoTGlzdCh0aGlzLmhleCwwLFswLDVdKSl9O3RoaXMuZ2V0Tm90QmVmb3JlPWZ1bmN0aW9uKCl7dmFyIGE9QVNOMUhFWC5nZXREZWNlbmRhbnRIZXhWQnlOdGhMaXN0KHRoaXMuaGV4LDAsWzAsNCwwXSk7YT1hLnJlcGxhY2UoLyguLikvZyxcIiUkMVwiKTthPWRlY29kZVVSSUNvbXBvbmVudChhKTtyZXR1cm4gYX07dGhpcy5nZXROb3RBZnRlcj1mdW5jdGlvbigpe3ZhciBhPUFTTjFIRVguZ2V0RGVjZW5kYW50SGV4VkJ5TnRoTGlzdCh0aGlzLmhleCwwLFswLDQsMV0pO2E9YS5yZXBsYWNlKC8oLi4pL2csXCIlJDFcIik7YT1kZWNvZGVVUklDb21wb25lbnQoYSk7cmV0dXJuIGF9O3RoaXMucmVhZENlcnRQRU09ZnVuY3Rpb24oYyl7dmFyIGU9WDUwOS5wZW1Ub0hleChjKTt2YXIgYj1YNTA5LmdldFB1YmxpY0tleUhleEFycmF5RnJvbUNlcnRIZXgoZSk7dmFyIGQ9bmV3IFJTQUtleSgpO2Quc2V0UHVibGljKGJbMF0sYlsxXSk7dGhpcy5zdWJqZWN0UHVibGljS2V5UlNBPWQ7dGhpcy5zdWJqZWN0UHVibGljS2V5UlNBX2hOPWJbMF07dGhpcy5zdWJqZWN0UHVibGljS2V5UlNBX2hFPWJbMV07dGhpcy5oZXg9ZX07dGhpcy5yZWFkQ2VydFBFTVdpdGhvdXRSU0FJbml0PWZ1bmN0aW9uKGMpe3ZhciBkPVg1MDkucGVtVG9IZXgoYyk7dmFyIGI9WDUwOS5nZXRQdWJsaWNLZXlIZXhBcnJheUZyb21DZXJ0SGV4KGQpO3RoaXMuc3ViamVjdFB1YmxpY0tleVJTQS5zZXRQdWJsaWMoYlswXSxiWzFdKTt0aGlzLnN1YmplY3RQdWJsaWNLZXlSU0FfaE49YlswXTt0aGlzLnN1YmplY3RQdWJsaWNLZXlSU0FfaEU9YlsxXTt0aGlzLmhleD1kfX1YNTA5LnBlbVRvQmFzZTY0PWZ1bmN0aW9uKGEpe3ZhciBiPWE7Yj1iLnJlcGxhY2UoXCItLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS1cIixcIlwiKTtiPWIucmVwbGFjZShcIi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS1cIixcIlwiKTtiPWIucmVwbGFjZSgvWyBcXG5dKy9nLFwiXCIpO3JldHVybiBifTtYNTA5LnBlbVRvSGV4PWZ1bmN0aW9uKGEpe3ZhciBjPVg1MDkucGVtVG9CYXNlNjQoYSk7dmFyIGI9YjY0dG9oZXgoYyk7cmV0dXJuIGJ9O1g1MDkuZ2V0U3ViamVjdFB1YmxpY0tleVBvc0Zyb21DZXJ0SGV4PWZ1bmN0aW9uKGYpe3ZhciBlPVg1MDkuZ2V0U3ViamVjdFB1YmxpY0tleUluZm9Qb3NGcm9tQ2VydEhleChmKTtpZihlPT0tMSl7cmV0dXJuIC0xfXZhciBiPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGYsZSk7aWYoYi5sZW5ndGghPTIpe3JldHVybiAtMX12YXIgZD1iWzFdO2lmKGYuc3Vic3RyaW5nKGQsZCsyKSE9XCIwM1wiKXtyZXR1cm4gLTF9dmFyIGM9QVNOMUhFWC5nZXRTdGFydFBvc09mVl9BdE9iaihmLGQpO2lmKGYuc3Vic3RyaW5nKGMsYysyKSE9XCIwMFwiKXtyZXR1cm4gLTF9cmV0dXJuIGMrMn07WDUwOS5nZXRTdWJqZWN0UHVibGljS2V5SW5mb1Bvc0Zyb21DZXJ0SGV4PWZ1bmN0aW9uKGQpe3ZhciBjPUFTTjFIRVguZ2V0U3RhcnRQb3NPZlZfQXRPYmooZCwwKTt2YXIgYj1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihkLGMpO2lmKGIubGVuZ3RoPDEpe3JldHVybiAtMX1pZihkLnN1YnN0cmluZyhiWzBdLGJbMF0rMTApPT1cImEwMDMwMjAxMDJcIil7aWYoYi5sZW5ndGg8Nil7cmV0dXJuIC0xfXJldHVybiBiWzZdfWVsc2V7aWYoYi5sZW5ndGg8NSl7cmV0dXJuIC0xfXJldHVybiBiWzVdfX07WDUwOS5nZXRQdWJsaWNLZXlIZXhBcnJheUZyb21DZXJ0SGV4PWZ1bmN0aW9uKGYpe3ZhciBlPVg1MDkuZ2V0U3ViamVjdFB1YmxpY0tleVBvc0Zyb21DZXJ0SGV4KGYpO3ZhciBiPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGYsZSk7aWYoYi5sZW5ndGghPTIpe3JldHVybltdfXZhciBkPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGYsYlswXSk7dmFyIGM9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZixiWzFdKTtpZihkIT1udWxsJiZjIT1udWxsKXtyZXR1cm5bZCxjXX1lbHNle3JldHVybltdfX07WDUwOS5nZXRIZXhUYnNDZXJ0aWZpY2F0ZUZyb21DZXJ0PWZ1bmN0aW9uKGIpe3ZhciBhPUFTTjFIRVguZ2V0U3RhcnRQb3NPZlZfQXRPYmooYiwwKTtyZXR1cm4gYX07WDUwOS5nZXRQdWJsaWNLZXlIZXhBcnJheUZyb21DZXJ0UEVNPWZ1bmN0aW9uKGMpe3ZhciBkPVg1MDkucGVtVG9IZXgoYyk7dmFyIGI9WDUwOS5nZXRQdWJsaWNLZXlIZXhBcnJheUZyb21DZXJ0SGV4KGQpO3JldHVybiBifTtYNTA5LmhleDJkbj1mdW5jdGlvbihlKXt2YXIgZj1cIlwiO3ZhciBjPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGUsMCk7Zm9yKHZhciBkPTA7ZDxjLmxlbmd0aDtkKyspe3ZhciBiPUFTTjFIRVguZ2V0SGV4T2ZUTFZfQXRPYmooZSxjW2RdKTtmPWYrXCIvXCIrWDUwOS5oZXgycmRuKGIpfXJldHVybiBmfTtYNTA5LmhleDJyZG49ZnVuY3Rpb24oYSl7dmFyIGY9QVNOMUhFWC5nZXREZWNlbmRhbnRIZXhUTFZCeU50aExpc3QoYSwwLFswLDBdKTt2YXIgZT1BU04xSEVYLmdldERlY2VuZGFudEhleFZCeU50aExpc3QoYSwwLFswLDFdKTt2YXIgYz1cIlwiO3RyeXtjPVg1MDkuRE5fQVRUUkhFWFtmXX1jYXRjaChiKXtjPWZ9ZT1lLnJlcGxhY2UoLyguLikvZyxcIiUkMVwiKTt2YXIgZD1kZWNvZGVVUklDb21wb25lbnQoZSk7cmV0dXJuIGMrXCI9XCIrZH07WDUwOS5ETl9BVFRSSEVYPXtcIjA2MDM1NTA0MDZcIjpcIkNcIixcIjA2MDM1NTA0MGFcIjpcIk9cIixcIjA2MDM1NTA0MGJcIjpcIk9VXCIsXCIwNjAzNTUwNDAzXCI6XCJDTlwiLFwiMDYwMzU1MDQwNVwiOlwiU05cIixcIjA2MDM1NTA0MDhcIjpcIlNUXCIsXCIwNjAzNTUwNDA3XCI6XCJMXCIsfTtYNTA5LmdldFB1YmxpY0tleUZyb21DZXJ0UEVNPWZ1bmN0aW9uKGYpe3ZhciBjPVg1MDkuZ2V0UHVibGljS2V5SW5mb1Byb3BPZkNlcnRQRU0oZik7aWYoYy5hbGdvaWQ9PVwiMmE4NjQ4ODZmNzBkMDEwMTAxXCIpe3ZhciBpPUtFWVVUSUwucGFyc2VQdWJsaWNSYXdSU0FLZXlIZXgoYy5rZXloZXgpO3ZhciBqPW5ldyBSU0FLZXkoKTtqLnNldFB1YmxpYyhpLm4saS5lKTtyZXR1cm4gan1lbHNle2lmKGMuYWxnb2lkPT1cIjJhODY0OGNlM2QwMjAxXCIpe3ZhciBlPUtKVVIuY3J5cHRvLk9JRC5vaWRoZXgybmFtZVtjLmFsZ3BhcmFtXTt2YXIgaj1uZXcgS0pVUi5jcnlwdG8uRUNEU0Eoe2N1cnZlOmUsaW5mbzpjLmtleWhleH0pO2ouc2V0UHVibGljS2V5SGV4KGMua2V5aGV4KTtyZXR1cm4gan1lbHNle2lmKGMuYWxnb2lkPT1cIjJhODY0OGNlMzgwNDAxXCIpe3ZhciBiPUFTTjFIRVguZ2V0VmJ5TGlzdChjLmFsZ3BhcmFtLDAsWzBdLFwiMDJcIik7dmFyIGE9QVNOMUhFWC5nZXRWYnlMaXN0KGMuYWxncGFyYW0sMCxbMV0sXCIwMlwiKTt2YXIgZD1BU04xSEVYLmdldFZieUxpc3QoYy5hbGdwYXJhbSwwLFsyXSxcIjAyXCIpO3ZhciBoPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGMua2V5aGV4LDApO2g9aC5zdWJzdHIoMik7dmFyIGo9bmV3IEtKVVIuY3J5cHRvLkRTQSgpO2ouc2V0UHVibGljKG5ldyBCaWdJbnRlZ2VyKGIsMTYpLG5ldyBCaWdJbnRlZ2VyKGEsMTYpLG5ldyBCaWdJbnRlZ2VyKGQsMTYpLG5ldyBCaWdJbnRlZ2VyKGgsMTYpKTtyZXR1cm4gan1lbHNle3Rocm93XCJ1bnN1cHBvcnRlZCBrZXlcIn19fX07WDUwOS5nZXRQdWJsaWNLZXlJbmZvUHJvcE9mQ2VydFBFTT1mdW5jdGlvbihlKXt2YXIgYz17fTtjLmFsZ3BhcmFtPW51bGw7dmFyIGc9WDUwOS5wZW1Ub0hleChlKTt2YXIgZD1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihnLDApO2lmKGQubGVuZ3RoIT0zKXt0aHJvd1wibWFsZm9ybWVkIFguNTA5IGNlcnRpZmljYXRlIFBFTSAoY29kZTowMDEpXCJ9aWYoZy5zdWJzdHIoZFswXSwyKSE9XCIzMFwiKXt0aHJvd1wibWFsZm9ybWVkIFguNTA5IGNlcnRpZmljYXRlIFBFTSAoY29kZTowMDIpXCJ9dmFyIGI9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooZyxkWzBdKTtpZihiLmxlbmd0aDw3KXt0aHJvd1wibWFsZm9ybWVkIFguNTA5IGNlcnRpZmljYXRlIFBFTSAoY29kZTowMDMpXCJ9dmFyIGg9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooZyxiWzZdKTtpZihoLmxlbmd0aCE9Mil7dGhyb3dcIm1hbGZvcm1lZCBYLjUwOSBjZXJ0aWZpY2F0ZSBQRU0gKGNvZGU6MDA0KVwifXZhciBmPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGcsaFswXSk7aWYoZi5sZW5ndGghPTIpe3Rocm93XCJtYWxmb3JtZWQgWC41MDkgY2VydGlmaWNhdGUgUEVNIChjb2RlOjAwNSlcIn1jLmFsZ29pZD1BU04xSEVYLmdldEhleE9mVl9BdE9iaihnLGZbMF0pO2lmKGcuc3Vic3RyKGZbMV0sMik9PVwiMDZcIil7Yy5hbGdwYXJhbT1BU04xSEVYLmdldEhleE9mVl9BdE9iaihnLGZbMV0pfWVsc2V7aWYoZy5zdWJzdHIoZlsxXSwyKT09XCIzMFwiKXtjLmFsZ3BhcmFtPUFTTjFIRVguZ2V0SGV4T2ZUTFZfQXRPYmooZyxmWzFdKX19aWYoZy5zdWJzdHIoaFsxXSwyKSE9XCIwM1wiKXt0aHJvd1wibWFsZm9ybWVkIFguNTA5IGNlcnRpZmljYXRlIFBFTSAoY29kZTowMDYpXCJ9dmFyIGE9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZyxoWzFdKTtjLmtleWhleD1hLnN1YnN0cigyKTtyZXR1cm4gY307WDUwOS5nZXRQdWJsaWNLZXlJbmZvUG9zT2ZDZXJ0SEVYPWZ1bmN0aW9uKGMpe3ZhciBiPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGMsMCk7aWYoYi5sZW5ndGghPTMpe3Rocm93XCJtYWxmb3JtZWQgWC41MDkgY2VydGlmaWNhdGUgUEVNIChjb2RlOjAwMSlcIn1pZihjLnN1YnN0cihiWzBdLDIpIT1cIjMwXCIpe3Rocm93XCJtYWxmb3JtZWQgWC41MDkgY2VydGlmaWNhdGUgUEVNIChjb2RlOjAwMilcIn12YXIgYT1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihjLGJbMF0pO2lmKGEubGVuZ3RoPDcpe3Rocm93XCJtYWxmb3JtZWQgWC41MDkgY2VydGlmaWNhdGUgUEVNIChjb2RlOjAwMylcIn1yZXR1cm4gYVs2XX07WDUwOS5nZXRWM0V4dEluZm9MaXN0T2ZDZXJ0SGV4PWZ1bmN0aW9uKGcpe3ZhciBiPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGcsMCk7aWYoYi5sZW5ndGghPTMpe3Rocm93XCJtYWxmb3JtZWQgWC41MDkgY2VydGlmaWNhdGUgUEVNIChjb2RlOjAwMSlcIn1pZihnLnN1YnN0cihiWzBdLDIpIT1cIjMwXCIpe3Rocm93XCJtYWxmb3JtZWQgWC41MDkgY2VydGlmaWNhdGUgUEVNIChjb2RlOjAwMilcIn12YXIgYT1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihnLGJbMF0pO2lmKGEubGVuZ3RoPDgpe3Rocm93XCJtYWxmb3JtZWQgWC41MDkgY2VydGlmaWNhdGUgUEVNIChjb2RlOjAwMylcIn1pZihnLnN1YnN0cihhWzddLDIpIT1cImEzXCIpe3Rocm93XCJtYWxmb3JtZWQgWC41MDkgY2VydGlmaWNhdGUgUEVNIChjb2RlOjAwNClcIn12YXIgaD1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihnLGFbN10pO2lmKGgubGVuZ3RoIT0xKXt0aHJvd1wibWFsZm9ybWVkIFguNTA5IGNlcnRpZmljYXRlIFBFTSAoY29kZTowMDUpXCJ9aWYoZy5zdWJzdHIoaFswXSwyKSE9XCIzMFwiKXt0aHJvd1wibWFsZm9ybWVkIFguNTA5IGNlcnRpZmljYXRlIFBFTSAoY29kZTowMDYpXCJ9dmFyIGY9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooZyxoWzBdKTt2YXIgZT1mLmxlbmd0aDt2YXIgZD1uZXcgQXJyYXkoZSk7Zm9yKHZhciBjPTA7YzxlO2MrKyl7ZFtjXT1YNTA5LmdldFYzRXh0SXRlbUluZm9fQXRPYmooZyxmW2NdKX1yZXR1cm4gZH07WDUwOS5nZXRWM0V4dEl0ZW1JbmZvX0F0T2JqPWZ1bmN0aW9uKGYsZyl7dmFyIGU9e307ZS5wb3NUTFY9Zzt2YXIgYj1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihmLGcpO2lmKGIubGVuZ3RoIT0yJiZiLmxlbmd0aCE9Myl7dGhyb3dcIm1hbGZvcm1lZCBYLjUwOXYzIEV4dCAoY29kZTowMDEpXCJ9aWYoZi5zdWJzdHIoYlswXSwyKSE9XCIwNlwiKXt0aHJvd1wibWFsZm9ybWVkIFguNTA5djMgRXh0IChjb2RlOjAwMilcIn12YXIgZD1BU04xSEVYLmdldEhleE9mVl9BdE9iaihmLGJbMF0pO2Uub2lkPUFTTjFIRVguaGV4dG9vaWRzdHIoZCk7ZS5jcml0aWNhbD1mYWxzZTtpZihiLmxlbmd0aD09Myl7ZS5jcml0aWNhbD10cnVlfXZhciBjPWJbYi5sZW5ndGgtMV07aWYoZi5zdWJzdHIoYywyKSE9XCIwNFwiKXt0aHJvd1wibWFsZm9ybWVkIFguNTA5djMgRXh0IChjb2RlOjAwMylcIn1lLnBvc1Y9QVNOMUhFWC5nZXRTdGFydFBvc09mVl9BdE9iaihmLGMpO3JldHVybiBlfTtYNTA5LmdldEhleE9mVExWX1YzRXh0VmFsdWU9ZnVuY3Rpb24oYixhKXt2YXIgYz1YNTA5LmdldFBvc09mVExWX1YzRXh0VmFsdWUoYixhKTtpZihjPT0tMSl7cmV0dXJuXCJcIn1yZXR1cm4gQVNOMUhFWC5nZXRIZXhPZlRMVl9BdE9iaihiLGMpfTtYNTA5LmdldEhleE9mVl9WM0V4dFZhbHVlPWZ1bmN0aW9uKGIsYSl7dmFyIGM9WDUwOS5nZXRQb3NPZlRMVl9WM0V4dFZhbHVlKGIsYSk7aWYoYz09LTEpe3JldHVyblwiXCJ9cmV0dXJuIEFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGIsYyl9O1g1MDkuZ2V0UG9zT2ZUTFZfVjNFeHRWYWx1ZT1mdW5jdGlvbihmLGIpe3ZhciBkPWI7aWYoIWIubWF0Y2goL15bMC05Ll0rJC8pKXtkPUtKVVIuYXNuMS54NTA5Lk9JRC5uYW1lMm9pZChiKX1pZihkPT1cIlwiKXtyZXR1cm4gLTF9dmFyIGM9WDUwOS5nZXRWM0V4dEluZm9MaXN0T2ZDZXJ0SGV4KGYpO2Zvcih2YXIgYT0wO2E8Yy5sZW5ndGg7YSsrKXt2YXIgZT1jW2FdO2lmKGUub2lkPT1kKXtyZXR1cm4gZS5wb3NWfX1yZXR1cm4gLTF9O1g1MDkuS0VZVVNBR0VfTkFNRT1bXCJkaWdpdGFsU2lnbmF0dXJlXCIsXCJub25SZXB1ZGlhdGlvblwiLFwia2V5RW5jaXBoZXJtZW50XCIsXCJkYXRhRW5jaXBoZXJtZW50XCIsXCJrZXlBZ3JlZW1lbnRcIixcImtleUNlcnRTaWduXCIsXCJjUkxTaWduXCIsXCJlbmNpcGhlck9ubHlcIixcImRlY2lwaGVyT25seVwiXTtYNTA5LmdldEV4dEtleVVzYWdlQmluPWZ1bmN0aW9uKGQpe3ZhciBiPVg1MDkuZ2V0SGV4T2ZWX1YzRXh0VmFsdWUoZCxcImtleVVzYWdlXCIpO2lmKGI9PVwiXCIpe3JldHVyblwiXCJ9aWYoYi5sZW5ndGglMiE9MHx8Yi5sZW5ndGg8PTIpe3Rocm93XCJtYWxmb3JtZWQga2V5IHVzYWdlIHZhbHVlXCJ9dmFyIGE9cGFyc2VJbnQoYi5zdWJzdHIoMCwyKSk7dmFyIGM9cGFyc2VJbnQoYi5zdWJzdHIoMiksMTYpLnRvU3RyaW5nKDIpO3JldHVybiBjLnN1YnN0cigwLGMubGVuZ3RoLWEpfTtYNTA5LmdldEV4dEtleVVzYWdlU3RyaW5nPWZ1bmN0aW9uKGUpe3ZhciBkPVg1MDkuZ2V0RXh0S2V5VXNhZ2VCaW4oZSk7dmFyIGI9bmV3IEFycmF5KCk7Zm9yKHZhciBjPTA7YzxkLmxlbmd0aDtjKyspe2lmKGQuc3Vic3RyKGMsMSk9PVwiMVwiKXtiLnB1c2goWDUwOS5LRVlVU0FHRV9OQU1FW2NdKX19cmV0dXJuIGIuam9pbihcIixcIil9O1g1MDkuZ2V0RXh0QUlBSW5mbz1mdW5jdGlvbihnKXt2YXIgaj17fTtqLm9jc3A9W107ai5jYWlzc3Vlcj1bXTt2YXIgaD1YNTA5LmdldFBvc09mVExWX1YzRXh0VmFsdWUoZyxcImF1dGhvcml0eUluZm9BY2Nlc3NcIik7aWYoaD09LTEpe3JldHVybiBudWxsfWlmKGcuc3Vic3RyKGgsMikhPVwiMzBcIil7dGhyb3dcIm1hbGZvcm1lZCBBSUEgRXh0biBWYWx1ZVwifXZhciBkPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGcsaCk7Zm9yKHZhciBjPTA7YzxkLmxlbmd0aDtjKyspe3ZhciBhPWRbY107dmFyIGI9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooZyxhKTtpZihiLmxlbmd0aCE9Mil7dGhyb3dcIm1hbGZvcm1lZCBBY2Nlc3NEZXNjcmlwdGlvbiBvZiBBSUEgRXh0blwifXZhciBlPWJbMF07dmFyIGY9YlsxXTtpZihBU04xSEVYLmdldEhleE9mVl9BdE9iaihnLGUpPT1cIjJiMDYwMTA1MDUwNzMwMDFcIil7aWYoZy5zdWJzdHIoZiwyKT09XCI4NlwiKXtqLm9jc3AucHVzaChoZXh0b3V0ZjgoQVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZyxmKSkpfX1pZihBU04xSEVYLmdldEhleE9mVl9BdE9iaihnLGUpPT1cIjJiMDYwMTA1MDUwNzMwMDJcIil7aWYoZy5zdWJzdHIoZiwyKT09XCI4NlwiKXtqLmNhaXNzdWVyLnB1c2goaGV4dG91dGY4KEFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGcsZikpKX19fXJldHVybiBqfTtcbi8qISBNaWtlIFNhbXVlbCAoYykgMjAwOSB8IGNvZGUuZ29vZ2xlLmNvbS9wL2pzb24tc2Fucy1ldmFsXG4gKi9cbnZhciBqc29uUGFyc2U9KGZ1bmN0aW9uKCl7dmFyIGU9XCIoPzotP1xcXFxiKD86MHxbMS05XVswLTldKikoPzpcXFxcLlswLTldKyk/KD86W2VFXVsrLV0/WzAtOV0rKT9cXFxcYilcIjt2YXIgaj0nKD86W15cXFxcMC1cXFxceDA4XFxcXHgwYS1cXFxceDFmXCJcXFxcXFxcXF18XFxcXFxcXFwoPzpbXCIvXFxcXFxcXFxiZm5ydF18dVswLTlBLUZhLWZdezR9KSknO3ZhciBpPScoPzpcIicraisnKlwiKSc7dmFyIGQ9bmV3IFJlZ0V4cChcIig/OmZhbHNlfHRydWV8bnVsbHxbXFxcXHtcXFxcfVxcXFxbXFxcXF1dfFwiK2UrXCJ8XCIraStcIilcIixcImdcIik7dmFyIGs9bmV3IFJlZ0V4cChcIlxcXFxcXFxcKD86KFtedV0pfHUoLns0fSkpXCIsXCJnXCIpO3ZhciBnPXsnXCInOidcIicsXCIvXCI6XCIvXCIsXCJcXFxcXCI6XCJcXFxcXCIsYjpcIlxcYlwiLGY6XCJcXGZcIixuOlwiXFxuXCIscjpcIlxcclwiLHQ6XCJcXHRcIn07ZnVuY3Rpb24gaChsLG0sbil7cmV0dXJuIG0/Z1ttXTpTdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KG4sMTYpKX12YXIgYz1uZXcgU3RyaW5nKFwiXCIpO3ZhciBhPVwiXFxcXFwiO3ZhciBmPXtcIntcIjpPYmplY3QsXCJbXCI6QXJyYXl9O3ZhciBiPU9iamVjdC5oYXNPd25Qcm9wZXJ0eTtyZXR1cm4gZnVuY3Rpb24odSxxKXt2YXIgcD11Lm1hdGNoKGQpO3ZhciB4O3ZhciB2PXBbMF07dmFyIGw9ZmFsc2U7aWYoXCJ7XCI9PT12KXt4PXt9fWVsc2V7aWYoXCJbXCI9PT12KXt4PVtdfWVsc2V7eD1bXTtsPXRydWV9fXZhciB0O3ZhciByPVt4XTtmb3IodmFyIG89MS1sLG09cC5sZW5ndGg7bzxtOysrbyl7dj1wW29dO3ZhciB3O3N3aXRjaCh2LmNoYXJDb2RlQXQoMCkpe2RlZmF1bHQ6dz1yWzBdO3dbdHx8dy5sZW5ndGhdPSsodik7dD12b2lkIDA7YnJlYWs7Y2FzZSAzNDp2PXYuc3Vic3RyaW5nKDEsdi5sZW5ndGgtMSk7aWYodi5pbmRleE9mKGEpIT09LTEpe3Y9di5yZXBsYWNlKGssaCl9dz1yWzBdO2lmKCF0KXtpZih3IGluc3RhbmNlb2YgQXJyYXkpe3Q9dy5sZW5ndGh9ZWxzZXt0PXZ8fGM7YnJlYWt9fXdbdF09djt0PXZvaWQgMDticmVhaztjYXNlIDkxOnc9clswXTtyLnVuc2hpZnQod1t0fHx3Lmxlbmd0aF09W10pO3Q9dm9pZCAwO2JyZWFrO2Nhc2UgOTM6ci5zaGlmdCgpO2JyZWFrO2Nhc2UgMTAyOnc9clswXTt3W3R8fHcubGVuZ3RoXT1mYWxzZTt0PXZvaWQgMDticmVhaztjYXNlIDExMDp3PXJbMF07d1t0fHx3Lmxlbmd0aF09bnVsbDt0PXZvaWQgMDticmVhaztjYXNlIDExNjp3PXJbMF07d1t0fHx3Lmxlbmd0aF09dHJ1ZTt0PXZvaWQgMDticmVhaztjYXNlIDEyMzp3PXJbMF07ci51bnNoaWZ0KHdbdHx8dy5sZW5ndGhdPXt9KTt0PXZvaWQgMDticmVhaztjYXNlIDEyNTpyLnNoaWZ0KCk7YnJlYWt9fWlmKGwpe2lmKHIubGVuZ3RoIT09MSl7dGhyb3cgbmV3IEVycm9yKCl9eD14WzBdfWVsc2V7aWYoci5sZW5ndGgpe3Rocm93IG5ldyBFcnJvcigpfX1pZihxKXt2YXIgcz1mdW5jdGlvbihDLEIpe3ZhciBEPUNbQl07aWYoRCYmdHlwZW9mIEQ9PT1cIm9iamVjdFwiKXt2YXIgbj1udWxsO2Zvcih2YXIgeiBpbiBEKXtpZihiLmNhbGwoRCx6KSYmRCE9PUMpe3ZhciB5PXMoRCx6KTtpZih5IT09dm9pZCAwKXtEW3pdPXl9ZWxzZXtpZighbil7bj1bXX1uLnB1c2goeil9fX1pZihuKXtmb3IodmFyIEE9bi5sZW5ndGg7LS1BPj0wOyl7ZGVsZXRlIERbbltBXV19fX1yZXR1cm4gcS5jYWxsKEMsQixEKX07eD1zKHtcIlwiOnh9LFwiXCIpfXJldHVybiB4fX0pKCk7XG4vKiEgandzLTMuMy4zIChjKSAyMDEzLTIwMTUgS2VuamkgVXJ1c2hpbWEgfCBranVyLmdpdGh1Yi5jb20vanNyc2FzaWduL2xpY2Vuc2VcbiAqL1xuaWYodHlwZW9mIEtKVVI9PVwidW5kZWZpbmVkXCJ8fCFLSlVSKXtLSlVSPXt9fWlmKHR5cGVvZiBLSlVSLmp3cz09XCJ1bmRlZmluZWRcInx8IUtKVVIuandzKXtLSlVSLmp3cz17fX1LSlVSLmp3cy5KV1M9ZnVuY3Rpb24oKXt2YXIgYT1LSlVSLmp3cy5KV1M7dGhpcy5wYXJzZUpXUz1mdW5jdGlvbihlLGcpe2lmKCh0aGlzLnBhcnNlZEpXUyE9PXVuZGVmaW5lZCkmJihnfHwodGhpcy5wYXJzZWRKV1Muc2lndmFsSCE9PXVuZGVmaW5lZCkpKXtyZXR1cm59aWYoZS5tYXRjaCgvXihbXi5dKylcXC4oW14uXSspXFwuKFteLl0rKSQvKT09bnVsbCl7dGhyb3dcIkpXUyBzaWduYXR1cmUgaXMgbm90IGEgZm9ybSBvZiAnSGVhZC5QYXlsb2FkLlNpZ1ZhbHVlJy5cIn12YXIgaD1SZWdFeHAuJDE7dmFyIGM9UmVnRXhwLiQyO3ZhciBpPVJlZ0V4cC4kMzt2YXIgaz1oK1wiLlwiK2M7dGhpcy5wYXJzZWRKV1M9e307dGhpcy5wYXJzZWRKV1MuaGVhZEI2NFU9aDt0aGlzLnBhcnNlZEpXUy5wYXlsb2FkQjY0VT1jO3RoaXMucGFyc2VkSldTLnNpZ3ZhbEI2NFU9aTt0aGlzLnBhcnNlZEpXUy5zaT1rO2lmKCFnKXt2YXIgZj1iNjR1dG9oZXgoaSk7dmFyIGQ9cGFyc2VCaWdJbnQoZiwxNik7dGhpcy5wYXJzZWRKV1Muc2lndmFsSD1mO3RoaXMucGFyc2VkSldTLnNpZ3ZhbEJJPWR9dmFyIGI9YjY0dXRvdXRmOChoKTt2YXIgaj1iNjR1dG91dGY4KGMpO3RoaXMucGFyc2VkSldTLmhlYWRTPWI7dGhpcy5wYXJzZWRKV1MucGF5bG9hZFM9ajtpZighYS5pc1NhZmVKU09OU3RyaW5nKGIsdGhpcy5wYXJzZWRKV1MsXCJoZWFkUFwiKSl7dGhyb3dcIm1hbGZvcm1lZCBKU09OIHN0cmluZyBmb3IgSldTIEhlYWQ6IFwiK2J9fX07S0pVUi5qd3MuSldTLnNpZ249ZnVuY3Rpb24oYSxpLGMsbSxsKXt2YXIgaz1LSlVSLmp3cy5KV1M7dmFyIHEsZSxqO2lmKHR5cGVvZiBpIT1cInN0cmluZ1wiJiZ0eXBlb2YgaSE9XCJvYmplY3RcIil7dGhyb3dcInNwSGVhZGVyIG11c3QgYmUgSlNPTiBzdHJpbmcgb3Igb2JqZWN0OiBcIitpfWlmKHR5cGVvZiBpPT1cIm9iamVjdFwiKXtlPWk7cT1KU09OLnN0cmluZ2lmeShlKX1pZih0eXBlb2YgaT09XCJzdHJpbmdcIil7cT1pO2lmKCFrLmlzU2FmZUpTT05TdHJpbmcocSkpe3Rocm93XCJKV1MgSGVhZCBpcyBub3Qgc2FmZSBKU09OIHN0cmluZzogXCIrcX1lPWsucmVhZFNhZmVKU09OU3RyaW5nKHEpfWo9YztpZih0eXBlb2YgYz09XCJvYmplY3RcIil7aj1KU09OLnN0cmluZ2lmeShjKX1pZigoYT09XCJcInx8YT09bnVsbCkmJmUuYWxnIT09dW5kZWZpbmVkKXthPWUuYWxnfWlmKChhIT1cIlwiJiZhIT1udWxsKSYmZS5hbGc9PT11bmRlZmluZWQpe2UuYWxnPWE7cT1KU09OLnN0cmluZ2lmeShlKX1pZihhIT09ZS5hbGcpe3Rocm93XCJhbGcgYW5kIHNIZWFkZXIuYWxnIGRvZXNuJ3QgbWF0Y2g6IFwiK2ErXCIhPVwiK2UuYWxnfXZhciBkPW51bGw7aWYoay5qd3NhbGcyc2lnYWxnW2FdPT09dW5kZWZpbmVkKXt0aHJvd1widW5zdXBwb3J0ZWQgYWxnIG5hbWU6IFwiK2F9ZWxzZXtkPWsuandzYWxnMnNpZ2FsZ1thXX12YXIgYj11dGY4dG9iNjR1KHEpO3ZhciBnPXV0Zjh0b2I2NHUoaik7dmFyIG89YitcIi5cIitnO3ZhciBuPVwiXCI7aWYoZC5zdWJzdHIoMCw0KT09XCJIbWFjXCIpe2lmKG09PT11bmRlZmluZWQpe3Rocm93XCJtYWMga2V5IHNoYWxsIGJlIHNwZWNpZmllZCBmb3IgSFMqIGFsZ1wifXZhciBoPW5ldyBLSlVSLmNyeXB0by5NYWMoe2FsZzpkLHByb3Y6XCJjcnlwdG9qc1wiLHBhc3M6bX0pO2gudXBkYXRlU3RyaW5nKG8pO249aC5kb0ZpbmFsKCl9ZWxzZXtpZihkLmluZGV4T2YoXCJ3aXRoRUNEU0FcIikhPS0xKXt2YXIgcD1uZXcgS0pVUi5jcnlwdG8uU2lnbmF0dXJlKHthbGc6ZH0pO3AuaW5pdChtLGwpO3AudXBkYXRlU3RyaW5nKG8pO2hBU04xU2lnPXAuc2lnbigpO249S0pVUi5jcnlwdG8uRUNEU0EuYXNuMVNpZ1RvQ29uY2F0U2lnKGhBU04xU2lnKX1lbHNle2lmKGQhPVwibm9uZVwiKXt2YXIgcD1uZXcgS0pVUi5jcnlwdG8uU2lnbmF0dXJlKHthbGc6ZH0pO3AuaW5pdChtLGwpO3AudXBkYXRlU3RyaW5nKG8pO249cC5zaWduKCl9fX12YXIgZj1oZXh0b2I2NHUobik7cmV0dXJuIG8rXCIuXCIrZn07S0pVUi5qd3MuSldTLnZlcmlmeT1mdW5jdGlvbihwLHQsail7dmFyIG09S0pVUi5qd3MuSldTO3ZhciBxPXAuc3BsaXQoXCIuXCIpO3ZhciBkPXFbMF07dmFyIGw9cVsxXTt2YXIgYj1kK1wiLlwiK2w7dmFyIHI9YjY0dXRvaGV4KHFbMl0pO3ZhciBpPW0ucmVhZFNhZmVKU09OU3RyaW5nKGI2NHV0b3V0ZjgocVswXSkpO3ZhciBoPW51bGw7dmFyIHM9bnVsbDtpZihpLmFsZz09PXVuZGVmaW5lZCl7dGhyb3dcImFsZ29yaXRobSBub3Qgc3BlY2lmaWVkIGluIGhlYWRlclwifWVsc2V7aD1pLmFsZztzPWguc3Vic3RyKDAsMil9aWYoaiE9bnVsbCYmT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGopPT09XCJbb2JqZWN0IEFycmF5XVwiJiZqLmxlbmd0aD4wKXt2YXIgYz1cIjpcIitqLmpvaW4oXCI6XCIpK1wiOlwiO2lmKGMuaW5kZXhPZihcIjpcIitoK1wiOlwiKT09LTEpe3Rocm93XCJhbGdvcml0aG0gJ1wiK2grXCInIG5vdCBhY2NlcHRlZCBpbiB0aGUgbGlzdFwifX1pZihoIT1cIm5vbmVcIiYmdD09PW51bGwpe3Rocm93XCJrZXkgc2hhbGwgYmUgc3BlY2lmaWVkIHRvIHZlcmlmeS5cIn1pZih0eXBlb2YgdD09XCJzdHJpbmdcIiYmdC5pbmRleE9mKFwiLS0tLS1CRUdJTiBcIikhPS0xKXt0PUtFWVVUSUwuZ2V0S2V5KHQpfWlmKHM9PVwiUlNcInx8cz09XCJQU1wiKXtpZighKHQgaW5zdGFuY2VvZiBSU0FLZXkpKXt0aHJvd1wia2V5IHNoYWxsIGJlIGEgUlNBS2V5IG9iaiBmb3IgUlMqIGFuZCBQUyogYWxnc1wifX1pZihzPT1cIkVTXCIpe2lmKCEodCBpbnN0YW5jZW9mIEtKVVIuY3J5cHRvLkVDRFNBKSl7dGhyb3dcImtleSBzaGFsbCBiZSBhIEVDRFNBIG9iaiBmb3IgRVMqIGFsZ3NcIn19aWYoaD09XCJub25lXCIpe312YXIgbj1udWxsO2lmKG0uandzYWxnMnNpZ2FsZ1tpLmFsZ109PT11bmRlZmluZWQpe3Rocm93XCJ1bnN1cHBvcnRlZCBhbGcgbmFtZTogXCIraH1lbHNle249bS5qd3NhbGcyc2lnYWxnW2hdfWlmKG49PVwibm9uZVwiKXt0aHJvd1wibm90IHN1cHBvcnRlZFwifWVsc2V7aWYobi5zdWJzdHIoMCw0KT09XCJIbWFjXCIpe3ZhciBrPW51bGw7aWYodD09PXVuZGVmaW5lZCl7dGhyb3dcImhleGFkZWNpbWFsIGtleSBzaGFsbCBiZSBzcGVjaWZpZWQgZm9yIEhNQUNcIn12YXIgZz1uZXcgS0pVUi5jcnlwdG8uTWFjKHthbGc6bixwYXNzOnR9KTtnLnVwZGF0ZVN0cmluZyhiKTtrPWcuZG9GaW5hbCgpO3JldHVybiByPT1rfWVsc2V7aWYobi5pbmRleE9mKFwid2l0aEVDRFNBXCIpIT0tMSl7dmFyIGY9bnVsbDt0cnl7Zj1LSlVSLmNyeXB0by5FQ0RTQS5jb25jYXRTaWdUb0FTTjFTaWcocil9Y2F0Y2gobyl7cmV0dXJuIGZhbHNlfXZhciBlPW5ldyBLSlVSLmNyeXB0by5TaWduYXR1cmUoe2FsZzpufSk7ZS5pbml0KHQpO2UudXBkYXRlU3RyaW5nKGIpO3JldHVybiBlLnZlcmlmeShmKX1lbHNle3ZhciBlPW5ldyBLSlVSLmNyeXB0by5TaWduYXR1cmUoe2FsZzpufSk7ZS5pbml0KHQpO2UudXBkYXRlU3RyaW5nKGIpO3JldHVybiBlLnZlcmlmeShyKX19fX07S0pVUi5qd3MuSldTLnBhcnNlPWZ1bmN0aW9uKGcpe3ZhciBjPWcuc3BsaXQoXCIuXCIpO3ZhciBiPXt9O3ZhciBmLGUsZDtpZihjLmxlbmd0aCE9MiYmYy5sZW5ndGghPTMpe3Rocm93XCJtYWxmb3JtZWQgc0pXUzogd3JvbmcgbnVtYmVyIG9mICcuJyBzcGxpdHRlZCBlbGVtZW50c1wifWY9Y1swXTtlPWNbMV07aWYoYy5sZW5ndGg9PTMpe2Q9Y1syXX1iLmhlYWRlck9iaj1LSlVSLmp3cy5KV1MucmVhZFNhZmVKU09OU3RyaW5nKGI2NHV0b3V0ZjgoZikpO2IucGF5bG9hZE9iaj1LSlVSLmp3cy5KV1MucmVhZFNhZmVKU09OU3RyaW5nKGI2NHV0b3V0ZjgoZSkpO2IuaGVhZGVyUFA9SlNPTi5zdHJpbmdpZnkoYi5oZWFkZXJPYmosbnVsbCxcIiAgXCIpO2lmKGIucGF5bG9hZE9iaj09bnVsbCl7Yi5wYXlsb2FkUFA9YjY0dXRvdXRmOChlKX1lbHNle2IucGF5bG9hZFBQPUpTT04uc3RyaW5naWZ5KGIucGF5bG9hZE9iaixudWxsLFwiICBcIil9aWYoZCE9PXVuZGVmaW5lZCl7Yi5zaWdIZXg9YjY0dXRvaGV4KGQpfXJldHVybiBifTtLSlVSLmp3cy5KV1MudmVyaWZ5SldUPWZ1bmN0aW9uKGQsaixsKXt2YXIgaD1LSlVSLmp3cy5KV1M7dmFyIGk9ZC5zcGxpdChcIi5cIik7dmFyIGM9aVswXTt2YXIgZz1pWzFdO3ZhciBtPWMrXCIuXCIrZzt2YXIgaz1iNjR1dG9oZXgoaVsyXSk7dmFyIGY9aC5yZWFkU2FmZUpTT05TdHJpbmcoYjY0dXRvdXRmOChjKSk7dmFyIGU9aC5yZWFkU2FmZUpTT05TdHJpbmcoYjY0dXRvdXRmOChnKSk7aWYoZi5hbGc9PT11bmRlZmluZWQpe3JldHVybiBmYWxzZX1pZihsLmFsZz09PXVuZGVmaW5lZCl7dGhyb3dcImFjY2VwdEZpZWxkLmFsZyBzaGFsbCBiZSBzcGVjaWZpZWRcIn1pZighaC5pbkFycmF5KGYuYWxnLGwuYWxnKSl7cmV0dXJuIGZhbHNlfWlmKGUuaXNzIT09dW5kZWZpbmVkJiZ0eXBlb2YgbC5pc3M9PT1cIm9iamVjdFwiKXtpZighaC5pbkFycmF5KGUuaXNzLGwuaXNzKSl7cmV0dXJuIGZhbHNlfX1pZihlLnN1YiE9PXVuZGVmaW5lZCYmdHlwZW9mIGwuc3ViPT09XCJvYmplY3RcIil7aWYoIWguaW5BcnJheShlLnN1YixsLnN1Yikpe3JldHVybiBmYWxzZX19aWYoZS5hdWQhPT11bmRlZmluZWQmJnR5cGVvZiBsLmF1ZD09PVwib2JqZWN0XCIpe2lmKHR5cGVvZiBlLmF1ZD09XCJzdHJpbmdcIil7aWYoIWguaW5BcnJheShlLmF1ZCxsLmF1ZCkpe3JldHVybiBmYWxzZX19ZWxzZXtpZih0eXBlb2YgZS5hdWQ9PVwib2JqZWN0XCIpe2lmKCFoLmluY2x1ZGVkQXJyYXkoZS5hdWQsbC5hdWQpKXtyZXR1cm4gZmFsc2V9fX19dmFyIGI9S0pVUi5qd3MuSW50RGF0ZS5nZXROb3coKTtpZihsLnZlcmlmeUF0IT09dW5kZWZpbmVkJiZ0eXBlb2YgbC52ZXJpZnlBdD09XCJudW1iZXJcIil7Yj1sLnZlcmlmeUF0fWlmKGUuZXhwIT09dW5kZWZpbmVkJiZ0eXBlb2YgZS5leHA9PVwibnVtYmVyXCIpe2lmKGUuZXhwPGIpe3JldHVybiBmYWxzZX19aWYoZS5uYmYhPT11bmRlZmluZWQmJnR5cGVvZiBlLm5iZj09XCJudW1iZXJcIil7aWYoYjxlLm5iZil7cmV0dXJuIGZhbHNlfX1pZihlLmlhdCE9PXVuZGVmaW5lZCYmdHlwZW9mIGUuaWF0PT1cIm51bWJlclwiKXtpZihiPGUuaWF0KXtyZXR1cm4gZmFsc2V9fWlmKGUuanRpIT09dW5kZWZpbmVkJiZsLmp0aSE9PXVuZGVmaW5lZCl7aWYoZS5qdGkhPT1sLmp0aSl7cmV0dXJuIGZhbHNlfX1pZighS0pVUi5qd3MuSldTLnZlcmlmeShkLGosbC5hbGcpKXtyZXR1cm4gZmFsc2V9cmV0dXJuIHRydWV9O0tKVVIuandzLkpXUy5pbmNsdWRlZEFycmF5PWZ1bmN0aW9uKGIsYSl7dmFyIGQ9S0pVUi5qd3MuSldTLmluQXJyYXk7aWYoYj09PW51bGwpe3JldHVybiBmYWxzZX1pZih0eXBlb2YgYiE9PVwib2JqZWN0XCIpe3JldHVybiBmYWxzZX1pZih0eXBlb2YgYi5sZW5ndGghPT1cIm51bWJlclwiKXtyZXR1cm4gZmFsc2V9Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe2lmKCFkKGJbY10sYSkpe3JldHVybiBmYWxzZX19cmV0dXJuIHRydWV9O0tKVVIuandzLkpXUy5pbkFycmF5PWZ1bmN0aW9uKGQsYil7aWYoYj09PW51bGwpe3JldHVybiBmYWxzZX1pZih0eXBlb2YgYiE9PVwib2JqZWN0XCIpe3JldHVybiBmYWxzZX1pZih0eXBlb2YgYi5sZW5ndGghPT1cIm51bWJlclwiKXtyZXR1cm4gZmFsc2V9Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe2lmKGJbY109PWQpe3JldHVybiB0cnVlfX1yZXR1cm4gZmFsc2V9O0tKVVIuandzLkpXUy5qd3NhbGcyc2lnYWxnPXtIUzI1NjpcIkhtYWNTSEEyNTZcIixIUzM4NDpcIkhtYWNTSEEzODRcIixIUzUxMjpcIkhtYWNTSEE1MTJcIixSUzI1NjpcIlNIQTI1NndpdGhSU0FcIixSUzM4NDpcIlNIQTM4NHdpdGhSU0FcIixSUzUxMjpcIlNIQTUxMndpdGhSU0FcIixFUzI1NjpcIlNIQTI1NndpdGhFQ0RTQVwiLEVTMzg0OlwiU0hBMzg0d2l0aEVDRFNBXCIsUFMyNTY6XCJTSEEyNTZ3aXRoUlNBYW5kTUdGMVwiLFBTMzg0OlwiU0hBMzg0d2l0aFJTQWFuZE1HRjFcIixQUzUxMjpcIlNIQTUxMndpdGhSU0FhbmRNR0YxXCIsbm9uZTpcIm5vbmVcIix9O0tKVVIuandzLkpXUy5pc1NhZmVKU09OU3RyaW5nPWZ1bmN0aW9uKGMsYixkKXt2YXIgZT1udWxsO3RyeXtlPWpzb25QYXJzZShjKTtpZih0eXBlb2YgZSE9XCJvYmplY3RcIil7cmV0dXJuIDB9aWYoZS5jb25zdHJ1Y3Rvcj09PUFycmF5KXtyZXR1cm4gMH1pZihiKXtiW2RdPWV9cmV0dXJuIDF9Y2F0Y2goYSl7cmV0dXJuIDB9fTtLSlVSLmp3cy5KV1MucmVhZFNhZmVKU09OU3RyaW5nPWZ1bmN0aW9uKGIpe3ZhciBjPW51bGw7dHJ5e2M9anNvblBhcnNlKGIpO2lmKHR5cGVvZiBjIT1cIm9iamVjdFwiKXtyZXR1cm4gbnVsbH1pZihjLmNvbnN0cnVjdG9yPT09QXJyYXkpe3JldHVybiBudWxsfXJldHVybiBjfWNhdGNoKGEpe3JldHVybiBudWxsfX07S0pVUi5qd3MuSldTLmdldEVuY29kZWRTaWduYXR1cmVWYWx1ZUZyb21KV1M9ZnVuY3Rpb24oYSl7aWYoYS5tYXRjaCgvXlteLl0rXFwuW14uXStcXC4oW14uXSspJC8pPT1udWxsKXt0aHJvd1wiSldTIHNpZ25hdHVyZSBpcyBub3QgYSBmb3JtIG9mICdIZWFkLlBheWxvYWQuU2lnVmFsdWUnLlwifXJldHVybiBSZWdFeHAuJDF9O0tKVVIuandzLkpXUy5nZXRKV0t0aHVtYnByaW50PWZ1bmN0aW9uKGQpe2lmKGQua3R5IT09XCJSU0FcIiYmZC5rdHkhPT1cIkVDXCImJmQua3R5IT09XCJvY3RcIil7dGhyb3dcInVuc3VwcG9ydGVkIGFsZ29yaXRobSBmb3IgSldLIFRodW1wcmludFwifXZhciBhPVwie1wiO2lmKGQua3R5PT09XCJSU0FcIil7aWYodHlwZW9mIGQubiE9XCJzdHJpbmdcInx8dHlwZW9mIGQuZSE9XCJzdHJpbmdcIil7dGhyb3dcIndyb25nIG4gYW5kIGUgdmFsdWUgZm9yIFJTQSBrZXlcIn1hKz0nXCJlXCI6XCInK2QuZSsnXCIsJzthKz0nXCJrdHlcIjpcIicrZC5rdHkrJ1wiLCc7YSs9J1wiblwiOlwiJytkLm4rJ1wifSd9ZWxzZXtpZihkLmt0eT09PVwiRUNcIil7aWYodHlwZW9mIGQuY3J2IT1cInN0cmluZ1wifHx0eXBlb2YgZC54IT1cInN0cmluZ1wifHx0eXBlb2YgZC55IT1cInN0cmluZ1wiKXt0aHJvd1wid3JvbmcgY3J2LCB4IGFuZCB5IHZhbHVlIGZvciBFQyBrZXlcIn1hKz0nXCJjcnZcIjpcIicrZC5jcnYrJ1wiLCc7YSs9J1wia3R5XCI6XCInK2Qua3R5KydcIiwnO2ErPSdcInhcIjpcIicrZC54KydcIiwnO2ErPSdcInlcIjpcIicrZC55KydcIn0nfWVsc2V7aWYoZC5rdHk9PT1cIm9jdFwiKXtpZih0eXBlb2YgZC5rIT1cInN0cmluZ1wiKXt0aHJvd1wid3JvbmcgayB2YWx1ZSBmb3Igb2N0KHN5bW1ldHJpYykga2V5XCJ9YSs9J1wia3R5XCI6XCInK2Qua3R5KydcIiwnO2ErPSdcImtcIjpcIicrZC5rKydcIn0nfX19dmFyIGI9cnN0cnRvaGV4KGEpO3ZhciBjPUtKVVIuY3J5cHRvLlV0aWwuaGFzaEhleChiLFwic2hhMjU2XCIpO3ZhciBlPWhleHRvYjY0dShjKTtyZXR1cm4gZX07S0pVUi5qd3MuSW50RGF0ZT17fTtLSlVSLmp3cy5JbnREYXRlLmdldD1mdW5jdGlvbihhKXtpZihhPT1cIm5vd1wiKXtyZXR1cm4gS0pVUi5qd3MuSW50RGF0ZS5nZXROb3coKX1lbHNle2lmKGE9PVwibm93ICsgMWhvdXJcIil7cmV0dXJuIEtKVVIuandzLkludERhdGUuZ2V0Tm93KCkrNjAqNjB9ZWxzZXtpZihhPT1cIm5vdyArIDFkYXlcIil7cmV0dXJuIEtKVVIuandzLkludERhdGUuZ2V0Tm93KCkrNjAqNjAqMjR9ZWxzZXtpZihhPT1cIm5vdyArIDFtb250aFwiKXtyZXR1cm4gS0pVUi5qd3MuSW50RGF0ZS5nZXROb3coKSs2MCo2MCoyNCozMH1lbHNle2lmKGE9PVwibm93ICsgMXllYXJcIil7cmV0dXJuIEtKVVIuandzLkludERhdGUuZ2V0Tm93KCkrNjAqNjAqMjQqMzY1fWVsc2V7aWYoYS5tYXRjaCgvWiQvKSl7cmV0dXJuIEtKVVIuandzLkludERhdGUuZ2V0WnVsdShhKX1lbHNle2lmKGEubWF0Y2goL15bMC05XSskLykpe3JldHVybiBwYXJzZUludChhKX19fX19fX10aHJvd1widW5zdXBwb3J0ZWQgZm9ybWF0OiBcIithfTtLSlVSLmp3cy5JbnREYXRlLmdldFp1bHU9ZnVuY3Rpb24obCl7dmFyIGs7aWYoaz1sLm1hdGNoKC8oXFxkKykoXFxkXFxkKShcXGRcXGQpKFxcZFxcZCkoXFxkXFxkKShcXGRcXGQpWi8pKXt2YXIgYj1SZWdFeHAuJDE7dmFyIGk9cGFyc2VJbnQoYik7aWYoYi5sZW5ndGg9PTQpe31lbHNle2lmKGIubGVuZ3RoPT0yKXtpZig1MDw9aSYmaTwxMDApe2k9MTkwMCtpfWVsc2V7aWYoMDw9aSYmaTw1MCl7aT0yMDAwK2l9ZWxzZXt0aHJvd1wibWFsZm9ybWVkIHllYXIgc3RyaW5nIGZvciBVVENUaW1lXCJ9fX1lbHNle3Rocm93XCJtYWxmb3JtZWQgeWVhciBzdHJpbmdcIn19dmFyIGc9cGFyc2VJbnQoUmVnRXhwLiQyKS0xO3ZhciBqPXBhcnNlSW50KFJlZ0V4cC4kMyk7dmFyIGM9cGFyc2VJbnQoUmVnRXhwLiQ0KTt2YXIgZT1wYXJzZUludChSZWdFeHAuJDUpO3ZhciBmPXBhcnNlSW50KFJlZ0V4cC4kNik7dmFyIGg9bmV3IERhdGUoRGF0ZS5VVEMoaSxnLGosYyxlLGYpKTtyZXR1cm4gfn4oaC8xMDAwKX10aHJvd1widW5zdXBwb3J0ZWQgZm9ybWF0OiBcIitsfTtLSlVSLmp3cy5JbnREYXRlLmdldE5vdz1mdW5jdGlvbigpe3ZhciBhPX5+KG5ldyBEYXRlKCkvMTAwMCk7cmV0dXJuIGF9O0tKVVIuandzLkludERhdGUuaW50RGF0ZTJVVENTdHJpbmc9ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IERhdGUoYSoxMDAwKTtyZXR1cm4gYi50b1VUQ1N0cmluZygpfTtLSlVSLmp3cy5JbnREYXRlLmludERhdGUyWnVsdT1mdW5jdGlvbihlKXt2YXIgaT1uZXcgRGF0ZShlKjEwMDApO3ZhciBoPShcIjAwMDBcIitpLmdldFVUQ0Z1bGxZZWFyKCkpLnNsaWNlKC00KTt2YXIgZz0oXCIwMFwiKyhpLmdldFVUQ01vbnRoKCkrMSkpLnNsaWNlKC0yKTt2YXIgYj0oXCIwMFwiK2kuZ2V0VVRDRGF0ZSgpKS5zbGljZSgtMik7dmFyIGE9KFwiMDBcIitpLmdldFVUQ0hvdXJzKCkpLnNsaWNlKC0yKTt2YXIgYz0oXCIwMFwiK2kuZ2V0VVRDTWludXRlcygpKS5zbGljZSgtMik7dmFyIGY9KFwiMDBcIitpLmdldFVUQ1NlY29uZHMoKSkuc2xpY2UoLTIpO3JldHVybiBoK2crYithK2MrZitcIlpcIn07XG4vKiEgandzanMtMi4wLjEgKGMpIDIwMTAtMjAxNSBLZW5qaSBVcnVzaGltYSB8IGtqdXIuZ2l0aHViLmNvbS9qc2p3cy9saWNlbnNlXG4gKi9cbmlmKHR5cGVvZiBLSlVSPT1cInVuZGVmaW5lZFwifHwhS0pVUil7S0pVUj17fX1pZih0eXBlb2YgS0pVUi5qd3M9PVwidW5kZWZpbmVkXCJ8fCFLSlVSLmp3cyl7S0pVUi5qd3M9e319S0pVUi5qd3MuSldTSlM9ZnVuY3Rpb24oKXt2YXIgYT1LSlVSLmp3cy5KV1M7dGhpcy5hSGVhZGVyPVtdO3RoaXMuc1BheWxvYWQ9XCJcIjt0aGlzLmFTaWduYXR1cmU9W107dGhpcy5pbml0PWZ1bmN0aW9uKCl7dGhpcy5hSGVhZGVyPVtdO3RoaXMuc1BheWxvYWQ9XCJcIjt0aGlzLmFTaWduYXR1cmU9W119O3RoaXMuaW5pdFdpdGhKV1M9ZnVuY3Rpb24oYyl7dGhpcy5pbml0KCk7dmFyIGI9bmV3IEtKVVIuandzLkpXUygpO2IucGFyc2VKV1MoYyk7dGhpcy5hSGVhZGVyLnB1c2goYi5wYXJzZWRKV1MuaGVhZEI2NFUpO3RoaXMuc1BheWxvYWQ9Yi5wYXJzZWRKV1MucGF5bG9hZEI2NFU7dGhpcy5hU2lnbmF0dXJlLnB1c2goYi5wYXJzZWRKV1Muc2lndmFsQjY0VSl9O3RoaXMuYWRkU2lnbmF0dXJlQnlIZWFkZXJLZXk9ZnVuY3Rpb24oZSxiKXt2YXIgZD1iNjR1dG91dGY4KHRoaXMuc1BheWxvYWQpO3ZhciBjPW5ldyBLSlVSLmp3cy5KV1MoKTt2YXIgZj1jLmdlbmVyYXRlSldTQnlQMVBydktleShlLGQsYik7dGhpcy5hSGVhZGVyLnB1c2goYy5wYXJzZWRKV1MuaGVhZEI2NFUpO3RoaXMuYVNpZ25hdHVyZS5wdXNoKGMucGFyc2VkSldTLnNpZ3ZhbEI2NFUpfTt0aGlzLmFkZFNpZ25hdHVyZUJ5SGVhZGVyUGF5bG9hZEtleT1mdW5jdGlvbihlLGQsYil7dmFyIGM9bmV3IEtKVVIuandzLkpXUygpO3ZhciBmPWMuZ2VuZXJhdGVKV1NCeVAxUHJ2S2V5KGUsZCxiKTt0aGlzLmFIZWFkZXIucHVzaChjLnBhcnNlZEpXUy5oZWFkQjY0VSk7dGhpcy5zUGF5bG9hZD1jLnBhcnNlZEpXUy5wYXlsb2FkQjY0VTt0aGlzLmFTaWduYXR1cmUucHVzaChjLnBhcnNlZEpXUy5zaWd2YWxCNjRVKX07dGhpcy52ZXJpZnlXaXRoQ2VydHM9ZnVuY3Rpb24oYyl7aWYodGhpcy5hSGVhZGVyLmxlbmd0aCE9Yy5sZW5ndGgpe3Rocm93XCJudW0gaGVhZGVycyBkb2VzIG5vdCBtYXRjaCB3aXRoIG51bSBjZXJ0c1wifWlmKHRoaXMuYVNpZ25hdHVyZS5sZW5ndGghPWMubGVuZ3RoKXt0aHJvd1wibnVtIHNpZ25hdHVyZXMgZG9lcyBub3QgbWF0Y2ggd2l0aCBudW0gY2VydHNcIn12YXIgaz10aGlzLnNQYXlsb2FkO3ZhciBnPVwiXCI7Zm9yKHZhciBkPTA7ZDxjLmxlbmd0aDtkKyspe3ZhciBlPWNbZF07dmFyIGY9dGhpcy5hSGVhZGVyW2RdO3ZhciBtPXRoaXMuYVNpZ25hdHVyZVtkXTt2YXIgYj1mK1wiLlwiK2srXCIuXCIrbTt2YXIgaj1uZXcgS0pVUi5qd3MuSldTKCk7dHJ5e3ZhciBsPWoudmVyaWZ5SldTQnlQZW1YNTA5Q2VydChiLGUpO2lmKGwhPTEpe2crPShkKzEpK1widGggc2lnbmF0dXJlIHVubWF0Y2guIFwifX1jYXRjaChoKXtnKz0oZCsxKStcInRoIHNpZ25hdHVyZSBmYWlsKFwiK2grXCIpLiBcIn19aWYoZz09XCJcIil7cmV0dXJuIDF9ZWxzZXt0aHJvdyBnfX07dGhpcy5yZWFkSldTSlM9ZnVuY3Rpb24oYil7dmFyIGM9YS5yZWFkU2FmZUpTT05TdHJpbmcoYik7aWYoYz09bnVsbCl7dGhyb3dcImFyZ3VtZW50IGlzIG5vdCBKU09OIHN0cmluZzogXCIrYn10aGlzLmFIZWFkZXI9Yy5oZWFkZXJzO3RoaXMuc1BheWxvYWQ9Yy5wYXlsb2FkO3RoaXMuYVNpZ25hdHVyZT1jLnNpZ25hdHVyZXN9O3RoaXMuZ2V0SlNPTj1mdW5jdGlvbigpe3JldHVybntoZWFkZXJzOnRoaXMuYUhlYWRlcixwYXlsb2FkOnRoaXMuc1BheWxvYWQsc2lnbmF0dXJlczp0aGlzLmFTaWduYXR1cmV9fTt0aGlzLmlzRW1wdHk9ZnVuY3Rpb24oKXtpZih0aGlzLmFIZWFkZXIubGVuZ3RoPT0wKXtyZXR1cm4gMX1yZXR1cm4gMH19O1xuLyohIG5vZGV1dGlsLTEuMC4wIChjKSAyMDE1IEtlbmppIFVydXNoaW1hIHwga2p1ci5naXRodWIuY29tL2pzcnNhc2lnbi9saWNlbnNlXG4gKi9cbmZ1bmN0aW9uIHJlYWRGaWxlVVRGOChhKXtyZXR1cm4gcmVxdWlyZShcImZzXCIpLnJlYWRGaWxlU3luYyhhLFwidXRmOFwiKX1mdW5jdGlvbiByZWFkRmlsZUhleEJ5QmluKGMpe3ZhciBiPXJlcXVpcmUoXCJqc3JzYXNpZ25cIik7dmFyIGE9cmVxdWlyZShcImZzXCIpO3JldHVybiBiLnJzdHJ0b2hleChhLnJlYWRGaWxlU3luYyhjLFwiYmluYXJ5XCIpKX1mdW5jdGlvbiByZWFkRmlsZShiKXt2YXIgYT1yZXF1aXJlKFwiZnNcIik7cmV0dXJuIGEucmVhZEZpbGVTeW5jKGIsXCJiaW5hcnlcIil9ZnVuY3Rpb24gc2F2ZUZpbGUoYyxiKXt2YXIgYT1yZXF1aXJlKFwiZnNcIik7YS53cml0ZUZpbGVTeW5jKGMsYixcImJpbmFyeVwiKX1mdW5jdGlvbiBzYXZlRmlsZUJpbkJ5SGV4KGUsYil7dmFyIGE9cmVxdWlyZShcImZzXCIpO3ZhciBjPXJlcXVpcmUoXCJqc3JzYXNpZ25cIik7dmFyIGQ9Yy5oZXh0b3JzdHIoYik7YS53cml0ZUZpbGVTeW5jKGUsZCxcImJpbmFyeVwiKX07XG5cbmV4cG9ydHMuQmlnSW50ZWdlciA9IEJpZ0ludGVnZXI7XG5leHBvcnRzLlJTQUtleSA9IFJTQUtleTtcbmV4cG9ydHMuRUNEU0EgPSBLSlVSLmNyeXB0by5FQ0RTQTtcbmV4cG9ydHMuRFNBID0gS0pVUi5jcnlwdG8uRFNBO1xuZXhwb3J0cy5TaWduYXR1cmUgPSBLSlVSLmNyeXB0by5TaWduYXR1cmU7XG5leHBvcnRzLk1lc3NhZ2VEaWdlc3QgPSBLSlVSLmNyeXB0by5NZXNzYWdlRGlnZXN0O1xuZXhwb3J0cy5NYWMgPSBLSlVSLmNyeXB0by5NYWM7XG5leHBvcnRzLktFWVVUSUwgPSBLRVlVVElMO1xuZXhwb3J0cy5BU04xSEVYID0gQVNOMUhFWDtcbmV4cG9ydHMuWDUwOSA9IFg1MDk7XG5leHBvcnRzLkNyeXB0b0pTID0gQ3J5cHRvSlM7XG5cbi8vIGV4dC9iYXNlNjQuanNcbmV4cG9ydHMuYjY0dG9oZXggPSBiNjR0b2hleDtcbmV4cG9ydHMuYjY0dG9CQSA9IGI2NHRvQkE7XG5cbi8vIGJhc2U2NHguanNcbmV4cG9ydHMuc3RvQkEgPSBzdG9CQTtcbmV4cG9ydHMuQkF0b3MgPSBCQXRvcztcbmV4cG9ydHMuQkF0b2hleCA9IEJBdG9oZXg7XG5leHBvcnRzLnN0b2hleCA9IHN0b2hleDtcbmV4cG9ydHMuc3RvYjY0ID0gc3RvYjY0O1xuZXhwb3J0cy5zdG9iNjR1ID0gc3RvYjY0dTtcbmV4cG9ydHMuYjY0dXRvcyA9IGI2NHV0b3M7XG5leHBvcnRzLmI2NHRvYjY0dSA9IGI2NHRvYjY0dTtcbmV4cG9ydHMuYjY0dXRvYjY0ID0gYjY0dXRvYjY0O1xuZXhwb3J0cy5oZXgyYjY0ID0gaGV4MmI2NDtcbmV4cG9ydHMuaGV4dG9iNjR1ID0gaGV4dG9iNjR1O1xuZXhwb3J0cy5iNjR1dG9oZXggPSBiNjR1dG9oZXg7XG5leHBvcnRzLmI2NHRvaGV4ID0gYjY0dG9oZXg7XG5leHBvcnRzLnV0Zjh0b2I2NHUgPSB1dGY4dG9iNjR1O1xuZXhwb3J0cy5iNjR1dG91dGY4ID0gYjY0dXRvdXRmODtcbmV4cG9ydHMudXRmOHRvYjY0ID0gdXRmOHRvYjY0O1xuZXhwb3J0cy5iNjR0b3V0ZjggPSBiNjR0b3V0Zjg7XG5leHBvcnRzLnV0Zjh0b2hleCA9IHV0Zjh0b2hleDtcbmV4cG9ydHMuaGV4dG91dGY4ID0gaGV4dG91dGY4O1xuZXhwb3J0cy5oZXh0b3JzdHIgPSBoZXh0b3JzdHI7XG5leHBvcnRzLnJzdHJ0b2hleCA9IHJzdHJ0b2hleDtcbmV4cG9ydHMubmV3bGluZV90b1VuaXggPSBuZXdsaW5lX3RvVW5peDtcbmV4cG9ydHMubmV3bGluZV90b0RvcyA9IG5ld2xpbmVfdG9Eb3M7XG5leHBvcnRzLmludGFyeXN0cnRvaGV4ID0gaW50YXJ5c3RydG9oZXg7XG5leHBvcnRzLnN0cmRpZmZpZHggPSBzdHJkaWZmaWR4O1xuXG5leHBvcnRzLmNyeXB0byA9IEtKVVIuY3J5cHRvO1xuZXhwb3J0cy5hc24xID0gS0pVUi5hc24xO1xuZXhwb3J0cy5qd3MgPSBLSlVSLmp3cztcblxuZXhwb3J0cy5yZWFkRmlsZVVURjggPSByZWFkRmlsZVVURjg7XG5leHBvcnRzLnJlYWRGaWxlSGV4QnlCaW4gPSByZWFkRmlsZUhleEJ5QmluO1xuZXhwb3J0cy5yZWFkRmlsZSA9IHJlYWRGaWxlO1xuZXhwb3J0cy5zYXZlRmlsZSA9IHNhdmVGaWxlO1xuZXhwb3J0cy5zYXZlRmlsZUJpbkJ5SGV4ID0gc2F2ZUZpbGVCaW5CeUhleDtcblxuXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vanNyc2FzaWduL2xpYi9qc3JzYXNpZ24uanNcbiAqKiBtb2R1bGUgaWQgPSAzMDNcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8qIVxuICogVGhlIGJ1ZmZlciBtb2R1bGUgZnJvbSBub2RlLmpzLCBmb3IgdGhlIGJyb3dzZXIuXG4gKlxuICogQGF1dGhvciAgIEZlcm9zcyBBYm91a2hhZGlqZWggPGZlcm9zc0BmZXJvc3Mub3JnPiA8aHR0cDovL2Zlcm9zcy5vcmc+XG4gKiBAbGljZW5zZSAgTUlUXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLXByb3RvICovXG5cbid1c2Ugc3RyaWN0J1xuXG52YXIgYmFzZTY0ID0gcmVxdWlyZSgnYmFzZTY0LWpzJylcbnZhciBpZWVlNzU0ID0gcmVxdWlyZSgnaWVlZTc1NCcpXG52YXIgaXNBcnJheSA9IHJlcXVpcmUoJ2lzYXJyYXknKVxuXG5leHBvcnRzLkJ1ZmZlciA9IEJ1ZmZlclxuZXhwb3J0cy5TbG93QnVmZmVyID0gU2xvd0J1ZmZlclxuZXhwb3J0cy5JTlNQRUNUX01BWF9CWVRFUyA9IDUwXG5CdWZmZXIucG9vbFNpemUgPSA4MTkyIC8vIG5vdCB1c2VkIGJ5IHRoaXMgaW1wbGVtZW50YXRpb25cblxudmFyIHJvb3RQYXJlbnQgPSB7fVxuXG4vKipcbiAqIElmIGBCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVGA6XG4gKiAgID09PSB0cnVlICAgIFVzZSBVaW50OEFycmF5IGltcGxlbWVudGF0aW9uIChmYXN0ZXN0KVxuICogICA9PT0gZmFsc2UgICBVc2UgT2JqZWN0IGltcGxlbWVudGF0aW9uIChtb3N0IGNvbXBhdGlibGUsIGV2ZW4gSUU2KVxuICpcbiAqIEJyb3dzZXJzIHRoYXQgc3VwcG9ydCB0eXBlZCBhcnJheXMgYXJlIElFIDEwKywgRmlyZWZveCA0KywgQ2hyb21lIDcrLCBTYWZhcmkgNS4xKyxcbiAqIE9wZXJhIDExLjYrLCBpT1MgNC4yKy5cbiAqXG4gKiBEdWUgdG8gdmFyaW91cyBicm93c2VyIGJ1Z3MsIHNvbWV0aW1lcyB0aGUgT2JqZWN0IGltcGxlbWVudGF0aW9uIHdpbGwgYmUgdXNlZCBldmVuXG4gKiB3aGVuIHRoZSBicm93c2VyIHN1cHBvcnRzIHR5cGVkIGFycmF5cy5cbiAqXG4gKiBOb3RlOlxuICpcbiAqICAgLSBGaXJlZm94IDQtMjkgbGFja3Mgc3VwcG9ydCBmb3IgYWRkaW5nIG5ldyBwcm9wZXJ0aWVzIHRvIGBVaW50OEFycmF5YCBpbnN0YW5jZXMsXG4gKiAgICAgU2VlOiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD02OTU0MzguXG4gKlxuICogICAtIFNhZmFyaSA1LTcgbGFja3Mgc3VwcG9ydCBmb3IgY2hhbmdpbmcgdGhlIGBPYmplY3QucHJvdG90eXBlLmNvbnN0cnVjdG9yYCBwcm9wZXJ0eVxuICogICAgIG9uIG9iamVjdHMuXG4gKlxuICogICAtIENocm9tZSA5LTEwIGlzIG1pc3NpbmcgdGhlIGBUeXBlZEFycmF5LnByb3RvdHlwZS5zdWJhcnJheWAgZnVuY3Rpb24uXG4gKlxuICogICAtIElFMTAgaGFzIGEgYnJva2VuIGBUeXBlZEFycmF5LnByb3RvdHlwZS5zdWJhcnJheWAgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhcnJheXMgb2ZcbiAqICAgICBpbmNvcnJlY3QgbGVuZ3RoIGluIHNvbWUgc2l0dWF0aW9ucy5cblxuICogV2UgZGV0ZWN0IHRoZXNlIGJ1Z2d5IGJyb3dzZXJzIGFuZCBzZXQgYEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUYCB0byBgZmFsc2VgIHNvIHRoZXlcbiAqIGdldCB0aGUgT2JqZWN0IGltcGxlbWVudGF0aW9uLCB3aGljaCBpcyBzbG93ZXIgYnV0IGJlaGF2ZXMgY29ycmVjdGx5LlxuICovXG5CdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCA9IGdsb2JhbC5UWVBFRF9BUlJBWV9TVVBQT1JUICE9PSB1bmRlZmluZWRcbiAgPyBnbG9iYWwuVFlQRURfQVJSQVlfU1VQUE9SVFxuICA6IHR5cGVkQXJyYXlTdXBwb3J0KClcblxuZnVuY3Rpb24gdHlwZWRBcnJheVN1cHBvcnQgKCkge1xuICBmdW5jdGlvbiBCYXIgKCkge31cbiAgdHJ5IHtcbiAgICB2YXIgYXJyID0gbmV3IFVpbnQ4QXJyYXkoMSlcbiAgICBhcnIuZm9vID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gNDIgfVxuICAgIGFyci5jb25zdHJ1Y3RvciA9IEJhclxuICAgIHJldHVybiBhcnIuZm9vKCkgPT09IDQyICYmIC8vIHR5cGVkIGFycmF5IGluc3RhbmNlcyBjYW4gYmUgYXVnbWVudGVkXG4gICAgICAgIGFyci5jb25zdHJ1Y3RvciA9PT0gQmFyICYmIC8vIGNvbnN0cnVjdG9yIGNhbiBiZSBzZXRcbiAgICAgICAgdHlwZW9mIGFyci5zdWJhcnJheSA9PT0gJ2Z1bmN0aW9uJyAmJiAvLyBjaHJvbWUgOS0xMCBsYWNrIGBzdWJhcnJheWBcbiAgICAgICAgYXJyLnN1YmFycmF5KDEsIDEpLmJ5dGVMZW5ndGggPT09IDAgLy8gaWUxMCBoYXMgYnJva2VuIGBzdWJhcnJheWBcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbmZ1bmN0aW9uIGtNYXhMZW5ndGggKCkge1xuICByZXR1cm4gQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRcbiAgICA/IDB4N2ZmZmZmZmZcbiAgICA6IDB4M2ZmZmZmZmZcbn1cblxuLyoqXG4gKiBDbGFzczogQnVmZmVyXG4gKiA9PT09PT09PT09PT09XG4gKlxuICogVGhlIEJ1ZmZlciBjb25zdHJ1Y3RvciByZXR1cm5zIGluc3RhbmNlcyBvZiBgVWludDhBcnJheWAgdGhhdCBhcmUgYXVnbWVudGVkXG4gKiB3aXRoIGZ1bmN0aW9uIHByb3BlcnRpZXMgZm9yIGFsbCB0aGUgbm9kZSBgQnVmZmVyYCBBUEkgZnVuY3Rpb25zLiBXZSB1c2VcbiAqIGBVaW50OEFycmF5YCBzbyB0aGF0IHNxdWFyZSBicmFja2V0IG5vdGF0aW9uIHdvcmtzIGFzIGV4cGVjdGVkIC0tIGl0IHJldHVybnNcbiAqIGEgc2luZ2xlIG9jdGV0LlxuICpcbiAqIEJ5IGF1Z21lbnRpbmcgdGhlIGluc3RhbmNlcywgd2UgY2FuIGF2b2lkIG1vZGlmeWluZyB0aGUgYFVpbnQ4QXJyYXlgXG4gKiBwcm90b3R5cGUuXG4gKi9cbmZ1bmN0aW9uIEJ1ZmZlciAoYXJnKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBCdWZmZXIpKSB7XG4gICAgLy8gQXZvaWQgZ29pbmcgdGhyb3VnaCBhbiBBcmd1bWVudHNBZGFwdG9yVHJhbXBvbGluZSBpbiB0aGUgY29tbW9uIGNhc2UuXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSByZXR1cm4gbmV3IEJ1ZmZlcihhcmcsIGFyZ3VtZW50c1sxXSlcbiAgICByZXR1cm4gbmV3IEJ1ZmZlcihhcmcpXG4gIH1cblxuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpcy5sZW5ndGggPSAwXG4gICAgdGhpcy5wYXJlbnQgPSB1bmRlZmluZWRcbiAgfVxuXG4gIC8vIENvbW1vbiBjYXNlLlxuICBpZiAodHlwZW9mIGFyZyA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gZnJvbU51bWJlcih0aGlzLCBhcmcpXG4gIH1cblxuICAvLyBTbGlnaHRseSBsZXNzIGNvbW1vbiBjYXNlLlxuICBpZiAodHlwZW9mIGFyZyA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZnJvbVN0cmluZyh0aGlzLCBhcmcsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogJ3V0ZjgnKVxuICB9XG5cbiAgLy8gVW51c3VhbC5cbiAgcmV0dXJuIGZyb21PYmplY3QodGhpcywgYXJnKVxufVxuXG5mdW5jdGlvbiBmcm9tTnVtYmVyICh0aGF0LCBsZW5ndGgpIHtcbiAgdGhhdCA9IGFsbG9jYXRlKHRoYXQsIGxlbmd0aCA8IDAgPyAwIDogY2hlY2tlZChsZW5ndGgpIHwgMClcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoYXRbaV0gPSAwXG4gICAgfVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21TdHJpbmcgKHRoYXQsIHN0cmluZywgZW5jb2RpbmcpIHtcbiAgaWYgKHR5cGVvZiBlbmNvZGluZyAhPT0gJ3N0cmluZycgfHwgZW5jb2RpbmcgPT09ICcnKSBlbmNvZGluZyA9ICd1dGY4J1xuXG4gIC8vIEFzc3VtcHRpb246IGJ5dGVMZW5ndGgoKSByZXR1cm4gdmFsdWUgaXMgYWx3YXlzIDwga01heExlbmd0aC5cbiAgdmFyIGxlbmd0aCA9IGJ5dGVMZW5ndGgoc3RyaW5nLCBlbmNvZGluZykgfCAwXG4gIHRoYXQgPSBhbGxvY2F0ZSh0aGF0LCBsZW5ndGgpXG5cbiAgdGhhdC53cml0ZShzdHJpbmcsIGVuY29kaW5nKVxuICByZXR1cm4gdGhhdFxufVxuXG5mdW5jdGlvbiBmcm9tT2JqZWN0ICh0aGF0LCBvYmplY3QpIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihvYmplY3QpKSByZXR1cm4gZnJvbUJ1ZmZlcih0aGF0LCBvYmplY3QpXG5cbiAgaWYgKGlzQXJyYXkob2JqZWN0KSkgcmV0dXJuIGZyb21BcnJheSh0aGF0LCBvYmplY3QpXG5cbiAgaWYgKG9iamVjdCA9PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignbXVzdCBzdGFydCB3aXRoIG51bWJlciwgYnVmZmVyLCBhcnJheSBvciBzdHJpbmcnKVxuICB9XG5cbiAgaWYgKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBpZiAob2JqZWN0LmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgICByZXR1cm4gZnJvbVR5cGVkQXJyYXkodGhhdCwgb2JqZWN0KVxuICAgIH1cbiAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICAgIHJldHVybiBmcm9tQXJyYXlCdWZmZXIodGhhdCwgb2JqZWN0KVxuICAgIH1cbiAgfVxuXG4gIGlmIChvYmplY3QubGVuZ3RoKSByZXR1cm4gZnJvbUFycmF5TGlrZSh0aGF0LCBvYmplY3QpXG5cbiAgcmV0dXJuIGZyb21Kc29uT2JqZWN0KHRoYXQsIG9iamVjdClcbn1cblxuZnVuY3Rpb24gZnJvbUJ1ZmZlciAodGhhdCwgYnVmZmVyKSB7XG4gIHZhciBsZW5ndGggPSBjaGVja2VkKGJ1ZmZlci5sZW5ndGgpIHwgMFxuICB0aGF0ID0gYWxsb2NhdGUodGhhdCwgbGVuZ3RoKVxuICBidWZmZXIuY29weSh0aGF0LCAwLCAwLCBsZW5ndGgpXG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21BcnJheSAodGhhdCwgYXJyYXkpIHtcbiAgdmFyIGxlbmd0aCA9IGNoZWNrZWQoYXJyYXkubGVuZ3RoKSB8IDBcbiAgdGhhdCA9IGFsbG9jYXRlKHRoYXQsIGxlbmd0aClcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgIHRoYXRbaV0gPSBhcnJheVtpXSAmIDI1NVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbi8vIER1cGxpY2F0ZSBvZiBmcm9tQXJyYXkoKSB0byBrZWVwIGZyb21BcnJheSgpIG1vbm9tb3JwaGljLlxuZnVuY3Rpb24gZnJvbVR5cGVkQXJyYXkgKHRoYXQsIGFycmF5KSB7XG4gIHZhciBsZW5ndGggPSBjaGVja2VkKGFycmF5Lmxlbmd0aCkgfCAwXG4gIHRoYXQgPSBhbGxvY2F0ZSh0aGF0LCBsZW5ndGgpXG4gIC8vIFRydW5jYXRpbmcgdGhlIGVsZW1lbnRzIGlzIHByb2JhYmx5IG5vdCB3aGF0IHBlb3BsZSBleHBlY3QgZnJvbSB0eXBlZFxuICAvLyBhcnJheXMgd2l0aCBCWVRFU19QRVJfRUxFTUVOVCA+IDEgYnV0IGl0J3MgY29tcGF0aWJsZSB3aXRoIHRoZSBiZWhhdmlvclxuICAvLyBvZiB0aGUgb2xkIEJ1ZmZlciBjb25zdHJ1Y3Rvci5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgIHRoYXRbaV0gPSBhcnJheVtpXSAmIDI1NVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21BcnJheUJ1ZmZlciAodGhhdCwgYXJyYXkpIHtcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2UsIGZvciBiZXN0IHBlcmZvcm1hbmNlXG4gICAgYXJyYXkuYnl0ZUxlbmd0aFxuICAgIHRoYXQgPSBCdWZmZXIuX2F1Z21lbnQobmV3IFVpbnQ4QXJyYXkoYXJyYXkpKVxuICB9IGVsc2Uge1xuICAgIC8vIEZhbGxiYWNrOiBSZXR1cm4gYW4gb2JqZWN0IGluc3RhbmNlIG9mIHRoZSBCdWZmZXIgY2xhc3NcbiAgICB0aGF0ID0gZnJvbVR5cGVkQXJyYXkodGhhdCwgbmV3IFVpbnQ4QXJyYXkoYXJyYXkpKVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21BcnJheUxpa2UgKHRoYXQsIGFycmF5KSB7XG4gIHZhciBsZW5ndGggPSBjaGVja2VkKGFycmF5Lmxlbmd0aCkgfCAwXG4gIHRoYXQgPSBhbGxvY2F0ZSh0aGF0LCBsZW5ndGgpXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICB0aGF0W2ldID0gYXJyYXlbaV0gJiAyNTVcbiAgfVxuICByZXR1cm4gdGhhdFxufVxuXG4vLyBEZXNlcmlhbGl6ZSB7IHR5cGU6ICdCdWZmZXInLCBkYXRhOiBbMSwyLDMsLi4uXSB9IGludG8gYSBCdWZmZXIgb2JqZWN0LlxuLy8gUmV0dXJucyBhIHplcm8tbGVuZ3RoIGJ1ZmZlciBmb3IgaW5wdXRzIHRoYXQgZG9uJ3QgY29uZm9ybSB0byB0aGUgc3BlYy5cbmZ1bmN0aW9uIGZyb21Kc29uT2JqZWN0ICh0aGF0LCBvYmplY3QpIHtcbiAgdmFyIGFycmF5XG4gIHZhciBsZW5ndGggPSAwXG5cbiAgaWYgKG9iamVjdC50eXBlID09PSAnQnVmZmVyJyAmJiBpc0FycmF5KG9iamVjdC5kYXRhKSkge1xuICAgIGFycmF5ID0gb2JqZWN0LmRhdGFcbiAgICBsZW5ndGggPSBjaGVja2VkKGFycmF5Lmxlbmd0aCkgfCAwXG4gIH1cbiAgdGhhdCA9IGFsbG9jYXRlKHRoYXQsIGxlbmd0aClcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgdGhhdFtpXSA9IGFycmF5W2ldICYgMjU1XG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gIEJ1ZmZlci5wcm90b3R5cGUuX19wcm90b19fID0gVWludDhBcnJheS5wcm90b3R5cGVcbiAgQnVmZmVyLl9fcHJvdG9fXyA9IFVpbnQ4QXJyYXlcbn0gZWxzZSB7XG4gIC8vIHByZS1zZXQgZm9yIHZhbHVlcyB0aGF0IG1heSBleGlzdCBpbiB0aGUgZnV0dXJlXG4gIEJ1ZmZlci5wcm90b3R5cGUubGVuZ3RoID0gdW5kZWZpbmVkXG4gIEJ1ZmZlci5wcm90b3R5cGUucGFyZW50ID0gdW5kZWZpbmVkXG59XG5cbmZ1bmN0aW9uIGFsbG9jYXRlICh0aGF0LCBsZW5ndGgpIHtcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2UsIGZvciBiZXN0IHBlcmZvcm1hbmNlXG4gICAgdGhhdCA9IEJ1ZmZlci5fYXVnbWVudChuZXcgVWludDhBcnJheShsZW5ndGgpKVxuICAgIHRoYXQuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICB9IGVsc2Uge1xuICAgIC8vIEZhbGxiYWNrOiBSZXR1cm4gYW4gb2JqZWN0IGluc3RhbmNlIG9mIHRoZSBCdWZmZXIgY2xhc3NcbiAgICB0aGF0Lmxlbmd0aCA9IGxlbmd0aFxuICAgIHRoYXQuX2lzQnVmZmVyID0gdHJ1ZVxuICB9XG5cbiAgdmFyIGZyb21Qb29sID0gbGVuZ3RoICE9PSAwICYmIGxlbmd0aCA8PSBCdWZmZXIucG9vbFNpemUgPj4+IDFcbiAgaWYgKGZyb21Qb29sKSB0aGF0LnBhcmVudCA9IHJvb3RQYXJlbnRcblxuICByZXR1cm4gdGhhdFxufVxuXG5mdW5jdGlvbiBjaGVja2VkIChsZW5ndGgpIHtcbiAgLy8gTm90ZTogY2Fubm90IHVzZSBgbGVuZ3RoIDwga01heExlbmd0aGAgaGVyZSBiZWNhdXNlIHRoYXQgZmFpbHMgd2hlblxuICAvLyBsZW5ndGggaXMgTmFOICh3aGljaCBpcyBvdGhlcndpc2UgY29lcmNlZCB0byB6ZXJvLilcbiAgaWYgKGxlbmd0aCA+PSBrTWF4TGVuZ3RoKCkpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQXR0ZW1wdCB0byBhbGxvY2F0ZSBCdWZmZXIgbGFyZ2VyIHRoYW4gbWF4aW11bSAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAnc2l6ZTogMHgnICsga01heExlbmd0aCgpLnRvU3RyaW5nKDE2KSArICcgYnl0ZXMnKVxuICB9XG4gIHJldHVybiBsZW5ndGggfCAwXG59XG5cbmZ1bmN0aW9uIFNsb3dCdWZmZXIgKHN1YmplY3QsIGVuY29kaW5nKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBTbG93QnVmZmVyKSkgcmV0dXJuIG5ldyBTbG93QnVmZmVyKHN1YmplY3QsIGVuY29kaW5nKVxuXG4gIHZhciBidWYgPSBuZXcgQnVmZmVyKHN1YmplY3QsIGVuY29kaW5nKVxuICBkZWxldGUgYnVmLnBhcmVudFxuICByZXR1cm4gYnVmXG59XG5cbkJ1ZmZlci5pc0J1ZmZlciA9IGZ1bmN0aW9uIGlzQnVmZmVyIChiKSB7XG4gIHJldHVybiAhIShiICE9IG51bGwgJiYgYi5faXNCdWZmZXIpXG59XG5cbkJ1ZmZlci5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZSAoYSwgYikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihhKSB8fCAhQnVmZmVyLmlzQnVmZmVyKGIpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnRzIG11c3QgYmUgQnVmZmVycycpXG4gIH1cblxuICBpZiAoYSA9PT0gYikgcmV0dXJuIDBcblxuICB2YXIgeCA9IGEubGVuZ3RoXG4gIHZhciB5ID0gYi5sZW5ndGhcblxuICB2YXIgaSA9IDBcbiAgdmFyIGxlbiA9IE1hdGgubWluKHgsIHkpXG4gIHdoaWxlIChpIDwgbGVuKSB7XG4gICAgaWYgKGFbaV0gIT09IGJbaV0pIGJyZWFrXG5cbiAgICArK2lcbiAgfVxuXG4gIGlmIChpICE9PSBsZW4pIHtcbiAgICB4ID0gYVtpXVxuICAgIHkgPSBiW2ldXG4gIH1cblxuICBpZiAoeCA8IHkpIHJldHVybiAtMVxuICBpZiAoeSA8IHgpIHJldHVybiAxXG4gIHJldHVybiAwXG59XG5cbkJ1ZmZlci5pc0VuY29kaW5nID0gZnVuY3Rpb24gaXNFbmNvZGluZyAoZW5jb2RpbmcpIHtcbiAgc3dpdGNoIChTdHJpbmcoZW5jb2RpbmcpLnRvTG93ZXJDYXNlKCkpIHtcbiAgICBjYXNlICdoZXgnOlxuICAgIGNhc2UgJ3V0ZjgnOlxuICAgIGNhc2UgJ3V0Zi04JzpcbiAgICBjYXNlICdhc2NpaSc6XG4gICAgY2FzZSAnYmluYXJ5JzpcbiAgICBjYXNlICdiYXNlNjQnOlxuICAgIGNhc2UgJ3Jhdyc6XG4gICAgY2FzZSAndWNzMic6XG4gICAgY2FzZSAndWNzLTInOlxuICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgIHJldHVybiB0cnVlXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbkJ1ZmZlci5jb25jYXQgPSBmdW5jdGlvbiBjb25jYXQgKGxpc3QsIGxlbmd0aCkge1xuICBpZiAoIWlzQXJyYXkobGlzdCkpIHRocm93IG5ldyBUeXBlRXJyb3IoJ2xpc3QgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzLicpXG5cbiAgaWYgKGxpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIG5ldyBCdWZmZXIoMClcbiAgfVxuXG4gIHZhciBpXG4gIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGxlbmd0aCA9IDBcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgbGVuZ3RoICs9IGxpc3RbaV0ubGVuZ3RoXG4gICAgfVxuICB9XG5cbiAgdmFyIGJ1ZiA9IG5ldyBCdWZmZXIobGVuZ3RoKVxuICB2YXIgcG9zID0gMFxuICBmb3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgIHZhciBpdGVtID0gbGlzdFtpXVxuICAgIGl0ZW0uY29weShidWYsIHBvcylcbiAgICBwb3MgKz0gaXRlbS5sZW5ndGhcbiAgfVxuICByZXR1cm4gYnVmXG59XG5cbmZ1bmN0aW9uIGJ5dGVMZW5ndGggKHN0cmluZywgZW5jb2RpbmcpIHtcbiAgaWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSBzdHJpbmcgPSAnJyArIHN0cmluZ1xuXG4gIHZhciBsZW4gPSBzdHJpbmcubGVuZ3RoXG4gIGlmIChsZW4gPT09IDApIHJldHVybiAwXG5cbiAgLy8gVXNlIGEgZm9yIGxvb3AgdG8gYXZvaWQgcmVjdXJzaW9uXG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG4gIGZvciAoOzspIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgLy8gRGVwcmVjYXRlZFxuICAgICAgY2FzZSAncmF3JzpcbiAgICAgIGNhc2UgJ3Jhd3MnOlxuICAgICAgICByZXR1cm4gbGVuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgcmV0dXJuIHV0ZjhUb0J5dGVzKHN0cmluZykubGVuZ3RoXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gbGVuICogMlxuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGxlbiA+Pj4gMVxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgcmV0dXJuIGJhc2U2NFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGhcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgcmV0dXJuIHV0ZjhUb0J5dGVzKHN0cmluZykubGVuZ3RoIC8vIGFzc3VtZSB1dGY4XG4gICAgICAgIGVuY29kaW5nID0gKCcnICsgZW5jb2RpbmcpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgfVxuICB9XG59XG5CdWZmZXIuYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGhcblxuZnVuY3Rpb24gc2xvd1RvU3RyaW5nIChlbmNvZGluZywgc3RhcnQsIGVuZCkge1xuICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZVxuXG4gIHN0YXJ0ID0gc3RhcnQgfCAwXG4gIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkIHx8IGVuZCA9PT0gSW5maW5pdHkgPyB0aGlzLmxlbmd0aCA6IGVuZCB8IDBcblxuICBpZiAoIWVuY29kaW5nKSBlbmNvZGluZyA9ICd1dGY4J1xuICBpZiAoc3RhcnQgPCAwKSBzdGFydCA9IDBcbiAgaWYgKGVuZCA+IHRoaXMubGVuZ3RoKSBlbmQgPSB0aGlzLmxlbmd0aFxuICBpZiAoZW5kIDw9IHN0YXJ0KSByZXR1cm4gJydcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBoZXhTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgcmV0dXJuIHV0ZjhTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICAgIHJldHVybiBhc2NpaVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiBiaW5hcnlTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICByZXR1cm4gYmFzZTY0U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIHV0ZjE2bGVTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICAgICAgZW5jb2RpbmcgPSAoZW5jb2RpbmcgKyAnJykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nICgpIHtcbiAgdmFyIGxlbmd0aCA9IHRoaXMubGVuZ3RoIHwgMFxuICBpZiAobGVuZ3RoID09PSAwKSByZXR1cm4gJydcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHJldHVybiB1dGY4U2xpY2UodGhpcywgMCwgbGVuZ3RoKVxuICByZXR1cm4gc2xvd1RvU3RyaW5nLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMgKGIpIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYikpIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXInKVxuICBpZiAodGhpcyA9PT0gYikgcmV0dXJuIHRydWVcbiAgcmV0dXJuIEJ1ZmZlci5jb21wYXJlKHRoaXMsIGIpID09PSAwXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5zcGVjdCA9IGZ1bmN0aW9uIGluc3BlY3QgKCkge1xuICB2YXIgc3RyID0gJydcbiAgdmFyIG1heCA9IGV4cG9ydHMuSU5TUEVDVF9NQVhfQllURVNcbiAgaWYgKHRoaXMubGVuZ3RoID4gMCkge1xuICAgIHN0ciA9IHRoaXMudG9TdHJpbmcoJ2hleCcsIDAsIG1heCkubWF0Y2goLy57Mn0vZykuam9pbignICcpXG4gICAgaWYgKHRoaXMubGVuZ3RoID4gbWF4KSBzdHIgKz0gJyAuLi4gJ1xuICB9XG4gIHJldHVybiAnPEJ1ZmZlciAnICsgc3RyICsgJz4nXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuY29tcGFyZSA9IGZ1bmN0aW9uIGNvbXBhcmUgKGIpIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYikpIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXInKVxuICBpZiAodGhpcyA9PT0gYikgcmV0dXJuIDBcbiAgcmV0dXJuIEJ1ZmZlci5jb21wYXJlKHRoaXMsIGIpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5kZXhPZiA9IGZ1bmN0aW9uIGluZGV4T2YgKHZhbCwgYnl0ZU9mZnNldCkge1xuICBpZiAoYnl0ZU9mZnNldCA+IDB4N2ZmZmZmZmYpIGJ5dGVPZmZzZXQgPSAweDdmZmZmZmZmXG4gIGVsc2UgaWYgKGJ5dGVPZmZzZXQgPCAtMHg4MDAwMDAwMCkgYnl0ZU9mZnNldCA9IC0weDgwMDAwMDAwXG4gIGJ5dGVPZmZzZXQgPj49IDBcblxuICBpZiAodGhpcy5sZW5ndGggPT09IDApIHJldHVybiAtMVxuICBpZiAoYnl0ZU9mZnNldCA+PSB0aGlzLmxlbmd0aCkgcmV0dXJuIC0xXG5cbiAgLy8gTmVnYXRpdmUgb2Zmc2V0cyBzdGFydCBmcm9tIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlclxuICBpZiAoYnl0ZU9mZnNldCA8IDApIGJ5dGVPZmZzZXQgPSBNYXRoLm1heCh0aGlzLmxlbmd0aCArIGJ5dGVPZmZzZXQsIDApXG5cbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKHZhbC5sZW5ndGggPT09IDApIHJldHVybiAtMSAvLyBzcGVjaWFsIGNhc2U6IGxvb2tpbmcgZm9yIGVtcHR5IHN0cmluZyBhbHdheXMgZmFpbHNcbiAgICByZXR1cm4gU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mLmNhbGwodGhpcywgdmFsLCBieXRlT2Zmc2V0KVxuICB9XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIodmFsKSkge1xuICAgIHJldHVybiBhcnJheUluZGV4T2YodGhpcywgdmFsLCBieXRlT2Zmc2V0KVxuICB9XG4gIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCAmJiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKHRoaXMsIHZhbCwgYnl0ZU9mZnNldClcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5SW5kZXhPZih0aGlzLCBbIHZhbCBdLCBieXRlT2Zmc2V0KVxuICB9XG5cbiAgZnVuY3Rpb24gYXJyYXlJbmRleE9mIChhcnIsIHZhbCwgYnl0ZU9mZnNldCkge1xuICAgIHZhciBmb3VuZEluZGV4ID0gLTFcbiAgICBmb3IgKHZhciBpID0gMDsgYnl0ZU9mZnNldCArIGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChhcnJbYnl0ZU9mZnNldCArIGldID09PSB2YWxbZm91bmRJbmRleCA9PT0gLTEgPyAwIDogaSAtIGZvdW5kSW5kZXhdKSB7XG4gICAgICAgIGlmIChmb3VuZEluZGV4ID09PSAtMSkgZm91bmRJbmRleCA9IGlcbiAgICAgICAgaWYgKGkgLSBmb3VuZEluZGV4ICsgMSA9PT0gdmFsLmxlbmd0aCkgcmV0dXJuIGJ5dGVPZmZzZXQgKyBmb3VuZEluZGV4XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3VuZEluZGV4ID0gLTFcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIC0xXG4gIH1cblxuICB0aHJvdyBuZXcgVHlwZUVycm9yKCd2YWwgbXVzdCBiZSBzdHJpbmcsIG51bWJlciBvciBCdWZmZXInKVxufVxuXG4vLyBgZ2V0YCBpcyBkZXByZWNhdGVkXG5CdWZmZXIucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIGdldCAob2Zmc2V0KSB7XG4gIGNvbnNvbGUubG9nKCcuZ2V0KCkgaXMgZGVwcmVjYXRlZC4gQWNjZXNzIHVzaW5nIGFycmF5IGluZGV4ZXMgaW5zdGVhZC4nKVxuICByZXR1cm4gdGhpcy5yZWFkVUludDgob2Zmc2V0KVxufVxuXG4vLyBgc2V0YCBpcyBkZXByZWNhdGVkXG5CdWZmZXIucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uIHNldCAodiwgb2Zmc2V0KSB7XG4gIGNvbnNvbGUubG9nKCcuc2V0KCkgaXMgZGVwcmVjYXRlZC4gQWNjZXNzIHVzaW5nIGFycmF5IGluZGV4ZXMgaW5zdGVhZC4nKVxuICByZXR1cm4gdGhpcy53cml0ZVVJbnQ4KHYsIG9mZnNldClcbn1cblxuZnVuY3Rpb24gaGV4V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICBvZmZzZXQgPSBOdW1iZXIob2Zmc2V0KSB8fCAwXG4gIHZhciByZW1haW5pbmcgPSBidWYubGVuZ3RoIC0gb2Zmc2V0XG4gIGlmICghbGVuZ3RoKSB7XG4gICAgbGVuZ3RoID0gcmVtYWluaW5nXG4gIH0gZWxzZSB7XG4gICAgbGVuZ3RoID0gTnVtYmVyKGxlbmd0aClcbiAgICBpZiAobGVuZ3RoID4gcmVtYWluaW5nKSB7XG4gICAgICBsZW5ndGggPSByZW1haW5pbmdcbiAgICB9XG4gIH1cblxuICAvLyBtdXN0IGJlIGFuIGV2ZW4gbnVtYmVyIG9mIGRpZ2l0c1xuICB2YXIgc3RyTGVuID0gc3RyaW5nLmxlbmd0aFxuICBpZiAoc3RyTGVuICUgMiAhPT0gMCkgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGhleCBzdHJpbmcnKVxuXG4gIGlmIChsZW5ndGggPiBzdHJMZW4gLyAyKSB7XG4gICAgbGVuZ3RoID0gc3RyTGVuIC8gMlxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcGFyc2VkID0gcGFyc2VJbnQoc3RyaW5nLnN1YnN0cihpICogMiwgMiksIDE2KVxuICAgIGlmIChpc05hTihwYXJzZWQpKSB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgaGV4IHN0cmluZycpXG4gICAgYnVmW29mZnNldCArIGldID0gcGFyc2VkXG4gIH1cbiAgcmV0dXJuIGlcbn1cblxuZnVuY3Rpb24gdXRmOFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIodXRmOFRvQnl0ZXMoc3RyaW5nLCBidWYubGVuZ3RoIC0gb2Zmc2V0KSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gYXNjaWlXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKGFzY2lpVG9CeXRlcyhzdHJpbmcpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBiaW5hcnlXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBhc2NpaVdyaXRlKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gYmFzZTY0V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcihiYXNlNjRUb0J5dGVzKHN0cmluZyksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIHVjczJXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKHV0ZjE2bGVUb0J5dGVzKHN0cmluZywgYnVmLmxlbmd0aCAtIG9mZnNldCksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiB3cml0ZSAoc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCwgZW5jb2RpbmcpIHtcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZylcbiAgaWYgKG9mZnNldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZW5jb2RpbmcgPSAndXRmOCdcbiAgICBsZW5ndGggPSB0aGlzLmxlbmd0aFxuICAgIG9mZnNldCA9IDBcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZywgZW5jb2RpbmcpXG4gIH0gZWxzZSBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICBlbmNvZGluZyA9IG9mZnNldFxuICAgIGxlbmd0aCA9IHRoaXMubGVuZ3RoXG4gICAgb2Zmc2V0ID0gMFxuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nLCBvZmZzZXRbLCBsZW5ndGhdWywgZW5jb2RpbmddKVxuICB9IGVsc2UgaWYgKGlzRmluaXRlKG9mZnNldCkpIHtcbiAgICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gICAgaWYgKGlzRmluaXRlKGxlbmd0aCkpIHtcbiAgICAgIGxlbmd0aCA9IGxlbmd0aCB8IDBcbiAgICAgIGlmIChlbmNvZGluZyA9PT0gdW5kZWZpbmVkKSBlbmNvZGluZyA9ICd1dGY4J1xuICAgIH0gZWxzZSB7XG4gICAgICBlbmNvZGluZyA9IGxlbmd0aFxuICAgICAgbGVuZ3RoID0gdW5kZWZpbmVkXG4gICAgfVxuICAvLyBsZWdhY3kgd3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0LCBsZW5ndGgpIC0gcmVtb3ZlIGluIHYwLjEzXG4gIH0gZWxzZSB7XG4gICAgdmFyIHN3YXAgPSBlbmNvZGluZ1xuICAgIGVuY29kaW5nID0gb2Zmc2V0XG4gICAgb2Zmc2V0ID0gbGVuZ3RoIHwgMFxuICAgIGxlbmd0aCA9IHN3YXBcbiAgfVxuXG4gIHZhciByZW1haW5pbmcgPSB0aGlzLmxlbmd0aCAtIG9mZnNldFxuICBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQgfHwgbGVuZ3RoID4gcmVtYWluaW5nKSBsZW5ndGggPSByZW1haW5pbmdcblxuICBpZiAoKHN0cmluZy5sZW5ndGggPiAwICYmIChsZW5ndGggPCAwIHx8IG9mZnNldCA8IDApKSB8fCBvZmZzZXQgPiB0aGlzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdhdHRlbXB0IHRvIHdyaXRlIG91dHNpZGUgYnVmZmVyIGJvdW5kcycpXG4gIH1cblxuICBpZiAoIWVuY29kaW5nKSBlbmNvZGluZyA9ICd1dGY4J1xuXG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG4gIGZvciAoOzspIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gaGV4V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgICByZXR1cm4gYXNjaWlXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gYmluYXJ5V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgLy8gV2FybmluZzogbWF4TGVuZ3RoIG5vdCB0YWtlbiBpbnRvIGFjY291bnQgaW4gYmFzZTY0V3JpdGVcbiAgICAgICAgcmV0dXJuIGJhc2U2NFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiB1Y3MyV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgICAgIGVuY29kaW5nID0gKCcnICsgZW5jb2RpbmcpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgfVxuICB9XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gdG9KU09OICgpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnQnVmZmVyJyxcbiAgICBkYXRhOiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLl9hcnIgfHwgdGhpcywgMClcbiAgfVxufVxuXG5mdW5jdGlvbiBiYXNlNjRTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIGlmIChzdGFydCA9PT0gMCAmJiBlbmQgPT09IGJ1Zi5sZW5ndGgpIHtcbiAgICByZXR1cm4gYmFzZTY0LmZyb21CeXRlQXJyYXkoYnVmKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBiYXNlNjQuZnJvbUJ5dGVBcnJheShidWYuc2xpY2Uoc3RhcnQsIGVuZCkpXG4gIH1cbn1cblxuZnVuY3Rpb24gdXRmOFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuICB2YXIgcmVzID0gW11cblxuICB2YXIgaSA9IHN0YXJ0XG4gIHdoaWxlIChpIDwgZW5kKSB7XG4gICAgdmFyIGZpcnN0Qnl0ZSA9IGJ1ZltpXVxuICAgIHZhciBjb2RlUG9pbnQgPSBudWxsXG4gICAgdmFyIGJ5dGVzUGVyU2VxdWVuY2UgPSAoZmlyc3RCeXRlID4gMHhFRikgPyA0XG4gICAgICA6IChmaXJzdEJ5dGUgPiAweERGKSA/IDNcbiAgICAgIDogKGZpcnN0Qnl0ZSA+IDB4QkYpID8gMlxuICAgICAgOiAxXG5cbiAgICBpZiAoaSArIGJ5dGVzUGVyU2VxdWVuY2UgPD0gZW5kKSB7XG4gICAgICB2YXIgc2Vjb25kQnl0ZSwgdGhpcmRCeXRlLCBmb3VydGhCeXRlLCB0ZW1wQ29kZVBvaW50XG5cbiAgICAgIHN3aXRjaCAoYnl0ZXNQZXJTZXF1ZW5jZSkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgaWYgKGZpcnN0Qnl0ZSA8IDB4ODApIHtcbiAgICAgICAgICAgIGNvZGVQb2ludCA9IGZpcnN0Qnl0ZVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweDFGKSA8PCAweDYgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4N0YpIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICB0aGlyZEJ5dGUgPSBidWZbaSArIDJdXG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKHRoaXJkQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4RikgPDwgMHhDIHwgKHNlY29uZEJ5dGUgJiAweDNGKSA8PCAweDYgfCAodGhpcmRCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHg3RkYgJiYgKHRlbXBDb2RlUG9pbnQgPCAweEQ4MDAgfHwgdGVtcENvZGVQb2ludCA+IDB4REZGRikpIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICB0aGlyZEJ5dGUgPSBidWZbaSArIDJdXG4gICAgICAgICAgZm91cnRoQnl0ZSA9IGJ1ZltpICsgM11cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAodGhpcmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKGZvdXJ0aEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweEYpIDw8IDB4MTIgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpIDw8IDB4QyB8ICh0aGlyZEJ5dGUgJiAweDNGKSA8PCAweDYgfCAoZm91cnRoQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4RkZGRiAmJiB0ZW1wQ29kZVBvaW50IDwgMHgxMTAwMDApIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29kZVBvaW50ID09PSBudWxsKSB7XG4gICAgICAvLyB3ZSBkaWQgbm90IGdlbmVyYXRlIGEgdmFsaWQgY29kZVBvaW50IHNvIGluc2VydCBhXG4gICAgICAvLyByZXBsYWNlbWVudCBjaGFyIChVK0ZGRkQpIGFuZCBhZHZhbmNlIG9ubHkgMSBieXRlXG4gICAgICBjb2RlUG9pbnQgPSAweEZGRkRcbiAgICAgIGJ5dGVzUGVyU2VxdWVuY2UgPSAxXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPiAweEZGRkYpIHtcbiAgICAgIC8vIGVuY29kZSB0byB1dGYxNiAoc3Vycm9nYXRlIHBhaXIgZGFuY2UpXG4gICAgICBjb2RlUG9pbnQgLT0gMHgxMDAwMFxuICAgICAgcmVzLnB1c2goY29kZVBvaW50ID4+PiAxMCAmIDB4M0ZGIHwgMHhEODAwKVxuICAgICAgY29kZVBvaW50ID0gMHhEQzAwIHwgY29kZVBvaW50ICYgMHgzRkZcbiAgICB9XG5cbiAgICByZXMucHVzaChjb2RlUG9pbnQpXG4gICAgaSArPSBieXRlc1BlclNlcXVlbmNlXG4gIH1cblxuICByZXR1cm4gZGVjb2RlQ29kZVBvaW50c0FycmF5KHJlcylcbn1cblxuLy8gQmFzZWQgb24gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjI3NDcyNzIvNjgwNzQyLCB0aGUgYnJvd3NlciB3aXRoXG4vLyB0aGUgbG93ZXN0IGxpbWl0IGlzIENocm9tZSwgd2l0aCAweDEwMDAwIGFyZ3MuXG4vLyBXZSBnbyAxIG1hZ25pdHVkZSBsZXNzLCBmb3Igc2FmZXR5XG52YXIgTUFYX0FSR1VNRU5UU19MRU5HVEggPSAweDEwMDBcblxuZnVuY3Rpb24gZGVjb2RlQ29kZVBvaW50c0FycmF5IChjb2RlUG9pbnRzKSB7XG4gIHZhciBsZW4gPSBjb2RlUG9pbnRzLmxlbmd0aFxuICBpZiAobGVuIDw9IE1BWF9BUkdVTUVOVFNfTEVOR1RIKSB7XG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLCBjb2RlUG9pbnRzKSAvLyBhdm9pZCBleHRyYSBzbGljZSgpXG4gIH1cblxuICAvLyBEZWNvZGUgaW4gY2h1bmtzIHRvIGF2b2lkIFwiY2FsbCBzdGFjayBzaXplIGV4Y2VlZGVkXCIuXG4gIHZhciByZXMgPSAnJ1xuICB2YXIgaSA9IDBcbiAgd2hpbGUgKGkgPCBsZW4pIHtcbiAgICByZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShcbiAgICAgIFN0cmluZyxcbiAgICAgIGNvZGVQb2ludHMuc2xpY2UoaSwgaSArPSBNQVhfQVJHVU1FTlRTX0xFTkdUSClcbiAgICApXG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5mdW5jdGlvbiBhc2NpaVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHJldCA9ICcnXG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcblxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykge1xuICAgIHJldCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSAmIDB4N0YpXG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG5mdW5jdGlvbiBiaW5hcnlTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciByZXQgPSAnJ1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG5cbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHtcbiAgICByZXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0pXG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG5mdW5jdGlvbiBoZXhTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciBsZW4gPSBidWYubGVuZ3RoXG5cbiAgaWYgKCFzdGFydCB8fCBzdGFydCA8IDApIHN0YXJ0ID0gMFxuICBpZiAoIWVuZCB8fCBlbmQgPCAwIHx8IGVuZCA+IGxlbikgZW5kID0gbGVuXG5cbiAgdmFyIG91dCA9ICcnXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7XG4gICAgb3V0ICs9IHRvSGV4KGJ1ZltpXSlcbiAgfVxuICByZXR1cm4gb3V0XG59XG5cbmZ1bmN0aW9uIHV0ZjE2bGVTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciBieXRlcyA9IGJ1Zi5zbGljZShzdGFydCwgZW5kKVxuICB2YXIgcmVzID0gJydcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkgKz0gMikge1xuICAgIHJlcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGVzW2ldICsgYnl0ZXNbaSArIDFdICogMjU2KVxuICB9XG4gIHJldHVybiByZXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zbGljZSA9IGZ1bmN0aW9uIHNsaWNlIChzdGFydCwgZW5kKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBzdGFydCA9IH5+c3RhcnRcbiAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyBsZW4gOiB+fmVuZFxuXG4gIGlmIChzdGFydCA8IDApIHtcbiAgICBzdGFydCArPSBsZW5cbiAgICBpZiAoc3RhcnQgPCAwKSBzdGFydCA9IDBcbiAgfSBlbHNlIGlmIChzdGFydCA+IGxlbikge1xuICAgIHN0YXJ0ID0gbGVuXG4gIH1cblxuICBpZiAoZW5kIDwgMCkge1xuICAgIGVuZCArPSBsZW5cbiAgICBpZiAoZW5kIDwgMCkgZW5kID0gMFxuICB9IGVsc2UgaWYgKGVuZCA+IGxlbikge1xuICAgIGVuZCA9IGxlblxuICB9XG5cbiAgaWYgKGVuZCA8IHN0YXJ0KSBlbmQgPSBzdGFydFxuXG4gIHZhciBuZXdCdWZcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgbmV3QnVmID0gQnVmZmVyLl9hdWdtZW50KHRoaXMuc3ViYXJyYXkoc3RhcnQsIGVuZCkpXG4gIH0gZWxzZSB7XG4gICAgdmFyIHNsaWNlTGVuID0gZW5kIC0gc3RhcnRcbiAgICBuZXdCdWYgPSBuZXcgQnVmZmVyKHNsaWNlTGVuLCB1bmRlZmluZWQpXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzbGljZUxlbjsgaSsrKSB7XG4gICAgICBuZXdCdWZbaV0gPSB0aGlzW2kgKyBzdGFydF1cbiAgICB9XG4gIH1cblxuICBpZiAobmV3QnVmLmxlbmd0aCkgbmV3QnVmLnBhcmVudCA9IHRoaXMucGFyZW50IHx8IHRoaXNcblxuICByZXR1cm4gbmV3QnVmXG59XG5cbi8qXG4gKiBOZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IGJ1ZmZlciBpc24ndCB0cnlpbmcgdG8gd3JpdGUgb3V0IG9mIGJvdW5kcy5cbiAqL1xuZnVuY3Rpb24gY2hlY2tPZmZzZXQgKG9mZnNldCwgZXh0LCBsZW5ndGgpIHtcbiAgaWYgKChvZmZzZXQgJSAxKSAhPT0gMCB8fCBvZmZzZXQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignb2Zmc2V0IGlzIG5vdCB1aW50JylcbiAgaWYgKG9mZnNldCArIGV4dCA+IGxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RyeWluZyB0byBhY2Nlc3MgYmV5b25kIGJ1ZmZlciBsZW5ndGgnKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50TEUgPSBmdW5jdGlvbiByZWFkVUludExFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XVxuICB2YXIgbXVsID0gMVxuICB2YXIgaSA9IDBcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyBpXSAqIG11bFxuICB9XG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50QkUgPSBmdW5jdGlvbiByZWFkVUludEJFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuICB9XG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgLS1ieXRlTGVuZ3RoXVxuICB2YXIgbXVsID0gMVxuICB3aGlsZSAoYnl0ZUxlbmd0aCA+IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyAtLWJ5dGVMZW5ndGhdICogbXVsXG4gIH1cblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQ4ID0gZnVuY3Rpb24gcmVhZFVJbnQ4IChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMSwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiB0aGlzW29mZnNldF1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDE2TEUgPSBmdW5jdGlvbiByZWFkVUludDE2TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIHRoaXNbb2Zmc2V0XSB8ICh0aGlzW29mZnNldCArIDFdIDw8IDgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQxNkJFID0gZnVuY3Rpb24gcmVhZFVJbnQxNkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiAodGhpc1tvZmZzZXRdIDw8IDgpIHwgdGhpc1tvZmZzZXQgKyAxXVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJMRSA9IGZ1bmN0aW9uIHJlYWRVSW50MzJMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAoKHRoaXNbb2Zmc2V0XSkgfFxuICAgICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOCkgfFxuICAgICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgMTYpKSArXG4gICAgICAodGhpc1tvZmZzZXQgKyAzXSAqIDB4MTAwMDAwMClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDMyQkUgPSBmdW5jdGlvbiByZWFkVUludDMyQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSAqIDB4MTAwMDAwMCkgK1xuICAgICgodGhpc1tvZmZzZXQgKyAxXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDgpIHxcbiAgICB0aGlzW29mZnNldCArIDNdKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnRMRSA9IGZ1bmN0aW9uIHJlYWRJbnRMRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldF1cbiAgdmFyIG11bCA9IDFcbiAgdmFyIGkgPSAwXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgaV0gKiBtdWxcbiAgfVxuICBtdWwgKj0gMHg4MFxuXG4gIGlmICh2YWwgPj0gbXVsKSB2YWwgLT0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpXG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnRCRSA9IGZ1bmN0aW9uIHJlYWRJbnRCRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aFxuICB2YXIgbXVsID0gMVxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAtLWldXG4gIHdoaWxlIChpID4gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIC0taV0gKiBtdWxcbiAgfVxuICBtdWwgKj0gMHg4MFxuXG4gIGlmICh2YWwgPj0gbXVsKSB2YWwgLT0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpXG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQ4ID0gZnVuY3Rpb24gcmVhZEludDggKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAxLCB0aGlzLmxlbmd0aClcbiAgaWYgKCEodGhpc1tvZmZzZXRdICYgMHg4MCkpIHJldHVybiAodGhpc1tvZmZzZXRdKVxuICByZXR1cm4gKCgweGZmIC0gdGhpc1tvZmZzZXRdICsgMSkgKiAtMSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MTZMRSA9IGZ1bmN0aW9uIHJlYWRJbnQxNkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldF0gfCAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KVxuICByZXR1cm4gKHZhbCAmIDB4ODAwMCkgPyB2YWwgfCAweEZGRkYwMDAwIDogdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDE2QkUgPSBmdW5jdGlvbiByZWFkSW50MTZCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAxXSB8ICh0aGlzW29mZnNldF0gPDwgOClcbiAgcmV0dXJuICh2YWwgJiAweDgwMDApID8gdmFsIHwgMHhGRkZGMDAwMCA6IHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQzMkxFID0gZnVuY3Rpb24gcmVhZEludDMyTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSkgfFxuICAgICh0aGlzW29mZnNldCArIDFdIDw8IDgpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDNdIDw8IDI0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQzMkJFID0gZnVuY3Rpb24gcmVhZEludDMyQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSA8PCAyNCkgfFxuICAgICh0aGlzW29mZnNldCArIDFdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgOCkgfFxuICAgICh0aGlzW29mZnNldCArIDNdKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdExFID0gZnVuY3Rpb24gcmVhZEZsb2F0TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIHRydWUsIDIzLCA0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdEJFID0gZnVuY3Rpb24gcmVhZEZsb2F0QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIGZhbHNlLCAyMywgNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRG91YmxlTEUgPSBmdW5jdGlvbiByZWFkRG91YmxlTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA4LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIHRydWUsIDUyLCA4KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVCRSA9IGZ1bmN0aW9uIHJlYWREb3VibGVCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDgsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgZmFsc2UsIDUyLCA4KVxufVxuXG5mdW5jdGlvbiBjaGVja0ludCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBleHQsIG1heCwgbWluKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGJ1ZikpIHRocm93IG5ldyBUeXBlRXJyb3IoJ2J1ZmZlciBtdXN0IGJlIGEgQnVmZmVyIGluc3RhbmNlJylcbiAgaWYgKHZhbHVlID4gbWF4IHx8IHZhbHVlIDwgbWluKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcigndmFsdWUgaXMgb3V0IG9mIGJvdW5kcycpXG4gIGlmIChvZmZzZXQgKyBleHQgPiBidWYubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignaW5kZXggb3V0IG9mIHJhbmdlJylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnRMRSA9IGZ1bmN0aW9uIHdyaXRlVUludExFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCksIDApXG5cbiAgdmFyIG11bCA9IDFcbiAgdmFyIGkgPSAwXG4gIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAodmFsdWUgLyBtdWwpICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnRCRSA9IGZ1bmN0aW9uIHdyaXRlVUludEJFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCksIDApXG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoIC0gMVxuICB2YXIgbXVsID0gMVxuICB0aGlzW29mZnNldCArIGldID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgtLWkgPj0gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAodmFsdWUgLyBtdWwpICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQ4ID0gZnVuY3Rpb24gd3JpdGVVSW50OCAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAxLCAweGZmLCAwKVxuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB2YWx1ZSA9IE1hdGguZmxvb3IodmFsdWUpXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyAxXG59XG5cbmZ1bmN0aW9uIG9iamVjdFdyaXRlVUludDE2IChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbikge1xuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmZmZiArIHZhbHVlICsgMVxuICBmb3IgKHZhciBpID0gMCwgaiA9IE1hdGgubWluKGJ1Zi5sZW5ndGggLSBvZmZzZXQsIDIpOyBpIDwgajsgaSsrKSB7XG4gICAgYnVmW29mZnNldCArIGldID0gKHZhbHVlICYgKDB4ZmYgPDwgKDggKiAobGl0dGxlRW5kaWFuID8gaSA6IDEgLSBpKSkpKSA+Pj5cbiAgICAgIChsaXR0bGVFbmRpYW4gPyBpIDogMSAtIGkpICogOFxuICB9XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MTZMRSA9IGZ1bmN0aW9uIHdyaXRlVUludDE2TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHhmZmZmLCAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2QkUgPSBmdW5jdGlvbiB3cml0ZVVJbnQxNkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4ZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbmZ1bmN0aW9uIG9iamVjdFdyaXRlVUludDMyIChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbikge1xuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmZmZmZmZmYgKyB2YWx1ZSArIDFcbiAgZm9yICh2YXIgaSA9IDAsIGogPSBNYXRoLm1pbihidWYubGVuZ3RoIC0gb2Zmc2V0LCA0KTsgaSA8IGo7IGkrKykge1xuICAgIGJ1ZltvZmZzZXQgKyBpXSA9ICh2YWx1ZSA+Pj4gKGxpdHRsZUVuZGlhbiA/IGkgOiAzIC0gaSkgKiA4KSAmIDB4ZmZcbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDMyTEUgPSBmdW5jdGlvbiB3cml0ZVVJbnQzMkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4ZmZmZmZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgPj4+IDI0KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MzJCRSA9IGZ1bmN0aW9uIHdyaXRlVUludDMyQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHhmZmZmZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiAyNClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnRMRSA9IGZ1bmN0aW9uIHdyaXRlSW50TEUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBsaW1pdCA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoIC0gMSlcblxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIGxpbWl0IC0gMSwgLWxpbWl0KVxuICB9XG5cbiAgdmFyIGkgPSAwXG4gIHZhciBtdWwgPSAxXG4gIHZhciBzdWIgPSB2YWx1ZSA8IDAgPyAxIDogMFxuICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB0aGlzW29mZnNldCArIGldID0gKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50QkUgPSBmdW5jdGlvbiB3cml0ZUludEJFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbGltaXQgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCAtIDEpXG5cbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBsaW1pdCAtIDEsIC1saW1pdClcbiAgfVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aCAtIDFcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHN1YiA9IHZhbHVlIDwgMCA/IDEgOiAwXG4gIHRoaXNbb2Zmc2V0ICsgaV0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKC0taSA+PSAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICgodmFsdWUgLyBtdWwpID4+IDApIC0gc3ViICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDggPSBmdW5jdGlvbiB3cml0ZUludDggKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMSwgMHg3ZiwgLTB4ODApXG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHZhbHVlID0gTWF0aC5mbG9vcih2YWx1ZSlcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmICsgdmFsdWUgKyAxXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyAxXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQxNkxFID0gZnVuY3Rpb24gd3JpdGVJbnQxNkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4N2ZmZiwgLTB4ODAwMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2QkUgPSBmdW5jdGlvbiB3cml0ZUludDE2QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHg3ZmZmLCAtMHg4MDAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyTEUgPSBmdW5jdGlvbiB3cml0ZUludDMyTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlID4+PiAyNClcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQzMkJFID0gZnVuY3Rpb24gd3JpdGVJbnQzMkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwKVxuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmZmZmZmZmYgKyB2YWx1ZSArIDFcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiAyNClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbmZ1bmN0aW9uIGNoZWNrSUVFRTc1NCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBleHQsIG1heCwgbWluKSB7XG4gIGlmICh2YWx1ZSA+IG1heCB8fCB2YWx1ZSA8IG1pbikgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3ZhbHVlIGlzIG91dCBvZiBib3VuZHMnKVxuICBpZiAob2Zmc2V0ICsgZXh0ID4gYnVmLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ2luZGV4IG91dCBvZiByYW5nZScpXG4gIGlmIChvZmZzZXQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignaW5kZXggb3V0IG9mIHJhbmdlJylcbn1cblxuZnVuY3Rpb24gd3JpdGVGbG9hdCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja0lFRUU3NTQoYnVmLCB2YWx1ZSwgb2Zmc2V0LCA0LCAzLjQwMjgyMzQ2NjM4NTI4ODZlKzM4LCAtMy40MDI4MjM0NjYzODUyODg2ZSszOClcbiAgfVxuICBpZWVlNzU0LndyaXRlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCAyMywgNClcbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0TEUgPSBmdW5jdGlvbiB3cml0ZUZsb2F0TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZUZsb2F0KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXRCRSA9IGZ1bmN0aW9uIHdyaXRlRmxvYXRCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRmxvYXQodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KVxufVxuXG5mdW5jdGlvbiB3cml0ZURvdWJsZSAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja0lFRUU3NTQoYnVmLCB2YWx1ZSwgb2Zmc2V0LCA4LCAxLjc5NzY5MzEzNDg2MjMxNTdFKzMwOCwgLTEuNzk3NjkzMTM0ODYyMzE1N0UrMzA4KVxuICB9XG4gIGllZWU3NTQud3JpdGUoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIDUyLCA4KVxuICByZXR1cm4gb2Zmc2V0ICsgOFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRG91YmxlTEUgPSBmdW5jdGlvbiB3cml0ZURvdWJsZUxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVEb3VibGUodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSwgbm9Bc3NlcnQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVEb3VibGVCRSA9IGZ1bmN0aW9uIHdyaXRlRG91YmxlQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZURvdWJsZSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSwgbm9Bc3NlcnQpXG59XG5cbi8vIGNvcHkodGFyZ2V0QnVmZmVyLCB0YXJnZXRTdGFydD0wLCBzb3VyY2VTdGFydD0wLCBzb3VyY2VFbmQ9YnVmZmVyLmxlbmd0aClcbkJ1ZmZlci5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uIGNvcHkgKHRhcmdldCwgdGFyZ2V0U3RhcnQsIHN0YXJ0LCBlbmQpIHtcbiAgaWYgKCFzdGFydCkgc3RhcnQgPSAwXG4gIGlmICghZW5kICYmIGVuZCAhPT0gMCkgZW5kID0gdGhpcy5sZW5ndGhcbiAgaWYgKHRhcmdldFN0YXJ0ID49IHRhcmdldC5sZW5ndGgpIHRhcmdldFN0YXJ0ID0gdGFyZ2V0Lmxlbmd0aFxuICBpZiAoIXRhcmdldFN0YXJ0KSB0YXJnZXRTdGFydCA9IDBcbiAgaWYgKGVuZCA+IDAgJiYgZW5kIDwgc3RhcnQpIGVuZCA9IHN0YXJ0XG5cbiAgLy8gQ29weSAwIGJ5dGVzOyB3ZSdyZSBkb25lXG4gIGlmIChlbmQgPT09IHN0YXJ0KSByZXR1cm4gMFxuICBpZiAodGFyZ2V0Lmxlbmd0aCA9PT0gMCB8fCB0aGlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDBcblxuICAvLyBGYXRhbCBlcnJvciBjb25kaXRpb25zXG4gIGlmICh0YXJnZXRTdGFydCA8IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigndGFyZ2V0U3RhcnQgb3V0IG9mIGJvdW5kcycpXG4gIH1cbiAgaWYgKHN0YXJ0IDwgMCB8fCBzdGFydCA+PSB0aGlzLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3NvdXJjZVN0YXJ0IG91dCBvZiBib3VuZHMnKVxuICBpZiAoZW5kIDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3NvdXJjZUVuZCBvdXQgb2YgYm91bmRzJylcblxuICAvLyBBcmUgd2Ugb29iP1xuICBpZiAoZW5kID4gdGhpcy5sZW5ndGgpIGVuZCA9IHRoaXMubGVuZ3RoXG4gIGlmICh0YXJnZXQubGVuZ3RoIC0gdGFyZ2V0U3RhcnQgPCBlbmQgLSBzdGFydCkge1xuICAgIGVuZCA9IHRhcmdldC5sZW5ndGggLSB0YXJnZXRTdGFydCArIHN0YXJ0XG4gIH1cblxuICB2YXIgbGVuID0gZW5kIC0gc3RhcnRcbiAgdmFyIGlcblxuICBpZiAodGhpcyA9PT0gdGFyZ2V0ICYmIHN0YXJ0IDwgdGFyZ2V0U3RhcnQgJiYgdGFyZ2V0U3RhcnQgPCBlbmQpIHtcbiAgICAvLyBkZXNjZW5kaW5nIGNvcHkgZnJvbSBlbmRcbiAgICBmb3IgKGkgPSBsZW4gLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdGFyZ2V0W2kgKyB0YXJnZXRTdGFydF0gPSB0aGlzW2kgKyBzdGFydF1cbiAgICB9XG4gIH0gZWxzZSBpZiAobGVuIDwgMTAwMCB8fCAhQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICAvLyBhc2NlbmRpbmcgY29weSBmcm9tIHN0YXJ0XG4gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICB0YXJnZXRbaSArIHRhcmdldFN0YXJ0XSA9IHRoaXNbaSArIHN0YXJ0XVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0YXJnZXQuX3NldCh0aGlzLnN1YmFycmF5KHN0YXJ0LCBzdGFydCArIGxlbiksIHRhcmdldFN0YXJ0KVxuICB9XG5cbiAgcmV0dXJuIGxlblxufVxuXG4vLyBmaWxsKHZhbHVlLCBzdGFydD0wLCBlbmQ9YnVmZmVyLmxlbmd0aClcbkJ1ZmZlci5wcm90b3R5cGUuZmlsbCA9IGZ1bmN0aW9uIGZpbGwgKHZhbHVlLCBzdGFydCwgZW5kKSB7XG4gIGlmICghdmFsdWUpIHZhbHVlID0gMFxuICBpZiAoIXN0YXJ0KSBzdGFydCA9IDBcbiAgaWYgKCFlbmQpIGVuZCA9IHRoaXMubGVuZ3RoXG5cbiAgaWYgKGVuZCA8IHN0YXJ0KSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignZW5kIDwgc3RhcnQnKVxuXG4gIC8vIEZpbGwgMCBieXRlczsgd2UncmUgZG9uZVxuICBpZiAoZW5kID09PSBzdGFydCkgcmV0dXJuXG4gIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuXG5cbiAgaWYgKHN0YXJ0IDwgMCB8fCBzdGFydCA+PSB0aGlzLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3N0YXJ0IG91dCBvZiBib3VuZHMnKVxuICBpZiAoZW5kIDwgMCB8fCBlbmQgPiB0aGlzLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ2VuZCBvdXQgb2YgYm91bmRzJylcblxuICB2YXIgaVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIGZvciAoaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHtcbiAgICAgIHRoaXNbaV0gPSB2YWx1ZVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YXIgYnl0ZXMgPSB1dGY4VG9CeXRlcyh2YWx1ZS50b1N0cmluZygpKVxuICAgIHZhciBsZW4gPSBieXRlcy5sZW5ndGhcbiAgICBmb3IgKGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7XG4gICAgICB0aGlzW2ldID0gYnl0ZXNbaSAlIGxlbl1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpc1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgYEFycmF5QnVmZmVyYCB3aXRoIHRoZSAqY29waWVkKiBtZW1vcnkgb2YgdGhlIGJ1ZmZlciBpbnN0YW5jZS5cbiAqIEFkZGVkIGluIE5vZGUgMC4xMi4gT25seSBhdmFpbGFibGUgaW4gYnJvd3NlcnMgdGhhdCBzdXBwb3J0IEFycmF5QnVmZmVyLlxuICovXG5CdWZmZXIucHJvdG90eXBlLnRvQXJyYXlCdWZmZXIgPSBmdW5jdGlvbiB0b0FycmF5QnVmZmVyICgpIHtcbiAgaWYgKHR5cGVvZiBVaW50OEFycmF5ICE9PSAndW5kZWZpbmVkJykge1xuICAgIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgICAgcmV0dXJuIChuZXcgQnVmZmVyKHRoaXMpKS5idWZmZXJcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGJ1ZiA9IG5ldyBVaW50OEFycmF5KHRoaXMubGVuZ3RoKVxuICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGJ1Zi5sZW5ndGg7IGkgPCBsZW47IGkgKz0gMSkge1xuICAgICAgICBidWZbaV0gPSB0aGlzW2ldXG4gICAgICB9XG4gICAgICByZXR1cm4gYnVmLmJ1ZmZlclxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdCdWZmZXIudG9BcnJheUJ1ZmZlciBub3Qgc3VwcG9ydGVkIGluIHRoaXMgYnJvd3NlcicpXG4gIH1cbn1cblxuLy8gSEVMUEVSIEZVTkNUSU9OU1xuLy8gPT09PT09PT09PT09PT09PVxuXG52YXIgQlAgPSBCdWZmZXIucHJvdG90eXBlXG5cbi8qKlxuICogQXVnbWVudCBhIFVpbnQ4QXJyYXkgKmluc3RhbmNlKiAobm90IHRoZSBVaW50OEFycmF5IGNsYXNzISkgd2l0aCBCdWZmZXIgbWV0aG9kc1xuICovXG5CdWZmZXIuX2F1Z21lbnQgPSBmdW5jdGlvbiBfYXVnbWVudCAoYXJyKSB7XG4gIGFyci5jb25zdHJ1Y3RvciA9IEJ1ZmZlclxuICBhcnIuX2lzQnVmZmVyID0gdHJ1ZVxuXG4gIC8vIHNhdmUgcmVmZXJlbmNlIHRvIG9yaWdpbmFsIFVpbnQ4QXJyYXkgc2V0IG1ldGhvZCBiZWZvcmUgb3ZlcndyaXRpbmdcbiAgYXJyLl9zZXQgPSBhcnIuc2V0XG5cbiAgLy8gZGVwcmVjYXRlZFxuICBhcnIuZ2V0ID0gQlAuZ2V0XG4gIGFyci5zZXQgPSBCUC5zZXRcblxuICBhcnIud3JpdGUgPSBCUC53cml0ZVxuICBhcnIudG9TdHJpbmcgPSBCUC50b1N0cmluZ1xuICBhcnIudG9Mb2NhbGVTdHJpbmcgPSBCUC50b1N0cmluZ1xuICBhcnIudG9KU09OID0gQlAudG9KU09OXG4gIGFyci5lcXVhbHMgPSBCUC5lcXVhbHNcbiAgYXJyLmNvbXBhcmUgPSBCUC5jb21wYXJlXG4gIGFyci5pbmRleE9mID0gQlAuaW5kZXhPZlxuICBhcnIuY29weSA9IEJQLmNvcHlcbiAgYXJyLnNsaWNlID0gQlAuc2xpY2VcbiAgYXJyLnJlYWRVSW50TEUgPSBCUC5yZWFkVUludExFXG4gIGFyci5yZWFkVUludEJFID0gQlAucmVhZFVJbnRCRVxuICBhcnIucmVhZFVJbnQ4ID0gQlAucmVhZFVJbnQ4XG4gIGFyci5yZWFkVUludDE2TEUgPSBCUC5yZWFkVUludDE2TEVcbiAgYXJyLnJlYWRVSW50MTZCRSA9IEJQLnJlYWRVSW50MTZCRVxuICBhcnIucmVhZFVJbnQzMkxFID0gQlAucmVhZFVJbnQzMkxFXG4gIGFyci5yZWFkVUludDMyQkUgPSBCUC5yZWFkVUludDMyQkVcbiAgYXJyLnJlYWRJbnRMRSA9IEJQLnJlYWRJbnRMRVxuICBhcnIucmVhZEludEJFID0gQlAucmVhZEludEJFXG4gIGFyci5yZWFkSW50OCA9IEJQLnJlYWRJbnQ4XG4gIGFyci5yZWFkSW50MTZMRSA9IEJQLnJlYWRJbnQxNkxFXG4gIGFyci5yZWFkSW50MTZCRSA9IEJQLnJlYWRJbnQxNkJFXG4gIGFyci5yZWFkSW50MzJMRSA9IEJQLnJlYWRJbnQzMkxFXG4gIGFyci5yZWFkSW50MzJCRSA9IEJQLnJlYWRJbnQzMkJFXG4gIGFyci5yZWFkRmxvYXRMRSA9IEJQLnJlYWRGbG9hdExFXG4gIGFyci5yZWFkRmxvYXRCRSA9IEJQLnJlYWRGbG9hdEJFXG4gIGFyci5yZWFkRG91YmxlTEUgPSBCUC5yZWFkRG91YmxlTEVcbiAgYXJyLnJlYWREb3VibGVCRSA9IEJQLnJlYWREb3VibGVCRVxuICBhcnIud3JpdGVVSW50OCA9IEJQLndyaXRlVUludDhcbiAgYXJyLndyaXRlVUludExFID0gQlAud3JpdGVVSW50TEVcbiAgYXJyLndyaXRlVUludEJFID0gQlAud3JpdGVVSW50QkVcbiAgYXJyLndyaXRlVUludDE2TEUgPSBCUC53cml0ZVVJbnQxNkxFXG4gIGFyci53cml0ZVVJbnQxNkJFID0gQlAud3JpdGVVSW50MTZCRVxuICBhcnIud3JpdGVVSW50MzJMRSA9IEJQLndyaXRlVUludDMyTEVcbiAgYXJyLndyaXRlVUludDMyQkUgPSBCUC53cml0ZVVJbnQzMkJFXG4gIGFyci53cml0ZUludExFID0gQlAud3JpdGVJbnRMRVxuICBhcnIud3JpdGVJbnRCRSA9IEJQLndyaXRlSW50QkVcbiAgYXJyLndyaXRlSW50OCA9IEJQLndyaXRlSW50OFxuICBhcnIud3JpdGVJbnQxNkxFID0gQlAud3JpdGVJbnQxNkxFXG4gIGFyci53cml0ZUludDE2QkUgPSBCUC53cml0ZUludDE2QkVcbiAgYXJyLndyaXRlSW50MzJMRSA9IEJQLndyaXRlSW50MzJMRVxuICBhcnIud3JpdGVJbnQzMkJFID0gQlAud3JpdGVJbnQzMkJFXG4gIGFyci53cml0ZUZsb2F0TEUgPSBCUC53cml0ZUZsb2F0TEVcbiAgYXJyLndyaXRlRmxvYXRCRSA9IEJQLndyaXRlRmxvYXRCRVxuICBhcnIud3JpdGVEb3VibGVMRSA9IEJQLndyaXRlRG91YmxlTEVcbiAgYXJyLndyaXRlRG91YmxlQkUgPSBCUC53cml0ZURvdWJsZUJFXG4gIGFyci5maWxsID0gQlAuZmlsbFxuICBhcnIuaW5zcGVjdCA9IEJQLmluc3BlY3RcbiAgYXJyLnRvQXJyYXlCdWZmZXIgPSBCUC50b0FycmF5QnVmZmVyXG5cbiAgcmV0dXJuIGFyclxufVxuXG52YXIgSU5WQUxJRF9CQVNFNjRfUkUgPSAvW14rXFwvMC05QS1aYS16LV9dL2dcblxuZnVuY3Rpb24gYmFzZTY0Y2xlYW4gKHN0cikge1xuICAvLyBOb2RlIHN0cmlwcyBvdXQgaW52YWxpZCBjaGFyYWN0ZXJzIGxpa2UgXFxuIGFuZCBcXHQgZnJvbSB0aGUgc3RyaW5nLCBiYXNlNjQtanMgZG9lcyBub3RcbiAgc3RyID0gc3RyaW5ndHJpbShzdHIpLnJlcGxhY2UoSU5WQUxJRF9CQVNFNjRfUkUsICcnKVxuICAvLyBOb2RlIGNvbnZlcnRzIHN0cmluZ3Mgd2l0aCBsZW5ndGggPCAyIHRvICcnXG4gIGlmIChzdHIubGVuZ3RoIDwgMikgcmV0dXJuICcnXG4gIC8vIE5vZGUgYWxsb3dzIGZvciBub24tcGFkZGVkIGJhc2U2NCBzdHJpbmdzIChtaXNzaW5nIHRyYWlsaW5nID09PSksIGJhc2U2NC1qcyBkb2VzIG5vdFxuICB3aGlsZSAoc3RyLmxlbmd0aCAlIDQgIT09IDApIHtcbiAgICBzdHIgPSBzdHIgKyAnPSdcbiAgfVxuICByZXR1cm4gc3RyXG59XG5cbmZ1bmN0aW9uIHN0cmluZ3RyaW0gKHN0cikge1xuICBpZiAoc3RyLnRyaW0pIHJldHVybiBzdHIudHJpbSgpXG4gIHJldHVybiBzdHIucmVwbGFjZSgvXlxccyt8XFxzKyQvZywgJycpXG59XG5cbmZ1bmN0aW9uIHRvSGV4IChuKSB7XG4gIGlmIChuIDwgMTYpIHJldHVybiAnMCcgKyBuLnRvU3RyaW5nKDE2KVxuICByZXR1cm4gbi50b1N0cmluZygxNilcbn1cblxuZnVuY3Rpb24gdXRmOFRvQnl0ZXMgKHN0cmluZywgdW5pdHMpIHtcbiAgdW5pdHMgPSB1bml0cyB8fCBJbmZpbml0eVxuICB2YXIgY29kZVBvaW50XG4gIHZhciBsZW5ndGggPSBzdHJpbmcubGVuZ3RoXG4gIHZhciBsZWFkU3Vycm9nYXRlID0gbnVsbFxuICB2YXIgYnl0ZXMgPSBbXVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICBjb2RlUG9pbnQgPSBzdHJpbmcuY2hhckNvZGVBdChpKVxuXG4gICAgLy8gaXMgc3Vycm9nYXRlIGNvbXBvbmVudFxuICAgIGlmIChjb2RlUG9pbnQgPiAweEQ3RkYgJiYgY29kZVBvaW50IDwgMHhFMDAwKSB7XG4gICAgICAvLyBsYXN0IGNoYXIgd2FzIGEgbGVhZFxuICAgICAgaWYgKCFsZWFkU3Vycm9nYXRlKSB7XG4gICAgICAgIC8vIG5vIGxlYWQgeWV0XG4gICAgICAgIGlmIChjb2RlUG9pbnQgPiAweERCRkYpIHtcbiAgICAgICAgICAvLyB1bmV4cGVjdGVkIHRyYWlsXG4gICAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfSBlbHNlIGlmIChpICsgMSA9PT0gbGVuZ3RoKSB7XG4gICAgICAgICAgLy8gdW5wYWlyZWQgbGVhZFxuICAgICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICAvLyB2YWxpZCBsZWFkXG4gICAgICAgIGxlYWRTdXJyb2dhdGUgPSBjb2RlUG9pbnRcblxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyAyIGxlYWRzIGluIGEgcm93XG4gICAgICBpZiAoY29kZVBvaW50IDwgMHhEQzAwKSB7XG4gICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICBsZWFkU3Vycm9nYXRlID0gY29kZVBvaW50XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIHZhbGlkIHN1cnJvZ2F0ZSBwYWlyXG4gICAgICBjb2RlUG9pbnQgPSAobGVhZFN1cnJvZ2F0ZSAtIDB4RDgwMCA8PCAxMCB8IGNvZGVQb2ludCAtIDB4REMwMCkgKyAweDEwMDAwXG4gICAgfSBlbHNlIGlmIChsZWFkU3Vycm9nYXRlKSB7XG4gICAgICAvLyB2YWxpZCBibXAgY2hhciwgYnV0IGxhc3QgY2hhciB3YXMgYSBsZWFkXG4gICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICB9XG5cbiAgICBsZWFkU3Vycm9nYXRlID0gbnVsbFxuXG4gICAgLy8gZW5jb2RlIHV0ZjhcbiAgICBpZiAoY29kZVBvaW50IDwgMHg4MCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAxKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKGNvZGVQb2ludClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4ODAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDIpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgfCAweEMwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHgxMDAwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAzKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHhDIHwgMHhFMCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHgxMTAwMDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gNCkgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4MTIgfCAweEYwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHhDICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNvZGUgcG9pbnQnKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBieXRlc1xufVxuXG5mdW5jdGlvbiBhc2NpaVRvQnl0ZXMgKHN0cikge1xuICB2YXIgYnl0ZUFycmF5ID0gW11cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICAvLyBOb2RlJ3MgY29kZSBzZWVtcyB0byBiZSBkb2luZyB0aGlzIGFuZCBub3QgJiAweDdGLi5cbiAgICBieXRlQXJyYXkucHVzaChzdHIuY2hhckNvZGVBdChpKSAmIDB4RkYpXG4gIH1cbiAgcmV0dXJuIGJ5dGVBcnJheVxufVxuXG5mdW5jdGlvbiB1dGYxNmxlVG9CeXRlcyAoc3RyLCB1bml0cykge1xuICB2YXIgYywgaGksIGxvXG4gIHZhciBieXRlQXJyYXkgPSBbXVxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgIGlmICgodW5pdHMgLT0gMikgPCAwKSBicmVha1xuXG4gICAgYyA9IHN0ci5jaGFyQ29kZUF0KGkpXG4gICAgaGkgPSBjID4+IDhcbiAgICBsbyA9IGMgJSAyNTZcbiAgICBieXRlQXJyYXkucHVzaChsbylcbiAgICBieXRlQXJyYXkucHVzaChoaSlcbiAgfVxuXG4gIHJldHVybiBieXRlQXJyYXlcbn1cblxuZnVuY3Rpb24gYmFzZTY0VG9CeXRlcyAoc3RyKSB7XG4gIHJldHVybiBiYXNlNjQudG9CeXRlQXJyYXkoYmFzZTY0Y2xlYW4oc3RyKSlcbn1cblxuZnVuY3Rpb24gYmxpdEJ1ZmZlciAoc3JjLCBkc3QsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoKGkgKyBvZmZzZXQgPj0gZHN0Lmxlbmd0aCkgfHwgKGkgPj0gc3JjLmxlbmd0aCkpIGJyZWFrXG4gICAgZHN0W2kgKyBvZmZzZXRdID0gc3JjW2ldXG4gIH1cbiAgcmV0dXJuIGlcbn1cblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogKHdlYnBhY2spL34vbm9kZS1saWJzLWJyb3dzZXIvfi9idWZmZXIvaW5kZXguanNcbiAqKiBtb2R1bGUgaWQgPSAzMDRcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBsb29rdXAgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyc7XG5cbjsoZnVuY3Rpb24gKGV4cG9ydHMpIHtcblx0J3VzZSBzdHJpY3QnO1xuXG4gIHZhciBBcnIgPSAodHlwZW9mIFVpbnQ4QXJyYXkgIT09ICd1bmRlZmluZWQnKVxuICAgID8gVWludDhBcnJheVxuICAgIDogQXJyYXlcblxuXHR2YXIgUExVUyAgID0gJysnLmNoYXJDb2RlQXQoMClcblx0dmFyIFNMQVNIICA9ICcvJy5jaGFyQ29kZUF0KDApXG5cdHZhciBOVU1CRVIgPSAnMCcuY2hhckNvZGVBdCgwKVxuXHR2YXIgTE9XRVIgID0gJ2EnLmNoYXJDb2RlQXQoMClcblx0dmFyIFVQUEVSICA9ICdBJy5jaGFyQ29kZUF0KDApXG5cdHZhciBQTFVTX1VSTF9TQUZFID0gJy0nLmNoYXJDb2RlQXQoMClcblx0dmFyIFNMQVNIX1VSTF9TQUZFID0gJ18nLmNoYXJDb2RlQXQoMClcblxuXHRmdW5jdGlvbiBkZWNvZGUgKGVsdCkge1xuXHRcdHZhciBjb2RlID0gZWx0LmNoYXJDb2RlQXQoMClcblx0XHRpZiAoY29kZSA9PT0gUExVUyB8fFxuXHRcdCAgICBjb2RlID09PSBQTFVTX1VSTF9TQUZFKVxuXHRcdFx0cmV0dXJuIDYyIC8vICcrJ1xuXHRcdGlmIChjb2RlID09PSBTTEFTSCB8fFxuXHRcdCAgICBjb2RlID09PSBTTEFTSF9VUkxfU0FGRSlcblx0XHRcdHJldHVybiA2MyAvLyAnLydcblx0XHRpZiAoY29kZSA8IE5VTUJFUilcblx0XHRcdHJldHVybiAtMSAvL25vIG1hdGNoXG5cdFx0aWYgKGNvZGUgPCBOVU1CRVIgKyAxMClcblx0XHRcdHJldHVybiBjb2RlIC0gTlVNQkVSICsgMjYgKyAyNlxuXHRcdGlmIChjb2RlIDwgVVBQRVIgKyAyNilcblx0XHRcdHJldHVybiBjb2RlIC0gVVBQRVJcblx0XHRpZiAoY29kZSA8IExPV0VSICsgMjYpXG5cdFx0XHRyZXR1cm4gY29kZSAtIExPV0VSICsgMjZcblx0fVxuXG5cdGZ1bmN0aW9uIGI2NFRvQnl0ZUFycmF5IChiNjQpIHtcblx0XHR2YXIgaSwgaiwgbCwgdG1wLCBwbGFjZUhvbGRlcnMsIGFyclxuXG5cdFx0aWYgKGI2NC5sZW5ndGggJSA0ID4gMCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHN0cmluZy4gTGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0Jylcblx0XHR9XG5cblx0XHQvLyB0aGUgbnVtYmVyIG9mIGVxdWFsIHNpZ25zIChwbGFjZSBob2xkZXJzKVxuXHRcdC8vIGlmIHRoZXJlIGFyZSB0d28gcGxhY2Vob2xkZXJzLCB0aGFuIHRoZSB0d28gY2hhcmFjdGVycyBiZWZvcmUgaXRcblx0XHQvLyByZXByZXNlbnQgb25lIGJ5dGVcblx0XHQvLyBpZiB0aGVyZSBpcyBvbmx5IG9uZSwgdGhlbiB0aGUgdGhyZWUgY2hhcmFjdGVycyBiZWZvcmUgaXQgcmVwcmVzZW50IDIgYnl0ZXNcblx0XHQvLyB0aGlzIGlzIGp1c3QgYSBjaGVhcCBoYWNrIHRvIG5vdCBkbyBpbmRleE9mIHR3aWNlXG5cdFx0dmFyIGxlbiA9IGI2NC5sZW5ndGhcblx0XHRwbGFjZUhvbGRlcnMgPSAnPScgPT09IGI2NC5jaGFyQXQobGVuIC0gMikgPyAyIDogJz0nID09PSBiNjQuY2hhckF0KGxlbiAtIDEpID8gMSA6IDBcblxuXHRcdC8vIGJhc2U2NCBpcyA0LzMgKyB1cCB0byB0d28gY2hhcmFjdGVycyBvZiB0aGUgb3JpZ2luYWwgZGF0YVxuXHRcdGFyciA9IG5ldyBBcnIoYjY0Lmxlbmd0aCAqIDMgLyA0IC0gcGxhY2VIb2xkZXJzKVxuXG5cdFx0Ly8gaWYgdGhlcmUgYXJlIHBsYWNlaG9sZGVycywgb25seSBnZXQgdXAgdG8gdGhlIGxhc3QgY29tcGxldGUgNCBjaGFyc1xuXHRcdGwgPSBwbGFjZUhvbGRlcnMgPiAwID8gYjY0Lmxlbmd0aCAtIDQgOiBiNjQubGVuZ3RoXG5cblx0XHR2YXIgTCA9IDBcblxuXHRcdGZ1bmN0aW9uIHB1c2ggKHYpIHtcblx0XHRcdGFycltMKytdID0gdlxuXHRcdH1cblxuXHRcdGZvciAoaSA9IDAsIGogPSAwOyBpIDwgbDsgaSArPSA0LCBqICs9IDMpIHtcblx0XHRcdHRtcCA9IChkZWNvZGUoYjY0LmNoYXJBdChpKSkgPDwgMTgpIHwgKGRlY29kZShiNjQuY2hhckF0KGkgKyAxKSkgPDwgMTIpIHwgKGRlY29kZShiNjQuY2hhckF0KGkgKyAyKSkgPDwgNikgfCBkZWNvZGUoYjY0LmNoYXJBdChpICsgMykpXG5cdFx0XHRwdXNoKCh0bXAgJiAweEZGMDAwMCkgPj4gMTYpXG5cdFx0XHRwdXNoKCh0bXAgJiAweEZGMDApID4+IDgpXG5cdFx0XHRwdXNoKHRtcCAmIDB4RkYpXG5cdFx0fVxuXG5cdFx0aWYgKHBsYWNlSG9sZGVycyA9PT0gMikge1xuXHRcdFx0dG1wID0gKGRlY29kZShiNjQuY2hhckF0KGkpKSA8PCAyKSB8IChkZWNvZGUoYjY0LmNoYXJBdChpICsgMSkpID4+IDQpXG5cdFx0XHRwdXNoKHRtcCAmIDB4RkYpXG5cdFx0fSBlbHNlIGlmIChwbGFjZUhvbGRlcnMgPT09IDEpIHtcblx0XHRcdHRtcCA9IChkZWNvZGUoYjY0LmNoYXJBdChpKSkgPDwgMTApIHwgKGRlY29kZShiNjQuY2hhckF0KGkgKyAxKSkgPDwgNCkgfCAoZGVjb2RlKGI2NC5jaGFyQXQoaSArIDIpKSA+PiAyKVxuXHRcdFx0cHVzaCgodG1wID4+IDgpICYgMHhGRilcblx0XHRcdHB1c2godG1wICYgMHhGRilcblx0XHR9XG5cblx0XHRyZXR1cm4gYXJyXG5cdH1cblxuXHRmdW5jdGlvbiB1aW50OFRvQmFzZTY0ICh1aW50OCkge1xuXHRcdHZhciBpLFxuXHRcdFx0ZXh0cmFCeXRlcyA9IHVpbnQ4Lmxlbmd0aCAlIDMsIC8vIGlmIHdlIGhhdmUgMSBieXRlIGxlZnQsIHBhZCAyIGJ5dGVzXG5cdFx0XHRvdXRwdXQgPSBcIlwiLFxuXHRcdFx0dGVtcCwgbGVuZ3RoXG5cblx0XHRmdW5jdGlvbiBlbmNvZGUgKG51bSkge1xuXHRcdFx0cmV0dXJuIGxvb2t1cC5jaGFyQXQobnVtKVxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIHRyaXBsZXRUb0Jhc2U2NCAobnVtKSB7XG5cdFx0XHRyZXR1cm4gZW5jb2RlKG51bSA+PiAxOCAmIDB4M0YpICsgZW5jb2RlKG51bSA+PiAxMiAmIDB4M0YpICsgZW5jb2RlKG51bSA+PiA2ICYgMHgzRikgKyBlbmNvZGUobnVtICYgMHgzRilcblx0XHR9XG5cblx0XHQvLyBnbyB0aHJvdWdoIHRoZSBhcnJheSBldmVyeSB0aHJlZSBieXRlcywgd2UnbGwgZGVhbCB3aXRoIHRyYWlsaW5nIHN0dWZmIGxhdGVyXG5cdFx0Zm9yIChpID0gMCwgbGVuZ3RoID0gdWludDgubGVuZ3RoIC0gZXh0cmFCeXRlczsgaSA8IGxlbmd0aDsgaSArPSAzKSB7XG5cdFx0XHR0ZW1wID0gKHVpbnQ4W2ldIDw8IDE2KSArICh1aW50OFtpICsgMV0gPDwgOCkgKyAodWludDhbaSArIDJdKVxuXHRcdFx0b3V0cHV0ICs9IHRyaXBsZXRUb0Jhc2U2NCh0ZW1wKVxuXHRcdH1cblxuXHRcdC8vIHBhZCB0aGUgZW5kIHdpdGggemVyb3MsIGJ1dCBtYWtlIHN1cmUgdG8gbm90IGZvcmdldCB0aGUgZXh0cmEgYnl0ZXNcblx0XHRzd2l0Y2ggKGV4dHJhQnl0ZXMpIHtcblx0XHRcdGNhc2UgMTpcblx0XHRcdFx0dGVtcCA9IHVpbnQ4W3VpbnQ4Lmxlbmd0aCAtIDFdXG5cdFx0XHRcdG91dHB1dCArPSBlbmNvZGUodGVtcCA+PiAyKVxuXHRcdFx0XHRvdXRwdXQgKz0gZW5jb2RlKCh0ZW1wIDw8IDQpICYgMHgzRilcblx0XHRcdFx0b3V0cHV0ICs9ICc9PSdcblx0XHRcdFx0YnJlYWtcblx0XHRcdGNhc2UgMjpcblx0XHRcdFx0dGVtcCA9ICh1aW50OFt1aW50OC5sZW5ndGggLSAyXSA8PCA4KSArICh1aW50OFt1aW50OC5sZW5ndGggLSAxXSlcblx0XHRcdFx0b3V0cHV0ICs9IGVuY29kZSh0ZW1wID4+IDEwKVxuXHRcdFx0XHRvdXRwdXQgKz0gZW5jb2RlKCh0ZW1wID4+IDQpICYgMHgzRilcblx0XHRcdFx0b3V0cHV0ICs9IGVuY29kZSgodGVtcCA8PCAyKSAmIDB4M0YpXG5cdFx0XHRcdG91dHB1dCArPSAnPSdcblx0XHRcdFx0YnJlYWtcblx0XHR9XG5cblx0XHRyZXR1cm4gb3V0cHV0XG5cdH1cblxuXHRleHBvcnRzLnRvQnl0ZUFycmF5ID0gYjY0VG9CeXRlQXJyYXlcblx0ZXhwb3J0cy5mcm9tQnl0ZUFycmF5ID0gdWludDhUb0Jhc2U2NFxufSh0eXBlb2YgZXhwb3J0cyA9PT0gJ3VuZGVmaW5lZCcgPyAodGhpcy5iYXNlNjRqcyA9IHt9KSA6IGV4cG9ydHMpKVxuXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAod2VicGFjaykvfi9ub2RlLWxpYnMtYnJvd3Nlci9+L2J1ZmZlci9+L2Jhc2U2NC1qcy9saWIvYjY0LmpzXG4gKiogbW9kdWxlIGlkID0gMzA1XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJleHBvcnRzLnJlYWQgPSBmdW5jdGlvbiAoYnVmZmVyLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbVxuICB2YXIgZUxlbiA9IG5CeXRlcyAqIDggLSBtTGVuIC0gMVxuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMVxuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDFcbiAgdmFyIG5CaXRzID0gLTdcbiAgdmFyIGkgPSBpc0xFID8gKG5CeXRlcyAtIDEpIDogMFxuICB2YXIgZCA9IGlzTEUgPyAtMSA6IDFcbiAgdmFyIHMgPSBidWZmZXJbb2Zmc2V0ICsgaV1cblxuICBpICs9IGRcblxuICBlID0gcyAmICgoMSA8PCAoLW5CaXRzKSkgLSAxKVxuICBzID4+PSAoLW5CaXRzKVxuICBuQml0cyArPSBlTGVuXG4gIGZvciAoOyBuQml0cyA+IDA7IGUgPSBlICogMjU2ICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgbSA9IGUgJiAoKDEgPDwgKC1uQml0cykpIC0gMSlcbiAgZSA+Pj0gKC1uQml0cylcbiAgbkJpdHMgKz0gbUxlblxuICBmb3IgKDsgbkJpdHMgPiAwOyBtID0gbSAqIDI1NiArIGJ1ZmZlcltvZmZzZXQgKyBpXSwgaSArPSBkLCBuQml0cyAtPSA4KSB7fVxuXG4gIGlmIChlID09PSAwKSB7XG4gICAgZSA9IDEgLSBlQmlhc1xuICB9IGVsc2UgaWYgKGUgPT09IGVNYXgpIHtcbiAgICByZXR1cm4gbSA/IE5hTiA6ICgocyA/IC0xIDogMSkgKiBJbmZpbml0eSlcbiAgfSBlbHNlIHtcbiAgICBtID0gbSArIE1hdGgucG93KDIsIG1MZW4pXG4gICAgZSA9IGUgLSBlQmlhc1xuICB9XG4gIHJldHVybiAocyA/IC0xIDogMSkgKiBtICogTWF0aC5wb3coMiwgZSAtIG1MZW4pXG59XG5cbmV4cG9ydHMud3JpdGUgPSBmdW5jdGlvbiAoYnVmZmVyLCB2YWx1ZSwgb2Zmc2V0LCBpc0xFLCBtTGVuLCBuQnl0ZXMpIHtcbiAgdmFyIGUsIG0sIGNcbiAgdmFyIGVMZW4gPSBuQnl0ZXMgKiA4IC0gbUxlbiAtIDFcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDFcbiAgdmFyIGVCaWFzID0gZU1heCA+PiAxXG4gIHZhciBydCA9IChtTGVuID09PSAyMyA/IE1hdGgucG93KDIsIC0yNCkgLSBNYXRoLnBvdygyLCAtNzcpIDogMClcbiAgdmFyIGkgPSBpc0xFID8gMCA6IChuQnl0ZXMgLSAxKVxuICB2YXIgZCA9IGlzTEUgPyAxIDogLTFcbiAgdmFyIHMgPSB2YWx1ZSA8IDAgfHwgKHZhbHVlID09PSAwICYmIDEgLyB2YWx1ZSA8IDApID8gMSA6IDBcblxuICB2YWx1ZSA9IE1hdGguYWJzKHZhbHVlKVxuXG4gIGlmIChpc05hTih2YWx1ZSkgfHwgdmFsdWUgPT09IEluZmluaXR5KSB7XG4gICAgbSA9IGlzTmFOKHZhbHVlKSA/IDEgOiAwXG4gICAgZSA9IGVNYXhcbiAgfSBlbHNlIHtcbiAgICBlID0gTWF0aC5mbG9vcihNYXRoLmxvZyh2YWx1ZSkgLyBNYXRoLkxOMilcbiAgICBpZiAodmFsdWUgKiAoYyA9IE1hdGgucG93KDIsIC1lKSkgPCAxKSB7XG4gICAgICBlLS1cbiAgICAgIGMgKj0gMlxuICAgIH1cbiAgICBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIHZhbHVlICs9IHJ0IC8gY1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSArPSBydCAqIE1hdGgucG93KDIsIDEgLSBlQmlhcylcbiAgICB9XG4gICAgaWYgKHZhbHVlICogYyA+PSAyKSB7XG4gICAgICBlKytcbiAgICAgIGMgLz0gMlxuICAgIH1cblxuICAgIGlmIChlICsgZUJpYXMgPj0gZU1heCkge1xuICAgICAgbSA9IDBcbiAgICAgIGUgPSBlTWF4XG4gICAgfSBlbHNlIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgbSA9ICh2YWx1ZSAqIGMgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pXG4gICAgICBlID0gZSArIGVCaWFzXG4gICAgfSBlbHNlIHtcbiAgICAgIG0gPSB2YWx1ZSAqIE1hdGgucG93KDIsIGVCaWFzIC0gMSkgKiBNYXRoLnBvdygyLCBtTGVuKVxuICAgICAgZSA9IDBcbiAgICB9XG4gIH1cblxuICBmb3IgKDsgbUxlbiA+PSA4OyBidWZmZXJbb2Zmc2V0ICsgaV0gPSBtICYgMHhmZiwgaSArPSBkLCBtIC89IDI1NiwgbUxlbiAtPSA4KSB7fVxuXG4gIGUgPSAoZSA8PCBtTGVuKSB8IG1cbiAgZUxlbiArPSBtTGVuXG4gIGZvciAoOyBlTGVuID4gMDsgYnVmZmVyW29mZnNldCArIGldID0gZSAmIDB4ZmYsIGkgKz0gZCwgZSAvPSAyNTYsIGVMZW4gLT0gOCkge31cblxuICBidWZmZXJbb2Zmc2V0ICsgaSAtIGRdIHw9IHMgKiAxMjhcbn1cblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogKHdlYnBhY2spL34vbm9kZS1saWJzLWJyb3dzZXIvfi9idWZmZXIvfi9pZWVlNzU0L2luZGV4LmpzXG4gKiogbW9kdWxlIGlkID0gMzA2XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgdG9TdHJpbmcgPSB7fS50b1N0cmluZztcblxubW9kdWxlLmV4cG9ydHMgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uIChhcnIpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwoYXJyKSA9PSAnW29iamVjdCBBcnJheV0nO1xufTtcblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogKHdlYnBhY2spL34vbm9kZS1saWJzLWJyb3dzZXIvfi9idWZmZXIvfi9pc2FycmF5L2luZGV4LmpzXG4gKiogbW9kdWxlIGlkID0gMzA3XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcblxyXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcclxuaW1wb3J0IFVybFV0aWxpdHkgZnJvbSAnLi9VcmxVdGlsaXR5JztcclxuaW1wb3J0IFNpZ25pblN0YXRlIGZyb20gJy4vU2lnbmluU3RhdGUnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2lnbmluUmVxdWVzdCB7XHJcbiAgICBjb25zdHJ1Y3Rvcih7XHJcbiAgICAgICAgLy8gbWFuZGF0b3J5XHJcbiAgICAgICAgdXJsLCBjbGllbnRfaWQsIHJlZGlyZWN0X3VyaSwgcmVzcG9uc2VfdHlwZSwgc2NvcGUsIGF1dGhvcml0eSxcclxuICAgICAgICAvLyBvcHRpb25hbFxyXG4gICAgICAgIGRhdGEsIHByb21wdCwgZGlzcGxheSwgbWF4X2FnZSwgdWlfbG9jYWxlcywgaWRfdG9rZW5faGludCwgbG9naW5faGludCwgYWNyX3ZhbHVlc1xyXG4gICAgfSkge1xyXG4gICAgICAgIGlmICghdXJsKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIHVybCBwYXNzZWQgdG8gU2lnbmluUmVxdWVzdFwiKTtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidXJsXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWNsaWVudF9pZCkge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJObyBjbGllbnRfaWQgcGFzc2VkIHRvIFNpZ25pblJlcXVlc3RcIik7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImNsaWVudF9pZFwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFyZWRpcmVjdF91cmkpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gcmVkaXJlY3RfdXJpIHBhc3NlZCB0byBTaWduaW5SZXF1ZXN0XCIpO1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJyZWRpcmVjdF91cmlcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghcmVzcG9uc2VfdHlwZSkge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJObyByZXNwb25zZV90eXBlIHBhc3NlZCB0byBTaWduaW5SZXF1ZXN0XCIpO1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJyZXNwb25zZV90eXBlXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXNjb3BlKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIHNjb3BlIHBhc3NlZCB0byBTaWduaW5SZXF1ZXN0XCIpO1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJzY29wZVwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFhdXRob3JpdHkpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gYXV0aG9yaXR5IHBhc3NlZCB0byBTaWduaW5SZXF1ZXN0XCIpO1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJhdXRob3JpdHlcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgb2lkYyA9IFNpZ25pblJlcXVlc3QuaXNPaWRjKHJlc3BvbnNlX3R5cGUpO1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSBuZXcgU2lnbmluU3RhdGUoeyBub25jZTogb2lkYywgZGF0YSwgY2xpZW50X2lkLCBhdXRob3JpdHkgfSk7XHJcblxyXG4gICAgICAgIHVybCA9IFVybFV0aWxpdHkuYWRkUXVlcnlQYXJhbSh1cmwsIFwiY2xpZW50X2lkXCIsIGNsaWVudF9pZCk7XHJcbiAgICAgICAgdXJsID0gVXJsVXRpbGl0eS5hZGRRdWVyeVBhcmFtKHVybCwgXCJyZWRpcmVjdF91cmlcIiwgcmVkaXJlY3RfdXJpKTtcclxuICAgICAgICB1cmwgPSBVcmxVdGlsaXR5LmFkZFF1ZXJ5UGFyYW0odXJsLCBcInJlc3BvbnNlX3R5cGVcIiwgcmVzcG9uc2VfdHlwZSk7XHJcbiAgICAgICAgdXJsID0gVXJsVXRpbGl0eS5hZGRRdWVyeVBhcmFtKHVybCwgXCJzY29wZVwiLCBzY29wZSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgdXJsID0gVXJsVXRpbGl0eS5hZGRRdWVyeVBhcmFtKHVybCwgXCJzdGF0ZVwiLCB0aGlzLnN0YXRlLmlkKTtcclxuICAgICAgICBpZiAob2lkYykge1xyXG4gICAgICAgICAgICB1cmwgPSBVcmxVdGlsaXR5LmFkZFF1ZXJ5UGFyYW0odXJsLCBcIm5vbmNlXCIsIHRoaXMuc3RhdGUubm9uY2UpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIG9wdGlvbmFsID0geyBwcm9tcHQsIGRpc3BsYXksIG1heF9hZ2UsIHVpX2xvY2FsZXMsIGlkX3Rva2VuX2hpbnQsIGxvZ2luX2hpbnQsIGFjcl92YWx1ZXMgfTtcclxuICAgICAgICBmb3IobGV0IGtleSBpbiBvcHRpb25hbCl7XHJcbiAgICAgICAgICAgIGlmIChvcHRpb25hbFtrZXldKSB7XHJcbiAgICAgICAgICAgICAgICB1cmwgPSBVcmxVdGlsaXR5LmFkZFF1ZXJ5UGFyYW0odXJsLCBrZXksIG9wdGlvbmFsW2tleV0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnVybCA9IHVybDtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgaXNPaWRjKHJlc3BvbnNlX3R5cGUpIHtcclxuICAgICAgICB2YXIgcmVzdWx0ID0gcmVzcG9uc2VfdHlwZS5zcGxpdCgvXFxzKy9nKS5maWx0ZXIoZnVuY3Rpb24oaXRlbSkge1xyXG4gICAgICAgICAgICByZXR1cm4gaXRlbSA9PT0gXCJpZF90b2tlblwiO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiAhIShyZXN1bHRbMF0pO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBzdGF0aWMgaXNPQXV0aChyZXNwb25zZV90eXBlKSB7XHJcbiAgICAgICAgdmFyIHJlc3VsdCA9IHJlc3BvbnNlX3R5cGUuc3BsaXQoL1xccysvZykuZmlsdGVyKGZ1bmN0aW9uKGl0ZW0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIGl0ZW0gPT09IFwidG9rZW5cIjtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gISEocmVzdWx0WzBdKTtcclxuICAgIH1cclxufVxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL1NpZ25pblJlcXVlc3QuanNcbiAqKi8iLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcblxyXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcclxuaW1wb3J0IEdsb2JhbCBmcm9tICcuL0dsb2JhbCc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBVcmxVdGlsaXR5IHtcclxuICAgIHN0YXRpYyBhZGRRdWVyeVBhcmFtKHVybCwgbmFtZSwgdmFsdWUpIHtcclxuICAgICAgICBpZiAodXJsLmluZGV4T2YoJz8nKSA8IDApIHtcclxuICAgICAgICAgICAgdXJsICs9IFwiP1wiO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHVybFt1cmwubGVuZ3RoIC0gMV0gIT09IFwiP1wiKSB7XHJcbiAgICAgICAgICAgIHVybCArPSBcIiZcIjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHVybCArPSBlbmNvZGVVUklDb21wb25lbnQobmFtZSk7XHJcbiAgICAgICAgdXJsICs9IFwiPVwiO1xyXG4gICAgICAgIHVybCArPSBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpO1xyXG5cclxuICAgICAgICByZXR1cm4gdXJsO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBwYXJzZVVybEZyYWdtZW50KHZhbHVlLCBkZWxpbWl0ZXIgPSBcIiNcIiwgZ2xvYmFsID0gR2xvYmFsKSB7XHJcbiAgICAgICAgTG9nLmluZm8oXCJVcmxVdGlsaXR5LnBhcnNlVXJsRnJhZ21lbnRcIik7XHJcblxyXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKXtcclxuICAgICAgICAgICAgdmFsdWUgPSBnbG9iYWwubG9jYXRpb24uaHJlZjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBpZHggPSB2YWx1ZS5sYXN0SW5kZXhPZihkZWxpbWl0ZXIpO1xyXG4gICAgICAgIGlmIChpZHggPj0gMCkge1xyXG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnN1YnN0cihpZHggKyAxKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBwYXJhbXMgPSB7fSxcclxuICAgICAgICAgICAgcmVnZXggPSAvKFteJj1dKyk9KFteJl0qKS9nLFxyXG4gICAgICAgICAgICBtO1xyXG5cclxuICAgICAgICB2YXIgY291bnRlciA9IDA7XHJcbiAgICAgICAgd2hpbGUgKG0gPSByZWdleC5leGVjKHZhbHVlKSkge1xyXG4gICAgICAgICAgICBwYXJhbXNbZGVjb2RlVVJJQ29tcG9uZW50KG1bMV0pXSA9IGRlY29kZVVSSUNvbXBvbmVudChtWzJdKTtcclxuICAgICAgICAgICAgaWYgKGNvdW50ZXIrKyA+IDUwKSB7XHJcbiAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJyZXNwb25zZSBleGNlZWRlZCBleHBlY3RlZCBudW1iZXIgb2YgcGFyYW1ldGVyc1wiLCB2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGVycm9yOiBcIlJlc3BvbnNlIGV4Y2VlZGVkIGV4cGVjdGVkIG51bWJlciBvZiBwYXJhbWV0ZXJzXCJcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAodmFyIHByb3AgaW4gcGFyYW1zKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBwYXJhbXM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiB7fTtcclxuICAgIH1cclxufVxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL1VybFV0aWxpdHkuanNcbiAqKi8iLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcblxyXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcclxuaW1wb3J0IFN0YXRlIGZyb20gJy4vU3RhdGUnO1xyXG5pbXBvcnQgcmFuZG9tIGZyb20gJy4vcmFuZG9tJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNpZ25pblN0YXRlIGV4dGVuZHMgU3RhdGUge1xyXG4gICAgY29uc3RydWN0b3Ioe25vbmNlLCBhdXRob3JpdHksIGNsaWVudF9pZH0gPSB7fSkge1xyXG4gICAgICAgIHN1cGVyKGFyZ3VtZW50c1swXSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKG5vbmNlID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX25vbmNlID0gcmFuZG9tKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKG5vbmNlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX25vbmNlID0gbm9uY2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMuX2F1dGhvcml0eSA9IGF1dGhvcml0eTtcclxuICAgICAgICB0aGlzLl9jbGllbnRfaWQgPSBjbGllbnRfaWQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IG5vbmNlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9ub25jZTtcclxuICAgIH1cclxuICAgIGdldCBhdXRob3JpdHkoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2F1dGhvcml0eTtcclxuICAgIH1cclxuICAgIGdldCBjbGllbnRfaWQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NsaWVudF9pZDtcclxuICAgIH1cclxuICAgIFxyXG4gICAgdG9TdG9yYWdlU3RyaW5nKCkge1xyXG4gICAgICAgIExvZy5pbmZvKFwiU2lnbmluU3RhdGUudG9TdG9yYWdlU3RyaW5nXCIpO1xyXG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XHJcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxyXG4gICAgICAgICAgICBkYXRhOiB0aGlzLmRhdGEsXHJcbiAgICAgICAgICAgIGNyZWF0ZWQ6IHRoaXMuY3JlYXRlZCxcclxuICAgICAgICAgICAgbm9uY2U6IHRoaXMubm9uY2UsXHJcbiAgICAgICAgICAgIGF1dGhvcml0eTogdGhpcy5hdXRob3JpdHksXHJcbiAgICAgICAgICAgIGNsaWVudF9pZDogdGhpcy5jbGllbnRfaWRcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZnJvbVN0b3JhZ2VTdHJpbmcoc3RvcmFnZVN0cmluZykge1xyXG4gICAgICAgIExvZy5pbmZvKFwiU2lnbmluU3RhdGUuZnJvbVN0b3JhZ2VTdHJpbmdcIik7XHJcbiAgICAgICAgdmFyIGRhdGEgPSBKU09OLnBhcnNlKHN0b3JhZ2VTdHJpbmcpO1xyXG4gICAgICAgIHJldHVybiBuZXcgU2lnbmluU3RhdGUoZGF0YSk7XHJcbiAgICB9XHJcbn1cclxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvU2lnbmluU3RhdGUuanNcbiAqKi8iLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcblxyXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcclxuaW1wb3J0IHJhbmRvbSBmcm9tICcuL3JhbmRvbSc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTdGF0ZSB7XHJcbiAgICBjb25zdHJ1Y3Rvcih7aWQsIGRhdGEsIGNyZWF0ZWR9ID0ge30pIHtcclxuICAgICAgICB0aGlzLl9pZCA9IGlkIHx8IHJhbmRvbSgpO1xyXG4gICAgICAgIHRoaXMuX2RhdGEgPSBkYXRhO1xyXG5cclxuICAgICAgICBpZiAodHlwZW9mIGNyZWF0ZWQgPT09ICdudW1iZXInICYmIGNyZWF0ZWQgPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NyZWF0ZWQgPSBjcmVhdGVkO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fY3JlYXRlZCA9IHBhcnNlSW50KERhdGUubm93KCkgLyAxMDAwKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGlkKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9pZDtcclxuICAgIH1cclxuICAgIGdldCBkYXRhKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhO1xyXG4gICAgfVxyXG4gICAgZ2V0IGNyZWF0ZWQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NyZWF0ZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgdG9TdG9yYWdlU3RyaW5nKCkge1xyXG4gICAgICAgIExvZy5pbmZvKFwiU3RhdGUudG9TdG9yYWdlU3RyaW5nXCIpO1xyXG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XHJcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxyXG4gICAgICAgICAgICBkYXRhOiB0aGlzLmRhdGEsXHJcbiAgICAgICAgICAgIGNyZWF0ZWQ6IHRoaXMuY3JlYXRlZFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBzdGF0aWMgZnJvbVN0b3JhZ2VTdHJpbmcoc3RvcmFnZVN0cmluZykge1xyXG4gICAgICAgIExvZy5pbmZvKFwiU3RhdGUuZnJvbVN0b3JhZ2VTdHJpbmdcIik7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBTdGF0ZShKU09OLnBhcnNlKHN0b3JhZ2VTdHJpbmcpKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgY2xlYXJTdGFsZVN0YXRlKHN0b3JhZ2UsIGFnZSkge1xyXG4gICAgICAgIExvZy5pbmZvKFwiU3RhdGUuY2xlYXJTdGFsZVN0YXRlXCIpO1xyXG5cclxuICAgICAgICB2YXIgY3V0b2ZmID0gRGF0ZS5ub3coKSAvIDEwMDAgLSBhZ2U7XHJcblxyXG4gICAgICAgIHJldHVybiBzdG9yYWdlLmdldEFsbEtleXMoKS50aGVuKGtleXMgPT4ge1xyXG4gICAgICAgICAgICBMb2cuaW5mbyhcImdvdCBrZXlzXCIsIGtleXMpO1xyXG5cclxuICAgICAgICAgICAgdmFyIHByb21pc2VzID0gW107XHJcbiAgICAgICAgICAgIGZvciAobGV0IGtleSBvZiBrZXlzKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgcCA9IHN0b3JhZ2UuZ2V0KGtleSkudGhlbihpdGVtID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcmVtb3ZlID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3RhdGUgPSBTdGF0ZS5mcm9tU3RvcmFnZVN0cmluZyhpdGVtKVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5pbmZvKFwiZ290IGl0ZW0gZnJvbSBrZXk6IFwiLCBrZXksIHN0YXRlLmNyZWF0ZWQpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5jcmVhdGVkIDw9IGN1dG9mZikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lcnJvcihcIkVycm9yIHBhcnNpbmcgc3RhdGUgZm9yIGtleVwiLCBrZXksIGUubWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBMb2cuaW5mbyhcIm5vIGl0ZW0gaW4gc3RvcmFnZSBmb3Iga2V5OiBcIiwga2V5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZW1vdmUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmluZm8oXCJyZW1vdmVkIGl0ZW0gZm9yIGtleTogXCIsIGtleSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdG9yYWdlLnJlbW92ZShrZXkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIHByb21pc2VzLnB1c2gocCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIExvZy5pbmZvKFwid2FpdGluZyBvbiBwcm9taXNlIGNvdW50OlwiLCBwcm9taXNlcy5sZW5ndGgpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL1N0YXRlLmpzXG4gKiovIiwiLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbi8vIEFkYWxKUyB2MS4wLjhcclxuLy8gQHByZXNlcnZlIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IE9wZW4gVGVjaG5vbG9naWVzLCBJbmMuXHJcbi8vIEFsbCBSaWdodHMgUmVzZXJ2ZWRcclxuLy8gQXBhY2hlIExpY2Vuc2UgMi4wXHJcbi8vXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbi8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbi8vXHJcbi8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4vL1xyXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbi8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbi8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4vLyBOT1RJQ0U6IHRoZSBjb2RlIGluIHRoaXMgZmlsZSBvcmlnaW5hbGx5IGRldmVsb3BlZCBieSBNaWNyb3NvZnRcclxuLy8gb3JpZ2luYWwgc291cmNlOiBodHRwczovL2dpdGh1Yi5jb20vQXp1cmVBRC9henVyZS1hY3RpdmVkaXJlY3RvcnktbGlicmFyeS1mb3ItanMvYmxvYi9tYXN0ZXIvbGliL2FkYWwuanMjTDEwMjlcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJhbmRvbSgpIHtcclxuICAgIHZhciBndWlkSG9sZGVyID0gJ3h4eHh4eHh4eHh4eDR4eHh5eHh4eHh4eHh4eHh4eHh4JztcclxuICAgIHZhciBoZXggPSAnMDEyMzQ1Njc4OWFiY2RlZic7XHJcbiAgICB2YXIgciA9IDA7XHJcbiAgICB2YXIgZ3VpZFJlc3BvbnNlID0gXCJcIjtcclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ3VpZEhvbGRlci5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGlmIChndWlkSG9sZGVyW2ldICE9PSAnLScgJiYgZ3VpZEhvbGRlcltpXSAhPT0gJzQnKSB7XHJcbiAgICAgICAgICAgIC8vIGVhY2ggeCBhbmQgeSBuZWVkcyB0byBiZSByYW5kb21cclxuICAgICAgICAgICAgciA9IE1hdGgucmFuZG9tKCkgKiAxNiB8IDA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZ3VpZEhvbGRlcltpXSA9PT0gJ3gnKSB7XHJcbiAgICAgICAgICAgIGd1aWRSZXNwb25zZSArPSBoZXhbcl07XHJcbiAgICAgICAgfSBlbHNlIGlmIChndWlkSG9sZGVyW2ldID09PSAneScpIHtcclxuICAgICAgICAgICAgLy8gY2xvY2stc2VxLWFuZC1yZXNlcnZlZCBmaXJzdCBoZXggaXMgZmlsdGVyZWQgYW5kIHJlbWFpbmluZyBoZXggdmFsdWVzIGFyZSByYW5kb21cclxuICAgICAgICAgICAgciAmPSAweDM7IC8vIGJpdCBhbmQgd2l0aCAwMDExIHRvIHNldCBwb3MgMiB0byB6ZXJvID8wPz9cclxuICAgICAgICAgICAgciB8PSAweDg7IC8vIHNldCBwb3MgMyB0byAxIGFzIDE/Pz9cclxuICAgICAgICAgICAgZ3VpZFJlc3BvbnNlICs9IGhleFtyXTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBndWlkUmVzcG9uc2UgKz0gZ3VpZEhvbGRlcltpXTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZ3VpZFJlc3BvbnNlO1xyXG59XG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvcmFuZG9tLmpzXG4gKiovIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5cclxuaW1wb3J0IFVybFV0aWxpdHkgZnJvbSAnLi9VcmxVdGlsaXR5JztcclxuXHJcbmNvbnN0IE9pZGNTY29wZSA9IFwib3BlbmlkXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTaWduaW5SZXNwb25zZSB7XHJcbiAgICBjb25zdHJ1Y3Rvcih1cmwpIHtcclxuXHJcbiAgICAgICAgdmFyIHZhbHVlcyA9IFVybFV0aWxpdHkucGFyc2VVcmxGcmFnbWVudCh1cmwsIFwiI1wiKTtcclxuXHJcbiAgICAgICAgdGhpcy5lcnJvciA9IHZhbHVlcy5lcnJvcjtcclxuICAgICAgICB0aGlzLmVycm9yX2Rlc2NyaXB0aW9uID0gdmFsdWVzLmVycm9yX2Rlc2NyaXB0aW9uO1xyXG4gICAgICAgIHRoaXMuZXJyb3JfdXJpID0gdmFsdWVzLmVycm9yX3VyaTtcclxuICAgICAgICBcclxuICAgICAgICB0aGlzLnN0YXRlID0gdmFsdWVzLnN0YXRlO1xyXG4gICAgICAgIHRoaXMuaWRfdG9rZW4gPSB2YWx1ZXMuaWRfdG9rZW47XHJcbiAgICAgICAgdGhpcy5zZXNzaW9uX3N0YXRlID0gdmFsdWVzLnNlc3Npb25fc3RhdGU7XHJcbiAgICAgICAgdGhpcy5hY2Nlc3NfdG9rZW4gPSB2YWx1ZXMuYWNjZXNzX3Rva2VuO1xyXG4gICAgICAgIHRoaXMudG9rZW5fdHlwZSA9IHZhbHVlcy50b2tlbl90eXBlO1xyXG4gICAgICAgIHRoaXMuc2NvcGUgPSB2YWx1ZXMuc2NvcGU7XHJcbiAgICAgICAgdGhpcy5wcm9maWxlID0gdW5kZWZpbmVkOyAvLyB3aWxsIGJlIHNldCBmcm9tIFJlc3BvbnNlVmFsaWRhdG9yXHJcblxyXG4gICAgICAgIGxldCBleHBpcmVzX2luID0gcGFyc2VJbnQodmFsdWVzLmV4cGlyZXNfaW4pO1xyXG4gICAgICAgIGlmICh0eXBlb2YgZXhwaXJlc19pbiA9PT0gJ251bWJlcicgJiYgZXhwaXJlc19pbiA+IDApIHtcclxuICAgICAgICAgICAgbGV0IG5vdyA9IHBhcnNlSW50KERhdGUubm93KCkgLyAxMDAwKTtcclxuICAgICAgICAgICAgdGhpcy5leHBpcmVzX2F0ID0gbm93ICsgZXhwaXJlc19pbjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGV4cGlyZXNfaW4oKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZXhwaXJlc19hdCkge1xyXG4gICAgICAgICAgICBsZXQgbm93ID0gcGFyc2VJbnQoRGF0ZS5ub3coKSAvIDEwMDApO1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5leHBpcmVzX2F0IC0gbm93O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBleHBpcmVkKCkge1xyXG4gICAgICAgIGxldCBleHBpcmVzX2luID0gdGhpcy5leHBpcmVzX2luO1xyXG4gICAgICAgIGlmIChleHBpcmVzX2luICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGV4cGlyZXNfaW4gPD0gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgc2NvcGVzKCkge1xyXG4gICAgICAgIHJldHVybiAodGhpcy5zY29wZSB8fCBcIlwiKS5zcGxpdChcIiBcIik7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIGdldCBpc09wZW5JZENvbm5lY3QoKXtcclxuICAgICAgICByZXR1cm4gdGhpcy5zY29wZXMuaW5kZXhPZihPaWRjU2NvcGUpID49IDA7XHJcbiAgICB9XHJcbn1cclxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvU2lnbmluUmVzcG9uc2UuanNcbiAqKi8iLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcblxyXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcclxuaW1wb3J0IFVybFV0aWxpdHkgZnJvbSAnLi9VcmxVdGlsaXR5JztcclxuaW1wb3J0IFN0YXRlIGZyb20gJy4vU3RhdGUnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2lnbm91dFJlcXVlc3Qge1xyXG4gICAgY29uc3RydWN0b3Ioe3VybCwgaWRfdG9rZW5faGludCwgcG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpLCBkYXRhfSkge1xyXG4gICAgICAgIGlmICghdXJsKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIHVybCBwYXNzZWQgdG8gU2lnbm91dFJlcXVlc3RcIik7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInVybFwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChpZF90b2tlbl9oaW50KSB7XHJcbiAgICAgICAgICAgIHVybCA9IFVybFV0aWxpdHkuYWRkUXVlcnlQYXJhbSh1cmwsIFwiaWRfdG9rZW5faGludFwiLCBpZF90b2tlbl9oaW50KTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmIChwb3N0X2xvZ291dF9yZWRpcmVjdF91cmkpIHtcclxuICAgICAgICAgICAgICAgIHVybCA9IFVybFV0aWxpdHkuYWRkUXVlcnlQYXJhbSh1cmwsIFwicG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpXCIsIHBvc3RfbG9nb3V0X3JlZGlyZWN0X3VyaSk7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGlmIChkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IG5ldyBTdGF0ZSh7IGRhdGEgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgdXJsID0gVXJsVXRpbGl0eS5hZGRRdWVyeVBhcmFtKHVybCwgXCJzdGF0ZVwiLCB0aGlzLnN0YXRlLmlkKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICB0aGlzLnVybCA9IHVybDtcclxuICAgIH1cclxufVxyXG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9TaWdub3V0UmVxdWVzdC5qc1xuICoqLyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cclxuXHJcbmltcG9ydCBVcmxVdGlsaXR5IGZyb20gJy4vVXJsVXRpbGl0eSc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTaWdub3V0UmVzcG9uc2Uge1xyXG4gICAgY29uc3RydWN0b3IodXJsKSB7XHJcblxyXG4gICAgICAgIHZhciB2YWx1ZXMgPSBVcmxVdGlsaXR5LnBhcnNlVXJsRnJhZ21lbnQodXJsLCBcIj9cIik7XHJcblxyXG4gICAgICAgIHRoaXMuZXJyb3IgPSB2YWx1ZXMuZXJyb3I7XHJcbiAgICAgICAgdGhpcy5lcnJvcl9kZXNjcmlwdGlvbiA9IHZhbHVlcy5lcnJvcl9kZXNjcmlwdGlvbjtcclxuICAgICAgICB0aGlzLmVycm9yX3VyaSA9IHZhbHVlcy5lcnJvcl91cmk7XHJcblxyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB2YWx1ZXMuc3RhdGU7XHJcbiAgICB9XHJcbn1cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9TaWdub3V0UmVzcG9uc2UuanNcbiAqKi8iLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcblxyXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEluTWVtb3J5V2ViU3RvcmFnZXtcclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgdGhpcy5fZGF0YSA9IHt9O1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBnZXRJdGVtKGtleSkge1xyXG4gICAgICAgIExvZy5pbmZvKFwiSW5NZW1vcnlXZWJTdG9yYWdlLmdldEl0ZW1cIiwga2V5KTtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YVtrZXldO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBzZXRJdGVtKGtleSwgdmFsdWUpe1xyXG4gICAgICAgIExvZy5pbmZvKFwiSW5NZW1vcnlXZWJTdG9yYWdlLnNldEl0ZW1cIiwga2V5KTtcclxuICAgICAgICB0aGlzLl9kYXRhW2tleV0gPSB2YWx1ZTtcclxuICAgIH0gICBcclxuICAgIFxyXG4gICAgcmVtb3ZlSXRlbShrZXkpe1xyXG4gICAgICAgIExvZy5pbmZvKFwiSW5NZW1vcnlXZWJTdG9yYWdlLnJlbW92ZUl0ZW1cIiwga2V5KTtcclxuICAgICAgICBkZWxldGUgdGhpcy5fZGF0YVtrZXldO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBnZXQgbGVuZ3RoKCkge1xyXG4gICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0aGlzLl9kYXRhKS5sZW5ndGg7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIGtleShpbmRleCkge1xyXG4gICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0aGlzLl9kYXRhKVtpbmRleF07XHJcbiAgICB9XHJcbn1cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9Jbk1lbW9yeVdlYlN0b3JhZ2UuanNcbiAqKi8iLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcblxyXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcclxuaW1wb3J0IE9pZGNDbGllbnQgZnJvbSAnLi9PaWRjQ2xpZW50JztcclxuaW1wb3J0IFVzZXJNYW5hZ2VyU2V0dGluZ3MgZnJvbSAnLi9Vc2VyTWFuYWdlclNldHRpbmdzJztcclxuaW1wb3J0IFVzZXIgZnJvbSAnLi9Vc2VyJztcclxuaW1wb3J0IFVzZXJNYW5hZ2VyRXZlbnRzIGZyb20gJy4vVXNlck1hbmFnZXJFdmVudHMnO1xyXG5pbXBvcnQgU2lsZW50UmVuZXdTZXJ2aWNlIGZyb20gJy4vU2lsZW50UmVuZXdTZXJ2aWNlJztcclxuaW1wb3J0IFNlc3Npb25Nb25pdG9yIGZyb20gJy4vU2Vzc2lvbk1vbml0b3InO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVXNlck1hbmFnZXIgZXh0ZW5kcyBPaWRjQ2xpZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHNldHRpbmdzID0ge30sXHJcbiAgICAgICAgU2lsZW50UmVuZXdTZXJ2aWNlQ3RvciA9IFNpbGVudFJlbmV3U2VydmljZSxcclxuICAgICAgICBTZXNzaW9uTW9uaXRvckN0b3IgPSBTZXNzaW9uTW9uaXRvclxyXG4gICAgKSB7XHJcblxyXG4gICAgICAgIGlmICghKHNldHRpbmdzIGluc3RhbmNlb2YgVXNlck1hbmFnZXJTZXR0aW5ncykpIHtcclxuICAgICAgICAgICAgc2V0dGluZ3MgPSBuZXcgVXNlck1hbmFnZXJTZXR0aW5ncyhzZXR0aW5ncyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHN1cGVyKHNldHRpbmdzKTtcclxuXHJcbiAgICAgICAgdGhpcy5fZXZlbnRzID0gbmV3IFVzZXJNYW5hZ2VyRXZlbnRzKHNldHRpbmdzKTtcclxuXHJcbiAgICAgICAgLy8gb3JkZXIgaXMgaW1wb3J0YW50IGZvciB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM7IHRoZXNlIHNlcnZpY2VzIGRlcGVuZCB1cG9uIHRoZSBldmVudHMuXHJcbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZ3MuYXV0b21hdGljU2lsZW50UmVuZXcpIHtcclxuICAgICAgICAgICAgTG9nLmluZm8oXCJhdXRvbWF0aWNTaWxlbnRSZW5ldyBpcyBjb25maWd1cmVkLCBzZXR0aW5nIHVwIHNpbGVudCByZW5ld1wiKVxyXG4gICAgICAgICAgICB0aGlzLl9zaWxlbnRSZW5ld1NlcnZpY2UgPSBuZXcgU2lsZW50UmVuZXdTZXJ2aWNlQ3Rvcih0aGlzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZ3MubW9uaXRvclNlc3Npb24pIHtcclxuICAgICAgICAgICAgTG9nLmluZm8oXCJtb25pdG9yU2Vzc2lvbiBpcyBjb25maWd1cmVkLCBzZXR0aW5nIHVwIHNlc3Npb24gbW9uaXRvclwiKVxyXG4gICAgICAgICAgICB0aGlzLl9zZXNzaW9uTW9uaXRvciA9IG5ldyBTZXNzaW9uTW9uaXRvckN0b3IodGhpcyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBfcmVkaXJlY3ROYXZpZ2F0b3IoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MucmVkaXJlY3ROYXZpZ2F0b3I7XHJcbiAgICB9XHJcbiAgICBnZXQgX3BvcHVwTmF2aWdhdG9yKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNldHRpbmdzLnBvcHVwTmF2aWdhdG9yO1xyXG4gICAgfVxyXG4gICAgZ2V0IF9pZnJhbWVOYXZpZ2F0b3IoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MuaWZyYW1lTmF2aWdhdG9yO1xyXG4gICAgfVxyXG4gICAgZ2V0IF91c2VyU3RvcmUoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MudXNlclN0b3JlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBldmVudHMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2V2ZW50cztcclxuICAgIH1cclxuXHJcbiAgICBnZXRVc2VyKCkge1xyXG4gICAgICAgIExvZy5pbmZvKFwiVXNlck1hbmFnZXIuZ2V0VXNlclwiKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvYWRVc2VyKCkudGhlbih1c2VyID0+IHtcclxuICAgICAgICAgICAgaWYgKHVzZXIpIHtcclxuICAgICAgICAgICAgICAgIExvZy5pbmZvKFwidXNlciBsb2FkZWRcIik7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5fZXZlbnRzLmxvYWQodXNlciwgZmFsc2UpO1xyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiB1c2VyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgTG9nLmluZm8oXCJ1c2VyIG5vdCBmb3VuZCBpbiBzdG9yYWdlXCIpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZW1vdmVVc2VyKCkge1xyXG4gICAgICAgIExvZy5pbmZvKFwiVXNlck1hbmFnZXIucmVtb3ZlVXNlclwiKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0b3JlVXNlcihudWxsKS50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgTG9nLmluZm8oXCJ1c2VyIHJlbW92ZWQgZnJvbSBzdG9yYWdlXCIpO1xyXG4gICAgICAgICAgICB0aGlzLl9ldmVudHMudW5sb2FkKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2lnbmluUG9wdXAoYXJncyA9IHt9KSB7XHJcbiAgICAgICAgTG9nLmluZm8oXCJVc2VyTWFuYWdlci5zaWduaW5Qb3B1cFwiKTtcclxuXHJcbiAgICAgICAgbGV0IHVybCA9IGFyZ3MucmVkaXJlY3RfdXJpIHx8IHRoaXMuc2V0dGluZ3MucG9wdXBfcmVkaXJlY3RfdXJpIHx8IHRoaXMuc2V0dGluZ3MucmVkaXJlY3RfdXJpO1xyXG4gICAgICAgIGlmICghdXJsKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIHBvcHVwX3JlZGlyZWN0X3VyaSBvciByZWRpcmVjdF91cmkgY29uZmlndXJlZFwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIk5vIHBvcHVwX3JlZGlyZWN0X3VyaSBvciByZWRpcmVjdF91cmkgY29uZmlndXJlZFwiKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBhcmdzLnJlZGlyZWN0X3VyaSA9IHVybDtcclxuICAgICAgICBhcmdzLmRpc3BsYXkgPSBcInBvcHVwXCI7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLl9zaWduaW4oYXJncywgdGhpcy5fcG9wdXBOYXZpZ2F0b3IsIHtcclxuICAgICAgICAgICAgc3RhcnRVcmw6IHVybCxcclxuICAgICAgICAgICAgcG9wdXBXaW5kb3dGZWF0dXJlczogYXJncy5wb3B1cFdpbmRvd0ZlYXR1cmVzIHx8IHRoaXMuc2V0dGluZ3MucG9wdXBXaW5kb3dGZWF0dXJlcyxcclxuICAgICAgICAgICAgcG9wdXBXaW5kb3dUYXJnZXQ6IGFyZ3MucG9wdXBXaW5kb3dUYXJnZXQgfHwgdGhpcy5zZXR0aW5ncy5wb3B1cFdpbmRvd1RhcmdldFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgc2lnbmluUG9wdXBDYWxsYmFjayh1cmwpIHtcclxuICAgICAgICBMb2cuaW5mbyhcIlVzZXJNYW5hZ2VyLnNpZ25pblBvcHVwQ2FsbGJhY2tcIik7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpZ25pbkNhbGxiYWNrKHVybCwgdGhpcy5fcG9wdXBOYXZpZ2F0b3IpO1xyXG4gICAgfVxyXG4gICAgc2lnbmluU2lsZW50KGFyZ3MgPSB7fSkge1xyXG4gICAgICAgIExvZy5pbmZvKFwiVXNlck1hbmFnZXIuc2lnbmluU2lsZW50XCIpO1xyXG5cclxuICAgICAgICBsZXQgdXJsID0gYXJncy5yZWRpcmVjdF91cmkgfHwgdGhpcy5zZXR0aW5ncy5zaWxlbnRfcmVkaXJlY3RfdXJpO1xyXG4gICAgICAgIGlmICghdXJsKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIHNpbGVudF9yZWRpcmVjdF91cmkgY29uZmlndXJlZFwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIk5vIHNpbGVudF9yZWRpcmVjdF91cmkgY29uZmlndXJlZFwiKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBhcmdzLnJlZGlyZWN0X3VyaSA9IHVybDtcclxuICAgICAgICBhcmdzLnByb21wdCA9IFwibm9uZVwiO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5fc2lnbmluKGFyZ3MsIHRoaXMuX2lmcmFtZU5hdmlnYXRvciwge1xyXG4gICAgICAgICAgICBzdGFydFVybDogdXJsLFxyXG4gICAgICAgICAgICBzaWxlbnRSZXF1ZXN0VGltZW91dDogYXJncy5zaWxlbnRSZXF1ZXN0VGltZW91dCB8fCB0aGlzLnNldHRpbmdzLnNpbGVudFJlcXVlc3RUaW1lb3V0XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBzaWduaW5TaWxlbnRDYWxsYmFjayh1cmwpIHtcclxuICAgICAgICBMb2cuaW5mbyhcIlVzZXJNYW5hZ2VyLnNpZ25pblNpbGVudENhbGxiYWNrXCIpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zaWduaW5DYWxsYmFjayh1cmwsIHRoaXMuX2lmcmFtZU5hdmlnYXRvcik7XHJcbiAgICB9XHJcblxyXG4gICAgcXVlcnlTZXNzaW9uU3RhdHVzKGFyZ3MgPSB7fSkge1xyXG4gICAgICAgIExvZy5pbmZvKFwiVXNlck1hbmFnZXIucXVlcnlTZXNzaW9uU3RhdHVzXCIpO1xyXG5cclxuICAgICAgICBsZXQgdXJsID0gYXJncy5yZWRpcmVjdF91cmkgfHwgdGhpcy5zZXR0aW5ncy5zaWxlbnRfcmVkaXJlY3RfdXJpO1xyXG4gICAgICAgIGlmICghdXJsKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIHNpbGVudF9yZWRpcmVjdF91cmkgY29uZmlndXJlZFwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIk5vIHNpbGVudF9yZWRpcmVjdF91cmkgY29uZmlndXJlZFwiKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBhcmdzLnJlZGlyZWN0X3VyaSA9IHVybDtcclxuICAgICAgICBhcmdzLnByb21wdCA9IFwibm9uZVwiO1xyXG4gICAgICAgIGFyZ3MucmVzcG9uc2VfdHlwZSA9IFwiaWRfdG9rZW5cIjtcclxuICAgICAgICBhcmdzLnNjb3BlID0gXCJvcGVuaWRcIjtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpZ25pblN0YXJ0KGFyZ3MsIHRoaXMuX2lmcmFtZU5hdmlnYXRvciwge1xyXG4gICAgICAgICAgICBzdGFydFVybDogdXJsLFxyXG4gICAgICAgICAgICBzaWxlbnRSZXF1ZXN0VGltZW91dDogYXJncy5zaWxlbnRSZXF1ZXN0VGltZW91dCB8fCB0aGlzLnNldHRpbmdzLnNpbGVudFJlcXVlc3RUaW1lb3V0XHJcbiAgICAgICAgfSkudGhlbihuYXZSZXNwb25zZSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NTaWduaW5SZXNwb25zZShuYXZSZXNwb25zZS51cmwpLnRoZW4oc2lnbmluUmVzcG9uc2UgPT4ge1xyXG4gICAgICAgICAgICAgICAgTG9nLmluZm8oXCJnb3Qgc2lnbmluIHJlc3BvbnNlXCIpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChzaWduaW5SZXNwb25zZS5zZXNzaW9uX3N0YXRlICYmIHNpZ25pblJlc3BvbnNlLnByb2ZpbGUuc3ViKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbl9zdGF0ZTogc2lnbmluUmVzcG9uc2Uuc2Vzc2lvbl9zdGF0ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3ViOiBzaWduaW5SZXNwb25zZS5wcm9maWxlLnN1YlxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIF9zaWduaW4oYXJncywgbmF2aWdhdG9yLCBuYXZpZ2F0b3JQYXJhbXMgPSB7fSkge1xyXG4gICAgICAgIExvZy5pbmZvKFwiX3NpZ25pblwiKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc2lnbmluU3RhcnQoYXJncywgbmF2aWdhdG9yLCBuYXZpZ2F0b3JQYXJhbXMpLnRoZW4obmF2UmVzcG9uc2UgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fc2lnbmluRW5kKG5hdlJlc3BvbnNlLnVybCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBfc2lnbmluQ2FsbGJhY2sodXJsLCBuYXZpZ2F0b3IpIHtcclxuICAgICAgICBMb2cuaW5mbyhcIl9zaWduaW5DYWxsYmFja1wiKTtcclxuICAgICAgICByZXR1cm4gbmF2aWdhdG9yLmNhbGxiYWNrKHVybCk7XHJcbiAgICB9XHJcbiAgICBfc2lnbm91dChhcmdzLCBuYXZpZ2F0b3IsIG5hdmlnYXRvclBhcmFtcyA9IHt9KSB7XHJcbiAgICAgICAgTG9nLmluZm8oXCJfc2lnbm91dFwiKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc2lnbm91dFN0YXJ0KGFyZ3MsIG5hdmlnYXRvciwgbmF2aWdhdG9yUGFyYW1zKS50aGVuKG5hdlJlc3BvbnNlID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3NpZ25vdXRFbmQobmF2UmVzcG9uc2UudXJsKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIF9zaWdub3V0Q2FsbGJhY2sodXJsLCBuYXZpZ2F0b3IpIHtcclxuICAgICAgICBMb2cuaW5mbyhcIl9zaWdub3V0Q2FsbGJhY2tcIik7XHJcbiAgICAgICAgcmV0dXJuIG5hdmlnYXRvci5jYWxsYmFjayh1cmwpO1xyXG4gICAgfVxyXG5cclxuICAgIHNpZ25pblJlZGlyZWN0KGFyZ3MpIHtcclxuICAgICAgICBMb2cuaW5mbyhcIlVzZXJNYW5hZ2VyLnNpZ25pblJlZGlyZWN0XCIpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zaWduaW5TdGFydChhcmdzLCB0aGlzLl9yZWRpcmVjdE5hdmlnYXRvcik7XHJcbiAgICB9XHJcbiAgICBzaWduaW5SZWRpcmVjdENhbGxiYWNrKHVybCkge1xyXG4gICAgICAgIExvZy5pbmZvKFwiVXNlck1hbmFnZXIuc2lnbmluUmVkaXJlY3RDYWxsYmFja1wiKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc2lnbmluRW5kKHVybCB8fCB0aGlzLl9yZWRpcmVjdE5hdmlnYXRvci51cmwpO1xyXG4gICAgfVxyXG4gICAgc2lnbm91dFJlZGlyZWN0KGFyZ3MpIHtcclxuICAgICAgICBMb2cuaW5mbyhcIlVzZXJNYW5hZ2VyLnNpZ25vdXRSZWRpcmVjdFwiKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc2lnbm91dFN0YXJ0KGFyZ3MsIHRoaXMuX3JlZGlyZWN0TmF2aWdhdG9yKTtcclxuICAgIH1cclxuICAgIHNpZ25vdXRQb3B1cChhcmdzID0ge30pIHtcclxuICAgICAgICBMb2cuaW5mbyhcIlVzZXJNYW5hZ2VyLnNpZ25vdXRQb3B1cFwiKTtcclxuXHJcbiAgICAgICAgbGV0IHVybCA9IGFyZ3MucmVkaXJlY3RfdXJpIHx8IHRoaXMuc2V0dGluZ3MucG9wdXBfcmVkaXJlY3RfdXJpIHx8IHRoaXMuc2V0dGluZ3MucmVkaXJlY3RfdXJpO1xyXG4gICAgICAgIGlmICghdXJsKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIHBvcHVwX3JlZGlyZWN0X3VyaSBvciByZWRpcmVjdF91cmkgY29uZmlndXJlZFwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIk5vIHBvcHVwX3JlZGlyZWN0X3VyaSBvciByZWRpcmVjdF91cmkgY29uZmlndXJlZFwiKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5fc2lnbm91dChhcmdzLCB0aGlzLl9wb3B1cE5hdmlnYXRvciwge1xyXG4gICAgICAgICAgICBzdGFydFVybDogdXJsLFxyXG4gICAgICAgICAgICBwb3B1cFdpbmRvd0ZlYXR1cmVzOiBhcmdzLnBvcHVwV2luZG93RmVhdHVyZXMgfHwgdGhpcy5zZXR0aW5ncy5wb3B1cFdpbmRvd0ZlYXR1cmVzLFxyXG4gICAgICAgICAgICBwb3B1cFdpbmRvd1RhcmdldDogYXJncy5wb3B1cFdpbmRvd1RhcmdldCB8fCB0aGlzLnNldHRpbmdzLnBvcHVwV2luZG93VGFyZ2V0XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBzaWdub3V0UmVkaXJlY3RDYWxsYmFjayh1cmwpIHtcclxuICAgICAgICBMb2cuaW5mbyhcIlVzZXJNYW5hZ2VyLnNpZ25vdXRSZWRpcmVjdENhbGxiYWNrXCIpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zaWdub3V0RW5kKHVybCB8fCB0aGlzLl9yZWRpcmVjdE5hdmlnYXRvci51cmwpO1xyXG4gICAgfVxyXG5cclxuICAgIF9zaWduaW5TdGFydChhcmdzLCBuYXZpZ2F0b3IsIG5hdmlnYXRvclBhcmFtcyA9IHt9KSB7XHJcbiAgICAgICAgTG9nLmluZm8oXCJfc2lnbmluU3RhcnRcIik7XHJcblxyXG4gICAgICAgIHJldHVybiBuYXZpZ2F0b3IucHJlcGFyZShuYXZpZ2F0b3JQYXJhbXMpLnRoZW4oaGFuZGxlID0+IHtcclxuICAgICAgICAgICAgTG9nLmluZm8oXCJnb3QgbmF2aWdhdG9yIHdpbmRvdyBoYW5kbGVcIik7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVTaWduaW5SZXF1ZXN0KGFyZ3MpLnRoZW4oc2lnbmluUmVxdWVzdCA9PiB7XHJcbiAgICAgICAgICAgICAgICBMb2cuaW5mbyhcImdvdCBzaWduaW4gcmVxdWVzdFwiKTtcclxuXHJcbiAgICAgICAgICAgICAgICBuYXZpZ2F0b3JQYXJhbXMudXJsID0gc2lnbmluUmVxdWVzdC51cmw7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlLm5hdmlnYXRlKG5hdmlnYXRvclBhcmFtcyk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgX3NpZ25pbkVuZCh1cmwpIHtcclxuICAgICAgICBMb2cuaW5mbyhcIl9zaWduaW5FbmRcIik7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NTaWduaW5SZXNwb25zZSh1cmwpLnRoZW4oc2lnbmluUmVzcG9uc2UgPT4ge1xyXG4gICAgICAgICAgICBMb2cuaW5mbyhcImdvdCBzaWduaW4gcmVzcG9uc2VcIik7XHJcblxyXG4gICAgICAgICAgICBsZXQgdXNlciA9IG5ldyBVc2VyKHNpZ25pblJlc3BvbnNlKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9zdG9yZVVzZXIodXNlcikudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBMb2cuaW5mbyhcInVzZXIgc3RvcmVkXCIpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50cy5sb2FkKHVzZXIpO1xyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiB1c2VyO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBfc2lnbm91dFN0YXJ0KGFyZ3MgPSB7fSwgbmF2aWdhdG9yLCBuYXZpZ2F0b3JQYXJhbXMgPSB7fSkge1xyXG4gICAgICAgIExvZy5pbmZvKFwiX3NpZ25vdXRTdGFydFwiKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG5hdmlnYXRvci5wcmVwYXJlKG5hdmlnYXRvclBhcmFtcykudGhlbihoYW5kbGUgPT4ge1xyXG4gICAgICAgICAgICBMb2cuaW5mbyhcImdvdCBuYXZpZ2F0b3Igd2luZG93IGhhbmRsZVwiKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldFVzZXIoKS50aGVuKHVzZXIgPT4ge1xyXG4gICAgICAgICAgICAgICAgTG9nLmluZm8oXCJsb2FkZWQgY3VycmVudCB1c2VyIGZyb20gc3RvcmFnZVwiKTtcclxuXHJcbiAgICAgICAgICAgICAgICB2YXIgaWRfdG9rZW4gPSBhcmdzLmlkX3Rva2VuX2hpbnQgfHwgdXNlciAmJiB1c2VyLmlkX3Rva2VuO1xyXG4gICAgICAgICAgICAgICAgaWYgKGlkX3Rva2VuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgTG9nLmluZm8oXCJTZXR0aW5nIGlkX3Rva2VuIGludG8gc2lnbm91dCByZXF1ZXN0XCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGFyZ3MuaWRfdG9rZW5faGludCA9IGlkX3Rva2VuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlbW92ZVVzZXIoKS50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBMb2cuaW5mbyhcInVzZXIgcmVtb3ZlZCwgY3JlYXRpbmcgc2lnbm91dCByZXF1ZXN0XCIpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVTaWdub3V0UmVxdWVzdChhcmdzKS50aGVuKHNpZ25vdXRSZXF1ZXN0ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmluZm8oXCJnb3Qgc2lnbm91dCByZXF1ZXN0XCIpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdG9yUGFyYW1zLnVybCA9IHNpZ25vdXRSZXF1ZXN0LnVybDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZS5uYXZpZ2F0ZShuYXZpZ2F0b3JQYXJhbXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgX3NpZ25vdXRFbmQodXJsKSB7XHJcbiAgICAgICAgTG9nLmluZm8oXCJfc2lnbm91dEVuZFwiKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc1NpZ25vdXRSZXNwb25zZSh1cmwpLnRoZW4oc2lnbm91dFJlc3BvbnNlID0+IHtcclxuICAgICAgICAgICAgTG9nLmluZm8oXCJnb3Qgc2lnbm91dCByZXNwb25zZVwiKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBzaWdub3V0UmVzcG9uc2U7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IF91c2VyU3RvcmVLZXkoKSB7XHJcbiAgICAgICAgcmV0dXJuIGB1c2VyOiR7dGhpcy5zZXR0aW5ncy5hdXRob3JpdHl9OiR7dGhpcy5zZXR0aW5ncy5jbGllbnRfaWR9YDtcclxuICAgIH1cclxuXHJcbiAgICBfbG9hZFVzZXIoKSB7XHJcbiAgICAgICAgTG9nLmluZm8oXCJfbG9hZFVzZXJcIik7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLl91c2VyU3RvcmUuZ2V0KHRoaXMuX3VzZXJTdG9yZUtleSkudGhlbihzdG9yYWdlU3RyaW5nID0+IHtcclxuICAgICAgICAgICAgaWYgKHN0b3JhZ2VTdHJpbmcpIHtcclxuICAgICAgICAgICAgICAgIExvZy5pbmZvKFwidXNlciBzdG9yYWdlU3RyaW5nIGxvYWRlZFwiKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBVc2VyLmZyb21TdG9yYWdlU3RyaW5nKHN0b3JhZ2VTdHJpbmcpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBMb2cuaW5mbyhcIm5vIHVzZXIgc3RvcmFnZVN0cmluZ1wiKTtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgX3N0b3JlVXNlcih1c2VyKSB7XHJcbiAgICAgICAgaWYgKHVzZXIpIHtcclxuICAgICAgICAgICAgTG9nLmluZm8oXCJfc3RvcmVVc2VyIHN0b3JpbmcgdXNlclwiKTtcclxuXHJcbiAgICAgICAgICAgIHZhciBzdG9yYWdlU3RyaW5nID0gdXNlci50b1N0b3JhZ2VTdHJpbmcoKTtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3VzZXJTdG9yZS5zZXQodGhpcy5fdXNlclN0b3JlS2V5LCBzdG9yYWdlU3RyaW5nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIExvZy5pbmZvKFwiX3N0b3JlVXNlciByZW1vdmluZyB1c2VyIHN0b3JhZ2VcIik7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl91c2VyU3RvcmUucmVtb3ZlKHRoaXMuX3VzZXJTdG9yZUtleSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL1VzZXJNYW5hZ2VyLmpzXG4gKiovIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5cclxuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XHJcbmltcG9ydCBPaWRjQ2xpZW50U2V0dGluZ3MgZnJvbSAnLi9PaWRjQ2xpZW50U2V0dGluZ3MnO1xyXG5pbXBvcnQgUmVkaXJlY3ROYXZpZ2F0b3IgZnJvbSAnLi9SZWRpcmVjdE5hdmlnYXRvcic7XHJcbmltcG9ydCBQb3B1cE5hdmlnYXRvciBmcm9tICcuL1BvcHVwTmF2aWdhdG9yJztcclxuaW1wb3J0IElGcmFtZU5hdmlnYXRvciBmcm9tICcuL0lGcmFtZU5hdmlnYXRvcic7XHJcbmltcG9ydCBXZWJTdG9yYWdlU3RhdGVTdG9yZSBmcm9tICcuL1dlYlN0b3JhZ2VTdGF0ZVN0b3JlJztcclxuaW1wb3J0IEdsb2JhbCBmcm9tICcuL0dsb2JhbCc7XHJcblxyXG5jb25zdCBEZWZhdWx0QWNjZXNzVG9rZW5FeHBpcmluZ05vdGlmaWNhdGlvblRpbWUgPSA2MDtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFVzZXJNYW5hZ2VyU2V0dGluZ3MgZXh0ZW5kcyBPaWRjQ2xpZW50U2V0dGluZ3Mge1xyXG4gICAgY29uc3RydWN0b3Ioe1xyXG4gICAgICAgIHBvcHVwX3JlZGlyZWN0X3VyaSxcclxuICAgICAgICBwb3B1cFdpbmRvd0ZlYXR1cmVzLFxyXG4gICAgICAgIHBvcHVwV2luZG93VGFyZ2V0LFxyXG4gICAgICAgIHNpbGVudF9yZWRpcmVjdF91cmksXHJcbiAgICAgICAgc2lsZW50UmVxdWVzdFRpbWVvdXQsXHJcbiAgICAgICAgYXV0b21hdGljU2lsZW50UmVuZXcgPSBmYWxzZSxcclxuICAgICAgICBtb25pdG9yU2Vzc2lvbiA9IHRydWUsXHJcbiAgICAgICAgYWNjZXNzVG9rZW5FeHBpcmluZ05vdGlmaWNhdGlvblRpbWUgPSBEZWZhdWx0QWNjZXNzVG9rZW5FeHBpcmluZ05vdGlmaWNhdGlvblRpbWUsXHJcbiAgICAgICAgcmVkaXJlY3ROYXZpZ2F0b3IgPSBuZXcgUmVkaXJlY3ROYXZpZ2F0b3IoKSxcclxuICAgICAgICBwb3B1cE5hdmlnYXRvciA9IG5ldyBQb3B1cE5hdmlnYXRvcigpLFxyXG4gICAgICAgIGlmcmFtZU5hdmlnYXRvciA9IG5ldyBJRnJhbWVOYXZpZ2F0b3IoKSxcclxuICAgICAgICB1c2VyU3RvcmUgPSBuZXcgV2ViU3RvcmFnZVN0YXRlU3RvcmUoeyBzdG9yZTogR2xvYmFsLnNlc3Npb25TdG9yYWdlIH0pXHJcbiAgICB9ID0ge30pIHtcclxuICAgICAgICBzdXBlcihhcmd1bWVudHNbMF0pO1xyXG5cclxuICAgICAgICB0aGlzLl9wb3B1cF9yZWRpcmVjdF91cmkgPSBwb3B1cF9yZWRpcmVjdF91cmk7XHJcbiAgICAgICAgdGhpcy5fcG9wdXBXaW5kb3dGZWF0dXJlcyA9IHBvcHVwV2luZG93RmVhdHVyZXM7XHJcbiAgICAgICAgdGhpcy5fcG9wdXBXaW5kb3dUYXJnZXQgPSBwb3B1cFdpbmRvd1RhcmdldDtcclxuICAgICAgICBcclxuICAgICAgICB0aGlzLl9zaWxlbnRfcmVkaXJlY3RfdXJpID0gc2lsZW50X3JlZGlyZWN0X3VyaTtcclxuICAgICAgICB0aGlzLl9zaWxlbnRSZXF1ZXN0VGltZW91dCA9IHNpbGVudFJlcXVlc3RUaW1lb3V0O1xyXG4gICAgICAgIHRoaXMuX2F1dG9tYXRpY1NpbGVudFJlbmV3ID0gISFhdXRvbWF0aWNTaWxlbnRSZW5ldztcclxuICAgICAgICB0aGlzLl9hY2Nlc3NUb2tlbkV4cGlyaW5nTm90aWZpY2F0aW9uVGltZSA9IGFjY2Vzc1Rva2VuRXhwaXJpbmdOb3RpZmljYXRpb25UaW1lO1xyXG5cclxuICAgICAgICB0aGlzLl9tb25pdG9yU2Vzc2lvbiA9IG1vbml0b3JTZXNzaW9uO1xyXG5cclxuICAgICAgICB0aGlzLl9yZWRpcmVjdE5hdmlnYXRvciA9IHJlZGlyZWN0TmF2aWdhdG9yO1xyXG4gICAgICAgIHRoaXMuX3BvcHVwTmF2aWdhdG9yID0gcG9wdXBOYXZpZ2F0b3I7XHJcbiAgICAgICAgdGhpcy5faWZyYW1lTmF2aWdhdG9yID0gaWZyYW1lTmF2aWdhdG9yO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMuX3VzZXJTdG9yZSA9IHVzZXJTdG9yZTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgcG9wdXBfcmVkaXJlY3RfdXJpKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wb3B1cF9yZWRpcmVjdF91cmk7XHJcbiAgICB9XHJcbiAgICBnZXQgcG9wdXBXaW5kb3dGZWF0dXJlcygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcG9wdXBXaW5kb3dGZWF0dXJlcztcclxuICAgIH1cclxuICAgIGdldCBwb3B1cFdpbmRvd1RhcmdldCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcG9wdXBXaW5kb3dUYXJnZXQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHNpbGVudF9yZWRpcmVjdF91cmkoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpbGVudF9yZWRpcmVjdF91cmk7XHJcbiAgICB9XHJcbiAgICAgZ2V0IHNpbGVudFJlcXVlc3RUaW1lb3V0KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zaWxlbnRSZXF1ZXN0VGltZW91dDtcclxuICAgIH1cclxuICAgIGdldCBhdXRvbWF0aWNTaWxlbnRSZW5ldygpIHtcclxuICAgICAgICByZXR1cm4gISEodGhpcy5zaWxlbnRfcmVkaXJlY3RfdXJpICYmIHRoaXMuX2F1dG9tYXRpY1NpbGVudFJlbmV3KTtcclxuICAgIH1cclxuICAgIGdldCBhY2Nlc3NUb2tlbkV4cGlyaW5nTm90aWZpY2F0aW9uVGltZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fYWNjZXNzVG9rZW5FeHBpcmluZ05vdGlmaWNhdGlvblRpbWU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IG1vbml0b3JTZXNzaW9uKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9tb25pdG9yU2Vzc2lvbjtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgcmVkaXJlY3ROYXZpZ2F0b3IoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlZGlyZWN0TmF2aWdhdG9yO1xyXG4gICAgfVxyXG4gICAgZ2V0IHBvcHVwTmF2aWdhdG9yKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wb3B1cE5hdmlnYXRvcjtcclxuICAgIH1cclxuICAgIGdldCBpZnJhbWVOYXZpZ2F0b3IoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lmcmFtZU5hdmlnYXRvcjtcclxuICAgIH1cclxuICAgIFxyXG4gICAgZ2V0IHVzZXJTdG9yZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fdXNlclN0b3JlO1xyXG4gICAgfVxyXG59XHJcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL1VzZXJNYW5hZ2VyU2V0dGluZ3MuanNcbiAqKi8iLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcblxyXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlZGlyZWN0TmF2aWdhdG9yIHtcclxuICAgIFxyXG4gICAgcHJlcGFyZSgpIHtcclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIG5hdmlnYXRlKHBhcmFtcykge1xyXG4gICAgICAgIExvZy5pbmZvKFwiUmVkaXJlY3ROYXZpZ2F0b3IubmF2aWdhdGVcIik7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKCFwYXJhbXMgfHwgIXBhcmFtcy51cmwpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gdXJsIHByb3ZpZGVkXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiTm8gdXJsIHByb3ZpZGVkXCIpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbiA9IHBhcmFtcy51cmw7XHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCB1cmwoKSB7XHJcbiAgICAgICAgTG9nLmluZm8oXCJSZWRpcmVjdE5hdmlnYXRvci51cmxcIik7XHJcbiAgICAgICAgcmV0dXJuIHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xyXG4gICAgfVxyXG59XHJcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL1JlZGlyZWN0TmF2aWdhdG9yLmpzXG4gKiovIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5cclxuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XHJcbmltcG9ydCBQb3B1cFdpbmRvdyBmcm9tICcuL1BvcHVwV2luZG93JztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBvcHVwTmF2aWdhdG9yIHtcclxuICAgIFxyXG4gICAgcHJlcGFyZShwYXJhbXMpIHtcclxuICAgICAgICBsZXQgcG9wdXAgPSBuZXcgUG9wdXBXaW5kb3cocGFyYW1zKTtcclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHBvcHVwKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgY2FsbGJhY2sodXJsKSB7XHJcbiAgICAgICAgTG9nLmluZm8oXCJQb3B1cE5hdmlnYXRvci5jYWxsYmFja1wiKTtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgUG9wdXBXaW5kb3cubm90aWZ5T3BlbmVyKHVybCk7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9Qb3B1cE5hdmlnYXRvci5qc1xuICoqLyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cclxuXHJcbmltcG9ydCBMb2cgZnJvbSAnLi9Mb2cnO1xyXG5cclxuY29uc3QgQ2hlY2tGb3JQb3B1cENsb3NlZEludGVydmFsID0gNTAwO1xyXG5jb25zdCBEZWZhdWx0UG9wdXBGZWF0dXJlcyA9ICdsb2NhdGlvbj1ubyx0b29sYmFyPW5vLHdpZHRoPTUwMCxoZWlnaHQ9NTAwLGxlZnQ9MTAwLHRvcD0xMDAnO1xyXG5jb25zdCBEZWZhdWx0UG9wdXBUYXJnZXQgPSBcIl9ibGFua1wiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUG9wdXBXaW5kb3cge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHBhcmFtcykge1xyXG4gICAgICAgIExvZy5pbmZvKFwiUG9wdXBXaW5kb3cuY3RvclwiKTtcclxuXHJcbiAgICAgICAgdGhpcy5fcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5fcmVzb2x2ZSA9IHJlc29sdmU7XHJcbiAgICAgICAgICAgIHRoaXMuX3JlamVjdCA9IHJlamVjdDtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5fYm91bmRNZXNzYWdlRXZlbnQgPSB0aGlzLl9tZXNzYWdlLmJpbmQodGhpcyk7XHJcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIHRoaXMuX2JvdW5kTWVzc2FnZUV2ZW50LCBmYWxzZSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgbGV0IGZlYXR1cmVzID0gcGFyYW1zLnBvcHVwV2luZG93RmVhdHVyZXMgfHwgRGVmYXVsdFBvcHVwRmVhdHVyZXM7XHJcbiAgICAgICAgbGV0IHRhcmdldCA9IHBhcmFtcy5wb3B1cFdpbmRvd1RhcmdldCB8fCBEZWZhdWx0UG9wdXBUYXJnZXQ7XHJcblxyXG4gICAgICAgIHRoaXMuX3BvcHVwID0gd2luZG93Lm9wZW4oJycsIHRhcmdldCwgZmVhdHVyZXMpO1xyXG4gICAgICAgIGlmICh0aGlzLl9wb3B1cCkge1xyXG4gICAgICAgICAgICBMb2cuaW5mbyhcInBvcHVwIHN1Y2Nlc3NmdWxseSBjcmVhdGVkXCIpO1xyXG4gICAgICAgICAgICB0aGlzLl9jaGVja0ZvclBvcHVwQ2xvc2VkVGltZXIgPSB3aW5kb3cuc2V0SW50ZXJ2YWwodGhpcy5fY2hlY2tGb3JQb3B1cENsb3NlZC5iaW5kKHRoaXMpLCBDaGVja0ZvclBvcHVwQ2xvc2VkSW50ZXJ2YWwpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBuYXZpZ2F0ZShwYXJhbXMpIHtcclxuICAgICAgICBMb2cuaW5mbyhcIlBvcHVwV2luZG93Lm5hdmlnYXRlXCIpO1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuX3BvcHVwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vycm9yKFwiRXJyb3Igb3BlbmluZyBwb3B1cCB3aW5kb3dcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKCFwYXJhbXMgfHwgIXBhcmFtcy51cmwpIHtcclxuICAgICAgICAgICAgdGhpcy5fZXJyb3IoXCJObyB1cmwgcHJvdmlkZWRcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBMb2cuaW5mbyhcIlNldHRpbmcgVVJMIGluIHBvcHVwXCIpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fcG9wdXAuZm9jdXMoKTtcclxuICAgICAgICAgICAgdGhpcy5fcG9wdXAud2luZG93LmxvY2F0aW9uID0gcGFyYW1zLnVybDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLnByb21pc2U7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHByb21pc2UoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Byb21pc2U7XHJcbiAgICB9XHJcblxyXG4gICAgX3N1Y2Nlc3MoZGF0YSkge1xyXG4gICAgICAgIHRoaXMuX2NsZWFudXAoKTtcclxuXHJcbiAgICAgICAgTG9nLmluZm8oXCJTdWNjZXNzZnVsIHJlc3BvbnNlIGZyb20gcG9wdXAgd2luZG93XCIpO1xyXG4gICAgICAgIHRoaXMuX3Jlc29sdmUoZGF0YSk7XHJcbiAgICB9XHJcbiAgICBfZXJyb3IobWVzc2FnZSkge1xyXG4gICAgICAgIHRoaXMuX2NsZWFudXAoKTtcclxuXHJcbiAgICAgICAgTG9nLmVycm9yKG1lc3NhZ2UpO1xyXG4gICAgICAgIHRoaXMuX3JlamVjdChuZXcgRXJyb3IobWVzc2FnZSkpO1xyXG4gICAgfVxyXG5cclxuICAgIF9jbGVhbnVwKCkge1xyXG4gICAgICAgIExvZy5pbmZvKFwiUG9wdXBXaW5kb3cuX2NsZWFudXBcIik7XHJcblxyXG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCB0aGlzLl9ib3VuZE1lc3NhZ2VFdmVudCwgZmFsc2UpO1xyXG4gICAgICAgIHdpbmRvdy5jbGVhckludGVydmFsKHRoaXMuX2NoZWNrRm9yUG9wdXBDbG9zZWRUaW1lcik7XHJcblxyXG4gICAgICAgIHRoaXMuX2NoZWNrRm9yUG9wdXBDbG9zZWRUaW1lciA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fYm91bmRNZXNzYWdlRXZlbnRzc2FnZSA9IG51bGw7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKHRoaXMuX3BvcHVwKXtcclxuICAgICAgICAgICAgdGhpcy5fcG9wdXAuY2xvc2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fcG9wdXAgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIF9jaGVja0ZvclBvcHVwQ2xvc2VkKCkge1xyXG4gICAgICAgIExvZy5pbmZvKFwiUG9wdXBXaW5kb3cuX2NoZWNrRm9yUG9wdXBDbG9zZWRcIik7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5fcG9wdXAgfHwgdGhpcy5fcG9wdXAuY2xvc2VkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vycm9yKFwiUG9wdXAgd2luZG93IGNsb3NlZFwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgX21lc3NhZ2UoZSkge1xyXG4gICAgICAgIExvZy5pbmZvKFwiUG9wdXBXaW5kb3cuX21lc3NhZ2VcIik7XHJcblxyXG4gICAgICAgIGlmIChlLm9yaWdpbiA9PT0gdGhpcy5fb3JpZ2luICYmXHJcbiAgICAgICAgICAgIGUuc291cmNlID09PSB0aGlzLl9wb3B1cC53aW5kb3dcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgTG9nLmluZm8oXCJwcm9jZXNzaW5nIG1lc3NhZ2VcIik7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBsZXQgdXJsID0gZS5kYXRhIHx8IGUuc291cmNlLmxvY2F0aW9uLmhyZWY7IC8vIGZvciBJRTlcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2NsZWFudXAoKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh1cmwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3N1Y2Nlc3MoeyB1cmw6IHVybCB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2Vycm9yKFwiSW52YWxpZCByZXNwb25zZSBmcm9tIHBvcHVwXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBfb3JpZ2luKCkge1xyXG4gICAgICAgIHJldHVybiBsb2NhdGlvbi5wcm90b2NvbCArIFwiLy9cIiArIGxvY2F0aW9uLmhvc3Q7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIG5vdGlmeU9wZW5lcih1cmwpIHtcclxuICAgICAgICBMb2cuaW5mbyhcIlBvcHVwV2luZG93Lm5vdGlmeU9wZW5lclwiKTtcclxuXHJcbiAgICAgICAgaWYgKHdpbmRvdy5vcGVuZXIpIHtcclxuICAgICAgICAgICAgdXJsID0gdXJsIHx8IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xyXG4gICAgICAgICAgICBpZiAodXJsKSB7XHJcbiAgICAgICAgICAgICAgICBMb2cuaW5mbyhcInBvc3RpbmcgdXJsIG1lc3NhZ2UgdG8gb3BlbmVyXCIpO1xyXG4gICAgICAgICAgICAgICAgd2luZG93Lm9wZW5lci5wb3N0TWVzc2FnZSh1cmwsIGxvY2F0aW9uLnByb3RvY29sICsgXCIvL1wiICsgbG9jYXRpb24uaG9zdCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvUG9wdXBXaW5kb3cuanNcbiAqKi8iLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcblxyXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcclxuaW1wb3J0IElGcmFtZVdpbmRvdyBmcm9tICcuL0lGcmFtZVdpbmRvdyc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBJRnJhbWVOYXZpZ2F0b3Ige1xyXG5cclxuICAgIHByZXBhcmUocGFyYW1zKSB7XHJcbiAgICAgICAgbGV0IGZyYW1lID0gbmV3IElGcmFtZVdpbmRvdyhwYXJhbXMpO1xyXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZnJhbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGNhbGxiYWNrKHVybCkge1xyXG4gICAgICAgIExvZy5pbmZvKFwiSUZyYW1lTmF2aWdhdG9yLmNhbGxiYWNrXCIpO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBJRnJhbWVXaW5kb3cubm90aWZ5UGFyZW50KHVybCk7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9JRnJhbWVOYXZpZ2F0b3IuanNcbiAqKi8iLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcblxyXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcclxuXHJcbmNvbnN0IERlZmF1bHRUaW1lb3V0ID0gNTAwMDtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIElGcmFtZVdpbmRvdyB7XHJcblxyXG4gICAgY29uc3RydWN0b3IocGFyYW1zKSB7XHJcbiAgICAgICAgTG9nLmluZm8oXCJJRnJhbWVXaW5kb3cuY3RvclwiKTtcclxuXHJcbiAgICAgICAgdGhpcy5fcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5fcmVzb2x2ZSA9IHJlc29sdmU7XHJcbiAgICAgICAgICAgIHRoaXMuX3JlamVjdCA9IHJlamVjdDtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5fYm91bmRNZXNzYWdlRXZlbnQgPSB0aGlzLl9tZXNzYWdlLmJpbmQodGhpcyk7XHJcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIHRoaXMuX2JvdW5kTWVzc2FnZUV2ZW50LCBmYWxzZSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgdGhpcy5fZnJhbWUgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlmcmFtZVwiKTtcclxuICAgICAgICB0aGlzLl9mcmFtZS5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XHJcbiAgICAgICAgd2luZG93LmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5fZnJhbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIG5hdmlnYXRlKHBhcmFtcykge1xyXG4gICAgICAgIExvZy5pbmZvKFwiSUZyYW1lV2luZG93Lm5hdmlnYXRlXCIpO1xyXG5cclxuICAgICAgICBpZiAoIXBhcmFtcyB8fCAhcGFyYW1zLnVybCkge1xyXG4gICAgICAgICAgICB0aGlzLl9lcnJvcihcIk5vIHVybCBwcm92aWRlZFwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCB0aW1lb3V0ID0gcGFyYW1zLnNpbGVudFJlcXVlc3RUaW1lb3V0IHx8IERlZmF1bHRUaW1lb3V0O1xyXG4gICAgICAgICAgICBMb2cuaW5mbyhcIlVzaW5nIHRpbWVvdXQgb2Y6XCIsIHRpbWVvdXQpO1xyXG4gICAgICAgICAgICB0aGlzLl90aW1lciA9IHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuX3RpbWVvdXQuYmluZCh0aGlzKSwgdGltZW91dCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2ZyYW1lLnNyYyA9IHBhcmFtcy51cmw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiB0aGlzLnByb21pc2U7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHByb21pc2UoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Byb21pc2U7XHJcbiAgICB9XHJcblxyXG4gICAgX3N1Y2Nlc3MoZGF0YSkge1xyXG4gICAgICAgIHRoaXMuX2NsZWFudXAoKTtcclxuXHJcbiAgICAgICAgTG9nLmluZm8oXCJTdWNjZXNzZnVsIHJlc3BvbnNlIGZyb20gZnJhbWUgd2luZG93XCIpO1xyXG4gICAgICAgIHRoaXMuX3Jlc29sdmUoZGF0YSk7XHJcbiAgICB9XHJcbiAgICBfZXJyb3IobWVzc2FnZSkge1xyXG4gICAgICAgIHRoaXMuX2NsZWFudXAoKTtcclxuXHJcbiAgICAgICAgTG9nLmVycm9yKG1lc3NhZ2UpO1xyXG4gICAgICAgIHRoaXMuX3JlamVjdChuZXcgRXJyb3IobWVzc2FnZSkpO1xyXG4gICAgfVxyXG5cclxuICAgIF9jbGVhbnVwKCkge1xyXG4gICAgICAgIExvZy5pbmZvKFwiSUZyYW1lV2luZG93Ll9jbGVhbnVwXCIpO1xyXG5cclxuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgdGhpcy5fYm91bmRNZXNzYWdlRXZlbnQsIGZhbHNlKTtcclxuICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyKTtcclxuICAgICAgICB3aW5kb3cuZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0aGlzLl9mcmFtZSk7XHJcblxyXG4gICAgICAgIHRoaXMuX3RpbWVyID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9mcmFtZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fYm91bmRNZXNzYWdlRXZlbnQgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIF90aW1lb3V0KCkge1xyXG4gICAgICAgIExvZy5pbmZvKFwiSUZyYW1lV2luZG93Ll90aW1lb3V0XCIpO1xyXG4gICAgICAgIHRoaXMuX2Vycm9yKFwiRnJhbWUgd2luZG93IHRpbWVkIG91dFwiKTtcclxuICAgIH1cclxuXHJcbiAgICBfbWVzc2FnZShlKSB7XHJcbiAgICAgICAgTG9nLmluZm8oXCJJRnJhbWVXaW5kb3cuX21lc3NhZ2VcIik7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl90aW1lciAmJlxyXG4gICAgICAgICAgICBlLm9yaWdpbiA9PT0gdGhpcy5fb3JpZ2luICYmXHJcbiAgICAgICAgICAgIGUuc291cmNlID09PSB0aGlzLl9mcmFtZS5jb250ZW50V2luZG93XHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIGxldCB1cmwgPSBlLmRhdGE7XHJcbiAgICAgICAgICAgIGlmICh1cmwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3N1Y2Nlc3MoeyB1cmw6IHVybCB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2Vycm9yKFwiSW52YWxpZCByZXNwb25zZSBmcm9tIGZyYW1lXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBfb3JpZ2luKCkge1xyXG4gICAgICAgIHJldHVybiBsb2NhdGlvbi5wcm90b2NvbCArIFwiLy9cIiArIGxvY2F0aW9uLmhvc3Q7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIG5vdGlmeVBhcmVudCh1cmwpIHtcclxuICAgICAgICBMb2cuaW5mbyhcIklGcmFtZVdpbmRvdy5ub3RpZnlQYXJlbnRcIik7XHJcblxyXG4gICAgICAgIGlmICh3aW5kb3cucGFyZW50ICYmIHdpbmRvdyAhPT0gd2luZG93LnBhcmVudCkge1xyXG4gICAgICAgICAgICB1cmwgPSB1cmwgfHwgd2luZG93LmxvY2F0aW9uLmhyZWY7XHJcbiAgICAgICAgICAgIGlmICh1cmwpIHtcclxuICAgICAgICAgICAgICAgIExvZy5pbmZvKFwicG9zdGluZyB1cmwgbWVzc2FnZSB0byBwYXJlbnRcIik7XHJcbiAgICAgICAgICAgICAgICB3aW5kb3cucGFyZW50LnBvc3RNZXNzYWdlKHVybCwgbG9jYXRpb24ucHJvdG9jb2wgKyBcIi8vXCIgKyBsb2NhdGlvbi5ob3N0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9JRnJhbWVXaW5kb3cuanNcbiAqKi8iLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcblxyXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFVzZXIge1xyXG4gICAgY29uc3RydWN0b3Ioe2lkX3Rva2VuLCBzZXNzaW9uX3N0YXRlLCBhY2Nlc3NfdG9rZW4sIHRva2VuX3R5cGUsIHNjb3BlLCBwcm9maWxlLCBleHBpcmVzX2F0LCBzdGF0ZX0pIHtcclxuICAgICAgICB0aGlzLmlkX3Rva2VuID0gaWRfdG9rZW47XHJcbiAgICAgICAgdGhpcy5zZXNzaW9uX3N0YXRlID0gc2Vzc2lvbl9zdGF0ZTtcclxuICAgICAgICB0aGlzLmFjY2Vzc190b2tlbiA9IGFjY2Vzc190b2tlbjtcclxuICAgICAgICB0aGlzLnRva2VuX3R5cGUgPSB0b2tlbl90eXBlO1xyXG4gICAgICAgIHRoaXMuc2NvcGUgPSBzY29wZTtcclxuICAgICAgICB0aGlzLnByb2ZpbGUgPSBwcm9maWxlO1xyXG4gICAgICAgIHRoaXMuZXhwaXJlc19hdCA9IGV4cGlyZXNfYXQ7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBleHBpcmVzX2luKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmV4cGlyZXNfYXQpIHtcclxuICAgICAgICAgICAgbGV0IG5vdyA9IHBhcnNlSW50KERhdGUubm93KCkgLyAxMDAwKTtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXhwaXJlc19hdCAtIG5vdztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZXhwaXJlZCgpIHtcclxuICAgICAgICBsZXQgZXhwaXJlc19pbiA9IHRoaXMuZXhwaXJlc19pbjtcclxuICAgICAgICBpZiAoZXhwaXJlc19pbiAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBleHBpcmVzX2luIDw9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHNjb3BlcygpIHtcclxuICAgICAgICByZXR1cm4gKHRoaXMuc2NvcGUgfHwgXCJcIikuc3BsaXQoXCIgXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHRvU3RvcmFnZVN0cmluZygpIHtcclxuICAgICAgICBMb2cuaW5mbyhcIlVzZXIudG9TdG9yYWdlU3RyaW5nXCIpO1xyXG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XHJcbiAgICAgICAgICAgIGlkX3Rva2VuOiB0aGlzLmlkX3Rva2VuLFxyXG4gICAgICAgICAgICBzZXNzaW9uX3N0YXRlOiB0aGlzLnNlc3Npb25fc3RhdGUsXHJcbiAgICAgICAgICAgIGFjY2Vzc190b2tlbjogdGhpcy5hY2Nlc3NfdG9rZW4sXHJcbiAgICAgICAgICAgIHRva2VuX3R5cGU6IHRoaXMudG9rZW5fdHlwZSxcclxuICAgICAgICAgICAgc2NvcGU6IHRoaXMuc2NvcGUsXHJcbiAgICAgICAgICAgIHByb2ZpbGU6IHRoaXMucHJvZmlsZSxcclxuICAgICAgICAgICAgZXhwaXJlc19hdDogdGhpcy5leHBpcmVzX2F0XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGZyb21TdG9yYWdlU3RyaW5nKHN0b3JhZ2VTdHJpbmcpIHtcclxuICAgICAgICBMb2cuaW5mbyhcIlVzZXIuZnJvbVN0b3JhZ2VTdHJpbmdcIik7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBVc2VyKEpTT04ucGFyc2Uoc3RvcmFnZVN0cmluZykpO1xyXG4gICAgfVxyXG59XG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvVXNlci5qc1xuICoqLyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cclxuXHJcbmltcG9ydCBMb2cgZnJvbSAnLi9Mb2cnO1xyXG5pbXBvcnQgQWNjZXNzVG9rZW5FdmVudHMgZnJvbSAnLi9BY2Nlc3NUb2tlbkV2ZW50cyc7XHJcbmltcG9ydCBFdmVudCBmcm9tICcuL0V2ZW50JztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFVzZXJNYW5hZ2VyRXZlbnRzIGV4dGVuZHMgQWNjZXNzVG9rZW5FdmVudHMge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHNldHRpbmdzKSB7XHJcbiAgICAgICAgc3VwZXIoc2V0dGluZ3MpO1xyXG4gICAgICAgIHRoaXMuX3VzZXJMb2FkZWQgPSBuZXcgRXZlbnQoXCJVc2VyIGxvYWRlZFwiKTtcclxuICAgICAgICB0aGlzLl91c2VyVW5sb2FkZWQgPSBuZXcgRXZlbnQoXCJVc2VyIHVubG9hZGVkXCIpO1xyXG4gICAgICAgIHRoaXMuX3NpbGVudFJlbmV3RXJyb3IgPSBuZXcgRXZlbnQoXCJTaWxlbnQgcmVuZXcgZXJyb3JcIik7XHJcbiAgICAgICAgdGhpcy5fdXNlclNpZ25lZE91dCA9IG5ldyBFdmVudChcIlVzZXIgc2lnbmVkIG91dFwiKTtcclxuICAgIH1cclxuXHJcbiAgICBsb2FkKHVzZXIsIHJhaXNlRXZlbnQ9dHJ1ZSkge1xyXG4gICAgICAgIExvZy5pbmZvKFwiVXNlck1hbmFnZXJFdmVudHMubG9hZFwiKTtcclxuICAgICAgICBzdXBlci5sb2FkKHVzZXIpO1xyXG4gICAgICAgIGlmIChyYWlzZUV2ZW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3VzZXJMb2FkZWQucmFpc2UodXNlcik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgdW5sb2FkKCkge1xyXG4gICAgICAgIExvZy5pbmZvKFwiVXNlck1hbmFnZXJFdmVudHMudW5sb2FkXCIpO1xyXG4gICAgICAgIHN1cGVyLnVubG9hZCgpO1xyXG4gICAgICAgIHRoaXMuX3VzZXJVbmxvYWRlZC5yYWlzZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGFkZFVzZXJMb2FkZWQoY2IpIHtcclxuICAgICAgICB0aGlzLl91c2VyTG9hZGVkLmFkZEhhbmRsZXIoY2IpO1xyXG4gICAgfVxyXG4gICAgcmVtb3ZlVXNlckxvYWRlZChjYikge1xyXG4gICAgICAgIHRoaXMuX3VzZXJMb2FkZWQucmVtb3ZlSGFuZGxlcihjYik7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIGFkZFVzZXJVbmxvYWRlZChjYikge1xyXG4gICAgICAgIHRoaXMuX3VzZXJVbmxvYWRlZC5hZGRIYW5kbGVyKGNiKTtcclxuICAgIH1cclxuICAgIHJlbW92ZVVzZXJVbmxvYWRlZChjYikge1xyXG4gICAgICAgIHRoaXMuX3VzZXJVbmxvYWRlZC5yZW1vdmVIYW5kbGVyKGNiKTtcclxuICAgIH1cclxuXHJcbiAgICBhZGRTaWxlbnRSZW5ld0Vycm9yKGNiKSB7XHJcbiAgICAgICAgdGhpcy5fc2lsZW50UmVuZXdFcnJvci5hZGRIYW5kbGVyKGNiKTtcclxuICAgIH1cclxuICAgIHJlbW92ZVNpbGVudFJlbmV3RXJyb3IoY2IpIHtcclxuICAgICAgICB0aGlzLl9zaWxlbnRSZW5ld0Vycm9yLnJlbW92ZUhhbmRsZXIoY2IpO1xyXG4gICAgfVxyXG4gICAgX3JhaXNlU2lsZW50UmVuZXdFcnJvcihlKSB7XHJcbiAgICAgICAgTG9nLmluZm8oXCJVc2VyTWFuYWdlckV2ZW50cy5fcmFpc2VTaWxlbnRSZW5ld0Vycm9yXCIsIGUubWVzc2FnZSk7XHJcbiAgICAgICAgdGhpcy5fc2lsZW50UmVuZXdFcnJvci5yYWlzZShlKTtcclxuICAgIH1cclxuXHJcbiAgICBhZGRVc2VyU2lnbmVkT3V0KGNiKSB7XHJcbiAgICAgICAgdGhpcy5fdXNlclNpZ25lZE91dC5hZGRIYW5kbGVyKGNiKTtcclxuICAgIH1cclxuICAgIHJlbW92ZVVzZXJTaWduZWRPdXQoY2IpIHtcclxuICAgICAgICB0aGlzLl91c2VyU2lnbmVkT3V0LnJlbW92ZUhhbmRsZXIoY2IpO1xyXG4gICAgfVxyXG4gICAgX3JhaXNlVXNlclNpZ25lZE91dChlKSB7XHJcbiAgICAgICAgTG9nLmluZm8oXCJVc2VyTWFuYWdlckV2ZW50cy5fcmFpc2VVc2VyU2lnbmVkT3V0XCIpO1xyXG4gICAgICAgIHRoaXMuX3VzZXJTaWduZWRPdXQucmFpc2UoZSk7XHJcbiAgICB9XHJcbn1cclxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvVXNlck1hbmFnZXJFdmVudHMuanNcbiAqKi8iLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcblxyXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcclxuaW1wb3J0IFRpbWVyIGZyb20gJy4vVGltZXInO1xyXG5cclxuY29uc3QgRGVmYXVsdEFjY2Vzc1Rva2VuRXhwaXJpbmdOb3RpZmljYXRpb25UaW1lID0gNjA7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBY2Nlc3NUb2tlbkV2ZW50cyB7XHJcblxyXG4gICAgY29uc3RydWN0b3Ioe1xyXG4gICAgICAgIGFjY2Vzc1Rva2VuRXhwaXJpbmdOb3RpZmljYXRpb25UaW1lID0gRGVmYXVsdEFjY2Vzc1Rva2VuRXhwaXJpbmdOb3RpZmljYXRpb25UaW1lLFxyXG4gICAgICAgIGFjY2Vzc1Rva2VuRXhwaXJpbmdUaW1lciA9IG5ldyBUaW1lcihcIkFjY2VzcyB0b2tlbiBleHBpcmluZ1wiKSxcclxuICAgICAgICBhY2Nlc3NUb2tlbkV4cGlyZWRUaW1lciA9IG5ldyBUaW1lcihcIkFjY2VzcyB0b2tlbiBleHBpcmVkXCIpXHJcbiAgICB9ID0ge30pIHtcclxuICAgICAgICB0aGlzLl9hY2Nlc3NUb2tlbkV4cGlyaW5nTm90aWZpY2F0aW9uVGltZSA9IGFjY2Vzc1Rva2VuRXhwaXJpbmdOb3RpZmljYXRpb25UaW1lO1xyXG5cclxuICAgICAgICB0aGlzLl9hY2Nlc3NUb2tlbkV4cGlyaW5nID0gYWNjZXNzVG9rZW5FeHBpcmluZ1RpbWVyO1xyXG4gICAgICAgIHRoaXMuX2FjY2Vzc1Rva2VuRXhwaXJlZCA9IGFjY2Vzc1Rva2VuRXhwaXJlZFRpbWVyO1xyXG4gICAgfVxyXG5cclxuICAgIGxvYWQoY29udGFpbmVyKSB7XHJcbiAgICAgICAgTG9nLmluZm8oXCJBY2Nlc3NUb2tlbkV2ZW50cy5sb2FkXCIpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMuX2NhbmNlbFRpbWVycygpO1xyXG5cclxuICAgICAgICAvLyBvbmx5IHJlZ2lzdGVyIGV2ZW50cyBpZiB0aGVyZSdzIGFuIGFjY2VzcyB0b2tlbiB3aGVyZSB3ZSBjYXJlIGFib3V0IGV4cGlyYXRpb25cclxuICAgICAgICBpZiAoY29udGFpbmVyLmFjY2Vzc190b2tlbikge1xyXG4gICAgICAgICAgICBsZXQgZHVyYXRpb24gPSBjb250YWluZXIuZXhwaXJlc19pbjtcclxuICAgICAgICAgICAgTG9nLmluZm8oXCJhY2Nlc3MgdG9rZW4gcHJlc2VudCwgcmVtYWluaW5nIGR1cmF0aW9uOlwiLCBkdXJhdGlvbik7XHJcblxyXG4gICAgICAgICAgICBpZiAoZHVyYXRpb24gPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBvbmx5IHJlZ2lzdGVyIGV4cGlyaW5nIGlmIHdlIHN0aWxsIGhhdmUgdGltZVxyXG4gICAgICAgICAgICAgICAgbGV0IGV4cGlyaW5nID0gZHVyYXRpb24gLSB0aGlzLl9hY2Nlc3NUb2tlbkV4cGlyaW5nTm90aWZpY2F0aW9uVGltZTtcclxuICAgICAgICAgICAgICAgIGlmIChleHBpcmluZyA8PSAwKXtcclxuICAgICAgICAgICAgICAgICAgICBleHBpcmluZyA9IDE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBMb2cuaW5mbyhcInJlZ2lzdGVyaW5nIGV4cGlyaW5nIHRpbWVyIGluOlwiLCBleHBpcmluZyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9hY2Nlc3NUb2tlbkV4cGlyaW5nLmluaXQoZXhwaXJpbmcpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBhbHdheXMgcmVnaXN0ZXIgZXhwaXJlZC4gaWYgaXQncyBuZWdhdGl2ZSwgaXQgd2lsbCBzdGlsbCBmaXJlXHJcbiAgICAgICAgICAgIGxldCBleHBpcmVkID0gZHVyYXRpb24gKyAxO1xyXG4gICAgICAgICAgICBMb2cuaW5mbyhcInJlZ2lzdGVyaW5nIGV4cGlyZWQgdGltZXIgaW46XCIsIGV4cGlyZWQpO1xyXG4gICAgICAgICAgICB0aGlzLl9hY2Nlc3NUb2tlbkV4cGlyZWQuaW5pdChleHBpcmVkKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdW5sb2FkKCkge1xyXG4gICAgICAgIExvZy5pbmZvKFwiQWNjZXNzVG9rZW5FdmVudHMudW5sb2FkXCIpO1xyXG4gICAgICAgIHRoaXMuX2NhbmNlbFRpbWVycygpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBfY2FuY2VsVGltZXJzKCl7XHJcbiAgICAgICAgTG9nLmluZm8oXCJjYW5jZWxpbmcgZXhpc3RpbmcgYWNjZXNzIHRva2VuIHRpbWVyc1wiKTtcclxuICAgICAgICB0aGlzLl9hY2Nlc3NUb2tlbkV4cGlyaW5nLmNhbmNlbCgpO1xyXG4gICAgICAgIHRoaXMuX2FjY2Vzc1Rva2VuRXhwaXJlZC5jYW5jZWwoKTtcclxuICAgIH1cclxuXHJcbiAgICBhZGRBY2Nlc3NUb2tlbkV4cGlyaW5nKGNiKSB7XHJcbiAgICAgICAgdGhpcy5fYWNjZXNzVG9rZW5FeHBpcmluZy5hZGRIYW5kbGVyKGNiKTtcclxuICAgIH1cclxuICAgIHJlbW92ZUFjY2Vzc1Rva2VuRXhwaXJpbmcoY2IpIHtcclxuICAgICAgICB0aGlzLl9hY2Nlc3NUb2tlbkV4cGlyaW5nLnJlbW92ZUhhbmRsZXIoY2IpO1xyXG4gICAgfVxyXG5cclxuICAgIGFkZEFjY2Vzc1Rva2VuRXhwaXJlZChjYikge1xyXG4gICAgICAgIHRoaXMuX2FjY2Vzc1Rva2VuRXhwaXJlZC5hZGRIYW5kbGVyKGNiKTtcclxuICAgIH1cclxuICAgIHJlbW92ZUFjY2Vzc1Rva2VuRXhwaXJlZChjYikge1xyXG4gICAgICAgIHRoaXMuX2FjY2Vzc1Rva2VuRXhwaXJlZC5yZW1vdmVIYW5kbGVyKGNiKTtcclxuICAgIH1cclxufVxyXG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9BY2Nlc3NUb2tlbkV2ZW50cy5qc1xuICoqLyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cclxuXHJcbmltcG9ydCBMb2cgZnJvbSAnLi9Mb2cnO1xyXG5pbXBvcnQgR2xvYmFsIGZyb20gJy4vR2xvYmFsJztcclxuaW1wb3J0IEV2ZW50IGZyb20gJy4vRXZlbnQnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGltZXIgZXh0ZW5kcyBFdmVudCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IobmFtZSwgdGltZXIgPSBHbG9iYWwudGltZXIpIHtcclxuICAgICAgICBzdXBlcihuYW1lKTtcclxuICAgICAgICB0aGlzLl90aW1lciA9IHRpbWVyO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXQoZHVyYXRpb24pIHtcclxuICAgICAgICB0aGlzLmNhbmNlbCgpO1xyXG5cclxuICAgICAgICBpZiAoZHVyYXRpb24gPD0gMCkge1xyXG4gICAgICAgICAgICBkdXJhdGlvbiA9IDE7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl90aW1lckhhbmRsZSA9IHRoaXMuX3RpbWVyLnNldFRpbWVvdXQodGhpcy5fY2FsbGJhY2suYmluZCh0aGlzKSwgZHVyYXRpb24gKiAxMDAwKTtcclxuICAgIH1cclxuXHJcbiAgICBjYW5jZWwoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3RpbWVySGFuZGxlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3RpbWVyLmNsZWFyVGltZW91dCh0aGlzLl90aW1lckhhbmRsZSk7XHJcbiAgICAgICAgICAgIHRoaXMuX3RpbWVySGFuZGxlID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgX2NhbGxiYWNrKCkge1xyXG4gICAgICAgIHRoaXMuX3RpbWVySGFuZGxlID0gbnVsbDtcclxuICAgICAgICBzdXBlci5yYWlzZSgpO1xyXG4gICAgfVxyXG59XHJcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL1RpbWVyLmpzXG4gKiovIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5cclxuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFdmVudCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IobmFtZSkge1xyXG4gICAgICAgIHRoaXMuX25hbWUgPSBuYW1lO1xyXG4gICAgICAgIHRoaXMuX2NhbGxiYWNrcyA9IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIGFkZEhhbmRsZXIoY2IpIHtcclxuICAgICAgICB0aGlzLl9jYWxsYmFja3MucHVzaChjYik7XHJcbiAgICB9XHJcblxyXG4gICAgcmVtb3ZlSGFuZGxlcihjYikge1xyXG4gICAgICAgIHZhciBpZHggPSB0aGlzLl9jYWxsYmFja3MuZmluZEluZGV4KGl0ZW0gPT4gaXRlbSA9PT0gY2IpO1xyXG4gICAgICAgIGlmIChpZHggPj0gMCkge1xyXG4gICAgICAgICAgICB0aGlzLl9jYWxsYmFja3Muc3BsaWNlKGlkeCwgMSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJhaXNlKC4uLnBhcmFtcykge1xyXG4gICAgICAgIExvZy5pbmZvKFwiUmFpc2luZyBldmVudDogXCIgKyB0aGlzLl9uYW1lKTtcclxuICAgICAgICBmb3IgKHZhciBjYiBvZiB0aGlzLl9jYWxsYmFja3MpIHtcclxuICAgICAgICAgICAgY2IoLi4ucGFyYW1zKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvRXZlbnQuanNcbiAqKi8iLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcblxyXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNpbGVudFJlbmV3U2VydmljZSB7XHJcblxyXG4gICAgY29uc3RydWN0b3IodXNlck1hbmFnZXIpIHtcclxuICAgICAgICB0aGlzLl91c2VyTWFuYWdlciA9IHVzZXJNYW5hZ2VyO1xyXG4gICAgICAgIHRoaXMuX3VzZXJNYW5hZ2VyLmV2ZW50cy5hZGRBY2Nlc3NUb2tlbkV4cGlyaW5nKHRoaXMuX3Rva2VuRXhwaXJpbmcuYmluZCh0aGlzKSk7XHJcblxyXG4gICAgICAgIC8vIHRoaXMgd2lsbCB0cmlnZ2VyIGxvYWRpbmcgb2YgdGhlIHVzZXIgc28gdGhlIGV4cGlyaW5nIGV2ZW50cyBjYW4gYmUgaW5pdGlhbGl6ZWRcclxuICAgICAgICB0aGlzLl91c2VyTWFuYWdlci5nZXRVc2VyKCkudGhlbih1c2VyPT57XHJcbiAgICAgICAgICAgIC8vIGRlbGliZXJhdGUgbm9wXHJcbiAgICAgICAgfSkuY2F0Y2goZXJyPT57XHJcbiAgICAgICAgICAgIC8vIGNhdGNoIHRvIHN1cHByZXNzIGVycm9ycyBzaW5jZSB3ZSdyZSBpbiBhIGN0b3JcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiRXJyb3IgZnJvbSBnZXRVc2VyOlwiLCBlcnIubWVzc2FnZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIF90b2tlbkV4cGlyaW5nKCkge1xyXG4gICAgICAgIExvZy5pbmZvKFwiU2lsZW50UmVuZXdTZXJ2aWNlIGF1dG9tYXRpY2FsbHkgcmVuZXdpbmcgYWNjZXNzIHRva2VuXCIpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMuX3VzZXJNYW5hZ2VyLnNpZ25pblNpbGVudCgpLnRoZW4odXNlciA9PiB7XHJcbiAgICAgICAgICAgIExvZy5pbmZvKFwiU2lsZW50IHRva2VuIHJlbmV3YWwgc3VjY2Vzc2Z1bFwiKTtcclxuICAgICAgICB9LCBlcnIgPT4ge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJFcnJvciBmcm9tIHNpZ25pblNpbGVudDpcIiwgZXJyLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB0aGlzLl91c2VyTWFuYWdlci5ldmVudHMuX3JhaXNlU2lsZW50UmVuZXdFcnJvcihlcnIpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL1NpbGVudFJlbmV3U2VydmljZS5qc1xuICoqLyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cclxuXHJcbmltcG9ydCBMb2cgZnJvbSAnLi9Mb2cnO1xyXG5pbXBvcnQgQ2hlY2tTZXNzaW9uSUZyYW1lIGZyb20gJy4vQ2hlY2tTZXNzaW9uSUZyYW1lJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNlc3Npb25Nb25pdG9yIHtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcih1c2VyTWFuYWdlciwgQ2hlY2tTZXNzaW9uSUZyYW1lQ3RvciA9IENoZWNrU2Vzc2lvbklGcmFtZSkge1xyXG4gICAgICAgIGlmICghdXNlck1hbmFnZXIpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gdXNlciBtYW5hZ2VyIHBhc3NlZCB0byBTZXNzaW9uTW9uaXRvclwiKTtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidXNlck1hbmFnZXJcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl91c2VyTWFuYWdlciA9IHVzZXJNYW5hZ2VyO1xyXG4gICAgICAgIHRoaXMuX0NoZWNrU2Vzc2lvbklGcmFtZUN0b3IgPSBDaGVja1Nlc3Npb25JRnJhbWVDdG9yO1xyXG5cclxuICAgICAgICB0aGlzLl91c2VyTWFuYWdlci5ldmVudHMuYWRkVXNlckxvYWRlZCh0aGlzLl9zdGFydC5iaW5kKHRoaXMpKTtcclxuICAgICAgICB0aGlzLl91c2VyTWFuYWdlci5ldmVudHMuYWRkVXNlclVubG9hZGVkKHRoaXMuX3N0b3AuYmluZCh0aGlzKSk7XHJcblxyXG4gICAgICAgIHRoaXMuX3VzZXJNYW5hZ2VyLmdldFVzZXIoKS50aGVuKHVzZXIgPT4ge1xyXG4gICAgICAgICAgICBpZiAodXNlcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fc3RhcnQodXNlcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KS5jYXRjaChlcnIgPT4ge1xyXG4gICAgICAgICAgICAvLyBjYXRjaCB0byBzdXBwcmVzcyBlcnJvcnMgc2luY2Ugd2UncmUgaW4gYSBjdG9yXHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIlNlc3Npb25Nb25pdG9yIGN0b3I7IGVycm9yIGZyb20gZ2V0VXNlcjpcIiwgZXJyLm1lc3NhZ2UpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBfc2V0dGluZ3MoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VzZXJNYW5hZ2VyLnNldHRpbmdzO1xyXG4gICAgfVxyXG4gICAgZ2V0IF9tZXRhZGF0YVNlcnZpY2UoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VzZXJNYW5hZ2VyLm1ldGFkYXRhU2VydmljZTtcclxuICAgIH1cclxuICAgIGdldCBfY2xpZW50X2lkKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zZXR0aW5ncy5jbGllbnRfaWQ7XHJcbiAgICB9XHJcbiAgICBnZXQgX2NoZWNrU2Vzc2lvbkludGVydmFsKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zZXR0aW5ncy5jaGVja1Nlc3Npb25JbnRlcnZhbDtcclxuICAgIH1cclxuXHJcbiAgICBfc3RhcnQodXNlcikge1xyXG4gICAgICAgIGxldCBzZXNzaW9uX3N0YXRlID0gdXNlci5zZXNzaW9uX3N0YXRlO1xyXG5cclxuICAgICAgICBpZiAoc2Vzc2lvbl9zdGF0ZSkge1xyXG4gICAgICAgICAgICB0aGlzLl9zdWIgPSB1c2VyLnByb2ZpbGUuc3ViO1xyXG4gICAgICAgICAgICBMb2cuaW5mbyhcIlNlc3Npb25Nb25pdG9yLl9zdGFydDsgc2Vzc2lvbl9zdGF0ZTpcIiwgc2Vzc2lvbl9zdGF0ZSwgXCIsIHN1YjpcIiwgdGhpcy5fc3ViKTtcclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5fY2hlY2tTZXNzaW9uSUZyYW1lKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9tZXRhZGF0YVNlcnZpY2UuZ2V0Q2hlY2tTZXNzaW9uSWZyYW1lKCkudGhlbih1cmwgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh1cmwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmluZm8oXCJJbml0aWFsaXppbmcgY2hlY2sgc2Vzc2lvbiBpZnJhbWVcIilcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjbGllbnRfaWQgPSB0aGlzLl9jbGllbnRfaWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbnRlcnZhbCA9IHRoaXMuX2NoZWNrU2Vzc2lvbkludGVydmFsO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2hlY2tTZXNzaW9uSUZyYW1lID0gbmV3IHRoaXMuX0NoZWNrU2Vzc2lvbklGcmFtZUN0b3IodGhpcy5fY2FsbGJhY2suYmluZCh0aGlzKSwgY2xpZW50X2lkLCB1cmwsIGludGVydmFsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2hlY2tTZXNzaW9uSUZyYW1lLnN0YXJ0KHNlc3Npb25fc3RhdGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgTG9nLndhcm4oXCJObyBjaGVjayBzZXNzaW9uIGlmcmFtZSBmb3VuZCBpbiB0aGUgbWV0YWRhdGFcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSkuY2F0Y2goZXJyID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBjYXRjaCB0byBzdXBwcmVzcyBlcnJvcnMgc2luY2Ugd2UncmUgaW4gbm9uLXByb21pc2UgY2FsbGJhY2tcclxuICAgICAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJFcnJvciBmcm9tIGdldENoZWNrU2Vzc2lvbklmcmFtZTpcIiwgZXJyLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9jaGVja1Nlc3Npb25JRnJhbWUuc3RhcnQoc2Vzc2lvbl9zdGF0ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgX3N0b3AoKSB7XHJcbiAgICAgICAgTG9nLmluZm8oXCJTZXNzaW9uTW9uaXRvci5fc3RvcFwiKTtcclxuXHJcbiAgICAgICAgdGhpcy5fc3ViID0gbnVsbDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2NoZWNrU2Vzc2lvbklGcmFtZSkge1xyXG4gICAgICAgICAgICB0aGlzLl9jaGVja1Nlc3Npb25JRnJhbWUuc3RvcCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBfY2FsbGJhY2soKSB7XHJcbiAgICAgICAgTG9nLmluZm8oXCJTZXNzaW9uTW9uaXRvci5fY2FsbGJhY2tcIik7XHJcblxyXG4gICAgICAgIHRoaXMuX3VzZXJNYW5hZ2VyLnF1ZXJ5U2Vzc2lvblN0YXR1cygpLnRoZW4oc2Vzc2lvbiA9PiB7XHJcbiAgICAgICAgICAgIHZhciByYWlzZUV2ZW50ID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgIGlmIChzZXNzaW9uKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbi5zdWIgPT09IHRoaXMuX3N1Yikge1xyXG4gICAgICAgICAgICAgICAgICAgIExvZy5pbmZvKFwiU2FtZSBzdWIgc3RpbGwgbG9nZ2VkIGluIGF0IE9QLCByZXN0YXJ0aW5nIGNoZWNrIHNlc3Npb24gaWZyYW1lOyBzZXNzaW9uX3N0YXRlOlwiLCBzZXNzaW9uLnNlc3Npb25fc3RhdGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoZWNrU2Vzc2lvbklGcmFtZS5zdGFydChzZXNzaW9uLnNlc3Npb25fc3RhdGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJhaXNlRXZlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNlc3Npb24pIHtcclxuICAgICAgICAgICAgICAgICAgICBMb2cuaW5mbyhcIkRpZmZlcmVudCBzdWJqZWN0IHNpZ25lZCBpbnRvIE9QOlwiLCBzZXNzaW9uLnN1Yik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBMb2cuaW5mbyhcIlN1YmplY3Qgbm8gbG9uZ2VyIHNpZ25lZCBpbnRvIE9QXCIpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAocmFpc2VFdmVudCkge1xyXG4gICAgICAgICAgICAgICAgTG9nLmluZm8oXCJTZXNzaW9uTW9uaXRvci5fY2FsbGJhY2s7IHJhaXNpbmcgc2lnbmVkIG91dCBldmVudFwiKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3VzZXJNYW5hZ2VyLmV2ZW50cy5fcmFpc2VVc2VyU2lnbmVkT3V0KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KS5jYXRjaChlcnIgPT4ge1xyXG4gICAgICAgICAgICBMb2cuaW5mbyhcIkVycm9yIGNhbGxpbmcgcXVlcnlDdXJyZW50U2lnbmluU2Vzc2lvbjsgcmFpc2luZyBzaWduZWQgb3V0IGV2ZW50XCIsIGVyci5tZXNzYWdlKTtcclxuICAgICAgICAgICAgdGhpcy5fdXNlck1hbmFnZXIuZXZlbnRzLl9yYWlzZVVzZXJTaWduZWRPdXQoKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9TZXNzaW9uTW9uaXRvci5qc1xuICoqLyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cclxuXHJcbmltcG9ydCBMb2cgZnJvbSAnLi9Mb2cnO1xyXG5cclxuY29uc3QgRGVmYXVsdEludGVydmFsID0gMjAwMDtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENoZWNrU2Vzc2lvbklGcmFtZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihjYWxsYmFjaywgY2xpZW50X2lkLCB1cmwsIGludGVydmFsKSB7XHJcbiAgICAgICAgdGhpcy5fY2FsbGJhY2sgPSBjYWxsYmFjaztcclxuICAgICAgICB0aGlzLl9jbGllbnRfaWQgPSBjbGllbnRfaWQ7XHJcbiAgICAgICAgdGhpcy5fdXJsID0gdXJsO1xyXG4gICAgICAgIHRoaXMuX2ludGVydmFsID0gaW50ZXJ2YWwgfHwgRGVmYXVsdEludGVydmFsO1xyXG5cclxuICAgICAgICB2YXIgaWR4ID0gdXJsLmluZGV4T2YoXCIvXCIsIHVybC5pbmRleE9mKFwiLy9cIikgKyAyKTtcclxuICAgICAgICB0aGlzLl9mcmFtZV9vcmlnaW4gPSB1cmwuc3Vic3RyKDAsIGlkeCk7XHJcblxyXG4gICAgICAgIHRoaXMuX2ZyYW1lID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpZnJhbWVcIik7XHJcbiAgICAgICAgdGhpcy5fZnJhbWUuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xyXG4gICAgICAgIHRoaXMuX2ZyYW1lLnNyYyA9IHVybDtcclxuICAgICAgICB3aW5kb3cuZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLl9mcmFtZSk7XHJcblxyXG4gICAgICAgIHRoaXMuX2JvdW5kTWVzc2FnZUV2ZW50ID0gdGhpcy5fbWVzc2FnZS5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCB0aGlzLl9ib3VuZE1lc3NhZ2VFdmVudCwgZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIF9tZXNzYWdlKGUpIHtcclxuICAgICAgICBpZiAoZS5vcmlnaW4gPT09IHRoaXMuX2ZyYW1lX29yaWdpbiAmJlxyXG4gICAgICAgICAgICBlLnNvdXJjZSA9PT0gdGhpcy5fZnJhbWUuY29udGVudFdpbmRvd1xyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICBpZiAoZS5kYXRhID09PSBcImVycm9yXCIpe1xyXG4gICAgICAgICAgICAgICAgTG9nLmVycm9yKFwiZXJyb3IgbWVzc2FnZSBmcm9tIGNoZWNrIHNlc3Npb24gb3AgaWZyYW1lXCIpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zdG9wKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoZS5kYXRhID09PSBcImNoYW5nZWRcIil7XHJcbiAgICAgICAgICAgICAgICBMb2cuaW5mbyhcImNoYW5nZWQgbWVzc2FnZSBmcm9tIGNoZWNrIHNlc3Npb24gb3AgaWZyYW1lXCIpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zdG9wKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9jYWxsYmFjaygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgTG9nLmluZm8oZS5kYXRhICsgXCIgbWVzc2FnZSBmcm9tIGNoZWNrIHNlc3Npb24gb3AgaWZyYW1lXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHN0YXJ0KHNlc3Npb25fc3RhdGUpIHtcclxuICAgICAgICBpZiAodGhpcy5fc2Vzc2lvbl9zdGF0ZSAhPT0gc2Vzc2lvbl9zdGF0ZSkge1xyXG4gICAgICAgICAgICBMb2cuaW5mbyhcIkNoZWNrU2Vzc2lvbklGcmFtZS5zdGFydFwiKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc3RvcCgpO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgdGhpcy5fc2Vzc2lvbl9zdGF0ZSA9IHNlc3Npb25fc3RhdGU7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl90aW1lciA9IHdpbmRvdy5zZXRJbnRlcnZhbCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9mcmFtZS5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKHRoaXMuX2NsaWVudF9pZCArIFwiIFwiICsgdGhpcy5fc2Vzc2lvbl9zdGF0ZSwgdGhpcy5fZnJhbWVfb3JpZ2luKTtcclxuICAgICAgICAgICAgfSwgdGhpcy5faW50ZXJ2YWwpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzdG9wKCkge1xyXG4gICAgICAgIExvZy5pbmZvKFwiQ2hlY2tTZXNzaW9uSUZyYW1lLnN0b3BcIik7XHJcblxyXG4gICAgICAgIHRoaXMuX3Nlc3Npb25fc3RhdGUgPSBudWxsO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fdGltZXIpIHtcclxuICAgICAgICAgICAgd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5fdGltZXIpO1xyXG4gICAgICAgICAgICB0aGlzLl90aW1lciA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL0NoZWNrU2Vzc2lvbklGcmFtZS5qc1xuICoqLyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cclxuXHJcbmltcG9ydCBMb2cgZnJvbSAnLi9Mb2cnO1xyXG5pbXBvcnQgQ29yZG92YVBvcHVwV2luZG93IGZyb20gJy4vQ29yZG92YVBvcHVwV2luZG93JztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvcmRvdmFQb3B1cE5hdmlnYXRvciB7XHJcbiAgICBcclxuICAgIHByZXBhcmUocGFyYW1zKSB7XHJcbiAgICAgICAgbGV0IHBvcHVwID0gbmV3IENvcmRvdmFQb3B1cFdpbmRvdyhwYXJhbXMpO1xyXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocG9wdXApO1xyXG4gICAgfVxyXG59XHJcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL0NvcmRvdmFQb3B1cE5hdmlnYXRvci5qc1xuICoqLyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cclxuXHJcbmltcG9ydCBMb2cgZnJvbSAnLi9Mb2cnO1xyXG5cclxuY29uc3QgRGVmYXVsdFBvcHVwRmVhdHVyZXMgPSAnbG9jYXRpb249bm8sdG9vbGJhcj1ubyx6b29tPW5vJztcclxuY29uc3QgRGVmYXVsdFBvcHVwVGFyZ2V0ID0gXCJfYmxhbmtcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvcmRvdmFQb3B1cFdpbmRvdyB7XHJcblxyXG4gICAgY29uc3RydWN0b3IocGFyYW1zKSB7XHJcbiAgICAgICAgTG9nLmluZm8oXCJDb3Jkb3ZhUG9wdXBXaW5kb3cuY3RvclwiKTtcclxuXHJcbiAgICAgICAgdGhpcy5fcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5fcmVzb2x2ZSA9IHJlc29sdmU7XHJcbiAgICAgICAgICAgIHRoaXMuX3JlamVjdCA9IHJlamVjdDtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5mZWF0dXJlcyA9IHBhcmFtcy5wb3B1cFdpbmRvd0ZlYXR1cmVzIHx8IERlZmF1bHRQb3B1cEZlYXR1cmVzO1xyXG4gICAgICAgIHRoaXMudGFyZ2V0ID0gcGFyYW1zLnBvcHVwV2luZG93VGFyZ2V0IHx8IERlZmF1bHRQb3B1cFRhcmdldDtcclxuICAgICAgICBcclxuICAgICAgICB0aGlzLnJlZGlyZWN0X3VyaSA9IHBhcmFtcy5zdGFydFVybDtcclxuICAgICAgICBMb2cuaW5mbyhcInJlZGlyZWN0X3VyaTogXCIgKyB0aGlzLnJlZGlyZWN0X3VyaSk7XHJcbiAgICB9XHJcblxyXG4gICAgX2lzSW5BcHBCcm93c2VySW5zdGFsbGVkKGNvcmRvdmFNZXRhZGF0YSkge1xyXG4gICAgICAgIHJldHVybiBbXCJjb3Jkb3ZhLXBsdWdpbi1pbmFwcGJyb3dzZXJcIiwgXCJjb3Jkb3ZhLXBsdWdpbi1pbmFwcGJyb3dzZXIuaW5hcHBicm93c2VyXCIsIFwib3JnLmFwYWNoZS5jb3Jkb3ZhLmluYXBwYnJvd3NlclwiXS5zb21lKGZ1bmN0aW9uIChuYW1lKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBjb3Jkb3ZhTWV0YWRhdGEuaGFzT3duUHJvcGVydHkobmFtZSlcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICBuYXZpZ2F0ZShwYXJhbXMpIHtcclxuICAgICAgICBMb2cuaW5mbyhcIkNvcmRvdmFQb3B1cFdpbmRvdy5uYXZpZ2F0ZVwiKTtcclxuXHJcbiAgICAgICAgaWYgKCFwYXJhbXMgfHwgIXBhcmFtcy51cmwpIHtcclxuICAgICAgICAgICAgdGhpcy5fZXJyb3IoXCJObyB1cmwgcHJvdmlkZWRcIik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKCF3aW5kb3cuY29yZG92YSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Vycm9yKFwiY29yZG92YSBpcyB1bmRlZmluZWRcIilcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgdmFyIGNvcmRvdmFNZXRhZGF0YSA9IHdpbmRvdy5jb3Jkb3ZhLnJlcXVpcmUoXCJjb3Jkb3ZhL3BsdWdpbl9saXN0XCIpLm1ldGFkYXRhO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5faXNJbkFwcEJyb3dzZXJJbnN0YWxsZWQoY29yZG92YU1ldGFkYXRhKSA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9lcnJvcihcIkluQXBwQnJvd3NlciBwbHVnaW4gbm90IGZvdW5kXCIpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fcG9wdXAgPSBjb3Jkb3ZhLkluQXBwQnJvd3Nlci5vcGVuKHBhcmFtcy51cmwsIHRoaXMudGFyZ2V0LCB0aGlzLmZlYXR1cmVzKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3BvcHVwKSB7XHJcbiAgICAgICAgICAgICAgICBMb2cuaW5mbyhcInBvcHVwIHN1Y2Nlc3NmdWxseSBjcmVhdGVkXCIpO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9leGl0Q2FsbGJhY2tFdmVudCA9IHRoaXMuX2V4aXRDYWxsYmFjay5iaW5kKHRoaXMpOyBcclxuICAgICAgICAgICAgICAgIHRoaXMuX2xvYWRTdGFydENhbGxiYWNrRXZlbnQgPSB0aGlzLl9sb2FkU3RhcnRDYWxsYmFjay5iaW5kKHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9wb3B1cC5hZGRFdmVudExpc3RlbmVyKFwiZXhpdFwiLCB0aGlzLl9leGl0Q2FsbGJhY2tFdmVudCwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fcG9wdXAuYWRkRXZlbnRMaXN0ZW5lcihcImxvYWRzdGFydFwiLCB0aGlzLl9sb2FkU3RhcnRDYWxsYmFja0V2ZW50LCBmYWxzZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9lcnJvcihcIkVycm9yIG9wZW5pbmcgcG9wdXAgd2luZG93XCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLnByb21pc2U7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHByb21pc2UoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Byb21pc2U7XHJcbiAgICB9XHJcblxyXG4gICAgX2xvYWRTdGFydENhbGxiYWNrKGV2ZW50KSB7XHJcbiAgICAgICAgaWYgKGV2ZW50LnVybC5pbmRleE9mKHRoaXMucmVkaXJlY3RfdXJpKSA9PT0gMCkge1xyXG4gICAgICAgICAgICB0aGlzLl9zdWNjZXNzKHsgdXJsOiBldmVudC51cmwgfSk7XHJcbiAgICAgICAgfSAgICBcclxuICAgIH1cclxuICAgIF9leGl0Q2FsbGJhY2sobWVzc2FnZSkge1xyXG4gICAgICAgIHRoaXMuX2Vycm9yKG1lc3NhZ2UpOyAgICBcclxuICAgIH1cclxuICAgIFxyXG4gICAgX3N1Y2Nlc3MoZGF0YSkge1xyXG4gICAgICAgIHRoaXMuX2NsZWFudXAoKTtcclxuXHJcbiAgICAgICAgTG9nLmluZm8oXCJTdWNjZXNzZnVsIHJlc3BvbnNlIGZyb20gY29yZG92YSBwb3B1cCB3aW5kb3dcIik7XHJcbiAgICAgICAgdGhpcy5fcmVzb2x2ZShkYXRhKTtcclxuICAgIH1cclxuICAgIF9lcnJvcihtZXNzYWdlKSB7XHJcbiAgICAgICAgdGhpcy5fY2xlYW51cCgpO1xyXG5cclxuICAgICAgICBMb2cuZXJyb3IobWVzc2FnZSk7XHJcbiAgICAgICAgdGhpcy5fcmVqZWN0KG5ldyBFcnJvcihtZXNzYWdlKSk7XHJcbiAgICB9XHJcblxyXG4gICAgX2NsZWFudXAoKSB7XHJcbiAgICAgICAgTG9nLmluZm8oXCJDb3Jkb3ZhUG9wdXBXaW5kb3cuX2NsZWFudXBcIik7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9wb3B1cCl7XHJcbiAgICAgICAgICAgIHRoaXMuX3BvcHVwLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJleGl0XCIsIHRoaXMuX2V4aXRDYWxsYmFja0V2ZW50LCBmYWxzZSk7XHJcbiAgICAgICAgICAgIHRoaXMuX3BvcHVwLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJsb2Fkc3RhcnRcIiwgdGhpcy5fbG9hZFN0YXJ0Q2FsbGJhY2tFdmVudCwgZmFsc2UpO1xyXG4gICAgICAgICAgICB0aGlzLl9wb3B1cC5jbG9zZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9wb3B1cCA9IG51bGw7XHJcbiAgICB9XHJcbn1cclxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvQ29yZG92YVBvcHVwV2luZG93LmpzXG4gKiovIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5cclxuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XHJcbmltcG9ydCBDb3Jkb3ZhUG9wdXBXaW5kb3cgZnJvbSAnLi9Db3Jkb3ZhUG9wdXBXaW5kb3cnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29yZG92YUlGcmFtZU5hdmlnYXRvciB7XHJcbiAgICBcclxuICAgIHByZXBhcmUocGFyYW1zKSB7XHJcbiAgICAgICAgcGFyYW1zLnBvcHVwV2luZG93RmVhdHVyZXMgPSAnaGlkZGVuPXllcyc7XHJcbiAgICAgICAgbGV0IHBvcHVwID0gbmV3IENvcmRvdmFQb3B1cFdpbmRvdyhwYXJhbXMpO1xyXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocG9wdXApO1xyXG4gICAgfVxyXG59XHJcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL0NvcmRvdmFJRnJhbWVOYXZpZ2F0b3IuanNcbiAqKi8iXSwic291cmNlUm9vdCI6IiJ9