zlibjs
Version:
zlib, gzip and zip implementation in JavaScript
15 lines • 135 kB
JavaScript
/** @license zlib.js 2012 - imaya [ https://github.com/imaya/zlib.js ] The MIT License */(function() {'use strict';var k=void 0,aa=this;function r(c,d){var a=c.split("."),b=aa;!(a[0]in b)&&b.execScript&&b.execScript("var "+a[0]);for(var e;a.length&&(e=a.shift());)!a.length&&d!==k?b[e]=d:b=b[e]?b[e]:b[e]={}};var t="undefined"!==typeof Uint8Array&&"undefined"!==typeof Uint16Array&&"undefined"!==typeof Uint32Array&&"undefined"!==typeof DataView;function u(c){var d=c.length,a=0,b=Number.POSITIVE_INFINITY,e,f,g,h,l,n,m,p,s,x;for(p=0;p<d;++p)c[p]>a&&(a=c[p]),c[p]<b&&(b=c[p]);e=1<<a;f=new (t?Uint32Array:Array)(e);g=1;h=0;for(l=2;g<=a;){for(p=0;p<d;++p)if(c[p]===g){n=0;m=h;for(s=0;s<g;++s)n=n<<1|m&1,m>>=1;x=g<<16|p;for(s=n;s<e;s+=l)f[s]=x;++h}++g;h<<=1;l<<=1}return[f,a,b]};function w(c,d){this.g=[];this.h=32768;this.c=this.f=this.d=this.k=0;this.input=t?new Uint8Array(c):c;this.l=!1;this.i=y;this.p=!1;if(d||!(d={}))d.index&&(this.d=d.index),d.bufferSize&&(this.h=d.bufferSize),d.bufferType&&(this.i=d.bufferType),d.resize&&(this.p=d.resize);switch(this.i){case A:this.a=32768;this.b=new (t?Uint8Array:Array)(32768+this.h+258);break;case y:this.a=0;this.b=new (t?Uint8Array:Array)(this.h);this.e=this.u;this.m=this.r;this.j=this.s;break;default:throw Error("invalid inflate mode");
}}var A=0,y=1;
w.prototype.t=function(){for(;!this.l;){var c=B(this,3);c&1&&(this.l=!0);c>>>=1;switch(c){case 0:var d=this.input,a=this.d,b=this.b,e=this.a,f=d.length,g=k,h=k,l=b.length,n=k;this.c=this.f=0;if(a+1>=f)throw Error("invalid uncompressed block header: LEN");g=d[a++]|d[a++]<<8;if(a+1>=f)throw Error("invalid uncompressed block header: NLEN");h=d[a++]|d[a++]<<8;if(g===~h)throw Error("invalid uncompressed block header: length verify");if(a+g>d.length)throw Error("input buffer is broken");switch(this.i){case A:for(;e+g>
b.length;){n=l-e;g-=n;if(t)b.set(d.subarray(a,a+n),e),e+=n,a+=n;else for(;n--;)b[e++]=d[a++];this.a=e;b=this.e();e=this.a}break;case y:for(;e+g>b.length;)b=this.e({o:2});break;default:throw Error("invalid inflate mode");}if(t)b.set(d.subarray(a,a+g),e),e+=g,a+=g;else for(;g--;)b[e++]=d[a++];this.d=a;this.a=e;this.b=b;break;case 1:this.j(ba,ca);break;case 2:for(var m=B(this,5)+257,p=B(this,5)+1,s=B(this,4)+4,x=new (t?Uint8Array:Array)(C.length),Q=k,R=k,S=k,v=k,M=k,F=k,z=k,q=k,T=k,q=0;q<s;++q)x[C[q]]=
B(this,3);if(!t){q=s;for(s=x.length;q<s;++q)x[C[q]]=0}Q=u(x);v=new (t?Uint8Array:Array)(m+p);q=0;for(T=m+p;q<T;)switch(M=D(this,Q),M){case 16:for(z=3+B(this,2);z--;)v[q++]=F;break;case 17:for(z=3+B(this,3);z--;)v[q++]=0;F=0;break;case 18:for(z=11+B(this,7);z--;)v[q++]=0;F=0;break;default:F=v[q++]=M}R=t?u(v.subarray(0,m)):u(v.slice(0,m));S=t?u(v.subarray(m)):u(v.slice(m));this.j(R,S);break;default:throw Error("unknown BTYPE: "+c);}}return this.m()};
var E=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],C=t?new Uint16Array(E):E,G=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,258,258],H=t?new Uint16Array(G):G,I=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0],J=t?new Uint8Array(I):I,K=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577],L=t?new Uint16Array(K):K,N=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,
13],O=t?new Uint8Array(N):N,P=new (t?Uint8Array:Array)(288),U,da;U=0;for(da=P.length;U<da;++U)P[U]=143>=U?8:255>=U?9:279>=U?7:8;var ba=u(P),V=new (t?Uint8Array:Array)(30),W,ea;W=0;for(ea=V.length;W<ea;++W)V[W]=5;var ca=u(V);function B(c,d){for(var a=c.f,b=c.c,e=c.input,f=c.d,g=e.length,h;b<d;){if(f>=g)throw Error("input buffer is broken");a|=e[f++]<<b;b+=8}h=a&(1<<d)-1;c.f=a>>>d;c.c=b-d;c.d=f;return h}
function D(c,d){for(var a=c.f,b=c.c,e=c.input,f=c.d,g=e.length,h=d[0],l=d[1],n,m;b<l&&!(f>=g);)a|=e[f++]<<b,b+=8;n=h[a&(1<<l)-1];m=n>>>16;if(m>b)throw Error("invalid code length: "+m);c.f=a>>m;c.c=b-m;c.d=f;return n&65535}
w.prototype.j=function(c,d){var a=this.b,b=this.a;this.n=c;for(var e=a.length-258,f,g,h,l;256!==(f=D(this,c));)if(256>f)b>=e&&(this.a=b,a=this.e(),b=this.a),a[b++]=f;else{g=f-257;l=H[g];0<J[g]&&(l+=B(this,J[g]));f=D(this,d);h=L[f];0<O[f]&&(h+=B(this,O[f]));b>=e&&(this.a=b,a=this.e(),b=this.a);for(;l--;)a[b]=a[b++-h]}for(;8<=this.c;)this.c-=8,this.d--;this.a=b};
w.prototype.s=function(c,d){var a=this.b,b=this.a;this.n=c;for(var e=a.length,f,g,h,l;256!==(f=D(this,c));)if(256>f)b>=e&&(a=this.e(),e=a.length),a[b++]=f;else{g=f-257;l=H[g];0<J[g]&&(l+=B(this,J[g]));f=D(this,d);h=L[f];0<O[f]&&(h+=B(this,O[f]));b+l>e&&(a=this.e(),e=a.length);for(;l--;)a[b]=a[b++-h]}for(;8<=this.c;)this.c-=8,this.d--;this.a=b};
w.prototype.e=function(){var c=new (t?Uint8Array:Array)(this.a-32768),d=this.a-32768,a,b,e=this.b;if(t)c.set(e.subarray(32768,c.length));else{a=0;for(b=c.length;a<b;++a)c[a]=e[a+32768]}this.g.push(c);this.k+=c.length;if(t)e.set(e.subarray(d,d+32768));else for(a=0;32768>a;++a)e[a]=e[d+a];this.a=32768;return e};
w.prototype.u=function(c){var d,a=this.input.length/this.d+1|0,b,e,f,g=this.input,h=this.b;c&&("number"===typeof c.o&&(a=c.o),"number"===typeof c.q&&(a+=c.q));2>a?(b=(g.length-this.d)/this.n[2],f=258*(b/2)|0,e=f<h.length?h.length+f:h.length<<1):e=h.length*a;t?(d=new Uint8Array(e),d.set(h)):d=h;return this.b=d};
w.prototype.m=function(){var c=0,d=this.b,a=this.g,b,e=new (t?Uint8Array:Array)(this.k+(this.a-32768)),f,g,h,l;if(0===a.length)return t?this.b.subarray(32768,this.a):this.b.slice(32768,this.a);f=0;for(g=a.length;f<g;++f){b=a[f];h=0;for(l=b.length;h<l;++h)e[c++]=b[h]}f=32768;for(g=this.a;f<g;++f)e[c++]=d[f];this.g=[];return this.buffer=e};
w.prototype.r=function(){var c,d=this.a;t?this.p?(c=new Uint8Array(d),c.set(this.b.subarray(0,d))):c=this.b.subarray(0,d):(this.b.length>d&&(this.b.length=d),c=this.b);return this.buffer=c};r("Zlib.RawInflate",w);r("Zlib.RawInflate.prototype.decompress",w.prototype.t);var X={ADAPTIVE:y,BLOCK:A},Y,Z,$,fa;if(Object.keys)Y=Object.keys(X);else for(Z in Y=[],$=0,X)Y[$++]=Z;$=0;for(fa=Y.length;$<fa;++$)Z=Y[$],r("Zlib.RawInflate.BufferType."+Z,X[Z]);}).call(this);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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NENFLENBQUFDLENBQWVILENBQWZHLENMNnpDNUM7Iiwic291cmNlcyI6WyJjbG9zdXJlLXByaW1pdGl2ZXMvYmFzZS5qcyIsImRlZmluZS90eXBlZGFycmF5L2h5YnJpZC5qcyIsInNyYy9odWZmbWFuLmpzIiwic3JjL3Jhd2luZmxhdGUuanMiLCJleHBvcnQvcmF3aW5mbGF0ZS5qcyIsInNyYy9leHBvcnRfb2JqZWN0LmpzIl0sIm5hbWVzIjpbImdvb2cuZ2xvYmFsIiwiZ29vZy5leHBvcnRQYXRoXyIsIm5hbWUiLCJvcHRfb2JqZWN0IiwicGFydHMiLCJzcGxpdCIsImN1ciIsImV4ZWNTY3JpcHQiLCJwYXJ0IiwibGVuZ3RoIiwic2hpZnQiLCJKU0NvbXBpbGVyX2FsaWFzX1ZPSUQiLCJVU0VfVFlQRURBUlJBWSIsIlVpbnQ4QXJyYXkiLCJVaW50MTZBcnJheSIsIlVpbnQzMkFycmF5IiwiRGF0YVZpZXciLCJabGliLkh1ZmZtYW4uYnVpbGRIdWZmbWFuVGFibGUiLCJsZW5ndGhzIiwibGlzdFNpemUiLCJtYXhDb2RlTGVuZ3RoIiwibWluQ29kZUxlbmd0aCIsIk51bWJlciIsIlBPU0lUSVZFX0lORklOSVRZIiwic2l6ZSIsInRhYmxlIiwiYml0TGVuZ3RoIiwiY29kZSIsInNraXAiLCJyZXZlcnNlZCIsInJ0ZW1wIiwiaSIsImoiLCJ2YWx1ZSIsIkFycmF5IiwiWmxpYi5SYXdJbmZsYXRlIiwiaW5wdXQiLCJvcHRfcGFyYW1zIiwiYmxvY2tzIiwiYnVmZmVyU2l6ZSIsIlpMSUJfUkFXX0lORkxBVEVfQlVGRkVSX1NJWkUiLCJiaXRzYnVmbGVuIiwiYml0c2J1ZiIsImlwIiwidG90YWxwb3MiLCJiZmluYWwiLCJidWZmZXJUeXBlIiwiWmxpYi5SYXdJbmZsYXRlLkJ1ZmZlclR5cGUuQURBUFRJVkUiLCJyZXNpemUiLCJabGliLlJhd0luZmxhdGUuQnVmZmVyVHlwZS5CTE9DSyIsIm9wIiwiWmxpYi5SYXdJbmZsYXRlLk1heEJhY2t3YXJkTGVuZ3RoIiwib3V0cHV0IiwiWmxpYi5SYXdJbmZsYXRlLk1heENvcHlMZW5ndGgiLCJleHBhbmRCdWZmZXIiLCJleHBhbmRCdWZmZXJBZGFwdGl2ZSIsImNvbmNhdEJ1ZmZlciIsImNvbmNhdEJ1ZmZlckR5bmFtaWMiLCJkZWNvZGVIdWZmbWFuIiwiZGVjb2RlSHVmZm1hbkFkYXB0aXZlIiwiRXJyb3IiLCJCTE9DSyIsIkFEQVBUSVZFIiwicHJvdG90eXBlIiwiZGVjb21wcmVzcyIsIlpsaWIuUmF3SW5mbGF0ZS5wcm90b3R5cGUuZGVjb21wcmVzcyIsImhkciIsInJlYWRCaXRzIiwicGFyc2VCbG9jayIsImlucHV0TGVuZ3RoIiwibGVuIiwibmxlbiIsIm9sZW5ndGgiLCJwcmVDb3B5Iiwic2V0Iiwic3ViYXJyYXkiLCJabGliLlJhd0luZmxhdGUuRml4ZWRMaXRlcmFsTGVuZ3RoVGFibGUiLCJabGliLlJhd0luZmxhdGUuRml4ZWREaXN0YW5jZVRhYmxlIiwiaGxpdCIsImhkaXN0IiwiaGNsZW4iLCJjb2RlTGVuZ3RocyIsIlpsaWIuUmF3SW5mbGF0ZS5PcmRlci5sZW5ndGgiLCJjb2RlTGVuZ3Roc1RhYmxlIiwibGl0bGVuVGFibGUiLCJkaXN0VGFibGUiLCJsZW5ndGhUYWJsZSIsInByZXYiLCJyZXBlYXQiLCJpbCIsIlpsaWIuUmF3SW5mbGF0ZS5PcmRlciIsInJlYWRDb2RlQnlUYWJsZSIsInNsaWNlIiwiWmxpYi5SYXdJbmZsYXRlLkxlbmd0aENvZGVUYWJsZSIsIlpsaWIuUmF3SW5mbGF0ZS5MZW5ndGhFeHRyYVRhYmxlIiwiWmxpYi5SYXdJbmZsYXRlLkRpc3RDb2RlVGFibGUiLCJabGliLlJhd0luZmxhdGUuRGlzdEV4dHJhVGFibGUiLCJabGliLlJhd0luZmxhdGUucHJvdG90eXBlLnJlYWRCaXRzIiwib2N0ZXQiLCJabGliLlJhd0luZmxhdGUucHJvdG90eXBlLnJlYWRDb2RlQnlUYWJsZSIsImNvZGVUYWJsZSIsImNvZGVXaXRoTGVuZ3RoIiwiY29kZUxlbmd0aCIsIlpsaWIuUmF3SW5mbGF0ZS5wcm90b3R5cGUuZGVjb2RlSHVmZm1hbiIsImxpdGxlbiIsImRpc3QiLCJjdXJyZW50TGl0bGVuVGFibGUiLCJ0aSIsImNvZGVEaXN0IiwiWmxpYi5SYXdJbmZsYXRlLnByb3RvdHlwZS5kZWNvZGVIdWZmbWFuQWRhcHRpdmUiLCJabGliLlJhd0luZmxhdGUucHJvdG90eXBlLmV4cGFuZEJ1ZmZlciIsImJ1ZmZlciIsImJhY2t3YXJkIiwicHVzaCIsIlpsaWIuUmF3SW5mbGF0ZS5wcm90b3R5cGUuZXhwYW5kQnVmZmVyQWRhcHRpdmUiLCJvcHRfcGFyYW0iLCJyYXRpbyIsIm1heEh1ZmZDb2RlIiwibmV3U2l6ZSIsIm1heEluZmxhdGVTaXplIiwiZml4UmF0aW8iLCJhZGRSYXRpbyIsIlpsaWIuUmF3SW5mbGF0ZS5wcm90b3R5cGUuY29uY2F0QnVmZmVyIiwicG9zIiwiYmxvY2siLCJqbCIsIlpsaWIuUmF3SW5mbGF0ZS5wcm90b3R5cGUuY29uY2F0QnVmZmVyRHluYW1pYyIsInB1YmxpY1BhdGgiLCJrZXlzIiwia2V5IiwiT2JqZWN0IiwiZXhwb3J0S2V5VmFsdWUiLCJvYmplY3QiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMDYgVGhlIENsb3N1cmUgTGlicmFyeSBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuLy9cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbi8vXG4vLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuLy9cbi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbi8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMtSVNcIiBCQVNJUyxcbi8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbi8qKlxuICogQGZpbGVvdmVydmlldyBCb290c3RyYXAgZm9yIHRoZSBHb29nbGUgSlMgTGlicmFyeSAoQ2xvc3VyZSkuXG4gKlxuICogSW4gdW5jb21waWxlZCBtb2RlIGJhc2UuanMgd2lsbCB3cml0ZSBvdXQgQ2xvc3VyZSdzIGRlcHMgZmlsZSwgdW5sZXNzIHRoZVxuICogZ2xvYmFsIDxjb2RlPkNMT1NVUkVfTk9fREVQUzwvY29kZT4gaXMgc2V0IHRvIHRydWUuICBUaGlzIGFsbG93cyBwcm9qZWN0cyB0b1xuICogaW5jbHVkZSB0aGVpciBvd24gZGVwcyBmaWxlKHMpIGZyb20gZGlmZmVyZW50IGxvY2F0aW9ucy5cbiAqXG4gKi9cblxuXG4vKipcbiAqIEBkZWZpbmUge2Jvb2xlYW59IE92ZXJyaWRkZW4gdG8gdHJ1ZSBieSB0aGUgY29tcGlsZXIgd2hlbiAtLWNsb3N1cmVfcGFzc1xuICogICAgIG9yIC0tbWFya19hc19jb21waWxlZCBpcyBzcGVjaWZpZWQuXG4gKi9cbnZhciBDT01QSUxFRCA9IGZhbHNlO1xuXG5cbi8qKlxuICogQmFzZSBuYW1lc3BhY2UgZm9yIHRoZSBDbG9zdXJlIGxpYnJhcnkuICBDaGVja3MgdG8gc2VlIGdvb2cgaXNcbiAqIGFscmVhZHkgZGVmaW5lZCBpbiB0aGUgY3VycmVudCBzY29wZSBiZWZvcmUgYXNzaWduaW5nIHRvIHByZXZlbnRcbiAqIGNsb2JiZXJpbmcgaWYgYmFzZS5qcyBpcyBsb2FkZWQgbW9yZSB0aGFuIG9uY2UuXG4gKlxuICogQGNvbnN0XG4gKi9cbnZhciBnb29nID0gZ29vZyB8fCB7fTsgLy8gSWRlbnRpZmllcyB0aGlzIGZpbGUgYXMgdGhlIENsb3N1cmUgYmFzZS5cblxuXG4vKipcbiAqIFJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIGNvbnRleHQuICBJbiBtb3N0IGNhc2VzIHRoaXMgd2lsbCBiZSAnd2luZG93Jy5cbiAqL1xuZ29vZy5nbG9iYWwgPSB0aGlzO1xuXG5cbi8qKlxuICogQGRlZmluZSB7Ym9vbGVhbn0gREVCVUcgaXMgcHJvdmlkZWQgYXMgYSBjb252ZW5pZW5jZSBzbyB0aGF0IGRlYnVnZ2luZyBjb2RlXG4gKiB0aGF0IHNob3VsZCBub3QgYmUgaW5jbHVkZWQgaW4gYSBwcm9kdWN0aW9uIGpzX2JpbmFyeSBjYW4gYmUgZWFzaWx5IHN0cmlwcGVkXG4gKiBieSBzcGVjaWZ5aW5nIC0tZGVmaW5lIGdvb2cuREVCVUc9ZmFsc2UgdG8gdGhlIEpTQ29tcGlsZXIuIEZvciBleGFtcGxlLCBtb3N0XG4gKiB0b1N0cmluZygpIG1ldGhvZHMgc2hvdWxkIGJlIGRlY2xhcmVkIGluc2lkZSBhbiBcImlmIChnb29nLkRFQlVHKVwiIGNvbmRpdGlvbmFsXG4gKiBiZWNhdXNlIHRoZXkgYXJlIGdlbmVyYWxseSB1c2VkIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMgYW5kIGl0IGlzIGRpZmZpY3VsdFxuICogZm9yIHRoZSBKU0NvbXBpbGVyIHRvIHN0YXRpY2FsbHkgZGV0ZXJtaW5lIHdoZXRoZXIgdGhleSBhcmUgdXNlZC5cbiAqL1xuZ29vZy5ERUJVRyA9IHRydWU7XG5cblxuLyoqXG4gKiBAZGVmaW5lIHtzdHJpbmd9IExPQ0FMRSBkZWZpbmVzIHRoZSBsb2NhbGUgYmVpbmcgdXNlZCBmb3IgY29tcGlsYXRpb24uIEl0IGlzXG4gKiB1c2VkIHRvIHNlbGVjdCBsb2NhbGUgc3BlY2lmaWMgZGF0YSB0byBiZSBjb21waWxlZCBpbiBqcyBiaW5hcnkuIEJVSUxEIHJ1bGVcbiAqIGNhbiBzcGVjaWZ5IHRoaXMgdmFsdWUgYnkgXCItLWRlZmluZSBnb29nLkxPQ0FMRT08bG9jYWxlX25hbWU+XCIgYXMgSlNDb21waWxlclxuICogb3B0aW9uLlxuICpcbiAqIFRha2UgaW50byBhY2NvdW50IHRoYXQgdGhlIGxvY2FsZSBjb2RlIGZvcm1hdCBpcyBpbXBvcnRhbnQuIFlvdSBzaG91bGQgdXNlXG4gKiB0aGUgY2Fub25pY2FsIFVuaWNvZGUgZm9ybWF0IHdpdGggaHlwaGVuIGFzIGEgZGVsaW1pdGVyLiBMYW5ndWFnZSBtdXN0IGJlXG4gKiBsb3dlcmNhc2UsIExhbmd1YWdlIFNjcmlwdCAtIENhcGl0YWxpemVkLCBSZWdpb24gLSBVUFBFUkNBU0UuXG4gKiBUaGVyZSBhcmUgZmV3IGV4YW1wbGVzOiBwdC1CUiwgZW4sIGVuLVVTLCBzci1MYXRpbi1CTywgemgtSGFucy1DTi5cbiAqXG4gKiBTZWUgbW9yZSBpbmZvIGFib3V0IGxvY2FsZSBjb2RlcyBoZXJlOlxuICogaHR0cDovL3d3dy51bmljb2RlLm9yZy9yZXBvcnRzL3RyMzUvI1VuaWNvZGVfTGFuZ3VhZ2VfYW5kX0xvY2FsZV9JZGVudGlmaWVyc1xuICpcbiAqIEZvciBsYW5ndWFnZSBjb2RlcyB5b3Ugc2hvdWxkIHVzZSB2YWx1ZXMgZGVmaW5lZCBieSBJU08gNjkzLTEuIFNlZSBpdCBoZXJlXG4gKiBodHRwOi8vd3d3LnczLm9yZy9XQUkvRVIvSUcvZXJ0L2lzbzYzOS5odG0uIFRoZXJlIGlzIG9ubHkgb25lIGV4Y2VwdGlvbiBmcm9tXG4gKiB0aGlzIHJ1bGU6IHRoZSBIZWJyZXcgbGFuZ3VhZ2UuIEZvciBsZWdhY3kgcmVhc29ucyB0aGUgb2xkIGNvZGUgKGl3KSBzaG91bGRcbiAqIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgbmV3IGNvZGUgKGhlKSwgc2VlIGh0dHA6Ly93aWtpL01haW4vSUlJU3lub255bXMuXG4gKi9cbmdvb2cuTE9DQUxFID0gJ2VuJzsgIC8vIGRlZmF1bHQgdG8gZW5cblxuXG4vKipcbiAqIENyZWF0ZXMgb2JqZWN0IHN0dWJzIGZvciBhIG5hbWVzcGFjZS4gIFRoZSBwcmVzZW5jZSBvZiBvbmUgb3IgbW9yZVxuICogZ29vZy5wcm92aWRlKCkgY2FsbHMgaW5kaWNhdGUgdGhhdCB0aGUgZmlsZSBkZWZpbmVzIHRoZSBnaXZlblxuICogb2JqZWN0cy9uYW1lc3BhY2VzLiAgQnVpbGQgdG9vbHMgYWxzbyBzY2FuIGZvciBwcm92aWRlL3JlcXVpcmUgc3RhdGVtZW50c1xuICogdG8gZGlzY2VybiBkZXBlbmRlbmNpZXMsIGJ1aWxkIGRlcGVuZGVuY3kgZmlsZXMgKHNlZSBkZXBzLmpzKSwgZXRjLlxuICogQHNlZSBnb29nLnJlcXVpcmVcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWVzcGFjZSBwcm92aWRlZCBieSB0aGlzIGZpbGUgaW4gdGhlIGZvcm1cbiAqICAgICBcImdvb2cucGFja2FnZS5wYXJ0XCIuXG4gKi9cbmdvb2cucHJvdmlkZSA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgaWYgKCFDT01QSUxFRCkge1xuICAgIC8vIEVuc3VyZSB0aGF0IHRoZSBzYW1lIG5hbWVzcGFjZSBpc24ndCBwcm92aWRlZCB0d2ljZS4gVGhpcyBpcyBpbnRlbmRlZFxuICAgIC8vIHRvIHRlYWNoIG5ldyBkZXZlbG9wZXJzIHRoYXQgJ2dvb2cucHJvdmlkZScgaXMgZWZmZWN0aXZlbHkgYSB2YXJpYWJsZVxuICAgIC8vIGRlY2xhcmF0aW9uLiBBbmQgd2hlbiBKU0NvbXBpbGVyIHRyYW5zZm9ybXMgZ29vZy5wcm92aWRlIGludG8gYSByZWFsXG4gICAgLy8gdmFyaWFibGUgZGVjbGFyYXRpb24sIHRoZSBjb21waWxlZCBKUyBzaG91bGQgd29yayB0aGUgc2FtZSBhcyB0aGUgcmF3XG4gICAgLy8gSlMtLWV2ZW4gd2hlbiB0aGUgcmF3IEpTIHVzZXMgZ29vZy5wcm92aWRlIGluY29ycmVjdGx5LlxuICAgIGlmIChnb29nLmlzUHJvdmlkZWRfKG5hbWUpKSB7XG4gICAgICB0aHJvdyBFcnJvcignTmFtZXNwYWNlIFwiJyArIG5hbWUgKyAnXCIgYWxyZWFkeSBkZWNsYXJlZC4nKTtcbiAgICB9XG4gICAgZGVsZXRlIGdvb2cuaW1wbGljaXROYW1lc3BhY2VzX1tuYW1lXTtcblxuICAgIHZhciBuYW1lc3BhY2UgPSBuYW1lO1xuICAgIHdoaWxlICgobmFtZXNwYWNlID0gbmFtZXNwYWNlLnN1YnN0cmluZygwLCBuYW1lc3BhY2UubGFzdEluZGV4T2YoJy4nKSkpKSB7XG4gICAgICBpZiAoZ29vZy5nZXRPYmplY3RCeU5hbWUobmFtZXNwYWNlKSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGdvb2cuaW1wbGljaXROYW1lc3BhY2VzX1tuYW1lc3BhY2VdID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBnb29nLmV4cG9ydFBhdGhfKG5hbWUpO1xufTtcblxuXG4vKipcbiAqIE1hcmtzIHRoYXQgdGhlIGN1cnJlbnQgZmlsZSBzaG91bGQgb25seSBiZSB1c2VkIGZvciB0ZXN0aW5nLCBhbmQgbmV2ZXIgZm9yXG4gKiBsaXZlIGNvZGUgaW4gcHJvZHVjdGlvbi5cbiAqIEBwYXJhbSB7c3RyaW5nPX0gb3B0X21lc3NhZ2UgT3B0aW9uYWwgbWVzc2FnZSB0byBhZGQgdG8gdGhlIGVycm9yIHRoYXQnc1xuICogICAgIHJhaXNlZCB3aGVuIHVzZWQgaW4gcHJvZHVjdGlvbiBjb2RlLlxuICovXG5nb29nLnNldFRlc3RPbmx5ID0gZnVuY3Rpb24ob3B0X21lc3NhZ2UpIHtcbiAgaWYgKENPTVBJTEVEICYmICFnb29nLkRFQlVHKSB7XG4gICAgb3B0X21lc3NhZ2UgPSBvcHRfbWVzc2FnZSB8fCAnJztcbiAgICB0aHJvdyBFcnJvcignSW1wb3J0aW5nIHRlc3Qtb25seSBjb2RlIGludG8gbm9uLWRlYnVnIGVudmlyb25tZW50JyArXG4gICAgICAgICAgICAgICAgb3B0X21lc3NhZ2UgPyAnOiAnICsgb3B0X21lc3NhZ2UgOiAnLicpO1xuICB9XG59O1xuXG5cbmlmICghQ09NUElMRUQpIHtcblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlIGdpdmVuIG5hbWUgaGFzIGJlZW4gZ29vZy5wcm92aWRlZC4gVGhpcyB3aWxsIHJldHVybiBmYWxzZSBmb3JcbiAgICogbmFtZXMgdGhhdCBhcmUgYXZhaWxhYmxlIG9ubHkgYXMgaW1wbGljaXQgbmFtZXNwYWNlcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgbmFtZSBvZiB0aGUgb2JqZWN0IHRvIGxvb2sgZm9yLlxuICAgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBuYW1lIGhhcyBiZWVuIHByb3ZpZGVkLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZ29vZy5pc1Byb3ZpZGVkXyA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICByZXR1cm4gIWdvb2cuaW1wbGljaXROYW1lc3BhY2VzX1tuYW1lXSAmJiAhIWdvb2cuZ2V0T2JqZWN0QnlOYW1lKG5hbWUpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBOYW1lc3BhY2VzIGltcGxpY2l0bHkgZGVmaW5lZCBieSBnb29nLnByb3ZpZGUuIEZvciBleGFtcGxlLFxuICAgKiBnb29nLnByb3ZpZGUoJ2dvb2cuZXZlbnRzLkV2ZW50JykgaW1wbGljaXRseSBkZWNsYXJlc1xuICAgKiB0aGF0ICdnb29nJyBhbmQgJ2dvb2cuZXZlbnRzJyBtdXN0IGJlIG5hbWVzcGFjZXMuXG4gICAqXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBnb29nLmltcGxpY2l0TmFtZXNwYWNlc18gPSB7fTtcbn1cblxuXG4vKipcbiAqIEJ1aWxkcyBhbiBvYmplY3Qgc3RydWN0dXJlIGZvciB0aGUgcHJvdmlkZWQgbmFtZXNwYWNlIHBhdGgsXG4gKiBlbnN1cmluZyB0aGF0IG5hbWVzIHRoYXQgYWxyZWFkeSBleGlzdCBhcmUgbm90IG92ZXJ3cml0dGVuLiBGb3JcbiAqIGV4YW1wbGU6XG4gKiBcImEuYi5jXCIgLT4gYSA9IHt9O2EuYj17fTthLmIuYz17fTtcbiAqIFVzZWQgYnkgZ29vZy5wcm92aWRlIGFuZCBnb29nLmV4cG9ydFN5bWJvbC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIG5hbWUgb2YgdGhlIG9iamVjdCB0aGF0IHRoaXMgZmlsZSBkZWZpbmVzLlxuICogQHBhcmFtIHsqPX0gb3B0X29iamVjdCB0aGUgb2JqZWN0IHRvIGV4cG9zZSBhdCB0aGUgZW5kIG9mIHRoZSBwYXRoLlxuICogQHBhcmFtIHtPYmplY3Q9fSBvcHRfb2JqZWN0VG9FeHBvcnRUbyBUaGUgb2JqZWN0IHRvIGFkZCB0aGUgcGF0aCB0bzsgZGVmYXVsdFxuICogICAgIGlzIHxnb29nLmdsb2JhbHwuXG4gKiBAcHJpdmF0ZVxuICovXG5nb29nLmV4cG9ydFBhdGhfID0gZnVuY3Rpb24obmFtZSwgb3B0X29iamVjdCwgb3B0X29iamVjdFRvRXhwb3J0VG8pIHtcbiAgdmFyIHBhcnRzID0gbmFtZS5zcGxpdCgnLicpO1xuICB2YXIgY3VyID0gb3B0X29iamVjdFRvRXhwb3J0VG8gfHwgZ29vZy5nbG9iYWw7XG5cbiAgLy8gSW50ZXJuZXQgRXhwbG9yZXIgZXhoaWJpdHMgc3RyYW5nZSBiZWhhdmlvciB3aGVuIHRocm93aW5nIGVycm9ycyBmcm9tXG4gIC8vIG1ldGhvZHMgZXh0ZXJuZWQgaW4gdGhpcyBtYW5uZXIuICBTZWUgdGhlIHRlc3RFeHBvcnRTeW1ib2xFeGNlcHRpb25zIGluXG4gIC8vIGJhc2VfdGVzdC5odG1sIGZvciBhbiBleGFtcGxlLlxuICBpZiAoIShwYXJ0c1swXSBpbiBjdXIpICYmIGN1ci5leGVjU2NyaXB0KSB7XG4gICAgY3VyLmV4ZWNTY3JpcHQoJ3ZhciAnICsgcGFydHNbMF0pO1xuICB9XG5cbiAgLy8gQ2VydGFpbiBicm93c2VycyBjYW5ub3QgcGFyc2UgY29kZSBpbiB0aGUgZm9ybSBmb3IoKGEgaW4gYik7IGM7KTtcbiAgLy8gVGhpcyBwYXR0ZXJuIGlzIHByb2R1Y2VkIGJ5IHRoZSBKU0NvbXBpbGVyIHdoZW4gaXQgY29sbGFwc2VzIHRoZVxuICAvLyBzdGF0ZW1lbnQgYWJvdmUgaW50byB0aGUgY29uZGl0aW9uYWwgbG9vcCBiZWxvdy4gVG8gcHJldmVudCB0aGlzIGZyb21cbiAgLy8gaGFwcGVuaW5nLCB1c2UgYSBmb3ItbG9vcCBhbmQgcmVzZXJ2ZSB0aGUgaW5pdCBsb2dpYyBhcyBiZWxvdy5cblxuICAvLyBQYXJlbnRoZXNlcyBhZGRlZCB0byBlbGltaW5hdGUgc3RyaWN0IEpTIHdhcm5pbmcgaW4gRmlyZWZveC5cbiAgZm9yICh2YXIgcGFydDsgcGFydHMubGVuZ3RoICYmIChwYXJ0ID0gcGFydHMuc2hpZnQoKSk7KSB7XG4gICAgaWYgKCFwYXJ0cy5sZW5ndGggJiYgZ29vZy5pc0RlZihvcHRfb2JqZWN0KSkge1xuICAgICAgLy8gbGFzdCBwYXJ0IGFuZCB3ZSBoYXZlIGFuIG9iamVjdDsgdXNlIGl0XG4gICAgICBjdXJbcGFydF0gPSBvcHRfb2JqZWN0O1xuICAgIH0gZWxzZSBpZiAoY3VyW3BhcnRdKSB7XG4gICAgICBjdXIgPSBjdXJbcGFydF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGN1ciA9IGN1cltwYXJ0XSA9IHt9O1xuICAgIH1cbiAgfVxufTtcblxuXG4vKipcbiAqIFJldHVybnMgYW4gb2JqZWN0IGJhc2VkIG9uIGl0cyBmdWxseSBxdWFsaWZpZWQgZXh0ZXJuYWwgbmFtZS4gIElmIHlvdSBhcmVcbiAqIHVzaW5nIGEgY29tcGlsYXRpb24gcGFzcyB0aGF0IHJlbmFtZXMgcHJvcGVydHkgbmFtZXMgYmV3YXJlIHRoYXQgdXNpbmcgdGhpc1xuICogZnVuY3Rpb24gd2lsbCBub3QgZmluZCByZW5hbWVkIHByb3BlcnRpZXMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lLlxuICogQHBhcmFtIHtPYmplY3Q9fSBvcHRfb2JqIFRoZSBvYmplY3Qgd2l0aGluIHdoaWNoIHRvIGxvb2s7IGRlZmF1bHQgaXNcbiAqICAgICB8Z29vZy5nbG9iYWx8LlxuICogQHJldHVybiB7P30gVGhlIHZhbHVlIChvYmplY3Qgb3IgcHJpbWl0aXZlKSBvciwgaWYgbm90IGZvdW5kLCBudWxsLlxuICovXG5nb29nLmdldE9iamVjdEJ5TmFtZSA9IGZ1bmN0aW9uKG5hbWUsIG9wdF9vYmopIHtcbiAgdmFyIHBhcnRzID0gbmFtZS5zcGxpdCgnLicpO1xuICB2YXIgY3VyID0gb3B0X29iaiB8fCBnb29nLmdsb2JhbDtcbiAgZm9yICh2YXIgcGFydDsgcGFydCA9IHBhcnRzLnNoaWZ0KCk7ICkge1xuICAgIGlmIChnb29nLmlzRGVmQW5kTm90TnVsbChjdXJbcGFydF0pKSB7XG4gICAgICBjdXIgPSBjdXJbcGFydF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY3VyO1xufTtcblxuXG4vKipcbiAqIEdsb2JhbGl6ZXMgYSB3aG9sZSBuYW1lc3BhY2UsIHN1Y2ggYXMgZ29vZyBvciBnb29nLmxhbmcuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgbmFtZXNwYWNlIHRvIGdsb2JhbGl6ZS5cbiAqIEBwYXJhbSB7T2JqZWN0PX0gb3B0X2dsb2JhbCBUaGUgb2JqZWN0IHRvIGFkZCB0aGUgcHJvcGVydGllcyB0by5cbiAqIEBkZXByZWNhdGVkIFByb3BlcnRpZXMgbWF5IGJlIGV4cGxpY2l0bHkgZXhwb3J0ZWQgdG8gdGhlIGdsb2JhbCBzY29wZSwgYnV0XG4gKiAgICAgdGhpcyBzaG91bGQgbm8gbG9uZ2VyIGJlIGRvbmUgaW4gYnVsay5cbiAqL1xuZ29vZy5nbG9iYWxpemUgPSBmdW5jdGlvbihvYmosIG9wdF9nbG9iYWwpIHtcbiAgdmFyIGdsb2JhbCA9IG9wdF9nbG9iYWwgfHwgZ29vZy5nbG9iYWw7XG4gIGZvciAodmFyIHggaW4gb2JqKSB7XG4gICAgZ2xvYmFsW3hdID0gb2JqW3hdO1xuICB9XG59O1xuXG5cbi8qKlxuICogQWRkcyBhIGRlcGVuZGVuY3kgZnJvbSBhIGZpbGUgdG8gdGhlIGZpbGVzIGl0IHJlcXVpcmVzLlxuICogQHBhcmFtIHtzdHJpbmd9IHJlbFBhdGggVGhlIHBhdGggdG8gdGhlIGpzIGZpbGUuXG4gKiBAcGFyYW0ge0FycmF5fSBwcm92aWRlcyBBbiBhcnJheSBvZiBzdHJpbmdzIHdpdGggdGhlIG5hbWVzIG9mIHRoZSBvYmplY3RzXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGZpbGUgcHJvdmlkZXMuXG4gKiBAcGFyYW0ge0FycmF5fSByZXF1aXJlcyBBbiBhcnJheSBvZiBzdHJpbmdzIHdpdGggdGhlIG5hbWVzIG9mIHRoZSBvYmplY3RzXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGZpbGUgcmVxdWlyZXMuXG4gKi9cbmdvb2cuYWRkRGVwZW5kZW5jeSA9IGZ1bmN0aW9uKHJlbFBhdGgsIHByb3ZpZGVzLCByZXF1aXJlcykge1xuICBpZiAoIUNPTVBJTEVEKSB7XG4gICAgdmFyIHByb3ZpZGUsIHJlcXVpcmU7XG4gICAgdmFyIHBhdGggPSByZWxQYXRoLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbiAgICB2YXIgZGVwcyA9IGdvb2cuZGVwZW5kZW5jaWVzXztcbiAgICBmb3IgKHZhciBpID0gMDsgcHJvdmlkZSA9IHByb3ZpZGVzW2ldOyBpKyspIHtcbiAgICAgIGRlcHMubmFtZVRvUGF0aFtwcm92aWRlXSA9IHBhdGg7XG4gICAgICBpZiAoIShwYXRoIGluIGRlcHMucGF0aFRvTmFtZXMpKSB7XG4gICAgICAgIGRlcHMucGF0aFRvTmFtZXNbcGF0aF0gPSB7fTtcbiAgICAgIH1cbiAgICAgIGRlcHMucGF0aFRvTmFtZXNbcGF0aF1bcHJvdmlkZV0gPSB0cnVlO1xuICAgIH1cbiAgICBmb3IgKHZhciBqID0gMDsgcmVxdWlyZSA9IHJlcXVpcmVzW2pdOyBqKyspIHtcbiAgICAgIGlmICghKHBhdGggaW4gZGVwcy5yZXF1aXJlcykpIHtcbiAgICAgICAgZGVwcy5yZXF1aXJlc1twYXRoXSA9IHt9O1xuICAgICAgfVxuICAgICAgZGVwcy5yZXF1aXJlc1twYXRoXVtyZXF1aXJlXSA9IHRydWU7XG4gICAgfVxuICB9XG59O1xuXG5cblxuXG4vLyBOT1RFKG5uYXplKTogVGhlIGRlYnVnIERPTSBsb2FkZXIgd2FzIGluY2x1ZGVkIGluIGJhc2UuanMgYXMgYW4gb3JpZ25hbFxuLy8gd2F5IHRvIGRvIFwiZGVidWctbW9kZVwiIGRldmVsb3BtZW50LiAgVGhlIGRlcGVuZGVuY3kgc3lzdGVtIGNhbiBzb21ldGltZXNcbi8vIGJlIGNvbmZ1c2luZywgYXMgY2FuIHRoZSBkZWJ1ZyBET00gbG9hZGVyJ3MgYXN5bmNyb25vdXMgbmF0dXJlLlxuLy9cbi8vIFdpdGggdGhlIERPTSBsb2FkZXIsIGEgY2FsbCB0byBnb29nLnJlcXVpcmUoKSBpcyBub3QgYmxvY2tpbmcgLS0gdGhlXG4vLyBzY3JpcHQgd2lsbCBub3QgbG9hZCB1bnRpbCBzb21lIHBvaW50IGFmdGVyIHRoZSBjdXJyZW50IHNjcmlwdC4gIElmIGFcbi8vIG5hbWVzcGFjZSBpcyBuZWVkZWQgYXQgcnVudGltZSwgaXQgbmVlZHMgdG8gYmUgZGVmaW5lZCBpbiBhIHByZXZpb3VzXG4vLyBzY3JpcHQsIG9yIGxvYWRlZCB2aWEgcmVxdWlyZSgpIHdpdGggaXRzIHJlZ2lzdGVyZWQgZGVwZW5kZW5jaWVzLlxuLy8gVXNlci1kZWZpbmVkIG5hbWVzcGFjZXMgbWF5IG5lZWQgdGhlaXIgb3duIGRlcHMgZmlsZS4gIFNlZSBodHRwOi8vZ28vanNfZGVwcyxcbi8vIGh0dHA6Ly9nby9nZW5qc2RlcHMsIG9yLCBleHRlcm5hbGx5LCBEZXBzV3JpdGVyLlxuLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9jbG9zdXJlL2xpYnJhcnkvZG9jcy9kZXBzd3JpdGVyLmh0bWxcbi8vXG4vLyBCZWNhdXNlIG9mIGxlZ2FjeSBjbGllbnRzLCB0aGUgRE9NIGxvYWRlciBjYW4ndCBiZSBlYXNpbHkgcmVtb3ZlZCBmcm9tXG4vLyBiYXNlLmpzLiAgV29yayBpcyBiZWluZyBkb25lIHRvIG1ha2UgaXQgZGlzYWJsZWFibGUgb3IgcmVwbGFjZWFibGUgZm9yXG4vLyBkaWZmZXJlbnQgZW52aXJvbm1lbnRzIChET00tbGVzcyBKYXZhU2NyaXB0IGludGVycHJldGVycyBsaWtlIFJoaW5vIG9yIFY4LFxuLy8gZm9yIGV4YW1wbGUpLiBTZWUgYm9vdHN0cmFwLyBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cblxuXG4vKipcbiAqIEBkZWZpbmUge2Jvb2xlYW59IFdoZXRoZXIgdG8gZW5hYmxlIHRoZSBkZWJ1ZyBsb2FkZXIuXG4gKlxuICogSWYgZW5hYmxlZCwgYSBjYWxsIHRvIGdvb2cucmVxdWlyZSgpIHdpbGwgYXR0ZW1wdCB0byBsb2FkIHRoZSBuYW1lc3BhY2UgYnlcbiAqIGFwcGVuZGluZyBhIHNjcmlwdCB0YWcgdG8gdGhlIERPTSAoaWYgdGhlIG5hbWVzcGFjZSBoYXMgYmVlbiByZWdpc3RlcmVkKS5cbiAqXG4gKiBJZiBkaXNhYmxlZCwgZ29vZy5yZXF1aXJlKCkgd2lsbCBzaW1wbHkgYXNzZXJ0IHRoYXQgdGhlIG5hbWVzcGFjZSBoYXMgYmVlblxuICogcHJvdmlkZWQgKGFuZCBkZXBlbmQgb24gdGhlIGZhY3QgdGhhdCBzb21lIG91dHNpZGUgdG9vbCBjb3JyZWN0bHkgb3JkZXJlZFxuICogdGhlIHNjcmlwdCkuXG4gKi9cbmdvb2cuRU5BQkxFX0RFQlVHX0xPQURFUiA9IHRydWU7XG5cblxuLyoqXG4gKiBJbXBsZW1lbnRzIGEgc3lzdGVtIGZvciB0aGUgZHluYW1pYyByZXNvbHV0aW9uIG9mIGRlcGVuZGVuY2llc1xuICogdGhhdCB3b3JrcyBpbiBwYXJhbGxlbCB3aXRoIHRoZSBCVUlMRCBzeXN0ZW0uIE5vdGUgdGhhdCBhbGwgY2FsbHNcbiAqIHRvIGdvb2cucmVxdWlyZSB3aWxsIGJlIHN0cmlwcGVkIGJ5IHRoZSBKU0NvbXBpbGVyIHdoZW4gdGhlXG4gKiAtLWNsb3N1cmVfcGFzcyBvcHRpb24gaXMgdXNlZC5cbiAqIEBzZWUgZ29vZy5wcm92aWRlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOYW1lc3BhY2UgdG8gaW5jbHVkZSAoYXMgd2FzIGdpdmVuIGluIGdvb2cucHJvdmlkZSgpKVxuICogICAgIGluIHRoZSBmb3JtIFwiZ29vZy5wYWNrYWdlLnBhcnRcIi5cbiAqL1xuZ29vZy5yZXF1aXJlID0gZnVuY3Rpb24obmFtZSkge1xuXG4gIC8vIGlmIHRoZSBvYmplY3QgYWxyZWFkeSBleGlzdHMgd2UgZG8gbm90IG5lZWQgZG8gZG8gYW55dGhpbmdcbiAgLy8gVE9ETyhhcnYpOiBJZiB3ZSBzdGFydCB0byBzdXBwb3J0IHJlcXVpcmUgYmFzZWQgb24gZmlsZSBuYW1lIHRoaXMgaGFzXG4gIC8vICAgICAgICAgICAgdG8gY2hhbmdlXG4gIC8vIFRPRE8oYXJ2KTogSWYgd2UgYWxsb3cgZ29vZy5mb28uKiB0aGlzIGhhcyB0byBjaGFuZ2VcbiAgLy8gVE9ETyhhcnYpOiBJZiB3ZSBpbXBsZW1lbnQgZHluYW1pYyBsb2FkIGFmdGVyIHBhZ2UgbG9hZCB3ZSBzaG91bGQgcHJvYmFibHlcbiAgLy8gICAgICAgICAgICBub3QgcmVtb3ZlIHRoaXMgY29kZSBmb3IgdGhlIGNvbXBpbGVkIG91dHB1dFxuICBpZiAoIUNPTVBJTEVEKSB7XG4gICAgaWYgKGdvb2cuaXNQcm92aWRlZF8obmFtZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZ29vZy5FTkFCTEVfREVCVUdfTE9BREVSKSB7XG4gICAgICB2YXIgcGF0aCA9IGdvb2cuZ2V0UGF0aEZyb21EZXBzXyhuYW1lKTtcbiAgICAgIGlmIChwYXRoKSB7XG4gICAgICAgIGdvb2cuaW5jbHVkZWRfW3BhdGhdID0gdHJ1ZTtcbiAgICAgICAgZ29vZy53cml0ZVNjcmlwdHNfKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgZXJyb3JNZXNzYWdlID0gJ2dvb2cucmVxdWlyZSBjb3VsZCBub3QgZmluZDogJyArIG5hbWU7XG4gICAgaWYgKGdvb2cuZ2xvYmFsLmNvbnNvbGUpIHtcbiAgICAgIGdvb2cuZ2xvYmFsLmNvbnNvbGVbJ2Vycm9yJ10oZXJyb3JNZXNzYWdlKTtcbiAgICB9XG5cblxuICAgICAgdGhyb3cgRXJyb3IoZXJyb3JNZXNzYWdlKTtcblxuICB9XG59O1xuXG5cbi8qKlxuICogUGF0aCBmb3IgaW5jbHVkZWQgc2NyaXB0c1xuICogQHR5cGUge3N0cmluZ31cbiAqL1xuZ29vZy5iYXNlUGF0aCA9ICcnO1xuXG5cbi8qKlxuICogQSBob29rIGZvciBvdmVycmlkaW5nIHRoZSBiYXNlIHBhdGguXG4gKiBAdHlwZSB7c3RyaW5nfHVuZGVmaW5lZH1cbiAqL1xuZ29vZy5nbG9iYWwuQ0xPU1VSRV9CQVNFX1BBVEg7XG5cblxuLyoqXG4gKiBXaGV0aGVyIHRvIHdyaXRlIG91dCBDbG9zdXJlJ3MgZGVwcyBmaWxlLiBCeSBkZWZhdWx0LFxuICogdGhlIGRlcHMgYXJlIHdyaXR0ZW4uXG4gKiBAdHlwZSB7Ym9vbGVhbnx1bmRlZmluZWR9XG4gKi9cbmdvb2cuZ2xvYmFsLkNMT1NVUkVfTk9fREVQUztcblxuXG4vKipcbiAqIEEgZnVuY3Rpb24gdG8gaW1wb3J0IGEgc2luZ2xlIHNjcmlwdC4gVGhpcyBpcyBtZWFudCB0byBiZSBvdmVycmlkZGVuIHdoZW5cbiAqIENsb3N1cmUgaXMgYmVpbmcgcnVuIGluIG5vbi1IVE1MIGNvbnRleHRzLCBzdWNoIGFzIHdlYiB3b3JrZXJzLiBJdCdzIGRlZmluZWRcbiAqIGluIHRoZSBnbG9iYWwgc2NvcGUgc28gdGhhdCBpdCBjYW4gYmUgc2V0IGJlZm9yZSBiYXNlLmpzIGlzIGxvYWRlZCwgd2hpY2hcbiAqIGFsbG93cyBkZXBzLmpzIHRvIGJlIGltcG9ydGVkIHByb3Blcmx5LlxuICpcbiAqIFRoZSBmdW5jdGlvbiBpcyBwYXNzZWQgdGhlIHNjcmlwdCBzb3VyY2UsIHdoaWNoIGlzIGEgcmVsYXRpdmUgVVJJLiBJdCBzaG91bGRcbiAqIHJldHVybiB0cnVlIGlmIHRoZSBzY3JpcHQgd2FzIGltcG9ydGVkLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbmdvb2cuZ2xvYmFsLkNMT1NVUkVfSU1QT1JUX1NDUklQVDtcblxuXG4vKipcbiAqIE51bGwgZnVuY3Rpb24gdXNlZCBmb3IgZGVmYXVsdCB2YWx1ZXMgb2YgY2FsbGJhY2tzLCBldGMuXG4gKiBAcmV0dXJuIHt2b2lkfSBOb3RoaW5nLlxuICovXG5nb29nLm51bGxGdW5jdGlvbiA9IGZ1bmN0aW9uKCkge307XG5cblxuLyoqXG4gKiBUaGUgaWRlbnRpdHkgZnVuY3Rpb24uIFJldHVybnMgaXRzIGZpcnN0IGFyZ3VtZW50LlxuICpcbiAqIEBwYXJhbSB7Kj19IG9wdF9yZXR1cm5WYWx1ZSBUaGUgc2luZ2xlIHZhbHVlIHRoYXQgd2lsbCBiZSByZXR1cm5lZC5cbiAqIEBwYXJhbSB7Li4uKn0gdmFyX2FyZ3MgT3B0aW9uYWwgdHJhaWxpbmcgYXJndW1lbnRzLiBUaGVzZSBhcmUgaWdub3JlZC5cbiAqIEByZXR1cm4gez99IFRoZSBmaXJzdCBhcmd1bWVudC4gV2UgY2FuJ3Qga25vdyB0aGUgdHlwZSAtLSBqdXN0IHBhc3MgaXQgYWxvbmdcbiAqICAgICAgd2l0aG91dCB0eXBlLlxuICogQGRlcHJlY2F0ZWQgVXNlIGdvb2cuZnVuY3Rpb25zLmlkZW50aXR5IGluc3RlYWQuXG4gKi9cbmdvb2cuaWRlbnRpdHlGdW5jdGlvbiA9IGZ1bmN0aW9uKG9wdF9yZXR1cm5WYWx